From owner-freebsd-mips@freebsd.org Fri Sep 16 19:53:19 2016 Return-Path: Delivered-To: freebsd-mips@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 20DA9BDD9AF for ; Fri, 16 Sep 2016 19:53:19 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id 0D870F5 for ; Fri, 16 Sep 2016 19:53:18 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id C590BBD00; Fri, 16 Sep 2016 19:53:17 +0000 (UTC) Date: Fri, 16 Sep 2016 19:53:17 +0000 To: freebsd-mips@freebsd.org From: "sbruno (Sean Bruno)" Reply-to: D2535+328+49e31fd6f0082d49@reviews.freebsd.org Subject: [Differential] D2535: New, experimental PMAP implementation for MIPS64 Message-ID: <0f329be06464796422fbdb79db4d9952@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: , Thread-Topic: D2535: New, experimental PMAP implementation for MIPS64 X-Herald-Rules: <28>, <76> X-Phabricator-Projects: <#mips> X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: MDFkZmEzMDA3ZTc4MDc3NzkxZmUxYzgyNTAwIFfcTa0= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_0f329be06464796422fbdb79db4d9952" X-Mailman-Approved-At: Fri, 16 Sep 2016 20:20:21 +0000 X-BeenThere: freebsd-mips@freebsd.org X-Mailman-Version: 2.1.23 List-Id: Porting FreeBSD to MIPS List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Sep 2016 19:53:19 -0000 --b1_0f329be06464796422fbdb79db4d9952 Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: base64 c2JydW5vIHVwZGF0ZWQgdGhpcyByZXZpc2lvbiB0byBEaWZmIDIwMzkyLgpzYnJ1bm8gYWRkZWQg YSBjb21tZW50LgoKCiAgQ29weS9wYXN0ZSBhIGNvdXBsZSBvZiBxdWljayBmdW5jdGlvbnMgZnJv bSBwbWFwLmMgdG8gcG1hcF9taXBzNjQuYyAKICBhbmQgbm93IHRoZSBuZXcgb3B0aW9uIGNvbXBp bGVzIGFuZCBib290cyB1bmRlciBNQUxUQTY0CgpSRVBPU0lUT1JZCiAgclMgRnJlZUJTRCBzcmMg cmVwb3NpdG9yeQoKQ0hBTkdFUyBTSU5DRSBMQVNUIFVQREFURQogIGh0dHBzOi8vcmV2aWV3cy5m cmVlYnNkLm9yZy9EMjUzNT92cz0yMDM5MSZpZD0yMDM5MgoKUkVWSVNJT04gREVUQUlMCiAgaHR0 cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL0QyNTM1CgpBRkZFQ1RFRCBGSUxFUwogIGxpYi9saWJr dm0va3ZtX21pcHMuaAogIHN5cy9jb25mL2ZpbGVzLm1pcHMKICBzeXMvY29uZi9vcHRpb25zLm1p cHMKICBzeXMvbWlwcy9jb25mL01BTFRBNjQKICBzeXMvbWlwcy9pbmNsdWRlL3BhcmFtLmgKICBz eXMvbWlwcy9pbmNsdWRlL3BtYXAuaAogIHN5cy9taXBzL2luY2x1ZGUvcHRlLmgKICBzeXMvbWlw cy9pbmNsdWRlL3ZtcGFyYW0uaAogIHN5cy9taXBzL21pcHMvY3B1LmMKICBzeXMvbWlwcy9taXBz L2V4Y2VwdGlvbi5TCiAgc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCiAgc3lzL21pcHMvbWlwcy9t YWNoZGVwLmMKICBzeXMvbWlwcy9taXBzL21pbmlkdW1wX21hY2hkZXAuYwogIHN5cy9taXBzL21p cHMvcG1hcC5jCiAgc3lzL21pcHMvbWlwcy9wbWFwX21pcHM2NC5jCiAgc3lzL21pcHMvbWlwcy9z d3RjaC5TCiAgc3lzL21pcHMvbWlwcy90bGIuYwogIHN5cy9taXBzL21pcHMvdHJhcC5jCiAgc3lz L21pcHMvbWlwcy91bWFfbWFjaGRlcC5jCiAgc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMKICBz eXMvdm0vdm1fZ2x1ZS5jCgpFTUFJTCBQUkVGRVJFTkNFUwogIGh0dHBzOi8vcmV2aWV3cy5mcmVl YnNkLm9yZy9zZXR0aW5ncy9wYW5lbC9lbWFpbHByZWZlcmVuY2VzLwoKVG86IHNicnVubywgc3Nv bgpDYzogc2JydW5vLCByd2F0c29uLCBlbWFzdGUsIGltcCwgZnJlZWJzZC1taXBzLWxpc3QsIGRu ZWxzb25fMTkwMV95YWhvby5jb20sIG1pemhrYV9nbWFpbC5jb20K --b1_0f329be06464796422fbdb79db4d9952 Content-Type: text/x-patch; charset=utf-8; name="D2535.20392.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="D2535.20392.patch" ZGlmZiAtLWdpdCBhL3N5cy92bS92bV9nbHVlLmMgYi9zeXMvdm0vdm1fZ2x1ZS5jCi0tLSBhL3N5 cy92bS92bV9nbHVlLmMKKysrIGIvc3lzL3ZtL3ZtX2dsdWUuYwpAQCAtMzEyLDYgKzMxMiwxNjEg QEAKICNkZWZpbmUgS1NUQUNLX01BWF9QQUdFUyAzMgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKF9f bWlwc19fKQorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz KQoreworCXZtX29mZnNldF90IGtzOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGFsaWduIHRoZSBr c3RhY2sncyBtYXBwZWQgYWRkcmVzcyB0byBmaXQgd2l0aGluCisJICogYSBzaW5nbGUgVExCIGVu dHJ5LgorCSAqLworCWlmICh2bWVtX3hhbGxvYyhrZXJuZWxfYXJlbmEsCisJICAgIChwYWdlcyAr IEtTVEFDS19HVUFSRF9QQUdFUykgKiBQQUdFX1NJWkUsCisJICAgIEtTVEFDS19QQUdFX1NJWkUg KiAyLCAwLCAwLCBWTUVNX0FERFJfTUlOLCBWTUVNX0FERFJfTUFYLAorCSAgICBNX0JFU1RGSVQg fCBNX05PV0FJVCwgJmtzKSkgeworCQlyZXR1cm4gKDApOworCX0KKworCXJldHVybiAoa3MpOwor fQorCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKworI2RlZmluZQlLU1RBQ0tfT0JKVAkJT0JK VF9QSFlTCisKK3N0YXRpYyBpbnQKK3ZtX2tzdGFja19wYWxsb2Modm1fb2JqZWN0X3Qga3NvYmos IHZtX29mZnNldF90IGtzLCBpbnQgYWxsb2NmbGFncywgaW50IHBhZ2VzLAorICAgIHZtX3BhZ2Vf dCBtYVtdKQoreworCXZtX3BhZ2VfdCBtLCBlbmRfbTsKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtz b2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOwor CVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9j ZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3Ig KGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworcmV0cnlsb29rdXA6CisJCWlmICgobSA9IHZtX3Bh Z2VfbG9va3VwKGtzb2JqLCBpKSkgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAodm1fcGFnZV9i dXNpZWQobSkpIHsKKwkJCS8qCisJCQkgKiBSZWZlcmVuY2UgdGhlIHBhZ2UgYmVmb3JlIHVubG9j a2luZyBhbmQKKwkJCSAqIHNsZWVwaW5nIHNvIHRoYXQgdGhlIHBhZ2UgZGFlbW9uIGlzIGxlc3MK KwkJCSAqIGxpa2VseSB0byByZWNsYWltIGl0LgorCQkJICovCisJCQl2bV9wYWdlX2FmbGFnX3Nl dChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQl2bV9wYWdlX2xvY2sobSk7CisJCQlWTV9PQkpFQ1Rf V1VOTE9DSyhrc29iaik7CisJCQl2bV9wYWdlX2J1c3lfc2xlZXAobSwgInBncmJ3dCIpOworCQkJ Vk1fT0JKRUNUX1dMT0NLKGtzb2JqKTsKKwkJCWdvdG8gcmV0cnlsb29rdXA7CisJCX0gZWxzZSB7 CisJCQlpZiAoKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19XSVJFRCkgIT0gMCkgeworCQkJCXZtX3Bh Z2VfbG9jayhtKTsKKwkJCQl2bV9wYWdlX3dpcmUobSk7CisJCQkJdm1fcGFnZV91bmxvY2sobSk7 CisJCQl9CisJCQltYVtpXSA9IG07CisJCX0KKwl9CisJaWYgKGkgPT0gcGFnZXMpCisJCXJldHVy biAoaSk7CisKKwlLQVNTRVJUKChpID09IDApLCAoInZtX2tzdGFja19wYWxsb2M6IGtzb2JqIGFs cmVhZHkgaGFzIGtzdGFjayBwYWdlcyIpKTsKKworCWZvciAoOzspIHsKKwkJbSA9IHZtX3BhZ2Vf YWxsb2NfY29udGlnKGtzb2JqLCAwLCBhbGxvY2ZsYWdzLAorCQkgICAgYXRvcChLU1RBQ0tfUEFH RV9TSVpFKSwgMHVsLCB+MHVsLCBLU1RBQ0tfUEFHRV9TSVpFICogMiwgMCwKKwkJICAgIFZNX01F TUFUVFJfREVGQVVMVCk7CisJCWlmIChtICE9IE5VTEwpCisJCQlicmVhazsKKwkJVk1fT0JKRUNU X1dVTkxPQ0soa3NvYmopOworCQlWTV9XQUlUOworCQlWTV9PQkpFQ1RfV0xPQ0soa3NvYmopOwor CX0KKwllbmRfbSA9IG0gKyBhdG9wKEtTVEFDS19QQUdFX1NJWkUpOworCWZvciAoaSA9IDA7IG0g PCBlbmRfbTsgbSsrKSB7CisJCW0tPnBpbmRleCA9ICh2bV9waW5kZXhfdClpOworCQlpZiAoKGFs bG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kpICE9IDApCisJCQltLT52YWxpZCA9IFZNX1BBR0Vf QklUU19BTEw7CisJCW1hW2ldID0gbTsKKwkJaSsrOworCX0KKwlyZXR1cm4gKGkpOworfQorCisj ZWxzZSAvKiAhIEtTVEFDS19MQVJHRV9QQUdFICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9C SlRfREVGQVVMVAorCitzdGF0aWMgaW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtz b2JqLCB2bV9vZmZzZXRfdCBrcywgaW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9w YWdlX3QgbWFbXSkKK3sKKwlpbnQgaTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZt X2tzdGFja19wYWxsb2M6IGludmFsaWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRf V0xPQ0tFRChrc29iaik7CisKKwlhbGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0Nf Q0xBU1NfTUFTSykgfCBWTV9BTExPQ19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7 IGkrKykgeworCQkvKgorCQkgKiBHZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1h W2ldID0gdm1fcGFnZV9ncmFiKGtzb2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxh Z3MgJiBWTV9BTExPQ19OT0JVU1kpCisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxM OworCX0KKworCXJldHVybiAoaSk7Cit9CisjZW5kaWYgLyogISBLU1RBQ0tfTEFSR0VfUEFHRSAq LworCisjZWxzZSAvKiAhIF9fbWlwc19fICovCisKKyNkZWZpbmUJS1NUQUNLX09CSlQJCU9CSlRf REVGQVVMVAorCitzdGF0aWMgdm1fb2Zmc2V0X3QKK3ZtX2tzdGFja192YWxsb2MoaW50IHBhZ2Vz KQoreworCXZtX29mZnNldF90IGtzOworCisJa3MgPSBrdmFfYWxsb2MoKHBhZ2VzICsgS1NUQUNL X0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7CisKKwlyZXR1cm4oa3MpOworfQorCitzdGF0aWMg aW50Cit2bV9rc3RhY2tfcGFsbG9jKHZtX29iamVjdF90IGtzb2JqLCB2bV9vZmZzZXRfdCBrcywg aW50IGFsbG9jZmxhZ3MsIGludCBwYWdlcywKKyAgICB2bV9wYWdlX3QgbWFbXSkKK3sKKwlpbnQg aTsKKworCUtBU1NFUlQoKGtzb2JqICE9IE5VTEwpLCAoInZtX2tzdGFja19wYWxsb2M6IGludmFs aWQgVk0gb2JqZWN0IikpOworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChrc29iaik7CisKKwlh bGxvY2ZsYWdzID0gKGFsbG9jZmxhZ3MgJiB+Vk1fQUxMT0NfQ0xBU1NfTUFTSykgfCBWTV9BTExP Q19OT1JNQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworCQkvKgorCQkgKiBH ZXQgYSBrZXJuZWwgc3RhY2sgcGFnZS4KKwkJICovCisJCW1hW2ldID0gdm1fcGFnZV9ncmFiKGtz b2JqLCBpLCBhbGxvY2ZsYWdzKTsKKwkJaWYgKGFsbG9jZmxhZ3MgJiBWTV9BTExPQ19OT0JVU1kp CisJCQltYVtpXS0+dmFsaWQgPSBWTV9QQUdFX0JJVFNfQUxMOworCX0KKworCXJldHVybiAoaSk7 Cit9CisjZW5kaWYgLyogISBfX21pcHNfXyAqLworCisKIC8qCiAgKiBDcmVhdGUgdGhlIGtlcm5l bCBzdGFjayAoaW5jbHVkaW5nIHBjYiBmb3IgaTM4NikgZm9yIGEgbmV3IHRocmVhZC4KICAqIFRo aXMgcm91dGluZSBkaXJlY3RseSBhZmZlY3RzIHRoZSBmb3JrIHBlcmYgZm9yIGEgcHJvY2VzcyBh bmQKQEAgLTMyMiw5ICs0NzcsOCBAQAogewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX29mZnNl dF90IGtzOwotCXZtX3BhZ2VfdCBtLCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsKKwl2bV9wYWdlX3Qg bWFbS1NUQUNLX01BWF9QQUdFU107CiAJc3RydWN0IGtzdGFja19jYWNoZV9lbnRyeSAqa3NfY2U7 Ci0JaW50IGk7CiAKIAkvKiBCb3VuZHMgY2hlY2sgKi8KIAlpZiAocGFnZXMgPD0gMSkKQEAgLTM1 MCwyNCArNTA0LDEyIEBACiAJLyoKIAkgKiBBbGxvY2F0ZSBhbiBvYmplY3QgZm9yIHRoZSBrc3Rh Y2suCiAJICovCi0Ja3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoT0JKVF9ERUZBVUxULCBwYWdl cyk7Ci0JCisJa3NvYmogPSB2bV9vYmplY3RfYWxsb2NhdGUoS1NUQUNLX09CSlQsIHBhZ2VzKTsK KwogCS8qCiAJICogR2V0IGEga2VybmVsIHZpcnR1YWwgYWRkcmVzcyBmb3IgdGhpcyB0aHJlYWQn cyBrc3RhY2suCiAJICovCi0jaWYgZGVmaW5lZChfX21pcHNfXykKLQkvKgotCSAqIFdlIG5lZWQg dG8gYWxpZ24gdGhlIGtzdGFjaydzIG1hcHBlZCBhZGRyZXNzIHRvIGZpdCB3aXRoaW4KLQkgKiBh IHNpbmdsZSBUTEIgZW50cnkuCi0JICovCi0JaWYgKHZtZW1feGFsbG9jKGtlcm5lbF9hcmVuYSwg KHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSwKLQkgICAgUEFHRV9TSVpF ICogMiwgMCwgMCwgVk1FTV9BRERSX01JTiwgVk1FTV9BRERSX01BWCwKLQkgICAgTV9CRVNURklU IHwgTV9OT1dBSVQsICZrcykpIHsKLQkJa3MgPSAwOwotCX0KLSNlbHNlCi0Ja3MgPSBrdmFfYWxs b2MoKHBhZ2VzICsgS1NUQUNLX0dVQVJEX1BBR0VTKSAqIFBBR0VfU0laRSk7Ci0jZW5kaWYKKwlr cyA9IHZtX2tzdGFja192YWxsb2MocGFnZXMpOwogCWlmIChrcyA9PSAwKSB7CiAJCXByaW50Zigi dm1fdGhyZWFkX25ldzoga3N0YWNrIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKIAkJdm1fb2JqZWN0 X2RlYWxsb2NhdGUoa3NvYmopOwpAQCAtMzg2LDIxICs1MjgsMTUgQEAKIAkgKiB3YW50IHRvIGRl YWxsb2NhdGUgdGhlbS4KIAkgKi8KIAl0ZC0+dGRfa3N0YWNrX3BhZ2VzID0gcGFnZXM7Ci0JLyog Ci0JICogRm9yIHRoZSBsZW5ndGggb2YgdGhlIHN0YWNrLCBsaW5rIGluIGEgcmVhbCBwYWdlIG9m IHJhbSBmb3IgZWFjaAotCSAqIHBhZ2Ugb2Ygc3RhY2suCi0JICovCisKIAlWTV9PQkpFQ1RfV0xP Q0soa3NvYmopOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7Ci0JCS8qCi0JCSAqIEdl dCBhIGtlcm5lbCBzdGFjayBwYWdlLgotCQkgKi8KLQkJbSA9IHZtX3BhZ2VfZ3JhYihrc29iaiwg aSwgVk1fQUxMT0NfTk9CVVNZIHwKLQkJICAgIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX1dJ UkVEKTsKLQkJbWFbaV0gPSBtOwotCQltLT52YWxpZCA9IFZNX1BBR0VfQklUU19BTEw7Ci0JfQor CXBhZ2VzID0gdm1fa3N0YWNrX3BhbGxvYyhrc29iaiwga3MsIChWTV9BTExPQ19OT0JVU1kgfCBW TV9BTExPQ19XSVJFRCksCisJICAgIHBhZ2VzLCBtYSk7CiAJVk1fT0JKRUNUX1dVTkxPQ0soa3Nv YmopOworCWlmIChwYWdlcyA9PSAwKSB7CisJCXByaW50Zigidm1fdGhyZWFkX25ldzogdm1fa3N0 YWNrX3BhbGxvYygpIGZhaWxlZFxuIik7CisJCXJldHVybiAoMCk7CisJfQogCXBtYXBfcWVudGVy KGtzLCBtYSwgcGFnZXMpOwogCXJldHVybiAoMSk7CiB9CkBAIC01NjgsMTQgKzcwNCwxNCBAQAog ewogCXZtX29iamVjdF90IGtzb2JqOwogCXZtX3BhZ2VfdCBtYVtLU1RBQ0tfTUFYX1BBR0VTXTsK LQlpbnQgcGFnZXM7CisJaW50IHBhZ2VzLCBydjsKIAogCXBhZ2VzID0gdGQtPnRkX2tzdGFja19w YWdlczsKIAlrc29iaiA9IHRkLT50ZF9rc3RhY2tfb2JqOwogCVZNX09CSkVDVF9XTE9DSyhrc29i aik7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczsgaSsrKQotCQltYVtpXSA9IHZtX3BhZ2Vf Z3JhYihrc29iaiwgaSwgVk1fQUxMT0NfTk9STUFMIHwKLQkJICAgIFZNX0FMTE9DX1dJUkVEKTsK KwlydiA9IHZtX2tzdGFja19wYWxsb2Moa3NvYmosIHRkLT50ZF9rc3RhY2ssIChWTV9BTExPQ19O T1JNQUwgfAorCSAgICBWTV9BTExPQ19XSVJFRCksIHBhZ2VzLCBtYSk7CisJS0FTU0VSVChydiAh PSAwLCAoInZtX3RocmVhZF9zd2FwaW46IHZtX2tzdGFja19wYWxsb2MoKSBmYWlsZWQiKSk7CiAJ Zm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlczspIHsKIAkJaW50IGosIGEsIGNvdW50LCBydjsKIApk aWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL3Zt X21hY2hkZXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL3ZtX21hY2hkZXAuYworKysgYi9zeXMvbWlw cy9taXBzL3ZtX21hY2hkZXAuYwpAQCAtMjUxLDE4ICsyNTEsMjggQEAKIGNwdV90aHJlYWRfc3dh cGluKHN0cnVjdCB0aHJlYWQgKnRkKQogewogCXB0X2VudHJ5X3QgKnB0ZTsKLQlpbnQgaTsKIAog CS8qCiAJICogVGhlIGtzdGFjayBtYXkgYmUgYXQgYSBkaWZmZXJlbnQgcGh5c2ljYWwgYWRkcmVz cyBub3cuCiAJICogQ2FjaGUgdGhlIFBURXMgZm9yIHRoZSBLZXJuZWwgc3RhY2sgaW4gdGhlIG1h Y2hpbmUgZGVwZW5kZW50CiAJICogcGFydCBvZiB0aGUgdGhyZWFkIHN0cnVjdCBzbyBjcHVfc3dp dGNoKCkgY2FuIHF1aWNrbHkgbWFwIGluCiAJICogdGhlIHBjYiBzdHJ1Y3QgYW5kIGtlcm5lbCBz dGFjay4KIAkgKi8KKyNpZmRlZiBLU1RBQ0tfTEFSR0VfUEFHRQorCS8qIEp1c3Qgb25lIGVudHJ5 IGZvciBvbmUgbGFyZ2Uga2VybmVsIHBhZ2UuICovCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3Bt YXAsIHRkLT50ZF9rc3RhY2spOworCXRkLT50ZF9tZC5tZF91cHRlWzBdID0gKnB0ZSAmIH5UTEJM T19TV0JJVFNfTUFTSzsKKwl0ZC0+dGRfbWQubWRfdXB0ZVsxXSA9IDE7CisKKyNlbHNlCisKKwlp bnQgaTsKKwogCWZvciAoaSA9IDA7IGkgPCBLU1RBQ0tfUEFHRVM7IGkrKykgewogCQlwdGUgPSBw bWFwX3B0ZShrZXJuZWxfcG1hcCwgdGQtPnRkX2tzdGFjayArIGkgKiBQQUdFX1NJWkUpOwogCQl0 ZC0+dGRfbWQubWRfdXB0ZVtpXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CiAJfQorI2Vu ZGlmIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8KIH0KIAogdm9pZApAQCAtMjc0LDE3ICsyODQs MzEgQEAKIGNwdV90aHJlYWRfYWxsb2Moc3RydWN0IHRocmVhZCAqdGQpCiB7CiAJcHRfZW50cnlf dCAqcHRlOwotCWludCBpOwogCi0JS0FTU0VSVCgodGQtPnRkX2tzdGFjayAmICgxIDw8IFBBR0Vf U0hJRlQpKSA9PSAwLCAoImtlcm5lbCBzdGFjayBtdXN0IGJlIGFsaWduZWQuIikpOworCUtBU1NF UlQoKHRkLT50ZF9rc3RhY2sgJiAoKEtTVEFDS19QQUdFX1NJWkUgKiAyKSAtIDEpICkgPT0gMCwK KwkgICAgKCJrZXJuZWwgc3RhY2sgbXVzdCBiZSBhbGlnbmVkLiIpKTsKIAl0ZC0+dGRfcGNiID0g KHN0cnVjdCBwY2IgKikodGQtPnRkX2tzdGFjayArCiAJICAgIHRkLT50ZF9rc3RhY2tfcGFnZXMg KiBQQUdFX1NJWkUpIC0gMTsKIAl0ZC0+dGRfZnJhbWUgPSAmdGQtPnRkX3BjYi0+cGNiX3JlZ3M7 CiAKLQlmb3IgKGkgPSAwOyBpIDwgS1NUQUNLX1BBR0VTOyBpKyspIHsKLQkJcHRlID0gcG1hcF9w dGUoa2VybmVsX3BtYXAsIHRkLT50ZF9rc3RhY2sgKyBpICogUEFHRV9TSVpFKTsKLQkJdGQtPnRk X21kLm1kX3VwdGVbaV0gPSAqcHRlICYgflRMQkxPX1NXQklUU19NQVNLOworI2lmZGVmIEtTVEFD S19MQVJHRV9QQUdFCisJLyogSnVzdCBvbmUgZW50cnkgZm9yIG9uZSBsYXJnZSBrZXJuZWwgcGFn ZS4gKi8KKwlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdGQtPnRkX2tzdGFjayk7CisJdGQt PnRkX21kLm1kX3VwdGVbMF0gPSAqcHRlICYgflRMQkxPX1NXQklUU19NQVNLOworCXRkLT50ZF9t ZC5tZF91cHRlWzFdID0gMTsKKworI2Vsc2UKKworCXsKKwkJaW50IGk7CisKKwkJZm9yIChpID0g MDsgaSA8IEtTVEFDS19QQUdFUzsgaSsrKSB7CisJCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1h cCwgdGQtPnRkX2tzdGFjayArIGkgKgorCQkJICAgIFBBR0VfU0laRSk7CisJCQl0ZC0+dGRfbWQu bWRfdXB0ZVtpXSA9ICpwdGUgJiB+VExCTE9fU1dCSVRTX01BU0s7CisJCX0KIAl9CisjZW5kaWYg LyogISBLU1RBQ0tfTEFSR0VfUEFHRSAqLwogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9zeXMvbWlw cy9taXBzL3VtYV9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL3VtYV9tYWNoZGVwLmMKLS0tIGEv c3lzL21pcHMvbWlwcy91bWFfbWFjaGRlcC5jCisrKyBiL3N5cy9taXBzL21pcHMvdW1hX21hY2hk ZXAuYwpAQCAtNTIsNyArNTIsMTEgQEAKIAlwZmxhZ3MgPSBtYWxsb2Mydm1fZmxhZ3Mod2FpdCkg fCBWTV9BTExPQ19XSVJFRDsKIAogCWZvciAoOzspIHsKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAK KwkJbSA9IHZtX3BhZ2VfYWxsb2MoTlVMTCwgMCwgcGZsYWdzIHwgVk1fQUxMT0NfTk9PQkopOwor I2Vsc2UgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KIAkJbSA9IHZtX3BhZ2VfYWxsb2NfZnJlZWxp c3QoVk1fRlJFRUxJU1RfRElSRUNULCBwZmxhZ3MpOworI2VuZGlmIC8qICEgTUlQUzY0X05FV19Q TUFQICovCiAjaWZuZGVmIF9fbWlwc19uNjQKIAkJaWYgKG0gPT0gTlVMTCAmJiB2bV9wYWdlX3Jl Y2xhaW1fY29udGlnKHBmbGFncywgMSwKIAkJICAgIDAsIE1JUFNfS1NFRzBfTEFSR0VTVF9QSFlT LCBQQUdFX1NJWkUsIDApKQpAQCAtNjgsNiArNzIsOCBAQAogCX0KIAogCXBhID0gVk1fUEFHRV9U T19QSFlTKG0pOworCWlmICgod2FpdCAmIE1fTk9EVU1QKSA9PSAwKQorCQlkdW1wX2FkZF9wYWdl KHBhKTsKIAl2YSA9ICh2b2lkICopTUlQU19QSFlTX1RPX0RJUkVDVChwYSk7CiAJaWYgKCh3YWl0 ICYgTV9aRVJPKSAmJiAobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAwKQogCQliemVybyh2YSwgUEFH RV9TSVpFKTsKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvdHJhcC5jIGIvc3lzL21pcHMvbWlw cy90cmFwLmMKLS0tIGEvc3lzL21pcHMvbWlwcy90cmFwLmMKKysrIGIvc3lzL21pcHMvbWlwcy90 cmFwLmMKQEAgLTgxLDYgKzgxLDcgQEAKICNpbmNsdWRlIDxtYWNoaW5lL21pcHNfb3Bjb2RlLmg+ CiAjaW5jbHVkZSA8bWFjaGluZS9mcmFtZS5oPgogI2luY2x1ZGUgPG1hY2hpbmUvcmVnbnVtLmg+ CisjaW5jbHVkZSA8bWFjaGluZS90bGIuaD4KICNpbmNsdWRlIDxtYWNoaW5lL3Rscy5oPgogCiAj aWZkZWYgRERCCkBAIC0yNjQsNyArMjY1LDcgQEAKIAkicmVzZXJ2ZWQgMjEiLAogCSJyZXNlcnZl ZCAyMiIsCiAJIndhdGNoIiwKLQkicmVzZXJ2ZWQgMjQiLAorCSJtYWNoaW5lIGNoZWNrIiwKIAki cmVzZXJ2ZWQgMjUiLAogCSJyZXNlcnZlZCAyNiIsCiAJInJlc2VydmVkIDI3IiwKQEAgLTYzMiw2 ICs2MzMsMzMgQEAKICNlbmRpZgogCQlwYW5pYygiTUNIRUNLXG4iKTsKIAkJYnJlYWs7CisJY2Fz ZSBUX01DSEVDSyArIFRfVVNFUjoKKwkJeworCQkJdWludDMyX3Qgc3RhdHVzID0gbWlwc19yZF9z dGF0dXMoKTsKKworCQkJaWYgKHN0YXR1cyAmIE1JUFNfU1JfVFMpIHsKKwkJCQkvKgorCQkJCSAq IE1hY2hpbmUgQ2hlY2sgZXhjZXB0aW9uIGNhdXNlZCBieSBUTEIKKwkJCQkgKiBkZXRlY3Rpbmcg YSBtYXRjaCBmb3IgbXVsdGlwbGUgZW50cmllcy4KKwkJCQkgKgorCQkJCSAqIEF0dGVtcHQgdG8g cmVjb3ZlciBieSBmbHVzaGluZyB0aGUgdXNlciBUTEIKKwkJCQkgKiBhbmQgcmVzZXR0aW5nIHRo ZSBzdGF0dXMgYml0LgorCQkJCSAqLworCQkJCXByaW50ZigiTWFjaGluZSBDaGVjayBpbiBVc2Vy IC0gRHVwIFRMQiBlbnRyeS4gIgorCQkJCSAgICAiUmVjb3ZlcmluZy4uLlxuIik7CisJCQkJcG1h cCA9ICZwLT5wX3Ztc3BhY2UtPnZtX3BtYXA7CisJCQkJdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIo cG1hcCk7CisJCQkJbWlwc193cl9zdGF0dXMoc3RhdHVzICYgfk1JUFNfU1JfVFMpOworCisJCQkJ cmV0dXJuICh0cmFwZnJhbWUtPnBjKTsKKwkJCX0gZWxzZSB7CisjaWZkZWYgRERCCisJCQkJa2Ri X3RyYXAodHlwZSwgMCwgdHJhcGZyYW1lKTsKKyNlbmRpZgorCQkJCXBhbmljKCJNQ0hFQ0tcbiIp OworCQkJfQorCQl9CisJCWJyZWFrOwogCWNhc2UgVF9UTEJfTU9EOgogCQkvKiBjaGVjayBmb3Ig a2VybmVsIGFkZHJlc3MgKi8KIAkJaWYgKEtFUk5MQU5EKHRyYXBmcmFtZS0+YmFkdmFkZHIpKSB7 CkBAIC02OTQsMTAgKzcyMiwyMyBAQAogCiAJY2FzZSBUX1RMQl9MRF9NSVNTICsgVF9VU0VSOgog CQlmdHlwZSA9IFZNX1BST1RfUkVBRDsKLQkJZ290byBkb2ZhdWx0OworCQlnb3RvIGNoZWNrcmVm Yml0OwogCiAJY2FzZSBUX1RMQl9TVF9NSVNTICsgVF9VU0VSOgogCQlmdHlwZSA9IFZNX1BST1Rf V1JJVEU7CisKK2NoZWNrcmVmYml0OgorCQkvKgorCQkgKiBXYXMgdGhpcyB0cmFwIGNhdXNlZCBi eSB0aGUgUFRFX1ZSIGJpdCBub3QgYmVpbmcgc2V0PworCQkgKi8KKwkJaWYgKHBtYXBfZW11bGF0 ZV9yZWZlcmVuY2VkKCZwLT5wX3Ztc3BhY2UtPnZtX3BtYXAsCisJCSAgICB0cmFwZnJhbWUtPmJh ZHZhZGRyKSA9PSAwKSB7CisJCQlpZiAoIXVzZXJtb2RlKSB7CisJCQkJcmV0dXJuICh0cmFwZnJh bWUtPnBjKTsKKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9CisKIGRvZmF1bHQ6CiAJCXsKIAkJCXZt X29mZnNldF90IHZhOwpAQCAtMTQxMSw5ICsxNDUyLDE2IEBACiAJc3RydWN0IHByb2MgKnAgPSBj dXJwcm9jOwogCiAJcGRlcCA9ICgmKHAtPnBfdm1zcGFjZS0+dm1fcG1hcC5wbV9zZWd0YWJbKHZh ID4+IFNFR1NISUZUKSAmIChOUERFUEcgLSAxKV0pKTsKLQlpZiAoKnBkZXApCi0JCXB0ZXAgPSBw bWFwX3B0ZSgmcC0+cF92bXNwYWNlLT52bV9wbWFwLCB2YSk7Ci0JZWxzZQorCWlmICgqcGRlcCkg eworI2lmIFZNX05SRVNFUlZMRVZFTCA+IDAKKwkJcGRfZW50cnlfdCAqcGRlID0gJnBkZXBbKHZh ID4+IFBEUlNISUZUKSAmIChOUERFUEcgLSAxKV07CisKKwkJaWYgKHBkZV9pc19zdXBlcnBhZ2Uo cGRlKSkKKwkJCXB0ZXAgPSAocHRfZW50cnlfdCAqKXBkZTsKKwkJZWxzZQorI2VuZGlmIC8qIFZN X05SRVNFUlZMRVZFTCA+IDAgKi8KKwkJCXB0ZXAgPSBwbWFwX3B0ZSgmcC0+cF92bXNwYWNlLT52 bV9wbWFwLCB2YSk7CisJfSBlbHNlCiAJCXB0ZXAgPSAocHRfZW50cnlfdCAqKTA7CiAKIAkqcGRl cHAgPSBwZGVwOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy90bGIuYyBiL3N5cy9taXBzL21p cHMvdGxiLmMKLS0tIGEvc3lzL21pcHMvbWlwcy90bGIuYworKysgYi9zeXMvbWlwcy9taXBzL3Rs Yi5jCkBAIC00MCwxMCArNDAsMTQgQEAKICNpbmNsdWRlIDxtYWNoaW5lL3B0ZS5oPgogI2luY2x1 ZGUgPG1hY2hpbmUvdGxiLmg+CiAKKyNpbmNsdWRlICJvcHRfdm0uaCIKKwogI2lmIGRlZmluZWQo Q1BVX0NOTUlQUykKICNkZWZpbmUJTUlQU19NQVhfVExCX0VOVFJJRVMJMTI4CiAjZWxpZiBkZWZp bmVkKENQVV9OTE0pCiAjZGVmaW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCSgyMDQ4ICsgMTI4KQor I2VsaWYgZGVmaW5lZChDUFVfQ0hFUkkpCisjZGVmaW5lCU1JUFNfTUFYX1RMQl9FTlRSSUVTCTE0 NAogI2Vsc2UKICNkZWZpbmUJTUlQU19NQVhfVExCX0VOVFJJRVMJNjQKICNlbmRpZgpAQCAtMTAy LDIwICsxMDYsMzEgQEAKIHsKIAlyZWdpc3Rlcl90IGFzaWQ7CiAJcmVnaXN0ZXJfdCBzOworCXVp bnQzMl90IHBhZ2VtYXNrOworCXVuc2lnbmVkIGxvbmcgbWFzaywgc2l6ZTsKIAotCXZhICY9IH5Q QUdFX01BU0s7CisJS0FTU0VSVCgoVExCTE9fUFRFX1RPX0lEWChwdGUwKSA9PSBUTEJMT19QVEVf VE9fSURYKHB0ZTEpKSwKKwkgICAgKCIlczogcHRlMCBhbmQgcHRlMSBwYWdlIHNpemVzIGRvbid0 IG1hdGNoIiwgX19mdW5jX18pKTsKKworCS8qIENvbXB1dGUgdGhlIHBhZ2UgbWFzayBhbmQgc2l6 ZS4gKi8KKwlwYWdlbWFzayA9IFRMQkxPX1BURV9UT19NQVNLKHB0ZTApOworCW1hc2sgPSAodW5z aWduZWQgbG9uZylwYWdlbWFzayB8IFBBR0VfTUFTSzsgLyogT1IgaXQgd2l0aCBsb3dlciAxMiBi aXRzICovCisJc2l6ZSA9IG1hc2sgKyAxOworCisJdmEgJj0gfm1hc2s7CiAKIAlzID0gaW50cl9k aXNhYmxlKCk7CiAJYXNpZCA9IG1pcHNfcmRfZW50cnloaSgpICYgVExCSElfQVNJRF9NQVNLOwog CiAJbWlwc193cl9pbmRleChpKTsKLQltaXBzX3dyX3BhZ2VtYXNrKDApOworCW1pcHNfd3JfcGFn ZW1hc2socGFnZW1hc2spOwogCW1pcHNfd3JfZW50cnloaShUTEJISV9FTlRSWSh2YSwgMCkpOwog CW1pcHNfd3JfZW50cnlsbzAocHRlMCk7CiAJbWlwc193cl9lbnRyeWxvMShwdGUxKTsKIAl0bGJf d3JpdGVfaW5kZXhlZCgpOwogCiAJbWlwc193cl9lbnRyeWhpKGFzaWQpOworCW1pcHNfd3JfcGFn ZW1hc2soMCk7CiAJaW50cl9yZXN0b3JlKHMpOwogfQogCkBAIC0xMzcsNyArMTUyLDYgQEAKIAlp ID0gbWlwc19yZF9pbmRleCgpOwogCWlmIChpID49IDApCiAJCXRsYl9pbnZhbGlkYXRlX29uZShp KTsKLQogCW1pcHNfd3JfZW50cnloaShhc2lkKTsKIAlpbnRyX3Jlc3RvcmUocyk7CiB9CkBAIC0y OTgsMjkgKzMxMiw1MyBAQAogCXJlZ2lzdGVyX3QgYXNpZDsKIAlyZWdpc3Rlcl90IHM7CiAJaW50 IGk7CisJdWludDMyX3QgcGFnZW1hc2s7CisJdW5zaWduZWQgbG9uZyBtYXNrLCBzaXplOworCXB0 X2VudHJ5X3QgcHRlMCwgcHRlMTsKKworCS8qIENvbXB1dGUgdGhlIHBhZ2UgbWFzayBhbmQgc2l6 ZS4gKi8KKwlwYWdlbWFzayA9IFRMQkxPX1BURV9UT19NQVNLKHB0ZSk7CisJbWFzayA9ICh1bnNp Z25lZCBsb25nKXBhZ2VtYXNrIHwgUEFHRV9NQVNLOyAvKiBPUiBpdCB3aXRoIGxvd2VyIDEyIGJp dHMgKi8KKwlzaXplID0gbWFzayArIDE7CiAKLQl2YSAmPSB+UEFHRV9NQVNLOworCXZhICY9IH5t YXNrOwogCXB0ZSAmPSB+VExCTE9fU1dCSVRTX01BU0s7CiAKIAlzID0gaW50cl9kaXNhYmxlKCk7 CiAJYXNpZCA9IG1pcHNfcmRfZW50cnloaSgpICYgVExCSElfQVNJRF9NQVNLOwogCi0JbWlwc193 cl9wYWdlbWFzaygwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKHBhZ2VtYXNrKTsKIAltaXBzX3dyX2Vu dHJ5aGkoVExCSElfRU5UUlkodmEsIHBtYXBfYXNpZChwbWFwKSkpOwogCXRsYl9wcm9iZSgpOwog CWkgPSBtaXBzX3JkX2luZGV4KCk7CiAJaWYgKGkgPj0gMCkgewogCQl0bGJfcmVhZCgpOworCQlw dGUwID0gbWlwc19yZF9lbnRyeWxvMCgpOworCQlwdGUxID0gbWlwc19yZF9lbnRyeWxvMSgpOwor CQlLQVNTRVJUKChUTEJMT19QVEVfVE9fSURYKHB0ZSkgPT0gVExCTE9fUFRFX1RPX0lEWChwdGUw KSAmJgorCQkgICAgVExCTE9fUFRFX1RPX0lEWChwdGUpID09IFRMQkxPX1BURV9UT19JRFgocHRl MSkpLAorCQkJKCIlczogcHRlLCBwdGUwIGFuZCBwdGUxIHBhZ2Ugc2l6ZXMgZG9uJ3QgbWF0Y2gi LCBfX2Z1bmNfXykpOwogCi0JCWlmICgodmEgJiBQQUdFX1NJWkUpID09IDApIHsKKwkJaWYgKCh2 YSAmIHNpemUpID09IDApIHsKIAkJCW1pcHNfd3JfZW50cnlsbzAocHRlKTsKKwkJCWlmIChwYWdl bWFzayAmIH5QQUdFX01BU0spIHsKKwkJCQkvKiBTdXBlcnBhZ2UgKi8KKwkJCQlwdGUxID0gKHB0 ZTEgJiB+KFBURV9WUiB8IFBURV9EKSkgfCAocHRlICYgKFBURV9WUiB8IFBURV9EKSk7CisJCQkJ bWlwc193cl9lbnRyeWxvMShwdGUxKTsKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCW1pcHNfd3JfZW50 cnlsbzEocHRlKTsKKwkJCWlmIChwYWdlbWFzayAmIH5QQUdFX01BU0spIHsKKwkJCQkvKiBTdXBl cnBhZ2UgKi8KKwkJCQlwdGUwID0gKHB0ZTAgJiB+KFBURV9WUiB8IFBURV9EKSkgfCAocHRlICYg KFBURV9WUiB8IFBURV9EKSk7CisJCQkJbWlwc193cl9lbnRyeWxvMChwdGUwKTsKKwkJCX0KIAkJ fQogCQl0bGJfd3JpdGVfaW5kZXhlZCgpOwogCX0KIAogCW1pcHNfd3JfZW50cnloaShhc2lkKTsK KwltaXBzX3dyX3BhZ2VtYXNrKDApOwogCWludHJfcmVzdG9yZShzKTsKIH0KIApkaWZmIC0tZ2l0 IGEvc3lzL21pcHMvbWlwcy9zd3RjaC5TIGIvc3lzL21pcHMvbWlwcy9zd3RjaC5TCi0tLSBhL3N5 cy9taXBzL21pcHMvc3d0Y2guUworKysgYi9zeXMvbWlwcy9taXBzL3N3dGNoLlMKQEAgLTMxNSwz NiArMzE1LDkxIEBACiAgKiBOT1RFOiBUaGlzIGlzIGhhcmQgY29kZWQgdG8gVVBBR0VTID09IDIu CiAgKiBBbHNvLCB0aGVyZSBzaG91bGQgYmUgbm8gVExCIGZhdWx0cyBhdCB0aGlzIHBvaW50Lgog ICovCi0JTVRDMAl2MCwgTUlQU19DT1BfMF9UTEJfSEkJCSMgVlBOID0gdmEKKwlNVEMwCQl2MCwg TUlQU19DT1BfMF9UTEJfSEkJIyBWUE4gPSB2YQogCUhBWkFSRF9ERUxBWQogCXRsYnAJCQkJCSMg cHJvYmUgVlBOCiAJSEFaQVJEX0RFTEFZCi0JbWZjMAlzMCwgTUlQU19DT1BfMF9UTEJfSU5ERVgK KwltZmMwCQlzMCwgTUlQU19DT1BfMF9UTEJfSU5ERVgKIAlIQVpBUkRfREVMQVkKIAotCVBUUl9M SQl0MSwgTUlQU19LU0VHMF9TVEFSVAkJIyBpbnZhbGlkYXRlIHRsYiBlbnRyeQotCWJsdHoJczAs IGVudHJ5MHNldAorCSMgTUlQU19LU0VHMF9TVEFSVCArICgyICogaW5kZXggKiBQQUdFX1NJWkUp IC0+IE1JUFNfQ09QXzBfVExCX0hJCisJUFRSX0xJCQl0MSwgTUlQU19LU0VHMF9TVEFSVAkJIyBp bnZhbGlkYXRlIHRsYiBlbnRyeQorI2lmZGVmIEtTVEFDS19MQVJHRV9QQUdFCisJYmx0egkJczAs IGludmFsX254dDEKKyNlbHNlCisJYmx0egkJczAsIGVudHJ5MHNldAorI2VuZGlmCiAJbm9wCi0J c2xsCXMwLCBQQUdFX1NISUZUICsgMQotCWFkZHUJdDEsIHMwCi0JTVRDMAl0MSwgTUlQU19DT1Bf MF9UTEJfSEkKKwlzbGwJCXMwLCBQQUdFX1NISUZUICsgMQorCVBUUl9BRERVCXQxLCBzMAorCU1U QzAJCXQxLCBNSVBTX0NPUF8wX1RMQl9ISQogCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExC X0xPMAogCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX0xPMQorCU1UQzAJCXplcm8sIE1J UFNfQ09QXzBfVExCX1BHX01BU0sKIAlIQVpBUkRfREVMQVkKIAl0bGJ3aQogCUhBWkFSRF9ERUxB WQotCU1UQzAJdjAsIE1JUFNfQ09QXzBfVExCX0hJCQkjIHNldCBWUE4gYWdhaW4KKworI2lmZGVm IEtTVEFDS19MQVJHRV9QQUdFCisvKgorICogV2l0aCBhIEtTVEFDS19QQUdFX1NJWkUgb2YgMTZL IGFuZCBQQUdFX1NJWkUgb2YgNEsgaXQgaXMgcG9zc2libGUgdGhhdAorICogYSBzZWNvbmQgVExC IGVudHJ5IGlzIGN1cnJlbnRseSBtYXBwaW5nIHRoZSBrZXJuZWwgdGhyZWFkIHN0YWNrIGFzIGEK KyAqIHJlZ3VsYXIgNEsgc2l6ZWQgcGFnZShzKS4gQ2hlY2sgZm9yIHRoaXMgY2FzZSBhbmQsIGlm IHNvLCBpbnZhbGlkYXRlCisgKiB0aGF0IFRMQiBlbnRyeSBhcyB3ZWxsLgorICovCisjaWYgKFBB R0VfU0laRSAhPSA0MDk2KSAmJiAoS1NUQUNLX1BBR0VfU0laRSAhPSAxNjM4NCkKKyNlcnJvciBQ QUdFX1NJWkUgaXMgbm90IDRLIG9yIEtTVEFDS19QQUdFX1NJWkUgaXMgbm90IDE2Sy4KKyNlbmRp ZgoraW52YWxfbnh0MToKKwltb3ZlCQl2MSwgdjAKKwlQVFJfQUREVQl2MSwgUEFHRV9TSVpFICog MgorCU1UQzAJCXYxLCBNSVBTX0NPUF8wX1RMQl9ISQkJIyBWUE4gPSB2YQorCUhBWkFSRF9ERUxB WQorCXRsYnAJCQkJCQkjIHByb2JlIFZQTgorCUhBWkFSRF9ERUxBWQorCW1mYzAJCXMwLCBNSVBT X0NPUF8wX1RMQl9JTkRFWAorCUhBWkFSRF9ERUxBWQorCisJIyBNSVBTX0tTRUcwX1NUQVJUICsg KDIgKiBpbmRleCAqIFBBR0VfU0laRSkgLT4gTUlQU19DT1BfMF9UTEJfSEkKKwlQVFJfTEkJCXQx LCBNSVBTX0tTRUcwX1NUQVJUCQkjIGludmFsaWRhdGUgdGxiIGVudHJ5CisJYmx0egkJczAsIGVu dHJ5MHNldAorCW5vcAorCXNsbAkJczAsIFBBR0VfU0hJRlQgKyAxCisJUFRSX0FERFUJdDEsIHMw CisJTVRDMAkJdDEsIE1JUFNfQ09QXzBfVExCX0hJCisJUFRFX01UQzAJemVybywgTUlQU19DT1Bf MF9UTEJfTE8wCisJUFRFX01UQzAJemVybywgTUlQU19DT1BfMF9UTEJfTE8xCisJTVRDMAkJemVy bywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSworCUhBWkFSRF9ERUxBWQorCXRsYndpCisJSEFaQVJE X0RFTEFZCisjZW5kaWYJLyogS1NUQUNLX0xBUkdFX1BBR0UgKi8KIAogZW50cnkwc2V0OgorCU1U QzAJCXYwLCBNSVBTX0NPUF8wX1RMQl9ISQkJIyBzZXQgVlBOIGFnYWluCisJSEFaQVJEX0RFTEFZ CiAvKiBTTVAhISAtIFdvcmtzIG9ubHkgZm9yICB1bnNoYXJlZCBUTEIgY2FzZSAtIGkuZS4gbm8g di1jcHVzICovCi0JbXRjMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9JTkRFWAkJIyBUTEIgZW50cnkg IzAKKwltdGMwCQl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9JTkRFWAkjIFRMQiBlbnRyeSAjMAogCUhB WkFSRF9ERUxBWQogCVBURV9NVEMwCWExLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMgdXB0ZVswXQog CUhBWkFSRF9ERUxBWQogCVBURV9NVEMwCWEyLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgdXB0ZVsx XQorI2lmZGVmIEtTVEFDS19MQVJHRV9QQUdFCisJSEFaQVJEX0RFTEFZCisJbGkJCXQxLCBLU1RB Q0tfVExCTUFTS19NQVNLCisJTVRDMAkJdDEsIE1JUFNfQ09QXzBfVExCX1BHX01BU0sKIAlIQVpB UkRfREVMQVkKKyNlbHNlCisJTVRDMAkJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSworCUhB WkFSRF9ERUxBWQorI2VuZGlmCiAJdGxid2kJCQkJCSMgc2V0IFRMQiBlbnRyeSAjMAogCUhBWkFS RF9ERUxBWQorCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UKKwlNVEMwCQl6ZXJvLCBNSVBTX0NP UF8wX1RMQl9QR19NQVNLCisJSEFaQVJEX0RFTEFZCisjZW5kaWYKIC8qCiAgKiBOb3cgcnVubmlu ZyBvbiBuZXcgdSBzdHJ1Y3QuCiAgKi8KZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvcG1hcF9t aXBzNjQuYyBiL3N5cy9taXBzL21pcHMvcG1hcF9taXBzNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9taXBzL21pcHMvcG1hcF9taXBzNjQuYwpAQCAtMCww ICsxLDU1NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEgUmVnZW50cyBvZiB0aGUgVW5p dmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHly aWdodCAoYykgMTk5NCBKb2huIFMuIER5c29uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICog Q29weXJpZ2h0IChjKSAxOTk0IERhdmlkIEdyZWVubWFuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVk LgorICogQ29weXJpZ2h0IChjKSAyMDAzIFBldGVyIFdlbW0KKyAqIEFsbCByaWdodHMgcmVzZXJ2 ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBBbGFuIEwuIENveCA8YWxjQGNzLnJpY2Uu ZWR1PgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxNSBTdGFj ZXkgRC4gU29uIDxzc29uQC4uLj4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp cyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBi eQorICogdGhlIFN5c3RlbXMgUHJvZ3JhbW1pbmcgR3JvdXAgb2YgdGhlIFVuaXZlcnNpdHkgb2Yg VXRhaCBDb21wdXRlcgorICogU2NpZW5jZSBEZXBhcnRtZW50IGFuZCBXaWxsaWFtIEpvbGl0eiBv ZiBVVU5FVCBUZWNobm9sb2dpZXMgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0 aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0 aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFt ZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAq ICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZy b20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl cm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5U UyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJ RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhF IFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElO RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwK KyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP RiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFO RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU CisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT RSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4K KyAqCisgKglmcm9tOglAKCMpcG1hcC5jCTcuNyAoQmVya2VsZXkpCTUvMTIvOTEKKyAqCWZyb206 IHNyYy9zeXMvaTM4Ni9pMzg2L3BtYXAuYyx2IDEuMjUwLjIuOCAyMDAwLzExLzIxIDAwOjA5OjE0 IHBzCisgKglKTlBSOiBwbWFwLmMsdiAxLjExLjIuMSAyMDA3LzA4LzE2IDExOjUxOjA2IGdpcmlz aAorICovCisKKy8qCisgKglNYW5hZ2VzIHBoeXNpY2FsIGFkZHJlc3MgbWFwcy4KKyAqCisgKglT aW5jZSB0aGUgaW5mb3JtYXRpb24gbWFuYWdlZCBieSB0aGlzIG1vZHVsZSBpcworICoJYWxzbyBz dG9yZWQgYnkgdGhlIGxvZ2ljYWwgYWRkcmVzcyBtYXBwaW5nIG1vZHVsZSwKKyAqCXRoaXMgbW9k dWxlIG1heSB0aHJvdyBhd2F5IHZhbGlkIHZpcnR1YWwtdG8tcGh5c2ljYWwKKyAqCW1hcHBpbmdz IGF0IGFsbW9zdCBhbnkgdGltZS4gIEhvd2V2ZXIsIGludmFsaWRhdGlvbnMKKyAqCW9mIHZpcnR1 YWwtdG8tcGh5c2ljYWwgbWFwcGluZ3MgbXVzdCBiZSBkb25lIGFzCisgKglyZXF1ZXN0ZWQuCisg KgorICoJSW4gb3JkZXIgdG8gY29wZSB3aXRoIGhhcmR3YXJlIGFyY2hpdGVjdHVyZXMgd2hpY2gK KyAqCW1ha2UgdmlydHVhbC10by1waHlzaWNhbCBtYXAgaW52YWxpZGF0ZXMgZXhwZW5zaXZlLAor ICoJdGhpcyBtb2R1bGUgbWF5IGRlbGF5IGludmFsaWRhdGUgb3IgcmVkdWNlZCBwcm90ZWN0aW9u CisgKglvcGVyYXRpb25zIHVudGlsIHN1Y2ggdGltZSBhcyB0aGV5IGFyZSBhY3R1YWxseQorICoJ bmVjZXNzYXJ5LiAgVGhpcyBtb2R1bGUgaXMgZ2l2ZW4gZnVsbCBpbmZvcm1hdGlvbiBhcworICoJ dG8gd2hpY2ggcHJvY2Vzc29ycyBhcmUgY3VycmVudGx5IHVzaW5nIHdoaWNoIG1hcHMsCisgKglh bmQgdG8gd2hlbiBwaHlzaWNhbCBtYXBzIG11c3QgYmUgbWFkZSBjb3JyZWN0LgorICovCisKKyNp bmNsdWRlIDxzeXMvY2RlZnMuaD4KK19fRkJTRElEKCIkRnJlZUJTRCQiKTsKKworI2luY2x1ZGUg Im9wdF9kZGIuaCIKKyNpbmNsdWRlICJvcHRfcG1hcC5oIgorI2luY2x1ZGUgIm9wdF92bS5oIgor CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N5c3RtLmg+CisjaW5jbHVk ZSA8c3lzL2t0ci5oPgorI2luY2x1ZGUgPHN5cy9sb2NrLmg+CisjaW5jbHVkZSA8c3lzL21tYW4u aD4KKyNpbmNsdWRlIDxzeXMvbXNnYnVmLmg+CisjaW5jbHVkZSA8c3lzL211dGV4Lmg+CisjaW5j bHVkZSA8c3lzL3BjcHUuaD4KKyNpbmNsdWRlIDxzeXMvcHJvYy5oPgorI2luY2x1ZGUgPHN5cy9y d2xvY2suaD4KKyNpbmNsdWRlIDxzeXMvc2NoZWQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4K KyNpbmNsdWRlIDxzeXMvX3R5cGVzLmg+CisjaWZkZWYgU01QCisjaW5jbHVkZSA8c3lzL3NtcC5o PgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvY3B1c2V0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMv c3lzY3RsLmg+CisjaW5jbHVkZSA8c3lzL3ZtbWV0ZXIuaD4KKworI2lmZGVmIEREQgorI2luY2x1 ZGUgPGRkYi9kZGIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8dm0vdm0uaD4KKyNpbmNsdWRlIDx2 bS92bV9wYXJhbS5oPgorI2luY2x1ZGUgPHZtL3ZtX2tlcm4uaD4KKyNpbmNsdWRlIDx2bS92bV9w YWdlLmg+CisjaW5jbHVkZSA8dm0vdm1fbWFwLmg+CisjaW5jbHVkZSA8dm0vdm1fb2JqZWN0Lmg+ CisjaW5jbHVkZSA8dm0vdm1fZXh0ZXJuLmg+CisjaW5jbHVkZSA8dm0vdm1fcGFnZW91dC5oPgor I2luY2x1ZGUgPHZtL3ZtX3BhZ2VyLmg+CisjaW5jbHVkZSA8dm0vdm1fcmFkaXguaD4KKyNpbmNs dWRlIDx2bS92bV9yZXNlcnYuaD4KKyNpbmNsdWRlIDx2bS91bWEuaD4KKworI2luY2x1ZGUgPG1h Y2hpbmUvY2FjaGUuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL21kX3Zhci5oPgorI2luY2x1ZGUgPG1h Y2hpbmUvdGxiLmg+CisKKyN1bmRlZiBQTUFQX0RFQlVHCisKKyNpZiAhZGVmaW5lZChESUFHTk9T VElDKQorI2RlZmluZQlQTUFQX0lOTElORSBfX2lubGluZQorI2Vsc2UKKyNkZWZpbmUJUE1BUF9J TkxJTkUKKyNlbmRpZgorCisvLyAjZGVmaW5lIFBWX1NUQVRTCisjaWZkZWYgUFZfU1RBVFMKKyNk ZWZpbmUgUFZfU1RBVCh4KQlkbyB7IHggOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgUFZf U1RBVCh4KQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZQlwYV9pbmRleChwYSkJ KChwYSkgPj4gUERSU0hJRlQpCisjZGVmaW5lCXBhX3RvX3B2aChwYSkJKCZwdl90YWJsZVtwYV9p bmRleChwYSldKQorCisjZGVmaW5lCU5QVl9MSVNUX0xPQ0tTCU1BWENQVQorCisjZGVmaW5lCVBI WVNfVE9fUFZfTElTVF9MT0NLKHBhKQlcCisJCSgmcHZfbGlzdF9sb2Nrc1twYV9pbmRleChwYSkg JSBOUFZfTElTVF9MT0NLU10pCisKKyNkZWZpbmUJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlT KGxvY2twLCBwYSkJZG8gewlcCisJc3RydWN0IHJ3bG9jayAqKl9sb2NrcCA9IChsb2NrcCk7CQlc CisJc3RydWN0IHJ3bG9jayAqX25ld19sb2NrOwkJCVwKKwkJCQkJCQlcCisJX25ld19sb2NrID0g UEhZU19UT19QVl9MSVNUX0xPQ0socGEpOwkJXAorCWlmIChfbmV3X2xvY2sgIT0gKl9sb2NrcCkg ewkJCVwKKwkJaWYgKCpfbG9ja3AgIT0gTlVMTCkJCQlcCisJCQlyd193dW5sb2NrKCpfbG9ja3Ap OwkJXAorCQkqX2xvY2twID0gX25ld19sb2NrOwkJCVwKKwkJIHJ3X3dsb2NrKCpfbG9ja3ApOwkJ CVwKKwl9CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDSEFOR0VfUFZfTElTVF9MT0NL X1RPX1ZNX1BBR0UobG9ja3AsIG0pCVwKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxv Y2twLCBWTV9QQUdFX1RPX1BIWVMobSkpCisKKyNkZWZpbmUJUkVMRUFTRV9QVl9MSVNUX0xPQ0so bG9ja3ApCQlkbyB7CVwKKwlzdHJ1Y3Qgcndsb2NrICoqX2xvY2twID0gKGxvY2twKTsJCVwKKwkJ CQkJCQlcCisJaWYgKCpfbG9ja3AgIT0gTlVMTCkgewkJCQlcCisJCXJ3X3d1bmxvY2soKl9sb2Nr cCk7CQkJXAorCQkqX2xvY2twID0gTlVMTDsJCQkJXAorCX0JCQkJCQlcCit9IHdoaWxlICgwKQor CisjZGVmaW5lCVZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pCVwKKwkJUEhZU19UT19QVl9MSVNU X0xPQ0soVk1fUEFHRV9UT19QSFlTKG0pKQorCisvKgorICogR2V0IFBERXMgYW5kIFBURXMgZm9y IHVzZXIva2VybmVsIGFkZHJlc3Mgc3BhY2UKKyAqLworI2RlZmluZQlwbWFwX3NlZ19pbmRleCh2 KQkoKCh2KSA+PiBTRUdTSElGVCkgJiAoTlBERVBHIC0gMSkpCisjZGVmaW5lCXBtYXBfcGRlX2lu ZGV4KHYpCSgoKHYpID4+IFBEUlNISUZUKSAmIChOUERFUEcgLSAxKSkKKyNkZWZpbmUJcG1hcF9w dGVfaW5kZXgodikJKCgodikgPj4gUEFHRV9TSElGVCkgJiAoTlBURVBHIC0gMSkpCisjZGVmaW5l CXBtYXBfcGRlX3BpbmRleCh2KQkoKHYpID4+IFBEUlNISUZUKQorCisjZGVmaW5lCU5VUERFCQkJ KE5QREVQRyAqIE5QREVQRykKKyNkZWZpbmUJTlVTRVJQR1RCTFMJCShOVVBERSArIE5QREVQRykK KworI2RlZmluZQlpc19rZXJuZWxfcG1hcCh4KQkoKHgpID09IGtlcm5lbF9wbWFwKQorCitzdHJ1 Y3QgcG1hcCBrZXJuZWxfcG1hcF9zdG9yZTsKK3BkX2VudHJ5X3QgKmtlcm5lbF9zZWdtYXA7CisK K3ZtX29mZnNldF90IHZpcnR1YWxfYXZhaWw7CS8qIFZBIG9mIGZpcnN0IGF2YWlsIHBhZ2UgKGFm dGVyIGtlcm5lbCBic3MpICovCit2bV9vZmZzZXRfdCB2aXJ0dWFsX2VuZDsJLyogVkEgb2YgbGFz dCBhdmFpbCBwYWdlIChlbmQgb2Yga2VybmVsIEFTKSAqLworCitzdGF0aWMgaW50IG5rcHQ7Cit1 bnNpZ25lZCBwbWFwX21heF9hc2lkOwkJLyogbWF4IEFTSUQgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0 ZW0gKi8KKworc3RhdGljIFNZU0NUTF9OT0RFKF92bSwgT0lEX0FVVE8sIHBtYXAsIENUTEZMQUdf UkQsIDAsICJWTS9wbWFwIHBhcmFtZXRlcnMiKTsKK3N0YXRpYyBpbnQgcGdfc3BfZW5hYmxlZCA9 IDA7CitTWVNDVExfSU5UKF92bV9wbWFwLCBPSURfQVVUTywgcGdfcHNfZW5hYmxlZCwgQ1RMRkxB R19SRFRVTiB8IENUTEZMQUdfTk9GRVRDSCwKKyAgICAmcGdfc3BfZW5hYmxlZCwgMCwgIkFyZSBs YXJnZSBwYWdlIG1hcHBpbmdzIGVuYWJsZWQ/Iik7CisKKyNkZWZpbmUJUE1BUF9BU0lEX1JFU0VS VkVECTAKKwordm1fb2Zmc2V0X3Qga2VybmVsX3ZtX2VuZCA9IFZNX01JTl9LRVJORUxfQUREUkVT UzsKKworc3RhdGljIHZvaWQgcG1hcF9hc2lkX2FsbG9jKHBtYXBfdCBwbWFwKTsKKworc3RhdGlj IHN0cnVjdCByd2xvY2tfcGFkYWxpZ24gcHZoX2dsb2JhbF9sb2NrOworCisvKgorICogRGF0YSBm b3IgdGhlIHB2IGVudHJ5IGFsbG9jYXRpb24gbWVjaGFuaXNtCisgKi8KK3N0YXRpYyBUQUlMUV9I RUFEKHBjaCwgcHZfY2h1bmspIHB2X2NodW5rcyA9IFRBSUxRX0hFQURfSU5JVElBTElaRVIocHZf Y2h1bmtzKTsKK3N0YXRpYyBzdHJ1Y3QgbXR4IHB2X2NodW5rc19tdXRleDsKK3N0YXRpYyBzdHJ1 Y3Qgcndsb2NrIHB2X2xpc3RfbG9ja3NbTlBWX0xJU1RfTE9DS1NdOworc3RhdGljIHN0cnVjdCBt ZF9wYWdlICpwdl90YWJsZTsKKworc3RhdGljIHZvaWQgZnJlZV9wdl9jaHVuayhzdHJ1Y3QgcHZf Y2h1bmsgKnBjKTsKK3N0YXRpYyB2b2lkIGZyZWVfcHZfZW50cnkocG1hcF90IHBtYXAsIHB2X2Vu dHJ5X3QgcHYpOworc3RhdGljIHB2X2VudHJ5X3QgZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBz dHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCByZWNsYWltX3B2X2NodW5r KHBtYXBfdCBsb2NrZWRfcG1hcCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2b2lk IHBtYXBfcHZoX2ZyZWUoc3RydWN0IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNl dF90IHZhKTsKK3N0YXRpYyBwdl9lbnRyeV90IHBtYXBfcHZoX3JlbW92ZShzdHJ1Y3QgbWRfcGFn ZSAqcHZoLCBwbWFwX3QgcG1hcCwKKyAgICB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm1fcGFn ZV90IHBtYXBfYWxsb2NfZGlyZWN0X3BhZ2UodW5zaWduZWQgaW50IGluZGV4LCBpbnQgcmVxKTsK K3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9lbnRlcl9xdWlja19sb2NrZWQocG1hcF90IHBtYXAsIHZt X29mZnNldF90IHZhLAorICAgIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCwgdm1fcGFnZV90 IG1wdGUsICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZvaWQgcmVzZXJ2ZV9wdl9l bnRyaWVzKHBtYXBfdCBwbWFwLCBpbnQgbmVlZGVkLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2Nr cCk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwgcGRfZW50 cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgYm9vbGVhbl90IHBtYXBfZGVtb3Rl X3BkZV9sb2NrZWQocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkZSwKKyAgICB2bV9vZmZzZXRf dCB2YSwgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2bV9wYWdlX3QgcG1hcF9hbGxv Y3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxv Y2twKTsKK3N0YXRpYyBib29sZWFuX3QgcG1hcF9lbnRlcl9wZGUocG1hcF90IHBtYXAsIHZtX29m ZnNldF90IHZhLCB2bV9wYWdlX3QgbSwKKyAgICB2bV9wcm90X3QgcHJvdCwgc3RydWN0IHJ3bG9j ayAqKmxvY2twKTsKK3N0YXRpYyB2b2lkIHBtYXBfcHZfZGVtb3RlX3BkZShwbWFwX3QgcG1hcCwg dm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2tw KTsKK3N0YXRpYyBib29sZWFuX3QgcG1hcF9wdl9pbnNlcnRfcGRlKHBtYXBfdCBwbWFwLCB2bV9v ZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOwor c3RhdGljIHZvaWQgcG1hcF9wdl9wcm9tb3RlX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qg dmEsIHZtX3BhZGRyX3QgcGEsCisgICAgc3RydWN0IHJ3bG9jayAqKmxvY2twKTsKK3N0YXRpYyB2 b2lkIHBtYXBfZmlsbF9wdHAocHRfZW50cnlfdCAqZmlyc3RwdGUsIHB0X2VudHJ5X3QgbmV3cHRl KTsKK3N0YXRpYyBfX2lubGluZSBpbnQgcG1hcF9pbnNlcnRfcHRfcGFnZShwbWFwX3QgcG1hcCwg dm1fcGFnZV90IG1wdGUpOworc3RhdGljIF9faW5saW5lIHZtX3BhZ2VfdCBwbWFwX2xvb2t1cF9w dF9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm9pZCBwbWFwX3By b21vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAor ICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfcmVtb3ZlX3BkZShw bWFwX3QgcG1hcCwgcGRfZW50cnlfdCAqcGRxLCB2bV9vZmZzZXRfdCBzdmEsCisgICAgc3RydWN0 IHNwZ2xpc3QgKmZyZWUsIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBf cmVtb3ZlX3B0ZShzdHJ1Y3QgcG1hcCAqcG1hcCwgcHRfZW50cnlfdCAqcHRxLCB2bV9vZmZzZXRf dCB2YSwKKyAgICBwZF9lbnRyeV90IHB0ZXBkZSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsIHN0cnVj dCByd2xvY2sgKipsb2NrcCk7CitzdGF0aWMgdm9pZCBwbWFwX3JlbW92ZV9wYWdlKHN0cnVjdCBw bWFwICpwbWFwLCB2bV9vZmZzZXRfdCB2YSwKKyAgICBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSk7Citz dGF0aWMgYm9vbGVhbl90IHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShwbWFwX3QgcG1hcCwgdm1f b2Zmc2V0X3QgdmEsCisgICAgdm1fcGFnZV90IG0sIHN0cnVjdCByd2xvY2sgKipsb2NrcCk7Citz dGF0aWMgdm9pZCBwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwg cHRfZW50cnlfdCBwdGUpOworc3RhdGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3Qg cG1hcCk7CitzdGF0aWMgdm9pZCBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwX3QgcG1hcCwgdm1f b2Zmc2V0X3QgdmEpOworc3RhdGljIHZvaWQgX3BtYXBfdW53aXJlX3B0cChwbWFwX3QgcG1hcCwg dm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlKTsK Kworc3RhdGljIHZtX3BhZ2VfdCBwbWFwX2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRf dCB2YSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApOworc3RhdGljIHZtX3BhZ2VfdCBfcG1h cF9hbGxvY3B0ZShwbWFwX3QgcG1hcCwgdW5zaWduZWQgcHRlcGluZGV4LAorICAgIHN0cnVjdCBy d2xvY2sgKipsb2NrcCk7CitzdGF0aWMgaW50IHBtYXBfdW51c2VfcHQocG1hcF90LCB2bV9vZmZz ZXRfdCwgcGRfZW50cnlfdCwgc3RydWN0IHNwZ2xpc3QgKik7CitzdGF0aWMgcHRfZW50cnlfdCBp bml0X3B0ZV9wcm90KHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgYWNjZXNzLCB2bV9wcm90X3QgcHJv dCk7CisKK3N0YXRpYyB2b2lkIHBtYXBfaW52YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcp Oworc3RhdGljIHZvaWQgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbih2b2lkICphcmcpOwor c3RhdGljIHZvaWQgcG1hcF91cGRhdGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKTsKKworLyoKKyAq IFBhZ2UgdGFibGUgZW50cnkgbG9va3VwIHJvdXRpbmVzLgorICovCisKKy8qIFJldHVybiBhIHNl Z21lbnQgZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0aWMg X19pbmxpbmUgcGRfZW50cnlfdCAqCitwbWFwX3NlZ21hcChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEpCit7CisKKwlyZXR1cm4gKCZwbWFwLT5wbV9zZWd0YWJbcG1hcF9zZWdfaW5kZXgodmEp XSk7Cit9CisKKy8qIFJldHVybiBhIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IGZvciBnaXZlbiBzZWdt ZW50IHRhYmxlICYgdmlydHVhbCBhZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHBkX2VudHJ5 X3QgKgorcG1hcF9wZHBlX3RvX3BkZShwZF9lbnRyeV90ICpwZHBlLCB2bV9vZmZzZXRfdCB2YSkK K3sKKwlwZF9lbnRyeV90ICpwZGU7CisKKwlwZGUgPSAocGRfZW50cnlfdCAqKSpwZHBlOworCXJl dHVybiAoJnBkZVtwbWFwX3BkZV9pbmRleCh2YSldKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSBk aXJlY3RvcnkgZW50cnkgZm9yIGdpdmVuIHBtYXAgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitzdGF0 aWMgX19pbmxpbmUgcGRfZW50cnlfdCAqCitwbWFwX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRwZTsKKworCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFw LCB2YSk7CisJaWYgKCpwZHBlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlyZXR1cm4g KHBtYXBfcGRwZV90b19wZGUocGRwZSwgdmEpKTsKK30KKworLyogUmV0dXJuIGEgcGFnZSB0YWJs ZSBlbnRyeSBmb3IgZ2l2ZW4gcGFnZSBkaXJlY3RvcnkgJiB2aXJ0dWFsIGFkZHJlc3MuICovCitz dGF0aWMgX19pbmxpbmUgcHRfZW50cnlfdCAqCitwbWFwX3BkZV90b19wdGUocGRfZW50cnlfdCAq cGRlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlwdGUgPSAocHRf ZW50cnlfdCAqKSpwZGU7CisJcmV0dXJuICgmcHRlW3BtYXBfcHRlX2luZGV4KHZhKV0pOworfQor CisvKiBSZXR1cm4gYSBwYWdlIHRhYmxlIGVudHJ5IGZvciBnaXZlbiBwbWFwICYgdmlydHVhbCBh ZGRyZXNzLiAqLworcHRfZW50cnlfdCAqCitwbWFwX3B0ZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0 X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOworCisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEp OworCWlmIChwZGUgPT0gTlVMTCB8fCAqcGRlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJ aWYgKHBkZV9pc19zdXBlcnBhZ2UocGRlKSkgeworCQlyZXR1cm4gKChwdF9lbnRyeV90ICopcGRl KTsKKwl9IGVsc2UKKwkJcmV0dXJuIChwbWFwX3BkZV90b19wdGUocGRlLCB2YSkpOworfQorCitz dGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcF90IHBtYXAs IGludCBjb3VudCkKK3sKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCXBt YXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50ICs9IGNvdW50OworfQorCitzdGF0aWMgX19pbmxp bmUgdm9pZAorcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcF90IHBtYXAsIGludCBjb3VudCkK K3sKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCUtBU1NFUlQocG1hcC0+ cG1fc3RhdHMucmVzaWRlbnRfY291bnQgPj0gY291bnQsCisJICAgICgicG1hcCAlcCByZXNpZGVu dCBjb3VudCB1bmRlcmZsb3cgJWxkICVkIiwgcG1hcCwKKwkgICAgcG1hcC0+cG1fc3RhdHMucmVz aWRlbnRfY291bnQsIGNvdW50KSk7CisJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgLT0g Y291bnQ7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBzb21lIHdpcmVkIG1lbW9yeSBiZWZvcmUgdGhl IHZpcnR1YWwgbWVtb3J5IHN5c3RlbSBpcworICogYm9vdHN0cmFwcGVkLgorICovCit2bV9vZmZz ZXRfdAorcG1hcF9zdGVhbF9tZW1vcnkodm1fc2l6ZV90IHNpemUpCit7CisJdm1fcGFkZHJfdCBi YW5rX3NpemUsIHBhOworCXZtX29mZnNldF90IHZhOworCisJc2l6ZSA9IHJvdW5kX3BhZ2Uoc2l6 ZSk7CisJYmFua19zaXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJd2hpbGUg KHNpemUgPiBiYW5rX3NpemUpIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgcGh5c19hdmFp bFtpICsgMl07IGkgKz0gMikgeworCQkJcGh5c19hdmFpbFtpXSA9IHBoeXNfYXZhaWxbaSArIDJd OworCQkJcGh5c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2YWlsW2kgKyAzXTsKKwkJfQorCQlwaHlz X2F2YWlsW2ldID0gMDsKKwkJcGh5c19hdmFpbFtpICsgMV0gPSAwOworCQlpZiAoIXBoeXNfYXZh aWxbMF0pCisJCQlwYW5pYygicG1hcF9zdGVhbF9tZW1vcnk6IG91dCBvZiBtZW1vcnkiKTsKKwkJ YmFua19zaXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxbMF07CisJfQorCisJcGEgPSBw aHlzX2F2YWlsWzBdOworCXBoeXNfYXZhaWxbMF0gKz0gc2l6ZTsKKwl2YSA9IE1JUFNfUEhZU19U T19ESVJFQ1QocGEpOworCWJ6ZXJvKChjYWRkcl90KXZhLCBzaXplKTsKKwlyZXR1cm4gKHZhKTsK K30KKworLyoKKyAqIEJvb3RzdHJhcCB0aGUgc3lzdGVtIGVub3VnaCB0byBydW4gd2l0aCB2aXJ0 dWFsIG1lbW9yeS4gIFRoaXMKKyAqIGFzc3VtZXMgdGhhdCB0aGUgcGh5c19hdmFpbCBhcnJheSBo YXMgYmVlbiBpbml0aWFsaXplZC4KKyAqLworc3RhdGljIHZvaWQKK3BtYXBfY3JlYXRlX2tlcm5l bF9wYWdldGFibGUodm9pZCkKK3sKKwlpbnQgaSwgajsKKwl2bV9vZmZzZXRfdCBwdGFkZHI7CisJ cHRfZW50cnlfdCAqcHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZzZXRfdCBwZGFkZHI7 CisJaW50IG5wdCwgbnBkZTsKKworCS8qCisJICogQWxsb2NhdGUgc2VnbWVudCB0YWJsZSBmb3Ig dGhlIGtlcm5lbAorCSAqLworCWtlcm5lbF9zZWdtYXAgPSAocGRfZW50cnlfdCAqKXBtYXBfc3Rl YWxfbWVtb3J5KFBBR0VfU0laRSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNlY29uZCBsZXZlbCBw YWdlIHRhYmxlcyBmb3IgdGhlIGtlcm5lbAorCSAqLworCW5wZGUgPSBob3dtYW55KE5LUFQsIE5Q REVQRyk7CisJcGRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbnBkZSk7CisJ bmtwdCA9IE5LUFQ7CisJcHRhZGRyID0gcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbmtw dCk7CisKKwkvKgorCSAqIFRoZSBSWzQtN10/MDAgc3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhl IEdsb2JhbCBiaXQgaW4gdGhlCisJICogdHJhbnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlciBmb3Ig ZWFjaCAyIHBhZ2UgZW50cnkuIFRodXMgaW52YWxpZAorCSAqIGVudHJ5cyBtdXN0IGhhdmUgdGhl IEdsb2JhbCBiaXQgc2V0IHNvIHdoZW4gRW50cnkgTE8gYW5kIEVudHJ5IEhJCisJICogRyBiaXRz IGFyZSBhbmRlZCB0b2dldGhlciB0aGV5IHdpbGwgcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3Rv cmUKKwkgKiBpbiB0aGUgdGxiLgorCSAqLworCWZvciAoaSA9IDAsIHB0ZSA9IChwdF9lbnRyeV90 ICopcHRhZGRyOyBpIDwgKG5rcHQgKiBOUFRFUEcpOyBpKyssIHB0ZSsrKQorCQkqcHRlID0gUFRF X0c7CisKKwlmb3IgKGkgPSAwLCAgbnB0ID0gbmtwdDsgbnB0ID4gMDsgaSsrKSB7CisJCWtlcm5l bF9zZWdtYXBbaV0gPSAocGRfZW50cnlfdCkocGRhZGRyICsgaSAqIFBBR0VfU0laRSk7CisJCXBk ZSA9IChwZF9lbnRyeV90ICopa2VybmVsX3NlZ21hcFtpXTsKKworCQlmb3IgKGogPSAwOyBqIDwg TlBERVBHICYmIG5wdCA+IDA7IGorKywgbnB0LS0pCisJCQlwZGVbal0gPSAocGRfZW50cnlfdCko cHRhZGRyICsgKGkgKiBOUERFUEcgKyBqKSAqCisJCQkgICAgUEFHRV9TSVpFKTsKKwl9CisKKwlQ TUFQX0xPQ0tfSU5JVChrZXJuZWxfcG1hcCk7CisJa2VybmVsX3BtYXAtPnBtX3NlZ3RhYiA9IGtl cm5lbF9zZWdtYXA7CisJQ1BVX0ZJTEwoJmtlcm5lbF9wbWFwLT5wbV9hY3RpdmUpOworCVRBSUxR X0lOSVQoJmtlcm5lbF9wbWFwLT5wbV9wdmNodW5rKTsKKwlrZXJuZWxfcG1hcC0+cG1fYXNpZFsw XS5hc2lkID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCWtlcm5lbF9wbWFwLT5wbV9hc2lkWzBdLmdl biA9IDA7CisJa2VybmVsX3ZtX2VuZCArPSBua3B0ICogTlBURVBHICogUEFHRV9TSVpFOworfQor Cit2b2lkCitwbWFwX2Jvb3RzdHJhcCh2b2lkKQoreworCWludCBpOworCisJLyogU29ydC4gKi8K K2FnYWluOgorCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSArIDFdICE9IDA7IGkgKz0gMikgewor CQkvKgorCQkgKiBLZWVwIHRoZSBtZW1vcnkgYWxpZ25lZCBvbiBwYWdlIGJvdW5kYXJ5LgorCQkg Ki8KKwkJcGh5c19hdmFpbFtpXSA9IHJvdW5kX3BhZ2UocGh5c19hdmFpbFtpXSk7CisJCXBoeXNf YXZhaWxbaSArIDFdID0gdHJ1bmNfcGFnZShwaHlzX2F2YWlsW2kgKyAxXSk7CisKKwkJaWYgKGkg PCAyKQorCQkJY29udGludWU7CisJCWlmIChwaHlzX2F2YWlsW2kgLSAyXSA+IHBoeXNfYXZhaWxb aV0pIHsKKwkJCXZtX3BhZGRyX3QgcHRlbXBbMl07CisKKwkJCXB0ZW1wWzBdID0gcGh5c19hdmFp bFtpICsgMF07CisJCQlwdGVtcFsxXSA9IHBoeXNfYXZhaWxbaSArIDFdOworCisJCQlwaHlzX2F2 YWlsW2kgKyAwXSA9IHBoeXNfYXZhaWxbaSAtIDJdOworCQkJcGh5c19hdmFpbFtpICsgMV0gPSBw aHlzX2F2YWlsW2kgLSAxXTsKKworCQkJcGh5c19hdmFpbFtpIC0gMl0gPSBwdGVtcFswXTsKKwkJ CXBoeXNfYXZhaWxbaSAtIDFdID0gcHRlbXBbMV07CisJCQlnb3RvIGFnYWluOworCQl9CisJfQor CisJLyoKKwkgKiBDb3B5IHRoZSBwaHlzX2F2YWlsW10gYXJyYXkgYmVmb3JlIHdlIHN0YXJ0IHN0 ZWFsaW5nIG1lbW9yeSBmcm9tIGl0LgorCSAqLworCWZvciAoaSA9IDA7IHBoeXNfYXZhaWxbaSAr IDFdICE9IDA7IGkgKz0gMikgeworCQlwaHlzbWVtX2Rlc2NbaV0gPSBwaHlzX2F2YWlsW2ldOwor CQlwaHlzbWVtX2Rlc2NbaSArIDFdID0gcGh5c19hdmFpbFtpICsgMV07CisJfQorCisJTWF4bWVt ID0gYXRvcChwaHlzX2F2YWlsW2kgLSAxXSk7CisKKwlpZiAoYm9vdHZlcmJvc2UpIHsKKwkJcHJp bnRmKCJQaHlzaWNhbCBtZW1vcnkgY2h1bmsocyk6XG4iKTsKKwkJZm9yIChpID0gMDsgcGh5c19h dmFpbFtpICsgMV0gIT0gMDsgaSArPSAyKSB7CisJCQl2bV9wYWRkcl90IHNpemU7CisKKwkJCXNp emUgPSBwaHlzX2F2YWlsW2kgKyAxXSAtIHBoeXNfYXZhaWxbaV07CisJCQlwcmludGYoIiUjMDhq eCAtICUjMDhqeCwgJWp1IGJ5dGVzICglanUgcGFnZXMpXG4iLAorCQkJICAgICh1aW50bWF4X3Qp IHBoeXNfYXZhaWxbaV0sCisJCQkgICAgKHVpbnRtYXhfdCkgcGh5c19hdmFpbFtpICsgMV0gLSAx LAorCQkJICAgICh1aW50bWF4X3QpIHNpemUsICh1aW50bWF4X3QpIHNpemUgLyBQQUdFX1NJWkUp OworCQl9CisJCXByaW50ZigiTWF4bWVtIGlzIDB4JTBqeFxuIiwgcHRvYSgodWludG1heF90KU1h eG1lbSkpOworCX0KKwkvKgorCSAqIFN0ZWFsIHRoZSBtZXNzYWdlIGJ1ZmZlciBmcm9tIHRoZSBi ZWdpbm5pbmcgb2YgbWVtb3J5LgorCSAqLworCW1zZ2J1ZnAgPSAoc3RydWN0IG1zZ2J1ZiAqKXBt YXBfc3RlYWxfbWVtb3J5KG1zZ2J1ZnNpemUpOworCW1zZ2J1ZmluaXQobXNnYnVmcCwgbXNnYnVm c2l6ZSk7CisKKwkvKgorCSAqIFN0ZWFsIHRocmVhZDAga3N0YWNrLiBUaGlzIG11c3QgYmUgYWxp Z25lZCB0bworCSAqIChLU1RBQ0tfUEFHRV9TSVpFICogMikgc28gaXQgY2FuIG1hcHBlZCB0byBh IHNpbmdsZSBUTEIgZW50cnkuCisJICoKKwkgKi8KKwlrc3RhY2swID0gcG1hcF9zdGVhbF9tZW1v cnkoKEtTVEFDS19QQUdFUyAgKyBLU1RBQ0tfR1VBUkRfUEFHRVMpIDw8CisJICAgIFBBR0VfU0hJ RlQpOworCWtzdGFjazAgPSByb3VuZHVwMihrc3RhY2swLCAoS1NUQUNLX1BBR0VfU0laRSAqIDIp KTsKKworCXZpcnR1YWxfYXZhaWwgPSBWTV9NSU5fS0VSTkVMX0FERFJFU1M7CisJdmlydHVhbF9l bmQgPSBWTV9NQVhfS0VSTkVMX0FERFJFU1M7CisKKyNpZmRlZiBTTVAKKwkvKgorCSAqIFN0ZWFs IHNvbWUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIHRvIG1hcCB0aGUgcGNwdSBhcmVhLgorCSAqLwor CXZpcnR1YWxfYXZhaWwgPSByb3VuZHVwMih2aXJ0dWFsX2F2YWlsLCBQQUdFX1NJWkUgKiAyKTsK KwlwY3B1cCA9IChzdHJ1Y3QgcGNwdSAqKXZpcnR1YWxfYXZhaWw7CisJdmlydHVhbF9hdmFpbCAr PSBQQUdFX1NJWkUgKiAyOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSB3aXJlZCBUTEIgZW50 cnkgbWFwcGluZyB0aGUgcGNwdSByZWdpb24gZm9yCisJICogdGhlIEJTUCBhdCAncGNwdXAnLiBV cCB1bnRpbCB0aGlzIHBvaW50IHdlIHdlcmUgb3BlcmF0aW5nCisJICogd2l0aCB0aGUgJ3BjcHVw JyBmb3IgdGhlIEJTUCBwb2ludGluZyB0byBhIHZpcnR1YWwgYWRkcmVzcworCSAqIGluIEtTRUcw IHNvIHRoZXJlIHdhcyBubyBuZWVkIGZvciBhIFRMQiBtYXBwaW5nLgorCSAqLworCW1pcHNfcGNw dV90bGJfaW5pdChQQ1BVX0FERFIoMCkpOworCisJaWYgKGJvb3R2ZXJib3NlKQorCQlwcmludGYo InBjcHUgaXMgYXZhaWxhYmxlIGF0IHZpcnR1YWwgYWRkcmVzcyAlcC5cbiIsIHBjcHVwKTsKKyNl bmRpZgorCisJcG1hcF9jcmVhdGVfa2VybmVsX3BhZ2V0YWJsZSgpOworCXBtYXBfbWF4X2FzaWQg PSBWTU5VTV9QSURTOworCW1pcHNfd3JfZW50cnloaSgwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKDAp OworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgcHYgbGlzdCBsb2NrLgorCSAqLwor CXJ3X2luaXQoJnB2aF9nbG9iYWxfbG9jaywgInBtYXAgcHYgZ2xvYmFsIik7Cit9CisKKy8qCisg KiBJbml0aWFsaXplIGEgdm1fcGFnZSdzIG1hY2hpbmUtZGVwZW5kZW50IGZpZWxkcy4KKyAqLwor dm9pZAorcG1hcF9wYWdlX2luaXQodm1fcGFnZV90IG0pCit7CisKKwlUQUlMUV9JTklUKCZtLT5t ZC5wdl9saXN0KTsKKwltLT5tZC5wdl9tZW1hdHRyID0gVk1fTUVNQVRUUl9ERUZBVUxUOworfQor CisvKgorICoJSW5pdGlhbGl6ZSB0aGUgcG1hcCBtb2R1bGUuCisgKglDYWxsZWQgYnkgdm1faW5p dCwgdG8gaW5pdGlhbGl6ZSBhbnkgc3RydWN0dXJlcyB0aGF0IHRoZSBwbWFwCisgKglzeXN0ZW0g bmVlZHMgdG8gbWFwIHZpcnR1YWwgbWVtb3J5LgorICovCit2b2lkCitwbWFwX2luaXQodm9pZCkK K3sKKwlpbnQgaTsKKwl2bV9zaXplX3QgczsKKwlpbnQgcHZfbnBnOworCisJLyoKKwkgKiBJbml0 aWFsaXplIHRoZSBwdiBjaHVuayBsaXN0IG11dGV4LgorCSAqLworCW10eF9pbml0KCZwdl9jaHVu a3NfbXV0ZXgsICJwbWFwIHB2IGNodW5rIGxpc3QiLCBOVUxMLCBNVFhfREVGKTsKKworCS8qCisJ ICogSW5pdGlhbGl6ZSB0aGUgcG9vbCBvZiBwdiBsaXN0IGxvY2tzLgorCSAqLworCWZvciAoaSA9 IDA7IGkgPCBOUFZfTElTVF9MT0NLUzsgaSsrKQorCQlyd19pbml0KCZwdl9saXN0X2xvY2tzW2ld LCAicHYgbGlzdCIpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHB2IGhl YWQgdGFibGUgZm9yIHN1cGVycGFnZXMuCisJICovCisJZm9yIChpID0gMDsgcGh5c19hdmFpbFtp ICsgMV07IGkgKz0gMik7CisJcHZfbnBnID0gcm91bmRfMm1wYWdlKHBoeXNfYXZhaWxbKGkgLSAy KSArIDFdKSAvIE5CUERSOworCisJLyoKKwkgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwdiBo ZWFkIHRhYmxlIGZvciBzdXBlcnBhZ2VzLgorCSAqLworCXMgPSAodm1fc2l6ZV90KShwdl9ucGcg KiBzaXplb2Yoc3RydWN0IG1kX3BhZ2UpKTsKKwlzID0gcm91bmRfcGFnZShzKTsKKwlwdl90YWJs ZSA9IChzdHJ1Y3QgbWRfcGFnZSAqKWttZW1fbWFsbG9jKGtlcm5lbF9hcmVuYSwgcywKKwkgICAg TV9XQUlUT0sgfCBNX1pFUk8pOworCWZvciAoaSA9IDA7IGkgPCBwdl9ucGc7IGkrKykKKwkJVEFJ TFFfSU5JVCgmcHZfdGFibGVbaV0ucHZfbGlzdCk7Cit9CisKK3N0YXRpYyBTWVNDVExfTk9ERShf dm1fcG1hcCwgT0lEX0FVVE8sIHBkZSwgQ1RMRkxBR19SRCwgMCwKKyAgICAiMk1CIHBhZ2UgbWFw cGluZyBjb3VudGVycyIpOworCitzdGF0aWMgdV9sb25nIHBtYXBfcGRlX2RlbW90aW9uczsKK1NZ U0NUTF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBkZW1vdGlvbnMsIENUTEZMQUdfUkQs CisgICAgJnBtYXBfcGRlX2RlbW90aW9ucywgMCwgIjJNQiBwYWdlIGRlbW90aW9ucyIpOworCitz dGF0aWMgdV9sb25nIHBtYXBfcGRlX21hcHBpbmdzOworU1lTQ1RMX1VMT05HKF92bV9wbWFwX3Bk ZSwgT0lEX0FVVE8sIG1hcHBpbmdzLCBDVExGTEFHX1JELAorICAgICZwbWFwX3BkZV9tYXBwaW5n cywgMCwgIjJNQiBwYWdlIG1hcHBpbmdzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcF9m YWlsdXJlczsKK1NZU0NUTF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwX2ZhaWx1cmVz LCBDVExGTEFHX1JELAorICAgICZwbWFwX3BkZV9wX2ZhaWx1cmVzLCAwLCAiMk1CIHBhZ2UgcHJv bW90aW9uIGZhaWx1cmVzIik7CisKK3N0YXRpYyB1X2xvbmcgcG1hcF9wZGVfcHJvbW90aW9uczsK K1NZU0NUTF9VTE9ORyhfdm1fcG1hcF9wZGUsIE9JRF9BVVRPLCBwcm9tb3Rpb25zLCBDVExGTEFH X1JELAorICAgICZwbWFwX3BkZV9wcm9tb3Rpb25zLCAwLCAiMk1CIHBhZ2UgcHJvbW90aW9ucyIp OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq CisgKiBMb3cgbGV2ZWwgaGVscGVyIHJvdXRpbmVzLi4uLi4KKyAqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZglTTVAKK3N0YXRpYyBf X2lubGluZSB2b2lkCitwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcF90IHBtYXAsIHZvaWQg KCpmbikodm9pZCAqKSwgdm9pZCAqYXJnKQoreworCWludAljcHVpZCwgY3B1LCBzZWxmOworCWNw dXNldF90IGFjdGl2ZV9jcHVzOworCisJc2NoZWRfcGluKCk7CisJaWYgKGlzX2tlcm5lbF9wbWFw KHBtYXApKSB7CisJCXNtcF9yZW5kZXp2b3VzKE5VTEwsIGZuLCBOVUxMLCBhcmcpOworCQlnb3Rv IG91dDsKKwl9CisJLyogRm9yY2UgQVNJRCB1cGRhdGUgb24gaW5hY3RpdmUgQ1BVcyAqLworCUNQ VV9GT1JFQUNIKGNwdSkgeworCQlpZiAoIUNQVV9JU1NFVChjcHUsICZwbWFwLT5wbV9hY3RpdmUp KQorCQkJcG1hcC0+cG1fYXNpZFtjcHVdLmdlbiA9IDA7CisJfQorCWNwdWlkID0gUENQVV9HRVQo Y3B1aWQpOworCS8qCisJICogWFhYOiBiYXJyaWVyL2xvY2tpbmcgZm9yIGFjdGl2ZT8KKwkgKgor CSAqIFRha2UgYSBzbmFwc2hvdCBvZiBhY3RpdmUgaGVyZSwgYW55IGZ1cnRoZXIgY2hhbmdlcyBh cmUgaWdub3JlZC4KKwkgKiB0bGIgdXBkYXRlL2ludmFsaWRhdGUgc2hvdWxkIGJlIGhhcm1sZXNz IG9uIGluYWN0aXZlIENQVXMKKwkgKi8KKwlhY3RpdmVfY3B1cyA9IHBtYXAtPnBtX2FjdGl2ZTsK KwlzZWxmID0gQ1BVX0lTU0VUKGNwdWlkLCAmYWN0aXZlX2NwdXMpOworCUNQVV9DTFIoY3B1aWQs ICZhY3RpdmVfY3B1cyk7CisJLyogT3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZXJlIHRoaXMgY3B1 IGlzIHRoZSBvbmx5IGFjdGl2ZSBvbmUgKi8KKwlpZiAoQ1BVX0VNUFRZKCZhY3RpdmVfY3B1cykp IHsKKwkJaWYgKHNlbGYpCisJCQlmbihhcmcpOworCX0gZWxzZSB7CisJCWlmIChzZWxmKQorCQkJ Q1BVX1NFVChjcHVpZCwgJmFjdGl2ZV9jcHVzKTsKKwkJc21wX3JlbmRlenZvdXNfY3B1cyhhY3Rp dmVfY3B1cywgTlVMTCwgZm4sIE5VTEwsIGFyZyk7CisJfQorb3V0OgorCXNjaGVkX3VucGluKCk7 Cit9CisjZWxzZSAvKiAhU01QICovCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9jYWxsX29u X2FjdGl2ZV9jcHVzKHBtYXBfdCBwbWFwLCB2b2lkICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZykK K3sKKwlpbnQJY3B1aWQ7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJZm4oYXJn KTsKKwkJcmV0dXJuOworCX0KKwljcHVpZCA9IFBDUFVfR0VUKGNwdWlkKTsKKwlpZiAoIUNQVV9J U1NFVChjcHVpZCwgJnBtYXAtPnBtX2FjdGl2ZSkpCisJCXBtYXAtPnBtX2FzaWRbY3B1aWRdLmdl biA9IDA7CisJZWxzZQorCQlmbihhcmcpOworfQorI2VuZGlmIC8qIFNNUCAqLworCitzdGF0aWMg dm9pZAorcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwX3QgcG1hcCkKK3sKKworCXBtYXBfY2FsbF9v bl9hY3RpdmVfY3B1cyhwbWFwLAorCSAgICAodm9pZCAoKikodm9pZCAqKSl0bGJfaW52YWxpZGF0 ZV9hbGxfdXNlciwgcG1hcCk7Cit9CisKK3N0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcg eworCXBtYXBfdCBwbWFwOworCXZtX29mZnNldF90IHZhOworfTsKKworc3RhdGljIHZvaWQKK3Bt YXBfaW52YWxpZGF0ZV9wYWdlX2FjdGlvbih2b2lkICphcmcpCit7CisJc3RydWN0IHBtYXBfaW52 YWxpZGF0ZV9wYWdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX2FkZHJlc3MocC0+ cG1hcCwgcC0+dmEpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1h cF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCBwbWFwX2ludmFsaWRhdGVfcGFn ZV9hcmcgYXJnOworCisJYXJnLnBtYXAgPSBwbWFwOworCWFyZy52YSA9IHZhOworCXBtYXBfY2Fs bF9vbl9hY3RpdmVfY3B1cyhwbWFwLCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hY3Rpb24sICZhcmcp OworfQorCitzdHJ1Y3QgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FyZyB7CisJcG1hcF90IHBtYXA7 CisJdm1fb2Zmc2V0X3Qgc3ZhOworCXZtX29mZnNldF90IGV2YTsKK307CisKK3N0YXRpYyB2b2lk CitwbWFwX2ludmFsaWRhdGVfcmFuZ2VfYWN0aW9uKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcG1h cF9pbnZhbGlkYXRlX3JhbmdlX2FyZyAqcCA9IGFyZzsKKworCXRsYl9pbnZhbGlkYXRlX3Jhbmdl KHAtPnBtYXAsIHAtPnN2YSwgcC0+ZXZhKTsKK30KKworc3RhdGljIHZvaWQKK3BtYXBfaW52YWxp ZGF0ZV9yYW5nZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9vZmZzZXRfdCBldmEp Cit7CisJc3RydWN0IHBtYXBfaW52YWxpZGF0ZV9yYW5nZV9hcmcgYXJnOworCisJYXJnLnBtYXAg PSBwbWFwOworCWFyZy5zdmEgPSBzdmE7CisJYXJnLmV2YSA9IGV2YTsKKwlwbWFwX2NhbGxfb25f YWN0aXZlX2NwdXMocG1hcCwgcG1hcF9pbnZhbGlkYXRlX3JhbmdlX2FjdGlvbiwgJmFyZyk7Cit9 CisKK3N0cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJdm1fb2Zm c2V0X3QgdmE7CisJcHRfZW50cnlfdCBwdGU7Cit9OworCitzdGF0aWMgdm9pZAorcG1hcF91cGRh dGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKQoreworCXN0cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2Fy ZyAqcCA9IGFyZzsKKworCXRsYl91cGRhdGUocC0+cG1hcCwgcC0+dmEsIHAtPnB0ZSk7Cit9CisK K3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wYWdlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2 YSwgcHRfZW50cnlfdCBwdGUpCit7CisJc3RydWN0IHBtYXBfdXBkYXRlX3BhZ2VfYXJnIGFyZzsK KworCWFyZy5wbWFwID0gcG1hcDsKKwlhcmcudmEgPSB2YTsKKwlhcmcucHRlID0gcHRlOworCXBt YXBfY2FsbF9vbl9hY3RpdmVfY3B1cyhwbWFwLCBwbWFwX3VwZGF0ZV9wYWdlX2FjdGlvbiwgJmFy Zyk7Cit9CisKK3N0YXRpYyB2b2lkCitwbWFwX3VwZGF0ZV9wZGVfaW52YWxpZGF0ZShwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHB0X2VudHJ5X3QgbmV3cGRlKQoreworCisJaWYgKCFwdGVf aXNfMW1fc3VwZXJwYWdlKCZuZXdwZGUpKSB7CisJCS8qIERlbW90aW9uOiBmbHVzaCBhIHNwZWNp ZmljIDJtYiBwYWdlIG1hcHBpbmcuICovCisJCXRsYl9pbnZhbGlkYXRlX3JhbmdlKHBtYXAsICh2 YSAmIH5QRFJNQVNLKSwKKwkJICAgICh2YSAmIH5QRFJNQVNLKSArIE5CUERSKTsKKwl9IGVsc2Ug aWYgKCFwdGVfdGVzdCgmbmV3cGRlLCBQVEVfRykpIHsKKwkJLyoKKwkJICogUHJvbW90aW9uOiBm bHVzaCBldmVyeSA0S0IgcGFnZSBtYXBwaW5nIGZyb20gdGhlIFRMQgorCQkgKiBiZWNhdXNlIHRo ZXJlIGFyZSB0b28gbWFueSB0byBmbHVzaCBpbmRpdmlkdWFsbHkuCisJCSAqLworCQl0bGJfaW52 YWxpZGF0ZV9hbGxfdXNlcihwbWFwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBQcm9tb3Rpb246 IGZsdXNoIGV2ZXJ5IDRLQiBwYWdlIG1hcHBpbmcgZnJvbSB0aGUgVExCLAorCQkgKiBpbmNsdWRp bmcgYW55IGdsb2JhbCAoUFRFX0cpIG1hcHBpbmdzLgorCQkgKi8KKwkJdGxiX2ludmFsaWRhdGVf YWxsKCk7CisJfQorfQorCitzdHJ1Y3QgcG1hcF91cGRhdGVfcGRlX2FyZyB7CisJcG1hcF90IHBt YXA7CisJdm1fb2Zmc2V0X3QgdmE7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3QgbmV3 cGRlOworfTsKKworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9hY3Rpb24odm9pZCAqYWN0 KQoreworCXN0cnVjdCBwbWFwX3VwZGF0ZV9wZGVfYXJnICphcmcgPSBhY3Q7CisKKwlwbWFwX3Vw ZGF0ZV9wZGVfaW52YWxpZGF0ZShhcmctPnBtYXAsIGFyZy0+dmEsIGFyZy0+bmV3cGRlKTsKK30K Kworc3RhdGljIHZvaWQKK3BtYXBfdXBkYXRlX3BkZV9zdG9yZShwbWFwX3QgcG1hcCwgcGRfZW50 cnlfdCAqcGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKworCXBkZV9zdG9yZShwZGUsIG5ld3Bk ZSk7Cit9CisKKworLyoKKyAqIENoYW5nZSB0aGUgcGFnZSBzaXplIGZvciB0aGUgc3BlY2lmaWVk IHZpcnR1YWwgYWRkcmVzcyBpbiBhIHdheSB0aGF0CisgKiBwcmV2ZW50cyBhbnkgcG9zc2liaWxp dHkgb2YgdGhlIFRMQiBldmVyIGhhdmluZyB0d28gZW50cmllcyB0aGF0IG1hcCB0aGUKKyAqIHNh bWUgdmlydHVhbCBhZGRyZXNzIHVzaW5nIGRpZmZlcmVudCBwYWdlIHNpemVzLgorICovCitzdGF0 aWMgdm9pZAorcG1hcF91cGRhdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRf ZW50cnlfdCAqcGRlLCBwdF9lbnRyeV90IG5ld3BkZSkKK3sKKwlzdHJ1Y3QgcG1hcF91cGRhdGVf cGRlX2FyZyBhcmc7CisKKwlhcmcucG1hcCA9IHBtYXA7CisJYXJnLnZhID0gdmE7CisJYXJnLnBk ZSA9IHBkZTsKKwlhcmcubmV3cGRlID0gbmV3cGRlOworCisJcG1hcF91cGRhdGVfcGRlX3N0b3Jl KHBtYXAsIHBkZSwgbmV3cGRlKTsKKwlwbWFwX2NhbGxfb25fYWN0aXZlX2NwdXMocG1hcCwgcG1h cF91cGRhdGVfcGRlX2FjdGlvbiwgJmFyZyk7Cit9CisKKy8qIC0tLSAqLworCisvKgorICoJUm91 dGluZToJcG1hcF9leHRyYWN0CisgKglGdW5jdGlvbjoKKyAqCQlFeHRyYWN0IHRoZSBwaHlzaWNh bCBwYWdlIGFkZHJlc3MgYXNzb2NpYXRlZAorICoJCXdpdGggdGhlIGdpdmVuIG1hcC92aXJ0dWFs X2FkZHJlc3MgcGFpci4KKyAqLwordm1fcGFkZHJfdAorcG1hcF9leHRyYWN0KHBtYXBfdCBwbWFw LCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRl OworCXZtX29mZnNldF90IHBhOworCisJcGEgPSAwOworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUg PSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgewor CQlwYSA9IFRMQkxPX1BERV9UT19QQSgqcGRlKSB8ICh2YSAmIFBEUk1BU0spOworCX0gZWxzZSB7 CisJCXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKwkJaWYgKHB0ZSkKKwkJCXBhID0g VExCTE9fUFRFX1RPX1BBKCpwdGUpIHwgKHZhICYgUEFHRV9NQVNLKTsKKwl9CisJUE1BUF9VTkxP Q0socG1hcCk7CisJcmV0dXJuIChwYSk7Cit9CisKKy8qCisgKglSb3V0aW5lOglwbWFwX2V4dHJh Y3RfYW5kX2hvbGQKKyAqCUZ1bmN0aW9uOgorICoJCUF0b21pY2FsbHkgZXh0cmFjdCBhbmQgaG9s ZCB0aGUgcGh5c2ljYWwgcGFnZQorICoJCXdpdGggdGhlIGdpdmVuIHBtYXAgYW5kIHZpcnR1YWwg YWRkcmVzcyBwYWlyCisgKgkJaWYgdGhhdCBtYXBwaW5nIHBlcm1pdHMgdGhlIGdpdmVuIHByb3Rl Y3Rpb24uCisgKi8KK3ZtX3BhZ2VfdAorcG1hcF9leHRyYWN0X2FuZF9ob2xkKHBtYXBfdCBwbWFw LCB2bV9vZmZzZXRfdCB2YSwgdm1fcHJvdF90IHByb3QpCit7CisJcGRfZW50cnlfdCAqcGRlcDsK KwlwdF9lbnRyeV90IHB0ZSwgKnB0ZXA7CisJdm1fcGFkZHJfdCBwYSwgcHRlX3BhOworCXZtX3Bh Z2VfdCBtOworCXZtX3BhZGRyX3QgcGRlX3BhOworCisJcGEgPSAwOworCW0gPSBOVUxMOworCVBN QVBfTE9DSyhwbWFwKTsKK3JldHJ5OgorCXBkZXAgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJaWYg KHBkZXAgIT0gTlVMTCAmJiAqcGRlcCAhPSBOVUxMKSB7CisJCWlmIChwZGVfaXNfMW1fc3VwZXJw YWdlKHBkZXApKSB7CisJCQlpZiAoIXBkZV90ZXN0KHBkZXAsIFBURV9STykgfHwKKwkJCSAgICAo cHJvdCAmIFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJCQlwZGVfcGEgPSBUTEJMT19QREVfVE9f UEEoKnBkZXApIHwKKwkJCQkgICAgKHZhICYgUERSTUFTSyk7CisJCQkJaWYgKHZtX3BhZ2VfcGFf dHJ5cmVsb2NrKHBtYXAsIHBkZV9wYSwgJnBhKSkKKwkJCQkJZ290byByZXRyeTsKKwkJCQltID0g UEhZU19UT19WTV9QQUdFKHBkZV9wYSk7CisJCQkJdm1fcGFnZV9ob2xkKG0pOworCQkJfQorCQl9 IGVsc2UgeworCQkJcHRlcCA9IHBtYXBfcGRlX3RvX3B0ZShwZGVwLCB2YSk7CisJCQlpZiAocHRl cCAhPSBOVUxMKSB7CisJCQkJcHRlID0gKnB0ZXA7CisJCQkJaWYgKHB0ZV9pc192YWxpZCgmcHRl KSAmJgorCQkJCSAgICAoIXB0ZV90ZXN0KCZwdGUsIFBURV9STykgfHwKKwkJCQkgICAgKHByb3Qg JiBWTV9QUk9UX1dSSVRFKSA9PSAwKSkgeworCQkJCQlwdGVfcGEgPSBUTEJMT19QVEVfVE9fUEEo cHRlKTsKKwkJCQkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHB0ZV9wYSwKKwkJCQkJ ICAgICZwYSkpCisJCQkJCQlnb3RvIHJldHJ5OworCQkJCQltID0gUEhZU19UT19WTV9QQUdFKHB0 ZV9wYSk7CisJCQkJCXZtX3BhZ2VfaG9sZChtKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJUEFf VU5MT0NLX0NPTkQocGEpOworCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVybiAobSk7Cit9CisK Ky8qLQorICoJUm91dGluZToJcG1hcF9rZXh0cmFjdAorICoJRnVuY3Rpb246CisgKgkJRXh0cmFj dCB0aGUgcGh5c2ljYWwgcGFnZSBhZGRyZXNzIGFzc29jaWF0ZWQKKyAqCQl2aXJ0dWFsIGFkZHJl c3MuCisgKi8KK3ZtX3BhZGRyX3QKK3BtYXBfa2V4dHJhY3Qodm1fb2Zmc2V0X3QgdmEpCit7CisJ aW50IG1hcHBlZDsKKworCS8qCisJICogRmlyc3QsIHRoZSBkaXJlY3QtbWFwcGVkIHJlZ2lvbnMu CisJICovCisJaWYgKHZhID49IE1JUFNfWEtQSFlTX1NUQVJUICYmIHZhIDwgTUlQU19YS1BIWVNf RU5EKQorCQlyZXR1cm4gKE1JUFNfWEtQSFlTX1RPX1BIWVModmEpKTsKKworCWlmICh2YSA+PSBN SVBTX0tTRUcwX1NUQVJUICYmIHZhIDwgTUlQU19LU0VHMF9FTkQpCisJCXJldHVybiAoTUlQU19L U0VHMF9UT19QSFlTKHZhKSk7CisKKwlpZiAodmEgPj0gTUlQU19LU0VHMV9TVEFSVCAmJiB2YSA8 IE1JUFNfS1NFRzFfRU5EKQorCQlyZXR1cm4gKE1JUFNfS1NFRzFfVE9fUEhZUyh2YSkpOworCisJ LyoKKwkgKiBVc2VyIHZpcnR1YWwgYWRkcmVzc2VzLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVT RVJfQUREUkVTUykgeworCQlwZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOwor CisJCWlmIChjdXJwcm9jICYmIGN1cnByb2MtPnBfdm1zcGFjZSkgeworCQkJcGRlcCA9IHBtYXBf cGRlKCZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXAsIHZhKTsKKwkJCWlmIChwZGVwID09IE5V TEwgfHwgKnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBkZV9pc18xbV9z dXBlcnBhZ2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVwOworCQkJCXJl dHVybiAoVExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBEUk1BU0spKTsK KwkJCX0KKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJaWYgKHB0ZXAp IHsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAgICAodmEgJiBQ QUdFX01BU0spKTsKKwkJCX0KKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFNo b3VsZCBiZSBrZXJuZWwgdmlydHVhbCBoZXJlLCBvdGhlcndpc2UgZmFpbAorCSAqLworCW1hcHBl ZCA9ICh2YSA+PSBNSVBTX0tTRUcyX1NUQVJUIHx8IHZhIDwgTUlQU19LU0VHMl9FTkQpOworCW1h cHBlZCA9IG1hcHBlZCB8fCAodmEgPj0gTUlQU19YS1NFR19TVEFSVCB8fCB2YSA8IE1JUFNfWEtT RUdfRU5EKTsKKwkvKgorCSAqIEtlcm5lbCB2aXJ0dWFsLgorCSAqLworCisJaWYgKG1hcHBlZCkg eworCQlwZF9lbnRyeV90ICpwZGVwOworCQlwdF9lbnRyeV90ICpwdGVwOworCisJCS8qIElzIHRo ZSBrZXJuZWwgcG1hcCBpbml0aWFsaXplZD8gKi8KKwkJaWYgKCFDUFVfRU1QVFkoJmtlcm5lbF9w bWFwLT5wbV9hY3RpdmUpKSB7CisJCQkvKiBJdCdzIGluc2lkZSB0aGUgdmlydHVhbCBhZGRyZXNz IHJhbmdlICovCisJCQlwZGVwID0gcG1hcF9wZGUoa2VybmVsX3BtYXAsIHZhKTsKKwkJCWlmIChw ZGVwID09IE5VTEwgfHwgKnBkZXAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKDApOworCQkJaWYgKHBk ZV9pc18xbV9zdXBlcnBhZ2UocGRlcCkpIHsKKwkJCQlwdGVwID0gKHB0X2VudHJ5X3QgKilwZGVw OworCQkJCXJldHVybiAoVExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBE Uk1BU0spKTsKKwkJCX0KKwkJCXB0ZXAgPSBwbWFwX3BkZV90b19wdGUocGRlcCwgdmEpOworCQkJ aWYgKHB0ZXApIHsKKwkJCQlyZXR1cm4gKFRMQkxPX1BURV9UT19QQSgqcHRlcCkgfAorCQkJCSAg ICAodmEgJiBQQUdFX01BU0spKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gKDApOworCX0KKworCXBh bmljKCIlcyBmb3IgdW5rbm93biBhZGRyZXNzIHNwYWNlICVwLiIsIF9fZnVuY19fLCAodm9pZCAq KXZhKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKgorICogTG93IGxldmVsIG1hcHBpbmcgcm91dGluZXMuLi4uLgorICoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotCisgKiBhZGQg YSB3aXJlZCBwYWdlIHRvIHRoZSBrdmEKKyAqLwordm9pZAorcG1hcF9rZW50ZXJfYXR0cih2bV9v ZmZzZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwgaW50IGF0dHIpCit7CisJcHRfZW50cnlfdCAqcHRl OworCXB0X2VudHJ5X3Qgb3B0ZSwgbnB0ZTsKKworI2lmZGVmIFBNQVBfREVCVUcKKwlwcmludGYo InBtYXBfa2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2YSwgKHZvaWQgKilw YSk7CisjZW5kaWYKKworCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CisJb3B0ZSA9 ICpwdGU7CisJbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBhdHRyIHwgUFRFX0QgfCBQVEVf UkVGIHwgUFRFX1ZBTElEIHwgUFRFX0c7CisJcHRlX3N0b3JlKHB0ZSwgbnB0ZSk7CisJaWYgKHB0 ZV9pc192YWxpZCgmb3B0ZSkgJiYgb3B0ZSAhPSBucHRlKQorCQlwbWFwX3VwZGF0ZV9wYWdlKGtl cm5lbF9wbWFwLCB2YSwgbnB0ZSk7Cit9CisKK3ZvaWQKK3BtYXBfa2VudGVyKHZtX29mZnNldF90 IHZhLCB2bV9wYWRkcl90IHBhKQoreworCisJS0FTU0VSVChpc19jYWNoZWFibGVfbWVtKHBhKSwK KwkJKCJwbWFwX2tlbnRlcjogbWVtb3J5IGF0IDB4JWx4IGlzIG5vdCBjYWNoZWFibGUiLCAodV9s b25nKXBhKSk7CisKKwlwbWFwX2tlbnRlcl9hdHRyKHZhLCBwYSwgUFRFX0NfQ0FDSEUpOworfQor CisvKi0KKyAqIHJlbW92ZSBhIHBhZ2UgZnJvbSB0aGUga2VybmVsIHBhZ2V0YWJsZXMKKyAqLwor IC8qIFBNQVBfSU5MSU5FICovIHZvaWQKK3BtYXBfa3JlbW92ZSh2bV9vZmZzZXRfdCB2YSkKK3sK KwlwdF9lbnRyeV90ICpwdGU7CisKKwkvKgorCSAqIFdyaXRlIGJhY2sgYWxsIGNhY2hlcyBmcm9t IHRoZSBwYWdlIGJlaW5nIGRlc3Ryb3llZAorCSAqLworCW1pcHNfZGNhY2hlX3diaW52X3Jhbmdl X2luZGV4KHZhLCBQQUdFX1NJWkUpOworCisJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZh KTsKKwlwdGVfc3RvcmUocHRlLCBQVEVfRyk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2Uoa2VybmVs X3BtYXAsIHZhKTsKK30KKworLyoKKyAqCVVzZWQgdG8gbWFwIGEgcmFuZ2Ugb2YgcGh5c2ljYWwg YWRkcmVzc2VzIGludG8ga2VybmVsCisgKgl2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCisgKgorICoJ VGhlIHZhbHVlIHBhc3NlZCBpbiAnKnZpcnQnIGlzIGEgc3VnZ2VzdGVkIHZpcnR1YWwgYWRkcmVz cyBmb3IKKyAqCXRoZSBtYXBwaW5nLiBBcmNoaXRlY3R1cmVzIHdoaWNoIGNhbiBzdXBwb3J0IGEg ZGlyZWN0LW1hcHBlZAorICoJcGh5c2ljYWwgdG8gdmlydHVhbCByZWdpb24gY2FuIHJldHVybiB0 aGUgYXBwcm9wcmlhdGUgYWRkcmVzcworICoJd2l0aGluIHRoYXQgcmVnaW9uLCBsZWF2aW5nICcq dmlydCcgdW5jaGFuZ2VkLiBPdGhlcgorICoJYXJjaGl0ZWN0dXJlcyBzaG91bGQgbWFwIHRoZSBw YWdlcyBzdGFydGluZyBhdCAnKnZpcnQnIGFuZAorICoJdXBkYXRlICcqdmlydCcgd2l0aCB0aGUg Zmlyc3QgdXNhYmxlIGFkZHJlc3MgYWZ0ZXIgdGhlIG1hcHBlZAorICoJcmVnaW9uLgorICoKKyAq CVVzZSBYS1BIWVMgZm9yIDY0IGJpdC4KKyAqLwordm1fb2Zmc2V0X3QKK3BtYXBfbWFwKHZtX29m ZnNldF90ICp2aXJ0LCB2bV9wYWRkcl90IHN0YXJ0LCB2bV9wYWRkcl90IGVuZCwgaW50IHByb3Qp Cit7CisKKwlyZXR1cm4gKE1JUFNfUEhZU19UT19ESVJFQ1Qoc3RhcnQpKTsKK30KKworLyotCisg KiBBZGQgYSBsaXN0IG9mIHdpcmVkIHBhZ2VzIHRvIHRoZSBrdmEKKyAqIHRoaXMgcm91dGluZSBp cyBvbmx5IHVzZWQgZm9yIHRlbXBvcmFyeQorICoga2VybmVsIG1hcHBpbmdzIHRoYXQgZG8gbm90 IG5lZWQgdG8gaGF2ZQorICogcGFnZSBtb2RpZmljYXRpb24gb3IgcmVmZXJlbmNlcyByZWNvcmRl ZC4KKyAqIE5vdGUgdGhhdCBvbGQgbWFwcGluZ3MgYXJlIHNpbXBseSB3cml0dGVuCisgKiBvdmVy LiAgVGhlIHBhZ2UgKm11c3QqIGJlIHdpcmVkLgorICovCit2b2lkCitwbWFwX3FlbnRlcih2bV9v ZmZzZXRfdCB2YSwgdm1fcGFnZV90ICptLCBpbnQgY291bnQpCit7CisJaW50IGk7CisJdm1fb2Zm c2V0X3Qgb3JpZ3ZhID0gdmE7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlw bWFwX2ZsdXNoX3B2Y2FjaGUobVtpXSk7CisJCXBtYXBfa2VudGVyKHZhLCBWTV9QQUdFX1RPX1BI WVMobVtpXSkpOworCQl2YSArPSBQQUdFX1NJWkU7CisJfQorCisJbWlwc19kY2FjaGVfd2JpbnZf cmFuZ2VfaW5kZXgob3JpZ3ZhLCBQQUdFX1NJWkUqY291bnQpOworfQorCisvKi0KKyAqIFRoaXMg cm91dGluZSBqZXJrcyBwYWdlIG1hcHBpbmdzIGZyb20gdGhlCisgKiBrZXJuZWwgLS0gaXQgaXMg bWVhbnQgb25seSBmb3IgdGVtcG9yYXJ5IG1hcHBpbmdzLgorICovCit2b2lkCitwbWFwX3FyZW1v dmUodm1fb2Zmc2V0X3QgdmEsIGludCBjb3VudCkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisJdm1f b2Zmc2V0X3Qgb3JpZ3ZhOworCisJaWYgKGNvdW50IDwgMSkKKwkJcmV0dXJuOworCW1pcHNfZGNh Y2hlX3diaW52X3JhbmdlX2luZGV4KHZhLCBQQUdFX1NJWkUgKiBjb3VudCk7CisJb3JpZ3ZhID0g dmE7CisJZG8geworCQlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOworCQlwdGVfc3Rv cmUocHRlLCBQVEVfRyk7CisJCXZhICs9IFBBR0VfU0laRTsKKwl9IHdoaWxlICgtLWNvdW50ID4g MCk7CisJcG1hcF9pbnZhbGlkYXRlX3JhbmdlKGtlcm5lbF9wbWFwLCBvcmlndmEsIHZhKTsKK30K KworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgor ICogUGFnZSB0YWJsZSBwYWdlIG1hbmFnZW1lbnQgcm91dGluZXMuLi4uLgorICoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGlu ZSB2b2lkCitwbWFwX2ZyZWVfemVyb19wYWdlcyhzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwl2 bV9wYWdlX3QgbTsKKworCXdoaWxlICgobSA9IFNMSVNUX0ZJUlNUKGZyZWUpKSAhPSBOVUxMKSB7 CisJCVNMSVNUX1JFTU9WRV9IRUFEKGZyZWUsIHBsaW5rcy5zLnNzKTsKKwkJLyogUHJlc2VydmUg dGhlIHBhZ2UncyBQR19aRVJPIHNldHRpbmcuICovCisJCXZtX3BhZ2VfZnJlZV90b3EobSk7CisJ fQorfQorCisvKi0KKyAqIFNjaGVkdWxlIHRoZSBzcGVjaWZpZWQgdW51c2VkIHBhZ2UgdGFibGUg cGFnZSB0byBiZSBmcmVlZC4gIFNwZWNpZmljYWxseQorICogYWRkIHRoZSBwYWdlIHRvIHRoZSBz cGVjaWZpZWQgbGlzdCBvZiBwYWdlcyB0aGF0IHdpbGwgYmUgcmVsZWFzZWQgdG8gdGhlCisgKiBw aHlzaWNhbCBtZW1vcnkgbWFuYWdlciBhZnRlciB0aGUgVExCIGhhcyBiZWVuIHVwZGF0ZWQuCisg Ki8KK3N0YXRpYyBfX2lubGluZSB2b2lkCitwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdCh2bV9w YWdlX3QgbSwgc3RydWN0IHNwZ2xpc3QgKmZyZWUsCisgICAgYm9vbGVhbl90IHNldF9QR19aRVJP KQoreworCisJaWYgKHNldF9QR19aRVJPKQorCQltLT5mbGFncyB8PSBQR19aRVJPOworCWVsc2UK KwkJbS0+ZmxhZ3MgJj0gflBHX1pFUk87CisJU0xJU1RfSU5TRVJUX0hFQUQoZnJlZSwgbSwgcGxp bmtzLnMuc3MpOworfQorCisvKgorICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUg cGFnZSBpbnRvIHRoZSBzcGVjaWZpZWQgcG1hcCdzIGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFn ZSB0YWJsZSBwYWdlcy4gIEVhY2ggb2YgYSBwbWFwJ3MgcGFnZSB0YWJsZSBwYWdlcyBpcyByZXNw b25zaWJsZQorICogZm9yIG1hcHBpbmcgYSBkaXN0aW5jdCByYW5nZSBvZiB2aXJ0dWFsIGFkZHJl c3Nlcy4gIFRoZSBwbWFwJ3MgY29sbGVjdGlvbiBpcworICogb3JkZXJlZCBieSB0aGlzIHZpcnR1 YWwgYWRkcmVzcyByYW5nZS4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcG1hcF9pbnNlcnRf cHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fcGFnZV90IG1wdGUpCit7CisKKwlQTUFQX0xPQ0tfQVNT RVJUKHBtYXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2luc2VydCgmcG1hcC0+cG1f cm9vdCwgbXB0ZSkpOworfQorCisvKgorICogTG9va3MgZm9yIGEgcGFnZSB0YWJsZSBwYWdlIG1h cHBpbmcgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgaW4gdGhlCisgKiBzcGVjaWZpZWQg cG1hcCdzIGNvbGxlY3Rpb24gb2YgaWRsZSBwYWdlIHRhYmxlIHBhZ2VzLiAgUmV0dXJucyBOVUxM IGlmIHRoZXJlCisgKiBpcyBubyBwYWdlIHRhYmxlIHBhZ2UgY29ycmVzcG9uZGluZyB0byB0aGUg c3BlY2lmaWVkIHZpcnR1YWwgYWRkcmVzcy4KKyAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZ2Vf dAorcG1hcF9sb29rdXBfcHRfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisK KwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlyZXR1cm4gKHZtX3JhZGl4X2xv b2t1cCgmcG1hcC0+cG1fcm9vdCwgcG1hcF9wZGVfcGluZGV4KHZhKSkpOworfQorCisvKgorICog UmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHBhZ2UgdGFibGUgcGFnZSBmcm9tIHRoZSBzcGVjaWZpZWQg cG1hcCdzIGNvbGxlY3Rpb24KKyAqIG9mIGlkbGUgcGFnZSB0YWJsZSBwYWdlcy4gIFRoZSBzcGVj aWZpZWQgcGFnZSB0YWJsZSBwYWdlIG11c3QgYmUgYSBtZW1iZXIgb2YKKyAqIHRoZSBwbWFwJ3Mg Y29sbGVjdGlvbi4KKyAqLworc3RhdGljIF9faW5saW5lIHZvaWQKK3BtYXBfcmVtb3ZlX3B0X3Bh Z2UocG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtcHRlKQoreworCisJUE1BUF9MT0NLX0FTU0VSVChw bWFwLCBNQV9PV05FRCk7CisJdm1fcmFkaXhfcmVtb3ZlKCZwbWFwLT5wbV9yb290LCBtcHRlLT5w aW5kZXgpOworfQorCisvKgorICogRGVjcmVtZW50cyBhIHBhZ2UgdGFibGUgcGFnZSdzIHdpcmUg Y291bnQsIHdoaWNoIGlzIHVzZWQgdG8gcmVjb3JkIHRoZQorICogbnVtYmVyIG9mIHZhbGlkIHBh Z2UgdGFibGUgZW50cmllcyB3aXRoaW4gdGhlIHBhZ2UuICBJZiB0aGUgd2lyZSBjb3VudAorICog ZHJvcHMgdG8gemVybywgdGhlbiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIHVubWFwcGVkLiAgUmV0 dXJucyBUUlVFIGlmIHRoZQorICogcGFnZSB0YWJsZSBwYWdlIHdhcyB1bm1hcHBlZCBhbmQgRkFM U0Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgUE1BUF9JTkxJTkUgYm9vbGVhbl90CitwbWFwX3Vu d2lyZV9wdHAocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgbSwgc3RydWN0 IHNwZ2xpc3QgKmZyZWUpCit7CisKKwktLW0tPndpcmVfY291bnQ7CisJaWYgKG0tPndpcmVfY291 bnQgPT0gMCkgeworCQlfcG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtLCBmcmVlKTsKKwkJcmV0 dXJuIChUUlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKK3N0YXRpYyB2b2lk CitfcG1hcF91bndpcmVfcHRwKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90 IG0sIHN0cnVjdCBzcGdsaXN0ICpmcmVlKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcDsKKwl2 bV9wYWdlX3QgcGRwZzsKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOworCS8q CisJICogdW5tYXAgdGhlIHBhZ2UgdGFibGUgcGFnZQorCSAqLworCWlmIChtLT5waW5kZXggPCBO VVBERSkgeworCQlwZGUgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJCSpwZGUgPSAwOworCQlwbWFw X3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKworCQkvKgorCQkgKiBSZWN1cnNpdmVseSBk ZWNyZW1lbnQgbmV4dCBsZXZlbCBwYWdldGFibGUgcmVmY291bnQKKwkJICovCisJCXBkcCA9IChw ZF9lbnRyeV90ICopKnBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJcGRwZyA9IFBIWVNfVE9fVk1f UEFHRShNSVBTX0RJUkVDVF9UT19QSFlTKHBkcCkpOworCQlwbWFwX3Vud2lyZV9wdHAocG1hcCwg dmEsIHBkcGcsIGZyZWUpOworCX0gZWxzZSB7CisJCXBkZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZh KTsKKwkJKnBkZSA9IDA7CisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCX0K KworCS8qCisJICogSWYgdGhlIHBhZ2UgaXMgZmluYWxseSB1bndpcmVkLCBzaW1wbHkgZnJlZSBp dC4KKwkgKiBUaGlzIGlzIGEgcmVsZWFzZSBzdG9yZSBzbyB0aGF0IHRoZSBvcmRpbmFyeSBzdG9y ZSB1bm1hcHBpbmcKKwkgKiB0aGUgcGFnZSB0YWJsZSBwYWdlIGlzIGdsb2JhbGx5IHBlcmZvcm1l ZCBiZWZvcmUgVExCIHNob290LQorCSAqIGRvd24gaXMgYmVndW4uCisJICovCisJYXRvbWljX3N1 YnRyYWN0X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisKKwkvKgorCSAqIFB1dCBwYWdl IG9uIGEgbGlzdCBzbyB0aGF0IGl0IGlzIHJlbGVhc2VkIGFmdGVyCisJICogKkFMTCogVExCIHNo b290ZG93biBpcyBkb25lLgorCSAqLworCXBtYXBfYWRkX2RlbGF5ZWRfZnJlZV9saXN0KG0sIGZy ZWUsIFRSVUUpOworfQorCisvKgorICogQWZ0ZXIgcmVtb3ZpbmcgYSBwYWdlIHRhYmxlIGVudHJ5 LCB0aGlzIHJvdXRpbmUgaXMgdXNlZCB0bworICogY29uZGl0aW9uYWxseSBmcmVlIHRoZSBwYWdl LCBhbmQgbWFuYWdlIHRoZSBob2xkL3dpcmUgY291bnRzLgorICovCitzdGF0aWMgaW50CitwbWFw X3VudXNlX3B0KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgcGRfZW50cnlfdCBwdGVwZGUs CisgICAgc3RydWN0IHNwZ2xpc3QgKmZyZWUpCit7CisJdm1fcGFnZV90IG1wdGU7CisKKwlpZiAo dmEgPj0gVk1fTUFYVVNFUl9BRERSRVNTKQorCQlyZXR1cm4gKDApOworCUtBU1NFUlQocHRlcGRl ICE9IDAsICgicG1hcF91bnVzZV9wdDogcHRlcGRlICE9IDAiKSk7CisJbXB0ZSA9IFBIWVNfVE9f Vk1fUEFHRShNSVBTX0RJUkVDVF9UT19QSFlTKHB0ZXBkZSkpOworCXJldHVybiAocG1hcF91bndp cmVfcHRwKHBtYXAsIHZhLCBtcHRlLCBmcmVlKSk7Cit9CisKK3ZvaWQKK3BtYXBfcGluaXQwKHBt YXBfdCBwbWFwKQoreworCWludCBpOworCisJUE1BUF9MT0NLX0lOSVQocG1hcCk7CisJcG1hcC0+ cG1fc2VndGFiID0ga2VybmVsX3NlZ21hcDsKKwlDUFVfWkVSTygmcG1hcC0+cG1fYWN0aXZlKTsK Kwlmb3IgKGkgPSAwOyBpIDwgTUFYQ1BVOyBpKyspIHsKKwkJcG1hcC0+cG1fYXNpZFtpXS5hc2lk ID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCQlwbWFwLT5wbV9hc2lkW2ldLmdlbiA9IDA7CisJfQor CVBDUFVfU0VUKGN1cnBtYXAsIHBtYXApOworCVRBSUxRX0lOSVQoJnBtYXAtPnBtX3B2Y2h1bmsp OworCWJ6ZXJvKCZwbWFwLT5wbV9zdGF0cywgc2l6ZW9mIHBtYXAtPnBtX3N0YXRzKTsKK30KKwor c3RhdGljIHZvaWQKK3BtYXBfZ3Jvd19kaXJlY3RfcGFnZV9jYWNoZShpbnQgcmVxKQoreworCisJ aWYgKCF2bV9wYWdlX3JlY2xhaW1fY29udGlnKHJlcSwgMSwgMCwgTUlQU19YS1BIWVNfTEFSR0VT VF9QSFlTLAorCSAgICBQQUdFX1NJWkUsIDApKQorCQlWTV9XQUlUOworfQorCitzdGF0aWMgdm1f cGFnZV90CitwbWFwX2FsbG9jX2RpcmVjdF9wYWdlKHVuc2lnbmVkIGludCBpbmRleCwgaW50IHJl cSkKK3sKKwl2bV9wYWdlX3QgbTsKKworCW0gPSB2bV9wYWdlX2FsbG9jX2ZyZWVsaXN0KFZNX0ZS RUVMSVNUX0RJUkVDVCwgcmVxIHwgVk1fQUxMT0NfV0lSRUQgfAorCSAgICBWTV9BTExPQ19aRVJP KTsKKwlpZiAobSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJaWYgKChtLT5mbGFncyAm IFBHX1pFUk8pID09IDApCisJCXBtYXBfemVyb19wYWdlKG0pOworCisJbS0+cGluZGV4ID0gaW5k ZXg7CisJcmV0dXJuIChtKTsKK30KKworLyotCisgKiBJbml0aWFsaXplIGEgcHJlYWxsb2NhdGVk IGFuZCB6ZXJvZWQgcG1hcCBzdHJ1Y3R1cmUsCisgKiBzdWNoIGFzIG9uZSBpbiBhIHZtc3BhY2Ug c3RydWN0dXJlLgorICovCitpbnQKK3BtYXBfcGluaXQocG1hcF90IHBtYXApCit7CisJdm1fb2Zm c2V0X3QgcHRkdmE7CisJdm1fcGFnZV90IHB0ZHBnOworCWludCBpLCByZXFfY2xhc3M7CisKKwkv KgorCSAqIGFsbG9jYXRlIHRoZSBwYWdlIGRpcmVjdG9yeSBwYWdlCisJICovCisJcmVxX2NsYXNz ID0gVk1fQUxMT0NfTk9STUFMOworCXdoaWxlICgocHRkcGcgPSBwbWFwX2FsbG9jX2RpcmVjdF9w YWdlKE5VU0VSUEdUQkxTLCBWTV9BTExPQ19OT09CSiB8CisJICAgIHJlcV9jbGFzcykpID09IE5V TEwpIHsKKwkgICAgICAgcG1hcF9ncm93X2RpcmVjdF9wYWdlX2NhY2hlKHJlcV9jbGFzcyk7CisJ fQorCisJcHRkdmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9fUEhZUyhwdGRwZykp OworCXBtYXAtPnBtX3NlZ3RhYiA9IChwZF9lbnRyeV90ICopcHRkdmE7CisJQ1BVX1pFUk8oJnBt YXAtPnBtX2FjdGl2ZSk7CisJZm9yIChpID0gMDsgaSA8IE1BWENQVTsgaSsrKSB7CisJCXBtYXAt PnBtX2FzaWRbaV0uYXNpZCA9IFBNQVBfQVNJRF9SRVNFUlZFRDsKKwkJcG1hcC0+cG1fYXNpZFtp XS5nZW4gPSAwOworCX0KKwlUQUlMUV9JTklUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwliemVybygm cG1hcC0+cG1fc3RhdHMsIHNpemVvZiBwbWFwLT5wbV9zdGF0cyk7CisKKwlyZXR1cm4gKDEpOwor fQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpZiB0aGUgZGVzaXJlZCBwYWdlIHRh YmxlIHBhZ2UgZG9lcyBub3QgZXhpc3QuCisgKi8KK3N0YXRpYyB2bV9wYWdlX3QKK19wbWFwX2Fs bG9jcHRlKHBtYXBfdCBwbWFwLCB1bnNpZ25lZCBwdGVwaW5kZXgsIHN0cnVjdCByd2xvY2sgKips b2NrcCkKK3sKKwl2bV9vZmZzZXRfdCBwYWdldmE7CisJdm1fcGFnZV90IG07CisKKwlQTUFQX0xP Q0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKworCS8qCisJICogRmluZCBvciBmYWJyaWNhdGUg YSBuZXcgcGFnZXRhYmxlIHBhZ2UKKwkgKi8KKwlpZiAoKG0gPSB2bV9wYWdlX2FsbG9jKE5VTEws IHB0ZXBpbmRleCwgVk1fQUxMT0NfTk9STUFMIHwKKwkgICAgVk1fQUxMT0NfTk9PQkogfCBWTV9B TExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pKSA9PSBOVUxMKSB7CisJCWlmIChsb2NrcCAhPSBO VUxMKSB7CisJCQlSRUxFQVNFX1BWX0xJU1RfTE9DSyhsb2NrcCk7CisJCQlQTUFQX1VOTE9DSyhw bWFwKTsKKwkJCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlWTV9XQUlUOworCQkJ cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJCX0KKwor CQkvKgorCQkgKiBJbmRpY2F0ZSB0aGUgbmVlZCB0byByZXRyeS4JV2hpbGUgd2FpdGluZywgdGhl IHBhZ2UKKwkJICogdGFibGUgcGFnZSBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZC4KKwkJICovCisJ CXJldHVybiAoTlVMTCk7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAwKQorCQlw bWFwX3plcm9fcGFnZShtKTsKKworCS8qCisJICogTWFwIHRoZSBwYWdldGFibGUgcGFnZSBpbnRv IHRoZSBwcm9jZXNzIGFkZHJlc3Mgc3BhY2UsIGlmIGl0CisJICogaXNuJ3QgYWxyZWFkeSB0aGVy ZS4KKwkgKi8KKwlwYWdldmEgPSBNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9fUEhZUyht KSk7CisKKwlpZiAocHRlcGluZGV4ID49IE5VUERFKSB7CisJCXBtYXAtPnBtX3NlZ3RhYltwdGVw aW5kZXggLSBOVVBERV0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfSBlbHNlIHsKKwkJcGRfZW50 cnlfdCAqcGRlcCwgKnBkZTsKKwkJaW50IHNlZ2luZGV4ID0gcHRlcGluZGV4ID4+IChTRUdTSElG VCAtIFBEUlNISUZUKTsKKwkJaW50IHBkZWluZGV4ID0gcHRlcGluZGV4ICYgKE5QREVQRyAtIDEp OworCQl2bV9wYWdlX3QgcGc7CisKKwkJcGRlcCA9ICZwbWFwLT5wbV9zZWd0YWJbc2VnaW5kZXhd OworCQlpZiAoKnBkZXAgPT0gTlVMTCkgeworCQkJLyogSGF2ZSB0byBhbGxvY2F0ZSBhIG5ldyBw ZCwgcmVjdXJzZSAqLworCQkJaWYgKF9wbWFwX2FsbG9jcHRlKHBtYXAsIE5VUERFICsgc2VnaW5k ZXgsCisJCQkgICAgbG9ja3ApID09IE5VTEwpIHsKKwkJCQkvKiBhbGxvYyBmYWlsZWQsIHJlbGVh c2UgY3VycmVudCAqLworCQkJCS0tbS0+d2lyZV9jb3VudDsKKwkJCQlhdG9taWNfc3VidHJhY3Rf aW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsKKwkJCQl2bV9wYWdlX2ZyZWVfemVybyhtKTsK KwkJCQlyZXR1cm4gKE5VTEwpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogQWRkIHJlZmVyZW5j ZSB0byB0aGUgcGQgcGFnZSAqLworCQkJcGcgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1Rf VE9fUEhZUygqcGRlcCkpOworCQkJcGctPndpcmVfY291bnQrKzsKKwkJfQorCQkvKiBOZXh0IGxl dmVsIGVudHJ5ICovCisJCXBkZSA9IChwZF9lbnRyeV90ICopKnBkZXA7CisJCXBkZVtwZGVpbmRl eF0gPSAocGRfZW50cnlfdClwYWdldmE7CisJfQorCisJcG1hcF9yZXNpZGVudF9jb3VudF9pbmMo cG1hcCwgMSk7CisKKwlyZXR1cm4gKG0pOworfQorCitzdGF0aWMgdm1fcGFnZV90CitwbWFwX2Fs bG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgc3RydWN0IHJ3bG9jayAqKmxvY2tw KQoreworCXVuc2lnbmVkIHB0ZXBpbmRleDsKKwlwZF9lbnRyeV90ICpwZDsKKwl2bV9wYWdlX3Qg bTsKKworCS8qCisJICogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4CisJICovCisJcHRl cGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsKK3JldHJ5OgorCS8qCisJICogR2V0IHRoZSBw YWdlIGRpcmVjdG9yeSBlbnRyeQorCSAqLworCXBkID0gcG1hcF9wZGUocG1hcCwgdmEpOworCisJ LyoKKwkgKiBUaGlzIHN1cHBvcnRzIHN3aXRjaGluZyBmcm9tIGEgMk1CIHBhZ2UgdG8gYQorCSAq IG5vcm1hbCA0SyBwYWdlLgorCSAqLworCWlmIChwZCAhPSBOVUxMICYmIChwZGVfaXNfMW1fc3Vw ZXJwYWdlKHBkKSAmJgorCSAgICBwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZCkpKSB7CisJ CSBpZiAoIXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGQsIHZhLCBsb2NrcCkpIHsKKwkJ CSAvKgorCQkJICAqIEludmFsaWRhdGlvbiBvZiB0aGUgMk1CIHBhZ2UgbWFwcGluZyBtYXkgaGF2 ZSBjYXVzZWQKKwkJCSAgKiB0aGUgZGVhbGxvY2F0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIFBEIHBh Z2UuCisJCQkgICovCisJCQkgcGQgPSBOVUxMOworCQkgfQorCX0KKworCS8qCisJICogSWYgdGhl IHBhZ2UgdGFibGUgcGFnZSBpcyBtYXBwZWQsIHdlIGp1c3QgaW5jcmVtZW50IHRoZSBob2xkCisJ ICogY291bnQsIGFuZCBhY3RpdmF0ZSBpdC4KKwkgKi8KKwlpZiAocGQgIT0gTlVMTCAmJiAqcGQg IT0gTlVMTCkgeworCQltID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKHB0 X2VudHJ5X3QpKnBkKSk7CisJCW0tPndpcmVfY291bnQrKzsKKwl9IGVsc2UgeworCQkvKgorCQkg KiBIZXJlIGlmIHRoZSBwdGUgcGFnZSBpc24ndCBtYXBwZWQsIG9yIGlmIGl0IGhhcyBiZWVuCisJ CSAqIGRlYWxsb2NhdGVkLgorCQkgKi8KKwkJbSA9IF9wbWFwX2FsbG9jcHRlKHBtYXAsIHB0ZXBp bmRleCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMICYmIGxvY2twICE9IE5VTEwpCisJCQlnb3Rv IHJldHJ5OworCX0KKwlyZXR1cm4gKG0pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQbWFwIGFsbG9jYXRpb24vZGVhbGxvY2F0 aW9uIHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8KKworLyotCisgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgaGVsZCBieSB0aGUg Z2l2ZW4gcGh5c2ljYWwgbWFwLgorICogQ2FsbGVkIHdoZW4gYSBwbWFwIGluaXRpYWxpemVkIGJ5 IHBtYXBfcGluaXQgaXMgYmVpbmcgcmVsZWFzZWQuCisgKiBTaG91bGQgb25seSBiZSBjYWxsZWQg aWYgdGhlIG1hcCBjb250YWlucyBubyB2YWxpZCBtYXBwaW5ncy4KKyAqLwordm9pZAorcG1hcF9y ZWxlYXNlKHBtYXBfdCBwbWFwKQoreworCXZtX29mZnNldF90IHB0ZHZhOworCXZtX3BhZ2VfdCBw dGRwZzsKKworCUtBU1NFUlQocG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQgPT0gMCwKKwkg ICAgKCJwbWFwX3JlbGVhc2U6IHBtYXAgcmVzaWRlbnQgY291bnQgJWxkICE9IDAiLAorCSAgICBw bWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCkpOworCisJLyoKKwkgKiBJbnZhbGlkYXRlIGFu eSBsZWZ0IFRMQiBlbnRyaWVzLCB0byBhbGxvdyB0aGUgcmV1c2UKKwkgKiBvZiB0aGUgYXNpZC4K KwkgKi8KKwlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOworCisJcHRkdmEgPSAodm1fb2Zmc2V0 X3QpcG1hcC0+cG1fc2VndGFiOworCXB0ZHBnID0gUEhZU19UT19WTV9QQUdFKE1JUFNfRElSRUNU X1RPX1BIWVMocHRkdmEpKTsKKworCXB0ZHBnLT53aXJlX2NvdW50LS07CisJYXRvbWljX3N1YnRy YWN0X2ludCgmdm1fY250LnZfd2lyZV9jb3VudCwgMSk7CisJdm1fcGFnZV9mcmVlX3plcm8ocHRk cGcpOworfQorCisvKi0KKyAqIGdyb3cgdGhlIG51bWJlciBvZiBrZXJuZWwgcGFnZSB0YWJsZSBl bnRyaWVzLCBpZiBuZWVkZWQKKyAqLwordm9pZAorcG1hcF9ncm93a2VybmVsKHZtX29mZnNldF90 IGFkZHIpCit7CisJdm1fcGFnZV90IG5rcGc7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRwZTsKKwlw dF9lbnRyeV90ICpwdGU7CisJaW50IGk7CisKKwltdHhfYXNzZXJ0KCZrZXJuZWxfbWFwLT5zeXN0 ZW1fbXR4LCBNQV9PV05FRCk7CisJYWRkciA9IHJvdW5kdXAyKGFkZHIsIE5CU0VHKTsKKwlpZiAo YWRkciAtIDEgPj0ga2VybmVsX21hcC0+bWF4X29mZnNldCkKKwkJYWRkciA9IGtlcm5lbF9tYXAt Pm1heF9vZmZzZXQ7CisJd2hpbGUgKGtlcm5lbF92bV9lbmQgPCBhZGRyKSB7CisJCXBkcGUgPSBw bWFwX3NlZ21hcChrZXJuZWxfcG1hcCwga2VybmVsX3ZtX2VuZCk7CisJCWlmICgqcGRwZSA9PSAw KSB7CisJCQkvKiBuZXcgaW50ZXJtZWRpYXRlIHBhZ2UgdGFibGUgZW50cnkgKi8KKwkJCW5rcGcg PSB2bV9wYWdlX2FsbG9jKE5VTEwsIG5rcHQsIFZNX0FMTE9DX0lOVEVSUlVQVCB8CisJCQkgICAg Vk1fQUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOworCQkJaWYg KG5rcGcgPT0gTlVMTCkKKwkJCQlwYW5pYygiJXM6IG5vIG1lbW9yeSB0byBncm93IGtlcm5lbCIs IF9fZnVuY19fKTsKKwkJCSpwZHBlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJUkVDVCgK KwkJCSAgICBWTV9QQUdFX1RPX1BIWVMobmtwZykpOworCQkJY29udGludWU7IC8qIHRyeSBhZ2Fp biAqLworCQl9CisJCXBkZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwga2VybmVsX3ZtX2VuZCk7 CisJCWlmICgqcGRlICE9IDApIHsKKwkJCWtlcm5lbF92bV9lbmQgPSAoa2VybmVsX3ZtX2VuZCAr IE5CUERSKSAmIH5QRFJNQVNLOworCQkJaWYgKGtlcm5lbF92bV9lbmQgLSAxID49IGtlcm5lbF9t YXAtPm1heF9vZmZzZXQpIHsKKwkJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+bWF4X29m ZnNldDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICog VGhpcyBpbmRleCBpcyBib2d1cywgYnV0IG91dCBvZiB0aGUgd2F5CisJCSAqLworCQlua3BnID0g dm1fcGFnZV9hbGxvYyhOVUxMLCBua3B0LCBWTV9BTExPQ19JTlRFUlJVUFQgfAorCQkgICAgVk1f QUxMT0NfTk9PQkogfCBWTV9BTExPQ19XSVJFRCB8IFZNX0FMTE9DX1pFUk8pOworCQlpZiAoIW5r cGcpCisJCQlwYW5pYygicG1hcF9ncm93a2VybmVsOiBubyBtZW1vcnkgdG8gZ3JvdyBrZXJuZWwi KTsKKwkJbmtwdCsrOworCQkqcGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJUkVDVChW TV9QQUdFX1RPX1BIWVMobmtwZykpOworCisJCS8qCisJCSAqIFRoZSBSWzQtN10/MDAgc3RvcmVz IG9ubHkgb25lIGNvcHkgb2YgdGhlIEdsb2JhbCBiaXQgaW4KKwkJICogdGhlIHRyYW5zbGF0aW9u IGxvb2thc2lkZSBidWZmZXIgZm9yIGVhY2ggMiBwYWdlIGVudHJ5LgorCQkgKiBUaHVzIGludmFs aWQgZW50cnlzIG11c3QgaGF2ZSB0aGUgR2xvYmFsIGJpdCBzZXQgc28gd2hlbgorCQkgKiBFbnRy eSBMTyBhbmQgRW50cnkgSEkgRyBiaXRzIGFyZSBhbmRlZCB0b2dldGhlciB0aGV5IHdpbGwKKwkJ ICogcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUgaW4gdGhlIHRsYi4KKwkJICovCisJCXB0 ZSA9IChwdF9lbnRyeV90ICopKnBkZTsKKwkJZm9yIChpID0gMDsgaSA8IE5QVEVQRzsgaSsrKQor CQkJcHRlW2ldID0gUFRFX0c7CisKKwkJa2VybmVsX3ZtX2VuZCA9IChrZXJuZWxfdm1fZW5kICsg TkJQRFIpICYgflBEUk1BU0s7CisJCWlmIChrZXJuZWxfdm1fZW5kIC0gMSA+PSBrZXJuZWxfbWFw LT5tYXhfb2Zmc2V0KSB7CisJCQlrZXJuZWxfdm1fZW5kID0ga2VybmVsX21hcC0+bWF4X29mZnNl dDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwYWdlIG1hbmFnZW1lbnQgcm91dGluZXMuCisg KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitD VEFTU0VSVChzaXplb2Yoc3RydWN0IHB2X2NodW5rKSA9PSBQQUdFX1NJWkUpOworQ1RBU1NFUlQo X05QQ00gPT0gMyk7CitDVEFTU0VSVChfTlBDUFYgPT0gMTY4KTsKKworc3RhdGljIF9faW5saW5l IHN0cnVjdCBwdl9jaHVuayAqCitwdl90b19jaHVuayhwdl9lbnRyeV90IHB2KQoreworCisJcmV0 dXJuICgoc3RydWN0IHB2X2NodW5rICopKCh1aW50cHRyX3QpcHYgJiB+KHVpbnRwdHJfdClQQUdF X01BU0spKTsKK30KKworI2RlZmluZSBQVl9QTUFQKHB2KSAocHZfdG9fY2h1bmsocHYpLT5wY19w bWFwKQorCisjZGVmaW5lCVBDX0ZSRUUwCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVmaW5lCVBD X0ZSRUUxCTB4ZmZmZmZmZmZmZmZmZmZmZnVsCisjZGVmaW5lCVBDX0ZSRUUyCTB4MDAwMDAwZmZm ZmZmZmZmZnVsCisKK3N0YXRpYyBjb25zdCB1X2xvbmcgcGNfZnJlZW1hc2tbX05QQ01dID0geyBQ Q19GUkVFMCwgUENfRlJFRTEsIFBDX0ZSRUUyIH07CisKKyNpZmRlZiBQVl9TVEFUUworc3RhdGlj IGludCBwY19jaHVua19jb3VudCwgcGNfY2h1bmtfYWxsb2NzLCBwY19jaHVua19mcmVlcywgcGNf Y2h1bmtfdHJ5ZmFpbDsKKworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5r X2NvdW50LCBDVExGTEFHX1JELCAmcGNfY2h1bmtfY291bnQsIDAsCisgICAgIkN1cnJlbnQgbnVt YmVyIG9mIHB2IGVudHJ5IGNodW5rcyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8s IHBjX2NodW5rX2FsbG9jcywgQ1RMRkxBR19SRCwgJnBjX2NodW5rX2FsbG9jcywgMCwKKyAgICAi Q3VycmVudCBudW1iZXIgb2YgcHYgZW50cnkgY2h1bmtzIGFsbG9jYXRlZCIpOworU1lTQ1RMX0lO VChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX2ZyZWVzLCBDVExGTEFHX1JELCAmcGNfY2h1 bmtfZnJlZXMsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHB2IGVudHJ5IGNodW5rcyBmcmVl cyIpOworU1lTQ1RMX0lOVChfdm1fcG1hcCwgT0lEX0FVVE8sIHBjX2NodW5rX3RyeWZhaWwsIENU TEZMQUdfUkQsICZwY19jaHVua190cnlmYWlsLCAwLAorICAgICJOdW1iZXIgb2YgdGltZXMgdHJp ZWQgdG8gZ2V0IGEgY2h1bmsgcGFnZSBidXQgZmFpbGVkLiIpOworCitzdGF0aWMgbG9uZyBwdl9l bnRyeV9jb3VudCwgcHZfZW50cnlfZnJlZXMsIHB2X2VudHJ5X2FsbG9jczsKK3N0YXRpYyBpbnQg cHZfZW50cnlfc3BhcmU7CisKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBPSURfQVVUTywgcHZfZW50 cnlfZnJlZXMsIENUTEZMQUdfUkQsICZwdl9lbnRyeV9mcmVlcywgMCwKKyAgICAiQ3VycmVudCBu dW1iZXIgb2YgcHYgZW50cnkgZnJlZXMiKTsKK1NZU0NUTF9MT05HKF92bV9wbWFwLCBPSURfQVVU TywgcHZfZW50cnlfYWxsb2NzLCBDVExGTEFHX1JELCAmcHZfZW50cnlfYWxsb2NzLCAwLAorICAg ICJDdXJyZW50IG51bWJlciBvZiBwdiBlbnRyeSBhbGxvY3MiKTsKK1NZU0NUTF9MT05HKF92bV9w bWFwLCBPSURfQVVUTywgcHZfZW50cnlfY291bnQsIENUTEZMQUdfUkQsICZwdl9lbnRyeV9jb3Vu dCwgMCwKKyAgICAiQ3VycmVudCBudW1iZXIgb2YgcHYgZW50cmllcyIpOworU1lTQ1RMX0lOVChf dm1fcG1hcCwgT0lEX0FVVE8sIHB2X2VudHJ5X3NwYXJlLCBDVExGTEFHX1JELCAmcHZfZW50cnlf c3BhcmUsIDAsCisgICAgIkN1cnJlbnQgbnVtYmVyIG9mIHNwYXJlIHB2IGVudHJpZXMiKTsKKyNl bmRpZgorCisvKgorICogV2UgYXJlIGluIGEgc2VyaW91cyBsb3cgbWVtb3J5IGNvbmRpdGlvbi4g IFJlc29ydCB0bworICogZHJhc3RpYyBtZWFzdXJlcyB0byBmcmVlIHNvbWUgcGFnZXMgc28gd2Ug Y2FuIGFsbG9jYXRlCisgKiBhbm90aGVyIHB2IGVudHJ5IGNodW5rLgorICoKKyAqIFJldHVybnMg TlVMTCBpZiBQViBlbnRyaWVzIHdlcmUgcmVjbGFpbWVkIGZyb20gdGhlIHNwZWNpZmllZCBwbWFw LgorICoKKyAqIFdlIGRvIG5vdCwgaG93ZXZlciwgdW5tYXAgMm1wYWdlcyBiZWNhdXNlIHN1YnNl cXVlbnQgYWNjZXNzIHdpbGwKKyAqIGFsbG9jYXRlIHBlci1wYWdlIHB2IGVudHJpZXMgdW50aWwg cmVwcm9tb3Rpb24gb2NjdXJzLCB0aGVyZWJ5CisgKiBleGFjZXJiYXRpbmcgdGhlIHNob3J0YWdl IG9mIGZyZWUgcHYgZW50cmllcy4KKyAqLworc3RhdGljIHZtX3BhZ2VfdAorcmVjbGFpbV9wdl9j aHVuayhwbWFwX3QgbG9ja2VkX3BtYXAsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1 Y3QgcGNoIG5ld190YWlsOworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJcGRfZW50cnlfdCAqcGRl OworCXBtYXBfdCBwbWFwOworCXB0X2VudHJ5X3QgKnB0ZSwgb2xkcHRlOworCXB2X2VudHJ5X3Qg cHY7CisJdm1fb2Zmc2V0X3QgdmE7CisJdm1fcGFnZV90IG0sIG1fcGM7CisJc3RydWN0IHNwZ2xp c3QgZnJlZTsKKwl1aW50NjRfdCBpbnVzZTsKKwlpbnQgYml0LCBmaWVsZCwgZnJlZWQsIGlkeDsK KworCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19B U1NFUlQobG9ja2VkX3BtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJUKGxvY2twICE9IE5VTEwsICgi cmVjbGFpbV9wdl9jaHVuazogbG9ja3AgaXMgTlVMTCIpKTsKKwlwbWFwID0gTlVMTDsKKwltX3Bj ID0gTlVMTDsKKwlTTElTVF9JTklUKCZmcmVlKTsKKwlUQUlMUV9JTklUKCZuZXdfdGFpbCk7CisJ bXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJd2hpbGUgKChwYyA9IFRBSUxRX0ZJUlNUKCZw dl9jaHVua3MpKSAhPSBOVUxMICYmIFNMSVNUX0VNUFRZKCZmcmVlKSkgeworCQlUQUlMUV9SRU1P VkUoJnB2X2NodW5rcywgcGMsIHBjX2xydSk7CisJCW10eF91bmxvY2soJnB2X2NodW5rc19tdXRl eCk7CisJCWlmIChwbWFwICE9IHBjLT5wY19wbWFwKSB7CisJCQlpZiAocG1hcCAhPSBOVUxMKSB7 CisJCQkJcG1hcF9pbnZhbGlkYXRlX2FsbChwbWFwKTsKKwkJCQlpZiAocG1hcCAhPSBsb2NrZWRf cG1hcCkKKwkJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQl9CisJCQlwbWFwID0gcGMtPnBjX3Bt YXA7CisJCQkvKiBBdm9pZCBkZWFkbG9jayBhbmQgbG9jayByZWN1cnNpb24uICovCisJCQlpZiAo cG1hcCA+IGxvY2tlZF9wbWFwKSB7CisJCQkJUkVMRUFTRV9QVl9MSVNUX0xPQ0sobG9ja3ApOwor CQkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCX0gZWxzZSBpZiAocG1hcCAhPSBsb2NrZWRfcG1hcCAm JiAhUE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkJcG1hcCA9IE5VTEw7CisJCQkJVEFJTFFfSU5T RVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJCQltdHhfbG9jaygmcHZfY2h1bmtz X211dGV4KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIERlc3Ryb3kg ZXZlcnkgbm9uLXdpcmVkLCA0IEtCIHBhZ2UgbWFwcGluZyBpbiB0aGUgY2h1bmsuCisJCSAqLwor CQlmcmVlZCA9IDA7CisJCWZvciAoZmllbGQgPSAwOyBmaWVsZCA8IF9OUENNOyBmaWVsZCsrKSB7 CisJCQlmb3IgKGludXNlID0gfnBjLT5wY19tYXBbZmllbGRdICYgcGNfZnJlZW1hc2tbZmllbGRd OworCQkJICAgIGludXNlICE9IDA7IGludXNlICY9IH4oMVVMIDw8IGJpdCkpIHsKKwkJCQliaXQg PSBmZnNsKGludXNlKSAtIDE7CisJCQkJaWR4ID0gZmllbGQgKiBzaXplb2YoaW51c2UpICogTkJC WSArIGJpdDsKKwkJCQlwdiA9ICZwYy0+cGNfcHZlbnRyeVtpZHhdOworCQkJCXZhID0gcHYtPnB2 X3ZhOworCQkJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJCQlLQVNTRVJUKHBkZSAhPSBO VUxMICYmICpwZGUgIT0gMCwKKwkJCQkgICAgKCIlczogcGRlIiwgX19mdW5jX18pKTsKKwkJCQlp ZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKQorCQkJCQljb250aW51ZTsKKwkJCQlwdGUgPSBw bWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJCQkJb2xkcHRlID0gKnB0ZTsKKwkJCQlpZiAocHRl X3Rlc3QoJm9sZHB0ZSwgUFRFX1cpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoaXNfa2VybmVs X3BtYXAocG1hcCkpCisJCQkJCSpwdGUgPSBQVEVfRzsKKwkJCQllbHNlCisJCQkJCSpwdGUgPSAw OworCQkJCWlmIChwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRykpCisJCQkJCXBtYXBfaW52YWxpZGF0 ZV9wYWdlKHBtYXAsIHZhKTsKKwkJCQltID0gUEhZU19UT19WTV9QQUdFKFRMQkxPX1BURV9UT19Q QShvbGRwdGUpKTsKKwkJCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKQorCQkJCQl2bV9w YWdlX2RpcnR5KG0pOworCQkJCWlmIChwdGVfaXNfcmVmKCZvbGRwdGUpKQorCQkJCQl2bV9wYWdl X2FmbGFnX3NldChtLCBQR0FfUkVGRVJFTkNFRCk7CisJCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5w dl9saXN0LCBwdiwgcHZfbmV4dCk7CisJCQkJbS0+bWQucHZfZ2VuKys7CisJCQkJaWYgKFRBSUxR X0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJCSAgICAobS0+ZmxhZ3MgJiBQR19GSUNUSVRJ T1VTKSA9PSAwKSB7CisJCQkJCXN0cnVjdCBtZF9wYWdlICpwdmggPQorCQkJCQkgICAgcGFfdG9f cHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJCQkJCWlmIChUQUlMUV9FTVBUWSgmcHZoLT5wdl9s aXN0KSkgeworCQkJCQkJdm1fcGFnZV9hZmxhZ19jbGVhcihtLAorCQkJCQkJICAgIFBHQV9XUklU RUFCTEUpOworCQkJCQl9CisJCQkJfQorCQkJCXBjLT5wY19tYXBbZmllbGRdIHw9IDFVTCA8PCBi aXQ7CisJCQkJcG1hcF91bnVzZV9wdChwbWFwLCB2YSwgKnBkZSwgJmZyZWUpOworCQkJCWZyZWVk Kys7CisJCQl9CisJCX0KKwkJaWYgKGZyZWVkID09IDApIHsKKwkJCVRBSUxRX0lOU0VSVF9UQUlM KCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCQltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsK KwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEV2ZXJ5IGZyZWVkIG1hcHBpbmcgaXMgZm9yIGEgNCBL QiBwYWdlLiAqLworCQlwbWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCBmcmVlZCk7CisJCVBW X1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRyeV9mcmVlcywgZnJlZWQpKTsKKwkJUFZfU1RB VChhdG9taWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIGZyZWVkKSk7CisJCVBWX1NUQVQoYXRv bWljX3N1YnRyYWN0X2xvbmcoJnB2X2VudHJ5X2NvdW50LCBmcmVlZCkpOworCQlUQUlMUV9SRU1P VkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJaWYgKHBjLT5wY19tYXBbMF0g PT0gUENfRlJFRTAgJiYgcGMtPnBjX21hcFsxXSA9PSBQQ19GUkVFMSAmJgorCQkgICAgcGMtPnBj X21hcFsyXSA9PSBQQ19GUkVFMikgeworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50KCZw dl9lbnRyeV9zcGFyZSwgX05QQ1BWKSk7CisJCQlQVl9TVEFUKGF0b21pY19zdWJ0cmFjdF9pbnQo JnBjX2NodW5rX2NvdW50LCAxKSk7CisJCQlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVu a19mcmVlcywgMSkpOworCQkJLyogRW50aXJlIGNodW5rIGlzIGZyZWU7IHJldHVybiBpdC4gKi8K KwkJCW1fcGMgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygKKwkJCSAgICAo dm1fb2Zmc2V0X3QpcGMpKTsKKwkJCWR1bXBfZHJvcF9wYWdlKG1fcGMtPnBoeXNfYWRkcik7CisJ CQltdHhfbG9jaygmcHZfY2h1bmtzX211dGV4KTsKKwkJCWJyZWFrOworCQl9CisJCVRBSUxRX0lO U0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCVRBSUxRX0lOU0VS VF9UQUlMKCZuZXdfdGFpbCwgcGMsIHBjX2xydSk7CisJCW10eF9sb2NrKCZwdl9jaHVua3NfbXV0 ZXgpOworCQkvKiBPbmUgZnJlZWQgcHYgZW50cnkgaW4gbG9ja2VkX3BtYXAgaXMgc3VmZmljaWVu dC4gKi8KKwkJaWYgKHBtYXAgPT0gbG9ja2VkX3BtYXApCisJCQlicmVhazsKKwl9CisJVEFJTFFf Q09OQ0FUKCZwdl9jaHVua3MsICZuZXdfdGFpbCwgcGNfbHJ1KTsKKwltdHhfdW5sb2NrKCZwdl9j aHVua3NfbXV0ZXgpOworCWlmIChwbWFwICE9IE5VTEwpIHsKKwkJcG1hcF9pbnZhbGlkYXRlX2Fs bChwbWFwKTsKKwkJaWYgKHBtYXAgIT0gbG9ja2VkX3BtYXApCisJCQlQTUFQX1VOTE9DSyhwbWFw KTsKKwl9CisJaWYgKG1fcGMgPT0gTlVMTCAmJiAhU0xJU1RfRU1QVFkoJmZyZWUpKSB7CisJCW1f cGMgPSBTTElTVF9GSVJTVCgmZnJlZSk7CisJCVNMSVNUX1JFTU9WRV9IRUFEKCZmcmVlLCBwbGlu a3Mucy5zcyk7CisJCS8qIFJlY3ljbGUgYSBmcmVlZCBwYWdlIHRhYmxlIHBhZ2UuICovCisJCW1f cGMtPndpcmVfY291bnQgPSAxOworCQlhdG9taWNfYWRkX2ludCgmdm1fY250LnZfd2lyZV9jb3Vu dCwgMSk7CisJfQorCXBtYXBfZnJlZV96ZXJvX3BhZ2VzKCZmcmVlKTsKKwlyZXR1cm4gKG1fcGMp OworfQorCisvKgorICogZnJlZSB0aGUgcHZfZW50cnkgYmFjayB0byB0aGUgZnJlZSBsaXN0Cisg Ki8KK3N0YXRpYyB2b2lkCitmcmVlX3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBwdl9lbnRyeV90IHB2 KQoreworCXN0cnVjdCBwdl9jaHVuayAqcGM7CisJaW50IGJpdCwgZmllbGQsIGlkeDsKKworCXJ3 X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NFUlQo cG1hcCwgTUFfT1dORUQpOworCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZwdl9lbnRyeV9mcmVl cywgMSkpOworCVBWX1NUQVQoYXRvbWljX2FkZF9pbnQoJnB2X2VudHJ5X3NwYXJlLCAxKSk7CisJ UFZfU1RBVChhdG9taWNfc3VidHJhY3RfbG9uZygmcHZfZW50cnlfY291bnQsIDEpKTsKKwlwYyA9 IHB2X3RvX2NodW5rKHB2KTsKKwlpZHggPSBwdiAtICZwYy0+cGNfcHZlbnRyeVswXTsKKwlmaWVs ZCA9IGlkeCAvIChzaXplb2YodV9sb25nKSAqIE5CQlkpOworCWJpdCA9IGlkeCAlIChzaXplb2Yo dV9sb25nKSAqIE5CQlkpOworCXBjLT5wY19tYXBbZmllbGRdIHw9IDF1bCA8PCBiaXQ7CisJaWYg KHBjLT5wY19tYXBbMF0gIT0gUENfRlJFRTAgfHwgcGMtPnBjX21hcFsxXSAhPSBQQ19GUkVFMSB8 fAorCSAgICBwYy0+cGNfbWFwWzJdICE9IFBDX0ZSRUUyKSB7CisJCS8qIDk4JSBvZiB0aGUgdGlt ZSwgcGMgaXMgYWxyZWFkeSBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gKi8KKwkJaWYgKF9fcHJl ZGljdF9mYWxzZShwYyAhPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuaykpKSB7CisJCQlU QUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJCVRBSUxRX0lO U0VSVF9IRUFEKCZwbWFwLT5wbV9wdmNodW5rLCBwYywgcGNfbGlzdCk7CisJCX0KKwkJcmV0dXJu OworCX0KKwlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwlm cmVlX3B2X2NodW5rKHBjKTsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfcHZfY2h1bmsoc3RydWN0 IHB2X2NodW5rICpwYykKK3sKKwl2bV9wYWdlX3QgbTsKKworCW10eF9sb2NrKCZwdl9jaHVua3Nf bXV0ZXgpOworCVRBSUxRX1JFTU9WRSgmcHZfY2h1bmtzLCBwYywgcGNfbHJ1KTsKKwltdHhfdW5s b2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2ludCgmcHZf ZW50cnlfc3BhcmUsIF9OUENQVikpOworCVBWX1NUQVQoYXRvbWljX3N1YnRyYWN0X2ludCgmcGNf Y2h1bmtfY291bnQsIDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVua19mcmVl cywgMSkpOworCS8qIGVudGlyZSBjaHVuayBpcyBmcmVlLCByZXR1cm4gaXQgKi8KKwltID0gUEhZ U19UT19WTV9QQUdFKE1JUFNfRElSRUNUX1RPX1BIWVMoKHZtX29mZnNldF90KXBjKSk7CisJZHVt cF9kcm9wX3BhZ2UobS0+cGh5c19hZGRyKTsKKwl2bV9wYWdlX3Vud2lyZShtLCBQUV9JTkFDVElW RSk7CisJdm1fcGFnZV9mcmVlKG0pOworfQorCisvKgorICogUmV0dXJucyBhIG5ldyBQViBlbnRy eSwgYWxsb2NhdGluZyBhIG5ldyBQViBjaHVuayBmcm9tIHRoZSBzeXN0ZW0gd2hlbgorICogbmVl ZGVkLiAgSWYgdGhpcyBQViBjaHVuayBhbGxvY2F0aW9uIGZhaWxzIGFuZCBhIFBWIGxpc3QgbG9j ayBwb2ludGVyIHdhcworICogZ2l2ZW4sIGEgUFYgY2h1bmsgaXMgcmVjbGFpbWVkIGZyb20gYW4g YXJiaXRyYXJ5IHBtYXAuICBPdGhlcndpc2UsIE5VTEwgaXMKKyAqIHJldHVybmVkLgorICoKKyAq IFRoZSBnaXZlbiBQViBsaXN0IGxvY2sgbWF5IGJlIHJlbGVhc2VkLgorICovCitzdGF0aWMgcHZf ZW50cnlfdAorZ2V0X3B2X2VudHJ5KHBtYXBfdCBwbWFwLCBzdHJ1Y3Qgcndsb2NrICoqbG9ja3Ap Cit7CisJaW50IGJpdCwgZmllbGQsIGlkeDsKKwlwdl9lbnRyeV90IHB2OworCXN0cnVjdCBwdl9j aHVuayAqcGM7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywg UkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlQVl9TVEFU KGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfYWxsb2NzLCAxKSk7CityZXRyeToKKwlwYyA9IFRB SUxRX0ZJUlNUKCZwbWFwLT5wbV9wdmNodW5rKTsKKwlpZiAocGMgIT0gTlVMTCkgeworCQlmb3Ig KGZpZWxkID0gMDsgZmllbGQgPCBfTlBDTTsgZmllbGQrKykgeworCQkJaWYgKHBjLT5wY19tYXBb ZmllbGRdKSB7CisJCQkJYml0ID0gZmZzbChwYy0+cGNfbWFwW2ZpZWxkXSkgLSAxOworCQkJCWJy ZWFrOworCQkJfQorCQl9CisJCWlmIChmaWVsZCA8IF9OUENNKSB7CisJCQlpZHggPSBmaWVsZCAq IHNpemVvZihwYy0+cGNfbWFwW2ZpZWxkXSkgKiBOQkJZICsgYml0OworCQkJcHYgPSAmcGMtPnBj X3B2ZW50cnlbaWR4XTsKKwkJCXBjLT5wY19tYXBbZmllbGRdICY9IH4oMXVsIDw8IGJpdCk7CisJ CQkvKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCBpdGVtLCBtb3ZlIGl0IHRvIHRhaWwgKi8KKwkJCWlm IChwYy0+cGNfbWFwWzBdID09IDAgJiYgcGMtPnBjX21hcFsxXSA9PSAwICYmCisJCQkgICAgcGMt PnBjX21hcFsyXSA9PSAwKSB7CisJCQkJVEFJTFFfUkVNT1ZFKCZwbWFwLT5wbV9wdmNodW5rLCBw YywgcGNfbGlzdCk7CisJCQkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1bmssIHBj LAorCQkJCSAgICBwY19saXN0KTsKKwkJCX0KKwkJCVBWX1NUQVQoYXRvbWljX2FkZF9sb25nKCZw dl9lbnRyeV9jb3VudCwgMSkpOworCQkJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfaW50KCZwdl9l bnRyeV9zcGFyZSwgMSkpOworCQkJcmV0dXJuIChwdik7CisJCX0KKwl9CisJLyogTm8gZnJlZSBp dGVtcywgYWxsb2NhdGUgYW5vdGhlciBjaHVuayAqLworCW0gPSB2bV9wYWdlX2FsbG9jKE5VTEws IDAsIFZNX0FMTE9DX05PUk1BTCB8IFZNX0FMTE9DX05PT0JKIHwKKwkgICAgVk1fQUxMT0NfV0lS RUQpOworCWlmIChtID09IE5VTEwpIHsKKwkJaWYgKGxvY2twID09IE5VTEwpIHsKKwkJCVBWX1NU QVQocGNfY2h1bmtfdHJ5ZmFpbCsrKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKwkJbSA9IHJl Y2xhaW1fcHZfY2h1bmsocG1hcCwgbG9ja3ApOworCQlpZiAobSA9PSBOVUxMKQorCQkJZ290byBy ZXRyeTsKKwl9CisJUFZfU1RBVChhdG9taWNfYWRkX2ludCgmcGNfY2h1bmtfY291bnQsIDEpKTsK KwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19jaHVua19hbGxvY3MsIDEpKTsKKwlkdW1wX2Fk ZF9wYWdlKG0tPnBoeXNfYWRkcik7CisJcGMgPSAoc3RydWN0IHB2X2NodW5rICopTUlQU19QSFlT X1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobSkpOworCXBjLT5wY19wbWFwID0gcG1hcDsKKwlw Yy0+cGNfbWFwWzBdID0gUENfRlJFRTAgJiB+MXVsOwkvKiBwcmVhbGxvY2F0ZWQgYml0IDAgKi8K KwlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJcGMtPnBjX21hcFsyXSA9IFBDX0ZSRUUyOwor CW10eF9sb2NrKCZwdl9jaHVua3NfbXV0ZXgpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZwdl9jaHVu a3MsIHBjLCBwY19scnUpOworCW10eF91bmxvY2soJnB2X2NodW5rc19tdXRleCk7CisJcHYgPSAm cGMtPnBjX3B2ZW50cnlbMF07CisJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2Y2h1bmss IHBjLCBwY19saXN0KTsKKwlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZfZW50cnlfY291bnQs IDEpKTsKKwlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwdl9lbnRyeV9zcGFyZSwgX05QQ1BWIC0g MSkpOworCXJldHVybiAocHYpOworfQorCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9u ZSBiaXRzIHdpdGhpbiB0aGUgZ2l2ZW4gUFYgY2h1bmsgbWFwIGVsZW1lbnQuCisgKi8KK3N0YXRp YyBpbmxpbmUgaW50Citwb3Bjb3VudF9wY19tYXBfZWxlbSh1aW50NjRfdCBlbGVtKQoreworCWlu dCBjb3VudDsKKworCS8qCisJICogVGhpcyBzaW1wbGUgbWV0aG9kIG9mIGNvdW50aW5nIHRoZSBv bmUgYml0cyBwZXJmb3JtcyB3ZWxsIGJlY2F1c2UKKwkgKiB0aGUgZ2l2ZW4gZWxlbWVudCB0eXBp Y2FsbHkgY29udGFpbnMgbW9yZSB6ZXJvIGJpdHMgdGhhbiBvbmUgYml0cy4KKwkgKi8KKwljb3Vu dCA9IDA7CisJZm9yICg7IGVsZW0gIT0gMDsgZWxlbSAmPSBlbGVtIC0gMSkKKwkJY291bnQrKzsK KwlyZXR1cm4gKGNvdW50KTsKK30KKworLyoKKyAqIEVuc3VyZSB0aGF0IHRoZSBudW1iZXIgb2Yg c3BhcmUgUFYgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkIHBtYXAgbWVldHMgb3IKKyAqIGV4Y2Vl ZHMgdGhlIGdpdmVuIGNvdW50LCAibmVlZGVkIi4KKyAqCisgKiBUaGUgZ2l2ZW4gUFYgbGlzdCBs b2NrIG1heSBiZSByZWxlYXNlZC4KKyAqLworc3RhdGljIHZvaWQKK3Jlc2VydmVfcHZfZW50cmll cyhwbWFwX3QgcG1hcCwgaW50IG5lZWRlZCwgc3RydWN0IHJ3bG9jayAqKmxvY2twKQoreworCXN0 cnVjdCBwY2ggbmV3X3RhaWw7CisJc3RydWN0IHB2X2NodW5rICpwYzsKKwlpbnQgYXZhaWwsIGZy ZWU7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9D S0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlLQVNTRVJUKGxvY2tw ICE9IE5VTEwsICgiJXM6IGxvY2twIGlzIE5VTEwiLCBfX2Z1bmNfXykpOworCisJLyoKKwkgKiBO ZXdseSBhbGxvY2F0ZWQgUFYgY2h1bmtzIG11c3QgYmUgc3RvcmVkIGluIGEgcHJpdmF0ZSBsaXN0 IHVudGlsCisJICogdGhlIHJlcXVpcmVkIG51bWJlciBvZiBQViBjaHVua3MgaGF2ZSBiZWVuIGFs bG9jYXRlZC4gIE90aGVyd2lzZSwKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgY291bGQgcmVjeWNs ZSBvbmUgb2YgdGhlc2UgY2h1bmtzLiAgSW4KKwkgKiBjb250cmFzdCwgdGhlc2UgY2h1bmtzIG11 c3QgYmUgYWRkZWQgdG8gdGhlIHBtYXAgdXBvbiBhbGxvY2F0aW9uLgorCSAqLworCVRBSUxRX0lO SVQoJm5ld190YWlsKTsKK3JldHJ5OgorCWF2YWlsID0gMDsKKwlUQUlMUV9GT1JFQUNIKHBjLCAm cG1hcC0+cG1fcHZjaHVuaywgcGNfbGlzdCkgeworCQlmcmVlID0gcG9wY291bnRfcGNfbWFwX2Vs ZW0ocGMtPnBjX21hcFswXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0ocGMtPnBj X21hcFsxXSk7CisJCWZyZWUgKz0gcG9wY291bnRfcGNfbWFwX2VsZW0ocGMtPnBjX21hcFsyXSk7 CisJCWlmIChmcmVlID09IDApCisJCQlicmVhazsKKwkJYXZhaWwgKz0gZnJlZTsKKwkJaWYgKGF2 YWlsID49IG5lZWRlZCkKKwkJCWJyZWFrOworCX0KKwlmb3IgKDsgYXZhaWwgPCBuZWVkZWQ7IGF2 YWlsICs9IF9OUENQVikgeworCQltID0gdm1fcGFnZV9hbGxvYyhOVUxMLCAwLCBWTV9BTExPQ19O T1JNQUwgfCBWTV9BTExPQ19OT09CSiB8CisJCSAgICBWTV9BTExPQ19XSVJFRCk7CisJCWlmICht ID09IE5VTEwpIHsKKwkJCW0gPSByZWNsYWltX3B2X2NodW5rKHBtYXAsIGxvY2twKTsKKwkJCWlm IChtID09IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCQlQVl9TVEFUKGF0b21pY19hZGRf aW50KCZwY19jaHVua19jb3VudCwgMSkpOworCQlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwY19j aHVua19hbGxvY3MsIDEpKTsKKwkJZHVtcF9hZGRfcGFnZShtLT5waHlzX2FkZHIpOworCQlwYyA9 IChzdHJ1Y3QgcHZfY2h1bmsgKilNSVBTX1BIWVNfVE9fRElSRUNUKFZNX1BBR0VfVE9fUEhZUyht KSk7CisJCXBjLT5wY19wbWFwID0gcG1hcDsKKwkJcGMtPnBjX21hcFswXSA9IFBDX0ZSRUUwOwor CQlwYy0+cGNfbWFwWzFdID0gUENfRlJFRTE7CisJCXBjLT5wY19tYXBbMl0gPSBQQ19GUkVFMjsK KwkJVEFJTFFfSU5TRVJUX0hFQUQoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJ VEFJTFFfSU5TRVJUX1RBSUwoJm5ld190YWlsLCBwYywgcGNfbHJ1KTsKKwkJUFZfU1RBVChhdG9t aWNfYWRkX2ludCgmcHZfZW50cnlfc3BhcmUsIF9OUENQVikpOworCX0KKwlpZiAoIVRBSUxRX0VN UFRZKCZuZXdfdGFpbCkpIHsKKwkJbXR4X2xvY2soJnB2X2NodW5rc19tdXRleCk7CisJCVRBSUxR X0NPTkNBVCgmcHZfY2h1bmtzLCAmbmV3X3RhaWwsIHBjX2xydSk7CisJCW10eF91bmxvY2soJnB2 X2NodW5rc19tdXRleCk7CisJfQorfQorCisvKgorICogRmlyc3QgZmluZCBhbmQgdGhlbiByZW1v dmUgdGhlIHB2IGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIHBtYXAgYW5kIHZpcnR1YWwKKyAqIGFk ZHJlc3MgZnJvbSB0aGUgc3BlY2lmaWVkIHB2IGxpc3QuICBSZXR1cm5zIHRoZSBwdiBlbnRyeSBp ZiBmb3VuZCBhbmQgTlVMTAorICogb3RoZXJ3aXNlLiAgVGhpcyBvcGVyYXRpb24gY2FuIGJlIHBl cmZvcm1lZCBvbiBwdiBsaXN0cyBmb3IgZWl0aGVyIDRLQiBvcgorICogMk1CIHBhZ2UgbWFwcGlu Z3MuCisgKi8KK3N0YXRpYyBwdl9lbnRyeV90CitwbWFwX3B2aF9yZW1vdmUoc3RydWN0IG1kX3Bh Z2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXB2X2VudHJ5X3QgcHY7 CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlUQUlMUV9GT1JF QUNIKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0KSB7CisJCWlmIChwbWFwID09IFBWX1BNQVAo cHYpICYmIHZhID09IHB2LT5wdl92YSkgeworCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3Qs IHB2LCBwdl9uZXh0KTsKKwkJCXB2aC0+cHZfZ2VuKys7CisJCQlicmVhazsKKwkJfQorCX0KKwly ZXR1cm4gKHB2KTsKK30KKworLyoKKyAqIEFmdGVyIGRlbW90aW9uIGZyb20gYSAyTUIgcGFnZSBt YXBwaW5nIHRvIDUxMiA0S0IgcGFnZSBtYXBwaW5ncywKKyAqIGRlc3Ryb3kgdGhlIHB2IGVudHJ5 IGZvciB0aGUgMk1CIHBhZ2UgbWFwcGluZyBhbmQgcmVpbnN0YW50aWF0ZSB0aGUgcHYKKyAqIGVu dHJpZXMgZm9yIGVhY2ggb2YgdGhlIDRLQiBwYWdlIG1hcHBpbmdzLgorICovCitzdGF0aWMgdm9p ZAorcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFk ZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJc3RydWN0IG1kX3BhZ2Ug KnB2aDsKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjOworCXB2X2VudHJ5X3QgcHY7CisJdm1fb2Zmc2V0 X3QgdmFfbGFzdDsKKwl2bV9wYWdlX3QgbTsKKwlpbnQgYml0LCBmaWVsZDsKKworCXJ3X2Fzc2Vy dCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9MT0NLRUQpOworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwg TUFfT1dORUQpOworCUtBU1NFUlQoKHBhICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCIlczogcGEg aXMgbm90IDJtcGFnZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlDSEFOR0VfUFZfTElTVF9MT0NL X1RPX1BIWVMobG9ja3AsIHBhKTsKKworCS8qCisJICogVHJhbnNmZXIgdGhlIDJtcGFnZSdzIHB2 IGVudHJ5IGZvciB0aGlzIG1hcHBpbmcgdG8gdGhlIGZpcnN0CisJICogcGFnZSdzIHB2IGxpc3Qu ICBPbmNlIHRoaXMgdHJhbnNmZXIgYmVnaW5zLCB0aGUgcHYgbGlzdCBsb2NrCisJICogbXVzdCBu b3QgYmUgcmVsZWFzZWQgdW50aWwgdGhlIGxhc3QgcHYgZW50cnkgaXMgcmVpbnN0YW50aWF0ZWQu CisJICovCisJcHZoID0gcGFfdG9fcHZoKHBhKTsKKwl2YSA9IHRydW5jXzJtcGFnZSh2YSk7CisJ cHYgPSBwbWFwX3B2aF9yZW1vdmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAhPSBOVUxM LCAoIiVzOiBwdiBub3QgZm91bmQiLCBfX2Z1bmNfXykpOworCW0gPSBQSFlTX1RPX1ZNX1BBR0Uo cGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CisJ bS0+bWQucHZfZ2VuKys7CisJLyogSW5zdGFudGlhdGUgdGhlIHJlbWFpbmluZyBOUFRFUEcgLSAx IHB2IGVudHJpZXMuICovCisJUFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2X2VudHJ5X2FsbG9j cywgTlBURVBHIC0gMSkpOworCXZhX2xhc3QgPSB2YSArIE5CUERSIC0gUEFHRV9TSVpFOworCWZv ciAoOzspIHsKKwkJcGMgPSBUQUlMUV9GSVJTVCgmcG1hcC0+cG1fcHZjaHVuayk7CisJCUtBU1NF UlQocGMtPnBjX21hcFswXSAhPSAwIHx8IHBjLT5wY19tYXBbMV0gIT0gMCB8fAorCQkgICAgcGMt PnBjX21hcFsyXSAhPSAwLCAoIiVzOiBtaXNzaW5nIHNwYXJlIiwgX19mdW5jX18pKTsKKwkJZm9y IChmaWVsZCA9IDA7IGZpZWxkIDwgX05QQ007IGZpZWxkKyspIHsKKwkJCXdoaWxlIChwYy0+cGNf bWFwW2ZpZWxkXSkgeworCQkJCWJpdCA9IGZmc2wocGMtPnBjX21hcFtmaWVsZF0pIC0gMTsKKwkJ CQlwYy0+cGNfbWFwW2ZpZWxkXSAmPSB+KDF1bCA8PCBiaXQpOworCQkJCXB2ID0gJnBjLT5wY19w dmVudHJ5W2ZpZWxkICogNjQgKyBiaXRdOworCQkJCXZhICs9IFBBR0VfU0laRTsKKwkJCQlwdi0+ cHZfdmEgPSB2YTsKKwkJCQltKys7CisJCQkJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFO QUdFRCkgPT0gMCwKKwkJCQkgICAoIiVzOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgX19mdW5j X18sIG0pKTsKKwkJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25l eHQpOworCQkJCW0tPm1kLnB2X2dlbisrOworCQkJCWlmICh2YSA9PSB2YV9sYXN0KQorCQkJCQln b3RvIG91dDsKKwkJCX0KKwkJfQorCQlUQUlMUV9SRU1PVkUoJnBtYXAtPnBtX3B2Y2h1bmssIHBj LCBwY19saXN0KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBtX3B2Y2h1bmssIHBjLCBw Y19saXN0KTsKKwl9CitvdXQ6CisJaWYgKHBjLT5wY19tYXBbMF0gPT0gMCAmJiBwYy0+cGNfbWFw WzFdID09IDAgJiYgcGMtPnBjX21hcFsyXSA9PSAwKSB7CisJCVRBSUxRX1JFTU9WRSgmcG1hcC0+ cG1fcHZjaHVuaywgcGMsIHBjX2xpc3QpOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmcG1hcC0+cG1f cHZjaHVuaywgcGMsIHBjX2xpc3QpOworCX0KKwlQVl9TVEFUKGF0b21pY19hZGRfbG9uZygmcHZf ZW50cnlfY291bnQsIE5QVEVQRyAtIDEpKTsKKwlQVl9TVEFUKGF0b21pY19zdWJ0cmFjdF9pbnQo JnB2X2VudHJ5X3NwYXJlLCBOUFRFUEcgLSAxKSk7Cit9CisKKy8qCisgKiBBZnRlciBwcm9tb3Rp b24gZnJvbSA1MTIgNEtCIHBhZ2UgbWFwcGluZ3MgdG8gYSBzaW5nbGUgMk1CIHBhZ2UgbWFwcGlu ZywKKyAqIHJlcGxhY2UgdGhlIG1hbnkgcHYgZW50cmllcyBmb3IgdGhlIDRLQiBwYWdlIG1hcHBp bmdzIGJ5IGEgc2luZ2xlIHB2IGVudHJ5CisgKiBmb3IgdGhlIDJNQiBwYWdlIG1hcHBpbmcuCisg Ki8KK3N0YXRpYyB2b2lkCitwbWFwX3B2X3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZz ZXRfdCB2YSwgdm1fcGFkZHJfdCBwYSwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJ c3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9lbnRyeV90IHB2OworCXZtX29mZnNldF90IHZhX2xh c3Q7CisJdm1fcGFnZV90IG07CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9jaywgUkFfTE9D S0VEKTsKKwlLQVNTRVJUKChwYSAmIFBEUk1BU0spID09IDAsCisJICAgICgiJXM6IHBhIGlzIG5v dCAybXBhZ2UgYWxpZ25lZCIsIF9fZnVuY19fKSk7CisJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19Q SFlTKGxvY2twLCBwYSk7CisKKwkvKgorCSAqIFRyYW5zZmVyIHRoZSBmaXJzdCBwYWdlJ3MgcHYg ZW50cnkgZm9yIHRoaXMgbWFwcGluZyB0byB0aGUgMm1wYWdlJ3MKKwkgKiBwdiBsaXN0LiAgQXNp ZGUgZnJvbSBhdm9pZGluZyB0aGUgY29zdCBvZiBhIGNhbGwgdG8gZ2V0X3B2X2VudHJ5KCksCisJ ICogYSB0cmFuc2ZlciBhdm9pZHMgdGhlIHBvc3NpYmlsaXR5IHRoYXQgZ2V0X3B2X2VudHJ5KCkg Y2FsbHMKKwkgKiByZWNsYWltX3B2X2NodW5rKCkgYW5kIHRoYXQgcmVjbGFpbV9wdl9jaHVuaygp IHJlbW92ZXMgb25lIG9mIHRoZQorCSAqIG1hcHBpbmdzIHRoYXQgaXMgYmVpbmcgcHJvbW90ZWQu CisJICovCisJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJdmEgPSB0cnVuY18ybXBhZ2UodmEp OworCXB2ID0gcG1hcF9wdmhfcmVtb3ZlKCZtLT5tZCwgcG1hcCwgdmEpOworCUtBU1NFUlQocHYg IT0gTlVMTCwgKCIlczogcHYgbm90IGZvdW5kIiwgX19mdW5jX18pKTsKKwlwdmggPSBwYV90b19w dmgocGEpOworCVRBSUxRX0lOU0VSVF9UQUlMKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsK KwlwdmgtPnB2X2dlbisrOworCS8qIEZyZWUgdGhlIHJlbWFpbmluZyBOUFRFUEcgLSAxIHB2IGVu dHJpZXMuICovCisJdmFfbGFzdCA9IHZhICsgTkJQRFIgLSBQQUdFX1NJWkU7CisJZG8geworCQlt Kys7CisJCXZhICs9IFBBR0VfU0laRTsKKwkJcG1hcF9wdmhfZnJlZSgmbS0+bWQsIHBtYXAsIHZh KTsKKwl9IHdoaWxlICh2YSA8IHZhX2xhc3QpOworfQorCisvKgorICogRmlyc3QgZmluZCBhbmQg dGhlbiBkZXN0cm95IHRoZSBwdiBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBwbWFwIGFuZCB2aXJ0 dWFsCisgKiBhZGRyZXNzLiAgVGhpcyBvcGVyYXRpb24gY2FuIGJlIHBlcmZvcm1lZCBvbiBwdiBs aXN0cyBmb3IgZWl0aGVyIDRLQiBvciAyTUIKKyAqIHBhZ2UgbWFwcGluZ3MuCisgKi8KK3N0YXRp YyB2b2lkCitwbWFwX3B2aF9mcmVlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBfdCBwbWFwLCB2 bV9vZmZzZXRfdCB2YSkKK3sKKwlwdl9lbnRyeV90IHB2OworCisJcHYgPSBwbWFwX3B2aF9yZW1v dmUocHZoLCBwbWFwLCB2YSk7CisJS0FTU0VSVChwdiAhPSBOVUxMLCAoInBtYXBfcHZoX2ZyZWU6 IHB2IG5vdCBmb3VuZCwgcGEgJWx4IHZhICVseCIsCisJICAgICAodV9sb25nKVZNX1BBR0VfVE9f UEhZUyhfX2NvbnRhaW5lcm9mKHB2aCwgc3RydWN0IHZtX3BhZ2UsIG1kKSksCisJICAgICAodV9s b25nKXZhKSk7CisJZnJlZV9wdl9lbnRyeShwbWFwLCBwdik7Cit9CisKKy8qCisgKiBDb25kaXRp b25hbGx5IGNyZWF0ZSB0aGUgcHYgZW50cnkgZm9yIGEgNEtCIHBhZ2UgbWFwcGluZyBpZiB0aGUg cmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4gYmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVzdG9ydGluZyB0 byByZWNsYW1hdGlvbi4KKyAqLworc3RhdGljIGJvb2xlYW5fdAorcG1hcF90cnlfaW5zZXJ0X3B2 X2VudHJ5KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sCisgICAgc3Ry dWN0IHJ3bG9jayAqKmxvY2twKQoreworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2 aF9nbG9iYWxfbG9jaywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09X TkVEKTsKKwlpZiAoKHB2ID0gZ2V0X3B2X2VudHJ5KHBtYXAsIE5VTEwpKSAhPSBOVUxMKSB7CisJ CXB2LT5wdl92YSA9IHZhOworCQlDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1ZNX1BBR0UobG9ja3As IG0pOworCQlUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwor CQltLT5tZC5wdl9nZW4rKzsKKwkJcmV0dXJuIChUUlVFKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChG QUxTRSk7Cit9CisKKy8qCisgKiBDb25kaXRpb25hbGx5IGNyZWF0ZSB0aGUgUFYgZW50cnkgZm9y IGEgMk1CIHBhZ2UgbWFwcGluZyBpZiB0aGUgcmVxdWlyZWQKKyAqIG1lbW9yeSBjYW4gYmUgYWxs b2NhdGVkIHdpdGhvdXQgcmVzb3J0aW5nIHRvIHJlY2xhbWF0aW9uLgorICovCitzdGF0aWMgYm9v bGVhbl90CitwbWFwX3B2X2luc2VydF9wZGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2 bV9wYWRkcl90IHBhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlzdHJ1Y3QgbWRf cGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisKKwlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9j aywgUkFfTE9DS0VEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwkvKiBQ YXNzIE5VTEwgaW5zdGVhZCBvZiB0aGUgbG9jayBwb2ludGVyIHRvIGRpc2FibGUgcmVjbGFtYXRp b24uICovCisJaWYgKChwdiA9IGdldF9wdl9lbnRyeShwbWFwLCBOVUxMKSkgIT0gTlVMTCkgewor CQlwdi0+cHZfdmEgPSB2YTsKKwkJQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBw YSk7CisJCXB2aCA9IHBhX3RvX3B2aChwYSk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZwdmgtPnB2 X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJcHZoLT5wdl9nZW4rKzsKKwkJcmV0dXJuIChUUlVFKTsK Kwl9IGVsc2UKKwkJcmV0dXJuIChGQUxTRSk7Cit9CisKKworLyoKKyAqIEZpbGxzIGEgcGFnZSB0 YWJsZSBwYWdlIHdpdGggbWFwcGluZ3MgdG8gY29uc2VjdXRpdmUgcGh5c2ljYWwgcGFnZXMuCisg Ki8KK3N0YXRpYyB2b2lkCitwbWFwX2ZpbGxfcHRwKHB0X2VudHJ5X3QgKmZpcnN0cHRlLCBwdF9l bnRyeV90IG5ld3B0ZSkKK3sKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlmb3IgKHB0ZSA9IGZpcnN0 cHRlOyBwdGUgPCBmaXJzdHB0ZSArIE5QVEVQRzsgcHRlKyspIHsKKwkJKnB0ZSA9IG5ld3B0ZTsK KwkJbmV3cHRlICs9IChQQUdFX1NJWkUgPj4gVExCTE9fUEZOX1NISUZUKTsKKwl9Cit9CisKKy8q CisgKiBUcmllcyB0byBkZW1vdGUgYSAyTUIgcGFnZSBtYXBwaW5nLiAgSWYgZGVtb3Rpb24gZmFp bHMsIHRoZSAyTUIgcGFnZQorICogbWFwcGluZyBpcyBpbnZhbGlkYXRlZC4KKyAqLworc3RhdGlj IGJvb2xlYW5fdAorcG1hcF9kZW1vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUs IHZtX29mZnNldF90IHZhKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJYm9vbGVhbl90IHJ2 OworCisJbG9jayA9IE5VTEw7CisJcnYgPSBwbWFwX2RlbW90ZV9wZGVfbG9ja2VkKHBtYXAsIHBk ZSwgdmEsICZsb2NrKTsKKwlpZiAobG9jayAhPSBOVUxMKQorCQlyd193dW5sb2NrKGxvY2spOwor CXJldHVybiAocnYpOworfQorCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX2RlbW90ZV9wZGVfbG9j a2VkKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhLAorICAgIHN0 cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwkgcGRfZW50cnlfdCBuZXdwZGUsIG9sZHBkZTsKKwkg cHRfZW50cnlfdCBvbGRwdGUsICpmaXJzdHB0ZSwgbmV3cHRlOworCSB2bV9wYWRkcl90IG1wdGVw YTsKKwkgdm1fcGFnZV90IG1wdGU7CisJIHN0cnVjdCBzcGdsaXN0IGZyZWU7CisKKwkgUE1BUF9M T0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJIG9sZHBkZSA9ICpwZGU7CisJIG9sZHB0ZSA9 IChwdF9lbnRyeV90KW9sZHBkZTsKKwkgS0FTU0VSVChwdGVfaXNfMW1fc3VwZXJwYWdlKCZvbGRw dGUpICYmIHB0ZV9pc192YWxpZCgmb2xkcHRlKSwKKwkgICAgICgiJXM6IG9sZHBkZSBpcyBub3Qg c3VwZXJwYWdlIGFuZC9vciB2YWxpZC4iLCBfX2Z1bmNfXykpOworCSBpZiAocHRlX2lzX3JlZigm b2xkcHRlKSAmJiAobXB0ZSA9IHBtYXBfbG9va3VwX3B0X3BhZ2UocG1hcCwgdmEpKSAhPQorCSAg ICAgTlVMTCkKKwkJIHBtYXBfcmVtb3ZlX3B0X3BhZ2UocG1hcCwgbXB0ZSk7CisJIGVsc2Ugewor CQkgS0FTU0VSVCghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpLAorCQkgICAgICgiJXM6IHBhZ2Ug dGFibGUgcGFnZSBmb3IgYSB3aXJlZCBtYXBwaW5nIGlzIG1pc3NpbmciLAorCQkgICAgIF9fZnVu Y19fKSk7CisJCSAvKgorCQkgICogSW52YWxpZGF0ZSB0aGUgMk1CIHBhZ2UgbWFwcGluZyBhbmQg cmV0dXJuICJmYWlsdXJlIiBpZiB0aGUKKwkJICAqIG1hcHBpbmcgd2FzIG5ldmVyIGFjY2Vzc2Vk IG9yIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBuZXcKKwkJICAqIHBhZ2UgdGFibGUgcGFnZSBmYWls cy4gIElmIHRoZSAyTUIgcGFnZSBtYXBwaW5nIGJlbG9uZ3MgdG8KKwkJICAqIHRoZSBkaXJlY3Qg bWFwIHJlZ2lvbiBvZiB0aGUga2VybmVsJ3MgYWRkcmVzcyBzcGFjZSwgdGhlbgorCQkgICogdGhl IHBhZ2UgYWxsb2NhdGlvbiByZXF1ZXN0IHNwZWNpZmllcyB0aGUgaGlnaGVzdCBwb3NzaWJsZQor CQkgICogcHJpb3JpdHkgKFZNX0FMTE9DX0lOVEVSUlVQVCkuICBPdGhlcndpc2UsIHRoZSBwcmlv cml0eSBpcworCQkgICogbm9ybWFsLiAgUGFnZSB0YWJsZSBwYWdlcyBhcmUgcHJlYWxsb2NhdGVk IGZvciBldmVyeSBvdGhlcgorCQkgICogcGFydCBvZiB0aGUga2VybmVsIGFkZHJlc3Mgc3BhY2Us IHNvIHRoZSBkaXJlY3QgbWFwIHJlZ2lvbgorCQkgICogaXMgdGhlIG9ubHkgcGFydCBvZiB0aGUg a2VybmVsIGFkZHJlc3Mgc3BhY2UgdGhhdCBtdXN0IGJlCisJCSAgKiBoYW5kbGVkIGhlcmUuCisJ CSAgKi8KKwkJIGlmICghcHRlX2lzX3JlZigmb2xkcHRlKSB8fCAobXB0ZSA9IHZtX3BhZ2VfYWxs b2MoTlVMTCwKKwkJICAgICBwbWFwX3BkZV9waW5kZXgodmEpLCAodmEgPj0gVk1fTUlOX0tFUk5F TF9BRERSRVNTICYmIHZhIDwKKwkJICAgICBWTV9NQVhfQUREUkVTUyA/IFZNX0FMTE9DX0lOVEVS UlVQVCA6IFZNX0FMTE9DX05PUk1BTCkgfAorCQkgICAgIFZNX0FMTE9DX05PT0JKIHwgVk1fQUxM T0NfV0lSRUQpKSA9PSBOVUxMKSB7CisJCQkgU0xJU1RfSU5JVCgmZnJlZSk7CisJCQkgcG1hcF9y ZW1vdmVfcGRlKHBtYXAsIHBkZSwgdHJ1bmNfMm1wYWdlKHZhKSwgJmZyZWUsCisJCQkgICAgIGxv Y2twKTsKKwkJCSBwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwKKwkJCSAgICAgKHZtX29mZnNl dF90KSh2YSAmIH5QRFJNQVNLKSwKKwkJCSAgICAgKHZtX29mZnNldF90KSh2YSAmIH5QRFJNQVNL KSArIE5CUERSKTsKKwkJCSBwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkgQ1RSMyhL VFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLAorCQkJICAgICBf X2Z1bmNfXywgdmEsIHBtYXApOworCQkJIHJldHVybiAoRkFMU0UpOworCQkgfQorCQkgaWYgKHZh IDwgVk1fTUFYVVNFUl9BRERSRVNTKQorCQkJIHBtYXBfcmVzaWRlbnRfY291bnRfaW5jKHBtYXAs IDEpOworCSB9CisJIG1wdGVwYSA9IFZNX1BBR0VfVE9fUEhZUyhtcHRlKTsKKwkgbmV3cGRlID0g KHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0RJUkVDVChtcHRlcGEpOworCSBmaXJzdHB0ZSA9IG5l d3BkZTsKKwkgS0FTU0VSVChwdGVfaXNfcmVmKCZvbGRwdGUpLAorCSAgICAgKCIlczogb2xkcHRl IGlzIG5vdCByZWZlcmVuY2VkIiwgX19mdW5jX18pKTsKKwkgS0FTU0VSVCghcHRlX3Rlc3QoJm9s ZHB0ZSwgUFRFX1JPKSAmJiBwdGVfdGVzdCgmb2xkcHRlLCBQVEVfRCksCisJICAgICAoIiVzOiBv bGRwdGUgaXMgbWlzc2luZyBQVEVfRCIsIF9fZnVuY19fKSk7CisJIG5ld3B0ZSA9IG9sZHB0ZSAm IH5QVEVfUFNfSURYX01BU0s7CisKKwkgLyoKKwkgICogSWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBp cyBuZXcsIGluaXRpYWxpemUgaXQuCisJICAqLworCSBpZiAobXB0ZS0+d2lyZV9jb3VudCA9PSAx KSB7CisJCSBtcHRlLT53aXJlX2NvdW50ID0gTlBURVBHOworCQkgcG1hcF9maWxsX3B0cChmaXJz dHB0ZSwgbmV3cHRlKTsKKwkgfQorCSBLQVNTRVJUKFRMQkxPX1BURV9UT19QQSgqZmlyc3RwdGUp ID09IFRMQkxPX1BURV9UT19QQShuZXdwdGUpLAorCSAgICAgKCIlczogZmlyc3RwdGUgYW5kIG5l d3B0ZSBtYXAgZGlmZmVyZW50IHBoeXNpY2FsIGFkZHJlc3NlcyIsCisJICAgICBfX2Z1bmNfXykp OworCisJIC8qCisJICAqIElmIHRoZSBtYXBwaW5nIGhhcyBjaGFuZ2VkIGF0dHJpYnV0ZXMsIHVw ZGF0ZSB0aGUgcGFnZSB0YWJsZQorCSAgKiBlbnRyaWVzLgorCSAgKi8KKwkgaWYgKCgqZmlyc3Rw dGUgJiBQR19QUk9NT1RFX01BU0spICE9IChuZXdwdGUgJiBQR19QUk9NT1RFX01BU0spKQorCQkg cG1hcF9maWxsX3B0cChmaXJzdHB0ZSwgbmV3cHRlKTsKKworCisJIC8qCisJICAqIFRoZSBzcGFy ZSBQViBlbnRyaWVzIG11c3QgYmUgcmVzZXJ2ZWQgcHJpb3IgdG8gZGVtb3RpbmcgdGhlCisJICAq IG1hcHBpbmcsIHRoYXQgaXMsIHByaW9yIHRvIGNoYW5naW5nIHRoZSBQREUuICBPdGhlcndpc2Us IHRoZSBzdGF0ZQorCSAgKiBvZiB0aGUgUERFIGFuZCB0aGUgUFYgbGlzdHMgd2lsbCBiZSBpbmNv bnNpc3RlbnQsIHdoaWNoIGNhbiByZXN1bHQKKwkgICogaW4gcmVjbGFpbV9wdl9jaHVuaygpIGF0 dGVtcHRpbmcgdG8gcmVtb3ZlIGEgUFYgZW50cnkgZnJvbSB0aGUKKwkgICogd3JvbmcgUFYgbGlz dCBhbmQgcG1hcF9wdl9kZW1vdGVfcGRlKCkgZmFpbGluZyB0byBmaW5kIHRoZSBleHBlY3RlZAor CSAgKiBQViBlbnRyeSBmb3IgdGhlIDJNQiBwYWdlIG1hcHBpbmcgdGhhdCBpcyBiZWluZyBkZW1v dGVkLgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VEKSkKKwkJIHJl c2VydmVfcHZfZW50cmllcyhwbWFwLCBOUFRFUEcgLSAxLCBsb2NrcCk7CisKKwkgLyoKKwkgICog RGVtb3RlIHRoZSBtYXBwaW5nLiAgVGhpcyBwbWFwIGlzIGxvY2tlZC4gIFRoZSBvbGQgUERFIGhh cworCSAgKiBQVEVfUkVGIHNldC4gIElmIHRoZSBvbGQgUERFIGhhcyBQVEVfUk8gY2xlYXIsIGl0 IGFsc28gaGFzCisJICAqIFBURV9EIHNldC4gIFRodXMsIHRoZXJlIGlzIG5vIGRhbmdlciBvZiBh IHJhY2Ugd2l0aCBhbm90aGVyCisJICAqIHByb2Nlc3NvciBjaGFuZ2luZyB0aGUgc2V0dGluZyBv ZiBQVEVfUkVGIGFuZC9vciBQVEVfRCBiZXR3ZWVuCisJICAqIHRoZSByZWFkIGFib3ZlIGFuZCB0 aGUgc3RvcmUgYmVsb3cuCisJICAqLworCSBwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEsIHBkZSwg KHB0X2VudHJ5X3QpbmV3cGRlKTsKKworCSAvKgorCSAgKiBJbnZhbGlkYXRlIGEgc3RhbGUgcmVj dXJzaXZlIG1hcHBpbmcgb2YgdGhlIHBhZ2UgdGFibGUgcGFnZS4KKwkgICovCisJIGlmICh2YSA+ PSBWTV9NQVhVU0VSX0FERFJFU1MpCisJCSBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCAodm1f b2Zmc2V0X3QpcG1hcF9wdGUocG1hcCwgdmEpKTsKKworCSAvKgorCSAgKiBEZW1vdGUgdGhlIFBW IGVudHJ5LgorCSAgKi8KKwkgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9NQU5BR0VEKSkgewor CQkgcG1hcF9wdl9kZW1vdGVfcGRlKHBtYXAsIHZhLCBUTEJMT19QREVfVE9fUEEob2xkcGRlKSwg bG9ja3ApOworCSB9CisJIGF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfZGVtb3Rpb25zLCAxKTsK KwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLCBf X2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKworCSByZXR1cm4gKFRSVUUpOworfQorCisvKgor ICogcG1hcF9yZW1vdmVfa2VybmVsX3BkZTogUmVtb3ZlIGEga2VybmVsIHN1cGVycGFnZSBtYXBw aW5nLgorICovCitzdGF0aWMgdm9pZAorcG1hcF9yZW1vdmVfa2VybmVsX3BkZShwbWFwX3QgcG1h cCwgcGRfZW50cnlfdCAqcGRlLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwkvKiBYWFggTm90IGRvaW5n IGtlcm5lbCBzdXBlcnBhZ2VzIHlldC4gKi8KKwlwYW5pYygicG1hcF9yZW1vdmVfa2VybmVsX3Bk ZToga2VybmVsIHN1cGVycGFnZSIpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcGRlOiBkbyB0 aGUgdGhpbmdzIHRvIHVubWFwIGEgc3VwZXJwYWdlIGluIGEgcHJvY2VzcworICovCitzdGF0aWMg aW50CitwbWFwX3JlbW92ZV9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBkcSwgdm1fb2Zm c2V0X3Qgc3ZhLAorICAgIHN0cnVjdCBzcGdsaXN0ICpmcmVlLCBzdHJ1Y3Qgcndsb2NrICoqbG9j a3ApCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwZF9lbnRyeV90IG9sZHBkZTsKKwl2bV9v ZmZzZXRfdCBldmEsIHZhOworCXZtX3BhZ2VfdCBtLCBtcHRlOworCisJLyoKKwkgKiBXcml0ZSBi YWNrIGFsbCBjYWNoZSBsaW5lcyBmcm9tIHRoZSBzdXBlcnBhZ2UgYmVpbmcgdW5tYXBwZWQuCisJ ICovCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgoKHN2YSAmIH5QRFJNQVNLKSwgTkJQ RFIpOworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJS0FTU0VSVCgoc3Zh ICYgUERSTUFTSykgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9wZGU6IHN2YSBpcyBub3QgMm1w YWdlIGFsaWduZWQiKSk7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpCisJCW9sZHBkZSA9 IHBkZV9sb2FkX3N0b3JlKHBkcSwgUFRFX0cpOworCWVsc2UKKwkJb2xkcGRlID0gcGRlX2xvYWRf c3RvcmUocGRxLCAwKTsKKwlpZiAocGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1cpKQorCQlwbWFwLT5w bV9zdGF0cy53aXJlZF9jb3VudCAtPSBOQlBEUiAvIFBBR0VfU0laRTsKKworCWlmIChwZGVfdGVz dCgmb2xkcGRlLCBQVEVfRykpCisJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKGtlcm5lbF9wbWFwLCBz dmEpOworCisJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgTkJQRFIgLyBQQUdFX1NJWkUp OworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfTUFOQUdFRCkpIHsKKwkgICAgQ0hBTkdFX1BW X0xJU1RfTE9DS19UT19QSFlTKGxvY2twLCBUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7CisJICAg IHB2aCA9IHBhX3RvX3B2aChUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7CisJICAgIHBtYXBfcHZo X2ZyZWUocHZoLCBwbWFwLCBzdmEpOworCSAgICBldmEgPSBzdmEgKyBOQlBEUjsKKwkgICAgZm9y ICh2YSA9IHN2YSwgbSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QREVfVE9fUEEob2xkcGRlKSk7 CisJCXZhIDwgZXZhOyB2YSArPSBQQUdFX1NJWkUsIG0rKykgeworCQkgICAgaWYgKHBkZV90ZXN0 KCZvbGRwZGUsIFBURV9EKSAmJiAhcGRlX3Rlc3QoJm9sZHBkZSwgUFRFX1JPKSkKKwkJCSAgICB2 bV9wYWdlX2RpcnR5KG0pOworCQkgICAgaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9SRUYpKQor CQkJdm1fcGFnZV9hZmxhZ19zZXQobSwgUEdBX1JFRkVSRU5DRUQpOworCQkgICAgaWYgKFRBSUxR X0VNUFRZKCZtLT5tZC5wdl9saXN0KSAmJgorCQkJVEFJTFFfRU1QVFkoJnB2aC0+cHZfbGlzdCkp CisJCQkgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihtLCBQR0FfV1JJVEVBQkxFKTsKKwkgICAgfQor CX0KKwlpZiAocG1hcCA9PSBrZXJuZWxfcG1hcCkgeworCQlwbWFwX3JlbW92ZV9rZXJuZWxfcGRl KHBtYXAsIHBkcSwgc3ZhKTsKKwl9IGVsc2UgeworCQltcHRlID0gcG1hcF9sb29rdXBfcHRfcGFn ZShwbWFwLCBzdmEpOworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQlwbWFwX3JlbW92ZV9wdF9w YWdlKHBtYXAsIG1wdGUpOworCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7CisJ CQlLQVNTRVJUKG1wdGUtPndpcmVfY291bnQgPT0gTlBURVBHLAorCQkJICAgICgicG1hcF9yZW1v dmVfcGRlOiBwdGUgcGFnZSB3aXJlIGNvdW50IGVycm9yIikpOworCQkJbXB0ZS0+d2lyZV9jb3Vu dCA9IDA7CisJCQlwbWFwX2FkZF9kZWxheWVkX2ZyZWVfbGlzdChtcHRlLCBmcmVlLCBGQUxTRSk7 CisJCQlhdG9taWNfc3VidHJhY3RfaW50KCZ2bV9jbnQudl93aXJlX2NvdW50LCAxKTsKKwkJfQor CX0KKwlyZXR1cm4gKHBtYXBfdW51c2VfcHQocG1hcCwgc3ZhLCAqcG1hcF9zZWdtYXAocG1hcCwg c3ZhKSwgZnJlZSkpOworfQorCisvKgorICogcG1hcF9yZW1vdmVfcHRlOiBkbyB0aGUgdGhpbmdz IHRvIHVubWFwIGEgcGFnZSBpbiBhIHByb2Nlc3MKKyAqLworc3RhdGljIGludAorcG1hcF9yZW1v dmVfcHRlKHN0cnVjdCBwbWFwICpwbWFwLCBwdF9lbnRyeV90ICpwdHEsIHZtX29mZnNldF90IHZh LAorICAgIHBkX2VudHJ5X3QgcHRlcGRlLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSwgc3RydWN0IHJ3 bG9jayAqKmxvY2twKQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJcHRfZW50cnlfdCBvbGRw dGU7CisJdm1fcGFnZV90IG07CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsK KworCS8qCisJICogV3JpdGUgYmFjayBhbGwgY2FjaGUgbGluZXMgZnJvbSB0aGUgcGFnZSBiZWlu ZyB1bm1hcHBlZC4KKwkgKi8KKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleCh2YSwgUEFH RV9TSVpFKTsKKworCW9sZHB0ZSA9ICpwdHE7CisJaWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKQor CQkqcHRxID0gUFRFX0c7CisJZWxzZQorCQkqcHRxID0gMDsKKworCWlmIChwdGVfdGVzdCgmb2xk cHRlLCBQVEVfVykpCisJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50IC09IDE7CisKKwlwbWFw X3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKwlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRF X01BTkFHRUQpKSB7CisJCW0gPSBQSFlTX1RPX1ZNX1BBR0UoVExCTE9fUFRFX1RPX1BBKG9sZHB0 ZSkpOworCQlpZiAocHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJUKCFwdGVf dGVzdCgmb2xkcHRlLCBQVEVfUk8pLAorCQkJICAgKCIlczogbW9kaWZpZWQgcGFnZSBub3Qgd3Jp dGFibGU6IHZhOiAlcCwgcHRlOiAlI2p4IiwKKwkJCSAgICBfX2Z1bmNfXywgKHZvaWQgKil2YSwg KHVpbnRtYXhfdClvbGRwdGUpKTsKKwkJCXZtX3BhZ2VfZGlydHkobSk7CisJCX0KKwkJaWYgKHB0 ZV9pc19yZWYoJm9sZHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJFTkNF RCk7CisJCUNIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fVk1fUEFHRShsb2NrcCwgbSk7CisJCXBtYXBf cHZoX2ZyZWUoJm0tPm1kLCBwbWFwLCB2YSk7CisJCWlmIChUQUlMUV9FTVBUWSgmbS0+bWQucHZf bGlzdCkgJiYKKwkJICAgIChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpID09IDApIHsKKwkJCXB2 aCA9IHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQkJaWYgKFRBSUxRX0VNUFRZKCZw dmgtPnB2X2xpc3QpKQorCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJMRSk7 CisJCX0KKwl9CisJcmV0dXJuIChwbWFwX3VudXNlX3B0KHBtYXAsIHZhLCBwdGVwZGUsIGZyZWUp KTsKK30KKworLyoKKyAqIFJlbW92ZSBhIHNpbmdsZSBwYWdlIGZyb20gYSBwcm9jZXNzIGFkZHJl c3Mgc3BhY2UKKyAqLworc3RhdGljIHZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2Uoc3RydWN0IHBtYXAg KnBtYXAsIHZtX29mZnNldF90IHZhLCBzdHJ1Y3Qgc3BnbGlzdCAqZnJlZSkKK3sKKwlzdHJ1Y3Qg cndsb2NrICpsb2NrOworCXBkX2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlQ TUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlwZGUgPSBwbWFwX3BkZShwbWFwLCB2 YSk7CisJaWYgKHBkZSA9PSBOVUxMIHx8ICpwZGUgPT0gMCkKKwkJcmV0dXJuOworCXB0ZSA9IHBt YXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworCS8qCisJICogSWYgdGhlcmUgaXMgbm8gcHRlIGZv ciB0aGlzIGFkZHJlc3MsIGp1c3Qgc2tpcCBpdCEKKwkgKi8KKwlpZiAoIXB0ZV9pc192YWxpZChw dGUpKQorCQlyZXR1cm47CisKKwlsb2NrID0gTlVMTDsKKwkodm9pZClwbWFwX3JlbW92ZV9wdGUo cG1hcCwgcHRlLCB2YSwgKnBkZSwgZnJlZSwgJmxvY2spOworCWlmIChsb2NrICE9IE5VTEwpCisJ CXJ3X3d1bmxvY2sobG9jayk7CisJcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcCwgdmEpOworfQor CisvKgorICoJUmVtb3ZlIHRoZSBnaXZlbiByYW5nZSBvZiBhZGRyZXNzZXMgZnJvbSB0aGUgc3Bl Y2lmaWVkIG1hcC4KKyAqCisgKglJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHN0YXJ0IGFuZCBlbmQg YXJlIHByb3Blcmx5CisgKglyb3VuZGVkIHRvIHRoZSBwYWdlIHNpemUuCisgKi8KK3ZvaWQKK3Bt YXBfcmVtb3ZlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90IGV2YSkK K3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNldF90IHZhLCB2YV9uZXh0OworCXBk X2VudHJ5X3QgcHRwYWRkciwgKnBkZSwgKnBkcGU7CisJcHRfZW50cnlfdCAqcHRlOworCXN0cnVj dCBzcGdsaXN0IGZyZWU7CisJaW50IGFueXZhbGlkOworCisJLyoKKwkgKiBQZXJmb3JtIGFuIHVu c3luY2hyb25pemVkIHJlYWQuICBUaGlzIGlzLCBob3dldmVyLCBzYWZlLgorCSAqLworCWlmIChw bWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwlhbnl2YWxp ZCA9IDA7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2Nr KTsKKwlQTUFQX0xPQ0socG1hcCk7CisKKwkvKgorCSAqIHNwZWNpYWwgaGFuZGxpbmcgb2YgcmVt b3Zpbmcgb25lIHBhZ2UuICBhIHZlcnkgY29tbW9uIG9wZXJhdGlvbgorCSAqIGFuZCBlYXN5IHRv IHNob3J0IGNpcmN1aXQgc29tZSBjb2RlLgorCSAqLworCWlmICgoc3ZhICsgUEFHRV9TSVpFKSA9 PSBldmEpIHsKKwkJcGRlID0gcG1hcF9wZGUocG1hcCwgc3ZhKTsKKwkJaWYgKCFwZGVfaXNfMW1f c3VwZXJwYWdlKHBkZSkpIHsKKwkJCXBtYXBfcmVtb3ZlX3BhZ2UocG1hcCwgc3ZhLCAmZnJlZSk7 CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWxvY2sgPSBOVUxMOworCWZvciAoOyBzdmEgPCBl dmE7IHN2YSA9IHZhX25leHQpIHsKKwkJaWYgKHBtYXAtPnBtX3N0YXRzLnJlc2lkZW50X2NvdW50 ID09IDApCisJCQlicmVhazsKKworCQlwZHBlID0gcG1hcF9zZWdtYXAocG1hcCwgc3ZhKTsKKwkJ aWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3ZhICsgTkJTRUcpICYgflNFR01BU0s7 CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCQl2YV9uZXh0ID0gZXZhOworCQkJY29udGludWU7 CisJCX0KKwkJLyoKKwkJICogQ2FsY3VsYXRlIGluZGV4IGZvciBuZXh0IHBhZ2UgdGFibGUuCisJ CSAqLworCQl2YV9uZXh0ID0gKHN2YSArIE5CUERSKSAmIH5QRFJNQVNLOworCQlpZiAodmFfbmV4 dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7CisKKwkJcGRlID0gcG1hcF9wZHBlX3RvX3BkZShw ZHBlLCBzdmEpOworCQlwdHBhZGRyID0gKnBkZTsKKworCQkvKgorCQkgKiBXZWVkIG91dCBpbnZh bGlkIG1hcHBpbmdzLgorCQkgKi8KKwkJaWYgKHB0cGFkZHIgPT0gTlVMTCkKKwkJCWNvbnRpbnVl OworCQkvKgorCQkgKiBDaGVjayBmb3Igc3VwZXJwYWdlLgorCQkgKi8KKwkJaWYgKHBkZV9pc18x bV9zdXBlcnBhZ2UoJnB0cGFkZHIpKSB7CisJCQkvKgorCQkJICogQXJlIHdlIHJlbW92aW5nIHRo ZSBlbnRpcmUgc3VwZXJwYWdlPyAgSWYgbm90LAorCQkJICogZGVtb3RlIHRoZSBtYXBwaW5nIGFu ZCBmYWxsIHRocm91Z2guCisJCQkgKi8KKwkJCWlmIChzdmEgKyBOQlBEUiA9PSB2YV9uZXh0ICYm IGV2YSA+PSB2YV9uZXh0KSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgVExCIGVudHJ5IGZvciBhIFBU RV9HIG1hcHBpbmcgaXMKKwkJCQkgKiBpbnZhbGlkYXRlZCBieSBwbWFwX3JlbW92ZV9wZGUoKS4K KwkJCQkgKi8KKwkJCQlpZiAoIXBkZV90ZXN0KCZwdHBhZGRyLCBQVEVfRykpCisJCQkJCWFueXZh bGlkID0gVFJVRTsKKwkJCQlwbWFwX3JlbW92ZV9wZGUocG1hcCwgcGRlLCBzdmEsICZmcmVlLCAm bG9jayk7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKCFwbWFwX2RlbW90ZV9wZGVfbG9j a2VkKHBtYXAsIHBkZSwgc3ZhLAorCQkJICAgICZsb2NrKSkgeworCQkJCS8qIFRoZSBzdXBlcnBh Z2UgbWFwcGluZyB3YXMgZGVzdHJveWVkLiAqLworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsK KwkJCQlwdHBhZGRyID0gKnBkZTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIExpbWl0IG91ciBz Y2FuIHRvIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB2YSByZXByZXNlbnRlZAorCQkgKiBieSB0aGUg Y3VycmVudCBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRvIHRoZSBlbmQgb2YgdGhlCisJCSAqIHJhbmdl IGJlaW5nIHJlbW92ZWQuCisJCSAqLworCQlpZiAodmFfbmV4dCA+IGV2YSkKKwkJCXZhX25leHQg PSBldmE7CisKKwkJdmEgPSB2YV9uZXh0OworCQlmb3IgKHB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShw ZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKKwkJICAgIHN2YSArPSBQQUdFX1NJWkUp IHsKKwkJCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkpIHsKKwkJCQlpZiAodmEgIT0gdmFfbmV4dCkg eworCQkJCQlwbWFwX2ludmFsaWRhdGVfcmFuZ2UocG1hcCwgdmEsIHN2YSk7CisJCQkJCXZhID0g dmFfbmV4dDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXB0ZV90ZXN0KHB0 ZSwgUFRFX0cpKQorCQkJCWFueXZhbGlkID0gVFJVRTsKKwkJCWlmICh2YSA9PSB2YV9uZXh0KQor CQkJCXZhID0gc3ZhOworCQkJaWYgKHBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdGUsIHN2YSwgcHRw YWRkciwgJmZyZWUsCisJCQkgICAgJmxvY2spKSB7CisJCQkJc3ZhICs9IFBBR0VfU0laRTsKKwkJ CQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4dCkKKwkJCXBtYXBfaW52YWxp ZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndf d3VubG9jayhsb2NrKTsKK291dDoKKwlpZiAoYW55dmFsaWQpCisJCXBtYXBfaW52YWxpZGF0ZV9h bGwocG1hcCk7CisJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlQTUFQX1VOTE9DSyhw bWFwKTsKKwlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKglSb3V0aW5l OglwbWFwX3JlbW92ZV9hbGwKKyAqCUZ1bmN0aW9uOgorICoJCVJlbW92ZXMgdGhpcyBwaHlzaWNh bCBwYWdlIGZyb20KKyAqCQlhbGwgcGh5c2ljYWwgbWFwcyBpbiB3aGljaCBpdCByZXNpZGVzLgor ICoJCVJlZmxlY3RzIGJhY2sgbW9kaWZ5IGJpdHMgdG8gdGhlIHBhZ2VyLgorICoKKyAqCU5vdGVz OgorICoJCU9yaWdpbmFsIHZlcnNpb25zIG9mIHRoaXMgcm91dGluZSB3ZXJlIHZlcnkKKyAqCQlp bmVmZmljaWVudCBiZWNhdXNlIHRoZXkgaXRlcmF0aXZlbHkgY2FsbGVkCisgKgkJcG1hcF9yZW1v dmUgKHNsb3cuLi4pCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX2FsbCh2bV9wYWdlX3QgbSkKK3sK KwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXB2X2VudHJ5X3QgcHY7CisJcG1hcF90IHBtYXA7CisJ cHRfZW50cnlfdCAqcHRlLCB0cHRlOworCXBkX2VudHJ5X3QgKnBkZTsKKwl2bV9vZmZzZXRfdCB2 YTsKKwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VO TUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFwX3JlbW92ZV9hbGw6IHBhZ2UgJXAgaXMgbm90IG1h bmFnZWQiLCBtKSk7CisJU0xJU1RfSU5JVCgmZnJlZSk7CisJcndfd2xvY2soJnB2aF9nbG9iYWxf bG9jayk7CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDApCisJCWdvdG8gc21h bGxfbWFwcGluZ3M7CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9fUEhZUyhtKSk7CisJd2hp bGUgKChwdiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2X2xpc3QpKSAhPSBOVUxMKSB7CisJCXBtYXAg PSBQVl9QTUFQKHB2KTsKKwkJUE1BUF9MT0NLKHBtYXApOworCQl2YSA9IHB2LT5wdl92YTsKKwkJ cGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCQkodm9pZClwbWFwX2RlbW90ZV9wZGUocG1hcCwg cGRlLCB2YSk7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KK3NtYWxsX21hcHBpbmdzOgorCXdo aWxlICgocHYgPSBUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCkpICE9IE5VTEwpIHsKKwkJcG1h cCA9IFBWX1BNQVAocHYpOworCQlQTUFQX0xPQ0socG1hcCk7CisKKwkJLyoKKwkJICogSWYgaXQn cyBsYXN0IG1hcHBpbmcgd3JpdGViYWNrIGFsbCBjYWNoZXMgZnJvbQorCQkgKiB0aGUgcGFnZSBi ZWluZyBkZXN0cm95ZWQKKwkJICovCisJCWlmIChUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSA9PSBO VUxMKQorCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQQUdFX1NJ WkUpOworCisJCXBtYXBfcmVzaWRlbnRfY291bnRfZGVjKHBtYXAsIDEpOworCQlwZGUgPSBwbWFw X3BkZShwbWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKHBkZSAhPSBOVUxMICYmICpwZGUgIT0g MCwgKCJwbWFwX3JlbW92ZV9hbGw6IHBkZSIpKTsKKwkJS0FTU0VSVCghcGRlX2lzX3N1cGVycGFn ZShwZGUpLCAoInBtYXBfcmVtb3ZlX2FsbDogZm91bmQiCisJCSAgICAiIGEgc3VwZXJwYWdlIGlu IHBhZ2UgJXAgJ3MgcHYgbGlzdCIsIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwg cHYtPnB2X3ZhKTsKKworCQl0cHRlID0gKnB0ZTsKKwkJcHRlX3N0b3JlKHB0ZSwgaXNfa2VybmVs X3BtYXAocG1hcCkgPyBQVEVfRyA6IDApOworCisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX1cp KQorCQkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQtLTsKKworCQkvKgorCQkgKiBVcGRhdGUg dGhlIHZtX3BhZ2VfdCBkaXJ0eSBhbmQgcmVmZXJlbmNlIGJpdHMuCisJCSAqLworCQlpZiAocHRl X2lzX3JlZigmdHB0ZSkpCisJCQl2bV9wYWdlX2FmbGFnX3NldChtLCBQR0FfUkVGRVJFTkNFRCk7 CisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX0QpKSB7CisJCQlLQVNTRVJUKCFwdGVfdGVzdCgm dHB0ZSwgUFRFX1JPKSwKKwkJCSAgICAoIiVzOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTog dmE6ICVwLCBwdGU6ICUjangiCisJCQkgICAgLCBfX2Z1bmNfXywgKHZvaWQgKilwdi0+cHZfdmEs ICh1aW50bWF4X3QpdHB0ZSkpOworCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJfQorCQlwbWFwX3Vu dXNlX3B0KHBtYXAsIHB2LT5wdl92YSwgKnBkZSwgJmZyZWUpOworCQlwbWFwX2ludmFsaWRhdGVf cGFnZShwbWFwLCBwdi0+cHZfdmEpOworCisJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwg cHYsIHB2X25leHQpOworCQltLT5tZC5wdl9nZW4rKzsKKwkJZnJlZV9wdl9lbnRyeShwbWFwLCBw dik7CisJCVBNQVBfVU5MT0NLKHBtYXApOworCX0KKworCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwg UEdBX1dSSVRFQUJMRSk7CisJcndfd3VubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlwbWFwX2Zy ZWVfemVyb19wYWdlcygmZnJlZSk7Cit9CisKKy8qCisgKiBwbWFwX3Byb3RlY3RfcGRlOiBkbyB0 aGUgdGhpbmdzIHRvIHByb3RlY3QgYSBzdXBlcnBhZ2UgaW4gYSBwcm9jZXNzCisgKi8KK3N0YXRp YyBib29sZWFuX3QKK3BtYXBfcHJvdGVjdF9wZGUocG1hcF90IHBtYXAsIHBkX2VudHJ5X3QgKnBk ZSwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwlwZF9lbnRyeV90IG5ld3Bk ZSwgb2xkcGRlOworCXZtX29mZnNldF90IGV2YSwgdmE7CisJdm1fcGFnZV90IG07CisJYm9vbGVh bl90IGFueWNoYW5nZWQ7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsKKwlL QVNTRVJUKChzdmEgJiBQRFJNQVNLKSA9PSAwLAorCSAgICAoIiVzOiBzdmEgaXMgbm90IDJtcGFn ZSBhbGlnbmVkIiwgX19mdW5jX18pKTsKKwlhbnljaGFuZ2VkID0gRkFMU0U7CityZXRyeToKKwlv bGRwZGUgPSBuZXdwZGUgPSAqcGRlOworCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfTUFOQUdF RCkpIHsKKwkJZXZhID0gc3ZhICsgTkJQRFI7CisJCWZvciAodmEgPSBzdmEsIG0gPSBQSFlTX1RP X1ZNX1BBR0UoVExCTE9fUERFX1RPX1BBKG9sZHBkZSkpOworCQkgICAgdmEgPCBldmE7IHZhICs9 IFBBR0VfU0laRSwgbSsrKQorCQkJaWYgKHBkZV90ZXN0KCZvbGRwZGUsIFBURV9EKSAmJgorCQkJ ICAgICFwZGVfdGVzdCgmb2xkcGRlLCBQVEVfUk8pKQorCQkJCXZtX3BhZ2VfZGlydHkobSk7CisJ fQorCWlmICgocHJvdCAmIFZNX1BST1RfV1JJVEUpID09IDApIHsKKwkJcGRlX3NldCgmbmV3cGRl LCBQVEVfUk8pOworCQlwZGVfY2xlYXIoJm5ld3BkZSwgUFRFX0QpOworCX0KKwlpZiAobmV3cGRl ICE9IG9sZHBkZSkgeworCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZygocHRfZW50cnlfdCAqKXBk ZSwgKHB0X2VudHJ5X3Qpb2xkcGRlLAorCQkgICAgKHB0X2VudHJ5X3QpbmV3cGRlKSkKKwkJCWdv dG8gcmV0cnk7CisJCWlmIChwZGVfdGVzdCgmb2xkcGRlLCBQVEVfRykpCisJCQlwbWFwX2ludmFs aWRhdGVfcGFnZShwbWFwLCBzdmEpOworCQllbHNlCisJCQlhbnljaGFuZ2VkID0gVFJVRTsKKwl9 CisJcmV0dXJuIChhbnljaGFuZ2VkKTsKK30KKworLyotCisgKglTZXQgdGhlIHBoeXNpY2FsIHBy b3RlY3Rpb24gb24gdGhlCisgKglzcGVjaWZpZWQgcmFuZ2Ugb2YgdGhpcyBtYXAgYXMgcmVxdWVz dGVkLgorICovCit2b2lkCitwbWFwX3Byb3RlY3QocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHN2 YSwgdm1fb2Zmc2V0X3QgZXZhLCB2bV9wcm90X3QgcHJvdCkKK3sKKwl2bV9vZmZzZXRfdCB2YSwg dmFfbmV4dDsKKwlwZF9lbnRyeV90ICpwZGUsICpwZHBlOworCXB0X2VudHJ5X3QgKnB0ZTsKKwli b29sZWFuX3QgYW55Y2hhbmdlZCwgcHZfbGlzdHNfbG9ja2VkOworCisJaWYgKChwcm90ICYgVk1f UFJPVF9SRUFEKSA9PSBWTV9QUk9UX05PTkUpIHsKKwkJcG1hcF9yZW1vdmUocG1hcCwgc3ZhLCBl dmEpOworCQlyZXR1cm47CisJfQorCWlmIChwcm90ICYgVk1fUFJPVF9XUklURSkKKwkJcmV0dXJu OworCisJcHZfbGlzdHNfbG9ja2VkID0gRkFMU0U7CityZXN1bWU6CisJYW55Y2hhbmdlZCA9IEZB TFNFOworCisJUE1BUF9MT0NLKHBtYXApOworCWZvciAoOyBzdmEgPCBldmE7IHN2YSA9IHZhX25l eHQpIHsKKwkJcGRwZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHN2YSk7CisJCWlmICgqcGRwZSA9PSAw KSB7CisJCQl2YV9uZXh0ID0gKHN2YSArIE5CU0VHKSAmIH5TRUdNQVNLOworCQkJaWYgKHZhX25l eHQgPCBzdmEpCisJCQkJdmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZhX25l eHQgPSAoc3ZhICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJ dmFfbmV4dCA9IGV2YTsKKworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2YSk7CisK KwkJLyoKKwkJICogV2VlZCBvdXQgaW52YWxpZCBtYXBwaW5ncy4KKwkJICovCisJCWlmICgqcGRl ID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBDaGVjayBmb3Igc3VwZXJwYWdl LgorCQkgKi8KKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQkJLyoKKwkJCSAq IEFyZSB3ZSBwcm90ZWN0aW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJCQkgKiBk ZW1vdGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYgKHN2YSAr IE5CUERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQkvKgorCQkJCSAqIFRo ZSBUTEIgZW50cnkgZm9yIGEgUEdfRyBtYXBwaW5nIGlzCisJCQkJICogaW52YWxpZGF0ZWQgYnkg cG1hcF9wcm90ZWN0X3BkZSgpLgorCQkJCSAqLworCQkJCWlmIChwbWFwX3Byb3RlY3RfcGRlKHBt YXAsIHBkZSwgc3ZhLCBwcm90KSkKKwkJCQkJYW55Y2hhbmdlZCA9IFRSVUU7CisJCQkJY29udGlu dWU7CisJCQl9IGVsc2UgeworCQkJCWlmICghcHZfbGlzdHNfbG9ja2VkKSB7CisJCQkJCXB2X2xp c3RzX2xvY2tlZCA9IFRSVUU7CisJCQkJCWlmICghcndfdHJ5X3Jsb2NrKCZwdmhfZ2xvYmFsX2xv Y2spKSB7CisJCQkJCQlpZiAoYW55Y2hhbmdlZCkKKwkJCQkJCQlwbWFwX2ludmFsaWRhdGVfYWxs KAorCQkJCQkJCSAgICBwbWFwKTsKKwkJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJCQkJcndf cmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJCQkJCQlnb3RvIHJlc3VtZTsKKwkJCQkJfQorCQkJ CX0KKwkJCQlpZiAoIXBtYXBfZGVtb3RlX3BkZShwbWFwLCBwZGUsIHN2YSkpIHsKKwkJCQkJLyoK KwkJCQkJICogVGhlIHN1cGVycGFnZSBtYXBwaW5nIHdhcyBkZXN0cm95ZWQuCisJCQkJCSAqLwor CQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyoKKwkJICogTGltaXQgb3VyIHNj YW4gdG8gZWl0aGVyIHRoZSBlbmQgb2YgdGhlIHZhIHJlcHJlc2VudGVkCisJCSAqIGJ5IHRoZSBj dXJyZW50IHBhZ2UgdGFibGUgcGFnZSwgb3IgdG8gdGhlIGVuZCBvZiB0aGUKKwkJICogcmFuZ2Ug YmVpbmcgd3JpdGUgcHJvdGVjdGVkLgorCQkgKi8KKwkJaWYgKHZhX25leHQgPiBldmEpCisJCQl2 YV9uZXh0ID0gZXZhOworCisJCXZhID0gdmFfbmV4dDsKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90 b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFH RV9TSVpFKSB7CisJCQlwdF9lbnRyeV90IHBiaXRzOworCQkJdm1fcGFnZV90IG07CisJCQl2bV9w YWRkcl90IHBhOworCisJCQlwYml0cyA9ICpwdGU7CisJCQlpZiAoIXB0ZV9pc192YWxpZCgmcGJp dHMpIHx8IHB0ZV90ZXN0KCZwYml0cywgUFRFX1JPKSkgeworCQkJCWlmICh2YSAhPSB2YV9uZXh0 KSB7CisJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJCQkJdmEg PSB2YV9uZXh0OworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXB0ZV9zZXQoJnBiaXRz LCBQVEVfUk8pOworCQkJaWYgKHB0ZV90ZXN0KCZwYml0cywgUFRFX0QpKSB7CisJCQkJcHRlX2Ns ZWFyKCZwYml0cywgUFRFX0QpOworCQkJCWlmIChwdGVfdGVzdCgmcGJpdHMsIFBURV9NQU5BR0VE KSkgeworCQkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwYml0cyk7CisJCQkJCW0gPSBQSFlTX1RP X1ZNX1BBR0UocGEpOworCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCX0KKwkJCQlpZiAodmEg PT0gdmFfbmV4dCkKKwkJCQkJdmEgPSBzdmE7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICog VW5sZXNzIFBURV9EIGlzIHNldCwgYW55IFRMQiBlbnRyaWVzCisJCQkJICogbWFwcGluZyAic3Zh IiBkb24ndCBhbGxvdyB3cml0ZSBhY2Nlc3MsIHNvCisJCQkJICogdGhleSBuZWVkbid0IGJlIGlu dmFsaWRhdGVkLgorCQkJCSAqLworCQkJCWlmICh2YSAhPSB2YV9uZXh0KSB7CisJCQkJCXBtYXBf aW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwkJCQkJdmEgPSB2YV9uZXh0OworCQkJ CX0KKwkJCX0KKwkJCSpwdGUgPSBwYml0czsKKwkJfQorCQlpZiAodmEgIT0gdmFfbmV4dCkKKwkJ CXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2YSwgc3ZhKTsKKwl9CisJaWYgKGFueWNoYW5n ZWQpCisJCXBtYXBfaW52YWxpZGF0ZV9hbGwocG1hcCk7CisJaWYgKHB2X2xpc3RzX2xvY2tlZCkg eworCQlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCX0KKwlQTUFQX1VOTE9DSyhwbWFw KTsKK30KKworLyotCisgKiBUcmllcyB0byBwcm9tb3RlIHRoZSA1MTIsIGNvbnRpZ3VvdXMgNEtC IHBhZ2UgbWFwcGluZ3MgdGhhdCBhcmUgd2l0aGluIGEKKyAqIHNpbmdsZSBwYWdlIHRhYmxlIHBh Z2UgdG8gYSBzaW5nbGUgMk1CIHBhZ2UgbWFwcGluZy4gIEZvciBwcm9tb3Rpb24gdG8KKyAqIG9j Y3VyLCB0d28gY29uZGl0aW9ucyBtdXN0IGJlIG1ldDogKDEpIHRoZSA0S0IgcGFnZSBtYXBwaW5n cyBtdXN0IG1hcAorICogYWxpZ25lZCwgY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkgYW5kICgy KSB0aGUgNEtCIHBhZ2UgbWFwcGluZ3MgbXVzdCBoYXZlCisgKiBpZGVudGljYWwgY2hhcmFjdGVy aXN0aWNzLgorICoKKyAqIE9uIE1JUFM2NCBwcm9tb3Rpb25zIGFyZSBhY3R1YWxseSBkb25lIGlu IHBhaXJzIG9mIHR3byAxTUIgc3VwZXJwYWdlcworICogYmVjYXVzZSBvZiB0aGUgaGFyZHdhcmUg YXJjaGl0ZWN0dXJlICh0d28gcGh5c2ljYWwgcGFnZXMgYXJlIGluIGEgc2luZ2xlCisgKiBUTEIg ZW50cnkpIGV2ZW4gdGhvdWdoIFZNIGxheWVyIGlzIHVuZGVyIHRoZSBpbXByZXNzaW9uIHRoYXQg dGhlIHN1cGVycGFnZQorICogc2l6ZSBpcyBhY3R1YWxseSAyTUIuCisgKi8KK3N0YXRpYyB2b2lk CitwbWFwX3Byb21vdGVfcGRlKHBtYXBfdCBwbWFwLCBwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNl dF90IHZhLAorICAgIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwlwdF9lbnRyeV90IG5ld3Bk ZTsKKwlwdF9lbnRyeV90ICpmaXJzdHB0ZSwgb2xkcHRlLCBwYSwgKnB0ZTsKKwl2bV9vZmZzZXRf dCBvbGRwdGV2YTsKKwl2bV9wYWdlX3QgbXB0ZTsKKworCVBNQVBfTE9DS19BU1NFUlQocG1hcCwg TUFfT1dORUQpOworCS8qCisJICogRXhhbWluZSB0aGUgZmlyc3QgUFRFIGluIHRoZSBzcGVjaWZp ZWQgUFRQLiAgQWJvcnQgaWYgdGhpcyBQVEUgaXMKKwkgKiBlaXRoZXIgaW52YWxpZCwgdW51c2Vk LCBvciBkb2VzIG5vdCBtYXAgdGhlIGZpcnN0IDRLQiBwaHlzaWNhbCBwYWdlCisJICogd2l0aGlu IGEgMk1CIHBhZ2UuCisJICovCisJZmlyc3RwdGUgPSBwbWFwX3B0ZShwbWFwLCB0cnVuY18ybXBh Z2UodmEpKTsKK3NldHBkZToKKwluZXdwZGUgPSAqZmlyc3RwdGU7CisJaWYgKGlzX2tlcm5lbF9w bWFwKHBtYXApKSB7CisJCS8qIFhYWCBub3QgZG9pbmcga2VybmVsIHBtYXAgeWV0ICovCisJCWF0 b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWlsdXJlcywgMSk7CisJCUNUUjMoS1RSX1BNQVAs ICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJICAgIF9fZnVuY19fLCB2 YSwgcG1hcCk7CisJCXJldHVybjsKKwl9CisJaWYgKCFwdGVfaXNfdmFsaWQoJm5ld3BkZSkgfHwg IXB0ZV9pc19yZWYoJm5ld3BkZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZwbWFwX3BkZV9wX2Zh aWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGlu IHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0dXJuOworCX0KKwlp ZiAoIXB0ZV90ZXN0KCZuZXdwZGUsIFBURV9EKSAmJiAhcHRlX3Rlc3QoJm5ld3BkZSwgUFRFX1JP KSkgeworCQkvKgorCQkgKiBXaGVuIFBURV9EIGlzIGFscmVhZHkgY2xlYXIsIFBURV9STyBjYW4g YmUgc2V0IHdpdGhvdXQKKwkJICogYSBUTEIgaW52YWxpZGF0aW9uLgorCQkgKi8KKwkJaWYgKCFh dG9taWNfY21wc2V0X2xvbmcoKHVfbG9uZyAqKWZpcnN0cHRlLCBuZXdwZGUsIG5ld3BkZSB8CisJ CSAgICBQVEVfUk8pKQorCQkJZ290byBzZXRwZGU7CisJCW5ld3BkZSB8PSBQVEVfUk87CisJfQor CisJLyoKKwkgKiBFeGFtaW5lIGVhY2ggb2YgdGhlIG90aGVyIFBURXMgaW4gdGhlIHNwZWNpZmll ZCBQVFAuICBBYm9ydCBpZiB0aGlzCisJICogUFRFIG1hcHMgYW4gdW5leHBlY3RlZCA0S0IgcGh5 c2ljYWwgcGFnZSBvciBkb2VzIG5vdCBoYXZlIGlkZW50aWNhbAorCSAqIGNoYXJhY3RlcmlzdGlj cyB0byB0aGUgZmlyc3QgUFRFLgorCSAqLworCXBhID0gVExCTE9fUFRFX1RPX1BBKG5ld3BkZSkg KyBOQlBEUiAtIFBBR0VfU0laRTsKKwlmb3IgKHB0ZSA9IGZpcnN0cHRlICsgTlBURVBHIC0gMTsg cHRlID4gZmlyc3RwdGU7IHB0ZS0tKSB7CitzZXRwdGU6CisJCW9sZHB0ZSA9ICpwdGU7CisJCWlm IChUTEJMT19QVEVfVE9fUEEob2xkcHRlKSAhPSBwYSkgeworCQkJYXRvbWljX2FkZF9sb25nKCZw bWFwX3BkZV9wX2ZhaWx1cmVzLCAxKTsKKwkJCUNUUjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBm b3IgdmEgJSNseCBpbiBwbWFwICVwIiwKKwkJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQkJ cmV0dXJuOworCQl9CisJCWlmICghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX0QpICYmICFwdGVfdGVz dCgmb2xkcHRlLCBQVEVfUk8pKSB7CisJCQlpZiAoIWF0b21pY19jbXBzZXRfbG9uZyhwdGUsIG9s ZHB0ZSwgb2xkcHRlIHwgUFRFX1JPKSkKKwkJCQlnb3RvIHNldHB0ZTsKKwkJCW9sZHB0ZSB8PSBQ VEVfUk87CisJCQlvbGRwdGV2YSA9ICh2YSAmIH5QRFJNQVNLKSB8CisJCQkgICAgKFRMQkxPX1BU RV9UT19QQShvbGRwdGUpICYgUERSTUFTSyk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6IHByb3Rl Y3QgZm9yIHZhICUjbHggaW4gcG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIG9sZHB0ZXZhLCBw bWFwKTsKKwkJfQorCQlpZiAoKG9sZHB0ZSAmIFBHX1BST01PVEVfTUFTSykgIT0gKG5ld3BkZSAm IFBHX1BST01PVEVfTUFTSykpIHsKKwkJCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcF9mYWls dXJlcywgMSk7CisJCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUjbHggaW4g cG1hcCAlcCIsCisJCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJCXJldHVybjsKKwkJfQor CQlwYSAtPSBQQUdFX1NJWkU7CisJfQorCisJLyoKKwkgKiBTYXZlIHRoZSBwYWdlIHRhYmxlIHBh Z2UgaW4gaXRzIGN1cnJlbnQgc3RhdGUgdW50aWwgdGhlIFBERQorCSAqIG1hcHBpbmcgdGhlIHN1 cGVycGFnZSBpcyBkZW1vdGVkIGJ5IHBtYXBfZGVtb3RlX3BkZSgpIG9yCisJICogZGVzdHJveWVk IGJ5IHBtYXBfcmVtb3ZlX3BkZSgpLgorCSAqLworCW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQ U19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7CisJS0FTU0VSVChtcHRlID49IHZtX3BhZ2VfYXJyYXkg JiYKKwkgICAgbXB0ZSA8ICZ2bV9wYWdlX2FycmF5W3ZtX3BhZ2VfYXJyYXlfc2l6ZV0sCisJICAg ICgiJXM6IHBhZ2UgdGFibGUgcGFnZSBpcyBvdXQgb2YgcmFuZ2UiLCBfX2Z1bmNfXykpOworCUtB U1NFUlQobXB0ZS0+cGluZGV4ID09IHBtYXBfcGRlX3BpbmRleCh2YSksCisJICAgICgiJXM6IHBh Z2UgdGFibGUgcGFnZSdzIHBpbmRleCBpcyB3cm9uZyIsIF9fZnVuY19fKSk7CisJaWYgKHBtYXBf aW5zZXJ0X3B0X3BhZ2UocG1hcCwgbXB0ZSkpIHsKKwkJYXRvbWljX2FkZF9sb25nKCZwbWFwX3Bk ZV9wX2ZhaWx1cmVzLCAxKTsKKwkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAl I2x4IGluIHBtYXAgJXAiLAorCQkgICAgX19mdW5jX18sIHZhLCBwbWFwKTsKKwkJcmV0dXJuOwor CX0KKworCS8qCisJICogUHJvbW90ZSB0aGUgcHYgZW50cmllcy4KKwkgKi8KKwlpZiAocHRlX3Rl c3QoJm5ld3BkZSwgUFRFX01BTkFHRUQpKQorCQlwbWFwX3B2X3Byb21vdGVfcGRlKHBtYXAsIHZh LCBUTEJMT19QVEVfVE9fUEEobmV3cGRlKSwgbG9ja3ApOworCisJLyoKKwkgKiBNYXAgdGhlIHN1 cGVycGFnZS4KKwkgKi8KKwlwbWFwX3VwZGF0ZV9wZGUocG1hcCwgdmEsIHBkZSwgbmV3cGRlIHwg UFRFX1BTXzFNKTsKKworCWF0b21pY19hZGRfbG9uZygmcG1hcF9wZGVfcHJvbW90aW9ucywgMSk7 CisJQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAlI2x4IGluIHBtYXAgJXAiLCBf X2Z1bmNfXywgdmEsCisJICAgIHBtYXApOworfQorCisvKgorICoJSW5zZXJ0IHRoZSBnaXZlbiBw aHlzaWNhbCBwYWdlIChwKSBhdAorICoJdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJlc3MgKHYp IGluIHRoZQorICoJdGFyZ2V0IHBoeXNpY2FsIG1hcCB3aXRoIHRoZSBwcm90ZWN0aW9uIHJlcXVl c3RlZC4KKyAqCisgKglJZiBzcGVjaWZpZWQsIHRoZSBwYWdlIHdpbGwgYmUgd2lyZWQgZG93biwg bWVhbmluZworICoJdGhhdCB0aGUgcmVsYXRlZCBwdGUgY2FuIG5vdCBiZSByZWNsYWltZWQuCisg KgorICoJTkI6ICBUaGlzIGlzIHRoZSBvbmx5IHJvdXRpbmUgd2hpY2ggTUFZIE5PVCBsYXp5LWV2 YWx1YXRlCisgKglvciBsb3NlIGluZm9ybWF0aW9uLiAgVGhhdCBpcywgdGhpcyByb3V0aW5lIG11 c3QgYWN0dWFsbHkKKyAqCWluc2VydCB0aGlzIHBhZ2UgaW50byB0aGUgZ2l2ZW4gbWFwIE5PVy4K KyAqLworaW50CitwbWFwX2VudGVyKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFn ZV90IG0sIHZtX3Byb3RfdCBwcm90LAorICAgIHVfaW50IGZsYWdzLCBpbnQ4X3QgcHNpbmQgX191 bnVzZWQpCit7CisgICAgICAgIHN0cnVjdCByd2xvY2sgKmxvY2s7CisgICAgICAgIHZtX3BhZGRy X3QgcGEsIG9wYTsKKyAgICAgICAgcGRfZW50cnlfdCAqcGRlOworICAgICAgICBwdF9lbnRyeV90 ICpwdGU7CisgICAgICAgIHB0X2VudHJ5X3Qgb3JpZ3B0ZSwgbmV3cHRlOworICAgICAgICBwdl9l bnRyeV90IHB2OworICAgICAgICB2bV9wYWdlX3QgbXB0ZSwgb207CisgICAgICAgIGJvb2xlYW5f dCBub3NsZWVwOworCisgICAgICAgIHZhID0gdHJ1bmNfcGFnZSh2YSk7CisgICAgICAgIEtBU1NF UlQodmEgPD0gVk1fTUFYX0tFUk5FTF9BRERSRVNTLCAoInBtYXBfZW50ZXI6IHRvb2JpZyIpKTsK KyAgICAgICAgS0FTU0VSVCgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgIT0gMCB8fCB2YSA8 IGttaS5jbGVhbl9zdmEgfHwKKyAgICAgICAgICAgIHZhID49IGttaS5jbGVhbl9ldmEsCisgICAg ICAgICAgICAoInBtYXBfZW50ZXI6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhlIGNsZWFuIHN1 Ym1hcCIpKTsKKyAgICAgICAgaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwICYm ICF2bV9wYWdlX3hidXNpZWQobSkpCisgICAgICAgICAgICAgICAgVk1fT0JKRUNUX0FTU0VSVF9M T0NLRUQobS0+b2JqZWN0KTsKKworICAgICAgICBtcHRlID0gTlVMTDsKKworICAgICAgICBsb2Nr ID0gTlVMTDsKKyAgICAgICAgcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAgICAgIFBN QVBfTE9DSyhwbWFwKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJbiB0aGUgY2FzZSB0aGF0 IGEgcGFnZSB0YWJsZSBwYWdlIGlzIG5vdCByZXNpZGVudCwgd2UgYXJlCisgICAgICAgICAqIGNy ZWF0aW5nIGl0IGhlcmUuCisgICAgICAgICAqLworCWlmICh2YSA8IFZNX01BWFVTRVJfQUREUkVT UykgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogSGVyZSBpZiB0aGUg cHRlIHBhZ2UgaXNuJ3QgbWFwcGVkLCBvciBpZiBpdCBoYXMgYmVlbgorICAgICAgICAgICAgICAg ICAqIGRlYWxsb2NhdGVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIG5v c2xlZXAgPSAoZmxhZ3MgJiBQTUFQX0VOVEVSX05PU0xFRVApICE9IDA7CisgICAgICAgICAgICAg ICAgbXB0ZSA9IHBtYXBfYWxsb2NwdGUocG1hcCwgdmEsIG5vc2xlZXAgPyBOVUxMIDogJmxvY2sp OworICAgICAgICAgICAgICAgIGlmIChtcHRlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAg ICAgICAgIEtBU1NFUlQobm9zbGVlcCAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICgicG1hcF9hbGxvY3B0ZSBmYWlsZWQgd2l0aCBzbGVlcCBhbGxvd2VkIikpOworICAgICAgICAg ICAgICAgICAgICAgICAgaWYgKGxvY2sgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcndfd3VubG9jayhsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ3X3J1 bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBQTUFQX1VO TE9DSyhwbWFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoS0VSTl9SRVNPVVJD RV9TSE9SVEFHRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJcGRlID0gcG1hcF9w ZGUocG1hcCwgdmEpOworCWlmIChwZGVfaXNfMW1fc3VwZXJwYWdlKHBkZSkpIHsKKwkJcGFuaWMo IiVzOiBhdHRlbXB0ZWQgcG1hcF9lbnRlciBvbiBzdXBlcnBhZ2UiLCBfX2Z1bmNfXyk7CisJfQor CXB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHZhKTsKKworICAgICAgICAvKgorICAgICAgICAg KiAgUGFnZSBEaXJlY3RvcnkgdGFibGUgZW50cnkgbm90IHZhbGlkLCB3ZSBuZWVkIGEgbmV3IFBU IHBhZ2UKKyAgICAgICAgICovCisgICAgICAgIGlmIChwdGUgPT0gTlVMTCkgeworICAgICAgICAg ICAgICAgIHBhbmljKCJwbWFwX2VudGVyOiBpbnZhbGlkIHBhZ2UgZGlyZWN0b3J5LCBwZGlyPSVw LCB2YT0lcCIsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopcG1hcC0+cG1fc2VndGFiLCAo dm9pZCAqKXZhKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhID0gVk1fUEFHRV9UT19QSFlTKG0p OworICAgICAgICBvbSA9IE5VTEw7CisgICAgICAgIG9yaWdwdGUgPSAqcHRlOworCW9wYSA9IFRM QkxPX1BURV9UT19QQShvcmlncHRlKTsKKworICAgICAgICBuZXdwdGUgPSBUTEJMT19QQV9UT19Q Rk4ocGEpIHwgaW5pdF9wdGVfcHJvdChtLCBmbGFncywgcHJvdCk7CisgICAgICAgIC8qCisgICAg ICAgICAqIHBtYXBfZW50ZXIoKSBpcyBjYWxsZWQgZHVyaW5nIGEgZmF1bHQgb3Igc2ltdWxhdGVk IGZhdWx0IHNvCisgICAgICAgICAqIHNldCB0aGUgcmVmZXJlbmNlIGJpdCBub3cgdG8gYXZvaWQg YSBmYXVsdC4KKyAgICAgICAgICovCisgICAgICAgIHB0ZV9yZWZfc2V0KCZuZXdwdGUpOworICAg ICAgICBpZiAoKGZsYWdzICYgUE1BUF9FTlRFUl9XSVJFRCkgIT0gMCkKKyAgICAgICAgICAgICAg ICBuZXdwdGUgfD0gUFRFX1c7CisgICAgICAgIGlmIChpc19rZXJuZWxfcG1hcChwbWFwKSkKKyAg ICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRFX0c7CisgICAgICAgIGlmIChpc19jYWNoZWFibGVf bWVtKHBhKSkgeworICAgICAgICAgICAgICAgIGlmIChtLT5tZC5wdl9tZW1hdHRyID09IFZNX01F TUFUVFJfVU5DQUNIRUFCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRF X0NfVU5DQUNIRUQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAg ICAgbmV3cHRlIHw9IFBURV9DX0NBQ0hFOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAg ICBuZXdwdGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisjaWZkZWYgQ1BVX0NIRVJJCisgICAgICAgIGlm ICgoZmxhZ3MgJiBQTUFQX0VOVEVSX05PTE9BRFRBR1MpICE9IDApCisgICAgICAgICAgICAgICAg bmV3cHRlIHw9IFBURV9MQzsKKyAgICAgICAgaWYgKChmbGFncyAmIFBNQVBfRU5URVJfTk9TVE9S RVRBR1MpICE9IDApCisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBURV9TQzsKKyNlbmRpZgor CisJLyoKKwkgKiBTZXQgbW9kaWZpZWQgYml0IGdyYXR1aXRvdXNseSBmb3Igd3JpdGVhYmxlIG1h cHBpbmdzIGlmCisJICogdGhlIHBhZ2UgaXMgdW5tYW5hZ2VkLiBXZSBkbyBub3Qgd2FudCB0byB0 YWtlIGEgZmF1bHQKKwkgKiB0byBkbyB0aGUgZGlydHkgYml0IGVtdWxhdGlvbiBmb3IgdGhlc2Ug bWFwcGluZ3MuCisJICovCisJaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSAhPSAwKSB7 CisJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJCW5ld3B0ZSB8PSBQVEVfRDsK Kwl9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFwcGluZyBoYXMgbm90IGNoYW5nZWQsIG11 c3QgYmUgcHJvdGVjdGlvbiBvciB3aXJpbmcgY2hhbmdlLgorICAgICAgICAgKi8KKyAgICAgICAg aWYgKHB0ZV9pc192YWxpZCgmb3JpZ3B0ZSkgJiYgb3BhID09IHBhKSB7CisgICAgICAgICAgICAg ICAgLyoKKyAgICAgICAgICAgICAgICAgKiBXaXJpbmcgY2hhbmdlLCBqdXN0IHVwZGF0ZSBzdGF0 cy4gV2UgZG9uJ3Qgd29ycnkgYWJvdXQKKyAgICAgICAgICAgICAgICAgKiB3aXJpbmcgUFQgcGFn ZXMgYXMgdGhleSByZW1haW4gcmVzaWRlbnQgYXMgbG9uZyBhcyB0aGVyZQorICAgICAgICAgICAg ICAgICAqIGFyZSB2YWxpZCBtYXBwaW5ncyBpbiB0aGVtLiBIZW5jZSwgaWYgYSB1c2VyIHBhZ2Ug aXMKKyAgICAgICAgICAgICAgICAgKiB3aXJlZCwgdGhlIFBUIHBhZ2Ugd2lsbCBiZSBhbHNvLgor ICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmbmV3cHRl LCBQVEVfVykgJiYgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVykpCisgICAgICAgICAgICAgICAg ICAgICAgICBwbWFwLT5wbV9zdGF0cy53aXJlZF9jb3VudCsrOworICAgICAgICAgICAgICAgIGVs c2UgaWYgKCFwdGVfdGVzdCgmbmV3cHRlLCBQVEVfVykgJiYgcHRlX3Rlc3QoJm9yaWdwdGUsCisg ICAgICAgICAgICAgICAgICAgIFBURV9XKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBtYXAt PnBtX3N0YXRzLndpcmVkX2NvdW50LS07CisKKyAgICAgICAgICAgICAgICBLQVNTRVJUKCFwdGVf dGVzdCgmb3JpZ3B0ZSwgUFRFX0QgfCBQVEVfUk8pLAorICAgICAgICAgICAgICAgICAgICAoIiVz OiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTogdmE6ICVwLCBwdGU6ICUjangiLAorICAgICAg ICAgICAgICAgICAgICBfX2Z1bmNfXywgKHZvaWQgKil2YSwgKHVpbnRtYXhfdClvcmlncHRlKSk7 CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFJlbW92ZSB0aGUgZXh0 cmEgUFQgcGFnZSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAg ICBpZiAobXB0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtcHRlLT53aXJl X2NvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICBLQVNTRVJUKG1wdGUtPndpcmVfY291 bnQgPiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgicG1hcF9lbnRlcjogbWlzc2lu ZyByZWZlcmVuY2UgdG8gcGFnZSB0YWJsZSBwYWdlLCIKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIiB2YTogMHglbHgiLCB2YSkpOworICAgICAgICAgICAgICAgIH0KKwkJaWYgKHB0ZV90 ZXN0KCZvcmlncHRlLCBQVEVfTUFOQUdFRCkpIHsKKwkJCW9tID0gbTsKKwkJCW5ld3B0ZSB8PSBQ VEVfTUFOQUdFRDsKKwkJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKwkJCQl2bV9w YWdlX2FmbGFnX3NldChtLCBQR0FfV1JJVEVBQkxFKTsKKwkJfQorCQlnb3RvIHZhbGlkYXRlOwor CX0KKworCXB2ID0gTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBNYXBwaW5nIGhhcyBj aGFuZ2VkLCBpbnZhbGlkYXRlIG9sZCByYW5nZSBhbmQgZmFsbCB0aHJvdWdoIHRvCisgICAgICAg ICAqIGhhbmRsZSB2YWxpZGF0aW5nIG5ldyBtYXBwaW5nLgorICAgICAgICAgKi8KKyAgICAgICAg aWYgKG9wYSkgeworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1cp KQorICAgICAgICAgICAgICAgICAgICAgICAgcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQtLTsK KworICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQpKSB7 CisgICAgICAgICAgICAgICAgICAgICAgICBvbSA9IFBIWVNfVE9fVk1fUEFHRShvcGEpOworICAg ICAgICAgICAgICAgICAgICAgICAgQ0hBTkdFX1BWX0xJU1RfTE9DS19UT19WTV9QQUdFKCZsb2Nr LCBvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdiA9IHBtYXBfcHZoX3JlbW92ZSgmb20t Pm1kLCBwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICht cHRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wdGUtPndpcmVfY291bnQt LTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBU1NFUlQobXB0ZS0+d2lyZV9jb3VudCA+IDAs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJwbWFwX2VudGVyOiBtaXNzaW5nIHJlZmVy ZW5jZSB0byBwYWdlIHRhYmxlIHBhZ2UsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIg dmE6ICVwIiwgKHZvaWQgKil2YSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNl CisgICAgICAgICAgICAgICAgcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgMSk7CisKKyAg ICAgICAgLyoKKyAgICAgICAgICogRW50ZXIgb24gdGhlIFBWIGxpc3QgaWYgcGFydCBvZiBvdXIg bWFuYWdlZCBtZW1vcnkuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG0tPm9mbGFncyAmIFZQ T19VTk1BTkFHRUQpID09IDApIHsKKyAgICAgICAgICAgICAgICBuZXdwdGUgfD0gUFRFX01BTkFH RUQ7CisJCS8qIEluc2VydCBFbnRyeSAqLworCQlpZiAocHYgPT0gTlVMTCkKKwkJCXB2ID0gZ2V0 X3B2X2VudHJ5KHBtYXAsICZsb2NrKTsKKyAgICAgICAgICAgICAgICBwdi0+cHZfdmEgPSB2YTsK KyAgICAgICAgICAgICAgICBDSEFOR0VfUFZfTElTVF9MT0NLX1RPX1BIWVMoJmxvY2ssIHBhKTsK KyAgICAgICAgICAgICAgICBUQUlMUV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2 X25leHQpOworICAgICAgICAgICAgICAgIG0tPm1kLnB2X2dlbisrOworICAgICAgICAgICAgICAg IGlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKKyAgICAgICAgICAgICAgICAgICAgICAg IHZtX3BhZ2VfYWZsYWdfc2V0KG0sIFBHQV9XUklURUFCTEUpOworICAgICAgICB9IGVsc2UgaWYg KHB2ICE9IE5VTEwpCisJCWZyZWVfcHZfZW50cnkocG1hcCwgcHYpOworCisKKyAgICAgICAgLyoK KyAgICAgICAgICogSW5jcmVtZW50IGNvdW50ZXJzCisgICAgICAgICAqLworICAgICAgICBpZiAo cHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1cpKQorICAgICAgICAgICAgICAgIHBtYXAtPnBtX3N0YXRz LndpcmVkX2NvdW50Kys7CisKK3ZhbGlkYXRlOgorI2lmZGVmIFBNQVBfREVCVUcKKyAgICAgICAg cHJpbnRmKCJwbWFwX2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2YSwgKHZv aWQgKilwYSk7CisjZW5kaWYKKyAgICAgICAgLyoKKyAgICAgICAgICogaWYgdGhlIG1hcHBpbmcg b3IgcGVybWlzc2lvbiBiaXRzIGFyZSBkaWZmZXJlbnQsIHdlIG5lZWQgdG8KKyAgICAgICAgICog dXBkYXRlIHRoZSBwdGUuCisgICAgICAgICAqLworICAgICAgICBpZiAoKG9yaWdwdGUgJiB+IChQ VEVfRHxQVEVfUkVGKSkgIT0gbmV3cHRlKSB7CisgICAgICAgICAgICAgICAgbmV3cHRlIHw9IFBU RV9WUjsKKyAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgVk1fUFJPVF9XUklURSkgIT0gMCkK KyAgICAgICAgICAgICAgICAgICAgICAgIG5ld3B0ZSB8PSBQVEVfRDsKKyAgICAgICAgICAgICAg ICBpZiAocHRlX2lzX3ZhbGlkKCZvcmlncHRlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAg Ym9vbGVhbl90IGludmx2YSA9IEZBTFNFOworCisJCQlvcmlncHRlID0gcHRlX2xvYWRfc3RvcmUo cHRlLCBuZXdwdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0ZV9pc19yZWYoJm9y aWdwdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgm b3JpZ3B0ZSwgUFRFX01BTkFHRUQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHZtX3BhZ2VfYWZsYWdfc2V0KG9tLCBQR0FfUkVGRVJFTkNFRCk7CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGEgIT0gcGEpCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaW52bHZhID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAg ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRF X0QpICYmCisJCQkgICAgIXB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfUk8pKSB7CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX01BTkFHRUQp KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZtX3BhZ2VfZGlydHko b20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHByb3QgJiBWTV9QUk9U X1dSSVRFKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu dmx2YSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg ICAgICAgICBpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSAmJgorICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFRBSUxRX0VNUFRZKCZvbS0+bWQucHZfbGlzdCkgJiYKKwkJCSAg ICAoKG9tLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDAgfHwKKwkJCSAgICBUQUlMUV9FTVBU WSgmcGFfdG9fcHZoKG9wYSktPnB2X2xpc3QpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdm1fcGFnZV9hZmxhZ19jbGVhcihvbSwgUEdBX1dSSVRFQUJMRSk7CisgICAgICAgICAg ICAgICAgICAgICAgICBpZiAoaW52bHZhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisgICAgICAgICAgICAgICAgfSBlbHNl CisJCQlwdGVfc3RvcmUocHRlLCBuZXdwdGUpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAg ICAgICAgICogIElmIGJvdGggdGhlIHBhZ2UgdGFibGUgcGFnZSBhbmQgdGhlIHJlc2VydmF0aW9u IGFyZSBmdWxseQorICAgICAgICAgKiAgcG9wdWxhdGVkLCB0aGVuIGF0dGVtcHQgcHJvbW90aW9u LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChtcHRlID09IE5VTEwgfHwgbXB0ZS0+d2lyZV9j b3VudCA9PSBOUFRFUEcpICYmCisgICAgICAgICAgICAobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VT KSA9PSAwICYmCisgICAgICAgICAgICBwZ19zcF9lbmFibGVkICYmIHZtX3Jlc2Vydl9sZXZlbF9p ZmZ1bGxwb3AobSkgPT0gMCkKKyAgICAgICAgICAgICAgICBwbWFwX3Byb21vdGVfcGRlKHBtYXAs IHBkZSwgdmEsICZsb2NrKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTeW5jIEkgJiBEIGNh Y2hlcyBmb3IgZXhlY3V0YWJsZSBwYWdlcy4gIERvIHRoaXMgb25seSBpZiB0aGUKKyAgICAgICAg ICogdGFyZ2V0IHBtYXAgYmVsb25ncyB0byB0aGUgY3VycmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNl LCBhbgorICAgICAgICAgKiB1bnJlc29sdmFibGUgVExCIG1pc3MgbWF5IG9jY3VyLgorICAgICAg ICAgKi8KKyAgICAgICAgaWYgKCFpc19rZXJuZWxfcG1hcChwbWFwKSAmJiAocG1hcCA9PSAmY3Vy cHJvYy0+cF92bXNwYWNlLT52bV9wbWFwKSAmJgorICAgICAgICAgICAgKHByb3QgJiBWTV9QUk9U X0VYRUNVVEUpKSB7CisgICAgICAgICAgICAgICAgbWlwc19pY2FjaGVfc3luY19yYW5nZSh2YSwg UEFHRV9TSVpFKTsKKyAgICAgICAgICAgICAgICBtaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwg UEFHRV9TSVpFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobG9jayAhPSBOVUxMKQorICAgICAg ICAgICAgICAgIHJ3X3d1bmxvY2sobG9jayk7CisgICAgICAgIHJ3X3J1bmxvY2soJnB2aF9nbG9i YWxfbG9jayk7CisgICAgICAgIFBNQVBfVU5MT0NLKHBtYXApOworICAgICAgICByZXR1cm4gKEtF Uk5fU1VDQ0VTUyk7Cit9CisKKy8qCisgKiB0aGlzIGNvZGUgbWFrZXMgc29tZSAqTUFKT1IqIGFz c3VtcHRpb25zOgorICogMS4gQ3VycmVudCBwbWFwICYgcG1hcCBleGlzdHMuCisgKiAyLiBOb3Qg d2lyZWQuCisgKiAzLiBSZWFkIGFjY2Vzcy4KKyAqIDQuIE5vIHBhZ2UgdGFibGUgcGFnZXMuCisg KiBidXQgaXMgKk1VQ0gqIGZhc3RlciB0aGFuIHBtYXBfZW50ZXIuLi4KKyAqLwordm9pZAorcG1h cF9lbnRlcl9xdWljayhwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2 bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCisJbG9jayA9IE5VTEw7 CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOworCSh2b2lk KXBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LCBOVUxMLCAmbG9jayk7 CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZw dmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCitzdGF0aWMgdm1fcGFn ZV90CitwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEs IHZtX3BhZ2VfdCBtLAorICAgIHZtX3Byb3RfdCBwcm90LCB2bV9wYWdlX3QgbXB0ZSwgc3RydWN0 IHJ3bG9jayAqKmxvY2twKQoreworCXB0X2VudHJ5X3QgKnB0ZSwgbmV3cHRlOworCXZtX3BhZGRy X3QgcGE7CisJc3RydWN0IHNwZ2xpc3QgZnJlZTsKKworCUtBU1NFUlQodmEgPCBrbWkuY2xlYW5f c3ZhIHx8IHZhID49IGttaS5jbGVhbl9ldmEgfHwKKwkgICAgKG0tPm9mbGFncyAmIFZQT19VTk1B TkFHRUQpICE9IDAsCisJICAgICgiJXM6IG1hbmFnZWQgbWFwcGluZyB3aXRoaW4gdGhlIGNsZWFu IHN1Ym1hcCIsIF9fZnVuY19fKSk7CisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ssIFJBX0xP Q0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwkvKgorCSAqIElu IHRoZSBjYXNlIHRoYXQgYSBwYWdlIHRhYmxlIHBhZ2UgaXMgbm90IHJlc2lkZW50LCB3ZSBhcmUK KwkgKiBjcmVhdGluZyBpdCBoZXJlLgorCSAqLworCWlmICh2YSA8IFZNX01BWFVTRVJfQUREUkVT UykgeworCQlwZF9lbnRyeV90ICpwZGU7CisJCXVuc2lnbmVkIHB0ZXBpbmRleDsKKworCQkvKgor CQkgKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXgKKwkJICovCisJCXB0ZXBpbmRleCA9 IHBtYXBfcGRlX3BpbmRleCh2YSk7CisJCWlmIChtcHRlICYmIChtcHRlLT5waW5kZXggPT0gcHRl cGluZGV4KSkgeworCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJLyoKKwkJ CSAqIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkKKwkJCSAqLworCQkJcGRlID0gcG1hcF9w ZGUocG1hcCwgdmEpOworCisJCQkvKgorCQkJICogSWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBt YXBwZWQsIHdlIGp1c3QKKwkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudCwgYW5kIGFjdGl2 YXRlIGl0LgorCQkJICovCisJCQlpZiAocGRlICYmICpwZGUgIT0gMCkgeworCQkJCWlmIChwZGVf aXNfMW1fc3VwZXJwYWdlKHBkZSkpCisJCQkJCXJldHVybiAoTlVMTCk7CisJCQkJbXB0ZSA9IFBI WVNfVE9fVk1fUEFHRSgKKwkJCQkgICAgTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRlKSk7CisJCQkJ bXB0ZS0+d2lyZV9jb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFBhc3MgTlVM TCBpbnN0ZWFkIG9mIHRoZSBQViBsaXN0IGxvY2sKKwkJCQkgKiBwb2ludGVyLCBiZWNhdXNlIHdl IGRvbid0IGludGVuZCB0byBzbGVlcC4KKwkJCQkgKi8KKwkJCQltcHRlID0gX3BtYXBfYWxsb2Nw dGUocG1hcCwgcHRlcGluZGV4LCBOVUxMKTsKKwkJCQlpZiAobXB0ZSA9PSBOVUxMKQorCQkJCQly ZXR1cm4gKG1wdGUpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJbXB0ZSA9IE5VTEw7CisJfQor CisJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOworCWlmIChwdGVfaXNfdmFsaWQocHRlKSkgewor CQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQltcHRlLT53aXJlX2NvdW50LS07CisJCQltcHRlID0g TlVMTDsKKwkJfQorCQlyZXR1cm4gKG1wdGUpOworCX0KKworCS8qCisJICogRW50ZXIgb24gdGhl IFBWIGxpc3QgaWYgcGFydCBvZiBvdXIgbWFuYWdlZCBtZW1vcnkuCisJICovCisJaWYgKChtLT5v ZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwICYmCisJICAgICFwbWFwX3RyeV9pbnNlcnRfcHZf ZW50cnkocG1hcCwgdmEsIG0sIGxvY2twKSkgeworCQlpZiAobXB0ZSAhPSBOVUxMKSB7CisJCQlT TElTVF9JTklUKCZmcmVlKTsKKwkJCWlmIChwbWFwX3Vud2lyZV9wdHAocG1hcCwgdmEsIG1wdGUs ICZmcmVlKSkgeworCQkJCXBtYXBfaW52YWxpZGF0ZV9wYWdlKHBtYXAsIHZhKTsKKwkJCQlwbWFw X2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQl9CisKKwkJCW1wdGUgPSBOVUxMOworCQl9CisJ CXJldHVybiAobXB0ZSk7CisJfQorCisJLyoKKwkgKiBJbmNyZW1lbnQgY291bnRlcnMKKwkgKi8K KwlwbWFwX3Jlc2lkZW50X2NvdW50X2luYyhwbWFwLCAxKTsKKworCXBhID0gVk1fUEFHRV9UT19Q SFlTKG0pOworCisJLyoKKwkgKiBOb3cgdmFsaWRhdGUgbWFwcGluZyB3aXRoIFJPIHByb3RlY3Rp b24KKwkgKi8KKwluZXdwdGUgPSBQVEVfUk8gfCBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX1ZB TElEOworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkKKwkJbmV3cHRlIHw9 IFBURV9NQU5BR0VEOworCisJaWYgKGlzX2NhY2hlYWJsZV9tZW0ocGEpKSB7CisJCWlmIChtLT5t ZC5wdl9tZW1hdHRyID09IFZNX01FTUFUVFJfVU5DQUNIRUFCTEUpCisJCQluZXdwdGUgfD0gUFRF X0NfVU5DQUNIRUQ7CisJCWVsc2UKKwkJCW5ld3B0ZSB8PSBQVEVfQ19DQUNIRTsKKwl9IGVsc2UK KwkJbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOworCisJc2NoZWRfcGluKCk7CisJaWYgKGlzX2tl cm5lbF9wbWFwKHBtYXApKSB7CisJCW5ld3B0ZSB8PSBQVEVfRzsKKwkJcHRlX3JlZl9zZXQoJm5l d3B0ZSk7CisJCXB0ZV9zdG9yZShwdGUsIG5ld3B0ZSk7CisJfSBlbHNlIHsKKwkJcHRlX3N0b3Jl KHB0ZSwgbmV3cHRlKTsKKwkJLyoKKwkJICogU3luYyBJICYgRCBjYWNoZXMuICBEbyB0aGlzIG9u bHkgaWYgdGhlIHRhcmdldCBwbWFwCisJCSAqIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgcHJvY2Vz cy4gIE90aGVyd2lzZSwgYW4KKwkJICogdW5yZXNvbHZhYmxlIFRMQiBtaXNzIG1heSBvY2N1ci4K KwkJICovCisJCWlmIChwbWFwID09ICZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXApIHsKKwkJ CXZhICY9IH5QQUdFX01BU0s7CisJCQltaXBzX2ljYWNoZV9zeW5jX3JhbmdlKHZhLCBQQUdFX1NJ WkUpOworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisJCX0KKwl9 CisJc2NoZWRfdW5waW4oKTsKKworCXJldHVybiAobXB0ZSk7Cit9CisKKy8qCisgKiBNYWtlIGEg dGVtcG9yYXJ5IG1hcHBpbmcgZm9yIGEgcGh5c2ljYWwgYWRkcmVzcy4gIFRoaXMgaXMgb25seSBp bnRlbmRlZAorICogdG8gYmUgdXNlZCBmb3IgcGFuaWMgZHVtcHMuCisgKgorICogVXNlIFhLUEhZ UyBmb3IgNjQgYml0LgorICovCit2b2lkICoKK3BtYXBfa2VudGVyX3RlbXBvcmFyeSh2bV9wYWRk cl90IHBhLCBpbnQgaSkKK3sKKworCWlmIChpICE9IDApCisJCXByaW50ZigiJXM6IEVSUk9SISEh IE1vcmUgdGhhbiBvbmUgcGFnZSBvZiB2aXJ0dWFsIGFkZHJlc3MgIgorCQkgICAgIm1hcHBpbmcg bm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuICgodm9pZCAqKU1JUFNfUEhZ U19UT19ESVJFQ1QocGEpKTsKK30KKwordm9pZAorcG1hcF9rZW50ZXJfdGVtcG9yYXJ5X2ZyZWUo dm1fcGFkZHJfdCBwYSkKK3sKKworCS8qIG5vdGhpbmcgdG8gZG8gZm9yIG1pcHM2NCAqLworCXJl dHVybjsKK30KKworc3RhdGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY3BkZShwbWFwX3QgcG1hcCwg dm1fb2Zmc2V0X3QgdmEsIHN0cnVjdCByd2xvY2sgKipsb2NrcCkKK3sKKwl2bV9waW5kZXhfdCBw ZHBpbmRleCwgcHRlcGluZGV4OworCXBkX2VudHJ5X3QgKnBkcGU7CisJdm1fcGFnZV90IG1wdGUg PSBOVUxMOworCisJaWYgKHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKSB7CityZXRyeToKKwkJcGRw ZSA9IHBtYXBfc2VnbWFwKHBtYXAsIHZhKTsKKwkJaWYgKHBkcGUgIT0gTlVMTCAmJiAoKnBkcGUg IT0gTlVMTCkpIHsKKwkJCS8qIEFkZCBhIHJlZmVyZW5jZSB0byB0aGUgcGQgcGFnZS4gKi8KKwkJ CW1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19ESVJFQ1RfVE9fUEhZUygqcGRwZSkpOworCQkJ bXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJLyogQWxsb2NhdGUgYSBwZCBwYWdl LiAqLworCisJCQkvKiBDYWxjdWxhdGUgcGFnZXRhYmxlIHBhZ2UgaW5kZXguICovCisJCQlwdGVw aW5kZXggPSBwbWFwX3BkZV9waW5kZXgodmEpOworCQkJcGRwaW5kZXggPSBwdGVwaW5kZXggPj4g TlBERVBHU0hJRlQ7ICAvKiBYWFggKi8KKwkJCW1wdGUgPSBfcG1hcF9hbGxvY3B0ZShwbWFwLCBO VVBERSArIHBkcGluZGV4LCBsb2NrcCk7CisJCQlpZiAobXB0ZSA9PSBOVUxMICYmIGxvY2twICE9 IE5VTEwpCisJCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlyZXR1cm4gKG1wdGUpOworfQorCisv KgorICogVHJpZXMgdG8gY3JlYXRlIGEgMk1CIHBhZ2UgbWFwcGluZy4gIFJldHVybnMgVFJVRSBp ZiBzdWNjZXNzZnVsIGFuZCBGQUxTRQorICogb3RoZXJ3aXNlLiAgRmFpbHMgaWYgKDEpIGEgcGFn ZSB0YWJsZSBwYWdlIGNhbm5vdCBiZSBhbGxvY2F0ZWQgd2l0aG91dAorICogYmxvY2tpbmcsICgy KSBhIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgYXQgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIGFkZHJl c3MsIG9yCisgKiAoMykgYSBwdiBlbnRyeSBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhvdXQgcmVj bGFpbWluZyBhbm90aGVyIHB2IGVudHJ5LgorICovCitzdGF0aWMgYm9vbGVhbl90CitwbWFwX2Vu dGVyX3BkZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtLCB2bV9wcm90 X3QgcHJvdCwKKyAgICBzdHJ1Y3Qgcndsb2NrICoqbG9ja3ApCit7CisJcGRfZW50cnlfdCAqcGRl OworCXB0X2VudHJ5X3QgbmV3cGRlOworCXZtX3BhZ2VfdCBtcGRlOworCXN0cnVjdCBzcGdsaXN0 IGZyZWU7CisJdm1fcGFkZHJfdCBwYTsKKworCisJcndfYXNzZXJ0KCZwdmhfZ2xvYmFsX2xvY2ss IFJBX0xPQ0tFRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwlpZiAo aXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJLyogTm90IGRvaW5nIHRoZSBrZXJuZWwgcG1hcCBm b3Igbm93ICovCisJCUNUUjMoS1RSX1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBw bWFwICVwOiBrZXJuZWwgbWFwIiwKKwkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJCXJldHVy biAoRkFMU0UpOworCX0KKwlpZiAoKG1wZGUgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIHZhLCBOVUxM KSkgPT0gTlVMTCkgeworCQlDVFIzKEtUUl9QTUFQLCAiJXM6IGZhaWx1cmUgZm9yIHZhICUjbHgg aW4gcG1hcCAlcCIsCisJCSAgICBfX2Z1bmNfXywgdmEsIHBtYXApOworCQlyZXR1cm4gKEZBTFNF KTsKKwl9CisJLyogcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOyAqLworCXBkZSA9IChwZF9lbnRy eV90ICopTUlQU19QSFlTX1RPX0RJUkVDVChWTV9QQUdFX1RPX1BIWVMobXBkZSkpOworCXBkZSA9 ICZwZGVbcG1hcF9wZGVfaW5kZXgodmEpXTsKKwlpZiAocGRlID09IE5VTEwpIHsKKwkJS0FTU0VS VChtcGRlLT53aXJlX2NvdW50ID4gMSwKKwkJICAgICgiJXM6IG1wZGUncyB3aXJlIGNvdW50IGlz IHRvbyBsb3ciLCBfX2Z1bmNfXykpOworCQltcGRlLT53aXJlX2NvdW50LS07CisJCUNUUjMoS1RS X1BNQVAsICIlczogZmFpbHVyZSBmb3IgdmEgJSNseCBpbiBwbWFwICVwIiwgX19mdW5jX18sCisJ CSAgICB2YSwgcG1hcCk7CisJCXJldHVybiAoRkFMU0UpOworCX0KKwlwYSA9IFZNX1BBR0VfVE9f UEhZUyhtKTsKKyAgICAgICAgbmV3cGRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZOKHBhKSB8 IFBURV9WQUxJRCB8IFBURV9QU18xTTsKKwlpZiAoaXNfY2FjaGVhYmxlX21lbShwYSkpIHsKKwkJ aWYgKG0tPm1kLnB2X21lbWF0dHIgPT0gVk1fTUVNQVRUUl9VTkNBQ0hFQUJMRSkKKwkJCW5ld3Bk ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKwkJZWxzZQorCQkJbmV3cGRlIHw9IFBURV9DX0NBQ0hFOwor CX0gZWxzZQorCQluZXdwZGUgfD0gUFRFX0NfVU5DQUNIRUQ7CisJaWYgKChtLT5vZmxhZ3MgJiBW UE9fVU5NQU5BR0VEKSA9PSAwKSB7CisJCW5ld3BkZSB8PSBQVEVfTUFOQUdFRDsKKworCQkvKgor CQkgKiBBYm9ydCB0aGlzIG1hcHBpbmcgaWYgaXRzIFBWIGVudHJ5IGNvdWxkIG5vdCBiZSBjcmVh dGVkLgorCQkgKi8KKwkJaWYgKCFwbWFwX3B2X2luc2VydF9wZGUocG1hcCwgdmEsIFZNX1BBR0Vf VE9fUEhZUyhtKSwKKwkJICAgIGxvY2twKSkgeworCQkJU0xJU1RfSU5JVCgmZnJlZSk7CisJCQlp ZiAocG1hcF91bndpcmVfcHRwKHBtYXAsIHZhLCBtcGRlLCAmZnJlZSkpIHsKKwkJCQlwbWFwX2lu dmFsaWRhdGVfcGFnZShwbWFwLCB2YSk7CisJCQkJcG1hcF9mcmVlX3plcm9fcGFnZXMoJmZyZWUp OworCQkJfQorCQkJQ1RSMyhLVFJfUE1BUCwgIiVzOiBmYWlsdXJlIGZvciB2YSAlI2x4IGluIHBt YXAgJXAiLAorCQkJICAgIF9fZnVuY19fLCB2YSwgcG1hcCk7CisJCQlyZXR1cm4gKEZBTFNFKTsK KwkJfQorCX0KKworCS8qCisJICogSW5jcmVtZW50IGNvdW50ZXJzLgorCSAqLworCSBwbWFwX3Jl c2lkZW50X2NvdW50X2luYyhwbWFwLCBOQlBEUiAvIFBBR0VfU0laRSk7CisKKwkgLyoKKwkgICog TWFwIHRoZSBzdXBlcnBhZ2UuCisJICAqLworCSBzY2hlZF9waW4oKTsKKwkgcGRlX3N0b3JlKHBk ZSwgbmV3cGRlKTsKKworCS8qCisJICogU3luYyBJICYgRCBjYWNoZXMgZm9yIGV4ZWN1dGFibGUg cGFnZXMuICBEbyB0aGlzIG9ubHkgaWYgdGhlCisJICogdGFyZ2V0IHBtYXAgYmVsb25ncyB0byB0 aGUgY3VycmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBhbgorCSAqIHVucmVzb2x2YWJsZSBUTEIg bWlzcyBtYXkgb2NjdXIuCisJICovCisJIGlmICghaXNfa2VybmVsX3BtYXAocG1hcCkgJiYgKHBt YXAgPT0gJmN1cnByb2MtPnBfdm1zcGFjZS0+dm1fcG1hcCkgJiYKKwkgICAgIChwcm90ICYgVk1f UFJPVF9FWEVDVVRFKSkgeworCQkJIHZhICY9IH5QRFJNQVNLOworCQkJIG1pcHNfaWNhY2hlX3N5 bmNfcmFuZ2UodmEsIE5CUERSKTsKKwkJCSBtaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwgTkJQ RFIpOworCisJIH0KKwkgc2NoZWRfdW5waW4oKTsKKworCSBhdG9taWNfYWRkX2xvbmcoJnBtYXBf cGRlX21hcHBpbmdzLCAxKTsKKwkgQ1RSMyhLVFJfUE1BUCwgIiVzOiBzdWNjZXNzIGZvciB2YSAl I2x4IGluIHBtYXAgJXAiLCBfX2Z1bmNfXywgdmEsCisJICAgICBwbWFwKTsKKwkgcmV0dXJuIChU UlVFKTsKK30KKworLyoKKyAqIE1hcHMgYSBzZXF1ZW5jZSBvZiByZXNpZGVudCBwYWdlcyBiZWxv bmdpbmcgdG8gdGhlIHNhbWUgb2JqZWN0LgorICogVGhlIHNlcXVlbmNlIGJlZ2lucyB3aXRoIHRo ZSBnaXZlbiBwYWdlIG1fc3RhcnQuICBUaGlzIHBhZ2UgaXMKKyAqIG1hcHBlZCBhdCB0aGUgZ2l2 ZW4gdmlydHVhbCBhZGRyZXNzIHN0YXJ0LiAgRWFjaCBzdWJzZXF1ZW50IHBhZ2UgaXMKKyAqIG1h cHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyB0aGF0IGlzIG9mZnNldCBmcm9tIHN0YXJ0IGJ5IHRo ZSBzYW1lCisgKiBhbW91bnQgYXMgdGhlIHBhZ2UgaXMgb2Zmc2V0IGZyb20gbV9zdGFydCB3aXRo aW4gdGhlIG9iamVjdC4gIFRoZQorICogbGFzdCBwYWdlIGluIHRoZSBzZXF1ZW5jZSBpcyB0aGUg cGFnZSB3aXRoIHRoZSBsYXJnZXN0IG9mZnNldCBmcm9tCisgKiBtX3N0YXJ0IHRoYXQgY2FuIGJl IG1hcHBlZCBhdCBhIHZpcnR1YWwgYWRkcmVzcyBsZXNzIHRoYW4gdGhlIGdpdmVuCisgKiB2aXJ0 dWFsIGFkZHJlc3MgZW5kLiAgTm90IGV2ZXJ5IHZpcnR1YWwgcGFnZSBiZXR3ZWVuIHN0YXJ0IGFu ZCBlbmQKKyAqIGlzIG1hcHBlZDsgb25seSB0aG9zZSBmb3Igd2hpY2ggYSByZXNpZGVudCBwYWdl IGV4aXN0cyB3aXRoIHRoZQorICogY29ycmVzcG9uZGluZyBvZmZzZXQgZnJvbSBtX3N0YXJ0IGFy ZSBtYXBwZWQuCisgKi8KK3ZvaWQKK3BtYXBfZW50ZXJfb2JqZWN0KHBtYXBfdCBwbWFwLCB2bV9v ZmZzZXRfdCBzdGFydCwgdm1fb2Zmc2V0X3QgZW5kLAorICAgIHZtX3BhZ2VfdCBtX3N0YXJ0LCB2 bV9wcm90X3QgcHJvdCkKK3sKKwlzdHJ1Y3Qgcndsb2NrICpsb2NrOworCXZtX29mZnNldF90IHZh OworCXZtX3BhZ2VfdCBtLCBtcHRlOworCXZtX3BpbmRleF90IGRpZmYsIHBzaXplOworCisJVk1f T0JKRUNUX0FTU0VSVF9MT0NLRUQobV9zdGFydC0+b2JqZWN0KTsKKworCXBzaXplID0gYXRvcChl bmQgLSBzdGFydCk7CisJbXB0ZSA9IE5VTEw7CisJbSA9IG1fc3RhcnQ7CisJbG9jayA9IE5VTEw7 CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJUE1BUF9MT0NLKHBtYXApOworCXdoaWxl IChtICE9IE5VTEwgJiYgKGRpZmYgPSBtLT5waW5kZXggLSBtX3N0YXJ0LT5waW5kZXgpIDwgcHNp emUpIHsKKwkJdmEgPSBzdGFydCArIHB0b2EoZGlmZik7CisJCWlmICgodmEgJiBQRFJNQVNLKSA9 PSAwICYmIHZhICsgTkJQRFIgPD0gZW5kICYmCisJCSAgICBtLT5wc2luZCA9PSAxICYmIHBnX3Nw X2VuYWJsZWQgJiYKKwkJICAgIHBtYXBfZW50ZXJfcGRlKHBtYXAsIHZhLCBtLCBwcm90LCAmbG9j aykpCisJCQltID0gJm1bTkJQRFIgLyBQQUdFX1NJWkUgLSAxXTsKKwkJZWxzZQorCQkJbXB0ZSA9 IHBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHZhLCBtLCBwcm90LAorCQkJICAgIG1wdGUs ICZsb2NrKTsKKwkJbSA9IFRBSUxRX05FWFQobSwgbGlzdHEpOworCX0KKwlpZiAobG9jayAhPSBO VUxMKQorCQlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9nbG9iYWxfbG9jayk7 CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qCisgKiBwbWFwX29iamVjdF9pbml0X3B0IHBy ZWxvYWRzIHRoZSBwdGVzIGZvciBhIGdpdmVuIG9iamVjdAorICogaW50byB0aGUgc3BlY2lmaWVk IHBtYXAuICBUaGlzIGVsaW1pbmF0ZXMgdGhlIGJsYXN0IG9mIHNvZnQKKyAqIGZhdWx0cyBvbiBw cm9jZXNzIHN0YXJ0dXAgYW5kIGltbWVkaWF0ZWx5IGFmdGVyIGEgbW1hcCgpLgorICoKKyAqIFRo aXMgY29kZSBtYXBzIGxhcmdlIHBoeXNpY2FsIG1tYXAgcmVnaW9ucyBpbnRvIHRoZQorICogcHJv Y2Vzc29yIGFkZHJlc3Mgc3BhY2UuIE5vdGUgdGhhdCBzb21lIHNob3J0Y3V0cworICogYXJlIHRh a2VuLCBidXQgdGhlIGNvZGUgd29ya3MuCisgKi8KK3ZvaWQKK3BtYXBfb2JqZWN0X2luaXRfcHQo cG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIsIHZtX29iamVjdF90IG9iamVjdCwKKyAgICB2 bV9waW5kZXhfdCBwaW5kZXgsIHZtX3NpemVfdCBzaXplKQoreworCXBkX2VudHJ5X3QgKnBkZTsK Kwl2bV9wYWRkcl90IHBhLCBwdGVwYTsKKwl2bV9wYWdlX3QgcCwgcGRwZzsKKwl2bV9tZW1hdHRy X3QgbWVtYXR0cjsKKworCVZNX09CSkVDVF9BU1NFUlRfV0xPQ0tFRChvYmplY3QpOworCUtBU1NF UlQob2JqZWN0LT50eXBlID09IE9CSlRfREVWSUNFIHx8IG9iamVjdC0+dHlwZSA9PSBPQkpUX1NH LAorCSAgICAoInBtYXBfb2JqZWN0X2luaXRfcHQ6IG5vbi1kZXZpY2Ugb2JqZWN0IikpOworCisJ aWYgKGlzX2tlcm5lbF9wbWFwKHBtYXApKSB7CisJCS8qIE5vdCBkb2luZyB0aGUga2VybmVsIHBt YXAgZm9yIG5vdy4gKi8KKwkJcmV0dXJuOworCX0KKworCWlmICgoYWRkciAmIChOQlBEUiAtIDEp KSA9PSAwICYmIChzaXplICYgKE5CUERSIC0gMSkpID09IDApIHsKKwkJaWYgKCFwZ19zcF9lbmFi bGVkKQorCQkJcmV0dXJuOworCQlpZiAoIXZtX29iamVjdF9wb3B1bGF0ZShvYmplY3QsIHBpbmRl eCwgcGluZGV4ICsgYXRvcChzaXplKSkpCisJCQlyZXR1cm47CisJCXAgPSB2bV9wYWdlX2xvb2t1 cChvYmplY3QsIHBpbmRleCk7CisJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFHRV9CSVRTX0FM TCwKKwkJICAgICgiJXM6IGludmFsaWQgcGFnZSAlcCIsIF9fZnVuY19fLCBwKSk7CisJCW1lbWF0 dHIgPSBwLT5tZC5wdl9tZW1hdHRyOworCisJCS8qCisJCSAqIEFib3J0IHRoZSBtYXBwaW5nIGlm IHRoZSBmaXJzdCBwYWdlIGlzIG5vdCBwaHlzaWNhbGx5CisJCSAqIGFsaWduZWQgdG8gYSAyTUIg cGFnZSBib3VuZGFyeS4KKwkJICovCisJCXB0ZXBhID0gVk1fUEFHRV9UT19QSFlTKHApOworCQlp ZiAocHRlcGEgJiAoTkJQRFIgLSAxKSkKKwkJCXJldHVybjsKKworCQkvKgorCQkgKiBTa2lwIHRo ZSBmaXJzdCBwYWdlLiBBYm9ydCB0aGUgbWFwcGluZyBpZiB0aGUgcmVzdCBvZgorCQkgKiB0aGUg cGFnZXMgYXJlIG5vdCBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgb3IgaGF2ZSBkaWZmZXJpbmcKKwkJ ICogbWVtb3J5IGF0dHJpYnV0ZXMuCisJCSAqLworCQlwID0gVEFJTFFfTkVYVChwLCBsaXN0cSk7 CisJCWZvciAocGEgPSBwdGVwYSArIFBBR0VfU0laRTsgcGEgPCBwdGVwYSArIHNpemU7CisJCSAg ICBwYSArPSBQQUdFX1NJWkUpIHsKKwkJCUtBU1NFUlQocC0+dmFsaWQgPT0gVk1fUEFHRV9CSVRT X0FMTCwKKwkJCSAgICAoIiVzOiBpbnZhbGlkIHBhZ2UgJXAiLCBfX2Z1bmNfXywgcCkpOworCQkJ aWYgKHBhICE9IFZNX1BBR0VfVE9fUEhZUyhwKSB8fAorCQkJICAgIG1lbWF0dHIgIT0gcC0+bWQu cHZfbWVtYXR0cikKKwkJCQlyZXR1cm47CisJCQlwID0gVEFJTFFfTkVYVChwLCBsaXN0cSk7CisJ CX0KKworCQkvKgorCQkgKiBNYXAgdXNpbmcgMk1CIHBhZ2VzLiAgInB0ZXBhIiBpcyAyTSBhbGln bmVkIGFuZCAic2l6ZSIKKwkJICogaXMgYSBtdWx0aXBsZSBvZiAyTS4KKwkJICovCisJCVBNQVBf TE9DSyhwbWFwKTsKKwkJZm9yIChwYSA9IHB0ZXBhOyBwYSA8IHB0ZXBhICsgc2l6ZTsgcGEgKz0g TkJQRFIpIHsKKwkJCXBkcGcgPSBwbWFwX2FsbG9jcGRlKHBtYXAsIGFkZHIsIE5VTEwpOworCQkJ aWYgKHBkcGcgPT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogVGhlIGNyZWF0aW9uIG9mIG1hcHBp bmdzIGJlbG93IGlzIG9ubHkgYW4KKwkJCQkgKiBvcHRpbWl6YXRpb24uICBJZiBhIHBhZ2UgZGly ZWN0b3J5IHBhZ2UKKwkJCQkgKiBjYW5ub3QgYmUgYWxsb2NhdGVkIHdpdGhvdXQgYmxvY2tpbmcs CisJCQkJICogY29udGludWUgb24gdG8gdGhlIG5leHQgbWFwcGluZyByYXRoZXIgdGhhbgorCQkJ CSAqIGJsb2NraW5nLgorCQkJCSAqLworCQkJCWFkZHIgKz0gTkJQRFI7CisJCQkJY29udGludWU7 CisJCQl9CisJCQlwZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1QoCisJCQkg ICAgVk1fUEFHRV9UT19QSFlTKHBkcGcpKTsKKwkJCXBkZSA9ICZwZGVbcG1hcF9wZGVfaW5kZXgo YWRkcildOworCQkJaWYgKCFwdGVfaXNfdmFsaWQoKHB0X2VudHJ5X3QgKilwZGUpKSB7CisJCQkJ cHRfZW50cnlfdCBuZXdwdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwKKwkJCQkgICAgUFRFX1BT XzFNIHwgUFRFX0QgfCBQVEVfUkVGIHwgUFRFX1ZBTElEOworCisJCQkJaWYgKGlzX2NhY2hlYWJs ZV9tZW0ocGEpKSB7CisJCQkJCWlmIChwZHBnLT5tZC5wdl9tZW1hdHRyID09CisJCQkJCSAgICBW TV9NRU1BVFRSX1VOQ0FDSEVBQkxFKQorCQkJCQkJbmV3cHRlIHw9IFBURV9DX1VOQ0FDSEVEOwor CQkJCQllbHNlCisJCQkJCQluZXdwdGUgfD0gUFRFX0NfQ0FDSEU7CisJCQkJfSBlbHNlCisJCQkJ CW5ld3B0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKworCQkJCXBkZV9zdG9yZShwZGUsIG5ld3B0ZSk7 CisJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9pbmMocG1hcCwgTkJQRFIvUEFHRV9TSVpFKTsKKwkJ CQlhdG9taWNfYWRkX2xvbmcoJnBtYXBfcGRlX21hcHBpbmdzLCAxKTsKKwkJCX0gZWxzZSB7CisJ CQkJLyogQ29udGludWUgb24gaWYgdGhlIFBERSBpcyBhbHJlYWR5IHZhbGlkLiAqLworCQkJCXBk cGctPndpcmVfY291bnQtLTsKKwkJCQlLQVNTRVJUKHBkcGctPndpcmVfY291bnQgPiAwLAorCQkJ CSAgICAoIiVzOiBtaXNzaW5nIHJlZmVyZW5jZSB0byBwYWdlIGRpcmVjdG9yeSAiCisJCQkJICAg ICJwYWdlLCB2YTogMHglbHgiLCBfX2Z1bmNfXywgYWRkcikpOworCQkJfQorCQkJYWRkciArPSBO QlBEUjsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwl9Cit9CisKKy8qCisgKglDbGVhciB0 aGUgd2lyZWQgYXR0cmlidXRlIGZyb20gdGhlIG1hcHBpbmdzIGZvciB0aGUgc3BlY2lmaWVkIHJh bmdlIG9mCisgKglhZGRyZXNzZXMgaW4gdGhlIGdpdmVuIHBtYXAuICBFdmVyeSB2YWxpZCBtYXBw aW5nIHdpdGhpbiB0aGF0IHJhbmdlCisgKgltdXN0IGhhdmUgdGhlIHdpcmVkIGF0dHJpYnV0ZSBz ZXQuICBJbiBjb250cmFzdCwgaW52YWxpZCBtYXBwaW5ncworICoJY2Fubm90IGhhdmUgdGhlIHdp cmVkIGF0dHJpYnV0ZSBzZXQsIHNvIHRoZXkgYXJlIGlnbm9yZWQuCisgKgorICoJVGhlIHdpcmVk IGF0dHJpYnV0ZSBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyeSBpcyBub3QgYSBoYXJkd2FyZSBmZWF0 dXJlLAorICoJc28gdGhlcmUgaXMgbm8gbmVlZCB0byBpbnZhbGlkYXRlIGFueSBUTEIgZW50cmll cy4KKyAqLwordm9pZAorcG1hcF91bndpcmUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHN2YSwg dm1fb2Zmc2V0X3QgZXZhKQoreworCXBkX2VudHJ5X3QgKnBkZSwgKnBkcGU7CisJcHRfZW50cnlf dCAqcHRlOworCXZtX29mZnNldF90IHZhX25leHQ7CisJYm9vbGVhbl90IHB2X2xpc3RzX2xvY2tl ZDsKKworCXB2X2xpc3RzX2xvY2tlZCA9IEZBTFNFOworcmVzdW1lOgorCVBNQVBfTE9DSyhwbWFw KTsKKwlmb3IgKDsgc3ZhIDwgZXZhOyBzdmEgPSB2YV9uZXh0KSB7CisJCXBkcGUgPSBwbWFwX3Nl Z21hcChwbWFwLCBzdmEpOworCQlpZiAoKnBkcGUgPT0gTlVMTCkgeworCQkJdmFfbmV4dCA9IChz dmEgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJCXZhX25l eHQgPSBldmE7CisJCQljb250aW51ZTsKKwkJfQorCQl2YV9uZXh0ID0gKHN2YSArIE5CUERSKSAm IH5QRFJNQVNLOworCQlpZiAodmFfbmV4dCA8IHN2YSkKKwkJCXZhX25leHQgPSBldmE7CisJCXBk ZSA9IHBtYXBfcGRwZV90b19wZGUocGRwZSwgc3ZhKTsKKwkJaWYgKCpwZGUgPT0gTlVMTCkKKwkJ CWNvbnRpbnVlOworCQlpZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJCQlpZiAoIXBk ZV90ZXN0KHBkZSwgUFRFX1cpKQorCQkJCXBhbmljKCJwbWFwX3Vud2lyZTogcGRlICUjanggaXMg bWlzc2luZyBQVEVfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnBkZSk7CisJCQkvKgorCQkJICog QXJlIHdlIHVud2lyaW5nIHRoZSBlbnRpcmUgc3VwZXJwYWdlPyBJZiBub3QsCisJCQkgKiBkZW1v dGUgdGhlIG1hcHBpbmcgYW5kIGZhbGwgdGhyb3VnaC4KKwkJCSAqLworCQkJaWYgKHN2YSArIE5C UERSID09IHZhX25leHQgJiYgZXZhID49IHZhX25leHQpIHsKKwkJCQlhdG9taWNfY2xlYXJfbG9u ZygocHRfZW50cnlfdCAqKXBkZSwgUFRFX1cpOworCQkJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2Nv dW50IC09IE5CUERSIC8gUEFHRV9TSVpFOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJ CQlpZiAoIXB2X2xpc3RzX2xvY2tlZCkgeworCQkJCQlwdl9saXN0c19sb2NrZWQgPSBUUlVFOwor CQkJCQlpZiAoIXJ3X3RyeV9ybG9jaygmcHZoX2dsb2JhbF9sb2NrKSkgeworCQkJCQkJIFBNQVBf VU5MT0NLKHBtYXApOworCQkJCQkJIHJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCQkJCQkJ IC8qIFJlcGVhdCBzdmEuICovCisJCQkJCQkgZ290byByZXN1bWU7CisJCQkJCX0KKwkJCQl9CisJ CQkJaWYgKCFwbWFwX2RlbW90ZV9wZGUocG1hcCwgcGRlLCBzdmEpKQorCQkJCQlwYW5pYygicG1h cF91bndpcmU6IGRlbW90aW9uIGZhaWxlZCIpOworCQkJfQorCQl9CisJCWlmICh2YV9uZXh0ID4g ZXZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKwkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRl LCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsgcHRlKyssCisJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7 CisJCQlpZiAoIXB0ZV9pc192YWxpZChwdGUpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFwdGVf dGVzdChwdGUsIFBURV9XKSkKKwkJCQlwYW5pYygicG1hcF91bndpcmU6IHB0ZSAlI2p4IGlzIG1p c3NpbmcgUEdfVyIsCisJCQkJICAgICh1aW50bWF4X3QpKnB0ZSk7CisJCQkvKgorCQkJICogUFRF X1cgbXVzdCBiZSBjbGVhcmVkIGF0b21pY2FsbHkuICBBbHRob3VnaCB0aGUgcG1hcAorCQkJICog bG9jayBzeW5jaHJvbml6ZXMgYWNjZXNzIHRvIFBURV9XLCBhbm90aGVyIHByb2Nlc3NvcgorCQkJ ICogY291bGQgYmUgc2V0dGluZyBQVEVfRCBhbmQvb3IgUFRFX1JFRiBjb25jdXJyZW50bHkuCisJ CQkgKi8KKwkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfVyk7CisJCQlwbWFwLT5wbV9zdGF0 cy53aXJlZF9jb3VudC0tOworCQl9CisJfQorCWlmIChwdl9saXN0c19sb2NrZWQpIHsKKwkJcndf cnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisK Ky8qCisgKglDb3B5IHRoZSByYW5nZSBzcGVjaWZpZWQgYnkgc3JjX2FkZHIvbGVuCisgKglmcm9t IHRoZSBzb3VyY2UgbWFwIHRvIHRoZSByYW5nZSBkc3RfYWRkci9sZW4KKyAqCWluIHRoZSBkZXN0 aW5hdGlvbiBtYXAuCisgKgorICoJVGhpcyByb3V0aW5lIGlzIG9ubHkgYWR2aXNvcnkgYW5kIG5l ZWQgbm90IGRvIGFueXRoaW5nLgorICovCisKK3ZvaWQKK3BtYXBfY29weShwbWFwX3QgZHN0X3Bt YXAsIHBtYXBfdCBzcmNfcG1hcCwgdm1fb2Zmc2V0X3QgZHN0X2FkZHIsCisgICAgdm1fc2l6ZV90 IGxlbiwgdm1fb2Zmc2V0X3Qgc3JjX2FkZHIpCit7CisjaWYgMAorLyoKKyAqIFhYWCBUaGlzIGRv ZXNuJ3QgaGVscCB3aXRoIGZvcmsoKSBwZXJmb3JtYW5jZSBhbmQKKyAqIGFkZHMgbW9yZSBvdmVy aGVhZC4gIE1heWJlIHRoZSByZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorICogaXMgY2F1c2luZyBm YXVsdC1saWtlIG92ZXJoZWFkIGFueXdheT8KKyAqLworCisJc3RydWN0IHJ3bG9jayAqbG9jazsK KwlzdHJ1Y3Qgc3BnbGlzdCBmcmVlOworCXZtX29mZnNldF90IGFkZHIsIGVuZF9hZGRyLCB2YV9u ZXh0OworCisJaWYgKGRzdF9hZGRyICE9IHNyY19hZGRyKQorCQlyZXR1cm47CisKKwlpZiAoUENQ VV9HRVQoY3VycG1hcCkgIT0gc3JjX3BtYXApCisJCXJldHVybjsKKworCWVuZF9hZGRyID0gc3Jj X2FkZHIgKyBsZW47CisKKwlsb2NrID0gTlVMTDsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2Nr KTsKKwkvKiBMb2NrIHRoZSBwbWFwcyBpbiB0aGUgc2FtZSBvcmRlciB0byBhdm9pZCBkZWFkbG9j ay4gKi8KKwlpZiAoZHN0X3BtYXAgPCBzcmNfcG1hcCkgeworCQlQTUFQX0xPQ0soZHN0X3BtYXAp OworCQlQTUFQX0xPQ0soc3JjX3BtYXApOworCX0gZWxzZSB7CisJCVBNQVBfTE9DSyhzcmNfcG1h cCk7CisJCVBNQVBfTE9DSyhkc3RfcG1hcCk7CisJfQorCisJZm9yIChhZGRyID0gc3JjX2FkZHI7 IGFkZHIgPCBlbmRfYWRkcjsgYWRkciA9IHZhX25leHQpIHsKKwkJcHRfZW50cnlfdCAqc3JjX3B0 ZSwgKmRzdF9wdGU7CisJCXZtX3BhZ2VfdCBkc3RtcGRlLCBkc3RtcHRlLCBzcmNtcHRlOworCQlw ZF9lbnRyeV90ICpzcmNfcGRwZSwgKnNyY19wZGUsICpkc3RfcGRlOworCQlwdF9lbnRyeV90IHNy Y3B0ZTsKKwkJdm1fcGFkZHJfdCBzcmNwYWRkcjsKKwkJdm1fcGFnZV90IG07CisKKworCQlzcmNf cGRwZSA9IHBtYXBfc2VnbWFwKHNyY19wbWFwLCBhZGRyKTsKKwkJaWYgKHNyY19wZHBlID09IE5V TEwgfHwgKnNyY19wZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoYWRkciArIE5CU0VHKSAmIH5T RUdNQVNLOworCQkJLyoKKwkJCSAqIElmIHRoZSBuZXh0IHZhIGlzIG91dCBvZiB0aGUgY29weSBy YW5nZSB0aGVuIHNldAorCQkJICogaXQgdG8gZW5kX2FkZHIgaW4gb3JkZXIgdG8gY29weSBhbGwg bWFwcGluZ3MgdW50aWwKKwkJCSAqIGdpdmVuIGxpbWl0LgorCQkJICovCisJCQlpZiAodmFfbmV4 dCA8IGFkZHIpCisJCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCQkJY29udGludWU7CisJCX0KKwor CQl2YV9uZXh0ID0gKGFkZHIgKyBOQlBEUikgJiB+UERSTUFTSzsKKwkJaWYgKHZhX25leHQgPCBh ZGRyKQorCQkJdmFfbmV4dCA9IGVuZF9hZGRyOworCisJCXNyY19wZGUgPSBwbWFwX3BkcGVfdG9f cGRlKHNyY19wZHBlLCBhZGRyKTsKKwkJaWYgKHNyY19wZGUgPT0gTlVMTCB8fCAqc3JjX3BkZSA9 PSAwKQorCQkJY29udGludWU7CisJCXNyY3B0ZSA9IChwdF9lbnRyeV90KSpzcmNfcGRlOworCisJ CWlmIChwdGVfaXNfMW1fc3VwZXJwYWdlKCZzcmNwdGUpKSB7CisJCQkvKiBDb3B5IHN1cGVycGFn ZSBwZGUuICovCisJCQlpZiAoKGFkZHIgJiBQRFJNQVNLKSAhPSAwIHx8IGFkZHIgKyBOQlBEUiA+ IGVuZF9hZGRyKQorCQkJCWNvbnRpbnVlOworCQkJZHN0bXBkZSA9IHBtYXBfYWxsb2NwZGUoZHN0 X3BtYXAsIGFkZHIsIE5VTEwpOworCQkJaWYgKGRzdG1wZGUgPT0gTlVMTCkKKwkJCQlicmVhazsK KworCQkJLyogZHN0X3BkZSA9IHBtYXBfcGRlKGRzdF9wbWFwLCBhZGRyKTsgKi8KKwkJCWRzdF9w ZGUgPSAocGRfZW50cnlfdCAqKU1JUFNfUEhZU19UT19ESVJFQ1QoCisJCQkgICAgVk1fUEFHRV9U T19QSFlTKGRzdG1wZGUpKTsKKwkJCWRzdF9wZGUgPSAmZHN0X3BkZVtwbWFwX3BkZV9pbmRleChh ZGRyKV07CisKKwkJCWlmICgqZHN0X3BkZSA9PSAwICYmCisJCQkgICAgKCFwdGVfdGVzdCgmc3Jj cHRlLCBQVEVfTUFOQUdFRCkgfHwKKwkJCSAgICBwbWFwX3B2X2luc2VydF9wZGUoZHN0X3BtYXAs IGFkZHIsCisJCQkgICAgVExCTE9fUFRFX1RPX1BBKHNyY3B0ZSksICZsb2NrKSkpIHsKKwkJCQkq ZHN0X3BkZSA9IChwZF9lbnRyeV90KShzcmNwdGUgJiB+UFRFX1cpOworCQkJCXBtYXBfcmVzaWRl bnRfY291bnRfaW5jKGRzdF9wbWFwLCBOQlBEUiAvCisJCQkJICAgIFBBR0VfU0laRSk7CisJCQl9 IGVsc2UKKwkJCQlkc3RtcGRlLT53aXJlX2NvdW50LS07CisJCQljb250aW51ZTsKKwkJfQorCisJ CXNyY3BhZGRyID0gTUlQU19ESVJFQ1RfVE9fUEhZUygqc3JjX3BkZSk7CisJCXNyY21wdGUgPSBQ SFlTX1RPX1ZNX1BBR0Uoc3JjcGFkZHIpOworCQlLQVNTRVJUKHNyY21wdGUtPndpcmVfY291bnQg PiAwLAorCQkgICAgKCJwbWFwX2NvcHk6IHNvdXJjZSBwYWdlIHRhYmxlIHBhZ2UgaXMgdW51c2Vk IikpOworCisJCS8qCisJCSAqIExpbWl0IG91ciBzY2FuIHRvIGVpdGhlciB0aGUgZW5kIG9mIHRo ZSB2YWRkciByZXByZXNlbnRlZAorCQkgKiBieSB0aGUgc291cmNlIHBhZ2UgdGFibGUgcGFnZSwg b3IgdG8gdGhlIGVuZCBvZiB0aGUgcmFuZ2UKKwkJICogYmVpbmcgY29waWVkLgorCQkgKi8KKwkJ aWYgKHZhX25leHQgPiBlbmRfYWRkcikKKwkJCXZhX25leHQgPSBlbmRfYWRkcjsKKworCQkvKgor CQkgKiBXYWxrIHRoZSBzb3VyY2UgcGFnZSB0YWJsZSBlbnRyaWVzIGFuZCBjb3B5IHRoZSBtYW5h Z2VkCisJCSAqIGVudHJpZXMuCisJCSAqLworCisJCS8qIHNyY19wdGUgPSBwbWFwX3BkZV90b19w dGUoc3JjX3BkZSwgYWRkcik7ICovCisJCXNyY19wdGUgPSAocHRfZW50cnlfdCAqKU1JUFNfUEhZ U19UT19ESVJFQ1Qoc3JjcGFkZHIpOworCQlzcmNfcHRlID0gJnNyY19wdGVbcG1hcF9wdGVfaW5k ZXgoYWRkcildOworCisJCWlmIChzcmNfcHRlID09IE5VTEwgfHwgKnNyY19wdGUgPT0gMCkKKwkJ CWNvbnRpbnVlOworCisJCWRzdG1wdGUgPSBOVUxMOworCQl3aGlsZSAoYWRkciA8IHZhX25leHQp IHsKKwkJCXVuc2lnbmVkIHBkZXBpbmRleDsKKwkJCXB0X2VudHJ5X3QgcHRldGVtcDsKKworCisJ CQlwdGV0ZW1wID0gKnNyY19wdGU7CisKKwkJCS8qCisJCQkgKiB3ZSBvbmx5IHZpcnR1YWwgY29w eSBtYW5hZ2VkIHBhZ2VzCisJCQkgKi8KKwkJCWlmIChwdGVfdGVzdCgmcHRldGVtcCwgUFRFX01B TkFHRUQpKSB7CisJCQkJLyogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4ICovCisJCQkJ cGRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KGFkZHIpOworCisJCQkJLyogR2V0IHRoZSBwYWdl IGRpcmVjdG9yeSBlbnRyeS4gKi8KKwkJCQlkc3RfcGRlID0gcG1hcF9wZGUoZHN0X3BtYXAsIGFk ZHIpOworCisJCQkJaWYgKGRzdF9wZGUgIT0gTlVMTCAmJiAqZHN0X3BkZSAhPSAwKSB7CisJCQkJ CWRzdG1wdGUgPSBQSFlTX1RPX1ZNX1BBR0UoCisJCQkJCSAgICBNSVBTX0RJUkVDVF9UT19QSFlT KCpkc3RfcGRlKSk7CisJCQkJfSBlbHNlCisJCQkJCWRzdG1wdGUgPSBOVUxMOworCisJCQkJaWYg KGRzdG1wdGUgIT0gTlVMTCAmJgorCQkJCSAgICBkc3RtcHRlLT5waW5kZXggPT0gcGRlcGluZGV4 KSB7CisJCQkJCS8qCisJCQkJCSAqIFRoZSBwYWdlIHRhYmxlIGlzIG1hcHBlZCBzbyBqdXN0CisJ CQkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudC4KKwkJCQkJICovCisJCQkJCWRzdG1wdGUt PndpcmVfY291bnQrKzsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBUaGUgcGFnZSB0 YWJsZSBpc24ndCBtYXBwZWQsIG9yIGl0CisJCQkJCSAqIGhhcyBiZWVuIGRlYWxsb2NhdGVkLgor CQkJCQkgKi8KKwkJCQkJZHN0bXB0ZSA9IHBtYXBfYWxsb2NwdGUoZHN0X3BtYXAsCisJCQkJCSAg ICBhZGRyLCBOVUxMKTsKKworCQkJCQkvKgorCQkJCQkgKiBJZiB3ZSBhcmUgaGF2aW5nIG1lbW9y eSBhbGxvYyBpc3N1ZXMKKwkJCQkJICogdGhlbiBhYmFuZG9uIHRyeWluZyB0byBjb3B5IHRoZSBw YWdlCisJCQkJCSAqIHRhYmxlcy4KKwkJCQkJICovCisJCQkJCWlmIChkc3RtcHRlID09IE5VTEwp CisJCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBOb3cgdGhhdCB3ZSBoYXZl IGEgcGFnZSBkaXJlY3RvcnksIGdldCB0aGUKKwkJCQkgKiBwdGUuCisJCQkJICovCisKKwkJCQkv KiBkc3RfcHRlID0gcG1hcF9wdGUoZHN0X3BtYXAsIGFkZHIpOyAqLworCQkJCWRzdF9wdGUgPSAo cHRfZW50cnlfdCAqKQorCQkJCSAgICBNSVBTX1BIWVNfVE9fRElSRUNUKAorCQkJCQlWTV9QQUdF X1RPX1BIWVMoZHN0bXB0ZSkpOworCQkJCWRzdF9wdGUgPSAmZHN0X3B0ZVtwbWFwX3B0ZV9pbmRl eChhZGRyKV07CisKKwkJCQkvKiBUcnkgYW5kIGluc2VydCB0aGUgcHZfZW50cnkuICovCisJCQkJ bSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QVEVfVE9fUEEocHRldGVtcCkpOworCQkJCWlmICgq ZHN0X3B0ZSA9PSAwICYmCisJCQkJICAgIHBtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShkc3RfcG1h cCwgYWRkciwgbSwKKwkJCQkgICAgJmxvY2spKSB7CisJCQkJCS8qCisJCQkJCSAqIFBvcHVsYXRl IHRoZSBlbnRyeS4KKwkJCQkJICoKKwkJCQkJICogQ2xlYXIgdGhlIHdpcmVkLCBtb2RpZmllZCwg YW5kCisJCQkJCSAqIGFjY2Vzc2VkIChyZWZlcmVuY2VkKSBiaXRzCisJCQkJCSAqIGR1cmluZyB0 aGUgY29weS4KKwkJCQkJICovCisJCQkJCXB0ZV9jbGVhcigmcHRldGVtcCwgUFRFX1cgfCBQVEVf RCB8CisJCQkJCSAgICBQVEVfUkVGKTsKKwkJCQkJKmRzdF9wdGUgPSBwdGV0ZW1wOworCQkJCQkv KiBVcGRhdGUgc3RhdHMuICovCisJCQkJCXBtYXBfcmVzaWRlbnRfY291bnRfaW5jKGRzdF9wbWFw LCAxKTsKKwkJCQl9IGVsc2UgeworCQkJCQlTTElTVF9JTklUKCZmcmVlKTsKKwkJCQkJaWYgKHBt YXBfdW53aXJlX3B0cChkc3RfcG1hcCwgYWRkciwKKwkJCQkJICAgIGRzdG1wdGUsICZmcmVlKSkg eworCQkJCQkJcG1hcF9pbnZhbGlkYXRlX3BhZ2UoZHN0X3BtYXAsCisJCQkJCQkgICAgYWRkcik7 CisJCQkJCQlwbWFwX2ZyZWVfemVyb19wYWdlcygmZnJlZSk7CisJCQkJCX0KKwkJCQkJZ290byBv dXQ7CisJCQkJfQorCQkJCS8qIENoZWNrIHRoZSB3aXJlX2NvdW50IHRvIHNlZSBpZiB3ZSdyZSBk b25lLiAqLworCQkJCWlmIChkc3RtcHRlLT53aXJlX2NvdW50ID49IHNyY21wdGUtPndpcmVfY291 bnQpCisJCQkJCWJyZWFrOworCQkJfQorCQkJYWRkciArPSBQQUdFX1NJWkU7CisJCQlzcmNfcHRl Kys7CisJCX0KKwl9CitvdXQ6CisJaWYgKGxvY2sgIT0gTlVMTCkKKwkJcndfd3VubG9jayhsb2Nr KTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCVBNQVBfVU5MT0NLKHNyY19wbWFw KTsKKwlQTUFQX1VOTE9DSyhkc3RfcG1hcCk7CisjZW5kaWYgLyogI2lmIDAgKi8KK30KKworLyoK KyAqCXBtYXBfemVyb19wYWdlIHplcm9zIHRoZSBzcGVjaWZpZWQgaGFyZHdhcmUgcGFnZSBieSBt YXBwaW5nCisgKgl0aGUgcGFnZSBpbnRvIEtWTSBhbmQgdXNpbmcgYnplcm8gdG8gY2xlYXIgaXRz IGNvbnRlbnRzLgorICoKKyAqIAlVc2UgWEtQSFlTIGZvciA2NCBiaXQuCisgKi8KK3ZvaWQKK3Bt YXBfemVyb19wYWdlKHZtX3BhZ2VfdCBtKQoreworCXZtX29mZnNldF90IHZhOworCXZtX3BhZGRy X3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19QSFlTX1RPX0RJUkVD VChwaHlzKTsKKwlzY2hlZF9waW4oKTsKKwliemVybygoY2FkZHJfdCl2YSwgUEFHRV9TSVpFKTsK KwltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwgUEFHRV9TSVpFKTsKKwlzY2hlZF91bnBpbigp OworfQorCisvKgorICoJcG1hcF96ZXJvX3BhZ2VfYXJlYSB6ZXJvcyB0aGUgc3BlY2lmaWVkIGhh cmR3YXJlIHBhZ2UgYnkgbWFwcGluZworICoJdGhlIHBhZ2UgaW50byBLVk0gYW5kIHVzaW5nIGJ6 ZXJvIHRvIGNsZWFyIGl0cyBjb250ZW50cy4KKyAqCisgKglvZmYgYW5kIHNpemUgbWF5IG5vdCBj b3ZlciBhbiBhcmVhIGJleW9uZCBhIHNpbmdsZSBoYXJkd2FyZSBwYWdlLgorICovCit2b2lkCitw bWFwX3plcm9fcGFnZV9hcmVhKHZtX3BhZ2VfdCBtLCBpbnQgb2ZmLCBpbnQgc2l6ZSkKK3sKKwl2 bV9vZmZzZXRfdCB2YTsKKwl2bV9wYWRkcl90IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMobSk7CisK Kwl2YSA9IE1JUFNfUEhZU19UT19ESVJFQ1QocGh5cyk7CisJc2NoZWRfcGluKCk7CisJYnplcm8o KGNoYXIgKikoY2FkZHJfdCl2YSArIG9mZiwgc2l6ZSk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFu Z2UodmEgKyBvZmYsIHNpemUpOworCXNjaGVkX3VucGluKCk7Cit9CisKKy8qCisgKglwbWFwX2Nv cHlfcGFnZSBjb3BpZXMgdGhlIHNwZWNpZmllZCAobWFjaGluZSBpbmRlcGVuZGVudCkKKyAqCXBh Z2UgYnkgbWFwcGluZyB0aGUgcGFnZSBpbnRvIHZpcnR1YWwgbWVtb3J5IGFuZCB1c2luZworICoJ YmNvcHkgdG8gY29weSB0aGUgcGFnZSwgb25lIG1hY2hpbmUgZGVwZW5kZW50IHBhZ2UgYXQgYQor ICoJdGltZS4KKyAqCisgKiAJVXNlIFhLUEhZUyBmb3IgNjQgYml0LgorICovCisjZGVmaW5lCVBN QVBfQ09QWV9UQUdTCTB4MDAwMDAwMDEKK3N0YXRpYyB2b2lkCitwbWFwX2NvcHlfcGFnZV9pbnRl cm5hbCh2bV9wYWdlX3Qgc3JjLCB2bV9wYWdlX3QgZHN0LCBpbnQgZmxhZ3MpCit7CisJdm1fb2Zm c2V0X3QgdmFfc3JjLCB2YV9kc3Q7CisJdm1fcGFkZHJfdCBwaHlzX3NyYyA9IFZNX1BBR0VfVE9f UEhZUyhzcmMpOworCXZtX3BhZGRyX3QgcGh5c19kc3QgPSBWTV9QQUdFX1RPX1BIWVMoZHN0KTsK KworCS8qIGVhc3kgY2FzZSwgYWxsIGNhbiBiZSBhY2Nlc3NlZCB2aWEgS1NFRzAgKi8KKwkvKgor CSAqIEZsdXNoIGFsbCBjYWNoZXMgZm9yIFZBIHRoYXQgYXJlIG1hcHBlZCB0byB0aGlzIHBhZ2UK KwkgKiB0byBtYWtlIHN1cmUgdGhhdCBkYXRhIGluIFNEUkFNIGlzIHVwIHRvIGRhdGUKKwkgKi8K KwlzY2hlZF9waW4oKTsKKwlwbWFwX2ZsdXNoX3B2Y2FjaGUoc3JjKTsKKwltaXBzX2RjYWNoZV93 Ymludl9yYW5nZV9pbmRleChNSVBTX1BIWVNfVE9fRElSRUNUKHBoeXNfZHN0KSwgUEFHRV9TSVpF KTsKKwl2YV9zcmMgPSBNSVBTX1BIWVNfVE9fRElSRUNUKHBoeXNfc3JjKTsKKwl2YV9kc3QgPSBN SVBTX1BIWVNfVE9fRElSRUNUKHBoeXNfZHN0KTsKKyNpZmRlZiBDUFVfQ0hFUkkKKwlpZiAoZmxh Z3MgJiBQTUFQX0NPUFlfVEFHUykKKwkJY2hlcmlfYmNvcHkoKGNhZGRyX3QpdmFfc3JjLCAoY2Fk ZHJfdCl2YV9kc3QsIFBBR0VfU0laRSk7CisJZWxzZQorI2Vsc2UKKwkJYmNvcHkoKGNhZGRyX3Qp dmFfc3JjLCAoY2FkZHJfdCl2YV9kc3QsIFBBR0VfU0laRSk7CisjZW5kaWYKKwltaXBzX2RjYWNo ZV93Ymludl9yYW5nZSh2YV9kc3QsIFBBR0VfU0laRSk7CisJc2NoZWRfdW5waW4oKTsKK30KKwor LyoKKyAqIFdpdGggQ0hFUkksIGl0IGlzIHNvbWV0aW1lcyBkZXNpcmFibGUgdG8gZXhwbGljaXRs eSBwcm9wYWdhdGUgdGFncyBiZXR3ZWVuCisgKiBwYWdlcyAoZS5nLiwgZHVyaW5nIGNvcHktb24t d3JpdGUpLCBidXQgbm90IG90aGVyIHRpbWVzIChlLmcuLCBjb3B5aW5nIGRhdGEKKyAqIGZyb20g Vk0gdG8gYnVmZmVyIGNhY2hlKS4gIFRoZXJlIGlzIG1vcmUgcGxheWluZyBvdXQgaGVyZSB5ZXQg dG8gZG8gKGUuZy4sCisgKiBpZiBhbnkgZmlsZXN5c3RlbXMgbGVhcm4gdG8gcHJlc2VydmUgdGFn cykgYnV0IHRoZXNlIEtQSXMgYWxsb3cgdXMgdG8KKyAqIGNhcHR1cmUgdGhhdCBkaWZmZXJlbmNl IGluIHRoZSBtZWFuIHRpbWUuCisgKi8KK3ZvaWQKK3BtYXBfY29weV9wYWdlKHZtX3BhZ2VfdCBz cmMsIHZtX3BhZ2VfdCBkc3QpCit7CisKKwlwbWFwX2NvcHlfcGFnZV9pbnRlcm5hbChzcmMsIGRz dCwgMCk7Cit9CisKKyNpZmRlZiBDUFVfQ0hFUkkKK3ZvaWQKK3BtYXBfY29weV9wYWdlX3RhZ3Mo dm1fcGFnZV90IHNyYywgdm1fcGFnZV90IGRzdCkKK3sKKworCXBtYXBfY29weV9wYWdlX2ludGVy bmFsKHNyYywgZHN0LCBQTUFQX0NPUFlfVEFHUyk7Cit9CisjZW5kaWYKKworaW50IHVubWFwcGVk X2J1Zl9hbGxvd2VkOworCitzdGF0aWMgdm9pZAorcG1hcF9jb3B5X3BhZ2VzX2ludGVybmFsKHZt X3BhZ2VfdCBtYVtdLCB2bV9vZmZzZXRfdCBhX29mZnNldCwgdm1fcGFnZV90IG1iW10sCisgICAg dm1fb2Zmc2V0X3QgYl9vZmZzZXQsIGludCB4ZmVyc2l6ZSwgaW50IGZsYWdzKQoreworCWNoYXIg KmFfY3AsICpiX2NwOworCXZtX3BhZ2VfdCBhX20sIGJfbTsKKwl2bV9vZmZzZXRfdCBhX3BnX29m ZnNldCwgYl9wZ19vZmZzZXQ7CisJdm1fcGFkZHJfdCBhX3BoeXMsIGJfcGh5czsKKwlpbnQgY250 OworCisJc2NoZWRfcGluKCk7CisJd2hpbGUgKHhmZXJzaXplID4gMCkgeworCQlhX3BnX29mZnNl dCA9IGFfb2Zmc2V0ICYgUEFHRV9NQVNLOworCQljbnQgPSBtaW4oeGZlcnNpemUsIFBBR0VfU0la RSAtIGFfcGdfb2Zmc2V0KTsKKwkJYV9tID0gbWFbYV9vZmZzZXQgPj4gUEFHRV9TSElGVF07CisJ CWFfcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhhX20pOworCQliX3BnX29mZnNldCA9IGJfb2Zmc2V0 ICYgUEFHRV9NQVNLOworCQljbnQgPSBtaW4oY250LCBQQUdFX1NJWkUgLSBiX3BnX29mZnNldCk7 CisJCWJfbSA9IG1iW2Jfb2Zmc2V0ID4+IFBBR0VfU0hJRlRdOworCQliX3BoeXMgPSBWTV9QQUdF X1RPX1BIWVMoYl9tKTsKKwkJcG1hcF9mbHVzaF9wdmNhY2hlKGFfbSk7CisJCW1pcHNfZGNhY2hl X3diaW52X3JhbmdlX2luZGV4KE1JUFNfUEhZU19UT19ESVJFQ1QoYl9waHlzKSwKKwkJICAgIFBB R0VfU0laRSk7CisJCWFfY3AgPSAoY2hhciAqKU1JUFNfUEhZU19UT19ESVJFQ1QoYV9waHlzKSAr IGFfcGdfb2Zmc2V0OworCQliX2NwID0gKGNoYXIgKilNSVBTX1BIWVNfVE9fRElSRUNUKGJfcGh5 cykgKyBiX3BnX29mZnNldDsKKyNpZmRlZiBDUFVfQ0hFUkkKKwkJaWYgKGZsYWdzICYgUE1BUF9D T1BZX1RBR1MpCisJCQljaGVyaV9iY29weShhX2NwLCBiX2NwLCBjbnQpOworCQllbHNlCisjZWxz ZQorCQkJYmNvcHkoYV9jcCwgYl9jcCwgY250KTsKKyNlbmRpZgorCQltaXBzX2RjYWNoZV93Ymlu dl9yYW5nZSgodm1fb2Zmc2V0X3QpYl9jcCwgY250KTsKKwkJYV9vZmZzZXQgKz0gY250OworCQli X29mZnNldCArPSBjbnQ7CisJCXhmZXJzaXplIC09IGNudDsKKwl9CisJc2NoZWRfdW5waW4oKTsK K30KKworLyoKKyAqIEFzIHdpdGggcG1hcF9jb3B5X3BhZ2UoKSwgQ0hFUkkgcmVxdWlyZXMgdGFn Z2VkIGFuZCBub24tdGFnZ2VkIHZlcnNpb25zCisgKiBkZXBlbmRpbmcgb24gdGhlIGNpcmN1bXN0 YW5jZXMuCisgKi8KK3ZvaWQKK3BtYXBfY29weV9wYWdlcyh2bV9wYWdlX3QgbWFbXSwgdm1fb2Zm c2V0X3QgYV9vZmZzZXQsIHZtX3BhZ2VfdCBtYltdLAorICAgIHZtX29mZnNldF90IGJfb2Zmc2V0 LCBpbnQgeGZlcnNpemUpCit7CisKKwlwbWFwX2NvcHlfcGFnZXNfaW50ZXJuYWwobWEsIGFfb2Zm c2V0LCBtYiwgYl9vZmZzZXQsIHhmZXJzaXplLCAwKTsKK30KKworI2lmZGVmIENQVV9DSEVSSQor dm9pZAorcG1hcF9jb3B5X3BhZ2VzX3RhZ3Modm1fcGFnZV90IG1hW10sIHZtX29mZnNldF90IGFf b2Zmc2V0LCB2bV9wYWdlX3QgbWJbXSwKKyAgICB2bV9vZmZzZXRfdCBiX29mZnNldCwgaW50IHhm ZXJzaXplKQoreworCisJcG1hcF9jb3B5X3BhZ2VzX2ludGVybmFsKG1hLCBhX29mZnNldCwgbWIs IGJfb2Zmc2V0LCB4ZmVyc2l6ZSwKKwkgICAgUE1BUF9DT1BZX1RBR1MpOworfQorI2VuZGlmCisK Kwordm1fb2Zmc2V0X3QKK3BtYXBfcXVpY2tfZW50ZXJfcGFnZSh2bV9wYWdlX3QgbSkKK3sKKyNp ZiBkZWZpbmVkKF9fbWlwc19uNjQpCisgICAgICAgIHJldHVybiBNSVBTX1BIWVNfVE9fRElSRUNU KFZNX1BBR0VfVE9fUEhZUyhtKSk7CisjZWxzZQorICAgICAgICB2bV9wYWRkcl90IHBhOworICAg ICAgICBzdHJ1Y3QgbG9jYWxfc3lzbWFwcyAqc3lzbTsKKyAgICAgICAgcHRfZW50cnlfdCAqcHRl OworCisgICAgICAgIHBhID0gVk1fUEFHRV9UT19QSFlTKG0pOworCisgICAgICAgIGlmIChNSVBT X0RJUkVDVF9NQVBQQUJMRShwYSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobS0+bWQucHZfZmxh Z3MgJiBQVl9NRU1BVFRSX1VOQ0FDSEVBQkxFKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0 dXJuIChNSVBTX1BIWVNfVE9fRElSRUNUX1VOQ0FDSEVEKHBhKSk7CisgICAgICAgICAgICAgICAg ZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChNSVBTX1BIWVNfVE9fRElSRUNU KHBhKSk7CisgICAgICAgIH0KKyAgICAgICAgY3JpdGljYWxfZW50ZXIoKTsKKyAgICAgICAgc3lz bSA9ICZzeXNtYXBfbG1lbVtQQ1BVX0dFVChjcHVpZCldOworCisgICAgICAgIEtBU1NFUlQoc3lz bS0+dmFsaWQxID09IDAsICgicG1hcF9xdWlja19lbnRlcl9wYWdlOiBQVEUgYnVzeSIpKTsKKwor ICAgICAgICBwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgc3lzbS0+YmFzZSk7CisgICAgICAg ICpwdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfRyB8 CisgICAgICAgICAgICAoaXNfY2FjaGVhYmxlX3BhZ2UocGEsIG0pID8gUFRFX0NfQ0FDSEUgOiBQ VEVfQ19VTkNBQ0hFRCk7CisgICAgICAgIHN5c20tPnZhbGlkMSA9IDE7CisKKyAgICAgICAgcmV0 dXJuIChzeXNtLT5iYXNlKTsKKyNlbmRpZgorfQorCit2b2lkCitwbWFwX3F1aWNrX3JlbW92ZV9w YWdlKHZtX29mZnNldF90IGFkZHIpCit7CisgICAgICAgIG1pcHNfZGNhY2hlX3diaW52X3Jhbmdl KGFkZHIsIFBBR0VfU0laRSk7CisKKyNpZiAhZGVmaW5lZChfX21pcHNfbjY0KQorICAgICAgICBz dHJ1Y3QgbG9jYWxfc3lzbWFwcyAqc3lzbTsKKyAgICAgICAgcHRfZW50cnlfdCAqcHRlOworCisg ICAgICAgIGlmIChhZGRyID49IE1JUFNfS1NFRzBfU1RBUlQgJiYgYWRkciA8IE1JUFNfS1NFRzBf RU5EKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBzeXNtID0gJnN5c21hcF9s bWVtW1BDUFVfR0VUKGNwdWlkKV07CisKKyAgICAgICAgS0FTU0VSVChzeXNtLT52YWxpZDEgIT0g MCwKKyAgICAgICAgICAgICgicG1hcF9xdWlja19yZW1vdmVfcGFnZTogUFRFIG5vdCBpbiB1c2Ui KSk7CisgICAgICAgIEtBU1NFUlQoc3lzbS0+YmFzZSA9PSBhZGRyLAorICAgICAgICAgICAgKCJw bWFwX3F1aWNrX3JlbW92ZV9wYWdlOiBpbnZhbGlkIGFkZHJlc3MiKSk7CisKKyAgICAgICAgcHRl ID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIGFkZHIpOworICAgICAgICAqcHRlID0gUFRFX0c7Cisg ICAgICAgIHRsYl9pbnZhbGlkYXRlX2FkZHJlc3Moa2VybmVsX3BtYXAsIGFkZHIpOworICAgICAg ICBzeXNtLT52YWxpZDEgPSAwOworICAgICAgICBjcml0aWNhbF9leGl0KCk7CisjZW5kaWYKK30K KworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG1hcCdzIHB2IGlzIG9uZSBvZiB0aGUgZmly c3QKKyAqIDE2IHB2cyBsaW5rZWQgdG8gZnJvbSB0aGlzIHBhZ2UuICBUaGlzIGNvdW50IG1heQor ICogYmUgY2hhbmdlZCB1cHdhcmRzIG9yIGRvd253YXJkcyBpbiB0aGUgZnV0dXJlOyBpdAorICog aXMgb25seSBuZWNlc3NhcnkgdGhhdCB0cnVlIGJlIHJldHVybmVkIGZvciBhIHNtYWxsCisgKiBz dWJzZXQgb2YgcG1hcHMgZm9yIHByb3BlciBwYWdlIGFnaW5nLgorICovCitib29sZWFuX3QKK3Bt YXBfcGFnZV9leGlzdHNfcXVpY2socG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBtKQoreworCXN0cnVj dCBtZF9wYWdlICpwdmg7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwlwdl9lbnRyeV90IHB2Owor CWludCBsb29wcyA9IDA7CisJYm9vbGVhbl90IHJ2OworCisJS0FTU0VSVCgobS0+b2ZsYWdzICYg VlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCIlczogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIs IF9fZnVuY19fLCBtKSk7CisJcnYgPSBGQUxTRTsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2Nr KTsKKwlsb2NrID0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcndfcmxvY2sobG9jayk7 CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25leHQpIHsKKwkJaWYgKFBW X1BNQVAocHYpID09IHBtYXApIHsKKwkJCXJ2ID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisJCWxv b3BzKys7CisJCWlmIChsb29wcyA+PSAxNikKKwkJCWJyZWFrOworCX0KKwlpZiAoIXJ2ICYmIGxv b3BzIDwgMTYgJiYgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCkgeworCQlwdmggPSBw YV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwkJVEFJTFFfRk9SRUFDSChwdiwgJnB2aC0+ cHZfbGlzdCwgcHZfbmV4dCkgeworCQkJaWYgKFBWX1BNQVAocHYpID09IHBtYXApIHsKKwkJCQly diA9IFRSVUU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlsb29wcysrOworCQkJaWYgKGxvb3BzID49 IDE2KQorCQkJCWJyZWFrOworCQl9CisJfQorCXJ3X3J1bmxvY2sobG9jayk7CisJcndfcnVubG9j aygmcHZoX2dsb2JhbF9sb2NrKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqCXBtYXBfcGFn ZV93aXJlZF9tYXBwaW5nczoKKyAqCisgKglSZXR1cm4gdGhlIG51bWJlciBvZiBtYW5hZ2VkIG1h cHBpbmdzIHRvIHRoZSBnaXZlbiBwaHlzaWNhbCBwYWdlCisgKgl0aGF0IGFyZSB3aXJlZC4KKyAq LworaW50CitwbWFwX3BhZ2Vfd2lyZWRfbWFwcGluZ3Modm1fcGFnZV90IG0pCit7CisJc3RydWN0 IHJ3bG9jayAqbG9jazsKKwlwdl9lbnRyeV90IHB2OworCXBtYXBfdCBwbWFwOworCXB0X2VudHJ5 X3QgKnB0ZTsKKwlpbnQgY291bnQsIG1kX2dlbjsKKworCWlmICgobS0+b2ZsYWdzICYgVlBPX1VO TUFOQUdFRCkgIT0gMCkKKwkJcmV0dXJuICgwKTsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2Nr KTsKKwlsb2NrID0gVk1fUEFHRV9UT19QVl9MSVNUX0xPQ0sobSk7CisJcndfcmxvY2sobG9jayk7 CityZXN0YXJ0OgorCWNvdW50ID0gMDsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlz dCwgcHZfbmV4dCkgeworCQlwbWFwID0gUFZfUE1BUChwdik7CisJCWlmICghUE1BUF9UUllMT0NL KHBtYXApKSB7CisJCQltZF9nZW4gPSBtLT5tZC5wdl9nZW47CisJCQlyd19ydW5sb2NrKGxvY2sp OworCQkJUE1BUF9MT0NLKHBtYXApOworCQkJcndfcmxvY2sobG9jayk7CisJCQlpZiAobWRfZ2Vu ICE9IG0tPm1kLnB2X2dlbikgeworCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJCWdvdG8gcmVz dGFydDsKKwkJCX0KKwkJfQorCQlwdGUgPSBwbWFwX3B0ZShwbWFwLCBwdi0+cHZfdmEpOworCQlp ZiAocHRlX3Rlc3QocHRlLCBQVEVfVykpCisJCQljb3VudCsrOworCQlQTUFQX1VOTE9DSyhwbWFw KTsKKwl9CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpID09IDApIHsKKwkJc3RydWN0 IG1kX3BhZ2UgKnB2aCA9IHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQlUQUlMUV9G T1JFQUNIKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0KSB7CisJCQlwbWFwID0gUFZfUE1BUChw dik7CisJCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJCWludCBwdmhfZ2VuID0gcHZo LT5wdl9nZW47CisJCQkJbWRfZ2VuID0gbS0+bWQucHZfZ2VuOworCQkJCXJ3X3J1bmxvY2sobG9j ayk7CisJCQkJUE1BUF9MT0NLKHBtYXApOworCQkJCXJ3X3Jsb2NrKGxvY2spOworCQkJCWlmICht ZF9nZW4gIT0gbS0+bWQucHZfZ2VuIHx8CisJCQkJICAgIHB2aF9nZW4gIT0gcHZoLT5wdl9nZW4p IHsKKwkJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJCWdvdG8gcmVzdGFydDsKKwkJCQl9CisJ CQl9CisJCQlwZF9lbnRyeV90ICpwZGUgPSBwbWFwX3BkZShwbWFwLCBwdi0+cHZfdmEpOworCQkJ aWYgKHB0ZV90ZXN0KChwdF9lbnRyeV90ICopcGRlLCBQVEVfVykpCisJCQkJY291bnQrKzsKKwkJ CVBNQVBfVU5MT0NLKHBtYXApOworCQl9CisJfQorCXJ3X3J1bmxvY2sobG9jayk7CisJcndfcnVu bG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlyZXR1cm4gKGNvdW50KTsKK30KKworI2lmIDAKKy8q CisgKiAgUmV0dXJucyBUUlVFIGlmIHRoZSBnaXZlbiBwYWdlIGlzIG1hcHBlZCBpbmRpdmlkdWFs bHkgb3IgYXMgcGFydCBvZgorICogIGEgMm1wYWdlLiBPdGhlcndpc2UsIHJldHVybnMgRkFMU0Uu CisgKi8KK2Jvb2xlYW5fdAorcG1hcF9wYWdlX2lzX21hcHBlZCh2bV9wYWdlX3QgbSkKK3sKKwlz dHJ1Y3Qgcndsb2NrICpsb2NrOworCWJvb2xlYW5fdCBydjsKKworCWlmICgobS0+b2ZsYWdzICYg VlBPX1VOTUFOQUdFRCkgIT0gMCkKKwkJcmV0dXJuIChGQUxTRSk7CisJcndfcmxvY2soJnB2aF9n bG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9MT0NLKG0pOworCXJ3X3Js b2NrKGxvY2spOworCXJ2ID0gIVRBSUxRX0VNUFRZKCZtLT5tZC5wdl9saXN0KSB8fAorCSAgICAo KG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykgPT0gMCAmJgorCQkhVEFJTFFfRU1QVFkoJnBhX3Rv X3B2aChWTV9QQUdFX1RPX1BIWVMobSkpLT5wdl9saXN0KSk7CisJcndfcnVubG9jayhsb2NrKTsK Kwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCXJldHVybiAocnYpOworfQorI2VuZGlm CisKKy8qCisgKiBEZXN0cm95IGFsbCBtYW5hZ2VkLCBub24td2lyZWQgbWFwcGluZ3MgaW4gdGhl IGdpdmVuIHVzZXItc3BhY2UKKyAqIHBtYXAuICBUaGlzIHBtYXAgY2Fubm90IGJlIGFjdGl2ZSBv biBhbnkgcHJvY2Vzc29yIGJlc2lkZXMgdGhlCisgKiBjYWxsZXIuCisgKgorICogVGhpcyBmdW5j dGlvbiBjYW5ub3QgYmUgYXBwbGllZCB0byB0aGUga2VybmVsIHBtYXAuICBNb3Jlb3ZlciwgaXQK KyAqIGlzIG5vdCBpbnRlbmRlZCBmb3IgZ2VuZXJhbCB1c2UuICBJdCBpcyBvbmx5IHRvIGJlIHVz ZWQgZHVyaW5nCisgKiBwcm9jZXNzIHRlcm1pbmF0aW9uLiAgQ29uc2VxdWVudGx5LCBpdCBjYW4g YmUgaW1wbGVtZW50ZWQgaW4gd2F5cworICogdGhhdCBtYWtlIGl0IGZhc3RlciB0aGFuIHBtYXBf cmVtb3ZlKCkuICBGaXJzdCwgaXQgY2FuIG1vcmUgcXVpY2tseQorICogZGVzdHJveSBtYXBwaW5n cyBieSBpdGVyYXRpbmcgb3ZlciB0aGUgcG1hcCdzIGNvbGxlY3Rpb24gb2YgUFYKKyAqIGVudHJp ZXMsIHJhdGhlciB0aGFuIHNlYXJjaGluZyB0aGUgcGFnZSB0YWJsZS4gIFNlY29uZCwgaXQgZG9l c24ndAorICogaGF2ZSB0byB0ZXN0IGFuZCBjbGVhciB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzIGF0 b21pY2FsbHksIGJlY2F1c2UKKyAqIG5vIHByb2Nlc3NvciBpcyBjdXJyZW50bHkgYWNjZXNzaW5n IHRoZSB1c2VyIGFkZHJlc3Mgc3BhY2UuICBJbgorICogcGFydGljdWxhciwgYSBwYWdlIHRhYmxl IGVudHJ5J3MgZGlydHkgYml0IHdvbid0IGNoYW5nZSBzdGF0ZSBvbmNlCisgKiB0aGlzIGZ1bmN0 aW9uIHN0YXJ0cy4KKyAqLwordm9pZAorcG1hcF9yZW1vdmVfcGFnZXMocG1hcF90IHBtYXApCit7 CisJcGRfZW50cnlfdCBwdGVwZGUsICpwZGU7CisJcHRfZW50cnlfdCAqcHRlLCB0cHRlOworCXN0 cnVjdCBzcGdsaXN0IGZyZWU7CisJdm1fcGFnZV90IG0sIG1wdGUsIG10OworCXB2X2VudHJ5X3Qg cHY7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlzdHJ1Y3QgcHZfY2h1bmsgKnBjLCAqbnBjOwor CXN0cnVjdCByd2xvY2sgKmxvY2s7CisJaW50IGJpdDsKKwl1aW50NjRfdCBpbnVzZSwgYml0bWFz azsKKwlpbnQgYWxsZnJlZSwgZmllbGQsIGZyZWVkLCBpZHg7CisJYm9vbGVhbl90IHN1cGVycGFn ZTsKKwl2bV9wYWRkcl90IHBhOworCisJLyoKKwkgKiBBc3NlcnQgdGhhdCB0aGUgZ2l2ZW4gcG1h cCBpcyBvbmx5IGFjdGl2ZSBvbiB0aGUgY3VycmVudAorCSAqIENQVS4gIFVuZm9ydHVuYXRlbHks IHdlIGNhbm5vdCBibG9jayBhbm90aGVyIENQVSBmcm9tCisJICogYWN0aXZhdGluZyB0aGUgcG1h cCB3aGlsZSB0aGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGluZy4KKwkgKi8KKwlLQVNTRVJUKHBtYXAg PT0gdm1zcGFjZV9wbWFwKGN1cnRocmVhZC0+dGRfcHJvYy0+cF92bXNwYWNlKSwKKwkgICAgKCIl czogbm9uLWN1cnJlbnQgcG1hcCAlcCIsIF9fZnVuY19fLCBwbWFwKSk7CisKKwlsb2NrID0gTlVM TDsKKwlTTElTVF9JTklUKCZmcmVlKTsKKwlyd19ybG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKKwlQ TUFQX0xPQ0socG1hcCk7CisJVEFJTFFfRk9SRUFDSF9TQUZFKHBjLCAmcG1hcC0+cG1fcHZjaHVu aywgcGNfbGlzdCwgbnBjKSB7CisJCWFsbGZyZWUgPSAxOworCQlmcmVlZCA9IDA7CisJCWZvciAo ZmllbGQgPSAwOyBmaWVsZCA8IF9OUENNOyBmaWVsZCsrKSB7CisJCQlpbnVzZSA9IH5wYy0+cGNf bWFwW2ZpZWxkXSAmIHBjX2ZyZWVtYXNrW2ZpZWxkXTsKKwkJCXdoaWxlIChpbnVzZSAhPSAwKSB7 CisJCQkJYml0ID0gZmZzbChpbnVzZSkgLSAxOworCQkJCWJpdG1hc2sgPSAxVUwgPDwgYml0Owor CQkJCWlkeCA9IGZpZWxkICogc2l6ZW9mKGludXNlKSAqIE5CQlkgKyBiaXQ7CisJCQkJcHYgPSAm cGMtPnBjX3B2ZW50cnlbaWR4XTsKKwkJCQlpbnVzZSAmPSB+Yml0bWFzazsKKworCQkJCXBkZSA9 IHBtYXBfc2VnbWFwKHBtYXAsIHB2LT5wdl92YSk7CisJCQkJcHRlcGRlID0gKnBkZTsKKwkJCQlw ZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkZSwgcHYtPnB2X3ZhKTsKKwkJCQlpZiAocGRlX2lzXzFt X3N1cGVycGFnZShwZGUpKSB7CisJCQkJCXN1cGVycGFnZSA9IFRSVUU7CisJCQkJCXB0ZSA9IChw dF9lbnRyeV90ICopcGRlOworCQkJCX0gZWxzZSB7CisJCQkJCXN1cGVycGFnZSA9IEZBTFNFOwor CQkJCQlwdGVwZGUgPSAqcGRlOworCQkJCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBwdi0+ cHZfdmEpOworCQkJCX0KKwkJCQl0cHRlID0gKnB0ZTsKKwkJCQlpZiAoIXB0ZV9pc192YWxpZChw dGUpKSAgeworCQkJCQlwYW5pYygiJXM6IGJhZCAlcyBwdGUgdmEgJWx4IHB0ZSAlbHgiLAorCQkJ CQkgICAgX19mdW5jX18sIHN1cGVycGFnZSA/ICJzdXBlcnBhZ2UiIDoKKwkJCQkJICAgICIiLCBw di0+cHZfdmEsIHRwdGUpOworCQkJCX0KKworLyoKKyAqIFdlIGNhbm5vdCByZW1vdmUgd2lyZWQg cGFnZXMgZnJvbSBhIHByb2Nlc3MnIG1hcHBpbmcgYXQgdGhpcyB0aW1lCisgKi8KKwkJCQlpZiAo cHRlX3Rlc3QoJnRwdGUsIFBURV9XKSkgeworCQkJCQlhbGxmcmVlID0gMDsKKwkJCQkJY29udGlu dWU7CisJCQkJfQorCisJCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEodHB0ZSk7CisJCQkJaWYgKHN1 cGVycGFnZSkKKwkJCQkJcGEgJj0gflBEUk1BU0s7CisJCQkJbSA9IFBIWVNfVE9fVk1fUEFHRShw YSk7CisJCQkJS0FTU0VSVChtLT5waHlzX2FkZHIgPT0gcGEsCisJCQkJICAgICgiJXM6IHZtX3Bh Z2VfdCAlcCBwaHlzX2FkZHIgbWlzbWF0Y2ggIgorCQkJCSAgICAiJTAxNmp4ICUwMTZqeCIsIF9f ZnVuY19fLCBtLAorCQkJCSAgICAodWludG1heF90KW0tPnBoeXNfYWRkciwgKHVpbnRtYXhfdCl0 cHRlKSk7CisKKwkJCQlLQVNTRVJUKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDAgfHwK KwkJCQkgICAgbSA8ICZ2bV9wYWdlX2FycmF5W3ZtX3BhZ2VfYXJyYXlfc2l6ZV0sCisJCQkJICAg ICgiJXM6IGJhZCB0cHRlICUjangiLCBfX2Z1bmNfXywKKwkJCQkgICAgKHVpbnRtYXhfdCl0cHRl KSk7CisKKwkJCQkvKiBDbGVhciBQVEUgKi8KKwkJCQlpZiAoc3VwZXJwYWdlKQorCQkJCQlwdGVf c3RvcmUocHRlLCAwKTsKKwkJCQllbHNlCisJCQkJCXB0ZV9zdG9yZShwdGUsIGlzX2tlcm5lbF9w bWFwKHBtYXApID8KKwkJCQkJICAgIFBURV9HIDogMCk7CisKKwkJCQkvKgorCQkJCSAqIFVwZGF0 ZSB0aGUgdm1fcGFnZV90IGNsZWFuIGFuZCByZWZlcmVuY2UgYml0cworCQkJCSAqLworCQkJCWlm IChwdGVfdGVzdCgmdHB0ZSwgUFRFX0QpICYmCisJCQkJICAgICFwdGVfdGVzdCgmdHB0ZSwgUFRF X1JPKSkgeworCQkJCQlpZiAoc3VwZXJwYWdlKSB7CisJCQkJCQl2bV9wYWdlX3QgbXQ7CisKKwkJ CQkJCWZvciAobXQgPSBtOyBtdCA8ICZtW05CUERSIC8gUEFHRV9TSVpFXTsgbXQrKykKKwkJCQkJ CQl2bV9wYWdlX2RpcnR5KG10KTsKKwkJCQkJfSBlbHNlCisJCQkJCQl2bV9wYWdlX2RpcnR5KG0p OworCQkJCX0KKworCQkJCUNIQU5HRV9QVl9MSVNUX0xPQ0tfVE9fVk1fUEFHRSgmbG9jaywgbSk7 CisKKwkJCQkvKiBNYXJrIGZyZWUgKi8KKwkJCQlwYy0+cGNfbWFwW2ZpZWxkXSB8PSBiaXRtYXNr OworCQkJCWlmIChzdXBlcnBhZ2UpIHsKKwkJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1h cCwgTkJQRFIgLyBQQUdFX1NJWkUpOworCQkJCQlwdmggPSBwYV90b19wdmgoVExCTE9fUFRFX1RP X1BBKHRwdGUpKTsKKwkJCQkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9uZXh0 KTsKKwkJCQkJcHZoLT5wdl9nZW4rKzsKKwkJCQkJaWYgKFRBSUxRX0VNUFRZKCZwdmgtPnB2X2xp c3QpKSB7CisJCQkJCQlmb3IgKG10ID0gbTsgbXQgPCAmbVtOQlBEUiAvIFBBR0VfU0laRV07IG10 KyspCisJCQkJCQkJaWYgKFRBSUxRX0VNUFRZKCZtdC0+bWQucHZfbGlzdCkpCisJCQkJCQkJCXZt X3BhZ2VfYWZsYWdfY2xlYXIobXQsIFBHQV9XUklURUFCTEUpOworCQkJCQl9CisJCQkJCW1wdGUg PSBwbWFwX2xvb2t1cF9wdF9wYWdlKHBtYXAsIHB2LT5wdl92YSk7CisJCQkJCWlmIChtcHRlICE9 IE5VTEwpIHsKKwkJCQkJCXBtYXBfcmVtb3ZlX3B0X3BhZ2UocG1hcCwgbXB0ZSk7CisJCQkJCQlw bWFwX3Jlc2lkZW50X2NvdW50X2RlYyhwbWFwLCAxKTsKKwkJCQkJCUtBU1NFUlQobXB0ZS0+d2ly ZV9jb3VudCA9PSBOUFRFUEcsCisJCQkJCQkgICAgKCIlczogcHRlIHBhZ2Ugd2lyZSBjb3VudCBl cnJvciIsCisJCQkJCQkgICAgX19mdW5jX18pKTsKKwkJCQkJCW1wdGUtPndpcmVfY291bnQgPSAw OworCQkJCQkJcG1hcF9hZGRfZGVsYXllZF9mcmVlX2xpc3QobXB0ZSwgJmZyZWUsIEZBTFNFKTsK KwkJCQkJCWF0b21pY19zdWJ0cmFjdF9pbnQoJnZtX2NudC52X3dpcmVfY291bnQsIDEpOworCQkJ CQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcG1hcF9yZXNpZGVudF9jb3VudF9kZWMocG1hcCwgMSk7 CisJCQkJCVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOworCQkJCQlt LT5tZC5wdl9nZW4rKzsKKwkJCQkJaWYgKChtLT5hZmxhZ3MgJiBQR0FfV1JJVEVBQkxFKSAhPSAw ICYmCisJCQkJCSAgICBUQUlMUV9FTVBUWSgmbS0+bWQucHZfbGlzdCkgJiYKKwkJCQkJICAgICht LT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpID09IDApIHsKKwkJCQkJCXB2aCA9IHBhX3RvX3B2aChW TV9QQUdFX1RPX1BIWVMobSkpOworCQkJCQkJaWYgKFRBSUxRX0VNUFRZKCZwdmgtPnB2X2xpc3Qp KQorCQkJCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJMRSk7CisJCQkJCX0K KwkJCQl9CisJCQkJcG1hcF91bnVzZV9wdChwbWFwLCBwdi0+cHZfdmEsIHB0ZXBkZSwgJmZyZWUp OworCQkJCWZyZWVkKys7CisJCQl9CisJCX0KKwkJUFZfU1RBVChhdG9taWNfYWRkX2xvbmcoJnB2 X2VudHJ5X2ZyZWVzLCBmcmVlZCkpOworCQlQVl9TVEFUKGF0b21pY19hZGRfaW50KCZwdl9lbnRy eV9zcGFyZSwgZnJlZWQpKTsKKwkJUFZfU1RBVChhdG9taWNfc3VidHJhY3RfbG9uZygmcHZfZW50 cnlfY291bnQsIGZyZWVkKSk7CisJCWlmIChhbGxmcmVlKSB7CisJCQlUQUlMUV9SRU1PVkUoJnBt YXAtPnBtX3B2Y2h1bmssIHBjLCBwY19saXN0KTsKKwkJCWZyZWVfcHZfY2h1bmsocGMpOworCQl9 CisJfQorCWlmIChsb2NrICE9IE5VTEwpCisJCXJ3X3d1bmxvY2sobG9jayk7CisJcG1hcF9pbnZh bGlkYXRlX2FsbChwbWFwKTsKKwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlyd19ydW5sb2NrKCZwdmhf Z2xvYmFsX2xvY2spOworCXBtYXBfZnJlZV96ZXJvX3BhZ2VzKCZmcmVlKTsKK30KKworLyoKKyAq IENsZWFyIHRoZSB3cml0ZSBhbmQgbW9kaWZpZWQgYml0cyBpbiBlYWNoIG9mIHRoZSBnaXZlbiBw YWdlJ3MgbWFwcGluZ3MuCisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX3dyaXRlKHZtX3BhZ2VfdCBt KQoreworCXN0cnVjdCBtZF9wYWdlICpwdmg7CisJdm1fb2Zmc2V0X3QgdmE7CisJcHZfZW50cnlf dCBuZXh0X3B2OworCWludCBwdmhfZ2VuOworCXBtYXBfdCBwbWFwOworCXN0cnVjdCByd2xvY2sg KmxvY2s7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3Qgb2xkcHRlLCAqcHRlOworCXB2 X2VudHJ5X3QgcHY7CisJaW50IG1kX2dlbjsKKworCUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQT19V Tk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9yZW1vdmVfd3JpdGU6IHBhZ2UgJXAgaXMgbm90 IG1hbmFnZWQiLCBtKSk7CisKKwkvKgorCSAqIElmIHRoZSBwYWdlIGlzIG5vdCBleGNsdXNpdmUg YnVzaWVkLCB0aGVuIFBHQV9XUklURUFCTEUgY2Fubm90IGJlCisJICogc2V0IGJ5IGFub3RoZXIg dGhyZWFkIHdoaWxlIHRoZSBvYmplY3QgaXMgbG9ja2VkLiAgVGh1cywKKwkgKiBpZiBQR0FfV1JJ VEVBQkxFIGlzIGNsZWFyLCBubyBwYWdlIHRhYmxlIGVudHJpZXMgbmVlZCB1cGRhdGluZy4KKwkg Ki8KKwlWTV9PQkpFQ1RfQVNTRVJUX1dMT0NLRUQobS0+b2JqZWN0KTsKKwlpZiAoIXZtX3BhZ2Vf eGJ1c2llZChtKSAmJiAobS0+YWZsYWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkKKwkJcmV0dXJu OworCXJ3X3Jsb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCWxvY2sgPSBWTV9QQUdFX1RPX1BWX0xJ U1RfTE9DSyhtKTsKKwlwdmggPSBwYV90b19wdmgoVk1fUEFHRV9UT19QSFlTKG0pKTsKK3JldHJ5 X3B2X2xvb3A6CisJcndfd2xvY2sobG9jayk7CisJaWYgKChtLT5mbGFncyAmIFBHX0ZJQ1RJVElP VVMpICE9IDApCisJCWdvdG8gc21hbGxfbWFwcGluZ3M7CisJVEFJTFFfRk9SRUFDSF9TQUZFKHB2 LCAmcHZoLT5wdl9saXN0LCBwdl9uZXh0LCBuZXh0X3B2KSB7CisJCXBtYXAgPSBQVl9QTUFQKHB2 KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dl bjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJCQlyd193bG9j ayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxP Q0socG1hcCk7CisJCQkJcndfd3VubG9jayhsb2NrKTsKKwkJCQlnb3RvIHJldHJ5X3B2X2xvb3A7 CisJCQl9CisJCX0KKwkJdmEgPSBwdi0+cHZfdmE7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZh KTsKKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSAmJiAhcGRlX3Rlc3QocGRlLCBQVEVf Uk8pKQorCQkJKHZvaWQpcG1hcF9kZW1vdGVfcGRlX2xvY2tlZChwbWFwLCBwZGUsIHZhLCAmbG9j ayk7CisJCUtBU1NFUlQobG9jayA9PSBWTV9QQUdFX1RPX1BWX0xJU1RfTE9DSyhtKSwKKwkJICAg ICgiaW5jb25zaXN0ZW50IHB2IGxvY2sgJXAgJXAgZm9yIHBhZ2UgJXAiLAorCQkgICAgbG9jaywg Vk1fUEFHRV9UT19QVl9MSVNUX0xPQ0sobSksIG0pKTsKKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJ fQorc21hbGxfbWFwcGluZ3M6CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2 X25leHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFw KSkgeworCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJbWRfZ2VuID0gbS0+bWQucHZfZ2Vu OworCQkJcndfd3VubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3dsb2Nr KGxvY2spOworCQkJaWYgKHB2aF9nZW4gIT0gcHZoLT5wdl9nZW4gfHwKKwkJCSAgICBtZF9nZW4g IT0gbS0+bWQucHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJCQkJcndfd3VubG9j ayhsb2NrKTsKKwkJCQlnb3RvIHJldHJ5X3B2X2xvb3A7CisJCQl9CisJCX0KKwkJcGRlID0gcG1h cF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJS0FTU0VSVCghcGRlX2lzX3N1cGVycGFnZShwZGUp LAorCQkgICAgKCIlczogZm91bmQgYSBzdXBlcnBhZ2UgaW4gcGFnZSAlcCdzIHB2IGxpc3QiLAor CQkgICAgX19mdW5jX18sIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgcHYtPnB2 X3ZhKTsKKwkJS0FTU0VSVChwdGUgIT0gTlVMTCAmJiBwdGVfaXNfdmFsaWQocHRlKSwKKwkJICAg ICgiJXM6cGFnZSBvbiBwdl9saXN0IGhhcyBubyBwdGUiLCBfX2Z1bmNfXykpOworcmV0cnk6CisJ CW9sZHB0ZSA9ICpwdGU7CisJCWlmICghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1JPKSkgeworCQkJ aWYgKCFhdG9taWNfY21wc2V0X2xvbmcocHRlLCBvbGRwdGUsCisJCQkgICAgKChvbGRwdGUgJiB+ UFRFX0QpIHwgUFRFX1JPKSkpCisJCQkJZ290byByZXRyeTsKKwkJCWlmIChwdGVfdGVzdCgmb2xk cHRlLCBQVEVfRCkpCisJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJCXBtYXBfaW52YWxpZGF0ZV9w YWdlKHBtYXAsIHB2LT5wdl92YSk7CisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQorCXZt X3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJMRSk7CisJcndfd3VubG9jayhsb2NrKTsK Kwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworfQorCisjZGVmaW5lCVBNQVBfVFNfUkVG RVJFTkNFRF9NQVgJNQorCisvKi0KKyAqCXBtYXBfdHNfcmVmZXJlbmNlZDoKKyAqCisgKiAgUmV0 dXJuIGEgY291bnQgb2YgcGFnZXMgdGhhdCBoYXZlIGJlZW4gcmVmZXJlbmNlZCwgYW5kIHJlc2V0 IHRoZQorICogIHJlZmVyZW5jZSBiaXQuICBJdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBldmVyeSBy ZWZlcmVuY2UgYml0IHRvIGJlCisgKiAgcmVzZXQsIGJ1dCBpdCBpcyBuZWNlc3NhcnkgdGhhdCAw IG9ubHkgYmUgcmV0dXJuZWQgd2hlbiB0aGVyZSBhcmUKKyAqICB0cnVseSBoYXZlIGJlZW4gcGFn ZXMgcmVmZXJlbmNlZC4KKyAqCisgKiAgWFhYOiBUaGUgZXhhY3QgbnVtYmVyIG9mIGZsYWdzIHRv IGNoZWNrIGFuZCByZXNldCBpcyBhIG1hdHRlciB0aGF0CisgKiAgc2hvdWxkIGJlIHRlc3RlZCBh bmQgc3RhbmRhcmRpemVkIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSBmb3IKKyAqICBvcHRp bWFsIGFnaW5nIG9mIHNoYXJlZCBwYWdlcy4KKyAqLworaW50CitwbWFwX3RzX3JlZmVyZW5jZWQo dm1fcGFnZV90IG0pCit7CisJc3RydWN0IG1kX3BhZ2UgKnB2aDsKKwlwdl9lbnRyeV90IHB2LCBw dmY7CisJcG1hcF90IHBtYXA7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwlwZF9lbnRyeV90ICpw ZGU7CisJcHRfZW50cnlfdCAqcHRlOworCXZtX29mZnNldF90IHZhOworCXZtX3BhZGRyX3QgcGE7 CisJaW50IGNsZWFyZWQsIG1kX2dlbiwgbm90X2NsZWFyZWQsIHB2aF9nZW47CisKKwlLQVNTRVJU KChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwLAorCSAgICAoInBtYXBfdHNfcmVmZXJl bmNlZDogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwljbGVhcmVkID0gMDsKKwlwYSA9 IFZNX1BBR0VfVE9fUEhZUyhtKTsKKwlsb2NrID0gUEhZU19UT19QVl9MSVNUX0xPQ0socGEpOwor CXB2aCA9IHBhX3RvX3B2aChwYSk7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJcndf d2xvY2sobG9jayk7CityZXRyeToKKwlub3RfY2xlYXJlZCA9IDA7CisJaWYgKChtLT5mbGFncyAm IFBHX0ZJQ1RJVElPVVMpICE9IDAgfHwKKwkgICAgKHB2ZiA9IFRBSUxRX0ZJUlNUKCZwdmgtPnB2 X2xpc3QpKSA9PSBOVUxMKQorCQlnb3RvIHNtYWxsX21hcHBpbmdzOworCXB2ID0gcHZmOworCWRv IHsKKwkJaWYgKHB2ZiA9PSBOVUxMKQorCQkJcHZmID0gcHY7CisJCXBtYXAgPSBQVl9QTUFQKHB2 KTsKKwkJaWYgKCFQTUFQX1RSWUxPQ0socG1hcCkpIHsKKwkJCXB2aF9nZW4gPSBwdmgtPnB2X2dl bjsKKwkJCXJ3X3d1bmxvY2sobG9jayk7CisJCQlQTUFQX0xPQ0socG1hcCk7CisJCQlyd193bG9j ayhsb2NrKTsKKwkJCWlmIChwdmhfZ2VuICE9IHB2aC0+cHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxP Q0socG1hcCk7CisJCQkJZ290byByZXRyeTsKKwkJCX0KKwkJfQorCQl2YSA9IHB2LT5wdl92YTsK KwkJcGRlID0gcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJaWYgKHB0ZV9pc19yZWYoKHB0 X2VudHJ5X3QgKilwZGUpKSB7CisJCQkvKgorCQkJICogU2luY2UgdGhpcyByZWZlcmVuY2UgYml0 IGlzIHNoYXJlZCBieSA1MTIgNEtCCisJCQkgKiBwYWdlcywgaXQgc2hvdWxkIG5vdCBiZSBjbGVh cmVkIGV2ZXJ5IHRpbWUgaXQgaXMKKwkJCSAqIHRlc3RlZC4gIEFwcGx5IGEgc2ltcGxlICJoYXNo IiBmdW5jdGlvbiBvbiB0aGUKKwkJCSAqIHBoeXNpY2FsIHBhZ2UgbnVtYmVyLCB0aGUgdmlydHVh bCBzdXBlcnBhZ2UgbnVtYmVyLAorCQkJICogYW5kIHRoZSBwbWFwIGFkZHJlc3MgdG8gc2VsZWN0 IG9uZSA0S0IgcGFnZSBvdXQgb2YKKwkJCSAqIHRoZSA1MTIgb24gd2hpY2ggdGVzdGluZyB0aGUg cmVmZXJlbmNlIGJpdCB3aWxsCisJCQkgKiByZXN1bHQgaW4gY2xlYXJpbmcgdGhhdCByZWZlcmVu Y2UgYml0LiAgVGhpcworCQkJICogZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYXZvaWQgdGhlIHNl bGVjdGlvbiBvZiB0aGUKKwkJCSAqIHNhbWUgNEtCIHBhZ2UgZm9yIGV2ZXJ5IDJNQiBwYWdlIG1h cHBpbmcuCisJCQkgKgorCQkJICogT24gZGVtb3Rpb24sIGEgbWFwcGluZyB0aGF0IGhhc24ndCBi ZWVuIHJlZmVyZW5jZWQKKwkJCSAqIGlzIHNpbXBseSBkZXN0cm95ZWQuICBUbyBhdm9pZCB0aGUg cG9zc2liaWxpdHkgb2YgYQorCQkJICogc3Vic2VxdWVudCBwYWdlIGZhdWx0IG9uIGEgZGVtb3Rl ZCB3aXJlZCBtYXBwaW5nLAorCQkJICogYWx3YXlzIGxlYXZlIGl0cyByZWZlcmVuY2UgYml0IHNl dC4gIE1vcmVvdmVyLAorCQkJICogc2luY2UgdGhlIHN1cGVycGFnZSBpcyB3aXJlZCwgdGhlIGN1 cnJlbnQgc3RhdGUgb2YKKwkJCSAqIGl0cyByZWZlcmVuY2UgYml0IHdvbid0IGFmZmVjdCBwYWdl IHJlcGxhY2VtZW50LgorCQkJICovCisJCQlpZiAoKCgocGEgPj4gUEFHRV9TSElGVCkgXiAocHYt PnB2X3ZhID4+IFBEUlNISUZUKSBeCisJCQkgICAgKHVpbnRwdHJfdClwbWFwKSAmIChOUFRFUEcg LSAxKSkgPT0gMCAmJgorCQkJICAgICFwZGVfdGVzdChwZGUsIFBURV9XKSkgeworCQkJCWF0b21p Y19jbGVhcl9sb25nKChwdF9lbnRyeV90ICopcGRlLCBQVEVfUkVGKTsKKwkJCQlwbWFwX2ludmFs aWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQkJCWNsZWFyZWQrKzsKKwkJCX0gZWxzZQor CQkJCW5vdF9jbGVhcmVkKys7CisKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJLyogUm90 YXRlIHRoZSBQViBsaXN0IGlmIGl0IGhhcyBtb3JlIHRoYW4gb25lIGVudHJ5LiAqLworCQlpZiAo cHYgIT0gTlVMTCAmJiBUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSAhPSBOVUxMKSB7CisJCQlUQUlM UV9SRU1PVkUoJnB2aC0+cHZfbGlzdCwgcHYsIHB2X25leHQpOworCQkJVEFJTFFfSU5TRVJUX1RB SUwoJnB2aC0+cHZfbGlzdCwgcHYsIHB2X25leHQpOworCQl9CisJCWlmICgoY2xlYXJlZCArIG5v dF9jbGVhcmVkKSA+PSBQTUFQX1RTX1JFRkVSRU5DRURfTUFYKQorCQkJZ290byBvdXQ7CisJfSB3 aGlsZSAoKHB2ID0gVEFJTFFfRklSU1QoJnB2aC0+cHZfbGlzdCkpICE9IHB2Zik7CitzbWFsbF9t YXBwaW5nczoKKwlpZiAoKHB2ZiA9IFRBSUxRX0ZJUlNUKCZtLT5tZC5wdl9saXN0KSkgPT0gTlVM TCkKKwkJZ290byBvdXQ7CisJcHYgPSBwdmY7CisJZG8geworCQlpZiAocHZmID09IE5VTEwpCisJ CQlwdmYgPSBwdjsKKwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhw bWFwKSkgeworCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJbWRfZ2VuID0gbS0+bWQucHZf Z2VuOworCQkJcndfd3VubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3ds b2NrKGxvY2spOworCQkJaWYgKAorCQkJICAgIHB2aF9nZW4gIT0gcHZoLT5wdl9nZW4gfHwKKwkJ CSAgICBtZF9nZW4gIT0gbS0+bWQucHZfZ2VuKSB7CisJCQkJUE1BUF9VTkxPQ0socG1hcCk7CisJ CQkJZ290byByZXRyeTsKKwkJCX0KKwkJfQorCisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHB2LT5w dl92YSk7CisJCUtBU1NFUlQoIXBkZV9pc19zdXBlcnBhZ2UocGRlKSwKKwkJICAgICgicG1hcF90 c19yZWZlcmVuY2VkOiBmb3VuZCBzdXBlcnBhZ2UgaW4gcGFnZSAlcCdzIHB2IGxpc3QiLAorCQkg ICAgbSkpOworCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBwdi0+cHZfdmEpOworCQlpZiAo cHRlX2lzX3JlZihwdGUpKSB7CisJCQlhdG9taWNfY2xlYXJfbG9uZygocHRfZW50cnlfdCAqKXBk ZSwgUFRFX1JFRik7CisJCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOwor CQkJY2xlYXJlZCsrOworCQl9CisJCVBNQVBfVU5MT0NLKHBtYXApOworCQkvKiBSb3RhdGUgdGhl IFBWIGxpc3QgaWYgaXQgaGFzIG1vcmUgdGhhbiBvbmUgZW50cnkuICovCisJCWlmIChwdiAhPSBO VUxMICYmIFRBSUxRX05FWFQocHYsIHB2X25leHQpICE9IE5VTEwpIHsKKwkJCVRBSUxRX1JFTU9W RSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOworCQkJVEFJTFFfSU5TRVJUX1RBSUwoJm0t Pm1kLnB2X2xpc3QsIHB2LCBwdl9uZXh0KTsKKwkJCW0tPm1kLnB2X2dlbisrOworCQl9CisJfSB3 aGlsZSAoKHB2ID0gVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xpc3QpKSAhPSBwdmYgJiYgY2xlYXJl ZCArCisJICAgIG5vdF9jbGVhcmVkIDwgUE1BUF9UU19SRUZFUkVOQ0VEX01BWCk7CitvdXQ6CisJ cndfd3VubG9jayhsb2NrKTsKKwlyd19ydW5sb2NrKCZwdmhfZ2xvYmFsX2xvY2spOworCXJldHVy biAoY2xlYXJlZCArIG5vdF9jbGVhcmVkKTsKK30KKworc3RhdGljIGJvb2xlYW5fdAorcG1hcF9w YWdlX3Rlc3RfbWFwcGluZ3Modm1fcGFnZV90IG0sIGJvb2xlYW5fdCBhY2Nlc3NlZCwgYm9vbGVh bl90IG1vZGlmaWVkKQoreworCXN0cnVjdCByd2xvY2sgKmxvY2s7CisJcHZfZW50cnlfdCBwdjsK KwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXB0X2VudHJ5X3QgKnB0ZTsKKwlwbWFwX3QgcG1hcDsK KwlpbnQgbWRfZ2VuLCBwdmhfZ2VuOworCWJvb2xlYW5fdCBydjsKKworCXJ2ID0gRkFMU0U7CisJ cndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0VfVE9fUFZfTElTVF9M T0NLKG0pOworCXJ3X3Jsb2NrKGxvY2spOworcmVzdGFydDoKKwlUQUlMUV9GT1JFQUNIKHB2LCAm bS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgeworCQlwbWFwID0gUFZfUE1BUChwdik7CisJCWlmICgh UE1BUF9UUllMT0NLKHBtYXApKSB7CisJCQkgbWRfZ2VuID0gbS0+bWQucHZfZ2VuOworCQkJIHJ3 X3J1bmxvY2sobG9jayk7CisJCQkgUE1BUF9MT0NLKHBtYXApOworCQkJIHJ3X3Jsb2NrKGxvY2sp OworCQkJIGlmIChtZF9nZW4gIT0gbS0+bWQucHZfZ2VuKSB7CisJCQkJIFBNQVBfVU5MT0NLKHBt YXApOworCQkJCSBnb3RvIHJlc3RhcnQ7CisJCQkgfQorCQl9CisJCXB0ZSA9IHBtYXBfcHRlKHBt YXAsIHB2LT5wdl92YSk7CisJCWlmIChtb2RpZmllZCkgeworCQkJcnYgPSBwdGVfdGVzdChwdGUs IFBURV9EKSAmJiAhcHRlX3Rlc3QocHRlLCBQVEVfUk8pOworCQkJaWYgKGFjY2Vzc2VkKQorCQkJ CXJ2ID0gcnYgJiYgcHRlX2lzX3ZhbGlkKHB0ZSkgJiYgcHRlX2lzX3JlZihwdGUpOworCQl9IGVs c2UgaWYgKGFjY2Vzc2VkKSB7CisJCQlydiA9IHB0ZV9pc192YWxpZChwdGUpICYmIHB0ZV9pc19y ZWYocHRlKTsKKwkJfQorCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJaWYgKHJ2KQorCQkJZ290byBv dXQ7CisJfQorCWlmICgobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSA9PSAwKSB7CisJCXB2aCA9 IHBhX3RvX3B2aChWTV9QQUdFX1RPX1BIWVMobSkpOworCQlUQUlMUV9GT1JFQUNIKHB2LCAmcHZo LT5wdl9saXN0LCBwdl9uZXh0KSB7CisJCQlwbWFwID0gUFZfUE1BUChwdik7CisJCQlpZiAoIVBN QVBfVFJZTE9DSyhwbWFwKSkgeworCQkJCW1kX2dlbiA9IG0tPm1kLnB2X2dlbjsKKwkJCQlwdmhf Z2VuID0gcHZoLT5wdl9nZW47CisJCQkJcndfcnVubG9jayhsb2NrKTsKKwkJCQlQTUFQX0xPQ0so cG1hcCk7CisJCQkJcndfcmxvY2sobG9jayk7CisJCQkJaWYgKG1kX2dlbiAhPSBtLT5tZC5wdl9n ZW4gfHwKKwkJCQkgICAgcHZoX2dlbiAhPSBwdmgtPnB2X2dlbikgeworCQkJCQlQTUFQX1VOTE9D SyhwbWFwKTsKKwkJCQkJZ290byByZXN0YXJ0OworCQkJCX0KKwkJCX0KKwkJCXB0ZSA9IChwdF9l bnRyeV90ICopcG1hcF9wZGUocG1hcCwgcHYtPnB2X3ZhKTsKKwkJCWlmIChtb2RpZmllZCkgewor CQkJCXJ2ID0gcHRlX3Rlc3QocHRlLCBQVEVfRCkgJiYKKwkJCQkgICAgIXB0ZV90ZXN0KHB0ZSwg UFRFX1JPKTsKKwkJCQlpZiAoYWNjZXNzZWQpCisJCQkJCXJ2ID0gcnYgJiYgcHRlX2lzX3ZhbGlk KHB0ZSkgJiYKKwkJCQkJICAgIHB0ZV9pc19yZWYocHRlKTsKKwkJCX0gZWxzZSBpZiAoYWNjZXNz ZWQpIHsKKwkJCQlydiA9IHB0ZV9pc192YWxpZChwdGUpICYmCisJCQkJICAgIHB0ZV9pc19yZWYo cHRlKTsKKwkJCX0KKwkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJaWYgKHJ2KQorCQkJCWdvdG8g b3V0OworCQl9CisJfQorb3V0OgorCXJ3X3J1bmxvY2sobG9jayk7CisJcndfcnVubG9jaygmcHZo X2dsb2JhbF9sb2NrKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworCisvKgorICoJcG1hcF9pc19tb2Rp ZmllZDoKKyAqCisgKglSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBwaHlzaWNh bCBwYWdlIHdhcyBtb2RpZmllZAorICoJaW4gYW55IHBoeXNpY2FsIG1hcHMuCisgKi8KK2Jvb2xl YW5fdAorcG1hcF9pc19tb2RpZmllZCh2bV9wYWdlX3QgbSkKK3sKKworCUtBU1NFUlQoKG0tPm9m bGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9pc19tb2RpZmllZDogcGFn ZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKworCS8qCisJICogSWYgdGhlIHBhZ2UgaXMgbm90 IGV4Y2x1c2l2ZSBidXNpZWQsIHRoZW4gUEdBX1dSSVRFQUJMRSBjYW5ub3QgYmUKKwkgKiBjb25j dXJyZW50bHkgc2V0IHdoaWxlIHRoZSBvYmplY3QgaXMgbG9ja2VkLiAgVGh1cywgaWYgUEdBX1dS SVRFQUJMRQorCSAqIGlzIGNsZWFyLCBubyBQVEVzIGNhbiBoYXZlIFBURV9EIHNldC4KKwkgKi8K KwlWTV9PQkpFQ1RfQVNTRVJUX1dMT0NLRUQobS0+b2JqZWN0KTsKKwlpZiAoIXZtX3BhZ2VfeGJ1 c2llZChtKSAmJiAobS0+YWZsYWdzICYgUEdBX1dSSVRFQUJMRSkgPT0gMCkKKwkJcmV0dXJuIChG QUxTRSk7CisJcmV0dXJuIChwbWFwX3BhZ2VfdGVzdF9tYXBwaW5ncyhtLCBGQUxTRSwgVFJVRSkp OworfQorCisvKgorICoJcG1hcF9pc19wcmVmYXVsdGFibGU6CisgKgorICoJUmV0dXJuIHdoZXRo ZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIGlzIGVsZ2libGUKKyAqCWZv ciBwcmVmYXVsdC4KKyAqLworYm9vbGVhbl90CitwbWFwX2lzX3ByZWZhdWx0YWJsZShwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgYWRkcikKK3sKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlf dCAqcHRlOworCWJvb2xlYW5fdCBydjsKKworCXJ2ID0gRkFMU0U7CisJUE1BUF9MT0NLKHBtYXAp OworCXBkZSA9IHBtYXBfcGRlKHBtYXAsIGFkZHIpOworCWlmIChwZGUgIT0gTlVMTCAmJiAqcGRl ICE9IDApIHsKKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkKKwkJCXB0ZSA9IChwdF9l bnRyeV90ICopcGRlOworCQllbHNlCisJCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBhZGRy KTsKKwkJcnYgPSAoKnB0ZSA9PSAwKSB8fCAoKnB0ZSA9PSBQVEVfRyk7CisJfQorCVBNQVBfVU5M T0NLKHBtYXApOworCXJldHVybiAocnYpOworfQorCisvKgorICoJcG1hcF9pc19yZWZlcmVuY2Vk OgorICoKKyAqCVJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHBh Z2Ugd2FzIHJlZmVyZW5jZWQKKyAqCWluIGFueSBwaHlzaWNhbCBtYXBzLgorICovCitib29sZWFu X3QKK3BtYXBfaXNfcmVmZXJlbmNlZCh2bV9wYWdlX3QgbSkKK3sKKworCUtBU1NFUlQoKG0tPm9m bGFncyAmIFZQT19VTk1BTkFHRUQpID09IDAsCisJICAgICgicG1hcF9pc19yZWZlcmVuY2VkOiBw YWdlICVwIGlzIG5vdCBtYW5hZ2VkIiwgbSkpOworCXJldHVybiAocG1hcF9wYWdlX3Rlc3RfbWFw cGluZ3MobSwgVFJVRSwgRkFMU0UpKTsKK30KKworLyoKKyAqCUFwcGx5IHRoZSBnaXZlbiBhZHZp Y2UgdG8gdGhlIHNwZWNpZmllZCByYW5nZSBvZiBhZGRyZXNzZXMgd2l0aGluIHRoZQorICoJZ2l2 ZW4gcG1hcC4gIERlcGVuZGluZyBvbiB0aGUgYWR2aWNlLCBjbGVhciB0aGUgcmVmZXJlbmNlZCBh bmQvb3IKKyAqCW1vZGlmaWVkIGZsYWdzIGluIGVhY2ggbWFwcGluZyBhbmQgc2V0IHRoZSBtYXBw ZWQgcGFnZSdzIGRpcnR5IGZpZWxkLgorICovCit2b2lkCitwbWFwX2FkdmlzZShwbWFwX3QgcG1h cCwgdm1fb2Zmc2V0X3Qgc3ZhLCB2bV9vZmZzZXRfdCBldmEsIGludCBhZHZpY2UpCit7CisJc3Ry dWN0IHJ3bG9jayAqbG9jazsKKwlwZF9lbnRyeV90ICpwZGUsICpwZHBlLCBvbGRwZGU7CisJcHRf ZW50cnlfdCAqcHRlOworCXZtX29mZnNldF90IHZhX25leHQ7CisJdm1fcGFnZV90IG07CisJYm9v bGVhbl90IGFueWNoYW5nZWQsIHB2X2xpc3RzX2xvY2tlZDsKKworCWlmIChhZHZpY2UgIT0gTUFE Vl9ET05UTkVFRCAmJiBhZHZpY2UgIT0gTUFEVl9GUkVFKQorCQlyZXR1cm47CisKKwlwdl9saXN0 c19sb2NrZWQgPSBGQUxTRTsKK3Jlc3VtZToKKwlhbnljaGFuZ2VkID0gRkFMU0U7CisJUE1BUF9M T0NLKHBtYXApOworCWZvciAoOyBzdmEgPCBldmE7IHN2YSA9IHZhX25leHQpIHsKKwkJcGRwZSA9 IHBtYXBfc2VnbWFwKHBtYXAsIHN2YSk7CisJCWlmICgqcGRwZSA9PSAwKSB7CisJCQl2YV9uZXh0 ID0gKHN2YSArIE5CU0VHKSAmIH5TRUdNQVNLOworCQkJaWYgKHZhX25leHQgPCBzdmEpCisJCQkJ dmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZhX25leHQgPSAoc3ZhICsgTkJQ RFIpICYgflBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwgc3ZhKQorCQkJdmFfbmV4dCA9IGV2YTsK KworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIHN2YSk7CisJCW9sZHBkZSA9ICpwZGU7 CisJCWlmIChwZGUgPT0gTlVMTCB8fCAqcGRlID09IDApCisJCQljb250aW51ZTsKKwkJZWxzZSBp ZiAocGRlX2lzXzFtX3N1cGVycGFnZShwZGUpKSB7CisJCQlpZiAoIXBkZV90ZXN0KCZvbGRwZGUs IFBURV9NQU5BR0VEKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghcHZfbGlzdHNfbG9ja2VkKSB7 CisJCQkJcHZfbGlzdHNfbG9ja2VkID0gVFJVRTsKKwkJCQlpZiAoIXJ3X3RyeV9ybG9jaygmcHZo X2dsb2JhbF9sb2NrKSkgeworCQkJCQlpZiAoYW55Y2hhbmdlZCkKKwkJCQkJCXBtYXBfaW52YWxp ZGF0ZV9hbGwocG1hcCk7CisJCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJCQlyd19ybG9jaygm cHZoX2dsb2JhbF9sb2NrKTsKKwkJCQkJZ290byByZXN1bWU7CisJCQkJfQorCQkJfQorCQkJbG9j ayA9IE5VTEw7CisJCQlpZiAoIXBtYXBfZGVtb3RlX3BkZV9sb2NrZWQocG1hcCwgcGRlLCBzdmEs ICZsb2NrKSkgeworCQkJCWlmIChsb2NrICE9IE5VTEwpCisJCQkJCXJ3X3d1bmxvY2sobG9jayk7 CisKKwkJCQkvKgorCQkJCSAqIFRoZSBzdXBlcnBhZ2UgbWFwcGluZyB3YXMgZGVzdHJveWVkLgor CQkJCSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogVW5sZXNzIHRoZSBw YWdlIG1hcHBpbmdzIGFyZSB3aXJlZCwgcmVtb3ZlIHRoZQorCQkJICogbWFwcGluZyB0byBhIHNp bmdsZSBwYWdlIHNvIHRoYXQgYSBzdWJzZXF1ZW50CisJCQkgKiBhY2Nlc3MgbWF5IHJlcHJvbW90 ZS4gIFNpbmNlIHRoZSB1bmRlcmx5aW5nIHBhZ2UKKwkJCSAqIHRhYmxlIHBhZ2UgaXMgZnVsbHkg cG9wdWxhdGVkLCB0aGlzIHJlbW92YWwgbmV2ZXIKKwkJCSAqIGZyZWVzIGEgcGFnZSB0YWJsZSBw YWdlLgorCQkJICovCisJCQlpZiAoIXBkZV90ZXN0KCZvbGRwZGUsIFBURV9XKSkgeworCQkJCXB0 ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHN2YSk7CisJCQkJS0FTU0VSVChwdGVfdGVzdChwdGUs IFBURV9WQUxJRCksCisJCQkJICAgICgicG1hcF9hZHZpc2U6IGludmFsaWQgUFRFIikpOworCQkJ CXBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdGUsIHN2YSwgKnBkZSwgTlVMTCwKKwkJCQkgICAgJmxv Y2spOworCQkJCWFueWNoYW5nZWQgPSBUUlVFOworCQkJfQorCQkJaWYgKGxvY2sgIT0gTlVMTCkK KwkJCQlyd193dW5sb2NrKGxvY2spOworCQl9CisJCS8qCisJCSAqIExpbWl0IG91ciBzY2FuIHRv IGVpdGhlciB0aGUgZW5kIG9mIHRoZSB2YSByZXByZXNlbnRlZAorCQkgKiBieSB0aGUgY3VycmVu dCBwYWdlIHRhYmxlIHBhZ2UsIG9yIHRvIHRoZSBlbmQgb2YgdGhlCisJCSAqIHJhbmdlIGJlaW5n IHdyaXRlIHByb3RlY3RlZC4KKwkJICovCisJCWlmICh2YV9uZXh0ID4gZXZhKQorCQkJdmFfbmV4 dCA9IGV2YTsKKworCQlmb3IgKHB0ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAh PSB2YV9uZXh0OyBwdGUrKywKKwkJICAgIHN2YSArPSBQQUdFX1NJWkUpIHsKKwkJCWlmICghcHRl X2lzX3ZhbGlkKHB0ZSkgfHwgIXB0ZV90ZXN0KHB0ZSwgUFRFX01BTkFHRUQpKQorCQkJCWNvbnRp bnVlOworCQkJZWxzZSBpZiAocHRlX3Rlc3QocHRlLCBQVEVfRCkgJiYKKwkJCSAgICAhcHRlX3Rl c3QocHRlLCBQVEVfUk8pKSB7CisJCQkJaWYgKGFkdmljZSA9PSBNQURWX0RPTlRORUVEKSB7CisJ CQkJCS8qCisJCQkJCSAqIEZ1dHVyZSBjYWxscyB0byBwbWFwX2lzX21vZGlmaWVkKCkKKwkJCQkJ ICogY2FuIGJlIGF2b2lkZWQgYnkgbWFraW5nIHRoZSBwYWdlCisJCQkJCSAqIGRpcnR5IG5vdy4K KwkJCQkJICovCisJCQkJCW0gPSBQSFlTX1RPX1ZNX1BBR0UoCisJCQkJCSAgICBUTEJMT19QVEVf VE9fUEEoKnB0ZSkpOworCQkJCQl2bV9wYWdlX2RpcnR5KG0pOworCQkJCX0KKwkJCQlwdGVfYXRv bWljX2NsZWFyKHB0ZSwgUFRFX0QgfCBQVEVfUkVGKTsKKwkJCX0gZWxzZSBpZiAocHRlX2lzX3Jl ZihwdGUpKQorCQkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfUkVGKTsKKwkJCWVsc2UKKwkJ CQljb250aW51ZTsKKwkJCWlmIChwdGVfdGVzdChwdGUsIFBURV9HKSkKKwkJCQlwbWFwX2ludmFs aWRhdGVfcGFnZShwbWFwLCBzdmEpOworCQkJZWxzZQorCQkJCWFueWNoYW5nZWQgPSBUUlVFOwor CQl9CisJfQorCWlmIChhbnljaGFuZ2VkKQorCQlwbWFwX2ludmFsaWRhdGVfYWxsKHBtYXApOwor CWlmIChwdl9saXN0c19sb2NrZWQpIHsKKwkJcndfcnVubG9jaygmcHZoX2dsb2JhbF9sb2NrKTsK Kwl9CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKKy8qCisgKglDbGVhciB0aGUgbW9kaWZ5IGJp dHMgb24gdGhlIHNwZWNpZmllZCBwaHlzaWNhbCBwYWdlLgorICovCit2b2lkCitwbWFwX2NsZWFy X21vZGlmeSh2bV9wYWdlX3QgbSkKK3sKKwlzdHJ1Y3QgbWRfcGFnZSAqcHZoOworCXBtYXBfdCBw bWFwOworCXB2X2VudHJ5X3QgbmV4dF9wdiwgcHY7CisJcGRfZW50cnlfdCBvbGRwZGUsICpwZGU7 CisJcHRfZW50cnlfdCBvbGRwdGUsICpwdGU7CisJc3RydWN0IHJ3bG9jayAqbG9jazsKKwl2bV9v ZmZzZXRfdCB2YTsKKwlpbnQgbWRfZ2VuLCBwdmhfZ2VuOworCisJS0FTU0VSVCgobS0+b2ZsYWdz ICYgVlBPX1VOTUFOQUdFRCkgPT0gMCwKKwkgICAgKCJwbWFwX2NsZWFyX21vZGlmeTogcGFnZSAl cCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwlWTV9PQkpFQ1RfQVNTRVJUX1dMT0NLRUQobS0+b2Jq ZWN0KTsKKwlLQVNTRVJUKCF2bV9wYWdlX3hidXNpZWQobSksCisJICAgICgicG1hcF9jbGVhcl9t b2RpZnk6IHBhZ2UgJXAgaXMgZXhjbHVzaXZlIGJ1c2llZCIsIG0pKTsKKworCS8qCisJICogSWYg dGhlIHBhZ2UgaXMgbm90IFBHQV9XUklURUFCTEUsIHRoZW4gbm8gUFRFcyBjYW4gaGF2ZSBQVEVf RCBzZXQuCisJICogSWYgdGhlIG9iamVjdCBjb250YWluaW5nIHRoZSBwYWdlIGlzIGxvY2tlZCBh bmQgdGhlIHBhZ2UgaXMgbm90CisJICogd3JpdGUgYnVzaWVkLCB0aGVuIFBHQV9XUklURUFCTEUg Y2Fubm90IGJlIGNvbmN1cnJlbnRseSBzZXQuCisJICovCisJaWYgKChtLT5hZmxhZ3MgJiBQR0Ff V1JJVEVBQkxFKSA9PSAwKQorCQlyZXR1cm47CisJcHZoID0gcGFfdG9fcHZoKFZNX1BBR0VfVE9f UEhZUyhtKSk7CisJcndfcmxvY2soJnB2aF9nbG9iYWxfbG9jayk7CisJbG9jayA9IFZNX1BBR0Vf VE9fUFZfTElTVF9MT0NLKG0pOworCXJ3X3dsb2NrKGxvY2spOworcmVzdGFydDoKKwlpZiAoKG0t PmZsYWdzICYgUEdfRklDVElUSU9VUykgIT0gMCkKKwkJZ290byBzbWFsbF9tYXBwaW5nczsKKwlU QUlMUV9GT1JFQUNIX1NBRkUocHYsICZwdmgtPnB2X2xpc3QsIHB2X25leHQsIG5leHRfcHYpIHsK KwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkgeworCQkJ cHZoX2dlbiA9IHB2aC0+cHZfZ2VuOworCQkJcndfd3VubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9D SyhwbWFwKTsKKwkJCXJ3X3dsb2NrKGxvY2spOworCQkJaWYgKHB2aF9nZW4gIT0gcHZoLT5wdl9n ZW4pIHsKKwkJCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJ CX0KKwkJdmEgPSBwdi0+cHZfdmE7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJb2xk cGRlID0gKnBkZTsKKwkJaWYgKCFwZGVfdGVzdChwZGUsIFBURV9STykpIHsKKwkJCWlmIChwbWFw X2RlbW90ZV9wZGVfbG9ja2VkKHBtYXAsIHBkZSwgdmEsICZsb2NrKSkgeworCQkJCWlmICghcGRl X3Rlc3QoJm9sZHBkZSwgUFRFX1cpKSB7CisJCQkJCS8qCisJCQkJCSAqIFdyaXRlIHByb3RlY3Qg dGhlIG1hcHBpbmcgdG8gYQorCQkJCQkgKiBzaW5nbGUgcGFnZSBzbyB0aGF0IGEgc3Vic2VxdWVu dAorCQkJCQkgKiB3cml0ZSBhY2Nlc3MgbWF5IHJlcHJvbW90ZS4KKwkJCQkJICovCisJCQkJCXZh ICs9IFZNX1BBR0VfVE9fUEhZUyhtKSAtCisJCQkJCSAgIFRMQkxPX1BERV9UT19QQShvbGRwZGUp OworCQkJCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJCQkJCW9sZHB0ZSA9ICpw dGU7CisJCQkJCWlmICghcHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1ZBTElEKSkgeworCQkJCQkJd2hp bGUgKCFhdG9taWNfY21wc2V0X2xvbmcocHRlLAorCQkJCQkJICAgIG9sZHB0ZSwKKwkJCQkJCSAg ICAob2xkcHRlICYgflBURV9EKSB8IFBURV9STykpCisJCQkJCQkJb2xkcHRlID0gKnB0ZTsKKwkJ CQkJCXZtX3BhZ2VfZGlydHkobSk7CisJCQkJCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCB2 YSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJUE1BUF9VTkxPQ0socG1hcCk7CisJfQor c21hbGxfbWFwcGluZ3M6CisJVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X25l eHQpIHsKKwkJcG1hcCA9IFBWX1BNQVAocHYpOworCQlpZiAoIVBNQVBfVFJZTE9DSyhwbWFwKSkg eworCQkJbWRfZ2VuID0gbS0+bWQucHZfZ2VuOworCQkJcHZoX2dlbiA9IHB2aC0+cHZfZ2VuOwor CQkJcndfd3VubG9jayhsb2NrKTsKKwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJCXJ3X3dsb2NrKGxv Y2spOworCQkJaWYgKG1kX2dlbiAhPSBtLT5tZC5wdl9nZW4gfHwgbWRfZ2VuICE9IG0tPm1kLnB2 X2dlbikgeworCQkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJCWdvdG8gcmVzdGFydDsKKwkJCX0K KwkJfQorCQlwZGUgPSBwbWFwX3BkZShwbWFwLCBwdi0+cHZfdmEpOworCQlLQVNTRVJUKCFwZGVf aXNfc3VwZXJwYWdlKHBkZSksICgicG1hcF9jbGVhcl9tb2RpZnk6IGZvdW5kIgorCQkgICAgIiBh IHN1cGVycGFnZSBpbiBwYWdlICVwJ3MgcHYgbGlzdCIsIG0pKTsKKwkJcHRlID0gcG1hcF9wZGVf dG9fcHRlKHBkZSwgcHYtPnB2X3ZhKTsKKwkJaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX0QpICYmICFw dGVfdGVzdChwdGUsIFBURV9STykpIHsKKwkJCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBQVEVfRCk7 CisJCQlwbWFwX2ludmFsaWRhdGVfcGFnZShwbWFwLCBwdi0+cHZfdmEpOworCQl9CisJCVBNQVBf VU5MT0NLKHBtYXApOworCX0KKwlyd193dW5sb2NrKGxvY2spOworCXJ3X3J1bmxvY2soJnB2aF9n bG9iYWxfbG9jayk7Cit9CisKKy8qCisgKiBNaXNjZWxsYW5lb3VzIHN1cHBvcnQgcm91dGluZXMg Zm9sbG93CisgKi8KKworLyoKKyAqIE1hcCBhIHNldCBvZiBwaHlzaWNhbCBtZW1vcnkgcGFnZXMg aW50byB0aGUga2VybmVsIHZpcnR1YWwKKyAqIGFkZHJlc3Mgc3BhY2UuIFJldHVybiBhIHBvaW50 ZXIgdG8gd2hlcmUgaXQgaXMgbWFwcGVkLiBUaGlzCisgKiByb3V0aW5lIGlzIGludGVuZGVkIHRv IGJlIHVzZWQgZm9yIG1hcHBpbmcgZGV2aWNlIG1lbW9yeSwKKyAqIE5PVCByZWFsIG1lbW9yeS4K KyAqCisgKiBVc2UgWEtQSFlTIHVuY2FjaGVkIGZvciA2NCBiaXQuCisgKi8KK3ZvaWQgKgorcG1h cF9tYXBkZXYodm1fcGFkZHJfdCBwYSwgdm1fc2l6ZV90IHNpemUpCit7CisKKwlyZXR1cm4gKCh2 b2lkICopTUlQU19QSFlTX1RPX0RJUkVDVF9VTkNBQ0hFRChwYSkpOworfQorCit2b2lkCitwbWFw X3VubWFwZGV2KHZtX29mZnNldF90IHZhLCB2bV9zaXplX3Qgc2l6ZSkKK3sKKworCS8qIE5vdGhp bmcgdG8gZG8gZm9yIG1pcHM2NC4gKi8KK30KKworLyoKKyAqIFNldHMgdGhlIG1lbW9yeSBhdHRy aWJ1dGUgZm9yIHRoZSBzcGVjaWZpZWQgcGFnZS4KKyAqLwordm9pZAorcG1hcF9wYWdlX3NldF9t ZW1hdHRyKHZtX3BhZ2VfdCBtLCB2bV9tZW1hdHRyX3QgbWEpCit7CisJLyoKKwkgKiBTZXQgdGhl IG1lbWF0dHIgZmllbGQgc28gdGhlIGFwcHJvcHJpYXRlIGJpdHMgYXJlIHNldCBpbiB0aGUKKwkg KiBQVEUgYXMgbWFwcGluZ3MgYXJlIGNyZWF0ZWQuCisJICovCisJbS0+bWQucHZfbWVtYXR0ciA9 IG1hOworCisJLyoKKwkgKiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBvbmx5 IGNhbGxlZCBiZWZvcmUgYW55IG1hcHBpbmdzCisJICogYXJlIGVzdGFibGlzaGVkLiAgSWYgdGhp cyBpcyBub3QgdGhlIGNhc2UgdGhlbiB0aGlzIGZ1bmN0aW9uIHdpbGwKKwkgKiBuZWVkIHRvIHdh bGsgdGhlIHB2X2xpc3QgYW5kIG1ha2UgZWFjaCBvZiB0aGUgZXhpc3RpbmcgbWFwcGluZ3MKKwkg KiB1bmNhY2hlYWJsZSwgc3luYyB0aGUgY2FjaGUgKHdpdGggbWlwc19pY2FjaGVfc3luY19hbGwo KSBhbmQKKwkgKiBtaXBzX2RjYWNoZV93Ymludl9hbGwoKSkgYW5kIG1vc3QgbGlrZWx5IGludmFs aWRhdGUgVExCIGVudHJpZXMgZm9yCisJICogYW55IG9mIHRoZSBjdXJyZW50IG1hcHBpbmdzIGl0 IG1vZGlmaWVzLgorCSAqLworCWlmIChUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCkgIT0gTlVM TCkKKwkJcGFuaWMoIkNhbid0IGNoYW5nZSBtZW1hdHRyIG9uIHBhZ2Ugd2l0aCBleGlzdGluZyBt YXBwaW5ncyIpOworfQorCisvKgorICogcGVyZm9ybSB0aGUgcG1hcCB3b3JrIGZvciBtaW5jb3Jl CisgKi8KK2ludAorcG1hcF9taW5jb3JlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBhZGRyLCB2 bV9wYWRkcl90ICpsb2NrZWRfcGEpCit7CisJcGRfZW50cnlfdCAqcGRlcDsKKwlwdF9lbnRyeV90 ICpwdGVwLCBwdGU7CisJdm1fcGFkZHJfdCBwYTsKKwlpbnQgdmFsOworCisJUE1BUF9MT0NLKHBt YXApOworcmV0cnk6CisJcGRlcCA9IHBtYXBfcGRlKHBtYXAsIGFkZHIpOworCWlmIChwZGVwICE9 IE5VTEwpIHsKKwkJaWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlcCkpIHsKKwkJCXB0ZSA9IChw dF9lbnRyeV90KSpwZGVwOworCQkJcGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsKKwkJCXZhbCA9 IE1JTkNPUkVfU1VQRVI7CisJCX0gZWxzZSB7CisJCQlwdGVwID0gcG1hcF9wZGVfdG9fcHRlKHBk ZXAsIGFkZHIpOworCQkJcHRlID0gKHB0ZXAgIT0gTlVMTCkgPyAqcHRlcCA6IDA7CisJCQlwYSA9 IFRMQkxPX1BURV9UT19QQShwdGUpOworCQkJdmFsID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCXB0 ZSA9IDA7CisJCXBhID0gMDsKKwkJdmFsID0gMDsKKwl9CisJaWYgKHB0ZV9pc192YWxpZCgmcHRl KSkgeworCQl2YWwgfD0gTUlOQ09SRV9JTkNPUkU7CisJCWlmIChwdGVfdGVzdCgmcHRlLCBQVEVf RCkpCisJCQl2YWwgfD0gTUlOQ09SRV9NT0RJRklFRCB8IE1JTkNPUkVfTU9ESUZJRURfT1RIRVI7 CisJCWlmIChwdGVfaXNfcmVmKCZwdGUpKQorCQkJdmFsIHw9IE1JTkNPUkVfUkVGRVJFTkNFRCB8 IE1JTkNPUkVfUkVGRVJFTkNFRF9PVEhFUjsKKwl9CisJaWYgKCh2YWwgJiAoTUlOQ09SRV9NT0RJ RklFRF9PVEhFUiB8IE1JTkNPUkVfUkVGRVJFTkNFRF9PVEhFUikpICE9CisJICAgIChNSU5DT1JF X01PRElGSUVEX09USEVSIHwgTUlOQ09SRV9SRUZFUkVOQ0VEX09USEVSKSAmJgorCSAgICBwdGVf dGVzdCgmcHRlLCBQVEVfTUFOQUdFRCkpIHsKKwkJLyogRW5zdXJlIHRoYXQgIlBIWVNfVE9fVk1f UEFHRShwYSktPm9iamVjdCIgZG9lc24ndCBjaGFuZ2UuICovCisJCWlmICh2bV9wYWdlX3BhX3Ry eXJlbG9jayhwbWFwLCBwYSwgbG9ja2VkX3BhKSkKKwkJCWdvdG8gcmV0cnk7CisJfSBlbHNlCisJ CVBBX1VOTE9DS19DT05EKCpsb2NrZWRfcGEpOworCVBNQVBfVU5MT0NLKHBtYXApOworCXJldHVy biAodmFsKTsKK30KKwordm9pZAorcG1hcF9hY3RpdmF0ZShzdHJ1Y3QgdGhyZWFkICp0ZCkKK3sK KwlwbWFwX3QgcG1hcCwgb2xkcG1hcDsKKwlzdHJ1Y3QgcHJvYyAqcCA9IHRkLT50ZF9wcm9jOwor CXVfaW50IGNwdWlkOworCisJY3JpdGljYWxfZW50ZXIoKTsKKworCXBtYXAgPSB2bXNwYWNlX3Bt YXAocC0+cF92bXNwYWNlKTsKKwlvbGRwbWFwID0gUENQVV9HRVQoY3VycG1hcCk7CisJY3B1aWQg PSBQQ1BVX0dFVChjcHVpZCk7CisKKwlpZiAob2xkcG1hcCkKKwkJQ1BVX0NMUl9BVE9NSUMoY3B1 aWQsICZvbGRwbWFwLT5wbV9hY3RpdmUpOworCUNQVV9TRVRfQVRPTUlDKGNwdWlkLCAmcG1hcC0+ cG1fYWN0aXZlKTsKKwlwbWFwX2FzaWRfYWxsb2MocG1hcCk7CisJaWYgKHRkID09IGN1cnRocmVh ZCkgeworCQlQQ1BVX1NFVChzZWdiYXNlLCBwbWFwLT5wbV9zZWd0YWIpOworCQltaXBzX3dyX2Vu dHJ5aGkocG1hcC0+cG1fYXNpZFtjcHVpZF0uYXNpZCk7CisJfQorCisJUENQVV9TRVQoY3VycG1h cCwgcG1hcCk7CisJY3JpdGljYWxfZXhpdCgpOworfQorCit2b2lkCitwbWFwX3N5bmNfaWNhY2hl KHBtYXBfdCBwbSwgdm1fb2Zmc2V0X3QgdmEsIHZtX3NpemVfdCBzeikKK3sKK30KKworLyoKKyAq CUluY3JlYXNlIHRoZSBzdGFydGluZyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGdpdmVuIG1hcHBp bmcgaWYgYQorICoJZGlmZmVyZW50IGFsaWdubWVudCBtaWdodCByZXN1bHQgaW4gbW9yZSBzdXBl cnBhZ2UgbWFwcGluZ3MuCisgKi8KK3ZvaWQKK3BtYXBfYWxpZ25fc3VwZXJwYWdlKHZtX29iamVj dF90IG9iamVjdCwgdm1fb29mZnNldF90IG9mZnNldCwKKyAgICB2bV9vZmZzZXRfdCAqYWRkciwg dm1fc2l6ZV90IHNpemUpCit7CisJdm1fb2Zmc2V0X3Qgc3VwZXJwYWdlX29mZnNldDsKKworCWlm IChzaXplIDwgTkJTRUcpCisJCXJldHVybjsKKwlpZiAob2JqZWN0ICE9IE5VTEwgJiYgKG9iamVj dC0+ZmxhZ3MgJiBPQkpfQ09MT1JFRCkgIT0gMCkKKwkJb2Zmc2V0ICs9IHB0b2Eob2JqZWN0LT5w Z19jb2xvcik7CisJc3VwZXJwYWdlX29mZnNldCA9IG9mZnNldCAmIFNFR01BU0s7CisJaWYgKHNp emUgLSAoKE5CU0VHIC0gc3VwZXJwYWdlX29mZnNldCkgJiBTRUdNQVNLKSA8IE5CU0VHIHx8CisJ ICAgICgqYWRkciAmIFNFR01BU0spID09IHN1cGVycGFnZV9vZmZzZXQpCisJCXJldHVybjsKKwlp ZiAoKCphZGRyICYgU0VHTUFTSykgPCBzdXBlcnBhZ2Vfb2Zmc2V0KQorCQkqYWRkciA9ICgqYWRk ciAmIH5TRUdNQVNLKSArIHN1cGVycGFnZV9vZmZzZXQ7CisJZWxzZQorCQkqYWRkciA9ICgoKmFk ZHIgKyBTRUdNQVNLKSAmIH5TRUdNQVNLKSArIHN1cGVycGFnZV9vZmZzZXQ7Cit9CisKKyNpZmRl ZiBEREIKK0RCX1NIT1dfQ09NTUFORChwdGFibGUsIGRkYl9waWRfZHVtcCkKK3sKKwlwbWFwX3Qg cG1hcDsKKwlzdHJ1Y3QgdGhyZWFkICp0ZCA9IE5VTEw7CisJc3RydWN0IHByb2MgKnA7CisJaW50 IGksIGosIGs7CisJdm1fcGFkZHJfdCBwYTsKKwl2bV9vZmZzZXRfdCB2YTsKKworCWlmIChoYXZl X2FkZHIpIHsKKwkJdGQgPSBkYl9sb29rdXBfdGhyZWFkKGFkZHIsIFRSVUUpOworCQlpZiAodGQg PT0gTlVMTCkgeworCQkJZGJfcHJpbnRmKCJJbnZhbGlkIHBpZCBvciB0aWQiKTsKKwkJCXJldHVy bjsKKwkJfQorCQlwID0gdGQtPnRkX3Byb2M7CisJCWlmIChwLT5wX3Ztc3BhY2UgPT0gTlVMTCkg eworCQkJZGJfcHJpbnRmKCJObyB2bXNwYWNlIGZvciBwcm9jZXNzIik7CisJCQlyZXR1cm47CisJ CX0KKwkJCXBtYXAgPSB2bXNwYWNlX3BtYXAocC0+cF92bXNwYWNlKTsKKwl9IGVsc2UKKwkJcG1h cCA9IGtlcm5lbF9wbWFwOworCisJZGJfcHJpbnRmKCJwbWFwOiVwIHNlZ3RhYjolcCBhc2lkOiV4 IGdlbmVyYXRpb246JXhcbiIsCisJICAgIHBtYXAsIHBtYXAtPnBtX3NlZ3RhYiwgcG1hcC0+cG1f YXNpZFswXS5hc2lkLAorCSAgICBwbWFwLT5wbV9hc2lkWzBdLmdlbik7CisJZm9yIChpID0gMDsg aSA8IE5QREVQRzsgaSsrKSB7CisJCXBkX2VudHJ5X3QgKnBkcGU7CisJCXB0X2VudHJ5X3QgKnBk ZTsKKwkJcHRfZW50cnlfdCBwdGU7CisKKwkJcGRwZSA9IChwZF9lbnRyeV90ICopcG1hcC0+cG1f c2VndGFiW2ldOworCQlpZiAocGRwZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWRiX3ByaW50 ZigiWyU0ZF0gJXBcbiIsIGksIHBkcGUpOworCQlmb3IgKGogPSAwOyBqIDwgTlBERVBHOyBqKysp IHsKKwkJCXBkZSA9IChwdF9lbnRyeV90ICopcGRwZVtqXTsKKwkJCWlmIChwZGUgPT0gTlVMTCkK KwkJCQljb250aW51ZTsKKwkJCWRiX3ByaW50ZigiXHRbJTRkXSAlcFxuIiwgaiwgcGRlKTsKKwkJ CWZvciAoayA9IDA7IGsgPCBOUFRFUEc7IGsrKykgeworCQkJCXB0ZSA9IHBkZVtrXTsKKwkJCQlp ZiAocHRlID09IDAgfHwgIXB0ZV9pc192YWxpZCgmcHRlKSkKKwkJCQkJY29udGludWU7CisJCQkJ cGEgPSBUTEJMT19QVEVfVE9fUEEocHRlKTsKKwkJCQl2YSA9ICgodV9sb25nKWkgPDwgU0VHU0hJ RlQpIHwgKGogPDwgUERSU0hJRlQpIHwgKGsgPDwgUEFHRV9TSElGVCk7CisJCQkJZGJfcHJpbnRm KCJcdFx0WyUwNGRdIHZhOiAlcCBwdGU6ICU4anggcGE6JWp4XG4iLAorCQkJCSAgICAgICBrLCAo dm9pZCAqKXZhLCAodWludG1heF90KXB0ZSwgKHVpbnRtYXhfdClwYSk7CisJCQl9CisJCX0KKwl9 Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoREVCVUcpCisKK3N0YXRpYyB2b2lkIHBhZHMocG1h cF90IHBtKTsKK3ZvaWQgcG1hcF9wdmR1bXAodm1fb2Zmc2V0X3QgcGEpOworCisvKiBwcmludCBh ZGRyZXNzIHNwYWNlIG9mIHBtYXAqLworc3RhdGljIHZvaWQKK3BhZHMocG1hcF90IHBtKQorewor CXVuc2lnbmVkIHZhLCBpLCBqOworCXB0X2VudHJ5X3QgKnB0ZXA7CisKKwlpZiAocG0gPT0ga2Vy bmVsX3BtYXApCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgTlBURVBHOyBpKyspCisJCWlm IChwbS0+cG1fc2VndGFiW2ldKQorCQkJZm9yIChqID0gMDsgaiA8IE5QVEVQRzsgaisrKSB7CisJ CQkJdmEgPSAoaSA8PCBTRUdTSElGVCkgKyAoaiA8PCBQQUdFX1NISUZUKTsKKwkJCQlpZiAocG0g PT0ga2VybmVsX3BtYXAgJiYgdmEgPCBLRVJOQkFTRSkKKwkJCQkJY29udGludWU7CisJCQkJaWYg KHBtICE9IGtlcm5lbF9wbWFwICYmCisJCQkJICAgIHZhID49IFZNX01BWFVTRVJfQUREUkVTUykK KwkJCQkJY29udGludWU7CisJCQkJcHRlcCA9IHBtYXBfcHRlKHBtLCB2YSk7CisJCQkJaWYgKHB0 ZV9pc192YWxpZChwdGVwKSkKKwkJCQkJcHJpbnRmKCIleDoleCAiLCB2YSwgKihpbnQgKilwdGVw KTsKKwkJCX0KKworfQorCit2b2lkCitwbWFwX3B2ZHVtcCh2bV9vZmZzZXRfdCBwYSkKK3sKKwly ZWdpc3RlciBwdl9lbnRyeV90IHB2OworCXZtX3BhZ2VfdCBtOworCisJcHJpbnRmKCJwYSAleCIs IHBhKTsKKwltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwlmb3IgKHB2ID0gVEFJTFFfRklSU1Qo Jm0tPm1kLnB2X2xpc3QpOyBwdjsKKwkgICAgcHYgPSBUQUlMUV9ORVhUKHB2LCBwdl9saXN0KSkg eworCQlwcmludGYoIiAtPiBwbWFwICVwLCB2YSAleCIsICh2b2lkICopcHYtPnB2X3BtYXAsIHB2 LT5wdl92YSk7CisJCXBhZHMocHYtPnB2X3BtYXApOworCX0KKwlwcmludGYoIiAiKTsKK30KKwor LyogTi9DICovCisjZW5kaWYKKworCisvKgorICogQWxsb2NhdGUgVExCIGFkZHJlc3Mgc3BhY2Ug dGFnIChjYWxsZWQgQVNJRCBvciBUTEJQSUQpIGFuZCByZXR1cm4gaXQuCisgKiBJdCB0YWtlcyBh bG1vc3QgYXMgbXVjaCBvciBtb3JlIHRpbWUgdG8gc2VhcmNoIHRoZSBUTEIgZm9yIGEKKyAqIHNw ZWNpZmljIEFTSUQgYW5kIGZsdXNoIHRob3NlIGVudHJpZXMgYXMgaXQgZG9lcyB0byBmbHVzaCB0 aGUgZW50aXJlIFRMQi4KKyAqIFRoZXJlZm9yZSwgd2hlbiB3ZSBhbGxvY2F0ZSBhIG5ldyBBU0lE LCB3ZSBqdXN0IHRha2UgdGhlIG5leHQgbnVtYmVyLiBXaGVuCisgKiB3ZSBydW4gb3V0IG9mIG51 bWJlcnMsIHdlIGZsdXNoIHRoZSBUTEIsIGluY3JlbWVudCB0aGUgZ2VuZXJhdGlvbiBjb3VudAor ICogYW5kIHN0YXJ0IG92ZXIuIEFTSUQgemVybyBpcyByZXNlcnZlZCBmb3Iga2VybmVsIHVzZS4K KyAqLworc3RhdGljIHZvaWQKK3BtYXBfYXNpZF9hbGxvYyhwbWFwKQorCXBtYXBfdCBwbWFwOwor eworCWlmIChwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uYXNpZCAhPSBQTUFQX0FTSURf UkVTRVJWRUQgJiYKKwkgICAgcG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiA9PSBQ Q1BVX0dFVChhc2lkX2dlbmVyYXRpb24pKTsKKwllbHNlIHsKKwkJaWYgKFBDUFVfR0VUKG5leHRf YXNpZCkgPT0gcG1hcF9tYXhfYXNpZCkgeworCQkJdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIoTlVM TCk7CisJCQlQQ1BVX1NFVChhc2lkX2dlbmVyYXRpb24sCisJCQkgICAgKFBDUFVfR0VUKGFzaWRf Z2VuZXJhdGlvbikgKyAxKSAmIEFTSURHRU5fTUFTSyk7CisJCQlpZiAoUENQVV9HRVQoYXNpZF9n ZW5lcmF0aW9uKSA9PSAwKSB7CisJCQkJUENQVV9TRVQoYXNpZF9nZW5lcmF0aW9uLCAxKTsKKwkJ CX0KKwkJCVBDUFVfU0VUKG5leHRfYXNpZCwgMSk7CS8qIDAgbWVhbnMgaW52YWxpZCAqLworCQl9 CisJCXBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5hc2lkID0gUENQVV9HRVQobmV4dF9h c2lkKTsKKwkJcG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiA9IFBDUFVfR0VUKGFz aWRfZ2VuZXJhdGlvbik7CisJCVBDUFVfU0VUKG5leHRfYXNpZCwgUENQVV9HRVQobmV4dF9hc2lk KSArIDEpOworCX0KK30KKworc3RhdGljIHB0X2VudHJ5X3QKK2luaXRfcHRlX3Byb3Qodm1fcGFn ZV90IG0sIHZtX3Byb3RfdCBhY2Nlc3MsIHZtX3Byb3RfdCBwcm90KQoreworCXB0X2VudHJ5X3Qg cnc7CisKKwlpZiAoIShwcm90ICYgVk1fUFJPVF9XUklURSkpCisJCXJ3ID0gUFRFX1ZBTElEIHwg UFRFX1JPOworCWVsc2UgaWYgKChtLT5vZmxhZ3MgJiBWUE9fVU5NQU5BR0VEKSA9PSAwKSB7CisJ CWlmICgoYWNjZXNzICYgVk1fUFJPVF9XUklURSkgIT0gMCkKKwkJCXJ3ID0gUFRFX1ZBTElEIHwg UFRFX0Q7CisJCWVsc2UKKwkJCXJ3ID0gUFRFX1ZBTElEOworCX0gZWxzZSB7CisJCS8qCisJCSAq IE5lZWRuJ3QgZW11bGF0ZSBhIHJlZmVyZW5jZS9tb2RpZmllZCBiaXQgZm9yIHVubWFuYWdlZAor CQkgKiBwYWdlcy4KKwkJICovCisJCXJ3ID0gUFRFX1ZBTElEIHwgUFRFX0Q7CisJCXB0ZV9yZWZf c2V0KCZydyk7CisJfQorCisJcmV0dXJuIChydyk7Cit9CisKKy8qCisgKiBwbWFwX2VtdWxhdGVf bW9kaWZpZWQgOiBkbyBkaXJ0eSBiaXQgZW11bGF0aW9uCisgKgorICogT24gU01QLCB1cGRhdGUg anVzdCB0aGUgbG9jYWwgVExCLCBvdGhlciBDUFVzIHdpbGwgdXBkYXRlIHRoZWlyCisgKiBUTEJz IGZyb20gUFRFIGxhemlseSwgaWYgdGhleSBnZXQgdGhlIGV4Y2VwdGlvbi4KKyAqIFJldHVybnMg MCBpbiBjYXNlIG9mIHN1Y2VzcywgMSBpZiB0aGUgcGFnZSBpcyByZWFkIG9ubHkgYW5kIHdlCisg KiBuZWVkIHRvIGZhdWx0LgorICovCitpbnQKK3BtYXBfZW11bGF0ZV9tb2RpZmllZChwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcGRfZW50cnlfdCAqcGRlOworCXB0X2VudHJ5X3Qg KnB0ZTsKKworCVBNQVBfTE9DSyhwbWFwKTsKKwlwZGUgPSBwbWFwX3BkZShwbWFwLCB2YSk7CisJ aWYgKHBkZV9pc18xbV9zdXBlcnBhZ2UocGRlKSkKKwkJcHRlID0gKHB0X2VudHJ5X3QgKilwZGU7 CisJZWxzZQorCQlwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCB2YSk7CisJaWYgKHB0ZSA9PSBO VUxMKQorCQlwYW5pYygicG1hcF9lbXVsYXRlX21vZGlmaWVkOiBjYW4ndCBmaW5kIFBURSIpOwor I2lmZGVmIFNNUAorCS8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgc29tZSBvdGhlciBDUFUgY2hhbmdl ZCBtLWJpdCAqLworCWlmICghcHRlX2lzX3ZhbGlkKHB0ZSkgfHwgcHRlX3Rlc3QocHRlLCBQVEVf RCkpIHsKKwkJdGxiX3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CisJCVBNQVBfVU5MT0NLKHBtYXAp OworCQlyZXR1cm4gKDApOworCX0KKyNlbHNlCisJaWYgKCFwdGVfaXNfdmFsaWQocHRlKSB8fCBw dGVfdGVzdChwdGUsIFBURV9EKSkgeworCQl0bGJfdXBkYXRlKHBtYXAsIHZhLCAqcHRlKTsKKwkJ UE1BUF9VTkxPQ0socG1hcCk7CisJCXJldHVybiAoMCk7CisJfQorI2VuZGlmCisJaWYgKHB0ZV90 ZXN0KHB0ZSwgUFRFX1JPKSkgeworCQlQTUFQX1VOTE9DSyhwbWFwKTsKKwkJcmV0dXJuICgxKTsK Kwl9CisJcHRlX2F0b21pY19zZXQocHRlLCBQVEVfRCk7IC8qIG1hcmsgaXQgcmVmZXJlbmNlZCBh bmQgbW9kaWZpZWQgKi8KKwlwdGVfcmVmX2F0b21pY19zZXQocHRlKTsKKwl0bGJfdXBkYXRlKHBt YXAsIHZhLCAqcHRlKTsKKwlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX01BTkFHRUQpKQorCQlwYW5p YygicG1hcF9lbXVsYXRlX21vZGlmaWVkOiB1bm1hbmFnZWQgcGFnZSIpOworCVBNQVBfVU5MT0NL KHBtYXApOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBwbWFwX2VtdWxhdGVfcmVmZXJlbmNl ZDogZG8gcmVmZXJlbmNlIGJpdCBlbXVsYXRpb24KKyAqCisgKiBSZXR1cm5zIDAgaW4gY2FzZSBv ZiBzdWNjZXNzLiAgUmV0dXJucyAxIGlmIHdlIG5lZWQgdG8gZmF1bHQuCisgKi8KK2ludAorcG1h cF9lbXVsYXRlX3JlZmVyZW5jZWQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXBk X2VudHJ5X3QgKnBkZTsKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlpZiAoaXNfa2VybmVsX3BtYXAo cG1hcCkpCisJCXJldHVybiAoMSk7CisJUE1BUF9MT0NLKHBtYXApOworCXBkZSA9IHBtYXBfcGRl KHBtYXAsIHZhKTsKKwlpZiAocGRlID09IE5VTEwgfHwgKnBkZSA9PSBOVUxMKSB7CisJCS8qIElu dmFsaWQgcGFnZSBkaXJlY3RvcnkuICovCisJCWdvdG8gZG9mYXVsdDsKKwl9CisJaWYgKHBkZV9p c18xbV9zdXBlcnBhZ2UocGRlKSkgeworCQlwdGUgPSAocHRfZW50cnlfdCAqKXBkZTsKKwl9IGVs c2UKKwkJcHRlID0gcG1hcF9wZGVfdG9fcHRlKHBkZSwgdmEpOworCWlmIChwdGUgPT0gTlVMTCkg eworCQkvKiBJbnZhbGlkIHBhZ2UgdGFibGUuICovCisJCWdvdG8gZG9mYXVsdDsKKwl9CisJaWYg KCFwdGVfaXNfdmFsaWQocHRlKSkgeworCQkvKiBJbnZhbGlkIFBURS4gKi8KKwkJZ290byBkb2Zh dWx0OworCX0KKwkvKiBDaGVjayB0byBzZWUgaWYgYWxyZWFkeSBtYXJrZWQgYnkgb3RoZXIgQ1BV LiAgKi8KKwlpZiAoIXB0ZV9pc19yZWYocHRlKSkKKwkJcHRlX3JlZl9hdG9taWNfc2V0KHB0ZSk7 CisKKwl0bGJfdXBkYXRlKHBtYXAsIHZhLCAqcHRlKTsKKwlQTUFQX1VOTE9DSyhwbWFwKTsKKwor CXJldHVybiAoMCk7CisKK2RvZmF1bHQ6CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuICgx KTsKK30KKwordm9pZAorcG1hcF9mbHVzaF9wdmNhY2hlKHZtX3BhZ2VfdCBtKQoreworCXB2X2Vu dHJ5X3QgcHY7CisKKwlpZiAobSAhPSBOVUxMKSB7CisJCWZvciAocHYgPSBUQUlMUV9GSVJTVCgm bS0+bWQucHZfbGlzdCk7IHB2OworCQkgICAgcHYgPSBUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSkg eworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQQUdFX1NJWkUp OworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy9wbWFwLmMgYi9zeXMvbWlw cy9taXBzL3BtYXAuYwotLS0gYS9zeXMvbWlwcy9taXBzL3BtYXAuYworKysgYi9zeXMvbWlwcy9t aXBzL3BtYXAuYwpAQCAtNzQsNiArNzQsNyBAQAogI2luY2x1ZGUgPHN5cy9wcm9jLmg+CiAjaW5j bHVkZSA8c3lzL3J3bG9jay5oPgogI2luY2x1ZGUgPHN5cy9zY2hlZC5oPgorI2luY2x1ZGUgPHN5 cy9fdHlwZXMuaD4KICNpZmRlZiBTTVAKICNpbmNsdWRlIDxzeXMvc21wLmg+CiAjZWxzZQpAQCAt MjMyLDcgKzIzMyw3IEBACiAJc3lzbSA9ICZzeXNtYXBfbG1lbVtjcHVdOwogCXN5c20tPnNhdmVk X2ludHIgPSBpbnRyOwogCXZhID0gc3lzbS0+YmFzZTsKLQlucHRlID0gVExCTE9fUEFfVE9fUEZO KHBoeXMpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WIHwgUFRFX0c7CisJbnB0ZSA9IFRM QkxPX1BBX1RPX1BGTihwaHlzKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQ VEVfRzsKIAlwdGUgPSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgdmEpOwogCSpwdGUgPSBucHRlOwog CXN5c20tPnZhbGlkMSA9IDE7CkBAIC0yNTQsMTAgKzI1NSwxMCBAQAogCXN5c20tPnNhdmVkX2lu dHIgPSBpbnRyOwogCXZhMSA9IHN5c20tPmJhc2U7CiAJdmEyID0gc3lzbS0+YmFzZSArIFBBR0Vf U0laRTsKLQlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBoeXMxKSB8IFBURV9DX0NBQ0hFIHwgUFRF X0QgfCBQVEVfViB8IFBURV9HOworCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGh5czEpIHwgUFRF X0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9HOwogCXB0ZSA9IHBtYXBfcHRlKGtl cm5lbF9wbWFwLCB2YTEpOwogCSpwdGUgPSBucHRlOwotCW5wdGUgPSBUTEJMT19QQV9UT19QRk4o cGh5czIpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WIHwgUFRFX0c7CisJbnB0ZSA9IFRM QkxPX1BBX1RPX1BGTihwaHlzMikgfCBQVEVfQ19DQUNIRSB8IFBURV9EIHwgUFRFX1ZBTElEIHwg UFRFX0c7CiAJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHZhMik7CiAJKnB0ZSA9IG5wdGU7 CiAJc3lzbS0+dmFsaWQxID0gMTsKQEAgLTU1Niw5ICs1NTcsMTUgQEAKIAltc2didWZpbml0KG1z Z2J1ZnAsIG1zZ2J1ZnNpemUpOwogCiAJLyoKLQkgKiBTdGVhbCB0aHJlYWQwIGtzdGFjay4KKwkg KiBTdGVhbCB0aHJlYWQwIGtzdGFjay4gIFRoaXMgbXVzdCBiZSBhbGlnbmVkIHRvCisJICogKEtT VEFDS19QQUdFX1NJWkUgKiAyKSBzbyBpdCBjYW4gbWFwcGVkIHRvIGEgc2luZ2xlIFRMQiBlbnRy eS4KKwkgKgorCSAqIFhYWCBUaGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgd2F5IG9mIGdldHRpbmcg YWxpZ25lZCBtZW1vcnkKKwkgKiB3aXRoIHBtYXBfc3RlYWxfbWVtb3J5KCkuCiAJICovCi0Ja3N0 YWNrMCA9IHBtYXBfc3RlYWxfbWVtb3J5KEtTVEFDS19QQUdFUyA8PCBQQUdFX1NISUZUKTsKKwlr c3RhY2swID0gcG1hcF9zdGVhbF9tZW1vcnkoKEtTVEFDS19QQUdFUyArIEtTVEFDS19HVUFSRF9Q QUdFUykgXAorCQkJCQk8PCBQQUdFX1NISUZUKTsKKwlrc3RhY2swID0gcm91bmR1cDIoa3N0YWNr MCwgKEtTVEFDS19QQUdFX1NJWkUgKiAyKSk7CiAKIAl2aXJ0dWFsX2F2YWlsID0gVk1fTUlOX0tF Uk5FTF9BRERSRVNTOwogCXZpcnR1YWxfZW5kID0gVk1fTUFYX0tFUk5FTF9BRERSRVNTOwpAQCAt NjA1LDYgKzYxMiw3IEBACiAKIAlUQUlMUV9JTklUKCZtLT5tZC5wdl9saXN0KTsKIAltLT5tZC5w dl9mbGFncyA9IDA7CisJbS0+bWQucHZfbWVtYXR0ciA9IFZNX01FTUFUVFJfREVGQVVMVDsKIH0K IAogLyoKQEAgLTgwMSw3ICs4MDksNyBAQAogCXB0ZXAgPSBwbWFwX3B0ZShwbWFwLCB2YSk7CiAJ aWYgKHB0ZXAgIT0gTlVMTCkgewogCQlwdGUgPSAqcHRlcDsKLQkJaWYgKHB0ZV90ZXN0KCZwdGUs IFBURV9WKSAmJiAoIXB0ZV90ZXN0KCZwdGUsIFBURV9STykgfHwKKwkJaWYgKHB0ZV90ZXN0KCZw dGUsIFBURV9WQUxJRCkgJiYgKCFwdGVfdGVzdCgmcHRlLCBQVEVfUk8pIHx8CiAJCSAgICAocHJv dCAmIFZNX1BST1RfV1JJVEUpID09IDApKSB7CiAJCQlwdGVfcGEgPSBUTEJMT19QVEVfVE9fUEEo cHRlKTsKIAkJCWlmICh2bV9wYWdlX3BhX3RyeXJlbG9jayhwbWFwLCBwdGVfcGEsICZwYSkpCkBA IC04MzQsOSArODQyLDkgQEAKIAogCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CiAJ b3B0ZSA9ICpwdGU7Ci0JbnB0ZSA9IFRMQkxPX1BBX1RPX1BGTihwYSkgfCBhdHRyIHwgUFRFX0Qg fCBQVEVfViB8IFBURV9HOworCW5wdGUgPSBUTEJMT19QQV9UT19QRk4ocGEpIHwgYXR0ciB8IFBU RV9EIHwgUFRFX1ZBTElEIHwgUFRFX0c7CiAJKnB0ZSA9IG5wdGU7Ci0JaWYgKHB0ZV90ZXN0KCZv cHRlLCBQVEVfVikgJiYgb3B0ZSAhPSBucHRlKQorCWlmIChwdGVfdGVzdCgmb3B0ZSwgUFRFX1ZB TElEKSAmJiBvcHRlICE9IG5wdGUpCiAJCXBtYXBfdXBkYXRlX3BhZ2Uoa2VybmVsX3BtYXAsIHZh LCBucHRlKTsKIH0KIApAQCAtMTQ0OSw3ICsxNDU3LDcgQEAKIAkJCQlpZiAobS0+bWQucHZfZmxh Z3MgJiBQVl9UQUJMRV9SRUYpCiAJCQkJCXZtX3BhZ2VfYWZsYWdfc2V0KG0sIFBHQV9SRUZFUkVO Q0VEKTsKIAkJCQltLT5tZC5wdl9mbGFncyAmPSB+UFZfVEFCTEVfUkVGOwotCQkJCVRBSUxRX1JF TU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQkJCVRBSUxRX1JFTU9WRSgmbS0+ bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQkJCWlmIChUQUlMUV9FTVBUWSgmbS0+bWQucHZf bGlzdCkpCiAJCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJMRSk7CiAJCQkJ cGMtPnBjX21hcFtmaWVsZF0gfD0gMVVMIDw8IGJpdDsKQEAgLTE2MjcsOSArMTYzNSw5IEBACiAJ cHZfZW50cnlfdCBwdjsKIAogCXJ3X2Fzc2VydCgmcHZoX2dsb2JhbF9sb2NrLCBSQV9XTE9DS0VE KTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmcHZoLT5wdl9saXN0LCBwdl9saXN0KSB7CisJVEFJTFFf Rk9SRUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbmV4dCkgewogCQlpZiAocG1hcCA9PSBQVl9Q TUFQKHB2KSAmJiB2YSA9PSBwdi0+cHZfdmEpIHsKLQkJCVRBSUxRX1JFTU9WRSgmcHZoLT5wdl9s aXN0LCBwdiwgcHZfbGlzdCk7CisJCQlUQUlMUV9SRU1PVkUoJnB2aC0+cHZfbGlzdCwgcHYsIHB2 X25leHQpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xNjcxLDcgKzE2NzksNyBAQAogCVBNQVBf TE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQpOwogCWlmICgocHYgPSBnZXRfcHZfZW50cnkocG1h cCwgVFJVRSkpICE9IE5VTEwpIHsKIAkJcHYtPnB2X3ZhID0gdmE7Ci0JCVRBSUxRX0lOU0VSVF9U QUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCVRBSUxRX0lOU0VSVF9UQUlMKCZt LT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7CiAJCXJldHVybiAoVFJVRSk7CiAJfSBlbHNlCiAJ CXJldHVybiAoRkFMU0UpOwpAQCAtMTc0NCw3ICsxNzUyLDcgQEAKIAkvKgogCSAqIElmIHRoZXJl IGlzIG5vIHB0ZSBmb3IgdGhpcyBhZGRyZXNzLCBqdXN0IHNraXAgaXQhCiAJICovCi0JaWYgKCFw dGVfdGVzdChwdHEsIFBURV9WKSkKKwlpZiAoIXB0ZV90ZXN0KHB0cSwgUFRFX1ZBTElEKSkKIAkJ cmV0dXJuOwogCiAJKHZvaWQpcG1hcF9yZW1vdmVfcHRlKHBtYXAsIHB0cSwgdmEsICpwZGUpOwpA QCAtMTgxMCw3ICsxODE4LDcgQEAKIAkJdmEgPSB2YV9uZXh0OwogCQlmb3IgKHB0ZSA9IHBtYXBf cGRlX3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKIAkJICAgIHN2YSAr PSBQQUdFX1NJWkUpIHsKLQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVikpIHsKKwkJCWlmICgh cHRlX3Rlc3QocHRlLCBQVEVfVkFMSUQpKSB7CiAJCQkJaWYgKHZhICE9IHZhX25leHQpIHsKIAkJ CQkJcG1hcF9pbnZhbGlkYXRlX3JhbmdlKHBtYXAsIHZhLCBzdmEpOwogCQkJCQl2YSA9IHZhX25l eHQ7CkBAIC0xODY4LDcgKzE4NzYsNyBAQAogCQkgKiBJZiBpdCdzIGxhc3QgbWFwcGluZyB3cml0 ZWJhY2sgYWxsIGNhY2hlcyBmcm9tIAogCQkgKiB0aGUgcGFnZSBiZWluZyBkZXN0cm95ZWQKIAkg CSAqLwotCQlpZiAoVEFJTFFfTkVYVChwdiwgcHZfbGlzdCkgPT0gTlVMTCkKKwkJaWYgKFRBSUxR X05FWFQocHYsIHB2X25leHQpID09IE5VTEwpCiAJCQltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9p bmRleChwdi0+cHZfdmEsIFBBR0VfU0laRSk7CiAKIAkJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRf Y291bnQtLTsKQEAgLTE4OTcsNyArMTkwNSw3IEBACiAJCX0KIAkJcG1hcF9pbnZhbGlkYXRlX3Bh Z2UocG1hcCwgcHYtPnB2X3ZhKTsKIAotCQlUQUlMUV9SRU1PVkUoJm0tPm1kLnB2X2xpc3QsIHB2 LCBwdl9saXN0KTsKKwkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbmV4dCk7 CiAJCXBtYXBfdW51c2VfcHQocG1hcCwgcHYtPnB2X3ZhLCAqcGRlKTsKIAkJZnJlZV9wdl9lbnRy eShwbWFwLCBwdik7CiAJCVBNQVBfVU5MT0NLKHBtYXApOwpAQCAtMTk1OSw3ICsxOTY3LDcgQEAK IAkJZm9yIChwdGUgPSBwbWFwX3BkZV90b19wdGUocGRlLCBzdmEpOyBzdmEgIT0gdmFfbmV4dDsg cHRlKyssCiAJCSAgICBzdmEgKz0gUEFHRV9TSVpFKSB7CiAJCQlwYml0cyA9ICpwdGU7Ci0JCQlp ZiAoIXB0ZV90ZXN0KCZwYml0cywgUFRFX1YpIHx8IHB0ZV90ZXN0KCZwYml0cywKKwkJCWlmICgh cHRlX3Rlc3QoJnBiaXRzLCBQVEVfVkFMSUQpIHx8IHB0ZV90ZXN0KCZwYml0cywKIAkJCSAgICBQ VEVfUk8pKSB7CiAJCQkJaWYgKHZhICE9IHZhX25leHQpIHsKIAkJCQkJcG1hcF9pbnZhbGlkYXRl X3JhbmdlKHBtYXAsIHZhLCBzdmEpOwpAQCAtMjA3MSw3ICsyMDc5LDcgQEAKIAkvKgogCSAqIE1h cHBpbmcgaGFzIG5vdCBjaGFuZ2VkLCBtdXN0IGJlIHByb3RlY3Rpb24gb3Igd2lyaW5nIGNoYW5n ZS4KIAkgKi8KLQlpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9WKSAmJiBvcGEgPT0gcGEpIHsK KwlpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9WQUxJRCkgJiYgb3BhID09IHBhKSB7CiAJCS8q CiAJCSAqIFdpcmluZyBjaGFuZ2UsIGp1c3QgdXBkYXRlIHN0YXRzLiBXZSBkb24ndCB3b3JyeSBh Ym91dAogCQkgKiB3aXJpbmcgUFQgcGFnZXMgYXMgdGhleSByZW1haW4gcmVzaWRlbnQgYXMgbG9u ZyBhcyB0aGVyZQpAQCAtMjEzNSw3ICsyMTQzLDcgQEAKIAkJaWYgKHB2ID09IE5VTEwpCiAJCQlw diA9IGdldF9wdl9lbnRyeShwbWFwLCBGQUxTRSk7CiAJCXB2LT5wdl92YSA9IHZhOwotCQlUQUlM UV9JTlNFUlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQlUQUlMUV9JTlNF UlRfVEFJTCgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQluZXdwdGUgfD0gUFRFX01B TkFHRUQ7CiAJCWlmICghcHRlX3Rlc3QoJm5ld3B0ZSwgUFRFX1JPKSkKIAkJCXZtX3BhZ2VfYWZs YWdfc2V0KG0sIFBHQV9XUklURUFCTEUpOwpAQCAtMjE2MCw3ICsyMTY4LDcgQEAKIAkgKi8KIAlp ZiAob3JpZ3B0ZSAhPSBuZXdwdGUpIHsKIAkJKnB0ZSA9IG5ld3B0ZTsKLQkJaWYgKHB0ZV90ZXN0 KCZvcmlncHRlLCBQVEVfVikpIHsKKwkJaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVkFMSUQp KSB7CiAJCQlpZiAocHRlX3Rlc3QoJm9yaWdwdGUsIFBURV9NQU5BR0VEKSAmJiBvcGEgIT0gcGEp IHsKIAkJCQlpZiAob20tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKQogCQkJCQl2bV9wYWdl X2FmbGFnX3NldChvbSwgUEdBX1JFRkVSRU5DRUQpOwpAQCAtMjI2OCw3ICsyMjc2LDcgQEAKIAl9 CiAKIAlwdGUgPSBwbWFwX3B0ZShwbWFwLCB2YSk7Ci0JaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1Yp KSB7CisJaWYgKHB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSkgewogCQlpZiAobXB0ZSAhPSBOVUxM KSB7CiAJCQltcHRlLT53aXJlX2NvdW50LS07CiAJCQltcHRlID0gTlVMTDsKQEAgLTIyOTgsNyAr MjMwNiw3IEBACiAJLyoKIAkgKiBOb3cgdmFsaWRhdGUgbWFwcGluZyB3aXRoIFJPIHByb3RlY3Rp b24KIAkgKi8KLQkqcHRlID0gUFRFX1JPIHwgVExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9WOwor CSpwdGUgPSBQVEVfUk8gfCBUTEJMT19QQV9UT19QRk4ocGEpIHwgUFRFX1ZBTElEOwogCWlmICgo bS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkKIAkJKnB0ZSB8PSBQVEVfTUFOQUdFRDsK IApAQCAtMjM1Niw3ICsyMzY0LDcgQEAKIAkJY3B1ID0gUENQVV9HRVQoY3B1aWQpOwogCQlzeXNt ID0gJnN5c21hcF9sbWVtW2NwdV07CiAJCS8qIFNpbmNlIHRoaXMgaXMgZm9yIHRoZSBkZWJ1Z2dl ciwgbm8gbG9ja3Mgb3IgYW55IG90aGVyIGZ1biAqLwotCQlucHRlID0gVExCTE9fUEFfVE9fUEZO KHBhKSB8IFBURV9DX0NBQ0hFIHwgUFRFX0QgfCBQVEVfViB8CisJCW5wdGUgPSBUTEJMT19QQV9U T19QRk4ocGEpIHwgUFRFX0NfQ0FDSEUgfCBQVEVfRCB8IFBURV9WQUxJRCB8CiAJCSAgICBQVEVf RzsKIAkJcHRlID0gcG1hcF9wdGUoa2VybmVsX3BtYXAsIHN5c20tPmJhc2UpOwogCQkqcHRlID0g bnB0ZTsKQEAgLTI0ODQsNyArMjQ5Miw3IEBACiAJCQl2YV9uZXh0ID0gZXZhOwogCQlmb3IgKHB0 ZSA9IHBtYXBfcGRlX3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKIAkJ ICAgIHN2YSArPSBQQUdFX1NJWkUpIHsKLQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfVikpCisJ CQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1ZBTElEKSkKIAkJCQljb250aW51ZTsKIAkJCWlmICgh cHRlX3Rlc3QocHRlLCBQVEVfVykpCiAJCQkJcGFuaWMoInBtYXBfdW53aXJlOiBwdGUgJSNqeCBp cyBtaXNzaW5nIFBHX1ciLApAQCAtMjY2Niw3ICsyNjc0LDcgQEAKIAlLQVNTRVJUKHN5c20tPnZh bGlkMSA9PSAwLCAoInBtYXBfcXVpY2tfZW50ZXJfcGFnZTogUFRFIGJ1c3kiKSk7CiAKIAlwdGUg PSBwbWFwX3B0ZShrZXJuZWxfcG1hcCwgc3lzbS0+YmFzZSk7Ci0JKnB0ZSA9IFRMQkxPX1BBX1RP X1BGTihwYSkgfCBQVEVfRCB8IFBURV9WIHwgUFRFX0cgfAorCSpwdGUgPSBUTEJMT19QQV9UT19Q Rk4ocGEpIHwgUFRFX0QgfCBQVEVfVkFMSUQgfCBQVEVfRyB8CiAJICAgIChpc19jYWNoZWFibGVf cGFnZShwYSwgbSkgPyBQVEVfQ19DQUNIRSA6IFBURV9DX1VOQ0FDSEVEKTsKIAlzeXNtLT52YWxp ZDEgPSAxOwogCkBAIC0yNzE5LDcgKzI3MjcsNyBAQAogCSAgICAoInBtYXBfcGFnZV9leGlzdHNf cXVpY2s6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CiAJcnYgPSBGQUxTRTsKIAlyd193 bG9jaygmcHZoX2dsb2JhbF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlz dCwgcHZfbGlzdCkgeworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0 KSB7CiAJCWlmIChQVl9QTUFQKHB2KSA9PSBwbWFwKSB7CiAJCQlydiA9IFRSVUU7CiAJCQlicmVh azsKQEAgLTI3NzIsNyArMjc4MCw3IEBACiAJCQkJS0FTU0VSVChwZGUgIT0gTlVMTCAmJiAqcGRl ICE9IDAsCiAJCQkJICAgICgicG1hcF9yZW1vdmVfcGFnZXM6IHBkZSIpKTsKIAkJCQlwdGUgPSBw bWFwX3BkZV90b19wdGUocGRlLCBwdi0+cHZfdmEpOwotCQkJCWlmICghcHRlX3Rlc3QocHRlLCBQ VEVfVikpCisJCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkpCiAJCQkJCXBhbmljKCJw bWFwX3JlbW92ZV9wYWdlczogYmFkIHB0ZSIpOwogCQkJCXRwdGUgPSAqcHRlOwogCkBAIC0yODAy LDcgKzI4MTAsNyBAQAogCQkJCXB2X2VudHJ5X2NvdW50LS07CiAJCQkJcGMtPnBjX21hcFtmaWVs ZF0gfD0gYml0bWFzazsKIAkJCQlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9jb3VudC0tOwotCQkJ CVRBSUxRX1JFTU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X2xpc3QpOworCQkJCVRBSUxRX1JF TU9WRSgmbS0+bWQucHZfbGlzdCwgcHYsIHB2X25leHQpOwogCQkJCWlmIChUQUlMUV9FTVBUWSgm bS0+bWQucHZfbGlzdCkpCiAJCQkJCXZtX3BhZ2VfYWZsYWdfY2xlYXIobSwgUEdBX1dSSVRFQUJM RSk7CiAJCQkJcG1hcF91bnVzZV9wdChwbWFwLCBwdi0+cHZfdmEsICpwZGUpOwpAQCAtMjgzMyw3 ICsyODQxLDcgQEAKIAkJcmV0dXJuIChydik7CiAKIAlyd19hc3NlcnQoJnB2aF9nbG9iYWxfbG9j aywgUkFfV0xPQ0tFRCk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1kLnB2X2xpc3QsIHB2X2xp c3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbmV4dCkgewogCQlw bWFwID0gUFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJcHRlID0gcG1hcF9wdGUo cG1hcCwgcHYtPnB2X3ZhKTsKQEAgLTI4NjMsNyArMjg3MSw3IEBACiAJaWYgKChtLT5vZmxhZ3Mg JiBWUE9fVU5NQU5BR0VEKSAhPSAwKQogCQlyZXR1cm4gKGNvdW50KTsKIAlyd193bG9jaygmcHZo X2dsb2JhbF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlz dCkgeworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7CiAJCXBt YXAgPSBQVl9QTUFQKHB2KTsKIAkJUE1BUF9MT0NLKHBtYXApOwogCQlwdGUgPSBwbWFwX3B0ZShw bWFwLCBwdi0+cHZfdmEpOwpAQCAtMjg5NywxMSArMjkwNSwxMSBAQAogCWlmICghdm1fcGFnZV94 YnVzaWVkKG0pICYmIChtLT5hZmxhZ3MgJiBQR0FfV1JJVEVBQkxFKSA9PSAwKQogCQlyZXR1cm47 CiAJcndfd2xvY2soJnB2aF9nbG9iYWxfbG9jayk7Ci0JVEFJTFFfRk9SRUFDSChwdiwgJm0tPm1k LnB2X2xpc3QsIHB2X2xpc3QpIHsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwg cHZfbmV4dCkgewogCQlwbWFwID0gUFZfUE1BUChwdik7CiAJCVBNQVBfTE9DSyhwbWFwKTsKIAkJ cHRlID0gcG1hcF9wdGUocG1hcCwgcHYtPnB2X3ZhKTsKLQkJS0FTU0VSVChwdGUgIT0gTlVMTCAm JiBwdGVfdGVzdChwdGUsIFBURV9WKSwKKwkJS0FTU0VSVChwdGUgIT0gTlVMTCAmJiBwdGVfdGVz dChwdGUsIFBURV9WQUxJRCksCiAJCSAgICAoInBhZ2Ugb24gcHZfbGlzdCBoYXMgbm8gcHRlIikp OwogCQlwYml0cyA9ICpwdGU7CiAJCWlmIChwdGVfdGVzdCgmcGJpdHMsIFBURV9EKSkgewpAQCAt MzA0MCw3ICszMDQ4LDcgQEAKIAkJdmEgPSB2YV9uZXh0OwogCQlmb3IgKHB0ZSA9IHBtYXBfcGRl X3RvX3B0ZShwZGUsIHN2YSk7IHN2YSAhPSB2YV9uZXh0OyBwdGUrKywKIAkJICAgIHN2YSArPSBQ QUdFX1NJWkUpIHsKLQkJCWlmICghcHRlX3Rlc3QocHRlLCBQVEVfTUFOQUdFRCB8IFBURV9WKSkg eworCQkJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9NQU5BR0VEIHwgUFRFX1ZBTElEKSkgewogCQkJ CWlmICh2YSAhPSB2YV9uZXh0KSB7CiAJCQkJCXBtYXBfaW52YWxpZGF0ZV9yYW5nZShwbWFwLCB2 YSwgc3ZhKTsKIAkJCQkJdmEgPSB2YV9uZXh0OwpAQCAtMzEwNiw3ICszMTE0LDcgQEAKIAlpZiAo KG0tPmFmbGFncyAmIFBHQV9XUklURUFCTEUpID09IDApCiAJCXJldHVybjsKIAlyd193bG9jaygm cHZoX2dsb2JhbF9sb2NrKTsKLQlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZf bGlzdCkgeworCVRBSUxRX0ZPUkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9uZXh0KSB7CiAJ CXBtYXAgPSBQVl9QTUFQKHB2KTsKIAkJUE1BUF9MT0NLKHBtYXApOwogCQlwdGUgPSBwbWFwX3B0 ZShwbWFwLCBwdi0+cHZfdmEpOwpAQCAtMzIwOCw3ICszMjE2LDcgQEAKIHJldHJ5OgogCXB0ZXAg PSBwbWFwX3B0ZShwbWFwLCBhZGRyKTsKIAlwdGUgPSAocHRlcCAhPSBOVUxMKSA/ICpwdGVwIDog MDsKLQlpZiAoIXB0ZV90ZXN0KCZwdGUsIFBURV9WKSkgeworCWlmICghcHRlX3Rlc3QoJnB0ZSwg UFRFX1ZBTElEKSkgewogCQl2YWwgPSAwOwogCQlnb3RvIG91dDsKIAl9CkBAIC0zMzQ1LDcgKzMz NTMsNyBAQAogI2VuZGlmCiAJCQlmb3IgKGsgPSAwOyBrIDwgTlBURVBHOyBrKyspIHsKIAkJCQlw dGUgPSBwZGVba107Ci0JCQkJaWYgKHB0ZSA9PSAwIHx8ICFwdGVfdGVzdCgmcHRlLCBQVEVfVikp CisJCQkJaWYgKHB0ZSA9PSAwIHx8ICFwdGVfdGVzdCgmcHRlLCBQVEVfVkFMSUQpKQogCQkJCQlj b250aW51ZTsKIAkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwdGUpOwogCQkJCXZhID0gKCh1X2xv bmcpaSA8PCBTRUdTSElGVCkgfCAoaiA8PCBQRFJTSElGVCkgfCAoayA8PCBQQUdFX1NISUZUKTsK QEAgLTMzOTMsMTUgKzM0MDEsMTUgQEAKIAlwdF9lbnRyeV90IHJ3OwogCiAJaWYgKCEocHJvdCAm IFZNX1BST1RfV1JJVEUpKQotCQlydyA9IFBURV9WIHwgUFRFX1JPOworCQlydyA9IFBURV9WQUxJ RCB8IFBURV9STzsKIAllbHNlIGlmICgobS0+b2ZsYWdzICYgVlBPX1VOTUFOQUdFRCkgPT0gMCkg ewogCQlpZiAoKGFjY2VzcyAmIFZNX1BST1RfV1JJVEUpICE9IDApCi0JCQlydyA9IFBURV9WIHwg UFRFX0Q7CisJCQlydyA9IFBURV9WQUxJRCB8IFBURV9EOwogCQllbHNlCi0JCQlydyA9IFBURV9W OworCQkJcncgPSBQVEVfVkFMSUQ7CiAJfSBlbHNlCiAJCS8qIE5lZWRuJ3QgZW11bGF0ZSBhIG1v ZGlmaWVkIGJpdCBmb3IgdW5tYW5hZ2VkIHBhZ2VzLiAqLwotCQlydyA9IFBURV9WIHwgUFRFX0Q7 CisJCXJ3ID0gUFRFX1ZBTElEIHwgUFRFX0Q7CiAJcmV0dXJuIChydyk7CiB9CiAKQEAgLTM0MjQs MTMgKzM0MzIsMTMgQEAKIAkJcGFuaWMoInBtYXBfZW11bGF0ZV9tb2RpZmllZDogY2FuJ3QgZmlu ZCBQVEUiKTsKICNpZmRlZiBTTVAKIAkvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IHNvbWUgb3RoZXIg Q1BVIGNoYW5nZWQgbS1iaXQgKi8KLQlpZiAoIXB0ZV90ZXN0KHB0ZSwgUFRFX1YpIHx8IHB0ZV90 ZXN0KHB0ZSwgUFRFX0QpKSB7CisJaWYgKCFwdGVfdGVzdChwdGUsIFBURV9WQUxJRCkgfHwgcHRl X3Rlc3QocHRlLCBQVEVfRCkpIHsKIAkJdGxiX3VwZGF0ZShwbWFwLCB2YSwgKnB0ZSk7CiAJCVBN QVBfVU5MT0NLKHBtYXApOwogCQlyZXR1cm4gKDApOwogCX0KICNlbHNlCi0JaWYgKCFwdGVfdGVz dChwdGUsIFBURV9WKSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkKKwlpZiAoIXB0ZV90ZXN0KHB0 ZSwgUFRFX1ZBTElEKSB8fCBwdGVfdGVzdChwdGUsIFBURV9EKSkKIAkJcGFuaWMoInBtYXBfZW11 bGF0ZV9tb2RpZmllZDogaW52YWxpZCBwdGUiKTsKICNlbmRpZgogCWlmIChwdGVfdGVzdChwdGUs IFBURV9STykpIHsKQEAgLTM0NDYsNiArMzQ1NCwxOCBAQAogfQogCiAvKgorICogcG1hcF9lbXVs YXRlX3JlZmVyZW5jZWQKKyAqCisgKiBSZWZlcmVuY2UgYml0IGVtdWxhdGlvbiBpcyBub3Qgc3Vw cG9ydGVkIGluIHRoaXMgcG1hcCBpbXBsZW1lbnRhdGlvbi4KKyAqLworaW50CitwbWFwX2VtdWxh dGVfcmVmZXJlbmNlZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEpCit7CisKKwkJcmV0dXJu ICgxKTsKK30KKworLyoKICAqCVJvdXRpbmU6CXBtYXBfa2V4dHJhY3QKICAqCUZ1bmN0aW9uOgog ICoJCUV4dHJhY3QgdGhlIHBoeXNpY2FsIHBhZ2UgYWRkcmVzcyBhc3NvY2lhdGVkCkBAIC0zNTIy LDE3ICszNTQyLDI2IEBACiAKIAlpZiAobSAhPSBOVUxMKSB7CiAJCWZvciAocHYgPSBUQUlMUV9G SVJTVCgmbS0+bWQucHZfbGlzdCk7IHB2OwotCQkgICAgcHYgPSBUQUlMUV9ORVhUKHB2LCBwdl9s aXN0KSkgeworCQkgICAgcHYgPSBUQUlMUV9ORVhUKHB2LCBwdl9uZXh0KSkgewogCQkJbWlwc19k Y2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3ZhLCBQQUdFX1NJWkUpOwogCQl9CiAJfQog fQogCisvKgorICogU2V0cyB0aGUgbWVtb3J5IGF0dHJpYnV0ZSBmb3IgdGhlIHNwZWNpZmllZCBw YWdlLgorICovCiB2b2lkCiBwbWFwX3BhZ2Vfc2V0X21lbWF0dHIodm1fcGFnZV90IG0sIHZtX21l bWF0dHJfdCBtYSkKIHsKIAogCS8qCisJICogU2V0IHRoZSBtZW1hdHRyIGZpZWxkIHNvIHRoZSBh cHByb3ByaWF0ZSBiaXRzIGFyZSBzZXQgaW4gdGhlCisJICogUFRFIGFzIG1hcHBpbmdzIGFyZSBj cmVhdGVkLgorCSAqLworCW0tPm1kLnB2X21lbWF0dHIgPSBtYTsKKworCS8qCiAJICogSXQgYXBw ZWFycyB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGJlZm9yZSBhbnkgbWFw cGluZ3MKIAkgKiBmb3IgdGhlIHBhZ2UgYXJlIGVzdGFibGlzaGVkLiAgSWYgdGhpcyBldmVyIGNo YW5nZXMsIHRoaXMgY29kZSB3aWxsCiAJICogbmVlZCB0byB3YWxrIHRoZSBwdl9saXN0IGFuZCBt YWtlIGVhY2ggb2YgdGhlIGV4aXN0aW5nIG1hcHBpbmdzCmRpZmYgLS1naXQgYS9zeXMvbWlwcy9t aXBzL21pbmlkdW1wX21hY2hkZXAuYyBiL3N5cy9taXBzL21pcHMvbWluaWR1bXBfbWFjaGRlcC5j Ci0tLSBhL3N5cy9taXBzL21pcHMvbWluaWR1bXBfbWFjaGRlcC5jCisrKyBiL3N5cy9taXBzL21p cHMvbWluaWR1bXBfbWFjaGRlcC5jCkBAIC0xNzksNyArMTc5LDcgQEAKIAkJcHRlID0gcG1hcF9w dGUoa2VybmVsX3BtYXAsIHZhKTsKIAkJS0FTU0VSVChwdGUgIT0gTlVMTCwgKCJwdGUgZm9yICVq eCBpcyBOVUxMIiwgKHVpbnRtYXhfdCl2YSkpOwogCQlmb3IgKGkgPSAwOyBpIDwgTlBURVBHOyBp KyspIHsKLQkJCWlmIChwdGVfdGVzdCgmcHRlW2ldLCBQVEVfVikpIHsKKwkJCWlmIChwdGVfaXNf dmFsaWQoJnB0ZVtpXSkpIHsKIAkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwdGVbaV0pOwogCQkJ CWlmIChpc19kdW1wYWJsZShwYSkpCiAJCQkJCWR1bXBfYWRkX3BhZ2UocGEpOwpkaWZmIC0tZ2l0 IGEvc3lzL21pcHMvbWlwcy9tYWNoZGVwLmMgYi9zeXMvbWlwcy9taXBzL21hY2hkZXAuYwotLS0g YS9zeXMvbWlwcy9taXBzL21hY2hkZXAuYworKysgYi9zeXMvbWlwcy9taXBzL21hY2hkZXAuYwpA QCAtMjgzLDkgKzI4Myw5IEBACiAjZW5kaWYKIAlwcm9jX2xpbmt1cDAoJnByb2MwLCAmdGhyZWFk MCk7CiAKLQlLQVNTRVJUKChrc3RhY2swICYgUEFHRV9NQVNLKSA9PSAwLAotCQkoImtzdGFjazAg aXMgbm90IGFsaWduZWQgb24gYSBwYWdlIGJvdW5kYXJ5OiAweCUwbHgiLAotCQkobG9uZylrc3Rh Y2swKSk7CisJS0FTU0VSVCgoa3N0YWNrMCAmICgoS1NUQUNLX1BBR0VfU0laRSAqIDIpIC0gMSkp ID09IDAsCisJCSgia3N0YWNrMCBpcyBub3QgYWxpZ25lZCBvbiBhIHBhZ2UgKDB4JTBseCkgYm91 bmRhcnk6IDB4JTBseCIsCisJCShsb25nKShLU1RBQ0tfUEFHRV9TSVpFICogMiksIChsb25nKWtz dGFjazApKTsKIAl0aHJlYWQwLnRkX2tzdGFjayA9IGtzdGFjazA7CiAJdGhyZWFkMC50ZF9rc3Rh Y2tfcGFnZXMgPSBLU1RBQ0tfUEFHRVM7CiAJLyogCkBAIC00NTksNyArNDU5LDcgQEAKIAkgKiBX ZSB1c2UgYSB3aXJlZCB0bGIgaW5kZXggdG8gZG8gdGhpcyBvbmUtdGltZSBtYXBwaW5nLgogCSAq LwogCXBhID0gdnRvcGh5cyhwY3B1KTsKLQlwdGUgPSBQVEVfRCB8IFBURV9WIHwgUFRFX0cgfCBQ VEVfQ19DQUNIRTsKKwlwdGUgPSBQVEVfRCB8IFBURV9WQUxJRCB8IFBURV9SRUYgfCBQVEVfRyB8 IFBURV9DX0NBQ0hFOwogCXRsYl9pbnNlcnRfd2lyZWQoUENQVV9UTEJfRU5UUlksICh2bV9vZmZz ZXRfdClwY3B1cCwKIAkJCSBUTEJMT19QQV9UT19QRk4ocGEpIHwgcHRlLAogCQkJIFRMQkxPX1BB X1RPX1BGTihwYSArIFBBR0VfU0laRSkgfCBwdGUpOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlw cy9nZW5hc3N5bS5jIGIvc3lzL21pcHMvbWlwcy9nZW5hc3N5bS5jCi0tLSBhL3N5cy9taXBzL21p cHMvZ2VuYXNzeW0uYworKysgYi9zeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMKQEAgLTEwMiw2ICsx MDIsOSBAQAogQVNTWU0oVERGX0FTVFBFTkRJTkcsIFRERl9BU1RQRU5ESU5HKTsKIEFTU1lNKE1B WENPTUxFTiwgTUFYQ09NTEVOKTsKIEFTU1lNKE1EVERfQ09QMlVTRUQsIE1EVERfQ09QMlVTRUQp OworI2lmZGVmIEtTVEFDS19MQVJHRV9QQUdFCitBU1NZTShLU1RBQ0tfVExCTUFTS19NQVNLLCBL U1RBQ0tfVExCTUFTS19NQVNLKTsKKyNlbmRpZgogCiBBU1NZTShNSVBTX0tTRUcwX1NUQVJULCBN SVBTX0tTRUcwX1NUQVJUKTsKIEFTU1lNKE1JUFNfS1NFRzFfU1RBUlQsIE1JUFNfS1NFRzFfU1RB UlQpOwpkaWZmIC0tZ2l0IGEvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUyBiL3N5cy9taXBzL21p cHMvZXhjZXB0aW9uLlMKLS0tIGEvc3lzL21pcHMvbWlwcy9leGNlcHRpb24uUworKysgYi9zeXMv bWlwcy9taXBzL2V4Y2VwdGlvbi5TCkBAIC04NSw2ICs4NSwyOCBAQAogICovCiAjZGVmaW5lCUlO VFJDTlRfQ09VTlQJMjU2CiAKKy8qCisgKiBHZW5lcmFsIE1JUFMgQ1BVIHN0YXRlIGZvciBleGNl cHRpb25zOgorICoKKyAqIEVQQyBSZWdpc3RlciB3aWxsIHBvaW50IHRvIHRoZSBpbnN0cnVjdGlv biB0aGF0IGNhdXNlZCBmYXVsdCwgdW5sZXNzIHRoZQorICogZmF1bHRpbmcgaW5zdHJ1Y3Rpb24g d2FzIGluIGEgYnJhbmNoIGRlbGF5IHNsb3QuICBJbiB0aGF0IGNhc2UsIGl0IHdpbGwKKyAqIHBv aW50IHRvIHRoZSBicmFuY2ggYmVmb3JlIHRoZSBicmFuY2ggZGVsYXkgc2xvdCBpbnN0cnVjdGlv bi4KKyAqCisgKiBUaGUgY2F1c2UgcmVnaXN0ZXIgd2lsbCBjb250YWluIHdoYXQgY2F1c2VkIHRo ZSBleGNlcHRpb24gYW5kIHNvbWUgc3RhdGUKKyAqIGFib3V0IHRoZSBpbnRlcnJ1cHQuCisgKgor ICogVGhlIHN0YXR1cyByZWdpc3RlciBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3Rh dHVzIG9mIHRoZSBDUFUgc3VjaAorICogYXM6IEtlcm5lbC9Vc2VyIG1vZGUgYml0LCBpbnRlcnJ1 cHQgZW5hYmxlIGJpdC4KKyAqCisgKiBUaGUgQmFkVmFkZHIgcmVnaXN0ZXIgY29udGFpbnMgdGhl IHZpcnR1YWwgYWRkcmVzcyB0aGF0IGNhdXNlIHRoZSBsYXN0CisgKiBleGNlcHRpb24uCisgKgor ICogVGhlIENvbnRleHQgcmVnaXN0ZXIgY29udGFpbnMgdGhlIGxvd2VyIDIyIGJpdHMgb2YgdGhl IFZQTiAoc3RhcnRpbmcgYXQKKyAqIGJpdCA0KSB0aGF0IGNhdXNlIHRoZSBsYXN0IGV4Y2VwdGlv biBleGNlcHQgYml0MCBhbmQgYml0MSBhcmUgemVyby4gVGhlCisgKiB1cHBlciBiaXRzIChiaXRz IDIzIHRvIDMxIGZvciBNSVBTMzIgYW5kIGJpdHMgMjMgdG8gNjMpIGFyZSBzZXQgdW5kZXIKKyAq IGtlcm5lbCBjb250cm9sIChpLmUuIHBvaW50IHRvIHRoZSBwYWdlIHRhYmxlKS4gVGhlIENvbnRl eHQvWENvbnRleHQKKyAqIHJlZ2lzdGVycyBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGJ5IEZyZWVC U0QuCisgKi8KIAogLyoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTEwLDEzICsxMzIsMjcg QEAKIC8qCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCi0gKiBNaXBzRG9UTEJNaXNzIC0tCisg KiBNaXBzRG9UTEJNaXNzIC0tICAoVVRMQiBtaXNzKQogICoKLSAqIFRoaXMgaXMgdGhlIHJlYWwg VExCIE1pc3MgSGFuZGxlciBjb2RlLgorICogVGhpcyBpcyB0aGUgcmVhbCBUTEIgTWlzcyBIYW5k bGVyIGNvZGUuICBBIG1pc3Mgd2FzIGdlbmVyYXRlZCB3aGVuIHRoZQorICogYWNjZXNzIGlzIHRv IGt1c2VnIGFuZCB0aGVyZSB3YXMgbm90IG1hdGNoaW5nIG1hcHBpbmcgbG9hZGVkIGludG8gdGhl IFRMQi4KICAqICdzZWdiYXNlJyBwb2ludHMgdG8gdGhlIGJhc2Ugb2YgdGhlIHNlZ21lbnQgdGFi bGUgZm9yIHVzZXIgcHJvY2Vzc2VzLgogICoKKyAqIFRoZSBDUFUgZG9lcyB0aGUgZm9sbG93aW5n IGZvciBhbiBVVExCIG1pc3M6CisgKiAtIFNldHMgdGhlIEVQQyByZWdpc3Rlci4KKyAqIC0gU2V0 cyB0aGUgQ2F1c2UgcmVnaXN0ZXIuCisgKiAtIFNldHMgdGhlIFN0YXR1cyByZWdpc3Rlci4gU2hp ZnRzIEsvVSBhbmQgSUUgYml0cyBvdmVyIG9uZSBhbmQgY2xlYXJzCisgKiAgIHRoZSBjdXJyZW50 IEtlcm5lbC9Vc2VyIGFuZCBJbnRlcnJ1cHQgRW5hYmxlIGJpdHMuIFNvIHRoZSBwcm9jZXNzb3IK KyAqICAgaXMgaW4ga2VybmVsIG1vZGUgd2l0aCB0aGUgaW50ZXJ1cHRzIHR1cm5lZCBvZmYuCisg KiAtIFNldHMgQmFkVmFkZHIgcmVnaXN0ZXIuCisgKiAtIFNldHMgdGhlIENvbnRleHQvWENvbnRl eHQgcmVnaXN0ZXIocykuCisgKiAtIFNldHMgdGhlIFRMQiBFbnRyeUhpIHJlZ2lzdGVyIHRvIGNv bnRhaW4gVlBOIG9mIHRoZSBmYXVsdGluZyBhZGRyZXNzLgorICoKICAqIERvbid0IGNoZWNrIGZv ciBpbnZhbGlkIHB0ZSdzIGhlcmUuIFdlIGxvYWQgdGhlbSBhcyB3ZWxsIGFuZAogICogbGV0IHRo ZSBwcm9jZXNzb3IgdHJhcCB0byBsb2FkIHRoZSBjb3JyZWN0IHZhbHVlIGFmdGVyIHNlcnZpY2Uu CisgKgorICogWFhYIFRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIGNoYW5nZWQgdG8gYSBsaW5lYXIg cGFnZSB0YWJsZSBhbmQgdXNlIHRoZQorICogQ29udGV4dCBhbmQgWENvbnRleHQgcmVnaXN0ZXJz LiAgVGhhdCBpcyByZWFsbHkgd2hhdCBpdCB3YXMgZGVzaWduZWQgZm9yLgogICotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCiAgKi8KICAJLnNldCBwdXNoCkBAIC0xMzcsMjUgKzE3Myw4OSBAQAogI2lmZGVm IF9fbWlwc19uNjQKIAlQVFJfU1JMCQlrMCwgUERSU0hJRlQgLSBQVFJTSElGVAkJIyBrMD1WUE4K IAlhbmRpCQlrMCwgazAsIFBERVBUUk1BU0sJCSMgazA9cGRlIG9mZnNldAotCVBUUl9BRERVCWsx LCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCi0JUFRSX0wJCWsxLCAwKGsxKQkJCSMg azE9cGRlIGVudHJ5Ci0JTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFk ZHJlc3MgKGFnYWluKQorCVBUUl9BRERVCWswLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRy ZXNzCisJUFRSX0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVudHJ5CiAJYmVxCQlrMSwgemVybywg MmYJCQkjID09MCAtLSBubyBwYWdlIHRhYmxlCisJbm9wCisKKyNpZmRlZiBNSVBTNjRfTkVXX1BN QVAKKwkjIENoZWNrIGZvciBzdXBlcnBhZ2UKKwlHRVRfU1VQRVJQQUdFX0lEWChrMSkJCQkJIyBr MT1zdXBlcnBhZ2UgaW5kZXggZnJvbSBQVEUKKwliZXEJCWsxLCB6ZXJvLCBub3Rfc3VwZXJwYWdl CQkjID09MCAtLSBub3Qgc3VwZXJwYWdlCisJUFRSX0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVu dHJ5IChkZWxheSBzbG90KQorCisJIyBTZXQgdGhlIHJlZmVyZW5jZWQgYml0IGluIHRoZSBQREUg aWYgdmFsaWQuCisJIworCSMgWFhYIFNldHRpbmcgdGhlIHJlZmVyZW5jZWQgYml0IGhlcmUgc2F2 ZXMgYSBmYXVsdCBsYXRlciBidXQgaXQKKwkjIG1heSBub3QgYmUgc2FmZSB0byBkbyBzby4gVGhl cmVmb3JlLCBqdXN0IHRha2UgdGhlIGZhdWx0IHRvIHNldAorCSMgdGhlIHJlZmVyZW5jZSBiaXQu CisjCUlGX1ZBTElEX1NFVF9SRUZCSVQoazEsIGswLCAwLCAxKQorCisJIyBUaGUgUERFIGlzIGFj dHVhbGx5IGEgc3VwZXJwYWdlIFBURS4gIFN0b3JlIGl0IGluIHRoZSBUTEIgbG8wIHJlZy4KKwlD TEVBUl9QVEVfU1dCSVRTKGsxKQorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzAJCSMg bG8wIGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJIyBDb21wdXRlIHRoZSBQRk4gZm9yIHRoZSBU TEIgbG8xIHJlZ2lzdGVyIGZyb20gazEoPVBURSBmb3IgVExCIGxvMCkuCisJR0VUX09ERF8xTV9Q Rk5fRlJPTV9FVkVOKGsxKQkJCSMgazE9T2RkIFBGTiBpbiBQVEUgcG9zdGlvbgorCisJIyBHZXQg aGFyZCBUTEIgZmxhZyBiaXRzLgorCVBUUl9MCQlrMCwgMChrMCkJCQkjIGswPXBkZSBlbnRyeSAo YWdhaW4pCisJR0VUX0hXX1RMQl9GTEFHUyhrMCkJCQkJIyBrMD1odyBUTEIgZmxhZyBiaXRzCisJ b3IJCWsxLCBrMSwgazAJCQkjIGsxPVBURT1QRk4gfCBod2ZsZyBiaXRzCisJIyBMb2FkIGl0IGlu dG8gdGhlIFRMQiBMbzEgcmVnaXN0ZXIuCisJI0NMRUFSX1BURV9TV0JJVFMoazEpCQkJCSMgTm8g U1cgYml0cyB0byBjbGVhcgorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8x IGlzIGxvYWRlZAorCUNPUDBfU1lOQworCisJIyBMb2FkIHRoZSBUTEIgUGFnZU1hc2sgZm9yIDFN IHBhZ2VzLgorCWRsaQkJazAsIFRMQk1BU0tfMU1fUEFHRQkJIyBQYWdlTWFzayBmb3IgMU0gUGFn ZQorCVBURV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMgUGFnZU1hc2sgaXMgbG9h ZGVkCisJQ09QMF9TWU5DCisKKwl0bGJ3cgkJCQkJCSMgd3JpdGUgdG8gdGxiCisJSEFaQVJEX0RF TEFZCisJUFRFX01UQzAJemVybywgTUlQU19DT1BfMF9UTEJfUEdfTUFTSwkjIHplcm8gb3V0IFBh Z2VNYXNrIHJlZworCUNPUDBfU1lOQworCWVyZXQJCQkJCQkjIHJldHVybiBmcm9tIGV4Y2VwdGlv bgorCitub3Rfc3VwZXJwYWdlOgorI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLwogI2VuZGlm CisJTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWlu KQogCVBUUl9TUkwJCWswLCBQQUdFX1NISUZUIC0gUFRFU0hJRlQJIzBiOiBrMD1WUE4gKGFrYSB2 YT4+MTApCiAJYW5kaQkJazAsIGswLCBQVEUyTUFTSwkJIzBjOiBrMD1wYWdlIHRhYiBvZmZzZXQK IAlQVFJfQUREVQlrMSwgazEsIGswCQkJIzBkOiBrMT1wdGUgYWRkcmVzcwotCVBURV9MCQlrMCwg MChrMSkJCQkjMGU6IGswPWxvMCBwdGUKLQlQVEVfTAkJazEsIFBURVNJWkUoazEpCQkJIzBmOiBr MT1sbzAgcHRlCisKKwlQVEVfTAkJazAsIDAoazEpCQkJIyBrMD1sbzAgcHRlCisKKwkjIFNldCB0 aGUgcmVmZXJlbmNlZCBiaXQgaW4gdGhlIFBERSBpZiB2YWxpZC4KKwkjCisJIyBYWFggU2V0dGlu ZyB0aGUgcmVmZXJlbmNlZCBiaXQgaGVyZSBzYXZlcyBhIGZhdWx0IGxhdGVyIGJ1dCBpdAorCSMg bWF5IG5vdCBiZSBzYWZlIHRvIGRvIHNvLiBUaGVyZWZvcmUsIGp1c3QgdGFrZSB0aGUgZmF1bHQg dG8gc2V0CisJIyB0aGUgcmVmZXJlbmNlIGJpdC4KKyMJSUZfVkFMSURfU0VUX1JFRkJJVChrMCwg azEsIDAsIDIpCisKIAlDTEVBUl9QVEVfU1dCSVRTKGswKQogCVBURV9NVEMwCWswLCBNSVBTX0NP UF8wX1RMQl9MTzAJCSMxMjogbG8wIGlzIGxvYWRlZAogCUNPUDBfU1lOQwotCUNMRUFSX1BURV9T V0JJVFMoazEpCi0JUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQkJIzE1OiBsbzEgaXMg bG9hZGVkCisKKwlQVEVfTAkJazAsIFBURVNJWkUoazEpCQkJIyBrMD1sbzEgcHRlCisKKwkjIFNl dCB0aGUgcmVmZXJlbmNlZCBiaXQgaW4gdGhlIFBERSBpZiB2YWxpZC4KKwkjCisJIyBYWFggU2V0 dGluZyB0aGUgcmVmZXJlbmNlZCBiaXQgaGVyZSBzYXZlcyBhIGZhdWx0IGxhdGVyIGJ1dCBpdAor CSMgbWF5IG5vdCBiZSBzYWZlIHRvIGRvIHNvLiBUaGVyZWZvcmUsIGp1c3QgdGFrZSB0aGUgZmF1 bHQgdG8gc2V0CisJIyB0aGUgcmVmZXJlbmNlIGJpdC4KKyMJSUZfVkFMSURfU0VUX1JFRkJJVChr MCwgazEsIDAsIDMpCisKKwlDTEVBUl9QVEVfU1dCSVRTKGswKQorCVBURV9NVEMwCWswLCBNSVBT X0NPUF8wX1RMQl9MTzEJCSMxNTogbG8xIGlzIGxvYWRlZAogCUNPUDBfU1lOQwogCXRsYndyCQkJ CQkJIzFhOiB3cml0ZSB0byB0bGIKIAlIQVpBUkRfREVMQVkKIAllcmV0CQkJCQkJIzFmOiByZXRV cm4gZnJvbSBleGNlcHRpb24KKwogMToJagkJTWlwc1RMQk1pc3NFeGNlcHRpb24JCSMyMDoga2Vy bmVsIGV4Y2VwdGlvbgogCW5vcAkJCQkJCSMyMTogYnJhbmNoIGRlbGF5IHNsb3QKIDI6CWoJCVNs b3dGYXVsdAkJCSMyMjogbm8gcGFnZSB0YWJsZSBwcmVzZW50CkBAIC0yNjUsNyArMzY1LDcgQEAK ICNlbmRpZgogCiAvKgotICogU2F2ZSBDUFUgYW5kIENQMCByZWdpc3RlciBzdGF0ZS4KKyAqIFNh dmUgQ1BVIGFuZCBDUDAgcmVnaXN0ZXIgc3RhdGUgd2hlbiB0YWtpbmcgYW4gZXhjZXB0aW9uIGlu IGtlcm5lbCBtb2RlLgogICoKICAqIFRoaXMgaXMgc3RyYWlnaHRmb3J3YXJkIGV4Y2VwdCBmb3Ig c2F2aW5nIHRoZSBleGNlcHRpb24gcHJvZ3JhbQogICogY291bnRlci4gVGhlIGRkYiBiYWNrdHJh Y2UgY29kZSBsb29rcyBmb3IgdGhlIGZpcnN0IGluc3RydWN0aW9uCkBAIC00MDYsNiArNTA2LDcg QEAKIAlTQVZFX1JFRyhhMSwgU1IsIHNwKQogCVJFU1RPUkVfQ1BVCQkJIyB2MCBjb250YWlucyB0 aGUgcmV0dXJuIGFkZHJlc3MuCiAJc3luYworCiAJZXJldAogCS5zZXQJYXQKIEVORChNaXBzS2Vy bkdlbkV4Y2VwdGlvbikKQEAgLTg4NCwyMSArOTg1LDYwIEBACiAJUFRSX1NSTAkJazAsIFBEUlNI SUZUIC0gUFRSU0hJRlQJCSMgazA9cGRlIG9mZnNldCAoYWxtb3N0KQogCWJlcQkJazEsIHplcm8s IE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5vIHBkZSB0YWIKIAlhbmRpCQlrMCwgazAs IFBERVBUUk1BU0sJCSMgazA9cGRlIG9mZnNldAotCVBUUl9BRERVCWsxLCBrMCwgazEJCQkjIGsx PXBkZSBlbnRyeSBhZGRyZXNzCi0JUFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9cGRlIGVudHJ5CisJ UFRSX0FERFUJazAsIGswLCBrMQkJCSMgazA9cGRlIGVudHJ5IGFkZHJlc3MKKwlQVFJfTAkJazEs IDAoazApCQkJIyBrMT1wZGUgZW50cnkKIAogCS8qIFZhbGlkYXRlIHBkZSB0YWJsZSBwb2ludGVy LiAgKi8KIAliZXF6CQlrMSwgM2YKIAlub3AKKworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCSMg Q2hlY2sgZm9yIHN1cGVycGFnZQorCUdFVF9TVVBFUlBBR0VfSURYKGsxKQkJCQkjIGsxPXN1cGVy cGFnZSBpbmRleCBmcm9tIFBURQorCWJlcQkJazEsIHplcm8sIG5vdF9zcGcJCSMgPT0wIC0tIG5v dCBzdXBlcnBhZ2UKKwlQVFJfTAkJazEsIDAoazApCQkJIyBrMT1wZGUgZW50cnkgKGRlbGF5IHNs b3QpCisKKwkvKiBWYWxpZGF0ZSBwYWdlIHRhYmxlIGVudHJ5LiAgKi8KKwlhbmRpCQlrMSwgUFRF X1ZSCisJYmVxegkJazEsIDNmCisJbm9wCisKKwkjIFRoZSBQREUgaXMgYWN0dWFsbHkgYSBzdXBl cnBhZ2UgUFRFLiAgU3RvcmUgaXQgaW4gdGhlIFRMQiBsbzAgcmVnLgorCUNMRUFSX1BURV9TV0JJ VFMoazEpCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMAkJIyBsbzAgaXMgbG9hZGVk CisJQ09QMF9TWU5DCisKKwkjIENvbXB1dGUgdGhlIFBGTiBmb3IgdGhlIFRMQiBsbzEgcmVnaXN0 ZXIgZnJvbSBrMSg9UFRFIGZvciBUTEIgbG8wKS4KKwlHRVRfT0REXzFNX1BGTl9GUk9NX0VWRU4o azEpCQkJIyBrMT1PZGQgUEZOIGluIFBURSBwb3N0aW9uCisKKwkjIEdldCBoYXJkIFRMQiBmbGFn IGJpdHMuCisJUFRSX0wJCWswLCAwKGswKQkJCSMgazA9cGRlIGVudHJ5IChhZ2FpbikKKwlHRVRf SFdfVExCX0ZMQUdTKGswKQkJCQkjIGswPWh3IFRMQiBmbGFnIGJpdHMKKwlvcgkJazEsIGsxLCBr MAkJCSMgazE9UFRFPVBGTiB8IGh3ZmxnIGJpdHMKKwkjIExvYWQgaXQgaW50byB0aGUgVExCIExv MSByZWdpc3Rlci4KKwkjIENMRUFSX1BURV9TV0JJVFMoazEpCQkJCSMgTm8gU1cgYml0cyB0byBj bGVhcgorCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJCSMgbG8xIGlzIGxvYWRlZAor CUNPUDBfU1lOQworCisJIyBMb2FkIHRoZSBUTEIgUGFnZU1hc2sgZm9yIDFNIHBhZ2VzLgorCWRs aQkJazAsIFRMQk1BU0tfMU1fUEFHRQkJIyBQYWdlTWFzayBmb3IgMU0gUGFnZQorCVBURV9NVEMw CWswLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMgUGFnZU1hc2sgaXMgbG9hZGVkCisJQ09QMF9T WU5DCisKKwliCQl0bGJfaW5zZXJ0X2VudHJ5CisJbm9wCisKK25vdF9zcGc6CisjZW5kaWYgLyog TUlQUzY0X05FV19QTUFQICovCiAjZW5kaWYKIAlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFE RFIJIyBrMD1iYWQgYWRkcmVzcyAoYWdhaW4pCiAJUFRSX1NSTAkJazAsIFBBR0VfU0hJRlQgLSBQ VEVTSElGVAkjIGswPVZQTgogCWFuZGkJCWswLCBrMCwgUFRFTUFTSwkJCSMgazA9cGFnZSB0YWIg b2Zmc2V0CiAJUFRSX0FERFUJazEsIGsxLCBrMAkJCSMgazE9cHRlIGFkZHJlc3MKIAlQVEVfTAkJ azAsIDAoazEpCQkJIyBrMD10aGlzIFBURQogCiAJLyogVmFsaWRhdGUgcGFnZSB0YWJsZSBlbnRy eS4gICovCi0JYW5kaQkJazAsIFBURV9WCisJYW5kaQkJazAsIFBURV9WUgogCWJlcXoJCWswLCAz ZgogCW5vcAogCkBAIC05MDgsMjUgKzEwNDgsMzEgQEAKIAlub3AKIAogCVBURV9MCQlrMCwgMChr MSkKLQlQVEVfTAkJazEsIFBURVNJWkUoazEpCisKIAlDTEVBUl9QVEVfU1dCSVRTKGswKQogCVBU RV9NVEMwCWswLCBNSVBTX0NPUF8wX1RMQl9MTzAKIAlDT1AwX1NZTkMKLQlDTEVBUl9QVEVfU1dC SVRTKGsxKQotCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEKKworCVBURV9MCQlrMCwg UFRFU0laRShrMSkKKworCUNMRUFSX1BURV9TV0JJVFMoazApCisJUFRFX01UQzAJazAsIE1JUFNf Q09QXzBfVExCX0xPMQogCUNPUDBfU1lOQwogCiAJYgkJdGxiX2luc2VydF9lbnRyeQogCW5vcAog CiBvZGRfcGFnZToKIAlQVEVfTAkJazAsIC1QVEVTSVpFKGsxKQotCVBURV9MCQlrMSwgMChrMSkK KwogCUNMRUFSX1BURV9TV0JJVFMoazApCiAJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX0xP MAogCUNPUDBfU1lOQwotCUNMRUFSX1BURV9TV0JJVFMoazEpCi0JUFRFX01UQzAJazEsIE1JUFNf Q09QXzBfVExCX0xPMQorCisJUFRFX0wJCWswLCAwKGsxKQorCisJQ0xFQVJfUFRFX1NXQklUUyhr MCkKKwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfTE8xCiAJQ09QMF9TWU5DCiAKIHRsYl9p bnNlcnRfZW50cnk6CkBAIC05MzYsMTEgKzEwODIsMTUgQEAKIAlibHR6CQlrMCwgdGxiX2luc2Vy dF9yYW5kb20KIAlub3AKIAl0bGJ3aQorCVBURV9NVEMwCXplcm8sIE1JUFNfQ09QXzBfVExCX1BH X01BU0sKKwlDT1AwX1NZTkMKIAllcmV0CiAJc3Nub3AKIAogdGxiX2luc2VydF9yYW5kb206CiAJ dGxid3IKKwlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCisJQ09QMF9TWU5D CiAJZXJldAogCXNzbm9wCiAKQEAgLTEwNTQsMjEgKzEyMDQsNjcgQEAKICNpZmRlZiBfX21pcHNf bjY0CiAJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRSU0hJRlQJCSMgazA9VlBOCiAJYW5kaQkJ azAsIGswLCBQREVQVFJNQVNLCQkjIGswPXBkZSBvZmZzZXQKLQlQVFJfQUREVQlrMSwgazAsIGsx CQkJIyBrMT1wZGUgZW50cnkgYWRkcmVzcwotCVBUUl9MCQlrMSwgMChrMSkJCQkjIGsxPXBkZSBl bnRyeQorCVBUUl9BRERVCWswLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCisJUFRS X0wJCWsxLCAwKGswKQkJCSMgazE9cGRlIGVudHJ5CisKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAK KwkjIENoZWNrIGZvciBzdXBlcnBhZ2UKKwlHRVRfU1VQRVJQQUdFX0lEWChrMSkJCQkJIyBrMT1z dXBlcnBhZ2UgaW5kZXggZnJvbSBQVEUKKwliZXEJCWsxLCB6ZXJvLCBub3Rfa3NwZwkJIyA9PTAg LS0gbm90IHN1cGVycGFnZQorCVBUUl9MCQlrMSwgMChrMCkJCQkjIGsxPXBkZSBlbnRyeSAoZGVs YXkgc2xvdCkKKworCSMgWFhYIFJlZmVyZW5jZSBiaXQgZW11bGF0aW9uCisKKwkjIFRoZSBQREUg aXMgYWN0dWFsbHkgYSBzdXBlcnBhZ2UgUFRFLiAgU3RvcmUgaXQgaW4gdGhlIFRMQiBsbzAgcmVn LgorCUNMRUFSX1BURV9TV0JJVFMoazEpCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xP MAkJIyBsbzAgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwkjIENvbXB1dGUgdGhlIFBGTiBmb3Ig dGhlIFRMQiBsbzEgcmVnaXN0ZXIgZnJvbSBrMSg9UFRFIGZvciBUTEIgbG8wKS4KKwlHRVRfT0RE XzFNX1BGTl9GUk9NX0VWRU4oazEpCQkJIyBrMT1PZGQgUEZOIGluIFBURSBwb3N0aW9uCisKKwkj IEdldCBoYXJkIFRMQiBmbGFnIGJpdHMuCisJUFRSX0wJCWswLCAwKGswKQkJCSMgazA9cGRlIGVu dHJ5IChhZ2FpbikKKwlHRVRfSFdfVExCX0ZMQUdTKGswKQkJCQkjIGswPWh3IFRMQiBmbGFnIGJp dHMKKwlvcgkJazEsIGsxLCBrMAkJCSMgazE9UFRFPVBGTiB8IGh3ZmxnIGJpdHMKKwkjIExvYWQg aXQgaW50byB0aGUgVExCIExvMSByZWdpc3Rlci4KKwkjQ0xFQVJfUFRFX1NXQklUUyhrMSkJCQkJ IyBObyBTVyBCaXRzIHRvIGNsZWFyCisJUFRFX01UQzAJazEsIE1JUFNfQ09QXzBfVExCX0xPMQkJ IyBsbzEgaXMgbG9hZGVkCisJQ09QMF9TWU5DCisKKwkjIExvYWQgdGhlIFRMQiBQYWdlTWFzayBm b3IgMU0gcGFnZXMuCisJZGxpCQlrMCwgVExCTUFTS18xTV9QQUdFCQkjIFBhZ2VNYXNrIGZvciAx TSBQYWdlCisJUFRFX01UQzAJazAsIE1JUFNfQ09QXzBfVExCX1BHX01BU0sJIyBQYWdlTWFzayBp cyBsb2FkZWQKKwlDT1AwX1NZTkMKKworCXRsYndyCQkJCQkJIyB3cml0ZSB0byB0bGIKKwlIQVpB UkRfREVMQVkKKwlQVEVfTVRDMAl6ZXJvLCBNSVBTX0NPUF8wX1RMQl9QR19NQVNLCSMgemVybyBv dXQgUGFnZU1hc2sgcmVnCisJQ09QMF9TWU5DCisJZXJldAkJCQkJCSMgcmV0dXJuIGZyb20gZXhj ZXB0aW9uCisKK25vdF9rc3BnOgorI2VuZGlmIC8qIE1JUFM2NF9ORVdfUE1BUCAqLworCiAJTUZD MAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogICAJ YmVxCQlrMSwgemVybywgTWlwc0tlcm5HZW5FeGNlcHRpb24JIyA9PTAgLS0gbm8gcGFnZSB0YWJs ZQogI2VuZGlmCiAJUFRSX1NSTAkJazAsIFBBR0VfU0hJRlQgLSBQVEVTSElGVAkjIGswPVZQTgog CWFuZGkJCWswLCBrMCwgUFRFMk1BU0sJCSMgazA9cGFnZSB0YWIgb2Zmc2V0CiAJUFRSX0FERFUJ azEsIGsxLCBrMAkJCSMgazE9cHRlIGFkZHJlc3MKKwogCVBURV9MCQlrMCwgMChrMSkJCQkjIGsw PWxvMCBwdGUKLQlQVEVfTAkJazEsIFBURVNJWkUoazEpCQkJIyBrMT1sbzEgcHRlCisKKwkjIFhY WCBSZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorCiAJQ0xFQVJfUFRFX1NXQklUUyhrMCkKIAlQVEVf TVRDMAlrMCwgTUlQU19DT1BfMF9UTEJfTE8wCQkjIGxvMCBpcyBsb2FkZWQKIAlDT1AwX1NZTkMK LQlDTEVBUl9QVEVfU1dCSVRTKGsxKQotCVBURV9NVEMwCWsxLCBNSVBTX0NPUF8wX1RMQl9MTzEJ CSMgbG8xIGlzIGxvYWRlZAorCisJUFRFX0wJCWswLCBQVEVTSVpFKGsxKQkJCSMgazA9bG8xIHB0 ZQorCisJQ0xFQVJfUFRFX1NXQklUUyhrMCkKKwlQVEVfTVRDMAlrMCwgTUlQU19DT1BfMF9UTEJf TE8xCQkjIGxvMSBpcyBsb2FkZWQKIAlDT1AwX1NZTkMKIAl0bGJ3cgkJCQkJIyB3cml0ZSB0byB0 bGIKIAlIQVpBUkRfREVMQVkKZGlmZiAtLWdpdCBhL3N5cy9taXBzL21pcHMvY3B1LmMgYi9zeXMv bWlwcy9taXBzL2NwdS5jCi0tLSBhL3N5cy9taXBzL21pcHMvY3B1LmMKKysrIGIvc3lzL21pcHMv bWlwcy9jcHUuYwpAQCAtMzEzLDYgKzMxMywyNSBAQAogCWNwdWluZm8tPmwyLmRjX3NpemUgPSBj cHVpbmZvLT5sMi5kY19saW5lc2l6ZQogCSAgICAqIGNwdWluZm8tPmwyLmRjX25zZXRzICogY3B1 aW5mby0+bDIuZGNfbndheXM7CiAjZW5kaWYKKworCS8qCisJICogUHJvYmUgUGFnZU1hc2sgcmVn aXN0ZXIgdG8gc2VlIHdoYXQgc2l6ZXMgb2YgcGFnZXMgYXJlIHN1cHBvcnRlZAorCSAqIGJ5IHdy aXRpbmcgYWxsIG9uZSdzIGFuZCB0aGVuIHJlYWRpbmcgaXQgYmFjay4KKwkgKi8KKwltaXBzX3dy X3BhZ2VtYXNrKH4wKTsKKwljcHVpbmZvLT50bGJfcGdtYXNrID0gbWlwc19yZF9wYWdlbWFzaygp OworCW1pcHNfd3JfcGFnZW1hc2soTUlQUzNfUEdNQVNLXzRLKTsKKworI2lmZGVmIEtTVEFDS19M QVJHRV9QQUdFCisJaWYgKChjcHVpbmZvLT50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzE2Sykg PT0gMCkKKwkJcGFuaWMoIiVzOiAxNksgc2l6ZWQgcGFnZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkg dGhpcyBDUFUuIiwKKwkJICAgIF9fZnVuY19fKTsKKyNlbmRpZiAvKiBLU1RBQ0tfTEFSR0VfUEFH RSAqLworI2lmZGVmIE1JUFM2NF9ORVdfUE1BUAorCWlmICgoY3B1aW5mby0+dGxiX3BnbWFzayAm IE1JUFMzX1BHTUFTS18xTSkgPT0gMCkKKwkJcGFuaWMoIiVzOiAxTSBzaXplZCBwYWdlcyBhcmUg bm90IHN1cHBvcnRlZCBieSB0aGlzIENQVS4iLAorCQkgICAgX19mdW5jX18pOworI2VuZGlmIC8q IE1JUFM2NF9ORVdfUE1BUCAqLwogfQogCiB2b2lkCkBAIC0zODksNiArNDA4LDMwIEBACiAJCQlw cmludGYoIkZpeGVkIG1hcHBpbmciKTsKIAkJfQogCQlwcmludGYoIiwgJWQgZW50cmllcyAiLCBj cHVpbmZvLnRsYl9uZW50cmllcyk7CisJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2spIHsKKwkJCXBy aW50ZigiKCIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS19NQVNL WCkKKwkJCQlwcmludGYoIjFLICIpOworCQkJcHJpbnRmKCI0SyAiKTsKKwkJCWlmIChjcHVpbmZv LnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfMTZLKQorCQkJCXByaW50ZigiMTZLICIpOworCQkJ aWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BHTUFTS182NEspCisJCQkJcHJpbnRmKCI2 NEsgIik7CisJCQlpZiAoY3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzI1NkspCisJ CQkJcHJpbnRmKCIyNTZLICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAmIE1JUFMzX1BH TUFTS18xTSkKKwkJCQlwcmludGYoIjFNICIpOworCQkJaWYgKGNwdWluZm8udGxiX3BnbWFzayAm IE1JUFMzX1BHTUFTS180TSkKKwkJCQlwcmludGYoIjRNICIpOworCQkJaWYgKGNwdWluZm8udGxi X3BnbWFzayAmIE1JUFMzX1BHTUFTS18xNk0pCisJCQkJcHJpbnRmKCIxNk0gIik7CisJCQlpZiAo Y3B1aW5mby50bGJfcGdtYXNrICYgTUlQUzNfUEdNQVNLXzY0TSkKKwkJCQlwcmludGYoIjY0TSAi KTsKKwkJCWlmIChjcHVpbmZvLnRsYl9wZ21hc2sgJiBNSVBTM19QR01BU0tfMjU2TSkKKwkJCQlw cmludGYoIjI1Nk0gIik7CisJCQlwcmludGYoInBnIHNpemVzKSIpOworCQl9CisJCXByaW50Zigi XG4iKTsKIAl9CiAKIAlpZiAoY3B1aW5mby50bGJfcGdtYXNrKSB7CmRpZmYgLS1naXQgYS9zeXMv bWlwcy9pbmNsdWRlL3ZtcGFyYW0uaCBiL3N5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oCi0tLSBh L3N5cy9taXBzL2luY2x1ZGUvdm1wYXJhbS5oCisrKyBiL3N5cy9taXBzL2luY2x1ZGUvdm1wYXJh bS5oCkBAIC0xMDAsMTUgKzEwMCw0NyBAQAogI2RlZmluZQlGUkVFQlNEMzJfVVNSU1RBQ0sJKCgo dm1fb2Zmc2V0X3QpMHg4MDAwMDAwMCkgLSBQQUdFX1NJWkUpCiAjZW5kaWYKIAorI2lmZGVmIE1J UFM2NF9ORVdfUE1BUAogLyoKLSAqIERpc2FibGUgc3VwZXJwYWdlIHJlc2VydmF0aW9ucy4gKG5v dCBzdXJlIGlmIHRoaXMgaXMgcmlnaHQKLSAqIEkgY29waWVkIGl0IGZyb20gQVJNKQorICogRW5h YmxlIHN1cGVycGFnZSByZXNlcnZhdGlvbnM6IDEgbGV2ZWwuCisgKgorICogVk1fTlJFU0VSVkxF VkVMIHNwZWNpZmllcyBhIG51bWJlciBvZiBwcm9tb3Rpb24gbGV2ZWxzIGVuYWJsZWQuCisgKiBD dXJyZW50bHkgbWlwczY0IG9ubHkgc3VwcG9ydHMgb25lIHNpemUgb3IgbGV2ZWwgKFZNX0xFVkVM XzBfT1JERVIpIG9mCisgKiBzdXBlcnBhZ2VzICgyTUIpCisgKi8KKyNpZm5kZWYJVk1fTlJFU0VS VkxFVkVMCisjZGVmaW5lCVZNX05SRVNFUlZMRVZFTAkJCTEKKyNlbmRpZgorCisvKgorICogTGV2 ZWwgMCByZXNlcnZhdGlvbnMgY29uc2lzdCBvZiA1MTIgKDJeOSkgcGFnZXMgKDJNQikuCisgKi8K KyNpZm5kZWYJVk1fTEVWRUxfMF9PUkRFUgorI2RlZmluZQlWTV9MRVZFTF8wX09SREVSCQk5Cisj ZW5kaWYKKworLyoKKyAqIFRoZSBsYXJnZXN0IGFsbG9jYXRpb24gc2l6ZSBpcyA0TUIuCisgKi8K KyNkZWZpbmUJVk1fTkZSRUVPUkRFUgkJCTExCisKKyNlbHNlIC8qICEgTUlQUzY0X05FV19QTUFQ ICovCisKKy8qCisgKiBEaXNhYmxlIHN1cGVycGFnZSByZXNlcnZhdGlvbnMuCiAgKi8KICNpZm5k ZWYJVk1fTlJFU0VSVkxFVkVMCiAjZGVmaW5lCVZNX05SRVNFUlZMRVZFTAkJMAogI2VuZGlmCiAK IC8qCisgKiBUaGUgbGFyZ2VzdCBhbGxvY2F0aW9uIHNpemUgaXMgMU1CLgorICovCisjZGVmaW5l CVZNX05GUkVFT1JERVIJCTkKKworI2VuZGlmIC8qICEgTUlQUzY0X05FV19QTUFQICovCisKKy8q CiAgKiBIb3cgbWFueSBwaHlzaWNhbCBwYWdlcyBwZXIga21lbSBhcmVuYSB2aXJ0dWFsIHBhZ2Uu CiAgKi8KICNpZm5kZWYgVk1fS01FTV9TSVpFX1NDQUxFCkBAIC0xNzcsMTEgKzIwOSw2IEBACiAj ZGVmaW5lCVZNX0xPV01FTV9CT1VOREFSWQkoKHZtX3BhZGRyX3QpMHgyMDAwMDAwMCkKICNlbmRp ZgogCi0vKgotICogVGhlIGxhcmdlc3QgYWxsb2NhdGlvbiBzaXplIGlzIDFNQi4KLSAqLwotI2Rl ZmluZQlWTV9ORlJFRU9SREVSCQk5Ci0KICNkZWZpbmUJWkVST19SRUdJT05fU0laRQkoNjQgKiAx MDI0KQkvKiA2NEtCICovCiAKICNpZm5kZWYgX19taXBzX242NApkaWZmIC0tZ2l0IGEvc3lzL21p cHMvaW5jbHVkZS9wdGUuaCBiL3N5cy9taXBzL2luY2x1ZGUvcHRlLmgKLS0tIGEvc3lzL21pcHMv aW5jbHVkZS9wdGUuaAorKysgYi9zeXMvbWlwcy9pbmNsdWRlL3B0ZS5oCkBAIC0yOSw2ICsyOSwx MCBAQAogI2lmbmRlZglfTUFDSElORV9QVEVfSF8KICNkZWZpbmUJX01BQ0hJTkVfUFRFX0hfCiAK KyNpZiAhZGVmaW5lZChfS0VSTkVMKQorI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KKyNlbmRp ZgorCiAjaWZuZGVmIF9MT0NPUkUKICNpZiBkZWZpbmVkKF9fbWlwc19uNjQpIHx8IGRlZmluZWQo X19taXBzX24zMikgLyogIFBIWVNBRERSXzY0X0JJVCAqLwogdHlwZWRlZgl1aW50NjRfdCBwdF9l bnRyeV90OwpAQCAtNzIsMjIgKzc2LDI1IEBACiAgKiBOT1RFOiBUaGlzIG1lYW5zIHRoYXQgZm9y IDMyLWJpdCB1c2Ugb2YgQ1AwLCB3ZSBhcmVuJ3QgYWJsZSB0byBzZXQgdGhlIHRvcAogICogYml0 IG9mIFBGTiB0byBhIG5vbi16ZXJvIHZhbHVlLCBhcyBzb2Z0d2FyZSBpcyB1c2luZyBpdCEgIFRo aXMgcGh5c2ljYWwKICAqIG1lbW9yeSBzaXplIGxpbWl0IG1heSBub3QgYmUgc3VmZmljaWVudGx5 IGVuZm9yY2VkIGVsc2V3aGVyZS4KKyAqCisgKiBYWFhSVzogT24gQ0hFUkksIGJpdHMgNjMgYW5k IDYyIGFyZSB1c2VkIGZvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRoYXQKKyAqIHByZXZlbnQg bG9hZGluZyBhbmQgc3RvcmluZyBvZiBjYXBhYmlsaXRpZXMsIHNvIHdlIGhhdmUgcmVkdWNlZCB0 aGUgNTUtYml0CisgKiBzaGlmdCB0byA1MyBiaXRzLgogICovCiAjaWYgZGVmaW5lZChfX21pcHNf bjY0KSB8fCBkZWZpbmVkKF9fbWlwc19uMzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KLSNkZWZp bmUJVExCTE9fU1dCSVRTX1NISUZUCSg1NSkKLSNkZWZpbmUJVExCTE9fU1dCSVRTX0NMRUFSX1NI SUZUCSg5KQotI2RlZmluZQlUTEJMT19QRk5fTUFTSwkJMHgzRkZGRkZGQzBVTEwKKyNkZWZpbmUJ VExCTE9fU1dCSVRTX1NISUZUCSg1MykJCS8qIFhYWFJXOiBXYXMgNTUuICovCisjZGVmaW5lCVRM QkxPX1JFRl9CSVRfU0hJRlQJKDYxKQorI2RlZmluZQlUTEJMT19TV0JJVFNfQ0xFQVJfU0hJRlQJ KDExKQkvKiBYWFhTUzogV2FzIDkuICovCisjZGVmaW5lCVRMQkxPX1BGTl9NQVNLCQkweEZGRkZG RkMwVUxMCisjZGVmaW5lCVRMQl8xTV9TVVBFUlBBR0VfU0hJRlQJKFBEUlNISUZUKQorI2RlZmlu ZQlUTEJMT19TV0JJVFNfTUFTSwkoKHB0X2VudHJ5X3QpMHg3RiA8PCBUTEJMT19TV0JJVFNfU0hJ RlQpCiAjZWxzZQogI2RlZmluZQlUTEJMT19TV0JJVFNfU0hJRlQJKDI5KQogI2RlZmluZQlUTEJM T19TV0JJVFNfQ0xFQVJfU0hJRlQJKDMpCiAjZGVmaW5lCVRMQkxPX1BGTl9NQVNLCQkoMHgxRkZG RkZDMCkKKyNkZWZpbmUJVExCTE9fU1dCSVRTX01BU0sJKChwdF9lbnRyeV90KTB4NyA8PCBUTEJM T19TV0JJVFNfU0hJRlQpCiAjZW5kaWYKICNkZWZpbmUJVExCTE9fUEZOX1NISUZUCQkoNikKLSNk ZWZpbmUJVExCTE9fU1dCSVRTX01BU0sJKChwdF9lbnRyeV90KTB4NyA8PCBUTEJMT19TV0JJVFNf U0hJRlQpCi0jZGVmaW5lCVRMQkxPX1BBX1RPX1BGTihwYSkJKCgoKHBhKSA+PiBUTEJfUEFHRV9T SElGVCkgPDwgVExCTE9fUEZOX1NISUZUKSAmIFRMQkxPX1BGTl9NQVNLKQotI2RlZmluZQlUTEJM T19QRk5fVE9fUEEocGZuKQkoKHZtX3BhZGRyX3QpKChwZm4pID4+IFRMQkxPX1BGTl9TSElGVCkg PDwgVExCX1BBR0VfU0hJRlQpCi0jZGVmaW5lCVRMQkxPX1BURV9UT19QRk4ocHRlKQkoKHB0ZSkg JiBUTEJMT19QRk5fTUFTSykKLSNkZWZpbmUJVExCTE9fUFRFX1RPX1BBKHB0ZSkJKFRMQkxPX1BG Tl9UT19QQShUTEJMT19QVEVfVE9fUEZOKChwdGUpKSkpCiAKIC8qCiAgKiBYWFggVGhpcyBjb21t ZW50IGlzIG5vdCBjb3JyZWN0IGZvciBhbnl0aGluZyBtb3JlIG1vZGVybiB0aGFuIFI0Sy4KQEAg LTEyMSwyNSArMTI4LDgzIEBACiAjZW5kaWYgLyogZGVmaW5lZChfX21pcHNfbjY0KSAqLwogCiAv KgorICogUFRFIEhhcmR3YXJlIEJpdHMgKEVudHJ5TG8wLTEgcmVnaXN0ZXIgZmllbGRzKQorICoK KyAqIExvd2VyIGJpdHMgb2YgYSAzMiBiaXQgUFRFOgorICoKKyAqICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDI4IC0tLS0tLS0tLS0tLS0tLSA2IDUgLSAzICAyICAgMSAgIDAKKyAq ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAg ICAgICBQRk4gICAgICAgIHwgIEMgIHwgRCB8IFZSfCBHIHwKKyAqICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg KgorICogTG93ZXIgYml0cyBvZiBhIDY0IGJpdCBQVEU6CisgKgorICogIDUyIC0tLS0tLS0tLS0t LS0tLS0tLS0tIDM0ICAzMyAtLS0tLS0tLS0tLS0tLS0tLS0tIDYgNSAtIDMgIDIgICAxICAgMAor ICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgICAgICAgUmVzZXJ2ZWQgKFplcm8pICAgICB8ICAgICAg ICAgIFBGTiAgICAgICAgICAgfCAgQyAgfCBEIHwgVlJ8IEcgfAorICogIC0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyAqCiAgKiBUTEIgZmxhZ3MgbWFuYWdlZCBpbiBoYXJkd2FyZToKKyAqICAgIFBGTjoJUGFnZSBG cmFtZSBOdW1iZXIuCiAgKiAJQzoJQ2FjaGUgYXR0cmlidXRlLgogICogCUQ6CURpcnR5IGJpdC4g IFRoaXMgbWVhbnMgYSBwYWdlIGlzIHdyaXRhYmxlLiAgSXQgaXMgbm90CiAgKiAJCXNldCBhdCBm aXJzdCwgYW5kIGEgd3JpdGUgaXMgdHJhcHBlZCwgYW5kIHRoZSBkaXJ0eQogICogCQliaXQgaXMg c2V0LiAgU2VlIGFsc28gUFRFX1JPLgotICogCVY6CVZhbGlkIGJpdC4gIE9idmlvdXMsIGlzbid0 IGl0PworICogCVZSOglWYWxpZC9SZWZlcmVuY2UgYml0LiBTZWUgYWxzbyBQVEVfU1YuCiAgKiAJ RzoJR2xvYmFsIGJpdC4gIFRoaXMgbWVhbnMgdGhhdCB0aGlzIG1hcHBpbmcgaXMgcHJlc2VudAog ICogCQlpbiBFVkVSWSBhZGRyZXNzIHNwYWNlLCBhbmQgdG8gaWdub3JlIHRoZSBBU0lEIHdoZW4K ICAqIAkJaXQgaXMgbWF0Y2hlZC4KICAqLwogI2RlZmluZQlQVEVfQyhhdHRyKQkJKChhdHRyICYg MHgwNykgPDwgMykKICNkZWZpbmUJUFRFX0NfVU5DQUNIRUQJCShQVEVfQyhNSVBTX0NDQV9VTkNB Q0hFRCkpCiAjZGVmaW5lCVBURV9DX0NBQ0hFCQkoUFRFX0MoTUlQU19DQ0FfQ0FDSEVEKSkKICNk ZWZpbmUJUFRFX0QJCQkweDA0Ci0jZGVmaW5lCVBURV9WCQkJMHgwMgorI2RlZmluZQlQVEVfVlIJ CQkweDAyCiAjZGVmaW5lCVBURV9HCQkJMHgwMQogCisjaWZkZWYgQ1BVX0NIRVJJCisvKgorICog Q0hFUkkgRW50cnlMbyBleHRlbnNpb25zIHRoYXQgbGltaXQgc3RvcmluZyBsb2FkaW5nIGFuZCBz dG9yaW5nIHRhZ2dlZAorICogdmFsdWVzLgorICovCisjZGVmaW5lCVBURV9TQwkJCSgweDFVTEwg PDwgNjMpCisjZGVmaW5lCVBURV9MQwkJCSgweDFVTEwgPDwgNjIpCisjZW5kaWYKKwogLyoKKyAq IFBURSBTb2Z0d2FyZSBCaXRzCisgKgorICogVXBwZXIgYml0cyBvZiBhIDMyIGJpdCBQVEU6Cisg KgorICogICAgIDMxICAgMzAgICAyOQorICogICAgLS0tLS0tLS0tLS0tLS0KKyAqICAgfCBNTiB8 IFcgIHwgUk8gfAorICogICAgLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBVcHBlciBiaXRzIG9mIGEg NjQgYml0IFBURToKKyAqCisgKiAgIDYzLTYyICAgNjEtNjAgIDU5ICAgNTggLS0gNTYgICAgNTUg ICA1NCAgIDUzCisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorICogIHwgIFJHICB8ICAgICAgfCBTViB8IFBHIFNaIElEWCB8IE1OIHwgVyAgfCBSTyB8 CisgKiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoK ICAqIFZNIGZsYWdzIG1hbmFnZWQgaW4gc29mdHdhcmU6CisgKglSRzoJUmVnaW9uLgkgKFJlc2Vy dmVkLiBDdXJyZW50bHkgbm90IHVzZWQuKQorICoJU1Y6CVNvZnQgVmFsaWQgYml0LgorICoJUEcg U1ogSURYOiBQYWdlIFNpemUgSW5kZXggKDAtNykuCisgKgkJSW5kZXgJUGFnZSBNYXNrIChCaW5h cnkpCUhXIFBhZ2UgU2l6ZQorICoJCS0tLS0tCS0tLS0tLS0tLS0tLS0tLS0tLS0JLS0tLS0tLS0t LS0tCisgKgkJMAkwMDAwIDAwMDAgMDAwMCAwMDAwCSAgNEsKKyAqCQkxCTAwMDAgMDAwMCAwMDAw IDAwMTEJIDE2SworICoJCTIJMDAwMCAwMDAwIDAwMDAgMTExMQkgNjRLCisgKgkJMwkwMDAwIDAw MDAgMDAxMSAxMTExCTI1NksKKyAqCQk0CTAwMDAgMDAwMCAxMTExIDExMTEJICAxTQorICoJCTUJ MDAwMCAwMDExIDExMTEgMTExMQkgIDRNCisgKgkJNgkwMDAwIDExMTEgMTExMSAxMTExCSAxNk0K KyAqIChNSVBTIDM6KQorICoJCTcJMDAxMSAxMTExIDExMTEgMTExMQkgNjRNCisgKgkJOAkxMTEx IDExMTEgMTExMSAxMTExCTI1Nk0gKE5vdCBjdXJyZW50bHkgc3VwcG9ydGVkKQorICoKICAqIAlS TzoJUmVhZCBvbmx5LiAgTmV2ZXIgc2V0IFBURV9EIG9uIHRoaXMgcGFnZSwgYW5kIGRvbid0CiAg KiAJCWxpc3RlbiB0byByZXF1ZXN0cyB0byB3cml0ZSB0byBpdC4KICAqIAlXOglXaXJlZC4gID8/ PwpAQCAtMTUxLDEzICsyMTYsMjkxIEBACiAjZGVmaW5lCVBURV9STwkJCSgocHRfZW50cnlfdCkw eDAxIDw8IFRMQkxPX1NXQklUU19TSElGVCkKICNkZWZpbmUJUFRFX1cJCQkoKHB0X2VudHJ5X3Qp MHgwMiA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCiAjZGVmaW5lCVBURV9NQU5BR0VECQkoKHB0X2Vu dHJ5X3QpMHgwNCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjaWYgZGVmaW5lZChfX21pcHNfbjY0 KSB8fCBkZWZpbmVkKF9fbWlwc19uMzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KKyNkZWZpbmUJ UFRFX1BTXzE2SwkJKChwdF9lbnRyeV90KTB4MDggPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2Rl ZmluZQlQVEVfUFNfNjRLCQkoKHB0X2VudHJ5X3QpMHgxMCA8PCBUTEJMT19TV0JJVFNfU0hJRlQp CisjZGVmaW5lCVBURV9QU18yNTZLCQkoKHB0X2VudHJ5X3QpMHgxOCA8PCBUTEJMT19TV0JJVFNf U0hJRlQpCisjZGVmaW5lCVBURV9QU18xTQkJKChwdF9lbnRyeV90KTB4MjAgPDwgVExCTE9fU1dC SVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfNE0JCSgocHRfZW50cnlfdCkweDI4IDw8IFRMQkxP X1NXQklUU19TSElGVCkKKyNkZWZpbmUJUFRFX1BTXzE2TQkJKChwdF9lbnRyeV90KTB4MzAgPDwg VExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNfNjRNCQkoKHB0X2VudHJ5X3QpMHgz OCA8PCBUTEJMT19TV0JJVFNfU0hJRlQpCisjZGVmaW5lCVBURV9QU19JRFhfTUFTSwkJKChwdF9l bnRyeV90KTB4MzggPDwgVExCTE9fU1dCSVRTX1NISUZUKQorI2RlZmluZQlQVEVfUFNJRFhfTkJJ VFNfVE9fTEVGVAkJNQorI2RlZmluZQlQVEVfUFNJRFhfTkJJVFNfVE9fUklHSFQJNTYKKyNkZWZp bmUJUFRFX1BGTl9OQklUU19UT19MRUZUCQkxMQorI2RlZmluZQlQVEVfUEZOX05CSVRTX1RPX1JJ R0hUCQk2CisjZGVmaW5lCVBURV9IV0ZMQUdTX05CSVRTX1RPX0xFRlQJNTgKKyNkZWZpbmUJU1df VkFMSUQJCTB4NDAKKyNkZWZpbmUJUFRFX1NWCQkJKChwdF9lbnRyeV90KVNXX1ZBTElEIDw8IFRM QkxPX1NXQklUU19TSElGVCkKKyNlbHNlCisjZGVmaW5lCVBURV9QU19JRFhfTUFTSwkJMAorI2Rl ZmluZQlQVEVfU1YJCQkwCisjZW5kaWYKKworLyoKKyAqIFByb21vdGlvbiB0byBhIDRNQiAoUERF KSBwYWdlIG1hcHBpbmcgcmVxdWlyZXMgdGhhdCB0aGUgY29ycmVzcG9uZGluZyA0S0IKKyAqIChQ VEUpIHBhZ2UgbWFwcGluZ3MgaGF2ZSBpZGVudGljYWwgc2V0dGluZ3MgZm9yIHRoZSBmb2xsb3dp bmcgZmllbGRzOgorICovCisjZGVmaW5lCVBHX1BST01PVEVfTUFTSwkoUFRFX0cgfCBQVEVfVkFM SUQgfCBQVEVfRCB8IFBURV9DX1VOQ0FDSEVEIHwgXAorCQkJUFRFX0NfQ0FDSEUgfCBQVEVfUk8g fCBQVEVfVyB8IFBURV9NQU5BR0VEIHwgXAorCQkJUFRFX1JFRikKKworI2lmZGVmIE1JUFM2NF9O RVdfUE1BUAorI2RlZmluZQlUTEJMT19QVEVfVE9fSURYKHB0ZSkJKCgocHRlKSAmIFBURV9QU19J RFhfTUFTSykgPj4gNTYpCisjZGVmaW5lCVRMQk1BU0tfSURYX1RPX01BU0soaWR4KSAoKCgxIDw8 ICgoaWR4KSA8PCAxKSkgLSAxKSA8PCBUTEJNQVNLX1NISUZUKQorI2RlZmluZQlUTEJMT19QVEVf VE9fTUFTSyhwdGUpCVRMQk1BU0tfSURYX1RPX01BU0soVExCTE9fUFRFX1RPX0lEWChwdGUpKQor I2RlZmluZQlUTEJNQVNLXzRLX1BBR0UJCVRMQk1BU0tfSURYX1RPX01BU0soMCkKKyNkZWZpbmUJ VExCTUFTS18xNktfUEFHRQlUTEJNQVNLX0lEWF9UT19NQVNLKDEpCisjZGVmaW5lCVRMQk1BU0tf NjRLX1BBR0UJVExCTUFTS19JRFhfVE9fTUFTSygyKQorI2RlZmluZQlUTEJNQVNLXzI1NktfUEFH RQlUTEJNQVNLX0lEWF9UT19NQVNLKDMpCisjZGVmaW5lCVRMQk1BU0tfMU1fUEFHRQkJVExCTUFT S19JRFhfVE9fTUFTSyg0KQorI2RlZmluZQlUTEJNQVNLXzRNX1BBR0UJCVRMQk1BU0tfSURYX1RP X01BU0soNSkKKyNkZWZpbmUJVExCTUFTS18xNk1fUEFHRQlUTEJNQVNLX0lEWF9UT19NQVNLKDYp CisjZGVmaW5lCVRMQk1BU0tfNjRNX1BBR0UJVExCTUFTS19JRFhfVE9fTUFTSyg3KQorI2Vsc2Ug LyogISBNSVBTNjRfTkVXX1BNQVAgKi8KKyNkZWZpbmUJVExCTE9fUFRFX1RPX0lEWChwdGUpIAkw CisjZGVmaW5lCVRMQkxPX1BURV9UT19NQVNLKHB0ZSkJMAorI2VuZGlmIC8qICEgTUlQUzY0X05F V19QTUFQICovCiAKIC8qCiAgKiBQVEUgbWFuYWdlbWVudCBmdW5jdGlvbnMgZm9yIGJpdHMgZGVm aW5lZCBhYm92ZS4KICAqLwotI2RlZmluZQlwdGVfY2xlYXIocHRlLCBiaXQpCSgqKHB0ZSkgJj0g fihiaXQpKQotI2RlZmluZQlwdGVfc2V0KHB0ZSwgYml0KQkoKihwdGUpIHw9IChiaXQpKQotI2Rl ZmluZQlwdGVfdGVzdChwdGUsIGJpdCkJKCgqKHB0ZSkgJiAoYml0KSkgPT0gKGJpdCkpCisjaWZu ZGVmIF9MT0NPUkUKK3N0YXRpYyBfX2lubGluZSB2b2lkCitwdGVfY2xlYXIocHRfZW50cnlfdCAq cHRlLCBwdF9lbnRyeV90IGJpdCkKK3sKKworCSpwdGUgJj0gKH5iaXQpOworfQorCitzdGF0aWMg X19pbmxpbmUgdm9pZAorcHRlX3NldChwdF9lbnRyeV90ICpwdGUsIHB0X2VudHJ5X3QgYml0KQor eworCisJKnB0ZSB8PSBiaXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK3B0ZV90ZXN0KHB0 X2VudHJ5X3QgKnB0ZSwgcHRfZW50cnlfdCBiaXQpCit7CisKKwlyZXR1cm4gKCgqcHRlICYgYml0 KSA9PSBiaXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcGRlX2NsZWFyKHBkX2VudHJ5 X3QgKnBkZSwgcHRfZW50cnlfdCBiaXQpCit7CisKKwkqKHB0X2VudHJ5X3QgKilwZGUgJj0gKH5i aXQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcGRlX3NldChwZF9lbnRyeV90ICpwZGUs IHB0X2VudHJ5X3QgYml0KQoreworCisJKihwdF9lbnRyeV90ICopcGRlIHw9IGJpdDsKK30KKwor c3RhdGljIF9faW5saW5lIGludAorcGRlX3Rlc3QocGRfZW50cnlfdCAqcGRlLCBwdF9lbnRyeV90 IGJpdCkKK3sKKworCXJldHVybiAoKCoocHRfZW50cnlfdCAqKXBkZSAmIGJpdCkgPT0gYml0KTsK K30KKworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QKK1RMQkxPX1BBX1RPX1BGTih2bV9wYWRk cl90IHBhKQoreworCisJcmV0dXJuICgoKHBhID4+IFRMQl9QQUdFX1NISUZUKSA8PCBUTEJMT19Q Rk5fU0hJRlQpICYgVExCTE9fUEZOX01BU0spOworfQorCitzdGF0aWMgX19pbmxpbmUgdm1fcGFk ZHJfdAorVExCTE9fUEZOX1RPX1BBKHB0X2VudHJ5X3QgcGZuKQoreworCisJcmV0dXJuICgodm1f cGFkZHJfdCkocGZuID4+IFRMQkxPX1BGTl9TSElGVCkgPDwgVExCX1BBR0VfU0hJRlQpOworfQor CitzdGF0aWMgX19pbmxpbmUgcHRfZW50cnlfdAorVExCTE9fUFRFX1RPX1BGTihwdF9lbnRyeV90 IHB0ZSkKK3sKKworCXJldHVybiAocHRlICYgVExCTE9fUEZOX01BU0spOworfQorCisjaWZkZWYg TUlQUzY0X05FV19QTUFQCisKKyNkZWZpbmUJUFRFX1JFRgkJUFRFX1ZSCisjZGVmaW5lCVBURV9W QUxJRCAJUFRFX1NWCisKKyNkZWZpbmUJcHRlX2lzX3JlZihwdGUpCQkJcHRlX3Rlc3QoKHB0ZSks IFBURV9SRUYpCisjZGVmaW5lCXB0ZV9yZWZfY2xlYXIocHRlKQkJcHRlX2NsZWFyKChwdGUpLCBQ VEVfUkVGKQorI2RlZmluZQlwdGVfcmVmX3NldChwdGUpCQlwdGVfc2V0KChwdGUpLCBQVEVfUkVG KQorI2RlZmluZQlwdGVfcmVmX2F0b21pY19jbGVhcihwdGUpCWF0b21pY19jbGVhcl9sb25nKChw dGUpLCBQVEVfUkVGKQorI2RlZmluZQlwdGVfcmVmX2F0b21pY19zZXQocHRlKQkJYXRvbWljX3Nl dF9sb25nKChwdGUpLCBQVEVfUkVGKQorCisjZWxzZSAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLwor CisjZGVmaW5lCVBURV9SRUYJCTAKKyNkZWZpbmUJUFRFX1ZBTElECVBURV9WUgorCisjZGVmaW5l CXB0ZV9pc19yZWYocHRlKQkJCTAKKyNkZWZpbmUJcHRlX3JlZl9jbGVhcihwdGUpCisjZGVmaW5l CXB0ZV9yZWZfc2V0KHB0ZSkKKyNkZWZpbmUJcHRlX3JlZl9hdG9taWNfY2xlYXIocHRlKQorI2Rl ZmluZQlwdGVfcmVmX2F0b21pY19zZXQocHRlLCBiaXQpCisKKyNlbmRpZiAvKiAhIE1JUFM2NF9O RVdfUE1BUCAqLworCisjZGVmaW5lCXB0ZV9pc192YWxpZChwdGUpCQlwdGVfdGVzdCgocHRlKSwg UFRFX1ZBTElEKQorCisjaWYgZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9fbWlwc19u MzIpIC8qICBQSFlTQUREUl82NF9CSVQgKi8KKworI2RlZmluZQlwdGVfYXRvbWljX2NsZWFyKHB0 ZSwgYml0KQlhdG9taWNfY2xlYXJfNjQoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2F0b21pY19z ZXQocHRlLCBiaXQpCWF0b21pY19zZXRfNjQoKHB0ZSksIGJpdCkKKyNkZWZpbmUJcHRlX2xvYWRf c3RvcmUocHRlcCwgcHRlKQlhdG9taWNfcmVhZGFuZHNldF82NChwdGVwLCBwdGUpCisjZGVmaW5l CXBkZV9sb2FkX3N0b3JlKHBkZXAsIHBkZSkJKHBkX2VudHJ5X3QpYXRvbWljX3JlYWRhbmRzZXRf NjQoXAorCQkJCQkJKHB0X2VudHJ5X3QgKilwZGVwLCBwZGUpCisKKyNkZWZpbmUJcHRlX2F0b21p Y19zdG9yZShwdGVwLCBwdGUpCWF0b21pY19zdG9yZV9yZWxfNjQocHRlcCwgcHRlKQorI2RlZmlu ZSBwdGVfc3RvcmUocHRlcCwgcHRlKQlkbyB7CQlcCisJKih1X2xvbmcgKikocHRlcCkgPSAodV9s b25nKShwdGUpOwlcCit9IHdoaWxlICgwKQorI2RlZmluZQlwZGVfc3RvcmUocGRlcCwgcGRlKQkJ cHRlX3N0b3JlKHBkZXAsIHBkZSkKKworCisjZWxzZSAvKiAhIFBIWVNBRERSXzY0X0JJVCAqLwor CisjZGVmaW5lCXB0ZV9hdG9taWNfY2xlYXIocHRlLCBiaXQpCWF0b21pY19jbGVhcl8zMigocHRl KSwgYml0KQorI2RlZmluZQlwdGVfYXRvbWljX3NldChwdGUsIGJpdCkJYXRvbWljX3NldF8zMigo cHRlKSwgYml0KQorI2RlZmluZQlwdGVfbG9hZF9zdG9yZShwdGVwLCBwdGUpCWF0b21pY19yZWFk YW5kc2V0XzMyKHB0ZXAsIHB0ZSkKKyNkZWZpbmUJcGRlX2xvYWRfc3RvcmUocGRlcCwgcGRlKQko cGRfZW50cnlfdClhdG9taWNfcmVhZGFuZHNldF8zMihcCisJCQkJCQkocHRfZW50cnlfdCAqKXBk ZXAsIHBkZSkKKworI2RlZmluZQlwdGVfYXRvbWljX3N0b3JlKHB0ZXAsIHB0ZSkJYXRvbWljX3N0 b3JlX3JlbF8zMihwdGVwLCBwdGUpCisjZGVmaW5lIHB0ZV9zdG9yZShwdGVwLCBwdGUpCWRvIHsJ CVwKKwkqKHVfaW50ICopKHB0ZXApID0gKHVfaW50KShwdGUpOwlcCit9IHdoaWxlICgwKQorI2Rl ZmluZQlwZGVfc3RvcmUocGRlcCwgcGRlKQkJcHRlX3N0b3JlKHBkZXAsIHBkZSkKKworI2VuZGlm IC8qICEgUEhZU0FERFJfNjRfQklUICovCisKKyNlbmRpZiAvKiAhIF9MT0NPUkUgKi8KKworI2lm IGRlZmluZWQoX19taXBzX242NCkgfHwgZGVmaW5lZChfX21pcHNfbjMyKSAvKiAgUEhZU0FERFJf NjRfQklUICovCisKKyNpZm5kZWYgX0xPQ09SRQorLyoKKyAqIENoZWNrIHRvIHNlZSBpZiBhIFBE RSBpcyBhY3R1YWxseSBhIHN1cGVycGFnZSAoUGFnZVNpemUgPiA0SykgUFRFLgorICoKKyAqIE9u IF9fbWlwc19uNjQgdGhlIGtlcm5lbCB1c2VzIHRoZSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzIHJh bmdlIGZyb20KKyAqIFZNX01JTl9LRVJORUxfQUREUkVTUyAoMHhjMDAwMDAwMDAwMDAwMDAwKSB0 byBWTV9NQVhfS0VSTkVMX0FERFJFU1MKKyAqICgweGMwMDAwMDgwMDAwMDAwMDApLiBUaGVyZWZv cmUsIGEgdmFsaWQgdmlydHVhbCBhZGRyZXNzIGluIHRoZSBQREUKKyAqIChhIHBvaW50ZXIgdG8g YSBwYWdlIHRhYmxlKSB3aWxsIGhhdmUgYml0cyA2MSB0byA0MCBzZXQgdG8gemVyby4gQQorICog c3VwZXJwYWdlIHdpbGwgaGF2ZSBvbmUgb2YgdGhlIHN1cGVycGFnZSBzaXplIGJpdHMgKGJpdHMg NTggdG8gNTYpCisgKiBzZXQuCisgKi8KKworLyogSXMgdGhlIFBERSBhIHN1cGVycGFnZSBvZiBh bnkgc2l6ZT8gKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK3BkZV9pc19zdXBlcnBhZ2UocGRfZW50 cnlfdCAqcGRlKQoreworCisJcmV0dXJuICgoKHB0X2VudHJ5X3QpKnBkZSAmIFBURV9QU19JRFhf TUFTSykgIT0gMCk7Cit9CisKKy8qIElzIHRoZSBQVEUgYSBzdXBlcnBhZ2Ugb2YgYW55IHNpemU/ ICovCitzdGF0aWMgX19pbmxpbmUgaW50CitwdGVfaXNfc3VwZXJwYWdlKHB0X2VudHJ5X3QgKnB0 ZSkKK3sKKworCXJldHVybiAoKCpwdGUgJiBQVEVfUFNfSURYX01BU0spICE9IDApOworfQorCisv KiBJcyB0aGUgUERFIGFuIDFNQiBzdXBlcnBhZ2U/ICovCitzdGF0aWMgX19pbmxpbmUgaW50Citw ZGVfaXNfMW1fc3VwZXJwYWdlKHBkX2VudHJ5X3QgKnBkZSkKK3sKKworCXJldHVybiAoKChwdF9l bnRyeV90KSpwZGUgJiBQVEVfUFNfMU0pID09IFBURV9QU18xTSk7Cit9CisKKy8qIElzIHRoZSBQ VEUgYW4gMU1CIHN1cGVycGFnZT8gKi8KK3N0YXRpYyBfX2lubGluZSBpbnQKK3B0ZV9pc18xbV9z dXBlcnBhZ2UocHRfZW50cnlfdCAqcHRlKQoreworCisJcmV0dXJuICgoKnB0ZSAmIFBURV9QU18x TSkgPT0gUFRFX1BTXzFNKTsKK30KKworLyogUGh5c2ljYWwgQWRkcmVzcyB0byBTdXBlcnBhZ2Ug UGh5c2ljYWwgRnJhbWUgTnVtYmVyLiAqLworc3RhdGljIF9faW5saW5lIHB0X2VudHJ5X3QKK1RM QkxPX1BBX1RPX1NQRk4odm1fcGFkZHJfdCBwYSkKK3sKKworCXJldHVybiAoKChwYSA+PiBUTEJf MU1fU1VQRVJQQUdFX1NISUZUKSA8PCBUTEJMT19QRk5fU0hJRlQpICYKKwkgICAgVExCTE9fUEZO X01BU0spOworfQorCisvKiBTdXBlcnBhZ2UgUGh5c2ljYWwgRnJhbWUgTnVtYmVyIHRvIFBoeXNp Y2FsIEFkZHJlc3MuICovCitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fU1BGTl9U T19QQShwdF9lbnRyeV90IHNwZm4pCit7CisKKwlyZXR1cm4gKCh2bV9wYWRkcl90KShzcGZuID4+ IFRMQkxPX1BGTl9TSElGVCkgPDwKKwkgICAgVExCXzFNX1NVUEVSUEFHRV9TSElGVCk7Cit9CisK Ky8qIFN1cGVycGFnZSBQYWdlIFRhYmxlIEVudHJ5IHRvIFBoeXNpY2FsIEFkZHJlc3MuICovCitz dGF0aWMgX19pbmxpbmUgdm1fcGFkZHJfdAorVExCTE9fU1BURV9UT19QQShwdF9lbnRyeV90IHB0 ZSkKK3sKKwlyZXR1cm4gKFRMQkxPX1NQRk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTihwdGUpKSk7 Cit9CisKK3N0YXRpYyBfX2lubGluZSB2bV9wYWRkcl90CitUTEJMT19TUERFX1RPX1BBKHBkX2Vu dHJ5X3QgcGRlKQoreworCXJldHVybiAoVExCTE9fU1BGTl9UT19QQShUTEJMT19QVEVfVE9fUEZO KChwdF9lbnRyeV90KXBkZSkpKTsKK30KKworCisvKiBBbiA0S0IgUGFnZSBUYWJsZSBFbnRyeSB0 byBQaHlzaWNhbCBBZGRyZXNzLiAqLworc3RhdGljIF9faW5saW5lIHZtX3BhZGRyX3QKK1RMQkxP X1BURV9UT19QQShwdF9lbnRyeV90IHB0ZSkKK3sKKworCXJldHVybiAoVExCTE9fUEZOX1RPX1BB KFRMQkxPX1BURV9UT19QRk4ocHRlKSkpOworfQorCitzdGF0aWMgX19pbmxpbmUgdm1fcGFkZHJf dAorVExCTE9fUERFX1RPX1BBKHBkX2VudHJ5X3QgcGRlKQoreworCisJcmV0dXJuIChUTEJMT19Q Rk5fVE9fUEEoVExCTE9fUFRFX1RPX1BGTigocHRfZW50cnlfdClwZGUpKSk7Cit9CisjZW5kaWYg LyogISBfTE9DT1JFICovCisKKyNlbHNlIC8qICEgUEhZU0FERFJfNjRfQklUICovCisKKyNkZWZp bmUJcHRlX2lzX3JlZmVyZW5jZWQocHRlKQkJMAorI2RlZmluZQlwdGVfcmVmZXJlbmNlX3Jlc2V0 KHB0ZSkKKyNkZWZpbmUJcHRlX3JlZmVyZW5jZV9wYWdlKHB0ZSkKKyNkZWZpbmUJcGRlX2lzX3N1 cGVycGFnZShwZGUpCQkwCisjZGVmaW5lCXB0ZV9pc19zdXBlcnBhZ2UocGRlKQkJMAorI2RlZmlu ZSBwZGVfaXNfMW1fc3VwZXJwYWdlKHB0ZSkJMAorI2RlZmluZSBwdGVfaXNfMW1fc3VwZXJwYWdl KHB0ZSkJMAorCisjaWZuZGVmIF9MT0NPUkUKK3N0YXRpYyBfX2lubGluZSB2bV9wYWRkcl90CitU TEJMT19QVEVfVE9fUEEocHRfZW50cnlfdCBwdGUpCit7CisKKwlyZXR1cm4gKFRMQkxPX1BGTl9U T19QQShUTEJMT19QVEVfVE9fUEZOKHB0ZSkpKTsKK30KKyNlbmRpZiAvKiAhIF9MT0NPUkUgKi8K KyNlbmRpZiAvKiAhIFBIWVNBRERSXzY0X0JJVCAqLwogCiAvKiBBc3NlbWJseSBzdXBwb3J0IGZv ciBQVEUgYWNjZXNzKi8KICNpZmRlZiBMT0NPUkUKQEAgLTE2NywxNiArNTEwLDEwNCBAQAogI2Rl ZmluZQlQVEVNQVNLCQkJMHhmZjgKICNkZWZpbmUJUFRFU0laRQkJCTgKICNkZWZpbmUJUFRFX0wJ CQlsZAorI2RlZmluZQlQVEVfUwkJCXNkCiAjZGVmaW5lCVBURV9NVEMwCQlkbXRjMAotI2RlZmlu ZQlDTEVBUl9QVEVfU1dCSVRTKHByKQotI2Vsc2UKKyNkZWZpbmUJQ0xFQVJfUFRFX1NXQklUUyhy KQorCisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisKKy8qIFN1cGVycGFnZSBhbmQgcmVmZXJlbmNl ZCBiaXQgZW11bGF0aW9uIEFTTSBtYWNyb3MuICovCisKKy8qCisgKiBHRVRfU1VQRVJQQUdFX0lE WChyKQorICoKKyAqIEdldCB0aGUgc3VwZXJwYWdlIGluZGV4IGZyb20gdGhlIFBURSBieSBzaGlm dGluZyBpdCBsZWZ0IGJ5CisgKiBQVEVfUFNJRFhfTkJJVFNfVE9fTEVGVCAoY2xlYXJpbmcgdGhl IHVwcGVyIHNvZnRiaXRzKSBhbmQgdGhlbiBiYWNrIHRvIHRoZQorICogcmlnaHQgYnkgKFBURV9Q U0lEWF9OQklUU19UT19SSUdIVCArIFBURV9QU0lEWF9OQklUU19UT19SSUdIVCkgY2xlYXJpbmcK KyAqIGFsbCB0aGUgbG93ZXIgYml0cyBpbiB0aGUgcHJvY2Vzcy4KKyAqLworI2RlZmluZSBHRVRf U1VQRVJQQUdFX0lEWChyKQkJCQlcCisJZHNsbAlyLCAoUFRFX1BTSURYX05CSVRTX1RPX0xFRlQp OwkJXAorCWRzcmwzMglyLCAoUFRFX1BTSURYX05CSVRTX1RPX1JJR0hUICsgUFRFX1BTSURYX05C SVRTX1RPX0xFRlQgLSAzMikKKworLyoKKyAqIEdFVF9IV19UTEJfRkxBR1MocikKKyAqCisgKiBH ZXQgdGhlIGxvd2VyIGhhcmR3YXJlIFRMQiBmbGFncyBidXQgc2hpZnRpbmcgbGVmdCB0aGVuIHJp Z2h0LgorICovCisjZGVmaW5lIEdFVF9IV19UTEJfRkxBR1MocikJCQkJXAorCWRzbGwzMglyLCAo UFRFX0hXRkxBR1NfTkJJVFNfVE9fTEVGVCAtIDMyKTsJXAorCWRzcmwzMglyLCAoUFRFX0hXRkxB R1NfTkJJVFNfVE9fTEVGVCAtIDMyKQorCisvKgorICogR0VUX09ERF8xTV9QRk5fRlJPTV9FVkVO KHIpCisgKgorICogR2V0IHRoZSBvZGQgMU0gUEZOIChUTEIgbG8xKSBmcm9tIHRoZSBldmVuIDFN IFBURS4gIEZpcnN0LCBtYXNrIG91dCB0aGUgUEZOCisgKiBmcm9tIHRoZSBldmVuIFBURS4gVGhl biBhZGQgMU0gd29ydGggb2YgcGFnZXMgdG8gaXQgKDI1NikuIEZpbmFsbHksIHNoaWZ0IGl0Cisg KiBiYWNrIHRvIGl0cyBwb3NpdGlvbiBpbiB0aGUgUFRFLgorICovCisjZGVmaW5lIEdFVF9PRERf MU1fUEZOX0ZST01fRVZFTihyKQkJCVwKKwlkc2xsCXIsIChQVEVfUEZOX05CSVRTX1RPX0xFRlQp OwkJXAorCWRzcmwJciwgKFBURV9QRk5fTkJJVFNfVE9fTEVGVCArIFBURV9QRk5fTkJJVFNfVE9f UklHSFQpOyBcCisJZGFkZGl1CXIsIHIsICgxMDI0ICogMTAyNCAvIFBBR0VfU0laRSk7CVwKKwlk c2xsCXIsIChQVEVfUEZOX05CSVRTX1RPX1JJR0hUKQorCisvKgorICogSUZfVkFMSURfU0VUX1JF RkJJVChyMCwgcjEsIG9mZnNldCwgdW5pcXVlKQorICoKKyAqIElmIGEgUERFIGlzIHZhbGlkIHRo ZW4gc2V0IHRoZSByZWZlcmVuY2VkIGJpdCAoUFRFX1ZSKS4gIFRoZSBmaXJzdCB2ZXJzaW9uCisg KiBkb2VzIGl0IGF0b21pY2FsbHkuCisgKi8KKyNkZWZpbmUgQVRPTUlDX1JFRkJJVF9VUERBVEUK KyNpZmRlZiBBVE9NSUNfUkVGQklUX1VQREFURQorCisjZGVmaW5lIElGX1ZBTElEX1NFVF9SRUZC SVQocjAsIHIxLCBvZmZzZXQsIHVuaXF1ZSkJXAordHJ5X2FnYWluICMjIHVuaXF1ZSAjIyA6IDsJ CQkJXAorCWRzcmwzMglyMCwgKFRMQkxPX1NXQklUU19TSElGVCAtIDMyKTsJCVwKKwlhbmRpCXIw LCByMCwgU1dfVkFMSUQ7CQkJXAorCWJlcXoJcjAsIG5vdF92YWxpZCAjIyB1bmlxdWUgOwkJXAor CVBURV9MCXIwLCBvZmZzZXQgIyMgKHIxKSA7CQkJXAorCWxsZAlyMCwgb2Zmc2V0ICMjIChyMSkg OwkJCVwKKwlvcmkJcjAsIHIwLCBQVEVfVlIgOwkJCVwKKwlzY2QJcjAsIG9mZnNldCAjIyAocjEp IDsJCQlcCisJYmVxeglyMCwgdHJ5X2FnYWluICMjIHVuaXF1ZSA7CQlcCisJUFRFX0wJcjAsIG9m ZnNldCAjIyAocjEpIDsJCQlcCitub3RfdmFsaWQgIyMgdW5pcXVlICMjIDoKKworI2Vsc2UgLyog ISBBVE9NSUNfUkVGQklUX1VQREFURSAqLworCisjZGVmaW5lIElGX1ZBTElEX1NFVF9SRUZCSVQo cjAsIHIxLCBvZmZzZXQsIHVuaXF1ZSkJXAordHJ5X2FnYWluICMjIHVuaXF1ZSAjIyA6IDsJCQkJ XAorCWRzcmwzMglyMCwgKFRMQkxPX1NXQklUU19TSElGVCAtIDMyKSA7CQlcCisJYW5kaQlyMCwg cjAsIFNXX1ZBTElEIDsJCQlcCisJYmVxeglyMCwgbm90X3ZhbGlkICMjIHVuaXF1ZSA7CQlcCisJ UFRFX0wJcjAsIG9mZnNldCAjIyAocjEpIDsJCQlcCisJb3JpCXIwLCByMCwgUFRFX1ZSIDsJCQlc CisJUFRFX1MJcjAsIG9mZnNldCAjIyAocjEpIDsJCQlcCitub3RfdmFsaWQgIyMgdW5pcXVlICMj IDoKKyNlbmRpZiAvKiAhIEFUT01JQ19SRUZCSVRfVVBEQVRFICovCisKKyNlbHNlIC8qICEgTUlQ UzY0X05FV19QTUFQICovCisKKyNkZWZpbmUJR0VUX1NVUEVSUEFHRV9JRFgocikKKyNkZWZpbmUg R0VUX0hXX1RMQl9GTEFHUyhyKQorI2RlZmluZQlJRl9WQUxJRF9TRVRfUkVGQklUKHIwLCByMSwg b2Zmc2V0LCB1bmlxdWUpCisKKyNlbmRpZiAvKiAhIE1JUFM2NF9ORVdfUE1BUCAqLworCisjZWxz ZSAvKiAhIExPQ09SRSAqLwogI2RlZmluZQlQVEVTSElGVAkJMgogI2RlZmluZQlQVEUyTUFTSwkJ MHhmZjgJLyogZm9yIHRoZSAyLXBhZ2UgbG8wL2xvMSAqLwogI2RlZmluZQlQVEVNQVNLCQkJMHhm ZmMKICNkZWZpbmUJUFRFU0laRQkJCTQKICNkZWZpbmUJUFRFX0wJCQlsdworI2RlZmluZQlQVEVf UwkJCXN3CiAjZGVmaW5lCVBURV9NVEMwCQltdGMwCiAjZGVmaW5lCUNMRUFSX1BURV9TV0JJVFMo cikJTE9OR19TTEwgciwgVExCTE9fU1dCSVRTX0NMRUFSX1NISUZUOyBMT05HX1NSTCByLCBUTEJM T19TV0JJVFNfQ0xFQVJfU0hJRlQgLyogcmVtb3ZlIHN3Yml0cyAqLworCisjZGVmaW5lCUlTX1BU RV9WQUxJRChyMCwgcjEsIG9mZnNldCwgbGFiZWwpCisjZGVmaW5lCVNFVF9SRUZfQklUKHIwLCBy MSwgb2Zmc2V0KQorCiAjZW5kaWYgLyogZGVmaW5lZChfX21pcHNfbjY0KSB8fCBkZWZpbmVkKF9f bWlwc19uMzIpICovCiAKICNpZiBkZWZpbmVkKF9fbWlwc19uNjQpCkBAIC0yMDEsNCArNjMyLDE3 IEBACiAjZGVmaW5lCU1JUFMzX1BHTUFTS182NE0JMHgwN2ZmZTAwMAogI2RlZmluZQlNSVBTM19Q R01BU0tfMjU2TQkweDFmZmZlMDAwCiAKKworLyogUGFnZU1hc2sgUmVnaXN0ZXIgKENQMCBSZWdp c3RlciA1LCBTZWxlY3QgMCkgVmFsdWVzICovCisjZGVmaW5lCU1JUFMzX1BHTUFTS19NQVNLWAkw eDAwMDAxODAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS180SwkJMHgwMDAwMDAwMAorI2RlZmluZQlN SVBTM19QR01BU0tfMTZLCTB4MDAwMDYwMDAKKyNkZWZpbmUJTUlQUzNfUEdNQVNLXzY0SwkweDAw MDFlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS18yNTZLCTB4MDAwN2UwMDAKKyNkZWZpbmUJTUlQ UzNfUEdNQVNLXzFNCQkweDAwMWZlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS180TQkJMHgwMDdm ZTAwMAorI2RlZmluZQlNSVBTM19QR01BU0tfMTZNCTB4MDFmZmUwMDAKKyNkZWZpbmUJTUlQUzNf UEdNQVNLXzY0TQkweDA3ZmZlMDAwCisjZGVmaW5lCU1JUFMzX1BHTUFTS18yNTZNCTB4MWZmZmUw MDAKKwogI2VuZGlmIC8qICFfTUFDSElORV9QVEVfSF8gKi8KZGlmZiAtLWdpdCBhL3N5cy9taXBz L2luY2x1ZGUvcG1hcC5oIGIvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgKLS0tIGEvc3lzL21pcHMv aW5jbHVkZS9wbWFwLmgKKysrIGIvc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgKQEAgLTQ4LDYgKzQ4 LDcgQEAKIAogI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgogI2luY2x1ZGUgPG1hY2hpbmUv cHRlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpZiBkZWZpbmVkKF9fbWlwc19uMzIp IHx8IGRlZmluZWQoX19taXBzX242NCkgLyogUEhZU0FERFJfNjRCSVQgKi8KICNkZWZpbmUJTktQ VAkJMjU2CS8qIG1lbSA+IDRHLCB2bV9wYWdlX3N0YXJ0dXAgbmVlZHMgbW9yZSBLUFRzICovCkBA IC02MiwxNSArNjMsMjQgQEAKICNpbmNsdWRlIDxzeXMvX2xvY2suaD4KICNpbmNsdWRlIDxzeXMv X211dGV4Lmg+CiAKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKyNpbmNsdWRlIDx2bS9fdm1fcmFk aXguaD4KKyNlbmRpZiAvKiBNSVBTNjRfTkVXX1BNQVAgKi8KKwogLyoKICAqIFBtYXAgc3R1ZmYK ICAqLwogc3RydWN0IHB2X2VudHJ5Owogc3RydWN0IHB2X2NodW5rOwogCiBzdHJ1Y3QgbWRfcGFn ZSB7Ci0JaW50IHB2X2ZsYWdzOwogCVRBSUxRX0hFQUQoLCBwdl9lbnRyeSkgcHZfbGlzdDsKKwl2 bV9tZW1hdHRyX3QgcHZfbWVtYXR0cjsKKyNpZmRlZiBNSVBTNjRfTkVXX1BNQVAKKwlpbnQgcHZf Z2VuOworI2Vsc2UgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KKwlpbnQgcHZfZmxhZ3M7CisjZW5k aWYgLyogISBNSVBTNjRfTkVXX1BNQVAgKi8KIH07CiAKICNkZWZpbmUJUFZfVEFCTEVfUkVGCQkw eDAyCS8qIHJlZmVyZW5jZWQgKi8KQEAgLTgxLDE1ICs5MSwxOCBAQAogI2RlZmluZQlBU0lER0VO X01BU0sJCSgoMSA8PCBBU0lER0VOX0JJVFMpIC0gMSkKIAogc3RydWN0IHBtYXAgeworCXN0cnVj dCBtdHggcG1fbXR4OwogCXBkX2VudHJ5X3QgKnBtX3NlZ3RhYjsJLyogS1ZBIG9mIHNlZ21lbnQg dGFibGUgKi8KIAlUQUlMUV9IRUFEKCwgcHZfY2h1bmspCXBtX3B2Y2h1bms7CS8qIGxpc3Qgb2Yg bWFwcGluZ3MgaW4gcG1hcCAqLwogCWNwdXNldF90CXBtX2FjdGl2ZTsJCS8qIGFjdGl2ZSBvbiBj cHVzICovCiAJc3RydWN0IHsKIAkJdV9pbnQzMl90IGFzaWQ6QVNJRF9CSVRTOwkvKiBUTEIgYWRk cmVzcyBzcGFjZSB0YWcgKi8KIAkJdV9pbnQzMl90IGdlbjpBU0lER0VOX0JJVFM7CS8qIGl0cyBn ZW5lcmF0aW9uIG51bWJlciAqLwogCX0gICAgICBwbV9hc2lkW01BWFNNUENQVV07CiAJc3RydWN0 IHBtYXBfc3RhdGlzdGljcyBwbV9zdGF0czsJLyogcG1hcCBzdGF0aXN0aWNzICovCi0Jc3RydWN0 IG10eCBwbV9tdHg7CisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisJc3RydWN0IHZtX3JhZGl4IHBt X3Jvb3Q7CQkvKiBzcGFyZSBwYWdlIHRhYmxlIHBhZ2VzICovCisjZW5kaWYgLyogTUlQUzY0X05F V19QTUFQICovCiB9OwogCiB0eXBlZGVmIHN0cnVjdCBwbWFwICpwbWFwX3Q7CkBAIC0xMjEsNyAr MTM0LDcgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QgcHZfZW50cnkgewogCXZtX29mZnNldF90IHB2 X3ZhOwkvKiB2aXJ0dWFsIGFkZHJlc3MgZm9yIG1hcHBpbmcgKi8KLQlUQUlMUV9FTlRSWShwdl9l bnRyeSkgcHZfbGlzdDsKKwlUQUlMUV9FTlRSWShwdl9lbnRyeSkgcHZfbmV4dDsKIH0gICAgICAg KnB2X2VudHJ5X3Q7CiAKIC8qCkBAIC0xNjQsMTEgKzE3NywxNSBAQAogZXh0ZXJuIHZtX3BhZGRy X3QgZHVtcF9hdmFpbFtQSFlTX0FWQUlMX0VOVFJJRVMgKyAyXTsKIAogI2RlZmluZQlwbWFwX3Bh Z2VfZ2V0X21lbWF0dHIobSkJVk1fTUVNQVRUUl9ERUZBVUxUCi0jZGVmaW5lCXBtYXBfcGFnZV9p c19tYXBwZWQobSkJKCFUQUlMUV9FTVBUWSgmKG0pLT5tZC5wdl9saXN0KSkKICNkZWZpbmUJcG1h cF9wYWdlX2lzX3dyaXRlX21hcHBlZChtKQkoKChtKS0+YWZsYWdzICYgUEdBX1dSSVRFQUJMRSkg IT0gMCkKIAogdm9pZCBwbWFwX2Jvb3RzdHJhcCh2b2lkKTsKIHZvaWQgKnBtYXBfbWFwZGV2KHZt X3BhZGRyX3QsIHZtX3NpemVfdCk7CisjaWZkZWYgTUlQUzY0X05FV19QTUFQCisjZGVmaW5lCXBt YXBfcGFnZV9pc19tYXBwZWQobSkJKCFUQUlMUV9FTVBUWSgmKG0pLT5tZC5wdl9saXN0KSkKKyNl bHNlCitib29sZWFuX3QgcG1hcF9wYWdlX2lzX21hcHBlZCh2bV9wYWdlX3QgbSk7CisjZW5kaWYK IHZvaWQgcG1hcF91bm1hcGRldih2bV9vZmZzZXRfdCwgdm1fc2l6ZV90KTsKIHZtX29mZnNldF90 IHBtYXBfc3RlYWxfbWVtb3J5KHZtX3NpemVfdCBzaXplKTsKIHZvaWQgcG1hcF9rZW50ZXIodm1f b2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEpOwpAQCAtMTc4LDYgKzE5NSw3IEBACiB2b2lkIHBt YXBfa2VudGVyX3RlbXBvcmFyeV9mcmVlKHZtX3BhZGRyX3QgcGEpOwogdm9pZCBwbWFwX2ZsdXNo X3B2Y2FjaGUodm1fcGFnZV90IG0pOwogaW50IHBtYXBfZW11bGF0ZV9tb2RpZmllZChwbWFwX3Qg cG1hcCwgdm1fb2Zmc2V0X3QgdmEpOworaW50IHBtYXBfZW11bGF0ZV9yZWZlcmVuY2VkKHBtYXBf dCBwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CiB2b2lkIHBtYXBfcGFnZV9zZXRfbWVtYXR0cih2bV9w YWdlX3QsIHZtX21lbWF0dHJfdCk7CiAKICNlbmRpZgkJCQkvKiBfS0VSTkVMICovCmRpZmYgLS1n aXQgYS9zeXMvbWlwcy9pbmNsdWRlL3BhcmFtLmggYi9zeXMvbWlwcy9pbmNsdWRlL3BhcmFtLmgK LS0tIGEvc3lzL21pcHMvaW5jbHVkZS9wYXJhbS5oCisrKyBiL3N5cy9taXBzL2luY2x1ZGUvcGFy YW0uaApAQCAtMTYzLDE3ICsxNjMsMzggQEAKIAogI2RlZmluZQlNQVhEVU1QUEdTCQkxCQkvKiB4 eHg6IHdoeSBpcyB0aGlzIG9ubHkgb25lPyAqLwogCisjaWZkZWYgS1NUQUNLX0xBUkdFX1BBR0UK Ky8qCisgKiBGb3IgYSBsYXJnZSBrZXJuZWwgc3RhY2sgcGFnZSB0aGUgS1NUQUNLX1NJWkUgbmVl ZHMgdG8gYmUgYSBwYWdlIHNpemUKKyAqIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUgKGUuZy4g MTZLKS4KKyAqLworI2RlZmluZQlLU1RBQ0tfU0laRQkJKDEgPDwgMTQpCS8qIFNpbmdsZSAxNksg cGFnZSAqLworI2RlZmluZQlLU1RBQ0tfUEFHRV9TSVpFCUtTVEFDS19TSVpFCisjZGVmaW5lCUtT VEFDS19QQUdFX01BU0sJKEtTVEFDS19QQUdFX1NJWkUgLSAxKQorI2RlZmluZQlLU1RBQ0tfUEFH RVMJCShLU1RBQ0tfU0laRSAvIFBBR0VfU0laRSkKKyNkZWZpbmUJS1NUQUNLX1RMQk1BU0tfTUFT SwkoKEtTVEFDS19QQUdFX01BU0sgPj4gKFRMQk1BU0tfU0hJRlQgLSAxKSkgXAorCQkJCQk8PCBU TEJNQVNLX1NISUZUKQorI2RlZmluZQlLU1RBQ0tfR1VBUkRfUEFHRVMJKChLU1RBQ0tfUEFHRV9T SVpFICogMikgLyBQQUdFX1NJWkUpCisKKyNlbHNlIC8qICEgS1NUQUNLX0xBUkdFX1BBR0UgKi8K KwogLyoKICAqIFRoZSBrZXJuZWwgc3RhY2sgbmVlZHMgdG8gYmUgYWxpZ25lZCBvbiBhIChQQUdF X1NJWkUgKiAyKSBib3VuZGFyeS4KICAqLwogI2RlZmluZQlLU1RBQ0tfUEFHRVMJCTIJLyoga2Vy bmVsIHN0YWNrICovCisjZGVmaW5lCUtTVEFDS19TSVpFCQkoS1NUQUNLX1BBR0VTICogUEFHRV9T SVpFKQorI2RlZmluZQlLU1RBQ0tfUEFHRV9TSVpFCVBBR0VfU0laRQorI2RlZmluZQlLU1RBQ0tf UEFHRV9NQVNLCShQQUdFX1NJWkUgLSAxKQogI2RlZmluZQlLU1RBQ0tfR1VBUkRfUEFHRVMJMgkv KiBwYWdlcyBvZiBrc3RhY2sgZ3VhcmQ7IDAgZGlzYWJsZXMgKi8KKyNlbmRpZiAvKiAhIEtTVEFD S19MQVJHRV9QQUdFICovCiAKIC8qCiAgKiBNYWNoIGRlcml2ZWQgY29udmVyc2lvbiBtYWNyb3MK ICAqLwogI2RlZmluZQlyb3VuZF9wYWdlKHgpCQkoKCh4KSArIFBBR0VfTUFTSykgJiB+UEFHRV9N QVNLKQogI2RlZmluZQl0cnVuY19wYWdlKHgpCQkoKHgpICYgflBBR0VfTUFTSykKKyNkZWZpbmUJ cm91bmRfMm1wYWdlKHgpCQkoKCh4KSArIFBEUk1BU0spICYgflBEUk1BU0spCisjZGVmaW5lCXRy dW5jXzJtcGFnZSh4KQkJKCh4KSAmIH5QRFJNQVNLKQogCiAjZGVmaW5lCWF0b3AoeCkJCQkoKHgp ID4+IFBBR0VfU0hJRlQpCiAjZGVmaW5lCXB0b2EoeCkJCQkoKHgpIDw8IFBBR0VfU0hJRlQpCmRp ZmYgLS1naXQgYS9zeXMvbWlwcy9jb25mL01BTFRBNjQgYi9zeXMvbWlwcy9jb25mL01BTFRBNjQK LS0tIGEvc3lzL21pcHMvY29uZi9NQUxUQTY0CisrKyBiL3N5cy9taXBzL2NvbmYvTUFMVEE2NApA QCAtMTEsMyArMTEsNSBAQAogbWFrZW9wdGlvbnMJQVJDSF9GTEFHUz0iLW1hcmNoPW1pcHM2NCAt bWFiaT02NCIKICAKIG1ha2VvcHRpb25zIAlLRVJOTE9BREFERFI9MHhmZmZmZmZmZjgwMTAwMDAw CisKK29wdGlvbnMJCU1JUFM2NF9ORVdfUE1BUApkaWZmIC0tZ2l0IGEvc3lzL2NvbmYvb3B0aW9u cy5taXBzIGIvc3lzL2NvbmYvb3B0aW9ucy5taXBzCi0tLSBhL3N5cy9jb25mL29wdGlvbnMubWlw cworKysgYi9zeXMvY29uZi9vcHRpb25zLm1pcHMKQEAgLTk3LDExICs5NywyNCBAQAogQkVSSV9M QVJHRV9UTEIJCQlvcHRfZ2xvYmFsLmgKIAogIworIyBVc2UgdGhlIG5ldyBwbWFwIGZvciBNSVBT NjQgdGhhdCBpbmNsdWRlcyByZWZlcmVuY2UgYml0IGVtdWxhdGlvbgorIyBhbmQgc3VwZXJwYWdl IHN1cHBvcnQuCisjCitNSVBTNjRfTkVXX1BNQVAJCQlvcHRfZ2xvYmFsLmgKKworIwogIyBPcHRp b25zIHRoYXQgY29udHJvbCB0aGUgTmV0RlBHQS0xMEcgRW1iZWRkZWQgQ1BVIEV0aGVybmV0IENv cmUuCiAjCiBORjEwQk1BQ182NEJJVAkJCW9wdF9uZXRmcGdhLmgKIAogIworIyBPcHRpb25zIGZv ciBoYXJkd2FyZSB3aXRoIFBhZ2VNYXNrIHJlZ2lzdGVyIHN1cHBvcnQKKyMKKworIyBVc2Ugb25l IGxhcmdlIHBhZ2UgKGN1cnJlbnRseSAxNkspIGZvciB0aGUga2VybmVsIHRocmVhZCBzdGFjawor S1NUQUNLX0xBUkdFX1BBR0UgICAJCW9wdF9nbG9iYWwuaAorCisjCiAjIE9wdGlvbnMgdGhhdCBj b250cm9sIHRoZSBBdGhlcm9zIFNvQyBwZXJpcGhlcmFscwogIwogQVJHRV9ERUJVRwkJCW9wdF9h cmdlLmgKZGlmZiAtLWdpdCBhL3N5cy9jb25mL2ZpbGVzLm1pcHMgYi9zeXMvY29uZi9maWxlcy5t aXBzCi0tLSBhL3N5cy9jb25mL2ZpbGVzLm1pcHMKKysrIGIvc3lzL2NvbmYvZmlsZXMubWlwcwpA QCAtMzEsNyArMzEsOCBAQAogbWlwcy9taXBzL25leHVzLmMJCQlzdGFuZGFyZAogbWlwcy9taXBz L29md19tYWNoZGVwLmMJCQlvcHRpb25hbAlmZHQKIG1pcHMvbWlwcy9wbV9tYWNoZGVwLmMJCQlz dGFuZGFyZAotbWlwcy9taXBzL3BtYXAuYwkJCXN0YW5kYXJkCittaXBzL21pcHMvcG1hcC5jCQkJ b3B0aW9uYWwJIW1pcHM2NF9uZXdfcG1hcAorbWlwcy9taXBzL3BtYXBfbWlwczY0LmMJCQlvcHRp b25hbAltaXBzNjRfbmV3X3BtYXAKIG1pcHMvbWlwcy9wdHJhY2VfbWFjaGRlcC5jCQlzdGFuZGFy ZAogbWlwcy9taXBzL3NjX21hY2hkZXAuYwkJCXN0YW5kYXJkCiBtaXBzL21pcHMvc3RhY2tfbWFj aGRlcC5jCQlvcHRpb25hbAlkZGIgfCBzdGFjawpkaWZmIC0tZ2l0IGEvbGliL2xpYmt2bS9rdm1f bWlwcy5oIGIvbGliL2xpYmt2bS9rdm1fbWlwcy5oCi0tLSBhL2xpYi9saWJrdm0va3ZtX21pcHMu aAorKysgYi9saWIvbGlia3ZtL2t2bV9taXBzLmgKQEAgLTQ5LDcgKzQ5LDcgQEAKICNkZWZpbmUJ TUlQUzY0X0tTRUcxX0VORAkweGZmZmZmZmZmYmZmZmZmZmYKIAogI2RlZmluZQlNSVBTMzJfUEZO X01BU0sJCSgweDFGRkZGRkMwKQotI2RlZmluZQlNSVBTNjRfUEZOX01BU0sJCTB4M0ZGRkZGRkMw CisjZGVmaW5lCU1JUFM2NF9QRk5fTUFTSwkJMHhGRkZGRkZDMAogI2RlZmluZQlNSVBTX1BGTl9T SElGVAkJKDYpCiAKICNkZWZpbmUJTUlQU19QRk5fVE9fUEEocGZuKQkoKChwZm4pID4+IE1JUFNf UEZOX1NISUZUKSA8PCBNSVBTX1BBR0VfU0hJRlQpCgo= --b1_0f329be06464796422fbdb79db4d9952--