IyAtKi0gY29kaW5nOiBpc28tODg1OS0xNSAtKi0KCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCBzaHV0aWwKaW1wb3J0IFN0cmluZ0lPCmZyb20gaGFzaGxpYiBpbXBvcnQgbWQ1CmltcG9ydCBlcnJubwoKaW1wb3J0IHVuaXR0ZXN0CmltcG9ydCB0YXJmaWxlCgpmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoKIyBDaGVjayBmb3Igb3VyIGNvbXByZXNzaW9uIG1vZHVsZXMuCnRyeToKICAgIGltcG9ydCBnemlwCiAgICBnemlwLkd6aXBGaWxlCmV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgIGd6aXAgPSBOb25lCnRyeToKICAgIGltcG9ydCBiejIKZXhjZXB0IEltcG9ydEVycm9yOgogICAgYnoyID0gTm9uZQoKZGVmIG1kNXN1bShkYXRhKToKICAgIHJldHVybiBtZDUoZGF0YSkuaGV4ZGlnZXN0KCkKClRFTVBESVIgPSBvcy5wYXRoLmFic3BhdGgodGVzdF9zdXBwb3J0LlRFU1RGTikKdGFybmFtZSA9IHRlc3Rfc3VwcG9ydC5maW5kZmlsZSgidGVzdHRhci50YXIiKQpnemlwbmFtZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHRhci50YXIuZ3oiKQpiejJuYW1lID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0dGFyLnRhci5iejIiKQp0bXBuYW1lID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0bXAudGFyIikKCm1kNV9yZWd0eXBlID0gIjY1ZjQ3N2M4MThhZDllMTVmN2ZlYWIwYzZkMzc3NDJmIgptZDVfc3BhcnNlID0gImE1NGZiYzRjYTRmNDM5OWE5MGUxYjI3MTY0MDEyZmM2IgoKCmNsYXNzIFJlYWRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKCiAgICB0YXJuYW1lID0gdGFybmFtZQogICAgbW9kZSA9ICJyOiIKCiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCBtb2RlPXNlbGYubW9kZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHNlbGYudGFyLmNsb3NlKCkKCgpjbGFzcyBVc3RhclJlYWRUZXN0KFJlYWRUZXN0KToKCiAgICBkZWYgdGVzdF9maWxlb2JqX3JlZ3VsYXJfZmlsZShzZWxmKToKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKICAgICAgICBmb2JqID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKICAgICAgICBzZWxmLmFzc2VydFRydWUoKGxlbihkYXRhKSwgbWQ1c3VtKGRhdGEpKSA9PSAodGFyaW5mby5zaXplLCBtZDVfcmVndHlwZSksCiAgICAgICAgICAgICAgICAicmVndWxhciBmaWxlIGV4dHJhY3Rpb24gZmFpbGVkIikKCiAgICBkZWYgdGVzdF9maWxlb2JqX3JlYWRsaW5lcyhzZWxmKToKICAgICAgICBzZWxmLnRhci5leHRyYWN0KCJ1c3Rhci9yZWd0eXBlIiwgVEVNUERJUikKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKICAgICAgICBmb2JqMSA9IG9wZW4ob3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9yZWd0eXBlIiksICJyVSIpCiAgICAgICAgZm9iajIgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQoKICAgICAgICBsaW5lczEgPSBmb2JqMS5yZWFkbGluZXMoKQogICAgICAgIGxpbmVzMiA9IGZvYmoyLnJlYWRsaW5lcygpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzMSA9PSBsaW5lczIsCiAgICAgICAgICAgICAgICAiZmlsZW9iai5yZWFkbGluZXMoKSBmYWlsZWQiKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obGluZXMyKSA9PSAxMTQsCiAgICAgICAgICAgICAgICAiZmlsZW9iai5yZWFkbGluZXMoKSBmYWlsZWQiKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaW5lczJbODNdID09CiAgICAgICAgICAgICAgICAiSSB3aWxsIGdsYWRseSBhZG1pdCB0aGF0IFB5dGhvbiBpcyBub3QgdGhlIGZhc3Rlc3QgcnVubmluZyBzY3JpcHRpbmcgbGFuZ3VhZ2UuXG4iLAogICAgICAgICAgICAgICAgImZpbGVvYmoucmVhZGxpbmVzKCkgZmFpbGVkIikKCiAgICBkZWYgdGVzdF9maWxlb2JqX2l0ZXIoc2VsZik6CiAgICAgICAgc2VsZi50YXIuZXh0cmFjdCgidXN0YXIvcmVndHlwZSIsIFRFTVBESVIpCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpCiAgICAgICAgZm9iajEgPSBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvcmVndHlwZSIpLCAiclUiKQogICAgICAgIGZvYmoyID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKICAgICAgICBsaW5lczEgPSBmb2JqMS5yZWFkbGluZXMoKQogICAgICAgIGxpbmVzMiA9IFtsaW5lIGZvciBsaW5lIGluIGZvYmoyXQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaW5lczEgPT0gbGluZXMyLAogICAgICAgICAgICAgICAgICAgICAiZmlsZW9iai5fX2l0ZXJfXygpIGZhaWxlZCIpCgogICAgZGVmIHRlc3RfZmlsZW9ial9zZWVrKHNlbGYpOgogICAgICAgIHNlbGYudGFyLmV4dHJhY3QoInVzdGFyL3JlZ3R5cGUiLCBURU1QRElSKQogICAgICAgIGZvYmogPSBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvcmVndHlwZSIpLCAicmIiKQogICAgICAgIGRhdGEgPSBmb2JqLnJlYWQoKQogICAgICAgIGZvYmouY2xvc2UoKQoKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKICAgICAgICBmb2JqID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKCiAgICAgICAgdGV4dCA9IGZvYmoucmVhZCgpCiAgICAgICAgZm9iai5zZWVrKDApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPT0gZm9iai50ZWxsKCksCiAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gZmlsZSdzIHN0YXJ0IGZhaWxlZCIpCiAgICAgICAgZm9iai5zZWVrKDIwNDgsIDApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIwNDggPT0gZm9iai50ZWxsKCksCiAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gYWJzb2x1dGUgcG9zaXRpb24gZmFpbGVkIikKICAgICAgICBmb2JqLnNlZWsoLTEwMjQsIDEpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDEwMjQgPT0gZm9iai50ZWxsKCksCiAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gbmVnYXRpdmUgcmVsYXRpdmUgcG9zaXRpb24gZmFpbGVkIikKICAgICAgICBmb2JqLnNlZWsoMTAyNCwgMSkKICAgICAgICBzZWxmLmFzc2VydFRydWUoMjA0OCA9PSBmb2JqLnRlbGwoKSwKICAgICAgICAgICAgICAgICAgICAgInNlZWsoKSB0byBwb3NpdGl2ZSByZWxhdGl2ZSBwb3NpdGlvbiBmYWlsZWQiKQogICAgICAgIHMgPSBmb2JqLnJlYWQoMTApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMgPT0gZGF0YVsyMDQ4OjIwNThdLAogICAgICAgICAgICAgICAgICAgICAicmVhZCgpIGFmdGVyIHNlZWsgZmFpbGVkIikKICAgICAgICBmb2JqLnNlZWsoMCwgMikKICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby5zaXplID09IGZvYmoudGVsbCgpLAogICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIGZpbGUncyBlbmQgZmFpbGVkIikKICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9iai5yZWFkKCkgPT0gIiIsCiAgICAgICAgICAgICAgICAgICAgICJyZWFkKCkgYXQgZmlsZSdzIGVuZCBkaWQgbm90IHJldHVybiBlbXB0eSBzdHJpbmciKQogICAgICAgIGZvYmouc2VlaygtdGFyaW5mby5zaXplLCAyKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwID09IGZvYmoudGVsbCgpLAogICAgICAgICAgICAgICAgICAgICAicmVsYXRpdmUgc2VlaygpIHRvIGZpbGUncyBzdGFydCBmYWlsZWQiKQogICAgICAgIGZvYmouc2Vlayg1MTIpCiAgICAgICAgczEgPSBmb2JqLnJlYWRsaW5lcygpCiAgICAgICAgZm9iai5zZWVrKDUxMikKICAgICAgICBzMiA9IGZvYmoucmVhZGxpbmVzKCkKICAgICAgICBzZWxmLmFzc2VydFRydWUoczEgPT0gczIsCiAgICAgICAgICAgICAgICAgICAgICJyZWFkbGluZXMoKSBhZnRlciBzZWVrIGZhaWxlZCIpCiAgICAgICAgZm9iai5zZWVrKDApCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihmb2JqLnJlYWRsaW5lKCkpID09IGZvYmoudGVsbCgpLAogICAgICAgICAgICAgICAgICAgICAidGVsbCgpIGFmdGVyIHJlYWRsaW5lKCkgZmFpbGVkIikKICAgICAgICBmb2JqLnNlZWsoNTEyKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZm9iai5yZWFkbGluZSgpKSArIDUxMiA9PSBmb2JqLnRlbGwoKSwKICAgICAgICAgICAgICAgICAgICAgInRlbGwoKSBhZnRlciBzZWVrKCkgYW5kIHJlYWRsaW5lKCkgZmFpbGVkIikKICAgICAgICBmb2JqLnNlZWsoMCkKICAgICAgICBsaW5lID0gZm9iai5yZWFkbGluZSgpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvYmoucmVhZCgpID09IGRhdGFbbGVuKGxpbmUpOl0sCiAgICAgICAgICAgICAgICAgICAgICJyZWFkKCkgYWZ0ZXIgcmVhZGxpbmUoKSBmYWlsZWQiKQogICAgICAgIGZvYmouY2xvc2UoKQoKICAgICMgVGVzdCBpZiBzeW1ib2xpYyBhbmQgaGFyZCBsaW5rcyBhcmUgcmVzb2x2ZWQgYnkgZXh0cmFjdGZpbGUoKS4gIFRoZQogICAgIyB0ZXN0IGxpbmsgbWVtYmVycyBlYWNoIHBvaW50IHRvIGEgcmVndWxhciBtZW1iZXIgd2hvc2UgZGF0YSBpcwogICAgIyBzdXBwb3NlZCB0byBiZSBleHBvcnRlZC4KICAgIGRlZiBfdGVzdF9maWxlb2JqX2xpbmsoc2VsZiwgbG5rdHlwZSwgcmVndHlwZSk6CiAgICAgICAgYSA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKGxua3R5cGUpCiAgICAgICAgYiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHJlZ3R5cGUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLm5hbWUsIGIubmFtZSkKCiAgICBkZWYgdGVzdF9maWxlb2JqX2xpbmsxKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfZmlsZW9ial9saW5rKCJ1c3Rhci9sbmt0eXBlIiwgInVzdGFyL3JlZ3R5cGUiKQoKICAgIGRlZiB0ZXN0X2ZpbGVvYmpfbGluazIoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF9maWxlb2JqX2xpbmsoIi4vdXN0YXIvbGlua3Rlc3QyL2xua3R5cGUiLCAidXN0YXIvbGlua3Rlc3QxL3JlZ3R5cGUiKQoKICAgIGRlZiB0ZXN0X2ZpbGVvYmpfc3ltbGluazEoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF9maWxlb2JqX2xpbmsoInVzdGFyL3N5bXR5cGUiLCAidXN0YXIvcmVndHlwZSIpCgogICAgZGVmIHRlc3RfZmlsZW9ial9zeW1saW5rMihzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2ZpbGVvYmpfbGluaygiLi91c3Rhci9saW5rdGVzdDIvc3ltdHlwZSIsICJ1c3Rhci9saW5rdGVzdDEvcmVndHlwZSIpCgogICAgZGVmIHRlc3RfaXNzdWUxNDE2MChzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2ZpbGVvYmpfbGluaygic3ltdHlwZTIiLCAidXN0YXIvcmVndHlwZSIpCgoKY2xhc3MgQ29tbW9uUmVhZFRlc3QoUmVhZFRlc3QpOgoKICAgIGRlZiB0ZXN0X2VtcHR5X3RhcmZpbGUoc2VsZik6CiAgICAgICAgIyBUZXN0IGZvciBpc3N1ZTYxMjM6IEFsbG93IG9wZW5pbmcgZW1wdHkgYXJjaGl2ZXMuCiAgICAgICAgIyBUaGlzIHRlc3QgY2hlY2tzIGlmIHRhcmZpbGUub3BlbigpIGlzIGFibGUgdG8gb3BlbiBhbiBlbXB0eSB0YXIKICAgICAgICAjIGFyY2hpdmUgc3VjY2Vzc2Z1bGx5LiBOb3RlIHRoYXQgYW4gZW1wdHkgdGFyIGFyY2hpdmUgaXMgbm90IHRoZQogICAgICAgICMgc2FtZSBhcyBhbiBlbXB0eSBmaWxlIQogICAgICAgIHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUucmVwbGFjZSgiciIsICJ3IikpLmNsb3NlKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCiAgICAgICAgICAgIHRhci5nZXRuYW1lcygpCiAgICAgICAgZXhjZXB0IHRhcmZpbGUuUmVhZEVycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoInRhcmZpbGUub3BlbigpIGZhaWxlZCBvbiBlbXB0eSBhcmNoaXZlIikKICAgICAgICBzZWxmLmFzc2VydExpc3RFcXVhbCh0YXIuZ2V0bWVtYmVycygpLCBbXSkKCiAgICBkZWYgdGVzdF9udWxsX3RhcmZpbGUoc2VsZik6CiAgICAgICAgIyBUZXN0IGZvciBpc3N1ZTYxMjM6IEFsbG93IG9wZW5pbmcgZW1wdHkgYXJjaGl2ZXMuCiAgICAgICAgIyBUaGlzIHRlc3QgZ3VhcmFudGVlcyB0aGF0IHRhcmZpbGUub3BlbigpIGRvZXMgbm90IHRyZWF0IGFuIGVtcHR5CiAgICAgICAgIyBmaWxlIGFzIGFuIGVtcHR5IHRhciBhcmNoaXZlLgogICAgICAgIG9wZW4odG1wbmFtZSwgIndiIikuY2xvc2UoKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRtcG5hbWUsIHNlbGYubW9kZSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0bXBuYW1lKQoKICAgIGRlZiB0ZXN0X2lnbm9yZV96ZXJvcyhzZWxmKToKICAgICAgICAjIFRlc3QgVGFyRmlsZSdzIGlnbm9yZV96ZXJvcyBvcHRpb24uCiAgICAgICAgaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCI6Z3oiKToKICAgICAgICAgICAgX29wZW4gPSBnemlwLkd6aXBGaWxlCiAgICAgICAgZWxpZiBzZWxmLm1vZGUuZW5kc3dpdGgoIjpiejIiKToKICAgICAgICAgICAgX29wZW4gPSBiejIuQloyRmlsZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9vcGVuID0gb3BlbgoKICAgICAgICBmb3IgY2hhciBpbiAoJ1wwJywgJ2EnKToKICAgICAgICAgICAgIyBUZXN0IGlmIEVPRkhlYWRlckVycm9yICgnXDAnKSBhbmQgSW52YWxpZEhlYWRlckVycm9yICgnYScpCiAgICAgICAgICAgICMgYXJlIGlnbm9yZWQgY29ycmVjdGx5LgogICAgICAgICAgICBmb2JqID0gX29wZW4odG1wbmFtZSwgIndiIikKICAgICAgICAgICAgZm9iai53cml0ZShjaGFyICogMTAyNCkKICAgICAgICAgICAgZm9iai53cml0ZSh0YXJmaWxlLlRhckluZm8oImZvbyIpLnRvYnVmKCkpCiAgICAgICAgICAgIGZvYmouY2xvc2UoKQoKICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIG1vZGU9InIiLCBpZ25vcmVfemVyb3M9VHJ1ZSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXF1YWwodGFyLmdldG5hbWVzKCksIFsiZm9vIl0sCiAgICAgICAgICAgICAgICAgICAgImlnbm9yZV96ZXJvcz1UcnVlIHNob3VsZCBoYXZlIHNraXBwZWQgdGhlICVyLWJsb2NrcyIgJSBjaGFyKQogICAgICAgICAgICB0YXIuY2xvc2UoKQoKCmNsYXNzIE1pc2NSZWFkVGVzdChDb21tb25SZWFkVGVzdCk6CgogICAgZGVmIHRlc3Rfbm9fbmFtZV9hcmd1bWVudChzZWxmKToKICAgICAgICBmb2JqID0gb3BlbihzZWxmLnRhcm5hbWUsICJyYiIpCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKGZpbGVvYmo9Zm9iaiwgbW9kZT1zZWxmLm1vZGUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIubmFtZSwgb3MucGF0aC5hYnNwYXRoKGZvYmoubmFtZSkpCgogICAgZGVmIHRlc3Rfbm9fbmFtZV9hdHRyaWJ1dGUoc2VsZik6CiAgICAgICAgZGF0YSA9IG9wZW4oc2VsZi50YXJuYW1lLCAicmIiKS5yZWFkKCkKICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZ2V0YXR0ciwgZm9iaiwgIm5hbWUiKQogICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihmaWxlb2JqPWZvYmosIG1vZGU9c2VsZi5tb2RlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLm5hbWUsIE5vbmUpCgogICAgZGVmIHRlc3RfZW1wdHlfbmFtZV9hdHRyaWJ1dGUoc2VsZik6CiAgICAgICAgZGF0YSA9IG9wZW4oc2VsZi50YXJuYW1lLCAicmIiKS5yZWFkKCkKICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkKICAgICAgICBmb2JqLm5hbWUgPSAiIgogICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihmaWxlb2JqPWZvYmosIG1vZGU9c2VsZi5tb2RlKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLm5hbWUsIE5vbmUpCgogICAgZGVmIHRlc3RfZmlsZW9ial93aXRoX29mZnNldChzZWxmKToKICAgICAgICAjIFNraXAgdGhlIGZpcnN0IG1lbWJlciBhbmQgc3RvcmUgdmFsdWVzIGZyb20gdGhlIHNlY29uZCBtZW1iZXIKICAgICAgICAjIG9mIHRoZSB0ZXN0dGFyLgogICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsIG1vZGU9c2VsZi5tb2RlKQogICAgICAgIHRhci5uZXh0KCkKICAgICAgICB0ID0gdGFyLm5leHQoKQogICAgICAgIG5hbWUgPSB0Lm5hbWUKICAgICAgICBvZmZzZXQgPSB0Lm9mZnNldAogICAgICAgIGRhdGEgPSB0YXIuZXh0cmFjdGZpbGUodCkucmVhZCgpCiAgICAgICAgdGFyLmNsb3NlKCkKCiAgICAgICAgIyBPcGVuIHRoZSB0ZXN0dGFyIGFuZCBzZWVrIHRvIHRoZSBvZmZzZXQgb2YgdGhlIHNlY29uZCBtZW1iZXIuCiAgICAgICAgaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCI6Z3oiKToKICAgICAgICAgICAgX29wZW4gPSBnemlwLkd6aXBGaWxlCiAgICAgICAgZWxpZiBzZWxmLm1vZGUuZW5kc3dpdGgoIjpiejIiKToKICAgICAgICAgICAgX29wZW4gPSBiejIuQloyRmlsZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9vcGVuID0gb3BlbgogICAgICAgIGZvYmogPSBfb3BlbihzZWxmLnRhcm5hbWUsICJyYiIpCiAgICAgICAgZm9iai5zZWVrKG9mZnNldCkKCiAgICAgICAgIyBUZXN0IGlmIHRoZSB0YXJmaWxlIHN0YXJ0cyB3aXRoIHRoZSBzZWNvbmQgbWVtYmVyLgogICAgICAgIHRhciA9IHRhci5vcGVuKHNlbGYudGFybmFtZSwgbW9kZT0icjoiLCBmaWxlb2JqPWZvYmopCiAgICAgICAgdCA9IHRhci5uZXh0KCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubmFtZSwgbmFtZSkKICAgICAgICAjIFJlYWQgdG8gdGhlIGVuZCBvZiBmaWxlb2JqIGFuZCB0ZXN0IGlmIHNlZWtpbmcgYmFjayB0byB0aGUKICAgICAgICAjIGJlZ2lubmluZyB3b3Jrcy4KICAgICAgICB0YXIuZ2V0bWVtYmVycygpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZXh0cmFjdGZpbGUodCkucmVhZCgpLCBkYXRhLAogICAgICAgICAgICAgICAgInNlZWsgYmFjayBkaWQgbm90IHdvcmsiKQogICAgICAgIHRhci5jbG9zZSgpCgogICAgZGVmIHRlc3RfZmFpbF9jb21wKHNlbGYpOgogICAgICAgICMgRm9yIEd6aXAgYW5kIEJ6MiBUZXN0czogZmFpbCB3aXRoIGEgUmVhZEVycm9yIG9uIGFuIHVuY29tcHJlc3NlZCBmaWxlLgogICAgICAgIGlmIHNlbGYubW9kZSA9PSAicjoiOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0YXJuYW1lLCBzZWxmLm1vZGUpCiAgICAgICAgZm9iaiA9IG9wZW4odGFybmFtZSwgInJiIikKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBmaWxlb2JqPWZvYmosIG1vZGU9c2VsZi5tb2RlKQoKICAgIGRlZiB0ZXN0X3Y3X2RpcnR5cGUoc2VsZik6CiAgICAgICAgIyBUZXN0IG9sZCBzdHlsZSBkaXJ0eXBlIG1lbWJlciAoYnVnICMxMzM2NjIzKToKICAgICAgICAjIE9sZCBWNyB0YXJzIGNyZWF0ZSBkaXJlY3RvcnkgbWVtYmVycyB1c2luZyBhbiBBUkVHVFlQRQogICAgICAgICMgaGVhZGVyIHdpdGggYSAiLyIgYXBwZW5kZWQgdG8gdGhlIGZpbGVuYW1lIGZpZWxkLgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoIm1pc2MvZGlydHlwZS1vbGQtdjciKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5ESVJUWVBFLAogICAgICAgICAgICAgICAgInY3IGRpcnR5cGUgZmFpbGVkIikKCiAgICBkZWYgdGVzdF94c3Rhcl90eXBlKHNlbGYpOgogICAgICAgICMgVGhlIHhzdGFyIGZvcm1hdCBzdG9yZXMgZXh0cmEgYXRpbWUgYW5kIGN0aW1lIGZpZWxkcyBpbnNpZGUgdGhlCiAgICAgICAgIyBzcGFjZSByZXNlcnZlZCBmb3IgdGhlIHByZWZpeCBmaWVsZC4gVGhlIHByZWZpeCBmaWVsZCBtdXN0IGJlCiAgICAgICAgIyBpZ25vcmVkIGluIHRoaXMgY2FzZSwgb3RoZXJ3aXNlIGl0IHdpbGwgbWVzcyB1cCB0aGUgbmFtZS4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYudGFyLmdldG1lbWJlcigibWlzYy9yZWd0eXBlLXhzdGFyIikKICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiZmFpbGVkIHRvIGZpbmQgbWlzYy9yZWd0eXBlLXhzdGFyIChtYW5nbGVkIHByZWZpeD8pIikKCiAgICBkZWYgdGVzdF9jaGVja19tZW1iZXJzKHNlbGYpOgogICAgICAgIGZvciB0YXJpbmZvIGluIHNlbGYudGFyOgogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50KHRhcmluZm8ubXRpbWUpID09IDA3NjA2MTM2NjE3LAogICAgICAgICAgICAgICAgICAgICJ3cm9uZyBtdGltZSBmb3IgJXMiICUgdGFyaW5mby5uYW1lKQogICAgICAgICAgICBpZiBub3QgdGFyaW5mby5uYW1lLnN0YXJ0c3dpdGgoInVzdGFyLyIpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8udW5hbWUgPT0gInRhcmZpbGUiLAogICAgICAgICAgICAgICAgICAgICJ3cm9uZyB1bmFtZSBmb3IgJXMiICUgdGFyaW5mby5uYW1lKQoKICAgIGRlZiB0ZXN0X2ZpbmRfbWVtYmVycyhzZWxmKToKICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50YXIuZ2V0bWVtYmVycygpWy0xXS5uYW1lID09ICJtaXNjL2VvZiIsCiAgICAgICAgICAgICAgICAiY291bGQgbm90IGZpbmQgYWxsIG1lbWJlcnMiKQoKICAgIGRlZiB0ZXN0X2V4dHJhY3RfaGFyZGxpbmsoc2VsZik6CiAgICAgICAgIyBUZXN0IGhhcmRsaW5rIGV4dHJhY3Rpb24gKGUuZy4gYnVnICM4NTcyOTcpLgogICAgICAgIHdpdGggdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVycm9ybGV2ZWw9MSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpIGFzIHRhcjoKICAgICAgICAgICAgdGFyLmV4dHJhY3QoInVzdGFyL3JlZ3R5cGUiLCBURU1QRElSKQogICAgICAgICAgICBzZWxmLmFkZENsZWFudXAob3MucmVtb3ZlLCBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL3JlZ3R5cGUiKSkKCiAgICAgICAgICAgIHRhci5leHRyYWN0KCJ1c3Rhci9sbmt0eXBlIiwgVEVNUERJUikKICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnJlbW92ZSwgb3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9sbmt0eXBlIikpCiAgICAgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL2xua3R5cGUiKSwgInJiIikgYXMgZjoKICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1kNXN1bShkYXRhKSwgbWQ1X3JlZ3R5cGUpCgogICAgICAgICAgICB0YXIuZXh0cmFjdCgidXN0YXIvc3ltdHlwZSIsIFRFTVBESVIpCiAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5yZW1vdmUsIG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvc3ltdHlwZSIpKQogICAgICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9zeW10eXBlIiksICJyYiIpIGFzIGY6CiAgICAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZDVzdW0oZGF0YSksIG1kNV9yZWd0eXBlKQoKICAgIGRlZiB0ZXN0X2V4dHJhY3RhbGwoc2VsZik6CiAgICAgICAgIyBUZXN0IGlmIGV4dHJhY3RhbGwoKSBjb3JyZWN0bHkgcmVzdG9yZXMgZGlyZWN0b3J5IHBlcm1pc3Npb25zCiAgICAgICAgIyBhbmQgdGltZXMgKHNlZSBpc3N1ZTE3MzUpLgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lLCBlbmNvZGluZz0iaXNvODg1OS0xIikKICAgICAgICBkaXJlY3RvcmllcyA9IFt0IGZvciB0IGluIHRhciBpZiB0LmlzZGlyKCldCiAgICAgICAgdGFyLmV4dHJhY3RhbGwoVEVNUERJUiwgZGlyZWN0b3JpZXMpCiAgICAgICAgZm9yIHRhcmluZm8gaW4gZGlyZWN0b3JpZXM6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgdGFyaW5mby5uYW1lKQogICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gIndpbjMyIjoKICAgICAgICAgICAgICAgICMgV2luMzIgaGFzIG5vIHN1cHBvcnQgZm9yIGZpbmUgZ3JhaW5lZCBwZXJtaXNzaW9ucy4KICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5tb2RlICYgMDc3Nywgb3Muc3RhdChwYXRoKS5zdF9tb2RlICYgMDc3NykKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLm10aW1lLCBvcy5wYXRoLmdldG10aW1lKHBhdGgpKQogICAgICAgIHRhci5jbG9zZSgpCgogICAgZGVmIHRlc3RfaW5pdF9jbG9zZV9mb2JqKHNlbGYpOgogICAgICAgICMgSXNzdWUgIzczNDE6IENsb3NlIHRoZSBpbnRlcm5hbCBmaWxlIG9iamVjdCBpbiB0aGUgVGFyRmlsZQogICAgICAgICMgY29uc3RydWN0b3IgaW4gY2FzZSBvZiBhbiBlcnJvci4gRm9yIHRoZSB0ZXN0IHdlIHJlbHkgb24KICAgICAgICAjIHRoZSBmYWN0IHRoYXQgb3BlbmluZyBhbiBlbXB0eSBmaWxlIHJhaXNlcyBhIFJlYWRFcnJvci4KICAgICAgICBlbXB0eSA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZW1wdHkiKQogICAgICAgIG9wZW4oZW1wdHksICJ3YiIpLndyaXRlKCIiKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRhciA9IG9iamVjdC5fX25ld19fKHRhcmZpbGUuVGFyRmlsZSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdGFyLl9faW5pdF9fKGVtcHR5KQogICAgICAgICAgICBleGNlcHQgdGFyZmlsZS5SZWFkRXJyb3I6CiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLmZpbGVvYmouY2xvc2VkKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJSZWFkRXJyb3Igbm90IHJhaXNlZCIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgb3MucmVtb3ZlKGVtcHR5KQoKCmNsYXNzIFN0cmVhbVJlYWRUZXN0KENvbW1vblJlYWRUZXN0KToKCiAgICBtb2RlPSJyfCIKCiAgICBkZWYgdGVzdF9maWxlb2JqX3JlZ3VsYXJfZmlsZShzZWxmKToKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIubmV4dCgpICMgZ2V0ICJyZWd0eXBlIiAoY2FuJ3QgdXNlIGdldG1lbWJlcikKICAgICAgICBmb2JqID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKICAgICAgICBzZWxmLmFzc2VydFRydWUoKGxlbihkYXRhKSwgbWQ1c3VtKGRhdGEpKSA9PSAodGFyaW5mby5zaXplLCBtZDVfcmVndHlwZSksCiAgICAgICAgICAgICAgICAicmVndWxhciBmaWxlIGV4dHJhY3Rpb24gZmFpbGVkIikKCiAgICBkZWYgdGVzdF9wcm92b2tlX3N0cmVhbV9lcnJvcihzZWxmKToKICAgICAgICB0YXJpbmZvcyA9IHNlbGYudGFyLmdldG1lbWJlcnMoKQogICAgICAgIGYgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvc1swXSkgIyByZWFkIHRoZSBmaXJzdCBtZW1iZXIKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlN0cmVhbUVycm9yLCBmLnJlYWQpCgogICAgZGVmIHRlc3RfY29tcGFyZV9tZW1iZXJzKHNlbGYpOgogICAgICAgIHRhcjEgPSB0YXJmaWxlLm9wZW4odGFybmFtZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCiAgICAgICAgdGFyMiA9IHNlbGYudGFyCgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHQxID0gdGFyMS5uZXh0KCkKICAgICAgICAgICAgdDIgPSB0YXIyLm5leHQoKQogICAgICAgICAgICBpZiB0MSBpcyBOb25lOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyIGlzIG5vdCBOb25lLCAic3RyZWFtLm5leHQoKSBmYWlsZWQuIikKCiAgICAgICAgICAgIGlmIHQyLmlzbG5rKCkgb3IgdDIuaXNzeW0oKToKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuU3RyZWFtRXJyb3IsIHRhcjIuZXh0cmFjdGZpbGUsIHQyKQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHYxID0gdGFyMS5leHRyYWN0ZmlsZSh0MSkKICAgICAgICAgICAgdjIgPSB0YXIyLmV4dHJhY3RmaWxlKHQyKQogICAgICAgICAgICBpZiB2MSBpcyBOb25lOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYyIGlzIG5vdCBOb25lLCAic3RyZWFtLmV4dHJhY3RmaWxlKCkgZmFpbGVkIikKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYxLnJlYWQoKSA9PSB2Mi5yZWFkKCksICJzdHJlYW0gZXh0cmFjdGlvbiBmYWlsZWQiKQoKICAgICAgICB0YXIxLmNsb3NlKCkKCgpjbGFzcyBEZXRlY3RSZWFkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CgogICAgZGVmIF90ZXN0ZnVuY19maWxlKHNlbGYsIG5hbWUsIG1vZGUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgdGFyZmlsZS5vcGVuKG5hbWUsIG1vZGUpCiAgICAgICAgZXhjZXB0IHRhcmZpbGUuUmVhZEVycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoKQoKICAgIGRlZiBfdGVzdGZ1bmNfZmlsZW9iaihzZWxmLCBuYW1lLCBtb2RlKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRhcmZpbGUub3BlbihuYW1lLCBtb2RlLCBmaWxlb2JqPW9wZW4obmFtZSwgInJiIikpCiAgICAgICAgZXhjZXB0IHRhcmZpbGUuUmVhZEVycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoKQoKICAgIGRlZiBfdGVzdF9tb2RlcyhzZWxmLCB0ZXN0ZnVuYyk6CiAgICAgICAgdGVzdGZ1bmModGFybmFtZSwgInIiKQogICAgICAgIHRlc3RmdW5jKHRhcm5hbWUsICJyOiIpCiAgICAgICAgdGVzdGZ1bmModGFybmFtZSwgInI6KiIpCiAgICAgICAgdGVzdGZ1bmModGFybmFtZSwgInJ8IikKICAgICAgICB0ZXN0ZnVuYyh0YXJuYW1lLCAicnwqIikKCiAgICAgICAgaWYgZ3ppcDoKICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdGFybmFtZSwgbW9kZT0icjpneiIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRhcm5hbWUsIG1vZGU9InJ8Z3oiKQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBnemlwbmFtZSwgbW9kZT0icjoiKQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBnemlwbmFtZSwgbW9kZT0icnwiKQoKICAgICAgICAgICAgdGVzdGZ1bmMoZ3ppcG5hbWUsICJyIikKICAgICAgICAgICAgdGVzdGZ1bmMoZ3ppcG5hbWUsICJyOioiKQogICAgICAgICAgICB0ZXN0ZnVuYyhnemlwbmFtZSwgInI6Z3oiKQogICAgICAgICAgICB0ZXN0ZnVuYyhnemlwbmFtZSwgInJ8KiIpCiAgICAgICAgICAgIHRlc3RmdW5jKGd6aXBuYW1lLCAicnxneiIpCgogICAgICAgIGlmIGJ6MjoKICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdGFybmFtZSwgbW9kZT0icjpiejIiKQogICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0YXJuYW1lLCBtb2RlPSJyfGJ6MiIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIGJ6Mm5hbWUsIG1vZGU9InI6IikKICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgYnoybmFtZSwgbW9kZT0icnwiKQoKICAgICAgICAgICAgdGVzdGZ1bmMoYnoybmFtZSwgInIiKQogICAgICAgICAgICB0ZXN0ZnVuYyhiejJuYW1lLCAicjoqIikKICAgICAgICAgICAgdGVzdGZ1bmMoYnoybmFtZSwgInI6YnoyIikKICAgICAgICAgICAgdGVzdGZ1bmMoYnoybmFtZSwgInJ8KiIpCiAgICAgICAgICAgIHRlc3RmdW5jKGJ6Mm5hbWUsICJyfGJ6MiIpCgogICAgZGVmIHRlc3RfZGV0ZWN0X2ZpbGUoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF9tb2RlcyhzZWxmLl90ZXN0ZnVuY19maWxlKQoKICAgIGRlZiB0ZXN0X2RldGVjdF9maWxlb2JqKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfbW9kZXMoc2VsZi5fdGVzdGZ1bmNfZmlsZW9iaikKCiAgICBkZWYgdGVzdF9kZXRlY3Rfc3RyZWFtX2J6MihzZWxmKToKICAgICAgICAjIE9yaWdpbmFsbHksIHRhcmZpbGUncyBzdHJlYW0gZGV0ZWN0aW9uIGxvb2tlZCBmb3IgdGhlIHN0cmluZwogICAgICAgICMgIkJaaDkxIiBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuIFRoaXMgaXMgaW5jb3JyZWN0IGJlY2F1c2UKICAgICAgICAjIHRoZSAnOScgcmVwcmVzZW50cyB0aGUgYmxvY2tzaXplICg5MDBrQikuIElmIHRoZSBmaWxlIHdhcwogICAgICAgICMgY29tcHJlc3NlZCB1c2luZyBhbm90aGVyIGJsb2Nrc2l6ZSBhdXRvZGV0ZWN0aW9uIGZhaWxzLgogICAgICAgIGlmIG5vdCBiejI6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB3aXRoIG9wZW4odGFybmFtZSwgInJiIikgYXMgZm9iajoKICAgICAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpCgogICAgICAgICMgQ29tcHJlc3Mgd2l0aCBibG9ja3NpemUgMTAwa0IsIHRoZSBmaWxlIHN0YXJ0cyB3aXRoICJCWmgxMSIuCiAgICAgICAgd2l0aCBiejIuQloyRmlsZSh0bXBuYW1lLCAid2IiLCBjb21wcmVzc2xldmVsPTEpIGFzIGZvYmo6CiAgICAgICAgICAgIGZvYmoud3JpdGUoZGF0YSkKCiAgICAgICAgc2VsZi5fdGVzdGZ1bmNfZmlsZSh0bXBuYW1lLCAicnwqIikKCgpjbGFzcyBNZW1iZXJSZWFkVGVzdChSZWFkVGVzdCk6CgogICAgZGVmIF90ZXN0X21lbWJlcihzZWxmLCB0YXJpbmZvLCBjaGtzdW09Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgIGlmIGNoa3N1bSBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1kNXN1bShzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKS5yZWFkKCkpID09IGNoa3N1bSwKICAgICAgICAgICAgICAgICAgICAid3JvbmcgbWQ1c3VtIGZvciAlcyIgJSB0YXJpbmZvLm5hbWUpCgogICAgICAgIGt3YXJnc1sibXRpbWUiXSA9IDA3NjA2MTM2NjE3CiAgICAgICAga3dhcmdzWyJ1aWQiXSA9IDEwMDAKICAgICAgICBrd2FyZ3NbImdpZCJdID0gMTAwCiAgICAgICAgaWYgIm9sZC12NyIgbm90IGluIHRhcmluZm8ubmFtZToKICAgICAgICAgICAgIyBWNyB0YXIgY2FuJ3QgaGFuZGxlIGFscGhhYmV0aWMgb3duZXJzLgogICAgICAgICAgICBrd2FyZ3NbInVuYW1lIl0gPSAidGFyZmlsZSIKICAgICAgICAgICAga3dhcmdzWyJnbmFtZSJdID0gInRhcmZpbGUiCiAgICAgICAgZm9yIGssIHYgaW4ga3dhcmdzLml0ZXJpdGVtcygpOgogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2V0YXR0cih0YXJpbmZvLCBrKSA9PSB2LAogICAgICAgICAgICAgICAgICAgICJ3cm9uZyB2YWx1ZSBpbiAlcyBmaWVsZCBvZiAlcyIgJSAoaywgdGFyaW5mby5uYW1lKSkKCiAgICBkZWYgdGVzdF9maW5kX3JlZ3R5cGUoc2VsZik6CiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpCiAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT03MDExLCBjaGtzdW09bWQ1X3JlZ3R5cGUpCgogICAgZGVmIHRlc3RfZmluZF9jb250dHlwZShzZWxmKToKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9jb250dHlwZSIpCiAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT03MDExLCBjaGtzdW09bWQ1X3JlZ3R5cGUpCgogICAgZGVmIHRlc3RfZmluZF9kaXJ0eXBlKHNlbGYpOgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL2RpcnR5cGUiKQogICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9MCkKCiAgICBkZWYgdGVzdF9maW5kX2RpcnR5cGVfd2l0aF9zaXplKHNlbGYpOgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL2RpcnR5cGUtd2l0aC1zaXplIikKICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTI1NSkKCiAgICBkZWYgdGVzdF9maW5kX2xua3R5cGUoc2VsZik6CiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvbG5rdHlwZSIpCiAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0wLCBsaW5rbmFtZT0idXN0YXIvcmVndHlwZSIpCgogICAgZGVmIHRlc3RfZmluZF9zeW10eXBlKHNlbGYpOgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3N5bXR5cGUiKQogICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9MCwgbGlua25hbWU9InJlZ3R5cGUiKQoKICAgIGRlZiB0ZXN0X2ZpbmRfYmxrdHlwZShzZWxmKToKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9ibGt0eXBlIikKICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTAsIGRldm1ham9yPTMsIGRldm1pbm9yPTApCgogICAgZGVmIHRlc3RfZmluZF9jaHJ0eXBlKHNlbGYpOgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL2NocnR5cGUiKQogICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9MCwgZGV2bWFqb3I9MSwgZGV2bWlub3I9MykKCiAgICBkZWYgdGVzdF9maW5kX2ZpZm90eXBlKHNlbGYpOgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL2ZpZm90eXBlIikKICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTApCgogICAgZGVmIHRlc3RfZmluZF9zcGFyc2Uoc2VsZik6CiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvc3BhcnNlIikKICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTg2MDE2LCBjaGtzdW09bWQ1X3NwYXJzZSkKCiAgICBkZWYgdGVzdF9maW5kX3VtbGF1dHMoc2VsZik6CiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvdW1sYXV0cy3E1tzk9vzfIikKICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTcwMTEsIGNoa3N1bT1tZDVfcmVndHlwZSkKCiAgICBkZWYgdGVzdF9maW5kX3VzdGFyX2xvbmduYW1lKHNlbGYpOgogICAgICAgIG5hbWUgPSAidXN0YXIvIiArICIxMjM0NS8iICogMzkgKyAiMTIzNDU2Ny9sb25nbmFtZSIKICAgICAgICBzZWxmLmFzc2VydEluKG5hbWUsIHNlbGYudGFyLmdldG5hbWVzKCkpCgogICAgZGVmIHRlc3RfZmluZF9yZWd0eXBlX29sZHY3KHNlbGYpOgogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoIm1pc2MvcmVndHlwZS1vbGQtdjciKQogICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9NzAxMSwgY2hrc3VtPW1kNV9yZWd0eXBlKQoKICAgIGRlZiB0ZXN0X2ZpbmRfcGF4X3VtbGF1dHMoc2VsZik6CiAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCBtb2RlPXNlbGYubW9kZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigicGF4L3VtbGF1dHMtxNbc5Pb83yIpCiAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT03MDExLCBjaGtzdW09bWQ1X3JlZ3R5cGUpCgoKY2xhc3MgTG9uZ25hbWVUZXN0KFJlYWRUZXN0KToKCiAgICBkZWYgdGVzdF9yZWFkX2xvbmduYW1lKHNlbGYpOgogICAgICAgICMgVGVzdCByZWFkaW5nIG9mIGxvbmduYW1lIChidWcgIzE0NzE0MjcpLgogICAgICAgIGxvbmduYW1lID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ25hbWUiCiAgICAgICAgdHJ5OgogICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKGxvbmduYW1lKQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKCJsb25nbmFtZSBub3QgZm91bmQiKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnR5cGUgIT0gdGFyZmlsZS5ESVJUWVBFLCAicmVhZCBsb25nbmFtZSBhcyBkaXJ0eXBlIikKCiAgICBkZWYgdGVzdF9yZWFkX2xvbmdsaW5rKHNlbGYpOgogICAgICAgIGxvbmduYW1lID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ25hbWUiCiAgICAgICAgbG9uZ2xpbmsgPSBzZWxmLnN1YmRpciArICIvIiArICIxMjMvIiAqIDEyNSArICJsb25nbGluayIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobG9uZ2xpbmspCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoImxvbmdsaW5rIG5vdCBmb3VuZCIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8ubGlua25hbWUgPT0gbG9uZ25hbWUsICJsaW5rbmFtZSB3cm9uZyIpCgogICAgZGVmIHRlc3RfdHJ1bmNhdGVkX2xvbmduYW1lKHNlbGYpOgogICAgICAgIGxvbmduYW1lID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ25hbWUiCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcihsb25nbmFtZSkKICAgICAgICBvZmZzZXQgPSB0YXJpbmZvLm9mZnNldAogICAgICAgIHNlbGYudGFyLmZpbGVvYmouc2VlayhvZmZzZXQpCiAgICAgICAgZm9iaiA9IFN0cmluZ0lPLlN0cmluZ0lPKHNlbGYudGFyLmZpbGVvYmoucmVhZCgzICogNTEyKSkKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBuYW1lPSJmb28udGFyIiwgZmlsZW9iaj1mb2JqKQoKICAgIGRlZiB0ZXN0X2hlYWRlcl9vZmZzZXQoc2VsZik6CiAgICAgICAgIyBUZXN0IGlmIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIFRhckluZm8gb2JqZWN0IGluY2x1ZGVzCiAgICAgICAgIyB0aGUgcHJlY2VkaW5nIGV4dGVuZGVkIGhlYWRlci4KICAgICAgICBsb25nbmFtZSA9IHNlbGYuc3ViZGlyICsgIi8iICsgIjEyMy8iICogMTI1ICsgImxvbmduYW1lIgogICAgICAgIG9mZnNldCA9IHNlbGYudGFyLmdldG1lbWJlcihsb25nbmFtZSkub2Zmc2V0CiAgICAgICAgZm9iaiA9IG9wZW4odGFybmFtZSkKICAgICAgICBmb2JqLnNlZWsob2Zmc2V0KQogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8uZnJvbWJ1Zihmb2JqLnJlYWQoNTEyKSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udHlwZSwgc2VsZi5sb25nbmFtZXR5cGUpCgoKY2xhc3MgR05VUmVhZFRlc3QoTG9uZ25hbWVUZXN0KToKCiAgICBzdWJkaXIgPSAiZ251IgogICAgbG9uZ25hbWV0eXBlID0gdGFyZmlsZS5HTlVUWVBFX0xPTkdOQU1FCgogICAgZGVmIHRlc3Rfc3BhcnNlX2ZpbGUoc2VsZik6CiAgICAgICAgdGFyaW5mbzEgPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3NwYXJzZSIpCiAgICAgICAgZm9iajEgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvMSkKICAgICAgICB0YXJpbmZvMiA9IHNlbGYudGFyLmdldG1lbWJlcigiZ251L3NwYXJzZSIpCiAgICAgICAgZm9iajIgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvMikKICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9iajEucmVhZCgpID09IGZvYmoyLnJlYWQoKSwKICAgICAgICAgICAgICAgICJzcGFyc2UgZmlsZSBleHRyYWN0aW9uIGZhaWxlZCIpCgoKY2xhc3MgUGF4UmVhZFRlc3QoTG9uZ25hbWVUZXN0KToKCiAgICBzdWJkaXIgPSAicGF4IgogICAgbG9uZ25hbWV0eXBlID0gdGFyZmlsZS5YSERUWVBFCgogICAgZGVmIHRlc3RfcGF4X2dsb2JhbF9oZWFkZXJzKHNlbGYpOgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lLCBlbmNvZGluZz0iaXNvODg1OS0xIikKCiAgICAgICAgdGFyaW5mbyA9IHRhci5nZXRtZW1iZXIoInBheC9yZWd0eXBlMSIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnVuYW1lLCAiZm9vIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uZ25hbWUsICJiYXIiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5wYXhfaGVhZGVycy5nZXQoIlZFTkRPUi51bWxhdXRzIiksIHUixNbc5Pb83yIpCgogICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0bWVtYmVyKCJwYXgvcmVndHlwZTIiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51bmFtZSwgIiIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLmduYW1lLCAiYmFyIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ucGF4X2hlYWRlcnMuZ2V0KCJWRU5ET1IudW1sYXV0cyIpLCB1IsTW3OT2/N8iKQoKICAgICAgICB0YXJpbmZvID0gdGFyLmdldG1lbWJlcigicGF4L3JlZ3R5cGUzIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udW5hbWUsICJ0YXJmaWxlIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uZ25hbWUsICJ0YXJmaWxlIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ucGF4X2hlYWRlcnMuZ2V0KCJWRU5ET1IudW1sYXV0cyIpLCB1IsTW3OT2/N8iKQoKICAgIGRlZiB0ZXN0X3BheF9udW1iZXJfZmllbGRzKHNlbGYpOgogICAgICAgICMgQWxsIGZvbGxvd2luZyBudW1iZXIgZmllbGRzIGFyZSByZWFkIGZyb20gdGhlIHBheCBoZWFkZXIuCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQogICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0bWVtYmVyKCJwYXgvcmVndHlwZTQiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCA3MDExKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51aWQsIDEyMykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uZ2lkLCAxMjMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLm10aW1lLCAxMDQxODA4NzgzLjApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHRhcmluZm8ubXRpbWUpLCBmbG9hdCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KHRhcmluZm8ucGF4X2hlYWRlcnNbImF0aW1lIl0pLCAxMDQxODA4NzgzLjApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCh0YXJpbmZvLnBheF9oZWFkZXJzWyJjdGltZSJdKSwgMTA0MTgwODc4My4wKQoKCmNsYXNzIFdyaXRlVGVzdEJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIyBQdXQgYWxsIHdyaXRlIHRlc3RzIGluIGhlcmUgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgdGVzdGVkCiAgICAjIGluIGFsbCBwb3NzaWJsZSBtb2RlIGNvbWJpbmF0aW9ucy4KCiAgICBkZWYgdGVzdF9maWxlb2JqX25vX2Nsb3NlKHNlbGYpOgogICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTygpCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKGZpbGVvYmo9Zm9iaiwgbW9kZT1zZWxmLm1vZGUpCiAgICAgICAgdGFyLmFkZGZpbGUodGFyZmlsZS5UYXJJbmZvKCJmb28iKSkKICAgICAgICB0YXIuY2xvc2UoKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb2JqLmNsb3NlZCBpcyBGYWxzZSwgImV4dGVybmFsIGZpbGVvYmpzIG11c3QgbmV2ZXIgY2xvc2VkIikKCgpjbGFzcyBXcml0ZVRlc3QoV3JpdGVUZXN0QmFzZSk6CgogICAgbW9kZSA9ICJ3OiIKCiAgICBkZWYgdGVzdF8xMDBfY2hhcl9uYW1lKHNlbGYpOgogICAgICAgICMgVGhlIG5hbWUgZmllbGQgaW4gYSB0YXIgaGVhZGVyIHN0b3JlcyBzdHJpbmdzIG9mIGF0IG1vc3QgMTAwIGNoYXJzLgogICAgICAgICMgSWYgYSBzdHJpbmcgaXMgc2hvcnRlciB0aGFuIDEwMCBjaGFycyBpdCBoYXMgdG8gYmUgcGFkZGVkIHdpdGggJ1wwJywKICAgICAgICAjIHdoaWNoIGltcGxpZXMgdGhhdCBhIHN0cmluZyBvZiBleGFjdGx5IDEwMCBjaGFycyBpcyBzdG9yZWQgd2l0aG91dAogICAgICAgICMgYSB0cmFpbGluZyAnXDAnLgogICAgICAgIG5hbWUgPSAiMDEyMzQ1Njc4OSIgKiAxMAogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCiAgICAgICAgdCA9IHRhcmZpbGUuVGFySW5mbyhuYW1lKQogICAgICAgIHRhci5hZGRmaWxlKHQpCiAgICAgICAgdGFyLmNsb3NlKCkKCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5nZXRuYW1lcygpWzBdID09IG5hbWUsCiAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHN0b3JlIDEwMCBjaGFyIGZpbGVuYW1lIikKICAgICAgICB0YXIuY2xvc2UoKQoKICAgIGRlZiB0ZXN0X3Rhcl9zaXplKHNlbGYpOgogICAgICAgICMgVGVzdCBmb3IgYnVnICMxMDEzODgyLgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZmlsZSIpCiAgICAgICAgZm9iaiA9IG9wZW4ocGF0aCwgIndiIikKICAgICAgICBmb2JqLndyaXRlKCJhYWEiKQogICAgICAgIGZvYmouY2xvc2UoKQogICAgICAgIHRhci5hZGQocGF0aCkKICAgICAgICB0YXIuY2xvc2UoKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmdldHNpemUodG1wbmFtZSkgPiAwLAogICAgICAgICAgICAgICAgInRhcmZpbGUgaXMgZW1wdHkiKQoKICAgICMgVGhlIHRlc3RfKl9zaXplIHRlc3RzIHRlc3QgZm9yIGJ1ZyAjMTE2NzEyOC4KICAgIGRlZiB0ZXN0X2ZpbGVfc2l6ZShzZWxmKToKICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJmaWxlIikKICAgICAgICBmb2JqID0gb3BlbihwYXRoLCAid2IiKQogICAgICAgIGZvYmouY2xvc2UoKQogICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0dGFyaW5mbyhwYXRoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCAwKQoKICAgICAgICBmb2JqID0gb3BlbihwYXRoLCAid2IiKQogICAgICAgIGZvYmoud3JpdGUoImFhYSIpCiAgICAgICAgZm9iai5jbG9zZSgpCiAgICAgICAgdGFyaW5mbyA9IHRhci5nZXR0YXJpbmZvKHBhdGgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnNpemUsIDMpCgogICAgICAgIHRhci5jbG9zZSgpCgogICAgZGVmIHRlc3RfZGlyZWN0b3J5X3NpemUoc2VsZik6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZGlyZWN0b3J5IikKICAgICAgICBvcy5ta2RpcihwYXRoKQogICAgICAgIHRyeToKICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKICAgICAgICAgICAgdGFyaW5mbyA9IHRhci5nZXR0YXJpbmZvKHBhdGgpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCAwKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIG9zLnJtZGlyKHBhdGgpCgogICAgZGVmIHRlc3RfbGlua19zaXplKHNlbGYpOgogICAgICAgIGlmIGhhc2F0dHIob3MsICJsaW5rIik6CiAgICAgICAgICAgIGxpbmsgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImxpbmsiKQogICAgICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImxpbmtfdGFyZ2V0IikKICAgICAgICAgICAgZm9iaiA9IG9wZW4odGFyZ2V0LCAid2IiKQogICAgICAgICAgICBmb2JqLndyaXRlKCJhYWEiKQogICAgICAgICAgICBmb2JqLmNsb3NlKCkKICAgICAgICAgICAgb3MubGluayh0YXJnZXQsIGxpbmspCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCiAgICAgICAgICAgICAgICAjIFJlY29yZCB0aGUgbGluayB0YXJnZXQgaW4gdGhlIGlub2RlcyBsaXN0LgogICAgICAgICAgICAgICAgdGFyLmdldHRhcmluZm8odGFyZ2V0KQogICAgICAgICAgICAgICAgdGFyaW5mbyA9IHRhci5nZXR0YXJpbmZvKGxpbmspCiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgMCkKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0YXJnZXQpCiAgICAgICAgICAgICAgICBvcy5yZW1vdmUobGluaykKCiAgICBkZWYgdGVzdF9zeW1saW5rX3NpemUoc2VsZik6CiAgICAgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihURU1QRElSLCAic3ltbGluayIpCiAgICAgICAgICAgIG9zLnN5bWxpbmsoImxpbmtfdGFyZ2V0IiwgcGF0aCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKICAgICAgICAgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0dGFyaW5mbyhwYXRoKQogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnNpemUsIDApCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBvcy5yZW1vdmUocGF0aCkKCiAgICBkZWYgdGVzdF9hZGRfc2VsZihzZWxmKToKICAgICAgICAjIFRlc3QgZm9yICMxMjU3MjU1LgogICAgICAgIGRzdG5hbWUgPSBvcy5wYXRoLmFic3BhdGgodG1wbmFtZSkKCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLm5hbWUgPT0gZHN0bmFtZSwgImFyY2hpdmUgbmFtZSBtdXN0IGJlIGFic29sdXRlIikKCiAgICAgICAgdGFyLmFkZChkc3RuYW1lKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuZ2V0bmFtZXMoKSA9PSBbXSwgImFkZGVkIHRoZSBhcmNoaXZlIHRvIGl0c2VsZiIpCgogICAgICAgIGN3ZCA9IG9zLmdldGN3ZCgpCiAgICAgICAgb3MuY2hkaXIoVEVNUERJUikKICAgICAgICB0YXIuYWRkKGRzdG5hbWUpCiAgICAgICAgb3MuY2hkaXIoY3dkKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuZ2V0bmFtZXMoKSA9PSBbXSwgImFkZGVkIHRoZSBhcmNoaXZlIHRvIGl0c2VsZiIpCgogICAgZGVmIHRlc3RfZXhjbHVkZShzZWxmKToKICAgICAgICB0ZW1wZGlyID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJleGNsdWRlIikKICAgICAgICBvcy5ta2Rpcih0ZW1wZGlyKQogICAgICAgIHRyeToKICAgICAgICAgICAgZm9yIG5hbWUgaW4gKCJmb28iLCAiYmFyIiwgImJheiIpOgogICAgICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCBuYW1lKQogICAgICAgICAgICAgICAgb3BlbihuYW1lLCAid2IiKS5jbG9zZSgpCgogICAgICAgICAgICBleGNsdWRlID0gb3MucGF0aC5pc2ZpbGUKCiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUsIGVuY29kaW5nPSJpc284ODU5LTEiKQogICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygoInVzZSB0aGUgZmlsdGVyIGFyZ3VtZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgogICAgICAgICAgICAgICAgdGFyLmFkZCh0ZW1wZGlyLCBhcmNuYW1lPSJlbXB0eV9kaXIiLCBleGNsdWRlPWV4Y2x1ZGUpCiAgICAgICAgICAgIHRhci5jbG9zZSgpCgogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInIiKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0YXIuZ2V0bWVtYmVycygpKSwgMSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZ2V0bmFtZXMoKVswXSwgImVtcHR5X2RpciIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQoKICAgIGRlZiB0ZXN0X2ZpbHRlcihzZWxmKToKICAgICAgICB0ZW1wZGlyID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJmaWx0ZXIiKQogICAgICAgIG9zLm1rZGlyKHRlbXBkaXIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmb3IgbmFtZSBpbiAoImZvbyIsICJiYXIiLCAiYmF6Iik6CiAgICAgICAgICAgICAgICBuYW1lID0gb3MucGF0aC5qb2luKHRlbXBkaXIsIG5hbWUpCiAgICAgICAgICAgICAgICBvcGVuKG5hbWUsICJ3YiIpLmNsb3NlKCkKCiAgICAgICAgICAgIGRlZiBmaWx0ZXIodGFyaW5mbyk6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmJhc2VuYW1lKHRhcmluZm8ubmFtZSkgPT0gImJhciI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICB0YXJpbmZvLnVpZCA9IDEyMwogICAgICAgICAgICAgICAgdGFyaW5mby51bmFtZSA9ICJmb28iCiAgICAgICAgICAgICAgICByZXR1cm4gdGFyaW5mbwoKICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCiAgICAgICAgICAgIHRhci5hZGQodGVtcGRpciwgYXJjbmFtZT0iZW1wdHlfZGlyIiwgZmlsdGVyPWZpbHRlcikKICAgICAgICAgICAgdGFyLmNsb3NlKCkKCiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAiciIpCiAgICAgICAgICAgIGZvciB0YXJpbmZvIGluIHRhcjoKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51aWQsIDEyMykKICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51bmFtZSwgImZvbyIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRhci5nZXRtZW1iZXJzKCkpLCAzKQogICAgICAgICAgICB0YXIuY2xvc2UoKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikKCiAgICAjIEd1YXJhbnRlZSB0aGF0IHN0b3JlZCBwYXRobmFtZXMgYXJlIG5vdCBtb2RpZmllZC4gRG9uJ3QKICAgICMgcmVtb3ZlIC4vIG9yIC4uLyBvciBkb3VibGUgc2xhc2hlcy4gU3RpbGwgbWFrZSBhYnNvbHV0ZQogICAgIyBwYXRobmFtZXMgcmVsYXRpdmUuCiAgICAjIEZvciBkZXRhaWxzIHNlZSBidWcgIzYwNTQuCiAgICBkZWYgX3Rlc3RfcGF0aG5hbWUoc2VsZiwgcGF0aCwgY21wX3BhdGg9Tm9uZSwgZGlyPUZhbHNlKToKICAgICAgICAjIENyZWF0ZSBhIHRhcmZpbGUgd2l0aCBhbiBlbXB0eSBtZW1iZXIgbmFtZWQgcGF0aAogICAgICAgICMgYW5kIGNvbXBhcmUgdGhlIHN0b3JlZCBuYW1lIHdpdGggdGhlIG9yaWdpbmFsLgogICAgICAgIGZvbyA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZm9vIikKICAgICAgICBpZiBub3QgZGlyOgogICAgICAgICAgICBvcGVuKGZvbywgInciKS5jbG9zZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgb3MubWtkaXIoZm9vKQoKICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQogICAgICAgIHRhci5hZGQoZm9vLCBhcmNuYW1lPXBhdGgpCiAgICAgICAgdGFyLmNsb3NlKCkKCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJyIikKICAgICAgICB0ID0gdGFyLm5leHQoKQogICAgICAgIHRhci5jbG9zZSgpCgogICAgICAgIGlmIG5vdCBkaXI6CiAgICAgICAgICAgIG9zLnJlbW92ZShmb28pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgb3Mucm1kaXIoZm9vKQoKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubmFtZSwgY21wX3BhdGggb3IgcGF0aC5yZXBsYWNlKG9zLnNlcCwgIi8iKSkKCiAgICBkZWYgdGVzdF9wYXRobmFtZXMoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZSgiZm9vIikKICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiZm9vIiwgIi4iLCAiYmFyIikpCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oImZvbyIsICIuLiIsICJiYXIiKSkKICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLiIsICJmb28iKSkKICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLiIsICJmb28iLCAiLiIpKQogICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUob3MucGF0aC5qb2luKCIuIiwgImZvbyIsICIuIiwgImJhciIpKQogICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUob3MucGF0aC5qb2luKCIuIiwgImZvbyIsICIuLiIsICJiYXIiKSkKICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLiIsICJmb28iLCAiLi4iLCAiYmFyIikpCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4uIiwgImZvbyIpKQogICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUob3MucGF0aC5qb2luKCIuLiIsICJmb28iLCAiLi4iKSkKICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLi4iLCAiZm9vIiwgIi4iLCAiYmFyIikpCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4uIiwgImZvbyIsICIuLiIsICJiYXIiKSkKCiAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZSgiZm9vIiArIG9zLnNlcCArIG9zLnNlcCArICJiYXIiKQogICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUoImZvbyIgKyBvcy5zZXAgKyBvcy5zZXAsICJmb28iLCBkaXI9VHJ1ZSkKCiAgICBkZWYgdGVzdF9hYnNfcGF0aG5hbWVzKHNlbGYpOgogICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgogICAgICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKCJDOlxcZm9vIiwgImZvbyIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZSgiL2ZvbyIsICJmb28iKQogICAgICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKCIvLy9mb28iLCAiZm9vIikKCiAgICBkZWYgdGVzdF9jd2Qoc2VsZik6CiAgICAgICAgIyBUZXN0IGFkZGluZyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQogICAgICAgIG9zLmNoZGlyKFRFTVBESVIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcGVuKCJmb28iLCAidyIpLmNsb3NlKCkKCiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCiAgICAgICAgICAgIHRhci5hZGQoIi4iKQogICAgICAgICAgICB0YXIuY2xvc2UoKQoKICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJyIikKICAgICAgICAgICAgZm9yIHQgaW4gdGFyOgogICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQubmFtZSA9PSAiLiIgb3IgdC5uYW1lLnN0YXJ0c3dpdGgoIi4vIikpCiAgICAgICAgICAgIHRhci5jbG9zZSgpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgb3MuY2hkaXIoY3dkKQoKICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdzeW1saW5rJyksICJuZWVkcyBvcy5zeW1saW5rIikKICAgIGRlZiB0ZXN0X2V4dHJhY3RhbGxfc3ltbGlua3Moc2VsZik6CiAgICAgICAgIyBUZXN0IGlmIGV4dHJhY3RhbGwgd29ya3MgcHJvcGVybHkgd2hlbiB0YXJmaWxlIGNvbnRhaW5zIHN5bWxpbmtzCiAgICAgICAgdGVtcGRpciA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHN5bWxpbmtzIikKICAgICAgICB0ZW1wYXJjaGl2ZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHN5bWxpbmtzLnRhciIpCiAgICAgICAgb3MubWtkaXIodGVtcGRpcikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNvdXJjZV9maWxlID0gb3MucGF0aC5qb2luKHRlbXBkaXIsJ3NvdXJjZScpCiAgICAgICAgICAgIHRhcmdldF9maWxlID0gb3MucGF0aC5qb2luKHRlbXBkaXIsJ3N5bWxpbmsnKQogICAgICAgICAgICB3aXRoIG9wZW4oc291cmNlX2ZpbGUsJ3cnKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZSgnc29tZXRoaW5nXG4nKQogICAgICAgICAgICBvcy5zeW1saW5rKHNvdXJjZV9maWxlLCB0YXJnZXRfZmlsZSkKICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRlbXBhcmNoaXZlLCd3JykKICAgICAgICAgICAgdGFyLmFkZChzb3VyY2VfZmlsZSwgYXJjbmFtZT1vcy5wYXRoLmJhc2VuYW1lKHNvdXJjZV9maWxlKSkKICAgICAgICAgICAgdGFyLmFkZCh0YXJnZXRfZmlsZSwgYXJjbmFtZT1vcy5wYXRoLmJhc2VuYW1lKHRhcmdldF9maWxlKSkKICAgICAgICAgICAgdGFyLmNsb3NlKCkKICAgICAgICAgICAgIyBMZXQncyBleHRyYWN0IGl0IHRvIHRoZSBsb2NhdGlvbiB3aGljaCBjb250YWlucyB0aGUgc3ltbGluawogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGVtcGFyY2hpdmUsJ3InKQogICAgICAgICAgICAjIHRoaXMgc2hvdWxkIG5vdCByYWlzZSBPU0Vycm9yOiBbRXJybm8gMTddIEZpbGUgZXhpc3RzCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHRhci5leHRyYWN0YWxsKHBhdGg9dGVtcGRpcikKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4dHJhY3RhbGwgZmFpbGVkIHdpdGggc3ltbGlua2VkIGZpbGVzIikKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIHRhci5jbG9zZSgpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgb3MudW5saW5rKHRlbXBhcmNoaXZlKQogICAgICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBkaXIpCgogICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ3N5bWxpbmsnKSwgIm5lZWRzIG9zLnN5bWxpbmsiKQogICAgZGVmIHRlc3RfZXh0cmFjdGFsbF9icm9rZW5fc3ltbGlua3Moc2VsZik6CiAgICAgICAgIyBUZXN0IGlmIGV4dHJhY3RhbGwgd29ya3MgcHJvcGVybHkgd2hlbiB0YXJmaWxlIGNvbnRhaW5zIGJyb2tlbgogICAgICAgICMgc3ltbGlua3MKICAgICAgICB0ZW1wZGlyID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0c3ltbGlua3MiKQogICAgICAgIHRlbXBhcmNoaXZlID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0c3ltbGlua3MudGFyIikKICAgICAgICBvcy5ta2Rpcih0ZW1wZGlyKQogICAgICAgIHRyeToKICAgICAgICAgICAgc291cmNlX2ZpbGUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwnc291cmNlJykKICAgICAgICAgICAgdGFyZ2V0X2ZpbGUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwnc3ltbGluaycpCiAgICAgICAgICAgIHdpdGggb3Blbihzb3VyY2VfZmlsZSwndycpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKCdzb21ldGhpbmdcbicpCiAgICAgICAgICAgIG9zLnN5bWxpbmsoc291cmNlX2ZpbGUsIHRhcmdldF9maWxlKQogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGVtcGFyY2hpdmUsJ3cnKQogICAgICAgICAgICB0YXIuYWRkKHRhcmdldF9maWxlLCBhcmNuYW1lPW9zLnBhdGguYmFzZW5hbWUodGFyZ2V0X2ZpbGUpKQogICAgICAgICAgICB0YXIuY2xvc2UoKQogICAgICAgICAgICAjIHJlbW92ZSB0aGUgcmVhbCBmaWxlCiAgICAgICAgICAgIG9zLnVubGluayhzb3VyY2VfZmlsZSkKICAgICAgICAgICAgIyBMZXQncyBleHRyYWN0IGl0IHRvIHRoZSBsb2NhdGlvbiB3aGljaCBjb250YWlucyB0aGUgc3ltbGluawogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGVtcGFyY2hpdmUsJ3InKQogICAgICAgICAgICAjIHRoaXMgc2hvdWxkIG5vdCByYWlzZSBPU0Vycm9yOiBbRXJybm8gMTddIEZpbGUgZXhpc3RzCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHRhci5leHRyYWN0YWxsKHBhdGg9dGVtcGRpcikKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4dHJhY3RhbGwgZmFpbGVkIHdpdGggYnJva2VuIHN5bWxpbmtlZCBmaWxlcyIpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICB0YXIuY2xvc2UoKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIG9zLnVubGluayh0ZW1wYXJjaGl2ZSkKICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQoKICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdsaW5rJyksICJuZWVkcyBvcy5saW5rIikKICAgIGRlZiB0ZXN0X2V4dHJhY3RhbGxfaGFyZGxpbmtzKHNlbGYpOgogICAgICAgICMgVGVzdCBpZiBleHRyYWN0YWxsIHdvcmtzIHByb3Blcmx5IHdoZW4gdGFyZmlsZSBjb250YWlucyBzeW1saW5rcwogICAgICAgIHRlbXBkaXIgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInRlc3RzeW1saW5rcyIpCiAgICAgICAgdGVtcGFyY2hpdmUgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInRlc3RzeW1saW5rcy50YXIiKQogICAgICAgIG9zLm1rZGlyKHRlbXBkaXIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzb3VyY2VfZmlsZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCdzb3VyY2UnKQogICAgICAgICAgICB0YXJnZXRfZmlsZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCdzeW1saW5rJykKICAgICAgICAgICAgd2l0aCBvcGVuKHNvdXJjZV9maWxlLCd3JykgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoJ3NvbWV0aGluZ1xuJykKICAgICAgICAgICAgb3MubGluayhzb3VyY2VfZmlsZSwgdGFyZ2V0X2ZpbGUpCiAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0ZW1wYXJjaGl2ZSwndycpCiAgICAgICAgICAgIHRhci5hZGQoc291cmNlX2ZpbGUsIGFyY25hbWU9b3MucGF0aC5iYXNlbmFtZShzb3VyY2VfZmlsZSkpCiAgICAgICAgICAgIHRhci5hZGQodGFyZ2V0X2ZpbGUsIGFyY25hbWU9b3MucGF0aC5iYXNlbmFtZSh0YXJnZXRfZmlsZSkpCiAgICAgICAgICAgIHRhci5jbG9zZSgpCiAgICAgICAgICAgICMgTGV0J3MgZXh0cmFjdCBpdCB0byB0aGUgbG9jYXRpb24gd2hpY2ggY29udGFpbnMgdGhlIHN5bWxpbmsKICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRlbXBhcmNoaXZlLCdyJykKICAgICAgICAgICAgIyB0aGlzIHNob3VsZCBub3QgcmFpc2UgT1NFcnJvcjogW0Vycm5vIDE3XSBGaWxlIGV4aXN0cwogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0YXIuZXh0cmFjdGFsbChwYXRoPXRlbXBkaXIpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHRyYWN0YWxsIGZhaWxlZCB3aXRoIGxpbmtlZCBmaWxlcyIpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICB0YXIuY2xvc2UoKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIG9zLnVubGluayh0ZW1wYXJjaGl2ZSkKICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQoKY2xhc3MgU3RyZWFtV3JpdGVUZXN0KFdyaXRlVGVzdEJhc2UpOgoKICAgIG1vZGUgPSAid3wiCgogICAgZGVmIHRlc3Rfc3RyZWFtX3BhZGRpbmcoc2VsZik6CiAgICAgICAgIyBUZXN0IGZvciBidWcgIzE1NDMzMDMuCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKICAgICAgICB0YXIuY2xvc2UoKQoKICAgICAgICBpZiBzZWxmLm1vZGUuZW5kc3dpdGgoImd6Iik6CiAgICAgICAgICAgIGZvYmogPSBnemlwLkd6aXBGaWxlKHRtcG5hbWUpCiAgICAgICAgICAgIGRhdGEgPSBmb2JqLnJlYWQoKQogICAgICAgICAgICBmb2JqLmNsb3NlKCkKICAgICAgICBlbGlmIHNlbGYubW9kZS5lbmRzd2l0aCgiYnoyIik6CiAgICAgICAgICAgIGRlYyA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKQogICAgICAgICAgICBkYXRhID0gb3Blbih0bXBuYW1lLCAicmIiKS5yZWFkKCkKICAgICAgICAgICAgZGF0YSA9IGRlYy5kZWNvbXByZXNzKGRhdGEpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGVjLnVudXNlZF9kYXRhKSA9PSAwLAogICAgICAgICAgICAgICAgICAgICJmb3VuZCB0cmFpbGluZyBkYXRhIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBmb2JqID0gb3Blbih0bXBuYW1lLCAicmIiKQogICAgICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKICAgICAgICAgICAgZm9iai5jbG9zZSgpCgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhLmNvdW50KCJcMCIpID09IHRhcmZpbGUuUkVDT1JEU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvcnJlY3QgemVybyBwYWRkaW5nIikKCiAgICBkZWYgdGVzdF9maWxlX21vZGUoc2VsZik6CiAgICAgICAgIyBUZXN0IGZvciBpc3N1ZSAjODQ2NDogQ3JlYXRlIGZpbGVzIHdpdGggY29ycmVjdAogICAgICAgICMgcGVybWlzc2lvbnMuCiAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIgb3Igbm90IGhhc2F0dHIob3MsICJ1bWFzayIpOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHModG1wbmFtZSk6CiAgICAgICAgICAgIG9zLnJlbW92ZSh0bXBuYW1lKQoKICAgICAgICBvcmlnaW5hbF91bWFzayA9IG9zLnVtYXNrKDAwMjIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQogICAgICAgICAgICB0YXIuY2xvc2UoKQogICAgICAgICAgICBtb2RlID0gb3Muc3RhdCh0bXBuYW1lKS5zdF9tb2RlICYgMDc3NwogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZGUsIDA2NDQsICJ3cm9uZyBmaWxlIHBlcm1pc3Npb25zIikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBvcy51bWFzayhvcmlnaW5hbF91bWFzaykKCiAgICBkZWYgdGVzdF9pc3N1ZTEzNjM5KHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4odW5pY29kZSh0bXBuYW1lLCBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpLCBzZWxmLm1vZGUpOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiX1N0cmVhbSBmYWlsZWQgdG8gd3JpdGUgdW5pY29kZSBmaWxlbmFtZSIpCgoKY2xhc3MgR05VV3JpdGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICMgVGhpcyB0ZXN0Y2FzZSBjaGVja3MgZm9yIGNvcnJlY3QgY3JlYXRpb24gb2YgR05VIExvbmduYW1lCiAgICAjIGFuZCBMb25nbGluayBleHRlbmRlZCBoZWFkZXJzIChjcC4gYnVnICM4MTIzMjUpLgoKICAgIGRlZiBfbGVuZ3RoKHNlbGYsIHMpOgogICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGxlbihzKSArIDEsIDUxMikKICAgICAgICBpZiByZW1haW5kZXI6CiAgICAgICAgICAgIGJsb2NrcyArPSAxCiAgICAgICAgcmV0dXJuIGJsb2NrcyAqIDUxMgoKICAgIGRlZiBfY2FsY19zaXplKHNlbGYsIG5hbWUsIGxpbms9Tm9uZSk6CiAgICAgICAgIyBJbml0aWFsIHRhciBoZWFkZXIKICAgICAgICBjb3VudCA9IDUxMgoKICAgICAgICBpZiBsZW4obmFtZSkgPiB0YXJmaWxlLkxFTkdUSF9OQU1FOgogICAgICAgICAgICAjIEdOVSBsb25nbmFtZSBleHRlbmRlZCBoZWFkZXIgKyBsb25nbmFtZQogICAgICAgICAgICBjb3VudCArPSA1MTIKICAgICAgICAgICAgY291bnQgKz0gc2VsZi5fbGVuZ3RoKG5hbWUpCiAgICAgICAgaWYgbGluayBpcyBub3QgTm9uZSBhbmQgbGVuKGxpbmspID4gdGFyZmlsZS5MRU5HVEhfTElOSzoKICAgICAgICAgICAgIyBHTlUgbG9uZ2xpbmsgZXh0ZW5kZWQgaGVhZGVyICsgbG9uZ2xpbmsKICAgICAgICAgICAgY291bnQgKz0gNTEyCiAgICAgICAgICAgIGNvdW50ICs9IHNlbGYuX2xlbmd0aChsaW5rKQogICAgICAgIHJldHVybiBjb3VudAoKICAgIGRlZiBfdGVzdChzZWxmLCBuYW1lLCBsaW5rPU5vbmUpOgogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8obmFtZSkKICAgICAgICBpZiBsaW5rOgogICAgICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gbGluawogICAgICAgICAgICB0YXJpbmZvLnR5cGUgPSB0YXJmaWxlLkxOS1RZUEUKCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IikKICAgICAgICB0YXIuZm9ybWF0ID0gdGFyZmlsZS5HTlVfRk9STUFUCiAgICAgICAgdGFyLmFkZGZpbGUodGFyaW5mbykKCiAgICAgICAgdjEgPSBzZWxmLl9jYWxjX3NpemUobmFtZSwgbGluaykKICAgICAgICB2MiA9IHRhci5vZmZzZXQKICAgICAgICBzZWxmLmFzc2VydFRydWUodjEgPT0gdjIsICJHTlUgbG9uZ25hbWUvbG9uZ2xpbmsgY3JlYXRpb24gZmFpbGVkIikKCiAgICAgICAgdGFyLmNsb3NlKCkKCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUpCiAgICAgICAgbWVtYmVyID0gdGFyLm5leHQoKQogICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKG1lbWJlciwKICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gcmVhZCBsb25nbmFtZSBtZW1iZXIiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5uYW1lLCBtZW1iZXIubmFtZSwKICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gcmVhZCBsb25nbmFtZSBtZW1iZXIiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5saW5rbmFtZSwgbWVtYmVyLmxpbmtuYW1lLAogICAgICAgICAgICAgICAgInVuYWJsZSB0byByZWFkIGxvbmduYW1lIG1lbWJlciIpCgogICAgZGVmIHRlc3RfbG9uZ25hbWVfMTAyMyhzZWxmKToKICAgICAgICBzZWxmLl90ZXN0KCgibG9uZ25hbS8iICogMTI3KSArICJsb25nbmFtIikKCiAgICBkZWYgdGVzdF9sb25nbmFtZV8xMDI0KHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3QoKCJsb25nbmFtLyIgKiAxMjcpICsgImxvbmduYW1lIikKCiAgICBkZWYgdGVzdF9sb25nbmFtZV8xMDI1KHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3QoKCJsb25nbmFtLyIgKiAxMjcpICsgImxvbmduYW1lXyIpCgogICAgZGVmIHRlc3RfbG9uZ2xpbmtfMTAyMyhzZWxmKToKICAgICAgICBzZWxmLl90ZXN0KCJuYW1lIiwgKCJsb25nbG5rLyIgKiAxMjcpICsgImxvbmdsbmsiKQoKICAgIGRlZiB0ZXN0X2xvbmdsaW5rXzEwMjQoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdCgibmFtZSIsICgibG9uZ2xuay8iICogMTI3KSArICJsb25nbGluayIpCgogICAgZGVmIHRlc3RfbG9uZ2xpbmtfMTAyNShzZWxmKToKICAgICAgICBzZWxmLl90ZXN0KCJuYW1lIiwgKCJsb25nbG5rLyIgKiAxMjcpICsgImxvbmdsaW5rXyIpCgogICAgZGVmIHRlc3RfbG9uZ25hbWVsaW5rXzEwMjMoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdCgoImxvbmduYW0vIiAqIDEyNykgKyAibG9uZ25hbSIsCiAgICAgICAgICAgICAgICAgICAoImxvbmdsbmsvIiAqIDEyNykgKyAibG9uZ2xuayIpCgogICAgZGVmIHRlc3RfbG9uZ25hbWVsaW5rXzEwMjQoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdCgoImxvbmduYW0vIiAqIDEyNykgKyAibG9uZ25hbWUiLAogICAgICAgICAgICAgICAgICAgKCJsb25nbG5rLyIgKiAxMjcpICsgImxvbmdsaW5rIikKCiAgICBkZWYgdGVzdF9sb25nbmFtZWxpbmtfMTAyNShzZWxmKToKICAgICAgICBzZWxmLl90ZXN0KCgibG9uZ25hbS8iICogMTI3KSArICJsb25nbmFtZV8iLAogICAgICAgICAgICAgICAgICAgKCJsb25nbG5rLyIgKiAxMjcpICsgImxvbmdsaW5rXyIpCgoKY2xhc3MgSGFyZGxpbmtUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICMgVGVzdCB0aGUgY3JlYXRpb24gb2YgTE5LVFlQRSAoaGFyZGxpbmspIG1lbWJlcnMgaW4gYW4gYXJjaGl2ZS4KCiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5mb28gPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImZvbyIpCiAgICAgICAgc2VsZi5iYXIgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImJhciIpCgogICAgICAgIGZvYmogPSBvcGVuKHNlbGYuZm9vLCAid2IiKQogICAgICAgIGZvYmoud3JpdGUoImZvbyIpCiAgICAgICAgZm9iai5jbG9zZSgpCgogICAgICAgIG9zLmxpbmsoc2VsZi5mb28sIHNlbGYuYmFyKQoKICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIpCiAgICAgICAgc2VsZi50YXIuYWRkKHNlbGYuZm9vKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLnRhci5jbG9zZSgpCiAgICAgICAgb3MucmVtb3ZlKHNlbGYuZm9vKQogICAgICAgIG9zLnJlbW92ZShzZWxmLmJhcikKCiAgICBkZWYgdGVzdF9hZGRfdHdpY2Uoc2VsZik6CiAgICAgICAgIyBUaGUgc2FtZSBuYW1lIHdpbGwgYmUgYWRkZWQgYXMgYSBSRUdUWVBFIGV2ZXJ5CiAgICAgICAgIyB0aW1lIHJlZ2FyZGxlc3Mgb2Ygc3RfbmxpbmsuCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldHRhcmluZm8oc2VsZi5mb28pCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8udHlwZSA9PSB0YXJmaWxlLlJFR1RZUEUsCiAgICAgICAgICAgICAgICAiYWRkIGZpbGUgYXMgcmVndWxhciBmYWlsZWQiKQoKICAgIGRlZiB0ZXN0X2FkZF9oYXJkbGluayhzZWxmKToKICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0dGFyaW5mbyhzZWxmLmJhcikKICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby50eXBlID09IHRhcmZpbGUuTE5LVFlQRSwKICAgICAgICAgICAgICAgICJhZGQgZmlsZSBhcyBoYXJkbGluayBmYWlsZWQiKQoKICAgIGRlZiB0ZXN0X2RlcmVmZXJlbmNlX2hhcmRsaW5rKHNlbGYpOgogICAgICAgIHNlbGYudGFyLmRlcmVmZXJlbmNlID0gVHJ1ZQogICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXR0YXJpbmZvKHNlbGYuYmFyKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5SRUdUWVBFLAogICAgICAgICAgICAgICAgImRlcmVmZXJlbmNpbmcgaGFyZGxpbmsgZmFpbGVkIikKCgpjbGFzcyBQYXhXcml0ZVRlc3QoR05VV3JpdGVUZXN0KToKCiAgICBkZWYgX3Rlc3Qoc2VsZiwgbmFtZSwgbGluaz1Ob25lKToKICAgICAgICAjIFNlZSBHTlVXcml0ZVRlc3QuCiAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbyhuYW1lKQogICAgICAgIGlmIGxpbms6CiAgICAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBsaW5rCiAgICAgICAgICAgIHRhcmluZm8udHlwZSA9IHRhcmZpbGUuTE5LVFlQRQoKICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9dGFyZmlsZS5QQVhfRk9STUFUKQogICAgICAgIHRhci5hZGRmaWxlKHRhcmluZm8pCiAgICAgICAgdGFyLmNsb3NlKCkKCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUpCiAgICAgICAgaWYgbGluazoKICAgICAgICAgICAgbCA9IHRhci5nZXRtZW1iZXJzKClbMF0ubGlua25hbWUKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmsgPT0gbCwgIlBBWCBsb25nbGluayBjcmVhdGlvbiBmYWlsZWQiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG4gPSB0YXIuZ2V0bWVtYmVycygpWzBdLm5hbWUKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5hbWUgPT0gbiwgIlBBWCBsb25nbmFtZSBjcmVhdGlvbiBmYWlsZWQiKQoKICAgIGRlZiB0ZXN0X3BheF9nbG9iYWxfaGVhZGVyKHNlbGYpOgogICAgICAgIHBheF9oZWFkZXJzID0gewogICAgICAgICAgICAgICAgdSJmb28iOiB1ImJhciIsCiAgICAgICAgICAgICAgICB1InVpZCI6IHUiMCIsCiAgICAgICAgICAgICAgICB1Im10aW1lIjogdSIxLjIzIiwKICAgICAgICAgICAgICAgIHUidGVzdCI6IHUi5Pb8IiwKICAgICAgICAgICAgICAgIHUi5Pb8IjogdSJ0ZXN0In0KCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCwKICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzPXBheF9oZWFkZXJzKQogICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbygidGVzdCIpKQogICAgICAgIHRhci5jbG9zZSgpCgogICAgICAgICMgVGVzdCBpZiB0aGUgZ2xvYmFsIGhlYWRlciB3YXMgd3JpdHRlbiBjb3JyZWN0bHkuCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLnBheF9oZWFkZXJzLCBwYXhfaGVhZGVycykKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRtZW1iZXJzKClbMF0ucGF4X2hlYWRlcnMsIHBheF9oZWFkZXJzKQoKICAgICAgICAjIFRlc3QgaWYgYWxsIHRoZSBmaWVsZHMgYXJlIHVuaWNvZGUuCiAgICAgICAgZm9yIGtleSwgdmFsIGluIHRhci5wYXhfaGVhZGVycy5pdGVyaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoa2V5KSBpcyB1bmljb2RlKQogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh2YWwpIGlzIHVuaWNvZGUpCiAgICAgICAgICAgIGlmIGtleSBpbiB0YXJmaWxlLlBBWF9OVU1CRVJfRklFTERTOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHRhcmZpbGUuUEFYX05VTUJFUl9GSUVMRFNba2V5XSh2YWwpCiAgICAgICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmFibGUgdG8gY29udmVydCBwYXggaGVhZGVyIGZpZWxkIikKCiAgICBkZWYgdGVzdF9wYXhfZXh0ZW5kZWRfaGVhZGVyKHNlbGYpOgogICAgICAgICMgVGhlIGZpZWxkcyBmcm9tIHRoZSBwYXggaGVhZGVyIGhhdmUgcHJpb3JpdHkgb3ZlciB0aGUKICAgICAgICAjIFRhckluZm8uCiAgICAgICAgcGF4X2hlYWRlcnMgPSB7dSJwYXRoIjogdSJmb28iLCB1InVpZCI6IHUiMTIzIn0KCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCiAgICAgICAgdCA9IHRhcmZpbGUuVGFySW5mbygpCiAgICAgICAgdC5uYW1lID0gdSLk9vwiICAgICAjIG5vbi1BU0NJSQogICAgICAgIHQudWlkID0gOCoqOCAgICAgICAgIyB0b28gbGFyZ2UKICAgICAgICB0LnBheF9oZWFkZXJzID0gcGF4X2hlYWRlcnMKICAgICAgICB0YXIuYWRkZmlsZSh0KQogICAgICAgIHRhci5jbG9zZSgpCgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBlbmNvZGluZz0iaXNvODg1OS0xIikKICAgICAgICB0ID0gdGFyLmdldG1lbWJlcnMoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5wYXhfaGVhZGVycywgcGF4X2hlYWRlcnMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lm5hbWUsICJmb28iKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC51aWQsIDEyMykKCgpjbGFzcyBVc3RhclVuaWNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICMgQWxsICpVbmljb2RlVGVzdHMgRklYTUUKCiAgICBmb3JtYXQgPSB0YXJmaWxlLlVTVEFSX0ZPUk1BVAoKICAgIGRlZiB0ZXN0X2lzbzg4NTlfMV9maWxlbmFtZShzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X3VuaWNvZGVfZmlsZW5hbWUoImlzbzg4NTktMSIpCgogICAgZGVmIHRlc3RfdXRmN19maWxlbmFtZShzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X3VuaWNvZGVfZmlsZW5hbWUoInV0ZjciKQoKICAgIGRlZiB0ZXN0X3V0ZjhfZmlsZW5hbWUoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF91bmljb2RlX2ZpbGVuYW1lKCJ1dGY4IikKCiAgICBkZWYgX3Rlc3RfdW5pY29kZV9maWxlbmFtZShzZWxmLCBlbmNvZGluZyk6CiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXNlbGYuZm9ybWF0LCBlbmNvZGluZz1lbmNvZGluZywgZXJyb3JzPSJzdHJpY3QiKQogICAgICAgIG5hbWUgPSB1IuT2/CIKICAgICAgICB0YXIuYWRkZmlsZSh0YXJmaWxlLlRhckluZm8obmFtZSkpCiAgICAgICAgdGFyLmNsb3NlKCkKCiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGVuY29kaW5nPWVuY29kaW5nKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHRhci5nZXRuYW1lcygpWzBdKSBpcyBub3QgdW5pY29kZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRtZW1iZXJzKClbMF0ubmFtZSwgbmFtZS5lbmNvZGUoZW5jb2RpbmcpKQogICAgICAgIHRhci5jbG9zZSgpCgogICAgZGVmIHRlc3RfdW5pY29kZV9maWxlbmFtZV9lcnJvcihzZWxmKToKICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9c2VsZi5mb3JtYXQsIGVuY29kaW5nPSJhc2NpaSIsIGVycm9ycz0ic3RyaWN0IikKICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCkKCiAgICAgICAgdGFyaW5mby5uYW1lID0gIuT2/CIKICAgICAgICBpZiBzZWxmLmZvcm1hdCA9PSB0YXJmaWxlLlBBWF9GT1JNQVQ6CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdGFyLmFkZGZpbGUsIHRhcmluZm8pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdGFyLmFkZGZpbGUodGFyaW5mbykKCiAgICAgICAgdGFyaW5mby5uYW1lID0gdSLk9vwiCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB0YXIuYWRkZmlsZSwgdGFyaW5mbykKCiAgICAgICAgdGFyaW5mby5uYW1lID0gImZvbyIKICAgICAgICB0YXJpbmZvLnVuYW1lID0gdSLk9vwiCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB0YXIuYWRkZmlsZSwgdGFyaW5mbykKCiAgICBkZWYgdGVzdF91bmljb2RlX2FyZ3VtZW50KHNlbGYpOgogICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lLCAiciIsIGVuY29kaW5nPSJpc284ODU5LTEiLCBlcnJvcnM9InN0cmljdCIpCiAgICAgICAgZm9yIHQgaW4gdGFyOgogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0Lm5hbWUpIGlzIHN0cikKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodC5saW5rbmFtZSkgaXMgc3RyKQogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0LnVuYW1lKSBpcyBzdHIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHQuZ25hbWUpIGlzIHN0cikKICAgICAgICB0YXIuY2xvc2UoKQoKICAgIGRlZiB0ZXN0X3VuYW1lX3VuaWNvZGUoc2VsZik6CiAgICAgICAgZm9yIG5hbWUgaW4gKHUi5Pb8IiwgIuT2/CIpOgogICAgICAgICAgICB0ID0gdGFyZmlsZS5UYXJJbmZvKCJmb28iKQogICAgICAgICAgICB0LnVuYW1lID0gbmFtZQogICAgICAgICAgICB0LmduYW1lID0gbmFtZQoKICAgICAgICAgICAgZm9iaiA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKCJmb28udGFyIiwgbW9kZT0idyIsIGZpbGVvYmo9Zm9iaiwgZm9ybWF0PXNlbGYuZm9ybWF0LCBlbmNvZGluZz0iaXNvODg1OS0xIikKICAgICAgICAgICAgdGFyLmFkZGZpbGUodCkKICAgICAgICAgICAgdGFyLmNsb3NlKCkKICAgICAgICAgICAgZm9iai5zZWVrKDApCgogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oImZvby50YXIiLCBmaWxlb2JqPWZvYmosIGVuY29kaW5nPSJpc284ODU5LTEiKQogICAgICAgICAgICB0ID0gdGFyLmdldG1lbWJlcigiZm9vIikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnVuYW1lLCAi5Pb8IikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmduYW1lLCAi5Pb8IikKCgpjbGFzcyBHTlVVbmljb2RlVGVzdChVc3RhclVuaWNvZGVUZXN0KToKCiAgICBmb3JtYXQgPSB0YXJmaWxlLkdOVV9GT1JNQVQKCgpjbGFzcyBQYXhVbmljb2RlVGVzdChVc3RhclVuaWNvZGVUZXN0KToKCiAgICBmb3JtYXQgPSB0YXJmaWxlLlBBWF9GT1JNQVQKCiAgICBkZWYgX2NyZWF0ZV91bmljb2RlX25hbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXNlbGYuZm9ybWF0KQogICAgICAgIHQgPSB0YXJmaWxlLlRhckluZm8oKQogICAgICAgIHQucGF4X2hlYWRlcnNbInBhdGgiXSA9IG5hbWUKICAgICAgICB0YXIuYWRkZmlsZSh0KQogICAgICAgIHRhci5jbG9zZSgpCgogICAgZGVmIHRlc3RfZXJyb3JfaGFuZGxlcnMoc2VsZik6CiAgICAgICAgIyBUZXN0IGlmIHRoZSB1bmljb2RlIGVycm9yIGhhbmRsZXJzIHdvcmsgY29ycmVjdGx5IGZvciBjaGFyYWN0ZXJzCiAgICAgICAgIyB0aGF0IGNhbm5vdCBiZSBleHByZXNzZWQgaW4gYSBnaXZlbiBlbmNvZGluZy4KICAgICAgICBzZWxmLl9jcmVhdGVfdW5pY29kZV9uYW1lKHUi5Pb8IikKCiAgICAgICAgZm9yIGhhbmRsZXIsIG5hbWUgaW4gKCgidXRmLTgiLCB1IuT2/CIuZW5jb2RlKCJ1dGY4IikpLAogICAgICAgICAgICAgICAgICAgICgicmVwbGFjZSIsICI/Pz8iKSwgKCJpZ25vcmUiLCAiIikpOgogICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgZm9ybWF0PXNlbGYuZm9ybWF0LCBlbmNvZGluZz0iYXNjaWkiLAogICAgICAgICAgICAgICAgICAgIGVycm9ycz1oYW5kbGVyKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRuYW1lcygpWzBdLCBuYW1lKQoKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHRhcmZpbGUub3BlbiwgdG1wbmFtZSwKICAgICAgICAgICAgICAgIGVuY29kaW5nPSJhc2NpaSIsIGVycm9ycz0ic3RyaWN0IikKCiAgICBkZWYgdGVzdF9lcnJvcl9oYW5kbGVyX3V0Zjgoc2VsZik6CiAgICAgICAgIyBDcmVhdGUgYSBwYXRobmFtZSB0aGF0IGhhcyBvbmUgY29tcG9uZW50IHJlcHJlc2VudGFibGUgdXNpbmcKICAgICAgICAjIGlzbzg4NTktMSBhbmQgdGhlIG90aGVyIG9ubHkgaW4gaXNvODg1OS0xNS4KICAgICAgICBzZWxmLl9jcmVhdGVfdW5pY29kZV9uYW1lKHUi5Pb8L6QiKQoKICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgZm9ybWF0PXNlbGYuZm9ybWF0LCBlbmNvZGluZz0iaXNvODg1OS0xIiwKICAgICAgICAgICAgICAgIGVycm9ycz0idXRmLTgiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLmdldG5hbWVzKClbMF0sICLk9vwvIiArIHUipCIuZW5jb2RlKCJ1dGY4IikpCgoKY2xhc3MgQXBwZW5kVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAjIFRlc3QgYXBwZW5kIG1vZGUgKGNwLiBwYXRjaCAjMTY1MjY4MSkuCgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYudGFybmFtZSA9IHRtcG5hbWUKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnRhcm5hbWUpOgogICAgICAgICAgICBvcy5yZW1vdmUoc2VsZi50YXJuYW1lKQoKICAgIGRlZiBfYWRkX3Rlc3RmaWxlKHNlbGYsIGZpbGVvYmo9Tm9uZSk6CiAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgImEiLCBmaWxlb2JqPWZpbGVvYmopCiAgICAgICAgdGFyLmFkZGZpbGUodGFyZmlsZS5UYXJJbmZvKCJiYXIiKSkKICAgICAgICB0YXIuY2xvc2UoKQoKICAgIGRlZiBfY3JlYXRlX3Rlc3R0YXIoc2VsZiwgbW9kZT0idzoiKToKICAgICAgICBzcmMgPSB0YXJmaWxlLm9wZW4odGFybmFtZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCiAgICAgICAgdCA9IHNyYy5nZXRtZW1iZXIoInVzdGFyL3JlZ3R5cGUiKQogICAgICAgIHQubmFtZSA9ICJmb28iCiAgICAgICAgZiA9IHNyYy5leHRyYWN0ZmlsZSh0KQogICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsIG1vZGUpCiAgICAgICAgdGFyLmFkZGZpbGUodCwgZikKICAgICAgICB0YXIuY2xvc2UoKQoKICAgIGRlZiBfdGVzdChzZWxmLCBuYW1lcz1bImJhciJdLCBmaWxlb2JqPU5vbmUpOgogICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsIGZpbGVvYmo9ZmlsZW9iaikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRuYW1lcygpLCBuYW1lcykKCiAgICBkZWYgdGVzdF9ub25fZXhpc3Rpbmcoc2VsZik6CiAgICAgICAgc2VsZi5fYWRkX3Rlc3RmaWxlKCkKICAgICAgICBzZWxmLl90ZXN0KCkKCiAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKICAgICAgICB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCAidzoiKS5jbG9zZSgpCiAgICAgICAgc2VsZi5fYWRkX3Rlc3RmaWxlKCkKICAgICAgICBzZWxmLl90ZXN0KCkKCiAgICBkZWYgdGVzdF9lbXB0eV9maWxlb2JqKHNlbGYpOgogICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTygiXDAiICogMTAyNCkKICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoZm9iaikKICAgICAgICBmb2JqLnNlZWsoMCkKICAgICAgICBzZWxmLl90ZXN0KGZpbGVvYmo9Zm9iaikKCiAgICBkZWYgdGVzdF9maWxlb2JqKHNlbGYpOgogICAgICAgIHNlbGYuX2NyZWF0ZV90ZXN0dGFyKCkKICAgICAgICBkYXRhID0gb3BlbihzZWxmLnRhcm5hbWUpLnJlYWQoKQogICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQogICAgICAgIHNlbGYuX2FkZF90ZXN0ZmlsZShmb2JqKQogICAgICAgIGZvYmouc2VlaygwKQogICAgICAgIHNlbGYuX3Rlc3QobmFtZXM9WyJmb28iLCAiYmFyIl0sIGZpbGVvYmo9Zm9iaikKCiAgICBkZWYgdGVzdF9leGlzdGluZyhzZWxmKToKICAgICAgICBzZWxmLl9jcmVhdGVfdGVzdHRhcigpCiAgICAgICAgc2VsZi5fYWRkX3Rlc3RmaWxlKCkKICAgICAgICBzZWxmLl90ZXN0KG5hbWVzPVsiZm9vIiwgImJhciJdKQoKICAgIGRlZiB0ZXN0X2FwcGVuZF9neihzZWxmKToKICAgICAgICBpZiBnemlwIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuX2NyZWF0ZV90ZXN0dGFyKCJ3Omd6IikKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0bXBuYW1lLCAiYSIpCgogICAgZGVmIHRlc3RfYXBwZW5kX2J6MihzZWxmKToKICAgICAgICBpZiBiejIgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5fY3JlYXRlX3Rlc3R0YXIoInc6YnoyIikKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0bXBuYW1lLCAiYSIpCgogICAgIyBBcHBlbmQgbW9kZSBpcyBzdXBwb3NlZCB0byBmYWlsIGlmIHRoZSB0YXJmaWxlIHRvIGFwcGVuZCB0bwogICAgIyBkb2VzIG5vdCBlbmQgd2l0aCBhIHplcm8gYmxvY2suCiAgICBkZWYgX3Rlc3RfZXJyb3Ioc2VsZiwgZGF0YSk6CiAgICAgICAgb3BlbihzZWxmLnRhcm5hbWUsICJ3YiIpLndyaXRlKGRhdGEpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHNlbGYuX2FkZF90ZXN0ZmlsZSkKCiAgICBkZWYgdGVzdF9udWxsKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfZXJyb3IoIiIpCgogICAgZGVmIHRlc3RfaW5jb21wbGV0ZShzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2Vycm9yKCJcMCIgKiAxMykKCiAgICBkZWYgdGVzdF9wcmVtYXR1cmVfZW9mKHNlbGYpOgogICAgICAgIGRhdGEgPSB0YXJmaWxlLlRhckluZm8oImZvbyIpLnRvYnVmKCkKICAgICAgICBzZWxmLl90ZXN0X2Vycm9yKGRhdGEpCgogICAgZGVmIHRlc3RfdHJhaWxpbmdfZ2FyYmFnZShzZWxmKToKICAgICAgICBkYXRhID0gdGFyZmlsZS5UYXJJbmZvKCJmb28iKS50b2J1ZigpCiAgICAgICAgc2VsZi5fdGVzdF9lcnJvcihkYXRhICsgIlwwIiAqIDEzKQoKICAgIGRlZiB0ZXN0X2ludmFsaWQoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF9lcnJvcigiYSIgKiA1MTIpCgoKY2xhc3MgTGltaXRzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CgogICAgZGVmIHRlc3RfdXN0YXJfbGltaXRzKHNlbGYpOgogICAgICAgICMgMTAwIGNoYXIgbmFtZQogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjAxMjM0NTY3ODkiICogMTApCiAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLlVTVEFSX0ZPUk1BVCkKCiAgICAgICAgIyAxMDEgY2hhciBuYW1lIHRoYXQgY2Fubm90IGJlIHN0b3JlZAogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjAxMjM0NTY3ODkiICogMTAgKyAiMCIpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby50b2J1ZiwgdGFyZmlsZS5VU1RBUl9GT1JNQVQpCgogICAgICAgICMgMjU2IGNoYXIgbmFtZSB3aXRoIGEgc2xhc2ggYXQgcG9zIDE1NgogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMy8iICogNjIgKyAibG9uZ25hbWUiKQogICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5VU1RBUl9GT1JNQVQpCgogICAgICAgICMgMjU2IGNoYXIgbmFtZSB0aGF0IGNhbm5vdCBiZSBzdG9yZWQKICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjM0NTY3LyIgKiAzMSArICJsb25nbmFtZSIpCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby50b2J1ZiwgdGFyZmlsZS5VU1RBUl9GT1JNQVQpCgogICAgICAgICMgNTEyIGNoYXIgbmFtZQogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMy8iICogMTI2ICsgImxvbmduYW1lIikKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLnRvYnVmLCB0YXJmaWxlLlVTVEFSX0ZPUk1BVCkKCiAgICAgICAgIyA1MTIgY2hhciBsaW5rbmFtZQogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oImxvbmdsaW5rIikKICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gIjEyMy8iICogMTI2ICsgImxvbmduYW1lIgogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8udG9idWYsIHRhcmZpbGUuVVNUQVJfRk9STUFUKQoKICAgICAgICAjIHVpZCA+IDggZGlnaXRzCiAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibmFtZSIpCiAgICAgICAgdGFyaW5mby51aWQgPSAwMTAwMDAwMDAKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLnRvYnVmLCB0YXJmaWxlLlVTVEFSX0ZPUk1BVCkKCiAgICBkZWYgdGVzdF9nbnVfbGltaXRzKHNlbGYpOgogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMy8iICogMTI2ICsgImxvbmduYW1lIikKICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuR05VX0ZPUk1BVCkKCiAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibG9uZ2xpbmsiKQogICAgICAgIHRhcmluZm8ubGlua25hbWUgPSAiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiCiAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLkdOVV9GT1JNQVQpCgogICAgICAgICMgdWlkID49IDI1NiAqKiA3CiAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibmFtZSIpCiAgICAgICAgdGFyaW5mby51aWQgPSAwNDAwMDAwMDAwMDAwMDAwMDAwMEwKICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLnRvYnVmLCB0YXJmaWxlLkdOVV9GT1JNQVQpCgogICAgZGVmIHRlc3RfcGF4X2xpbWl0cyhzZWxmKToKICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIpCiAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLlBBWF9GT1JNQVQpCgogICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oImxvbmdsaW5rIikKICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gIjEyMy8iICogMTI2ICsgImxvbmduYW1lIgogICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5QQVhfRk9STUFUKQoKICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJuYW1lIikKICAgICAgICB0YXJpbmZvLnVpZCA9IDA0MDAwMDAwMDAwMDAwMDAwMDAwTAogICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5QQVhfRk9STUFUKQoKCmNsYXNzIENvbnRleHRNYW5hZ2VyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CgogICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CiAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4odGFybmFtZSkgYXMgdGFyOgogICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHRhci5jbG9zZWQsICJjbG9zZWQgaW5zaWRlIHJ1bnRpbWUgY29udGV4dCIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5jbG9zZWQsICJjb250ZXh0IG1hbmFnZXIgZmFpbGVkIikKCiAgICBkZWYgdGVzdF9jbG9zZWQoc2VsZik6CiAgICAgICAgIyBUaGUgX19lbnRlcl9fKCkgbWV0aG9kIGlzIHN1cHBvc2VkIHRvIHJhaXNlIElPRXJyb3IKICAgICAgICAjIGlmIHRoZSBUYXJGaWxlIG9iamVjdCBpcyBhbHJlYWR5IGNsb3NlZC4KICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZSkKICAgICAgICB0YXIuY2xvc2UoKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvcik6CiAgICAgICAgICAgIHdpdGggdGFyOgogICAgICAgICAgICAgICAgcGFzcwoKICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbihzZWxmKToKICAgICAgICAjIFRlc3QgaWYgdGhlIElPRXJyb3IgZXhjZXB0aW9uIGlzIHBhc3NlZCB0aHJvdWdoIHByb3Blcmx5LgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uKSBhcyBleGM6CiAgICAgICAgICAgIHdpdGggdGFyZmlsZS5vcGVuKHRhcm5hbWUpIGFzIHRhcjoKICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IKICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZXhjLmV4Y2VwdGlvbiwgSU9FcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nIGV4Y2VwdGlvbiByYWlzZWQgaW4gY29udGV4dCBtYW5hZ2VyIikKICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLmNsb3NlZCwgImNvbnRleHQgbWFuYWdlciBmYWlsZWQiKQoKICAgIGRlZiB0ZXN0X25vX2VvZihzZWxmKToKICAgICAgICAjIF9fZXhpdF9fKCkgbXVzdCBub3Qgd3JpdGUgZW5kLW9mLWFyY2hpdmUgYmxvY2tzIGlmIGFuCiAgICAgICAgIyBleGNlcHRpb24gd2FzIHJhaXNlZC4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IikgYXMgdGFyOgogICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBwYXNzCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmdldHNpemUodG1wbmFtZSksIDAsCiAgICAgICAgICAgICAgICAiY29udGV4dCBtYW5hZ2VyIHdyb3RlIGFuIGVuZC1vZi1hcmNoaXZlIGJsb2NrIikKICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLmNsb3NlZCwgImNvbnRleHQgbWFuYWdlciBmYWlsZWQiKQoKICAgIGRlZiB0ZXN0X2VvZihzZWxmKToKICAgICAgICAjIF9fZXhpdF9fKCkgbXVzdCB3cml0ZSBlbmQtb2YtYXJjaGl2ZSBibG9ja3MsIGkuZS4gY2FsbAogICAgICAgICMgVGFyRmlsZS5jbG9zZSgpIGlmIHRoZXJlIHdhcyBubyBlcnJvci4KICAgICAgICB3aXRoIHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIpOgogICAgICAgICAgICBwYXNzCiAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChvcy5wYXRoLmdldHNpemUodG1wbmFtZSksIDAsCiAgICAgICAgICAgICAgICAiY29udGV4dCBtYW5hZ2VyIHdyb3RlIG5vIGVuZC1vZi1hcmNoaXZlIGJsb2NrIikKCiAgICBkZWYgdGVzdF9maWxlb2JqKHNlbGYpOgogICAgICAgICMgVGVzdCB0aGF0IF9fZXhpdF9fKCkgZGlkIG5vdCBjbG9zZSB0aGUgZXh0ZXJuYWwgZmlsZQogICAgICAgICMgb2JqZWN0LgogICAgICAgIGZvYmogPSBvcGVuKHRtcG5hbWUsICJ3YiIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIHRhcmZpbGUub3BlbihmaWxlb2JqPWZvYmosIG1vZGU9InciKSBhcyB0YXI6CiAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24KICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZvYmouY2xvc2VkLCAiZXh0ZXJuYWwgZmlsZSBvYmplY3Qgd2FzIGNsb3NlZCIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5jbG9zZWQsICJjb250ZXh0IG1hbmFnZXIgZmFpbGVkIikKICAgICAgICBmb2JqLmNsb3NlKCkKCgpjbGFzcyBMaW5rRW11bGF0aW9uVGVzdChSZWFkVGVzdCk6CgogICAgIyBUZXN0IGZvciBpc3N1ZSAjODc0MSByZWdyZXNzaW9uLiBPbiBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydAogICAgIyBzeW1ib2xpYyBvciBoYXJkIGxpbmtzIHRhcmZpbGUgdHJpZXMgdG8gZXh0cmFjdCB0aGVzZSB0eXBlcyBvZiBtZW1iZXJzIGFzCiAgICAjIHRoZSByZWd1bGFyIGZpbGVzIHRoZXkgcG9pbnQgdG8uCiAgICBkZWYgX3Rlc3RfbGlua19leHRyYWN0aW9uKHNlbGYsIG5hbWUpOgogICAgICAgIHNlbGYudGFyLmV4dHJhY3QobmFtZSwgVEVNUERJUikKICAgICAgICBkYXRhID0gb3Blbihvcy5wYXRoLmpvaW4oVEVNUERJUiwgbmFtZSksICJyYiIpLnJlYWQoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWQ1c3VtKGRhdGEpLCBtZDVfcmVndHlwZSkKCiAgICBkZWYgdGVzdF9oYXJkbGlua19leHRyYWN0aW9uMShzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X2xpbmtfZXh0cmFjdGlvbigidXN0YXIvbG5rdHlwZSIpCgogICAgZGVmIHRlc3RfaGFyZGxpbmtfZXh0cmFjdGlvbjIoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF9saW5rX2V4dHJhY3Rpb24oIi4vdXN0YXIvbGlua3Rlc3QyL2xua3R5cGUiKQoKICAgIGRlZiB0ZXN0X3N5bWxpbmtfZXh0cmFjdGlvbjEoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF9saW5rX2V4dHJhY3Rpb24oInVzdGFyL3N5bXR5cGUiKQoKICAgIGRlZiB0ZXN0X3N5bWxpbmtfZXh0cmFjdGlvbjIoc2VsZik6CiAgICAgICAgc2VsZi5fdGVzdF9saW5rX2V4dHJhY3Rpb24oIi4vdXN0YXIvbGlua3Rlc3QyL3N5bXR5cGUiKQoKCmNsYXNzIEd6aXBNaXNjUmVhZFRlc3QoTWlzY1JlYWRUZXN0KToKICAgIHRhcm5hbWUgPSBnemlwbmFtZQogICAgbW9kZSA9ICJyOmd6IgpjbGFzcyBHemlwVXN0YXJSZWFkVGVzdChVc3RhclJlYWRUZXN0KToKICAgIHRhcm5hbWUgPSBnemlwbmFtZQogICAgbW9kZSA9ICJyOmd6IgpjbGFzcyBHemlwU3RyZWFtUmVhZFRlc3QoU3RyZWFtUmVhZFRlc3QpOgogICAgdGFybmFtZSA9IGd6aXBuYW1lCiAgICBtb2RlID0gInJ8Z3oiCmNsYXNzIEd6aXBXcml0ZVRlc3QoV3JpdGVUZXN0KToKICAgIG1vZGUgPSAidzpneiIKY2xhc3MgR3ppcFN0cmVhbVdyaXRlVGVzdChTdHJlYW1Xcml0ZVRlc3QpOgogICAgbW9kZSA9ICJ3fGd6IgoKCmNsYXNzIEJ6Mk1pc2NSZWFkVGVzdChNaXNjUmVhZFRlc3QpOgogICAgdGFybmFtZSA9IGJ6Mm5hbWUKICAgIG1vZGUgPSAicjpiejIiCmNsYXNzIEJ6MlVzdGFyUmVhZFRlc3QoVXN0YXJSZWFkVGVzdCk6CiAgICB0YXJuYW1lID0gYnoybmFtZQogICAgbW9kZSA9ICJyOmJ6MiIKY2xhc3MgQnoyU3RyZWFtUmVhZFRlc3QoU3RyZWFtUmVhZFRlc3QpOgogICAgdGFybmFtZSA9IGJ6Mm5hbWUKICAgIG1vZGUgPSAicnxiejIiCmNsYXNzIEJ6MldyaXRlVGVzdChXcml0ZVRlc3QpOgogICAgbW9kZSA9ICJ3OmJ6MiIKY2xhc3MgQnoyU3RyZWFtV3JpdGVUZXN0KFN0cmVhbVdyaXRlVGVzdCk6CiAgICBtb2RlID0gInd8YnoyIgoKY2xhc3MgQnoyUGFydGlhbFJlYWRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICMgSXNzdWU1MDY4OiBUaGUgX0JaMlByb3h5LnJlYWQoKSBtZXRob2QgbG9vcHMgZm9yZXZlcgogICAgIyBvbiBhbiBlbXB0eSBvciBwYXJ0aWFsIGJ6aXBwZWQgZmlsZS4KCiAgICBkZWYgX3Rlc3RfcGFydGlhbF9pbnB1dChzZWxmLCBtb2RlKToKICAgICAgICBjbGFzcyBNeVN0cmluZ0lPKFN0cmluZ0lPLlN0cmluZ0lPKToKICAgICAgICAgICAgaGl0X2VvZiA9IEZhbHNlCiAgICAgICAgICAgIGRlZiByZWFkKHNlbGYsIG4pOgogICAgICAgICAgICAgICAgaWYgc2VsZi5oaXRfZW9mOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJpbmZpbml0ZSBsb29wIGRldGVjdGVkIGluIHRhcmZpbGUub3BlbigpIikKICAgICAgICAgICAgICAgIHNlbGYuaGl0X2VvZiA9IHNlbGYucG9zID09IHNlbGYubGVuCiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nSU8uU3RyaW5nSU8ucmVhZChzZWxmLCBuKQogICAgICAgICAgICBkZWYgc2VlayhzZWxmLCAqYXJncyk6CiAgICAgICAgICAgICAgICBzZWxmLmhpdF9lb2YgPSBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZ0lPLlN0cmluZ0lPLnNlZWsoc2VsZiwgKmFyZ3MpCgogICAgICAgIGRhdGEgPSBiejIuY29tcHJlc3ModGFyZmlsZS5UYXJJbmZvKCJmb28iKS50b2J1ZigpKQogICAgICAgIGZvciB4IGluIHJhbmdlKGxlbihkYXRhKSArIDEpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0YXJmaWxlLm9wZW4oZmlsZW9iaj1NeVN0cmluZ0lPKGRhdGFbOnhdKSwgbW9kZT1tb2RlKQogICAgICAgICAgICBleGNlcHQgdGFyZmlsZS5SZWFkRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzICMgd2UgaGF2ZSBubyBpbnRlcmVzdCBpbiBSZWFkRXJyb3JzCgogICAgZGVmIHRlc3RfcGFydGlhbF9pbnB1dChzZWxmKToKICAgICAgICBzZWxmLl90ZXN0X3BhcnRpYWxfaW5wdXQoInIiKQoKICAgIGRlZiB0ZXN0X3BhcnRpYWxfaW5wdXRfYnoyKHNlbGYpOgogICAgICAgIHNlbGYuX3Rlc3RfcGFydGlhbF9pbnB1dCgicjpiejIiKQoKCmRlZiB0ZXN0X21haW4oKToKICAgIG9zLm1ha2VkaXJzKFRFTVBESVIpCgogICAgdGVzdHMgPSBbCiAgICAgICAgVXN0YXJSZWFkVGVzdCwKICAgICAgICBNaXNjUmVhZFRlc3QsCiAgICAgICAgU3RyZWFtUmVhZFRlc3QsCiAgICAgICAgRGV0ZWN0UmVhZFRlc3QsCiAgICAgICAgTWVtYmVyUmVhZFRlc3QsCiAgICAgICAgR05VUmVhZFRlc3QsCiAgICAgICAgUGF4UmVhZFRlc3QsCiAgICAgICAgV3JpdGVUZXN0LAogICAgICAgIFN0cmVhbVdyaXRlVGVzdCwKICAgICAgICBHTlVXcml0ZVRlc3QsCiAgICAgICAgUGF4V3JpdGVUZXN0LAogICAgICAgIFVzdGFyVW5pY29kZVRlc3QsCiAgICAgICAgR05VVW5pY29kZVRlc3QsCiAgICAgICAgUGF4VW5pY29kZVRlc3QsCiAgICAgICAgQXBwZW5kVGVzdCwKICAgICAgICBMaW1pdHNUZXN0LAogICAgICAgIENvbnRleHRNYW5hZ2VyVGVzdCwKICAgIF0KCiAgICBpZiBoYXNhdHRyKG9zLCAibGluayIpOgogICAgICAgIHRlc3RzLmFwcGVuZChIYXJkbGlua1Rlc3QpCiAgICBlbHNlOgogICAgICAgIHRlc3RzLmFwcGVuZChMaW5rRW11bGF0aW9uVGVzdCkKCiAgICBmb2JqID0gb3Blbih0YXJuYW1lLCAicmIiKQogICAgZGF0YSA9IGZvYmoucmVhZCgpCiAgICBmb2JqLmNsb3NlKCkKCiAgICBpZiBnemlwOgogICAgICAgICMgQ3JlYXRlIHRlc3R0YXIudGFyLmd6IGFuZCBhZGQgZ3ppcC1zcGVjaWZpYyB0ZXN0cy4KICAgICAgICB0YXIgPSBnemlwLm9wZW4oZ3ppcG5hbWUsICJ3YiIpCiAgICAgICAgdGFyLndyaXRlKGRhdGEpCiAgICAgICAgdGFyLmNsb3NlKCkKCiAgICAgICAgdGVzdHMgKz0gWwogICAgICAgICAgICBHemlwTWlzY1JlYWRUZXN0LAogICAgICAgICAgICBHemlwVXN0YXJSZWFkVGVzdCwKICAgICAgICAgICAgR3ppcFN0cmVhbVJlYWRUZXN0LAogICAgICAgICAgICBHemlwV3JpdGVUZXN0LAogICAgICAgICAgICBHemlwU3RyZWFtV3JpdGVUZXN0LAogICAgICAgIF0KCiAgICBpZiBiejI6CiAgICAgICAgIyBDcmVhdGUgdGVzdHRhci50YXIuYnoyIGFuZCBhZGQgYnoyLXNwZWNpZmljIHRlc3RzLgogICAgICAgIHRhciA9IGJ6Mi5CWjJGaWxlKGJ6Mm5hbWUsICJ3YiIpCiAgICAgICAgdGFyLndyaXRlKGRhdGEpCiAgICAgICAgdGFyLmNsb3NlKCkKCiAgICAgICAgdGVzdHMgKz0gWwogICAgICAgICAgICBCejJNaXNjUmVhZFRlc3QsCiAgICAgICAgICAgIEJ6MlVzdGFyUmVhZFRlc3QsCiAgICAgICAgICAgIEJ6MlN0cmVhbVJlYWRUZXN0LAogICAgICAgICAgICBCejJXcml0ZVRlc3QsCiAgICAgICAgICAgIEJ6MlN0cmVhbVdyaXRlVGVzdCwKICAgICAgICAgICAgQnoyUGFydGlhbFJlYWRUZXN0LAogICAgICAgIF0KCiAgICB0cnk6CiAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCiAgICBmaW5hbGx5OgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKFRFTVBESVIpOgogICAgICAgICAgICBzaHV0aWwucm10cmVlKFRFTVBESVIpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdGVzdF9tYWluKCkK