Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1n3i4E-0000IN-5d for pgsql-hackers@arkaria.postgresql.org; Sat, 01 Jan 2022 17:21:19 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1n3i4C-0001Cj-Io for pgsql-hackers@arkaria.postgresql.org; Sat, 01 Jan 2022 17:21:16 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1n3i4B-0001CZ-OZ for pgsql-hackers@lists.postgresql.org; Sat, 01 Jan 2022 17:21:16 +0000 Received: from mail-ed1-x52f.google.com ([2a00:1450:4864:20::52f]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1n3i46-0007Qx-G0 for pgsql-hackers@postgresql.org; Sat, 01 Jan 2022 17:21:14 +0000 Received: by mail-ed1-x52f.google.com with SMTP id n30so7300632eda.13 for ; Sat, 01 Jan 2022 09:21:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; h=message-id:date:mime-version:user-agent:subject:content-language :from:to:cc:references:in-reply-to; bh=obFvjpK9fW8oh8tRdOIqJ3nYht20U7ecUCfuaVe0Yhw=; b=fD3H5tT1zKbFTI0rfRgEq3Tbi+SXHuf+/29s/037xud522iDyAFjRfivoMZqw0mPz0 S/15b9HIKLg2y4TJjSKUnfiiEzDR0bGp7KQYEJHZW7gnhT7zTvYwoAKsbYAJ1xna0DNF xSnxIjwXO9sCRDy1kklhqzJnyhFDKQZQ+IHnoSQhLxY1pI1BfX52JYSd+OKM02LdpfOy 8L2RvLqCqcWKrlXqcxbeZyo5Bfefl1rI3rG767b+H2yd3i61qIZqxdCRAmHttRlhYp+P yi6auIJo16LrJP2JPX48Xfxmky0aJZvjaLQ3Vkc+48iArea08a/9PrBbX5Kf/YAO83qW PtFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:from:to:cc:references:in-reply-to; bh=obFvjpK9fW8oh8tRdOIqJ3nYht20U7ecUCfuaVe0Yhw=; b=MRNShdETPkiuroWnj4qCmVZikmVvIQ8loMxHeMH9J5NzdpIHjyz5V+vDD/QRsSP1IW vUsiISt07kg3yQToPLfhDZ6VQzPh2F+vfCIEnle3UjxOr36sJ7J9opwn2IFQiNjba1Ly D7ANRvMf1tbrqqNRB+IzoA7vGBd9QMYDbBjaLRf+aoo0tRpMafdt6gQwPHpIfm8jopzP PxhNRK2+oxg/mObYgpvggdBT+g0XXd1jKUILqdrCBKhx5m45OWpBi1d+Jafxn6NoJpcJ 7/BuBPLfG7xKopxL4Jp6K3/MxIKuK2ThtV5p3kdbI5KiohDcsnTdtyGrCe2cDNpeOqwX 7DRA== X-Gm-Message-State: AOAM531RnwJAxJJJetECcd49ydiAa12Woi2fIZ9vun79JxPBaxjkl3jP a5OQSFKo5zDjpkuwfdAet/2lWhbGpD+JR0l5joOS+UZ/krNiKH9w8Z/O6IlhKb3/aQKtMrAp8Fr A8Gja+8gJvvVpAcsdogjmR+3eQwGe3vW64QsdERr408fDwZk4+vzU9toJEZDN3QVtVuZT+Xpiyn 0+vHytY76cuX3Y+NrW6zXCGW9cIaKg47K586fE X-Google-Smtp-Source: ABdhPJytDPZafXy+oJ1Vca5np4vfR7hNHm3b5D89CgCKAgulWMBBvjQOwfVZachcCOmf+lmU77doCw== X-Received: by 2002:a17:906:1996:: with SMTP id g22mr31545541ejd.661.1641057668824; Sat, 01 Jan 2022 09:21:08 -0800 (PST) Received: from [10.137.0.18] (ip-86-49-251-241.net.upcbroadband.cz. [86.49.251.241]) by smtp.gmail.com with ESMTPSA id k12sm9241750ejx.119.2022.01.01.09.21.07 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 01 Jan 2022 09:21:08 -0800 (PST) Content-Type: multipart/mixed; boundary="------------1j1iyuSozyF7v6vxHxSODWaw" Message-ID: <1ea3bf2b-57f9-e632-251a-e718623d7a72@enterprisedb.com> Date: Sat, 1 Jan 2022 18:21:06 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.2.0 Subject: Re: using extended statistics to improve join estimates Content-Language: en-US From: Tomas Vondra To: Justin Pryzby Cc: pgsql-hackers@postgresql.org References: <2ed75657-e084-9539-c6de-597e5675014c@enterprisedb.com> <20211122012315.GH17618@telsasoft.com> <0213d237-efd5-8e7e-fa29-3f36e6e26023@enterprisedb.com> In-Reply-To: <0213d237-efd5-8e7e-fa29-3f36e6e26023@enterprisedb.com> X-CLOUD-SEC-AV-Info: enterprisedb,google_mail,monitor X-CLOUD-SEC-AV-Sent: true X-Gm-Spam: 0 X-Gm-Phishy: 0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------1j1iyuSozyF7v6vxHxSODWaw Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi, Here's an updated patch, rebased and fixing a couple typos reported by Justin Pryzby directly. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company --------------1j1iyuSozyF7v6vxHxSODWaw Content-Type: text/x-patch; charset=UTF-8; name="0001-Estimate-joins-using-extended-statistics-20220101.patch" Content-Disposition: attachment; filename*0="0001-Estimate-joins-using-extended-statistics-20220101.patch" Content-Transfer-Encoding: base64 RnJvbSAxNWQwZmE1YjU2NWQ5YWU4YjRmMzMzYzFkNTQ3NDUzOTc5NjQxMTBkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzLnZvbmRyYUBwb3N0 Z3Jlc3FsLm9yZz4KRGF0ZTogTW9uLCAxMyBEZWMgMjAyMSAxNDowNToxNyArMDEwMApTdWJq ZWN0OiBbUEFUQ0hdIEVzdGltYXRlIGpvaW5zIHVzaW5nIGV4dGVuZGVkIHN0YXRpc3RpY3MK ClVzZSBleHRlbmRlZCBzdGF0aXN0aWNzIChNQ1YpIHRvIGltcHJvdmUgam9pbiBlc3RpbWF0 ZXMuIEluIGdlbmVyYWwgdGhpcwppcyBzaW1pbGFyIHRvIGhvdyB3ZSB1c2UgcmVndWxhciBz dGF0aXN0aWNzIC0gd2Ugc2VhcmNoIGZvciBleHRlbmRlZApzdGF0aXN0aWNzICh3aXRoIE1D VikgY292ZXJpbmcgYWxsIGpvaW4gY2xhdXNlcywgYW5kIGlmIHdlIGZpbmQgc3VjaCBNQ1YK b24gYm90aCBzaWRlcyBvZiB0aGUgam9pbiwgd2UgY29tYmluZSB0aG9zZSB0d28gTUNWcy4K CkV4dGVuZGVkIHN0YXRpc3RpY3MgYWxsb3cgYSBjb3VwbGUgYWRkaXRpb25hbCBpbXByb3Zl bWVudHMgLSBlLmcuIGlmCnRoZXJlIGFyZSBiYXNlcmVsIGNvbmRpdGlvbnMsIHdlIGNhbiB1 c2UgdGhlbSB0byByZXN0cmljdCB0aGUgcGFydCBvZgp0aGUgTUNWcyBjb21iaW5lZC4gVGhp cyBtZWFucyB3ZSdyZSBidWlsZGluZyBjb25kaXRpb25hbCBwcm9iYWJpbGl0eQpkaXN0cmli dXRpb24gYW5kIGNhbGN1bGF0aW5nIGNvbmRpdGlvbmFsIHByb2JhYmlsaXR5CgogICAgUChq b2luIGNsYXVzZXMgfCBiYXNlcmVsIGNvbmRpdGlvbnMpCgppbnN0ZWFkIG9mIGp1c3QgUChq b2luIGNsYXVzZXMpLgoKVGhlIHBhdGNoIGFsc28gYWxsb3dzIGNvbWJpbmluZyByZWd1bGFy IGFuZCBleHRlbmRlZCBNQ1YgLSB3ZSBkb24ndCBuZWVkCmV4dGVuZGVkIE1DVnMgb24gYm90 aCBzaWRlcy4gVGhpcyBoZWxwcyB3aGVuIG9uZSBvZiB0aGUgdGFibGVzIGRvZXMgbm90Cmhh dmUgZXh0ZW5kZWQgc3RhdGlzdGljcyAoZS5nLiBiZWNhdXNlIHRoZXJlIGFyZSBubyBjb3Jy ZWxhdGlvbnMpLgotLS0KIHNyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2NsYXVzZXNlbC5j ICAgICAgICB8ICA2MyArLQogc3JjL2JhY2tlbmQvc3RhdGlzdGljcy9leHRlbmRlZF9zdGF0 cy5jICAgICAgIHwgODA1ICsrKysrKysrKysrKysrKysrKwogc3JjL2JhY2tlbmQvc3RhdGlz dGljcy9tY3YuYyAgICAgICAgICAgICAgICAgIHwgNzU0ICsrKysrKysrKysrKysrKysKIC4u Li9zdGF0aXN0aWNzL2V4dGVuZGVkX3N0YXRzX2ludGVybmFsLmggICAgICB8ICAyMCArCiBz cmMvaW5jbHVkZS9zdGF0aXN0aWNzL3N0YXRpc3RpY3MuaCAgICAgICAgICAgfCAgMTIgKwog c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdGF0c19leHQub3V0ICAgICAgIHwgMTY3ICsr KysKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3N0YXRzX2V4dC5zcWwgICAgICAgICAgICB8ICA2 NiArKwogNyBmaWxlcyBjaGFuZ2VkLCAxODg2IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24o LSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jbGF1c2VzZWwu YyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2NsYXVzZXNlbC5jCmluZGV4IGQyNjNl Y2YwODI3Li4wOWYzZDI0NmM5ZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVy L3BhdGgvY2xhdXNlc2VsLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvY2xh dXNlc2VsLmMKQEAgLTUwLDYgKzUwLDkgQEAgc3RhdGljIFNlbGVjdGl2aXR5IGNsYXVzZWxp c3Rfc2VsZWN0aXZpdHlfb3IoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCQkJCSBKb2lu VHlwZSBqb2ludHlwZSwKIAkJCQkJCQkJCQkJIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvLAog CQkJCQkJCQkJCQkgYm9vbCB1c2VfZXh0ZW5kZWRfc3RhdHMpOworc3RhdGljIGlubGluZSBi b29sIHRyZWF0X2FzX2pvaW5fY2xhdXNlKFBsYW5uZXJJbmZvICpyb290LAorCQkJCQkJCQkJ CU5vZGUgKmNsYXVzZSwgUmVzdHJpY3RJbmZvICpyaW5mbywKKwkJCQkJCQkJCQlpbnQgdmFy UmVsaWQsIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKTsKIAogLyoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioKICAqCQlST1VUSU5FUyBUTyBDT01QVVRFIFNFTEVDVElWSVRJRVMKQEAgLTEyOSwx MiArMTMyLDUzIEBAIGNsYXVzZWxpc3Rfc2VsZWN0aXZpdHlfZXh0KFBsYW5uZXJJbmZvICpy b290LAogCVJhbmdlUXVlcnlDbGF1c2UgKnJxbGlzdCA9IE5VTEw7CiAJTGlzdENlbGwgICAq bDsKIAlpbnQJCQlsaXN0aWR4OworCWJvb2wJCXNpbmdsZV9jbGF1c2Vfb3B0aW1pemF0aW9u ID0gdHJ1ZTsKKworCS8qCisJICogVGhlIG9wdGltaXphdGlvbiBvZiBza2lwcGluZyB0byBj bGF1c2Vfc2VsZWN0aXZpdHlfZXh0IGZvciBzaW5nbGUKKwkgKiBjbGF1c2VzIG1lYW5zIHdl IGNhbid0IGltcHJvdmUgam9pbiBlc3RpbWF0ZXMgd2l0aCBhIHNpbmdsZSBqb2luCisJICog Y2xhdXNlIGJ1dCBhZGRpdGlvbmFsIGJhc2VyZWwgcmVzdHJpY3Rpb25zLiBTbyB3ZSBkaXNh YmxlIGl0IHdoZW4KKwkgKiBlc3RpbWF0aW5nIGpvaW5zLgorCSAqCisJICogWFhYIE5vdCBz dXJlIGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHdheSB0byBkbyBpdCwgYnV0IG1vcmUgZWxhYm9y YXRlCisJICogY2hlY2tzIHdvdWxkIG1vc3RseSBuZWdhdGUgdGhlIHdob2xlIHBvaW50IG9m IHRoZSBvcHRpbWl6YXRpb24uCisJICogVGhlIChWYXIgb3AgVmFyKSBwYXRjaCBoYXMgdGhl IHNhbWUgaXNzdWUuCisJICoKKwkgKiBYWFggQW4gYWx0ZXJuYXRpdmUgbWlnaHQgYmUgbWFr aW5nIGNsYXVzZV9zZWxlY3Rpdml0eV9leHQgc21hcnRlcgorCSAqIGFuZCBtYWtlIGl0IHVz ZSB0aGUgam9pbiBleHRlbmRlZCBzdGF0cyB0aGVyZS4gQnV0IHRoYXQgc2VlbXMga2luZGEK KwkgKiBhZ2FpbnN0IHRoZSB3aG9sZSBwb2ludCBvZiB0aGUgb3B0aW1pemF0aW9uIChza2lw cGluZyBleHBlbnNpdmUKKwkgKiBzdHVmZikgYW5kIGl0J3MgbWFraW5nIG90aGVyIHBhcnRz IG1vcmUgY29tcGxleC4KKwkgKgorCSAqIFhYWCBNYXliZSB0aGlzIHNob3VsZCBjaGVjayBp ZiB0aGVyZSBhcmUgYXQgbGVhc3Qgc29tZSByZXN0cmljdGlvbnMKKwkgKiBvbiBzb21lIGJh c2UgcmVsYXRpb25zLCB3aGljaCBzZWVtcyBpbXBvcnRhbnQuIEJ1dCB0aGVuIGFnYWluLCB0 aGF0CisJICogc2VlbXMgdG8gZ28gYWdhaW5zdCB0aGUgaWRlYSBvZiB0aGlzIGNoZWNrIHRv IGJlIGNoZWFwLiBNb3Jlb3ZlciwgaXQKKwkgKiB3b24ndCB3b3JrIGZvciBPUiBjbGF1c2Vz LCB3aGljaCBtYXkgaGF2ZSBtdWx0aXBsZSBwYXJ0cyBidXQgd2Ugc3RpbGwKKwkgKiBzZWUg dGhlbSBhcyBhIHNpbmdsZSBCb29sRXhwciBjbGF1c2UgKGl0IGRvZXNuJ3Qgd29yayBsYXRl ciwgdGhvdWdoKS4KKwkgKi8KKwlpZiAobGlzdF9sZW5ndGgoY2xhdXNlcykgPT0gMSkKKwl7 CisJCU5vZGUgKmNsYXVzZSA9IGxpbml0aWFsKGNsYXVzZXMpOworCQlSZXN0cmljdEluZm8g KnJpbmZvID0gTlVMTDsKKworCQlpZiAoSXNBKGNsYXVzZSwgUmVzdHJpY3RJbmZvKSkKKwkJ eworCQkJcmluZm8gPSAoUmVzdHJpY3RJbmZvICopIGNsYXVzZTsKKwkJCWNsYXVzZSA9IChO b2RlICopIHJpbmZvLT5jbGF1c2U7CisJCX0KKworCQlzaW5nbGVfY2xhdXNlX29wdGltaXph dGlvbgorCQkJPSAhdHJlYXRfYXNfam9pbl9jbGF1c2Uocm9vdCwgY2xhdXNlLCByaW5mbywg dmFyUmVsaWQsIHNqaW5mbyk7CisJfQogCiAJLyoKIAkgKiBJZiB0aGVyZSdzIGV4YWN0bHkg b25lIGNsYXVzZSwganVzdCBnbyBkaXJlY3RseSB0bwogCSAqIGNsYXVzZV9zZWxlY3Rpdml0 eV9leHQoKS4gTm9uZSBvZiB3aGF0IHdlIG1pZ2h0IGRvIGJlbG93IGlzIHJlbGV2YW50Lgor CSAqCisJICogWFhYIFRoaXMgbWVhbnMgd2Ugd29uJ3QgdHJ5IHVzaW5nIGV4dGVuZGVkIHN0 YXRzIG9uIE9SLWNsYXVzZXMgKHdoaWNoCisJICogYXJlIGEgc2luZ2xlIEJvb2xFeHByIGNs YXVzZSBhdCB0aGlzIHBvaW50KSwgYWx0aG91Z2ggd2UnbGwgZG8gdGhhdAorCSAqIGxhdGVy IChvbmNlIHdlIGxvb2sgYXQgdGhlIGFyZ3VtZW50cykuCiAJICovCi0JaWYgKGxpc3RfbGVu Z3RoKGNsYXVzZXMpID09IDEpCisJaWYgKChsaXN0X2xlbmd0aChjbGF1c2VzKSA9PSAxKSAm JiBzaW5nbGVfY2xhdXNlX29wdGltaXphdGlvbikKIAkJcmV0dXJuIGNsYXVzZV9zZWxlY3Rp dml0eV9leHQocm9vdCwgKE5vZGUgKikgbGluaXRpYWwoY2xhdXNlcyksCiAJCQkJCQkJCQkg IHZhclJlbGlkLCBqb2ludHlwZSwgc2ppbmZvLAogCQkJCQkJCQkJICB1c2VfZXh0ZW5kZWRf c3RhdHMpOwpAQCAtMTU3LDYgKzIwMSwyMyBAQCBjbGF1c2VsaXN0X3NlbGVjdGl2aXR5X2V4 dChQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJCQkJCQkJJmVzdGltYXRlZGNsYXVzZXMsIGZh bHNlKTsKIAl9CiAKKwkvKgorCSAqIFRyeSBhcHBseWluZyBleHRlbmRlZCBzdGF0aXN0aWNz IHRvIGpvaW5zLiBUaGVyZSdzIG5vdCBtdWNoIHdlIGNhbgorCSAqIGRvIHRvIGRldGVjdCB3 aGVuIHRoaXMgbWFrZXMgc2Vuc2UsIGJ1dCB3ZSBjYW4gY2hlY2sgdGhhdCB0aGVyZSBhcmUK KwkgKiBqb2luIGNsYXVzZXMsIGFuZCB0aGF0IGF0IGxlYXN0IHNvbWUgb2YgdGhlIHJlbHMg aGF2ZSBzdGF0cy4KKwkgKgorCSAqIFhYWCBJc24ndCB0aGlzIG11dHVhbGx5IGV4Y2x1c2l2 ZSB3aXRoIHRoZSBwcmVjZWRpbmcgYmxvY2sgd2hpY2gKKwkgKiBjYWxjdWxhdGVzIGVzdGlt YXRlcyBmb3IgYSBzaW5nbGUgcmVsYXRpb24/CisJICovCisJaWYgKHVzZV9leHRlbmRlZF9z dGF0cyAmJgorCQlzdGF0ZXh0X3RyeV9qb2luX2VzdGltYXRlcyhyb290LCBjbGF1c2VzLCB2 YXJSZWxpZCwgam9pbnR5cGUsIHNqaW5mbywKKwkJCQkJCSBlc3RpbWF0ZWRjbGF1c2VzKSkK Kwl7CisJCXMxICo9IHN0YXRleHRfY2xhdXNlbGlzdF9qb2luX3NlbGVjdGl2aXR5KHJvb3Qs IGNsYXVzZXMsIHZhclJlbGlkLAorCQkJCQkJCQkJCQkJICBqb2ludHlwZSwgc2ppbmZvLAor CQkJCQkJCQkJCQkJICAmZXN0aW1hdGVkY2xhdXNlcyk7CisJfQorCiAJLyoKIAkgKiBBcHBs eSBub3JtYWwgc2VsZWN0aXZpdHkgZXN0aW1hdGVzIGZvciByZW1haW5pbmcgY2xhdXNlcy4g V2UnbGwgYmUKIAkgKiBjYXJlZnVsIHRvIHNraXAgYW55IGNsYXVzZXMgd2hpY2ggd2VyZSBh bHJlYWR5IGVzdGltYXRlZCBhYm92ZS4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0YXRp c3RpY3MvZXh0ZW5kZWRfc3RhdHMuYyBiL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvZXh0ZW5k ZWRfc3RhdHMuYwppbmRleCA2OWNhNTIwOTRmOS4uNTdlOTUxNDAwYzUgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvZXh0ZW5kZWRfc3RhdHMuYworKysgYi9zcmMvYmFj a2VuZC9zdGF0aXN0aWNzL2V4dGVuZGVkX3N0YXRzLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNp bmNsdWRlICJub2Rlcy9ub2RlRnVuY3MuaCIKICNpbmNsdWRlICJvcHRpbWl6ZXIvY2xhdXNl cy5oIgogI2luY2x1ZGUgIm9wdGltaXplci9vcHRpbWl6ZXIuaCIKKyNpbmNsdWRlICJvcHRp bWl6ZXIvcGF0aG5vZGUuaCIKICNpbmNsdWRlICJwZ3N0YXQuaCIKICNpbmNsdWRlICJwb3N0 bWFzdGVyL2F1dG92YWN1dW0uaCIKICNpbmNsdWRlICJzdGF0aXN0aWNzL2V4dGVuZGVkX3N0 YXRzX2ludGVybmFsLmgiCkBAIC0xMDEsNiArMTAyLDggQEAgc3RhdGljIFN0YXRzQnVpbGRE YXRhICptYWtlX2J1aWxkX2RhdGEoUmVsYXRpb24gb25lcmVsLCBTdGF0RXh0RW50cnkgKnN0 YXQsCiAJCQkJCQkJCQkgICBpbnQgbnVtcm93cywgSGVhcFR1cGxlICpyb3dzLAogCQkJCQkJ CQkJICAgVmFjQXR0clN0YXRzICoqc3RhdHMsIGludCBzdGF0dGFyZ2V0KTsKIAorc3RhdGlj IGJvb2wgc3RhdF9jb3ZlcnNfZXhwcmVzc2lvbnMoU3RhdGlzdGljRXh0SW5mbyAqc3RhdCwg TGlzdCAqZXhwcnMsCisJCQkJCQkJCQlCaXRtYXBzZXQgKipleHByX2lkeHMpOwogCiAvKgog ICogQ29tcHV0ZSByZXF1ZXN0ZWQgZXh0ZW5kZWQgc3RhdHMsIHVzaW5nIHRoZSByb3dzIHNh bXBsZWQgZm9yIHRoZSBwbGFpbgpAQCAtMjYwOCwzICsyNjExLDgwNSBAQCBtYWtlX2J1aWxk X2RhdGEoUmVsYXRpb24gcmVsLCBTdGF0RXh0RW50cnkgKnN0YXQsIGludCBudW1yb3dzLCBI ZWFwVHVwbGUgKnJvd3MsCiAKIAlyZXR1cm4gcmVzdWx0OwogfQorCisvKgorICogc3RhdGV4 dF9maW5kX21hdGNoaW5nX21jdgorICoJCVNlYXJjaCBmb3IgYSBNQ1YgY292ZXJpbmcgYWxs IHRoZSBhdHRyaWJ1dGVzIGFuZCBleHByZXNzaW9ucy4KKyAqCisgKiBXZSBwaWNrIHRoZSBz dGF0aXN0aWNzIHRvIHVzZSBmb3Igam9pbiBlc3RpbWF0aW9uLiBUaGUgc3RhdGlzdGljcyBv YmplY3QgaGFzCisgKiB0byBoYXZlIE1DViwgYW5kIHdlIHJlcXVpcmUgaXQgdG8gbWF0Y2gg YWxsIHRoZSBqb2luIGNvbmRpdGlvbnMsIGJlY2F1c2UgaXQKKyAqIG1ha2VzIHRoZSBlc3Rp bWF0aW9uIHNpbXBsZXIuCisgKgorICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIGNhbmRpZGF0 ZSBzdGF0aXN0aWNzIG9iamVjdHMgKG1hdGNoaW5nIGFsbCBqb2luIGNsYXVzZXMpLAorICog d2UgcGljayB0aGUgc21hbGxlc3Qgb25lLCBhbmQgd2UgYWxzbyBjb25zaWRlciBhZGRpdGlv bmFsIGNvbmRpdGlvbnMgb24KKyAqIHRoZSBiYXNlIHJlbGF0aW9ucyB0byByZXN0cmljdCB0 aGUgTUNWIGl0ZW1zIHVzZWQgZm9yIGVzdGltYXRpb24gKHVzaW5nCisgKiBjb25kaXRpb25h bCBwcm9iYWJpbGl0eSkuCisgKgorICogWFhYIFRoZSByZXF1aXJlbWVudCB0aGF0IGFsbCB0 aGUgYXR0cmlidXRlcyBuZWVkIHRvIGJlIGNvdmVyZWQgbWlnaHQgYmUKKyAqIHRvbyBzdHJv bmcuIFdlIGNvdWxkIHJlbGF4IHRoaXMgYW5kIGFuZCByZXF1aXJlIGZld2VyIG1hdGNoZXMg KGF0IGxlYXN0IHR3bywKKyAqIGlmIGNvdW50aW5nIHRoZSBhZGRpdGlvbmFsIGNvbmRpdGlv bnMpLCBhbmQgd2UgbWlnaHQgZXZlbiBhcHBseSBtdWx0aXBsZQorICogc3RhdGlzdGljcyBl dGMuIEJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgbWF0Y2hpbmcgc3RhdGlzdGljcyBvbiBib3Ro IHNpZGVzIG9mCisgKiB0aGUgam9pbiwgd2hpbGUgbm93IHdlIHNpbXBseSBrbm93IHRoZSBz dGF0aXN0aWNzIG1hdGNoLiBXZSBkb24ndCByZWFsbHkKKyAqIGV4cGVjdCBtYW55IGNhbmRp ZGF0ZSBNQ1ZzLCBzbyB0aGlzIHNpbXBsZSBhcHByb2FjaCBzZWVtcyBzdWZmaWNpZW50LiBB bmQKKyAqIHRoZSBqb2lucyB1c3VhbGx5IHVzZSBvbmx5IG9uZSBvciB0d28gY29sdW1ucywg c28gdGhlcmUncyBub3QgbXVjaCByb29tCisgKiBmb3IgYXBwbHlpbmcgbXVsdGlwbGUgc3Rh dGlzdGljcyBhbnl3YXkuCisgKi8KK1N0YXRpc3RpY0V4dEluZm8gKgorc3RhdGV4dF9maW5k X21hdGNoaW5nX21jdihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAorCQkJ CQkJICBCaXRtYXBzZXQgKmF0dG51bXMsIExpc3QgKmV4cHJzKQoreworCUxpc3RDZWxsICAg Kmw7CisJU3RhdGlzdGljRXh0SW5mbyAqbWN2ID0gTlVMTDsKKwlMaXN0ICpzdGF0cyA9IHJl bC0+c3RhdGxpc3Q7CisKKwlmb3JlYWNoKGwsIHN0YXRzKQorCXsKKwkJU3RhdGlzdGljRXh0 SW5mbyAqc3RhdCA9IChTdGF0aXN0aWNFeHRJbmZvICopIGxmaXJzdChsKTsKKwkJTGlzdCAq Y29uZGl0aW9uczEgPSBOSUwsCisJCQkgKmNvbmRpdGlvbnMyID0gTklMOworCisJCS8qIFdl IG9ubHkgY2FyZSBhYm91dCBNQ1Ygc3RhdGlzdGljcyBoZXJlLiAqLworCQlpZiAoc3RhdC0+ a2luZCAhPSBTVEFUU19FWFRfTUNWKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogSWdu b3JlIE1DVnMgbm90IGNvdmVyaW5nIGFsbCB0aGUgYXR0cmlidXRlcy9leHByZXNzaW9ucy4K KwkJICoKKwkJICogWFhYIE1heWJlIHdlIHNob3VsZG4ndCBiZSBzbyBzdHJpY3QgYW5kIGNv bnNpZGVyIG9ubHkgcGFydGlhbAorCQkgKiBtYXRjaGVzIGZvciBqb2luIGNsYXVzZXMgdG9v PworCQkgKi8KKwkJaWYgKCFibXNfaXNfc3Vic2V0KGF0dG51bXMsIHN0YXQtPmtleXMpIHx8 CisJCQkhc3RhdF9jb3ZlcnNfZXhwcmVzc2lvbnMoc3RhdCwgZXhwcnMsIE5VTEwpKQorCQkJ Y29udGludWU7CisKKwkJLyogSWYgdGhlcmUncyBubyBtYXRjaGluZyBNQ1YgeWV0LCBrZWVw IHRoaXMgb25lLiAqLworCQlpZiAoIW1jdikKKwkJeworCQkJbWN2ID0gc3RhdDsKKwkJCWNv bnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogT0ssIHdlIGhhdmUgdHdvIGNhbmRpZGF0ZSBz dGF0aXN0aWNzIG9iamVjdHMgYW5kIHdlIG5lZWQgdG8gZGVjaWRlCisJCSAqIHdoaWNoIG9u ZSB0byBrZWVwLiBXZSdsbCB1c2UgdHdvIHNpbXBsZSBoZXVyaXN0aWNzOgorCQkgKgorCQkg KiAoYSkgV2UgcHJlZmVyIHNtYWxsZXIgc3RhdGlzdGljcyAoZmV3ZXIgY29sdW1ucyksIG9u IHRoZSBhc3N1bXB0aW9uCisJCSAqIHRoYXQgaXQgcmVwcmVzZW50cyBhIGxhcmdlciBmcmFj dGlvbiBvZiB0aGUgZGF0YSAoZHVlIHRvIGhhdmluZyBmZXdlcgorCQkgKiBjb21iaW5hdGlv bnMgd2l0aCBoaWdoZXIgY291bnRzKS4KKwkJICoKKwkJICogKGIpIElmIHRoZSBzdGF0aXN0 aWNzIG9iamVjdCBjb3ZlcnMgc29tZSBhZGRpdGlvbmFsIGNvbmRpdGlvbnMgZm9yIHRoZSBy ZWxzLAorCQkgKiB0aGF0IG1heSBoZWxwIHdpdGggY29uc2lkZXJpbmcgYWRkaXRpb25hbCBk ZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGUKKwkJICogdGFibGVzLgorCQkgKgorCQkgKiBPZiBj b3Vyc2UsIHRob3NlIHR3byBoZXVyaXN0aWN0IGFyZSBzb21ld2hhdCBjb250cmFkaWN0b3J5 IC0gc21hbGxlcgorCQkgKiBzdGF0cyBhcmUgbGVzcyBsaWtlbHkgdG8gY292ZXIgYXMgbWFu eSBjb25kaXRpb25zIGFzIGEgbGFyZ2VyIG9uZS4gV2UKKwkJICogY29uc2lkZXIgdGhlIGFk ZGl0aW9uYWwgY29uZGl0aW9ucyBmaXJzdCAtIGlmIHNvbWVvbmUgY3JlYXRlZCBzdWNoCisJ CSAqIHN0YXRpc3RpY3MsIHRoZXJlIHByb2JhYmx5IGlzIGEgZGVwZW5kZW5jeSB3b3J0aCBj b25zaWRlcmluZy4KKwkJICoKKwkJICogV2hlbiBpbnNwZWN0aW5nIHRoZSByZXN0cmljdGlv bnMsIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCAtIHdlIGRvbid0CisJCSAqIGtub3cgd2hpY2gg b2YgdGhlbSBhcmUgY29tcGF0aWJsZSB3aXRoIGV4dGVuZGVkIHN0YXRzLCBzbyB3ZSBoYXZl IHRvCisJCSAqIHJ1biB0aGVtIHRocm91Z2ggc3RhdGV4dF9pc19jb21wYXRpYmxlX2NsYXVz ZSBmaXJzdCBhbmQgdGhlbiBtYXRjaAorCQkgKiB0aGVtIHRvIHRoZSBzdGF0aXN0aWNzLgor CQkgKgorCQkgKiBYWFggTWF5YmUgd2Ugc2hvdWxkbid0IHBpY2sgc3RhdGlzdGljcyB0aGF0 IGNvdmVycyBqdXN0IGEgc2luZ2xlIGpvaW4KKwkJICogY2xhdXNlLCB3aXRob3V0IGFueSBh ZGRpdGlvbmFsIGNvbmRpdGlvbnMuIEluIHN1Y2ggY2FzZSB3ZSBjb3VsZCBqdXN0CisJCSAq IGFzIHdlbGwgcGljayByZWd1bGFyIHN0YXRpc3RpY3MgZm9yIHRoZSBjb2x1bW4vZXhwcmVz c2lvbiwgYnV0IGl0J3MKKwkJICogbm90IGNsZWFyIGlmIHRoYXQgYWN0dWFsbHkgZXhpc3Rz IChzbyB3ZSBtaWdodCByZWplY3QgdGhlIHN0YXRzIGhlcmUKKwkJICogYW5kIHRoZW4gZmFp bCB0byBmaW5kIHNvbWV0aGluZyBzaW1wbGVyL2JldHRlcikuCisJCSAqLworCQljb25kaXRp b25zMSA9IHN0YXRleHRfZGV0ZXJtaW5lX2pvaW5fcmVzdHJpY3Rpb25zKHJvb3QsIHJlbCwg c3RhdCk7CisJCWNvbmRpdGlvbnMyID0gc3RhdGV4dF9kZXRlcm1pbmVfam9pbl9yZXN0cmlj dGlvbnMocm9vdCwgcmVsLCBtY3YpOworCisJCS8qIGlmIHRoZSBuZXcgc3RhdGlzdGljcyBv YmplY3QgY292ZXJzIG1vcmUgY29uZGl0aW9ucywgdXNlIGl0ICovCisJCWlmIChsaXN0X2xl bmd0aChjb25kaXRpb25zMSkgPiBsaXN0X2xlbmd0aChjb25kaXRpb25zMikpCisJCXsKKwkJ CW1jdiA9IHN0YXQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFRoZSBzdGF0aXN0aWNz IHNlZW0gYWJvdXQgZXF1YWwsIHNvIGp1c3QgdXNlIHRoZSBzbWFsbGVyIG9uZS4gKi8KKwkJ aWYgKGJtc19udW1fbWVtYmVycyhtY3YtPmtleXMpICsgbGlzdF9sZW5ndGgobWN2LT5leHBy cykgPgorCQkJYm1zX251bV9tZW1iZXJzKHN0YXQtPmtleXMpICsgbGlzdF9sZW5ndGgoc3Rh dC0+ZXhwcnMpKQorCQl7CisJCQltY3YgPSBzdGF0OworCQl9CisJfQorCisJcmV0dXJuIG1j djsKK30KKworLyoKKyAqIHN0YXRleHRfZGV0ZXJtaW5lX2pvaW5fcmVzdHJpY3Rpb25zCisg KgkJR2V0IHJlc3RyaWN0aW9ucyBvbiBiYXNlIHJlbGF0aW9uLCBjb3ZlcmVkIGJ5IHRoZSBz dGF0aXN0aWNzIG9iamVjdC4KKyAqCisgKiBSZXR1cm5zIGEgbGlzdCBvZiBiYXNlcmVsIHJl c3RyaWN0aW5mb3MsIGNvbXBhdGlibGUgd2l0aCBleHRlbmRlZCBzdGF0aXN0aWNzCisgKiBh bmQgY292ZXJlZCBieSB0aGUgZXh0ZW5kZWQgc3RhdGlzdGljcyBvYmplY3QuCisgKgorICog V2hlbiB1c2luZyBleHRlbmRlZCBzdGF0aXN0aWNzIHRvIGVzdGltYXRlIGpvaW5zLCB3ZSBj YW4gdXNlIGNvbmRpdGlvbnMKKyAqIGZyb20gYmFzZSByZWxhdGlvbnMgdG8gY2FsY3VsYXRl IGNvbmRpdGlvbmFsIHByb2JhYmlsaXR5CisgKgorICogICAgUChqb2luIGNsYXVzZXMgfCBi YXNlcmVsIHJlc3RyaWN0aW9ucykKKyAqCisgKiB3aGljaCBzaG91bGQgYmUgYSBiZXR0ZXIg ZXN0aW1hdGUgdGhhbiBqdXN0IFAoam9pbiBjbGF1c2VzKS4gV2Ugd2FudCB0byBwaWNrCisg KiB0aGUgc3RhdGlzdGljcyBvYmplY3QgY292ZXJpbmcgdGhlIG1vc3Qgc3VjaCBjb25kaXRp b25zLgorICovCitMaXN0ICoKK3N0YXRleHRfZGV0ZXJtaW5lX2pvaW5fcmVzdHJpY3Rpb25z KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCisJCQkJCQkJCQlTdGF0aXN0 aWNFeHRJbmZvICppbmZvKQoreworCUxpc3RDZWxsICAgKmxjOworCUxpc3QJICAgKmNvbmRp dGlvbnMgPSBOSUw7CisKKwkvKiBleHRyYWN0IGNvbmRpdGlvbnMgdGhhdCBtYXkgYmUgYXBw bGllZCB0byB0aGUgTUNWIGxpc3QgKi8KKwlmb3JlYWNoIChsYywgcmVsLT5iYXNlcmVzdHJp Y3RpbmZvKQorCXsKKwkJUmVzdHJpY3RJbmZvICpyaW5mbyA9IChSZXN0cmljdEluZm8gKikg bGZpcnN0KGxjKTsKKwkJQml0bWFwc2V0ICppbmRleGVzID0gTlVMTDsKKwkJQml0bWFwc2V0 ICphdHRudW1zID0gTlVMTDsKKwkJTGlzdCAqZXhwcnMgPSBOSUw7CisKKwkJLyogY2xhdXNl IGhhcyB0byBiZSBzdXBwb3J0ZWQgYnkgTUNWIGluIGdlbmVyYWwgKi8KKwkJaWYgKCFzdGF0 ZXh0X2lzX2NvbXBhdGlibGVfY2xhdXNlKHJvb3QsIChOb2RlICopIHJpbmZvLCByZWwtPnJl bGlkLAorCQkJCQkJCQkJCSAgJmF0dG51bXMsICZleHBycykpCisJCQljb250aW51ZTsKKwor CQkvKgorCQkgKiBjbGF1c2UgaXMgY29tcGF0aWJsZSBpbiBnZW5lcmFsLCBidXQgaXMgaXQg YWN0dWFsbHkgY292ZXJlZAorCQkgKiBieSB0aGlzIHBhcnRpY3VsYXIgc3RhdGlzdGljcyBv YmplY3Q/CisJCSAqLworCQlpZiAoIWJtc19pc19zdWJzZXQoYXR0bnVtcywgaW5mby0+a2V5 cykgfHwKKwkJCSFzdGF0X2NvdmVyc19leHByZXNzaW9ucyhpbmZvLCBleHBycywgJmluZGV4 ZXMpKQorCQkJY29udGludWU7CisKKwkJY29uZGl0aW9ucyA9IGxhcHBlbmQoY29uZGl0aW9u cywgcmluZm8tPmNsYXVzZSk7CisJfQorCisJcmV0dXJuIGNvbmRpdGlvbnM7Cit9CisKKy8q CisgKiBzdGF0ZXh0X2lzX3N1cHBvcnRlZF9qb2luX2NsYXVzZQorICoJCUNoZWNrIGlmIGEg am9pbiBjbGF1c2UgbWF5IGJlIGVzdGltYXRlZCB1c2luZyBleHRlbmRlZCBzdGF0cy4KKyAq CisgKiBEZXRlcm1pbmVzIGlmIHRoaXMgaXMgYSBqb2luIGNsYXVzZSBvZiB0aGUgZm9ybSAo RXhwciBvcCBFeHByKSB3aGljaCBtYXkgYmUKKyAqIGVzdGltYXRlZCB1c2luZyBleHRlbmRl ZCBzdGF0aXN0aWNzLiBFYWNoIHNpZGUgbXVzdCByZWZlcmVuY2UganVzdCBhIHNpbmdsZQor ICogcmVsYXRpb24gZm9yIG5vdy4KKyAqCisgKiBTaW1pbGFyIHRvIHRyZWF0X2FzX2pvaW5f Y2xhdXNlLCBidXQgd2UgcGxhY2UgYWRkaXRpb25hbCByZXN0cmljdGlvbnMKKyAqIG9uIHRo ZSBjb25kaXRpb25zLgorICovCitzdGF0aWMgYm9vbAorc3RhdGV4dF9pc19zdXBwb3J0ZWRf am9pbl9jbGF1c2UoUGxhbm5lckluZm8gKnJvb3QsIE5vZGUgKmNsYXVzZSwKKwkJCQkJCQkJ IGludCB2YXJSZWxpZCwgU3BlY2lhbEpvaW5JbmZvICpzamluZm8pCit7CisJT2lkCW9wcnNl bDsKKwlSZXN0cmljdEluZm8gICAqcmluZm87CisJT3BFeHByCQkgICAqb3BjbGF1c2U7CisJ TGlzdENlbGwJICAgKmxjOworCisJLyoKKwkgKiBldmFsdWF0aW9uIGFzIGEgcmVzdHJpY3Rp b24gY2xhdXNlLCBlaXRoZXIgYXQgc2NhbiBub2RlIG9yIGZvcmNlZAorCSAqCisJICogWFhY IFNlZSB0cmVhdF9hc19qb2luX2NsYXVzZS4KKwkgKi8KKwlpZiAoKHZhclJlbGlkICE9IDAp IHx8IChzamluZm8gPT0gTlVMTCkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIFhYWCBDYW4g d2UgcmVseSBvbiBhbHdheXMgZ2V0dGluZyBSZXN0cmljdEluZm8gaGVyZT8gKi8KKwlpZiAo IUlzQShjbGF1c2UsIFJlc3RyaWN0SW5mbykpCisJCXJldHVybiBmYWxzZTsKKworCS8qIHN0 cmlwIHRoZSBSZXN0cmljdEluZm8gKi8KKwlyaW5mbyA9IChSZXN0cmljdEluZm8gKikgY2xh dXNlOworCWNsYXVzZSA9IChOb2RlICopIHJpbmZvLT5jbGF1c2U7CisKKwkvKiBpcyBpdCBy ZWZlcmVuY2luZyBtdWx0aXBsZSByZWxhdGlvbnM/ICovCisJaWYgKGJtc19tZW1iZXJzaGlw KHJpbmZvLT5jbGF1c2VfcmVsaWRzKSAhPSBCTVNfTVVMVElQTEUpCisJCXJldHVybiBmYWxz ZTsKKworCS8qIHdlIG9ubHkgc3VwcG9ydCBzaW1wbGUgb3BlcmF0b3IgY2xhdXNlcyBmb3Ig bm93ICovCisJaWYgKCFpc19vcGNsYXVzZShjbGF1c2UpKQorCQlyZXR1cm4gZmFsc2U7CisK KwlvcGNsYXVzZSA9IChPcEV4cHIgKikgY2xhdXNlOworCisJLyogZm9yIG5vdyB3ZSBvbmx5 IHN1cHBvcnQgZXN0aW1hdGluZyBlcXVpam9pbnMgKi8KKwlvcHJzZWwgPSBnZXRfb3Byam9p bihvcGNsYXVzZS0+b3Bubyk7CisKKwkvKiBoYXMgdG8gYmUgYW4gZXF1YWxpdHkgY29uZGl0 aW9uICovCisJaWYgKG9wcnNlbCAhPSBGX0VRSk9JTlNFTCkKKwkJcmV0dXJuIGZhbHNlOwor CisJLyoKKwkgKiBNYWtlIHN1cmUgd2UncmUgbm90IG1peGluZyB2YXJzIGZyb20gbXVsdGlw bGUgcmVsYXRpb25zIG9uIHRoZSBzYW1lCisJICogc2lkZSwgbGlrZQorCSAqCisJICogICAo dDEuYSArIHQyLmEpID0gKHQxLmIgKyB0Mi5iKQorCSAqCisJICogd2hpY2ggaXMgc3RpbGwg dGVjaG5pY2FsbHkgYW4gb3BjbGF1c2UsIGJ1dCB3ZSBjYW4ndCBtYXRjaCBpdCB0bworCSAq IGV4dGVuZGVkIHN0YXRpc3RpY3MgaW4gYSBzaW1wbGUgd2F5LgorCSAqCisJICogWFhYIFRo aXMgYWxzbyBtZWFucyB3ZSByZXF1aXJlIHJpbmZvLT5jbGF1c2VfcmVsaWRzIHRvIGhhdmUg MiByZWxzLgorCSAqCisJICogWFhYIEFsc28gY2hlY2sgaXQncyBub3QgZXhwcmVzc2lvbiBv biBzeXN0ZW0gYXR0cmlidXRlcywgd2hpY2ggd2UKKwkgKiBkb24ndCBhbGxvdyBpbiBleHRl bmRlZCBzdGF0aXN0aWNzLgorCSAqCisJICogWFhYIEFsdGhvdWdoIG1heWJlIHdlIGNvdWxk IGFsbG93IGNhc2VzIHRoYXQgY29tYmluZSBleHByZXNzaW9ucworCSAqIGZyb20gYm90aCBy ZWxhdGlvbnMgb24gZWl0aGVyIHNpZGU/IExpa2UgKHQxLmEgKyB0Mi5iID0gdDEuYyAtIHQy LmQpCisJICogb3Igc29tZXRoaW5nIGxpa2UgdGhhdC4gV2UgY291bGQgZG8gImNhcnRlc2lh biBwcm9kdWN0IiBvZiB0aGUgTUNWCisJICogc3RhdHMgYW5kIHJlc3RyaWN0IGl0IHVzaW5n IHRoaXMgY29uZGl0aW9uLgorCSAqLworCWZvcmVhY2ggKGxjLCBvcGNsYXVzZS0+YXJncykK Kwl7CisJCUJpdG1hcHNldCAqdmFybm9zID0gTlVMTDsKKwkJTm9kZSAqZXhwciA9IChOb2Rl ICopIGxmaXJzdChsYyk7CisKKwkJdmFybm9zID0gcHVsbF92YXJub3Mocm9vdCwgZXhwcik7 CisKKwkJLyoKKwkJICogTm8gYXJndW1lbnQgc2hvdWxkIHJlZmVyZW5jZSBtb3JlIHRoYW4g anVzdCBvbmUgcmVsYXRpb24uCisJCSAqCisJCSAqIFRoaXMgZWZmZWN0aXZlbHkgbWVhbnMg ZWFjaCBzaWRlIHJlZmVyZW5jZXMganVzdCB0d28gcmVsYXRpb25zLgorCQkgKiBJZiB0aGVy ZSdzIG5vIHJlbGF0aW9uIG9uIG9uZSBzaWRlLCBpdCdzIGEgQ29uc3QsIGFuZCB0aGUgb3Ro ZXIKKwkJICogc2lkZSBoYXMgdG8gYmUgZWl0aGVyIENvbnN0IG9yIEV4cHIgd2l0aCBhIHNp bmdsZSByZWwuIEluIHdoaWNoCisJCSAqIGNhc2UgaXQgY2FuJ3QgYmUgYSBqb2luIGNsYXVz ZS4KKwkJICovCisJCWlmIChibXNfbnVtX21lbWJlcnModmFybm9zKSA+IDEpCisJCQlyZXR1 cm4gZmFsc2U7CisKKwkJLyoKKwkJICogWFhYIE1heWJlIGNoZWNrIHRoYXQgYm90aCByZWxh dGlvbnMgaGF2ZSBleHRlbmRlZCBzdGF0aXN0aWNzCisJCSAqIChubyBwb2ludCBpbiBjb25z aWRlcmluZyB0aGUgY2xhdXNlIGFzIHVzZWZ1bCB3aXRob3V0IGl0KS4gQnV0CisJCSAqIHdl J2xsIGRvIHRoYXQgY2hlY2sgbGF0ZXIgYW55d2F5LCBzbyBrZWVwIHRoaXMgY2hlYXAuCisJ CSAqLworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKgorICogc3RhdGV4dF90cnlfam9p bl9lc3RpbWF0ZXMKKyAqCQlDaGVja3MgaWYgaXQncyB3b3J0aCBjb25zaWRlcmluZyBleHRl bmRlZCBzdGF0cyBvbiBqb2luIGVzdGltYXRlcy4KKyAqCisgKiBUaGlzIGlzIHN1cHBvc2Vk IHRvIGJlIGEgcXVpY2svY2hlYXAgY2hlY2sgdG8gZGVjaWRlIHdoZXRoZXIgdG8gZXhwZW5k CisgKiBtb3JlIGVmZm9ydCBvbiBhcHBseWluZyBleHRlbmRlZCBzdGF0aXN0aWNzIHRvIGpv aW4gY2xhdXNlcy4KKyAqLworYm9vbAorc3RhdGV4dF90cnlfam9pbl9lc3RpbWF0ZXMoUGxh bm5lckluZm8gKnJvb3QsIExpc3QgKmNsYXVzZXMsIGludCB2YXJSZWxpZCwKKwkJCQkJCSAg IEpvaW5UeXBlIGpvaW50eXBlLCBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbywKKwkJCQkJCSAg IEJpdG1hcHNldCAqZXN0aW1hdGVkY2xhdXNlcykKK3sKKwlpbnQJCQlsaXN0aWR4OworCWlu dAkJCWs7CisJTGlzdENlbGwgICAqbGM7CisJQml0bWFwc2V0ICAqcmVsaWRzID0gTlVMTDsK KworCS8qCisJICogWFhYIE5vdCBoYXZpbmcgdGhlc2UgdmFsdWVzIG1lYW5zIHRyZWF0X2Fz X2pvaW5fY2xhdXNlIHJldHVybnMgZmFsc2UsCisJICogc28gd2UncmUgbm90IHN1cHBvc2Vk IHRvIGhhbmRsZSBqb2luIGNsYXVzZXMgaGVyZS4gU28ganVzdCBiYWlsIG91dC4KKwkgKi8K KwlpZiAoKHZhclJlbGlkICE9IDApIHx8IChzamluZm8gPT0gTlVMTCkpCisJCXJldHVybiBm YWxzZTsKKworCS8qCisJICogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSB1bmVzdGltYXRlZCBq b2luIGNsYXVzZXMsIGNvbGxlY3QgcmVsaWRzLgorCSAqCisJICogWFhYIEN1cnJlbnRseSB0 aGlzIG9ubHkgYWxsb3dzIHNpbXBsZSBPcEV4cHIgZXF1YWxpdHkgY2xhdXNlcyB3aXRoIGVh Y2gKKwkgKiBhcmd1bWVudCByZWZlcnJpbmcgdG8gc2luZ2xlIHJlbGF0aW9uLCBBTkQtZWQg dG9nZXRoZXIuIE1heWJlIHdlIGNvdWxkCisJICogcmVsYXggdGhpcyBpbiB0aGUgZnV0dXJl LCBlLmcuIHRvIGFsbG93IG1vcmUgY29tcGxleCAoZGVlcGVyKSBleHByZXNzaW9ucworCSAq IGFuZCB0byBhbGxvdyBPUi1lZCBqb2luIGNsYXVzZXMgdG9vLiBBbmQgbWF5YmUgc3VwcG9y dGluZyBpbmVxdWFsaXRpZXMuCisJICoKKwkgKiBIYW5kbGluZyBtb3JlIGNvbXBsZXggZXhw cmVzc2lvbnMgc2VlbXMgc2ltcGxlIC0gd2UgYWxyZWFkeSBkbyB0aGF0IGZvcgorCSAqIGJh c2VyZWwgZXN0aW1hdGVzIGJ5IGJ1aWxkaW5nIHRoZSBtYXRjaCBiaXRtYXAgcmVjdXJzaXZl bHksIGFuZCB3ZSBjb3VsZAorCSAqIGRvIHNvbWV0aGluZyBzaW1pbGFyIGZvciBjb21iaW5h dGlvbnMgb2YgTUNWIGl0ZW1zIChhIGJpdCBsaWtlIGJ1aWxkaW5nCisJICogYSBzaW5nbGUg Yml0IGluIHRoZSBtYXRjaCBiaXRtYXApLiBUaGUgY2hhbGxlbmdlIGlzIHdoYXQgdG8gZG8g YWJvdXQgdGhlCisJICogcGFydCBub3QgcmVwcmVzZW50ZWQgYnkgTUNWLCB3aGljaCBpcyBu b3cgYmFzZWQgb24gbmRpc3RpbmN0IGVzdGltYXRlcy4KKwkgKi8KKwlsaXN0aWR4ID0gLTE7 CisJZm9yZWFjaCAobGMsIGNsYXVzZXMpCisJeworCQlOb2RlICpjbGF1c2UgPSAoTm9kZSAq KSBsZmlyc3QobGMpOworCQlSZXN0cmljdEluZm8gKnJpbmZvOworCisJCS8qIG5lZWRzIHRv IGhhcHBlbiBiZWZvcmUgc2tpcHBpbmcgYW55IGNsYXVzZXMgKi8KKwkJbGlzdGlkeCsrOwor CisJCS8qIFNraXAgY2xhdXNlcyB0aGF0IHdlcmUgYWxyZWFkeSBlc3RpbWF0ZWQuICovCisJ CWlmIChibXNfaXNfbWVtYmVyKGxpc3RpZHgsIGVzdGltYXRlZGNsYXVzZXMpKQorCQkJY29u dGludWU7CisKKwkJLyoKKwkJICogU2tpcCBjbGF1c2VzIHRoYXQgYXJlIG5vdCBqb2luIGNs YXVzZXMgb3IgdGhhdCB3ZSBkb24ndCBrbm93CisJCSAqIGhvdyB0byBoYW5kbGUgZXN0aW1h dGUgdXNpbmcgZXh0ZW5kZWQgc3RhdGlzdGljcy4KKwkJICovCisJCWlmICghc3RhdGV4dF9p c19zdXBwb3J0ZWRfam9pbl9jbGF1c2Uocm9vdCwgY2xhdXNlLCB2YXJSZWxpZCwgc2ppbmZv KSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFhYWCBXZSdyZSBndWFyYW50ZWVkIHRv IGhhdmUgUmVzdHJpY3RJbmZvIHRoYW5rcyB0byB0aGUgY2hlY2tzCisJCSAqIGluIHN0YXRl eHRfaXNfc3VwcG9ydGVkX2pvaW5fY2xhdXNlLgorCQkgKi8KKwkJcmluZm8gPSAoUmVzdHJp Y3RJbmZvICopIGNsYXVzZTsKKworCQkvKiBDb2xsZWN0IHJlbGlkcyBmcm9tIGFsbCB1c2Fi bGUgY2xhdXNlcy4gKi8KKwkJcmVsaWRzID0gYm1zX3VuaW9uKHJlbGlkcywgcmluZm8tPmNs YXVzZV9yZWxpZHMpOworCX0KKworCS8qIG5vIGpvaW4gY2xhdXNlcyBmb3VuZCwgZG9uJ3Qg dHJ5IGFwcGx5aW5nIGV4dGVuZGVkIHN0YXRzICovCisJaWYgKGJtc19udW1fbWVtYmVycyhy ZWxpZHMpID09IDApCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogV2UgZXhwZWN0IGVp dGhlciAwIG9yID49IDIgcmVsaWRzLCBhIGNhc2Ugd2l0aCAxIHJlbGlkIGluIGpvaW4gY2xh dXNlcworCSAqIHNob3VsZCBiZSBpbXBvc3NpYmxlLiBBbmQgd2UganVzdCBydWxlZCBvdXQg MCwgc28gdGhlcmUgYXJlIGF0IGxlYXN0IDIuCisJICovCisJQXNzZXJ0KGJtc19udW1fbWVt YmVycyhyZWxpZHMpID49IDIpOworCisJLyoKKwkgKiBDaGVjayB0aGF0IGF0IGxlYXN0IHNv bWUgb2YgdGhlIHJlbHMgcmVmZXJlbmNlZCBieSB0aGUgY2xhdXNlcyBoYXZlCisJICogZXh0 ZW5kZWQgc3RhdHMuCisJICoKKwkgKiBYWFggTWF5YmUgd2Ugc2hvdWxkIGNoZWNrIGhvdyBt YW55IHJlbHMgaGF2ZSBzdGF0cywgYW5kIGNyb3NzLWNoZWNrIGhvdworCSAqIGNvbXBhdGli bGUgdGhleSBhcmUgKGUuZy4gdGhhdCBib3RoIGhhdmUgTUNWcywgZXRjLikuIFdlIG1pZ2h0 IGFsc28KKwkgKiBjcm9zcy1jaGVjayB0aGUgZXhhY3Qgam9pbmVkIHBhaXJzIG9mIHJlbHMs IGJ1dCBpdCdzIHN1cHBvc2VkIHRvIGJlIGEKKwkgKiBjaGVhcCBjaGVjaywgc28gbWF5YmUg YmV0dGVyIGxlYXZlIHRoYXQgZm9yIGxhdGVyLgorCSAqCisJICogWFhYIFdlIGNvdWxkIGFs c28gY2hlY2sgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGluIGVhY2ggcmVsIHRvIGNvbnNp ZGVyCisJICogZXh0ZW5kZWQgc3RhdHMuIElmIHRoZXJlJ3MganVzdCBhIHNpbmdsZSBhdHRy aWJ1dGUsIGl0J3MgcG9pbnRsZXNzIHRvIHVzZQorCSAqIGV4dGVuZGVkIHN0YXRpc3RpY3Mu IE9UT0ggd2UgY2FuIGFsc28gY29uc2lkZXIgcmVzdHJpY3Rpb24gY2xhdXNlcyBmcm9tCisJ ICogYmFzZXJlc3RyaWN0aW5mbyBhbmQgdXNlIHRoZW0gdG8gY2FsY3VsYXRlIGNvbmRpdGlv bmFsIHByb2JhYmlsaXRpZXMuCisJICovCisJayA9IC0xOworCXdoaWxlICgoayA9IGJtc19u ZXh0X21lbWJlcihyZWxpZHMsIGspKSA+PSAwKQorCXsKKwkJUmVsT3B0SW5mbyAqcmVsID0g ZmluZF9iYXNlX3JlbChyb290LCBrKTsKKwkJaWYgKHJlbC0+c3RhdGxpc3QpCisJCQlyZXR1 cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBJbmZvcm1hdGlv biBhYm91dCB0d28gam9pbmVkIHJlbGF0aW9ucywgYWxvbmcgd2l0aCB0aGUgam9pbiBjbGF1 c2VzIGJldHdlZW4uCisgKi8KK3R5cGVkZWYgc3RydWN0IEpvaW5QYWlySW5mbworeworCUJp dG1hcHNldCAgKnJlbHM7CisJTGlzdAkgICAqY2xhdXNlczsKK30gSm9pblBhaXJJbmZvOwor CisvKgorICogc3RhdGV4dF9idWlsZF9qb2luX3BhaXJzCisgKgkJRXh0cmFjdCBwYWlycyBv ZiBqb2luZWQgcmVscyB3aXRoIGpvaW4gY2xhdXNlcyBmb3IgZWFjaCBwYWlyLgorICoKKyAq IFdhbGtzIHRoZSByZW1haW5pbmcgKG5vdCB5ZXQgZXN0aW1hdGVkKSBjbGF1c2VzLCBhbmQg c3BsaXRzIHRoZW0gaW50bworICogbGlzdHMgZm9yIGVhY2ggcGFpciBvZiBqb2luZWQgcmVs YXRpb25zLiBSZXR1cm5zIE5VTEwgaWYgdGhlcmUgYXJlIG5vCisgKiBzdWl0YWJsZSBqb2lu IHBhaXJzIHRoYXQgbWlnaHQgYmUgZXN0aW1hdGVkIHVzaW5nIGV4dGVuZGVkIHN0YXRzLgor ICoKKyAqIFhYWCBJdCdzIHBvc3NpYmxlIHRoZXJlIGFyZSBqb2luIGNsYXVzZXMsIGJ1dCB0 aGUgY2xhdXNlcyBhcmUgbm90CisgKiBzdXBwb3J0ZWQgYnkgdGhlIGV4dGVuZGVkIHN0YXRz IG1hY2hpbmVyeSAod2Ugb25seSBzdXBwb3J0IG9wY2xhdXNlcworICogd2l0aCBGX0VRSk9J TlNFTCBzZWxlY3Rpdml0eSBmdW5jdGlvbiBhdCB0aGUgbW9tZW50KS4KKyAqLworc3RhdGlj IEpvaW5QYWlySW5mbyAqCitzdGF0ZXh0X2J1aWxkX2pvaW5fcGFpcnMoUGxhbm5lckluZm8g KnJvb3QsIExpc3QgKmNsYXVzZXMsIGludCB2YXJSZWxpZCwKKwkJCQkJCSBKb2luVHlwZSBq b2ludHlwZSwgU3BlY2lhbEpvaW5JbmZvICpzamluZm8sCisJCQkJCQkgQml0bWFwc2V0ICpl c3RpbWF0ZWRjbGF1c2VzLCBpbnQgKm5wYWlycykKK3sKKwlpbnQJCQkJY250OworCWludAkJ CQlsaXN0aWR4OworCUpvaW5QYWlySW5mbyAgICppbmZvOworCUxpc3RDZWxsCSAgICpsYzsK KworCS8qCisJICogQXNzdW1lIGVhY2ggY2xhdXNlIGlzIGZvciBhIGRpZmZlcmVudCBwYWly IG9mIHJlbGF0aW9ucyAoc29tZSBvZiB0aGVtCisJICogbWlnaHQgYmUgYWxyZWFkeSBlc3Rp bWF0ZWQsIGJ1dCBtZWggLSB0aGVyZSBzaG91bGRuJ3QgYmUgdG9vIG1hbnkgb2YKKwkgKiB0 aGVtIGFuZCBpdCdzIGNoZWFwZXIgdGhhbiByZXBhbGxvYykuCisJICovCisJaW5mbyA9IChK b2luUGFpckluZm8gKikgcGFsbG9jMChzaXplb2YoSm9pblBhaXJJbmZvKSAqIGxpc3RfbGVu Z3RoKGNsYXVzZXMpKTsKKwljbnQgPSAwOworCisJbGlzdGlkeCA9IC0xOworCWZvcmVhY2go bGMsIGNsYXVzZXMpCisJeworCQlpbnQJCQkJaTsKKwkJYm9vbAkJCWZvdW5kOworCQlOb2Rl CQkgICAqY2xhdXNlID0gKE5vZGUgKikgbGZpcnN0KGxjKTsKKwkJUmVzdHJpY3RJbmZvICAg KnJpbmZvOworCisJCWxpc3RpZHgrKzsKKworCQkvKiBza2lwIGFscmVhZHkgZXN0aW1hdGVk IGNsYXVzZXMgKi8KKwkJaWYgKGJtc19pc19tZW1iZXIobGlzdGlkeCwgZXN0aW1hdGVkY2xh dXNlcykpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhlIGNsYXVz ZSBpcyBhIGpvaW4gY2xhdXNlIG9mIGEgc3VwcG9ydGVkIHNoYXBlIChhdAorCQkgKiB0aGUg bW9tZW50IHdlIHN1cHBvcnQganVzdCAoRXhwciBvcCBFeHByKSBjbGF1c2VzIHdpdGggZWFj aAorCQkgKiBzaWRlIHJlZmVyZW5jaW5nIGp1c3QgYSBzaW5nbGUgcmVsYXRpb24pLgorCQkg Ki8KKwkJaWYgKCFzdGF0ZXh0X2lzX3N1cHBvcnRlZF9qb2luX2NsYXVzZShyb290LCBjbGF1 c2UsIHZhclJlbGlkLCBzamluZm8pKQorCQkJY29udGludWU7CisKKwkJLyogc3RhdGV4dF9p c19zdXBwb3J0ZWRfam9pbl9jbGF1c2UgZ3VhcmFudGVlcyBSZXN0cmljdEluZm8gKi8KKwkJ cmluZm8gPSAoUmVzdHJpY3RJbmZvICopIGNsYXVzZTsKKwkJY2xhdXNlID0gKE5vZGUgKikg cmluZm8tPmNsYXVzZTsKKworCQkvKiBzZWFyY2ggZm9yIGEgbWF0Y2hpbmcgam9pbiBwYWly ICovCisJCWZvdW5kID0gZmFsc2U7CisJCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykKKwkJ eworCQkJaWYgKGJtc19pc19zdWJzZXQocmluZm8tPmNsYXVzZV9yZWxpZHMsIGluZm9baV0u cmVscykpCisJCQl7CisJCQkJaW5mb1tpXS5jbGF1c2VzID0gbGFwcGVuZChpbmZvW2ldLmNs YXVzZXMsIGNsYXVzZSk7CisJCQkJZm91bmQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQor CQl9CisKKwkJaWYgKCFmb3VuZCkKKwkJeworCQkJaW5mb1tjbnRdLnJlbHMgPSByaW5mby0+ Y2xhdXNlX3JlbGlkczsKKwkJCWluZm9bY250XS5jbGF1c2VzID0gbGFwcGVuZChpbmZvW2Nu dF0uY2xhdXNlcywgY2xhdXNlKTsKKwkJCWNudCsrOworCQl9CisJfQorCisJaWYgKGNudCA9 PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCSpucGFpcnMgPSBjbnQ7CisJcmV0dXJuIGluZm87 Cit9CisKKy8qCisgKiBleHRyYWN0X3JlbGF0aW9uX2luZm8KKyAqCQlFeHRyYWN0IGluZm9y bWF0aW9uIGFib3V0IGEgcmVsYXRpb24gaW4gYSBqb2luIHBhaXIuCisgKgorICogVGhlIHJl bGF0aW9uIGlzIGlkZW50aWZpZWQgYnkgaW5kZXggKGdlbmVyYWxseSAwIG9yIDEpLCBhbmQg cGlja3MgZXh0ZW5kZWQKKyAqIHN0YXRpc3RpY3Mgb2JqZWN0IGNvdmVyaW5nIHRoZSBqb2lu IGNsYXVzZXMgYW5kIGJhc2VyZWwgcmVzdHJpY3Rpb25zLgorICoKKyAqIFhYWCBDYW4gd2Ug aGF2ZSBjYXNlcyB3aXRoIGluZGV4ZXMgYWJvdmUgMT8gUHJvYmFibHkgZm9yIGNsYXVzZXMg bWl4aW5nCisgKiB2YXJzIGZyb20gMyByZWxhdGlvbnMsIGJ1dCBzdGF0ZXh0X2lzX3N1cHBv cnRlZF9qb2luX2NsYXVzZSByZWplY3RzIHRob3NlLgorICovCitzdGF0aWMgUmVsT3B0SW5m byAqCitleHRyYWN0X3JlbGF0aW9uX2luZm8oUGxhbm5lckluZm8gKnJvb3QsIEpvaW5QYWly SW5mbyAqaW5mbywgaW50IGluZGV4LAorCQkJCQkgIFN0YXRpc3RpY0V4dEluZm8gKipzdGF0 KQoreworCWludAkJCWs7CisJaW50CQkJcmVsaWQ7CisJUmVsT3B0SW5mbyAqcmVsOworCUxp c3RDZWxsICAgKmxjOworCUxpc3QJICAgKmV4cHJzID0gTklMOworCisJQml0bWFwc2V0ICAq YXR0bnVtcyA9IE5VTEw7CisKKwlBc3NlcnQoKGluZGV4ID49IDApICYmIChpbmRleCA8PSAx KSk7CisKKwlrID0gLTE7CisJd2hpbGUgKGluZGV4ID49IDApCisJeworCQlrID0gYm1zX25l eHRfbWVtYmVyKGluZm8tPnJlbHMsIGspOworCQlpZiAoayA8IDApCisJCQllbG9nKEVSUk9S LCAiZmFpbGVkIHRvIGV4dHJhY3QgcmVsaWQiKTsKKworCQlyZWxpZCA9IGs7CisJCWluZGV4 LS07CisJfQorCisJcmVsID0gZmluZF9iYXNlX3JlbChyb290LCByZWxpZCk7CisKKwkvKgor CSAqIFdhbGsgdGhlIGNsYXVzZXMgZm9yIHRoaXMgam9pbiBwYWlyLCBhbmQgZXh0cmFjdCBl eHByZXNzaW9ucyBhYm91dAorCSAqIHRoZSByZWxhdGlvbiBpZGVudGlmaWVkIGJ5IGluZGV4 IC8gcmVsaWQuIEZvciBzaW1wbGUgVmFycyB3ZSBleHRyYWN0CisJICogdGhlIGF0dG51bS4g T3RoZXJ3aXNlIHdlIGtlZXAgdGhlIHdob2xlIGV4cHJlc3Npb24uCisJICovCisJZm9yZWFj aCAobGMsIGluZm8tPmNsYXVzZXMpCisJeworCQlMaXN0Q2VsbCAqbGMyOworCQlOb2RlICpj bGF1c2UgPSAoTm9kZSAqKSBsZmlyc3QobGMpOworCQlPcEV4cHIgKm9wY2xhdXNlID0gKE9w RXhwciAqKSBjbGF1c2U7CisKKwkJLyogb25seSBvcGNsYXVzZXMgc3VwcG9ydGVkIGZvciBu b3cgKi8KKwkJQXNzZXJ0KGlzX29wY2xhdXNlKGNsYXVzZSkpOworCisJCWZvcmVhY2ggKGxj Miwgb3BjbGF1c2UtPmFyZ3MpCisJCXsKKwkJCU5vZGUgKmFyZyA9IChOb2RlICopIGxmaXJz dChsYzIpOworCQkJQml0bWFwc2V0ICp2YXJub3MgPSBOVUxMOworCisJCQkvKiBwbGFpbiBW YXIgcmVmZXJlbmNlcyAoYm9vbGVhbiBWYXJzIG9yIHJlY3Vyc2l2ZSBjaGVja3MpICovCisJ CQlpZiAoSXNBKGFyZywgVmFyKSkKKwkJCXsKKwkJCQlWYXIJCSAgICp2YXIgPSAoVmFyICop IGFyZzsKKworCQkJCS8qIElnbm9yZSB2YXJzIGZyb20gb3RoZXIgcmVsYXRpb25zLiAqLwor CQkJCWlmICh2YXItPnZhcm5vICE9IHJlbGlkKQorCQkJCQljb250aW51ZTsKKworCQkJCS8q IHdlIGFsc28gYmV0dGVyIGVuc3VyZSB0aGUgVmFyIGlzIGZyb20gdGhlIGN1cnJlbnQgbGV2 ZWwgKi8KKwkJCQlpZiAodmFyLT52YXJsZXZlbHN1cCA+IDApCisJCQkJCWNvbnRpbnVlOwor CisJCQkJLyogQWxzbyBza2lwIHN5c3RlbSBhdHRyaWJ1dGVzICh3ZSBkb24ndCBhbGxvdyBz dGF0cyBvbiB0aG9zZSkuICovCisJCQkJaWYgKCFBdHRyTnVtYmVySXNGb3JVc2VyRGVmaW5l ZEF0dHIodmFyLT52YXJhdHRubykpCisJCQkJCWVsb2coRVJST1IsICJ1bmV4cGVjdGVkIHN5 c3RlbSBhdHRyaWJ1dGUiKTsKKworCQkJCWF0dG51bXMgPSBibXNfYWRkX21lbWJlcihhdHRu dW1zLCB2YXItPnZhcmF0dG5vKTsKKworCQkJCS8qIERvbmUsIHByb2Nlc3MgdGhlIG5leHQg YXJndW1lbnQuICovCisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBPSywg aXQncyBhIG1vcmUgY29tcGxleCBleHByZXNzaW9uLCBzbyBjaGVjayBpZiBpdCBtYXRjaGVz CisJCQkgKiB0aGUgcmVsaWQgYW5kIG1heWJlIGtlZXAgaXQgYXMgYSB3aG9sZS4gSXQgc2hv dWxkIGJlCisJCQkgKiBjb21wYXRpYmxlIGJlY2F1c2Ugd2UgYWxyZWFkeSBjaGVja2VkIGl0 IHdoZW4gYnVpbGRpbmcgdGhlCisJCQkgKiBqb2luIHBhaXJzLgorCQkJICovCisJCQl2YXJu b3MgPSBwdWxsX3Zhcm5vcyhyb290LCBhcmcpOworCisJCQlpZiAocmVsaWQgPT0gYm1zX3Np bmdsZXRvbl9tZW1iZXIodmFybm9zKSkKKwkJCQlleHBycyA9IGxhcHBlbmQoZXhwcnMsIGFy Zyk7CisJCX0KKwl9CisKKwkqc3RhdCA9IHN0YXRleHRfZmluZF9tYXRjaGluZ19tY3Yocm9v dCwgcmVsLCBhdHRudW1zLCBleHBycyk7CisKKwlyZXR1cm4gcmVsOworfQorCisvKgorICog Z2V0X2V4cHJlc3Npb25fZm9yX3JlbAorICoJCUV4dHJhY3QgZXhwcmVzc2lvbiBmb3IgYSBn aXZlbiByZWxhdGlvbiBmcm9tIHRoZSBqb2luIGNsYXVzZS4KKyAqCisgKiBHaXZlbiBhIGpv aW4gY2xhdXNlIHN1cHBvcnRlZCBieSB0aGUgZXh0ZW5kZWQgc3RhdGlzdGljcyBvYmplY3Qg KGN1cnJlbnRseQorICogdGhhdCBtZWFucyBqdXN0IE9wRXhwciBjbGF1c2VzIHdpdGggZWFj aCBhcmd1bWVudCByZWZlcmVuY2luZyBzaW5nbGUgcmVsKSwKKyAqIHJldHVybiBlaXRoZXIg dGhlIGxlZnQgb3IgcmlnaHQgYXJndW1lbnQgZXhwcmVzc2lvbiBmb3IgdGhlIHJlbC4KKyAq CisgKiBYWFggVGhpcyBzaG91bGQgcHJvYmFibHkgcmV0dXJuIGEgZmxhZyBpZGVudGlmeWlu ZyB3aGV0aGVyIGl0J3MgdGhlCisgKiBsZWZ0IG9yIHJpZ2h0IGFyZ3VtZW50LgorICovCitz dGF0aWMgTm9kZSAqCitnZXRfZXhwcmVzc2lvbl9mb3JfcmVsKFBsYW5uZXJJbmZvICpyb290 LCBSZWxPcHRJbmZvICpyZWwsIE5vZGUgKmNsYXVzZSkKK3sKKwlPcEV4cHIgKm9wZXhwcjsK KwlOb2RlICAgKmV4cHI7CisKKwkvKgorCSAqIFN0cmlwIHRoZSBSZXN0cmljdEluZm8gbm9k ZSwgZ2V0IHRoZSBhY3R1YWwgY2xhdXNlLgorCSAqCisJICogWFhYIE5vdCBzdXJlIGlmIHdl IG5lZWQgdG8gY2FyZSBhYm91dCByZW1vdmluZyBvdGhlciBub2RlIHR5cGVzCisJICogdG9v IChlLmcuIFJlbGFiZWxUeXBlIGV0Yy4pLiBzdGF0ZXh0X2lzX3N1cHBvcnRlZF9qb2luX2Ns YXVzZQorCSAqIG1hdGNoZXMgdGhpcywgYnV0IG1heWJlIHdlIG5lZWQgdG8gcmVsYXggaXQ/ CisJICovCisJaWYgKElzQShjbGF1c2UsIFJlc3RyaWN0SW5mbykpCisJCWNsYXVzZSA9IChO b2RlICopICgoUmVzdHJpY3RJbmZvICopIGNsYXVzZSktPmNsYXVzZTsKKworCW9wZXhwciA9 IChPcEV4cHIgKikgY2xhdXNlOworCisJLyogTWFrZSBzdXJlIHdlIGhhdmUgdGhlIGV4cGVj dGVkIG5vZGUgdHlwZS4gKi8KKwlBc3NlcnQoaXNfb3BjbGF1c2UoY2xhdXNlKSk7CisJQXNz ZXJ0KGxpc3RfbGVuZ3RoKG9wZXhwci0+YXJncykgPT0gMik7CisKKwkvKiBGSVhNRSBzdHJp cCByZWxhYmVsIGV0Yy4gdGhlIHdheSBleGFtaW5lX29wY2xhdXNlX2FyZ3MgZG9lcyAqLwor CWV4cHIgPSBsaW5pdGlhbChvcGV4cHItPmFyZ3MpOworCWlmIChibXNfc2luZ2xldG9uX21l bWJlcihwdWxsX3Zhcm5vcyhyb290LCBleHByKSkgPT0gcmVsLT5yZWxpZCkKKwkJcmV0dXJu IGV4cHI7CisKKwlleHByID0gbHNlY29uZChvcGV4cHItPmFyZ3MpOworCWlmIChibXNfc2lu Z2xldG9uX21lbWJlcihwdWxsX3Zhcm5vcyhyb290LCBleHByKSkgPT0gcmVsLT5yZWxpZCkK KwkJcmV0dXJuIGV4cHI7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIHN0YXRleHRf Y2xhdXNlbGlzdF9qb2luX3NlbGVjdGl2aXR5CisgKgkJVXNlIGV4dGVuZGVkIHN0YXRzIHRv IGVzdGltYXRlIGpvaW4gY2xhdXNlcy4KKyAqCisgKiBYWFggSW4gcHJpbmNpcGxlLCB3ZSBz aG91bGQgbm90IHJlc3RyaWN0IHRoaXMgdG8gY2FzZXMgd2l0aCBtdWx0aXBsZQorICogam9p biBjbGF1c2VzIC0gd2Ugc2hvdWxkIGNvbnNpZGVyIGRlcGVuZGVuY2llcyB3aXRoIGNvbmRp dGlvbnMgYXQgdGhlCisgKiBiYXNlIHJlbGF0aW9ucywgaS5lLiBjYWxjdWxhdGUgUChqb2lu IGNsYXVzZSB8IGJhc2UgcmVzdHJpY3Rpb25zKS4KKyAqIEJ1dCBjdXJyZW50bHkgdGhhdCBk b2VzIG5vdCBoYXBwZW4sIGJlY2F1c2UgY2xhdXNlbGlzdF9zZWxlY3Rpdml0eV9leHQKKyAq IHRyZWF0cyBhIHNpbmdsZSBjbGF1c2UgYXMgYSBzcGVjaWFsIGNhc2UgKGFuZCB3ZSBkb24n dCBhcHBseSBleHRlbmRlZAorICogc3RhdGlzdGljcyBpbiB0aGF0IGNhc2UgeWV0KS4KKyAq LworU2VsZWN0aXZpdHkKK3N0YXRleHRfY2xhdXNlbGlzdF9qb2luX3NlbGVjdGl2aXR5KFBs YW5uZXJJbmZvICpyb290LCBMaXN0ICpjbGF1c2VzLCBpbnQgdmFyUmVsaWQsCisJCQkJCQkJ CQlKb2luVHlwZSBqb2ludHlwZSwgU3BlY2lhbEpvaW5JbmZvICpzamluZm8sCisJCQkJCQkJ CQlCaXRtYXBzZXQgKiplc3RpbWF0ZWRjbGF1c2VzKQoreworCWludAkJCWk7CisJaW50CQkJ bGlzdGlkeDsKKwlTZWxlY3Rpdml0eQlzID0gMS4wOworCisJSm9pblBhaXJJbmZvICppbmZv OworCWludAkJCQluaW5mbzsKKworCWlmICghY2xhdXNlcykKKwkJcmV0dXJuIDEuMDsKKwor CS8qIGV4dHJhY3QgcGFpcnMgb2Ygam9pbmVkIHJlbGF0aW9ucyBmcm9tIHRoZSBsaXN0IG9m IGNsYXVzZXMgKi8KKwlpbmZvID0gc3RhdGV4dF9idWlsZF9qb2luX3BhaXJzKHJvb3QsIGNs YXVzZXMsIHZhclJlbGlkLCBqb2ludHlwZSwgc2ppbmZvLAorCQkJCQkJCQkJKmVzdGltYXRl ZGNsYXVzZXMsICZuaW5mbyk7CisKKwkvKiBubyB1c2VmdWwgam9pbiBwYWlycyAqLworCWlm ICghaW5mbykKKwkJcmV0dXJuIDEuMDsKKworCS8qCisJICogUHJvY2VzcyB0aGUgam9pbiBw YWlycywgdHJ5IHRvIGZpbmQgYSBtYXRjaGluZyBNQ1Ygb24gZWFjaCBzaWRlLgorCSAqCisJ ICogWFhYIFRoZSBiYXNpYyBwcmluY2lwbGUgaXMgcXVpdGUgc2ltaWxhciB0byBlcWpvaW5z ZWxfaW5uZXIsIGkuZS4KKwkgKiB3ZSB0cnkgdG8gZmluZCBhIE1DViBvbiBib3RoIHNpZGVz IG9mIHRoZSBqb2luLCBhbmQgdXNlIGl0IHRvIGdldAorCSAqIGEgYmV0dGVyIGpvaW4gZXN0 aW1hdGUuIEl0J3MgYSBiaXQgbW9yZSBjb21wbGljYXRlZCwgYmVjYXVzZSB0aGVyZQorCSAq IG1pZ2h0IGJlIG11bHRpcGxlIE1DViBsaXN0cywgd2UgYWxzbyBuZWVkIG5kaXN0aW5jdCBl c3RpbWF0ZSwgYW5kCisJICogdGhlcmUgbWF5IGJlIGludGVyZXN0aW5nIGJhc2VyZXN0cmlj dGlvbnMgdG9vLgorCSAqCisJICogWFhYIEF0IHRoZSBtb21lbnQgd2Ugb25seSBoYW5kbGUg dGhlIGNhc2Ugd2l0aCBtYXRjaGluZyBNQ1ZzIG9uCisJICogYm90aCBzaWRlcywgYnV0IGl0 J2QgYmUgZ29vZCB0byBhbHNvIGhhbmRsZSBjYXNlIHdpdGgganVzdCBuZGlzdGluY3QKKwkg KiBzdGF0aXN0aWNzIGltcHJvdmluZyBuZGlzdGluY3QgZXN0aW1hdGVzLgorCSAqCisJICog WFhYIFdlIG1pZ2h0IGFsc28gaGFuZGxlIGNhc2VzIHdpdGggYSByZWd1bGFyIE1DViBvbiBv bmUgc2lkZSBhbmQKKwkgKiBhbiBleHRlbmRlZCBNQ1Ygb24gdGhlIG90aGVyIHNpZGUuCisJ ICoKKwkgKiBYWFggUGVyaGFwcyBpdCdkIGJlIGdvb2QgdG8gYWxzbyBoYW5kbGUgY2FzZSB3 aXRoIG9uZSBzaWRlIG9ubHkKKwkgKiBoYXZpbmcgInJlZ3VsYXIiIHN0YXRpc3RpY3MgKGUu Zy4gTUNWKSwgZXNwZWNpYWxseSBpbiBjYXNlcyB3aXRoCisJICogbm8gY29uZGl0aW9ucyBv biB0aGF0IHNpZGUgb2YgdGhlIGpvaW4gKHdoZXJlIHdlIGNhbid0IHVzZSB0aGUKKwkgKiBl eHRlbmRlZCBNQ1YgdG8gY2FsY3VsYXRlIGNvbmRpdGlvbmFsIHByb2JhYmlsaXR5KS4KKwkg Ki8KKwlmb3IgKGkgPSAwOyBpIDwgbmluZm87IGkrKykKKwl7CisJCUxpc3RDZWxsICpsYzsK KworCQlSZWxPcHRJbmZvICpyZWwxOworCQlSZWxPcHRJbmZvICpyZWwyOworCisJCVN0YXRp c3RpY0V4dEluZm8gKnN0YXQxOworCQlTdGF0aXN0aWNFeHRJbmZvICpzdGF0MjsKKworCQkv KiBleHRyYWN0IGluZm8gYWJvdXQgdGhlIGZpcnN0IHJlbGF0aW9uICovCisJCXJlbDEgPSBl eHRyYWN0X3JlbGF0aW9uX2luZm8ocm9vdCwgJmluZm9baV0sIDAsICZzdGF0MSk7CisKKwkJ LyogZXh0cmFjdCBpbmZvIGFib3V0IHRoZSBzZWNvbmQgcmVsYXRpb24gKi8KKwkJcmVsMiA9 IGV4dHJhY3RfcmVsYXRpb25faW5mbyhyb290LCAmaW5mb1tpXSwgMSwgJnN0YXQyKTsKKwor CQkvKgorCQkgKiBXZSBjYW4gaGFuZGxlIHRocmVlIGJhc2ljIGNhc2VzOgorCQkgKgorCQkg KiBhKSBFeHRlbmRlZCBzdGF0cyAod2l0aCBNQ1YpIG9uIGJvdGggc2lkZXMgaXMgYW4gaWRl YWwgY2FzZSwgYW5kIHdlCisJCSAqIGNhbiBzaW1wbHkgY29tYmluZSB0aGUgdHdvIE1DVnMs IHBvc3NpYmx5IHdpdGggYWRkaXRpb25hbCBjb25kaXRpb25zCisJCSAqIGZyb20gdGhlIHJl bGF0aW9ucy4KKwkJICoKKwkJICogYikgRXh0ZW5kZWQgc3RhdHMgb24gb25lIHNpZGUsIHJl Z3VsYXIgTUNWIG9uIHRoZSBvdGhlciBzaWRlICh0aGlzCisJCSAqIG1lYW5zIHRoZXJlJ3Mg anVzdCBvbmUgam9pbiBjbGF1c2UgLyBleHByZXNzaW9uKS4gSXQgYWxzbyBtZWFucyB0aGUK KwkJICogZXh0ZW5kZWQgc3RhdHMgbGlrZWx5IGNvdmVycyBhdCBsZWFzdCBvbmUgZXh0cmEg Y29uZGl0aW9uLCBvdGhlcndpc2UKKwkJICogd2UgY291bGQganVzdCB1c2UgcmVndWxhciBz dGF0aXN0aWNzLiBXZSBjYW4gY29tYmluZSB0aGUgc3RhdHMganVzdAorCQkgKiBzaW1pbGFy bHkgdG8gKGEpLgorCQkgKgorCQkgKiBjKSBObyBleHRlbmRlZCBzdGF0cyB3aXRoIE1DVi4g SWYgdGhlcmUgYXJlIG11bHRpcGxlIGpvaW4gY2xhdXNlcywKKwkJICogd2UgY2FuIHRyeSB1 c2luZyBuZGlzdGluY3QgY29lZmZpY2llbnRzIGFuZCBkbyB3aGF0IGVxam9pbnNlbCBkb2Vz LgorCQkgKgorCQkgKiBJZiBub25lIG9mIHRoZXNlIGFwcGxpZXMsIHdlIGZhbGxiYWNrIHRv IHRoZSByZWd1bGFyIHNlbGVjdGl2aXR5CisJCSAqIGVzdGltYXRpb24gaW4gZXFqb2luc2Vs LgorCQkgKi8KKwkJaWYgKHN0YXQxICYmIHN0YXQyKQorCQl7CisJCQlzICo9IG1jdl9jb21i aW5lX2V4dGVuZGVkKHJvb3QsIHJlbDEsIHJlbDIsIHN0YXQxLCBzdGF0MiwgaW5mb1tpXS5j bGF1c2VzKTsKKwkJfQorCQllbHNlIGlmIChzdGF0MSAmJiAobGlzdF9sZW5ndGgoaW5mb1tp XS5jbGF1c2VzKSA9PSAxKSkKKwkJeworCQkJLyogdHJ5IGZpbmRpbmcgTUNWIG9uIHRoZSBv dGhlciByZWxhdGlvbiAqLworCQkJVmFyaWFibGVTdGF0RGF0YQl2YXJkYXRhOworCQkJQXR0 U3RhdHNTbG90CQlzc2xvdDsKKwkJCUZvcm1fcGdfc3RhdGlzdGljCXN0YXRzID0gTlVMTDsK KwkJCWJvb2wJCQkJaGF2ZV9tY3ZzID0gZmFsc2U7CisJCQlOb2RlCQkJICAgKmNsYXVzZSA9 IGxpbml0aWFsKGluZm9baV0uY2xhdXNlcyk7CisJCQlOb2RlCQkJICAgKmV4cHIgPSBnZXRf ZXhwcmVzc2lvbl9mb3JfcmVsKHJvb3QsIHJlbDIsIGNsYXVzZSk7CisJCQlkb3VibGUJCQkJ bmQ7CisJCQlib29sCQkJCWlzZGVmYXVsdDsKKworCQkJZXhhbWluZV92YXJpYWJsZShyb290 LCBleHByLCAwLCAmdmFyZGF0YSk7CisKKwkJCW5kID0gZ2V0X3ZhcmlhYmxlX251bWRpc3Rp bmN0KCZ2YXJkYXRhLCAmaXNkZWZhdWx0KTsKKworCQkJbWVtc2V0KCZzc2xvdCwgMCwgc2l6 ZW9mKHNzbG90KSk7CisKKwkJCWlmIChIZWFwVHVwbGVJc1ZhbGlkKHZhcmRhdGEuc3RhdHNU dXBsZSkpCisJCQl7CisJCQkJLyogbm90ZSB3ZSBhbGxvdyB1c2Ugb2YgbnVsbGZyYWMgcmVn YXJkbGVzcyBvZiBzZWN1cml0eSBjaGVjayAqLworCQkJCXN0YXRzID0gKEZvcm1fcGdfc3Rh dGlzdGljKSBHRVRTVFJVQ1QodmFyZGF0YS5zdGF0c1R1cGxlKTsKKwkJCQkvKiBGSVhNRSBz aG91bGQgdGhpcyBjYWxsIHN0YXRpc3RpY19wcm9jX3NlY3VyaXR5X2NoZWNrIGxpa2UgZXFq b2luc2VsPyAqLworCQkJCWhhdmVfbWN2cyA9IGdldF9hdHRzdGF0c3Nsb3QoJnNzbG90LCB2 YXJkYXRhLnN0YXRzVHVwbGUsCisJCQkJCQkJCQkJCSBTVEFUSVNUSUNfS0lORF9NQ1YsIElu dmFsaWRPaWQsCisJCQkJCQkJCQkJCSBBVFRTVEFUU1NMT1RfVkFMVUVTIHwgQVRUU1RBVFNT TE9UX05VTUJFUlMpOworCQkJfQorCisJCQlpZiAoaGF2ZV9tY3ZzKQorCQkJCXMgKj0gbWN2 X2NvbWJpbmVfc2ltcGxlKHJvb3QsIHJlbDEsIHN0YXQxLCAmc3Nsb3QsCisJCQkJCQkJCQkJ c3RhdHMtPnN0YW51bGxmcmFjLCBuZCwgaXNkZWZhdWx0LCBjbGF1c2UpOworCisJCQlmcmVl X2F0dHN0YXRzc2xvdCgmc3Nsb3QpOworCisJCQlSZWxlYXNlVmFyaWFibGVTdGF0cyh2YXJk YXRhKTsKKworCQkJLyogbm8gc3RhdHMsIGRvbid0IG1hcmsgdGhlIGNsYXVzZXMgYXMgZXN0 aW1hdGVkICovCisJCQlpZiAoIWhhdmVfbWN2cykKKwkJCQljb250aW51ZTsKKwkJfQorCQll bHNlIGlmIChzdGF0MiAmJiAobGlzdF9sZW5ndGgoaW5mb1tpXS5jbGF1c2VzKSA9PSAxKSkK KwkJeworCQkJLyogdHJ5IGZpbmRpbmcgTUNWIG9uIHRoZSBvdGhlciByZWxhdGlvbiAqLwor CQkJVmFyaWFibGVTdGF0RGF0YQl2YXJkYXRhOworCQkJQXR0U3RhdHNTbG90CQlzc2xvdDsK KwkJCUZvcm1fcGdfc3RhdGlzdGljCXN0YXRzID0gTlVMTDsKKwkJCWJvb2wJCQkJaGF2ZV9t Y3ZzID0gZmFsc2U7CisJCQlOb2RlCQkJICAgKmNsYXVzZSA9IChOb2RlICopIGxpbml0aWFs KGluZm9baV0uY2xhdXNlcyk7CisJCQlOb2RlCQkJICAgKmV4cHIgPSBnZXRfZXhwcmVzc2lv bl9mb3JfcmVsKHJvb3QsIHJlbDEsIGNsYXVzZSk7CisJCQlkb3VibGUJCQkJbmQ7CisJCQli b29sCQkJCWlzZGVmYXVsdDsKKworCQkJZXhhbWluZV92YXJpYWJsZShyb290LCBleHByLCAw LCAmdmFyZGF0YSk7CisKKwkJCW5kID0gZ2V0X3ZhcmlhYmxlX251bWRpc3RpbmN0KCZ2YXJk YXRhLCAmaXNkZWZhdWx0KTsKKworCQkJbWVtc2V0KCZzc2xvdCwgMCwgc2l6ZW9mKHNzbG90 KSk7CisKKwkJCWlmIChIZWFwVHVwbGVJc1ZhbGlkKHZhcmRhdGEuc3RhdHNUdXBsZSkpCisJ CQl7CisJCQkJLyogbm90ZSB3ZSBhbGxvdyB1c2Ugb2YgbnVsbGZyYWMgcmVnYXJkbGVzcyBv ZiBzZWN1cml0eSBjaGVjayAqLworCQkJCXN0YXRzID0gKEZvcm1fcGdfc3RhdGlzdGljKSBH RVRTVFJVQ1QodmFyZGF0YS5zdGF0c1R1cGxlKTsKKwkJCQkvKiBGSVhNRSBzaG91bGQgdGhp cyBjYWxsIHN0YXRpc3RpY19wcm9jX3NlY3VyaXR5X2NoZWNrIGxpa2UgZXFqb2luc2VsPyAq LworCQkJCWhhdmVfbWN2cyA9IGdldF9hdHRzdGF0c3Nsb3QoJnNzbG90LCB2YXJkYXRhLnN0 YXRzVHVwbGUsCisJCQkJCQkJCQkJCSBTVEFUSVNUSUNfS0lORF9NQ1YsIEludmFsaWRPaWQs CisJCQkJCQkJCQkJCSBBVFRTVEFUU1NMT1RfVkFMVUVTIHwgQVRUU1RBVFNTTE9UX05VTUJF UlMpOworCQkJfQorCisJCQlpZiAoaGF2ZV9tY3ZzKQorCQkJCXMgKj0gbWN2X2NvbWJpbmVf c2ltcGxlKHJvb3QsIHJlbDIsIHN0YXQyLCAmc3Nsb3QsCisJCQkJCQkJCQkJc3RhdHMtPnN0 YW51bGxmcmFjLCBuZCwgaXNkZWZhdWx0LCBjbGF1c2UpOworCisJCQlmcmVlX2F0dHN0YXRz c2xvdCgmc3Nsb3QpOworCisJCQlSZWxlYXNlVmFyaWFibGVTdGF0cyh2YXJkYXRhKTsKKwor CQkJLyogbm8gc3RhdHMsIGRvbid0IG1hcmsgdGhlIGNsYXVzZXMgYXMgZXN0aW1hdGVkICov CisJCQlpZiAoIWhhdmVfbWN2cykKKwkJCQljb250aW51ZTsKKwkJfQorCQllbHNlCisJCQlj b250aW51ZTsKKworCQkvKgorCQkgKiBOb3cgbWFyayBhbGwgdGhlIGNsYXVzZXMgZm9yIHRo aXMgam9pbiBwYWlyIGFzIGVzdGltYXRlZC4KKwkJICoKKwkJICogWFhYIE1heWJlIHRyYWNr IHRoZSBpbmRleGVzIGluIEpvaW5QYWlySW5mbywgc28gdGhhdCB3ZSBjYW4KKwkJICogc2lt cGx5IHVuaW9uIHRoZSB0d28gYml0bWFwcywgd2l0aG91dCB0aGUgZXh0cmEgbWF0Y2hpbmcu CisJCSAqLworCQlmb3JlYWNoIChsYywgaW5mby0+Y2xhdXNlcykKKwkJeworCQkJTm9kZSAq Y2xhdXNlID0gKE5vZGUgKikgbGZpcnN0KGxjKTsKKwkJCUxpc3RDZWxsICpsYzI7CisKKwkJ CWxpc3RpZHggPSAtMTsKKwkJCWZvcmVhY2ggKGxjMiwgY2xhdXNlcykKKwkJCXsKKwkJCQlO b2RlICpjbGF1c2UyID0gKE5vZGUgKikgbGZpcnN0KGxjMik7CisJCQkJbGlzdGlkeCsrOwor CisJCQkJQXNzZXJ0KElzQShjbGF1c2UyLCBSZXN0cmljdEluZm8pKTsKKworCQkJCWNsYXVz ZTIgPSAoTm9kZSAqKSAoKFJlc3RyaWN0SW5mbyAqKSBjbGF1c2UyKS0+Y2xhdXNlOworCisJ CQkJaWYgKGVxdWFsKGNsYXVzZSwgY2xhdXNlMikpCisJCQkJeworCQkJCQkqZXN0aW1hdGVk Y2xhdXNlcyA9IGJtc19hZGRfbWVtYmVyKCplc3RpbWF0ZWRjbGF1c2VzLCBsaXN0aWR4KTsK KwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHM7Cit9CmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdGF0aXN0aWNzL21jdi5jIGIvc3JjL2JhY2tlbmQv c3RhdGlzdGljcy9tY3YuYwppbmRleCBiMzUwZmM1ZjdiMi4uNzc5YTRlNjEyMWEgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvbWN2LmMKKysrIGIvc3JjL2JhY2tlbmQv c3RhdGlzdGljcy9tY3YuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgImZ1bmNhcGku aCIKICNpbmNsdWRlICJub2Rlcy9ub2RlRnVuY3MuaCIKICNpbmNsdWRlICJvcHRpbWl6ZXIv Y2xhdXNlcy5oIgorI2luY2x1ZGUgIm9wdGltaXplci9vcHRpbWl6ZXIuaCIKICNpbmNsdWRl ICJzdGF0aXN0aWNzL2V4dGVuZGVkX3N0YXRzX2ludGVybmFsLmgiCiAjaW5jbHVkZSAic3Rh dGlzdGljcy9zdGF0aXN0aWNzLmgiCiAjaW5jbHVkZSAidXRpbHMvYXJyYXkuaCIKQEAgLTIx NTYsMyArMjE1Nyw3NTYgQEAgbWN2X2NsYXVzZV9zZWxlY3Rpdml0eV9vcihQbGFubmVySW5m byAqcm9vdCwgU3RhdGlzdGljRXh0SW5mbyAqc3RhdCwKIAogCXJldHVybiBzOwogfQorCisv KgorICogc3RhdGV4dF9jb21wYXJlX21jdnMKKyAqCQlDYWxjdWxhdGUgam9pbiBzZWxlY3Rp dml0eSB1c2luZyBleHRlbmRlZCBzdGF0aXN0aWNzLCBzaW1pbGFyIHRvCisgKgkJZXFqb2lu c2VsX2lubmVyLgorICoKKyAqIENvbnNpZGVycyByZXN0cmljdGlvbnMgb24gYmFzZSByZWxh dGlvbnMgdG9vLCBlc3NlbnRpYWxseSBjb21wdXRpbmcgYQorICogY29uZGl0aW9uYWwgcHJv YmFiaWxpdHkKKyAqCisgKglQKGpvaW4gY2xhdXNlcyB8IGJhc2VyZXN0cmljdGluZm9zIG9u IGVpdGhlciBzaWRlKQorICoKKyAqIENvbXBhcmVkIHRvIGVxam9pbnNlbF9pbm5lciB0aGVy ZSdzIGEgY291cGxlIHByb2JsZW1zLiBXaXRoIHBlci1jb2x1bW4gTUNWCisgKiBsaXN0cyBp dCdzIG9idmlvdXMgdGhhdCB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IHZhbHVlcyBub3QgY292 ZXJlZCBieSB0aGUgTUNWCisgKiBpcyAobmRpc3RpbmN0IC0gc2l6ZShNQ1YpKS4gV2l0aCBt dWx0aS1jb2x1bW4gTUNWcyBpdCdzIG5vdCB0aGF0IHNpbXBsZSwKKyAqIHBhcnRpY3VsYXJs eSB3aGVuIHRoZSBjb25kaXRpb25zIGFyZSBvbiBhIHN1YnNldCBvZiB0aGUgTUNWIGF0dHJp YnV0ZXMgYW5kL29yCisgKiBOVUxMcyBhcmUgaW52b2x2ZWQuIEUuZy4gd2l0aCBNQ1YgKGEs YixjKSBhbmQgY29uZGl0aW9ucyBvbiAoYSxiKSwgaXQncyBub3QKKyAqIGNsZWFyIGlmIHRo ZSBudW1iZXIgb2YgKGEsYikgY29tYmluYXRpb25zIG5vdCBjb3ZlcmVkIGJ5IHRoZSBNQ1Yg aXMKKyAqCisgKiAobmRpc3RpbmN0KGEsYikgLSBuZGlzdGluY3RfbWN2KGEsYikpCisgKgor ICogd2hlcmUgbmRpc3RpbmN0X21jdihhLGIpIGlzIHRoZSBudW1iZXIgb2YgZGlzdGluY3Qg KGEsYikgY29tYmluYXRpb25zCisgKiBpbmNsdWRlZCBpbiB0aGUgTUNWIGxpc3QuIFRoZXNl IGNvbWJpbmF0aW9ucyBtYXkgYmUgcHJlc2VudCBpbiB0aGUgcmVzdAorICogb2YgdGhlIGRh dGEgKG91dHNpZGUgTUNWKSwganVzdCB3aXRoIHNvbWUgZXh0cmEgdmFsdWVzIGluICJjIi4g U28gaW4KKyAqIHByaW5jaXBsZSB0aGVyZSBtYXkgYmUgYmV0d2VlbgorICoKKyAqIChuZGlz dGluY3QoYSxiKSAtIG5kaXN0aW5jdF9tY3YoYSxiKSkgYW5kIG5kaXN0aW5jdChhLGIpCisg KgorICogZGlzdGluY3QgdmFsdWVzIGluIHRoZSBwYXJ0IG9mIHRoZSBkYXRhIG5vdCBjb3Zl cmVkIGJ5IHRoZSBNQ1YuIFNvIHdlIG5lZWQKKyAqIHRvIHBpY2sgc29tZXRoaW5nIGluIGJl dHdlZW4sIHRoZXJlJ3Mgbm8gd2F5IHRvIGNhbGN1bGF0ZSB0aGlzIGFjY3VyYXRlbHkuCisg Ki8KK1NlbGVjdGl2aXR5CittY3ZfY29tYmluZV9leHRlbmRlZChQbGFubmVySW5mbyAqcm9v dCwgUmVsT3B0SW5mbyAqcmVsMSwgUmVsT3B0SW5mbyAqcmVsMiwKKwkJCQkJIFN0YXRpc3Rp Y0V4dEluZm8gKnN0YXQxLCBTdGF0aXN0aWNFeHRJbmZvICpzdGF0MiwKKwkJCQkJIExpc3Qg KmNsYXVzZXMpCit7CisJTGlzdENlbGwgICAqbGM7CisKKwlNQ1ZMaXN0ICAgICptY3YxLAor CQkJICAgKm1jdjI7CisJaW50CQkJaWR4LAorCQkJCWksCisJCQkJajsKKwlTZWxlY3Rpdml0 eSBzID0gMDsKKworCS8qIG1hdGNoIGJpdG1hcHMgYW5kIHNlbGVjdGl2aXR5IGZvciBiYXNl cmVsIGNvbmRpdGlvbnMgKGlmIGFueSkgKi8KKwlMaXN0ICAgKmV4cHJzMSA9IE5JTCwKKwkJ ICAgKmV4cHJzMiA9IE5JTDsKKwlMaXN0ICAgKmNvbmRpdGlvbnMxID0gTklMLAorCQkgICAq Y29uZGl0aW9uczIgPSBOSUw7CisJYm9vbCAgICpjbWF0Y2hlczEgPSBOVUxMLAorCQkgICAq Y21hdGNoZXMyID0gTlVMTDsKKworCWRvdWJsZQljc2VsMSA9IDEuMCwKKwkJCWNzZWwyID0g MS4wOworCisJYm9vbCAgICptYXRjaGVzMSA9IE5VTEwsCisJCSAgICptYXRjaGVzMiA9IE5V TEw7CisKKwkvKiBlc3RpbWF0ZXMgZm9yIHRoZSB0d28gcmVsYXRpb25zICovCisJZG91Ymxl CW1hdGNoZnJlcTEsCisJCQl1bm1hdGNoZnJlcTEsCisJCQlvdGhlcmZyZXExLAorCQkJbWN2 ZnJlcTEsCisJCQluZDEsCisJCQl0b3RhbHNlbDE7CisKKwlkb3VibGUgCW1hdGNoZnJlcTIs CisJCQl1bm1hdGNoZnJlcTIsCisJCQlvdGhlcmZyZXEyLAorCQkJbWN2ZnJlcTIsCisJCQlu ZDIsCisJCQl0b3RhbHNlbDI7CisKKwkvKiBpbmZvIGFib3V0IGNsYXVzZXMgYW5kIGhvdyB0 aGV5IG1hdGNoIHRvIE1DViBzdGF0cyAqLworCUZtZ3JJbmZvICAgKm9wcHJvY3M7CisJaW50 CQkgICAqaW5kZXhlczEsCisJCQkgICAqaW5kZXhlczI7CisJYm9vbAkgICAqcmV2ZXJzZTsK KworCS8qIHdlIHBpY2tlZCB0aGUgc3RhdHMgc28gdGhhdCB0aGV5IGhhdmUgTUNWIGVuYWJs ZWQgKi8KKwlBc3NlcnQoKHN0YXQxLT5raW5kID0gU1RBVFNfRVhUX01DVikgJiYgKHN0YXQy LT5raW5kID0gU1RBVFNfRVhUX01DVikpOworCisJbWN2MSA9IHN0YXRleHRfbWN2X2xvYWQo c3RhdDEtPnN0YXRPaWQpOworCW1jdjIgPSBzdGF0ZXh0X21jdl9sb2FkKHN0YXQyLT5zdGF0 T2lkKTsKKworCS8qIHNob3VsZCBvbmx5IGdldCBoZXJlIHdpdGggTUNWIG9uIGJvdGggc2lk ZXMgKi8KKwlBc3NlcnQobWN2MSAmJiBtY3YyKTsKKworCS8qIERldGVybWluZSB3aGljaCBi YXNlcmVsIGNsYXVzZXMgdG8gdXNlIGZvciBjb25kaXRpb25hbCBwcm9iYWJpbGl0eS4gKi8K Kwljb25kaXRpb25zMSA9IHN0YXRleHRfZGV0ZXJtaW5lX2pvaW5fcmVzdHJpY3Rpb25zKHJv b3QsIHJlbDEsIHN0YXQxKTsKKwljb25kaXRpb25zMiA9IHN0YXRleHRfZGV0ZXJtaW5lX2pv aW5fcmVzdHJpY3Rpb25zKHJvb3QsIHJlbDIsIHN0YXQyKTsKKworCS8qCisJICogQ2FsY3Vs YXRlIG1hdGNoIGJpdG1hcHMgZm9yIHJlc3RyaWN0aW9ucyBvbiBlaXRoZXIgc2lkZSBvZiB0 aGUgam9pbgorCSAqICh0aGVyZSBtYXkgYmUgbm9uZSwgaW4gd2hpY2ggY2FzZSB0aGlzIHdp bGwgYmUgTlVMTCkuCisJICovCisJaWYgKGNvbmRpdGlvbnMxKQorCXsKKwkJY21hdGNoZXMx ID0gbWN2X2dldF9tYXRjaF9iaXRtYXAocm9vdCwgY29uZGl0aW9uczEsCisJCQkJCQkJCQkJ IHN0YXQxLT5rZXlzLCBzdGF0MS0+ZXhwcnMsCisJCQkJCQkJCQkJIG1jdjEsIGZhbHNlKTsK KwkJY3NlbDEgPSBjbGF1c2VsaXN0X3NlbGVjdGl2aXR5KHJvb3QsIGNvbmRpdGlvbnMxLCBy ZWwxLT5yZWxpZCwgMCwgTlVMTCk7CisJfQorCisJaWYgKGNvbmRpdGlvbnMyKQorCXsKKwkJ Y21hdGNoZXMyID0gbWN2X2dldF9tYXRjaF9iaXRtYXAocm9vdCwgY29uZGl0aW9uczIsCisJ CQkJCQkJCQkJIHN0YXQyLT5rZXlzLCBzdGF0Mi0+ZXhwcnMsCisJCQkJCQkJCQkJIG1jdjIs IGZhbHNlKTsKKwkJY3NlbDIgPSBjbGF1c2VsaXN0X3NlbGVjdGl2aXR5KHJvb3QsIGNvbmRp dGlvbnMyLCByZWwyLT5yZWxpZCwgMCwgTlVMTCk7CisJfQorCisJLyoKKwkgKiBNYXRjaCBi aXRtYXBzIGZvciBtYXRjaGVzIGJldHdlZW4gTUNWIGVsZW1lbnRzLiBCeSBkZWZhdWx0IHRo ZXJlCisJICogYXJlIG5vIG1hdGNoZXMsIHNvIHdlIHNldCBhbGwgaXRlbXMgdG8gMC4KKwkg Ki8KKwltYXRjaGVzMSA9IChib29sICopIHBhbGxvYzAoc2l6ZW9mKGJvb2wpICogbWN2MS0+ bml0ZW1zKTsKKwltYXRjaGVzMiA9IChib29sICopIHBhbGxvYzAoc2l6ZW9mKGJvb2wpICog bWN2Mi0+bml0ZW1zKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBpbmZvcm1hdGlvbiBhYm91 dCBjbGF1c2VzIGFuZCBob3cgdGhleSBtYXRjaCB0byB0aGUgTUNWCisJICogc3RhdHMgd2Ug cGlja2VkLiBXZSBkbyB0aGlzIG9ubHkgb25jZSBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgbGlz dHMsCisJICogc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGRvIHRoYXQgZm9yIGVhY2ggTUNW IGl0ZW0gb3Igc28uCisJICovCisJb3Bwcm9jcyA9IChGbWdySW5mbyAqKSBwYWxsb2Moc2l6 ZW9mKEZtZ3JJbmZvKSAqIGxpc3RfbGVuZ3RoKGNsYXVzZXMpKTsKKwlpbmRleGVzMSA9IChp bnQgKikgcGFsbG9jKHNpemVvZihpbnQpICogbGlzdF9sZW5ndGgoY2xhdXNlcykpOworCWlu ZGV4ZXMyID0gKGludCAqKSBwYWxsb2Moc2l6ZW9mKGludCkgKiBsaXN0X2xlbmd0aChjbGF1 c2VzKSk7CisJcmV2ZXJzZSA9IChib29sICopIHBhbGxvYyhzaXplb2YoYm9vbCkgKiBsaXN0 X2xlbmd0aChjbGF1c2VzKSk7CisKKwlpZHggPSAwOworCWZvcmVhY2ggKGxjLCBjbGF1c2Vz KQorCXsKKwkJTm9kZQkgICAqY2xhdXNlID0gKE5vZGUgKikgbGZpcnN0KGxjKTsKKwkJT3BF eHByCSAgICpvcGV4cHI7CisJCU5vZGUJICAgKmV4cHIxLAorCQkJCSAgICpleHByMjsKKwkJ Qml0bWFwc2V0ICAqcmVsaWRzMSwKKwkJCQkgICAqcmVsaWRzMjsKKworCQkvKgorCQkgKiBT dHJpcCB0aGUgUmVzdHJpY3RJbmZvIG5vZGUsIGdldCB0aGUgYWN0dWFsIGNsYXVzZS4KKwkJ ICoKKwkJICogWFhYIE5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gY2FyZSBhYm91dCByZW1vdmlu ZyBvdGhlciBub2RlIHR5cGVzCisJCSAqIHRvbyAoZS5nLiBSZWxhYmVsVHlwZSBldGMuKS4g c3RhdGV4dF9pc19zdXBwb3J0ZWRfam9pbl9jbGF1c2UKKwkJICogbWF0Y2hlcyB0aGlzLCBi dXQgbWF5YmUgd2UgbmVlZCB0byByZWxheCBpdD8KKwkJICovCisJCWlmIChJc0EoY2xhdXNl LCBSZXN0cmljdEluZm8pKQorCQkJY2xhdXNlID0gKE5vZGUgKikgKChSZXN0cmljdEluZm8g KikgY2xhdXNlKS0+Y2xhdXNlOworCisJCW9wZXhwciA9IChPcEV4cHIgKikgY2xhdXNlOwor CisJCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBleHBlY3RlZCBub2RlIHR5cGUuICovCisJ CUFzc2VydChpc19vcGNsYXVzZShjbGF1c2UpKTsKKwkJQXNzZXJ0KGxpc3RfbGVuZ3RoKG9w ZXhwci0+YXJncykgPT0gMik7CisKKwkJZm1ncl9pbmZvKGdldF9vcGNvZGUob3BleHByLT5v cG5vKSwgJm9wcHJvY3NbaWR4XSk7CisKKwkJLyogRklYTUUgc3RyaXAgcmVsYWJlbCBldGMu IHRoZSB3YXkgZXhhbWluZV9vcGNsYXVzZV9hcmdzIGRvZXMgKi8KKwkJZXhwcjEgPSBsaW5p dGlhbChvcGV4cHItPmFyZ3MpOworCQlleHByMiA9IGxzZWNvbmQob3BleHByLT5hcmdzKTsK KworCQkvKiBkZXRlcm1pbmUgb3JkZXIgb2YgY2xhdXNlcyAocmVsMSBvcCByZWwyKSBvciAo cmVsMiBvcCByZWwxKSAqLworCQlyZWxpZHMxID0gcHVsbF92YXJub3Mocm9vdCwgZXhwcjEp OworCQlyZWxpZHMyID0gcHVsbF92YXJub3Mocm9vdCwgZXhwcjIpOworCisJCWlmICgoYm1z X3NpbmdsZXRvbl9tZW1iZXIocmVsaWRzMSkgPT0gcmVsMS0+cmVsaWQpICYmCisJCQkoYm1z X3NpbmdsZXRvbl9tZW1iZXIocmVsaWRzMikgPT0gcmVsMi0+cmVsaWQpKQorCQl7CisJCQlP aWQJCWNvbGxpZDsKKworCQkJaW5kZXhlczFbaWR4XSA9IG1jdl9tYXRjaF9leHByZXNzaW9u KGV4cHIxLAorCQkJCQkJCQkJCQkJIHN0YXQxLT5rZXlzLCBzdGF0MS0+ZXhwcnMsCisJCQkJ CQkJCQkJCQkgJmNvbGxpZCk7CisJCQlpbmRleGVzMltpZHhdID0gbWN2X21hdGNoX2V4cHJl c3Npb24oZXhwcjIsCisJCQkJCQkJCQkJCQkgc3RhdDItPmtleXMsIHN0YXQyLT5leHBycywK KwkJCQkJCQkJCQkJCSAmY29sbGlkKTsKKwkJCXJldmVyc2VbaWR4XSA9IGZhbHNlOworCisJ CQlleHByczEgPSBsYXBwZW5kKGV4cHJzMSwgZXhwcjEpOworCQkJZXhwcnMyID0gbGFwcGVu ZChleHByczIsIGV4cHIyKTsKKwkJfQorCQllbHNlIGlmICgoYm1zX3NpbmdsZXRvbl9tZW1i ZXIocmVsaWRzMikgPT0gcmVsMS0+cmVsaWQpICYmCisJCQkJIChibXNfc2luZ2xldG9uX21l bWJlcihyZWxpZHMxKSA9PSByZWwyLT5yZWxpZCkpCisJCXsKKwkJCU9pZAkJY29sbGlkOwor CisJCQlpbmRleGVzMVtpZHhdID0gbWN2X21hdGNoX2V4cHJlc3Npb24oZXhwcjIsCisJCQkJ CQkJCQkJCQkgc3RhdDItPmtleXMsIHN0YXQyLT5leHBycywKKwkJCQkJCQkJCQkJCSAmY29s bGlkKTsKKwkJCWluZGV4ZXMyW2lkeF0gPSBtY3ZfbWF0Y2hfZXhwcmVzc2lvbihleHByMSwK KwkJCQkJCQkJCQkJCSBzdGF0MS0+a2V5cywgc3RhdDEtPmV4cHJzLAorCQkJCQkJCQkJCQkJ ICZjb2xsaWQpOworCQkJcmV2ZXJzZVtpZHhdID0gdHJ1ZTsKKworCQkJZXhwcnMxID0gbGFw cGVuZChleHByczEsIGV4cHIyKTsKKwkJCWV4cHJzMiA9IGxhcHBlbmQoZXhwcnMyLCBleHBy MSk7CisJCX0KKwkJZWxzZQorCQkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJQXNz ZXJ0KGZhbHNlKTsKKworCQlBc3NlcnQoKGluZGV4ZXMxW2lkeF0gPj0gMCkgJiYKKwkJCSAg IChpbmRleGVzMVtpZHhdIDwgYm1zX251bV9tZW1iZXJzKHN0YXQxLT5rZXlzKSArIGxpc3Rf bGVuZ3RoKHN0YXQxLT5leHBycykpKTsKKworCQlBc3NlcnQoKGluZGV4ZXMyW2lkeF0gPj0g MCkgJiYKKwkJCSAgIChpbmRleGVzMltpZHhdIDwgYm1zX251bV9tZW1iZXJzKHN0YXQyLT5r ZXlzKSArIGxpc3RfbGVuZ3RoKHN0YXQyLT5leHBycykpKTsKKworCQlpZHgrKzsKKwl9CisK KwkvKgorCSAqIE1hdGNoIGl0ZW1zIGJldHdlZW4gdGhlIHR3byBNQ1YgbGlzdHMuCisJICoK KwkgKiBXZSBkb24ndCBrbm93IGlmIHRoZSBqb2luIGNvbmRpdGlvbnMgbWF0Y2ggYWxsIGF0 dHJpYnV0ZXMgaW4gdGhlIE1DViwgdGhlCisJICogb3ZlcmxhcCBtYXkgYmUganVzdCBvbiBh IHN1YnNldCBvZiBhdHRyaWJ1dGVzLCBlLmcuIChhLGIsYykgdnMuIChiLGMsZCkuCisJICog U28gdGhlcmUgbWF5IGJlIG11bHRpcGxlIG1hdGNoZXMgb24gZWl0aGVyIHNpZGUuIFNvIHdl IGNhbid0IG9wdGltaXplIGJ5CisJICogYWJvcnRpbmcgdGhlIGlubmVyIGxvb3AgYWZ0ZXIg dGhlIGZpcnN0IG1hdGNoLCBldGMuCisJICoKKwkgKiBYWFggV2UgY2FuIHNraXAgdGhlIGl0 ZW1zIGVsaW1pbmF0ZWQgYnkgdGhlIGJhc2UgcmVzdHJpY3Rpb25zLCBvZiBjb3Vyc2UuCisJ ICoKKwkgKiBYWFggV2UgbWlnaHQgb3B0aW1pemUgdGhpcyBpbiB0d28gd2F5cy4gV2UgbWln aHQgc29ydCB0aGUgTUNWIGl0ZW1zIG9uCisJICogYm90aCBzaWRlcyB1c2luZyB0aGUgImpv aW4iIGF0dHJpYnV0ZXMsIGFuZCB0aGVuIHBlcmZvcm0gc29tZXRoaW5nIGxpa2UKKwkgKiBt ZXJnZSBqb2luLiBPciB3ZSBtaWdodCBjYWxjdWxhdGUgYSBoYXNoIGZyb20gdGhlIGpvaW4g Y29sdW1ucywgYW5kIHRoZW4KKwkgKiBjb21wYXJlIHRoaXMgKHRvIGVsaW1pbmF0ZSB0aGUg bW9zdCBleHBlbnNpdmUgZXF1YWxpdHkgZnVuY3Rpb25zKS4KKwkgKi8KKwlmb3IgKGkgPSAw OyBpIDwgbWN2MS0+bml0ZW1zOyBpKyspCisJeworCQlib29sCWhhc19udWxsczsKKworCQkv KiBza2lwIGl0ZW1zIGVsaW1pbmF0ZWQgYnkgcmVzdHJpY3Rpb25zIG9uIHJlbDEgKi8KKwkJ aWYgKGNtYXRjaGVzMSAmJiAhY21hdGNoZXMxW2ldKQorCQkJY29udGludWU7CisKKwkJLyoK KwkJICogQ2hlY2sgaWYgYW55IHZhbHVlIGluIHRoZSBmaXJzdCBNQ1YgaXRlbSBpcyBOVUxM LCBiZWNhdXNlIGl0J2xsIGJlCisJCSAqIG1pc21hdGNoIGFueXdheS4KKwkJICoKKwkJICog WFhYIFRoaXMgbWlnaHQgbm90IHdvcmsgZm9yIHNvbWUgam9pbiBjbGF1c2VzLCBlLmcuIElT IE5PVCBESVNUSU5DVAorCQkgKiBGUk9NLCBidXQgdGhvc2UgYXJlIGN1cnJlbnRseSBub3Qg Y29uc2lkZXJlZCBjb21wYXRpYmxlICh3ZSBvbmx5CisJCSAqIGFsbG93IE9wRXhwciBhdCB0 aGUgbW9tZW50KS4KKwkJICovCisJCWhhc19udWxscyA9IGZhbHNlOworCQlmb3IgKGogPSAw OyBqIDwgbGlzdF9sZW5ndGgoY2xhdXNlcyk7IGorKykKKwkJCWhhc19udWxscyB8PSBtY3Yx LT5pdGVtc1tpXS5pc251bGxbaW5kZXhlczFbal1dOworCisJCWlmIChoYXNfbnVsbHMpCisJ CQljb250aW51ZTsKKworCQkvKiBmaW5kIG1hdGNoZXMgaW4gdGhlIHNlY29uZCBNQ1YgbGlz dCAqLworCQlmb3IgKGogPSAwOyBqIDwgbWN2Mi0+bml0ZW1zOyBqKyspCisJCXsKKwkJCWlu dAkJCWlkeDsKKwkJCWJvb2wJCWl0ZW1zX21hdGNoID0gdHJ1ZTsKKworCQkJLyogc2tpcCBp dGVtcyBlbGltaW5hdGVkIGJ5IHJlc3RyaWN0aW9ucyBvbiByZWwyICovCisJCQlpZiAoY21h dGNoZXMyICYmICFjbWF0Y2hlczJbal0pCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkg KiBYWFggV2UgY2FuJ3Qgc2tpcCBiYXNlZCBvbiBleGlzdGluZyBtYXRjaGVzMiB2YWx1ZSwg YmVjYXVzZSB0aGVyZQorCQkJICogbWF5IGJlIGR1cGxpY2F0ZXMgaW4gdGhlIGZpcnN0IE1D Vi4KKwkJCSAqLworCisJCQkvKgorCQkJICogRXZhbHVhdGUgaWYgYWxsIHRoZSBqb2luIGNs YXVzZXMgbWF0Y2ggYmV0d2VlbiB0aGUgdHdvIE1DViBpdGVtcy4KKwkJCSAqCisJCQkgKiBY WFggV2UgbWlnaHQgb3B0aW1pemUgdGhlIG9yZGVyIG9mIGV2YWx1YXRpb24sIHVzaW5nIHRo ZSBjb3N0cyBvZgorCQkJICogb3BlcmF0b3IgZnVuY3Rpb25zIGZvciBpbmRpdmlkdWFsIGNv bHVtbnMuIEl0IGRvZXMgZGVwZW5kIG9uIHRoZQorCQkJICogbnVtYmVyIG9mIGRpc3RpbmN0 IHZhbHVlcywgZXRjLgorCQkJICovCisJCQlpZHggPSAwOworCQkJZm9yZWFjaCAobGMsIGNs YXVzZXMpCisJCQl7CisJCQkJYm9vbAltYXRjaDsKKwkJCQlpbnQJCWluZGV4MSA9IGluZGV4 ZXMxW2lkeF0sCisJCQkJCQlpbmRleDIgPSBpbmRleGVzMltpZHhdOworCQkJCURhdHVtCXZh bHVlMSwKKwkJCQkJCXZhbHVlMjsKKwkJCQlib29sCXJldmVyc2VfYXJncyA9IHJldmVyc2Vb aWR4XTsKKworCQkJCS8qIElmIGVpdGhlciB2YWx1ZSBpcyBudWxsLCBpdCdzIGEgbWlzbWF0 Y2ggKi8KKwkJCQlpZiAobWN2Mi0+aXRlbXNbal0uaXNudWxsW2luZGV4Ml0pCisJCQkJCW1h dGNoID0gZmFsc2U7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJdmFsdWUxID0gbWN2MS0+aXRl bXNbaV0udmFsdWVzW2luZGV4MV07CisJCQkJCXZhbHVlMiA9IG1jdjItPml0ZW1zW2pdLnZh bHVlc1tpbmRleDJdOworCisJCQkJCS8qCisJCQkJCSAqIENhcmVmdWwgYWJvdXQgb3JkZXIg b2YgcGFyYW1ldGVycy4gRm9yIHNhbWUtdHlwZSBlcXVhbGl0eQorCQkJCQkgKiB0aGF0IHNo b3VsZCBub3QgbWF0dGVyLCBidXQgZWFzeSBlbm91Z2guCisJCQkJCSAqCisJCQkJCSAqIEZJ WE1FIFVzZSBhcHByb3ByaWF0ZSBjb2xsYXRpb24uCisJCQkJCSAqLworCQkJCQlpZiAocmV2 ZXJzZV9hcmdzKQorCQkJCQkJbWF0Y2ggPSBEYXR1bUdldEJvb2woRnVuY3Rpb25DYWxsMkNv bGwoJm9wcHJvY3NbaWR4XSwKKwkJCQkJCQkJCQkJCQkJCSAgIEludmFsaWRPaWQsCisJCQkJ CQkJCQkJCQkJCQkgICB2YWx1ZTIsIHZhbHVlMSkpOworCQkJCQllbHNlCisJCQkJCQltYXRj aCA9IERhdHVtR2V0Qm9vbChGdW5jdGlvbkNhbGwyQ29sbCgmb3Bwcm9jc1tpZHhdLAorCQkJ CQkJCQkJCQkJCQkJICAgSW52YWxpZE9pZCwKKwkJCQkJCQkJCQkJCQkJCSAgIHZhbHVlMSwg dmFsdWUyKSk7CisJCQkJfQorCisJCQkJaXRlbXNfbWF0Y2ggJj0gbWF0Y2g7CisKKwkJCQlp ZiAoIWl0ZW1zX21hdGNoKQorCQkJCQlicmVhazsKKworCQkJCWlkeCsrOworCQkJfQorCisJ CQlpZiAoaXRlbXNfbWF0Y2gpCisJCQl7CisJCQkJLyogWFhYIERvIHdlIG5lZWQgdG8gZG8g c29tZXRoaW5nIGFib3V0IGJhc2UgZnJlcXVlbmN5PyAqLworCQkJCW1hdGNoZXMxW2ldID0g bWF0Y2hlczJbal0gPSB0cnVlOworCQkJCXMgKz0gbWN2MS0+aXRlbXNbaV0uZnJlcXVlbmN5 ICogbWN2Mi0+aXRlbXNbal0uZnJlcXVlbmN5OworCQkJfQorCQl9CisJfQorCisJbWF0Y2hm cmVxMSA9IHVubWF0Y2hmcmVxMSA9IG1jdmZyZXExID0gMC4wOworCWZvciAoaSA9IDA7IGkg PCBtY3YxLT5uaXRlbXM7IGkrKykKKwl7CisJCW1jdmZyZXExICs9IG1jdjEtPml0ZW1zW2ld LmZyZXF1ZW5jeTsKKworCQkvKiBpZ25vcmUgTUNWIGl0ZW1zIGVsaW1pbmF0ZWQgYnkgYmFz ZXJlbCBjb25kaXRpb25zICovCisJCWlmIChjbWF0Y2hlczEgJiYgIWNtYXRjaGVzMVtpXSkK KwkJCWNvbnRpbnVlOworCisJCWlmIChtYXRjaGVzMVtpXSkKKwkJCW1hdGNoZnJlcTEgKz0g bWN2MS0+aXRlbXNbaV0uZnJlcXVlbmN5OworCQllbHNlCisJCQl1bm1hdGNoZnJlcTEgKz0g bWN2MS0+aXRlbXNbaV0uZnJlcXVlbmN5OworCX0KKworCS8qIG5vdCByZXByZXNlbnRlZCBi eSB0aGUgTUNWICovCisJb3RoZXJmcmVxMSA9IDEuMCAtIG1jdmZyZXExOworCisJbWF0Y2hm cmVxMiA9IHVubWF0Y2hmcmVxMiA9IG1jdmZyZXEyID0gMC4wOworCWZvciAoaSA9IDA7IGkg PCBtY3YyLT5uaXRlbXM7IGkrKykKKwl7CisJCW1jdmZyZXEyICs9IG1jdjItPml0ZW1zW2ld LmZyZXF1ZW5jeTsKKworCQkvKiBpZ25vcmUgTUNWIGl0ZW1zIGVsaW1pbmF0ZWQgYnkgYmFz ZXJlbCBjb25kaXRpb25zICovCisJCWlmIChjbWF0Y2hlczIgJiYgIWNtYXRjaGVzMltpXSkK KwkJCWNvbnRpbnVlOworCisJCWlmIChtYXRjaGVzMltpXSkKKwkJCW1hdGNoZnJlcTIgKz0g bWN2Mi0+aXRlbXNbaV0uZnJlcXVlbmN5OworCQllbHNlCisJCQl1bm1hdGNoZnJlcTIgKz0g bWN2Mi0+aXRlbXNbaV0uZnJlcXVlbmN5OworCX0KKworCS8qIG5vdCByZXByZXNlbnRlZCBi eSB0aGUgTUNWICovCisJb3RoZXJmcmVxMiA9IDEuMCAtIG1jdmZyZXEyOworCisJLyoKKwkg KiBDb3JyZWN0aW9uIGZvciBNQ1YgcGFydHMgZWxpbWluYXRlZCBieSB0aGUgY29uZGl0aW9u cy4KKwkgKgorCSAqIFdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBhYm91dCBjYXNlcyB3aGVyZSBj b25kaXRpb25zIGVsaW1pbmF0ZWQgYWxsCisJICogdGhlIE1DViBpdGVtcy4gV2UgbXVzdCBu b3QgZGl2aWRlIGJ5IDAuMCwgYmVjYXVzZSB0aGF0IHdvdWxkIGVpdGhlcgorCSAqIHByb2R1 Y2UgYm9ndXMgdmFsdWUgb3IgdHJpZ2dlciBkaXZpc2lvbiBieSB6ZXJvLiBJbnN0ZWFkIHdl IHNpbXBseQorCSAqIHNldCB0aGUgc2VsZWN0aXZpdHkgdG8gMC4wLCBiZWNhdXNlIHRoZXJl IGNhbid0IGJlIGFueSBtYXRjaGVzLgorCSAqLworCWlmICgobWF0Y2hmcmVxMSArIHVubWF0 Y2hmcmVxMSkgPiAwKQorCQlzID0gcyAqIG1jdmZyZXExIC8gKG1hdGNoZnJlcTEgKyB1bm1h dGNoZnJlcTEpOworCWVsc2UKKwkJcyA9IDAuMDsKKworCWlmICgobWF0Y2hmcmVxMiArIHVu bWF0Y2hmcmVxMikgPiAwKQorCQlzID0gcyAqIG1jdmZyZXEyIC8gKG1hdGNoZnJlcTIgKyB1 bm1hdGNoZnJlcTIpOworCWVsc2UKKwkJcyA9IDAuMDsKKworCS8qIGNhbGN1bGF0ZSBuZGlz dGluY3QgZm9yIHRoZSBleHByZXNzaW9uIGluIGpvaW4gY2xhdXNlcyBmb3IgZWFjaCByZWwg Ki8KKwluZDEgPSBlc3RpbWF0ZV9udW1fZ3JvdXBzKHJvb3QsIGV4cHJzMSwgcmVsMS0+cm93 cywgTlVMTCwgTlVMTCk7CisJbmQyID0gZXN0aW1hdGVfbnVtX2dyb3Vwcyhyb290LCBleHBy czIsIHJlbDItPnJvd3MsIE5VTEwsIE5VTEwpOworCisJLyoKKwkgKiBDb25zaWRlciB0aGUg cGFydCBvZiB0aGUgZGF0YSBub3QgcmVwcmVzZW50ZWQgYnkgdGhlIE1DViBsaXN0cy4KKwkg KgorCSAqIFhYWCB0aGlzIGlzIGEgYml0IGJvZ3VzLCBiZWNhdXNlIHdlIGRvbid0IGtub3cg d2hhdCBmcmFjdGlvbiBvZgorCSAqIGRpc3RpbmN0IGNvbWJpbmF0aW9ucyBpcyBjb3ZlcmVk IGJ5IHRoZSBNQ1YgbGlzdCAod2UncmUgb25seQorCSAqIGRlYWxpbmcgd2l0aCBzb21lIG9m IHRoZSBjb2x1bW5zKSwgc28gd2UgY2FuJ3QgdXNlIHRoZSBzYW1lCisJICogZm9ybXVsYXIg YXMgZXFqb2luc2VsX2lubmVyIGV4YWN0bHkuIFdlIGp1c3QgdXNlIHRoZSBlc3RpbWF0ZXMK KwkgKiBmb3IgdGhlIHdob2xlIHRhYmxlIC0gdGhpcyBpcyBsaWtlbHkgYW4gb3ZlcmVzdGlt YXRlLCBiZWNhdXNlCisJICogKGEpIGl0ZW1zIG1heSByZXBlYXQgaW4gdGhlIE1DViBsaXN0 LCBpZiBpdCBoYXMgbW9yZSBjb2x1bW5zLAorCSAqIGFuZCAoYikgc29tZSBvZiB0aGUgY29t YmluYXRpb25zIG1heSBiZSBwcmVzZW50IGluIG5vbi1NQ1YgZGF0YS4KKwkgKgorCSAqIE1v cmVvdmVyLCB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlIGNvbmRpdGlvbnMuIEZvciBub3cgd2Ug c2ltcGx5CisJICogYXNzdW1lIHRoZSBjb25kaXRpb25zIGFmZmVjdCB0aGUgZGlzdGluY3Qg Z3JvdXBzLCBhbmQgdXNlIHRoYXQuCisJICoKKwkgKiBYWFggV2UgbWlnaHQgY2FsY3VsYXRl IHRoZSBudW1iZXIgb2YgZGlzdGluY3QgZ3JvdXBzIGluIHRoZSBNQ1YsCisJICogYW5kIHRo ZW4gdXNlIHNvbWV0aGluZyBiZXR3ZWVuIChuZDEgLSBkaXN0aW5jdChNQ1YpKSBhbmQgKG5k MSksCisJICogd2hpY2ggYXJlIHRoZSBwb3NzaWJsZSBleHRyZW1lIHZhbHVlcywgYXNzdW1p bmcgdGhlIGVzdGltYXRlcworCSAqIGFyZSBhY2N1cmF0ZS4gTWF5YmUgbWVhbiBvciBnZW9t ZXRyaWMgbWVhbiB3b3VsZCB3b3JrPworCSAqCisJICogWFhYIE5vdCBzdXJlIG11bHRpcGx5 aW5nIG5kaXN0aW5jdCB3aXRoIHByb2JhYmlsaXRpZXMgaXMgZ29vZC4KKwkgKiBNYXliZSB3 ZSBzaG91bGQgZG8gc29tZXRoaW5nIG1vcmUgbGlrZSBlc3RpbWF0ZV9udW1fZ3JvdXBzPwor CSAqLworCW5kMSAqPSBjc2VsMTsKKwluZDIgKj0gY3NlbDI7CisKKwl0b3RhbHNlbDEgPSBz OworCXRvdGFsc2VsMSArPSB1bm1hdGNoZnJlcTEgKiBvdGhlcmZyZXEyIC8gbmQyOworCXRv dGFsc2VsMSArPSBvdGhlcmZyZXExICogKG90aGVyZnJlcTIgKyB1bm1hdGNoZnJlcTIpIC8g bmQyOworCisvLwlpZiAobmQyID4gbWN2Yi0+bml0ZW1zKQorLy8JCXRvdGFsc2VsMSArPSB1 bm1hdGNoZnJlcTEgKiBvdGhlcmZyZXEyIC8gKG5kMiAtIG1jdmItPm5pdGVtcyk7CisvLwlp ZiAobmQyID4gbm1hdGNoZXMpCisvLwkJdG90YWxzZWwxICs9IG90aGVyZnJlcTEgKiAob3Ro ZXJmcmVxMiArIHVubWF0Y2hmcmVxMikgLworLy8JCQkobmQyIC0gbm1hdGNoZXMpOworCisJ dG90YWxzZWwyID0gczsKKwl0b3RhbHNlbDIgKz0gdW5tYXRjaGZyZXEyICogb3RoZXJmcmVx MSAvIG5kMTsKKwl0b3RhbHNlbDIgKz0gb3RoZXJmcmVxMiAqIChvdGhlcmZyZXExICsgdW5t YXRjaGZyZXExKSAvIG5kMTsKKworLy8JaWYgKG5kMSA+IG1jdmEtPm5pdGVtcykKKy8vCQl0 b3RhbHNlbDIgKz0gdW5tYXRjaGZyZXEyICogb3RoZXJmcmVxMSAvIChuZDEgLSBtY3ZhLT5u aXRlbXMpOworLy8JaWYgKG5kMSA+IG5tYXRjaGVzKQorLy8JCXRvdGFsc2VsMiArPSBvdGhl cmZyZXEyICogKG90aGVyZnJlcTEgKyB1bm1hdGNoZnJlcTEpIC8KKy8vCQkJKG5kMSAtIG5t YXRjaGVzKTsKKworCXMgPSBNaW4odG90YWxzZWwxLCB0b3RhbHNlbDIpOworCisJcmV0dXJu IHM7Cit9CisKKworLyoKKyAqIHN0YXRleHRfY29tcGFyZV9zaW1wbGUKKyAqCQlDYWxjdWxh dGUgam9pbiBzZWxlY3Rpdml0eSB1c2luZyBhIGNvbWJpbmF0aW9uIG9mIGV4dGVuZGVkCisg KiBzdGF0aXN0aWNzIE1DViBvbiBvbmUgc2lkZSwgYW5kIHNpbXBsZSBwZXItY29sdW1uIE1D ViBvbiB0aGUgb3RoZXIuCisgKgorICogTW9zdCBvZiB0aGUgbWN2X2NvbWJpbmVfZXh0ZW5k ZWQgY29tbWVudCBhcHBsaWVzIGhlcmUgdG9vLCBidXQgd2UgY2FuIG1ha2UKKyAqIHNvbWUg c2ltcGxpZmljYXRpb25zIGJlY2F1c2Ugd2Uga25vdyB0aGUgc2Vjb25kIChwZXItY29sdW1u KSBNQ1YgaXMgc2ltcGxlciwKKyAqIGNvbnRhaW5zIG5vIE5VTEwgb3IgZHVwbGljYXRlIHZh bHVlcywgZXRjLgorICovCitTZWxlY3Rpdml0eQorbWN2X2NvbWJpbmVfc2ltcGxlKFBsYW5u ZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsIFN0YXRpc3RpY0V4dEluZm8gKnN0YXQs CisJCQkJICAgQXR0U3RhdHNTbG90ICpzc2xvdCwgZG91YmxlIHN0YW51bGxmcmFjLCBkb3Vi bGUgbmQsCisJCQkJICAgYm9vbCBpc2RlZmF1bHQsIE5vZGUgKmNsYXVzZSkKK3sKKwlNQ1ZM aXN0ICAgICptY3Y7CisJaW50CQkJaSwKKwkJCQlqOworCVNlbGVjdGl2aXR5IHMgPSAwOwor CisJLyogbWF0Y2ggYml0bWFwcyBhbmQgc2VsZWN0aXZpdHkgZm9yIGJhc2VyZWwgY29uZGl0 aW9ucyAoaWYgYW55KSAqLworCUxpc3QgICAqY29uZGl0aW9ucyA9IE5JTDsKKwlib29sICAg KmNtYXRjaGVzID0gTlVMTDsKKworCWRvdWJsZQljc2VsID0gMS4wOworCisJYm9vbCAgICpt YXRjaGVzMSA9IE5VTEwsCisJCSAgICptYXRjaGVzMiA9IE5VTEw7CisKKwkvKiBlc3RpbWF0 ZXMgZm9yIHRoZSB0d28gc2lkZXMgKi8KKwlkb3VibGUJbWF0Y2hmcmVxMSwKKwkJCXVubWF0 Y2hmcmVxMSwKKwkJCW90aGVyZnJlcTEsCisJCQltY3ZmcmVxMSwKKwkJCW5kMSwKKwkJCXRv dGFsc2VsMTsKKworCWRvdWJsZSAJbWF0Y2hmcmVxMiwKKwkJCXVubWF0Y2hmcmVxMiwKKwkJ CW90aGVyZnJlcTIsCisJCQltY3ZmcmVxMiwKKwkJCW5kMiwKKwkJCXRvdGFsc2VsMjsKKwor CUxpc3QgICAqZXhwcnMxID0gTklMLAorCQkgICAqZXhwcnMyID0gTklMOworCisJLyogaW5m byBhYm91dCBjbGF1c2VzIGFuZCBob3cgdGhleSBtYXRjaCB0byBNQ1Ygc3RhdHMgKi8KKwlG bWdySW5mbwlvcHByb2M7CisJaW50CQkJaW5kZXg7CisJYm9vbAkJcmV2ZXJzZTsKKworCS8q IHdlIHBpY2tlZCB0aGUgc3RhdHMgc28gdGhhdCB0aGV5IGhhdmUgTUNWIGVuYWJsZWQgKi8K KwlBc3NlcnQoc3RhdC0+a2luZCA9IFNUQVRTX0VYVF9NQ1YpOworCisJbWN2ID0gc3RhdGV4 dF9tY3ZfbG9hZChzdGF0LT5zdGF0T2lkKTsKKworCS8qIHNob3VsZCBvbmx5IGdldCBoZXJl IHdpdGggTUNWIG9uIGJvdGggc2lkZXMgKi8KKwlBc3NlcnQobWN2KTsKKworCS8qIERldGVy bWluZSB3aGljaCBiYXNlcmVsIGNsYXVzZXMgdG8gdXNlIGZvciBjb25kaXRpb25hbCBwcm9i YWJpbGl0eS4gKi8KKwljb25kaXRpb25zID0gc3RhdGV4dF9kZXRlcm1pbmVfam9pbl9yZXN0 cmljdGlvbnMocm9vdCwgcmVsLCBzdGF0KTsKKworCS8qCisJICogQ2FsY3VsYXRlIG1hdGNo IGJpdG1hcHMgZm9yIHJlc3RyaWN0aW9ucyBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgam9pbgor CSAqICh0aGVyZSBtYXkgYmUgbm9uZSwgaW4gd2hpY2ggY2FzZSB0aGlzIHdpbGwgYmUgTlVM TCkuCisJICovCisJaWYgKGNvbmRpdGlvbnMpCisJeworCQljbWF0Y2hlcyA9IG1jdl9nZXRf bWF0Y2hfYml0bWFwKHJvb3QsIGNvbmRpdGlvbnMsCisJCQkJCQkJCQkJIHN0YXQtPmtleXMs IHN0YXQtPmV4cHJzLAorCQkJCQkJCQkJCSBtY3YsIGZhbHNlKTsKKwkJY3NlbCA9IGNsYXVz ZWxpc3Rfc2VsZWN0aXZpdHkocm9vdCwgY29uZGl0aW9ucywgcmVsLT5yZWxpZCwgMCwgTlVM TCk7CisJfQorCisJLyoKKwkgKiBNYXRjaCBiaXRtYXBzIGZvciBtYXRjaGVzIGJldHdlZW4g TUNWIGVsZW1lbnRzLiBCeSBkZWZhdWx0IHRoZXJlCisJICogYXJlIG5vIG1hdGNoZXMsIHNv IHdlIHNldCBhbGwgaXRlbXMgdG8gMC4KKwkgKi8KKwltYXRjaGVzMSA9IChib29sICopIHBh bGxvYzAoc2l6ZW9mKGJvb2wpICogbWN2LT5uaXRlbXMpOworCisJLyogTWF0Y2hlcyBmb3Ig dGhlIHNpZGUgd2l0aCBqdXN0IHJlZ3VsYXIgc2luZ2xlLWNvbHVtbiBNQ1YuICovCisJbWF0 Y2hlczIgPSAoYm9vbCAqKSBwYWxsb2MwKHNpemVvZihib29sKSAqIHNzbG90LT5udmFsdWVz KTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xhdXNl IGFuZCBob3cgaXQgbWF0Y2hlcyB0byB0aGUKKwkgKiBleHRlbmRlZCBzdGF0cyB3ZSBwaWNr ZWQuIFdlIGRvIHRoaXMgb25seSBvbmNlIGJlZm9yZSBwcm9jZXNzaW5nCisJICogdGhlIGxp c3RzLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZG8gdGhhdCBmb3IgZWFjaCBpdGVtIG9y IHNvLgorCSAqLworCXsKKwkJT3BFeHByCSAgICpvcGV4cHI7CisJCU5vZGUJICAgKmV4cHIx LAorCQkJCSAgICpleHByMjsKKwkJQml0bWFwc2V0ICAqcmVsaWRzMSwKKwkJCQkgICAqcmVs aWRzMjsKKworCQkvKgorCQkgKiBTdHJpcCB0aGUgUmVzdHJpY3RJbmZvIG5vZGUsIGdldCB0 aGUgYWN0dWFsIGNsYXVzZS4KKwkJICoKKwkJICogWFhYIE5vdCBzdXJlIGlmIHdlIG5lZWQg dG8gY2FyZSBhYm91dCByZW1vdmluZyBvdGhlciBub2RlIHR5cGVzCisJCSAqIHRvbyAoZS5n LiBSZWxhYmVsVHlwZSBldGMuKS4gc3RhdGV4dF9pc19zdXBwb3J0ZWRfam9pbl9jbGF1c2UK KwkJICogbWF0Y2hlcyB0aGlzLCBidXQgbWF5YmUgd2UgbmVlZCB0byByZWxheCBpdD8KKwkJ ICovCisJCWlmIChJc0EoY2xhdXNlLCBSZXN0cmljdEluZm8pKQorCQkJY2xhdXNlID0gKE5v ZGUgKikgKChSZXN0cmljdEluZm8gKikgY2xhdXNlKS0+Y2xhdXNlOworCisJCW9wZXhwciA9 IChPcEV4cHIgKikgY2xhdXNlOworCisJCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBleHBl Y3RlZCBub2RlIHR5cGUuICovCisJCUFzc2VydChpc19vcGNsYXVzZShjbGF1c2UpKTsKKwkJ QXNzZXJ0KGxpc3RfbGVuZ3RoKG9wZXhwci0+YXJncykgPT0gMik7CisKKwkJZm1ncl9pbmZv KGdldF9vcGNvZGUob3BleHByLT5vcG5vKSwgJm9wcHJvYyk7CisKKwkJLyogRklYTUUgc3Ry aXAgcmVsYWJlbCBldGMuIHRoZSB3YXkgZXhhbWluZV9vcGNsYXVzZV9hcmdzIGRvZXMgKi8K KwkJZXhwcjEgPSBsaW5pdGlhbChvcGV4cHItPmFyZ3MpOworCQlleHByMiA9IGxzZWNvbmQo b3BleHByLT5hcmdzKTsKKworCQkvKiBkZXRlcm1pbmUgb3JkZXIgb2YgY2xhdXNlcyAocmVs MSBvcCByZWwyKSBvciAocmVsMiBvcCByZWwxKSAqLworCQlyZWxpZHMxID0gcHVsbF92YXJu b3Mocm9vdCwgZXhwcjEpOworCQlyZWxpZHMyID0gcHVsbF92YXJub3Mocm9vdCwgZXhwcjIp OworCisJCWlmIChibXNfc2luZ2xldG9uX21lbWJlcihyZWxpZHMxKSA9PSByZWwtPnJlbGlk KQorCQl7CisJCQlPaWQJCWNvbGxpZDsKKworCQkJaW5kZXggPSBtY3ZfbWF0Y2hfZXhwcmVz c2lvbihleHByMSwgc3RhdC0+a2V5cywgc3RhdC0+ZXhwcnMsCisJCQkJCQkJCQkJICZjb2xs aWQpOworCQkJcmV2ZXJzZSA9IGZhbHNlOworCisJCQlleHByczEgPSBsYXBwZW5kKGV4cHJz MSwgZXhwcjEpOworCQkJZXhwcnMyID0gbGFwcGVuZChleHByczIsIGV4cHIyKTsKKwkJfQor CQllbHNlIGlmIChibXNfc2luZ2xldG9uX21lbWJlcihyZWxpZHMyKSA9PSByZWwtPnJlbGlk KQorCQl7CisJCQlPaWQJCWNvbGxpZDsKKworCQkJaW5kZXggPSBtY3ZfbWF0Y2hfZXhwcmVz c2lvbihleHByMiwgc3RhdC0+a2V5cywgc3RhdC0+ZXhwcnMsCisJCQkJCQkJCQkJICZjb2xs aWQpOworCQkJcmV2ZXJzZSA9IHRydWU7CisKKwkJCWV4cHJzMSA9IGxhcHBlbmQoZXhwcnMx LCBleHByMik7CisJCQlleHByczIgPSBsYXBwZW5kKGV4cHJzMiwgZXhwcjEpOworCQl9CisJ CWVsc2UKKwkJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJCUFzc2VydChmYWxzZSk7 CisKKwkJQXNzZXJ0KChpbmRleCA+PSAwKSAmJgorCQkJICAgKGluZGV4IDwgYm1zX251bV9t ZW1iZXJzKHN0YXQtPmtleXMpICsgbGlzdF9sZW5ndGgoc3RhdC0+ZXhwcnMpKSk7CisJfQor CisJLyoKKwkgKiBNYXRjaCBpdGVtcyBiZXR3ZWVuIHRoZSB0d28gTUNWIGxpc3RzLgorCSAq CisJICogV2UgZG9uJ3Qga25vdyBpZiB0aGUgam9pbiBjb25kaXRpb25zIG1hdGNoIGFsbCBh dHRyaWJ1dGVzIGluIHRoZSBNQ1YsIHRoZQorCSAqIG92ZXJsYXAgbWF5IGJlIGp1c3Qgb24g YSBzdWJzZXQgb2YgYXR0cmlidXRlcywgZS5nLiAoYSxiLGMpIHZzLiAoYixjLGQpLgorCSAq IFNvIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBtYXRjaGVzIG9uIGVpdGhlciBzaWRlLiBTbyB3 ZSBjYW4ndCBvcHRpbWl6ZSBieQorCSAqIGFib3J0aW5nIHRoZSBpbm5lciBsb29wIGFmdGVy IHRoZSBmaXJzdCBtYXRjaCwgZXRjLgorCSAqCisJICogWFhYIFdlIGNhbiBza2lwIHRoZSBp dGVtcyBlbGltaW5hdGVkIGJ5IHRoZSBiYXNlIHJlc3RyaWN0aW9ucywgb2YgY291cnNlLgor CSAqCisJICogWFhYIFdlIG1pZ2h0IG9wdGltaXplIHRoaXMgaW4gdHdvIHdheXMuIFdlIG1p Z2h0IHNvcnQgdGhlIE1DViBpdGVtcyBvbgorCSAqIGJvdGggc2lkZXMgdXNpbmcgdGhlICJq b2luIiBhdHRyaWJ1dGVzLCBhbmQgdGhlbiBwZXJmb3JtIHNvbWV0aGluZyBsaWtlCisJICog bWVyZ2Ugam9pbi4gT3Igd2UgbWlnaHQgY2FsY3VsYXRlIGEgaGFzaCBmcm9tIHRoZSBqb2lu IGNvbHVtbnMsIGFuZCB0aGVuCisJICogY29tcGFyZSB0aGlzICh0byBlbGltaW5hdGUgdGhl IG1vc3QgZXhwZW5zaXZlIGVxdWFsaXR5IGZ1bmN0aW9ucykuCisJICovCisJZm9yIChpID0g MDsgaSA8IG1jdi0+bml0ZW1zOyBpKyspCisJeworCQkvKiBza2lwIGl0ZW1zIGVsaW1pbmF0 ZWQgYnkgcmVzdHJpY3Rpb25zIG9uIHJlbDEgKi8KKwkJaWYgKGNtYXRjaGVzICYmICFjbWF0 Y2hlc1tpXSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFdlIGNhbiBjaGVjayBtY3Yx LT5pdGVtc1tpXS5pc251bGxbaW5kZXgxXSBoZXJlLCBiZWNhdXNlIGl0J2xsIGJlIGEKKwkJ ICogbWlzbWF0Y2ggYW55d2F5ICh0aGUgc2ltcGxlIE1DViBkb2VzIG5vdCBjb250YWluIE5V TExzKS4KKwkJICovCisJCWlmIChtY3YtPml0ZW1zW2ldLmlzbnVsbFtpbmRleF0pCisJCQlj b250aW51ZTsKKworCQkvKiBmaW5kIG1hdGNoZXMgaW4gdGhlIHNlY29uZCBNQ1YgbGlzdCAq LworCQlmb3IgKGogPSAwOyBqIDwgc3Nsb3QtPm52YWx1ZXM7IGorKykKKwkJeworCQkJYm9v bAltYXRjaDsKKwkJCURhdHVtCXZhbHVlMSA9IG1jdi0+aXRlbXNbaV0udmFsdWVzW2luZGV4 XTsKKwkJCURhdHVtCXZhbHVlMiA9IHNzbG90LT52YWx1ZXNbal07CisKKwkJCS8qCisJCQkg KiBFdmFsdWF0ZSB0aGUgam9pbiBjbGF1c2UgYmV0d2VlbiB0aGUgdHdvIE1DViBsaXN0cy4g V2UgZG9uJ3QKKwkJCSAqIG5lZWQgdG8gZGVhbCB3aXRoIE5VTEwgdmFsdWVzIGhlcmUgLSB3 ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yCisJCQkgKiBOVUxMIGluIHRoZSBleHRlbmRlZCBz dGF0aXN0aWNzIGVhcmxpZXIsIGFuZCB0aGUgc2ltcGxlIE1DVgorCQkJICogZG9lcyBub3Qg Y29udGFpbiBOVUxMIHZhbHVlcy4KKwkJCSAqCisJCQkgKiBDYXJlZnVsIGFib3V0IG9yZGVy IG9mIHBhcmFtZXRlcnMuIEZvciBzYW1lLXR5cGUgZXF1YWxpdHkKKwkJCSAqIHRoYXQgc2hv dWxkIG5vdCBtYXR0ZXIsIGJ1dCBlYXN5IGVub3VnaC4KKwkJCSAqCisJCQkgKiBGSVhNRSBV c2UgYXBwcm9wcmlhdGUgY29sbGF0aW9uLgorCQkJICovCisJCQlpZiAocmV2ZXJzZSkKKwkJ CQltYXRjaCA9IERhdHVtR2V0Qm9vbChGdW5jdGlvbkNhbGwyQ29sbCgmb3Bwcm9jLAorCQkJ CQkJCQkJCQkJCSAgIEludmFsaWRPaWQsCisJCQkJCQkJCQkJCQkJICAgdmFsdWUyLCB2YWx1 ZTEpKTsKKwkJCWVsc2UKKwkJCQltYXRjaCA9IERhdHVtR2V0Qm9vbChGdW5jdGlvbkNhbGwy Q29sbCgmb3Bwcm9jLAorCQkJCQkJCQkJCQkJCSAgIEludmFsaWRPaWQsCisJCQkJCQkJCQkJ CQkJICAgdmFsdWUxLCB2YWx1ZTIpKTsKKworCQkJaWYgKG1hdGNoKQorCQkJeworCQkJCS8q IFhYWCBEbyB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZyBhYm91dCBiYXNlIGZyZXF1ZW5jeT8g Ki8KKwkJCQltYXRjaGVzMVtpXSA9IG1hdGNoZXMyW2pdID0gdHJ1ZTsKKwkJCQlzICs9IG1j di0+aXRlbXNbaV0uZnJlcXVlbmN5ICogc3Nsb3QtPm51bWJlcnNbal07CisKKwkJCQkvKgor CQkJCSAqIFdlIGtub3cgdGhlcmUgY2FuIGJlIGp1c3QgYSBzaW5nbGUgbWF0Y2ggaW4gdGhl IHJlZ3VsYXIKKwkJCQkgKiBNQ1YgbGlzdCwgc28gd2UgY2FuIGFib3J0IHRoZSBpbm5lciBs b29wLgorCQkJCSAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJbWF0Y2hmcmVx MSA9IHVubWF0Y2hmcmVxMSA9IG1jdmZyZXExID0gMC4wOworCWZvciAoaSA9IDA7IGkgPCBt Y3YtPm5pdGVtczsgaSsrKQorCXsKKwkJbWN2ZnJlcTEgKz0gbWN2LT5pdGVtc1tpXS5mcmVx dWVuY3k7CisKKwkJLyogaWdub3JlIE1DViBpdGVtcyBlbGltaW5hdGVkIGJ5IGJhc2VyZWwg Y29uZGl0aW9ucyAqLworCQlpZiAoY21hdGNoZXMgJiYgIWNtYXRjaGVzW2ldKQorCQkJY29u dGludWU7CisKKwkJaWYgKG1hdGNoZXMxW2ldKQorCQkJbWF0Y2hmcmVxMSArPSBtY3YtPml0 ZW1zW2ldLmZyZXF1ZW5jeTsKKwkJZWxzZQorCQkJdW5tYXRjaGZyZXExICs9IG1jdi0+aXRl bXNbaV0uZnJlcXVlbmN5OworCX0KKworCS8qIG5vdCByZXByZXNlbnRlZCBieSB0aGUgTUNW ICovCisJb3RoZXJmcmVxMSA9IDEuMCAtIG1jdmZyZXExOworCisJbWF0Y2hmcmVxMiA9IHVu bWF0Y2hmcmVxMiA9IG1jdmZyZXEyID0gMC4wOworCWZvciAoaSA9IDA7IGkgPCBzc2xvdC0+ bnZhbHVlczsgaSsrKQorCXsKKwkJbWN2ZnJlcTIgKz0gc3Nsb3QtPm51bWJlcnNbaV07CisK KwkJaWYgKG1hdGNoZXMyW2ldKQorCQkJbWF0Y2hmcmVxMiArPSBzc2xvdC0+bnVtYmVyc1tp XTsKKwkJZWxzZQorCQkJdW5tYXRjaGZyZXEyICs9IHNzbG90LT5udW1iZXJzW2ldOworCX0K KworCS8qIG5vdCByZXByZXNlbnRlZCBieSB0aGUgTUNWICovCisJb3RoZXJmcmVxMiA9IDEu MCAtIG1jdmZyZXEyOworCisJLyoKKwkgKiBDb3JyZWN0aW9uIGZvciBNQ1YgcGFydHMgZWxp bWluYXRlZCBieSB0aGUgY29uZGl0aW9ucy4KKwkgKgorCSAqIFdlIG5lZWQgdG8gYmUgY2Fy ZWZ1bCBhYm91dCBjYXNlcyB3aGVyZSBjb25kaXRpb25zIGVsaW1pbmF0ZWQgYWxsCisJICog dGhlIE1DViBpdGVtcy4gV2UgbXVzdCBub3QgZGl2aWRlIGJ5IDAuMCwgYmVjYXVzZSB0aGF0 IHdvdWxkIGVpdGhlcgorCSAqIHByb2R1Y2UgYm9ndXMgdmFsdWUgb3IgdHJpZ2dlciBkaXZp c2lvbiBieSB6ZXJvLiBJbnN0ZWFkIHdlIHNpbXBseQorCSAqIHNldCB0aGUgc2VsZWN0aXZp dHkgdG8gMC4wLCBiZWNhdXNlIHRoZXJlIGNhbid0IGJlIGFueSBtYXRjaGVzLgorCSAqLwor CWlmICgobWF0Y2hmcmVxMSArIHVubWF0Y2hmcmVxMSkgPiAwKQorCQlzID0gcyAqIG1jdmZy ZXExIC8gKG1hdGNoZnJlcTEgKyB1bm1hdGNoZnJlcTEpOworCWVsc2UKKwkJcyA9IDAuMDsK KworCWlmICgobWF0Y2hmcmVxMiArIHVubWF0Y2hmcmVxMikgPiAwKQorCQlzID0gcyAqIG1j dmZyZXEyIC8gKG1hdGNoZnJlcTIgKyB1bm1hdGNoZnJlcTIpOworCWVsc2UKKwkJcyA9IDAu MDsKKworCS8qIGNhbGN1bGF0ZSBuZGlzdGluY3QgZm9yIHRoZSBleHByZXNzaW9uIGluIGpv aW4gY2xhdXNlcyBmb3IgZWFjaCByZWwgKi8KKwluZDEgPSBlc3RpbWF0ZV9udW1fZ3JvdXBz KHJvb3QsIGV4cHJzMSwgcmVsLT5yb3dzLCBOVUxMLCBOVUxMKTsKKwluZDIgPSBuZDsKKwor CS8qCisJICogQ29uc2lkZXIgdGhlIHBhcnQgb2YgdGhlIGRhdGEgbm90IHJlcHJlc2VudGVk IGJ5IHRoZSBNQ1YgbGlzdHMuCisJICoKKwkgKiBYWFggdGhpcyBpcyBhIGJpdCBib2d1cywg YmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoYXQgZnJhY3Rpb24gb2YKKwkgKiBkaXN0aW5jdCBj b21iaW5hdGlvbnMgaXMgY292ZXJlZCBieSB0aGUgTUNWIGxpc3QgKHdlJ3JlIG9ubHkKKwkg KiBkZWFsaW5nIHdpdGggc29tZSBvZiB0aGUgY29sdW1ucyksIHNvIHdlIGNhbid0IHVzZSB0 aGUgc2FtZQorCSAqIGZvcm11bGFyIGFzIGVxam9pbnNlbF9pbm5lciBleGFjdGx5LiBXZSBq dXN0IHVzZSB0aGUgZXN0aW1hdGVzCisJICogZm9yIHRoZSB3aG9sZSB0YWJsZSAtIHRoaXMg aXMgbGlrZWx5IGFuIG92ZXJlc3RpbWF0ZSwgYmVjYXVzZQorCSAqIChhKSBpdGVtcyBtYXkg cmVwZWF0IGluIHRoZSBNQ1YgbGlzdCwgaWYgaXQgaGFzIG1vcmUgY29sdW1ucywKKwkgKiBh bmQgKGIpIHNvbWUgb2YgdGhlIGNvbWJpbmF0aW9ucyBtYXkgYmUgcHJlc2VudCBpbiBub24t TUNWIGRhdGEuCisJICoKKwkgKiBNb3Jlb3Zlciwgd2UgbmVlZCB0byBsb29rIGF0IHRoZSBj b25kaXRpb25zLiBGb3Igbm93IHdlIHNpbXBseQorCSAqIGFzc3VtZSB0aGUgY29uZGl0aW9u cyBhZmZlY3QgdGhlIGRpc3RpbmN0IGdyb3VwcywgYW5kIHVzZSB0aGF0LgorCSAqCisJICog WFhYIFdlIG1pZ2h0IGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IGdyb3VwcyBp biB0aGUgTUNWLAorCSAqIGFuZCB0aGVuIHVzZSBzb21ldGhpbmcgYmV0d2VlbiAobmQxIC0g ZGlzdGluY3QoTUNWKSkgYW5kIChuZDEpLAorCSAqIHdoaWNoIGFyZSB0aGUgcG9zc2libGUg ZXh0cmVtZSB2YWx1ZXMsIGFzc3VtaW5nIHRoZSBlc3RpbWF0ZXMKKwkgKiBhcmUgYWNjdXJh dGUuIE1heWJlIG1lYW4gb3IgZ2VvbWV0cmljIG1lYW4gd291bGQgd29yaz8KKwkgKgorCSAq IFhYWCBOb3Qgc3VyZSBtdWx0aXBseWluZyBuZGlzdGluY3Qgd2l0aCBwcm9iYWJpbGl0aWVz IGlzIGdvb2QuCisJICogTWF5YmUgd2Ugc2hvdWxkIGRvIHNvbWV0aGluZyBtb3JlIGxpa2Ug ZXN0aW1hdGVfbnVtX2dyb3Vwcz8KKwkgKi8KKwluZDEgKj0gY3NlbDsKKworCXRvdGFsc2Vs MSA9IHM7CisJdG90YWxzZWwxICs9IHVubWF0Y2hmcmVxMSAqIG90aGVyZnJlcTIgLyBuZDI7 CisJdG90YWxzZWwxICs9IG90aGVyZnJlcTEgKiAob3RoZXJmcmVxMiArIHVubWF0Y2hmcmVx MikgLyBuZDI7CisKKy8vCWlmIChuZDIgPiBtY3ZiLT5uaXRlbXMpCisvLwkJdG90YWxzZWwx ICs9IHVubWF0Y2hmcmVxMSAqIG90aGVyZnJlcTIgLyAobmQyIC0gbWN2Yi0+bml0ZW1zKTsK Ky8vCWlmIChuZDIgPiBubWF0Y2hlcykKKy8vCQl0b3RhbHNlbDEgKz0gb3RoZXJmcmVxMSAq IChvdGhlcmZyZXEyICsgdW5tYXRjaGZyZXEyKSAvCisvLwkJCShuZDIgLSBubWF0Y2hlcyk7 CisKKwl0b3RhbHNlbDIgPSBzOworCXRvdGFsc2VsMiArPSB1bm1hdGNoZnJlcTIgKiBvdGhl cmZyZXExIC8gbmQxOworCXRvdGFsc2VsMiArPSBvdGhlcmZyZXEyICogKG90aGVyZnJlcTEg KyB1bm1hdGNoZnJlcTEpIC8gbmQxOworCisvLwlpZiAobmQxID4gbWN2YS0+bml0ZW1zKQor Ly8JCXRvdGFsc2VsMiArPSB1bm1hdGNoZnJlcTIgKiBvdGhlcmZyZXExIC8gKG5kMSAtIG1j dmEtPm5pdGVtcyk7CisvLwlpZiAobmQxID4gbm1hdGNoZXMpCisvLwkJdG90YWxzZWwyICs9 IG90aGVyZnJlcTIgKiAob3RoZXJmcmVxMSArIHVubWF0Y2hmcmVxMSkgLworLy8JCQkobmQx IC0gbm1hdGNoZXMpOworCisJcyA9IE1pbih0b3RhbHNlbDEsIHRvdGFsc2VsMik7CisKKwly ZXR1cm4gczsKK30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3N0YXRpc3RpY3MvZXh0ZW5k ZWRfc3RhdHNfaW50ZXJuYWwuaCBiL3NyYy9pbmNsdWRlL3N0YXRpc3RpY3MvZXh0ZW5kZWRf c3RhdHNfaW50ZXJuYWwuaAppbmRleCA1NWNkOTI1MmE1NS4uMWU1MWM1NGZlZmIgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL3N0YXRpc3RpY3MvZXh0ZW5kZWRfc3RhdHNfaW50ZXJuYWwu aAorKysgYi9zcmMvaW5jbHVkZS9zdGF0aXN0aWNzL2V4dGVuZGVkX3N0YXRzX2ludGVybmFs LmgKQEAgLTE1LDYgKzE1LDcgQEAKICNkZWZpbmUgRVhURU5ERURfU1RBVFNfSU5URVJOQUxf SAogCiAjaW5jbHVkZSAic3RhdGlzdGljcy9zdGF0aXN0aWNzLmgiCisjaW5jbHVkZSAidXRp bHMvbHN5c2NhY2hlLmgiCiAjaW5jbHVkZSAidXRpbHMvc29ydHN1cHBvcnQuaCIKIAogdHlw ZWRlZiBzdHJ1Y3QKQEAgLTEyNyw0ICsxMjgsMjMgQEAgZXh0ZXJuIFNlbGVjdGl2aXR5IG1j dl9jbGF1c2Vfc2VsZWN0aXZpdHlfb3IoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCQkJ CSBTZWxlY3Rpdml0eSAqb3ZlcmxhcF9iYXNlc2VsLAogCQkJCQkJCQkJCQkgU2VsZWN0aXZp dHkgKnRvdGFsc2VsKTsKIAorZXh0ZXJuIFNlbGVjdGl2aXR5IG1jdl9jb21iaW5lX3NpbXBs ZShQbGFubmVySW5mbyAqcm9vdCwKKwkJCQkJCQkJCSAgUmVsT3B0SW5mbyAqcmVsLAorCQkJ CQkJCQkJICBTdGF0aXN0aWNFeHRJbmZvICpzdGF0LAorCQkJCQkJCQkJICBBdHRTdGF0c1Ns b3QgKnNzbG90LAorCQkJCQkJCQkJICBkb3VibGUgc3RhbnVsbGZyYWMsCisJCQkJCQkJCQkg IGRvdWJsZSBuZCwgYm9vbCBpc2RlZmF1bHQsCisJCQkJCQkJCQkgIE5vZGUgKmNsYXVzZSk7 CisKK2V4dGVybiBTZWxlY3Rpdml0eSBtY3ZfY29tYmluZV9leHRlbmRlZChQbGFubmVySW5m byAqcm9vdCwKKwkJCQkJCQkJCQlSZWxPcHRJbmZvICpyZWwxLAorCQkJCQkJCQkJCVJlbE9w dEluZm8gKnJlbDIsCisJCQkJCQkJCQkJU3RhdGlzdGljRXh0SW5mbyAqc3RhdDEsCisJCQkJ CQkJCQkJU3RhdGlzdGljRXh0SW5mbyAqc3RhdDIsCisJCQkJCQkJCQkJTGlzdCAqY2xhdXNl cyk7CisKK2V4dGVybiBMaXN0ICpzdGF0ZXh0X2RldGVybWluZV9qb2luX3Jlc3RyaWN0aW9u cyhQbGFubmVySW5mbyAqcm9vdCwKKwkJCQkJCQkJCQkJCSBSZWxPcHRJbmZvICpyZWwsCisJ CQkJCQkJCQkJCQkgU3RhdGlzdGljRXh0SW5mbyAqaW5mbyk7CisKICNlbmRpZgkJCQkJCQkv KiBFWFRFTkRFRF9TVEFUU19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVk ZS9zdGF0aXN0aWNzL3N0YXRpc3RpY3MuaCBiL3NyYy9pbmNsdWRlL3N0YXRpc3RpY3Mvc3Rh dGlzdGljcy5oCmluZGV4IDMyNmNmMjZmZWFlLi40YmYyNzI0MGY2ZiAxMDA2NDQKLS0tIGEv c3JjL2luY2x1ZGUvc3RhdGlzdGljcy9zdGF0aXN0aWNzLmgKKysrIGIvc3JjL2luY2x1ZGUv c3RhdGlzdGljcy9zdGF0aXN0aWNzLmgKQEAgLTEyNiw0ICsxMjYsMTYgQEAgZXh0ZXJuIFN0 YXRpc3RpY0V4dEluZm8gKmNob29zZV9iZXN0X3N0YXRpc3RpY3MoTGlzdCAqc3RhdHMsIGNo YXIgcmVxdWlyZWRraW5kLAogCQkJCQkJCQkJCQkJaW50IG5jbGF1c2VzKTsKIGV4dGVybiBI ZWFwVHVwbGUgc3RhdGV4dF9leHByZXNzaW9uc19sb2FkKE9pZCBzdHhvaWQsIGludCBpZHgp OwogCitleHRlcm4gU3RhdGlzdGljRXh0SW5mbyAqc3RhdGV4dF9maW5kX21hdGNoaW5nX21j dihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAorCQkJCQkJCQkJCSAgIEJp dG1hcHNldCAqYXR0bnVtcywgTGlzdCAqZXhwcnMpOworCitleHRlcm4gYm9vbCBzdGF0ZXh0 X3RyeV9qb2luX2VzdGltYXRlcyhQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqY2xhdXNlcywg aW50IHZhclJlbGlkLAorCQkJCQkJCQkJICAgSm9pblR5cGUgam9pbnR5cGUsIFNwZWNpYWxK b2luSW5mbyAqc2ppbmZvLAorCQkJCQkJCQkJICAgQml0bWFwc2V0ICplc3RpbWF0ZWRjbGF1 c2VzKTsKKworZXh0ZXJuIFNlbGVjdGl2aXR5IHN0YXRleHRfY2xhdXNlbGlzdF9qb2luX3Nl bGVjdGl2aXR5KFBsYW5uZXJJbmZvICpyb290LCBMaXN0ICpjbGF1c2VzLAorCQkJCQkJCQkJ CQkJCSAgIGludCB2YXJSZWxpZCwKKwkJCQkJCQkJCQkJCQkgICBKb2luVHlwZSBqb2ludHlw ZSwgU3BlY2lhbEpvaW5JbmZvICpzamluZm8sCisJCQkJCQkJCQkJCQkJICAgQml0bWFwc2V0 ICoqZXN0aW1hdGVkY2xhdXNlcyk7CisKICNlbmRpZgkJCQkJCQkvKiBTVEFUSVNUSUNTX0gg Ki8KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3RhdHNfZXh0Lm91 dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3RhdHNfZXh0Lm91dAppbmRleCBjNjBi YTQ1YWJhOC4uODg0NmQ1NWMyMzYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvc3RhdHNfZXh0Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N0 YXRzX2V4dC5vdXQKQEAgLTI5NzQsNiArMjk3NCwxNzMgQEAgU0VMRUNUIGMwIEZST00gT05M WSBleHByX3N0YXRzX2luY29tcGF0aWJsZV90ZXN0IFdIRVJFCiAoMCByb3dzKQogCiBEUk9Q IFRBQkxFIGV4cHJfc3RhdHNfaW5jb21wYXRpYmxlX3Rlc3Q7CistLSBUZXN0IGpvaW4gZXN0 aW1hdGVzLgorQ1JFQVRFIFRBQkxFIGpvaW5fdGVzdF8xIChhIGludCwgYiBpbnQsIGMgaW50 KTsKK0NSRUFURSBUQUJMRSBqb2luX3Rlc3RfMiAoYSBpbnQsIGIgaW50LCBjIGludCk7CitJ TlNFUlQgSU5UTyBqb2luX3Rlc3RfMSBTRUxFQ1QgbW9kKGksMTApLCBtb2QoaSwxMCksIG1v ZChpLDEwKSBGUk9NIGdlbmVyYXRlX3NlcmllcygxLDEwMDApIHMoaSk7CitJTlNFUlQgSU5U TyBqb2luX3Rlc3RfMiBTRUxFQ1QgbW9kKGksMTApLCBtb2QoaSwxMCksIG1vZChpLDEwKSBG Uk9NIGdlbmVyYXRlX3NlcmllcygxLDEwMDApIHMoaSk7CitBTkFMWVpFIGpvaW5fdGVzdF8x OworQU5BTFlaRSBqb2luX3Rlc3RfMjsKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVk X3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBqb2luX3Rlc3RfMiBq MiBvbiAoKGoxLmEgKyAxID0gajIuYSArIDEpIGFuZCAoajEuYiA9IGoyLmIpKScpOworIGVz dGltYXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICAgNTAwIHwg MTAwMDAwCisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3Mo J3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBqb2luX3Rlc3RfMiBqMiBvbiAo KGoxLmEgKyAxID0gajIuYSArIDEpIGFuZCAoajEuYiA9IGoyLmIpKSB3aGVyZSBqMS5jIDwg NScpOworIGVzdGltYXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAg ICAgMjUwIHwgIDUwMDAwCisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1h dGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBqb2luX3Rlc3Rf MiBqMiBvbiAoKGoxLmEgKyAxID0gajIuYSArIDEpIGFuZCAoajEuYiA9IGoyLmIpKSB3aGVy ZSBqMS5jIDwgMCcpOworIGVzdGltYXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0t LS0tCisgICAgICAgICAxIHwgICAgICAwCisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gY2hl Y2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBq b2luX3Rlc3RfMiBqMiBvbiAoKGoxLmEgKyAxID0gajIuYSArIDEpIGFuZCAoajEuYiA9IGoy LmIpKSB3aGVyZSBqMS5jIDwgNSBhbmQgajIuYyA8IDMnKTsKKyBlc3RpbWF0ZWQgfCBhY3R1 YWwgCistLS0tLS0tLS0tLSstLS0tLS0tLQorICAgICAgICA3NSB8ICAzMDAwMAorKDEgcm93 KQorCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBmcm9t IGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKChqMS5hICsgMSA9IGoy LmEgKyAxKSBhbmQgKGoxLmIgPSBqMi5iKSkgd2hlcmUgajEuYyA8IDUgYW5kIGoyLmMgPiA1 Jyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAg ICAxMDAgfCAgICAgIDAKKygxIHJvdykKKworLS0gY2FuJ3QgYmUgaW1wcm92ZWQgZHVlIHRv IHRoZSBvcHRpbWl6YXRpb24gaW4gY2xhdXNlbGlzdF9zZWxlY3Rpdml0eV9leHQsCistLSB3 aGljaCBza2lwcyBjYXNlcyB3aXRoIGEgc2luZ2xlIChqb2luKSBjbGF1c2UKK1NFTEVDVCAq IEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEg ajEgam9pbiBqb2luX3Rlc3RfMiBqMiBvbiAoKGoxLmEgKyAxID0gajIuYSArIDEpKSB3aGVy ZSBqMS5jIDwgNScpOworIGVzdGltYXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0t LS0tCisgICAgICAyNTAwIHwgIDUwMDAwCisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gY2hl Y2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBq b2luX3Rlc3RfMiBqMiBvbiAoKGoxLmEgKyAxID0gajIuYSArIDEpKSB3aGVyZSBqMS5jIDwg NSBhbmQgajIuYyA8IDUnKTsKKyBlc3RpbWF0ZWQgfCBhY3R1YWwgCistLS0tLS0tLS0tLSst LS0tLS0tLQorICAgICAgMTI1MCB8ICA1MDAwMAorKDEgcm93KQorCitTRUxFQ1QgKiBGUk9N IGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpv aW4gam9pbl90ZXN0XzIgajIgb24gKChqMS5hICsgMSA9IGoyLmEgKyAxKSkgd2hlcmUgajEu YyA8IDUgYW5kIGoyLmMgPiA1Jyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0t LS0rLS0tLS0tLS0KKyAgICAgIDEwMDAgfCAgICAgIDAKKygxIHJvdykKKworU0VMRUNUICog RlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBq MSBqb2luIGpvaW5fdGVzdF8yIGoyIG9uIChqMS5hICsgMSA9IGoyLmEpIHdoZXJlIGoxLmMg PCA1Jyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAg ICAgIDI1MDAgfCAgNTAwMDAKKygxIHJvdykKKworU0VMRUNUICogRlJPTSBjaGVja19lc3Rp bWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVz dF8yIGoyIG9uIChqMS5hICsgMSA9IGoyLmEgKyAxKSB3aGVyZSBqMS5jIDwgNScpOworIGVz dGltYXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICAyNTAwIHwg IDUwMDAwCisoMSByb3cpCisKKy0tIGNyZWF0ZSBleHRlbmRlZCBzdGF0aXN0aWNzIG9uIHRo ZSBqb2luL3doZXJlIGNvbHVtbnMKK0NSRUFURSBTVEFUSVNUSUNTIGpvaW5fc3RhdHNfMSBP TiBhLCBiLCBjLCAoYSsxKSwgKGIrMSkgRlJPTSBqb2luX3Rlc3RfMTsKK0NSRUFURSBTVEFU SVNUSUNTIGpvaW5fc3RhdHNfMiBPTiBhLCBiLCBjLCAoYSsxKSwgKGIrMSkgRlJPTSBqb2lu X3Rlc3RfMjsKK0FOQUxZWkUgam9pbl90ZXN0XzE7CitBTkFMWVpFIGpvaW5fdGVzdF8yOwor U0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2lu X3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsg MSkgYW5kIChqMS5iID0gajIuYikpJyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0t LS0tLS0rLS0tLS0tLS0KKyAgICAxMDAwMDAgfCAxMDAwMDAKKygxIHJvdykKKworU0VMRUNU ICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3Rf MSBqMSBqb2luIGpvaW5fdGVzdF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkgYW5k IChqMS5iID0gajIuYikpIHdoZXJlIGoxLmMgPCA1Jyk7CisgZXN0aW1hdGVkIHwgYWN0dWFs IAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAgNTAwMDAgfCAgNTAwMDAKKygxIHJvdykK KworU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBq b2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5h ICsgMSkgYW5kIChqMS5iID0gajIuYikpIHdoZXJlIGoxLmMgPCAwJyk7CisgZXN0aW1hdGVk IHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAgICAgIDEgfCAgICAgIDAK KygxIHJvdykKKworU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0 ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8yIGoyIG9uICgoajEuYSAr IDEgPSBqMi5hICsgMSkgYW5kIChqMS5iID0gajIuYikpIHdoZXJlIGoxLmMgPCA1IGFuZCBq Mi5jIDwgMycpOworIGVzdGltYXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0t CisgICAgIDMwMDAwIHwgIDMwMDAwCisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gY2hlY2tf ZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBqb2lu X3Rlc3RfMiBqMiBvbiAoKGoxLmEgKyAxID0gajIuYSArIDEpIGFuZCAoajEuYiA9IGoyLmIp KSB3aGVyZSBqMS5jIDwgNSBhbmQgajIuYyA+IDUnKTsKKyBlc3RpbWF0ZWQgfCBhY3R1YWwg CistLS0tLS0tLS0tLSstLS0tLS0tLQorICAgICAgICAgMSB8ICAgICAgMAorKDEgcm93KQor CistLSBjYW4ndCBiZSBpbXByb3ZlZCBkdWUgdG8gdGhlIG9wdGltaXphdGlvbiBpbiBjbGF1 c2VsaXN0X3NlbGVjdGl2aXR5X2V4dCwKKy0tIHdoaWNoIHNraXBzIGNhc2VzIHdpdGggYSBz aW5nbGUgKGpvaW4pIGNsYXVzZQorU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93 cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8yIGoyIG9u ICgoajEuYSArIDEgPSBqMi5hICsgMSkpIHdoZXJlIGoxLmMgPCA1Jyk7CisgZXN0aW1hdGVk IHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAgNTAwMDAgfCAgNTAwMDAK KygxIHJvdykKKworU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0 ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8yIGoyIG9uICgoajEuYSAr IDEgPSBqMi5hICsgMSkpIHdoZXJlIGoxLmMgPCA1IGFuZCBqMi5jIDwgNScpOworIGVzdGlt YXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgIDUwMDAwIHwgIDUw MDAwCisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3Nl bGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBqb2luX3Rlc3RfMiBqMiBvbiAoKGox LmEgKyAxID0gajIuYSArIDEpKSB3aGVyZSBqMS5jIDwgNSBhbmQgajIuYyA+IDUnKTsKKyBl c3RpbWF0ZWQgfCBhY3R1YWwgCistLS0tLS0tLS0tLSstLS0tLS0tLQorICAgICAgICAgMSB8 ICAgICAgMAorKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dz KCdzZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24g KGoxLmEgKyAxID0gajIuYSkgd2hlcmUgajEuYyA8IDUnKTsKKyBlc3RpbWF0ZWQgfCBhY3R1 YWwgCistLS0tLS0tLS0tLSstLS0tLS0tLQorICAgICA1MDAwMCB8ICA1MDAwMAorKDEgcm93 KQorCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBmcm9t IGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKGoxLmEgKyAxID0gajIu YSArIDEpIHdoZXJlIGoxLmMgPCA1Jyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0t LS0tLS0rLS0tLS0tLS0KKyAgICAgNTAwMDAgfCAgNTAwMDAKKygxIHJvdykKKworLS0gdHJ5 IGNvbWJpbmluZyB3aXRoIHNpbmdsZS1jb2x1bW4gKGFuZCBzaW5nbGUtZXhwcmVzc2lvbikg c3RhdGlzdGljcworRFJPUCBTVEFUSVNUSUNTIGpvaW5fc3RhdHNfMjsKK1NFTEVDVCAqIEZS T00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEg am9pbiBqb2luX3Rlc3RfMiBqMiBvbiAoajEuYSArIDEgPSBqMi5hKSB3aGVyZSBqMS5jIDwg NScpOworIGVzdGltYXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAg IDUwMDAwIHwgIDUwMDAwCisoMSByb3cpCisKKy0tIG5vIE1DViBvbiBqb2luX3Rlc3RfMiAo b24gdGhlIChhKzEpIGV4cHJlc3Npb24pCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRl ZF9yb3dzKCdzZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIg ajIgb24gKGoxLmEgKyAxID0gajIuYSArIDEpIHdoZXJlIGoxLmMgPCA1Jyk7CisgZXN0aW1h dGVkIHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAgIDI1MDAgfCAgNTAw MDAKKygxIHJvdykKKworQ1JFQVRFIFNUQVRJU1RJQ1Mgam9pbl9zdGF0c18yIE9OIChhKzEp IEZST00gam9pbl90ZXN0XzI7CitBTkFMWVpFIGpvaW5fdGVzdF8yOworU0VMRUNUICogRlJP TSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBq b2luIGpvaW5fdGVzdF8yIGoyIG9uIChqMS5hICsgMSA9IGoyLmEpIHdoZXJlIGoxLmMgPCA1 Jyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAg NTAwMDAgfCAgNTAwMDAKKygxIHJvdykKKworU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0 ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8y IGoyIG9uIChqMS5hICsgMSA9IGoyLmEgKyAxKSB3aGVyZSBqMS5jIDwgNScpOworIGVzdGlt YXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgIDUwMDAwIHwgIDUw MDAwCisoMSByb3cpCisKK0RST1AgVEFCTEUgam9pbl90ZXN0XzE7CitEUk9QIFRBQkxFIGpv aW5fdGVzdF8yOwogLS0gUGVybWlzc2lvbiB0ZXN0cy4gVXNlcnMgc2hvdWxkIG5vdCBiZSBh YmxlIHRvIHNlZSBzcGVjaWZpYyBkYXRhIHZhbHVlcyBpbgogLS0gdGhlIGV4dGVuZGVkIHN0 YXRpc3RpY3MsIGlmIHRoZXkgbGFjayBwZXJtaXNzaW9uIHRvIHNlZSB0aG9zZSB2YWx1ZXMg aW4KIC0tIHRoZSB1bmRlcmx5aW5nIHRhYmxlLgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVn cmVzcy9zcWwvc3RhdHNfZXh0LnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3N0YXRzX2V4 dC5zcWwKaW5kZXggNmZiMzc5NjJhNzIuLjcxZTU5YjUyNzk4IDEwMDY0NAotLS0gYS9zcmMv dGVzdC9yZWdyZXNzL3NxbC9zdGF0c19leHQuc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mv c3FsL3N0YXRzX2V4dC5zcWwKQEAgLTE1MDAsNiArMTUwMCw3MiBAQCBTRUxFQ1QgYzAgRlJP TSBPTkxZIGV4cHJfc3RhdHNfaW5jb21wYXRpYmxlX3Rlc3QgV0hFUkUKIAogRFJPUCBUQUJM RSBleHByX3N0YXRzX2luY29tcGF0aWJsZV90ZXN0OwogCisKKy0tIFRlc3Qgam9pbiBlc3Rp bWF0ZXMuCitDUkVBVEUgVEFCTEUgam9pbl90ZXN0XzEgKGEgaW50LCBiIGludCwgYyBpbnQp OworQ1JFQVRFIFRBQkxFIGpvaW5fdGVzdF8yIChhIGludCwgYiBpbnQsIGMgaW50KTsKKwor SU5TRVJUIElOVE8gam9pbl90ZXN0XzEgU0VMRUNUIG1vZChpLDEwKSwgbW9kKGksMTApLCBt b2QoaSwxMCkgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwxMDAwKSBzKGkpOworSU5TRVJUIElO VE8gam9pbl90ZXN0XzIgU0VMRUNUIG1vZChpLDEwKSwgbW9kKGksMTApLCBtb2QoaSwxMCkg RlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwxMDAwKSBzKGkpOworCitBTkFMWVpFIGpvaW5fdGVz dF8xOworQU5BTFlaRSBqb2luX3Rlc3RfMjsKKworU0VMRUNUICogRlJPTSBjaGVja19lc3Rp bWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVz dF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkgYW5kIChqMS5iID0gajIuYikpJyk7 CitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBmcm9tIGpv aW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKChqMS5hICsgMSA9IGoyLmEg KyAxKSBhbmQgKGoxLmIgPSBqMi5iKSkgd2hlcmUgajEuYyA8IDUnKTsKK1NFTEVDVCAqIEZS T00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEg am9pbiBqb2luX3Rlc3RfMiBqMiBvbiAoKGoxLmEgKyAxID0gajIuYSArIDEpIGFuZCAoajEu YiA9IGoyLmIpKSB3aGVyZSBqMS5jIDwgMCcpOworU0VMRUNUICogRlJPTSBjaGVja19lc3Rp bWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVz dF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkgYW5kIChqMS5iID0gajIuYikpIHdo ZXJlIGoxLmMgPCA1IGFuZCBqMi5jIDwgMycpOworU0VMRUNUICogRlJPTSBjaGVja19lc3Rp bWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVz dF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkgYW5kIChqMS5iID0gajIuYikpIHdo ZXJlIGoxLmMgPCA1IGFuZCBqMi5jID4gNScpOworCistLSBjYW4ndCBiZSBpbXByb3ZlZCBk dWUgdG8gdGhlIG9wdGltaXphdGlvbiBpbiBjbGF1c2VsaXN0X3NlbGVjdGl2aXR5X2V4dCwK Ky0tIHdoaWNoIHNraXBzIGNhc2VzIHdpdGggYSBzaW5nbGUgKGpvaW4pIGNsYXVzZQorU0VM RUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rl c3RfMSBqMSBqb2luIGpvaW5fdGVzdF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkp IHdoZXJlIGoxLmMgPCA1Jyk7CitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dz KCdzZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24g KChqMS5hICsgMSA9IGoyLmEgKyAxKSkgd2hlcmUgajEuYyA8IDUgYW5kIGoyLmMgPCA1Jyk7 CitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBmcm9tIGpv aW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKChqMS5hICsgMSA9IGoyLmEg KyAxKSkgd2hlcmUgajEuYyA8IDUgYW5kIGoyLmMgPiA1Jyk7CisKK1NFTEVDVCAqIEZST00g Y2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9p biBqb2luX3Rlc3RfMiBqMiBvbiAoajEuYSArIDEgPSBqMi5hKSB3aGVyZSBqMS5jIDwgNScp OworU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBq b2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8yIGoyIG9uIChqMS5hICsgMSA9IGoyLmEg KyAxKSB3aGVyZSBqMS5jIDwgNScpOworCistLSBjcmVhdGUgZXh0ZW5kZWQgc3RhdGlzdGlj cyBvbiB0aGUgam9pbi93aGVyZSBjb2x1bW5zCitDUkVBVEUgU1RBVElTVElDUyBqb2luX3N0 YXRzXzEgT04gYSwgYiwgYywgKGErMSksIChiKzEpIEZST00gam9pbl90ZXN0XzE7CitDUkVB VEUgU1RBVElTVElDUyBqb2luX3N0YXRzXzIgT04gYSwgYiwgYywgKGErMSksIChiKzEpIEZS T00gam9pbl90ZXN0XzI7CisKK0FOQUxZWkUgam9pbl90ZXN0XzE7CitBTkFMWVpFIGpvaW5f dGVzdF8yOworCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3Qg KiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKChqMS5hICsg MSA9IGoyLmEgKyAxKSBhbmQgKGoxLmIgPSBqMi5iKSknKTsKK1NFTEVDVCAqIEZST00gY2hl Y2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBq b2luX3Rlc3RfMiBqMiBvbiAoKGoxLmEgKyAxID0gajIuYSArIDEpIGFuZCAoajEuYiA9IGoy LmIpKSB3aGVyZSBqMS5jIDwgNScpOworU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRf cm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8yIGoy IG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkgYW5kIChqMS5iID0gajIuYikpIHdoZXJlIGox LmMgPCAwJyk7CitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3Qg KiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKChqMS5hICsg MSA9IGoyLmEgKyAxKSBhbmQgKGoxLmIgPSBqMi5iKSkgd2hlcmUgajEuYyA8IDUgYW5kIGoy LmMgPCAzJyk7CitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3Qg KiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKChqMS5hICsg MSA9IGoyLmEgKyAxKSBhbmQgKGoxLmIgPSBqMi5iKSkgd2hlcmUgajEuYyA8IDUgYW5kIGoy LmMgPiA1Jyk7CisKKy0tIGNhbid0IGJlIGltcHJvdmVkIGR1ZSB0byB0aGUgb3B0aW1pemF0 aW9uIGluIGNsYXVzZWxpc3Rfc2VsZWN0aXZpdHlfZXh0LAorLS0gd2hpY2ggc2tpcHMgY2Fz ZXMgd2l0aCBhIHNpbmdsZSAoam9pbikgY2xhdXNlCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2Vz dGltYXRlZF9yb3dzKCdzZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90 ZXN0XzIgajIgb24gKChqMS5hICsgMSA9IGoyLmEgKyAxKSkgd2hlcmUgajEuYyA8IDUnKTsK K1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9p bl90ZXN0XzEgajEgam9pbiBqb2luX3Rlc3RfMiBqMiBvbiAoKGoxLmEgKyAxID0gajIuYSAr IDEpKSB3aGVyZSBqMS5jIDwgNSBhbmQgajIuYyA8IDUnKTsKK1NFTEVDVCAqIEZST00gY2hl Y2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBq b2luX3Rlc3RfMiBqMiBvbiAoKGoxLmEgKyAxID0gajIuYSArIDEpKSB3aGVyZSBqMS5jIDwg NSBhbmQgajIuYyA+IDUnKTsKKworU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93 cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8yIGoyIG9u IChqMS5hICsgMSA9IGoyLmEpIHdoZXJlIGoxLmMgPCA1Jyk7CitTRUxFQ1QgKiBGUk9NIGNo ZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4g am9pbl90ZXN0XzIgajIgb24gKGoxLmEgKyAxID0gajIuYSArIDEpIHdoZXJlIGoxLmMgPCA1 Jyk7CisKKy0tIHRyeSBjb21iaW5pbmcgd2l0aCBzaW5nbGUtY29sdW1uIChhbmQgc2luZ2xl LWV4cHJlc3Npb24pIHN0YXRpc3RpY3MKK0RST1AgU1RBVElTVElDUyBqb2luX3N0YXRzXzI7 CisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20g am9pbl90ZXN0XzEgajEgam9pbiBqb2luX3Rlc3RfMiBqMiBvbiAoajEuYSArIDEgPSBqMi5h KSB3aGVyZSBqMS5jIDwgNScpOworCistLSBubyBNQ1Ygb24gam9pbl90ZXN0XzIgKG9uIHRo ZSAoYSsxKSBleHByZXNzaW9uKQorU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93 cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8yIGoyIG9u IChqMS5hICsgMSA9IGoyLmEgKyAxKSB3aGVyZSBqMS5jIDwgNScpOworCitDUkVBVEUgU1RB VElTVElDUyBqb2luX3N0YXRzXzIgT04gKGErMSkgRlJPTSBqb2luX3Rlc3RfMjsKK0FOQUxZ WkUgam9pbl90ZXN0XzI7CisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3Mo J3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBqb2luX3Rlc3RfMiBqMiBvbiAo ajEuYSArIDEgPSBqMi5hKSB3aGVyZSBqMS5jIDwgNScpOworU0VMRUNUICogRlJPTSBjaGVj a19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpv aW5fdGVzdF8yIGoyIG9uIChqMS5hICsgMSA9IGoyLmEgKyAxKSB3aGVyZSBqMS5jIDwgNScp OworCisKK0RST1AgVEFCTEUgam9pbl90ZXN0XzE7CitEUk9QIFRBQkxFIGpvaW5fdGVzdF8y OworCiAtLSBQZXJtaXNzaW9uIHRlc3RzLiBVc2VycyBzaG91bGQgbm90IGJlIGFibGUgdG8g c2VlIHNwZWNpZmljIGRhdGEgdmFsdWVzIGluCiAtLSB0aGUgZXh0ZW5kZWQgc3RhdGlzdGlj cywgaWYgdGhleSBsYWNrIHBlcm1pc3Npb24gdG8gc2VlIHRob3NlIHZhbHVlcyBpbgogLS0g dGhlIHVuZGVybHlpbmcgdGFibGUuCi0tIAoyLjMxLjEKCg== --------------1j1iyuSozyF7v6vxHxSODWaw--