ZGlmZiAtLWdpdCBhLy5naXRodWIvd29ya2Zsb3dzL21hdmVuLnltbCBiLy5naXRodWIvd29ya2Zsb3dzL21hdmVuLXZlcmlmeS55bWwKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gLmdpdGh1Yi93b3JrZmxvd3MvbWF2ZW4ueW1sCnJlbmFtZSB0byAuZ2l0aHViL3dvcmtmbG93cy9tYXZlbi12ZXJpZnkueW1sCmluZGV4IGMxMzZjNGEuLjRkNjdmZGMgMTAwNjQ0Ci0tLSBhLy5naXRodWIvd29ya2Zsb3dzL21hdmVuLnltbAorKysgYi8uZ2l0aHViL3dvcmtmbG93cy9tYXZlbi12ZXJpZnkueW1sCkBAIC0xNSwxNSArMTUsMTMgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KIAotbmFtZTogSmF2YSBDSQorbmFtZTogVmVyaWZ5CiAKIG9uOgogICBwdXNoOgotICAgIGJyYW5jaGVzLWlnbm9yZToKLSAgICAgIC0gZGVwZW5kYWJvdC8qKgogICBwdWxsX3JlcXVlc3Q6CiAKIGpvYnM6CiAgIGJ1aWxkOgogICAgIG5hbWU6IFZlcmlmeQotICAgIHVzZXM6IGFwYWNoZS9tYXZlbi1naC1hY3Rpb25zLXNoYXJlZC8uZ2l0aHViL3dvcmtmbG93cy9tYXZlbi12ZXJpZnkueW1sQHYxCisgICAgdXNlczogYXBhY2hlL21hdmVuLWdoLWFjdGlvbnMtc2hhcmVkLy5naXRodWIvd29ya2Zsb3dzL21hdmVuLXZlcmlmeS55bWxAdjMKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2lucy9hbm5vdGF0aW9ucy9QYXJhbWV0ZXIuamF2YSBiL21hdmVuLXBsdWdpbi1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2lucy9hbm5vdGF0aW9ucy9QYXJhbWV0ZXIuamF2YQppbmRleCBkNmJlNGY5Li4wZTY0M2Q2IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbnMvYW5ub3RhdGlvbnMvUGFyYW1ldGVyLmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW5zL2Fubm90YXRpb25zL1BhcmFtZXRlci5qYXZhCkBAIC03Myw2ICs3MywxMyBAQAogICAgIFN0cmluZyBkZWZhdWx0VmFsdWUoKSBkZWZhdWx0ICIiOwogCiAgICAgLyoqCisgICAgICogRGVmaW5lcyB0aGUgaW1wbGVtZW50YXRpb24gaW4gdGhlIGNhc2UgdGhlIHBhcmFtZXRlciB0eXBlIGlzIGFuIGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWUKKyAgICAgKi8KKyAgICBDbGFzczw/PiBpbXBsZW1lbnRhdGlvbigpIGRlZmF1bHQgT2JqZWN0LmNsYXNzOworCisgICAgLyoqCiAgICAgICogaXMgdGhlIHBhcmFtZXRlciByZXF1aXJlZD8KICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBNb2pvIHNob3VsZCBmYWlsIHdoZW4gdGhlIHBhcmFtZXRlciBjYW5ub3QgYmUgaW5qZWN0ZWQKICAgICAgKi8KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vcG9tLnhtbAppbmRleCA1MGZlN2M4Li5kMzZlOGM3IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9wb20ueG1sCkBAIC03MSw5ICs3MSw3IEBACiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10b29sczwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KLSAgICAgIDwhLS0gZnJvbSBzdHJpY3RlciB2aWV3LCBzaG91bGQgdXNlICR7bWF2ZW5QbHVnaW5Ub29sc1ZlcnNpb259IGJ1dCB0aGlzIGlzIGNhdXNpbmcgcHJvYmxlbXMgd2l0aCByZWxlYXNlIHBsdWdpbiAtLT4KLSAgICAgIDwhLS12ZXJzaW9uPiR7bWF2ZW5QbHVnaW5Ub29sc1ZlcnNpb259PC92ZXJzaW9uLS0+Ci0gICAgICA8IS0tICAKKyAgICAgIDwhLS0KICAgICAgICAgRG8gbm90IHVzZSAncHJvdmlkZWQnIHNjb3BlIGhlcmUuIFRoZSBhbm5vdGF0aW9ucyBhcmUgYSB0cmFuc2l0aXZlIGRlcGVuZGVuY3kgb2YKICAgICAgICAgJ21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucycgd2hpY2ggZmFpbHMgdG8gbG9hZCBhdCBydW50aW1lIHdoZW4gbm90IGF2YWlsYWJsZS4KICAgICAgIC0tPgpAQCAtMTYxLDggKzE1OSwxMyBAQAogCiAgICAgPCEtLSB0ZXN0cyAtLT4KICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8Z3JvdXBJZD5vcmcuanVuaXQuanVwaXRlcjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0LWp1cGl0ZXI8L2FydGlmYWN0SWQ+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3Q8L2FydGlmYWN0SWQ+CiAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogCkBAIC0yMDgsMjMgKzIxMSw2IEBACiAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgogICAgIDxwbHVnaW5zPgogICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vZGVsbG88L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1vZGVsbG8tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5qYXZhPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KLSAgICAgICAgICA8bW9kZWxzPgotICAgICAgICAgICAgPG1vZGVsPnNyYy9tYWluL21kby9wbHVnaW5SZXF1aXJlbWVudHMubWRvPC9tb2RlbD4KLSAgICAgICAgICA8L21vZGVscz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgPGV4ZWN1dGlvbnM+CkBAIC0yNTMsMTcgKzIzOSwxMCBAQAogICAgICAgICA8dmVyc2lvbj4zLjYuNDwvdmVyc2lvbj4KICAgICAgICAgPGV4ZWN1dGlvbnM+CiAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5kZWZhdWx0LWRlc2NyaXB0b3I8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KICAgICAgICAgICAgIDxpZD5nZW5lcmF0ZWQtaGVscG1vam88L2lkPgogICAgICAgICAgICAgPGdvYWxzPgogICAgICAgICAgICAgICA8Z29hbD5oZWxwbW9qbzwvZ29hbD4KICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPHNraXBFcnJvck5vRGVzY3JpcHRvcnNGb3VuZD50cnVlPC9za2lwRXJyb3JOb0Rlc2NyaXB0b3JzRm91bmQ+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgPC9leGVjdXRpb24+CiAgICAgICAgIDwvZXhlY3V0aW9ucz4KICAgICAgIDwvcGx1Z2luPgpAQCAtMjk0LDE5ICsyNzMsNiBAQAogICAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pbnZva2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW5JbnZva2VyUGx1Z2luVmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bDEwbi1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8bG9jYWxlcz4KLSAgICAgICAgICAgICAgICA8bG9jYWxlPmRlPC9sb2NhbGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsZT5mcjwvbG9jYWxlPgotICAgICAgICAgICAgICAgIDxsb2NhbGU+c3Y8L2xvY2FsZT4KLSAgICAgICAgICAgICAgPC9sb2NhbGVzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgIDwvcGx1Z2luPgogICAgICAgICA8L3BsdWdpbnM+CiAgICAgICA8L3JlcG9ydGluZz4KQEAgLTMxOCw3ICsyODQsNiBAQAogICAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pbnZva2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW5JbnZva2VyUGx1Z2luVmVyc2lvbn08L3ZlcnNpb24+CiAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgPHByb2plY3RzRGlyZWN0b3J5PnNyYy9pdDwvcHJvamVjdHNEaXJlY3Rvcnk+CiAgICAgICAgICAgICAgIDxjbG9uZVByb2plY3RzVG8+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vaXQ8L2Nsb25lUHJvamVjdHNUbz4KQEAgLTMyOCw3ICsyOTMsOCBAQAogICAgICAgICAgICAgICA8c2V0dGluZ3NGaWxlPnNyYy9pdC9zZXR0aW5ncy54bWw8L3NldHRpbmdzRmlsZT4KICAgICAgICAgICAgICAgPHN0cmVhbUxvZ3NPbkZhaWx1cmVzPnRydWU8L3N0cmVhbUxvZ3NPbkZhaWx1cmVzPgogICAgICAgICAgICAgICA8ZmlsdGVyUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8c2l0ZVBsdWdpblZlcnNpb24+My4zPC9zaXRlUGx1Z2luVmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8c2l0ZVBsdWdpblZlcnNpb24+My4xMi4xPC9zaXRlUGx1Z2luVmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8cHJvamVjdEluZm9SZXBvcnRzUGx1Z2luPjMuNC4xPC9wcm9qZWN0SW5mb1JlcG9ydHNQbHVnaW4+CiAgICAgICAgICAgICAgICAgPGFudFZlcnNpb24+JHthbnRWZXJzaW9ufTwvYW50VmVyc2lvbj4KICAgICAgICAgICAgICAgPC9maWx0ZXJQcm9wZXJ0aWVzPgogICAgICAgICAgICAgICA8cHJvcGVydGllcz4KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS1mcm9tLWRlcHMvcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS1mcm9tLWRlcHMvcG9tLnhtbAppbmRleCA1Njg0MGQ2Li5lNTgzNmMwIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtZnJvbS1kZXBzL3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlLWZyb20tZGVwcy9wb20ueG1sCkBAIC0zNiw3ICszNiw2IEBACiAKICAgPHByb3BlcnRpZXM+CiAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+Ci0gICAgPHBsZXh1c0NvbXBpbGVyVmVyc2lvbj4xLjguNjwvcGxleHVzQ29tcGlsZXJWZXJzaW9uPgogICA8L3Byb3BlcnRpZXM+CiAKICAgPGRlcGVuZGVuY2llcz4KQEAgLTQ0LDUzICs0MywzNSBAQAogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+CiAgICAgICA8dmVyc2lvbj5AbWF2ZW5WZXJzaW9uQDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj5AbWF2ZW5WZXJzaW9uQDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4tdG9vbHM8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CiAgICAgICA8dmVyc2lvbj5AcHJvamVjdC52ZXJzaW9uQDwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4tdG9vbHM8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CiAgICAgICA8dmVyc2lvbj5AcHJvamVjdC52ZXJzaW9uQDwvdmVyc2lvbj4KICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDwhLS0gZGVwZW5kZW5jeSBvZiAgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4tdG9vbHM6bWF2ZW4tcGx1Z2luLXRvb2xzLWFubm90YXRpb25zOkBwcm9qZWN0LnZlcnNpb25AOmphcjp0ZXN0cyAtLT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj40LjEzLjI8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1tYW5hZ2VyPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+JHtwbGV4dXNDb21waWxlclZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPCEtLSB3ZSBvbmx5IG5lZWQgb25lIGNsYXNzIEZvb01vam8gLS0+CisgICAgICA8IS0tIGluIG9yZGVyIHRvIGRvbid0IG1hbmFnZSBhbGwgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgc2ltcGx5IGV4Y2x1ZGUgaXRzIC0tPgogICAgICAgPGV4Y2x1c2lvbnM+CiAgICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcG9uZW50LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8Z3JvdXBJZD4qPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPio8L2FydGlmYWN0SWQ+CiAgICAgICAgIDwvZXhjbHVzaW9uPgogICAgICAgPC9leGNsdXNpb25zPgogICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcGlsZXItamF2YWM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4ke3BsZXh1c0NvbXBpbGVyVmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21wb25lbnQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgIDwvZXhjbHVzaW9ucz4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My4wLjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgorCiAgIDwvZGVwZW5kZW5jaWVzPgogCiAgIDxidWlsZD4KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS1mcm9tLWRlcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9jb3JlaXQvRmlyc3RNb2pvLmphdmEgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtZnJvbS1kZXBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L0ZpcnN0TW9qby5qYXZhCmluZGV4IDNhY2I5YjEuLjIxYmIzZTggMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS1mcm9tLWRlcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9jb3JlaXQvRmlyc3RNb2pvLmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlLWZyb20tZGVwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9GaXJzdE1vam8uamF2YQpAQCAtNjUsMTEgKzY1LDYgQEAKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJwcm9qZWN0SGVscGVyID09IG51bGwiICk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCBjb21waWxlck1hbmFnZXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiY29tcGlsZXJNYW5hZ2VyID09IG51bGwiICk7Ci0gICAgICAgIH0KLQogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlLWZyb20tZGVwcy92ZXJpZnkuZ3Jvb3Z5IGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlLWZyb20tZGVwcy92ZXJpZnkuZ3Jvb3Z5CmluZGV4IGI0NmM4MjguLmI5NDFiODAgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS1mcm9tLWRlcHMvdmVyaWZ5Lmdyb292eQorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtZnJvbS1kZXBzL3ZlcmlmeS5ncm9vdnkKQEAgLTIwLDExICsyMCw4IEBACiBGaWxlIGRlc2NyaXB0b3JGaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvY2xhc3Nlcy9NRVRBLUlORi9tYXZlbi9wbHVnaW4ueG1sIiApOwogYXNzZXJ0IGRlc2NyaXB0b3JGaWxlLmlzRmlsZSgpCiAKLUZpbGUgb2xkSGVscENsYXNzID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvY2xhc3Nlcy9IZWxwTW9qby5jbGFzcyIgKTsKLWFzc2VydCAhb2xkSGVscENsYXNzLmV4aXN0cygpCi0KLUZpbGUgbmV3SGVscENsYXNzID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvY2xhc3Nlcy9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9jb3JlaXQvSGVscE1vam8uY2xhc3MiICk7Ci1hc3NlcnQgbmV3SGVscENsYXNzLmV4aXN0cygpCitGaWxlIGhlbHBDbGFzcyA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2NsYXNzZXMvb3JnL2FwYWNoZS9tYXZlbi9pdHMvYW5ub3RhdGlvbl93aXRoX2luaGVyaXRhbmNlX2Zyb21fZGVwcy9hbm5vdGF0aW9uX3dpdGhfaW5oZXJpdGFuY2VfZnJvbV9kZXBzL0hlbHBNb2pvLmNsYXNzIiApOworYXNzZXJ0IGhlbHBDbGFzcy5leGlzdHMoKQogCiBkZWYgcGx1Z2luRGVzY3JpcHRvciA9IG5ldyBYbWxQYXJzZXIoKS5wYXJzZSggZGVzY3JpcHRvckZpbGUgKTsKIApAQCAtNTQsMjMgKzUxLDI0IEBACiBhc3NlcnQgbW9qby5jb25maWd1cmF0aW9uLmJlZXJbMF0uJ0BpbXBsZW1lbnRhdGlvbicgPT0gJ2phdmEubGFuZy5TdHJpbmcnCiBhc3NlcnQgbW9qby5jb25maWd1cmF0aW9uLmJlZXJbMF0uJ0BkZWZhdWx0LXZhbHVlJyA9PSAnY29vbGJlZXInCiAKLWFzc2VydCBtb2pvLnJlcXVpcmVtZW50cy5yZXF1aXJlbWVudC5zaXplKCkgPT0gMworYXNzZXJ0IG1vam8ucmVxdWlyZW1lbnRzLnJlcXVpcmVtZW50LnNpemUoKSA9PSAyCiAKLWFzc2VydCBtb2pvLnJlcXVpcmVtZW50cy5yZXF1aXJlbWVudFsxXS5yb2xlLnRleHQoKSA9PSAnb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21waWxlci5tYW5hZ2VyLkNvbXBpbGVyTWFuYWdlcicKK2Fzc2VydCBtb2pvLnJlcXVpcmVtZW50cy5yZXF1aXJlbWVudFswXS5yb2xlLnRleHQoKSA9PSAnb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5tZXRhZGF0YS5BcnRpZmFjdE1ldGFkYXRhU291cmNlJworYXNzZXJ0IG1vam8ucmVxdWlyZW1lbnRzLnJlcXVpcmVtZW50WzBdLidyb2xlLWhpbnQnLnRleHQoKSA9PSAnbWF2ZW4nCithc3NlcnQgbW9qby5yZXF1aXJlbWVudHMucmVxdWlyZW1lbnRbMF0uJ2ZpZWxkLW5hbWUnLnRleHQoKSA9PSAnYXJ0aWZhY3RNZXRhZGF0YVNvdXJjZScKKworYXNzZXJ0IG1vam8ucmVxdWlyZW1lbnRzLnJlcXVpcmVtZW50WzFdLnJvbGUudGV4dCgpID09ICdvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0SGVscGVyJwogYXNzZXJ0IG1vam8ucmVxdWlyZW1lbnRzLnJlcXVpcmVtZW50WzFdLidyb2xlLWhpbnQnLnRleHQoKSA9PSAnJwotYXNzZXJ0IG1vam8ucmVxdWlyZW1lbnRzLnJlcXVpcmVtZW50WzFdLidmaWVsZC1uYW1lJy50ZXh0KCkgPT0gJ2NvbXBpbGVyTWFuYWdlcicKK2Fzc2VydCBtb2pvLnJlcXVpcmVtZW50cy5yZXF1aXJlbWVudFsxXS4nZmllbGQtbmFtZScudGV4dCgpID09ICdwcm9qZWN0SGVscGVyJwogCi1hc3NlcnQgbW9qby5yZXF1aXJlbWVudHMucmVxdWlyZW1lbnRbMl0ucm9sZS50ZXh0KCkgPT0gJ29yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RIZWxwZXInCi0vL2Fzc2VydCBtb2pvLnJlcXVpcmVtZW50cy5yZXF1aXJlbWVudFsyXS4ncm9sZS1oaW50Jy50ZXh0KCkgPT0gJ2RlZmF1bHQnCi1hc3NlcnQgbW9qby5yZXF1aXJlbWVudHMucmVxdWlyZW1lbnRbMl0uJ2ZpZWxkLW5hbWUnLnRleHQoKSA9PSAncHJvamVjdEhlbHBlcicKLQotYXNzZXJ0IG1vam8ucGFyYW1ldGVycy5wYXJhbWV0ZXIuc2l6ZSgpID09IDMKK2Fzc2VydCBtb2pvLnBhcmFtZXRlcnMucGFyYW1ldGVyLnNpemUoKSA9PSA0CiAKIGRlZiBwYXJhbWV0ZXIgPSBtb2pvLnBhcmFtZXRlcnMucGFyYW1ldGVyLmZpbmRBbGx7IGl0Lm5hbWUudGV4dCgpID09ICJhbGlhc2VkUGFyYW0ifVswXQogCiBhc3NlcnQgcGFyYW1ldGVyLm5hbWUudGV4dCgpID09ICdhbGlhc2VkUGFyYW0nCiBhc3NlcnQgcGFyYW1ldGVyLmFsaWFzLnRleHQoKSA9PSAnYWxpYXMnCiBhc3NlcnQgcGFyYW1ldGVyLnR5cGUudGV4dCgpID09ICdqYXZhLmxhbmcuU3RyaW5nJworYXNzZXJ0IHBhcmFtZXRlci5pbXBsZW1lbnRhdGlvbi5pc0VtcHR5KCkKIGFzc2VydCBwYXJhbWV0ZXIuZGVwcmVjYXRlZC50ZXh0KCkgPT0gJ0FzIG9mIDAuMicKIGFzc2VydCBwYXJhbWV0ZXIucmVxdWlyZWQudGV4dCgpID09ICdmYWxzZScKIGFzc2VydCBwYXJhbWV0ZXIuZWRpdGFibGUudGV4dCgpID09ICd0cnVlJwpAQCAtODEsNiArNzksNyBAQAogYXNzZXJ0IHBhcmFtZXRlci5uYW1lLnRleHQoKSA9PSAnYmVlcicKIGFzc2VydCBwYXJhbWV0ZXIuYWxpYXMuaXNFbXB0eSgpCiBhc3NlcnQgcGFyYW1ldGVyLnR5cGUudGV4dCgpID09ICdqYXZhLmxhbmcuU3RyaW5nJworYXNzZXJ0IHBhcmFtZXRlci5pbXBsZW1lbnRhdGlvbi5pc0VtcHR5KCkKIGFzc2VydCBwYXJhbWV0ZXIuZGVwcmVjYXRlZC50ZXh0KCkgPT0gIndpbmUgaXMgYmV0dGVyIgogYXNzZXJ0IHBhcmFtZXRlci5yZXF1aXJlZC50ZXh0KCkgPT0gJ2ZhbHNlJwogYXNzZXJ0IHBhcmFtZXRlci5lZGl0YWJsZS50ZXh0KCkgPT0gJ3RydWUnCkBAIC05MSw5ICs5MCwyMSBAQAogYXNzZXJ0IHBhcmFtZXRlci5uYW1lLnRleHQoKSA9PSAnYmFyJwogYXNzZXJ0IHBhcmFtZXRlci5hbGlhcy5pc0VtcHR5KCkKIGFzc2VydCBwYXJhbWV0ZXIudHlwZS50ZXh0KCkgPT0gJ2phdmEubGFuZy5TdHJpbmcnCithc3NlcnQgcGFyYW1ldGVyLmltcGxlbWVudGF0aW9uLmlzRW1wdHkoKQogYXNzZXJ0IHBhcmFtZXRlci5kZXByZWNhdGVkLmlzRW1wdHkoKQogYXNzZXJ0IHBhcmFtZXRlci5yZXF1aXJlZC50ZXh0KCkgPT0gJ3RydWUnCiBhc3NlcnQgcGFyYW1ldGVyLmVkaXRhYmxlLnRleHQoKSA9PSAndHJ1ZScKIGFzc2VydCBwYXJhbWV0ZXIuZGVzY3JpcHRpb24udGV4dCgpID09ICd0aGUgY29vbCBiYXIgdG8gZ28nCiAKK3BhcmFtZXRlciA9IG1vam8ucGFyYW1ldGVycy5wYXJhbWV0ZXIuZmluZEFsbHsgaXQubmFtZS50ZXh0KCkgPT0gImZvb0ludGVyZmFjZSJ9WzBdCisKK2Fzc2VydCBwYXJhbWV0ZXIubmFtZS50ZXh0KCkgPT0gJ2Zvb0ludGVyZmFjZScKK2Fzc2VydCBwYXJhbWV0ZXIuYWxpYXMuaXNFbXB0eSgpCithc3NlcnQgcGFyYW1ldGVyLnR5cGUudGV4dCgpID09ICdvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5leHRyYWN0b3IuYW5ub3RhdGlvbnMuRm9vSW50ZXJmYWNlJworYXNzZXJ0IHBhcmFtZXRlci5pbXBsZW1lbnRhdGlvbi50ZXh0KCkgPT0gJ29yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmV4dHJhY3Rvci5hbm5vdGF0aW9ucy5Gb29JbnRlcmZhY2VJbXBsJworYXNzZXJ0IHBhcmFtZXRlci5kZXByZWNhdGVkLmlzRW1wdHkoKQorYXNzZXJ0IHBhcmFtZXRlci5yZXF1aXJlZC50ZXh0KCkgPT0gJ2ZhbHNlJworYXNzZXJ0IHBhcmFtZXRlci5lZGl0YWJsZS50ZXh0KCkgPT0gJ3RydWUnCithc3NlcnQgcGFyYW1ldGVyLmRlc2NyaXB0aW9uLnRleHQoKSA9PSAnSW50ZXJmYWNlIHR5cGUgYXMgcGFyYW1ldGVyLicKKwogcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtcmVhY3Rvci9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtcmVhY3Rvci9pbnZva2VyLnByb3BlcnRpZXMKaW5kZXggMjYwNDQzYy4uMjQxODlmNyAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlLXJlYWN0b3IvaW52b2tlci5wcm9wZXJ0aWVzCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS1yZWFjdG9yL2ludm9rZXIucHJvcGVydGllcwpAQCAtMTUsNiArMTUsNiBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1pbnZva2VyLmdvYWxzLjEgPSBjbGVhbiBpbnN0YWxsIC1Ec2tpcFRlc3RzCitpbnZva2VyLmdvYWxzLjEgPSBjbGVhbiBpbnN0YWxsCiBpbnZva2VyLmdvYWxzLjIgPSBvcmcuYXBhY2hlLm1hdmVuLml0cy5hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtcmVhY3Rvcjptb2R1bGUtbW9qbzoxLjAtU05BUFNIT1Q6aXQwMDE0CiBpbnZva2VyLmdvYWxzLjMgPSBvcmcuYXBhY2hlLm1hdmVuLml0cy5hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtcmVhY3Rvcjptb2R1bGUtbW9qbzoxLjAtU05BUFNIT1Q6Zmlyc3QKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS1yZWFjdG9yL21vZHVsZS1hYnN0cmFjdC1tb2pvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW5zL0Fic3RyYWN0Rmlyc3RNb2pvLmphdmEgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtcmVhY3Rvci9tb2R1bGUtYWJzdHJhY3QtbW9qby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2lucy9BYnN0cmFjdEZpcnN0TW9qby5qYXZhCmluZGV4IDk4NTgwNTguLjUwNTE1MmIgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS1yZWFjdG9yL21vZHVsZS1hYnN0cmFjdC1tb2pvL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW5zL0Fic3RyYWN0Rmlyc3RNb2pvLmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlLXJlYWN0b3IvbW9kdWxlLWFic3RyYWN0LW1vam8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbnMvQWJzdHJhY3RGaXJzdE1vam8uamF2YQpAQCAtMjAsMTMgKzIwLDggQEAKICAqLwogCiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuRXhlY3V0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuTGlmZWN5Y2xlUGhhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLk1vam87CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBpbGVyLm1hbmFnZXIuQ29tcGlsZXJNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QubWV0YWRhdGEuQXJ0aWZhY3RNZXRhZGF0YVNvdXJjZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTUwLDEyICs0NSw2IEBACiAgICAgcHJvdGVjdGVkIEZpbGUgdG91Y2hGaWxlOwogCiAgICAgLyoqCi0gICAgICogUGxleHVzIGNvbXBpbGVyIG1hbmFnZXIuCi0gICAgICovCi0gICAgQENvbXBvbmVudAotICAgIHByb3RlY3RlZCBDb21waWxlck1hbmFnZXIgY29tcGlsZXJNYW5hZ2VyOwotCi0gICAgLyoqCiAgICAgICoKICAgICAgKi8KICAgICBAQ29tcG9uZW50KCByb2xlID0gQXJ0aWZhY3RNZXRhZGF0YVNvdXJjZS5jbGFzcywgaGludCA9ICJtYXZlbiIgKQpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlLXJlYWN0b3IvbW9kdWxlLW1vam8vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9jb3JlaXQvRmlyc3RNb2pvLmphdmEgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtcmVhY3Rvci9tb2R1bGUtbW9qby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9GaXJzdE1vam8uamF2YQppbmRleCBiMGI0MGZlLi5jYjE1MGEyIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtcmVhY3Rvci9tb2R1bGUtbW9qby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9GaXJzdE1vam8uamF2YQorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtcmVhY3Rvci9tb2R1bGUtbW9qby9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9GaXJzdE1vam8uamF2YQpAQCAtNjYsMTAgKzY2LDYgQEAKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJwcm9qZWN0SGVscGVyID09IG51bGwiICk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCBjb21waWxlck1hbmFnZXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiY29tcGlsZXJNYW5hZ2VyID09IG51bGwiICk7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKCEgKCBwcm9qZWN0SGVscGVyIGluc3RhbmNlb2YgTWF2ZW5Qcm9qZWN0SGVscGVyICkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiISBwcm9qZWN0SGVscGVyIGluc3RhbmNlb2YgTWF2ZW5Qcm9qZWN0SGVscGVyIiApOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlLXJlYWN0b3IvcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS1yZWFjdG9yL3BvbS54bWwKaW5kZXggNTU4YTU0NS4uZDJmNmI4YiAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlLXJlYWN0b3IvcG9tLnhtbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtcmVhY3Rvci9wb20ueG1sCkBAIC0zNSw3ICszNSw2IEBACiAKICAgPHByb3BlcnRpZXM+CiAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+Ci0gICAgPHBsZXh1c0NvbXBpbGVyVmVyc2lvbj4xLjguNjwvcGxleHVzQ29tcGlsZXJWZXJzaW9uPgogICA8L3Byb3BlcnRpZXM+CiAKICAgPGRlcGVuZGVuY2llcz4KQEAgLTQzLDUxICs0MiwzOSBAQAogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+CiAgICAgICA8dmVyc2lvbj5AbWF2ZW5WZXJzaW9uQDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvcmU8L2FydGlmYWN0SWQ+CiAgICAgICA8dmVyc2lvbj5AbWF2ZW5WZXJzaW9uQDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4tdG9vbHM8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CiAgICAgICA8dmVyc2lvbj5AcHJvamVjdC52ZXJzaW9uQDwvdmVyc2lvbj4KICAgICAgIDxjbGFzc2lmaWVyPnRlc3RzPC9jbGFzc2lmaWVyPgorICAgICAgPCEtLSB3ZSBvbmx5IG5lZWQgb25lIGNsYXNzIEZvb01vam8gLS0+CisgICAgICA8IS0tIGluIG9yZGVyIHRvIGRvbid0IG1hbmFnZSBhbGwgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgc2ltcGx5IGV4Y2x1ZGUgaXRzIC0tPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+KjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD4qPC9hcnRpZmFjdElkPgorICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgIDwvZXhjbHVzaW9ucz4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8IS0tIGRlcGVuZGVuY3kgb2YgIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLXRvb2xzOm1hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9uczpAcHJvamVjdC52ZXJzaW9uQDpqYXI6dGVzdHMgLS0+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+NC4xMy4yPC92ZXJzaW9uPgorICAgICAgPGdyb3VwSWQ+b3JnLmp1bml0Lmp1cGl0ZXI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdC1qdXBpdGVyLWVuZ2luZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjUuOC4yPC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLXRvb2xzPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+QHByb2plY3QudmVyc2lvbkA8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1tYW5hZ2VyPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+JHtwbGV4dXNDb21waWxlclZlcnNpb259PC92ZXJzaW9uPgotICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcG9uZW50LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1qYXZhYzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7cGxleHVzQ29tcGlsZXJWZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgIDxleGNsdXNpb25zPgotICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBvbmVudC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgIDwvZGVwZW5kZW5jaWVzPgogCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtcmVhY3Rvci92ZXJpZnkuZ3Jvb3Z5IGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlLXJlYWN0b3IvdmVyaWZ5Lmdyb292eQppbmRleCBkNWFhMDkxLi42YjBiNDEyIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtcmVhY3Rvci92ZXJpZnkuZ3Jvb3Z5CisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS1yZWFjdG9yL3ZlcmlmeS5ncm9vdnkKQEAgLTUzLDExICs1MywxMSBAQAogYXNzZXJ0IG1vam8uY29uZmlndXJhdGlvbi50b3VjaEZpbGVbMF0uJ0BpbXBsZW1lbnRhdGlvbicgPT0gJ2phdmEuaW8uRmlsZScKIGFzc2VydCBtb2pvLmNvbmZpZ3VyYXRpb24udG91Y2hGaWxlWzBdLidAZGVmYXVsdC12YWx1ZScgPT0gJyR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3RvdWNoLnR4dCcKIAotYXNzZXJ0IG1vam8ucmVxdWlyZW1lbnRzLnJlcXVpcmVtZW50LnNpemUoKSA9PSAzCithc3NlcnQgbW9qby5yZXF1aXJlbWVudHMucmVxdWlyZW1lbnQuc2l6ZSgpID09IDIKIAotYXNzZXJ0IG1vam8ucmVxdWlyZW1lbnRzLnJlcXVpcmVtZW50WzJdLnJvbGUudGV4dCgpID09ICdvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0SGVscGVyJwotLy9hc3NlcnQgbW9qby5yZXF1aXJlbWVudHMucmVxdWlyZW1lbnRbMl0uJ3JvbGUtaGludCcudGV4dCgpID09ICdkZWZhdWx0JwotYXNzZXJ0IG1vam8ucmVxdWlyZW1lbnRzLnJlcXVpcmVtZW50WzJdLidmaWVsZC1uYW1lJy50ZXh0KCkgPT0gJ3Byb2plY3RIZWxwZXInCithc3NlcnQgbW9qby5yZXF1aXJlbWVudHMucmVxdWlyZW1lbnRbMV0ucm9sZS50ZXh0KCkgPT0gJ29yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RIZWxwZXInCithc3NlcnQgbW9qby5yZXF1aXJlbWVudHMucmVxdWlyZW1lbnRbMV0uJ3JvbGUtaGludCcudGV4dCgpID09ICcnCithc3NlcnQgbW9qby5yZXF1aXJlbWVudHMucmVxdWlyZW1lbnRbMV0uJ2ZpZWxkLW5hbWUnLnRleHQoKSA9PSAncHJvamVjdEhlbHBlcicKIAogYXNzZXJ0IG1vam8ucGFyYW1ldGVycy5wYXJhbWV0ZXIuc2l6ZSgpID09IDMKIApkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS9pbnZva2VyLnByb3BlcnRpZXMKaW5kZXggMTdlOGVlNC4uMGFkNDEzNyAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlL2ludm9rZXIucHJvcGVydGllcworKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UvaW52b2tlci5wcm9wZXJ0aWVzCkBAIC0xNSw4ICsxNSw4IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLWludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwgLURza2lwVGVzdHMKK2ludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwKIGludm9rZXIuZ29hbHMuMiA9IG9yZy5hcGFjaGUubWF2ZW4uaXRzLmFubm90YXRpb24td2l0aC1pbmhlcml0YW5jZTphbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2U6MS4wLVNOQVBTSE9UOml0MDAxNAogaW52b2tlci5nb2Fscy4zID0gb3JnLmFwYWNoZS5tYXZlbi5pdHMuYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlOmFubm90YXRpb24td2l0aC1pbmhlcml0YW5jZToxLjAtU05BUFNIT1Q6Zmlyc3QKIGludm9rZXIuZ29hbHMuNCA9IG9yZy5hcGFjaGUubWF2ZW4uaXRzLmFubm90YXRpb24td2l0aC1pbmhlcml0YW5jZTphbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2U6MS4wLVNOQVBTSE9UOmhlbHAKLWludm9rZXIuZ29hbHMuNSA9IG9yZy5hcGFjaGUubWF2ZW4uaXRzLmFubm90YXRpb24td2l0aC1pbmhlcml0YW5jZTphbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2U6MS4wLVNOQVBTSE9UOnRoaXJkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoraW52b2tlci5nb2Fscy41ID0gb3JnLmFwYWNoZS5tYXZlbi5pdHMuYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlOmFubm90YXRpb24td2l0aC1pbmhlcml0YW5jZToxLjAtU05BUFNIT1Q6dGhpcmQKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS9wb20ueG1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlL3BvbS54bWwKaW5kZXggZTljOTExMy4uYjAwYWI3ZCAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlL3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlL3BvbS54bWwKQEAgLTM2LDcgKzM2LDYgQEAKIAogICA8cHJvcGVydGllcz4KICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KLSAgICA8cGxleHVzQ29tcGlsZXJWZXJzaW9uPjEuOC42PC9wbGV4dXNDb21waWxlclZlcnNpb24+CiAgIDwvcHJvcGVydGllcz4KIAogICA8ZGVwZW5kZW5jaWVzPgpAQCAtNDQsMTEgKzQzLDEzIEBACiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29yZTwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10b29sczwvZ3JvdXBJZD4KQEAgLTU4LDMwICs1OSw4IEBACiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1tYW5hZ2VyPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+JHtwbGV4dXNDb21waWxlclZlcnNpb259PC92ZXJzaW9uPgotICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcG9uZW50LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1qYXZhYzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7cGxleHVzQ29tcGlsZXJWZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgIDxleGNsdXNpb25zPgotICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBvbmVudC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgPC9leGNsdXNpb25zPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdXRpbHM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjAuMTwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPkBwbGV4dXNVdGlsc1ZlcnNpb25APC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9BYnN0cmFjdEZpcnN0TW9qby5qYXZhIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L0Fic3RyYWN0Rmlyc3RNb2pvLmphdmEKaW5kZXggYzBlZWU3Yy4uNjU4MzdjMCAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L0Fic3RyYWN0Rmlyc3RNb2pvLmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L0Fic3RyYWN0Rmlyc3RNb2pvLmphdmEKQEAgLTIwLDEzICsyMCw4IEBACiAgKi8KIAogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLkV4ZWN1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLkxpZmVjeWNsZVBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Nb2pvOwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21waWxlci5tYW5hZ2VyLkNvbXBpbGVyTWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0Lm1ldGFkYXRhLkFydGlmYWN0TWV0YWRhdGFTb3VyY2U7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC00OSwxMiArNDQsNiBAQAogICAgIHByb3RlY3RlZCBGaWxlIHRvdWNoRmlsZTsKIAogICAgIC8qKgotICAgICAqIFBsZXh1cyBjb21waWxlciBtYW5hZ2VyLgotICAgICAqLwotICAgIEBDb21wb25lbnQKLSAgICBwcm90ZWN0ZWQgQ29tcGlsZXJNYW5hZ2VyIGNvbXBpbGVyTWFuYWdlcjsKLQotICAgIC8qKgogICAgICAqCiAgICAgICovCiAgICAgQENvbXBvbmVudCggcm9sZSA9IEFydGlmYWN0TWV0YWRhdGFTb3VyY2UuY2xhc3MsIGhpbnQgPSAibWF2ZW4iICkKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9BYnN0cmFjdEZvb01vam8uamF2YSBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9BYnN0cmFjdEZvb01vam8uamF2YQppbmRleCA4ZjdjOGUzLi4wYjEzYmMyIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9jb3JlaXQvQWJzdHJhY3RGb29Nb2pvLmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L0Fic3RyYWN0Rm9vTW9qby5qYXZhCkBAIC0xOSwxOCArMTksNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLkV4ZWN1dGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLkxpZmVjeWNsZVBoYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Nb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21waWxlci5tYW5hZ2VyLkNvbXBpbGVyTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0Lm1ldGFkYXRhLkFydGlmYWN0TWV0YWRhdGFTb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KIC8qKgogICoKICAqLwpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L0ZpcnN0TW9qby5qYXZhIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L0ZpcnN0TW9qby5qYXZhCmluZGV4IGU4ODkwNmUuLmIyMmZmOTYgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9GaXJzdE1vam8uamF2YQorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9jb3JlaXQvRmlyc3RNb2pvLmphdmEKQEAgLTcyLDEwICs3Miw2IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAicHJvamVjdEhlbHBlciA9PSBudWxsIiApOwogICAgICAgICB9Ci0gICAgICAgIGlmICggY29tcGlsZXJNYW5hZ2VyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggImNvbXBpbGVyTWFuYWdlciA9PSBudWxsIiApOwotICAgICAgICB9CiAKICAgICAgICAgaWYgKCBkZXBlbmRlbmNpZXMuaXNFbXB0eSgpICkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L1RoaXJkTW9qby5qYXZhIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L1RoaXJkTW9qby5qYXZhCmluZGV4IDQzMzRmNzMuLjRhMzUyNjIgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2Fubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9UaGlyZE1vam8uamF2YQorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9jb3JlaXQvVGhpcmRNb2pvLmphdmEKQEAgLTcyLDExICs3Miw2IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAicHJvamVjdEhlbHBlciA9PSBudWxsIiApOwogICAgICAgICB9Ci0gICAgICAgIGlmICggY29tcGlsZXJNYW5hZ2VyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggImNvbXBpbGVyTWFuYWdlciA9PSBudWxsIiApOwotICAgICAgICB9Ci0KICAgICAgICAgaWYgKCBkZXBlbmRlbmNpZXMuaXNFbXB0eSgpICkKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJkZXBlbmRlbmNpZXMuaXNFbXB0eSgpIiApOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlL3ZlcmlmeS5ncm9vdnkgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UvdmVyaWZ5Lmdyb292eQppbmRleCBmNGUxYmE1Li42ODllMDAwIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UvdmVyaWZ5Lmdyb292eQorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UvdmVyaWZ5Lmdyb292eQpAQCAtMjMsMTEgKzIzLDggQEAKIEZpbGUgZGVzY3JpcHRvckZpbGUgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9jbGFzc2VzL01FVEEtSU5GL21hdmVuL3BsdWdpbi54bWwiICk7CiBhc3NlcnQgZGVzY3JpcHRvckZpbGUuaXNGaWxlKCkKIAotRmlsZSBvbGRIZWxwQ2xhc3MgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9jbGFzc2VzL0hlbHBNb2pvLmNsYXNzIiApOwotYXNzZXJ0ICFvbGRIZWxwQ2xhc3MuZXhpc3RzKCkKLQotRmlsZSBuZXdIZWxwQ2xhc3MgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9jbGFzc2VzL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9IZWxwTW9qby5jbGFzcyIgKTsKLWFzc2VydCBuZXdIZWxwQ2xhc3MuZXhpc3RzKCkKK0ZpbGUgaGVscENsYXNzID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvY2xhc3Nlcy9vcmcvYXBhY2hlL21hdmVuL2l0cy9hbm5vdGF0aW9uX3dpdGhfaW5oZXJpdGFuY2UvYW5ub3RhdGlvbl93aXRoX2luaGVyaXRhbmNlL0hlbHBNb2pvLmNsYXNzIiApOworYXNzZXJ0IGhlbHBDbGFzcy5leGlzdHMoKQogCiBkZWYgcGx1Z2luRGVzY3JpcHRvciA9IG5ldyBYbWxQYXJzZXIoKS5wYXJzZSggZGVzY3JpcHRvckZpbGUgKTsKIApAQCAtNTcsMTEgKzU0LDExIEBACiBhc3NlcnQgbW9qby5jb25maWd1cmF0aW9uLnRvdWNoRmlsZVswXS4nQGltcGxlbWVudGF0aW9uJyA9PSAnamF2YS5pby5GaWxlJwogYXNzZXJ0IG1vam8uY29uZmlndXJhdGlvbi50b3VjaEZpbGVbMF0uJ0BkZWZhdWx0LXZhbHVlJyA9PSAnJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdG91Y2gudHh0JwogCi1hc3NlcnQgbW9qby5yZXF1aXJlbWVudHMucmVxdWlyZW1lbnQuc2l6ZSgpID09IDMKK2Fzc2VydCBtb2pvLnJlcXVpcmVtZW50cy5yZXF1aXJlbWVudC5zaXplKCkgPT0gMgogCi1hc3NlcnQgbW9qby5yZXF1aXJlbWVudHMucmVxdWlyZW1lbnRbMl0ucm9sZS50ZXh0KCkgPT0gJ29yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RIZWxwZXInCithc3NlcnQgbW9qby5yZXF1aXJlbWVudHMucmVxdWlyZW1lbnRbMV0ucm9sZS50ZXh0KCkgPT0gJ29yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RIZWxwZXInCiAvL2Fzc2VydCBtb2pvLnJlcXVpcmVtZW50cy5yZXF1aXJlbWVudFsyXS4ncm9sZS1oaW50Jy50ZXh0KCkgPT0gJ2RlZmF1bHQnCi1hc3NlcnQgbW9qby5yZXF1aXJlbWVudHMucmVxdWlyZW1lbnRbMl0uJ2ZpZWxkLW5hbWUnLnRleHQoKSA9PSAncHJvamVjdEhlbHBlcicKK2Fzc2VydCBtb2pvLnJlcXVpcmVtZW50cy5yZXF1aXJlbWVudFsxXS4nZmllbGQtbmFtZScudGV4dCgpID09ICdwcm9qZWN0SGVscGVyJwogCiBhc3NlcnQgbW9qby5wYXJhbWV0ZXJzLnBhcmFtZXRlci5zaXplKCkgPT0gNAogCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbnQtYmFzaWMvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW50LWJhc2ljL2ludm9rZXIucHJvcGVydGllcwppbmRleCAwZDk0ZWRlLi41NTg3NWI2IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbnQtYmFzaWMvaW52b2tlci5wcm9wZXJ0aWVzCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2FudC1iYXNpYy9pbnZva2VyLnByb3BlcnRpZXMKQEAgLTE1LDYgKzE1LDYgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KIAotaW52b2tlci5nb2Fscy4xID0gY2xlYW4gaW5zdGFsbCAtRHNraXBUZXN0cworaW52b2tlci5nb2Fscy4xID0gY2xlYW4gaW5zdGFsbAogaW52b2tlci5nb2Fscy4yID0gb3JnLmFwYWNoZS5tYXZlbi5hbnQuaXQ6bWF2ZW4tYW50LWl0LWJhc2ljOjEuMC1TTkFQU0hPVDp0b3VjaCAtRG5hbWU9dG91Y2gudHh0CiAKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2FudC1yZWZlcmVuY2UtcGFyYW1ldGVyL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2FudC1yZWZlcmVuY2UtcGFyYW1ldGVyL2ludm9rZXIucHJvcGVydGllcwppbmRleCBhZGNmYWY1Li45NjYzNmQwIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbnQtcmVmZXJlbmNlLXBhcmFtZXRlci9pbnZva2VyLnByb3BlcnRpZXMKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW50LXJlZmVyZW5jZS1wYXJhbWV0ZXIvaW52b2tlci5wcm9wZXJ0aWVzCkBAIC0xNSw2ICsxNSw2IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLWludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwgLURza2lwVGVzdHMKK2ludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwKIGludm9rZXIuZ29hbHMuMiA9IG9yZy5hcGFjaGUubWF2ZW4uYW50Lml0Om1hdmVuLWFudC1pdC1yZWZlcmVuY2VQYXJhbWV0ZXI6MS4wLVNOQVBTSE9UOnRlc3QKIApkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW50LXJlZmVyZW5jZS1wYXJhbWV0ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbnMvYW50V2l0aFJlZnMvQXJ0aWZhY3RzVGFzay5qYXZhIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW50LXJlZmVyZW5jZS1wYXJhbWV0ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbnMvYW50V2l0aFJlZnMvQXJ0aWZhY3RzVGFzay5qYXZhCmluZGV4IDhjOGUyMGUuLmM0MTk4OWQgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2FudC1yZWZlcmVuY2UtcGFyYW1ldGVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW5zL2FudFdpdGhSZWZzL0FydGlmYWN0c1Rhc2suamF2YQorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hbnQtcmVmZXJlbmNlLXBhcmFtZXRlci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2lucy9hbnRXaXRoUmVmcy9BcnRpZmFjdHNUYXNrLmphdmEKQEAgLTI5LDcgKzI5LDcgQEAKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCiAgICAgewotICAgICAgICBsb2coIFN0cmluZy52YWx1ZU9mKCBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCAiYXJ0aWZhY3RzIiApICkgKTsKKyAgICAgICAgbG9nKCBTdHJpbmcudmFsdWVPZiggKCBPYmplY3QgKSBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCAiYXJ0aWZhY3RzIiApICkgKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2FudC1zaW1wbGUtdXNhZ2UvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW50LXNpbXBsZS11c2FnZS9pbnZva2VyLnByb3BlcnRpZXMKaW5kZXggODUzMjcxYi4uM2RmNGE0ZCAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW50LXNpbXBsZS11c2FnZS9pbnZva2VyLnByb3BlcnRpZXMKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYW50LXNpbXBsZS11c2FnZS9pbnZva2VyLnByb3BlcnRpZXMKQEAgLTE1LDYgKzE1LDYgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KIAotaW52b2tlci5nb2Fscy4xID0gY2xlYW4gaW5zdGFsbCAtRHNraXBUZXN0cworaW52b2tlci5nb2Fscy4xID0gY2xlYW4gaW5zdGFsbAogI2ludm9rZXIuZ29hbHMuMiA9IG9yZy5hcGFjaGUubWF2ZW4uYW50Lml0Om1hdmVuLWFudC1pdC1yZWZlcmVuY2VQYXJhbWV0ZXI6MS4wLVNOQVBTSE9UOnRlc3QKIApkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYXNtLWZhaWx1cmUvcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2FzbS1mYWlsdXJlL3BvbS54bWwKaW5kZXggYTQ1MTc3YS4uOWRhOWY2ZCAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYXNtLWZhaWx1cmUvcG9tLnhtbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9hc20tZmFpbHVyZS9wb20ueG1sCkBAIC01MCwxMyArNTAsMTQgQEAKICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My4wPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLXRvb2xzPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+QHByb2plY3QudmVyc2lvbkA8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPmNvbS5pYm0uaWN1PC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvYmVhbnNoZWxsLXNpbXBsZS9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9iZWFuc2hlbGwtc2ltcGxlL2ludm9rZXIucHJvcGVydGllcwppbmRleCA4ZWM2NDUyLi44ODc3M2NmIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9iZWFuc2hlbGwtc2ltcGxlL2ludm9rZXIucHJvcGVydGllcworKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9iZWFuc2hlbGwtc2ltcGxlL2ludm9rZXIucHJvcGVydGllcwpAQCAtMTUsNiArMTUsNiBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1pbnZva2VyLmdvYWxzLjEgPSBjbGVhbiBpbnN0YWxsIC1Ec2tpcFRlc3RzCitpbnZva2VyLmdvYWxzLjEgPSBjbGVhbiBpbnN0YWxsCiBpbnZva2VyLmdvYWxzLjIgPSBvcmcuYXBhY2hlLm1hdmVuLmJlYW5zaGVsbC5pdDptYXZlbi1iZWFuc2hlbGwtaXQtYmFzaWM6MS4wLVNOQVBTSE9UOnRvdWNoIC1EbmFtZT10b3VjaC50eHQKIApkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvZml4LW1hdmVuLXNpbmNlLTMueC9hbnRzYW1wbGUtbWF2ZW4tcGx1Z2luL3BvbS54bWwgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9maXgtbWF2ZW4tc2luY2UtMy54L2FudHNhbXBsZS1tYXZlbi1wbHVnaW4vcG9tLnhtbAppbmRleCA3Yjg0NmVhLi4zN2RiYmI2IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9maXgtbWF2ZW4tc2luY2UtMy54L2FudHNhbXBsZS1tYXZlbi1wbHVnaW4vcG9tLnhtbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9maXgtbWF2ZW4tc2luY2UtMy54L2FudHNhbXBsZS1tYXZlbi1wbHVnaW4vcG9tLnhtbApAQCAtNDMsNyArNDMsOCBAQAogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+CisgICAgICA8dmVyc2lvbj5AbWF2ZW5WZXJzaW9uQDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICA8L2RlcGVuZGVuY2llcz4KIApkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvZml4LW1hdmVuLXNpbmNlLTMueC9hbnRzYW1wbGUtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvZml4LW1hdmVuLXNpbmNlLTMueC9hbnRzYW1wbGUtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCmluZGV4IGZjNDdmZDcuLmU0YWMwYWYgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2ZpeC1tYXZlbi1zaW5jZS0zLngvYW50c2FtcGxlLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9maXgtbWF2ZW4tc2luY2UtMy54L2FudHNhbXBsZS1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwKQEAgLTIwLDYgKzIwLDExIEBACiA8cHJvamVjdCBuYW1lPSIke2FydGlmYWN0SWR9Ij4KICAgPHB1Ymxpc2hEYXRlIHBvc2l0aW9uPSJyaWdodCIgZm9ybWF0PSJkZC9NTS95eXl5LCBISDptbSIgLz4KICAgPHZlcnNpb24gcG9zaXRpb249InJpZ2h0Ii8+CisgIDxza2luPgorICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uc2tpbnM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmx1aWRvLXNraW48L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4xMS4xPC92ZXJzaW9uPgorICA8L3NraW4+CiAgIDxwb3dlcmVkQnk+CiAgICAgPGxvZ28gbmFtZT0iTWF2ZW4iIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLyIKICAgICAgIGltZz0iJHtwcm9qZWN0LnVybH0vaW1hZ2VzL21hdmVuLWZlYXRoZXIucG5nIiAvPgpAQCAtMzEsNiArMzYsNiBAQAogICAgICAgPGl0ZW0gbmFtZT0iVXNhZ2UiIGhyZWY9InVzYWdlLmh0bWwiLz4KICAgICAgIDxpdGVtIG5hbWU9IkZBUSIgaHJlZj0iZmFxLmh0bWwiLz4KICAgICA8L21lbnU+Ci0gICAgJHtyZXBvcnRzfQorICAgIDxtZW51IHJlZj0icmVwb3J0cyIgLz4KICAgPC9ib2R5PgogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvZml4LW1hdmVuLXNpbmNlLTMueC9qYXZhc2FtcGxlLW1hdmVuLXBsdWdpbi9wb20ueG1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvZml4LW1hdmVuLXNpbmNlLTMueC9qYXZhc2FtcGxlLW1hdmVuLXBsdWdpbi9wb20ueG1sCmluZGV4IDAyN2Y1NDIuLmJiM2UxNzcgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2ZpeC1tYXZlbi1zaW5jZS0zLngvamF2YXNhbXBsZS1tYXZlbi1wbHVnaW4vcG9tLnhtbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9maXgtbWF2ZW4tc2luY2UtMy54L2phdmFzYW1wbGUtbWF2ZW4tcGx1Z2luL3BvbS54bWwKQEAgLTQzLDcgKzQzLDggQEAKICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9maXgtbWF2ZW4tc2luY2UtMy54L2phdmFzYW1wbGUtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvZml4LW1hdmVuLXNpbmNlLTMueC9qYXZhc2FtcGxlLW1hdmVuLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbAppbmRleCA0NTIwMzE0Li44ZjI4NzY2IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9maXgtbWF2ZW4tc2luY2UtMy54L2phdmFzYW1wbGUtbWF2ZW4tcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2ZpeC1tYXZlbi1zaW5jZS0zLngvamF2YXNhbXBsZS1tYXZlbi1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwKQEAgLTIwLDYgKzIwLDExIEBACiA8cHJvamVjdCBuYW1lPSIke2FydGlmYWN0SWR9Ij4KICAgPHB1Ymxpc2hEYXRlIHBvc2l0aW9uPSJyaWdodCIgZm9ybWF0PSJkZC9NTS95eXl5LCBISDptbSIgLz4KICAgPHZlcnNpb24gcG9zaXRpb249InJpZ2h0Ii8+CisgIDxza2luPgorICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uc2tpbnM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmx1aWRvLXNraW48L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4xMS4xPC92ZXJzaW9uPgorICA8L3NraW4+CiAgIDxwb3dlcmVkQnk+CiAgICAgPGxvZ28gbmFtZT0iTWF2ZW4iIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLyIKICAgICAgIGltZz0iJHtwcm9qZWN0LnVybH0vaW1hZ2VzL21hdmVuLWZlYXRoZXIucG5nIiAvPgpAQCAtMzEsNyArMzYsNyBAQAogICAgICAgPGl0ZW0gbmFtZT0iVXNhZ2UiIGhyZWY9InVzYWdlLmh0bWwiLz4KICAgICAgIDxpdGVtIG5hbWU9IkZBUSIgaHJlZj0iZmFxLmh0bWwiLz4KICAgICA8L21lbnU+Ci0gICAgJHtyZXBvcnRzfQorICAgIDxtZW51IHJlZj0icmVwb3J0cyIgLz4KICAgPC9ib2R5PgogPC9wcm9qZWN0PgogCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9maXgtbWF2ZW4tc2luY2UtMy54L3BvbS54bWwgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9maXgtbWF2ZW4tc2luY2UtMy54L3BvbS54bWwKaW5kZXggZWVjMTFjMy4uZGQzNjI0YSAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvZml4LW1hdmVuLXNpbmNlLTMueC9wb20ueG1sCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2ZpeC1tYXZlbi1zaW5jZS0zLngvcG9tLnhtbApAQCAtMzgsNyArMzgsNyBAQAogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuMC4yPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+QHBsZXh1c1V0aWxzVmVyc2lvbkA8L3ZlcnNpb24+CiAgICAgPC9kZXBlbmRlbmN5PgogICA8L2RlcGVuZGVuY2llcz4KIApAQCAtNzEsNyArNzEsNyBAQAogICAgICAgPHBsdWdpbj4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+QHByb2plY3RJbmZvUmVwb3J0c1BsdWdpbkA8L3ZlcnNpb24+CiAgICAgICA8L3BsdWdpbj4KICAgICAgIDxwbHVnaW4+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2hlbHAtYmFzaWMtZGVwcmVjYXRlZC1hbm5vdGF0aW9uLW9ubHkvZXhwZWN0ZWQtaGVscC50eHQgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9oZWxwLWJhc2ljLWRlcHJlY2F0ZWQtYW5ub3RhdGlvbi1vbmx5L2V4cGVjdGVkLWhlbHAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmODc2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9oZWxwLWJhc2ljLWRlcHJlY2F0ZWQtYW5ub3RhdGlvbi1vbmx5L2V4cGVjdGVkLWhlbHAudHh0CkBAIC0wLDAgKzEsMjUgQEAKK1tJTkZPXSBoZWxwIDEuMC1TTkFQU0hPVAorICBUZXN0cyBnZW5lcmF0aW9uIGFuZCBjb21waWxhdGlvbiBvZiB0aGUgaGVscCBtb2pvLgorCitoZWxwOnRlc3QKKyAgRGVwcmVjYXRlZC4gTm8gcmVhc29uIGdpdmVuCisKKyAgTU9KTy1ERVNDUklQVElPTi4gU29tZSAncXVvdGF0aW9uJyBtYXJrcyBhbmQgYmFja3NsYXNoZXMgJ1xcJywgc29tZSBpbXBvcnRhbnQKKyAgamF2YWRvYworICBhbmQgYW4gaW5saW5lIGxpbmsgdG8gQW5vdGhlck1vam8uCisKKyAgQXZhaWxhYmxlIHBhcmFtZXRlcnM6CisKKyAgICBkZWZhdWx0UGFyYW0gKERlZmF1bHQ6IGVzY2FwZVxiYWNrc2xhc2gpCisgICAgICBUaGlzIHBhcmFtZXRlciB1c2VzICdxdW90YXRpb24nIG1hcmtzIGFuZCBiYWNrc2xhc2hlcyAnXFwnIGluIGl0cworICAgICAgZGVzY3JpcHRpb24uIFRob3NlIGNoYXJhY3RlcnMgbXVzdCBiZSBlc2NhcGVkIGluIEphdmEgc3RyaW5nIGxpdGVyYWxzLgorCisgICAgZGVwcmVjYXRlZFBhcmFtCisgICAgICBEZXByZWNhdGVkLiBObyByZWFzb24gZ2l2ZW4KKworICAgICAgUGFyYW1ldGVyIGRlc2NyaXB0aW9uIGluIGphdmFkb2MuCisKKyAgICB1bmRvY3VtZW50ZWRQYXJhbQorICAgICAgCisgICAgICBSZXF1aXJlZDogWWVzCisgICAgICBVc2VyIHByb3BlcnR5OiB0ZXN0LnVuZG9jdW1lbnRlZApkaWZmIC0tZ2l0IGEvLmdpdGh1Yi93b3JrZmxvd3MvbWF2ZW4ueW1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvaGVscC1iYXNpYy1kZXByZWNhdGVkLWFubm90YXRpb24tb25seS9pbnZva2VyLnByb3BlcnRpZXMKc2ltaWxhcml0eSBpbmRleCA3MyUKY29weSBmcm9tIC5naXRodWIvd29ya2Zsb3dzL21hdmVuLnltbApjb3B5IHRvIG1hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2hlbHAtYmFzaWMtZGVwcmVjYXRlZC1hbm5vdGF0aW9uLW9ubHkvaW52b2tlci5wcm9wZXJ0aWVzCmluZGV4IGMxMzZjNGEuLmU3YjBiNGQgMTAwNjQ0Ci0tLSBhLy5naXRodWIvd29ya2Zsb3dzL21hdmVuLnltbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9oZWxwLWJhc2ljLWRlcHJlY2F0ZWQtYW5ub3RhdGlvbi1vbmx5L2ludm9rZXIucHJvcGVydGllcwpAQCAtNSw5ICs1LDkgQEAKICMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCisjIAorIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKQEAgLTE1LDE1ICsxNSw1IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLW5hbWU6IEphdmEgQ0kKLQotb246Ci0gIHB1c2g6Ci0gICAgYnJhbmNoZXMtaWdub3JlOgotICAgICAgLSBkZXBlbmRhYm90LyoqCi0gIHB1bGxfcmVxdWVzdDoKLQotam9iczoKLSAgYnVpbGQ6Ci0gICAgbmFtZTogVmVyaWZ5Ci0gICAgdXNlczogYXBhY2hlL21hdmVuLWdoLWFjdGlvbnMtc2hhcmVkLy5naXRodWIvd29ya2Zsb3dzL21hdmVuLXZlcmlmeS55bWxAdjEKK2ludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwKK2ludm9rZXIuZ29hbHMuMiA9IC0tbG9nLWZpbGUgaGVscC5sb2cgb3JnLmFwYWNoZS5tYXZlbi5pdHMucGx1Z2luOmhlbHA6MS4wLVNOQVBTSE9UOmhlbHAKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2hlbHAtYmFzaWMtZGVwcmVjYXRlZC1hbm5vdGF0aW9uLW9ubHkvcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2hlbHAtYmFzaWMtZGVwcmVjYXRlZC1hbm5vdGF0aW9uLW9ubHkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2FlNzA2Ci0tLSAvZGV2L251bGwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvaGVscC1iYXNpYy1kZXByZWNhdGVkLWFubm90YXRpb24tb25seS9wb20ueG1sCkBAIC0wLDAgKzEsNzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CisKKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uaXRzLnBsdWdpbjwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+aGVscDwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgorCisgIDxkZXNjcmlwdGlvbj4KKyAgICBUZXN0cyBnZW5lcmF0aW9uIGFuZCBjb21waWxhdGlvbiBvZiB0aGUgaGVscCBtb2pvLgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLXRvb2xzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+QHByb2plY3QudmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgPHBsdWdpbnM+CisgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8dmVyc2lvbj4zLjEwLjE8L3ZlcnNpb24+CisgICAgICAgIDwvcGx1Z2luPgorICAgICAgPC9wbHVnaW5zPgorICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+QHByb2plY3QudmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+aGVscC1nb2FsPC9pZD4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+aGVscG1vam88L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9oZWxwLWJhc2ljLWRlcHJlY2F0ZWQtYW5ub3RhdGlvbi1vbmx5L3NyYy9tYWluL2phdmEvdGVzdC9NeU1vam8uamF2YSBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2hlbHAtYmFzaWMtZGVwcmVjYXRlZC1hbm5vdGF0aW9uLW9ubHkvc3JjL21haW4vamF2YS90ZXN0L015TW9qby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzgxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9oZWxwLWJhc2ljLWRlcHJlY2F0ZWQtYW5ub3RhdGlvbi1vbmx5L3NyYy9tYWluL2phdmEvdGVzdC9NeU1vam8uamF2YQpAQCAtMCwwICsxLDY3IEBACitwYWNrYWdlIHRlc3Q7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuTW9qbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyOworCisvKioKKyAqIE1PSk8tREVTQ1JJUFRJT04uIFNvbWUgInF1b3RhdGlvbiIgbWFya3MgYW5kIGJhY2tzbGFzaGVzICdcXCcsIHNvbWUgPHN0cm9uZz5pbXBvcnRhbnQ8L3N0cm9uZz4gamF2YWRvYzxicj4gYW5kIGFuCisgKiBpbmxpbmUgbGluayB0byB7QGxpbmsgdGVzdC5Bbm90aGVyTW9qb30uCisgKiAKKyAqIEBzaW5jZSAyLjEKKyAqLworQERlcHJlY2F0ZWQKK0BNb2pvKCBuYW1lPSAidGVzdCIgKQorcHVibGljIGNsYXNzIE15TW9qbworICAgIGV4dGVuZHMgQWJzdHJhY3RNb2pvCit7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHBhcmFtZXRlciB1c2VzICJxdW90YXRpb24iIG1hcmtzIGFuZCBiYWNrc2xhc2hlcyAnXFwnIGluIGl0cyBkZXNjcmlwdGlvbi4gVGhvc2UgY2hhcmFjdGVycyA8ZW0+bXVzdDwvZW0+IGJlCisgICAgICogZXNjYXBlZCBpbiBKYXZhIHN0cmluZyBsaXRlcmFscy4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovCisgICAgQFBhcmFtZXRlciggZGVmYXVsdFZhbHVlID0gImVzY2FwZVxcYmFja3NsYXNoIiApCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFBhcmFtOworCisgICAgLyoqCisgICAgICogUGFyYW1ldGVyIGRlc2NyaXB0aW9uIGluIGphdmFkb2MuCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBAUGFyYW1ldGVyCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVwcmVjYXRlZFBhcmFtOworCisgICAgQFBhcmFtZXRlciggcHJvcGVydHkgPSAidGVzdC51bmRvY3VtZW50ZWQiLCByZXF1aXJlZCA9IHRydWUgKQorICAgIHByaXZhdGUgU3RyaW5nIHVuZG9jdW1lbnRlZFBhcmFtOworCisgICAgLyoqCisgICAgICogUmVhZG9ubHkgcGFyYW1ldGVyOiBzaG91bGQgbm90IGJlIHByb3Bvc2VkIGZvciBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIEBQYXJhbWV0ZXIoIGRlZmF1bHRWYWx1ZSA9ICJub3QgZm9yIGNvbmZpZ3VyYXRpb24iLCByZWFkb25seSA9IHRydWUgKQorICAgIHByaXZhdGUgU3RyaW5nIHJlYWRvbmx5OworCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCisgICAgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi93b3JrZmxvd3MvbWF2ZW4ueW1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvaGVscC1iYXNpYy1kZXByZWNhdGVkLWFubm90YXRpb24tb25seS90ZXN0LnByb3BlcnRpZXMKc2ltaWxhcml0eSBpbmRleCA3MyUKY29weSBmcm9tIC5naXRodWIvd29ya2Zsb3dzL21hdmVuLnltbApjb3B5IHRvIG1hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2hlbHAtYmFzaWMtZGVwcmVjYXRlZC1hbm5vdGF0aW9uLW9ubHkvdGVzdC5wcm9wZXJ0aWVzCmluZGV4IGMxMzZjNGEuLjE2ZTRkZTMgMTAwNjQ0Ci0tLSBhLy5naXRodWIvd29ya2Zsb3dzL21hdmVuLnltbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9oZWxwLWJhc2ljLWRlcHJlY2F0ZWQtYW5ub3RhdGlvbi1vbmx5L3Rlc3QucHJvcGVydGllcwpAQCAtNSw5ICs1LDkgQEAKICMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCisjIAorIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKQEAgLTE1LDE1ICsxNSw1IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLW5hbWU6IEphdmEgQ0kKLQotb246Ci0gIHB1c2g6Ci0gICAgYnJhbmNoZXMtaWdub3JlOgotICAgICAgLSBkZXBlbmRhYm90LyoqCi0gIHB1bGxfcmVxdWVzdDoKLQotam9iczoKLSAgYnVpbGQ6Ci0gICAgbmFtZTogVmVyaWZ5Ci0gICAgdXNlczogYXBhY2hlL21hdmVuLWdoLWFjdGlvbnMtc2hhcmVkLy5naXRodWIvd29ya2Zsb3dzL21hdmVuLXZlcmlmeS55bWxAdjEKK2RldGFpbCA9IHRydWUKK2dvYWwgPSB0ZXN0CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2dlbmVyYXRvci9QbHVnaW5IZWxwR2VuZXJhdG9yVGVzdC5qYXZhIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvaGVscC1iYXNpYy1kZXByZWNhdGVkLWFubm90YXRpb24tb25seS92ZXJpZnkuZ3Jvb3Z5CnNpbWlsYXJpdHkgaW5kZXggNjAlCmNvcHkgZnJvbSBtYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2dlbmVyYXRvci9QbHVnaW5IZWxwR2VuZXJhdG9yVGVzdC5qYXZhCmNvcHkgdG8gbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvaGVscC1iYXNpYy1kZXByZWNhdGVkLWFubm90YXRpb24tb25seS92ZXJpZnkuZ3Jvb3Z5CmluZGV4IGNlNGY5MTkuLjIxOTIzMWIgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi10b29scy1nZW5lcmF0b3JzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZ2VuZXJhdG9yL1BsdWdpbkhlbHBHZW5lcmF0b3JUZXN0LmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvaGVscC1iYXNpYy1kZXByZWNhdGVkLWFubm90YXRpb24tb25seS92ZXJpZnkuZ3Jvb3Z5CkBAIC0xLDUgKzEsMyBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5nZW5lcmF0b3I7Ci0KIC8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKQEAgLTE5LDIyICsxNywxMiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudmVsb2NpdHkuVmVsb2NpdHlDb21wb25lbnQ7CitleHBlY3RlZCA9IG5ldyBGaWxlKCBiYXNlZGlyLCAiZXhwZWN0ZWQtaGVscC50eHQiICkudGV4dC50cmltKCkucmVwbGFjZSggIlxyIiwgIiIgKQogCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnZpbmNlbnQuc2l2ZXRvbkBnbWFpbC5jb20iPlZpbmNlbnQgU2l2ZXRvbjwvYT4KLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkhlbHBHZW5lcmF0b3JUZXN0Ci0gICAgZXh0ZW5kcyBBYnN0cmFjdEdlbmVyYXRvclRlc3RDYXNlCi17Ci0gICAgLy8gaW5oZXJpdHMgdGVzdHMgZnJvbSBiYXNlIGNsYXNzCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBHZW5lcmF0b3IoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgeworbG9nID0gbmV3IEZpbGUoIGJhc2VkaXIsICJoZWxwLmxvZyIgKS50ZXh0LnJlcGxhY2UoICJcciIsICIiICkKK2xvZyA9IGxvZy5zdWJzdHJpbmcoIGxvZy5pbmRleE9mKCAiW0lORk9dIGhlbHAgMS4wLVNOQVBTSE9UIiApICkKK2xvZyA9IGxvZy5zdWJzdHJpbmcoIDAsIGxvZy5pbmRleE9mKCAiW0lORk9dIiwgNSApICkudHJpbSgpCiAKLSAgICAgICAgZ2VuZXJhdG9yID0KLSAgICAgICAgICAgIG5ldyBQbHVnaW5IZWxwR2VuZXJhdG9yKCkuc2V0VmVsb2NpdHlDb21wb25lbnQoIChWZWxvY2l0eUNvbXBvbmVudCkgbG9va3VwKCBWZWxvY2l0eUNvbXBvbmVudC5ST0xFICkgKTsKK2Fzc2VydCBsb2cgPT0gZXhwZWN0ZWQKIAotICAgIH0KLX0KK3JldHVybiB0cnVlCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9oZWxwLWJhc2ljLWpkazExL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2hlbHAtYmFzaWMtamRrMTEvaW52b2tlci5wcm9wZXJ0aWVzCmluZGV4IGUxMDg2Y2IuLjljZGFjYWIgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2hlbHAtYmFzaWMtamRrMTEvaW52b2tlci5wcm9wZXJ0aWVzCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2hlbHAtYmFzaWMtamRrMTEvaW52b2tlci5wcm9wZXJ0aWVzCkBAIC0xNiw4ICsxNiw1IEBACiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogCiBpbnZva2VyLmphdmEudmVyc2lvbiA9IDExKwotaW52b2tlci5tYXZlbi52ZXJzaW9uID0gMy4wKwotaW52b2tlci5nb2Fscy4xID0gY2xlYW4gaW5zdGFsbCAtRHNraXBUZXN0cwotaW52b2tlci5nb2Fscy4yID0gb3JnLmFwYWNoZS5tYXZlbi5pdHMucGx1Z2luOmhlbHAtamRrMTE6MS4wLVNOQVBTSE9UOmhlbHAKLWludm9rZXIuZ29hbHMuMyA9IC0tbG9nLWZpbGUgaGVscC5sb2cgb3JnLmFwYWNoZS5tYXZlbi5pdHMucGx1Z2luOmhlbHAtamRrMTE6MS4wLVNOQVBTSE9UOmhlbHAKLSMgLS1sb2ctZmlsZSBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgYnkgTWF2ZW4gMworaW52b2tlci5nb2Fscy4xID0gY2xlYW4gaW5zdGFsbAoraW52b2tlci5nb2Fscy4yID0gLS1sb2ctZmlsZSBoZWxwLmxvZyBvcmcuYXBhY2hlLm1hdmVuLml0cy5wbHVnaW46aGVscC1qZGsxMToxLjAtU05BUFNIT1Q6aGVscApkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvaGVscC1iYXNpYy1qZGsxMS9wb20ueG1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvaGVscC1iYXNpYy1qZGsxMS9wb20ueG1sCmluZGV4IDJiYmJjMzEuLjY1YzIwOTYgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2hlbHAtYmFzaWMtamRrMTEvcG9tLnhtbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9oZWxwLWJhc2ljLWpkazExL3BvbS54bWwKQEAgLTQwLDExICs0MCw3IEBACiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdXRpbHM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjAuMTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4tdG9vbHM8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9oZWxwLWJhc2ljL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2hlbHAtYmFzaWMvaW52b2tlci5wcm9wZXJ0aWVzCmluZGV4IDU0NDM2MWIuLmU3YjBiNGQgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2hlbHAtYmFzaWMvaW52b2tlci5wcm9wZXJ0aWVzCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2hlbHAtYmFzaWMvaW52b2tlci5wcm9wZXJ0aWVzCkBAIC0xNSw5ICsxNSw1IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLWludm9rZXIubWF2ZW4udmVyc2lvbiA9IDMuMCsKLWludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwgLURza2lwVGVzdHMKLWludm9rZXIuZ29hbHMuMiA9IG9yZy5hcGFjaGUubWF2ZW4uaXRzLnBsdWdpbjpoZWxwOjEuMC1TTkFQU0hPVDpoZWxwCi1pbnZva2VyLmdvYWxzLjMgPSAtLWxvZy1maWxlIGhlbHAubG9nIG9yZy5hcGFjaGUubWF2ZW4uaXRzLnBsdWdpbjpoZWxwOjEuMC1TTkFQU0hPVDpoZWxwCi0jIC0tbG9nLWZpbGUgb3B0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IE1hdmVuIDMKLWludm9rZXIubWF2ZW4udmVyc2lvbiA9IDMuMCsKK2ludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwKK2ludm9rZXIuZ29hbHMuMiA9IC0tbG9nLWZpbGUgaGVscC5sb2cgb3JnLmFwYWNoZS5tYXZlbi5pdHMucGx1Z2luOmhlbHA6MS4wLVNOQVBTSE9UOmhlbHAKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2hlbHAtYmFzaWMvcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2hlbHAtYmFzaWMvcG9tLnhtbAppbmRleCAyNjc1ZDhlLi43M2U0Y2U0IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9oZWxwLWJhc2ljL3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvaGVscC1iYXNpYy9wb20ueG1sCkBAIC00MCwxMSArNDAsNyBAQAogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+CiAgICAgICA8dmVyc2lvbj5AbWF2ZW5WZXJzaW9uQDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My4wLjE8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLXRvb2xzPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvaGVscC1wYWNrYWdlL3BvbS54bWwgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9oZWxwLXBhY2thZ2UvcG9tLnhtbAppbmRleCBmMjg5YTFmLi44MWYwMzc2IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9oZWxwLXBhY2thZ2UvcG9tLnhtbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9oZWxwLXBhY2thZ2UvcG9tLnhtbApAQCAtNDAsMTEgKzQwLDcgQEAKICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuMC4xPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgIDwvZGVwZW5kZW5jaWVzPgogCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9pZ25vcmUtcGx1Z2luLWNsYXNzLXJlYWxtL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2lnbm9yZS1wbHVnaW4tY2xhc3MtcmVhbG0vaW52b2tlci5wcm9wZXJ0aWVzCmluZGV4IDU0OTM0NDQuLjljNmJmMTQgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2lnbm9yZS1wbHVnaW4tY2xhc3MtcmVhbG0vaW52b2tlci5wcm9wZXJ0aWVzCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2lnbm9yZS1wbHVnaW4tY2xhc3MtcmVhbG0vaW52b2tlci5wcm9wZXJ0aWVzCkBAIC0xNSw3ICsxNSw3IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLWludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwgLURza2lwVGVzdHMKK2ludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwKIGludm9rZXIucHJvZmlsZXMuMSA9IHNldHVwCiAKIGludm9rZXIuZ29hbHMuMiA9IGNsZWFuIHByb2Nlc3MtY2xhc3NlcwpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy1qZGs4L2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMtYW5ub3RhdGlvbnMtamRrOC9pbnZva2VyLnByb3BlcnRpZXMKaW5kZXggYTY3ZDA3Yy4uNjc2MDIwNCAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy1qZGs4L2ludm9rZXIucHJvcGVydGllcworKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljLWFubm90YXRpb25zLWpkazgvaW52b2tlci5wcm9wZXJ0aWVzCkBAIC0xNSw3ICsxNSw2IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLWludm9rZXIuamF2YS52ZXJzaW9uID0gMS44KwotaW52b2tlci5nb2Fscy4xID0gY2xlYW4gaW5zdGFsbCAtRHNraXBUZXN0cwotaW52b2tlci5nb2Fscy4yID0gb3JnLmFwYWNoZS5tYXZlbi5pdHMuYmFzaWMtamF2YS1hbm5vdGF0aW9uczptYXZlbi1pdC1iYXNpYy1qYXZhLWFubm90YXRpb25zOjEuMC1TTkFQU0hPVDppdDAwMTQKLWludm9rZXIuZ29hbHMuMyA9IG9yZy5hcGFjaGUubWF2ZW4uaXRzLmJhc2ljLWphdmEtYW5ub3RhdGlvbnM6bWF2ZW4taXQtYmFzaWMtamF2YS1hbm5vdGF0aW9uczoxLjAtU05BUFNIT1Q6aGVscApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2ludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwKK2ludm9rZXIuZ29hbHMuMiA9IG9yZy5hcGFjaGUubWF2ZW4uaXRzLmJhc2ljLWphdmEtYW5ub3RhdGlvbnM6MTIzLW1hdmVuLWl0LWJhc2ljLWphdmEtYW5ub3RhdGlvbnM6MS4wLVNOQVBTSE9UOml0MDAxNAoraW52b2tlci5nb2Fscy4zID0gb3JnLmFwYWNoZS5tYXZlbi5pdHMuYmFzaWMtamF2YS1hbm5vdGF0aW9uczoxMjMtbWF2ZW4taXQtYmFzaWMtamF2YS1hbm5vdGF0aW9uczoxLjAtU05BUFNIT1Q6aGVscApkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy1qZGs4L3BvbS54bWwgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljLWFubm90YXRpb25zLWpkazgvcG9tLnhtbAppbmRleCA2M2QwZTA0Li5kZGExNGE4IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljLWFubm90YXRpb25zLWpkazgvcG9tLnhtbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljLWFubm90YXRpb25zLWpkazgvcG9tLnhtbApAQCAtMjMsNyArMjMsNyBAQAogICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CiAKICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5pdHMuYmFzaWMtamF2YS1hbm5vdGF0aW9uczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bWF2ZW4taXQtYmFzaWMtamF2YS1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgPGFydGlmYWN0SWQ+MTIzLW1hdmVuLWl0LWJhc2ljLWphdmEtYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CiAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KIApAQCAtNDcsMjIgKzQ3LDE5IEBACiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29yZTwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdXRpbHM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjAuMTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4tdG9vbHM8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CiAgICAgICA8dmVyc2lvbj5AcHJvamVjdC52ZXJzaW9uQDwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICA8L2RlcGVuZGVuY2llcz4KIApkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy1qZGs4L3ZlcmlmeS5ncm9vdnkgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljLWFubm90YXRpb25zLWpkazgvdmVyaWZ5Lmdyb292eQppbmRleCAyOTRmNTM4Li5iMTMwZTJjIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljLWFubm90YXRpb25zLWpkazgvdmVyaWZ5Lmdyb292eQorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljLWFubm90YXRpb25zLWpkazgvdmVyaWZ5Lmdyb292eQpAQCAtMjI0LDggKzIyNCw3IEBACiBhc3NlcnQgcmVxdWlyZW1lbnQucm9sZS50ZXh0KCkgPT0gJ29yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RIZWxwZXInCiAKIC8vIGNoZWNrIGhlbHAgbW9qbyBzb3VyY2UgYW5kIGNsYXNzCi1hc3NlcnQgbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvY2xhc3Nlcy9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9jb3JlaXQvSGVscE1vam8uY2xhc3MiICkuaXNGaWxlKCkKLWFzc2VydCBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9wbHVnaW4vb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L0hlbHBNb2pvLmphdmEiICkuaXNGaWxlKCkKLWFzc2VydCAhbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvcGx1Z2luL0hlbHBNb2pvLmphdmEiICkuaXNGaWxlKCkKK2Fzc2VydCBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9jbGFzc2VzL29yZy9hcGFjaGUvbWF2ZW4vaXRzL2Jhc2ljX2phdmFfYW5ub3RhdGlvbnMvXzEyM19tYXZlbl9pdF9iYXNpY19qYXZhX2Fubm90YXRpb25zL0hlbHBNb2pvLmNsYXNzIiApLmlzRmlsZSgpCithc3NlcnQgbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvcGx1Z2luL29yZy9hcGFjaGUvbWF2ZW4vaXRzL2Jhc2ljX2phdmFfYW5ub3RhdGlvbnMvXzEyM19tYXZlbl9pdF9iYXNpY19qYXZhX2Fubm90YXRpb25zL0hlbHBNb2pvLmphdmEiICkuaXNGaWxlKCkKIAogcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljLWFubm90YXRpb25zLWpka2N1cnJlbnQvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy1qZGtjdXJyZW50L2ludm9rZXIucHJvcGVydGllcwppbmRleCA2NGFkODEwLi5jOTU1ZTViIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljLWFubm90YXRpb25zLWpka2N1cnJlbnQvaW52b2tlci5wcm9wZXJ0aWVzCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMtYW5ub3RhdGlvbnMtamRrY3VycmVudC9pbnZva2VyLnByb3BlcnRpZXMKQEAgLTE2LDYgKzE2LDYgQEAKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIGludm9rZXIuamF2YS52ZXJzaW9uID0gOSsKLWludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwgLURza2lwVGVzdHMKK2ludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwKIGludm9rZXIuZ29hbHMuMiA9IG9yZy5hcGFjaGUubWF2ZW4uaXRzLmJhc2ljLWphdmEtYW5ub3RhdGlvbnM6bWF2ZW4taXQtYmFzaWMtamF2YS1hbm5vdGF0aW9uczoxLjAtU05BUFNIT1Q6aXQwMDE0Ci1pbnZva2VyLmdvYWxzLjMgPSBvcmcuYXBhY2hlLm1hdmVuLml0cy5iYXNpYy1qYXZhLWFubm90YXRpb25zOm1hdmVuLWl0LWJhc2ljLWphdmEtYW5ub3RhdGlvbnM6MS4wLVNOQVBTSE9UOmhlbHAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitpbnZva2VyLmdvYWxzLjMgPSBvcmcuYXBhY2hlLm1hdmVuLml0cy5iYXNpYy1qYXZhLWFubm90YXRpb25zOm1hdmVuLWl0LWJhc2ljLWphdmEtYW5ub3RhdGlvbnM6MS4wLVNOQVBTSE9UOmhlbHAKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMtYW5ub3RhdGlvbnMtamRrY3VycmVudC9wb20ueG1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy1qZGtjdXJyZW50L3BvbS54bWwKaW5kZXggZDdjMDY2MC4uYWQyYjk3MiAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy1qZGtjdXJyZW50L3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy1qZGtjdXJyZW50L3BvbS54bWwKQEAgLTQzLDIyICs0MywxOSBAQAogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+CiAgICAgICA8dmVyc2lvbj5AbWF2ZW5WZXJzaW9uQDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvcmU8L2FydGlmYWN0SWQ+CiAgICAgICA8dmVyc2lvbj5AbWF2ZW5WZXJzaW9uQDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My4wLjE8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLXRvb2xzPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+QHByb2plY3QudmVyc2lvbkA8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMtYW5ub3RhdGlvbnMtamRrY3VycmVudC92ZXJpZnkuZ3Jvb3Z5IGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy1qZGtjdXJyZW50L3ZlcmlmeS5ncm9vdnkKaW5kZXggMjk0ZjUzOC4uYzQ5OGEyMiAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy1qZGtjdXJyZW50L3ZlcmlmeS5ncm9vdnkKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy1qZGtjdXJyZW50L3ZlcmlmeS5ncm9vdnkKQEAgLTIyNCw4ICsyMjQsNyBAQAogYXNzZXJ0IHJlcXVpcmVtZW50LnJvbGUudGV4dCgpID09ICdvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0SGVscGVyJwogCiAvLyBjaGVjayBoZWxwIG1vam8gc291cmNlIGFuZCBjbGFzcwotYXNzZXJ0IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2NsYXNzZXMvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L0hlbHBNb2pvLmNsYXNzIiApLmlzRmlsZSgpCi1hc3NlcnQgbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvcGx1Z2luL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9IZWxwTW9qby5qYXZhIiApLmlzRmlsZSgpCi1hc3NlcnQgIW5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL3BsdWdpbi9IZWxwTW9qby5qYXZhIiApLmlzRmlsZSgpCithc3NlcnQgbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvY2xhc3Nlcy9vcmcvYXBhY2hlL21hdmVuL2l0cy9iYXNpY19qYXZhX2Fubm90YXRpb25zL21hdmVuX2l0X2Jhc2ljX2phdmFfYW5ub3RhdGlvbnMvSGVscE1vam8uY2xhc3MiICkuaXNGaWxlKCkKK2Fzc2VydCBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9wbHVnaW4vb3JnL2FwYWNoZS9tYXZlbi9pdHMvYmFzaWNfamF2YV9hbm5vdGF0aW9ucy9tYXZlbl9pdF9iYXNpY19qYXZhX2Fubm90YXRpb25zL0hlbHBNb2pvLmphdmEiICkuaXNGaWxlKCkKIAogcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljLWFubm90YXRpb25zL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMtYW5ub3RhdGlvbnMvaW52b2tlci5wcm9wZXJ0aWVzCmluZGV4IGYzYTk5NjMuLmQwYTllMTQgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMtYW5ub3RhdGlvbnMvaW52b2tlci5wcm9wZXJ0aWVzCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMtYW5ub3RhdGlvbnMvaW52b2tlci5wcm9wZXJ0aWVzCkBAIC0xNSw2ICsxNSw2IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLWludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwgLURza2lwVGVzdHMKK2ludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwKIGludm9rZXIuZ29hbHMuMiA9IG9yZy5hcGFjaGUubWF2ZW4uaXRzLmJhc2ljLWphdmEtYW5ub3RhdGlvbnM6bWF2ZW4taXQtYmFzaWMtamF2YS1hbm5vdGF0aW9uczoxLjAtU05BUFNIT1Q6aXQwMDE0Ci1pbnZva2VyLmdvYWxzLjMgPSBvcmcuYXBhY2hlLm1hdmVuLml0cy5iYXNpYy1qYXZhLWFubm90YXRpb25zOm1hdmVuLWl0LWJhc2ljLWphdmEtYW5ub3RhdGlvbnM6MS4wLVNOQVBTSE9UOmhlbHAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitpbnZva2VyLmdvYWxzLjMgPSBvcmcuYXBhY2hlLm1hdmVuLml0cy5iYXNpYy1qYXZhLWFubm90YXRpb25zOm1hdmVuLWl0LWJhc2ljLWphdmEtYW5ub3RhdGlvbnM6MS4wLVNOQVBTSE9UOmhlbHAKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMtYW5ub3RhdGlvbnMvcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMtYW5ub3RhdGlvbnMvcG9tLnhtbAppbmRleCA2NTNhN2M5Li4xOWVlMmIxIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljLWFubm90YXRpb25zL3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy9wb20ueG1sCkBAIC00MywyMiArNDMsMjQgQEAKICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb3JlPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdXRpbHM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjAuMTwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPkBwbGV4dXNVdGlsc1ZlcnNpb25APC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLXRvb2xzPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+QHByb2plY3QudmVyc2lvbkA8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMtYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9jb3JlaXQvRmlyc3RNb2pvLmphdmEgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L0ZpcnN0TW9qby5qYXZhCmluZGV4IDYyMjQ3YTAuLmYyODQ4ZWIgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMtYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9jb3JlaXQvRmlyc3RNb2pvLmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9GaXJzdE1vam8uamF2YQpAQCAtNDQsNiArNDQsNyBAQAogICovCiBATW9qbyggbmFtZSA9ICJmaXJzdCIsIHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gPSBSZXNvbHV0aW9uU2NvcGUuVEVTVCwgZGVmYXVsdFBoYXNlID0gTGlmZWN5Y2xlUGhhc2UuSU5URUdSQVRJT05fVEVTVCApCiBARXhlY3V0ZSggcGhhc2UgPSBMaWZlY3ljbGVQaGFzZS5HRU5FUkFURV9TT1VSQ0VTLCBsaWZlY3ljbGUgPSAiY29iZXJ0dXJhIiApCitARGVwcmVjYXRlZAogcHVibGljIGNsYXNzIEZpcnN0TW9qbwogICAgIGV4dGVuZHMgQWJzdHJhY3RNb2pvCiB7CkBAIC02Miw2ICs2Myw3IEBACiAgICAgICogQHNpbmNlIDAuMQogICAgICAqIEBkZXByZWNhdGVkIEFzIG9mIDAuMgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgQFBhcmFtZXRlciggbmFtZSA9ICJuYW1lZFBhcmFtIiwgYWxpYXMgPSAiYWxpYXMiICkKICAgICBwcml2YXRlIFN0cmluZyBhbGlhc2VkUGFyYW07CiAKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi10b29scy1nZW5lcmF0b3JzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZ2VuZXJhdG9yL1BsdWdpbkhlbHBHZW5lcmF0b3JUZXN0LmphdmEgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L01QbHVnaW4zOTZNb2pvLmphdmEKc2ltaWxhcml0eSBpbmRleCA2MCUKcmVuYW1lIGZyb20gbWF2ZW4tcGx1Z2luLXRvb2xzLWdlbmVyYXRvcnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9nZW5lcmF0b3IvUGx1Z2luSGVscEdlbmVyYXRvclRlc3QuamF2YQpyZW5hbWUgdG8gbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9NUGx1Z2luMzk2TW9qby5qYXZhCmluZGV4IGNlNGY5MTkuLjU3YzQ1ZDggMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi10b29scy1nZW5lcmF0b3JzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZ2VuZXJhdG9yL1BsdWdpbkhlbHBHZW5lcmF0b3JUZXN0LmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9NUGx1Z2luMzk2TW9qby5qYXZhCkBAIC0xLDQgKzEsNCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5nZW5lcmF0b3I7CitwYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmNvcmVpdDsKIAogLyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTE5LDIyICsxOSwyNSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudmVsb2NpdHkuVmVsb2NpdHlDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLk1vam87CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0SGVscGVyOwogCi0vKioKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnZpbmNlbnQuc2l2ZXRvbkBnbWFpbC5jb20iPlZpbmNlbnQgU2l2ZXRvbjwvYT4KLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkhlbHBHZW5lcmF0b3JUZXN0Ci0gICAgZXh0ZW5kcyBBYnN0cmFjdEdlbmVyYXRvclRlc3RDYXNlCitARGVwcmVjYXRlZAorQE1vam8oIG5hbWUgPSAibXBsdWdpbi0zOTYiICkKK3B1YmxpYyBjbGFzcyBNUGx1Z2luMzk2TW9qbworICAgIGV4dGVuZHMgQWJzdHJhY3RNb2pvCiB7Ci0gICAgLy8gaW5oZXJpdHMgdGVzdHMgZnJvbSBiYXNlIGNsYXNzCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBHZW5lcmF0b3IoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCisgICAgQERlcHJlY2F0ZWQKKyAgICBAUGFyYW1ldGVyCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyYW07CisKKyAgICBAQ29tcG9uZW50CisgICAgcHJpdmF0ZSBNYXZlblByb2plY3RIZWxwZXIgcHJvamVjdEhlbHBlcjsKKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQogICAgIHsKLQotICAgICAgICBnZW5lcmF0b3IgPQotICAgICAgICAgICAgbmV3IFBsdWdpbkhlbHBHZW5lcmF0b3IoKS5zZXRWZWxvY2l0eUNvbXBvbmVudCggKFZlbG9jaXR5Q29tcG9uZW50KSBsb29rdXAoIFZlbG9jaXR5Q29tcG9uZW50LlJPTEUgKSApOwotCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy92ZXJpZnkuZ3Jvb3Z5IGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy1hbm5vdGF0aW9ucy92ZXJpZnkuZ3Jvb3Z5CmluZGV4IDI5NGY1MzguLjQzMTViZWYgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMtYW5ub3RhdGlvbnMvdmVyaWZ5Lmdyb292eQorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljLWFubm90YXRpb25zL3ZlcmlmeS5ncm9vdnkKQEAgLTIyNCw4ICsyMjQsMTkgQEAKIGFzc2VydCByZXF1aXJlbWVudC5yb2xlLnRleHQoKSA9PSAnb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdEhlbHBlcicKIAogLy8gY2hlY2sgaGVscCBtb2pvIHNvdXJjZSBhbmQgY2xhc3MKLWFzc2VydCBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9jbGFzc2VzL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9IZWxwTW9qby5jbGFzcyIgKS5pc0ZpbGUoKQotYXNzZXJ0IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL3BsdWdpbi9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9jb3JlaXQvSGVscE1vam8uamF2YSIgKS5pc0ZpbGUoKQotYXNzZXJ0ICFuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9wbHVnaW4vSGVscE1vam8uamF2YSIgKS5pc0ZpbGUoKQorYXNzZXJ0IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2NsYXNzZXMvb3JnL2FwYWNoZS9tYXZlbi9pdHMvYmFzaWNfamF2YV9hbm5vdGF0aW9ucy9tYXZlbl9pdF9iYXNpY19qYXZhX2Fubm90YXRpb25zL0hlbHBNb2pvLmNsYXNzIiApLmlzRmlsZSgpCithc3NlcnQgbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvcGx1Z2luL29yZy9hcGFjaGUvbWF2ZW4vaXRzL2Jhc2ljX2phdmFfYW5ub3RhdGlvbnMvbWF2ZW5faXRfYmFzaWNfamF2YV9hbm5vdGF0aW9ucy9IZWxwTW9qby5qYXZhIiApLmlzRmlsZSgpCisKK21vam8gPSBwbHVnaW5EZXNjcmlwdG9yLm1vam9zLm1vam8uZmluZEFsbHsgaXQuZ29hbC50ZXh0KCkgPT0gImhlbHAifVswXQorYXNzZXJ0IG1vam8uZ29hbC50ZXh0KCkgPT0gJ2hlbHAnCithc3NlcnQgbW9qby5pbXBsZW1lbnRhdGlvbi50ZXh0KCkgPT0gJ29yZy5hcGFjaGUubWF2ZW4uaXRzLmJhc2ljX2phdmFfYW5ub3RhdGlvbnMubWF2ZW5faXRfYmFzaWNfamF2YV9hbm5vdGF0aW9ucy5IZWxwTW9qbycKK2Fzc2VydCBtb2pvLmxhbmd1YWdlLnRleHQoKSA9PSAnamF2YScKKworLy8gY2hlY2sgdmFsdWVzIHNldCBieSBkZXByZWNhdGVkIGFubm90YXRpb24gb25seQorbW9qbyA9IHBsdWdpbkRlc2NyaXB0b3IubW9qb3MubW9qby5maW5kQWxseyBpdC5nb2FsLnRleHQoKSA9PSAibXBsdWdpbi0zOTYifVswXQorYXNzZXJ0IG1vam8uZGVwcmVjYXRlZC50ZXh0KCkgPT0gJ05vIHJlYXNvbiBnaXZlbicKKworcGFyYW1ldGVyID0gbW9qby5wYXJhbWV0ZXJzLnBhcmFtZXRlci5maW5kQWxseyBpdC5uYW1lLnRleHQoKSA9PSAicGFyYW0iIH1bMF0KK2Fzc2VydCBwYXJhbWV0ZXIuZGVwcmVjYXRlZC50ZXh0KCkgPT0gJ05vIHJlYXNvbiBnaXZlbicKIAogcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMvaW52b2tlci5wcm9wZXJ0aWVzCmluZGV4IDY2NzJmMDIuLmRhNGE3MDggMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMvaW52b2tlci5wcm9wZXJ0aWVzCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMvaW52b2tlci5wcm9wZXJ0aWVzCkBAIC0xNSw2ICsxNSw2IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLWludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwgLURza2lwVGVzdHMKK2ludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwKIGludm9rZXIuZ29hbHMuMiA9IG9yZy5hcGFjaGUubWF2ZW4uaXRzLml0MDAxMzptYXZlbi1pdC1pdDAwMTM6MS4wLVNOQVBTSE9UOml0MDAxMwogCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljL3BvbS54bWwgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9qYXZhLWJhc2ljL3BvbS54bWwKaW5kZXggYzU3MGU0MS4uODQ3ZTRhOSAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvamF2YS1iYXNpYy9wb20ueG1sCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L2phdmEtYmFzaWMvcG9tLnhtbApAQCAtNDMsMTEgKzQzLDEzIEBACiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29yZTwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgIDwvZGVwZW5kZW5jaWVzPgogCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTE4Ny9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTE4Ny9pbnZva2VyLnByb3BlcnRpZXMKaW5kZXggNTY1OTU3Ny4uYTE2YmFlOCAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0xODcvaW52b2tlci5wcm9wZXJ0aWVzCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMTg3L2ludm9rZXIucHJvcGVydGllcwpAQCAtMTUsNCArMTUsNCBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1pbnZva2VyLmdvYWxzID0gY2xlYW4gcGx1Z2luOnJlcG9ydCAtRHNraXBUZXN0cworaW52b2tlci5nb2FscyA9IGNsZWFuIHBsdWdpbjpyZXBvcnQKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMTkxL3BvbS54bWwgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTE5MS9wb20ueG1sCmluZGV4IDI5YWEzOGUuLmFkYzcxZDMgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMTkxL3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0xOTEvcG9tLnhtbApAQCAtNTYsMTIgKzU2LDE0IEBACiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10b29sczwvZ3JvdXBJZD4NCiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+DQogICAgICAgPHZlcnNpb24+QHByb2plY3QudmVyc2lvbkA8L3ZlcnNpb24+DQorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCiAgICAgPC9kZXBlbmRlbmN5Pg0KICAgICA8ZGVwZW5kZW5jeT4NCiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPg0KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+DQogICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+DQorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4NCiAgICAgPC9kZXBlbmRlbmN5Pg0KICAgPC9kZXBlbmRlbmNpZXM+DQogDQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTIyMy9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTIyMy9pbnZva2VyLnByb3BlcnRpZXMKaW5kZXggYWRjZTJjZC4uYmJkNjZiOCAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0yMjMvaW52b2tlci5wcm9wZXJ0aWVzCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMjIzL2ludm9rZXIucHJvcGVydGllcwpAQCAtMTIsNCArMTIsNCBAQAogIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLWludm9rZXIuZ29hbHMuMSA9IGNsZWFuIHZlcmlmeSAtRHNraXBUZXN0cworaW52b2tlci5nb2Fscy4xID0gY2xlYW4gdmVyaWZ5CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTIyMy9wb20ueG1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0yMjMvcG9tLnhtbAppbmRleCA3NjE1MzkxLi42NGU3MWM5IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTIyMy9wb20ueG1sCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMjIzL3BvbS54bWwKQEAgLTM4LDYgKzM4LDcgQEAKICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLXRvb2xzPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0yNzJfamF2YTgvcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMjcyX2phdmE4L3BvbS54bWwKaW5kZXggYzEwYzZlNC4uOTQ0MTRlMyAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0yNzJfamF2YTgvcG9tLnhtbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTI3Ml9qYXZhOC9wb20ueG1sCkBAIC0yMCw2NCArMjAsNjYgQEAKIDxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCiAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgogICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CiAKLSAgICA8Z3JvdXBJZD50ZXN0LXBsdWdpbjwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD50ZXN0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KKyAgPGdyb3VwSWQ+dGVzdC1wbHVnaW48L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPnRlc3QtcGx1Z2luPC9hcnRpZmFjdElkPgorICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+CiAKLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10b29sczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPkBwcm9qZWN0LnZlcnNpb25APC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10b29sczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPkBwcm9qZWN0LnZlcnNpb25APC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgogCiAKLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjg8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjg8L3RhcmdldD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+QHByb2plY3QudmVyc2lvbkA8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxnb2FsUHJlZml4PkZPTzwvZ29hbFByZWZpeD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZGVmYXVsdC1kZXNjcmlwdG9yPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5kZXNjcmlwdG9yPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmhlbHAtZGVzY3JpcHRvcjwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+aGVscG1vam88L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4zLjE8L3ZlcnNpb24+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxzb3VyY2U+MS44PC9zb3VyY2U+CisgICAgICAgICAgPHRhcmdldD4xLjg8L3RhcmdldD4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPkBwcm9qZWN0LnZlcnNpb25APC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8Z29hbFByZWZpeD5GT088L2dvYWxQcmVmaXg+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5kZWZhdWx0LWRlc2NyaXB0b3I8L2lkPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5kZXNjcmlwdG9yPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+CisgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5oZWxwLWRlc2NyaXB0b3I8L2lkPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5oZWxwbW9qbzwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1jbGFzc2VzPC9waGFzZT4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0yOTlfbm8tY29uZmlndXJhdGlvbi9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTI5OV9uby1jb25maWd1cmF0aW9uL2ludm9rZXIucHJvcGVydGllcwppbmRleCBhOTA0MWY5Li5lN2IwYjRkIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTI5OV9uby1jb25maWd1cmF0aW9uL2ludm9rZXIucHJvcGVydGllcworKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTI5OV9uby1jb25maWd1cmF0aW9uL2ludm9rZXIucHJvcGVydGllcwpAQCAtMSwyMCArMSwxOSBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIyANCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotIyANCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotaW52b2tlci5tYXZlbi52ZXJzaW9uID0gMy4wKw0KLWludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwgLURza2lwVGVzdHMNCi1pbnZva2VyLmdvYWxzLjIgPSAtLWxvZy1maWxlIGhlbHAubG9nIG9yZy5hcGFjaGUubWF2ZW4uaXRzLnBsdWdpbjpoZWxwOjEuMC1TTkFQU0hPVDpoZWxwDQorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjIAorIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ludm9rZXIuZ29hbHMuMSA9IGNsZWFuIGluc3RhbGwKK2ludm9rZXIuZ29hbHMuMiA9IC0tbG9nLWZpbGUgaGVscC5sb2cgb3JnLmFwYWNoZS5tYXZlbi5pdHMucGx1Z2luOmhlbHA6MS4wLVNOQVBTSE9UOmhlbHAKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMjk5X25vLWNvbmZpZ3VyYXRpb24vcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMjk5X25vLWNvbmZpZ3VyYXRpb24vcG9tLnhtbAppbmRleCBkYmI5OGQ3Li42NzFhODNmIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTI5OV9uby1jb25maWd1cmF0aW9uL3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0yOTlfbm8tY29uZmlndXJhdGlvbi9wb20ueG1sCkBAIC00MCwxMSArNDAsNyBAQAogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4NCiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPg0KICAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPg0KLSAgICA8L2RlcGVuZGVuY3k+DQotICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+DQotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPg0KLSAgICAgIDx2ZXJzaW9uPjMuMC4xPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQogICAgIDwvZGVwZW5kZW5jeT4NCiAgICAgPGRlcGVuZGVuY3k+DQogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4tdG9vbHM8L2dyb3VwSWQ+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zMDVfZGVmYXVsdE1vam9EZXBlbmRlbmNpZXMvcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzA1X2RlZmF1bHRNb2pvRGVwZW5kZW5jaWVzL3BvbS54bWwKaW5kZXggNzIwZmFjNS4uNzcwYTc4NCAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zMDVfZGVmYXVsdE1vam9EZXBlbmRlbmNpZXMvcG9tLnhtbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTMwNV9kZWZhdWx0TW9qb0RlcGVuZGVuY2llcy9wb20ueG1sCkBAIC0zNyw2ICszNyw3IEBACiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10b29sczwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzA1X2VtcHR5TW9qb0RlcGVuZGVuY2llcy9wb20ueG1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zMDVfZW1wdHlNb2pvRGVwZW5kZW5jaWVzL3BvbS54bWwKaW5kZXggNzlkNjg4NS4uMDNhM2EzZCAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zMDVfZW1wdHlNb2pvRGVwZW5kZW5jaWVzL3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zMDVfZW1wdHlNb2pvRGVwZW5kZW5jaWVzL3BvbS54bWwKQEAgLTM3LDYgKzM3LDcgQEAKICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLXRvb2xzPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zMDVfc2luZ2xlTW9qb0RlcGVuZGVuY2llcy9wb20ueG1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zMDVfc2luZ2xlTW9qb0RlcGVuZGVuY2llcy9wb20ueG1sCmluZGV4IGUxNDJjYzYuLjQ1NmU0NzUgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzA1X3NpbmdsZU1vam9EZXBlbmRlbmNpZXMvcG9tLnhtbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTMwNV9zaW5nbGVNb2pvRGVwZW5kZW5jaWVzL3BvbS54bWwKQEAgLTM3LDYgKzM3LDcgQEAKICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLXRvb2xzPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zMTlfcmVwb3J0LXNpbmNlL3BvbS54bWwgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTMxOV9yZXBvcnQtc2luY2UvcG9tLnhtbAppbmRleCBmN2FkOTBhLi42MThhM2Q4IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTMxOV9yZXBvcnQtc2luY2UvcG9tLnhtbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTMxOV9yZXBvcnQtc2luY2UvcG9tLnhtbApAQCAtMzcsNiArMzcsNyBAQAogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4NCiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPg0KICAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQogICAgIDwvZGVwZW5kZW5jeT4NCiAgIDwvZGVwZW5kZW5jaWVzPg0KIA0KQEAgLTY3LDcgKzY4LDcgQEAKICAgICAgIDxwbHVnaW4+DQogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+DQorICAgICAgICA8dmVyc2lvbj5AcHJvamVjdEluZm9SZXBvcnRzUGx1Z2luQDwvdmVyc2lvbj4NCiAgICAgICAgIDxyZXBvcnRTZXRzPg0KICAgICAgICAgICA8cmVwb3J0U2V0Pg0KICAgICAgICAgICAgIDxyZXBvcnRzPg0KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzI0X2phdmFkb2MvcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzI0X2phdmFkb2MvcG9tLnhtbAppbmRleCBiNjNmNTFjLi4xYjI4M2VkIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTMyNF9qYXZhZG9jL3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zMjRfamF2YWRvYy9wb20ueG1sCkBAIC00MCwxMSArNDAsNyBAQAogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4NCiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPg0KICAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPg0KLSAgICA8L2RlcGVuZGVuY3k+DQotICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+DQotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPg0KLSAgICAgIDx2ZXJzaW9uPjMuMC4xPC92ZXJzaW9uPg0KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+DQogICAgIDwvZGVwZW5kZW5jeT4NCiAgICAgPGRlcGVuZGVuY3k+DQogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4tdG9vbHM8L2dyb3VwSWQ+DQpAQCAtNjUsNyArNjEsNyBAQAogICAgICAgICA8cGx1Z2luPg0KICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQogICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICA8dmVyc2lvbj4zLjAuMTwvdmVyc2lvbj4NCisgICAgICAgICAgPHZlcnNpb24+My40LjE8L3ZlcnNpb24+DQogICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KICAgICAgICAgICAgIDxsZXZlbD5wcml2YXRlPC9sZXZlbD4NCiAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzYzX2hlbHAtcmVwcm9kdWNpYmxlL3BvbS54bWwgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTM2M19oZWxwLXJlcHJvZHVjaWJsZS9wb20ueG1sCmluZGV4IGI3MmVjYzAuLjY5OTExOWMgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzYzX2hlbHAtcmVwcm9kdWNpYmxlL3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zNjNfaGVscC1yZXByb2R1Y2libGUvcG9tLnhtbApAQCAtNDAsMTEgKzQwLDcgQEAKICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuMC4xPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10b29sczwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzYzX2hlbHAtcmVwcm9kdWNpYmxlL3ZlcmlmeS5ncm9vdnkgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTM2M19oZWxwLXJlcHJvZHVjaWJsZS92ZXJpZnkuZ3Jvb3Z5CmluZGV4IGI2NGRlNDMuLmI0N2Y4YTkgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzYzX2hlbHAtcmVwcm9kdWNpYmxlL3ZlcmlmeS5ncm9vdnkKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zNjNfaGVscC1yZXByb2R1Y2libGUvdmVyaWZ5Lmdyb292eQpAQCAtMTcsNyArMTcsNyBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotZmlyc3RSdW4gPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9nZW5lcmF0ZWQtc291cmNlcy1ydW4xL3BsdWdpbi90ZXN0L0hlbHBNb2pvLmphdmEiICkudGV4dDsKLXNlY29uZFJ1biA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzL3BsdWdpbi90ZXN0L0hlbHBNb2pvLmphdmEiICkudGV4dDsKK2ZpcnN0UnVuID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMtcnVuMS9wbHVnaW4vb3JnL2FwYWNoZS9tYXZlbi9pdHMvcGx1Z2luL2hlbHAvSGVscE1vam8uamF2YSIgKS50ZXh0Oworc2Vjb25kUnVuID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMvcGx1Z2luL29yZy9hcGFjaGUvbWF2ZW4vaXRzL3BsdWdpbi9oZWxwL0hlbHBNb2pvLmphdmEiICkudGV4dDsKIAogYXNzZXJ0IGZpcnN0UnVuID09IHNlY29uZFJ1bjsKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzcyLWFubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS1mcm9tLXByb3ZpZGVkLWRlcHMvcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzcyLWFubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS1mcm9tLXByb3ZpZGVkLWRlcHMvcG9tLnhtbAppbmRleCAzNmIwYWEzLi40NTZiNmYxIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTM3Mi1hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtZnJvbS1wcm92aWRlZC1kZXBzL3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zNzItYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlLWZyb20tcHJvdmlkZWQtZGVwcy9wb20ueG1sCkBAIC0zNiw3ICszNiw2IEBACiAKICAgPHByb3BlcnRpZXM+CiAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+Ci0gICAgPHBsZXh1c0NvbXBpbGVyVmVyc2lvbj4xLjguNjwvcGxleHVzQ29tcGlsZXJWZXJzaW9uPgogICA8L3Byb3BlcnRpZXM+CiAKICAgPGRlcGVuZGVuY2llcz4KQEAgLTQ3LDUxICs0NiwzMSBAQAogICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10b29sczwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPkBwcm9qZWN0LnZlcnNpb25APC92ZXJzaW9uPgotICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10b29sczwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPkBwcm9qZWN0LnZlcnNpb25APC92ZXJzaW9uPgogICAgICAgPGNsYXNzaWZpZXI+dGVzdHM8L2NsYXNzaWZpZXI+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPCEtLSBkZXBlbmRlbmN5IG9mICBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10b29sczptYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnM6QHByb2plY3QudmVyc2lvbkA6amFyOnRlc3RzIC0tPgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjQuMTMuMjwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBpbGVyLW1hbmFnZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4ke3BsZXh1c0NvbXBpbGVyVmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8IS0tIHdlIG9ubHkgbmVlZCBvbmUgY2xhc3MgRm9vTW9qbyAtLT4KKyAgICAgIDwhLS0gaW4gb3JkZXIgdG8gZG9uJ3QgbWFuYWdlIGFsbCB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBzaW1wbHkgZXhjbHVkZSBpdHMgLS0+CiAgICAgICA8ZXhjbHVzaW9ucz4KICAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21wb25lbnQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgIDxncm91cElkPio8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+KjwvYXJ0aWZhY3RJZD4KICAgICAgICAgPC9leGNsdXNpb24+CiAgICAgICA8L2V4Y2x1c2lvbnM+CiAgICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1qYXZhYzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7cGxleHVzQ29tcGlsZXJWZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgIDxleGNsdXNpb25zPgotICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBvbmVudC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgPC9leGNsdXNpb25zPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdXRpbHM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjAuMTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+CiAgIDwvZGVwZW5kZW5jaWVzPgogCiAgIDxidWlsZD4KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzcyLWFubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS1mcm9tLXByb3ZpZGVkLWRlcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9jb3JlaXQvRmlyc3RNb2pvLmphdmEgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTM3Mi1hbm5vdGF0aW9uLXdpdGgtaW5oZXJpdGFuY2UtZnJvbS1wcm92aWRlZC1kZXBzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L0ZpcnN0TW9qby5qYXZhCmluZGV4IGEyYTFiYTIuLjY2MTViNmEgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzcyLWFubm90YXRpb24td2l0aC1pbmhlcml0YW5jZS1mcm9tLXByb3ZpZGVkLWRlcHMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9jb3JlaXQvRmlyc3RNb2pvLmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zNzItYW5ub3RhdGlvbi13aXRoLWluaGVyaXRhbmNlLWZyb20tcHJvdmlkZWQtZGVwcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2NvcmVpdC9GaXJzdE1vam8uamF2YQpAQCAtNjQsMTEgKzY0LDYgQEAKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJwcm9qZWN0SGVscGVyID09IG51bGwiICk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCBjb21waWxlck1hbmFnZXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiY29tcGlsZXJNYW5hZ2VyID09IG51bGwiICk7Ci0gICAgICAgIH0KLQogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi93b3JrZmxvd3MvbWF2ZW4ueW1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zOTAvaW52b2tlci5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggNzMlCmNvcHkgZnJvbSAuZ2l0aHViL3dvcmtmbG93cy9tYXZlbi55bWwKY29weSB0byBtYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTM5MC9pbnZva2VyLnByb3BlcnRpZXMKaW5kZXggYzEzNmM0YS4uZjhlZDc3ZSAxMDA2NDQKLS0tIGEvLmdpdGh1Yi93b3JrZmxvd3MvbWF2ZW4ueW1sCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzkwL2ludm9rZXIucHJvcGVydGllcwpAQCAtNSw5ICs1LDkgQEAKICMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQogIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCisjIAorIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKQEAgLTE1LDE1ICsxNSw1IEBACiAjIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLW5hbWU6IEphdmEgQ0kKLQotb246Ci0gIHB1c2g6Ci0gICAgYnJhbmNoZXMtaWdub3JlOgotICAgICAgLSBkZXBlbmRhYm90LyoqCi0gIHB1bGxfcmVxdWVzdDoKLQotam9iczoKLSAgYnVpbGQ6Ci0gICAgbmFtZTogVmVyaWZ5Ci0gICAgdXNlczogYXBhY2hlL21hdmVuLWdoLWFjdGlvbnMtc2hhcmVkLy5naXRodWIvd29ya2Zsb3dzL21hdmVuLXZlcmlmeS55bWxAdjEKK2ludm9rZXIuZ29hbHMuMSA9IHByb2Nlc3MtY2xhc3NlcworaW52b2tlci5nb2Fscy4yID0gcHJvY2Vzcy1jbGFzc2VzCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTM5MC9wb20ueG1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zOTAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWVkNDI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zOTAvcG9tLnhtbApAQCAtMCwwICsxLDExNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKworPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5pdHMubXBsdWdpbi0zOTA8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPm1wbHVnaW4tMzkwPC9hcnRpZmFjdElkPgorICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+TWF2ZW4gSW50ZWdyYXRpb24gVGVzdCA6OiBtcGx1Z2luLTM5MDwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPgorICAgIFRlc3QgcGx1Z2luLXBsdWdpbiwgcGx1Z2luLnhtbCBkZXNjcmlwdG9yIC0gc2hvdWxkbid0IGNvbnRhaW4gZGVwZW5kZW5jaWVzIGluIHByb3ZpZGVkIHNjb3BlCisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj5AbWF2ZW5WZXJzaW9uQDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4tdG9vbHM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj5AcHJvamVjdC52ZXJzaW9uQDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPCEtLSBkZXBlbmRlbmN5IGluIGNvbXBpbGUgc2NvcGUgLS0+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLW1hdGgzPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+My42LjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPCEtLSBkZXBlbmRlbmN5IGluIHJ1bnRpbWUgc2NvcGUgLS0+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLXJuZy1jbGllbnQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS40PC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKworICA8L2RlcGVuZGVuY2llcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICA8cGx1Z2lucz4KKyAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgorICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPHNvdXJjZT4xLjg8L3NvdXJjZT4KKyAgICAgICAgICAgIDx0YXJnZXQ+MS44PC90YXJnZXQ+CisgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICA8L3BsdWdpbj4KKyAgICAgIDwvcGx1Z2lucz4KKyAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisKKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+My4wLjA8L3ZlcnNpb24+CisgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICA8aWQ+dG91Y2g8L2lkPgorICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXJlc291cmNlczwvcGhhc2U+CisgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KKyAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPHRhcmdldD4KKyAgICAgICAgICAgICAgICA8dG91Y2ggZmlsZT0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdG91Y2gudHh0Ii8+CisgICAgICAgICAgICAgICAgPHNsZWVwIG1pbGxpc2Vjb25kcz0iMTAwIi8+CisgICAgICAgICAgICAgIDwvdGFyZ2V0PgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+QHByb2plY3QudmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisKKyAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzkwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L0ZpcnN0TW9qby5qYXZhIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zOTAvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9jb3JlaXQvRmlyc3RNb2pvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmN2Y2MgotLS0gL2Rldi9udWxsCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzkwL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vY29yZWl0L0ZpcnN0TW9qby5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKK3BhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uY29yZWl0OworCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUmVzb2x1dGlvblNjb3BlOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5MaWZlY3ljbGVQaGFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuTW9qbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyOworCisvKioKKyAqIFRvdWNoZXMgYSB0ZXN0IGZpbGUuCisgKgorICogQHNpbmNlIDEuMgorICovCitATW9qbyggbmFtZSA9ICJmaXJzdCIsIHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gPSBSZXNvbHV0aW9uU2NvcGUuVEVTVCwgZGVmYXVsdFBoYXNlID0gTGlmZWN5Y2xlUGhhc2UuSU5URUdSQVRJT05fVEVTVCApCitwdWJsaWMgY2xhc3MgRmlyc3RNb2pvCisgICAgZXh0ZW5kcyBBYnN0cmFjdE1vam8KK3sKKworICAgIC8qKgorICAgICAqIEBzaW5jZSAwLjEKKyAgICAgKiBAZGVwcmVjYXRlZCBBcyBvZiAwLjIKKyAgICAgKi8KKyAgICBAUGFyYW1ldGVyKCBhbGlhcyA9ICJhbGlhcyIgKQorICAgIHByaXZhdGUgU3RyaW5nIGFsaWFzZWRQYXJhbTsKKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQorICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gbm90aGluZworICAgIH0KK30KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzkwL3ZlcmlmeS5ncm9vdnkgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTM5MC92ZXJpZnkuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMGVhODIKLS0tIC9kZXYvbnVsbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTM5MC92ZXJpZnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiAKKyAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworRmlsZSBkZXNjcmlwdG9yRmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2NsYXNzZXMvTUVUQS1JTkYvbWF2ZW4vcGx1Z2luLnhtbCIgKTsKK2Fzc2VydCBkZXNjcmlwdG9yRmlsZS5pc0ZpbGUoKQorCitGaWxlIHRvdWNoRmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3RvdWNoLnR4dCIgKTsKK2Fzc2VydCB0b3VjaEZpbGUuaXNGaWxlKCkKKworLy8gdGhlIHRvdWNoIGZpbGUgc2hvdWxkIGJlIG5ld2VyIHRoYW4gdGhlIGRlc2NyaXB0b3IKK2Fzc2VydCB0b3VjaEZpbGUubGFzdE1vZGlmaWVkKCkgPiBkZXNjcmlwdG9yRmlsZS5sYXN0TW9kaWZpZWQoKQorCityZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhLy5naXRodWIvd29ya2Zsb3dzL21hdmVuLnltbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzk0X3JlcG9ydC1lbmNvZGluZy9pbnZva2VyLnByb3BlcnRpZXMKc2ltaWxhcml0eSBpbmRleCA3MyUKY29weSBmcm9tIC5naXRodWIvd29ya2Zsb3dzL21hdmVuLnltbApjb3B5IHRvIG1hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzk0X3JlcG9ydC1lbmNvZGluZy9pbnZva2VyLnByb3BlcnRpZXMKaW5kZXggYzEzNmM0YS4uOTM5N2MzYiAxMDA2NDQKLS0tIGEvLmdpdGh1Yi93b3JrZmxvd3MvbWF2ZW4ueW1sCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzk0X3JlcG9ydC1lbmNvZGluZy9pbnZva2VyLnByb3BlcnRpZXMKQEAgLTUsOSArNSw5IEBACiAjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIworIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KICMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCkBAIC0xNSwxNSArMTUsNCBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1uYW1lOiBKYXZhIENJCi0KLW9uOgotICBwdXNoOgotICAgIGJyYW5jaGVzLWlnbm9yZToKLSAgICAgIC0gZGVwZW5kYWJvdC8qKgotICBwdWxsX3JlcXVlc3Q6Ci0KLWpvYnM6Ci0gIGJ1aWxkOgotICAgIG5hbWU6IFZlcmlmeQotICAgIHVzZXM6IGFwYWNoZS9tYXZlbi1naC1hY3Rpb25zLXNoYXJlZC8uZ2l0aHViL3dvcmtmbG93cy9tYXZlbi12ZXJpZnkueW1sQHYxCitpbnZva2VyLmdvYWxzID0gLURmaWxlLmVuY29kaW5nPUNQMTI1MiBwbHVnaW46cmVwb3J0CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTM5NF9yZXBvcnQtZW5jb2RpbmcvcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzk0X3JlcG9ydC1lbmNvZGluZy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4M2I2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9tcGx1Z2luLTM5NF9yZXBvcnQtZW5jb2RpbmcvcG9tLnhtbApAQCAtMCwwICsxLDc1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorCis8IS0tCitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCitvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKK2Rpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCityZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCit0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCit3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKK3NvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKK0tJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwordW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLml0cy5wbHVnaW48L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPnJlcG9ydC1lbmNvZGluZzwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgorCisgIDxuYW1lPk1hdmVuIEludGVncmF0aW9uIFRlc3QgOjogUmVwb3J0IEVuY29kaW5nPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+CisgICAgVGVzdHMgY29ycmVjdCB1c2FnZSBvZiBjb25maWd1cmVkIGVuY29kaW5nIGZvciByZXBvcnRzCisgIDwvZGVzY3JpcHRpb24+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPHByb2plY3QucmVwb3J0Lm91dHB1dEVuY29kaW5nPlVURi04PC9wcm9qZWN0LnJlcG9ydC5vdXRwdXRFbmNvZGluZz4KKyAgICA8bWF2ZW4uY29tcGlsZXIuc291cmNlPjEuODwvbWF2ZW4uY29tcGlsZXIuc291cmNlPgorICAgIDxtYXZlbi5jb21waWxlci50YXJnZXQ+MS44PC9tYXZlbi5jb21waWxlci50YXJnZXQ+CisgIDwvcHJvcGVydGllcz4KKworICA8ZGVwZW5kZW5jaWVzPgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj5AbWF2ZW5WZXJzaW9uQDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4tdG9vbHM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj5AcHJvamVjdC52ZXJzaW9uQDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICA8cGx1Z2lucz4KKyAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPjMuOC4wPC92ZXJzaW9uPgorICAgICAgICA8L3BsdWdpbj4KKyAgICAgIDwvcGx1Z2lucz4KKyAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPkBwcm9qZWN0LnZlcnNpb25APC92ZXJzaW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zOTRfcmVwb3J0LWVuY29kaW5nL3NyYy9tYWluL2phdmEvdGVzdC9NeU1vam8uamF2YSBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzk0X3JlcG9ydC1lbmNvZGluZy9zcmMvbWFpbi9qYXZhL3Rlc3QvTXlNb2pvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0MWYxOQotLS0gL2Rldi9udWxsCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzk0X3JlcG9ydC1lbmNvZGluZy9zcmMvbWFpbi9qYXZhL3Rlc3QvTXlNb2pvLmphdmEKQEAgLTAsMCArMSw1MCBAQAorcGFja2FnZSB0ZXN0OworCisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLk1vam87CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLlBhcmFtZXRlcjsKKworLyoqCisgKiBNb2pvLURlc2NyaXB0aW9uIHdpdGggc29tZSBub24tQVNDSUkgY2hhcmFjdGVyczog4oKsw6DDocOiw6PDpMOlw6bDssOzw7TDtcO2w7gKKyAqIDxwPgorICogVGhpcyBmaWxlIGlzIGVuY29kZWQgd2l0aCBVVEYtOCBhbmQgTWF2ZW4gaXMgY29uZmlndXJlZCB3aXRoIFVURi04IGZvciBzb3VyY2UKKyAqIGZpbGVzIGFuZCBVVEYtOCBhcyBvdXRwdXQgZW5jb2RpbmcgZm9yIHRoZSBzaXRlLiAgVGhlcmVmb3JlIHdlIGV4cGVjdCB0aGUKKyAqIGdlbmVyYXRlZCBzaXRlIHRvIGNvbnRhaW4gYWxsIGNoYXJhY3RlcnMgZnJvbSBhYm92ZSwgZXZlbiBpZiB0aGUgc3lzdGVtCisgKiBlbmNvZGluZyBpcyBub3QgVVRGLTguCisgKi8KK0BNb2pvKCBuYW1lPSAidGVzdCIgKQorcHVibGljIGNsYXNzIE15TW9qbworICAgIGV4dGVuZHMgQWJzdHJhY3RNb2pvCit7CisKKyAgICAvKioKKyAgICAgKiBQYXJhbWV0ZXItRGVzY3JpcHRpb24gd2l0aCBzb21lIG5vbi1BU0NJSSBjaGFyYWN0ZXJzOiDDiMOJw4rDi+KCrAorICAgICAqLworICAgIEBQYXJhbWV0ZXIKKyAgICBwcml2YXRlIFN0cmluZyB0ZXN0UGFyYW07CisKKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQorICAgIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzk0X3JlcG9ydC1lbmNvZGluZy92ZXJpZnkuZ3Jvb3Z5IGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvbXBsdWdpbi0zOTRfcmVwb3J0LWVuY29kaW5nL3ZlcmlmeS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2OTkyMgotLS0gL2Rldi9udWxsCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L21wbHVnaW4tMzk0X3JlcG9ydC1lbmNvZGluZy92ZXJpZnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2dlbmVyYXRlZCA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2dlbmVyYXRlZC1zaXRlL3hkb2MvdGVzdC1tb2pvLnhtbCIpLmdldFRleHQoIlVURi04IikKKworYXNzZXJ0IGdlbmVyYXRlZC5jb250YWlucygiTW9qby1EZXNjcmlwdGlvbiB3aXRoIHNvbWUgbm9uLUFTQ0lJIGNoYXJhY3RlcnM6IOKCrMOgw6HDosOjw6TDpcOmw7LDs8O0w7XDtsO4IikKK2Fzc2VydCBnZW5lcmF0ZWQuY29udGFpbnMoIlBhcmFtZXRlci1EZXNjcmlwdGlvbiB3aXRoIHNvbWUgbm9uLUFTQ0lJIGNoYXJhY3RlcnM6IMOIw4nDisOL4oKsIikKKworcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wYWNrYWdpbmctamFyL3BvbS54bWwgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wYWNrYWdpbmctamFyL3BvbS54bWwKaW5kZXggZWM1NzAyYy4uMjY4OTU2ZSAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGFja2FnaW5nLWphci9wb20ueG1sCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BhY2thZ2luZy1qYXIvcG9tLnhtbApAQCAtNDIsMjIgKzQyLDEzIEBACiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuMC4xPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10b29sczwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPkBwcm9qZWN0LnZlcnNpb25APC92ZXJzaW9uPgotICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgIDwvZGVwZW5kZW5jaWVzPgogCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4taW5mby1qZGstZGVmYXVsdC12ZXJzaW9uL3BvbS54bWwgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4taW5mby1qZGstZGVmYXVsdC12ZXJzaW9uL3BvbS54bWwKaW5kZXggOGVmYmE0Mi4uNDlkZjhiYSAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLWluZm8tamRrLWRlZmF1bHQtdmVyc2lvbi9wb20ueG1sCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1pbmZvLWpkay1kZWZhdWx0LXZlcnNpb24vcG9tLnhtbApAQCAtMzcsNiArMzcsNyBAQAogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+CiAgICAgICA8dmVyc2lvbj5AbWF2ZW5WZXJzaW9uQDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICA8L2RlcGVuZGVuY2llcz4KIApAQCAtNDcsMTIgKzQ4LDYgQEAKICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICAgIDx2ZXJzaW9uPjIuMy4yPC92ZXJzaW9uPgotICAgICAgICAgIDwhLS0KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgLS0+CiAgICAgICAgIDwvcGx1Z2luPgogICAgICAgICA8cGx1Z2luPgogICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KQEAgLTczLDcgKzY4LDcgQEAKICAgICAgIDxwbHVnaW4+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPkBwcm9qZWN0SW5mb1JlcG9ydHNQbHVnaW5APC92ZXJzaW9uPgogICAgICAgICA8cmVwb3J0U2V0cz4KICAgICAgICAgICA8cmVwb3J0U2V0PgogICAgICAgICAgICAgPHJlcG9ydHM+CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4taW5mby1qZGsvcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1pbmZvLWpkay9wb20ueG1sCmluZGV4IGQwYTE5OGUuLjA1MWRmZDkgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1pbmZvLWpkay9wb20ueG1sCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1pbmZvLWpkay9wb20ueG1sCkBAIC00Miw2ICs0Miw3IEBACiAKICAgPG1vZHVsZXM+CiAgICAgPG1vZHVsZT5wcm9wZXJ0eTwvbW9kdWxlPgorICAgIDxtb2R1bGU+cHJvcGVydHlSZWxlYXNlPC9tb2R1bGU+CiAgICAgPG1vZHVsZT5wbHVnaW5NYW5hZ2VtZW50PC9tb2R1bGU+CiAgICAgPG1vZHVsZT5wbHVnaW48L21vZHVsZT4KICAgICA8bW9kdWxlPnJlcXVpcmVtZW50PC9tb2R1bGU+CkBAIC03Nyw3ICs3OCw3IEBACiAgICAgICA8cGx1Z2luPgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgorICAgICAgICA8dmVyc2lvbj5AcHJvamVjdEluZm9SZXBvcnRzUGx1Z2luQDwvdmVyc2lvbj4KICAgICAgICAgPHJlcG9ydFNldHM+CiAgICAgICAgICAgPHJlcG9ydFNldD4KICAgICAgICAgICAgIDxyZXBvcnRzPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLWluZm8tamRrL3Byb3BlcnR5UmVsZWFzZS9wb20ueG1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLWluZm8tamRrL3Byb3BlcnR5UmVsZWFzZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OGVjZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4taW5mby1qZGsvcHJvcGVydHlSZWxlYXNlL3BvbS54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKworPCEtLQorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCitkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQordG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQord2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCitzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCitLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKK3NwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKK3VuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5pdHMucGx1Z2luLWluZm8tamRrPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorICA8YXJ0aWZhY3RJZD5wcm9wZXJ0eVJlbGVhc2U8L2FydGlmYWN0SWQ+CisgIDxuYW1lPnRhcmdldCBieXRlY29kZSBkZWZpbmVkIGJ5IG1hdmVuLmNvbXBpbGVyLnJlbGVhc2UgcHJvcGVydHk8L25hbWU+CisgIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+CisKKyAgPHByb3BlcnRpZXM+CisgICAgPG1hdmVuLmNvbXBpbGVyLnJlbGVhc2U+ODwvbWF2ZW4uY29tcGlsZXIucmVsZWFzZT48IS0tIHRoaXMgc2hvdWxkIHRha2UgcHJlY2VkZW5jZSBvdmVyIG1hdmVuLmNvbXBpbGVyLnRhcmdldCAtLT4KKyAgICA8bWF2ZW4uY29tcGlsZXIuc291cmNlPjEuMzwvbWF2ZW4uY29tcGlsZXIuc291cmNlPgorICAgIDxtYXZlbi5jb21waWxlci50YXJnZXQ+JHttYXZlbi5jb21waWxlci5zb3VyY2V9PC9tYXZlbi5jb21waWxlci50YXJnZXQ+CisgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1pbmZvLWpkay9wcm9wZXJ0eVJlbGVhc2Uvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL3BsdWdpbi54bWwgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4taW5mby1qZGsvcHJvcGVydHlSZWxlYXNlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNjM2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4taW5mby1qZGsvcHJvcGVydHlSZWxlYXNlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CisKKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cGx1Z2luPgorICA8bmFtZT50YXJnZXQgYnl0ZWNvZGUgZGVmaW5lZCBieSBtYXZlbi5jb21waWxlci5yZWxlYXNlIHByb3BlcnR5PC9uYW1lPgorICA8ZGVzY3JpcHRpb24+PC9kZXNjcmlwdGlvbj4KKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5pdHMucGx1Z2luLWluZm8tamRrPC9ncm91cElkPgorICA8YXJ0aWZhY3RJZD5wcm9wZXJ0eVJlbGVhc2U8L2FydGlmYWN0SWQ+CisgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPGdvYWxQcmVmaXg+cHJvcGVydHk8L2dvYWxQcmVmaXg+CisgIDxpc29sYXRlZFJlYWxtPmZhbHNlPC9pc29sYXRlZFJlYWxtPgorICA8aW5oZXJpdGVkQnlEZWZhdWx0PnRydWU8L2luaGVyaXRlZEJ5RGVmYXVsdD4KKyAgPG1vam9zPgorICAgIDxtb2pvPgorICAgICAgPGdvYWw+dG91Y2g8L2dvYWw+CisgICAgICA8ZGVzY3JpcHRpb24+R29hbCB3aGljaCB0b3VjaGVzIGEgdGltZXN0YW1wIGZpbGUuPC9kZXNjcmlwdGlvbj4KKyAgICAgIDxyZXF1aXJlc0RpcmVjdEludm9jYXRpb24+ZmFsc2U8L3JlcXVpcmVzRGlyZWN0SW52b2NhdGlvbj4KKyAgICAgIDxyZXF1aXJlc1Byb2plY3Q+dHJ1ZTwvcmVxdWlyZXNQcm9qZWN0PgorICAgICAgPHJlcXVpcmVzUmVwb3J0cz5mYWxzZTwvcmVxdWlyZXNSZXBvcnRzPgorICAgICAgPGFnZ3JlZ2F0b3I+ZmFsc2U8L2FnZ3JlZ2F0b3I+CisgICAgICA8cmVxdWlyZXNPbmxpbmU+ZmFsc2U8L3JlcXVpcmVzT25saW5lPgorICAgICAgPGluaGVyaXRlZEJ5RGVmYXVsdD50cnVlPC9pbmhlcml0ZWRCeURlZmF1bHQ+CisgICAgICA8cGhhc2U+cHJvY2Vzcy1zb3VyY2VzPC9waGFzZT4KKyAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuaXNzdWVzLnBsdWdpbi5NeU1vam88L2ltcGxlbWVudGF0aW9uPgorICAgICAgPGxhbmd1YWdlPmphdmE8L2xhbmd1YWdlPgorICAgICAgPGluc3RhbnRpYXRpb25TdHJhdGVneT5wZXItbG9va3VwPC9pbnN0YW50aWF0aW9uU3RyYXRlZ3k+CisgICAgICA8ZXhlY3V0aW9uU3RyYXRlZ3k+b25jZS1wZXItc2Vzc2lvbjwvZXhlY3V0aW9uU3RyYXRlZ3k+CisgICAgICA8dGhyZWFkU2FmZT5mYWxzZTwvdGhyZWFkU2FmZT4KKyAgICAgIDxwYXJhbWV0ZXJzPgorICAgICAgICA8cGFyYW1ldGVyPgorICAgICAgICAgIDxuYW1lPm91dHB1dERpcmVjdG9yeTwvbmFtZT4KKyAgICAgICAgICA8dHlwZT5qYXZhLmlvLkZpbGU8L3R5cGU+CisgICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgorICAgICAgICAgIDxlZGl0YWJsZT50cnVlPC9lZGl0YWJsZT4KKyAgICAgICAgICA8ZGVzY3JpcHRpb24+TG9jYXRpb24gb2YgdGhlIGZpbGUuPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9wYXJhbWV0ZXI+CisgICAgICA8L3BhcmFtZXRlcnM+CisgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgPG91dHB1dERpcmVjdG9yeSBpbXBsZW1lbnRhdGlvbj0iamF2YS5pby5GaWxlIj4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fTwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgIDwvbW9qbz4KKyAgPC9tb2pvcz4KKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHR5cGU+amFyPC90eXBlPgorICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+Cis8L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4taW5mby1qZGsvdmVyaWZ5Lmdyb292eSBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1pbmZvLWpkay92ZXJpZnkuZ3Jvb3Z5CmluZGV4IDJiNDM3MTQuLjk0N2RkZWQgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1pbmZvLWpkay92ZXJpZnkuZ3Jvb3Z5CisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1pbmZvLWpkay92ZXJpZnkuZ3Jvb3Z5CkBAIC0xOCw2ICsxOCw3IEBACiAgKi8KIAogYXNzZXJ0IG5ldyBGaWxlKCBiYXNlZGlyLCAncHJvcGVydHkvdGFyZ2V0L3NpdGUvcGx1Z2luLWluZm8uaHRtbCcgKS50ZXh0LmNvbnRhaW5zKCAnPHRkPjEuMzwvdGQ+JyApCithc3NlcnQgbmV3IEZpbGUoIGJhc2VkaXIsICdwcm9wZXJ0eVJlbGVhc2UvdGFyZ2V0L3NpdGUvcGx1Z2luLWluZm8uaHRtbCcgKS50ZXh0LmNvbnRhaW5zKCAnPHRkPjg8L3RkPicgKQogYXNzZXJ0IG5ldyBGaWxlKCBiYXNlZGlyLCAncGx1Z2luTWFuYWdlbWVudC90YXJnZXQvc2l0ZS9wbHVnaW4taW5mby5odG1sJyApLnRleHQuY29udGFpbnMoICc8dGQ+MS40PC90ZD4nICkKIGFzc2VydCBuZXcgRmlsZSggYmFzZWRpciwgJ3BsdWdpbi90YXJnZXQvc2l0ZS9wbHVnaW4taW5mby5odG1sJyApLnRleHQuY29udGFpbnMoICc8dGQ+MS41PC90ZD4nICkKIGFzc2VydCBuZXcgRmlsZSggYmFzZWRpciwgJ3JlcXVpcmVtZW50L3RhcmdldC9zaXRlL3BsdWdpbi1pbmZvLmh0bWwnICkudGV4dC5jb250YWlucyggJzx0ZD4xLjg8L3RkPicgKQpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLXJlcG9ydC1hbm5vdGF0aW9ucy9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4tcmVwb3J0LWFubm90YXRpb25zL2ludm9rZXIucHJvcGVydGllcwppbmRleCBhYmRkZTBkLi41Y2M1MzZhIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4tcmVwb3J0LWFubm90YXRpb25zL2ludm9rZXIucHJvcGVydGllcworKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4tcmVwb3J0LWFubm90YXRpb25zL2ludm9rZXIucHJvcGVydGllcwpAQCAtMTUsNCArMTUsNCBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1pbnZva2VyLmdvYWxzID0gY2xlYW4gc2l0ZSAtRHNraXBUZXN0cworaW52b2tlci5nb2FscyA9IGNsZWFuIHNpdGUKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1yZXBvcnQtYW5ub3RhdGlvbnMvcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1yZXBvcnQtYW5ub3RhdGlvbnMvcG9tLnhtbAppbmRleCAzMjdiYzEwLi4yOTNhZjAzIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4tcmVwb3J0LWFubm90YXRpb25zL3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLXJlcG9ydC1hbm5vdGF0aW9ucy9wb20ueG1sCkBAIC00MSwyMiArNDEsMzUgQEAKICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgogICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcnRpZmFjdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10b29sczwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPkBwcm9qZWN0LnZlcnNpb25APC92ZXJzaW9uPgotICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVwb3J0aW5nLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjAuMDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5yZXBvcnRpbmc8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXBvcnRpbmctYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My4wPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+QHJlcG9ydGluZ0FwaVZlcnNpb25APC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVwb3J0aW5nLWltcGw8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj5AcmVwb3J0aW5nSW1wbFZlcnNpb25APC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAKQEAgLTEwMCw3ICsxMTMsNyBAQAogICAgICAgPHBsdWdpbj4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+QHByb2plY3RJbmZvUmVwb3J0c1BsdWdpbkA8L3ZlcnNpb24+CiAgICAgICAgIDxyZXBvcnRTZXRzPgogICAgICAgICAgIDxyZXBvcnRTZXQ+CiAgICAgICAgICAgICA8cmVwb3J0cz4KZGlmZiAtLWdpdCBhLy5naXRodWIvd29ya2Zsb3dzL21hdmVuLnltbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1yZXBvcnQtcmVxdWlyZW1lbnRzLWhpc3RvcnkvaW52b2tlci5wcm9wZXJ0aWVzCnNpbWlsYXJpdHkgaW5kZXggNzMlCmNvcHkgZnJvbSAuZ2l0aHViL3dvcmtmbG93cy9tYXZlbi55bWwKY29weSB0byBtYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4tcmVwb3J0LXJlcXVpcmVtZW50cy1oaXN0b3J5L2ludm9rZXIucHJvcGVydGllcwppbmRleCBjMTM2YzRhLi5hM2QzMzVlIDEwMDY0NAotLS0gYS8uZ2l0aHViL3dvcmtmbG93cy9tYXZlbi55bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLXJlcG9ydC1yZXF1aXJlbWVudHMtaGlzdG9yeS9pbnZva2VyLnByb3BlcnRpZXMKQEAgLTUsOSArNSw5IEBACiAjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIworIyAKKyMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KICMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCkBAIC0xNSwxNSArMTUsNCBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1uYW1lOiBKYXZhIENJCi0KLW9uOgotICBwdXNoOgotICAgIGJyYW5jaGVzLWlnbm9yZToKLSAgICAgIC0gZGVwZW5kYWJvdC8qKgotICBwdWxsX3JlcXVlc3Q6Ci0KLWpvYnM6Ci0gIGJ1aWxkOgotICAgIG5hbWU6IFZlcmlmeQotICAgIHVzZXM6IGFwYWNoZS9tYXZlbi1naC1hY3Rpb25zLXNoYXJlZC8uZ2l0aHViL3dvcmtmbG93cy9tYXZlbi12ZXJpZnkueW1sQHYxCitpbnZva2VyLmdvYWxzID0gc2l0ZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLXJlcG9ydC1yZXF1aXJlbWVudHMtaGlzdG9yeS9wb20ueG1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLXJlcG9ydC1yZXF1aXJlbWVudHMtaGlzdG9yeS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYTU3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4tcmVwb3J0LXJlcXVpcmVtZW50cy1oaXN0b3J5L3BvbS54bWwKQEAgLTAsMCArMSwxMDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+CisKKzwhLS0KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKK29yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KK3JlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKK3RvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKK3dpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCitzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCit1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLml0czwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+cGx1Z2luLXJlcG9ydDwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgorCisgIDxuYW1lPk1QTFVHSU4tNDAwPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+CisgICAgVGVzdCBiYXNpYyBzaXRlIGdlbmVyYXRpb24gdG8gZ3VhcmQgYWdhaW5zdCByZWdyZXNzaW9uLgorICA8L2Rlc2NyaXB0aW9uPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICA8L3Byb3BlcnRpZXM+CisKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLXRvb2xzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+QHByb2plY3QudmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisKKyAgPGJ1aWxkPgorICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgPHBsdWdpbnM+CisgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8dmVyc2lvbj4zLjEwLjE8L3ZlcnNpb24+CisgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8cGx1Z2luPgorICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaXRlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8dmVyc2lvbj5Ac2l0ZVBsdWdpblZlcnNpb25APC92ZXJzaW9uPgorICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8dmVyc2lvbj5AcHJvamVjdC52ZXJzaW9uQDwvdmVyc2lvbj4KKyAgICAgICAgPC9wbHVnaW4+CisgICAgICA8L3BsdWdpbnM+CisgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICA8L2J1aWxkPgorCisgIDxyZXBvcnRpbmc+CisgICAgPGV4Y2x1ZGVEZWZhdWx0cz50cnVlPC9leGNsdWRlRGVmYXVsdHM+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPkBwcm9qZWN0LnZlcnNpb25APC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8cmVxdWlyZW1lbnRzSGlzdG9yaWVzPgorICAgICAgICAgICAgPHJlcXVpcmVtZW50c0hpc3Rvcnk+CisgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS45OTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgPG1hdmVuPjMuMi41PC9tYXZlbj4KKyAgICAgICAgICAgICAgPGpkaz4xLjc8L2pkaz4KKyAgICAgICAgICAgIDwvcmVxdWlyZW1lbnRzSGlzdG9yeT4KKyAgICAgICAgICAgIDxyZXF1aXJlbWVudHNIaXN0b3J5PgorICAgICAgICAgICAgICA8dmVyc2lvbj4yLjAuOTk8L3ZlcnNpb24+CisgICAgICAgICAgICAgIDxtYXZlbj4zLjguNjwvbWF2ZW4+CisgICAgICAgICAgICAgIDxqZGs+MS44PC9qZGs+CisgICAgICAgICAgICA8L3JlcXVpcmVtZW50c0hpc3Rvcnk+CisgICAgICAgICAgPC9yZXF1aXJlbWVudHNIaXN0b3JpZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgPC9yZXBvcnRpbmc+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4tcmVwb3J0LXJlcXVpcmVtZW50cy1oaXN0b3J5L3NyYy9tYWluL2phdmEvb3JnL015TW9qby5qYXZhIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLXJlcG9ydC1yZXF1aXJlbWVudHMtaGlzdG9yeS9zcmMvbWFpbi9qYXZhL29yZy9NeU1vam8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmE5NWFiCi0tLSAvZGV2L251bGwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLXJlcG9ydC1yZXF1aXJlbWVudHMtaGlzdG9yeS9zcmMvbWFpbi9qYXZhL29yZy9NeU1vam8uamF2YQpAQCAtMCwwICsxLDY1IEBACitwYWNrYWdlIG9yZzsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUmVzb2x1dGlvblNjb3BlOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5FeGVjdXRlOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5MaWZlY3ljbGVQaGFzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuTW9qbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyOworCisvKioKKyAqIERvZXMgbm90aGluZy4KKyAqCisgKiBAc2luY2UgMS4wCisgKiBAZGVwcmVjYXRlZCBZb3UgZG9uJ3QgdXNlIHRlc3QgZ29hbHMsIGRvIHlvdT8KKyAqLworQE1vam8oIG5hbWUgPSAibm9vcCIsIGRlZmF1bHRQaGFzZSA9IExpZmVjeWNsZVBoYXNlLlBST0NFU1NfU09VUkNFUywKKyAgICAgICByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uID0gUmVzb2x1dGlvblNjb3BlLlRFU1QsCisgICAgICAgcmVxdWlyZXNEaXJlY3RJbnZvY2F0aW9uID0gdHJ1ZSwgcmVxdWlyZXNPbmxpbmUgPSB0cnVlLCBpbmhlcml0QnlEZWZhdWx0ID0gZmFsc2UsIGFnZ3JlZ2F0b3IgPSB0cnVlICkKK0BFeGVjdXRlKCBwaGFzZSA9IExpZmVjeWNsZVBoYXNlLkNPTVBJTEUgKQorcHVibGljIGNsYXNzIE15TW9qbworICAgIGV4dGVuZHMgQWJzdHJhY3RNb2pvCit7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgdGVzdC4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVudXNlZCIgKQorICAgIEBQYXJhbWV0ZXIoIHJlcXVpcmVkID0gdHJ1ZSApCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWlyZWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGEgdGVzdC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxLjEKKyAgICAgKiBAZGVwcmVjYXRlZCBKdXN0IHRlc3RpbmcuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bnVzZWQiICkKKyAgICBAUGFyYW1ldGVyKCBwcm9wZXJ0eSA9ICJzdHJpbmciLCBkZWZhdWx0VmFsdWUgPSAiJHtwcm9qZWN0LnZlcnNpb259LzwvbWFya3VwLW11c3QtYmUtZXNjYXBlZD4iICkKKyAgICBwcml2YXRlIFN0cmluZyBzdHJpbmc7CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKKyAgICB7CisgICAgICAgIC8vIGludGVudGlvbmFsIGRvIG5vdGhpbmcKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1yZXBvcnQtcmVxdWlyZW1lbnRzLWhpc3RvcnkvdmVyaWZ5Lmdyb292eSBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1yZXBvcnQtcmVxdWlyZW1lbnRzLWhpc3RvcnkvdmVyaWZ5Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTczZTVlCi0tLSAvZGV2L251bGwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLXJlcG9ydC1yZXF1aXJlbWVudHMtaGlzdG9yeS92ZXJpZnkuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2Fzc2VydCBuZXcgRmlsZSggYmFzZWRpciwgJ3RhcmdldC9zaXRlL25vb3AtbW9qby5odG1sJyApLmlzRmlsZSgpCisKK2RlZiBwbHVnaW5JbmZvID0gbmV3IEZpbGUoIGJhc2VkaXIsICd0YXJnZXQvc2l0ZS9wbHVnaW4taW5mby5odG1sJyApCithc3NlcnQgcGx1Z2luSW5mby5pc0ZpbGUoKQorCithc3NlcnQgcGx1Z2luSW5mby50ZXh0LmNvbnRhaW5zKCcxLjEuOTknKQorYXNzZXJ0IHBsdWdpbkluZm8udGV4dC5jb250YWlucygnMi4wLjk5JykKK2Fzc2VydCBwbHVnaW5JbmZvLnRleHQuY29udGFpbnMoJzMuMi41JykKK2Fzc2VydCBwbHVnaW5JbmZvLnRleHQuY29udGFpbnMoJzMuOC42JykKK2Fzc2VydCBwbHVnaW5JbmZvLnRleHQuY29udGFpbnMoJzEuNycpCithc3NlcnQgcGx1Z2luSW5mby50ZXh0LmNvbnRhaW5zKCcxLjgnKQpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLXJlcG9ydC9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4tcmVwb3J0L2ludm9rZXIucHJvcGVydGllcwppbmRleCBhYmRkZTBkLi41Y2M1MzZhIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4tcmVwb3J0L2ludm9rZXIucHJvcGVydGllcworKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4tcmVwb3J0L2ludm9rZXIucHJvcGVydGllcwpAQCAtMTUsNCArMTUsNCBAQAogIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAjIHVuZGVyIHRoZSBMaWNlbnNlLgogCi1pbnZva2VyLmdvYWxzID0gY2xlYW4gc2l0ZSAtRHNraXBUZXN0cworaW52b2tlci5nb2FscyA9IGNsZWFuIHNpdGUKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1yZXBvcnQvcG9tLnhtbCBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1yZXBvcnQvcG9tLnhtbAppbmRleCBlNTViNTZlLi4yOTA1NTljIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4tcmVwb3J0L3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLXJlcG9ydC9wb20ueG1sCkBAIC0yNSw3ICsyNSw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MjE8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+MzQ8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uaXRzPC9ncm91cElkPgpAQCAtNDcsMTYgKzQ3LDI5IEBACiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPkBtYXZlblZlcnNpb25APC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnJlcG9ydGluZzwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlcG9ydGluZy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My4wLjA8L3ZlcnNpb24+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJ0aWZhY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj5AbWF2ZW5WZXJzaW9uQDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj5AbWF2ZW5WZXJzaW9uQDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5yZXBvcnRpbmc8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXBvcnRpbmctYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My4wPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+QHJlcG9ydGluZ0FwaVZlcnNpb25APC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVwb3J0aW5nLWltcGw8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj5AcmVwb3J0aW5nSW1wbFZlcnNpb25APC92ZXJzaW9uPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAKQEAgLTgxLDYgKzk0LDkgQEAKICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaXRlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgPHZlcnNpb24+QHNpdGVQbHVnaW5WZXJzaW9uQDwvdmVyc2lvbj4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGxvY2FsZXM+ZW48L2xvY2FsZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KICAgPC9idWlsZD4KQEAgLTkwLDcgKzEwNiw3IEBACiAgICAgICA8cGx1Z2luPgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgorICAgICAgICA8dmVyc2lvbj5AcHJvamVjdEluZm9SZXBvcnRzUGx1Z2luQDwvdmVyc2lvbj4KICAgICAgICAgPHJlcG9ydFNldHM+CiAgICAgICAgICAgPHJlcG9ydFNldD4KICAgICAgICAgICAgIDxyZXBvcnRzPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLXJlcG9ydC92ZXJpZnkuYnNoIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLXJlcG9ydC92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTFhMTBhLi4wMDAwMDAwCi0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3BsdWdpbi1yZXBvcnQvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguKjsKLQotdHJ5Ci17Ci0gICAgRmlsZSBzaXRlRGlyID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvc2l0ZSIgKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDaGVja2luZyBmb3IgZXhpc3RlbmNlIG9mIHNpdGUgZGlyZWN0b3J5OiAiICsgc2l0ZURpciApOwotICAgIGlmICggIXNpdGVEaXIuaXNEaXJlY3RvcnkoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJGQUlMRUQhIiApOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgU3RyaW5nW10gZXhwZWN0ZWRGaWxlcyA9IHsKLSAgICAgICAgIm5vb3AtbW9qby5odG1sIiwKLSAgICAgICAgIm5vb3AtbW9qby5odG1sIiwKLSAgICAgICAgInJlcG9ydC1tb2pvLmh0bWwiLAotICAgIH07Ci0gICAgZm9yICggU3RyaW5nIHBhdGggOiBleHBlY3RlZEZpbGVzICkKLSAgICB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCBzaXRlRGlyLCBwYXRoICk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNoZWNraW5nIGZvciBleGlzdGVuY2Ugb2YgZG9jIGZpbGU6ICIgKyBmaWxlICk7Ci0gICAgICAgIGlmICggIWZpbGUuaXNGaWxlKCkgfHwgZmlsZS5sZW5ndGgoKSA8PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiRkFJTEVEISIgKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KLWNhdGNoKCBUaHJvd2FibGUgdCApCi17Ci0gICAgdC5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLXJlcG9ydC92ZXJpZnkuZ3Jvb3Z5IGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvcGx1Z2luLXJlcG9ydC92ZXJpZnkuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYTQ4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9wbHVnaW4tcmVwb3J0L3ZlcmlmeS5ncm9vdnkKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworYXNzZXJ0IG5ldyBGaWxlKCBiYXNlZGlyLCAndGFyZ2V0L3NpdGUvbm9vcC1tb2pvLmh0bWwnICkuaXNGaWxlKCkKK2Fzc2VydCBuZXcgRmlsZSggYmFzZWRpciwgJ3RhcmdldC9zaXRlL3JlcG9ydC1tb2pvLmh0bWwnICkuaXNGaWxlKCkKKworZGVmIHBsdWdpbkluZm8gPSBuZXcgRmlsZSggYmFzZWRpciwgJ3RhcmdldC9zaXRlL3BsdWdpbi1pbmZvLmh0bWwnICkKK2Fzc2VydCBwbHVnaW5JbmZvLmlzRmlsZSgpCisKK2Fzc2VydCAhcGx1Z2luSW5mby50ZXh0LmNvbnRhaW5zKCdNZW1vcnknKQorYXNzZXJ0ICFwbHVnaW5JbmZvLnRleHQuY29udGFpbnMoJ0Rpc2sgU3BhY2UnKQorYXNzZXJ0ICFwbHVnaW5JbmZvLnRleHQuY29udGFpbnMoJ05vIG1pbmltdW0gcmVxdWlyZW1lbnQuJykKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3NraXAvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvc2tpcC9pbnZva2VyLnByb3BlcnRpZXMKaW5kZXggOGU1MWY3MS4uYjE5MjI3MyAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvc2tpcC9pbnZva2VyLnByb3BlcnRpZXMKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvc2tpcC9pbnZva2VyLnByb3BlcnRpZXMKQEAgLTE1LDUgKzE1LDUgQEAKICMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwogIyB1bmRlciB0aGUgTGljZW5zZS4KIAotaW52b2tlci5nb2FscyA9IGluc3RhbGwgLURza2lwVGVzdHMKLWludm9rZXIubWF2ZW5PcHRzID0gLURtYXZlbi5wbHVnaW4uc2tpcD10cnVlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoraW52b2tlci5nb2FscyA9IGluc3RhbGwKK2ludm9rZXIubWF2ZW5PcHRzID0gLURtYXZlbi5wbHVnaW4uc2tpcD10cnVlCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9zb3VyY2UtZW5jb2RpbmcvbGF0aW4tMS9wb20ueG1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvc291cmNlLWVuY29kaW5nL2xhdGluLTEvcG9tLnhtbAppbmRleCBlMjFkNmNhLi41YzJjZTkyIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9pdC9zb3VyY2UtZW5jb2RpbmcvbGF0aW4tMS9wb20ueG1sCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3NvdXJjZS1lbmNvZGluZy9sYXRpbi0xL3BvbS54bWwKQEAgLTQwLDcgKzQwLDggQEAKICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL2l0L3NvdXJjZS1lbmNvZGluZy91dGYtOC9wb20ueG1sIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvc291cmNlLWVuY29kaW5nL3V0Zi04L3BvbS54bWwKaW5kZXggYThkZGY3Zi4uYTY4ODY0ZiAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvc291cmNlLWVuY29kaW5nL3V0Zi04L3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvaXQvc291cmNlLWVuY29kaW5nL3V0Zi04L3BvbS54bWwKQEAgLTQwLDcgKzQwLDggQEAKICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+QG1hdmVuVmVyc2lvbkA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vQWJzdHJhY3RHZW5lcmF0b3JNb2pvLmphdmEgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vcGx1Z2luL0Fic3RyYWN0R2VuZXJhdG9yTW9qby5qYXZhCmluZGV4IGJkMTM1NGQuLmE2MmQ5MjMgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vQWJzdHJhY3RHZW5lcmF0b3JNb2pvLmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL3BsdWdpbi9BYnN0cmFjdEdlbmVyYXRvck1vam8uamF2YQpAQCAtMTksMzQgKzE5LDE0IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuZmlsdGVyLkFydGlmYWN0RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuZmlsdGVyLkluY2x1ZGVzQXJ0aWZhY3RGaWx0ZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uZGVzY3JpcHRvci5JbnZhbGlkUGx1Z2luRGVzY3JpcHRvckV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5kZXNjcmlwdG9yLlBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyOwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uRGVmYXVsdFBsdWdpblRvb2xzUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5QbHVnaW5Ub29sc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZXh0cmFjdG9yLkV4dHJhY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZ2VuZXJhdG9yLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5nZW5lcmF0b3IuR2VuZXJhdG9yRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmdlbmVyYXRvci5HZW5lcmF0b3JVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5zY2FubmVyLk1vam9TY2FubmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LnJlcG9zaXRvcnkuQ29tcG9uZW50RGVwZW5kZW5jeTsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuUmVhZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuc29uYXR5cGUucGxleHVzLmJ1aWxkLmluY3JlbWVudGFsLkJ1aWxkQ29udGV4dDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKICAqIEFic3RyYWN0IGNsYXNzIGZvciB0aGlzIFBsdWdpbi4KQEAgLTY0LDk5ICs0NCwxOCBAQAogICAgIHByb3RlY3RlZCBNYXZlblByb2plY3QgcHJvamVjdDsKIAogICAgIC8qKgotICAgICAqIFRoZSBjb21wb25lbnQgdXNlZCBmb3Igc2Nhbm5pbmcgdGhlIHNvdXJjZSB0cmVlIGZvciBtb2pvcy4KLSAgICAgKi8KLSAgICBAQ29tcG9uZW50Ci0gICAgcHJvdGVjdGVkIE1vam9TY2FubmVyIG1vam9TY2FubmVyOwotCi0gICAgQENvbXBvbmVudAotICAgIHByb3RlY3RlZCBCdWlsZENvbnRleHQgYnVpbGRDb250ZXh0OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbGUgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcy4KLSAgICAgKgotICAgICAqIEBzaW5jZSAyLjUKLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyKCBwcm9wZXJ0eSA9ICJlbmNvZGluZyIsIGRlZmF1bHRWYWx1ZSA9ICIke3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmd9IiApCi0gICAgcHJvdGVjdGVkIFN0cmluZyBlbmNvZGluZzsKLQotICAgIC8qKgogICAgICAqIFRoZSBnb2FsIHByZWZpeCB0aGF0IHdpbGwgYXBwZWFyIGJlZm9yZSB0aGUgIjoiLgogICAgICAqLwogICAgIEBQYXJhbWV0ZXIKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdvYWxQcmVmaXg7CiAKICAgICAvKioKLSAgICAgKiBCeSBkZWZhdWx0IGFuIGV4Y2VwdGlvbiBpcyB0aHJvdyBpZiBubyBtb2pvIGRlc2NyaXB0b3IgaXMgZm91bmQuIEFzIHRoZSBtYXZlbi1wbHVnaW4gaXMgZGVmaW5lZCBpbiBjb3JlLCB0aGUKLSAgICAgKiBkZXNjcmlwdG9yIGdlbmVyYXRvciBtb2pvIGlzIGJvdW5kIHRvIGdlbmVyYXRlLXJlc291cmNlcyBwaGFzZS4KLSAgICAgKiBCdXQgZm9yIGFubm90YXRpb25zLCB0aGUgY29tcGlsZWQgY2xhc3NlcyBhcmUgbmVlZGVkLCBzbyBza2lwIGVycm9yCi0gICAgICoKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgQFBhcmFtZXRlciggcHJvcGVydHkgPSAibWF2ZW4ucGx1Z2luLnNraXBFcnJvck5vRGVzY3JpcHRvcnNGb3VuZCIsIGRlZmF1bHRWYWx1ZSA9ICJmYWxzZSIgKQotICAgIHByb3RlY3RlZCBib29sZWFuIHNraXBFcnJvck5vRGVzY3JpcHRvcnNGb3VuZDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFRoZSByb2xlIG5hbWVzIG9mIG1vam8gZXh0cmFjdG9ycyB0byB1c2UuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIElmIG5vdCBzZXQsIGFsbCBtb2pvIGV4dHJhY3RvcnMgd2lsbCBiZSB1c2VkLiBJZiBzZXQgdG8gYW4gZW1wdHkgZXh0cmFjdG9yIG5hbWUsIG5vIG1vam8gZXh0cmFjdG9ycwotICAgICAqIHdpbGwgYmUgdXNlZC4KLSAgICAgKiA8L3A+Ci0gICAgICogRXhhbXBsZToKLSAgICAgKiA8cHJlPgotICAgICAqICAmbHQ7IS0tIFVzZSBhbGwgbW9qbyBleHRyYWN0b3JzIC0tJmd0OwotICAgICAqICAmbHQ7ZXh0cmFjdG9ycy8mZ3Q7Ci0gICAgICoKLSAgICAgKiAgJmx0OyEtLSBVc2Ugbm8gbW9qbyBleHRyYWN0b3JzIC0tJmd0OwotICAgICAqICAmbHQ7ZXh0cmFjdG9ycyZndDsKLSAgICAgKiAgICAgICZsdDtleHRyYWN0b3IvJmd0OwotICAgICAqICAmbHQ7L2V4dHJhY3RvcnMmZ3Q7Ci0gICAgICoKLSAgICAgKiAgJmx0OyEtLSBVc2Ugb25seSBic2ggbW9qbyBleHRyYWN0b3IgLS0mZ3Q7Ci0gICAgICogICZsdDtleHRyYWN0b3JzJmd0OwotICAgICAqICAgICAgJmx0O2V4dHJhY3RvciZndDtic2gmbHQ7L2V4dHJhY3RvciZndDsKLSAgICAgKiAgJmx0Oy9leHRyYWN0b3JzJmd0OwotICAgICAqIDwvcHJlPgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIKLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gZXh0cmFjdG9yczsKLQotICAgIC8qKgogICAgICAqIFNldCB0aGlzIHRvICJ0cnVlIiB0byBza2lwIGludm9raW5nIGFueSBnb2FscyBvciByZXBvcnRzIG9mIHRoZSBwbHVnaW4uCiAgICAgICoKICAgICAgKiBAc2luY2UgMi44CiAgICAgICovCiAgICAgQFBhcmFtZXRlciggZGVmYXVsdFZhbHVlID0gImZhbHNlIiwgcHJvcGVydHkgPSAibWF2ZW4ucGx1Z2luLnNraXAiICkKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBza2lwOwotCi0gICAgLyoqCi0gICAgICogU3BlY2lmeSB0aGUgZGVwZW5kZW5jaWVzIGFzIHtAY29kZSBncm91cElkOmFydGlmYWN0SWR9IGNvbnRhaW5pbmcgKGFic3RyYWN0KSBNb2pvcywgdG8gZmlsdGVyCi0gICAgICogZGVwZW5kZW5jaWVzIHNjYW5uZWQgYXQgcnVudGltZSBhbmQgZm9jdXMgb24gZGVwZW5kZW5jaWVzIHRoYXQgYXJlIHJlYWxseSB1c2VmdWwgdG8gTW9qbyBhbmFseXNpcy4KLSAgICAgKiBCeSBkZWZhdWx0LCB0aGUgdmFsdWUgaXMge0Bjb2RlIG51bGx9IGFuZCBhbGwgZGVwZW5kZW5jaWVzIGFyZSBzY2FubmVkIChhcyBiZWZvcmUgdGhpcyBwYXJhbWV0ZXIgd2FzIGFkZGVkKS4KLSAgICAgKiBJZiBzcGVjaWZpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gd2l0aCBubyBjaGlsZHJlbiwgbm8gZGVwZW5kZW5jaWVzIGFyZSBzY2FubmVkLgotICAgICAqIAotICAgICAqIEBzaW5jZSAzLjUKLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbW9qb0RlcGVuZGVuY2llcyA9IG51bGw7Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IG9mIFJlbW90ZSBSZXBvc2l0b3JpZXMgdXNlZCBieSB0aGUgcmVzb2x2ZXIKLSAgICAgKgotICAgICAqIEBzaW5jZSAzLjAKLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyKCBkZWZhdWx0VmFsdWUgPSAiJHtwcm9qZWN0LnJlbW90ZUFydGlmYWN0UmVwb3NpdG9yaWVzfSIsIHJlcXVpcmVkID0gdHJ1ZSwgcmVhZG9ubHkgPSB0cnVlICkKLSAgICBwcm90ZWN0ZWQgTGlzdDxBcnRpZmFjdFJlcG9zaXRvcnk+IHJlbW90ZVJlcG9zOwotCi0gICAgLyoqCi0gICAgICogTG9jYXRpb24gb2YgdGhlIGxvY2FsIHJlcG9zaXRvcnkuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMy4wCi0gICAgICovCi0gICAgQFBhcmFtZXRlciggZGVmYXVsdFZhbHVlID0gIiR7bG9jYWxSZXBvc2l0b3J5fSIsIHJlcXVpcmVkID0gdHJ1ZSwgcmVhZG9ubHkgPSB0cnVlICkKLSAgICBwcm90ZWN0ZWQgQXJ0aWZhY3RSZXBvc2l0b3J5IGxvY2FsOworICAgIHByaXZhdGUgYm9vbGVhbiBza2lwOwogCiAgICAgLyoqCiAgICAgICogTWF2ZW4gcGx1Z2luIHBhY2thZ2luZyB0eXBlcy4gRGVmYXVsdCBpcyBzaW5nbGUgIm1hdmVuLXBsdWdpbiIuCkBAIC0xNjQsNTUgKzYzLDE1IEBACiAgICAgICogQHNpbmNlIDMuMwogICAgICAqLwogICAgIEBQYXJhbWV0ZXIKLSAgICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IHBhY2thZ2luZ1R5cGVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggIm1hdmVuLXBsdWdpbiIgKTsKLQotICAgIC8qKgotICAgICAqIEZsYWcgY29udHJvbGxpbmcgaXMgImV4cGVjdGVkIGRlcGVuZGVuY2llcyBpbiBwcm92aWRlZCBzY29wZSIgY2hlY2sgdG8gYmUgcGVyZm9ybWVkIG9yIG5vdC4gRGVmYXVsdCB2YWx1ZToKLSAgICAgKiB7QGNvZGUgdHJ1ZX0uCi0gICAgICoKLSAgICAgKiBAc2luY2UgMy42LjMKLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyKCBkZWZhdWx0VmFsdWUgPSAidHJ1ZSIsIHByb3BlcnR5ID0gIm1hdmVuLnBsdWdpbi5jaGVja0V4cGVjdGVkUHJvdmlkZWRTY29wZSIgKQotICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0V4cGVjdGVkUHJvdmlkZWRTY29wZSA9IHRydWU7Ci0KLSAgICAvKioKLSAgICAgKiBMaXN0IG9mIHtAY29kZSBncm91cElkfSBzdHJpbmdzIG9mIGFydGlmYWN0IGNvb3JkaW5hdGVzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGJlIGluICJwcm92aWRlZCIgc2NvcGUuIERlZmF1bHQKLSAgICAgKiB2YWx1ZToge0Bjb2RlIFsib3JnLmFwYWNoZS5tYXZlbiJdfS4KLSAgICAgKgotICAgICAqIEBzaW5jZSAzLjYuMwotICAgICAqLwotICAgIEBQYXJhbWV0ZXIKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBleHBlY3RlZFByb3ZpZGVkU2NvcGVHcm91cElkcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoICJvcmcuYXBhY2hlLm1hdmVuIiApOwotCi0gICAgLyoqCi0gICAgICogTGlzdCBvZiB7QGNvZGUgZ3JvdXBJZDphcnRpZmFjdElkfSBzdHJpbmdzIG9mIGFydGlmYWN0IGNvb3JkaW5hdGVzIHRoYXQgYXJlIHRvIGJlIGV4Y2x1ZGVkIGZyb20gImV4cGVjdGVkCi0gICAgICogcHJvdmlkZWQgc2NvcGUiIGNoZWNrLiBEZWZhdWx0IHZhbHVlOiB7QGNvZGUgWyJvcmcuYXBhY2hlLm1hdmVuOm1hdmVuLWFyY2hpdmVyIiwgIm9yZy5hcGFjaGUubWF2ZW46bWF2ZW4tanhyIl19LgotICAgICAqCi0gICAgICogQHNpbmNlIDMuNi4zCi0gICAgICovCi0gICAgQFBhcmFtZXRlcgotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGV4cGVjdGVkUHJvdmlkZWRTY29wZUV4Y2x1c2lvbnMgPSBBcnJheXMuYXNMaXN0KAotICAgICAgICAgICAgIm9yZy5hcGFjaGUubWF2ZW46bWF2ZW4tYXJjaGl2ZXIiLAotICAgICAgICAgICAgIm9yZy5hcGFjaGUubWF2ZW46bWF2ZW4tanhyIiApOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgb3V0cHV0IGRpcmVjdG9yeSB3aGVyZSBmaWxlcyB3aWxsIGJlIGdlbmVyYXRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmlsZSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHdhbnRlZCA8Y29kZT5HZW5lcmF0b3I8L2NvZGU+IGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBHZW5lcmF0b3IgY3JlYXRlR2VuZXJhdG9yKCk7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGFja2FnaW5nVHlwZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCAibWF2ZW4tcGx1Z2luIiApOwogCiAgICAgLyoqCiAgICAgICogU3lzdGVtL09TIGxpbmUgc2VwYXJhdG9yOiB1c2VkIHRvIGZvcm1hdCBjb25zb2xlIG1lc3NhZ2VzLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMUyA9IFN5c3RlbS5saW5lU2VwYXJhdG9yKCk7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFMgPSBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOwogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGdlbmVyYXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb247CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKICAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KQEAgLTIyMiw2ICs4MSw3IEBACiAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCAiVW5zdXBwb3J0ZWQgcGFja2FnaW5nIHR5cGUgIiArIHByb2plY3QuZ2V0UGFja2FnaW5nKCkgKyAiLCBleGVjdXRpb24gc2tpcHBlZCIgKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorCiAgICAgICAgIGlmICggc2tpcCApCiAgICAgICAgIHsKICAgICAgICAgICAgIGdldExvZygpLndhcm4oICJFeGVjdXRpb24gc2tpcHBlZCIgKTsKQEAgLTIzMCw3ICs5MCw3IEBACiAKICAgICAgICAgaWYgKCAhIm1hdmVuLXBsdWdpbiIuZXF1YWxzSWdub3JlQ2FzZSggcHJvamVjdC5nZXRBcnRpZmFjdElkKCkgKQogICAgICAgICAgICAgJiYgcHJvamVjdC5nZXRBcnRpZmFjdElkKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCAibWF2ZW4tIiApCi0gICAgICAgICAgICAmJiBwcm9qZWN0LmdldEFydGlmYWN0SWQoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCAiLXBsdWdpbiIgKSAKKyAgICAgICAgICAgICYmIHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoICItcGx1Z2luIiApCiAgICAgICAgICAgICAmJiAhIm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucyIuZXF1YWxzKCBwcm9qZWN0LmdldEdyb3VwSWQoKSApICkKICAgICAgICAgewogICAgICAgICAgICAgZ2V0TG9nKCkuZXJyb3IoIExTICsgTFMgKyAiQXJ0aWZhY3QgSWRzIG9mIHRoZSBmb3JtYXQgbWF2ZW4tX19fLXBsdWdpbiBhcmUgcmVzZXJ2ZWQgZm9yIiArIExTCkBAIC0yMzksMjkgKzk5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiSW4gdGhlIGZ1dHVyZSB0aGlzIGVycm9yIHdpbGwgYnJlYWsgdGhlIGJ1aWxkLiIgKyBMUyArIExTICk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIGNoZWNrRXhwZWN0ZWRQcm92aWRlZFNjb3BlICkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0PEFydGlmYWN0PiB3cm9uZ1Njb3BlZEFydGlmYWN0cyA9IGRlcGVuZGVuY2llc05vdEluUHJvdmlkZWRTY29wZSgpOwotICAgICAgICAgICAgaWYgKCAhd3JvbmdTY29wZWRBcnRpZmFjdHMuaXNFbXB0eSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGVycm9yTWVzc2FnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgTFMgKyBMUyArICJTb21lIGRlcGVuZGVuY2llcyBvZiBNYXZlbiBQbHVnaW5zIGFyZSBleHBlY3RlZCB0byBiZSBpbiBwcm92aWRlZCBzY29wZS4iICsgTFMKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlBsZWFzZSBtYWtlIHN1cmUgdGhhdCBkZXBlbmRlbmNpZXMgbGlzdGVkIGJlbG93IGRlY2xhcmVkIGluIFBPTSIgKyBMUwotICAgICAgICAgICAgICAgICAgICAgICAgKyAiaGF2ZSBzZXQgJzxzY29wZT5wcm92aWRlZDwvc2NvcGU+JyBhcyB3ZWxsLiIgKyBMUyArIExTCi0gICAgICAgICAgICAgICAgICAgICAgICArICJUaGUgZm9sbG93aW5nIGRlcGVuZGVuY2llcyBhcmUgaW4gd3Jvbmcgc2NvcGU6IiArIExTCi0gICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICBmb3IgKCBBcnRpZmFjdCBhcnRpZmFjdCA6IHdyb25nU2NvcGVkQXJ0aWZhY3RzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZS5hcHBlbmQoICIgKiAiICkuYXBwZW5kKCBhcnRpZmFjdCApLmFwcGVuZCggTFMgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlLmFwcGVuZCggTFMgKS5hcHBlbmQoIExTICk7Ci0KLSAgICAgICAgICAgICAgICBnZXRMb2coKS5lcnJvciggZXJyb3JNZXNzYWdlLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIFN0cmluZyBkZWZhdWx0R29hbFByZWZpeCA9IGdldERlZmF1bHRHb2FsUHJlZml4KCBwcm9qZWN0ICk7Ci0gICAgICAgICAgCisKICAgICAgICAgaWYgKCBnb2FsUHJlZml4ID09IG51bGwgKQogICAgICAgICB7CiAgICAgICAgICAgICBnb2FsUHJlZml4ID0gZGVmYXVsdEdvYWxQcmVmaXg7CkBAIC0yNzMsNjcgKzExMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICsgZGVmYXVsdEdvYWxQcmVmaXggKyAiJy4iICsgTFMgKTsKICAgICAgICAgfQogCi0gICAgICAgIG1vam9TY2FubmVyLnNldEFjdGl2ZUV4dHJhY3RvcnMoIGV4dHJhY3RvcnMgKTsKLQotICAgICAgICAvLyBUT0RPOiBjb3VsZCB1c2UgdGhpcyBtb3JlLCBlZyBpbiB0aGUgd3JpdGluZyBvZiB0aGUgcGx1Z2luIGRlc2NyaXB0b3IhCi0gICAgICAgIFBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9IG5ldyBQbHVnaW5EZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgcGx1Z2luRGVzY3JpcHRvci5zZXRHcm91cElkKCBwcm9qZWN0LmdldEdyb3VwSWQoKSApOwotCi0gICAgICAgIHBsdWdpbkRlc2NyaXB0b3Iuc2V0QXJ0aWZhY3RJZCggcHJvamVjdC5nZXRBcnRpZmFjdElkKCkgKTsKLQotICAgICAgICBwbHVnaW5EZXNjcmlwdG9yLnNldFZlcnNpb24oIHByb2plY3QuZ2V0VmVyc2lvbigpICk7Ci0KLSAgICAgICAgcGx1Z2luRGVzY3JpcHRvci5zZXRHb2FsUHJlZml4KCBnb2FsUHJlZml4ICk7Ci0KLSAgICAgICAgcGx1Z2luRGVzY3JpcHRvci5zZXROYW1lKCBwcm9qZWN0LmdldE5hbWUoKSApOwotCi0gICAgICAgIHBsdWdpbkRlc2NyaXB0b3Iuc2V0RGVzY3JpcHRpb24oIHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKSApOwotCi0gICAgICAgIGlmICggZW5jb2RpbmcgPT0gbnVsbCB8fCBlbmNvZGluZy5sZW5ndGgoKSA8IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRMb2coKS53YXJuKCAiVXNpbmcgcGxhdGZvcm0gZW5jb2RpbmcgKCIgKyBSZWFkZXJGYWN0b3J5LkZJTEVfRU5DT0RJTkcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYWN0dWFsbHkpIHRvIHJlYWQgbW9qbyBzb3VyY2UgZmlsZXMsIGkuZS4gYnVpbGQgaXMgcGxhdGZvcm0gZGVwZW5kZW50ISIgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oICJVc2luZyAnIiArIGVuY29kaW5nICsgIicgZW5jb2RpbmcgdG8gcmVhZCBtb2pvIHNvdXJjZSBmaWxlcy4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxDb21wb25lbnREZXBlbmRlbmN5PiBkZXBzID0gR2VuZXJhdG9yVXRpbHMudG9Db21wb25lbnREZXBlbmRlbmNpZXMoIHByb2plY3QuZ2V0QXJ0aWZhY3RzKCkgKTsKLSAgICAgICAgICAgIHBsdWdpbkRlc2NyaXB0b3Iuc2V0RGVwZW5kZW5jaWVzKCBkZXBzICk7Ci0KLSAgICAgICAgICAgIFBsdWdpblRvb2xzUmVxdWVzdCByZXF1ZXN0ID0gbmV3IERlZmF1bHRQbHVnaW5Ub29sc1JlcXVlc3QoIHByb2plY3QsIHBsdWdpbkRlc2NyaXB0b3IgKTsKLSAgICAgICAgICAgIHJlcXVlc3Quc2V0RW5jb2RpbmcoIGVuY29kaW5nICk7Ci0gICAgICAgICAgICByZXF1ZXN0LnNldFNraXBFcnJvck5vRGVzY3JpcHRvcnNGb3VuZCggc2tpcEVycm9yTm9EZXNjcmlwdG9yc0ZvdW5kICk7Ci0gICAgICAgICAgICByZXF1ZXN0LnNldERlcGVuZGVuY2llcyggZmlsdGVyTW9qb0RlcGVuZGVuY2llcygpICk7Ci0gICAgICAgICAgICByZXF1ZXN0LnNldExvY2FsKCB0aGlzLmxvY2FsICk7Ci0gICAgICAgICAgICByZXF1ZXN0LnNldFJlbW90ZVJlcG9zKCB0aGlzLnJlbW90ZVJlcG9zICk7Ci0KLSAgICAgICAgICAgIG1vam9TY2FubmVyLnBvcHVsYXRlUGx1Z2luRGVzY3JpcHRvciggcmVxdWVzdCApOwotCi0gICAgICAgICAgICBGaWxlIG91dHB1dERpcmVjdG9yeSA9IGdldE91dHB1dERpcmVjdG9yeSgpOwotICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5Lm1rZGlycygpOwotCi0gICAgICAgICAgICBjcmVhdGVHZW5lcmF0b3IoKS5leGVjdXRlKCBvdXRwdXREaXJlY3RvcnksIHJlcXVlc3QgKTsKLSAgICAgICAgICAgIGJ1aWxkQ29udGV4dC5yZWZyZXNoKCBvdXRwdXREaXJlY3RvcnkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIEdlbmVyYXRvckV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJFcnJvciB3cml0aW5nIHBsdWdpbiBkZXNjcmlwdG9yIiwgZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSW52YWxpZFBsdWdpbkRlc2NyaXB0b3JFeGNlcHRpb24gfCBFeHRyYWN0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIkVycm9yIGV4dHJhY3RpbmcgcGx1Z2luIGRlc2NyaXB0b3I6ICciICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgKyAiJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggTGlua2FnZUVycm9yIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIlRoZSBBUEkgb2YgdGhlIG1vam8gc2Nhbm5lciBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgcGx1Z2luIHZlcnNpb24uIgotICAgICAgICAgICAgICAgICsgIiBQbGVhc2UgY2hlY2sgdGhlIHBsdWdpbiBkZXBlbmRlbmNpZXMgY29uZmlndXJlZCBpbiB0aGUgUE9NIGFuZCBlbnN1cmUgdGhlIHZlcnNpb25zIG1hdGNoLiIsIGUgKTsKLSAgICAgICAgfQorICAgICAgICBnZW5lcmF0ZSgpOwogICAgIH0KIAogICAgIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEdvYWxQcmVmaXgoIE1hdmVuUHJvamVjdCBwcm9qZWN0ICkKQEAgLTM0OSw2MSArMTI4LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZGVmYXVsdEdvYWxQcmVmaXg7CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogQ29sbGVjdHMgYWxsIGRlcGVuZGVuY2llcyBleHBlY3RlZCB0byBiZSBpbiAicHJvdmlkZWQiIHNjb3BlIGJ1dCBhcmUgTk9UIGluICJwcm92aWRlZCIgc2NvcGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBTZXQ8QXJ0aWZhY3Q+IGRlcGVuZGVuY2llc05vdEluUHJvdmlkZWRTY29wZSgpCi0gICAgewotICAgICAgICBMaW5rZWRIYXNoU2V0PEFydGlmYWN0PiB3cm9uZ1Njb3BlZERlcGVuZGVuY2llcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKLQotICAgICAgICBmb3IgKCBBcnRpZmFjdCBkZXBlbmRlbmN5IDogcHJvamVjdC5nZXRBcnRpZmFjdHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBnYSA9IGRlcGVuZGVuY3kuZ2V0R3JvdXBJZCgpICsgIjoiICsgZGVwZW5kZW5jeS5nZXRBcnRpZmFjdElkKCk7Ci0gICAgICAgICAgICBpZiAoIGV4cGVjdGVkUHJvdmlkZWRTY29wZUdyb3VwSWRzLmNvbnRhaW5zKCBkZXBlbmRlbmN5LmdldEdyb3VwSWQoKSApCi0gICAgICAgICAgICAgICAgJiYgIWV4cGVjdGVkUHJvdmlkZWRTY29wZUV4Y2x1c2lvbnMuY29udGFpbnMoIGdhICkKLSAgICAgICAgICAgICAgICAmJiAhQXJ0aWZhY3QuU0NPUEVfUFJPVklERUQuZXF1YWxzKCBkZXBlbmRlbmN5LmdldFNjb3BlKCkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JvbmdTY29wZWREZXBlbmRlbmNpZXMuYWRkKCBkZXBlbmRlbmN5ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd3JvbmdTY29wZWREZXBlbmRlbmNpZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGRlcGVuZGVuY2llcyBmaWx0ZXJlZCB3aXRoIG1vam9EZXBlbmRlbmNpZXMgY29uZmlndXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGV2ZW50dWFsbHkgZmlsdGVyZWQgZGVwZW5kZW5jaWVzLCBvciBldmVuIDxjb2RlPm51bGw8L2NvZGU+IGlmIGNvbmZpZ3VyZWQgd2l0aCBlbXB0eSBtb2pvRGVwZW5kZW5jaWVzCi0gICAgICogbGlzdAotICAgICAqIEBzZWUgI21vam9EZXBlbmRlbmNpZXMKLSAgICAgKi8KLSAgICBwcml2YXRlIFNldDxBcnRpZmFjdD4gZmlsdGVyTW9qb0RlcGVuZGVuY2llcygpCi0gICAgewotICAgICAgICBTZXQ8QXJ0aWZhY3Q+IGZpbHRlcmVkQXJ0aWZhY3RzOwotICAgICAgICBpZiAoIG1vam9EZXBlbmRlbmNpZXMgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbHRlcmVkQXJ0aWZhY3RzID0gbmV3IExpbmtlZEhhc2hTZXQ8PiggcHJvamVjdC5nZXRBcnRpZmFjdHMoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBtb2pvRGVwZW5kZW5jaWVzLnNpemUoKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsdGVyZWRBcnRpZmFjdHMgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZmlsdGVyZWRBcnRpZmFjdHMgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFydGlmYWN0RmlsdGVyIGZpbHRlciA9IG5ldyBJbmNsdWRlc0FydGlmYWN0RmlsdGVyKCBtb2pvRGVwZW5kZW5jaWVzICk7Ci0KLSAgICAgICAgICAgIGZvciAoIEFydGlmYWN0IGFydGlmYWN0IDogcHJvamVjdC5nZXRBcnRpZmFjdHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBmaWx0ZXIuaW5jbHVkZSggYXJ0aWZhY3QgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEFydGlmYWN0cy5hZGQoIGFydGlmYWN0ICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZpbHRlcmVkQXJ0aWZhY3RzOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vRGVzY3JpcHRvckdlbmVyYXRvck1vam8uamF2YSBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vRGVzY3JpcHRvckdlbmVyYXRvck1vam8uamF2YQppbmRleCA5ODI3YTc3Li4xYTZmMzI5IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vcGx1Z2luL0Rlc2NyaXB0b3JHZW5lcmF0b3JNb2pvLmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL3BsdWdpbi9EZXNjcmlwdG9yR2VuZXJhdG9yTW9qby5qYXZhCkBAIC0yMCwxMyArMjAsMzQgQEAKICAqLwogCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5maWx0ZXIuQXJ0aWZhY3RGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5maWx0ZXIuSW5jbHVkZXNBcnRpZmFjdEZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmRlc2NyaXB0b3IuSW52YWxpZFBsdWdpbkRlc2NyaXB0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uZGVzY3JpcHRvci5QbHVnaW5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLkxpZmVjeWNsZVBoYXNlOwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Nb2pvOwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLlJlc29sdXRpb25TY29wZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5nZW5lcmF0b3IuR2VuZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLkRlZmF1bHRQbHVnaW5Ub29sc1JlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uUGx1Z2luVG9vbHNSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmV4dHJhY3Rvci5FeHRyYWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmdlbmVyYXRvci5HZW5lcmF0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZ2VuZXJhdG9yLkdlbmVyYXRvclV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmdlbmVyYXRvci5QbHVnaW5EZXNjcmlwdG9yR2VuZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLnNjYW5uZXIuTW9qb1NjYW5uZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQucmVwb3NpdG9yeS5Db21wb25lbnREZXBlbmRlbmN5OworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5SZWFkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5zb25hdHlwZS5wbGV4dXMuYnVpbGQuaW5jcmVtZW50YWwuQnVpbGRDb250ZXh0OwogCiAvKioKICAqIDxwPgpAQCAtNTEsNyArNzIsMTUgQEAKICAgICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBnZW5lcmF0ZWQgPGNvZGU+cGx1Z2luLnhtbDwvY29kZT4gZmlsZSB3aWxsIGJlIHB1dC4KICAgICAgKi8KICAgICBAUGFyYW1ldGVyKCBkZWZhdWx0VmFsdWUgPSAiJHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX0vTUVUQS1JTkYvbWF2ZW4iLCByZWFkb25seSA9IHRydWUgKQotICAgIHByb3RlY3RlZCBGaWxlIG91dHB1dERpcmVjdG9yeTsKKyAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OworCisgICAgLyoqCisgICAgICogVGhlIGZpbGUgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjUKKyAgICAgKi8KKyAgICBAUGFyYW1ldGVyKCBwcm9wZXJ0eSA9ICJlbmNvZGluZyIsIGRlZmF1bHRWYWx1ZSA9ICIke3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmd9IiApCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2Rpbmc7CiAKICAgICAvKioKICAgICAgKiBBIGZsYWcgdG8gZGlzYWJsZSBnZW5lcmF0aW9uIG9mIHRoZSA8Y29kZT5wbHVnaW4ueG1sPC9jb2RlPiBpbiBmYXZvciBvZiBhIGhhbmQgYXV0aG9yZWQgcGx1Z2luIGRlc2NyaXB0b3IuCkBAIC02MiwzNiArOTEsMjU5IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIHNraXBEZXNjcmlwdG9yOwogCiAgICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIDxwPgorICAgICAqIFRoZSByb2xlIG5hbWVzIG9mIG1vam8gZXh0cmFjdG9ycyB0byB1c2UuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIElmIG5vdCBzZXQsIGFsbCBtb2pvIGV4dHJhY3RvcnMgd2lsbCBiZSB1c2VkLiBJZiBzZXQgdG8gYW4gZW1wdHkgZXh0cmFjdG9yIG5hbWUsIG5vIG1vam8gZXh0cmFjdG9ycworICAgICAqIHdpbGwgYmUgdXNlZC4KKyAgICAgKiA8L3A+CisgICAgICogRXhhbXBsZToKKyAgICAgKiA8cHJlPgorICAgICAqICAmbHQ7IS0tIFVzZSBhbGwgbW9qbyBleHRyYWN0b3JzIC0tJmd0OworICAgICAqICAmbHQ7ZXh0cmFjdG9ycy8mZ3Q7CisgICAgICoKKyAgICAgKiAgJmx0OyEtLSBVc2Ugbm8gbW9qbyBleHRyYWN0b3JzIC0tJmd0OworICAgICAqICAmbHQ7ZXh0cmFjdG9ycyZndDsKKyAgICAgKiAgICAgICZsdDtleHRyYWN0b3IvJmd0OworICAgICAqICAmbHQ7L2V4dHJhY3RvcnMmZ3Q7CisgICAgICoKKyAgICAgKiAgJmx0OyEtLSBVc2Ugb25seSBic2ggbW9qbyBleHRyYWN0b3IgLS0mZ3Q7CisgICAgICogICZsdDtleHRyYWN0b3JzJmd0OworICAgICAqICAgICAgJmx0O2V4dHJhY3RvciZndDtic2gmbHQ7L2V4dHJhY3RvciZndDsKKyAgICAgKiAgJmx0Oy9leHRyYWN0b3JzJmd0OworICAgICAqIDwvcHJlPgogICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBGaWxlIGdldE91dHB1dERpcmVjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5OwotICAgIH0KKyAgICBAUGFyYW1ldGVyCisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBleHRyYWN0b3JzOworCiAKICAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogQnkgZGVmYXVsdCwgYW4gZXhjZXB0aW9uIGlzIHRocm93IGlmIG5vIG1vam8gZGVzY3JpcHRvciBpcyBmb3VuZC4gQXMgdGhlIG1hdmVuLXBsdWdpbiBpcyBkZWZpbmVkIGluIGNvcmUsIHRoZQorICAgICAqIGRlc2NyaXB0b3IgZ2VuZXJhdG9yIG1vam8gaXMgYm91bmQgdG8gZ2VuZXJhdGUtcmVzb3VyY2VzIHBoYXNlLgorICAgICAqIEJ1dCBmb3IgYW5ub3RhdGlvbnMsIHRoZSBjb21waWxlZCBjbGFzc2VzIGFyZSBuZWVkZWQsIHNvIHNraXAgZXJyb3IKKyAgICAgKgorICAgICAqIEBzaW5jZSAzLjAKICAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgR2VuZXJhdG9yIGNyZWF0ZUdlbmVyYXRvcigpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFBsdWdpbkRlc2NyaXB0b3JHZW5lcmF0b3IoIGdldExvZygpICk7Ci0gICAgfQorICAgIEBQYXJhbWV0ZXIoIHByb3BlcnR5ID0gIm1hdmVuLnBsdWdpbi5za2lwRXJyb3JOb0Rlc2NyaXB0b3JzRm91bmQiLCBkZWZhdWx0VmFsdWUgPSAiZmFsc2UiICkKKyAgICBwcml2YXRlIGJvb2xlYW4gc2tpcEVycm9yTm9EZXNjcmlwdG9yc0ZvdW5kOwogCiAgICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIEZsYWcgY29udHJvbGxpbmcgaXMgImV4cGVjdGVkIGRlcGVuZGVuY2llcyBpbiBwcm92aWRlZCBzY29wZSIgY2hlY2sgdG8gYmUgcGVyZm9ybWVkIG9yIG5vdC4gRGVmYXVsdCB2YWx1ZToKKyAgICAgKiB7QGNvZGUgdHJ1ZX0uCisgICAgICoKKyAgICAgKiBAc2luY2UgMy42LjMKICAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKKyAgICBAUGFyYW1ldGVyKCBkZWZhdWx0VmFsdWUgPSAidHJ1ZSIsIHByb3BlcnR5ID0gIm1hdmVuLnBsdWdpbi5jaGVja0V4cGVjdGVkUHJvdmlkZWRTY29wZSIgKQorICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0V4cGVjdGVkUHJvdmlkZWRTY29wZSA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIHtAY29kZSBncm91cElkfSBzdHJpbmdzIG9mIGFydGlmYWN0IGNvb3JkaW5hdGVzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGJlIGluICJwcm92aWRlZCIgc2NvcGUuIERlZmF1bHQKKyAgICAgKiB2YWx1ZToge0Bjb2RlIFsib3JnLmFwYWNoZS5tYXZlbiJdfS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAzLjYuMworICAgICAqLworICAgIEBQYXJhbWV0ZXIKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBleHBlY3RlZFByb3ZpZGVkU2NvcGVHcm91cElkcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoICJvcmcuYXBhY2hlLm1hdmVuIiApOworCisgICAgLyoqCisgICAgICogTGlzdCBvZiB7QGNvZGUgZ3JvdXBJZDphcnRpZmFjdElkfSBzdHJpbmdzIG9mIGFydGlmYWN0IGNvb3JkaW5hdGVzIHRoYXQgYXJlIHRvIGJlIGV4Y2x1ZGVkIGZyb20gImV4cGVjdGVkCisgICAgICogcHJvdmlkZWQgc2NvcGUiIGNoZWNrLiBEZWZhdWx0IHZhbHVlOiB7QGNvZGUgWyJvcmcuYXBhY2hlLm1hdmVuOm1hdmVuLWFyY2hpdmVyIiwgIm9yZy5hcGFjaGUubWF2ZW46bWF2ZW4tanhyIl19LgorICAgICAqCisgICAgICogQHNpbmNlIDMuNi4zCisgICAgICovCisgICAgQFBhcmFtZXRlcgorICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGV4cGVjdGVkUHJvdmlkZWRTY29wZUV4Y2x1c2lvbnMgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAib3JnLmFwYWNoZS5tYXZlbjptYXZlbi1hcmNoaXZlciIsCisgICAgICAgICJvcmcuYXBhY2hlLm1hdmVuOm1hdmVuLWp4ciIgKTsKKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgdGhlIGRlcGVuZGVuY2llcyBhcyB7QGNvZGUgZ3JvdXBJZDphcnRpZmFjdElkfSBjb250YWluaW5nIChhYnN0cmFjdCkgTW9qb3MsIHRvIGZpbHRlcgorICAgICAqIGRlcGVuZGVuY2llcyBzY2FubmVkIGF0IHJ1bnRpbWUgYW5kIGZvY3VzIG9uIGRlcGVuZGVuY2llcyB0aGF0IGFyZSByZWFsbHkgdXNlZnVsIHRvIE1vam8gYW5hbHlzaXMuCisgICAgICogQnkgZGVmYXVsdCwgdGhlIHZhbHVlIGlzIHtAY29kZSBudWxsfSBhbmQgYWxsIGRlcGVuZGVuY2llcyBhcmUgc2Nhbm5lZCAoYXMgYmVmb3JlIHRoaXMgcGFyYW1ldGVyIHdhcyBhZGRlZCkuCisgICAgICogSWYgc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIHdpdGggbm8gY2hpbGRyZW4sIG5vIGRlcGVuZGVuY2llcyBhcmUgc2Nhbm5lZC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAzLjUKKyAgICAgKi8KKyAgICBAUGFyYW1ldGVyCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbW9qb0RlcGVuZGVuY2llcyA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIFJlbW90ZSBSZXBvc2l0b3JpZXMgdXNlZCBieSB0aGUgcmVzb2x2ZXIKKyAgICAgKgorICAgICAqIEBzaW5jZSAzLjAKKyAgICAgKi8KKyAgICBAUGFyYW1ldGVyKCBkZWZhdWx0VmFsdWUgPSAiJHtwcm9qZWN0LnJlbW90ZUFydGlmYWN0UmVwb3NpdG9yaWVzfSIsIHJlcXVpcmVkID0gdHJ1ZSwgcmVhZG9ubHkgPSB0cnVlICkKKyAgICBwcml2YXRlIExpc3Q8QXJ0aWZhY3RSZXBvc2l0b3J5PiByZW1vdGVSZXBvczsKKworICAgIC8qKgorICAgICAqIExvY2F0aW9uIG9mIHRoZSBsb2NhbCByZXBvc2l0b3J5LgorICAgICAqCisgICAgICogQHNpbmNlIDMuMAorICAgICAqLworICAgIEBQYXJhbWV0ZXIoIGRlZmF1bHRWYWx1ZSA9ICIke2xvY2FsUmVwb3NpdG9yeX0iLCByZXF1aXJlZCA9IHRydWUsIHJlYWRvbmx5ID0gdHJ1ZSApCisgICAgcHJpdmF0ZSBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWw7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tcG9uZW50IHVzZWQgZm9yIHNjYW5uaW5nIHRoZSBzb3VyY2UgdHJlZSBmb3IgbW9qb3MuCisgICAgICovCisgICAgQENvbXBvbmVudAorICAgIHByaXZhdGUgTW9qb1NjYW5uZXIgbW9qb1NjYW5uZXI7CisKKyAgICBAQ29tcG9uZW50CisgICAgcHJvdGVjdGVkIEJ1aWxkQ29udGV4dCBidWlsZENvbnRleHQ7CisKKyAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZSgpCiAgICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCiAgICAgeworCiAgICAgICAgIGlmICggc2tpcERlc2NyaXB0b3IgKQogICAgICAgICB7CisgICAgICAgICAgICBnZXRMb2coKS53YXJuKCAiRXhlY3V0aW9uIHNraXBwZWQiICk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBzdXBlci5leGVjdXRlKCk7CisgICAgICAgIGlmICggY2hlY2tFeHBlY3RlZFByb3ZpZGVkU2NvcGUgKQorICAgICAgICB7CisgICAgICAgICAgICBTZXQ8QXJ0aWZhY3Q+IHdyb25nU2NvcGVkQXJ0aWZhY3RzID0gZGVwZW5kZW5jaWVzTm90SW5Qcm92aWRlZFNjb3BlKCk7CisgICAgICAgICAgICBpZiAoICF3cm9uZ1Njb3BlZEFydGlmYWN0cy5pc0VtcHR5KCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgZXJyb3JNZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoCisgICAgICAgICAgICAgICAgICAgIExTICsgTFMgKyAiU29tZSBkZXBlbmRlbmNpZXMgb2YgTWF2ZW4gUGx1Z2lucyBhcmUgZXhwZWN0ZWQgdG8gYmUgaW4gcHJvdmlkZWQgc2NvcGUuIiArIExTCisgICAgICAgICAgICAgICAgICAgICAgICArICJQbGVhc2UgbWFrZSBzdXJlIHRoYXQgZGVwZW5kZW5jaWVzIGxpc3RlZCBiZWxvdyBkZWNsYXJlZCBpbiBQT00iICsgTFMKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImhhdmUgc2V0ICc8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPicgYXMgd2VsbC4iICsgTFMgKyBMUworICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIGZvbGxvd2luZyBkZXBlbmRlbmNpZXMgYXJlIGluIHdyb25nIHNjb3BlOiIgKyBMUworICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgZm9yICggQXJ0aWZhY3QgYXJ0aWZhY3QgOiB3cm9uZ1Njb3BlZEFydGlmYWN0cyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UuYXBwZW5kKCAiICogIiApLmFwcGVuZCggYXJ0aWZhY3QgKS5hcHBlbmQoIExTICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZS5hcHBlbmQoIExTICkuYXBwZW5kKCBMUyApOworCisgICAgICAgICAgICAgICAgZ2V0TG9nKCkuZXJyb3IoIGVycm9yTWVzc2FnZS50b1N0cmluZygpICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtb2pvU2Nhbm5lci5zZXRBY3RpdmVFeHRyYWN0b3JzKCBleHRyYWN0b3JzICk7CisKKyAgICAgICAgLy8gVE9ETzogY291bGQgdXNlIHRoaXMgbW9yZSwgZWcgaW4gdGhlIHdyaXRpbmcgb2YgdGhlIHBsdWdpbiBkZXNjcmlwdG9yIQorICAgICAgICBQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBuZXcgUGx1Z2luRGVzY3JpcHRvcigpOworCisgICAgICAgIHBsdWdpbkRlc2NyaXB0b3Iuc2V0R3JvdXBJZCggcHJvamVjdC5nZXRHcm91cElkKCkgKTsKKworICAgICAgICBwbHVnaW5EZXNjcmlwdG9yLnNldEFydGlmYWN0SWQoIHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpICk7CisKKyAgICAgICAgcGx1Z2luRGVzY3JpcHRvci5zZXRWZXJzaW9uKCBwcm9qZWN0LmdldFZlcnNpb24oKSApOworCisgICAgICAgIHBsdWdpbkRlc2NyaXB0b3Iuc2V0R29hbFByZWZpeCggZ29hbFByZWZpeCApOworCisgICAgICAgIHBsdWdpbkRlc2NyaXB0b3Iuc2V0TmFtZSggcHJvamVjdC5nZXROYW1lKCkgKTsKKworICAgICAgICBwbHVnaW5EZXNjcmlwdG9yLnNldERlc2NyaXB0aW9uKCBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCkgKTsKKworICAgICAgICBpZiAoIGVuY29kaW5nID09IG51bGwgfHwgZW5jb2RpbmcubGVuZ3RoKCkgPCAxICkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0TG9nKCkud2FybiggIlVzaW5nIHBsYXRmb3JtIGVuY29kaW5nICgiICsgUmVhZGVyRmFjdG9yeS5GSUxFX0VOQ09ESU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFjdHVhbGx5KSB0byByZWFkIG1vam8gc291cmNlIGZpbGVzLCBpLmUuIGJ1aWxkIGlzIHBsYXRmb3JtIGRlcGVuZGVudCEiICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCAiVXNpbmcgJyIgKyBlbmNvZGluZyArICInIGVuY29kaW5nIHRvIHJlYWQgbW9qbyBzb3VyY2UgZmlsZXMuIiApOworICAgICAgICB9CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIExpc3Q8Q29tcG9uZW50RGVwZW5kZW5jeT4gZGVwcyA9IEdlbmVyYXRvclV0aWxzLnRvQ29tcG9uZW50RGVwZW5kZW5jaWVzKCBwcm9qZWN0LmdldEFydGlmYWN0cygpICk7CisgICAgICAgICAgICBwbHVnaW5EZXNjcmlwdG9yLnNldERlcGVuZGVuY2llcyggZGVwcyApOworCisgICAgICAgICAgICBQbHVnaW5Ub29sc1JlcXVlc3QgcmVxdWVzdCA9IG5ldyBEZWZhdWx0UGx1Z2luVG9vbHNSZXF1ZXN0KCBwcm9qZWN0LCBwbHVnaW5EZXNjcmlwdG9yICk7CisgICAgICAgICAgICByZXF1ZXN0LnNldEVuY29kaW5nKCBlbmNvZGluZyApOworICAgICAgICAgICAgcmVxdWVzdC5zZXRTa2lwRXJyb3JOb0Rlc2NyaXB0b3JzRm91bmQoIHNraXBFcnJvck5vRGVzY3JpcHRvcnNGb3VuZCApOworICAgICAgICAgICAgcmVxdWVzdC5zZXREZXBlbmRlbmNpZXMoIGZpbHRlck1vam9EZXBlbmRlbmNpZXMoKSApOworICAgICAgICAgICAgcmVxdWVzdC5zZXRMb2NhbCggdGhpcy5sb2NhbCApOworICAgICAgICAgICAgcmVxdWVzdC5zZXRSZW1vdGVSZXBvcyggdGhpcy5yZW1vdGVSZXBvcyApOworCisgICAgICAgICAgICBtb2pvU2Nhbm5lci5wb3B1bGF0ZVBsdWdpbkRlc2NyaXB0b3IoIHJlcXVlc3QgKTsKKworICAgICAgICAgICAgb3V0cHV0RGlyZWN0b3J5Lm1rZGlycygpOworCisgICAgICAgICAgICBQbHVnaW5EZXNjcmlwdG9yR2VuZXJhdG9yIHBsdWdpbkRlc2NyaXB0b3JHZW5lcmF0b3IgPSBuZXcgUGx1Z2luRGVzY3JpcHRvckdlbmVyYXRvcigpOworICAgICAgICAgICAgcGx1Z2luRGVzY3JpcHRvckdlbmVyYXRvci5leGVjdXRlKCBvdXRwdXREaXJlY3RvcnksIHJlcXVlc3QgKTsKKworICAgICAgICAgICAgYnVpbGRDb250ZXh0LnJlZnJlc2goIG91dHB1dERpcmVjdG9yeSApOworICAgICAgICB9CisgICAgICAgIGNhdGNoICggR2VuZXJhdG9yRXhjZXB0aW9uIGUgKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIkVycm9yIHdyaXRpbmcgcGx1Z2luIGRlc2NyaXB0b3IiLCBlICk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBJbnZhbGlkUGx1Z2luRGVzY3JpcHRvckV4Y2VwdGlvbiB8IEV4dHJhY3Rpb25FeGNlcHRpb24gZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRXJyb3IgZXh0cmFjdGluZyBwbHVnaW4gZGVzY3JpcHRvcjogJyIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSArICInIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKCBMaW5rYWdlRXJyb3IgZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiVGhlIEFQSSBvZiB0aGUgbW9qbyBzY2FubmVyIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyBwbHVnaW4gdmVyc2lvbi4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBQbGVhc2UgY2hlY2sgdGhlIHBsdWdpbiBkZXBlbmRlbmNpZXMgY29uZmlndXJlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGluIHRoZSBQT00gYW5kIGVuc3VyZSB0aGUgdmVyc2lvbnMgbWF0Y2guIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICk7CisgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0cyBhbGwgZGVwZW5kZW5jaWVzIGV4cGVjdGVkIHRvIGJlIGluICJwcm92aWRlZCIgc2NvcGUgYnV0IGFyZSBOT1QgaW4gInByb3ZpZGVkIiBzY29wZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNldDxBcnRpZmFjdD4gZGVwZW5kZW5jaWVzTm90SW5Qcm92aWRlZFNjb3BlKCkKKyAgICB7CisgICAgICAgIExpbmtlZEhhc2hTZXQ8QXJ0aWZhY3Q+IHdyb25nU2NvcGVkRGVwZW5kZW5jaWVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworCisgICAgICAgIGZvciAoIEFydGlmYWN0IGRlcGVuZGVuY3kgOiBwcm9qZWN0LmdldEFydGlmYWN0cygpICkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGdhID0gZGVwZW5kZW5jeS5nZXRHcm91cElkKCkgKyAiOiIgKyBkZXBlbmRlbmN5LmdldEFydGlmYWN0SWQoKTsKKyAgICAgICAgICAgIGlmICggZXhwZWN0ZWRQcm92aWRlZFNjb3BlR3JvdXBJZHMuY29udGFpbnMoIGRlcGVuZGVuY3kuZ2V0R3JvdXBJZCgpICkKKyAgICAgICAgICAgICAgICAmJiAhZXhwZWN0ZWRQcm92aWRlZFNjb3BlRXhjbHVzaW9ucy5jb250YWlucyggZ2EgKQorICAgICAgICAgICAgICAgICYmICFBcnRpZmFjdC5TQ09QRV9QUk9WSURFRC5lcXVhbHMoIGRlcGVuZGVuY3kuZ2V0U2NvcGUoKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cm9uZ1Njb3BlZERlcGVuZGVuY2llcy5hZGQoIGRlcGVuZGVuY3kgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB3cm9uZ1Njb3BlZERlcGVuZGVuY2llczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgZGVwZW5kZW5jaWVzIGZpbHRlcmVkIHdpdGggbW9qb0RlcGVuZGVuY2llcyBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBldmVudHVhbGx5IGZpbHRlcmVkIGRlcGVuZGVuY2llcywgb3IgZXZlbiA8Y29kZT5udWxsPC9jb2RlPiBpZiBjb25maWd1cmVkIHdpdGggZW1wdHkgbW9qb0RlcGVuZGVuY2llcworICAgICAqIGxpc3QKKyAgICAgKiBAc2VlICNtb2pvRGVwZW5kZW5jaWVzCisgICAgICovCisgICAgcHJpdmF0ZSBTZXQ8QXJ0aWZhY3Q+IGZpbHRlck1vam9EZXBlbmRlbmNpZXMoKQorICAgIHsKKyAgICAgICAgU2V0PEFydGlmYWN0PiBmaWx0ZXJlZEFydGlmYWN0czsKKyAgICAgICAgaWYgKCBtb2pvRGVwZW5kZW5jaWVzID09IG51bGwgKQorICAgICAgICB7CisgICAgICAgICAgICBmaWx0ZXJlZEFydGlmYWN0cyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oIHByb2plY3QuZ2V0QXJ0aWZhY3RzKCkgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggbW9qb0RlcGVuZGVuY2llcy5pc0VtcHR5KCkgKQorICAgICAgICB7CisgICAgICAgICAgICBmaWx0ZXJlZEFydGlmYWN0cyA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmaWx0ZXJlZEFydGlmYWN0cyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKworICAgICAgICAgICAgQXJ0aWZhY3RGaWx0ZXIgZmlsdGVyID0gbmV3IEluY2x1ZGVzQXJ0aWZhY3RGaWx0ZXIoIG1vam9EZXBlbmRlbmNpZXMgKTsKKworICAgICAgICAgICAgZm9yICggQXJ0aWZhY3QgYXJ0aWZhY3QgOiBwcm9qZWN0LmdldEFydGlmYWN0cygpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIGZpbHRlci5pbmNsdWRlKCBhcnRpZmFjdCApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkQXJ0aWZhY3RzLmFkZCggYXJ0aWZhY3QgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmlsdGVyZWRBcnRpZmFjdHM7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL3BsdWdpbi9IZWxwR2VuZXJhdG9yTW9qby5qYXZhIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL3BsdWdpbi9IZWxwR2VuZXJhdG9yTW9qby5qYXZhCmluZGV4IDdjYzQ3MmUuLjJkOGEyOTEgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vSGVscEdlbmVyYXRvck1vam8uamF2YQorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vcGx1Z2luL0hlbHBHZW5lcmF0b3JNb2pvLmphdmEKQEAgLTE5LDcgKzE5LDExIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitpbXBvcnQgamF2YXgubGFuZy5tb2RlbC5Tb3VyY2VWZXJzaW9uOworCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuQ29tcG9uZW50OwpAQCAtMjcsMTkgKzMxLDE5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLk1vam87CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLlBhcmFtZXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUmVzb2x1dGlvblNjb3BlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmdlbmVyYXRvci5HZW5lcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZ2VuZXJhdG9yLkdlbmVyYXRvckV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5nZW5lcmF0b3IuUGx1Z2luSGVscEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy52ZWxvY2l0eS5WZWxvY2l0eUNvbXBvbmVudDsKIAogLyoqCiAgKiBHZW5lcmF0ZXMgYSA8Y29kZT5IZWxwTW9qbzwvY29kZT4gY2xhc3MuCi0gKiAKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOnZpbmNlbnQuc2l2ZXRvbkBnbWFpbC5jb20iPlZpbmNlbnQgU2l2ZXRvbjwvYT4KICAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzp2aW5jZW50LnNpdmV0b25AZ21haWwuY29tIj5WaW5jZW50IFNpdmV0b248L2E+CiAgKiBAc2luY2UgMi40CiAgKi8KIEBNb2pvKCBuYW1lID0gImhlbHBtb2pvIiwgZGVmYXVsdFBoYXNlID0gTGlmZWN5Y2xlUGhhc2UuR0VORVJBVEVfU09VUkNFUywgdGhyZWFkU2FmZSA9IHRydWUsCi0gICAgICAgICAgICAgICAgcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiA9IFJlc29sdXRpb25TY29wZS5DT01QSUxFICkKKyAgICAgICByZXF1aXJlc0RlcGVuZGVuY3lSZXNvbHV0aW9uID0gUmVzb2x1dGlvblNjb3BlLkNPTVBJTEUgKQogcHVibGljIGNsYXNzIEhlbHBHZW5lcmF0b3JNb2pvCiAgICAgZXh0ZW5kcyBBYnN0cmFjdEdlbmVyYXRvck1vam8KIHsKQEAgLTUwLDkgKzU0LDE0IEBACiAgICAgcHJvdGVjdGVkIEZpbGUgb3V0cHV0RGlyZWN0b3J5OwogCiAgICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgZm9yIHRoZSBnZW5lcmF0ZWQgPGNvZGU+SGVscE1vam88L2NvZGU+LiBCeSBkZWZhdWx0LCB0aGUgcGFja2FnZSB3aWxsIGJlIGNhbGN1bGF0ZWQgYmFzZWQKLSAgICAgKiBvbiB0aGUgcGFja2FnZXMgb2YgdGhlIG90aGVyIHBsdWdpbiBnb2Fscy4KLSAgICAgKiAKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSBmb3IgdGhlIGdlbmVyYXRlZCA8Y29kZT5IZWxwTW9qbzwvY29kZT4uCisgICAgICogPHA+CisgICAgICogQnkgZGVmYXVsdCwgdGhlIHBhY2thZ2UgbmFtZSB3aWxsIGJlIGNhbGN1bGF0ZWQgYXMgPGNvZGU+Z3JvdXBJZCArICIuIiArIGFydGlmYWN0SWQ8L2NvZGU+IHdpdGggYWRkaXRpb25hbAorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGNvZGU+LTwvY29kZT4gKGRhc2hlcykgd2lsbCBiZSByZXBsYWNlZCBieSA8Y29kZT5fPC9jb2RlPiAodW5kZXJzY29yZXMpPC9saT4KKyAgICAgKiA8bGk+PGNvZGU+XzwvY29kZT4gKHVuZGVyc2NvcmUpIHdpbGwgYmUgYWRkZWQgYmVmb3JlIGVhY2ggbnVtYmVyIG9yIEphdmEga2V5d29yZCBhdCB0aGUgYmVnaW5uaW5nIG9mIG5hbWU8L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKICAgICAgKiBAc2luY2UgMi42CiAgICAgICovCiAgICAgQFBhcmFtZXRlcgpAQCAtNjQsNDEgKzczLDU5IEBACiAgICAgQENvbXBvbmVudAogICAgIHByaXZhdGUgVmVsb2NpdHlDb21wb25lbnQgdmVsb2NpdHk7CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEZpbGUgZ2V0T3V0cHV0RGlyZWN0b3J5KCkKKyAgICBTdHJpbmcgZ2V0SGVscFBhY2thZ2VOYW1lKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7CisgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7CisgICAgICAgIGlmICggU3RyaW5nVXRpbHMuaXNOb3RCbGFuayggaGVscFBhY2thZ2VOYW1lICkgKQorICAgICAgICB7CisgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IGhlbHBQYWNrYWdlTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggcGFja2FnZU5hbWUgPT0gbnVsbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gcHJvamVjdC5nZXRHcm91cElkKCkgKyAiLiIgKyBwcm9qZWN0LmdldEFydGlmYWN0SWQoKTsKKyAgICAgICAgICAgIHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWUucmVwbGFjZSggIi0iLCAiXyIgKTsKKworICAgICAgICAgICAgU3RyaW5nW10gcGFja2FnZUl0ZW1zID0gcGFja2FnZU5hbWUuc3BsaXQoICJcXC4iICk7CisgICAgICAgICAgICBwYWNrYWdlTmFtZSA9IEFycmF5cy5zdHJlYW0oIHBhY2thZ2VJdGVtcyApCisgICAgICAgICAgICAgICAgLm1hcCggdGhpczo6cHJlZml4U3BlY2lhbENhc2UgKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KCBDb2xsZWN0b3JzLmpvaW5pbmcoICIuIiApICk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGFja2FnZU5hbWU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBHZW5lcmF0b3IgY3JlYXRlR2VuZXJhdG9yKCkKKyAgICBwcml2YXRlIFN0cmluZyBwcmVmaXhTcGVjaWFsQ2FzZSggU3RyaW5nIG5hbWUgKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBQbHVnaW5IZWxwR2VuZXJhdG9yKCkuc2V0SGVscFBhY2thZ2VOYW1lKCBoZWxwUGFja2FnZU5hbWUgKS5zZXRWZWxvY2l0eUNvbXBvbmVudCggdGhpcy52ZWxvY2l0eSApOworICAgICAgICBpZiAoIFNvdXJjZVZlcnNpb24uaXNLZXl3b3JkKCBuYW1lICkgfHwgIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoIG5hbWUuY2hhckF0KCAwICkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5hbWUgPSAiXyIgKyBuYW1lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KKyAgICBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCiAgICAgewotICAgICAgICAvLyBmb3JjZSB2YWx1ZSBmb3IgdGhpcyBwbHVnaW4KLSAgICAgICAgc2tpcEVycm9yTm9EZXNjcmlwdG9yc0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgUGx1Z2luSGVscEdlbmVyYXRvciBwbHVnaW5IZWxwR2VuZXJhdG9yID0gbmV3IFBsdWdpbkhlbHBHZW5lcmF0b3IoKQorICAgICAgICAgICAgLnNldE1hdmVuUHJvamVjdCggcHJvamVjdCApCisgICAgICAgICAgICAuc2V0SGVscFBhY2thZ2VOYW1lKCBnZXRIZWxwUGFja2FnZU5hbWUoKSApCisgICAgICAgICAgICAuc2V0R29hbFByZWZpeCggZ29hbFByZWZpeCApCisgICAgICAgICAgICAuc2V0VmVsb2NpdHlDb21wb25lbnQoIHZlbG9jaXR5ICk7CiAKLSAgICAgICAgc3VwZXIuZXhlY3V0ZSgpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcGx1Z2luSGVscEdlbmVyYXRvci5leGVjdXRlKCBvdXRwdXREaXJlY3RvcnkgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoIEdlbmVyYXRvckV4Y2VwdGlvbiBlICkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7CisgICAgICAgIH0KIAotICAgICAgICBpZiAoICFwcm9qZWN0LmdldENvbXBpbGVTb3VyY2VSb290cygpLmNvbnRhaW5zKCBvdXRwdXREaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkgKSAmJiAhc2tpcCApCisgICAgICAgIGlmICggIXByb2plY3QuZ2V0Q29tcGlsZVNvdXJjZVJvb3RzKCkuY29udGFpbnMoIG91dHB1dERpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSApICkKICAgICAgICAgewogICAgICAgICAgICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdCggb3V0cHV0RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpICk7CiAgICAgICAgIH0KLQogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL3BsdWdpbi9QbHVnaW5SZXBvcnQuamF2YSBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vcmVwb3J0L1BsdWdpblJlcG9ydC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODAlCnJlbmFtZSBmcm9tIG1hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vUGx1Z2luUmVwb3J0LmphdmEKcmVuYW1lIHRvIG1hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vcmVwb3J0L1BsdWdpblJlcG9ydC5qYXZhCmluZGV4IGNiMmVlZTkuLjJjZDQ0OGEgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vUGx1Z2luUmVwb3J0LmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL3BsdWdpbi9yZXBvcnQvUGx1Z2luUmVwb3J0LmphdmEKQEAgLTEsNCArMSw0IEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLnBsdWdpbjsKK3BhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ucGx1Z2luLnJlcG9ydDsKIAogLyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTIwLDIxICsyMCwxOCBAQAogICovCiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmRveGlhLnNpbmsuU2luazsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmRveGlhLnNpdGVyZW5kZXJlci5SZW5kZXJlcjsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLlBsdWdpbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5kZXNjcmlwdG9yLkludmFsaWRQbHVnaW5EZXNjcmlwdG9yRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmRlc2NyaXB0b3IuTW9qb0Rlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uZGVzY3JpcHRvci5QbHVnaW5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmRlc2NyaXB0b3IuUGx1Z2luRGVzY3JpcHRvckJ1aWxkZXI7CkBAIC01MSwxNSArNDgsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnJ0aW5mby5SdW50aW1lSW5mb3JtYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uRGVmYXVsdFBsdWdpblRvb2xzUmVxdWVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5QbHVnaW5Ub29sc1JlcXVlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZXh0cmFjdG9yLkV4dHJhY3Rpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZ2VuZXJhdG9yLkdlbmVyYXRvckV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5nZW5lcmF0b3IuR2VuZXJhdG9yVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZ2VuZXJhdG9yLlBsdWdpblhkb2NHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uc2Nhbm5lci5Nb2pvU2Nhbm5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi51dGlsLlBsdWdpblV0aWxzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LnJlcG9zaXRvcnkuQ29tcG9uZW50RGVwZW5kZW5jeTsKIGltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbmZpZ3VyYXRpb24uUGxleHVzQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5YbWxTdHJlYW1SZWFkZXI7CiBpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5YcHAzRG9tOwogCiAvKioKQEAgLTgyLDI4ICs3NywxMyBAQAogICAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXJlY3Rvcnk7CiAKICAgICAvKioKLSAgICAgKiBEb3hpYSBTaXRlIFJlbmRlcmVyLgotICAgICAqLwotICAgIEBDb21wb25lbnQKLSAgICBwcml2YXRlIFJlbmRlcmVyIHNpdGVSZW5kZXJlcjsKLQotICAgIC8qKgotICAgICAqIFRoZSBNYXZlbiBQcm9qZWN0LgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIoIGRlZmF1bHRWYWx1ZSA9ICIke3Byb2plY3R9IiwgcmVhZG9ubHkgPSB0cnVlICkKLSAgICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gICAgLyoqCi0gICAgICogTW9qbyBzY2FubmVyIHRvb2xzLgotICAgICAqLwotICAgIEBDb21wb25lbnQKLSAgICBwcm90ZWN0ZWQgTW9qb1NjYW5uZXIgbW9qb1NjYW5uZXI7Ci0KLSAgICAvKioKICAgICAgKiBUaGUgZmlsZSBlbmNvZGluZyBvZiB0aGUgc291cmNlIGZpbGVzLgogICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgbm90IHVzZWQgaW4gcmVwb3J0LCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbgorICAgICAqCiAgICAgICogQHNpbmNlIDIuNwogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgQFBhcmFtZXRlciggcHJvcGVydHkgPSAiZW5jb2RpbmciLCBkZWZhdWx0VmFsdWUgPSAiJHtwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nfSIgKQogICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nOwogCkBAIC0xMjQsMTEgKzEwNCwxNCBAQAogICAgICAqICAgJmx0Oy9vdGhlcnMmZ3Q7CiAgICAgICogJmx0Oy9yZXF1aXJlbWVudHMmZ3Q7CiAgICAgICogPC9wcmU+Ci0gICAgICogCisgICAgICogPHA+CiAgICAgICogSWYgbm90IGlzIHNwZWNpZmllZCwgTWF2ZW4gcmVxdWlyZW1lbnQgaXMgZXh0cmFjdGVkIGZyb20KICAgICAgKiA8Y29kZT4mbHQ7cHJvamVjdCZndDsmbHQ7cHJlcmVxdWlzaXRlcyZndDsmbHQ7bWF2ZW4mZ3Q7PC9jb2RlPgogICAgICAqIGFuZCBKREsgcmVxdWlyZW1lbnQgaXMgZXh0cmFjdGVkIGZyb20gbWF2ZW4tY29tcGlsZXItcGx1Z2luIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiwgcGxlYXNlIGRvbid0IHVzZQogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgQFBhcmFtZXRlcgogICAgIHByaXZhdGUgUmVxdWlyZW1lbnRzIHJlcXVpcmVtZW50czsKIApAQCAtMTQ5LDggKzEzMiwxMSBAQAogICAgICAqIChUaGVyZSBpcyBhIHNwZWNpYWwgY2FzZSBmb3IgbWF2ZW4tcGx1Z2luLXBsdWdpbjogaXQgaXMgbWFwcGVkIHRvICdwbHVnaW4nKQogICAgICAqIDwvcD4KICAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIG5vdCB1c2VkIGluIHJlcG9ydCwgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24KKyAgICAgKgogICAgICAqIEBzaW5jZSAyLjQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIEBQYXJhbWV0ZXIoIHByb3BlcnR5ID0gImdvYWxQcmVmaXgiICkKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdvYWxQcmVmaXg7CiAKQEAgLTE3MSwyMSArMTU3LDM0IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIHNraXBSZXBvcnQ7CiAKICAgICAvKioKLSAgICAgKiBMaXN0IG9mIFJlbW90ZSBSZXBvc2l0b3JpZXMgdXNlZCBieSB0aGUgcmVzb2x2ZXIKKyAgICAgKiBTZXQgdGhpcyB0byAidHJ1ZSIgdG8gZ2VuZXJhdGUgdGhlIHVzYWdlIHNlY3Rpb24gZm9yICJwbHVnaW4taW5mby5odG1sIiB3aXRoCisgICAgICoge0Bjb2RlIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+fS4KICAgICAgKgotICAgICAqIEBzaW5jZSAzLjAKKyAgICAgKiBAc2luY2UgMy43LjAKICAgICAgKi8KLSAgICBAUGFyYW1ldGVyKCBkZWZhdWx0VmFsdWUgPSAiJHtwcm9qZWN0LnJlbW90ZUFydGlmYWN0UmVwb3NpdG9yaWVzfSIsIHJlcXVpcmVkID0gdHJ1ZSwgcmVhZG9ubHkgPSB0cnVlICkKLSAgICBwcm90ZWN0ZWQgTGlzdDxBcnRpZmFjdFJlcG9zaXRvcnk+IHJlbW90ZVJlcG9zOworICAgIEBQYXJhbWV0ZXIoIGRlZmF1bHRWYWx1ZSA9ICJmYWxzZSIsIHByb3BlcnR5ID0gIm1hdmVuLnBsdWdpbi5yZXBvcnQuaGFzRXh0ZW5zaW9uc1RvTG9hZCIgKQorICAgIHByaXZhdGUgYm9vbGVhbiBoYXNFeHRlbnNpb25zVG9Mb2FkOwogCiAgICAgLyoqCi0gICAgICogTG9jYXRpb24gb2YgdGhlIGxvY2FsIHJlcG9zaXRvcnkuCisgICAgICogVGhlIFBsdWdpbiByZXF1aXJlbWVudHMgaGlzdG9yeSBsaXN0LgorICAgICAqIDxwPgorICAgICAqIENhbiBiZSBzcGVjaWZpZWQgYXMgbGlzdCBvZiA8Y29kZT5yZXF1aXJlbWVudHNIaXN0b3J5PC9jb2RlPjoKICAgICAgKgotICAgICAqIEBzaW5jZSAzLjAKKyAgICAgKiA8cHJlPgorICAgICAqICZsdDtyZXF1aXJlbWVudHNIaXN0b3JpZXMmZ3Q7CisgICAgICogICAmbHQ7cmVxdWlyZW1lbnRzSGlzdG9yeSZndDsKKyAgICAgKiAgICAgJmx0O3ZlcnNpb24mZ3Q7cGx1Z2luIHZlcnNpb24mbHQ7L3ZlcnNpb24mZ3Q7CisgICAgICogICAgICZsdDttYXZlbiZndDttYXZlbiB2ZXJzaW9uJmx0Oy9tYXZlbiZndDsKKyAgICAgKiAgICAgJmx0O2pkayZndDtqZGsgdmVyc2lvbiZsdDsvamRrJmd0OworICAgICAqICAgJmx0Oy9yZXF1aXJlbWVudHNIaXN0b3J5Jmd0OworICAgICAqICZsdDsvcmVxdWlyZW1lbnRzSGlzdG9yaWVzJmd0OworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHNpbmNlIDMuNy4wCiAgICAgICovCi0gICAgQFBhcmFtZXRlciggZGVmYXVsdFZhbHVlID0gIiR7bG9jYWxSZXBvc2l0b3J5fSIsIHJlcXVpcmVkID0gdHJ1ZSwgcmVhZG9ubHkgPSB0cnVlICkKLSAgICBwcm90ZWN0ZWQgQXJ0aWZhY3RSZXBvc2l0b3J5IGxvY2FsOwotICAgIAorICAgIEBQYXJhbWV0ZXIKKyAgICBwcml2YXRlIExpc3Q8UmVxdWlyZW1lbnRzSGlzdG9yeT4gcmVxdWlyZW1lbnRzSGlzdG9yaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKICAgICAvKioKICAgICAgKiBAc2luY2UgMy41LjEKICAgICAgKi8KQEAgLTE5OCwyMiArMTk3LDEzIEBACiAgICAgICogQHNpbmNlIDMuNS4xCiAgICAgICovCiAgICAgQFBhcmFtZXRlciggZGVmYXVsdFZhbHVlID0gIiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9L01FVEEtSU5GL21hdmVuL3BsdWdpbi54bWwiLCByZXF1aXJlZCA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5ID0gdHJ1ZSApCisgICAgICAgICAgICAgICAgcmVhZG9ubHkgPSB0cnVlICkKICAgICBwcml2YXRlIEZpbGUgcGx1Z2luWG1sRmlsZTsKIAogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUmVuZGVyZXIgZ2V0U2l0ZVJlbmRlcmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzaXRlUmVuZGVyZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5KCkKICAgICB7CiAgICAgICAgIC8vIFBMVUdJTi0xOTE6IG91dHB1dCBkaXJlY3Rvcnkgb2YgcGx1Z2luLmh0bWwsIG5vdCAqLW1vam8ueG1sCkBAIC0yMjQsMTUgKzIxNCw2IEBACiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBNYXZlblByb2plY3QgZ2V0UHJvamVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gY2FuR2VuZXJhdGVSZXBvcnQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBsdWdpblhtbEZpbGUgIT0gbnVsbCAmJiBwbHVnaW5YbWxGaWxlLmlzRmlsZSgpICYmIHBsdWdpblhtbEZpbGUuY2FuUmVhZCgpOwpAQCAtMjQ1LDEwICsyMjYsNiBAQAogICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGVSZXBvcnQoIExvY2FsZSBsb2NhbGUgKQogICAgICAgICB0aHJvd3MgTWF2ZW5SZXBvcnRFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIGlmICggIWNhbkdlbmVyYXRlUmVwb3J0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KICAgICAgICAgaWYgKCBza2lwIHx8IHNraXBSZXBvcnQgKQogICAgICAgICB7CiAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCAiTWF2ZW4gUGx1Z2luIFBsdWdpbiBSZXBvcnQgZ2VuZXJhdGlvbiBza2lwcGVkLiIgKTsKQEAgLTI2Miw3ICsyMzksOCBAQAogCiAgICAgICAgIC8vIFdyaXRlIHRoZSBvdmVydmlldwogICAgICAgICBQbHVnaW5PdmVydmlld1JlbmRlcmVyIHIgPQotICAgICAgICAgICAgbmV3IFBsdWdpbk92ZXJ2aWV3UmVuZGVyZXIoIHByb2plY3QsIHJlcXVpcmVtZW50cywgZ2V0U2luaygpLCBwbHVnaW5EZXNjcmlwdG9yLCBsb2NhbGUgKTsKKyAgICAgICAgICAgIG5ldyBQbHVnaW5PdmVydmlld1JlbmRlcmVyKCBnZXRQcm9qZWN0KCksIHJlcXVpcmVtZW50cywgcmVxdWlyZW1lbnRzSGlzdG9yaWVzLCBnZXRTaW5rKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luRGVzY3JpcHRvciwgbG9jYWxlLCBoYXNFeHRlbnNpb25zVG9Mb2FkICk7CiAgICAgICAgIHIucmVuZGVyKCk7CiAgICAgfQogCkBAIC0yNzAsNzQgKzI0OCwyMyBAQAogICAgICAgICB0aHJvd3MgTWF2ZW5SZXBvcnRFeGNlcHRpb24KICAgICB7CiAgICAgICAgIFBsdWdpbkRlc2NyaXB0b3JCdWlsZGVyIGJ1aWxkZXIgPSBnZXRQbHVnaW5EZXNjcmlwdG9yQnVpbGRlcigpOwotICAgICAgICAKLSAgICAgICAgdHJ5CisKKyAgICAgICAgdHJ5ICggUmVhZGVyIGlucHV0ID0gbmV3IFhtbFN0cmVhbVJlYWRlciggRmlsZXMubmV3SW5wdXRTdHJlYW0oIHBsdWdpblhtbEZpbGUudG9QYXRoKCkgKSApICkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoIG5ldyBGaWxlUmVhZGVyKCBwbHVnaW5YbWxGaWxlICkgKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCBpbnB1dCApOwogICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHwgUGxleHVzQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlICkKKyAgICAgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiB8IFBsZXh1c0NvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZygpLmRlYnVnKCAiRmFpbGVkIHRvIHJlYWQgIiArIHBsdWdpblhtbEZpbGUgKyAiLCBmYWxsIGJhY2sgdG8gbW9qb1NjYW5uZXIiICk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWF2ZW5SZXBvcnRFeGNlcHRpb24oICJFcnJvciBleHRyYWN0aW5nIHBsdWdpbiBkZXNjcmlwdG9yIGZyb20gIiArIHBsdWdpblhtbEZpbGUsIGUgKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIENvcHkgZnJvbSBBYnN0cmFjdEdlbmVyYXRvck1vam8jZXhlY3V0ZSgpCi0gICAgICAgIFN0cmluZyBkZWZhdWx0R29hbFByZWZpeCA9IFBsdWdpbkRlc2NyaXB0b3IuZ2V0R29hbFByZWZpeEZyb21BcnRpZmFjdElkKCBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSApOwotICAgICAgICBpZiAoIGdvYWxQcmVmaXggPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdvYWxQcmVmaXggPSBkZWZhdWx0R29hbFByZWZpeDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZygpLndhcm4oICJcblxuR29hbCBwcmVmaXggaXMgc3BlY2lmaWVkIGFzOiAnIiArIGdvYWxQcmVmaXggKyAiJy4gTWF2ZW4gY3VycmVudGx5IGV4cGVjdHMgaXQgdG8gYmUgJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRlZmF1bHRHb2FsUHJlZml4ICsgIicuXG4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiBjb3VsZCB1c2UgdGhpcyBtb3JlLCBlZyBpbiB0aGUgd3JpdGluZyBvZiB0aGUgcGx1Z2luIGRlc2NyaXB0b3IhCi0gICAgICAgIFBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9IG5ldyBQbHVnaW5EZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgcGx1Z2luRGVzY3JpcHRvci5zZXRHcm91cElkKCBwcm9qZWN0LmdldEdyb3VwSWQoKSApOwotCi0gICAgICAgIHBsdWdpbkRlc2NyaXB0b3Iuc2V0QXJ0aWZhY3RJZCggcHJvamVjdC5nZXRBcnRpZmFjdElkKCkgKTsKLQotICAgICAgICBwbHVnaW5EZXNjcmlwdG9yLnNldFZlcnNpb24oIHByb2plY3QuZ2V0VmVyc2lvbigpICk7Ci0KLSAgICAgICAgcGx1Z2luRGVzY3JpcHRvci5zZXRHb2FsUHJlZml4KCBnb2FsUHJlZml4ICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8Q29tcG9uZW50RGVwZW5kZW5jeT4gZGVwcyA9IEdlbmVyYXRvclV0aWxzLnRvQ29tcG9uZW50RGVwZW5kZW5jaWVzKCBwcm9qZWN0LmdldEFydGlmYWN0cygpICk7Ci0gICAgICAgICAgICBwbHVnaW5EZXNjcmlwdG9yLnNldERlcGVuZGVuY2llcyggZGVwcyApOwotCi0gICAgICAgICAgICBQbHVnaW5Ub29sc1JlcXVlc3QgcmVxdWVzdCA9IG5ldyBEZWZhdWx0UGx1Z2luVG9vbHNSZXF1ZXN0KCBwcm9qZWN0LCBwbHVnaW5EZXNjcmlwdG9yICk7Ci0gICAgICAgICAgICByZXF1ZXN0LnNldEVuY29kaW5nKCBlbmNvZGluZyApOwotICAgICAgICAgICAgcmVxdWVzdC5zZXRTa2lwRXJyb3JOb0Rlc2NyaXB0b3JzRm91bmQoIHRydWUgKTsKLSAgICAgICAgICAgIHJlcXVlc3Quc2V0RGVwZW5kZW5jaWVzKCBuZXcgTGlua2VkSGFzaFNldDw+KCBwcm9qZWN0LmdldEFydGlmYWN0cygpICkgKTsKLSAgICAgICAgICAgIHJlcXVlc3Quc2V0TG9jYWwoIHRoaXMubG9jYWwgKTsKLSAgICAgICAgICAgIHJlcXVlc3Quc2V0UmVtb3RlUmVwb3MoIHRoaXMucmVtb3RlUmVwb3MgKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9qb1NjYW5uZXIucG9wdWxhdGVQbHVnaW5EZXNjcmlwdG9yKCByZXF1ZXN0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIEludmFsaWRQbHVnaW5EZXNjcmlwdG9yRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgT0ssIGl0IGhhcHBlbnMgdG8gbGlmZWN5Y2xlIHBsdWdpbnMuIEFsbG93IGdlbmVyYXRpb24gdG8gcHJvY2VlZC4KLSAgICAgICAgICAgICAgICBnZXRMb2coKS5kZWJ1ZyggIlBsdWdpbiB3aXRob3V0IG1vam9zLiIsIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIEV4dHJhY3Rpb25FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYXZlblJlcG9ydEV4Y2VwdGlvbiggIkVycm9yIGV4dHJhY3RpbmcgcGx1Z2luIGRlc2NyaXB0b3I6IFwnIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICsgIlwnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwbHVnaW5EZXNjcmlwdG9yOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgcGx1Z2luRGVzY3JpcHRvckJ1aWxkZXIgdG8gdXNlIGJhc2VkIG9uIHRoZSBNYXZlbiB2ZXJzaW9uOiBlaXRoZXIgdXNlIHRoZSBvcmlnaW5hbCBmcm9tIHRoZSAKLSAgICAgKiBtYXZlbi1wbHVnaW4tYXBpIG9yIGEgcGF0Y2hlZCB2ZXJzaW9uIGZvciBNYXZlbiB2ZXJzaW9ucyBiZWZvcmUgdGhlIE1ORy02MTA5IGZpeCAKKyAgICAgKiBSZXR1cm4gdGhlIHBsdWdpbkRlc2NyaXB0b3JCdWlsZGVyIHRvIHVzZSBiYXNlZCBvbiB0aGUgTWF2ZW4gdmVyc2lvbjogZWl0aGVyIHVzZSB0aGUgb3JpZ2luYWwgZnJvbSB0aGUKKyAgICAgKiBtYXZlbi1wbHVnaW4tYXBpIG9yIGEgcGF0Y2hlZCB2ZXJzaW9uIGZvciBNYXZlbiB2ZXJzaW9ucyBiZWZvcmUgdGhlIE1ORy02MTA5IGZpeAogICAgICAqIChiZWNhdXNlIG9mIE1hdmVuIE1ORy02MTA5IGJ1ZyB0aGF0IHdvbid0IGdpdmUgYWNjdXJhdGUgJ3NpbmNlJyBpbmZvIHdoZW4gcmVhZGluZyBwbHVnaW4ueG1sKS4KLSAgICAgKiAKKyAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIHByb3BlciBwbHVnaW5EZXNjcmlwdG9yQnVpbGRlcgogICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9NTkctNjEwOSI+TU5HLTYxMDk8L2E+CiAgICAgICogQHNlZSA8YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL01QTFVHSU4tMzE5Ij5NUExVR0lOLTMxOTwvYT4KQEAgLTQwMCw4ICszMjcsOCBAQAogICAgICAgICAgICAgRmlsZSBvdXRwdXREaXIgPSBvdXRwdXREaXJlY3Rvcnk7CiAgICAgICAgICAgICBvdXRwdXREaXIubWtkaXJzKCk7CiAKLSAgICAgICAgICAgIFBsdWdpblhkb2NHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbmV3IFBsdWdpblhkb2NHZW5lcmF0b3IoIHByb2plY3QsIGxvY2FsZSApOwotICAgICAgICAgICAgUGx1Z2luVG9vbHNSZXF1ZXN0IHBsdWdpblRvb2xzUmVxdWVzdCA9IG5ldyBEZWZhdWx0UGx1Z2luVG9vbHNSZXF1ZXN0KCBwcm9qZWN0LCBwbHVnaW5EZXNjcmlwdG9yICk7CisgICAgICAgICAgICBQbHVnaW5YZG9jR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBQbHVnaW5YZG9jR2VuZXJhdG9yKCBnZXRQcm9qZWN0KCksIGxvY2FsZSApOworICAgICAgICAgICAgUGx1Z2luVG9vbHNSZXF1ZXN0IHBsdWdpblRvb2xzUmVxdWVzdCA9IG5ldyBEZWZhdWx0UGx1Z2luVG9vbHNSZXF1ZXN0KCBnZXRQcm9qZWN0KCksIHBsdWdpbkRlc2NyaXB0b3IgKTsKICAgICAgICAgICAgIGdlbmVyYXRvci5leGVjdXRlKCBvdXRwdXREaXIsIHBsdWdpblRvb2xzUmVxdWVzdCApOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoICggR2VuZXJhdG9yRXhjZXB0aW9uIGUgKQpAQCAtNDMxLDE5ICszNTgsMjUgQEAKIAogICAgICAgICBwcml2YXRlIGZpbmFsIFJlcXVpcmVtZW50cyByZXF1aXJlbWVudHM7CiAKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJlcXVpcmVtZW50c0hpc3Rvcnk+IHJlcXVpcmVtZW50c0hpc3RvcmllczsKKwogICAgICAgICBwcml2YXRlIGZpbmFsIFBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvcjsKIAogICAgICAgICBwcml2YXRlIGZpbmFsIExvY2FsZSBsb2NhbGU7CiAKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc0V4dGVuc2lvbnNUb0xvYWQ7CisKICAgICAgICAgLyoqCi0gICAgICAgICAqIEBwYXJhbSBwcm9qZWN0ICAgICAgICAgIG5vdCBudWxsCi0gICAgICAgICAqIEBwYXJhbSByZXF1aXJlbWVudHMgICAgIG5vdCBudWxsCi0gICAgICAgICAqIEBwYXJhbSBzaW5rICAgICAgICAgICAgIG5vdCBudWxsCi0gICAgICAgICAqIEBwYXJhbSBwbHVnaW5EZXNjcmlwdG9yIG5vdCBudWxsCi0gICAgICAgICAqIEBwYXJhbSBsb2NhbGUgICAgICAgICAgIG5vdCBudWxsCisgICAgICAgICAqIEBwYXJhbSBwcm9qZWN0ICAgICAgICAgICAgICAgbm90IG51bGwKKyAgICAgICAgICogQHBhcmFtIHJlcXVpcmVtZW50cyAgICAgICAgICBub3QgbnVsbAorICAgICAgICAgKiBAcGFyYW0gcmVxdWlyZW1lbnRzSGlzdG9yaWVzIG5vdCBudWxsCisgICAgICAgICAqIEBwYXJhbSBzaW5rICAgICAgICAgICAgICAgICAgbm90IG51bGwKKyAgICAgICAgICogQHBhcmFtIHBsdWdpbkRlc2NyaXB0b3IgICAgICBub3QgbnVsbAorICAgICAgICAgKiBAcGFyYW0gbG9jYWxlICAgICAgICAgICAgICAgIG5vdCBudWxsCiAgICAgICAgICAqLwotICAgICAgICBQbHVnaW5PdmVydmlld1JlbmRlcmVyKCBNYXZlblByb2plY3QgcHJvamVjdCwgUmVxdWlyZW1lbnRzIHJlcXVpcmVtZW50cywgU2luayBzaW5rLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IsIExvY2FsZSBsb2NhbGUgKQorICAgICAgICBQbHVnaW5PdmVydmlld1JlbmRlcmVyKCBNYXZlblByb2plY3QgcHJvamVjdCwgUmVxdWlyZW1lbnRzIHJlcXVpcmVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxSZXF1aXJlbWVudHNIaXN0b3J5PiByZXF1aXJlbWVudHNIaXN0b3JpZXMsIFNpbmsgc2luaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yLCBMb2NhbGUgbG9jYWxlLCBib29sZWFuIGhhc0V4dGVuc2lvbnNUb0xvYWQgKQogICAgICAgICB7CiAgICAgICAgICAgICBzdXBlciggc2luayApOwogCkBAIC00NTEsOSArMzg0LDEzIEBACiAKICAgICAgICAgICAgIHRoaXMucmVxdWlyZW1lbnRzID0gKCByZXF1aXJlbWVudHMgPT0gbnVsbCA/IG5ldyBSZXF1aXJlbWVudHMoKSA6IHJlcXVpcmVtZW50cyApOwogCisgICAgICAgICAgICB0aGlzLnJlcXVpcmVtZW50c0hpc3RvcmllcyA9IHJlcXVpcmVtZW50c0hpc3RvcmllczsKKwogICAgICAgICAgICAgdGhpcy5wbHVnaW5EZXNjcmlwdG9yID0gcGx1Z2luRGVzY3JpcHRvcjsKIAogICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CisKKyAgICAgICAgICAgIHRoaXMuaGFzRXh0ZW5zaW9uc1RvTG9hZCA9IGhhc0V4dGVuc2lvbnNUb0xvYWQ7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTQ2OSw3ICs0MDYsNiBAQAogICAgICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICAgICAqLwogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSApCiAgICAgICAgIHB1YmxpYyB2b2lkIHJlbmRlckJvZHkoKQogICAgICAgICB7CiAgICAgICAgICAgICBzdGFydFNlY3Rpb24oIGdldFRpdGxlKCkgKTsKQEAgLTUwMSwxMSArNDM3LDExIEBACiAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb25Db2x1bW5OYW1lID0gZ2V0QnVuZGxlKCBsb2NhbGUgKS5nZXRTdHJpbmcoICJyZXBvcnQucGx1Z2luLmdvYWxzLmNvbHVtbi5kZXNjcmlwdGlvbiIgKTsKICAgICAgICAgICAgIGlmICggaGFzTWF2ZW5SZXBvcnQgKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhYmxlSGVhZGVyKCBuZXcgU3RyaW5nW117IGdvYWxDb2x1bW5OYW1lLCBpc01hdmVuUmVwb3J0LCBkZXNjcmlwdGlvbkNvbHVtbk5hbWUgfSApOworICAgICAgICAgICAgICAgIHRhYmxlSGVhZGVyKCBuZXcgU3RyaW5nW10ge2dvYWxDb2x1bW5OYW1lLCBpc01hdmVuUmVwb3J0LCBkZXNjcmlwdGlvbkNvbHVtbk5hbWV9ICk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFibGVIZWFkZXIoIG5ldyBTdHJpbmdbXXsgZ29hbENvbHVtbk5hbWUsIGRlc2NyaXB0aW9uQ29sdW1uTmFtZSB9ICk7CisgICAgICAgICAgICAgICAgdGFibGVIZWFkZXIoIG5ldyBTdHJpbmdbXSB7Z29hbENvbHVtbk5hbWUsIGRlc2NyaXB0aW9uQ29sdW1uTmFtZX0gKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgTGlzdDxNb2pvRGVzY3JpcHRvcj4gbW9qb3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKQEAgLTU4MSwxOSArNTE3LDIzIEBACiAgICAgICAgICAgICAgICAgKCBqZGsgIT0gbnVsbCA/IGpkayA6IGdldEJ1bmRsZSggbG9jYWxlICkuZ2V0U3RyaW5nKCAicmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHMubm9taW5pbXVtIiApICkgKTsKICAgICAgICAgICAgIHNpbmsudGFibGVSb3dfKCk7CiAKLSAgICAgICAgICAgIHNpbmsudGFibGVSb3coKTsKLSAgICAgICAgICAgIHRhYmxlQ2VsbCggZ2V0QnVuZGxlKCBsb2NhbGUgKS5nZXRTdHJpbmcoICJyZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5tZW1vcnkiICkgKTsKLSAgICAgICAgICAgIHRhYmxlQ2VsbCggKCBTdHJpbmdVdGlscy5pc05vdEVtcHR5KCByZXF1aXJlbWVudHMuZ2V0TWVtb3J5KCkgKQotICAgICAgICAgICAgICAgID8gcmVxdWlyZW1lbnRzLmdldE1lbW9yeSgpCi0gICAgICAgICAgICAgICAgOiBnZXRCdW5kbGUoIGxvY2FsZSApLmdldFN0cmluZyggInJlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLm5vbWluaW11bSIgKSApICk7Ci0gICAgICAgICAgICBzaW5rLnRhYmxlUm93XygpOworICAgICAgICAgICAgU3RyaW5nIG1lbW9yeSA9IHJlcXVpcmVtZW50cy5nZXRNZW1vcnkoKTsKKyAgICAgICAgICAgIGlmICggU3RyaW5nVXRpbHMuaXNOb3RFbXB0eSggbWVtb3J5ICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpbmsudGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICB0YWJsZUNlbGwoIGdldEJ1bmRsZSggbG9jYWxlICkuZ2V0U3RyaW5nKCAicmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHMubWVtb3J5IiApICk7CisgICAgICAgICAgICAgICAgdGFibGVDZWxsKCBtZW1vcnkgKTsKKyAgICAgICAgICAgICAgICBzaW5rLnRhYmxlUm93XygpOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzaW5rLnRhYmxlUm93KCk7Ci0gICAgICAgICAgICB0YWJsZUNlbGwoIGdldEJ1bmRsZSggbG9jYWxlICkuZ2V0U3RyaW5nKCAicmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHMuZGlza3NwYWNlIiApICk7Ci0gICAgICAgICAgICB0YWJsZUNlbGwoICggU3RyaW5nVXRpbHMuaXNOb3RFbXB0eSggcmVxdWlyZW1lbnRzLmdldERpc2tTcGFjZSgpICkKLSAgICAgICAgICAgICAgICA/IHJlcXVpcmVtZW50cy5nZXREaXNrU3BhY2UoKQotICAgICAgICAgICAgICAgIDogZ2V0QnVuZGxlKCBsb2NhbGUgKS5nZXRTdHJpbmcoICJyZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5ub21pbmltdW0iICkgKSApOwotICAgICAgICAgICAgc2luay50YWJsZVJvd18oKTsKKyAgICAgICAgICAgIFN0cmluZyBkaXNrU3BhY2UgPSByZXF1aXJlbWVudHMuZ2V0RGlza1NwYWNlKCk7CisgICAgICAgICAgICBpZiAoIFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoIGRpc2tTcGFjZSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaW5rLnRhYmxlUm93KCk7CisgICAgICAgICAgICAgICAgdGFibGVDZWxsKCBnZXRCdW5kbGUoIGxvY2FsZSApLmdldFN0cmluZyggInJlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmRpc2tzcGFjZSIgKSApOworICAgICAgICAgICAgICAgIHRhYmxlQ2VsbCggZGlza1NwYWNlICk7CisgICAgICAgICAgICAgICAgc2luay50YWJsZVJvd18oKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKCByZXF1aXJlbWVudHMuZ2V0T3RoZXJzKCkgIT0gbnVsbCAmJiByZXF1aXJlbWVudHMuZ2V0T3RoZXJzKCkuc2l6ZSgpID4gMCApCiAgICAgICAgICAgICB7CkBAIC02MTMsMTEgKzU1Myw0NCBAQAogCiAgICAgICAgICAgICBlbmRTZWN0aW9uKCk7CiAKKyAgICAgICAgICAgIHJlbmRlclJlcXVpcmVtZW50c0hpc3RvcmllcygpOworCiAgICAgICAgICAgICByZW5kZXJVc2FnZVNlY3Rpb24oIGhhc01hdmVuUmVwb3J0ICk7CiAKICAgICAgICAgICAgIGVuZFNlY3Rpb24oKTsKICAgICAgICAgfQogCisgICAgICAgIHByaXZhdGUgdm9pZCByZW5kZXJSZXF1aXJlbWVudHNIaXN0b3JpZXMoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHJlcXVpcmVtZW50c0hpc3Rvcmllcy5pc0VtcHR5KCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhcnRTZWN0aW9uKCBnZXRCdW5kbGUoIGxvY2FsZSApLmdldFN0cmluZyggInJlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmhpc3RvcnkiICkgKTsKKyAgICAgICAgICAgIHBhcmFncmFwaCggZ2V0QnVuZGxlKCBsb2NhbGUgKS5nZXRTdHJpbmcoICJyZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5oaXN0b3J5LmludHJvIiApICk7CisKKyAgICAgICAgICAgIHN0YXJ0VGFibGUoKTsKKyAgICAgICAgICAgIHRhYmxlSGVhZGVyKCBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgIGdldEJ1bmRsZSggbG9jYWxlICkuZ2V0U3RyaW5nKCAicmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHMuaGlzdG9yeS52ZXJzaW9uIiApLAorICAgICAgICAgICAgICAgIGdldEJ1bmRsZSggbG9jYWxlICkuZ2V0U3RyaW5nKCAicmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHMuaGlzdG9yeS5tYXZlbiIgKSwKKyAgICAgICAgICAgICAgICBnZXRCdW5kbGUoIGxvY2FsZSApLmdldFN0cmluZyggInJlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmhpc3RvcnkuamRrIiApCisgICAgICAgICAgICB9ICk7CisKKyAgICAgICAgICAgIHJlcXVpcmVtZW50c0hpc3Rvcmllcy5mb3JFYWNoKAorICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50c0hpc3RvcnkgLT4KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNpbmsudGFibGVSb3coKTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGVDZWxsKCByZXF1aXJlbWVudHNIaXN0b3J5LmdldFZlcnNpb24oKSApOworICAgICAgICAgICAgICAgICAgICB0YWJsZUNlbGwoIHJlcXVpcmVtZW50c0hpc3RvcnkuZ2V0TWF2ZW4oKSApOworICAgICAgICAgICAgICAgICAgICB0YWJsZUNlbGwoIHJlcXVpcmVtZW50c0hpc3RvcnkuZ2V0SmRrKCkgKTsKKyAgICAgICAgICAgICAgICAgICAgc2luay50YWJsZVJvd18oKTsKKyAgICAgICAgICAgICAgICB9ICk7CisgICAgICAgICAgICBlbmRUYWJsZSgpOworCisgICAgICAgICAgICBlbmRTZWN0aW9uKCk7CisgICAgICAgIH0KKwogICAgICAgICAvKioKICAgICAgICAgICogUmVuZGVyIHRoZSBzZWN0aW9uIGFib3V0IHRoZSB1c2FnZSBvZiB0aGUgcGx1Z2luLgogICAgICAgICAgKgpAQCAtNjQ4LDYgKzYyMSwxMSBAQAogICAgICAgICAgICAgICAgICI8L2FydGlmYWN0SWQ+IiApLmFwcGVuZCggJ1xuJyApOwogICAgICAgICAgICAgc2IuYXBwZW5kKCAiICAgICAgICAgIDx2ZXJzaW9uPiIgKS5hcHBlbmQoIHBsdWdpbkRlc2NyaXB0b3IuZ2V0VmVyc2lvbigpICkuYXBwZW5kKCAiPC92ZXJzaW9uPiIgKS5hcHBlbmQoCiAgICAgICAgICAgICAgICAgJ1xuJyApOworICAgICAgICAgICAgaWYgKCBoYXNFeHRlbnNpb25zVG9Mb2FkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoICIgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4iICkuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAnXG4nICk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzYi5hcHBlbmQoICIgICAgICAgIDwvcGx1Z2luPiIgKS5hcHBlbmQoICdcbicgKTsKICAgICAgICAgICAgIHNiLmFwcGVuZCggIiAgICAgICAgLi4uIiApLmFwcGVuZCggJ1xuJyApOwogICAgICAgICAgICAgc2IuYXBwZW5kKCAiICAgICAgPC9wbHVnaW5zPiIgKS5hcHBlbmQoICdcbicgKTsKQEAgLTY2MCw4ICs2MzgsNiBAQAogICAgICAgICAgICAgICAgICdcbicgKTsKICAgICAgICAgICAgIHNiLmFwcGVuZCggIiAgICAgICAgPGFydGlmYWN0SWQ+IiApLmFwcGVuZCggcGx1Z2luRGVzY3JpcHRvci5nZXRBcnRpZmFjdElkKCkgKS5hcHBlbmQoCiAgICAgICAgICAgICAgICAgIjwvYXJ0aWZhY3RJZD4iICkuYXBwZW5kKCAnXG4nICk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoICIgICAgICAgIDx2ZXJzaW9uPiIgKS5hcHBlbmQoIHBsdWdpbkRlc2NyaXB0b3IuZ2V0VmVyc2lvbigpICkuYXBwZW5kKCAiPC92ZXJzaW9uPiIgKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgJ1xuJyApOwogICAgICAgICAgICAgc2IuYXBwZW5kKCAiICAgICAgPC9wbHVnaW4+IiApLmFwcGVuZCggJ1xuJyApOwogICAgICAgICAgICAgc2IuYXBwZW5kKCAiICAgICAgLi4uIiApLmFwcGVuZCggJ1xuJyApOwogICAgICAgICAgICAgc2IuYXBwZW5kKCAiICAgIDwvcGx1Z2lucz4iICkuYXBwZW5kKCAnXG4nICk7CkBAIC03NTEsMTMgKzcyNywxOSBAQAogICAgICAgICAgICAgICAgIGNvbXBpbGVyID0gZ2V0Q29tcGlsZXJQbHVnaW4oIHByb2plY3QuZ2V0UGx1Z2luTWFuYWdlbWVudCgpLmdldFBsdWdpbnNBc01hcCgpICk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGpkayA9IGdldFBsdWdpblBhcmFtZXRlciggY29tcGlsZXIsICJ0YXJnZXQiICk7CisgICAgICAgICAgICBqZGsgPSBnZXRQbHVnaW5QYXJhbWV0ZXIoIGNvbXBpbGVyLCAicmVsZWFzZSIgKTsKICAgICAgICAgICAgIGlmICggamRrICE9IG51bGwgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJldHVybiBqZGs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGpkayA9IGdldFBsdWdpblBhcmFtZXRlciggY29tcGlsZXIsICJyZWxlYXNlIiApOworICAgICAgICAgICAgamRrID0gcHJvamVjdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoICJtYXZlbi5jb21waWxlci5yZWxlYXNlIiApOworICAgICAgICAgICAgaWYgKCBqZGsgIT0gbnVsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGpkazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgamRrID0gZ2V0UGx1Z2luUGFyYW1ldGVyKCBjb21waWxlciwgInRhcmdldCIgKTsKICAgICAgICAgICAgIGlmICggamRrICE9IG51bGwgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJldHVybiBqZGs7CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vcGx1Z2luL3JlcG9ydC9SZXF1aXJlbWVudHMuamF2YSBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vcmVwb3J0L1JlcXVpcmVtZW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYzY4YjcKLS0tIC9kZXYvbnVsbAorKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vcGx1Z2luL3JlcG9ydC9SZXF1aXJlbWVudHMuamF2YQpAQCAtMCwwICsxLDk0IEBACitwYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLnBsdWdpbi5yZXBvcnQ7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiBQbHVnaW4gcmVxdWlyZW1lbnRzLgorICoKKyAqIEBkZXByZWNhdGVkIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uCisgKi8KK0BEZXByZWNhdGVkCitwdWJsaWMgY2xhc3MgUmVxdWlyZW1lbnRzCit7CisgICAgLyoqCisgICAgICogVGhlIG1pbmltdW0gdmVyc2lvbiBvZiBNYXZlbiB0byBydW4gdGhpcyBwbHVnaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWF2ZW47CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWluaW11bSB2ZXJzaW9uIG9mIHRoZSBKREsgdG8gcnVuIHRoaXMgcGx1Z2luLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGpkazsKKworICAgIC8qKgorICAgICAqIFRoZSBtaW5pbXVtIG1lbW9yeSBuZWVkZWQgdG8gcnVuIHRoaXMgcGx1Z2luLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIG1lbW9yeTsKKworICAgIC8qKgorICAgICAqIFRoZSBtaW5pbXVtIGRpc2tTcGFjZSBuZWVkZWQgdG8gcnVuIHRoaXMgcGx1Z2luLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGRpc2tTcGFjZTsKKworICAgIC8qKgorICAgICAqIEZpZWxkIG90aGVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGphdmEudXRpbC5Qcm9wZXJ0aWVzIG90aGVyczsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF2ZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1hdmVuOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmRrKCkKKyAgICB7CisgICAgICAgIHJldHVybiBqZGs7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRNZW1vcnkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1lbW9yeTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERpc2tTcGFjZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGlza1NwYWNlOworICAgIH0KKworICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldE90aGVycygpCisgICAgeworICAgICAgICByZXR1cm4gb3RoZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCAiUmVxdWlyZW1lbnRzeyIgKTsKKyAgICAgICAgc2IuYXBwZW5kKCAibWF2ZW49JyIgKS5hcHBlbmQoIG1hdmVuICkuYXBwZW5kKCAnXCcnICk7CisgICAgICAgIHNiLmFwcGVuZCggIiwgamRrPSciICkuYXBwZW5kKCBqZGsgKS5hcHBlbmQoICdcJycgKTsKKyAgICAgICAgc2IuYXBwZW5kKCAiLCBtZW1vcnk9JyIgKS5hcHBlbmQoIG1lbW9yeSApLmFwcGVuZCggJ1wnJyApOworICAgICAgICBzYi5hcHBlbmQoICIsIGRpc2tTcGFjZT0nIiApLmFwcGVuZCggZGlza1NwYWNlICkuYXBwZW5kKCAnXCcnICk7CisgICAgICAgIHNiLmFwcGVuZCggIiwgb3RoZXJzPSIgKS5hcHBlbmQoIG90aGVycyApOworICAgICAgICBzYi5hcHBlbmQoICd9JyApOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vcGx1Z2luL3JlcG9ydC9SZXF1aXJlbWVudHNIaXN0b3J5LmphdmEgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vcGx1Z2luL3JlcG9ydC9SZXF1aXJlbWVudHNIaXN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzOTU1YQotLS0gL2Rldi9udWxsCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vcmVwb3J0L1JlcXVpcmVtZW50c0hpc3RvcnkuamF2YQpAQCAtMCwwICsxLDY5IEBACitwYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLnBsdWdpbi5yZXBvcnQ7CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKgorICogUGx1Z2luIHJlcXVpcmVtZW50cyBoaXN0b3J5LgorICoKKyAqIEBhdXRob3IgU2xhd29taXIgSmFyYW5vd3NraQorICovCitwdWJsaWMgY2xhc3MgUmVxdWlyZW1lbnRzSGlzdG9yeQoreworICAgIC8qKgorICAgICAqIFRoZSBwbHVnaW4gdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB2ZXJzaW9uOworCisgICAgLyoqCisgICAgICogVGhlIG1pbmltdW0gdmVyc2lvbiBvZiBNYXZlbiB0byBydW4gdGhpcyBwbHVnaW4uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgbWF2ZW47CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWluaW11bSB2ZXJzaW9uIG9mIHRoZSBKREsgdG8gcnVuIHRoaXMgcGx1Z2luLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGpkazsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpCisgICAgeworICAgICAgICByZXR1cm4gdmVyc2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hdmVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtYXZlbjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEpkaygpCisgICAgeworICAgICAgICByZXR1cm4gamRrOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCAiUmVxdWlyZW1lbnRzSGlzdG9yeXsiICk7CisgICAgICAgIHNiLmFwcGVuZCggInZlcnNpb249JyIgKS5hcHBlbmQoIHZlcnNpb24gKS5hcHBlbmQoICdcJycgKTsKKyAgICAgICAgc2IuYXBwZW5kKCAiLCBtYXZlbj0nIiApLmFwcGVuZCggbWF2ZW4gKS5hcHBlbmQoICdcJycgKTsKKyAgICAgICAgc2IuYXBwZW5kKCAiLCBqZGs9JyIgKS5hcHBlbmQoIGpkayApLmFwcGVuZCggJ1wnJyApOworICAgICAgICBzYi5hcHBlbmQoICd9JyApOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9tYWluL21kby9wbHVnaW5SZXF1aXJlbWVudHMubWRvIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvbWFpbi9tZG8vcGx1Z2luUmVxdWlyZW1lbnRzLm1kbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUxNmI4MS4uMDAwMDAwMAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9tYWluL21kby9wbHVnaW5SZXF1aXJlbWVudHMubWRvCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtb2RlbCB4bWxucz0iaHR0cHM6Ly9jb2RlaGF1cy1wbGV4dXMuZ2l0aHViLmlvL01PREVMTE8vMS4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwczovL2NvZGVoYXVzLXBsZXh1cy5naXRodWIuaW8vTU9ERUxMTy8xLjAuMCBodHRwczovL2NvZGVoYXVzLXBsZXh1cy5naXRodWIuaW8vbW9kZWxsby94c2QvbW9kZWxsby0xLjAuMC54c2QiPgotICA8aWQ+cGx1Z2luUmVxdWlyZW1lbnRzPC9pZD4KLSAgPG5hbWU+UGx1Z2luUmVxdWlyZW1lbnRzPC9uYW1lPgotICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbTW9kZWwgdG8gc3BlY2lmeSBwbHVnaW4gcmVxdWlyZW1lbnRzLl1dPjwvZGVzY3JpcHRpb24+Ci0gIDxkZWZhdWx0cz4KLSAgICA8ZGVmYXVsdD4KLSAgICAgIDxrZXk+cGFja2FnZTwva2V5PgotICAgICAgPHZhbHVlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLnBsdWdpbjwvdmFsdWU+Ci0gICAgPC9kZWZhdWx0PgotICA8L2RlZmF1bHRzPgotICA8Y2xhc3Nlcz4KLSAgICA8Y2xhc3M+Ci0gICAgICA8bmFtZT5SZXF1aXJlbWVudHM8L25hbWU+Ci0gICAgICA8ZGVzY3JpcHRpb24+UGx1Z2luIHJlcXVpcmVtZW50cy48L2Rlc2NyaXB0aW9uPgotICAgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+Ci0gICAgICA8ZmllbGRzPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+bWF2ZW48L25hbWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBtaW5pbXVtIHZlcnNpb24gb2YgTWF2ZW4gdG8gcnVuIHRoaXMgcGx1Z2luLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDxpZGVudGlmaWVyPnRydWU8L2lkZW50aWZpZXI+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5qZGs8L25hbWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBtaW5pbXVtIHZlcnNpb24gb2YgdGhlIEpESyB0byBydW4gdGhpcyBwbHVnaW4uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGlkZW50aWZpZXI+dHJ1ZTwvaWRlbnRpZmllcj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPm1lbW9yeTwvbmFtZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+VGhlIG1pbmltdW0gbWVtb3J5IG5lZWRlZCB0byBydW4gdGhpcyBwbHVnaW4uPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5kaXNrU3BhY2U8L25hbWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPlRoZSBtaW5pbXVtIGRpc2tTcGFjZSBuZWVkZWQgdG8gcnVuIHRoaXMgcGx1Z2luLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+b3RoZXJzPC9uYW1lPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj5PdGhlcnMgcmVxdWlyZW1lbnRzIHByb3BlcnRpZXMuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5Qcm9wZXJ0aWVzPC90eXBlPgotICAgICAgICAgIDxhc3NvY2lhdGlvbiB4bWwubWFwU3R5bGU9ImlubGluZSI+Ci0gICAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgPC9maWVsZHM+Ci0gICAgPC9jbGFzcz4KLSAgPC9jbGFzc2VzPgotPC9tb2RlbD4KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3BsdWdpbi1yZXBvcnQucHJvcGVydGllcyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3BsdWdpbi1yZXBvcnQucHJvcGVydGllcwppbmRleCAwMWVlOWIzLi43ZDljNDViIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9wbHVnaW4tcmVwb3J0LnByb3BlcnRpZXMKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcGx1Z2luLXJlcG9ydC5wcm9wZXJ0aWVzCkBAIC0zNywxMiArMzcsMTggQEAKIHJlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLm1lbW9yeT1NZW1vcnkKIHJlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmRpc2tzcGFjZT1EaXNrIFNwYWNlCiAKK3JlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmhpc3Rvcnk9U3lzdGVtIFJlcXVpcmVtZW50cyBIaXN0b3J5CityZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5oaXN0b3J5LmludHJvPVRoZSBmb2xsb3dpbmcgc3BlY2lmaWVzIHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50cyB0byBydW4gdGhpcyBNYXZlbiBwbHVnaW4gZm9yIGhpc3RvcmljYWwgdmVyc2lvbnM6CityZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5oaXN0b3J5LnZlcnNpb249UGx1Z2luIFZlcnNpb24KK3JlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmhpc3RvcnkubWF2ZW49TWF2ZW4KK3JlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmhpc3RvcnkuamRrPUpESworCiByZXBvcnQucGx1Z2luLnVzYWdlPVVzYWdlCiByZXBvcnQucGx1Z2luLnVzYWdlLmludHJvPVlvdSBzaG91bGQgc3BlY2lmeSB0aGUgdmVyc2lvbiBpbiB5b3VyIHByb2plY3QncyBwbHVnaW4gY29uZmlndXJhdGlvbjoKIHJlcG9ydC5wbHVnaW4udXNhZ2UucGx1Z2luTWFuYWdlbWVudD1UbyBkZWZpbmUgdGhlIHBsdWdpbiB2ZXJzaW9uIGluIHlvdXIgcGFyZW50IFBPTQogcmVwb3J0LnBsdWdpbi51c2FnZS5wbHVnaW5zPVRvIHVzZSB0aGUgcGx1Z2luIGdvYWxzIGluIHlvdXIgUE9NIG9yIHBhcmVudCBQT00KIHJlcG9ydC5wbHVnaW4udXNhZ2UucmVwb3J0aW5nPVRvIHVzZSB0aGUgcmVwb3J0IGdvYWxzIGluIHlvdXIgUE9NIG9yIHBhcmVudCBQT00KLXJlcG9ydC5wbHVnaW4uY29uZmlndXJhdGlvbi5lbmQ9Rm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB7Ikd1aWRlIHRvIENvbmZpZ3VyaW5nIFBsdWctaW5zIiwgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvZ3VpZGVzL21pbmkvZ3VpZGUtY29uZmlndXJpbmctcGx1Z2lucy5odG1sfQorcmVwb3J0LnBsdWdpbi5jb25maWd1cmF0aW9uLmVuZD1Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHsiR3VpZGUgdG8gQ29uZmlndXJpbmcgUGx1Zy1pbnMiLCBodHRwczovL21hdmVuLmFwYWNoZS5vcmcvZ3VpZGVzL21pbmkvZ3VpZGUtY29uZmlndXJpbmctcGx1Z2lucy5odG1sfQogCiByZXBvcnQucGx1Z2luLmlzUmVwb3J0PVllcwogcmVwb3J0LnBsdWdpbi5pc05vdFJlcG9ydD1ObwpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcGx1Z2luLXJlcG9ydF9kZS5wcm9wZXJ0aWVzIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcGx1Z2luLXJlcG9ydF9kZS5wcm9wZXJ0aWVzCmluZGV4IDAxNzM2ZTEuLmU4N2U1YzAgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3BsdWdpbi1yZXBvcnRfZGUucHJvcGVydGllcworKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9wbHVnaW4tcmVwb3J0X2RlLnByb3BlcnRpZXMKQEAgLTIxLDggKzIxLDggQEAKIHJlcG9ydC5wbHVnaW4uZGVzY3JpcHRpb249RGllc2VyIEJlcmljaHQgZG9rdW1lbnRpZXJ0IGRpZSBHb2FscyBkZXMgUGx1Z2lucyB1bmQgZGVyZW4gUGFyYW1ldGVyLgogcmVwb3J0LnBsdWdpbi50aXRsZT1QbHVnaW4tRG9rdW1lbnRhdGlvbgogCi1yZXBvcnQucGx1Z2luLmdvYWxzLm5vZ29hbD1LZWluZSBHb2FscyB2ZXJmXHUwMGZjZ2Jhci4KLXJlcG9ydC5wbHVnaW4uZ29hbHMuaW50cm89VmVyZlx1MDBmY2diYXJlIEdvYWxzIGRpZXNlcyBQbHVnaW5zOgorcmVwb3J0LnBsdWdpbi5nb2Fscy5ub2dvYWw9S2VpbmUgR29hbHMgdmVyZlx1MDBGQ2diYXIuCityZXBvcnQucGx1Z2luLmdvYWxzLmludHJvPVZlcmZcdTAwRkNnYmFyZSBHb2FscyBkaWVzZXMgUGx1Z2luczoKIHJlcG9ydC5wbHVnaW4uZ29hbHMuY29sdW1uLmdvYWw9R29hbAogcmVwb3J0LnBsdWdpbi5nb2Fscy5jb2x1bW4uaXNNYXZlblJlcG9ydD1CZXJpY2h0PwogcmVwb3J0LnBsdWdpbi5nb2Fscy5jb2x1bW4uZGVzY3JpcHRpb249QmVzY2hyZWlidW5nCkBAIC0zMCwxOSArMzAsMjUgQEAKIHJlcG9ydC5wbHVnaW4uZ29hbC5kZXByZWNhdGVkPU1pc3NiaWxsaWd0LgogCiByZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cz1TeXN0ZW12b3JhdXNzZXR6dW5nZW4KLXJlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmludHJvPURpZSBmb2xnZW5kZSBUYWJlbGxlIGxpc3RldCBkaWUgTWluZGVzdGFuZm9yZGVydW5nZW4genVtIEF1c2ZcdTAwZmNocmVuIGRpZXNlcyBQbHVnaW5zIGF1ZjoKK3JlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmludHJvPURpZSBmb2xnZW5kZSBUYWJlbGxlIGxpc3RldCBkaWUgTWluZGVzdGFuZm9yZGVydW5nZW4genVtIEF1c2ZcdTAwRkNocmVuIGRpZXNlcyBQbHVnaW5zIGF1ZjoKIHJlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLm5vbWluaW11bT1LZWluZSBNaW5kZXN0YW5mb3JkZXJ1bmcuCiByZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5tYXZlbj1NYXZlbgogcmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHMuamRrPUpESwogcmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHMubWVtb3J5PUFyYmVpdHNzcGVpY2hlcgogcmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHMuZGlza3NwYWNlPUZlc3RwbGF0dGUKIAorcmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHMuaGlzdG9yeT1IaXN0b3JpZSBkZXIgU3lzdGVtdm9yYXVzc2V0enVuZ2VuCityZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5oaXN0b3J5LmludHJvPUluIGRlciBmb2xnZW5kZW4gVGFiZWxsZSBzaW5kIGRpZSBNaW5kZXN0YW5mb3JkZXJ1bmdlbiB6dW0gQXVzZlx1MDBGQ2hyZW4gZGllc2VzIFBsdWctaW5zIGZcdTAwRkNyIGhpc3RvcmlzY2hlIFZlcnNpb25lbiBhdWZnZWZcdTAwRkNocnQ6CityZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5oaXN0b3J5LnZlcnNpb249UGx1Z2luIFZlcnNpb24KK3JlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmhpc3RvcnkubWF2ZW49TWF2ZW4KK3JlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmhpc3RvcnkuamRrPUpESworCiByZXBvcnQucGx1Z2luLnVzYWdlPUdlYnJhdWNoCi1yZXBvcnQucGx1Z2luLnVzYWdlLmludHJvPUdlYmVuIFNpZSBkaWUgZ2V3XHUwMGZjbnNjaHRlIFZlcnNpb24gZWluZmFjaCBpbiBkZXIgUGx1Z2luLUtvbmZpZ3VyYXRpb24gSWhyZXMgUHJvamVrdHMgYW46CityZXBvcnQucGx1Z2luLnVzYWdlLmludHJvPUdlYmVuIFNpZSBkaWUgZ2V3XHUwMEZDbnNjaHRlIFZlcnNpb24gZWluZmFjaCBpbiBkZXIgUGx1Z2luLUtvbmZpZ3VyYXRpb24gSWhyZXMgUHJvamVrdHMgYW46CiByZXBvcnQucGx1Z2luLnVzYWdlLnBsdWdpbk1hbmFnZW1lbnQ9WnVtIERlZmluaWVyZW4gZGVyIFBsdWdpbi1WZXJzaW9uIGluIGRlciBFbHRlcm4tUE9NCi1yZXBvcnQucGx1Z2luLnVzYWdlLnBsdWdpbnM9WnVtIFZlcndlbmRlbiBkZXIgUGx1Z2luLUdvYWxzIHdcdTAwZTRocmVuZCBkZXMgQnVpbGQtVm9yZ2FuZ3MgZWluZXMgUHJvamVrdHMKLXJlcG9ydC5wbHVnaW4udXNhZ2UucmVwb3J0aW5nPVp1bSBFcnpldWdlbiBkZXIgQmVyaWNodGUgZlx1MDBmY3IgZGllIFByb2pla3Rkb2t1bWVudGF0aW9uCi1yZXBvcnQucGx1Z2luLmNvbmZpZ3VyYXRpb24uZW5kPUZcdTAwZmNyIHdlaXRlcmdlaGVuZGUgSW5mb3JtYXRpb25lbiBsZXNlbiBTaWUgYml0dGUgZGVuIEFydGlrZWwgeyJHdWlkZSB0byBDb25maWd1cmluZyBQbHVnLWlucyIsIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2d1aWRlcy9taW5pL2d1aWRlLWNvbmZpZ3VyaW5nLXBsdWdpbnMuaHRtbH0uCityZXBvcnQucGx1Z2luLnVzYWdlLnBsdWdpbnM9WnVtIFZlcndlbmRlbiBkZXIgUGx1Z2luLUdvYWxzIHdcdTAwRTRocmVuZCBkZXMgQnVpbGQtVm9yZ2FuZ3MgZWluZXMgUHJvamVrdHMKK3JlcG9ydC5wbHVnaW4udXNhZ2UucmVwb3J0aW5nPVp1bSBFcnpldWdlbiBkZXIgQmVyaWNodGUgZlx1MDBGQ3IgZGllIFByb2pla3Rkb2t1bWVudGF0aW9uCityZXBvcnQucGx1Z2luLmNvbmZpZ3VyYXRpb24uZW5kPUZcdTAwRkNyIHdlaXRlcmdlaGVuZGUgSW5mb3JtYXRpb25lbiBsZXNlbiBTaWUgYml0dGUgZGVuIEFydGlrZWwgeyJHdWlkZSB0byBDb25maWd1cmluZyBQbHVnLWlucyIsIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9ndWlkZXMvbWluaS9ndWlkZS1jb25maWd1cmluZy1wbHVnaW5zLmh0bWx9LgogCiByZXBvcnQucGx1Z2luLmlzUmVwb3J0PUphCiByZXBvcnQucGx1Z2luLmlzTm90UmVwb3J0PU5laW4KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3BsdWdpbi1yZXBvcnRfZnIucHJvcGVydGllcyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3BsdWdpbi1yZXBvcnRfZnIucHJvcGVydGllcwppbmRleCBkNzFkODQwLi4yYWM3YjNmIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9wbHVnaW4tcmVwb3J0X2ZyLnByb3BlcnRpZXMKKysrIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcGx1Z2luLXJlcG9ydF9mci5wcm9wZXJ0aWVzCkBAIC0xOCw3ICsxOCw3IEBACiAjCiAKIHJlcG9ydC5wbHVnaW4ubmFtZT1Eb2N1bWVudGF0aW9uIGR1IHBsdWdpbgotcmVwb3J0LnBsdWdpbi5kZXNjcmlwdGlvbj1DZSByYXBwb3J0IGZvdXJuaXQgZGUgbGEgZG9jdW1lbnRhdGlvbiBzdXIgbGVzIGdvYWxzIGV0IGxlcyBwYXJhbVx1MDBlYXRyZXMgZCd1biBwbHVnaW4uCityZXBvcnQucGx1Z2luLmRlc2NyaXB0aW9uPUNlIHJhcHBvcnQgZm91cm5pdCBkZSBsYSBkb2N1bWVudGF0aW9uIHN1ciBsZXMgZ29hbHMgZXQgbGVzIHBhcmFtXHUwMEVBdHJlcyBkJ3VuIHBsdWdpbi4KIHJlcG9ydC5wbHVnaW4udGl0bGU9RG9jdW1lbnRhdGlvbiBkdSBwbHVnaW4KIAogcmVwb3J0LnBsdWdpbi5nb2Fscy5ub2dvYWw9QXVjdW4gZ29hbCBkaXNwb25pYmxlLgpAQCAtMjcsMjIgKzI3LDI4IEBACiByZXBvcnQucGx1Z2luLmdvYWxzLmNvbHVtbi5pc01hdmVuUmVwb3J0PVJhcHBvcnQ/CiByZXBvcnQucGx1Z2luLmdvYWxzLmNvbHVtbi5kZXNjcmlwdGlvbj1EZXNjcmlwdGlvbgogcmVwb3J0LnBsdWdpbi5nb2FsLm5vZGVzY3JpcHRpb249UGFzIGRlIGRlc2NyaXB0aW9uLgotcmVwb3J0LnBsdWdpbi5nb2FsLmRlcHJlY2F0ZWQ9T2Jzb2xcdTAwZTh0ZS4KK3JlcG9ydC5wbHVnaW4uZ29hbC5kZXByZWNhdGVkPU9ic29sXHUwMEU4dGUuCiAKLXJlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzPUV4aWdlbmNlcyBTeXN0XHUwMGU4bWVzCi1yZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5pbnRybz1DZSBxdWkgc3VpdCBzcFx1MDBlOWNpZmllIGxlcyBleGlnZW5jZXMgbWluaW1hbGVzIHBvdXIgZXhcdTAwZTljdXRlciBjZSBwbHVnaW4gTWF2ZW4gOgorcmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHM9RXhpZ2VuY2VzIFN5c3RcdTAwRThtZXMKK3JlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmludHJvPUNlIHF1aSBzdWl0IHNwXHUwMEU5Y2lmaWUgbGVzIGV4aWdlbmNlcyBtaW5pbWFsZXMgcG91ciBleFx1MDBFOWN1dGVyIGNlIHBsdWdpbiBNYXZlbiA6CiByZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5ub21pbmltdW09IEF1Y3VuZSBleGlnZW5jZSBtaW5pbWFsZS4KIHJlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLm1hdmVuPU1hdmVuCiByZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5qZGs9SkRLCi1yZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5tZW1vcnk9TVx1MDBlOW1vaXJlCityZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5tZW1vcnk9TVx1MDBFOW1vaXJlCiByZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5kaXNrc3BhY2U9RXNwYWNlIERpc3F1ZQogCityZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5oaXN0b3J5PUhpc3RvcmlxdWUgZGVzIEV4aWdlbmNlcyBTeXN0XHUwMEU4bWVzCityZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5oaXN0b3J5LmludHJvPUNlIHF1aSBzdWl0IHNwXHUwMEU5Y2lmaWUgbGVzIGV4aWdlbmNlcyBtaW5pbWFsZXMgcG91ciBleFx1MDBFOWN1dGVyIGNlIHBsdWdpbiBNYXZlbiBwb3VyIGxlcyB2ZXJzaW9ucyBoaXN0b3JpcXVlczoKK3JlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmhpc3RvcnkudmVyc2lvbj1WZXJzaW9uIGR1IFBsdWdpbgorcmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHMuaGlzdG9yeS5tYXZlbj1NYXZlbgorcmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHMuaGlzdG9yeS5qZGs9SkRLCisKIHJlcG9ydC5wbHVnaW4udXNhZ2U9VXRpbGlzYXRpb24KLXJlcG9ydC5wbHVnaW4udXNhZ2UuaW50cm89Vm91cyBkZXZleiBzcFx1MDBlOWNpZmllciBsYSB2ZXJzaW9uIGRhbnMgbGEgY29uZmlndXJhdGlvbiBkZSB2b3RyZSBwcm9qZXQgOgotcmVwb3J0LnBsdWdpbi51c2FnZS5wbHVnaW5NYW5hZ2VtZW50PVBvdXIgZFx1MDBlOWZpbmlyIGxhIHZlcnNpb24gZHUgcGx1Z2luIGRhbnMgbGUgUE9NIHBhcmVudAorcmVwb3J0LnBsdWdpbi51c2FnZS5pbnRybz1Wb3VzIGRldmV6IHNwXHUwMEU5Y2lmaWVyIGxhIHZlcnNpb24gZGFucyBsYSBjb25maWd1cmF0aW9uIGRlIHZvdHJlIHByb2pldCA6CityZXBvcnQucGx1Z2luLnVzYWdlLnBsdWdpbk1hbmFnZW1lbnQ9UG91ciBkXHUwMEU5ZmluaXIgbGEgdmVyc2lvbiBkdSBwbHVnaW4gZGFucyBsZSBQT00gcGFyZW50CiByZXBvcnQucGx1Z2luLnVzYWdlLnBsdWdpbnM9UG91ciB1dGlsaXNlciBsZXMgZ29hbHMgZHUgcGx1Z2luIGRhbnMgdm90cmUgUE9NIG91IFBPTSBwYXJlbnQKIHJlcG9ydC5wbHVnaW4udXNhZ2UucmVwb3J0aW5nPVBvdXIgdXRpbGlzZXIgbGVzIGdvYWxzIGRlIHJhcHBvcnRzIGRhbnMgdm90cmUgUE9NIG91IFBPTSBwYXJlbnQKLXJlcG9ydC5wbHVnaW4uY29uZmlndXJhdGlvbi5lbmQ9UG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLCBjb25zdWx0ZXogeyJHdWlkZSB0byBDb25maWd1cmluZyBQbHVnLWlucyIsIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2d1aWRlcy9taW5pL2d1aWRlLWNvbmZpZ3VyaW5nLXBsdWdpbnMuaHRtbH0KK3JlcG9ydC5wbHVnaW4uY29uZmlndXJhdGlvbi5lbmQ9UG91ciBwbHVzIGQnaW5mb3JtYXRpb25zLCBjb25zdWx0ZXogeyJHdWlkZSB0byBDb25maWd1cmluZyBQbHVnLWlucyIsIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9ndWlkZXMvbWluaS9ndWlkZS1jb25maWd1cmluZy1wbHVnaW5zLmh0bWx9CiAKIHJlcG9ydC5wbHVnaW4uaXNSZXBvcnQ9T3VpCiByZXBvcnQucGx1Z2luLmlzTm90UmVwb3J0PU5vbgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcGx1Z2luLXJlcG9ydF9zdi5wcm9wZXJ0aWVzIGIvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcGx1Z2luLXJlcG9ydF9zdi5wcm9wZXJ0aWVzCmluZGV4IGNmMDQ3OTUuLjBlODA2ZTQgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3BsdWdpbi1yZXBvcnRfc3YucHJvcGVydGllcworKysgYi9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9wbHVnaW4tcmVwb3J0X3N2LnByb3BlcnRpZXMKQEAgLTE4LDMxICsxOCwzNyBAQAogIwogCiByZXBvcnQucGx1Z2luLm5hbWU9UGx1Z2luZG9rdW1lbnRhdGlvbgotcmVwb3J0LnBsdWdpbi5kZXNjcmlwdGlvbj1EZW5uYSByYXBwb3J0IHRpbGxoYW5kYWjlbGxlciBt5WwtIG9jaCBwYXJhbWV0ZXJkb2t1bWVudGF0aW9uIGb2ciBlbiBwbHVnaW4uCityZXBvcnQucGx1Z2luLmRlc2NyaXB0aW9uPURlbm5hIHJhcHBvcnQgdGlsbGhhbmRhaFx1MDBFNWxsZXIgbVx1MDBFNWwtIG9jaCBwYXJhbWV0ZXJkb2t1bWVudGF0aW9uIGZcdTAwRjZyIGVuIHBsdWdpbi4KIHJlcG9ydC5wbHVnaW4udGl0bGU9UGx1Z2luZG9rdW1lbnRhdGlvbgogCi1yZXBvcnQucGx1Z2luLmdvYWxzLm5vZ29hbD1JbmdhIG3lbCB0aWxsZ+RuZ2xpZ2Eg5G5udS4KLXJlcG9ydC5wbHVnaW4uZ29hbHMuaW50cm89VGlsbGfkbmdsaWdhIG3lbCBm9nIgZGVubmEgcGx1Z2luOgotcmVwb3J0LnBsdWdpbi5nb2Fscy5jb2x1bW4uZ29hbD1N5WwKK3JlcG9ydC5wbHVnaW4uZ29hbHMubm9nb2FsPUluZ2EgbVx1MDBFNWwgdGlsbGdcdTAwRTRuZ2xpZ2EgXHUwMEU0bm51LgorcmVwb3J0LnBsdWdpbi5nb2Fscy5pbnRybz1UaWxsZ1x1MDBFNG5nbGlnYSBtXHUwMEU1bCBmXHUwMEY2ciBkZW5uYSBwbHVnaW46CityZXBvcnQucGx1Z2luLmdvYWxzLmNvbHVtbi5nb2FsPU1cdTAwRTVsCiByZXBvcnQucGx1Z2luLmdvYWxzLmNvbHVtbi5pc01hdmVuUmVwb3J0PVJhcHBvcnQ/CiByZXBvcnQucGx1Z2luLmdvYWxzLmNvbHVtbi5kZXNjcmlwdGlvbj1CZXNrcml2bmluZwogcmVwb3J0LnBsdWdpbi5nb2FsLm5vZGVzY3JpcHRpb249SW5nZW4gYmVza3Jpdm5pbmcuCi1yZXBvcnQucGx1Z2luLmdvYWwuZGVwcmVjYXRlZD1G9nLlbGRyYXQuCityZXBvcnQucGx1Z2luLmdvYWwuZGVwcmVjYXRlZD1GXHUwMEY2clx1MDBFNWxkcmF0LgogCiByZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cz1TeXN0ZW1rcmF2Ci1yZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5pbnRybz1G9mxqYW5kZSBtaW5pbWlrcmF2IHN05GxscyBm9nIgYXR0IGv2cmEgZGVubmEgTWF2ZW4gcGx1Z2luOgorcmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHMuaW50cm89Rlx1MDBGNmxqYW5kZSBtaW5pbWlrcmF2IHN0XHUwMEU0bGxzIGZcdTAwRjZyIGF0dCBrXHUwMEY2cmEgZGVubmEgTWF2ZW4gcGx1Z2luOgogcmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHMubm9taW5pbXVtPSBJbmdhIG1pbmltaWtyYXYuCiByZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5tYXZlbj1NYXZlbgogcmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHMuamRrPUpESwogcmVwb3J0LnBsdWdpbi5zeXN0ZW1yZXF1aXJlbWVudHMubWVtb3J5PU1pbm5lCiByZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5kaXNrc3BhY2U9RGlza3V0cnltbWUKIAotcmVwb3J0LnBsdWdpbi51c2FnZT1BbnbkbmRuaW5nCi1yZXBvcnQucGx1Z2luLnVzYWdlLmludHJvPUR1IGL2ciBzcGVjaWZpY2VyYSB2ZXJzaW9uZW4gaSBkaXR0IHByb2pla3RzIHBsdWdpbmtvbmZpZ3VyYXRpb246Ci1yZXBvcnQucGx1Z2luLnVzYWdlLnBsdWdpbk1hbmFnZW1lbnQ9RvZyIGF0dCBkZWZpbmllcmEgcGx1Z2ludmVyc2lvbiBpIGRpbiBm9nLkbGRyYS1QT00KLXJlcG9ydC5wbHVnaW4udXNhZ2UucGx1Z2lucz1G9nIgYXR0IGFuduRuZGEgcGx1Z2luLW3lbGVuIGkgZGluIFBPTSBlbGxlciBm9nLkbGRyYS1QT00KLXJlcG9ydC5wbHVnaW4udXNhZ2UucmVwb3J0aW5nPUb2ciBhdHQgYW525G5kYSByYXBwb3J0LW3lbGVuIGkgZGluIFBPTSBlbGxlciBm9nLkbGRyYS1QT00KLXJlcG9ydC5wbHVnaW4uY29uZmlndXJhdGlvbi5lbmQ9RvZyIG1lciBpbmZvcm1hdGlvbiwgbORzIHsiR3VpZGUgdG8gQ29uZmlndXJpbmcgUGx1Zy1pbnMiLCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9ndWlkZXMvbWluaS9ndWlkZS1jb25maWd1cmluZy1wbHVnaW5zLmh0bWx9IChw5SBlbmdlbHNrYSkuCityZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5oaXN0b3J5PVN5c3RlbWtyYXZzaGlzdG9yaWsKK3JlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmhpc3RvcnkuaW50cm89Rlx1MDBGNmxqYW5kZSBhbmdlciBtaW5pbWlrcmF2ZW4gZlx1MDBGNnIgYXR0IGtcdTAwRjZyYSBkZXR0YSBNYXZlbi1wbHVnaW4gZlx1MDBGNnIgaGlzdG9yaXNrYSB2ZXJzaW9uZXI6CityZXBvcnQucGx1Z2luLnN5c3RlbXJlcXVpcmVtZW50cy5oaXN0b3J5LnZlcnNpb249UGx1Z2luIFZlcnNpb24KK3JlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmhpc3RvcnkubWF2ZW49TWF2ZW4KK3JlcG9ydC5wbHVnaW4uc3lzdGVtcmVxdWlyZW1lbnRzLmhpc3RvcnkuamRrPUpESworCityZXBvcnQucGx1Z2luLnVzYWdlPUFudlx1MDBFNG5kbmluZworcmVwb3J0LnBsdWdpbi51c2FnZS5pbnRybz1EdSBiXHUwMEY2ciBzcGVjaWZpY2VyYSB2ZXJzaW9uZW4gaSBkaXR0IHByb2pla3RzIHBsdWdpbmtvbmZpZ3VyYXRpb246CityZXBvcnQucGx1Z2luLnVzYWdlLnBsdWdpbk1hbmFnZW1lbnQ9Rlx1MDBGNnIgYXR0IGRlZmluaWVyYSBwbHVnaW52ZXJzaW9uIGkgZGluIGZcdTAwRjZyXHUwMEU0bGRyYS1QT00KK3JlcG9ydC5wbHVnaW4udXNhZ2UucGx1Z2lucz1GXHUwMEY2ciBhdHQgYW52XHUwMEU0bmRhIHBsdWdpbi1tXHUwMEU1bGVuIGkgZGluIFBPTSBlbGxlciBmXHUwMEY2clx1MDBFNGxkcmEtUE9NCityZXBvcnQucGx1Z2luLnVzYWdlLnJlcG9ydGluZz1GXHUwMEY2ciBhdHQgYW52XHUwMEU0bmRhIHJhcHBvcnQtbVx1MDBFNWxlbiBpIGRpbiBQT00gZWxsZXIgZlx1MDBGNnJcdTAwRTRsZHJhLVBPTQorcmVwb3J0LnBsdWdpbi5jb25maWd1cmF0aW9uLmVuZD1GXHUwMEY2ciBtZXIgaW5mb3JtYXRpb24sIGxcdTAwRTRzIHsiR3VpZGUgdG8gQ29uZmlndXJpbmcgUGx1Zy1pbnMiLCBodHRwczovL21hdmVuLmFwYWNoZS5vcmcvZ3VpZGVzL21pbmkvZ3VpZGUtY29uZmlndXJpbmctcGx1Z2lucy5odG1sfSAocFx1MDBFNSBlbmdlbHNrYSkuCiAKIHJlcG9ydC5wbHVnaW4uaXNSZXBvcnQ9SmEKIHJlcG9ydC5wbHVnaW4uaXNOb3RSZXBvcnQ9TmVqCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vcGx1Z2luL0Fic3RyYWN0R2VuZXJhdG9yTW9qb1Rlc3QuamF2YSBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vQWJzdHJhY3RHZW5lcmF0b3JNb2pvVGVzdC5qYXZhCmluZGV4IGQxZThjM2IuLjVjMzYzMzAgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vQWJzdHJhY3RHZW5lcmF0b3JNb2pvVGVzdC5qYXZhCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vQWJzdHJhY3RHZW5lcmF0b3JNb2pvVGVzdC5qYXZhCkBAIC0yMywxMiArMjMsMTMgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKIAogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLlRlc3Q7CiAKKy8vIGF0IGxlYXN0IG9uZSB0ZXN0IGNsYXNzIG11c3QgYmUgcHVibGljIGZvciB0ZXN0LWphdmFkb2MgcmVwb3J0CiBwdWJsaWMgY2xhc3MgQWJzdHJhY3RHZW5lcmF0b3JNb2pvVGVzdAogewogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgZGVmYXVsdEdvYWxQcmVmaXgoKQorICAgIHZvaWQgZGVmYXVsdEdvYWxQcmVmaXgoKQogICAgIHsKICAgICAgICAgYXNzZXJ0VGhhdCggQWJzdHJhY3RHZW5lcmF0b3JNb2pvLmdldERlZmF1bHRHb2FsUHJlZml4KCBuZXdQcm9qZWN0KCBudWxsLCAibWF2ZW4tcGx1Z2luLXBsdWdpbiIgKSApLAogICAgICAgICAgICAgICAgICAgICBpcyggInBsdWdpbiIgKSApOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL3BsdWdpbi9IZWxwR2VuZXJhdG9yTW9qb1Rlc3QuamF2YSBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vSGVscEdlbmVyYXRvck1vam9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ2NTcwOQotLS0gL2Rldi9udWxsCisrKyBiL21hdmVuLXBsdWdpbi1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9wbHVnaW4vSGVscEdlbmVyYXRvck1vam9UZXN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5wbHVnaW47CisKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5wYXJhbXMuUGFyYW1ldGVyaXplZFRlc3Q7CitpbXBvcnQgb3JnLmp1bml0Lmp1cGl0ZXIucGFyYW1zLnByb3ZpZGVyLkFyZ3VtZW50czsKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5wYXJhbXMucHJvdmlkZXIuTWV0aG9kU291cmNlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmFzc2VydEVxdWFsczsKKworY2xhc3MgSGVscEdlbmVyYXRvck1vam9UZXN0Cit7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmVhbTxBcmd1bWVudHM+IHBhY2thZ2VOYW1lU2hvdWxkQmVDb3JyZWN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJlYW0ub2YoCisgICAgICAgICAgICBBcmd1bWVudHMub2YoIGFQcm9qZWN0KCAiZ3JvdXBJZCIsICJhcnRpZmFjdElkIiApLCAiZ3JvdXBJZC5hcnRpZmFjdElkIiApLAorICAgICAgICAgICAgQXJndW1lbnRzLm9mKCBhUHJvamVjdCggImdyb3VwSWQiLCAiMTIzLWFydGlmYWN0SWQiICksICJncm91cElkLl8xMjNfYXJ0aWZhY3RJZCIgKSwKKyAgICAgICAgICAgIEFyZ3VtZW50cy5vZiggYVByb2plY3QoICJncm91cC1JZCIsICJhcnRpZmFjdC1JZCIgKSwgImdyb3VwX0lkLmFydGlmYWN0X0lkIiApLAorICAgICAgICAgICAgQXJndW1lbnRzLm9mKCBhUHJvamVjdCggImdyb3VwLUlkIiwgImludCIgKSwgImdyb3VwX0lkLl9pbnQiICkKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAUGFyYW1ldGVyaXplZFRlc3QKKyAgICBATWV0aG9kU291cmNlCisgICAgdm9pZCBwYWNrYWdlTmFtZVNob3VsZEJlQ29ycmVjdCggTWF2ZW5Qcm9qZWN0IHByb2plY3QsIFN0cmluZyBleHBlY3RlZFBhY2thZ2VOYW1lICkKKyAgICB7CisgICAgICAgIEhlbHBHZW5lcmF0b3JNb2pvIG1vam8gPSBuZXcgSGVscEdlbmVyYXRvck1vam8oKTsKKyAgICAgICAgbW9qby5wcm9qZWN0ID0gcHJvamVjdDsKKworICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBtb2pvLmdldEhlbHBQYWNrYWdlTmFtZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIGV4cGVjdGVkUGFja2FnZU5hbWUsIHBhY2thZ2VOYW1lICk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWF2ZW5Qcm9qZWN0IGFQcm9qZWN0KCBTdHJpbmcgZ3JvdXBJZCwgU3RyaW5nIGFydGlmYWN0SWQgKQorICAgIHsKKworICAgICAgICBNYXZlblByb2plY3QgbWF2ZW5Qcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCgpOworICAgICAgICBtYXZlblByb2plY3Quc2V0R3JvdXBJZCggZ3JvdXBJZCApOworICAgICAgICBtYXZlblByb2plY3Quc2V0QXJ0aWZhY3RJZCggYXJ0aWZhY3RJZCApOworICAgICAgICByZXR1cm4gbWF2ZW5Qcm9qZWN0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9wb20ueG1sIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFubm90YXRpb25zL3BvbS54bWwKaW5kZXggYzkyOTAzNC4uZDIwY2Y2NCAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWFubm90YXRpb25zL3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFubm90YXRpb25zL3BvbS54bWwKQEAgLTYyLDE5ICs2MiwxMyBAQAogICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcG9uZW50LWFubm90YXRpb25zPC9hcnRpZmFjdElkPgotICAgICAgPGV4Y2x1c2lvbnM+Ci0gICAgICAgIDxleGNsdXNpb24+Ci0gICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDwvZXhjbHVzaW9uPgotICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2Uuc2lzdTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnNpc3UucGxleHVzPC9hcnRpZmFjdElkPgorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtYXJjaGl2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjQuMi41PC92ZXJzaW9uPjwhLS0gSmF2YSA3IC0tPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgCiAgICAgPGRlcGVuZGVuY3k+CkBAIC04OCwyNSArODIsMjMgQEAKICAgICA8L2RlcGVuZGVuY3k+CiAKICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcGlsZXItbWFuYWdlcjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuOC44PC92ZXJzaW9uPjwhLS0gSmF2YSA3IC0tPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1jb3JlPC9hcnRpZmFjdElkPgogICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8Z3JvdXBJZD5vcmcuanVuaXQuanVwaXRlcjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0LWp1cGl0ZXItZW5naW5lPC9hcnRpZmFjdElkPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdGVzdGluZzwvYXJ0aWZhY3RJZD4KICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXNzZXJ0ajwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmFzc2VydGotY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuOS4xPC92ZXJzaW9uPjwhLS0gSmF2YSA3IC0tPgogICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CkBAIC0xMTQsNiArMTA2LDEwIEBACiAgIDxidWlsZD4KICAgICA8cGx1Z2lucz4KICAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnNpc3U8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnNpc3UtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgIDxleGVjdXRpb25zPgpAQCAtMTI1LDEwICsxMjEsNiBAQAogICAgICAgICA8L2V4ZWN1dGlvbnM+CiAgICAgICA8L3BsdWdpbj4KICAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21wb25lbnQtbWV0YWRhdGE8L2FydGlmYWN0SWQ+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgPGV4ZWN1dGlvbnM+CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvSmF2YUFubm90YXRpb25zTW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3IuamF2YSBiL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9KYXZhQW5ub3RhdGlvbnNNb2pvRGVzY3JpcHRvckV4dHJhY3Rvci5qYXZhCmluZGV4IGNhNjhlMzIuLjk3M2QyZTAgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9KYXZhQW5ub3RhdGlvbnNNb2pvRGVzY3JpcHRvckV4dHJhY3Rvci5qYXZhCisrKyBiL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9KYXZhQW5ub3RhdGlvbnNNb2pvRGVzY3JpcHRvckV4dHJhY3Rvci5qYXZhCkBAIC0xOSw2ICsxOSwxMCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAoraW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0Lk5hbWVkOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKQEAgLTYzLDcgKzY3LDYgQEAKIGltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLlVuQXJjaGl2ZXI7CiBpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5tYW5hZ2VyLkFyY2hpdmVyTWFuYWdlcjsKIGltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLm1hbmFnZXIuTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuYW5ub3RhdGlvbnMuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5BYnN0cmFjdExvZ0VuYWJsZWQ7CiBpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlN0cmluZ1V0aWxzOwogCkBAIC04MCwxOSArODMsMjAgQEAKICAqIEBhdXRob3IgT2xpdmllciBMYW15CiAgKiBAc2luY2UgMy4wCiAgKi8KLUBDb21wb25lbnQoIHJvbGUgPSBNb2pvRGVzY3JpcHRvckV4dHJhY3Rvci5jbGFzcywgaGludCA9ICJqYXZhLWFubm90YXRpb25zIiApCitATmFtZWQoICJqYXZhLWFubm90YXRpb25zIiApCitAU2luZ2xldG9uCiBwdWJsaWMgY2xhc3MgSmF2YUFubm90YXRpb25zTW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3IKICAgICBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZAogICAgIGltcGxlbWVudHMgTW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3IKIHsKIAotICAgIEBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5hbm5vdGF0aW9ucy5SZXF1aXJlbWVudAorICAgIEBJbmplY3QKICAgICBwcml2YXRlIE1vam9Bbm5vdGF0aW9uc1NjYW5uZXIgbW9qb0Fubm90YXRpb25zU2Nhbm5lcjsKIAotICAgIEBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5hbm5vdGF0aW9ucy5SZXF1aXJlbWVudAorICAgIEBJbmplY3QKICAgICBwcml2YXRlIFJlcG9zaXRvcnlTeXN0ZW0gcmVwb3NpdG9yeVN5c3RlbTsKIAotICAgIEBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5hbm5vdGF0aW9ucy5SZXF1aXJlbWVudAorICAgIEBJbmplY3QKICAgICBwcml2YXRlIEFyY2hpdmVyTWFuYWdlciBhcmNoaXZlck1hbmFnZXI7CiAKICAgICBAT3ZlcnJpZGUKQEAgLTU2Myw2ICs1NjcsNyBAQAogICAgICAgICAgICAgICAgIHBhcmFtZXRlci5zZXROYW1lKCBuYW1lICk7CiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldEFsaWFzKCBwYXJhbWV0ZXJBbm5vdGF0aW9uQ29udGVudC5hbGlhcygpICk7CiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldERlZmF1bHRWYWx1ZSggcGFyYW1ldGVyQW5ub3RhdGlvbkNvbnRlbnQuZGVmYXVsdFZhbHVlKCkgKTsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuc2V0SW1wbGVtZW50YXRpb24oIHBhcmFtZXRlckFubm90YXRpb25Db250ZW50LmdldEltcGxlbWVudGF0aW9uQ2xhc3NOYW1lKCkgKTsKICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuc2V0RGVwcmVjYXRlZCggcGFyYW1ldGVyQW5ub3RhdGlvbkNvbnRlbnQuZ2V0RGVwcmVjYXRlZCgpICk7CiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldERlc2NyaXB0aW9uKCBwYXJhbWV0ZXJBbm5vdGF0aW9uQ29udGVudC5nZXREZXNjcmlwdGlvbigpICk7CiAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLnNldEVkaXRhYmxlKCAhcGFyYW1ldGVyQW5ub3RhdGlvbkNvbnRlbnQucmVhZG9ubHkoKSApOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL2Fubm90YXRpb25zL2RhdGFtb2RlbC9QYXJhbWV0ZXJBbm5vdGF0aW9uQ29udGVudC5qYXZhIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL2Fubm90YXRpb25zL2RhdGFtb2RlbC9QYXJhbWV0ZXJBbm5vdGF0aW9uQ29udGVudC5qYXZhCmluZGV4IDFkYjExN2EuLjNkOWY4OTIgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9kYXRhbW9kZWwvUGFyYW1ldGVyQW5ub3RhdGlvbkNvbnRlbnQuamF2YQorKysgYi9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvZGF0YW1vZGVsL1BhcmFtZXRlckFubm90YXRpb25Db250ZW50LmphdmEKQEAgLTIwLDggKzIwLDEwIEBACiAgKi8KIAogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uVHlwZTsKIAogaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiAKIC8qKgogICogQGF1dGhvciBPbGl2aWVyIExhbXkKQEAgLTQwLDYgKzQyLDggQEAKIAogICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZTsKIAorICAgIHByaXZhdGUgU3RyaW5nIGltcGxlbWVudGF0aW9uQ2xhc3NOYW1lOworCiAgICAgcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVkID0gZmFsc2U7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gcmVhZG9ubHkgPSBmYWxzZTsKQEAgLTUzLDEyICs1NywxMyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBQYXJhbWV0ZXJBbm5vdGF0aW9uQ29udGVudCggU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nIGFsaWFzLCBTdHJpbmcgcHJvcGVydHksIFN0cmluZyBkZWZhdWx0VmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlcXVpcmVkLCBib29sZWFuIHJlYWRvbmx5LCBTdHJpbmcgY2xhc3NOYW1lICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGltcGxlbWVudGF0aW9uLCBib29sZWFuIHJlcXVpcmVkLCBib29sZWFuIHJlYWRvbmx5LCBTdHJpbmcgY2xhc3NOYW1lICkKICAgICB7CiAgICAgICAgIHRoaXMoIGZpZWxkTmFtZSwgY2xhc3NOYW1lICk7CiAgICAgICAgIHRoaXMuYWxpYXMgPSBhbGlhczsKICAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OwogICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgdGhpcy5pbXBsZW1lbnRhdGlvbkNsYXNzTmFtZSA9IGltcGxlbWVudGF0aW9uICE9IG51bGwgPyBpbXBsZW1lbnRhdGlvbi5nZXROYW1lKCkgOiBudWxsOwogICAgICAgICB0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7CiAgICAgICAgIHRoaXMucmVhZG9ubHkgPSByZWFkb25seTsKICAgICB9CkBAIC0xMDcsNiArMTEyLDMzIEBACiAgICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGltcGxlbWVudGF0aW9uKCBUeXBlIGltcGxlbWVudGF0aW9uICkKKyAgICB7CisKKyAgICAgICAgaW1wbGVtZW50YXRpb25DbGFzc05hbWUgPSBpbXBsZW1lbnRhdGlvbi5nZXRDbGFzc05hbWUoKTsKKyAgICAgICAgaWYgKCBpbXBsZW1lbnRhdGlvbkNsYXNzTmFtZS5lcXVhbHMoIE9iamVjdC5jbGFzcy5nZXROYW1lKCkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE9iamVjdCBpcyBkZWZhdWx0IHZhbHVlIGZvciBpbXBsZW1lbnRhdGlvbiBhdHRyaWJ1dGUKKyAgICAgICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb25DbGFzc05hbWUgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvbkNsYXNzTmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gaW1wbGVtZW50YXRpb25DbGFzc05hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzPD8+IGltcGxlbWVudGF0aW9uKCkKKyAgICB7CisgICAgICAgIC8vIG5lZWRlZCBmb3IgaW1wbGVtZW50aW5nIEBQYXJhbWV0ZXIKKyAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gcHJvamVjdCBjbGFzcyBwYXRoLAorICAgICAgICAvLyBzbyBsb2FkaW5nIGNsYXNzIGlzIG5vdCBwb3NzaWJsZSB3aXRob3V0IGJ1aWxkIGFkZGl0aW9uYWwgY2xhc3NMb2FkZXIKKyAgICAgICAgLy8gd2Ugb25seSBvcGVyYXRlIG9uIGNsYXNzZXMgbmFtZXMKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgInBsZWFzZSB1c2UgZ2V0SW1wbGVtZW50YXRpb25DbGFzc05hbWUgaW5zdGVhZCBvZiBpbXBsZW1lbnRhdGlvbiBtZXRob2QiICk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZWQoKQogICAgIHsKQEAgLTE1MSwxMCArMTgzLDE0IEBACiAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBzYi5hcHBlbmQoIHN1cGVyLnRvU3RyaW5nKCkgKTsKICAgICAgICAgc2IuYXBwZW5kKCAiUGFyYW1ldGVyQW5ub3RhdGlvbkNvbnRlbnQiICk7Ci0gICAgICAgIHNiLmFwcGVuZCggIntuYW1lPSciICkuYXBwZW5kKCBuYW1lICkuYXBwZW5kKCAnXCcnICk7CisgICAgICAgIHNiLmFwcGVuZCggIntmaWVsZE5hbWU9JyIgKS5hcHBlbmQoIGdldEZpZWxkTmFtZSgpICkuYXBwZW5kKCAnXCcnICk7CisgICAgICAgIHNiLmFwcGVuZCggIiwgY2xhc3NOYW1lPSciICkuYXBwZW5kKCBnZXRDbGFzc05hbWUoKSApLmFwcGVuZCggJ1wnJyApOworICAgICAgICBzYi5hcHBlbmQoICIsIG5hbWU9JyIgKS5hcHBlbmQoIG5hbWUgKS5hcHBlbmQoICdcJycgKTsKKyAgICAgICAgc2IuYXBwZW5kKCAiLCBhbGlhcz0nIiApLmFwcGVuZCggYWxpYXMgKS5hcHBlbmQoICdcJycgKTsKICAgICAgICAgc2IuYXBwZW5kKCAiLCBhbGlhcz0nIiApLmFwcGVuZCggYWxpYXMgKS5hcHBlbmQoICdcJycgKTsKICAgICAgICAgc2IuYXBwZW5kKCAiLCBwcm9wZXJ0eT0nIiApLmFwcGVuZCggcHJvcGVydHkgKS5hcHBlbmQoICdcJycgKTsKICAgICAgICAgc2IuYXBwZW5kKCAiLCBkZWZhdWx0VmFsdWU9JyIgKS5hcHBlbmQoIGRlZmF1bHRWYWx1ZSApLmFwcGVuZCggJ1wnJyApOworICAgICAgICBzYi5hcHBlbmQoICIsIGltcGxlbWVudGF0aW9uPSciICkuYXBwZW5kKCBpbXBsZW1lbnRhdGlvbkNsYXNzTmFtZSApLmFwcGVuZCggJ1wnJyApOwogICAgICAgICBzYi5hcHBlbmQoICIsIHJlcXVpcmVkPSIgKS5hcHBlbmQoIHJlcXVpcmVkICk7CiAgICAgICAgIHNiLmFwcGVuZCggIiwgcmVhZG9ubHk9IiApLmFwcGVuZCggcmVhZG9ubHkgKTsKICAgICAgICAgc2IuYXBwZW5kKCAnfScgKTsKQEAgLTE4OSwxNSArMjI1LDI0IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIGFsaWFzICE9IG51bGwgPyAhYWxpYXMuZXF1YWxzKCB0aGF0LmFsaWFzICkgOiB0aGF0LmFsaWFzICE9IG51bGwgKQorICAgICAgICBpZiAoIGdldENsYXNzTmFtZSgpICE9IG51bGwgPyAhZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKCB0aGF0LmdldENsYXNzTmFtZSgpICkgOiB0aGF0LmdldENsYXNzTmFtZSgpICE9IG51bGwgKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCBkZWZhdWx0VmFsdWUgIT0gbnVsbCA/ICFkZWZhdWx0VmFsdWUuZXF1YWxzKCB0aGF0LmRlZmF1bHRWYWx1ZSApIDogdGhhdC5kZWZhdWx0VmFsdWUgIT0gbnVsbCApCisKKyAgICAgICAgaWYgKCAhT2JqZWN0cy5lcXVhbHMoIGFsaWFzLCB0aGF0LmFsaWFzICkgKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCBwcm9wZXJ0eSAhPSBudWxsID8gIXByb3BlcnR5LmVxdWFscyggdGhhdC5wcm9wZXJ0eSApIDogdGhhdC5wcm9wZXJ0eSAhPSBudWxsICkKKyAgICAgICAgaWYgKCAhT2JqZWN0cy5lcXVhbHMoIGRlZmF1bHRWYWx1ZSwgdGhhdC5kZWZhdWx0VmFsdWUgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICFPYmplY3RzLmVxdWFscyggcHJvcGVydHksIHRoYXQucHJvcGVydHkgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICFPYmplY3RzLmVxdWFscyggaW1wbGVtZW50YXRpb25DbGFzc05hbWUsIHRoYXQuaW1wbGVtZW50YXRpb25DbGFzc05hbWUgKSApCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtMjA4LDEyICsyNTMsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQogICAgIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IGFsaWFzICE9IG51bGwgPyBhbGlhcy5oYXNoQ29kZSgpIDogMDsKLSAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoIGdldEZpZWxkTmFtZSgpICE9IG51bGwgPyBnZXRGaWVsZE5hbWUoKS5oYXNoQ29kZSgpIDogMCApOwotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArICggcHJvcGVydHkgIT0gbnVsbCA/IHByb3BlcnR5Lmhhc2hDb2RlKCkgOiAwICk7Ci0gICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKCBkZWZhdWx0VmFsdWUgIT0gbnVsbCA/IGRlZmF1bHRWYWx1ZS5oYXNoQ29kZSgpIDogMCApOwotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArICggcmVxdWlyZWQgPyAxIDogMCApOwotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArICggcmVhZG9ubHkgPyAxIDogMCApOwotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKCBhbGlhcywgZ2V0RmllbGROYW1lKCksIHByb3BlcnR5LCBkZWZhdWx0VmFsdWUsIHJlcXVpcmVkLCByZWFkb25seSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25DbGFzc05hbWUgKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvc2Nhbm5lci9EZWZhdWx0TW9qb0Fubm90YXRpb25zU2Nhbm5lci5qYXZhIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL2Fubm90YXRpb25zL3NjYW5uZXIvRGVmYXVsdE1vam9Bbm5vdGF0aW9uc1NjYW5uZXIuamF2YQppbmRleCBkNTM4NDhmLi4wNDA3YjhlIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvc2Nhbm5lci9EZWZhdWx0TW9qb0Fubm90YXRpb25zU2Nhbm5lci5qYXZhCisrKyBiL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9zY2FubmVyL0RlZmF1bHRNb2pvQW5ub3RhdGlvbnNTY2FubmVyLmphdmEKQEAgLTE5LDYgKzE5LDkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK2ltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuRXhlY3V0ZTsKQEAgLTU2LDE0ICs1OSwxNiBAQAogICogQGF1dGhvciBPbGl2aWVyIExhbXkKICAqIEBzaW5jZSAzLjAKICAqLwotQG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LmFubm90YXRpb25zLkNvbXBvbmVudCggcm9sZSA9IE1vam9Bbm5vdGF0aW9uc1NjYW5uZXIuY2xhc3MgKQorQE5hbWVkCitAU2luZ2xldG9uCiBwdWJsaWMgY2xhc3MgRGVmYXVsdE1vam9Bbm5vdGF0aW9uc1NjYW5uZXIKICAgICBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZAogICAgIGltcGxlbWVudHMgTW9qb0Fubm90YXRpb25zU2Nhbm5lcgogewogICAgIC8vIGNsYXNzZXMgd2l0aCBhIGRhc2ggbXVzdCBiZSBpZ25vcmVkCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBTQ0FOTkFCTEVfQ0xBU1MgPSBQYXR0ZXJuLmNvbXBpbGUoICJbXi1dK1xcLmNsYXNzIiApOwotICAgIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOworCiAgICAgcHJpdmF0ZSBSZWZsZWN0b3IgcmVmbGVjdG9yID0gbmV3IFJlZmxlY3RvcigpOwogCiAgICAgQE92ZXJyaWRlCkBAIC0yNzEsNiArMjc2LDEyIEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgTW9qb0Fubm90YXRpb25Db250ZW50IG1vam9Bbm5vdGF0aW9uQ29udGVudCA9IG5ldyBNb2pvQW5ub3RhdGlvbkNvbnRlbnQoKTsKICAgICAgICAgICAgICAgICBwb3B1bGF0ZUFubm90YXRpb25Db250ZW50KCBtb2pvQW5ub3RhdGlvbkNvbnRlbnQsIG1vam9Bbm5vdGF0aW9uVmlzaXRvciApOworCisgICAgICAgICAgICAgICAgaWYgKCBtb2pvQ2xhc3NWaXNpdG9yLmdldEFubm90YXRpb25WaXNpdG9yKCBEZXByZWNhdGVkLmNsYXNzICkgIT0gbnVsbCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtb2pvQW5ub3RhdGlvbkNvbnRlbnQuc2V0RGVwcmVjYXRlZCggRU1QVFkgKTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBtb2pvQW5ub3RhdGVkQ2xhc3Muc2V0TW9qbyggbW9qb0Fubm90YXRpb25Db250ZW50ICk7CiAgICAgICAgICAgICB9CiAKQEAgLTI4OSwxMCArMzAwLDE1IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgUGFyYW1ldGVyQW5ub3RhdGlvbkNvbnRlbnQgcGFyYW1ldGVyQW5ub3RhdGlvbkNvbnRlbnQgPQogICAgICAgICAgICAgICAgICAgICBuZXcgUGFyYW1ldGVyQW5ub3RhdGlvbkNvbnRlbnQoIG1vam9GaWVsZFZpc2l0b3IuZ2V0RmllbGROYW1lKCksIG1vam9GaWVsZFZpc2l0b3IuZ2V0Q2xhc3NOYW1lKCkgKTsKLSAgICAgICAgICAgICAgICBpZiAoIG1vam9GaWVsZFZpc2l0b3IuZ2V0TW9qb0Fubm90YXRpb25WaXNpdG9yKCkgIT0gbnVsbCApCisKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBNb2pvQW5ub3RhdGlvblZpc2l0b3I+IGFubm90YXRpb25WaXNpdG9yTWFwID0gbW9qb0ZpZWxkVmlzaXRvci5nZXRBbm5vdGF0aW9uVmlzaXRvck1hcCgpOworICAgICAgICAgICAgICAgIE1vam9Bbm5vdGF0aW9uVmlzaXRvciBmaWVsZEFubm90YXRpb25WaXNpdG9yID0gYW5ub3RhdGlvblZpc2l0b3JNYXAuZ2V0KCBQYXJhbWV0ZXIuY2xhc3MuZ2V0TmFtZSgpICk7CisKKyAgICAgICAgICAgICAgICBwb3B1bGF0ZUFubm90YXRpb25Db250ZW50KCBwYXJhbWV0ZXJBbm5vdGF0aW9uQ29udGVudCwgZmllbGRBbm5vdGF0aW9uVmlzaXRvciApOworCisgICAgICAgICAgICAgICAgaWYgKCBhbm5vdGF0aW9uVmlzaXRvck1hcC5jb250YWluc0tleSggRGVwcmVjYXRlZC5jbGFzcy5nZXROYW1lKCkgKSApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZUFubm90YXRpb25Db250ZW50KCBwYXJhbWV0ZXJBbm5vdGF0aW9uQ29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9qb0ZpZWxkVmlzaXRvci5nZXRNb2pvQW5ub3RhdGlvblZpc2l0b3IoKSApOworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJBbm5vdGF0aW9uQ29udGVudC5zZXREZXByZWNhdGVkKCBFTVBUWSApOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1vam9Bbm5vdGF0ZWRDbGFzcy5nZXRQYXJhbWV0ZXJzKCkucHV0KCBwYXJhbWV0ZXJBbm5vdGF0aW9uQ29udGVudC5nZXRGaWVsZE5hbWUoKSwKQEAgLTMwNiw3ICszMjIsOSBAQAogICAgICAgICAgICAgICAgIENvbXBvbmVudEFubm90YXRpb25Db250ZW50IGNvbXBvbmVudEFubm90YXRpb25Db250ZW50ID0KICAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudEFubm90YXRpb25Db250ZW50KCBtb2pvRmllbGRWaXNpdG9yLmdldEZpZWxkTmFtZSgpICk7CiAKLSAgICAgICAgICAgICAgICBNb2pvQW5ub3RhdGlvblZpc2l0b3IgYW5ub3RhdGlvblZpc2l0b3IgPSBtb2pvRmllbGRWaXNpdG9yLmdldE1vam9Bbm5vdGF0aW9uVmlzaXRvcigpOworICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE1vam9Bbm5vdGF0aW9uVmlzaXRvcj4gYW5ub3RhdGlvblZpc2l0b3JNYXAgPSBtb2pvRmllbGRWaXNpdG9yLmdldEFubm90YXRpb25WaXNpdG9yTWFwKCk7CisgICAgICAgICAgICAgICAgTW9qb0Fubm90YXRpb25WaXNpdG9yIGFubm90YXRpb25WaXNpdG9yID0gYW5ub3RhdGlvblZpc2l0b3JNYXAuZ2V0KCBDb21wb25lbnQuY2xhc3MuZ2V0TmFtZSgpICk7CisKICAgICAgICAgICAgICAgICBpZiAoIGFubm90YXRpb25WaXNpdG9yICE9IG51bGwgKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZm9yICggTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGFubm90YXRpb25WaXNpdG9yLmdldEFubm90YXRpb25WYWx1ZXMoKS5lbnRyeVNldCgpICkKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9zY2FubmVyL01vam9Bbm5vdGF0aW9uc1NjYW5uZXIuamF2YSBiL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9zY2FubmVyL01vam9Bbm5vdGF0aW9uc1NjYW5uZXIuamF2YQppbmRleCBhNWFkZDJmLi5hNGU3NjE5IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvc2Nhbm5lci9Nb2pvQW5ub3RhdGlvbnNTY2FubmVyLmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL2Fubm90YXRpb25zL3NjYW5uZXIvTW9qb0Fubm90YXRpb25zU2Nhbm5lci5qYXZhCkBAIC0zNyw5ICszNywxMyBAQAogewogICAgIFN0cmluZyBST0xFID0gTW9qb0Fubm90YXRpb25zU2Nhbm5lci5jbGFzcy5nZXROYW1lKCk7CiAKLSAgICBMaXN0PFN0cmluZz4gQ0xBU1NfTEVWRUxfQU5OT1RBVElPTlMgPSBBcnJheXMuYXNMaXN0KCBNb2pvLmNsYXNzLmdldE5hbWUoKSwgRXhlY3V0ZS5jbGFzcy5nZXROYW1lKCkgKTsKKyAgICBMaXN0PFN0cmluZz4gQ0xBU1NfTEVWRUxfQU5OT1RBVElPTlMgPSBBcnJheXMuYXNMaXN0KCBNb2pvLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRlLmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGVkLmNsYXNzLmdldE5hbWUoKSApOwogCi0gICAgTGlzdDxTdHJpbmc+IEZJRUxEX0xFVkVMX0FOTk9UQVRJT05TID0gQXJyYXlzLmFzTGlzdCggUGFyYW1ldGVyLmNsYXNzLmdldE5hbWUoKSwgQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSApOworICAgIExpc3Q8U3RyaW5nPiBGSUVMRF9MRVZFTF9BTk5PVEFUSU9OUyA9IEFycmF5cy5hc0xpc3QoIFBhcmFtZXRlci5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGVkLmNsYXNzLmdldE5hbWUoKSApOwogCiAgICAgLyoqCiAgICAgICogU2NhbiBjbGFzc2VzIGZvciBtb2pvIGFubm90YXRpb25zLgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL2Fubm90YXRpb25zL3NjYW5uZXIvdmlzaXRvcnMvTW9qb0NsYXNzVmlzaXRvci5qYXZhIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL2Fubm90YXRpb25zL3NjYW5uZXIvdmlzaXRvcnMvTW9qb0NsYXNzVmlzaXRvci5qYXZhCmluZGV4IDZlYmY0YzYuLjQwMTIwMzQgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9zY2FubmVyL3Zpc2l0b3JzL01vam9DbGFzc1Zpc2l0b3IuamF2YQorKysgYi9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvc2Nhbm5lci92aXNpdG9ycy9Nb2pvQ2xhc3NWaXNpdG9yLmphdmEKQEAgLTM0LDcgKzM0LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogCiAvKioKICAqIEBhdXRob3IgT2xpdmllciBMYW15CkBAIC05NiwxMyArOTUsMTMgQEAKICAgICB7CiAgICAgICAgIFN0cmluZyBhbm5vdGF0aW9uQ2xhc3NOYW1lID0gYW5ub3RhdGlvbi5nZXROYW1lKCk7CiAKLSAgICAgICAgTGlzdDxNb2pvRmllbGRWaXNpdG9yPiBtb2pvRmllbGRWaXNpdG9ycyA9IG5ldyBBcnJheUxpc3Q8TW9qb0ZpZWxkVmlzaXRvcj4oKTsKKyAgICAgICAgTGlzdDxNb2pvRmllbGRWaXNpdG9yPiBtb2pvRmllbGRWaXNpdG9ycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgICAgIGZvciAoIE1vam9GaWVsZFZpc2l0b3IgbW9qb0ZpZWxkVmlzaXRvciA6IHRoaXMuZmllbGRWaXNpdG9ycyApCiAgICAgICAgIHsKLSAgICAgICAgICAgIE1vam9Bbm5vdGF0aW9uVmlzaXRvciBtb2pvQW5ub3RhdGlvblZpc2l0b3IgPSBtb2pvRmllbGRWaXNpdG9yLmdldE1vam9Bbm5vdGF0aW9uVmlzaXRvcigpOwotICAgICAgICAgICAgaWYgKCBtb2pvQW5ub3RhdGlvblZpc2l0b3IgIT0gbnVsbCAmJiBPYmplY3RzLmVxdWFscyggYW5ub3RhdGlvbkNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2pvQW5ub3RhdGlvblZpc2l0b3IuZ2V0QW5ub3RhdGlvbkNsYXNzTmFtZSgpICkgKQorICAgICAgICAgICAgTWFwPFN0cmluZywgTW9qb0Fubm90YXRpb25WaXNpdG9yPiBmaWxlZFZpc2l0b3JNYXAgPSBtb2pvRmllbGRWaXNpdG9yLmdldEFubm90YXRpb25WaXNpdG9yTWFwKCk7CisKKyAgICAgICAgICAgIGlmICggIGZpbGVkVmlzaXRvck1hcC5jb250YWluc0tleSggYW5ub3RhdGlvbkNsYXNzTmFtZSApICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBtb2pvRmllbGRWaXNpdG9ycy5hZGQoIG1vam9GaWVsZFZpc2l0b3IgKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9zY2FubmVyL3Zpc2l0b3JzL01vam9GaWVsZFZpc2l0b3IuamF2YSBiL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9zY2FubmVyL3Zpc2l0b3JzL01vam9GaWVsZFZpc2l0b3IuamF2YQppbmRleCBiM2QwMzUzLi5mNjlhZTA2IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvc2Nhbm5lci92aXNpdG9ycy9Nb2pvRmllbGRWaXNpdG9yLmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL2Fubm90YXRpb25zL3NjYW5uZXIvdmlzaXRvcnMvTW9qb0ZpZWxkVmlzaXRvci5qYXZhCkBAIC0xOSw2ICsxOSw5IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmV4dHJhY3Rvci5hbm5vdGF0aW9ucy5zY2FubmVyLk1vam9Bbm5vdGF0aW9uc1NjYW5uZXI7CiBpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkxvZ2dlcjsKIGltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5Bbm5vdGF0aW9uVmlzaXRvcjsKQEAgLTM4LDcgKzQxLDcgQEAKIAogICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkTmFtZTsKIAotICAgIHByaXZhdGUgTW9qb0Fubm90YXRpb25WaXNpdG9yIG1vam9Bbm5vdGF0aW9uVmlzaXRvcjsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1vam9Bbm5vdGF0aW9uVmlzaXRvcj4gYW5ub3RhdGlvblZpc2l0b3JNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CiAKQEAgLTUwLDkgKzUzLDkgQEAKICAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7CiAgICAgfQogCi0gICAgcHVibGljIE1vam9Bbm5vdGF0aW9uVmlzaXRvciBnZXRNb2pvQW5ub3RhdGlvblZpc2l0b3IoKQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBNb2pvQW5ub3RhdGlvblZpc2l0b3I+IGdldEFubm90YXRpb25WaXNpdG9yTWFwKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBtb2pvQW5ub3RhdGlvblZpc2l0b3I7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uVmlzaXRvck1hcDsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpCkBAIC02OCw3ICs3MSw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIG1vam9Bbm5vdGF0aW9uVmlzaXRvciA9IG5ldyBNb2pvQW5ub3RhdGlvblZpc2l0b3IoIGxvZ2dlciwgYW5ub3RhdGlvbkNsYXNzTmFtZSApOworICAgICAgICBNb2pvQW5ub3RhdGlvblZpc2l0b3IgbW9qb0Fubm90YXRpb25WaXNpdG9yID0gbmV3IE1vam9Bbm5vdGF0aW9uVmlzaXRvciggbG9nZ2VyLCBhbm5vdGF0aW9uQ2xhc3NOYW1lICk7CisgICAgICAgIGFubm90YXRpb25WaXNpdG9yTWFwLnB1dCggYW5ub3RhdGlvbkNsYXNzTmFtZSwgbW9qb0Fubm90YXRpb25WaXNpdG9yICk7CiAgICAgICAgIHJldHVybiBtb2pvQW5ub3RhdGlvblZpc2l0b3I7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmluZGV4IDdmZmMzYmEuLmRiMzcyYTIgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CisrKyBiL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CkBAIC04Myw2ICs4Myw3IEBACiAgICAgICAgICAgICAgICAgYWxpYXMgPSAibXlBbGlhcyIsCiAgICAgICAgICAgICAgICAgcHJvcGVydHkgPSAiYS5wcm9wZXJ0eSIsCiAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gImFuIGV4cHJlc3Npb24sIHBvc3NpYmx5IHdpdGggJHt2YXJpYWJsZXN9IiwKKyAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiA9ICJjbGFzcyBvZiBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgY2FzZSB0aGUgcGFyYW1ldGVyIHR5cGUgaXMgYW4gaW50ZXJmYWNlIgogICAgICAgICAgICAgICAgIHJlYWRvbmx5ID0gPGZhbHNlfHRydWU+LAogICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gPGZhbHNlfHRydWU+ICkKICAgICBwcml2YXRlIFN0cmluZyBwYXJhbWV0ZXI7CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvRGVwcmVjYXRlZE1vam8uamF2YSBiL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9EZXByZWNhdGVkTW9qby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTk3NjgKLS0tIC9kZXYvbnVsbAorKysgYi9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvRGVwcmVjYXRlZE1vam8uamF2YQpAQCAtMCwwICsxLDQzIEBACitwYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmV4dHJhY3Rvci5hbm5vdGF0aW9uczsKKworLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9GYWlsdXJlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Nb2pvOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXI7CisKK0BEZXByZWNhdGVkCitATW9qbyggbmFtZSA9ICJkZXByZWNhdGVkLW1vam8iICkKK3B1YmxpYyBjbGFzcyBEZXByZWNhdGVkTW9qbyBleHRlbmRzIEFic3RyYWN0TW9qbworeworICAgIEBEZXByZWNhdGVkCisgICAgQFBhcmFtZXRlciggYWxpYXMgPSAiZGVwcmVjYXRlZFBhcmFtZXRlcnNBbGlhcyIgKQorICAgIHByaXZhdGUgU3RyaW5nIGRlcHJlY2F0ZWRQYXJhbWV0ZXJzOworCisgICAgQFBhcmFtZXRlciggcHJvcGVydHkgPSAicHJvcGVydHkuYW5vdGhlck5vdERlcHJlY2F0ZWQiICkKKyAgICBwcml2YXRlIFN0cmluZyBhbm90aGVyTm90RGVwcmVjYXRlZDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24KKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWdlbmVyYXRvcnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9nZW5lcmF0b3IvUGx1Z2luSGVscEdlbmVyYXRvclRlc3QuamF2YSBiL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9Gb29JbnRlcmZhY2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDYwJQpjb3B5IGZyb20gbWF2ZW4tcGx1Z2luLXRvb2xzLWdlbmVyYXRvcnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9nZW5lcmF0b3IvUGx1Z2luSGVscEdlbmVyYXRvclRlc3QuamF2YQpjb3B5IHRvIG1hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9Gb29JbnRlcmZhY2UuamF2YQppbmRleCBjZTRmOTE5Li5mODkzMjkzIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2dlbmVyYXRvci9QbHVnaW5IZWxwR2VuZXJhdG9yVGVzdC5qYXZhCisrKyBiL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9Gb29JbnRlcmZhY2UuamF2YQpAQCAtMSw0ICsxLDQgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZ2VuZXJhdG9yOworcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5leHRyYWN0b3IuYW5ub3RhdGlvbnM7CiAKIC8qCiAgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCkBAIC0xOSwyMiArMTksNiBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudmVsb2NpdHkuVmVsb2NpdHlDb21wb25lbnQ7Ci0KLS8qKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86dmluY2VudC5zaXZldG9uQGdtYWlsLmNvbSI+VmluY2VudCBTaXZldG9uPC9hPgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luSGVscEdlbmVyYXRvclRlc3QKLSAgICBleHRlbmRzIEFic3RyYWN0R2VuZXJhdG9yVGVzdENhc2UKK3B1YmxpYyBpbnRlcmZhY2UgRm9vSW50ZXJmYWNlCiB7Ci0gICAgLy8gaW5oZXJpdHMgdGVzdHMgZnJvbSBiYXNlIGNsYXNzCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0dXBHZW5lcmF0b3IoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIGdlbmVyYXRvciA9Ci0gICAgICAgICAgICBuZXcgUGx1Z2luSGVscEdlbmVyYXRvcigpLnNldFZlbG9jaXR5Q29tcG9uZW50KCAoVmVsb2NpdHlDb21wb25lbnQpIGxvb2t1cCggVmVsb2NpdHlDb21wb25lbnQuUk9MRSApICk7Ci0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2dlbmVyYXRvci9QbHVnaW5IZWxwR2VuZXJhdG9yVGVzdC5qYXZhIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFubm90YXRpb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL2Fubm90YXRpb25zL0Zvb0ludGVyZmFjZUltcGwuamF2YQpzaW1pbGFyaXR5IGluZGV4IDYwJQpjb3B5IGZyb20gbWF2ZW4tcGx1Z2luLXRvb2xzLWdlbmVyYXRvcnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9nZW5lcmF0b3IvUGx1Z2luSGVscEdlbmVyYXRvclRlc3QuamF2YQpjb3B5IHRvIG1hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9Gb29JbnRlcmZhY2VJbXBsLmphdmEKaW5kZXggY2U0ZjkxOS4uOTlmNTkzYiAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWdlbmVyYXRvcnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9nZW5lcmF0b3IvUGx1Z2luSGVscEdlbmVyYXRvclRlc3QuamF2YQorKysgYi9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvRm9vSW50ZXJmYWNlSW1wbC5qYXZhCkBAIC0xLDQgKzEsNCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5nZW5lcmF0b3I7CitwYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmV4dHJhY3Rvci5hbm5vdGF0aW9uczsKIAogLyoKICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKQEAgLTE5LDIyICsxOSw2IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy52ZWxvY2l0eS5WZWxvY2l0eUNvbXBvbmVudDsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzp2aW5jZW50LnNpdmV0b25AZ21haWwuY29tIj5WaW5jZW50IFNpdmV0b248L2E+Ci0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5IZWxwR2VuZXJhdG9yVGVzdAotICAgIGV4dGVuZHMgQWJzdHJhY3RHZW5lcmF0b3JUZXN0Q2FzZQorcHVibGljIGNsYXNzIEZvb0ludGVyZmFjZUltcGwgaW1wbGVtZW50cyBGb29JbnRlcmZhY2UKIHsKLSAgICAvLyBpbmhlcml0cyB0ZXN0cyBmcm9tIGJhc2UgY2xhc3MKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cEdlbmVyYXRvcigpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0KLSAgICAgICAgZ2VuZXJhdG9yID0KLSAgICAgICAgICAgIG5ldyBQbHVnaW5IZWxwR2VuZXJhdG9yKCkuc2V0VmVsb2NpdHlDb21wb25lbnQoIChWZWxvY2l0eUNvbXBvbmVudCkgbG9va3VwKCBWZWxvY2l0eUNvbXBvbmVudC5ST0xFICkgKTsKLQotICAgIH0KIH0KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9Gb29Nb2pvLmphdmEgYi9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvRm9vTW9qby5qYXZhCmluZGV4IDM1NDNkZDIuLjM2ZGQ5NzMgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9Gb29Nb2pvLmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFubm90YXRpb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL2Fubm90YXRpb25zL0Zvb01vam8uamF2YQpAQCAtMjcsNyArMjcsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5MaWZlY3ljbGVQaGFzZTsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuTW9qbzsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcGlsZXIubWFuYWdlci5Db21waWxlck1hbmFnZXI7CiAKIC8qKgogICogQGF1dGhvciBPbGl2aWVyIExhbXkKQEAgLTQ1LDYgKzQ0LDEyIEBACiAgICAgcHJvdGVjdGVkIFN0cmluZyBiYXI7CiAKICAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdHlwZSBhcyBwYXJhbWV0ZXIuCisgICAgICovCisgICAgQFBhcmFtZXRlciggcHJvcGVydHkgPSAiZm9vSW50ZXJmYWNlIiwgaW1wbGVtZW50YXRpb24gPSBGb29JbnRlcmZhY2VJbXBsLmNsYXNzICkKKyAgICBwcm90ZWN0ZWQgRm9vSW50ZXJmYWNlIGZvb0ludGVyZmFjZTsKKworICAgIC8qKgogICAgICAqIGJlZXIgZm9yIG5vbiBmcmVuY2ggZm9sa3MKICAgICAgKiBAZGVwcmVjYXRlZCB3aW5lIGlzIGJldHRlcgogICAgICAqLwpAQCAtNTMsMTIgKzU4LDYgQEAKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGJlZXI7CiAKICAgICAvKioKLSAgICAgKiBQbGV4dXMgY29tcGlsZXIgbWFuYWdlci4KLSAgICAgKi8KLSAgICBAQ29tcG9uZW50Ci0gICAgcHJvdGVjdGVkIENvbXBpbGVyTWFuYWdlciBjb21waWxlck1hbmFnZXI7Ci0KLSAgICAvKioKICAgICAgKgogICAgICAqLwogICAgIEBDb21wb25lbnQoIHJvbGUgPSBBcnRpZmFjdE1ldGFkYXRhU291cmNlLmNsYXNzLCBoaW50ID0gIm1hdmVuIiApCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvVGVzdEFubm90YXRpb25zUmVhZGVyLmphdmEgYi9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvVGVzdEFubm90YXRpb25zUmVhZGVyLmphdmEKaW5kZXggMWY0M2U1Ni4uNzk3ZjQ2ZSAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWFubm90YXRpb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL2Fubm90YXRpb25zL1Rlc3RBbm5vdGF0aW9uc1JlYWRlci5qYXZhCisrKyBiL21hdmVuLXBsdWdpbi10b29scy1hbm5vdGF0aW9ucy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbm5vdGF0aW9ucy9UZXN0QW5ub3RhdGlvbnNSZWFkZXIuamF2YQpAQCAtMTksNiArMTksMTQgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuRXhlY3V0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuTGlmZWN5Y2xlUGhhc2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLk1vam87CkBAIC0yOCwyNyArMzYsMjkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5leHRyYWN0b3IuYW5ub3RhdGlvbnMuc2Nhbm5lci5Nb2pvQW5ub3RhdGVkQ2xhc3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZXh0cmFjdG9yLmFubm90YXRpb25zLnNjYW5uZXIuTW9qb0Fubm90YXRpb25zU2Nhbm5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5leHRyYWN0b3IuYW5ub3RhdGlvbnMuc2Nhbm5lci5Nb2pvQW5ub3RhdGlvbnNTY2FubmVyUmVxdWVzdDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLlBsZXh1c1Rlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy50ZXN0aW5nLlBsZXh1c1Rlc3Q7CitpbXBvcnQgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLlRlc3Q7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuY29kZWhhdXMucGxleHVzLnRlc3RpbmcuUGxleHVzRXh0ZW5zaW9uLmdldEJhc2VkaXI7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkFzc2VydGlvbnMuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRydWU7CiAKIC8qKgogICogQGF1dGhvciBPbGl2aWVyIExhbXkKICAqLwotcHVibGljIGNsYXNzIFRlc3RBbm5vdGF0aW9uc1JlYWRlcgotICAgIGV4dGVuZHMgUGxleHVzVGVzdENhc2UKK0BQbGV4dXNUZXN0CitjbGFzcyBUZXN0QW5ub3RhdGlvbnNSZWFkZXIKIHsKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZE1vam9DbGFzcygpCisKKyAgICBASW5qZWN0CisgICAgTW9qb0Fubm90YXRpb25zU2Nhbm5lciBtb2pvQW5ub3RhdGlvbnNTY2FubmVyOworCisgICAgQFRlc3QKKyAgICB2b2lkIHRlc3RSZWFkTW9qb0NsYXNzKCkKICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgTW9qb0Fubm90YXRpb25zU2Nhbm5lciBtb2pvQW5ub3RhdGlvbnNTY2FubmVyID0gKE1vam9Bbm5vdGF0aW9uc1NjYW5uZXIpIGxvb2t1cCggTW9qb0Fubm90YXRpb25zU2Nhbm5lci5ST0xFICk7Ci0KICAgICAgICAgTW9qb0Fubm90YXRpb25zU2Nhbm5lclJlcXVlc3QgcmVxdWVzdCA9IG5ldyBNb2pvQW5ub3RhdGlvbnNTY2FubmVyUmVxdWVzdCgpOwogICAgICAgICByZXF1ZXN0LnNldENsYXNzZXNEaXJlY3RvcmllcyggQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggbmV3IEZpbGUoIGdldEJhc2VkaXIoKSwgInRhcmdldC90ZXN0LWNsYXNzZXMiICkgKSApOwogICAgICAgICByZXF1ZXN0LnNldEluY2x1ZGVQYXR0ZXJucyggQXJyYXlzLmFzTGlzdCggIioqL0Zvb01vam8uY2xhc3MiICkgKTsKQEAgLTc5LDEyICs4OSwyMSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIExpZmVjeWNsZVBoYXNlLlBBQ0tBR0UsIGV4ZWN1dGUucGhhc2UoKSApOwogCiAgICAgICAgIENvbGxlY3Rpb248Q29tcG9uZW50QW5ub3RhdGlvbkNvbnRlbnQ+IGNvbXBvbmVudHMgPSBtb2pvQW5ub3RhdGVkQ2xhc3MuZ2V0Q29tcG9uZW50cygpLnZhbHVlcygpOwotICAgICAgICBhc3NlcnRUaGF0KCBjb21wb25lbnRzICkuaXNOb3ROdWxsKCkuaXNOb3RFbXB0eSgpLmhhc1NpemUoIDIgKTsKKyAgICAgICAgYXNzZXJ0VGhhdCggY29tcG9uZW50cyApLmlzTm90TnVsbCgpLmlzTm90RW1wdHkoKS5oYXNTaXplKCAxICk7CiAKICAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXJBbm5vdGF0aW9uQ29udGVudD4gcGFyYW1ldGVycyA9IG1vam9Bbm5vdGF0ZWRDbGFzcy5nZXRQYXJhbWV0ZXJzKCkudmFsdWVzKCk7Ci0gICAgICAgIGFzc2VydFRoYXQoIHBhcmFtZXRlcnMgKS5pc05vdE51bGwoKS5pc05vdEVtcHR5KCkuaGFzU2l6ZSggMiApLmNvbnRhaW5zKAotICAgICAgICAgICAgbmV3IFBhcmFtZXRlckFubm90YXRpb25Db250ZW50KCAiYmFyIiwgbnVsbCwgInRoZWJhciIsICJjb29sYmFyIiwgdHJ1ZSwgZmFsc2UsIFN0cmluZy5jbGFzcy5nZXROYW1lKCkgKSwKLSAgICAgICAgICAgIG5ldyBQYXJhbWV0ZXJBbm5vdGF0aW9uQ29udGVudCggImJlZXIiLCBudWxsLCAidGhlYmVlciIsICJjb29sYmVlciIsIGZhbHNlLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLmdldE5hbWUoKSApICk7CisgICAgICAgIGFzc2VydFRoYXQoIHBhcmFtZXRlcnMgKS5pc05vdE51bGwoKQorICAgICAgICAgICAgLmlzTm90RW1wdHkoKQorICAgICAgICAgICAgLmhhc1NpemUoIDMgKQorICAgICAgICAgICAgLmNvbnRhaW5zKAorICAgICAgICAgICAgICAgIG5ldyBQYXJhbWV0ZXJBbm5vdGF0aW9uQ29udGVudCggImJhciIsIG51bGwsICJ0aGViYXIiLCAiY29vbGJhciIsIG51bGwsIHRydWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLmdldE5hbWUoKSApLAorICAgICAgICAgICAgICAgIG5ldyBQYXJhbWV0ZXJBbm5vdGF0aW9uQ29udGVudCggImJlZXIiLCBudWxsLCAidGhlYmVlciIsICJjb29sYmVlciIsIG51bGwsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcy5nZXROYW1lKCkgKSwKKyAgICAgICAgICAgICAgICBuZXcgUGFyYW1ldGVyQW5ub3RhdGlvbkNvbnRlbnQoICJmb29JbnRlcmZhY2UiLCBudWxsLCAiZm9vSW50ZXJmYWNlIiwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvb0ludGVyZmFjZUltcGwuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBGb29JbnRlcmZhY2UuY2xhc3MuZ2V0TmFtZSgpICkKKyAgICAgICAgICAgICk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWFubm90YXRpb25zL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL2Fubm90YXRpb25zL3NjYW5uZXIvRGVmYXVsdE1vam9Bbm5vdGF0aW9uc1NjYW5uZXJUZXN0LmphdmEgYi9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvc2Nhbm5lci9EZWZhdWx0TW9qb0Fubm90YXRpb25zU2Nhbm5lclRlc3QuamF2YQppbmRleCAxMTUwOGI4Li44N2RmYzRlIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvc2Nhbm5lci9EZWZhdWx0TW9qb0Fubm90YXRpb25zU2Nhbm5lclRlc3QuamF2YQorKysgYi9tYXZlbi1wbHVnaW4tdG9vbHMtYW5ub3RhdGlvbnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW5ub3RhdGlvbnMvc2Nhbm5lci9EZWZhdWx0TW9qb0Fubm90YXRpb25zU2Nhbm5lclRlc3QuamF2YQpAQCAtMTksMjggKzE5LDYxIEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4NCiAgKi8NCiANCitpbXBvcnQgamF2YS5pby5GaWxlOw0KK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmV4dHJhY3Rvci5FeHRyYWN0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5leHRyYWN0b3IuYW5ub3RhdGlvbnMuRGVwcmVjYXRlZE1vam87DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5Mb2dnZXI7DQoraW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5UZXN0Ow0KKw0KK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0Ow0KIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOw0KIA0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotDQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5Mb2dnZXI7DQotaW1wb3J0IG9yZy5qdW5pdC5UZXN0Ow0KLQ0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9qb0Fubm90YXRpb25zU2Nhbm5lclRlc3QNCitjbGFzcyBEZWZhdWx0TW9qb0Fubm90YXRpb25zU2Nhbm5lclRlc3QNCiB7DQogICAgIHByaXZhdGUgRGVmYXVsdE1vam9Bbm5vdGF0aW9uc1NjYW5uZXIgc2Nhbm5lciA9IG5ldyBEZWZhdWx0TW9qb0Fubm90YXRpb25zU2Nhbm5lcigpOw0KIA0KICAgICBAVGVzdA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2tpcE1vZHVsZUluZm9DbGFzc0luQXJjaGl2ZSgpIHRocm93cyBFeGNlcHRpb24NCisgICAgdm9pZCB0ZXN0U2tpcE1vZHVsZUluZm9DbGFzc0luQXJjaGl2ZSgpIHRocm93cyBFeGNlcHRpb24NCiAgICAgew0KLSAgICAgICAgc2Nhbm5lci5zY2FuQXJjaGl2ZSggbmV3IEZpbGUoICJ0YXJnZXQvdGVzdC1jbGFzc2VzL2phdmE5LW1vZHVsZS5qYXIiKSwgbnVsbCwgZmFsc2UgKTsNCisgICAgICAgIHNjYW5uZXIuc2NhbkFyY2hpdmUoIG5ldyBGaWxlKCAidGFyZ2V0L3Rlc3QtY2xhc3Nlcy9qYXZhOS1tb2R1bGUuamFyIiApLCBudWxsLCBmYWxzZSApOw0KICAgICB9DQotICAgIA0KKw0KICAgICBAVGVzdA0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmF2YThBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24NCisgICAgdm9pZCB0ZXN0SmF2YThBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24NCiAgICAgew0KICAgICAgICAgc2Nhbm5lci5lbmFibGVMb2dnaW5nKCBtb2NrKCBMb2dnZXIuY2xhc3MgKSApOw0KLSAgICAgICAgc2Nhbm5lci5zY2FuQXJjaGl2ZSggbmV3IEZpbGUoICJ0YXJnZXQvdGVzdC1jbGFzc2VzL2phdmE4LWFubm90YXRpb25zLmphciIpLCBudWxsLCBmYWxzZSApOw0KKyAgICAgICAgc2Nhbm5lci5zY2FuQXJjaGl2ZSggbmV3IEZpbGUoICJ0YXJnZXQvdGVzdC1jbGFzc2VzL2phdmE4LWFubm90YXRpb25zLmphciIgKSwgbnVsbCwgZmFsc2UgKTsNCisgICAgfQ0KKw0KKyAgICBAVGVzdA0KKyAgICB2b2lkIHNjYW5EZXByZWNhdGVkTW9qb0Fubm90YXRpbnMoKSB0aHJvd3MgRXh0cmFjdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24NCisgICAgew0KKyAgICAgICAgRmlsZSBkaXJlY3RvcnlUb1NjYW4gPSBuZXcgRmlsZSggRGVwcmVjYXRlZE1vam8uY2xhc3MuZ2V0UmVzb3VyY2UoICIiICkuZ2V0RmlsZSgpICk7DQorDQorICAgICAgICBzY2FubmVyLmVuYWJsZUxvZ2dpbmcoIG1vY2soIExvZ2dlci5jbGFzcyApICk7DQorICAgICAgICBNYXA8U3RyaW5nLCBNb2pvQW5ub3RhdGVkQ2xhc3M+IHJlc3VsdCA9IHNjYW5uZXIuc2NhbkRpcmVjdG9yeSgNCisgICAgICAgICAgICBkaXJlY3RvcnlUb1NjYW4sIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoICJEZXByZWNhdGVkTW9qby5jbGFzcyIgKSwgbnVsbCwgZmFsc2UgKTsNCisNCisgICAgICAgIGFzc2VydFRoYXQoIHJlc3VsdCApLmhhc1NpemUoIDEgKTsNCisNCisgICAgICAgIE1vam9Bbm5vdGF0ZWRDbGFzcyBhbm5vdGF0ZWRDbGFzcyA9IHJlc3VsdC5nZXQoIERlcHJlY2F0ZWRNb2pvLmNsYXNzLmdldE5hbWUoKSApOw0KKyAgICAgICAgYXNzZXJ0VGhhdCggYW5ub3RhdGVkQ2xhc3MuZ2V0Q2xhc3NOYW1lKCkgKS5pc0VxdWFsVG8oIERlcHJlY2F0ZWRNb2pvLmNsYXNzLmdldE5hbWUoKSApOw0KKyAgICAgICAgYXNzZXJ0VGhhdCggYW5ub3RhdGVkQ2xhc3MuZ2V0TW9qbygpLmdldERlcHJlY2F0ZWQoKSApLmlzRW1wdHkoKTsNCisNCisgICAgICAgIGFzc2VydFRoYXQoIGFubm90YXRlZENsYXNzLmdldFBhcmFtZXRlcnMoKSApDQorICAgICAgICAgICAgLmNvbnRhaW5zT25seUtleXMoICJkZXByZWNhdGVkUGFyYW1ldGVycyIsICJhbm90aGVyTm90RGVwcmVjYXRlZCIgKTsNCisNCisgICAgICAgIGFzc2VydFRoYXQoIGFubm90YXRlZENsYXNzLmdldFBhcmFtZXRlcnMoKS5nZXQoICJkZXByZWNhdGVkUGFyYW1ldGVycyIgKS5nZXREZXByZWNhdGVkKCkgKS5pc0VtcHR5KCk7DQorICAgICAgICBhc3NlcnRUaGF0KCBhbm5vdGF0ZWRDbGFzcy5nZXRQYXJhbWV0ZXJzKCkuZ2V0KCAiZGVwcmVjYXRlZFBhcmFtZXRlcnMiICkuYWxpYXMoKSApDQorICAgICAgICAgICAgLmlzRXF1YWxUbyggImRlcHJlY2F0ZWRQYXJhbWV0ZXJzQWxpYXMiICk7DQorDQorICAgICAgICBhc3NlcnRUaGF0KCBhbm5vdGF0ZWRDbGFzcy5nZXRQYXJhbWV0ZXJzKCkuZ2V0KCAiYW5vdGhlck5vdERlcHJlY2F0ZWQiICkuZ2V0RGVwcmVjYXRlZCgpICkuaXNOdWxsKCk7DQorICAgICAgICBhc3NlcnRUaGF0KCBhbm5vdGF0ZWRDbGFzcy5nZXRQYXJhbWV0ZXJzKCkuZ2V0KCAiYW5vdGhlck5vdERlcHJlY2F0ZWQiICkucHJvcGVydHkoKSApDQorICAgICAgICAgICAgLmlzRXF1YWxUbyggInByb3BlcnR5LmFub3RoZXJOb3REZXByZWNhdGVkIiApOw0KICAgICB9DQogDQogfQ0KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi10b29scy1hcGkvcG9tLnhtbCBiL21hdmVuLXBsdWdpbi10b29scy1hcGkvcG9tLnhtbAppbmRleCA3NWFiMzc3Li4xZmI4NmQ2IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tdG9vbHMtYXBpL3BvbS54bWwKKysrIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFwaS9wb20ueG1sCkBAIC01MSwxMSArNTEsNyBAQAogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFydGlmYWN0PC9hcnRpZmFjdElkPgogICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zZXR0aW5nczwvYXJ0aWZhY3RJZD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCisKICAgICAgPCEtLSBwbGV4dXMgLS0+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgpAQCAtNjQsMTMgKzYwLDggQEAKIAogICAgIDwhLS0gdGVzdCAtLT4KICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLXRlc3Rpbmc8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tdGVzdGluZy1oYXJuZXNzPC9hcnRpZmFjdElkPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICA8Z3JvdXBJZD5vcmcuanVuaXQuanVwaXRlcjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0LWp1cGl0ZXItZW5naW5lPC9hcnRpZmFjdElkPgogICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CkBAIC03OCw2ICs2OSwxMCBAQAogICA8YnVpbGQ+CiAgICAgPHBsdWdpbnM+CiAgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5zaXN1PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5zaXN1LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgIDxjb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9BYnN0cmFjdFNjcmlwdGVkTW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3IuamF2YSBiL21hdmVuLXBsdWdpbi10b29scy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvQWJzdHJhY3RTY3JpcHRlZE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yLmphdmEKaW5kZXggODk1NWZmYi4uZWUxMWNiYyAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9BYnN0cmFjdFNjcmlwdGVkTW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3IuamF2YQorKysgYi9tYXZlbi1wbHVnaW4tdG9vbHMtYXBpL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL0Fic3RyYWN0U2NyaXB0ZWRNb2pvRGVzY3JpcHRvckV4dHJhY3Rvci5qYXZhCkBAIC0zNyw4ICszNywxMCBAQAogaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5TdHJpbmdVdGlsczsKIAogLyoqCisgKiBAZGVwcmVjYXRlZCBTY3JpcHRpbmcgc3VwcG9ydCBmb3IgbW9qb3MgaXMgZGVwcmVjYXRlZCBhbmQgaXMgcGxhbm5lZCB0cCBiZSByZW1vdmVkIGluIG1hdmVuIDQuMAogICogQGF1dGhvciBqZGNhc2V5CiAgKi8KK0BEZXByZWNhdGVkCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTY3JpcHRlZE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yCiAgICAgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQKICAgICBpbXBsZW1lbnRzIE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yCkBAIC03NSw2ICs3NywxMiBAQAogCiAgICAgICAgIGNvcHlTY3JpcHRzVG9PdXRwdXREaXJlY3RvcnkoIHNjcmlwdEZpbGVzS2V5ZWRCeUJhc2VkaXIsIHByb2plY3QuZ2V0QnVpbGQoKS5nZXRPdXRwdXREaXJlY3RvcnkoKSwgcmVxdWVzdCApOwogCisgICAgICAgIGlmICggIW1vam9EZXNjcmlwdG9ycy5pc0VtcHR5KCkgKQorICAgICAgICB7CisgICAgICAgICAgICBnZXRMb2dnZXIoKS53YXJuKCAiU2NyaXB0aW5nIHN1cHBvcnQgZm9yIG1vam9zIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIHBsYW5uZWQgdG8gYmUgcmVtb3ZlZCBpbiBNYXZlbiA0LiIgKTsKKyAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oICJGb3VuZCAiICsgbW9qb0Rlc2NyaXB0b3JzLnNpemUoKSArICIgc2NyaXB0ZWQgbW9qb3MuIiApOworICAgICAgICB9CisKICAgICAgICAgcmV0dXJuIG1vam9EZXNjcmlwdG9yczsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi10b29scy1hcGkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9zY2FubmVyL0RlZmF1bHRNb2pvU2Nhbm5lci5qYXZhIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL3NjYW5uZXIvRGVmYXVsdE1vam9TY2FubmVyLmphdmEKaW5kZXggNjdkYzVkYy4uZjUzNDg0ZCAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL3NjYW5uZXIvRGVmYXVsdE1vam9TY2FubmVyLmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFwaS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL3NjYW5uZXIvRGVmYXVsdE1vam9TY2FubmVyLmphdmEKQEAgLTE5LDYgKzE5LDkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKKwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmRlc2NyaXB0b3IuSW52YWxpZFBsdWdpbkRlc2NyaXB0b3JFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uZGVzY3JpcHRvci5Nb2pvRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5QbHVnaW5Ub29sc1JlcXVlc3Q7CkBAIC0zNyw2ICs0MCw3IEBACiAvKioKICAqIEBhdXRob3IgamRjYXNleQogICovCitATmFtZWQKIHB1YmxpYyBjbGFzcyBEZWZhdWx0TW9qb1NjYW5uZXIKICAgICBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZAogICAgIGltcGxlbWVudHMgTW9qb1NjYW5uZXIKQEAgLTU0LDYgKzU4LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBleHRyYWN0b3JzIG5vdCBudWxsCiAgICAgICovCisgICAgQEluamVjdAogICAgIHB1YmxpYyBEZWZhdWx0TW9qb1NjYW5uZXIoIE1hcDxTdHJpbmcsIE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yPiBleHRyYWN0b3JzICkKICAgICB7CiAgICAgICAgIHRoaXMubW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3JzID0gZXh0cmFjdG9yczsKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi10b29scy1hcGkvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbCBiL21hdmVuLXBsdWdpbi10b29scy1hcGkvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhNDVkYi4uMDAwMDAwMAotLS0gYS9tYXZlbi1wbHVnaW4tdG9vbHMtYXBpL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbGV4dXMvY29tcG9uZW50cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08IS0tCi0gIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gIH4gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgfiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICB+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICB+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICB+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgfiB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxjb21wb25lbnQtc2V0PgotICA8Y29tcG9uZW50cz4KLQotICAgIDwhLS0KLSAgICAgfAotICAgICB8IE1vam9TY2FubmVyLCB1c2VkIHRvIHNjYW4gYWxsIHR5cGVzIG9mIG1vam8gc291cmNlcyB0byBleHRyYWN0IGRlc2NyaXB0b3IKLSAgICAgfCBpbmZvcm1hdGlvbiB1c2luZyB2YXJpb3VzIE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yJ3MKLSAgICAgfAotICAgICAtLT4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPHJvbGU+b3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uc2Nhbm5lci5Nb2pvU2Nhbm5lcjwvcm9sZT4KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5zY2FubmVyLkRlZmF1bHRNb2pvU2Nhbm5lcjwvaW1wbGVtZW50YXRpb24+Ci0gICAgICA8aW5zdGFudGlhdGlvbi1zdHJhdGVneT5wZXItbG9va3VwPC9pbnN0YW50aWF0aW9uLXN0cmF0ZWd5PgotICAgICAgPHJlcXVpcmVtZW50cz4KLSAgICAgICAgPHJlcXVpcmVtZW50PgotICAgICAgICAgIDxyb2xlPm9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmV4dHJhY3Rvci5Nb2pvRGVzY3JpcHRvckV4dHJhY3Rvcjwvcm9sZT4KLSAgICAgICAgICA8ZmllbGQtbmFtZT5tb2pvRGVzY3JpcHRvckV4dHJhY3RvcnM8L2ZpZWxkLW5hbWU+Ci0gICAgICAgIDwvcmVxdWlyZW1lbnQ+Ci0gICAgICA8L3JlcXVpcmVtZW50cz4KLSAgICA8L2NvbXBvbmVudD4KLQotICA8L2NvbXBvbmVudHM+Ci08L2NvbXBvbmVudC1zZXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWFwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL3NjYW5uZXIvRGVmYXVsdE1vam9TY2FubmVyVGVzdC5qYXZhIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL3NjYW5uZXIvRGVmYXVsdE1vam9TY2FubmVyVGVzdC5qYXZhCmluZGV4IDJjMzY1ZTYuLjc0NmViYzEgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi10b29scy1hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9zY2FubmVyL0RlZmF1bHRNb2pvU2Nhbm5lclRlc3QuamF2YQorKysgYi9tYXZlbi1wbHVnaW4tdG9vbHMtYXBpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vc2Nhbm5lci9EZWZhdWx0TW9qb1NjYW5uZXJUZXN0LmphdmEKQEAgLTI4LDggKzI4LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5EZWZhdWx0UGx1Z2luVG9vbHNSZXF1ZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmV4dHJhY3Rvci5FeHRyYWN0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmV4dHJhY3Rvci5Nb2pvRGVzY3JpcHRvckV4dHJhY3RvcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5CZWZvcmVFYWNoOworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5UZXN0OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CkBAIC00MSwxNCArNDEsMTQgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmZhaWw7CiAKIC8qKgogICogQGF1dGhvciBqZGNhc2V5CiAgKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0TW9qb1NjYW5uZXJUZXN0CitjbGFzcyBEZWZhdWx0TW9qb1NjYW5uZXJUZXN0CiB7CiAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBNb2pvRGVzY3JpcHRvckV4dHJhY3Rvcj4gZXh0cmFjdG9yczsKIApAQCAtNjAsOCArNjAsOCBAQAogCiAgICAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKIAotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpCisgICAgQEJlZm9yZUVhY2gKKyAgICB2b2lkIHNldFVwKCkKICAgICB7CiAgICAgICAgIGV4dHJhY3RvcnMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIGV4dHJhY3RvcnMucHV0KCAib25lIiwgbmV3IFNjYW5uZXJUZXN0RXh0cmFjdG9yKCAib25lIiApICk7CkBAIC04MSw3ICs4MSw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5zcGVjaWZpZWRFeHRyYWN0b3JzKCkKKyAgICB2b2lkIHRlc3RVbnNwZWNpZmllZEV4dHJhY3RvcnMoKQogICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBjcmVhdGVQbHVnaW5EZXNjcmlwdG9yKCk7CkBAIC05Miw3ICs5Miw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkRXh0cmFjdG9ycygpCisgICAgdm9pZCB0ZXN0U3BlY2lmaWVkRXh0cmFjdG9ycygpCiAgICAgICAgIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIFNldDxTdHJpbmc+IGFjdGl2ZUV4dHJhY3RvcnMgPSBuZXcgSGFzaFNldDw+KCk7CkBAIC0xMTAsNyArMTEwLDcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxFeHRyYWN0b3JzVGhyb3VnaE51bGwoKQorICAgIHZvaWQgdGVzdEFsbEV4dHJhY3RvcnNUaHJvdWdoTnVsbCgpCiAgICAgICAgIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIFBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9IGNyZWF0ZVBsdWdpbkRlc2NyaXB0b3IoKTsKQEAgLTEyMiwxMiArMTIyLDEyIEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9FeHRyYWN0b3JzVGhyb3VnaEVtcHR5U2V0KCkKKyAgICB2b2lkIHRlc3ROb0V4dHJhY3RvcnNUaHJvdWdoRW1wdHlTZXQoKQogICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBjcmVhdGVQbHVnaW5EZXNjcmlwdG9yKCk7CiAKLSAgICAgICAgc2Nhbm5lci5zZXRBY3RpdmVFeHRyYWN0b3JzKCBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5U2V0KCkgKTsKKyAgICAgICAgc2Nhbm5lci5zZXRBY3RpdmVFeHRyYWN0b3JzKCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpICk7CiAgICAgICAgIHRyeQogICAgICAgICB7CiAgICAgICAgICAgICBzY2FubmVyLnBvcHVsYXRlUGx1Z2luRGVzY3JpcHRvciggbmV3IERlZmF1bHRQbHVnaW5Ub29sc1JlcXVlc3QoIHByb2plY3QsIHBsdWdpbkRlc2NyaXB0b3IgKSApOwpAQCAtMTM4LDExICsxMzgsMTEgQEAKICAgICAgICAgICAgIC8vIE9rCiAgICAgICAgIH0KIAotICAgICAgICBjaGVja1Jlc3VsdCggcGx1Z2luRGVzY3JpcHRvciwgQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eVNldCgpICk7CisgICAgICAgIGNoZWNrUmVzdWx0KCBwbHVnaW5EZXNjcmlwdG9yLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpICk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93bkV4dHJhY3RvcigpCisgICAgdm9pZCB0ZXN0VW5rbm93bkV4dHJhY3RvcigpCiAgICAgICAgIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIFNldDxTdHJpbmc+IGFjdGl2ZUV4dHJhY3RvcnMgPSBuZXcgSGFzaFNldDw+KCk7CkBAIC0xNjIsNyArMTYyLDcgQEAKICAgICAgICAgICAgIC8vIE9rCiAgICAgICAgIH0KIAotICAgICAgICBjaGVja1Jlc3VsdCggcGx1Z2luRGVzY3JpcHRvciwgQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eVNldCgpICk7CisgICAgICAgIGNoZWNrUmVzdWx0KCBwbHVnaW5EZXNjcmlwdG9yLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpICk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBQbHVnaW5EZXNjcmlwdG9yIGNyZWF0ZVBsdWdpbkRlc2NyaXB0b3IoKQpAQCAtMTk2LDExICsxOTYsMTAgQEAKICAgICAgICAgZm9yICggTW9qb0Rlc2NyaXB0b3IgZGVzYyA6IGRlc2NyaXB0b3JzICkKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCBwbHVnaW5EZXNjcmlwdG9yLCBkZXNjLmdldFBsdWdpbkRlc2NyaXB0b3IoKSApOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggIlVuZXhwZWN0ZWQgZ29hbCBpbiBQbHVnaW5EZXNjcmlwdG9yOiAiICsgZGVzYy5nZXRHb2FsKCksCi0gICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ0dvYWxzLnJlbW92ZSggZGVzYy5nZXRHb2FsKCkgKSApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggcmVtYWluaW5nR29hbHMucmVtb3ZlKCBkZXNjLmdldEdvYWwoKSApLCAiVW5leHBlY3RlZCBnb2FsIGluIFBsdWdpbkRlc2NyaXB0b3I6ICIgKyBkZXNjLmdldEdvYWwoKSApOwogICAgICAgICB9CiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiRXhwZWN0ZWQgZ29hbHMgbWlzc2luZyBmcm9tIFBsdWdpbkRlc2NyaXB0b3I6ICIgKyByZW1haW5pbmdHb2FscywgMCwgcmVtYWluaW5nR29hbHMuc2l6ZSgpICk7CisgICAgICAgIGFzc2VydEVxdWFscyggMCwgcmVtYWluaW5nR29hbHMuc2l6ZSgpLCAiRXhwZWN0ZWQgZ29hbHMgbWlzc2luZyBmcm9tIFBsdWdpbkRlc2NyaXB0b3I6ICIgKyByZW1haW5pbmdHb2FscyApOwogICAgIH0KIAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi10b29scy1hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi91dGlsL1BsdWdpblV0aWxzVGVzdC5qYXZhIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL3V0aWwvUGx1Z2luVXRpbHNUZXN0LmphdmEKaW5kZXggZjRkNDZiMS4uM2VjNTI1MyAxMDA2NDQKLS0tIGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWFwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL3V0aWwvUGx1Z2luVXRpbHNUZXN0LmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL3V0aWwvUGx1Z2luVXRpbHNUZXN0LmphdmEKQEAgLTIwLDE3ICsyMCwxNyBAQAogICovCiAKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5kZXNjcmlwdG9yLlBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLlRlc3Q7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmFzc2VydEVxdWFsczsKIAogLyoqCiAgKiBAYXV0aG9yIGpkY2FzZXkKICAqLwotcHVibGljIGNsYXNzIFBsdWdpblV0aWxzVGVzdAorY2xhc3MgUGx1Z2luVXRpbHNUZXN0CiB7CiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkVHJpbUFydGlmYWN0SWRUb0ZpbmRQbHVnaW5JZCgpCisgICAgdm9pZCB0ZXN0U2hvdWxkVHJpbUFydGlmYWN0SWRUb0ZpbmRQbHVnaW5JZCgpCiAgICAgewogICAgICAgICBhc3NlcnRFcXVhbHMoICJhcnRpZmFjdElkIiwgUGx1Z2luRGVzY3JpcHRvci5nZXRHb2FsUHJlZml4RnJvbUFydGlmYWN0SWQoICJtYXZlbi1hcnRpZmFjdElkLXBsdWdpbiIgKSApOwogICAgICAgICBhc3NlcnRFcXVhbHMoICJhcnRpZmFjdElkIiwgUGx1Z2luRGVzY3JpcHRvci5nZXRHb2FsUHJlZml4RnJvbUFydGlmYWN0SWQoICJtYXZlbi1wbHVnaW4tYXJ0aWZhY3RJZCIgKSApOwpAQCAtNDEsNyArNDEsNyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEZpbmRUd29TY3JpcHRzV2hlbk5vRXhjbHVkZXNBcmVHaXZlbigpCisgICAgdm9pZCB0ZXN0U2hvdWxkRmluZFR3b1NjcmlwdHNXaGVuTm9FeGNsdWRlc0FyZUdpdmVuKCkKICAgICB7CiAgICAgICAgIFN0cmluZyB0ZXN0U2NyaXB0ID0gInRlc3QudHh0IjsKIApAQCAtNTQsNyArNTQsNyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEZpbmRPbmVTY3JpcHRzV2hlbkFuRXhjbHVkZUlzR2l2ZW4oKQorICAgIHZvaWQgdGVzdFNob3VsZEZpbmRPbmVTY3JpcHRzV2hlbkFuRXhjbHVkZUlzR2l2ZW4oKQogICAgIHsKICAgICAgICAgU3RyaW5nIHRlc3RTY3JpcHQgPSAidGVzdC50eHQiOwogCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tdG9vbHMtYXBpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vdXRpbC9UZXN0VXRpbHMuamF2YSBiL21hdmVuLXBsdWdpbi10b29scy1hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi91dGlsL1Rlc3RVdGlscy5qYXZhCmluZGV4IGI5NmQ4NzEuLmE5NGRhYzIgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi10b29scy1hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi91dGlsL1Rlc3RVdGlscy5qYXZhCisrKyBiL21hdmVuLXBsdWdpbi10b29scy1hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi91dGlsL1Rlc3RVdGlscy5qYXZhCkBAIC0xOSwxMyArMTksMTMgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuVGVzdDsKIAogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkFzc2VydGlvbnMuYXNzZXJ0RXF1YWxzOwogCiAvKioKICAqIEBhdXRob3IgamRjYXNleQpAQCAtMzQsNyArMzQsNyBAQAogewogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlybmFtZUZ1bmN0aW9uX01FVEFURVNUKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KKyAgICB2b2lkIHRlc3REaXJuYW1lRnVuY3Rpb25fTUVUQVRFU1QoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IGdldENsYXNzKCkuZ2V0TmFtZSgpLnJlcGxhY2UoICcuJywgJy8nICkgKyAiLmNsYXNzIjsKICAgICAgICAgU3RyaW5nIGJhc2VkaXIgPSBUZXN0VXRpbHMuZGlybmFtZSggY2xhc3NuYW1lICk7CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tdG9vbHMtYXBpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vdXRpbC9zdHVicy9Nb2pvU3R1Yi5qYXZhIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWFwaS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL3V0aWwvc3R1YnMvTW9qb1N0dWIuamF2YQppbmRleCBkNjUyYWZhLi5mMjcxYjAwIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tdG9vbHMtYXBpL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vdXRpbC9zdHVicy9Nb2pvU3R1Yi5qYXZhCisrKyBiL21hdmVuLXBsdWdpbi10b29scy1hcGkvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi91dGlsL3N0dWJzL01vam9TdHViLmphdmEKQEAgLTI4LDggKzI4LDYgQEAKIAogLyoqCiAgKiBEdW1teSBNb2pvLgotICoKLSAqIEBnb2FsIGR1bW15CiAgKi8KIHB1YmxpYyBjbGFzcyBNb2pvU3R1YgogICAgIGV4dGVuZHMgQWJzdHJhY3RNb2pvCmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9wb20ueG1sIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWdlbmVyYXRvcnMvcG9tLnhtbAppbmRleCA3YjIyMWI3Li4xMmQ4OWYzIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9wb20ueG1sCisrKyBiL21hdmVuLXBsdWdpbi10b29scy1nZW5lcmF0b3JzL3BvbS54bWwKQEAgLTg3LDggKzg3LDEzIEBACiAKICAgICA8IS0tIHRlc3QgLS0+CiAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPGdyb3VwSWQ+b3JnLmp1bml0Lmp1cGl0ZXI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdC1qdXBpdGVyLWVuZ2luZTwvYXJ0aWZhY3RJZD4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXRlc3Rpbmc8L2FydGlmYWN0SWQ+CiAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgpAQCAtMTA5LDI0ICsxMTQsNCBAQAogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAKLSAgPHByb2ZpbGVzPgotICAgIDxwcm9maWxlPgotICAgICAgPGlkPnJlcG9ydGluZzwvaWQ+Ci0gICAgICA8cmVwb3J0aW5nPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5sMTBuLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1hbHBoYS0yPC92ZXJzaW9uPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxsb2NhbGVzPgotICAgICAgICAgICAgICAgIDxsb2NhbGU+ZGU8L2xvY2FsZT4KLSAgICAgICAgICAgICAgICA8bG9jYWxlPmZyPC9sb2NhbGU+Ci0gICAgICAgICAgICAgIDwvbG9jYWxlcz4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgICAgPC9yZXBvcnRpbmc+Ci0gICAgPC9wcm9maWxlPgotICA8L3Byb2ZpbGVzPgogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9nZW5lcmF0b3IvUGx1Z2luRGVzY3JpcHRvckdlbmVyYXRvci5qYXZhIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9nZW5lcmF0b3IvUGx1Z2luRGVzY3JpcHRvckdlbmVyYXRvci5qYXZhCmluZGV4IDZlNzc3YzAuLmNmYTQxMzggMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi10b29scy1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZ2VuZXJhdG9yL1BsdWdpbkRlc2NyaXB0b3JHZW5lcmF0b3IuamF2YQorKysgYi9tYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2dlbmVyYXRvci9QbHVnaW5EZXNjcmlwdG9yR2VuZXJhdG9yLmphdmEKQEAgLTE5LDEwICsxOSw3IEBACiAgKiB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKLQogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLldyaXRlcjsKQEAgLTMxLDIwICsyOCwyMiBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5kZXNjcmlwdG9yLkR1cGxpY2F0ZU1vam9EZXNjcmlwdG9yRXhjZXB0aW9uOworCiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uZGVzY3JpcHRvci5Nb2pvRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5kZXNjcmlwdG9yLlBhcmFtZXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5kZXNjcmlwdG9yLlBsdWdpbkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uZGVzY3JpcHRvci5SZXF1aXJlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZzsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLkV4dGVuZGVkTW9qb0Rlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uUGx1Z2luVG9vbHNSZXF1ZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLnV0aWwuUGx1Z2luVXRpbHM7CiBpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5pby5DYWNoaW5nT3V0cHV0U3RyZWFtOwogaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuUHJldHR5UHJpbnRYTUxXcml0ZXI7CiBpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5YTUxXcml0ZXI7CiAKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworCiAvKioKICAqIEdlbmVyYXRlIGEgPGEgaHJlZj0iL3JlZi9jdXJyZW50L21hdmVuLXBsdWdpbi1hcGkvcGx1Z2luLmh0bWwiPk1hdmVuIFBsdWdpbiBEZXNjcmlwdG9yIFhNTCBmaWxlPC9hPiBhbmQKICAqIGNvcnJlc3BvbmRpbmcgPGNvZGU+cGx1Z2luLWhlbHAueG1sPC9jb2RlPiBoZWxwIGNvbnRlbnQgZm9yIHtAbGluayBQbHVnaW5IZWxwR2VuZXJhdG9yfS4KQEAgLTU0LDIwICs1MywxMCBAQAogICAgIGltcGxlbWVudHMgR2VuZXJhdG9yCiB7CiAKLSAgICBwcml2YXRlIGZpbmFsIExvZyBsb2c7Ci0KLSAgICBwdWJsaWMgUGx1Z2luRGVzY3JpcHRvckdlbmVyYXRvciggTG9nIGxvZyApCi0gICAgewotICAgICAgICB0aGlzLmxvZyA9IGxvZzsKLSAgICB9Ci0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBGaWxlIGRlc3RpbmF0aW9uRGlyZWN0b3J5LCBQbHVnaW5Ub29sc1JlcXVlc3QgcmVxdWVzdCApCiAgICAgICAgIHRocm93cyBHZW5lcmF0b3JFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIC8vIGV2ZW50dWFsbHkgcmV3cml0ZSBoZWxwIG1vam8gY2xhc3MgdG8gbWF0Y2ggYWN0dWFsIHBhY2thZ2UgbmFtZQotICAgICAgICBQbHVnaW5IZWxwR2VuZXJhdG9yLnJld3JpdGVIZWxwTW9qbyggcmVxdWVzdCwgbG9nICk7Ci0KICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIHdyaXRlIGNvbXBsZXRlIHBsdWdpbi54bWwgZGVzY3JpcHRvcgpAQCAtODYsMTAgKzc1LDYgQEAKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYXRvckV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKICAgICAgICAgfQotICAgICAgICBjYXRjaCAoIER1cGxpY2F0ZU1vam9EZXNjcmlwdG9yRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhdG9yRXhjZXB0aW9uKCBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VmVyc2lvbigpCkBAIC0xMDAsMjAgKzg1LDE2IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgd3JpdGVEZXNjcmlwdG9yKCBGaWxlIGRlc3RpbmF0aW9uRmlsZSwgUGx1Z2luVG9vbHNSZXF1ZXN0IHJlcXVlc3QsIGJvb2xlYW4gaGVscERlc2NyaXB0b3IgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIER1cGxpY2F0ZU1vam9EZXNjcmlwdG9yRXhjZXB0aW9uCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yID0gcmVxdWVzdC5nZXRQbHVnaW5EZXNjcmlwdG9yKCk7CiAKLSAgICAgICAgaWYgKCBkZXN0aW5hdGlvbkZpbGUuZXhpc3RzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZXN0aW5hdGlvbkZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoICFkZXN0aW5hdGlvbkZpbGUuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpICkKKyAgICAgICAgaWYgKCAhZGVzdGluYXRpb25GaWxlLmdldFBhcmVudEZpbGUoKS5leGlzdHMoKSApCiAgICAgICAgIHsKICAgICAgICAgICAgIGRlc3RpbmF0aW9uRmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7CiAgICAgICAgIH0KIAotICAgICAgICB0cnkgKCBXcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlciggbmV3IEZpbGVPdXRwdXRTdHJlYW0oIGRlc3RpbmF0aW9uRmlsZSApLCBVVEZfOCApICkKKyAgICAgICAgdHJ5ICggV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG5ldyBDYWNoaW5nT3V0cHV0U3RyZWFtKCBkZXN0aW5hdGlvbkZpbGUgKSwgVVRGXzggKSApCiAgICAgICAgIHsKICAgICAgICAgICAgIFhNTFdyaXRlciB3ID0gbmV3IFByZXR0eVByaW50WE1MV3JpdGVyKCB3cml0ZXIsIFVURl84Lm5hbWUoKSwgbnVsbCApOwogCkBAIC0xNjksMTEgKzE1MCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTW9qb0Rlc2NyaXB0b3IoIE1vam9EZXNjcmlwdG9yIG1vam9EZXNjcmlwdG9yLCBYTUxXcml0ZXIgdyApCi0gICAgewotICAgICAgICBwcm9jZXNzTW9qb0Rlc2NyaXB0b3IoIG1vam9EZXNjcmlwdG9yLCB3LCBmYWxzZSApOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIEBwYXJhbSBtb2pvRGVzY3JpcHRvciBub3QgbnVsbAogICAgICAqIEBwYXJhbSB3ICAgICAgICAgICAgICBub3QgbnVsbApkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9nZW5lcmF0b3IvUGx1Z2luSGVscEdlbmVyYXRvci5qYXZhIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9nZW5lcmF0b3IvUGx1Z2luSGVscEdlbmVyYXRvci5qYXZhCmluZGV4IDJjM2FmNTguLjc5ZWY2Y2IgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi10b29scy1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZ2VuZXJhdG9yL1BsdWdpbkhlbHBHZW5lcmF0b3IuamF2YQorKysgYi9tYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2dlbmVyYXRvci9QbHVnaW5IZWxwR2VuZXJhdG9yLmphdmEKQEAgLTE5LDc5ICsxOSw0NCBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5kZXNjcmlwdG9yLk1vam9EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmRlc2NyaXB0b3IuUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLlBsdWdpblRvb2xzUmVxdWVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LlZlbG9jaXR5Q29udGV4dDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLmNvbnNvbGUuQ29uc29sZUxvZ2dlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5JT1V0aWw7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlByb3BlcnR5VXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudmVsb2NpdHkuVmVsb2NpdHlDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ2xhc3NSZWFkZXI7Ci1pbXBvcnQgb3JnLm9iamVjdHdlYi5hc20uQ2xhc3NWaXNpdG9yOwotaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLkNsYXNzV3JpdGVyOwotaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLmNvbW1vbnMuQ2xhc3NSZW1hcHBlcjsKLWltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5jb21tb25zLlJlbWFwcGVyOwotaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLmNvbW1vbnMuU2ltcGxlUmVtYXBwZXI7Ci0KIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnZlbG9jaXR5LlZlbG9jaXR5Q29udGV4dDsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuQWJzdHJhY3RMb2dFbmFibGVkOworaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLmNvbnNvbGUuQ29uc29sZUxvZ2dlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLmlvLkNhY2hpbmdPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy52ZWxvY2l0eS5WZWxvY2l0eUNvbXBvbmVudDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CiAKIC8qKgogICogR2VuZXJhdGVzIGFuIDxjb2RlPkhlbHBNb2pvPC9jb2RlPiBjbGFzcyBmcm9tIDxjb2RlPmhlbHAtY2xhc3Mtc291cmNlLnZtPC9jb2RlPiB0ZW1wbGF0ZS4KICAqIFRoZSBnZW5lcmF0ZWQgbW9qbyByZWFkcyBoZWxwIGNvbnRlbnQgZnJvbSA8Y29kZT5NRVRBLUlORi9tYXZlbi8ke2dyb3VwSWR9LyR7YXJ0aWZhY3RJZH0vcGx1Z2luLWhlbHAueG1sPC9jb2RlPgogICogcmVzb3VyY2UsIHdoaWNoIGlzIGdlbmVyYXRlZCBieSB0aGlzIHtAbGluayBQbHVnaW5EZXNjcmlwdG9yR2VuZXJhdG9yfS4KLSAqIDxwPk5vdGljZSB0aGF0IHRoZSBoZWxwIG1vam8gc291cmNlIG5lZWRzIHRvIGJlIGdlbmVyYXRlZCBiZWZvcmUgY29tcGlsYXRpb24sIGJ1dCB3aGVuIEphdmEgYW5ub3RhdGlvbnMgYXJlIHVzZWQsCi0gKiBwbHVnaW4gZGVzY3JpcHRvciBjb250ZW50IGlzIGF2YWlsYWJsZSBvbmx5IGFmdGVyIGNvbXBpbGF0aW9uIChkZXRlY3RpbmcgYW5ub3RhdGlvbnMgaW4gLmNsYXNzIGZpbGVzKToKLSAqIGhlbHAgbW9qbyBzb3VyY2UgY2FuIGJlIGdlbmVyYXRlZCB3aXRoIGVtcHR5IHBhY2thZ2Ugb25seSAoYW5kIG5vIHBsdWdpbiBkZXNjcmlwdG9yIGF2YWlsYWJsZSB5ZXQpLCB0aGVuIG5lZWRzCi0gKiB0byBiZSB1cGRhdGVkIGFmdGVyIGNvbXBpbGF0aW9uIC0gdGhyb3VnaCB7QGxpbmsgI3Jld3JpdGVIZWxwTW9qbyhQbHVnaW5Ub29sc1JlcXVlc3QsIExvZyl9IHdoaWNoIGlzIGNhbGxlZCBmcm9tCi0gKiBwbHVnaW4gZGVzY3JpcHRvciBYTUwgZ2VuZXJhdGlvbi48L3A+CiAgKgogICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86dmluY2VudC5zaXZldG9uQGdtYWlsLmNvbSI+VmluY2VudCBTaXZldG9uPC9hPgogICogQHNpbmNlIDIuNAogICovCiBwdWJsaWMgY2xhc3MgUGx1Z2luSGVscEdlbmVyYXRvcgogICAgIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkCi0gICAgaW1wbGVtZW50cyBHZW5lcmF0b3IKIHsKICAgICAvKioKICAgICAgKiBEZWZhdWx0IGdlbmVyYXRlZCBjbGFzcyBuYW1lCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFTFBfTU9KT19DTEFTU19OQU1FID0gIkhlbHBNb2pvIjsKIAotICAgIC8qKgotICAgICAqIEhlbHAgcHJvcGVydGllcyBmaWxlLCB0byBzdG9yZSBkYXRhIGFib3V0IGdlbmVyYXRlZCBzb3VyY2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFTFBfUFJPUEVSVElFU19GSUxFTkFNRSA9ICJtYXZlbi1wbHVnaW4taGVscC5wcm9wZXJ0aWVzIjsKLQotICAgIC8qKgotICAgICAqIERlZmF1bHQgZ29hbAotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUxQX0dPQUwgPSAiaGVscCI7Ci0KICAgICBwcml2YXRlIFN0cmluZyBoZWxwUGFja2FnZU5hbWU7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlQW5ub3RhdGlvbnM7Ci0KKyAgICBwcml2YXRlIFN0cmluZyBnb2FsUHJlZml4OworICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IG1hdmVuUHJvamVjdDsKICAgICBwcml2YXRlIFZlbG9jaXR5Q29tcG9uZW50IHZlbG9jaXR5Q29tcG9uZW50OwogCiAgICAgLyoqCkBAIC0xMDYsNDEgKzcxLDEwIEBACiAgICAgLy8gUHVibGljIG1ldGhvZHMKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggRmlsZSBkZXN0aW5hdGlvbkRpcmVjdG9yeSwgUGx1Z2luVG9vbHNSZXF1ZXN0IHJlcXVlc3QgKQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnkgKQogICAgICAgICB0aHJvd3MgR2VuZXJhdG9yRXhjZXB0aW9uCiAgICAgewotICAgICAgICBQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSByZXF1ZXN0LmdldFBsdWdpbkRlc2NyaXB0b3IoKTsKLQotICAgICAgICBTdHJpbmcgaGVscEltcGxlbWVudGF0aW9uID0gZ2V0SW1wbGVtZW50YXRpb24oIHBsdWdpbkRlc2NyaXB0b3IgKTsKLQotICAgICAgICBMaXN0PE1vam9EZXNjcmlwdG9yPiBtb2pvRGVzY3JpcHRvcnMgPSBwbHVnaW5EZXNjcmlwdG9yLmdldE1vam9zKCk7Ci0KLSAgICAgICAgaWYgKCBtb2pvRGVzY3JpcHRvcnMgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IG5vIGhlbHAgZ29hbCBhbHJlYWR5IGV4aXN0cwotICAgICAgICAgICAgTW9qb0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0TW9qbyggSEVMUF9HT0FMICk7Ci0KLSAgICAgICAgICAgIGlmICggKCBkZXNjcmlwdG9yICE9IG51bGwgKSAmJiAhZGVzY3JpcHRvci5nZXRJbXBsZW1lbnRhdGlvbigpLmVxdWFscyggaGVscEltcGxlbWVudGF0aW9uICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggZ2V0TG9nZ2VyKCkuaXNXYXJuRW5hYmxlZCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oICJcblxuQSBoZWxwIGdvYWwgKCIgKyBkZXNjcmlwdG9yLmdldEltcGxlbWVudGF0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBwbHVnaW4uIFNLSVBQRUQgVEhFICIgKyBoZWxwSW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBHRU5FUkFUSU9OLlxuIiApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlSGVscFByb3BlcnRpZXNGaWxlKCByZXF1ZXN0LCBkZXN0aW5hdGlvbkRpcmVjdG9yeSApOwotCi0gICAgICAgIHVzZUFubm90YXRpb25zID0gcmVxdWVzdC5nZXRQcm9qZWN0KCkuZ2V0QXJ0aWZhY3RNYXAoKS5jb250YWluc0tleSgKLSAgICAgICAgICAgICJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10b29sczptYXZlbi1wbHVnaW4tYW5ub3RhdGlvbnMiICk7CisgICAgICAgIFN0cmluZyBoZWxwSW1wbGVtZW50YXRpb24gPSBnZXRJbXBsZW1lbnRhdGlvbigpOwogCiAgICAgICAgIHRyeQogICAgICAgICB7CkBAIC0xNTAsOSArODQsMTIgQEAKICAgICAgICAgICAgIGhlbHBDbGFzcy5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7CiAKICAgICAgICAgICAgIFN0cmluZyBoZWxwQ2xhc3NTb3VyY2VzID0KLSAgICAgICAgICAgICAgICBnZXRIZWxwQ2xhc3NTb3VyY2VzKCBnZXRQbHVnaW5IZWxwUGF0aCggcmVxdWVzdC5nZXRQcm9qZWN0KCkgKSwgcGx1Z2luRGVzY3JpcHRvciApOworICAgICAgICAgICAgICAgIGdldEhlbHBDbGFzc1NvdXJjZXMoIGdldFBsdWdpbkhlbHBQYXRoKCBtYXZlblByb2plY3QgKSApOwogCi0gICAgICAgICAgICBGaWxlVXRpbHMuZmlsZVdyaXRlKCBoZWxwQ2xhc3MsIHJlcXVlc3QuZ2V0RW5jb2RpbmcoKSwgaGVscENsYXNzU291cmNlcyApOworICAgICAgICAgICAgdHJ5ICggV3JpdGVyIHcgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKCBuZXcgQ2FjaGluZ091dHB1dFN0cmVhbSggaGVscENsYXNzICksIFVURl84ICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHcud3JpdGUoIGhlbHBDbGFzc1NvdXJjZXMgKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjYXRjaCAoIElPRXhjZXB0aW9uIGUgKQogICAgICAgICB7CkBAIC0xNjYsMzggKzEwMyw0MCBAQAogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKLSAgICBwdWJsaWMgVmVsb2NpdHlDb21wb25lbnQgZ2V0VmVsb2NpdHlDb21wb25lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZlbG9jaXR5Q29tcG9uZW50OwotICAgIH0KLQogICAgIHB1YmxpYyBQbHVnaW5IZWxwR2VuZXJhdG9yIHNldFZlbG9jaXR5Q29tcG9uZW50KCBWZWxvY2l0eUNvbXBvbmVudCB2ZWxvY2l0eUNvbXBvbmVudCApCiAgICAgewogICAgICAgICB0aGlzLnZlbG9jaXR5Q29tcG9uZW50ID0gdmVsb2NpdHlDb21wb25lbnQ7CiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAorICAgIHB1YmxpYyBQbHVnaW5IZWxwR2VuZXJhdG9yIHNldEdvYWxQcmVmaXgoIFN0cmluZyBnb2FsUHJlZml4ICkKKyAgICB7CisgICAgICAgIHRoaXMuZ29hbFByZWZpeCA9IGdvYWxQcmVmaXg7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBQbHVnaW5IZWxwR2VuZXJhdG9yIHNldE1hdmVuUHJvamVjdCggTWF2ZW5Qcm9qZWN0IG1hdmVuUHJvamVjdCApCisgICAgeworICAgICAgICB0aGlzLm1hdmVuUHJvamVjdCA9IG1hdmVuUHJvamVjdDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIFByaXZhdGUgbWV0aG9kcwogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgIHByaXZhdGUgU3RyaW5nIGdldEhlbHBDbGFzc1NvdXJjZXMoIFN0cmluZyBwbHVnaW5IZWxwUGF0aCwgUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yICkKKyAgICBwcml2YXRlIFN0cmluZyBnZXRIZWxwQ2xhc3NTb3VyY2VzKCBTdHJpbmcgcGx1Z2luSGVscFBhdGggKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIFZlbG9jaXR5Q29udGV4dCBjb250ZXh0ID0gbmV3IFZlbG9jaXR5Q29udGV4dCggcHJvcGVydGllcyApOwotICAgICAgICBpZiAoIHRoaXMuaGVscFBhY2thZ2VOYW1lICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dCggImhlbHBQYWNrYWdlTmFtZSIsIHRoaXMuaGVscFBhY2thZ2VOYW1lICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dCggImhlbHBQYWNrYWdlTmFtZSIsICIiICk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcGVydGllcy5wdXQoICJwbHVnaW5IZWxwUGF0aCIsIHBsdWdpbkhlbHBQYXRoICk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KCAiYXJ0aWZhY3RJZCIsIHBsdWdpbkRlc2NyaXB0b3IuZ2V0QXJ0aWZhY3RJZCgpICk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KCAiZ29hbFByZWZpeCIsIHBsdWdpbkRlc2NyaXB0b3IuZ2V0R29hbFByZWZpeCgpICk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KCAidXNlQW5ub3RhdGlvbnMiLCB1c2VBbm5vdGF0aW9ucyApOworICAgICAgICBWZWxvY2l0eUNvbnRleHQgY29udGV4dCA9IG5ldyBWZWxvY2l0eUNvbnRleHQoKTsKKyAgICAgICAgYm9vbGVhbiB1c2VBbm5vdGF0aW9ucyA9IG1hdmVuUHJvamVjdC5nZXRBcnRpZmFjdE1hcCgpLmNvbnRhaW5zS2V5KAorICAgICAgICAgICAgIm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLXRvb2xzOm1hdmVuLXBsdWdpbi1hbm5vdGF0aW9ucyIgKTsKKworICAgICAgICBjb250ZXh0LnB1dCggImhlbHBQYWNrYWdlTmFtZSIsIGhlbHBQYWNrYWdlTmFtZSApOworICAgICAgICBjb250ZXh0LnB1dCggInBsdWdpbkhlbHBQYXRoIiwgcGx1Z2luSGVscFBhdGggKTsKKyAgICAgICAgY29udGV4dC5wdXQoICJhcnRpZmFjdElkIiwgbWF2ZW5Qcm9qZWN0LmdldEFydGlmYWN0SWQoKSApOworICAgICAgICBjb250ZXh0LnB1dCggImdvYWxQcmVmaXgiLCBnb2FsUHJlZml4ICk7CisgICAgICAgIGNvbnRleHQucHV0KCAidXNlQW5ub3RhdGlvbnMiLCB1c2VBbm5vdGF0aW9ucyApOwogCiAgICAgICAgIFN0cmluZ1dyaXRlciBzdHJpbmdXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CiAKQEAgLTIxNSwyMjYgKzE1NCwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBwYXJhbSBwbHVnaW5EZXNjcmlwdG9yIFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBwbHVnaW4gZm9yIHdoaWNoIHRvIGdlbmVyYXRlIGEgaGVscCBnb2FsLCBtdXN0IG5vdCBiZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgogICAgICAqIEByZXR1cm4gVGhlIGltcGxlbWVudGF0aW9uLgogICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uKCBQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgKQorICAgIHByaXZhdGUgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uKCApCiAgICAgewotICAgICAgICBpZiAoIFN0cmluZ1V0aWxzLmlzRW1wdHkoIGhlbHBQYWNrYWdlTmFtZSApICkKLSAgICAgICAgewotICAgICAgICAgICAgaGVscFBhY2thZ2VOYW1lID0gR2VuZXJhdG9yVXRpbHMuZGlzY292ZXJQYWNrYWdlTmFtZSggcGx1Z2luRGVzY3JpcHRvciApOwotICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLmlzRW1wdHkoIGhlbHBQYWNrYWdlTmFtZSApCiAgICAgICAgICAgICA/IEhFTFBfTU9KT19DTEFTU19OQU1FCiAgICAgICAgICAgICA6IGhlbHBQYWNrYWdlTmFtZSArICcuJyArIEhFTFBfTU9KT19DTEFTU19OQU1FOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFdyaXRlIGhlbHAgcHJvcGVydGllcyBmaWxlcyBmb3IgbGF0ZXIgdXNlIHRvIGV2ZW50dWFsbHkgcmV3cml0ZSBIZWxwIE1vam8uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVxdWVzdAotICAgICAqIEB0aHJvd3MgR2VuZXJhdG9yRXhjZXB0aW9uCi0gICAgICogQHNlZSB7QGxpbmsgI3Jld3JpdGVIZWxwTW9qbyhQbHVnaW5Ub29sc1JlcXVlc3QsIExvZyl9Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlSGVscFByb3BlcnRpZXNGaWxlKCBQbHVnaW5Ub29sc1JlcXVlc3QgcmVxdWVzdCwgRmlsZSBkZXN0aW5hdGlvbkRpcmVjdG9yeSApCi0gICAgICAgIHRocm93cyBHZW5lcmF0b3JFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BlcnRpZXMucHV0KCAiaGVscFBhY2thZ2VOYW1lIiwgaGVscFBhY2thZ2VOYW1lID09IG51bGwgPyAiIiA6IGhlbHBQYWNrYWdlTmFtZSApOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dCggImRlc3RpbmF0aW9uRGlyZWN0b3J5IiwgZGVzdGluYXRpb25EaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLQotICAgICAgICBGaWxlIHRtcFByb3BlcnRpZXNGaWxlID0gbmV3IEZpbGUoIHJlcXVlc3QuZ2V0UHJvamVjdCgpLmdldEJ1aWxkKCkuZ2V0RGlyZWN0b3J5KCksIEhFTFBfUFJPUEVSVElFU19GSUxFTkFNRSApOwotCi0gICAgICAgIGlmICggdG1wUHJvcGVydGllc0ZpbGUuZXhpc3RzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0bXBQcm9wZXJ0aWVzRmlsZS5kZWxldGUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggIXRtcFByb3BlcnRpZXNGaWxlLmdldFBhcmVudEZpbGUoKS5leGlzdHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRtcFByb3BlcnRpZXNGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSAoIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oIHRtcFByb3BlcnRpZXNGaWxlICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9wZXJ0aWVzLnN0b3JlKCBmb3MsICJtYXZlbiBwbHVnaW4gaGVscCBtb2pvIGdlbmVyYXRpb24gaW5mb3JtYXRpb25zIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSU9FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmF0b3JFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbkhlbHBQYXRoKCBNYXZlblByb2plY3QgbWF2ZW5Qcm9qZWN0ICkKICAgICB7CiAgICAgICAgIHJldHVybiBtYXZlblByb2plY3QuZ2V0R3JvdXBJZCgpICsgIi8iICsgbWF2ZW5Qcm9qZWN0LmdldEFydGlmYWN0SWQoKSArICIvcGx1Z2luLWhlbHAueG1sIjsKICAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXdyaXRlIEhlbHAgTW9qbyB0byBtYXRjaCBhY3R1YWwgTW9qb3MgcGFja2FnZSBuYW1lIGlmIGl0IHdhcyBub3QgYXZhaWxhYmxlIGF0IHNvdXJjZSBnZW5lcmF0aW9uCi0gICAgICogdGltZS4gVGhpcyBpcyB1c2VkIGF0IGRlc2NyaXB0b3IgZ2VuZXJhdGlvbiB0aW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QKLSAgICAgKiBAdGhyb3dzIEdlbmVyYXRvckV4Y2VwdGlvbgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIHJld3JpdGVIZWxwTW9qbyggUGx1Z2luVG9vbHNSZXF1ZXN0IHJlcXVlc3QsIExvZyBsb2cgKQotICAgICAgICB0aHJvd3MgR2VuZXJhdG9yRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIHRtcFByb3BlcnRpZXNGaWxlID0gbmV3IEZpbGUoIHJlcXVlc3QuZ2V0UHJvamVjdCgpLmdldEJ1aWxkKCkuZ2V0RGlyZWN0b3J5KCksIEhFTFBfUFJPUEVSVElFU19GSUxFTkFNRSApOwotCi0gICAgICAgIGlmICggIXRtcFByb3BlcnRpZXNGaWxlLmV4aXN0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvcGVydGllcyA9IFByb3BlcnR5VXRpbHMubG9hZFByb3BlcnRpZXMoIHRtcFByb3BlcnRpZXNGaWxlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYXRvckV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBoZWxwUGFja2FnZU5hbWUgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KCAiaGVscFBhY2thZ2VOYW1lIiApOwotCi0gICAgICAgIC8vIGlmIGhlbHBQYWNrYWdlTmFtZSBwcm9wZXJ0eSBpcyBlbXB0eSwgd2UgaGF2ZSB0byByZXdyaXRlIHRoZSBjbGFzcyB3aXRoIGEgYmV0dGVyIHBhY2thZ2UgbmFtZSB0aGFuIGVtcHR5Ci0gICAgICAgIGlmICggU3RyaW5nVXRpbHMuaXNFbXB0eSggaGVscFBhY2thZ2VOYW1lICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZGVzdERpciA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoICJkZXN0aW5hdGlvbkRpcmVjdG9yeSIgKTsKLSAgICAgICAgICAgIEZpbGUgZGVzdGluYXRpb25EaXJlY3Rvcnk7Ci0gICAgICAgICAgICBpZiAoIFN0cmluZ1V0aWxzLmlzRW1wdHkoIGRlc3REaXIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gd3JpdGVIZWxwUHJvcGVydGllc0ZpbGUoKSBjcmVhdGVzIDIgcHJvcGVydGllczogZmluZCBvbmUgd2l0aG91dCB0aGUgb3RoZXIgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZQotICAgICAgICAgICAgICAgIGxvZy53YXJuKCAiXG5cblVuZXhwZWN0ZWQgc2l0dWF0aW9uOiBkZXN0aW5hdGlvbkRpcmVjdG9yeSBub3QgZGVmaW5lZCBpbiAiICsgSEVMUF9QUk9QRVJUSUVTX0ZJTEVOQU1FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZHVyaW5nIGhlbHAgbW9qbyBzb3VyY2UgZ2VuZXJhdGlvbiBidXQgZXhwZWN0ZWQgZHVyaW5nIFhNTCBkZXNjcmlwdG9yIGdlbmVyYXRpb24uIiApOwotICAgICAgICAgICAgICAgIGxvZy53YXJuKCAiUGxlYXNlIGNoZWNrIGhlbHBtb2pvIGdvYWwgdmVyc2lvbiB1c2VkIGluIHByZXZpb3VzIGJ1aWxkIHBoYXNlLiIgKTsKLSAgICAgICAgICAgICAgICBsb2cud2FybiggIklmIHlvdSBqdXN0IHVwZ3JhZGVkIHRvIHBsdWdpbi10b29scyA+PSAzLjIgeW91IG11c3QgcnVuIGEgY2xlYW4gYnVpbGQgYXQgbGVhc3Qgb25jZS4iICk7Ci0gICAgICAgICAgICAgICAgZGVzdGluYXRpb25EaXJlY3RvcnkgPSBuZXcgRmlsZSggInRhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9wbHVnaW4iICk7Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oICJUcnlpbmcgZGVmYXVsdCBsb2NhdGlvbjogIiArIGRlc3RpbmF0aW9uRGlyZWN0b3J5ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGVzdGluYXRpb25EaXJlY3RvcnkgPSBuZXcgRmlsZSggZGVzdERpciApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGhlbHBNb2pvSW1wbGVtZW50YXRpb24gPSByZXdyaXRlSGVscENsYXNzVG9Nb2pvUGFja2FnZSggcmVxdWVzdCwgZGVzdGluYXRpb25EaXJlY3RvcnksIGxvZyApOwotCi0gICAgICAgICAgICBpZiAoIGhlbHBNb2pvSW1wbGVtZW50YXRpb24gIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gcmV3cml0ZSBwbHVnaW4gZGVzY3JpcHRvciB3aXRoIG5ldyBIZWxwTW9qbyBpbXBsZW1lbnRhdGlvbiBjbGFzcwotICAgICAgICAgICAgICAgIHVwZGF0ZUhlbHBNb2pvRGVzY3JpcHRvciggcmVxdWVzdC5nZXRQbHVnaW5EZXNjcmlwdG9yKCksIGhlbHBNb2pvSW1wbGVtZW50YXRpb24gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZXdyaXRlSGVscENsYXNzVG9Nb2pvUGFja2FnZSggUGx1Z2luVG9vbHNSZXF1ZXN0IHJlcXVlc3QsIEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cgbG9nICkKLSAgICAgICAgdGhyb3dzIEdlbmVyYXRvckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGRlc3RpbmF0aW9uUGFja2FnZSA9IEdlbmVyYXRvclV0aWxzLmRpc2NvdmVyUGFja2FnZU5hbWUoIHJlcXVlc3QuZ2V0UGx1Z2luRGVzY3JpcHRvcigpICk7Ci0gICAgICAgIGlmICggU3RyaW5nVXRpbHMuaXNFbXB0eSggZGVzdGluYXRpb25QYWNrYWdlICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcGFja2FnZUFzRGlyZWN0b3J5ID0gU3RyaW5nVXRpbHMucmVwbGFjZSggZGVzdGluYXRpb25QYWNrYWdlLCAnLicsICcvJyApOwotCi0gICAgICAgIFN0cmluZyBvdXRwdXREaXJlY3RvcnkgPSByZXF1ZXN0LmdldFByb2plY3QoKS5nZXRCdWlsZCgpLmdldE91dHB1dERpcmVjdG9yeSgpOwotICAgICAgICBGaWxlIGhlbHBDbGFzc0ZpbGUgPSBuZXcgRmlsZSggb3V0cHV0RGlyZWN0b3J5LCBIRUxQX01PSk9fQ0xBU1NfTkFNRSArICIuY2xhc3MiICk7Ci0gICAgICAgIGlmICggIWhlbHBDbGFzc0ZpbGUuZXhpc3RzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJld3JpdGUgaGVscCBtb2pvIHNvdXJjZQotICAgICAgICBGaWxlIGhlbHBTb3VyY2VGaWxlID0gbmV3IEZpbGUoIGRlc3RpbmF0aW9uRGlyZWN0b3J5LCBIRUxQX01PSk9fQ0xBU1NfTkFNRSArICIuamF2YSIgKTsKLSAgICAgICAgaWYgKCAhaGVscFNvdXJjZUZpbGUuZXhpc3RzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cud2FybiggIkhlbHBNb2pvLmphdmEgbm90IGZvdW5kIGluIGRlZmF1bHQgbG9jYXRpb246ICIgKyBoZWxwU291cmNlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICAgICAgbG9nLndhcm4oICJIZWxwIGdvYWwgc291cmNlIHdvbid0IGJlIG1vdmVkIHRvIHBhY2thZ2U6ICIgKyBkZXN0aW5hdGlvblBhY2thZ2UgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgaGVscFNvdXJjZUZpbGVOZXcgPQotICAgICAgICAgICAgICAgIG5ldyBGaWxlKCBkZXN0aW5hdGlvbkRpcmVjdG9yeSwgcGFja2FnZUFzRGlyZWN0b3J5ICsgJy8nICsgSEVMUF9NT0pPX0NMQVNTX05BTUUgKyAiLmphdmEiICk7Ci0gICAgICAgICAgICBpZiAoICFoZWxwU291cmNlRmlsZU5ldy5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhlbHBTb3VyY2VGaWxlTmV3LmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENoYXJzZXQgZW5jb2RpbmcgPSBDaGFyc2V0LmZvck5hbWUoIHJlcXVlc3QuZ2V0RW5jb2RpbmcoKSApOwotICAgICAgICAgICAgdHJ5ICggUmVhZGVyIHNvdXJjZVJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlciggbmV3IEZpbGVJbnB1dFN0cmVhbSggaGVscFNvdXJjZUZpbGUgKSwgLy8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgKTsgLy8KLSAgICAgICAgICAgICAgICAgUHJpbnRXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFByaW50V3JpdGVyKAotICAgICAgICAgICAgICAgICAgICAgbmV3IE91dHB1dFN0cmVhbVdyaXRlciggbmV3IEZpbGVPdXRwdXRTdHJlYW0oIGhlbHBTb3VyY2VGaWxlTmV3ICksIC8vCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyApICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNvdXJjZVdyaXRlci5wcmludGxuKCAicGFja2FnZSAiICsgZGVzdGluYXRpb25QYWNrYWdlICsgIjsiICk7Ci0gICAgICAgICAgICAgICAgSU9VdGlsLmNvcHkoIHNvdXJjZVJlYWRlciwgc291cmNlV3JpdGVyICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIElPRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmF0b3JFeGNlcHRpb24oIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoZWxwU291cmNlRmlsZU5ldy5zZXRMYXN0TW9kaWZpZWQoIGhlbHBTb3VyY2VGaWxlLmxhc3RNb2RpZmllZCgpICk7Ci0gICAgICAgICAgICBoZWxwU291cmNlRmlsZS5kZWxldGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJld3JpdGUgaGVscCBtb2pvIC5jbGFzcwotICAgICAgICBGaWxlIHJld3JpdGVIZWxwQ2xhc3NGaWxlID0KLSAgICAgICAgICAgIG5ldyBGaWxlKCBvdXRwdXREaXJlY3RvcnkgKyAnLycgKyBwYWNrYWdlQXNEaXJlY3RvcnksIEhFTFBfTU9KT19DTEFTU19OQU1FICsgIi5jbGFzcyIgKTsKLSAgICAgICAgaWYgKCAhcmV3cml0ZUhlbHBDbGFzc0ZpbGUuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV3cml0ZUhlbHBDbGFzc0ZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2xhc3NSZWFkZXIgY3I7Ci0gICAgICAgIHRyeSAoIEZpbGVJbnB1dFN0cmVhbSBmaWxlSW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBoZWxwQ2xhc3NGaWxlICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjciA9IG5ldyBDbGFzc1JlYWRlciggZmlsZUlucHV0U3RyZWFtICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYXRvckV4Y2VwdGlvbiggZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIENsYXNzV3JpdGVyIGN3ID0gbmV3IENsYXNzV3JpdGVyKCAwICk7Ci0KLSAgICAgICAgUmVtYXBwZXIgcGFja2FnZVJlbWFwcGVyID0KLSAgICAgICAgICAgIG5ldyBTaW1wbGVSZW1hcHBlciggSEVMUF9NT0pPX0NMQVNTX05BTUUsIHBhY2thZ2VBc0RpcmVjdG9yeSArICcvJyArIEhFTFBfTU9KT19DTEFTU19OQU1FICk7Ci0gICAgICAgIENsYXNzVmlzaXRvciBjdiA9IG5ldyBDbGFzc1JlbWFwcGVyKCBjdywgcGFja2FnZVJlbWFwcGVyICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNyLmFjY2VwdCggY3YsIENsYXNzUmVhZGVyLkVYUEFORF9GUkFNRVMgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIFRocm93YWJsZSBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYXRvckV4Y2VwdGlvbiggIkFTTSBpc3N1ZSBwcm9jZXNzaW5nIGNsYXNzLWZpbGUgIiArIGhlbHBDbGFzc0ZpbGUuZ2V0UGF0aCgpLCBlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBieXRlW10gcmVuYW1lZENsYXNzID0gY3cudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgdHJ5ICggRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggcmV3cml0ZUhlbHBDbGFzc0ZpbGUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcy53cml0ZSggcmVuYW1lZENsYXNzICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYXRvckV4Y2VwdGlvbiggIkVycm9yIHJld3JpdGluZyBoZWxwIGNsYXNzOiAiICsgZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGhlbHBDbGFzc0ZpbGUuZGVsZXRlKCk7Ci0KLSAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uUGFja2FnZSArICIuSGVscE1vam8iOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlSGVscE1vam9EZXNjcmlwdG9yKCBQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IsIFN0cmluZyBoZWxwTW9qb0ltcGxlbWVudGF0aW9uICkKLSAgICB7Ci0gICAgICAgIE1vam9EZXNjcmlwdG9yIG1vam9EZXNjcmlwdG9yID0gcGx1Z2luRGVzY3JpcHRvci5nZXRNb2pvKCBIRUxQX0dPQUwgKTsKLQotICAgICAgICBpZiAoIG1vam9EZXNjcmlwdG9yICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2pvRGVzY3JpcHRvci5zZXRJbXBsZW1lbnRhdGlvbiggaGVscE1vam9JbXBsZW1lbnRhdGlvbiApOwotICAgICAgICB9Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9nZW5lcmF0b3IvUGx1Z2luWGRvY0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWdlbmVyYXRvcnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9nZW5lcmF0b3IvUGx1Z2luWGRvY0dlbmVyYXRvci5qYXZhCmluZGV4IGMxN2VjNTkuLjQ4MWRjNWEgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi10b29scy1nZW5lcmF0b3JzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZ2VuZXJhdG9yL1BsdWdpblhkb2NHZW5lcmF0b3IuamF2YQorKysgYi9tYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2dlbmVyYXRvci9QbHVnaW5YZG9jR2VuZXJhdG9yLmphdmEKQEAgLTI3LDExICsyNywxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLkV4dGVuZGVkTW9qb0Rlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uUGx1Z2luVG9vbHNSZXF1ZXN0OwogaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuaW8uQ2FjaGluZ091dHB1dFN0cmVhbTsKIGltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLlByZXR0eVByaW50WE1MV3JpdGVyOwogaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuWE1MV3JpdGVyOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CkBAIC0xMzMsNyArMTMzLDcgQEAKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZSggZGVzdGluYXRpb25EaXJlY3RvcnksIGdldE1vam9GaWxlbmFtZSggbW9qb0Rlc2NyaXB0b3IsICJ4bWwiICkgKTsKLSAgICAgICAgdHJ5ICggV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBvdXRwdXRGaWxlICksIFVURl84ICkgKQorICAgICAgICB0cnkgKCBXcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlciggbmV3IENhY2hpbmdPdXRwdXRTdHJlYW0oIG91dHB1dEZpbGUgKSwgVVRGXzggKSApCiAgICAgICAgIHsKICAgICAgICAgICAgIFhNTFdyaXRlciB3ID0gbmV3IFByZXR0eVByaW50WE1MV3JpdGVyKCBuZXcgUHJpbnRXcml0ZXIoIHdyaXRlciApLCBVVEZfOC5uYW1lKCksIG51bGwgKTsKICAgICAgICAgICAgIHdyaXRlQm9keSggbW9qb0Rlc2NyaXB0b3IsIHcgKTsKZGlmZiAtLWdpdCBhL21hdmVuLXBsdWdpbi10b29scy1nZW5lcmF0b3JzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZ2VuZXJhdG9yL0Fic3RyYWN0R2VuZXJhdG9yVGVzdENhc2UuamF2YSBiL21hdmVuLXBsdWdpbi10b29scy1nZW5lcmF0b3JzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZ2VuZXJhdG9yL0Fic3RyYWN0R2VuZXJhdG9yVGVzdENhc2UuamF2YQppbmRleCBiMTM4ZjRjLi5jM2E0M2MzIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2dlbmVyYXRvci9BYnN0cmFjdEdlbmVyYXRvclRlc3RDYXNlLmphdmEKKysrIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWdlbmVyYXRvcnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9nZW5lcmF0b3IvQWJzdHJhY3RHZW5lcmF0b3JUZXN0Q2FzZS5qYXZhCkBAIC0yNyw5ICsyNyw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5TeXN0ZW1TdHJlYW1Mb2c7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5EZWZhdWx0UGx1Z2luVG9vbHNSZXF1ZXN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuUGxleHVzVGVzdENhc2U7CiBpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQucmVwb3NpdG9yeS5Db21wb25lbnREZXBlbmRlbmN5OwogaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLlRlc3Q7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CkBAIC00MiwyMCArNDIsMTIgQEAKICAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmphc29uQG1hdmVuLm9yZyI+SmFzb24gdmFuIFp5bCA8L2E+CiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEdlbmVyYXRvclRlc3RDYXNlCi0gICAgZXh0ZW5kcyBQbGV4dXNUZXN0Q2FzZQogewogICAgIHByb3RlY3RlZCBHZW5lcmF0b3IgZ2VuZXJhdG9yOwogCi0gICAgcHJvdGVjdGVkIFN0cmluZyBiYXNlZGlyOworICAgIHByb3RlY3RlZCBTdHJpbmcgYmFzZWRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSggImJhc2VkaXIiICk7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIGJhc2VkaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoICJiYXNlZGlyIiApOwotICAgIH0KLQorICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRvcigpCiAgICAgICAgIHRocm93cyBFeGNlcHRpb24KICAgICB7CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2dlbmVyYXRvci9HZW5lcmF0b3JVdGlsc1Rlc3QuamF2YSBiL21hdmVuLXBsdWdpbi10b29scy1nZW5lcmF0b3JzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZ2VuZXJhdG9yL0dlbmVyYXRvclV0aWxzVGVzdC5qYXZhCmluZGV4IGJiNWEzMGQuLmEzNWViZGYgMTAwNjQ0Ci0tLSBhL21hdmVuLXBsdWdpbi10b29scy1nZW5lcmF0b3JzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZ2VuZXJhdG9yL0dlbmVyYXRvclV0aWxzVGVzdC5qYXZhCisrKyBiL21hdmVuLXBsdWdpbi10b29scy1nZW5lcmF0b3JzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZ2VuZXJhdG9yL0dlbmVyYXRvclV0aWxzVGVzdC5qYXZhCkBAIC0zMSwxOSArMzEsMTkgQEAKIGltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5yZXBvc2l0b3J5LkNvbXBvbmVudERlcGVuZGVuY3k7CiBpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5Db21wYWN0WE1MV3JpdGVyOwogaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuWE1MV3JpdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5UZXN0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkFzc2VydGlvbnMuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRydWU7CiAKIC8qKgogICogQGF1dGhvciBqZGNhc2V5CiAgKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0b3JVdGlsc1Rlc3QKK2NsYXNzIEdlbmVyYXRvclV0aWxzVGVzdAogewogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNob3VsZFdyaXRlRGVwZW5kZW5jaWVzKCkKKyAgICB2b2lkIHRlc3RTaG91bGRXcml0ZURlcGVuZGVuY2llcygpCiAgICAgICAgIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIENvbXBvbmVudERlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IG5ldyBDb21wb25lbnREZXBlbmRlbmN5KCk7CkBAIC03MSw3ICs3MSw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWFrZUh0bWxWYWxpZCgpCisgICAgdm9pZCB0ZXN0TWFrZUh0bWxWYWxpZCgpCiAgICAgewogICAgICAgICBTdHJpbmcgamF2YWRvYyA9IG51bGw7CiAgICAgICAgIGFzc2VydEVxdWFscyggIiIsIEdlbmVyYXRvclV0aWxzLm1ha2VIdG1sVmFsaWQoIGphdmFkb2MgKSApOwpAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlSmF2YWRvY1RhZ3MoKQorICAgIHZvaWQgdGVzdERlY29kZUphdmFkb2NUYWdzKCkKICAgICB7CiAgICAgICAgIFN0cmluZyBqYXZhZG9jID0gbnVsbDsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCAiIiwgR2VuZXJhdG9yVXRpbHMuZGVjb2RlSmF2YWRvY1RhZ3MoIGphdmFkb2MgKSApOwpAQCAtMTU5LDcgKzE1OSw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VG9UZXh0KCkKKyAgICB2b2lkIHRlc3RUb1RleHQoKQogICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBTdHJpbmcgamF2YWRvYyA9IG51bGw7CkBAIC0xOTEsNyArMTkxLDcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJc01hdmVuUmVwb3J0KCkKKyAgICB2b2lkIHRlc3RJc01hdmVuUmVwb3J0KCkKICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgdHJ5CkBAIC0yMTUsNyArMjE1LDcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNsdWRlUHJvdmlkZWRTY29wZUZvcm1Db21wb25lbnREZXBlbmRlbmNpZXMoKQorICAgIHZvaWQgdGVzdEV4Y2x1ZGVQcm92aWRlZFNjb3BlRm9ybUNvbXBvbmVudERlcGVuZGVuY2llcygpCiAgICAgewogCiAgICAgICAgIEFydGlmYWN0IGExID0gbmV3IERlZmF1bHRBcnRpZmFjdCggImciLCAiYTEiLCAiMS4wIiwgQXJ0aWZhY3QuU0NPUEVfQ09NUElMRSwgImphciIsICIiLCBudWxsICk7CkBAIC0yMzksNSArMjM5LDQgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCBhMy5nZXRWZXJzaW9uKCksIGNvbXBvbmVudERlcGVuZGVuY3kyLmdldFZlcnNpb24oKSApOwogICAgICAgICBhc3NlcnRFcXVhbHMoIGEzLmdldFR5cGUoKSwgY29tcG9uZW50RGVwZW5kZW5jeTIuZ2V0VHlwZSgpICk7CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2dlbmVyYXRvci9QbHVnaW5EZXNjcmlwdG9yR2VuZXJhdG9yVGVzdC5qYXZhIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWdlbmVyYXRvcnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9nZW5lcmF0b3IvUGx1Z2luRGVzY3JpcHRvckdlbmVyYXRvclRlc3QuamF2YQppbmRleCA4NzA0NjZkLi4xYjczZjRhIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2dlbmVyYXRvci9QbHVnaW5EZXNjcmlwdG9yR2VuZXJhdG9yVGVzdC5qYXZhCisrKyBiL21hdmVuLXBsdWdpbi10b29scy1nZW5lcmF0b3JzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZ2VuZXJhdG9yL1BsdWdpbkRlc2NyaXB0b3JHZW5lcmF0b3JUZXN0LmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5kZXNjcmlwdG9yLlBsdWdpbkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uZGVzY3JpcHRvci5QbHVnaW5EZXNjcmlwdG9yQnVpbGRlcjsKIGltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5yZXBvc2l0b3J5LkNvbXBvbmVudERlcGVuZGVuY3k7CitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy50ZXN0aW5nLlBsZXh1c1Rlc3Q7CiBpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlJlYWRlckZhY3Rvcnk7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwpAQCAtMzQsOSArMzUsMTQgQEAKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRydWU7CisKIC8qKgogICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amFzb25AbWF2ZW4ub3JnIj5KYXNvbiB2YW4gWnlsIDwvYT4KICAqLworQFBsZXh1c1Rlc3QKIHB1YmxpYyBjbGFzcyBQbHVnaW5EZXNjcmlwdG9yR2VuZXJhdG9yVGVzdAogICAgIGV4dGVuZHMgQWJzdHJhY3RHZW5lcmF0b3JUZXN0Q2FzZQogewpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWdlbmVyYXRvcnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9nZW5lcmF0b3Ivc3R1YnMvTWF2ZW5SZXBvcnRTdHViLmphdmEgYi9tYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2dlbmVyYXRvci9zdHVicy9NYXZlblJlcG9ydFN0dWIuamF2YQppbmRleCA5MzZjMjMwLi4zYjY2NGM1IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2dlbmVyYXRvci9zdHVicy9NYXZlblJlcG9ydFN0dWIuamF2YQorKysgYi9tYXZlbi1wbHVnaW4tdG9vbHMtZ2VuZXJhdG9ycy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2dlbmVyYXRvci9zdHVicy9NYXZlblJlcG9ydFN0dWIuamF2YQpAQCAtMjgsOCArMjgsNiBAQAogCiAvKioKICAqIER1bW15IHJlcG9ydC4KLSAqCi0gKiBAZ29hbCBkdW1teVJlcG9ydAogICovCiBwdWJsaWMgY2xhc3MgTWF2ZW5SZXBvcnRTdHViCiAgICAgZXh0ZW5kcyBBYnN0cmFjdE1hdmVuUmVwb3J0CmRpZmYgLS1naXQgYS9tYXZlbi1wbHVnaW4tdG9vbHMtamF2YS9wb20ueG1sIGIvbWF2ZW4tcGx1Z2luLXRvb2xzLWphdmEvcG9tLnhtbAppbmRleCBiM2M0NDY5Li4yYzRkYjU3IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tdG9vbHMtamF2YS9wb20ueG1sCisrKyBiL21hdmVuLXBsdWdpbi10b29scy1qYXZhL3BvbS54bWwKQEAgLTU2LDggKzU2LDkgQEAKICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBvbmVudC1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnNpc3U8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5zaXN1LnBsZXh1czwvYXJ0aWZhY3RJZD4KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAKICAgICA8IS0tIG1pc2MgLS0+CkBAIC02OCw4ICs2OSw4IEBACiAKICAgICA8IS0tIHRlc3QgLS0+CiAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPGdyb3VwSWQ+b3JnLmp1bml0Lmp1cGl0ZXI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdC1qdXBpdGVyLWVuZ2luZTwvYXJ0aWZhY3RJZD4KICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CkBAIC04MCwxMyArODEsNCBAQAogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CiAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBvbmVudC1tZXRhZGF0YTwvYXJ0aWZhY3RJZD4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLQogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWphdmEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvamF2YWRvYy9KYXZhSmF2YWRvY01vam9EZXNjcmlwdG9yRXh0cmFjdG9yLmphdmEgYi9tYXZlbi1wbHVnaW4tdG9vbHMtamF2YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9qYXZhZG9jL0phdmFKYXZhZG9jTW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3IuamF2YQppbmRleCBhNDQxODg4Li42NjAyMDExIDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tdG9vbHMtamF2YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9qYXZhZG9jL0phdmFKYXZhZG9jTW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3IuamF2YQorKysgYi9tYXZlbi1wbHVnaW4tdG9vbHMtamF2YS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9qYXZhZG9jL0phdmFKYXZhZG9jTW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3IuamF2YQpAQCAtMTksNiArMTksOSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAoraW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CkBAIC00MSw3ICs0NCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZXh0cmFjdG9yLkV4dHJhY3Rpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZXh0cmFjdG9yLk1vam9EZXNjcmlwdG9yRXh0cmFjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLnV0aWwuUGx1Z2luVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuYW5ub3RhdGlvbnMuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5BYnN0cmFjdExvZ0VuYWJsZWQ7CiBpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlN0cmluZ1V0aWxzOwogCkBAIC02Miw3ICs2NCw4IEBACiAgKgogICogQHNlZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5kZXNjcmlwdG9yLk1vam9EZXNjcmlwdG9yCiAgKi8KLUBDb21wb25lbnQoIHJvbGUgPSBNb2pvRGVzY3JpcHRvckV4dHJhY3Rvci5jbGFzcywgaGludCA9ICJqYXZhLWphdmFkb2MiICkKK0BOYW1lZCggImphdmEtamF2YWRvYyIgKQorQFNpbmdsZXRvbgogcHVibGljIGNsYXNzIEphdmFKYXZhZG9jTW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3IKICAgICBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZAogICAgIGltcGxlbWVudHMgTW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3IsIEphdmFkb2NNb2pvQW5ub3RhdGlvbgpkaWZmIC0tZ2l0IGEvbWF2ZW4tcGx1Z2luLXRvb2xzLWphdmEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvamF2YWRvYy9KYXZhTW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3JUZXN0LmphdmEgYi9tYXZlbi1wbHVnaW4tdG9vbHMtamF2YS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9qYXZhZG9jL0phdmFNb2pvRGVzY3JpcHRvckV4dHJhY3RvclRlc3QuamF2YQppbmRleCA3M2RmYWFhLi5lNzM0ZGM3IDEwMDY0NAotLS0gYS9tYXZlbi1wbHVnaW4tdG9vbHMtamF2YS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9qYXZhZG9jL0phdmFNb2pvRGVzY3JpcHRvckV4dHJhY3RvclRlc3QuamF2YQorKysgYi9tYXZlbi1wbHVnaW4tdG9vbHMtamF2YS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9qYXZhZG9jL0phdmFNb2pvRGVzY3JpcHRvckV4dHJhY3RvclRlc3QuamF2YQpAQCAtNDQsMjEgKzQ0LDIzIEBACiAKIGltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuRGlmZjsKIGltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MVW5pdDsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5CZWZvcmVFYWNoOworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5UZXN0OwogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkFzc2VydGlvbnMuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUcnVlOwogCiAvKioKICAqIEBhdXRob3IgamRjYXNleQogICovCisvLyBhdCBsZWFzdCBvbmUgdGVzdCBjbGFzcyBtdXN0IGJlIHB1YmxpYyBmb3IgdGVzdC1qYXZhZG9jIHJlcG9ydAogcHVibGljIGNsYXNzIEphdmFNb2pvRGVzY3JpcHRvckV4dHJhY3RvclRlc3QKIHsKICAgICBwcml2YXRlIEZpbGUgcm9vdDsKIAotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpCisgICAgQEJlZm9yZUVhY2gKKyAgICB2b2lkIHNldFVwKCkKICAgICB7CiAgICAgICAgIEZpbGUgc291cmNlRmlsZSA9IGZpbGVPZiggImRpci1mbGFnLnR4dCIgKTsKICAgICAgICAgcm9vdCA9IHNvdXJjZUZpbGUuZ2V0UGFyZW50RmlsZSgpOwpAQCAtMTI2LDcgKzEyOCw3IEBACiAgICAgICAgICAgICByZXF1ZXN0LmdldFBsdWdpbkRlc2NyaXB0b3IoKS5hZGRNb2pvKCBtb2pvRGVzY3JpcHRvciApOwogICAgICAgICB9CiAKLSAgICAgICAgR2VuZXJhdG9yIGRlc2NyaXB0b3JHZW5lcmF0b3IgPSBuZXcgUGx1Z2luRGVzY3JpcHRvckdlbmVyYXRvciggbmV3IFN5c3RlbVN0cmVhbUxvZygpICk7CisgICAgICAgIEdlbmVyYXRvciBkZXNjcmlwdG9yR2VuZXJhdG9yID0gbmV3IFBsdWdpbkRlc2NyaXB0b3JHZW5lcmF0b3IoKTsKIAogICAgICAgICBkZXNjcmlwdG9yR2VuZXJhdG9yLmV4ZWN1dGUoIG5ldyBGaWxlKCByb290LCBkaXJlY3RvcnkgKSwgcmVxdWVzdCApOwogCkBAIC0xNTEsMTAgKzE1Myw3IEBACiAKICAgICAgICAgRGlmZiBkaWZmID0gWE1MVW5pdC5jb21wYXJlWE1MKCBleHBlY3RlZCwgYWN0dWFsICk7CiAKLSAgICAgICAgaWYgKCAhZGlmZi5pZGVudGljYWwoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhaWwoICJnZW5lcmF0ZWQgcGx1Z2luLnhtbCBpcyBub3QgaWRlbnRpY2FsIGFzIHBsdWdpbi1leHBlY3RlZC54bWwgZm9yICIgKyBkaXJlY3RvcnkgKyAiOiAiICsgZGlmZiApOwotICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIGRpZmYuaWRlbnRpY2FsKCksICJnZW5lcmF0ZWQgcGx1Z2luLnhtbCBpcyBub3QgaWRlbnRpY2FsIGFzIHBsdWdpbi1leHBlY3RlZC54bWwgZm9yICIgKyBkaXJlY3RvcnkgKyAiOiAiICsgZGlmZiApOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTcxLDE2ICsxNzAsMTYgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRGaW5kVHdvTW9qb0Rlc2NyaXB0b3JzSW5UZXN0U291cmNlRGlyZWN0b3J5KCkKKyAgICB2b2lkIHRlc3RTaG91bGRGaW5kVHdvTW9qb0Rlc2NyaXB0b3JzSW5UZXN0U291cmNlRGlyZWN0b3J5KCkKICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgTGlzdDxNb2pvRGVzY3JpcHRvcj4gcmVzdWx0cyA9IGV4dHJhY3QoICJzb3VyY2UiICk7CiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiRXh0cmFjdGVkIG1vam9zIiwgMiwgcmVzdWx0cy5zaXplKCkgKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCAyLCByZXN1bHRzLnNpemUoKSwgIkV4dHJhY3RlZCBtb2pvcyIgKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRQcm9wYWdhdGVJbXBsZW1lbnRhdGlvblBhcmFtZXRlcigpCisgICAgdm9pZCB0ZXN0U2hvdWxkUHJvcGFnYXRlSW1wbGVtZW50YXRpb25QYXJhbWV0ZXIoKQogICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBMaXN0PE1vam9EZXNjcmlwdG9yPiByZXN1bHRzID0gZXh0cmFjdCggInNvdXJjZTIiICk7CkBAIC0xOTUsMTEgKzE5NCwxMSBAQAogCiAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJzLmdldCggMCApOwogCi0gICAgICAgIGFzc2VydEVxdWFscyggIkltcGxlbWVudGF0aW9uIHBhcmFtZXRlciIsICJzb3VyY2UyLnN1Yi5NeUJsYSIsIHBhcmFtZXRlci5nZXRJbXBsZW1lbnRhdGlvbigpICk7CisgICAgICAgIGFzc2VydEVxdWFscyggInNvdXJjZTIuc3ViLk15QmxhIiwgcGFyYW1ldGVyLmdldEltcGxlbWVudGF0aW9uKCksICJJbXBsZW1lbnRhdGlvbiBwYXJhbWV0ZXIiICk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWF2ZW4zMFBhcmFtZXRlcnMoKQorICAgIHZvaWQgdGVzdE1hdmVuMzBQYXJhbWV0ZXJzKCkKICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgTGlzdDxNb2pvRGVzY3JpcHRvcj4gcmVzdWx0cyA9IGV4dHJhY3QoICJzb3VyY2UyIiApOwpAQCAtMjE3LDcgKzIxNiw3IEBACiAgICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uSW5QbHVnaW4oKQorICAgIHZvaWQgdGVzdEFubm90YXRpb25JblBsdWdpbigpCiAgICAgICAgIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIExpc3Q8TW9qb0Rlc2NyaXB0b3I+IHJlc3VsdHMgPSBleHRyYWN0KCAic291cmNlMyIgKTsKQEAgLTIzMCw3ICsyMjksNyBAQAogICAgICAqIGdlbmVyaWNzLgogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEphdmExNVN5bnRheFBhcnNpbmcoKQorICAgIHZvaWQgdGVzdEphdmExNVN5bnRheFBhcnNpbmcoKQogICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBMaXN0PE1vam9EZXNjcmlwdG9yPiByZXN1bHRzID0gZXh0cmFjdCggImphdmEtMS41IiApOwpAQCAtMjM5LDcgKzIzOCw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlVHlwZUltcG9ydFdpdGhGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpCisgICAgdm9pZCB0ZXN0U2luZ2xlVHlwZUltcG9ydFdpdGhGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpCiAgICAgICAgIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIExpc3Q8TW9qb0Rlc2NyaXB0b3I+IHJlc3VsdHMgPSBleHRyYWN0KCAiTVBMVUdJTi0zMTQiICk7CkBAIC0yNDgsNyArMjQ3LDcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2RSZWZlcmVuY2VJbkVudW1Db25zdHJ1Y3RvcigpCisgICAgdm9pZCB0ZXN0TWV0aG9kUmVmZXJlbmNlSW5FbnVtQ29uc3RydWN0b3IoKQogICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBMaXN0PE1vam9EZXNjcmlwdG9yPiByZXN1bHRzID0gZXh0cmFjdCggIk1QTFVHSU4tMzIwIiApOwpAQCAtMjU3LDEyICsyNTYsMTEgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtV2l0aFJlZ2V4UGF0dGVybigpCisgICAgdm9pZCB0ZXN0RW51bVdpdGhSZWdleFBhdHRlcm4oKQogICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBMaXN0PE1vam9EZXNjcmlwdG9yPiByZXN1bHRzID0gZXh0cmFjdCggIk1QTFVHSU4tMjkwIiApOwogCiAgICAgICAgIGFzc2VydFRydWUoIHJlc3VsdHMuaXNFbXB0eSgpICk7CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9tYXZlbi1zY3JpcHQvbWF2ZW4tcGx1Z2luLXRvb2xzLWFudC9wb20ueG1sIGIvbWF2ZW4tc2NyaXB0L21hdmVuLXBsdWdpbi10b29scy1hbnQvcG9tLnhtbAppbmRleCA2ZmFhODNiLi4xODE2YzVjIDEwMDY0NAotLS0gYS9tYXZlbi1zY3JpcHQvbWF2ZW4tcGx1Z2luLXRvb2xzLWFudC9wb20ueG1sCisrKyBiL21hdmVuLXNjcmlwdC9tYXZlbi1wbHVnaW4tdG9vbHMtYW50L3BvbS54bWwKQEAgLTQ0LDggKzQ0LDggQEAKICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi10b29scy1tb2RlbDwvYXJ0aWZhY3RJZD4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPGdyb3VwSWQ+b3JnLmp1bml0Lmp1cGl0ZXI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdC1qdXBpdGVyLWVuZ2luZTwvYXJ0aWZhY3RJZD4KICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgCkBAIC01NSwyMiArNTUsMTcgQEAKICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBvbmVudC1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KLSAgICAgIDxleGNsdXNpb25zPgotICAgICAgICA8ZXhjbHVzaW9uPgotICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICA8L2V4Y2x1c2lvbj4KLSAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnNpc3U8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5zaXN1LnBsZXh1czwvYXJ0aWZhY3RJZD4KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgIDwvZGVwZW5kZW5jaWVzPgogCiAgIDxidWlsZD4KICAgICA8cGx1Z2lucz4KICAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21wb25lbnQtbWV0YWRhdGE8L2FydGlmYWN0SWQ+CisgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnNpc3U8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnNpc3UtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgPC9wbHVnaW4+CiAgICAgPC9wbHVnaW5zPgogICA8L2J1aWxkPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tc2NyaXB0L21hdmVuLXBsdWdpbi10b29scy1hbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW50L0FudE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yLmphdmEgYi9tYXZlbi1zY3JpcHQvbWF2ZW4tcGx1Z2luLXRvb2xzLWFudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbnQvQW50TW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3IuamF2YQppbmRleCBhY2QwOGExLi5iZWU2NDdlIDEwMDY0NAotLS0gYS9tYXZlbi1zY3JpcHQvbWF2ZW4tcGx1Z2luLXRvb2xzLWFudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbnQvQW50TW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3IuamF2YQorKysgYi9tYXZlbi1zY3JpcHQvbWF2ZW4tcGx1Z2luLXRvb2xzLWFudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbnQvQW50TW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3IuamF2YQpAQCAtMTksNiArMTksOSBAQAogICogdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAoraW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CkBAIC0zNCwyMSArMzcsMjEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5QbHVnaW5Ub29sc1JlcXVlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZXh0cmFjdG9yLkFic3RyYWN0U2NyaXB0ZWRNb2pvRGVzY3JpcHRvckV4dHJhY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5leHRyYWN0b3IuRXh0cmFjdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5leHRyYWN0b3IuTW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZXh0cmFjdG9yLm1vZGVsLlBsdWdpbk1ldGFkYXRhUGFyc2VFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZXh0cmFjdG9yLm1vZGVsLlBsdWdpbk1ldGFkYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LmFubm90YXRpb25zLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5yZXBvc2l0b3J5LkNvbXBvbmVudFJlcXVpcmVtZW50OwogaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5TdHJpbmdVdGlsczsKIAogLyoqCiAgKiBFeHRyYWN0cyBNb2pvIGRlc2NyaXB0b3JzIGZyb20gPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnIj5BbnQ8L2E+IHNvdXJjZXMuCiAgKgorICogQGRlcHJlY2F0ZWQgU2NyaXB0aW5nIHN1cHBvcnQgZm9yIG1vam9zIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIHBsYW5uZWQgdHAgYmUgcmVtb3ZlZCBpbiBtYXZlbiA0LjAKICAqLwotQENvbXBvbmVudCggcm9sZSA9IE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yLmNsYXNzLCBoaW50ID0gImFudCIgKQorQERlcHJlY2F0ZWQKK0BOYW1lZCggImFudCIgKQorQFNpbmdsZXRvbgogcHVibGljIGNsYXNzIEFudE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yCiAgICAgZXh0ZW5kcyBBYnN0cmFjdFNjcmlwdGVkTW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3IKLSAgICBpbXBsZW1lbnRzIE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yCiB7CiAgICAgLyoqIERlZmF1bHQgbWV0YWRhdGEgZmlsZSBleHRlbnNpb24gKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEFfRklMRV9FWFRFTlNJT04gPSAiLm1vam9zLnhtbCI7CmRpZmYgLS1naXQgYS9tYXZlbi1zY3JpcHQvbWF2ZW4tcGx1Z2luLXRvb2xzLWFudC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbnQvQW50TW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3JUZXN0LmphdmEgYi9tYXZlbi1zY3JpcHQvbWF2ZW4tcGx1Z2luLXRvb2xzLWFudC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9hbnQvQW50TW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3JUZXN0LmphdmEKaW5kZXggYzExZjIzYS4uNjYzNDYwNyAxMDA2NDQKLS0tIGEvbWF2ZW4tc2NyaXB0L21hdmVuLXBsdWdpbi10b29scy1hbnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYW50L0FudE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yVGVzdC5qYXZhCisrKyBiL21hdmVuLXNjcmlwdC9tYXZlbi1wbHVnaW4tdG9vbHMtYW50L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL2FudC9BbnRNb2pvRGVzY3JpcHRvckV4dHJhY3RvclRlc3QuamF2YQpAQCAtMzgsMTUgKzM4LDE5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uUGx1Z2luVG9vbHNSZXF1ZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmV4dHJhY3Rvci5FeHRyYWN0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LnJlcG9zaXRvcnkuQ29tcG9uZW50UmVxdWlyZW1lbnQ7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLlRlc3Q7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUcnVlOwogCisvLyBhdCBsZWFzdCBvbmUgdGVzdCBjbGFzcyBtdXN0IGJlIHB1YmxpYyBmb3IgdGVzdC1qYXZhZG9jIHJlcG9ydAogcHVibGljIGNsYXNzIEFudE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yVGVzdAogewogICAgIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljTW9qb0V4dHJhY3Rpb25fQ2hlY2tJbmplY3RlZFBhcmFtZXRlcnNBbmRSZXF1aXJlbWVudHMoKQorICAgIHZvaWQgdGVzdEJhc2ljTW9qb0V4dHJhY3Rpb25fQ2hlY2tJbmplY3RlZFBhcmFtZXRlcnNBbmRSZXF1aXJlbWVudHMoKQogICAgICAgICB0aHJvd3MgSW52YWxpZFBsdWdpbkRlc2NyaXB0b3JFeGNlcHRpb24sIEV4dHJhY3Rpb25FeGNlcHRpb24KICAgICB7CiAgICAgICAgIE1hcDxTdHJpbmcsIFNldDxGaWxlPj4gc2NyaXB0TWFwID0gYnVpbGRUZXN0TWFwKCAiYmFzaWMiICk7CkBAIC04MiwxMSArODYsMTEgQEAKICAgICAgICAgICAgICAgICBwYXJhbU1hcC5wdXQoIHBhcmFtLmdldE5hbWUoKSwgcGFyYW0gKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCggIk1vam8gZGVzY3JpcHRvcjogIiArIGRlc2MuZ2V0R29hbCgpICsgIiBpcyBtaXNzaW5nICdiYXNlZGlyJyBwYXJhbWV0ZXIuIiwgcGFyYW1NYXAuZ2V0KCAiYmFzZWRpciIgKSApOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCggIk1vam8gZGVzY3JpcHRvcjogIiArIGRlc2MuZ2V0R29hbCgpICsgIiBpcyBtaXNzaW5nICdtZXNzYWdlTGV2ZWwnIHBhcmFtZXRlci4iLCBwYXJhbU1hcC5nZXQoICJtZXNzYWdlTGV2ZWwiICkgKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoICJNb2pvIGRlc2NyaXB0b3I6ICIgKyBkZXNjLmdldEdvYWwoKSArICIgaXMgbWlzc2luZyAncHJvamVjdCcgcGFyYW1ldGVyLiIsIHBhcmFtTWFwLmdldCggInByb2plY3QiICkgKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoICJNb2pvIGRlc2NyaXB0b3I6ICIgKyBkZXNjLmdldEdvYWwoKSArICIgaXMgbWlzc2luZyAnc2Vzc2lvbicgcGFyYW1ldGVyLiIsIHBhcmFtTWFwLmdldCggInNlc3Npb24iICkgKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoICJNb2pvIGRlc2NyaXB0b3I6ICIgKyBkZXNjLmdldEdvYWwoKSArICIgaXMgbWlzc2luZyAnbW9qb0V4ZWN1dGlvbicgcGFyYW1ldGVyLiIsIHBhcmFtTWFwLmdldCggIm1vam9FeGVjdXRpb24iICkgKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIHBhcmFtTWFwLmdldCggImJhc2VkaXIiICksICJNb2pvIGRlc2NyaXB0b3I6ICIgKyBkZXNjLmdldEdvYWwoKSArICIgaXMgbWlzc2luZyAnYmFzZWRpcicgcGFyYW1ldGVyLiIgKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIHBhcmFtTWFwLmdldCggIm1lc3NhZ2VMZXZlbCIgKSwgIk1vam8gZGVzY3JpcHRvcjogIiArIGRlc2MuZ2V0R29hbCgpICsgIiBpcyBtaXNzaW5nICdtZXNzYWdlTGV2ZWwnIHBhcmFtZXRlci4iICk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCBwYXJhbU1hcC5nZXQoICJwcm9qZWN0IiApLCAiTW9qbyBkZXNjcmlwdG9yOiAiICsgZGVzYy5nZXRHb2FsKCkgKyAiIGlzIG1pc3NpbmcgJ3Byb2plY3QnIHBhcmFtZXRlci4iICk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCBwYXJhbU1hcC5nZXQoICJzZXNzaW9uIiApLCAiTW9qbyBkZXNjcmlwdG9yOiAiICsgZGVzYy5nZXRHb2FsKCkgKyAiIGlzIG1pc3NpbmcgJ3Nlc3Npb24nIHBhcmFtZXRlci4iICk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCBwYXJhbU1hcC5nZXQoICJtb2pvRXhlY3V0aW9uIiApLCAiTW9qbyBkZXNjcmlwdG9yOiAiICsgZGVzYy5nZXRHb2FsKCkgKyAiIGlzIG1pc3NpbmcgJ21vam9FeGVjdXRpb24nIHBhcmFtZXRlci4iICk7CiAKICAgICAgICAgICAgIExpc3Q8Q29tcG9uZW50UmVxdWlyZW1lbnQ+IGNvbXBvbmVudHMgPSBkZXNjLmdldFJlcXVpcmVtZW50cygpOwogCkBAIC05NCw3ICs5OCw3IEBACiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIDEsIGNvbXBvbmVudHMuc2l6ZSgpICk7CiAKICAgICAgICAgICAgIENvbXBvbmVudFJlcXVpcmVtZW50IHJlcSA9IGNvbXBvbmVudHMuZ2V0KCAwICk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoICJNb2pvIGRlc2NyaXB0b3I6ICIgKyBkZXNjLmdldEdvYWwoKSArICIgaXMgbWlzc2luZyAnUGF0aFRyYW5zbGF0b3InIGNvbXBvbmVudCByZXF1aXJlbWVudC4iLCBQYXRoVHJhbnNsYXRvci5jbGFzcy5nZXROYW1lKCksIHJlcS5nZXRSb2xlKCkgKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyggUGF0aFRyYW5zbGF0b3IuY2xhc3MuZ2V0TmFtZSgpLCByZXEuZ2V0Um9sZSgpLCAiTW9qbyBkZXNjcmlwdG9yOiAiICsgZGVzYy5nZXRHb2FsKCkgKyAiIGlzIG1pc3NpbmcgJ1BhdGhUcmFuc2xhdG9yJyBjb21wb25lbnQgcmVxdWlyZW1lbnQuIiApOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDYsMTAgKzExMCw3IEBACiAgICAgICAgICAgICBDbGFzc0xvYWRlciBjbG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKICAgICAgICAgICAgIFVSTCBtb2pvc1htbFVybCA9IGNsb2FkZXIuZ2V0UmVzb3VyY2UoIHJlc291cmNlRGlyTmFtZSArICIvdGVzdC5tb2pvcy54bWwiICk7CiAKLSAgICAgICAgICAgIGlmICggbW9qb3NYbWxVcmwgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFpbCggIk5vIGNsYXNzcGF0aCByZXNvdXJjZSBuYW1lZDogJyIgKyByZXNvdXJjZURpck5hbWUgKyAiL3Rlc3QubW9qb3MueG1sJyBjb3VsZCBiZSBmb3VuZC4iICk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCBtb2pvc1htbFVybCwgIk5vIGNsYXNzcGF0aCByZXNvdXJjZSBuYW1lZDogJyIgKyByZXNvdXJjZURpck5hbWUgKyAiL3Rlc3QubW9qb3MueG1sJyBjb3VsZCBiZSBmb3VuZC4iICk7CiAKICAgICAgICAgICAgIEZpbGUgbW9qb3NYbWwgPSBQYXRocy5nZXQoIG1vam9zWG1sVXJsLnRvVVJJKCkgKS50b0ZpbGUoKTsKICAgICAgICAgICAgIEZpbGUgZGlyID0gbW9qb3NYbWwuZ2V0UGFyZW50RmlsZSgpOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tc2NyaXB0L21hdmVuLXBsdWdpbi10b29scy1iZWFuc2hlbGwvcG9tLnhtbCBiL21hdmVuLXNjcmlwdC9tYXZlbi1wbHVnaW4tdG9vbHMtYmVhbnNoZWxsL3BvbS54bWwKaW5kZXggMGQwYjVjMC4uMDVhODBmNSAxMDA2NDQKLS0tIGEvbWF2ZW4tc2NyaXB0L21hdmVuLXBsdWdpbi10b29scy1iZWFuc2hlbGwvcG9tLnhtbAorKysgYi9tYXZlbi1zY3JpcHQvbWF2ZW4tcGx1Z2luLXRvb2xzLWJlYW5zaGVsbC9wb20ueG1sCkBAIC00MywxNiArNDMsNiBAQAogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+CiAgICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21wb25lbnQtYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+Ci0gICAgICA8ZXhjbHVzaW9ucz4KLSAgICAgICAgPGV4Y2x1c2lvbj4KLSAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPC9leGNsdXNpb24+Ci0gICAgICA8L2V4Y2x1c2lvbnM+Ci0gICAgPC9kZXBlbmRlbmN5PgogCiAgICAgPCEtLSBtaXNjIC0tPgogICAgIDxkZXBlbmRlbmN5PgpAQCAtNjUsOCArNTUsOCBAQAogICA8YnVpbGQ+CiAgICAgPHBsdWdpbnM+CiAgICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29tcG9uZW50LW1ldGFkYXRhPC9hcnRpZmFjdElkPgorICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5zaXN1PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5zaXN1LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KICAgPC9idWlsZD4KZGlmZiAtLWdpdCBhL21hdmVuLXNjcmlwdC9tYXZlbi1wbHVnaW4tdG9vbHMtYmVhbnNoZWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL2JlYW5zaGVsbC9CZWFuc2hlbGxNb2pvRGVzY3JpcHRvckV4dHJhY3Rvci5qYXZhIGIvbWF2ZW4tc2NyaXB0L21hdmVuLXBsdWdpbi10b29scy1iZWFuc2hlbGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYmVhbnNoZWxsL0JlYW5zaGVsbE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yLmphdmEKaW5kZXggMTRiYTQ3ZC4uYmNlOTQwZCAxMDA2NDQKLS0tIGEvbWF2ZW4tc2NyaXB0L21hdmVuLXBsdWdpbi10b29scy1iZWFuc2hlbGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYmVhbnNoZWxsL0JlYW5zaGVsbE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yLmphdmEKKysrIGIvbWF2ZW4tc2NyaXB0L21hdmVuLXBsdWdpbi10b29scy1iZWFuc2hlbGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvYmVhbnNoZWxsL0JlYW5zaGVsbE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yLmphdmEKQEAgLTE5LDYgKzE5LDkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKK2ltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKwogaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CiAKIGltcG9ydCBic2guRXZhbEVycm9yOwpAQCAtMjgsOCArMzEsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLlBsdWdpblRvb2xzUmVxdWVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5leHRyYWN0b3IuQWJzdHJhY3RTY3JpcHRlZE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmV4dHJhY3Rvci5FeHRyYWN0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmV4dHJhY3Rvci5Nb2pvRGVzY3JpcHRvckV4dHJhY3RvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5hbm5vdGF0aW9ucy5Db21wb25lbnQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKQEAgLTQxLDExICs0MiwxMyBAQAogLyoqCiAgKiBFeHRyYWN0cyBNb2pvIGRlc2NyaXB0b3JzIGZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5iZWFuc2hlbGwub3JnLyI+QmVhblNoZWxsPC9hPiBzb3VyY2VzLgogICoKKyAqIEBkZXByZWNhdGVkIFNjcmlwdGluZyBzdXBwb3J0IGZvciBtb2pvcyBpcyBkZXByZWNhdGVkIGFuZCBpcyBwbGFubmVkIHRwIGJlIHJlbW92ZWQgaW4gbWF2ZW4gNC4wCiAgKi8KLUBDb21wb25lbnQoIHJvbGUgPSBNb2pvRGVzY3JpcHRvckV4dHJhY3Rvci5jbGFzcywgaGludCA9ICJic2giICkKK0BEZXByZWNhdGVkCitATmFtZWQoICJic2giICkKK0BTaW5nbGV0b24KIHB1YmxpYyBjbGFzcyBCZWFuc2hlbGxNb2pvRGVzY3JpcHRvckV4dHJhY3RvcgogICAgIGV4dGVuZHMgQWJzdHJhY3RTY3JpcHRlZE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yCi0gICAgaW1wbGVtZW50cyBNb2pvRGVzY3JpcHRvckV4dHJhY3RvcgogewogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KQEAgLTEzMCw0ICsxMzMsNCBAQAogCiAgICAgICAgIHJldHVybiBtb2pvRGVzY3JpcHRvcjsKICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tc2NyaXB0L21hdmVuLXBsdWdpbi10b29scy1tb2RlbC9wb20ueG1sIGIvbWF2ZW4tc2NyaXB0L21hdmVuLXBsdWdpbi10b29scy1tb2RlbC9wb20ueG1sCmluZGV4IGQ1N2U4MjMuLjZhMjQ3OWEgMTAwNjQ0Ci0tLSBhL21hdmVuLXNjcmlwdC9tYXZlbi1wbHVnaW4tdG9vbHMtbW9kZWwvcG9tLnhtbAorKysgYi9tYXZlbi1zY3JpcHQvbWF2ZW4tcGx1Z2luLXRvb2xzLW1vZGVsL3BvbS54bWwKQEAgLTQ1LDggKzQ1LDggQEAKICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgPGdyb3VwSWQ+b3JnLmp1bml0Lmp1cGl0ZXI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qdW5pdC1qdXBpdGVyLWVuZ2luZTwvYXJ0aWZhY3RJZD4KICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgIDwvZGVwZW5kZW5jaWVzPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tc2NyaXB0L21hdmVuLXBsdWdpbi10b29scy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9tb2RlbC9QbHVnaW5NZXRhZGF0YVBhcnNlRXhjZXB0aW9uLmphdmEgYi9tYXZlbi1zY3JpcHQvbWF2ZW4tcGx1Z2luLXRvb2xzLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL21vZGVsL1BsdWdpbk1ldGFkYXRhUGFyc2VFeGNlcHRpb24uamF2YQppbmRleCBmMDc4MDM5Li44ODg3MDEzIDEwMDY0NAotLS0gYS9tYXZlbi1zY3JpcHQvbWF2ZW4tcGx1Z2luLXRvb2xzLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL21vZGVsL1BsdWdpbk1ldGFkYXRhUGFyc2VFeGNlcHRpb24uamF2YQorKysgYi9tYXZlbi1zY3JpcHQvbWF2ZW4tcGx1Z2luLXRvb2xzLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL21vZGVsL1BsdWdpbk1ldGFkYXRhUGFyc2VFeGNlcHRpb24uamF2YQpAQCAtMSw3OCArMSw4MCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5leHRyYWN0b3IubW9kZWw7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogRXhjZXB0aW9uIHdoZW4gcGx1Z2luIG1ldGFkYXRhIHBhcnNpbmcgb2NjdXJyZWQuCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luTWV0YWRhdGFQYXJzZUV4Y2VwdGlvbgotICAgIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gICAgLyoqIHNlcmlhbFZlcnNpb25VSUQgKi8KLSAgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDAyMjM0ODE1MzcwNzk5NTU3NEw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEZpbGUgbWV0YWRhdGFGaWxlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgb3JpZ2luYWxNZXNzYWdlOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1ldGFkYXRhRmlsZSBjb3VsZCBiZSBudWxsCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgY291bGQgYmUgbnVsbAotICAgICAqIEBwYXJhbSBjYXVzZSBjb3VsZCBiZSBudWxsCi0gICAgICovCi0gICAgcHVibGljIFBsdWdpbk1ldGFkYXRhUGFyc2VFeGNlcHRpb24oIEZpbGUgbWV0YWRhdGFGaWxlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCAiRXJyb3IgcGFyc2luZyBmaWxlOiAiICsgbWV0YWRhdGFGaWxlICsgIi4gUmVhc29uOiAiICsgbWVzc2FnZSwgY2F1c2UgKTsKLQotICAgICAgICB0aGlzLm1ldGFkYXRhRmlsZSA9IG1ldGFkYXRhRmlsZTsKLSAgICAgICAgdGhpcy5vcmlnaW5hbE1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXRhZGF0YUZpbGUgY291bGQgYmUgbnVsbAotICAgICAqIEBwYXJhbSBtZXNzYWdlIGNvdWxkIGJlIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgUGx1Z2luTWV0YWRhdGFQYXJzZUV4Y2VwdGlvbiggRmlsZSBtZXRhZGF0YUZpbGUsIFN0cmluZyBtZXNzYWdlICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCAiRXJyb3IgcGFyc2luZyBmaWxlOiAiICsgbWV0YWRhdGFGaWxlICsgIi4gUmVhc29uOiAiICsgbWVzc2FnZSApOwotCi0gICAgICAgIHRoaXMubWV0YWRhdGFGaWxlID0gbWV0YWRhdGFGaWxlOwotICAgICAgICB0aGlzLm9yaWdpbmFsTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgbWV0YWRhdGEgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldE1ldGFkYXRhRmlsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbWV0YWRhdGFGaWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIG9yaWdpbmFsIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE9yaWdpbmFsTWVzc2FnZSgpCi0gICAgewotICAgICAgICByZXR1cm4gb3JpZ2luYWxNZXNzYWdlOwotICAgIH0KLX0KK3BhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZXh0cmFjdG9yLm1vZGVsOw0KKw0KKy8qDQorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyAqDQorICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitpbXBvcnQgamF2YS5pby5GaWxlOw0KKw0KKy8qKg0KKyAqIEV4Y2VwdGlvbiB3aGVuIHBsdWdpbiBtZXRhZGF0YSBwYXJzaW5nIG9jY3VycmVkLg0KKyAqDQorICogQGRlcHJlY2F0ZWQgU2NyaXB0aW5nIHN1cHBvcnQgZm9yIG1vam9zIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIHBsYW5uZWQgdHAgYmUgcmVtb3ZlZCBpbiBtYXZlbiA0LjANCisgKi8NCitARGVwcmVjYXRlZA0KK3B1YmxpYyBjbGFzcyBQbHVnaW5NZXRhZGF0YVBhcnNlRXhjZXB0aW9uDQorICAgIGV4dGVuZHMgRXhjZXB0aW9uDQorew0KKyAgICAvKiogc2VyaWFsVmVyc2lvblVJRCAqLw0KKyAgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNDAyMjM0ODE1MzcwNzk5NTU3NEw7DQorDQorICAgIHByaXZhdGUgZmluYWwgRmlsZSBtZXRhZGF0YUZpbGU7DQorDQorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG9yaWdpbmFsTWVzc2FnZTsNCisNCisgICAgLyoqDQorICAgICAqIEBwYXJhbSBtZXRhZGF0YUZpbGUgY291bGQgYmUgbnVsbA0KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBjb3VsZCBiZSBudWxsDQorICAgICAqIEBwYXJhbSBjYXVzZSBjb3VsZCBiZSBudWxsDQorICAgICAqLw0KKyAgICBwdWJsaWMgUGx1Z2luTWV0YWRhdGFQYXJzZUV4Y2VwdGlvbiggRmlsZSBtZXRhZGF0YUZpbGUsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UgKQ0KKyAgICB7DQorICAgICAgICBzdXBlciggIkVycm9yIHBhcnNpbmcgZmlsZTogIiArIG1ldGFkYXRhRmlsZSArICIuIFJlYXNvbjogIiArIG1lc3NhZ2UsIGNhdXNlICk7DQorDQorICAgICAgICB0aGlzLm1ldGFkYXRhRmlsZSA9IG1ldGFkYXRhRmlsZTsNCisgICAgICAgIHRoaXMub3JpZ2luYWxNZXNzYWdlID0gbWVzc2FnZTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIG1ldGFkYXRhRmlsZSBjb3VsZCBiZSBudWxsDQorICAgICAqIEBwYXJhbSBtZXNzYWdlIGNvdWxkIGJlIG51bGwNCisgICAgICovDQorICAgIHB1YmxpYyBQbHVnaW5NZXRhZGF0YVBhcnNlRXhjZXB0aW9uKCBGaWxlIG1ldGFkYXRhRmlsZSwgU3RyaW5nIG1lc3NhZ2UgKQ0KKyAgICB7DQorICAgICAgICBzdXBlciggIkVycm9yIHBhcnNpbmcgZmlsZTogIiArIG1ldGFkYXRhRmlsZSArICIuIFJlYXNvbjogIiArIG1lc3NhZ2UgKTsNCisNCisgICAgICAgIHRoaXMubWV0YWRhdGFGaWxlID0gbWV0YWRhdGFGaWxlOw0KKyAgICAgICAgdGhpcy5vcmlnaW5hbE1lc3NhZ2UgPSBtZXNzYWdlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRhZGF0YSBmaWxlDQorICAgICAqLw0KKyAgICBwdWJsaWMgRmlsZSBnZXRNZXRhZGF0YUZpbGUoKQ0KKyAgICB7DQorICAgICAgICByZXR1cm4gbWV0YWRhdGFGaWxlOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCBtZXNzYWdlDQorICAgICAqLw0KKyAgICBwdWJsaWMgU3RyaW5nIGdldE9yaWdpbmFsTWVzc2FnZSgpDQorICAgIHsNCisgICAgICAgIHJldHVybiBvcmlnaW5hbE1lc3NhZ2U7DQorICAgIH0NCit9DQpkaWZmIC0tZ2l0IGEvbWF2ZW4tc2NyaXB0L21hdmVuLXBsdWdpbi10b29scy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9tb2RlbC9QbHVnaW5NZXRhZGF0YVBhcnNlci5qYXZhIGIvbWF2ZW4tc2NyaXB0L21hdmVuLXBsdWdpbi10b29scy1tb2RlbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9tb2RlbC9QbHVnaW5NZXRhZGF0YVBhcnNlci5qYXZhCmluZGV4IGUwNTk2ZjQuLjAzNWY5OTcgMTAwNjQ0Ci0tLSBhL21hdmVuLXNjcmlwdC9tYXZlbi1wbHVnaW4tdG9vbHMtbW9kZWwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvbW9kZWwvUGx1Z2luTWV0YWRhdGFQYXJzZXIuamF2YQorKysgYi9tYXZlbi1zY3JpcHQvbWF2ZW4tcGx1Z2luLXRvb2xzLW1vZGVsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL21vZGVsL1BsdWdpbk1ldGFkYXRhUGFyc2VyLmphdmEKQEAgLTEsMTkwICsxLDE5MyBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5leHRyYWN0b3IubW9kZWw7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5kZXNjcmlwdG9yLkR1cGxpY2F0ZVBhcmFtZXRlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5kZXNjcmlwdG9yLk1vam9EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmRlc2NyaXB0b3IuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmV4dHJhY3Rvci5tb2RlbC5pby54cHAzLlBsdWdpbk1ldGFkYXRhWHBwM1JlYWRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5yZXBvc2l0b3J5LkNvbXBvbmVudFJlcXVpcmVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5SZWFkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLnB1bGwuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogUGFyc2VyIGZvciBwbHVnaW4gbWV0YWRhdGEuCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5NZXRhZGF0YVBhcnNlcgotewotICAgIC8qKgotICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gcGF0aCB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIGluCi0gICAgICogQWJzdHJhY3RTY3JpcHRlZE1vam9EZXNjcmlwdG9yRXh0cmFjdG9yI2V4dHJhY3RNb2pvRGVzY3JpcHRvcnNGcm9tTWV0YWRhdGEoTWFwLCBQbHVnaW5EZXNjcmlwdG9yKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExfQkFTRV9QTEFDRUhPTERFUiA9ICI8UkVQTEFDRS1XSVRILU1PSk8tUEFUSD4iOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1ldGFkYXRhRmlsZSB0aGUgbWV0YWRhdGEgZmlsZSB0byBiZSBwYXJzZQotICAgICAqIEByZXR1cm4gYSBzZXQgb2YgPGNvZGU+TW9qb0Rlc2NyaXB0b3I8L2NvZGU+Ci0gICAgICogQHRocm93cyBQbHVnaW5NZXRhZGF0YVBhcnNlRXhjZXB0aW9uIGlmIGFueQotICAgICAqLwotICAgIHB1YmxpYyBTZXQ8TW9qb0Rlc2NyaXB0b3I+IHBhcnNlTW9qb0Rlc2NyaXB0b3JzKCBGaWxlIG1ldGFkYXRhRmlsZSApCi0gICAgICAgIHRocm93cyBQbHVnaW5NZXRhZGF0YVBhcnNlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTZXQ8TW9qb0Rlc2NyaXB0b3I+IGRlc2NyaXB0b3JzID0gbmV3IEhhc2hTZXQ8PigpOwotCi0gICAgICAgIHRyeSAoIFJlYWRlciByZWFkZXIgPSBSZWFkZXJGYWN0b3J5Lm5ld1htbFJlYWRlciggbWV0YWRhdGFGaWxlICkgKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIFBsdWdpbk1ldGFkYXRhWHBwM1JlYWRlciBtZXRhZGF0YVJlYWRlciA9IG5ldyBQbHVnaW5NZXRhZGF0YVhwcDNSZWFkZXIoKTsKLQotICAgICAgICAgICAgUGx1Z2luTWV0YWRhdGEgcGx1Z2luTWV0YWRhdGEgPSBtZXRhZGF0YVJlYWRlci5yZWFkKCByZWFkZXIgKTsKLQotICAgICAgICAgICAgTGlzdDxNb2pvPiBtb2pvcyA9IHBsdWdpbk1ldGFkYXRhLmdldE1vam9zKCk7Ci0KLSAgICAgICAgICAgIGlmICggbW9qb3MgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggTW9qbyBtb2pvIDogbW9qb3MgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTW9qb0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGFzRGVzY3JpcHRvciggbWV0YWRhdGFGaWxlLCBtb2pvICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMuYWRkKCBkZXNjcmlwdG9yICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggSU9FeGNlcHRpb24gfCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUGx1Z2luTWV0YWRhdGFQYXJzZUV4Y2VwdGlvbiggbWV0YWRhdGFGaWxlLCAiQ2Fubm90IHBhcnNlIHBsdWdpbiBtZXRhZGF0YSBmcm9tIGZpbGUuIiwgZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXRhZGF0YUZpbGUgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gbW9qbyAgICAgICAgIG5vdCBudWxsCi0gICAgICogQHJldHVybiBhIG1vam8gZGVzY3JpcHRvciBpbnN0YW5jZQotICAgICAqIEB0aHJvd3MgUGx1Z2luTWV0YWRhdGFQYXJzZUV4Y2VwdGlvbiBpZiBhbnkKLSAgICAgKi8KLSAgICBwcml2YXRlIE1vam9EZXNjcmlwdG9yIGFzRGVzY3JpcHRvciggRmlsZSBtZXRhZGF0YUZpbGUsIE1vam8gbW9qbyApCi0gICAgICAgIHRocm93cyBQbHVnaW5NZXRhZGF0YVBhcnNlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBNb2pvRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IE1vam9EZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgaWYgKCBtb2pvLmdldENhbGwoKSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZGVzY3JpcHRvci5zZXRJbXBsZW1lbnRhdGlvbiggSU1QTF9CQVNFX1BMQUNFSE9MREVSICsgIjoiICsgbW9qby5nZXRDYWxsKCkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0SW1wbGVtZW50YXRpb24oIElNUExfQkFTRV9QTEFDRUhPTERFUiApOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVzY3JpcHRvci5zZXRHb2FsKCBtb2pvLmdldEdvYWwoKSApOwotICAgICAgICBkZXNjcmlwdG9yLnNldFBoYXNlKCBtb2pvLmdldFBoYXNlKCkgKTsKLSAgICAgICAgZGVzY3JpcHRvci5zZXREZXBlbmRlbmN5UmVzb2x1dGlvblJlcXVpcmVkKCBtb2pvLmdldFJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24oKSApOwotICAgICAgICBkZXNjcmlwdG9yLnNldEFnZ3JlZ2F0b3IoIG1vam8uaXNBZ2dyZWdhdG9yKCkgKTsKLSAgICAgICAgZGVzY3JpcHRvci5zZXRJbmhlcml0ZWRCeURlZmF1bHQoIG1vam8uaXNJbmhlcml0QnlEZWZhdWx0KCkgKTsKLSAgICAgICAgZGVzY3JpcHRvci5zZXREaXJlY3RJbnZvY2F0aW9uT25seSggbW9qby5pc1JlcXVpcmVzRGlyZWN0SW52b2NhdGlvbigpICk7Ci0gICAgICAgIGRlc2NyaXB0b3Iuc2V0T25saW5lUmVxdWlyZWQoIG1vam8uaXNSZXF1aXJlc09ubGluZSgpICk7Ci0gICAgICAgIGRlc2NyaXB0b3Iuc2V0UHJvamVjdFJlcXVpcmVkKCBtb2pvLmlzUmVxdWlyZXNQcm9qZWN0KCkgKTsKLSAgICAgICAgZGVzY3JpcHRvci5zZXRSZXF1aXJlc1JlcG9ydHMoIG1vam8uaXNSZXF1aXJlc1JlcG9ydHMoKSApOwotICAgICAgICBkZXNjcmlwdG9yLnNldERlc2NyaXB0aW9uKCBtb2pvLmdldERlc2NyaXB0aW9uKCkgKTsKLSAgICAgICAgZGVzY3JpcHRvci5zZXREZXByZWNhdGVkKCBtb2pvLmdldERlcHJlY2F0aW9uKCkgKTsKLSAgICAgICAgZGVzY3JpcHRvci5zZXRTaW5jZSggbW9qby5nZXRTaW5jZSgpICk7Ci0KLSAgICAgICAgTGlmZWN5Y2xlRXhlY3V0aW9uIGxlID0gbW9qby5nZXRFeGVjdXRpb24oKTsKLSAgICAgICAgaWYgKCBsZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZGVzY3JpcHRvci5zZXRFeGVjdXRlTGlmZWN5Y2xlKCBsZS5nZXRMaWZlY3ljbGUoKSApOwotICAgICAgICAgICAgZGVzY3JpcHRvci5zZXRFeGVjdXRlUGhhc2UoIGxlLmdldFBoYXNlKCkgKTsKLSAgICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0RXhlY3V0ZUdvYWwoIGxlLmdldEdvYWwoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5leHRyYWN0b3IubW9kZWwuUGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gbW9qby5nZXRQYXJhbWV0ZXJzKCk7Ci0KLSAgICAgICAgaWYgKCBwYXJhbWV0ZXJzICE9IG51bGwgJiYgIXBhcmFtZXRlcnMuaXNFbXB0eSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggb3JnLmFwYWNoZS5tYXZlbi50b29scy5wbHVnaW4uZXh0cmFjdG9yLm1vZGVsLlBhcmFtZXRlciBwYXJhbSA6IHBhcmFtZXRlcnMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhcmFtZXRlciBkUGFyYW0gPSBuZXcgUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgZFBhcmFtLnNldEFsaWFzKCBwYXJhbS5nZXRBbGlhcygpICk7Ci0gICAgICAgICAgICAgICAgZFBhcmFtLnNldERlcHJlY2F0ZWQoIHBhcmFtLmdldERlcHJlY2F0aW9uKCkgKTsKLSAgICAgICAgICAgICAgICBkUGFyYW0uc2V0RGVzY3JpcHRpb24oIHBhcmFtLmdldERlc2NyaXB0aW9uKCkgKTsKLSAgICAgICAgICAgICAgICBkUGFyYW0uc2V0RWRpdGFibGUoICFwYXJhbS5pc1JlYWRvbmx5KCkgKTsKLSAgICAgICAgICAgICAgICBkUGFyYW0uc2V0RXhwcmVzc2lvbiggcGFyYW0uZ2V0RXhwcmVzc2lvbigpICk7Ci0gICAgICAgICAgICAgICAgZFBhcmFtLnNldERlZmF1bHRWYWx1ZSggcGFyYW0uZ2V0RGVmYXVsdFZhbHVlKCkgKTsKLSAgICAgICAgICAgICAgICBkUGFyYW0uc2V0U2luY2UoIHBhcmFtLmdldFNpbmNlKCkgKTsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IHBhcmFtLmdldFByb3BlcnR5KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCBTdHJpbmdVdGlscy5pc05vdEVtcHR5KCBwcm9wZXJ0eSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRQYXJhbS5zZXROYW1lKCBwcm9wZXJ0eSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkUGFyYW0uc2V0TmFtZSggcGFyYW0uZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCBTdHJpbmdVdGlscy5pc0VtcHR5KCBkUGFyYW0uZ2V0TmFtZSgpICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBsdWdpbk1ldGFkYXRhUGFyc2VFeGNlcHRpb24oIG1ldGFkYXRhRmlsZSwgIk1vam86IFwnIiArIG1vam8uZ2V0R29hbCgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcJyBoYXMgYSBwYXJhbWV0ZXIgd2l0aG91dCBlaXRoZXIgcHJvcGVydHkgb3IgbmFtZSBhdHRyaWJ1dGVzLiBQbGVhc2Ugc3BlY2lmeSBvbmUuIiApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRQYXJhbS5zZXRSZXF1aXJlZCggcGFyYW0uaXNSZXF1aXJlZCgpICk7Ci0gICAgICAgICAgICAgICAgZFBhcmFtLnNldFR5cGUoIHBhcmFtLmdldFR5cGUoKSApOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZFBhcmFtZXRlciggZFBhcmFtICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoICggRHVwbGljYXRlUGFyYW1ldGVyRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBsdWdpbk1ldGFkYXRhUGFyc2VFeGNlcHRpb24oIG1ldGFkYXRhRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEdXBsaWNhdGUgcGFyYW1ldGVycyBkZXRlY3RlZCBmb3IgbW9qbzogIiArIG1vam8uZ2V0R29hbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8Q29tcG9uZW50PiBjb21wb25lbnRzID0gbW9qby5nZXRDb21wb25lbnRzKCk7Ci0KLSAgICAgICAgaWYgKCBjb21wb25lbnRzICE9IG51bGwgJiYgIWNvbXBvbmVudHMuaXNFbXB0eSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbXBvbmVudFJlcXVpcmVtZW50IGNyID0gbmV3IENvbXBvbmVudFJlcXVpcmVtZW50KCk7Ci0gICAgICAgICAgICAgICAgY3Iuc2V0Um9sZSggY29tcG9uZW50LmdldFJvbGUoKSApOwotICAgICAgICAgICAgICAgIGNyLnNldFJvbGVIaW50KCBjb21wb25lbnQuZ2V0SGludCgpICk7Ci0KLSAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZFJlcXVpcmVtZW50KCBjciApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7Ci0gICAgfQotfQorcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5leHRyYWN0b3IubW9kZWw7DQorDQorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5kZXNjcmlwdG9yLkR1cGxpY2F0ZVBhcmFtZXRlckV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uZGVzY3JpcHRvci5Nb2pvRGVzY3JpcHRvcjsNCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uZGVzY3JpcHRvci5QYXJhbWV0ZXI7DQoraW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmV4dHJhY3Rvci5tb2RlbC5pby54cHAzLlBsdWdpbk1ldGFkYXRhWHBwM1JlYWRlcjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQucmVwb3NpdG9yeS5Db21wb25lbnRSZXF1aXJlbWVudDsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlJlYWRlckZhY3Rvcnk7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5TdHJpbmdVdGlsczsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5wdWxsLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247DQorDQoraW1wb3J0IGphdmEuaW8uRmlsZTsNCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCitpbXBvcnQgamF2YS5pby5SZWFkZXI7DQoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0Ow0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCisNCisvKioNCisgKiBQYXJzZXIgZm9yIHBsdWdpbiBtZXRhZGF0YS4NCisgKg0KKyAqIEBkZXByZWNhdGVkIFNjcmlwdGluZyBzdXBwb3J0IGZvciBtb2pvcyBpcyBkZXByZWNhdGVkIGFuZCBpcyBwbGFubmVkIHRwIGJlIHJlbW92ZWQgaW4gbWF2ZW4gNC4wDQorICovDQorQERlcHJlY2F0ZWQNCitwdWJsaWMgY2xhc3MgUGx1Z2luTWV0YWRhdGFQYXJzZXINCit7DQorICAgIC8qKg0KKyAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHBhdGggd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBpbg0KKyAgICAgKiBBYnN0cmFjdFNjcmlwdGVkTW9qb0Rlc2NyaXB0b3JFeHRyYWN0b3IjZXh0cmFjdE1vam9EZXNjcmlwdG9yc0Zyb21NZXRhZGF0YShNYXAsIFBsdWdpbkRlc2NyaXB0b3IpDQorICAgICAqLw0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMX0JBU0VfUExBQ0VIT0xERVIgPSAiPFJFUExBQ0UtV0lUSC1NT0pPLVBBVEg+IjsNCisNCisgICAgLyoqDQorICAgICAqIEBwYXJhbSBtZXRhZGF0YUZpbGUgdGhlIG1ldGFkYXRhIGZpbGUgdG8gYmUgcGFyc2UNCisgICAgICogQHJldHVybiBhIHNldCBvZiA8Y29kZT5Nb2pvRGVzY3JpcHRvcjwvY29kZT4NCisgICAgICogQHRocm93cyBQbHVnaW5NZXRhZGF0YVBhcnNlRXhjZXB0aW9uIGlmIGFueQ0KKyAgICAgKi8NCisgICAgcHVibGljIFNldDxNb2pvRGVzY3JpcHRvcj4gcGFyc2VNb2pvRGVzY3JpcHRvcnMoIEZpbGUgbWV0YWRhdGFGaWxlICkNCisgICAgICAgIHRocm93cyBQbHVnaW5NZXRhZGF0YVBhcnNlRXhjZXB0aW9uDQorICAgIHsNCisgICAgICAgIFNldDxNb2pvRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldDw+KCk7DQorDQorICAgICAgICB0cnkgKCBSZWFkZXIgcmVhZGVyID0gUmVhZGVyRmFjdG9yeS5uZXdYbWxSZWFkZXIoIG1ldGFkYXRhRmlsZSApICkNCisgICAgICAgIHsNCisNCisgICAgICAgICAgICBQbHVnaW5NZXRhZGF0YVhwcDNSZWFkZXIgbWV0YWRhdGFSZWFkZXIgPSBuZXcgUGx1Z2luTWV0YWRhdGFYcHAzUmVhZGVyKCk7DQorDQorICAgICAgICAgICAgUGx1Z2luTWV0YWRhdGEgcGx1Z2luTWV0YWRhdGEgPSBtZXRhZGF0YVJlYWRlci5yZWFkKCByZWFkZXIgKTsNCisNCisgICAgICAgICAgICBMaXN0PE1vam8+IG1vam9zID0gcGx1Z2luTWV0YWRhdGEuZ2V0TW9qb3MoKTsNCisNCisgICAgICAgICAgICBpZiAoIG1vam9zICE9IG51bGwgKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgZm9yICggTW9qbyBtb2pvIDogbW9qb3MgKQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBNb2pvRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gYXNEZXNjcmlwdG9yKCBtZXRhZGF0YUZpbGUsIG1vam8gKTsNCisNCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzLmFkZCggZGVzY3JpcHRvciApOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiB8IFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSApDQorICAgICAgICB7DQorICAgICAgICAgICAgdGhyb3cgbmV3IFBsdWdpbk1ldGFkYXRhUGFyc2VFeGNlcHRpb24oIG1ldGFkYXRhRmlsZSwgIkNhbm5vdCBwYXJzZSBwbHVnaW4gbWV0YWRhdGEgZnJvbSBmaWxlLiIsIGUgKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBkZXNjcmlwdG9yczsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHBhcmFtIG1ldGFkYXRhRmlsZSBub3QgbnVsbA0KKyAgICAgKiBAcGFyYW0gbW9qbyAgICAgICAgIG5vdCBudWxsDQorICAgICAqIEByZXR1cm4gYSBtb2pvIGRlc2NyaXB0b3IgaW5zdGFuY2UNCisgICAgICogQHRocm93cyBQbHVnaW5NZXRhZGF0YVBhcnNlRXhjZXB0aW9uIGlmIGFueQ0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBNb2pvRGVzY3JpcHRvciBhc0Rlc2NyaXB0b3IoIEZpbGUgbWV0YWRhdGFGaWxlLCBNb2pvIG1vam8gKQ0KKyAgICAgICAgdGhyb3dzIFBsdWdpbk1ldGFkYXRhUGFyc2VFeGNlcHRpb24NCisgICAgew0KKyAgICAgICAgTW9qb0Rlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBNb2pvRGVzY3JpcHRvcigpOw0KKw0KKyAgICAgICAgaWYgKCBtb2pvLmdldENhbGwoKSAhPSBudWxsICkNCisgICAgICAgIHsNCisgICAgICAgICAgICBkZXNjcmlwdG9yLnNldEltcGxlbWVudGF0aW9uKCBJTVBMX0JBU0VfUExBQ0VIT0xERVIgKyAiOiIgKyBtb2pvLmdldENhbGwoKSApOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0SW1wbGVtZW50YXRpb24oIElNUExfQkFTRV9QTEFDRUhPTERFUiApOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgZGVzY3JpcHRvci5zZXRHb2FsKCBtb2pvLmdldEdvYWwoKSApOw0KKyAgICAgICAgZGVzY3JpcHRvci5zZXRQaGFzZSggbW9qby5nZXRQaGFzZSgpICk7DQorICAgICAgICBkZXNjcmlwdG9yLnNldERlcGVuZGVuY3lSZXNvbHV0aW9uUmVxdWlyZWQoIG1vam8uZ2V0UmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbigpICk7DQorICAgICAgICBkZXNjcmlwdG9yLnNldEFnZ3JlZ2F0b3IoIG1vam8uaXNBZ2dyZWdhdG9yKCkgKTsNCisgICAgICAgIGRlc2NyaXB0b3Iuc2V0SW5oZXJpdGVkQnlEZWZhdWx0KCBtb2pvLmlzSW5oZXJpdEJ5RGVmYXVsdCgpICk7DQorICAgICAgICBkZXNjcmlwdG9yLnNldERpcmVjdEludm9jYXRpb25Pbmx5KCBtb2pvLmlzUmVxdWlyZXNEaXJlY3RJbnZvY2F0aW9uKCkgKTsNCisgICAgICAgIGRlc2NyaXB0b3Iuc2V0T25saW5lUmVxdWlyZWQoIG1vam8uaXNSZXF1aXJlc09ubGluZSgpICk7DQorICAgICAgICBkZXNjcmlwdG9yLnNldFByb2plY3RSZXF1aXJlZCggbW9qby5pc1JlcXVpcmVzUHJvamVjdCgpICk7DQorICAgICAgICBkZXNjcmlwdG9yLnNldFJlcXVpcmVzUmVwb3J0cyggbW9qby5pc1JlcXVpcmVzUmVwb3J0cygpICk7DQorICAgICAgICBkZXNjcmlwdG9yLnNldERlc2NyaXB0aW9uKCBtb2pvLmdldERlc2NyaXB0aW9uKCkgKTsNCisgICAgICAgIGRlc2NyaXB0b3Iuc2V0RGVwcmVjYXRlZCggbW9qby5nZXREZXByZWNhdGlvbigpICk7DQorICAgICAgICBkZXNjcmlwdG9yLnNldFNpbmNlKCBtb2pvLmdldFNpbmNlKCkgKTsNCisNCisgICAgICAgIExpZmVjeWNsZUV4ZWN1dGlvbiBsZSA9IG1vam8uZ2V0RXhlY3V0aW9uKCk7DQorICAgICAgICBpZiAoIGxlICE9IG51bGwgKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0RXhlY3V0ZUxpZmVjeWNsZSggbGUuZ2V0TGlmZWN5Y2xlKCkgKTsNCisgICAgICAgICAgICBkZXNjcmlwdG9yLnNldEV4ZWN1dGVQaGFzZSggbGUuZ2V0UGhhc2UoKSApOw0KKyAgICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0RXhlY3V0ZUdvYWwoIGxlLmdldEdvYWwoKSApOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgTGlzdDxvcmcuYXBhY2hlLm1hdmVuLnRvb2xzLnBsdWdpbi5leHRyYWN0b3IubW9kZWwuUGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gbW9qby5nZXRQYXJhbWV0ZXJzKCk7DQorDQorICAgICAgICBpZiAoIHBhcmFtZXRlcnMgIT0gbnVsbCAmJiAhcGFyYW1ldGVycy5pc0VtcHR5KCkgKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGZvciAoIG9yZy5hcGFjaGUubWF2ZW4udG9vbHMucGx1Z2luLmV4dHJhY3Rvci5tb2RlbC5QYXJhbWV0ZXIgcGFyYW0gOiBwYXJhbWV0ZXJzICkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIFBhcmFtZXRlciBkUGFyYW0gPSBuZXcgUGFyYW1ldGVyKCk7DQorICAgICAgICAgICAgICAgIGRQYXJhbS5zZXRBbGlhcyggcGFyYW0uZ2V0QWxpYXMoKSApOw0KKyAgICAgICAgICAgICAgICBkUGFyYW0uc2V0RGVwcmVjYXRlZCggcGFyYW0uZ2V0RGVwcmVjYXRpb24oKSApOw0KKyAgICAgICAgICAgICAgICBkUGFyYW0uc2V0RGVzY3JpcHRpb24oIHBhcmFtLmdldERlc2NyaXB0aW9uKCkgKTsNCisgICAgICAgICAgICAgICAgZFBhcmFtLnNldEVkaXRhYmxlKCAhcGFyYW0uaXNSZWFkb25seSgpICk7DQorICAgICAgICAgICAgICAgIGRQYXJhbS5zZXRFeHByZXNzaW9uKCBwYXJhbS5nZXRFeHByZXNzaW9uKCkgKTsNCisgICAgICAgICAgICAgICAgZFBhcmFtLnNldERlZmF1bHRWYWx1ZSggcGFyYW0uZ2V0RGVmYXVsdFZhbHVlKCkgKTsNCisgICAgICAgICAgICAgICAgZFBhcmFtLnNldFNpbmNlKCBwYXJhbS5nZXRTaW5jZSgpICk7DQorDQorICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IHBhcmFtLmdldFByb3BlcnR5KCk7DQorICAgICAgICAgICAgICAgIGlmICggU3RyaW5nVXRpbHMuaXNOb3RFbXB0eSggcHJvcGVydHkgKSApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIGRQYXJhbS5zZXROYW1lKCBwcm9wZXJ0eSApOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgZFBhcmFtLnNldE5hbWUoIHBhcmFtLmdldE5hbWUoKSApOw0KKyAgICAgICAgICAgICAgICB9DQorDQorICAgICAgICAgICAgICAgIGlmICggU3RyaW5nVXRpbHMuaXNFbXB0eSggZFBhcmFtLmdldE5hbWUoKSApICkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBsdWdpbk1ldGFkYXRhUGFyc2VFeGNlcHRpb24oIG1ldGFkYXRhRmlsZSwgIk1vam86IFwnIiArIG1vam8uZ2V0R29hbCgpDQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCcgaGFzIGEgcGFyYW1ldGVyIHdpdGhvdXQgZWl0aGVyIHByb3BlcnR5IG9yIG5hbWUgYXR0cmlidXRlcy4gUGxlYXNlIHNwZWNpZnkgb25lLiIgKTsNCisgICAgICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgICAgICBkUGFyYW0uc2V0UmVxdWlyZWQoIHBhcmFtLmlzUmVxdWlyZWQoKSApOw0KKyAgICAgICAgICAgICAgICBkUGFyYW0uc2V0VHlwZSggcGFyYW0uZ2V0VHlwZSgpICk7DQorDQorICAgICAgICAgICAgICAgIHRyeQ0KKyAgICAgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZFBhcmFtZXRlciggZFBhcmFtICk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICAgICAgY2F0Y2ggKCBEdXBsaWNhdGVQYXJhbWV0ZXJFeGNlcHRpb24gZSApDQorICAgICAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQbHVnaW5NZXRhZGF0YVBhcnNlRXhjZXB0aW9uKCBtZXRhZGF0YUZpbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSBwYXJhbWV0ZXJzIGRldGVjdGVkIGZvciBtb2pvOiAiICsgbW9qby5nZXRHb2FsKCksDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSApOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgTGlzdDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBtb2pvLmdldENvbXBvbmVudHMoKTsNCisNCisgICAgICAgIGlmICggY29tcG9uZW50cyAhPSBudWxsICYmICFjb21wb25lbnRzLmlzRW1wdHkoKSApDQorICAgICAgICB7DQorICAgICAgICAgICAgZm9yICggQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMgKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgQ29tcG9uZW50UmVxdWlyZW1lbnQgY3IgPSBuZXcgQ29tcG9uZW50UmVxdWlyZW1lbnQoKTsNCisgICAgICAgICAgICAgICAgY3Iuc2V0Um9sZSggY29tcG9uZW50LmdldFJvbGUoKSApOw0KKyAgICAgICAgICAgICAgICBjci5zZXRSb2xlSGludCggY29tcG9uZW50LmdldEhpbnQoKSApOw0KKw0KKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZFJlcXVpcmVtZW50KCBjciApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL21hdmVuLXNjcmlwdC9tYXZlbi1wbHVnaW4tdG9vbHMtbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvbW9kZWwvUGx1Z2luTWV0YWRhdGFQYXJzZXJUZXN0LmphdmEgYi9tYXZlbi1zY3JpcHQvbWF2ZW4tcGx1Z2luLXRvb2xzLW1vZGVsL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi90b29scy9wbHVnaW4vZXh0cmFjdG9yL21vZGVsL1BsdWdpbk1ldGFkYXRhUGFyc2VyVGVzdC5qYXZhCmluZGV4IDc2MzIyNTUuLjFmY2I3ZGEgMTAwNjQ0Ci0tLSBhL21hdmVuLXNjcmlwdC9tYXZlbi1wbHVnaW4tdG9vbHMtbW9kZWwvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3Rvb2xzL3BsdWdpbi9leHRyYWN0b3IvbW9kZWwvUGx1Z2luTWV0YWRhdGFQYXJzZXJUZXN0LmphdmEKKysrIGIvbWF2ZW4tc2NyaXB0L21hdmVuLXBsdWdpbi10b29scy1tb2RlbC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vdG9vbHMvcGx1Z2luL2V4dHJhY3Rvci9tb2RlbC9QbHVnaW5NZXRhZGF0YVBhcnNlclRlc3QuamF2YQpAQCAtMjUsMTUgKzI1LDE5IEBACiBpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmRlc2NyaXB0b3IuTW9qb0Rlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLlRlc3Q7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuanVwaXRlci5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUcnVlOwogCisvLyBhdCBsZWFzdCBvbmUgdGVzdCBjbGFzcyBtdXN0IGJlIHB1YmxpYyBmb3IgdGVzdC1qYXZhZG9jIHJlcG9ydAogcHVibGljIGNsYXNzIFBsdWdpbk1ldGFkYXRhUGFyc2VyVGVzdAogewogICAgIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljRGVjbGFyYXRpb25XaXRob3V0Q2FsbCgpCisgICAgdm9pZCB0ZXN0QmFzaWNEZWNsYXJhdGlvbldpdGhvdXRDYWxsKCkKICAgICAgICAgdGhyb3dzIFBsdWdpbk1ldGFkYXRhUGFyc2VFeGNlcHRpb24KICAgICB7CiAgICAgICAgIEZpbGUgbWV0YWRhdGFGaWxlID0gZ2V0TWV0YWRhdGFGaWxlKCAidGVzdC5tb2pvcy54bWwiICk7CkBAIC00Nyw3ICs1MSw3IEBACiAgICAgfQogICAgIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEJhc2ljRGVjbGFyYXRpb25XaXRoQ2FsbCgpCisgICAgdm9pZCB0ZXN0QmFzaWNEZWNsYXJhdGlvbldpdGhDYWxsKCkKICAgICAgICAgdGhyb3dzIFBsdWdpbk1ldGFkYXRhUGFyc2VFeGNlcHRpb24KICAgICB7CiAgICAgICAgIEZpbGUgbWV0YWRhdGFGaWxlID0gZ2V0TWV0YWRhdGFGaWxlKCAidGVzdDIubW9qb3MueG1sIiApOwpAQCAtNjUsMTAgKzY5LDcgQEAKICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICAgIFVSTCByZXNvdXJjZSA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoIG5hbWUgKTsKLSAgICAgICAgICAgIGlmICggcmVzb3VyY2UgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFpbCggIkNhbm5vdCBmaW5kIGNsYXNzcGF0aCByZXNvdXJjZTogJyIgKyBuYW1lICsgIicuIiApOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCggcmVzb3VyY2UsICJDYW5ub3QgZmluZCBjbGFzc3BhdGggcmVzb3VyY2U6ICciICsgbmFtZSArICInLiIgKTsKICAgICAgICAgICAgIHJldHVybiBQYXRocy5nZXQoIHJlc291cmNlLnRvVVJJKCkgKS50b0ZpbGUoKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoIGZpbmFsIFVSSVN5bnRheEV4Y2VwdGlvbiBlICkKQEAgLTc2LDUgKzc3LDQgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvciggZSApOwogICAgICAgICB9CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9tYXZlbi1zY3JpcHQvbWF2ZW4tc2NyaXB0LWFudC9wb20ueG1sIGIvbWF2ZW4tc2NyaXB0L21hdmVuLXNjcmlwdC1hbnQvcG9tLnhtbAppbmRleCAyYjAyZTQ5Li5hYWE2NDBkIDEwMDY0NAotLS0gYS9tYXZlbi1zY3JpcHQvbWF2ZW4tc2NyaXB0LWFudC9wb20ueG1sCisrKyBiL21hdmVuLXNjcmlwdC9tYXZlbi1zY3JpcHQtYW50L3BvbS54bWwKQEAgLTYwLDE1ICs2MCwxOSBAQAogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1hcmNoaXZlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+NC4yLjU8L3ZlcnNpb24+PCEtLSBKYXZhIDcgLS0+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvcmU8L2FydGlmYWN0SWQ+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgIDxncm91cElkPm9yZy5qdW5pdC5qdXBpdGVyPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQtanVwaXRlci1lbmdpbmU8L2FydGlmYWN0SWQ+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3Q8L2FydGlmYWN0SWQ+CiAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tc2NyaXB0L21hdmVuLXNjcmlwdC1hbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3NjcmlwdC9hbnQvQW50TW9qb0NvbXBvbmVudEZhY3RvcnkuamF2YSBiL21hdmVuLXNjcmlwdC9tYXZlbi1zY3JpcHQtYW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9zY3JpcHQvYW50L0FudE1vam9Db21wb25lbnRGYWN0b3J5LmphdmEKaW5kZXggNmM1YTkxNi4uZTEzZTdiYSAxMDA2NDQKLS0tIGEvbWF2ZW4tc2NyaXB0L21hdmVuLXNjcmlwdC1hbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3NjcmlwdC9hbnQvQW50TW9qb0NvbXBvbmVudEZhY3RvcnkuamF2YQorKysgYi9tYXZlbi1zY3JpcHQvbWF2ZW4tc2NyaXB0LWFudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vc2NyaXB0L2FudC9BbnRNb2pvQ29tcG9uZW50RmFjdG9yeS5qYXZhCkBAIC0xLDQyICsxLDQ0IEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4uc2NyaXB0LmFudDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLmNsYXNzd29ybGRzLkNsYXNzUmVhbG07Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5QbGV4dXNDb250YWluZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuZmFjdG9yeS5Db21wb25lbnRJbnN0YW50aWF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LmZhY3RvcnkuYW50LkFudENvbXBvbmVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuZmFjdG9yeS5hbnQuQW50U2NyaXB0SW52b2tlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5yZXBvc2l0b3J5LkNvbXBvbmVudERlc2NyaXB0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBbnRNb2pvQ29tcG9uZW50RmFjdG9yeQotICAgIGV4dGVuZHMgQW50Q29tcG9uZW50RmFjdG9yeQotewotCi0gICAgcHVibGljIE9iamVjdCBuZXdJbnN0YW5jZSggQ29tcG9uZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBDbGFzc1JlYWxtIHJlYWxtLCBQbGV4dXNDb250YWluZXIgY29udGFpbmVyICkKLSAgICAgICAgdGhyb3dzIENvbXBvbmVudEluc3RhbnRpYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQW50TW9qb1dyYXBwZXIoIChBbnRTY3JpcHRJbnZva2VyKSBzdXBlci5uZXdJbnN0YW5jZSggZGVzY3JpcHRvciwgcmVhbG0sIGNvbnRhaW5lciApICk7Ci0gICAgfQotCi19CitwYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4uc2NyaXB0LmFudDsNCisNCisvKg0KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisgKg0KKyAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCisgKg0KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCisgKiB1bmRlciB0aGUgTGljZW5zZS4NCisgKi8NCisNCitpbXBvcnQgb3JnLmNvZGVoYXVzLmNsYXNzd29ybGRzLkNsYXNzUmVhbG07DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuUGxleHVzQ29udGFpbmVyOw0KK2ltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5mYWN0b3J5LkNvbXBvbmVudEluc3RhbnRpYXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LmZhY3RvcnkuYW50LkFudENvbXBvbmVudEZhY3Rvcnk7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LmZhY3RvcnkuYW50LkFudFNjcmlwdEludm9rZXI7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LnJlcG9zaXRvcnkuQ29tcG9uZW50RGVzY3JpcHRvcjsNCisNCisvKioNCisgKg0KKyAqIEBkZXByZWNhdGVkIFNjcmlwdGluZyBzdXBwb3J0IGZvciBtb2pvcyBpcyBkZXByZWNhdGVkIGFuZCBpcyBwbGFubmVkIHRwIGJlIHJlbW92ZWQgaW4gbWF2ZW4gNC4wDQorICovDQorQERlcHJlY2F0ZWQNCitwdWJsaWMgY2xhc3MgQW50TW9qb0NvbXBvbmVudEZhY3RvcnkNCisgICAgZXh0ZW5kcyBBbnRDb21wb25lbnRGYWN0b3J5DQorew0KKw0KKyAgICBwdWJsaWMgT2JqZWN0IG5ld0luc3RhbmNlKCBDb21wb25lbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IsIENsYXNzUmVhbG0gcmVhbG0sIFBsZXh1c0NvbnRhaW5lciBjb250YWluZXIgKQ0KKyAgICAgICAgdGhyb3dzIENvbXBvbmVudEluc3RhbnRpYXRpb25FeGNlcHRpb24NCisgICAgew0KKyAgICAgICAgcmV0dXJuIG5ldyBBbnRNb2pvV3JhcHBlciggKEFudFNjcmlwdEludm9rZXIpIHN1cGVyLm5ld0luc3RhbmNlKCBkZXNjcmlwdG9yLCByZWFsbSwgY29udGFpbmVyICkgKTsNCisgICAgfQ0KKw0KK30NCmRpZmYgLS1naXQgYS9tYXZlbi1zY3JpcHQvbWF2ZW4tc2NyaXB0LWFudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vc2NyaXB0L2FudC9BbnRNb2pvV3JhcHBlci5qYXZhIGIvbWF2ZW4tc2NyaXB0L21hdmVuLXNjcmlwdC1hbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3NjcmlwdC9hbnQvQW50TW9qb1dyYXBwZXIuamF2YQppbmRleCA5MGYzM2QwLi44NTJlZTgwIDEwMDY0NAotLS0gYS9tYXZlbi1zY3JpcHQvbWF2ZW4tc2NyaXB0LWFudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vc2NyaXB0L2FudC9BbnRNb2pvV3JhcHBlci5qYXZhCisrKyBiL21hdmVuLXNjcmlwdC9tYXZlbi1zY3JpcHQtYW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9zY3JpcHQvYW50L0FudE1vam9XcmFwcGVyLmphdmEKQEAgLTUzLDggKzUzLDEwIEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogLyoqCi0gKiAKKyAqCisgKiBAZGVwcmVjYXRlZCBTY3JpcHRpbmcgc3VwcG9ydCBmb3IgbW9qb3MgaXMgZGVwcmVjYXRlZCBhbmQgaXMgcGxhbm5lZCB0cCBiZSByZW1vdmVkIGluIG1hdmVuIDQuMAogICovCitARGVwcmVjYXRlZAogcHVibGljIGNsYXNzIEFudE1vam9XcmFwcGVyCiAgICAgZXh0ZW5kcyBBYnN0cmFjdE1vam8KICAgICBpbXBsZW1lbnRzIENvbnRleHRFbmFibGVkLCBNYXBPcmllbnRlZENvbXBvbmVudCwgTG9nRW5hYmxlZApkaWZmIC0tZ2l0IGEvbWF2ZW4tc2NyaXB0L21hdmVuLXNjcmlwdC1hbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3NjcmlwdC9hbnQvQW50UHJvcGVydHlIZWxwZXIuamF2YSBiL21hdmVuLXNjcmlwdC9tYXZlbi1zY3JpcHQtYW50L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9zY3JpcHQvYW50L0FudFByb3BlcnR5SGVscGVyLmphdmEKaW5kZXggZWU2YzcwMS4uZjVjOGUwZCAxMDA2NDQKLS0tIGEvbWF2ZW4tc2NyaXB0L21hdmVuLXNjcmlwdC1hbnQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3NjcmlwdC9hbnQvQW50UHJvcGVydHlIZWxwZXIuamF2YQorKysgYi9tYXZlbi1zY3JpcHQvbWF2ZW4tc2NyaXB0LWFudC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vc2NyaXB0L2FudC9BbnRQcm9wZXJ0eUhlbHBlci5qYXZhCkBAIC0xLDIwNSArMSwyMDcgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5zY3JpcHQuYW50OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvcGVydHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuY29uZmlndXJhdG9yLmV4cHJlc3Npb24uRXhwcmVzc2lvbkV2YWx1YXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuY29uZmlndXJhdG9yLmV4cHJlc3Npb24uRXhwcmVzc2lvbkV2YWx1YXRvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuaW50cm9zcGVjdGlvbi5SZWZsZWN0aW9uVmFsdWVFeHRyYWN0b3I7Ci0KLS8qKgotICogTWFrZXMgdGhlICR7ZXhwcmVzc2lvbnN9IHVzZWQgaW4gTWF2ZW4gYXZhaWxhYmxlIHRvIEFudCBhcyBwcm9wZXJ0aWVzLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmtlbm5leUBhcGFjaGUub3JnIj5LZW5uZXkgV2VzdGVyaG9mPC9hPgotICovCi1wdWJsaWMgY2xhc3MgQW50UHJvcGVydHlIZWxwZXIKLSAgICBleHRlbmRzIFByb3BlcnR5SGVscGVyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFUEVOREVOQ1lfUFJFRklYID0gIm1hdmVuLmRlcGVuZGVuY3kuIjsKLSAgICBwcml2YXRlIExvZyBsb2c7Ci0gICAgcHJpdmF0ZSBFeHByZXNzaW9uRXZhbHVhdG9yIGV4cHJFdmFsdWF0b3I7Ci0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgbWF2ZW5Qcm9qZWN0OwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBhcnRpZmFjdE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBvdGhlciBjb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSBwcm9qZWN0Ci0gICAgICogQHBhcmFtIGwKLSAgICAgKi8KLSAgICBwdWJsaWMgQW50UHJvcGVydHlIZWxwZXIoIE1hdmVuUHJvamVjdCBwcm9qZWN0LCBMb2cgbCApCi0gICAgewotICAgICAgICBtYXZlblByb2plY3QgPSBwcm9qZWN0OwotICAgICAgICBsb2cgPSBsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI0FudFByb3BlcnR5SGVscGVyKEV4cHJlc3Npb25FdmFsdWF0b3IsIFNldCwgTG9nKX0gdG8gcmVzb2x2ZSBtYXZlbi5kZXBlbmRlbmN5LioKLSAgICAgKiBwcm9wZXJ0aWVzCi0gICAgICogQHBhcmFtIGV4cHJFdmFsdWF0b3IKLSAgICAgKiBAcGFyYW0gbAotICAgICAqLwotICAgIHB1YmxpYyBBbnRQcm9wZXJ0eUhlbHBlciggRXhwcmVzc2lvbkV2YWx1YXRvciBleHByRXZhbHVhdG9yLCBMb2cgbCApCi0gICAgewotICAgICAgICB0aGlzKCBleHByRXZhbHVhdG9yLCBDb2xsZWN0aW9ucy48QXJ0aWZhY3Q+ZW1wdHlTZXQoKSwgbCApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBleHByRXZhbHVhdG9yCi0gICAgICogQHBhcmFtIGFydGlmYWN0cwotICAgICAqIEBwYXJhbSBsCi0gICAgICovCi0gICAgcHVibGljIEFudFByb3BlcnR5SGVscGVyKCBFeHByZXNzaW9uRXZhbHVhdG9yIGV4cHJFdmFsdWF0b3IsIFNldDxBcnRpZmFjdD4gYXJ0aWZhY3RzLCBMb2cgbCApCi0gICAgewotICAgICAgICB0aGlzLm1hdmVuUHJvamVjdCA9IG51bGw7Ci0gICAgICAgIHRoaXMuZXhwckV2YWx1YXRvciA9IGV4cHJFdmFsdWF0b3I7Ci0gICAgICAgIHRoaXMubG9nID0gbDsKLQotICAgICAgICBmb3IgKCBBcnRpZmFjdCBhcnRpZmFjdCA6IGFydGlmYWN0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBERVBFTkRFTkNZX1BSRUZJWCArIGFydGlmYWN0LmdldEdyb3VwSWQoKSArICIuIiArIGFydGlmYWN0LmdldEFydGlmYWN0SWQoKQotICAgICAgICAgICAgICAgICsgKCBhcnRpZmFjdC5nZXRDbGFzc2lmaWVyKCkgIT0gbnVsbCA/ICIuIiArIGFydGlmYWN0LmdldENsYXNzaWZpZXIoKSA6ICIiICkKLSAgICAgICAgICAgICAgICArICggYXJ0aWZhY3QuZ2V0VHlwZSgpICE9IG51bGwgPyAiLiIgKyBhcnRpZmFjdC5nZXRUeXBlKCkgOiAiIiApICsgIi5wYXRoIjsKLQotICAgICAgICAgICAgbG9nLmRlYnVnKCAiU3RvcmluZzogIiArIGtleSArICI9IiArIGFydGlmYWN0LmdldEZpbGUoKS5nZXRQYXRoKCkgKTsKLQotICAgICAgICAgICAgYXJ0aWZhY3RNYXAucHV0KCBrZXksIGFydGlmYWN0LmdldEZpbGUoKS5nZXRQYXRoKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvcGVydHlIZWxwZXIjZ2V0UHJvcGVydHlIb29rKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgZ2V0UHJvcGVydHlIb29rKCBTdHJpbmcgbnMsIFN0cmluZyBuYW1lLCBib29sZWFuIHVzZXIgKQotICAgIHsKLSAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZy5kZWJ1ZyggImdldFByb3BlcnR5KG5zPSIgKyBucyArICIsIG5hbWU9IiArIG5hbWUgKyAiLCB1c2VyPSIgKyB1c2VyICsgIikiICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBrZWVwIG9sZCBiZWhhdmlvdXIgKi8KLSAgICAgICAgaWYgKCBtYXZlblByb2plY3QgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eUhvb2soIG5zLCBuYW1lLCB1c2VyLCBtYXZlblByb2plY3QgKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgT2JqZWN0IHZhbCA9IG51bGw7Ci0KLSAgICAgICAgaWYgKCBuYW1lLnN0YXJ0c1dpdGgoIERFUEVOREVOQ1lfUFJFRklYICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWwgPSBhcnRpZmFjdE1hcC5nZXQoIG5hbWUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggdmFsID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWwgPSBleHByRXZhbHVhdG9yLmV2YWx1YXRlKCAiJHsiICsgbmFtZSArICJ9IiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBFeHByZXNzaW9uRXZhbHVhdGlvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIGxvZy5pc0Vycm9yRW5hYmxlZCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvciggIkZhaWxlZCB0byBldmFsdWF0ZSBleHByZXNzaW9uIiwgZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggdmFsID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWwgPSBzdXBlci5nZXRQcm9wZXJ0eUhvb2soIG5zLCBuYW1lLCB1c2VyICk7Ci0KLSAgICAgICAgICAgIGlmICggdmFsID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSggbmFtZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCBhZGRlZCB0byBrZWVwIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci0gICAgICogQHBhcmFtIG5zCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKiBAcGFyYW0gdXNlcgotICAgICAqIEBwYXJhbSBtYXZlblByb2plY3QKLSAgICAgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0eSB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIE9iamVjdCBnZXRQcm9wZXJ0eUhvb2soIFN0cmluZyBucywgU3RyaW5nIG5hbWUsIGJvb2xlYW4gdXNlciwgTWF2ZW5Qcm9qZWN0IG1hdmVuUHJvamVjdCApCi0gICAgewotICAgICAgICBPYmplY3QgdmFsID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggbmFtZS5zdGFydHNXaXRoKCBERVBFTkRFTkNZX1BSRUZJWCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWwgPSBhcnRpZmFjdE1hcC5nZXQoIG5hbWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBuYW1lLnN0YXJ0c1dpdGgoICJwcm9qZWN0LiIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsID0gUmVmbGVjdGlvblZhbHVlRXh0cmFjdG9yLmV2YWx1YXRlKAotICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICBtYXZlblByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgIHRydWUKLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIG5hbWUuZXF1YWxzKCAiYmFzZWRpciIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsID0gUmVmbGVjdGlvblZhbHVlRXh0cmFjdG9yLmV2YWx1YXRlKAotICAgICAgICAgICAgICAgICAgICAiYmFzZWRpci5wYXRoIiwKLSAgICAgICAgICAgICAgICAgICAgbWF2ZW5Qcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICBmYWxzZQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggbG9nLmlzV2FybkVuYWJsZWQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nLndhcm4oICJFcnJvciBldmFsdWF0aW5nIGV4cHJlc3Npb24gJyIgKyBuYW1lICsgIiciLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHZhbCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsID0gc3VwZXIuZ2V0UHJvcGVydHlIb29rKCBucywgbmFtZSwgdXNlciApOwotICAgICAgICAgICAgaWYgKCB2YWwgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsID0gU3lzdGVtLmdldFByb3BlcnR5KCBuYW1lICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHZhbCBpbnN0YW5jZW9mIEZpbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWwgPSAoIChGaWxlKSB2YWwgKS5nZXRBYnNvbHV0ZUZpbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWw7Ci0gICAgfQotfQorcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnNjcmlwdC5hbnQ7DQorDQorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyAqDQorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KKyAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KKyAqLw0KKw0KK2ltcG9ydCBqYXZhLmlvLkZpbGU7DQoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsNCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7DQoraW1wb3J0IGphdmEudXRpbC5NYXA7DQoraW1wb3J0IGphdmEudXRpbC5TZXQ7DQorDQoraW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7DQoraW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0Ow0KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlcjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuY29uZmlndXJhdG9yLmV4cHJlc3Npb24uRXhwcmVzc2lvbkV2YWx1YXRpb25FeGNlcHRpb247DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LmNvbmZpZ3VyYXRvci5leHByZXNzaW9uLkV4cHJlc3Npb25FdmFsdWF0b3I7DQoraW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5pbnRyb3NwZWN0aW9uLlJlZmxlY3Rpb25WYWx1ZUV4dHJhY3RvcjsNCisNCisvKioNCisgKiBNYWtlcyB0aGUgJHtleHByZXNzaW9uc30gdXNlZCBpbiBNYXZlbiBhdmFpbGFibGUgdG8gQW50IGFzIHByb3BlcnRpZXMuDQorICoNCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzprZW5uZXlAYXBhY2hlLm9yZyI+S2VubmV5IFdlc3RlcmhvZjwvYT4NCisgKiBAZGVwcmVjYXRlZCBTY3JpcHRpbmcgc3VwcG9ydCBmb3IgbW9qb3MgaXMgZGVwcmVjYXRlZCBhbmQgaXMgcGxhbm5lZCB0cCBiZSByZW1vdmVkIGluIG1hdmVuIDQuMA0KKyAqLw0KK0BEZXByZWNhdGVkDQorcHVibGljIGNsYXNzIEFudFByb3BlcnR5SGVscGVyDQorICAgIGV4dGVuZHMgUHJvcGVydHlIZWxwZXINCit7DQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVBFTkRFTkNZX1BSRUZJWCA9ICJtYXZlbi5kZXBlbmRlbmN5LiI7DQorICAgIHByaXZhdGUgTG9nIGxvZzsNCisgICAgcHJpdmF0ZSBFeHByZXNzaW9uRXZhbHVhdG9yIGV4cHJFdmFsdWF0b3I7DQorICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IG1hdmVuUHJvamVjdDsNCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGFydGlmYWN0TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7DQorDQorICAgIC8qKg0KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIG90aGVyIGNvbnN0cnVjdG9yDQorICAgICAqIEBwYXJhbSBwcm9qZWN0DQorICAgICAqIEBwYXJhbSBsDQorICAgICAqLw0KKyAgICBwdWJsaWMgQW50UHJvcGVydHlIZWxwZXIoIE1hdmVuUHJvamVjdCBwcm9qZWN0LCBMb2cgbCApDQorICAgIHsNCisgICAgICAgIG1hdmVuUHJvamVjdCA9IHByb2plY3Q7DQorICAgICAgICBsb2cgPSBsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNBbnRQcm9wZXJ0eUhlbHBlcihFeHByZXNzaW9uRXZhbHVhdG9yLCBTZXQsIExvZyl9IHRvIHJlc29sdmUgbWF2ZW4uZGVwZW5kZW5jeS4qDQorICAgICAqIHByb3BlcnRpZXMNCisgICAgICogQHBhcmFtIGV4cHJFdmFsdWF0b3INCisgICAgICogQHBhcmFtIGwNCisgICAgICovDQorICAgIHB1YmxpYyBBbnRQcm9wZXJ0eUhlbHBlciggRXhwcmVzc2lvbkV2YWx1YXRvciBleHByRXZhbHVhdG9yLCBMb2cgbCApDQorICAgIHsNCisgICAgICAgIHRoaXMoIGV4cHJFdmFsdWF0b3IsIENvbGxlY3Rpb25zLjxBcnRpZmFjdD5lbXB0eVNldCgpLCBsICk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIEBwYXJhbSBleHByRXZhbHVhdG9yDQorICAgICAqIEBwYXJhbSBhcnRpZmFjdHMNCisgICAgICogQHBhcmFtIGwNCisgICAgICovDQorICAgIHB1YmxpYyBBbnRQcm9wZXJ0eUhlbHBlciggRXhwcmVzc2lvbkV2YWx1YXRvciBleHByRXZhbHVhdG9yLCBTZXQ8QXJ0aWZhY3Q+IGFydGlmYWN0cywgTG9nIGwgKQ0KKyAgICB7DQorICAgICAgICB0aGlzLm1hdmVuUHJvamVjdCA9IG51bGw7DQorICAgICAgICB0aGlzLmV4cHJFdmFsdWF0b3IgPSBleHByRXZhbHVhdG9yOw0KKyAgICAgICAgdGhpcy5sb2cgPSBsOw0KKw0KKyAgICAgICAgZm9yICggQXJ0aWZhY3QgYXJ0aWZhY3QgOiBhcnRpZmFjdHMgKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSBERVBFTkRFTkNZX1BSRUZJWCArIGFydGlmYWN0LmdldEdyb3VwSWQoKSArICIuIiArIGFydGlmYWN0LmdldEFydGlmYWN0SWQoKQ0KKyAgICAgICAgICAgICAgICArICggYXJ0aWZhY3QuZ2V0Q2xhc3NpZmllcigpICE9IG51bGwgPyAiLiIgKyBhcnRpZmFjdC5nZXRDbGFzc2lmaWVyKCkgOiAiIiApDQorICAgICAgICAgICAgICAgICsgKCBhcnRpZmFjdC5nZXRUeXBlKCkgIT0gbnVsbCA/ICIuIiArIGFydGlmYWN0LmdldFR5cGUoKSA6ICIiICkgKyAiLnBhdGgiOw0KKw0KKyAgICAgICAgICAgIGxvZy5kZWJ1ZyggIlN0b3Jpbmc6ICIgKyBrZXkgKyAiPSIgKyBhcnRpZmFjdC5nZXRGaWxlKCkuZ2V0UGF0aCgpICk7DQorDQorICAgICAgICAgICAgYXJ0aWZhY3RNYXAucHV0KCBrZXksIGFydGlmYWN0LmdldEZpbGUoKS5nZXRQYXRoKCkgKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlciNnZXRQcm9wZXJ0eUhvb2soamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikNCisgICAgICovDQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldFByb3BlcnR5SG9vayggU3RyaW5nIG5zLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiB1c2VyICkNCisgICAgew0KKyAgICAgICAgaWYgKCBsb2cuaXNEZWJ1Z0VuYWJsZWQoKSApDQorICAgICAgICB7DQorICAgICAgICAgICAgbG9nLmRlYnVnKCAiZ2V0UHJvcGVydHkobnM9IiArIG5zICsgIiwgbmFtZT0iICsgbmFtZSArICIsIHVzZXI9IiArIHVzZXIgKyAiKSIgKTsNCisgICAgICAgIH0NCisNCisgICAgICAgIC8qIGtlZXAgb2xkIGJlaGF2aW91ciAqLw0KKyAgICAgICAgaWYgKCBtYXZlblByb2plY3QgIT0gbnVsbCApDQorICAgICAgICB7DQorICAgICAgICAgICAgcmV0dXJuIGdldFByb3BlcnR5SG9vayggbnMsIG5hbWUsIHVzZXIsIG1hdmVuUHJvamVjdCApOw0KKyAgICAgICAgfQ0KKw0KKw0KKyAgICAgICAgT2JqZWN0IHZhbCA9IG51bGw7DQorDQorICAgICAgICBpZiAoIG5hbWUuc3RhcnRzV2l0aCggREVQRU5ERU5DWV9QUkVGSVggKSApDQorICAgICAgICB7DQorICAgICAgICAgICAgdmFsID0gYXJ0aWZhY3RNYXAuZ2V0KCBuYW1lICk7DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoIHZhbCA9PSBudWxsICkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0cnkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhbCA9IGV4cHJFdmFsdWF0b3IuZXZhbHVhdGUoICIkeyIgKyBuYW1lICsgIn0iICk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgIGNhdGNoICggRXhwcmVzc2lvbkV2YWx1YXRpb25FeGNlcHRpb24gZSApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICBpZiAoIGxvZy5pc0Vycm9yRW5hYmxlZCgpICkNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgbG9nLmVycm9yKCAiRmFpbGVkIHRvIGV2YWx1YXRlIGV4cHJlc3Npb24iLCBlICk7DQorICAgICAgICAgICAgICAgIH0NCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICBpZiAoIHZhbCA9PSBudWxsICkNCisgICAgICAgIHsNCisgICAgICAgICAgICB2YWwgPSBzdXBlci5nZXRQcm9wZXJ0eUhvb2soIG5zLCBuYW1lLCB1c2VyICk7DQorDQorICAgICAgICAgICAgaWYgKCB2YWwgPT0gbnVsbCApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YWwgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIG5hbWUgKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gdmFsOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBAZGVwcmVjYXRlZCBhZGRlZCB0byBrZWVwIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5DQorICAgICAqIEBwYXJhbSBucw0KKyAgICAgKiBAcGFyYW0gbmFtZQ0KKyAgICAgKiBAcGFyYW0gdXNlcg0KKyAgICAgKiBAcGFyYW0gbWF2ZW5Qcm9qZWN0DQorICAgICAqIEByZXR1cm4gVGhlIHByb3BlcnR5IHZhbHVlLg0KKyAgICAgKi8NCisgICAgcHJpdmF0ZSBPYmplY3QgZ2V0UHJvcGVydHlIb29rKCBTdHJpbmcgbnMsIFN0cmluZyBuYW1lLCBib29sZWFuIHVzZXIsIE1hdmVuUHJvamVjdCBtYXZlblByb2plY3QgKQ0KKyAgICB7DQorICAgICAgICBPYmplY3QgdmFsID0gbnVsbDsNCisgICAgICAgIHRyeQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIGlmICggbmFtZS5zdGFydHNXaXRoKCBERVBFTkRFTkNZX1BSRUZJWCApICkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhbCA9IGFydGlmYWN0TWFwLmdldCggbmFtZSApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlIGlmICggbmFtZS5zdGFydHNXaXRoKCAicHJvamVjdC4iICkgKQ0KKyAgICAgICAgICAgIHsNCisgICAgICAgICAgICAgICAgdmFsID0gUmVmbGVjdGlvblZhbHVlRXh0cmFjdG9yLmV2YWx1YXRlKA0KKyAgICAgICAgICAgICAgICAgICAgbmFtZSwNCisgICAgICAgICAgICAgICAgICAgIG1hdmVuUHJvamVjdCwNCisgICAgICAgICAgICAgICAgICAgIHRydWUNCisgICAgICAgICAgICAgICAgKTsNCisgICAgICAgICAgICB9DQorICAgICAgICAgICAgZWxzZSBpZiAoIG5hbWUuZXF1YWxzKCAiYmFzZWRpciIgKSApDQorICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICB2YWwgPSBSZWZsZWN0aW9uVmFsdWVFeHRyYWN0b3IuZXZhbHVhdGUoDQorICAgICAgICAgICAgICAgICAgICAiYmFzZWRpci5wYXRoIiwNCisgICAgICAgICAgICAgICAgICAgIG1hdmVuUHJvamVjdCwNCisgICAgICAgICAgICAgICAgICAgIGZhbHNlDQorICAgICAgICAgICAgICAgICk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICAgICAgY2F0Y2ggKCBFeGNlcHRpb24gZSApDQorICAgICAgICB7DQorICAgICAgICAgICAgaWYgKCBsb2cuaXNXYXJuRW5hYmxlZCgpICkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIGxvZy53YXJuKCAiRXJyb3IgZXZhbHVhdGluZyBleHByZXNzaW9uICciICsgbmFtZSArICInIiwgZSApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGlmICggdmFsID09IG51bGwgKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIHZhbCA9IHN1cGVyLmdldFByb3BlcnR5SG9vayggbnMsIG5hbWUsIHVzZXIgKTsNCisgICAgICAgICAgICBpZiAoIHZhbCA9PSBudWxsICkNCisgICAgICAgICAgICB7DQorICAgICAgICAgICAgICAgIHZhbCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSggbmFtZSApOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisNCisgICAgICAgIGlmICggdmFsIGluc3RhbmNlb2YgRmlsZSApDQorICAgICAgICB7DQorICAgICAgICAgICAgdmFsID0gKCAoRmlsZSkgdmFsICkuZ2V0QWJzb2x1dGVGaWxlKCk7DQorICAgICAgICB9DQorDQorICAgICAgICByZXR1cm4gdmFsOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL21hdmVuLXNjcmlwdC9tYXZlbi1zY3JpcHQtYW50L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9zY3JpcHQvYW50L0FudE1vam9XcmFwcGVyVGVzdC5qYXZhIGIvbWF2ZW4tc2NyaXB0L21hdmVuLXNjcmlwdC1hbnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3NjcmlwdC9hbnQvQW50TW9qb1dyYXBwZXJUZXN0LmphdmEKaW5kZXggNzkxYzg3Zi4uYzYzYmUwMiAxMDA2NDQKLS0tIGEvbWF2ZW4tc2NyaXB0L21hdmVuLXNjcmlwdC1hbnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3NjcmlwdC9hbnQvQW50TW9qb1dyYXBwZXJUZXN0LmphdmEKKysrIGIvbWF2ZW4tc2NyaXB0L21hdmVuLXNjcmlwdC1hbnQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3NjcmlwdC9hbnQvQW50TW9qb1dyYXBwZXJUZXN0LmphdmEKQEAgLTE5LDggKzE5LDkgQEAKICAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uYXRMZWFzdE9uY2U7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CkBAIC02NSwyMyArNjYsMjQgQEAKIGltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbmZpZ3VyYXRpb24uUGxleHVzQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nZ2VyOwogaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5jb25zb2xlLkNvbnNvbGVMb2dnZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuQmVmb3JlRWFjaDsKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuVGVzdDsKIGltcG9ydCBvcmcubW9ja2l0by5Bcmd1bWVudENhcHRvcjsKIAorLy8gYXQgbGVhc3Qgb25lIHRlc3QgY2xhc3MgbXVzdCBiZSBwdWJsaWMgZm9yIHRlc3QtamF2YWRvYyByZXBvcnQKIHB1YmxpYyBjbGFzcyBBbnRNb2pvV3JhcHBlclRlc3QKIHsKICAgICAKICAgICBwcml2YXRlIEJ1aWxkTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcjsKIAotICAgIEBCZWZvcmUKKyAgICBAQmVmb3JlRWFjaAogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgCiAgICAgewogICAgICAgICBidWlsZExpc3RlbmVyID0gbW9jayggQnVpbGRMaXN0ZW5lci5jbGFzcyApOwogICAgIH0KICAgICAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3QyeFN0eWxlUGx1Z2luKCkKKyAgICB2b2lkIHRlc3QyeFN0eWxlUGx1Z2luKCkKICAgICAgICAgdGhyb3dzIFBsZXh1c0NvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb21wb25lbnRJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLAogICAgICAgICBDb21wb25lbnRDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBBcmNoaXZlckV4Y2VwdGlvbiwgVVJJU3ludGF4RXhjZXB0aW9uCiAgICAgewpAQCAtMTA2LDE0ICsxMDgsOCBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFByZXNlbmNlKCBMaXN0PFN0cmluZz4gbWVzc2FnZXMsIFN0cmluZyB0ZXN0ICkKICAgICB7Ci0gICAgICAgIGZvciAoIFN0cmluZyBtZXNzYWdlIDogbWVzc2FnZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIG1lc3NhZ2UuY29udGFpbnMoIHRlc3QgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFpbCggIlRlc3Qgc3RyaW5nOiAnIiArIHRlc3QgKyAiJyB3YXMgZm91bmQgaW4gb3V0cHV0LCBidXQgU0hPVUxEIE5PVCBCRSBUSEVSRS4iICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIG1lc3NhZ2VzLnN0cmVhbSgpLm5vbmVNYXRjaCggcyAtPiBzLmNvbnRhaW5zKCB0ZXN0ICkgKSwKKyAgICAgICAgICAgICAgICAiVGVzdCBzdHJpbmc6ICciICsgdGVzdCArICInIHdhcyBmb3VuZCBpbiBvdXRwdXQsIGJ1dCBTSE9VTEQgTk9UIEJFIFRIRVJFLiIgKTsKICAgICB9CiAKICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBydW4oIFN0cmluZyBwbHVnaW5YbWwgKQpAQCAtMTI1LDEwICsxMjEsNyBAQAogCiAgICAgICAgIFVSTCByZXNvdXJjZSA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoIHBsdWdpblhtbCApOwogCi0gICAgICAgIGlmICggcmVzb3VyY2UgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhaWwoICJwbHVnaW4gZGVzY3JpcHRvciBub3QgZm91bmQ6ICciICsgcGx1Z2luWG1sICsgIicuIiApOwotICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwoIHJlc291cmNlLCAicGx1Z2luIGRlc2NyaXB0b3Igbm90IGZvdW5kOiAnIiArIHBsdWdpblhtbCArICInLiIgKTsKIAogICAgICAgICBQbHVnaW5EZXNjcmlwdG9yIHBkOwogICAgICAgICB0cnkgKCBSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKCByZXNvdXJjZS5vcGVuU3RyZWFtKCkgKSApCmRpZmYgLS1naXQgYS9tYXZlbi1zY3JpcHQvbWF2ZW4tc2NyaXB0LWJlYW5zaGVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vc2NyaXB0L2JlYW5zaGVsbC9CZWFuc2hlbGxNb2pvQWRhcHRlci5qYXZhIGIvbWF2ZW4tc2NyaXB0L21hdmVuLXNjcmlwdC1iZWFuc2hlbGwvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3NjcmlwdC9iZWFuc2hlbGwvQmVhbnNoZWxsTW9qb0FkYXB0ZXIuamF2YQppbmRleCA0MDU0NThhLi5iMjAwOGY4IDEwMDY0NAotLS0gYS9tYXZlbi1zY3JpcHQvbWF2ZW4tc2NyaXB0LWJlYW5zaGVsbC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vc2NyaXB0L2JlYW5zaGVsbC9CZWFuc2hlbGxNb2pvQWRhcHRlci5qYXZhCisrKyBiL21hdmVuLXNjcmlwdC9tYXZlbi1zY3JpcHQtYmVhbnNoZWxsL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9zY3JpcHQvYmVhbnNoZWxsL0JlYW5zaGVsbE1vam9BZGFwdGVyLmphdmEKQEAgLTEsNzAgKzEsNzIgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5zY3JpcHQuYmVhbnNoZWxsOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBic2guRXZhbEVycm9yOwotaW1wb3J0IGJzaC5JbnRlcnByZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LmZhY3RvcnkuYnNoLkJzaENvbXBvbmVudDsKLQotLyoqCi0gKiBNb2pvIGFkYXB0ZXIgZm9yIGEgQmVhbnNoZWxsIE1vam8uCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YnJldHRAYXBhY2hlLm9yZyI+QnJldHQgUG9ydGVyPC9hPgotICovCi1wdWJsaWMgY2xhc3MgQmVhbnNoZWxsTW9qb0FkYXB0ZXIKLSAgICBleHRlbmRzIEFic3RyYWN0TW9qbwotICAgIGltcGxlbWVudHMgQnNoQ29tcG9uZW50Ci17Ci0gICAgcHJpdmF0ZSBNb2pvIG1vam87Ci0KLSAgICBwcml2YXRlIEludGVycHJldGVyIGludGVycHJldGVyOwotCi0gICAgcHVibGljIEJlYW5zaGVsbE1vam9BZGFwdGVyKCBNb2pvIG1vam8sIEludGVycHJldGVyIGludGVycHJldGVyICkKLSAgICB7Ci0gICAgICAgIHRoaXMubW9qbyA9IG1vam87Ci0gICAgICAgIHRoaXMuaW50ZXJwcmV0ZXIgPSBpbnRlcnByZXRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaW50ZXJwcmV0ZXIuc2V0KCAibG9nZ2VyIiwgZ2V0TG9nKCkgKTsKLQotICAgICAgICAgICAgLy8gVE9ETzogc2V0IG91dCwgZXJyIHRvIGEgcHJpbnQgc3RyZWFtIHRoYXQgd2lsbCBsb2cgYXQgaW5mbywgZXJyb3IgcmVzcGVjdGl2ZWx5Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBFdmFsRXJyb3IgZXZhbEVycm9yICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJVbmFibGUgdG8gZXN0YWJsaXNoIG1vam8iLCBldmFsRXJyb3IgKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1vam8uZXhlY3V0ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnRlcnByZXRlciBnZXRJbnRlcnByZXRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gaW50ZXJwcmV0ZXI7Ci0gICAgfQotfQorcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnNjcmlwdC5iZWFuc2hlbGw7DQorDQorLyoNCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQorICogdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQoraW1wb3J0IGJzaC5FdmFsRXJyb3I7DQoraW1wb3J0IGJzaC5JbnRlcnByZXRlcjsNCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOw0KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsNCitpbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuZmFjdG9yeS5ic2guQnNoQ29tcG9uZW50Ow0KKw0KKy8qKg0KKyAqIE1vam8gYWRhcHRlciBmb3IgYSBCZWFuc2hlbGwgTW9qby4NCisgKg0KKyAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmJyZXR0QGFwYWNoZS5vcmciPkJyZXR0IFBvcnRlcjwvYT4NCisgKiBAZGVwcmVjYXRlZCBTY3JpcHRpbmcgc3VwcG9ydCBmb3IgbW9qb3MgaXMgZGVwcmVjYXRlZCBhbmQgaXMgcGxhbm5lZCB0cCBiZSByZW1vdmVkIGluIG1hdmVuIDQuMA0KKyAqLw0KK0BEZXByZWNhdGVkDQorcHVibGljIGNsYXNzIEJlYW5zaGVsbE1vam9BZGFwdGVyDQorICAgIGV4dGVuZHMgQWJzdHJhY3RNb2pvDQorICAgIGltcGxlbWVudHMgQnNoQ29tcG9uZW50DQorew0KKyAgICBwcml2YXRlIE1vam8gbW9qbzsNCisNCisgICAgcHJpdmF0ZSBJbnRlcnByZXRlciBpbnRlcnByZXRlcjsNCisNCisgICAgcHVibGljIEJlYW5zaGVsbE1vam9BZGFwdGVyKCBNb2pvIG1vam8sIEludGVycHJldGVyIGludGVycHJldGVyICkNCisgICAgew0KKyAgICAgICAgdGhpcy5tb2pvID0gbW9qbzsNCisgICAgICAgIHRoaXMuaW50ZXJwcmV0ZXIgPSBpbnRlcnByZXRlcjsNCisgICAgfQ0KKw0KKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkNCisgICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbg0KKyAgICB7DQorICAgICAgICB0cnkNCisgICAgICAgIHsNCisgICAgICAgICAgICBpbnRlcnByZXRlci5zZXQoICJsb2dnZXIiLCBnZXRMb2coKSApOw0KKw0KKyAgICAgICAgICAgIC8vIFRPRE86IHNldCBvdXQsIGVyciB0byBhIHByaW50IHN0cmVhbSB0aGF0IHdpbGwgbG9nIGF0IGluZm8sIGVycm9yIHJlc3BlY3RpdmVseQ0KKyAgICAgICAgfQ0KKyAgICAgICAgY2F0Y2ggKCBFdmFsRXJyb3IgZXZhbEVycm9yICkNCisgICAgICAgIHsNCisgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIlVuYWJsZSB0byBlc3RhYmxpc2ggbW9qbyIsIGV2YWxFcnJvciApOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgbW9qby5leGVjdXRlKCk7DQorICAgIH0NCisNCisgICAgcHVibGljIEludGVycHJldGVyIGdldEludGVycHJldGVyKCkNCisgICAgew0KKyAgICAgICAgcmV0dXJuIGludGVycHJldGVyOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCmluZGV4IDIzN2RhNjEuLjcxYTI5NWUgMTAwNjQ0Ci0tLSBhL3BvbS54bWwKKysrIGIvcG9tLnhtbApAQCAtMjMsNyArMjMsNyBAQAogICA8cGFyZW50PgogICAgIDxhcnRpZmFjdElkPm1hdmVuLXBhcmVudDwvYXJ0aWZhY3RJZD4KICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjM0PC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjM3PC92ZXJzaW9uPgogICAgIDxyZWxhdGl2ZVBhdGgvPgogICA8L3BhcmVudD4KIApAQCAtODAsNyArODAsNyBAQAogICA8L2lzc3VlTWFuYWdlbWVudD4KICAgPGNpTWFuYWdlbWVudD4KICAgICA8c3lzdGVtPkplbmtpbnM8L3N5c3RlbT4KLSAgICA8dXJsPmh0dHBzOi8vY2ktYnVpbGRzLmFwYWNoZS5vcmcvam9iL01hdmVuL2pvYi9tYXZlbi1ib3gvam9iL21hdmVuLXBsdWdpbi10b29scy88L3VybD4KKyAgICA8dXJsPmh0dHBzOi8vY2ktbWF2ZW4uYXBhY2hlLm9yZy9qb2IvTWF2ZW4vam9iL21hdmVuLWJveC9qb2IvbWF2ZW4tcGx1Z2luLXRvb2xzLzwvdXJsPgogICA8L2NpTWFuYWdlbWVudD4KICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+CiAgICAgPHNpdGU+CkBAIC05MCwxNCArOTAsMTYgQEAKICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgogCiAgIDxwcm9wZXJ0aWVzPgotICAgIDxzdXJlZmlyZVZlcnNpb24+Mi4yMi4yPC9zdXJlZmlyZVZlcnNpb24+Ci0gICAgPGphdmFWZXJzaW9uPjc8L2phdmFWZXJzaW9uPgorICAgIDxzdXJlZmlyZS52ZXJzaW9uPjIuMjIuMjwvc3VyZWZpcmUudmVyc2lvbj4KKyAgICA8amF2YVZlcnNpb24+ODwvamF2YVZlcnNpb24+CiAgICAgPHBsdWdpblRlc3RpbmdIYXJuZXNzVmVyc2lvbj4zLjMuMDwvcGx1Z2luVGVzdGluZ0hhcm5lc3NWZXJzaW9uPgogICAgIDxtYXZlblZlcnNpb24+My4yLjU8L21hdmVuVmVyc2lvbj4KKyAgICA8YW50VmVyc2lvbj4xLjEwLjEyPC9hbnRWZXJzaW9uPgorICAgIDxhc21WZXJzaW9uPjkuMzwvYXNtVmVyc2lvbj4KKyAgICA8cGxleHVzVXRpbHNWZXJzaW9uPjMuNC4yPC9wbGV4dXNVdGlsc1ZlcnNpb24+CisgICAgPHJlcG9ydGluZ0FwaVZlcnNpb24+My4xLjE8L3JlcG9ydGluZ0FwaVZlcnNpb24+CisgICAgPHJlcG9ydGluZ0ltcGxWZXJzaW9uPjMuMi4wPC9yZXBvcnRpbmdJbXBsVmVyc2lvbj4KICAgICA8ZG94aWFWZXJzaW9uPjEuMTEuMTwvZG94aWFWZXJzaW9uPgotICAgIDxhbnRWZXJzaW9uPjEuOS4xNjwvYW50VmVyc2lvbj4KLSAgICA8c2lzdVZlcnNpb24+MC4zLjU8L3Npc3VWZXJzaW9uPgotICAgIDxhc21WZXJzaW9uPjkuMjwvYXNtVmVyc2lvbj4KIAogICAgIDxtYXZlbi5zaXRlLnBhdGg+cGx1Z2luLXRvb2xzLWFyY2hpdmVzL3BsdWdpbi10b29scy1MQVRFU1Q8L21hdmVuLnNpdGUucGF0aD4KICAgICA8cHJvamVjdC5idWlsZC5vdXRwdXRUaW1lc3RhbXA+MjAyMi0wMS0xMFQyMzowNTozOFo8L3Byb2plY3QuYnVpbGQub3V0cHV0VGltZXN0YW1wPgpAQCAtMTgxLDEyICsxODMsMTIgQEAKICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnJlcG9ydGluZzwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVwb3J0aW5nLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+My4wPC92ZXJzaW9uPgorICAgICAgICA8dmVyc2lvbj4ke3JlcG9ydGluZ0FwaVZlcnNpb259PC92ZXJzaW9uPgogICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXBvcnRpbmctaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+My4wLjA8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPiR7cmVwb3J0aW5nSW1wbFZlcnNpb259PC92ZXJzaW9uPgogICAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgICA8IS0tIGRveGlhIC0tPgpAQCAtMjM3LDI0ICsyMzksMTQgQEAKIAogICAgICAgPCEtLSBwbGV4dXMgLS0+CiAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2Uuc2lzdTwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uuc2lzdS5wbGV4dXM8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPiR7c2lzdVZlcnNpb259PC92ZXJzaW9uPgotICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+My4zLjA8L3ZlcnNpb24+Ci0gICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBvbmVudC1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4xLjE8L3ZlcnNpb24+CisgICAgICAgIDx2ZXJzaW9uPiR7cGxleHVzVXRpbHNWZXJzaW9ufTwvdmVyc2lvbj4KICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtYXJjaGl2ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjMuNi4wPC92ZXJzaW9uPgorICAgICAgICA8dmVyc2lvbj40LjIuNzwvdmVyc2lvbj4KICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgpAQCAtMjgyLDcgKzI3NCw3IEBACiAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgPGdyb3VwSWQ+Y29tLnRob3VnaHR3b3Jrcy5xZG94PC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5xZG94PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjAuMTwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+CiAgICAgICA8L2RlcGVuZGVuY3k+CiAKICAgICAgIDxkZXBlbmRlbmN5PgpAQCAtMjk2LDYgKzI4OCw3IEBACiAgICAgICAgIDx2ZXJzaW9uPiR7YXNtVmVyc2lvbn08L3ZlcnNpb24+CiAgICAgICA8L2RlcGVuZGVuY3k+CiAKKyAgICAgIDwhLS0gdGVzdGluZyAtLT4KICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10ZXN0aW5nPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tdGVzdGluZy1oYXJuZXNzPC9hcnRpZmFjdElkPgpAQCAtMzAzLDE1ICsyOTYsMzQgQEAKICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgogICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tb2NraXRvLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMjguMjwvdmVyc2lvbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFzc2VydGo8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmFzc2VydGotY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+My4yMy4xPC92ZXJzaW9uPgogICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CiAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj40LjEzLjI8L3ZlcnNpb24+CisgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KKyAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tb2NraXRvLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuMTIuNDwvdmVyc2lvbj4KKyAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQtYm9tPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj41LjkuMTwvdmVyc2lvbj4KKyAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICA8c2NvcGU+aW1wb3J0PC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdGVzdGluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4xLjA8L3ZlcnNpb24+CiAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICA8L2RlcGVuZGVuY2llcz4KQEAgLTMyMiw1MyArMzM0LDE0IEBACiAgICAgICA8cGx1Z2lucz4KICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8IS0tIG1vZGVsbG8gZ2VuZXJhdGUgamF2YSBzb3VyY2VzIHdpdGggZXJyb3JzIHNvIGRvIG5vdCBmYWlsIC0tPgotICAgICAgICAgICAgPGZhaWxPbkVycm9yPmZhbHNlPC9mYWlsT25FcnJvcj4KLSAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8cGx1Z2luPgotICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaXRlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4zLjkuMTwvdmVyc2lvbj4KLSAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgICAgPHRhZ0Jhc2U+aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbWF2ZW4vcGx1Z2luLXRvb2xzL3RhZ3M8L3RhZ0Jhc2U+CiAgICAgICAgICAgICA8YXV0b1ZlcnNpb25TdWJtb2R1bGVzPnRydWU8L2F1dG9WZXJzaW9uU3VibW9kdWxlcz4KICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8cGx1Z2luPgotICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBvbmVudC1tZXRhZGF0YTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4yLjEuMTwvdmVyc2lvbj4KLSAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICA8Z29hbD5nZW5lcmF0ZS1tZXRhZGF0YTwvZ29hbD4KLSAgICAgICAgICAgICAgICA8Z29hbD5nZW5lcmF0ZS10ZXN0LW1ldGFkYXRhPC9nb2FsPgotICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICA8L3BsdWdpbj4KICAgICAgIDwvcGx1Z2lucz4KICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbmZvcmNlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjMuMC4wLU0zPC92ZXJzaW9uPgotICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5leHRyYS1lbmZvcmNlci1ydWxlczwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMzwvdmVyc2lvbj4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgogICA8L2J1aWxkPgogCiAgIDxwcm9maWxlcz4KQEAgLTQzMCw3ICs0MDMsNiBAQAogICAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qeHItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+My4xLjE8L3ZlcnNpb24+CiAgICAgICAgICAgICA8cmVwb3J0U2V0cz4KICAgICAgICAgICAgICAgPHJlcG9ydFNldD4KICAgICAgICAgICAgICAgICA8aWQ+bm9uLWFnZ3JlZ2F0ZTwvaWQ+Cg==