Ly8gLSotIEMrKyAtKi0KLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFycmF5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KLy8KLy8gysrKysrKysrKysrKysrKysrKyspUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQovLwovLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgovLwovLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLwoKI2lmbmRlZiBfTElCQ1BQX0FSUkFZCiNkZWZpbmUgX0xJQkNQUF9BUlJBWQoKLyoKICAgIGFycmF5IHN5bm9wc2lzCgpuYW1lc3BhY2Ugc3RkCnsKdGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBOID4gCnN0cnVjdCBhcnJheQp7IAogICAgLy8gdHlwZXM6IAogICAgdHlwZWRlZiBUICYgcmVmZXJlbmNlOyAKICAgIHR5cGVkZWYgY29uc3QgVCAmIGNvbnN0X3JlZmVyZW5jZTsgCiAgICB0eXBlZGVmIGltcGxlbWVudGF0aW9uIGRlZmluZWQgaXRlcmF0b3I7IAogICAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGNvbnN0X2l0ZXJhdG9yOyAKICAgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsgCiAgICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7IAogICAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7IAogICAgdHlwZWRlZiBUKiBwb2ludGVyOwogICAgdHlwZWRlZiBjb25zdCBUKiBjb25zdF9wb2ludGVyOwogICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3I7IAogICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7IAoKICAgIC8vIE5vIGV4cGxpY2l0IGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3kgZm9yIGFnZ3JlZ2F0ZSB0eXBlIAogICAgdm9pZCBmaWxsKGNvbnN0IFQmIHUpOyAKICAgIHZvaWQgc3dhcChhcnJheSYgYSk7CgogICAgLy8gaXRlcmF0b3JzOiAKICAgIGl0ZXJhdG9yIGJlZ2luKCk7IAogICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdDsgCiAgICBpdGVyYXRvciBlbmQoKTsgCiAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdDsgCgogICAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKTsgCiAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0OyAKICAgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpOyAKICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0OyAKCiAgICBjb25zdF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdDsgCiAgICBjb25zdF9pdGVyYXRvciBjZW5kKCkgY29uc3Q7IAogICAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciBjcmJlZ2luKCkgY29uc3Q7CiAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyZW5kKCkgY29uc3Q7IAoKICAgIC8vIGNhcGFjaXR5OiAKICAgIGNvbnN0ZXhwciBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0OyAKICAgIGNvbnN0ZXhwciBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdDsgCiAgICBib29sIGVtcHR5KCkgY29uc3Q7IAoKICAgIC8vIGVsZW1lbnQgYWNjZXNzOiAKICAgIHJlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBuKTsgCiAgICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgbikgY29uc3Q7IAogICAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBuKSBjb25zdDsgCiAgICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIG4pOyAKCiAgICByZWZlcmVuY2UgZnJvbnQoKTsgCiAgICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdDsgCiAgICByZWZlcmVuY2UgYmFjaygpOyAKICAgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3Q7IAoKICAgIFQqIGRhdGEoKTsgCiAgICBjb25zdCBUKiBkYXRhKCkgY29uc3Q7IAp9OwoKdGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBOPiAKICBib29sIG9wZXJhdG9yPT0oY29uc3QgYXJyYXk8VCxOPiYgeCwgY29uc3QgYXJyYXk8VCxOPiYgeSk7IAp0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IE4+IAogIGJvb2wgb3BlcmF0b3IhPShjb25zdCBhcnJheTxULE4+JiB4LCBjb25zdCBhcnJheTxULE4+JiB5KTsgCnRlbXBsYXRlIDxjbGFzcyBULCBzaXplX3QgTj4gCiAgYm9vbCBvcGVyYXRvcjwoY29uc3QgYXJyYXk8VCxOPiYgeCwgY29uc3QgYXJyYXk8VCxOPiYgeSk7IAp0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IE4+IAogIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGFycmF5PFQsTj4mIHgsIGNvbnN0IGFycmF5PFQsTj4mIHkpOyAKdGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBOPiAKICBib29sIG9wZXJhdG9yPD0oY29uc3QgYXJyYXk8VCxOPiYgeCwgY29uc3QgYXJyYXk8VCxOPiYgeSk7IAp0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IE4+IAogIGJvb2wgb3BlcmF0b3I+PShjb25zdCBhcnJheTxULE4+JiB4LCBjb25zdCBhcnJheTxULE4+JiB5KTsgCgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IE4gPiAKICB2b2lkIHN3YXAoYXJyYXk8VCxOPiYgeCwgYXJyYXk8VCxOPiYgeSk7IAoKdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIHR1cGxlX3NpemU7IAp0ZW1wbGF0ZSA8aW50IEksIGNsYXNzIFQ+IGNsYXNzIHR1cGxlX2VsZW1lbnQ7IAp0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IE4+IHN0cnVjdCB0dXBsZV9zaXplPGFycmF5PFQsIE4+PjsKdGVtcGxhdGUgPGludCBJLCBjbGFzcyBULCBzaXplX3QgTj4gc3RydWN0IHR1cGxlX2VsZW1lbnQ8SSwgYXJyYXk8VCwgTj4+OyAKdGVtcGxhdGUgPGludCBJLCBjbGFzcyBULCBzaXplX3QgTj4gVCYgZ2V0KGFycmF5PFQsIE4+Jik7IAp0ZW1wbGF0ZSA8aW50IEksIGNsYXNzIFQsIHNpemVfdCBOPiBjb25zdCBUJiBnZXQoY29uc3QgYXJyYXk8VCwgTj4mKTsgCgp9ICAvLyBzdGQKCiovCgojaW5jbHVkZSA8X19jb25maWc+CiNpbmNsdWRlIDxfX3R1cGxlPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxzdGRleGNlcHQ+CiNpZiBkZWZpbmVkKF9MSUJDUFBfTk9fRVhDRVBUSU9OUykKICAgICNpbmNsdWRlIDxjYXNzZXJ0PgojZW5kaWYKCiNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKCl9MSUJDUFBfQkVHSU5fTkFNRVNQQUNFX1NURAoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPiAKc3RydWN0IGFycmF5CnsKICAgIC8vIHR5cGVzOgogICAgdHlwZWRlZiBhcnJheSBfX3NlbGY7CiAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsgCiAgICB0eXBlZGVmIHZhbHVlX3R5cGUmICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOyAKICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2U7IAogICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOwogICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlKiAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yOwogICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXI7CiAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICAgICAgY29uc3RfcG9pbnRlcjsKICAgIHR5cGVkZWYgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGU7IAogICAgdHlwZWRlZiBwdHJkaWZmX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZTsgCiAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsgCiAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsgCgogICAgdmFsdWVfdHlwZSBfX2VsZW1zX1tfU2l6ZSA+IDAgPyBfU2l6ZSA6IDFdOwoKICAgIC8vIE5vIGV4cGxpY2l0IGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3kgZm9yIGFnZ3JlZ2F0ZSB0eXBlIAogICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIGZpbGwoY29uc3QgdmFsdWVfdHlwZSYgX191KSB7X1NURDo6ZmlsbF9uKF9fZWxlbXNfLCBfU2l6ZSwgX191KTt9CiAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZvaWQgc3dhcChhcnJheSYgX19hKSB7X1NURDo6c3dhcF9yYW5nZXMoX19lbGVtc18sIF9fZWxlbXNfICsgX1NpemUsIF9fYS5fX2VsZW1zXyk7fQoKICAgIC8vIGl0ZXJhdG9yczogCiAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGl0ZXJhdG9yIGJlZ2luKCkgICAgICAgICAgICAge3JldHVybiBpdGVyYXRvcihfX2VsZW1zXyk7fQogICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHtyZXR1cm4gY29uc3RfaXRlcmF0b3IoX19lbGVtc18pO30KICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaXRlcmF0b3IgZW5kKCkgICAgICAgICAgICAgICB7cmV0dXJuIGl0ZXJhdG9yKF9fZWxlbXNfICsgX1NpemUpO30KICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgICB7cmV0dXJuIGNvbnN0X2l0ZXJhdG9yKF9fZWxlbXNfICsgX1NpemUpO30KCiAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgICAgICAgICAgICAge3JldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTt9CiAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3Qge3JldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTt9CiAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgICAgICAgICAgICAge3JldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpO30KICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgICB7cmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7fQoKICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3QgICAgICAgICAge3JldHVybiBiZWdpbigpO30KICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfaXRlcmF0b3IgY2VuZCgpIGNvbnN0ICAgICAgICAgICAge3JldHVybiBlbmQoKTt9CiAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JiZWdpbigpIGNvbnN0IHtyZXR1cm4gcmJlZ2luKCk7fQogICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyZW5kKCkgY29uc3QgICB7cmV0dXJuIHJlbmQoKTt9CgogICAgLy8gY2FwYWNpdHk6IAogICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSAvKmNvbnN0ZXhwciovIHNpemVfdHlwZSBzaXplKCkgY29uc3QgICAgICB7cmV0dXJuIF9TaXplO30KICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgLypjb25zdGV4cHIqLyBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCAge3JldHVybiBfU2l6ZTt9CiAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGJvb2wgZW1wdHkoKSBjb25zdCAgICAgICAgICAgICAgICAgICAge3JldHVybiBfU2l6ZSA9PSAwO30KCiAgICAvLyBlbGVtZW50IGFjY2VzczogCiAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHJlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pICAgICAgICAgICAgIHtyZXR1cm4gX19lbGVtc19bX19uXTt9CiAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBfX24pIGNvbnN0IHtyZXR1cm4gX19lbGVtc19bX19uXTt9CiAgICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbik7IAogICAgY29uc3RfcmVmZXJlbmNlIGF0KHNpemVfdHlwZSBfX24pIGNvbnN0OyAKCiAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHJlZmVyZW5jZSBmcm9udCgpICAgICAgICAgICAgIHtyZXR1cm4gX19lbGVtc19bMF07fQogICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7cmV0dXJuIF9fZWxlbXNfWzBdO30KICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmVmZXJlbmNlIGJhY2soKSAgICAgICAgICAgICAge3JldHVybiBfX2VsZW1zX1tfU2l6ZSA+IDAgPyBfU2l6ZS0xIDogMF07fQogICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0ICB7cmV0dXJuIF9fZWxlbXNfW19TaXplID4gMCA/IF9TaXplLTEgOiAwXTt9CgogICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2YWx1ZV90eXBlKiBkYXRhKCkgICAgICAgICAgICAge3JldHVybiBfX2VsZW1zXzt9CiAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0IHZhbHVlX3R5cGUqIGRhdGEoKSBjb25zdCB7cmV0dXJuIF9fZWxlbXNfO30gCn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX1NpemU+IAp0eXBlbmFtZSBhcnJheTxfVHAsIF9TaXplPjo6cmVmZXJlbmNlCmFycmF5PF9UcCwgX1NpemU+OjphdChzaXplX3R5cGUgX19uKQp7CiAgICBpZiAoX19uID49IF9TaXplKQojaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUwogICAgICAgIHRocm93IG91dF9vZl9yYW5nZSgiYXJyYXk6OmF0Iik7CiNlbHNlCiAgICAgICAgYXNzZXJ0KCEiYXJyYXk6OmF0IG91dF9vZl9yYW5nZSIpOwojZW5kaWYKICAgIHJldHVybiBfX2VsZW1zX1tfX25dOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX1NpemU+IAp0eXBlbmFtZSBhcnJheTxfVHAsIF9TaXplPjo6Y29uc3RfcmVmZXJlbmNlCmFycmF5PF9UcCwgX1NpemU+OjphdChzaXplX3R5cGUgX19uKSBjb25zdAp7CiAgICBpZiAoX19uID49IF9TaXplKQojaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUwogICAgICAgIHRocm93IG91dF9vZl9yYW5nZSgiYXJyYXk6OmF0Iik7CiNlbHNlCiAgICAgICAgYXNzZXJ0KCEiYXJyYXk6OmF0IG91dF9vZl9yYW5nZSIpOwojZW5kaWYKICAgIHJldHVybiBfX2VsZW1zX1tfX25dOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX1NpemU+IApfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQpib29sCm9wZXJhdG9yPT0oY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4mIF9feCwgY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4mIF9feSkKewogICAgcmV0dXJuIF9TVEQ6OmVxdWFsKF9feC5fX2VsZW1zXywgX194Ll9fZWxlbXNfICsgX1NpemUsIF9feS5fX2VsZW1zXyk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4gCl9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCmJvb2wKb3BlcmF0b3IhPShjb25zdCBhcnJheTxfVHAsIF9TaXplPiYgX194LCBjb25zdCBhcnJheTxfVHAsIF9TaXplPiYgX195KQp7CiAgICByZXR1cm4gIShfX3ggPT0gX195KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPiAKX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKYm9vbApvcGVyYXRvcjwoY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4mIF9feCwgY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4mIF9feSkKewogICAgcmV0dXJuIF9TVEQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKF9feC5fX2VsZW1zXywgX194Ll9fZWxlbXNfICsgX1NpemUsIF9feS5fX2VsZW1zXywgX195Ll9fZWxlbXNfICsgX1NpemUpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX1NpemU+IApfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQpib29sCm9wZXJhdG9yPihjb25zdCBhcnJheTxfVHAsIF9TaXplPiYgX194LCBjb25zdCBhcnJheTxfVHAsIF9TaXplPiYgX195KQp7CiAgICByZXR1cm4gX195IDwgX194Owp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX1NpemU+IApfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQpib29sCm9wZXJhdG9yPD0oY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4mIF9feCwgY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4mIF9feSkKewogICAgcmV0dXJuICEoX195IDwgX194KTsKfQoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPiAKX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKYm9vbApvcGVyYXRvcj49KGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3gsIGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3kpCnsKICAgIHJldHVybiAhKF9feCA8IF9feSk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4gCl9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCnZvaWQKc3dhcChjb25zdCBhcnJheTxfVHAsIF9TaXplPiYgX194LCBjb25zdCBhcnJheTxfVHAsIF9TaXplPiYgX195KQp7CiAgICBfX3guc3dhcChfX3kpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX1NpemU+CiAgY2xhc3MgdHVwbGVfc2l6ZTxhcnJheTxfVHAsIF9TaXplPiA+IDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHNpemVfdCwgX1NpemU+IHt9OwoKdGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPgogIGNsYXNzIHR1cGxlX3NpemU8Y29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4gPiA6IHB1YmxpYyBpbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIF9TaXplPiB7fTsKCnRlbXBsYXRlIDxzaXplX3QgX0lwLCBjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4KY2xhc3MgdHVwbGVfZWxlbWVudDxfSXAsIGFycmF5PF9UcCwgX1NpemU+ID4KewpwdWJsaWM6CiAgICB0eXBlZGVmIF9UcCB0eXBlOwp9OwoKdGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPgpjbGFzcyB0dXBsZV9lbGVtZW50PF9JcCwgY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4gPgp7CnB1YmxpYzoKICAgIHR5cGVkZWYgY29uc3QgX1RwIHR5cGU7Cn07Cgp0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1RwLCBzaXplX3QgX1NpemU+Cl9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCl9UcCYKZ2V0KGFycmF5PF9UcCwgX1NpemU+JiBfX2EpCnsKICAgIHJldHVybiBfX2FbX0lwXTsKfQoKdGVtcGxhdGUgPHNpemVfdCBfSXAsIGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPgpfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQpjb25zdCBfVHAmCmdldChjb25zdCBhcnJheTxfVHAsIF9TaXplPiYgX19hKQp7CiAgICByZXR1cm4gX19hW19JcF07Cn0KCl9MSUJDUFBfRU5EX05BTUVTUEFDRV9TVEQKCiNlbmRpZiAgLy8gX0xJQkNQUF9BUlJBWQo=