LyoKICogQnVpbHRpbiAiZ2l0IGJyYW5jaCIKICoKICogQ29weXJpZ2h0IChjKSAyMDA2IEtyaXN0aWFuIEj4Z3NiZXJnIDxrcmhAcmVkaGF0LmNvbT4KICogQmFzZWQgb24gZ2l0LWJyYW5jaC5zaCBieSBKdW5pbyBDIEhhbWFuby4KICovCgojaW5jbHVkZSAiY2FjaGUuaCIKI2luY2x1ZGUgInJlZnMuaCIKI2luY2x1ZGUgImNvbW1pdC5oIgojaW5jbHVkZSAiYnVpbHRpbi5oIgoKc3RhdGljIGNvbnN0IGNoYXIgYnVpbHRpbl9icmFuY2hfdXNhZ2VbXSA9CiAgImdpdC1icmFuY2ggKC1kIHwgLUQpIDxicmFuY2huYW1lPiB8IFstbF0gWy1mXSA8YnJhbmNobmFtZT4gWzxzdGFydC1wb2ludD5dIHwgKC1tIHwgLU0pIFs8b2xkYnJhbmNoPl0gPG5ld2JyYW5jaD4gfCBbLXIgfCAtYV0gWy12IFstLWFiYnJldj08bGVuZ3RoPl1dIjsKCgpzdGF0aWMgY29uc3QgY2hhciAqaGVhZDsKc3RhdGljIHVuc2lnbmVkIGNoYXIgaGVhZF9zaGExWzIwXTsKCnN0YXRpYyBpbnQgaW5fbWVyZ2VfYmFzZXMoY29uc3QgdW5zaWduZWQgY2hhciAqc2hhMSwKCQkJICBzdHJ1Y3QgY29tbWl0ICpyZXYxLAoJCQkgIHN0cnVjdCBjb21taXQgKnJldjIpCnsKCXN0cnVjdCBjb21taXRfbGlzdCAqYmFzZXMsICpiOwoJaW50IHJldCA9IDA7CgoJYmFzZXMgPSBnZXRfbWVyZ2VfYmFzZXMocmV2MSwgcmV2MiwgMSk7Cglmb3IgKGIgPSBiYXNlczsgYjsgYiA9IGItPm5leHQpIHsKCQlpZiAoIWhhc2hjbXAoc2hhMSwgYi0+aXRlbS0+b2JqZWN0LnNoYTEpKSB7CgkJCXJldCA9IDE7CgkJCWJyZWFrOwoJCX0KCX0KCglmcmVlX2NvbW1pdF9saXN0KGJhc2VzKTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyB2b2lkIGRlbGV0ZV9icmFuY2hlcyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGludCBmb3JjZSkKewoJc3RydWN0IGNvbW1pdCAqcmV2LCAqaGVhZF9yZXYgPSBoZWFkX3JldjsKCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CgljaGFyICpuYW1lOwoJaW50IGk7CgoJaWYgKCFmb3JjZSkgewoJCWhlYWRfcmV2ID0gbG9va3VwX2NvbW1pdF9yZWZlcmVuY2UoaGVhZF9zaGExKTsKCQlpZiAoIWhlYWRfcmV2KQoJCQlkaWUoIkNvdWxkbid0IGxvb2sgdXAgY29tbWl0IG9iamVjdCBmb3IgSEVBRCIpOwoJfQoJZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgewoJCWlmICghc3RyY21wKGhlYWQsIGFyZ3ZbaV0pKQoJCQlkaWUoIkNhbm5vdCBkZWxldGUgdGhlIGJyYW5jaCB5b3UgYXJlIGN1cnJlbnRseSBvbi4iKTsKCgkJbmFtZSA9IHhzdHJkdXAobWtwYXRoKCJyZWZzL2hlYWRzLyVzIiwgYXJndltpXSkpOwoJCWlmICghcmVzb2x2ZV9yZWYobmFtZSwgc2hhMSwgMSwgTlVMTCkpCgkJCWRpZSgiQnJhbmNoICclcycgbm90IGZvdW5kLiIsIGFyZ3ZbaV0pOwoKCQlyZXYgPSBsb29rdXBfY29tbWl0X3JlZmVyZW5jZShzaGExKTsKCQlpZiAoIXJldikKCQkJZGllKCJDb3VsZG4ndCBsb29rIHVwIGNvbW1pdCBvYmplY3QgZm9yICclcyciLCBuYW1lKTsKCgkJLyogVGhpcyBjaGVja3Mgd2hldGhlciB0aGUgbWVyZ2UgYmFzZXMgb2YgYnJhbmNoIGFuZAoJCSAqIEhFQUQgY29udGFpbnMgYnJhbmNoIC0tIHdoaWNoIG1lYW5zIHRoYXQgdGhlIEhFQUQKCQkgKiBjb250YWlucyBldmVyeXRoaW5nIGluIGJvdGguCgkJICovCgoJCWlmICghZm9yY2UgJiYKCQkgICAgIWluX21lcmdlX2Jhc2VzKHNoYTEsIHJldiwgaGVhZF9yZXYpKSB7CgkJCWZwcmludGYoc3RkZXJyLAoJCQkJIlRoZSBicmFuY2ggJyVzJyBpcyBub3QgYSBzdHJpY3Qgc3Vic2V0IG9mIHlvdXIgY3VycmVudCBIRUFELlxuIgoJCQkJIklmIHlvdSBhcmUgc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgaXQsIHJ1biAnZ2l0IGJyYW5jaCAtRCAlcycuXG4iLAoJCQkJYXJndltpXSwgYXJndltpXSk7CgkJCWV4aXQoMSk7CgkJfQoKCQlpZiAoZGVsZXRlX3JlZihuYW1lLCBzaGExKSkKCQkJcHJpbnRmKCJFcnJvciBkZWxldGluZyBicmFuY2ggJyVzJ1xuIiwgYXJndltpXSk7CgkJZWxzZQoJCQlwcmludGYoIkRlbGV0ZWQgYnJhbmNoICVzLlxuIiwgYXJndltpXSk7CgoJCWZyZWUobmFtZSk7Cgl9Cn0KCiNkZWZpbmUgUkVGX1VOS05PV05fVFlQRSAgICAweDAwCiNkZWZpbmUgUkVGX0xPQ0FMX0JSQU5DSCAgICAweDAxCiNkZWZpbmUgUkVGX1JFTU9URV9CUkFOQ0ggICAweDAyCiNkZWZpbmUgUkVGX1RBRyAgICAgICAgICAgICAweDA0CgpzdHJ1Y3QgcmVmX2l0ZW0gewoJY2hhciAqbmFtZTsKCXVuc2lnbmVkIGludCBraW5kOwoJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKfTsKCnN0cnVjdCByZWZfbGlzdCB7CglpbnQgaW5kZXgsIGFsbG9jLCBtYXh3aWR0aDsKCXN0cnVjdCByZWZfaXRlbSAqbGlzdDsKCWludCBraW5kczsKfTsKCnN0YXRpYyBpbnQgYXBwZW5kX3JlZihjb25zdCBjaGFyICpyZWZuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzaGExLCBpbnQgZmxhZ3MsIHZvaWQgKmNiX2RhdGEpCnsKCXN0cnVjdCByZWZfbGlzdCAqcmVmX2xpc3QgPSAoc3RydWN0IHJlZl9saXN0KikoY2JfZGF0YSk7CglzdHJ1Y3QgcmVmX2l0ZW0gKm5ld2l0ZW07CglpbnQga2luZCA9IFJFRl9VTktOT1dOX1RZUEU7CglpbnQgbGVuOwoKCS8qIERldGVjdCBraW5kICovCglpZiAoIXN0cm5jbXAocmVmbmFtZSwgInJlZnMvaGVhZHMvIiwgMTEpKSB7CgkJa2luZCA9IFJFRl9MT0NBTF9CUkFOQ0g7CgkJcmVmbmFtZSArPSAxMTsKCX0gZWxzZSBpZiAoIXN0cm5jbXAocmVmbmFtZSwgInJlZnMvcmVtb3Rlcy8iLCAxMykpIHsKCQlraW5kID0gUkVGX1JFTU9URV9CUkFOQ0g7CgkJcmVmbmFtZSArPSAxMzsKCX0gZWxzZSBpZiAoIXN0cm5jbXAocmVmbmFtZSwgInJlZnMvdGFncy8iLCAxMCkpIHsKCQlraW5kID0gUkVGX1RBRzsKCQlyZWZuYW1lICs9IDEwOwoJfQoKCS8qIERvbid0IGFkZCB0eXBlcyB0aGUgY2FsbGVyIGRvZXNuJ3Qgd2FudCAqLwoJaWYgKChraW5kICYgcmVmX2xpc3QtPmtpbmRzKSA9PSAwKQoJCXJldHVybiAwOwoKCS8qIFJlc2l6ZSBidWZmZXIgKi8KCWlmIChyZWZfbGlzdC0+aW5kZXggPj0gcmVmX2xpc3QtPmFsbG9jKSB7CgkJcmVmX2xpc3QtPmFsbG9jID0gYWxsb2NfbnIocmVmX2xpc3QtPmFsbG9jKTsKCQlyZWZfbGlzdC0+bGlzdCA9IHhyZWFsbG9jKHJlZl9saXN0LT5saXN0LAoJCQkJcmVmX2xpc3QtPmFsbG9jICogc2l6ZW9mKHN0cnVjdCByZWZfaXRlbSkpOwoJfQoKCS8qIFJlY29yZCB0aGUgbmV3IGl0ZW0gKi8KCW5ld2l0ZW0gPSAmKHJlZl9saXN0LT5saXN0W3JlZl9saXN0LT5pbmRleCsrXSk7CgluZXdpdGVtLT5uYW1lID0geHN0cmR1cChyZWZuYW1lKTsKCW5ld2l0ZW0tPmtpbmQgPSBraW5kOwoJaGFzaGNweShuZXdpdGVtLT5zaGExLCBzaGExKTsKCWxlbiA9IHN0cmxlbihuZXdpdGVtLT5uYW1lKTsKCWlmIChsZW4gPiByZWZfbGlzdC0+bWF4d2lkdGgpCgkJcmVmX2xpc3QtPm1heHdpZHRoID0gbGVuOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBmcmVlX3JlZl9saXN0KHN0cnVjdCByZWZfbGlzdCAqcmVmX2xpc3QpCnsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCByZWZfbGlzdC0+aW5kZXg7IGkrKykKCQlmcmVlKHJlZl9saXN0LT5saXN0W2ldLm5hbWUpOwoJZnJlZShyZWZfbGlzdC0+bGlzdCk7Cn0KCnN0YXRpYyBpbnQgcmVmX2NtcChjb25zdCB2b2lkICpyMSwgY29uc3Qgdm9pZCAqcjIpCnsKCXN0cnVjdCByZWZfaXRlbSAqYzEgPSAoc3RydWN0IHJlZl9pdGVtICopKHIxKTsKCXN0cnVjdCByZWZfaXRlbSAqYzIgPSAoc3RydWN0IHJlZl9pdGVtICopKHIyKTsKCglpZiAoYzEtPmtpbmQgIT0gYzItPmtpbmQpCgkJcmV0dXJuIGMxLT5raW5kIC0gYzItPmtpbmQ7CglyZXR1cm4gc3RyY21wKGMxLT5uYW1lLCBjMi0+bmFtZSk7Cn0KCnN0YXRpYyB2b2lkIHByaW50X3JlZl9pbmZvKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsIGludCBhYmJyZXYpCnsKCXN0cnVjdCBjb21taXQgKmNvbW1pdDsKCWNoYXIgc3ViamVjdFsyNTZdOwoKCgljb21taXQgPSBsb29rdXBfY29tbWl0KHNoYTEpOwoJaWYgKGNvbW1pdCAmJiAhcGFyc2VfY29tbWl0KGNvbW1pdCkpCgkJcHJldHR5X3ByaW50X2NvbW1pdChDTUlUX0ZNVF9PTkVMSU5FLCBjb21taXQsIH4wLAoJCQkJICAgIHN1YmplY3QsIHNpemVvZihzdWJqZWN0KSwgMCwKCQkJCSAgICBOVUxMLCBOVUxMLCAwKTsKCWVsc2UKCQlzdHJjcHkoc3ViamVjdCwgIiAqKioqIGludmFsaWQgcmVmICoqKioiKTsKCglwcmludGYoIiAlcyAlc1xuIiwgZmluZF91bmlxdWVfYWJicmV2KHNoYTEsIGFiYnJldiksIHN1YmplY3QpOwp9CgpzdGF0aWMgdm9pZCBwcmludF9yZWZfbGlzdChpbnQga2luZHMsIGludCB2ZXJib3NlLCBpbnQgYWJicmV2KQp7CglpbnQgaTsKCWNoYXIgYzsKCXN0cnVjdCByZWZfbGlzdCByZWZfbGlzdDsKCgltZW1zZXQoJnJlZl9saXN0LCAwLCBzaXplb2YocmVmX2xpc3QpKTsKCXJlZl9saXN0LmtpbmRzID0ga2luZHM7Cglmb3JfZWFjaF9yZWYoYXBwZW5kX3JlZiwgJnJlZl9saXN0KTsKCglxc29ydChyZWZfbGlzdC5saXN0LCByZWZfbGlzdC5pbmRleCwgc2l6ZW9mKHN0cnVjdCByZWZfaXRlbSksIHJlZl9jbXApOwoKCWZvciAoaSA9IDA7IGkgPCByZWZfbGlzdC5pbmRleDsgaSsrKSB7CgkJYyA9ICcgJzsKCQlpZiAocmVmX2xpc3QubGlzdFtpXS5raW5kID09IFJFRl9MT0NBTF9CUkFOQ0ggJiYKCQkJCSFzdHJjbXAocmVmX2xpc3QubGlzdFtpXS5uYW1lLCBoZWFkKSkKCQkJYyA9ICcqJzsKCgkJaWYgKHZlcmJvc2UpIHsKCQkJcHJpbnRmKCIlYyAlLSpzIiwgYywgcmVmX2xpc3QubWF4d2lkdGgsCgkJCSAgICAgICByZWZfbGlzdC5saXN0W2ldLm5hbWUpOwoJCQlwcmludF9yZWZfaW5mbyhyZWZfbGlzdC5saXN0W2ldLnNoYTEsIGFiYnJldik7CgkJfQoJCWVsc2UKCQkJcHJpbnRmKCIlYyAlc1xuIiwgYywgcmVmX2xpc3QubGlzdFtpXS5uYW1lKTsKCX0KCglmcmVlX3JlZl9saXN0KCZyZWZfbGlzdCk7Cn0KCnN0YXRpYyB2b2lkIGNyZWF0ZV9icmFuY2goY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqc3RhcnQsCgkJCSAgaW50IGZvcmNlLCBpbnQgcmVmbG9nKQp7CglzdHJ1Y3QgcmVmX2xvY2sgKmxvY2s7CglzdHJ1Y3QgY29tbWl0ICpjb21taXQ7Cgl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOwoJY2hhciByZWZbUEFUSF9NQVhdLCBtc2dbUEFUSF9NQVggKyAyMF07CgoJc25wcmludGYocmVmLCBzaXplb2YgcmVmLCAicmVmcy9oZWFkcy8lcyIsIG5hbWUpOwoJaWYgKGNoZWNrX3JlZl9mb3JtYXQocmVmKSkKCQlkaWUoIiclcycgaXMgbm90IGEgdmFsaWQgYnJhbmNoIG5hbWUuIiwgbmFtZSk7CgoJaWYgKHJlc29sdmVfcmVmKHJlZiwgc2hhMSwgMSwgTlVMTCkpIHsKCQlpZiAoIWZvcmNlKQoJCQlkaWUoIkEgYnJhbmNoIG5hbWVkICclcycgYWxyZWFkeSBleGlzdHMuIiwgbmFtZSk7CgkJZWxzZSBpZiAoIXN0cmNtcChoZWFkLCBuYW1lKSkKCQkJZGllKCJDYW5ub3QgZm9yY2UgdXBkYXRlIHRoZSBjdXJyZW50IGJyYW5jaC4iKTsKCX0KCglpZiAoZ2V0X3NoYTEoc3RhcnQsIHNoYTEpIHx8CgkgICAgKGNvbW1pdCA9IGxvb2t1cF9jb21taXRfcmVmZXJlbmNlKHNoYTEpKSA9PSBOVUxMKQoJCWRpZSgiTm90IGEgdmFsaWQgYnJhbmNoIHBvaW50OiAnJXMnLiIsIHN0YXJ0KTsKCWhhc2hjcHkoc2hhMSwgY29tbWl0LT5vYmplY3Quc2hhMSk7CgoJbG9jayA9IGxvY2tfYW55X3JlZl9mb3JfdXBkYXRlKHJlZiwgTlVMTCk7CglpZiAoIWxvY2spCgkJZGllKCJGYWlsZWQgdG8gbG9jayByZWYgZm9yIHVwZGF0ZTogJXMuIiwgc3RyZXJyb3IoZXJybm8pKTsKCglpZiAocmVmbG9nKSB7CgkJbG9nX2FsbF9yZWZfdXBkYXRlcyA9IDE7CgkJc25wcmludGYobXNnLCBzaXplb2YgbXNnLCAiYnJhbmNoOiBDcmVhdGVkIGZyb20gJXMiLCBzdGFydCk7Cgl9CgoJaWYgKHdyaXRlX3JlZl9zaGExKGxvY2ssIHNoYTEsIG1zZykgPCAwKQoJCWRpZSgiRmFpbGVkIHRvIHdyaXRlIHJlZjogJXMuIiwgc3RyZXJyb3IoZXJybm8pKTsKfQoKc3RhdGljIHZvaWQgcmVuYW1lX2JyYW5jaChjb25zdCBjaGFyICpvbGRuYW1lLCBjb25zdCBjaGFyICpuZXduYW1lLCBpbnQgZm9yY2UpCnsKCWNoYXIgb2xkcmVmW1BBVEhfTUFYXSwgbmV3cmVmW1BBVEhfTUFYXTsKCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CgoJaWYgKHNucHJpbnRmKG9sZHJlZiwgc2l6ZW9mKG9sZHJlZiksICJyZWZzL2hlYWRzLyVzIiwgb2xkbmFtZSkgPiBzaXplb2Yob2xkcmVmKSkKCQlkaWUoIk9sZCBicmFuY2huYW1lIHRvbyBsb25nIik7CgoJaWYgKGNoZWNrX3JlZl9mb3JtYXQob2xkcmVmKSkKCQlkaWUoIkludmFsaWQgYnJhbmNoIG5hbWU6ICVzIiwgb2xkcmVmKTsKCglpZiAoc25wcmludGYobmV3cmVmLCBzaXplb2YobmV3cmVmKSwgInJlZnMvaGVhZHMvJXMiLCBuZXduYW1lKSA+IHNpemVvZihuZXdyZWYpKQoJCWRpZSgiTmV3IGJyYW5jaG5hbWUgdG9vIGxvbmciKTsKCglpZiAoY2hlY2tfcmVmX2Zvcm1hdChuZXdyZWYpKQoJCWRpZSgiSW52YWxpZCBicmFuY2ggbmFtZTogJXMiLCBuZXdyZWYpOwoKCWlmIChyZXNvbHZlX3JlZihuZXdyZWYsIHNoYTEsIDEsIE5VTEwpICYmICFmb3JjZSkKCQlkaWUoIkEgYnJhbmNoIG5hbWVkICclcycgYWxyZWFkeSBleGlzdHMuIiwgbmV3bmFtZSk7CgoJaWYgKHJlbmFtZV9yZWYob2xkcmVmLCBuZXdyZWYpKQoJCWRpZSgiQnJhbmNoIHJlbmFtZSBmYWlsZWQiKTsKCglpZiAoIXN0cmNtcChvbGRuYW1lLCBoZWFkKSAmJiBjcmVhdGVfc3ltcmVmKCJIRUFEIiwgbmV3cmVmKSkKCQlkaWUoIkJyYW5jaCByZW5hbWVkIHRvICVzLCBidXQgSEVBRCBpcyBub3QgdXBkYXRlZCEiLCBuZXduYW1lKTsKfQoKaW50IGNtZF9icmFuY2goaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCnsKCWludCBkZWxldGUgPSAwLCBmb3JjZV9kZWxldGUgPSAwLCBmb3JjZV9jcmVhdGUgPSAwOwoJaW50IHJlbmFtZSA9IDAsIGZvcmNlX3JlbmFtZSA9IDA7CglpbnQgdmVyYm9zZSA9IDAsIGFiYnJldiA9IERFRkFVTFRfQUJCUkVWOwoJaW50IHJlZmxvZyA9IDA7CglpbnQga2luZHMgPSBSRUZfTE9DQUxfQlJBTkNIOwoJaW50IGk7CgoJZ2l0X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOwoKCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOwoKCQlpZiAoYXJnWzBdICE9ICctJykKCQkJYnJlYWs7CgkJaWYgKCFzdHJjbXAoYXJnLCAiLS0iKSkgewoJCQlpKys7CgkJCWJyZWFrOwoJCX0KCQlpZiAoIXN0cmNtcChhcmcsICItZCIpKSB7CgkJCWRlbGV0ZSA9IDE7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIXN0cmNtcChhcmcsICItRCIpKSB7CgkJCWRlbGV0ZSA9IDE7CgkJCWZvcmNlX2RlbGV0ZSA9IDE7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIXN0cmNtcChhcmcsICItZiIpKSB7CgkJCWZvcmNlX2NyZWF0ZSA9IDE7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIXN0cmNtcChhcmcsICItbSIpKSB7CgkJCXJlbmFtZSA9IDE7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIXN0cmNtcChhcmcsICItTSIpKSB7CgkJCXJlbmFtZSA9IDE7CgkJCWZvcmNlX3JlbmFtZSA9IDE7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIXN0cmNtcChhcmcsICItciIpKSB7CgkJCWtpbmRzID0gUkVGX1JFTU9URV9CUkFOQ0g7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoIXN0cmNtcChhcmcsICItYSIpKSB7CgkJCWtpbmRzID0gUkVGX1JFTU9URV9CUkFOQ0ggfCBSRUZfTE9DQUxfQlJBTkNIOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKCFzdHJjbXAoYXJnLCAiLWwiKSkgewoJCQlyZWZsb2cgPSAxOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKCFzdHJuY21wKGFyZywgIi0tYWJicmV2PSIsIDkpKSB7CgkJCWFiYnJldiA9IGF0b2koYXJnKzkpOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKCFzdHJjbXAoYXJnLCAiLXYiKSkgewoJCQl2ZXJib3NlID0gMTsKCQkJY29udGludWU7CgkJfQoJCXVzYWdlKGJ1aWx0aW5fYnJhbmNoX3VzYWdlKTsKCX0KCglpZiAoKGRlbGV0ZSAmJiByZW5hbWUpIHx8IChkZWxldGUgJiYgZm9yY2VfY3JlYXRlKSB8fAoJICAgIChyZW5hbWUgJiYgZm9yY2VfY3JlYXRlKSkKCQl1c2FnZShidWlsdGluX2JyYW5jaF91c2FnZSk7CgoJaGVhZCA9IHhzdHJkdXAocmVzb2x2ZV9yZWYoIkhFQUQiLCBoZWFkX3NoYTEsIDAsIE5VTEwpKTsKCWlmICghaGVhZCkKCQlkaWUoIkZhaWxlZCB0byByZXNvbHZlIEhFQUQgYXMgYSB2YWxpZCByZWYuIik7CglpZiAoc3RybmNtcChoZWFkLCAicmVmcy9oZWFkcy8iLCAxMSkpCgkJZGllKCJIRUFEIG5vdCBmb3VuZCBiZWxvdyByZWZzL2hlYWRzISIpOwoJaGVhZCArPSAxMTsKCglpZiAoZGVsZXRlKQoJCWRlbGV0ZV9icmFuY2hlcyhhcmdjIC0gaSwgYXJndiArIGksIGZvcmNlX2RlbGV0ZSk7CgllbHNlIGlmIChpID09IGFyZ2MpCgkJcHJpbnRfcmVmX2xpc3Qoa2luZHMsIHZlcmJvc2UsIGFiYnJldik7CgllbHNlIGlmIChyZW5hbWUgJiYgKGkgPT0gYXJnYyAtIDEpKQoJCXJlbmFtZV9icmFuY2goaGVhZCwgYXJndltpXSwgZm9yY2VfcmVuYW1lKTsKCWVsc2UgaWYgKHJlbmFtZSAmJiAoaSA9PSBhcmdjIC0gMikpCgkJcmVuYW1lX2JyYW5jaChhcmd2W2ldLCBhcmd2W2kgKyAxXSwgZm9yY2VfcmVuYW1lKTsKCWVsc2UgaWYgKGkgPT0gYXJnYyAtIDEpCgkJY3JlYXRlX2JyYW5jaChhcmd2W2ldLCBoZWFkLCBmb3JjZV9jcmVhdGUsIHJlZmxvZyk7CgllbHNlIGlmIChpID09IGFyZ2MgLSAyKQoJCWNyZWF0ZV9icmFuY2goYXJndltpXSwgYXJndltpICsgMV0sIGZvcmNlX2NyZWF0ZSwgcmVmbG9nKTsKCWVsc2UKCQl1c2FnZShidWlsdGluX2JyYW5jaF91c2FnZSk7CgoJcmV0dXJuIDA7Cn0K