Ly8gIENvcHlyaWdodCAoYykgMjAwMS0yMDEwIEhhcnRtdXQgS2Fpc2VyCi8vICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAxMCBKb2VsIGRlIEd1em1hbgovLyAKLy8gIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgCi8vICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKCi8vIHRoaXMgZmlsZSBpbnRlbnRpb25hbGx5IGNvbnRhaW5zIG5vbi1hc2NpaSBjaGFyYWN0ZXJzCi8vIGJvb3N0aW5zcGVjdDpub2FzY2lpCgojaW5jbHVkZSA8Ym9vc3QvZGV0YWlsL2xpZ2h0d2VpZ2h0X3Rlc3QuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUva2FybWFfY2hhci5ocHA+CiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9rYXJtYV9zdHJpbmcuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUva2FybWFfZGlyZWN0aXZlLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3NwaXJpdC9pbmNsdWRlL2thcm1hX2FjdGlvbi5ocHA+CiNpbmNsdWRlIDxib29zdC9zcGlyaXQvaW5jbHVkZS9waG9lbml4X2NvcmUuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUvcGhvZW5peF9vcGVyYXRvci5ocHA+CgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlICJ0ZXN0LmhwcCIKCmludAptYWluKCkKewogICAgdXNpbmcgc3Bpcml0X3Rlc3Q6OnRlc3Q7CiAgICB1c2luZyBib29zdDo6c3Bpcml0OjprYXJtYTo6bGl0OwogICAgdXNpbmcgYm9vc3Q6OnNwaXJpdDo6a2FybWE6Omxvd2VyOwogICAgdXNpbmcgYm9vc3Q6OnNwaXJpdDo6a2FybWE6OnVwcGVyOwogICAgdXNpbmcgYm9vc3Q6OnNwaXJpdDo6a2FybWE6OmNoYXJfOwogICAgdXNpbmcgYm9vc3Q6OnNwaXJpdDo6a2FybWE6OmVuY29kaW5nOwogICAgbmFtZXNwYWNlIGNoYXJfZW5jb2RpbmcgPSBib29zdDo6c3Bpcml0OjpjaGFyX2VuY29kaW5nOwoKICAgIGVuY29kaW5nPGNoYXJfZW5jb2Rpbmc6Omlzbzg4NTlfMT4gaXNvODg1OV8xOwoKLy8gbmVlZGVkIGZvciBWQzcuMSBvbmx5CiNpZiBCT09TVF9XT1JLQVJPVU5EKEJPT1NUX01TVkMsIEJPT1NUX1RFU1RFRF9BVCgxMzEwKSkKI3ByYWdtYSBzZXRsb2NhbGUoImZyZW5jaCIpCiNlbmRpZgoKICAgIHsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIuEiLCBpc284ODU5XzFbbG93ZXJbJ+EnXV0pKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIsEiLCBpc284ODU5XzFbdXBwZXJbJ+EnXV0pKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIuEiLCBpc284ODU5XzFbbG93ZXJbY2hhcl8oJ+EnKV1dKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCLBIiwgaXNvODg1OV8xW3VwcGVyW2NoYXJfKCfhJyldXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgi4SIsIGlzbzg4NTlfMVtsb3dlcltjaGFyX11dLCAn4ScpKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIsEiLCBpc284ODU5XzFbdXBwZXJbY2hhcl9dXSwgJ+EnKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCLhIiwgaXNvODg1OV8xW2xvd2VyWyfBJ11dKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCLBIiwgaXNvODg1OV8xW3VwcGVyWyfBJ11dKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCLhIiwgaXNvODg1OV8xW2xvd2VyW2NoYXJfKCfBJyldXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgiwSIsIGlzbzg4NTlfMVt1cHBlcltjaGFyXygnwScpXV0pKTsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIuEiLCBpc284ODU5XzFbbG93ZXJbY2hhcl9dXSwgJ8EnKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCLBIiwgaXNvODg1OV8xW3VwcGVyW2NoYXJfXV0sICfBJykpOwogICAgfQoKLy8gICAgIHsKLy8gICAgICAgICBCT09TVF9URVNUKHRlc3QoIskiLCBpc284ODU5XzFbbm9fY2FzZVtjaGFyXygi5S3vIildXSkpOwovLyAgICAgICAgIEJPT1NUX1RFU1QoIXRlc3QoIv8iLCBpc284ODU5XzFbbm9fY2FzZVtjaGFyXygi5S3vIildXSkpOwovLyAgICAgfQovLyAKLy8gICAgIHsKLy8gICAgICAgICBCT09TVF9URVNUKHRlc3QoIsHhIiwgaXNvODg1OV8xW25vX2Nhc2VbIuHBIl1dKSk7Ci8vICAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCLB4SIsIGlzbzg4NTlfMVtub19jYXNlW2xpdCgi4cEiKV1dKSk7Ci8vICAgICB9CgojaWYgQk9PU1RfV09SS0FST1VORChCT09TVF9NU1ZDLCBCT09TVF9URVNURURfQVQoMTMxMCkpCiNwcmFnbWEgc2V0bG9jYWxlKCIiKQojZW5kaWYKCi8vIG5lZWRlZCBmb3IgVkM3LjEgb25seQojaWYgQk9PU1RfV09SS0FST1VORChCT09TVF9NU1ZDLCBCT09TVF9URVNURURfQVQoMTMxMCkpCiNwcmFnbWEgc2V0bG9jYWxlKCJnZXJtYW4iKQojZW5kaWYKICAgIHsKICAgICAgICBCT09TVF9URVNUKHRlc3QoIuTkIiwgaXNvODg1OV8xW2xvd2VyWyLE5CJdXSkpOwogICAgICAgIEJPT1NUX1RFU1QodGVzdCgi5OQiLCBpc284ODU5XzFbbG93ZXJbIsTkIl1dKSk7CgogICAgICAgIEJPT1NUX1RFU1QodGVzdCgixMQiLCBpc284ODU5XzFbdXBwZXJbIsTkIl1dKSk7CiAgICAgICAgQk9PU1RfVEVTVCh0ZXN0KCLExCIsIGlzbzg4NTlfMVt1cHBlclsixOQiXV0pKTsKICAgIH0KI2lmIEJPT1NUX1dPUktBUk9VTkQoQk9PU1RfTVNWQywgQk9PU1RfVEVTVEVEX0FUKDEzMTApKQojcHJhZ21hIHNldGxvY2FsZSgiIikKI2VuZGlmCgogICAgcmV0dXJuIGJvb3N0OjpyZXBvcnRfZXJyb3JzKCk7Cn0K