Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tZvmc-00ET5G-GI for pgsql-hackers@arkaria.postgresql.org; Mon, 20 Jan 2025 17:41:55 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tZvmb-004bnC-1y for pgsql-hackers@arkaria.postgresql.org; Mon, 20 Jan 2025 17:41:53 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tZvma-004biU-Ad for pgsql-hackers@lists.postgresql.org; Mon, 20 Jan 2025 17:41:52 +0000 Received: from dd48506.kasserver.com ([85.13.164.188]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1tZvmV-000aU1-0S for pgsql-hackers@postgresql.org; Mon, 20 Jan 2025 17:41:51 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oopsware.de; s=kas202409031116; t=1737394904; bh=dIbesYtSmgPS6gyeuLhO8y0MdPlbjW679Pm3TKmNAEg=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=EiBGTKAK4Fc5p7036iuexp0C3f4hOHiMfV0oVlvdna6KG+XZSBa3HRR5bSpc7WKAp qrGl4LfQ+/1I0WVbt/mT6hlRGc9fq2w4YjuStag+t/ovAOrXtE19GuKtVeWIM3um4s idK7pmtZctPio0ova53h8I991yrvwhd4hBDST1M+0pdN8Sqi//nvGWpKLPzsFFpiaf hl9er2+9F/UqIVMvSyDpfAXLPfbQgmIZzVpf00P35qEE4sX6E+hjjLAHOlWnnlAfV4 PqDghsYmxtXpSKzOOWEK3+dHtEwsnBJnip3QIBz+VG9IU4frw149jua1qWmXmvpsoI UGl3iYoTHU1lw== Received: from sethos.at.struktu.ro (sethos.at.struktu.ro [46.4.183.126]) by dd48506.kasserver.com (Postfix) with ESMTPSA id 086B38663194; Mon, 20 Jan 2025 18:41:44 +0100 (CET) Received: from chufu.bluecherstrasse.oopsware.lan (i5C75093E.versanet.de [92.117.9.62]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sethos.at.struktu.ro (Postfix) with ESMTPSA id 62F8C41B7E81; Mon, 20 Jan 2025 18:41:43 +0100 (CET) Message-ID: <3e48cd7c02f437ed980ee57340cb5c54f60e359c.camel@oopsware.de> Subject: Re: Modern SHA2- based password hashes for pgcrypto From: Bernd Helmle To: Alvaro Herrera Cc: Japin Li , PostgreSQL Development Date: Mon, 20 Jan 2025 18:41:42 +0100 In-Reply-To: <202501131606.h6ctz533qhy6@alvherre.pgsql> References: <202501131606.h6ctz533qhy6@alvherre.pgsql> Autocrypt: addr=mailings@oopsware.de; prefer-encrypt=mutual; keydata=mQGiBEIM4dYRBACEnxQZ/CfR1xbCJzGOIjvh3fZpLALMm+tt237QlZm9nlLaEwCn317sT 1khPAJwhyBHSHbNFbH+LOL6ezYrg4V2Q9KHyYJDStJtC8c+D7vHVB5Jfslynx89DnCH6jb3H0j+U0 iNYmRmT18PWTZhD5RuXT+Toyz/0hH4YnJzha4VUwCggikXRuhIQ0KIzrps7/PsvasTPjUD/1aoEHR wVyk2C2hXh6GWJYq+1l+sB2d0TOnFJf2xy3Xo03Hi+BEJJdYGqJKqzd0KfsFyJYhO2GIGScSEj1hs TqAiY8OZeRqRGHe69OQEguUSVXp/jPaqU8fel8dbDDMnXkgULq8oO4T9e4GJSFqIvrlx0sJqSMFdi ihV+xCzDS40BACBrTq9tyXmyxJWzQ1/0Hx9S4sU+yeR8ztZH9xgWi1wksfHpEgZBdAkQynlI80/bC tgxfVu+LKgxeqGfMSnT9t8agpr1IGcmSbDntbn/K+3EmCze0jq8EQrZHJWiwCqraM8mnmILSEl5zn aoVoBIF062b60zZicuNeYaVgEKSHfirQgQmVybmQgSGVsbWxlIDxiZXJuZEBvb3Bzd2FyZS5kZT6I XgQTEQIAHgUCQhyP2gIbAwYLCQgHAwIDFQIDAxYCAQIeAQIXgAAKCRBRdc2OhdlKzMm4AJ9mW1np2 RXi66WzEvcIanaJkDT+xgCfZmXG/Sziz5FchI3OjXfXDZfwnNm0J0Jlcm5kIEhlbG1sZSA8YmVybm QuaGVsbWxlQG9vcHN3YXJlLmRlPoheBBMRAgAeBQJCDOHWAhsDBgsJCAcDAgMVAgMDFgIBAh4BAhe AAAoJEFF1zY6F2UrMWZgAn3MVwDBzRS5dZu1yjx7WU3E3JSheAJ41CUYMIkX/oYfWssUVYnOuedgn 8LQlQmVybmQgSGVsbWxlIDxiaEBzY2huYWVwcGNoZW5qYWdkLmRlPoheBBMRAgAeBQJCHI+pAhsDB gsJCAcDAgMVAgMDFgIBAh4BAheAAAoJEFF1zY6F2UrMYMUAn0rk8fEEY2tHGSUD7PNbk+Fwkd7MAJ 4wMfOerrvsKTrB9xmFnZ2ZUy67w7QjQmVybmQgSGVsbWxlIDxtYWlsaW5nc0Bvb3Bzd2FyZS5kZT6 IXgQTEQIAHgUCQhyPxgIbAwYLCQgHAwIDFQIDAxYCAQIeAQIXgAAKCRBRdc2OhdlKzOhrAJ4w+A3H cjTJb54lUDpyyQu6Y5dlVQCeJCFKygOVbpn4HSp4Z+R6+s4Rul60J0Jlcm5kIEhlbG1sZSA8YmVyb mQuaGVsbWxlQGN5YmVydGVjLmF0Poh4BBMRAgA4FiEEcLVWcrwQIdBqHtvMUXXNjoXZSswFAmDe1D kCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQUXXNjoXZSszs9QCfbbpKT0/Mh4PhfS6rRbm NNQC1zS8An2x1PLHPS6649DRkiYOMWTXzAlSE Content-Type: multipart/mixed; boundary="=-3c/Z4Iy99mL6252wmjl6" User-Agent: Evolution 3.54.3 (3.54.3-1.fc41) MIME-Version: 1.0 X-Spamd-Bar: + List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=-3c/Z4Iy99mL6252wmjl6 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi,=20 Please find attached a reworked patch according Alvaro's comments. Am Montag, dem 13.01.2025 um 17:06 +0100 schrieb Alvaro Herrera: > Hello >=20 > I was passing by and I noticed that this needs badly pgindent, and > some > comments are enumerations that would lose formatting once through it. > For example, this would happen which is not good: >=20 > =C2=A0=C2=A0=C2=A0 /* > -=C2=A0=C2=A0=C2=A0 * 1. Start digest A > -=C2=A0=C2=A0=C2=A0 * 2. Add the password string to digest A > -=C2=A0=C2=A0=C2=A0 * 3. Add the salt to digest A > +=C2=A0=C2=A0=C2=A0 * 1. Start digest A 2. Add the password string to dig= est A 3. > Add the > +=C2=A0=C2=A0=C2=A0 * salt to digest A > =C2=A0=C2=A0=C2=A0=C2=A0 */ >=20 > I suggest you can fix this by adding a "-" sign to the opening "/*" > line > so that pgindent doesn't mangle it (so it becomes /*- ).=C2=A0 This > appears > in several places. >=20 This is even documented: https://www.postgresql.org/docs/devel/source-format.html I ran pgindent locally and verified it works like you suggested. >=20 [...] > Your test data (crypt-shacrypt.sql) looks a bit short.=C2=A0 I noticed > that > Drepper's SHA-crypt.txt file has a bunch of test lines (starting with > the "Test vectors from FIPS 180-2: appendix B.1." comment line, as > well > as "appendix C.1" at the bottom) which perhaps could be incorporated > into the .sql script, to ensure correctness (or at least, > bug-compatibility with the reference implementation).=C2=A0 I'd also add = a > note that Drepper's implementation is public domain in crypt-sha.c's > license block. >=20 These FIPS cases tests explicit against sha{256|512}_process_bytes() in Drepper's code, which seem to be the equivalent to OpenSSL's EVP_Digest*() API we're using. I am not sure it makes sense to adapt them. I left them out for now but adapted all the testcases for the password hashes defined in the 2nd test cases to make sure we create the same hashes. > I think the "ascii_dollar" variable is a bit useless.=C2=A0 Why not just > use the > literal $ sign where needed (or a DOLLAR_CHR if we feel like avoiding > a > magic value there)?=C2=A0 Also, I wonder if it would be better to use a > StringInfo instead of a fixed-size buffer, which would probably make > some string manipulations easier ... Or maybe not, but let's not mix > strlcat calls with strncat calls with no comments about why. Result buffer via out_buf is wrapped into a StringInfo now. >=20 > Some of your elog(ERROR)s should probably be ereport(), and I'm not > sure > we want all the elog(DEBUG1)s. Done, but i kept some of the DEBUG output for now. I am not sure if i really should set the errcode for ereport() explicitly, but i did on some places where i thought it might be useful. This patch version also changes the original behavior of crypt() when called for sha{256|512}crypt hashes. Before we didn't accept values for the rounds parameter exceeding the minimum and maximum values. This was along with gen_salt(), which also errors out in such cases. But Drepper's code accepts them and changes them behind the scenes either to the minimum or maximum and calculates the password hash based on them, depending on the exceeded boundary. So when passing a user defined salt string to crypt(), we do the same now but i added a NOTICE to indicate that we changed the user submitted parameter behind the scene. This also enables us to stress px_crypt_shacrypt() with the same test cases as Drepper's code. Thanks, Bernd --=-3c/Z4Iy99mL6252wmjl6 Content-Disposition: attachment; filename*0=0001-Add-modern-SHA-2-based-password-hashes-to-pgcrypto-v3.pa; filename*1=tch Content-Type: text/x-patch; name="0001-Add-modern-SHA-2-based-password-hashes-to-pgcrypto-v3.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSAyMGFlOTNhZWFkMjJjZGM0ODg2MDg0YjI4Mjc0MWE4NTRhMTYzOTA1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBCZXJuZCBIZWxtbGUgPEJlcm5kIEhlbG1sZSBtYWlsaW5nc0Bv b3Bzd2FyZS5kZT4KRGF0ZTogTW9uLCAyMCBKYW4gMjAyNSAxNzo1NToxMyArMDEwMApTdWJqZWN0 OiBbUEFUQ0hdIEFkZCBtb2Rlcm4gU0hBLTIgYmFzZWQgcGFzc3dvcmQgaGFzaGVzIHRvIHBnY3J5 cHRvLgoKVGhpcyBhZGFwdHMgdGhlIHB1YmxpY2x5IGF2YWlsYWJsZSByZWZlcmVuY2UgaW1wbGVt ZW50YXRpb24gb24KaHR0cHM6Ly93d3cuYWtrYWRpYS5vcmcvZHJlcHBlci9TSEEtY3J5cHQudHh0 IGFuZCBhZGRzIHRoZSBuZXcKaGFzaCBhbGdvcml0aG1zIHNoYTI1NmNyeXB0IGFuZCBzaGE1MTJj cnlwdCB0byBjcnlwdCgpIGFuZCBnZW5fc2FsdCgpCnJlc3BlY3RpdmVseS4KLS0tCiBjb250cmli L3BnY3J5cHRvL01ha2VmaWxlICAgICAgICAgICAgICAgICAgICB8ICAgMyArLQogY29udHJpYi9w Z2NyeXB0by9jcnlwdC1nZW5zYWx0LmMgICAgICAgICAgICAgfCAgODQgKysrCiBjb250cmliL3Bn Y3J5cHRvL2NyeXB0LXNoYS5jICAgICAgICAgICAgICAgICB8IDYyMCArKysrKysrKysrKysrKysr KysrCiBjb250cmliL3BnY3J5cHRvL2V4cGVjdGVkL2NyeXB0LXNoYWNyeXB0Lm91dCB8IDE5NiAr KysrKysKIGNvbnRyaWIvcGdjcnlwdG8vbWVzb24uYnVpbGQgICAgICAgICAgICAgICAgIHwgICAy ICsKIGNvbnRyaWIvcGdjcnlwdG8vcHgtY3J5cHQuYyAgICAgICAgICAgICAgICAgIHwgIDE2ICsK IGNvbnRyaWIvcGdjcnlwdG8vcHgtY3J5cHQuaCAgICAgICAgICAgICAgICAgIHwgIDMxICsKIGNv bnRyaWIvcGdjcnlwdG8vc3FsL2NyeXB0LXNoYWNyeXB0LnNxbCAgICAgIHwgIDk5ICsrKwogZG9j L3NyYy9zZ21sL3BnY3J5cHRvLnNnbWwgICAgICAgICAgICAgICAgICAgfCAgNDIgKy0KIDkgZmls ZXMgY2hhbmdlZCwgMTA5MSBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQogY3JlYXRlIG1v ZGUgMTAwNjQ0IGNvbnRyaWIvcGdjcnlwdG8vY3J5cHQtc2hhLmMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBjb250cmliL3BnY3J5cHRvL2V4cGVjdGVkL2NyeXB0LXNoYWNyeXB0Lm91dAogY3JlYXRlIG1v ZGUgMTAwNjQ0IGNvbnRyaWIvcGdjcnlwdG8vc3FsL2NyeXB0LXNoYWNyeXB0LnNxbAoKZGlmZiAt LWdpdCBhL2NvbnRyaWIvcGdjcnlwdG8vTWFrZWZpbGUgYi9jb250cmliL3BnY3J5cHRvL01ha2Vm aWxlCmluZGV4IDg1ZjFjOTQ2ODEzLi4xOWMxMjQwNzlmYyAxMDA2NDQKLS0tIGEvY29udHJpYi9w Z2NyeXB0by9NYWtlZmlsZQorKysgYi9jb250cmliL3BnY3J5cHRvL01ha2VmaWxlCkBAIC0xMSw2 ICsxMSw3IEBAIE9CSlMgPSBcCiAJY3J5cHQtZGVzLm8gXAogCWNyeXB0LWdlbnNhbHQubyBcCiAJ Y3J5cHQtbWQ1Lm8gXAorCWNyeXB0LXNoYS5vIFwKIAltYnVmLm8gXAogCW9wZW5zc2wubyBcCiAJ cGdjcnlwdG8ubyBcCkBAIC00Myw3ICs0NCw3IEBAIFJFR1JFU1MgPSBpbml0IG1kNSBzaGExIGht YWMtbWQ1IGhtYWMtc2hhMSBibG93ZmlzaCByaWpuZGFlbCBcCiAJc2hhMiBkZXMgM2RlcyBjYXN0 NSBcCiAJY3J5cHQtZGVzIGNyeXB0LW1kNSBjcnlwdC1ibG93ZmlzaCBjcnlwdC14ZGVzIFwKIAlw Z3AtYXJtb3IgcGdwLWRlY3J5cHQgcGdwLWVuY3J5cHQgcGdwLWVuY3J5cHQtbWQ1ICQoQ0ZfUEdQ X1RFU1RTKSBcCi0JcGdwLXB1YmtleS1kZWNyeXB0IHBncC1wdWJrZXktZW5jcnlwdCBwZ3AtaW5m bworCXBncC1wdWJrZXktZGVjcnlwdCBwZ3AtcHVia2V5LWVuY3J5cHQgcGdwLWluZm8gY3J5cHQt c2hhY3J5cHQKIAogaWZkZWYgVVNFX1BHWFMKIFBHX0NPTkZJRyA9IHBnX2NvbmZpZwpkaWZmIC0t Z2l0IGEvY29udHJpYi9wZ2NyeXB0by9jcnlwdC1nZW5zYWx0LmMgYi9jb250cmliL3BnY3J5cHRv L2NyeXB0LWdlbnNhbHQuYwppbmRleCA3NDBmMzYxMjUzMi4uYzUwMTdiZDY2N2MgMTAwNjQ0Ci0t LSBhL2NvbnRyaWIvcGdjcnlwdG8vY3J5cHQtZ2Vuc2FsdC5jCisrKyBiL2NvbnRyaWIvcGdjcnlw dG8vY3J5cHQtZ2Vuc2FsdC5jCkBAIC0xODUsMyArMTg1LDg3IEBAIF9jcnlwdF9nZW5zYWx0X2Js b3dmaXNoX3JuKHVuc2lnbmVkIGxvbmcgY291bnQsCiAKIAlyZXR1cm4gb3V0cHV0OwogfQorCitz dGF0aWMgY2hhciAqCitfY3J5cHRfZ2Vuc2FsdF9zaGEodW5zaWduZWQgbG9uZyBjb3VudCwKKwkJ CQkgICBjb25zdCBjaGFyICppbnB1dCwgaW50IHNpemUsIGNoYXIgKm91dHB1dCwgaW50IG91dHB1 dF9zaXplKQoreworCWNoYXIgKiBzX3B0ciA9IG91dHB1dDsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0 X2J1ZnNpemUgPSBQWF9TSEFDUllQVF9TQUxUX0JVRl9MRU47CisJaW50IHJjOworCisJLyogb3V0 cHV0IGJ1ZmZlciBtdXN0IGJlIGFsbG9jYXRlZCB3aXRoIFBYX01BWF9TQUxUX0xFTiBieXRlcyAq LworCWlmIChQWF9NQVhfU0FMVF9MRU4gPCByZXN1bHRfYnVmc2l6ZSkKKwl7CisJCWVyZXBvcnQo RVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9TWU5UQVhfRVJST1IpLAorCQkJCSBlcnJtc2co ImludmFsaWQgc2l6ZSBvZiBzYWx0IikpKTsKKwl9CisKKwkvKgorCSAqIENhcmUgbXVzdCBiZSB0 YWtlbiB0byBub3QgZXhjZWVkIHRoZSBidWZmZXIgc2l6ZSBhbGxvY2F0ZWQgZm9yCisJICogdGhl IGlucHV0IGNoYXJhY3RlciBidWZmZXIuCisJICovCisJaWYgKChQWF9TSEFDUllQVF9TQUxUX0xF Tl9NQVggIT0gc2l6ZSkKKwkJfHwgKG91dHB1dF9zaXplIDwgc2l6ZSkpCisJeworCQllcmVwb3J0 KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfSU5URVJOQUxfRVJST1IpLAorCQkJCSBlcnJt c2coImludmFsaWQgbGVuZ3RoIG9mIHNhbHQgYnVmZmVyIikpKTsKKwl9CisKKwkvKiBTa2lwIG1h Z2ljIGJ5dGVzLCBzZXQgYnkgY2FsbGVycyAqLworCXNfcHRyICs9IDM7CisJaWYgKChyYyA9IHBn X3NucHJpbnRmKHNfcHRyLCAxOCwgInJvdW5kcz0lbGQkIiwgY291bnQpKSA8PSAwKQorCXsKKwkJ ZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX0lOVEVSTkFMX0VSUk9SKSwKKwkJ CQkgZXJybXNnKCJjYW5ub3QgZm9ybWF0IHNhbHQgc3RyaW5nIikpKTsKKwl9CisKKwkvKiBzX3B0 ciBzaG91bGQgbm93IGJlIHBvc2l0aW9uZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzYWx0IHN0cmlu ZyAqLworCXNfcHRyICs9IHJjOworCisJLyoKKwkgKiBOb3JtYWxpemUgc2FsdCBzdHJpbmcKKwkg KgorCSAqIHNpemUgb2YgaW5wdXQgYnVmZmVyIHdhcyBjaGVja2VkIGFib3ZlIHRvCisJICogbm90 IGV4Y2VlZCBQWF9TSEFDUllQVF9TQUxUX0xFTl9NQVguCisJICovCisJZm9yIChpbnQgaSA9IDA7 IGkgPCBzaXplOyBpKyspCisJeworCQkqc19wdHIgPSBfY3J5cHRfaXRvYTY0W2lucHV0W2ldICYg MHgzZl07CisJCXNfcHRyKys7CisJfQorCisJLyogV2UncmUgZG9uZSAqLworCXJldHVybiBvdXRw dXQ7Cit9CisKK2NoYXIgKgorX2NyeXB0X2dlbnNhbHRfc2hhNTEyX3JuKHVuc2lnbmVkIGxvbmcg Y291bnQsCisJCQkJCQkgY2hhciBjb25zdCAqaW5wdXQsIGludCBzaXplLAorCQkJCQkJIGNoYXIg Km91dHB1dCwgaW50IG91dHB1dF9zaXplKQoreworCW1lbXNldChvdXRwdXQsIDAsIG91dHB1dF9z aXplKTsKKwkvKiBzZXQgbWFnaWMgYnl0ZSBmb3Igc2hhNTEyY3J5cHQgKi8KKwlvdXRwdXRbMF0g PSAnJCc7CisJb3V0cHV0WzFdID0gJzYnOworCW91dHB1dFsyXSA9ICckJzsKKworCXJldHVybiBf Y3J5cHRfZ2Vuc2FsdF9zaGEoY291bnQsIGlucHV0LCBzaXplLCBvdXRwdXQsIG91dHB1dF9zaXpl KTsKK30KKworY2hhciAqCitfY3J5cHRfZ2Vuc2FsdF9zaGEyNTZfcm4odW5zaWduZWQgbG9uZyBj b3VudCwKKwkJCQkJCSBjb25zdCBjaGFyICppbnB1dCwgaW50IHNpemUsCisJCQkJCQkgY2hhciAq b3V0cHV0LCBpbnQgb3V0cHV0X3NpemUpCit7CisJbWVtc2V0KG91dHB1dCwgMCwgb3V0cHV0X3Np emUpOworCS8qIHNldCBtYWdpYyBieXRlIGZvciBzaGE1MTJjcnlwdCAqLworCW91dHB1dFswXSA9 ICckJzsKKwlvdXRwdXRbMV0gPSAnNSc7CisJb3V0cHV0WzJdID0gJyQnOworCisJcmV0dXJuIF9j cnlwdF9nZW5zYWx0X3NoYShjb3VudCwgaW5wdXQsIHNpemUsIG91dHB1dCwgb3V0cHV0X3NpemUp OworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdj cnlwdG8vY3J5cHQtc2hhLmMgYi9jb250cmliL3BnY3J5cHRvL2NyeXB0LXNoYS5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4zODMwNTJhOGJjOAotLS0gL2Rldi9udWxs CisrKyBiL2NvbnRyaWIvcGdjcnlwdG8vY3J5cHQtc2hhLmMKQEAgLTAsMCArMSw2MjAgQEAKKy8q CisgKiBjb250cmliL3BnY3J5cHRvL2NyeXB0LXNoYS5jCisgKgorICogVGhpcyBpbXBsZW1lbnRz IHNoYWNyeXB0IHBhc3N3b3JkIGhhc2ggZnVuY3Rpb25zIGFuZCBmb2xsb3dzIHRoZQorICogcHVi bGljIGF2YWlsYWJsZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZnJvbQorICoKKyAqIGh0dHBz Oi8vd3d3LmFra2FkaWEub3JnL2RyZXBwZXIvU0hBLWNyeXB0LnR4dAorICoKKyAqIFRoaXMgY29k ZSBpcyBwdWJsaWMgZG9tYWluLgorICoKKyAqIFBsZWFzZSBzZWUgdGhlIGlubGluZSBjb21tZW50 cyBmb3IgZGV0YWlscyBhYm91dCB0aGUgYWxnb3JpdGhtLgorICoKKyAqIEJhc2ljYWxseSB0aGUg Zm9sbG93aW5nIGNvZGUgaW1wbGVtZW50cyBwYXNzd29yZCBoYXNoaW5nIHdpdGggc2hhMjU2IGFu ZAorICogc2hhNTEyIGRpZ2VzdCB2aWEgT3BlblNTTC4gQWRkaXRpb25hbGx5LCBhbiBleHRlbmRl ZCBzYWx0IGdlbmVyYXRpb24gKHNlZQorICogY3J5cHQtZ2Vuc2FsdC5jIGZvciBkZXRhaWxzKSBp cyBwcm92aWRlZCwgd2hpY2ggZ2VuZXJhdGVzIGEgc2FsdCBzdWl0YWJsZQorICogZm9yIGVpdGhl ciBzaGEyNTZjcnlwdCBhbmQgc2hhNTEyY3J5cHQgcGFzc3dvcmQgaGFzaCBnZW5lcmF0aW9uLgor ICoKKyAqIE9mZmljaWFsIGlkZW50aWZpZXJzIGZvciBzdWl0YWJsZSBwYXNzd29yZCBoYXNoZXMg dXNlZCBpbiBzYWx0cyBhcmUKKyAqIDUgOiBzaGEyNTZjcnlwdCBhbmQKKyAqIDYgOiBzaGE1MTJj cnlwdAorICoKKyAqIFRoZSBoYXNoaW5nIGNvZGUgYmVsb3cgc3VwcG9ydHMgYW5kIHVzZXMgc2Fs dCBsZW5ndGggdXAgdG8gMTYgYnl0ZXMuIExvbmdlcgorICogaW5wdXQgaXMgcG9zc2libGUsIGJ1 dCBhbnkgYWRkaXRpb25hbCBieXRlIG9mIHRoZSBpbnB1dCBpcyBkaXNyZWdhcmRlZC4KKyAqIGdl bl9zYWx0KCksIHdoZW4gY2FsbGVkIHdpdGggYSBzaGEyNTZjcnlwdCBvciBzaGE1MTJjcnlwdCBp ZGVudGlmaWVyIHdpbGwKKyAqIGFsd2F5cyBnZW5lcmF0ZSBhIDE2IGJ5dGUgbG9uZyBzYWx0IHN0 cmluZy4KKyAqCisgKiBPdXRwdXQgaXMgY29tcGF0aWJsZSB3aXRoIGFueSBzaGEyNTZjcnlwdCBh bmQgc2hhNTEyY3J5cHQgb3V0cHV0CisgKiBnZW5lcmF0ZWQgYnkgZS5nLiBPcGVuU1NMIG9yIGxp YmMgY3J5cHQoKS4KKyAqCisgKiBUaGUgZGVzY3JpYmVkIGFsZ29yaXRobSB1c2VzIGRlZmF1bHQg Y29tcHV0aW5nIHJvdW5kcyBvZiA1MDAwLiBDdXJyZW50bHksCisgKiBldmVuIHdoZW4gbm8gc3Bl Y2lmaWMgcm91bmRzIHNwZWNpZmljYXRpb24gaXMgdXNlZCwgd2UgYWx3YXlzIGV4cGxpY2l0bHkK KyAqIHByaW50IG91dCB0aGUgcm91bmRzIG9wdGlvbiBmbGFnIHdpdGggdGhlIGZpbmFsIGhhc2gg cGFzc3dvcmQgc3RyaW5nLgorICoKKyAqIFRoZSBsZW5ndGggb2YgdGhlIHNwZWNpZmljIHBhc3N3 b3JkIGhhc2ggKHdpdGhvdXQgbWFnaWMgYnl0ZXMgYW5kIHNhbHQKKyAqIHN0cmluZykgaXM6Cisg KgorICogc2hhMjU2Y3J5cHQ6IDQzIGJ5dGVzIGFuZAorICogc2hhNTEyY3J5cHQ6IDg2IGJ5dGVz LgorICoKKyAqIE92ZXJhbGwgaGFzaGVkIHBhc3N3b3JkIGxlbmd0aCBpczoKKyAqCisgKiBzaGEy NTZjcnlwdDogODAgYnl0ZXMgYW5kCisgKiBzaGE1MTJjcnlwdDogMTIzIGJ5dGVzCisgKgorICov CisjaW5jbHVkZSAicG9zdGdyZXMuaCIKKyNpbmNsdWRlICJtaXNjYWRtaW4uaCIKKworI2luY2x1 ZGUgInB4LWNyeXB0LmgiCisjaW5jbHVkZSAicHguaCIKKwordHlwZWRlZiBlbnVtCit7CisJUEdD UllQVE9fU0hBMjU2Q1JZUFQgPSAwLAorCVBHQ1JZUFRPX1NIQTUxMkNSWVBUID0gMSwKKwlQR0NS WVBUT19TSEFfVU5LT1dOCit9CQkJUEdDUllQVE9fU0hBX3Q7CisKK3N0YXRpYyB1bnNpZ25lZCBj aGFyIF9jcnlwdF9pdG9hNjRbNjQgKyAxXSA9CisiLi8wMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5P UFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisKKy8qCisgKiBNb2Rlcm4g VU5JWCBwYXNzd29yZCwgYmFzZWQgb24gU0hBIGNyeXB0IGhhc2hlcworICovCitjaGFyICoKK3B4 X2NyeXB0X3NoYWNyeXB0KGNvbnN0IGNoYXIgKnB3LCBjb25zdCBjaGFyICpzYWx0LCBjaGFyICpw YXNzd2QsIHVuc2lnbmVkIGRzdGxlbikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciByb3VuZHNfcHJl Zml4W10gPSAicm91bmRzPSI7CisJc3RhdGljIGNoYXIgKm1hZ2ljX2J5dGVzWzJdID0geyIkNSQi LCAiJDYkIn07CisKKwkvKiBVc2VkIHRvIGNyZWF0ZSB0aGUgcGFzc3dvcmQgaGFzaCBzdHJpbmcg Ki8KKwlTdHJpbmdJbmZvCW91dF9idWYgPSBOVUxMOworCisJUEdDUllQVE9fU0hBX3QgdHlwZSA9 IFBHQ1JZUFRPX1NIQV9VTktPV047CisJUFhfTUQJICAgKmRpZ2VzdEEgPSBOVUxMOworCVBYX01E CSAgICpkaWdlc3RCID0gTlVMTDsKKwlpbnQJCQllcnI7CisKKwljb25zdCBjaGFyICpkZWNfc2Fs dF9iaW5hcnk7CS8qIHBvaW50ZXIgaW50byB0aGUgcmVhbCBzYWx0IHN0cmluZyAqLworCisJdW5z aWduZWQgY2hhciBzaGFfYnVmW1BYX1NIQUNSWVBUX0RJR0VTVF9NQVhfTEVOR1RIXTsKKwl1bnNp Z25lZCBjaGFyIHNoYV9idWZfdG1wW1BYX1NIQUNSWVBUX0RJR0VTVF9NQVhfTEVOR1RIXTsJLyog dGVtcG9yYXJ5IGJ1ZmZlciBmb3IKKwkJCQkJCQkJCQkJCQkJCQkgKiBkaWdlc3RzICovCisKKwlj aGFyCQlyb3VuZHNfY3VzdG9tID0gMDsKKwljaGFyCSAgICpwX2J5dGVzID0gTlVMTDsKKwljaGFy CSAgICpzX2J5dGVzID0gTlVMTDsKKwljaGFyCSAgICpjcCA9IE5VTEw7CisJY29uc3QgY2hhciAq ZXA7CQkJCS8qIGhvbGRzIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgc2FsdCBzdHJpbmcgKi8K KworCXNpemVfdAkJYnVmX3NpemUgPSAwOwkvKiBidWZmZXIgc2l6ZSBmb3Igc2hhMjU2Y3J5cHQv c2hhNTEyY3J5cHQgKi8KKwl1bnNpZ25lZCBpbnQgYmxvY2s7CQkJLyogbnVtYmVyIG9mIGJ5dGVz IHByb2Nlc3NlZCAqLworCXVuc2lnbmVkIGxvbmcgcm91bmRzID0gUFhfU0hBQ1JZUFRfUk9VTkRT X0RFRkFVTFQ7CisKKwl1bnNpZ25lZAlsZW4sCisJCQkJc2FsdF9sZW47CisKKwkvKiBJbml0IHJl c3VsdCBidWZmZXIgKi8KKwlvdXRfYnVmID0gbWFrZVN0cmluZ0luZm9FeHQoUFhfU0hBQ1JZUFRf QlVGX0xFTik7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKCFwYXNzd2QpCisJCXJldHVy biBOVUxMOworCisJaWYgKHB3ID09IE5VTEwpCisJeworCQllbG9nKEVSUk9SLCAibnVsbCB2YWx1 ZSBmb3IgcGFzc3dvcmQgcmVqZWN0ZWQiKTsKKwl9CisKKwlpZiAoc2FsdCA9PSBOVUxMKQorCXsK KwkJZWxvZyhFUlJPUiwgIm51bGwgdmFsdWUgZm9yIHNhbHQgcmVqZWN0ZWQiKTsKKwl9CisKKwkv KgorCSAqIE1ha2Ugc3VyZSByZXN1bHQgYnVmZmVycyBhcmUgbGFyZ2UgZW5vdWdoLgorCSAqLwor CWlmIChkc3RsZW4gPCBQWF9TSEFDUllQVF9CVUZfTEVOKQorCXsKKwkJZWxvZyhFUlJPUiwgImlu c3VmZmljaWVudCByZXN1bHQgYnVmZmVyIHNpemUgdG8gZW5jcnlwdCBwYXNzd29yZCIpOworCX0K KworCS8qIEluaXQgY29udGVudHMgb2YgYnVmZmVycyBwcm9wZXJseSAqLworCW1lbXNldCgmc2hh X2J1ZiwgJ1wwJywgc2l6ZW9mKHNoYV9idWYpKTsKKwltZW1zZXQoJnNoYV9idWZfdG1wLCAnXDAn LCBzaXplb2Yoc2hhX2J1Zl90bXApKTsKKworCS8qCisJICogRGVjb2RlIHRoZSBzYWx0IHN0cmlu Zy4gV2UgbmVlZCB0byBrbm93IGhvdyBtYW55IHJvdW5kcyBhbmQgd2hpY2gKKwkgKiBkaWdlc3Qg d2UgaGF2ZSB0byB1c2UgdG8gaGFzaCB0aGUgcGFzc3dvcmQuCisJICovCisJbGVuID0gc3RybGVu KHB3KTsKKwlkZWNfc2FsdF9iaW5hcnkgPSBzYWx0OworCisJLyoKKwkgKiBBbmFseXplIGFuZCBw cmVwYXJlIHRoZSBzYWx0IHN0cmluZworCSAqCisJICogVGhlIG1hZ2ljIHN0cmluZyBzaG91bGQg YmUgc3BlY2lmaWVkIGluIHRoZSBmaXJzdCB0aHJlZSBieXRlcyBvZiB0aGUKKwkgKiBzYWx0IHN0 cmluZy4gQnV0IGRvIHNvbWUgc2FuaXR5IGNoZWNrcyBiZWZvcmUuCisJICovCisJaWYgKHN0cmxl bihkZWNfc2FsdF9iaW5hcnkpIDwgMykKKwl7CisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNv ZGUoRVJSQ09ERV9JTlZBTElEX1BBUkFNRVRFUl9WQUxVRSksCisJCQkJIGVycm1zZygiaW52YWxp ZCBzYWx0IikpKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGZvcm1hdCBvZiBtYWdpYyBieXRlcy4g VGhlc2Ugc2hvdWxkIGRlZmluZSBlaXRoZXIgNT1zaGEyNTZjcnlwdAorCSAqIG9yIDY9c2hhNTEy Y3J5cHQgaW4gdGhlIHNlY29uZCBieXRlLCBlbmNsb3NlZCBieSBhc2NpaSBkb2xsYXIgc2lnbnMu CisJICovCisJaWYgKChkZWNfc2FsdF9iaW5hcnlbMF0gIT0gJyQnKQorCQkmJiAoZGVjX3NhbHRf YmluYXJ5WzJdICE9ICckJykpCisJeworCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVS UkNPREVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUpLAorCQkJCSBlcnJtc2coImludmFsaWQgZm9y bWF0IG9mIHNhbHQiKSksCisJCQkJZXJyaGludCgibWFnaWMgYnl0ZSBmb3JtYXQgZm9yIHNoYWNy eXB0IGlzIGVpdGhlciBcIiQ1JFwiIG9yIFwiJDYkXCIiKSk7CisJfQorCisJLyoKKwkgKiBDaGVj ayBtYWdpYyBieXRlIGZvciBzdXBwb3J0ZWQgc2hhY3J5cHQgZGlnZXN0LgorCSAqCisJICogV2Un cmUganVzdCBpbnRlcmVzdGVkIGluIHRoZSB2ZXJ5IGZpcnN0IDMgYnl0ZXMgb2YgdGhlIHNhbHQg c3RyaW5nLAorCSAqIHNpbmNlIHRoaXMgZGVmaW5lcyB0aGUgZGlnZXN0IGxlbmd0aCB0byB1c2Uu CisJICovCisJaWYgKHN0cm5jbXAoZGVjX3NhbHRfYmluYXJ5LCBtYWdpY19ieXRlc1swXSwgc3Ry bGVuKG1hZ2ljX2J5dGVzWzBdKSkgPT0gMCkKKwl7CisJCXR5cGUgPSBQR0NSWVBUT19TSEEyNTZD UllQVDsKKwkJZGVjX3NhbHRfYmluYXJ5ICs9IHN0cmxlbihtYWdpY19ieXRlc1swXSk7CisJfQor CWVsc2UgaWYgKHN0cm5jbXAoZGVjX3NhbHRfYmluYXJ5LCBtYWdpY19ieXRlc1sxXSwgc3RybGVu KG1hZ2ljX2J5dGVzWzFdKSkgPT0gMCkKKwl7CisJCXR5cGUgPSBQR0NSWVBUT19TSEE1MTJDUllQ VDsKKwkJZGVjX3NhbHRfYmluYXJ5ICs9IHN0cmxlbihtYWdpY19ieXRlc1sxXSk7CisJfQorCisJ LyoKKwkgKiBkZWNfc2FsdF9iaW5hcnkgcG9pbnRlciBpcyBwb3NpdGlvbmVkIGFmdGVyIHRoZSBt YWdpYyBieXRlcyBub3cKKwkgKgorCSAqIFdlIGV4dHJhY3QgYW55IG9wdGlvbnMgaW4gdGhlIGZv bGxvd2luZyBjb2RlIGJyYW5jaC4gVGhlIG9ubHkgb3B0aW9uYWwKKwkgKiBzZXR0aW5nIHdlIG5l ZWQgdG8gdGFrZSBjYXJlIG9mIGlzIHRoZSAicm91bmRzIiBvcHRpb24uIE5vdGUgdGhhdCB0aGUK KwkgKiBzYWx0IGdlbmVyYXRvciBhbHJlYWR5IGNoZWNrZWQgZm9yIGludmFsaWQgc2V0dGluZ3Mg YmVmb3JlLCBidXQgd2UgbmVlZAorCSAqIHRvIGRvIGl0IGhlcmUgYWdhaW4gdG8gcHJvdGVjdCBh Z2FpbnN0IGluamVjdGlvbiBvZiB3cm9uZyB2YWx1ZXMgd2hlbgorCSAqIGNhbGxlZCB3aXRob3V0 IHRoZSBnZW5lcmF0b3IuCisJICoKKwkgKiBJZiB0aGVyZSBpcyBhbnkgZ2FyYmFnZSBhZGRlZCBh ZnRlciB0aGUgbWFnaWMgYnl0ZSBhbmQgdGhlIG9wdGlvbnMvc2FsdAorCSAqIHN0cmluZywgd2Ug ZG9uJ3QgdHJlYXQgdGhpcyBzcGVjaWFsOiBUaGlzIGlzIGp1c3QgYWJzb3JiZWQgYXMgcGFydCBv ZgorCSAqIHRoZSBzYWx0IHdpdGggdXAgdG8gUFhfU0hBQ1JZUFRfU0FMVF9MRU5fTUFYLgorCSAq CisJICogVW5rbm93biBtYWdpYyBieXRlIGlzIGhhbmRsZWQgbGF0ZXIgYmVsb3cKKwkgKi8KKwlp ZiAoc3RybmNtcChkZWNfc2FsdF9iaW5hcnksCisJCQkJcm91bmRzX3ByZWZpeCwgc2l6ZW9mKHJv dW5kc19wcmVmaXgpIC0gMSkgPT0gMCkKKwl7CisKKwkJY29uc3QgY2hhciAqbnVtID0gZGVjX3Nh bHRfYmluYXJ5ICsgc2l6ZW9mKHJvdW5kc19wcmVmaXgpIC0gMTsKKwkJY2hhcgkgICAqZW5kcDsK KwkJbG9uZwkJc3JvdW5kcyA9IHN0cnRvdWwobnVtLCAmZW5kcCwgMTApOworCisJCWlmICgqZW5k cCA9PSAnJCcpCisJCXsKKwkJCWRlY19zYWx0X2JpbmFyeSA9IGVuZHAgKyAxOworCisJCQkvKgor CQkJICogV2UgdmlvbGF0ZSBzdXBwb3J0ZWQgbG93ZXIgb3IgdXBwZXIgYm91bmQgb2Ygcm91bmRz LCBidXQgaW4KKwkJCSAqIHRoaXMgY2FzZSB3ZSBjaGFuZ2UgdGhpcyB2YWx1ZSB0byB0aGUgc3Vw cG9ydGVkIGxvd2VyIG9yIHVwcGVyCisJCQkgKiB2YWx1ZS4gV2UgZG9uJ3QgZG8gdGhpcyBzaWxl bnRseSBhbmQgcHJpbnQgYSBOT1RJQ0UgaW4gc3VjaCBhCisJCQkgKiBjYXNlLgorCQkJICoKKwkJ CSAqIE5vdGUgdGhhdCBhIHNhbHQgc3RyaW5nIGdlbmVyYXRlZCB3aXRoIGdlbl9zYWx0KCkgd291 bGQgbmV2ZXIKKwkJCSAqIGdlbmVyYXRlZCBzdWNoIGEgc2FsdCBzdHJpbmcsIHNpbmNlIGl0IHdv dWxkIGVycm9yIG91dC4KKwkJCSAqCisJCQkgKiBCdXQgRHJlcHBlcidzIHVwc3RyZWFtIHJlZmVy ZW5jZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGlzCisJCQkgKiB3aGVuIHBhc3NpbmcgdGhl IHNhbHQgc3RyaW5nIGRpcmVjdGx5LCBzbyB3ZSBtYWludGFpbgorCQkJICogY29tcGF0aWJpbGl0 eSBoZXJlLgorCQkJICovCisJCQlpZiAoc3JvdW5kcyA+IFBYX1NIQUNSWVBUX1JPVU5EU19NQVgp CisJCQl7CisJCQkJZXJlcG9ydChOT1RJQ0UsCisJCQkJCQllcnJjb2RlKEVSUkNPREVfTlVNRVJJ Q19WQUxVRV9PVVRfT0ZfUkFOR0UpLAorCQkJCQkJZXJybXNnKCJyb3VuZHM9JWxkIGV4Y2VlZHMg bWF4aW11bSBzdXBwb3J0ZWQgdmFsdWUgKCVsZCksIHVzaW5nICVsZCBpbnN0ZWFkIiwKKwkJCQkJ CQkgICBzcm91bmRzLCBQWF9TSEFDUllQVF9ST1VORFNfTUFYLAorCQkJCQkJCSAgIFBYX1NIQUNS WVBUX1JPVU5EU19NQVgpKTsKKwkJCQlzcm91bmRzID0gUFhfU0hBQ1JZUFRfUk9VTkRTX01BWDsK KwkJCX0KKwkJCWVsc2UgaWYgKHNyb3VuZHMgPCBQWF9TSEFDUllQVF9ST1VORFNfTUlOKQorCQkJ eworCQkJCWVyZXBvcnQoTk9USUNFLAorCQkJCQkJZXJyY29kZShFUlJDT0RFX05VTUVSSUNfVkFM VUVfT1VUX09GX1JBTkdFKSwKKwkJCQkJCWVycm1zZygicm91bmRzPSVsZCBpcyBiZWxvdyBzdXBw b3J0ZWQgdmFsdWUgKCVsZCksIHVzaW5nICVsZCBpbnN0ZWFkIiwKKwkJCQkJCQkgICBzcm91bmRz LCBQWF9TSEFDUllQVF9ST1VORFNfTUlOLAorCQkJCQkJCSAgIFBYX1NIQUNSWVBUX1JPVU5EU19N SU4pKTsKKwkJCQlzcm91bmRzID0gUFhfU0hBQ1JZUFRfUk9VTkRTX01JTjsKKwkJCX0KKworCQkJ cm91bmRzID0gKHVuc2lnbmVkIGxvbmcpIHNyb3VuZHM7CisJCQlyb3VuZHNfY3VzdG9tID0gMTsK KwkJfQorCQllbHNlCisJCXsKKwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCWVycmNvZGUoRVJSQ09E RV9TWU5UQVhfRVJST1IpLAorCQkJCQllcnJtc2coImNvdWxkIG5vdCBwYXJzZSBzYWx0IG9wdGlv bnMiKSk7CisJCX0KKworCX0KKworCS8qCisJICogQ2hvb3NlIHRoZSBjb3JyZWN0IGRpZ2VzdCBs ZW5ndGggYW5kIGFkZCB0aGUgbWFnaWMgYnl0ZXMgdG8gdGhlIHJlc3VsdAorCSAqIGJ1ZmZlci4g QWxzbyBoYW5kbGUgcG9zc2libGUgaW52YWxpZCBtYWdpYyBieXRlIHdlJ3ZlIGV4dHJhY3RlZCBh Ym92ZS4KKwkgKi8KKwlzd2l0Y2ggKHR5cGUpCisJeworCQljYXNlIFBHQ1JZUFRPX1NIQTI1NkNS WVBUOgorCQkJeworCQkJCS8qIFR3byBQWF9NRCBvYmplY3RzIHJlcXVpcmVkICovCisJCQkJZXJy ID0gcHhfZmluZF9kaWdlc3QoInNoYTI1NiIsICZkaWdlc3RBKTsKKwkJCQlpZiAoZXJyKQorCQkJ CQlnb3RvIGVycm9yOworCisJCQkJZXJyID0gcHhfZmluZF9kaWdlc3QoInNoYTI1NiIsICZkaWdl c3RCKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlnb3RvIGVycm9yOworCisJCQkJLyogZGlnZXN0IGJ1 ZmZlciBsZW5ndGggaXMgMzIgZm9yIHNoYTI1NiAqLworCQkJCWJ1Zl9zaXplID0gMzI7CisKKwkJ CQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKG91dF9idWYsIG1hZ2ljX2J5dGVzWzBdKTsKKwkJCQli cmVhazsKKwkJCX0KKworCQljYXNlIFBHQ1JZUFRPX1NIQTUxMkNSWVBUOgorCQkJeworCQkJCS8q IFR3byBQWF9NRCBvYmplY3RzIHJlcXVpcmVkICovCisJCQkJZXJyID0gcHhfZmluZF9kaWdlc3Qo InNoYTUxMiIsICZkaWdlc3RBKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlnb3RvIGVycm9yOworCisJ CQkJZXJyID0gcHhfZmluZF9kaWdlc3QoInNoYTUxMiIsICZkaWdlc3RCKTsKKwkJCQlpZiAoZXJy KQorCQkJCQlnb3RvIGVycm9yOworCisJCQkJYnVmX3NpemUgPSBQWF9TSEFDUllQVF9ESUdFU1Rf TUFYX0xFTkdUSDsKKworCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcob3V0X2J1ZiwgbWFnaWNf Ynl0ZXNbMV0pOworCQkJCWJyZWFrOworCQkJfQorCisJCWNhc2UgUEdDUllQVE9fU0hBX1VOS09X TjoKKwkJCWVsb2coRVJST1IsICJ1bmtub3duIGNyeXB0IGlkZW50aWZpZXIgXCIlY1wiIiwgc2Fs dFsxXSk7CisJfQorCisJaWYgKHJvdW5kc19jdXN0b20gPiAwKQorCXsKKwkJYXBwZW5kU3RyaW5n SW5mbyhvdXRfYnVmLCAicm91bmRzPSVsdSQiLCByb3VuZHMpOworCX0KKworCS8qCisJICogV2Ug bmVlZCB0aGUgcmVhbCBsZW5ndGggb2YgdGhlIGRlY29kZWQgc2FsdCBzdHJpbmcsIHRoaXMgaXMg ZXZlcnkKKwkgKiBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBsYXN0ICckJyBpbiB0aGUgcHJlYW1ibGUu IEFwcGVuZCBldmVyeSBjaGFyYWN0ZXIKKwkgKiB1cCB0byBQWF9TSEFDUllQVF9TQUxUX0xFTl9N QVggdG8gdGhlIHJlc3VsdCBidWZmZXIuCisJICovCisJZm9yIChlcCA9IGRlY19zYWx0X2JpbmFy eTsKKwkJICplcCAmJiAqZXAgIT0gJyQnICYmIGVwIDwgKGRlY19zYWx0X2JpbmFyeSArIFBYX1NI QUNSWVBUX1NBTFRfTEVOX01BWCk7CisJCSBlcCsrKQorCQlhcHBlbmRTdHJpbmdJbmZvQ2hhck1h Y3JvKG91dF9idWYsICplcCk7CisJc2FsdF9sZW4gPSBlcCAtIGRlY19zYWx0X2JpbmFyeTsKKwor CWVsb2coREVCVUcxLCAidXNpbmcgc2FsdCBsZW4gPSAlZCIsIHNhbHRfbGVuKTsKKworCS8qCisJ ICogU2FuaXR5IGNoZWNrOgorCSAqCisJICogQXQgdGhpcyBwb2ludCB0aGUgc2FsdCBzdHJpbmcg YnVmZmVyIG11c3Qgbm90IGV4Y2VlZCBleHBlY3RlZCBzaXplCisJICovCisJaWYgKG91dF9idWYt PmxlbiA+ICgzICsgMTcgKiByb3VuZHNfY3VzdG9tICsgc2FsdF9sZW4pKQorCXsKKwkJZWxvZyhF UlJPUiwgInVuZXhwZWN0ZWQgbGVuZ3RoIG9mIHNhbHQgc3RyaW5nIik7CisJfQorCisJLyotCisJ ICogMS4gU3RhcnQgZGlnZXN0IEEKKwkgKiAyLiBBZGQgdGhlIHBhc3N3b3JkIHN0cmluZyB0byBk aWdlc3QgQQorCSAqIDMuIEFkZCB0aGUgc2FsdCB0byBkaWdlc3QgQQorCSAqLworCXB4X21kX3Vw ZGF0ZShkaWdlc3RBLCAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBwdywgbGVuKTsKKwlweF9tZF91 cGRhdGUoZGlnZXN0QSwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgZGVjX3NhbHRfYmluYXJ5LCBz YWx0X2xlbik7CisKKwkvKi0KKwkgKiA0LiBDcmVhdGUgZGlnZXN0IEIKKwkgKiA1LiBBZGQgcGFz c3dvcmQgdG8gZGlnZXN0IEIKKwkgKiA2LiBBZGQgdGhlIHNhbHQgc3RyaW5nIHRvIGRpZ2VzdCBC CisJICogNy4gQWRkIHRoZSBwYXNzd29yZCBhZ2FpbiB0byBkaWdlc3QgQgorCSAqIDguIEZpbmFs aXplIGRpZ2VzdCBCCisJICovCisJcHhfbWRfdXBkYXRlKGRpZ2VzdEIsIChjb25zdCB1bnNpZ25l ZCBjaGFyICopIHB3LCBsZW4pOworCXB4X21kX3VwZGF0ZShkaWdlc3RCLCAoY29uc3QgdW5zaWdu ZWQgY2hhciAqKSBkZWNfc2FsdF9iaW5hcnksIHNhbHRfbGVuKTsKKwlweF9tZF91cGRhdGUoZGln ZXN0QiwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcHcsIGxlbik7CisJcHhfbWRfZmluaXNoKGRp Z2VzdEIsIHNoYV9idWYpOworCisJLyotCisJICogOS4gRm9yIGVhY2ggYmxvY2sgb2YgKGV4Y2x1 ZGluZyB0aGUgTlVMTCBieXRlKSwgYWRkCisJICogICAgZGlnZXN0IEIgdG8gZGlnZXN0IEEuCisJ ICovCisJZm9yIChibG9jayA9IGxlbjsgYmxvY2sgPiBidWZfc2l6ZTsgYmxvY2sgLT0gYnVmX3Np emUpCisJeworCQlweF9tZF91cGRhdGUoZGlnZXN0QSwgc2hhX2J1ZiwgYnVmX3NpemUpOworCX0K KworCS8qLQorCSAqIDEwIEZvciB0aGUgcmVtYWluaW5nIE4gYnl0ZXMgb2YgdGhlIHBhc3N3b3Jk IHN0cmluZywgYWRkCisJICogdGhlIGZpcnN0IE4gYnl0ZXMgb2YgZGlnZXN0IEIgdG8gQSAqLwor CXB4X21kX3VwZGF0ZShkaWdlc3RBLCBzaGFfYnVmLCBibG9jayk7CisKKwkvKi0KKwkgKiAxMSBG b3IgZWFjaCBiaXQgb2YgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGVuZ3RoIG9m IHRoZQorCSAqIHBhc3N3b3JkIHN0cmluZyB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBoaWdoZXN0 IDEtZGlnaXQsIHN0YXJ0aW5nCisJICogZnJvbSB0byBsb3dlc3QgYml0IHBvc2l0aW9uIChudW1l cmljIHZhbHVlIDEpCisJICoKKwkgKiBhKSBmb3IgYSAxLWRpZ2l0IGFkZCBkaWdlc3QgQiAoc2hh X2J1ZikgdG8gZGlnZXN0IEEKKwkgKiBiKSBmb3IgYSAwLWRpZ2l0IGFkZCB0aGUgcGFzc3dvcmQg c3RyaW5nCisJICovCisKKwlibG9jayA9IGxlbjsKKwl3aGlsZSAoYmxvY2spCisJeworCQlweF9t ZF91cGRhdGUoZGlnZXN0QSwKKwkJCQkJIChibG9jayAmIDEpID8gc2hhX2J1ZiA6IChjb25zdCB1 bnNpZ25lZCBjaGFyICopIHB3LAorCQkJCQkgKGJsb2NrICYgMSkgPyBidWZfc2l6ZSA6IGxlbik7 CisKKwkJLyogcmlnaHQgc2hpZnQgdG8gbmV4dCBieXRlICovCisJCWJsb2NrID4+PSAxOworCX0K KworCS8qIDEyIEZpbmFsaXplIGRpZ2VzdCBBICovCisJcHhfbWRfZmluaXNoKGRpZ2VzdEEsIHNo YV9idWYpOworCisJLyogMTMgU3RhcnQgZGlnZXN0IERQICovCisJcHhfbWRfcmVzZXQoZGlnZXN0 Qik7CisKKwkvKi0KKwkgKiAxNCBBZGQgZXZlcnkgYnl0ZSBvZiB0aGUgcGFzc3dvcmQgc3RyaW5n IChleGNsdWRpbmcgdHJhaWxpbmcgTlVMTCkKKwkgKiB0byB0aGUgZGlnZXN0IERQCisJICovCisJ Zm9yIChibG9jayA9IGxlbjsgYmxvY2sgPiAwOyBibG9jay0tKQorCXsKKwkJcHhfbWRfdXBkYXRl KGRpZ2VzdEIsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIHB3LCBsZW4pOworCX0KKworCS8qIDE1 IEZpbmFsaXplIGRpZ2VzdCBEUCAqLworCXB4X21kX2ZpbmlzaChkaWdlc3RCLCBzaGFfYnVmX3Rt cCk7CisKKwkvKi0KKwkgKiAxNiBwcm9kdWNlIGJ5dGUgc2VxdWVuY2UgUCB3aXRoIHNhbWUgbGVu Z3RoIGFzIHBhc3N3b3JkLgorCSAqCisJICogICAgIGEpIGZvciBlYWNoIGJsb2NrIG9mIDMyIG9y IDY0IGJ5dGVzIG9mIGxlbmd0aCBvZiB0aGUgcGFzc3dvcmQKKwkgKiAgICAgICAgc3RyaW5nIHRo ZSBlbnRpcmUgZGlnZXN0IERQIGlzIHVzZWQKKwkgKiAgICAgYikgZm9yIHRoZSByZW1haW5pbmcg TiAodXAgdG8gIDMxIG9yIDYzKSBieXRlcyB1c2UgdGhlCisJICogICAgICAgICBmaXJzdCBOIGJ5 dGVzIG9mIGRpZ2VzdCBEUAorCSAqLworCWlmICgocF9ieXRlcyA9IHBhbGxvYzAobGVuKSkgPT0g TlVMTCkKKwl7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogTiBzdGVwIG9mIDE2LCBjb3B5IG92 ZXIgdGhlIGJ5dGVzIGZyb20gcGFzc3dvcmQgKi8KKwlmb3IgKGNwID0gcF9ieXRlcywgYmxvY2sg PSBsZW47IGJsb2NrID4gYnVmX3NpemU7IGJsb2NrIC09IGJ1Zl9zaXplLCBjcCArPSBidWZfc2l6 ZSkKKwkJbWVtY3B5KGNwLCBzaGFfYnVmX3RtcCwgYnVmX3NpemUpOworCW1lbWNweShjcCwgc2hh X2J1Zl90bXAsIGJsb2NrKTsKKworCS8qCisJICogMTcgU3RhcnQgZGlnZXN0IERTCisJICovCisJ cHhfbWRfcmVzZXQoZGlnZXN0Qik7CisKKwkvKi0KKwkgKiAxOCBSZXBlYXQgdGhlIGZvbGxvd2lu ZyAxNitBWzBdIHRpbWVzLCB3aGVyZSBBWzBdIHJlcHJlc2VudHMgdGhlIGZpcnN0CisJICogICAg Ynl0ZSBpbiBkaWdlc3QgQSBpbnRlcnByZXRlZCBhcyBhbiA4LWJpdCB1bnNpZ25lZCB2YWx1ZQor CSAqICAgIGFkZCB0aGUgc2FsdCB0byBkaWdlc3QgRFMKKwkgKi8KKwlmb3IgKGJsb2NrID0gMTYg KyBzaGFfYnVmWzBdOyBibG9jayA+IDA7IGJsb2NrLS0pCisJeworCQlweF9tZF91cGRhdGUoZGln ZXN0QiwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgZGVjX3NhbHRfYmluYXJ5LCBzYWx0X2xlbik7 CisJfQorCisJLyoKKwkgKiAxOSBGaW5hbGl6ZSBkaWdlc3QgRFMKKwkgKi8KKwlweF9tZF9maW5p c2goZGlnZXN0Qiwgc2hhX2J1Zl90bXApOworCisJLyotCisJICogMjAgUHJvZHVjZSBieXRlIHNl cXVlbmNlIFMgb2YgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzYWx0IHN0cmluZyB3aGVyZQorCSAq CisJICogYSkgZm9yIGVhY2ggYmxvY2sgb2YgMzIgb3IgNjQgYnl0ZXMgb2YgbGVuZ3RoIG9mIHRo ZSBzYWx0IHN0cmluZyB0aGUKKwkgKiAgICAgZW50aXJlIGRpZ2VzdCBEUyBpcyB1c2VkCisJICoK KwkgKiBiKSBmb3IgdGhlIHJlbWFpbmluZyBOICh1cCB0byAgMzEgb3IgNjMpIGJ5dGVzIHVzZSB0 aGUgZmlyc3QgTgorCSAqICAgIGJ5dGVzIG9mIGRpZ2VzdCBEUworCSAqLworCWlmICgoc19ieXRl cyA9IHBhbGxvYzAoc2FsdF9sZW4pKSA9PSBOVUxMKQorCQlnb3RvIGVycm9yOworCisJZm9yIChj cCA9IHNfYnl0ZXMsIGJsb2NrID0gc2FsdF9sZW47IGJsb2NrID4gYnVmX3NpemU7IGJsb2NrIC09 IGJ1Zl9zaXplLCBjcCArPSBidWZfc2l6ZSkKKwl7CisJCW1lbWNweShjcCwgc2hhX2J1Zl90bXAs IGJ1Zl9zaXplKTsKKwl9CisJbWVtY3B5KGNwLCBzaGFfYnVmX3RtcCwgYmxvY2spOworCisJLyog TWFrZSBzdXJlIHdlIGRvbid0IGxlYXZlIHNvbWV0aGluZyBpbXBvcnRhbnQgYmVoaW5kICovCisJ cHhfbWVtc2V0KCZzaGFfYnVmX3RtcCwgMCwgc2l6ZW9mIHNoYV9idWYpOworCisJLyotCisJICog MjEgUmVwZWF0IGEgbG9vcCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBzcGVjaWZpZWQgaW4gdGhl IHJvdW5kcz08Tj4KKwkgKiAgICBzcGVjaWZpY2F0aW9uIGluIHRoZSBzYWx0IChvciB0aGUgZGVm YXVsdCB2YWx1ZSBpZiBub25lIGlzCisJICogICAgcHJlc2VudCkuICBFYWNoIHJvdW5kIGlzIG51 bWJlcmVkLCBzdGFydGluZyB3aXRoIDAgYW5kIHVwIHRvIE4tMS4KKwkgKgorCSAqICAgIFRoZSBs b29wIHVzZXMgYSBkaWdlc3QgYXMgaW5wdXQuICBJbiB0aGUgZmlyc3Qgcm91bmQgaXQgaXMgdGhl CisJICogICAgZGlnZXN0IHByb2R1Y2VkIGluIHN0ZXAgMTIuICBJbiB0aGUgbGF0dGVyIHN0ZXBz IGl0IGlzIHRoZSBkaWdlc3QKKwkgKiAgICBwcm9kdWNlZCBpbiBzdGVwIDIxLmggb2YgdGhlIHBy ZXZpb3VzIHJvdW5kLiAgVGhlIGZvbGxvd2luZyB0ZXh0CisJICogICAgdXNlcyB0aGUgbm90YXRp b24gImRpZ2VzdCBBL0IiIHRvIGRlc2NyaWJlIHRoaXMgYmVoYXZpb3IuCisJICovCisJZm9yIChi bG9jayA9IDA7IGJsb2NrIDwgcm91bmRzOyBibG9jaysrKQorCXsKKworCQkvKgorCQkgKiBNYWtl IGl0IHBvc3NpYmxlIHRvIGFib3J0IGluIGNhc2UgbGFyZ2UgdmFsdWVzIGZvciAicm91bmRzIiBh cmUKKwkJICogc3BlY2lmaWVkLgorCQkgKi8KKwkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKKwor CQkvKiBhKSBzdGFydCBkaWdlc3QgQiAqLworCQlweF9tZF9yZXNldChkaWdlc3RCKTsKKworCQkv KgorCQkgKiBiKSBmb3Igb2RkIHJvdW5kIG51bWJlcnMgYWRkIHRoZSBieXRlIHNlcXVlbnNlIFAg dG8gZGlnZXN0IEIgYykgZm9yCisJCSAqIGV2ZW4gcm91bmQgbnVtYmVycyBhZGQgZGlnZXN0IEEv QgorCQkgKi8KKwkJcHhfbWRfdXBkYXRlKGRpZ2VzdEIsCisJCQkJCSAoYmxvY2sgJiAxKSA/IChj b25zdCB1bnNpZ25lZCBjaGFyICopIHBfYnl0ZXMgOiBzaGFfYnVmLAorCQkJCQkgKGJsb2NrICYg MSkgPyBsZW4gOiBidWZfc2l6ZSk7CisKKwkJLyogZCkgZm9yIGFsbCByb3VuZCBudW1iZXJzIG5v dCBkaXZpc2libGUgYnkgMyBhZGQgdGhlIGJ5dGUgc2VxdWVuY2UgUyAqLworCQlpZiAoYmxvY2sg JSAzKQorCQl7CisJCQlweF9tZF91cGRhdGUoZGlnZXN0QiwgKGNvbnN0IHVuc2lnbmVkIGNoYXIg Kikgc19ieXRlcywgc2FsdF9sZW4pOworCQl9CisKKwkJLyogZSkgZm9yIGFsbCByb3VuZCBudW1i ZXJzIG5vdCBkaXZpc2libGUgYnkgNyBhZGQgdGhlIGJ5dGUgc2VxdWVuY2UgUCAqLworCQlpZiAo YmxvY2sgJSA3KQorCQl7CisJCQlweF9tZF91cGRhdGUoZGlnZXN0QiwgKGNvbnN0IHVuc2lnbmVk IGNoYXIgKikgcF9ieXRlcywgbGVuKTsKKwkJfQorCisJCS8qCisJCSAqIGYpIGZvciBvZGQgcm91 bmQgbnVtYmVycyBhZGQgZGlnZXN0IEEvQyBnKSBmb3IgZXZlbiByb3VuZCBudW1iZXJzCisJCSAq IGFkZCB0aGUgYnl0ZSBzZXF1ZW5jZSBQCisJCSAqLworCQlweF9tZF91cGRhdGUoZGlnZXN0QiwK KwkJCQkJIChibG9jayAmIDEpID8gc2hhX2J1ZiA6IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHBf Ynl0ZXMsCisJCQkJCSAoYmxvY2sgJiAxKSA/IGJ1Zl9zaXplIDogbGVuKTsKKworCQkvKiBoKSBm aW5pc2ggZGlnZXN0IEMuICovCisJCXB4X21kX2ZpbmlzaChkaWdlc3RCLCBzaGFfYnVmKTsKKwor CX0KKworCXB4X21kX2ZyZWUoZGlnZXN0QSk7CisJcHhfbWRfZnJlZShkaWdlc3RCKTsKKworCWRp Z2VzdEEgPSBOVUxMOworCWRpZ2VzdEIgPSBOVUxMOworCisJcGZyZWUoc19ieXRlcyk7CisJcGZy ZWUocF9ieXRlcyk7CisKKwlzX2J5dGVzID0gTlVMTDsKKwlwX2J5dGVzID0gTlVMTDsKKworCS8q IHByZXBhcmUgZmluYWwgcmVzdWx0IGJ1ZmZlciAqLworCWFwcGVuZFN0cmluZ0luZm9DaGFyTWFj cm8ob3V0X2J1ZiwgJyQnKTsKKworI2RlZmluZSBiNjRfZnJvbV8yNGJpdChCMiwgQjEsIEIwLCBO KSAgICAgICAgICAgICAgICAgICAgICBcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXVuc2lnbmVkIGludCB3ID0gKChCMikgPDwg MTYpIHwgKChCMSkgPDwgOCkgfCAoQjApOyBcCisJCWludCBpID0gKE4pOyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXdoaWxlIChpLS0gPiAwKSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhck1hY3Jv KG91dF9idWYsIF9jcnlwdF9pdG9hNjRbdyAmIDB4M2ZdKTsgXAorCQkJdyA+Pj0gNjsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl9ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gd2hpbGUgKDApCisKKwlzd2l0 Y2ggKHR5cGUpCisJeworCQljYXNlIFBHQ1JZUFRPX1NIQTI1NkNSWVBUOgorCQkJeworCQkJCWI2 NF9mcm9tXzI0Yml0KHNoYV9idWZbMF0sIHNoYV9idWZbMTBdLCBzaGFfYnVmWzIwXSwgNCk7CisJ CQkJYjY0X2Zyb21fMjRiaXQoc2hhX2J1ZlsyMV0sIHNoYV9idWZbMV0sIHNoYV9idWZbMTFdLCA0 KTsKKwkJCQliNjRfZnJvbV8yNGJpdChzaGFfYnVmWzEyXSwgc2hhX2J1ZlsyMl0sIHNoYV9idWZb Ml0sIDQpOworCQkJCWI2NF9mcm9tXzI0Yml0KHNoYV9idWZbM10sIHNoYV9idWZbMTNdLCBzaGFf YnVmWzIzXSwgNCk7CisJCQkJYjY0X2Zyb21fMjRiaXQoc2hhX2J1ZlsyNF0sIHNoYV9idWZbNF0s IHNoYV9idWZbMTRdLCA0KTsKKwkJCQliNjRfZnJvbV8yNGJpdChzaGFfYnVmWzE1XSwgc2hhX2J1 ZlsyNV0sIHNoYV9idWZbNV0sIDQpOworCQkJCWI2NF9mcm9tXzI0Yml0KHNoYV9idWZbNl0sIHNo YV9idWZbMTZdLCBzaGFfYnVmWzI2XSwgNCk7CisJCQkJYjY0X2Zyb21fMjRiaXQoc2hhX2J1Zlsy N10sIHNoYV9idWZbN10sIHNoYV9idWZbMTddLCA0KTsKKwkJCQliNjRfZnJvbV8yNGJpdChzaGFf YnVmWzE4XSwgc2hhX2J1ZlsyOF0sIHNoYV9idWZbOF0sIDQpOworCQkJCWI2NF9mcm9tXzI0Yml0 KHNoYV9idWZbOV0sIHNoYV9idWZbMTldLCBzaGFfYnVmWzI5XSwgNCk7CisJCQkJYjY0X2Zyb21f MjRiaXQoMCwgc2hhX2J1ZlszMV0sIHNoYV9idWZbMzBdLCAzKTsKKworCQkJCWJyZWFrOworCQkJ fQorCisJCWNhc2UgUEdDUllQVE9fU0hBNTEyQ1JZUFQ6CisJCQl7CisJCQkJYjY0X2Zyb21fMjRi aXQoc2hhX2J1ZlswXSwgc2hhX2J1ZlsyMV0sIHNoYV9idWZbNDJdLCA0KTsKKwkJCQliNjRfZnJv bV8yNGJpdChzaGFfYnVmWzIyXSwgc2hhX2J1Zls0M10sIHNoYV9idWZbMV0sIDQpOworCQkJCWI2 NF9mcm9tXzI0Yml0KHNoYV9idWZbNDRdLCBzaGFfYnVmWzJdLCBzaGFfYnVmWzIzXSwgNCk7CisJ CQkJYjY0X2Zyb21fMjRiaXQoc2hhX2J1ZlszXSwgc2hhX2J1ZlsyNF0sIHNoYV9idWZbNDVdLCA0 KTsKKwkJCQliNjRfZnJvbV8yNGJpdChzaGFfYnVmWzI1XSwgc2hhX2J1Zls0Nl0sIHNoYV9idWZb NF0sIDQpOworCQkJCWI2NF9mcm9tXzI0Yml0KHNoYV9idWZbNDddLCBzaGFfYnVmWzVdLCBzaGFf YnVmWzI2XSwgNCk7CisJCQkJYjY0X2Zyb21fMjRiaXQoc2hhX2J1Zls2XSwgc2hhX2J1ZlsyN10s IHNoYV9idWZbNDhdLCA0KTsKKwkJCQliNjRfZnJvbV8yNGJpdChzaGFfYnVmWzI4XSwgc2hhX2J1 Zls0OV0sIHNoYV9idWZbN10sIDQpOworCQkJCWI2NF9mcm9tXzI0Yml0KHNoYV9idWZbNTBdLCBz aGFfYnVmWzhdLCBzaGFfYnVmWzI5XSwgNCk7CisJCQkJYjY0X2Zyb21fMjRiaXQoc2hhX2J1Zls5 XSwgc2hhX2J1ZlszMF0sIHNoYV9idWZbNTFdLCA0KTsKKwkJCQliNjRfZnJvbV8yNGJpdChzaGFf YnVmWzMxXSwgc2hhX2J1Zls1Ml0sIHNoYV9idWZbMTBdLCA0KTsKKwkJCQliNjRfZnJvbV8yNGJp dChzaGFfYnVmWzUzXSwgc2hhX2J1ZlsxMV0sIHNoYV9idWZbMzJdLCA0KTsKKwkJCQliNjRfZnJv bV8yNGJpdChzaGFfYnVmWzEyXSwgc2hhX2J1ZlszM10sIHNoYV9idWZbNTRdLCA0KTsKKwkJCQli NjRfZnJvbV8yNGJpdChzaGFfYnVmWzM0XSwgc2hhX2J1Zls1NV0sIHNoYV9idWZbMTNdLCA0KTsK KwkJCQliNjRfZnJvbV8yNGJpdChzaGFfYnVmWzU2XSwgc2hhX2J1ZlsxNF0sIHNoYV9idWZbMzVd LCA0KTsKKwkJCQliNjRfZnJvbV8yNGJpdChzaGFfYnVmWzE1XSwgc2hhX2J1ZlszNl0sIHNoYV9i dWZbNTddLCA0KTsKKwkJCQliNjRfZnJvbV8yNGJpdChzaGFfYnVmWzM3XSwgc2hhX2J1Zls1OF0s IHNoYV9idWZbMTZdLCA0KTsKKwkJCQliNjRfZnJvbV8yNGJpdChzaGFfYnVmWzU5XSwgc2hhX2J1 ZlsxN10sIHNoYV9idWZbMzhdLCA0KTsKKwkJCQliNjRfZnJvbV8yNGJpdChzaGFfYnVmWzE4XSwg c2hhX2J1ZlszOV0sIHNoYV9idWZbNjBdLCA0KTsKKwkJCQliNjRfZnJvbV8yNGJpdChzaGFfYnVm WzQwXSwgc2hhX2J1Zls2MV0sIHNoYV9idWZbMTldLCA0KTsKKwkJCQliNjRfZnJvbV8yNGJpdChz aGFfYnVmWzYyXSwgc2hhX2J1ZlsyMF0sIHNoYV9idWZbNDFdLCA0KTsKKwkJCQliNjRfZnJvbV8y NGJpdCgwLCAwLCBzaGFfYnVmWzYzXSwgMik7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQljYXNl IFBHQ1JZUFRPX1NIQV9VTktPV046CisJCQkvKiB3ZSBzaG91bGRuJ3QgbGFuZCBoZXJlIC4uLiAq LworCQkJZWxvZyhFUlJPUiwgInVuc3VwcG9ydGVkIGRpZ2VzdCBsZW5ndGgiKTsKKworCX0KKwor CSpjcCA9ICdcMCc7CisKKwkvKgorCSAqIENvcHkgb3ZlciByZXN1bHQgdG8gc3BlY2lmaWVkIGJ1 ZmZlci4KKwkgKgorCSAqIFRoZSBwYXNzd2QgY2hhcmFjdGVyIGJ1ZmZlciBzaG91bGQgaGF2ZSBh dCBsZWFzdCBQWF9TSEFDUllQVF9CVUZfTEVOCisJICogYWxsb2NhdGVkLCBzaW5jZSB3ZSBjaGVj a2VkIGFib3ZlIGlmIGRzdGxlbiBpcyBzbWFsbGVyIHRoYW4KKwkgKiBQWF9TSEFDUllQVF9CVUZf TEVOICh3aGljaCBhbHNvIGluY2x1ZGVzIHRoZSBOVUxMIGJ5dGUpLgorCSAqCisJICogSW4gdGhh dCBjYXNlIHdlIHdvdWxkIGhhdmUgZmFpbGVkIGFib3ZlIGFscmVhZHkuCisJICovCisJbWVtY3B5 KHBhc3N3ZCwgb3V0X2J1Zi0+ZGF0YSwgb3V0X2J1Zi0+bGVuKTsKKworCS8qIG1ha2Ugc3VyZSBu b3RoaW5nIGltcG9ydGFudCBpcyBsZWZ0IGJlaGluZCAqLworCXB4X21lbXNldCgmc2hhX2J1Ziwg MCwgc2l6ZW9mIHNoYV9idWYpOworCWRlc3Ryb3lTdHJpbmdJbmZvKG91dF9idWYpOworCisJLyog Li4uYW5kIHdlJ3JlIGRvbmUgKi8KKwlyZXR1cm4gcGFzc3dkOworCitlcnJvcjoKKwlpZiAoZGln ZXN0QSAhPSBOVUxMKQorCQlweF9tZF9mcmVlKGRpZ2VzdEEpOworCisJaWYgKGRpZ2VzdEIgIT0g TlVMTCkKKwkJcHhfbWRfZnJlZShkaWdlc3RCKTsKKworCWlmIChvdXRfYnVmICE9IE5VTEwpCisJ CWRlc3Ryb3lTdHJpbmdJbmZvKG91dF9idWYpOworCisJZXJlcG9ydChFUlJPUiwKKwkJCShlcnJj b2RlKEVSUkNPREVfSU5URVJOQUxfRVJST1IpLAorCQkJIGVycm1zZygiY2Fubm90IGNyZWF0ZSBl bmNyeXB0ZWQgcGFzc3dvcmQiKSkpOworCXJldHVybiBOVUxMOwkJCQkvKiBrZWVwIGNvbXBpbGVy IHF1aWV0ICovCit9CmRpZmYgLS1naXQgYS9jb250cmliL3BnY3J5cHRvL2V4cGVjdGVkL2NyeXB0 LXNoYWNyeXB0Lm91dCBiL2NvbnRyaWIvcGdjcnlwdG8vZXhwZWN0ZWQvY3J5cHQtc2hhY3J5cHQu b3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5mM2I3NmQ1ZTkxMwot LS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvcGdjcnlwdG8vZXhwZWN0ZWQvY3J5cHQtc2hhY3J5 cHQub3V0CkBAIC0wLDAgKzEsMTk2IEBACistLQorLS0gY3J5cHQoKSBhbmQgZ2Vuc2FsdDogc2hh MjU2Y3J5cHQsIHNoYTUxMmNyeXB0CistLQorLS0gJDUkIGlzIHNoYTI1NmNyeXB0CitTRUxFQ1Qg Y3J5cHQoJycsICckNSRTenp6MHl6eicpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjcnlw dCAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAkNSRTenp6MHl6eiRjQS5aRlpLcWJsUllq ZHNicld0VlRZYS9xU3dQUW50MnVoMExCdHlZQUFECisoMSByb3cpCisKK1NFTEVDVCBjcnlwdCgn Zm9veCcsICckNSRTenp6MHl6eicpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjcnlwdCAg ICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAkNSRTenp6MHl6eiQ3aEkwclVXa08yUWRCa3ph bWgudlAuTUlQbGJaaXdTdnUyc21oU2k2MDY0CisoMSByb3cpCisKK0NSRUFURSBUQUJMRSBjdGVz dCAoZGF0YSB0ZXh0LCByZXMgdGV4dCwgc2FsdCB0ZXh0KTsKK0lOU0VSVCBJTlRPIGN0ZXN0IFZB TFVFUyAoJ3Bhc3N3b3JkJywgJycsICcnKTsKKy0tIGdlbmVyYXRlIGEgc2FsdCBmb3Igc2hhMjU2 Y3J5cHQsIGRlZmF1bHQgcm91bmRzCitVUERBVEUgY3Rlc3QgU0VUIHNhbHQgPSBnZW5fc2FsdCgn c2hhMjU2Y3J5cHQnKTsKK1VQREFURSBjdGVzdCBTRVQgcmVzID0gY3J5cHQoZGF0YSwgc2FsdCk7 CitTRUxFQ1QgcmVzID0gY3J5cHQoZGF0YSwgcmVzKSBBUyAid29ya2VkIgorRlJPTSBjdGVzdDsK KyB3b3JrZWQgCistLS0tLS0tLQorIHQKKygxIHJvdykKKworLS0gZ2VuZXJhdGUgYSBzYWx0IGZv ciBzaGEyNTZjcnlwdCwgcm91bmRzIDk5OTkKK1VQREFURSBjdGVzdCBTRVQgc2FsdCA9IGdlbl9z YWx0KCdzaGEyNTZjcnlwdCcsIDk5OTkpOworVVBEQVRFIGN0ZXN0IFNFVCByZXMgPSBjcnlwdChk YXRhLCBzYWx0KTsKK1NFTEVDVCByZXMgPSBjcnlwdChkYXRhLCByZXMpIEFTICJ3b3JrZWQiCitG Uk9NIGN0ZXN0OworIHdvcmtlZCAKKy0tLS0tLS0tCisgdAorKDEgcm93KQorCistLSBzaG91bGQg ZmFpbCwgYmVsb3cgc3VwcG9ydGVkIG1pbmltdW0gcm91bmRzIHZhbHVlCitVUERBVEUgY3Rlc3Qg U0VUIHNhbHQgPSBnZW5fc2FsdCgnc2hhMjU2Y3J5cHQnLCAxMCk7CitFUlJPUjogIGdlbl9zYWx0 OiBJbmNvcnJlY3QgbnVtYmVyIG9mIHJvdW5kcworLS0gc2hvdWxkIGZhaWwsIGV4Y2VlZHMgc3Vw cG9ydGVkIG1heGltdW0gcm91bmRzIHZhbHVlCitVUERBVEUgY3Rlc3QgU0VUIHNhbHQgPSBnZW5f c2FsdCgnc2hhMjU2Y3J5cHQnLCAxMDAwMDAwMDAwKTsKK0VSUk9SOiAgZ2VuX3NhbHQ6IEluY29y cmVjdCBudW1iZXIgb2Ygcm91bmRzCitUUlVOQ0FURSBjdGVzdDsKKy0tICQ2JCBpcyBzaGE1MTJj cnlwdAorU0VMRUNUIGNyeXB0KCcnLCAnJDYkU3p6ejB5enonKTsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHQgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyAkNiRTenp6MHl6eiRFR2ouSkxBb3ZGeUF0Q0p4M1lEMURYRDF5VFhv TzlndjRxZ0x5SEJzSkoxbGtwbkxCOFpQSGVrbTFxWGpKQ09CYy84dGhDdUhweE5OOFk1eHpSWVU1 LgorKDEgcm93KQorCitTRUxFQ1QgY3J5cHQoJ2Zvb3gnLCAnJDYkU3p6ejB5enonKTsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAkNiRTenp6MHl6eiRLcUR3MVk4a3plLlZGYXBr dlRjOVk1ZmJxemx0amVSejFhUEdDL3BrSFJoRlFaMmFNNlBtWnBYUWpjRDdBT0g4OEJxMENTRC5W bG15bVF6Y0JNRVVsMAorKDEgcm93KQorCitJTlNFUlQgSU5UTyBjdGVzdCBWQUxVRVMgKCdwYXNz d29yZCcsICcnLCAnJyk7CistLSBnZW5lcmF0ZSBhIHNhbHQgZm9yIHNoYTUxMmNyeXB0LCBkZWZh dWx0IHJvdW5kcworVVBEQVRFIGN0ZXN0IFNFVCBzYWx0ID0gZ2VuX3NhbHQoJ3NoYTUxMmNyeXB0 Jyk7CitVUERBVEUgY3Rlc3QgU0VUIHJlcyA9IGNyeXB0KGRhdGEsIHNhbHQpOworU0VMRUNUIHJl cyA9IGNyeXB0KGRhdGEsIHJlcykgQVMgIndvcmtlZCIKK0ZST00gY3Rlc3Q7Cisgd29ya2VkIAor LS0tLS0tLS0KKyB0CisoMSByb3cpCisKKy0tIGdlbmVyYXRlIGEgc2FsdCBmb3Igc2hhNTEyY3J5 cHQsIHJvdW5kcyA5OTk5CitVUERBVEUgY3Rlc3QgU0VUIHNhbHQgPSBnZW5fc2FsdCgnc2hhNTEy Y3J5cHQnLCA5OTk5KTsKK1VQREFURSBjdGVzdCBTRVQgcmVzID0gY3J5cHQoZGF0YSwgc2FsdCk7 CitTRUxFQ1QgcmVzID0gY3J5cHQoZGF0YSwgcmVzKSBBUyAid29ya2VkIgorRlJPTSBjdGVzdDsK KyB3b3JrZWQgCistLS0tLS0tLQorIHQKKygxIHJvdykKKworLS0gc2hvdWxkIGZhaWwsIGJlbG93 IHN1cHBvcnRlZCBtaW5pbXVtIHJvdW5kcyB2YWx1ZQorVVBEQVRFIGN0ZXN0IFNFVCBzYWx0ID0g Z2VuX3NhbHQoJ3NoYTUxMmNyeXB0JywgMTApOworRVJST1I6ICBnZW5fc2FsdDogSW5jb3JyZWN0 IG51bWJlciBvZiByb3VuZHMKKy0tIHNob3VsZCBmYWlsLCBleGNlZWRzIHN1cHBvcnRlZCBtYXhp bXVtIHJvdW5kcyB2YWx1ZQorVVBEQVRFIGN0ZXN0IFNFVCBzYWx0ID0gZ2VuX3NhbHQoJ3NoYTUx MmNyeXB0JywgMTAwMDAwMDAwMCk7CitFUlJPUjogIGdlbl9zYWx0OiBJbmNvcnJlY3QgbnVtYmVy IG9mIHJvdW5kcworLS0gRXh0ZW5kZWQgdGVzdHMgdGFrZW4gZnJvbSBwdWJsaWMgZG9tYWluIGNv ZGUgYXQKKy0tIGh0dHBzOi8vd3d3LmFra2FkaWEub3JnL2RyZXBwZXIvU0hBLWNyeXB0LnR4dAor LS0KKy0tIFdlIGFkYXB0IHRoZSB0ZXN0cyBkZWZpbmVkIHRoZXJlIHRvIG1ha2Ugc3VyZSB3ZSBh cmUgY29tcGF0aWJsZSB3aXRoIHRoZSByZWZlcmVuY2UKKy0tIGltcGxlbWVudGF0aW9uLgorLS0g VGhpcyB0ZXN0cyBzaGEyNTZjcnlwdCAobWFnaWMgYnl0ZSAkNSQgd2l0aCBzYWx0IGFuZCByb3Vu ZHMpCitTRUxFQ1QgY3J5cHQoJ0hlbGxvIHdvcmxkIScsICckNSRzYWx0c3RyaW5nJykKKyAgICAg ICAgICAgPSAnJDUkc2FsdHN0cmluZyQ1Qjh2WVlpWS5DVnQxUmxUVGY4S2JYQkgzaHN4WS9HTm9v WmFCQkdXRWM1JyBBUyByZXN1bHQ7CisgcmVzdWx0IAorLS0tLS0tLS0KKyB0CisoMSByb3cpCisK K1NFTEVDVCBjcnlwdCgnSGVsbG8gd29ybGQhJywgJyQ1JHJvdW5kcz0xMDAwMCRzYWx0c3RyaW5n c2FsdHN0cmluZycpCisgICAgICAgICAgID0gJyQ1JHJvdW5kcz0xMDAwMCRzYWx0c3RyaW5nc2Fs dHN0JDN4di5WYlNIQmI0MUFMOUF2TGV1alprWlJCQXdxRk16Mi5vcHFleTZJY0EnIEFTIHJlc3Vs dDsKKyByZXN1bHQgCistLS0tLS0tLQorIHQKKygxIHJvdykKKworU0VMRUNUIGNyeXB0KCdUaGlz IGlzIGp1c3QgYSB0ZXN0JywgJyQ1JHJvdW5kcz01MDAwJHRvb2xvbmdzYWx0c3RyaW5nJykKKyAg ICAgICAgICAgPSAnJDUkcm91bmRzPTUwMDAkdG9vbG9uZ3NhbHRzdHJpbiRVbi81anpBSE1nT0da NS5tV0pwdVZvbGlsMDdndUhQdk9XOG1HUmN2eGE1JyBBUyByZXN1bHQ7CisgcmVzdWx0IAorLS0t LS0tLS0KKyB0CisoMSByb3cpCisKKyBTRUxFQ1QgY3J5cHQoJ2EgdmVyeSBtdWNoIGxvbmdlciB0 ZXh0IHRvIGVuY3J5cHQuICBUaGlzIG9uZSBldmVuIHN0cmV0Y2hlcyBvdmVyIG1vcmUnCisgICAg ICd0aGFuIG9uZSBsaW5lLicsICckNSRyb3VuZHM9MTQwMCRhbm90aGVybG9uZ3NhbHRzdHJpbmcn KQorICAgICAgICAgICAgPSAnJDUkcm91bmRzPTE0MDAkYW5vdGhlcmxvbmdzYWx0cyRSeC5qOEgu aDhIakVER29tRlU4YkRrWG0zWElVbnp5eGYxMm9QODRCbnExJyBBUyByZXN1bHQ7CisgcmVzdWx0 IAorLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBjcnlwdCgnd2UgaGF2ZSBhIHNob3J0 IHNhbHQgc3RyaW5nIGJ1dCBub3QgYSBzaG9ydCBwYXNzd29yZCcsICckNSRyb3VuZHM9Nzc3Nzck c2hvcnQnKQorICAgICAgICAgICA9ICckNSRyb3VuZHM9Nzc3Nzckc2hvcnQkSmlPMU8zWnBEQXhH SmVhREl1cUNvRUZ5c0FlMW1aTkpSczNwdzBLUVJkLycgQVMgcmVzdWx0OworIHJlc3VsdCAKKy0t LS0tLS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgY3J5cHQoJ2Egc2hvcnQgc3RyaW5nJywgJyQ1 JHJvdW5kcz0xMjM0NTYkYXNhbHRvZjE2Y2hhcnMuLicpCisgICAgICAgICAgID0gJyQ1JHJvdW5k cz0xMjM0NTYkYXNhbHRvZjE2Y2hhcnMuLiRnUDNWUS82WDdVVUVXM0hrQm4ydzEvUHRxMmp4UHl6 Vi9jWkttRi93SnZEJyBBUyByZXN1bHQ7CisgcmVzdWx0IAorLS0tLS0tLS0KKyB0CisoMSByb3cp CisKK1NFTEVDVCBjcnlwdCgndGhlIG1pbmltdW0gbnVtYmVyIGlzIHN0aWxsIG9ic2VydmVkJywg JyQ1JHJvdW5kcz0xMCRyb3VuZHN0b29sb3cnKQorICAgICAgICAgICA9ICckNSRyb3VuZHM9MTAw MCRyb3VuZHN0b29sb3ckeWZ2d2NXclE4bC9LMERBV3l1UE1ETkhwSVZsVFFlYlk5bC9nTDk3MmJJ QycgQVMgcmVzdWx0OworTk9USUNFOiAgcm91bmRzPTEwIGlzIGJlbG93IHN1cHBvcnRlZCB2YWx1 ZSAoMTAwMCksIHVzaW5nIDEwMDAgaW5zdGVhZAorIHJlc3VsdCAKKy0tLS0tLS0tCisgdAorKDEg cm93KQorCistLSBUaGUgZm9sbG93aW5nIHRlc3RzIHNoYTUxMmNyeXB0IChtYWdpYyBieXRlICQ2 JCB3aXRoIHNhbHQgYW5kIHJvdW5kcykKK1NFTEVDVCBjcnlwdCgnSGVsbG8gd29ybGQhJywgJyQ2 JHNhbHRzdHJpbmcnKQorICAgICAgICAgICA9ICckNiRzYWx0c3RyaW5nJHN2bjhVb1NWYXBOdE11 cTF1a0tTNHRQUWQ4aUt3U01IV2psL084MTdHM3VCbklGTmpuUUp1ZXNJNjh1NE9UTGlCRmRjYllF ZEZDb0VPZmFTMzVpbnoxJyBBUyByZXN1bHQ7CisgcmVzdWx0IAorLS0tLS0tLS0KKyB0CisoMSBy b3cpCisKK1NFTEVDVCBjcnlwdCgnSGVsbG8gd29ybGQhJywgJyQ2JHJvdW5kcz0xMDAwMCRzYWx0 c3RyaW5nc2FsdHN0cmluZycpCisgICAgICAgICAgID0gJyQ2JHJvdW5kcz0xMDAwMCRzYWx0c3Ry aW5nc2FsdHN0JE9XMS9PNkJZSFY2QmNYWnU4UVZlWGJEV3JhM09lcWgwc2JIYmJNQ1ZOU25DTS9V cmptTTBEcDh2T3VaZUhCeS9ZVEJtU0s2SDlxcy95M1JuT2F3NXYuJyBBUyByZXN1bHQ7CisgcmVz dWx0IAorLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBjcnlwdCgnVGhpcyBpcyBqdXN0 IGEgdGVzdCcsICckNiRyb3VuZHM9NTAwMCR0b29sb25nc2FsdHN0cmluZycpCisgICAgICAgICAg ID0gJyQ2JHJvdW5kcz01MDAwJHRvb2xvbmdzYWx0c3RyaW4kbFE4am9saGdWUlZoWTRiNXBaS2F5 c0NMaTBRQnhHb05lS1F6UTNnbE1od2xsRjdvR0RaeFVoeDF5eGRZY3ovZTFKU2JxM3k2Sk14eGw4 YXVka1VFbTAnIEFTIHJlc3VsdDsKKyByZXN1bHQgCistLS0tLS0tLQorIHQKKygxIHJvdykKKwor U0VMRUNUIGNyeXB0KCdhIHZlcnkgbXVjaCBsb25nZXIgdGV4dCB0byBlbmNyeXB0LiAgVGhpcyBv bmUgZXZlbiBzdHJldGNoZXMgb3ZlciBtb3JlJworICAgICAgICAgICAgICAgICAndGhhbiBvbmUg bGluZS4nLCAnJDYkcm91bmRzPTE0MDAkYW5vdGhlcmxvbmdzYWx0c3RyaW5nJykKKyAgICAgICAg ICAgPSAnJDYkcm91bmRzPTE0MDAkYW5vdGhlcmxvbmdzYWx0cyRQT2ZZd1RFb2s5N1ZXY2p4SWlT T2ppeWt0aS5vL3BRcy53UHZNeFE2Rm03STZJb1lOM0NtTHM2Nng5dDBvU3didEVXN283VW1KRWlE d0dxZDhwNHVyMScgQVMgcmVzdWx0OworIHJlc3VsdCAKKy0tLS0tLS0tCisgdAorKDEgcm93KQor CitTRUxFQ1QgY3J5cHQoJ3dlIGhhdmUgYSBzaG9ydCBzYWx0IHN0cmluZyBidXQgbm90IGEgc2hv cnQgcGFzc3dvcmQnLCAnJDYkcm91bmRzPTc3Nzc3JHNob3J0JykKKyAgICAgICAgICAgPSAnJDYk cm91bmRzPTc3Nzc3JHNob3J0JFd1UXlXMllSLmhCTnBqalJocFlEL2lmSXcwNXhkZmVFeVFvTXhJ WGJrdnIwZ2dlMWExeDN5UlVMSjVDQ2FVZU94Rm10bGNHWmVsRmw1Q3h0Z2ZpQWMwJyBBUyByZXN1 bHQ7CisgcmVzdWx0IAorLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCBjcnlwdCgnYSBz aG9ydCBzdHJpbmcnLCAnJDYkcm91bmRzPTEyMzQ1NiRhc2FsdG9mMTZjaGFycy4uJykKKyAgICAg ICAgICAgPSAnJDYkcm91bmRzPTEyMzQ1NiRhc2FsdG9mMTZjaGFycy4uJEJ0Q3dqcU1KR3g1aHJK aFp5d1d2dDBSTEU4dVo0b1B3Y2VsQ2ptdzJrU1l1LkVjNnljVUxldm9CSzI1ZnMyeFhnTU5yQ3pJ TVZjZ0VKQXN0SmVvbmoxJyBBUyByZXN1bHQ7CisgcmVzdWx0IAorLS0tLS0tLS0KKyB0CisoMSBy b3cpCisKK1NFTEVDVCBjcnlwdCgndGhlIG1pbmltdW0gbnVtYmVyIGlzIHN0aWxsIG9ic2VydmVk JywgJyQ2JHJvdW5kcz0xMCRyb3VuZHN0b29sb3cnKQorICAgICAgICAgICA9ICckNiRyb3VuZHM9 MTAwMCRyb3VuZHN0b29sb3cka1VNc2JlMzA2bjIxcDlSLkZSa1czSUduLlM5TlBOMHg1MFloSDF4 aExzUHVXR3NVU2tsWnQ1OGphVGZGNFpFUXB5VU5HYzBkcWJwQllZQmFISHJzWC4nIEFTIHJlc3Vs dDsKK05PVElDRTogIHJvdW5kcz0xMCBpcyBiZWxvdyBzdXBwb3J0ZWQgdmFsdWUgKDEwMDApLCB1 c2luZyAxMDAwIGluc3RlYWQKKyByZXN1bHQgCistLS0tLS0tLQorIHQKKygxIHJvdykKKworLS0g Y2xlYW51cAorRFJPUCBUQUJMRSBjdGVzdDsKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdjcnlwdG8v bWVzb24uYnVpbGQgYi9jb250cmliL3BnY3J5cHRvL21lc29uLmJ1aWxkCmluZGV4IDBiY2JlNGNm ZTVhLi4yZmRiYTA1MTI5MCAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ2NyeXB0by9tZXNvbi5idWls ZAorKysgYi9jb250cmliL3BnY3J5cHRvL21lc29uLmJ1aWxkCkBAIC05LDYgKzksNyBAQCBwZ2Ny eXB0b19zb3VyY2VzID0gZmlsZXMoCiAgICdjcnlwdC1kZXMuYycsCiAgICdjcnlwdC1nZW5zYWx0 LmMnLAogICAnY3J5cHQtbWQ1LmMnLAorICAnY3J5cHQtc2hhLmMnLAogICAnbWJ1Zi5jJywKICAg J3BnY3J5cHRvLmMnLAogICAncGdwLWFybW9yLmMnLApAQCAtNTIsNiArNTMsNyBAQCBwZ2NyeXB0 b19yZWdyZXNzID0gWwogICAncGdwLXB1YmtleS1kZWNyeXB0JywKICAgJ3BncC1wdWJrZXktZW5j cnlwdCcsCiAgICdwZ3AtaW5mbycsCisgICdjcnlwdC1zaGFjcnlwdCcKIF0KIAogcGdjcnlwdG9f b3BlbnNzbF9zb3VyY2VzID0gZmlsZXMoCmRpZmYgLS1naXQgYS9jb250cmliL3BnY3J5cHRvL3B4 LWNyeXB0LmMgYi9jb250cmliL3BnY3J5cHRvL3B4LWNyeXB0LmMKaW5kZXggMDkxM2ZmMmMxYmMu LmZlOTgyZjIzODA1IDEwMDY0NAotLS0gYS9jb250cmliL3BnY3J5cHRvL3B4LWNyeXB0LmMKKysr IGIvY29udHJpYi9wZ2NyeXB0by9weC1jcnlwdC5jCkBAIC02Nyw2ICs2NywxNiBAQCBydW5fY3J5 cHRfYmYoY29uc3QgY2hhciAqcHN3LCBjb25zdCBjaGFyICpzYWx0LAogCXJldHVybiByZXM7CiB9 CiAKK3N0YXRpYyBjaGFyICoKK3J1bl9jcnlwdF9zaGEoY29uc3QgY2hhciAqcHN3LCBjb25zdCBj aGFyICpzYWx0LAorCQkJICBjaGFyICpidWYsIHVuc2lnbmVkIGxlbikKK3sKKwljaGFyICpyZXM7 CisKKwlyZXMgPSBweF9jcnlwdF9zaGFjcnlwdChwc3csIHNhbHQsIGJ1ZiwgbGVuKTsKKwlyZXR1 cm4gcmVzOworfQorCiBzdHJ1Y3QgcHhfY3J5cHRfYWxnbwogewogCWNoYXIJICAgKmlkOwpAQCAt ODEsNiArOTEsOCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHB4X2NyeXB0X2FsZ28KIAl7IiQyeCQi LCA0LCBydW5fY3J5cHRfYmZ9LAogCXsiJDIkIiwgMywgTlVMTH0sCQkJLyogTi9BICovCiAJeyIk MSQiLCAzLCBydW5fY3J5cHRfbWQ1fSwKKwl7IiQ1JCIsIDMsIHJ1bl9jcnlwdF9zaGF9LAorCXsi JDYkIiwgMywgcnVuX2NyeXB0X3NoYX0sCiAJeyJfIiwgMSwgcnVuX2NyeXB0X2Rlc30sCiAJeyIi LCAwLCBydW5fY3J5cHRfZGVzfSwKIAl7TlVMTCwgMCwgTlVMTH0KQEAgLTEyNSw2ICsxMzcsMTAg QEAgc3RhdGljIHN0cnVjdCBnZW5lcmF0b3IgZ2VuX2xpc3RbXSA9IHsKIAl7Im1kNSIsIF9jcnlw dF9nZW5zYWx0X21kNV9ybiwgNiwgMCwgMCwgMH0sCiAJeyJ4ZGVzIiwgX2NyeXB0X2dlbnNhbHRf ZXh0ZW5kZWRfcm4sIDMsIFBYX1hERVNfUk9VTkRTLCAxLCAweEZGRkZGRn0sCiAJeyJiZiIsIF9j cnlwdF9nZW5zYWx0X2Jsb3dmaXNoX3JuLCAxNiwgUFhfQkZfUk9VTkRTLCA0LCAzMX0sCisJeyJz aGEyNTZjcnlwdCIsIF9jcnlwdF9nZW5zYWx0X3NoYTI1Nl9ybiwgUFhfU0hBQ1JZUFRfU0FMVF9M RU5fTUFYLAorCSBQWF9TSEFDUllQVF9ST1VORFNfREVGQVVMVCwgUFhfU0hBQ1JZUFRfUk9VTkRT X01JTiwgUFhfU0hBQ1JZUFRfUk9VTkRTX01BWH0sCisJeyJzaGE1MTJjcnlwdCIsIF9jcnlwdF9n ZW5zYWx0X3NoYTUxMl9ybiwgUFhfU0hBQ1JZUFRfU0FMVF9MRU5fTUFYLAorCSBQWF9TSEFDUllQ VF9ST1VORFNfREVGQVVMVCwgUFhfU0hBQ1JZUFRfUk9VTkRTX01JTiwgUFhfU0hBQ1JZUFRfUk9V TkRTX01BWH0sCiAJe05VTEwsIE5VTEwsIDAsIDAsIDAsIDB9CiB9OwogCmRpZmYgLS1naXQgYS9j b250cmliL3BnY3J5cHRvL3B4LWNyeXB0LmggYi9jb250cmliL3BnY3J5cHRvL3B4LWNyeXB0LmgK aW5kZXggNTRkZTgwNjk2NTUuLjk3MjQxMTk0ZmIzIDEwMDY0NAotLS0gYS9jb250cmliL3BnY3J5 cHRvL3B4LWNyeXB0LmgKKysrIGIvY29udHJpYi9wZ2NyeXB0by9weC1jcnlwdC5oCkBAIC00NSw2 ICs0NSwzMCBAQAogLyogZGVmYXVsdCBmb3IgYmxvd2Zpc2ggc2FsdCAqLwogI2RlZmluZSBQWF9C Rl9ST1VORFMJCTYKIAorLyogTWF4aW11bSBzYWx0IHN0cmluZyBsZW5ndGggb2Ygc2hhY3J5cHQu ICAqLworI2RlZmluZSBQWF9TSEFDUllQVF9TQUxUX0xFTl9NQVggMTYKKworLyogU0hBIGJ1ZmZl ciBsZW5ndGggKi8KKyNkZWZpbmUgUFhfU0hBQ1JZUFRfRElHRVNUX01BWF9MRU5HVEggNjQKKwor LyogY2FsY3VsYXRlZCBidWZmZXIgc2l6ZSBvZiBhIGJ1ZmZlciB0byBzdG9yZSBhIHNoYWNyeXB0 IHNhbHQgc3RyaW5nICovCisjZGVmaW5lIFBYX1NIQUNSWVBUX1NBTFRfQlVGX0xFTiAoMyArIDcg KyAxMCArIFBYX1NIQUNSWVBUX1NBTFRfTEVOX01BWCArIDEpCisKKy8qCisgKiBjYWxjdWxhdGVk IGJ1ZmZlciBzaXplIG9mIGEgYnVmZmVyIHRvIHN0b3JlIGNvbXBsZXRlIHJlc3VsdCBvZiBhIHNo YWNyeXB0CisgKiBkaWdlc3QgaW5jbHVkaW5nIHNhbHQKKyAqLworI2RlZmluZSBQWF9TSEFDUllQ VF9CVUZfTEVOIFBYX1NIQUNSWVBUX1NBTFRfQlVGX0xFTiArIDg2ICsgMQorCisvKiBEZWZhdWx0 IG51bWJlciBvZiByb3VuZHMgb2Ygc2hhY3J5cHQgaWYgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVk LiAgKi8KKyNkZWZpbmUgUFhfU0hBQ1JZUFRfUk9VTkRTX0RFRkFVTFQgNTAwMAorCisvKiBNaW5p bXVtIG51bWJlciBvZiByb3VuZHMgb2Ygc2hhY3J5cHQuICAqLworI2RlZmluZSBQWF9TSEFDUllQ VF9ST1VORFNfTUlOIDEwMDBsCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIHJvdW5kcyBvZiBzaGFj cnlwdC4gICovCisjZGVmaW5lIFBYX1NIQUNSWVBUX1JPVU5EU19NQVggOTk5OTk5OTk5bAorCiAv KgogICogbWFpbiBpbnRlcmZhY2UKICAqLwpAQCAtNjQsNiArODgsMTAgQEAgY2hhcgkgICAqX2Ny eXB0X2dlbnNhbHRfbWQ1X3JuKHVuc2lnbmVkIGxvbmcgY291bnQsCiAJCQkJCQkJCSAgY29uc3Qg Y2hhciAqaW5wdXQsIGludCBzaXplLCBjaGFyICpvdXRwdXQsIGludCBvdXRwdXRfc2l6ZSk7CiBj aGFyCSAgICpfY3J5cHRfZ2Vuc2FsdF9ibG93ZmlzaF9ybih1bnNpZ25lZCBsb25nIGNvdW50LAog CQkJCQkJCQkJICAgY29uc3QgY2hhciAqaW5wdXQsIGludCBzaXplLCBjaGFyICpvdXRwdXQsIGlu dCBvdXRwdXRfc2l6ZSk7CitjaGFyCSAgICpfY3J5cHRfZ2Vuc2FsdF9zaGEyNTZfcm4odW5zaWdu ZWQgbG9uZyBjb3VudCwKKwkJCQkJCQkJCSBjb25zdCBjaGFyICppbnB1dCwgaW50IHNpemUsIGNo YXIgKm91dHB1dCwgaW50IG91dHB1dF9zaXplKTsKK2NoYXIJICAgKl9jcnlwdF9nZW5zYWx0X3No YTUxMl9ybih1bnNpZ25lZCBsb25nIGNvdW50LAorCQkJCQkJCQkJIGNvbnN0IGNoYXIgKmlucHV0 LCBpbnQgc2l6ZSwgY2hhciAqb3V0cHV0LCBpbnQgb3V0cHV0X3NpemUpOwogCiAvKiBkaXNhYmxl ICdleHRlbmRlZCBERVMgY3J5cHQnICovCiAvKiAjZGVmaW5lIERJU0FCTEVfWERFUyAqLwpAQCAt NzksNCArMTA3LDcgQEAgY2hhcgkgICAqcHhfY3J5cHRfZGVzKGNvbnN0IGNoYXIgKmtleSwgY29u c3QgY2hhciAqc2V0dGluZyk7CiBjaGFyCSAgICpweF9jcnlwdF9tZDUoY29uc3QgY2hhciAqcHcs IGNvbnN0IGNoYXIgKnNhbHQsCiAJCQkJCQkgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBkc3RsZW4p OwogCisvKiBjcnlwdC1zaGEuYyAqLworY2hhciAgICAgICAqcHhfY3J5cHRfc2hhY3J5cHQoY29u c3QgY2hhciAqcHcsIGNvbnN0IGNoYXIgKnNhbHQsIGNoYXIgKnBhc3N3ZCwgdW5zaWduZWQgZHN0 bGVuKTsKKwogI2VuZGlmCQkJCQkJCS8qIF9QWF9DUllQVF9IICovCmRpZmYgLS1naXQgYS9jb250 cmliL3BnY3J5cHRvL3NxbC9jcnlwdC1zaGFjcnlwdC5zcWwgYi9jb250cmliL3BnY3J5cHRvL3Nx bC9jcnlwdC1zaGFjcnlwdC5zcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw MDAuLjNlZTgyNmY2MWFhCi0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9wZ2NyeXB0by9zcWwv Y3J5cHQtc2hhY3J5cHQuc3FsCkBAIC0wLDAgKzEsOTkgQEAKKy0tCistLSBjcnlwdCgpIGFuZCBn ZW5zYWx0OiBzaGEyNTZjcnlwdCwgc2hhNTEyY3J5cHQKKy0tCisKKy0tICQ1JCBpcyBzaGEyNTZj cnlwdAorU0VMRUNUIGNyeXB0KCcnLCAnJDUkU3p6ejB5enonKTsKKworU0VMRUNUIGNyeXB0KCdm b294JywgJyQ1JFN6enoweXp6Jyk7CisKK0NSRUFURSBUQUJMRSBjdGVzdCAoZGF0YSB0ZXh0LCBy ZXMgdGV4dCwgc2FsdCB0ZXh0KTsKK0lOU0VSVCBJTlRPIGN0ZXN0IFZBTFVFUyAoJ3Bhc3N3b3Jk JywgJycsICcnKTsKKworLS0gZ2VuZXJhdGUgYSBzYWx0IGZvciBzaGEyNTZjcnlwdCwgZGVmYXVs dCByb3VuZHMKK1VQREFURSBjdGVzdCBTRVQgc2FsdCA9IGdlbl9zYWx0KCdzaGEyNTZjcnlwdCcp OworVVBEQVRFIGN0ZXN0IFNFVCByZXMgPSBjcnlwdChkYXRhLCBzYWx0KTsKK1NFTEVDVCByZXMg PSBjcnlwdChkYXRhLCByZXMpIEFTICJ3b3JrZWQiCitGUk9NIGN0ZXN0OworCistLSBnZW5lcmF0 ZSBhIHNhbHQgZm9yIHNoYTI1NmNyeXB0LCByb3VuZHMgOTk5OQorVVBEQVRFIGN0ZXN0IFNFVCBz YWx0ID0gZ2VuX3NhbHQoJ3NoYTI1NmNyeXB0JywgOTk5OSk7CitVUERBVEUgY3Rlc3QgU0VUIHJl cyA9IGNyeXB0KGRhdGEsIHNhbHQpOworU0VMRUNUIHJlcyA9IGNyeXB0KGRhdGEsIHJlcykgQVMg IndvcmtlZCIKK0ZST00gY3Rlc3Q7CisKKy0tIHNob3VsZCBmYWlsLCBiZWxvdyBzdXBwb3J0ZWQg bWluaW11bSByb3VuZHMgdmFsdWUKK1VQREFURSBjdGVzdCBTRVQgc2FsdCA9IGdlbl9zYWx0KCdz aGEyNTZjcnlwdCcsIDEwKTsKKworLS0gc2hvdWxkIGZhaWwsIGV4Y2VlZHMgc3VwcG9ydGVkIG1h eGltdW0gcm91bmRzIHZhbHVlCitVUERBVEUgY3Rlc3QgU0VUIHNhbHQgPSBnZW5fc2FsdCgnc2hh MjU2Y3J5cHQnLCAxMDAwMDAwMDAwKTsKKworVFJVTkNBVEUgY3Rlc3Q7CisKKy0tICQ2JCBpcyBz aGE1MTJjcnlwdAorU0VMRUNUIGNyeXB0KCcnLCAnJDYkU3p6ejB5enonKTsKKworU0VMRUNUIGNy eXB0KCdmb294JywgJyQ2JFN6enoweXp6Jyk7CisKK0lOU0VSVCBJTlRPIGN0ZXN0IFZBTFVFUyAo J3Bhc3N3b3JkJywgJycsICcnKTsKKworLS0gZ2VuZXJhdGUgYSBzYWx0IGZvciBzaGE1MTJjcnlw dCwgZGVmYXVsdCByb3VuZHMKK1VQREFURSBjdGVzdCBTRVQgc2FsdCA9IGdlbl9zYWx0KCdzaGE1 MTJjcnlwdCcpOworVVBEQVRFIGN0ZXN0IFNFVCByZXMgPSBjcnlwdChkYXRhLCBzYWx0KTsKK1NF TEVDVCByZXMgPSBjcnlwdChkYXRhLCByZXMpIEFTICJ3b3JrZWQiCitGUk9NIGN0ZXN0OworCist LSBnZW5lcmF0ZSBhIHNhbHQgZm9yIHNoYTUxMmNyeXB0LCByb3VuZHMgOTk5OQorVVBEQVRFIGN0 ZXN0IFNFVCBzYWx0ID0gZ2VuX3NhbHQoJ3NoYTUxMmNyeXB0JywgOTk5OSk7CitVUERBVEUgY3Rl c3QgU0VUIHJlcyA9IGNyeXB0KGRhdGEsIHNhbHQpOworU0VMRUNUIHJlcyA9IGNyeXB0KGRhdGEs IHJlcykgQVMgIndvcmtlZCIKK0ZST00gY3Rlc3Q7CisKKy0tIHNob3VsZCBmYWlsLCBiZWxvdyBz dXBwb3J0ZWQgbWluaW11bSByb3VuZHMgdmFsdWUKK1VQREFURSBjdGVzdCBTRVQgc2FsdCA9IGdl bl9zYWx0KCdzaGE1MTJjcnlwdCcsIDEwKTsKKworLS0gc2hvdWxkIGZhaWwsIGV4Y2VlZHMgc3Vw cG9ydGVkIG1heGltdW0gcm91bmRzIHZhbHVlCitVUERBVEUgY3Rlc3QgU0VUIHNhbHQgPSBnZW5f c2FsdCgnc2hhNTEyY3J5cHQnLCAxMDAwMDAwMDAwKTsKKworLS0gRXh0ZW5kZWQgdGVzdHMgdGFr ZW4gZnJvbSBwdWJsaWMgZG9tYWluIGNvZGUgYXQKKy0tIGh0dHBzOi8vd3d3LmFra2FkaWEub3Jn L2RyZXBwZXIvU0hBLWNyeXB0LnR4dAorLS0KKy0tIFdlIGFkYXB0IHRoZSB0ZXN0cyBkZWZpbmVk IHRoZXJlIHRvIG1ha2Ugc3VyZSB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSByZWZlcmVuY2UK Ky0tIGltcGxlbWVudGF0aW9uLgorCistLSBUaGlzIHRlc3RzIHNoYTI1NmNyeXB0IChtYWdpYyBi eXRlICQ1JCB3aXRoIHNhbHQgYW5kIHJvdW5kcykKK1NFTEVDVCBjcnlwdCgnSGVsbG8gd29ybGQh JywgJyQ1JHNhbHRzdHJpbmcnKQorICAgICAgICAgICA9ICckNSRzYWx0c3RyaW5nJDVCOHZZWWlZ LkNWdDFSbFRUZjhLYlhCSDNoc3hZL0dOb29aYUJCR1dFYzUnIEFTIHJlc3VsdDsKK1NFTEVDVCBj cnlwdCgnSGVsbG8gd29ybGQhJywgJyQ1JHJvdW5kcz0xMDAwMCRzYWx0c3RyaW5nc2FsdHN0cmlu ZycpCisgICAgICAgICAgID0gJyQ1JHJvdW5kcz0xMDAwMCRzYWx0c3RyaW5nc2FsdHN0JDN4di5W YlNIQmI0MUFMOUF2TGV1alprWlJCQXdxRk16Mi5vcHFleTZJY0EnIEFTIHJlc3VsdDsKK1NFTEVD VCBjcnlwdCgnVGhpcyBpcyBqdXN0IGEgdGVzdCcsICckNSRyb3VuZHM9NTAwMCR0b29sb25nc2Fs dHN0cmluZycpCisgICAgICAgICAgID0gJyQ1JHJvdW5kcz01MDAwJHRvb2xvbmdzYWx0c3RyaW4k VW4vNWp6QUhNZ09HWjUubVdKcHVWb2xpbDA3Z3VIUHZPVzhtR1JjdnhhNScgQVMgcmVzdWx0Owor IFNFTEVDVCBjcnlwdCgnYSB2ZXJ5IG11Y2ggbG9uZ2VyIHRleHQgdG8gZW5jcnlwdC4gIFRoaXMg b25lIGV2ZW4gc3RyZXRjaGVzIG92ZXIgbW9yZScKKyAgICAgJ3RoYW4gb25lIGxpbmUuJywgJyQ1 JHJvdW5kcz0xNDAwJGFub3RoZXJsb25nc2FsdHN0cmluZycpCisgICAgICAgICAgICA9ICckNSRy b3VuZHM9MTQwMCRhbm90aGVybG9uZ3NhbHRzJFJ4Lmo4SC5oOEhqRURHb21GVThiRGtYbTNYSVVu enl4ZjEyb1A4NEJucTEnIEFTIHJlc3VsdDsKK1NFTEVDVCBjcnlwdCgnd2UgaGF2ZSBhIHNob3J0 IHNhbHQgc3RyaW5nIGJ1dCBub3QgYSBzaG9ydCBwYXNzd29yZCcsICckNSRyb3VuZHM9Nzc3Nzck c2hvcnQnKQorICAgICAgICAgICA9ICckNSRyb3VuZHM9Nzc3Nzckc2hvcnQkSmlPMU8zWnBEQXhH SmVhREl1cUNvRUZ5c0FlMW1aTkpSczNwdzBLUVJkLycgQVMgcmVzdWx0OworU0VMRUNUIGNyeXB0 KCdhIHNob3J0IHN0cmluZycsICckNSRyb3VuZHM9MTIzNDU2JGFzYWx0b2YxNmNoYXJzLi4nKQor ICAgICAgICAgICA9ICckNSRyb3VuZHM9MTIzNDU2JGFzYWx0b2YxNmNoYXJzLi4kZ1AzVlEvNlg3 VVVFVzNIa0JuMncxL1B0cTJqeFB5elYvY1pLbUYvd0p2RCcgQVMgcmVzdWx0OworU0VMRUNUIGNy eXB0KCd0aGUgbWluaW11bSBudW1iZXIgaXMgc3RpbGwgb2JzZXJ2ZWQnLCAnJDUkcm91bmRzPTEw JHJvdW5kc3Rvb2xvdycpCisgICAgICAgICAgID0gJyQ1JHJvdW5kcz0xMDAwJHJvdW5kc3Rvb2xv dyR5ZnZ3Y1dyUThsL0swREFXeXVQTUROSHBJVmxUUWViWTlsL2dMOTcyYklDJyBBUyByZXN1bHQ7 CisKKy0tIFRoZSBmb2xsb3dpbmcgdGVzdHMgc2hhNTEyY3J5cHQgKG1hZ2ljIGJ5dGUgJDYkIHdp dGggc2FsdCBhbmQgcm91bmRzKQorU0VMRUNUIGNyeXB0KCdIZWxsbyB3b3JsZCEnLCAnJDYkc2Fs dHN0cmluZycpCisgICAgICAgICAgID0gJyQ2JHNhbHRzdHJpbmckc3ZuOFVvU1ZhcE50TXVxMXVr S1M0dFBRZDhpS3dTTUhXamwvTzgxN0czdUJuSUZOam5RSnVlc0k2OHU0T1RMaUJGZGNiWUVkRkNv RU9mYVMzNWluejEnIEFTIHJlc3VsdDsKK1NFTEVDVCBjcnlwdCgnSGVsbG8gd29ybGQhJywgJyQ2 JHJvdW5kcz0xMDAwMCRzYWx0c3RyaW5nc2FsdHN0cmluZycpCisgICAgICAgICAgID0gJyQ2JHJv dW5kcz0xMDAwMCRzYWx0c3RyaW5nc2FsdHN0JE9XMS9PNkJZSFY2QmNYWnU4UVZlWGJEV3JhM09l cWgwc2JIYmJNQ1ZOU25DTS9VcmptTTBEcDh2T3VaZUhCeS9ZVEJtU0s2SDlxcy95M1JuT2F3NXYu JyBBUyByZXN1bHQ7CitTRUxFQ1QgY3J5cHQoJ1RoaXMgaXMganVzdCBhIHRlc3QnLCAnJDYkcm91 bmRzPTUwMDAkdG9vbG9uZ3NhbHRzdHJpbmcnKQorICAgICAgICAgICA9ICckNiRyb3VuZHM9NTAw MCR0b29sb25nc2FsdHN0cmluJGxROGpvbGhnVlJWaFk0YjVwWktheXNDTGkwUUJ4R29OZUtRelEz Z2xNaHdsbEY3b0dEWnhVaHgxeXhkWWN6L2UxSlNicTN5NkpNeHhsOGF1ZGtVRW0wJyBBUyByZXN1 bHQ7CitTRUxFQ1QgY3J5cHQoJ2EgdmVyeSBtdWNoIGxvbmdlciB0ZXh0IHRvIGVuY3J5cHQuICBU aGlzIG9uZSBldmVuIHN0cmV0Y2hlcyBvdmVyIG1vcmUnCisgICAgICAgICAgICAgICAgICd0aGFu IG9uZSBsaW5lLicsICckNiRyb3VuZHM9MTQwMCRhbm90aGVybG9uZ3NhbHRzdHJpbmcnKQorICAg ICAgICAgICA9ICckNiRyb3VuZHM9MTQwMCRhbm90aGVybG9uZ3NhbHRzJFBPZll3VEVvazk3Vldj anhJaVNPaml5a3RpLm8vcFFzLndQdk14UTZGbTdJNklvWU4zQ21MczY2eDl0MG9Td2J0RVc3bzdV bUpFaUR3R3FkOHA0dXIxJyBBUyByZXN1bHQ7CitTRUxFQ1QgY3J5cHQoJ3dlIGhhdmUgYSBzaG9y dCBzYWx0IHN0cmluZyBidXQgbm90IGEgc2hvcnQgcGFzc3dvcmQnLCAnJDYkcm91bmRzPTc3Nzc3 JHNob3J0JykKKyAgICAgICAgICAgPSAnJDYkcm91bmRzPTc3Nzc3JHNob3J0JFd1UXlXMllSLmhC TnBqalJocFlEL2lmSXcwNXhkZmVFeVFvTXhJWGJrdnIwZ2dlMWExeDN5UlVMSjVDQ2FVZU94Rm10 bGNHWmVsRmw1Q3h0Z2ZpQWMwJyBBUyByZXN1bHQ7CitTRUxFQ1QgY3J5cHQoJ2Egc2hvcnQgc3Ry aW5nJywgJyQ2JHJvdW5kcz0xMjM0NTYkYXNhbHRvZjE2Y2hhcnMuLicpCisgICAgICAgICAgID0g JyQ2JHJvdW5kcz0xMjM0NTYkYXNhbHRvZjE2Y2hhcnMuLiRCdEN3anFNSkd4NWhySmhaeXdXdnQw UkxFOHVaNG9Qd2NlbENqbXcya1NZdS5FYzZ5Y1VMZXZvQksyNWZzMnhYZ01OckN6SU1WY2dFSkFz dEplb25qMScgQVMgcmVzdWx0OworU0VMRUNUIGNyeXB0KCd0aGUgbWluaW11bSBudW1iZXIgaXMg c3RpbGwgb2JzZXJ2ZWQnLCAnJDYkcm91bmRzPTEwJHJvdW5kc3Rvb2xvdycpCisgICAgICAgICAg ID0gJyQ2JHJvdW5kcz0xMDAwJHJvdW5kc3Rvb2xvdyRrVU1zYmUzMDZuMjFwOVIuRlJrVzNJR24u UzlOUE4weDUwWWhIMXhoTHNQdVdHc1VTa2xadDU4amFUZkY0WkVRcHlVTkdjMGRxYnBCWVlCYUhI cnNYLicgQVMgcmVzdWx0OworCistLSBjbGVhbnVwCitEUk9QIFRBQkxFIGN0ZXN0OwpkaWZmIC0t Z2l0IGEvZG9jL3NyYy9zZ21sL3BnY3J5cHRvLnNnbWwgYi9kb2Mvc3JjL3NnbWwvcGdjcnlwdG8u c2dtbAppbmRleCAzOTZjNjdmMGNkZS4uMjgxZDk4NTliNTQgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMv c2dtbC9wZ2NyeXB0by5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9wZ2NyeXB0by5zZ21sCkBAIC0x ODksNiArMTg5LDI5IEBAIGhtYWMoZGF0YSBieXRlYSwga2V5IGJ5dGVhLCB0eXBlIHRleHQpIHJl dHVybnMgYnl0ZWEKICAgICAgIDxlbnRyeT4xMzwvZW50cnk+CiAgICAgICA8ZW50cnk+T3JpZ2lu YWwgVU5JWCBjcnlwdDwvZW50cnk+CiAgICAgIDwvcm93PgorICAgICA8cm93PgorICAgICAgPGVu dHJ5PjxsaXRlcmFsPnNoYTI1NmNyeXB0PC9saXRlcmFsPjwvZW50cnk+CisgICAgICA8ZW50cnk+ dW5saW1pdGVkPC9lbnRyeT4KKyAgICAgIDxlbnRyeT55ZXM8L2VudHJ5PgorICAgICAgPGVudHJ5 PnVwIHRvIDMyPC9lbnRyeT4KKyAgICAgIDxlbnRyeT44MDwvZW50cnk+CisgICAgICA8ZW50cnk+ QWRhcHRlZCBmcm9tIHB1YmxpY2x5IGF2YWlsYWJsZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24K KyAgICAgICA8dWxpbmsgdXJsPSJodHRwczovL3d3dy5ha2thZGlhLm9yZy9kcmVwcGVyL1NIQS1j cnlwdC50eHQiPlVuaXggY3J5cHQgdXNpbmcgU0hBLTI1NiBhbmQgU0hBLTUxMgorICAgICAgIDwv dWxpbms+CisgICAgICA8L2VudHJ5PgorICAgICA8L3Jvdz4KKyAgICAgPHJvdz4KKyAgICAgIDxl bnRyeT48bGl0ZXJhbD5zaGE1MTJjcnlwdDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgPGVudHJ5 PnVubGltaXRlZDwvZW50cnk+CisgICAgICA8ZW50cnk+eWVzPC9lbnRyeT4KKyAgICAgIDxlbnRy eT51cCB0byAzMjwvZW50cnk+CisgICAgICA8ZW50cnk+MTIzPC9lbnRyeT4KKyAgICAgIDxlbnRy eT5BZGFwdGVkIGZyb20gcHVibGljbHkgYXZhaWxhYmxlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlv bgorICAgICAgIDx1bGluayB1cmw9Imh0dHBzOi8vd3d3LmFra2FkaWEub3JnL2RyZXBwZXIvU0hB LWNyeXB0LnR4dCI+VW5peCBjcnlwdCB1c2luZyBTSEEtMjU2IGFuZCBTSEEtNTEyCisgICAgICAg PC91bGluaz4KKyAgICAgIDwvZW50cnk+CisgICAgIDwvcm93PgorCiAgICAgPC90Ym9keT4KICAg IDwvdGdyb3VwPgogICA8L3RhYmxlPgpAQCAtMjQ1LDcgKzI2OCw5IEBAIGdlbl9zYWx0KHR5cGUg dGV4dCBbLCBpdGVyX2NvdW50IGludGVnZXIgXSkgcmV0dXJucyB0ZXh0CiAgICA8cGFyYT4KICAg ICBUaGUgPHBhcmFtZXRlcj50eXBlPC9wYXJhbWV0ZXI+IHBhcmFtZXRlciBzcGVjaWZpZXMgdGhl IGhhc2hpbmcgYWxnb3JpdGhtLgogICAgIFRoZSBhY2NlcHRlZCB0eXBlcyBhcmU6IDxsaXRlcmFs PmRlczwvbGl0ZXJhbD4sIDxsaXRlcmFsPnhkZXM8L2xpdGVyYWw+LAotICAgIDxsaXRlcmFsPm1k NTwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPmJmPC9saXRlcmFsPi4KKyAgICA8bGl0ZXJhbD5tZDU8 L2xpdGVyYWw+LCA8bGl0ZXJhbD5iZjwvbGl0ZXJhbD4sIDxsaXRlcmFsPnNoYTI1NmNyeXB0PC9s aXRlcmFsPiBhbmQKKyAgICA8bGl0ZXJhbD5zaGE1MTJjcnlwdDwvbGl0ZXJhbD4uIFRoZSBsYXN0 IHR3bywgPGxpdGVyYWw+c2hhMjU2Y3J5cHQ8L2xpdGVyYWw+IGFuZAorICAgIDxsaXRlcmFsPnNo YTUxMmNyeXB0PC9saXRlcmFsPiBhcmUgbW9kZXJuIDxsaXRlcmFsPlNIQS0yPC9saXRlcmFsPiBi YXNlZCBwYXNzd29yZCBoYXNoZXMuCiAgICA8L3BhcmE+CiAKICAgIDxwYXJhPgpAQCAtMjg0LDYg KzMwOSwxMiBAQCBnZW5fc2FsdCh0eXBlIHRleHQgWywgaXRlcl9jb3VudCBpbnRlZ2VyIF0pIHJl dHVybnMgdGV4dAogICAgICAgIDxlbnRyeT40PC9lbnRyeT4KICAgICAgICA8ZW50cnk+MzE8L2Vu dHJ5PgogICAgICAgPC9yb3c+CisgICAgICA8cm93PgorICAgICAgIDxlbnRyeT48bGl0ZXJhbD5z aGEyNTZjcnlwdCwgc2hhNTEyY3J5cHQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICA8ZW50cnk+ NTAwMDwvZW50cnk+CisgICAgICAgPGVudHJ5PjEwMDA8L2VudHJ5PgorICAgICAgIDxlbnRyeT45 OTk5OTk5OTk8L2VudHJ5PgorICAgICAgPC9yb3c+CiAgICAgIDwvdGJvZHk+CiAgICAgPC90Z3Jv dXA+CiAgICA8L3RhYmxlPgpAQCAtMzEzLDYgKzM0NCwxNSBAQCBnZW5fc2FsdCh0eXBlIHRleHQg WywgaXRlcl9jb3VudCBpbnRlZ2VyIF0pIHJldHVybnMgdGV4dAogICAgIDxmdW5jdGlvbj5nZW5f c2FsdDwvZnVuY3Rpb24+LgogICAgPC9wYXJhPgogCisgICA8cGFyYT4KKyAgIFRoZSBkZWZhdWx0 IDxwYXJhbWV0ZXI+aXRlcl9jb3VudDwvcGFyYW1ldGVyPiBmb3IgPGxpdGVyYWw+c2hhMjU2Y3J5 cHQ8L2xpdGVyYWw+IGFuZAorICAgPGxpdGVyYWw+c2hhNTEyY3J5cHQ8L2xpdGVyYWw+IG9mIDxs aXRlcmFsPjUwMDA8L2xpdGVyYWw+IGlzIGNvbnNpZGVyZWQgdG9vIGxvdyBmb3IgbW9kZXJuCisg ICBoYXJkd2FyZSwgYnV0IGNhbiBiZSBhZGp1c3RlZCB0byBnZW5lcmF0ZSBzdHJvbmdlciBwYXNz d29yZCBoYXNoZXMuIEN1cnJlbnRseSB0aGUgZ2VuZXJhdGVkIGhhc2gKKyAgIHN0cmluZyBhbHdh eXMgaW5jbHVkZXMgdGhlIDxwYXJhbWV0ZXI+cm91bmRzPC9wYXJhbWV0ZXI+IGV2ZW4gd2hlbiBq dXN0IHRoZSBkZWZhdWx0IGlzIHVzZWQuCisgICBPdGhlcndpc2UgYm90aCBoYXNoZXMsIDxsaXRl cmFsPnNoYTI1NmNyeXB0PC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+c2hhNTEyY3J5cHQ8L2xpdGVy YWw+IGFyZQorICAgY29uc2lkZXJlZCBzYWZlLgorICAgPC9wYXJhPgorCiAgICA8dGFibGUgaWQ9 InBnY3J5cHRvLWhhc2gtc3BlZWQtdGFibGUiPgogICAgIDx0aXRsZT5IYXNoIEFsZ29yaXRobSBT cGVlZHM8L3RpdGxlPgogICAgIDx0Z3JvdXAgY29scz0iNSI+Ci0tIAoyLjQ4LjEKCg== --=-3c/Z4Iy99mL6252wmjl6--