ZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC9fX2luaXRfXy5weSBiL0xpYi9jdHlwZXMvdGVzdC9fX2luaXRfXy5weQppbmRleCA4MDhlNDE4Li5mMmNjMTQzIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvX19pbml0X18ucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L19faW5pdF9fLnB5CkBAIC0yLDcgKzIsMTUgQEAKIAogdXNlX3Jlc291cmNlcyA9IFtdCiAKLWNsYXNzIFJlc291cmNlRGVuaWVkKEV4Y2VwdGlvbik6CitpbXBvcnQgY3R5cGVzCitjdHlwZXNfc3ltYm9scyA9IGRpcihjdHlwZXMpCisKK2RlZiBuZWVkX3N5bWJvbChuYW1lKToKKyAgICByZXR1cm4gdW5pdHRlc3Quc2tpcFVubGVzcyhuYW1lIGluIGN0eXBlc19zeW1ib2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7IXJ9IGlzIHJlcXVpcmVkJy5mb3JtYXQobmFtZSkpCisKKworY2xhc3MgUmVzb3VyY2VEZW5pZWQodW5pdHRlc3QuU2tpcFRlc3QpOgogICAgICIiIlRlc3Qgc2tpcHBlZCBiZWNhdXNlIGl0IHJlcXVlc3RlZCBhIGRpc2FsbG93ZWQgcmVzb3VyY2UuCiAKICAgICBUaGlzIGlzIHJhaXNlZCB3aGVuIGEgdGVzdCBjYWxscyByZXF1aXJlcygpIGZvciBhIHJlc291cmNlIHRoYXQKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2FycmF5cy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2FycmF5cy5weQppbmRleCBkYjQ5YzBjLi40N2U5NWVlIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9hcnJheXMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5CkBAIC0xLDYgKzEsOCBAQAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGN0eXBlcyBpbXBvcnQgKgogCitmcm9tIGN0eXBlcy50ZXN0IGltcG9ydCBuZWVkX3N5bWJvbAorCiBmb3JtYXRzID0gImJCaEhpSWxMcVFmZCIKIAogZm9ybWF0cyA9IGNfYnl0ZSwgY191Ynl0ZSwgY19zaG9ydCwgY191c2hvcnQsIGNfaW50LCBjX3VpbnQsIFwKQEAgLTEwMSwyMCArMTAzLDE2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbMTo0OjJdLCAibyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3oudmFsdWUsICJmb28iKQogCi0gICAgdHJ5OgotICAgICAgICBjcmVhdGVfdW5pY29kZV9idWZmZXIKLSAgICBleGNlcHQgTmFtZUVycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgZGVmIHRlc3RfZnJvbV9hZGRyZXNzVyhzZWxmKToKLSAgICAgICAgICAgIHAgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoImZvbyIpCi0gICAgICAgICAgICBzeiA9IChjX3djaGFyICogMykuZnJvbV9hZGRyZXNzKGFkZHJlc3NvZihwKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbOl0sICJmb28iKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6Ol0sICJmb28iKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6Oi0xXSwgIm9vZiIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6Wzo6M10sICJmIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbMTo0OjJdLCAibyIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6LnZhbHVlLCAiZm9vIikKKyAgICBAbmVlZF9zeW1ib2woJ2NyZWF0ZV91bmljb2RlX2J1ZmZlcicpCisgICAgZGVmIHRlc3RfZnJvbV9hZGRyZXNzVyhzZWxmKToKKyAgICAgICAgcCA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcigiZm9vIikKKyAgICAgICAgc3ogPSAoY193Y2hhciAqIDMpLmZyb21fYWRkcmVzcyhhZGRyZXNzb2YocCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbOl0sICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6Wzo6XSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbOjotMV0sICJvb2YiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6Wzo6M10sICJmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzelsxOjQ6Ml0sICJvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzei52YWx1ZSwgImZvbyIpCiAKICAgICBkZWYgdGVzdF9jYWNoZShzZWxmKToKICAgICAgICAgIyBBcnJheSB0eXBlcyBhcmUgY2FjaGVkIGludGVybmFsbHkgaW4gdGhlIF9jdHlwZXMgZXh0ZW5zaW9uLApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXNfcGFyYW1ldGVyLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXNfcGFyYW1ldGVyLnB5CmluZGV4IDkzODg2MTcuLmYyZmUxMGEgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2FzX3BhcmFtZXRlci5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9hc19wYXJhbWV0ZXIucHkKQEAgLTEsNSArMSw2IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gY3R5cGVzIGltcG9ydCAqCitmcm9tIGN0eXBlcy50ZXN0IGltcG9ydCBuZWVkX3N5bWJvbAogaW1wb3J0IF9jdHlwZXNfdGVzdAogCiBkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKQEAgLTE3LDExICsxOCw4IEBACiAgICAgZGVmIHdyYXAoc2VsZiwgcGFyYW0pOgogICAgICAgICByZXR1cm4gcGFyYW0KIAorICAgIEBuZWVkX3N5bWJvbCgnY193Y2hhcicpCiAgICAgZGVmIHRlc3Rfd2NoYXJfcGFybShzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgY193Y2hhcgotICAgICAgICBleGNlcHQgTmFtZUVycm9yOgotICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2lfYmhpbGZkCiAgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3djaGFyLCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2RvdWJsZV0KICAgICAgICAgcmVzdWx0ID0gZihzZWxmLndyYXAoMSksIHNlbGYud3JhcCh1IngiKSwgc2VsZi53cmFwKDMpLCBzZWxmLndyYXAoNCksIHNlbGYud3JhcCg1LjApLCBzZWxmLndyYXAoNi4wKSkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weQppbmRleCBjYmViNGM2Li45OTFkYmU4IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5CkBAIC0xLDQgKzEsNSBAQAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IG5lZWRfc3ltYm9sCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcwogCkBAIC0xMjcsMjAgKzEyOCwxOCBAQAogICAgICAgICByZXN1bHQgPSBzZWxmLmZhaWxfZmllbGRzKCgiYSIsIGNfY2hhciwgMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBjX2NoYXInKSkKIAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjX3djaGFyCi0gICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXN1bHQgPSBzZWxmLmZhaWxfZmllbGRzKCgiYSIsIGNfd2NoYXIsIDEpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfd2NoYXInKSkKLQogICAgICAgICBjbGFzcyBEdW1teShTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbXQogCiAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgRHVtbXksIDEpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKFR5cGVFcnJvciwgJ2JpdCBmaWVsZHMgbm90IGFsbG93ZWQgZm9yIHR5cGUgRHVtbXknKSkKIAorICAgIEBuZWVkX3N5bWJvbCgnY193Y2hhcicpCisgICAgZGVmIHRlc3RfY193Y2hhcihzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5mYWlsX2ZpZWxkcygoImEiLCBjX3djaGFyLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsCisgICAgICAgICAgICAgICAgKFR5cGVFcnJvciwgJ2JpdCBmaWVsZHMgbm90IGFsbG93ZWQgZm9yIHR5cGUgY193Y2hhcicpKQorCiAgICAgZGVmIHRlc3Rfc2luZ2xlX2JpdGZpZWxkX3NpemUoc2VsZik6CiAgICAgICAgIGZvciBjX3R5cCBpbiBpbnRfdHlwZXM6CiAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmZhaWxfZmllbGRzKCgiYSIsIGNfdHlwLCAtMSkpCkBAIC0yNDAsNyArMjM5LDcgQEAKICAgICAgICAgICAgIF9hbm9ueW1vdXNfID0gWyJfIl0KICAgICAgICAgICAgIF9maWVsZHNfID0gWygiXyIsIFgpXQogCi0gICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihjdHlwZXMsICJjX3VpbnQzMiIpLCAiY19pbnQzMiBpcyByZXF1aXJlZCIpCisgICAgQG5lZWRfc3ltYm9sKCdjX3VpbnQzMicpCiAgICAgZGVmIHRlc3RfdWludDMyKHNlbGYpOgogICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX3VpbnQzMiwgMzIpXQpAQCAtMjUwLDcgKzI0OSw3IEBACiAgICAgICAgIHguYSA9IDB4RkRDQkE5ODcKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmEsIDB4RkRDQkE5ODcpCiAKLSAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKGN0eXBlcywgImNfdWludDY0IiksICJjX2ludDY0IGlzIHJlcXVpcmVkIikKKyAgICBAbmVlZF9zeW1ib2woJ2NfdWludDY0JykKICAgICBkZWYgdGVzdF91aW50NjQoc2VsZik6CiAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfdWludDY0LCA2NCldCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9idWZmZXJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYnVmZmVycy5weQppbmRleCAzZGY3OTNkLi44OGQ4N2U5IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9idWZmZXJzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J1ZmZlcnMucHkKQEAgLTEsNCArMSw1IEBACiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgbmVlZF9zeW1ib2wKIGltcG9ydCB1bml0dGVzdAogCiBjbGFzcyBTdHJpbmdCdWZmZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0zNiwzOSArMzcsMzYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6Ml0sICJhYyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjVdLCAiYSIpCiAKLSAgICB0cnk6Ci0gICAgICAgIGNfd2NoYXIKLSAgICBleGNlcHQgTmFtZUVycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgZGVmIHRlc3RfdW5pY29kZV9idWZmZXIoc2VsZik6Ci0gICAgICAgICAgICBiID0gY3JlYXRlX3VuaWNvZGVfYnVmZmVyKDMyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIDMyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoYiksIDMyICogc2l6ZW9mKGNfd2NoYXIpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGJbMF0pLCB1bmljb2RlKQorICAgIEBuZWVkX3N5bWJvbCgnY193Y2hhcicpCisgICAgZGVmIHRlc3RfdW5pY29kZV9idWZmZXIoc2VsZik6CisgICAgICAgIGIgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoMzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCAzMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoYiksIDMyICogc2l6ZW9mKGNfd2NoYXIpKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoYlswXSksIHVuaWNvZGUpCiAKLSAgICAgICAgICAgIGIgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIodSJhYmMiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIDQpICMgdHJhaWxpbmcgbnVsIGNoYXIKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGIpLCA0ICogc2l6ZW9mKGNfd2NoYXIpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGJbMF0pLCB1bmljb2RlKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzBdLCB1ImEiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzpdLCAiYWJjXDAiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6XSwgImFiY1wwIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Oi0xXSwgIlwwY2JhIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjJdLCAiYWMiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6NV0sICJhIikKKyAgICAgICAgYiA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcih1ImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCA0KSAjIHRyYWlsaW5nIG51bCBjaGFyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGIpLCA0ICogc2l6ZW9mKGNfd2NoYXIpKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoYlswXSksIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYlswXSwgdSJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzpdLCAiYWJjXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjpdLCAiYWJjXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjotMV0sICJcMGNiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjJdLCAiYWMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjo1XSwgImEiKQogCi0gICAgICAgIGRlZiB0ZXN0X3VuaWNvZGVfY29udmVyc2lvbihzZWxmKToKLSAgICAgICAgICAgIGIgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoImFiYyIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiKSwgNCkgIyB0cmFpbGluZyBudWwgY2hhcgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoYiksIDQgKiBzaXplb2YoY193Y2hhcikpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoYlswXSksIHVuaWNvZGUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbMF0sIHUiYSIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOl0sICJhYmNcMCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjpdLCAiYWJjXDAiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6LTFdLCAiXDBjYmEiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6Ml0sICJhYyIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjo1XSwgImEiKQorICAgIEBuZWVkX3N5bWJvbCgnY193Y2hhcicpCisgICAgZGVmIHRlc3RfdW5pY29kZV9jb252ZXJzaW9uKHNlbGYpOgorICAgICAgICBiID0gY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiKSwgNCkgIyB0cmFpbGluZyBudWwgY2hhcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihiKSwgNCAqIHNpemVvZihjX3djaGFyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGJbMF0pLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbMF0sIHUiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6XSwgImFiY1wwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6XSwgImFiY1wwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6LTFdLCAiXDBjYmEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjoyXSwgImFjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6NV0sICJhIikKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYnl0ZXN3YXAucHkKaW5kZXggOWM0YTY5Ny4uZDM2NDAyYiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYnl0ZXN3YXAucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYnl0ZXN3YXAucHkKQEAgLTE0LDcgKzE0LDggQEAKICMgRm9yIFN0cnVjdHVyZXMgYW5kIFVuaW9ucywgdGhlc2UgdHlwZXMgYXJlIGNyZWF0ZWQgb24gZGVtYW5kLgogCiBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgWF90ZXN0KHNlbGYpOgorICAgIEB1bml0dGVzdC5za2lwKCd0ZXN0IGRpc2FibGVkJykKKyAgICBkZWYgdGVzdF9YKHNlbGYpOgogICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAgc3lzLmJ5dGVvcmRlcgogICAgICAgICBmb3IgaSBpbiByYW5nZSgzMik6CiAgICAgICAgICAgICBiaXRzID0gQklUUygpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHkKaW5kZXggYmUwYzE3ZS4uYzJlOTUzYiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FsbGJhY2tzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weQpAQCAtMSw1ICsxLDYgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IG5lZWRfc3ltYm9sCiBpbXBvcnQgX2N0eXBlc190ZXN0CiAKIGNsYXNzIENhbGxiYWNrcyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC05NCw5ICs5NSwxMCBAQAogICAgICMgZGlzYWJsZWQ6IHdvdWxkIG5vdyAoY29ycmVjdGx5KSByYWlzZSBhIFJ1bnRpbWVXYXJuaW5nIGFib3V0CiAgICAgIyBhIG1lbW9yeSBsZWFrLiAgQSBjYWxsYmFjayBmdW5jdGlvbiBjYW5ub3QgcmV0dXJuIGEgbm9uLWludGVncmFsCiAgICAgIyBDIHR5cGUgd2l0aG91dCBjYXVzaW5nIGEgbWVtb3J5IGxlYWsuCi0jIyAgICBkZWYgdGVzdF9jaGFyX3Aoc2VsZik6Ci0jIyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfY2hhcl9wLCAiYWJjIikKLSMjICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19jaGFyX3AsICJkZWYiKQorICAgIEB1bml0dGVzdC5za2lwKCd0ZXN0IGRpc2FibGVkJykKKyAgICBkZWYgdGVzdF9jaGFyX3Aoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2NoYXJfcCwgImFiYyIpCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2NoYXJfcCwgImRlZiIpCiAKICAgICBkZWYgdGVzdF9weW9iamVjdChzZWxmKToKICAgICAgICAgbyA9ICgpCkBAIC0xNDgsMTMgKzE1MCwxMiBAQAogICAgICAgICBDRlVOQ1RZUEUoTm9uZSkobGFtYmRhIHg9TmFzdHkoKTogTm9uZSkKIAogCi10cnk6Ci0gICAgV0lORlVOQ1RZUEUKLWV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICBjbGFzcyBTdGRjYWxsQ2FsbGJhY2tzKENhbGxiYWNrcyk6CitAbmVlZF9zeW1ib2woJ1dJTkZVTkNUWVBFJykKK2NsYXNzIFN0ZGNhbGxDYWxsYmFja3MoQ2FsbGJhY2tzKToKKyAgICB0cnk6CiAgICAgICAgIGZ1bmN0eXBlID0gV0lORlVOQ1RZUEUKKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICBwYXNzCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtMTg0LDcgKzE4NSw3IEBACiAgICAgICAgIGZyb20gY3R5cGVzLnV0aWwgaW1wb3J0IGZpbmRfbGlicmFyeQogICAgICAgICBsaWJjX3BhdGggPSBmaW5kX2xpYnJhcnkoImMiKQogICAgICAgICBpZiBub3QgbGliY19wYXRoOgotICAgICAgICAgICAgcmV0dXJuICMgY2Fubm90IHRlc3QKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ2NvdWxkIG5vdCBmaW5kIGxpYmMnKQogICAgICAgICBsaWJjID0gQ0RMTChsaWJjX3BhdGgpCiAKICAgICAgICAgQENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihjX2ludCksIFBPSU5URVIoY19pbnQpKQpAQCAtMTk2LDIzICsxOTcsMTkgQEAKICAgICAgICAgbGliYy5xc29ydChhcnJheSwgbGVuKGFycmF5KSwgc2l6ZW9mKGNfaW50KSwgY21wX2Z1bmMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJyYXlbOl0sIFsxLCA1LCA3LCAzMywgOTldKQogCi0gICAgdHJ5OgotICAgICAgICBXSU5GVU5DVFlQRQotICAgIGV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBkZWYgdGVzdF9pc3N1ZV84OTU5X2Ioc2VsZik6Ci0gICAgICAgICAgICBmcm9tIGN0eXBlcy53aW50eXBlcyBpbXBvcnQgQk9PTCwgSFdORCwgTFBBUkFNCisgICAgQG5lZWRfc3ltYm9sKCdXSU5GVU5DVFlQRScpCisgICAgZGVmIHRlc3RfaXNzdWVfODk1OV9iKHNlbGYpOgorICAgICAgICBmcm9tIGN0eXBlcy53aW50eXBlcyBpbXBvcnQgQk9PTCwgSFdORCwgTFBBUkFNCisgICAgICAgIGdsb2JhbCB3aW5kb3dDb3VudAorICAgICAgICB3aW5kb3dDb3VudCA9IDAKKworICAgICAgICBAV0lORlVOQ1RZUEUoQk9PTCwgSFdORCwgTFBBUkFNKQorICAgICAgICBkZWYgRW51bVdpbmRvd3NDYWxsYmFja0Z1bmMoaHduZCwgbFBhcmFtKToKICAgICAgICAgICAgIGdsb2JhbCB3aW5kb3dDb3VudAotICAgICAgICAgICAgd2luZG93Q291bnQgPSAwCisgICAgICAgICAgICB3aW5kb3dDb3VudCArPSAxCisgICAgICAgICAgICByZXR1cm4gVHJ1ZSAjQWxsb3cgd2luZG93cyB0byBrZWVwIGVudW1lcmF0aW5nCiAKLSAgICAgICAgICAgIEBXSU5GVU5DVFlQRShCT09MLCBIV05ELCBMUEFSQU0pCi0gICAgICAgICAgICBkZWYgRW51bVdpbmRvd3NDYWxsYmFja0Z1bmMoaHduZCwgbFBhcmFtKToKLSAgICAgICAgICAgICAgICBnbG9iYWwgd2luZG93Q291bnQKLSAgICAgICAgICAgICAgICB3aW5kb3dDb3VudCArPSAxCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRydWUgI0FsbG93IHdpbmRvd3MgdG8ga2VlcCBlbnVtZXJhdGluZwotCi0gICAgICAgICAgICB3aW5kbGwudXNlcjMyLkVudW1XaW5kb3dzKEVudW1XaW5kb3dzQ2FsbGJhY2tGdW5jLCAwKQorICAgICAgICB3aW5kbGwudXNlcjMyLkVudW1XaW5kb3dzKEVudW1XaW5kb3dzQ2FsbGJhY2tGdW5jLCAwKQogCiAgICAgZGVmIHRlc3RfY2FsbGJhY2tfcmVnaXN0ZXJfaW50KHNlbGYpOgogICAgICAgICAjIElzc3VlICM4Mjc1OiBidWdneSBoYW5kbGluZyBvZiBjYWxsYmFjayBhcmdzIHVuZGVyIFdpbjY0CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weQppbmRleCBmNThkNDJjLi5kMjRlMGI1IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkKQEAgLTEsNCArMSw1IEBACiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgbmVlZF9zeW1ib2wKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHN5cwogCkBAIC03NSwxNSArNzYsMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGNhc3QocywgY192b2lkX3ApLCBjX2NoYXJfcCkudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaWhvIikKIAotICAgIHRyeToKLSAgICAgICAgY193Y2hhcl9wCi0gICAgZXhjZXB0IE5hbWVFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIGRlZiB0ZXN0X3djaGFyX3Aoc2VsZik6Ci0gICAgICAgICAgICBzID0gY193Y2hhcl9wKCJoaWhvIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FzdChjYXN0KHMsIGNfdm9pZF9wKSwgY193Y2hhcl9wKS52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaWhvIikKKyAgICBAbmVlZF9zeW1ib2woJ2Nfd2NoYXJfcCcpCisgICAgZGVmIHRlc3Rfd2NoYXJfcChzZWxmKToKKyAgICAgICAgcyA9IGNfd2NoYXJfcCgiaGlobyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FzdChjYXN0KHMsIGNfdm9pZF9wKSwgY193Y2hhcl9wKS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhpaG8iKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5CmluZGV4IDU5ODc3NmUuLjc2NTQwOGMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHkKQEAgLTMsNiArMyw3IEBACiAKIGltcG9ydCB1bml0dGVzdAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IG5lZWRfc3ltYm9sCiAKIGltcG9ydCBfY3R5cGVzX3Rlc3QKIApAQCAtMTkzLDcgKzE5NCw3IEBACiB0cnk6CiAgICAgV2luRExMCiBleGNlcHQgTmFtZUVycm9yOgotICAgIHBhc3MKKyAgICBkZWYgc3RkY2FsbF9kbGwoKl8pOiBwYXNzCiBlbHNlOgogICAgIGNsYXNzIHN0ZGNhbGxfZGxsKFdpbkRMTCk6CiAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKQEAgLTIwMyw5ICsyMDQsOSBAQAogICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBmdW5jKQogICAgICAgICAgICAgcmV0dXJuIGZ1bmMKIAotICAgIGNsYXNzIHN0ZGNhbGxDRnVuY3Rpb25zKENGdW5jdGlvbnMpOgotICAgICAgICBfZGxsID0gc3RkY2FsbF9kbGwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQotICAgICAgICBwYXNzCitAbmVlZF9zeW1ib2woJ1dpbkRMTCcpCitjbGFzcyBzdGRjYWxsQ0Z1bmN0aW9ucyhDRnVuY3Rpb25zKToKKyAgICBfZGxsID0gc3RkY2FsbF9kbGwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2hlY2tyZXR2YWwucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weQppbmRleCAwMWNjYzU3Li5hMGRjNTM0IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weQpAQCAtMSw2ICsxLDcgQEAKIGltcG9ydCB1bml0dGVzdAogCiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgbmVlZF9zeW1ib2wKIAogY2xhc3MgQ0hFQ0tFRChjX2ludCk6CiAgICAgZGVmIF9jaGVja19yZXR2YWxfKHZhbHVlKToKQEAgLTI1LDE1ICsyNiwxMSBAQAogICAgICAgICBkZWwgZGxsLl90ZXN0ZnVuY19wX3AucmVzdHlwZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBkbGwuX3Rlc3RmdW5jX3BfcCg0MikpCiAKLSAgICB0cnk6Ci0gICAgICAgIG9sZWRsbAotICAgIGV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBkZWYgdGVzdF9vbGVkbGwoc2VsZik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhXaW5kb3dzRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xlZGxsLm9sZWF1dDMyLkNyZWF0ZVR5cGVMaWIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5vbmUsIE5vbmUpCisgICAgQG5lZWRfc3ltYm9sKCdvbGVkbGwnKQorICAgIGRlZiB0ZXN0X29sZWRsbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xlZGxsLm9sZWF1dDMyLkNyZWF0ZVR5cGVMaWIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTm9uZSwgTm9uZSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2VycmNoZWNrLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZXJyY2hlY2sucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTEzZjkuLjAwMDAwMDAKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZXJyY2hlY2sucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1pbXBvcnQgc3lzCi1mcm9tIGN0eXBlcyBpbXBvcnQgKgotCi0jI2NsYXNzIEhNT0RVTEUoU3RydWN0dXJlKToKLSMjICAgIF9maWVsZHNfID0gWygidmFsdWUiLCBjX3ZvaWRfcCldCi0KLSMjICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKLSMjICAgICAgICByZXR1cm4gIjxITU9EVUxFICVzPiIgJSBzZWxmLnZhbHVlCi0KLSMjd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEucmVzdHlwZSA9IEhNT0RVTEUKLQotIyNwcmludCB3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQSgicHl0aG9uMjMuZGxsIikKLSMjcHJpbnQgaGV4KHN5cy5kbGxoYW5kbGUpCi0KLSMjZGVmIG5vbnplcm8oaGFuZGxlKToKLSMjICAgIHJldHVybiAoR2V0TGFzdEVycm9yKCksIGhhbmRsZSkKLQotIyN3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQS5lcnJjaGVjayA9IG5vbnplcm8KLSMjcHJpbnQgd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoInNwYW0iKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2ZpbmQucHkKaW5kZXggNzdlNzg5Zi4uYzVmNmFjZSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5CkBAIC0xLDQgKzEsNSBAQAogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKIGltcG9ydCBzeXMKIGZyb20gY3R5cGVzIGltcG9ydCAqCiBmcm9tIGN0eXBlcy51dGlsIGltcG9ydCBmaW5kX2xpYnJhcnkKQEAgLTQwLDQzICs0MSw0MyBAQAogICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICAgcGFzcwogCi0gICAgaWYgbGliX2dsOgotICAgICAgICBkZWYgdGVzdF9nbChzZWxmKToKLSAgICAgICAgICAgIGlmIHNlbGYuZ2w6Ci0gICAgICAgICAgICAgICAgc2VsZi5nbC5nbENsZWFySW5kZXgKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhsaWJfZ2wsICdsaWJfZ2wgbm90IGF2YWlsYWJsZScpCisgICAgZGVmIHRlc3RfZ2woc2VsZik6CisgICAgICAgIGlmIHNlbGYuZ2w6CisgICAgICAgICAgICBzZWxmLmdsLmdsQ2xlYXJJbmRleAogCi0gICAgaWYgbGliX2dsdToKLSAgICAgICAgZGVmIHRlc3RfZ2x1KHNlbGYpOgotICAgICAgICAgICAgaWYgc2VsZi5nbHU6Ci0gICAgICAgICAgICAgICAgc2VsZi5nbHUuZ2x1QmVnaW5DdXJ2ZQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGxpYl9nbHUsICdsaWJfZ2x1IG5vdCBhdmFpbGFibGUnKQorICAgIGRlZiB0ZXN0X2dsdShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5nbHU6CisgICAgICAgICAgICBzZWxmLmdsdS5nbHVCZWdpbkN1cnZlCiAKLSAgICBpZiBsaWJfZ2xlOgotICAgICAgICBkZWYgdGVzdF9nbGUoc2VsZik6Ci0gICAgICAgICAgICBpZiBzZWxmLmdsZToKLSAgICAgICAgICAgICAgICBzZWxmLmdsZS5nbGVHZXRKb2luU3R5bGUKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhsaWJfZ2xlLCAnbGliX2dsZSBub3QgYXZhaWxhYmxlJykKKyAgICBkZWYgdGVzdF9nbGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZ2xlOgorICAgICAgICAgICAgc2VsZi5nbGUuZ2xlR2V0Sm9pblN0eWxlCiAKLSMjaWYgb3MubmFtZSA9PSAicG9zaXgiIGFuZCBzeXMucGxhdGZvcm0gIT0gImRhcndpbiI6Ci0KLSMjICAgICMgT24gcGxhdGZvcm1zIHdoZXJlIHRoZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCBpcyAnLnNvJywKLSMjICAgICMgYXQgbGVhc3Qgc29tZSBsaWJyYXJpZXMgY2FuIGJlIGxvYWRlZCBhcyBhdHRyaWJ1dGVzIG9mIHRoZSBjZGxsCi0jIyAgICAjIG9iamVjdCwgc2luY2UgY3R5cGVzIG5vdyB0cmllcyBsb2FkaW5nIHRoZSBsaWIgYWdhaW4KLSMjICAgICMgd2l0aCAnLnNvJyBhcHBlbmRlZCBvZiB0aGUgZmlyc3QgdHJ5IGZhaWxzLgotIyMgICAgIwotIyMgICAgIyBXb24ndCB3b3JrIGZvciBsaWJjLCB1bmZvcnR1bmF0ZWx5LiAgT1RPSCwgaXQgaXNuJ3QKLSMjICAgICMgbmVlZGVkIGZvciBsaWJjIHNpbmNlIHRoaXMgaXMgYWxyZWFkeSBtYXBwZWQgaW50byB0aGUgY3VycmVudAotIyMgICAgIyBwcm9jZXNzICg/KQotIyMgICAgIwotIyMgICAgIyBPbiBNQUMgT1NYLCBpdCB3b24ndCB3b3JrIGVpdGhlciwgYmVjYXVzZSBkbG9wZW4oKSBuZWVkcyBhIGZ1bGwgcGF0aCwKLSMjICAgICMgYW5kIHRoZSBkZWZhdWx0IHN1ZmZpeCBpcyBlaXRoZXIgbm9uZSBvciAnLmR5bGliJy4KLQotIyMgICAgY2xhc3MgTG9hZExpYnModW5pdHRlc3QuVGVzdENhc2UpOgotIyMgICAgICAgIGRlZiB0ZXN0X2xpYm0oc2VsZik6Ci0jIyAgICAgICAgICAgIGltcG9ydCBtYXRoCi0jIyAgICAgICAgICAgIGxpYm0gPSBjZGxsLmxpYm0KLSMjICAgICAgICAgICAgc3FydCA9IGxpYm0uc3FydAotIyMgICAgICAgICAgICBzcXJ0LmFyZ3R5cGVzID0gKGNfZG91YmxlLCkKLSMjICAgICAgICAgICAgc3FydC5yZXN0eXBlID0gY19kb3VibGUKLSMjICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcXJ0KDIpLCBtYXRoLnNxcnQoMikpCisjIE9uIHBsYXRmb3JtcyB3aGVyZSB0aGUgZGVmYXVsdCBzaGFyZWQgbGlicmFyeSBzdWZmaXggaXMgJy5zbycsCisjIGF0IGxlYXN0IHNvbWUgbGlicmFyaWVzIGNhbiBiZSBsb2FkZWQgYXMgYXR0cmlidXRlcyBvZiB0aGUgY2RsbAorIyBvYmplY3QsIHNpbmNlIGN0eXBlcyBub3cgdHJpZXMgbG9hZGluZyB0aGUgbGliIGFnYWluCisjIHdpdGggJy5zbycgYXBwZW5kZWQgb2YgdGhlIGZpcnN0IHRyeSBmYWlscy4KKyMKKyMgV29uJ3Qgd29yayBmb3IgbGliYywgdW5mb3J0dW5hdGVseS4gIE9UT0gsIGl0IGlzbid0CisjIG5lZWRlZCBmb3IgbGliYyBzaW5jZSB0aGlzIGlzIGFscmVhZHkgbWFwcGVkIGludG8gdGhlIGN1cnJlbnQKKyMgcHJvY2VzcyAoPykKKyMKKyMgT24gTUFDIE9TWCwgaXQgd29uJ3Qgd29yayBlaXRoZXIsIGJlY2F1c2UgZGxvcGVuKCkgbmVlZHMgYSBmdWxsIHBhdGgsCisjIGFuZCB0aGUgZGVmYXVsdCBzdWZmaXggaXMgZWl0aGVyIG5vbmUgb3IgJy5keWxpYicuCitAdW5pdHRlc3Quc2tpcCgndGVzdCBkaXNhYmxlZCcpCitAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5uYW1lPT0icG9zaXgiIGFuZCBzeXMucGxhdGZvcm0gIT0gImRhcndpbiIsCisgICAgICAgICAgICAgICAgICAgICAndGVzdCBub3Qgc3VpdGFibGUgZm9yIHRoaXMgcGxhdGZvcm0nKQorY2xhc3MgTG9hZExpYnModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2xpYm0oc2VsZik6CisgICAgICAgIGltcG9ydCBtYXRoCisgICAgICAgIGxpYm0gPSBjZGxsLmxpYm0KKyAgICAgICAgc3FydCA9IGxpYm0uc3FydAorICAgICAgICBzcXJ0LmFyZ3R5cGVzID0gKGNfZG91YmxlLCkKKyAgICAgICAgc3FydC5yZXN0eXBlID0gY19kb3VibGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcXJ0KDIpLCBtYXRoLnNxcnQoMikpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jdGlvbnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jdGlvbnMucHkKaW5kZXggMmMzMGU5Ny4uYTM3NDQxNSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Z1bmN0aW9ucy5weQpAQCAtNiw2ICs2LDcgQEAKICIiIgogCiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgbmVlZF9zeW1ib2wKIGltcG9ydCBzeXMsIHVuaXR0ZXN0CiAKIHRyeToKQEAgLTYzLDIyICs2NCwxNiBAQAogICAgICAgICAgICAgcGFzcwogCiAKKyAgICBAbmVlZF9zeW1ib2woJ2Nfd2NoYXInKQogICAgIGRlZiB0ZXN0X3djaGFyX3Bhcm0oc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGNfd2NoYXIKLSAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKLSAgICAgICAgICAgIHJldHVybgogICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19pX2JoaWxmZAogICAgICAgICBmLmFyZ3R5cGVzID0gW2NfYnl0ZSwgY193Y2hhciwgY19pbnQsIGNfbG9uZywgY19mbG9hdCwgY19kb3VibGVdCiAgICAgICAgIHJlc3VsdCA9IGYoMSwgdSJ4IiwgMywgNCwgNS4wLCA2LjApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAxMzkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCiAKKyAgICBAbmVlZF9zeW1ib2woJ2Nfd2NoYXInKQogICAgIGRlZiB0ZXN0X3djaGFyX3Jlc3VsdChzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgY193Y2hhcgotICAgICAgICBleGNlcHQgTmFtZUVycm9yOgotICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2lfYmhpbGZkCiAgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2RvdWJsZV0KICAgICAgICAgZi5yZXN0eXBlID0gY193Y2hhcgpAQCAtMTU1LDExICsxNTAsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTIxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgZmxvYXQpCiAKKyAgICBAbmVlZF9zeW1ib2woJ2NfbG9uZ2xvbmcnKQogICAgIGRlZiB0ZXN0X2xvbmdsb25ncmVzdWx0KHNlbGYpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjX2xvbmdsb25nCi0gICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4KICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfcV9iaGlsZmQKICAgICAgICAgZi5yZXN0eXBlID0gY19sb25nbG9uZwogICAgICAgICBmLmFyZ3R5cGVzID0gW2NfYnl0ZSwgY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19mbG9hdCwgY19kb3VibGVdCkBAIC0yOTYsNiArMjg4LDcgQEAKICAgICAgICAgcmVzdWx0ID0gZigtMTAsIGNiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQogCisgICAgQG5lZWRfc3ltYm9sKCdjX2xvbmdsb25nJykKICAgICBkZWYgdGVzdF9sb25nbG9uZ19jYWxsYmFja3Moc2VsZik6CiAKICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfY2FsbGJhY2tfcV9xZgpAQCAtMzQ4LDE2ICszNDEsMTYgQEAKICAgICAgICAgczJoID0gZGxsLnJldF8yaF9mdW5jKGlucCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoczJoLngsIHMyaC55KSwgKDk5KjIsIDg4KjMpKQogCi0gICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6Ci0gICAgICAgIGRlZiB0ZXN0X3N0cnVjdF9yZXR1cm5fMkhfc3RkY2FsbChzZWxmKToKLSAgICAgICAgICAgIGNsYXNzIFMySChTdHJ1Y3R1cmUpOgotICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfc2hvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfc2hvcnQpXQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAnV2luZG93cy1zcGVjaWZpYyB0ZXN0JykKKyAgICBkZWYgdGVzdF9zdHJ1Y3RfcmV0dXJuXzJIX3N0ZGNhbGwoc2VsZik6CisgICAgICAgIGNsYXNzIFMySChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19zaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCBjX3Nob3J0KV0KIAotICAgICAgICAgICAgd2luZGxsLnNfcmV0XzJoX2Z1bmMucmVzdHlwZSA9IFMySAotICAgICAgICAgICAgd2luZGxsLnNfcmV0XzJoX2Z1bmMuYXJndHlwZXMgPSBbUzJIXQotICAgICAgICAgICAgczJoID0gd2luZGxsLnNfcmV0XzJoX2Z1bmMoUzJIKDk5LCA4OCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzMmgueCwgczJoLnkpLCAoOTkqMiwgODgqMykpCisgICAgICAgIHdpbmRsbC5zX3JldF8yaF9mdW5jLnJlc3R5cGUgPSBTMkgKKyAgICAgICAgd2luZGxsLnNfcmV0XzJoX2Z1bmMuYXJndHlwZXMgPSBbUzJIXQorICAgICAgICBzMmggPSB3aW5kbGwuc19yZXRfMmhfZnVuYyhTMkgoOTksIDg4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoczJoLngsIHMyaC55KSwgKDk5KjIsIDg4KjMpKQogCiAgICAgZGVmIHRlc3Rfc3RydWN0X3JldHVybl84SChzZWxmKToKICAgICAgICAgY2xhc3MgUzhJKFN0cnVjdHVyZSk6CkBAIC0zNzYsMjMgKzM2OSwyNCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzOGkuYSwgczhpLmIsIHM4aS5jLCBzOGkuZCwgczhpLmUsIHM4aS5mLCBzOGkuZywgczhpLmgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOSoyLCA4KjMsIDcqNCwgNio1LCA1KjYsIDQqNywgMyo4LCAyKjkpKQogCi0gICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6Ci0gICAgICAgIGRlZiB0ZXN0X3N0cnVjdF9yZXR1cm5fOEhfc3RkY2FsbChzZWxmKToKLSAgICAgICAgICAgIGNsYXNzIFM4SShTdHJ1Y3R1cmUpOgotICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2ludCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY19pbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZCIsIGNfaW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImUiLCBjX2ludCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJmIiwgY19pbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZyIsIGNfaW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImgiLCBjX2ludCldCi0gICAgICAgICAgICB3aW5kbGwuc19yZXRfOGlfZnVuYy5yZXN0eXBlID0gUzhJCi0gICAgICAgICAgICB3aW5kbGwuc19yZXRfOGlfZnVuYy5hcmd0eXBlcyA9IFtTOEldCi0gICAgICAgICAgICBpbnAgPSBTOEkoOSwgOCwgNywgNiwgNSwgNCwgMywgMikKLSAgICAgICAgICAgIHM4aSA9IHdpbmRsbC5zX3JldF84aV9mdW5jKGlucCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHM4aS5hLCBzOGkuYiwgczhpLmMsIHM4aS5kLCBzOGkuZSwgczhpLmYsIHM4aS5nLCBzOGkuaCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOSoyLCA4KjMsIDcqNCwgNio1LCA1KjYsIDQqNywgMyo4LCAyKjkpKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAnV2luZG93cy1zcGVjaWZpYyB0ZXN0JykKKyAgICBkZWYgdGVzdF9zdHJ1Y3RfcmV0dXJuXzhIX3N0ZGNhbGwoc2VsZik6CisgICAgICAgIGNsYXNzIFM4SShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJkIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJlIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJmIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJnIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJoIiwgY19pbnQpXQorICAgICAgICB3aW5kbGwuc19yZXRfOGlfZnVuYy5yZXN0eXBlID0gUzhJCisgICAgICAgIHdpbmRsbC5zX3JldF84aV9mdW5jLmFyZ3R5cGVzID0gW1M4SV0KKyAgICAgICAgaW5wID0gUzhJKDksIDgsIDcsIDYsIDUsIDQsIDMsIDIpCisgICAgICAgIHM4aSA9IHdpbmRsbC5zX3JldF84aV9mdW5jKGlucCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAoczhpLmEsIHM4aS5iLCBzOGkuYywgczhpLmQsIHM4aS5lLCBzOGkuZiwgczhpLmcsIHM4aS5oKSwKKyAgICAgICAgICAgICAgICAoOSoyLCA4KjMsIDcqNCwgNio1LCA1KjYsIDQqNywgMyo4LCAyKjkpKQogCiAgICAgZGVmIHRlc3Rfc2YxNjUxMjM1KHNlbGYpOgogICAgICAgICAjIHNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvMTY1MTIzNQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfaW50ZWdlcnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlZ2Vycy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlNGIwOC4uMDAwMDAwMAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlZ2Vycy5weQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBzdXBlcnNlZGVkIGJ5IHRlc3RfbnVtYmVycy5weQotaW1wb3J0IHVuaXR0ZXN0Ci0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9rZWVwcmVmcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CmluZGV4IGI1MDRjMGMuLmIyYTUwYWIgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CkBAIC05NCw3ICs5NCw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fb2JqZWN0cywgeycxJzogaX0pCiAKIGNsYXNzIERlbGV0ZVBvaW50ZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIFhfdGVzdChzZWxmKToKKyAgICBAdW5pdHRlc3Quc2tpcCgndGVzdCBkaXNhYmxlZCcpCisgICAgZGVmIHRlc3RfWChzZWxmKToKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJwIiwgUE9JTlRFUihjX2NoYXJfcCkpXQogICAgICAgICB4ID0gWCgpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weQppbmRleCBlNDE1NjAxLi44MWEyN2UzIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkKQEAgLTIxLDE4ICsyMSwyMSBAQAogCiAgICAgdW5rbm93bmRsbCA9ICJ4eHJhbmRvbW5hbWV4eCIKIAotICAgIGlmIGxpYmNfbmFtZSBpcyBub3QgTm9uZToKLSAgICAgICAgZGVmIHRlc3RfbG9hZChzZWxmKToKLSAgICAgICAgICAgIENETEwobGliY19uYW1lKQotICAgICAgICAgICAgQ0RMTChvcy5wYXRoLmJhc2VuYW1lKGxpYmNfbmFtZSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBDRExMLCBzZWxmLnVua25vd25kbGwpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MobGliY19uYW1lIGlzIG5vdCBOb25lLCAnY291bGQgbm90IGZpbmQgbGliYycpCisgICAgZGVmIHRlc3RfbG9hZChzZWxmKToKKyAgICAgICAgQ0RMTChsaWJjX25hbWUpCisgICAgICAgIENETEwob3MucGF0aC5iYXNlbmFtZShsaWJjX25hbWUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBDRExMLCBzZWxmLnVua25vd25kbGwpCiAKLSAgICBpZiBsaWJjX25hbWUgaXMgbm90IE5vbmUgYW5kIG9zLnBhdGguYmFzZW5hbWUobGliY19uYW1lKSA9PSAibGliYy5zby42IjoKLSAgICAgICAgZGVmIHRlc3RfbG9hZF92ZXJzaW9uKHNlbGYpOgotICAgICAgICAgICAgY2RsbC5Mb2FkTGlicmFyeSgibGliYy5zby42IikKLSAgICAgICAgICAgICMgbGludXggdXNlcyB2ZXJzaW9uLCBsaWJjIDkgc2hvdWxkIG5vdCBleGlzdAotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgY2RsbC5Mb2FkTGlicmFyeSwgImxpYmMuc28uOSIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjZGxsLkxvYWRMaWJyYXJ5LCBzZWxmLnVua25vd25kbGwpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MobGliY19uYW1lIGlzIG5vdCBOb25lLCAnY291bGQgbm90IGZpbmQgbGliYycpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MobGliY19uYW1lIGlzIG5vdCBOb25lIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUobGliY19uYW1lKSA9PSAibGliYy5zby42IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnd3JvbmcgbGliYyBwYXRoIGZvciB0ZXN0JykKKyAgICBkZWYgdGVzdF9sb2FkX3ZlcnNpb24oc2VsZik6CisgICAgICAgIGNkbGwuTG9hZExpYnJhcnkoImxpYmMuc28uNiIpCisgICAgICAgICMgbGludXggdXNlcyB2ZXJzaW9uLCBsaWJjIDkgc2hvdWxkIG5vdCBleGlzdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjZGxsLkxvYWRMaWJyYXJ5LCAibGliYy5zby45IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgY2RsbC5Mb2FkTGlicmFyeSwgc2VsZi51bmtub3duZGxsKQogCiAgICAgZGVmIHRlc3RfZmluZChzZWxmKToKICAgICAgICAgZm9yIG5hbWUgaW4gKCJjIiwgIm0iKToKQEAgLTQxLDY2ICs0NCw3MSBAQAogICAgICAgICAgICAgICAgIGNkbGwuTG9hZExpYnJhcnkobGliKQogICAgICAgICAgICAgICAgIENETEwobGliKQogCi0gICAgaWYgb3MubmFtZSBpbiAoIm50IiwgImNlIik6Ci0gICAgICAgIGRlZiB0ZXN0X2xvYWRfbGlicmFyeShzZWxmKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGxpYmNfbmFtZSkKLSAgICAgICAgICAgIGlmIGlzX3Jlc291cmNlX2VuYWJsZWQoInByaW50aW5nIik6Ci0gICAgICAgICAgICAgICAgcHJpbnQgZmluZF9saWJyYXJ5KCJrZXJuZWwzMiIpCi0gICAgICAgICAgICAgICAgcHJpbnQgZmluZF9saWJyYXJ5KCJ1c2VyMzIiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgaW4gKCJudCIsICJjZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IHNwZWNpZmljIHRvIFdpbmRvd3MgKE5UL0NFKScpCisgICAgZGVmIHRlc3RfbG9hZF9saWJyYXJ5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShsaWJjX25hbWUpCisgICAgICAgIGlmIGlzX3Jlc291cmNlX2VuYWJsZWQoInByaW50aW5nIik6CisgICAgICAgICAgICBwcmludCBmaW5kX2xpYnJhcnkoImtlcm5lbDMyIikKKyAgICAgICAgICAgIHByaW50IGZpbmRfbGlicmFyeSgidXNlcjMyIikKIAotICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAibnQiOgotICAgICAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVXCi0gICAgICAgICAgICAgICAgd2luZGxsWyJrZXJuZWwzMiJdLkdldE1vZHVsZUhhbmRsZVcKLSAgICAgICAgICAgICAgICB3aW5kbGwuTG9hZExpYnJhcnkoImtlcm5lbDMyIikuR2V0TW9kdWxlSGFuZGxlVwotICAgICAgICAgICAgICAgIFdpbkRMTCgia2VybmVsMzIiKS5HZXRNb2R1bGVIYW5kbGVXCi0gICAgICAgICAgICBlbGlmIG9zLm5hbWUgPT0gImNlIjoKLSAgICAgICAgICAgICAgICB3aW5kbGwuY29yZWRsbC5HZXRNb2R1bGVIYW5kbGVXCi0gICAgICAgICAgICAgICAgd2luZGxsWyJjb3JlZGxsIl0uR2V0TW9kdWxlSGFuZGxlVwotICAgICAgICAgICAgICAgIHdpbmRsbC5Mb2FkTGlicmFyeSgiY29yZWRsbCIpLkdldE1vZHVsZUhhbmRsZVcKLSAgICAgICAgICAgICAgICBXaW5ETEwoImNvcmVkbGwiKS5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKKyAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgICAgICB3aW5kbGxbImtlcm5lbDMyIl0uR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgd2luZGxsLkxvYWRMaWJyYXJ5KCJrZXJuZWwzMiIpLkdldE1vZHVsZUhhbmRsZVcKKyAgICAgICAgICAgIFdpbkRMTCgia2VybmVsMzIiKS5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgIGVsaWYgb3MubmFtZSA9PSAiY2UiOgorICAgICAgICAgICAgd2luZGxsLmNvcmVkbGwuR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgd2luZGxsWyJjb3JlZGxsIl0uR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgd2luZGxsLkxvYWRMaWJyYXJ5KCJjb3JlZGxsIikuR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgV2luRExMKCJjb3JlZGxsIikuR2V0TW9kdWxlSGFuZGxlVwogCi0gICAgICAgIGRlZiB0ZXN0X2xvYWRfb3JkaW5hbF9mdW5jdGlvbnMoc2VsZik6Ci0gICAgICAgICAgICBpbXBvcnQgX2N0eXBlc190ZXN0Ci0gICAgICAgICAgICBkbGwgPSBXaW5ETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQotICAgICAgICAgICAgIyBXZSBsb2FkIHRoZSBzYW1lIGZ1bmN0aW9uIGJvdGggdmlhIG9yZGluYWwgYW5kIG5hbWUKLSAgICAgICAgICAgIGZ1bmNfb3JkID0gZGxsWzJdCi0gICAgICAgICAgICBmdW5jX25hbWUgPSBkbGwuR2V0U3RyaW5nCi0gICAgICAgICAgICAjIGFkZHJlc3NvZiBnZXRzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBmdW5jdGlvbiBwb2ludGVyIGlzIHN0b3JlZAotICAgICAgICAgICAgYV9vcmQgPSBhZGRyZXNzb2YoZnVuY19vcmQpCi0gICAgICAgICAgICBhX25hbWUgPSBhZGRyZXNzb2YoZnVuY19uYW1lKQotICAgICAgICAgICAgZl9vcmRfYWRkciA9IGNfdm9pZF9wLmZyb21fYWRkcmVzcyhhX29yZCkudmFsdWUKLSAgICAgICAgICAgIGZfbmFtZV9hZGRyID0gY192b2lkX3AuZnJvbV9hZGRyZXNzKGFfbmFtZSkudmFsdWUKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGV4KGZfb3JkX2FkZHIpLCBoZXgoZl9uYW1lX2FkZHIpKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgaW4gKCJudCIsICJjZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IHNwZWNpZmljIHRvIFdpbmRvd3MgKE5UL0NFKScpCisgICAgZGVmIHRlc3RfbG9hZF9vcmRpbmFsX2Z1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgaW1wb3J0IF9jdHlwZXNfdGVzdAorICAgICAgICBkbGwgPSBXaW5ETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICAjIFdlIGxvYWQgdGhlIHNhbWUgZnVuY3Rpb24gYm90aCB2aWEgb3JkaW5hbCBhbmQgbmFtZQorICAgICAgICBmdW5jX29yZCA9IGRsbFsyXQorICAgICAgICBmdW5jX25hbWUgPSBkbGwuR2V0U3RyaW5nCisgICAgICAgICMgYWRkcmVzc29mIGdldHMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaXMgc3RvcmVkCisgICAgICAgIGFfb3JkID0gYWRkcmVzc29mKGZ1bmNfb3JkKQorICAgICAgICBhX25hbWUgPSBhZGRyZXNzb2YoZnVuY19uYW1lKQorICAgICAgICBmX29yZF9hZGRyID0gY192b2lkX3AuZnJvbV9hZGRyZXNzKGFfb3JkKS52YWx1ZQorICAgICAgICBmX25hbWVfYWRkciA9IGNfdm9pZF9wLmZyb21fYWRkcmVzcyhhX25hbWUpLnZhbHVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGV4KGZfb3JkX2FkZHIpLCBoZXgoZl9uYW1lX2FkZHIpKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZGxsLl9fZ2V0aXRlbV9fLCAxMjM0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZGxsLl9fZ2V0aXRlbV9fLCAxMjM0KQogCi0gICAgaWYgb3MubmFtZSA9PSAibnQiOgotICAgICAgICBkZWYgdGVzdF8xNzAzMjg2X0Eoc2VsZik6Ci0gICAgICAgICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IExvYWRMaWJyYXJ5LCBGcmVlTGlicmFyeQotICAgICAgICAgICAgIyBPbiB3aW5YUCA2NC1iaXQsIGFkdmFwaTMyIGxvYWRzIGF0IGFuIGFkZHJlc3MgdGhhdCBkb2VzCi0gICAgICAgICAgICAjIE5PVCBmaXQgaW50byBhIDMyLWJpdCBpbnRlZ2VyLiAgRnJlZUxpYnJhcnkgbXVzdCBiZSBhYmxlCi0gICAgICAgICAgICAjIHRvIGFjY2VwdCB0aGlzIGFkZHJlc3MuCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MubmFtZSA9PSAibnQiLCAnV2luZG93cy1zcGVjaWZpYyB0ZXN0JykKKyAgICBkZWYgdGVzdF8xNzAzMjg2X0Eoc2VsZik6CisgICAgICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgTG9hZExpYnJhcnksIEZyZWVMaWJyYXJ5CisgICAgICAgICMgT24gd2luWFAgNjQtYml0LCBhZHZhcGkzMiBsb2FkcyBhdCBhbiBhZGRyZXNzIHRoYXQgZG9lcworICAgICAgICAjIE5PVCBmaXQgaW50byBhIDMyLWJpdCBpbnRlZ2VyLiAgRnJlZUxpYnJhcnkgbXVzdCBiZSBhYmxlCisgICAgICAgICMgdG8gYWNjZXB0IHRoaXMgYWRkcmVzcy4KIAotICAgICAgICAgICAgIyBUaGVzZSBhcmUgdGVzdHMgZm9yIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi8xNzAzMjg2Ci0gICAgICAgICAgICBoYW5kbGUgPSBMb2FkTGlicmFyeSgiYWR2YXBpMzIiKQotICAgICAgICAgICAgRnJlZUxpYnJhcnkoaGFuZGxlKQorICAgICAgICAjIFRoZXNlIGFyZSB0ZXN0cyBmb3IgaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzE3MDMyODYKKyAgICAgICAgaGFuZGxlID0gTG9hZExpYnJhcnkoImFkdmFwaTMyIikKKyAgICAgICAgRnJlZUxpYnJhcnkoaGFuZGxlKQogCi0gICAgICAgIGRlZiB0ZXN0XzE3MDMyODZfQihzZWxmKToKLSAgICAgICAgICAgICMgU2luY2Ugb24gd2luWFAgNjQtYml0IGFkdmFwaTMyIGxvYWRzIGxpa2UgZGVzY3JpYmVkCi0gICAgICAgICAgICAjIGFib3ZlLCB0aGUgKGFyYml0cmFyaWx5IHNlbGVjdGVkKSBDbG9zZUV2ZW50TG9nIGZ1bmN0aW9uCi0gICAgICAgICAgICAjIGFsc28gaGFzIGEgaGlnaCBhZGRyZXNzLiAgJ2NhbGxfZnVuY3Rpb24nIHNob3VsZCBhY2NlcHQKLSAgICAgICAgICAgICMgYWRkcmVzc2VzIHNvIGxhcmdlLgotICAgICAgICAgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBjYWxsX2Z1bmN0aW9uCi0gICAgICAgICAgICBhZHZhcGkzMiA9IHdpbmRsbC5hZHZhcGkzMgotICAgICAgICAgICAgIyBDYWxsaW5nIENsb3NlRXZlbnRMb2cgd2l0aCBhIE5VTEwgYXJndW1lbnQgc2hvdWxkIGZhaWwsCi0gICAgICAgICAgICAjIGJ1dCB0aGUgY2FsbCBzaG91bGQgbm90IHNlZ2ZhdWx0IG9yIHNvLgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBhZHZhcGkzMi5DbG9zZUV2ZW50TG9nKE5vbmUpKQotICAgICAgICAgICAgd2luZGxsLmtlcm5lbDMyLkdldFByb2NBZGRyZXNzLmFyZ3R5cGVzID0gY192b2lkX3AsIGNfY2hhcl9wCi0gICAgICAgICAgICB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MucmVzdHlwZSA9IGNfdm9pZF9wCi0gICAgICAgICAgICBwcm9jID0gd2luZGxsLmtlcm5lbDMyLkdldFByb2NBZGRyZXNzKGFkdmFwaTMyLl9oYW5kbGUsICJDbG9zZUV2ZW50TG9nIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm9jKQotICAgICAgICAgICAgIyBUaGlzIGlzIHRoZSByZWFsIHRlc3Q6IGNhbGwgdGhlIGZ1bmN0aW9uIHZpYSAnY2FsbF9mdW5jdGlvbicKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgY2FsbF9mdW5jdGlvbihwcm9jLCAoTm9uZSwpKSkKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5uYW1lID09ICJudCIsICdXaW5kb3dzLXNwZWNpZmljIHRlc3QnKQorICAgIGRlZiB0ZXN0XzE3MDMyODZfQihzZWxmKToKKyAgICAgICAgIyBTaW5jZSBvbiB3aW5YUCA2NC1iaXQgYWR2YXBpMzIgbG9hZHMgbGlrZSBkZXNjcmliZWQKKyAgICAgICAgIyBhYm92ZSwgdGhlIChhcmJpdHJhcmlseSBzZWxlY3RlZCkgQ2xvc2VFdmVudExvZyBmdW5jdGlvbgorICAgICAgICAjIGFsc28gaGFzIGEgaGlnaCBhZGRyZXNzLiAgJ2NhbGxfZnVuY3Rpb24nIHNob3VsZCBhY2NlcHQKKyAgICAgICAgIyBhZGRyZXNzZXMgc28gbGFyZ2UuCisgICAgICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgY2FsbF9mdW5jdGlvbgorICAgICAgICBhZHZhcGkzMiA9IHdpbmRsbC5hZHZhcGkzMgorICAgICAgICAjIENhbGxpbmcgQ2xvc2VFdmVudExvZyB3aXRoIGEgTlVMTCBhcmd1bWVudCBzaG91bGQgZmFpbCwKKyAgICAgICAgIyBidXQgdGhlIGNhbGwgc2hvdWxkIG5vdCBzZWdmYXVsdCBvciBzby4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBhZHZhcGkzMi5DbG9zZUV2ZW50TG9nKE5vbmUpKQorICAgICAgICB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MuYXJndHlwZXMgPSBjX3ZvaWRfcCwgY19jaGFyX3AKKyAgICAgICAgd2luZGxsLmtlcm5lbDMyLkdldFByb2NBZGRyZXNzLnJlc3R5cGUgPSBjX3ZvaWRfcAorICAgICAgICBwcm9jID0gd2luZGxsLmtlcm5lbDMyLkdldFByb2NBZGRyZXNzKGFkdmFwaTMyLl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsb3NlRXZlbnRMb2ciKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvYykKKyAgICAgICAgIyBUaGlzIGlzIHRoZSByZWFsIHRlc3Q6IGNhbGwgdGhlIGZ1bmN0aW9uIHZpYSAnY2FsbF9mdW5jdGlvbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBjYWxsX2Z1bmN0aW9uKHByb2MsIChOb25lLCkpKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbWFjaG9saWIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weQppbmRleCBjZjUwZjUwLi45Nzc5YjJmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weQpAQCAtNDUsMjEgKzQ1LDIxIEBACiAgICAgcmFpc2UgVmFsdWVFcnJvcigiJXMgbm90IGZvdW5kIiAlIChuYW1lLCkpCiAKIGNsYXNzIE1hY2hPVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgotICAgICAgICBkZWYgdGVzdF9maW5kKHNlbGYpOgorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIiwgJ09TWC1zcGVjaWZpYyB0ZXN0JykKKyAgICBkZWYgdGVzdF9maW5kKHNlbGYpOgogCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbmRfbGliKCdwdGhyZWFkJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbmRfbGliKCdwdGhyZWFkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL2xpYi9saWJTeXN0ZW0uQi5keWxpYicpCiAKLSAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRfbGliKCd6JykKLSAgICAgICAgICAgICMgSXNzdWUgIzIxMDkzOiBkeWxkIGRlZmF1bHQgc2VhcmNoIHBhdGggaW5jbHVkZXMgJEhPTUUvbGliIGFuZAotICAgICAgICAgICAgIyAvdXNyL2xvY2FsL2xpYiBiZWZvcmUgL3Vzci9saWIsIHdoaWNoIGNhdXNlZCB0ZXN0IGZhaWx1cmVzIGlmCi0gICAgICAgICAgICAjIGEgbG9jYWwgY29weSBvZiBsaWJ6IGV4aXN0cyBpbiBvbmUgb2YgdGhlbS4gTm93IGlnbm9yZSB0aGUgaGVhZAotICAgICAgICAgICAgIyBvZiB0aGUgcGF0aC4KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhyZXN1bHQsIHIiLiovbGliL2xpYnpcLi4qLipcLmR5bGliIikKKyAgICAgICAgcmVzdWx0ID0gZmluZF9saWIoJ3onKQorICAgICAgICAjIElzc3VlICMyMTA5MzogZHlsZCBkZWZhdWx0IHNlYXJjaCBwYXRoIGluY2x1ZGVzICRIT01FL2xpYiBhbmQKKyAgICAgICAgIyAvdXNyL2xvY2FsL2xpYiBiZWZvcmUgL3Vzci9saWIsIHdoaWNoIGNhdXNlZCB0ZXN0IGZhaWx1cmVzIGlmCisgICAgICAgICMgYSBsb2NhbCBjb3B5IG9mIGxpYnogZXhpc3RzIGluIG9uZSBvZiB0aGVtLiBOb3cgaWdub3JlIHRoZSBoZWFkCisgICAgICAgICMgb2YgdGhlIHBhdGguCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhyZXN1bHQsIHIiLiovbGliL2xpYnpcLi4qLipcLmR5bGliIikKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaW5kX2xpYignSU9LaXQnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9JT0tpdC5mcmFtZXdvcmsvVmVyc2lvbnMvQS9JT0tpdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmluZF9saWIoJ0lPS2l0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9JT0tpdC5mcmFtZXdvcmsvVmVyc2lvbnMvQS9JT0tpdCcpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tZW1mdW5jdGlvbnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tZW1mdW5jdGlvbnMucHkKaW5kZXggZDA3MjYwMy4uYmE5ZWVhNiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbWVtZnVuY3Rpb25zLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X21lbWZ1bmN0aW9ucy5weQpAQCAtMSwxNyArMSwxOSBAQAogaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgbmVlZF9zeW1ib2wKIAogY2xhc3MgTWVtRnVuY3Rpb25zVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0jIyAgICBkZWYgdGVzdF9vdmVyZmxvdyhzZWxmKToKLSMjICAgICAgICAjIHN0cmluZ19hdCBhbmQgd3N0cmluZ19hdCBtdXN0IHVzZSB0aGUgUHl0aG9uIGNhbGxpbmcKLSMjICAgICAgICAjIGNvbnZlbnRpb24gKHdoaWNoIGFjcXVpcmVzIHRoZSBHSUwgYW5kIGNoZWNrcyB0aGUgUHl0aG9uCi0jIyAgICAgICAgIyBlcnJvciBmbGFnKS4gIFByb3Zva2UgYW4gZXJyb3IgYW5kIGNhdGNoIGl0OyBzZWUgYWxzbyBpc3N1ZQotIyMgICAgICAgICMgIzM1NTQ6IDxodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMzU1ND4KLSMjICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoT3ZlcmZsb3dFcnJvciwgTWVtb3J5RXJyb3IsIFN5c3RlbUVycm9yKSwKLSMjICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHdzdHJpbmdfYXQodSJmb28iLCBzeXMubWF4aW50IC0gMSkpCi0jIyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKE92ZXJmbG93RXJyb3IsIE1lbW9yeUVycm9yLCBTeXN0ZW1FcnJvciksCi0jIyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBzdHJpbmdfYXQoImZvbyIsIHN5cy5tYXhpbnQgLSAxKSkKKyAgICBAdW5pdHRlc3Quc2tpcCgndGVzdCBkaXNhYmxlZCcpCisgICAgZGVmIHRlc3Rfb3ZlcmZsb3coc2VsZik6CisgICAgICAgICMgc3RyaW5nX2F0IGFuZCB3c3RyaW5nX2F0IG11c3QgdXNlIHRoZSBQeXRob24gY2FsbGluZworICAgICAgICAjIGNvbnZlbnRpb24gKHdoaWNoIGFjcXVpcmVzIHRoZSBHSUwgYW5kIGNoZWNrcyB0aGUgUHl0aG9uCisgICAgICAgICMgZXJyb3IgZmxhZykuICBQcm92b2tlIGFuIGVycm9yIGFuZCBjYXRjaCBpdDsgc2VlIGFsc28gaXNzdWUKKyAgICAgICAgIyAjMzU1NDogPGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUzNTU0PgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoT3ZlcmZsb3dFcnJvciwgTWVtb3J5RXJyb3IsIFN5c3RlbUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiB3c3RyaW5nX2F0KHUiZm9vIiwgc3lzLm1heGludCAtIDEpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoT3ZlcmZsb3dFcnJvciwgTWVtb3J5RXJyb3IsIFN5c3RlbUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBzdHJpbmdfYXQoImZvbyIsIHN5cy5tYXhpbnQgLSAxKSkKIAogICAgIGRlZiB0ZXN0X21lbW1vdmUoc2VsZik6CiAgICAgICAgICMgbGFyZ2UgYnVmZmVycyBhcHBhcmVudGx5IGluY3JlYXNlIHRoZSBjaGFuY2UgdGhhdCB0aGUgbWVtb3J5CkBAIC01OSwyMSArNjEsMTcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmdfYXQoImZvbyBiYXIiLCA4KSwgImZvbyBiYXJcMCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KCJmb28gYmFyIiwgMyksICJmb28iKQogCi0gICAgdHJ5OgotICAgICAgICBjcmVhdGVfdW5pY29kZV9idWZmZXIKLSAgICBleGNlcHQgTmFtZUVycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgZGVmIHRlc3Rfd3N0cmluZ19hdChzZWxmKToKLSAgICAgICAgICAgIHAgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoIkhlbGxvLCBXb3JsZCIpCi0gICAgICAgICAgICBhID0gY3JlYXRlX3VuaWNvZGVfYnVmZmVyKDEwMDAwMDApCi0gICAgICAgICAgICByZXN1bHQgPSBtZW1tb3ZlKGEsIHAsIGxlbihwKSAqIHNpemVvZihjX3djaGFyKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS52YWx1ZSwgIkhlbGxvLCBXb3JsZCIpCisgICAgQG5lZWRfc3ltYm9sKCdjcmVhdGVfdW5pY29kZV9idWZmZXInKQorICAgIGRlZiB0ZXN0X3dzdHJpbmdfYXQoc2VsZik6CisgICAgICAgIHAgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoIkhlbGxvLCBXb3JsZCIpCisgICAgICAgIGEgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoMTAwMDAwMCkKKyAgICAgICAgcmVzdWx0ID0gbWVtbW92ZShhLCBwLCBsZW4ocCkgKiBzaXplb2YoY193Y2hhcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS52YWx1ZSwgIkhlbGxvLCBXb3JsZCIpCiAKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3N0cmluZ19hdChhKSwgIkhlbGxvLCBXb3JsZCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdzdHJpbmdfYXQoYSwgNSksICJIZWxsbyIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdzdHJpbmdfYXQoYSwgMTYpLCAiSGVsbG8sIFdvcmxkXDBcMFwwXDAiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3c3RyaW5nX2F0KGEsIDApLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3c3RyaW5nX2F0KGEpLCAiSGVsbG8sIFdvcmxkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3c3RyaW5nX2F0KGEsIDUpLCAiSGVsbG8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdzdHJpbmdfYXQoYSwgMTYpLCAiSGVsbG8sIFdvcmxkXDBcMFwwXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdzdHJpbmdfYXQoYSwgMCksICIiKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X251bWJlcnMucHkKaW5kZXggNzNjMjM1MC4uZDYyMzQ2NSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5CkBAIC04MiwxMiArODIsMTMgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdCwgIiIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQsIE5vbmUpCiAKLSMjICAgIGRlZiB0ZXN0X3ZhbGlkX3JhbmdlcyhzZWxmKToKLSMjICAgICAgICAjIGludmFsaWQgdmFsdWVzIG9mIHRoZSBjb3JyZWN0IHR5cGUKLSMjICAgICAgICAjIHJhaXNlIFZhbHVlRXJyb3IgKG5vdCBPdmVyZmxvd0Vycm9yKQotIyMgICAgICAgIGZvciB0LCAobCwgaCkgaW4gemlwKHVuc2lnbmVkX3R5cGVzLCB1bnNpZ25lZF9yYW5nZXMpOgotIyMgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LCBsLTEpCi0jIyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQsIGgrMSkKKyAgICBAdW5pdHRlc3Quc2tpcCgndGVzdCBkaXNhYmxlZCcpCisgICAgZGVmIHRlc3RfdmFsaWRfcmFuZ2VzKHNlbGYpOgorICAgICAgICAjIGludmFsaWQgdmFsdWVzIG9mIHRoZSBjb3JyZWN0IHR5cGUKKyAgICAgICAgIyByYWlzZSBWYWx1ZUVycm9yIChub3QgT3ZlcmZsb3dFcnJvcikKKyAgICAgICAgZm9yIHQsIChsLCBoKSBpbiB6aXAodW5zaWduZWRfdHlwZXMsIHVuc2lnbmVkX3Jhbmdlcyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LCBsLTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LCBoKzEpCiAKICAgICBkZWYgdGVzdF9mcm9tX3BhcmFtKHNlbGYpOgogICAgICAgICAjIHRoZSBmcm9tX3BhcmFtIGNsYXNzIG1ldGhvZCBhdHRyaWJ1dGUgYWx3YXlzCkBAIC0xOTksMTYgKzIwMCwxNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYudmFsdWUsIGFbMF0pCiAKICAgICAjIGFycmF5IGRvZXMgbm90IHN1cHBvcnQgY19ib29sIC8gJ3QnCi0gICAgIyBkZWYgdGVzdF9ib29sX2Zyb21fYWRkcmVzcyhzZWxmKToKLSAgICAjICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19ib29sCi0gICAgIyAgICAgZnJvbSBhcnJheSBpbXBvcnQgYXJyYXkKLSAgICAjICAgICBhID0gYXJyYXkoY19ib29sLl90eXBlXywgW1RydWVdKQotICAgICMgICAgIHYgPSB0LmZyb21fYWRkcmVzcyhhLmJ1ZmZlcl9pbmZvKClbMF0pCi0gICAgIyAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQotICAgICMgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2KSBpcyB0KQotICAgICMgICAgIGFbMF0gPSBGYWxzZQotICAgICMgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi52YWx1ZSwgYVswXSkKLSAgICAjICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodikgaXMgdCkKKyAgICBAdW5pdHRlc3Quc2tpcCgndGVzdCBkaXNhYmxlZCcpCisgICAgZGVmIHRlc3RfYm9vbF9mcm9tX2FkZHJlc3Moc2VsZik6CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX2Jvb2wKKyAgICAgICAgZnJvbSBhcnJheSBpbXBvcnQgYXJyYXkKKyAgICAgICAgYSA9IGFycmF5KGNfYm9vbC5fdHlwZV8sIFtUcnVlXSkKKyAgICAgICAgdiA9IHQuZnJvbV9hZGRyZXNzKGEuYnVmZmVyX2luZm8oKVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodikgaXMgdCkKKyAgICAgICAgYVswXSA9IEZhbHNlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi52YWx1ZSwgYVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHYpIGlzIHQpCiAKICAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgogICAgICAgICAjIGNfaW50KCkgY2FuIGJlIGluaXRpYWxpemVkIGZyb20gUHl0aG9uJ3MgaW50LCBhbmQgY19pbnQuCkBAIC0yMjYsOCArMjI4LDkgQEAKICAgICAgICAgICAgIGlmIChoYXNhdHRyKHQsICJfX2N0eXBlX2xlX18iKSk6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgdC5fX2N0eXBlX2xlX18sIGJpZ19pbnQpCiAKLSMjICAgIGRlZiB0ZXN0X3BlcmYoc2VsZik6Ci0jIyAgICAgICAgY2hlY2tfcGVyZigpCisgICAgQHVuaXR0ZXN0LnNraXAoJ3Rlc3QgZGlzYWJsZWQnKQorICAgIGRlZiB0ZXN0X3BlcmYoc2VsZik6CisgICAgICAgIGNoZWNrX3BlcmYoKQogCiBmcm9tIGN0eXBlcyBpbXBvcnQgX1NpbXBsZUNEYXRhCiBjbGFzcyBjX2ludF9TKF9TaW1wbGVDRGF0YSk6CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfb2JqZWN0cy5weQppbmRleCA0ZDkyMWQyLi5hN2M1MjQ3IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHkKQEAgLTU5LDEyICs1OSw5IEBACiBpbXBvcnQgY3R5cGVzLnRlc3QudGVzdF9vYmplY3RzCiAKIGNsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBpZiBzeXMuaGV4dmVyc2lvbiA+IDB4MDIwNDAwMDA6Ci0gICAgICAgICMgUHl0aG9uIDIuMyBoYXMgbm8gRUxMSVBTSVMgZmxhZywgc28gd2UgZG9uJ3QgdGVzdCB3aXRoIHRoaXMKLSAgICAgICAgIyB2ZXJzaW9uOgotICAgICAgICBkZWYgdGVzdChzZWxmKToKLSAgICAgICAgICAgIGRvY3Rlc3QudGVzdG1vZChjdHlwZXMudGVzdC50ZXN0X29iamVjdHMpCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIGZhaWx1cmVzLCB0ZXN0cyA9IGRvY3Rlc3QudGVzdG1vZChjdHlwZXMudGVzdC50ZXN0X29iamVjdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmFpbHVyZXMsICdkb2N0ZXN0cyBmYWlsZWQsIHNlZSBvdXRwdXQgYWJvdmUnKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIGlmIHN5cy5oZXh2ZXJzaW9uID4gMHgwMjA0MDAwMDoKLSAgICAgICAgZG9jdGVzdC50ZXN0bW9kKGN0eXBlcy50ZXN0LnRlc3Rfb2JqZWN0cykKKyAgICBkb2N0ZXN0LnRlc3Rtb2QoY3R5cGVzLnRlc3QudGVzdF9vYmplY3RzKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkKaW5kZXggMjJlZGQ4My4uMTkyZDllZCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5CkBAIC0xLDQgKzEsNSBAQAogaW1wb3J0IHVuaXR0ZXN0LCBzeXMKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IG5lZWRfc3ltYm9sCiAKIGNsYXNzIFNpbXBsZVR5cGVzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC0zNiwxMCArMzcsOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENWT0lEUC5mcm9tX3BhcmFtKCJhYmMiKSwgImFiY2FiYyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ0NIQVJQLmZyb21fcGFyYW0oImFiYyIpLCAiYWJjYWJjYWJjYWJjIikKIAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY193Y2hhcl9wCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHJldHVybgorICAgIEBuZWVkX3N5bWJvbCgnY193Y2hhcl9wJykKKyAgICBkZWYgdGVzdF9zdWJjbGFzc2VzX2Nfd2NoYXJfcChzZWxmKToKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfd2NoYXJfcAogCiAgICAgICAgIGNsYXNzIENXQ0hBUlAoY193Y2hhcl9wKToKICAgICAgICAgICAgIGRlZiBmcm9tX3BhcmFtKGNscywgdmFsdWUpOgpAQCAtNjgsMTMgKzY4LDkgQEAKICAgICAgICAgYSA9IGNfY2hhcl9wKCIxMjMiKQogICAgICAgICBzZWxmLmFzc2VydElzKGNfY2hhcl9wLmZyb21fcGFyYW0oYSksIGEpCiAKKyAgICBAbmVlZF9zeW1ib2woJ2Nfd2NoYXJfcCcpCiAgICAgZGVmIHRlc3RfY3dfc3RyaW5ncyhzZWxmKToKLSAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGJ5cmVmCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX3djaGFyX3AKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotIyMgICAgICAgICAgICBwcmludCAiKE5vIGNfd2NoYXJfcCkiCi0gICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGJ5cmVmLCBjX3djaGFyX3AKICAgICAgICAgcyA9IHUiMTIzIgogICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3djaGFyX3AuZnJvbV9wYXJhbShzKS5fb2JqIGlzIHMpCkBAIC0xNDQsOSArMTQwLDYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBMUElOVC5mcm9tX3BhcmFtLCBjX2xvbmcqMykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBMUElOVC5mcm9tX3BhcmFtLCBjX3VpbnQqMykKIAotIyMgICAgZGVmIHRlc3RfcGVyZm9ybWFuY2Uoc2VsZik6Ci0jIyAgICAgICAgY2hlY2tfcGVyZigpCi0KICAgICBkZWYgdGVzdF9ub2N0eXBlc19hcmd0eXBlKHNlbGYpOgogICAgICAgICBpbXBvcnQgX2N0eXBlc190ZXN0CiAgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBDRExMLCBjX3ZvaWRfcCwgQXJndW1lbnRFcnJvcgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHkKaW5kZXggMDliYTY1NS4uYTEwMzE3YiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5CkBAIC0xLDQgKzEsNSBAQAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IG5lZWRfc3ltYm9sCiBpbXBvcnQgdW5pdHRlc3QKIAogIyBJTVBPUlRBTlQgSU5GTzoKQEAgLTEzNSwxMyArMTM2LDE0IEBACiAgICAgICAgIGZ1bmMocG9pbnRlcihjX2ludCgpKSkKICAgICAgICAgZnVuYygoY19pbnQgKiAzKSgpKQogCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfd2NoYXJfcAotICAgICAgICBleGNlcHQgTmFtZUVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKGNfd2NoYXJfcChOb25lKSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiMTIzIiwgZnVuYyhjX3djaGFyX3AodSIxMjMiKSkpCisgICAgQG5lZWRfc3ltYm9sKCdjX3djaGFyX3AnKQorICAgIGRlZiB0ZXN0X2Nfdm9pZF9wX2FyZ193aXRoX2Nfd2NoYXJfcChzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX3djaGFyX3AKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfdm9pZF9wLAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhjX3djaGFyX3AoTm9uZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiMTIzIiwgZnVuYyhjX3djaGFyX3AodSIxMjMiKSkpCiAKICAgICBkZWYgdGVzdF9pbnN0YW5jZShzZWxmKToKICAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcApAQCAtMTU2LDUxICsxNTgsNDcgQEAKICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IE5vbmUKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKFgoKSkpCiAKLXRyeToKLSAgICBjX3djaGFyCi1leGNlcHQgTmFtZUVycm9yOgotICAgIHBhc3MKLWVsc2U6Ci0gICAgY2xhc3MgV0NoYXJQb2ludGVyc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKK0BuZWVkX3N5bWJvbCgnY193Y2hhcicpCitjbGFzcyBXQ2hhclBvaW50ZXJzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCi0gICAgICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgICAgIGZ1bmMgPSB0ZXN0ZGxsLl90ZXN0ZnVuY19wX3AKLSAgICAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfaW50Ci0gICAgICAgICAgICBmdW5jLmFyZ3R5cGVzID0gTm9uZQorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX2ludAorICAgICAgICBmdW5jLmFyZ3R5cGVzID0gTm9uZQogCiAKLSAgICAgICAgZGVmIHRlc3RfUE9JTlRFUl9jX3djaGFyX2FyZyhzZWxmKToKLSAgICAgICAgICAgIGZ1bmMgPSB0ZXN0ZGxsLl90ZXN0ZnVuY19wX3AKLSAgICAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfd2NoYXJfcAotICAgICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IFBPSU5URVIoY193Y2hhciksCisgICAgZGVmIHRlc3RfUE9JTlRFUl9jX3djaGFyX2FyZyhzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX3djaGFyX3AKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IFBPSU5URVIoY193Y2hhciksCiAKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhOb25lKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIxMjMiLCBmdW5jKHUiMTIzIikpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoY193Y2hhcl9wKE5vbmUpKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIxMjMiLCBmdW5jKGNfd2NoYXJfcCh1IjEyMyIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiMTIzIiwgZnVuYyh1IjEyMyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoY193Y2hhcl9wKE5vbmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IjEyMyIsIGZ1bmMoY193Y2hhcl9wKHUiMTIzIikpKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiMTIzIiwgZnVuYyhjX3didWZmZXIodSIxMjMiKSkpCi0gICAgICAgICAgICBjYSA9IGNfd2NoYXIoImEiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1ImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJhIiwgZnVuYyhieXJlZihjYSkpWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiMTIzIiwgZnVuYyhjX3didWZmZXIodSIxMjMiKSkpCisgICAgICAgIGNhID0gY193Y2hhcigiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJhIiwgZnVuYyhieXJlZihjYSkpWzBdKQogCi0gICAgICAgIGRlZiB0ZXN0X2Nfd2NoYXJfcF9hcmcoc2VsZik6Ci0gICAgICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfcF9wCi0gICAgICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX3djaGFyX3AKLSAgICAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBjX3djaGFyX3AsCisgICAgZGVmIHRlc3RfY193Y2hhcl9wX2FyZyhzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX3djaGFyX3AKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfd2NoYXJfcCwKIAotICAgICAgICAgICAgY193Y2hhcl9wLmZyb21fcGFyYW0odSIxMjMiKQorICAgICAgICBjX3djaGFyX3AuZnJvbV9wYXJhbSh1IjEyMyIpCiAKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhOb25lKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIGZ1bmModSIxMjMiKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhjX3djaGFyX3AoTm9uZSkpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyhjX3djaGFyX3AoIjEyMyIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKHUiMTIzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhjX3djaGFyX3AoTm9uZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfd2NoYXJfcCgiMTIzIikpKQogCi0gICAgICAgICAgICAjIFhYWCBDdXJyZW50bHksIHRoZXNlIHJhaXNlIFR5cGVFcnJvcnMsIGFsdGhvdWdoIHRoZXkgc2hvdWxkbid0OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyhjX3didWZmZXIoIjEyMyIpKSkKLSAgICAgICAgICAgIGNhID0gY193Y2hhcigiYSIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhieXJlZihjYSkpWzBdKQorICAgICAgICAjIFhYWCBDdXJyZW50bHksIHRoZXNlIHJhaXNlIFR5cGVFcnJvcnMsIGFsdGhvdWdoIHRoZXkgc2hvdWxkbid0OgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfd2J1ZmZlcigiMTIzIikpKQorICAgICAgICBjYSA9IGNfd2NoYXIoImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKGJ5cmVmKGNhKSlbMF0pCiAKIGNsYXNzIEFycmF5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3Qoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHl0aG9uX2FwaS5weQppbmRleCA3NGFmMDRjLi42MjcyOGRkIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3B5dGhvbl9hcGkucHkKQEAgLTEsNiArMSw2IEBACiBmcm9tIGN0eXBlcyBpbXBvcnQgKgogaW1wb3J0IHVuaXR0ZXN0LCBzeXMKLWZyb20gY3R5cGVzLnRlc3QgaW1wb3J0IGlzX3Jlc291cmNlX2VuYWJsZWQKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IHJlcXVpcmVzCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMgVGhpcyBzZWN0aW9uIHNob3VsZCBiZSBtb3ZlZCBpbnRvIGN0eXBlc1xfX2luaXRfXy5weSwgd2hlbiBpdCdzIHJlYWR5LgpAQCAtMzcsMjQgKzM3LDI0IEBACiAgICAgICAgIGRlbCBweW9iCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKHMpLCByZWZjbnQpCiAKLSAgICBpZiBpc19yZXNvdXJjZV9lbmFibGVkKCJyZWZjb3VudCIpOgotICAgICAgICAjIFRoaXMgdGVzdCBpcyB1bnJlbGlhYmxlLCBiZWNhdXNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgY29kZSBpbgotICAgICAgICAjIHVuaXR0ZXN0IGNoYW5nZXMgdGhlIHJlZmNvdW50IG9mIHRoZSAnNDInIGludGVnZXIuICBTbywgaXQKLSAgICAgICAgIyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgotICAgICAgICBkZWYgdGVzdF9QeUludF9Mb25nKHNlbGYpOgotICAgICAgICAgICAgcmVmNDIgPSBncmMoNDIpCi0gICAgICAgICAgICBweXRob25hcGkuUHlJbnRfRnJvbUxvbmcucmVzdHlwZSA9IHB5X29iamVjdAotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChweXRob25hcGkuUHlJbnRfRnJvbUxvbmcoNDIpLCA0MikKKyAgICAjIFRoaXMgdGVzdCBpcyB1bnJlbGlhYmxlLCBiZWNhdXNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgY29kZSBpbgorICAgICMgdW5pdHRlc3QgY2hhbmdlcyB0aGUgcmVmY291bnQgb2YgdGhlICc0MicgaW50ZWdlci4gIFNvLCBpdAorICAgICMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICBAcmVxdWlyZXMoInJlZmNvdW50IikKKyAgICBkZWYgdGVzdF9QeUludF9Mb25nKHNlbGYpOgorICAgICAgICByZWY0MiA9IGdyYyg0MikKKyAgICAgICAgcHl0aG9uYXBpLlB5SW50X0Zyb21Mb25nLnJlc3R5cGUgPSBweV9vYmplY3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChweXRob25hcGkuUHlJbnRfRnJvbUxvbmcoNDIpLCA0MikKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoNDIpLCByZWY0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoNDIpLCByZWY0MikKIAotICAgICAgICAgICAgcHl0aG9uYXBpLlB5SW50X0FzTG9uZy5hcmd0eXBlcyA9IChweV9vYmplY3QsKQotICAgICAgICAgICAgcHl0aG9uYXBpLlB5SW50X0FzTG9uZy5yZXN0eXBlID0gY19sb25nCisgICAgICAgIHB5dGhvbmFwaS5QeUludF9Bc0xvbmcuYXJndHlwZXMgPSAocHlfb2JqZWN0LCkKKyAgICAgICAgcHl0aG9uYXBpLlB5SW50X0FzTG9uZy5yZXN0eXBlID0gY19sb25nCiAKLSAgICAgICAgICAgIHJlcyA9IHB5dGhvbmFwaS5QeUludF9Bc0xvbmcoNDIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhyZXMpLCByZWY0MiArIDEpCi0gICAgICAgICAgICBkZWwgcmVzCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyg0MiksIHJlZjQyKQorICAgICAgICByZXMgPSBweXRob25hcGkuUHlJbnRfQXNMb25nKDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhyZXMpLCByZWY0MiArIDEpCisgICAgICAgIGRlbCByZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoNDIpLCByZWY0MikKIAogICAgIGRlZiB0ZXN0X1B5T2JqX0Zyb21QdHIoc2VsZik6CiAgICAgICAgIHMgPSAiYWJjIGRlZiBnaGkgamtsIgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JhbmRvbV90aGluZ3MucHkKaW5kZXggMWMyMTdjMy4uMGNhZmZlMyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5CkBAIC01LDIzICs1LDIyIEBACiAgICAgNDIgLy8gYXJnCiAgICAgcmFpc2UgVmFsdWVFcnJvcihhcmcpCiAKLWlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgorQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICdXaW5kb3dzLXNwZWNpZmljIHRlc3QnKQorY2xhc3MgY2FsbF9mdW5jdGlvbl9UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBfY3R5cGVzLmNhbGxfZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBhbmQgcHJpdmF0ZSwgYnV0IHVzZWQgYnkKKyAgICAjIEdhcnkgQmlzaHAncyByZWFkbGluZSBtb2R1bGUuICBJZiB3ZSBoYXZlIGl0LCB3ZSBtdXN0IHRlc3QgaXQgYXMgd2VsbC4KIAotICAgIGNsYXNzIGNhbGxfZnVuY3Rpb25fVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgotICAgICAgICAjIF9jdHlwZXMuY2FsbF9mdW5jdGlvbiBpcyBkZXByZWNhdGVkIGFuZCBwcml2YXRlLCBidXQgdXNlZCBieQotICAgICAgICAjIEdhcnkgQmlzaHAncyByZWFkbGluZSBtb2R1bGUuICBJZiB3ZSBoYXZlIGl0LCB3ZSBtdXN0IHRlc3QgaXQgYXMgd2VsbC4KKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBjYWxsX2Z1bmN0aW9uCisgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5Mb2FkTGlicmFyeUEucmVzdHlwZSA9IGNfdm9pZF9wCisgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRQcm9jQWRkcmVzcy5hcmd0eXBlcyA9IGNfdm9pZF9wLCBjX2NoYXJfcAorICAgICAgICB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MucmVzdHlwZSA9IGNfdm9pZF9wCiAKLSAgICAgICAgZGVmIHRlc3Qoc2VsZik6Ci0gICAgICAgICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IGNhbGxfZnVuY3Rpb24KLSAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5Mb2FkTGlicmFyeUEucmVzdHlwZSA9IGNfdm9pZF9wCi0gICAgICAgICAgICB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MuYXJndHlwZXMgPSBjX3ZvaWRfcCwgY19jaGFyX3AKLSAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRQcm9jQWRkcmVzcy5yZXN0eXBlID0gY192b2lkX3AKKyAgICAgICAgaGRsbCA9IHdpbmRsbC5rZXJuZWwzMi5Mb2FkTGlicmFyeUEoImtlcm5lbDMyIikKKyAgICAgICAgZnVuY2FkZHIgPSB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MoaGRsbCwgIkdldE1vZHVsZUhhbmRsZUEiKQogCi0gICAgICAgICAgICBoZGxsID0gd2luZGxsLmtlcm5lbDMyLkxvYWRMaWJyYXJ5QSgia2VybmVsMzIiKQotICAgICAgICAgICAgZnVuY2FkZHIgPSB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MoaGRsbCwgIkdldE1vZHVsZUhhbmRsZUEiKQotCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGxfZnVuY3Rpb24oZnVuY2FkZHIsIChOb25lLCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FsbF9mdW5jdGlvbihmdW5jYWRkciwgKE5vbmUsKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBKE5vbmUpKQogCiBjbGFzcyBDYWxsYmFja1RyYWNiYWNrVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICMgV2hlbiBhbiBleGNlcHRpb24gaXMgcmFpc2VkIGluIGEgY3R5cGVzIGNhbGxiYWNrIGZ1bmN0aW9uLCB0aGUgQwpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHkKaW5kZXggYTU2MzJlYy4uYTllZTNhOCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5CkBAIC0xLDUgKzEsNiBAQAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgbmVlZF9zeW1ib2wKIAogaW1wb3J0IF9jdHlwZXNfdGVzdAogCkBAIC0xMzEsNDYgKzEzMiw0MiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbMjo1Oi0zXSwgc1syOjU6LTNdKQogCiAKLSAgICB0cnk6Ci0gICAgICAgIGNfd2NoYXIKLSAgICBleGNlcHQgTmFtZUVycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgZGVmIHRlc3Rfd2NoYXJfcHRyKHNlbGYpOgotICAgICAgICAgICAgcyA9IHUiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcMCIKKyAgICBAbmVlZF9zeW1ib2woJ2Nfd2NoYXInKQorICAgIGRlZiB0ZXN0X3djaGFyX3B0cihzZWxmKToKKyAgICAgICAgcyA9IHUiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcMCIKIAotICAgICAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCi0gICAgICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfd2NoYXIpCi0gICAgICAgICAgICBkbGwubXlfd2NzZHVwLmFyZ3R5cGVzID0gUE9JTlRFUihjX3djaGFyKSwKLSAgICAgICAgICAgIGRsbC5teV9mcmVlLnJlc3R5cGUgPSBOb25lCi0gICAgICAgICAgICByZXMgPSBkbGwubXlfd2NzZHVwKHMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1s6bGVuKHMpXSwgcykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzpsZW4ocyk6XSwgcykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzW2xlbihzKS0xOi0xOi0xXSwgc1s6Oi0xXSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzW2xlbihzKS0xOjU6LTddLCBzWzo1Oi03XSkKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIGRsbC5teV93Y3NkdXAucmVzdHlwZSA9IFBPSU5URVIoY193Y2hhcikKKyAgICAgICAgZGxsLm15X3djc2R1cC5hcmd0eXBlcyA9IFBPSU5URVIoY193Y2hhciksCisgICAgICAgIGRsbC5teV9mcmVlLnJlc3R5cGUgPSBOb25lCisgICAgICAgIHJlcyA9IGRsbC5teV93Y3NkdXAocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKV0sIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzpsZW4ocyk6XSwgcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbbGVuKHMpLTE6LTE6LTFdLCBzWzo6LTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMTo1Oi03XSwgc1s6NTotN10pCiAKLSAgICAgICAgICAgIGltcG9ydCBvcGVyYXRvcgotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRzbGljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgMCwgNSwgdSJhYmNkZSIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsIHNsaWNlKDAsIDUpLCB1ImFiY2RlIikKLSAgICAgICAgICAgIGRsbC5teV9mcmVlKHJlcykKKyAgICAgICAgaW1wb3J0IG9wZXJhdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0c2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgMCwgNSwgdSJhYmNkZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLCBzbGljZSgwLCA1KSwgdSJhYmNkZSIpCisgICAgICAgIGRsbC5teV9mcmVlKHJlcykKIAotICAgICAgICAgICAgaWYgc2l6ZW9mKGNfd2NoYXIpID09IHNpemVvZihjX3Nob3J0KToKLSAgICAgICAgICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfc2hvcnQpCi0gICAgICAgICAgICBlbGlmIHNpemVvZihjX3djaGFyKSA9PSBzaXplb2YoY19pbnQpOgotICAgICAgICAgICAgICAgIGRsbC5teV93Y3NkdXAucmVzdHlwZSA9IFBPSU5URVIoY19pbnQpCi0gICAgICAgICAgICBlbGlmIHNpemVvZihjX3djaGFyKSA9PSBzaXplb2YoY19sb25nKToKLSAgICAgICAgICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfbG9uZykKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICByZXMgPSBkbGwubXlfd2NzZHVwKHMpCi0gICAgICAgICAgICB0bXBsID0gcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKzEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1s6bGVuKHMpLTFdLCB0bXBsKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKS0xOl0sIHRtcGwpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMjotMTotMV0sIHRtcGxbOjotMV0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMjo1Oi03XSwgdG1wbFs6NTotN10pCi0gICAgICAgICAgICBkbGwubXlfZnJlZShyZXMpCisgICAgICAgIGlmIHNpemVvZihjX3djaGFyKSA9PSBzaXplb2YoY19zaG9ydCk6CisgICAgICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfc2hvcnQpCisgICAgICAgIGVsaWYgc2l6ZW9mKGNfd2NoYXIpID09IHNpemVvZihjX2ludCk6CisgICAgICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfaW50KQorICAgICAgICBlbGlmIHNpemVvZihjX3djaGFyKSA9PSBzaXplb2YoY19sb25nKToKKyAgICAgICAgICAgIGRsbC5teV93Y3NkdXAucmVzdHlwZSA9IFBPSU5URVIoY19sb25nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnUG9pbnRlcnMgdG8gY193Y2hhciBhcmUgbm90IHN1cHBvcnRlZCcpCisgICAgICAgIHJlcyA9IGRsbC5teV93Y3NkdXAocykKKyAgICAgICAgdG1wbCA9IHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSsxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1s6bGVuKHMpLTFdLCB0bXBsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1s6bGVuKHMpLTE6XSwgdG1wbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbbGVuKHMpLTI6LTE6LTFdLCB0bXBsWzo6LTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMjo1Oi03XSwgdG1wbFs6NTotN10pCisgICAgICAgIGRsbC5teV9mcmVlKHJlcykKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncy5weQppbmRleCBjODM3ZDgyLi40YjU4ZTdjIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3MucHkKQEAgLTEsNSArMSw2IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gY3R5cGVzIGltcG9ydCAqCitmcm9tIGN0eXBlcy50ZXN0IGltcG9ydCBuZWVkX3N5bWJvbAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAogY2xhc3MgU3RyaW5nQXJyYXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC02MCwyOSArNjEsMjYgQEAKICMjICAgICAgICBwcmludCBCVUYuZnJvbV9wYXJhbShjX2NoYXJfcCgicHl0aG9uIikpCiAjIyAgICAgICAgcHJpbnQgQlVGLmZyb21fcGFyYW0oQlVGKCoicHl0aCIpKQogCi10cnk6Ci0gICAgY193Y2hhcgotZXhjZXB0IE5hbWVFcnJvcjoKLSAgICBwYXNzCi1lbHNlOgotICAgIGNsYXNzIFdTdHJpbmdBcnJheVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAgICAgZGVmIHRlc3Qoc2VsZik6Ci0gICAgICAgICAgICBCVUYgPSBjX3djaGFyICogNAorQG5lZWRfc3ltYm9sKCdjX3djaGFyJykKK2NsYXNzIFdTdHJpbmdBcnJheVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgQlVGID0gY193Y2hhciAqIDQKIAotICAgICAgICAgICAgYnVmID0gQlVGKHUiYSIsIHUiYiIsIHUiYyIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgdSJhYmMiKQorICAgICAgICBidWYgPSBCVUYodSJhIiwgdSJiIiwgdSJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsIHUiYWJjIikKIAotICAgICAgICAgICAgYnVmLnZhbHVlID0gdSJBQkNEIgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsIHUiQUJDRCIpCisgICAgICAgIGJ1Zi52YWx1ZSA9IHUiQUJDRCIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsIHUiQUJDRCIpCiAKLSAgICAgICAgICAgIGJ1Zi52YWx1ZSA9IHUieCIKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCB1IngiKQorICAgICAgICBidWYudmFsdWUgPSB1IngiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCB1IngiKQogCi0gICAgICAgICAgICBidWZbMV0gPSB1IloiCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgdSJ4WkNEIikKKyAgICAgICAgYnVmWzFdID0gdSJaIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgdSJ4WkNEIikKIAogY2xhc3MgU3RyaW5nVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiBYWF90ZXN0X2Jhc2ljX3N0cmluZ3Moc2VsZik6CisgICAgQHVuaXR0ZXN0LnNraXAoJ3Rlc3QgZGlzYWJsZWQnKQorICAgIGRlZiB0ZXN0X2Jhc2ljX3N0cmluZ3Moc2VsZik6CiAgICAgICAgIGNzID0gY19zdHJpbmcoImFiY2RlZiIpCiAKICAgICAgICAgIyBDYW5ub3QgY2FsbCBsZW4gb24gYSBjX3N0cmluZyBhbnkgbG9uZ2VyCkBAIC0xMDgsNyArMTA2LDggQEAKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfc3RyaW5nLCB1IjEyMyIpCiAKLSAgICBkZWYgWFhfdGVzdF9zaXplZF9zdHJpbmdzKHNlbGYpOgorICAgIEB1bml0dGVzdC5za2lwKCd0ZXN0IGRpc2FibGVkJykKKyAgICBkZWYgdGVzdF9zaXplZF9zdHJpbmdzKHNlbGYpOgogCiAgICAgICAgICMgTmV3IGluIHJlbGVhc2VzIGxhdGVyIHRoYW4gMC40LjA6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY19zdHJpbmcsIE5vbmUpCkBAIC0xMjUsNyArMTI0LDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3N0cmluZygyKS5yYXdbLTFdLCAiXDAwMCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNfc3RyaW5nKDIpLnJhdyksIDIpCiAKLSAgICBkZWYgWFhfdGVzdF9pbml0aWFsaXplZF9zdHJpbmdzKHNlbGYpOgorICAgIEB1bml0dGVzdC5za2lwKCd0ZXN0IGRpc2FibGVkJykKKyAgICBkZWYgdGVzdF9pbml0aWFsaXplZF9zdHJpbmdzKHNlbGYpOgogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY19zdHJpbmcoImFiIiwgNCkucmF3WzoyXSwgImFiIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3N0cmluZygiYWIiLCA0KS5yYXdbOjI6XSwgImFiIikKQEAgLTEzNCw3ICsxMzQsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfc3RyaW5nKCJhYiIsIDQpLnJhd1stMV0sICJcMDAwIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3N0cmluZygiYWIiLCAyKS5yYXcsICJhXDAwMCIpCiAKLSAgICBkZWYgWFhfdGVzdF90b29sb25nKHNlbGYpOgorICAgIEB1bml0dGVzdC5za2lwKCd0ZXN0IGRpc2FibGVkJykKKyAgICBkZWYgdGVzdF90b29sb25nKHNlbGYpOgogICAgICAgICBjcyA9IGNfc3RyaW5nKCJhYmNkZWYiKQogICAgICAgICAjIE11Y2ggdG9vIGxvbmcgc3RyaW5nOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBjcywgInZhbHVlIiwgIjEyMzQ1Njc4OTAxMjM0NSIpCkBAIC0xNDIsNTQgKzE0Myw1MyBAQAogICAgICAgICAjIE9uZSBjaGFyIHRvbyBsb25nIHZhbHVlczoKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0YXR0ciwgY3MsICJ2YWx1ZSIsICIxMjM0NTY3IikKIAotIyMgICAgZGVmIHRlc3RfcGVyZihzZWxmKToKLSMjICAgICAgICBjaGVja19wZXJmKCkKKyAgICBAdW5pdHRlc3Quc2tpcCgndGVzdCBkaXNhYmxlZCcpCisgICAgZGVmIHRlc3RfcGVyZihzZWxmKToKKyAgICAgICAgY2hlY2tfcGVyZigpCiAKLXRyeToKLSAgICBjX3djaGFyCi1leGNlcHQgTmFtZUVycm9yOgotICAgIHBhc3MKLWVsc2U6Ci0gICAgY2xhc3MgV1N0cmluZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICAgICAgZGVmIHRlc3Rfd2NoYXIoc2VsZik6Ci0gICAgICAgICAgICBjX3djaGFyKHUieCIpCi0gICAgICAgICAgICByZXByKGJ5cmVmKGNfd2NoYXIodSJ4IikpKQotICAgICAgICAgICAgY193Y2hhcigieCIpCitAbmVlZF9zeW1ib2woJ2Nfd2NoYXInKQorY2xhc3MgV1N0cmluZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF93Y2hhcihzZWxmKToKKyAgICAgICAgY193Y2hhcih1IngiKQorICAgICAgICByZXByKGJ5cmVmKGNfd2NoYXIodSJ4IikpKQorICAgICAgICBjX3djaGFyKCJ4IikKIAogCi0gICAgICAgIGRlZiBYX3Rlc3RfYmFzaWNfd3N0cmluZ3Moc2VsZik6Ci0gICAgICAgICAgICBjcyA9IGNfd3N0cmluZyh1ImFiY2RlZiIpCisgICAgQHVuaXR0ZXN0LnNraXAoJ3Rlc3QgZGlzYWJsZWQnKQorICAgIGRlZiB0ZXN0X2Jhc2ljX3dzdHJpbmdzKHNlbGYpOgorICAgICAgICBjcyA9IGNfd3N0cmluZyh1ImFiY2RlZiIpCiAKLSAgICAgICAgICAgICMgWFhYIFRoaXMgYmVoYXZpb3VyIGlzIGFib3V0IHRvIGNoYW5nZToKLSAgICAgICAgICAgICMgbGVuIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIGJ1ZmZlciBpbiBieXRlcy4KLSAgICAgICAgICAgICMgVGhpcyBpbmNsdWRlcyB0aGUgdGVybWluYXRpbmcgTlVMIGNoYXJhY3Rlci4KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGNzKSwgMTQpCisgICAgICAgICMgWFhYIFRoaXMgYmVoYXZpb3VyIGlzIGFib3V0IHRvIGNoYW5nZToKKyAgICAgICAgIyBsZW4gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgYnVmZmVyIGluIGJ5dGVzLgorICAgICAgICAjIFRoaXMgaW5jbHVkZXMgdGhlIHRlcm1pbmF0aW5nIE5VTCBjaGFyYWN0ZXIuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGNzKSwgMTQpCiAKLSAgICAgICAgICAgICMgVGhlIHZhbHVlIHByb3BlcnR5IGlzIHRoZSBzdHJpbmcgdXAgdG8gdGhlIGZpcnN0IHRlcm1pbmF0aW5nIE5VTC4KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MudmFsdWUsIHUiYWJjZGVmIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY193c3RyaW5nKHUiYWJjXDAwMGRlZiIpLnZhbHVlLCB1ImFiYyIpCisgICAgICAgICMgVGhlIHZhbHVlIHByb3BlcnR5IGlzIHRoZSBzdHJpbmcgdXAgdG8gdGhlIGZpcnN0IHRlcm1pbmF0aW5nIE5VTC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjcy52YWx1ZSwgdSJhYmNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfd3N0cmluZyh1ImFiY1wwMDBkZWYiKS52YWx1ZSwgdSJhYmMiKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfd3N0cmluZyh1ImFiY1wwMDBkZWYiKS52YWx1ZSwgdSJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfd3N0cmluZyh1ImFiY1wwMDBkZWYiKS52YWx1ZSwgdSJhYmMiKQogCi0gICAgICAgICAgICAjIFRoZSByYXcgcHJvcGVydHkgaXMgdGhlIHRvdGFsIGJ1ZmZlciBjb250ZW50czoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MucmF3LCB1ImFiY2RlZlwwMDAiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3dzdHJpbmcodSJhYmNcMDAwZGVmIikucmF3LCB1ImFiY1wwMDBkZWZcMDAwIikKKyAgICAgICAgIyBUaGUgcmF3IHByb3BlcnR5IGlzIHRoZSB0b3RhbCBidWZmZXIgY29udGVudHM6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MucmF3LCB1ImFiY2RlZlwwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfd3N0cmluZyh1ImFiY1wwMDBkZWYiKS5yYXcsIHUiYWJjXDAwMGRlZlwwMDAiKQogCi0gICAgICAgICAgICAjIFdlIGNhbiBjaGFuZ2UgdGhlIHZhbHVlOgotICAgICAgICAgICAgY3MudmFsdWUgPSB1ImFiIgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjcy52YWx1ZSwgdSJhYiIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNzLnJhdywgdSJhYlwwMDBcMDAwXDAwMFwwMDBcMDAwIikKKyAgICAgICAgIyBXZSBjYW4gY2hhbmdlIHRoZSB2YWx1ZToKKyAgICAgICAgY3MudmFsdWUgPSB1ImFiIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNzLnZhbHVlLCB1ImFiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjcy5yYXcsIHUiYWJcMDAwXDAwMFwwMDBcMDAwXDAwMCIpCiAKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY193c3RyaW5nLCAiMTIzIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNfd3N0cmluZywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjX3dzdHJpbmcsICIxMjMiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjX3dzdHJpbmcsIDApCiAKLSAgICAgICAgZGVmIFhfdGVzdF90b29sb25nKHNlbGYpOgotICAgICAgICAgICAgY3MgPSBjX3dzdHJpbmcodSJhYmNkZWYiKQotICAgICAgICAgICAgIyBNdWNoIHRvbyBsb25nIHN0cmluZzoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGF0dHIsIGNzLCAidmFsdWUiLCB1IjEyMzQ1Njc4OTAxMjM0NSIpCisgICAgQHVuaXR0ZXN0LnNraXAoJ3Rlc3QgZGlzYWJsZWQnKQorICAgIGRlZiB0ZXN0X3Rvb2xvbmcoc2VsZik6CisgICAgICAgIGNzID0gY193c3RyaW5nKHUiYWJjZGVmIikKKyAgICAgICAgIyBNdWNoIHRvbyBsb25nIHN0cmluZzoKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0YXR0ciwgY3MsICJ2YWx1ZSIsIHUiMTIzNDU2Nzg5MDEyMzQ1IikKIAotICAgICAgICAgICAgIyBPbmUgY2hhciB0b28gbG9uZyB2YWx1ZXM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBjcywgInZhbHVlIiwgdSIxMjM0NTY3IikKKyAgICAgICAgIyBPbmUgY2hhciB0b28gbG9uZyB2YWx1ZXM6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGF0dHIsIGNzLCAidmFsdWUiLCB1IjEyMzQ1NjciKQogCiAKIGRlZiBydW5fdGVzdChyZXAsIG1zZywgZnVuYywgYXJnKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5CmluZGV4IGJhN2Q4YzAuLjJmYTQyYmQgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weQpAQCAtMSw1ICsxLDYgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IG5lZWRfc3ltYm9sCiBmcm9tIHN0cnVjdCBpbXBvcnQgY2FsY3NpemUKIGltcG9ydCBfdGVzdGNhcGkKIApAQCAtMjkxLDEyICsyOTIsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGhvbmUubnVtYmVyLCAiNTY3OCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5hZ2UsIDUpCiAKKyAgICBAbmVlZF9zeW1ib2woJ2Nfd2NoYXInKQogICAgIGRlZiB0ZXN0X3N0cnVjdHVyZXNfd2l0aF93Y2hhcihzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgY193Y2hhcgotICAgICAgICBleGNlcHQgTmFtZUVycm9yOgotICAgICAgICAgICAgcmV0dXJuICMgbm8gdW5pY29kZQotCiAgICAgICAgIGNsYXNzIFBlcnNvblcoU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gWygibmFtZSIsIGNfd2NoYXIgKiAxMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImFnZSIsIGNfaW50KV0KQEAgLTM2MCwxNCArMzU3LDE0IEBACiAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGRldGFpbDoKICAgICAgICAgICAgIHJldHVybiBkZXRhaWwuX19jbGFzc19fLCBzdHIoZGV0YWlsKQogCi0KLSMjICAgIGRlZiB0ZXN0X3N1YmNsYXNzX2NyZWF0aW9uKHNlbGYpOgotIyMgICAgICAgIG1ldGEgPSB0eXBlKFN0cnVjdHVyZSkKLSMjICAgICAgICAjIHNhbWUgYXMgJ2NsYXNzIFgoU3RydWN0dXJlKTogcGFzcycKLSMjICAgICAgICAjIGZhaWxzLCBzaW5jZSB3ZSBuZWVkIGVpdGhlciBhIF9maWVsZHNfIG9yIGEgX2Fic3RyYWN0XyBhdHRyaWJ1dGUKLSMjICAgICAgICBjbHMsIG1zZyA9IHNlbGYuZ2V0X2V4Y2VwdChtZXRhLCAiWCIsIChTdHJ1Y3R1cmUsKSwge30pCi0jIyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoY2xzLCBtc2cpLAotIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBdHRyaWJ1dGVFcnJvciwgImNsYXNzIG11c3QgZGVmaW5lIGEgJ19maWVsZHNfJyBhdHRyaWJ1dGUiKSkKKyAgICBAdW5pdHRlc3Quc2tpcCgndGVzdCBkaXNhYmxlZCcpCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NfY3JlYXRpb24oc2VsZik6CisgICAgICAgIG1ldGEgPSB0eXBlKFN0cnVjdHVyZSkKKyAgICAgICAgIyBzYW1lIGFzICdjbGFzcyBYKFN0cnVjdHVyZSk6IHBhc3MnCisgICAgICAgICMgZmFpbHMsIHNpbmNlIHdlIG5lZWQgZWl0aGVyIGEgX2ZpZWxkc18gb3IgYSBfYWJzdHJhY3RfIGF0dHJpYnV0ZQorICAgICAgICBjbHMsIG1zZyA9IHNlbGYuZ2V0X2V4Y2VwdChtZXRhLCAiWCIsIChTdHJ1Y3R1cmUsKSwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNscywgbXNnKSwKKyAgICAgICAgICAgICAgICAoQXR0cmlidXRlRXJyb3IsICJjbGFzcyBtdXN0IGRlZmluZSBhICdfZmllbGRzXycgYXR0cmlidXRlIikpCiAKICAgICBkZWYgdGVzdF9hYnN0cmFjdF9jbGFzcyhzZWxmKToKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3VuaWNvZGUucHkKaW5kZXggNjU1NzQ3OS4uMWRhNWEyNSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5CkBAIC0xLDEyOSArMSwxMzggQEAKICMgY29kaW5nOiBsYXRpbi0xCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBjdHlwZXMKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IG5lZWRfc3ltYm9sCitpbXBvcnQgX2N0eXBlc190ZXN0CiAKLXRyeToKLSAgICBjdHlwZXMuY193Y2hhcgotZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgIHBhc3MKLWVsc2U6Ci0gICAgaW1wb3J0IF9jdHlwZXNfdGVzdAotICAgIGRsbCA9IGN0eXBlcy5DRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKLSAgICB3Y3NsZW4gPSBkbGwubXlfd2NzbGVuCi0gICAgd2NzbGVuLmFyZ3R5cGVzID0gW2N0eXBlcy5jX3djaGFyX3BdCitAbmVlZF9zeW1ib2woJ2Nfd2NoYXInKQorY2xhc3MgVW5pY29kZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICBkbGwgPSBjdHlwZXMuQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIGNscy53Y3NsZW4gPSBkbGwubXlfd2NzbGVuCisgICAgICAgIGNscy53Y3NsZW4uYXJndHlwZXMgPSBbY3R5cGVzLmNfd2NoYXJfcF0KKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucHJldl9jb252X21vZGUgPSBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKIAorICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoKnNlbGYucHJldl9jb252X21vZGUpCiAKLSAgICBjbGFzcyBVbmljb2RlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgotICAgICAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgICAgICBzZWxmLnByZXZfY29udl9tb2RlID0gY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCisgICAgZGVmIHRlc3RfYXNjaWlfc3RyaWN0KHNlbGYpOgorICAgICAgICB3Y3NsZW4gPSBzZWxmLndjc2xlbgorICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKyAgICAgICAgIyBubyBjb252ZXJzaW9ucyB0YWtlIHBsYWNlIHdpdGggdW5pY29kZSBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQorICAgICAgICAjIHN0cmluZyBhcmdzIGFyZSBjb252ZXJ0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjdHlwZXMuQXJndW1lbnRFcnJvciwgd2NzbGVuLCAiYWLkIikKIAotICAgICAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgqc2VsZi5wcmV2X2NvbnZfbW9kZSkKKyAgICBkZWYgdGVzdF9hc2NpaV9yZXBsYWNlKHNlbGYpOgorICAgICAgICB3Y3NsZW4gPSBzZWxmLndjc2xlbgorICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigiYWLkIiksIDMpCiAKLSAgICAgICAgZGVmIHRlc3RfYXNjaWlfc3RyaWN0KHNlbGYpOgotICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCi0gICAgICAgICAgICAjIG5vIGNvbnZlcnNpb25zIHRha2UgcGxhY2Ugd2l0aCB1bmljb2RlIGFyZ3VtZW50cwotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKLSAgICAgICAgICAgICMgc3RyaW5nIGFyZ3MgYXJlIGNvbnZlcnRlZAotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3R5cGVzLkFyZ3VtZW50RXJyb3IsIHdjc2xlbiwgImFi5CIpCisgICAgZGVmIHRlc3RfYXNjaWlfaWdub3JlKHNlbGYpOgorICAgICAgICB3Y3NsZW4gPSBzZWxmLndjc2xlbgorICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQorICAgICAgICAjIGlnbm9yZSBlcnJvciBtb2RlIHNraXBzIG5vbi1hc2NpaSBjaGFyYWN0ZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYmMiKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oIuT2/N8iKSwgMCkKIAotICAgICAgICBkZWYgdGVzdF9hc2NpaV9yZXBsYWNlKHNlbGYpOgotICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInJlcGxhY2UiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYmMiKSwgMykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYuQiKSwgMykKKyAgICBkZWYgdGVzdF9sYXRpbjFfc3RyaWN0KHNlbGYpOgorICAgICAgICB3Y3NsZW4gPSBzZWxmLndjc2xlbgorICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgibGF0aW4tMSIsICJzdHJpY3QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiXHUyMDcwIiksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYmMiKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oIuT2/N8iKSwgNCkKIAotICAgICAgICBkZWYgdGVzdF9hc2NpaV9pZ25vcmUoc2VsZik6Ci0gICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiXHUyMDcwIiksIDMpCi0gICAgICAgICAgICAjIGlnbm9yZSBlcnJvciBtb2RlIHNraXBzIG5vbi1hc2NpaSBjaGFyYWN0ZXJzCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigiYWJjIiksIDMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigi5Pb83yIpLCAwKQorICAgIGRlZiB0ZXN0X2J1ZmZlcnMoc2VsZik6CisgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQorICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihidWYpLCAzKzEpCiAKLSAgICAgICAgZGVmIHRlc3RfbGF0aW4xX3N0cmljdChzZWxmKToKLSAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJsYXRpbi0xIiwgInN0cmljdCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oIuT2/N8iKSwgNCkKKyAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInJlcGxhY2UiKQorICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJhYuT2/CIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzpdLCB1ImFiXHVGRkZEXHVGRkZEXHVGRkZEXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Ol0sIHUiYWJcdUZGRkRcdUZGRkRcdUZGRkRcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCB1IlwwXHVGRkZEXHVGRkZEXHVGRkZEYmEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6OjJdLCB1ImFcdUZGRkRcdUZGRkQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls2OjU6LTFdLCB1IiIpCiAKLSAgICAgICAgZGVmIHRlc3RfYnVmZmVycyhzZWxmKToKLSAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQotICAgICAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigiYWJjIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJ1ZiksIDMrMSkKKyAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgImlnbm9yZSIpCisgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoImFi5Pb8IikKKyAgICAgICAgIyBpcyB0aGF0IGNvcnJlY3Q/IG5vdCBzdXJlLiAgQnV0IHdpdGggJ2lnbm9yZScsIHlvdSBnZXQgd2hhdCB5b3UgcGF5IGZvci4uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzpdLCB1ImFiXDBcMFwwXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Ol0sIHUiYWJcMFwwXDBcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCB1IlwwXDBcMFwwYmEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6OjJdLCB1ImFcMFwwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbNjo1Oi0xXSwgdSIiKQogCi0gICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCi0gICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJhYuT2/CIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6XSwgdSJhYlx1RkZGRFx1RkZGRFx1RkZGRFwwIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgdSJhYlx1RkZGRFx1RkZGRFx1RkZGRFwwIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCB1IlwwXHVGRkZEXHVGRkZEXHVGRkZEYmEiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjoyXSwgdSJhXHVGRkZEXHVGRkZEIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzY6NTotMV0sIHUiIikKK0BuZWVkX3N5bWJvbCgnY193Y2hhcicpCitjbGFzcyBTdHJpbmdUZXN0Q2FzZShVbmljb2RlVGVzdENhc2UpOgorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHN1cGVyKFN0cmluZ1Rlc3RDYXNlLCBjbHMpLnNldFVwQ2xhc3MoKQorICAgICAgICBjbHMuZnVuYyA9IGN0eXBlcy5DRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykuX3Rlc3RmdW5jX3BfcAogCi0gICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKLSAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoImFi5Pb8IikKLSAgICAgICAgICAgICMgaXMgdGhhdCBjb3JyZWN0PyBub3Qgc3VyZS4gIEJ1dCB3aXRoICdpZ25vcmUnLCB5b3UgZ2V0IHdoYXQgeW91IHBheSBmb3IuLgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sIHUiYWJcMFwwXDBcMCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Ol0sIHUiYWJcMFwwXDBcMCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Oi0xXSwgdSJcMFwwXDBcMGJhIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6Ml0sIHUiYVwwXDAiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbNjo1Oi0xXSwgdSIiKQorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZnVuYyA9IHNlbGYuZnVuYworICAgICAgICBzZWxmLnByZXZfY29udl9tb2RlID0gY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBbY3R5cGVzLmNfY2hhcl9wXQorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjdHlwZXMuY19jaGFyX3AKIAotICAgIGltcG9ydCBfY3R5cGVzX3Rlc3QKLSAgICBmdW5jID0gY3R5cGVzLkNETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKS5fdGVzdGZ1bmNfcF9wCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBmdW5jID0gc2VsZi5mdW5jCisgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCpzZWxmLnByZXZfY29udl9tb2RlKQorICAgICAgICBmdW5jLmFyZ3R5cGVzID0gTm9uZQorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjdHlwZXMuY19pbnQKIAotICAgIGNsYXNzIFN0cmluZ1Rlc3RDYXNlKFVuaWNvZGVUZXN0Q2FzZSk6Ci0gICAgICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgICAgIHNlbGYucHJldl9jb252X21vZGUgPSBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKLSAgICAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBbY3R5cGVzLmNfY2hhcl9wXQotICAgICAgICAgICAgZnVuYy5yZXN0eXBlID0gY3R5cGVzLmNfY2hhcl9wCisgICAgZGVmIHRlc3RfYXNjaWlfcmVwbGFjZShzZWxmKToKKyAgICAgICAgZnVuYyA9IHNlbGYuZnVuYworICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKCJhYmMiKSwgImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1ImFiYyIpLCAiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3R5cGVzLkFyZ3VtZW50RXJyb3IsIGZ1bmMsIHUiYWLkIikKIAotICAgICAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgqc2VsZi5wcmV2X2NvbnZfbW9kZSkKLSAgICAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBOb25lCi0gICAgICAgICAgICBmdW5jLnJlc3R5cGUgPSBjdHlwZXMuY19pbnQKKyAgICBkZWYgdGVzdF9hc2NpaV9pZ25vcmUoc2VsZik6CisgICAgICAgIGZ1bmMgPSBzZWxmLmZ1bmMKKyAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgImlnbm9yZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYygiYWJjIiksICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmModSJhYmMiKSwgImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1IuT2/N8iKSwgIiIpCiAKLSAgICAgICAgZGVmIHRlc3RfYXNjaWlfcmVwbGFjZShzZWxmKToKLSAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKCJhYmMiKSwgImFiYyIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmModSJhYmMiKSwgImFiYyIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjdHlwZXMuQXJndW1lbnRFcnJvciwgZnVuYywgdSJhYuQiKQorICAgIGRlZiB0ZXN0X2FzY2lpX3JlcGxhY2Uoc2VsZik6CisgICAgICAgIGZ1bmMgPSBzZWxmLmZ1bmMKKyAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInJlcGxhY2UiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHUiYWJjIiksICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmModSLk9vzfIiksICI/Pz8/IikKIAotICAgICAgICBkZWYgdGVzdF9hc2NpaV9pZ25vcmUoc2VsZik6Ci0gICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYygiYWJjIiksICJhYmMiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHUiYWJjIiksICJhYmMiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHUi5Pb83yIpLCAiIikKKyAgICBkZWYgdGVzdF9idWZmZXJzKHNlbGYpOgorICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKyAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKHUiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYnVmKSwgMysxKQogCi0gICAgICAgIGRlZiB0ZXN0X2FzY2lpX3JlcGxhY2Uoc2VsZik6Ci0gICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1ImFiYyIpLCAiYWJjIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1IuT2/N8iKSwgIj8/Pz8iKQorICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCisgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcih1ImFi5Pb8IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sICJhYj8/P1wwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjpdLCAiYWI/Pz9cMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCAiXDA/Pz9iYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6Ml0sICJhPz8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls2OjU6LTFdLCAiIikKIAotICAgICAgICBkZWYgdGVzdF9idWZmZXJzKHNlbGYpOgotICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCi0gICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYmMiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYnVmKSwgMysxKQotCi0gICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCi0gICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYuT2/CIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6XSwgImFiPz8/XDAiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjpdLCAiYWI/Pz9cMCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Oi0xXSwgIlwwPz8/YmEiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjoyXSwgImE/PyIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls2OjU6LTFdLCAiIikKLQotICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgImlnbm9yZSIpCi0gICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYuT2/CIpCi0gICAgICAgICAgICAjIGlzIHRoYXQgY29ycmVjdD8gbm90IHN1cmUuICBCdXQgd2l0aCAnaWdub3JlJywgeW91IGdldCB3aGF0IHlvdSBwYXkgZm9yLi4KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzpdLCAiYWJcMFwwXDBcMCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Ol0sICJhYlwwXDBcMFwwIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCAiXDBcMFwwXDBiYSIpCisgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJpZ25vcmUiKQorICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYuT2/CIpCisgICAgICAgICMgaXMgdGhhdCBjb3JyZWN0PyBub3Qgc3VyZS4gIEJ1dCB3aXRoICdpZ25vcmUnLCB5b3UgZ2V0IHdoYXQgeW91IHBheSBmb3IuLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6XSwgImFiXDBcMFwwXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Ol0sICJhYlwwXDBcMFwwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjotMV0sICJcMFwwXDBcMGJhIikKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weQppbmRleCA0Y2JmZDRiLi4xNGQ2OWZlIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YWx1ZXMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5CkBAIC0zLDYgKzMsNyBAQAogIiIiCiAKIGltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cwogZnJvbSBjdHlwZXMgaW1wb3J0ICoKIAogaW1wb3J0IF9jdHlwZXNfdGVzdApAQCAtMjEsNjIgKzIyLDYzIEBACiAgICAgICAgIGN0ZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNfaW50LmluX2RsbCwgY3RkbGwsICJVbmRlZmluZWRfU3ltYm9sIikKIAotICAgIGNsYXNzIFdpbl9WYWx1ZXNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgICAgICIiIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdoZW4gcHl0aG9uIGl0c2VsZiBpcyBhIGRsbC9zaGFyZWQgbGlicmFyeSIiIgorQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICd3aW4zMicsICdXaW5kb3dzLXNwZWNpZmljIHRlc3QnKQorY2xhc3MgV2luX1ZhbHVlc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aGVuIHB5dGhvbiBpdHNlbGYgaXMgYSBkbGwvc2hhcmVkIGxpYnJhcnkiIiIKIAotICAgICAgICBkZWYgdGVzdF9vcHRpbWl6ZWZsYWcoc2VsZik6Ci0gICAgICAgICAgICAjIFRoaXMgdGVzdCBhY2Nlc3NlcyB0aGUgUHlfT3B0aW1pemVGbGFnIGludGdlciwgd2hpY2ggaXMKLSAgICAgICAgICAgICMgZXhwb3J0ZWQgYnkgdGhlIFB5dGhvbiBkbGwuCisgICAgZGVmIHRlc3Rfb3B0aW1pemVmbGFnKHNlbGYpOgorICAgICAgICAjIFRoaXMgdGVzdCBhY2Nlc3NlcyB0aGUgUHlfT3B0aW1pemVGbGFnIGludGdlciwgd2hpY2ggaXMKKyAgICAgICAgIyBleHBvcnRlZCBieSB0aGUgUHl0aG9uIGRsbC4KIAotICAgICAgICAgICAgIyBJdCdzIHZhbHVlIGlzIHNldCBkZXBlbmRpbmcgb24gdGhlIC1PIGFuZCAtT08gZmxhZ3M6Ci0gICAgICAgICAgICAjIGlmIG5vdCBnaXZlbiwgaXQgaXMgMCBhbmQgX19kZWJ1Z19fIGlzIDEuCi0gICAgICAgICAgICAjIElmIC1PIGlzIGdpdmVuLCB0aGUgZmxhZyBpcyAxLCBmb3IgLU9PIGl0IGlzIDIuCi0gICAgICAgICAgICAjIGRvY3N0cmluZ3MgYXJlIGFsc28gcmVtb3ZlZCBpbiB0aGUgbGF0dGVyIGNhc2UuCi0gICAgICAgICAgICBvcHQgPSBjX2ludC5pbl9kbGwocHlkbGwsICJQeV9PcHRpbWl6ZUZsYWciKS52YWx1ZQotICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0LCAwKQotICAgICAgICAgICAgZWxpZiBWYWx1ZXNUZXN0Q2FzZS5fX2RvY19fIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0LCAxKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdCwgMikKKyAgICAgICAgIyBJdCdzIHZhbHVlIGlzIHNldCBkZXBlbmRpbmcgb24gdGhlIC1PIGFuZCAtT08gZmxhZ3M6CisgICAgICAgICMgaWYgbm90IGdpdmVuLCBpdCBpcyAwIGFuZCBfX2RlYnVnX18gaXMgMS4KKyAgICAgICAgIyBJZiAtTyBpcyBnaXZlbiwgdGhlIGZsYWcgaXMgMSwgZm9yIC1PTyBpdCBpcyAyLgorICAgICAgICAjIGRvY3N0cmluZ3MgYXJlIGFsc28gcmVtb3ZlZCBpbiB0aGUgbGF0dGVyIGNhc2UuCisgICAgICAgIG9wdCA9IGNfaW50LmluX2RsbChweXRob25hcGksICJQeV9PcHRpbWl6ZUZsYWciKS52YWx1ZQorICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdCwgMCkKKyAgICAgICAgZWxpZiBWYWx1ZXNUZXN0Q2FzZS5fX2RvY19fIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQsIDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdCwgMikKIAotICAgICAgICBkZWYgdGVzdF9mcm96ZW50YWJsZShzZWxmKToKLSAgICAgICAgICAgICMgUHl0aG9uIGV4cG9ydHMgYSBQeUltcG9ydF9Gcm96ZW5Nb2R1bGVzIHN5bWJvbC4gVGhpcyBpcyBhCi0gICAgICAgICAgICAjIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc3RydWN0IF9mcm96ZW4gZW50cmllcy4gIFRoZSBlbmQgb2YgdGhlCi0gICAgICAgICAgICAjIGFycmF5IGlzIG1hcmtlZCBieSBhbiBlbnRyeSBjb250YWluaW5nIGEgTlVMTCBuYW1lIGFuZCB6ZXJvCi0gICAgICAgICAgICAjIHNpemUuCisgICAgZGVmIHRlc3RfZnJvemVudGFibGUoc2VsZik6CisgICAgICAgICMgUHl0aG9uIGV4cG9ydHMgYSBQeUltcG9ydF9Gcm96ZW5Nb2R1bGVzIHN5bWJvbC4gVGhpcyBpcyBhCisgICAgICAgICMgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzdHJ1Y3QgX2Zyb3plbiBlbnRyaWVzLiAgVGhlIGVuZCBvZiB0aGUKKyAgICAgICAgIyBhcnJheSBpcyBtYXJrZWQgYnkgYW4gZW50cnkgY29udGFpbmluZyBhIE5VTEwgbmFtZSBhbmQgemVybworICAgICAgICAjIHNpemUuCiAKLSAgICAgICAgICAgICMgSW4gc3RhbmRhcmQgUHl0aG9uLCB0aGlzIHRhYmxlIGNvbnRhaW5zIGEgX19oZWxsb19fCi0gICAgICAgICAgICAjIG1vZHVsZSwgYW5kIGEgX19waGVsbG9fXyBwYWNrYWdlIGNvbnRhaW5pbmcgYSBzcGFtCi0gICAgICAgICAgICAjIG1vZHVsZS4KLSAgICAgICAgICAgIGNsYXNzIHN0cnVjdF9mcm96ZW4oU3RydWN0dXJlKToKLSAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoIm5hbWUiLCBjX2NoYXJfcCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjb2RlIiwgUE9JTlRFUihjX3VieXRlKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJzaXplIiwgY19pbnQpXQotICAgICAgICAgICAgRnJvemVuVGFibGUgPSBQT0lOVEVSKHN0cnVjdF9mcm96ZW4pCisgICAgICAgICMgSW4gc3RhbmRhcmQgUHl0aG9uLCB0aGlzIHRhYmxlIGNvbnRhaW5zIGEgX19oZWxsb19fCisgICAgICAgICMgbW9kdWxlLCBhbmQgYSBfX3BoZWxsb19fIHBhY2thZ2UgY29udGFpbmluZyBhIHNwYW0KKyAgICAgICAgIyBtb2R1bGUuCisgICAgICAgIGNsYXNzIHN0cnVjdF9mcm96ZW4oU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygibmFtZSIsIGNfY2hhcl9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiY29kZSIsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJzaXplIiwgY19pbnQpXQorICAgICAgICBGcm96ZW5UYWJsZSA9IFBPSU5URVIoc3RydWN0X2Zyb3plbikKIAotICAgICAgICAgICAgZnQgPSBGcm96ZW5UYWJsZS5pbl9kbGwocHlkbGwsICJQeUltcG9ydF9Gcm96ZW5Nb2R1bGVzIikKLSAgICAgICAgICAgICMgZnQgaXMgYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3RfZnJvemVuIGVudHJpZXM6Ci0gICAgICAgICAgICBpdGVtcyA9IFtdCi0gICAgICAgICAgICBmb3IgZW50cnkgaW4gZnQ6Ci0gICAgICAgICAgICAgICAgIyBUaGlzIGlzIGRhbmdlcm91cy4gV2UgKmNhbiogaXRlcmF0ZSBvdmVyIGEgcG9pbnRlciwgYnV0Ci0gICAgICAgICAgICAgICAgIyB0aGUgbG9vcCB3aWxsIG5vdCB0ZXJtaW5hdGUgKG1heWJlIHdpdGggYW4gYWNjZXNzCi0gICAgICAgICAgICAgICAgIyB2aW9sYXRpb247LSkgYmVjYXVzZSB0aGUgcG9pbnRlciBpbnN0YW5jZSBoYXMgbm8gc2l6ZS4KLSAgICAgICAgICAgICAgICBpZiBlbnRyeS5uYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKChlbnRyeS5uYW1lLCBlbnRyeS5zaXplKSkKLSAgICAgICAgICAgIGltcG9ydCBzeXMKLSAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID49ICgyLCAzKToKLSAgICAgICAgICAgICAgICBleHBlY3RlZCA9IFsoIl9faGVsbG9fXyIsIDEwNCksICgiX19waGVsbG9fXyIsIC0xMDQpLCAoIl9fcGhlbGxvX18uc3BhbSIsIDEwNCldCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gWygiX19oZWxsb19fIiwgMTAwKSwgKCJfX3BoZWxsb19fIiwgLTEwMCksICgiX19waGVsbG9fXy5zcGFtIiwgMTAwKV0KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbXMsIGV4cGVjdGVkKQorICAgICAgICBmdCA9IEZyb3plblRhYmxlLmluX2RsbChweXRob25hcGksICJQeUltcG9ydF9Gcm96ZW5Nb2R1bGVzIikKKyAgICAgICAgIyBmdCBpcyBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdF9mcm96ZW4gZW50cmllczoKKyAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICBmb3IgZW50cnkgaW4gZnQ6CisgICAgICAgICAgICAjIFRoaXMgaXMgZGFuZ2Vyb3VzLiBXZSAqY2FuKiBpdGVyYXRlIG92ZXIgYSBwb2ludGVyLCBidXQKKyAgICAgICAgICAgICMgdGhlIGxvb3Agd2lsbCBub3QgdGVybWluYXRlIChtYXliZSB3aXRoIGFuIGFjY2VzcworICAgICAgICAgICAgIyB2aW9sYXRpb247LSkgYmVjYXVzZSB0aGUgcG9pbnRlciBpbnN0YW5jZSBoYXMgbm8gc2l6ZS4KKyAgICAgICAgICAgIGlmIGVudHJ5Lm5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaXRlbXMuYXBwZW5kKChlbnRyeS5uYW1lLCBlbnRyeS5zaXplKSkKIAotICAgICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IF9wb2ludGVyX3R5cGVfY2FjaGUKLSAgICAgICAgICAgIGRlbCBfcG9pbnRlcl90eXBlX2NhY2hlW3N0cnVjdF9mcm96ZW5dCisgICAgICAgIGV4cGVjdGVkID0gWygiX19oZWxsb19fIiwgMTA0KSwKKyAgICAgICAgICAgICAgICAgICAgKCJfX3BoZWxsb19fIiwgLTEwNCksCisgICAgICAgICAgICAgICAgICAgICgiX19waGVsbG9fXy5zcGFtIiwgMTA0KV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtcywgZXhwZWN0ZWQpCiAKLSAgICAgICAgZGVmIHRlc3RfdW5kZWZpbmVkKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY19pbnQuaW5fZGxsLCBweWRsbCwgIlVuZGVmaW5lZF9TeW1ib2wiKQorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgX3BvaW50ZXJfdHlwZV9jYWNoZQorICAgICAgICBkZWwgX3BvaW50ZXJfdHlwZV9jYWNoZVtzdHJ1Y3RfZnJvemVuXQorCisgICAgZGVmIHRlc3RfdW5kZWZpbmVkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjX2ludC5pbl9kbGwsIHB5dGhvbmFwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZGVmaW5lZF9TeW1ib2wiKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weQppbmRleCA3N2U2ZmVhLi44MDkzZWZjIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weQpAQCAtMSw3NyArMSw3OSBAQAogIyBXaW5kb3dzIHNwZWNpZmljIHRlc3RzCiAKIGZyb20gY3R5cGVzIGltcG9ydCAqCi1mcm9tIGN0eXBlcy50ZXN0IGltcG9ydCBpc19yZXNvdXJjZV9lbmFibGVkCitmcm9tIGN0eXBlcy50ZXN0IGltcG9ydCByZXF1aXJlcwogaW1wb3J0IHVuaXR0ZXN0LCBzeXMKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0IGFzIHN1cHBvcnQKIAogaW1wb3J0IF9jdHlwZXNfdGVzdAogCi1pZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIiBhbmQgc2l6ZW9mKGNfdm9pZF9wKSA9PSBzaXplb2YoY19pbnQpOgotICAgICMgT25seSB3aW5kb3dzIDMyLWJpdCBoYXMgZGlmZmVyZW50IGNhbGxpbmcgY29udmVudGlvbnMuCisjIE9ubHkgd2luZG93cyAzMi1iaXQgaGFzIGRpZmZlcmVudCBjYWxsaW5nIGNvbnZlbnRpb25zLgorQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICdXaW5kb3dzLXNwZWNpZmljIHRlc3QnKQorQHVuaXR0ZXN0LnNraXBVbmxlc3Moc2l6ZW9mKGNfdm9pZF9wKSA9PSBzaXplb2YoY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgInNpemVvZiBjX3ZvaWRfcCBhbmQgY19pbnQgZGlmZmVyIikKK2NsYXNzIFdpbmRvd3NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY2FsbGNvbnZfMShzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHN0ZGNhbGwgZnVuY3Rpb24KIAotICAgIGNsYXNzIFdpbmRvd3NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgICAgIGRlZiB0ZXN0X2NhbGxjb252XzEoc2VsZik6Ci0gICAgICAgICAgICAjIFRlc3Rpbmcgc3RkY2FsbCBmdW5jdGlvbgorICAgICAgICBJc1dpbmRvdyA9IHdpbmRsbC51c2VyMzIuSXNXaW5kb3cKKyAgICAgICAgIyBWYWx1ZUVycm9yOiBQcm9jZWR1cmUgcHJvYmFibHkgY2FsbGVkIHdpdGggbm90IGVub3VnaCBhcmd1bWVudHMKKyAgICAgICAgIyAoNCBieXRlcyBtaXNzaW5nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBJc1dpbmRvdykKIAotICAgICAgICAgICAgSXNXaW5kb3cgPSB3aW5kbGwudXNlcjMyLklzV2luZG93Ci0gICAgICAgICAgICAjIFZhbHVlRXJyb3I6IFByb2NlZHVyZSBwcm9iYWJseSBjYWxsZWQgd2l0aCBub3QgZW5vdWdoIGFyZ3VtZW50cyAoNCBieXRlcyBtaXNzaW5nKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgSXNXaW5kb3cpCisgICAgICAgICMgVGhpcyBvbmUgc2hvdWxkIHN1Y2NlZWQuLi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBJc1dpbmRvdygwKSkKIAotICAgICAgICAgICAgIyBUaGlzIG9uZSBzaG91bGQgc3VjY2VlZC4uLgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBJc1dpbmRvdygwKSkKKyAgICAgICAgIyBWYWx1ZUVycm9yOiBQcm9jZWR1cmUgcHJvYmFibHkgY2FsbGVkIHdpdGggdG9vIG1hbnkgYXJndW1lbnRzCisgICAgICAgICMgKDggYnl0ZXMgaW4gZXhjZXNzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBJc1dpbmRvdywgMCwgMCwgMCkKIAotICAgICAgICAgICAgIyBWYWx1ZUVycm9yOiBQcm9jZWR1cmUgcHJvYmFibHkgY2FsbGVkIHdpdGggdG9vIG1hbnkgYXJndW1lbnRzICg4IGJ5dGVzIGluIGV4Y2VzcykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIElzV2luZG93LCAwLCAwLCAwKQorICAgIGRlZiB0ZXN0X2NhbGxjb252XzIoc2VsZik6CisgICAgICAgICMgQ2FsbGluZyBzdGRjYWxsIGZ1bmN0aW9uIGFzIGNkZWNsCiAKLSAgICAgICAgZGVmIHRlc3RfY2FsbGNvbnZfMihzZWxmKToKLSAgICAgICAgICAgICMgQ2FsbGluZyBzdGRjYWxsIGZ1bmN0aW9uIGFzIGNkZWNsCisgICAgICAgIElzV2luZG93ID0gY2RsbC51c2VyMzIuSXNXaW5kb3cKIAotICAgICAgICAgICAgSXNXaW5kb3cgPSBjZGxsLnVzZXIzMi5Jc1dpbmRvdworICAgICAgICAjIFZhbHVlRXJyb3I6IFByb2NlZHVyZSBjYWxsZWQgd2l0aCBub3QgZW5vdWdoIGFyZ3VtZW50cworICAgICAgICAjICg0IGJ5dGVzIG1pc3NpbmcpIG9yIHdyb25nIGNhbGxpbmcgY29udmVudGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBJc1dpbmRvdywgTm9uZSkKIAotICAgICAgICAgICAgIyBWYWx1ZUVycm9yOiBQcm9jZWR1cmUgY2FsbGVkIHdpdGggbm90IGVub3VnaCBhcmd1bWVudHMgKDQgYnl0ZXMgbWlzc2luZykKLSAgICAgICAgICAgICMgb3Igd3JvbmcgY2FsbGluZyBjb252ZW50aW9uCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBJc1dpbmRvdywgTm9uZSkKK0B1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAnV2luZG93cy1zcGVjaWZpYyB0ZXN0JykKK2NsYXNzIEZ1bmN0aW9uQ2FsbFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBAcmVxdWlyZXMoIlNFSCIpCisgICAgZGVmIHRlc3RfU0VIKHNlbGYpOgorICAgICAgICAjIENhbGwgZnVuY3Rpb25zIHdpdGggaW52YWxpZCBhcmd1bWVudHMsIGFuZCBtYWtlIHN1cmUKKyAgICAgICAgIyB0aGF0IGFjY2VzcyB2aW9sYXRpb25zIGFyZSB0cmFwcGVkIGFuZCByYWlzZSBhbgorICAgICAgICAjIGV4Y2VwdGlvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCB3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQSwgMzIpCiAKLWlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgotICAgIGNsYXNzIEZ1bmN0aW9uQ2FsbFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9ub2FyZ3Moc2VsZik6CisgICAgICAgICMgVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvbiB3aW4zMiB4NjQKKyAgICAgICAgd2luZGxsLnVzZXIzMi5HZXREZXNrdG9wV2luZG93KCkKIAotICAgICAgICBpZiBpc19yZXNvdXJjZV9lbmFibGVkKCJTRUgiKToKLSAgICAgICAgICAgIGRlZiB0ZXN0X1NFSChzZWxmKToKLSAgICAgICAgICAgICAgICAjIENhbGwgZnVuY3Rpb25zIHdpdGggaW52YWxpZCBhcmd1bWVudHMsIGFuZCBtYWtlIHN1cmUKLSAgICAgICAgICAgICAgICAjIHRoYXQgYWNjZXNzIHZpb2xhdGlvbnMgYXJlIHRyYXBwZWQgYW5kIHJhaXNlIGFuCi0gICAgICAgICAgICAgICAgIyBleGNlcHRpb24uCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCB3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQSwgMzIpCitAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgJ1dpbmRvd3Mtc3BlY2lmaWMgdGVzdCcpCitjbGFzcyBUZXN0V2ludHlwZXModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X0hXTkQoc2VsZik6CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCB3aW50eXBlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZih3aW50eXBlcy5IV05EKSwgc2l6ZW9mKGNfdm9pZF9wKSkKIAotICAgICAgICBkZWYgdGVzdF9ub2FyZ3Moc2VsZik6Ci0gICAgICAgICAgICAjIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb24gd2luMzIgeDY0Ci0gICAgICAgICAgICB3aW5kbGwudXNlcjMyLkdldERlc2t0b3BXaW5kb3coKQorICAgIGRlZiB0ZXN0X1BBUkFNKHNlbGYpOgorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgd2ludHlwZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2Yod2ludHlwZXMuV1BBUkFNKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNfdm9pZF9wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2Yod2ludHlwZXMuTFBBUkFNKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNfdm9pZF9wKSkKIAotICAgIGNsYXNzIFRlc3RXaW50eXBlcyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgICAgIGRlZiB0ZXN0X0hXTkQoc2VsZik6Ci0gICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgd2ludHlwZXMKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKHdpbnR5cGVzLkhXTkQpLCBzaXplb2YoY192b2lkX3ApKQorICAgIGRlZiB0ZXN0X0NPTUVycm9yKHNlbGYpOgorICAgICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IENPTUVycm9yCisgICAgICAgIGlmIHN1cHBvcnQuSEFWRV9ET0NTVFJJTkdTOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDT01FcnJvci5fX2RvY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmFpc2VkIHdoZW4gYSBDT00gbWV0aG9kIGNhbGwgZmFpbGVkLiIpCiAKLSAgICAgICAgZGVmIHRlc3RfUEFSQU0oc2VsZik6Ci0gICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgd2ludHlwZXMKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKHdpbnR5cGVzLldQQVJBTSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY192b2lkX3ApKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2Yod2ludHlwZXMuTFBBUkFNKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjX3ZvaWRfcCkpCi0KLSAgICAgICAgZGVmIHRlc3RfQ09NRXJyb3Ioc2VsZik6Ci0gICAgICAgICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IENPTUVycm9yCi0gICAgICAgICAgICBpZiBzdXBwb3J0LkhBVkVfRE9DU1RSSU5HUzoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENPTUVycm9yLl9fZG9jX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmFpc2VkIHdoZW4gYSBDT00gbWV0aG9kIGNhbGwgZmFpbGVkLiIpCi0KLSAgICAgICAgICAgIGV4ID0gQ09NRXJyb3IoLTEsICJ0ZXh0IiwgKCJkZXRhaWxzIiwpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5ocmVzdWx0LCAtMSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXgudGV4dCwgInRleHQiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5kZXRhaWxzLCAoImRldGFpbHMiLCkpCisgICAgICAgIGV4ID0gQ09NRXJyb3IoLTEsICJ0ZXh0IiwgKCJkZXRhaWxzIiwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmhyZXN1bHQsIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LnRleHQsICJ0ZXh0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5kZXRhaWxzLCAoImRldGFpbHMiLCkpCiAKIGNsYXNzIFN0cnVjdHVyZXModW5pdHRlc3QuVGVzdENhc2UpOgotCiAgICAgZGVmIHRlc3Rfc3RydWN0X2J5X3ZhbHVlKHNlbGYpOgogICAgICAgICBjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19sb25nKSwKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbnR5cGVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2ludHlwZXMucHkKaW5kZXggODA2ZmNjZS4uNzE0NDJkZiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2ludHlwZXMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2ludHlwZXMucHkKQEAgLTEsMTQgKzEsMTIgQEAKIGltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogCi1pZiBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpOgotICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdXaW5kb3dzLW9ubHkgdGVzdCcpCi0KIGZyb20gY3R5cGVzIGltcG9ydCAqCi1mcm9tIGN0eXBlcyBpbXBvcnQgd2ludHlwZXMKIAorQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpLCAnV2luZG93cy1vbmx5IHRlc3QnKQogY2xhc3MgV2luVHlwZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF92YXJpYW50X2Jvb2woc2VsZik6CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCB3aW50eXBlcwogICAgICAgICAjIHJlYWRzIDE2LWJpdHMgZnJvbSBtZW1vcnksIGFueXRoaW5nIG5vbi16ZXJvIGlzIFRydWUKICAgICAgICAgZm9yIHRydWVfdmFsdWUgaW4gKDEsIDMyNzY3LCAzMjc2OCwgNjU1MzUsIDY1NTM3KToKICAgICAgICAgICAgIHRydWUgPSBQT0lOVEVSKGNfaW50MTYpKGNfaW50MTYodHJ1ZV92YWx1ZSkpCmRpZmYgLS1naXQgYS9NaXNjL05FV1MgYi9NaXNjL05FV1MKaW5kZXggNzc1OWVkYi4uYjA5YmQ4NCAxMDA2NDQKLS0tIGEvTWlzYy9ORVdTCisrKyBiL01pc2MvTkVXUwpAQCAtNjcsNiArNjcsOSBAQAogVGVzdHMKIC0tLS0tCiAKKy0gSXNzdWUgIzE5NDkzOiBSZWZhY3RvcmVkIHRoZSBjdHlwZXMgdGVzdCBwYWNrYWdlIHRvIHNraXAgdGVzdHMgZXhwbGljaXRseQorICByYXRoZXIgdGhhbiBzaWxlbnRseS4KKwogLSBJc3N1ZSAjMTg0OTI6IEFsbCByZXNvdXJjZXMgYXJlIG5vdyBhbGxvd2VkIHdoZW4gdGVzdHMgYXJlIG5vdCBydW4gYnkKICAgcmVncnRlc3QucHkuCiAK