Ly8gLSotIG1vZGU6IGMrKyAtKi0KLy8gJElkJAovLyBodHRwOi8vd3d3LmJhZ2xleS5vcmcvfmRvdWcvc2hvb3RvdXQvCi8vIEJ5IFRhbeFzIEJlbmv1CgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y2N0eXBlPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPG1hcD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgY29uc3QgYnVmc2l6ZSA9IDQwOTY7CmludCBjb25zdCB3c2l6ZSA9IDY0OwoKY2xhc3Mgd29yZF9yZWFkZXIKewogICAgaW50IHdzOwogICAgY2hhciBidWZbYnVmc2l6ZSsxXSwgKmJwdHIsICp3b3JkOwogICAgRklMRSAqaW5wdXQ7CgogICAgYm9vbCBmaWxsKCk7CgpwdWJsaWM6CiAgICB3b3JkX3JlYWRlcihGSUxFICppKTogd3Mod3NpemUpLCBicHRyKGJ1ZiksIHdvcmQobmV3IGNoYXJbd3MrMV0pLCBpbnB1dChpKQoJeypicHRyID0gKndvcmQgPSAnXDAnO30KICAgIGludCBvcGVyYXRvcigpKGNoYXIgY29uc3QgKiopOwp9OwoKaW5saW5lIGJvb2wgd29yZF9yZWFkZXI6OmZpbGwoKQp7CiAgICBpbnQgbnJlYWQgPSBmcmVhZChidWYsIHNpemVvZihjaGFyKSwgYnVmc2l6ZSwgaW5wdXQpOwogICAgYnVmW25yZWFkXSA9ICdcMCc7CiAgICBicHRyID0gYnVmOwogICAgcmV0dXJuIG5yZWFkID4gMDsKfQoKaW50IHdvcmRfcmVhZGVyOjpvcGVyYXRvcigpKGNoYXIgY29uc3QgKip3KQp7CiAgICBpbnQgbGVuID0gMDsKICAgIGNoYXIgYzsKICAgIHdoaWxlICgqYnB0ciB8fCBmaWxsKCkpIHsKCWlmIChpc2FscGhhKGMgPSAqYnB0cisrKSkgewoJICAgIHdvcmRbbGVuXSA9IHRvbG93ZXIoYyk7CgkgICAgaWYgKCsrbGVuID09IHdzKSB7CgkJY2hhciAqbndvcmQgPSBuZXcgY2hhclsod3MgKj0gMikrMV07CgkJbWVtY3B5KG53b3JkLCB3b3JkLCBsZW4pOwoJCWRlbGV0ZVtdIHdvcmQ7CgkJd29yZCA9IG53b3JkOwoJICAgIH0KCX0KCWVsc2UgaWYgKGxlbiA+IDApIGJyZWFrOwogICAgfQogICAgKncgPSB3b3JkOwogICAgd29yZFtsZW5dID0gJ1wwJzsKICAgIHJldHVybiBsZW47Cn0KCnR5cGVkZWYgbWFwPGNoYXIgY29uc3QgKiwgaW50PiBjb3VudGVyOwp0eXBlZGVmIHBhaXI8Y2hhciBjb25zdCAqLCBpbnQ+IGhwYWlyOwoKbmFtZXNwYWNlIHN0ZAp7CiAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoaHBhaXIgY29uc3QgJmxocywgaHBhaXIgY29uc3QgJnJocykKICAgIHsKCXJldHVybiBsaHMuc2Vjb25kICE9IHJocy5zZWNvbmQgPyBsaHMuc2Vjb25kID4gcmhzLnNlY29uZAoJICAgIDogc3RyY21wKGxocy5maXJzdCwgcmhzLmZpcnN0KSA+IDA7CiAgICB9CgogICAgdGVtcGxhdGU8PiBzdHJ1Y3QgZXF1YWxfdG88Y2hhciBjb25zdCAqPgogICAgewoJYm9vbCBvcGVyYXRvcigpKGNoYXIgY29uc3QgKnMxLCBjaGFyIGNvbnN0ICpzMikgY29uc3QKCSAgICB7cmV0dXJuIHN0cmNtcChzMSwgczIpID09IDA7fQogICAgfTsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgbGVuOwogICAgY29uc3QgY2hhciAqdzsKICAgIGNvdW50ZXIgaGlzdDsKICAgIHdvcmRfcmVhZGVyIHdyKHN0ZGluKTsKCiAgICB3aGlsZSAoKGxlbiA9IHdyKCZ3KSkgPiAwKSB7Cgljb3VudGVyOjppdGVyYXRvciBpID0gaGlzdC5maW5kKHcpOwoJaWYgKGkgPT0gaGlzdC5lbmQoKSkgaGlzdFtzdHJjcHkobmV3IGNoYXJbbGVuKzFdLCB3KV0gPSAxOwoJZWxzZSArK2ktPnNlY29uZDsKICAgIH0KCiAgICB2ZWN0b3I8aHBhaXI+IHYoaGlzdC5iZWdpbigpLCBoaXN0LmVuZCgpKTsKICAgIHNvcnQodi5iZWdpbigpLCB2LmVuZCgpKTsKICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdi5zaXplKCk7ICsraSkKCXByaW50ZigiJTdkXHQlc1xuIiwgdltpXS5zZWNvbmQsIHZbaV0uZmlyc3QpOwoKICAgIHJldHVybiAwOwp9Cg==