I2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxjc3RkbGliPgojaW5jbHVkZSA8Y3N0ZGlvPgoKI2luY2x1ZGUgImh1bnNwZWxsLmh4eCIKI2luY2x1ZGUgInRleHRwYXJzZXIuaHh4IgoKI2lmbmRlZiBXMzIKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2VuZGlmCgppbnQgCm1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQp7CiAgICBGSUxFICogZjsKICAgIAogICAgLyogZmlyc3QgcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zICovCgogICAgZm9yIChpbnQgaSA9IDE7IGkgPCA2OyBpKyspCglpZiAoIWFyZ3ZbaV0pIHsKCSAgICBmcHJpbnRmKHN0ZGVyciwgCgkgICAgImNobW9ycGggLSBjaGFuZ2UgYWZmaXhlcyBieSBtb3JwaG9sb2dpY2FsIGFuYWx5c2lzIGFuZCBnZW5lcmF0aW9uXG4iIAoJICAgICJjb3JyZWN0IHN5bnRheCBpczpcbmNobW9ycGggYWZmaXhfZmlsZSAiCiAgICAgICAgICAgICJkaWN0aW9uYXJ5X2ZpbGUgZmlsZV90b19jb252ZXJ0IFNUUklORzEgU1RSSU5HMlxuIgogICAgICAgICAgICAiU1RSSU5HUyBtYXkgYmUgYXJiaXRyYXJ5IHBhcnRzIG9mIHRoZSBtb3JwaG9sb2dpY2FsIGRlc2NyaXB0aW9uc1xuIgoJICAgICJleGFtcGxlOiBjaG1vcnBoIGh1LmFmZiBodS5kaWMgaHUudHh0IFNHXzIgU0dfMyAiCgkgICAgIiAoY29udmVydCBpbmZvcm1hbCBIdW5nYXJpYW4gc2Vjb25kIHBlcnNvbiB0ZXh0cyB0byBmb3JtYWwgdGhpcmQgcGVyc29uIHRleHRzKVxuIik7CgkgICAgZXhpdCgxKTsKCX0KCiAgICAvKiBvcGVuIHRoZSB3b3JkcyB0byBjaGVjayBsaXN0ICovCgogICAgZiA9IGZvcGVuKGFyZ3ZbM10sICJyIik7CiAgICBpZiAoIWYpIHsKCWZwcmludGYoc3RkZXJyLCAiRXJyb3IgLSBjb3VsZCBub3Qgb3BlbiBmaWxlIHRvIGNoZWNrXG4iKTsKCWV4aXQoMSk7CiAgICB9CgogICAgSHVuc3BlbGwgKnBNUyA9IG5ldyBIdW5zcGVsbChhcmd2WzFdLCBhcmd2WzJdKTsKICAgIFRleHRQYXJzZXIgKiBwID0gbmV3IFRleHRQYXJzZXIoInF3ZXJ0enVpb3Bhc2RmZ2hqa2x5eGN2Ym5t6eH69fvz/PbtUVdFUlRaVUlPUEFTREZHSEpLTFlYQ1ZCTk3NycHV2tbc09siKTsKICAgIAogICAgY2hhciBidWZbTUFYTE5MRU5dOwogICAgY2hhciAqIG5leHQ7CgogICAgd2hpbGUoZmdldHMoYnVmLE1BWExOTEVOLGYpKSB7CiAgICAgIHAtPnB1dF9saW5lKGJ1Zik7CiAgICAgIHdoaWxlICgobmV4dD1wLT5uZXh0X3Rva2VuKCkpKSB7CiAgICAgICAgICBjaGFyICoqIHBsOwogICAgICAgICAgaW50IHBsbiA9IHBNUy0+YW5hbHl6ZSgmcGwsIG5leHQpOwogCSAgaWYgKHBsbikgewogCSAgICAgICAgaW50IGdlbiA9IDA7CiAJICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsbjsgaSsrKSB7CgkgIAkgICAgY2hhciAqcG9zID0gc3Ryc3RyKHBsW2ldLCBhcmd2WzRdKTsKCSAgCSAgICBpZiAocG9zKSB7CgkgIAkgICAgICAgIGNoYXIgKiByID0gKGNoYXIgKiApIG1hbGxvYyhzdHJsZW4ocGxbaV0pIC0KCSAgCSAgICAgICAgICAgIHN0cmxlbihhcmd2WzRdKSArIHN0cmxlbihhcmd2WzVdKSArIDEpOwoJICAJICAgICAgICBzdHJuY3B5KHIsIHBsW2ldLCBwb3MgLSBwbFtpXSk7CgkgIAkgICAgICAgIHN0cmNweShyICsgKHBvcyAtIHBsW2ldKSwgYXJndls1XSk7CgkgIAkgICAgICAgIHN0cmNhdChyLCBwb3MgKyBzdHJsZW4oYXJndls0XSkpOwoJICAJICAgICAgICBmcmVlKHBsW2ldKTsKCSAgCSAgICAgICAgcGxbaV0gPSByOwoJICAJICAgICAgICBnZW4gPSAxOwoJICAJICAgIH0KIAkgICAgICAgIH0KCSAgCWlmIChnZW4pIHsKCQkgICAgY2hhciAqKnBsMjsKCQkgICAgaW50IHBsMm4gPSBwTVMtPmdlbmVyYXRlKCZwbDIsIG5leHQsIHBsLCBwbG4pOwoJCSAgICBpZiAocGwybikgewoJCSAgICAgICAgcC0+Y2hhbmdlX3Rva2VuKHBsMlswXSk7CgkJICAgICAgICBwTVMtPmZyZWVfbGlzdCgmcGwyLCBwbDJuKTsKCQkgICAgICAgIC8vIGp1bXAgb3ZlciB0aGUgKHBvc3NpYmx5IHVuKW1vZGlmaWVkIHdvcmQKCQkgICAgICAgIGZyZWUobmV4dCk7CgkJICAgICAgICBuZXh0PXAtPm5leHRfdG9rZW4oKTsKCQkgICAgfQoJCX0KCQlwTVMtPmZyZWVfbGlzdCgmcGwsIHBsbik7CgkgIH0KCSAgZnJlZShuZXh0KTsKICAgICAgfQogICAgICBmcHJpbnRmKHN0ZG91dCwgIiVzXG4iLCBwLT5nZXRfbGluZSgpKTsKICAgIH0KCiAgICBkZWxldGUgcDsKICAgIGZjbG9zZShmKTsKICAgIHJldHVybiAwOwp9Cg==