LyoKICoKICogSVAtYWRkcmVzcy9ob3N0bmFtZSB0byBjb3VudHJ5IGNvbnZlcnRlci4KICoKICogUHJvYmxlbTsgeW91IHdhbnQgdG8ga25vdyB3aGVyZSBJUCBhLmIuYy5kIGlzIGxvY2F0ZWQuCiAqCiAqIFVzZSBhcmVzX2dldGhvc3RieW5hbWUgKCJkLmMuYi5hLnp6LmNvdW50cmllcy5uZXJkLmRrIikKICogYW5kIGdldCB0aGUgQ05BTUUgKGhvc3QtPmhfbmFtZSkuIFJlc3VsdCB3aWxsIGJlOgogKiAgIENOQU1FID0geno8Q0M+LmNvdW50cmllcy5uZXJkLmRrIHdpdGggYWRkcmVzcyAxMjcuMC54LnkgKHZlciAxKSBvcgogKiAgIENOQU1FID0gPGEuYi5jLmQ+Lnp6LmNvdW50cmllcy5uZXJkLmRrIHdpdGggYWRkcmVzcyAxMjcuMC54LnkgKHZlciAyKQogKgogKiBUaGUgMiBsZXR0ZXIgY291bnRyeSBjb2RlIGlzIGluIDxDQz4gYW5kIHRoZSBJU08tMzE2NiBjb3VudHJ5CiAqIG51bWJlciBpcyBpbiB4LnkgKG51bWJlciA9IHgqMjU2ICsgeSkuIFZlcnNpb24gMiBvZiB0aGUgcHJvdG9jb2wgaXMgbWlzc2luZwogKiB0aGUgPENDPiBudW1iZXIuCiAqCiAqIFJlZjogaHR0cDovL2NvdW50cmllcy5uZXJkLmRrL21vcmUuaHRtbAogKgogKiBXcml0dGVuIGJ5IEcuIFZhbmVtIDxndmFuZW1AYnJvYWRwYXJrLm5vPiAyMDA2LCAyMDA3CiAqCiAqIE5CISBUaGlzIHByb2dyYW0gbWF5IG5vdCBiZSBiaWctZW5kaWFuIGF3YXJlLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzCiAqIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQKICogZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKICogbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKICogbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCiAqIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KICogTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YKICogdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCiAqIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKi8KCiNpbmNsdWRlICJhcmVzX3NldHVwLmgiCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpZmRlZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NUUklOR1NfSAojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKCiNpZiBkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChXQVRUMzIpCiAgI2luY2x1ZGUgPHdpbnNvY2suaD4KI2Vsc2UKICAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KICAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogICNpbmNsdWRlIDxuZXRkYi5oPgojZW5kaWYKCiNpbmNsdWRlICJhcmVzLmgiCiNpbmNsdWRlICJhcmVzX2dldG9wdC5oIgojaW5jbHVkZSAiaW5ldF9uZXRfcHRvbi5oIgojaW5jbHVkZSAiaW5ldF9udG9wLmgiCgojaWZuZGVmIEhBVkVfU1RSRFVQCiMgIGluY2x1ZGUgImFyZXNfc3RyZHVwLmgiCiMgIGRlZmluZSBzdHJkdXAocHRyKSBhcmVzX3N0cmR1cChwdHIpCiNlbmRpZgoKI2lmbmRlZiBIQVZFX1NUUkNBU0VDTVAKIyAgaW5jbHVkZSAiYXJlc19zdHJjYXNlY21wLmgiCiMgIGRlZmluZSBzdHJjYXNlY21wKHAxLHAyKSBhcmVzX3N0cmNhc2VjbXAocDEscDIpCiNlbmRpZgoKI2lmbmRlZiBIQVZFX1NUUk5DQVNFQ01QCiMgIGluY2x1ZGUgImFyZXNfc3RyY2FzZWNtcC5oIgojICBkZWZpbmUgc3RybmNhc2VjbXAocDEscDIsbikgYXJlc19zdHJuY2FzZWNtcChwMSxwMixuKQojZW5kaWYKCiNpZm5kZWYgSU5BRERSX05PTkUKI2RlZmluZSBJTkFERFJfTk9ORSAweGZmZmZmZmZmCiNlbmRpZgoKc3RhdGljIGNvbnN0IGNoYXIgKnVzYWdlICAgICAgPSAiYWNvdW50cnkgWy12aD9dIHtob3N0fGFkZHJ9IC4uLlxuIjsKc3RhdGljIGNvbnN0IGNoYXIgIG5lcmRfZm10W10gPSAiJXUuJXUuJXUuJXUuenouY291bnRyaWVzLm5lcmQuZGsiOwpzdGF0aWMgY29uc3QgY2hhciAqbmVyZF92ZXIxICA9IG5lcmRfZm10ICsgMTQ7CnN0YXRpYyBjb25zdCBjaGFyICpuZXJkX3ZlcjIgID0gbmVyZF9mbXQgKyAxMTsKc3RhdGljIGludCAgICAgICAgIHZlcmJvc2UgICAgPSAwOwoKI2RlZmluZSBUUkFDRShmbXQpIGRvIHsgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlID4gMCkgXAogICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiBmbXQgOyAgIFwKICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKDApCgpzdGF0aWMgdm9pZCB3YWl0X2FyZXMoYXJlc19jaGFubmVsIGNoYW5uZWwpOwpzdGF0aWMgdm9pZCBjYWxsYmFjayh2b2lkICphcmcsIGludCBzdGF0dXMsIGludCB0aW1lb3V0cywgc3RydWN0IGhvc3RlbnQgKmhvc3QpOwpzdGF0aWMgdm9pZCBjYWxsYmFjazIodm9pZCAqYXJnLCBpbnQgc3RhdHVzLCBpbnQgdGltZW91dHMsIHN0cnVjdCBob3N0ZW50ICpob3N0KTsKc3RhdGljIHZvaWQgZmluZF9jb3VudHJ5X2Zyb21fY25hbWUoY29uc3QgY2hhciAqY25hbWUsIHN0cnVjdCBpbl9hZGRyIGFkZHIpOwoKc3RhdGljIHZvaWQgQWJvcnQoY29uc3QgY2hhciAqZm10LCAuLi4pCnsKICB2YV9saXN0IGFyZ3M7CiAgdmFfc3RhcnQoYXJncywgZm10KTsKICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7CiAgdmFfZW5kKGFyZ3MpOwogIGV4aXQoMSk7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewogIGFyZXNfY2hhbm5lbCBjaGFubmVsOwogIGludCAgICBjaCwgc3RhdHVzOwoKI2lmIGRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKFdBVFQzMikKICBXT1JEIHdWZXJzaW9uUmVxdWVzdGVkID0gTUFLRVdPUkQoVVNFX1dJTlNPQ0ssVVNFX1dJTlNPQ0spOwogIFdTQURBVEEgd3NhRGF0YTsKICBXU0FTdGFydHVwKHdWZXJzaW9uUmVxdWVzdGVkLCAmd3NhRGF0YSk7CiNlbmRpZgoKICBzdGF0dXMgPSBhcmVzX2xpYnJhcnlfaW5pdChBUkVTX0xJQl9JTklUX0FMTCk7CiAgaWYgKHN0YXR1cyAhPSBBUkVTX1NVQ0NFU1MpCiAgICB7CiAgICAgIGZwcmludGYoc3RkZXJyLCAiYXJlc19saWJyYXJ5X2luaXQ6ICVzXG4iLCBhcmVzX3N0cmVycm9yKHN0YXR1cykpOwogICAgICByZXR1cm4gMTsKICAgIH0KCiAgd2hpbGUgKChjaCA9IGFyZXNfZ2V0b3B0KGFyZ2MsIGFyZ3YsICJkdmg/IikpICE9IC0xKQogICAgc3dpdGNoIChjaCkKICAgICAgewogICAgICBjYXNlICdkJzoKI2lmZGVmIFdBVFQzMgogICAgICAgIGRidWdfaW5pdCgpOwojZW5kaWYKICAgICAgICBicmVhazsKICAgICAgY2FzZSAndic6CiAgICAgICAgdmVyYm9zZSsrOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdoJzoKICAgICAgY2FzZSAnPyc6CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgQWJvcnQodXNhZ2UpOwogICAgICB9CgogIGFyZ2MgLT0gb3B0aW5kOwogIGFyZ3YgKz0gb3B0aW5kOwogIGlmIChhcmdjIDwgMSkKICAgICBBYm9ydCh1c2FnZSk7CgogIHN0YXR1cyA9IGFyZXNfaW5pdCgmY2hhbm5lbCk7CiAgaWYgKHN0YXR1cyAhPSBBUkVTX1NVQ0NFU1MpCiAgICB7CiAgICAgIGZwcmludGYoc3RkZXJyLCAiYXJlc19pbml0OiAlc1xuIiwgYXJlc19zdHJlcnJvcihzdGF0dXMpKTsKICAgICAgcmV0dXJuIDE7CiAgICB9CgogIC8qIEluaXRpYXRlIHRoZSBxdWVyaWVzLCBvbmUgcGVyIGNvbW1hbmQtbGluZSBhcmd1bWVudC4gKi8KICBmb3IgKCA7ICphcmd2OyBhcmd2KyspCiAgICB7CiAgICAgIHN0cnVjdCBpbl9hZGRyIGFkZHI7CiAgICAgIGNoYXIgYnVmWzEwMF07CgogICAgICAvKiBJZiB0aGlzIGZhaWxzLCBhc3N1bWUgJyphcmd2JyBpcyBhIGhvc3QtbmFtZSB0aGF0CiAgICAgICAqIG11c3QgYmUgcmVzb2x2ZWQgZmlyc3QKICAgICAgICovCiAgICAgIGlmIChhcmVzX2luZXRfcHRvbihBRl9JTkVULCAqYXJndiwgJmFkZHIpICE9IDEpCiAgICAgICAgewogICAgICAgICAgYXJlc19nZXRob3N0YnluYW1lKGNoYW5uZWwsICphcmd2LCBBRl9JTkVULCBjYWxsYmFjazIsICZhZGRyKTsKICAgICAgICAgIHdhaXRfYXJlcyhjaGFubmVsKTsKICAgICAgICAgIGlmIChhZGRyLnNfYWRkciA9PSBJTkFERFJfTk9ORSkKICAgICAgICAgICAgewogICAgICAgICAgICAgIHByaW50ZigiRmFpbGVkIHRvIGxvb2t1cCAlc1xuIiwgKmFyZ3YpOwogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgc3ByaW50ZihidWYsIG5lcmRfZm10LAogICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpKGFkZHIuc19hZGRyID4+IDI0KSwKICAgICAgICAgICAgICAodW5zaWduZWQgaW50KSgoYWRkci5zX2FkZHIgPj4gMTYpICYgMjU1KSwKICAgICAgICAgICAgICAodW5zaWduZWQgaW50KSgoYWRkci5zX2FkZHIgPj4gOCkgJiAyNTUpLAogICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpKGFkZHIuc19hZGRyICYgMjU1KSk7CiAgICAgIFRSQUNFKCgiTG9va2luZyB1cCAlcy4uLiIsIGJ1ZikpOwogICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICAgYXJlc19nZXRob3N0YnluYW1lKGNoYW5uZWwsIGJ1ZiwgQUZfSU5FVCwgY2FsbGJhY2ssIGJ1Zik7CiAgICB9CgogIHdhaXRfYXJlcyhjaGFubmVsKTsKICBhcmVzX2Rlc3Ryb3koY2hhbm5lbCk7CgogIGFyZXNfbGlicmFyeV9jbGVhbnVwKCk7CgojaWYgZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoV0FUVDMyKQogIFdTQUNsZWFudXAoKTsKI2VuZGlmCgogIHJldHVybiAwOwp9CgovKgogKiBXYWl0IGZvciB0aGUgcXVlcmllcyB0byBjb21wbGV0ZS4KICovCnN0YXRpYyB2b2lkIHdhaXRfYXJlcyhhcmVzX2NoYW5uZWwgY2hhbm5lbCkKewogIGZvciAoOzspCiAgICB7CiAgICAgIHN0cnVjdCB0aW1ldmFsICp0dnAsIHR2OwogICAgICBmZF9zZXQgcmVhZF9mZHMsIHdyaXRlX2ZkczsKICAgICAgaW50IG5mZHM7CgogICAgICBGRF9aRVJPKCZyZWFkX2Zkcyk7CiAgICAgIEZEX1pFUk8oJndyaXRlX2Zkcyk7CiAgICAgIG5mZHMgPSBhcmVzX2ZkcyhjaGFubmVsLCAmcmVhZF9mZHMsICZ3cml0ZV9mZHMpOwogICAgICBpZiAobmZkcyA9PSAwKQogICAgICAgIGJyZWFrOwogICAgICB0dnAgPSBhcmVzX3RpbWVvdXQoY2hhbm5lbCwgTlVMTCwgJnR2KTsKICAgICAgc2VsZWN0KG5mZHMsICZyZWFkX2ZkcywgJndyaXRlX2ZkcywgTlVMTCwgdHZwKTsKICAgICAgYXJlc19wcm9jZXNzKGNoYW5uZWwsICZyZWFkX2ZkcywgJndyaXRlX2Zkcyk7CiAgICB9Cn0KCi8qCiAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIHVzZWQgd2hlbiB3ZSBoYXZlIHRoZSBJUC1hZGRyZXNzIG9mIGludGVyZXN0LgogKiBFeHRyYWN0IHRoZSBDTkFNRSBhbmQgZmlndXJlIG91dCB0aGUgY291bnRyeS1jb2RlIGZyb20gaXQuCiAqLwpzdGF0aWMgdm9pZCBjYWxsYmFjayh2b2lkICphcmcsIGludCBzdGF0dXMsIGludCB0aW1lb3V0cywgc3RydWN0IGhvc3RlbnQgKmhvc3QpCnsKICBjb25zdCBjaGFyICpuYW1lID0gKGNvbnN0IGNoYXIqKWFyZzsKICBjb25zdCBjaGFyICpjbmFtZTsKICBjaGFyIGJ1ZlsyMF07CgogICh2b2lkKXRpbWVvdXRzOwoKICBpZiAoIWhvc3QgfHwgc3RhdHVzICE9IEFSRVNfU1VDQ0VTUykKICAgIHsKICAgICAgcHJpbnRmKCJGYWlsZWQgdG8gbG9va3VwICVzOiAlc1xuIiwgbmFtZSwgYXJlc19zdHJlcnJvcihzdGF0dXMpKTsKICAgICAgcmV0dXJuOwogICAgfQoKICBUUkFDRSgoIlxuRm91bmQgYWRkcmVzcyAlcywgbmFtZSAlc1xuIiwKICAgICAgICAgYXJlc19pbmV0X250b3AoQUZfSU5FVCwoY29uc3QgY2hhciopaG9zdC0+aF9hZGRyLGJ1ZixzaXplb2YoYnVmKSksCiAgICAgICAgIGhvc3QtPmhfbmFtZSkpOwoKICBjbmFtZSA9IGhvc3QtPmhfbmFtZTsgIC8qIENOQU1FIGdldHMgcHV0IGhlcmUgKi8KICBpZiAoIWNuYW1lKQogICAgcHJpbnRmKCJGYWlsZWQgdG8gZ2V0IENOQU1FIGZvciAlc1xuIiwgbmFtZSk7CiAgZWxzZQogICAgZmluZF9jb3VudHJ5X2Zyb21fY25hbWUoY25hbWUsICooc3RydWN0IGluX2FkZHIqKWhvc3QtPmhfYWRkcik7Cn0KCi8qCiAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIHVzZWQgdG8gb2J0YWluIHRoZSBJUC1hZGRyZXNzIG9mIHRoZSBob3N0IG9mIGludGVyZXN0LgogKi8Kc3RhdGljIHZvaWQgY2FsbGJhY2syKHZvaWQgKmFyZywgaW50IHN0YXR1cywgaW50IHRpbWVvdXRzLCBzdHJ1Y3QgaG9zdGVudCAqaG9zdCkKewogIHN0cnVjdCBpbl9hZGRyICphZGRyID0gKHN0cnVjdCBpbl9hZGRyKikgYXJnOwoKICAodm9pZCl0aW1lb3V0czsKICBpZiAoIWhvc3QgfHwgc3RhdHVzICE9IEFSRVNfU1VDQ0VTUykKICAgIG1lbXNldChhZGRyLCBJTkFERFJfTk9ORSwgc2l6ZW9mKCphZGRyKSk7CiAgZWxzZQogICAgbWVtY3B5KGFkZHIsIGhvc3QtPmhfYWRkciwgc2l6ZW9mKCphZGRyKSk7Cn0KCnN0cnVjdCBzZWFyY2hfbGlzdCB7CiAgICAgICBpbnQgICAgICAgICBjb3VudHJ5X251bWJlcjsgLyogSVNPLTMxNjYgY291bnRyeSBudW1iZXIgKi8KICAgICAgIGNoYXIgICAgICAgIHNob3J0X25hbWVbM107ICAvKiBBMiBzaG9ydCBjb3VudHJ5IGNvZGUgKi8KICAgICAgIGNvbnN0IGNoYXIgKmxvbmdfbmFtZTsgICAgICAvKiBub3JtYWwgY291bnRyeSBuYW1lICovCiAgICAgfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VhcmNoX2xpc3QgKmxpc3RfbG9va3VwKGludCBudW1iZXIsIGNvbnN0IHN0cnVjdCBzZWFyY2hfbGlzdCAqbGlzdCwgaW50IG51bSkKewogIHdoaWxlIChudW0gPiAwICYmIGxpc3QtPmxvbmdfbmFtZSkKICAgIHsKICAgICAgaWYgKGxpc3QtPmNvdW50cnlfbnVtYmVyID09IG51bWJlcikKICAgICAgICByZXR1cm4gKGxpc3QpOwogICAgICBudW0tLTsKICAgICAgbGlzdCsrOwogICAgfQogIHJldHVybiAoTlVMTCk7Cn0KCi8qCiAqIFJlZjogZnRwOi8vZnRwLnJpcGUubmV0L2lzbzMxNjYtY291bnRyeWNvZGVzLnR4dAogKi8Kc3RhdGljIGNvbnN0IHN0cnVjdCBzZWFyY2hfbGlzdCBjb3VudHJ5X2xpc3RbXSA9IHsKICAgICAgIHsgICA0LCAiYWYiLCAiQWZnaGFuaXN0YW4iICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAyNDgsICJheCIsICLFbGFuZCBJc2xhbmQiICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7ICAgOCwgImFsIiwgIkFsYmFuaWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgIDEyLCAiZHoiLCAiQWxnZXJpYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAgMTYsICJhcyIsICJBbWVyaWNhbiBTYW1vYSIgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7ICAyMCwgImFkIiwgIkFuZG9ycmEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgIDI0LCAiYW8iLCAiQW5nb2xhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA2NjAsICJhaSIsICJBbmd1aWxsYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7ICAxMCwgImFxIiwgIkFudGFyY3RpY2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgIDI4LCAiYWciLCAiQW50aWd1YSAmIEJhcmJ1ZGEiICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAgMzIsICJhciIsICJBcmdlbnRpbmEiICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7ICA1MSwgImFtIiwgIkFybWVuaWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNTMzLCAiYXciLCAiQXJ1YmEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAgMzYsICJhdSIsICJBdXN0cmFsaWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7ICA0MCwgImF0IiwgIkF1c3RyaWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgIDMxLCAiYXoiLCAiQXplcmJhaWphbiIgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAgNDQsICJicyIsICJCYWhhbWFzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7ICA0OCwgImJoIiwgIkJhaHJhaW4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgIDUwLCAiYmQiLCAiQmFuZ2xhZGVzaCIgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAgNTIsICJiYiIsICJCYXJiYWRvcyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDExMiwgImJ5IiwgIkJlbGFydXMiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgIDU2LCAiYmUiLCAiQmVsZ2l1bSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAgODQsICJieiIsICJCZWxpemUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDIwNCwgImJqIiwgIkJlbmluIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgIDYwLCAiYm0iLCAiQmVybXVkYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAgNjQsICJidCIsICJCaHV0YW4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7ICA2OCwgImJvIiwgIkJvbGl2aWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgIDcwLCAiYmEiLCAiQm9zbmlhICYgSGVyemVnb3dpbmEiICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAgNzIsICJidyIsICJCb3Rzd2FuYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7ICA3NCwgImJ2IiwgIkJvdXZldCBJc2xhbmQiICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgIDc2LCAiYnIiLCAiQnJhemlsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAgODYsICJpbyIsICJCcml0aXNoIEluZGlhbiBPY2VhbiBUZXJyaXRvcnkiICAgICAgIH0sCiAgICAgICB7ICA5NiwgImJuIiwgIkJydW5laSBEYXJ1c3NhbGFtIiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMTAwLCAiYmciLCAiQnVsZ2FyaWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA4NTQsICJiZiIsICJCdXJraW5hIEZhc28iICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDEwOCwgImJpIiwgIkJ1cnVuZGkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMTE2LCAia2giLCAiQ2FtYm9kaWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAxMjAsICJjbSIsICJDYW1lcm9vbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDEyNCwgImNhIiwgIkNhbmFkYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMTMyLCAiY3YiLCAiQ2FwZSBWZXJkZSIgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAxMzYsICJreSIsICJDYXltYW4gSXNsYW5kcyIgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDE0MCwgImNmIiwgIkNlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYyIgICAgICAgICAgICAgfSwKICAgICAgIHsgMTQ4LCAidGQiLCAiQ2hhZCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAxNTIsICJjbCIsICJDaGlsZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDE1NiwgImNuIiwgIkNoaW5hIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMTYyLCAiY3giLCAiQ2hyaXN0bWFzIElzbGFuZCIgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAxNjYsICJjYyIsICJDb2NvcyBJc2xhbmRzIiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDE3MCwgImNvIiwgIkNvbG9tYmlhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMTc0LCAia20iLCAiQ29tb3JvcyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAxNzgsICJjZyIsICJDb25nbyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDE4MCwgImNkIiwgIkNvbmdvIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMTg0LCAiY2siLCAiQ29vayBJc2xhbmRzIiAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAxODgsICJjciIsICJDb3N0YSBSaWNhIiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDM4NCwgImNpIiwgIkNvdGUgZCdJdm9pcmUiICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMTkxLCAiaHIiLCAiQ3JvYXRpYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAxOTIsICJjdSIsICJDdWJhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDE5NiwgImN5IiwgIkN5cHJ1cyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMjAzLCAiY3oiLCAiQ3plY2ggUmVwdWJsaWMiICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAyMDgsICJkayIsICJEZW5tYXJrIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDI2MiwgImRqIiwgIkRqaWJvdXRpIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMjEyLCAiZG0iLCAiRG9taW5pY2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAyMTQsICJkbyIsICJEb21pbmljYW4gUmVwdWJsaWMiICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDIxOCwgImVjIiwgIkVjdWFkb3IiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgODE4LCAiZWciLCAiRWd5cHQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAyMjIsICJzdiIsICJFbCBTYWx2YWRvciIgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDIyNiwgImdxIiwgIkVxdWF0b3JpYWwgR3VpbmVhIiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMjMyLCAiZXIiLCAiRXJpdHJlYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAyMzMsICJlZSIsICJFc3RvbmlhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDIzMSwgImV0IiwgIkV0aGlvcGlhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMjM4LCAiZmsiLCAiRmFsa2xhbmQgSXNsYW5kcyIgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAyMzQsICJmbyIsICJGYXJvZSBJc2xhbmRzIiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDI0MiwgImZqIiwgIkZpamkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMjQ2LCAiZmkiLCAiRmlubGFuZCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAyNTAsICJmciIsICJGcmFuY2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDI0OSwgImZ4IiwgIkZyYW5jZSwgTWV0cm9wb2xpdGFuIiAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMjU0LCAiZ2YiLCAiRnJlbmNoIEd1aWFuYSIgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAyNTgsICJwZiIsICJGcmVuY2ggUG9seW5lc2lhIiAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDI2MCwgInRmIiwgIkZyZW5jaCBTb3V0aGVybiBUZXJyaXRvcmllcyIgICAgICAgICAgfSwKICAgICAgIHsgMjY2LCAiZ2EiLCAiR2Fib24iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAyNzAsICJnbSIsICJHYW1iaWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDI2OCwgImdlIiwgIkdlb3JnaWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMjc2LCAiZGUiLCAiR2VybWFueSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAyODgsICJnaCIsICJHaGFuYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDI5MiwgImdpIiwgIkdpYnJhbHRhciIgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMzAwLCAiZ3IiLCAiR3JlZWNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAzMDQsICJnbCIsICJHcmVlbmxhbmQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDMwOCwgImdkIiwgIkdyZW5hZGEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMzEyLCAiZ3AiLCAiR3VhZGVsb3VwZSIgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAzMTYsICJndSIsICJHdWFtIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDMyMCwgImd0IiwgIkd1YXRlbWFsYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMzI0LCAiZ24iLCAiR3VpbmVhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA2MjQsICJndyIsICJHdWluZWEtQmlzc2F1IiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDMyOCwgImd5IiwgIkd1eWFuYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMzMyLCAiaHQiLCAiSGFpdGkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAzMzQsICJobSIsICJIZWFyZCAmIE1jIERvbmFsZCBJc2xhbmRzIiAgICAgICAgICAgIH0sCiAgICAgICB7IDMzNiwgInZhIiwgIlZhdGljYW4gQ2l0eSIgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMzQwLCAiaG4iLCAiSG9uZHVyYXMiICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAzNDQsICJoayIsICJIb25nIGtvbmciICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDM0OCwgImh1IiwgIkh1bmdhcnkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMzUyLCAiaXMiLCAiSWNlbGFuZCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAzNTYsICJpbiIsICJJbmRpYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDM2MCwgImlkIiwgIkluZG9uZXNpYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMzY0LCAiaXIiLCAiSXJhbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAzNjgsICJpcSIsICJJcmFxIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDM3MiwgImllIiwgIklyZWxhbmQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMzc2LCAiaWwiLCAiSXNyYWVsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAzODAsICJpdCIsICJJdGFseSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDM4OCwgImptIiwgIkphbWFpY2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMzkyLCAianAiLCAiSmFwYW4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA0MDAsICJqbyIsICJKb3JkYW4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDM5OCwgImt6IiwgIkthemFraHN0YW4iICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNDA0LCAia2UiLCAiS2VueWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAyOTYsICJraSIsICJLaXJpYmF0aSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDQwOCwgImtwIiwgIktvcmVhIChub3J0aCkiICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNDEwLCAia3IiLCAiS29yZWEgKHNvdXRoKSIgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA0MTQsICJrdyIsICJLdXdhaXQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDQxNywgImtnIiwgIkt5cmd5enN0YW4iICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNDE4LCAibGEiLCAiTGFvcyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA0MjgsICJsdiIsICJMYXR2aWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDQyMiwgImxiIiwgIkxlYmFub24iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNDI2LCAibHMiLCAiTGVzb3RobyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA0MzAsICJsciIsICJMaWJlcmlhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDQzNCwgImx5IiwgIkxpYnlhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNDM4LCAibGkiLCAiTGllY2h0ZW5zdGVpbiIgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA0NDAsICJsdCIsICJMaXRodWFuaWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDQ0MiwgImx1IiwgIkx1eGVtYm91cmciICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNDQ2LCAibW8iLCAiTWFjYW8iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA4MDcsICJtayIsICJNYWNlZG9uaWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDQ1MCwgIm1nIiwgIk1hZGFnYXNjYXIiICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNDU0LCAibXciLCAiTWFsYXdpIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA0NTgsICJteSIsICJNYWxheXNpYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDQ2MiwgIm12IiwgIk1hbGRpdmVzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNDY2LCAibWwiLCAiTWFsaSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA0NzAsICJtdCIsICJNYWx0YSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDU4NCwgIm1oIiwgIk1hcnNoYWxsIElzbGFuZHMiICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNDc0LCAibXEiLCAiTWFydGluaXF1ZSIgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA0NzgsICJtciIsICJNYXVyaXRhbmlhIiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDQ4MCwgIm11IiwgIk1hdXJpdGl1cyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMTc1LCAieXQiLCAiTWF5b3R0ZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA0ODQsICJteCIsICJNZXhpY28iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDU4MywgImZtIiwgIk1pY3JvbmVzaWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNDk4LCAibWQiLCAiTW9sZG92YSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA0OTIsICJtYyIsICJNb25hY28iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDQ5NiwgIm1uIiwgIk1vbmdvbGlhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNTAwLCAibXMiLCAiTW9udHNlcnJhdCIgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA1MDQsICJtYSIsICJNb3JvY2NvIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDUwOCwgIm16IiwgIk1vemFtYmlxdWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMTA0LCAibW0iLCAiTXlhbm1hciIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA1MTYsICJuYSIsICJOYW1pYmlhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDUyMCwgIm5yIiwgIk5hdXJ1IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNTI0LCAibnAiLCAiTmVwYWwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA1MjgsICJubCIsICJOZXRoZXJsYW5kcyIgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDUzMCwgImFuIiwgIk5ldGhlcmxhbmRzIEFudGlsbGVzIiAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNTQwLCAibmMiLCAiTmV3IENhbGVkb25pYSIgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA1NTQsICJueiIsICJOZXcgWmVhbGFuZCIgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDU1OCwgIm5pIiwgIk5pY2FyYWd1YSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNTYyLCAibmUiLCAiTmlnZXIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA1NjYsICJuZyIsICJOaWdlcmlhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDU3MCwgIm51IiwgIk5pdWUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNTc0LCAibmYiLCAiTm9yZm9sayBJc2xhbmQiICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA1ODAsICJtcCIsICJOb3J0aGVybiBNYXJpYW5hIElzbGFuZHMiICAgICAgICAgICAgIH0sCiAgICAgICB7IDU3OCwgIm5vIiwgIk5vcndheSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNTEyLCAib20iLCAiT21hbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA1ODYsICJwayIsICJQYWtpc3RhbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDU4NSwgInB3IiwgIlBhbGF1IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMjc1LCAicHMiLCAiUGFsZXN0aW5pYW4gVGVycml0b3J5IiAgICAgICAgICAgICAgICB9LAogICAgICAgeyA1OTEsICJwYSIsICJQYW5hbWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDU5OCwgInBnIiwgIlBhcHVhIE5ldyBHdWluZWEiICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNjAwLCAicHkiLCAiUGFyYWd1YXkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA2MDQsICJwZSIsICJQZXJ1IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDYwOCwgInBoIiwgIlBoaWxpcHBpbmVzIiAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNjEyLCAicG4iLCAiUGl0Y2Fpcm4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA2MTYsICJwbCIsICJQb2xhbmQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDYyMCwgInB0IiwgIlBvcnR1Z2FsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNjMwLCAicHIiLCAiUHVlcnRvIFJpY28iICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA2MzQsICJxYSIsICJRYXRhciIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDYzOCwgInJlIiwgIlJldW5pb24iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNjQyLCAicm8iLCAiUm9tYW5pYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA2NDMsICJydSIsICJSdXNzaWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDY0NiwgInJ3IiwgIlJ3YW5kYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNjU5LCAia24iLCAiU2FpbnQgS2l0dHMgJiBOZXZpcyIgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA2NjIsICJsYyIsICJTYWludCBMdWNpYSIgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDY3MCwgInZjIiwgIlNhaW50IFZpbmNlbnQiICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgODgyLCAid3MiLCAiU2Ftb2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA2NzQsICJzbSIsICJTYW4gTWFyaW5vIiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDY3OCwgInN0IiwgIlNhbyBUb21lICYgUHJpbmNpcGUiICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNjgyLCAic2EiLCAiU2F1ZGkgQXJhYmlhIiAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA2ODYsICJzbiIsICJTZW5lZ2FsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDg5MSwgImNzIiwgIlNlcmJpYSBhbmQgTW9udGVuZWdybyIgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNjkwLCAic2MiLCAiU2V5Y2hlbGxlcyIgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA2OTQsICJzbCIsICJTaWVycmEgTGVvbmUiICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDcwMiwgInNnIiwgIlNpbmdhcG9yZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNzAzLCAic2siLCAiU2xvdmFraWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA3MDUsICJzaSIsICJTbG92ZW5pYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7ICA5MCwgInNiIiwgIlNvbG9tb24gSXNsYW5kcyIgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNzA2LCAic28iLCAiU29tYWxpYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA3MTAsICJ6YSIsICJTb3V0aCBBZnJpY2EiICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDIzOSwgImdzIiwgIlNvdXRoIEdlb3JnaWEiICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNzI0LCAiZXMiLCAiU3BhaW4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyAxNDQsICJsayIsICJTcmkgTGFua2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDY1NCwgInNoIiwgIlN0LiBIZWxlbmEiICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNjY2LCAicG0iLCAiU3QuIFBpZXJyZSAmIE1pcXVlbG9uIiAgICAgICAgICAgICAgICB9LAogICAgICAgeyA3MzYsICJzZCIsICJTdWRhbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDc0MCwgInNyIiwgIlN1cmluYW1lIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNzQ0LCAic2oiLCAiU3ZhbGJhcmQgJiBKYW4gTWF5ZW4gSXNsYW5kcyIgICAgICAgICB9LAogICAgICAgeyA3NDgsICJzeiIsICJTd2F6aWxhbmQiICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDc1MiwgInNlIiwgIlN3ZWRlbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNzU2LCAiY2giLCAiU3dpdHplcmxhbmQiICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA3NjAsICJzeSIsICJTeXJpYW4gQXJhYiBSZXB1YmxpYyIgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDYyNiwgInRsIiwgIlRpbW9yLUxlc3RlIiAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgMTU4LCAidHciLCAiVGFpd2FuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA3NjIsICJ0aiIsICJUYWppa2lzdGFuIiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDgzNCwgInR6IiwgIlRhbnphbmlhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNzY0LCAidGgiLCAiVGhhaWxhbmQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA3NjgsICJ0ZyIsICJUb2dvIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDc3MiwgInRrIiwgIlRva2VsYXUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNzc2LCAidG8iLCAiVG9uZ2EiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA3ODAsICJ0dCIsICJUcmluaWRhZCAmIFRvYmFnbyIgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDc4OCwgInRuIiwgIlR1bmlzaWEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNzkyLCAidHIiLCAiVHVya2V5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA3OTUsICJ0bSIsICJUdXJrbWVuaXN0YW4iICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDc5NiwgInRjIiwgIlR1cmtzICYgQ2FpY29zIElzbGFuZHMiICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNzk4LCAidHYiLCAiVHV2YWx1IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA4MDAsICJ1ZyIsICJVZ2FuZGEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDgwNCwgInVhIiwgIlVrcmFpbmUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNzg0LCAiYWUiLCAiVW5pdGVkIEFyYWIgRW1pcmF0ZXMiICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA4MjYsICJnYiIsICJVbml0ZWQgS2luZ2RvbSIgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDg0MCwgInVzIiwgIlVuaXRlZCBTdGF0ZXMiICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNTgxLCAidW0iLCAiVW5pdGVkIFN0YXRlcyBNaW5vciBPdXRseWluZyBJc2xhbmRzIiB9LAogICAgICAgeyA4NTgsICJ1eSIsICJVcnVndWF5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDg2MCwgInV6IiwgIlV6YmVraXN0YW4iICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNTQ4LCAidnUiLCAiVmFudWF0dSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA4NjIsICJ2ZSIsICJWZW5lenVlbGEiICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDcwNCwgInZuIiwgIlZpZXRuYW0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgIDkyLCAidmciLCAiVmlyZ2luIElzbGFuZHMgKEJyaXRpc2gpIiAgICAgICAgICAgICB9LAogICAgICAgeyA4NTAsICJ2aSIsICJWaXJnaW4gSXNsYW5kcyAoVVMpIiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDg3NiwgIndmIiwgIldhbGxpcyAmIEZ1dHVuYSBJc2xhbmRzIiAgICAgICAgICAgICAgfSwKICAgICAgIHsgNzMyLCAiZWgiLCAiV2VzdGVybiBTYWhhcmEiICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgeyA4ODcsICJ5ZSIsICJZZW1lbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICB7IDg5NCwgInptIiwgIlphbWJpYSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgIHsgNzE2LCAienciLCAiWmltYmFid2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgfTsKCi8qCiAqIENoZWNrIGlmIHN0YXJ0IG9mICdzdHInIGlzIHNpbXBseSBhbiBJUHY0IGFkZHJlc3MuCiAqLwojZGVmaW5lIEJZVEVfT0soeCkgKCh4KSA+PSAwICYmICh4KSA8PSAyNTUpCgpzdGF0aWMgaW50IGlzX2FkZHIoY2hhciAqc3RyLCBjaGFyICoqZW5kKQp7CiAgaW50IGEwLCBhMSwgYTIsIGEzLCBudW0sIHJjID0gMCwgbGVuZ3RoID0gMDsKCiAgbnVtID0gc3NjYW5mKHN0ciwiJTNkLiUzZC4lM2QuJTNkJW4iLCZhMCwmYTEsJmEyLCZhMywmbGVuZ3RoKTsKICBpZiggKG51bSA9PSA0KSAmJgogICAgICBCWVRFX09LKGEwKSAmJiBCWVRFX09LKGExKSAmJiBCWVRFX09LKGEyKSAmJiBCWVRFX09LKGEzKSAmJgogICAgICBsZW5ndGggPj0gKDMrNCkpCiAgICB7CiAgICAgIHJjID0gMTsKICAgICAgKmVuZCA9IHN0ciArIGxlbmd0aDsKICAgIH0KICByZXR1cm4gcmM7Cn0KCi8qCiAqIEZpbmQgdGhlIGNvdW50cnktY29kZSBhbmQgbmFtZSBmcm9tIHRoZSBDTkFNRS4gRS5nLjoKICogICB2ZXJzaW9uIDE6IENOQU1FID0genpuby5jb3VudHJpZXMubmVyZC5kayB3aXRoIGFkZHJlc3MgMTI3LjAuMi42NgogKiAgICAgICAgICAgICAgeWllbGRzIGNjb2RlX0EiID0gIm5vIiBhbmQgY251bWJlciA1NzggKDIuNjYpLgogKiAgIHZlcnNpb24gMjogQ05BTUUgPSA8YS5iLmMuZD4uenouY291bnRyaWVzLm5lcmQuZGsgd2l0aCBhZGRyZXNzIDEyNy4wLjIuNjYKICogICAgICAgICAgICAgIHlpZWxkcyBjbnVtYmVyIDU3OCAoMi42NikuIGNjb2RlX0EgaXMgIiI7CiAqLwpzdGF0aWMgdm9pZCBmaW5kX2NvdW50cnlfZnJvbV9jbmFtZShjb25zdCBjaGFyICpjbmFtZSwgc3RydWN0IGluX2FkZHIgYWRkcikKewogIGNvbnN0IHN0cnVjdCBzZWFyY2hfbGlzdCAqY291bnRyeTsKICBjaGFyICBjY29kZV9BMlszXSwgKmNjb3B5LCAqZG90XzQ7CiAgaW50ICAgY251bWJlciwgejAsIHoxLCB2ZXJfMSwgdmVyXzI7CiAgdW5zaWduZWQgbG9uZyBpcDsKCiAgaXAgPSBudG9obChhZGRyLnNfYWRkcik7CiAgejAgPSBUT0xPV0VSKGNuYW1lWzBdKTsKICB6MSA9IFRPTE9XRVIoY25hbWVbMV0pOwogIGNjb3B5ID0gc3RyZHVwKGNuYW1lKTsKICBkb3RfNCA9IE5VTEw7CgogIHZlcl8xID0gKHowID09ICd6JyAmJiB6MSA9PSAneicgJiYgIXN0cmNhc2VjbXAoY25hbWUrNCxuZXJkX3ZlcjEpKTsKICB2ZXJfMiA9IChpc19hZGRyKGNjb3B5LCZkb3RfNCkgJiYgIXN0cmNhc2VjbXAoZG90XzQsbmVyZF92ZXIyKSk7CgogIGlmICh2ZXJfMSkKICAgIHsKICAgICAgY29uc3QgY2hhciAqZG90ID0gc3RyY2hyKGNuYW1lLCAnLicpOwogICAgICBpZiAoKHowICE9ICd6JyAmJiB6MSAhPSAneicpIHx8IGRvdCAhPSBjbmFtZSs0KQogICAgICAgIHsKICAgICAgICAgIHByaW50ZigiVW5leHBlY3RlZCBDTkFNRSAlcyAodmVyXzEpXG4iLCBjbmFtZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogIGVsc2UgaWYgKHZlcl8yKQogICAgewogICAgICB6MCA9IFRPTE9XRVIoZG90XzRbMV0pOwogICAgICB6MSA9IFRPTE9XRVIoZG90XzRbMl0pOwogICAgICBpZiAoejAgIT0gJ3onICYmIHoxICE9ICd6JykKICAgICAgICB7CiAgICAgICAgICBwcmludGYoIlVuZXhwZWN0ZWQgQ05BTUUgJXMgKHZlcl8yKVxuIiwgY25hbWUpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICBlbHNlCiAgICB7CiAgICAgIHByaW50ZigiVW5leHBlY3RlZCBDTkFNRSAlcyAodmVyPylcbiIsIGNuYW1lKTsKICAgICAgcmV0dXJuOwogICAgfQoKICBpZiAodmVyXzEpCiAgICB7CiAgICAgIGNjb2RlX0EyWzBdID0gKGNoYXIpVE9MT1dFUihjbmFtZVsyXSk7CiAgICAgIGNjb2RlX0EyWzFdID0gKGNoYXIpVE9MT1dFUihjbmFtZVszXSk7CiAgICAgIGNjb2RlX0EyWzJdID0gJ1wwJzsKICAgIH0KICBlbHNlCiAgICBjY29kZV9BMlswXSA9ICdcMCc7CgogIGNudW1iZXIgPSBpcCAmIDB4RkZGRjsKCiAgVFJBQ0UoKCJGb3VuZCBjb3VudHJ5LWNvZGUgYCVzJywgbnVtYmVyICVkXG4iLAogICAgICAgICB2ZXJfMSA/IGNjb2RlX0EyIDogIjxuL2E+IiwgY251bWJlcikpOwoKICBjb3VudHJ5ID0gbGlzdF9sb29rdXAoY251bWJlciwgY291bnRyeV9saXN0LAogICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY291bnRyeV9saXN0KSAvIHNpemVvZihjb3VudHJ5X2xpc3RbMF0pKTsKICBpZiAoIWNvdW50cnkpCiAgICBwcmludGYoIk5hbWUgZm9yIGNvdW50cnktbnVtYmVyICVkIG5vdCBmb3VuZC5cbiIsIGNudW1iZXIpOwogIGVsc2UKICAgIHsKICAgICAgaWYgKHZlcl8xKQogICAgICAgIHsKICAgICAgICAgIGlmICgoY291bnRyeS0+c2hvcnRfbmFtZVswXSAhPSBjY29kZV9BMlswXSkgfHwKICAgICAgICAgICAgICAoY291bnRyeS0+c2hvcnRfbmFtZVsxXSAhPSBjY29kZV9BMlsxXSkgfHwKICAgICAgICAgICAgICAoY291bnRyeS0+c2hvcnRfbmFtZVsyXSAhPSBjY29kZV9BMlsyXSkpCiAgICAgICAgICAgIHByaW50Zigic2hvcnQtbmFtZSBtaXNtYXRjaDsgJXMgdnMgJXNcbiIsCiAgICAgICAgICAgICAgICAgICBjb3VudHJ5LT5zaG9ydF9uYW1lLCBjY29kZV9BMik7CiAgICAgICAgfQogICAgICBwcmludGYoIiVzICglcyksIG51bWJlciAlZC5cbiIsCiAgICAgICAgICAgICBjb3VudHJ5LT5sb25nX25hbWUsIGNvdW50cnktPnNob3J0X25hbWUsIGNudW1iZXIpOwogICAgfQogIGZyZWUoY2NvcHkpOwp9Cgo=