ZGlmZiAtLWdpdCBhL2xpYi9qcy90ZXN0L3NyYy90ZXN0L1Rlc3RIYW5kbGVyLmphdmEgYi9saWIvanMvdGVzdC9zcmMvdGVzdC9UZXN0SGFuZGxlci5qYXZhCmluZGV4IDcyN2EzMmIuLmYyYzk0NGYgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L3NyYy90ZXN0L1Rlc3RIYW5kbGVyLmphdmEKKysrIGIvbGliL2pzL3Rlc3Qvc3JjL3Rlc3QvVGVzdEhhbmRsZXIuamF2YQpAQCAtNDgsNyArNDgsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oU3RyaW5nIGFyZykgdGhyb3dzIFhjZXB0aW9uLCBURXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFhjZXB0aW9uKDEsInNlcnZlciB0ZXN0IGV4Y2VwdGlvbiIpOyAgICAgICAKKyAgICAgICAgdGhyb3cgbmV3IFhjZXB0aW9uKDEsYXJnKTsgICAgICAgCiAgICAgfQogCiAgICAgcHVibGljIGludCB0ZXN0STMyKGludCB0aGluZykgdGhyb3dzIFRFeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvbGliL2pzL3Rlc3QvdGVzdC5odG1sIGIvbGliL2pzL3Rlc3QvdGVzdC5odG1sCmluZGV4IDBlMmVlNDIuLjcwOGRiNDEgMTAwNjQ0Ci0tLSBhL2xpYi9qcy90ZXN0L3Rlc3QuaHRtbAorKysgYi9saWIvanMvdGVzdC90ZXN0Lmh0bWwKQEAgLTEsOTUgKzEsMTQyIEBACi08IS0tCi0gIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGh0bWw+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+CiA8aGVhZD4KLSAgPHRpdGxlPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzIC0gRXhhbXBsZTwvdGl0bGU+CisgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorICA8dGl0bGU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M6IFVuaXQgVGVzdDwvdGl0bGU+CiAKLSAgPHNjcmlwdCBzcmM9Ii90aHJpZnQuanMiICAgICAgICAgICAgICAgICB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgotICA8c2NyaXB0IHNyYz0iZ2VuLWpzL1RocmlmdFRlc3RfdHlwZXMuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Ci0gIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKyAgPHNjcmlwdCBzcmM9Ii90aHJpZnQuanMiICAgICAgICAgICAgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdF90eXBlcy5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgc3JjPSJnZW4tanMvVGhyaWZ0VGVzdC5qcyIgICAgICAgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+PC9zY3JpcHQ+CiAKLSAgPCEtLSBmb3IgYXN5bmMgZXhhbXBsZSAtLT4KLSAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjMuMi9qcXVlcnkubWluLmpzIj48L3NjcmlwdD4KKyAgPCEtLSBqUXVlcnkgLS0+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Imh0dHA6Ly9hamF4Lmdvb2dsZWFwaXMuY29tL2FqYXgvbGlicy9qcXVlcnkvMS40LjIvanF1ZXJ5Lm1pbi5qcyIgY2hhcnNldD0idXRmLTgiPjwvc2NyaXB0PgorCisgIDwhLS0gUVVuaXQgVGVzdCBmcmFtZXdvcmstLT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cDovL2dpdGh1Yi5jb20vanF1ZXJ5L3F1bml0L3Jhdy9tYXN0ZXIvcXVuaXQvcXVuaXQuanMiIGNoYXJzZXQ9InV0Zi04Ij48L3NjcmlwdD4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJodHRwOi8vZ2l0aHViLmNvbS9qcXVlcnkvcXVuaXQvcmF3L21hc3Rlci9xdW5pdC9xdW5pdC5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgorCisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBjaGFyc2V0PSJ1dGYtOCI+CisgIC8vPCFbQ0RBVEFbCisgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CisgICAgdmFyIHRyYW5zcG9ydCA9IG5ldyBUaHJpZnQuVHJhbnNwb3J0KCIvc2VydmljZSIpCisgICAgdmFyIHByb3RvY29sICA9IG5ldyBUaHJpZnQuUHJvdG9jb2wodHJhbnNwb3J0KQorICAgIHZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKQorCisKKyAgICBtb2R1bGUoIkJhc2UgVHlwZXMiKTsKKworICAgIHRlc3QoIlN0cmluZyIsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWxzKGNsaWVudC50ZXN0U3RyaW5nKCJ3b3JrcyIpLCAid29ya3MiKTsKKyAgICB9KTsKKyAgICB0ZXN0KCJTdHJpbmcgVVRGLTgiLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciBsYW5ndWFnZXNVdGY4ID0gIkFmcmlrYWFucywgQWxlbWFubmlzY2gsIEFyYWdvbsOpcywg2KfZhNi52LHYqNmK2KksINmF2LXYsdmJLCBBc3R1cmlhbnUsIEF5bWFyIGFydSwgQXrJmXJiYXljYW4sINCR0LDRiNKh0L7RgNGCLCBCb2FyaXNjaCwgxb1lbWFpdMSXxaFrYSwg0JHQtdC70LDRgNGD0YHQutCw0Y8sINCR0LXQu9Cw0YDRg9GB0LrQsNGPICjRgtCw0YDQsNGI0LrQtdCy0ZbRhtCwKSwg0JHRitC70LPQsNGA0YHQutC4LCBCYW1hbmFua2FuLCDgpqzgpr7gpoLgprLgpr4sIEJyZXpob25lZywgQm9zYW5za2ksIENhdGFsw6AsIE3DrG5nLWTElcykbmctbmfhubPMhCwg0J3QvtGF0YfQuNC50L0sIENlYnVhbm8sIOGPo+GOs+GOqSwgxIxlc2t5LCDQodC70L7QstGjzIHQvdGM0YHQutGKIC8g4rCU4rCO4rCR4rCC4rCh4rCQ4rCg4rCU4rCN4rCfLCDQp9OR0LLQsNGI0LvQsCwgQ3ltcmFlZywgRGFuc2ssIFphemFraSwg3oveqN6I3qzegN6o3oTept6Q3rAsIM6VzrvOu863zr3Ouc66zqwsIEVtaWxpw6BuIGUgcnVtYWduw7JsLCBFbmdsaXNoLCBFc3BlcmFudG8sIEVzcGHDsW9sLCBFZXN0aSwgRXVza2FyYSwg2YHYp9ix2LPbjCwgU3VvbWksIFbDtXJvLCBGw7hyb3lza3QsIEZyYW7Dp2FpcywgQXJwZXRhbiwgRnVybGFuLCBGcnlzaywgR2FlaWxnZSwg6LSb6KqeLCBHw6BpZGhsaWcsIEdhbGVnbywgQXZhw7FlJ+G6vSwg4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuALCBHYWVsZywg16LXkdeo15nXqiwg4KS54KS/4KSo4KWN4KSm4KWALCBGaWppIEhpbmRpLCBIcnZhdHNraSwgS3JlecOybCBheWlzeWVuLCBNYWd5YXIsINWA1aHVtdWl1oDVpdW2LCBJbnRlcmxpbmd1YSwgQmFoYXNhIEluZG9uZXNpYSwgSWxva2FubywgSWRvLCDDjXNsZW5za2EsIEl0YWxpYW5vLCDml6XmnKzoqp4sIExvamJhbiwgQmFzYSBKYXdhLCDhg6Xhg5Dhg6Dhg5fhg6Phg5rhg5gsIEtvbmdvLCBLYWxhYWxsaXN1dCwg4LKV4LKo4LON4LKo4LKhLCDtlZzqta3slrQsINCa0YrQsNGA0LDRh9Cw0Lkt0JzQsNC70LrRitCw0YAsIFJpcG9hcmlzY2gsIEt1cmTDriwg0JrQvtC80LgsIEtlcm5ld2VrLCDQmtGL0YDQs9GL0LfRh9CwLCBMYXRpbmEsIExhZGlubywgTMOrdHplYnVlcmdlc2NoLCBMaW1idXJncywgTGluZ8OhbGEsIOC6peC6suC6pywgTGlldHV2acWzLCBMYXR2aWXFoXUsIEJhc2EgQmFueXVtYXNhbiwgTWFsYWdhc3ksINCc0LDQutC10LTQvtC90YHQutC4LCDgtK7gtLLgtK/gtL7gtLPgtIIsIOCkruCksOCkvuCkoOClgCwgQmFoYXNhIE1lbGF5dSwg2YXYp9iy2ZDYsdmI2YbbjCwgTm5hcHVsaXRhbm8sIE5lZGVyc2Frc2lzY2gsIOCkqOClh+CkquCkvuCksiDgpK3gpL7gpLfgpL4sIE5lZGVybGFuZHMsIOKAqk5vcnNrIChueW5vcnNrKeKArCwg4oCqTm9yc2sgKGJva23DpWwp4oCsLCBOb3Vvcm1hbmQsIERpbsOpIGJpemFhZCwgT2NjaXRhbiwg0JjRgNC+0L3QsNGDLCBQYXBpYW1lbnR1LCBEZWl0c2NoLCBOb3JmdWsgLyBQaXRrZXJuLCBQb2xza2ksINm+2YbYrNin2KjbjCwg2b7amtiq2YgsIFBvcnR1Z3XDqnMsIFJ1bmEgU2ltaSwgUnVtYW50c2NoLCBSb21hbmksIFJvbcOibsSDLCDQoNGD0YHRgdC60LjQuSwg0KHQsNGF0LAg0YLRi9C70LAsIFNhcmR1LCBTaWNpbGlhbnUsIFNjb3RzLCBTw6FtZWdpZWxsYSwgU2ltcGxlIEVuZ2xpc2gsIFNsb3ZlbsSNaW5hLCBTbG92ZW7FocSNaW5hLCDQodGA0L/RgdC60LggLyBTcnBza2ksIFNlZWx0ZXJzaywgU3ZlbnNrYSwgS2lzd2FoaWxpLCDgrqTgrq7grr/grrTgr40sIOCwpOCxhuCwsuCxgeCwl+CxgSwg0KLQvtK30LjQutOjLCDguYTguJfguKIsIFTDvHJrbWVuw6dlLCBUYWdhbG9nLCBUw7xya8OnZSwg0KLQsNGC0LDRgNGH0LAvVGF0YXLDp2EsINCj0LrRgNCw0ZfQvdGB0YzQutCwLCDYp9ix2K/ZiCwgVGnhur9uZyBWaeG7h3QsIFZvbGFww7xrLCBXYWxvbiwgV2luYXJheSwg5ZC06K+tLCBpc2lYaG9zYSwg15nXmda015PXmdepLCBZb3LDuWLDoSwgWmXDqnV3cywg5Lit5paHLCBCw6JuLWzDom0tZ8O6LCDnsrXoqp4iOworICAgICAgZXF1YWxzKGNsaWVudC50ZXN0U3RyaW5nKGxhbmd1YWdlc1V0ZjgpLCBsYW5ndWFnZXNVdGY4KTsKKyAgICB9KTsKKyAgICB0ZXN0KCJEb3VibGUiLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFscyhjbGllbnQudGVzdERvdWJsZSgzLjE0KSwgMy4xNCk7CisgICAgfSk7CisgICAgdGVzdCgiQnl0ZSIsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWxzKGNsaWVudC50ZXN0Qnl0ZSgweDAxKSwgMHgwMSk7CisgICAgfSk7CisgICAgdGVzdCgiSTMyIiwgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbHMoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwzMCkpLCBNYXRoLnBvdygyLDMwKSk7CisgICAgfSk7CisgICAgdGVzdCgiSTY0IiwgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbHMoY2xpZW50LnRlc3RJNjQoTWF0aC5wb3coMiw2MCkpLCBNYXRoLnBvdygyLDYwKSk7CisgICAgfSk7CisKKworICAgIG1vZHVsZSgiU3RydWN0dXJlZCBUeXBlcyIpOworCisgICAgdmFyIGluc2FuaXR5ICA9IG5ldyBUaHJpZnRUZXN0Lkluc2FuaXR5KCkKKyAgICBpbnNhbml0eS51c2VyTWFwW1RocmlmdFRlc3QuTnVtYmVyei5PTkVdID0gMQorICAgIGluc2FuaXR5LnVzZXJNYXBbVGhyaWZ0VGVzdC5OdW1iZXJ6LlRXT10gPSAyCisKKyAgICB2YXIgeHRyID0gbmV3IFRocmlmdFRlc3QuWHRydWN0KCkKKyAgICB4dHIuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCcKKyAgICBpbnNhbml0eS54dHJ1Y3RzLnB1c2goeHRyKQorCisgICAgdmFyIHh0cjI9IG5ldyBUaHJpZnRUZXN0Llh0cnVjdDIoKQorICAgIHh0cjIuc3RydWN0X3RoaW5nID0geHRyCisKKyAgICB2YXIgbGlzdCA9IFsxLDIsM10KKworICAgIHRlc3QoIlN0cnVjdCIsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWxzKGNsaWVudC50ZXN0U3RydWN0KHh0cikuc3RyaW5nX3RoaW5nLCAid29ya2VkIik7CisgICAgfSk7CisgICAgdGVzdCgiTmVzdCIsIGZ1bmN0aW9uKCkgeworICAgICAgZXF1YWxzKGNsaWVudC50ZXN0TmVzdCh4dHIyKS5zdHJ1Y3RfdGhpbmcuc3RyaW5nX3RoaW5nLCAid29ya2VkIik7CisgICAgfSk7CisgICAgdGVzdCgiTWFwIiwgZnVuY3Rpb24oKSB7CisgICAgICBlcXVhbHMoY2xpZW50LnRlc3RNYXAoaW5zYW5pdHkudXNlck1hcClbVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORV0sIDEpOworICAgIH0pOworICAgIHRlc3QoIkxpc3QiLCBmdW5jdGlvbigpIHsKKyAgICAgIHNhbWUoY2xpZW50LnRlc3RMaXN0KGxpc3QpLCBsaXN0KTsKKyAgICB9KTsKKyAgICB0ZXN0KCJTZXQiLCBmdW5jdGlvbigpIHsKKyAgICAgIHNhbWUoY2xpZW50LnRlc3RTZXQobGlzdCksIGxpc3QpOworICAgIH0pOworICAgIHRlc3QoIkVudW0iLCBmdW5jdGlvbigpIHsKKyAgICAgIGVxdWFscyhjbGllbnQudGVzdEVudW0oVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORSksIFRocmlmdFRlc3QuTnVtYmVyei5PTkUpOworICAgIH0pOworCisKKyAgICBtb2R1bGUoIkV4Y2VwdGlvbiIpOworCisgICAgdGVzdCgiWGNlcHRpb24iLCBmdW5jdGlvbigpIHsKKyAgICAgIGV4cGVjdCgyKTsKKyAgICAgIHRyeXsKKyAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIlhjZXB0aW9uIik7CisgICAgICB9Y2F0Y2goZSl7CisgICAgICAgIGVxdWFscyhlLmVycm9yQ29kZSwgMSk7CisgICAgICAgIGVxdWFscyhlLm1lc3NhZ2UsICJYY2VwdGlvbiIpOworICAgICAgfQorICAgIH0pOworCisgICAgdGVzdCgiQXBwbGljYXRpb25FeGNlcHRpb24iLCBmdW5jdGlvbigpIHsKKyAgICAgIGV4cGVjdCgxKTsKKyAgICAgIHRyeXsKKyAgICAgICAgY2xpZW50LnRlc3RFeGNlcHRpb24oIkFwcGxpY2F0aW9uRXhjZXB0aW9uIik7CisgICAgICB9Y2F0Y2goZSl7CisgICAgICAgIGVxdWFscyhlLm1lc3NhZ2UsICJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpOworICAgICAgfQorICAgIH0pOworCisgICAgdGVzdCgibm8gRXhjZXB0aW9uIiwgZnVuY3Rpb24oKSB7CisgICAgICBleHBlY3QoMSk7CisgICAgICB0cnl7CisgICAgICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJubyBFeGNlcHRpb24iKTsKKyAgICAgIH1jYXRjaChlKXsKKyAgICAgICAgZXF1YWxzKGUubWVzc2FnZSwgIm5vIEV4Y2VwdGlvbiIpOworICAgICAgfQorICAgIH0pOworCisKKyAgICBtb2R1bGUoIkluc2FuaXR5Iik7CisKKyAgICB0ZXN0KCJ0ZXN0SW5zYW5pdHkiLCBmdW5jdGlvbigpIHsKKyAgICAgIHZhciByZXMgPSBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuaXR5KTsKKyAgICAgIGVxdWFscyhyZXNbIjEiXVsiMSJdLnh0cnVjdHNbMF0uc3RyaW5nX3RoaW5nLCAid29ya2VkIik7CisgICAgfSk7CisKKyAgfSk7CisgIC8vXV0+CisgIDwvc2NyaXB0PgogCiA8L2hlYWQ+Ci08Ym9keSBpZD0iYm9keSI+Cis8Ym9keT4KIAotPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+Ci0KLSAgLy9jcmVhdGUgY2xpZW50Ci0gIHZhciB0cmFuc3BvcnQgPSBuZXcgVGhyaWZ0LlRyYW5zcG9ydCgiL3NlcnZpY2UiKQotICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpCi0gIHZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKQotCi0gIC8vY3JlYXRlIGluc2FuaXR5IG9iagotICB2YXIgaW5zYW5pdHkgID0gbmV3IFRocmlmdFRlc3QuSW5zYW5pdHkoKQotICBpbnNhbml0eS51c2VyTWFwW1RocmlmdFRlc3QuTnVtYmVyei5PTkVdID0gMQotICBpbnNhbml0eS51c2VyTWFwW1RocmlmdFRlc3QuTnVtYmVyei5UV09dID0gMgotCi0gIHZhciB4dHIgPSBuZXcgVGhyaWZ0VGVzdC5YdHJ1Y3QoKQotICB4dHIuc3RyaW5nX3RoaW5nID0gJ3dvcmtlZCcKLSAgaW5zYW5pdHkueHRydWN0cy5wdXNoKHh0cikKLQotICB2YXIgeHRyMj0gbmV3IFRocmlmdFRlc3QuWHRydWN0MigpCi0gIHh0cjIuc3RydWN0X3RoaW5nID0geHRyCi0KLSAgdmFyIGxpc3QgPSBbMSwyLDNdCi0KLSAgLy9ydW4gdGVzdHMgc3luY2hyb25vdXNseQotCi0gIGRvY3VtZW50LndyaXRlKCI8aDI+PHU+VGhyaWZ0IEphdmFzY3JpcHQgQmluZGluZ3M8L3U+PC9oMj4iKQotICBkb2N1bWVudC53cml0ZSgiPGgyPlN5bmNocm9ub3VzIEV4YW1wbGU8L2gyPiIpCi0gIGRvY3VtZW50LndyaXRlKCJjbGllbnQudGVzdFN0cmluZygpID0+ICIrKGNsaWVudC50ZXN0U3RyaW5nKCJ3b3JrcyIpICAgICA9PSAid29ya3MiKSsiPGJyLz4iKQotICBkb2N1bWVudC53cml0ZSgiY2xpZW50LnRlc3RTdHJpbmcodXRmLTgpID0+ICIrKGNsaWVudC50ZXN0U3RyaW5nKCJhh46Sl5xlIikgICA9PSAiYYeOkpecZSIpKyI8YnIvPiIpCi0gIGRvY3VtZW50LndyaXRlKCJjbGllbnQudGVzdERvdWJsZSgpID0+ICIrKGNsaWVudC50ZXN0RG91YmxlKDMuMTQpICAgICAgICA9PSAzLjE0KSsiPGJyLz4iKQotICBkb2N1bWVudC53cml0ZSgiY2xpZW50LnRlc3RCeXRlKCkgICA9PiAiKyhjbGllbnQudGVzdEJ5dGUoMHgwMSkgICAgICAgICAgPT0gMHgwMSkrIjxici8+IikKLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0STMyKCkgICAgPT4gIisoY2xpZW50LnRlc3RJMzIoTWF0aC5wb3coMiwzMCkpID09IE1hdGgucG93KDIsMzApKSsiPGJyLz4iKQotICBkb2N1bWVudC53cml0ZSgiY2xpZW50LnRlc3RJNjQoKSAgICA9PiAiKyhjbGllbnQudGVzdEk2NChNYXRoLnBvdygyLDYwKSkgPT0gTWF0aC5wb3coMiw2MCkpKyI8YnIvPiIpCi0gIGRvY3VtZW50LndyaXRlKCJjbGllbnQudGVzdFN0cnVjdCgpID0+ICIrKGNsaWVudC50ZXN0U3RydWN0KHh0cikuc3RyaW5nX3RoaW5nID09ICJ3b3JrZWQiKSsiPGJyLz4iKQotICBkb2N1bWVudC53cml0ZSgiY2xpZW50LnRlc3ROZXN0KCkgICA9PiAiKyhjbGllbnQudGVzdE5lc3QoeHRyMikuc3RydWN0X3RoaW5nLnN0cmluZ190aGluZyA9PSAid29ya2VkIikrIjxici8+IikKLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0TWFwKCkgICAgPT4gIisoY2xpZW50LnRlc3RNYXAoaW5zYW5pdHkudXNlck1hcClbVGhyaWZ0VGVzdC5OdW1iZXJ6Lk9ORV0gPT0gMSkrIjxici8+IikKLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0TGlzdCgpICAgPT4gIisoY2xpZW50LnRlc3RMaXN0KGxpc3QpLmxlbmd0aCA9PSAzICYmIGNsaWVudC50ZXN0TGlzdChsaXN0KVsxXSA9PSAyKSsiPGJyLz4iKQotICBkb2N1bWVudC53cml0ZSgiY2xpZW50LnRlc3RTZXQoKSAgICA9PiAiKyhjbGllbnQudGVzdFNldChsaXN0KS5sZW5ndGggPT0gMykrIjxici8+IikKLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0RW51bSgpICAgPT4gIisoY2xpZW50LnRlc3RFbnVtKFRocmlmdFRlc3QuTnVtYmVyei5PTkUpID09IFRocmlmdFRlc3QuTnVtYmVyei5PTkUpKyI8YnIvPiIpCi0KLSAgZG9jdW1lbnQud3JpdGUoImNsaWVudC50ZXN0RXhjZXB0aW9uKCkgPT4gIikKLSAgdHJ5ewotICAgIGNsaWVudC50ZXN0RXhjZXB0aW9uKCJnbyIpCi0gICAgZG9jdW1lbnQud3JpdGUoImZhbHNlPGJyLz4iKQotICB9Y2F0Y2goZSl7Ci0gICAgZG9jdW1lbnQud3JpdGUoInRydWU8YnIvPiIpCi0gIH0KLQotICBkb2N1bWVudC53cml0ZSgiY2xpZW50LnRlc3RJbnNhbml0eSgpID0+ICIpCi0gIHZhciByZXMgPSBjbGllbnQudGVzdEluc2FuaXR5KGluc2FuaXR5KQotCi0gIGRvY3VtZW50LndyaXRlKChyZXNbIjEiXVsiMSJdLnh0cnVjdHNbMF0uc3RyaW5nX3RoaW5nID09ICJ3b3JrZWQiKSsiPGJyLz4iKQorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgY2hhcnNldD0idXRmLTgiPgorICAvLzwhW0NEQVRBWwogCiAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgLy9SdW4gc2FtZSB0ZXN0cyBhc3luY2hyb25vdXNseQotCisvKgogICB2YXIgdHJhbnNwb3J0ID0gbmV3IFRocmlmdC5UcmFuc3BvcnQoKQogICB2YXIgcHJvdG9jb2wgID0gbmV3IFRocmlmdC5Qcm90b2NvbCh0cmFuc3BvcnQpCiAgIHZhciBjbGllbnQgICAgPSBuZXcgVGhyaWZ0VGVzdC5UaHJpZnRUZXN0Q2xpZW50KHByb3RvY29sKQogCi0gIGRvY3VtZW50LndyaXRlKCI8aDI+QXN5bmNocm9ub3VzIEV4YW1wbGU8L2gyPiIpCisgIGRvY3VtZW50LndyaXRlKCI8aDI+QXN5bmNocm9ub3VzIEV4YW1wbGU8XC9oMj4iKQogICBqUXVlcnkuYWpheCh7CiAgICAgIHVybDogIi9zZXJ2aWNlIiwKICAgICAgZGF0YTogY2xpZW50LnNlbmRfdGVzdEkzMihNYXRoLnBvdygyLDMwKSksCkBAIC0xMjUsMTAgKzE3MiwxOCBAQAogCiAgICAgIH0KICAgfSkKKyovCiAKLQotCi08L3NjcmlwdD4KLQorICAvL11dPgorICA8L3NjcmlwdD4KKyAgPGgxIGlkPSJxdW5pdC1oZWFkZXIiPlRocmlmdCBKYXZhc2NyaXB0IEJpbmRpbmdzOiBVbml0IFRlc3QgKDxhIGhyZWY9Imh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2luY3ViYXRvci90aHJpZnQvdHJ1bmsvdGVzdC9UaHJpZnRUZXN0LnRocmlmdCI+VGhyaWZ0VGVzdC50aHJpZnQ8L2E+KTwvaDE+CisgIDxoMiBpZD0icXVuaXQtYmFubmVyIj48L2gyPgorICA8aDIgaWQ9InF1bml0LXVzZXJBZ2VudCI+PC9oMj4KKyAgPG9sIGlkPSJxdW5pdC10ZXN0cyI+PGxpPjwhLS0gZ2V0IHZhbGlkIHhodG1sIHN0cmljdC0tPjwvbGk+PC9vbD4KKyAgPHA+CisgICAgICA8YSBocmVmPSJodHRwOi8vdmFsaWRhdG9yLnczLm9yZy9jaGVjay9yZWZlcmVyIj48aW1nCisgICAgICAgICAgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9JY29ucy92YWxpZC14aHRtbDEwIgorICAgICAgICAgIGFsdD0iVmFsaWQgWEhUTUwgMS4wISIgaGVpZ2h0PSIzMSIgd2lkdGg9Ijg4IiAvPjwvYT4KKyAgPC9wPgogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL2pzL3RocmlmdC5qcyBiL2xpYi9qcy90aHJpZnQuanMKaW5kZXggNWU5Yzg5ZS4uMDRhMzRkMSAxMDA2NDQKLS0tIGEvbGliL2pzL3RocmlmdC5qcworKysgYi9saWIvanMvdGhyaWZ0LmpzCkBAIC01NCw3ICs1NCw3IEBACiB9CiAKIAotVGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbiA9IHsKK1RocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb25UeXBlID0gewogICAgICJVTktOT1dOIiAgICAgICAgICAgICAgOiAwLAogICAgICJVTktOT1dOX01FVEhPRCIgICAgICAgOiAxLAogICAgICJJTlZBTElEX01FU1NBR0VfVFlQRSIgOiAyLApAQCAtNDAxLDcgKzQwMSw5IEBACiAgICAgICAgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpCiAKICAgICAgICAgd2hpbGUoIHRoaXMudHN0YWNrLmxlbmd0aCA+IHArMSApewotICAgICAgICAgICAgdGhpcy50c3RhY2tbcF0ucHVzaCh0aGlzLnRzdGFjay5wb3AoKSkKKyAgICAgICAgICAgIHZhciB0bXBWYWwgPSB0aGlzLnRzdGFja1twKzFdCisgICAgICAgICAgICB0aGlzLnRzdGFjay5zcGxpY2UocCsxLCAxKQorICAgICAgICAgICAgdGhpcy50c3RhY2tbcF0ucHVzaCh0bXBWYWwpCiAgICAgICAgIH0KIAogICAgICAgICB0aGlzLnRzdGFja1twXSA9ICdbJyt0aGlzLnRzdGFja1twXS5qb2luKCIsIikrJ10nOwpAQCAtNDE2LDcgKzQxOCw5IEBACiAgICAgICAgIHZhciBwID0gdGhpcy50cG9zLnBvcCgpCiAKICAgICAgICAgd2hpbGUoIHRoaXMudHN0YWNrLmxlbmd0aCA+IHArMSApewotICAgICAgICAgICAgdGhpcy50c3RhY2tbcF0ucHVzaCh0aGlzLnRzdGFjay5wb3AoKSkKKyAgICAgICAgICAgIHZhciB0bXBWYWwgPSB0aGlzLnRzdGFja1twKzFdCisgICAgICAgICAgICB0aGlzLnRzdGFjay5zcGxpY2UocCsxLCAxKQorICAgICAgICAgICAgdGhpcy50c3RhY2tbcF0ucHVzaCh0bXBWYWwpCiAgICAgICAgIH0KIAogICAgICAgICB0aGlzLnRzdGFja1twXSA9ICdbJyt0aGlzLnRzdGFja1twXS5qb2luKCIsIikrJ10nOwpAQCAtNDg2LDEzICs0OTAsMTkgQEAKICAgICB9LAogCiAgICAgcmVhZFN0cnVjdEJlZ2luIDogZnVuY3Rpb24obmFtZSl7Ci0gICAgICAgIHZhciByID0ge307Ci0gICAgICAgIHJbImZuYW1lIl0gPSAnJzsKLSAgICAgICAgICAgICAKLSAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIHZhciByID0ge30KKyAgICAgICAgclsiZm5hbWUiXSA9ICcnCisgICAgICAgIAorICAgICAgICAvL2luY2FzZSB0aGlzIGlzIGFuIGFycmF5IG9mIHN0cnVjdHMKKyAgICAgICAgaWYodGhpcy5yc3RhY2tbdGhpcy5yc3RhY2subGVuZ3RoLTFdIGluc3RhbmNlb2YgQXJyYXkpCisgICAgICAgICAgICB0aGlzLnJzdGFjay5wdXNoKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aC0xXS5zaGlmdCgpKQorICAgICAKKyAgICAgICAgcmV0dXJuIHIKICAgICB9LAogCiAgICAgcmVhZFN0cnVjdEVuZCA6IGZ1bmN0aW9uKCl7CisgICAgICAgIGlmKHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aC0yXSBpbnN0YW5jZW9mIEFycmF5KQorICAgICAgICAgICAgdGhpcy5yc3RhY2sucG9wKCkKICAgICB9LAogCiAgICAgcmVhZEZpZWxkQmVnaW4gOiBmdW5jdGlvbigpewpAQCAtNTc4LDggKzU4OCw3IEBACiAgICAgICAgIAogICAgICAgICB0aGlzLnJwb3MucHVzaCh0aGlzLnJzdGFjay5sZW5ndGgpOwogICAgICAgICB0aGlzLnJzdGFjay5wdXNoKGxpc3QpCi0gICAgICAgIAotICAgICAgICAKKyAgICAgICAgICAgICAKICAgICAgICAgcmV0dXJuIHI7CiAgICAgfSwKIApAQCAtNjE2LDE5ICs2MjUsMjQgQEAKICAgICB9LAogICAgCiAKLSAgICByZWFkSTMyIDogZnVuY3Rpb24oKXsKLSAgICAgICAgdmFyIGYgPSB0aGlzLnJzdGFja1t0aGlzLnJzdGFjay5sZW5ndGgtMV0KKyAgICByZWFkSTMyIDogZnVuY3Rpb24oZil7CisgICAgICAgIGlmKGYgPT0gdW5kZWZpbmVkKQorICAgICAgICAgICAgZiA9IHRoaXMucnN0YWNrW3RoaXMucnN0YWNrLmxlbmd0aC0xXQorICAgICAgICAKICAgICAgICAgdmFyIHIgPSB7fSAgICAKICAgICAgICAgICAgIAogICAgICAgICBpZihmIGluc3RhbmNlb2YgQXJyYXkpewotICAgICAgICAgICAgclsidmFsdWUiXSA9IGYucG9wKCkKLSAgICAgICAgCisgICAgICAgICAgICBpZihmLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgICAgIHJbInZhbHVlIl0gPSB1bmRlZmluZWQKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByWyJ2YWx1ZSJdID0gZi5zaGlmdCgpCisKICAgICAgICAgfWVsc2UgaWYoZiBpbnN0YW5jZW9mIE9iamVjdCl7CiAgICAgICAgICAgIGZvcih2YXIgaSBpbiBmKXsKICAgICAgICAgICAgICAgICBpZihpID09IG51bGwpIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgdGhpcy5yc3RhY2sucHVzaChmW2ldKQogICAgICAgICAgICAgICAgIGRlbGV0ZSBmW2ldICAKLSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICByWyJ2YWx1ZSJdID0gaQogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIH0KQEAgLTYzNiw3ICs2NTAsNiBAQAogICAgICAgICAgICAgclsidmFsdWUiXSA9IGYKICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgCiAgICAgICAgIHJldHVybiByCiAgICAgfSwKIAo=