LyoKICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkzLCAxOTk0CiAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgogKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCiAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgogKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCiAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICovCiAKLyoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIAlhZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAogKiAxOTk5LTA5LTE5IEJydW5vIEhhaWJsZSA8aGFpYmxlQGNsaXNwLmNvbnMub3JnPgogKiAJbW9kaWZpZWQgdG8gd29yayBjb3JyZWN0bHkgaW4gbXVsdGktYnl0ZSBsb2NhbGVzCiAqLwoKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPGxpbWl0cy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGVyci5oPgojaW5jbHVkZSAibmxzLmgiCgojaW5jbHVkZSAid2lkZWNoYXIuaCIKCiNpZmRlZiBIQVZFX1dJREVDSEFSCiNkZWZpbmUgd2NzX3dpZHRoKHMpIHdjc3dpZHRoKHMsd2NzbGVuKHMpKQpzdGF0aWMgd2NoYXJfdCAqbWJzX3RvX3djcyhjb25zdCBjaGFyICopOwojZWxzZQojZGVmaW5lIHdjc193aWR0aChzKSBzdHJsZW4ocykKI2RlZmluZSBtYnNfdG9fd2NzKHMpIHN0cmR1cChzKQpzdGF0aWMgY2hhciAqbXRzYWZlX3N0cnRvayhjaGFyICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKik7CiNkZWZpbmUgd2NzdG9rIG10c2FmZV9zdHJ0b2sKI2VuZGlmCgpzdGF0aWMgdm9pZCAgY19jb2x1bW5hdGUgX19QKCh2b2lkKSk7CnN0YXRpYyB2b2lkICplbWFsbG9jIF9fUCgoaW50KSk7CnN0YXRpYyB2b2lkICBpbnB1dCBfX1AoKEZJTEUgKikpOwpzdGF0aWMgdm9pZCAgbWFrZXRibCBfX1AoKHZvaWQpKTsKc3RhdGljIHZvaWQgIHByaW50IF9fUCgodm9pZCkpOwpzdGF0aWMgdm9pZCAgcl9jb2x1bW5hdGUgX19QKCh2b2lkKSk7CnN0YXRpYyB2b2lkICB1c2FnZSBfX1AoKHZvaWQpKTsKCmludCB0ZXJtd2lkdGggPSA4MDsJCS8qIGRlZmF1bHQgdGVybWluYWwgd2lkdGggKi8KCmludCBlbnRyaWVzOwkJCS8qIG51bWJlciBvZiByZWNvcmRzICovCmludCBldmFsOwkJCS8qIGV4aXQgdmFsdWUgKi8KaW50IG1heGxlbmd0aDsJCQkvKiBsb25nZXN0IHJlY29yZCAqLwp3Y2hhcl90ICoqbGlzdDsJCQkvKiBhcnJheSBvZiBwb2ludGVycyB0byByZWNvcmRzICovCndjaGFyX3QgZGVmYXVsdF9zZXBhcmF0b3JbXSA9IHsgJ1x0JywgJyAnLCAwIH07CndjaGFyX3QgKnNlcGFyYXRvciA9IGRlZmF1bHRfc2VwYXJhdG9yOwkvKiBmaWVsZCBzZXBhcmF0b3IgZm9yIHRhYmxlIG9wdGlvbiAqLwoKaW50Cm1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CglzdHJ1Y3Qgd2luc2l6ZSB3aW47CglGSUxFICpmcDsKCWludCBjaCwgdGZsYWcsIHhmbGFnOwoJY2hhciAqcDsKCglleHRlcm4gY2hhciAqX19wcm9nbmFtZTsKCV9fcHJvZ25hbWUgPSBhcmd2WzBdOwoKCXNldGxvY2FsZShMQ19BTEwsICIiKTsKCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7Cgl0ZXh0ZG9tYWluKFBBQ0tBR0UpOwoKCWlmIChpb2N0bCgxLCBUSU9DR1dJTlNaLCAmd2luKSA9PSAtMSB8fCAhd2luLndzX2NvbCkgewoJCWlmICgocCA9IGdldGVudigiQ09MVU1OUyIpKSAhPSBOVUxMKQoJCQl0ZXJtd2lkdGggPSBhdG9pKHApOwoJfSBlbHNlCgkJdGVybXdpZHRoID0gd2luLndzX2NvbDsKCgl0ZmxhZyA9IHhmbGFnID0gMDsKCXdoaWxlICgoY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImM6czp0eCIpKSAhPSAtMSkKCQlzd2l0Y2goY2gpIHsKCQljYXNlICdjJzoKCQkJdGVybXdpZHRoID0gYXRvaShvcHRhcmcpOwoJCQlicmVhazsKCQljYXNlICdzJzoKCQkJc2VwYXJhdG9yID0gbWJzX3RvX3djcyhvcHRhcmcpOwoJCQlicmVhazsKCQljYXNlICd0JzoKCQkJdGZsYWcgPSAxOwoJCQlicmVhazsKCQljYXNlICd4JzoKCQkJeGZsYWcgPSAxOwoJCQlicmVhazsKCQljYXNlICc/JzoKCQlkZWZhdWx0OgoJCQl1c2FnZSgpOwoJCX0KCWFyZ2MgLT0gb3B0aW5kOwoJYXJndiArPSBvcHRpbmQ7CgoJaWYgKCEqYXJndikKCQlpbnB1dChzdGRpbik7CgllbHNlIGZvciAoOyAqYXJndjsgKythcmd2KQoJCWlmICgoZnAgPSBmb3BlbigqYXJndiwgInIiKSkgIT0gTlVMTCkgewoJCQlpbnB1dChmcCk7CgkJCSh2b2lkKWZjbG9zZShmcCk7CgkJfSBlbHNlIHsKCQkJd2FybigiJXMiLCAqYXJndik7CgkJCWV2YWwgPSAxOwoJCX0KCglpZiAoIWVudHJpZXMpCgkJZXhpdChldmFsKTsKCglpZiAodGZsYWcpCgkJbWFrZXRibCgpOwoJZWxzZSBpZiAobWF4bGVuZ3RoID49IHRlcm13aWR0aCkKCQlwcmludCgpOwoJZWxzZSBpZiAoeGZsYWcpCgkJY19jb2x1bW5hdGUoKTsKCWVsc2UKCQlyX2NvbHVtbmF0ZSgpOwoJaWYgKGZlcnJvcihzdGRvdXQpIHx8IGZjbG9zZShzdGRvdXQpKQoJCWV2YWwgPSAxOwoJZXhpdChldmFsKTsKfQoKI2RlZmluZQlUQUIJOApzdGF0aWMgdm9pZApjX2NvbHVtbmF0ZSgpCnsKCWludCBjaGNudCwgY29sLCBjbnQsIGVuZGNvbCwgbnVtY29sczsKCXdjaGFyX3QgKipscDsKCgltYXhsZW5ndGggPSAobWF4bGVuZ3RoICsgVEFCKSAmIH4oVEFCIC0gMSk7CgludW1jb2xzID0gdGVybXdpZHRoIC8gbWF4bGVuZ3RoOwoJZW5kY29sID0gbWF4bGVuZ3RoOwoJZm9yIChjaGNudCA9IGNvbCA9IDAsIGxwID0gbGlzdDs7ICsrbHApIHsKCQlmcHV0d3MoKmxwLCBzdGRvdXQpOwoJCWNoY250ICs9IHdjc193aWR0aCgqbHApOwoJCWlmICghLS1lbnRyaWVzKQoJCQlicmVhazsKCQlpZiAoKytjb2wgPT0gbnVtY29scykgewoJCQljaGNudCA9IGNvbCA9IDA7CgkJCWVuZGNvbCA9IG1heGxlbmd0aDsKCQkJcHV0d2NoYXIoJ1xuJyk7CgkJfSBlbHNlIHsKCQkJd2hpbGUgKChjbnQgPSAoKGNoY250ICsgVEFCKSAmIH4oVEFCIC0gMSkpKSA8PSBlbmRjb2wpIHsKCQkJCXB1dHdjaGFyKCdcdCcpOwoJCQkJY2hjbnQgPSBjbnQ7CgkJCX0KCQkJZW5kY29sICs9IG1heGxlbmd0aDsKCQl9Cgl9CglpZiAoY2hjbnQpCgkJcHV0d2NoYXIoJ1xuJyk7Cn0KCnN0YXRpYyB2b2lkCnJfY29sdW1uYXRlKCkKewoJaW50IGJhc2UsIGNoY250LCBjbnQsIGNvbCwgZW5kY29sLCBudW1jb2xzLCBudW1yb3dzLCByb3c7CgoJbWF4bGVuZ3RoID0gKG1heGxlbmd0aCArIFRBQikgJiB+KFRBQiAtIDEpOwoJbnVtY29scyA9IHRlcm13aWR0aCAvIG1heGxlbmd0aDsKCWlmICghbnVtY29scykgCgkgIG51bWNvbHMgPSAxOwoJbnVtcm93cyA9IGVudHJpZXMgLyBudW1jb2xzOwoJaWYgKGVudHJpZXMgJSBudW1jb2xzKQoJCSsrbnVtcm93czsKCglmb3IgKHJvdyA9IDA7IHJvdyA8IG51bXJvd3M7ICsrcm93KSB7CgkJZW5kY29sID0gbWF4bGVuZ3RoOwoJCWZvciAoYmFzZSA9IHJvdywgY2hjbnQgPSBjb2wgPSAwOyBjb2wgPCBudW1jb2xzOyArK2NvbCkgewoJCQlmcHV0d3MobGlzdFtiYXNlXSwgc3Rkb3V0KTsKCQkJY2hjbnQgKz0gd2NzX3dpZHRoKGxpc3RbYmFzZV0pOwoJCQlpZiAoKGJhc2UgKz0gbnVtcm93cykgPj0gZW50cmllcykKCQkJCWJyZWFrOwoJCQl3aGlsZSAoKGNudCA9ICgoY2hjbnQgKyBUQUIpICYgfihUQUIgLSAxKSkpIDw9IGVuZGNvbCkgewoJCQkJcHV0d2NoYXIoJ1x0Jyk7CgkJCQljaGNudCA9IGNudDsKCQkJfQoJCQllbmRjb2wgKz0gbWF4bGVuZ3RoOwoJCX0KCQlwdXR3Y2hhcignXG4nKTsKCX0KfQoKc3RhdGljIHZvaWQKcHJpbnQoKQp7CglpbnQgY250OwoJd2NoYXJfdCAqKmxwOwoKCWZvciAoY250ID0gZW50cmllcywgbHAgPSBsaXN0OyBjbnQtLTsgKytscCkgewoJCWZwdXR3cygqbHAsIHN0ZG91dCk7CgkJcHV0d2NoYXIoJ1xuJyk7Cgl9Cn0KCnR5cGVkZWYgc3RydWN0IF90YmwgewoJd2NoYXJfdCAqKmxpc3Q7CglpbnQgY29scywgKmxlbjsKfSBUQkw7CiNkZWZpbmUJREVGQ09MUwkyNQoKc3RhdGljIHZvaWQKbWFrZXRibCgpCnsKCVRCTCAqdDsKCWludCBjb2xvZmYsIGNudCwgaTsKCXdjaGFyX3QgKnAsICoqbHA7CglpbnQgKmxlbnMsIG1heGNvbHM7CglUQkwgKnRibDsKCXdjaGFyX3QgKipjb2xzOwoJd2NoYXJfdCAqd2NzdG9rX3N0YXRlOwoKCXQgPSB0YmwgPSBlbWFsbG9jKGVudHJpZXMgKiBzaXplb2YoVEJMKSk7Cgljb2xzID0gZW1hbGxvYygobWF4Y29scyA9IERFRkNPTFMpICogc2l6ZW9mKHdjaGFyX3QgKikpOwoJbGVucyA9IGVtYWxsb2MobWF4Y29scyAqIHNpemVvZihpbnQpKTsKCWZvciAoY250ID0gMCwgbHAgPSBsaXN0OyBjbnQgPCBlbnRyaWVzOyArK2NudCwgKytscCwgKyt0KSB7CgkgICAgZm9yIChjb2xvZmYgPSAwLCBwID0gKmxwOwoJICAgICAgICAgKGNvbHNbY29sb2ZmXSA9IHdjc3RvayhwLCBzZXBhcmF0b3IsICZ3Y3N0b2tfc3RhdGUpKSAhPSBOVUxMOwoJICAgICAgICAgcCA9IE5VTEwpCgkJaWYgKCsrY29sb2ZmID09IG1heGNvbHMpIHsKCQkgICAgaWYgKCEoY29scyA9IHJlYWxsb2MoY29scywgKCh1X2ludCltYXhjb2xzICsgREVGQ09MUykKCQkJCQkgICAgICAgKiBzaXplb2Yod2NoYXJfdCAqKSkpIHx8CgkJCSEobGVucyA9IHJlYWxsb2MobGVucywgKCh1X2ludCltYXhjb2xzICsgREVGQ09MUykKCQkJCQkgICAgICAgKiBzaXplb2YoaW50KSkpKQoJCQllcnIoMSwgTlVMTCk7CgkJICAgIG1lbXNldCgoY2hhciAqKWxlbnMgKyBtYXhjb2xzICogc2l6ZW9mKGludCksCgkJCSAgIDAsIERFRkNPTFMgKiBzaXplb2YoaW50KSk7CgkJICAgIG1heGNvbHMgKz0gREVGQ09MUzsKCQl9CgkgICAgdC0+bGlzdCA9IGVtYWxsb2MoY29sb2ZmICogc2l6ZW9mKHdjaGFyX3QgKikpOwoJICAgIHQtPmxlbiA9IGVtYWxsb2MoY29sb2ZmICogc2l6ZW9mKGludCkpOwoJICAgIGZvciAodC0+Y29scyA9IGNvbG9mZjsgLS1jb2xvZmYgPj0gMDspIHsKCQl0LT5saXN0W2NvbG9mZl0gPSBjb2xzW2NvbG9mZl07CgkJdC0+bGVuW2NvbG9mZl0gPSB3Y3Nfd2lkdGgoY29sc1tjb2xvZmZdKTsKCQlpZiAodC0+bGVuW2NvbG9mZl0gPiBsZW5zW2NvbG9mZl0pCgkJICAgIGxlbnNbY29sb2ZmXSA9IHQtPmxlbltjb2xvZmZdOwoJICAgIH0KCX0KCWZvciAoY250ID0gMCwgdCA9IHRibDsgY250IDwgZW50cmllczsgKytjbnQsICsrdCkgewoJICAgIGZvciAoY29sb2ZmID0gMDsgY29sb2ZmIDwgdC0+Y29scyAtIDE7ICsrY29sb2ZmKSB7CgkJZnB1dHdzKHQtPmxpc3RbY29sb2ZmXSwgc3Rkb3V0KTsKCQlmb3IgKGkgPSBsZW5zW2NvbG9mZl0gLSB0LT5sZW5bY29sb2ZmXSArIDI7IGkgPiAwOyBpLS0pCgkJICAgIHB1dHdjaGFyKCcgJyk7CgkgICAgfQoJICAgIGZwdXR3cyh0LT5saXN0W2NvbG9mZl0sIHN0ZG91dCk7CgkgICAgcHV0d2NoYXIoJ1xuJyk7Cgl9Cn0KCiNkZWZpbmUJREVGTlVNCQkxMDAwCiNkZWZpbmUJTUFYTElORUxFTgkoTElORV9NQVggKyAxKQoKc3RhdGljIHZvaWQKaW5wdXQoZnApCglGSUxFICpmcDsKewoJc3RhdGljIGludCBtYXhlbnRyeTsKCWludCBsZW47Cgl3Y2hhcl90ICpwLCBidWZbTUFYTElORUxFTl07CgoJaWYgKCFsaXN0KQoJCWxpc3QgPSBlbWFsbG9jKChtYXhlbnRyeSA9IERFRk5VTSkgKiBzaXplb2Yod2NoYXJfdCAqKSk7Cgl3aGlsZSAoZmdldHdzKGJ1ZiwgTUFYTElORUxFTiwgZnApKSB7CgkJZm9yIChwID0gYnVmOyAqcCAmJiBpc3dzcGFjZSgqcCk7ICsrcCk7CgkJaWYgKCEqcCkKCQkJY29udGludWU7CgkJaWYgKCEocCA9IHdjc2NocihwLCAnXG4nKSkpIHsKCQkJd2FybngoXygibGluZSB0b28gbG9uZyIpKTsKCQkJZXZhbCA9IDE7CgkJCWNvbnRpbnVlOwoJCX0KCQkqcCA9ICdcMCc7CgkJbGVuID0gd2NzX3dpZHRoKGJ1Zik7CS8qIGxlbiA9IHAgLSBidWY7ICovCgkJaWYgKG1heGxlbmd0aCA8IGxlbikKCQkJbWF4bGVuZ3RoID0gbGVuOwoJCWlmIChlbnRyaWVzID09IG1heGVudHJ5KSB7CgkJCW1heGVudHJ5ICs9IERFRk5VTTsKCQkJaWYgKCEobGlzdCA9IHJlYWxsb2MobGlzdCwKCQkJICAgICh1X2ludCltYXhlbnRyeSAqIHNpemVvZih3Y2hhcl90ICopKSkpCgkJCQllcnIoMSwgTlVMTCk7CgkJfQoJCWxpc3RbZW50cmllcysrXSA9IHdjc2R1cChidWYpOwoJfQp9CgojaWZkZWYgSEFWRV9XSURFQ0hBUgpzdGF0aWMgd2NoYXJfdCAqbWJzX3RvX3djcyhjb25zdCBjaGFyICpzKQp7CglzaXplX3QgbjsKCXdjaGFyX3QgKndjczsKCgluID0gbWJzdG93Y3MoKHdjaGFyX3QgKikwLCBzLCAwKTsKCWlmIChuIDwgMCkKCQlyZXR1cm4gTlVMTDsKCXdjcyA9IG1hbGxvYygobiArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKCWlmICghd2NzKQoJCXJldHVybiBOVUxMOwoJaWYgKG1ic3Rvd2NzKHdjcywgcywgbiArIDEpIDwgMCkKCQlyZXR1cm4gTlVMTDsKCXJldHVybiB3Y3M7Cn0KI2VuZGlmCgojaWZuZGVmIEhBVkVfV0lERUNIQVIKc3RhdGljIGNoYXIgKm10c2FmZV9zdHJ0b2soY2hhciAqc3RyLCBjb25zdCBjaGFyICpkZWxpbSwgY2hhciAqKnB0cikKewoJaWYgKHN0ciA9PSBOVUxMKSB7CgkJc3RyID0gKnB0cjsKCQlpZiAoc3RyID09IE5VTEwpCgkJCXJldHVybiBOVUxMOwoJfQoJc3RyICs9IHN0cnNwbihzdHIsIGRlbGltKTsKCWlmICgqc3RyID09ICdcMCcpIHsKCQkqcHRyID0gTlVMTDsKCQlyZXR1cm4gTlVMTDsKCX0gZWxzZSB7CgkJY2hhciAqdG9rZW5fZW5kID0gc3RycGJyayhzdHIsIGRlbGltKTsKCQlpZiAodG9rZW5fZW5kKSB7CgkJCSp0b2tlbl9lbmQgPSAnXDAnOwoJCQkqcHRyID0gdG9rZW5fZW5kICsgMTsKCQl9IGVsc2UKCQkJKnB0ciA9IE5VTEw7CgkJcmV0dXJuIHN0cjsKCX0KfQojZW5kaWYKCnN0YXRpYyB2b2lkICoKZW1hbGxvYyhzaXplKQoJaW50IHNpemU7CnsKCWNoYXIgKnA7CgoJaWYgKCEocCA9IG1hbGxvYyhzaXplKSkpCgkJZXJyKDEsIE5VTEwpOwoJbWVtc2V0KHAsIDAsIHNpemUpOwoJcmV0dXJuIChwKTsKfQoKc3RhdGljIHZvaWQKdXNhZ2UoKQp7CgoJKHZvaWQpZnByaW50ZihzdGRlcnIsCgkgICAgXygidXNhZ2U6IGNvbHVtbiBbLXR4XSBbLWMgY29sdW1uc10gW2ZpbGUgLi4uXVxuIikpOwoJZXhpdCgxKTsKfQo=