ZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvYmFja3VwLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9iYWNrdXAucHkKaW5kZXggMzYzN2M0Yi4uZGRmZjc4YyAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC9iYWNrdXAucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9iYWNrdXAucHkKQEAgLTE2Miw3ICsxNjIsNyBAQCBkZWYgdGVzdF9kYXRhYmFzZV9zb3VyY2VfbmFtZShzZWxmKToKIAogCiBkZWYgc3VpdGUoKToKLSAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEJhY2t1cFRlc3RzKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0TG9hZGVyKCkubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEJhY2t1cFRlc3RzKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkKaW5kZXggMzEzMWMxZS4uNzk4NWNkMyAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5CkBAIC0yOSw2MSArMjksNjEgQEAKIAogCiBjbGFzcyBNb2R1bGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIENoZWNrQVBJTGV2ZWwoc2VsZik6CisgICAgZGVmIHRlc3RfYXBpX2xldmVsKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNxbGl0ZS5hcGlsZXZlbCwgIjIuMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImFwaWxldmVsIGlzICVzLCBzaG91bGQgYmUgMi4wIiAlIHNxbGl0ZS5hcGlsZXZlbCkKIAotICAgIGRlZiBDaGVja1RocmVhZFNhZmV0eShzZWxmKToKKyAgICBkZWYgdGVzdF90aHJlYWRfc2FmZXR5KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNxbGl0ZS50aHJlYWRzYWZldHksIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZHNhZmV0eSBpcyAlZCwgc2hvdWxkIGJlIDEiICUgc3FsaXRlLnRocmVhZHNhZmV0eSkKIAotICAgIGRlZiBDaGVja1BhcmFtU3R5bGUoc2VsZik6CisgICAgZGVmIHRlc3RfcGFyYW1fc3R5bGUoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3FsaXRlLnBhcmFtc3R5bGUsICJxbWFyayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtc3R5bGUgaXMgJyVzJywgc2hvdWxkIGJlICdxbWFyayciICUKICAgICAgICAgICAgICAgICAgICAgICAgICBzcWxpdGUucGFyYW1zdHlsZSkKIAotICAgIGRlZiBDaGVja1dhcm5pbmcoc2VsZik6CisgICAgZGVmIHRlc3Rfd2FybmluZyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLldhcm5pbmcsIEV4Y2VwdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZyBpcyBub3QgYSBzdWJjbGFzcyBvZiBFeGNlcHRpb24iKQogCi0gICAgZGVmIENoZWNrRXJyb3Ioc2VsZik6CisgICAgZGVmIHRlc3RfZXJyb3Ioc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5FcnJvciwgRXhjZXB0aW9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBFeGNlcHRpb24iKQogCi0gICAgZGVmIENoZWNrSW50ZXJmYWNlRXJyb3Ioc2VsZik6CisgICAgZGVmIHRlc3RfaW50ZXJmYWNlX2Vycm9yKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZXJmYWNlRXJyb3IsIHNxbGl0ZS5FcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJmYWNlRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRXJyb3IiKQogCi0gICAgZGVmIENoZWNrRGF0YWJhc2VFcnJvcihzZWxmKToKKyAgICBkZWYgdGVzdF9kYXRhYmFzZV9lcnJvcihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLkRhdGFiYXNlRXJyb3IsIHNxbGl0ZS5FcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YWJhc2VFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBFcnJvciIpCiAKLSAgICBkZWYgQ2hlY2tEYXRhRXJyb3Ioc2VsZik6CisgICAgZGVmIHRlc3RfZGF0YV9lcnJvcihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLkRhdGFFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGFFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKIAotICAgIGRlZiBDaGVja09wZXJhdGlvbmFsRXJyb3Ioc2VsZik6CisgICAgZGVmIHRlc3Rfb3BlcmF0aW9uYWxfZXJyb3Ioc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW9uYWxFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKIAotICAgIGRlZiBDaGVja0ludGVncml0eUVycm9yKHNlbGYpOgorICAgIGRlZiB0ZXN0X2ludGVncml0eV9lcnJvcihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLkludGVncml0eUVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZWdyaXR5RXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCiAKLSAgICBkZWYgQ2hlY2tJbnRlcm5hbEVycm9yKHNlbGYpOgorICAgIGRlZiB0ZXN0X2ludGVybmFsX2Vycm9yKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZXJuYWxFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgIkludGVybmFsRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCiAKLSAgICBkZWYgQ2hlY2tQcm9ncmFtbWluZ0Vycm9yKHNlbGYpOgorICAgIGRlZiB0ZXN0X3Byb2dyYW1taW5nX2Vycm9yKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgIlByb2dyYW1taW5nRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCiAKLSAgICBkZWYgQ2hlY2tOb3RTdXBwb3J0ZWRFcnJvcihzZWxmKToKKyAgICBkZWYgdGVzdF9ub3Rfc3VwcG9ydGVkX2Vycm9yKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuTm90U3VwcG9ydGVkRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJOb3RTdXBwb3J0ZWRFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKIAotICAgIGRlZiBDaGVja1NoYXJlZENhY2hlRGVwcmVjYXRlZChzZWxmKToKKyAgICBkZWYgdGVzdF9zaGFyZWRfY2FjaGVfZGVwcmVjYXRlZChzZWxmKToKICAgICAgICAgZm9yIGVuYWJsZSBpbiAoVHJ1ZSwgRmFsc2UpOgogICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZykgYXMgY206CiAgICAgICAgICAgICAgICAgc3FsaXRlLmVuYWJsZV9zaGFyZWRfY2FjaGUoZW5hYmxlKQpAQCAtMTAxLDM4ICsxMDEsMzggQEAgZGVmIHNldFVwKHNlbGYpOgogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgc2VsZi5jeC5jbG9zZSgpCiAKLSAgICBkZWYgQ2hlY2tDb21taXQoc2VsZik6CisgICAgZGVmIHRlc3RfY29tbWl0KHNlbGYpOgogICAgICAgICBzZWxmLmN4LmNvbW1pdCgpCiAKLSAgICBkZWYgQ2hlY2tDb21taXRBZnRlck5vQ2hhbmdlcyhzZWxmKToKKyAgICBkZWYgdGVzdF9jb21taXRfYWZ0ZXJfbm9fY2hhbmdlcyhzZWxmKToKICAgICAgICAgIiIiCiAgICAgICAgIEEgY29tbWl0IHNob3VsZCBhbHNvIHdvcmsgd2hlbiBubyBjaGFuZ2VzIHdlcmUgbWFkZSB0byB0aGUgZGF0YWJhc2UuCiAgICAgICAgICIiIgogICAgICAgICBzZWxmLmN4LmNvbW1pdCgpCiAgICAgICAgIHNlbGYuY3guY29tbWl0KCkKIAotICAgIGRlZiBDaGVja1JvbGxiYWNrKHNlbGYpOgorICAgIGRlZiB0ZXN0X3JvbGxiYWNrKHNlbGYpOgogICAgICAgICBzZWxmLmN4LnJvbGxiYWNrKCkKIAotICAgIGRlZiBDaGVja1JvbGxiYWNrQWZ0ZXJOb0NoYW5nZXMoc2VsZik6CisgICAgZGVmIHRlc3Rfcm9sbGJhY2tfYWZ0ZXJfbm9fY2hhbmdlcyhzZWxmKToKICAgICAgICAgIiIiCiAgICAgICAgIEEgcm9sbGJhY2sgc2hvdWxkIGFsc28gd29yayB3aGVuIG5vIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBkYXRhYmFzZS4KICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuY3gucm9sbGJhY2soKQogICAgICAgICBzZWxmLmN4LnJvbGxiYWNrKCkKIAotICAgIGRlZiBDaGVja0N1cnNvcihzZWxmKToKKyAgICBkZWYgdGVzdF9jdXJzb3Ioc2VsZik6CiAgICAgICAgIGN1ID0gc2VsZi5jeC5jdXJzb3IoKQogCi0gICAgZGVmIENoZWNrRmFpbGVkT3BlbihzZWxmKToKKyAgICBkZWYgdGVzdF9mYWlsZWRfb3BlbihzZWxmKToKICAgICAgICAgWU9VX0NBTk5PVF9PUEVOX1RISVMgPSAiL2Zvby9iYXIvYmxhLzIzNTM0L215ZGIuZGIiCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpOgogICAgICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoWU9VX0NBTk5PVF9PUEVOX1RISVMpCiAKLSAgICBkZWYgQ2hlY2tDbG9zZShzZWxmKToKKyAgICBkZWYgdGVzdF9jbG9zZShzZWxmKToKICAgICAgICAgc2VsZi5jeC5jbG9zZSgpCiAKLSAgICBkZWYgQ2hlY2tFeGNlcHRpb25zKHNlbGYpOgorICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6CiAgICAgICAgICMgT3B0aW9uYWwgREItQVBJIGV4dGVuc2lvbi4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4Lldhcm5pbmcsIHNxbGl0ZS5XYXJuaW5nKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guRXJyb3IsIHNxbGl0ZS5FcnJvcikKQEAgLTE0NSw3ICsxNDUsNyBAQCBkZWYgQ2hlY2tFeGNlcHRpb25zKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guUHJvZ3JhbW1pbmdFcnJvciwgc3FsaXRlLlByb2dyYW1taW5nRXJyb3IpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5Ob3RTdXBwb3J0ZWRFcnJvciwgc3FsaXRlLk5vdFN1cHBvcnRlZEVycm9yKQogCi0gICAgZGVmIENoZWNrSW5UcmFuc2FjdGlvbihzZWxmKToKKyAgICBkZWYgdGVzdF9pbl90cmFuc2FjdGlvbihzZWxmKToKICAgICAgICAgIyBDYW4ndCB1c2UgZGIgZnJvbSBzZXRVcCBiZWNhdXNlIHdlIHdhbnQgdG8gdGVzdCBpbml0aWFsIHN0YXRlLgogICAgICAgICBjeCA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgIGN1ID0gY3guY3Vyc29yKCkKQEAgLTE2MywxMSArMTYzLDExIEBAIGRlZiBDaGVja0luVHJhbnNhY3Rpb24oc2VsZik6CiAgICAgICAgIHJvdyA9IGN1LmZldGNob25lKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjeC5pbl90cmFuc2FjdGlvbiwgRmFsc2UpCiAKLSAgICBkZWYgQ2hlY2tJblRyYW5zYWN0aW9uUk8oc2VsZik6CisgICAgZGVmIHRlc3RfaW5fdHJhbnNhY3Rpb25fcm8oc2VsZik6CiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgogICAgICAgICAgICAgc2VsZi5jeC5pbl90cmFuc2FjdGlvbiA9IFRydWUKIAotICAgIGRlZiBDaGVja09wZW5XaXRoUGF0aExpa2VPYmplY3Qoc2VsZik6CisgICAgZGVmIHRlc3Rfb3Blbl93aXRoX3BhdGhfbGlrZV9vYmplY3Qoc2VsZik6CiAgICAgICAgICIiIiBDaGVja3MgdGhhdCB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IGNvbm5lY3QgdG8gYSBkYXRhYmFzZSB1c2luZyBhbiBvYmplY3QgdGhhdAogICAgICAgICAgICAgaXMgUGF0aExpa2UsIGkuZS4gaGFzIF9fZnNwYXRoX18oKS4gIiIiCiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh1bmxpbmssIFRFU1RGTikKQEAgLTE3OCw3ICsxNzgsNyBAQCBkZWYgX19mc3BhdGhfXyhzZWxmKToKICAgICAgICAgd2l0aCBzcWxpdGUuY29ubmVjdChwYXRoKSBhcyBjeDoKICAgICAgICAgICAgIGN4LmV4ZWN1dGUoJ2NyZWF0ZSB0YWJsZSB0ZXN0KGlkIGludGVnZXIpJykKIAotICAgIGRlZiBDaGVja09wZW5Vcmkoc2VsZik6CisgICAgZGVmIHRlc3Rfb3Blbl91cmkoc2VsZik6CiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh1bmxpbmssIFRFU1RGTikKICAgICAgICAgd2l0aCBzcWxpdGUuY29ubmVjdChURVNURk4pIGFzIGN4OgogICAgICAgICAgICAgY3guZXhlY3V0ZSgnY3JlYXRlIHRhYmxlIHRlc3QoaWQgaW50ZWdlciknKQpAQCAtMjAzLDIxICsyMDMsMjEgQEAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmN1LmNsb3NlKCkKICAgICAgICAgc2VsZi5jeC5jbG9zZSgpCiAKLSAgICBkZWYgQ2hlY2tFeGVjdXRlTm9BcmdzKHNlbGYpOgorICAgIGRlZiB0ZXN0X2V4ZWN1dGVfbm9fYXJncyhzZWxmKToKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKIAotICAgIGRlZiBDaGVja0V4ZWN1dGVJbGxlZ2FsU3FsKHNlbGYpOgorICAgIGRlZiB0ZXN0X2V4ZWN1dGVfaWxsZWdhbF9zcWwoc2VsZik6CiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpOgogICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgYXNkZiIpCiAKLSAgICBkZWYgQ2hlY2tFeGVjdXRlVG9vTXVjaFNxbChzZWxmKToKKyAgICBkZWYgdGVzdF9leGVjdXRlX3Rvb19tdWNoX3NxbChzZWxmKToKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuV2FybmluZyk6CiAgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCA1KzQ7IHNlbGVjdCA0KzUiKQogCi0gICAgZGVmIENoZWNrRXhlY3V0ZVRvb011Y2hTcWwyKHNlbGYpOgorICAgIGRlZiB0ZXN0X2V4ZWN1dGVfdG9vX211Y2hfc3FsMihzZWxmKToKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgNSs0OyAtLSBmb28gYmFyIikKIAotICAgIGRlZiBDaGVja0V4ZWN1dGVUb29NdWNoU3FsMyhzZWxmKToKKyAgICBkZWYgdGVzdF9leGVjdXRlX3Rvb19tdWNoX3NxbDMoc2VsZik6CiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiIiIKICAgICAgICAgICAgIHNlbGVjdCA1KzQ7CiAKQEAgLTIyNiw1MyArMjI2LDUzIEBAIGRlZiBDaGVja0V4ZWN1dGVUb29NdWNoU3FsMyhzZWxmKToKICAgICAgICAgICAgICovCiAgICAgICAgICAgICAiIiIpCiAKLSAgICBkZWYgQ2hlY2tFeGVjdXRlV3JvbmdTcWxBcmcoc2VsZik6CisgICAgZGVmIHRlc3RfZXhlY3V0ZV93cm9uZ19zcWxfYXJnKHNlbGYpOgogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CiAgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoNDIpCiAKLSAgICBkZWYgQ2hlY2tFeGVjdXRlQXJnSW50KHNlbGYpOgorICAgIGRlZiB0ZXN0X2V4ZWN1dGVfYXJnX2ludChzZWxmKToKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIiwgKDQyLCkpCiAKLSAgICBkZWYgQ2hlY2tFeGVjdXRlQXJnRmxvYXQoc2VsZik6CisgICAgZGVmIHRlc3RfZXhlY3V0ZV9hcmdfZmxvYXQoc2VsZik6CiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpbmNvbWUpIHZhbHVlcyAoPykiLCAoMjUwMC4zMiwpKQogCi0gICAgZGVmIENoZWNrRXhlY3V0ZUFyZ1N0cmluZyhzZWxmKToKKyAgICBkZWYgdGVzdF9leGVjdXRlX2FyZ19zdHJpbmcoc2VsZik6CiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgKCJIdWdvIiwpKQogCi0gICAgZGVmIENoZWNrRXhlY3V0ZUFyZ1N0cmluZ1dpdGhaZXJvQnl0ZShzZWxmKToKKyAgICBkZWYgdGVzdF9leGVjdXRlX2FyZ19zdHJpbmdfd2l0aF96ZXJvX2J5dGUoc2VsZik6CiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgKCJIdVx4MDBnbyIsKSkKIAogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBpZD0/IiwgKHNlbGYuY3UubGFzdHJvd2lkLCkpCiAgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgIkh1XHgwMGdvIikKIAotICAgIGRlZiBDaGVja0V4ZWN1dGVOb25JdGVyYWJsZShzZWxmKToKKyAgICBkZWYgdGVzdF9leGVjdXRlX25vbl9pdGVyYWJsZShzZWxmKToKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBjbToKICAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsIDQyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCAncGFyYW1ldGVycyBhcmUgb2YgdW5zdXBwb3J0ZWQgdHlwZScpCiAKLSAgICBkZWYgQ2hlY2tFeGVjdXRlV3JvbmdOb09mQXJnczEoc2VsZik6CisgICAgZGVmIHRlc3RfZXhlY3V0ZV93cm9uZ19ub19vZl9hcmdzMShzZWxmKToKICAgICAgICAgIyB0b28gbWFueSBwYXJhbWV0ZXJzCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLlByb2dyYW1taW5nRXJyb3IpOgogICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIiwgKDE3LCAiRWdvbiIpKQogCi0gICAgZGVmIENoZWNrRXhlY3V0ZVdyb25nTm9PZkFyZ3MyKHNlbGYpOgorICAgIGRlZiB0ZXN0X2V4ZWN1dGVfd3Jvbmdfbm9fb2ZfYXJnczIoc2VsZik6CiAgICAgICAgICMgdG9vIGxpdHRsZSBwYXJhbWV0ZXJzCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLlByb2dyYW1taW5nRXJyb3IpOgogICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIikKIAotICAgIGRlZiBDaGVja0V4ZWN1dGVXcm9uZ05vT2ZBcmdzMyhzZWxmKToKKyAgICBkZWYgdGVzdF9leGVjdXRlX3dyb25nX25vX29mX2FyZ3MzKHNlbGYpOgogICAgICAgICAjIG5vIHBhcmFtZXRlcnMsIHBhcmFtZXRlcnMgYXJlIG5lZWRlZAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKICAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIpCiAKLSAgICBkZWYgQ2hlY2tFeGVjdXRlUGFyYW1MaXN0KHNlbGYpOgorICAgIGRlZiB0ZXN0X2V4ZWN1dGVfcGFyYW1fbGlzdChzZWxmKToKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT0/IiwgWyJmb28iXSkKICAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKIAotICAgIGRlZiBDaGVja0V4ZWN1dGVQYXJhbVNlcXVlbmNlKHNlbGYpOgorICAgIGRlZiB0ZXN0X2V4ZWN1dGVfcGFyYW1fc2VxdWVuY2Uoc2VsZik6CiAgICAgICAgIGNsYXNzIEw6CiAgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgICAgICAgICByZXR1cm4gMQpAQCAtMjg1LDcgKzI4NSw3IEBAIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCB4KToKICAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKIAotICAgIGRlZiBDaGVja0V4ZWN1dGVQYXJhbVNlcXVlbmNlQmFkTGVuKHNlbGYpOgorICAgIGRlZiB0ZXN0X2V4ZWN1dGVfcGFyYW1fc2VxdWVuY2VfYmFkX2xlbihzZWxmKToKICAgICAgICAgIyBJc3N1ZTQxNjYyOiBFcnJvciBpbiBfX2xlbl9fKCkgd2FzIG92ZXJyaWRkZW4gd2l0aCBQcm9ncmFtbWluZ0Vycm9yLgogICAgICAgICBjbGFzcyBMOgogICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CkBAIC0yOTcsMTMgKzI5NywxMyBAQCBkZWYgX19nZXRpdGVtX18oc2xmLCB4KToKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvcik6CiAgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPT8iLCBMKCkpCiAKLSAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmcoc2VsZik6CisgICAgZGVmIHRlc3RfZXhlY3V0ZV9kaWN0X21hcHBpbmcoc2VsZik6CiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUiLCB7Im5hbWUiOiAiZm9vIn0pCiAgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImZvbyIpCiAKLSAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmdfTWFwcGluZyhzZWxmKToKKyAgICBkZWYgdGVzdF9leGVjdXRlX2RpY3RfbWFwcGluZ19tYXBwaW5nKHNlbGYpOgogICAgICAgICBjbGFzcyBEKGRpY3QpOgogICAgICAgICAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6CiAgICAgICAgICAgICAgICAgcmV0dXJuICJmb28iCkBAIC0zMTMsMzIgKzMxMywzMiBAQCBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KToKICAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKIAotICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ1Rvb0xpdHRsZUFyZ3Moc2VsZik6CisgICAgZGVmIHRlc3RfZXhlY3V0ZV9kaWN0X21hcHBpbmdfdG9vX2xpdHRsZV9hcmdzKHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKICAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUgYW5kIGlkPTppZCIsIHsibmFtZSI6ICJmb28ifSkKIAotICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ05vQXJncyhzZWxmKToKKyAgICBkZWYgdGVzdF9leGVjdXRlX2RpY3RfbWFwcGluZ19ub19hcmdzKHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKICAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUiKQogCi0gICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nVW5uYW1lZChzZWxmKToKKyAgICBkZWYgdGVzdF9leGVjdXRlX2RpY3RfbWFwcGluZ191bm5hbWVkKHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKICAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9PyIsIHsibmFtZSI6ICJmb28ifSkKIAotICAgIGRlZiBDaGVja0Nsb3NlKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Nsb3NlKHNlbGYpOgogICAgICAgICBzZWxmLmN1LmNsb3NlKCkKIAotICAgIGRlZiBDaGVja1Jvd2NvdW50RXhlY3V0ZShzZWxmKToKKyAgICBkZWYgdGVzdF9yb3djb3VudF9leGVjdXRlKHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInVwZGF0ZSB0ZXN0IHNldCBuYW1lPSdiYXInIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAyKQogCi0gICAgZGVmIENoZWNrUm93Y291bnRTZWxlY3Qoc2VsZik6CisgICAgZGVmIHRlc3Rfcm93Y291bnRfc2VsZWN0KHNlbGYpOgogICAgICAgICAiIiIKICAgICAgICAgcHlzcWxpdGUgZG9lcyBub3Qga25vdyB0aGUgcm93Y291bnQgb2YgU0VMRUNUIHN0YXRlbWVudHMsIGJlY2F1c2Ugd2UKICAgICAgICAgZG9uJ3QgZmV0Y2ggYWxsIHJvd3MgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBzZWxlY3Qgc3RhdGVtZW50LiBUaGUgcm93Y291bnQKQEAgLTM0NywxMiArMzQ3LDEyIEBAIGRlZiBDaGVja1Jvd2NvdW50U2VsZWN0KHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCA1IHVuaW9uIHNlbGVjdCA2IikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAtMSkKIAotICAgIGRlZiBDaGVja1Jvd2NvdW50RXhlY3V0ZW1hbnkoc2VsZik6CisgICAgZGVmIHRlc3Rfcm93Y291bnRfZXhlY3V0ZW1hbnkoc2VsZik6CiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsIFsoMSwpLCAoMiwpLCAoMywpXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAzKQogCi0gICAgZGVmIENoZWNrVG90YWxDaGFuZ2VzKHNlbGYpOgorICAgIGRlZiB0ZXN0X3RvdGFsX2NoYW5nZXMoc2VsZik6CiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0TGVzcygyLCBzZWxmLmN4LnRvdGFsX2NoYW5nZXMsIG1zZz0ndG90YWwgY2hhbmdlcyByZXBvcnRlZCB3cm9uZyB2YWx1ZScpCkBAIC0zNjEsMTAgKzM2MSwxMCBAQCBkZWYgQ2hlY2tUb3RhbENoYW5nZXMoc2VsZik6CiAgICAgIyBTZXF1ZW5jZXMgYXJlIHJlcXVpcmVkIGJ5IHRoZSBEQi1BUEksIGl0ZXJhdG9ycwogICAgICMgZW5oYW5jZW1lbnRzIGluIHB5c3FsaXRlLgogCi0gICAgZGVmIENoZWNrRXhlY3V0ZU1hbnlTZXF1ZW5jZShzZWxmKToKKyAgICBkZWYgdGVzdF9leGVjdXRlX21hbnlfc2VxdWVuY2Uoc2VsZik6CiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoaW5jb21lKSB2YWx1ZXMgKD8pIiwgWyh4LCkgZm9yIHggaW4gcmFuZ2UoMTAwLCAxMTApXSkKIAotICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55SXRlcmF0b3Ioc2VsZik6CisgICAgZGVmIHRlc3RfZXhlY3V0ZV9tYW55X2l0ZXJhdG9yKHNlbGYpOgogICAgICAgICBjbGFzcyBNeUl0ZXI6CiAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IDUKQEAgLTM3OCwyNiArMzc4LDI2IEBAIGRlZiBfX25leHRfXyhzZWxmKToKIAogICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsIE15SXRlcigpKQogCi0gICAgZGVmIENoZWNrRXhlY3V0ZU1hbnlHZW5lcmF0b3Ioc2VsZik6CisgICAgZGVmIHRlc3RfZXhlY3V0ZV9tYW55X2dlbmVyYXRvcihzZWxmKToKICAgICAgICAgZGVmIG15Z2VuKCk6CiAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKICAgICAgICAgICAgICAgICB5aWVsZCAoaSwpCiAKICAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpbmNvbWUpIHZhbHVlcyAoPykiLCBteWdlbigpKQogCi0gICAgZGVmIENoZWNrRXhlY3V0ZU1hbnlXcm9uZ1NxbEFyZyhzZWxmKToKKyAgICBkZWYgdGVzdF9leGVjdXRlX21hbnlfd3Jvbmdfc3FsX2FyZyhzZWxmKToKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgogICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSg0MiwgWygzLCldKQogCi0gICAgZGVmIENoZWNrRXhlY3V0ZU1hbnlTZWxlY3Qoc2VsZik6CisgICAgZGVmIHRlc3RfZXhlY3V0ZV9tYW55X3NlbGVjdChzZWxmKToKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CiAgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJzZWxlY3QgPyIsIFsoMywpXSkKIAotICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55Tm90SXRlcmFibGUoc2VsZik6CisgICAgZGVmIHRlc3RfZXhlY3V0ZV9tYW55X25vdF9pdGVyYWJsZShzZWxmKToKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgogICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpbmNvbWUpIHZhbHVlcyAoPykiLCA0MikKIAotICAgIGRlZiBDaGVja0ZldGNoSXRlcihzZWxmKToKKyAgICBkZWYgdGVzdF9mZXRjaF9pdGVyKHNlbGYpOgogICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsICg1LCkpCkBAIC00MDksMTkgKzQwOSwxOSBAQCBkZWYgQ2hlY2tGZXRjaEl0ZXIoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0WzBdLCA1KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdFsxXSwgNikKIAotICAgIGRlZiBDaGVja0ZldGNob25lKHNlbGYpOgorICAgIGRlZiB0ZXN0X2ZldGNob25lKHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImZvbyIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdywgTm9uZSkKIAotICAgIGRlZiBDaGVja0ZldGNob25lTm9TdGF0ZW1lbnQoc2VsZik6CisgICAgZGVmIHRlc3RfZmV0Y2hvbmVfbm9fc3RhdGVtZW50KHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmN4LmN1cnNvcigpCiAgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93LCBOb25lKQogCi0gICAgZGVmIENoZWNrQXJyYXlTaXplKHNlbGYpOgorICAgIGRlZiB0ZXN0X2FycmF5X3NpemUoc2VsZik6CiAgICAgICAgICMgbXVzdCBkZWZhdWx0IG90IDEKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LmFycmF5c2l6ZSwgMSkKIApAQCAtNDM4LDUxICs0MzgsNTEgQEAgZGVmIENoZWNrQXJyYXlTaXplKHNlbGYpOgogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDIpCiAKLSAgICBkZWYgQ2hlY2tGZXRjaG1hbnkoc2VsZik6CisgICAgZGVmIHRlc3RfZmV0Y2htYW55KHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KDEwMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKICAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaG1hbnkoMTAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgW10pCiAKLSAgICBkZWYgQ2hlY2tGZXRjaG1hbnlLd0FyZyhzZWxmKToKKyAgICBkZWYgdGVzdF9mZXRjaG1hbnlfa3dfYXJnKHNlbGYpOgogICAgICAgICAiIiJDaGVja3MgaWYgZmV0Y2htYW55IHdvcmtzIHdpdGgga2V5d29yZCBhcmd1bWVudHMiIiIKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNobWFueShzaXplPTEwMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKIAotICAgIGRlZiBDaGVja0ZldGNoYWxsKHNlbGYpOgorICAgIGRlZiB0ZXN0X2ZldGNoYWxsKHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2hhbGwoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAxKQogICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNoYWxsKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIFtdKQogCi0gICAgZGVmIENoZWNrU2V0aW5wdXRzaXplcyhzZWxmKToKKyAgICBkZWYgdGVzdF9zZXRpbnB1dHNpemVzKHNlbGYpOgogICAgICAgICBzZWxmLmN1LnNldGlucHV0c2l6ZXMoWzMsIDQsIDVdKQogCi0gICAgZGVmIENoZWNrU2V0b3V0cHV0c2l6ZShzZWxmKToKKyAgICBkZWYgdGVzdF9zZXRvdXRwdXRzaXplKHNlbGYpOgogICAgICAgICBzZWxmLmN1LnNldG91dHB1dHNpemUoNSwgMCkKIAotICAgIGRlZiBDaGVja1NldG91dHB1dHNpemVOb0NvbHVtbihzZWxmKToKKyAgICBkZWYgdGVzdF9zZXRvdXRwdXRzaXplX25vX2NvbHVtbihzZWxmKToKICAgICAgICAgc2VsZi5jdS5zZXRvdXRwdXRzaXplKDQyKQogCi0gICAgZGVmIENoZWNrQ3Vyc29yQ29ubmVjdGlvbihzZWxmKToKKyAgICBkZWYgdGVzdF9jdXJzb3JfY29ubmVjdGlvbihzZWxmKToKICAgICAgICAgIyBPcHRpb25hbCBEQi1BUEkgZXh0ZW5zaW9uLgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3UuY29ubmVjdGlvbiwgc2VsZi5jeCkKIAotICAgIGRlZiBDaGVja1dyb25nQ3Vyc29yQ2FsbGFibGUoc2VsZik6CisgICAgZGVmIHRlc3Rfd3JvbmdfY3Vyc29yX2NhbGxhYmxlKHNlbGYpOgogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CiAgICAgICAgICAgICBkZWYgZigpOiBwYXNzCiAgICAgICAgICAgICBjdXIgPSBzZWxmLmN4LmN1cnNvcihmKQogCi0gICAgZGVmIENoZWNrQ3Vyc29yV3JvbmdDbGFzcyhzZWxmKToKKyAgICBkZWYgdGVzdF9jdXJzb3Jfd3JvbmdfY2xhc3Moc2VsZik6CiAgICAgICAgIGNsYXNzIEZvbzogcGFzcwogICAgICAgICBmb28gPSBGb28oKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CiAgICAgICAgICAgICBjdXIgPSBzcWxpdGUuQ3Vyc29yKGZvbykKIAotICAgIGRlZiBDaGVja0xhc3RSb3dJRE9uUmVwbGFjZShzZWxmKToKKyAgICBkZWYgdGVzdF9sYXN0X3Jvd19pZF9vbl9yZXBsYWNlKHNlbGYpOgogICAgICAgICAiIiIKICAgICAgICAgSU5TRVJUIE9SIFJFUExBQ0UgYW5kIFJFUExBQ0UgSU5UTyBzaG91bGQgcHJvZHVjZSB0aGUgc2FtZSBiZWhhdmlvci4KICAgICAgICAgIiIiCkBAIC00OTIsNyArNDkyLDcgQEAgZGVmIENoZWNrTGFzdFJvd0lET25SZXBsYWNlKHNlbGYpOgogICAgICAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZShzcWwuZm9ybWF0KHN0YXRlbWVudCksICgxLCAnZm9vJykpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1Lmxhc3Ryb3dpZCwgMSkKIAotICAgIGRlZiBDaGVja0xhc3RSb3dJRE9uSWdub3JlKHNlbGYpOgorICAgIGRlZiB0ZXN0X2xhc3Rfcm93X2lkX29uX2lnbm9yZShzZWxmKToKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKAogICAgICAgICAgICAgImluc2VydCBvciBpZ25vcmUgaW50byB0ZXN0KHVuaXF1ZV90ZXN0KSB2YWx1ZXMgKD8pIiwKICAgICAgICAgICAgICgndGVzdCcsKSkKQEAgLTUwMiw3ICs1MDIsNyBAQCBkZWYgQ2hlY2tMYXN0Um93SURPbklnbm9yZShzZWxmKToKICAgICAgICAgICAgICgndGVzdCcsKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1Lmxhc3Ryb3dpZCwgMikKIAotICAgIGRlZiBDaGVja0xhc3RSb3dJREluc2VydE9SKHNlbGYpOgorICAgIGRlZiB0ZXN0X2xhc3Rfcm93X2lkX2luc2VydF9vX3Ioc2VsZik6CiAgICAgICAgIHJlc3VsdHMgPSBbXQogICAgICAgICBmb3Igc3RhdGVtZW50IGluICgnRkFJTCcsICdBQk9SVCcsICdST0xMQkFDSycpOgogICAgICAgICAgICAgc3FsID0gJ0lOU0VSVCBPUiB7fSBJTlRPIHRlc3QodW5pcXVlX3Rlc3QpIFZBTFVFUyAoPyknCkBAIC01MzAsNyArNTMwLDcgQEAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCiAgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKIAotICAgIGRlZiBDaGVja0NvbkN1cnNvcihzZWxmKToKKyAgICBkZWYgdGVzdF9jb25fY3Vyc29yKHNlbGYpOgogICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKQEAgLTU0OCw3ICs1NDgsNyBAQCBkZWYgcnVuKGNvbiwgZXJyb3JzKToKICAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQogCi0gICAgZGVmIENoZWNrQ29uQ29tbWl0KHNlbGYpOgorICAgIGRlZiB0ZXN0X2Nvbl9jb21taXQoc2VsZik6CiAgICAgICAgIGRlZiBydW4oY29uLCBlcnJvcnMpOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGNvbi5jb21taXQoKQpAQCAtNTY2LDcgKzU2Niw3IEBAIGRlZiBydW4oY29uLCBlcnJvcnMpOgogICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCiAKLSAgICBkZWYgQ2hlY2tDb25Sb2xsYmFjayhzZWxmKToKKyAgICBkZWYgdGVzdF9jb25fcm9sbGJhY2soc2VsZik6CiAgICAgICAgIGRlZiBydW4oY29uLCBlcnJvcnMpOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGNvbi5yb2xsYmFjaygpCkBAIC01ODQsNyArNTg0LDcgQEAgZGVmIHJ1bihjb24sIGVycm9ycyk6CiAgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKICAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKIAotICAgIGRlZiBDaGVja0NvbkNsb3NlKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Nvbl9jbG9zZShzZWxmKToKICAgICAgICAgZGVmIHJ1bihjb24sIGVycm9ycyk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgY29uLmNsb3NlKCkKQEAgLTYwMiw3ICs2MDIsNyBAQCBkZWYgcnVuKGNvbiwgZXJyb3JzKToKICAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQogCi0gICAgZGVmIENoZWNrQ3VySW1wbGljaXRCZWdpbihzZWxmKToKKyAgICBkZWYgdGVzdF9jdXJfaW1wbGljaXRfYmVnaW4oc2VsZik6CiAgICAgICAgIGRlZiBydW4oY3VyLCBlcnJvcnMpOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2EnKSIpCkBAIC02MjAsNyArNjIwLDcgQEAgZGVmIHJ1bihjdXIsIGVycm9ycyk6CiAgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKICAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKIAotICAgIGRlZiBDaGVja0N1ckNsb3NlKHNlbGYpOgorICAgIGRlZiB0ZXN0X2N1cl9jbG9zZShzZWxmKToKICAgICAgICAgZGVmIHJ1bihjdXIsIGVycm9ycyk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgY3VyLmNsb3NlKCkKQEAgLTYzOCw3ICs2MzgsNyBAQCBkZWYgcnVuKGN1ciwgZXJyb3JzKToKICAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQogCi0gICAgZGVmIENoZWNrQ3VyRXhlY3V0ZShzZWxmKToKKyAgICBkZWYgdGVzdF9jdXJfZXhlY3V0ZShzZWxmKToKICAgICAgICAgZGVmIHJ1bihjdXIsIGVycm9ycyk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCkBAIC02NTcsNyArNjU3LDcgQEAgZGVmIHJ1bihjdXIsIGVycm9ycyk6CiAgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKICAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKIAotICAgIGRlZiBDaGVja0N1ckl0ZXJOZXh0KHNlbGYpOgorICAgIGRlZiB0ZXN0X2N1cl9pdGVyX25leHQoc2VsZik6CiAgICAgICAgIGRlZiBydW4oY3VyLCBlcnJvcnMpOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCkBAIC02NzgsMjkgKzY3OCwyOSBAQCBkZWYgcnVuKGN1ciwgZXJyb3JzKToKICAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKIAogY2xhc3MgQ29uc3RydWN0b3JUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIENoZWNrRGF0ZShzZWxmKToKKyAgICBkZWYgdGVzdF9kYXRlKHNlbGYpOgogICAgICAgICBkID0gc3FsaXRlLkRhdGUoMjAwNCwgMTAsIDI4KQogCi0gICAgZGVmIENoZWNrVGltZShzZWxmKToKKyAgICBkZWYgdGVzdF90aW1lKHNlbGYpOgogICAgICAgICB0ID0gc3FsaXRlLlRpbWUoMTIsIDM5LCAzNSkKIAotICAgIGRlZiBDaGVja1RpbWVzdGFtcChzZWxmKToKKyAgICBkZWYgdGVzdF90aW1lc3RhbXAoc2VsZik6CiAgICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcCgyMDA0LCAxMCwgMjgsIDEyLCAzOSwgMzUpCiAKLSAgICBkZWYgQ2hlY2tEYXRlRnJvbVRpY2tzKHNlbGYpOgorICAgIGRlZiB0ZXN0X2RhdGVfZnJvbV90aWNrcyhzZWxmKToKICAgICAgICAgZCA9IHNxbGl0ZS5EYXRlRnJvbVRpY2tzKDQyKQogCi0gICAgZGVmIENoZWNrVGltZUZyb21UaWNrcyhzZWxmKToKKyAgICBkZWYgdGVzdF90aW1lX2Zyb21fdGlja3Moc2VsZik6CiAgICAgICAgIHQgPSBzcWxpdGUuVGltZUZyb21UaWNrcyg0MikKIAotICAgIGRlZiBDaGVja1RpbWVzdGFtcEZyb21UaWNrcyhzZWxmKToKKyAgICBkZWYgdGVzdF90aW1lc3RhbXBfZnJvbV90aWNrcyhzZWxmKToKICAgICAgICAgdHMgPSBzcWxpdGUuVGltZXN0YW1wRnJvbVRpY2tzKDQyKQogCi0gICAgZGVmIENoZWNrQmluYXJ5KHNlbGYpOgorICAgIGRlZiB0ZXN0X2JpbmFyeShzZWxmKToKICAgICAgICAgYiA9IHNxbGl0ZS5CaW5hcnkoYiJcMCciKQogCiBjbGFzcyBFeHRlbnNpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIENoZWNrU2NyaXB0U3RyaW5nU3FsKHNlbGYpOgorICAgIGRlZiB0ZXN0X3NjcmlwdF9zdHJpbmdfc3FsKHNlbGYpOgogICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGVzY3JpcHQoIiIiCkBAIC03MTMsMzEgKzcxMywzMSBAQCBkZWYgQ2hlY2tTY3JpcHRTdHJpbmdTcWwoc2VsZik6CiAgICAgICAgIHJlcyA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCA1KQogCi0gICAgZGVmIENoZWNrU2NyaXB0U3ludGF4RXJyb3Ioc2VsZik6CisgICAgZGVmIHRlc3Rfc2NyaXB0X3N5bnRheF9lcnJvcihzZWxmKToKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpOgogICAgICAgICAgICAgY3VyLmV4ZWN1dGVzY3JpcHQoImNyZWF0ZSB0YWJsZSB0ZXN0KHgpOyBhc2RmOyBjcmVhdGUgdGFibGUgdGVzdDIoeCkiKQogCi0gICAgZGVmIENoZWNrU2NyaXB0RXJyb3JOb3JtYWwoc2VsZik6CisgICAgZGVmIHRlc3Rfc2NyaXB0X2Vycm9yX25vcm1hbChzZWxmKToKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpOgogICAgICAgICAgICAgY3VyLmV4ZWN1dGVzY3JpcHQoImNyZWF0ZSB0YWJsZSB0ZXN0KHNhZGZzYWRmZHNhKTsgc2VsZWN0IGZvbyBmcm9tIGh1cno7IikKIAotICAgIGRlZiBDaGVja0N1cnNvckV4ZWN1dGVzY3JpcHRBc0J5dGVzKHNlbGYpOgorICAgIGRlZiB0ZXN0X2N1cnNvcl9leGVjdXRlc2NyaXB0X2FzX2J5dGVzKHNlbGYpOgogICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBjbToKICAgICAgICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KGIiY3JlYXRlIHRhYmxlIHRlc3QoZm9vKTsgaW5zZXJ0IGludG8gdGVzdChmb28pIHZhbHVlcyAoNSk7IikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgJ3NjcmlwdCBhcmd1bWVudCBtdXN0IGJlIHVuaWNvZGUuJykKIAotICAgIGRlZiBDaGVja0Nvbm5lY3Rpb25FeGVjdXRlKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Nvbm5lY3Rpb25fZXhlY3V0ZShzZWxmKToKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoInNlbGVjdCA1IikuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgNSwgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlIikKIAotICAgIGRlZiBDaGVja0Nvbm5lY3Rpb25FeGVjdXRlbWFueShzZWxmKToKKyAgICBkZWYgdGVzdF9jb25uZWN0aW9uX2V4ZWN1dGVtYW55KHNlbGYpOgogICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoZm9vKSIpCiAgICAgICAgIGNvbi5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChmb28pIHZhbHVlcyAoPykiLCBbKDMsKSwgKDQsKV0pCkBAIC03NDUsNDYgKzc0NSw0NiBAQCBkZWYgQ2hlY2tDb25uZWN0aW9uRXhlY3V0ZW1hbnkoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzBdWzBdLCAzLCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGVtYW55IikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMV1bMF0sIDQsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZW1hbnkiKQogCi0gICAgZGVmIENoZWNrQ29ubmVjdGlvbkV4ZWN1dGVzY3JpcHQoc2VsZik6CisgICAgZGVmIHRlc3RfY29ubmVjdGlvbl9leGVjdXRlc2NyaXB0KHNlbGYpOgogICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgICBjb24uZXhlY3V0ZXNjcmlwdCgiY3JlYXRlIHRhYmxlIHRlc3QoZm9vKTsgaW5zZXJ0IGludG8gdGVzdChmb28pIHZhbHVlcyAoNSk7IikKICAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoInNlbGVjdCBmb28gZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgNSwgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlc2NyaXB0IikKIAogY2xhc3MgQ2xvc2VkQ29uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiBDaGVja0Nsb3NlZENvbkN1cnNvcihzZWxmKToKKyAgICBkZWYgdGVzdF9jbG9zZWRfY29uX2N1cnNvcihzZWxmKToKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICAgY29uLmNsb3NlKCkKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CiAgICAgICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKIAotICAgIGRlZiBDaGVja0Nsb3NlZENvbkNvbW1pdChzZWxmKToKKyAgICBkZWYgdGVzdF9jbG9zZWRfY29uX2NvbW1pdChzZWxmKToKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICAgY29uLmNsb3NlKCkKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CiAgICAgICAgICAgICBjb24uY29tbWl0KCkKIAotICAgIGRlZiBDaGVja0Nsb3NlZENvblJvbGxiYWNrKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Nsb3NlZF9jb25fcm9sbGJhY2soc2VsZik6CiAgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgIGNvbi5jbG9zZSgpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLlByb2dyYW1taW5nRXJyb3IpOgogICAgICAgICAgICAgY29uLnJvbGxiYWNrKCkKIAotICAgIGRlZiBDaGVja0Nsb3NlZEN1ckV4ZWN1dGUoc2VsZik6CisgICAgZGVmIHRlc3RfY2xvc2VkX2N1cl9leGVjdXRlKHNlbGYpOgogICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICAgY29uLmNsb3NlKCkKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CiAgICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IDQiKQogCi0gICAgZGVmIENoZWNrQ2xvc2VkQ3JlYXRlRnVuY3Rpb24oc2VsZik6CisgICAgZGVmIHRlc3RfY2xvc2VkX2NyZWF0ZV9mdW5jdGlvbihzZWxmKToKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICAgY29uLmNsb3NlKCkKICAgICAgICAgZGVmIGYoeCk6IHJldHVybiAxNwogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKICAgICAgICAgICAgIGNvbi5jcmVhdGVfZnVuY3Rpb24oImZvbyIsIDEsIGYpCiAKLSAgICBkZWYgQ2hlY2tDbG9zZWRDcmVhdGVBZ2dyZWdhdGUoc2VsZik6CisgICAgZGVmIHRlc3RfY2xvc2VkX2NyZWF0ZV9hZ2dyZWdhdGUoc2VsZik6CiAgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgIGNvbi5jbG9zZSgpCiAgICAgICAgIGNsYXNzIEFnZzoKQEAgLTc5Nyw3ICs3OTcsNyBAQCBkZWYgZmluYWxpemUoc2VsZik6CiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLlByb2dyYW1taW5nRXJyb3IpOgogICAgICAgICAgICAgY29uLmNyZWF0ZV9hZ2dyZWdhdGUoImZvbyIsIDEsIEFnZykKIAotICAgIGRlZiBDaGVja0Nsb3NlZFNldEF1dGhvcml6ZXIoc2VsZik6CisgICAgZGVmIHRlc3RfY2xvc2VkX3NldF9hdXRob3JpemVyKHNlbGYpOgogICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgICBjb24uY2xvc2UoKQogICAgICAgICBkZWYgYXV0aG9yaXplcigqYXJncyk6CkBAIC04MDUsMjEgKzgwNSwyMSBAQCBkZWYgYXV0aG9yaXplcigqYXJncyk6CiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLlByb2dyYW1taW5nRXJyb3IpOgogICAgICAgICAgICAgY29uLnNldF9hdXRob3JpemVyKGF1dGhvcml6ZXIpCiAKLSAgICBkZWYgQ2hlY2tDbG9zZWRTZXRQcm9ncmVzc0NhbGxiYWNrKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Nsb3NlZF9zZXRfcHJvZ3Jlc3NfY2FsbGJhY2soc2VsZik6CiAgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgIGNvbi5jbG9zZSgpCiAgICAgICAgIGRlZiBwcm9ncmVzcygpOiBwYXNzCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLlByb2dyYW1taW5nRXJyb3IpOgogICAgICAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxMDApCiAKLSAgICBkZWYgQ2hlY2tDbG9zZWRDYWxsKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Nsb3NlZF9jYWxsKHNlbGYpOgogICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgICBjb24uY2xvc2UoKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKICAgICAgICAgICAgIGNvbigpCiAKIGNsYXNzIENsb3NlZEN1clRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgQ2hlY2tDbG9zZWQoc2VsZik6CisgICAgZGVmIHRlc3RfY2xvc2VkKHNlbGYpOgogICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmNsb3NlKCkKQEAgLTg1Nyw3ICs4NTcsNyBAQCBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYuY3UuY2xvc2UoKQogICAgICAgICBzZWxmLmN4LmNsb3NlKCkKIAotICAgIGRlZiBDaGVja09uQ29uZmxpY3RSb2xsYmFja1dpdGhFeHBsaWNpdFRyYW5zYWN0aW9uKHNlbGYpOgorICAgIGRlZiB0ZXN0X29uX2NvbmZsaWN0X3JvbGxiYWNrX3dpdGhfZXhwbGljaXRfdHJhbnNhY3Rpb24oc2VsZik6CiAgICAgICAgIHNlbGYuY3guaXNvbGF0aW9uX2xldmVsID0gTm9uZSAgIyBhdXRvY29tbWl0IG1vZGUKICAgICAgICAgc2VsZi5jdSA9IHNlbGYuY3guY3Vyc29yKCkKICAgICAgICAgIyBTdGFydCBhbiBleHBsaWNpdCB0cmFuc2FjdGlvbi4KQEAgLTg3Miw3ICs4NzIsNyBAQCBkZWYgQ2hlY2tPbkNvbmZsaWN0Um9sbGJhY2tXaXRoRXhwbGljaXRUcmFuc2FjdGlvbihzZWxmKToKICAgICAgICAgIyBUcmFuc2FjdGlvbiBzaG91bGQgaGF2ZSByb2xsZWQgYmFjayBhbmQgbm90aGluZyBzaG91bGQgYmUgaW4gdGFibGUuCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5mZXRjaGFsbCgpLCBbXSkKIAotICAgIGRlZiBDaGVja09uQ29uZmxpY3RBYm9ydFJhaXNlc1dpdGhFeHBsaWNpdFRyYW5zYWN0aW9ucyhzZWxmKToKKyAgICBkZWYgdGVzdF9vbl9jb25mbGljdF9hYm9ydF9yYWlzZXNfd2l0aF9leHBsaWNpdF90cmFuc2FjdGlvbnMoc2VsZik6CiAgICAgICAgICMgQWJvcnQgY2FuY2VscyB0aGUgY3VycmVudCBzcWwgc3RhdGVtZW50IGJ1dCBkb2Vzbid0IGNoYW5nZSBhbnl0aGluZwogICAgICAgICAjIGFib3V0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgogICAgICAgICBzZWxmLmN4Lmlzb2xhdGlvbl9sZXZlbCA9IE5vbmUgICMgYXV0b2NvbW1pdCBtb2RlCkBAIC04ODgsNyArODg4LDcgQEAgZGVmIENoZWNrT25Db25mbGljdEFib3J0UmFpc2VzV2l0aEV4cGxpY2l0VHJhbnNhY3Rpb25zKHNlbGYpOgogICAgICAgICAjIEV4cGVjdCB0aGUgZmlyc3QgdHdvIGluc2VydHMgdG8gd29yaywgdGhpcmQgdG8gZG8gbm90aGluZy4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LmZldGNoYWxsKCksIFsoJ2Fib3J0X3Rlc3QnLCBOb25lKSwgKE5vbmUsICdmb28nLCldKQogCi0gICAgZGVmIENoZWNrT25Db25mbGljdFJvbGxiYWNrV2l0aG91dFRyYW5zYWN0aW9uKHNlbGYpOgorICAgIGRlZiB0ZXN0X29uX2NvbmZsaWN0X3JvbGxiYWNrX3dpdGhvdXRfdHJhbnNhY3Rpb24oc2VsZik6CiAgICAgICAgICMgU3RhcnQgb2YgaW1wbGljaXQgdHJhbnNhY3Rpb24KICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJJTlNFUlQgSU5UTyB0ZXN0KG5hbWUpIFZBTFVFUyAoJ2Fib3J0X3Rlc3QnKSIpCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiSU5TRVJUIE9SIFJPTExCQUNLIElOVE8gdGVzdCh1bmlxdWVfbmFtZSkgVkFMVUVTICgnZm9vJykiKQpAQCAtODk4LDcgKzg5OCw3IEBAIGRlZiBDaGVja09uQ29uZmxpY3RSb2xsYmFja1dpdGhvdXRUcmFuc2FjdGlvbihzZWxmKToKICAgICAgICAgIyBJbXBsaWNpdCB0cmFuc2FjdGlvbiBpcyByb2xsZWQgYmFjayBvbiBlcnJvci4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LmZldGNoYWxsKCksIFtdKQogCi0gICAgZGVmIENoZWNrT25Db25mbGljdEFib3J0UmFpc2VzV2l0aG91dFRyYW5zYWN0aW9ucyhzZWxmKToKKyAgICBkZWYgdGVzdF9vbl9jb25mbGljdF9hYm9ydF9yYWlzZXNfd2l0aG91dF90cmFuc2FjdGlvbnMoc2VsZik6CiAgICAgICAgICMgQWJvcnQgY2FuY2VscyB0aGUgY3VycmVudCBzcWwgc3RhdGVtZW50IGJ1dCBkb2Vzbid0IGNoYW5nZSBhbnl0aGluZwogICAgICAgICAjIGFib3V0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIklOU0VSVCBJTlRPIHRlc3QobmFtZSkgVkFMVUVTICgnYWJvcnRfdGVzdCcpIikKQEAgLTkwOSwyMCArOTA5LDIwIEBAIGRlZiBDaGVja09uQ29uZmxpY3RBYm9ydFJhaXNlc1dpdGhvdXRUcmFuc2FjdGlvbnMoc2VsZik6CiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiU0VMRUNUIG5hbWUsIHVuaXF1ZV9uYW1lIEZST00gdGVzdCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5mZXRjaGFsbCgpLCBbKCdhYm9ydF90ZXN0JywgTm9uZSksIChOb25lLCAnZm9vJywpXSkKIAotICAgIGRlZiBDaGVja09uQ29uZmxpY3RGYWlsKHNlbGYpOgorICAgIGRlZiB0ZXN0X29uX2NvbmZsaWN0X2ZhaWwoc2VsZik6CiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiSU5TRVJUIE9SIEZBSUwgSU5UTyB0ZXN0KHVuaXF1ZV9uYW1lKSBWQUxVRVMgKCdmb28nKSIpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLkludGVncml0eUVycm9yKToKICAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiSU5TRVJUIE9SIEZBSUwgSU5UTyB0ZXN0KHVuaXF1ZV9uYW1lKSBWQUxVRVMgKCdmb28nKSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5mZXRjaGFsbCgpLCBbXSkKIAotICAgIGRlZiBDaGVja09uQ29uZmxpY3RJZ25vcmUoc2VsZik6CisgICAgZGVmIHRlc3Rfb25fY29uZmxpY3RfaWdub3JlKHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIklOU0VSVCBPUiBJR05PUkUgSU5UTyB0ZXN0KHVuaXF1ZV9uYW1lKSBWQUxVRVMgKCdmb28nKSIpCiAgICAgICAgICMgTm90aGluZyBzaG91bGQgaGFwcGVuLgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIklOU0VSVCBPUiBJR05PUkUgSU5UTyB0ZXN0KHVuaXF1ZV9uYW1lKSBWQUxVRVMgKCdmb28nKSIpCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiU0VMRUNUIHVuaXF1ZV9uYW1lIEZST00gdGVzdCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5mZXRjaGFsbCgpLCBbKCdmb28nLCldKQogCi0gICAgZGVmIENoZWNrT25Db25mbGljdFJlcGxhY2Uoc2VsZik6CisgICAgZGVmIHRlc3Rfb25fY29uZmxpY3RfcmVwbGFjZShzZWxmKToKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJJTlNFUlQgT1IgUkVQTEFDRSBJTlRPIHRlc3QobmFtZSwgdW5pcXVlX25hbWUpIFZBTFVFUyAoJ0RhdGEhJywgJ2ZvbycpIikKICAgICAgICAgIyBUaGVyZSBzaG91bGRuJ3QgYmUgYW4gSW50ZWdyaXR5RXJyb3IgZXhjZXB0aW9uLgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoIklOU0VSVCBPUiBSRVBMQUNFIElOVE8gdGVzdChuYW1lLCB1bmlxdWVfbmFtZSkgVkFMVUVTICgnVmVyeSBkaWZmZXJlbnQgZGF0YSEnLCAnZm9vJykiKQpAQCAtOTMxLDIwICs5MzEsMjAgQEAgZGVmIENoZWNrT25Db25mbGljdFJlcGxhY2Uoc2VsZik6CiAKIAogZGVmIHN1aXRlKCk6Ci0gICAgbW9kdWxlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKE1vZHVsZVRlc3RzLCAiQ2hlY2siKQotICAgIGNvbm5lY3Rpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ29ubmVjdGlvblRlc3RzLCAiQ2hlY2siKQotICAgIGN1cnNvcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDdXJzb3JUZXN0cywgIkNoZWNrIikKLSAgICB0aHJlYWRfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoVGhyZWFkVGVzdHMsICJDaGVjayIpCi0gICAgY29uc3RydWN0b3Jfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ29uc3RydWN0b3JUZXN0cywgIkNoZWNrIikKLSAgICBleHRfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoRXh0ZW5zaW9uVGVzdHMsICJDaGVjayIpCi0gICAgY2xvc2VkX2Nvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDbG9zZWRDb25UZXN0cywgIkNoZWNrIikKLSAgICBjbG9zZWRfY3VyX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENsb3NlZEN1clRlc3RzLCAiQ2hlY2siKQotICAgIG9uX2NvbmZsaWN0X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFNxbGl0ZU9uQ29uZmxpY3RUZXN0cywgIkNoZWNrIikKLSAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKCgKLSAgICAgICAgbW9kdWxlX3N1aXRlLCBjb25uZWN0aW9uX3N1aXRlLCBjdXJzb3Jfc3VpdGUsIHRocmVhZF9zdWl0ZSwKLSAgICAgICAgY29uc3RydWN0b3Jfc3VpdGUsIGV4dF9zdWl0ZSwgY2xvc2VkX2Nvbl9zdWl0ZSwgY2xvc2VkX2N1cl9zdWl0ZSwKLSAgICAgICAgb25fY29uZmxpY3Rfc3VpdGUsCi0gICAgKSkKKyAgICB0ZXN0cyA9IFsKKyAgICAgICAgQ2xvc2VkQ29uVGVzdHMsCisgICAgICAgIENsb3NlZEN1clRlc3RzLAorICAgICAgICBDb25uZWN0aW9uVGVzdHMsCisgICAgICAgIENvbnN0cnVjdG9yVGVzdHMsCisgICAgICAgIEN1cnNvclRlc3RzLAorICAgICAgICBFeHRlbnNpb25UZXN0cywKKyAgICAgICAgTW9kdWxlVGVzdHMsCisgICAgICAgIFNxbGl0ZU9uQ29uZmxpY3RUZXN0cywKKyAgICAgICAgVGhyZWFkVGVzdHMsCisgICAgXQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoCisgICAgICAgIFt1bml0dGVzdC5UZXN0TG9hZGVyKCkubG9hZFRlc3RzRnJvbVRlc3RDYXNlKHQpIGZvciB0IGluIHRlc3RzXQorICAgICkKIAogZGVmIHRlc3QoKToKICAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L2R1bXAucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2R1bXAucHkKaW5kZXggYTFmNDVhNC4uNjE4YTdmZCAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC9kdW1wLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvZHVtcC5weQpAQCAtMTEsNyArMTEsNyBAQCBkZWYgc2V0VXAoc2VsZik6CiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmN4LmNsb3NlKCkKIAotICAgIGRlZiBDaGVja1RhYmxlRHVtcChzZWxmKToKKyAgICBkZWYgdGVzdF90YWJsZV9kdW1wKHNlbGYpOgogICAgICAgICBleHBlY3RlZF9zcWxzID0gWwogICAgICAgICAgICAgICAgICIiIkNSRUFURSBUQUJMRSAiaW5kZXgiKCJpbmRleCIgYmxvYik7IiIiCiAgICAgICAgICAgICAgICAgLApAQCAtNDksNyArNDksNyBAQCBkZWYgQ2hlY2tUYWJsZUR1bXAoc2VsZik6CiAgICAgICAgIFtzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3NxbHNbaV0sIGFjdHVhbF9zcWxzW2ldKQogICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGV4cGVjdGVkX3NxbHMpKV0KIAotICAgIGRlZiBDaGVja1Vub3JkZXJhYmxlUm93KHNlbGYpOgorICAgIGRlZiB0ZXN0X3Vub3JkZXJhYmxlX3JvdyhzZWxmKToKICAgICAgICAgIyBpdGVyZHVtcCgpIHNob3VsZCBiZSBhYmxlIHRvIGNvcGUgd2l0aCB1bm9yZGVyYWJsZSByb3cgdHlwZXMgKGlzc3VlICMxNTU0NSkKICAgICAgICAgY2xhc3MgVW5vcmRlcmFibGVSb3c6CiAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY3Vyc29yLCByb3cpOgpAQCAtNzEsNyArNzEsMTIgQEAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQogCiBkZWYgc3VpdGUoKToKLSAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKHVuaXR0ZXN0Lm1ha2VTdWl0ZShEdW1wVGVzdHMsICJDaGVjayIpKQorICAgIHRlc3RzID0gWworICAgICAgICBEdW1wVGVzdHMsCisgICAgXQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoCisgICAgICAgIFt1bml0dGVzdC5UZXN0TG9hZGVyKCkubG9hZFRlc3RzRnJvbVRlc3RDYXNlKHQpIGZvciB0IGluIHRlc3RzXQorICAgICkKIAogZGVmIHRlc3QoKToKICAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHkKaW5kZXggZDkxOTk3My4uOWVlYmI3YiAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weQpAQCAtNDcsNyArNDcsNyBAQCBkZWYgc2V0VXAoc2VsZik6CiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCiAKLSAgICBkZWYgQ2hlY2tJc0luc3RhbmNlKHNlbGYpOgorICAgIGRlZiB0ZXN0X2lzX2luc3RhbmNlKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi5jb24sIE15Q29ubmVjdGlvbikKIAogY2xhc3MgQ3Vyc29yRmFjdG9yeVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTU3LDcgKzU3LDcgQEAgZGVmIHNldFVwKHNlbGYpOgogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgc2VsZi5jb24uY2xvc2UoKQogCi0gICAgZGVmIENoZWNrSXNJbnN0YW5jZShzZWxmKToKKyAgICBkZWYgdGVzdF9pc19pbnN0YW5jZShzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGN1ciwgc3FsaXRlLkN1cnNvcikKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKE15Q3Vyc29yKQpAQCAtNjUsNyArNjUsNyBAQCBkZWYgQ2hlY2tJc0luc3RhbmNlKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoZmFjdG9yeT1sYW1iZGEgY29uOiBNeUN1cnNvcihjb24pKQogICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoY3VyLCBNeUN1cnNvcikKIAotICAgIGRlZiBDaGVja0ludmFsaWRGYWN0b3J5KHNlbGYpOgorICAgIGRlZiB0ZXN0X2ludmFsaWRfZmFjdG9yeShzZWxmKToKICAgICAgICAgIyBub3QgYSBjYWxsYWJsZSBhdCBhbGwKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmNvbi5jdXJzb3IsIE5vbmUpCiAgICAgICAgICMgaW52YWxpZCBjYWxsYWJsZSB3aXRoIG5vdCBleGFjdCBvbmUgYXJndW1lbnQKQEAgLTc3LDcgKzc3LDcgQEAgY2xhc3MgUm93RmFjdG9yeVRlc3RzQmFja3dhcmRzQ29tcGF0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKIAotICAgIGRlZiBDaGVja0lzUHJvZHVjZWRCeUZhY3Rvcnkoc2VsZik6CisgICAgZGVmIHRlc3RfaXNfcHJvZHVjZWRfYnlfZmFjdG9yeShzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKGZhY3Rvcnk9TXlDdXJzb3IpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgNCs1IGFzIGZvbyIpCiAgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCkBAIC05MSwxMiArOTEsMTIgQEAgY2xhc3MgUm93RmFjdG9yeVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKIAotICAgIGRlZiBDaGVja0N1c3RvbUZhY3Rvcnkoc2VsZik6CisgICAgZGVmIHRlc3RfY3VzdG9tX2ZhY3Rvcnkoc2VsZik6CiAgICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gbGFtYmRhIGN1ciwgcm93OiBsaXN0KHJvdykKICAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEsIDIiKS5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShyb3csIGxpc3QpCiAKLSAgICBkZWYgQ2hlY2tTcWxpdGVSb3dJbmRleChzZWxmKToKKyAgICBkZWYgdGVzdF9zcWxpdGVfcm93X2luZGV4KHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IHNxbGl0ZS5Sb3cKICAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYV8xLCAyIGFzIGIiKS5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShyb3csIHNxbGl0ZS5Sb3cpCkBAIC0xMjUsNyArMTI1LDcgQEAgZGVmIENoZWNrU3FsaXRlUm93SW5kZXgoc2VsZik6CiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvcik6CiAgICAgICAgICAgICByb3dbMioqMTAwMF0KIAotICAgIGRlZiBDaGVja1NxbGl0ZVJvd0luZGV4VW5pY29kZShzZWxmKToKKyAgICBkZWYgdGVzdF9zcWxpdGVfcm93X2luZGV4X3VuaWNvZGUoc2VsZik6CiAgICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlLlJvdwogICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBceGZmIikuZmV0Y2hvbmUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1siXHhmZiJdLCAxKQpAQCAtMTM0LDcgKzEzNCw3IEBAIGRlZiBDaGVja1NxbGl0ZVJvd0luZGV4VW5pY29kZShzZWxmKToKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yKToKICAgICAgICAgICAgIHJvd1snXHhkZiddCiAKLSAgICBkZWYgQ2hlY2tTcWxpdGVSb3dTbGljZShzZWxmKToKKyAgICBkZWYgdGVzdF9zcWxpdGVfcm93X3NsaWNlKHNlbGYpOgogICAgICAgICAjIEEgc3FsaXRlLlJvdyBjYW4gYmUgc2xpY2VkIGxpa2UgYSBsaXN0LgogICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IHNxbGl0ZS5Sb3cKICAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEsIDIsIDMsIDQiKS5mZXRjaG9uZSgpCkBAIC0xNTIsMjEgKzE1MiwyMSBAQCBkZWYgQ2hlY2tTcWxpdGVSb3dTbGljZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMDo0OjJdLCAoMSwgMykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzM6MDotMl0sICg0LCAyKSkKIAotICAgIGRlZiBDaGVja1NxbGl0ZVJvd0l0ZXIoc2VsZik6CisgICAgZGVmIHRlc3Rfc3FsaXRlX3Jvd19pdGVyKHNlbGYpOgogICAgICAgICAiIiJDaGVja3MgaWYgdGhlIHJvdyBvYmplY3QgaXMgaXRlcmFibGUiIiIKICAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CiAgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDIgYXMgYiIpLmZldGNob25lKCkKICAgICAgICAgZm9yIGNvbCBpbiByb3c6CiAgICAgICAgICAgICBwYXNzCiAKLSAgICBkZWYgQ2hlY2tTcWxpdGVSb3dBc1R1cGxlKHNlbGYpOgorICAgIGRlZiB0ZXN0X3NxbGl0ZV9yb3dfYXNfdHVwbGUoc2VsZik6CiAgICAgICAgICIiIkNoZWNrcyBpZiB0aGUgcm93IG9iamVjdCBjYW4gYmUgY29udmVydGVkIHRvIGEgdHVwbGUiIiIKICAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CiAgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDIgYXMgYiIpLmZldGNob25lKCkKICAgICAgICAgdCA9IHR1cGxlKHJvdykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAocm93WydhJ10sIHJvd1snYiddKSkKIAotICAgIGRlZiBDaGVja1NxbGl0ZVJvd0FzRGljdChzZWxmKToKKyAgICBkZWYgdGVzdF9zcWxpdGVfcm93X2FzX2RpY3Qoc2VsZik6CiAgICAgICAgICIiIkNoZWNrcyBpZiB0aGUgcm93IG9iamVjdCBjYW4gYmUgY29ycmVjdGx5IGNvbnZlcnRlZCB0byBhIGRpY3Rpb25hcnkiIiIKICAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CiAgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDIgYXMgYiIpLmZldGNob25lKCkKQEAgLTE3NCw3ICsxNzQsNyBAQCBkZWYgQ2hlY2tTcWxpdGVSb3dBc0RpY3Qoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsiYSJdLCByb3dbImEiXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWyJiIl0sIHJvd1siYiJdKQogCi0gICAgZGVmIENoZWNrU3FsaXRlUm93SGFzaENtcChzZWxmKToKKyAgICBkZWYgdGVzdF9zcWxpdGVfcm93X2hhc2hfY21wKHNlbGYpOgogICAgICAgICAiIiJDaGVja3MgaWYgdGhlIHJvdyBvYmplY3QgY29tcGFyZXMgYW5kIGhhc2hlcyBjb3JyZWN0bHkiIiIKICAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CiAgICAgICAgIHJvd18xID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQpAQCAtMjA4LDcgKzIwOCw3IEBAIGRlZiBDaGVja1NxbGl0ZVJvd0hhc2hDbXAoc2VsZik6CiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHJvd18xKSwgaGFzaChyb3dfMikpCiAKLSAgICBkZWYgQ2hlY2tTcWxpdGVSb3dBc1NlcXVlbmNlKHNlbGYpOgorICAgIGRlZiB0ZXN0X3NxbGl0ZV9yb3dfYXNfc2VxdWVuY2Uoc2VsZik6CiAgICAgICAgICIiIiBDaGVja3MgaWYgdGhlIHJvdyBvYmplY3QgY2FuIGFjdCBsaWtlIGEgc2VxdWVuY2UgIiIiCiAgICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlLlJvdwogICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCkBAIC0yMTcsNyArMjE3LDcgQEAgZGVmIENoZWNrU3FsaXRlUm93QXNTZXF1ZW5jZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJldmVyc2VkKHJvdykpLCBsaXN0KHJldmVyc2VkKGFzX3R1cGxlKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShyb3csIFNlcXVlbmNlKQogCi0gICAgZGVmIENoZWNrRmFrZUN1cnNvckNsYXNzKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Zha2VfY3Vyc29yX2NsYXNzKHNlbGYpOgogICAgICAgICAjIElzc3VlICMyNDI1NzogSW5jb3JyZWN0IHVzZSBvZiBQeU9iamVjdF9Jc0luc3RhbmNlKCkgY2F1c2VkCiAgICAgICAgICMgc2VnbWVudGF0aW9uIGZhdWx0LgogICAgICAgICAjIElzc3VlICMyNzg2MTogQWxzbyBhcHBsaWVzIGZvciBjdXJzb3IgZmFjdG9yeS4KQEAgLTIzNCwyNiArMjM0LDI2IEBAIGNsYXNzIFRleHRGYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogCi0gICAgZGVmIENoZWNrVW5pY29kZShzZWxmKToKKyAgICBkZWYgdGVzdF91bmljb2RlKHNlbGYpOgogICAgICAgICBhdXN0cmlhID0gItZzdGVycmVpY2giCiAgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocm93WzBdKSwgc3RyLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSB1bmljb2RlIikKIAotICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKKyAgICBkZWYgdGVzdF9zdHJpbmcoc2VsZik6CiAgICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IGJ5dGVzCiAgICAgICAgIGF1c3RyaWEgPSAi1nN0ZXJyZWljaCIKICAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYSwpKS5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyb3dbMF0pLCBieXRlcywgInR5cGUgb2Ygcm93WzBdIG11c3QgYmUgYnl0ZXMiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgYXVzdHJpYS5lbmNvZGUoInV0Zi04IiksICJjb2x1bW4gbXVzdCBlcXVhbCBvcmlnaW5hbCBkYXRhIGluIFVURi04IikKIAotICAgIGRlZiBDaGVja0N1c3RvbShzZWxmKToKKyAgICBkZWYgdGVzdF9jdXN0b20oc2VsZik6CiAgICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IGxhbWJkYSB4OiBzdHIoeCwgInV0Zi04IiwgImlnbm9yZSIpCiAgICAgICAgIGF1c3RyaWEgPSAi1nN0ZXJyZWljaCIKICAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYSwpKS5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyb3dbMF0pLCBzdHIsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIHVuaWNvZGUiKQogICAgICAgICBzZWxmLmFzc2VydFRydWUocm93WzBdLmVuZHN3aXRoKCJyZWljaCIpLCAiY29sdW1uIG11c3QgY29udGFpbiBvcmlnaW5hbCBkYXRhIikKIAotICAgIGRlZiBDaGVja09wdGltaXplZFVuaWNvZGUoc2VsZik6CisgICAgZGVmIHRlc3Rfb3B0aW1pemVkX3VuaWNvZGUoc2VsZik6CiAgICAgICAgICMgT3B0aW1pemVkVW5pY29kZSBpcyBkZXByZWNhdGVkIGFzIG9mIFB5dGhvbiAzLjEwCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpIGFzIGNtOgogICAgICAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3FsaXRlLk9wdGltaXplZFVuaWNvZGUKQEAgLTI3NCwyNSArMjc0LDI1IEBAIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QgKHZhbHVlIHRleHQpIikKICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCAodmFsdWUpIHZhbHVlcyAoPykiLCAoImFceDAwYiIsKSkKIAotICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKKyAgICBkZWYgdGVzdF9zdHJpbmcoc2VsZik6CiAgICAgICAgICMgdGV4dF9mYWN0b3J5IGRlZmF1bHRzIHRvIHN0cgogICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgdmFsdWUgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKQogICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocm93WzBdKSwgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImFceDAwYiIpCiAKLSAgICBkZWYgQ2hlY2tCeXRlcyhzZWxmKToKKyAgICBkZWYgdGVzdF9ieXRlcyhzZWxmKToKICAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gYnl0ZXMKICAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IHZhbHVlIGZyb20gdGVzdCIpLmZldGNob25lKCkKICAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKHJvd1swXSksIGJ5dGVzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgYiJhXHgwMGIiKQogCi0gICAgZGVmIENoZWNrQnl0ZWFycmF5KHNlbGYpOgorICAgIGRlZiB0ZXN0X2J5dGVhcnJheShzZWxmKToKICAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gYnl0ZWFycmF5CiAgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCB2YWx1ZSBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShyb3dbMF0pLCBieXRlYXJyYXkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBiImFceDAwYiIpCiAKLSAgICBkZWYgQ2hlY2tDdXN0b20oc2VsZik6CisgICAgZGVmIHRlc3RfY3VzdG9tKHNlbGYpOgogICAgICAgICAjIEEgY3VzdG9tIGZhY3Rvcnkgc2hvdWxkIHJlY2VpdmUgYSBieXRlcyBhcmd1bWVudAogICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBsYW1iZGEgeDogeAogICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgdmFsdWUgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKQpAQCAtMzAzLDEzICszMDMsMTcgQEAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCiAKIGRlZiBzdWl0ZSgpOgotICAgIGNvbm5lY3Rpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ29ubmVjdGlvbkZhY3RvcnlUZXN0cywgIkNoZWNrIikKLSAgICBjdXJzb3Jfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ3Vyc29yRmFjdG9yeVRlc3RzLCAiQ2hlY2siKQotICAgIHJvd19zdWl0ZV9jb21wYXQgPSB1bml0dGVzdC5tYWtlU3VpdGUoUm93RmFjdG9yeVRlc3RzQmFja3dhcmRzQ29tcGF0LCAiQ2hlY2siKQotICAgIHJvd19zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShSb3dGYWN0b3J5VGVzdHMsICJDaGVjayIpCi0gICAgdGV4dF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShUZXh0RmFjdG9yeVRlc3RzLCAiQ2hlY2siKQotICAgIHRleHRfemVyb19ieXRlc19zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShUZXh0RmFjdG9yeVRlc3RzV2l0aEVtYmVkZGVkWmVyb0J5dGVzLCAiQ2hlY2siKQotICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGNvbm5lY3Rpb25fc3VpdGUsIGN1cnNvcl9zdWl0ZSwgcm93X3N1aXRlX2NvbXBhdCwgcm93X3N1aXRlLCB0ZXh0X3N1aXRlLCB0ZXh0X3plcm9fYnl0ZXNfc3VpdGUpKQorICAgIHRlc3RzID0gWworICAgICAgICBDb25uZWN0aW9uRmFjdG9yeVRlc3RzLAorICAgICAgICBDdXJzb3JGYWN0b3J5VGVzdHMsCisgICAgICAgIFJvd0ZhY3RvcnlUZXN0cywKKyAgICAgICAgUm93RmFjdG9yeVRlc3RzQmFja3dhcmRzQ29tcGF0LAorICAgICAgICBUZXh0RmFjdG9yeVRlc3RzLAorICAgICAgICBUZXh0RmFjdG9yeVRlc3RzV2l0aEVtYmVkZGVkWmVyb0J5dGVzLAorICAgIF0KKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKAorICAgICAgICBbdW5pdHRlc3QuVGVzdExvYWRlcigpLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZSh0KSBmb3IgdCBpbiB0ZXN0c10KKyAgICApCiAKIGRlZiB0ZXN0KCk6CiAgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkKaW5kZXggMmU2MjBlYy4uNDI1MDg4OCAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5CkBAIC0yOCwyMyArMjgsMjMgQEAKIAogCiBjbGFzcyBDb2xsYXRpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIENoZWNrQ3JlYXRlQ29sbGF0aW9uTm90U3RyaW5nKHNlbGYpOgorICAgIGRlZiB0ZXN0X2NyZWF0ZV9jb2xsYXRpb25fbm90X3N0cmluZyhzZWxmKToKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgogICAgICAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oTm9uZSwgbGFtYmRhIHgsIHk6ICh4ID4geSkgLSAoeCA8IHkpKQogCi0gICAgZGVmIENoZWNrQ3JlYXRlQ29sbGF0aW9uTm90Q2FsbGFibGUoc2VsZik6CisgICAgZGVmIHRlc3RfY3JlYXRlX2NvbGxhdGlvbl9ub3RfY2FsbGFibGUoc2VsZik6CiAgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKSBhcyBjbToKICAgICAgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJYIiwgNDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksICdwYXJhbWV0ZXIgbXVzdCBiZSBjYWxsYWJsZScpCiAKLSAgICBkZWYgQ2hlY2tDcmVhdGVDb2xsYXRpb25Ob3RBc2NpaShzZWxmKToKKyAgICBkZWYgdGVzdF9jcmVhdGVfY29sbGF0aW9uX25vdF9hc2NpaShzZWxmKToKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CiAgICAgICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigiY29sbOQiLCBsYW1iZGEgeCwgeTogKHggPiB5KSAtICh4IDwgeSkpCiAKLSAgICBkZWYgQ2hlY2tDcmVhdGVDb2xsYXRpb25CYWRVcHBlcihzZWxmKToKKyAgICBkZWYgdGVzdF9jcmVhdGVfY29sbGF0aW9uX2JhZF91cHBlcihzZWxmKToKICAgICAgICAgY2xhc3MgQmFkVXBwZXJTdHIoc3RyKToKICAgICAgICAgICAgIGRlZiB1cHBlcihzZWxmKToKICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQpAQCAtNjEsNyArNjEsNyBAQCBkZWYgdXBwZXIoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzBdWzBdLCAnYicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzFdWzBdLCAnYScpCiAKLSAgICBkZWYgQ2hlY2tDb2xsYXRpb25Jc1VzZWQoc2VsZik6CisgICAgZGVmIHRlc3RfY29sbGF0aW9uX2lzX3VzZWQoc2VsZik6CiAgICAgICAgIGRlZiBteWNvbGwoeCwgeSk6CiAgICAgICAgICAgICAjIHJldmVyc2Ugb3JkZXIKICAgICAgICAgICAgIHJldHVybiAtKCh4ID4geSkgLSAoeCA8IHkpKQpAQCAtODYsNyArODYsNyBAQCBkZWYgbXljb2xsKHgsIHkpOgogICAgICAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoc3FsKS5mZXRjaGFsbCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksICdubyBzdWNoIGNvbGxhdGlvbiBzZXF1ZW5jZTogbXljb2xsJykKIAotICAgIGRlZiBDaGVja0NvbGxhdGlvblJldHVybnNMYXJnZUludGVnZXIoc2VsZik6CisgICAgZGVmIHRlc3RfY29sbGF0aW9uX3JldHVybnNfbGFyZ2VfaW50ZWdlcihzZWxmKToKICAgICAgICAgZGVmIG15Y29sbCh4LCB5KToKICAgICAgICAgICAgICMgcmV2ZXJzZSBvcmRlcgogICAgICAgICAgICAgcmV0dXJuIC0oKHggPiB5KSAtICh4IDwgeSkpICogMioqMzIKQEAgLTEwNSw3ICsxMDUsNyBAQCBkZWYgbXljb2xsKHgsIHkpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgWygnYycsKSwgKCdiJywpLCAoJ2EnLCldLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0idGhlIGV4cGVjdGVkIG9yZGVyIHdhcyBub3QgcmV0dXJuZWQiKQogCi0gICAgZGVmIENoZWNrQ29sbGF0aW9uUmVnaXN0ZXJUd2ljZShzZWxmKToKKyAgICBkZWYgdGVzdF9jb2xsYXRpb25fcmVnaXN0ZXJfdHdpY2Uoc2VsZik6CiAgICAgICAgICIiIgogICAgICAgICBSZWdpc3RlciB0d28gZGlmZmVyZW50IGNvbGxhdGlvbiBmdW5jdGlvbnMgdW5kZXIgdGhlIHNhbWUgbmFtZS4KICAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIGxhc3Qgb25lIGlzIGFjdHVhbGx5IHVzZWQuCkBAIC0xMTksNyArMTE5LDcgQEAgZGVmIENoZWNrQ29sbGF0aW9uUmVnaXN0ZXJUd2ljZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMF1bMF0sICdiJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMV1bMF0sICdhJykKIAotICAgIGRlZiBDaGVja0RlcmVnaXN0ZXJDb2xsYXRpb24oc2VsZik6CisgICAgZGVmIHRlc3RfZGVyZWdpc3Rlcl9jb2xsYXRpb24oc2VsZik6CiAgICAgICAgICIiIgogICAgICAgICBSZWdpc3RlciBhIGNvbGxhdGlvbiwgdGhlbiBkZXJlZ2lzdGVyIGl0LiBNYWtlIHN1cmUgYW4gZXJyb3IgaXMgcmFpc2VkIGlmIHdlIHRyeQogICAgICAgICB0byB1c2UgaXQuCkBAIC0xMzIsNyArMTMyLDcgQEAgZGVmIENoZWNrRGVyZWdpc3RlckNvbGxhdGlvbihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgJ25vIHN1Y2ggY29sbGF0aW9uIHNlcXVlbmNlOiBteWNvbGwnKQogCiBjbGFzcyBQcm9ncmVzc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgQ2hlY2tQcm9ncmVzc0hhbmRsZXJVc2VkKHNlbGYpOgorICAgIGRlZiB0ZXN0X3Byb2dyZXNzX2hhbmRsZXJfdXNlZChzZWxmKToKICAgICAgICAgIiIiCiAgICAgICAgIFRlc3QgdGhhdCB0aGUgcHJvZ3Jlc3MgaGFuZGxlciBpcyBpbnZva2VkIG9uY2UgaXQgaXMgc2V0LgogICAgICAgICAiIiIKQEAgLTE0OCw3ICsxNDgsNyBAQCBkZWYgcHJvZ3Jlc3MoKToKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb2dyZXNzX2NhbGxzKQogCiAKLSAgICBkZWYgQ2hlY2tPcGNvZGVDb3VudChzZWxmKToKKyAgICBkZWYgdGVzdF9vcGNvZGVfY291bnQoc2VsZik6CiAgICAgICAgICIiIgogICAgICAgICBUZXN0IHRoYXQgdGhlIG9wY29kZSBhcmd1bWVudCBpcyByZXNwZWN0ZWQuCiAgICAgICAgICIiIgpAQCAtMTcxLDcgKzE3MSw3IEBAIGRlZiBwcm9ncmVzcygpOgogICAgICAgICBzZWNvbmRfY291bnQgPSBsZW4ocHJvZ3Jlc3NfY2FsbHMpCiAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGZpcnN0X2NvdW50LCBzZWNvbmRfY291bnQpCiAKLSAgICBkZWYgQ2hlY2tDYW5jZWxPcGVyYXRpb24oc2VsZik6CisgICAgZGVmIHRlc3RfY2FuY2VsX29wZXJhdGlvbihzZWxmKToKICAgICAgICAgIiIiCiAgICAgICAgIFRlc3QgdGhhdCByZXR1cm5pbmcgYSBub24temVybyB2YWx1ZSBzdG9wcyB0aGUgb3BlcmF0aW9uIGluIHByb2dyZXNzLgogICAgICAgICAiIiIKQEAgLTE4NSw3ICsxODUsNyBAQCBkZWYgcHJvZ3Jlc3MoKToKICAgICAgICAgICAgIGN1cnMuZXhlY3V0ZSwKICAgICAgICAgICAgICJjcmVhdGUgdGFibGUgYmFyIChhLCBiKSIpCiAKLSAgICBkZWYgQ2hlY2tDbGVhckhhbmRsZXIoc2VsZik6CisgICAgZGVmIHRlc3RfY2xlYXJfaGFuZGxlcihzZWxmKToKICAgICAgICAgIiIiCiAgICAgICAgIFRlc3QgdGhhdCBzZXR0aW5nIHRoZSBwcm9ncmVzcyBoYW5kbGVyIHRvIE5vbmUgY2xlYXJzIHRoZSBwcmV2aW91c2x5IHNldCBoYW5kbGVyLgogICAgICAgICAiIiIKQEAgLTIwMSw3ICsyMDEsNyBAQCBkZWYgcHJvZ3Jlc3MoKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3Rpb24sIDAsICJwcm9ncmVzcyBoYW5kbGVyIHdhcyBub3QgY2xlYXJlZCIpCiAKIGNsYXNzIFRyYWNlQ2FsbGJhY2tUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIENoZWNrVHJhY2VDYWxsYmFja1VzZWQoc2VsZik6CisgICAgZGVmIHRlc3RfdHJhY2VfY2FsbGJhY2tfdXNlZChzZWxmKToKICAgICAgICAgIiIiCiAgICAgICAgIFRlc3QgdGhhdCB0aGUgdHJhY2UgY2FsbGJhY2sgaXMgaW52b2tlZCBvbmNlIGl0IGlzIHNldC4KICAgICAgICAgIiIiCkBAIC0yMTQsNyArMjE0LDcgQEAgZGVmIHRyYWNlKHN0YXRlbWVudCk6CiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0cmFjZWRfc3RhdGVtZW50cykKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFueSgiY3JlYXRlIHRhYmxlIGZvbyIgaW4gc3RtdCBmb3Igc3RtdCBpbiB0cmFjZWRfc3RhdGVtZW50cykpCiAKLSAgICBkZWYgQ2hlY2tDbGVhclRyYWNlQ2FsbGJhY2soc2VsZik6CisgICAgZGVmIHRlc3RfY2xlYXJfdHJhY2VfY2FsbGJhY2soc2VsZik6CiAgICAgICAgICIiIgogICAgICAgICBUZXN0IHRoYXQgc2V0dGluZyB0aGUgdHJhY2UgY2FsbGJhY2sgdG8gTm9uZSBjbGVhcnMgdGhlIHByZXZpb3VzbHkgc2V0IGNhbGxiYWNrLgogICAgICAgICAiIiIKQEAgLTIyNyw3ICsyMjcsNyBAQCBkZWYgdHJhY2Uoc3RhdGVtZW50KToKICAgICAgICAgY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oYSwgYikiKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHRyYWNlZF9zdGF0ZW1lbnRzLCAidHJhY2UgY2FsbGJhY2sgd2FzIG5vdCBjbGVhcmVkIikKIAotICAgIGRlZiBDaGVja1VuaWNvZGVDb250ZW50KHNlbGYpOgorICAgIGRlZiB0ZXN0X3VuaWNvZGVfY29udGVudChzZWxmKToKICAgICAgICAgIiIiCiAgICAgICAgIFRlc3QgdGhhdCB0aGUgc3RhdGVtZW50IGNhbiBjb250YWluIHVuaWNvZGUgbGl0ZXJhbHMuCiAgICAgICAgICIiIgpAQCAtMjQ0LDcgKzI0NCw3IEBAIGRlZiB0cmFjZShzdGF0ZW1lbnQpOgogICAgICAgICAgICAgICAgICAgICAgICAgIlVuaWNvZGUgZGF0YSAlcyBnYXJibGVkIGluIHRyYWNlIGNhbGxiYWNrOiAlcyIKICAgICAgICAgICAgICAgICAgICAgICAgICUgKGFzY2lpKHVuaWNvZGVfdmFsdWUpLCAnLCAnLmpvaW4obWFwKGFzY2lpLCB0cmFjZWRfc3RhdGVtZW50cykpKSkKIAotICAgIGRlZiBDaGVja1RyYWNlQ2FsbGJhY2tDb250ZW50KHNlbGYpOgorICAgIGRlZiB0ZXN0X3RyYWNlX2NhbGxiYWNrX2NvbnRlbnQoc2VsZik6CiAgICAgICAgICMgc2V0X3RyYWNlX2NhbGxiYWNrKCkgc2hvdWxkbid0IHByb2R1Y2UgZHVwbGljYXRlIGNvbnRlbnQgKGJwby0yNjE4NykKICAgICAgICAgdHJhY2VkX3N0YXRlbWVudHMgPSBbXQogICAgICAgICBkZWYgdHJhY2Uoc3RhdGVtZW50KToKQEAgLTI2NCwxMCArMjY0LDE0IEBAIGRlZiB0cmFjZShzdGF0ZW1lbnQpOgogCiAKIGRlZiBzdWl0ZSgpOgotICAgIGNvbGxhdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb2xsYXRpb25UZXN0cywgIkNoZWNrIikKLSAgICBwcm9ncmVzc19zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShQcm9ncmVzc1Rlc3RzLCAiQ2hlY2siKQotICAgIHRyYWNlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRyYWNlQ2FsbGJhY2tUZXN0cywgIkNoZWNrIikKLSAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChjb2xsYXRpb25fc3VpdGUsIHByb2dyZXNzX3N1aXRlLCB0cmFjZV9zdWl0ZSkpCisgICAgdGVzdHMgPSBbCisgICAgICAgIENvbGxhdGlvblRlc3RzLAorICAgICAgICBQcm9ncmVzc1Rlc3RzLAorICAgICAgICBUcmFjZUNhbGxiYWNrVGVzdHMsCisgICAgXQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoCisgICAgICAgIFt1bml0dGVzdC5UZXN0TG9hZGVyKCkubG9hZFRlc3RzRnJvbVRlc3RDYXNlKHQpIGZvciB0IGluIHRlc3RzXQorICAgICkKIAogZGVmIHRlc3QoKToKICAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkgYi9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkKaW5kZXggNjc1NTdlMS4uMTMxMjQyNCAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weQpAQCAtMzUsMTIgKzM1LDEyIEBAIGRlZiBzZXRVcChzZWxmKToKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKIAotICAgIGRlZiBDaGVja1ByYWdtYVVzZXJWZXJzaW9uKHNlbGYpOgorICAgIGRlZiB0ZXN0X3ByYWdtYV91c2VyX3ZlcnNpb24oc2VsZik6CiAgICAgICAgICMgVGhpcyB1c2VkIHRvIGNyYXNoIHB5c3FsaXRlIGJlY2F1c2UgdGhpcyBwcmFnbWEgY29tbWFuZCByZXR1cm5zIE5VTEwgZm9yIHRoZSBjb2x1bW4gbmFtZQogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgicHJhZ21hIHVzZXJfdmVyc2lvbiIpCiAKLSAgICBkZWYgQ2hlY2tQcmFnbWFTY2hlbWFWZXJzaW9uKHNlbGYpOgorICAgIGRlZiB0ZXN0X3ByYWdtYV9zY2hlbWFfdmVyc2lvbihzZWxmKToKICAgICAgICAgIyBUaGlzIHN0aWxsIGNyYXNoZWQgcHlzcWxpdGUgPD0gMi4yLjEKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9DT0xOQU1FUykKICAgICAgICAgdHJ5OgpAQCAtNTAsNyArNTAsNyBAQCBkZWYgQ2hlY2tQcmFnbWFTY2hlbWFWZXJzaW9uKHNlbGYpOgogICAgICAgICAgICAgY3VyLmNsb3NlKCkKICAgICAgICAgICAgIGNvbi5jbG9zZSgpCiAKLSAgICBkZWYgQ2hlY2tTdGF0ZW1lbnRSZXNldChzZWxmKToKKyAgICBkZWYgdGVzdF9zdGF0ZW1lbnRfcmVzZXQoc2VsZik6CiAgICAgICAgICMgcHlzcWxpdGUgMi4xLjAgdG8gMi4yLjAgaGF2ZSB0aGUgcHJvYmxlbSB0aGF0IG5vdCBhbGwgc3RhdGVtZW50cyBhcmUKICAgICAgICAgIyByZXNldCBiZWZvcmUgYSByb2xsYmFjaywgYnV0IG9ubHkgdGhvc2UgdGhhdCBhcmUgc3RpbGwgaW4gdGhlCiAgICAgICAgICMgc3RhdGVtZW50IGNhY2hlLiBUaGUgb3RoZXJzIGFyZSBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBjb25uZWN0aW9uIG9iamVjdC4KQEAgLTY1LDcgKzY1LDcgQEAgZGVmIENoZWNrU3RhdGVtZW50UmVzZXQoc2VsZik6CiAKICAgICAgICAgY29uLnJvbGxiYWNrKCkKIAotICAgIGRlZiBDaGVja0NvbHVtbk5hbWVXaXRoU3BhY2VzKHNlbGYpOgorICAgIGRlZiB0ZXN0X2NvbHVtbl9uYW1lX3dpdGhfc3BhY2VzKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgnc2VsZWN0IDEgYXMgImZvbyBiYXIgW2RhdGV0aW1lXSInKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1ci5kZXNjcmlwdGlvblswXVswXSwgImZvbyBiYXIgW2RhdGV0aW1lXSIpCkBAIC03Myw3ICs3Myw3IEBAIGRlZiBDaGVja0NvbHVtbk5hbWVXaXRoU3BhY2VzKHNlbGYpOgogICAgICAgICBjdXIuZXhlY3V0ZSgnc2VsZWN0IDEgYXMgImZvbyBiYXoiJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdXIuZGVzY3JpcHRpb25bMF1bMF0sICJmb28gYmF6IikKIAotICAgIGRlZiBDaGVja1N0YXRlbWVudEZpbmFsaXphdGlvbk9uQ2xvc2VEYihzZWxmKToKKyAgICBkZWYgdGVzdF9zdGF0ZW1lbnRfZmluYWxpemF0aW9uX29uX2Nsb3NlX2RiKHNlbGYpOgogICAgICAgICAjIHB5c3FsaXRlIHZlcnNpb25zIDw9IDIuMy4zIG9ubHkgZmluYWxpemVkIHN0YXRlbWVudHMgaW4gdGhlIHN0YXRlbWVudAogICAgICAgICAjIGNhY2hlIHdoZW4gY2xvc2luZyB0aGUgZGF0YWJhc2UuIHN0YXRlbWVudHMgdGhhdCB3ZXJlIHN0aWxsCiAgICAgICAgICMgcmVmZXJlbmNlZCBpbiBjdXJzb3JzIHdlcmVuJ3QgY2xvc2VkIGFuZCBjb3VsZCBwcm92b2tlICIKQEAgLTg3LDcgKzg3LDcgQEAgZGVmIENoZWNrU3RhdGVtZW50RmluYWxpemF0aW9uT25DbG9zZURiKHNlbGYpOgogICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCAxIHggdW5pb24gc2VsZWN0ICIgKyBzdHIoaSkpCiAgICAgICAgIGNvbi5jbG9zZSgpCiAKLSAgICBkZWYgQ2hlY2tPbkNvbmZsaWN0Um9sbGJhY2soc2VsZik6CisgICAgZGVmIHRlc3Rfb25fY29uZmxpY3Rfcm9sbGJhY2soc2VsZik6CiAgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgIGNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgZm9vKHgsIHVuaXF1ZSh4KSBvbiBjb25mbGljdCByb2xsYmFjaykiKQogICAgICAgICBjb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gZm9vKHgpIHZhbHVlcyAoMSkiKQpAQCAtMTAxLDcgKzEwMSw3IEBAIGRlZiBDaGVja09uQ29uZmxpY3RSb2xsYmFjayhzZWxmKToKICAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJweXNxbGl0ZSBrbmV3IG5vdGhpbmcgYWJvdXQgdGhlIGltcGxpY2l0IFJPTExCQUNLIikKIAotICAgIGRlZiBDaGVja1dvcmthcm91bmRGb3JCdWdneVNxbGl0ZVRyYW5zZmVyQmluZGluZ3Moc2VsZik6CisgICAgZGVmIHRlc3Rfd29ya2Fyb3VuZF9mb3JfYnVnZ3lfc3FsaXRlX3RyYW5zZmVyX2JpbmRpbmdzKHNlbGYpOgogICAgICAgICAiIiIKICAgICAgICAgcHlzcWxpdGUgd291bGQgY3Jhc2ggd2l0aCBvbGRlciBTUUxpdGUgdmVyc2lvbnMgdW5sZXNzCiAgICAgICAgIGEgd29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZC4KQEAgLTExMCwxNCArMTEwLDE0IEBAIGRlZiBDaGVja1dvcmthcm91bmRGb3JCdWdneVNxbGl0ZVRyYW5zZmVyQmluZGluZ3Moc2VsZik6CiAgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImRyb3AgdGFibGUgZm9vIikKICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyhiYXIpIikKIAotICAgIGRlZiBDaGVja0VtcHR5U3RhdGVtZW50KHNlbGYpOgorICAgIGRlZiB0ZXN0X2VtcHR5X3N0YXRlbWVudChzZWxmKToKICAgICAgICAgIiIiCiAgICAgICAgIHB5c3FsaXRlIHVzZWQgdG8gc2VnZmF1bHQgd2l0aCBTUUxpdGUgdmVyc2lvbnMgMy41LnguIFRoZXNlIHJldHVybiBOVUxMCiAgICAgICAgIGZvciAibm8tb3BlcmF0aW9uIiBzdGF0ZW1lbnRzCiAgICAgICAgICIiIgogICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCIiKQogCi0gICAgZGVmIENoZWNrVHlwZU1hcFVzYWdlKHNlbGYpOgorICAgIGRlZiB0ZXN0X3R5cGVfbWFwX3VzYWdlKHNlbGYpOgogICAgICAgICAiIiIKICAgICAgICAgcHlzcWxpdGUgdW50aWwgMi40LjEgZGlkIG5vdCByZWJ1aWxkIHRoZSByb3dfY2FzdF9tYXAgd2hlbiByZWNvbXBpbGluZwogICAgICAgICBhIHN0YXRlbWVudC4gVGhpcyB0ZXN0IGV4aGliaXRzIHRoZSBwcm9ibGVtLgpAQCAtMTMyLDcgKzEzMiw3IEBAIGRlZiBDaGVja1R5cGVNYXBVc2FnZShzZWxmKToKICAgICAgICAgY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIGZvbyhiYXIpIHZhbHVlcyAoNSkiKQogICAgICAgICBjb24uZXhlY3V0ZShTRUxFQ1QpCiAKLSAgICBkZWYgQ2hlY2tCaW5kTXV0YXRpbmdMaXN0KHNlbGYpOgorICAgIGRlZiB0ZXN0X2JpbmRfbXV0YXRpbmdfbGlzdChzZWxmKToKICAgICAgICAgIyBJc3N1ZTQxNjYyOiBDcmFzaCB3aGVuIG11dGF0ZSBhIGxpc3Qgb2YgcGFyYW1ldGVycyBkdXJpbmcgaXRlcmF0aW9uLgogICAgICAgICBjbGFzcyBYOgogICAgICAgICAgICAgZGVmIF9fY29uZm9ybV9fKHNlbGYsIHByb3RvY29sKToKQEAgLTE0NSw3ICsxNDUsNyBAQCBkZWYgX19jb25mb3JtX18oc2VsZiwgcHJvdG9jb2wpOgogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IpOgogICAgICAgICAgICAgY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIGZvbyhiYXIsIGJheikgdmFsdWVzICg/LCA/KSIsIHBhcmFtZXRlcnMpCiAKLSAgICBkZWYgQ2hlY2tFcnJvck1zZ0RlY29kZUVycm9yKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Vycm9yX21zZ19kZWNvZGVfZXJyb3Ioc2VsZik6CiAgICAgICAgICMgV2hlbiBwb3J0aW5nIHRoZSBtb2R1bGUgdG8gUHl0aG9uIDMuMCwgdGhlIGVycm9yIG1lc3NhZ2UgYWJvdXQKICAgICAgICAgIyBkZWNvZGluZyBlcnJvcnMgZGlzYXBwZWFyZWQuIFRoaXMgdmVyaWZpZXMgdGhleSdyZSBiYWNrIGFnYWluLgogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yKSBhcyBjbToKQEAgLTE1NCwxMyArMTU0LDEzIEBAIGRlZiBDaGVja0Vycm9yTXNnRGVjb2RlRXJyb3Ioc2VsZik6CiAgICAgICAgIG1zZyA9ICJDb3VsZCBub3QgZGVjb2RlIHRvIFVURi04IGNvbHVtbiAnY29sbmFtZScgd2l0aCB0ZXh0ICd4eHgiCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4obXNnLCBzdHIoY20uZXhjZXB0aW9uKSkKIAotICAgIGRlZiBDaGVja1JlZ2lzdGVyQWRhcHRlcihzZWxmKToKKyAgICBkZWYgdGVzdF9yZWdpc3Rlcl9hZGFwdGVyKHNlbGYpOgogICAgICAgICAiIiIKICAgICAgICAgU2VlIGlzc3VlIDMzMTIuCiAgICAgICAgICIiIgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNxbGl0ZS5yZWdpc3Rlcl9hZGFwdGVyLCB7fSwgTm9uZSkKIAotICAgIGRlZiBDaGVja1NldElzb2xhdGlvbkxldmVsKHNlbGYpOgorICAgIGRlZiB0ZXN0X3NldF9pc29sYXRpb25fbGV2ZWwoc2VsZik6CiAgICAgICAgICMgU2VlIGlzc3VlIDI3ODgxLgogICAgICAgICBjbGFzcyBDdXN0b21TdHIoc3RyKToKICAgICAgICAgICAgIGRlZiB1cHBlcihzZWxmKToKQEAgLTE5MCw3ICsxOTAsNyBAQCBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgICAgICAgICAgY29uLmlzb2xhdGlvbl9sZXZlbCA9IHZhbHVlCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb24uaXNvbGF0aW9uX2xldmVsLCAiREVGRVJSRUQiKQogCi0gICAgZGVmIENoZWNrQ3Vyc29yQ29uc3RydWN0b3JDYWxsQ2hlY2soc2VsZik6CisgICAgZGVmIHRlc3RfY3Vyc29yX2NvbnN0cnVjdG9yX2NhbGxfY2hlY2soc2VsZik6CiAgICAgICAgICIiIgogICAgICAgICBWZXJpZmllcyB0aGF0IGN1cnNvciBtZXRob2RzIGNoZWNrIHdoZXRoZXIgYmFzZSBjbGFzcyBfX2luaXRfXyB3YXMKICAgICAgICAgY2FsbGVkLgpAQCAtMjA3LDE0ICsyMDcsMTQgQEAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ15CYXNlIEN1cnNvclwuX19pbml0X18gbm90IGNhbGxlZFwuJCcpOgogICAgICAgICAgICAgY3VyLmNsb3NlKCkKIAotICAgIGRlZiBDaGVja1N0clN1YmNsYXNzKHNlbGYpOgorICAgIGRlZiB0ZXN0X3N0cl9zdWJjbGFzcyhzZWxmKToKICAgICAgICAgIiIiCiAgICAgICAgIFRoZSBQeXRob24gMy4wIHBvcnQgb2YgdGhlIG1vZHVsZSBkaWRuJ3QgY29wZSB3aXRoIHZhbHVlcyBvZiBzdWJjbGFzc2VzIG9mIHN0ci4KICAgICAgICAgIiIiCiAgICAgICAgIGNsYXNzIE15U3RyKHN0cik6IHBhc3MKICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoTXlTdHIoImFiYyIpLCkpCiAKLSAgICBkZWYgQ2hlY2tDb25uZWN0aW9uQ29uc3RydWN0b3JDYWxsQ2hlY2soc2VsZik6CisgICAgZGVmIHRlc3RfY29ubmVjdGlvbl9jb25zdHJ1Y3Rvcl9jYWxsX2NoZWNrKHNlbGYpOgogICAgICAgICAiIiIKICAgICAgICAgVmVyaWZpZXMgdGhhdCBjb25uZWN0aW9uIG1ldGhvZHMgY2hlY2sgd2hldGhlciBiYXNlIGNsYXNzIF9faW5pdF9fIHdhcwogICAgICAgICBjYWxsZWQuCkBAIC0yMjcsNyArMjI3LDcgQEAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKICAgICAgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQogCi0gICAgZGVmIENoZWNrQ3Vyc29yUmVnaXN0cmF0aW9uKHNlbGYpOgorICAgIGRlZiB0ZXN0X2N1cnNvcl9yZWdpc3RyYXRpb24oc2VsZik6CiAgICAgICAgICIiIgogICAgICAgICBWZXJpZmllcyB0aGF0IHN1YmNsYXNzZWQgY3Vyc29yIGNsYXNzZXMgYXJlIGNvcnJlY3RseSByZWdpc3RlcmVkIHdpdGgKICAgICAgICAgdGhlIGNvbm5lY3Rpb24gb2JqZWN0LCB0b28uICAoZmV0Y2gtYWNyb3NzLXJvbGxiYWNrIHByb2JsZW0pCkBAIC0yNDksNyArMjQ5LDcgQEAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbik6CiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLkludGVyZmFjZUVycm9yKToKICAgICAgICAgICAgIGN1ci5mZXRjaGFsbCgpCiAKLSAgICBkZWYgQ2hlY2tBdXRvQ29tbWl0KHNlbGYpOgorICAgIGRlZiB0ZXN0X2F1dG9fY29tbWl0KHNlbGYpOgogICAgICAgICAiIiIKICAgICAgICAgVmVyaWZpZXMgdGhhdCBjcmVhdGluZyBhIGNvbm5lY3Rpb24gaW4gYXV0b2NvbW1pdCBtb2RlIHdvcmtzLgogICAgICAgICAyLjUuMyBpbnRyb2R1Y2VkIGEgcmVncmVzc2lvbiBzbyB0aGF0IHRoZXNlIGNvdWxkIG5vIGxvbmdlcgpAQCAtMjU3LDcgKzI1Nyw3IEBAIGRlZiBDaGVja0F1dG9Db21taXQoc2VsZik6CiAgICAgICAgICIiIgogICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBpc29sYXRpb25fbGV2ZWw9Tm9uZSkKIAotICAgIGRlZiBDaGVja1ByYWdtYUF1dG9jb21taXQoc2VsZik6CisgICAgZGVmIHRlc3RfcHJhZ21hX2F1dG9jb21taXQoc2VsZik6CiAgICAgICAgICIiIgogICAgICAgICBWZXJpZmllcyB0aGF0IHJ1bm5pbmcgYSBQUkFHTUEgc3RhdGVtZW50IHRoYXQgZG9lcyBhbiBhdXRvY29tbWl0IGRvZXMKICAgICAgICAgd29yay4gVGhpcyBkaWQgbm90IHdvcmsgaW4gMi41LjMvMi41LjQuCkBAIC0yNjksMjEgKzI2OSwyMSBAQCBkZWYgQ2hlY2tQcmFnbWFBdXRvY29tbWl0KHNlbGYpOgogICAgICAgICBjdXIuZXhlY3V0ZSgicHJhZ21hIHBhZ2Vfc2l6ZSIpCiAgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCiAKLSAgICBkZWYgQ2hlY2tDb25uZWN0aW9uQ2FsbChzZWxmKToKKyAgICBkZWYgdGVzdF9jb25uZWN0aW9uX2NhbGwoc2VsZik6CiAgICAgICAgICIiIgogICAgICAgICBDYWxsIGEgY29ubmVjdGlvbiB3aXRoIGEgbm9uLXN0cmluZyBTUUwgcmVxdWVzdDogY2hlY2sgZXJyb3IgaGFuZGxpbmcKICAgICAgICAgb2YgdGhlIHN0YXRlbWVudCBjb25zdHJ1Y3Rvci4KICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5jb24sIDEpCiAKLSAgICBkZWYgQ2hlY2tDb2xsYXRpb24oc2VsZik6CisgICAgZGVmIHRlc3RfY29sbGF0aW9uKHNlbGYpOgogICAgICAgICBkZWYgY29sbGF0aW9uX2NiKGEsIGIpOgogICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLlByb2dyYW1taW5nRXJyb3IsIHNlbGYuY29uLmNyZWF0ZV9jb2xsYXRpb24sCiAgICAgICAgICAgICAjIExvbmUgc3Vycm9nYXRlIGNhbm5vdCBiZSBlbmNvZGVkIHRvIHRoZSBkZWZhdWx0IGVuY29kaW5nICh1dGY4KQogICAgICAgICAgICAgIlx1REM4MCIsIGNvbGxhdGlvbl9jYikKIAotICAgIGRlZiBDaGVja1JlY3Vyc2l2ZUN1cnNvclVzZShzZWxmKToKKyAgICBkZWYgdGVzdF9yZWN1cnNpdmVfY3Vyc29yX3VzZShzZWxmKToKICAgICAgICAgIiIiCiAgICAgICAgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMDgxMQogCkBAIC0zMDQsNyArMzA0LDcgQEAgZGVmIGZvbygpOgogICAgICAgICAgICAgY3VyLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byBiIChiYXopIHZhbHVlcyAoPykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaSwpIGZvciBpIGluIGZvbygpKSkKIAotICAgIGRlZiBDaGVja0NvbnZlcnRUaW1lc3RhbXBNaWNyb3NlY29uZFBhZGRpbmcoc2VsZik6CisgICAgZGVmIHRlc3RfY29udmVydF90aW1lc3RhbXBfbWljcm9zZWNvbmRfcGFkZGluZyhzZWxmKToKICAgICAgICAgIiIiCiAgICAgICAgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNDcyMAogCkBAIC0zMzAsMTMgKzMzMCwxMyBAQCBkZWYgQ2hlY2tDb252ZXJ0VGltZXN0YW1wTWljcm9zZWNvbmRQYWRkaW5nKHNlbGYpOgogICAgICAgICAgICAgZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMiwgNCwgNCwgMTUsIDYsIDAsIDEyMzQ1NiksCiAgICAgICAgIF0pCiAKLSAgICBkZWYgQ2hlY2tJbnZhbGlkSXNvbGF0aW9uTGV2ZWxUeXBlKHNlbGYpOgorICAgIGRlZiB0ZXN0X2ludmFsaWRfaXNvbGF0aW9uX2xldmVsX3R5cGUoc2VsZik6CiAgICAgICAgICMgaXNvbGF0aW9uIGxldmVsIGlzIGEgc3RyaW5nLCBub3QgYW4gaW50ZWdlcgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZS5jb25uZWN0LCAiOm1lbW9yeToiLCBpc29sYXRpb25fbGV2ZWw9MTIzKQogCiAKLSAgICBkZWYgQ2hlY2tOdWxsQ2hhcmFjdGVyKHNlbGYpOgorICAgIGRlZiB0ZXN0X251bGxfY2hhcmFjdGVyKHNlbGYpOgogICAgICAgICAjIElzc3VlICMyMTE0NwogICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb24sICJcMHNlbGVjdCAxIikKQEAgLTM0NSw3ICszNDUsNyBAQCBkZWYgQ2hlY2tOdWxsQ2hhcmFjdGVyKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjdXIuZXhlY3V0ZSwgIiBcMHNlbGVjdCAyIikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY3VyLmV4ZWN1dGUsICJzZWxlY3QgMlwwIikKIAotICAgIGRlZiBDaGVja0NvbW1pdEN1cnNvclJlc2V0KHNlbGYpOgorICAgIGRlZiB0ZXN0X2NvbW1pdF9jdXJzb3JfcmVzZXQoc2VsZik6CiAgICAgICAgICIiIgogICAgICAgICBDb25uZWN0aW9uLmNvbW1pdCgpIGRpZCByZXNldCBjdXJzb3JzLCB3aGljaCBtYWRlIHNxbGl0ZTMKICAgICAgICAgdG8gcmV0dXJuIHJvd3MgbXVsdGlwbGUgdGltZXMgd2hlbiBmZXRjaGVkIGZyb20gY3Vyc29ycwpAQCAtMzc2LDcgKzM3Niw3IEBAIGRlZiBDaGVja0NvbW1pdEN1cnNvclJlc2V0KHNlbGYpOgogICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50ZXIsIDMsICJzaG91bGQgaGF2ZSByZXR1cm5lZCBleGFjdGx5IHRocmVlIHJvd3MiKQogCi0gICAgZGVmIENoZWNrQnBvMzE3NzAoc2VsZik6CisgICAgZGVmIHRlc3RfYnBvMzE3NzAoc2VsZik6CiAgICAgICAgICIiIgogICAgICAgICBUaGUgaW50ZXJwcmV0ZXIgc2hvdWxkbid0IGNyYXNoIGluIGNhc2UgQ3Vyc29yLl9faW5pdF9fKCkgaXMgY2FsbGVkCiAgICAgICAgIG1vcmUgdGhhbiBvbmNlLgpAQCAtMzkyLDExICszOTIsMTEgQEAgZGVmIGNhbGxiYWNrKCphcmdzKToKICAgICAgICAgZGVsIHJlZgogICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKQogCi0gICAgZGVmIENoZWNrRGVsSXNvbGF0aW9uX2xldmVsU2VnZmF1bHQoc2VsZik6CisgICAgZGVmIHRlc3RfZGVsX2lzb2xhdGlvbl9sZXZlbF9zZWdmYXVsdChzZWxmKToKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CiAgICAgICAgICAgICBkZWwgc2VsZi5jb24uaXNvbGF0aW9uX2xldmVsCiAKLSAgICBkZWYgQ2hlY2tCcG8zNzM0NyhzZWxmKToKKyAgICBkZWYgdGVzdF9icG8zNzM0NyhzZWxmKToKICAgICAgICAgY2xhc3MgUHJpbnRlcjoKICAgICAgICAgICAgIGRlZiBsb2coc2VsZiwgKmFyZ3MpOgogICAgICAgICAgICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX09LCkBAIC00MTMsMTAgKzQxMywxMiBAQCBkZWYgbG9nKHNlbGYsICphcmdzKToKIAogCiBkZWYgc3VpdGUoKToKLSAgICByZWdyZXNzaW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFJlZ3Jlc3Npb25UZXN0cywgIkNoZWNrIikKLSAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKCgKLSAgICAgICAgcmVncmVzc2lvbl9zdWl0ZSwKLSAgICApKQorICAgIHRlc3RzID0gWworICAgICAgICBSZWdyZXNzaW9uVGVzdHMKKyAgICBdCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgKKyAgICAgICAgW3VuaXR0ZXN0LlRlc3RMb2FkZXIoKS5sb2FkVGVzdHNGcm9tVGVzdENhc2UodCkgZm9yIHQgaW4gdGVzdHNdCisgICAgKQogCiBkZWYgdGVzdCgpOgogICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvdHJhbnNhY3Rpb25zLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHkKaW5kZXggYzQ2M2Y3NC4uM2I0N2ZmMSAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHkKQEAgLTUyLDcgKzUyLDcgQEAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgIHBhc3MKIAotICAgIGRlZiBDaGVja0RNTERvZXNOb3RBdXRvQ29tbWl0QmVmb3JlKHNlbGYpOgorICAgIGRlZiB0ZXN0X2RtbF9kb2VzX25vdF9hdXRvX2NvbW1pdF9iZWZvcmUoc2VsZik6CiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQogICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QyKGopIikKQEAgLTYwLDE0ICs2MCwxNCBAQCBkZWYgQ2hlY2tETUxEb2VzTm90QXV0b0NvbW1pdEJlZm9yZShzZWxmKToKICAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNoYWxsKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMCkKIAotICAgIGRlZiBDaGVja0luc2VydFN0YXJ0c1RyYW5zYWN0aW9uKHNlbGYpOgorICAgIGRlZiB0ZXN0X2luc2VydF9zdGFydHNfdHJhbnNhY3Rpb24oc2VsZik6CiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQogICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKICAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNoYWxsKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMCkKIAotICAgIGRlZiBDaGVja1VwZGF0ZVN0YXJ0c1RyYW5zYWN0aW9uKHNlbGYpOgorICAgIGRlZiB0ZXN0X3VwZGF0ZV9zdGFydHNfdHJhbnNhY3Rpb24oc2VsZik6CiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQogICAgICAgICBzZWxmLmNvbjEuY29tbWl0KCkKQEAgLTc2LDcgKzc2LDcgQEAgZGVmIENoZWNrVXBkYXRlU3RhcnRzVHJhbnNhY3Rpb24oc2VsZik6CiAgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaG9uZSgpWzBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCA1KQogCi0gICAgZGVmIENoZWNrRGVsZXRlU3RhcnRzVHJhbnNhY3Rpb24oc2VsZik6CisgICAgZGVmIHRlc3RfZGVsZXRlX3N0YXJ0c190cmFuc2FjdGlvbihzZWxmKToKICAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKICAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCiAgICAgICAgIHNlbGYuY29uMS5jb21taXQoKQpAQCAtODUsNyArODUsNyBAQCBkZWYgQ2hlY2tEZWxldGVTdGFydHNUcmFuc2FjdGlvbihzZWxmKToKICAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNoYWxsKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKIAotICAgIGRlZiBDaGVja1JlcGxhY2VTdGFydHNUcmFuc2FjdGlvbihzZWxmKToKKyAgICBkZWYgdGVzdF9yZXBsYWNlX3N0YXJ0c190cmFuc2FjdGlvbihzZWxmKToKICAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKICAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCiAgICAgICAgIHNlbGYuY29uMS5jb21taXQoKQpAQCAtOTUsNyArOTUsNyBAQCBkZWYgQ2hlY2tSZXBsYWNlU3RhcnRzVHJhbnNhY3Rpb24oc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzBdWzBdLCA1KQogCi0gICAgZGVmIENoZWNrVG9nZ2xlQXV0b0NvbW1pdChzZWxmKToKKyAgICBkZWYgdGVzdF90b2dnbGVfYXV0b19jb21taXQoc2VsZik6CiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQogICAgICAgICBzZWxmLmNvbjEuaXNvbGF0aW9uX2xldmVsID0gTm9uZQpAQCAtMTExLDEzICsxMTEsMTMgQEAgZGVmIENoZWNrVG9nZ2xlQXV0b0NvbW1pdChzZWxmKToKICAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNoYWxsKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKIAotICAgIGRlZiBDaGVja1JhaXNlVGltZW91dChzZWxmKToKKyAgICBkZWYgdGVzdF9yYWlzZV90aW1lb3V0KHNlbGYpOgogICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQogICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcik6CiAgICAgICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKIAotICAgIGRlZiBDaGVja0xvY2tpbmcoc2VsZik6CisgICAgZGVmIHRlc3RfbG9ja2luZyhzZWxmKToKICAgICAgICAgIiIiCiAgICAgICAgIFRoaXMgdGVzdHMgdGhlIGltcHJvdmVkIGNvbmN1cnJlbmN5IHdpdGggcHlzcWxpdGUgMi4zLjQuIFlvdSBuZWVkZWQKICAgICAgICAgdG8gcm9sbCBiYWNrIGNvbjIgYmVmb3JlIHlvdSBjb3VsZCBjb21taXQgY29uMS4KQEAgLTEyOSw3ICsxMjksNyBAQCBkZWYgQ2hlY2tMb2NraW5nKHNlbGYpOgogICAgICAgICAjIE5PIHNlbGYuY29uMi5yb2xsYmFjaygpIEhFUkUhISEKICAgICAgICAgc2VsZi5jb24xLmNvbW1pdCgpCiAKLSAgICBkZWYgQ2hlY2tSb2xsYmFja0N1cnNvckNvbnNpc3RlbmN5KHNlbGYpOgorICAgIGRlZiB0ZXN0X3JvbGxiYWNrX2N1cnNvcl9jb25zaXN0ZW5jeShzZWxmKToKICAgICAgICAgIiIiCiAgICAgICAgIENoZWNrcyBpZiBjdXJzb3JzIG9uIHRoZSBjb25uZWN0aW9uIGFyZSBzZXQgaW50byBhICJyZXNldCIgc3RhdGUKICAgICAgICAgd2hlbiBhIHJvbGxiYWNrIGlzIGRvbmUgb24gdGhlIGNvbm5lY3Rpb24uCkBAIC0xNDksMTIgKzE0OSwxMiBAQCBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogCi0gICAgZGVmIENoZWNrRHJvcFRhYmxlKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Ryb3BfdGFibGUoc2VsZik6CiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiZHJvcCB0YWJsZSB0ZXN0IikKIAotICAgIGRlZiBDaGVja1ByYWdtYShzZWxmKToKKyAgICBkZWYgdGVzdF9wcmFnbWEoc2VsZik6CiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgicHJhZ21hIGNvdW50X2NoYW5nZXM9MSIpCkBAIC0xNjcsNyArMTY3LDcgQEAgY2xhc3MgVHJhbnNhY3Rpb25hbERETCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAKLSAgICBkZWYgQ2hlY2tEZGxEb2VzTm90QXV0b3N0YXJ0VHJhbnNhY3Rpb24oc2VsZik6CisgICAgZGVmIHRlc3RfZGRsX2RvZXNfbm90X2F1dG9zdGFydF90cmFuc2FjdGlvbihzZWxmKToKICAgICAgICAgIyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucywgRERMIHN0YXRlbWVudHMgc2hvdWxkIG5vdAogICAgICAgICAjIGltcGxpY2l0bHkgc3RhcnQgYSB0cmFuc2FjdGlvbi4KICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQpAQCAtMTc1LDcgKzE3NSw3IEBAIGRlZiBDaGVja0RkbERvZXNOb3RBdXRvc3RhcnRUcmFuc2FjdGlvbihzZWxmKToKICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ICogZnJvbSB0ZXN0IikuZmV0Y2hhbGwoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgW10pCiAKLSAgICBkZWYgQ2hlY2tJbW1lZGlhdGVUcmFuc2FjdGlvbmFsRERMKHNlbGYpOgorICAgIGRlZiB0ZXN0X2ltbWVkaWF0ZV90cmFuc2FjdGlvbmFsX2RkbChzZWxmKToKICAgICAgICAgIyBZb3UgY2FuIGFjaGlldmUgdHJhbnNhY3Rpb25hbCBEREwgYnkgaXNzdWluZyBhIEJFR0lOCiAgICAgICAgICMgc3RhdGVtZW50IG1hbnVhbGx5LgogICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJiZWdpbiBpbW1lZGlhdGUiKQpAQCAtMTg0LDcgKzE4NCw3IEBAIGRlZiBDaGVja0ltbWVkaWF0ZVRyYW5zYWN0aW9uYWxEREwoc2VsZik6CiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpOgogICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ICogZnJvbSB0ZXN0IikKIAotICAgIGRlZiBDaGVja1RyYW5zYWN0aW9uYWxEREwoc2VsZik6CisgICAgZGVmIHRlc3RfdHJhbnNhY3Rpb25hbF9kZGwoc2VsZik6CiAgICAgICAgICMgWW91IGNhbiBhY2hpZXZlIHRyYW5zYWN0aW9uYWwgRERMIGJ5IGlzc3VpbmcgYSBCRUdJTgogICAgICAgICAjIHN0YXRlbWVudCBtYW51YWxseS4KICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiYmVnaW4iKQpAQCAtMTk3LDEwICsxOTcsMTQgQEAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCiAKIGRlZiBzdWl0ZSgpOgotICAgIGRlZmF1bHRfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoVHJhbnNhY3Rpb25UZXN0cywgIkNoZWNrIikKLSAgICBzcGVjaWFsX2NvbW1hbmRfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoU3BlY2lhbENvbW1hbmRUZXN0cywgIkNoZWNrIikKLSAgICBkZGxfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoVHJhbnNhY3Rpb25hbERETCwgIkNoZWNrIikKLSAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChkZWZhdWx0X3N1aXRlLCBzcGVjaWFsX2NvbW1hbmRfc3VpdGUsIGRkbF9zdWl0ZSkpCisgICAgdGVzdHMgPSBbCisgICAgICAgIFNwZWNpYWxDb21tYW5kVGVzdHMsCisgICAgICAgIFRyYW5zYWN0aW9uVGVzdHMsCisgICAgICAgIFRyYW5zYWN0aW9uYWxEREwsCisgICAgXQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoCisgICAgICAgIFt1bml0dGVzdC5UZXN0TG9hZGVyKCkubG9hZFRlc3RzRnJvbVRlc3RDYXNlKHQpIGZvciB0IGluIHRlc3RzXQorICAgICkKIAogZGVmIHRlc3QoKToKICAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weQppbmRleCA3NWE5ZDU2Li5kZjhhYWQ5IDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvdHlwZXMucHkKQEAgLTQwLDMzICs0MCwzMyBAQCBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKICAgICAgICAgc2VsZi5jb24uY2xvc2UoKQogCi0gICAgZGVmIENoZWNrU3RyaW5nKHNlbGYpOgorICAgIGRlZiB0ZXN0X3N0cmluZyhzZWxmKToKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChzKSB2YWx1ZXMgKD8pIiwgKCLWc3RlcnJlaWNoIiwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgcyBmcm9tIHRlc3QiKQogICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAi1nN0ZXJyZWljaCIpCiAKLSAgICBkZWYgQ2hlY2tTbWFsbEludChzZWxmKToKKyAgICBkZWYgdGVzdF9zbWFsbF9pbnQoc2VsZik6CiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg/KSIsICg0MiwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQogICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCA0MikKIAotICAgIGRlZiBDaGVja0xhcmdlSW50KHNlbGYpOgorICAgIGRlZiB0ZXN0X2xhcmdlX2ludChzZWxmKToKICAgICAgICAgbnVtID0gMioqNDAKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKG51bSwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQogICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBudW0pCiAKLSAgICBkZWYgQ2hlY2tGbG9hdChzZWxmKToKKyAgICBkZWYgdGVzdF9mbG9hdChzZWxmKToKICAgICAgICAgdmFsID0gMy4xNAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGYpIHZhbHVlcyAoPykiLCAodmFsLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBmIGZyb20gdGVzdCIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHZhbCkKIAotICAgIGRlZiBDaGVja0Jsb2Ioc2VsZik6CisgICAgZGVmIHRlc3RfYmxvYihzZWxmKToKICAgICAgICAgc2FtcGxlID0gYiJHdWdsaHVwZiIKICAgICAgICAgdmFsID0gbWVtb3J5dmlldyhzYW1wbGUpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYikgdmFsdWVzICg/KSIsICh2YWwsKSkKQEAgLTc0LDcgKzc0LDcgQEAgZGVmIENoZWNrQmxvYihzZWxmKToKICAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgc2FtcGxlKQogCi0gICAgZGVmIENoZWNrVW5pY29kZUV4ZWN1dGUoc2VsZik6CisgICAgZGVmIHRlc3RfdW5pY29kZV9leGVjdXRlKHNlbGYpOgogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgJ9ZzdGVycmVpY2gnIikKICAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgItZzdGVycmVpY2giKQpAQCAtMTMzLDIxICsxMzMsMjEgQEAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCiAgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKIAotICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKKyAgICBkZWYgdGVzdF9zdHJpbmcoc2VsZik6CiAgICAgICAgICMgZGVmYXVsdAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHMpIHZhbHVlcyAoPykiLCAoImZvbyIsKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgnc2VsZWN0IHMgYXMgInMgW1dST05HXSIgZnJvbSB0ZXN0JykKICAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImZvbyIpCiAKLSAgICBkZWYgQ2hlY2tTbWFsbEludChzZWxmKToKKyAgICBkZWYgdGVzdF9zbWFsbF9pbnQoc2VsZik6CiAgICAgICAgICMgZGVmYXVsdAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCAoNDIsKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKICAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgNDIpCiAKLSAgICBkZWYgQ2hlY2tMYXJnZUludChzZWxmKToKKyAgICBkZWYgdGVzdF9sYXJnZV9pbnQoc2VsZik6CiAgICAgICAgICMgZGVmYXVsdAogICAgICAgICBudW0gPSAyKio0MAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCAobnVtLCkpCkBAIC0xNTUsNyArMTU1LDcgQEAgZGVmIENoZWNrTGFyZ2VJbnQoc2VsZik6CiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIG51bSkKIAotICAgIGRlZiBDaGVja0Zsb2F0KHNlbGYpOgorICAgIGRlZiB0ZXN0X2Zsb2F0KHNlbGYpOgogICAgICAgICAjIGN1c3RvbQogICAgICAgICB2YWwgPSAzLjE0CiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZikgdmFsdWVzICg/KSIsICh2YWwsKSkKQEAgLTE2Myw3ICsxNjMsNyBAQCBkZWYgQ2hlY2tGbG9hdChzZWxmKToKICAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgNDcuMikKIAotICAgIGRlZiBDaGVja0Jvb2woc2VsZik6CisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKICAgICAgICAgIyBjdXN0b20KICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChiKSB2YWx1ZXMgKD8pIiwgKEZhbHNlLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBiIGZyb20gdGVzdCIpCkBAIC0xNzYsNyArMTc2LDcgQEAgZGVmIENoZWNrQm9vbChzZWxmKToKICAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgICBzZWxmLmFzc2VydElzKHJvd1swXSwgVHJ1ZSkKIAotICAgIGRlZiBDaGVja1VuaWNvZGUoc2VsZik6CisgICAgZGVmIHRlc3RfdW5pY29kZShzZWxmKToKICAgICAgICAgIyBkZWZhdWx0CiAgICAgICAgIHZhbCA9ICJceGQ2c3RlcnJlaWNoIgogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHUpIHZhbHVlcyAoPykiLCAodmFsLCkpCkBAIC0xODQsMTQgKzE4NCwxNCBAQCBkZWYgQ2hlY2tVbmljb2RlKHNlbGYpOgogICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCB2YWwpCiAKLSAgICBkZWYgQ2hlY2tGb28oc2VsZik6CisgICAgZGVmIHRlc3RfZm9vKHNlbGYpOgogICAgICAgICB2YWwgPSBEZWNsVHlwZXNUZXN0cy5Gb28oImJsYSIpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZm9vKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZm9vIGZyb20gdGVzdCIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHZhbCkKIAotICAgIGRlZiBDaGVja0Vycm9ySW5Db25mb3JtKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Vycm9yX2luX2NvbmZvcm0oc2VsZik6CiAgICAgICAgIHZhbCA9IERlY2xUeXBlc1Rlc3RzLkJhZENvbmZvcm0oVHlwZUVycm9yKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5JbnRlcmZhY2VFcnJvcik6CiAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGJhZCkgdmFsdWVzICg/KSIsICh2YWwsKSkKQEAgLTIwNCwxOSArMjA0LDE5IEBAIGRlZiBDaGVja0Vycm9ySW5Db25mb3JtKHNlbGYpOgogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleWJvYXJkSW50ZXJydXB0KToKICAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYmFkKSB2YWx1ZXMgKDp2YWwpIiwgeyJ2YWwiOiB2YWx9KQogCi0gICAgZGVmIENoZWNrVW5zdXBwb3J0ZWRTZXEoc2VsZik6CisgICAgZGVmIHRlc3RfdW5zdXBwb3J0ZWRfc2VxKHNlbGYpOgogICAgICAgICBjbGFzcyBCYXI6IHBhc3MKICAgICAgICAgdmFsID0gQmFyKCkKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuSW50ZXJmYWNlRXJyb3IpOgogICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQogCi0gICAgZGVmIENoZWNrVW5zdXBwb3J0ZWREaWN0KHNlbGYpOgorICAgIGRlZiB0ZXN0X3Vuc3VwcG9ydGVkX2RpY3Qoc2VsZik6CiAgICAgICAgIGNsYXNzIEJhcjogcGFzcwogICAgICAgICB2YWwgPSBCYXIoKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5JbnRlcmZhY2VFcnJvcik6CiAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGYpIHZhbHVlcyAoOnZhbCkiLCB7InZhbCI6IHZhbH0pCiAKLSAgICBkZWYgQ2hlY2tCbG9iKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Jsb2Ioc2VsZik6CiAgICAgICAgICMgZGVmYXVsdAogICAgICAgICBzYW1wbGUgPSBiIkd1Z2xodXBmIgogICAgICAgICB2YWwgPSBtZW1vcnl2aWV3KHNhbXBsZSkKQEAgLTIyNSwxMyArMjI1LDEzIEBAIGRlZiBDaGVja0Jsb2Ioc2VsZik6CiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHNhbXBsZSkKIAotICAgIGRlZiBDaGVja051bWJlcjEoc2VsZik6CisgICAgZGVmIHRlc3RfbnVtYmVyMShzZWxmKToKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuMSkgdmFsdWVzICg1KSIpCiAgICAgICAgIHZhbHVlID0gc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IG4xIGZyb20gdGVzdCIpLmZldGNob25lKClbMF0KICAgICAgICAgIyBpZiB0aGUgY29udmVydGVyIGlzIG5vdCB1c2VkLCBpdCdzIGFuIGludCBpbnN0ZWFkIG9mIGEgZmxvYXQKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbHVlKSwgZmxvYXQpCiAKLSAgICBkZWYgQ2hlY2tOdW1iZXIyKHNlbGYpOgorICAgIGRlZiB0ZXN0X251bWJlcjIoc2VsZik6CiAgICAgICAgICIiIkNoZWNrcyB3aGV0aGVyIGNvbnZlcnRlciBuYW1lcyBhcmUgY3V0IG9mZiBhdCAnKCcgY2hhcmFjdGVycyIiIgogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG4yKSB2YWx1ZXMgKDUpIikKICAgICAgICAgdmFsdWUgPSBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgbjIgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKVswXQpAQCAtMjU3LDcgKzI1Nyw3IEBAIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQogICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCiAKLSAgICBkZWYgQ2hlY2tEZWNsVHlwZU5vdFVzZWQoc2VsZik6CisgICAgZGVmIHRlc3RfZGVjbF90eXBlX25vdF91c2VkKHNlbGYpOgogICAgICAgICAiIiIKICAgICAgICAgQXNzdXJlcyB0aGF0IHRoZSBkZWNsYXJlZCB0eXBlIGlzIG5vdCB1c2VkIHdoZW4gUEFSU0VfREVDTFRZUEVTCiAgICAgICAgIGlzIG5vdCBzZXQuCkBAIC0yNjcsMTMgKzI2NywxMyBAQCBkZWYgQ2hlY2tEZWNsVHlwZU5vdFVzZWQoc2VsZik6CiAgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsICJ4eHgiKQogCi0gICAgZGVmIENoZWNrTm9uZShzZWxmKToKKyAgICBkZWYgdGVzdF9ub25lKHNlbGYpOgogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHgpIHZhbHVlcyAoPykiLCAoTm9uZSwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgeCBmcm9tIHRlc3QiKQogICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCBOb25lKQogCi0gICAgZGVmIENoZWNrQ29sTmFtZShzZWxmKToKKyAgICBkZWYgdGVzdF9jb2xfbmFtZShzZWxmKToKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh4KSB2YWx1ZXMgKD8pIiwgKCJ4eHgiLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoJ3NlbGVjdCB4IGFzICJ4IHkgW2Jhcl0iIGZyb20gdGVzdCcpCiAgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KQEAgLTI4MywxMiArMjgzLDEyIEBAIGRlZiBDaGVja0NvbE5hbWUoc2VsZik6CiAgICAgICAgICMgJ1snIChhbmQgdGhlIHByZWNlZWRpbmcgc3BhY2UpIHNob3VsZCBiZSBzdHJpcHBlZC4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1ci5kZXNjcmlwdGlvblswXVswXSwgInggeSIpCiAKLSAgICBkZWYgQ2hlY2tDYXNlSW5Db252ZXJ0ZXJOYW1lKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Nhc2VfaW5fY29udmVydGVyX25hbWUoc2VsZik6CiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCAnb3RoZXInIGFzIFwieCBbYjFiMV1cIiIpCiAgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsICJNQVJLRVIiKQogCi0gICAgZGVmIENoZWNrQ3Vyc29yRGVzY3JpcHRpb25Ob1JvdyhzZWxmKToKKyAgICBkZWYgdGVzdF9jdXJzb3JfZGVzY3JpcHRpb25fbm9fcm93KHNlbGYpOgogICAgICAgICAiIiIKICAgICAgICAgY3Vyc29yLmRlc2NyaXB0aW9uIHNob3VsZCBhdCBsZWFzdCBwcm92aWRlIHRoZSBjb2x1bW4gbmFtZShzKSwgZXZlbiBpZgogICAgICAgICBubyByb3cgcmV0dXJuZWQuCkBAIC0yOTYsNyArMjk2LDcgQEAgZGVmIENoZWNrQ3Vyc29yRGVzY3JpcHRpb25Ob1JvdyhzZWxmKToKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0ICogZnJvbSB0ZXN0IHdoZXJlIDAgPSAxIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1ci5kZXNjcmlwdGlvblswXVswXSwgIngiKQogCi0gICAgZGVmIENoZWNrQ3Vyc29yRGVzY3JpcHRpb25JbnNlcnQoc2VsZik6CisgICAgZGVmIHRlc3RfY3Vyc29yX2Rlc2NyaXB0aW9uX2luc2VydChzZWxmKToKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCB2YWx1ZXMgKDEpIikKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5jdXIuZGVzY3JpcHRpb24pCiAKQEAgLTMxMywxOSArMzEzLDE5IEBAIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQogICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCiAKLSAgICBkZWYgQ2hlY2tDdXJzb3JEZXNjcmlwdGlvbkNURVNpbXBsZShzZWxmKToKKyAgICBkZWYgdGVzdF9jdXJzb3JfZGVzY3JpcHRpb25fY3RlX3NpbXBsZShzZWxmKToKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgid2l0aCBvbmUgYXMgKHNlbGVjdCAxKSBzZWxlY3QgKiBmcm9tIG9uZSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHNlbGYuY3VyLmRlc2NyaXB0aW9uKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3VyLmRlc2NyaXB0aW9uWzBdWzBdLCAiMSIpCiAKLSAgICBkZWYgQ2hlY2tDdXJzb3JEZXNjcmlwdGlvbkNURVNNdWx0aXBsZUNvbHVtbnMoc2VsZik6CisgICAgZGVmIHRlc3RfY3Vyc29yX2Rlc2NyaXB0aW9uX2N0ZV9tdWx0aXBsZV9jb2x1bW5zKHNlbGYpOgogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcygxKSIpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QgdmFsdWVzKDIpIikKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgid2l0aCB0ZXN0Q1RFIGFzIChzZWxlY3QgKiBmcm9tIHRlc3QpIHNlbGVjdCAqIGZyb20gdGVzdENURSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHNlbGYuY3VyLmRlc2NyaXB0aW9uKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3VyLmRlc2NyaXB0aW9uWzBdWzBdLCAieCIpCiAKLSAgICBkZWYgQ2hlY2tDdXJzb3JEZXNjcmlwdGlvbkNURShzZWxmKToKKyAgICBkZWYgdGVzdF9jdXJzb3JfZGVzY3JpcHRpb25fY3RlKHNlbGYpOgogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0IHZhbHVlcyAoMSkiKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJ3aXRoIGJhciBhcyAoc2VsZWN0ICogZnJvbSB0ZXN0KSBzZWxlY3QgKiBmcm9tIHRlc3Qgd2hlcmUgeCA9IDEiKQogICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShzZWxmLmN1ci5kZXNjcmlwdGlvbikKQEAgLTM1NCw3ICszNTQsNyBAQCBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKICAgICAgICAgc2VsZi5jb24uY2xvc2UoKQogCi0gICAgZGVmIENoZWNrQ2FzdGVySXNVc2VkKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Nhc3Rlcl9pc191c2VkKHNlbGYpOgogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgPyIsICg0LCkpCiAgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIGZsb2F0KQpAQCAtMzcyLDcgKzM3Miw3IEBAIGRlZiBzZXRVcChzZWxmKToKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKIAotICAgIGRlZiBDaGVja0JpbmFyeUlucHV0Rm9yQ29udmVydGVyKHNlbGYpOgorICAgIGRlZiB0ZXN0X2JpbmFyeV9pbnB1dF9mb3JfY29udmVydGVyKHNlbGYpOgogICAgICAgICB0ZXN0ZGF0YSA9IGIiYWJjZGVmZyIgKiAxMAogICAgICAgICByZXN1bHQgPSBzZWxmLmNvbi5leGVjdXRlKCdzZWxlY3QgPyBhcyAieCBbYmluXSInLCAobWVtb3J5dmlldyh6bGliLmNvbXByZXNzKHRlc3RkYXRhKSksKSkuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RkYXRhLCByZXN1bHQpCkBAIC0zODcsMjEgKzM4NywyMSBAQCBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKICAgICAgICAgc2VsZi5jb24uY2xvc2UoKQogCi0gICAgZGVmIENoZWNrU3FsaXRlRGF0ZShzZWxmKToKKyAgICBkZWYgdGVzdF9zcWxpdGVfZGF0ZShzZWxmKToKICAgICAgICAgZCA9IHNxbGl0ZS5EYXRlKDIwMDQsIDIsIDE0KQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGQpIHZhbHVlcyAoPykiLCAoZCwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZCBmcm9tIHRlc3QiKQogICAgICAgICBkMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkMikKIAotICAgIGRlZiBDaGVja1NxbGl0ZVRpbWVzdGFtcChzZWxmKToKKyAgICBkZWYgdGVzdF9zcWxpdGVfdGltZXN0YW1wKHNlbGYpOgogICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXAoMjAwNCwgMiwgMTQsIDcsIDE1LCAwKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKD8pIiwgKHRzLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQogICAgICAgICB0czIgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMsIHRzMikKIAotICAgIGRlZiBDaGVja1NxbFRpbWVzdGFtcChzZWxmKToKKyAgICBkZWYgdGVzdF9zcWxfdGltZXN0YW1wKHNlbGYpOgogICAgICAgICBub3cgPSBkYXRldGltZS5kYXRldGltZS51dGNub3coKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKGN1cnJlbnRfdGltZXN0YW1wKSIpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQpAQCAtNDA5LDE0ICs0MDksMTQgQEAgZGVmIENoZWNrU3FsVGltZXN0YW1wKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodHMpLCBkYXRldGltZS5kYXRldGltZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy55ZWFyLCBub3cueWVhcikKIAotICAgIGRlZiBDaGVja0RhdGVUaW1lU3ViU2Vjb25kcyhzZWxmKToKKyAgICBkZWYgdGVzdF9kYXRlX3RpbWVfc3ViX3NlY29uZHMoc2VsZik6CiAgICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcCgyMDA0LCAyLCAxNCwgNywgMTUsIDAsIDUwMDAwMCkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh0cykgdmFsdWVzICg/KSIsICh0cywpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgdHMgZnJvbSB0ZXN0IikKICAgICAgICAgdHMyID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLCB0czIpCiAKLSAgICBkZWYgQ2hlY2tEYXRlVGltZVN1YlNlY29uZHNGbG9hdGluZ1BvaW50KHNlbGYpOgorICAgIGRlZiB0ZXN0X2RhdGVfdGltZV9zdWJfc2Vjb25kc19mbG9hdGluZ19wb2ludChzZWxmKToKICAgICAgICAgdHMgPSBzcWxpdGUuVGltZXN0YW1wKDIwMDQsIDIsIDE0LCA3LCAxNSwgMCwgNTEwMjQxKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKD8pIiwgKHRzLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQpAQCAtNDI0LDE0ICs0MjQsMTggQEAgZGVmIENoZWNrRGF0ZVRpbWVTdWJTZWNvbmRzRmxvYXRpbmdQb2ludChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cywgdHMyKQogCiBkZWYgc3VpdGUoKToKLSAgICBzcWxpdGVfdHlwZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShTcWxpdGVUeXBlVGVzdHMsICJDaGVjayIpCi0gICAgZGVjbHR5cGVzX3R5cGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoRGVjbFR5cGVzVGVzdHMsICJDaGVjayIpCi0gICAgY29sbmFtZXNfdHlwZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb2xOYW1lc1Rlc3RzLCAiQ2hlY2siKQotICAgIGFkYXB0YXRpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoT2JqZWN0QWRhcHRhdGlvblRlc3RzLCAiQ2hlY2siKQotICAgIGJpbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShCaW5hcnlDb252ZXJ0ZXJUZXN0cywgIkNoZWNrIikKLSAgICBkYXRlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKERhdGVUaW1lVGVzdHMsICJDaGVjayIpCi0gICAgY3RlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbW1vblRhYmxlRXhwcmVzc2lvblRlc3RzLCAiQ2hlY2siKQotICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKHNxbGl0ZV90eXBlX3N1aXRlLCBkZWNsdHlwZXNfdHlwZV9zdWl0ZSwgY29sbmFtZXNfdHlwZV9zdWl0ZSwgYWRhcHRhdGlvbl9zdWl0ZSwgYmluX3N1aXRlLCBkYXRlX3N1aXRlLCBjdGVfc3VpdGUpKQorICAgIHRlc3RzID0gWworICAgICAgICBCaW5hcnlDb252ZXJ0ZXJUZXN0cywKKyAgICAgICAgQ29sTmFtZXNUZXN0cywKKyAgICAgICAgQ29tbW9uVGFibGVFeHByZXNzaW9uVGVzdHMsCisgICAgICAgIERhdGVUaW1lVGVzdHMsCisgICAgICAgIERlY2xUeXBlc1Rlc3RzLAorICAgICAgICBPYmplY3RBZGFwdGF0aW9uVGVzdHMsCisgICAgICAgIFNxbGl0ZVR5cGVUZXN0cywKKyAgICBdCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgKKyAgICAgICAgW3VuaXR0ZXN0LlRlc3RMb2FkZXIoKS5sb2FkVGVzdHNGcm9tVGVzdENhc2UodCkgZm9yIHQgaW4gdGVzdHNdCisgICAgKQogCiBkZWYgdGVzdCgpOgogICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weQppbmRleCBjMTFjODJlLi4yMjg1YWJkIDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5CkBAIC0xNjIsMTEgKzE2MiwxMSBAQCBkZWYgc2V0VXAoc2VsZik6CiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCiAKLSAgICBkZWYgQ2hlY2tGdW5jRXJyb3JPbkNyZWF0ZShzZWxmKToKKyAgICBkZWYgdGVzdF9mdW5jX2Vycm9yX29uX2NyZWF0ZShzZWxmKToKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcik6CiAgICAgICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImJsYSIsIC0xMDAsIGxhbWJkYSB4OiAyKngpCiAKLSAgICBkZWYgQ2hlY2tGdW5jUmVmQ291bnQoc2VsZik6CisgICAgZGVmIHRlc3RfZnVuY19yZWZfY291bnQoc2VsZik6CiAgICAgICAgIGRlZiBnZXRmdW5jKCk6CiAgICAgICAgICAgICBkZWYgZigpOgogICAgICAgICAgICAgICAgIHJldHVybiAxCkBAIC0xNzgsMjggKzE3OCwyOCBAQCBkZWYgZigpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJlZnRlc3QoKSIpCiAKLSAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuVGV4dChzZWxmKToKKyAgICBkZWYgdGVzdF9mdW5jX3JldHVybl90ZXh0KHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybnRleHQoKSIpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAiZm9vIikKIAotICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5Vbmljb2RlKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Z1bmNfcmV0dXJuX3VuaWNvZGUoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJudW5pY29kZSgpIikKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsICJiYXIiKQogCi0gICAgZGVmIENoZWNrRnVuY1JldHVybkludChzZWxmKToKKyAgICBkZWYgdGVzdF9mdW5jX3JldHVybl9pbnQoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuaW50KCkiKQogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsKSwgaW50KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgNDIpCiAKLSAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuRmxvYXQoc2VsZik6CisgICAgZGVmIHRlc3RfZnVuY19yZXR1cm5fZmxvYXQoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuZmxvYXQoKSIpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCkBAIC0yMDcsNzAgKzIwNyw3MCBAQCBkZWYgQ2hlY2tGdW5jUmV0dXJuRmxvYXQoc2VsZik6CiAgICAgICAgIGlmIHZhbCA8IDMuMTM5IG9yIHZhbCA+IDMuMTQxOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyB2YWx1ZSIpCiAKLSAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuTnVsbChzZWxmKToKKyAgICBkZWYgdGVzdF9mdW5jX3JldHVybl9udWxsKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybm51bGwoKSIpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCB0eXBlKE5vbmUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgTm9uZSkKIAotICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5CbG9iKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Z1bmNfcmV0dXJuX2Jsb2Ioc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuYmxvYigpIikKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIGJ5dGVzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgYiJibG9iIikKIAotICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5Mb25nTG9uZyhzZWxmKToKKyAgICBkZWYgdGVzdF9mdW5jX3JldHVybl9sb25nX2xvbmcoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJubG9uZ2xvbmcoKSIpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxPDwzMSkKIAotICAgIGRlZiBDaGVja0Z1bmNFeGNlcHRpb24oc2VsZik6CisgICAgZGVmIHRlc3RfZnVuY19leGNlcHRpb24oc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpIGFzIGNtOgogICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByYWlzZWV4Y2VwdGlvbigpIikKICAgICAgICAgICAgIGN1ci5mZXRjaG9uZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksICd1c2VyLWRlZmluZWQgZnVuY3Rpb24gcmFpc2VkIGV4Y2VwdGlvbicpCiAKLSAgICBkZWYgQ2hlY2tQYXJhbVN0cmluZyhzZWxmKToKKyAgICBkZWYgdGVzdF9wYXJhbV9zdHJpbmcoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNzdHJpbmcoPykiLCAoImZvbyIsKSkKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCiAKLSAgICBkZWYgQ2hlY2tQYXJhbUludChzZWxmKToKKyAgICBkZWYgdGVzdF9wYXJhbV9pbnQoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNpbnQoPykiLCAoNDIsKSkKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCiAKLSAgICBkZWYgQ2hlY2tQYXJhbUZsb2F0KHNlbGYpOgorICAgIGRlZiB0ZXN0X3BhcmFtX2Zsb2F0KHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzZmxvYXQoPykiLCAoMy4xNCwpKQogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKIAotICAgIGRlZiBDaGVja1BhcmFtTm9uZShzZWxmKToKKyAgICBkZWYgdGVzdF9wYXJhbV9ub25lKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzbm9uZSg/KSIsIChOb25lLCkpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQogCi0gICAgZGVmIENoZWNrUGFyYW1CbG9iKHNlbGYpOgorICAgIGRlZiB0ZXN0X3BhcmFtX2Jsb2Ioc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNibG9iKD8pIiwgKG1lbW9yeXZpZXcoYiJibG9iIiksKSkKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCiAKLSAgICBkZWYgQ2hlY2tQYXJhbUxvbmdMb25nKHNlbGYpOgorICAgIGRlZiB0ZXN0X3BhcmFtX2xvbmdfbG9uZyhzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2xvbmdsb25nKD8pIiwgKDE8PDQyLCkpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQogCi0gICAgZGVmIENoZWNrQW55QXJndW1lbnRzKHNlbGYpOgorICAgIGRlZiB0ZXN0X2FueV9hcmd1bWVudHMoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgc3BhbSg/LCA/KSIsICgxLCAyKSkKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KQEAgLTI4NCw3ICsyODQsNyBAQCBkZWYgQ2hlY2tBbnlBcmd1bWVudHMoc2VsZik6CiAgICAgIyBkZXRlcm1pbmlzdGljIGZ1bmN0aW9ucyB3ZXJlIHBlcm1pdHRlZCBpbiBXSEVSRSBjbGF1c2VzIG9mIHBhcnRpYWwKICAgICAjIGluZGljZXMsIHdoaWNoIGFsbG93cyB0ZXN0aW5nIGJhc2VkIG9uIHN5bnRheCwgaXNvLiB0aGUgcXVlcnkgb3B0aW1pemVyLgogICAgIEB1bml0dGVzdC5za2lwSWYoc3FsaXRlLnNxbGl0ZV92ZXJzaW9uX2luZm8gPCAoMywgOCwgMyksICJSZXF1aXJlcyBTUUxpdGUgMy44LjMgb3IgaGlnaGVyIikKLSAgICBkZWYgQ2hlY2tGdW5jTm9uRGV0ZXJtaW5pc3RpYyhzZWxmKToKKyAgICBkZWYgdGVzdF9mdW5jX25vbl9kZXRlcm1pbmlzdGljKHNlbGYpOgogICAgICAgICBtb2NrID0gdW5pdHRlc3QubW9jay5Nb2NrKHJldHVybl92YWx1ZT1Ob25lKQogICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oIm5vbmRldGVybWluaXN0aWMiLCAwLCBtb2NrLCBkZXRlcm1pbmlzdGljPUZhbHNlKQogICAgICAgICBpZiBzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCAxNSwgMCk6CkBAIC0yOTUsNyArMjk1LDcgQEAgZGVmIENoZWNrRnVuY05vbkRldGVybWluaXN0aWMoc2VsZik6CiAgICAgICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiY3JlYXRlIGluZGV4IHQgb24gdGVzdCh0KSB3aGVyZSBub25kZXRlcm1pbmlzdGljKCkgaXMgbm90IG51bGwiKQogCiAgICAgQHVuaXR0ZXN0LnNraXBJZihzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCA4LCAzKSwgIlJlcXVpcmVzIFNRTGl0ZSAzLjguMyBvciBoaWdoZXIiKQotICAgIGRlZiBDaGVja0Z1bmNEZXRlcm1pbmlzdGljKHNlbGYpOgorICAgIGRlZiB0ZXN0X2Z1bmNfZGV0ZXJtaW5pc3RpYyhzZWxmKToKICAgICAgICAgbW9jayA9IHVuaXR0ZXN0Lm1vY2suTW9jayhyZXR1cm5fdmFsdWU9Tm9uZSkKICAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJkZXRlcm1pbmlzdGljIiwgMCwgbW9jaywgZGV0ZXJtaW5pc3RpYz1UcnVlKQogICAgICAgICBpZiBzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCAxNSwgMCk6CkBAIC0zMDgsMTEgKzMwOCwxMSBAQCBkZWYgQ2hlY2tGdW5jRGV0ZXJtaW5pc3RpYyhzZWxmKToKICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlVuZXhwZWN0ZWQgZmFpbHVyZSB3aGlsZSBjcmVhdGluZyBwYXJ0aWFsIGluZGV4IikKIAogICAgIEB1bml0dGVzdC5za2lwSWYoc3FsaXRlLnNxbGl0ZV92ZXJzaW9uX2luZm8gPj0gKDMsIDgsIDMpLCAiU1FMaXRlIDwgMy44LjMgbmVlZGVkIikKLSAgICBkZWYgQ2hlY2tGdW5jRGV0ZXJtaW5pc3RpY05vdFN1cHBvcnRlZChzZWxmKToKKyAgICBkZWYgdGVzdF9mdW5jX2RldGVybWluaXN0aWNfbm90X3N1cHBvcnRlZChzZWxmKToKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuTm90U3VwcG9ydGVkRXJyb3IpOgogICAgICAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJkZXRlcm1pbmlzdGljIiwgMCwgaW50LCBkZXRlcm1pbmlzdGljPVRydWUpCiAKLSAgICBkZWYgQ2hlY2tGdW5jRGV0ZXJtaW5pc3RpY0tleXdvcmRPbmx5KHNlbGYpOgorICAgIGRlZiB0ZXN0X2Z1bmNfZGV0ZXJtaW5pc3RpY19rZXl3b3JkX29ubHkoc2VsZik6CiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKICAgICAgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiZGV0ZXJtaW5pc3RpYyIsIDAsIGludCwgVHJ1ZSkKIApAQCAtMzQ3LDgxICszNDcsODEgQEAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICAjc2VsZi5jb24uY2xvc2UoKQogICAgICAgICBwYXNzCiAKLSAgICBkZWYgQ2hlY2tBZ2dyRXJyb3JPbkNyZWF0ZShzZWxmKToKKyAgICBkZWYgdGVzdF9hZ2dyX2Vycm9yX29uX2NyZWF0ZShzZWxmKToKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcik6CiAgICAgICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImJsYSIsIC0xMDAsIEFnZ3JTdW0pCiAKLSAgICBkZWYgQ2hlY2tBZ2dyTm9TdGVwKHNlbGYpOgorICAgIGRlZiB0ZXN0X2FnZ3Jfbm9fc3RlcChzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcikgYXMgY206CiAgICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IG5vc3RlcCh0KSBmcm9tIHRlc3QiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCAiJ0FnZ3JOb1N0ZXAnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdzdGVwJyIpCiAKLSAgICBkZWYgQ2hlY2tBZ2dyTm9GaW5hbGl6ZShzZWxmKToKKyAgICBkZWYgdGVzdF9hZ2dyX25vX2ZpbmFsaXplKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yKSBhcyBjbToKICAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9maW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQogICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnZmluYWxpemUnIG1ldGhvZCByYWlzZWQgZXJyb3IiKQogCi0gICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluSW5pdChzZWxmKToKKyAgICBkZWYgdGVzdF9hZ2dyX2V4Y2VwdGlvbl9pbl9pbml0KHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yKSBhcyBjbToKICAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjSW5pdCh0KSBmcm9tIHRlc3QiKQogICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnX19pbml0X18nIG1ldGhvZCByYWlzZWQgZXJyb3IiKQogCi0gICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluU3RlcChzZWxmKToKKyAgICBkZWYgdGVzdF9hZ2dyX2V4Y2VwdGlvbl9pbl9zdGVwKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yKSBhcyBjbToKICAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjU3RlcCh0KSBmcm9tIHRlc3QiKQogICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnc3RlcCcgbWV0aG9kIHJhaXNlZCBlcnJvciIpCiAKLSAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5GaW5hbGl6ZShzZWxmKToKKyAgICBkZWYgdGVzdF9hZ2dyX2V4Y2VwdGlvbl9pbl9maW5hbGl6ZShzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikgYXMgY206CiAgICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y0ZpbmFsaXplKHQpIGZyb20gdGVzdCIpCiAgICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdmaW5hbGl6ZScgbWV0aG9kIHJhaXNlZCBlcnJvciIpCiAKLSAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbVN0cihzZWxmKToKKyAgICBkZWYgdGVzdF9hZ2dyX2NoZWNrX3BhcmFtX3N0cihzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ3N0cicsID8pIiwgKCJmb28iLCkpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQogCi0gICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1JbnQoc2VsZik6CisgICAgZGVmIHRlc3RfYWdncl9jaGVja19wYXJhbV9pbnQoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdpbnQnLCA/KSIsICg0MiwpKQogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKIAotICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtc0ludChzZWxmKToKKyAgICBkZWYgdGVzdF9hZ2dyX2NoZWNrX3BhcmFtc19pbnQoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlcygnaW50JywgPywgPykiLCAoNDIsIDI0KSkKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDIpCiAKLSAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUZsb2F0KHNlbGYpOgorICAgIGRlZiB0ZXN0X2FnZ3JfY2hlY2tfcGFyYW1fZmxvYXQoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdmbG9hdCcsID8pIiwgKDMuMTQsKSkKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCiAKLSAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbU5vbmUoc2VsZik6CisgICAgZGVmIHRlc3RfYWdncl9jaGVja19wYXJhbV9ub25lKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnTm9uZScsID8pIiwgKE5vbmUsKSkKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCiAKLSAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUJsb2Ioc2VsZik6CisgICAgZGVmIHRlc3RfYWdncl9jaGVja19wYXJhbV9ibG9iKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnYmxvYicsID8pIiwgKG1lbW9yeXZpZXcoYiJibG9iIiksKSkKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCiAKLSAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tBZ2dyU3VtKHNlbGYpOgorICAgIGRlZiB0ZXN0X2FnZ3JfY2hlY2tfYWdncl9zdW0oc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKICAgICAgICAgY3VyLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCBbKDEwLCksICgyMCwpLCAoMzAsKV0pCkBAIC00OTQsMTcgKzQ5NCwxNyBAQCBkZWYgYXV0aG9yaXplcl9jYihhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgc291cmNlKToKIAogCiBkZWYgc3VpdGUoKToKLSAgICBmdW5jdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShGdW5jdGlvblRlc3RzLCAiQ2hlY2siKQotICAgIGFnZ3JlZ2F0ZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShBZ2dyZWdhdGVUZXN0cywgIkNoZWNrIikKLSAgICBhdXRob3JpemVyX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEF1dGhvcml6ZXJUZXN0cykKLSAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKCgKLSAgICAgICAgICAgIGZ1bmN0aW9uX3N1aXRlLAotICAgICAgICAgICAgYWdncmVnYXRlX3N1aXRlLAotICAgICAgICAgICAgYXV0aG9yaXplcl9zdWl0ZSwKLSAgICAgICAgICAgIHVuaXR0ZXN0Lm1ha2VTdWl0ZShBdXRob3JpemVyUmFpc2VFeGNlcHRpb25UZXN0cyksCi0gICAgICAgICAgICB1bml0dGVzdC5tYWtlU3VpdGUoQXV0aG9yaXplcklsbGVnYWxUeXBlVGVzdHMpLAotICAgICAgICAgICAgdW5pdHRlc3QubWFrZVN1aXRlKEF1dGhvcml6ZXJMYXJnZUludGVnZXJUZXN0cyksCi0gICAgICAgICkpCisgICAgdGVzdHMgPSBbCisgICAgICAgIEFnZ3JlZ2F0ZVRlc3RzLAorICAgICAgICBBdXRob3JpemVySWxsZWdhbFR5cGVUZXN0cywKKyAgICAgICAgQXV0aG9yaXplckxhcmdlSW50ZWdlclRlc3RzLAorICAgICAgICBBdXRob3JpemVyUmFpc2VFeGNlcHRpb25UZXN0cywKKyAgICAgICAgQXV0aG9yaXplclRlc3RzLAorICAgICAgICBGdW5jdGlvblRlc3RzLAorICAgIF0KKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKAorICAgICAgICBbdW5pdHRlc3QuVGVzdExvYWRlcigpLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZSh0KSBmb3IgdCBpbiB0ZXN0c10KKyAgICApCiAKIGRlZiB0ZXN0KCk6CiAgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQo=