Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vsgz2-00EamA-1S for pgsql-hackers@arkaria.postgresql.org; Wed, 18 Feb 2026 12:48:50 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vsgz1-00FqYB-0n for pgsql-hackers@arkaria.postgresql.org; Wed, 18 Feb 2026 12:48:47 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vsgz0-00FqY3-1c for pgsql-hackers@lists.postgresql.org; Wed, 18 Feb 2026 12:48:47 +0000 Received: from forward502a.mail.yandex.net ([178.154.239.82]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1vsgyu-00000001DSv-0JgK for pgsql-hackers@lists.postgresql.org; Wed, 18 Feb 2026 12:48:45 +0000 Received: from mail-nwsmtp-smtp-production-main-54.vla.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-54.vla.yp-c.yandex.net [IPv6:2a02:6b8:c17:2010:0:640:2180:0]) by forward502a.mail.yandex.net (Yandex) with ESMTPS id 6B10889DFF; Wed, 18 Feb 2026 15:48:37 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-54.vla.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id amZnwXNGlCg0-6sEwN4Bm; Wed, 18 Feb 2026 15:48:37 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tantorlabs.com; s=mail; t=1771418917; bh=T8fu9ZS6y+jN3VFlARF/pw5AoAIJUKhQO2LPO+kW1e8=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=mJKXSLeZ2eUE0L5a58kJbXew/pitjA7WMOF5bvoqJd1eo7unv2I4mw2DVgNCstE2G srFFjgpLbHDBwivzA3hS9Ch0kSVgPmVPOOGTRMeMac09KLTRo0sD3s4vBvvT2XkO5p QTDT7UKU+n1SBC0NUw2jlByQFDaaeHcrsRt0QlKg= Authentication-Results: mail-nwsmtp-smtp-production-main-54.vla.yp-c.yandex.net; dkim=pass header.i=@tantorlabs.com Content-Type: multipart/mixed; boundary="------------AY2bgGCkgStoegDiIbzFN6y6" Message-ID: <9e3054ae-1c5d-46dd-9b6a-7fb67764b076@tantorlabs.com> Date: Wed, 18 Feb 2026 15:48:36 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Hash-based MCV matching for large IN-lists To: Tatsuya Kawata , David Geier Cc: Chengpeng Yan , "pgsql-hackers@lists.postgresql.org" References: <7db341e0-fbc6-4ec5-922c-11fdafe7be12@tantorlabs.com> <988e3168-6096-488a-bb42-787e1e8c21a4@tantorlabs.com> <21FF6A0B-886F-4132-B6A6-0F4E934B4CEE@Outlook.com> <8ee9d903-bb13-434c-8145-b3769bf2b3cb@tantorlabs.com> Content-Language: en-US From: Ilia Evdokimov In-Reply-To: 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. --------------AY2bgGCkgStoegDiIbzFN6y6 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit I've fixed all the comments raised above and updated the v5 patch. On 2/7/26 10:42, Tatsuya Kawata wrote: > I initially considered consolidating this by checking for NULL > elements before building the hash table, but realized this would add > an extra loop in the common case where there are no NULLs. Thanks for that suggestion. We can check for NULL elements without an explicit loop by using memchr(), so there's no need for an additional building of hash table. I'll update patch with it. That said, I think it might be better to continue this small optimization with NULL for constant arrays separately in another thread. It's cleaner to split this work into smaller, focused changes rather than mixing everything into single patch If anything is still unclear in the code or insufficiently documented, or if you have other suggestions, please do not hesitate to point them out. -- Best regards. Ilia Evdokimov, Tantor Labs LLC, https://tantorlabs.com/ --------------AY2bgGCkgStoegDiIbzFN6y6 Content-Type: text/x-patch; charset=UTF-8; name="v5-0001-Use-hash-based-MCV-matching-for-ScalarArrayOpExpr.patch" Content-Disposition: attachment; filename*0="v5-0001-Use-hash-based-MCV-matching-for-ScalarArrayOpExpr.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSAwZGIwMGMyM2ZiYWRjNzZjMjM0NWQzZDE0ZDc5NzJjODVkNDA3MTk2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBJbGlhIEV2ZG9raW1vdiA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5ydT4KRGF0ZTogV2VkLCAxOCBGZWIgMjAyNiAxNToxOTowMCArMDMwMApT dWJqZWN0OiBbUEFUQ0ggdjVdIFVzZSBoYXNoLWJhc2VkIE1DViBtYXRjaGluZyBmb3IgU2Nh bGFyQXJyYXlPcEV4cHIKIHNlbGVjdGl2aXR5CgpXaGVuIGVzdGltYXRpbmcgc2VsZWN0aXZp dHkgZm9yIFNjYWxhckFycmF5T3BFeHByIChJTiAvIEFOWSAvIEFMTCkgd2l0aAphdmFpbGFi bGUgTUNWIHN0YXRpc3RpY3MsIHRoZSBwbGFubmVyIGN1cnJlbnRseSBtYXRjaGVzIElOLWxp c3QgZWxlbWVudHMKYWdhaW5zdCB0aGUgTUNWIGFycmF5IHVzaW5nIG5lc3RlZCBsb29wcy4g Rm9yIGxhcmdlIElOLWxpc3RzIGFuZC9vciBsYXJnZQpNQ1YgbGlzdHMgdGhpcyBsZWFkcyB0 byBPKE4qTSkgcGxhbm5pbmctdGltZSBiZWhhdmlvci4KClRoaXMgcGF0Y2ggYWRkcyBhIGhh c2gtYmFzZWQgbWF0Y2hpbmcgc3RyYXRlZ3ksIHNpbWlsYXIgdG8gdGhlIG9uZSB1c2VkCmlu IGpvaW4gc2VsZWN0aXZpdHkgZXN0aW1hdGlvbi4gV2hlbiBNQ1Ygc3RhdGlzdGljcyBhcmUg YXZhaWxhYmxlIGFuZCB0aGUKb3BlcmF0b3Igc3VwcG9ydHMgaGFzaGluZywgdGhlIHNtYWxs ZXIgb2YgdGhlIHR3byBpbnB1dHMgKE1DViBsaXN0IG9yCklOLWxpc3QgY29uc3RhbnQgZWxl bWVudHMpIGlzIGNob3NlbiBhcyB0aGUgaGFzaCB0YWJsZSBidWlsZCBzaWRlLCBhbmQKdGhl IG90aGVyIHNpZGUgaXMgc2Nhbm5lZCBvbmNlLCByZWR1Y2luZyBjb21wbGV4aXR5IHRvIE8o TitNKS4KClRoZSBoYXNoLWJhc2VkIHBhdGggaXMgcmVzdHJpY3RlZCB0byBlcXVhbGl0eSBh bmQgaW5lcXVhbGl0eSBvcGVyYXRvcnMKdGhhdCB1c2UgZXFzZWwoKS9uZXFzZWwoKSwgYW5k IGlzIGFwcGxpZWQgb25seSB3aGVuIHN1aXRhYmxlIGhhc2gKZnVuY3Rpb25zIGFuZCBNQ1Yg c3RhdGlzdGljcyBhcmUgYXZhaWxhYmxlLgotLS0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9z ZWxmdW5jcy5jIHwgNTIzICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KIDEgZmls ZSBjaGFuZ2VkLCA1MTggaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYyBiL3NyYy9iYWNrZW5kL3V0 aWxzL2FkdC9zZWxmdW5jcy5jCmluZGV4IDI5ZmVjNjU1NTkzLi41MDk4NTM2NDJjMSAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKKysrIGIvc3JjL2Jh Y2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKQEAgLTE0NiwyMyArMTQ2LDI3IEBACiAvKgog ICogSW4gcHJvZHVjdGlvbiBidWlsZHMsIHN3aXRjaCB0byBoYXNoLWJhc2VkIE1DViBtYXRj aGluZyB3aGVuIHRoZSBsaXN0cyBhcmUKICAqIGxhcmdlIGVub3VnaCB0byBhbW9ydGl6ZSBo YXNoIHNldHVwIGNvc3QuICAoVGhpcyB0aHJlc2hvbGQgaXMgY29tcGFyZWQgdG8KLSAqIHRo ZSBzdW0gb2YgdGhlIGxlbmd0aHMgb2YgdGhlIHR3byBNQ1YgbGlzdHMuICBUaGlzIGlzIHNp bXBsaXN0aWMgYnV0IHNlZW1zCisgKiB0aGUgc3VtIG9mIHRoZSBsZW5ndGhzIG9mIHRoZSB0 d28gbGlzdHMuICBUaGlzIGlzIHNpbXBsaXN0aWMgYnV0IHNlZW1zCiAgKiB0byB3b3JrIHdl bGwgZW5vdWdoLikgIEluIGRlYnVnIGJ1aWxkcywgd2UgdXNlIGEgc21hbGxlciB0aHJlc2hv bGQgc28gdGhhdAogICogdGhlIHJlZ3Jlc3Npb24gdGVzdHMgY292ZXIgYm90aCBwYXRocyB3 ZWxsLgogICovCiAjaWZuZGVmIFVTRV9BU1NFUlRfQ0hFQ0tJTkcKLSNkZWZpbmUgRVFKT0lO U0VMX01DVl9IQVNIX1RIUkVTSE9MRCAyMDAKKyNkZWZpbmUgTUNWX0hBU0hfVEhSRVNIT0xE IDIwMAogI2Vsc2UKLSNkZWZpbmUgRVFKT0lOU0VMX01DVl9IQVNIX1RIUkVTSE9MRCAyMAor I2RlZmluZSBNQ1ZfSEFTSF9USFJFU0hPTEQgMjAKICNlbmRpZgogCi0vKiBFbnRyaWVzIGlu IHRoZSBzaW1wbGVoYXNoIGhhc2ggdGFibGUgdXNlZCBieSBlcWpvaW5zZWxfZmluZF9tYXRj aGVzICovCisvKgorICogRW50cmllcyBpbiB0aGUgc2ltcGxlaGFzaCBoYXNoIHRhYmxlIHVz ZWQgYnkKKyAqIGVxam9pbnNlbF9maW5kX21hdGNoZXMgYW5kIHNjYWxhcmFycmF5X21jdl9o YXNoX21hdGNoCisgKi8KIHR5cGVkZWYgc3RydWN0IE1DVkhhc2hFbnRyeQogewogCURhdHVt CQl2YWx1ZTsJCQkvKiB0aGUgdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhpcyBlbnRyeSAqLwog CWludAkJCWluZGV4OwkJCS8qIGl0cyBpbmRleCBpbiB0aGUgcmVsZXZhbnQgQXR0U3RhdHNT bG90ICovCiAJdWludDMyCQloYXNoOwkJCS8qIGhhc2ggY29kZSBmb3IgdGhlIERhdHVtICov CiAJY2hhcgkJc3RhdHVzOwkJCS8qIHN0YXR1cyBjb2RlIHVzZWQgYnkgc2ltcGxlaGFzaC5o ICovCisJaW50CQkJY291bnQ7CQkJLyogbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIGN1cnJl bnQgdmFsdWUgaW4gKi8KIH0gTUNWSGFzaEVudHJ5OwogCiAvKiBwcml2YXRlX2RhdGEgZm9y IHRoZSBzaW1wbGVoYXNoIGhhc2ggdGFibGUgKi8KQEAgLTE4NCw2ICsxODgsMTQgQEAgZ2V0 X3JlbGF0aW9uX3N0YXRzX2hvb2tfdHlwZSBnZXRfcmVsYXRpb25fc3RhdHNfaG9vayA9IE5V TEw7CiBnZXRfaW5kZXhfc3RhdHNfaG9va190eXBlIGdldF9pbmRleF9zdGF0c19ob29rID0g TlVMTDsKIAogc3RhdGljIGRvdWJsZSBlcXNlbF9pbnRlcm5hbChQR19GVU5DVElPTl9BUkdT LCBib29sIG5lZ2F0ZSk7CitzdGF0aWMgZG91YmxlIHNjYWxhcmFycmF5X21jdl9oYXNoX21h dGNoKFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGEsIE9pZCBvcGVyYXRvciwgT2lkIGNvbGxh dGlvbiwKKwkJCQkJCQkJCQkgTm9kZSAqb3RoZXJfb3AsIGJvb2wgdmFyX29uX2xlZnQsIERh dHVtICplbGVtX3ZhbHVlcywKKwkJCQkJCQkJCQkgYm9vbCAqZWxlbV9udWxscywgaW50IG51 bV9lbGVtcywgYm9vbCAqZWxlbV9jb25zdCwKKwkJCQkJCQkJCQkgT2lkIG5vbWluYWxfZWxl bWVudF90eXBlLCBib29sIHVzZU9yLCBib29sIGlzRXF1YWxpdHksCisJCQkJCQkJCQkJIGJv b2wgaXNJbmVxdWFsaXR5KTsKK3N0YXRpYyB2b2lkIGFjY3VtX3NjYWxhcmFycmF5X3Byb2Io U2VsZWN0aXZpdHkgczEsIGJvb2wgdXNlT3IsIGJvb2wgaXNFcXVhbGl0eSwKKwkJCQkJCQkJ ICAgYm9vbCBpc0luZXF1YWxpdHksIGRvdWJsZSBudWxsZnJhYywKKwkJCQkJCQkJICAgZG91 YmxlICpzZWxlYywgZG91YmxlICpzMWRpc2pvaW50KTsKIHN0YXRpYyBkb3VibGUgZXFqb2lu c2VsX2lubmVyKEZtZ3JJbmZvICplcXByb2MsIE9pZCBjb2xsYXRpb24sCiAJCQkJCQkJICBP aWQgaGFzaExlZnQsIE9pZCBoYXNoUmlnaHQsCiAJCQkJCQkJICBWYXJpYWJsZVN0YXREYXRh ICp2YXJkYXRhMSwgVmFyaWFibGVTdGF0RGF0YSAqdmFyZGF0YTIsCkBAIC0yMDI1LDYgKzIw MzcsNDIgQEAgc2NhbGFyYXJyYXlzZWwoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkgIGVs bWxlbiwgZWxtYnl2YWwsIGVsbWFsaWduLAogCQkJCQkJICAmZWxlbV92YWx1ZXMsICZlbGVt X251bGxzLCAmbnVtX2VsZW1zKTsKIAorCQkvKiBGb3IgV0hFUkUgeCBOT1QgSU4gKE5VTEws IC4uLikgc2VsZWN0aXZpdHkgaXMgYWx3YXlzIDAuMCAqLworCQlpZiAoIXVzZU9yICYmIG1l bWNocihlbGVtX251bGxzLCB0cnVlLCBudW1fZWxlbXMpICE9IE5VTEwpCisJCQlyZXR1cm4g KFNlbGVjdGl2aXR5KSAwLjA7CisKKwkJLyoKKwkJICogVHJ5IHRvIGNhbGN1bGF0ZSBzZWxl Y3Rpdml0eSBieSBoYXNoLXNlYXJjaCBPKE4pIGluc3RlYWQgb2YgTyhOXjIpCisJCSAqIGlu IGNhc2Ugb2YgTUNWIG1hdGNoaW5nLiAgV2UgdXNlIGhhc2gtc2VhcmNoIG9ubHkgZm9yIGVx c2VsKCkgYW5kCisJCSAqIG5lcXNlbCgpLgorCQkgKi8KKwkJaWYgKChpc0VxdWFsaXR5IHx8 IGlzSW5lcXVhbGl0eSkgJiYgIWlzX2pvaW5fY2xhdXNlKQorCQl7CisJCQlWYXJpYWJsZVN0 YXREYXRhIHZhcmRhdGE7CisJCQlOb2RlCSAgICpvdGhlcl9vcCA9IE5VTEw7CisJCQlib29s CQl2YXJfb25fbGVmdDsKKworCQkJLyoKKwkJCSAqIElmIGV4cHJlc3Npb24gaXMgbm90IHZh cmlhYmxlID0gc29tZXRoaW5nIG9yIHNvbWV0aGluZyA9CisJCQkgKiB2YXJpYWJsZSwgdGhl biBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjb2RlIHBhdGggdG8gY29tcHV0ZQorCQkJICogZGVm YXVsdCBzZWxlY3Rpdml0eS4KKwkJCSAqLworCQkJaWYgKGdldF9yZXN0cmljdGlvbl92YXJp YWJsZShyb290LCBjbGF1c2UtPmFyZ3MsIHZhclJlbGlkLAorCQkJCQkJCQkJCSAmdmFyZGF0 YSwgJm90aGVyX29wLCAmdmFyX29uX2xlZnQpKQorCQkJeworCQkJCWJvb2wJICAgKmVsZW1f Y29uc3QgPSBOVUxMOworCisJCQkJczEgPSBzY2FsYXJhcnJheV9tY3ZfaGFzaF9tYXRjaCgm dmFyZGF0YSwgb3BlcmF0b3IsIGNsYXVzZS0+aW5wdXRjb2xsaWQsIG90aGVyX29wLCB2YXJf b25fbGVmdCwKKwkJCQkJCQkJCQkJCWVsZW1fdmFsdWVzLCBlbGVtX251bGxzLCBudW1fZWxl bXMsIGVsZW1fY29uc3QsCisJCQkJCQkJCQkJCQlub21pbmFsX2VsZW1lbnRfdHlwZSwgdXNl T3IsIGlzRXF1YWxpdHksIGlzSW5lcXVhbGl0eSk7CisKKwkJCQlSZWxlYXNlVmFyaWFibGVT dGF0cyh2YXJkYXRhKTsKKworCQkJCWlmIChzMSA+PSAwLjApCisJCQkJCXJldHVybiBzMTsK KwkJCX0KKwkJfQorCiAJCS8qCiAJCSAqIEZvciBnZW5lcmljIG9wZXJhdG9ycywgd2UgYXNz dW1lIHRoZSBwcm9iYWJpbGl0eSBvZiBzdWNjZXNzIGlzCiAJCSAqIGluZGVwZW5kZW50IGZv ciBlYWNoIGFycmF5IGVsZW1lbnQuICBCdXQgZm9yICI9IEFOWSIgb3IgIjw+IEFMTCIsCkBA IC0yMTAwLDYgKzIxNDgsODcgQEAgc2NhbGFyYXJyYXlzZWwoUGxhbm5lckluZm8gKnJvb3Qs CiAJCWdldF90eXBsZW5ieXZhbChhcnJheWV4cHItPmVsZW1lbnRfdHlwZWlkLAogCQkJCQkJ JmVsbWxlbiwgJmVsbWJ5dmFsKTsKIAorCQkvKgorCQkgKiBUcnkgdG8gY2FsY3VsYXRlIHNl bGVjdGl2aXR5IGJ5IGhhc2gtc2VhcmNoIE8oTikgaW5zdGVhZCBvZiBPKE5eMikKKwkJICog aW4gY2FzZSBvZiBNQ1YgbWF0Y2hpbmcuICBXZSB1c2UgaGFzaC1zZWFyY2ggb25seSBmb3Ig ZXFzZWwoKSBhbmQKKwkJICogbmVxc2VsKCkuCisJCSAqLworCQlpZiAoKGlzRXF1YWxpdHkg fHwgaXNJbmVxdWFsaXR5KSAmJiAhaXNfam9pbl9jbGF1c2UpCisJCXsKKwkJCVZhcmlhYmxl U3RhdERhdGEgdmFyZGF0YTsKKwkJCU5vZGUJICAgKm90aGVyX29wID0gTlVMTDsKKwkJCWJv b2wJCXZhcl9vbl9sZWZ0OworCisJCQkvKgorCQkJICogSWYgZXhwcmVzc2lvbiBpcyBub3Qg dmFyaWFibGUgPSBzb21ldGhpbmcgb3Igc29tZXRoaW5nID0KKwkJCSAqIHZhcmlhYmxlLCB0 aGVuIGZhbGwgYmFjayB0byBkZWZhdWx0IGNvZGUgcGF0aCB0byBjb21wdXRlCisJCQkgKiBk ZWZhdWx0IHNlbGVjdGl2aXR5LgorCQkJICovCisJCQlpZiAoZ2V0X3Jlc3RyaWN0aW9uX3Zh cmlhYmxlKHJvb3QsIGNsYXVzZS0+YXJncywgdmFyUmVsaWQsCisJCQkJCQkJCQkJICZ2YXJk YXRhLCAmb3RoZXJfb3AsICZ2YXJfb25fbGVmdCkpCisJCQl7CisJCQkJaW50CQkJbnVtX2Vs ZW1zOworCQkJCURhdHVtCSAgICplbGVtX3ZhbHVlczsKKwkJCQlib29sCSAgICplbGVtX251 bGxzOworCQkJCWJvb2wJICAgKmVsZW1fY29uc3Q7CisJCQkJTGlzdENlbGwgICAqbGM7CisJ CQkJaW50CQkJaTsKKworCQkJCW51bV9lbGVtcyA9IGxpc3RfbGVuZ3RoKGFycmF5ZXhwci0+ ZWxlbWVudHMpOworCQkJCWVsZW1fdmFsdWVzID0gcGFsbG9jMF9hcnJheShEYXR1bSwgbnVt X2VsZW1zKTsKKwkJCQllbGVtX251bGxzID0gcGFsbG9jMF9hcnJheShib29sLCBudW1fZWxl bXMpOworCQkJCWVsZW1fY29uc3QgPSBwYWxsb2MwX2FycmF5KGJvb2wsIG51bV9lbGVtcyk7 CisKKwkJCQkvKgorCQkJCSAqIEJ1aWxkIGFycmF5cyBkZXNjcmliaW5nIEFSUkFZW10gZWxl bWVudHM6IC0gZWxlbV92YWx1ZXM6CisJCQkJICogRGF0dW0gdmFsdWUgZm9yIENvbnN0IGVs ZW1lbnRzIC0gZWxlbV9udWxsczogd2hldGhlcgorCQkJCSAqIGVsZW1lbnQgaXMgTlVMTCAt IGVsZW1fY29uc3Q6IHdoZXRoZXIgZWxlbWVudCBpcyBhIENvbnN0CisJCQkJICogbm9kZQor CQkJCSAqLworCQkJCWkgPSAwOworCQkJCWZvcmVhY2gobGMsIGFycmF5ZXhwci0+ZWxlbWVu dHMpCisJCQkJeworCQkJCQlOb2RlCSAgICplbGVtX3ZhbHVlID0gKE5vZGUgKikgbGZpcnN0 KGxjKTsKKworCQkJCQlpZiAoSXNBKGVsZW1fdmFsdWUsIENvbnN0KSkKKwkJCQkJeworCQkJ CQkJZWxlbV92YWx1ZXNbaV0gPSAoKENvbnN0ICopIGVsZW1fdmFsdWUpLT5jb25zdHZhbHVl OworCQkJCQkJZWxlbV9udWxsc1tpXSA9ICgoQ29uc3QgKikgZWxlbV92YWx1ZSktPmNvbnN0 aXNudWxsOworCQkJCQkJZWxlbV9jb25zdFtpXSA9IHRydWU7CisJCQkJCX0KKwkJCQkJZWxz ZQorCQkJCQl7CisJCQkJCQllbGVtX251bGxzW2ldID0gZmFsc2U7CisJCQkJCQllbGVtX2Nv bnN0W2ldID0gZmFsc2U7CisJCQkJCX0KKworCQkJCQlpZiAoIXVzZU9yICYmIGVsZW1fbnVs bHNbaV0pCisJCQkJCXsKKwkJCQkJCXBmcmVlKGVsZW1fdmFsdWVzKTsKKwkJCQkJCXBmcmVl KGVsZW1fbnVsbHMpOworCQkJCQkJcGZyZWUoZWxlbV9jb25zdCk7CisKKwkJCQkJCXJldHVy biAoU2VsZWN0aXZpdHkpIDAuMDsKKwkJCQkJfQorCisJCQkJCWkrKzsKKwkJCQl9CisKKwkJ CQlzMSA9IHNjYWxhcmFycmF5X21jdl9oYXNoX21hdGNoKCZ2YXJkYXRhLCBvcGVyYXRvciwg Y2xhdXNlLT5pbnB1dGNvbGxpZCwgb3RoZXJfb3AsIHZhcl9vbl9sZWZ0LAorCQkJCQkJCQkJ CQkJZWxlbV92YWx1ZXMsIGVsZW1fbnVsbHMsIG51bV9lbGVtcywgZWxlbV9jb25zdCwKKwkJ CQkJCQkJCQkJCW5vbWluYWxfZWxlbWVudF90eXBlLCB1c2VPciwgaXNFcXVhbGl0eSwgaXNJ bmVxdWFsaXR5KTsKKworCQkJCXBmcmVlKGVsZW1fdmFsdWVzKTsKKwkJCQlwZnJlZShlbGVt X251bGxzKTsKKwkJCQlwZnJlZShlbGVtX2NvbnN0KTsKKworCQkJCVJlbGVhc2VWYXJpYWJs ZVN0YXRzKHZhcmRhdGEpOworCisJCQkJaWYgKHMxID49IDAuMCkKKwkJCQkJcmV0dXJuIHMx OworCQkJfQorCQl9CisKIAkJLyoKIAkJICogV2UgdXNlIHRoZSBhc3N1bXB0aW9uIG9mIGRp c2pvaW50IHByb2JhYmlsaXRpZXMgaGVyZSB0b28sIGFsdGhvdWdoCiAJCSAqIHRoZSBvZGRz IG9mIGVxdWFsIGFycmF5IGVsZW1lbnRzIGFyZSByYXRoZXIgaGlnaGVyIGlmIHRoZSBlbGVt ZW50cwpAQCAtMjIxMCw2ICsyMzM5LDM5MCBAQCBzY2FsYXJhcnJheXNlbChQbGFubmVySW5m byAqcm9vdCwKIAlyZXR1cm4gczE7CiB9CiAKKworLyoKKyAqIEVzdGltYXRlIHNlbGVjdGl2 aXR5IG9mIGEgU2NhbGFyQXJyYXlPcEV4cHIgKEFOWS9BTEwpIHVzaW5nIE1DViBzdGF0aXN0 aWNzCisgKiB3aXRoIGhhc2gtYmFzZWQgbWF0Y2hpbmcuCisgKgorICogVGhpcyBmdW5jdGlv biBmb2xsb3dzIHRoZSBzYW1lIHByb2JhYmlsaXR5IG1vZGVsIGFzIHRoZSBnZW5lcmljCisg KiBTY2FsYXJBcnJheU9wRXhwciBzZWxlY3Rpdml0eSBjb2RlIChpbmRlcGVuZGVudCBvciBk aXNqb2ludCBwcm9iYWJpbGl0aWVzCisgKiBmb3IgT1IvQU5EIGNvbWJpbmF0aW9ucyksIGJ1 dCBhdHRlbXB0cyB0byBzcGVlZCB1cCBtYXRjaGluZyBiZXR3ZWVuCisgKiBJTi1saXN0IGVs ZW1lbnRzIGFuZCB0aGUgY29sdW1uJ3MgbW9zdC1jb21tb24tdmFsdWVzIChNQ1YpIHN0YXRp c3RpY3MgYnkKKyAqIHVzaW5nIGhhc2hpbmcgaW5zdGVhZCBvZiBuZXN0ZWQgbG9vcHMuCisg KgorICogTUNWIHN0YXRpc3RpY3MgYXJlIHVzZWQgb25seSB0byBvYnRhaW4gcGVyLXZhbHVl IHNlbGVjdGl2aXRpZXMgZm9yCisgKiBjb25zdGFudHMgdGhhdCBtYXRjaCBNQ1YgZW50cmll cy4gIEFsbCBwcm9iYWJpbGl0aWVzIGFyZSBjb21iaW5lZCB1c2luZworICogdGhlIHN0YW5k YXJkIEFOWS9BTEwgZm9ybXVsYXMsIGV4YWN0bHkgYXMgaW4gdGhlIGdlbmVyaWMgZXN0aW1h dG9yLgorICoKKyAqIFRoZSBmdW5jdGlvbiBtYXkgcmV0dXJuIC0xLjAgdG8gaW5kaWNhdGUg dGhhdCBoYXNoLWJhc2VkIE1DViBlc3RpbWF0aW9uCisgKiBpcyBub3QgYXBwbGljYWJsZSAo Zm9yIGV4YW1wbGUsIG1pc3Npbmcgc3RhdGlzdGljcywgdW5zdXBwb3J0ZWQgb3BlcmF0b3Is CisgKiBvciB1bmF2YWlsYWJsZSBoYXNoIGZ1bmN0aW9ucyksIGluIHdoaWNoIGNhc2UgdGhl IGNhbGxlciBzaG91bGQgZmFsbCBiYWNrCisgKiB0byB0aGUgZ2VuZXJpYyBTY2FsYXJBcnJh eU9wRXhwciBzZWxlY3Rpdml0eSBlc3RpbWF0aW9uLgorICoKKyAqIElucHV0czoKKyAqCXZh cmRhdGE6IHN0YXRpc3RpY3MgYW5kIG1ldGFkYXRhIGZvciB0aGUgdmFyaWFibGUgYmVpbmcg ZXN0aW1hdGVkCisgKglvcGVyYXRvcjogZXF1YWxpdHkgb3IgaW5lcXVhbGl0eSBvcGVyYXRv ciB0byBhcHBseQorICoJY29sbGF0aW9uOiBPSUQgb2YgY29sbGF0aW9uIHRvIHVzZQorICoJ b3RoZXJfb3A6IGV4cHJlc3Npb24gZm9yIHRoZSBub24tdmFyaWFibGUgc2lkZSBvZiB0aGUg Y29tcGFyaXNvbgorICoJdmFyX29uX2xlZnQ6IHRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIG9u IHRoZSBsZWZ0IHNpZGUgb2YgdGhlIG9wZXJhdG9yCisgKgllbGVtX3ZhbHVlczogYXJyYXkg b2YgSU4tbGlzdCBlbGVtZW50IHZhbHVlcworICoJZWxlbV9udWxsczogYXJyYXkgaW5kaWNh dGluZyB3aGljaCBJTi1saXN0IGVsZW1lbnRzIGFyZSBOVUxMCisgKgllbGVtX2NvbnN0OiBh cnJheSBpbmRpY2F0aW5nIHdoaWNoIElOLWxpc3QgZWxlbWVudHMgYXJlIENvbnN0IG5vZGVz LgorICogICAgICAgICAgICAgIGFycmF5IGlzIE5VTEwgaWYgYWxsIGVsZW1uZXRzIGlzIGNv bnN0LgorICoJbnVtX2VsZW1zOiBudW1iZXIgb2YgSU4tbGlzdCBlbGVtZW50cworICoJbm9t aW5hbF9lbGVtZW50X3R5cGU6IHR5cGUgb2YgSU4tbGlzdCBlbGVtZW50cworICoJdXNlT3I6 IHRydWUgaWYgZWxlbWVudHMgYXJlIGNvbWJpbmVkIHVzaW5nIE9SIHNlbWFudGljcywgZmFs c2UgZm9yIEFORAorICoJaXNFcXVhbGl0eTogdHJ1ZSBpZiB0aGUgb3BlcmF0b3IgYmVoYXZl cyBsaWtlIGVxdWFsaXR5CisgKglpc0luZXF1YWxpdHk6IHRydWUgaWYgdGhlIG9wZXJhdG9y IGJlaGF2ZXMgbGlrZSBpbmVxdWFsaXR5CisgKgorICogUmVzdWx0OgorICoJU2VsZWN0aXZp dHkgZXN0aW1hdGUgaW4gdGhlIHJhbmdlIFswLjAsIDEuMF0sIG9yIC0xLjAgaWYgbm8gZXN0 aW1hdGUKKyAqCWNvdWxkIGJlIHByb2R1Y2VkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKgorICog Tm90ZToKKyAqCVRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSBvcGVyYXRvcuKAmXMg c2VsZWN0aXZpdHkgYmVoYXZpb3IgbWF0Y2hlcworICoJZXFzZWwoKS9uZXFzZWwgc2VtYW50 aWNzLiAgSXQgbXVzdCBub3QgYmUgdXNlZCBmb3Igb3BlcmF0b3JzIHdpdGggY3VzdG9tCisg KglvciBub24tc3RhbmRhcmQgc2VsZWN0aXZpdHkgYmVoYXZpb3IuCisgKi8KK3N0YXRpYyBk b3VibGUKK3NjYWxhcmFycmF5X21jdl9oYXNoX21hdGNoKFZhcmlhYmxlU3RhdERhdGEgKnZh cmRhdGEsIE9pZCBvcGVyYXRvciwgT2lkIGNvbGxhdGlvbiwKKwkJCQkJCSAgIE5vZGUgKm90 aGVyX29wLCBib29sIHZhcl9vbl9sZWZ0LAorCQkJCQkJICAgRGF0dW0gKmVsZW1fdmFsdWVz LCBib29sICplbGVtX251bGxzLCBpbnQgbnVtX2VsZW1zLCBib29sICplbGVtX2NvbnN0LAor CQkJCQkJICAgT2lkIG5vbWluYWxfZWxlbWVudF90eXBlLCBib29sIHVzZU9yLCBib29sIGlz RXF1YWxpdHksCisJCQkJCQkgICBib29sIGlzSW5lcXVhbGl0eSkKK3sKKwlGb3JtX3BnX3N0 YXRpc3RpYyBzdGF0czsKKwlBdHRTdGF0c1Nsb3Qgc3Nsb3Q7CisJRm1nckluZm8JZXFwcm9j OworCWRvdWJsZQkJc2VsZWMgPSAtMS4wLAorCQkJCXMxZGlzam9pbnQsCisJCQkJbnVsbGZy YWMgPSAwLjA7CisJT2lkCQkJaGFzaExlZnQgPSBJbnZhbGlkT2lkLAorCQkJCWhhc2hSaWdo dCA9IEludmFsaWRPaWQsCisJCQkJb3BmdW5jb2lkOworCWJvb2wJCWhhdmVfbWN2cyA9IGZh bHNlOworCisJLyoKKwkgKiBJZiB0aGUgdmFyaWFibGUgaXMga25vd24gdG8gYmUgdW5pcXVl LCBNQ1Ygc3RhdGlzdGljcyBkbyBub3QgcmVwcmVzZW50CisJICogYSBtZWFuaW5nZnVsIGZy ZXF1ZW5jeSBkaXN0cmlidXRpb24sIHNvIHNraXAgTUNWLWJhc2VkIGVzdGltYXRpb24uCisJ ICovCisJaWYgKHZhcmRhdGEtPmlzdW5pcXVlICYmIHZhcmRhdGEtPnJlbCAmJiB2YXJkYXRh LT5yZWwtPnR1cGxlcyA+PSAxLjApCisJCXJldHVybiAtMS4wOworCisJLyoKKwkgKiBGb3Ig aW5lcXVhbGl0eSAoPD4sIEFMTCksIHdlIGNvbXB1dGUgcHJvYmFiaWxpdGllcyB1c2luZyB0 aGUgbmVnYXRlZAorCSAqIGVxdWFsaXR5IG9wZXJhdG9yIGFuZCBsYXRlciB0cmFuc2Zvcm0g dGhlbSBhcworCSAqCisJICogcCh4IDw+IGMpID0gMSAtIHAoeCA9IGMpIC0gbnVsbGZyYWMK KwkgKi8KKwlpZiAoaXNJbmVxdWFsaXR5KQorCXsKKwkJb3BlcmF0b3IgPSBnZXRfbmVnYXRv cihvcGVyYXRvcik7CisJCWlmICghT2lkSXNWYWxpZChvcGVyYXRvcikpCisJCQlyZXR1cm4g LTEuMDsKKwl9CisKKwlvcGZ1bmNvaWQgPSBnZXRfb3Bjb2RlKG9wZXJhdG9yKTsKKwltZW1z ZXQoJnNzbG90LCAwLCBzaXplb2Yoc3Nsb3QpKTsKKworCWlmIChIZWFwVHVwbGVJc1ZhbGlk KHZhcmRhdGEtPnN0YXRzVHVwbGUpKQorCXsKKwkJaWYgKHN0YXRpc3RpY19wcm9jX3NlY3Vy aXR5X2NoZWNrKHZhcmRhdGEsIG9wZnVuY29pZCkpCisJCQloYXZlX21jdnMgPSBnZXRfYXR0 c3RhdHNzbG90KCZzc2xvdCwgdmFyZGF0YS0+c3RhdHNUdXBsZSwKKwkJCQkJCQkJCQkgU1RB VElTVElDX0tJTkRfTUNWLCBJbnZhbGlkT2lkLAorCQkJCQkJCQkJCSBBVFRTVEFUU1NMT1Rf VkFMVUVTIHwgQVRUU1RBVFNTTE9UX05VTUJFUlMpOworCX0KKworCWlmIChoYXZlX21jdnMp CisJeworCQkvKgorCQkgKiBJZiB0aGUgTUNWIGxpc3QgYW5kIElOLWxpc3QgYXJlIGxhcmdl IGVub3VnaCwgYW5kIHRoZSBvcGVyYXRvcgorCQkgKiBzdXBwb3J0cyBoYXNoaW5nLCBhdHRl bXB0IHRvIHVzZSBoYXNoIGZ1bmN0aW9ucyBzbyB0aGF0IE1DVuKAk0lOCisJCSAqIG1hdGNo aW5nIGNhbiBiZSBkb25lIGluIE8oTitNKSBpbnN0ZWFkIG9mIE8oTsOXTSkuCisJCSAqLwor CQlpZiAoc3Nsb3QubnZhbHVlcyArIG51bV9lbGVtcyA+PSBNQ1ZfSEFTSF9USFJFU0hPTEQp CisJCXsKKwkJCWZtZ3JfaW5mbyhvcGZ1bmNvaWQsICZlcXByb2MpOworCQkJKHZvaWQpIGdl dF9vcF9oYXNoX2Z1bmN0aW9ucyhvcGVyYXRvciwgJmhhc2hMZWZ0LCAmaGFzaFJpZ2h0KTsK KwkJfQorCX0KKworCWlmIChoYXZlX21jdnMgJiYgT2lkSXNWYWxpZChoYXNoTGVmdCkgJiYg T2lkSXNWYWxpZChoYXNoUmlnaHQpKQorCXsKKwkJLyogVXNlIGEgaGFzaCB0YWJsZSB0byBz cGVlZCB1cCB0aGUgbWF0Y2hpbmcgKi8KKwkJTE9DQUxfRkNJTkZPKGZjaW5mbywgMik7CisJ CUxPQ0FMX0ZDSU5GTyhoYXNoX2ZjaW5mbywgMSk7CisJCU1DVkhhc2hUYWJsZV9oYXNoICpo YXNoVGFibGU7CisJCUZtZ3JJbmZvCWhhc2hfcHJvYzsKKwkJTUNWSGFzaENvbnRleHQgaGFz aENvbnRleHQ7CisJCWRvdWJsZQkJc3VtYWxsY29tbW9uID0gMC4wLAorCQkJCQlub25tY3Zf c2VsZWMgPSAwLjA7CisJCWJvb2wJCWlzZGVmYXVsdDsKKwkJYm9vbAkJaGFzaF9tY3Y7CisJ CWRvdWJsZQkJb3RoZXJkaXN0aW5jdDsKKwkJRGF0dW0JICAgKmFycmF5SGFzaDsKKwkJRGF0 dW0JICAgKmFycmF5UHJvYmU7CisJCWludAkJCW52YWx1ZXNIYXNoOworCQlpbnQJCQludmFs dWVzUHJvYmU7CisJCWludAkJCW5vbm1jdl9jbnQgPSBudW1fZWxlbXM7CisJCWludAkJCW5v bmNvbnN0X2NudCA9IDA7CisKKwkJLyogR3JhYiB0aGUgbnVsbGZyYWMgZm9yIHVzZSBiZWxv dy4gKi8KKwkJc3RhdHMgPSAoRm9ybV9wZ19zdGF0aXN0aWMpIEdFVFNUUlVDVCh2YXJkYXRh LT5zdGF0c1R1cGxlKTsKKwkJbnVsbGZyYWMgPSBzdGF0cy0+c3RhbnVsbGZyYWM7CisKKwkJ c2VsZWMgPSBzMWRpc2pvaW50ID0gKHVzZU9yID8gMC4wIDogMS4wKTsKKworCQlJbml0RnVu Y3Rpb25DYWxsSW5mb0RhdGEoKmZjaW5mbywgJmVxcHJvYywgMiwgY29sbGF0aW9uLAorCQkJ CQkJCQkgTlVMTCwgTlVMTCk7CisJCWZjaW5mby0+YXJnc1swXS5pc251bGwgPSBmYWxzZTsK KwkJZmNpbmZvLT5hcmdzWzFdLmlzbnVsbCA9IGZhbHNlOworCisJCWZvciAoaW50IGkgPSAw OyBpIDwgc3Nsb3QubnZhbHVlczsgaSsrKQorCQkJc3VtYWxsY29tbW9uICs9IHNzbG90Lm51 bWJlcnNbaV07CisKKwkJLyoKKwkJICogQ29tcHV0ZSB0aGUgdG90YWwgcHJvYmFiaWxpdHkg bWFzcyBvZiBhbGwgbm9uLU1DViB2YWx1ZXMuIFRoaXMgaXMKKwkJICogdGhlIHBhcnQgb2Yg dGhlIGNvbHVtbiBkaXN0cmlidXRpb24gbm90IGNvdmVyZWQgYnkgTUNWcy4KKwkJICovCisJ CW5vbm1jdl9zZWxlYyA9IDEuMCAtIHN1bWFsbGNvbW1vbiAtIG51bGxmcmFjOworCQlDTEFN UF9QUk9CQUJJTElUWShub25tY3Zfc2VsZWMpOworCisJCS8qCisJCSAqIEFwcHJveGltYXRl IHRoZSBwZXItdmFsdWUgcHJvYmFiaWxpdHkgb2YgYSBub24tTUNWIGNvbnN0YW50IGJ5CisJ CSAqIGRpdmlkaW5nIHRoZSByZW1haW5pbmcgcHJvYmFiaWxpdHkgbWFzcyBieSB0aGUgbnVt YmVyIG9mIG90aGVyCisJCSAqIGRpc3RpbmN0IHZhbHVlcy4KKwkJICovCisJCW90aGVyZGlz dGluY3QgPSBnZXRfdmFyaWFibGVfbnVtZGlzdGluY3QodmFyZGF0YSwgJmlzZGVmYXVsdCkg LSBzc2xvdC5ubnVtYmVyczsKKwkJaWYgKG90aGVyZGlzdGluY3QgPiAxKQorCQkJbm9ubWN2 X3NlbGVjIC89IG90aGVyZGlzdGluY3Q7CisKKwkJaWYgKHNzbG90Lm5udW1iZXJzID4gMCAm JiBub25tY3Zfc2VsZWMgPiBzc2xvdC5udW1iZXJzW3NzbG90Lm5udW1iZXJzIC0gMV0pCisJ CQlub25tY3Zfc2VsZWMgPSBzc2xvdC5udW1iZXJzW3NzbG90Lm5udW1iZXJzIC0gMV07CisK KwkJLyogTWFrZSBzdXJlIHdlIGJ1aWxkIHRoZSBoYXNoIHRhYmxlIG9uIHRoZSBzbWFsbGVy IGFycmF5LiAqLworCQlpZiAoc3Nsb3QubnZhbHVlcyA8PSBudW1fZWxlbXMpCisJCXsKKwkJ CWhhc2hfbWN2ID0gdHJ1ZTsKKwkJCW52YWx1ZXNIYXNoID0gc3Nsb3QubnZhbHVlczsKKwkJ CW52YWx1ZXNQcm9iZSA9IG51bV9lbGVtczsKKwkJCWFycmF5SGFzaCA9IHNzbG90LnZhbHVl czsKKwkJCWFycmF5UHJvYmUgPSBlbGVtX3ZhbHVlczsKKwkJfQorCQllbHNlCisJCXsKKwkJ CWhhc2hfbWN2ID0gZmFsc2U7CisJCQludmFsdWVzSGFzaCA9IG51bV9lbGVtczsKKwkJCW52 YWx1ZXNQcm9iZSA9IHNzbG90Lm52YWx1ZXM7CisJCQlhcnJheUhhc2ggPSBlbGVtX3ZhbHVl czsKKwkJCWFycmF5UHJvYmUgPSBzc2xvdC52YWx1ZXM7CisJCX0KKworCQlmbWdyX2luZm8o aGFzaF9tY3YgPyBoYXNoTGVmdCA6IGhhc2hSaWdodCwgJmhhc2hfcHJvYyk7CisJCUluaXRG dW5jdGlvbkNhbGxJbmZvRGF0YSgqaGFzaF9mY2luZm8sICZoYXNoX3Byb2MsIDEsIGNvbGxh dGlvbiwKKwkJCQkJCQkJIE5VTEwsIE5VTEwpOworCQloYXNoX2ZjaW5mby0+YXJnc1swXS5p c251bGwgPSBmYWxzZTsKKworCQloYXNoQ29udGV4dC5lcXVhbF9mY2luZm8gPSBmY2luZm87 CisJCWhhc2hDb250ZXh0Lmhhc2hfZmNpbmZvID0gaGFzaF9mY2luZm87CisJCWhhc2hDb250 ZXh0Lm9wX2lzX3JldmVyc2VkID0gIWhhc2hfbWN2OworCQloYXNoQ29udGV4dC5pbnNlcnRf bW9kZSA9IHRydWU7CisKKwkJZ2V0X3R5cGxlbmJ5dmFsKGhhc2hfbWN2ID8gc3Nsb3QudmFs dWV0eXBlIDogbm9taW5hbF9lbGVtZW50X3R5cGUsCisJCQkJCQkmaGFzaENvbnRleHQuaGFz aF90eXBsZW4sCisJCQkJCQkmaGFzaENvbnRleHQuaGFzaF90eXBieXZhbCk7CisKKwkJaGFz aFRhYmxlID0gTUNWSGFzaFRhYmxlX2NyZWF0ZShDdXJyZW50TWVtb3J5Q29udGV4dCwKKwkJ CQkJCQkJCQludmFsdWVzSGFzaCwKKwkJCQkJCQkJCQkmaGFzaENvbnRleHQpOworCisJCS8q IEJ1aWxkIGEgaGFzaCB0YWJsZSBvdmVyIHRoZSBzbWFsbGVyIGlucHV0IHNpZGUuICovCisJ CWZvciAoaW50IGkgPSAwOyBpIDwgbnZhbHVlc0hhc2g7IGkrKykKKwkJeworCQkJYm9vbAkJ Zm91bmQgPSBmYWxzZTsKKwkJCU1DVkhhc2hFbnRyeSAqZW50cnk7CisKKwkJCS8qCisJCQkg KiBXaGVuIGhhc2hpbmcgSU4tbGlzdCB2YWx1ZXMgKGhhc2hfbWN2ID09IGZhbHNlKSwgd2Ug b25seSBpbnNlcnQKKwkJCSAqIGNvbnN0YW50LCBub24tTlVMTCBlbGVtZW50cy4gIE5VTEwg YW5kIG5vbi1Db25zdCBlbGVtZW50cyBhcmUKKwkJCSAqIGNvdW50ZWQgc2VwYXJhdGVseSwg YmVjYXVzZSB0aGV5IGNhbm5vdCBwYXJ0aWNpcGF0ZSBpbiBNQ1YKKwkJCSAqIG1hdGNoaW5n IGFuZCBtdXN0IGJlIGhhbmRsZWQgbGF0ZXIgdXNpbmcgZ2VuZXJpYyBzZWxlY3Rpdml0eQor CQkJICogZXN0aW1hdGlvbi4KKwkJCSAqLworCQkJaWYgKCFoYXNoX21jdikKKwkJCXsKKwkJ CQlpZiAoZWxlbV9udWxsc1tpXSkKKwkJCQl7CisJCQkJCW5vbm1jdl9jbnQtLTsKKwkJCQkJ Y29udGludWU7CisJCQkJfQorCisJCQkJaWYgKGVsZW1fY29uc3QgIT0gTlVMTCAmJiAhZWxl bV9jb25zdFtpXSkKKwkJCQl7CisJCQkJCW5vbm1jdl9jbnQtLTsKKwkJCQkJbm9uY29uc3Rf Y250Kys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKworCQkJZW50cnkgPSBNQ1ZI YXNoVGFibGVfaW5zZXJ0KGhhc2hUYWJsZSwgYXJyYXlIYXNoW2ldLCAmZm91bmQpOworCisJ CQkvKgorCQkJICogZW50cnktPmNvdW50IHRyYWNrcyBob3cgbWFueSB0aW1lcyB0aGUgc2Ft ZSB2YWx1ZSBhcHBlYXJzLCBzbworCQkJICogdGhhdCBkdXBsaWNhdGUgSU4tbGlzdCBlbGVt ZW50cyBjYW4gYmUgZm9sZGVkIGludG8gdGhlCisJCQkgKiBwcm9iYWJpbGl0eSBjYWxjdWxh dGlvbi4KKwkJCSAqLworCQkJaWYgKGxpa2VseSghZm91bmQpKQorCQkJeworCQkJCWVudHJ5 LT5pbmRleCA9IGk7CisJCQkJZW50cnktPmNvdW50ID0gMTsKKwkJCX0KKwkJCWVsc2UKKwkJ CQllbnRyeS0+Y291bnQrKzsKKwkJfQorCisJCWhhc2hDb250ZXh0Lmluc2VydF9tb2RlID0g ZmFsc2U7CisJCWlmIChoYXNoTGVmdCAhPSBoYXNoUmlnaHQpCisJCXsKKwkJCWZtZ3JfaW5m byhoYXNoX21jdiA/IGhhc2hSaWdodCA6IGhhc2hMZWZ0LCAmaGFzaF9wcm9jKTsKKwkJCS8q IFJlc2V0dGluZyBoYXNoX2ZjaW5mbyBpcyBwcm9iYWJseSB1bm5lY2Vzc2FyeSwgYnV0IGJl IHNhZmUgKi8KKwkJCUluaXRGdW5jdGlvbkNhbGxJbmZvRGF0YSgqaGFzaF9mY2luZm8sICZo YXNoX3Byb2MsIDEsIGNvbGxhdGlvbiwKKwkJCQkJCQkJCSBOVUxMLCBOVUxMKTsKKwkJCWhh c2hfZmNpbmZvLT5hcmdzWzBdLmlzbnVsbCA9IGZhbHNlOworCQl9CisKKwkJZm9yIChpbnQg aSA9IDA7IGkgPCBudmFsdWVzUHJvYmU7IGkrKykKKwkJeworCQkJTUNWSGFzaEVudHJ5ICpl bnRyeTsKKwkJCVNlbGVjdGl2aXR5IHMxOworCQkJaW50CQkJbnZhbHVlc21jdjsKKworCQkJ LyoKKwkJCSAqIFdoZW4gcHJvYmluZyB3aXRoIElOLWxpc3QgZWxlbWVudHMsIGlnbm9yZSBO VUxMcyBhbmQgbm9uLUNvbnN0CisJCQkgKiBleHByZXNzaW9uczogdGhleSBjYW5ub3QgYmUg bWF0Y2hlZCBhZ2FpbnN0IE1DVnMgYW5kIHdpbGwgYmUKKwkJCSAqIGFjY291bnRlZCBmb3Ig bGF0ZXIgYnkgZ2VuZXJpYyBlc3RpbWF0aW9uLgorCQkJICovCisJCQlpZiAoaGFzaF9tY3Yp CisJCQl7CisJCQkJaWYgKGVsZW1fbnVsbHNbaV0pCisJCQkJeworCQkJCQlub25tY3ZfY250 LS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWlmIChlbGVtX2NvbnN0ICE9IE5V TEwgJiYgIWVsZW1fY29uc3RbaV0pCisJCQkJeworCQkJCQlub25tY3ZfY250LS07CisJCQkJ CW5vbmNvbnN0X2NudCsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisKKwkJCWVu dHJ5ID0gTUNWSGFzaFRhYmxlX2xvb2t1cChoYXNoVGFibGUsIGFycmF5UHJvYmVbaV0pOwor CisJCQkvKgorCQkJICogSWYgZm91bmQsIG9idGFpbiBpdHMgTUNWIGZyZXF1ZW5jeSBhbmQg cmVtZW1iZXIgaG93IG1hbnkgdmFsdWVzCisJCQkgKiBvbiB0aGUgaGFzaGVkIHNpZGUgbWFw IHRvIHRoaXMgZW50cnkuCisJCQkgKi8KKwkJCWlmIChlbnRyeSAhPSBOVUxMKQorCQkJewor CQkJCXMxID0gaGFzaF9tY3YgPyBzc2xvdC5udW1iZXJzW2VudHJ5LT5pbmRleF0KKwkJCQkJ OiBzc2xvdC5udW1iZXJzW2ldOworCisJCQkJbnZhbHVlc21jdiA9IGVudHJ5LT5jb3VudDsK KworCQkJCS8qIE1hdGNoZWQgdmFsdWVzIGFyZSBubyBsb25nZXIgY29uc2lkZXJlZCBub24t TUNWICovCisJCQkJbm9ubWN2X2NudCAtPSBudmFsdWVzbWN2OworCQkJfQorCQkJZWxzZQor CQkJeworCQkJCS8qIE5vIE1DViBtYXRjaCBmb3IgdGhpcyB2YWx1ZSAqLworCQkJCWNvbnRp bnVlOworCQkJfQorCisJCQkvKgorCQkJICogRm9sZCB0aGlzIHZhbHVlJ3MgcHJvYmFiaWxp dHkgaW50byB0aGUgcnVubmluZyBBTlkvQUxMCisJCQkgKiBzZWxlY3Rpdml0eSBlc3RpbWF0 ZSBvbmNlIGZvciBlYWNoIG9jY3VycmVuY2UuCisJCQkgKi8KKwkJCWZvciAoaW50IGogPSAw OyBqIDwgbnZhbHVlc21jdjsgaisrKQorCQkJCWFjY3VtX3NjYWxhcmFycmF5X3Byb2IoczEs IHVzZU9yLCBpc0VxdWFsaXR5LCBpc0luZXF1YWxpdHksCisJCQkJCQkJCQkgICBudWxsZnJh YywgJnNlbGVjLCAmczFkaXNqb2ludCk7CisJCX0KKworCQkvKgorCQkgKiBBY2NvdW50IGZv ciBjb25zdGFudCBJTi1saXN0IHZhbHVlcyB0aGF0IGRpZCBub3QgbWF0Y2ggYW55IE1DVi4K KwkJICoKKwkJICogRWFjaCBzdWNoIHZhbHVlIGlzIGFzc3VtZWQgdG8gaGF2ZSBwcm9iYWJp bGl0eSA9IG5vbm1jdl9zZWxlYywKKwkJICogZGVyaXZlZCBmcm9tIHRoZSByZW1haW5pbmcg KG5vbi1NQ1YpIHByb2JhYmlsaXR5IG1hc3MuCisJCSAqLworCQlmb3IgKGludCBpID0gMDsg aSA8IG5vbm1jdl9jbnQ7IGkrKykKKwkJCWFjY3VtX3NjYWxhcmFycmF5X3Byb2Iobm9ubWN2 X3NlbGVjLCB1c2VPciwgaXNFcXVhbGl0eSwgaXNJbmVxdWFsaXR5LAorCQkJCQkJCQkgICBu dWxsZnJhYywgJnNlbGVjLCAmczFkaXNqb2ludCk7CisKKwkJLyoKKwkJICogQWNjb3VudCBm b3Igbm9uLUNvbnN0IElOLWxpc3QgZWxlbWVudHMuCisJCSAqCisJCSAqIFRoZXNlIHZhbHVl cyBjYW5ub3QgYmUgbWF0Y2hlZCBhZ2FpbnN0IE1DVnMsIHNvIHdlIHJlbHkgb24gdGhlCisJ CSAqIG9wZXJhdG9yJ3MgZ2VuZXJpYyBzZWxlY3Rpdml0eSBlc3RpbWF0b3IgZm9yIGVhY2gg b2YgdGhlbS4KKwkJICovCisJCWlmIChub25jb25zdF9jbnQgPiAwKQorCQl7CisJCQlTZWxl Y3Rpdml0eSBzMSA9IHZhcl9lcV9ub25fY29uc3QodmFyZGF0YSwgb3BlcmF0b3IsIGNvbGxh dGlvbiwKKwkJCQkJCQkJCQkJICBvdGhlcl9vcCwgdmFyX29uX2xlZnQsIGZhbHNlKTsKKwor CQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub25jb25zdF9jbnQ7IGkrKykKKwkJCQlhY2N1bV9z Y2FsYXJhcnJheV9wcm9iKHMxLCB1c2VPciwgaXNFcXVhbGl0eSwgaXNJbmVxdWFsaXR5LAor CQkJCQkJCQkJICAgbnVsbGZyYWMsICZzZWxlYywgJnMxZGlzam9pbnQpOworCQl9CisKKwkJ LyoKKwkJICogRm9yID0gQU5ZIG9yIDw+IEFMTCwgaWYgdGhlIElOLWxpc3QgZWxlbWVudHMg YXJlIGFzc3VtZWQgZGlzdGluY3QsCisJCSAqIHRoZSBldmVudHMgYXJlIGRpc2pvaW50IGFu ZCB0aGUgdG90YWwgcHJvYmFiaWxpdHkgaXMgdGhlIHN1bSBvZgorCQkgKiBpbmRpdmlkdWFs IHByb2JhYmlsaXRpZXMuICBVc2UgdGhhdCBlc3RpbWF0ZSBpZiBpdCBsaWVzIGluIFswLDFd LgorCQkgKi8KKwkJaWYgKCh1c2VPciA/IGlzRXF1YWxpdHkgOiBpc0luZXF1YWxpdHkpICYm CisJCQlzMWRpc2pvaW50ID49IDAuMCAmJiBzMWRpc2pvaW50IDw9IDEuMCkKKwkJCXNlbGVj ID0gczFkaXNqb2ludDsKKworCQlDTEFNUF9QUk9CQUJJTElUWShzZWxlYyk7CisKKwkJTUNW SGFzaFRhYmxlX2Rlc3Ryb3koaGFzaFRhYmxlKTsKKwkJZnJlZV9hdHRzdGF0c3Nsb3QoJnNz bG90KTsKKwl9CisKKwlyZXR1cm4gc2VsZWM7Cit9CisKKy8qCisgKiBBY2N1bXVsYXRlIHRo ZSBzZWxlY3Rpdml0eSBjb250cmlidXRpb24gb2YgYSBzaW5nbGUgYXJyYXkgZWxlbWVudAor ICogaW50byB0aGUgcnVubmluZyBTY2FsYXJBcnJheU9wRXhwciBzZWxlY3Rpdml0eSBlc3Rp bWF0ZS4KKyAqLworc3RhdGljIHZvaWQKK2FjY3VtX3NjYWxhcmFycmF5X3Byb2IoU2VsZWN0 aXZpdHkgczEsIGJvb2wgdXNlT3IsIGJvb2wgaXNFcXVhbGl0eSwKKwkJCQkJICAgYm9vbCBp c0luZXF1YWxpdHksIGRvdWJsZSBudWxsZnJhYywKKwkJCQkJICAgZG91YmxlICpzZWxlYywg ZG91YmxlICpzMWRpc2pvaW50KQoreworCVNlbGVjdGl2aXR5IHMyID0gczE7CisKKwlpZiAo aXNJbmVxdWFsaXR5KQorCQlzMiA9IDEuMCAtIHMyIC0gbnVsbGZyYWM7CisKKwlDTEFNUF9Q Uk9CQUJJTElUWShzMik7CisKKwlpZiAodXNlT3IpCisJeworCQkqc2VsZWMgPSAqc2VsZWMg KyBzMiAtICgqc2VsZWMpICogczI7CisJCWlmIChpc0VxdWFsaXR5KQorCQkJKnMxZGlzam9p bnQgKz0gczI7CisJfQorCWVsc2UKKwl7CisJCSpzZWxlYyA9ICgqc2VsZWMpICogczI7CisJ CWlmIChpc0luZXF1YWxpdHkpCisJCQkqczFkaXNqb2ludCArPSBzMiAtIDEuMDsKKwl9Cit9 CisKIC8qCiAgKiBFc3RpbWF0ZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5IHlp ZWxkZWQgYnkgYW4gZXhwcmVzc2lvbi4KICAqCkBAIC0yNDQ2LDcgKzI5NTksNyBAQCBlcWpv aW5zZWwoUEdfRlVOQ1RJT05fQVJHUykKIAkJICogSWYgdGhlIE1DViBsaXN0cyBhcmUgbG9u ZyBlbm91Z2ggdG8ganVzdGlmeSBoYXNoaW5nLCB0cnkgdG8gbG9vayB1cAogCQkgKiBoYXNo IGZ1bmN0aW9ucyBmb3IgdGhlIGpvaW4gb3BlcmF0b3IuCiAJCSAqLwotCQlpZiAoKHNzbG90 MS5udmFsdWVzICsgc3Nsb3QyLm52YWx1ZXMpID49IEVRSk9JTlNFTF9NQ1ZfSEFTSF9USFJF U0hPTEQpCisJCWlmICgoc3Nsb3QxLm52YWx1ZXMgKyBzc2xvdDIubnZhbHVlcykgPj0gTUNW X0hBU0hfVEhSRVNIT0xEKQogCQkJKHZvaWQpIGdldF9vcF9oYXNoX2Z1bmN0aW9ucyhvcGVy YXRvciwgJmhhc2hMZWZ0LCAmaGFzaFJpZ2h0KTsKIAl9CiAJZWxzZQotLSAKMi4zNC4xCgo= --------------AY2bgGCkgStoegDiIbzFN6y6--