IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojICAgICAgICAgICAgICAgICAgICAgICBDQURFTkNFIENPUFlSSUdIVCBOT1RJQ0UKIyAgICAgICAgIKkgMjAwOC0yMDEzIENhZGVuY2UgRGVzaWduIFN5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBGb3VuZGF0aW9uIEZsb3cgaXMgcHJvdmlkZWQgYXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gcGVyZm9ybSBzcGVjaWFsaXplZAojIHRhc2tzLgojCiMgVGhpcyB3b3JrIG1heSBub3QgYmUgY29waWVkLCByZS1wdWJsaXNoZWQsIHVwbG9hZGVkLCBvciBkaXN0cmlidXRlZCBpbiBhbnkgd2F5LAojIGluIGFueSBtZWRpdW0sIHdoZXRoZXIgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24KIyBmcm9tIENhZGVuY2UuIE5vdHdpdGhzdGFuZGluZyBhbnkgcmVzdHJpY3Rpb25zIGhlcmVpbiwgc3ViamVjdCB0byBjb21wbGlhbmNlCiMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENhZGVuY2Ugc29mdHdhcmUgbGljZW5zZSBhZ3JlZW1lbnQgdW5kZXIKIyB3aGljaCB0aGlzIG1hdGVyaWFsIHdhcyBwcm92aWRlZCwgdGhpcyBtYXRlcmlhbCBtYXkgYmUgY29waWVkIGFuZCBpbnRlcm5hbGx5CiMgZGlzdHJpYnV0ZWQgc29sZWx5IGZvciBpbnRlcm5hbCBwdXJwb3NlcyBmb3IgdXNlIHdpdGggQ2FkZW5jZSB0b29scy4KIwojIFRoaXMgd29yayBpcyBDYWRlbmNlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBhbmQgbWF5IHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgYmUKIyBnaXZlbiB0byB0aGlyZCBwYXJ0aWVzLCBuZWl0aGVyIGluIG9yaWdpbmFsIG5vciBpbiBtb2RpZmllZCB2ZXJzaW9ucywgd2l0aG91dAojIGV4cGxpY2l0IHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIENhZGVuY2UuIFRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaGVyZWluIGlzCiMgdGhlIHByb3ByaWV0YXJ5IGFuZCBjb25maWRlbnRpYWwgaW5mb3JtYXRpb24gb2YgQ2FkZW5jZSBvciBpdHMgbGljZW5zb3JzLCBhbmQKIyBpcyBzdXBwbGllZCBzdWJqZWN0IHRvLCBhbmQgbWF5IGJlIHVzZWQgb25seSBieSBDYWRlbmNlJ3MgY3VycmVudCBjdXN0b21lcnMKIyBpbiBhY2NvcmRhbmNlIHdpdGgsIGEgcHJldmlvdXNseSBleGVjdXRlZCBsaWNlbnNlIGFncmVlbWVudCBiZXR3ZWVuIENhZGVuY2UKIyBhbmQgaXRzIGN1c3RvbWVyLgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUSElTIE1BVEVSSUFMIElTIFBST1ZJREVEIEJZIENBREVOQ0UgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAojIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KIyBJTiBOTyBFVkVOVCBTSEFMTCBDQURFTkNFIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwKIyBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAojIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgojIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgIE1BVEVSSUFMLCBFVkVOIElGCiMgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKaWYge1tpbmZvIGV4aXN0cyB2YXJzKG5ldGxpc3QpXX0gewogICBzZXQgaW5pdCh2ZXJpbG9nKSAgICAgICAgICAgICAgICAgICR2YXJzKG5ldGxpc3QpCiAgIHNldCBuaW5pdCh2ZXJpbG9nKSAgICAgICAgICAgICAgICAgJHZhcnMobmV0bGlzdCkKfQppZiB7W2luZm8gZXhpc3RzIHZhcnMoc2V0X3RvcF9tb2R1bGUpXX0gewogICBzZXQgaW5pdChkZXNpZ25fc2V0dG9wKSAgICAgICAgICAgICR2YXJzKHNldF90b3BfbW9kdWxlKQogICBzZXQgbmluaXQoZGVzaWduX3NldF90b3ApICAgICAgICAgICR2YXJzKHNldF90b3BfbW9kdWxlKQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhkZXNpZ24pXX0gewogICBzZXQgaW5pdCh0b3BfY2VsbCkgICAgICAgICAgICAgICAgICR2YXJzKGRlc2lnbikKfQojc2V0IGluaXQobmV0bGlzdF90eXBlKSAgICAgICAgICAgICAgICAkdmFycyhuZXRsaXN0X3R5cGUpCmlmIHtbaW5mbyBleGlzdHMgdmFycyhvYV9kZXNpZ25fbGliKV19IHsKICAgc2V0IGluaXQob2FfZGVzaWduX2xpYikgICAgICAgICAgICAgICAgICAgJHZhcnMob2FfZGVzaWduX2xpYikKICAgc2V0IG5pbml0KG9hX2Rlc2lnbl9saWIpICAgICAgICAgICAgICAgICAgICR2YXJzKG9hX2Rlc2lnbl9saWIpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKG9hX2Rlc2lnbl9jZWxsKV19IHsKICAgc2V0IGluaXQob2FfZGVzaWduX2NlbGwpICAgICAgICAgICAgICAgICAgJHZhcnMob2FfZGVzaWduX2NlbGwpCiAgIHNldCBuaW5pdChvYV9kZXNpZ25fY2VsbCkgICAgICAgICAgICAgICAgICAkdmFycyhvYV9kZXNpZ25fY2VsbCkKfQppZiB7W2luZm8gZXhpc3RzIHZhcnMob2FfZGVzaWduX3ZpZXcpXX0gewogICBzZXQgaW5pdChvYV9kZXNpZ25fdmlldykgICAgICAgICAgICAgICAgICAkdmFycyhvYV9kZXNpZ25fdmlldykKICAgc2V0IG5pbml0KG9hX2Rlc2lnbl92aWV3KSAgICAgICAgICAgICAgICAgICR2YXJzKG9hX2Rlc2lnbl92aWV3KQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhvYV9yZWZfbGliKV19IHsKICAgc2V0IGluaXQob2FfcmVmX2xpYikgICAgICAgICAgICAgICAkdmFycyhvYV9yZWZfbGliKQogICBzZXQgbmluaXQob2FfcmVmX2xpYikgICAgICAgICAgICAgICAkdmFycyhvYV9yZWZfbGliKQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhvYV9hYnN0cmFjdF9uYW1lKV19IHsKICAgc2V0IGluaXQoYWJzdHJhY3RfbmFtZSkgICAgICAgICAgICAkdmFycyhvYV9hYnN0cmFjdF9uYW1lKQogICBzZXQgbmluaXQoYWJzdHJhY3RfbmFtZSkgICAgICAgICAgICAkdmFycyhvYV9hYnN0cmFjdF9uYW1lKQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhvYV9hYnN0cmFjdF92aWV3KV19IHsKICAgc2V0IGluaXQoYWJzdHJhY3RfdmlldykgICAgICAgICAgICAkdmFycyhvYV9hYnN0cmFjdF92aWV3KQogICBzZXQgbmluaXQoYWJzdHJhY3RfdmlldykgICAgICAgICAgICAkdmFycyhvYV9hYnN0cmFjdF92aWV3KQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhvYV9sYXlvdXRfbmFtZSldfSB7CiAgIHNldCBpbml0KGxheW91dF92aWV3KSAgICAgICAgICAgICAgJHZhcnMob2FfbGF5b3V0X25hbWUpCiAgIHNldCBuaW5pdChsYXlvdXRfdmlldykgICAgICAgICAgICAgICR2YXJzKG9hX2xheW91dF9uYW1lKQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhwb3dlcl9uZXRzKV19IHsKICAgc2V0IGluaXQocHdyX25ldCkgICAgICAgICAgICAgICAgICAkdmFycyhwb3dlcl9uZXRzKQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhncm91bmRfbmV0cyldfSB7CiAgIHNldCBpbml0KGduZF9uZXQpICAgICAgICAgICAgICAgICAgJHZhcnMoZ3JvdW5kX25ldHMpCn0Kc2V0IGluaXQobW1tY19maWxlKSAgICAgICAgICAgICAgICAgICAkdmFycyhzY3JpcHRfZGlyKS92aWV3X2RlZmluaXRpb24udGNsCnNldCBuaW5pdChtbW1jX2ZpbGUpICAgICAgICAgICAgICAgICAgJHZhcnMoc2NyaXB0X2Rpcikvdmlld19kZWZpbml0aW9uLnRjbAppZiB7W2luZm8gZXhpc3RzIHZhcnMoY3BmX2ZpbGUpXX0gewogICBzZXQgaW5pdChjcGZfZmlsZSkgICAgICAgICAgICAgICAgICR2YXJzKGNwZl9maWxlKQogICBzZXQgbmluaXQoY3BmX2ZpbGUpICAgICAgICAgICAgICAgICR2YXJzKGNwZl9maWxlKQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhpb19maWxlKV19IHsKICAgc2V0IGluaXQoaW9fZmlsZSkgICAgICAgICAgICAgICAgICAkdmFycyhpb19maWxlKQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhsZWZfZmlsZXMpXSAmJiAkdmFycyhsZWZfZmlsZXMpICE9ICJOT05FIn0gewogICBzZXQgaW5pdChsZWZfZmlsZSkgICAgICAgICAgICAgICAgICR2YXJzKGxlZl9maWxlcykKICAgc2V0IG5pbml0KGxlZl9maWxlKSAgICAgICAgICAgICAgICAkdmFycyhsZWZfZmlsZXMpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKGNhcF91bml0KV19IHsKICAgc2V0IGluaXQoY2FwX3VuaXQpICAgICAgICAgICAgICAgICAkdmFycyhjYXBfdW5pdCkKfQppZiB7W2luZm8gZXhpc3RzIHZhcnModGltZV91bml0KV19IHsKICAgc2V0IGluaXQodGltZV91bml0KSAgICAgICAgICAgICAgICAkdmFycyh0aW1lX3VuaXQpCn0KCiNpZiB7W2luZm8gZXhpc3RzIHZhcnMoYXNzaWduX2J1ZmZlcildfSB7CiMgICBpZiB7KCR2YXJzKGFzc2lnbl9idWZmZXIpICE9IDEpICYmIChbc3RyaW5nIHRvbG93ZXIgJHZhcnMoYXNzaWduX2J1ZmZlcildICE9ICJ0cnVlIikgJiYgKFtzdHJpbmcgdG9sb3dlciAkdmFycyhhc3NpZ25fYnVmZmVyKV0gIT0gImZhbHNlIikgJiYgKCR2YXJzKGFzc2lnbl9idWZmZXIpICE9IDApfSB7CiMgICAgICBpZiB7W2xsZW5ndGggJHZhcnMoYXNzaWduX2J1ZmZlcildID09IDF9IHsKIyAgICAgICAgIHNldCBpbml0KGFzc2lnbl9idWZmZXIpICAgICAgICAgICAgIjEgLWJ1ZmZlciAkdmFycyhhc3NpZ25fYnVmZmVyKSIKIyAgICAgIH0gZWxzZSB7CiMgICAgICAgICBzZXQgaW5pdChhc3NpZ25fYnVmZmVyKSAgICAgICAgICAgICR2YXJzKGFzc2lnbl9idWZmZXIpCiMgICAgICB9CiMgICB9IGVsc2UgewojICAgICAgICAgc2V0IGluaXQoYXNzaWduX2J1ZmZlcikgICAgICAgICAgICAkdmFycyhhc3NpZ25fYnVmZmVyKQojICAgfQojfQoKaWYge1tpbmZvIGV4aXN0cyB2YXJzKGJ1Zl9mb290cHJpbnQpXX0gewogICBzZXQgb3B0KGJ1Zl9mb290cHJpbnQpICAgICAgICAgICAgICAkdmFycyhidWZfZm9vdHByaW50KQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhpbnZfZm9vdHByaW50KV19IHsKICAgc2V0IG9wdChpbnZfZm9vdHByaW50KSAgICAgICAgICAgICAgJHZhcnMoaW52X2Zvb3RwcmludCkKfQppZiB7W2luZm8gZXhpc3RzIHZhcnMoZGVsX2Zvb3RwcmludCldfSB7CiAgIHNldCBvcHQoZGVsYXlfZm9vdHByaW50KSAgICAgICAgICAgICR2YXJzKGRlbF9mb290cHJpbnQpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKGN0c19jZWxsX2Zvb3RwcmludCldfSB7CiAgIHNldCBjdHMoY3RzX2NlbGxfZm9vdHByaW50KSAgICAgICAgICR2YXJzKGN0c19jZWxsX2Zvb3RwcmludCkKfQppZiB7W2luZm8gZXhpc3RzIHZhcnMoY3RzX2NlbGxfbGlzdCldfSB7CiAgIHNldCBjdHMoY2VsbF9saXN0KSAgICAgICAgICAgICAgICAgICR2YXJzKGN0c19jZWxsX2xpc3QpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlbGF5X2xpbWl0KV19IHsKICAgc2V0IGRlbGF5Y2FsKGRlbGF5X2xpbWl0KSAgICAgICAgICAgICAgICAgJHZhcnMoZGVsYXlfbGltaXQpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlZmF1bHRfbmV0X2RlbGF5KV19IHsKICAgc2V0IGRlbGF5Y2FsKG5ldF9kZWxheSkgICAgICAgICAgICAgICAgICAgJHZhcnMoZGVmYXVsdF9uZXRfZGVsYXkpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlZmF1bHRfbmV0X2xvYWQpXX0gewogICBzZXQgZGVsYXljYWwobmV0X2xvYWQpICAgICAgICAgICAgICAgICAgICAkdmFycyhkZWZhdWx0X25ldF9sb2FkKQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhkZWZhdWx0X3NsZXcpXX0gewogICBzZXQgZGVsYXljYWwoaW5fdHJhbl9kZWxheSkgICAgICAgICAgICAgICAkdmFycyhkZWZhdWx0X3NsZXcpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKGV4Y2x1ZGVfbmV0cyldfSB7CiAgIHNldCBkZWxheWNhbChleGNsdWRlX25ldCkgJHZhcnMoZXhjbHVkZV9uZXRzKQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhkZWxheV9saW1pdCldfSB7CiAgIHNldCBkZWxheWNhbCh1c2VfZGVmYXVsdF9kZWxheV9saW1pdCkgJHZhcnMoZGVsYXlfbGltaXQpCn0KaWYge1tpbmZvIGV4aXN0cyB2YXJzKGRlZmF1bHRfbmV0X2RlbGF5KV19IHsKICAgc2V0IGRlbGF5Y2FsKGRlZmF1bHRfbmV0X2RlbGF5KSAkdmFycyhkZWZhdWx0X25ldF9kZWxheSkKfQppZiB7W2luZm8gZXhpc3RzIHZhcnMoZGVmYXVsdF9uZXRfbG9hZCldfSB7CiAgIHNldCBkZWxheWNhbChkZWZhdWx0X25ldF9sb2FkKSAkdmFycyhkZWZhdWx0X25ldF9sb2FkKQp9CmlmIHtbaW5mbyBleGlzdHMgdmFycyhpbnB1dF90cmFuc2l0aW9uX2RlbGF5KV19IHsKICAgc2V0IGRlbGF5Y2FsKGlucHV0X3RyYW5zaXRpb25fZGVsYXkpICR2YXJzKGlucHV0X3RyYW5zaXRpb25fZGVsYXkpCn0KCmlmIHtbaW5mbyBleGlzdHMgdmFycyhzaHJpbmtfZmFjdG9yKV19IHsKICAgc2V0IGV4dHJhY3Qoc2hyaW5rX2ZhY3RvcikgJHZhcnMoc2hyaW5rX2ZhY3RvcikKfQoKIyBpbml0X29hX3NlYXJjaF9saWIK