Iy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiMgcHlzcWxpdGUyL3Rlc3QvdHlwZXMucHk6IHRlc3RzIGZvciB0eXBlIGNvbnZlcnNpb24gYW5kIGRldGVjdGlvbgojCiMgQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KIwojIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgojCiMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCiMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KIwojIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAojIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiMKIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAojICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQojICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgoKaW1wb3J0IGRhdGV0aW1lCmltcG9ydCB1bml0dGVzdAppbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKdHJ5OgogICAgaW1wb3J0IHpsaWIKZXhjZXB0IEltcG9ydEVycm9yOgogICAgemxpYiA9IE5vbmUKCgpjbGFzcyBTcWxpdGVUeXBlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSBpbnRlZ2VyLCBzIHZhcmNoYXIsIGYgbnVtYmVyLCBiIGJsb2IpIikKCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQogICAgICAgIHNlbGYuY29uLmNsb3NlKCkKCiAgICBkZWYgQ2hlY2tTdHJpbmcoc2VsZik6CiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChzKSB2YWx1ZXMgKD8pIiwgKCLWc3RlcnJlaWNoIiwpKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBzIGZyb20gdGVzdCIpCiAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAi1nN0ZXJyZWljaCIpCgogICAgZGVmIENoZWNrU21hbGxJbnQoc2VsZik6CiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKDQyLCkpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIDQyKQoKICAgIGRlZiBDaGVja0xhcmdlSW50KHNlbGYpOgogICAgICAgIG51bSA9IDIqKjQwCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKG51bSwpKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCiAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBudW0pCgogICAgZGVmIENoZWNrRmxvYXQoc2VsZik6CiAgICAgICAgdmFsID0gMy4xNAogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZikgdmFsdWVzICg/KSIsICh2YWwsKSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZiBmcm9tIHRlc3QiKQogICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgdmFsKQoKICAgIGRlZiBDaGVja0Jsb2Ioc2VsZik6CiAgICAgICAgc2FtcGxlID0gYiJHdWdsaHVwZiIKICAgICAgICB2YWwgPSBtZW1vcnl2aWV3KHNhbXBsZSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGIpIHZhbHVlcyAoPykiLCAodmFsLCkpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGIgZnJvbSB0ZXN0IikKICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHNhbXBsZSkKCiAgICBkZWYgQ2hlY2tVbmljb2RlRXhlY3V0ZShzZWxmKToKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgJ9ZzdGVycmVpY2gnIikKICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICLWc3RlcnJlaWNoIikKCmNsYXNzIERlY2xUeXBlc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGNsYXNzIEZvbzoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgX3ZhbCk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoX3ZhbCwgYnl0ZXMpOgogICAgICAgICAgICAgICAgIyBzcWxpdGUzIGFsd2F5cyBjYWxscyBfX2luaXRfXyB3aXRoIGEgYnl0ZXMgY3JlYXRlZCBmcm9tIGEKICAgICAgICAgICAgICAgICMgVVRGLTggc3RyaW5nIHdoZW4gX19jb25mb3JtX18gd2FzIHVzZWQgdG8gc3RvcmUgdGhlIG9iamVjdC4KICAgICAgICAgICAgICAgIF92YWwgPSBfdmFsLmRlY29kZSgndXRmOCcpCiAgICAgICAgICAgIHNlbGYudmFsID0gX3ZhbAoKICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBEZWNsVHlwZXNUZXN0cy5Gb28pOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgogICAgICAgICAgICBpZiBzZWxmLnZhbCA9PSBvdGhlci52YWw6CiAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIDEKCiAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgICAgIGMgPSBzZWxmLl9fY21wX18ob3RoZXIpCiAgICAgICAgICAgIGlmIGMgaXMgTm90SW1wbGVtZW50ZWQ6CiAgICAgICAgICAgICAgICByZXR1cm4gYwogICAgICAgICAgICByZXR1cm4gYyA9PSAwCgogICAgICAgIGRlZiBfX2NvbmZvcm1fXyhzZWxmLCBwcm90b2NvbCk6CiAgICAgICAgICAgIGlmIHByb3RvY29sIGlzIHNxbGl0ZS5QcmVwYXJlUHJvdG9jb2w6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWwKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gIjwlcz4iICUgc2VsZi52YWwKCiAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBkZXRlY3RfdHlwZXM9c3FsaXRlLlBBUlNFX0RFQ0xUWVBFUykKICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSBpbnQsIHMgc3RyLCBmIGZsb2F0LCBiIGJvb2wsIHUgdW5pY29kZSwgZm9vIGZvbywgYmluIGJsb2IsIG4xIG51bWJlciwgbjIgbnVtYmVyKDUpKSIpCgogICAgICAgICMgb3ZlcnJpZGUgZmxvYXQsIG1ha2UgdGhlbSBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIG51bWJlcgogICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJGTE9BVCJdID0gbGFtYmRhIHg6IDQ3LjIKCiAgICAgICAgIyBhbmQgaW1wbGVtZW50IHR3byBjdXN0b20gb25lcwogICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJCT09MIl0gPSBsYW1iZGEgeDogYm9vbChpbnQoeCkpCiAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIkZPTyJdID0gRGVjbFR5cGVzVGVzdHMuRm9vCiAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIldST05HIl0gPSBsYW1iZGEgeDogIldST05HIgogICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJOVU1CRVIiXSA9IGZsb2F0CgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siRkxPQVQiXQogICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siQk9PTCJdCiAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJGT08iXQogICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siTlVNQkVSIl0KICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCiAgICAgICAgc2VsZi5jb24uY2xvc2UoKQoKICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKICAgICAgICAjIGRlZmF1bHQKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHMpIHZhbHVlcyAoPykiLCAoImZvbyIsKSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCdzZWxlY3QgcyBhcyAicyBbV1JPTkddIiBmcm9tIHRlc3QnKQogICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImZvbyIpCgogICAgZGVmIENoZWNrU21hbGxJbnQoc2VsZik6CiAgICAgICAgIyBkZWZhdWx0CiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKDQyLCkpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIDQyKQoKICAgIGRlZiBDaGVja0xhcmdlSW50KHNlbGYpOgogICAgICAgICMgZGVmYXVsdAogICAgICAgIG51bSA9IDIqKjQwCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKG51bSwpKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCiAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBudW0pCgogICAgZGVmIENoZWNrRmxvYXQoc2VsZik6CiAgICAgICAgIyBjdXN0b20KICAgICAgICB2YWwgPSAzLjE0CiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBmIGZyb20gdGVzdCIpCiAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCA0Ny4yKQoKICAgIGRlZiBDaGVja0Jvb2woc2VsZik6CiAgICAgICAgIyBjdXN0b20KICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGIpIHZhbHVlcyAoPykiLCAoRmFsc2UsKSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYiBmcm9tIHRlc3QiKQogICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgRmFsc2UpCgogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYikgdmFsdWVzICg/KSIsIChUcnVlLCkpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGIgZnJvbSB0ZXN0IikKICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIFRydWUpCgogICAgZGVmIENoZWNrVW5pY29kZShzZWxmKToKICAgICAgICAjIGRlZmF1bHQKICAgICAgICB2YWwgPSAiXHhkNnN0ZXJyZWljaCIKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHUpIHZhbHVlcyAoPykiLCAodmFsLCkpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHUgZnJvbSB0ZXN0IikKICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHZhbCkKCiAgICBkZWYgQ2hlY2tGb28oc2VsZik6CiAgICAgICAgdmFsID0gRGVjbFR5cGVzVGVzdHMuRm9vKCJibGEiKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZm9vKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBmb28gZnJvbSB0ZXN0IikKICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHZhbCkKCiAgICBkZWYgQ2hlY2tVbnN1cHBvcnRlZFNlcShzZWxmKToKICAgICAgICBjbGFzcyBCYXI6IHBhc3MKICAgICAgICB2YWwgPSBCYXIoKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBJbnRlcmZhY2VFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5JbnRlcmZhY2VFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gSW50ZXJmYWNlRXJyb3IiKQoKICAgIGRlZiBDaGVja1Vuc3VwcG9ydGVkRGljdChzZWxmKToKICAgICAgICBjbGFzcyBCYXI6IHBhc3MKICAgICAgICB2YWwgPSBCYXIoKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmKSB2YWx1ZXMgKDp2YWwpIiwgeyJ2YWwiOiB2YWx9KQogICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBJbnRlcmZhY2VFcnJvciIpCiAgICAgICAgZXhjZXB0IHNxbGl0ZS5JbnRlcmZhY2VFcnJvcjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gSW50ZXJmYWNlRXJyb3IiKQoKICAgIGRlZiBDaGVja0Jsb2Ioc2VsZik6CiAgICAgICAgIyBkZWZhdWx0CiAgICAgICAgc2FtcGxlID0gYiJHdWdsaHVwZiIKICAgICAgICB2YWwgPSBtZW1vcnl2aWV3KHNhbXBsZSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGJpbikgdmFsdWVzICg/KSIsICh2YWwsKSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYmluIGZyb20gdGVzdCIpCiAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBzYW1wbGUpCgogICAgZGVmIENoZWNrTnVtYmVyMShzZWxmKToKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG4xKSB2YWx1ZXMgKDUpIikKICAgICAgICB2YWx1ZSA9IHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBuMSBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpWzBdCiAgICAgICAgIyBpZiB0aGUgY29udmVydGVyIGlzIG5vdCB1c2VkLCBpdCdzIGFuIGludCBpbnN0ZWFkIG9mIGEgZmxvYXQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsdWUpLCBmbG9hdCkKCiAgICBkZWYgQ2hlY2tOdW1iZXIyKHNlbGYpOgogICAgICAgICIiIkNoZWNrcyB3ZXRoZXIgY29udmVydGVyIG5hbWVzIGFyZSBjdXQgb2ZmIGF0ICcoJyBjaGFyYWN0ZXJzIiIiCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuMikgdmFsdWVzICg1KSIpCiAgICAgICAgdmFsdWUgPSBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgbjIgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKVswXQogICAgICAgICMgaWYgdGhlIGNvbnZlcnRlciBpcyBub3QgdXNlZCwgaXQncyBhbiBpbnQgaW5zdGVhZCBvZiBhIGZsb2F0CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbHVlKSwgZmxvYXQpCgpjbGFzcyBDb2xOYW1lc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfQ09MTkFNRVMpCiAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KHggZm9vKSIpCgogICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJGT08iXSA9IGxhbWJkYSB4OiAiWyVzXSIgJSB4LmRlY29kZSgiYXNjaWkiKQogICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJCQVIiXSA9IGxhbWJkYSB4OiAiPCVzPiIgJSB4LmRlY29kZSgiYXNjaWkiKQogICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJFWEMiXSA9IGxhbWJkYSB4OiA1LzAKICAgICAgICBzcWxpdGUuY29udmVydGVyc1siQjFCMSJdID0gbGFtYmRhIHg6ICJNQVJLRVIiCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siRk9PIl0KICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkJBUiJdCiAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJFWEMiXQogICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siQjFCMSJdCiAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQogICAgICAgIHNlbGYuY29uLmNsb3NlKCkKCiAgICBkZWYgQ2hlY2tEZWNsVHlwZU5vdFVzZWQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQXNzdXJlcyB0aGF0IHRoZSBkZWNsYXJlZCB0eXBlIGlzIG5vdCB1c2VkIHdoZW4gUEFSU0VfREVDTFRZUEVTCiAgICAgICAgaXMgbm90IHNldC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHgpIHZhbHVlcyAoPykiLCAoInh4eCIsKSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgeCBmcm9tIHRlc3QiKQogICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgInh4eCIpCgogICAgZGVmIENoZWNrTm9uZShzZWxmKToKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHgpIHZhbHVlcyAoPykiLCAoTm9uZSwpKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB4IGZyb20gdGVzdCIpCiAgICAgICAgdmFsID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCBOb25lKQoKICAgIGRlZiBDaGVja0NvbE5hbWUoc2VsZik6CiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh4KSB2YWx1ZXMgKD8pIiwgKCJ4eHgiLCkpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgnc2VsZWN0IHggYXMgInggW2Jhcl0iIGZyb20gdGVzdCcpCiAgICAgICAgdmFsID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAiPHh4eD4iKQoKICAgICAgICAjIENoZWNrIGlmIHRoZSBzdHJpcHBpbmcgb2YgY29sbmFtZXMgd29ya3MuIEV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0CiAgICAgICAgIyB3aGl0ZXNwYWNlIHNob3VsZCBiZSBzdHJpcHBlZC4KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3VyLmRlc2NyaXB0aW9uWzBdWzBdLCAieCIpCgogICAgZGVmIENoZWNrQ2FzZUluQ29udmVydGVyTmFtZShzZWxmKToKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgJ290aGVyJyBhcyBcInggW2IxYjFdXCIiKQogICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgIk1BUktFUiIpCgogICAgZGVmIENoZWNrQ3Vyc29yRGVzY3JpcHRpb25Ob1JvdyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBjdXJzb3IuZGVzY3JpcHRpb24gc2hvdWxkIGF0IGxlYXN0IHByb3ZpZGUgdGhlIGNvbHVtbiBuYW1lKHMpLCBldmVuIGlmCiAgICAgICAgbm8gcm93IHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCAqIGZyb20gdGVzdCB3aGVyZSAwID0gMSIpCiAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuY3VyLmRlc2NyaXB0aW9uWzBdWzBdID09ICJ4IikKCmNsYXNzIE9iamVjdEFkYXB0YXRpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgY2FzdChvYmopOgogICAgICAgIHJldHVybiBmbG9hdChvYmopCiAgICBjYXN0ID0gc3RhdGljbWV0aG9kKGNhc3QpCgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBzcWxpdGUuYWRhcHRlcnNbaW50XQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgcGFzcwogICAgICAgIHNxbGl0ZS5yZWdpc3Rlcl9hZGFwdGVyKGludCwgT2JqZWN0QWRhcHRhdGlvblRlc3RzLmNhc3QpCiAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBkZWwgc3FsaXRlLmFkYXB0ZXJzWyhpbnQsIHNxbGl0ZS5QcmVwYXJlUHJvdG9jb2wpXQogICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgogICAgZGVmIENoZWNrQ2FzdGVySXNVc2VkKHNlbGYpOgogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCA/IiwgKDQsKSkKICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIGZsb2F0KQoKQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQpjbGFzcyBCaW5hcnlDb252ZXJ0ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICBkZWYgY29udmVydChzKToKICAgICAgICByZXR1cm4gemxpYi5kZWNvbXByZXNzKHMpCiAgICBjb252ZXJ0ID0gc3RhdGljbWV0aG9kKGNvbnZlcnQpCgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9DT0xOQU1FUykKICAgICAgICBzcWxpdGUucmVnaXN0ZXJfY29udmVydGVyKCJiaW4iLCBCaW5hcnlDb252ZXJ0ZXJUZXN0cy5jb252ZXJ0KQoKICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgogICAgZGVmIENoZWNrQmluYXJ5SW5wdXRGb3JDb252ZXJ0ZXIoc2VsZik6CiAgICAgICAgdGVzdGRhdGEgPSBiImFiY2RlZmciICogMTAKICAgICAgICByZXN1bHQgPSBzZWxmLmNvbi5leGVjdXRlKCdzZWxlY3QgPyBhcyAieCBbYmluXSInLCAobWVtb3J5dmlldyh6bGliLmNvbXByZXNzKHRlc3RkYXRhKSksKSkuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdGRhdGEsIHJlc3VsdCkKCmNsYXNzIERhdGVUaW1lVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9ERUNMVFlQRVMpCiAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGQgZGF0ZSwgdHMgdGltZXN0YW1wKSIpCgogICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCgogICAgZGVmIENoZWNrU3FsaXRlRGF0ZShzZWxmKToKICAgICAgICBkID0gc3FsaXRlLkRhdGUoMjAwNCwgMiwgMTQpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChkKSB2YWx1ZXMgKD8pIiwgKGQsKSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZCBmcm9tIHRlc3QiKQogICAgICAgIGQyID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZDIpCgogICAgZGVmIENoZWNrU3FsaXRlVGltZXN0YW1wKHNlbGYpOgogICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcCgyMDA0LCAyLCAxNCwgNywgMTUsIDApCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh0cykgdmFsdWVzICg/KSIsICh0cywpKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQogICAgICAgIHRzMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLCB0czIpCgogICAgZGVmIENoZWNrU3FsVGltZXN0YW1wKHNlbGYpOgogICAgICAgICMgVGhlIGRhdGUgZnVuY3Rpb25zIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiBTUUxpdGUgdmVyc2lvbiAzLjEgb3IgbGF0ZXIKICAgICAgICBpZiBzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCAxKToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgU1FMaXRlJ3MgY3VycmVudF90aW1lc3RhbXAgdXNlcyBVVEMgdGltZSwgd2hpbGUgZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkgdXNlcyBsb2NhbCB0aW1lLgogICAgICAgIG5vdyA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh0cykgdmFsdWVzIChjdXJyZW50X3RpbWVzdGFtcCkiKQogICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQogICAgICAgIHRzID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh0cyksIGRhdGV0aW1lLmRhdGV0aW1lKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMueWVhciwgbm93LnllYXIpCgogICAgZGVmIENoZWNrRGF0ZVRpbWVTdWJTZWNvbmRzKHNlbGYpOgogICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcCgyMDA0LCAyLCAxNCwgNywgMTUsIDAsIDUwMDAwMCkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKD8pIiwgKHRzLCkpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHRzIGZyb20gdGVzdCIpCiAgICAgICAgdHMyID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMsIHRzMikKCiAgICBkZWYgQ2hlY2tEYXRlVGltZVN1YlNlY29uZHNGbG9hdGluZ1BvaW50KHNlbGYpOgogICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcCgyMDA0LCAyLCAxNCwgNywgMTUsIDAsIDUxMDI0MSkKICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKD8pIiwgKHRzLCkpCiAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHRzIGZyb20gdGVzdCIpCiAgICAgICAgdHMyID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMsIHRzMikKCmRlZiBzdWl0ZSgpOgogICAgc3FsaXRlX3R5cGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoU3FsaXRlVHlwZVRlc3RzLCAiQ2hlY2siKQogICAgZGVjbHR5cGVzX3R5cGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoRGVjbFR5cGVzVGVzdHMsICJDaGVjayIpCiAgICBjb2xuYW1lc190eXBlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbE5hbWVzVGVzdHMsICJDaGVjayIpCiAgICBhZGFwdGF0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKE9iamVjdEFkYXB0YXRpb25UZXN0cywgIkNoZWNrIikKICAgIGJpbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShCaW5hcnlDb252ZXJ0ZXJUZXN0cywgIkNoZWNrIikKICAgIGRhdGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoRGF0ZVRpbWVUZXN0cywgIkNoZWNrIikKICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKHNxbGl0ZV90eXBlX3N1aXRlLCBkZWNsdHlwZXNfdHlwZV9zdWl0ZSwgY29sbmFtZXNfdHlwZV9zdWl0ZSwgYWRhcHRhdGlvbl9zdWl0ZSwgYmluX3N1aXRlLCBkYXRlX3N1aXRlKSkKCmRlZiB0ZXN0KCk6CiAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCiAgICBydW5uZXIucnVuKHN1aXRlKCkpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgdGVzdCgpCg==