ZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpc3RfdGVzdHMucHkgYi9MaWIvdGVzdC9saXN0X3Rlc3RzLnB5CmluZGV4IDkxNjhjZmMuLmU0MjU0ZWYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2xpc3RfdGVzdHMucHkKKysrIGIvTGliL3Rlc3QvbGlzdF90ZXN0cy5weQpAQCAtMzYsNyArMzYsNyBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGEwKSwgc3RyKGwwKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGEwKSwgcmVwcihsMCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYGEyYCwgYGwyYCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGEyKSwgcmVwcihsMikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGEyKSwgIlswLCAxLCAyXSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihhMiksICJbMCwgMSwgMl0iKQogCkBAIC00MTksNiArNDE5LDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdS5yZXZlcnNlLCA0MikKIAogICAgIGRlZiB0ZXN0X3NvcnQoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAgICAgICAgICgidGhlIGNtcCBhcmd1bWVudCBpcyBub3Qgc3VwcG9ydGVkIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgICAgICBzZWxmLl90ZXN0X3NvcnQoKQorCisgICAgZGVmIF90ZXN0X3NvcnQoc2VsZik6CiAgICAgICAgIHUgPSBzZWxmLnR5cGUydGVzdChbMSwgMF0pCiAgICAgICAgIHUuc29ydCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSwgWzAsIDFdKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbWFwcGluZ190ZXN0cy5weSBiL0xpYi90ZXN0L21hcHBpbmdfdGVzdHMucHkKaW5kZXggYzY4NTdhYi4uNmM0ZTZlYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvbWFwcGluZ190ZXN0cy5weQorKysgYi9MaWIvdGVzdC9tYXBwaW5nX3Rlc3RzLnB5CkBAIC0xLDYgKzEsNyBAQAogIyB0ZXN0cyBjb21tb24gdG8gZGljdCBhbmQgVXNlckRpY3QKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IFVzZXJEaWN0CitpbXBvcnQgdGVzdF9zdXBwb3J0CiAKIAogY2xhc3MgQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTU0LDEzICs1NSwxNyBAQAogICAgICAgICAjbGVuCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHApLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgbGVuKHNlbGYucmVmZXJlbmNlKSkKLSAgICAgICAgI2hhc19rZXkKKyAgICAgICAgI2luCiAgICAgICAgIGZvciBrIGluIHNlbGYucmVmZXJlbmNlOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGQuaGFzX2tleShrKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhrIGluIGQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoayBpbiBkKQogICAgICAgICBmb3IgayBpbiBzZWxmLm90aGVyOgotICAgICAgICAgICAgc2VsZi5mYWlsSWYoZC5oYXNfa2V5KGspKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYoayBpbiBkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgbm90IGluIGQpCisgICAgICAgICNoYXNfa2V5CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKHF1aWV0PVRydWUpOgorICAgICAgICAgICAgZm9yIGsgaW4gc2VsZi5yZWZlcmVuY2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuaGFzX2tleShrKSkKKyAgICAgICAgICAgIGZvciBrIGluIHNlbGYub3RoZXI6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkLmhhc19rZXkoaykpCiAgICAgICAgICNjbXAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAocCxwKSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZCxkKSwgMCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfU3RyaW5nSU8ucHkgYi9MaWIvdGVzdC90ZXN0X1N0cmluZ0lPLnB5CmluZGV4IDgxZjgxZTUuLjQ3YTA3MTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfU3RyaW5nSU8ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9TdHJpbmdJTy5weQpAQCAtMTM3LDEyICsxMzcsMTAgQEAKIAogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKLSAgICAgICAgVGVzdFN0cmluZ0lPLAotICAgICAgICBUZXN0Y1N0cmluZ0lPLAotICAgICAgICBUZXN0QnVmZmVyU3RyaW5nSU8sCi0gICAgICAgIFRlc3RCdWZmZXJjU3RyaW5nSU8KLSAgICApCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0U3RyaW5nSU8sIFRlc3RjU3RyaW5nSU8pCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuX2NoZWNrX3B5M2tfd2FybmluZ3MoKCJidWZmZXIuLiBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RCdWZmZXJTdHJpbmdJTywgVGVzdEJ1ZmZlcmNTdHJpbmdJTykKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hcnJheS5weSBiL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKaW5kZXggNGM4NzBkNy4uMDFjMjIwOSAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9hcnJheS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CkBAIC03MjgsNyArNzI4LDggQEAKIAogICAgIGRlZiB0ZXN0X2J1ZmZlcihzZWxmKToKICAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKLSAgICAgICAgYiA9IGJ1ZmZlcihhKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5fY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgYiA9IGJ1ZmZlcihhKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbMF0sIGEudG9zdHJpbmcoKVswXSkKIAogICAgIGRlZiB0ZXN0X3dlYWtyZWYoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2FzdC5weSBiL0xpYi90ZXN0L3Rlc3RfYXN0LnB5CmluZGV4IDE1MzY2OTAuLjIxMjJmNjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXN0LnB5CkBAIC0yNzIsNyArMjcyLDkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYXN0LmxpdGVyYWxfZXZhbCwgJ2ZvbygpJykKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQVNUX1Rlc3RzLCBBU1RIZWxwZXJzX1Rlc3QpCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuX2NoZWNrX3B5M2tfd2FybmluZ3MoKCJiYWNrcXVvdGUgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQVNUX1Rlc3RzLCBBU1RIZWxwZXJzX1Rlc3QpCiAKIGRlZiBtYWluKCk6CiAgICAgaWYgX19uYW1lX18gIT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5IGIvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKaW5kZXggZGJmNzFiYy4uMTdiZGIyNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKQEAgLTEsNiArMSw2IEBACiAjIEF1Z21lbnRlZCBhc3NpZ25tZW50IHRlc3QuCiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBfY2hlY2tfcHkza193YXJuaW5ncwogaW1wb3J0IHVuaXR0ZXN0CiAKIApAQCAtMzIxLDcgKzMyMSw4IEBACiAnJycuc3BsaXRsaW5lcygpKQogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgcnVuX3VuaXR0ZXN0KEF1Z0Fzc2lnblRlc3QpCisgICAgd2l0aCBfY2hlY2tfcHkza193YXJuaW5ncygoImNsYXNzaWMgaW50IGRpdmlzaW9uIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHJ1bl91bml0dGVzdChBdWdBc3NpZ25UZXN0KQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JpZ21lbS5weSBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CmluZGV4IDM2MGJjYjIuLmNlYTVjY2IgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CkBAIC05NywyMSArOTcsMjEgQEAKICAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZiwgc2l6ZSk6CiAgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX2VuY29kZV90ZXN0KHNpemUsICd1dGYtOCcpCiAKLSAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyAvIDYgKyAyLCBtZW11c2U9MikKKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyAvLyA2ICsgMiwgbWVtdXNlPTIpCiAgICAgZGVmIHRlc3RfZW5jb2RlX3Jhd191bmljb2RlX2VzY2FwZShzZWxmLCBzaXplKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfZW5jb2RlX3Rlc3Qoc2l6ZSwgJ3Jhd191bmljb2RlX2VzY2FwZScpCiAgICAgICAgIGV4Y2VwdCBNZW1vcnlFcnJvcjoKICAgICAgICAgICAgIHBhc3MgIyBhY2NlcHRhYmxlIG9uIDMyLWJpdAogCi0gICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fNEcgLyA1ICsgNzAsIG1lbXVzZT0zKQorICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC8vIDUgKyA3MCwgbWVtdXNlPTMpCiAgICAgZGVmIHRlc3RfZW5jb2RlX3V0Zjcoc2VsZiwgc2l6ZSk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX2VuY29kZV90ZXN0KHNpemUsICd1dGY3JykKICAgICAgICAgZXhjZXB0IE1lbW9yeUVycm9yOgogICAgICAgICAgICAgcGFzcyAjIGFjY2VwdGFibGUgb24gMzItYml0CiAKLSAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyAvIDQgKyA1LCBtZW11c2U9NikKKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyAvLyA0ICsgNSwgbWVtdXNlPTYpCiAgICAgZGVmIHRlc3RfZW5jb2RlX3V0ZjMyKHNlbGYsIHNpemUpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5iYXNpY19lbmNvZGVfdGVzdChzaXplLCAndXRmMzInLCBleHBlY3RlZHNpemU9NCpzaXplKzQpCkBAIC0xMjIsNyArMTIyLDcgQEAKICAgICBkZWYgdGVzdF9kZWNvZGVhc2NpaShzZWxmLCBzaXplKToKICAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfZW5jb2RlX3Rlc3Qoc2l6ZSwgJ2FzY2lpJywgYz0nQScpCiAKLSAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyAvIDUsIG1lbXVzZT02KzIpCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fNEcgLy8gNSwgbWVtdXNlPTYrMikKICAgICBkZWYgdGVzdF91bmljb2RlX3JlcHJfb2ZsdyhzZWxmLCBzaXplKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcyA9IHUiXHVBQUFBIipzaXplCkBAIC01MTYsNyArNTE2LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5jb3VudCgnXFwnKSwgc2l6ZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocy5jb3VudCgnMCcpLCBzaXplICogMikKIAotICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9MioqMzIgLyA1LCBtZW11c2U9NisyKQorICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9MioqMzIgLy8gNSwgbWVtdXNlPTYrMikKICAgICBkZWYgdGVzdF91bmljb2RlX3JlcHIoc2VsZiwgc2l6ZSk6CiAgICAgICAgIHMgPSB1Ilx1QUFBQSIgKiBzaXplCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhsZW4ocmVwcihzKSkgPiBzaXplKQpAQCAtMTA1Myw3ICsxMDUzLDggQEAKICAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV8xRywgbWVtdXNlPTQpCiAgICAgZGVmIHRlc3RfcmVwZWF0KHNlbGYsIHNpemUpOgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBiID0gYnVmZmVyKCJBQUFBIikqc2l6ZQorICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuX2NoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgICAgICBiID0gYnVmZmVyKCJBQUFBIikqc2l6ZQogICAgICAgICBleGNlcHQgTWVtb3J5RXJyb3I6CiAgICAgICAgICAgICBwYXNzICMgYWNjZXB0YWJsZSBvbiAzMi1iaXQKICAgICAgICAgZWxzZToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYm9vbC5weSBiL0xpYi90ZXN0L3Rlc3RfYm9vbC5weQppbmRleCAzMzE4NWEwLi4xNTBkYzMxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Jvb2wucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ib29sLnB5CkBAIC05MSwxMCArOTEsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSoxLCAwKQogICAgICAgICBzZWxmLmFzc2VydElzTm90KEZhbHNlKjEsIEZhbHNlKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZS8xLCAxKQotICAgICAgICBzZWxmLmFzc2VydElzTm90KFRydWUvMSwgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZS8xLCAwKQotICAgICAgICBzZWxmLmFzc2VydElzTm90KEZhbHNlLzEsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUvLzEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoVHJ1ZS8vMSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZS8vMSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChGYWxzZS8vMSwgRmFsc2UpCiAKICAgICAgICAgZm9yIGIgaW4gRmFsc2UsIFRydWU6CiAgICAgICAgICAgICBmb3IgaSBpbiAwLCAxLCAyOgpAQCAtMTY4LDggKzE2OCw5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SXMoaGFzYXR0cihbXSwgIndvYmJsZSIpLCBGYWxzZSkKIAogICAgIGRlZiB0ZXN0X2NhbGxhYmxlKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydElzKGNhbGxhYmxlKGxlbiksIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0SXMoY2FsbGFibGUoMSksIEZhbHNlKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5fY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjYWxsYWJsZShsZW4pLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjYWxsYWJsZSgxKSwgRmFsc2UpCiAKICAgICBkZWYgdGVzdF9pc2luc3RhbmNlKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydElzKGlzaW5zdGFuY2UoVHJ1ZSwgYm9vbCksIFRydWUpCkBAIC0xODQsOCArMTg1LDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SXMoaXNzdWJjbGFzcyhpbnQsIGJvb2wpLCBGYWxzZSkKIAogICAgIGRlZiB0ZXN0X2hhc2tleShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRJcyh7fS5oYXNfa2V5KDEpLCBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRJcyh7MToxfS5oYXNfa2V5KDEpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKDEgaW4ge30sIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKDEgaW4gezE6MX0sIFRydWUpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHt9Lmhhc19rZXkoMSksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh7MToxfS5oYXNfa2V5KDEpLCBUcnVlKQogCiAgICAgZGVmIHRlc3Rfc3RyaW5nKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydElzKCJ4eXoiLmVuZHN3aXRoKCJ6IiksIFRydWUpCkBAIC0yNTcsOCArMjYxLDkgQEAKICAgICAgICAgaW1wb3J0IG9wZXJhdG9yCiAgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IudHJ1dGgoMCksIEZhbHNlKQogICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLnRydXRoKDEpLCBUcnVlKQotICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmlzQ2FsbGFibGUoMCksIEZhbHNlKQotICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmlzQ2FsbGFibGUobGVuKSwgVHJ1ZSkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuX2NoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuaXNDYWxsYWJsZSgwKSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmlzQ2FsbGFibGUobGVuKSwgVHJ1ZSkKICAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5pc051bWJlclR5cGUoTm9uZSksIEZhbHNlKQogICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmlzTnVtYmVyVHlwZSgwKSwgVHJ1ZSkKICAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5ub3RfKDEpLCBGYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5IGIvTGliL3Rlc3QvdGVzdF9idWZmZXIucHkKaW5kZXggM2JlZGU4OC4uZGM1MDk2OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9idWZmZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9idWZmZXIucHkKQEAgLTIzLDcgKzIzLDkgQEAKIAogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChCdWZmZXJUZXN0cykKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5fY2hlY2tfcHkza193YXJuaW5ncygoImJ1ZmZlci4uIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEJ1ZmZlclRlc3RzKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkgYi9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKaW5kZXggZDFkMmJkMC4uNDFmMTMxNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQpAQCAtMSwxNyArMSwxMyBAQAogIyBQeXRob24gdGVzdCBzZXQgLS0gYnVpbHQtaW4gZnVuY3Rpb25zCiAKIGltcG9ydCBwbGF0Zm9ybQotaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0LCB1bml0dGVzdAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgZmNtcCwgaGF2ZV91bmljb2RlLCBURVNURk4sIHVubGluaywgXAotICAgIHJ1bl91bml0dGVzdCwgcnVuX3dpdGhfbG9jYWxlLCBjaGVja193YXJuaW5ncworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IChmY21wLCBoYXZlX3VuaWNvZGUsIFRFU1RGTiwgdW5saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX3VuaXR0ZXN0LCBfY2hlY2tfcHkza193YXJuaW5ncywgY2hlY2tfd2FybmluZ3MpCiBmcm9tIG9wZXJhdG9yIGltcG9ydCBuZWcKIAotaW1wb3J0IHN5cywgd2FybmluZ3MsIGNTdHJpbmdJTywgcmFuZG9tLCBmcmFjdGlvbnMsIFVzZXJEaWN0Ci13YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgImhleC4uL29jdC4uIG9mIG5lZ2F0aXZlIGludCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGdXR1cmVXYXJuaW5nLCBfX25hbWVfXykKLXdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiaW50ZWdlciBhcmd1bWVudCBleHBlY3RlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsICJ1bml0dGVzdCIpCi0KK2ltcG9ydCBzeXMsIGNTdHJpbmdJTywgcmFuZG9tLCBVc2VyRGljdAogIyBjb3VudCB0aGUgbnVtYmVyIG9mIHRlc3QgcnVucy4KICMgdXNlZCB0byBza2lwIHJ1bm5pbmcgdGVzdF9leGVjZmlsZSgpIG11bHRpcGxlIHRpbWVzCiAjIGFuZCB0byBjcmVhdGUgdW5pcXVlIHN0cmluZ3MgdG8gaW50ZXJuIGluIHRlc3RfaW50ZXJuKCkKQEAgLTQxOSw3ICs0MTUsOSBAQAogICAgIGYud3JpdGUoJ3ogPSB6KzFcbicpCiAgICAgZi53cml0ZSgneiA9IHoqMlxuJykKICAgICBmLmNsb3NlKCkKLSAgICBleGVjZmlsZShURVNURk4pCisgICAgd2l0aCBfY2hlY2tfcHkza193YXJuaW5ncygoImV4ZWNmaWxlLi4gbm90IHN1cHBvcnRlZCBpbiAzLngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIGV4ZWNmaWxlKFRFU1RGTikKIAogICAgIGRlZiB0ZXN0X2V4ZWNmaWxlKHNlbGYpOgogICAgICAgICBnbG9iYWwgbnVtcnVucwpAQCAtMTA3Myw3ICsxMDcxLDEwIEBACiAKICAgICAgICAgIyBSZWplY3QgZmxvYXRzIHdoZW4gaXQgd291bGQgcmVxdWlyZSBQeUxvbmdzIHRvIHJlcHJlc2VudC4KICAgICAgICAgIyAoc21hbGxlciBmbG9hdHMgc3RpbGwgYWNjZXB0ZWQsIGJ1dCBkZXByZWNhdGVkKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAxZTEwMCwgMWUxMDEsIDFlMTAxKQorICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiYWx3YXlzIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDFlMTAwLCAxZTEwMSwgMWUxMDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcuY2F0ZWdvcnksIERlcHJlY2F0aW9uV2FybmluZykKICAgICAgICAgd2l0aCBjaGVja193YXJuaW5ncygpIGFzIHc6CiAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImFsd2F5cyIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhbmdlKDEuMCksIFswXSkKQEAgLTExMTksMTkgKzExMjAsMjAgQEAKIAogICAgICAgICAjIEV4ZXJjaXNlIHZhcmlvdXMgY29tYmluYXRpb25zIG9mIGJhZCBhcmd1bWVudHMsIHRvIGNoZWNrCiAgICAgICAgICMgcmVmY291bnRpbmcgbG9naWMKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMWUxMDApCisgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDFlMTAwKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDAsIDFlMTAwKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAxZTEwMCwgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMWUxMDAsIDFlMTAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMCwgMWUxMDApCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAxZTEwMCwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDFlMTAwLCAxZTEwMCkKIAotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAwLCAwLCAxZTEwMCkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMCwgMWUxMDAsIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDAsIDFlMTAwLCAxZTEwMCkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMWUxMDAsIDAsIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDFlMTAwLCAwLCAxZTEwMCkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMWUxMDAsIDFlMTAwLCAxKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAxZTEwMCwgMWUxMDAsIDFlMTAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMCwgMCwgMWUxMDApCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAwLCAxZTEwMCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDAsIDFlMTAwLCAxZTEwMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDFlMTAwLCAwLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMWUxMDAsIDAsIDFlMTAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMWUxMDAsIDFlMTAwLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMWUxMDAsIDFlMTAwLCAxZTEwMCkKIAogICAgIGRlZiB0ZXN0X2lucHV0X2FuZF9yYXdfaW5wdXQoc2VsZik6CiAgICAgICAgIHNlbGYud3JpdGVfdGVzdGZpbGUoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jYWxsLnB5IGIvTGliL3Rlc3QvdGVzdF9jYWxsLnB5CmluZGV4IGYzYzdjOGMuLmZkM2VjM2MgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2FsbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NhbGwucHkKQEAgLTEyLDcgKzEyLDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB7fS5oYXNfa2V5KQogCiAgICAgZGVmIHRlc3RfdmFyYXJnczEoc2VsZik6Ci0gICAgICAgIHt9Lmhhc19rZXkoMCkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuX2NoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHt9Lmhhc19rZXkoMCkKIAogICAgIGRlZiB0ZXN0X3ZhcmFyZ3MyKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHt9Lmhhc19rZXksIDAsIDEpCkBAIC0yNCwxMSArMjUsMTMgQEAKICAgICAgICAgICAgIHBhc3MKIAogICAgIGRlZiB0ZXN0X3ZhcmFyZ3MxX2V4dChzZWxmKToKLSAgICAgICAge30uaGFzX2tleSgqKDAsKSkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuX2NoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHt9Lmhhc19rZXkoKigwLCkpCiAKICAgICBkZWYgdGVzdF92YXJhcmdzMl9leHQoc2VsZik6CiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHt9Lmhhc19rZXkoKigxLCAyKSkKKyAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAgICAge30uaGFzX2tleSgqKDEsIDIpKQogICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbHNlOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jbGFzcy5weSBiL0xpYi90ZXN0L3Rlc3RfY2xhc3MucHkKaW5kZXggZmM2MWQyMS4uYzJkM2M1NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jbGFzcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NsYXNzLnB5CkBAIC00MDcsNyArNDA3LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCdfX2NtcF9fJywgKHRlc3RtZSwgMSkpXSkKIAogICAgICAgICBjYWxsTHN0WzpdID0gW10KLSAgICAgICAgdGVzdG1lIDw+IDEgICMgWFhYIGtpbGwgdGhpcyBpbiBweTNrCisgICAgICAgIGV2YWwoJ3Rlc3RtZSA8PiAxJykgICMgWFhYIGtpbGwgdGhpcyBpbiBweTNrCiAgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgnX19jbXBfXycsICh0ZXN0bWUsIDEpKV0pCiAKICAgICAgICAgY2FsbExzdFs6XSA9IFtdCkBAIC00MjcsNyArNDI3LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCdfX2NtcF9fJywgKDEsIHRlc3RtZSkpXSkKIAogICAgICAgICBjYWxsTHN0WzpdID0gW10KLSAgICAgICAgMSA8PiB0ZXN0bWUKKyAgICAgICAgZXZhbCgnMSA8PiB0ZXN0bWUnKQogICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoJ19fY21wX18nLCAoMSwgdGVzdG1lKSldKQogCiAgICAgICAgIGNhbGxMc3RbOl0gPSBbXQpAQCAtNjE2LDcgKzYxNiwxMSBAQAogICAgICAgICBoYXNoKGEuZikKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ2xhc3NUZXN0cykKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5fY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgiLitfXyhnZXR8c2V0fGRlbClzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpLAorICAgICAgICAgICAgKCJjbGFzc2ljIGludCBkaXZpc2lvbiIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAoIjw+IG5vdCBzdXBwb3J0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDbGFzc1Rlc3RzKQogCiBpZiBfX25hbWVfXz09J19fbWFpbl9fJzoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jdHlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X2N0eXBlcy5weQppbmRleCA3YTgxYWI0Li5hODhhMjNmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2N0eXBlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2N0eXBlcy5weQpAQCAtMSwxMiArMSwxNyBAQAogaW1wb3J0IHVuaXR0ZXN0CiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAotaW1wb3J0IGN0eXBlcy50ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUsIF9jaGVja19weTNrX3dhcm5pbmdzCisjU2tpcCB0ZXN0cyBpZiBfY3R5cGVzIG1vZHVsZSBkb2VzIG5vdCBleGlzdAoraW1wb3J0X21vZHVsZSgnX2N0eXBlcycpCisKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHNraXBwZWQsIHRlc3RjYXNlcyA9IGN0eXBlcy50ZXN0LmdldF90ZXN0cyhjdHlwZXMudGVzdCwgInRlc3RfKi5weSIsIHZlcmJvc2l0eT0wKQotICAgIHN1aXRlcyA9IFt1bml0dGVzdC5tYWtlU3VpdGUodCkgZm9yIHQgaW4gdGVzdGNhc2VzXQotICAgIHJ1bl91bml0dGVzdCh1bml0dGVzdC5UZXN0U3VpdGUoc3VpdGVzKSkKKyAgICB3aXRoIF9jaGVja19weTNrX3dhcm5pbmdzKCgiYnVmZmVyLi4gbm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiY2xhc3NpYyAoaW50fGxvbmcpIGRpdmlzaW9uIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIGltcG9ydCBjdHlwZXMudGVzdAorICAgICAgICBza2lwcGVkLCB0ZXN0Y2FzZXMgPSBjdHlwZXMudGVzdC5nZXRfdGVzdHMoY3R5cGVzLnRlc3QsICJ0ZXN0XyoucHkiLCB2ZXJib3NpdHk9MCkKKyAgICAgICAgc3VpdGVzID0gW3VuaXR0ZXN0Lm1ha2VTdWl0ZSh0KSBmb3IgdCBpbiB0ZXN0Y2FzZXNdCisgICAgICAgIHJ1bl91bml0dGVzdCh1bml0dGVzdC5UZXN0U3VpdGUoc3VpdGVzKSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weSBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKaW5kZXggYmM1ZWRlZi4uMmRlMWQxMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CkBAIC00NDMzLDkgKzQ0MzMsMTQgQEAKIAogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgIyBSdW4gYWxsIGxvY2FsIHRlc3QgY2FzZXMsIHdpdGggUFR5cGVzTG9uZ0luaXRUZXN0IGZpcnN0LgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoUFR5cGVzTG9uZ0luaXRUZXN0LCBPcGVyYXRvcnNUZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NQcm9wZXJ0aWVzQW5kTWV0aG9kcywgRGljdFByb3h5VGVzdHMpCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuX2NoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAoImNsYXNzaWMgKGludHxsb25nKSBkaXZpc2lvbiIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAoImNvZXJjZS4uIG5vdCBzdXBwb3J0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpLAorICAgICAgICAgICAgKCJPdmVycmlkaW5nIF9fY21wX18gIiwgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICgiLitfXyhnZXR8c2V0fGRlbClzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgIyBSdW4gYWxsIGxvY2FsIHRlc3QgY2FzZXMsIHdpdGggUFR5cGVzTG9uZ0luaXRUZXN0IGZpcnN0LgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFBUeXBlc0xvbmdJbml0VGVzdCwgT3BlcmF0b3JzVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1Byb3BlcnRpZXNBbmRNZXRob2RzLCBEaWN0UHJveHlUZXN0cykKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5CmluZGV4IDg5Yzg3OGIuLjc0ZjEwN2IgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkKQEAgLTIyMjIsNyArMjIyMiw3IEBACiAgICAgPj4+IGRvY3Rlc3QubWFzdGVyID0gTm9uZSAgIyBSZXNldCBtYXN0ZXIuCiAKIChOb3RlOiB3ZSdsbCBiZSBjbGVhcmluZyBkb2N0ZXN0Lm1hc3RlciBhZnRlciBlYWNoIGNhbGwgdG8KLWBkb2N0ZXN0LnRlc3RmaWxlYCwgdG8gc3VwcmVzcyB3YXJuaW5ncyBhYm91dCBtdWx0aXBsZSB0ZXN0cyB3aXRoIHRoZQorYGRvY3Rlc3QudGVzdGZpbGVgLCB0byBzdXBwcmVzcyB3YXJuaW5ncyBhYm91dCBtdWx0aXBsZSB0ZXN0cyB3aXRoIHRoZQogc2FtZSBuYW1lLikKIAogR2xvYmFscyBtYXkgYmUgc3BlY2lmaWVkIHdpdGggdGhlIGBnbG9ic2AgYW5kIGBleHRyYWdsb2JzYCBwYXJhbWV0ZXJzOgpAQCAtMjM4NiwxMiArMjM4Niw2IEBACiAjIHRoYXQgdGhlc2UgdXNlIHRoZSBkZXByZWNhdGVkIGRvY3Rlc3QuVGVzdGVyLCBzbyBzaG91bGQgZ28gYXdheSAob3IKICMgYmUgcmV3cml0dGVuKSBzb21lZGF5LgogCi0jIElnbm9yZSBhbGwgd2FybmluZ3MgYWJvdXQgdGhlIHVzZSBvZiBjbGFzcyBUZXN0ZXIgaW4gdGhpcyBtb2R1bGUuCi0jIE5vdGUgdGhhdCB0aGUgbmFtZSBvZiB0aGlzIG1vZHVsZSBtYXkgZGlmZmVyIGRlcGVuZGluZyBvbiBob3cgaXQncwotIyBpbXBvcnRlZCwgc28gdGhlIHVzZSBvZiBfX25hbWVfXyBpcyBpbXBvcnRhbnQuCi13YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgImNsYXNzIFRlc3RlciIsIERlcHJlY2F0aW9uV2FybmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fbmFtZV9fLCAwKQotCiBkZWYgb2xkX3Rlc3QxKCk6IHIiIiIKID4+PiBmcm9tIGRvY3Rlc3QgaW1wb3J0IFRlc3RlcgogPj4+IHQgPSBUZXN0ZXIoZ2xvYnM9eyd4JzogNDJ9LCB2ZXJib3NlPTApCkBAIC0yNTE1LDkgKzI1MDksMTYgQEAKIGRlZiB0ZXN0X21haW4oKToKICAgICAjIENoZWNrIHRoZSBkb2N0ZXN0IGNhc2VzIGluIGRvY3Rlc3QgaXRzZWxmOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdChkb2N0ZXN0LCB2ZXJib3NpdHk9VHJ1ZSkKLSAgICAjIENoZWNrIHRoZSBkb2N0ZXN0IGNhc2VzIGRlZmluZWQgaGVyZToKKwogICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9kb2N0ZXN0Ci0gICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfZG9jdGVzdCwgdmVyYm9zaXR5PVRydWUpCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuX2NoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAoImJhY2txdW90ZSBub3Qgc3VwcG9ydGVkIiwgU3ludGF4V2FybmluZyksCisgICAgICAgICAgICAoImV4ZWNmaWxlLi4gbm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICAjIElnbm9yZSBhbGwgd2FybmluZ3MgYWJvdXQgdGhlIHVzZSBvZiBjbGFzcyBUZXN0ZXIgaW4gdGhpcyBtb2R1bGUuCisgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiY2xhc3MgVGVzdGVyIGlzIGRlcHJlY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICMgQ2hlY2sgdGhlIGRvY3Rlc3QgY2FzZXMgZGVmaW5lZCBoZXJlOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9kb2N0ZXN0LCB2ZXJib3NpdHk9VHJ1ZSkKIAogaW1wb3J0IHRyYWNlLCBzeXMKIGRlZiB0ZXN0X2NvdmVyYWdlKGNvdmVyZGlyKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkgYi9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5CmluZGV4IGY5MWQ4NmQuLmVmZDEwODAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9oZWFwcS5weQpAQCAtMzU4LDcgKzM1OCwxMCBAQAogICAgICAgICBmb3IgZiBpbiAoc2VsZi5tb2R1bGUubmxhcmdlc3QsIHNlbGYubW9kdWxlLm5zbWFsbGVzdCk6CiAgICAgICAgICAgICBmb3IgcyBpbiAoIjEyMyIsICIiLCByYW5nZSgxMDAwKSwgKCdkbycsIDEuMiksIHhyYW5nZSgyMDAwLDIyMDAsNSkpOgogICAgICAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgTCwgUik6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZigyLCBnKHMpKSwgZigyLHMpKQorICAgICAgICAgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5fY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImNvbXBhcmluZyB1bmVxdWFsIHR5cGVzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpLCBxdWlldD1UcnVlKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZigyLCBnKHMpKSwgZigyLHMpKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZigyLCBTKHMpKSwgW10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLCAyLCBYKHMpKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgMiwgTihzKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weSBiL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQppbmRleCA5YmU4Zjc5Li5kYzk3NjVmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CkBAIC00LDEwICs0LDEzIEBACiBpbXBvcnQgaW5zcGVjdAogaW1wb3J0IGRhdGV0aW1lCiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIF9jaGVja19weTNrX3dhcm5pbmdzCiAKLWZyb20gdGVzdCBpbXBvcnQgaW5zcGVjdF9mb2RkZXIgYXMgbW9kCi1mcm9tIHRlc3QgaW1wb3J0IGluc3BlY3RfZm9kZGVyMiBhcyBtb2QyCit3aXRoIF9jaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAoInR1cGxlIHBhcmFtZXRlciB1bnBhY2tpbmcgaGFzIGJlZW4gcmVtb3ZlZCIsIFN5bnRheFdhcm5pbmcpLAorICAgICAgICBxdWlldD1UcnVlKToKKyAgICBmcm9tIHRlc3QgaW1wb3J0IGluc3BlY3RfZm9kZGVyIGFzIG1vZAorICAgIGZyb20gdGVzdCBpbXBvcnQgaW5zcGVjdF9mb2RkZXIyIGFzIG1vZDIKIAogIyBGdW5jdGlvbnMgdGVzdGVkIGluIHRoaXMgc3VpdGU6CiAjIGlzbW9kdWxlLCBpc2NsYXNzLCBpc21ldGhvZCwgaXNmdW5jdGlvbiwgaXN0cmFjZWJhY2ssIGlzZnJhbWUsIGlzY29kZSwKQEAgLTI2LDcgKzI5LDcgQEAKIGltcG9ydCBfX2J1aWx0aW5fXwogCiB0cnk6Ci0gICAgMS8wCisgICAgMSAvLyAwCiBleGNlcHQ6CiAgICAgdGIgPSBzeXMuZXhjX3RyYWNlYmFjawogCkBAIC0zNjEsMTEgKzM2NCwxNCBAQAogICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMoQS5tLCBbJ3NlbGYnXSkKIAogICAgIGRlZiB0ZXN0X2dldGFyZ3NwZWNfc3VibGlzdG9mb25lKHNlbGYpOgotICAgICAgICBkZWYgc3VibGlzdE9mT25lKChmb28sKSk6IHJldHVybiAxCi0gICAgICAgIHNlbGYuYXNzZXJ0QXJnU3BlY0VxdWFscyhzdWJsaXN0T2ZPbmUsIFtbJ2ZvbyddXSkKKyAgICAgICAgd2l0aCBfY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICAgICAoInR1cGxlIHBhcmFtZXRlciB1bnBhY2tpbmcgaGFzIGJlZW4gcmVtb3ZlZCIsIFN5bnRheFdhcm5pbmcpLAorICAgICAgICAgICAgICAgICgicGFyZW50aGVzaXplZCBhcmd1bWVudCBuYW1lcyBhcmUgaW52YWxpZCIsIFN5bnRheFdhcm5pbmcpKToKKyAgICAgICAgICAgIGV4ZWMgJ2RlZiBzdWJsaXN0T2ZPbmUoKGZvbywpKTogcmV0dXJuIDEnCisgICAgICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMoc3VibGlzdE9mT25lLCBbWydmb28nXV0pCiAKLSAgICAgICAgZGVmIGZha2VTdWJsaXN0T2ZPbmUoKGZvbykpOiByZXR1cm4gMQotICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMoZmFrZVN1Ymxpc3RPZk9uZSwgWydmb28nXSkKKyAgICAgICAgICAgIGV4ZWMgJ2RlZiBmYWtlU3VibGlzdE9mT25lKChmb28pKTogcmV0dXJuIDEnCisgICAgICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMoZmFrZVN1Ymxpc3RPZk9uZSwgWydmb28nXSkKIAogICAgIGRlZiB0ZXN0X2NsYXNzaWZ5X29sZHN0eWxlKHNlbGYpOgogICAgICAgICBjbGFzcyBBOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pdGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9pdGVyLnB5CmluZGV4IGY4M2RlNzguLjYxMzIwNDEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaXRlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2l0ZXIucHkKQEAgLTEsNyArMSw4IEBACiAjIFRlc3QgaXRlcmF0b3JzLgogCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgVEVTVEZOLCB1bmxpbmssIGhhdmVfdW5pY29kZQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBURVNURk4sIHVubGluaywgaGF2ZV91bmljb2RlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2hlY2tfcHkza193YXJuaW5ncwogCiAjIFRlc3QgcmVzdWx0IG9mIHRyaXBsZSBsb29wICh0b28gYmlnIHRvIGlubGluZSkKIFRSSVBMRVRTID0gWygwLCAwLCAwKSwgKDAsIDAsIDEpLCAoMCwgMCwgMiksCkBAIC0zODksMjEgKzM5MCwyNCBAQAogCiAgICAgIyBUZXN0IG1hcCgpJ3MgdXNlIG9mIGl0ZXJhdG9ycy4KICAgICBkZWYgdGVzdF9idWlsdGluX21hcChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXAoTm9uZSwgU2VxdWVuY2VDbGFzcyg1KSksIHJhbmdlKDUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcChsYW1iZGEgeDogeCsxLCBTZXF1ZW5jZUNsYXNzKDUpKSwgcmFuZ2UoMSwgNikpCiAKICAgICAgICAgZCA9IHsib25lIjogMSwgInR3byI6IDIsICJ0aHJlZSI6IDN9Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFwKE5vbmUsIGQpLCBkLmtleXMoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXAobGFtYmRhIGssIGQ9ZDogKGssIGRba10pLCBkKSwgZC5pdGVtcygpKQogICAgICAgICBka2V5cyA9IGQua2V5cygpCiAgICAgICAgIGV4cGVjdGVkID0gWyhpIDwgbGVuKGQpIGFuZCBka2V5c1tpXSBvciBOb25lLAogICAgICAgICAgICAgICAgICAgICAgaSwKICAgICAgICAgICAgICAgICAgICAgIGkgPCBsZW4oZCkgYW5kIGRrZXlzW2ldIG9yIE5vbmUpCiAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUpXQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcChOb25lLCBkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZUNsYXNzKDUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyKGQuaXRlcmtleXMoKSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKQorCisgICAgICAgICMgRGVwcmVjYXRlZCBtYXAoTm9uZSwgLi4uKQorICAgICAgICB3aXRoIF9jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcChOb25lLCBTZXF1ZW5jZUNsYXNzKDUpKSwgcmFuZ2UoNSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcChOb25lLCBkKSwgZC5rZXlzKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcChOb25lLCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VDbGFzcyg1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIoZC5pdGVya2V5cygpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKQogCiAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInciKQogICAgICAgICB0cnk6CkBAIC00OTksNyArNTAzLDExIEBACiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoeCwgeSksIGV4cGVjdGVkKQogCiAgICAgIyBUZXN0IHJlZHVjZXMoKSdzIHVzZSBvZiBpdGVyYXRvcnMuCi0gICAgZGVmIHRlc3RfYnVpbHRpbl9yZWR1Y2Uoc2VsZik6CisgICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9idWlsdGluX3JlZHVjZShzZWxmKToKKyAgICAgICAgd2l0aCBfY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9idWlsdGluX3JlZHVjZSgpCisKKyAgICBkZWYgX3Rlc3RfYnVpbHRpbl9yZWR1Y2Uoc2VsZik6CiAgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IGFkZAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShhZGQsIFNlcXVlbmNlQ2xhc3MoNSkpLCAxMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWR1Y2UoYWRkLCBTZXF1ZW5jZUNsYXNzKDUpLCA0MiksIDUyKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9sb25nLnB5IGIvTGliL3Rlc3QvdGVzdF9sb25nLnB5CmluZGV4IGY4YWZjOWUuLmE2ZWQxY2IgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2xvbmcucHkKQEAgLTU2MSwxMSArNTYxLDEyIEBACiAgICAgICAgICAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIGksIGopOgogICAgICAgICAgICAgICAgIHJldHVybiBpLCBqCiAKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYKClbLTVMOjdMXSwgKC01LCA3KSkKLSAgICAgICAgIyB1c2UgdGhlIGNsYW1waW5nIGVmZmVjdCB0byB0ZXN0IHRoZSBzbWFsbGVzdCBhbmQgbGFyZ2VzdCBsb25ncwotICAgICAgICAjIHRoYXQgZml0IGEgUHlfc3NpemVfdAotICAgICAgICBzbGljZW1pbiwgc2xpY2VtYXggPSBYKClbLTJMKioxMDA6MkwqKjEwMF0KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYKClbc2xpY2VtaW46c2xpY2VtYXhdLCAoc2xpY2VtaW4sIHNsaWNlbWF4KSkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuX2NoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWCgpWy01TDo3TF0sICgtNSwgNykpCisgICAgICAgICAgICAjIHVzZSB0aGUgY2xhbXBpbmcgZWZmZWN0IHRvIHRlc3QgdGhlIHNtYWxsZXN0IGFuZCBsYXJnZXN0IGxvbmdzCisgICAgICAgICAgICAjIHRoYXQgZml0IGEgUHlfc3NpemVfdAorICAgICAgICAgICAgc2xpY2VtaW4sIHNsaWNlbWF4ID0gWCgpWy0yTCoqMTAwOjJMKioxMDBdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgoKVtzbGljZW1pbjpzbGljZW1heF0sIChzbGljZW1pbiwgc2xpY2VtYXgpKQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRlc3RzIG9mIGF1dG8gaW50LT5sb25nIGNvbnZlcnNpb24KIApAQCAtNjA1LDggKzYwNiw5IEBACiAgICAgICAgICAgICAgICAgY2hlY2tpdCh4LCAnKicsIHkpCiAKICAgICAgICAgICAgICAgICBpZiB5OgotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxvbmd4IC8gbG9uZ3kKLSAgICAgICAgICAgICAgICAgICAgZ290ID0geCAvIHkKKyAgICAgICAgICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuX2NoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbG9uZ3ggLyBsb25neQorICAgICAgICAgICAgICAgICAgICAgICAgZ290ID0geCAvIHkKICAgICAgICAgICAgICAgICAgICAgY2hlY2tpdCh4LCAnLycsIHkpCiAKICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsb25neCAvLyBsb25neQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5IGIvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5CmluZGV4IDBkZDU5ZDEuLjEzNjU4NTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21hcnNoYWwucHkKQEAgLTEyOSw3ICsxMjksOSBAQAogCiAgICAgZGVmIHRlc3RfYnVmZmVyKHNlbGYpOgogICAgICAgICBmb3IgcyBpbiBbIiIsICJBbmRy6CBQcmV2aW4iLCAiYWJjIiwgIiAiKjEwMDAwXToKLSAgICAgICAgICAgIGIgPSBidWZmZXIocykKKyAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKCgiYnVmZmVyLi4gbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICAgICAgICAgIGIgPSBidWZmZXIocykKICAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhiKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgbmV3KQogICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGIsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZy5weSBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5CmluZGV4IDJjMWRhMGYuLjc1ODJjYzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5CkBAIC0xOTM0LDcgKzE5MzQsOSBAQAogCiAgICAgbG9hZFRlc3RzRnJvbVRlc3RDYXNlID0gdW5pdHRlc3QuZGVmYXVsdFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlCiAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUobG9hZFRlc3RzRnJvbVRlc3RDYXNlKHRjKSBmb3IgdGMgaW4gdGVzdGNhc2VzKQotICAgIHJ1bihzdWl0ZSkKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5fY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgiLitfXyhnZXR8c2V0KXNsaWNlX18gaGFzIGJlZW4gcmVtb3ZlZCIsIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICBydW4oc3VpdGUpCiAKICAgICBUaHJlYWRzTWl4aW4ucG9vbC50ZXJtaW5hdGUoKQogICAgIFByb2Nlc3Nlc01peGluLnBvb2wudGVybWluYXRlKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkgYi9MaWIvdGVzdC90ZXN0X29wZXJhdG9yLnB5CmluZGV4IDliYzBhNGUuLmMwODFmMjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcGVyYXRvci5weQpAQCAtMTkyLDcgKzE5Miw5IEBACiAgICAgICAgIGNsYXNzIEM6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGRlZiBjaGVjayhzZWxmLCBvLCB2KToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvcGVyYXRvci5pc0NhbGxhYmxlKG8pID09IGNhbGxhYmxlKG8pID09IHYpCisgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5fY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuaXNDYWxsYWJsZShvKSwgdikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGxhYmxlKG8pLCB2KQogICAgICAgICBjaGVjayhzZWxmLCA0LCAwKQogICAgICAgICBjaGVjayhzZWxmLCBvcGVyYXRvci5pc0NhbGxhYmxlLCAxKQogICAgICAgICBjaGVjayhzZWxmLCBDLCAxKQpAQCAtMzAyLDEyICszMDQsMTMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgb3BlcmF0b3IucnNoaWZ0LCAyLCAtMSkKIAogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb250YWlucykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY29udGFpbnMsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5jb250YWlucyhyYW5nZSg0KSwgMikpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmNvbnRhaW5zKHJhbmdlKDQpLCA1KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMocmFuZ2UoNCksIDIpKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5zZXF1ZW5jZUluY2x1ZGVzKHJhbmdlKDQpLCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb250YWlucykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb250YWlucywgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbnRhaW5zKHJhbmdlKDQpLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5jb250YWlucyhyYW5nZSg0KSwgNSkpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc2VxdWVuY2VJbmNsdWRlcyhyYW5nZSg0KSwgMikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMocmFuZ2UoNCksIDUpKQogCiAgICAgZGVmIHRlc3Rfc2V0aXRlbShzZWxmKToKICAgICAgICAgYSA9IHJhbmdlKDMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weSBiL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5CmluZGV4IGM1NDc5ODQuLjI5ODVjYzIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5CkBAIC0yMDcsMTcgKzIwNywyMCBAQAogICAgIGltcG9ydCBzeXMKICAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogICAgIHRlc3RfY2xhc3NlcyA9IChUZXN0VHJhbmZvcm1zLCkKLSAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCiAKLSAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKLSAgICBpZiB2ZXJib3NlIGFuZCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKLSAgICAgICAgaW1wb3J0IGdjCi0gICAgICAgIGNvdW50cyA9IFtOb25lXSAqIDUKLSAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihjb3VudHMpKToKLSAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKLSAgICAgICAgICAgIGdjLmNvbGxlY3QoKQotICAgICAgICAgICAgY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKQotICAgICAgICBwcmludCBjb3VudHMKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5fY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgiYmFja3F1b3RlIG5vdCBzdXBwb3J0ZWQiLCBTeW50YXhXYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKworICAgICAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKKyAgICAgICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgICAgIGNvdW50cyA9IFtOb25lXSAqIDUKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6CisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgICAgIHByaW50IGNvdW50cwogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3JpY2hjbXAucHkgYi9MaWIvdGVzdC90ZXN0X3JpY2hjbXAucHkKaW5kZXggMDQ2ZjIxNi4uN2U0NDEyYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcmljaGNtcC5weQpAQCAtMzMwLDcgKzMzMCwxMiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhvcCh4LCB5KSwgVHJ1ZSkKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVmVjdG9yVGVzdCwgTnVtYmVyVGVzdCwgTWlzY1Rlc3QsIERpY3RUZXN0LCBMaXN0VGVzdCkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFZlY3RvclRlc3QsIE51bWJlclRlc3QsIE1pc2NUZXN0LCBMaXN0VGVzdCkKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5fY2hlY2tfcHkza193YXJuaW5ncygoImRpY3QgaW5lcXVhbGl0eSBjb21wYXJpc29ucyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IHN1cHBvcnRlZCBpbiAzLngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoRGljdFRlc3QpCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NldC5weQppbmRleCBjMmUyYWQxLi44NmU4YjliIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NldC5weQpAQCAtMTM0OCw2ICsxMzQ4LDEwIEBACiAgICAgICAgIHNlbGYub3RoZXIgPSBvcGVyYXRvci5hZGQKICAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBGYWxzZQogCisgICAgZGVmIHRlc3RfZ2VfZ3RfbGVfbHQoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzdXBlcihUZXN0T25seVNldHNPcGVyYXRvciwgc2VsZikudGVzdF9nZV9ndF9sZV9sdCgpCisKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgVGVzdE9ubHlTZXRzVHVwbGUoVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHMpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZXRzLnB5IGIvTGliL3Rlc3QvdGVzdF9zZXRzLnB5CmluZGV4IGVmYTM4OGYuLjUzYzMwYmUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2V0cy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NldHMucHkKQEAgLTEsMTMgKzEsMTEgQEAKICMhL3Vzci9iaW4vZW52IHB5dGhvbgogCi1pbXBvcnQgd2FybmluZ3MKLXdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAidGhlIHNldHMgbW9kdWxlIGlzIGRlcHJlY2F0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAidGVzdFwudGVzdF9zZXRzIikKLQogaW1wb3J0IHVuaXR0ZXN0LCBvcGVyYXRvciwgY29weSwgcGlja2xlLCByYW5kb20KLWZyb20gc2V0cyBpbXBvcnQgU2V0LCBJbW11dGFibGVTZXQKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKK3Rlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCJzZXRzIiwgZGVwcmVjYXRlZD1UcnVlKQorZnJvbSBzZXRzIGltcG9ydCBTZXQsIEltbXV0YWJsZVNldAorCiBlbXB0eV9zZXQgPSBTZXQoKQogCiAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC02MzgsNiArNjM2LDEwIEBACiAgICAgICAgIHNlbGYub3RoZXIgPSBvcGVyYXRvci5hZGQKICAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBGYWxzZQogCisgICAgZGVmIHRlc3RfZ2VfZ3RfbGVfbHQoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzdXBlcihUZXN0T25seVNldHNPcGVyYXRvciwgc2VsZikudGVzdF9nZV9ndF9sZV9sdCgpCisKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgVGVzdE9ubHlTZXRzVHVwbGUoVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHMpOgpAQCAtNjc5LDExICs2ODEsMTIgQEAKIAogICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CiAgICAgICAgIGR1cCA9IHNlbGYuc2V0LmNvcHkoKQotICAgICAgICBkdXBfbGlzdCA9IGxpc3QoZHVwKTsgZHVwX2xpc3Quc29ydCgpCi0gICAgICAgIHNldF9saXN0ID0gbGlzdChzZWxmLnNldCk7IHNldF9saXN0LnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkdXApLCBsZW4oc2VsZi5zZXQpKQorICAgICAgICBkdXBfbGlzdCA9IHNvcnRlZChkdXApCisgICAgICAgIHNldF9saXN0ID0gc29ydGVkKHNlbGYuc2V0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkdXBfbGlzdCksIGxlbihzZXRfbGlzdCkpCi0gICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihkdXBfbGlzdCkpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGR1cF9saXN0W2ldIGlzIHNldF9saXN0W2ldKQorICAgICAgICBmb3IgaSwgZWwgaW4gZW51bWVyYXRlKGR1cF9saXN0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbCBpcyBzZXRfbGlzdFtpXSkKIAogICAgIGRlZiB0ZXN0X2RlZXBfY29weShzZWxmKToKICAgICAgICAgZHVwID0gY29weS5kZWVwY29weShzZWxmLnNldCkKQEAgLTY5NCw2ICs2OTcsNyBAQAogICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZHVwX2xpc3QpKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHVwX2xpc3RbaV0sIHNldF9saXN0W2ldKQogCisKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY2xhc3MgVGVzdENvcHlpbmdFbXB0eShUZXN0Q29weWluZyk6CkBAIC03MTIsNiArNzE2LDEwIEBACiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLnNldCA9IFNldChbInplcm8iLCAwLCBOb25lXSkKIAorICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzdXBlcihUZXN0Q29weWluZ1RyaXBsZSwgc2VsZikudGVzdF9jb3B5KCkKKwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBUZXN0Q29weWluZ1R1cGxlKFRlc3RDb3B5aW5nKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2xpY2UucHkgYi9MaWIvdGVzdC90ZXN0X3NsaWNlLnB5CmluZGV4IDg1NDgwNWIuLjJmNjUzMDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2xpY2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zbGljZS5weQpAQCAtMTE1LDcgKzExNSw4IEBACiAgICAgICAgICAgICAgICAgdG1wLmFwcGVuZCgoaSwgaiwgaykpCiAKICAgICAgICAgeCA9IFgoKQotICAgICAgICB4WzE6Ml0gPSA0MgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5fY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgeFsxOjJdID0gNDIKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModG1wLCBbKDEsIDIsIDQyKV0pCiAKICAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CmluZGV4IDRhMGI2MDAuLmY1MmQ4ODQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CkBAIC0xMjMsOCArMTIzLDkgQEAKICAgICAgICAgc2VsZi5zZXJ2ZXJfcmVhZHkud2FpdCgpCiAgICAgICAgIHNlbGYuY2xpZW50X3JlYWR5LnNldCgpCiAgICAgICAgIHNlbGYuY2xpZW50U2V0VXAoKQotICAgICAgICBpZiBub3QgY2FsbGFibGUodGVzdF9mdW5jKToKLSAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgInRlc3RfZnVuYyBtdXN0IGJlIGEgY2FsbGFibGUgZnVuY3Rpb24iCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBpZiBub3QgY2FsbGFibGUodGVzdF9mdW5jKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInRlc3RfZnVuYyBtdXN0IGJlIGEgY2FsbGFibGUgZnVuY3Rpb24uIikKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgdGVzdF9mdW5jKCkKICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgc3RyZXJyb3I6CkBAIC0xMzIsNyArMTMzLDcgQEAKICAgICAgICAgc2VsZi5jbGllbnRUZWFyRG93bigpCiAKICAgICBkZWYgY2xpZW50U2V0VXAoc2VsZik6Ci0gICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICJjbGllbnRTZXRVcCBtdXN0IGJlIGltcGxlbWVudGVkLiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiY2xpZW50U2V0VXAgbXVzdCBiZSBpbXBsZW1lbnRlZC4iKQogCiAgICAgZGVmIGNsaWVudFRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmRvbmUuc2V0KCkKQEAgLTI4Miw4ICsyODMsOCBAQAogICAgICAgICAgICAgICAgIG9yaWcgPSBzeXMuZ2V0cmVmY291bnQoX19uYW1lX18pCiAgICAgICAgICAgICAgICAgc29ja2V0LmdldG5hbWVpbmZvKF9fbmFtZV9fLDApCiAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgotICAgICAgICAgICAgICAgIGlmIHN5cy5nZXRyZWZjb3VudChfX25hbWVfXykgPD4gb3JpZzoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzb2NrZXQuZ2V0bmFtZWluZm8gbG9zZXMgYSByZWZlcmVuY2UiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHJlZmNvdW50KF9fbmFtZV9fKSwgb3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb2NrZXQuZ2V0bmFtZWluZm8gbG9zZXMgYSByZWZlcmVuY2UiKQogCiAgICAgZGVmIHRlc3RJbnRlcnByZXRlckNyYXNoKHNlbGYpOgogICAgICAgICAjIE1ha2luZyBzdXJlIGdldG5hbWVpbmZvIGRvZXNuJ3QgY3Jhc2ggdGhlIGludGVycHJldGVyCkBAIC0xMTk4LDcgKzExOTksOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQogCiAgICAgZGVmIF90ZXN0UmVjdkludG8oc2VsZik6Ci0gICAgICAgIGJ1ZiA9IGJ1ZmZlcihNU0cpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBidWYgPSBidWZmZXIoTVNHKQogICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kKGJ1ZikKIAogICAgIGRlZiB0ZXN0UmVjdkZyb21JbnRvKHNlbGYpOgpAQCAtMTIwOSw3ICsxMjExLDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKIAogICAgIGRlZiBfdGVzdFJlY3ZGcm9tSW50byhzZWxmKToKLSAgICAgICAgYnVmID0gYnVmZmVyKE1TRykKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuX2NoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIGJ1ZiA9IGJ1ZmZlcihNU0cpCiAgICAgICAgIHNlbGYuc2Vydl9jb25uLnNlbmQoYnVmKQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29ydC5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ydC5weQppbmRleCBhNjFmYjk2Li5kZTE3NWM1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb3J0LnB5CkBAIC0xODUsNyArMTg1LDcgQEAKICAgICBkZWYgdGVzdF9zdGFiaWxpdHkoc2VsZik6CiAgICAgICAgIGRhdGEgPSBbKHJhbmRvbS5yYW5kcmFuZ2UoMTAwKSwgaSkgZm9yIGkgaW4geHJhbmdlKDIwMCldCiAgICAgICAgIGNvcHkgPSBkYXRhWzpdCi0gICAgICAgIGRhdGEuc29ydChrZXk9bGFtYmRhICh4LHkpOiB4KSAgIyBzb3J0IG9uIHRoZSByYW5kb20gZmlyc3QgZmllbGQKKyAgICAgICAgZGF0YS5zb3J0KGtleT1sYW1iZGEgeDogeFswXSkgICAjIHNvcnQgb24gdGhlIHJhbmRvbSBmaXJzdCBmaWVsZAogICAgICAgICBjb3B5LnNvcnQoKSAgICAgICAgICAgICAgICAgICAgICMgc29ydCB1c2luZyBib3RoIGZpZWxkcwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGNvcHkpICAgICMgc2hvdWxkIGdldCB0aGUgc2FtZSByZXN1bHQKIApAQCAtMjA3LDcgKzIwNyw3IEBACiAgICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIHdyYXBwZXIgaGFzIGJlZW4gcmVtb3ZlZAogICAgICAgICBkYXRhID0gcmFuZ2UoLTIsMikKICAgICAgICAgZHVwID0gZGF0YVs6XQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgZGF0YS5zb3J0LCBOb25lLCBsYW1iZGEgeDogMS94KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgZGF0YS5zb3J0LCBOb25lLCBsYW1iZGEgeDogMSAvLyB4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGR1cCkKIAogICAgIGRlZiB0ZXN0X2tleV93aXRoX211dGF0aW9uKHNlbGYpOgpAQCAtMjc0LDE3ICsyNzQsMTkgQEAKICAgICAgICAgVGVzdEJ1Z3MsCiAgICAgKQogCi0gICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgIHdpdGggdGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAgICAgKCJ0aGUgY21wIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQogCi0gICAgIyB2ZXJpZnkgcmVmZXJlbmNlIGNvdW50aW5nCi0gICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6Ci0gICAgICAgIGltcG9ydCBnYwotICAgICAgICBjb3VudHMgPSBbTm9uZV0gKiA1Ci0gICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6Ci0gICAgICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCi0gICAgICAgICAgICBnYy5jb2xsZWN0KCkKLSAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKLSAgICAgICAgcHJpbnQgY291bnRzCisgICAgICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZworICAgICAgICBpZiB2ZXJib3NlIGFuZCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKKyAgICAgICAgICAgIGltcG9ydCBnYworICAgICAgICAgICAgY291bnRzID0gW05vbmVdICogNQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihjb3VudHMpKToKKyAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisgICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICAgICAgY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICAgICAgcHJpbnQgY291bnRzCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5IGIvTGliL3Rlc3QvdGVzdF9zc2wucHkKaW5kZXggNmQ0OTk5NC4uYzFlNTNlYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zc2wucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zc2wucHkKQEAgLTk3NSw3ICs5NzUsOCBAQAogICAgICAgICAgICAgICAgICMgbm93IGZldGNoIHRoZSBzYW1lIGRhdGEgZnJvbSB0aGUgSFRUUFMgc2VydmVyCiAgICAgICAgICAgICAgICAgdXJsID0gJ2h0dHBzOi8vMTI3LjAuMC4xOiVkLyVzJyAlICgKICAgICAgICAgICAgICAgICAgICAgc2VydmVyLnBvcnQsIG9zLnBhdGguc3BsaXQoQ0VSVEZJTEUpWzFdKQotICAgICAgICAgICAgICAgIGYgPSB1cmxsaWIudXJsb3Blbih1cmwpCisgICAgICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuX2NoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgICAgICAgICAgZiA9IHVybGxpYi51cmxvcGVuKHVybCkKICAgICAgICAgICAgICAgICBkbGVuID0gZi5pbmZvKCkuZ2V0aGVhZGVyKCJjb250ZW50LWxlbmd0aCIpCiAgICAgICAgICAgICAgICAgaWYgZGxlbiBhbmQgKGludChkbGVuKSA+IDApOgogICAgICAgICAgICAgICAgICAgICBkMiA9IGYucmVhZChpbnQoZGxlbikpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N5bnRheC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5CmluZGV4IDM2NmMxZTguLjJjMjdiZjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5CkBAIC01MDYsNyArNTA2LDkgQEAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFN5bnRheFRlc3RDYXNlKQogICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zeW50YXgKLSAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9zeW50YXgsIHZlcmJvc2l0eT1UcnVlKQorICAgIHdpdGggdGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKCgiYmFja3F1b3RlIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9zeW50YXgsIHZlcmJvc2l0eT1UcnVlKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3R5cGVzLnB5IGIvTGliL3Rlc3QvdGVzdF90eXBlcy5weQppbmRleCAxMGFkNjM0Li5kZWUxY2E3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3R5cGVzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkKQEAgLTEsNiArMSw3IEBACiAjIFB5dGhvbiB0ZXN0IHNldCAtLSBwYXJ0IDYsIGJ1aWx0LWluIHR5cGVzCiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgaGF2ZV91bmljb2RlLCBydW5fd2l0aF9sb2NhbGUKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgaGF2ZV91bmljb2RlLCBydW5fd2l0aF9sb2NhbGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jaGVja19weTNrX3dhcm5pbmdzCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBzeXMKIGltcG9ydCBsb2NhbGUKQEAgLTYzOSw3ICs2NDAsMTAgQEAKIAogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgcnVuX3VuaXR0ZXN0KFR5cGVzVGVzdHMpCisgICAgd2l0aCBfY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgiYnVmZmVyLi4gbm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAoImNsYXNzaWMgbG9uZyBkaXZpc2lvbiIsIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICBydW5fdW5pdHRlc3QoVHlwZXNUZXN0cykKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91bmRvY3VtZW50ZWRfZGV0YWlscy5weSBiL0xpYi90ZXN0L3Rlc3RfdW5kb2N1bWVudGVkX2RldGFpbHMucHkKaW5kZXggY2E2NmMxOS4uYmM5MDA3YiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91bmRvY3VtZW50ZWRfZGV0YWlscy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VuZG9jdW1lbnRlZF9kZXRhaWxzLnB5CkBAIC0xLDQgKzEsNCBAQAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBoYXZlX3VuaWNvZGUKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgX2NoZWNrX3B5M2tfd2FybmluZ3MKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHN5cwogCkBAIC0zMyw3ICszMyw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnX2NlbGwgIT0gaF9jZWxsKQogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgcnVuX3VuaXR0ZXN0KFRlc3RJbXBsZW1lbnRhdGlvbkNvbXBhcmlzb25zKQorICAgIHdpdGggX2NoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KFRlc3RJbXBsZW1lbnRhdGlvbkNvbXBhcmlzb25zKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5IGIvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weQppbmRleCAwODE4ZTk4Li5kZjk1ODhjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICAgICAgIyBUZXN0IF9fcmVwcl9fCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHUwKSwgc3RyKGQwKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUxKSwgcmVwcihkMSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYHUyYCwgYGQyYCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUyKSwgcmVwcihkMikpCiAKICAgICAgICAgIyBUZXN0IF9fY21wX18gYW5kIF9fbGVuX18KICAgICAgICAgYWxsID0gW2QwLCBkMSwgZDIsIHUsIHUwLCB1MSwgdTIsIHV1LCB1dTAsIHV1MSwgdXUyXQpAQCAtOTUsMTIgKzk1LDEzIEBACiAKICAgICAgICAgIyBUZXN0IGhhc19rZXkgYW5kICJpbiIuCiAgICAgICAgIGZvciBpIGluIHUyLmtleXMoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh1Mi5oYXNfa2V5KGkpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGkgaW4gdTIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUxLmhhc19rZXkoaSksIGQxLmhhc19rZXkoaSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaSBpbiB1MikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSBpbiB1MSwgaSBpbiBkMSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTAuaGFzX2tleShpKSwgZDAuaGFzX2tleShpKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSBpbiB1MCwgaSBpbiBkMCkKKyAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUyLmhhc19rZXkoaSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1MS5oYXNfa2V5KGkpLCBkMS5oYXNfa2V5KGkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTAuaGFzX2tleShpKSwgZDAuaGFzX2tleShpKSkKIAogICAgICAgICAjIFRlc3QgdXBkYXRlCiAgICAgICAgIHQgPSBVc2VyRGljdC5Vc2VyRGljdCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VzZXJsaXN0LnB5IGIvTGliL3Rlc3QvdGVzdF91c2VybGlzdC5weQppbmRleCBlZDNlNTU5Li5mZmU0YWExNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91c2VybGlzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VzZXJsaXN0LnB5CkBAIC01Myw3ICs1Myw5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlcihUKCgxLDIpKSkubmV4dCgpLCAiMCEhISIpCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFVzZXJMaXN0VGVzdCkKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5fY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgiLitfXyhnZXR8c2V0fGRlbClzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChVc2VyTGlzdFRlc3QpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2Vha3JlZi5weSBiL0xpYi90ZXN0L3Rlc3Rfd2Vha3JlZi5weQppbmRleCBiYTEwOWFlLi45YmNiMDkwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dlYWtyZWYucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93ZWFrcmVmLnB5CkBAIC01NCwxMCArNTQsMTAgQEAKICAgICAgICAgIyBMaXZlIHJlZmVyZW5jZToKICAgICAgICAgbyA9IEMoKQogICAgICAgICB3ciA9IHdlYWtyZWYucmVmKG8pCi0gICAgICAgIGB3cmAKKyAgICAgICAgcmVwcih3cikKICAgICAgICAgIyBEZWFkIHJlZmVyZW5jZToKICAgICAgICAgZGVsIG8KLSAgICAgICAgYHdyYAorICAgICAgICByZXByKHdyKQogCiAgICAgZGVmIHRlc3RfYmFzaWNfY2FsbGJhY2soc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfYmFzaWNfY2FsbGJhY2soQykKQEAgLTE2OSw3ICsxNjksOCBAQAogICAgICAgICBwLmFwcGVuZCgxMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oTCksIDEpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhwLCAicHJveHkgZm9yIG5vbi1lbXB0eSBVc2VyTGlzdCBzaG91bGQgYmUgdHJ1ZSIpCi0gICAgICAgIHBbOl0gPSBbMiwgM10KKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuX2NoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHBbOl0gPSBbMiwgM10KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oTCksIDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHApLCAyKQogICAgICAgICBzZWxmLmZhaWxVbmxlc3MoMyBpbiBwLApAQCAtMTgzLDEwICsxODQsMTEgQEAKICAgICAgICAgIyMgc2VsZi5hc3NlcnRFcXVhbChyZXByKEwyKSwgcmVwcihwMikpCiAgICAgICAgIEwzID0gVXNlckxpc3QuVXNlckxpc3QocmFuZ2UoMTApKQogICAgICAgICBwMyA9IHdlYWtyZWYucHJveHkoTDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTDNbOl0sIHAzWzpdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwzWzU6XSwgcDNbNTpdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwzWzo1XSwgcDNbOjVdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwzWzI6NV0sIHAzWzI6NV0pCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwzWzpdLCBwM1s6XSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTDNbNTpdLCBwM1s1Ol0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwzWzo1XSwgcDNbOjVdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMM1syOjVdLCBwM1syOjVdKQogCiAgICAgZGVmIHRlc3RfcHJveHlfdW5pY29kZShzZWxmKToKICAgICAgICAgIyBTZWUgYnVnIDUwMzcKQEAgLTgzMiw3ICs4MzQsNyBAQAogICAgIGRlZiB0ZXN0X3dlYWtfa2V5cyhzZWxmKToKICAgICAgICAgIwogICAgICAgICAjICBUaGlzIGV4ZXJjaXNlcyBkLmNvcHkoKSwgZC5pdGVtcygpLCBkW10gPSB2LCBkW10sIGRlbCBkW10sCi0gICAgICAgICMgIGxlbihkKSwgZC5oYXNfa2V5KCkuCisgICAgICAgICMgIGxlbihkKSwgaW4gZC4KICAgICAgICAgIwogICAgICAgICBkaWN0LCBvYmplY3RzID0gc2VsZi5tYWtlX3dlYWtfa2V5ZWRfZGljdCgpCiAgICAgICAgIGZvciBvIGluIG9iamVjdHM6CkBAIC04NTQsOCArODU2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICJkZWxldGluZyB0aGUga2V5cyBkaWQgbm90IGNsZWFyIHRoZSBkaWN0aW9uYXJ5IikKICAgICAgICAgbyA9IE9iamVjdCg0MikKICAgICAgICAgZGljdFtvXSA9ICJXaGF0IGlzIHRoZSBtZWFuaW5nIG9mIHRoZSB1bml2ZXJzZT8iCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkaWN0Lmhhc19rZXkobykpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZGljdC5oYXNfa2V5KDM0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG8gaW4gZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDM0IG5vdCBpbiBkaWN0KQogCiAgICAgZGVmIHRlc3Rfd2Vha19rZXllZF9pdGVycyhzZWxmKToKICAgICAgICAgZGljdCwgb2JqZWN0cyA9IHNlbGYubWFrZV93ZWFrX2tleWVkX2RpY3QoKQpAQCAtODY3LDggKzg2OSw3IEBACiAgICAgICAgIG9iamVjdHMyID0gbGlzdChvYmplY3RzKQogICAgICAgICBmb3Igd3IgaW4gcmVmczoKICAgICAgICAgICAgIG9iID0gd3IoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGRpY3QuaGFzX2tleShvYikpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ob2IgaW4gZGljdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvYiBpbiBkaWN0KQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYi5hcmcsIGRpY3Rbb2JdKQogICAgICAgICAgICAgb2JqZWN0czIucmVtb3ZlKG9iKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvYmplY3RzMiksIDApCkBAIC04NzgsOCArODc5LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGlzdChkaWN0Lml0ZXJrZXlyZWZzKCkpKSwgbGVuKG9iamVjdHMpKQogICAgICAgICBmb3Igd3IgaW4gZGljdC5pdGVya2V5cmVmcygpOgogICAgICAgICAgICAgb2IgPSB3cigpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZGljdC5oYXNfa2V5KG9iKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvYiBpbiBkaWN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9iIGluIGRpY3QpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iLmFyZywgZGljdFtvYl0pCiAgICAgICAgICAgICBvYmplY3RzMi5yZW1vdmUob2IpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9iamVjdHMyKSwgMCkKQEAgLTk5MiwxNiArOTkyLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAiIC0tIHZhbHVlIHBhcmFtZXRlcnMgbXVzdCBiZSBkaXN0aW5jdCBvYmplY3RzIikKICAgICAgICAgd2Vha2RpY3QgPSBrbGFzcygpCiAgICAgICAgIG8gPSB3ZWFrZGljdC5zZXRkZWZhdWx0KGtleSwgdmFsdWUxKQotICAgICAgICBzZWxmLmFzc2VydF8obyBpcyB2YWx1ZTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3ZWFrZGljdC5oYXNfa2V5KGtleSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3ZWFrZGljdC5nZXQoa2V5KSBpcyB2YWx1ZTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3ZWFrZGljdFtrZXldIGlzIHZhbHVlMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG8gaXMgdmFsdWUxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoa2V5IGluIHdlYWtkaWN0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha2RpY3QuZ2V0KGtleSkgaXMgdmFsdWUxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha2RpY3Rba2V5XSBpcyB2YWx1ZTEpCiAKICAgICAgICAgbyA9IHdlYWtkaWN0LnNldGRlZmF1bHQoa2V5LCB2YWx1ZTIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhvIGlzIHZhbHVlMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtkaWN0Lmhhc19rZXkoa2V5KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtkaWN0LmdldChrZXkpIGlzIHZhbHVlMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtkaWN0W2tleV0gaXMgdmFsdWUxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobyBpcyB2YWx1ZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrZXkgaW4gd2Vha2RpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrZGljdC5nZXQoa2V5KSBpcyB2YWx1ZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrZGljdFtrZXldIGlzIHZhbHVlMSkKIAogICAgIGRlZiB0ZXN0X3dlYWtfdmFsdWVkX2RpY3Rfc2V0ZGVmYXVsdChzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19zZXRkZWZhdWx0KHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSwKQEAgLTEwMTMsMjQgKzEwMTMsMjQgQEAKIAogICAgIGRlZiBjaGVja191cGRhdGUoc2VsZiwga2xhc3MsIGRpY3QpOgogICAgICAgICAjCi0gICAgICAgICMgIFRoaXMgZXhlcmNpc2VzIGQudXBkYXRlKCksIGxlbihkKSwgZC5rZXlzKCksIGQuaGFzX2tleSgpLAorICAgICAgICAjICBUaGlzIGV4ZXJjaXNlcyBkLnVwZGF0ZSgpLCBsZW4oZCksIGQua2V5cygpLCBpbiBkLAogICAgICAgICAjICBkLmdldCgpLCBkW10uCiAgICAgICAgICMKICAgICAgICAgd2Vha2RpY3QgPSBrbGFzcygpCiAgICAgICAgIHdlYWtkaWN0LnVwZGF0ZShkaWN0KQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHdlYWtkaWN0KSA9PSBsZW4oZGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHdlYWtkaWN0KSwgbGVuKGRpY3QpKQogICAgICAgICBmb3IgayBpbiB3ZWFrZGljdC5rZXlzKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZGljdC5oYXNfa2V5KGspLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgaW4gZGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAibXlzdGVyaW91cyBuZXcga2V5IGFwcGVhcmVkIGluIHdlYWsgZGljdCIpCiAgICAgICAgICAgICB2ID0gZGljdC5nZXQoaykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2IGlzIHdlYWtkaWN0W2tdKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHYgaXMgd2Vha2RpY3QuZ2V0KGspKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgaXMgd2Vha2RpY3Rba10pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpcyB3ZWFrZGljdC5nZXQoaykpCiAgICAgICAgIGZvciBrIGluIGRpY3Qua2V5cygpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtkaWN0Lmhhc19rZXkoayksCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoayBpbiB3ZWFrZGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAib3JpZ2luYWwga2V5IGRpc2FwcGVhcmVkIGluIHdlYWsgZGljdCIpCiAgICAgICAgICAgICB2ID0gZGljdFtrXQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHYgaXMgd2Vha2RpY3Rba10pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odiBpcyB3ZWFrZGljdC5nZXQoaykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpcyB3ZWFrZGljdFtrXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGlzIHdlYWtkaWN0LmdldChrKSkKIAogICAgIGRlZiB0ZXN0X3dlYWtfdmFsdWVkX2RpY3RfdXBkYXRlKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3VwZGF0ZSh3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnksCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weQppbmRleCBiNDE2YjgxLi45MTQ3MTliIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHkKQEAgLTE0LDYgKzE0LDcgQEAKIGltcG9ydCBpbnNwZWN0CiBpbXBvcnQgbGluZWNhY2hlCiBpbXBvcnQgcGRiCitpbXBvcnQgd2FybmluZ3MKIAogdmVyYm9zZSA9IHRlc3QudGVzdF9zdXBwb3J0LnZlcmJvc2UKIApAQCAtMTcwLDggKzE3MSwxNSBAQAogICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QudGVzdF90ZXN0ZmlsZSwKICAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfdW5pdHRlc3RfcmVwb3J0ZmxhZ3MsCiAgICAgICAgICAgICBdCi0gICAgICAgICAgICBmb3Igb2JqIGluIGtub3duX2dvb2RfdGVzdHM6Ci0gICAgICAgICAgICAgICAgX3J1bl9vYmplY3RfZG9jdGVzdChvYmosIHRlc3RfemlwcGVkX2RvY3Rlc3QpCisgICAgICAgICAgICAjIE5lZWRlZCBmb3IgdGVzdF9Eb2NUZXN0UGFyc2VyIGFuZCB0ZXN0X2RlYnVnCisgICAgICAgICAgICB3aXRoIHRlc3QudGVzdF9zdXBwb3J0Ll9jaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAgICAgICAgICAgICAoImJhY2txdW90ZSBub3Qgc3VwcG9ydGVkIiwgU3ludGF4V2FybmluZyksCisgICAgICAgICAgICAgICAgICAgICgiZXhlY2ZpbGUuLiBub3Qgc3VwcG9ydGVkIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgICAgICAgICAgIyBJZ25vcmUgYWxsIHdhcm5pbmdzIGFib3V0IHRoZSB1c2Ugb2YgY2xhc3MgVGVzdGVyIGluIHRoaXMgbW9kdWxlLgorICAgICAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiY2xhc3MgVGVzdGVyIGlzIGRlcHJlY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgICAgICBmb3Igb2JqIGluIGtub3duX2dvb2RfdGVzdHM6CisgICAgICAgICAgICAgICAgICAgIF9ydW5fb2JqZWN0X2RvY3Rlc3Qob2JqLCB0ZXN0X3ppcHBlZF9kb2N0ZXN0KQogCiAgICAgZGVmIHRlc3RfZG9jdGVzdF9tYWluX2lzc3VlNDE5NyhzZWxmKToKICAgICAgICAgdGVzdF9zcmMgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAo=