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 1vlPz9-00BbsV-22 for pgsql-hackers@arkaria.postgresql.org; Thu, 29 Jan 2026 11:14:53 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vlPz7-007wqB-3D for pgsql-hackers@arkaria.postgresql.org; Thu, 29 Jan 2026 11:14:50 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vlPz7-007wpz-1U for pgsql-hackers@lists.postgresql.org; Thu, 29 Jan 2026 11:14:50 +0000 Received: from forward502b.mail.yandex.net ([178.154.239.146]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1vlPz4-00000001387-2dsD for pgsql-hackers@lists.postgresql.org; Thu, 29 Jan 2026 11:14:49 +0000 Received: from mail-nwsmtp-smtp-production-main-70.sas.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-70.sas.yp-c.yandex.net [IPv6:2a02:6b8:c11:e97:0:640:f294:0]) by forward502b.mail.yandex.net (Yandex) with ESMTPS id 7CEFA89E1B; Thu, 29 Jan 2026 14:14:44 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-70.sas.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id hEhKJb5G9W20-IitwdXKw; Thu, 29 Jan 2026 14:14:44 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tantorlabs.com; s=mail; t=1769685284; bh=+h7rPnqHzU77JpJNm9Q+I4er7HEpPV2sdAZG6BV9Kd0=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=tiUgmR0hp5qw85SCn0qpq84KgZjqq26fodZThRSte6EZeD7SvpjfeiAMpewanhwCL +Yydp/sZuo47bwfefHme2X3JlriGetie8z0rhbxcp7cUK+7OIkor8L/XfZiCaAAqte +61QQ/4a39+Rv0WM3kDoCiVuxqjqo/o4TWjFqY6c= Authentication-Results: mail-nwsmtp-smtp-production-main-70.sas.yp-c.yandex.net; dkim=pass header.i=@tantorlabs.com Content-Type: multipart/mixed; boundary="------------CiWBSOFdKn0B4wnW0DGswvks" Message-ID: <8ee9d903-bb13-434c-8145-b3769bf2b3cb@tantorlabs.com> Date: Thu, 29 Jan 2026 14:14:43 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Hash-based MCV matching for large IN-lists To: Chengpeng Yan Cc: David Geier , "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> Content-Language: en-US From: Ilia Evdokimov In-Reply-To: <21FF6A0B-886F-4132-B6A6-0F4E934B4CEE@Outlook.com> 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. --------------CiWBSOFdKn0B4wnW0DGswvks Content-Type: multipart/alternative; boundary="------------2BXUAQfQcZqU86CHS8EXEcZv" --------------2BXUAQfQcZqU86CHS8EXEcZv Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi Chengpeng, Thanks for your review! On 28.01.2026 16:08, Chengpeng Yan wrote: > * Treat NULL array elements as zero selectivity for ALL: Agreed. For ALL/AND semantics the function now returns selectivity = 0.0 as soon as a NULL element is encountered. > * Fix cross-type equality argument order in `mcvs_in_equal`: Agreed. Added 'op_is_reserved' flag MCVInHashContext, same as in MCVHashContext. > * Include non-MCV IN-list constants in non-disjoint selectivity: This is not applicable to v3. > * Avoid double-negating inequality estimates for non-Const elements: Agreed. var_eq_non_const() is now always with negate = false, not to call negation twice. Attached v4 patch with above fixes. -- Best regards, Ilia Evdokimov, Tantor Labs LLC, https://tantorlabs.com/ --------------2BXUAQfQcZqU86CHS8EXEcZv Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Hi Chengpeng,

Thanks for your review!


On 28.01.2026 16:08, Chengpeng Yan wrote:
* Treat NULL array elements as zero selectivity for ALL:

Agreed. For ALL/AND semantics the function now returns selectivity = 0.0 as soon as a NULL element is encountered.


* Fix cross-type equality argument order in `mcvs_in_equal`:

Agreed. Added 'op_is_reserved' flag MCVInHashContext, same as in MCVHashContext.


* Include non-MCV IN-list constants in non-disjoint selectivity:

This is not applicable to v3.


* Avoid double-negating inequality estimates for non-Const elements:

Agreed. var_eq_non_const() is now always with negate = false, not to call negation twice.


Attached v4 patch with above fixes.

-- 
Best regards,
Ilia Evdokimov,
Tantor Labs LLC,
https://tantorlabs.com/

