ZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weQppbmRleCA2MWVkYzZjLi5mMjA4NDhmIDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5CkBAIC0xMzksMzIgKzEzOSwzMiBAQAogICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAKICAgICBkZWYgQ2hlY2tVbmljb2RlKHNlbGYpOgotICAgICAgICBhdXN0cmlhID0gc3RyKCLWc3RlcnJlaWNoIiwgImxhdGluMSIpCisgICAgICAgIGF1c3RyaWEgPSAi1nN0ZXJyZWljaCIKICAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYSwpKS5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKHJvd1swXSkgPT0gc3RyLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSB1bmljb2RlIikKIAogICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKLSAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3RyCi0gICAgICAgIGF1c3RyaWEgPSBzdHIoItZzdGVycmVpY2giLCAibGF0aW4xIikKKyAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gYnl0ZXMKKyAgICAgICAgYXVzdHJpYSA9ICLWc3RlcnJlaWNoIgogICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChhdXN0cmlhLCkpLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUocm93WzBdKSA9PSBzdHIsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIHN0ciIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKHJvd1swXSkgPT0gYnl0ZXMsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIGJ5dGVzIikKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJvd1swXSA9PSBhdXN0cmlhLmVuY29kZSgidXRmLTgiKSwgImNvbHVtbiBtdXN0IGVxdWFsIG9yaWdpbmFsIGRhdGEgaW4gVVRGLTgiKQogCiAgICAgZGVmIENoZWNrQ3VzdG9tKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBsYW1iZGEgeDogc3RyKHgsICJ1dGYtOCIsICJpZ25vcmUiKQotICAgICAgICBhdXN0cmlhID0gc3RyKCLWc3RlcnJlaWNoIiwgImxhdGluMSIpCi0gICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEuZW5jb2RlKCJsYXRpbjEiKSwpKS5mZXRjaG9uZSgpCisgICAgICAgIGF1c3RyaWEgPSAi1nN0ZXJyZWljaCIKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYSwpKS5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKHJvd1swXSkgPT0gc3RyLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSB1bmljb2RlIikKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJvd1swXS5lbmRzd2l0aCgicmVpY2giKSwgImNvbHVtbiBtdXN0IGNvbnRhaW4gb3JpZ2luYWwgZGF0YSIpCiAKICAgICBkZWYgQ2hlY2tPcHRpbWl6ZWRVbmljb2RlKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBzcWxpdGUuT3B0aW1pemVkVW5pY29kZQotICAgICAgICBhdXN0cmlhID0gc3RyKCLWc3RlcnJlaWNoIiwgImxhdGluMSIpCi0gICAgICAgIGdlcm1hbnkgPSBzdHIoIkRldXRjaGxhbmQiKQorICAgICAgICBhdXN0cmlhID0gItZzdGVycmVpY2giCisgICAgICAgIGdlcm1hbnkgPSAiRGV1dGNobGFuZCIKICAgICAgICAgYV9yb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChhdXN0cmlhLCkpLmZldGNob25lKCkKICAgICAgICAgZF9yb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChnZXJtYW55LCkpLmZldGNob25lKCkKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoYV9yb3dbMF0pID09IHN0ciwgInR5cGUgb2Ygbm9uLUFTQ0lJIHJvdyBtdXN0IGJlIHVuaWNvZGUiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShkX3Jvd1swXSkgPT0gc3RyLCAidHlwZSBvZiBBU0NJSS1vbmx5IHJvdyBtdXN0IGJlIHN0ciIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKGRfcm93WzBdKSA9PSBzdHI4LCAidHlwZSBvZiBBU0NJSS1vbmx5IHJvdyBtdXN0IGJlIHN0cjgiKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weQppbmRleCAyMzJhMzJjLi4yMGYwMDkzIDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvdHlwZXMucHkKQEAgLTYyLDcgKzYyLDcgQEAKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCB2YWwpCiAKICAgICBkZWYgQ2hlY2tCbG9iKHNlbGYpOgotICAgICAgICB2YWwgPSBidWZmZXIoIkd1Z2xodXBmIikKKyAgICAgICAgdmFsID0gYnVmZmVyKGIiR3VnbGh1cGYiKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGIpIHZhbHVlcyAoPykiLCAodmFsLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBiIGZyb20gdGVzdCIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKQEAgLTIwMyw3ICsyMDMsNyBAQAogCiAgICAgZGVmIENoZWNrQmxvYihzZWxmKToKICAgICAgICAgIyBkZWZhdWx0Ci0gICAgICAgIHZhbCA9IGJ1ZmZlcigiR3VnbGh1cGYiKQorICAgICAgICB2YWwgPSBidWZmZXIoYiJHdWdsaHVwZiIpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYmluKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYmluIGZyb20gdGVzdCIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKQEAgLTMwNCw3ICszMDQsNyBAQAogICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCiAKICAgICBkZWYgQ2hlY2tCaW5hcnlJbnB1dEZvckNvbnZlcnRlcihzZWxmKToKLSAgICAgICAgdGVzdGRhdGEgPSAiYWJjZGVmZyIgKiAxMAorICAgICAgICB0ZXN0ZGF0YSA9IGIiYWJjZGVmZyIgKiAxMAogICAgICAgICByZXN1bHQgPSBzZWxmLmNvbi5leGVjdXRlKCdzZWxlY3QgPyBhcyAieCBbYmluXSInLCAoYnVmZmVyKGJ6Mi5jb21wcmVzcyh0ZXN0ZGF0YSkpLCkpLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodGVzdGRhdGEsIHJlc3VsdCkKIApkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5CmluZGV4IGEyZjI1NzQuLmJjOGU2ZDIgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHkKQEAgLTM2LDcgKzM2LDcgQEAKIGRlZiBmdW5jX3JldHVybm51bGwoKToKICAgICByZXR1cm4gTm9uZQogZGVmIGZ1bmNfcmV0dXJuYmxvYigpOgotICAgIHJldHVybiBidWZmZXIoImJsb2IiKQorICAgIHJldHVybiBidWZmZXIoYiJibG9iIikKIGRlZiBmdW5jX3JhaXNlZXhjZXB0aW9uKCk6CiAgICAgNS8wCiAKQEAgLTE5Nyw3ICsxOTcsNyBAQAogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmJsb2IoKSIpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgYnVmZmVyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIGJ1ZmZlcigiYmxvYiIpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIGJ1ZmZlcihiImJsb2IiKSkKIAogICAgIGRlZiBDaGVja0Z1bmNFeGNlcHRpb24oc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYwppbmRleCBhZGQyZTZmLi40MWI5NGFhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKQEAgLTQzNSwxMCArNDM1LDggQEAKICAgICB9IGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKHB5X3ZhbCkpIHsKICAgICAgICAgc3FsaXRlM19yZXN1bHRfdGV4dChjb250ZXh0LCBQeVN0cmluZ19Bc1N0cmluZyhweV92YWwpLCAtMSwgU1FMSVRFX1RSQU5TSUVOVCk7CiAgICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2socHlfdmFsKSkgewotICAgICAgICBzdHJpbmd2YWwgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHB5X3ZhbCk7CiAgICAgICAgIGlmIChzdHJpbmd2YWwpIHsKLSAgICAgICAgICAgIHNxbGl0ZTNfcmVzdWx0X3RleHQoY29udGV4dCwgUHlTdHJpbmdfQXNTdHJpbmcoc3RyaW5ndmFsKSwgLTEsIFNRTElURV9UUkFOU0lFTlQpOwotICAgICAgICAgICAgUHlfREVDUkVGKHN0cmluZ3ZhbCk7CisgICAgICAgICAgICBzcWxpdGUzX3Jlc3VsdF90ZXh0KGNvbnRleHQsIFB5VW5pY29kZV9Bc1N0cmluZyhzdHJpbmd2YWwpLCAtMSwgU1FMSVRFX1RSQU5TSUVOVCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvKiBUT0RPOiByYWlzZSBlcnJvciAqLwpAQCAtMTA5NCw3ICsxMDkyLDcgQEAKICAgICAgICAgZ290byBmaW5hbGx5OwogICAgIH0KIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyFPOmNyZWF0ZV9jb2xsYXRpb24obmFtZSwgY2FsbGJhY2spIiwgJlB5U3RyaW5nX1R5cGUsICZuYW1lLCAmY2FsbGFibGUpKSB7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIU86Y3JlYXRlX2NvbGxhdGlvbihuYW1lLCBjYWxsYmFjaykiLCAmUHlVbmljb2RlX1R5cGUsICZuYW1lLCAmY2FsbGFibGUpKSB7CiAgICAgICAgIGdvdG8gZmluYWxseTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYyBiL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYwppbmRleCAwNTVlNTQ0Li40MTJlMzg2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCkBAIC0yNDgsNyArMjQ4LDcgQEAKICAgICAgICAgICAgIGlmICgoKnBvcyA9PSAnWycpICYmIChwb3MgPiBjb2xuYW1lKSAmJiAoKihwb3MtMSkgPT0gJyAnKSkgewogICAgICAgICAgICAgICAgIHBvcy0tOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNvbG5hbWUsIHBvcyAtIGNvbG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZShjb2xuYW1lLCBwb3MgLSBjb2xuYW1lKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTM3Miw4ICszNzIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZi0+Y29ubmVjdGlvbi0+dGV4dF9mYWN0b3J5ID09IChQeU9iamVjdCopJlB5U3RyaW5nX1R5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlTdHJpbmdfRnJvbVN0cmluZyh2YWxfc3RyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYtPmNvbm5lY3Rpb24tPnRleHRfZmFjdG9yeSA9PSAoUHlPYmplY3QqKSZQeUJ5dGVzX1R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSh2YWxfc3RyLCBzdHJsZW4odmFsX3N0cikpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnksICJzIiwgdmFsX3N0cik7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5jb25uZWN0aW9uLT50ZXh0X2ZhY3RvcnksICJ5IiwgdmFsX3N0cik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvKiBjb2x0eXBlID09IFNRTElURV9CTE9CICovCkBAIC03NDYsMTcgKzc0OCwxMyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc2NyaXB0X29iaikpIHsKLSAgICAgICAgc2NyaXB0X2NzdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhzY3JpcHRfb2JqKTsKLSAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzY3JpcHRfb2JqKSkgewotICAgICAgICBzY3JpcHRfc3RyID0gUHlVbmljb2RlX0FzVVRGOFN0cmluZyhzY3JpcHRfb2JqKTsKLSAgICAgICAgaWYgKCFzY3JpcHRfc3RyKSB7CisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhzY3JpcHRfb2JqKSkgeworICAgICAgICBzY3JpcHRfY3N0ciA9IFB5VW5pY29kZV9Bc1N0cmluZyhzY3JpcHRfb2JqKTsKKyAgICAgICAgaWYgKCFzY3JpcHRfY3N0cikgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLQotICAgICAgICBzY3JpcHRfY3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHNjcmlwdF9zdHIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2NyaXB0IGFyZ3VtZW50IG11c3QgYmUgdW5pY29kZSBvciBzdHJpbmcuIik7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAic2NyaXB0IGFyZ3VtZW50IG11c3QgYmUgdW5pY29kZS4iKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvcm93LmMgYi9Nb2R1bGVzL19zcWxpdGUvcm93LmMKaW5kZXggNmJkMTg4Ny4uYjJmMTA1YSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL3Jvdy5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9yb3cuYwpAQCAtODYsOCArODYsOCBAQAogICAgICAgICBpdGVtID0gUHlUdXBsZV9HZXRJdGVtKHNlbGYtPmRhdGEsIF9pZHgpOwogICAgICAgICBQeV9YSU5DUkVGKGl0ZW0pOwogICAgICAgICByZXR1cm4gaXRlbTsKLSAgICB9IGVsc2UgaWYgKFB5U3RyaW5nX0NoZWNrKGlkeCkpIHsKLSAgICAgICAga2V5ID0gUHlTdHJpbmdfQXNTdHJpbmcoaWR4KTsKKyAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhpZHgpKSB7CisgICAgICAgIGtleSA9IFB5VW5pY29kZV9Bc1N0cmluZyhpZHgpOwogCiAgICAgICAgIG5pdGVtcyA9IFB5VHVwbGVfU2l6ZShzZWxmLT5kZXNjcmlwdGlvbik7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuYyBiL01vZHVsZXMvX3NxbGl0ZS9zdGF0ZW1lbnQuYwppbmRleCA1OTg3YjJhLi5iODBiOTU1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvc3RhdGVtZW50LmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL3N0YXRlbWVudC5jCkBAIC0xMTMsNyArMTEzLDggQEAKICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfdGV4dChzZWxmLT5zdCwgcG9zLCBzdHJpbmcsIC0xLCBTUUxJVEVfVFJBTlNJRU5UKTsKICAgICB9IGVsc2UgaWYgUHlVbmljb2RlX0NoZWNrKHBhcmFtZXRlcikgewogICAgICAgICBzdHJpbmd2YWwgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHBhcmFtZXRlcik7Ci0gICAgICAgIHN0cmluZyA9IFB5U3RyaW5nX0FzU3RyaW5nKHN0cmluZ3ZhbCk7CisgICAgICAgIHN0cmluZyA9IFB5Qnl0ZXNfQXNTdHJpbmcoc3RyaW5ndmFsKTsKKwogICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF90ZXh0KHNlbGYtPnN0LCBwb3MsIHN0cmluZywgLTEsIFNRTElURV9UUkFOU0lFTlQpOwogICAgICAgICBQeV9ERUNSRUYoc3RyaW5ndmFsKTsKICAgICB9IGVsc2Ugewo=