Ly8gLSotIEMrKyAtKi0KLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3Ryc3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLy8KLy8gysrKysrKysrKysrKysrKysrKyspUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQovLwovLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgovLwovLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwoKI2lmbmRlZiBfTElCQ1BQX1NUUlNUUkVBTQojZGVmaW5lIF9MSUJDUFBfU1RSU1RSRUFNCgovKgogICAgc3Ryc3RyZWFtIHN5bm9wc2lzCgpjbGFzcyBzdHJzdHJlYW1idWYKICAgIDogcHVibGljIGJhc2ljX3N0cmVhbWJ1ZjxjaGFyPgp7CnB1YmxpYzoKICAgIGV4cGxpY2l0IHN0cnN0cmVhbWJ1ZihzdHJlYW1zaXplIGFsc2l6ZV9hcmcgPSAwKTsKICAgIHN0cnN0cmVhbWJ1Zih2b2lkKiAoKnBhbGxvY19hcmcpKHNpemVfdCksIHZvaWQgKCpwZnJlZV9hcmcpKHZvaWQqKSk7CiAgICBzdHJzdHJlYW1idWYoY2hhciogZ25leHRfYXJnLCBzdHJlYW1zaXplIG4sIGNoYXIqIHBiZWdfYXJnID0gMCk7CiAgICBzdHJzdHJlYW1idWYoY29uc3QgY2hhciogZ25leHRfYXJnLCBzdHJlYW1zaXplIG4pOwoKICAgIHN0cnN0cmVhbWJ1ZihzaWduZWQgY2hhciogZ25leHRfYXJnLCBzdHJlYW1zaXplIG4sIHNpZ25lZCBjaGFyKiBwYmVnX2FyZyA9IDApOwogICAgc3Ryc3RyZWFtYnVmKGNvbnN0IHNpZ25lZCBjaGFyKiBnbmV4dF9hcmcsIHN0cmVhbXNpemUgbik7CiAgICBzdHJzdHJlYW1idWYodW5zaWduZWQgY2hhciogZ25leHRfYXJnLCBzdHJlYW1zaXplIG4sIHVuc2lnbmVkIGNoYXIqIHBiZWdfYXJnID0gMCk7CiAgICBzdHJzdHJlYW1idWYoY29uc3QgdW5zaWduZWQgY2hhciogZ25leHRfYXJnLCBzdHJlYW1zaXplIG4pOwoKICAgIHN0cnN0cmVhbWJ1ZihzdHJzdHJlYW1idWYmJiByaHMpOwogICAgc3Ryc3RyZWFtYnVmJiBvcGVyYXRvcj0oc3Ryc3RyZWFtYnVmJiYgcmhzKTsKCiAgICB2aXJ0dWFsIH5zdHJzdHJlYW1idWYoKTsKCiAgICB2b2lkIHN3YXAoc3Ryc3RyZWFtYnVmJiByaHMpOwoKICAgIHZvaWQgZnJlZXplKGJvb2wgZnJlZXplZmwgPSB0cnVlKTsKICAgIGNoYXIqIHN0cigpOwogICAgaW50CXBjb3VudCgpIGNvbnN0OwoKcHJvdGVjdGVkOgogICAgdmlydHVhbCBpbnRfdHlwZSBvdmVyZmxvdyAoaW50X3R5cGUgYyA9IEVPRik7CiAgICB2aXJ0dWFsIGludF90eXBlIHBiYWNrZmFpbChpbnRfdHlwZSBjID0gRU9GKTsKICAgIHZpcnR1YWwgaW50X3R5cGUgdW5kZXJmbG93KCk7CiAgICB2aXJ0dWFsIHBvc190eXBlIHNlZWtvZmYob2ZmX3R5cGUgb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciB3YXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIHdoaWNoID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CiAgICB2aXJ0dWFsIHBvc190eXBlIHNlZWtwb3MocG9zX3R5cGUgc3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIHdoaWNoID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CiAgICB2aXJ0dWFsIHN0cmVhbWJ1Ziogc2V0YnVmKGNoYXIqIHMsIHN0cmVhbXNpemUgbik7Cgpwcml2YXRlOgogICAgdHlwZWRlZiBUMSBzdHJzdGF0ZTsgICAgICAgICAgICAgICAgLy8gZXhwb3NpdGlvbiBvbmx5CiAgICBzdGF0aWMgY29uc3Qgc3Ryc3RhdGUgYWxsb2NhdGVkOyAgICAvLyBleHBvc2l0aW9uIG9ubHkKICAgIHN0YXRpYyBjb25zdCBzdHJzdGF0ZSBjb25zdGFudDsgICAgIC8vIGV4cG9zaXRpb24gb25seQogICAgc3RhdGljIGNvbnN0IHN0cnN0YXRlIGR5bmFtaWM7ICAgICAgLy8gZXhwb3NpdGlvbiBvbmx5CiAgICBzdGF0aWMgY29uc3Qgc3Ryc3RhdGUgZnJvemVuOyAgICAgICAvLyBleHBvc2l0aW9uIG9ubHkKICAgIHN0cnN0YXRlIHN0cm1vZGU7ICAgICAgICAgICAgICAgICAgIC8vIGV4cG9zaXRpb24gb25seQogICAgc3RyZWFtc2l6ZSBhbHNpemU7ICAgICAgICAgICAgICAgICAgLy8gZXhwb3NpdGlvbiBvbmx5CiAgICB2b2lkKiAoKnBhbGxvYykoc2l6ZV90KTsgICAgICAgICAgICAvLyBleHBvc2l0aW9uIG9ubHkKICAgIHZvaWQgKCpwZnJlZSkodm9pZCopOyAgICAgICAgICAgICAgIC8vIGV4cG9zaXRpb24gb25seQp9OwoKY2xhc3MgaXN0cnN0cmVhbQogICAgOiBwdWJsaWMgYmFzaWNfaXN0cmVhbTxjaGFyPgp7CnB1YmxpYzoKICAgIGV4cGxpY2l0IGlzdHJzdHJlYW0oY29uc3QgY2hhciogcyk7CiAgICBleHBsaWNpdCBpc3Ryc3RyZWFtKGNoYXIqIHMpOwogICAgaXN0cnN0cmVhbShjb25zdCBjaGFyKiBzLCBzdHJlYW1zaXplIG4pOwogICAgaXN0cnN0cmVhbShjaGFyKiBzLCBzdHJlYW1zaXplIG4pOwoKICAgIHZpcnR1YWwgfmlzdHJzdHJlYW0oKTsKCiAgICBzdHJzdHJlYW1idWYqIHJkYnVmKCkgY29uc3Q7CiAgICBjaGFyICpzdHIoKTsKCnByaXZhdGU6CiAgICBzdHJzdHJlYW1idWYgc2I7CS8vIGV4cG9zaXRpb24gb25seQp9OwoKY2xhc3Mgb3N0cnN0cmVhbQogICAgOiBwdWJsaWMgYmFzaWNfb3N0cmVhbTxjaGFyPgp7CnB1YmxpYzoKICAgIG9zdHJzdHJlYW0oKTsKICAgIG9zdHJzdHJlYW0oY2hhciogcywgaW50IG4sIGlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gaW9zX2Jhc2U6Om91dCk7CgogICAgdmlydHVhbCB+b3N0cnN0cmVhbSgpOwoKICAgIHN0cnN0cmVhbWJ1ZiogcmRidWYoKSBjb25zdDsKICAgIHZvaWQgZnJlZXplKGJvb2wgZnJlZXplZmwgPSB0cnVlKTsKICAgIGNoYXIqIHN0cigpOwogICAgaW50IHBjb3VudCgpIGNvbnN0OwoKcHJpdmF0ZToKICAgIHN0cnN0cmVhbWJ1ZiBzYjsJLy8gZXhwb3NpdGlvbiBvbmx5Cn07CgpjbGFzcyBzdHJzdHJlYW0KICAgIDogcHVibGljIGJhc2ljX2lvc3RyZWFtPGNoYXI+CnsKcHVibGljOgogICAgLy8gVHlwZXMKICAgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfdHlwZTsKICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcj46OmludF90eXBlIGludF90eXBlOwogICAgdHlwZWRlZiBjaGFyX3RyYWl0czxjaGFyPjo6cG9zX3R5cGUgcG9zX3R5cGU7CiAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+OjpvZmZfdHlwZSBvZmZfdHlwZTsKCiAgICAvLyBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcgogICAgc3Ryc3RyZWFtKCk7CiAgICBzdHJzdHJlYW0oY2hhciogcywgaW50IG4sIGlvc19iYXNlOjpvcGVubW9kZSBtb2RlID0gaW9zX2Jhc2U6OmluIHwgaW9zX2Jhc2U6Om91dCk7CgogICAgdmlydHVhbCB+c3Ryc3RyZWFtKCk7CgogICAgLy8gTWVtYmVyczoKICAgIHN0cnN0cmVhbWJ1ZiogcmRidWYoKSBjb25zdDsKICAgIHZvaWQgZnJlZXplKGJvb2wgZnJlZXplZmwgPSB0cnVlKTsKICAgIGludCBwY291bnQoKSBjb25zdDsKICAgIGNoYXIqIHN0cigpOwoKcHJpdmF0ZToKICAgIHN0cnN0cmVhbWJ1ZiBzYjsJLy8gZXhwb3NpdGlvbiBvbmx5Cn07Cgp9ICAvLyBzdGQKCiovCgojaW5jbHVkZSA8X19jb25maWc+CiNpbmNsdWRlIDxvc3RyZWFtPgojaW5jbHVkZSA8aXN0cmVhbT4KCiNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKCl9MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAoKY2xhc3Mgc3Ryc3RyZWFtYnVmCiAgICA6IHB1YmxpYyBzdHJlYW1idWYKewpwdWJsaWM6CiAgICBleHBsaWNpdCBzdHJzdHJlYW1idWYoc3RyZWFtc2l6ZSBfX2Fsc2l6ZSA9IDApOwogICAgc3Ryc3RyZWFtYnVmKHZvaWQqICgqX19wYWxsb2MpKHNpemVfdCksIHZvaWQgKCpfX3BmcmVlKSh2b2lkKikpOwogICAgc3Ryc3RyZWFtYnVmKGNoYXIqIF9fZ25leHQsIHN0cmVhbXNpemUgX19uLCBjaGFyKiBfX3BiZWcgPSAwKTsKICAgIHN0cnN0cmVhbWJ1Zihjb25zdCBjaGFyKiBfX2duZXh0LCBzdHJlYW1zaXplIF9fbik7CgogICAgc3Ryc3RyZWFtYnVmKHNpZ25lZCBjaGFyKiBfX2duZXh0LCBzdHJlYW1zaXplIF9fbiwgc2lnbmVkIGNoYXIqIF9fcGJlZyA9IDApOwogICAgc3Ryc3RyZWFtYnVmKGNvbnN0IHNpZ25lZCBjaGFyKiBfX2duZXh0LCBzdHJlYW1zaXplIF9fbik7CiAgICBzdHJzdHJlYW1idWYodW5zaWduZWQgY2hhciogX19nbmV4dCwgc3RyZWFtc2l6ZSBfX24sIHVuc2lnbmVkIGNoYXIqIF9fcGJlZyA9IDApOwogICAgc3Ryc3RyZWFtYnVmKGNvbnN0IHVuc2lnbmVkIGNoYXIqIF9fZ25leHQsIHN0cmVhbXNpemUgX19uKTsKCiNpZmRlZiBfTElCQ1BQX01PVkUKICAgIHN0cnN0cmVhbWJ1ZihzdHJzdHJlYW1idWYmJiBfX3Jocyk7CiAgICBzdHJzdHJlYW1idWYmIG9wZXJhdG9yPShzdHJzdHJlYW1idWYmJiBfX3Jocyk7CiNlbmRpZgoKICAgIHZpcnR1YWwgfnN0cnN0cmVhbWJ1ZigpOwoKICAgIHZvaWQgc3dhcChzdHJzdHJlYW1idWYmIF9fcmhzKTsKCiAgICB2b2lkIGZyZWV6ZShib29sIF9fZnJlZXplZmwgPSB0cnVlKTsKICAgIGNoYXIqIHN0cigpOwogICAgaW50CXBjb3VudCgpIGNvbnN0OwoKcHJvdGVjdGVkOgogICAgdmlydHVhbCBpbnRfdHlwZSBvdmVyZmxvdyAoaW50X3R5cGUgX19jID0gRU9GKTsKICAgIHZpcnR1YWwgaW50X3R5cGUgcGJhY2tmYWlsKGludF90eXBlIF9fYyA9IEVPRik7CiAgICB2aXJ0dWFsIGludF90eXBlIHVuZGVyZmxvdygpOwogICAgdmlydHVhbCBwb3NfdHlwZSBzZWVrb2ZmKG9mZl90eXBlIF9fb2ZmLCBpb3NfYmFzZTo6c2Vla2RpciBfX3dheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb3NfYmFzZTo6b3Blbm1vZGUgX193aGljaCA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpOwogICAgdmlydHVhbCBwb3NfdHlwZSBzZWVrcG9zKHBvc190eXBlIF9fc3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fd2hpY2ggPSBpb3NfYmFzZTo6aW4gfCBpb3NfYmFzZTo6b3V0KTsKCnByaXZhdGU6CiAgICB0eXBlZGVmIHVuc2lnbmVkIF9fbW9kZV90eXBlOwogICAgc3RhdGljIGNvbnN0IF9fbW9kZV90eXBlIF9fYWxsb2NhdGVkID0gMHgwMTsKICAgIHN0YXRpYyBjb25zdCBfX21vZGVfdHlwZSBfX2NvbnN0YW50ICA9IDB4MDI7CiAgICBzdGF0aWMgY29uc3QgX19tb2RlX3R5cGUgX19keW5hbWljICAgPSAweDA0OwogICAgc3RhdGljIGNvbnN0IF9fbW9kZV90eXBlIF9fZnJvemVuICAgID0gMHgwODsKICAgIHN0YXRpYyBjb25zdCBzdHJlYW1zaXplICAgIF9fZGVmYXVsdF9hbHNpemUgPSA0MDk2OwoKICAgIF9fbW9kZV90eXBlIF9fc3RybW9kZV87CiAgICBzdHJlYW1zaXplIF9fYWxzaXplXzsKICAgIHZvaWQqICgqX19wYWxsb2NfKShzaXplX3QpOwogICAgdm9pZCAoKl9fcGZyZWVfKSh2b2lkKik7CgogICAgdm9pZCBfX2luaXQoY2hhciogX19nbmV4dCwgc3RyZWFtc2l6ZSBfX24sIGNoYXIqIF9fcGJlZyk7Cn07CgpjbGFzcyBpc3Ryc3RyZWFtCiAgICA6IHB1YmxpYyBpc3RyZWFtCnsKcHVibGljOgogICAgZXhwbGljaXQgaXN0cnN0cmVhbShjb25zdCBjaGFyKiBfX3MpCiAgICAgICAgOiBpc3RyZWFtKCZfX3NiXyksIF9fc2JfKF9fcywgMCkge30KICAgIGV4cGxpY2l0IGlzdHJzdHJlYW0oY2hhciogX19zKQogICAgICAgIDogaXN0cmVhbSgmX19zYl8pLCBfX3NiXyhfX3MsIDApIHt9CiAgICBpc3Ryc3RyZWFtKGNvbnN0IGNoYXIqIF9fcywgc3RyZWFtc2l6ZSBfX24pCiAgICAgICAgOiBpc3RyZWFtKCZfX3NiXyksIF9fc2JfKF9fcywgX19uKSB7fQogICAgaXN0cnN0cmVhbShjaGFyKiBfX3MsIHN0cmVhbXNpemUgX19uKQogICAgICAgIDogaXN0cmVhbSgmX19zYl8pLCBfX3NiXyhfX3MsIF9fbikge30KCiNpZmRlZiBfTElCQ1BQX01PVkUKICAgIGlzdHJzdHJlYW0oaXN0cnN0cmVhbSYmIF9fcmhzKQogICAgICAgIDogaXN0cmVhbShfU1REOjptb3ZlKF9fcmhzKSksCiAgICAgICAgICBfX3NiXyhfU1REOjptb3ZlKF9fcmhzLl9fc2JfKSkKICAgIHsKICAgICAgICBpc3RyZWFtOjpzZXRfcmRidWYoJl9fc2JfKTsKICAgIH0KCiAgICBpc3Ryc3RyZWFtJiBvcGVyYXRvcj0oaXN0cnN0cmVhbSYmIF9fcmhzKQogICAgewogICAgICAgIGlzdHJlYW06Om9wZXJhdG9yPShfU1REOjptb3ZlKF9fcmhzKSk7CiAgICAgICAgX19zYl8gPSBfU1REOjptb3ZlKF9fcmhzLl9fc2JfKTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiNlbmRpZgoKICAgIHZpcnR1YWwgfmlzdHJzdHJlYW0oKTsKCiAgICB2b2lkIHN3YXAoaXN0cnN0cmVhbSYgX19yaHMpCiAgICB7CiAgICAgICAgaXN0cmVhbTo6c3dhcChfX3Jocyk7CiAgICAgICAgX19zYl8uc3dhcChfX3Jocy5fX3NiXyk7CiAgICB9CgogICAgc3Ryc3RyZWFtYnVmKiByZGJ1ZigpIGNvbnN0IHtyZXR1cm4gY29uc3RfY2FzdDxzdHJzdHJlYW1idWYqPigmX19zYl8pO30KICAgIGNoYXIgKnN0cigpIHtyZXR1cm4gX19zYl8uc3RyKCk7fQoKcHJpdmF0ZToKICAgIHN0cnN0cmVhbWJ1ZiBfX3NiXzsKfTsKCmNsYXNzIG9zdHJzdHJlYW0KICAgIDogcHVibGljIG9zdHJlYW0KewpwdWJsaWM6CiAgICBvc3Ryc3RyZWFtKCkKICAgICAgICA6IG9zdHJlYW0oJl9fc2JfKSB7fQogICAgb3N0cnN0cmVhbShjaGFyKiBfX3MsIGludCBfX24sIGlvc19iYXNlOjpvcGVubW9kZSBfX21vZGUgPSBpb3NfYmFzZTo6b3V0KQogICAgICAgIDogb3N0cmVhbSgmX19zYl8pLAogICAgICAgICAgX19zYl8oX19zLCBfX24sIF9fcyArIChfX21vZGUgJiBpb3M6OmFwcCA/IHN0cmxlbihfX3MpIDogMCkpCiAgICAgICAge30KCiNpZmRlZiBfTElCQ1BQX01PVkUKICAgIG9zdHJzdHJlYW0ob3N0cnN0cmVhbSYmIF9fcmhzKQogICAgICAgIDogb3N0cmVhbShfU1REOjptb3ZlKF9fcmhzKSksCiAgICAgICAgICBfX3NiXyhfU1REOjptb3ZlKF9fcmhzLl9fc2JfKSkKICAgIHsKICAgICAgICBvc3RyZWFtOjpzZXRfcmRidWYoJl9fc2JfKTsKICAgIH0KCiAgICBvc3Ryc3RyZWFtJiBvcGVyYXRvcj0ob3N0cnN0cmVhbSYmIF9fcmhzKQogICAgewogICAgICAgIG9zdHJlYW06Om9wZXJhdG9yPShfU1REOjptb3ZlKF9fcmhzKSk7CiAgICAgICAgX19zYl8gPSBfU1REOjptb3ZlKF9fcmhzLl9fc2JfKTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CiNlbmRpZgoKICAgIHZpcnR1YWwgfm9zdHJzdHJlYW0oKTsKCiAgICB2b2lkIHN3YXAob3N0cnN0cmVhbSYgX19yaHMpCiAgICB7CiAgICAgICAgb3N0cmVhbTo6c3dhcChfX3Jocyk7CiAgICAgICAgX19zYl8uc3dhcChfX3Jocy5fX3NiXyk7CiAgICB9CgogICAgc3Ryc3RyZWFtYnVmKiByZGJ1ZigpIGNvbnN0IHtyZXR1cm4gY29uc3RfY2FzdDxzdHJzdHJlYW1idWYqPigmX19zYl8pO30KICAgIHZvaWQgZnJlZXplKGJvb2wgX19mcmVlemVmbCA9IHRydWUpIHtfX3NiXy5mcmVlemUoX19mcmVlemVmbCk7fQogICAgY2hhciogc3RyKCkgICAgICAgICB7cmV0dXJuIF9fc2JfLnN0cigpO30KICAgIGludCBwY291bnQoKSBjb25zdCAge3JldHVybiBfX3NiXy5wY291bnQoKTt9Cgpwcml2YXRlOgogICAgc3Ryc3RyZWFtYnVmIF9fc2JfOwkvLyBleHBvc2l0aW9uIG9ubHkKfTsKCmNsYXNzIHN0cnN0cmVhbQogICAgOiBwdWJsaWMgaW9zdHJlYW0KewpwdWJsaWM6CiAgICAvLyBUeXBlcwogICAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl90eXBlOwogICAgdHlwZWRlZiBjaGFyX3RyYWl0czxjaGFyPjo6aW50X3R5cGUgaW50X3R5cGU7CiAgICB0eXBlZGVmIGNoYXJfdHJhaXRzPGNoYXI+Ojpwb3NfdHlwZSBwb3NfdHlwZTsKICAgIHR5cGVkZWYgY2hhcl90cmFpdHM8Y2hhcj46Om9mZl90eXBlIG9mZl90eXBlOwoKICAgIC8vIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9yCiAgICBzdHJzdHJlYW0oKQogICAgICAgIDogaW9zdHJlYW0oJl9fc2JfKSB7fQogICAgc3Ryc3RyZWFtKGNoYXIqIF9fcywgaW50IF9fbiwgaW9zX2Jhc2U6Om9wZW5tb2RlIF9fbW9kZSA9IGlvc19iYXNlOjppbiB8IGlvc19iYXNlOjpvdXQpCiAgICAgICAgOiBpb3N0cmVhbSgmX19zYl8pLAogICAgICAgICAgX19zYl8oX19zLCBfX24sIF9fcyArIChfX21vZGUgJiBpb3M6OmFwcCA/IHN0cmxlbihfX3MpIDogMCkpCiAgICAgICAge30KCiNpZmRlZiBfTElCQ1BQX01PVkUKICAgIHN0cnN0cmVhbShzdHJzdHJlYW0mJiBfX3JocykKICAgICAgICA6IGlvc3RyZWFtKF9TVEQ6Om1vdmUoX19yaHMpKSwKICAgICAgICAgIF9fc2JfKF9TVEQ6Om1vdmUoX19yaHMuX19zYl8pKQogICAgewogICAgICAgIGlvc3RyZWFtOjpzZXRfcmRidWYoJl9fc2JfKTsKICAgIH0KCiAgICBzdHJzdHJlYW0mIG9wZXJhdG9yPShzdHJzdHJlYW0mJiBfX3JocykKICAgIHsKICAgICAgICBpb3N0cmVhbTo6b3BlcmF0b3I9KF9TVEQ6Om1vdmUoX19yaHMpKTsKICAgICAgICBfX3NiXyA9IF9TVEQ6Om1vdmUoX19yaHMuX19zYl8pOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KI2VuZGlmCgogICAgdmlydHVhbCB+c3Ryc3RyZWFtKCk7CgogICAgdm9pZCBzd2FwKHN0cnN0cmVhbSYgX19yaHMpCiAgICB7CiAgICAgICAgaW9zdHJlYW06OnN3YXAoX19yaHMpOwogICAgICAgIF9fc2JfLnN3YXAoX19yaHMuX19zYl8pOwogICAgfQoKICAgIC8vIE1lbWJlcnM6CiAgICBzdHJzdHJlYW1idWYqIHJkYnVmKCkgY29uc3Qge3JldHVybiBjb25zdF9jYXN0PHN0cnN0cmVhbWJ1Zio+KCZfX3NiXyk7fQogICAgdm9pZCBmcmVlemUoYm9vbCBfX2ZyZWV6ZWZsID0gdHJ1ZSkge19fc2JfLmZyZWV6ZShfX2ZyZWV6ZWZsKTt9CiAgICBpbnQgcGNvdW50KCkgY29uc3Qge3JldHVybiBfX3NiXy5wY291bnQoKTt9CiAgICBjaGFyKiBzdHIoKSAgICAgICAge3JldHVybiBfX3NiXy5zdHIoKTt9Cgpwcml2YXRlOgogICAgc3Ryc3RyZWFtYnVmIF9fc2JfOwkvLyBleHBvc2l0aW9uIG9ubHkKfTsKCl9MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKCiNlbmRpZiAgLy8gX0xJQkNQUF9TVFJTVFJFQU0K