ZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weSBiL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weQppbmRleCA5MjM3YWYwLi5hZDQ1YzI5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21hcnNoYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5CkBAIC0xLDQ0ICsxLDE4OCBAQAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdEZhaWxlZAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBpbXBvcnQgbWFyc2hhbAogaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKIAotIyBYWFggTXVjaCBtb3JlIG5lZWRlZCBoZXJlLgorY2xhc3MgSW50VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2ludHMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGUgZnVsbCByYW5nZSBvZiBQeXRob24gaW50cy4KKyAgICAgICAgbiA9IHN5cy5tYXhpbnQKKyAgICAgICAgd2hpbGUgbjoKKyAgICAgICAgICAgIGZvciBleHBlY3RlZCBpbiAoLW4sIG4pOgorICAgICAgICAgICAgICAgIHMgPSBtYXJzaGFsLmR1bXBzKGV4cGVjdGVkKQorICAgICAgICAgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZHMocykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisgICAgICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGV4cGVjdGVkLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQorICAgICAgICAgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKyAgICAgICAgICAgIG4gPSBuID4+IDEKKyAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCiAKLSMgVGVzdCB0aGUgZnVsbCByYW5nZSBvZiBQeXRob24gaW50cy4KLW4gPSBzeXMubWF4aW50Ci13aGlsZSBuOgotICAgIGZvciBleHBlY3RlZCBpbiAoLW4sIG4pOgotICAgICAgICBzID0gbWFyc2hhbC5kdW1wcyhleHBlY3RlZCkKKyAgICBkZWYgdGVzdF9pbnQ2NChzZWxmKToKKyAgICAgICAgIyBTaW11bGF0ZSBpbnQgbWFyc2hhbGluZyBvbiBhIDY0LWJpdCBib3guICBUaGlzIGlzIG1vc3QgaW50ZXJlc3RpbmcgaWYKKyAgICAgICAgIyB3ZSdyZSBydW5uaW5nIHRoZSB0ZXN0IG9uIGEgMzItYml0IGJveCwgb2YgY291cnNlLgorCisgICAgICAgIGRlZiB0b19saXR0bGVfZW5kaWFuX3N0cmluZyh2YWx1ZSwgbmJ5dGVzKToKKyAgICAgICAgICAgIGJ5dGVzID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG5ieXRlcyk6CisgICAgICAgICAgICAgICAgYnl0ZXMuYXBwZW5kKGNocih2YWx1ZSAmIDB4ZmYpKQorICAgICAgICAgICAgICAgIHZhbHVlID4+PSA4CisgICAgICAgICAgICByZXR1cm4gJycuam9pbihieXRlcykKKworICAgICAgICBtYXhpbnQ2NCA9ICgxTCA8PCA2MykgLSAxCisgICAgICAgIG1pbmludDY0ID0gLW1heGludDY0LTEKKworICAgICAgICBmb3IgYmFzZSBpbiBtYXhpbnQ2NCwgbWluaW50NjQsIC1tYXhpbnQ2NCwgLShtaW5pbnQ2NCA+PiAxKToKKyAgICAgICAgICAgIHdoaWxlIGJhc2U6CisgICAgICAgICAgICAgICAgcyA9ICdJJyArIHRvX2xpdHRsZV9lbmRpYW5fc3RyaW5nKGJhc2UsIDgpCisgICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZSwgZ290KQorICAgICAgICAgICAgICAgIGlmIGJhc2UgPT0gLTE6ICAjIGEgZml4ZWQtcG9pbnQgZm9yIHNoaWZ0aW5nIHJpZ2h0IDEKKyAgICAgICAgICAgICAgICAgICAgYmFzZSA9IDAKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBiYXNlID4+PSAxCisKKyAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgorICAgICAgICBmb3IgYiBpbiAoVHJ1ZSwgRmFsc2UpOgorICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKGIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBuZXcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYiksIHR5cGUobmV3KSkKKyAgICAgICAgICAgIG1hcnNoYWwuZHVtcChiLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQorICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIG5ldykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShiKSwgdHlwZShuZXcpKQorICAgICAgICAgICAgCitjbGFzcyBGbG9hdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9mbG9hdHMoc2VsZik6CisgICAgICAgICMgVGVzdCBhIGZldyBmbG9hdHMKKyAgICAgICAgc21hbGwgPSAxZS0yNQorICAgICAgICBuID0gc3lzLm1heGludCAqIDMuN2UyNTAKKyAgICAgICAgd2hpbGUgbiA+IHNtYWxsOgorICAgICAgICAgICAgZm9yIGV4cGVjdGVkIGluICgtbiwgbik6CisgICAgICAgICAgICAgICAgZiA9IGZsb2F0KGV4cGVjdGVkKQorICAgICAgICAgICAgICAgIHMgPSBtYXJzaGFsLmR1bXBzKGYpCisgICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgZ290KQorICAgICAgICAgICAgICAgIG1hcnNoYWwuZHVtcChmLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQorICAgICAgICAgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgZ290KQorICAgICAgICAgICAgbiAvPSAxMjMuNDU2NworCisgICAgICAgIGYgPSAwLjAKKyAgICAgICAgcyA9IG1hcnNoYWwuZHVtcHMoZikKICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQotICAgICAgICBpZiBleHBlY3RlZCAhPSBnb3Q6Ci0gICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJmb3IgaW50ICVkLCBtYXJzaGFsIHN0cmluZyBpcyAlciwgbG9hZGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhY2sgYXMgJWQiICUgKGV4cGVjdGVkLCBzLCBnb3QpKQotICAgIG4gPSBuID4+IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBnb3QpCiAKLSMgU2ltdWxhdGUgaW50IG1hcnNoYWxpbmcgb24gYSA2NC1iaXQgYm94LiAgVGhpcyBpcyBtb3N0IGludGVyZXN0aW5nIGlmCi0jIHdlJ3JlIHJ1bm5pbmcgdGhlIHRlc3Qgb24gYSAzMi1iaXQgYm94LCBvZiBjb3Vyc2UuCisgICAgICAgIG4gPSBzeXMubWF4aW50ICogMy43ZS0yNTAKKyAgICAgICAgd2hpbGUgbiA8IHNtYWxsOgorICAgICAgICAgICAgZm9yIGV4cGVjdGVkIGluICgtbiwgbik6CisgICAgICAgICAgICAgICAgZiA9IGZsb2F0KGV4cGVjdGVkKQorICAgICAgICAgICAgICAgIHMgPSBtYXJzaGFsLmR1bXBzKGYpCisgICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgZ290KQorICAgICAgICAgICAgICAgIG1hcnNoYWwuZHVtcChmLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQorICAgICAgICAgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgZ290KQorICAgICAgICAgICAgbiAqPSAxMjMuNDU2NworICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKIAotZGVmIHRvX2xpdHRsZV9lbmRpYW5fc3RyaW5nKHZhbHVlLCBuYnl0ZXMpOgotICAgIGJ5dGVzID0gW10KLSAgICBmb3IgaSBpbiByYW5nZShuYnl0ZXMpOgotICAgICAgICBieXRlcy5hcHBlbmQoY2hyKHZhbHVlICYgMHhmZikpCi0gICAgICAgIHZhbHVlID4+PSA4Ci0gICAgcmV0dXJuICcnLmpvaW4oYnl0ZXMpCitjbGFzcyBTdHJpbmdUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfdW5pY29kZShzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gW3UiIiwgdSJBbmRy6CBQcmV2aW4iLCB1ImFiYyIsIHUiICIqMTAwMDBdOgorICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBuZXcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocyksIHR5cGUobmV3KSkKKyAgICAgICAgICAgIG1hcnNoYWwuZHVtcChzLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQorICAgICAgICAgICAgbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIG5ldykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzKSwgdHlwZShuZXcpKQorICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKIAotbWF4aW50NjQgPSAoMUwgPDwgNjMpIC0gMQotbWluaW50NjQgPSAtbWF4aW50NjQtMQorICAgIGRlZiB0ZXN0X3N0cmluZyhzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gWyIiLCAiQW5kcuggUHJldmluIiwgImFiYyIsICIgIioxMDAwMF06CisgICAgICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHMocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIG5ldykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzKSwgdHlwZShuZXcpKQorICAgICAgICAgICAgbWFyc2hhbC5kdW1wKHMsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCisgICAgICAgICAgICBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgbmV3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHMpLCB0eXBlKG5ldykpCisgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQogCi1mb3IgYmFzZSBpbiBtYXhpbnQ2NCwgbWluaW50NjQsIC1tYXhpbnQ2NCwgLShtaW5pbnQ2NCA+PiAxKToKLSAgICB3aGlsZSBiYXNlOgotICAgICAgICBzID0gJ0knICsgdG9fbGl0dGxlX2VuZGlhbl9zdHJpbmcoYmFzZSwgOCkKLSAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQotICAgICAgICBpZiBiYXNlICE9IGdvdDoKLSAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoImZvciBpbnQgJWQsIHNpbXVsYXRlZCBtYXJzaGFsIHN0cmluZyBpcyAlciwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVkIGJhY2sgYXMgJWQiICUgKGJhc2UsIHMsIGdvdCkpCi0gICAgICAgIGlmIGJhc2UgPT0gLTE6ICAjIGEgZml4ZWQtcG9pbnQgZm9yIHNoaWZ0aW5nIHJpZ2h0IDEKLSAgICAgICAgICAgIGJhc2UgPSAwCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBiYXNlID4+PSAxCisgICAgZGVmIHRlc3RfYnVmZmVyKHNlbGYpOgorICAgICAgICBmb3IgcyBpbiBbIiIsICJBbmRy6CBQcmV2aW4iLCAiYWJjIiwgIiAiKjEwMDAwXToKKyAgICAgICAgICAgIGIgPSBidWZmZXIocykKKyAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgbmV3KQorICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGIsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCisgICAgICAgICAgICBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgbmV3KQorICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIAorY2xhc3MgRXhjZXB0aW9uVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhTdG9wSXRlcmF0aW9uKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTdG9wSXRlcmF0aW9uLCBuZXcpCiAKLSMgU2ltcGxlLW1pbmRlZCBjaGVjayBmb3IgU0YgNTg4NDUyOiBEZWJ1ZyBidWlsZCBjcmFzaGVzCi1tYXJzaGFsLmR1bXBzKFsxMjhdICogMTAwMCkKK2NsYXNzIENvZGVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY29kZShzZWxmKToKKyAgICAgICAgY28gPSBFeGNlcHRpb25UZXN0Q2FzZS50ZXN0X2V4Y2VwdGlvbnMuZnVuY19jb2RlCisgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhjbykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY28sIG5ldykKKworY2xhc3MgQ29udGFpbmVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGQgPSB7J2FzdHJpbmcnOiAnZm9vQGJhci5iYXouc3BhbScsCisgICAgICAgICAnYWZsb2F0JzogNzI4My40MywKKyAgICAgICAgICdhbmludCc6IDIqKjIwLAorICAgICAgICAgJ2FzaG9ydGxvbmcnOiAyTCwKKyAgICAgICAgICdhbGlzdCc6IFsnLnp5eC40MSddLAorICAgICAgICAgJ2F0dXBsZSc6ICgnLnp5eC40MScsKSoxMCwKKyAgICAgICAgICdhYm9vbGVhbic6IEZhbHNlLAorICAgICAgICAgJ2F1bmljb2RlJzogdSJBbmRy6CBQcmV2aW4iCisgICAgICAgICB9CisgICAgZGVmIHRlc3RfZGljdChzZWxmKToKKyAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKHNlbGYuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLCBuZXcpCisgICAgICAgIG1hcnNoYWwuZHVtcChzZWxmLmQsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCisgICAgICAgIG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZCwgbmV3KQorICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgCisgICAgZGVmIHRlc3RfbGlzdChzZWxmKToKKyAgICAgICAgbHN0ID0gc2VsZi5kLml0ZW1zKCkKKyAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKGxzdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBuZXcpCisgICAgICAgIG1hcnNoYWwuZHVtcChsc3QsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCisgICAgICAgIG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgbmV3KQorICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X3R1cGxlKHNlbGYpOgorICAgICAgICB0ID0gdHVwbGUoc2VsZi5kLmtleXMoKSkKKyAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKHQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIG5ldykKKyAgICAgICAgbWFyc2hhbC5kdW1wKHQsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCisgICAgICAgIG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIG5ldykKKyAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIAorY2xhc3MgQnVnc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9idWdfNTg4ODQ1MihzZWxmKToKKyAgICAgICAgIyBTaW1wbGUtbWluZGVkIGNoZWNrIGZvciBTRiA1ODg0NTI6IERlYnVnIGJ1aWxkIGNyYXNoZXMKKyAgICAgICAgbWFyc2hhbC5kdW1wcyhbMTI4XSAqIDEwMDApCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEludFRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXRUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1Rlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZVRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyVGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25UZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z3NUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQo=