ZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5CmluZGV4IGQyNzZhMzMuLjRjZTg5MDYgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weQpAQCAtNDQsMzkgKzQ0LDM5IEBACiAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZyBpcyBub3QgYSBzdWJjbGFzcyBvZiBFeGNlcHRpb24iKQogCiAgICAgZGVmIENoZWNrRXJyb3Ioc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHNxbGl0ZS5FcnJvciwgRXhjZXB0aW9uKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLkVycm9yLCBFeGNlcHRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIEV4Y2VwdGlvbiIpCiAKICAgICBkZWYgQ2hlY2tJbnRlcmZhY2VFcnJvcihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLkludGVyZmFjZUVycm9yLCBzcWxpdGUuRXJyb3IpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZXJmYWNlRXJyb3IsIHNxbGl0ZS5FcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJmYWNlRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRXJyb3IiKQogCiAgICAgZGVmIENoZWNrRGF0YWJhc2VFcnJvcihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLkRhdGFiYXNlRXJyb3IsIHNxbGl0ZS5FcnJvciksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5EYXRhYmFzZUVycm9yLCBzcWxpdGUuRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGFiYXNlRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRXJyb3IiKQogCiAgICAgZGVmIENoZWNrRGF0YUVycm9yKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuRGF0YUVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5EYXRhRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCiAKICAgICBkZWYgQ2hlY2tPcGVyYXRpb25hbEVycm9yKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgIk9wZXJhdGlvbmFsRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCiAKICAgICBkZWYgQ2hlY2tJbnRlZ3JpdHlFcnJvcihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLkludGVncml0eUVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5JbnRlZ3JpdHlFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgIkludGVncml0eUVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIERhdGFiYXNlRXJyb3IiKQogCiAgICAgZGVmIENoZWNrSW50ZXJuYWxFcnJvcihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLkludGVybmFsRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLkludGVybmFsRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcm5hbEVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIERhdGFiYXNlRXJyb3IiKQogCiAgICAgZGVmIENoZWNrUHJvZ3JhbW1pbmdFcnJvcihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLlByb2dyYW1taW5nRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLlByb2dyYW1taW5nRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9ncmFtbWluZ0Vycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIERhdGFiYXNlRXJyb3IiKQogCiAgICAgZGVmIENoZWNrTm90U3VwcG9ydGVkRXJyb3Ioc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHNxbGl0ZS5Ob3RTdXBwb3J0ZWRFcnJvciwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLk5vdFN1cHBvcnRlZEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWxpdGUuRGF0YWJhc2VFcnJvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAiTm90U3VwcG9ydGVkRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCiAKQEAgLTEyNiwxNiArMTI2LDE2IEBACiAKICAgICBkZWYgQ2hlY2tFeGNlcHRpb25zKHNlbGYpOgogICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guV2FybmluZywgc3FsaXRlLldhcm5pbmcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guRXJyb3IsIHNxbGl0ZS5FcnJvcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5JbnRlcmZhY2VFcnJvciwgc3FsaXRlLkludGVyZmFjZUVycm9yKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN4LkRhdGFiYXNlRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN4LkRhdGFFcnJvciwgc3FsaXRlLkRhdGFFcnJvcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5PcGVyYXRpb25hbEVycm9yLCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5JbnRlZ3JpdHlFcnJvciwgc3FsaXRlLkludGVncml0eUVycm9yKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN4LkludGVybmFsRXJyb3IsIHNxbGl0ZS5JbnRlcm5hbEVycm9yKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN4LlByb2dyYW1taW5nRXJyb3IsIHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN4Lk5vdFN1cHBvcnRlZEVycm9yLCBzcWxpdGUuTm90U3VwcG9ydGVkRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5XYXJuaW5nLCBzcWxpdGUuV2FybmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4LkVycm9yLCBzcWxpdGUuRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5JbnRlcmZhY2VFcnJvciwgc3FsaXRlLkludGVyZmFjZUVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guRGF0YWJhc2VFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5EYXRhRXJyb3IsIHNxbGl0ZS5EYXRhRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5PcGVyYXRpb25hbEVycm9yLCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4LkludGVncml0eUVycm9yLCBzcWxpdGUuSW50ZWdyaXR5RXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5JbnRlcm5hbEVycm9yLCBzcWxpdGUuSW50ZXJuYWxFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4LlByb2dyYW1taW5nRXJyb3IsIHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guTm90U3VwcG9ydGVkRXJyb3IsIHNxbGl0ZS5Ob3RTdXBwb3J0ZWRFcnJvcikKIAogY2xhc3MgQ3Vyc29yVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTIyNyw3ICsyMjcsNyBAQAogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPT8iLCBbImZvbyJdKQogICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJmb28iKQogCiAgICAgZGVmIENoZWNrRXhlY3V0ZVBhcmFtU2VxdWVuY2Uoc2VsZik6CiAgICAgICAgIGNsYXNzIEwob2JqZWN0KToKQEAgLTI0MCwxMyArMjQwLDEzIEBACiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9PyIsIEwoKSkKICAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKIAogICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZyhzZWxmKToKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT06bmFtZSIsIHsibmFtZSI6ICJmb28ifSkKICAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKIAogICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ19NYXBwaW5nKHNlbGYpOgogICAgICAgICBjbGFzcyBEKGRpY3QpOgpAQCAtMjU2LDcgKzI1Niw3IEBACiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUiLCBEKCkpCiAgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImZvbyIpCiAKICAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmdUb29MaXR0bGVBcmdzKHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQpAQCAtMjkwLDcgKzI5MCw3IEBACiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgidXBkYXRlIHRlc3Qgc2V0IG5hbWU9J2JhciciKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3Uucm93Y291bnQsIDIpCiAKICAgICBkZWYgQ2hlY2tSb3djb3VudFNlbGVjdChzZWxmKToKICAgICAgICAgIiIiCkBAIC0yOTksMTIgKzI5OSwxMiBAQAogICAgICAgICBoYXMgdGh1cyB0byBiZSAtMS4KICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IDUgdW5pb24gc2VsZWN0IDYiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAtMSkKIAogICAgIGRlZiBDaGVja1Jvd2NvdW50RXhlY3V0ZW1hbnkoc2VsZik6CiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsIFsoMSwpLCAoMiwpLCAoMywpXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jdS5yb3djb3VudCwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAzKQogCiAgICAgZGVmIENoZWNrVG90YWxDaGFuZ2VzKHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQpAQCAtMzc3LDI0ICszNzcsMjQgQEAKICAgICAgICAgbHN0ID0gW10KICAgICAgICAgZm9yIHJvdyBpbiBzZWxmLmN1OgogICAgICAgICAgICAgbHN0LmFwcGVuZChyb3dbMF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxzdFswXSwgNSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobHN0WzFdLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdFswXSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3RbMV0sIDYpCiAKICAgICBkZWYgQ2hlY2tGZXRjaG9uZShzZWxmKToKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQogICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJmb28iKQogICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdywgTm9uZSkKIAogICAgIGRlZiBDaGVja0ZldGNob25lTm9TdGF0ZW1lbnQoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY3guY3Vyc29yKCkKICAgICAgICAgcm93ID0gY3VyLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdywgTm9uZSkKIAogICAgIGRlZiBDaGVja0FycmF5U2l6ZShzZWxmKToKICAgICAgICAgIyBtdXN0IGRlZmF1bHQgb3QgMQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN1LmFycmF5c2l6ZSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LmFycmF5c2l6ZSwgMSkKIAogICAgICAgICAjIG5vdyBzZXQgdG8gMgogICAgICAgICBzZWxmLmN1LmFycmF5c2l6ZSA9IDIKQEAgLTQwNywyNyArNDA3LDI3IEBACiAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IikKICAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaG1hbnkoKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihyZXMpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAyKQogCiAgICAgZGVmIENoZWNrRmV0Y2htYW55KHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KDEwMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHJlcyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCiAgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KDEwMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIFtdKQogCiAgICAgZGVmIENoZWNrRmV0Y2htYW55S3dBcmcoc2VsZik6CiAgICAgICAgICIiIkNoZWNrcyBpZiBmZXRjaG1hbnkgd29ya3Mgd2l0aCBrZXl3b3JkIGFyZ3VtZW50cyIiIgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KHNpemU9MTAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKIAogICAgIGRlZiBDaGVja0ZldGNoYWxsKHNlbGYpOgogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCiAgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2hhbGwoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKICAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaGFsbCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcywgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBbXSkKIAogICAgIGRlZiBDaGVja1NldGlucHV0c2l6ZXMoc2VsZik6CiAgICAgICAgIHNlbGYuY3Uuc2V0aW5wdXRzaXplcyhbMywgNCwgNV0pCkBAIC00NDAsNyArNDQwLDcgQEAKIAogICAgIGRlZiBDaGVja0N1cnNvckNvbm5lY3Rpb24oc2VsZik6CiAgICAgICAgICMgT3B0aW9uYWwgREItQVBJIGV4dGVuc2lvbi4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jdS5jb25uZWN0aW9uLCBzZWxmLmN4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3UuY29ubmVjdGlvbiwgc2VsZi5jeCkKIAogICAgIGRlZiBDaGVja1dyb25nQ3Vyc29yQ2FsbGFibGUoc2VsZik6CiAgICAgICAgIHRyeToKQEAgLTY1MSw3ICs2NTEsNyBAQAogICAgICAgICAgICAgIiIiKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSBhIikKICAgICAgICAgcmVzID0gY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgNSkKIAogICAgIGRlZiBDaGVja1NjcmlwdEVycm9ySW5jb21wbGV0ZShzZWxmKToKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKQEAgLTY2MSw3ICs2NjEsNyBAQAogICAgICAgICAgICAgY3VyLmV4ZWN1dGVzY3JpcHQoImNyZWF0ZSB0YWJsZSB0ZXN0KHNhZGZzYWRmZHNhIikKICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgogICAgICAgICAgICAgcmFpc2VkID0gVHJ1ZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyYWlzZWQsIFRydWUsICJzaG91bGQgaGF2ZSByYWlzZWQgYW4gZXhjZXB0aW9uIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYWlzZWQsIFRydWUsICJzaG91bGQgaGF2ZSByYWlzZWQgYW4gZXhjZXB0aW9uIikKIAogICAgIGRlZiBDaGVja1NjcmlwdEVycm9yTm9ybWFsKHNlbGYpOgogICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQpAQCAtNjcxLDI2ICs2NzEsMjYgQEAKICAgICAgICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KCJjcmVhdGUgdGFibGUgdGVzdChzYWRmc2FkZmRzYSk7IHNlbGVjdCBmb28gZnJvbSBodXJ6OyIpCiAgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKICAgICAgICAgICAgIHJhaXNlZCA9IFRydWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmFpc2VkLCBUcnVlLCAic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFpc2VkLCBUcnVlLCAic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiIpCiAKICAgICBkZWYgQ2hlY2tDb25uZWN0aW9uRXhlY3V0ZShzZWxmKToKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoInNlbGVjdCA1IikuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDUsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCA1LCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGUiKQogCiAgICAgZGVmIENoZWNrQ29ubmVjdGlvbkV4ZWN1dGVtYW55KHNlbGYpOgogICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoZm9vKSIpCiAgICAgICAgIGNvbi5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChmb28pIHZhbHVlcyAoPykiLCBbKDMsKSwgKDQsKV0pCiAgICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKCJzZWxlY3QgZm9vIGZyb20gdGVzdCBvcmRlciBieSBmb28iKS5mZXRjaGFsbCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdFswXVswXSwgMywgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlbWFueSIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdFsxXVswXSwgNCwgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlbWFueSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzBdWzBdLCAzLCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGVtYW55IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMV1bMF0sIDQsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZW1hbnkiKQogCiAgICAgZGVmIENoZWNrQ29ubmVjdGlvbkV4ZWN1dGVzY3JpcHQoc2VsZik6CiAgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgIGNvbi5leGVjdXRlc2NyaXB0KCJjcmVhdGUgdGFibGUgdGVzdChmb28pOyBpbnNlcnQgaW50byB0ZXN0KGZvbykgdmFsdWVzICg1KTsiKQogICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgic2VsZWN0IGZvbyBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgNSwgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlc2NyaXB0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDUsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZXNjcmlwdCIpCiAKIGNsYXNzIENsb3NlZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHkKaW5kZXggMzQ1ZDViMy4uMWFkYWIyZiAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weQpAQCAtNDcsNyArNDcsNyBAQAogICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCiAKICAgICBkZWYgQ2hlY2tJc0luc3RhbmNlKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzZWxmLmNvbiwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi5jb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15Q29ubmVjdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAiY29ubmVjdGlvbiBpcyBub3QgaW5zdGFuY2Ugb2YgTXlDb25uZWN0aW9uIikKIApAQCAtNjAsNyArNjAsNyBAQAogCiAgICAgZGVmIENoZWNrSXNJbnN0YW5jZShzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKGZhY3Rvcnk9TXlDdXJzb3IpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKGN1ciwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoY3VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeUN1cnNvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAiY3Vyc29yIGlzIG5vdCBpbnN0YW5jZSBvZiBNeUN1cnNvciIpCiAKQEAgLTcyLDcgKzcyLDcgQEAKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKGZhY3Rvcnk9TXlDdXJzb3IpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgNCs1IGFzIGZvbyIpCiAgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHJvdywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uocm93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICJyb3cgaXMgbm90IGluc3RhbmNlIG9mIGRpY3QiKQogICAgICAgICBjdXIuY2xvc2UoKQpAQCAtODcsMjggKzg3LDI4IEBACiAgICAgZGVmIENoZWNrQ3VzdG9tRmFjdG9yeShzZWxmKToKICAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBsYW1iZGEgY3VyLCByb3c6IGxpc3Qocm93KQogICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSwgMiIpLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uocm93LAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShyb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgInJvdyBpcyBub3QgaW5zdGFuY2Ugb2YgbGlzdCIpCiAKICAgICBkZWYgQ2hlY2tTcWxpdGVSb3dJbmRleChzZWxmKToKICAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CiAgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDIgYXMgYiIpLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uocm93LAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShyb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZS5Sb3cpLAogICAgICAgICAgICAgICAgICAgICAgICAgInJvdyBpcyBub3QgaW5zdGFuY2Ugb2Ygc3FsaXRlLlJvdyIpCiAKICAgICAgICAgY29sMSwgY29sMiA9IHJvd1siYSJdLCByb3dbImIiXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY29sMSA9PSAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ2EnIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNvbDIgPT0gMiwgImJ5IG5hbWU6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uICdhJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2wxID09IDEsICJieSBuYW1lOiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAnYSciKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sMiA9PSAyLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ2EnIikKIAogICAgICAgICBjb2wxLCBjb2wyID0gcm93WyJBIl0sIHJvd1siQiJdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhjb2wxID09IDEsICJieSBuYW1lOiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAnQSciKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY29sMiA9PSAyLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ0InIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbDEgPT0gMSwgImJ5IG5hbWU6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uICdBJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2wyID09IDIsICJieSBuYW1lOiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAnQiciKQogCiAgICAgICAgIGNvbDEsIGNvbDIgPSByb3dbMF0sIHJvd1sxXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY29sMSA9PSAxLCAiYnkgaW5kZXg6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uIDAiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY29sMiA9PSAyLCAiYnkgaW5kZXg6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uIDEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sMSA9PSAxLCAiYnkgaW5kZXg6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uIDAiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sMiA9PSAyLCAiYnkgaW5kZXg6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uIDEiKQogCiAgICAgZGVmIENoZWNrU3FsaXRlUm93SXRlcihzZWxmKToKICAgICAgICAgIiIiQ2hlY2tzIGlmIHRoZSByb3cgb2JqZWN0IGlzIGl0ZXJhYmxlIiIiCkBAIC0xMjgsOCArMTI4LDggQEAKICAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CiAgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDIgYXMgYiIpLmZldGNob25lKCkKICAgICAgICAgZCA9IGRpY3Qocm93KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChkWyJhIl0sIHJvd1siYSJdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChkWyJiIl0sIHJvd1siYiJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbImEiXSwgcm93WyJhIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsiYiJdLCByb3dbImIiXSkKIAogICAgIGRlZiBDaGVja1NxbGl0ZVJvd0hhc2hDbXAoc2VsZik6CiAgICAgICAgICIiIkNoZWNrcyBpZiB0aGUgcm93IG9iamVjdCBjb21wYXJlcyBhbmQgaGFzaGVzIGNvcnJlY3RseSIiIgpAQCAtMTM4LDE4ICsxMzgsMTggQEAKICAgICAgICAgcm93XzIgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCiAgICAgICAgIHJvd18zID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMyBhcyBiIikuZmV0Y2hvbmUoKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyb3dfMSA9PSByb3dfMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJvd18xID09IHJvd18yKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocm93XzIgIT0gcm93XzMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyb3dfMSA9PSByb3dfMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJvd18xID09IHJvd18yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocm93XzIgIT0gcm93XzMpCiAKLSAgICAgICAgc2VsZi5mYWlsSWYocm93XzEgIT0gcm93XzEpCi0gICAgICAgIHNlbGYuZmFpbElmKHJvd18xICE9IHJvd18yKQotICAgICAgICBzZWxmLmZhaWxJZihyb3dfMiA9PSByb3dfMykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyb3dfMSAhPSByb3dfMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyb3dfMSAhPSByb3dfMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyb3dfMiA9PSByb3dfMykKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dfMSwgcm93XzIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGhhc2gocm93XzEpLCBoYXNoKHJvd18yKSkKLSAgICAgICAgc2VsZi5mYWlsSWZFcXVhbChyb3dfMSwgcm93XzMpCi0gICAgICAgIHNlbGYuZmFpbElmRXF1YWwoaGFzaChyb3dfMSksIGhhc2gocm93XzMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd18xLCByb3dfMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHJvd18xKSwgaGFzaChyb3dfMikpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocm93XzEsIHJvd18zKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGhhc2gocm93XzEpLCBoYXNoKHJvd18zKSkKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgc2VsZi5jb24uY2xvc2UoKQpAQCAtMTYxLDIxICsxNjEsMjEgQEAKICAgICBkZWYgQ2hlY2tVbmljb2RlKHNlbGYpOgogICAgICAgICBhdXN0cmlhID0gItZzdGVycmVpY2giCiAgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShyb3dbMF0pID09IHN0ciwgInR5cGUgb2Ygcm93WzBdIG11c3QgYmUgdW5pY29kZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHJvd1swXSkgPT0gc3RyLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSB1bmljb2RlIikKIAogICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKICAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gYnl0ZXMKICAgICAgICAgYXVzdHJpYSA9ICLWc3RlcnJlaWNoIgogICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChhdXN0cmlhLCkpLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUocm93WzBdKSA9PSBieXRlcywgInR5cGUgb2Ygcm93WzBdIG11c3QgYmUgYnl0ZXMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocm93WzBdID09IGF1c3RyaWEuZW5jb2RlKCJ1dGYtOCIpLCAiY29sdW1uIG11c3QgZXF1YWwgb3JpZ2luYWwgZGF0YSBpbiBVVEYtOCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHJvd1swXSkgPT0gYnl0ZXMsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIGJ5dGVzIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJvd1swXSA9PSBhdXN0cmlhLmVuY29kZSgidXRmLTgiKSwgImNvbHVtbiBtdXN0IGVxdWFsIG9yaWdpbmFsIGRhdGEgaW4gVVRGLTgiKQogCiAgICAgZGVmIENoZWNrQ3VzdG9tKHNlbGYpOgogICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBsYW1iZGEgeDogc3RyKHgsICJ1dGYtOCIsICJpZ25vcmUiKQogICAgICAgICBhdXN0cmlhID0gItZzdGVycmVpY2giCiAgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShyb3dbMF0pID09IHN0ciwgInR5cGUgb2Ygcm93WzBdIG11c3QgYmUgdW5pY29kZSIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyb3dbMF0uZW5kc3dpdGgoInJlaWNoIiksICJjb2x1bW4gbXVzdCBjb250YWluIG9yaWdpbmFsIGRhdGEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShyb3dbMF0pID09IHN0ciwgInR5cGUgb2Ygcm93WzBdIG11c3QgYmUgdW5pY29kZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyb3dbMF0uZW5kc3dpdGgoInJlaWNoIiksICJjb2x1bW4gbXVzdCBjb250YWluIG9yaWdpbmFsIGRhdGEiKQogCiAgICAgZGVmIENoZWNrT3B0aW1pemVkVW5pY29kZShzZWxmKToKICAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3FsaXRlLk9wdGltaXplZFVuaWNvZGUKQEAgLTE4Myw4ICsxODMsOCBAQAogICAgICAgICBnZXJtYW55ID0gIkRldXRjaGxhbmQiCiAgICAgICAgIGFfcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYSwpKS5mZXRjaG9uZSgpCiAgICAgICAgIGRfcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoZ2VybWFueSwpKS5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKGFfcm93WzBdKSA9PSBzdHIsICJ0eXBlIG9mIG5vbi1BU0NJSSByb3cgbXVzdCBiZSBzdHIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShkX3Jvd1swXSkgPT0gc3RyLCAidHlwZSBvZiBBU0NJSS1vbmx5IHJvdyBtdXN0IGJlIHN0ciIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGFfcm93WzBdKSA9PSBzdHIsICJ0eXBlIG9mIG5vbi1BU0NJSSByb3cgbXVzdCBiZSBzdHIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShkX3Jvd1swXSkgPT0gc3RyLCAidHlwZSBvZiBBU0NJSS1vbmx5IHJvdyBtdXN0IGJlIHN0ciIpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5CmluZGV4IGMxNWM3YmUuLmE2MTYxZmEgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weQpAQCAtMzcsNyArMzcsNyBAQAogICAgICAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIlgiLCA0MikKICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVHlwZUVycm9yIikKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyBlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAicGFyYW1ldGVyIG11c3QgYmUgY2FsbGFibGUiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0sICJwYXJhbWV0ZXIgbXVzdCBiZSBjYWxsYWJsZSIpCiAKICAgICBkZWYgQ2hlY2tDcmVhdGVDb2xsYXRpb25Ob3RBc2NpaShzZWxmKToKICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKQEAgLTc0LDcgKzc0LDcgQEAKICAgICAgICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKHNxbCkuZmV0Y2hhbGwoKQogICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciBhcyBlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLmxvd2VyKCksICJubyBzdWNoIGNvbGxhdGlvbiBzZXF1ZW5jZTogbXljb2xsIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLmxvd2VyKCksICJubyBzdWNoIGNvbGxhdGlvbiBzZXF1ZW5jZTogbXljb2xsIikKIAogICAgIGRlZiBDaGVja0NvbGxhdGlvblJlZ2lzdGVyVHdpY2Uoc2VsZik6CiAgICAgICAgICIiIgpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICAgIGNvbi5leGVjdXRlKCIiIgogICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGZvbyhhLCBiKQogICAgICAgICAgICAgIiIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocHJvZ3Jlc3NfY2FsbHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm9ncmVzc19jYWxscykKIAogCiAgICAgZGVmIENoZWNrT3Bjb2RlQ291bnQoc2VsZik6CkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBiYXIgKGEsIGIpCiAgICAgICAgICAgICAiIiIpCiAgICAgICAgIHNlY29uZF9jb3VudCA9IGxlbihwcm9ncmVzc19jYWxscykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGZpcnN0X2NvdW50ID4gc2Vjb25kX2NvdW50KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlyc3RfY291bnQgPiBzZWNvbmRfY291bnQpCiAKICAgICBkZWYgQ2hlY2tDYW5jZWxPcGVyYXRpb24oc2VsZik6CiAgICAgICAgICIiIgpAQCAtMTczLDcgKzE3Myw3IEBACiAgICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKICAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKE5vbmUsIDEpCiAgICAgICAgIGNvbi5leGVjdXRlKCJzZWxlY3QgMSB1bmlvbiBzZWxlY3QgMiB1bmlvbiBzZWxlY3QgMyIpLmZldGNoYWxsKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYWN0aW9uLCAwLCAicHJvZ3Jlc3MgaGFuZGxlciB3YXMgbm90IGNsZWFyZWQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdGlvbiwgMCwgInByb2dyZXNzIGhhbmRsZXIgd2FzIG5vdCBjbGVhcmVkIikKIAogZGVmIHN1aXRlKCk6CiAgICAgY29sbGF0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbGxhdGlvblRlc3RzLCAiQ2hlY2siKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5CmluZGV4IGQwNTZhYWUuLjJlNjFhY2YgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkKQEAgLTY1LDEwICs2NSwxMCBAQAogICAgIGRlZiBDaGVja0NvbHVtbk5hbWVXaXRoU3BhY2VzKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgnc2VsZWN0IDEgYXMgImZvbyBiYXIgW2RhdGV0aW1lXSInKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjdXIuZGVzY3JpcHRpb25bMF1bMF0sICJmb28gYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdXIuZGVzY3JpcHRpb25bMF1bMF0sICJmb28gYmFyIikKIAogICAgICAgICBjdXIuZXhlY3V0ZSgnc2VsZWN0IDEgYXMgImZvbyBiYXoiJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY3VyLmRlc2NyaXB0aW9uWzBdWzBdLCAiZm9vIGJheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3VyLmRlc2NyaXB0aW9uWzBdWzBdLCAiZm9vIGJheiIpCiAKICAgICBkZWYgQ2hlY2tTdGF0ZW1lbnRBdmFpbGFibGUoc2VsZik6CiAgICAgICAgICMgcHlzcWxpdGUgdXAgdG8gMi4zLjIgY3Jhc2hlZCBvbiB0aGlzLCBiZWNhdXNlIHRoZSBhY3RpdmUgc3RhdGVtZW50IGhhbmRsZSB3YXMgbm90IGNoZWNrZWQKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvdHJhbnNhY3Rpb25zLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHkKaW5kZXggMGI2MTkzYi4uYzlmNjEyNSAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHkKQEAgLTU4LDE0ICs1OCwxNCBAQAogICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QyKGopIikKICAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCiAgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaGFsbCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihyZXMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAxKQogCiAgICAgZGVmIENoZWNrSW5zZXJ0U3RhcnRzVHJhbnNhY3Rpb24oc2VsZik6CiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQogICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKICAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNoYWxsKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHJlcyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDApCiAKICAgICBkZWYgQ2hlY2tVcGRhdGVTdGFydHNUcmFuc2FjdGlvbihzZWxmKToKICAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKQEAgLTc0LDcgKzc0LDcgQEAKICAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoInVwZGF0ZSB0ZXN0IHNldCBpPTYiKQogICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKICAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgNSkKIAogICAgIGRlZiBDaGVja0RlbGV0ZVN0YXJ0c1RyYW5zYWN0aW9uKHNlbGYpOgogICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQpAQCAtODMsNyArODMsNyBAQAogICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCiAgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQogICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKIAogICAgIGRlZiBDaGVja1JlcGxhY2VTdGFydHNUcmFuc2FjdGlvbihzZWxmKToKICAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKQEAgLTkyLDI0ICs5MiwyNCBAQAogICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgicmVwbGFjZSBpbnRvIHRlc3QoaSkgdmFsdWVzICg2KSIpCiAgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQogICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzBdWzBdLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1swXVswXSwgNSkKIAogICAgIGRlZiBDaGVja1RvZ2dsZUF1dG9Db21taXQoc2VsZik6CiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCiAgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQogICAgICAgICBzZWxmLmNvbjEuaXNvbGF0aW9uX2xldmVsID0gTm9uZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmNvbjEuaXNvbGF0aW9uX2xldmVsLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29uMS5pc29sYXRpb25fbGV2ZWwsIE5vbmUpCiAgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQogICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKIAogICAgICAgICBzZWxmLmNvbjEuaXNvbGF0aW9uX2xldmVsID0gIkRFRkVSUkVEIgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmNvbjEuaXNvbGF0aW9uX2xldmVsICwgIkRFRkVSUkVEIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbjEuaXNvbGF0aW9uX2xldmVsICwgIkRFRkVSUkVEIikKICAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCiAgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQogICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKIAogICAgIGRlZiBDaGVja1JhaXNlVGltZW91dChzZWxmKToKICAgICAgICAgaWYgc3FsaXRlLnNxbGl0ZV92ZXJzaW9uX2luZm8gPCAoMywgMiwgMik6CmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weQppbmRleCBiZGUxNjQ1Li44YjFkNzgwIDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvdHlwZXMucHkKQEAgLTM5LDI3ICszOSwyNyBAQAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHMpIHZhbHVlcyAoPykiLCAoItZzdGVycmVpY2giLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBzIGZyb20gdGVzdCIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCAi1nN0ZXJyZWljaCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAi1nN0ZXJyZWljaCIpCiAKICAgICBkZWYgQ2hlY2tTbWFsbEludChzZWxmKToKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKDQyLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIDQyKQogCiAgICAgZGVmIENoZWNrTGFyZ2VJbnQoc2VsZik6CiAgICAgICAgIG51bSA9IDIqKjQwCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg/KSIsIChudW0sKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKICAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIG51bSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIG51bSkKIAogICAgIGRlZiBDaGVja0Zsb2F0KHNlbGYpOgogICAgICAgICB2YWwgPSAzLjE0CiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZikgdmFsdWVzICg/KSIsICh2YWwsKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGYgZnJvbSB0ZXN0IikKICAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIHZhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHZhbCkKIAogICAgIGRlZiBDaGVja0Jsb2Ioc2VsZik6CiAgICAgICAgIHNhbXBsZSA9IGIiR3VnbGh1cGYiCkBAIC02NywxMiArNjcsMTIgQEAKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChiKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYiBmcm9tIHRlc3QiKQogICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgc2FtcGxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgc2FtcGxlKQogCiAgICAgZGVmIENoZWNrVW5pY29kZUV4ZWN1dGUoc2VsZik6CiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCAn1nN0ZXJyZWljaCciKQogICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgItZzdGVycmVpY2giKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgItZzdGVycmVpY2giKQogCiBjbGFzcyBEZWNsVHlwZXNUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgY2xhc3MgRm9vOgpAQCAtMTMzLDE0ICsxMzMsMTQgQEAKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChzKSB2YWx1ZXMgKD8pIiwgKCJmb28iLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoJ3NlbGVjdCBzIGFzICJzIFtXUk9OR10iIGZyb20gdGVzdCcpCiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJmb28iKQogCiAgICAgZGVmIENoZWNrU21hbGxJbnQoc2VsZik6CiAgICAgICAgICMgZGVmYXVsdAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCAoNDIsKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKICAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgNDIpCiAKICAgICBkZWYgQ2hlY2tMYXJnZUludChzZWxmKToKICAgICAgICAgIyBkZWZhdWx0CkBAIC0xNDgsNyArMTQ4LDcgQEAKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKG51bSwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQogICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgbnVtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgbnVtKQogCiAgICAgZGVmIENoZWNrRmxvYXQoc2VsZik6CiAgICAgICAgICMgY3VzdG9tCkBAIC0xNTYsMjAgKzE1NiwyMCBAQAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGYpIHZhbHVlcyAoPykiLCAodmFsLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBmIGZyb20gdGVzdCIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCA0Ny4yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgNDcuMikKIAogICAgIGRlZiBDaGVja0Jvb2woc2VsZik6CiAgICAgICAgICMgY3VzdG9tCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYikgdmFsdWVzICg/KSIsIChGYWxzZSwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYiBmcm9tIHRlc3QiKQogICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBGYWxzZSkKIAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChiKSB2YWx1ZXMgKD8pIiwgKFRydWUsKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGIgZnJvbSB0ZXN0IikKICAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBUcnVlKQogCiAgICAgZGVmIENoZWNrVW5pY29kZShzZWxmKToKICAgICAgICAgIyBkZWZhdWx0CkBAIC0xNzcsMTQgKzE3NywxNCBAQAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHUpIHZhbHVlcyAoPykiLCAodmFsLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB1IGZyb20gdGVzdCIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCB2YWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCB2YWwpCiAKICAgICBkZWYgQ2hlY2tGb28oc2VsZik6CiAgICAgICAgIHZhbCA9IERlY2xUeXBlc1Rlc3RzLkZvbygiYmxhIikKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmb28pIHZhbHVlcyAoPykiLCAodmFsLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBmb28gZnJvbSB0ZXN0IikKICAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIHZhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHZhbCkKIAogICAgIGRlZiBDaGVja1Vuc3VwcG9ydGVkU2VxKHNlbGYpOgogICAgICAgICBjbGFzcyBCYXI6IHBhc3MKQEAgLTIxNSwyMCArMjE1LDIwIEBACiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYmluKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYmluIGZyb20gdGVzdCIpCiAgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCBzYW1wbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBzYW1wbGUpCiAKICAgICBkZWYgQ2hlY2tOdW1iZXIxKHNlbGYpOgogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG4xKSB2YWx1ZXMgKDUpIikKICAgICAgICAgdmFsdWUgPSBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgbjEgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKVswXQogICAgICAgICAjIGlmIHRoZSBjb252ZXJ0ZXIgaXMgbm90IHVzZWQsIGl0J3MgYW4gaW50IGluc3RlYWQgb2YgYSBmbG9hdAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHZhbHVlKSwgZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWx1ZSksIGZsb2F0KQogCiAgICAgZGVmIENoZWNrTnVtYmVyMihzZWxmKToKICAgICAgICAgIiIiQ2hlY2tzIHdldGhlciBjb252ZXJ0ZXIgbmFtZXMgYXJlIGN1dCBvZmYgYXQgJygnIGNoYXJhY3RlcnMiIiIKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuMikgdmFsdWVzICg1KSIpCiAgICAgICAgIHZhbHVlID0gc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IG4yIGZyb20gdGVzdCIpLmZldGNob25lKClbMF0KICAgICAgICAgIyBpZiB0aGUgY29udmVydGVyIGlzIG5vdCB1c2VkLCBpdCdzIGFuIGludCBpbnN0ZWFkIG9mIGEgZmxvYXQKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWx1ZSksIGZsb2F0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsdWUpLCBmbG9hdCkKIAogY2xhc3MgQ29sTmFtZXNUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtMjU3LDI4ICsyNTcsMjggQEAKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh4KSB2YWx1ZXMgKD8pIiwgKCJ4eHgiLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB4IGZyb20gdGVzdCIpCiAgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAieHh4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsICJ4eHgiKQogCiAgICAgZGVmIENoZWNrTm9uZShzZWxmKToKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh4KSB2YWx1ZXMgKD8pIiwgKE5vbmUsKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHggZnJvbSB0ZXN0IikKICAgICAgICAgdmFsID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCBOb25lKQogCiAgICAgZGVmIENoZWNrQ29sTmFtZShzZWxmKToKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh4KSB2YWx1ZXMgKD8pIiwgKCJ4eHgiLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoJ3NlbGVjdCB4IGFzICJ4IFtiYXJdIiBmcm9tIHRlc3QnKQogICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgIjx4eHg+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsICI8eHh4PiIpCiAKICAgICAgICAgIyBDaGVjayBpZiB0aGUgc3RyaXBwaW5nIG9mIGNvbG5hbWVzIHdvcmtzLiBFdmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdAogICAgICAgICAjIHdoaXRlc3BhY2Ugc2hvdWxkIGJlIHN0cmlwcGVkLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN1ci5kZXNjcmlwdGlvblswXVswXSwgIngiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3VyLmRlc2NyaXB0aW9uWzBdWzBdLCAieCIpCiAKICAgICBkZWYgQ2hlY2tDYXNlSW5Db252ZXJ0ZXJOYW1lKHNlbGYpOgogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgJ290aGVyJyBhcyBcInggW2IxYjFdXCIiKQogICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgIk1BUktFUiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAiTUFSS0VSIikKIAogICAgIGRlZiBDaGVja0N1cnNvckRlc2NyaXB0aW9uTm9Sb3coc2VsZik6CiAgICAgICAgICIiIgpAQCAtMzEwLDcgKzMxMCw3IEBACiAgICAgZGVmIENoZWNrQ2FzdGVySXNVc2VkKHNlbGYpOgogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgPyIsICg0LCkpCiAgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBmbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIGZsb2F0KQogCiBjbGFzcyBCaW5hcnlDb252ZXJ0ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIGNvbnZlcnQocyk6CkBAIC0zMjcsNyArMzI3LDcgQEAKICAgICBkZWYgQ2hlY2tCaW5hcnlJbnB1dEZvckNvbnZlcnRlcihzZWxmKToKICAgICAgICAgdGVzdGRhdGEgPSBiImFiY2RlZmciICogMTAKICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb24uZXhlY3V0ZSgnc2VsZWN0ID8gYXMgInggW2Jpbl0iJywgKG1lbW9yeXZpZXcoemxpYi5jb21wcmVzcyh0ZXN0ZGF0YSkpLCkpLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodGVzdGRhdGEsIHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0ZGF0YSwgcmVzdWx0KQogCiBjbGFzcyBEYXRlVGltZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6CkBAIC0zNDQsMTQgKzM0NCwxNCBAQAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGQpIHZhbHVlcyAoPykiLCAoZCwpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZCBmcm9tIHRlc3QiKQogICAgICAgICBkMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZCwgZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZDIpCiAKICAgICBkZWYgQ2hlY2tTcWxpdGVUaW1lc3RhbXAoc2VsZik6CiAgICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcCgyMDA0LCAyLCAxNCwgNywgMTUsIDApCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodHMpIHZhbHVlcyAoPykiLCAodHMsKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHRzIGZyb20gdGVzdCIpCiAgICAgICAgIHRzMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHMsIHRzMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cywgdHMyKQogCiAgICAgZGVmIENoZWNrU3FsVGltZXN0YW1wKHNlbGYpOgogICAgICAgICAjIFRoZSBkYXRlIGZ1bmN0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgaW4gU1FMaXRlIHZlcnNpb24gMy4xIG9yIGxhdGVyCkBAIC0zNjMsMjIgKzM2MywyMiBAQAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKGN1cnJlbnRfdGltZXN0YW1wKSIpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQogICAgICAgICB0cyA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh0cyksIGRhdGV0aW1lLmRhdGV0aW1lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0cy55ZWFyLCBub3cueWVhcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHRzKSwgZGF0ZXRpbWUuZGF0ZXRpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMueWVhciwgbm93LnllYXIpCiAKICAgICBkZWYgQ2hlY2tEYXRlVGltZVN1YlNlY29uZHMoc2VsZik6CiAgICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcCgyMDA0LCAyLCAxNCwgNywgMTUsIDAsIDUwMDAwMCkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh0cykgdmFsdWVzICg/KSIsICh0cywpKQogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgdHMgZnJvbSB0ZXN0IikKICAgICAgICAgdHMyID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0cywgdHMyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLCB0czIpCiAKICAgICBkZWYgQ2hlY2tEYXRlVGltZVN1YlNlY29uZHNGbG9hdGluZ1BvaW50KHNlbGYpOgogICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXAoMjAwNCwgMiwgMTQsIDcsIDE1LCAwLCA1MTAyNDEpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodHMpIHZhbHVlcyAoPykiLCAodHMsKSkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHRzIGZyb20gdGVzdCIpCiAgICAgICAgIHRzMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHMsIHRzMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cywgdHMyKQogCiBkZWYgc3VpdGUoKToKICAgICBzcWxpdGVfdHlwZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShTcWxpdGVUeXBlVGVzdHMsICJDaGVjayIpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHkgYi9MaWIvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHkKaW5kZXggYzE2NTQyMy4uOGJmYzU5MSAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weQpAQCAtMTYxLDI4ICsxNjEsMjggQEAKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm50ZXh0KCkiKQogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHZhbCksIHN0cikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsICJmb28iKQogCiAgICAgZGVmIENoZWNrRnVuY1JldHVyblVuaWNvZGUoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJudW5pY29kZSgpIikKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBzdHIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgImJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAiYmFyIikKIAogICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5JbnQoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuaW50KCkiKQogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHZhbCksIGludCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDQyKQogCiAgICAgZGVmIENoZWNrRnVuY1JldHVybkZsb2F0KHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmZsb2F0KCkiKQogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHZhbCksIGZsb2F0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsKSwgZmxvYXQpCiAgICAgICAgIGlmIHZhbCA8IDMuMTM5IG9yIHZhbCA+IDMuMTQxOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyB2YWx1ZSIpCiAKQEAgLTE5MCwxNSArMTkwLDE1IEBACiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJubnVsbCgpIikKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCB0eXBlKE5vbmUpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCB0eXBlKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgTm9uZSkKIAogICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5CbG9iKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmJsb2IoKSIpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgYnl0ZXMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgYiJibG9iIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIGJ5dGVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgYiJibG9iIikKIAogICAgIGRlZiBDaGVja0Z1bmNFeGNlcHRpb24oc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCkBAIC0yMDcsMzcgKzIwNywzNyBAQAogICAgICAgICAgICAgY3VyLmZldGNob25lKCkKICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IgYXMgZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgJ3VzZXItZGVmaW5lZCBmdW5jdGlvbiByYWlzZWQgZXhjZXB0aW9uJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAndXNlci1kZWZpbmVkIGZ1bmN0aW9uIHJhaXNlZCBleGNlcHRpb24nKQogCiAgICAgZGVmIENoZWNrUGFyYW1TdHJpbmcoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNzdHJpbmcoPykiLCAoImZvbyIsKSkKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKIAogICAgIGRlZiBDaGVja1BhcmFtSW50KHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzaW50KD8pIiwgKDQyLCkpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCiAKICAgICBkZWYgQ2hlY2tQYXJhbUZsb2F0KHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzZmxvYXQoPykiLCAoMy4xNCwpKQogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQogCiAgICAgZGVmIENoZWNrUGFyYW1Ob25lKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzbm9uZSg/KSIsIChOb25lLCkpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCiAKICAgICBkZWYgQ2hlY2tQYXJhbUJsb2Ioc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNibG9iKD8pIiwgKG1lbW9yeXZpZXcoYiJibG9iIiksKSkKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKIAogY2xhc3MgQWdncmVnYXRlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKQEAgLTI4MSw3ICsyODEsNyBAQAogICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBub3N0ZXAodCkgZnJvbSB0ZXN0IikKICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIEF0dHJpYnV0ZUVycm9yIikKICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yIGFzIGU6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICInQWdnck5vU3RlcCcgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ3N0ZXAnIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAiJ0FnZ3JOb1N0ZXAnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdzdGVwJyIpCiAKICAgICBkZWYgQ2hlY2tBZ2dyTm9GaW5hbGl6ZShzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKQEAgLTI5MCw3ICsyOTAsNyBAQAogICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IgYXMgZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnZmluYWxpemUnIG1ldGhvZCByYWlzZWQgZXJyb3IiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ2ZpbmFsaXplJyBtZXRob2QgcmFpc2VkIGVycm9yIikKIAogICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JbkluaXQoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCkBAIC0yOTksNyArMjk5LDcgQEAKICAgICAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKICAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yIGFzIGU6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ19faW5pdF9fJyBtZXRob2QgcmFpc2VkIGVycm9yIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdfX2luaXRfXycgbWV0aG9kIHJhaXNlZCBlcnJvciIpCiAKICAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5TdGVwKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQpAQCAtMzA4LDcgKzMwOCw3IEBACiAgICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciBhcyBlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdzdGVwJyBtZXRob2QgcmFpc2VkIGVycm9yIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdzdGVwJyBtZXRob2QgcmFpc2VkIGVycm9yIikKIAogICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JbkZpbmFsaXplKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQpAQCAtMzE3LDM3ICszMTcsMzcgQEAKICAgICAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKICAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yIGFzIGU6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ2ZpbmFsaXplJyBtZXRob2QgcmFpc2VkIGVycm9yIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdmaW5hbGl6ZScgbWV0aG9kIHJhaXNlZCBlcnJvciIpCiAKICAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbVN0cihzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ3N0cicsID8pIiwgKCJmb28iLCkpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCiAKICAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUludChzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ2ludCcsID8pIiwgKDQyLCkpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCiAKICAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUZsb2F0KHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnZmxvYXQnLCA/KSIsICgzLjE0LCkpCiAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCiAKICAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbU5vbmUoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdOb25lJywgPykiLCAoTm9uZSwpKQogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQogCiAgICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1CbG9iKHNlbGYpOgogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnYmxvYicsID8pIiwgKG1lbW9yeXZpZXcoYiJibG9iIiksKSkKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKIAogICAgIGRlZiBDaGVja0FnZ3JDaGVja0FnZ3JTdW0oc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCkBAIC0zNTUsNyArMzU1LDcgQEAKICAgICAgICAgY3VyLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCBbKDEwLCksICgyMCwpLCAoMzAsKV0pCiAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgbXlzdW0oaSkgZnJvbSB0ZXN0IikKICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCA2MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDYwKQogCiBkZWYgYXV0aG9yaXplcl9jYihhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgc291cmNlKToKICAgICBpZiBhY3Rpb24gIT0gc3FsaXRlLlNRTElURV9TRUxFQ1Q6Cg==