--------------2BXUAQfQcZqU86CHS8EXEcZv-- --------------CiWBSOFdKn0B4wnW0DGswvks Content-Type: text/x-patch; charset=UTF-8; name="v4-0001-Use-hash-based-MCV-matching-for-ScalarArrayOpExpr.patch" Content-Disposition: attachment; filename*0="v4-0001-Use-hash-based-MCV-matching-for-ScalarArrayOpExpr.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBjMGY0MzA4ODEwMGIyYmI4MGQzY2MzNWM3YTBiY2Q2NjNhMDc5YmYwIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBJbGlhIEV2ZG9raW1vdiA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5ydT4KRGF0ZTogVGh1LCAyOSBKYW4gMjAyNiAxNDoxMjoyMyArMDMwMApT dWJqZWN0OiBbUEFUQ0ggdjRdIFVzZSBoYXNoLWJhc2VkIE1DViBtYXRjaGluZyBmb3IgU2Nh bGFyQXJyYXlPcEV4cHIKIHNlbGVjdGl2aXR5CgpXaGVuIGVzdGltYXRpbmcgc2VsZWN0aXZp dHkgZm9yIFNjYWxhckFycmF5T3BFeHByIChJTiAvIEFOWSAvIEFMTCkgd2l0aAphdmFpbGFi bGUgTUNWIHN0YXRpc3RpY3MsIHRoZSBwbGFubmVyIGN1cnJlbnRseSBtYXRjaGVzIElOLWxp c3QgZWxlbWVudHMKYWdhaW5zdCB0aGUgTUNWIGFycmF5IHVzaW5nIG5lc3RlZCBsb29wcy4g Rm9yIGxhcmdlIElOLWxpc3RzIGFuZC9vciBsYXJnZQpNQ1YgbGlzdHMgdGhpcyBsZWFkcyB0 byBPKE4qTSkgcGxhbm5pbmctdGltZSBiZWhhdmlvci4KClRoaXMgcGF0Y2ggYWRkcyBhIGhh c2gtYmFzZWQgbWF0Y2hpbmcgc3RyYXRlZ3ksIHNpbWlsYXIgdG8gdGhlIG9uZSB1c2VkCmlu IGpvaW4gc2VsZWN0aXZpdHkgZXN0aW1hdGlvbi4gV2hlbiBNQ1Ygc3RhdGlzdGljcyBhcmUg YXZhaWxhYmxlIGFuZCB0aGUKb3BlcmF0b3Igc3VwcG9ydHMgaGFzaGluZywgdGhlIHNtYWxs ZXIgb2YgdGhlIHR3byBpbnB1dHMgKE1DViBsaXN0IG9yCklOLWxpc3QgY29uc3RhbnQgZWxl bWVudHMpIGlzIGNob3NlbiBhcyB0aGUgaGFzaCB0YWJsZSBidWlsZCBzaWRlLCBhbmQKdGhl IG90aGVyIHNpZGUgaXMgc2Nhbm5lZCBvbmNlLCByZWR1Y2luZyBjb21wbGV4aXR5IHRvIE8o TitNKS4KClRoZSBoYXNoLWJhc2VkIHBhdGggaXMgcmVzdHJpY3RlZCB0byBlcXVhbGl0eSBh bmQgaW5lcXVhbGl0eSBvcGVyYXRvcnMKdGhhdCB1c2UgZXFzZWwoKS9uZXFzZWwoKSwgYW5k IGlzIGFwcGxpZWQgb25seSB3aGVuIHN1aXRhYmxlIGhhc2gKZnVuY3Rpb25zIGFuZCBNQ1Yg c3RhdGlzdGljcyBhcmUgYXZhaWxhYmxlLgotLS0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9z ZWxmdW5jcy5jIHwgNjI0ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KIHNyYy90 b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0IHwgICAzICsKIDIgZmlsZXMgY2hhbmdlZCwg NjI2IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxm dW5jcy5jCmluZGV4IDI5ZmVjNjU1NTkzLi4wOWVhNzMzYWVjMSAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMv YWR0L3NlbGZ1bmNzLmMKQEAgLTE0Niw3ICsxNDYsNyBAQAogLyoKICAqIEluIHByb2R1Y3Rp b24gYnVpbGRzLCBzd2l0Y2ggdG8gaGFzaC1iYXNlZCBNQ1YgbWF0Y2hpbmcgd2hlbiB0aGUg bGlzdHMgYXJlCiAgKiBsYXJnZSBlbm91Z2ggdG8gYW1vcnRpemUgaGFzaCBzZXR1cCBjb3N0 LiAgKFRoaXMgdGhyZXNob2xkIGlzIGNvbXBhcmVkIHRvCi0gKiB0aGUgc3VtIG9mIHRoZSBs ZW5ndGhzIG9mIHRoZSB0d28gTUNWIGxpc3RzLiAgVGhpcyBpcyBzaW1wbGlzdGljIGJ1dCBz ZWVtcworICogdGhlIHN1bSBvZiB0aGUgbGVuZ3RocyBvZiB0aGUgdHdvIGxpc3RzLiAgVGhp cyBpcyBzaW1wbGlzdGljIGJ1dCBzZWVtcwogICogdG8gd29yayB3ZWxsIGVub3VnaC4pICBJ biBkZWJ1ZyBidWlsZHMsIHdlIHVzZSBhIHNtYWxsZXIgdGhyZXNob2xkIHNvIHRoYXQKICAq IHRoZSByZWdyZXNzaW9uIHRlc3RzIGNvdmVyIGJvdGggcGF0aHMgd2VsbC4KICAqLwpAQCAt MTU2LDYgKzE1NiwxMiBAQAogI2RlZmluZSBFUUpPSU5TRUxfTUNWX0hBU0hfVEhSRVNIT0xE IDIwCiAjZW5kaWYKIAorI2lmbmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCisjZGVmaW5lIFND QUxBUkFSUkFZX01DVl9IQVNIX1RIUkVTSE9MRCAyMDAKKyNlbHNlCisjZGVmaW5lIFNDQUxB UkFSUkFZX01DVl9IQVNIX1RIUkVTSE9MRCAyMAorI2VuZGlmCisKIC8qIEVudHJpZXMgaW4g dGhlIHNpbXBsZWhhc2ggaGFzaCB0YWJsZSB1c2VkIGJ5IGVxam9pbnNlbF9maW5kX21hdGNo ZXMgKi8KIHR5cGVkZWYgc3RydWN0IE1DVkhhc2hFbnRyeQogewpAQCAtMTc2LDE0ICsxODIs NDcgQEAgdHlwZWRlZiBzdHJ1Y3QgTUNWSGFzaENvbnRleHQKIAlpbnQxNgkJaGFzaF90eXBs ZW47CS8qIHR5cGxlbiBvZiBoYXNoZWQgZGF0YSB0eXBlICovCiB9IE1DVkhhc2hDb250ZXh0 OwogCisvKiBFbnRyaWVzIGluIHRoZSBzaW1wbGVoYXNoIGhhc2ggdGFibGUgdXNlZCBieSBz Y2FsYXJhcnJheV9tY3ZfaGFzaF9tYXRjaCAqLwordHlwZWRlZiBzdHJ1Y3QgTUNWSW5IYXNo RW50cnkKK3sKKwlEYXR1bQkJdmFsdWU7CQkJLyogdGhlIHZhbHVlIHJlcHJlc2VudGVkIGJ5 IHRoaXMgZW50cnkgKi8KKwlpbnQJCWluZGV4OwkJCS8qIGl0cyBpbmRleCBpbiB0aGUgcmVs ZXZhbnQgQXR0U3RhdHNTbG90ICovCisJdWludDMyCQloYXNoOwkJCS8qIGhhc2ggY29kZSBm b3IgdGhlIERhdHVtICovCisJY2hhcgkJc3RhdHVzOwkJCS8qIHN0YXR1cyBjb2RlIHVzZWQg Ynkgc2ltcGxlaGFzaC5oICovCisJaW50CQljb3VudDsJCQkvKiBudW1iZXIgb2Ygb2NjdXJy ZW5jZXMgb2QgY3VycmVudCB2YWx1ZSBpbgorCQkJCQkJICogdGhlIElOLWxpc3QgKi8KK30g TUNWSW5IYXNoRW50cnk7CisKKy8qIHByaXZhdGVfZGF0YSBmb3IgdGhlIHNpbXBsZWhhc2gg aGFzaCB0YWJsZSAqLwordHlwZWRlZiBzdHJ1Y3QgTUNWSW5IYXNoQ29udGV4dAoreworCUZ1 bmN0aW9uQ2FsbEluZm8gZXF1YWxfZmNpbmZvOwkvKiB0aGUgZXF1YWxpdHkgam9pbiBvcGVy YXRvciAqLworCUZ1bmN0aW9uQ2FsbEluZm8gaGFzaF9mY2luZm87CS8qIHRoZSBoYXNoIGZ1 bmN0aW9uIHRvIHVzZSAqLworCWJvb2wJCW9wX2lzX3JldmVyc2VkOyAvKiBlcXVhbGl0eSBj b21wYXJlcyBoYXNoIHR5cGUgdG8gcHJvYmUgdHlwZSAqLworCWJvb2wJCWluc2VydF9tb2Rl OwkvKiBkb2luZyBpbnNlcnRzIG9yIGxvb2t1cHM/ICovCisJYm9vbAkJaGFzaF90eXBieXZh bDsJLyogdHlwYnl2YWwgb2YgaGFzaGVkIGRhdGEgdHlwZSAqLworCWludDE2CQloYXNoX3R5 cGxlbjsJLyogdHlwbGVuIG9mIGhhc2hlZCBkYXRhIHR5cGUgKi8KK30gTUNWSW5IYXNoQ29u dGV4dDsKKwogLyogZm9yd2FyZCByZWZlcmVuY2UgKi8KIHR5cGVkZWYgc3RydWN0IE1DVkhh c2hUYWJsZV9oYXNoIE1DVkhhc2hUYWJsZV9oYXNoOwordHlwZWRlZiBzdHJ1Y3QgTUNWSW5I YXNoVGFibGVfaGFzaCBNQ1ZJbkhhc2hUYWJsZV9oYXNoOwogCiAvKiBIb29rcyBmb3IgcGx1 Z2lucyB0byBnZXQgY29udHJvbCB3aGVuIHdlIGFzayBmb3Igc3RhdHMgKi8KIGdldF9yZWxh dGlvbl9zdGF0c19ob29rX3R5cGUgZ2V0X3JlbGF0aW9uX3N0YXRzX2hvb2sgPSBOVUxMOwog Z2V0X2luZGV4X3N0YXRzX2hvb2tfdHlwZSBnZXRfaW5kZXhfc3RhdHNfaG9vayA9IE5VTEw7 CiAKIHN0YXRpYyBkb3VibGUgZXFzZWxfaW50ZXJuYWwoUEdfRlVOQ1RJT05fQVJHUywgYm9v bCBuZWdhdGUpOworc3RhdGljIGRvdWJsZSBzY2FsYXJhcnJheV9tY3ZfaGFzaF9tYXRjaChW YXJpYWJsZVN0YXREYXRhICp2YXJkYXRhLCBPaWQgb3BlcmF0b3IsIE9pZCBjb2xsYXRpb24s CisJCQkJCSBOb2RlICpvdGhlcl9vcCwgYm9vbCB2YXJfb25fbGVmdCwgRGF0dW0gKmVsZW1f dmFsdWVzLAorCQkJCQkgYm9vbCAqZWxlbV9udWxscywgaW50IG51bV9lbGVtcywgYm9vbCAq ZWxlbV9jb25zdCwKKwkJCQkJIE9pZCBub21pbmFsX2VsZW1lbnRfdHlwZSwgYm9vbCB1c2VP ciwgYm9vbCBpc0VxdWFsaXR5LAorCQkJCQkgYm9vbCBpc0luZXF1YWxpdHkpOworc3RhdGlj IHZvaWQgYWNjdW1fc2NhbGFyYXJyYXlfcHJvYihTZWxlY3Rpdml0eSBzMSwgYm9vbCB1c2VP ciwgYm9vbCBpc0VxdWFsaXR5LAorCQkJCSAgIGJvb2wgaXNJbmVxdWFsaXR5LCBkb3VibGUg bnVsbGZyYWMsCisJCQkJICAgZG91YmxlICpzZWxlYywgZG91YmxlICpzMWRpc2pvaW50KTsK K3N0YXRpYyB1aW50MzIgaGFzaF9tY3ZfaW4oTUNWSW5IYXNoVGFibGVfaGFzaCAqdGFiLCBE YXR1bSBrZXkpOworc3RhdGljIGJvb2wgbWN2c19pbl9lcXVhbChNQ1ZJbkhhc2hUYWJsZV9o YXNoICp0YWIsIERhdHVtIGtleTAsIERhdHVtIGtleTEpOwogc3RhdGljIGRvdWJsZSBlcWpv aW5zZWxfaW5uZXIoRm1nckluZm8gKmVxcHJvYywgT2lkIGNvbGxhdGlvbiwKIAkJCQkJCQkg IE9pZCBoYXNoTGVmdCwgT2lkIGhhc2hSaWdodCwKIAkJCQkJCQkgIFZhcmlhYmxlU3RhdERh dGEgKnZhcmRhdGExLCBWYXJpYWJsZVN0YXREYXRhICp2YXJkYXRhMiwKQEAgLTI4Nyw2ICsz MjYsMTkgQEAgc3RhdGljIGRvdWJsZSBidGNvc3RfY29ycmVsYXRpb24oSW5kZXhPcHRJbmZv ICppbmRleCwKICNkZWZpbmUgU0hfREVDTEFSRQogI2luY2x1ZGUgImxpYi9zaW1wbGVoYXNo LmgiCiAKKyNkZWZpbmUgU0hfUFJFRklYCQkJCU1DVkluSGFzaFRhYmxlCisjZGVmaW5lIFNI X0VMRU1FTlRfVFlQRQkJCU1DVkluSGFzaEVudHJ5CisjZGVmaW5lIFNIX0tFWV9UWVBFCQkJ CURhdHVtCisjZGVmaW5lIFNIX0tFWQkJCQkJdmFsdWUKKyNkZWZpbmUgU0hfSEFTSF9LRVko dGFiLGtleSkJCQloYXNoX21jdl9pbih0YWIsIGtleSkKKyNkZWZpbmUgU0hfRVFVQUwodGFi LGtleTAsa2V5MSkJbWN2c19pbl9lcXVhbCh0YWIsIGtleTAsIGtleTEpCisjZGVmaW5lIFNI X1NDT1BFCQkJCXN0YXRpYyBpbmxpbmUKKyNkZWZpbmUgU0hfU1RPUkVfSEFTSAorI2RlZmlu ZSBTSF9HRVRfSEFTSCh0YWIsZW50KQkoZW50KS0+aGFzaAorI2RlZmluZSBTSF9ERUZJTkUK KyNkZWZpbmUgU0hfREVDTEFSRQorI2luY2x1ZGUgImxpYi9zaW1wbGVoYXNoLmgiCisKIAog LyoKICAqCQllcXNlbAkJCS0gU2VsZWN0aXZpdHkgb2YgIj0iIGZvciBhbnkgZGF0YSB0eXBl cy4KQEAgLTIwMjUsNiArMjA3Nyw0MCBAQCBzY2FsYXJhcnJheXNlbChQbGFubmVySW5mbyAq cm9vdCwKIAkJCQkJCSAgZWxtbGVuLCBlbG1ieXZhbCwgZWxtYWxpZ24sCiAJCQkJCQkgICZl bGVtX3ZhbHVlcywgJmVsZW1fbnVsbHMsICZudW1fZWxlbXMpOwogCisJCS8qCisJCSAqIFRy eSB0byBjYWxjdWxhdGUgc2VsZWN0aXZpdHkgYnkgaGFzaC1zZWFyY2ggTyhOKSBpbnN0ZWFk IG9mIE8oTl4yKQorCQkgKiBpbiBjYXNlIG9mIE1DViBtYXRjaGluZy4gIFdlIHVzZSBoYXNo LXNlYXJjaCBvbmx5IGZvciBlcXNlbCgpIGFuZAorCQkgKiBuZXFzZWwoKS4KKwkJICovCisJ CWlmICgoaXNFcXVhbGl0eSB8fCBpc0luZXF1YWxpdHkpICYmICFpc19qb2luX2NsYXVzZSkK KwkJeworCQkJVmFyaWFibGVTdGF0RGF0YSB2YXJkYXRhOworCQkJTm9kZQkgICAqb3RoZXJf b3AgPSBOVUxMOworCQkJYm9vbAkJdmFyX29uX2xlZnQ7CisKKwkJCS8qCisJCQkgKiBJZiBl eHByZXNzaW9uIGlzIG5vdCB2YXJpYWJsZSA9IHNvbWV0aGluZyBvciBzb21ldGhpbmcgPQor CQkJICogdmFyaWFibGUsIHRoZW4gcHVudCBhbmQgcmV0dXJuIGEgZGVmYXVsdCBlc3RpbWF0 ZS4KKwkJCSAqLworCQkJaWYgKGdldF9yZXN0cmljdGlvbl92YXJpYWJsZShyb290LCBjbGF1 c2UtPmFyZ3MsIHZhclJlbGlkLAorCQkJCQkJCSAmdmFyZGF0YSwgJm90aGVyX29wLCAmdmFy X29uX2xlZnQpKQorCQkJeworCQkJCWJvb2wJICAgKmVsZW1fY29uc3QgPSAoYm9vbCAqKSBw YWxsb2Moc2l6ZW9mKGJvb2wpICogbnVtX2VsZW1zKTsKKworCQkJCS8qIGFsbCBhcnJheSBl bGVtZW50cyBhcmUgQ29uc3Qgbm9kZXMgKi8KKwkJCQltZW1zZXQoZWxlbV9jb25zdCwgdHJ1 ZSwgc2l6ZW9mKGJvb2wpICogbnVtX2VsZW1zKTsKKworCQkJCXMxID0gc2NhbGFyYXJyYXlf bWN2X2hhc2hfbWF0Y2goJnZhcmRhdGEsIG9wZXJhdG9yLCBjbGF1c2UtPmlucHV0Y29sbGlk LCBvdGhlcl9vcCwgdmFyX29uX2xlZnQsCisJCQkJCQkJCWVsZW1fdmFsdWVzLCBlbGVtX251 bGxzLCBudW1fZWxlbXMsIGVsZW1fY29uc3QsCisJCQkJCQkJCW5vbWluYWxfZWxlbWVudF90 eXBlLCB1c2VPciwgaXNFcXVhbGl0eSwgaXNJbmVxdWFsaXR5KTsKKwkJCQlwZnJlZShlbGVt X2NvbnN0KTsKKwkJCQlSZWxlYXNlVmFyaWFibGVTdGF0cyh2YXJkYXRhKTsKKworCQkJCWlm IChzMSA+PSAwLjApCisJCQkJCXJldHVybiBzMTsKKwkJCX0KKwkJfQorCiAJCS8qCiAJCSAq IEZvciBnZW5lcmljIG9wZXJhdG9ycywgd2UgYXNzdW1lIHRoZSBwcm9iYWJpbGl0eSBvZiBz dWNjZXNzIGlzCiAJCSAqIGluZGVwZW5kZW50IGZvciBlYWNoIGFycmF5IGVsZW1lbnQuICBC dXQgZm9yICI9IEFOWSIgb3IgIjw+IEFMTCIsCkBAIC0yMTAwLDYgKzIxODYsNzYgQEAgc2Nh bGFyYXJyYXlzZWwoUGxhbm5lckluZm8gKnJvb3QsCiAJCWdldF90eXBsZW5ieXZhbChhcnJh eWV4cHItPmVsZW1lbnRfdHlwZWlkLAogCQkJCQkJJmVsbWxlbiwgJmVsbWJ5dmFsKTsKIAor CQkvKgorCQkgKiBUcnkgdG8gY2FsY3VsYXRlIHNlbGVjdGl2aXR5IGJ5IGhhc2gtc2VhcmNo IE8oTikgaW5zdGVhZCBvZiBPKE5eMikKKwkJICogaW4gY2FzZSBvZiBNQ1YgbWF0Y2hpbmcu ICBXZSB1c2UgaGFzaC1zZWFyY2ggb25seSBmb3IgZXFzZWwoKSBhbmQKKwkJICogbmVxc2Vs KCkuCisJCSAqLworCQlpZiAoKGlzRXF1YWxpdHkgfHwgaXNJbmVxdWFsaXR5KSAmJiAhaXNf am9pbl9jbGF1c2UpCisJCXsKKwkJCVZhcmlhYmxlU3RhdERhdGEgdmFyZGF0YTsKKwkJCU5v ZGUJICAgKm90aGVyX29wID0gTlVMTDsKKwkJCWJvb2wJCXZhcl9vbl9sZWZ0OworCisJCQkv KgorCQkJICogSWYgZXhwcmVzc2lvbiBpcyBub3QgdmFyaWFibGUgPSBzb21ldGhpbmcgb3Ig c29tZXRoaW5nID0KKwkJCSAqIHZhcmlhYmxlLCB0aGVuIHB1bnQgYW5kIHJldHVybiBhIGRl ZmF1bHQgZXN0aW1hdGUuCisJCQkgKi8KKwkJCWlmIChnZXRfcmVzdHJpY3Rpb25fdmFyaWFi bGUocm9vdCwgY2xhdXNlLT5hcmdzLCB2YXJSZWxpZCwKKwkJCQkJCQkgJnZhcmRhdGEsICZv dGhlcl9vcCwgJnZhcl9vbl9sZWZ0KSkKKwkJCXsKKwkJCQlpbnQJCW51bV9lbGVtczsKKwkJ CQlEYXR1bQkJKmVsZW1fdmFsdWVzOworCQkJCWJvb2wJCSplbGVtX251bGxzOworCQkJCWJv b2wJCSplbGVtX2NvbnN0OworCQkJCUxpc3RDZWxsCSpsYzsKKwkJCQlpbnQJCWkgPSAwOwor CisJCQkJbnVtX2VsZW1zID0gbGlzdF9sZW5ndGgoYXJyYXlleHByLT5lbGVtZW50cyk7CisJ CQkJZWxlbV92YWx1ZXMgPSAoRGF0dW0gKikgcGFsbG9jMChzaXplb2YoRGF0dW0pICogbnVt X2VsZW1zKTsKKwkJCQllbGVtX251bGxzID0gKGJvb2wgKikgcGFsbG9jMChzaXplb2YoYm9v bCkgKiBudW1fZWxlbXMpOworCQkJCWVsZW1fY29uc3QgPSAoYm9vbCAqKSBwYWxsb2MwKHNp emVvZihib29sKSAqIG51bV9lbGVtcyk7CisKKwkJCQkvKgorCQkJCSAqIEJ1aWxkIGFycmF5 cyBkZXNjcmliaW5nIEFSUkFZW10gZWxlbWVudHM6IC0gZWxlbV92YWx1ZXM6CisJCQkJICog RGF0dW0gdmFsdWUgZm9yIENvbnN0IGVsZW1lbnRzIC0gZWxlbV9udWxsczogd2hldGhlcgor CQkJCSAqIGVsZW1lbnQgaXMgTlVMTCAtIGVsZW1fY29uc3Q6IHdoZXRoZXIgZWxlbWVudCBp cyBhIENvbnN0CisJCQkJICogbm9kZQorCQkJCSAqLworCQkJCWZvcmVhY2gobGMsIGFycmF5 ZXhwci0+ZWxlbWVudHMpCisJCQkJeworCQkJCQlOb2RlCSAgICplbGVtX3ZhbHVlID0gKE5v ZGUgKikgbGZpcnN0KGxjKTsKKworCQkJCQlpZiAoSXNBKGVsZW1fdmFsdWUsIENvbnN0KSkK KwkJCQkJeworCQkJCQkJZWxlbV92YWx1ZXNbaV0gPSAoKENvbnN0ICopIGVsZW1fdmFsdWUp LT5jb25zdHZhbHVlOworCQkJCQkJZWxlbV9udWxsc1tpXSA9ICgoQ29uc3QgKikgZWxlbV92 YWx1ZSktPmNvbnN0aXNudWxsOworCQkJCQkJZWxlbV9jb25zdFtpXSA9IHRydWU7CisJCQkJ CX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQllbGVtX251bGxzW2ldID0gZmFsc2U7CisJ CQkJCQllbGVtX2NvbnN0W2ldID0gZmFsc2U7CisJCQkJCX0KKworCQkJCQlpKys7CisJCQkJ fQorCisJCQkJczEgPSBzY2FsYXJhcnJheV9tY3ZfaGFzaF9tYXRjaCgmdmFyZGF0YSwgb3Bl cmF0b3IsIGNsYXVzZS0+aW5wdXRjb2xsaWQsIG90aGVyX29wLCB2YXJfb25fbGVmdCwKKwkJ CQkJCQkJZWxlbV92YWx1ZXMsIGVsZW1fbnVsbHMsIG51bV9lbGVtcywgZWxlbV9jb25zdCwK KwkJCQkJCQkJbm9taW5hbF9lbGVtZW50X3R5cGUsIHVzZU9yLCBpc0VxdWFsaXR5LCBpc0lu ZXF1YWxpdHkpOworCisJCQkJcGZyZWUoZWxlbV92YWx1ZXMpOworCQkJCXBmcmVlKGVsZW1f bnVsbHMpOworCQkJCXBmcmVlKGVsZW1fY29uc3QpOworCisJCQkJUmVsZWFzZVZhcmlhYmxl U3RhdHModmFyZGF0YSk7CisKKwkJCQlpZiAoczEgPj0gMC4wKQorCQkJCQlyZXR1cm4gczE7 CisJCQl9CisJCX0KKwogCQkvKgogCQkgKiBXZSB1c2UgdGhlIGFzc3VtcHRpb24gb2YgZGlz am9pbnQgcHJvYmFiaWxpdGllcyBoZXJlIHRvbywgYWx0aG91Z2gKIAkJICogdGhlIG9kZHMg b2YgZXF1YWwgYXJyYXkgZWxlbWVudHMgYXJlIHJhdGhlciBoaWdoZXIgaWYgdGhlIGVsZW1l bnRzCkBAIC0yMjEwLDYgKzIzNjYsNDcyIEBAIHNjYWxhcmFycmF5c2VsKFBsYW5uZXJJbmZv ICpyb290LAogCXJldHVybiBzMTsKIH0KIAorCisvKgorICogRXN0aW1hdGUgc2VsZWN0aXZp dHkgb2YgYSBTY2FsYXJBcnJheU9wRXhwciAoQU5ZL0FMTCkgdXNpbmcgTUNWIHN0YXRpc3Rp Y3MKKyAqIHdpdGggaGFzaC1iYXNlZCBtYXRjaGluZy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9u IGZvbGxvd3MgdGhlIHNhbWUgcHJvYmFiaWxpdHkgbW9kZWwgYXMgdGhlIGdlbmVyaWMKKyAq IFNjYWxhckFycmF5T3BFeHByIHNlbGVjdGl2aXR5IGNvZGUgKGluZGVwZW5kZW50IG9yIGRp c2pvaW50IHByb2JhYmlsaXRpZXMKKyAqIGZvciBPUi9BTkQgY29tYmluYXRpb25zKSwgYnV0 IGF0dGVtcHRzIHRvIHNwZWVkIHVwIG1hdGNoaW5nIGJldHdlZW4KKyAqIElOLWxpc3QgZWxl bWVudHMgYW5kIHRoZSBjb2x1bW4ncyBtb3N0LWNvbW1vbi12YWx1ZXMgKE1DVikgc3RhdGlz dGljcyBieQorICogdXNpbmcgaGFzaGluZyBpbnN0ZWFkIG9mIG5lc3RlZCBsb29wcy4KKyAq CisgKiBNQ1Ygc3RhdGlzdGljcyBhcmUgdXNlZCBvbmx5IHRvIG9idGFpbiBwZXItdmFsdWUg c2VsZWN0aXZpdGllcyBmb3IKKyAqIGNvbnN0YW50cyB0aGF0IG1hdGNoIE1DViBlbnRyaWVz LiAgQWxsIHByb2JhYmlsaXRpZXMgYXJlIGNvbWJpbmVkIHVzaW5nCisgKiB0aGUgc3RhbmRh cmQgQU5ZL0FMTCBmb3JtdWxhcywgZXhhY3RseSBhcyBpbiB0aGUgZ2VuZXJpYyBlc3RpbWF0 b3IuCisgKgorICogVGhlIGZ1bmN0aW9uIG1heSByZXR1cm4gLTEuMCB0byBpbmRpY2F0ZSB0 aGF0IGhhc2gtYmFzZWQgTUNWIGVzdGltYXRpb24KKyAqIGlzIG5vdCBhcHBsaWNhYmxlIChm b3IgZXhhbXBsZSwgbWlzc2luZyBzdGF0aXN0aWNzLCB1bnN1cHBvcnRlZCBvcGVyYXRvciwK KyAqIG9yIHVuYXZhaWxhYmxlIGhhc2ggZnVuY3Rpb25zKSwgaW4gd2hpY2ggY2FzZSB0aGUg Y2FsbGVyIHNob3VsZCBmYWxsIGJhY2sKKyAqIHRvIHRoZSBnZW5lcmljIFNjYWxhckFycmF5 T3BFeHByIHNlbGVjdGl2aXR5IGVzdGltYXRpb24uCisgKgorICogSW5wdXRzOgorICoJdmFy ZGF0YTogc3RhdGlzdGljcyBhbmQgbWV0YWRhdGEgZm9yIHRoZSB2YXJpYWJsZSBiZWluZyBl c3RpbWF0ZWQKKyAqCW9wZXJhdG9yOiBlcXVhbGl0eSBvciBpbmVxdWFsaXR5IG9wZXJhdG9y IHRvIGFwcGx5CisgKgljb2xsYXRpb246IE9JRCBvZiBjb2xsYXRpb24gdG8gdXNlCisgKglv dGhlcl9vcDogZXhwcmVzc2lvbiBmb3IgdGhlIG5vbi12YXJpYWJsZSBzaWRlIG9mIHRoZSBj b21wYXJpc29uCisgKgl2YXJfb25fbGVmdDogdHJ1ZSBpZiB0aGUgdmFyaWFibGUgaXMgb24g dGhlIGxlZnQgc2lkZSBvZiB0aGUgb3BlcmF0b3IKKyAqCWVsZW1fdmFsdWVzOiBhcnJheSBv ZiBJTi1saXN0IGVsZW1lbnQgdmFsdWVzCisgKgllbGVtX251bGxzOiBhcnJheSBpbmRpY2F0 aW5nIHdoaWNoIElOLWxpc3QgZWxlbWVudHMgYXJlIE5VTEwKKyAqCWVsZW1fY29uc3Q6IGFy cmF5IGluZGljYXRpbmcgd2hpY2ggSU4tbGlzdCBlbGVtZW50cyBhcmUgQ29uc3Qgbm9kZXMK KyAqCW51bV9lbGVtczogbnVtYmVyIG9mIElOLWxpc3QgZWxlbWVudHMKKyAqCW5vbWluYWxf ZWxlbWVudF90eXBlOiB0eXBlIG9mIElOLWxpc3QgZWxlbWVudHMKKyAqCXVzZU9yOiB0cnVl IGlmIGVsZW1lbnRzIGFyZSBjb21iaW5lZCB1c2luZyBPUiBzZW1hbnRpY3MsIGZhbHNlIGZv ciBBTkQKKyAqCWlzRXF1YWxpdHk6IHRydWUgaWYgdGhlIG9wZXJhdG9yIGJlaGF2ZXMgbGlr ZSBlcXVhbGl0eQorICoJaXNJbmVxdWFsaXR5OiB0cnVlIGlmIHRoZSBvcGVyYXRvciBiZWhh dmVzIGxpa2UgaW5lcXVhbGl0eQorICoKKyAqIFJlc3VsdDoKKyAqCVNlbGVjdGl2aXR5IGVz dGltYXRlIGluIHRoZSByYW5nZSBbMC4wLCAxLjBdLCBvciAtMS4wIGlmIG5vIGVzdGltYXRl CisgKgljb3VsZCBiZSBwcm9kdWNlZCBieSB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIE5vdGU6 CisgKglUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgb3BlcmF0b3LigJlzIHNlbGVj dGl2aXR5IGJlaGF2aW9yIG1hdGNoZXMKKyAqCWVxc2VsKCkvbmVxc2VsIHNlbWFudGljcy4g IEl0IG11c3Qgbm90IGJlIHVzZWQgZm9yIG9wZXJhdG9ycyB3aXRoIGN1c3RvbQorICoJb3Ig bm9uLXN0YW5kYXJkIHNlbGVjdGl2aXR5IGJlaGF2aW9yLgorICovCitzdGF0aWMgZG91Ymxl CitzY2FsYXJhcnJheV9tY3ZfaGFzaF9tYXRjaChWYXJpYWJsZVN0YXREYXRhICp2YXJkYXRh LCBPaWQgb3BlcmF0b3IsIE9pZCBjb2xsYXRpb24sCisJCQkgICBOb2RlICpvdGhlcl9vcCwg Ym9vbCB2YXJfb25fbGVmdCwKKwkJCSAgIERhdHVtICplbGVtX3ZhbHVlcywgYm9vbCAqZWxl bV9udWxscywgaW50IG51bV9lbGVtcywgYm9vbCAqZWxlbV9jb25zdCwKKwkJCSAgIE9pZCBu b21pbmFsX2VsZW1lbnRfdHlwZSwgYm9vbCB1c2VPciwgYm9vbCBpc0VxdWFsaXR5LAorCQkJ ICAgYm9vbCBpc0luZXF1YWxpdHkpCit7CisJRm9ybV9wZ19zdGF0aXN0aWMgc3RhdHM7CisJ QXR0U3RhdHNTbG90IHNzbG90OworCUZtZ3JJbmZvCWVxcHJvYzsKKwlkb3VibGUJCXNlbGVj ID0gLTEuMCwKKwkJCXMxZGlzam9pbnQsCisJCQludWxsZnJhYyA9IDAuMDsKKwlPaWQJCWhh c2hMZWZ0ID0gSW52YWxpZE9pZCwKKwkJCWhhc2hSaWdodCA9IEludmFsaWRPaWQsCisJCQlv cGZ1bmNvaWQ7CisJYm9vbAkJaGF2ZV9tY3ZzID0gZmFsc2U7CisKKwkvKgorCSAqIElmIHRo ZSB2YXJpYWJsZSBpcyBrbm93biB0byBiZSB1bmlxdWUsIE1DViBzdGF0aXN0aWNzIGRvIG5v dCByZXByZXNlbnQKKwkgKiBhIG1lYW5pbmdmdWwgZnJlcXVlbmN5IGRpc3RyaWJ1dGlvbiwg c28gc2tpcCBNQ1YtYmFzZWQgZXN0aW1hdGlvbi4KKwkgKi8KKwlpZiAodmFyZGF0YS0+aXN1 bmlxdWUgJiYgdmFyZGF0YS0+cmVsICYmIHZhcmRhdGEtPnJlbC0+dHVwbGVzID49IDEuMCkK KwkJcmV0dXJuIC0xLjA7CisKKwkvKgorCSAqIEZvciBpbmVxdWFsaXR5ICg8PiwgQUxMKSwg d2UgY29tcHV0ZSBwcm9iYWJpbGl0aWVzIHVzaW5nIHRoZSBuZWdhdGVkCisJICogZXF1YWxp dHkgb3BlcmF0b3IgYW5kIGxhdGVyIHRyYW5zZm9ybSB0aGVtIGFzCisJICoKKwkgKiBwKHgg PD4gYykgPSAxIC0gcCh4ID0gYykgLSBudWxsZnJhYworCSAqLworCWlmIChpc0luZXF1YWxp dHkpCisJeworCQlvcGVyYXRvciA9IGdldF9uZWdhdG9yKG9wZXJhdG9yKTsKKwkJaWYgKCFP aWRJc1ZhbGlkKG9wZXJhdG9yKSkKKwkJCXJldHVybiAtMS4wOworCX0KKworCW9wZnVuY29p ZCA9IGdldF9vcGNvZGUob3BlcmF0b3IpOworCW1lbXNldCgmc3Nsb3QsIDAsIHNpemVvZihz c2xvdCkpOworCisJaWYgKEhlYXBUdXBsZUlzVmFsaWQodmFyZGF0YS0+c3RhdHNUdXBsZSkp CisJeworCQlpZiAoc3RhdGlzdGljX3Byb2Nfc2VjdXJpdHlfY2hlY2sodmFyZGF0YSwgb3Bm dW5jb2lkKSkKKwkJCWhhdmVfbWN2cyA9IGdldF9hdHRzdGF0c3Nsb3QoJnNzbG90LCB2YXJk YXRhLT5zdGF0c1R1cGxlLAorCQkJCQkJCSBTVEFUSVNUSUNfS0lORF9NQ1YsIEludmFsaWRP aWQsCisJCQkJCQkJIEFUVFNUQVRTU0xPVF9WQUxVRVMgfCBBVFRTVEFUU1NMT1RfTlVNQkVS Uyk7CisJfQorCisJaWYgKGhhdmVfbWN2cykKKwl7CisJCWZtZ3JfaW5mbyhvcGZ1bmNvaWQs ICZlcXByb2MpOworCisJCS8qCisJCSAqIElmIHRoZSBNQ1YgbGlzdCBhbmQgSU4tbGlzdCBh cmUgbGFyZ2UgZW5vdWdoLCBhbmQgdGhlIG9wZXJhdG9yCisJCSAqIHN1cHBvcnRzIGhhc2hp bmcsIGF0dGVtcHQgdG8gdXNlIGhhc2ggZnVuY3Rpb25zIHNvIHRoYXQgTUNW4oCTSU4KKwkJ ICogbWF0Y2hpbmcgY2FuIGJlIGRvbmUgaW4gTyhOK00pIGluc3RlYWQgb2YgTyhOw5dNKS4K KwkJICovCisJCWlmIChzc2xvdC5udmFsdWVzICsgbnVtX2VsZW1zID49IFNDQUxBUkFSUkFZ X01DVl9IQVNIX1RIUkVTSE9MRCkKKwkJCSh2b2lkKSBnZXRfb3BfaGFzaF9mdW5jdGlvbnMo b3BlcmF0b3IsICZoYXNoTGVmdCwgJmhhc2hSaWdodCk7CisJfQorCisJaWYgKGhhdmVfbWN2 cyAmJiBPaWRJc1ZhbGlkKGhhc2hMZWZ0KSAmJiBPaWRJc1ZhbGlkKGhhc2hSaWdodCkpCisJ eworCQkvKiBVc2UgYSBoYXNoIHRhYmxlIHRvIHNwZWVkIHVwIHRoZSBtYXRjaGluZyAqLwor CQlMT0NBTF9GQ0lORk8oZmNpbmZvLCAyKTsKKwkJTE9DQUxfRkNJTkZPKGhhc2hfZmNpbmZv LCAxKTsKKwkJTUNWSW5IYXNoVGFibGVfaGFzaCAqaGFzaFRhYmxlOworCQlGbWdySW5mbwlo YXNoX3Byb2M7CisJCU1DVkluSGFzaENvbnRleHQgaGFzaENvbnRleHQ7CisJCWRvdWJsZQkJ c3VtYWxsY29tbW9uID0gMC4wLAorCQkJCQlub25tY3Zfc2VsZWMgPSAwLjA7CisJCWJvb2wJ CWlzZGVmYXVsdDsKKwkJYm9vbAkJaGFzaF9tY3Y7CisJCWRvdWJsZQkJb3RoZXJkaXN0aW5j dDsKKwkJRGF0dW0JCSphcnJheUhhc2g7CisJCURhdHVtCQkqYXJyYXlQcm9iZTsKKwkJaW50 CQludmFsdWVzSGFzaDsKKwkJaW50CQludmFsdWVzUHJvYmU7CisJCWludAkJbnZhbHVlc19u b25fbWN2ID0gbnVtX2VsZW1zOworCQlpbnQJCW52YWx1ZXNfbm9uY29uc3QgPSAwOworCisJ CS8qIEdyYWIgdGhlIG51bGxmcmFjIGZvciB1c2UgYmVsb3cuICovCisJCXN0YXRzID0gKEZv cm1fcGdfc3RhdGlzdGljKSBHRVRTVFJVQ1QodmFyZGF0YS0+c3RhdHNUdXBsZSk7CisJCW51 bGxmcmFjID0gc3RhdHMtPnN0YW51bGxmcmFjOworCisJCXNlbGVjID0gczFkaXNqb2ludCA9 ICh1c2VPciA/IDAuMCA6IDEuMCk7CisKKwkJSW5pdEZ1bmN0aW9uQ2FsbEluZm9EYXRhKCpm Y2luZm8sICZlcXByb2MsIDIsIGNvbGxhdGlvbiwKKwkJCQkJIE5VTEwsIE5VTEwpOworCQlm Y2luZm8tPmFyZ3NbMF0uaXNudWxsID0gZmFsc2U7CisJCWZjaW5mby0+YXJnc1sxXS5pc251 bGwgPSBmYWxzZTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHNzbG90Lm52YWx1ZXM7IGkr KykKKwkJCXN1bWFsbGNvbW1vbiArPSBzc2xvdC5udW1iZXJzW2ldOworCisJCS8qCisJCSAq IENvbXB1dGUgdGhlIHRvdGFsIHByb2JhYmlsaXR5IG1hc3Mgb2YgYWxsIG5vbi1NQ1YgdmFs dWVzLiBUaGlzIGlzCisJCSAqIHRoZSBwYXJ0IG9mIHRoZSBjb2x1bW4gZGlzdHJpYnV0aW9u IG5vdCBjb3ZlcmVkIGJ5IE1DVnMuCisJCSAqLworCQlub25tY3Zfc2VsZWMgPSAxLjAgLSBz dW1hbGxjb21tb24gLSBudWxsZnJhYzsKKwkJQ0xBTVBfUFJPQkFCSUxJVFkobm9ubWN2X3Nl bGVjKTsKKworCQkvKgorCQkgKiBBcHByb3hpbWF0ZSB0aGUgcGVyLXZhbHVlIHByb2JhYmls aXR5IG9mIGEgbm9uLU1DViBjb25zdGFudCBieQorCQkgKiBkaXZpZGluZyB0aGUgcmVtYWlu aW5nIHByb2JhYmlsaXR5IG1hc3MgYnkgdGhlIG51bWJlciBvZiBvdGhlcgorCQkgKiBkaXN0 aW5jdCB2YWx1ZXMuCisJCSAqLworCQlvdGhlcmRpc3RpbmN0ID0gZ2V0X3ZhcmlhYmxlX251 bWRpc3RpbmN0KHZhcmRhdGEsICZpc2RlZmF1bHQpIC0gc3Nsb3Qubm51bWJlcnM7CisJCWlm IChvdGhlcmRpc3RpbmN0ID4gMSkKKwkJCW5vbm1jdl9zZWxlYyAvPSBvdGhlcmRpc3RpbmN0 OworCisJCWlmIChzc2xvdC5ubnVtYmVycyA+IDAgJiYgbm9ubWN2X3NlbGVjID4gc3Nsb3Qu bnVtYmVyc1tzc2xvdC5ubnVtYmVycyAtIDFdKQorCQkJbm9ubWN2X3NlbGVjID0gc3Nsb3Qu bnVtYmVyc1tzc2xvdC5ubnVtYmVycyAtIDFdOworCisJCS8qIE1ha2Ugc3VyZSB3ZSBidWls ZCB0aGUgaGFzaCB0YWJsZSBvbiB0aGUgc21hbGxlciBhcnJheS4gKi8KKwkJaWYgKHNzbG90 Lm52YWx1ZXMgPD0gbnVtX2VsZW1zKQorCQl7CisJCQloYXNoX21jdiA9IHRydWU7CisJCQlu dmFsdWVzSGFzaCA9IHNzbG90Lm52YWx1ZXM7CisJCQludmFsdWVzUHJvYmUgPSBudW1fZWxl bXM7CisJCQlhcnJheUhhc2ggPSBzc2xvdC52YWx1ZXM7CisJCQlhcnJheVByb2JlID0gZWxl bV92YWx1ZXM7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYXNoX21jdiA9IGZhbHNlOworCQkJ bnZhbHVlc0hhc2ggPSBudW1fZWxlbXM7CisJCQludmFsdWVzUHJvYmUgPSBzc2xvdC5udmFs dWVzOworCQkJYXJyYXlIYXNoID0gZWxlbV92YWx1ZXM7CisJCQlhcnJheVByb2JlID0gc3Ns b3QudmFsdWVzOworCQl9CisKKwkJZm1ncl9pbmZvKGhhc2hfbWN2ID8gaGFzaExlZnQgOiBo YXNoUmlnaHQsICZoYXNoX3Byb2MpOworCQlJbml0RnVuY3Rpb25DYWxsSW5mb0RhdGEoKmhh c2hfZmNpbmZvLCAmaGFzaF9wcm9jLCAxLCBjb2xsYXRpb24sCisJCQkJCSBOVUxMLCBOVUxM KTsKKwkJaGFzaF9mY2luZm8tPmFyZ3NbMF0uaXNudWxsID0gZmFsc2U7CisKKwkJaGFzaENv bnRleHQuZXF1YWxfZmNpbmZvID0gZmNpbmZvOworCQloYXNoQ29udGV4dC5oYXNoX2ZjaW5m byA9IGhhc2hfZmNpbmZvOworCQloYXNoQ29udGV4dC5vcF9pc19yZXZlcnNlZCA9ICFoYXNo X21jdjsKKwkJaGFzaENvbnRleHQuaW5zZXJ0X21vZGUgPSB0cnVlOworCisJCWdldF90eXBs ZW5ieXZhbChoYXNoX21jdiA/IHNzbG90LnZhbHVldHlwZSA6IG5vbWluYWxfZWxlbWVudF90 eXBlLAorCQkJCSZoYXNoQ29udGV4dC5oYXNoX3R5cGxlbiwKKwkJCQkmaGFzaENvbnRleHQu aGFzaF90eXBieXZhbCk7CisKKwkJaGFzaFRhYmxlID0gTUNWSW5IYXNoVGFibGVfY3JlYXRl KEN1cnJlbnRNZW1vcnlDb250ZXh0LAorCQkJCQkJICBudmFsdWVzSGFzaCwKKwkJCQkJCSAg Jmhhc2hDb250ZXh0KTsKKworCQkvKiBCdWlsZCBhIGhhc2ggdGFibGUgb3ZlciB0aGUgc21h bGxlciBpbnB1dCBzaWRlLiAqLworCQlmb3IgKGludCBpID0gMDsgaSA8IG52YWx1ZXNIYXNo OyBpKyspCisJCXsKKwkJCWJvb2wJCWZvdW5kID0gZmFsc2U7CisJCQlNQ1ZJbkhhc2hFbnRy eSAqZW50cnk7CisKKwkJCS8qCisJCQkgKiBXaGVuIGhhc2hpbmcgSU4tbGlzdCB2YWx1ZXMg KGhhc2hfbWN2ID09IGZhbHNlKSwgd2Ugb25seSBpbnNlcnQKKwkJCSAqIGNvbnN0YW50LCBu b24tTlVMTCBlbGVtZW50cy4gIE5VTEwgYW5kIG5vbi1Db25zdCBlbGVtZW50cyBhcmUKKwkJ CSAqIGNvdW50ZWQgc2VwYXJhdGVseSwgYmVjYXVzZSB0aGV5IGNhbm5vdCBwYXJ0aWNpcGF0 ZSBpbiBNQ1YKKwkJCSAqIG1hdGNoaW5nIGFuZCBtdXN0IGJlIGhhbmRsZWQgbGF0ZXIgdXNp bmcgZ2VuZXJpYyBzZWxlY3Rpdml0eQorCQkJICogZXN0aW1hdGlvbi4KKwkJCSAqLworCQkJ aWYgKCFoYXNoX21jdikKKwkJCXsKKwkJCQlpZiAoZWxlbV9udWxsc1tpXSkKKwkJCQl7CisJ CQkJCS8qCisJCQkJCSAqIEZvciBBTEwvQU5EIHNlbWFudGljcywgYW55IE5VTEwgZWxlbWVu dCBtYWtlcyByZXN1bHQKKwkJCQkJICogYWx3YXlzIEZBTFNFCisJCQkJCSAqLworCQkJCQlp ZiAoIXVzZU9yKQorCQkJCQl7CisJCQkJCQlNQ1ZJbkhhc2hUYWJsZV9kZXN0cm95KGhhc2hU YWJsZSk7CisJCQkJCQlmcmVlX2F0dHN0YXRzc2xvdCgmc3Nsb3QpOworCisJCQkJCQlyZXR1 cm4gMC4wOworCQkJCQl9CisKKwkJCQkJbnZhbHVlc19ub25fbWN2LS07CisJCQkJCWNvbnRp bnVlOworCQkJCX0KKworCQkJCWlmICghZWxlbV9jb25zdFtpXSkKKwkJCQl7CisJCQkJCW52 YWx1ZXNfbm9uX21jdi0tOworCQkJCQludmFsdWVzX25vbmNvbnN0Kys7CisJCQkJCWNvbnRp bnVlOworCQkJCX0KKwkJCX0KKworCQkJZW50cnkgPSBNQ1ZJbkhhc2hUYWJsZV9pbnNlcnQo aGFzaFRhYmxlLCBhcnJheUhhc2hbaV0sICZmb3VuZCk7CisKKwkJCS8qCisJCQkgKiBlbnRy eS0+Y291bnQgdHJhY2tzIGhvdyBtYW55IHRpbWVzIHRoZSBzYW1lIHZhbHVlIGFwcGVhcnMs IHNvCisJCQkgKiB0aGF0IGR1cGxpY2F0ZSBJTi1saXN0IGVsZW1lbnRzIGNhbiBiZSBmb2xk ZWQgaW50byB0aGUKKwkJCSAqIHByb2JhYmlsaXR5IGNhbGN1bGF0aW9uLgorCQkJICovCisJ CQlpZiAobGlrZWx5KCFmb3VuZCkpCisJCQl7CisJCQkJZW50cnktPmluZGV4ID0gaTsKKwkJ CQllbnRyeS0+Y291bnQgPSAxOworCQkJfQorCQkJZWxzZQorCQkJCWVudHJ5LT5jb3VudCsr OworCQl9CisKKwkJaGFzaENvbnRleHQuaW5zZXJ0X21vZGUgPSBmYWxzZTsKKwkJaWYgKGhh c2hMZWZ0ICE9IGhhc2hSaWdodCkKKwkJeworCQkJZm1ncl9pbmZvKGhhc2hfbWN2ID8gaGFz aFJpZ2h0IDogaGFzaExlZnQsICZoYXNoX3Byb2MpOworCQkJLyogUmVzZXR0aW5nIGhhc2hf ZmNpbmZvIGlzIHByb2JhYmx5IHVubmVjZXNzYXJ5LCBidXQgYmUgc2FmZSAqLworCQkJSW5p dEZ1bmN0aW9uQ2FsbEluZm9EYXRhKCpoYXNoX2ZjaW5mbywgJmhhc2hfcHJvYywgMSwgY29s bGF0aW9uLAorCQkJCQkJIE5VTEwsIE5VTEwpOworCQkJaGFzaF9mY2luZm8tPmFyZ3NbMF0u aXNudWxsID0gZmFsc2U7CisJCX0KKworCQlmb3IgKGludCBpID0gMDsgaSA8IG52YWx1ZXNQ cm9iZTsgaSsrKQorCQl7CisJCQlNQ1ZJbkhhc2hFbnRyeSAqZW50cnk7CisJCQlTZWxlY3Rp dml0eSBzMTsKKwkJCWludAkJCW52YWx1ZXNtY3Y7CisKKwkJCS8qCisJCQkgKiBXaGVuIHBy b2Jpbmcgd2l0aCBJTi1saXN0IGVsZW1lbnRzLCBpZ25vcmUgTlVMTHMgYW5kIG5vbi1Db25z dAorCQkJICogZXhwcmVzc2lvbnM6IHRoZXkgY2Fubm90IGJlIG1hdGNoZWQgYWdhaW5zdCBN Q1ZzIGFuZCB3aWxsIGJlCisJCQkgKiBhY2NvdW50ZWQgZm9yIGxhdGVyIGJ5IGdlbmVyaWMg ZXN0aW1hdGlvbi4KKwkJCSAqLworCQkJaWYgKGhhc2hfbWN2KQorCQkJeworCQkJCWlmIChl bGVtX251bGxzW2ldKQorCQkJCXsKKwkJCQkJLyoKKwkJCQkJICogRm9yIEFMTC9BTkQgc2Vt YW50aWNzLCBhbnkgTlVMTCBlbGVtZW50IG1ha2VzIHJlc3VsdAorCQkJCQkgKiBhbHdheXMg RkFMU0UKKwkJCQkJICovCisJCQkJCWlmICghdXNlT3IpCisJCQkJCXsKKwkJCQkJCU1DVklu SGFzaFRhYmxlX2Rlc3Ryb3koaGFzaFRhYmxlKTsKKwkJCQkJCWZyZWVfYXR0c3RhdHNzbG90 KCZzc2xvdCk7CisKKwkJCQkJCXJldHVybiAwLjA7CisJCQkJCX0KKworCQkJCQludmFsdWVz X25vbl9tY3YtLTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYgKCFlbGVtX2Nv bnN0W2ldKQorCQkJCXsKKwkJCQkJbnZhbHVlc19ub25fbWN2LS07CisJCQkJCW52YWx1ZXNf bm9uY29uc3QrKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCisJCQllbnRyeSA9 IE1DVkluSGFzaFRhYmxlX2xvb2t1cChoYXNoVGFibGUsIGFycmF5UHJvYmVbaV0pOworCisJ CQkvKgorCQkJICogSWYgZm91bmQsIG9idGFpbiBpdHMgTUNWIGZyZXF1ZW5jeSBhbmQgcmVt ZW1iZXIgaG93IG1hbnkgdmFsdWVzCisJCQkgKiBvbiB0aGUgaGFzaGVkIHNpZGUgbWFwIHRv IHRoaXMgZW50cnkuCisJCQkgKi8KKwkJCWlmIChlbnRyeSAhPSBOVUxMKQorCQkJeworCQkJ CXMxID0gaGFzaF9tY3YgPyBzc2xvdC5udW1iZXJzW2VudHJ5LT5pbmRleF0KKwkJCQkJOiBz c2xvdC5udW1iZXJzW2ldOworCisJCQkJbnZhbHVlc21jdiA9IGVudHJ5LT5jb3VudDsKKwor CQkJCS8qIE1hdGNoZWQgdmFsdWVzIGFyZSBubyBsb25nZXIgY29uc2lkZXJlZCBub24tTUNW ICovCisJCQkJbnZhbHVlc19ub25fbWN2IC09IG52YWx1ZXNtY3Y7CisJCQl9CisJCQllbHNl CisJCQl7CisJCQkJLyogTm8gTUNWIG1hdGNoIGZvciB0aGlzIHZhbHVlICovCisJCQkJY29u dGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBGb2xkIHRoaXMgdmFsdWUncyBwcm9iYWJp bGl0eSBpbnRvIHRoZSBydW5uaW5nIEFOWS9BTEwKKwkJCSAqIHNlbGVjdGl2aXR5IGVzdGlt YXRlIG9uY2UgZm9yIGVhY2ggb2NjdXJyZW5jZS4KKwkJCSAqLworCQkJZm9yIChpbnQgaiA9 IDA7IGogPCBudmFsdWVzbWN2OyBqKyspCisJCQkJYWNjdW1fc2NhbGFyYXJyYXlfcHJvYihz MSwgdXNlT3IsIGlzRXF1YWxpdHksIGlzSW5lcXVhbGl0eSwKKwkJCQkJCQkgICBudWxsZnJh YywgJnNlbGVjLCAmczFkaXNqb2ludCk7CisJCX0KKworCQkvKgorCQkgKiBBY2NvdW50IGZv ciBjb25zdGFudCBJTi1saXN0IHZhbHVlcyB0aGF0IGRpZCBub3QgbWF0Y2ggYW55IE1DVi4K KwkJICoKKwkJICogRWFjaCBzdWNoIHZhbHVlIGlzIGFzc3VtZWQgdG8gaGF2ZSBwcm9iYWJp bGl0eSA9IG5vbm1jdl9zZWxlYywKKwkJICogZGVyaXZlZCBmcm9tIHRoZSByZW1haW5pbmcg KG5vbi1NQ1YpIHByb2JhYmlsaXR5IG1hc3MuCisJCSAqLworCQlmb3IgKGludCBpID0gMDsg aSA8IG52YWx1ZXNfbm9uX21jdjsgaSsrKQorCQkJYWNjdW1fc2NhbGFyYXJyYXlfcHJvYihu b25tY3Zfc2VsZWMsIHVzZU9yLCBpc0VxdWFsaXR5LCBpc0luZXF1YWxpdHksCisJCQkJCQkJ CSAgIG51bGxmcmFjLCAmc2VsZWMsICZzMWRpc2pvaW50KTsKKworCQkvKgorCQkgKiBBY2Nv dW50IGZvciBub24tQ29uc3QgSU4tbGlzdCBlbGVtZW50cy4KKwkJICoKKwkJICogVGhlc2Ug dmFsdWVzIGNhbm5vdCBiZSBtYXRjaGVkIGFnYWluc3QgTUNWcywgc28gd2UgcmVseSBvbiB0 aGUKKwkJICogb3BlcmF0b3IncyBnZW5lcmljIHNlbGVjdGl2aXR5IGVzdGltYXRvciBmb3Ig ZWFjaCBvZiB0aGVtLgorCQkgKi8KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBudmFsdWVzX25v bmNvbnN0OyBpKyspCisJCXsKKwkJCVNlbGVjdGl2aXR5IHMxID0gdmFyX2VxX25vbl9jb25z dCh2YXJkYXRhLCBvcGVyYXRvciwgY29sbGF0aW9uLAorCQkJCQkJCSAgb3RoZXJfb3AsIHZh cl9vbl9sZWZ0LCBmYWxzZSk7CisKKwkJCWFjY3VtX3NjYWxhcmFycmF5X3Byb2IoczEsIHVz ZU9yLCBpc0VxdWFsaXR5LCBpc0luZXF1YWxpdHksCisJCQkJCQkgICBudWxsZnJhYywgJnNl bGVjLCAmczFkaXNqb2ludCk7CisJCX0KKworCQkvKgorCQkgKiBGb3IgPSBBTlkgb3IgPD4g QUxMLCBpZiB0aGUgSU4tbGlzdCBlbGVtZW50cyBhcmUgYXNzdW1lZCBkaXN0aW5jdCwKKwkJ ICogdGhlIGV2ZW50cyBhcmUgZGlzam9pbnQgYW5kIHRoZSB0b3RhbCBwcm9iYWJpbGl0eSBp cyB0aGUgc3VtIG9mCisJCSAqIGluZGl2aWR1YWwgcHJvYmFiaWxpdGllcy4gIFVzZSB0aGF0 IGVzdGltYXRlIGlmIGl0IGxpZXMgaW4gWzAsMV0uCisJCSAqLworCQlpZiAoKHVzZU9yID8g aXNFcXVhbGl0eSA6IGlzSW5lcXVhbGl0eSkgJiYKKwkJCXMxZGlzam9pbnQgPj0gMC4wICYm IHMxZGlzam9pbnQgPD0gMS4wKQorCQkJc2VsZWMgPSBzMWRpc2pvaW50OworCisJCUNMQU1Q X1BST0JBQklMSVRZKHNlbGVjKTsKKworCQlNQ1ZJbkhhc2hUYWJsZV9kZXN0cm95KGhhc2hU YWJsZSk7CisJCWZyZWVfYXR0c3RhdHNzbG90KCZzc2xvdCk7CisJfQorCisJcmV0dXJuIHNl bGVjOworfQorCisvKgorICogQWNjdW11bGF0ZSB0aGUgc2VsZWN0aXZpdHkgY29udHJpYnV0 aW9uIG9mIGEgc2luZ2xlIGFycmF5IGVsZW1lbnQKKyAqIGludG8gdGhlIHJ1bm5pbmcgU2Nh bGFyQXJyYXlPcEV4cHIgc2VsZWN0aXZpdHkgZXN0aW1hdGUuCisgKi8KK3N0YXRpYyB2b2lk CithY2N1bV9zY2FsYXJhcnJheV9wcm9iKFNlbGVjdGl2aXR5IHMxLCBib29sIHVzZU9yLCBi b29sIGlzRXF1YWxpdHksCisJCQkgICBib29sIGlzSW5lcXVhbGl0eSwgZG91YmxlIG51bGxm cmFjLAorCQkJICAgZG91YmxlICpzZWxlYywgZG91YmxlICpzMWRpc2pvaW50KQoreworCVNl bGVjdGl2aXR5IHMyID0gczE7CisKKwlpZiAoaXNJbmVxdWFsaXR5KQorCQlzMiA9IDEuMCAt IHMyIC0gbnVsbGZyYWM7CisKKwlDTEFNUF9QUk9CQUJJTElUWShzMik7CisKKwlpZiAodXNl T3IpCisJeworCQkqc2VsZWMgPSAqc2VsZWMgKyBzMiAtICgqc2VsZWMpICogczI7CisJCWlm IChpc0VxdWFsaXR5KQorCQkJKnMxZGlzam9pbnQgKz0gczI7CisJfQorCWVsc2UKKwl7CisJ CSpzZWxlYyA9ICgqc2VsZWMpICogczI7CisJCWlmIChpc0luZXF1YWxpdHkpCisJCQkqczFk aXNqb2ludCArPSBzMiAtIDEuMDsKKwl9Cit9CisKKy8qCisgKiBTdXBwb3J0IGZ1bmN0aW9u cyBmb3IgdGhlIGhhc2ggdGFibGVzIHVzZWQgYnkgZXFqb2luc2VsX2ZpbmRfbWF0Y2hlcwor ICovCitzdGF0aWMgdWludDMyCitoYXNoX21jdl9pbihNQ1ZJbkhhc2hUYWJsZV9oYXNoICp0 YWIsIERhdHVtIGtleSkKK3sKKwlNQ1ZJbkhhc2hDb250ZXh0ICpjb250ZXh0ID0gKE1DVklu SGFzaENvbnRleHQgKikgdGFiLT5wcml2YXRlX2RhdGE7CisJRnVuY3Rpb25DYWxsSW5mbyBm Y2luZm8gPSBjb250ZXh0LT5oYXNoX2ZjaW5mbzsKKwlEYXR1bQkJZnJlc3VsdDsKKworCWZj aW5mby0+YXJnc1swXS52YWx1ZSA9IGtleTsKKwlmY2luZm8tPmlzbnVsbCA9IGZhbHNlOwor CWZyZXN1bHQgPSBGdW5jdGlvbkNhbGxJbnZva2UoZmNpbmZvKTsKKwlBc3NlcnQoIWZjaW5m by0+aXNudWxsKTsKKwlyZXR1cm4gRGF0dW1HZXRVSW50MzIoZnJlc3VsdCk7Cit9CisKK3N0 YXRpYyBib29sCittY3ZzX2luX2VxdWFsKE1DVkluSGFzaFRhYmxlX2hhc2ggKnRhYiwgRGF0 dW0ga2V5MCwgRGF0dW0ga2V5MSkKK3sKKwlNQ1ZJbkhhc2hDb250ZXh0ICpjb250ZXh0ID0g KE1DVkluSGFzaENvbnRleHQgKikgdGFiLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoY29udGV4 dC0+aW5zZXJ0X21vZGUpCisJeworCQkvKgorCQkgKiBEdXJpbmcgdGhlIGluc2VydGlvbiBz dGVwLCBhbnkgY29tcGFyaXNvbnMgd2lsbCBiZSBiZXR3ZWVuIHR3bworCQkgKiBEYXR1bXMg b2YgdGhlIGhhc2ggdGFibGUncyBkYXRhIHR5cGUsIHNvIGlmIHRoZSBnaXZlbiBvcGVyYXRv ciBpcworCQkgKiBjcm9zcy10eXBlIGl0IHdpbGwgYmUgdGhlIHdyb25nIHRoaW5nIHRvIHVz ZS4gIEZvcnR1bmF0ZWx5LCB3ZSBjYW4KKwkJICogdXNlIGRhdHVtX2ltYWdlX2VxIGluc3Rl YWQuICBUaGUgTUNWIHZhbHVlcyBzaG91bGQgYWxsIGJlIGRpc3RpbmN0CisJCSAqIGFueXdh eSwgc28gaXQncyBtb3N0bHkgcHJvLWZvcm1hIHRvIGNvbXBhcmUgdGhlbSBhdCBhbGwuCisJ CSAqLworCQlyZXR1cm4gZGF0dW1faW1hZ2VfZXEoa2V5MCwga2V5MSwKKwkJCQkJCQkgIGNv bnRleHQtPmhhc2hfdHlwYnl2YWwsIGNvbnRleHQtPmhhc2hfdHlwbGVuKTsKKwl9CisJZWxz ZQorCXsKKwkJRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8gPSBjb250ZXh0LT5lcXVhbF9mY2lu Zm87CisJCURhdHVtCQlmcmVzdWx0OworCisJCS8qCisJCSAqIEFwcGx5IHRoZSBvcGVyYXRv ciB0aGUgY29ycmVjdCB3YXkgYXJvdW5kLiAgQWx0aG91Z2ggc2ltcGxlaGFzaC5oCisJCSAq IGRvZXNuJ3QgZG9jdW1lbnQgdGhpcyBleHBsaWNpdGx5LCBkdXJpbmcgbG9va3VwcyBrZXkw IGlzIGZyb20gdGhlCisJCSAqIGhhc2ggdGFibGUgd2hpbGUga2V5MSBpcyB0aGUgcHJvYmUg dmFsdWUsIHNvIHdlIHNob3VsZCBjb21wYXJlIHRoZW0KKwkJICogaW4gdGhhdCBvcmRlciBv bmx5IGlmIG9wX2lzX3JldmVyc2VkLgorCQkgKi8KKwkJaWYgKGNvbnRleHQtPm9wX2lzX3Jl dmVyc2VkKQorCQl7CisJCQlmY2luZm8tPmFyZ3NbMF0udmFsdWUgPSBrZXkwOworCQkJZmNp bmZvLT5hcmdzWzFdLnZhbHVlID0ga2V5MTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWZjaW5m by0+YXJnc1swXS52YWx1ZSA9IGtleTE7CisJCQlmY2luZm8tPmFyZ3NbMV0udmFsdWUgPSBr ZXkwOworCQl9CisJCWZjaW5mby0+aXNudWxsID0gZmFsc2U7CisJCWZyZXN1bHQgPSBGdW5j dGlvbkNhbGxJbnZva2UoZmNpbmZvKTsKKwkJcmV0dXJuICghZmNpbmZvLT5pc251bGwgJiYg RGF0dW1HZXRCb29sKGZyZXN1bHQpKTsKKwl9Cit9CisKIC8qCiAgKiBFc3RpbWF0ZSBudW1i ZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5IHlpZWxkZWQgYnkgYW4gZXhwcmVzc2lvbi4K ICAqCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCBiL3Ny Yy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CmluZGV4IDM0Mzc0ZGYwZDY3Li4yMzU2 NzhiNzNjNiAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QK KysrIGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKQEAgLTE2NzEsNiArMTY3 MSw5IEBAIE1CdWYKIE1DVkhhc2hDb250ZXh0CiBNQ1ZIYXNoRW50cnkKIE1DVkhhc2hUYWJs ZV9oYXNoCitNQ1ZJbkhhc2hDb250ZXh0CitNQ1ZJbkhhc2hFbnRyeQorTUNWSW5IYXNoVGFi bGVfaGFzaAogTUNWSXRlbQogTUNWTGlzdAogTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OCi0t IAoyLjM0LjEKCg== --------------CiWBSOFdKn0B4wnW0DGswvks--