Iy0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weTogdGVzdHMgZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYW5kCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlcy4KIwojIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KIwojIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgojCiMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KIwojIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAojIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiMKIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAojICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQojICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgoKaW1wb3J0IHVuaXR0ZXN0CmltcG9ydCB1bml0dGVzdC5tb2NrCmltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQoKZGVmIGZ1bmNfcmV0dXJudGV4dCgpOgogICAgcmV0dXJuICJmb28iCmRlZiBmdW5jX3JldHVybnVuaWNvZGUoKToKICAgIHJldHVybiAiYmFyIgpkZWYgZnVuY19yZXR1cm5pbnQoKToKICAgIHJldHVybiA0MgpkZWYgZnVuY19yZXR1cm5mbG9hdCgpOgogICAgcmV0dXJuIDMuMTQKZGVmIGZ1bmNfcmV0dXJubnVsbCgpOgogICAgcmV0dXJuIE5vbmUKZGVmIGZ1bmNfcmV0dXJuYmxvYigpOgogICAgcmV0dXJuIGIiYmxvYiIKZGVmIGZ1bmNfcmV0dXJubG9uZ2xvbmcoKToKICAgIHJldHVybiAxPDwzMQpkZWYgZnVuY19yYWlzZWV4Y2VwdGlvbigpOgogICAgNS8wCgpkZWYgZnVuY19pc3N0cmluZyh2KToKICAgIHJldHVybiB0eXBlKHYpIGlzIHN0cgpkZWYgZnVuY19pc2ludCh2KToKICAgIHJldHVybiB0eXBlKHYpIGlzIGludApkZWYgZnVuY19pc2Zsb2F0KHYpOgogICAgcmV0dXJuIHR5cGUodikgaXMgZmxvYXQKZGVmIGZ1bmNfaXNub25lKHYpOgogICAgcmV0dXJuIHR5cGUodikgaXMgdHlwZShOb25lKQpkZWYgZnVuY19pc2Jsb2Iodik6CiAgICByZXR1cm4gaXNpbnN0YW5jZSh2LCAoYnl0ZXMsIG1lbW9yeXZpZXcpKQpkZWYgZnVuY19pc2xvbmdsb25nKHYpOgogICAgcmV0dXJuIGlzaW5zdGFuY2UodiwgaW50KSBhbmQgdiA+PSAxPDwzMQoKZGVmIGZ1bmMoKmFyZ3MpOgogICAgcmV0dXJuIGxlbihhcmdzKQoKY2xhc3MgQWdnck5vU3RlcDoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiAxCgpjbGFzcyBBZ2dyTm9GaW5hbGl6ZToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIHN0ZXAoc2VsZiwgeCk6CiAgICAgICAgcGFzcwoKY2xhc3MgQWdnckV4Y2VwdGlvbkluSW5pdDoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICA1LzAKCiAgICBkZWYgc3RlcChzZWxmLCB4KToKICAgICAgICBwYXNzCgogICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgIHBhc3MKCmNsYXNzIEFnZ3JFeGNlcHRpb25JblN0ZXA6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBzdGVwKHNlbGYsIHgpOgogICAgICAgIDUvMAoKICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gNDIKCmNsYXNzIEFnZ3JFeGNlcHRpb25JbkZpbmFsaXplOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgc3RlcChzZWxmLCB4KToKICAgICAgICBwYXNzCgogICAgZGVmIGZpbmFsaXplKHNlbGYpOgogICAgICAgIDUvMAoKY2xhc3MgQWdnckNoZWNrVHlwZToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLnZhbCA9IE5vbmUKCiAgICBkZWYgc3RlcChzZWxmLCB3aGljaFR5cGUsIHZhbCk6CiAgICAgICAgdGhlVHlwZSA9IHsic3RyIjogc3RyLCAiaW50IjogaW50LCAiZmxvYXQiOiBmbG9hdCwgIk5vbmUiOiB0eXBlKE5vbmUpLAogICAgICAgICAgICAgICAgICAgImJsb2IiOiBieXRlc30KICAgICAgICBzZWxmLnZhbCA9IGludCh0aGVUeXBlW3doaWNoVHlwZV0gaXMgdHlwZSh2YWwpKQoKICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi52YWwKCmNsYXNzIEFnZ3JDaGVja1R5cGVzOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYudmFsID0gMAoKICAgIGRlZiBzdGVwKHNlbGYsIHdoaWNoVHlwZSwgKnZhbHMpOgogICAgICAgIHRoZVR5cGUgPSB7InN0ciI6IHN0ciwgImludCI6IGludCwgImZsb2F0IjogZmxvYXQsICJOb25lIjogdHlwZShOb25lKSwKICAgICAgICAgICAgICAgICAgICJibG9iIjogYnl0ZXN9CiAgICAgICAgZm9yIHZhbCBpbiB2YWxzOgogICAgICAgICAgICBzZWxmLnZhbCArPSBpbnQodGhlVHlwZVt3aGljaFR5cGVdIGlzIHR5cGUodmFsKSkKCiAgICBkZWYgZmluYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudmFsCgpjbGFzcyBBZ2dyU3VtOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYudmFsID0gMC4wCgogICAgZGVmIHN0ZXAoc2VsZiwgdmFsKToKICAgICAgICBzZWxmLnZhbCArPSB2YWwKCiAgICBkZWYgZmluYWxpemUoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudmFsCgpjbGFzcyBGdW5jdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCgogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJudGV4dCIsIDAsIGZ1bmNfcmV0dXJudGV4dCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybnVuaWNvZGUiLCAwLCBmdW5jX3JldHVybnVuaWNvZGUpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5pbnQiLCAwLCBmdW5jX3JldHVybmludCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybmZsb2F0IiwgMCwgZnVuY19yZXR1cm5mbG9hdCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybm51bGwiLCAwLCBmdW5jX3JldHVybm51bGwpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5ibG9iIiwgMCwgZnVuY19yZXR1cm5ibG9iKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJubG9uZ2xvbmciLCAwLCBmdW5jX3JldHVybmxvbmdsb25nKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmFpc2VleGNlcHRpb24iLCAwLCBmdW5jX3JhaXNlZXhjZXB0aW9uKQoKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzc3RyaW5nIiwgMSwgZnVuY19pc3N0cmluZykKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzaW50IiwgMSwgZnVuY19pc2ludCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzZmxvYXQiLCAxLCBmdW5jX2lzZmxvYXQpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc25vbmUiLCAxLCBmdW5jX2lzbm9uZSkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzYmxvYiIsIDEsIGZ1bmNfaXNibG9iKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiaXNsb25nbG9uZyIsIDEsIGZ1bmNfaXNsb25nbG9uZykKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInNwYW0iLCAtMSwgZnVuYykKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgc2VsZi5jb24uY2xvc2UoKQoKICAgIGRlZiBDaGVja0Z1bmNFcnJvck9uQ3JlYXRlKHNlbGYpOgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpOgogICAgICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImJsYSIsIC0xMDAsIGxhbWJkYSB4OiAyKngpCgogICAgZGVmIENoZWNrRnVuY1JlZkNvdW50KHNlbGYpOgogICAgICAgIGRlZiBnZXRmdW5jKCk6CiAgICAgICAgICAgIGRlZiBmKCk6CiAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICByZXR1cm4gZgogICAgICAgIGYgPSBnZXRmdW5jKCkKICAgICAgICBnbG9iYWxzKClbImZvbyJdID0gZgogICAgICAgICMgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZWZ0ZXN0IiwgMCwgZ2V0ZnVuYygpKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmVmdGVzdCIsIDAsIGYpCiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJlZnRlc3QoKSIpCgogICAgZGVmIENoZWNrRnVuY1JldHVyblRleHQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybnRleHQoKSIpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsKSwgc3RyKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAiZm9vIikKCiAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuVW5pY29kZShzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJudW5pY29kZSgpIikKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBzdHIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsICJiYXIiKQoKICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5JbnQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmludCgpIikKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBpbnQpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDQyKQoKICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5GbG9hdChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuZmxvYXQoKSIpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsKSwgZmxvYXQpCiAgICAgICAgaWYgdmFsIDwgMy4xMzkgb3IgdmFsID4gMy4xNDE6CiAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgdmFsdWUiKQoKICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5OdWxsKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5udWxsKCkiKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIHR5cGUoTm9uZSkpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIE5vbmUpCgogICAgZGVmIENoZWNrRnVuY1JldHVybkJsb2Ioc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmJsb2IoKSIpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsKSwgYnl0ZXMpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIGIiYmxvYiIpCgogICAgZGVmIENoZWNrRnVuY1JldHVybkxvbmdMb25nKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5sb25nbG9uZygpIikKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxPDwzMSkKCiAgICBkZWYgQ2hlY2tGdW5jRXhjZXB0aW9uKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikgYXMgY206CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmFpc2VleGNlcHRpb24oKSIpCiAgICAgICAgICAgIGN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgJ3VzZXItZGVmaW5lZCBmdW5jdGlvbiByYWlzZWQgZXhjZXB0aW9uJykKCiAgICBkZWYgQ2hlY2tQYXJhbVN0cmluZyhzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNzdHJpbmcoPykiLCAoImZvbyIsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQoKICAgIGRlZiBDaGVja1BhcmFtSW50KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2ludCg/KSIsICg0MiwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrUGFyYW1GbG9hdChzZWxmKToKICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNmbG9hdCg/KSIsICgzLjE0LCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tQYXJhbU5vbmUoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzbm9uZSg/KSIsIChOb25lLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tQYXJhbUJsb2Ioc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzYmxvYig/KSIsIChtZW1vcnl2aWV3KGIiYmxvYiIpLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tQYXJhbUxvbmdMb25nKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2xvbmdsb25nKD8pIiwgKDE8PDQyLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tBbnlBcmd1bWVudHMoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHNwYW0oPywgPykiLCAoMSwgMikpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMikKCiAgICBkZWYgQ2hlY2tGdW5jTm9uRGV0ZXJtaW5pc3RpYyhzZWxmKToKICAgICAgICBtb2NrID0gdW5pdHRlc3QubW9jay5Nb2NrKHJldHVybl92YWx1ZT1Ob25lKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiZGV0ZXJtaW5pc3RpYyIsIDAsIG1vY2ssIGRldGVybWluaXN0aWM9RmFsc2UpCiAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IGRldGVybWluaXN0aWMoKSA9IGRldGVybWluaXN0aWMoKSIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrLmNhbGxfY291bnQsIDIpCgogICAgQHVuaXR0ZXN0LnNraXBJZihzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCA4LCAzKSwgImRldGVybWluaXN0aWMgcGFyYW1ldGVyIG5vdCBzdXBwb3J0ZWQiKQogICAgZGVmIENoZWNrRnVuY0RldGVybWluaXN0aWMoc2VsZik6CiAgICAgICAgbW9jayA9IHVuaXR0ZXN0Lm1vY2suTW9jayhyZXR1cm5fdmFsdWU9Tm9uZSkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImRldGVybWluaXN0aWMiLCAwLCBtb2NrLCBkZXRlcm1pbmlzdGljPVRydWUpCiAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IGRldGVybWluaXN0aWMoKSA9IGRldGVybWluaXN0aWMoKSIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrLmNhbGxfY291bnQsIDEpCgogICAgQHVuaXR0ZXN0LnNraXBJZihzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA+PSAoMywgOCwgMyksICJTUUxpdGUgPCAzLjguMyBuZWVkZWQiKQogICAgZGVmIENoZWNrRnVuY0RldGVybWluaXN0aWNOb3RTdXBwb3J0ZWQoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuTm90U3VwcG9ydGVkRXJyb3IpOgogICAgICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImRldGVybWluaXN0aWMiLCAwLCBpbnQsIGRldGVybWluaXN0aWM9VHJ1ZSkKCiAgICBkZWYgQ2hlY2tGdW5jRGV0ZXJtaW5pc3RpY0tleXdvcmRPbmx5KHNlbGYpOgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKICAgICAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJkZXRlcm1pbmlzdGljIiwgMCwgaW50LCBUcnVlKQoKCmNsYXNzIEFnZ3JlZ2F0ZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgiIiIKICAgICAgICAgICAgY3JlYXRlIHRhYmxlIHRlc3QoCiAgICAgICAgICAgICAgICB0IHRleHQsCiAgICAgICAgICAgICAgICBpIGludGVnZXIsCiAgICAgICAgICAgICAgICBmIGZsb2F0LAogICAgICAgICAgICAgICAgbiwKICAgICAgICAgICAgICAgIGIgYmxvYgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAiIiIpCiAgICAgICAgY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodCwgaSwgZiwgbiwgYikgdmFsdWVzICg/LCA/LCA/LCA/LCA/KSIsCiAgICAgICAgICAgICgiZm9vIiwgNSwgMy4xNCwgTm9uZSwgbWVtb3J5dmlldyhiImJsb2IiKSwpKQoKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJub3N0ZXAiLCAxLCBBZ2dyTm9TdGVwKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoIm5vZmluYWxpemUiLCAxLCBBZ2dyTm9GaW5hbGl6ZSkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJleGNJbml0IiwgMSwgQWdnckV4Y2VwdGlvbkluSW5pdCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJleGNTdGVwIiwgMSwgQWdnckV4Y2VwdGlvbkluU3RlcCkKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJleGNGaW5hbGl6ZSIsIDEsIEFnZ3JFeGNlcHRpb25JbkZpbmFsaXplKQogICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoImNoZWNrVHlwZSIsIDIsIEFnZ3JDaGVja1R5cGUpCiAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiY2hlY2tUeXBlcyIsIC0xLCBBZ2dyQ2hlY2tUeXBlcykKICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJteXN1bSIsIDEsIEFnZ3JTdW0pCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICNzZWxmLmN1ci5jbG9zZSgpCiAgICAgICAgI3NlbGYuY29uLmNsb3NlKCkKICAgICAgICBwYXNzCgogICAgZGVmIENoZWNrQWdnckVycm9yT25DcmVhdGUoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcik6CiAgICAgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiYmxhIiwgLTEwMCwgQWdnclN1bSkKCiAgICBkZWYgQ2hlY2tBZ2dyTm9TdGVwKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcikgYXMgY206CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9zdGVwKHQpIGZyb20gdGVzdCIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgIidBZ2dyTm9TdGVwJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnc3RlcCciKQoKICAgIGRlZiBDaGVja0FnZ3JOb0ZpbmFsaXplKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikgYXMgY206CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9maW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQogICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ2ZpbmFsaXplJyBtZXRob2QgcmFpc2VkIGVycm9yIikKCiAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5Jbml0KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikgYXMgY206CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjSW5pdCh0KSBmcm9tIHRlc3QiKQogICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ19faW5pdF9fJyBtZXRob2QgcmFpc2VkIGVycm9yIikKCiAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5TdGVwKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikgYXMgY206CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjU3RlcCh0KSBmcm9tIHRlc3QiKQogICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ3N0ZXAnIG1ldGhvZCByYWlzZWQgZXJyb3IiKQoKICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JbkZpbmFsaXplKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcikgYXMgY206CiAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjRmluYWxpemUodCkgZnJvbSB0ZXN0IikKICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdmaW5hbGl6ZScgbWV0aG9kIHJhaXNlZCBlcnJvciIpCgogICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1TdHIoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnc3RyJywgPykiLCAoImZvbyIsKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQoKICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtSW50KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ2ludCcsID8pIiwgKDQyLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbXNJbnQoc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZXMoJ2ludCcsID8sID8pIiwgKDQyLCAyNCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMikKCiAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUZsb2F0KHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ2Zsb2F0JywgPykiLCAoMy4xNCwpKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCgogICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1Ob25lKHNlbGYpOgogICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ05vbmUnLCA/KSIsIChOb25lLCkpCiAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKCiAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUJsb2Ioc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnYmxvYicsID8pIiwgKG1lbW9yeXZpZXcoYiJibG9iIiksKSkKICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQoKICAgIGRlZiBDaGVja0FnZ3JDaGVja0FnZ3JTdW0oc2VsZik6CiAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICBjdXIuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCiAgICAgICAgY3VyLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCBbKDEwLCksICgyMCwpLCAoMzAsKV0pCiAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBteXN1bShpKSBmcm9tIHRlc3QiKQogICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDYwKQoKY2xhc3MgQXV0aG9yaXplclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBhdXRob3JpemVyX2NiKGFjdGlvbiwgYXJnMSwgYXJnMiwgZGJuYW1lLCBzb3VyY2UpOgogICAgICAgIGlmIGFjdGlvbiAhPSBzcWxpdGUuU1FMSVRFX1NFTEVDVDoKICAgICAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfREVOWQogICAgICAgIGlmIGFyZzIgPT0gJ2MyJyBvciBhcmcxID09ICd0Mic6CiAgICAgICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX0RFTlkKICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9PSwoKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgc2VsZi5jb24uZXhlY3V0ZXNjcmlwdCgiIiIKICAgICAgICAgICAgY3JlYXRlIHRhYmxlIHQxIChjMSwgYzIpOwogICAgICAgICAgICBjcmVhdGUgdGFibGUgdDIgKGMxLCBjMik7CiAgICAgICAgICAgIGluc2VydCBpbnRvIHQxIChjMSwgYzIpIHZhbHVlcyAoMSwgMik7CiAgICAgICAgICAgIGluc2VydCBpbnRvIHQyIChjMSwgYzIpIHZhbHVlcyAoNCwgNSk7CiAgICAgICAgICAgICIiIikKCiAgICAgICAgIyBGb3Igb3VyIHNlY3VyaXR5IHRlc3Q6CiAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IGMyIGZyb20gdDIiKQoKICAgICAgICBzZWxmLmNvbi5zZXRfYXV0aG9yaXplcihzZWxmLmF1dGhvcml6ZXJfY2IpCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgdGVzdF90YWJsZV9hY2Nlc3Moc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuRGF0YWJhc2VFcnJvcikgYXMgY206CiAgICAgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAqIGZyb20gdDIiKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3Byb2hpYml0ZWQnLCBzdHIoY20uZXhjZXB0aW9uKSkKCiAgICBkZWYgdGVzdF9jb2x1bW5fYWNjZXNzKHNlbGYpOgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLkRhdGFiYXNlRXJyb3IpIGFzIGNtOgogICAgICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgYzIgZnJvbSB0MSIpCiAgICAgICAgc2VsZi5hc3NlcnRJbigncHJvaGliaXRlZCcsIHN0cihjbS5leGNlcHRpb24pKQoKY2xhc3MgQXV0aG9yaXplclJhaXNlRXhjZXB0aW9uVGVzdHMoQXV0aG9yaXplclRlc3RzKToKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBhdXRob3JpemVyX2NiKGFjdGlvbiwgYXJnMSwgYXJnMiwgZGJuYW1lLCBzb3VyY2UpOgogICAgICAgIGlmIGFjdGlvbiAhPSBzcWxpdGUuU1FMSVRFX1NFTEVDVDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgogICAgICAgIGlmIGFyZzIgPT0gJ2MyJyBvciBhcmcxID09ICd0Mic6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9PSwoKY2xhc3MgQXV0aG9yaXplcklsbGVnYWxUeXBlVGVzdHMoQXV0aG9yaXplclRlc3RzKToKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBhdXRob3JpemVyX2NiKGFjdGlvbiwgYXJnMSwgYXJnMiwgZGJuYW1lLCBzb3VyY2UpOgogICAgICAgIGlmIGFjdGlvbiAhPSBzcWxpdGUuU1FMSVRFX1NFTEVDVDoKICAgICAgICAgICAgcmV0dXJuIDAuMAogICAgICAgIGlmIGFyZzIgPT0gJ2MyJyBvciBhcmcxID09ICd0Mic6CiAgICAgICAgICAgIHJldHVybiAwLjAKICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9PSwoKY2xhc3MgQXV0aG9yaXplckxhcmdlSW50ZWdlclRlc3RzKEF1dGhvcml6ZXJUZXN0cyk6CiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgYXV0aG9yaXplcl9jYihhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgc291cmNlKToKICAgICAgICBpZiBhY3Rpb24gIT0gc3FsaXRlLlNRTElURV9TRUxFQ1Q6CiAgICAgICAgICAgIHJldHVybiAyKiozMgogICAgICAgIGlmIGFyZzIgPT0gJ2MyJyBvciBhcmcxID09ICd0Mic6CiAgICAgICAgICAgIHJldHVybiAyKiozMgogICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX09LCgoKZGVmIHN1aXRlKCk6CiAgICBmdW5jdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShGdW5jdGlvblRlc3RzLCAiQ2hlY2siKQogICAgYWdncmVnYXRlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEFnZ3JlZ2F0ZVRlc3RzLCAiQ2hlY2siKQogICAgYXV0aG9yaXplcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShBdXRob3JpemVyVGVzdHMpCiAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKCgKICAgICAgICAgICAgZnVuY3Rpb25fc3VpdGUsCiAgICAgICAgICAgIGFnZ3JlZ2F0ZV9zdWl0ZSwKICAgICAgICAgICAgYXV0aG9yaXplcl9zdWl0ZSwKICAgICAgICAgICAgdW5pdHRlc3QubWFrZVN1aXRlKEF1dGhvcml6ZXJSYWlzZUV4Y2VwdGlvblRlc3RzKSwKICAgICAgICAgICAgdW5pdHRlc3QubWFrZVN1aXRlKEF1dGhvcml6ZXJJbGxlZ2FsVHlwZVRlc3RzKSwKICAgICAgICAgICAgdW5pdHRlc3QubWFrZVN1aXRlKEF1dGhvcml6ZXJMYXJnZUludGVnZXJUZXN0cyksCiAgICAgICAgKSkKCmRlZiB0ZXN0KCk6CiAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCiAgICBydW5uZXIucnVuKHN1aXRlKCkpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdGVzdCgpCg==