Ly8gMjAwMS0wOC0xNSBCZW5qYW1pbiBLb3NuaWsgIDxia296QHJlZGhhdC5jb20+CgovLyBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgSVNPIEMrKyBMaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKLy8gc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCi8vIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi8vIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQovLyBhbnkgbGF0ZXIgdmVyc2lvbi4KCi8vIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAovLyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgovLyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi8vIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgovLyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwovLyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi8vIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAovLyBVU0EuCgovLyAyMi4yLjQuMS4xIGNvbGxhdGUgbWVtYmVycwoKI2luY2x1ZGUgPGxvY2FsZT4KI2luY2x1ZGUgPHRlc3RzdWl0ZV9ob29rcy5oPgoKLy8gQ2hlY2sgR2VybWFuICJkZV9ERSIgbG9jYWxlLgp2b2lkIHRlc3QwMigpCnsKICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogIHR5cGVkZWYgc3RkOjpjb2xsYXRlPGNoYXI+OjpzdHJpbmdfdHlwZSBzdHJpbmdfdHlwZTsKCiAgYm9vbCB0ZXN0IF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gdHJ1ZTsKCiAgLy8gYmFzaWMgY29uc3RydWN0aW9uCiAgbG9jYWxlIGxvY19jID0gbG9jYWxlOjpjbGFzc2ljKCk7CiAgbG9jYWxlIGxvY191cyA9IF9fZ251X3Rlc3Q6OnRyeV9uYW1lZF9sb2NhbGUoImVuX1VTIik7CiAgbG9jYWxlIGxvY19mciA9IF9fZ251X3Rlc3Q6OnRyeV9uYW1lZF9sb2NhbGUoImZyX0ZSIik7CiAgbG9jYWxlIGxvY19kZSA9IF9fZ251X3Rlc3Q6OnRyeV9uYW1lZF9sb2NhbGUoImRlX0RFIik7CiAgVkVSSUZZKCBsb2NfYyAhPSBsb2NfZGUgKTsKICBWRVJJRlkoIGxvY191cyAhPSBsb2NfZnIgKTsKICBWRVJJRlkoIGxvY191cyAhPSBsb2NfZGUgKTsKICBWRVJJRlkoIGxvY19kZSAhPSBsb2NfZnIgKTsKCiAgLy8gY2FjaGUgdGhlIGNvbGxhdGUgZmFjZXRzCiAgY29uc3QgY29sbGF0ZTxjaGFyPiYgY29sbF9kZSA9IHVzZV9mYWNldDxjb2xsYXRlPGNoYXI+ID4obG9jX2RlKTsgCgogIC8vIGludCBjb21wYXJlKGNvbnN0IGNoYXJUKiwgY29uc3QgY2hhclQqLCBjb25zdCBjaGFyVCosIGNvbnN0IGNoYXJUKikgY29uc3QKCiAgY29uc3QgY2hhciogc3RybGl0MSA9ICJtb25rZXkgcGlja2VkIHRpa3VhbnlpbiBvb2xvbmciOwogIGNvbnN0IGNoYXIqIHN0cmxpdDMgPSAixHVnbGVpbiBBdWdtZW50IjsgLy8gIkMiID09ICJBdWdtZW50IMR1Z2xlaW4iCiAgY29uc3QgY2hhciogc3RybGl0NCA9ICJCYXNlIGJh3yBCYd8gQmFzdCI7IC8vICJDIiA9PSAiQmFzZSBiYd8gQmHfIEJhc3QiCgogIGludCBpMTsKICBpbnQgaTI7CiAgaW50IHNpemUxID0gY2hhcl90cmFpdHM8Y2hhcj46Omxlbmd0aChzdHJsaXQxKSAtIDE7CiAgaW50IHNpemUzID0gY2hhcl90cmFpdHM8Y2hhcj46Omxlbmd0aChzdHJsaXQzKSAtIDE7CiAgaW50IHNpemU0ID0gY2hhcl90cmFpdHM8Y2hhcj46Omxlbmd0aChzdHJsaXQ0KSAtIDE7CgogIGkxID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDMsIHN0cmxpdDMgKyBzaXplMywgc3RybGl0Mywgc3RybGl0MyArIDcpOwogIFZFUklGWSAoIGkxID09IDEgKTsKICBpMSA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQzLCBzdHJsaXQzICsgNywgc3RybGl0Mywgc3RybGl0MyArIHNpemUxKTsKICBWRVJJRlkgKCBpMSA9PSAtMSApOwogIGkxID0gY29sbF9kZS5jb21wYXJlKHN0cmxpdDMsIHN0cmxpdDMgKyA3LCBzdHJsaXQzLCBzdHJsaXQzICsgNyk7CiAgVkVSSUZZICggaTEgPT0gMCApOwoKICBpMSA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQzLCBzdHJsaXQzICsgNiwgc3RybGl0MyArIDgsIHN0cmxpdDMgKyAxNCk7CiAgVkVSSUZZICggaTEgPT0gLTEgKTsKCiAgaTIgPSBjb2xsX2RlLmNvbXBhcmUoc3RybGl0NCwgc3RybGl0NCArIHNpemU0LCBzdHJsaXQ0LCBzdHJsaXQ0ICsgMTMpOwogIFZFUklGWSAoIGkyID09IDEgKTsKICBpMiA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQ0LCBzdHJsaXQ0ICsgMTMsIHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCk7CiAgVkVSSUZZICggaTIgPT0gLTEgKTsKICBpMiA9IGNvbGxfZGUuY29tcGFyZShzdHJsaXQ0LCBzdHJsaXQ0ICsgc2l6ZTQsIHN0cmxpdDQsIHN0cmxpdDQgKyBzaXplNCk7CiAgVkVSSUZZICggaTIgPT0gMCApOwp9CgppbnQgbWFpbigpCnsKICB0ZXN0MDIoKTsKICByZXR1cm4gMDsKfQo=