LyoKICogZmF0LmMKICoKICogUi9PIChWKUZBVCAxMi8xNi8zMiBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9uIGJ5IE1hcmN1cyBTdW5kYmVyZwogKgogKiAyMDAyLTA3LTI4IC0gcmpvbmVzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHBwY2Jvb3QgdjEuMS42CiAqIDIwMDMtMDMtMTAgLSBraGFycmlzQG5leHVzLXRlY2gubmV0IC0gcG9ydGVkIHRvIHVib290CiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgojaW5jbHVkZSA8Y29uZmlnLmg+CiNpbmNsdWRlIDxmYXQuaD4KI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KI2luY2x1ZGUgPHBhcnQuaD4KCi8qCiAqIENvbnZlcnQgYSBzdHJpbmcgdG8gbG93ZXJjYXNlLgogKi8Kc3RhdGljIHZvaWQKZG93bmNhc2UoY2hhciAqc3RyKQp7Cgl3aGlsZSAoKnN0ciAhPSAnXDAnKSB7CgkJVE9MT1dFUigqc3RyKTsKCQlzdHIrKzsKCX0KfQoKc3RhdGljICBibG9ja19kZXZfZGVzY190ICpjdXJfZGV2ID0gTlVMTDsKc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFydF9vZmZzZXQgPSAwOwpzdGF0aWMgaW50IGN1cl9wYXJ0ID0gMTsKCiNkZWZpbmUgRE9TX1BBUlRfVEJMX09GRlNFVAkweDFiZQojZGVmaW5lIERPU19QQVJUX01BR0lDX09GRlNFVAkweDFmZQojZGVmaW5lIERPU19GU19UWVBFX09GRlNFVAkweDM2CgppbnQgZGlza19yZWFkIChfX3UzMiBzdGFydGJsb2NrLCBfX3UzMiBnZXRzaXplLCBfX3U4ICogYnVmcHRyKQp7CglzdGFydGJsb2NrICs9IHBhcnRfb2Zmc2V0OwoJaWYgKGN1cl9kZXYgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CglpZiAoY3VyX2Rldi0+YmxvY2tfcmVhZCkgewoJCXJldHVybiBjdXJfZGV2LT5ibG9ja19yZWFkIChjdXJfZGV2LT5kZXYKCQkJLCBzdGFydGJsb2NrLCBnZXRzaXplLCAodW5zaWduZWQgbG9uZyAqKWJ1ZnB0cik7Cgl9CglyZXR1cm4gLTE7Cn0KCgppbnQKZmF0X3JlZ2lzdGVyX2RldmljZShibG9ja19kZXZfZGVzY190ICpkZXZfZGVzYywgaW50IHBhcnRfbm8pCnsKCXVuc2lnbmVkIGNoYXIgYnVmZmVyW1NFQ1RPUl9TSVpFXTsKCWRpc2tfcGFydGl0aW9uX3QgaW5mbzsKCglpZiAoIWRldl9kZXNjLT5ibG9ja19yZWFkKQoJCXJldHVybiAtMTsKCWN1cl9kZXYgPSBkZXZfZGVzYzsKCS8qIGNoZWNrIGlmIHdlIGhhdmUgYSBNQlIgKG9uIGZsb3BwaWVzIHdlIGhhdmUgb25seSBhIFBCUikgKi8KCWlmIChkZXZfZGVzYy0+YmxvY2tfcmVhZCAoZGV2X2Rlc2MtPmRldiwgMCwgMSwgKHVsb25nICopIGJ1ZmZlcikgIT0gMSkgewoJCXByaW50ZiAoIioqIENhbid0IHJlYWQgZnJvbSBkZXZpY2UgJWQgKipcbiIsIGRldl9kZXNjLT5kZXYpOwoJCXJldHVybiAtMTsKCX0KCWlmIChidWZmZXJbRE9TX1BBUlRfTUFHSUNfT0ZGU0VUXSAhPSAweDU1IHx8CgkJYnVmZmVyW0RPU19QQVJUX01BR0lDX09GRlNFVCArIDFdICE9IDB4YWEpIHsKCQkvKiBubyBzaWduYXR1cmUgZm91bmQgKi8KCQlyZXR1cm4gLTE7Cgl9CiNpZiAoZGVmaW5lZChDT05GSUdfQ01EX0lERSkgfHwgXAogICAgIGRlZmluZWQoQ09ORklHX0NNRF9TQ1NJKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfQ01EX1VTQikgfHwgXAogICAgIGRlZmluZWQoQ09ORklHX01NQykgfHwgXAogICAgIGRlZmluZWQoQ09ORklHX1NZU1RFTUFDRSkgKQoJLyogRmlyc3Qgd2UgYXNzdW1lLCB0aGVyZSBpcyBhIE1CUiAqLwoJaWYgKCFnZXRfcGFydGl0aW9uX2luZm8gKGRldl9kZXNjLCBwYXJ0X25vLCAmaW5mbykpIHsKCQlwYXJ0X29mZnNldCA9IGluZm8uc3RhcnQ7CgkJY3VyX3BhcnQgPSBwYXJ0X25vOwoJfSBlbHNlIGlmICghc3RybmNtcCgoY2hhciAqKSZidWZmZXJbRE9TX0ZTX1RZUEVfT0ZGU0VUXSwgIkZBVCIsIDMpKSB7CgkJLyogb2ssIHdlIGFzc3VtZSB3ZSBhcmUgb24gYSBQQlIgb25seSAqLwoJCWN1cl9wYXJ0ID0gMTsKCQlwYXJ0X29mZnNldCA9IDA7Cgl9IGVsc2UgewoJCXByaW50ZiAoIioqIFBhcnRpdGlvbiAlZCBub3QgdmFsaWQgb24gZGV2aWNlICVkICoqXG4iLAoJCQkJcGFydF9ubywgZGV2X2Rlc2MtPmRldik7CgkJcmV0dXJuIC0xOwoJfQoKI2Vsc2UKCWlmICghc3RybmNtcCgoY2hhciAqKSZidWZmZXJbRE9TX0ZTX1RZUEVfT0ZGU0VUXSwiRkFUIiwzKSkgewoJCS8qIG9rLCB3ZSBhc3N1bWUgd2UgYXJlIG9uIGEgUEJSIG9ubHkgKi8KCQljdXJfcGFydCA9IDE7CgkJcGFydF9vZmZzZXQgPSAwOwoJCWluZm8uc3RhcnQgPSBwYXJ0X29mZnNldDsKCX0gZWxzZSB7CgkJLyogRklYTUUgd2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIHN0YXJ0IGJsb2NrIG9mIHRoZQoJCSAqIHBhcnRpdGlvbiB3aGVyZSB0aGUgRE9TIEZTIHJlc2lkZXMuIFRoaXMgY2FuIGJlIGRvbmUKCQkgKiBieSB1c2luZyB0aGUgZ2V0X3BhcnRpdGlvbl9pbmZvIHJvdXRpbmUuIEZvciB0aGlzCgkJICogcHVycG9zZSB0aGUgbGlicGFydCBtdXN0IGJlIGluY2x1ZGVkLgoJCSAqLwoJCXBhcnRfb2Zmc2V0ID0gMzI7CgkJY3VyX3BhcnQgPSAxOwoJfQojZW5kaWYKCXJldHVybiAwOwp9CgoKLyoKICogR2V0IHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2YgYSBkaXJlY3RvcnkgZGVsaW1pdGVyICgnLycgb3IgJ1wnKSBpbiBhIHN0cmluZy4KICogUmV0dXJuIGluZGV4IGludG8gc3RyaW5nIGlmIGZvdW5kLCAtMSBvdGhlcndpc2UuCiAqLwpzdGF0aWMgaW50CmRpcmRlbGltKGNoYXIgKnN0cikKewoJY2hhciAqc3RhcnQgPSBzdHI7CgoJd2hpbGUgKCpzdHIgIT0gJ1wwJykgewoJCWlmIChJU0RJUkRFTElNKCpzdHIpKSByZXR1cm4gc3RyIC0gc3RhcnQ7CgkJc3RyKys7Cgl9CglyZXR1cm4gLTE7Cn0KCgovKgogKiBNYXRjaCB2b2x1bWVfaW5mbyBmc190eXBlIHN0cmluZ3MuCiAqIFJldHVybiAwIG9uIG1hdGNoLCAtMSBvdGhlcndpc2UuCiAqLwpzdGF0aWMgaW50CmNvbXBhcmVfc2lnbihjaGFyICpzdHIxLCBjaGFyICpzdHIyKQp7CgljaGFyICplbmQgPSBzdHIxK1NJR05MRU47CgoJd2hpbGUgKHN0cjEgIT0gZW5kKSB7CgkJaWYgKCpzdHIxICE9ICpzdHIyKSB7CgkJCXJldHVybiAtMTsKCQl9CgkJc3RyMSsrOwoJCXN0cjIrKzsKCX0KCglyZXR1cm4gMDsKfQoKCi8qCiAqIEV4dHJhY3QgemVybyB0ZXJtaW5hdGVkIHNob3J0IG5hbWUgZnJvbSBhIGRpcmVjdG9yeSBlbnRyeS4KICovCnN0YXRpYyB2b2lkIGdldF9uYW1lIChkaXJfZW50cnkgKmRpcmVudCwgY2hhciAqc19uYW1lKQp7CgljaGFyICpwdHI7CgoJbWVtY3B5IChzX25hbWUsIGRpcmVudC0+bmFtZSwgOCk7CglzX25hbWVbOF0gPSAnXDAnOwoJcHRyID0gc19uYW1lOwoJd2hpbGUgKCpwdHIgJiYgKnB0ciAhPSAnICcpCgkJcHRyKys7CglpZiAoZGlyZW50LT5leHRbMF0gJiYgZGlyZW50LT5leHRbMF0gIT0gJyAnKSB7CgkJKnB0ciA9ICcuJzsKCQlwdHIrKzsKCQltZW1jcHkgKHB0ciwgZGlyZW50LT5leHQsIDMpOwoJCXB0clszXSA9ICdcMCc7CgkJd2hpbGUgKCpwdHIgJiYgKnB0ciAhPSAnICcpCgkJCXB0cisrOwoJfQoJKnB0ciA9ICdcMCc7CglpZiAoKnNfbmFtZSA9PSBERUxFVEVEX0ZMQUcpCgkJKnNfbmFtZSA9ICdcMCc7CgllbHNlIGlmICgqc19uYW1lID09IGFSSU5HKQoJCSpzX25hbWUgPSAn5Sc7Cglkb3duY2FzZSAoc19uYW1lKTsKfQoKLyoKICogR2V0IHRoZSBlbnRyeSBhdCBpbmRleCAnZW50cnknIGluIGEgRkFUICgxMi8xNi8zMikgdGFibGUuCiAqIE9uIGZhaWx1cmUgMHgwMCBpcyByZXR1cm5lZC4KICovCnN0YXRpYyBfX3UzMgpnZXRfZmF0ZW50KGZzZGF0YSAqbXlkYXRhLCBfX3UzMiBlbnRyeSkKewoJX191MzIgYnVmbnVtOwoJX191MzIgb2Zmc2V0OwoJX191MzIgcmV0ID0gMHgwMDsKCglzd2l0Y2ggKG15ZGF0YS0+ZmF0c2l6ZSkgewoJY2FzZSAzMjoKCQlidWZudW0gPSBlbnRyeSAvIEZBVDMyQlVGU0laRTsKCQlvZmZzZXQgPSBlbnRyeSAtIGJ1Zm51bSAqIEZBVDMyQlVGU0laRTsKCQlicmVhazsKCWNhc2UgMTY6CgkJYnVmbnVtID0gZW50cnkgLyBGQVQxNkJVRlNJWkU7CgkJb2Zmc2V0ID0gZW50cnkgLSBidWZudW0gKiBGQVQxNkJVRlNJWkU7CgkJYnJlYWs7CgljYXNlIDEyOgoJCWJ1Zm51bSA9IGVudHJ5IC8gRkFUMTJCVUZTSVpFOwoJCW9mZnNldCA9IGVudHJ5IC0gYnVmbnVtICogRkFUMTJCVUZTSVpFOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJLyogVW5zdXBwb3J0ZWQgRkFUIHNpemUgKi8KCQlyZXR1cm4gcmV0OwoJfQoKCS8qIFJlYWQgYSBuZXcgYmxvY2sgb2YgRkFUIGVudHJpZXMgaW50byB0aGUgY2FjaGUuICovCglpZiAoYnVmbnVtICE9IG15ZGF0YS0+ZmF0YnVmbnVtKSB7CgkJaW50IGdldHNpemUgPSBGQVRCVUZTSVpFL0ZTX0JMT0NLX1NJWkU7CgkJX191OCAqYnVmcHRyID0gbXlkYXRhLT5mYXRidWY7CgkJX191MzIgZmF0bGVuZ3RoID0gbXlkYXRhLT5mYXRsZW5ndGg7CgkJX191MzIgc3RhcnRibG9jayA9IGJ1Zm51bSAqIEZBVEJVRkJMT0NLUzsKCgkJZmF0bGVuZ3RoICo9IFNFQ1RPUl9TSVpFOwkvKiBXZSB3YW50IGl0IGluIGJ5dGVzIG5vdyAqLwoJCXN0YXJ0YmxvY2sgKz0gbXlkYXRhLT5mYXRfc2VjdDsJLyogT2Zmc2V0IGZyb20gc3RhcnQgb2YgZGlzayAqLwoKCQlpZiAoZ2V0c2l6ZSA+IGZhdGxlbmd0aCkgZ2V0c2l6ZSA9IGZhdGxlbmd0aDsKCQlpZiAoZGlza19yZWFkKHN0YXJ0YmxvY2ssIGdldHNpemUsIGJ1ZnB0cikgPCAwKSB7CgkJCUZBVF9EUFJJTlQoIkVycm9yIHJlYWRpbmcgRkFUIGJsb2Nrc1xuIik7CgkJCXJldHVybiByZXQ7CgkJfQoJCW15ZGF0YS0+ZmF0YnVmbnVtID0gYnVmbnVtOwoJfQoKCS8qIEdldCB0aGUgYWN0dWFsIGVudHJ5IGZyb20gdGhlIHRhYmxlICovCglzd2l0Y2ggKG15ZGF0YS0+ZmF0c2l6ZSkgewoJY2FzZSAzMjoKCQlyZXQgPSBGQVQyQ1BVMzIoKChfX3UzMiopbXlkYXRhLT5mYXRidWYpW29mZnNldF0pOwoJCWJyZWFrOwoJY2FzZSAxNjoKCQlyZXQgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZnNldF0pOwoJCWJyZWFrOwoJY2FzZSAxMjogewoJCV9fdTMyIG9mZjE2ID0gKG9mZnNldCozKS80OwoJCV9fdTE2IHZhbDEsIHZhbDI7CgoJCXN3aXRjaCAob2Zmc2V0ICYgMHgzKSB7CgkJY2FzZSAwOgoJCQlyZXQgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZjE2XSk7CgkJCXJldCAmPSAweGZmZjsKCQkJYnJlYWs7CgkJY2FzZSAxOgoJCQl2YWwxID0gRkFUMkNQVTE2KCgoX191MTYqKW15ZGF0YS0+ZmF0YnVmKVtvZmYxNl0pOwoJCQl2YWwxICY9IDB4ZjAwMDsKCQkJdmFsMiA9IEZBVDJDUFUxNigoKF9fdTE2KilteWRhdGEtPmZhdGJ1Zilbb2ZmMTYrMV0pOwoJCQl2YWwyICY9IDB4MDBmZjsKCQkJcmV0ID0gKHZhbDIgPDwgNCkgfCAodmFsMSA+PiAxMik7CgkJCWJyZWFrOwoJCWNhc2UgMjoKCQkJdmFsMSA9IEZBVDJDUFUxNigoKF9fdTE2KilteWRhdGEtPmZhdGJ1Zilbb2ZmMTZdKTsKCQkJdmFsMSAmPSAweGZmMDA7CgkJCXZhbDIgPSBGQVQyQ1BVMTYoKChfX3UxNiopbXlkYXRhLT5mYXRidWYpW29mZjE2KzFdKTsKCQkJdmFsMiAmPSAweDAwMGY7CgkJCXJldCA9ICh2YWwyIDw8IDgpIHwgKHZhbDEgPj4gOCk7CgkJCWJyZWFrOwoJCWNhc2UgMzoKCQkJcmV0ID0gRkFUMkNQVTE2KCgoX191MTYqKW15ZGF0YS0+ZmF0YnVmKVtvZmYxNl0pOzsKCQkJcmV0ID0gKHJldCAmIDB4ZmZmMCkgPj4gNDsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJYnJlYWs7CgkJfQoJfQoJYnJlYWs7Cgl9CglGQVRfRFBSSU5UKCJyZXQ6ICVkLCBvZmZzZXQ6ICVkXG4iLCByZXQsIG9mZnNldCk7CgoJcmV0dXJuIHJldDsKfQoKCi8qCiAqIFJlYWQgYXQgbW9zdCAnc2l6ZScgYnl0ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGNsdXN0ZXIgaW50byAnYnVmZmVyJy4KICogUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgogKi8Kc3RhdGljIGludApnZXRfY2x1c3Rlcihmc2RhdGEgKm15ZGF0YSwgX191MzIgY2x1c3RudW0sIF9fdTggKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKQp7CglpbnQgaWR4ID0gMDsKCV9fdTMyIHN0YXJ0c2VjdDsKCglpZiAoY2x1c3RudW0gPiAwKSB7CgkJc3RhcnRzZWN0ID0gbXlkYXRhLT5kYXRhX2JlZ2luICsgY2x1c3RudW0qbXlkYXRhLT5jbHVzdF9zaXplOwoJfSBlbHNlIHsKCQlzdGFydHNlY3QgPSBteWRhdGEtPnJvb3RkaXJfc2VjdDsKCX0KCglGQVRfRFBSSU5UKCJnYyAtIGNsdXN0bnVtOiAlZCwgc3RhcnRzZWN0OiAlZFxuIiwgY2x1c3RudW0sIHN0YXJ0c2VjdCk7CglpZiAoZGlza19yZWFkKHN0YXJ0c2VjdCwgc2l6ZS9GU19CTE9DS19TSVpFICwgYnVmZmVyKSA8IDApIHsKCQlGQVRfRFBSSU5UKCJFcnJvciByZWFkaW5nIGRhdGFcbiIpOwoJCXJldHVybiAtMTsKCX0KCWlmKHNpemUgJSBGU19CTE9DS19TSVpFKSB7CgkJX191OCB0bXBidWZbRlNfQkxPQ0tfU0laRV07CgkJaWR4PSBzaXplL0ZTX0JMT0NLX1NJWkU7CgkJaWYgKGRpc2tfcmVhZChzdGFydHNlY3QgKyBpZHgsIDEsIHRtcGJ1ZikgPCAwKSB7CgkJCUZBVF9EUFJJTlQoIkVycm9yIHJlYWRpbmcgZGF0YVxuIik7CgkJCXJldHVybiAtMTsKCQl9CgkJYnVmZmVyICs9IGlkeCpGU19CTE9DS19TSVpFOwoKCQltZW1jcHkoYnVmZmVyLCB0bXBidWYsIHNpemUgJSBGU19CTE9DS19TSVpFKTsKCQlyZXR1cm4gMDsKCX0KCglyZXR1cm4gMDsKfQoKCi8qCiAqIFJlYWQgYXQgbW9zdCAnbWF4c2l6ZScgYnl0ZXMgZnJvbSB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggJ2RlbnRwdHInCiAqIGludG8gJ2J1ZmZlcicuCiAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgLTEgb24gZmF0YWwgZXJyb3JzLgogKi8Kc3RhdGljIGxvbmcKZ2V0X2NvbnRlbnRzKGZzZGF0YSAqbXlkYXRhLCBkaXJfZW50cnkgKmRlbnRwdHIsIF9fdTggKmJ1ZmZlciwKCSAgICAgdW5zaWduZWQgbG9uZyBtYXhzaXplKQp7Cgl1bnNpZ25lZCBsb25nIGZpbGVzaXplID0gRkFUMkNQVTMyKGRlbnRwdHItPnNpemUpLCBnb3RzaXplID0gMDsKCXVuc2lnbmVkIGludCBieXRlc3BlcmNsdXN0ID0gbXlkYXRhLT5jbHVzdF9zaXplICogU0VDVE9SX1NJWkU7CglfX3UzMiBjdXJjbHVzdCA9IFNUQVJUKGRlbnRwdHIpOwoJX191MzIgZW5kY2x1c3QsIG5ld2NsdXN0OwoJdW5zaWduZWQgbG9uZyBhY3RzaXplOwoKCUZBVF9EUFJJTlQoIkZpbGVzaXplOiAlbGQgYnl0ZXNcbiIsIGZpbGVzaXplKTsKCglpZiAobWF4c2l6ZSA+IDAgJiYgZmlsZXNpemUgPiBtYXhzaXplKSBmaWxlc2l6ZSA9IG1heHNpemU7CgoJRkFUX0RQUklOVCgiUmVhZGluZzogJWxkIGJ5dGVzXG4iLCBmaWxlc2l6ZSk7CgoJYWN0c2l6ZT1ieXRlc3BlcmNsdXN0OwoJZW5kY2x1c3Q9Y3VyY2x1c3Q7CglkbyB7CgkJLyogc2VhcmNoIGZvciBjb25zZWN1dGl2ZSBjbHVzdGVycyAqLwoJCXdoaWxlKGFjdHNpemUgPCBmaWxlc2l6ZSkgewoJCQluZXdjbHVzdCA9IGdldF9mYXRlbnQobXlkYXRhLCBlbmRjbHVzdCk7CgkJCWlmKChuZXdjbHVzdCAtMSkhPWVuZGNsdXN0KQoJCQkJZ290byBnZXRpdDsKCQkJaWYgKENIRUNLX0NMVVNUKG5ld2NsdXN0LCBteWRhdGEtPmZhdHNpemUpKSB7CgkJCQlGQVRfRFBSSU5UKCJjdXJjbHVzdDogMHgleFxuIiwgbmV3Y2x1c3QpOwoJCQkJRkFUX0RQUklOVCgiSW52YWxpZCBGQVQgZW50cnlcbiIpOwoJCQkJcmV0dXJuIGdvdHNpemU7CgkJCX0KCQkJZW5kY2x1c3Q9bmV3Y2x1c3Q7CgkJCWFjdHNpemUrPSBieXRlc3BlcmNsdXN0OwoJCX0KCQkvKiBhY3RzaXplID49IGZpbGUgc2l6ZSAqLwoJCWFjdHNpemUgLT0gYnl0ZXNwZXJjbHVzdDsKCQkvKiBnZXQgcmVtYWluaW5nIGNsdXN0ZXJzICovCgkJaWYgKGdldF9jbHVzdGVyKG15ZGF0YSwgY3VyY2x1c3QsIGJ1ZmZlciwgKGludClhY3RzaXplKSAhPSAwKSB7CgkJCUZBVF9FUlJPUigiRXJyb3IgcmVhZGluZyBjbHVzdGVyXG4iKTsKCQkJcmV0dXJuIC0xOwoJCX0KCQkvKiBnZXQgcmVtYWluaW5nIGJ5dGVzICovCgkJZ290c2l6ZSArPSAoaW50KWFjdHNpemU7CgkJZmlsZXNpemUgLT0gYWN0c2l6ZTsKCQlidWZmZXIgKz0gYWN0c2l6ZTsKCQlhY3RzaXplPSBmaWxlc2l6ZTsKCQlpZiAoZ2V0X2NsdXN0ZXIobXlkYXRhLCBlbmRjbHVzdCwgYnVmZmVyLCAoaW50KWFjdHNpemUpICE9IDApIHsKCQkJRkFUX0VSUk9SKCJFcnJvciByZWFkaW5nIGNsdXN0ZXJcbiIpOwoJCQlyZXR1cm4gLTE7CgkJfQoJCWdvdHNpemUrPWFjdHNpemU7CgkJcmV0dXJuIGdvdHNpemU7CmdldGl0OgoJCWlmIChnZXRfY2x1c3RlcihteWRhdGEsIGN1cmNsdXN0LCBidWZmZXIsIChpbnQpYWN0c2l6ZSkgIT0gMCkgewoJCQlGQVRfRVJST1IoIkVycm9yIHJlYWRpbmcgY2x1c3RlclxuIik7CgkJCXJldHVybiAtMTsKCQl9CgkJZ290c2l6ZSArPSAoaW50KWFjdHNpemU7CgkJZmlsZXNpemUgLT0gYWN0c2l6ZTsKCQlidWZmZXIgKz0gYWN0c2l6ZTsKCQljdXJjbHVzdCA9IGdldF9mYXRlbnQobXlkYXRhLCBlbmRjbHVzdCk7CgkJaWYgKENIRUNLX0NMVVNUKGN1cmNsdXN0LCBteWRhdGEtPmZhdHNpemUpKSB7CgkJCUZBVF9EUFJJTlQoImN1cmNsdXN0OiAweCV4XG4iLCBjdXJjbHVzdCk7CgkJCUZBVF9FUlJPUigiSW52YWxpZCBGQVQgZW50cnlcbiIpOwoJCQlyZXR1cm4gZ290c2l6ZTsKCQl9CgkJYWN0c2l6ZT1ieXRlc3BlcmNsdXN0OwoJCWVuZGNsdXN0PWN1cmNsdXN0OwoJfSB3aGlsZSAoMSk7Cn0KCgojaWZkZWYgQ09ORklHX1NVUFBPUlRfVkZBVAovKgogKiBFeHRyYWN0IHRoZSBmaWxlIG5hbWUgaW5mb3JtYXRpb24gZnJvbSAnc2xvdHB0cicgaW50byAnbF9uYW1lJywKICogc3RhcnRpbmcgYXQgbF9uYW1lWyppZHhdLgogKiBSZXR1cm4gMSBpZiB0ZXJtaW5hdG9yICh6ZXJvIGJ5dGUpIGlzIGZvdW5kLCAwIG90aGVyd2lzZS4KICovCnN0YXRpYyBpbnQKc2xvdDJzdHIoZGlyX3Nsb3QgKnNsb3RwdHIsIGNoYXIgKmxfbmFtZSwgaW50ICppZHgpCnsKCWludCBqOwoKCWZvciAoaiA9IDA7IGogPD0gODsgaiArPSAyKSB7CgkJbF9uYW1lWyppZHhdID0gc2xvdHB0ci0+bmFtZTBfNFtqXTsKCQlpZiAobF9uYW1lWyppZHhdID09IDB4MDApIHJldHVybiAxOwoJCSgqaWR4KSsrOwoJfQoJZm9yIChqID0gMDsgaiA8PSAxMDsgaiArPSAyKSB7CgkJbF9uYW1lWyppZHhdID0gc2xvdHB0ci0+bmFtZTVfMTBbal07CgkJaWYgKGxfbmFtZVsqaWR4XSA9PSAweDAwKSByZXR1cm4gMTsKCQkoKmlkeCkrKzsKCX0KCWZvciAoaiA9IDA7IGogPD0gMjsgaiArPSAyKSB7CgkJbF9uYW1lWyppZHhdID0gc2xvdHB0ci0+bmFtZTExXzEyW2pdOwoJCWlmIChsX25hbWVbKmlkeF0gPT0gMHgwMCkgcmV0dXJuIDE7CgkJKCppZHgpKys7Cgl9CgoJcmV0dXJuIDA7Cn0KCgovKgogKiBFeHRyYWN0IHRoZSBmdWxsIGxvbmcgZmlsZW5hbWUgc3RhcnRpbmcgYXQgJ3JldGRlbnQnICh3aGljaCBpcyByZWFsbHkKICogYSBzbG90KSBpbnRvICdsX25hbWUnLiBJZiBzdWNjZXNzZnVsIGFsc28gY29weSB0aGUgcmVhbCBkaXJlY3RvcnkgZW50cnkKICogaW50byAncmV0ZGVudCcKICogUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlLgogKi8KX191OAkgZ2V0X3ZmYXRuYW1lX2Jsb2NrW01BWF9DTFVTVFNJWkVdOwpzdGF0aWMgaW50CmdldF92ZmF0bmFtZShmc2RhdGEgKm15ZGF0YSwgaW50IGN1cmNsdXN0LCBfX3U4ICpjbHVzdGVyLAoJICAgICBkaXJfZW50cnkgKnJldGRlbnQsIGNoYXIgKmxfbmFtZSkKewoJZGlyX2VudHJ5ICpyZWFsZGVudDsKCWRpcl9zbG90ICAqc2xvdHB0ciA9IChkaXJfc2xvdCopIHJldGRlbnQ7CglfX3U4CSAgKm5leHRjbHVzdCA9IGNsdXN0ZXIgKyBteWRhdGEtPmNsdXN0X3NpemUgKiBTRUNUT1JfU0laRTsKCV9fdTgJICAgY291bnRlciA9IChzbG90cHRyLT5pZCAmIH5MQVNUX0xPTkdfRU5UUllfTUFTSykgJiAweGZmOwoJaW50IGlkeCA9IDA7CgoJd2hpbGUgKChfX3U4KilzbG90cHRyIDwgbmV4dGNsdXN0KSB7CgkJaWYgKGNvdW50ZXIgPT0gMCkgYnJlYWs7CgkJaWYgKCgoc2xvdHB0ci0+aWQgJiB+TEFTVF9MT05HX0VOVFJZX01BU0spICYgMHhmZikgIT0gY291bnRlcikKCQkJcmV0dXJuIC0xOwoJCXNsb3RwdHIrKzsKCQljb3VudGVyLS07Cgl9CgoJaWYgKChfX3U4KilzbG90cHRyID49IG5leHRjbHVzdCkgewoJCWRpcl9zbG90ICpzbG90cHRyMjsKCgkJc2xvdHB0ci0tOwoJCWN1cmNsdXN0ID0gZ2V0X2ZhdGVudChteWRhdGEsIGN1cmNsdXN0KTsKCQlpZiAoQ0hFQ0tfQ0xVU1QoY3VyY2x1c3QsIG15ZGF0YS0+ZmF0c2l6ZSkpIHsKCQkJRkFUX0RQUklOVCgiY3VyY2x1c3Q6IDB4JXhcbiIsIGN1cmNsdXN0KTsKCQkJRkFUX0VSUk9SKCJJbnZhbGlkIEZBVCBlbnRyeVxuIik7CgkJCXJldHVybiAtMTsKCQl9CgkJaWYgKGdldF9jbHVzdGVyKG15ZGF0YSwgY3VyY2x1c3QsIGdldF92ZmF0bmFtZV9ibG9jaywKCQkJCW15ZGF0YS0+Y2x1c3Rfc2l6ZSAqIFNFQ1RPUl9TSVpFKSAhPSAwKSB7CgkJCUZBVF9EUFJJTlQoIkVycm9yOiByZWFkaW5nIGRpcmVjdG9yeSBibG9ja1xuIik7CgkJCXJldHVybiAtMTsKCQl9CgkJc2xvdHB0cjIgPSAoZGlyX3Nsb3QqKSBnZXRfdmZhdG5hbWVfYmxvY2s7CgkJd2hpbGUgKHNsb3RwdHIyLT5pZCA+IDB4MDEpIHsKCQkJc2xvdHB0cjIrKzsKCQl9CgkJLyogU2F2ZSB0aGUgcmVhbCBkaXJlY3RvcnkgZW50cnkgKi8KCQlyZWFsZGVudCA9IChkaXJfZW50cnkqKXNsb3RwdHIyICsgMTsKCQl3aGlsZSAoKF9fdTgqKXNsb3RwdHIyID49IGdldF92ZmF0bmFtZV9ibG9jaykgewoJCQlzbG90MnN0cihzbG90cHRyMiwgbF9uYW1lLCAmaWR4KTsKCQkJc2xvdHB0cjItLTsKCQl9Cgl9IGVsc2UgewoJCS8qIFNhdmUgdGhlIHJlYWwgZGlyZWN0b3J5IGVudHJ5ICovCgkJcmVhbGRlbnQgPSAoZGlyX2VudHJ5KilzbG90cHRyOwoJfQoKCWRvIHsKCQlzbG90cHRyLS07CgkJaWYgKHNsb3Qyc3RyKHNsb3RwdHIsIGxfbmFtZSwgJmlkeCkpIGJyZWFrOwoJfSB3aGlsZSAoIShzbG90cHRyLT5pZCAmIExBU1RfTE9OR19FTlRSWV9NQVNLKSk7CgoJbF9uYW1lW2lkeF0gPSAnXDAnOwoJaWYgKCpsX25hbWUgPT0gREVMRVRFRF9GTEFHKSAqbF9uYW1lID0gJ1wwJzsKCWVsc2UgaWYgKCpsX25hbWUgPT0gYVJJTkcpICpsX25hbWUgPSAn5Sc7Cglkb3duY2FzZShsX25hbWUpOwoKCS8qIFJldHVybiB0aGUgcmVhbCBkaXJlY3RvcnkgZW50cnkgKi8KCW1lbWNweShyZXRkZW50LCByZWFsZGVudCwgc2l6ZW9mKGRpcl9lbnRyeSkpOwoKCXJldHVybiAwOwp9CgoKLyogQ2FsY3VsYXRlIHNob3J0IG5hbWUgY2hlY2tzdW0gKi8Kc3RhdGljIF9fdTgKbWtja3N1bShjb25zdCBjaGFyICpzdHIpCnsKCWludCBpOwoJX191OCByZXQgPSAwOwoKCWZvciAoaSA9IDA7IGkgPCAxMTsgaSsrKSB7CgkJcmV0ID0gKCgocmV0JjEpPDw3KXwoKHJldCYweGZlKT4+MSkpICsgc3RyW2ldOwoJfQoKCXJldHVybiByZXQ7Cn0KI2VuZGlmCgoKLyoKICogR2V0IHRoZSBkaXJlY3RvcnkgZW50cnkgYXNzb2NpYXRlZCB3aXRoICdmaWxlbmFtZScgZnJvbSB0aGUgZGlyZWN0b3J5CiAqIHN0YXJ0aW5nIGF0ICdzdGFydHNlY3QnCiAqLwpfX3U4IGdldF9kZW50ZnJvbWRpcl9ibG9ja1tNQVhfQ0xVU1RTSVpFXTsKc3RhdGljIGRpcl9lbnRyeSAqZ2V0X2RlbnRmcm9tZGlyIChmc2RhdGEgKiBteWRhdGEsIGludCBzdGFydHNlY3QsCgkJCQkgICBjaGFyICpmaWxlbmFtZSwgZGlyX2VudHJ5ICogcmV0ZGVudCwKCQkJCSAgIGludCBkb2xzKQp7CiAgICBfX3UxNiBwcmV2Y2tzdW0gPSAweGZmZmY7CiAgICBfX3UzMiBjdXJjbHVzdCA9IFNUQVJUIChyZXRkZW50KTsKICAgIGludCBmaWxlcyA9IDAsIGRpcnMgPSAwOwoKICAgIEZBVF9EUFJJTlQgKCJnZXRfZGVudGZyb21kaXI6ICVzXG4iLCBmaWxlbmFtZSk7CiAgICB3aGlsZSAoMSkgewoJZGlyX2VudHJ5ICpkZW50cHRyOwoJaW50IGk7CgoJaWYgKGdldF9jbHVzdGVyIChteWRhdGEsIGN1cmNsdXN0LCBnZXRfZGVudGZyb21kaXJfYmxvY2ssCgkJIG15ZGF0YS0+Y2x1c3Rfc2l6ZSAqIFNFQ1RPUl9TSVpFKSAhPSAwKSB7CgkgICAgRkFUX0RQUklOVCAoIkVycm9yOiByZWFkaW5nIGRpcmVjdG9yeSBibG9ja1xuIik7CgkgICAgcmV0dXJuIE5VTEw7Cgl9CglkZW50cHRyID0gKGRpcl9lbnRyeSAqKSBnZXRfZGVudGZyb21kaXJfYmxvY2s7Cglmb3IgKGkgPSAwOyBpIDwgRElSRU5UU1BFUkNMVVNUOyBpKyspIHsKCSAgICBjaGFyIHNfbmFtZVsxNF0sIGxfbmFtZVsyNTZdOwoKCSAgICBsX25hbWVbMF0gPSAnXDAnOwoJICAgIGlmIChkZW50cHRyLT5uYW1lWzBdID09IERFTEVURURfRkxBRykgewoJCSAgICBkZW50cHRyKys7CgkJICAgIGNvbnRpbnVlOwoJICAgIH0KCSAgICBpZiAoKGRlbnRwdHItPmF0dHIgJiBBVFRSX1ZPTFVNRSkpIHsKI2lmZGVmIENPTkZJR19TVVBQT1JUX1ZGQVQKCQlpZiAoKGRlbnRwdHItPmF0dHIgJiBBVFRSX1ZGQVQpICYmCgkJICAgIChkZW50cHRyLT5uYW1lWzBdICYgTEFTVF9MT05HX0VOVFJZX01BU0spKSB7CgkJICAgIHByZXZja3N1bSA9ICgoZGlyX3Nsb3QgKikgZGVudHB0cikKCQkJICAgIC0+YWxpYXNfY2hlY2tzdW07CgkJICAgIGdldF92ZmF0bmFtZSAobXlkYXRhLCBjdXJjbHVzdCwgZ2V0X2RlbnRmcm9tZGlyX2Jsb2NrLAoJCQkJICBkZW50cHRyLCBsX25hbWUpOwoJCSAgICBpZiAoZG9scykgewoJCQlpbnQgaXNkaXIgPSAoZGVudHB0ci0+YXR0ciAmIEFUVFJfRElSKTsKCQkJY2hhciBkaXJjOwoJCQlpbnQgZG9pdCA9IDA7CgoJCQlpZiAoaXNkaXIpIHsKCQkJICAgIGRpcnMrKzsKCQkJICAgIGRpcmMgPSAnLyc7CgkJCSAgICBkb2l0ID0gMTsKCQkJfSBlbHNlIHsKCQkJICAgIGRpcmMgPSAnICc7CgkJCSAgICBpZiAobF9uYW1lWzBdICE9IDApIHsKCQkJCWZpbGVzKys7CgkJCQlkb2l0ID0gMTsKCQkJICAgIH0KCQkJfQoJCQlpZiAoZG9pdCkgewoJCQkgICAgaWYgKGRpcmMgPT0gJyAnKSB7CgkJCQlwcmludGYgKCIgJThsZCAgICVzJWNcbiIsCgkJCQkJKGxvbmcpIEZBVDJDUFUzMiAoZGVudHB0ci0+c2l6ZSksCgkJCQkJbF9uYW1lLCBkaXJjKTsKCQkJICAgIH0gZWxzZSB7CgkJCQlwcmludGYgKCIgICAgICAgICAgICAlcyVjXG4iLCBsX25hbWUsIGRpcmMpOwoJCQkgICAgfQoJCQl9CgkJCWRlbnRwdHIrKzsKCQkJY29udGludWU7CgkJICAgIH0KCQkgICAgRkFUX0RQUklOVCAoInZmYXRuYW1lOiB8JXN8XG4iLCBsX25hbWUpOwoJCX0gZWxzZQojZW5kaWYKCQl7CgkJICAgIC8qIFZvbHVtZSBsYWJlbCBvciBWRkFUIGVudHJ5ICovCgkJICAgIGRlbnRwdHIrKzsKCQkgICAgY29udGludWU7CgkJfQoJICAgIH0KCSAgICBpZiAoZGVudHB0ci0+bmFtZVswXSA9PSAwKSB7CgkJaWYgKGRvbHMpIHsKCQkgICAgcHJpbnRmICgiXG4lZCBmaWxlKHMpLCAlZCBkaXIocylcblxuIiwgZmlsZXMsIGRpcnMpOwoJCX0KCQlGQVRfRFBSSU5UICgiRGVudG5hbWUgPT0gTlVMTCAtICVkXG4iLCBpKTsKCQlyZXR1cm4gTlVMTDsKCSAgICB9CiNpZmRlZiBDT05GSUdfU1VQUE9SVF9WRkFUCgkgICAgaWYgKGRvbHMgJiYgbWtja3N1bSAoZGVudHB0ci0+bmFtZSkgPT0gcHJldmNrc3VtKSB7CgkJZGVudHB0cisrOwoJCWNvbnRpbnVlOwoJICAgIH0KI2VuZGlmCgkgICAgZ2V0X25hbWUgKGRlbnRwdHIsIHNfbmFtZSk7CgkgICAgaWYgKGRvbHMpIHsKCQlpbnQgaXNkaXIgPSAoZGVudHB0ci0+YXR0ciAmIEFUVFJfRElSKTsKCQljaGFyIGRpcmM7CgkJaW50IGRvaXQgPSAwOwoKCQlpZiAoaXNkaXIpIHsKCQkgICAgZGlycysrOwoJCSAgICBkaXJjID0gJy8nOwoJCSAgICBkb2l0ID0gMTsKCQl9IGVsc2UgewoJCSAgICBkaXJjID0gJyAnOwoJCSAgICBpZiAoc19uYW1lWzBdICE9IDApIHsKCQkJZmlsZXMrKzsKCQkJZG9pdCA9IDE7CgkJICAgIH0KCQl9CgkJaWYgKGRvaXQpIHsKCQkgICAgaWYgKGRpcmMgPT0gJyAnKSB7CgkJCXByaW50ZiAoIiAlOGxkICAgJXMlY1xuIiwKCQkJCShsb25nKSBGQVQyQ1BVMzIgKGRlbnRwdHItPnNpemUpLCBzX25hbWUsCgkJCQlkaXJjKTsKCQkgICAgfSBlbHNlIHsKCQkJcHJpbnRmICgiICAgICAgICAgICAgJXMlY1xuIiwgc19uYW1lLCBkaXJjKTsKCQkgICAgfQoJCX0KCQlkZW50cHRyKys7CgkJY29udGludWU7CgkgICAgfQoJICAgIGlmIChzdHJjbXAgKGZpbGVuYW1lLCBzX25hbWUpICYmIHN0cmNtcCAoZmlsZW5hbWUsIGxfbmFtZSkpIHsKCQlGQVRfRFBSSU5UICgiTWlzbWF0Y2g6IHwlc3wlc3xcbiIsIHNfbmFtZSwgbF9uYW1lKTsKCQlkZW50cHRyKys7CgkJY29udGludWU7CgkgICAgfQoJICAgIG1lbWNweSAocmV0ZGVudCwgZGVudHB0ciwgc2l6ZW9mIChkaXJfZW50cnkpKTsKCgkgICAgRkFUX0RQUklOVCAoIkRlbnROYW1lOiAlcyIsIHNfbmFtZSk7CgkgICAgRkFUX0RQUklOVCAoIiwgc3RhcnQ6IDB4JXgiLCBTVEFSVCAoZGVudHB0cikpOwoJICAgIEZBVF9EUFJJTlQgKCIsIHNpemU6ICAweCV4ICVzXG4iLAoJCQlGQVQyQ1BVMzIgKGRlbnRwdHItPnNpemUpLAoJCQkoZGVudHB0ci0+YXR0ciAmIEFUVFJfRElSKSA/ICIoRElSKSIgOiAiIik7CgoJICAgIHJldHVybiByZXRkZW50OwoJfQoJY3VyY2x1c3QgPSBnZXRfZmF0ZW50IChteWRhdGEsIGN1cmNsdXN0KTsKCWlmIChDSEVDS19DTFVTVChjdXJjbHVzdCwgbXlkYXRhLT5mYXRzaXplKSkgewoJICAgIEZBVF9EUFJJTlQgKCJjdXJjbHVzdDogMHgleFxuIiwgY3VyY2x1c3QpOwoJICAgIEZBVF9FUlJPUiAoIkludmFsaWQgRkFUIGVudHJ5XG4iKTsKCSAgICByZXR1cm4gTlVMTDsKCX0KICAgIH0KCiAgICByZXR1cm4gTlVMTDsKfQoKCi8qCiAqIFJlYWQgYm9vdCBzZWN0b3IgYW5kIHZvbHVtZSBpbmZvIGZyb20gYSBGQVQgZmlsZXN5c3RlbQogKi8Kc3RhdGljIGludApyZWFkX2Jvb3RzZWN0YW5kdmkoYm9vdF9zZWN0b3IgKmJzLCB2b2x1bWVfaW5mbyAqdm9saW5mbywgaW50ICpmYXRzaXplKQp7CglfX3U4IGJsb2NrW0ZTX0JMT0NLX1NJWkVdOwoJdm9sdW1lX2luZm8gKnZpc3RhcnQ7CgoJaWYgKGRpc2tfcmVhZCgwLCAxLCBibG9jaykgPCAwKSB7CgkJRkFUX0RQUklOVCgiRXJyb3I6IHJlYWRpbmcgYmxvY2tcbiIpOwoJCXJldHVybiAtMTsKCX0KCgltZW1jcHkoYnMsIGJsb2NrLCBzaXplb2YoYm9vdF9zZWN0b3IpKTsKCWJzLT5yZXNlcnZlZAk9IEZBVDJDUFUxNihicy0+cmVzZXJ2ZWQpOwoJYnMtPmZhdF9sZW5ndGgJPSBGQVQyQ1BVMTYoYnMtPmZhdF9sZW5ndGgpOwoJYnMtPnNlY3NfdHJhY2sJPSBGQVQyQ1BVMTYoYnMtPnNlY3NfdHJhY2spOwoJYnMtPmhlYWRzCT0gRkFUMkNQVTE2KGJzLT5oZWFkcyk7CiNpZiAwIC8qIFVOVVNFRCAqLwoJYnMtPmhpZGRlbgk9IEZBVDJDUFUzMihicy0+aGlkZGVuKTsKI2VuZGlmCglicy0+dG90YWxfc2VjdAk9IEZBVDJDUFUzMihicy0+dG90YWxfc2VjdCk7CgoJLyogRkFUMzIgZW50cmllcyAqLwoJaWYgKGJzLT5mYXRfbGVuZ3RoID09IDApIHsKCQkvKiBBc3N1bWUgRkFUMzIgKi8KCQlicy0+ZmF0MzJfbGVuZ3RoID0gRkFUMkNQVTMyKGJzLT5mYXQzMl9sZW5ndGgpOwoJCWJzLT5mbGFncwkgPSBGQVQyQ1BVMTYoYnMtPmZsYWdzKTsKCQlicy0+cm9vdF9jbHVzdGVyID0gRkFUMkNQVTMyKGJzLT5yb290X2NsdXN0ZXIpOwoJCWJzLT5pbmZvX3NlY3RvciAgPSBGQVQyQ1BVMTYoYnMtPmluZm9fc2VjdG9yKTsKCQlicy0+YmFja3VwX2Jvb3QgID0gRkFUMkNQVTE2KGJzLT5iYWNrdXBfYm9vdCk7CgkJdmlzdGFydCA9ICh2b2x1bWVfaW5mbyopIChibG9jayArIHNpemVvZihib290X3NlY3RvcikpOwoJCSpmYXRzaXplID0gMzI7Cgl9IGVsc2UgewoJCXZpc3RhcnQgPSAodm9sdW1lX2luZm8qKSAmKGJzLT5mYXQzMl9sZW5ndGgpOwoJCSpmYXRzaXplID0gMDsKCX0KCW1lbWNweSh2b2xpbmZvLCB2aXN0YXJ0LCBzaXplb2Yodm9sdW1lX2luZm8pKTsKCgkvKiBUZXJtaW5hdGUgZnNfdHlwZSBzdHJpbmcuIFdyaXRpbmcgcGFzdCB0aGUgZW5kIG9mIHZpc3RhcnQKCSAgIGlzIG9rIC0gaXQncyBqdXN0IHRoZSBidWZmZXIuICovCgl2aXN0YXJ0LT5mc190eXBlWzhdID0gJ1wwJzsKCglpZiAoKmZhdHNpemUgPT0gMzIpIHsKCQlpZiAoY29tcGFyZV9zaWduKEZBVDMyX1NJR04sIHZpc3RhcnQtPmZzX3R5cGUpID09IDApIHsKCQkJcmV0dXJuIDA7CgkJfQoJfSBlbHNlIHsKCQlpZiAoY29tcGFyZV9zaWduKEZBVDEyX1NJR04sIHZpc3RhcnQtPmZzX3R5cGUpID09IDApIHsKCQkJKmZhdHNpemUgPSAxMjsKCQkJcmV0dXJuIDA7CgkJfQoJCWlmIChjb21wYXJlX3NpZ24oRkFUMTZfU0lHTiwgdmlzdGFydC0+ZnNfdHlwZSkgPT0gMCkgewoJCQkqZmF0c2l6ZSA9IDE2OwoJCQlyZXR1cm4gMDsKCQl9Cgl9CgoJRkFUX0RQUklOVCgiRXJyb3I6IGJyb2tlbiBmc190eXBlIHNpZ25cbiIpOwoJcmV0dXJuIC0xOwp9CgoKX191OCBkb19mYXRfcmVhZF9ibG9ja1tNQVhfQ0xVU1RTSVpFXTsgIC8qIEJsb2NrIGJ1ZmZlciAqLwpsb25nCmRvX2ZhdF9yZWFkIChjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIG1heHNpemUsCgkgICAgIGludCBkb2xzKQp7CiNpZiBDT05GSUdfTklPUyAvKiBOSU9TIENQVSBjYW5ub3QgYWNjZXNzIGJpZyBhdXRvbWF0aWMgYXJyYXlzICovCiAgICBzdGF0aWMKI2VuZGlmCiAgICBjaGFyIGZuYW1lY29weVsyMDQ4XTsKICAgIGJvb3Rfc2VjdG9yIGJzOwogICAgdm9sdW1lX2luZm8gdm9saW5mbzsKICAgIGZzZGF0YSBkYXRhYmxvY2s7CiAgICBmc2RhdGEgKm15ZGF0YSA9ICZkYXRhYmxvY2s7CiAgICBkaXJfZW50cnkgKmRlbnRwdHI7CiAgICBfX3UxNiBwcmV2Y2tzdW0gPSAweGZmZmY7CiAgICBjaGFyICpzdWJuYW1lID0gIiI7CiAgICBpbnQgcm9vdGRpcl9zaXplLCBjdXJzZWN0OwogICAgaW50IGlkeCwgaXNkaXIgPSAwOwogICAgaW50IGZpbGVzID0gMCwgZGlycyA9IDA7CiAgICBsb25nIHJldCA9IDA7CiAgICBpbnQgZmlyc3R0aW1lOwoKICAgIGlmIChyZWFkX2Jvb3RzZWN0YW5kdmkgKCZicywgJnZvbGluZm8sICZteWRhdGEtPmZhdHNpemUpKSB7CglGQVRfRFBSSU5UICgiRXJyb3I6IHJlYWRpbmcgYm9vdCBzZWN0b3JcbiIpOwoJcmV0dXJuIC0xOwogICAgfQogICAgaWYgKG15ZGF0YS0+ZmF0c2l6ZSA9PSAzMikgewoJbXlkYXRhLT5mYXRsZW5ndGggPSBicy5mYXQzMl9sZW5ndGg7CiAgICB9IGVsc2UgewoJbXlkYXRhLT5mYXRsZW5ndGggPSBicy5mYXRfbGVuZ3RoOwogICAgfQogICAgbXlkYXRhLT5mYXRfc2VjdCA9IGJzLnJlc2VydmVkOwogICAgY3Vyc2VjdCA9IG15ZGF0YS0+cm9vdGRpcl9zZWN0CgkgICAgPSBteWRhdGEtPmZhdF9zZWN0ICsgbXlkYXRhLT5mYXRsZW5ndGggKiBicy5mYXRzOwogICAgbXlkYXRhLT5jbHVzdF9zaXplID0gYnMuY2x1c3Rlcl9zaXplOwogICAgaWYgKG15ZGF0YS0+ZmF0c2l6ZSA9PSAzMikgewoJcm9vdGRpcl9zaXplID0gbXlkYXRhLT5jbHVzdF9zaXplOwoJbXlkYXRhLT5kYXRhX2JlZ2luID0gbXlkYXRhLT5yb290ZGlyX3NlY3QgICAvKiArIHJvb3RkaXJfc2l6ZSAqLwoJCS0gKG15ZGF0YS0+Y2x1c3Rfc2l6ZSAqIDIpOwogICAgfSBlbHNlIHsKCXJvb3RkaXJfc2l6ZSA9ICgoYnMuZGlyX2VudHJpZXNbMV0gKiAoaW50KSAyNTYgKyBicy5kaXJfZW50cmllc1swXSkKCQkJKiBzaXplb2YgKGRpcl9lbnRyeSkpIC8gU0VDVE9SX1NJWkU7CglteWRhdGEtPmRhdGFfYmVnaW4gPSBteWRhdGEtPnJvb3RkaXJfc2VjdCArIHJvb3RkaXJfc2l6ZQoJCS0gKG15ZGF0YS0+Y2x1c3Rfc2l6ZSAqIDIpOwogICAgfQogICAgbXlkYXRhLT5mYXRidWZudW0gPSAtMTsKCiAgICBGQVRfRFBSSU5UICgiRkFUJWQsIGZhdGxlbmd0aDogJWRcbiIsIG15ZGF0YS0+ZmF0c2l6ZSwKCQlteWRhdGEtPmZhdGxlbmd0aCk7CiAgICBGQVRfRFBSSU5UICgiUm9vdGRpciBiZWdpbnMgYXQgc2VjdG9yOiAlZCwgb2Zmc2V0OiAleCwgc2l6ZTogJWRcbiIKCQkiRGF0YSBiZWdpbnMgYXQ6ICVkXG4iLAoJCW15ZGF0YS0+cm9vdGRpcl9zZWN0LCBteWRhdGEtPnJvb3RkaXJfc2VjdCAqIFNFQ1RPUl9TSVpFLAoJCXJvb3RkaXJfc2l6ZSwgbXlkYXRhLT5kYXRhX2JlZ2luKTsKICAgIEZBVF9EUFJJTlQgKCJDbHVzdGVyIHNpemU6ICVkXG4iLCBteWRhdGEtPmNsdXN0X3NpemUpOwoKICAgIC8qICJjd2QiIGlzIGFsd2F5cyB0aGUgcm9vdC4uLiAqLwogICAgd2hpbGUgKElTRElSREVMSU0gKCpmaWxlbmFtZSkpCglmaWxlbmFtZSsrOwogICAgLyogTWFrZSBhIGNvcHkgb2YgdGhlIGZpbGVuYW1lIGFuZCBjb252ZXJ0IGl0IHRvIGxvd2VyY2FzZSAqLwogICAgc3RyY3B5IChmbmFtZWNvcHksIGZpbGVuYW1lKTsKICAgIGRvd25jYXNlIChmbmFtZWNvcHkpOwogICAgaWYgKCpmbmFtZWNvcHkgPT0gJ1wwJykgewoJaWYgKCFkb2xzKQoJICAgIHJldHVybiAtMTsKCWRvbHMgPSBMU19ST09UOwogICAgfSBlbHNlIGlmICgoaWR4ID0gZGlyZGVsaW0gKGZuYW1lY29weSkpID49IDApIHsKCWlzZGlyID0gMTsKCWZuYW1lY29weVtpZHhdID0gJ1wwJzsKCXN1Ym5hbWUgPSBmbmFtZWNvcHkgKyBpZHggKyAxOwoJLyogSGFuZGxlIG11bHRpcGxlIGRlbGltaXRlcnMgKi8KCXdoaWxlIChJU0RJUkRFTElNICgqc3VibmFtZSkpCgkgICAgc3VibmFtZSsrOwogICAgfSBlbHNlIGlmIChkb2xzKSB7Cglpc2RpciA9IDE7CiAgICB9CgogICAgd2hpbGUgKDEpIHsKCWludCBpOwoKCWlmIChkaXNrX3JlYWQgKGN1cnNlY3QsIG15ZGF0YS0+Y2x1c3Rfc2l6ZSwgZG9fZmF0X3JlYWRfYmxvY2spIDwgMCkgewoJICAgIEZBVF9EUFJJTlQgKCJFcnJvcjogcmVhZGluZyByb290ZGlyIGJsb2NrXG4iKTsKCSAgICByZXR1cm4gLTE7Cgl9CglkZW50cHRyID0gKGRpcl9lbnRyeSAqKSBkb19mYXRfcmVhZF9ibG9jazsKCWZvciAoaSA9IDA7IGkgPCBESVJFTlRTUEVSQkxPQ0s7IGkrKykgewoJICAgIGNoYXIgc19uYW1lWzE0XSwgbF9uYW1lWzI1Nl07CgoJICAgIGxfbmFtZVswXSA9ICdcMCc7CgkgICAgaWYgKChkZW50cHRyLT5hdHRyICYgQVRUUl9WT0xVTUUpKSB7CiNpZmRlZiBDT05GSUdfU1VQUE9SVF9WRkFUCgkJaWYgKChkZW50cHRyLT5hdHRyICYgQVRUUl9WRkFUKSAmJgoJCSAgICAoZGVudHB0ci0+bmFtZVswXSAmIExBU1RfTE9OR19FTlRSWV9NQVNLKSkgewoJCSAgICBwcmV2Y2tzdW0gPSAoKGRpcl9zbG90ICopIGRlbnRwdHIpLT5hbGlhc19jaGVja3N1bTsKCQkgICAgZ2V0X3ZmYXRuYW1lIChteWRhdGEsIDAsIGRvX2ZhdF9yZWFkX2Jsb2NrLCBkZW50cHRyLCBsX25hbWUpOwoJCSAgICBpZiAoZG9scyA9PSBMU19ST09UKSB7CgkJCWludCBpc2RpciA9IChkZW50cHRyLT5hdHRyICYgQVRUUl9ESVIpOwoJCQljaGFyIGRpcmM7CgkJCWludCBkb2l0ID0gMDsKCgkJCWlmIChpc2RpcikgewoJCQkgICAgZGlycysrOwoJCQkgICAgZGlyYyA9ICcvJzsKCQkJICAgIGRvaXQgPSAxOwoJCQl9IGVsc2UgewoJCQkgICAgZGlyYyA9ICcgJzsKCQkJICAgIGlmIChsX25hbWVbMF0gIT0gMCkgewoJCQkJZmlsZXMrKzsKCQkJCWRvaXQgPSAxOwoJCQkgICAgfQoJCQl9CgkJCWlmIChkb2l0KSB7CgkJCSAgICBpZiAoZGlyYyA9PSAnICcpIHsKCQkJCXByaW50ZiAoIiAlOGxkICAgJXMlY1xuIiwKCQkJCQkobG9uZykgRkFUMkNQVTMyIChkZW50cHRyLT5zaXplKSwKCQkJCQlsX25hbWUsIGRpcmMpOwoJCQkgICAgfSBlbHNlIHsKCQkJCXByaW50ZiAoIiAgICAgICAgICAgICVzJWNcbiIsIGxfbmFtZSwgZGlyYyk7CgkJCSAgICB9CgkJCX0KCQkJZGVudHB0cisrOwoJCQljb250aW51ZTsKCQkgICAgfQoJCSAgICBGQVRfRFBSSU5UICgiUm9vdHZmYXRuYW1lOiB8JXN8XG4iLCBsX25hbWUpOwoJCX0gZWxzZQojZW5kaWYKCQl7CgkJICAgIC8qIFZvbHVtZSBsYWJlbCBvciBWRkFUIGVudHJ5ICovCgkJICAgIGRlbnRwdHIrKzsKCQkgICAgY29udGludWU7CgkJfQoJICAgIH0gZWxzZSBpZiAoZGVudHB0ci0+bmFtZVswXSA9PSAwKSB7CgkJRkFUX0RQUklOVCAoIlJvb3REZW50bmFtZSA9PSBOVUxMIC0gJWRcbiIsIGkpOwoJCWlmIChkb2xzID09IExTX1JPT1QpIHsKCQkgICAgcHJpbnRmICgiXG4lZCBmaWxlKHMpLCAlZCBkaXIocylcblxuIiwgZmlsZXMsIGRpcnMpOwoJCSAgICByZXR1cm4gMDsKCQl9CgkJcmV0dXJuIC0xOwoJICAgIH0KI2lmZGVmIENPTkZJR19TVVBQT1JUX1ZGQVQKCSAgICBlbHNlIGlmIChkb2xzID09IExTX1JPT1QKCQkgICAgICYmIG1rY2tzdW0gKGRlbnRwdHItPm5hbWUpID09IHByZXZja3N1bSkgewoJCWRlbnRwdHIrKzsKCQljb250aW51ZTsKCSAgICB9CiNlbmRpZgoJICAgIGdldF9uYW1lIChkZW50cHRyLCBzX25hbWUpOwoJICAgIGlmIChkb2xzID09IExTX1JPT1QpIHsKCQlpbnQgaXNkaXIgPSAoZGVudHB0ci0+YXR0ciAmIEFUVFJfRElSKTsKCQljaGFyIGRpcmM7CgkJaW50IGRvaXQgPSAwOwoKCQlpZiAoaXNkaXIpIHsKCQkgICAgZGlyYyA9ICcvJzsKCQkgICAgaWYgKHNfbmFtZVswXSAhPSAwKSB7CgkJCWRpcnMrKzsKCQkJZG9pdCA9IDE7CgkJICAgIH0KCQl9IGVsc2UgewoJCSAgICBkaXJjID0gJyAnOwoJCSAgICBpZiAoc19uYW1lWzBdICE9IDApIHsKCQkJZmlsZXMrKzsKCQkJZG9pdCA9IDE7CgkJICAgIH0KCQl9CgkJaWYgKGRvaXQpIHsKCQkgICAgaWYgKGRpcmMgPT0gJyAnKSB7CgkJCXByaW50ZiAoIiAlOGxkICAgJXMlY1xuIiwKCQkJCShsb25nKSBGQVQyQ1BVMzIgKGRlbnRwdHItPnNpemUpLCBzX25hbWUsCgkJCQlkaXJjKTsKCQkgICAgfSBlbHNlIHsKCQkJcHJpbnRmICgiICAgICAgICAgICAgJXMlY1xuIiwgc19uYW1lLCBkaXJjKTsKCQkgICAgfQoJCX0KCQlkZW50cHRyKys7CgkJY29udGludWU7CgkgICAgfQoJICAgIGlmIChzdHJjbXAgKGZuYW1lY29weSwgc19uYW1lKSAmJiBzdHJjbXAgKGZuYW1lY29weSwgbF9uYW1lKSkgewoJCUZBVF9EUFJJTlQgKCJSb290TWlzbWF0Y2g6IHwlc3wlc3xcbiIsIHNfbmFtZSwgbF9uYW1lKTsKCQlkZW50cHRyKys7CgkJY29udGludWU7CgkgICAgfQoJICAgIGlmIChpc2RpciAmJiAhKGRlbnRwdHItPmF0dHIgJiBBVFRSX0RJUikpCgkJcmV0dXJuIC0xOwoKCSAgICBGQVRfRFBSSU5UICgiUm9vdE5hbWU6ICVzIiwgc19uYW1lKTsKCSAgICBGQVRfRFBSSU5UICgiLCBzdGFydDogMHgleCIsIFNUQVJUIChkZW50cHRyKSk7CgkgICAgRkFUX0RQUklOVCAoIiwgc2l6ZTogIDB4JXggJXNcbiIsCgkJCUZBVDJDUFUzMiAoZGVudHB0ci0+c2l6ZSksIGlzZGlyID8gIihESVIpIiA6ICIiKTsKCgkgICAgZ290byByb290ZGlyX2RvbmU7ICAvKiBXZSBnb3QgYSBtYXRjaCAqLwoJfQoJY3Vyc2VjdCsrOwogICAgfQogIHJvb3RkaXJfZG9uZToKCiAgICBmaXJzdHRpbWUgPSAxOwogICAgd2hpbGUgKGlzZGlyKSB7CglpbnQgc3RhcnRzZWN0ID0gbXlkYXRhLT5kYXRhX2JlZ2luCgkJKyBTVEFSVCAoZGVudHB0cikgKiBteWRhdGEtPmNsdXN0X3NpemU7CglkaXJfZW50cnkgZGVudDsKCWNoYXIgKm5leHRuYW1lID0gTlVMTDsKCglkZW50ID0gKmRlbnRwdHI7CglkZW50cHRyID0gJmRlbnQ7CgoJaWR4ID0gZGlyZGVsaW0gKHN1Ym5hbWUpOwoJaWYgKGlkeCA+PSAwKSB7CgkgICAgc3VibmFtZVtpZHhdID0gJ1wwJzsKCSAgICBuZXh0bmFtZSA9IHN1Ym5hbWUgKyBpZHggKyAxOwoJICAgIC8qIEhhbmRsZSBtdWx0aXBsZSBkZWxpbWl0ZXJzICovCgkgICAgd2hpbGUgKElTRElSREVMSU0gKCpuZXh0bmFtZSkpCgkJbmV4dG5hbWUrKzsKCSAgICBpZiAoZG9scyAmJiAqbmV4dG5hbWUgPT0gJ1wwJykKCQlmaXJzdHRpbWUgPSAwOwoJfSBlbHNlIHsKCSAgICBpZiAoZG9scyAmJiBmaXJzdHRpbWUpIHsKCQlmaXJzdHRpbWUgPSAwOwoJICAgIH0gZWxzZSB7CgkJaXNkaXIgPSAwOwoJICAgIH0KCX0KCglpZiAoZ2V0X2RlbnRmcm9tZGlyIChteWRhdGEsIHN0YXJ0c2VjdCwgc3VibmFtZSwgZGVudHB0ciwKCQkJICAgICBpc2RpciA/IDAgOiBkb2xzKSA9PSBOVUxMKSB7CgkgICAgaWYgKGRvbHMgJiYgIWlzZGlyKQoJCXJldHVybiAwOwoJICAgIHJldHVybiAtMTsKCX0KCglpZiAoaWR4ID49IDApIHsKCSAgICBpZiAoIShkZW50cHRyLT5hdHRyICYgQVRUUl9ESVIpKQoJCXJldHVybiAtMTsKCSAgICBzdWJuYW1lID0gbmV4dG5hbWU7Cgl9CiAgICB9CiAgICByZXQgPSBnZXRfY29udGVudHMgKG15ZGF0YSwgZGVudHB0ciwgYnVmZmVyLCBtYXhzaXplKTsKICAgIEZBVF9EUFJJTlQgKCJTaXplOiAlZCwgZ290OiAlbGRcbiIsIEZBVDJDUFUzMiAoZGVudHB0ci0+c2l6ZSksIHJldCk7CgogICAgcmV0dXJuIHJldDsKfQoKCmludApmaWxlX2ZhdF9kZXRlY3Rmcyh2b2lkKQp7Cglib290X3NlY3RvcgliczsKCXZvbHVtZV9pbmZvCXZvbGluZm87CglpbnQJCWZhdHNpemU7CgljaGFyCXZvbF9sYWJlbFsxMl07CgoJaWYoY3VyX2Rldj09TlVMTCkgewoJCXByaW50ZigiTm8gY3VycmVudCBkZXZpY2VcbiIpOwoJCXJldHVybiAxOwoJfQojaWYgZGVmaW5lZChDT05GSUdfQ01EX0lERSkgfHwgXAogICAgZGVmaW5lZChDT05GSUdfQ01EX1NDU0kpIHx8IFwKICAgIGRlZmluZWQoQ09ORklHX0NNRF9VU0IpIHx8IFwKICAgIGRlZmluZWQoQ09ORklHX01NQykKCXByaW50ZigiSW50ZXJmYWNlOiAgIik7Cglzd2l0Y2goY3VyX2Rldi0+aWZfdHlwZSkgewoJCWNhc2UgSUZfVFlQRV9JREUgOglwcmludGYoIklERSIpOyBicmVhazsKCQljYXNlIElGX1RZUEVfU0NTSSA6CXByaW50ZigiU0NTSSIpOyBicmVhazsKCQljYXNlIElGX1RZUEVfQVRBUEkgOglwcmludGYoIkFUQVBJIik7IGJyZWFrOwoJCWNhc2UgSUZfVFlQRV9VU0IgOglwcmludGYoIlVTQiIpOyBicmVhazsKCQljYXNlIElGX1RZUEVfRE9DIDoJcHJpbnRmKCJET0MiKTsgYnJlYWs7CgkJY2FzZSBJRl9UWVBFX01NQyA6CXByaW50ZigiTU1DIik7IGJyZWFrOwoJCWRlZmF1bHQgOgkJcHJpbnRmKCJVbmtub3duIik7Cgl9CglwcmludGYoIlxuICBEZXZpY2UgJWQ6ICIsY3VyX2Rldi0+ZGV2KTsKCWRldl9wcmludChjdXJfZGV2KTsKI2VuZGlmCglpZihyZWFkX2Jvb3RzZWN0YW5kdmkoJmJzLCAmdm9saW5mbywgJmZhdHNpemUpKSB7CgkJcHJpbnRmKCJcbk5vIHZhbGlkIEZBVCBmcyBmb3VuZFxuIik7CgkJcmV0dXJuIDE7Cgl9CgltZW1jcHkgKHZvbF9sYWJlbCwgdm9saW5mby52b2x1bWVfbGFiZWwsIDExKTsKCXZvbF9sYWJlbFsxMV0gPSAnXDAnOwoJdm9saW5mby5mc190eXBlWzVdPSdcMCc7CglwcmludGYoIlBhcnRpdGlvbiAlZDogRmlsZXN5c3RlbTogJXMgXCIlc1wiXG4iCgkJCSxjdXJfcGFydCx2b2xpbmZvLmZzX3R5cGUsdm9sX2xhYmVsKTsKCXJldHVybiAwOwp9CgoKaW50CmZpbGVfZmF0X2xzKGNvbnN0IGNoYXIgKmRpcikKewoJcmV0dXJuIGRvX2ZhdF9yZWFkKGRpciwgTlVMTCwgMCwgTFNfWUVTKTsKfQoKCmxvbmcKZmlsZV9mYXRfcmVhZChjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIG1heHNpemUpCnsKCXByaW50ZigicmVhZGluZyAlc1xuIixmaWxlbmFtZSk7CglyZXR1cm4gZG9fZmF0X3JlYWQoZmlsZW5hbWUsIGJ1ZmZlciwgbWF4c2l6ZSwgTFNfTk8pOwp9Cg==