Received: with ECARTIS (v1.0.0; list xfs); Mon, 04 Jun 2007 18:50:49 -0700 (PDT) Received: from larry.melbourne.sgi.com (larry.melbourne.sgi.com [134.14.52.130]) by oss.sgi.com (8.12.10/8.12.10/SuSE Linux 0.7) with SMTP id l551odWt001588 for ; Mon, 4 Jun 2007 18:50:41 -0700 Received: from pc-bnaujok.melbourne.sgi.com (pc-bnaujok.melbourne.sgi.com [134.14.55.58]) by larry.melbourne.sgi.com (950413.SGI.8.6.12/950213.SGI.AUTOCF) via ESMTP id LAA05642; Tue, 5 Jun 2007 11:50:39 +1000 Date: Tue, 05 Jun 2007 11:54:00 +1000 To: "xfs@oss.sgi.com" , xfs-dev Subject: [REVIEW 2/3] - xfs_repair enhancements (lost+found handling) From: "Barry Naujok" Organization: SGI Content-Type: multipart/mixed; boundary=----------yUh6rLTYauJAeqPswTCPZX MIME-Version: 1.0 Message-ID: User-Agent: Opera Mail/9.10 (Win32) X-archive-position: 11638 X-ecartis-version: Ecartis v1.0.0 Sender: xfs-bounce@oss.sgi.com Errors-to: xfs-bounce@oss.sgi.com X-original-sender: bnaujok@sgi.com Precedence: bulk X-list: xfs ------------yUh6rLTYauJAeqPswTCPZX Content-Type: text/plain; format=flowed; delsp=yes; charset=iso-8859-15 Content-Transfer-Encoding: 7bit This particular patch is in the sequence for part 3 which will rely on I/O being uniform for each piece of metadata. It changes the behaviour of lost+found quite substantially in xfs_repair. Currently, xfs_repair deletes any lost+found directories in phase 3, which will orphan inodes that still reside in lost+found. During phase 6, it's recreated and repopulated with orphaned inodes. When one leaves inodes in lost+found between successive runs, it can cause some confusion as xfs_repair keeps on discovering orphaned inodes. This change leaves any lost+found directory or inode alone during phases 3/4 (other than checking for normal consistancy). During phase 6, if it finds lost+found in the root inode, it checks that it's a directory and is consistant and remembers it. If it's corrupted, it's junked or repaired like any other directory. If it's not a directory, it's junked. During the last part of phase 6, if any orphaned inodes are found, it will place them in the previously located lost+found directory, or create it and place them. ------------yUh6rLTYauJAeqPswTCPZX Content-Disposition: attachment; filename=lost+found Content-Type: application/octet-stream; name=lost+found Content-Transfer-Encoding: Base64 SW5kZXg6IHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvZGlub19jaHVua3MuYwo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZXBhaXIub3JpZy94ZnNwcm9n cy9yZXBhaXIvZGlub19jaHVua3MuYwkyMDA3LTA0LTI3IDE0OjA5OjA1LjY5 MDc4MzAwNSArMTAwMAorKysgcmVwYWlyL3hmc3Byb2dzL3JlcGFpci9kaW5v X2NodW5rcy5jCTIwMDctMDQtMjcgMTQ6MTE6NDEuMDAwMDAwMDAwICsxMDAw CkBAIC03NjIsMTggKzc2MiwxNCBAQAogCQkgKi8KIAkJaWYgKGlzX3VzZWQp ICB7CiAJCQlpZiAoaXNfaW5vZGVfZnJlZShpbm9fcmVjLCBpcmVjX29mZnNl dCkpICB7Ci0JCQkJaWYgKHZlcmJvc2UgfHwgbm9fbW9kaWZ5IHx8Ci0JCQkJ ICAgIFhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sIGFnaW5vKSAhPQotCQkJ CQkJCW9sZF9vcnBoYW5hZ2VfaW5vKSAgeworCQkJCWlmICh2ZXJib3NlIHx8 IG5vX21vZGlmeSkgIHsKIAkJCQkJZG9fd2FybihfKCJpbWFwIGNsYWltcyBp bi11c2UgaW5vZGUgIgogCQkJCQkJICAiJWxsdSBpcyBmcmVlLCAiKSwKIAkJ CQkJCVhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sCiAJCQkJCQlhZ2lubykp OwogCQkJCX0KIAotCQkJCWlmICh2ZXJib3NlIHx8ICghbm9fbW9kaWZ5ICYm Ci0JCQkJICAgIFhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sIGFnaW5vKSAh PQotCQkJCQkJb2xkX29ycGhhbmFnZV9pbm8pKQorCQkJCWlmICh2ZXJib3Nl IHx8ICFub19tb2RpZnkpCiAJCQkJCWRvX3dhcm4oXygiY29ycmVjdGluZyBp bWFwXG4iKSk7CiAJCQkJZWxzZQogCQkJCQlkb193YXJuKF8oIndvdWxkIGNv cnJlY3QgaW1hcFxuIikpOwpJbmRleDogcmVwYWlyL3hmc3Byb2dzL3JlcGFp ci9kaXIuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZXBhaXIub3Jp Zy94ZnNwcm9ncy9yZXBhaXIvZGlyLmMJMjAwNy0wNC0yNyAxMzoxMzozNS45 NzE5OTM0ODkgKzEwMDAKKysrIHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvZGly LmMJMjAwNy0wNC0yNyAxNDoxMTo0MS4wMDAwMDAwMDAgKzEwMDAKQEAgLTE5 NTIsMTIgKzE5NTIsNiBAQAogCQkJCV8oIlx0d291bGQgY2xlYXIgaW5vIG51 bWJlciBpbiBlbnRyeSAlZC4uLlxuIiksCiAJCQkJCWkpOwogCQkJfQotCQl9 IGVsc2UgaWYgKGxpbm8gPT0gb2xkX29ycGhhbmFnZV9pbm8pICB7Ci0JCQkv KgotCQkJICogZG8gbm90aGluZywgc2lsZW50bHkgaWdub3JlIGl0LCBlbnRy eSBoYXMKLQkJCSAqIGFscmVhZHkgYmVlbiBtYXJrZWQgVEJEIHNpbmNlIG9s ZF9vcnBoYW5hZ2VfaW5vCi0JCQkgKiBpcyBzZXQgbm9uLXplcm8uCi0JCQkg Ki8KIAkJfSBlbHNlIGlmICgoaXJlY19wID0gZmluZF9pbm9kZV9yZWMoCiAJ CQkJWEZTX0lOT19UT19BR05PKG1wLCBsaW5vKSwKIAkJCQlYRlNfSU5PX1RP X0FHSU5PKG1wLCBsaW5vKSkpICE9IE5VTEwpICB7CkluZGV4OiByZXBhaXIv eGZzcHJvZ3MvcmVwYWlyL2RpcjIuYwo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSByZXBhaXIub3JpZy94ZnNwcm9ncy9yZXBhaXIvZGlyMi5jCTIwMDct MDQtMjcgMTM6MTM6MzUuOTcxOTkzNDg5ICsxMDAwCisrKyByZXBhaXIveGZz cHJvZ3MvcmVwYWlyL2RpcjIuYwkyMDA3LTA0LTI3IDE0OjExOjQxLjAwMDAw MDAwMCArMTAwMApAQCAtMTQ0MCwxMyArMTQ0MCw2IEBACiAJCX0gZWxzZSBp ZiAoSU5UX0dFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCkgPT0gbXAt Pm1fc2Iuc2JfZ3F1b3Rpbm8pIHsKIAkJCWNsZWFyaW5vID0gMTsKIAkJCWNs ZWFycmVhc29uID0gXygiZ3JvdXAgcXVvdGEiKTsKLQkJfSBlbHNlIGlmIChJ TlRfR0VUKGRlcC0+aW51bWJlciwgQVJDSF9DT05WRVJUKSA9PSBvbGRfb3Jw aGFuYWdlX2lubykgewotCQkJLyoKLQkJCSAqIERvIG5vdGhpbmcsIHNpbGVu dGx5IGlnbm9yZSBpdCwgZW50cnkgaGFzIGFscmVhZHkKLQkJCSAqIGJlZW4g bWFya2VkIFRCRCBzaW5jZSBvbGRfb3JwaGFuYWdlX2lubyBpcyBzZXQKLQkJ CSAqIG5vbi16ZXJvLgotCQkJICovCi0JCQljbGVhcmlubyA9IDA7CiAJCX0g ZWxzZSBpZiAoKGlyZWNfcCA9IGZpbmRfaW5vZGVfcmVjKAogCQkJCVhGU19J Tk9fVE9fQUdOTyhtcCwgSU5UX0dFVChkZXAtPmludW1iZXIsCiAJCQkJCUFS Q0hfQ09OVkVSVCkpLApJbmRleDogcmVwYWlyL3hmc3Byb2dzL3JlcGFpci9n bG9iYWxzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVwYWlyLm9y aWcveGZzcHJvZ3MvcmVwYWlyL2dsb2JhbHMuaAkyMDA3LTA0LTI3IDE0OjEx OjQxLjY4MjQxODIzNCArMTAwMAorKysgcmVwYWlyL3hmc3Byb2dzL3JlcGFp ci9nbG9iYWxzLmgJMjAwNy0wNC0yNyAxNDoxMTo0MS4wMDAwMDAwMDAgKzEw MDAKQEAgLTE4OCw5ICsxODgsNiBAQAogRVhURVJOIF9fdWludDY0X3QJc2Jf ZmRibG9ja3M7CS8qIGZyZWUgZGF0YSBibG9ja3MgKi8KIEVYVEVSTiBfX3Vp bnQ2NF90CXNiX2ZyZXh0ZW50czsJLyogZnJlZSByZWFsdGltZSBleHRlbnRz ICovCiAKLUVYVEVSTiB4ZnNfaW5vX3QJb3JwaGFuYWdlX2lubzsKLUVYVEVS TiB4ZnNfaW5vX3QJb2xkX29ycGhhbmFnZV9pbm87Ci0KIC8qIHN1cGVyYmxv Y2sgZ2VvbWV0cnkgaW5mbyAqLwogCiBFWFRFUk4geGZzX2V4dGxlbl90CXNi X2lub2FsaWdubXQ7CkluZGV4OiByZXBhaXIveGZzcHJvZ3MvcmVwYWlyL3Bo YXNlMS5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHJlcGFpci5vcmln L3hmc3Byb2dzL3JlcGFpci9waGFzZTEuYwkyMDA3LTA0LTI3IDEzOjEzOjM1 Ljk3MTk5MzQ4OSArMTAwMAorKysgcmVwYWlyL3hmc3Byb2dzL3JlcGFpci9w aGFzZTEuYwkyMDA3LTA0LTI3IDE0OjExOjQxLjc4MjQwNTE4MSArMTAwMApA QCAtNjMsNyArNjMsNiBAQAogCW5lZWRfcmJtaW5vID0gMDsKIAluZWVkX3Jz dW1pbm8gPSAwOwogCWxvc3RfcXVvdGFzID0gMDsKLQlvbGRfb3JwaGFuYWdl X2lubyA9ICh4ZnNfaW5vX3QpIDA7CiAKIAkvKgogCSAqIGdldCBBRyAwIGlu dG8gYWcgaGVhZGVyIGJ1ZgpJbmRleDogcmVwYWlyL3hmc3Byb2dzL3JlcGFp ci9waGFzZTQuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZXBhaXIu b3JpZy94ZnNwcm9ncy9yZXBhaXIvcGhhc2U0LmMJMjAwNy0wNC0yNyAxNDox MTo0MS42OTA0MTcxODkgKzEwMDAKKysrIHJlcGFpci94ZnNwcm9ncy9yZXBh aXIvcGhhc2U0LmMJMjAwNy0wNC0yNyAxNDoxMTo0MS4wMDAwMDAwMDAgKzEw MDAKQEAgLTMyLDEwMjAgKzMyLDYgQEAKICNpbmNsdWRlICJwcm9ncmVzcy5o IgogCiAKLS8qIEFSR1NVU0VEICovCi1pbnQKLWxmX2Jsb2NrX2RlbGV0ZV9v cnBoYW5hZ2UoeGZzX21vdW50X3QJCSptcCwKLQkJCXhmc19pbm9fdAkJaW5v LAotCQkJeGZzX2Rpcl9sZWFmYmxvY2tfdAkqbGVhZiwKLQkJCWludAkJCSpk aXJ0eSwKLQkJCXhmc19idWZfdAkJKnJvb3Rpbm9fYnAsCi0JCQlpbnQJCQkq cmJ1Zl9kaXJ0eSkKLXsKLQl4ZnNfZGlyX2xlYWZfZW50cnlfdAkqZW50cnk7 Ci0JeGZzX2Rpbm9kZV90CQkqZGlubzsKLQl4ZnNfYnVmX3QJCSpicDsKLQlp bm9fdHJlZV9ub2RlX3QJCSppcmVjOwotCXhmc19pbm9fdAkJbGlubzsKLQl4 ZnNfZGlyX2xlYWZfbmFtZV90CSpuYW1lc3Q7Ci0JeGZzX2FnaW5vX3QJCWFn aW5vOwotCXhmc19hZ251bWJlcl90CQlhZ25vOwotCXhmc19hZ2lub190CQly b290X2FnaW5vOwotCXhmc19hZ251bWJlcl90CQlyb290X2Fnbm87Ci0JaW50 CQkJaTsKLQlpbnQJCQlpbm9fb2Zmc2V0OwotCWludAkJCWlub19kaXJ0eTsK LQlpbnQJCQl1c2VfcmJ1ZjsKLQlpbnQJCQlsZW47Ci0JY2hhcgkJCWZuYW1l W01BWE5BTUVMRU4gKyAxXTsKLQlpbnQJCQlyZXM7Ci0KLQllbnRyeSA9ICZs ZWFmLT5lbnRyaWVzWzBdOwotCSpkaXJ0eSA9IDA7Ci0JdXNlX3JidWYgPSAw OwotCXJlcyA9IDA7Ci0Jcm9vdF9hZ25vID0gWEZTX0lOT19UT19BR05PKG1w LCBtcC0+bV9zYi5zYl9yb290aW5vKTsKLQlyb290X2FnaW5vID0gWEZTX0lO T19UT19BR0lOTyhtcCwgbXAtPm1fc2Iuc2Jfcm9vdGlubyk7Ci0KLQlmb3Ig KGkgPSAwOyBpIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09O VkVSVCk7IGVudHJ5KyssIGkrKykgewotCQluYW1lc3QgPSBYRlNfRElSX0xF QUZfTkFNRVNUUlVDVChsZWFmLAotCQkJSU5UX0dFVChlbnRyeS0+bmFtZWlk eCwgQVJDSF9DT05WRVJUKSk7Ci0JCVhGU19ESVJfU0ZfR0VUX0RJUklOTygm bmFtZXN0LT5pbnVtYmVyLCAmbGlubyk7Ci0JCWJjb3B5KG5hbWVzdC0+bmFt ZSwgZm5hbWUsIGVudHJ5LT5uYW1lbGVuKTsKLQkJZm5hbWVbZW50cnktPm5h bWVsZW5dID0gJ1wwJzsKLQotCQlpZiAoZm5hbWVbMF0gIT0gJy8nICYmICFz dHJjbXAoZm5hbWUsIE9SUEhBTkFHRSkpICB7Ci0JCQlhZ2lubyA9IFhGU19J Tk9fVE9fQUdJTk8obXAsIGxpbm8pOwotCQkJYWdubyA9IFhGU19JTk9fVE9f QUdOTyhtcCwgbGlubyk7Ci0KLQkJCW9sZF9vcnBoYW5hZ2VfaW5vID0gbGlu bzsKLQotCQkJaXJlYyA9IGZpbmRfaW5vZGVfcmVjKGFnbm8sIGFnaW5vKTsK LQotCQkJLyoKLQkJCSAqIGlmIHRoZSBvcnBoYW5nZSBpbm9kZSBpcyBpbiB0 aGUgdHJlZSwKLQkJCSAqIGdldCBpdCwgY2xlYXIgaXQsIGFuZCBtYXJrIGl0 IGZyZWUuCi0JCQkgKiB0aGUgaW5vZGVzIGluIHRoZSBvcnBoYW5hZ2Ugd2ls bCBnZXQKLQkJCSAqIHJlYXR0YWNoZWQgdG8gdGhlIG5ldyBvcnBoYW5hZ2Uu Ci0JCQkgKi8KLQkJCWlmIChpcmVjICE9IE5VTEwpICB7Ci0JCQkJaW5vX29m ZnNldCA9IGFnaW5vIC0gaXJlYy0+aW5vX3N0YXJ0bnVtOwotCi0JCQkJLyoK LQkJCQkgKiBjaGVjayBpZiB3ZSBoYXZlIHRvIHVzZSB0aGUgcm9vdCBpbm9k ZQotCQkJCSAqIGJ1ZmZlciBvciByZWFkIG9uZSBpbiBvdXJzZWx2ZXMuICBO b3RlCi0JCQkJICogdGhhdCB0aGUgcm9vdCBpbm9kZSBpcyBhbHdheXMgdGhl IGZpcnN0Ci0JCQkJICogaW5vZGUgb2YgdGhlIGNodW5rIHRoYXQgaXQncyBp biBzbyB0aGVyZQotCQkJCSAqIGFyZSB0d28gcG9zc2libGUgY2FzZXMgd2hl cmUgbG9zdCtmb3VuZAotCQkJCSAqIG1pZ2h0IGJlIGluIHRoZSBzYW1lIGJ1 ZmZlciBhcyB0aGUgcm9vdAotCQkJCSAqIGlub2RlLiAgT25lIGNhc2UgaXMg YSBsYXJnZSBibG9jawotCQkJCSAqIGZpbGVzeXN0ZW0gd2hlcmUgdGhlIHR3 byBpbm9kZXMgYXJlCi0JCQkJICogaW4gZGlmZmVyZW50IGlub2RlIGNodW5r cyBidXQgd2luZAotCQkJCSAqIHVwIGluIHRoZSBzYW1lIGJsb2NrIChtdWx0 aXBsZSBjaHVua3MKLQkJCQkgKiBwZXIgYmxvY2spIGFuZCB0aGUgc2Vjb25k IGNhc2UgKG9uZSBvcgotCQkJCSAqIG1vcmUgYmxvY2tzIHBlciBjaHVuaykg aXMgd2hlcmUgdGhlIHR3bwotCQkJCSAqIGlub2RlcyBhcmUgaW4gdGhlIHNh bWUgY2h1bmsuIE5vdGUgdGhhdAotCQkJCSAqIGlub2RlcyBhcmUgYWxsb2Nh dGVkIG9uIGRpc2sgaW4gdW5pdHMKLQkJCQkgKiBvZiBNQVgoWEZTX0lOT0RF U19QRVJfQ0hVTkssc2JfaW5vcGJsb2NrKS4KLQkJCQkgKi8KLQkJCQlpZiAo WEZTX0lOT19UT19GU0IobXAsIG1wLT5tX3NiLnNiX3Jvb3Rpbm8pCi0JCQkJ CQk9PSBYRlNfSU5PX1RPX0ZTQihtcCwgbGlubykgfHwKLQkJCQkgICAgKGFn bm8gPT0gcm9vdF9hZ25vICYmCi0JCQkJICAgICBhZ2lubyA8IHJvb3RfYWdp bm8gKyBYRlNfSU5PREVTX1BFUl9DSFVOSykpIHsKLQkJCQkJdXNlX3JidWYg PSAxOwotCQkJCQlicCA9IHJvb3Rpbm9fYnA7Ci0JCQkJCWRpbm8gPSBYRlNf TUFLRV9JUFRSKG1wLCBicCwgYWdpbm8gLQotCQkJCQkJWEZTX0lOT19UT19B R0lOTyhtcCwKLQkJCQkJCQltcC0+bV9zYi5zYl9yb290aW5vKSk7Ci0JCQkJ fSBlbHNlIHsKLQkJCQkJbGVuID0gKGludClYRlNfRlNCX1RPX0JCKG1wLAot CQkJCQkJTUFYKDEsIFhGU19JTk9ERVNfUEVSX0NIVU5LLwotCQkJCQkJCWlu b2Rlc19wZXJfYmxvY2spKTsKLQkJCQkJYnAgPSBsaWJ4ZnNfcmVhZGJ1Ziht cC0+bV9kZXYsCi0JCQkJCQlYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLAot CQkJCQkJCVhGU19BR0lOT19UT19BR0JOTyhtcCwKLQkJCQkJCQkJaXJlYy0+ aW5vX3N0YXJ0bnVtKSksCi0JCQkJCQlsZW4sIDApOwotCQkJCQlpZiAoIWJw KQotCQkJCQkJZG9fZXJyb3IoCi0JCQkJCV8oImNvdWxkbid0IHJlYWQgJXMg aW5vZGUgJWxsdVxuIiksCi0JCQkJCQkJT1JQSEFOQUdFLCBsaW5vKTsKLQot CQkJCQkvKgotCQkJCQkgKiBnZXQgdGhlIGFnYm5vIGNvbnRhaW5pbmcgdGhl IGZpcnN0Ci0JCQkJCSAqIGlub2RlIGluIHRoZSBjaHVuay4gIEluIG11bHRp LWJsb2NrCi0JCQkJCSAqIGNodW5rcywgdGhpcyBnZXRzIHVzIHRoZSBvZmZz ZXQKLQkJCQkJICogcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiBhCi0J CQkJCSAqIHByb3Blcmx5IGFsaWduZWQgYnVmZmVyLiAgSW4KLQkJCQkJICog bXVsdGktY2h1bmsgYmxvY2tzLCB0aGlzIGdldHMgdXMKLQkJCQkJICogdGhl IGNvcnJlY3QgYmxvY2sgbnVtYmVyLiAgVGhlbgotCQkJCQkgKiB0dXJuIHRo ZSBibG9jayBudW1iZXIgYmFjayBpbnRvCi0JCQkJCSAqIGFuIGFnaW5vIGFu ZCBjYWxjdWxhdGUgdGhlIG9mZnNldAotCQkJCQkgKiBmcm9tIHRoZXJlIHRv IGZlZWQgdG8gbWFrZSB0aGUgaXB0ci4KLQkJCQkJICogdGhlIGxhc3QgdGVy bSBpbiBlZmZlY3Qgcm91bmRzIGRvd24KLQkJCQkJICogdG8gdGhlIGZpcnN0 IGFnaW5vIGluIHRoZSBidWZmZXIuCi0JCQkJCSAqLwotCQkJCQlkaW5vID0g WEZTX01BS0VfSVBUUihtcCwgYnAsCi0JCQkJCQlhZ2lubyAtIFhGU19PRkZC Tk9fVE9fQUdJTk8obXAsCi0JCQkJCQkJWEZTX0FHSU5PX1RPX0FHQk5PKG1w LAotCQkJCQkJCWlyZWMtPmlub19zdGFydG51bSksCi0JCQkJCQkJMCkpOwot CQkJCX0KLQotCQkJCWRvX3dhcm4oCi0JCQlfKCIgICAgICAgIC0gY2xlYXJp bmcgZXhpc3RpbmcgXCIlc1wiIGlub2RlXG4iKSwKLQkJCQkJT1JQSEFOQUdF KTsKLQotCQkJCWlub19kaXJ0eSA9IGNsZWFyX2Rpbm9kZShtcCwgZGlubywg bGlubyk7Ci0KLQkJCQlpZiAoIXVzZV9yYnVmKSAgewotCQkJCQlBU1NFUlQo aW5vX2RpcnR5ID09IDAgfHwKLQkJCQkJCShpbm9fZGlydHkgJiYgIW5vX21v ZGlmeSkpOwotCi0JCQkJCWlmIChpbm9fZGlydHkgJiYgIW5vX21vZGlmeSkK LQkJCQkJCWxpYnhmc193cml0ZWJ1ZihicCwgMCk7Ci0JCQkJCWVsc2UKLQkJ CQkJCWxpYnhmc19wdXRidWYoYnApOwotCQkJCX0gZWxzZSAgewotCQkJCQlp ZiAoaW5vX2RpcnR5KQotCQkJCQkJKnJidWZfZGlydHkgPSAxOwotCQkJCX0K LQotCQkJCWlmIChpbm9kZV9pc2FkaXIoaXJlYywgaW5vX29mZnNldCkpCi0J CQkJCWNsZWFyX2lub2RlX2lzYWRpcihpcmVjLCBpbm9fb2Zmc2V0KTsKLQot CQkJCXNldF9pbm9kZV9mcmVlKGlyZWMsIGlub19vZmZzZXQpOwotCQkJfQot Ci0JCQkvKgotCQkJICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBpbm9k ZSBudW0gaXMgZ29vZCBvcgotCQkJICogYmFkLCBtYXJrIHRoZSBlbnRyeSB0 byBiZSBqdW5rZWQgc28gdGhlCi0JCQkgKiBjcmVhdGVuYW1lIGluIHBoYXNl IDYgd2lsbCBzdWNjZWVkLgotCQkJICovCi0JCQluYW1lc3QtPm5hbWVbMF0g PSAnLyc7Ci0JCQkqZGlydHkgPSAxOwotCQkJZG9fd2FybigKLQkJCV8oIiAg ICAgICAgLSBtYXJraW5nIGVudHJ5IFwiJXNcIiB0byBiZSBkZWxldGVkXG4i KSwKLQkJCQlmbmFtZSk7Ci0JCQlyZXMrKzsKLQkJfQotCX0KLQotCXJldHVy bihyZXMpOwotfQotCi1pbnQKLWxvbmdmb3JtX2RlbGV0ZV9vcnBoYW5hZ2Uo eGZzX21vdW50X3QJKm1wLAotCQkJeGZzX2lub190CWlubywKLQkJCXhmc19k aW5vZGVfdAkqZGlubywKLQkJCXhmc19idWZfdAkqcm9vdGlub19icCwKLQkJ CWludAkJKnJidWZfZGlydHkpCi17Ci0JeGZzX2Rpcl9sZWFmYmxvY2tfdAkq bGVhZjsKLQl4ZnNfYnVmX3QJCSpicDsKLQl4ZnNfZGZzYm5vX3QJCWZzYm5v OwotCXhmc19kYWJsa190CQlkYV9ibm87Ci0JaW50CQkJZGlydHk7Ci0JaW50 CQkJcmVzOwotCi0JZGFfYm5vID0gMDsKLQkqcmJ1Zl9kaXJ0eSA9IDA7Ci0K LQlpZiAoKGZzYm5vID0gZ2V0X2ZpcnN0X2RibG9ja19mc2JubyhtcCwgaW5v LCBkaW5vKSkgPT0gTlVMTERGU0JOTykKLQkJZG9fZXJyb3IoCi0JXygiY291 bGRuJ3QgbWFwIGZpcnN0IGxlYWYgYmxvY2sgb2YgZGlyZWN0b3J5IGlub2Rl ICVsbHVcbiIpLCBpbm8pOwotCi0JLyoKLQkgKiBjeWNsZSB0aHJvdWdoIHRo ZSBlbnRpcmUgZGlyZWN0b3J5IGxvb2tpbmcgdG8gZGVsZXRlCi0JICogZXZl cnkgImxvc3QrZm91bmQiIGVudHJ5LiAgbWFrZSBzdXJlIHRvIGNhdGNoIGR1 cGxpY2F0ZQotCSAqIGVudHJpZXMuCi0JICoKLQkgKiBXZSBjb3VsZCBwcm9i YWJseSBzcGVlZCB0aGlzIHVwIGJ5IGRvaW5nIGEgc21hcnRlciBsb29rdXAK LQkgKiB0byBnZXQgdXMgdG8gdGhlIGZpcnN0IGJsb2NrIHRoYXQgY29udGFp bnMgdGhlIGhhc2h2YWx1ZQotCSAqIG9mICJsb3N0K2ZvdW5kIiBidXQgd2hh dCB0aGUgaGVjay4gIHRoYXQgd291bGQgcmVxdWlyZSBhCi0JICogZG91Ymxl IGxvb2t1cCBmb3IgZWFjaCBsZXZlbC4gIGFuZCBob3cgYmlnIGNhbiAnLycg Z2V0Pz8/Ci0JICogSXQncyBwcm9iYWJseSBub3Qgd29ydGggaXQuCi0JICov Ci0JcmVzID0gMDsKLQotCWRvIHsKLQkJaWYgKGZzYm5vID09IE5VTExERlNC Tk8pCi0JCQlicmVhazsKLQkJYnAgPSBsaWJ4ZnNfcmVhZGJ1ZihtcC0+bV9k ZXYsIFhGU19GU0JfVE9fREFERFIobXAsIGZzYm5vKSwKLQkJCQkJWEZTX0ZT Ql9UT19CQihtcCwgMSksIDApOwotCQlpZiAoIWJwKQotCQkJZG9fZXJyb3Io XygiY2FuJ3QgcmVhZCBibG9jayAldSAoZnNibm8gJWxsdSkgZm9yICIKLQkJ CQkgICAiZGlyZWN0b3J5IGlub2RlICVsbHVcbiIpLAotCQkJCWRhX2Jubywg ZnNibm8sIGlubyk7Ci0KLQkJbGVhZiA9ICh4ZnNfZGlyX2xlYWZibG9ja190 ICopWEZTX0JVRl9QVFIoYnApOwotCi0JCWlmIChJTlRfR0VUKGxlYWYtPmhk ci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpICE9Ci0JCSAgICBYRlNfRElS X0xFQUZfTUFHSUMpCi0JCQlkb19lcnJvcihfKCJiYWQgbWFnaWMgIyAoMHgl eCkgZm9yIGRpcmVjdG9yeSAiCi0JCQkJImxlYWYgYmxvY2sgKGJubyAldSBm c2JubyAlbGx1KVxuIiksCi0JCQkJSU5UX0dFVChsZWFmLT5oZHIuaW5mby5t YWdpYywgQVJDSF9DT05WRVJUKSwKLQkJCQlkYV9ibm8sIGZzYm5vKTsKLQot CQlkYV9ibm8gPSBJTlRfR0VUKGxlYWYtPmhkci5pbmZvLmZvcncsIEFSQ0hf Q09OVkVSVCk7Ci0KLQkJcmVzICs9IGxmX2Jsb2NrX2RlbGV0ZV9vcnBoYW5h Z2UobXAsIGlubywgbGVhZiwgJmRpcnR5LAotCQkJCQlyb290aW5vX2JwLCBy YnVmX2RpcnR5KTsKLQotCQlBU1NFUlQoZGlydHkgPT0gMCB8fCAoZGlydHkg JiYgIW5vX21vZGlmeSkpOwotCi0JCWlmIChkaXJ0eSAmJiAhbm9fbW9kaWZ5 KQotCQkJbGlieGZzX3dyaXRlYnVmKGJwLCAwKTsKLQkJZWxzZQotCQkJbGli eGZzX3B1dGJ1ZihicCk7Ci0KLQkJaWYgKGRhX2JubyAhPSAwKQotCQkJZnNi bm8gPSBnZXRfYm1hcGkobXAsIGRpbm8sIGlubywgZGFfYm5vLCBYRlNfREFU QV9GT1JLKTsKLQotCX0gd2hpbGUgKGRhX2JubyAhPSAwKTsKLQotCXJldHVy bihyZXMpOwotfQotCi0vKgotICogcmV0dXJucyAxIGlmIGEgZGVsZXRpb24g aGFwcGVuZWQsIDAgb3RoZXJ3aXNlLgotICovCi0vKiBBUkdTVVNFRCAqLwot aW50Ci1zaG9ydGZvcm1fZGVsZXRlX29ycGhhbmFnZSh4ZnNfbW91bnRfdAkq bXAsCi0JCQl4ZnNfaW5vX3QJaW5vLAotCQkJeGZzX2Rpbm9kZV90CSpyb290 X2Rpbm8sCi0JCQl4ZnNfYnVmX3QJKnJvb3Rpbm9fYnAsCi0JCQlpbnQJCSpp bm9fZGlydHkpCi17Ci0JeGZzX2Rpcl9zaG9ydGZvcm1fdAkqc2Y7Ci0JeGZz X2Rpbm9kZV90CQkqZGlubzsKLQl4ZnNfZGlyX3NmX2VudHJ5X3QJKnNmX2Vu dHJ5LCAqbmV4dF9zZmUsICp0bXBfc2ZlOwotCXhmc19idWZfdAkJKmJwOwot CXhmc19pbm9fdAkJbGlubzsKLQl4ZnNfYWdpbm9fdAkJYWdpbm87Ci0JeGZz X2FnaW5vX3QJCXJvb3RfYWdpbm87Ci0JaW50CQkJbWF4X3NpemU7Ci0JeGZz X2FnbnVtYmVyX3QJCWFnbm87Ci0JeGZzX2FnbnVtYmVyX3QJCXJvb3RfYWdu bzsKLQlpbnQJCQlpbm9fZGlyX3NpemU7Ci0JaW5vX3RyZWVfbm9kZV90CQkq aXJlYzsKLQlpbnQJCQlpbm9fb2Zmc2V0OwotCWludAkJCWk7Ci0JaW50CQkJ ZGlydHk7Ci0JaW50CQkJdG1wX2xlbjsKLQlpbnQJCQl0bXBfZWxlbjsKLQlp bnQJCQlsZW47Ci0JaW50CQkJdXNlX3JidWY7Ci0JY2hhcgkJCWZuYW1lW01B WE5BTUVMRU4gKyAxXTsKLQlpbnQJCQlyZXM7Ci0KLQlzZiA9ICZyb290X2Rp bm8tPmRpX3UuZGlfZGlyc2Y7Ci0JKmlub19kaXJ0eSA9IDA7Ci0JcmVzID0g MDsKLQlpcmVjID0gTlVMTDsKLQlpbm9fZGlyX3NpemUgPSBJTlRfR0VUKHJv b3RfZGluby0+ZGlfY29yZS5kaV9zaXplLCBBUkNIX0NPTlZFUlQpOwotCW1h eF9zaXplID0gWEZTX0RGT1JLX0RTSVpFKHJvb3RfZGlubywgbXApOwotCXVz ZV9yYnVmID0gMDsKLQlyb290X2Fnbm8gPSBYRlNfSU5PX1RPX0FHTk8obXAs IG1wLT5tX3NiLnNiX3Jvb3Rpbm8pOwotCXJvb3RfYWdpbm8gPSBYRlNfSU5P X1RPX0FHSU5PKG1wLCBtcC0+bV9zYi5zYl9yb290aW5vKTsKLQotCS8qCi0J ICogcnVuIHRocm91Z2ggZW50cmllcyBsb29raW5nIGZvciAibG9zdCtmb3Vu ZCIuCi0JICovCi0Jc2ZfZW50cnkgPSBuZXh0X3NmZSA9ICZzZi0+bGlzdFsw XTsKLQlmb3IgKGkgPSAwOyBpIDwgSU5UX0dFVChzZi0+aGRyLmNvdW50LCBB UkNIX0NPTlZFUlQpICYmIGlub19kaXJfc2l6ZSA+Ci0JCQkoX19wc2ludF90 KW5leHRfc2ZlIC0gKF9fcHNpbnRfdClzZjsgaSsrKSAgewotCQl0bXBfc2Zl ID0gTlVMTDsKLQkJc2ZfZW50cnkgPSBuZXh0X3NmZTsKLQkJWEZTX0RJUl9T Rl9HRVRfRElSSU5PKCZzZl9lbnRyeS0+aW51bWJlciwgJmxpbm8pOwotCQli Y29weShzZl9lbnRyeS0+bmFtZSwgZm5hbWUsIHNmX2VudHJ5LT5uYW1lbGVu KTsKLQkJZm5hbWVbc2ZfZW50cnktPm5hbWVsZW5dID0gJ1wwJzsKLQotCQlp ZiAoIXN0cmNtcChPUlBIQU5BR0UsIGZuYW1lKSkgIHsKLQkJCWFnbm8gPSBY RlNfSU5PX1RPX0FHTk8obXAsIGxpbm8pOwotCQkJYWdpbm8gPSBYRlNfSU5P X1RPX0FHSU5PKG1wLCBsaW5vKTsKLQotCQkJaXJlYyA9IGZpbmRfaW5vZGVf cmVjKGFnbm8sIGFnaW5vKTsKLQotCQkJLyoKLQkJCSAqIGlmIHRoZSBvcnBo YW5nZSBpbm9kZSBpcyBpbiB0aGUgdHJlZSwKLQkJCSAqIGdldCBpdCwgY2xl YXIgaXQsIGFuZCBtYXJrIGl0IGZyZWUuCi0JCQkgKiB0aGUgaW5vZGVzIGlu IHRoZSBvcnBoYW5hZ2Ugd2lsbCBnZXQKLQkJCSAqIHJlYXR0YWNoZWQgdG8g dGhlIG5ldyBvcnBoYW5hZ2UuCi0JCQkgKi8KLQkJCWlmIChpcmVjICE9IE5V TEwpIHsKLQkJCQlkb193YXJuKAotCQkJXygiICAgICAgICAtIGNsZWFyaW5n IGV4aXN0aW5nIFwiJXNcIiBpbm9kZVxuIiksCi0JCQkJCU9SUEhBTkFHRSk7 Ci0KLQkJCQlpbm9fb2Zmc2V0ID0gYWdpbm8gLSBpcmVjLT5pbm9fc3RhcnRu dW07Ci0KLQkJCQkvKgotCQkJCSAqIGNoZWNrIGlmIHdlIGhhdmUgdG8gdXNl IHRoZSByb290IGlub2RlCi0JCQkJICogYnVmZmVyIG9yIHJlYWQgb25lIGlu IG91cnNlbHZlcy4gIE5vdGUKLQkJCQkgKiB0aGF0IHRoZSByb290IGlub2Rl IGlzIGFsd2F5cyB0aGUgZmlyc3QKLQkJCQkgKiBpbm9kZSBvZiB0aGUgY2h1 bmsgdGhhdCBpdCdzIGluIHNvIHRoZXJlCi0JCQkJICogYXJlIHR3byBwb3Nz aWJsZSBjYXNlcyB3aGVyZSBsb3N0K2ZvdW5kCi0JCQkJICogbWlnaHQgYmUg aW4gdGhlIHNhbWUgYnVmZmVyIGFzIHRoZSByb290Ci0JCQkJICogaW5vZGUu ICBPbmUgY2FzZSBpcyBhIGxhcmdlIGJsb2NrCi0JCQkJICogZmlsZXN5c3Rl bSB3aGVyZSB0aGUgdHdvIGlub2RlcyBhcmUKLQkJCQkgKiBpbiBkaWZmZXJl bnQgaW5vZGUgY2h1bmtzIGJ1dCB3aW5kCi0JCQkJICogdXAgaW4gdGhlIHNh bWUgYmxvY2sgKG11bHRpcGxlIGNodW5rcwotCQkJCSAqIHBlciBibG9jaykg YW5kIHRoZSBzZWNvbmQgY2FzZSAob25lIG9yCi0JCQkJICogbW9yZSBibG9j a3MgcGVyIGNodW5rKSBpcyB3aGVyZSB0aGUgdHdvCi0JCQkJICogaW5vZGVz IGFyZSBpbiB0aGUgc2FtZSBjaHVuay4gTm90ZSB0aGF0Ci0JCQkJICogaW5v ZGVzIGFyZSBhbGxvY2F0ZWQgb24gZGlzayBpbiB1bml0cwotCQkJCSAqIG9m IE1BWChYRlNfSU5PREVTX1BFUl9DSFVOSyxzYl9pbm9wYmxvY2spLgotCQkJ CSAqLwotCQkJCWlmIChYRlNfSU5PX1RPX0ZTQihtcCwgbXAtPm1fc2Iuc2Jf cm9vdGlubykKLQkJCQkJCT09IFhGU19JTk9fVE9fRlNCKG1wLCBsaW5vKSB8 fAotCQkJCSAgICAoYWdubyA9PSByb290X2Fnbm8gJiYKLQkJCQkgICAgIGFn aW5vIDwgcm9vdF9hZ2lubyArIFhGU19JTk9ERVNfUEVSX0NIVU5LKSkgewot CQkJCQl1c2VfcmJ1ZiA9IDE7Ci0JCQkJCWJwID0gcm9vdGlub19icDsKLQot CQkJCQlkaW5vID0gWEZTX01BS0VfSVBUUihtcCwgYnAsIGFnaW5vIC0KLQkJ CQkJCVhGU19JTk9fVE9fQUdJTk8obXAsCi0JCQkJCQkJbXAtPm1fc2Iuc2Jf cm9vdGlubykpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxlbiA9IChpbnQpWEZT X0ZTQl9UT19CQihtcCwKLQkJCQkJCU1BWCgxLCBYRlNfSU5PREVTX1BFUl9D SFVOSy8KLQkJCQkJCQlpbm9kZXNfcGVyX2Jsb2NrKSk7Ci0JCQkJCWJwID0g bGlieGZzX3JlYWRidWYobXAtPm1fZGV2LAotCQkJCQkJWEZTX0FHQl9UT19E QUREUihtcCwgYWdubywKLQkJCQkJCQlYRlNfQUdJTk9fVE9fQUdCTk8obXAs Ci0JCQkJCQkJCWlyZWMtPmlub19zdGFydG51bSkpLAotCQkJCQkJbGVuLCAw KTsKLQkJCQkJaWYgKCFicCkKLQkJCQkJCWRvX2Vycm9yKAotCQkJCQlfKCJj b3VsZCBub3QgcmVhZCAlcyBpbm9kZSAlbGx1XG4iKSwKLQkJCQkJCQlPUlBI QU5BR0UsIGxpbm8pOwotCi0JCQkJCS8qCi0JCQkJCSAqIGdldCB0aGUgYWdi bm8gY29udGFpbmluZyB0aGUgZmlyc3QKLQkJCQkJICogaW5vZGUgaW4gdGhl IGNodW5rLiAgSW4gbXVsdGktYmxvY2sKLQkJCQkJICogY2h1bmtzLCB0aGlz IGdldHMgdXMgdGhlIG9mZnNldAotCQkJCQkgKiByZWxhdGl2ZSB0byB0aGUg YmVnaW5uaW5nIG9mIGEKLQkJCQkJICogcHJvcGVybHkgYWxpZ25lZCBidWZm ZXIuICBJbgotCQkJCQkgKiBtdWx0aS1jaHVuayBibG9ja3MsIHRoaXMgZ2V0 cyB1cwotCQkJCQkgKiB0aGUgY29ycmVjdCBibG9jayBudW1iZXIuICBUaGVu Ci0JCQkJCSAqIHR1cm4gdGhlIGJsb2NrIG51bWJlciBiYWNrIGludG8KLQkJ CQkJICogYW4gYWdpbm8gYW5kIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0Ci0JCQkJ CSAqIGZyb20gdGhlcmUgdG8gZmVlZCB0byBtYWtlIHRoZSBpcHRyLgotCQkJ CQkgKiB0aGUgbGFzdCB0ZXJtIGluIGVmZmVjdCByb3VuZHMgZG93bgotCQkJ CQkgKiB0byB0aGUgZmlyc3QgYWdpbm8gaW4gdGhlIGJ1ZmZlci4KLQkJCQkJ ICovCi0JCQkJCWRpbm8gPSBYRlNfTUFLRV9JUFRSKG1wLCBicCwKLQkJCQkJ CWFnaW5vIC0gWEZTX09GRkJOT19UT19BR0lOTyhtcCwKLQkJCQkJCQlYRlNf QUdJTk9fVE9fQUdCTk8obXAsCi0JCQkJCQkJaXJlYy0+aW5vX3N0YXJ0bnVt KSwKLQkJCQkJCQkwKSk7Ci0JCQkJfQotCi0JCQkJZGlydHkgPSBjbGVhcl9k aW5vZGUobXAsIGRpbm8sIGxpbm8pOwotCi0JCQkJQVNTRVJUKGRpcnR5ID09 IDAgfHwgKGRpcnR5ICYmICFub19tb2RpZnkpKTsKLQotCQkJCS8qCi0JCQkJ ICogaWYgd2UgcmVhZCB0aGUgbG9zdCtmb3VuZCBpbm9kZSBpbiB0bwotCQkJ CSAqIGl0LCBnZXQgcmlkIG9mIGl0IGhlcmUuICBpZiB0aGUgbG9zdCtmb3Vu ZAotCQkJCSAqIGlub2RlIGlzIGluIHRoZSByb290IGlub2RlIGJ1ZmZlciwg dGhlCi0JCQkJICogYnVmZmVyIHdpbGwgYmUgbWFya2VkIGRpcnR5IGFueXdh eSBzaW5jZQotCQkJCSAqIHRoZSBsb3N0K2ZvdW5kIGVudHJ5IGluIHRoZSBy b290IGlub2RlIGlzCi0JCQkJICogYWxzbyBiZWluZyBkZWxldGVkIHdoaWNo IG1ha2VzIHRoZSByb290Ci0JCQkJICogaW5vZGUgYnVmZmVyIGF1dG9tYXRp Y2FsbHkgZGlydHkuCi0JCQkJICovCi0JCQkJaWYgKCF1c2VfcmJ1ZikgIHsK LQkJCQkJZGlubyA9IE5VTEw7Ci0JCQkJCWlmIChkaXJ0eSAmJiAhbm9fbW9k aWZ5KQotCQkJCQkJbGlieGZzX3dyaXRlYnVmKGJwLCAwKTsKLQkJCQkJZWxz ZQotCQkJCQkJbGlieGZzX3B1dGJ1ZihicCk7Ci0JCQkJfQotCi0JCQkJaWYg KGlub2RlX2lzYWRpcihpcmVjLCBpbm9fb2Zmc2V0KSkKLQkJCQkJY2xlYXJf aW5vZGVfaXNhZGlyKGlyZWMsIGlub19vZmZzZXQpOwotCi0JCQkJc2V0X2lu b2RlX2ZyZWUoaXJlYywgaW5vX29mZnNldCk7Ci0JCQl9Ci0KLQkJCWRvX3dh cm4oXygiICAgICAgICAtIGRlbGV0aW5nIGV4aXN0aW5nIFwiJXNcIiBlbnRy eVxuIiksCi0JCQkJT1JQSEFOQUdFKTsKLQotCQkJLyoKLQkJCSAqIG5vdGUg LS0gZXhhY3RseSB0aGUgc2FtZSBkZWxldGlvbiBjb2RlIGFzIGluCi0JCQkg KiBwcm9jZXNzX3Nob3J0Zm9ybV9kaXIoKQotCQkJICovCi0JCQl0bXBfZWxl biA9IFhGU19ESVJfU0ZfRU5UU0laRV9CWUVOVFJZKHNmX2VudHJ5KTsKLQkJ CUlOVF9NT0Qocm9vdF9kaW5vLT5kaV9jb3JlLmRpX3NpemUsIEFSQ0hfQ09O VkVSVCwKLQkJCQktKHRtcF9lbGVuKSk7Ci0KLQkJCXRtcF9zZmUgPSAoeGZz X2Rpcl9zZl9lbnRyeV90ICopCi0JCQkJKChfX3BzaW50X3QpIHNmX2VudHJ5 ICsgdG1wX2VsZW4pOwotCQkJdG1wX2xlbiA9IG1heF9zaXplIC0gKChfX3Bz aW50X3QpIHRtcF9zZmUKLQkJCQkJLSAoX19wc2ludF90KSBzZik7Ci0KLQkJ CW1lbW1vdmUoc2ZfZW50cnksIHRtcF9zZmUsIHRtcF9sZW4pOwotCi0JCQlJ TlRfTU9EKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgLTEpOwotCi0J CQliemVybygodm9pZCAqKSAoKF9fcHNpbnRfdCkgc2ZfZW50cnkgKyB0bXBf bGVuKSwKLQkJCQl0bXBfZWxlbik7Ci0KLQkJCS8qCi0JCQkgKiBzZXQgdGhl IHRtcCB2YWx1ZSB0byB0aGUgY3VycmVudAotCQkJICogcG9pbnRlciBzbyB3 ZSdsbCBwcm9jZXNzIHRoZSBlbnRyeQotCQkJICogd2UganVzdCBtb3ZlZCB1 cAotCQkJICovCi0JCQl0bXBfc2ZlID0gc2ZfZW50cnk7Ci0KLQkJCS8qCi0J CQkgKiBXQVJOSU5HOiAgZHJvcCB0aGUgaW5kZXggaSBieSBvbmUKLQkJCSAq IHNvIGl0IG1hdGNoZXMgdGhlIGRlY3JlbWVudGVkIGNvdW50IGZvcgotCQkJ ICogYWNjdXJhdGUgY29tcGFyaXNvbnMgaW4gdGhlIGxvb3AgdGVzdC4KLQkJ CSAqIG1hcmsgcm9vdCBpbm9kZSBhcyBkaXJ0eSB0byBtYWtlIGRlbGV0aW9u Ci0JCQkgKiBwZXJtYW5lbnQuCi0JCQkgKi8KLQkJCWktLTsKLQotCQkJKmlu b19kaXJ0eSA9IDE7Ci0JCQlyZXMrKzsKLQotCQl9Ci0JCW5leHRfc2ZlID0g KHRtcF9zZmUgPT0gTlVMTCkKLQkJCT8gKHhmc19kaXJfc2ZfZW50cnlfdCAq KSAoKF9fcHNpbnRfdCkgc2ZfZW50cnkgKwotCQkJCVhGU19ESVJfU0ZfRU5U U0laRV9CWUVOVFJZKHNmX2VudHJ5KSkKLQkJCTogdG1wX3NmZTsKLQl9Ci0K LQlyZXR1cm4ocmVzKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWludAotbGYy X2Jsb2NrX2RlbGV0ZV9vcnBoYW5hZ2UoeGZzX21vdW50X3QJCSptcCwKLQkJ CXhmc19pbm9fdAkJaW5vLAotCQkJeGZzX2RpcjJfZGF0YV90CQkqZGF0YSwK LQkJCWludAkJCSpkaXJ0eSwKLQkJCXhmc19idWZfdAkJKnJvb3Rpbm9fYnAs Ci0JCQlpbnQJCQkqcmJ1Zl9kaXJ0eSkKLXsKLQl4ZnNfZGlub2RlX3QJCSpk aW5vOwotCXhmc19idWZfdAkJKmJwOwotCWlub190cmVlX25vZGVfdAkJKmly ZWM7Ci0JeGZzX2lub190CQlsaW5vOwotCXhmc19hZ2lub190CQlhZ2lubzsK LQl4ZnNfYWdudW1iZXJfdAkJYWdubzsKLQl4ZnNfYWdpbm9fdAkJcm9vdF9h Z2lubzsKLQl4ZnNfYWdudW1iZXJfdAkJcm9vdF9hZ25vOwotCWludAkJCWlu b19vZmZzZXQ7Ci0JaW50CQkJaW5vX2RpcnR5OwotCWludAkJCXVzZV9yYnVm OwotCWludAkJCWxlbjsKLQljaGFyCQkJZm5hbWVbTUFYTkFNRUxFTiArIDFd OwotCWludAkJCXJlczsKLQljaGFyCQkJKnB0cjsKLQljaGFyCQkJKmVuZHB0 cjsKLQl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsKLQl4ZnNfZGlyMl9k YXRhX2VudHJ5X3QJKmRlcDsKLQl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpk dXA7Ci0KLQlwdHIgPSAoY2hhciAqKWRhdGEtPnU7Ci0JaWYgKElOVF9HRVQo ZGF0YS0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0JM T0NLX01BR0lDKSB7Ci0JCWJ0cCA9IFhGU19ESVIyX0JMT0NLX1RBSUxfUCht cCwgKHhmc19kaXIyX2Jsb2NrX3QgKilkYXRhKTsKLQkJZW5kcHRyID0gKGNo YXIgKilYRlNfRElSMl9CTE9DS19MRUFGX1AoYnRwKTsKLQl9IGVsc2UKLQkJ ZW5kcHRyID0gKGNoYXIgKilkYXRhICsgbXAtPm1fZGlyYmxrc2l6ZTsKLQkq ZGlydHkgPSAwOwotCXVzZV9yYnVmID0gMDsKLQlyZXMgPSAwOwotCXJvb3Rf YWdubyA9IFhGU19JTk9fVE9fQUdOTyhtcCwgbXAtPm1fc2Iuc2Jfcm9vdGlu byk7Ci0Jcm9vdF9hZ2lubyA9IFhGU19JTk9fVE9fQUdJTk8obXAsIG1wLT5t X3NiLnNiX3Jvb3Rpbm8pOwotCi0Jd2hpbGUgKHB0ciA8IGVuZHB0cikgewot CQlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKXB0cjsKLQkJaWYg KElOVF9HRVQoZHVwLT5mcmVldGFnLCBBUkNIX0NPTlZFUlQpID09Ci0JCSAg ICBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKSB7Ci0JCQlpZiAocHRyICsgSU5U X0dFVChkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSA+IGVuZHB0ciB8fAot CQkJCUlOVF9HRVQoZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPT0gMCB8 fAotCQkJCShJTlRfR0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpICYK LQkJCQkJCShYRlNfRElSMl9EQVRBX0FMSUdOIC0gMSkpKQotCQkJCWJyZWFr OwotCQkJcHRyICs9IElOVF9HRVQoZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVS VCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlkZXAgPSAoeGZzX2RpcjJfZGF0 YV9lbnRyeV90ICopcHRyOwotCQlsaW5vID0gSU5UX0dFVChkZXAtPmludW1i ZXIsIEFSQ0hfQ09OVkVSVCk7Ci0JCWJjb3B5KGRlcC0+bmFtZSwgZm5hbWUs IGRlcC0+bmFtZWxlbik7Ci0JCWZuYW1lW2RlcC0+bmFtZWxlbl0gPSAnXDAn OwotCi0JCWlmIChmbmFtZVswXSAhPSAnLycgJiYgIXN0cmNtcChmbmFtZSwg T1JQSEFOQUdFKSkgIHsKLQkJCWFnaW5vID0gWEZTX0lOT19UT19BR0lOTyht cCwgbGlubyk7Ci0JCQlhZ25vID0gWEZTX0lOT19UT19BR05PKG1wLCBsaW5v KTsKLQotCQkJb2xkX29ycGhhbmFnZV9pbm8gPSBsaW5vOwotCi0JCQlpcmVj ID0gZmluZF9pbm9kZV9yZWMoYWdubywgYWdpbm8pOwotCi0JCQkvKgotCQkJ ICogaWYgdGhlIG9ycGhhbmdlIGlub2RlIGlzIGluIHRoZSB0cmVlLAotCQkJ ICogZ2V0IGl0LCBjbGVhciBpdCwgYW5kIG1hcmsgaXQgZnJlZS4KLQkJCSAq IHRoZSBpbm9kZXMgaW4gdGhlIG9ycGhhbmFnZSB3aWxsIGdldAotCQkJICog cmVhdHRhY2hlZCB0byB0aGUgbmV3IG9ycGhhbmFnZS4KLQkJCSAqLwotCQkJ aWYgKGlyZWMgIT0gTlVMTCkgIHsKLQkJCQlpbm9fb2Zmc2V0ID0gYWdpbm8g LSBpcmVjLT5pbm9fc3RhcnRudW07Ci0KLQkJCQkvKgotCQkJCSAqIGNoZWNr IGlmIHdlIGhhdmUgdG8gdXNlIHRoZSByb290IGlub2RlCi0JCQkJICogYnVm ZmVyIG9yIHJlYWQgb25lIGluIG91cnNlbHZlcy4gIE5vdGUKLQkJCQkgKiB0 aGF0IHRoZSByb290IGlub2RlIGlzIGFsd2F5cyB0aGUgZmlyc3QKLQkJCQkg KiBpbm9kZSBvZiB0aGUgY2h1bmsgdGhhdCBpdCdzIGluIHNvIHRoZXJlCi0J CQkJICogYXJlIHR3byBwb3NzaWJsZSBjYXNlcyB3aGVyZSBsb3N0K2ZvdW5k Ci0JCQkJICogbWlnaHQgYmUgaW4gdGhlIHNhbWUgYnVmZmVyIGFzIHRoZSBy b290Ci0JCQkJICogaW5vZGUuICBPbmUgY2FzZSBpcyBhIGxhcmdlIGJsb2Nr Ci0JCQkJICogZmlsZXN5c3RlbSB3aGVyZSB0aGUgdHdvIGlub2RlcyBhcmUK LQkJCQkgKiBpbiBkaWZmZXJlbnQgaW5vZGUgY2h1bmtzIGJ1dCB3aW5kCi0J CQkJICogdXAgaW4gdGhlIHNhbWUgYmxvY2sgKG11bHRpcGxlIGNodW5rcwot CQkJCSAqIHBlciBibG9jaykgYW5kIHRoZSBzZWNvbmQgY2FzZSAob25lIG9y Ci0JCQkJICogbW9yZSBibG9ja3MgcGVyIGNodW5rKSBpcyB3aGVyZSB0aGUg dHdvCi0JCQkJICogaW5vZGVzIGFyZSBpbiB0aGUgc2FtZSBjaHVuay4gTm90 ZSB0aGF0Ci0JCQkJICogaW5vZGVzIGFyZSBhbGxvY2F0ZWQgb24gZGlzayBp biB1bml0cwotCQkJCSAqIG9mIE1BWChYRlNfSU5PREVTX1BFUl9DSFVOSyxz Yl9pbm9wYmxvY2spLgotCQkJCSAqLwotCQkJCWlmIChYRlNfSU5PX1RPX0ZT QihtcCwgbXAtPm1fc2Iuc2Jfcm9vdGlubykKLQkJCQkJCT09IFhGU19JTk9f VE9fRlNCKG1wLCBsaW5vKSB8fAotCQkJCSAgICAoYWdubyA9PSByb290X2Fn bm8gJiYKLQkJCQkgICAgIGFnaW5vIDwgcm9vdF9hZ2lubyArIFhGU19JTk9E RVNfUEVSX0NIVU5LKSkgewotCQkJCQl1c2VfcmJ1ZiA9IDE7Ci0JCQkJCWJw ID0gcm9vdGlub19icDsKLQkJCQkJZGlubyA9IFhGU19NQUtFX0lQVFIobXAs IGJwLCBhZ2lubyAtCi0JCQkJCQlYRlNfSU5PX1RPX0FHSU5PKG1wLAotCQkJ CQkJCW1wLT5tX3NiLnNiX3Jvb3Rpbm8pKTsKLQkJCQl9IGVsc2UgIHsKLQkJ CQkJbGVuID0gKGludClYRlNfRlNCX1RPX0JCKG1wLAotCQkJCQkJTUFYKDEs IFhGU19JTk9ERVNfUEVSX0NIVU5LLwotCQkJCQkJCWlub2Rlc19wZXJfYmxv Y2spKTsKLQkJCQkJYnAgPSBsaWJ4ZnNfcmVhZGJ1ZihtcC0+bV9kZXYsCi0J CQkJCQlYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLAotCQkJCQkJCVhGU19B R0lOT19UT19BR0JOTyhtcCwKLQkJCQkJCQkJaXJlYy0+aW5vX3N0YXJ0bnVt KSksCi0JCQkJCQlsZW4sIDApOwotCQkJCQlpZiAoIWJwKQotCQkJCQkJZG9f ZXJyb3IoCi0JCQkJCV8oImNvdWxkbid0IHJlYWQgJXMgaW5vZGUgJWxsdVxu IiksCi0JCQkJCQkJT1JQSEFOQUdFLCBsaW5vKTsKLQotCQkJCQkvKgotCQkJ CQkgKiBnZXQgdGhlIGFnYm5vIGNvbnRhaW5pbmcgdGhlIGZpcnN0Ci0JCQkJ CSAqIGlub2RlIGluIHRoZSBjaHVuay4gIEluIG11bHRpLWJsb2NrCi0JCQkJ CSAqIGNodW5rcywgdGhpcyBnZXRzIHVzIHRoZSBvZmZzZXQKLQkJCQkJICog cmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiBhCi0JCQkJCSAqIHByb3Bl cmx5IGFsaWduZWQgYnVmZmVyLiAgSW4KLQkJCQkJICogbXVsdGktY2h1bmsg YmxvY2tzLCB0aGlzIGdldHMgdXMKLQkJCQkJICogdGhlIGNvcnJlY3QgYmxv Y2sgbnVtYmVyLiAgVGhlbgotCQkJCQkgKiB0dXJuIHRoZSBibG9jayBudW1i ZXIgYmFjayBpbnRvCi0JCQkJCSAqIGFuIGFnaW5vIGFuZCBjYWxjdWxhdGUg dGhlIG9mZnNldAotCQkJCQkgKiBmcm9tIHRoZXJlIHRvIGZlZWQgdG8gbWFr ZSB0aGUgaXB0ci4KLQkJCQkJICogdGhlIGxhc3QgdGVybSBpbiBlZmZlY3Qg cm91bmRzIGRvd24KLQkJCQkJICogdG8gdGhlIGZpcnN0IGFnaW5vIGluIHRo ZSBidWZmZXIuCi0JCQkJCSAqLwotCQkJCQlkaW5vID0gWEZTX01BS0VfSVBU UihtcCwgYnAsCi0JCQkJCQlhZ2lubyAtIFhGU19PRkZCTk9fVE9fQUdJTk8o bXAsCi0JCQkJCQkJWEZTX0FHSU5PX1RPX0FHQk5PKG1wLAotCQkJCQkJCWly ZWMtPmlub19zdGFydG51bSksCi0JCQkJCQkJMCkpOwotCQkJCX0KLQotCQkJ CWRvX3dhcm4oCi0JCQkJXygiICAgICAgICAtIGNsZWFyaW5nIGV4aXN0aW5n IFwiJXNcIiBpbm9kZVxuIiksCi0JCQkJCU9SUEhBTkFHRSk7Ci0KLQkJCQlp bm9fZGlydHkgPSBjbGVhcl9kaW5vZGUobXAsIGRpbm8sIGxpbm8pOwotCi0J CQkJaWYgKCF1c2VfcmJ1ZikgewotCQkJCQlBU1NFUlQoaW5vX2RpcnR5ID09 IDAgfHwKLQkJCQkJCShpbm9fZGlydHkgJiYgIW5vX21vZGlmeSkpOwotCi0J CQkJCWlmIChpbm9fZGlydHkgJiYgIW5vX21vZGlmeSkKLQkJCQkJCWxpYnhm c193cml0ZWJ1ZihicCwgMCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWxpYnhmc19w dXRidWYoYnApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChpbm9fZGlydHkp Ci0JCQkJCQkqcmJ1Zl9kaXJ0eSA9IDE7Ci0JCQkJfQotCi0JCQkJaWYgKGlu b2RlX2lzYWRpcihpcmVjLCBpbm9fb2Zmc2V0KSkKLQkJCQkJY2xlYXJfaW5v ZGVfaXNhZGlyKGlyZWMsIGlub19vZmZzZXQpOwotCi0JCQkJc2V0X2lub2Rl X2ZyZWUoaXJlYywgaW5vX29mZnNldCk7Ci0KLQkJCX0KLQotCQkJLyoKLQkJ CSAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgaW5vZGUgbnVtIGlzIGdv b2Qgb3IKLQkJCSAqIGJhZCwgbWFyayB0aGUgZW50cnkgdG8gYmUganVua2Vk IHNvIHRoZQotCQkJICogY3JlYXRlbmFtZSBpbiBwaGFzZSA2IHdpbGwgc3Vj Y2VlZC4KLQkJCSAqLwotCQkJZGVwLT5uYW1lWzBdID0gJy8nOwotCQkJKmRp cnR5ID0gMTsKLQkJCWRvX3dhcm4oCi0JCQlfKCIgICAgICAgIC0gbWFya2lu ZyBlbnRyeSBcIiVzXCIgdG8gYmUgZGVsZXRlZFxuIiksCi0JCQkJZm5hbWUp OwotCQkJcmVzKys7Ci0JCX0KLQkJcHRyICs9IFhGU19ESVIyX0RBVEFfRU5U U0laRShkZXAtPm5hbWVsZW4pOwotCX0KLQotCXJldHVybihyZXMpOwotfQot Ci1pbnQKLWxvbmdmb3JtMl9kZWxldGVfb3JwaGFuYWdlKHhmc19tb3VudF90 CSptcCwKLQkJCXhmc19pbm9fdAlpbm8sCi0JCQl4ZnNfZGlub2RlX3QJKmRp bm8sCi0JCQl4ZnNfYnVmX3QJKnJvb3Rpbm9fYnAsCi0JCQlpbnQJCSpyYnVm X2RpcnR5KQotewotCXhmc19kaXIyX2RhdGFfdAkJKmRhdGE7Ci0JeGZzX2Rh YnVmX3QJCSpicDsKLQl4ZnNfZGZzYm5vX3QJCWZzYm5vOwotCXhmc19kYWJs a190CQlkYV9ibm87Ci0JaW50CQkJZGlydHk7Ci0JaW50CQkJcmVzOwotCWJt YXBfZXh0X3QJCSpibXA7Ci0JaW50CQkJaTsKLQotCWRhX2JubyA9IDA7Ci0J KnJidWZfZGlydHkgPSAwOwotCWZzYm5vID0gTlVMTERGU0JOTzsKLQlibXAg PSBtYWxsb2MobXAtPm1fZGlyYmxrZnNicyAqIHNpemVvZigqYm1wKSk7Ci0J aWYgKCFibXApCi0JCWRvX2Vycm9yKAotCV8oIm1hbGxvYyBmYWlsZWQgKCV1 IGJ5dGVzKSBpbiBsb25nZm9ybTJfZGVsZXRlX29ycGhhbmFnZSwgaW5vICVs bHVcbiIpLAotCQkJbXAtPm1fZGlyYmxrZnNicyAqIHNpemVvZigqYm1wKSwg aW5vKTsKLQotCS8qCi0JICogY3ljbGUgdGhyb3VnaCB0aGUgZW50aXJlIGRp cmVjdG9yeSBsb29raW5nIHRvIGRlbGV0ZQotCSAqIGV2ZXJ5ICJsb3N0K2Zv dW5kIiBlbnRyeS4gIG1ha2Ugc3VyZSB0byBjYXRjaCBkdXBsaWNhdGUKLQkg KiBlbnRyaWVzLgotCSAqCi0JICogV2UgY291bGQgcHJvYmFibHkgc3BlZWQg dGhpcyB1cCBieSBkb2luZyBhIHNtYXJ0ZXIgbG9va3VwCi0JICogdG8gZ2V0 IHVzIHRvIHRoZSBmaXJzdCBibG9jayB0aGF0IGNvbnRhaW5zIHRoZSBoYXNo dmFsdWUKLQkgKiBvZiAibG9zdCtmb3VuZCIgYnV0IHdoYXQgdGhlIGhlY2su ICB0aGF0IHdvdWxkIHJlcXVpcmUgYQotCSAqIGRvdWJsZSBsb29rdXAgZm9y IGVhY2ggbGV2ZWwuICBhbmQgaG93IGJpZyBjYW4gJy8nIGdldD8/PwotCSAq IEl0J3MgcHJvYmFibHkgbm90IHdvcnRoIGl0LgotCSAqLwotCXJlcyA9IDA7 Ci0KLQlmb3IgKGRhX2JubyA9IDA7Ci0JICAgICBkYV9ibm8gPCBYRlNfQl9U T19GU0IobXAsIElOVF9HRVQoZGluby0+ZGlfY29yZS5kaV9zaXplLCBBUkNI X0NPTlZFUlQpKTsKLQkgICAgIGRhX2JubyArPSBtcC0+bV9kaXJibGtmc2Jz KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBtcC0+bV9kaXJibGtmc2JzOyBpKysp IHsKLQkJCWZzYm5vID0gZ2V0X2JtYXBpKG1wLCBkaW5vLCBpbm8sIGRhX2Ju byArIGksCi0JCQkJCSAgWEZTX0RBVEFfRk9SSyk7Ci0JCQlpZiAoZnNibm8g PT0gTlVMTERGU0JOTykKLQkJCQlicmVhazsKLQkJCWJtcFtpXS5zdGFydG9m ZiA9IGRhX2JubyArIGk7Ci0JCQlibXBbaV0uc3RhcnRibG9jayA9IGZzYm5v OwotCQkJYm1wW2ldLmJsb2NrY291bnQgPSAxOwotCQkJYm1wW2ldLmZsYWcg PSAwOwotCQl9Ci0JCWlmIChmc2JubyA9PSBOVUxMREZTQk5PKQotCQkJY29u dGludWU7Ci0JCWJwID0gZGFfcmVhZF9idWYobXAsIG1wLT5tX2RpcmJsa2Zz YnMsIGJtcCk7Ci0JCWlmIChicCA9PSBOVUxMKQotCQkJZG9fZXJyb3IoCi0J XygiY2FuJ3QgcmVhZCBibG9jayAldSAoZnNibm8gJWxsdSkgZm9yIGRpcmVj dG9yeSBpbm9kZSAlbGx1XG4iKSwKLQkJCQlkYV9ibm8sIGJtcFswXS5zdGFy dGJsb2NrLCBpbm8pOwotCi0JCWRhdGEgPSAoeGZzX2RpcjJfZGF0YV90ICop YnAtPmRhdGE7Ci0KLQkJaWYgKElOVF9HRVQoZGF0YS0+aGRyLm1hZ2ljLCBB UkNIX0NPTlZFUlQpICE9Ci0JCQkJCVhGU19ESVIyX0RBVEFfTUFHSUMgJiYK LQkJICAgIElOVF9HRVQoZGF0YS0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQp ICE9Ci0JCQkJCVhGU19ESVIyX0JMT0NLX01BR0lDKQotCQkJZG9fZXJyb3Io Ci0JXygiYmFkIG1hZ2ljICMgKDB4JXgpIGZvciBkaXJlY3RvcnkgZGF0YSBi bG9jayAoYm5vICV1IGZzYm5vICVsbHUpXG4iKSwKLQkJCQlJTlRfR0VUKGRh dGEtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSwKLQkJCQlkYV9ibm8sIGJt cFswXS5zdGFydGJsb2NrKTsKLQotCQlyZXMgKz0gbGYyX2Jsb2NrX2RlbGV0 ZV9vcnBoYW5hZ2UobXAsIGlubywgZGF0YSwgJmRpcnR5LAotCQkJCQlyb290 aW5vX2JwLCByYnVmX2RpcnR5KTsKLQotCQlBU1NFUlQoZGlydHkgPT0gMCB8 fCAoZGlydHkgJiYgIW5vX21vZGlmeSkpOwotCi0JCWlmIChkaXJ0eSAmJiAh bm9fbW9kaWZ5KQotCQkJZGFfYndyaXRlKG1wLCBicCk7Ci0JCWVsc2UKLQkJ CWRhX2JyZWxzZShicCk7Ci0JfQotCWZyZWUoYm1wKTsKLQotCXJldHVybihy ZXMpOwotfQotCi0vKgotICogcmV0dXJucyAxIGlmIGEgZGVsZXRpb24gaGFw cGVuZWQsIDAgb3RoZXJ3aXNlLgotICovCi0vKiBBUkdTVVNFRCAqLwotaW50 Ci1zaG9ydGZvcm0yX2RlbGV0ZV9vcnBoYW5hZ2UoeGZzX21vdW50X3QJKm1w LAotCQkJeGZzX2lub190CWlubywKLQkJCXhmc19kaW5vZGVfdAkqcm9vdF9k aW5vLAotCQkJeGZzX2J1Zl90CSpyb290aW5vX2JwLAotCQkJaW50CQkqaW5v X2RpcnR5KQotewotCXhmc19kaXIyX3NmX3QJCSpzZjsKLQl4ZnNfZGlub2Rl X3QJCSpkaW5vOwotCXhmc19kaXIyX3NmX2VudHJ5X3QJKnNmX2VudHJ5LCAq bmV4dF9zZmUsICp0bXBfc2ZlOwotCXhmc19idWZfdAkJKmJwOwotCXhmc19p bm9fdAkJbGlubzsKLQl4ZnNfYWdpbm9fdAkJYWdpbm87Ci0JeGZzX2FnaW5v X3QJCXJvb3RfYWdpbm87Ci0JaW50CQkJbWF4X3NpemU7Ci0JeGZzX2FnbnVt YmVyX3QJCWFnbm87Ci0JeGZzX2FnbnVtYmVyX3QJCXJvb3RfYWdubzsKLQlp bnQJCQlpbm9fZGlyX3NpemU7Ci0JaW5vX3RyZWVfbm9kZV90CQkqaXJlYzsK LQlpbnQJCQlpbm9fb2Zmc2V0OwotCWludAkJCWk7Ci0JaW50CQkJZGlydHk7 Ci0JaW50CQkJdG1wX2xlbjsKLQlpbnQJCQl0bXBfZWxlbjsKLQlpbnQJCQls ZW47Ci0JaW50CQkJdXNlX3JidWY7Ci0JY2hhcgkJCWZuYW1lW01BWE5BTUVM RU4gKyAxXTsKLQlpbnQJCQlyZXM7Ci0KLQlzZiA9ICZyb290X2Rpbm8tPmRp X3UuZGlfZGlyMnNmOwotCSppbm9fZGlydHkgPSAwOwotCWlyZWMgPSBOVUxM OwotCWlub19kaXJfc2l6ZSA9IElOVF9HRVQocm9vdF9kaW5vLT5kaV9jb3Jl LmRpX3NpemUsIEFSQ0hfQ09OVkVSVCk7Ci0JbWF4X3NpemUgPSBYRlNfREZP UktfRFNJWkUocm9vdF9kaW5vLCBtcCk7Ci0JdXNlX3JidWYgPSAwOwotCXJl cyA9IDA7Ci0Jcm9vdF9hZ25vID0gWEZTX0lOT19UT19BR05PKG1wLCBtcC0+ bV9zYi5zYl9yb290aW5vKTsKLQlyb290X2FnaW5vID0gWEZTX0lOT19UT19B R0lOTyhtcCwgbXAtPm1fc2Iuc2Jfcm9vdGlubyk7Ci0KLQkvKgotCSAqIHJ1 biB0aHJvdWdoIGVudHJpZXMgbG9va2luZyBmb3IgImxvc3QrZm91bmQiLgot CSAqLwotCXNmX2VudHJ5ID0gbmV4dF9zZmUgPSBYRlNfRElSMl9TRl9GSVJT VEVOVFJZKHNmKTsKLQlmb3IgKGkgPSAwOyBpIDwgSU5UX0dFVChzZi0+aGRy LmNvdW50LCBBUkNIX0NPTlZFUlQpICYmIGlub19kaXJfc2l6ZSA+Ci0JCQko X19wc2ludF90KW5leHRfc2ZlIC0gKF9fcHNpbnRfdClzZjsgaSsrKSAgewot CQl0bXBfc2ZlID0gTlVMTDsKLQkJc2ZfZW50cnkgPSBuZXh0X3NmZTsKLQkJ bGlubyA9IFhGU19ESVIyX1NGX0dFVF9JTlVNQkVSKHNmLAotCQkJWEZTX0RJ UjJfU0ZfSU5VTUJFUlAoc2ZfZW50cnkpKTsKLQkJYmNvcHkoc2ZfZW50cnkt Pm5hbWUsIGZuYW1lLCBzZl9lbnRyeS0+bmFtZWxlbik7Ci0JCWZuYW1lW3Nm X2VudHJ5LT5uYW1lbGVuXSA9ICdcMCc7Ci0KLQkJaWYgKCFzdHJjbXAoT1JQ SEFOQUdFLCBmbmFtZSkpICB7Ci0JCQlhZ25vID0gWEZTX0lOT19UT19BR05P KG1wLCBsaW5vKTsKLQkJCWFnaW5vID0gWEZTX0lOT19UT19BR0lOTyhtcCwg bGlubyk7Ci0KLQkJCWlyZWMgPSBmaW5kX2lub2RlX3JlYyhhZ25vLCBhZ2lu byk7Ci0KLQkJCS8qCi0JCQkgKiBpZiB0aGUgb3JwaGFuZ2UgaW5vZGUgaXMg aW4gdGhlIHRyZWUsCi0JCQkgKiBnZXQgaXQsIGNsZWFyIGl0LCBhbmQgbWFy ayBpdCBmcmVlLgotCQkJICogdGhlIGlub2RlcyBpbiB0aGUgb3JwaGFuYWdl IHdpbGwgZ2V0Ci0JCQkgKiByZWF0dGFjaGVkIHRvIHRoZSBuZXcgb3JwaGFu YWdlLgotCQkJICovCi0JCQlpZiAoaXJlYyAhPSBOVUxMKSAgewotCQkJCWRv X3dhcm4oCi0JCQkJXygiICAgICAgICAtIGNsZWFyaW5nIGV4aXN0aW5nIFwi JXNcIiBpbm9kZVxuIiksCi0JCQkJCU9SUEhBTkFHRSk7Ci0KLQkJCQlpbm9f b2Zmc2V0ID0gYWdpbm8gLSBpcmVjLT5pbm9fc3RhcnRudW07Ci0KLQkJCQkv KgotCQkJCSAqIGNoZWNrIGlmIHdlIGhhdmUgdG8gdXNlIHRoZSByb290IGlu b2RlCi0JCQkJICogYnVmZmVyIG9yIHJlYWQgb25lIGluIG91cnNlbHZlcy4g IE5vdGUKLQkJCQkgKiB0aGF0IHRoZSByb290IGlub2RlIGlzIGFsd2F5cyB0 aGUgZmlyc3QKLQkJCQkgKiBpbm9kZSBvZiB0aGUgY2h1bmsgdGhhdCBpdCdz IGluIHNvIHRoZXJlCi0JCQkJICogYXJlIHR3byBwb3NzaWJsZSBjYXNlcyB3 aGVyZSBsb3N0K2ZvdW5kCi0JCQkJICogbWlnaHQgYmUgaW4gdGhlIHNhbWUg YnVmZmVyIGFzIHRoZSByb290Ci0JCQkJICogaW5vZGUuICBPbmUgY2FzZSBp cyBhIGxhcmdlIGJsb2NrCi0JCQkJICogZmlsZXN5c3RlbSB3aGVyZSB0aGUg dHdvIGlub2RlcyBhcmUKLQkJCQkgKiBpbiBkaWZmZXJlbnQgaW5vZGUgY2h1 bmtzIGJ1dCB3aW5kCi0JCQkJICogdXAgaW4gdGhlIHNhbWUgYmxvY2sgKG11 bHRpcGxlIGNodW5rcwotCQkJCSAqIHBlciBibG9jaykgYW5kIHRoZSBzZWNv bmQgY2FzZSAob25lIG9yCi0JCQkJICogbW9yZSBibG9ja3MgcGVyIGNodW5r KSBpcyB3aGVyZSB0aGUgdHdvCi0JCQkJICogaW5vZGVzIGFyZSBpbiB0aGUg c2FtZSBjaHVuay4gTm90ZSB0aGF0Ci0JCQkJICogaW5vZGVzIGFyZSBhbGxv Y2F0ZWQgb24gZGlzayBpbiB1bml0cwotCQkJCSAqIG9mIE1BWChYRlNfSU5P REVTX1BFUl9DSFVOSyxzYl9pbm9wYmxvY2spLgotCQkJCSAqLwotCQkJCWlm IChYRlNfSU5PX1RPX0ZTQihtcCwgbXAtPm1fc2Iuc2Jfcm9vdGlubykKLQkJ CQkJCT09IFhGU19JTk9fVE9fRlNCKG1wLCBsaW5vKSB8fAotCQkJCSAgICAo YWdubyA9PSByb290X2Fnbm8gJiYKLQkJCQkgICAgIGFnaW5vIDwgcm9vdF9h Z2lubyArIFhGU19JTk9ERVNfUEVSX0NIVU5LKSkgewotCQkJCQl1c2VfcmJ1 ZiA9IDE7Ci0JCQkJCWJwID0gcm9vdGlub19icDsKLQotCQkJCQlkaW5vID0g WEZTX01BS0VfSVBUUihtcCwgYnAsIGFnaW5vIC0KLQkJCQkJCVhGU19JTk9f VE9fQUdJTk8obXAsCi0JCQkJCQkJbXAtPm1fc2Iuc2Jfcm9vdGlubykpOwot CQkJCX0gZWxzZSAgewotCQkJCQlsZW4gPSAoaW50KVhGU19GU0JfVE9fQkIo bXAsCi0JCQkJCQlNQVgoMSwgWEZTX0lOT0RFU19QRVJfQ0hVTksvCi0JCQkJ CQkJaW5vZGVzX3Blcl9ibG9jaykpOwotCQkJCQlicCA9IGxpYnhmc19yZWFk YnVmKG1wLT5tX2RldiwKLQkJCQkJCVhGU19BR0JfVE9fREFERFIobXAsIGFn bm8sCi0JCQkJCQkJWEZTX0FHSU5PX1RPX0FHQk5PKG1wLAotCQkJCQkJCQlp cmVjLT5pbm9fc3RhcnRudW0pKSwKLQkJCQkJCWxlbiwgMCk7Ci0JCQkJCWlm ICghYnApCi0JCQkJCQlkb19lcnJvcigKLQkJCQkJXygiY291bGQgbm90IHJl YWQgJXMgaW5vZGUgJWxsdVxuIiksCi0JCQkJCQkJT1JQSEFOQUdFLCBsaW5v KTsKLQotCQkJCQkvKgotCQkJCQkgKiBnZXQgdGhlIGFnYm5vIGNvbnRhaW5p bmcgdGhlIGZpcnN0Ci0JCQkJCSAqIGlub2RlIGluIHRoZSBjaHVuay4gIElu IG11bHRpLWJsb2NrCi0JCQkJCSAqIGNodW5rcywgdGhpcyBnZXRzIHVzIHRo ZSBvZmZzZXQKLQkJCQkJICogcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBv ZiBhCi0JCQkJCSAqIHByb3Blcmx5IGFsaWduZWQgYnVmZmVyLiAgSW4KLQkJ CQkJICogbXVsdGktY2h1bmsgYmxvY2tzLCB0aGlzIGdldHMgdXMKLQkJCQkJ ICogdGhlIGNvcnJlY3QgYmxvY2sgbnVtYmVyLiAgVGhlbgotCQkJCQkgKiB0 dXJuIHRoZSBibG9jayBudW1iZXIgYmFjayBpbnRvCi0JCQkJCSAqIGFuIGFn aW5vIGFuZCBjYWxjdWxhdGUgdGhlIG9mZnNldAotCQkJCQkgKiBmcm9tIHRo ZXJlIHRvIGZlZWQgdG8gbWFrZSB0aGUgaXB0ci4KLQkJCQkJICogdGhlIGxh c3QgdGVybSBpbiBlZmZlY3Qgcm91bmRzIGRvd24KLQkJCQkJICogdG8gdGhl IGZpcnN0IGFnaW5vIGluIHRoZSBidWZmZXIuCi0JCQkJCSAqLwotCQkJCQlk aW5vID0gWEZTX01BS0VfSVBUUihtcCwgYnAsCi0JCQkJCQlhZ2lubyAtIFhG U19PRkZCTk9fVE9fQUdJTk8obXAsCi0JCQkJCQkJWEZTX0FHSU5PX1RPX0FH Qk5PKG1wLAotCQkJCQkJCWlyZWMtPmlub19zdGFydG51bSksCi0JCQkJCQkJ MCkpOwotCQkJCX0KLQotCQkJCWRpcnR5ID0gY2xlYXJfZGlub2RlKG1wLCBk aW5vLCBsaW5vKTsKLQotCQkJCUFTU0VSVChkaXJ0eSA9PSAwIHx8IChkaXJ0 eSAmJiAhbm9fbW9kaWZ5KSk7Ci0KLQkJCQkvKgotCQkJCSAqIGlmIHdlIHJl YWQgdGhlIGxvc3QrZm91bmQgaW5vZGUgaW4gdG8KLQkJCQkgKiBpdCwgZ2V0 IHJpZCBvZiBpdCBoZXJlLiAgaWYgdGhlIGxvc3QrZm91bmQKLQkJCQkgKiBp bm9kZSBpcyBpbiB0aGUgcm9vdCBpbm9kZSBidWZmZXIsIHRoZQotCQkJCSAq IGJ1ZmZlciB3aWxsIGJlIG1hcmtlZCBkaXJ0eSBhbnl3YXkgc2luY2UKLQkJ CQkgKiB0aGUgbG9zdCtmb3VuZCBlbnRyeSBpbiB0aGUgcm9vdCBpbm9kZSBp cwotCQkJCSAqIGFsc28gYmVpbmcgZGVsZXRlZCB3aGljaCBtYWtlcyB0aGUg cm9vdAotCQkJCSAqIGlub2RlIGJ1ZmZlciBhdXRvbWF0aWNhbGx5IGRpcnR5 LgotCQkJCSAqLwotCQkJCWlmICghdXNlX3JidWYpICB7Ci0JCQkJCWRpbm8g PSBOVUxMOwotCQkJCQlpZiAoZGlydHkgJiYgIW5vX21vZGlmeSkKLQkJCQkJ CWxpYnhmc193cml0ZWJ1ZihicCwgMCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWxp Ynhmc19wdXRidWYoYnApOwotCQkJCX0KLQotCi0JCQkJaWYgKGlub2RlX2lz YWRpcihpcmVjLCBpbm9fb2Zmc2V0KSkKLQkJCQkJY2xlYXJfaW5vZGVfaXNh ZGlyKGlyZWMsIGlub19vZmZzZXQpOwotCi0JCQkJc2V0X2lub2RlX2ZyZWUo aXJlYywgaW5vX29mZnNldCk7Ci0JCQl9Ci0KLQkJCWRvX3dhcm4oXygiICAg ICAgICAtIGRlbGV0aW5nIGV4aXN0aW5nIFwiJXNcIiBlbnRyeVxuIiksCi0J CQkJT1JQSEFOQUdFKTsKLQotCQkJLyoKLQkJCSAqIG5vdGUgLS0gZXhhY3Rs eSB0aGUgc2FtZSBkZWxldGlvbiBjb2RlIGFzIGluCi0JCQkgKiBwcm9jZXNz X3Nob3J0Zm9ybV9kaXIoKQotCQkJICovCi0JCQl0bXBfZWxlbiA9IFhGU19E SVIyX1NGX0VOVFNJWkVfQllFTlRSWShzZiwgc2ZfZW50cnkpOwotCQkJSU5U X01PRChyb290X2Rpbm8tPmRpX2NvcmUuZGlfc2l6ZSwgQVJDSF9DT05WRVJU LAotCQkJCS0odG1wX2VsZW4pKTsKLQotCQkJdG1wX3NmZSA9ICh4ZnNfZGly Ml9zZl9lbnRyeV90ICopCi0JCQkJKChfX3BzaW50X3QpIHNmX2VudHJ5ICsg dG1wX2VsZW4pOwotCQkJdG1wX2xlbiA9IG1heF9zaXplIC0gKChfX3BzaW50 X3QpIHRtcF9zZmUKLQkJCQkJLSAoX19wc2ludF90KSBzZik7Ci0KLQkJCW1l bW1vdmUoc2ZfZW50cnksIHRtcF9zZmUsIHRtcF9sZW4pOwotCi0JCQlJTlRf TU9EKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgLTEpOwotCQkJaWYg KGxpbm8gPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTSkKLQkJCQlzZi0+aGRy Lmk4Y291bnQtLTsKLQotCQkJYnplcm8oKHZvaWQgKikgKChfX3BzaW50X3Qp IHNmX2VudHJ5ICsgdG1wX2xlbiksCi0JCQkJdG1wX2VsZW4pOwotCi0JCQkv KgotCQkJICogc2V0IHRoZSB0bXAgdmFsdWUgdG8gdGhlIGN1cnJlbnQKLQkJ CSAqIHBvaW50ZXIgc28gd2UnbGwgcHJvY2VzcyB0aGUgZW50cnkKLQkJCSAq IHdlIGp1c3QgbW92ZWQgdXAKLQkJCSAqLwotCQkJdG1wX3NmZSA9IHNmX2Vu dHJ5OwotCi0JCQkvKgotCQkJICogV0FSTklORzogIGRyb3AgdGhlIGluZGV4 IGkgYnkgb25lCi0JCQkgKiBzbyBpdCBtYXRjaGVzIHRoZSBkZWNyZW1lbnRl ZCBjb3VudCBmb3IKLQkJCSAqIGFjY3VyYXRlIGNvbXBhcmlzb25zIGluIHRo ZSBsb29wIHRlc3QuCi0JCQkgKiBtYXJrIHJvb3QgaW5vZGUgYXMgZGlydHkg dG8gbWFrZSBkZWxldGlvbgotCQkJICogcGVybWFuZW50LgotCQkJICovCi0J CQlpLS07Ci0KLQkJCSppbm9fZGlydHkgPSAxOwotCi0JCQlyZXMrKzsKLQkJ fQotCQluZXh0X3NmZSA9ICh0bXBfc2ZlID09IE5VTEwpCi0JCQk/ICh4ZnNf ZGlyMl9zZl9lbnRyeV90ICopICgoX19wc2ludF90KSBzZl9lbnRyeSArCi0J CQkJWEZTX0RJUjJfU0ZfRU5UU0laRV9CWUVOVFJZKHNmLCBzZl9lbnRyeSkp Ci0JCQk6IHRtcF9zZmU7Ci0JfQotCi0JcmV0dXJuKHJlcyk7Ci19Ci0KLXZv aWQKLWRlbGV0ZV9vcnBoYW5hZ2UoeGZzX21vdW50X3QgKm1wKQotewotCXhm c19pbm9fdCBpbm87Ci0JeGZzX2Rpbm9kZV90ICpkaW5vOwotCXhmc19idWZf dCAqZGJwOwotCWludCBkaXJ0eSwgcmVzLCBsZW47Ci0KLQlBU1NFUlQoIW5v X21vZGlmeSk7Ci0KLQlkYnAgPSBOVUxMOwotCWRpcnR5ID0gcmVzID0gMDsK LQlpbm8gPSBtcC0+bV9zYi5zYl9yb290aW5vOwotCi0JLyoKLQkgKiB3ZSBr bm93IHRoZSByb290IGlzIGluIHVzZSBvciB3ZSB3b3VsZG4ndCBiZSBoZXJl Ci0JICovCi0JbGVuID0gKGludClYRlNfRlNCX1RPX0JCKG1wLAotCQkJTUFY KDEsIFhGU19JTk9ERVNfUEVSX0NIVU5LL2lub2Rlc19wZXJfYmxvY2spKTsK LQlkYnAgPSBsaWJ4ZnNfcmVhZGJ1ZihtcC0+bV9kZXYsCi0JCQlYRlNfRlNC X1RPX0RBRERSKG1wLCBYRlNfSU5PX1RPX0ZTQihtcCwgaW5vKSksIGxlbiwg MCk7Ci0JaWYgKCFkYnApCi0JCWRvX2Vycm9yKF8oImNvdWxkIG5vdCByZWFk IGJ1ZmZlciBmb3Igcm9vdCBpbm9kZSAlbGx1ICIKLQkJCSAgICIoZGFkZHIg JWxsZCwgc2l6ZSAlZClcbiIpLCBpbm8sCi0JCQlYRlNfRlNCX1RPX0RBRERS KG1wLCBYRlNfSU5PX1RPX0ZTQihtcCwgaW5vKSksCi0JCQlYRlNfRlNCX1RP X0JCKG1wLCAxKSk7Ci0KLQkvKgotCSAqIHdlIGFsc28ga25vdyB0aGF0IHRo ZSByb290IGlub2RlIGlzIGFsd2F5cyB0aGUgZmlyc3QgaW5vZGUKLQkgKiBh bGxvY2F0ZWQgaW4gdGhlIHN5c3RlbSwgdGhlcmVmb3JlIGl0J2xsIGJlIGF0 IHRoZSBiZWdpbm5pbmcKLQkgKiBvZiB0aGUgcm9vdCBpbm9kZSBjaHVuawot CSAqLwotCWRpbm8gPSBYRlNfTUFLRV9JUFRSKG1wLCBkYnAsIDApOwotCi0J c3dpdGNoIChkaW5vLT5kaV9jb3JlLmRpX2Zvcm1hdCkgIHsKLQljYXNlIFhG U19ESU5PREVfRk1UX0VYVEVOVFM6Ci0JY2FzZSBYRlNfRElOT0RFX0ZNVF9C VFJFRToKLQkJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0RJUlYyKCZtcC0+bV9z YikpCi0JCQlyZXMgPSBsb25nZm9ybTJfZGVsZXRlX29ycGhhbmFnZShtcCwg aW5vLCBkaW5vLCBkYnAsCi0JCQkJJmRpcnR5KTsKLQkJZWxzZQotCQkJcmVz ID0gbG9uZ2Zvcm1fZGVsZXRlX29ycGhhbmFnZShtcCwgaW5vLCBkaW5vLCBk YnAsCi0JCQkJJmRpcnR5KTsKLQkJYnJlYWs7Ci0JY2FzZSBYRlNfRElOT0RF X0ZNVF9MT0NBTDoKLQkJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0RJUlYyKCZt cC0+bV9zYikpCi0JCQlyZXMgPSBzaG9ydGZvcm0yX2RlbGV0ZV9vcnBoYW5h Z2UobXAsIGlubywgZGlubywgZGJwLAotCQkJCSZkaXJ0eSk7Ci0JCWVsc2UK LQkJCXJlcyA9IHNob3J0Zm9ybV9kZWxldGVfb3JwaGFuYWdlKG1wLCBpbm8s IGRpbm8sIGRicCwKLQkJCQkmZGlydHkpOwotCQlBU1NFUlQoKHJlcyA9PSAw ICYmIGRpcnR5ID09IDApIHx8IChyZXMgPiAwICYmIGRpcnR5ID09IDEpKTsK LQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHJl cykgIHsKLQkJc3dpdGNoIChkaW5vLT5kaV9jb3JlLmRpX3ZlcnNpb24pICB7 Ci0JCWNhc2UgWEZTX0RJTk9ERV9WRVJTSU9OXzE6Ci0JCQlJTlRfTU9EKGRp bm8tPmRpX2NvcmUuZGlfb25saW5rLCBBUkNIX0NPTlZFUlQsIC1yZXMpOwot CQkJSU5UX1NFVChkaW5vLT5kaV9jb3JlLmRpX25saW5rLCBBUkNIX0NPTlZF UlQsCi0JCQkJSU5UX0dFVChkaW5vLT5kaV9jb3JlLmRpX29ubGluaywgQVJD SF9DT05WRVJUKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBYRlNfRElOT0RFX1ZF UlNJT05fMjoKLQkJCUlOVF9NT0QoZGluby0+ZGlfY29yZS5kaV9ubGluaywg QVJDSF9DT05WRVJULCAtcmVzKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0Ogot CQkJZG9fZXJyb3IoXygidW5rbm93biB2ZXJzaW9uICMlZCBpbiByb290IGlu b2RlXG4iKSwKLQkJCQkJZGluby0+ZGlfY29yZS5kaV92ZXJzaW9uKTsKLQkJ fQotCi0JCWRpcnR5ID0gMTsKLQl9Ci0KLQlpZiAoZGlydHkpCi0JCWxpYnhm c193cml0ZWJ1ZihkYnAsIDApOwotCWVsc2UKLQkJbGlieGZzX3B1dGJ1Zihk YnApOwotfQotCiAvKgogICogbnVsbCBvdXQgcXVvdGEgaW5vZGUgZmllbGRz IGluIHNiIGlmIHRoZXkgcG9pbnQgdG8gbm9uLWV4aXN0ZW50IGlub2Rlcy4K ICAqIHRoaXMgaXNuJ3QgYXMgcmVkdW5kYW50IGFzIGl0IGxvb2tzIHNpbmNl IGl0J3MgcG9zc2libGUgdGhhdCB0aGUgc2IgZmllbGQKQEAgLTExODAsMTYg KzE2Niw2IEBACiAJCQlkb193YXJuKF8oInJvb3QgaW5vZGUgbG9zdFxuIikp OwogCX0KIAotCS8qCi0JICogaGF2ZSB0byBkZWxldGUgbG9zdCtmb3VuZCBm aXJzdCBzbyB0aGF0IGJsb2NrcyB1c2VkCi0JICogYnkgbG9zdCtmb3VuZCBk b24ndCBzaG93IHVwIGFzIHVzZWQKLQkgKi8KLQlpZiAoIW5vX21vZGlmeSkg IHsKLQkJZG9fbG9nKF8oIiAgICAgICAgLSBjbGVhciBsb3N0K2ZvdW5kIChp ZiBpdCBleGlzdHMpIC4uLlxuIikpOwotCQlpZiAoIW5lZWRfcm9vdF9pbm9k ZSkKLQkJCWRlbGV0ZV9vcnBoYW5hZ2UobXApOwotCX0KLQogCWZvciAoaSA9 IDA7IGkgPCBtcC0+bV9zYi5zYl9hZ2NvdW50OyBpKyspICB7CiAJCWFnX2Vu ZCA9IChpIDwgbXAtPm1fc2Iuc2JfYWdjb3VudCAtIDEpID8gbXAtPm1fc2Iu c2JfYWdibG9ja3MgOgogCQkJbXAtPm1fc2Iuc2JfZGJsb2NrcyAtCkluZGV4 OiByZXBhaXIveGZzcHJvZ3MvcmVwYWlyL3BoYXNlNi5jCj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT0KLS0tIHJlcGFpci5vcmlnL3hmc3Byb2dzL3JlcGFpci9w aGFzZTYuYwkyMDA3LTA0LTI3IDE0OjExOjA5LjM3MDYzNjQyMCArMTAwMAor KysgcmVwYWlyL3hmc3Byb2dzL3JlcGFpci9waGFzZTYuYwkyMDA3LTA0LTI3 IDE0OjExOjQxLjAwMDAwMDAwMCArMTAwMApAQCAtMzEsOSArMzEsMTAgQEAK ICNpbmNsdWRlICJwcm9ncmVzcy5oIgogI2luY2x1ZGUgInZlcnNpb25zLmgi CiAKLXN0YXRpYyBzdHJ1Y3QgY3JlZCB6ZXJvY3I7Ci1zdGF0aWMgc3RydWN0 IGZzeGF0dHIgemVyb2ZzeDsKLXN0YXRpYyBpbnQgb3JwaGFuYWdlX2VudGVy ZWQ7CitzdGF0aWMgc3RydWN0IGNyZWQJCXplcm9jcjsKK3N0YXRpYyBzdHJ1 Y3QgZnN4YXR0ciAJCXplcm9mc3g7CitzdGF0aWMgeGZzX2lub190CQlvcnBo YW5hZ2VfaW5vOworc3RhdGljIHhmc19pbm9kZV90CQkqb3JwaGFuYWdlX2lw OwogCiAvKgogICogRGF0YSBzdHJ1Y3R1cmVzIGFuZCByb3V0aW5lcyB0byBr ZWVwIHRyYWNrIG9mIGRpcmVjdG9yeSBlbnRyaWVzCkBAIC04MDgsNiArODA5 LDI0IEBACiAJY29uc3QgaW50CW1vZGUgPSAwNzU1OwogCWludAkJbnJlczsK IAorCS8qCisJICogY2hlY2sgZm9yIGFuIGV4aXN0aW5nIGxvc3QrZm91bmQg Zmlyc3QsIGlmIGl0IGV4aXN0cywgcmV0dXJuCisJICogaXQncyBpbm9kZS4g T3RoZXJ3aXNlLCB3ZSBjYW4gY3JlYXRlIGl0LiBCYWQgbG9zdCtmb3VuZCBp bm9kZXMKKwkgKiB3b3VsZCBoYXZlIGJlZW4gY2xlYXJlZCBpbiBwaGFzZTMg YW5kIHBoYXNlNC4KKwkgKi8KKworCWlmICgoaSA9IGxpYnhmc19pZ2V0KG1w LCBOVUxMLCBtcC0+bV9zYi5zYl9yb290aW5vLCAwLCAmcGlwLCAwKSkpCisJ CWRvX2Vycm9yKF8oIiVkIC0gY291bGRuJ3QgaWdldCByb290IGlub2RlIHRv IG9idGFpbiAlc1xuIiksCisJCQlpLCBPUlBIQU5BR0UpOworCisJaWYgKGRp cl9sb29rdXAobXAsIE5VTEwsIHBpcCwgT1JQSEFOQUdFLCBzdHJsZW4oT1JQ SEFOQUdFKSwKKwkJCSZpbm8pID09IDApCisJCXJldHVybiBpbm87CisKKwkv KgorCSAqIGNvdWxkIG5vdCBiZSBmb3VuZCwgY3JlYXRlIGl0CisJICovCisK IAl0cCA9IGxpYnhmc190cmFuc19hbGxvYyhtcCwgMCk7CiAJWEZTX0JNQVBf SU5JVCgmZmxpc3QsICZmaXJzdCk7CiAKQEAgLTgyMCw5ICs4MzksOSBAQAog CSAqIHVzZSBpZ2V0L2lqb2luIGluc3RlYWQgb2YgdHJhbnNfaWdldCBiZWNh dXNlIHRoZSBpYWxsb2MKIAkgKiB3cmFwcGVyIGNhbiBjb21taXQgdGhlIHRy YW5zYWN0aW9uIGFuZCBzdGFydCBhIG5ldyBvbmUKIAkgKi8KLQlpZiAoKGkg PSBsaWJ4ZnNfaWdldChtcCwgTlVMTCwgbXAtPm1fc2Iuc2Jfcm9vdGlubywg MCwgJnBpcCwgMCkpKQorLyoJaWYgKChpID0gbGlieGZzX2lnZXQobXAsIE5V TEwsIG1wLT5tX3NiLnNiX3Jvb3Rpbm8sIDAsICZwaXAsIDApKSkKIAkJZG9f ZXJyb3IoXygiJWQgLSBjb3VsZG4ndCBpZ2V0IHJvb3QgaW5vZGUgdG8gbWFr ZSAlc1xuIiksCi0JCQlpLCBPUlBIQU5BR0UpOworCQkJaSwgT1JQSEFOQUdF KTsqLwogCiAJZXJyb3IgPSBsaWJ4ZnNfaW5vZGVfYWxsb2MoJnRwLCBwaXAs IG1vZGV8U19JRkRJUiwKIAkJCQkJMSwgMCwgJnplcm9jciwgJnplcm9mc3gs ICZpcCk7CkBAIC04NDMsMTggKzg2MiwxOSBAQAogCSAqLwogCWlmICgoZXJy b3IgPSBkaXJfY3JlYXRlbmFtZShtcCwgdHAsIHBpcCwgT1JQSEFOQUdFLAog CQkJc3RybGVuKE9SUEhBTkFHRSksIGlwLT5pX2lubywgJmZpcnN0LCAmZmxp c3QsIG5yZXMpKSkgewotCQlkb193YXJuKAotCQlfKCJjYW4ndCBtYWtlICVz LCBjcmVhdGVuYW1lIGVycm9yICVkLCB3aWxsIHRyeSBsYXRlclxuIiksCisJ CWRvX2Vycm9yKAorCQlfKCJjYW4ndCBtYWtlICVzLCBjcmVhdGVuYW1lIGVy cm9yICVkXG4iKSwKIAkJCU9SUEhBTkFHRSwgZXJyb3IpOwotCQlvcnBoYW5h Z2VfZW50ZXJlZCA9IDA7Ci0JfSBlbHNlCi0JCW9ycGhhbmFnZV9lbnRlcmVk ID0gMTsKKwl9CiAKIAkvKgogCSAqIGJ1bXAgdXAgdGhlIGxpbmsgY291bnQg aW4gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIGFjY291bnQKIAkgKiBmb3IgLi4g aW4gdGhlIG5ldyBkaXJlY3RvcnkKIAkgKi8KIAlwaXAtPmlfZC5kaV9ubGlu aysrOworCWFkZF9pbm9kZV9yZWYoZmluZF9pbm9kZV9yZWMoWEZTX0lOT19U T19BR05PKG1wLCBtcC0+bV9zYi5zYl9yb290aW5vKSwKKwkJCQlYRlNfSU5P X1RPX0FHSU5PKG1wLCBtcC0+bV9zYi5zYl9yb290aW5vKSksIDApOworCiAK IAlsaWJ4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBwaXAsIFhGU19JTE9HX0NP UkUpOwogCWRpcl9pbml0KG1wLCB0cCwgaXAsIHBpcCk7CkBAIC04NzAsMzYg Kzg5MCw0MyBAQAogCiAJbGlieGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RS QU5TX1JFTEVBU0VfTE9HX1JFU3xYRlNfVFJBTlNfU1lOQywgMCk7CiAKLQkv KiBuZWVkIGxpYnhmc19pcHV0IGhlcmU/IC0gbmF0aGFucyBUT0RPIC0gcG9z c2libGUgbWVtb3J5IGxlYWs/ICovCi0KIAlyZXR1cm4oaW5vKTsKIH0KIAog LyoKLSAqIG1vdmUgYSBmaWxlIHRvIHRoZSBvcnBoYW5nZS4gIHRoZSBvcnBo YW5hZ2UgaXMgZ3VhcmFudGVlZAotICogYXQgdGhpcyBwb2ludCB0byBvbmx5 IGhhdmUgZmlsZSBpbiBpdCB3aG9zZSBuYW1lID09IGZpbGUgaW5vZGUgIwor ICogbW92ZSBhIGZpbGUgdG8gdGhlIG9ycGhhbmdlLgogICovCi12b2lkCi1t dl9vcnBoYW5hZ2UoeGZzX21vdW50X3QJKm1wLAotCQl4ZnNfaW5vX3QJZGly X2lubywJLyogb3JwaGFuZ2UgaW5vZGUgIyAqLwotCQl4ZnNfaW5vX3QJaW5v LAkJLyogaW5vZGUgIyB0byBiZSBtb3ZlZCAqLwotCQlpbnQJCWlzYV9kaXIp CS8qIDEgaWYgaW5vZGUgaXMgYSBkaXJlY3RvcnkgKi8KLXsKLQl4ZnNfaW5v X3QJZW50cnlfaW5vX251bTsKLQl4ZnNfaW5vZGVfdAkqZGlyX2lub19wOwot CXhmc19pbm9kZV90CSppbm9fcDsKLQl4ZnNfdHJhbnNfdAkqdHA7Ci0JeGZz X2ZzYmxvY2tfdAlmaXJzdDsKLQl4ZnNfYm1hcF9mcmVlX3QJZmxpc3Q7Ci0J aW50CQllcnI7Ci0JaW50CQljb21taXR0ZWQ7Ci0JY2hhcgkJZm5hbWVbTUFY UEFUSExFTiArIDFdOwotCWludAkJbnJlczsKK3N0YXRpYyB2b2lkCittdl9v cnBoYW5hZ2UoCisJeGZzX21vdW50X3QJCSptcCwKKwl4ZnNfaW5vX3QJCWlu bywJCS8qIGlub2RlICMgdG8gYmUgbW92ZWQgKi8KKwlpbnQJCQlpc2FfZGly KQkvKiAxIGlmIGlub2RlIGlzIGEgZGlyZWN0b3J5ICovCit7CisJeGZzX2lu b190CQllbnRyeV9pbm9fbnVtOworCXhmc19pbm9kZV90CQkqaW5vX3A7CisJ eGZzX3RyYW5zX3QJCSp0cDsKKwl4ZnNfZnNibG9ja190CQlmaXJzdDsKKwl4 ZnNfYm1hcF9mcmVlX3QJCWZsaXN0OworCWludAkJCWVycjsKKwlpbnQJCQlj b21taXR0ZWQ7CisJY2hhcgkJCWZuYW1lW01BWFBBVEhMRU4gKyAxXTsKKwlp bnQJCQlmbmFtZWxlbjsKKwlpbnQJCQlucmVzOworCWludAkJCWluY3I7CiAK LQlzbnByaW50ZihmbmFtZSwgc2l6ZW9mKGZuYW1lKSwgIiVsbHUiLCAodW5z aWduZWQgbG9uZyBsb25nKWlubyk7CisJZm5hbWVsZW4gPSBzbnByaW50Zihm bmFtZSwgc2l6ZW9mKGZuYW1lKSwgIiVsbHUiLAorCQkJKHVuc2lnbmVkIGxv bmcgbG9uZylpbm8pOwogCi0JaWYgKChlcnIgPSBsaWJ4ZnNfaWdldChtcCwg TlVMTCwgZGlyX2lubywgMCwgJmRpcl9pbm9fcCwgMCkpKQotCQlkb19lcnJv cihfKCIlZCAtIGNvdWxkbid0IGlnZXQgb3JwaGFuYWdlIGlub2RlXG4iKSwg ZXJyKTsKKwlBU1NFUlQob3JwaGFuYWdlX2lwICE9IE5VTEwpOworCS8qCisJ ICogTWFrZSBzdXJlIHRoZSBmaWxlbmFtZSBpcyB1bmlxdWUgaW4gdGhlIGxv c3QrZm91bmQKKwkgKi8KKwlpbmNyID0gMDsKKwl3aGlsZSAoZGlyX2xvb2t1 cChtcCwgTlVMTCwgb3JwaGFuYWdlX2lwLCBmbmFtZSwgZm5hbWVsZW4sCisJ CQkmZW50cnlfaW5vX251bSkgPT0gMCkgeworCQlmbmFtZWxlbiA9IHNucHJp bnRmKGZuYW1lLCBzaXplb2YoZm5hbWUpLCAiJWxsdS4lZCIsCisJCQkJKHVu c2lnbmVkIGxvbmcgbG9uZylpbm8sICsraW5jcik7CisJfQogCiAJdHAgPSBs aWJ4ZnNfdHJhbnNfYWxsb2MobXAsIDApOwogCkBAIC05MDcsMTAgKzkzNCwx MCBAQAogCQlkb19lcnJvcihfKCIlZCAtIGNvdWxkbid0IGlnZXQgZGlzY29u bmVjdGVkIGlub2RlXG4iKSwgZXJyKTsKIAogCWlmIChpc2FfZGlyKSAgewot CQlucmVzID0gWEZTX0RJUkVOVEVSX1NQQUNFX1JFUyhtcCwgc3RybGVuKGZu YW1lKSkgKworCQlucmVzID0gWEZTX0RJUkVOVEVSX1NQQUNFX1JFUyhtcCwg Zm5hbWVsZW4pICsKIAkJICAgICAgIFhGU19ESVJFTlRFUl9TUEFDRV9SRVMo bXAsIDIpOwotCQlpZiAoKGVyciA9IGRpcl9sb29rdXAobXAsIHRwLCBpbm9f cCwgIi4uIiwgMiwKLQkJCQkmZW50cnlfaW5vX251bSkpKSB7CisJCWVyciA9 IGRpcl9sb29rdXAobXAsIHRwLCBpbm9fcCwgIi4uIiwgMiwgJmVudHJ5X2lu b19udW0pOworCQlpZiAoZXJyKSB7CiAJCQlBU1NFUlQoZXJyID09IEVOT0VO VCk7CiAKIAkJCWlmICgoZXJyID0gbGlieGZzX3RyYW5zX3Jlc2VydmUodHAs IG5yZXMsCkBAIC05MjEsMjIgKzk0OCwyMiBAQAogCV8oInNwYWNlIHJlc2Vy dmF0aW9uIGZhaWxlZCAoJWQpLCBmaWxlc3lzdGVtIG1heSBiZSBvdXQgb2Yg c3BhY2VcbiIpLAogCQkJCQllcnIpOwogCi0JCQlsaWJ4ZnNfdHJhbnNfaWpv aW4odHAsIGRpcl9pbm9fcCwgMCk7CisJCQlsaWJ4ZnNfdHJhbnNfaWpvaW4o dHAsIG9ycGhhbmFnZV9pcCwgMCk7CiAJCQlsaWJ4ZnNfdHJhbnNfaWpvaW4o dHAsIGlub19wLCAwKTsKIAogCQkJWEZTX0JNQVBfSU5JVCgmZmxpc3QsICZm aXJzdCk7Ci0JCQlpZiAoKGVyciA9IGRpcl9jcmVhdGVuYW1lKG1wLCB0cCwg ZGlyX2lub19wLCBmbmFtZSwKLQkJCQkJCXN0cmxlbihmbmFtZSksIGlubywg JmZpcnN0LAorCQkJaWYgKChlcnIgPSBkaXJfY3JlYXRlbmFtZShtcCwgdHAs IG9ycGhhbmFnZV9pcCwgZm5hbWUsCisJCQkJCQlmbmFtZWxlbiwgaW5vLCAm Zmlyc3QsCiAJCQkJCQkmZmxpc3QsIG5yZXMpKSkKIAkJCQlkb19lcnJvcigK IAlfKCJuYW1lIGNyZWF0ZSBmYWlsZWQgaW4gJXMgKCVkKSwgZmlsZXN5c3Rl bSBtYXkgYmUgb3V0IG9mIHNwYWNlXG4iKSwKIAkJCQkJT1JQSEFOQUdFLCBl cnIpOwogCi0JCQlkaXJfaW5vX3AtPmlfZC5kaV9ubGluaysrOwotCQkJbGli eGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgZGlyX2lub19wLCBYRlNfSUxPR19D T1JFKTsKKwkJCW9ycGhhbmFnZV9pcC0+aV9kLmRpX25saW5rKys7CisJCQls aWJ4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBvcnBoYW5hZ2VfaXAsIFhGU19J TE9HX0NPUkUpOwogCiAJCQlpZiAoKGVyciA9IGRpcl9jcmVhdGVuYW1lKG1w LCB0cCwgaW5vX3AsICIuLiIsIDIsCi0JCQkJCQlkaXJfaW5vLCAmZmlyc3Qs ICZmbGlzdCwgbnJlcykpKQorCQkJCQkJb3JwaGFuYWdlX2lubywgJmZpcnN0 LCAmZmxpc3QsIG5yZXMpKSkKIAkJCQlkb19lcnJvcigKIAlfKCJjcmVhdGlv biBvZiAuLiBlbnRyeSBmYWlsZWQgKCVkKSwgZmlsZXN5c3RlbSBtYXkgYmUg b3V0IG9mIHNwYWNlXG4iKSwKIAkJCQkJZXJyKTsKQEAgLTk2MCwyOCArOTg3 LDI4IEBACiAJXygic3BhY2UgcmVzZXJ2YXRpb24gZmFpbGVkICglZCksIGZp bGVzeXN0ZW0gbWF5IGJlIG91dCBvZiBzcGFjZVxuIiksCiAJCQkJCWVycik7 CiAKLQkJCWxpYnhmc190cmFuc19pam9pbih0cCwgZGlyX2lub19wLCAwKTsK KwkJCWxpYnhmc190cmFuc19pam9pbih0cCwgb3JwaGFuYWdlX2lwLCAwKTsK IAkJCWxpYnhmc190cmFuc19pam9pbih0cCwgaW5vX3AsIDApOwogCiAJCQlY RlNfQk1BUF9JTklUKCZmbGlzdCwgJmZpcnN0KTsKIAotCQkJaWYgKChlcnIg PSBkaXJfY3JlYXRlbmFtZShtcCwgdHAsIGRpcl9pbm9fcCwgZm5hbWUsCi0J CQkJCQlzdHJsZW4oZm5hbWUpLCBpbm8sICZmaXJzdCwKKwkJCWlmICgoZXJy ID0gZGlyX2NyZWF0ZW5hbWUobXAsIHRwLCBvcnBoYW5hZ2VfaXAsIGZuYW1l LAorCQkJCQkJZm5hbWVsZW4sIGlubywgJmZpcnN0LAogCQkJCQkJJmZsaXN0 LCBucmVzKSkpCiAJCQkJZG9fZXJyb3IoCiAJXygibmFtZSBjcmVhdGUgZmFp bGVkIGluICVzICglZCksIGZpbGVzeXN0ZW0gbWF5IGJlIG91dCBvZiBzcGFj ZVxuIiksCiAJCQkJCU9SUEhBTkFHRSwgZXJyKTsKIAotCQkJZGlyX2lub19w LT5pX2QuZGlfbmxpbmsrKzsKLQkJCWxpYnhmc190cmFuc19sb2dfaW5vZGUo dHAsIGRpcl9pbm9fcCwgWEZTX0lMT0dfQ09SRSk7CisJCQlvcnBoYW5hZ2Vf aXAtPmlfZC5kaV9ubGluaysrOworCQkJbGlieGZzX3RyYW5zX2xvZ19pbm9k ZSh0cCwgb3JwaGFuYWdlX2lwLCBYRlNfSUxPR19DT1JFKTsKIAogCQkJLyoK IAkJCSAqIGRvbid0IHJlcGxhY2UgLi4gdmFsdWUgaWYgaXQgYWxyZWFkeSBw b2ludHMKIAkJCSAqIHRvIHVzLiAgdGhhdCdsbCBwb3AgYSBsaWJ4ZnMva2Vy bmVsIEFTU0VSVC4KIAkJCSAqLwotCQkJaWYgKGVudHJ5X2lub19udW0gIT0g ZGlyX2lubykgIHsKKwkJCWlmIChlbnRyeV9pbm9fbnVtICE9IG9ycGhhbmFn ZV9pbm8pICB7CiAJCQkJaWYgKChlcnIgPSBkaXJfcmVwbGFjZShtcCwgdHAs IGlub19wLCAiLi4iLAotCQkJCQkJCTIsIGRpcl9pbm8sICZmaXJzdCwKKwkJ CQkJCQkyLCBvcnBoYW5hZ2VfaW5vLCAmZmlyc3QsCiAJCQkJCQkJJmZsaXN0 LCBucmVzKSkpCiAJCQkJCWRvX2Vycm9yKAogCV8oIm5hbWUgcmVwbGFjZSBv cCBmYWlsZWQgKCVkKSwgZmlsZXN5c3RlbSBtYXkgYmUgb3V0IG9mIHNwYWNl XG4iKSwKQEAgLTEwMDQsMTkgKzEwMzEsMTkgQEAKIAkJICogbGlua3MsIHdl J3JlIG5vdCBkb2luZyB0aGUgaW5vZGUgYWxsb2NhdGlvbgogCQkgKiBhbHNv IGFjY291bnRlZCBmb3IgaW4gdGhlIGNyZWF0ZQogCQkgKi8KLQkJbnJlcyA9 IFhGU19ESVJFTlRFUl9TUEFDRV9SRVMobXAsIHN0cmxlbihmbmFtZSkpOwor CQlucmVzID0gWEZTX0RJUkVOVEVSX1NQQUNFX1JFUyhtcCwgZm5hbWVsZW4p OwogCQlpZiAoKGVyciA9IGxpYnhmc190cmFuc19yZXNlcnZlKHRwLCBucmVz LCBYRlNfUkVNT1ZFX0xPR19SRVMobXApLCAwLAogCQkJCVhGU19UUkFOU19Q RVJNX0xPR19SRVMsIFhGU19SRU1PVkVfTE9HX0NPVU5UKSkpCiAJCQlkb19l cnJvcigKIAlfKCJzcGFjZSByZXNlcnZhdGlvbiBmYWlsZWQgKCVkKSwgZmls ZXN5c3RlbSBtYXkgYmUgb3V0IG9mIHNwYWNlXG4iKSwKIAkJCQllcnIpOwog Ci0JCWxpYnhmc190cmFuc19pam9pbih0cCwgZGlyX2lub19wLCAwKTsKKwkJ bGlieGZzX3RyYW5zX2lqb2luKHRwLCBvcnBoYW5hZ2VfaXAsIDApOwogCQls aWJ4ZnNfdHJhbnNfaWpvaW4odHAsIGlub19wLCAwKTsKIAogCQlYRlNfQk1B UF9JTklUKCZmbGlzdCwgJmZpcnN0KTsKLQkJaWYgKChlcnIgPSBkaXJfY3Jl YXRlbmFtZShtcCwgdHAsIGRpcl9pbm9fcCwgZm5hbWUsCi0JCQkJc3RybGVu KGZuYW1lKSwgaW5vLCAmZmlyc3QsICZmbGlzdCwgbnJlcykpKQorCQlpZiAo KGVyciA9IGRpcl9jcmVhdGVuYW1lKG1wLCB0cCwgb3JwaGFuYWdlX2lwLCBm bmFtZSwKKwkJCQlmbmFtZWxlbiwgaW5vLCAmZmlyc3QsICZmbGlzdCwgbnJl cykpKQogCQkJZG9fZXJyb3IoCiAJXygibmFtZSBjcmVhdGUgZmFpbGVkIGlu ICVzICglZCksIGZpbGVzeXN0ZW0gbWF5IGJlIG91dCBvZiBzcGFjZVxuIiks CiAJCQkJT1JQSEFOQUdFLCBlcnIpOwpAQCAtMTM2NSw2ICsxMzkyLDI0IEBA CiAJcmV0dXJuKDEpOwogfQogCitzdGF0aWMgaW50CitlbnRyeV9qdW5rZWQo CisJY29uc3QgY2hhciAJKm1zZywKKwljb25zdCBjaGFyCSppbmFtZSwKKwl4 ZnNfaW5vX3QJaW5vMSwKKwl4ZnNfaW5vX3QJaW5vMikKK3sKKwlkb193YXJu KG1zZywgaW5hbWUsIGlubzEsIGlubzIpOworCWlmICghbm9fbW9kaWZ5KSB7 CisJCWlmICh2ZXJib3NlKQorCQkJZG9fd2FybihfKCIsIG1hcmtpbmcgZW50 cnkgdG8gYmUganVua2VkXG4iKSk7CisJCWVsc2UKKwkJCWRvX3dhcm4oIlxu Iik7CisJfSBlbHNlCisJCWRvX3dhcm4oXygiLCB3b3VsZCBqdW5rIGVudHJ5 XG4iKSk7CisJcmV0dXJuICFub19tb2RpZnk7Cit9CisKIC8qCiAgKiBwcm9j ZXNzIGEgbGVhZiBibG9jaywgYWxzbyBjaGVja3MgZm9yIC4uIGVudHJ5CiAg KiBhbmQgY29ycmVjdHMgaXQgdG8gbWF0Y2ggd2hhdCB3ZSB0aGluayAuLiBz aG91bGQgYmUKQEAgLTE0NDIsOSArMTQ4Nyw5IEBACiAJCSAqIHRha2UgY2Fy ZSBvZiBpdCB0aGVuLgogCQkgKi8KIAkJaWYgKGVudHJ5LT5uYW1lbGVuID09 IDIgJiYgbmFtZXN0LT5uYW1lWzBdID09ICcuJyAmJgotCQkJCW5hbWVzdC0+ bmFtZVsxXSA9PSAnLicpICB7CisJCQkJbmFtZXN0LT5uYW1lWzFdID09ICcu JykKIAkJCWNvbnRpbnVlOwotCQl9CisKIAkJQVNTRVJUKG5vX21vZGlmeSB8 fCAhdmVyaWZ5X2ludW0obXAsIGxpbm8pKTsKIAogCQkvKgpAQCAtMTQ2NCwx NyArMTUwOSw2IEBACiAJCX0KIAogCQkvKgotCQkgKiBzcGVjaWFsIGNhc2Ug dGhlICJsb3N0K2ZvdW5kIiBlbnRyeSBpZiBwb2ludGluZwotCQkgKiB0byB3 aGVyZSB3ZSB0aGluayBsb3N0K2ZvdW5kIHNob3VsZCBiZS4gIGlmIHRoYXQn cwotCQkgKiB0aGUgY2FzZSwgdGhhdCdzIHRoZSBvbmUgd2UgY3JlYXRlZCBp biBwaGFzZSA2LgotCQkgKiBqdXN0IHNraXAgaXQuICBubyBuZWVkIHRvIHBy b2Nlc3MgaXQgYW5kIGl0J3MgLi4KLQkJICogbGluayBpcyBhbHJlYWR5IGFj Y291bnRlZCBmb3IuCi0JCSAqLwotCi0JCWlmIChsaW5vID09IG9ycGhhbmFn ZV9pbm8gJiYgc3RyY21wKGZuYW1lLCBPUlBIQU5BR0UpID09IDApCi0JCQlj b250aW51ZTsKLQotCQkvKgogCQkgKiBza2lwIGVudHJpZXMgd2l0aCBib2d1 cyBpbnVtYmVycyBpZiB3ZSdyZSBpbiBubyBtb2RpZnkgbW9kZQogCQkgKi8K IAkJaWYgKG5vX21vZGlmeSAmJiB2ZXJpZnlfaW51bShtcCwgbGlubykpCkBA IC0xNDg4LDE4ICsxNTIyLDEyIEBACiAKIAkJaWYgKGlyZWMgPT0gTlVMTCkg IHsKIAkJCW5iYWQrKzsKLQkJCWRvX3dhcm4oCi0JXygiZW50cnkgXCIlc1wi IGluIGRpciBpbm9kZSAlbGx1IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5v ZGUsICIpLAotCQkJCWZuYW1lLCBpbm8pOwotCi0JCQlpZiAoIW5vX21vZGlm eSkgIHsKKwkJCWlmIChlbnRyeV9qdW5rZWQoXygiZW50cnkgXCIlc1wiIGlu IGRpciBpbm9kZSAlbGx1ICIKKwkJCQkJInBvaW50cyB0byBub24tZXhpc3Rl bnQgaW5vZGUgJWxsdSIpLAorCQkJCQlmbmFtZSwgaW5vLCBsaW5vKSkgewog CQkJCW5hbWVzdC0+bmFtZVswXSA9ICcvJzsKIAkJCQkqZGlydHkgPSAxOwot CQkJCWRvX3dhcm4oXygibWFya2luZyBlbnRyeSB0byBiZSBqdW5rZWRcbiIp KTsKLQkJCX0gZWxzZSAgewotCQkJCWRvX3dhcm4oXygid291bGQganVuayBl bnRyeVxuIikpOwogCQkJfQotCiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0x NTExLDUyICsxNTM5LDUxIEBACiAJCSAqIHJlYWxseSBpcyBmcmVlLgogCQkg Ki8KIAkJaWYgKGlzX2lub2RlX2ZyZWUoaXJlYywgaW5vX29mZnNldCkpICB7 Ci0JCQkvKgotCQkJICogZG9uJ3QgY29tcGxhaW4gaWYgdGhpcyBlbnRyeSBw b2ludHMgdG8gdGhlIG9sZAotCQkJICogYW5kIG5vdy1mcmVlIGxvc3QrZm91 bmQgaW5vZGUKLQkJCSAqLwotCQkJaWYgKHZlcmJvc2UgfHwgbm9fbW9kaWZ5 IHx8IGxpbm8gIT0gb2xkX29ycGhhbmFnZV9pbm8pCi0JCQkJZG9fd2FybigK LQkJXygiZW50cnkgXCIlc1wiIGluIGRpciBpbm9kZSAlbGx1IHBvaW50cyB0 byBmcmVlIGlub2RlICVsbHUiKSwKLQkJCQkJZm5hbWUsIGlubywgbGlubyk7 CiAJCQluYmFkKys7Ci0KLQkJCWlmICghbm9fbW9kaWZ5KSAgewotCQkJCWlm ICh2ZXJib3NlIHx8IGxpbm8gIT0gb2xkX29ycGhhbmFnZV9pbm8pCi0JCQkJ CWRvX3dhcm4oCi0JCQkJCV8oIiwgbWFya2luZyBlbnRyeSB0byBiZSBqdW5r ZWRcbiIpKTsKLQotCQkJCWVsc2UKLQkJCQkJZG9fd2FybigiXG4iKTsKKwkJ CWlmIChlbnRyeV9qdW5rZWQoXygiZW50cnkgXCIlc1wiIGluIGRpciBpbm9k ZSAlbGx1ICIKKwkJCQkJInBvaW50cyB0byBmcmVlIGlub2RlICVsbHUiKSwK KwkJCQkJZm5hbWUsIGlubywgbGlubykpIHsKIAkJCQluYW1lc3QtPm5hbWVb MF0gPSAnLyc7CiAJCQkJKmRpcnR5ID0gMTsKLQkJCX0gZWxzZSAgewotCQkJ CWRvX3dhcm4oXygiLCB3b3VsZCBqdW5rIGVudHJ5XG4iKSk7CiAJCQl9Ci0K IAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJLyoKKwkJICogY2hlY2sgaWYgdGhp cyBpbm9kZSBpcyBsb3N0K2ZvdW5kIGRpciBpbiB0aGUgcm9vdAorCQkgKi8K KwkJaWYgKGlubyA9PSBtcC0+bV9zYi5zYl9yb290aW5vICYmIHN0cmNtcChm bmFtZSwgT1JQSEFOQUdFKSA9PSAwKSB7CisJCQkvKiByb290IGlub2RlLCAi bG9zdCtmb3VuZCIsIGlmIGl0J3Mgbm90IGEgZGlyZWN0b3J5LAorCQkJICog dHJhc2ggaXQsIG90aGVyd2lzZSwgYXNzaWduIGl0ICovCisJCQlpZiAoIWlu b2RlX2lzYWRpcihpcmVjLCBpbm9fb2Zmc2V0KSkgeworCQkJCW5iYWQrKzsK KwkJCQlpZiAoZW50cnlfanVua2VkKF8oIiVzIChpbm8gJWxsdSkgaW4gcm9v dCAiCisJCQkJCQkiKCVsbHUpIGlzIG5vdCBhIGRpcmVjdG9yeSIpLAorCQkJ CQkJT1JQSEFOQUdFLCBsaW5vLCBpbm8pKSB7CisJCQkJCW5hbWVzdC0+bmFt ZVswXSA9ICcvJzsKKwkJCQkJKmRpcnR5ID0gMTsKKwkJCQl9CisJCQkJY29u dGludWU7CisJCQl9CisJCQkvKgorCQkJICogaWYgdGhpcyBpcyBhIGR1cCwg aXQgd2lsbCBiZSBwaWNrZWQgdXAgYmVsb3csCisJCQkgKiBvdGhlcndpc2Us IG1hcmsgaXQgYXMgdGhlIG9ycGhhbmFnZSBmb3IgbGF0ZXIuCisJCQkgKi8K KwkJCWlmICghb3JwaGFuYWdlX2lubykKKwkJCQlvcnBoYW5hZ2VfaW5vID0g bGlubzsKKwkJfQorCQkvKgogCQkgKiBjaGVjayBmb3IgZHVwbGljYXRlIG5h bWVzIGluIGRpcmVjdG9yeS4KIAkJICovCiAJCWlmICghZGlyX2hhc2hfYWRk KGhhc2h0YWIsIChkYV9ibm8gPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2cpICsK LQkJCQkJCWVudHJ5LT5uYW1laWR4LAotCQkJCWxpbm8sIGVudHJ5LT5uYW1l bGVuLCBuYW1lc3QtPm5hbWUpKSB7Ci0JCQlkb193YXJuKAotCQlfKCJlbnRy eSBcIiVzXCIgKGlubyAlbGx1KSBpbiBkaXIgJWxsdSBpcyBhIGR1cGxpY2F0 ZSBuYW1lIiksCi0JCQkJZm5hbWUsIGxpbm8sIGlubyk7CisJCQkJZW50cnkt Pm5hbWVpZHgsIGxpbm8sIGVudHJ5LT5uYW1lbGVuLAorCQkJCW5hbWVzdC0+ bmFtZSkpIHsKIAkJCW5iYWQrKzsKLQkJCWlmICghbm9fbW9kaWZ5KSB7Ci0J CQkJaWYgKHZlcmJvc2UpCi0JCQkJCWRvX3dhcm4oCi0JCQkJCV8oIiwgbWFy a2luZyBlbnRyeSB0byBiZSBqdW5rZWRcbiIpKTsKLQkJCQllbHNlCi0JCQkJ CWRvX3dhcm4oIlxuIik7CisJCQlpZiAoZW50cnlfanVua2VkKF8oImVudHJ5 IFwiJXNcIiAoaW5vICVsbHUpIGluIGRpciAiCisJCQkJCSIlbGx1IGlzIGEg ZHVwbGljYXRlIG5hbWUiKSwKKwkJCQkJZm5hbWUsIGxpbm8sIGlubykpIHsK IAkJCQluYW1lc3QtPm5hbWVbMF0gPSAnLyc7CiAJCQkJKmRpcnR5ID0gMTsK LQkJCX0gZWxzZSB7Ci0JCQkJZG9fd2FybihfKCIsIHdvdWxkIGp1bmsgZW50 cnlcbiIpKTsKIAkJCX0KIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0xNjA0LDcg KzE2MzEsNyBAQAogCQkJaWYgKCFub19tb2RpZnkpICB7CiAJCQkJbmFtZXN0 LT5uYW1lWzBdID0gJy8nOwogCQkJCSpkaXJ0eSA9IDE7Ci0JCQkJaWYgKHZl cmJvc2UgfHwgbGlubyAhPSBvbGRfb3JwaGFuYWdlX2lubykKKwkJCQlpZiAo dmVyYm9zZSkKIAkJCQkJZG9fd2FybigKIAkJCQkJXygiXHR3aWxsIGNsZWFy IGVudHJ5IFwiJXNcIlxuIiksCiAJCQkJCQlmbmFtZSk7CkBAIC0yMTU1LDIx ICsyMTgyLDc1IEBACiAJCXB0ciArPSBYRlNfRElSMl9EQVRBX0VOVFNJWkUo ZGVwLT5uYW1lbGVuKTsKIAkJaW51bSA9IElOVF9HRVQoZGVwLT5pbnVtYmVy LCBBUkNIX0NPTlZFUlQpOwogCQlsYXN0ZnJlZSA9IDA7CisKKwkJaXJlYyA9 IGZpbmRfaW5vZGVfcmVjKFhGU19JTk9fVE9fQUdOTyhtcCwgaW51bSksCisJ CQkJCVhGU19JTk9fVE9fQUdJTk8obXAsIGludW0pKTsKKwkJaWYgKGlyZWMg PT0gTlVMTCkgIHsKKwkJCW5iYWQrKzsKKwkJCWlmIChlbnRyeV9qdW5rZWQo XygiZW50cnkgXCIlc1wiIGluIGRpcmVjdG9yeSBpbm9kZSAiCisJCQkJCSIl bGx1IHBvaW50cyB0byBub24tZXhpc3RlbnQgaW5vZGUgJWxsdSIpLAorCQkJ CQlmbmFtZSwgaXAtPmlfaW5vLCBpbnVtKSkgeworCQkJCWRlcC0+bmFtZVsw XSA9ICcvJzsKKwkJCQlsaWJ4ZnNfZGlyMl9kYXRhX2xvZ19lbnRyeSh0cCwg YnAsIGRlcCk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpbm9fb2Zm c2V0ID0gWEZTX0lOT19UT19BR0lOTyhtcCwgaW51bSkgLSBpcmVjLT5pbm9f c3RhcnRudW07CisKKwkJLyoKKwkJICogaWYgaXQncyBhIGZyZWUgaW5vZGUs IGJsb3cgb3V0IHRoZSBlbnRyeS4KKwkJICogYnkgbm93LCBhbnkgaW5vZGUg dGhhdCB3ZSB0aGluayBpcyBmcmVlCisJCSAqIHJlYWxseSBpcyBmcmVlLgor CQkgKi8KKwkJaWYgKGlzX2lub2RlX2ZyZWUoaXJlYywgaW5vX29mZnNldCkp ICB7CisJCQluYmFkKys7CisJCQlpZiAoZW50cnlfanVua2VkKF8oImVudHJ5 IFwiJXNcIiBpbiBkaXJlY3RvcnkgaW5vZGUgIgorCQkJCQkiJWxsdSBwb2lu dHMgdG8gZnJlZSBpbm9kZSAlbGx1IiksCisJCQkJCWZuYW1lLCBpcC0+aV9p bm8sIGludW0pKSB7CisJCQkJZGVwLT5uYW1lWzBdID0gJy8nOworCQkJCWxp Ynhmc19kaXIyX2RhdGFfbG9nX2VudHJ5KHRwLCBicCwgZGVwKTsKKwkJCX0K KwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogY2hlY2sgaWYgdGhp cyBpbm9kZSBpcyBsb3N0K2ZvdW5kIGRpciBpbiB0aGUgcm9vdAorCQkgKi8K KwkJaWYgKGludW0gPT0gbXAtPm1fc2Iuc2Jfcm9vdGlubyAmJiBzdHJjbXAo Zm5hbWUsIE9SUEhBTkFHRSkgPT0gMCkgeworCQkJLyoKKwkJCSAqIGlmIGl0 J3Mgbm90IGEgZGlyZWN0b3J5LCB0cmFzaCBpdAorCQkJICovCisJCQlpZiAo IWlub2RlX2lzYWRpcihpcmVjLCBpbm9fb2Zmc2V0KSkgeworCQkJCW5iYWQr KzsKKwkJCQlpZiAoZW50cnlfanVua2VkKF8oIiVzIChpbm8gJWxsdSkgaW4g cm9vdCAiCisJCQkJCQkiKCVsbHUpIGlzIG5vdCBhIGRpcmVjdG9yeSIpLAor CQkJCQkJT1JQSEFOQUdFLCBpbnVtLCBpcC0+aV9pbm8pKSB7CisJCQkJCWRl cC0+bmFtZVswXSA9ICcvJzsKKwkJCQkJbGlieGZzX2RpcjJfZGF0YV9sb2df ZW50cnkodHAsIGJwLCBkZXApOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJ CX0KKwkJCS8qCisJCQkgKiBpZiB0aGlzIGlzIGEgZHVwLCBpdCB3aWxsIGJl IHBpY2tlZCB1cCBiZWxvdywKKwkJCSAqIG90aGVyd2lzZSwgbWFyayBpdCBh cyB0aGUgb3JwaGFuYWdlIGZvciBsYXRlci4KKwkJCSAqLworCQkJaWYgKCFv cnBoYW5hZ2VfaW5vKQorCQkJCW9ycGhhbmFnZV9pbm8gPSBpbnVtOworCQl9 CisKKwkJLyoKKwkJICogY2hlY2sgZm9yIGR1cGxpY2F0ZSBuYW1lcyBpbiBk aXJlY3RvcnkuCisJCSAqLwogCQlpZiAoIWRpcl9oYXNoX2FkZChoYXNodGFi LCBhZGRyLCBpbnVtLCBkZXAtPm5hbWVsZW4sCiAJCQkJZGVwLT5uYW1lKSkg ewotCQkJZG9fd2FybigKLQkJXygiZW50cnkgXCIlc1wiIChpbm8gJWxsdSkg aW4gZGlyICVsbHUgaXMgYSBkdXBsaWNhdGUgbmFtZSIpLAotCQkJCWZuYW1l LCBpbnVtLCBpcC0+aV9pbm8pOwotCQkJaWYgKCFub19tb2RpZnkpIHsKLQkJ CQlpZiAodmVyYm9zZSkKLQkJCQkJZG9fd2FybigKLQkJCQkJXygiLCBtYXJr aW5nIGVudHJ5IHRvIGJlIGp1bmtlZFxuIikpOwotCQkJCWVsc2UKLQkJCQkJ ZG9fd2FybigiXG4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZG9fd2FybihfKCIs IHdvdWxkIGp1bmsgZW50cnlcbiIpKTsKKwkJCW5iYWQrKzsKKwkJCWlmIChl bnRyeV9qdW5rZWQoXygiZW50cnkgXCIlc1wiIChpbm8gJWxsdSkgaW4gZGly ICIKKwkJCQkJIiVsbHUgaXMgYSBkdXBsaWNhdGUgbmFtZSIpLAorCQkJCQlm bmFtZSwgaW51bSwgaXAtPmlfaW5vKSkgeworCQkJCWRlcC0+bmFtZVswXSA9 ICcvJzsKKwkJCQlsaWJ4ZnNfZGlyMl9kYXRhX2xvZ19lbnRyeSh0cCwgYnAs IGRlcCk7CiAJCQl9Ci0JCQlkZXAtPm5hbWVbMF0gPSAnLyc7CisJCQljb250 aW51ZTsKIAkJfQogCQkvKgogCQkgKiBza2lwIGJvZ3VzIGVudHJpZXMgKGxl YWRpbmcgJy8nKS4gIHRoZXknbGwgYmUgZGVsZXRlZApAQCAtMjIxMiw2OCAr MjI5MywxMSBAQAogCQkJY29udGludWU7CiAJCX0KIAkJLyoKLQkJICogc3Bl Y2lhbCBjYXNlIHRoZSAibG9zdCtmb3VuZCIgZW50cnkgaWYgcG9pbnRpbmcK LQkJICogdG8gd2hlcmUgd2UgdGhpbmsgbG9zdCtmb3VuZCBzaG91bGQgYmUu ICBpZiB0aGF0J3MKLQkJICogdGhlIGNhc2UsIHRoYXQncyB0aGUgb25lIHdl IGNyZWF0ZWQgaW4gcGhhc2UgNi4KLQkJICoganVzdCBza2lwIGl0LiAgbm8g bmVlZCB0byBwcm9jZXNzIGl0IGFuZCBpdCdzIC4uCi0JCSAqIGxpbmsgaXMg YWxyZWFkeSBhY2NvdW50ZWQgZm9yLgotCQkgKi8KLQkJaWYgKGludW0gPT0g b3JwaGFuYWdlX2lubyAmJiBzdHJjbXAoZm5hbWUsIE9SUEhBTkFHRSkgPT0g MCkKLQkJCWNvbnRpbnVlOwotCQkvKgogCQkgKiBza2lwIGVudHJpZXMgd2l0 aCBib2d1cyBpbnVtYmVycyBpZiB3ZSdyZSBpbiBubyBtb2RpZnkgbW9kZQog CQkgKi8KIAkJaWYgKG5vX21vZGlmeSAmJiB2ZXJpZnlfaW51bShtcCwgaW51 bSkpCiAJCQljb250aW51ZTsKIAkJLyoKLQkJICogb2ssIG5vdyBoYW5kbGUg dGhlIHJlc3Qgb2YgdGhlIGNhc2VzIGJlc2lkZXMgJy4nIGFuZCAnLi4nCi0J CSAqLwotCQlpcmVjID0gZmluZF9pbm9kZV9yZWMoWEZTX0lOT19UT19BR05P KG1wLCBpbnVtKSwKLQkJCQkJWEZTX0lOT19UT19BR0lOTyhtcCwgaW51bSkp OwotCQlpZiAoaXJlYyA9PSBOVUxMKSAgewotCQkJbmJhZCsrOwotCQkJZG9f d2FybihfKCJlbnRyeSBcIiVzXCIgaW4gZGlyZWN0b3J5IGlub2RlICVsbHUg cG9pbnRzICIKLQkJCQkgICJ0byBub24tZXhpc3RlbnQgaW5vZGUsICIpLAot CQkJCWZuYW1lLCBpcC0+aV9pbm8pOwotCQkJaWYgKCFub19tb2RpZnkpICB7 Ci0JCQkJZGVwLT5uYW1lWzBdID0gJy8nOwotCQkJCWxpYnhmc19kaXIyX2Rh dGFfbG9nX2VudHJ5KHRwLCBicCwgZGVwKTsKLQkJCQlkb193YXJuKF8oIm1h cmtpbmcgZW50cnkgdG8gYmUganVua2VkXG4iKSk7Ci0JCQl9IGVsc2UgIHsK LQkJCQlkb193YXJuKF8oIndvdWxkIGp1bmsgZW50cnlcbiIpKTsKLQkJCX0K LQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlub19vZmZzZXQgPSBYRlNfSU5PX1RP X0FHSU5PKG1wLCBpbnVtKSAtIGlyZWMtPmlub19zdGFydG51bTsKLQkJLyoK LQkJICogaWYgaXQncyBhIGZyZWUgaW5vZGUsIGJsb3cgb3V0IHRoZSBlbnRy eS4KLQkJICogYnkgbm93LCBhbnkgaW5vZGUgdGhhdCB3ZSB0aGluayBpcyBm cmVlCi0JCSAqIHJlYWxseSBpcyBmcmVlLgotCQkgKi8KLQkJaWYgKGlzX2lu b2RlX2ZyZWUoaXJlYywgaW5vX29mZnNldCkpICB7Ci0JCQkvKgotCQkJICog ZG9uJ3QgY29tcGxhaW4gaWYgdGhpcyBlbnRyeSBwb2ludHMgdG8gdGhlIG9s ZAotCQkJICogYW5kIG5vdy1mcmVlIGxvc3QrZm91bmQgaW5vZGUKLQkJCSAq LwotCQkJaWYgKHZlcmJvc2UgfHwgbm9fbW9kaWZ5IHx8IGludW0gIT0gb2xk X29ycGhhbmFnZV9pbm8pCi0JCQkJZG9fd2FybigKLQlfKCJlbnRyeSBcIiVz XCIgaW4gZGlyZWN0b3J5IGlub2RlICVsbHUgcG9pbnRzIHRvIGZyZWUgaW5v ZGUgJWxsdSIpLAotCQkJCQlmbmFtZSwgaXAtPmlfaW5vLCBpbnVtKTsKLQkJ CW5iYWQrKzsKLQkJCWlmICghbm9fbW9kaWZ5KSAgewotCQkJCWlmICh2ZXJi b3NlIHx8IGludW0gIT0gb2xkX29ycGhhbmFnZV9pbm8pCi0JCQkJCWRvX3dh cm4oCi0JCQkJCV8oIiwgbWFya2luZyBlbnRyeSB0byBiZSBqdW5rZWRcbiIp KTsKLQkJCQllbHNlCi0JCQkJCWRvX3dhcm4oIlxuIik7Ci0JCQkJZGVwLT5u YW1lWzBdID0gJy8nOwotCQkJCWxpYnhmc19kaXIyX2RhdGFfbG9nX2VudHJ5 KHRwLCBicCwgZGVwKTsKLQkJCX0gZWxzZSAgewotCQkJCWRvX3dhcm4oXygi LCB3b3VsZCBqdW5rIGVudHJ5XG4iKSk7Ci0JCQl9Ci0JCQljb250aW51ZTsK LQkJfQotCQkvKgogCQkgKiBjaGVjayBlYXN5IGNhc2UgZmlyc3QsIHJlZ3Vs YXIgaW5vZGUsIGp1c3QgYnVtcAogCQkgKiB0aGUgbGluayBjb3VudCBhbmQg Y29udGludWUKIAkJICovCkBAIC0yMzEyLDcgKzIzMzYsNyBAQAogCQkJaWYg KCFub19tb2RpZnkpICB7CiAJCQkJZGVwLT5uYW1lWzBdID0gJy8nOwogCQkJ CWxpYnhmc19kaXIyX2RhdGFfbG9nX2VudHJ5KHRwLCBicCwgZGVwKTsKLQkJ CQlpZiAodmVyYm9zZSB8fCBpbnVtICE9IG9sZF9vcnBoYW5hZ2VfaW5vKQor CQkJCWlmICh2ZXJib3NlKQogCQkJCQlkb193YXJuKAogCQkJCQlfKCJcdHdp bGwgY2xlYXIgZW50cnkgXCIlc1wiXG4iKSwKIAkJCQkJCWZuYW1lKTsKQEAg LTI3NjcsMzYgKzI3OTEsMTQgQEAKIAkJQVNTRVJUKG5vX21vZGlmeSB8fCBs aW5vICE9IE5VTExGU0lOTyk7CiAJCUFTU0VSVChub19tb2RpZnkgfHwgIXZl cmlmeV9pbnVtKG1wLCBsaW5vKSk7CiAKLQkJLyoKLQkJICogc3BlY2lhbCBj YXNlIHRoZSAibG9zdCtmb3VuZCIgZW50cnkgaWYgaXQncyBwb2ludGluZwot CQkgKiB0byB3aGVyZSB3ZSB0aGluayBsb3N0K2ZvdW5kIHNob3VsZCBiZS4g IGlmIHRoYXQncwotCQkgKiB0aGUgY2FzZSwgdGhhdCdzIHRoZSBvbmUgd2Ug Y3JlYXRlZCBpbiBwaGFzZSA2LgotCQkgKiBqdXN0IHNraXAgaXQuICBubyBu ZWVkIHRvIHByb2Nlc3MgaXQgYW5kIGl0cyAuLgotCQkgKiBsaW5rIGlzIGFs cmVhZHkgYWNjb3VudGVkIGZvci4gIEFsc28gc2tpcCBlbnRyaWVzCi0JCSAq IHdpdGggYm9ndXMgaW5vZGUgbnVtYmVycyBpZiB3ZSdyZSBpbiBubyBtb2Rp ZnkgbW9kZS4KLQkJICovCi0KLQkJaWYgKChsaW5vID09IG9ycGhhbmFnZV9p bm8gJiYgc3RyY21wKGZuYW1lLCBPUlBIQU5BR0UpID09IDApCi0JCQkJfHwg KG5vX21vZGlmeSAmJiB2ZXJpZnlfaW51bShtcCwgbGlubykpKSB7Ci0JCQlu ZXh0X3NmZSA9ICh4ZnNfZGlyX3NmX2VudHJ5X3QgKikKLQkJCQkoKF9fcHNp bnRfdCkgc2ZfZW50cnkgKwotCQkJCVhGU19ESVJfU0ZfRU5UU0laRV9CWUVO VFJZKHNmX2VudHJ5KSk7Ci0JCQljb250aW51ZTsKLQkJfQotCiAJCWlyZWMg PSBmaW5kX2lub2RlX3JlYyhYRlNfSU5PX1RPX0FHTk8obXAsIGxpbm8pLAog CQkJCQlYRlNfSU5PX1RPX0FHSU5PKG1wLCBsaW5vKSk7Ci0KLQkJaWYgKGly ZWMgPT0gTlVMTCAmJiBub19tb2RpZnkpICB7Ci0JCQlkb193YXJuKAotXygi ZW50cnkgXCIlc1wiIGluIHNob3J0Zm9ybSBkaXIgJWxsdSByZWZlcmVuY2Vz IG5vbi1leGlzdGVudCBpbm8gJWxsdVxuIiksCisJCWlmIChpcmVjID09IE5V TEwpIHsKKwkJCWRvX3dhcm4oXygiZW50cnkgXCIlc1wiIGluIHNob3J0Zm9y bSBkaXIgJWxsdSAiCisJCQkJInJlZmVyZW5jZXMgbm9uLWV4aXN0ZW50IGlu byAlbGx1IiksCiAJCQkJZm5hbWUsIGlubywgbGlubyk7Ci0JCQlkb193YXJu KF8oIndvdWxkIGp1bmsgZW50cnlcbiIpKTsKLQkJCWNvbnRpbnVlOworCQkJ Z290byBkb19qdW5raXQ7CiAJCX0KLQotCQlBU1NFUlQoaXJlYyAhPSBOVUxM KTsKLQogCQlpbm9fb2Zmc2V0ID0gWEZTX0lOT19UT19BR0lOTyhtcCwgbGlu bykgLSBpcmVjLT5pbm9fc3RhcnRudW07CiAKIAkJLyoKQEAgLTI4MDQsNDIg KzI4MDYsNDIgQEAKIAkJICogYnkgbm93LCBhbnkgaW5vZGUgdGhhdCB3ZSB0 aGluayBpcyBmcmVlCiAJCSAqIHJlYWxseSBpcyBmcmVlLgogCQkgKi8KLQkJ aWYgKGlzX2lub2RlX2ZyZWUoaXJlYywgaW5vX29mZnNldCkpICB7CisJCWlm ICghaXNfaW5vZGVfZnJlZShpcmVjLCBpbm9fb2Zmc2V0KSkgIHsKKwkJCWRv X3dhcm4oXygiZW50cnkgXCIlc1wiIGluIHNob3J0Zm9ybSBkaXIgaW5vZGUg JWxsdSAiCisJCQkJInBvaW50cyB0byBmcmVlIGlub2RlICVsbHUiKSwgZm5h bWUsIGlubywgbGlubyk7CisJCQlnb3RvIGRvX2p1bmtpdDsKKwkJfQorCQkv KgorCQkgKiBjaGVjayBpZiB0aGlzIGlub2RlIGlzIGxvc3QrZm91bmQgZGly IGluIHRoZSByb290CisJCSAqLworCQlpZiAoaW5vID09IG1wLT5tX3NiLnNi X3Jvb3Rpbm8gJiYgc3RyY21wKGZuYW1lLCBPUlBIQU5BR0UpID09IDApIHsK IAkJCS8qCi0JCQkgKiBkb24ndCBjb21wbGFpbiBpZiB0aGlzIGVudHJ5IHBv aW50cyB0byB0aGUgb2xkCi0JCQkgKiBhbmQgbm93LWZyZWUgbG9zdCtmb3Vu ZCBpbm9kZQorCQkJICogaWYgaXQncyBub3QgYSBkaXJlY3RvcnksIHRyYXNo IGl0CiAJCQkgKi8KLQkJCWlmICh2ZXJib3NlIHx8IG5vX21vZGlmeSB8fCBs aW5vICE9IG9sZF9vcnBoYW5hZ2VfaW5vKQotCQkJCWRvX3dhcm4oCi1fKCJl bnRyeSBcIiVzXCIgaW4gc2hvcnRmb3JtIGRpciBpbm9kZSAlbGx1IHBvaW50 cyB0byBmcmVlIGlub2RlICVsbHVcbiIpLAotCQkJCQlmbmFtZSwgaW5vLCBs aW5vKTsKLQotCQkJaWYgKCFub19tb2RpZnkpICB7Ci0JCQkJanVua2l0ID0g MTsKLQkJCX0gZWxzZSAgewotCQkJCWRvX3dhcm4oXygid291bGQganVuayBl bnRyeSBcIiVzXCJcbiIpLAotCQkJCQlmbmFtZSk7CisJCQlpZiAoIWlub2Rl X2lzYWRpcihpcmVjLCBpbm9fb2Zmc2V0KSkgeworCQkJCWRvX3dhcm4oXygi JXMgKGlubyAlbGx1KSBpbiByb290ICglbGx1KSBpcyBub3QgIgorCQkJCQki YSBkaXJlY3RvcnkiKSwgT1JQSEFOQUdFLCBsaW5vLCBpbm8pOworCQkJCWdv dG8gZG9fanVua2l0OwogCQkJfQotCQl9IGVsc2UgaWYgKCFkaXJfaGFzaF9h ZGQoaGFzaHRhYiwKLQkJCQkoeGZzX2RpcjJfZGF0YXB0cl90KShzZl9lbnRy eSAtICZzZi0+bGlzdFswXSksCi0JCQkJbGlubywgc2ZfZW50cnktPm5hbWVs ZW4sIHNmX2VudHJ5LT5uYW1lKSkgewogCQkJLyoKLQkJCSAqIGNoZWNrIGZv ciBkdXBsaWNhdGUgbmFtZXMgaW4gZGlyZWN0b3J5LgorCQkJICogaWYgdGhp cyBpcyBhIGR1cCwgaXQgd2lsbCBiZSBwaWNrZWQgdXAgYmVsb3csCisJCQkg KiBvdGhlcndpc2UsIG1hcmsgaXQgYXMgdGhlIG9ycGhhbmFnZSBmb3IgbGF0 ZXIuCiAJCQkgKi8KLQkJCWRvX3dhcm4oCi0JCV8oImVudHJ5IFwiJXNcIiAo aW5vICVsbHUpIGluIGRpciAlbGx1IGlzIGEgZHVwbGljYXRlIG5hbWUiKSwK LQkJCQlmbmFtZSwgbGlubywgaW5vKTsKLQkJCWlmICghbm9fbW9kaWZ5KSB7 Ci0JCQkJanVua2l0ID0gMTsKLQkJCQlpZiAodmVyYm9zZSkKLQkJCQkJZG9f d2FybigKLQkJCQkJXygiLCBtYXJraW5nIGVudHJ5IHRvIGJlIGp1bmtlZFxu IikpOwotCQkJCWVsc2UKLQkJCQkJZG9fd2FybigiXG4iKTsKLQkJCX0gZWxz ZSB7Ci0JCQkJZG9fd2FybihfKCIsIHdvdWxkIGp1bmsgZW50cnlcbiIpKTsK LQkJCX0KLQkJfSBlbHNlIGlmICghaW5vZGVfaXNhZGlyKGlyZWMsIGlub19v ZmZzZXQpKSAgeworCQkJaWYgKCFvcnBoYW5hZ2VfaW5vKQorCQkJCW9ycGhh bmFnZV9pbm8gPSBsaW5vOworCQl9CisJCS8qCisJCSAqIGNoZWNrIGZvciBk dXBsaWNhdGUgbmFtZXMgaW4gZGlyZWN0b3J5LgorCQkgKi8KKwkJaWYgKCFk aXJfaGFzaF9hZGQoaGFzaHRhYiwKKwkJCQkoeGZzX2RpcjJfZGF0YXB0cl90 KShzZl9lbnRyeSAtICZzZi0+bGlzdFswXSksCisJCQkJbGlubywgc2ZfZW50 cnktPm5hbWVsZW4sIHNmX2VudHJ5LT5uYW1lKSkgeworCQkJZG9fd2Fybihf KCJlbnRyeSBcIiVzXCIgKGlubyAlbGx1KSBpbiBkaXIgJWxsdSBpcyBhICIK KwkJCQkiZHVwbGljYXRlIG5hbWUiKSwgZm5hbWUsIGxpbm8sIGlubyk7CisJ CQlnb3RvIGRvX2p1bmtpdDsKKwkJfQorCisJCWlmICghaW5vZGVfaXNhZGly KGlyZWMsIGlub19vZmZzZXQpKSAgewogCQkJLyoKIAkJCSAqIGNoZWNrIGVh c3kgY2FzZSBmaXJzdCwgcmVndWxhciBpbm9kZSwganVzdCBidW1wCiAJCQkg KiB0aGUgbGluayBjb3VudCBhbmQgY29udGludWUKQEAgLTI4NjAsOCArMjg2 Miw4IEBACiAJCQkgKi8KIAkJCWlmIChpc19pbm9kZV9yZWFjaGVkKGlyZWMs IGlub19vZmZzZXQpKSAgewogCQkJCWp1bmtpdCA9IDE7Ci0JCQkJZG9fd2Fy bigKLV8oImVudHJ5IFwiJXNcIiBpbiBkaXIgJWxsdSByZWZlcmVuY2VzIGFs cmVhZHkgY29ubmVjdGVkIGRpciBpbm8gJWxsdSxcbiIpLAorCQkJCWRvX3dh cm4oXygiZW50cnkgXCIlc1wiIGluIGRpciAlbGx1IHJlZmVyZW5jZXMgIgor CQkJCQkiYWxyZWFkeSBjb25uZWN0ZWQgZGlyIGlubyAlbGx1LFxuIiksCiAJ CQkJCWZuYW1lLCBpbm8sIGxpbm8pOwogCQkJfSBlbHNlIGlmIChwYXJlbnQg PT0gaW5vKSAgewogCQkJCWFkZF9pbm9kZV9yZWFjaGVkKGlyZWMsIGlub19v ZmZzZXQpOwpAQCAtMjg3MiwxMyArMjg3NCwxNCBAQAogCQkJCQlwdXNoX2Rp cihzdGFjaywgbGlubyk7CiAJCQl9IGVsc2UgIHsKIAkJCQlqdW5raXQgPSAx OwotCQkJCWRvX3dhcm4oCi1fKCJlbnRyeSBcIiVzXCIgaW4gZGlyICVsbHUg bm90IGNvbnNpc3RlbnQgd2l0aCAuLiB2YWx1ZSAoJWxsdSkgaW4gZGlyIGlu byAlbGx1LFxuIiksCisJCQkJZG9fd2FybihfKCJlbnRyeSBcIiVzXCIgaW4g ZGlyICVsbHUgbm90ICIKKwkJCQkJImNvbnNpc3RlbnQgd2l0aCAuLiB2YWx1 ZSAoJWxsdSkgaW4gIgorCQkJCQkiZGlyIGlubyAlbGx1IiksCiAJCQkJCWZu YW1lLCBpbm8sIHBhcmVudCwgbGlubyk7CiAJCQl9CiAJCX0KLQogCQlpZiAo anVua2l0KSAgeworZG9fanVua2l0OgogCQkJaWYgKCFub19tb2RpZnkpICB7 CiAJCQkJdG1wX2VsZW4gPSBYRlNfRElSX1NGX0VOVFNJWkVfQllFTlRSWShz Zl9lbnRyeSk7CiAJCQkJdG1wX3NmZSA9ICh4ZnNfZGlyX3NmX2VudHJ5X3Qg KikKQEAgLTI5MTAsMTIgKzI5MTMsMTIgQEAKIAogCQkJCSppbm9fZGlydHkg PSAxOwogCi0JCQkJaWYgKHZlcmJvc2UgfHwgbGlubyAhPSBvbGRfb3JwaGFu YWdlX2lubykKLQkJCQkJZG9fd2FybigKLQkJCV8oImp1bmtpbmcgZW50cnkg XCIlc1wiIGluIGRpcmVjdG9yeSBpbm9kZSAlbGx1XG4iKSwKLQkJCQkJCWZu YW1lLCBsaW5vKTsKKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJZG9fd2Fybihf KCJqdW5raW5nIGVudHJ5XG4iKSk7CisJCQkJZWxzZQorCQkJCQlkb193YXJu KCJcbiIpOwogCQkJfSBlbHNlICB7Ci0JCQkJZG9fd2FybihfKCJ3b3VsZCBq dW5rIGVudHJ5IFwiJXNcIlxuIiksIGZuYW1lKTsKKwkJCQlkb193YXJuKF8o IndvdWxkIGp1bmsgZW50cnlcbiIpLCBmbmFtZSk7CiAJCQl9CiAJCX0KIApA QCAtMzE3NCwyMyArMzE3Nyw2IEBACiAJCUFTU0VSVChub19tb2RpZnkgfHwg IXZlcmlmeV9pbnVtKG1wLCBsaW5vKSk7CiAKIAkJLyoKLQkJICogc3BlY2lh bCBjYXNlIHRoZSAibG9zdCtmb3VuZCIgZW50cnkgaWYgaXQncyBwb2ludGlu ZwotCQkgKiB0byB3aGVyZSB3ZSB0aGluayBsb3N0K2ZvdW5kIHNob3VsZCBi ZS4gIGlmIHRoYXQncwotCQkgKiB0aGUgY2FzZSwgdGhhdCdzIHRoZSBvbmUg d2UgY3JlYXRlZCBpbiBwaGFzZSA2LgotCQkgKiBqdXN0IHNraXAgaXQuICBu byBuZWVkIHRvIHByb2Nlc3MgaXQgYW5kIGl0cyAuLgotCQkgKiBsaW5rIGlz IGFscmVhZHkgYWNjb3VudGVkIGZvci4KLQkJICovCi0KLQkJaWYgKGxpbm8g PT0gb3JwaGFuYWdlX2lubyAmJiBzdHJjbXAoZm5hbWUsIE9SUEhBTkFHRSkg PT0gMCkgewotCQkJaWYgKGxpbm8gPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5V TSkKLQkJCQlpOCsrOwotCQkJbmV4dF9zZmVwID0gKHhmc19kaXIyX3NmX2Vu dHJ5X3QgKikKLQkJCQkoKF9fcHNpbnRfdCkgc2ZlcCArCi0JCQkJWEZTX0RJ UjJfU0ZfRU5UU0laRV9CWUVOVFJZKHNmcCwgc2ZlcCkpOwotCQkJY29udGlu dWU7Ci0JCX0KLQotCQkvKgogCQkgKiBBbHNvIHNraXAgZW50cmllcyB3aXRo IGJvZ3VzIGlub2RlIG51bWJlcnMgaWYgd2UncmUKIAkJICogaW4gbm8gbW9k aWZ5IG1vZGUuCiAJCSAqLwpAQCAtMzIwNSwxNiArMzE5MSwxMyBAQAogCQlp cmVjID0gZmluZF9pbm9kZV9yZWMoWEZTX0lOT19UT19BR05PKG1wLCBsaW5v KSwKIAkJCQkJWEZTX0lOT19UT19BR0lOTyhtcCwgbGlubykpOwogCi0JCWlm IChpcmVjID09IE5VTEwgJiYgbm9fbW9kaWZ5KSAgeworCQlpZiAoaXJlYyA9 PSBOVUxMKSAgewogCQkJZG9fd2FybihfKCJlbnRyeSBcIiVzXCIgaW4gc2hv cnRmb3JtIGRpcmVjdG9yeSAlbGx1ICIKLQkJCQkgICJyZWZlcmVuY2VzIG5v bi1leGlzdGVudCBpbm9kZSAlbGx1XG4iKSwKKwkJCQkgICJyZWZlcmVuY2Vz IG5vbi1leGlzdGVudCBpbm9kZSAlbGx1IiksCiAJCQkJZm5hbWUsIGlubywg bGlubyk7Ci0JCQlkb193YXJuKF8oIndvdWxkIGp1bmsgZW50cnlcbiIpKTsK LQkJCWNvbnRpbnVlOworCQkJZ290byBkb19qdW5raXQ7CiAJCX0KIAotCQlB U1NFUlQoaXJlYyAhPSBOVUxMKTsKLQogCQlpbm9fb2Zmc2V0ID0gWEZTX0lO T19UT19BR0lOTyhtcCwgbGlubykgLSBpcmVjLT5pbm9fc3RhcnRudW07CiAK IAkJLyoKQEAgLTMyMjMsNDIgKzMyMDYsNDEgQEAKIAkJICogcmVhbGx5IGlz IGZyZWUuCiAJCSAqLwogCQlpZiAoaXNfaW5vZGVfZnJlZShpcmVjLCBpbm9f b2Zmc2V0KSkgIHsKKwkJCWRvX3dhcm4oXygiZW50cnkgXCIlc1wiIGluIHNo b3J0Zm9ybSBkaXJlY3RvcnkgIgorCQkJCSAgImlub2RlICVsbHUgcG9pbnRz IHRvIGZyZWUgaW5vZGUgJWxsdSIpLAorCQkJCWZuYW1lLCBpbm8sIGxpbm8p OworCQkJZ290byBkb19qdW5raXQ7CisJCX0KKwkJLyoKKwkJICogY2hlY2sg aWYgdGhpcyBpbm9kZSBpcyBsb3N0K2ZvdW5kIGRpciBpbiB0aGUgcm9vdAor CQkgKi8KKwkJaWYgKGlubyA9PSBtcC0+bV9zYi5zYl9yb290aW5vICYmIHN0 cmNtcChmbmFtZSwgT1JQSEFOQUdFKSA9PSAwKSB7CiAJCQkvKgotCQkJICog ZG9uJ3QgY29tcGxhaW4gaWYgdGhpcyBlbnRyeSBwb2ludHMgdG8gdGhlIG9s ZAotCQkJICogYW5kIG5vdy1mcmVlIGxvc3QrZm91bmQgaW5vZGUKKwkJCSAq IGlmIGl0J3Mgbm90IGEgZGlyZWN0b3J5LCB0cmFzaCBpdAogCQkJICovCi0J CQlpZiAodmVyYm9zZSB8fCBub19tb2RpZnkgfHwgbGlubyAhPSBvbGRfb3Jw aGFuYWdlX2lubykKLQkJCQlkb193YXJuKF8oImVudHJ5IFwiJXNcIiBpbiBz aG9ydGZvcm0gZGlyZWN0b3J5ICIKLQkJCQkJICAiaW5vZGUgJWxsdSBwb2lu dHMgdG8gZnJlZSBpbm9kZSAiCi0JCQkJCSAgIiVsbHVcbiIpLAotCQkJCQlm bmFtZSwgaW5vLCBsaW5vKTsKLQotCQkJaWYgKCFub19tb2RpZnkpICB7Ci0J CQkJanVua2l0ID0gMTsKLQkJCX0gZWxzZSAgewotCQkJCWRvX3dhcm4oXygi d291bGQganVuayBlbnRyeSBcIiVzXCJcbiIpLAotCQkJCQlmbmFtZSk7CisJ CQlpZiAoIWlub2RlX2lzYWRpcihpcmVjLCBpbm9fb2Zmc2V0KSkgeworCQkJ CWRvX3dhcm4oXygiJXMgKGlubyAlbGx1KSBpbiByb290ICglbGx1KSBpcyBu b3QgIgorCQkJCQkiYSBkaXJlY3RvcnkiKSwgT1JQSEFOQUdFLCBsaW5vLCBp bm8pOworCQkJCWdvdG8gZG9fanVua2l0OwogCQkJfQotCQl9IGVsc2UgaWYg KCFkaXJfaGFzaF9hZGQoaGFzaHRhYiwgKHhmc19kaXIyX2RhdGFwdHJfdCkK LQkJCQkJKHNmZXAgLSBYRlNfRElSMl9TRl9GSVJTVEVOVFJZKHNmcCkpLAot CQkJCWxpbm8sIHNmZXAtPm5hbWVsZW4sIHNmZXAtPm5hbWUpKSB7CiAJCQkv KgotCQkJICogY2hlY2sgZm9yIGR1cGxpY2F0ZSBuYW1lcyBpbiBkaXJlY3Rv cnkuCisJCQkgKiBpZiB0aGlzIGlzIGEgZHVwLCBpdCB3aWxsIGJlIHBpY2tl ZCB1cCBiZWxvdywKKwkJCSAqIG90aGVyd2lzZSwgbWFyayBpdCBhcyB0aGUg b3JwaGFuYWdlIGZvciBsYXRlci4KIAkJCSAqLwotCQkJZG9fd2FybigKLQkJ XygiZW50cnkgXCIlc1wiIChpbm8gJWxsdSkgaW4gZGlyICVsbHUgaXMgYSBk dXBsaWNhdGUgbmFtZSIpLAotCQkJCWZuYW1lLCBsaW5vLCBpbm8pOwotCQkJ aWYgKCFub19tb2RpZnkpIHsKLQkJCQlqdW5raXQgPSAxOwotCQkJCWlmICh2 ZXJib3NlKQotCQkJCQlkb193YXJuKAotCQkJCQlfKCIsIG1hcmtpbmcgZW50 cnkgdG8gYmUganVua2VkXG4iKSk7Ci0JCQkJZWxzZQotCQkJCQlkb193YXJu KCJcbiIpOwotCQkJfSBlbHNlIHsKLQkJCQlkb193YXJuKF8oIiwgd291bGQg anVuayBlbnRyeVxuIikpOwotCQkJfQotCQl9IGVsc2UgaWYgKCFpbm9kZV9p c2FkaXIoaXJlYywgaW5vX29mZnNldCkpICB7CisJCQlpZiAoIW9ycGhhbmFn ZV9pbm8pCisJCQkJb3JwaGFuYWdlX2lubyA9IGxpbm87CisJCX0KKwkJLyoK KwkJICogY2hlY2sgZm9yIGR1cGxpY2F0ZSBuYW1lcyBpbiBkaXJlY3Rvcnku CisJCSAqLworCQlpZiAoIWRpcl9oYXNoX2FkZChoYXNodGFiLCAoeGZzX2Rp cjJfZGF0YXB0cl90KQorCQkJCQkoc2ZlcCAtIFhGU19ESVIyX1NGX0ZJUlNU RU5UUlkoc2ZwKSksCisJCQkJbGlubywgc2ZlcC0+bmFtZWxlbiwgc2ZlcC0+ bmFtZSkpIHsKKwkJCWRvX3dhcm4oXygiZW50cnkgXCIlc1wiIChpbm8gJWxs dSkgaW4gZGlyICVsbHUgaXMgYSAiCisJCQkJImR1cGxpY2F0ZSBuYW1lIiks IGZuYW1lLCBsaW5vLCBpbm8pOworCQkJZ290byBkb19qdW5raXQ7CisJCX0K KwkJaWYgKCFpbm9kZV9pc2FkaXIoaXJlYywgaW5vX29mZnNldCkpICB7CiAJ CQkvKgogCQkJICogY2hlY2sgZWFzeSBjYXNlIGZpcnN0LCByZWd1bGFyIGlu b2RlLCBqdXN0IGJ1bXAKIAkJCSAqIHRoZSBsaW5rIGNvdW50CkBAIC0zMjk1 LDYgKzMyNzcsNyBAQAogCQl9CiAKIAkJaWYgKGp1bmtpdCkgIHsKK2RvX2p1 bmtpdDoKIAkJCWlmICghbm9fbW9kaWZ5KSAgewogCQkJCXRtcF9lbGVuID0g WEZTX0RJUjJfU0ZfRU5UU0laRV9CWUVOVFJZKHNmcCwgc2ZlcCk7CiAJCQkJ dG1wX3NmZXAgPSAoeGZzX2RpcjJfc2ZfZW50cnlfdCAqKQpAQCAtMzMyNiwx MiArMzMwOSwxMiBAQAogCiAJCQkJKmlub19kaXJ0eSA9IDE7CiAKLQkJCQlp ZiAodmVyYm9zZSB8fCBsaW5vICE9IG9sZF9vcnBoYW5hZ2VfaW5vKQotCQkJ CQlkb193YXJuKF8oImp1bmtpbmcgZW50cnkgXCIlc1wiIGluICIKLQkJCQkJ CSAgImRpcmVjdG9yeSBpbm9kZSAlbGx1XG4iKSwKLQkJCQkJCWZuYW1lLCBs aW5vKTsKKwkJCQlpZiAodmVyYm9zZSkKKwkJCQkJZG9fd2FybihfKCJqdW5r aW5nIGVudHJ5XG4iKSk7CisJCQkJZWxzZQorCQkJCQlkb193YXJuKCJcbiIp OwogCQkJfSBlbHNlICB7Ci0JCQkJZG9fd2FybihfKCJ3b3VsZCBqdW5rIGVu dHJ5IFwiJXNcIlxuIiksIGZuYW1lKTsKKwkJCQlkb193YXJuKF8oIndvdWxk IGp1bmsgZW50cnlcbiIpKTsKIAkJCX0KIAkJfSBlbHNlIGlmIChsaW5vID4g WEZTX0RJUjJfTUFYX1NIT1JUX0lOVU0pCiAJCQlpOCsrOwpAQCAtMzQ2NSwy NSArMzQ0OCw2IEBACiAJCQkgKiBndWFyYW50ZWVkIGJ5IHBoYXNlIDMgYW5k L29yIGJlbG93LgogCQkJICovCiAJCQlhZGRfaW5vZGVfcmVhY2hlZChpcmVj LCBpbm9fb2Zmc2V0KTsKLQkJCS8qCi0JCQkgKiBhY2NvdW50IGZvciBsaW5r IGZvciB0aGUgb3JwaGFuYWdlCi0JCQkgKiAibG9zdCtmb3VuZCIuICBpZiB3 ZSdyZSBydW5uaW5nIGluCi0JCQkgKiBtb2RpZnkgbW9kZSBhbmQgaXQgYWxy ZWFkeSBleGlzdGVkLAotCQkJICogd2UgZGVsZXRlZCBpdCBzbyBpdCdzICcu LicgcmVmZXJlbmNlCi0JCQkgKiBuZXZlciBnb3QgY291bnRlZC4gIHNvIGFk ZCBpdCBoZXJlIGlmCi0JCQkgKiB3ZSdyZSBnb2luZyB0byBjcmVhdGUgbG9z dCtmb3VuZC4KLQkJCSAqCi0JCQkgKiBpZiB3ZSdyZSBydW5uaW5nIGluIG5v X21vZGlmeSBtb2RlLAotCQkJICogd2UgbmV2ZXIgZGVsZXRlZCBsb3N0K2Zv dW5kIGFuZCB3ZSdyZQotCQkJICogbm90IGdvaW5nIHRvIGNyZWF0ZSBpdCBz byBkbyBub3RoaW5nLgotCQkJICoKLQkJCSAqIGVpdGhlciB3YXksIHRoZSBj b3VudHMgd2lsbCBtYXRjaCB3aGVuCi0JCQkgKiB3ZSBsb29rIGF0IHRoZSBy b290IGlub2RlJ3MgbmxpbmtzCi0JCQkgKiBmaWVsZCBhbmQgY29tcGFyZSB0 aGF0IHRvIG91ciBpbmNvcmUKLQkJCSAqIGNvdW50IGluIHBoYXNlIDcuCi0J CQkgKi8KLQkJCWlmICghbm9fbW9kaWZ5KQotCQkJCWFkZF9pbm9kZV9yZWYo aXJlYywgaW5vX29mZnNldCk7CiAJCX0KIAogCQlhZGRfaW5vZGVfcmVmY2hl Y2tlZChpbm8sIGlyZWMsIGlub19vZmZzZXQpOwpAQCAtMzU2MiwzNiArMzUy Niw2IEBACiAKIAkJaGFzaHZhbCA9IDA7CiAKLQkJaWYgKCFub19tb2RpZnkg JiYgIW9ycGhhbmFnZV9lbnRlcmVkICYmCi0JCSAgICBpbm8gPT0gbXAtPm1f c2Iuc2Jfcm9vdGlubykgewotCQkJZG9fd2FybihfKCJyZS1lbnRlcmluZyAl cyBpbnRvIHJvb3QgZGlyZWN0b3J5XG4iKSwKLQkJCQlPUlBIQU5BR0UpOwot CQkJdHAgPSBsaWJ4ZnNfdHJhbnNfYWxsb2MobXAsIDApOwotCQkJbnJlcyA9 IFhGU19NS0RJUl9TUEFDRV9SRVMobXAsIHN0cmxlbihPUlBIQU5BR0UpKTsK LQkJCWVycm9yID0gbGlieGZzX3RyYW5zX3Jlc2VydmUodHAsIG5yZXMsCi0J CQkJCVhGU19NS0RJUl9MT0dfUkVTKG1wKSwgMCwKLQkJCQkJWEZTX1RSQU5T X1BFUk1fTE9HX1JFUywKLQkJCQkJWEZTX01LRElSX0xPR19DT1VOVCk7Ci0J CQlpZiAoZXJyb3IpCi0JCQkJcmVzX2ZhaWxlZChlcnJvcik7Ci0JCQlsaWJ4 ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCAwKTsKLQkJCWxpYnhmc190cmFuc19p aG9sZCh0cCwgaXApOwotCQkJWEZTX0JNQVBfSU5JVCgmZmxpc3QsICZmaXJz dCk7Ci0JCQlpZiAoKGVycm9yID0gZGlyX2NyZWF0ZW5hbWUobXAsIHRwLCBp cCwgT1JQSEFOQUdFLAotCQkJCQkJc3RybGVuKE9SUEhBTkFHRSksCi0JCQkJ CQlvcnBoYW5hZ2VfaW5vLCAmZmlyc3QsICZmbGlzdCwKLQkJCQkJCW5yZXMp KSkKLQkJCQlkb19lcnJvcihfKCJjYW4ndCBtYWtlICVzIGVudHJ5IGluIHJv b3QgaW5vZGUgIgotCQkJCQkgICAiJWxsdSwgY3JlYXRlbmFtZSBlcnJvciAl ZFxuIiksCi0JCQkJCU9SUEhBTkFHRSwgaW5vLCBlcnJvcik7Ci0JCQlsaWJ4 ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7Ci0J CQllcnJvciA9IGxpYnhmc19ibWFwX2ZpbmlzaCgmdHAsICZmbGlzdCwgZmly c3QsICZjb21taXR0ZWQpOwotCQkJQVNTRVJUKGVycm9yID09IDApOwotCQkJ bGlieGZzX3RyYW5zX2NvbW1pdCh0cCwKLQkJCQlYRlNfVFJBTlNfUkVMRUFT RV9MT0dfUkVTIHwgWEZTX1RSQU5TX1NZTkMsIDApOwotCQkJb3JwaGFuYWdl X2VudGVyZWQgPSAxOwotCQl9Ci0KIAkJLyoKIAkJICogaWYgd2UgaGF2ZSB0 byBjcmVhdGUgYSAuLiBmb3IgLywgZG8gaXQgbm93ICpiZWZvcmUqCiAJCSAq IHdlIGRlbGV0ZSB0aGUgYm9ndXMgZW50cmllcywgb3RoZXJ3aXNlIHRoZSBk aXJlY3RvcnkKQEAgLTM4MjMsNiArMzc1Nyw1MSBAQAogfQogCiBzdGF0aWMg dm9pZAorY2hlY2tfZm9yX29ycGhhbmVkX2lub2RlcygKKwl4ZnNfbW91bnRf dAkJKm1wLAorCWlub190cmVlX25vZGVfdAkJKmlyZWMpCit7CisJaW50CQkJ aTsKKwlpbnQJCQllcnI7CisJeGZzX2lub190CQlpbm87CisKKwlmb3IgKGkg PSAwOyBpIDwgWEZTX0lOT0RFU19QRVJfQ0hVTks7IGkrKykgIHsKKwkJQVNT RVJUKGlzX2lub2RlX2NvbmZpcm1lZChpcmVjLCBpKSk7CisJCWlmIChpc19p bm9kZV9mcmVlKGlyZWMsIGkpKQorCQkJY29udGludWU7CisKKwkJaWYgKCFp c19pbm9kZV9yZWFjaGVkKGlyZWMsIGkpKSB7CisJCQlBU1NFUlQoaW5vZGVf aXNhZGlyKGlyZWMsIGkpIHx8CisJCQkJbnVtX2lub2RlX3JlZmVyZW5jZXMo aXJlYywgaSkgPT0gMCk7CisJCQlpbm8gPSBYRlNfQUdJTk9fVE9fSU5PKG1w LCBpLCBpICsgaXJlYy0+aW5vX3N0YXJ0bnVtKTsKKwkJCWlmIChpbm9kZV9p c2FkaXIoaXJlYywgaSkpCisJCQkJZG9fd2FybihfKCJkaXNjb25uZWN0ZWQg ZGlyIGlub2RlICVsbHUsICIpLCBpbm8pOworCQkJZWxzZQorCQkJCWRvX3dh cm4oXygiZGlzY29ubmVjdGVkIGlub2RlICVsbHUsICIpLCBpbm8pOworCQkJ aWYgKCFub19tb2RpZnkpICB7CisJCQkgICAgCWlmICghb3JwaGFuYWdlX2lu bykKKwkJCQkJb3JwaGFuYWdlX2lubyA9IG1rX29ycGhhbmFnZShtcCk7CisJ CQkJaWYgKCFvcnBoYW5hZ2VfaXApIHsKKwkJCQkJZXJyID0gbGlieGZzX2ln ZXQobXAsIE5VTEwsIG9ycGhhbmFnZV9pbm8sIDAsICZvcnBoYW5hZ2VfaXAs IDApOworCQkJCQlpZiAoZXJyKQorCQkJCQkJZG9fZXJyb3IoXygiJWQgLSBj b3VsZG4ndCBpZ2V0IG9ycGhhbmFnZSBpbm9kZVxuIiksIGVycik7CisJCQkJ fQorCQkJCWRvX3dhcm4oXygibW92aW5nIHRvICVzXG4iKSwgT1JQSEFOQUdF KTsKKwkJCQltdl9vcnBoYW5hZ2UobXAsIGlubywgaW5vZGVfaXNhZGlyKGly ZWMsIGkpKTsKKwkJCX0gZWxzZSAgeworCQkJCWRvX3dhcm4oXygid291bGQg bW92ZSB0byAlc1xuIiksIE9SUEhBTkFHRSk7CisJCQl9CisJCQkvKgorCQkJ ICogZm9yIHJlYWQtb25seSBjYXNlLCBldmVuIHRob3VnaCB0aGUgaW5vZGUg aXNuJ3QKKwkJCSAqIHJlYWxseSByZWFjaGFibGUsIHNldCB0aGUgZmxhZyAo YW5kIGJ1bXAgb3VyIGxpbmsKKwkJCSAqIGNvdW50KSBhbnl3YXkgdG8gZm9v bCBwaGFzZSA3CisJCQkgKi8KKwkJCWFkZF9pbm9kZV9yZWFjaGVkKGlyZWMs IGkpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAogdHJhdmVyc2VfZnVu Y3Rpb24oeGZzX21vdW50X3QgKm1wLCB4ZnNfYWdudW1iZXJfdCBhZ25vKQog ewogCXJlZ2lzdGVyIGlub190cmVlX25vZGVfdCAqaXJlYzsKQEAgLTM4Nzcs OSArMzg1NiwxMSBAQAogCWRpcl9zdGFja190CQlzdGFjazsKIAlpbnQJCQlp OwogCWludAkJCWo7CisJeGZzX2lub190CQlvcnBoYW5hZ2VfaW5vOwogCiAJ Ynplcm8oJnplcm9jciwgc2l6ZW9mKHN0cnVjdCBjcmVkKSk7CiAJYnplcm8o Jnplcm9mc3gsIHNpemVvZihzdHJ1Y3QgZnN4YXR0cikpOworCW9ycGhhbmFn ZV9pbm8gPSAwOwogCiAJZG9fbG9nKF8oIlBoYXNlIDYgLSBjaGVjayBpbm9k ZSBjb25uZWN0aXZpdHkuLi5cbiIpKTsKIApAQCAtMzk0MywxNSArMzkyNCw2 IEBACiAJCX0KIAl9CiAKLQkvKgotCSAqIG1ha2Ugb3JwaGFuYWdlIChpdCdz IGd1YXJhbnRlZWQgdG8gbm90IGV4aXN0IG5vdykKLQkgKi8KLQlpZiAoIW5v X21vZGlmeSkgIHsKLQkJZG9fbG9nKF8oIiAgICAgICAgLSBlbnN1cmluZyBl eGlzdGVuY2Ugb2YgJXMgZGlyZWN0b3J5XG4iKSwKLQkJCU9SUEhBTkFHRSk7 Ci0JCW9ycGhhbmFnZV9pbm8gPSBta19vcnBoYW5hZ2UobXApOwotCX0KLQog CWRpcl9zdGFja19pbml0KCZzdGFjayk7CiAKIAltYXJrX3N0YW5kYWxvbmVf aW5vZGVzKG1wKTsKQEAgLTQwMzEsNTkgKzQwMDMsMTYgQEAKIAl9CiAKIAlk b19sb2coXygiICAgICAgICAtIHRyYXZlcnNhbHMgZmluaXNoZWQgLi4uIFxu IikpOwotCi0JLyogZmx1c2ggYWxsIGRpcnR5IGRhdGEgYmVmb3JlIGRvaW5n IGxvc3QrZm91bmQgc2VhcmNoICovCi0JbGlieGZzX2JjYWNoZV9mbHVzaCgp OwotCi0JZG9fbG9nKF8oIiAgICAgICAgLSBtb3ZpbmcgZGlzY29ubmVjdGVk IGlub2RlcyB0byBsb3N0K2ZvdW5kIC4uLiBcbiIpKTsKKwlkb19sb2coXygi ICAgICAgICAtIG1vdmluZyBkaXNjb25uZWN0ZWQgaW5vZGVzIHRvICVzIC4u LiBcbiIpLAorCQlPUlBIQU5BR0UpOwogCiAJLyoKIAkgKiBtb3ZlIGFsbCBk aXNjb25uZWN0ZWQgaW5vZGVzIHRvIHRoZSBvcnBoYW5hZ2UKIAkgKi8KIAlm b3IgKGkgPSAwOyBpIDwgZ2xvYl9hZ2NvdW50OyBpKyspICB7CiAJCWlyZWMg PSBmaW5kZmlyc3RfaW5vZGVfcmVjKGkpOwotCi0JCWlmIChpcmVjID09IE5V TEwpCi0JCQljb250aW51ZTsKLQogCQl3aGlsZSAoaXJlYyAhPSBOVUxMKSAg ewotCQkJZm9yIChqID0gMDsgaiA8IFhGU19JTk9ERVNfUEVSX0NIVU5LOyBq KyspICB7Ci0JCQkJQVNTRVJUKGlzX2lub2RlX2NvbmZpcm1lZChpcmVjLCBq KSk7Ci0JCQkJaWYgKGlzX2lub2RlX2ZyZWUoaXJlYywgaikpCi0JCQkJCWNv bnRpbnVlOwotCQkJCWlmICghaXNfaW5vZGVfcmVhY2hlZChpcmVjLCBqKSkg ewotCQkJCQlBU1NFUlQoaW5vZGVfaXNhZGlyKGlyZWMsIGopIHx8Ci0JCQkJ CQludW1faW5vZGVfcmVmZXJlbmNlcyhpcmVjLCBqKQotCQkJCQkJPT0gMCk7 Ci0JCQkJCWlubyA9IFhGU19BR0lOT19UT19JTk8obXAsIGksCi0JCQkJCQlq ICsgaXJlYy0+aW5vX3N0YXJ0bnVtKTsKLQkJCQkJaWYgKGlub2RlX2lzYWRp cihpcmVjLCBqKSkKLQkJCQkJCWRvX3dhcm4oCi0JCQkJCV8oImRpc2Nvbm5l Y3RlZCBkaXIgaW5vZGUgJWxsdSwgIiksCi0JCQkJCQkJaW5vKTsKLQkJCQkJ ZWxzZQotCQkJCQkJZG9fd2FybigKLQkJCQkJXygiZGlzY29ubmVjdGVkIGlu b2RlICVsbHUsICIpLAotCQkJCQkJCWlubyk7Ci0JCQkJCWlmICghbm9fbW9k aWZ5KSAgewotCQkJCQkJZG9fd2FybihfKCJtb3ZpbmcgdG8gJXNcbiIpLAot CQkJCQkJCU9SUEhBTkFHRSk7Ci0JCQkJCQltdl9vcnBoYW5hZ2UobXAsIG9y cGhhbmFnZV9pbm8sCi0JCQkJCQkJaW5vLAotCQkJCQkJCWlub2RlX2lzYWRp cihpcmVjLCBqKSk7Ci0JCQkJCX0gZWxzZSAgewotCQkJCQkJZG9fd2Fybihf KCJ3b3VsZCBtb3ZlIHRvICVzXG4iKSwKLQkJCQkJCQlPUlBIQU5BR0UpOwot CQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIGZvciByZWFkLW9ubHkgY2FzZSwg ZXZlbiB0aG91Z2gKLQkJCQkJICogdGhlIGlub2RlIGlzbid0IHJlYWxseSBy ZWFjaGFibGUsCi0JCQkJCSAqIHNldCB0aGUgZmxhZyAoYW5kIGJ1bXAgb3Vy IGxpbmsKLQkJCQkJICogY291bnQpIGFueXdheSB0byBmb29sIHBoYXNlIDcK LQkJCQkJICovCi0JCQkJCWFkZF9pbm9kZV9yZWFjaGVkKGlyZWMsIGopOwot CQkJCX0KLQkJCX0KKwkJCWNoZWNrX2Zvcl9vcnBoYW5lZF9pbm9kZXMobXAs IGlyZWMpOwogCQkJaXJlYyA9IG5leHRfaW5vX3JlYyhpcmVjKTsKIAkJfQog CX0KSW5kZXg6IHJlcGFpci94ZnNwcm9ncy9yZXBhaXIvcGhhc2U3LmMKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQotLS0gcmVwYWlyLm9yaWcveGZzcHJvZ3Mv cmVwYWlyL3BoYXNlNy5jCTIwMDctMDQtMjcgMTM6MTM6MzUuOTcxOTkzNDg5 ICsxMDAwCisrKyByZXBhaXIveGZzcHJvZ3MvcmVwYWlyL3BoYXNlNy5jCTIw MDctMDQtMjcgMTQ6MTE6NDEuMDAwMDAwMDAwICsxMDAwCkBAIC05NiwxMSAr OTYsOCBAQAogCiAJLyoKIAkgKiBjb21wYXJlIGFuZCBzZXQgbGlua3MgZm9y IGFsbCBpbm9kZXMKLQkgKiBidXQgdGhlIGxvc3QrZm91bmQgaW5vZGUuICB3 ZSBrZWVwCi0JICogdGhhdCBjb3JyZWN0IGFzIHdlIGdvLgogCSAqLwotCWlm IChpbm8gIT0gb3JwaGFuYWdlX2lubykKLQkJc2V0X25saW5rcygmaXAtPmlf ZCwgaW5vLCBubGlua3MsICZkaXJ0eSk7CisJc2V0X25saW5rcygmaXAtPmlf ZCwgaW5vLCBubGlua3MsICZkaXJ0eSk7CiAKIAlpZiAoIWRpcnR5KSAgewog CQlsaWJ4ZnNfdHJhbnNfaXB1dCh0cCwgaXAsIDApOwo= ------------yUh6rLTYauJAeqPswTCPZX--