Iy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weTogdGVzdHMgZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYW5kCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlcy4KIwojIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KIwojIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgojCiMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KIwojIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAojIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiMKIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAojICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQojICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgoKaW1wb3J0IHVuaXR0ZXN0CmltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQpmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoKZGVmIGZ1bmNfcmV0dXJudGV4dCgpOgogICAgcmV0dXJuICJmb28iCmRlZiBmdW5jX3JldHVybnVuaWNvZGUoKToKICAgIHJldHVybiB1ImJhciIKZGVmIGZ1bmNfcmV0dXJuaW50KCk6CiAgICByZXR1cm4gNDIKZGVmIGZ1bmNfcmV0dXJuZmxvYXQoKToKICAgIHJldHVybiAzLjE0CmRlZiBmdW5jX3JldHVybm51bGwoKToKICAgIHJldHVybiBOb25lCmRlZiBmdW5jX3JldHVybmJsb2IoKToKICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKICAgICAgICByZXR1cm4gYnVmZmVyKCJibG9iIikKZGVmIGZ1bmNfcmV0dXJubG9uZ2xvbmcoKToKICAgIHJldHVybiAxPDwzMQpkZWYgZnVuY19yYWlzZWV4Y2VwdGlvbigpOgogICAgNSAvLyAwCgpkZWYgZnVuY19pc3N0cmluZyh2KToKICAgIHJldHVybiB0eXBlKHYpIGlzIHVuaWNvZGUKZGVmIGZ1bmNfaXNpbnQodik6CiAgICByZXR1cm4gdHlwZSh2KSBpcyBpbnQKZGVmIGZ1bmNfaXNmbG9hdCh2KToKICAgIHJldHVybiB0eXBlKHYpIGlzIGZsb2F0CmRlZiBmdW5jX2lzbm9uZSh2KToKICAgIHJldHVybiB0eXBlKHYpIGlzIHR5cGUoTm9uZSkKZGVmIGZ1bmNfaXNibG9iKHYpOgogICAgcmV0dXJuIHR5cGUodikgaXMgYnVmZmVyCmRlZiBmdW5jX2lzbG9uZ2xvbmcodik6CiAgICByZXR1cm4gaXNpbnN0YW5jZSh2LCAoaW50LCBsb25nKSkgYW5kIHYgPj0gMTw8MzEKCmNsYXNzIEFnZ3JOb1N0ZXA6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gMQoKY2xhc3MgQWdnck5vRmluYWxpemU6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBzdGVwKHNlbGYsIHgpOgogICAgICAgIHBhc3MKCmNsYXNzIEFnZ3JFeGNlcHRpb25JbkluaXQ6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgNSAvLyAwCgogICAgZGVmIHN0ZXAoc2VsZiwgeCk6CiAgICAgICAgcGFzcwoKICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKICAgICAgICBwYXNzCgpjbGFzcyBBZ2dyRXhjZXB0aW9uSW5TdGVwOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgc3RlcChzZWxmLCB4KToKICAgICAgICA1IC8vIDAKCiAgICBkZWYgZmluYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIDQyCgpjbGFzcyBBZ2dyRXhjZXB0aW9uSW5GaW5hbGl6ZToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHN0ZXAoc2VsZiwgeCk6CiAgICAgICAgcGFzcwoKICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKICAgICAgICA1IC8vIDAKCmNsYXNzIEFnZ3JDaGVja1R5cGU6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi52YWwgPSBOb25lCgogICAgZGVmIHN0ZXAoc2VsZiwgd2hpY2hUeXBlLCB2YWwpOgogICAgICAgIHRoZVR5cGUgPSB7InN0ciI6IHVuaWNvZGUsICJpbnQiOiBpbnQsICJmbG9hdCI6IGZsb2F0LCAiTm9uZSI6IHR5cGUoTm9uZSksICJibG9iIjogYnVmZmVyfQogICAgICAgIHNlbGYudmFsID0gaW50KHRoZVR5cGVbd2hpY2hUeXBlXSBpcyB0eXBlKHZhbCkpCgogICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnZhbAoKY2xhc3MgQWdnclN1bToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLnZhbCA9IDAuMAoKICAgIGRlZiBzdGVwKHNlbGYsIHZhbCk6CiAgICAgICAgc2VsZi52YWwgKz0gdmFsCgogICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnZhbAoKY2xhc3MgRnVuY3Rpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQoKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybnRleHQiLCAwLCBmdW5jX3JldHVybnRleHQpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm51bmljb2RlIiwgMCwgZnVuY19yZXR1cm51bmljb2RlKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJuaW50IiwgMCwgZnVuY19yZXR1cm5pbnQpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5mbG9hdCIsIDAsIGZ1bmNfcmV0dXJuZmxvYXQpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5udWxsIiwgMCwgZnVuY19yZXR1cm5udWxsKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJuYmxvYiIsIDAsIGZ1bmNfcmV0dXJuYmxvYikKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybmxvbmdsb25nIiwgMCwgZnVuY19yZXR1cm5sb25nbG9uZykKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJhaXNlZXhjZXB0aW9uIiwgMCwgZnVuY19yYWlzZWV4Y2VwdGlvbikKCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc3N0cmluZyIsIDEsIGZ1bmNfaXNzdHJpbmcpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2ludCIsIDEsIGZ1bmNfaXNpbnQpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2Zsb2F0IiwgMSwgZnVuY19pc2Zsb2F0KQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiaXNub25lIiwgMSwgZnVuY19pc25vbmUpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2Jsb2IiLCAxLCBmdW5jX2lzYmxvYikKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzbG9uZ2xvbmciLCAxLCBmdW5jX2lzbG9uZ2xvbmcpCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHNlbGYuY29uLmNsb3NlKCkKCiAgICBkZWYgQ2hlY2tGdW5jRXJyb3JPbkNyZWF0ZShzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiYmxhIiwgLTEwMCwgbGFtYmRhIHg6IDIqeCkKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrRnVuY1JlZkNvdW50KHNlbGYpOgogICAgICAgIGRlZiBnZXRmdW5jKCk6CiAgICAgICAgICAgIGRlZiBmKCk6CiAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICByZXR1cm4gZgogICAgICAgIGYgPSBnZXRmdW5jKCkKICAgICAgICBnbG9iYWxzKClbImZvbyJdID0gZgogICAgICAgICMgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZWZ0ZXN0IiwgMCwgZ2V0ZnVuYygpKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmVmdGVzdCIsIDAsIGYpCiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJlZnRlc3QoKSIpCgogICAgZGVmIENoZWNrRnVuY1JldHVyblRleHQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybnRleHQoKSIpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsKSwgdW5pY29kZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgImZvbyIpCgogICAgZGVmIENoZWNrRnVuY1JldHVyblVuaWNvZGUoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybnVuaWNvZGUoKSIpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsKSwgdW5pY29kZSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgdSJiYXIiKQoKICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5JbnQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmludCgpIikKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBpbnQpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDQyKQoKICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5GbG9hdChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuZmxvYXQoKSIpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsKSwgZmxvYXQpCiAgICAgICAgaWYgdmFsIDwgMy4xMzkgb3IgdmFsID4gMy4xNDE6CiAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgdmFsdWUiKQoKICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5OdWxsKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5udWxsKCkiKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIHR5cGUoTm9uZSkpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIE5vbmUpCgogICAgZGVmIENoZWNrRnVuY1JldHVybkJsb2Ioc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmJsb2IoKSIpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBidWZmZXIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCBidWZmZXIoImJsb2IiKSkKCiAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuTG9uZ0xvbmcoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmxvbmdsb25nKCkiKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDE8PDMxKQoKICAgIGRlZiBDaGVja0Z1bmNFeGNlcHRpb24oc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmFpc2VleGNlcHRpb24oKSIpCiAgICAgICAgICAgIGN1ci5mZXRjaG9uZSgpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgZToKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0sICd1c2VyLWRlZmluZWQgZnVuY3Rpb24gcmFpc2VkIGV4Y2VwdGlvbicpCgogICAgZGVmIENoZWNrUGFyYW1TdHJpbmcoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzc3RyaW5nKD8pIiwgKCJmb28iLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tQYXJhbUludChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNpbnQoPykiLCAoNDIsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQoKICAgIGRlZiBDaGVja1BhcmFtRmxvYXQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzZmxvYXQoPykiLCAoMy4xNCwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrUGFyYW1Ob25lKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc25vbmUoPykiLCAoTm9uZSwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrUGFyYW1CbG9iKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgogICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzYmxvYig/KSIsIChidWZmZXIoImJsb2IiKSwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrUGFyYW1Mb25nTG9uZyhzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNsb25nbG9uZyg/KSIsICgxPDw0MiwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCgpjbGFzcyBBZ2dyZWdhdGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoIiIiCiAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSB0ZXN0KAogICAgICAgICAgICAgICAgdCB0ZXh0LAogICAgICAgICAgICAgICAgaSBpbnRlZ2VyLAogICAgICAgICAgICAgICAgZiBmbG9hdCwKICAgICAgICAgICAgICAgIG4sCiAgICAgICAgICAgICAgICBiIGJsb2IKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgIiIiKQogICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKICAgICAgICAgICAgY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodCwgaSwgZiwgbiwgYikgdmFsdWVzICg/LCA/LCA/LCA/LCA/KSIsCiAgICAgICAgICAgICAgICAoImZvbyIsIDUsIDMuMTQsIE5vbmUsIGJ1ZmZlcigiYmxvYiIpLCkpCgogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoIm5vc3RlcCIsIDEsIEFnZ3JOb1N0ZXApCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgibm9maW5hbGl6ZSIsIDEsIEFnZ3JOb0ZpbmFsaXplKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoImV4Y0luaXQiLCAxLCBBZ2dyRXhjZXB0aW9uSW5Jbml0KQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoImV4Y1N0ZXAiLCAxLCBBZ2dyRXhjZXB0aW9uSW5TdGVwKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoImV4Y0ZpbmFsaXplIiwgMSwgQWdnckV4Y2VwdGlvbkluRmluYWxpemUpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiY2hlY2tUeXBlIiwgMiwgQWdnckNoZWNrVHlwZSkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJteXN1bSIsIDEsIEFnZ3JTdW0pCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICNzZWxmLmN1ci5jbG9zZSgpCiAgICAgICAgI3NlbGYuY29uLmNsb3NlKCkKICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrQWdnckVycm9yT25DcmVhdGUoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImJsYSIsIC0xMDAsIEFnZ3JTdW0pCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBDaGVja0FnZ3JOb1N0ZXAoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9zdGVwKHQpIGZyb20gdGVzdCIpCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIEF0dHJpYnV0ZUVycm9yIikKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIGU6CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAiQWdnck5vU3RlcCBpbnN0YW5jZSBoYXMgbm8gYXR0cmlidXRlICdzdGVwJyIpCgogICAgZGVmIENoZWNrQWdnck5vRmluYWxpemUoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9maW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQogICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdmaW5hbGl6ZScgbWV0aG9kIHJhaXNlZCBlcnJvciIpCgogICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluSW5pdChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIHRyeToKICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBleGNJbml0KHQpIGZyb20gdGVzdCIpCiAgICAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgZToKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ19faW5pdF9fJyBtZXRob2QgcmFpc2VkIGVycm9yIikKCiAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5TdGVwKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y1N0ZXAodCkgZnJvbSB0ZXN0IikKICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnc3RlcCcgbWV0aG9kIHJhaXNlZCBlcnJvciIpCgogICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluRmluYWxpemUoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjRmluYWxpemUodCkgZnJvbSB0ZXN0IikKICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnZmluYWxpemUnIG1ldGhvZCByYWlzZWQgZXJyb3IiKQoKICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtU3RyKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ3N0cicsID8pIiwgKCJmb28iLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUludChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdpbnQnLCA/KSIsICg0MiwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1GbG9hdChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdmbG9hdCcsID8pIiwgKDMuMTQsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQoKICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtTm9uZShzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdOb25lJywgPykiLCAoTm9uZSwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1CbG9iKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgogICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnYmxvYicsID8pIiwgKGJ1ZmZlcigiYmxvYiIpLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tBZ2dyU3VtKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQogICAgICAgIGN1ci5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgWygxMCwpLCAoMjAsKSwgKDMwLCldKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgbXlzdW0oaSkgZnJvbSB0ZXN0IikKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCA2MCkKCmNsYXNzIEF1dGhvcml6ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgYXV0aG9yaXplcl9jYihhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgc291cmNlKToKICAgICAgICBpZiBhY3Rpb24gIT0gc3FsaXRlLlNRTElURV9TRUxFQ1Q6CiAgICAgICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX0RFTlkKICAgICAgICBpZiBhcmcyID09ICdjMicgb3IgYXJnMSA9PSAndDInOgogICAgICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9ERU5ZCiAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfT0sKCiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQogICAgICAgIHNlbGYuY29uLmV4ZWN1dGVzY3JpcHQoIiIiCiAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSB0MSAoYzEsIGMyKTsKICAgICAgICAgICAgY3JlYXRlIHRhYmxlIHQyIChjMSwgYzIpOwogICAgICAgICAgICBpbnNlcnQgaW50byB0MSAoYzEsIGMyKSB2YWx1ZXMgKDEsIDIpOwogICAgICAgICAgICBpbnNlcnQgaW50byB0MiAoYzEsIGMyKSB2YWx1ZXMgKDQsIDUpOwogICAgICAgICAgICAiIiIpCgogICAgICAgICMgRm9yIG91ciBzZWN1cml0eSB0ZXN0OgogICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCBjMiBmcm9tIHQyIikKCiAgICAgICAgc2VsZi5jb24uc2V0X2F1dGhvcml6ZXIoc2VsZi5hdXRob3JpemVyX2NiKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHRlc3RfdGFibGVfYWNjZXNzKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ICogZnJvbSB0MiIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5EYXRhYmFzZUVycm9yLCBlOgogICAgICAgICAgICBpZiBub3QgZS5hcmdzWzBdLmVuZHN3aXRoKCJwcm9oaWJpdGVkIik6CiAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIGV4Y2VwdGlvbiB0ZXh0OiAlcyIgJSBlLmFyZ3NbMF0pCiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiBkdWUgdG8gbWlzc2luZyBwcml2aWxlZ2VzIikKCiAgICBkZWYgdGVzdF9jb2x1bW5fYWNjZXNzKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IGMyIGZyb20gdDEiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUuRGF0YWJhc2VFcnJvciwgZToKICAgICAgICAgICAgaWYgbm90IGUuYXJnc1swXS5lbmRzd2l0aCgicHJvaGliaXRlZCIpOgogICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyBleGNlcHRpb24gdGV4dDogJXMiICUgZS5hcmdzWzBdKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBleGNlcHRpb24gZHVlIHRvIG1pc3NpbmcgcHJpdmlsZWdlcyIpCgpjbGFzcyBBdXRob3JpemVyUmFpc2VFeGNlcHRpb25UZXN0cyhBdXRob3JpemVyVGVzdHMpOgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGF1dGhvcml6ZXJfY2IoYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIHNvdXJjZSk6CiAgICAgICAgaWYgYWN0aW9uICE9IHNxbGl0ZS5TUUxJVEVfU0VMRUNUOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgICAgICAgaWYgYXJnMiA9PSAnYzInIG9yIGFyZzEgPT0gJ3QyJzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgogICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX09LCgpjbGFzcyBBdXRob3JpemVySWxsZWdhbFR5cGVUZXN0cyhBdXRob3JpemVyVGVzdHMpOgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGF1dGhvcml6ZXJfY2IoYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIHNvdXJjZSk6CiAgICAgICAgaWYgYWN0aW9uICE9IHNxbGl0ZS5TUUxJVEVfU0VMRUNUOgogICAgICAgICAgICByZXR1cm4gMC4wCiAgICAgICAgaWYgYXJnMiA9PSAnYzInIG9yIGFyZzEgPT0gJ3QyJzoKICAgICAgICAgICAgcmV0dXJuIDAuMAogICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX09LCgpjbGFzcyBBdXRob3JpemVyTGFyZ2VJbnRlZ2VyVGVzdHMoQXV0aG9yaXplclRlc3RzKToKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBhdXRob3JpemVyX2NiKGFjdGlvbiwgYXJnMSwgYXJnMiwgZGJuYW1lLCBzb3VyY2UpOgogICAgICAgIGlmIGFjdGlvbiAhPSBzcWxpdGUuU1FMSVRFX1NFTEVDVDoKICAgICAgICAgICAgcmV0dXJuIDIqKjMyCiAgICAgICAgaWYgYXJnMiA9PSAnYzInIG9yIGFyZzEgPT0gJ3QyJzoKICAgICAgICAgICAgcmV0dXJuIDIqKjMyCiAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfT0sKCgpkZWYgc3VpdGUoKToKICAgIGZ1bmN0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEZ1bmN0aW9uVGVzdHMsICJDaGVjayIpCiAgICBhZ2dyZWdhdGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQWdncmVnYXRlVGVzdHMsICJDaGVjayIpCiAgICBhdXRob3JpemVyX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEF1dGhvcml6ZXJUZXN0cykKICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKAogICAgICAgICAgICBmdW5jdGlvbl9zdWl0ZSwKICAgICAgICAgICAgYWdncmVnYXRlX3N1aXRlLAogICAgICAgICAgICBhdXRob3JpemVyX3N1aXRlLAogICAgICAgICAgICB1bml0dGVzdC5tYWtlU3VpdGUoQXV0aG9yaXplclJhaXNlRXhjZXB0aW9uVGVzdHMpLAogICAgICAgICAgICB1bml0dGVzdC5tYWtlU3VpdGUoQXV0aG9yaXplcklsbGVnYWxUeXBlVGVzdHMpLAogICAgICAgICAgICB1bml0dGVzdC5tYWtlU3VpdGUoQXV0aG9yaXplckxhcmdlSW50ZWdlclRlc3RzKSwKICAgICAgICApKQoKZGVmIHRlc3QoKToKICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB0ZXN0KCkK