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 1wkk7p-000ql4-1b for pgsql-bugs@arkaria.postgresql.org; Fri, 17 Jul 2026 15:05:17 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wkk7n-000Wvn-1T for pgsql-bugs@arkaria.postgresql.org; Fri, 17 Jul 2026 15:05:15 +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 1wkk7n-000Wvf-0P for pgsql-bugs@lists.postgresql.org; Fri, 17 Jul 2026 15:05:15 +0000 Received: from mail-yw1-x1136.google.com ([2607:f8b0:4864:20::1136]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wkk7k-00000000mUG-3ErC for pgsql-bugs@lists.postgresql.org; Fri, 17 Jul 2026 15:05:14 +0000 Received: by mail-yw1-x1136.google.com with SMTP id 00721157ae682-80dc4a68e4aso64791657b3.0 for ; Fri, 17 Jul 2026 08:05:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784300711; x=1784905511; darn=lists.postgresql.org; h=in-reply-to:references:to:from:subject:cc:message-id:date :mime-version:content-type:from:to:cc:subject:date:message-id :reply-to:content-type; bh=mVxR7FpSbvELMYizj4ZOtoDrqwh23hj6pkmXjEgnh0g=; b=n2SDMiCHuiMdJTb4VYoAYsmSVo+GqDN9p1IE/aOFveLul/f80wPOIjgd97RpGz0Jha xz5ftvx2Fzt1NluIpRR4xDTlk4Kj/+p8VuO5artAg6T3OKWE6VdPMmPp6MTiLMpk/oQm aGj8kEjBOxPlfcLB/kwBOpX6s9A00cyE5fRkKG6y6SdwDS5ZNyBX7yIUvm6k+zHCByCS gf4SKI/eHFGrjuJEwXeWlfFWXPic2G0L5FvBlRf1SPZ85JaVkKkOuXjiEbmyCvcamo9A 7y/Ik7VvbagSU2g+dK+NPjXtByk9hAGb/Ecq4uv6J4PWSPeb25rtJ218dXtqsMDIKJ+y 62IA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784300711; x=1784905511; h=in-reply-to:references:to:from:subject:cc:message-id:date :mime-version:content-type:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to:content-type; bh=mVxR7FpSbvELMYizj4ZOtoDrqwh23hj6pkmXjEgnh0g=; b=hRaXMqz3AW9vuWSmvlSO+1LyLIC0M72u4OxngcaTTtByGngIbrpqMa1QwfmUMCs5by cKXF+ub1mtEa3KAe7xHjLmsnz28ARE9dV7M+MqWy9070NSUEui9P08+grhf+PZ2fWHE2 pSKWdVW6wecvHr5SygAtmz+l/0/Cac8w324o1W41iE4iCOXblMKYgx2I8Z+DUAJF19lA uDX0T99Tr9Lmq2IMaErhCK1/S64te32mnh298k91VTb5zi+mVabw3Sb6+MpWTBbxDJrn KeCX0V2dzWWz7RdKJUmTZ9/7i25MErdUvAEgXeYdXr5hDShOMgZESxsL2lRKAmgmF3xV zhGQ== X-Forwarded-Encrypted: i=1; AHgh+RrfKnm4dOEyjDbdtNwQNoZX4Ka3G0lLby7DxizCYc0VZvmwDnjn9LD4hyR9GgDBdH58+x+Tl9K3dH3h@lists.postgresql.org X-Gm-Message-State: AOJu0Yy5hOYZM+YeDQOi+U/kA2jhqC7zvN/PDXhqmRjYSrWWgF4c2ycI tU+q2DFVpinmQ07Z1vR/WzIecSfsMfXPdaeRQsvDHmVV4pPx8VeXQQeo X-Gm-Gg: AfdE7cmj/0LadwppKcaId41UZ78q6G0YFwYVSQbxUREjrHufNLWucGql4Tj2Tga0l3r EEYRKSIHOSvmSEBkizkoAvY+CvZDWjM96ny6MoXP4GoTz/0Z5X3dOXl4fQJiQIGfVVqR4CwBmBO UrwBFLUlKJmrgohA37Q6tniWrYJADLX74BXGIUYVlH1xu+aadjec4Ee6xfs1ELv24KfK2fxKFLQ El9w4JSwbPAw8xZgjLlIdUyqvPQJw0xJFJdicNYygYEO1UbZdO2QZAKQN8HnJwr7gjR4xT/Go5a yX92DwCvZ1JLJQvJBecYNmOidnkMrL1RkUkAArsgjCjQdBLrMv/vnkPtCk3VjYlACsaK6t8wBbk t2rS9v2B9So7FoHakFlsDmx88vTkJFCFV5R5o1ZhNUdmEnwqssxp9bxx1UN9JMrzzTUDiHoOnii c7scAaHlsYNTlm2oS10rY0ipWp X-Received: by 2002:a05:690c:4d01:b0:81e:8985:e0e with SMTP id 00721157ae682-81ef2610ce0mr9753827b3.37.1784300710198; Fri, 17 Jul 2026 08:05:10 -0700 (PDT) Received: from localhost ([2804:14d:32a7:4273:fde4:3588:2297:da6a]) by smtp.gmail.com with ESMTPSA id 00721157ae682-81ef4276391sm11713837b3.27.2026.07.17.08.05.08 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 17 Jul 2026 08:05:09 -0700 (PDT) Content-Type: multipart/mixed; boundary=bd92ef4be5b0067a5492ff80fcb41f95e3776a2454384b6164e8c830780d Mime-Version: 1.0 Date: Fri, 17 Jul 2026 12:05:06 -0300 Message-Id: Cc: , , "Richard Guo" Subject: Re: BUG #19553: Wrong results from nested LEFT JOINs over an empty subquery (regression since v16) From: "Matheus Alcantara" To: "Tom Lane" X-Mailer: aerc 0.21.0 References: <19553-4561747f93f368a7@postgresql.org> <3824828.1784244210@sss.pgh.pa.us> In-Reply-To: <3824828.1784244210@sss.pgh.pa.us> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --bd92ef4be5b0067a5492ff80fcb41f95e3776a2454384b6164e8c830780d Content-Type: multipart/alternative; boundary=488f0e0475cca045221079d46308a84a9750cf53c95347c137e42bf92502 --488f0e0475cca045221079d46308a84a9750cf53c95347c137e42bf92502 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Content-Type: text/plain; charset=UTF-8 On Thu Jul 16, 2026 at 8:23 PM -03, Tom Lane wrote: > So the simplest fix is probably to mask off OJ bits and consider only > baserels when deciding if phrels equals the target. Unfortunately, > this happens long before we compute root->all_baserels or anything > like that, so remove_useless_result_rtes is on its own to figure out > which those are. I think we can extend it to build a bitmapset of > relevant baserel RT indexes while it is scanning the tree (so that we > don't need an additional recursive scan just to get that). But I've > not tried to write any code yet; do you feel like attacking that? > Attached patch does this: remove_useless_result_rtes() now precomputes a Relids of all non-join RT indexes by scanning root->parse->rtable once up front (rather than doing a second recursive walk), and threads it through remove_useless_results_recurse() down to both find_dependent_phvs() and find_dependent_phvs_in_jointree(). Both now intersect a candidate PHV's phrels with that baserels set before comparing to the target relid, instead of comparing phrels as-is. I checked that a plain flat scan of the rtable is sufficient here rather than needing to accumulate the set incrementally during the jointree recursion. Every PHV this code ever matches has phlevelsup =3D=3D sublevels_up, which by construction means its phrels are relids in the outermost query's rangetable, not some inner subquery's. So a single baserels set computed once from root->parse->rtable is valid at every recursion depth, and we don't need to recompute or thread a different set per query level. Note: Richard have also shared a fix for this bug on this thread, it's also seems to fix the issue and IIUC it fixes without the extra loop to collect the baserels. I decided to continue with my attempt following your suggestion so we can discuss both approaches (and also because I'm still not super familiar with this part of the code and I wanted to learn more about it). -- Matheus Alcantara EDB: https://www.enterprisedb.com --488f0e0475cca045221079d46308a84a9750cf53c95347c137e42bf92502-- --bd92ef4be5b0067a5492ff80fcb41f95e3776a2454384b6164e8c830780d Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=v2-0001-Fix-wrong-results-from-remove_useless_result_rtes.patch Content-Type: text/plain; charset=utf-8; name=v2-0001-Fix-wrong-results-from-remove_useless_result_rtes.patch RnJvbSA3OWRmNDM5Y2Q5OGYyZTQwOGZmNTRlNzYwYjNkMWNkYzY4ZTRjOGM4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRoZXVzIEFsY2FudGFyYSA8bXRocy5kZXZAcG0ubWU+CkRh dGU6IFRodSwgMTYgSnVsIDIwMjYgMTk6MDU6NTUgLTAzMDAKU3ViamVjdDogW1BBVENIIHYyXSBG aXggd3JvbmcgcmVzdWx0cyBmcm9tIHJlbW92ZV91c2VsZXNzX3Jlc3VsdF9ydGVzIHdpdGgKIG5l c3RlZCBQSFZzLgoKZmluZF9kZXBlbmRlbnRfcGh2cygpIGFuZCBmaW5kX2RlcGVuZGVudF9waHZz X2luX2pvaW50cmVlKCkgZGVjaWRlCndoZXRoZXIgYSBQbGFjZUhvbGRlclZhciBzdGlsbCBuZWVk cyB0aGUgUlRFX1JFU1VMVCByZWwgd2UncmUgYWJvdXQgdG8KcmVtb3ZlIGJ5IGNvbXBhcmluZyB0 aGUgUEhWJ3MgcGhyZWxzIHRvIGEgc2luZ2xldG9uIHNldCBjb250YWluaW5nIHRoYXQKcmVsJ3Mg UlQgaW5kZXguIEJ1dCBwaHJlbHMgaXMgZG9jdW1lbnRlZCB0byBob2xkICJiYXNlK09KIHJlbGlk cwpzeW50YWN0aWNhbGx5IHdpdGhpbiIgdGhlIFBIVidzIGV4cHJlc3Npb24sIHNvIGl0IGNhbiBj b250YWluIG91dGVyLWpvaW4KUlQgaW5kZXhlcyBhcyB3ZWxsIGFzIGJhc2UtcmVsYXRpb24gb25l cy4gVGhlIGNvbXBhcmlzb24gd2FzIGRvbmUKYWdhaW5zdCB0aGUgcmF3IHBocmVscywgc28gYSBQ SFYgd2hvc2UgcGhyZWxzIGFsc28gaW5jbHVkZWQgc29tZQplbmNsb3Npbmcgb3V0ZXIgam9pbidz IFJUIGluZGV4IHdvdWxkIG5ldmVyIGNvbXBhcmUgZXF1YWwgdG8gdGhlCnNpbmdsZXRvbiwgZXZl biB0aG91Z2ggdGhlIFBIViBnZW51aW5lbHkgc3RpbGwgZGVwZW5kZWQgb24gdGhlClJURV9SRVNV TFQgcmVsLiBUaGlzIGxldCByZW1vdmVfdXNlbGVzc19yZXN1bHRzX3JlY3Vyc2UgY29uY2x1ZGUg aXQgd2FzCnNhZmUgdG8gZGlzY2FyZCB0aGUgZW5jbG9zaW5nIGxlZnQgam9pbiBhbG9uZyB3aXRo IHRoZSBSVEVfUkVTVUxULApzaWxlbnRseSBsb3NpbmcgdGhhdCBqb2luJ3MgbnVsbC1leHRlbnNp b24gc2VtYW50aWNzLiBBIFBIVi13cmFwcGVkCmNvbnN0YW50IHRoYXQgc2hvdWxkIGhhdmUgZ29u ZSB0byBOVUxMIGZvciB1bm1hdGNoZWQgcm93cyB3YXMgdGhlbgplbWl0dGVkIHVuY29uZGl0aW9u YWxseSBmb3IgZXZlcnkgcm93LgoKVGhpcyBjYW4gYmUgc2VlbiB3aXRoIHR3byBuZXN0ZWQgY29t bXV0YWJsZSBsZWZ0IGpvaW5zIHdoZXJlIHRoZSBsb3dlcgpqb2luJ3MgUkhTIHJlZHVjZXMgdG8g YSBzaW5nbGUtcm93IFJURV9SRVNVTFQ6IHRoZSBQSFYgYnVpbHQgZm9yIHRoZQpsb3dlciBqb2lu J3Mgb3V0cHV0IHBpY2tzIHVwIHRoZSBvdXRlciBqb2luJ3MgUlQgaW5kZXggaW4gaXRzIHBocmVs cwphbG9uZ3NpZGUgdGhlIHR3byBSVEVfUkVTVUxUIHJlbGlkcywgd2hpY2ggYnJva2UgdGhlIGV4 YWN0LW1hdGNoIHRlc3QKYWdhaW5zdCBlaXRoZXIgUlRFX1JFU1VMVCBpbmRpdmlkdWFsbHkuCgpG aXggdGhpcyBieSBtYXNraW5nIHBocmVscyBkb3duIHRvIGJhc2UgcmVsaWRzIGJlZm9yZSBjb21w YXJpbmcsIHNpbmNlCm9ubHkgYmFzZSByZWxpZHMgaW5kaWNhdGUgYSByZWFsIGV2YWx1YXRpb24t c2l0ZSBkZXBlbmRlbmN5OyB0aGUKcHJlc2VuY2Ugb2YgYW4gT0ogcmVsaWQgZG9lc24ndC4gcmVt b3ZlX3VzZWxlc3NfcmVzdWx0X3J0ZXMgbm93CnByZWNvbXB1dGVzIHRoZSBzZXQgb2YgYmFzZSAo bm9uLWpvaW4pIFJUIGluZGV4ZXMgb25jZSBhbmQgdGhyZWFkcyBpdAp0aHJvdWdoIHRoZSByZWN1 cnNpb24gYW5kIGludG8gYm90aCBoZWxwZXIgZnVuY3Rpb25zLCB3aGljaCBpbnRlcnNlY3QgaXQK d2l0aCBlYWNoIGNhbmRpZGF0ZSBQSFYncyBwaHJlbHMgYmVmb3JlIHRlc3RpbmcgZXF1YWxpdHku CgpBdXRob3I6IE1hdGhldXMgQWxjYW50YXJhIDxtdGhzLmRldkBwbS5tZT4KUmVwb3J0ZWQtYnk6 IGxlaXNAaW4udHVtLmRlIDxsZWlzQGluLnR1bS5kZT4KRGlzY3Vzc2lvbjogaHR0cHM6Ly93d3cu cG9zdGdyZXNxbC5vcmcvbWVzc2FnZS1pZC8xOTU1My00NTYxNzQ3ZjkzZjM2OGE3QHBvc3RncmVz cWwub3JnCi0tLQogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3ByZXAvcHJlcGpvaW50cmVlLmMgfCA4 MiArKysrKysrKysrKysrKysrKystLS0tLQogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2lu Lm91dCAgICAgICAgfCAyOCArKysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwg ICAgICAgICAgICAgfCAxMiArKysrCiAzIGZpbGVzIGNoYW5nZWQsIDEwNiBpbnNlcnRpb25zKCsp LCAxNiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcHJl cC9wcmVwam9pbnRyZWUuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wcmVwL3ByZXBqb2ludHJl ZS5jCmluZGV4IGNhNWNhOGJmZTIyLi5lOTA5ODMyMjE4MiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3ByZXAvcHJlcGpvaW50cmVlLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3ByZXAvcHJlcGpvaW50cmVlLmMKQEAgLTE2NywxMiArMTY3LDE1IEBAIHN0YXRpYyBib29s IGhhc19ub3RudWxsX2ZvcmNlZF92YXIoUGxhbm5lckluZm8gKnJvb3QsIExpc3QgKmZvcmNlZF9u dWxsX3ZhcnMsCiAJCQkJCQkJCSAgIHJlZHVjZV9vdXRlcl9qb2luc19wYXNzMV9zdGF0ZSAqcmln aHRfc3RhdGUpOwogc3RhdGljIE5vZGUgKnJlbW92ZV91c2VsZXNzX3Jlc3VsdHNfcmVjdXJzZShQ bGFubmVySW5mbyAqcm9vdCwgTm9kZSAqanRub2RlLAogCQkJCQkJCQkJCQlOb2RlICoqcGFyZW50 X3F1YWxzLAotCQkJCQkJCQkJCQlSZWxpZHMgKmRyb3BwZWRfb3V0ZXJfam9pbnMpOworCQkJCQkJ CQkJCQlSZWxpZHMgKmRyb3BwZWRfb3V0ZXJfam9pbnMsCisJCQkJCQkJCQkJCVJlbGlkcyBiYXNl cmVscyk7CiBzdGF0aWMgaW50CWdldF9yZXN1bHRfcmVsaWQoUGxhbm5lckluZm8gKnJvb3QsIE5v ZGUgKmp0bm9kZSk7CiBzdGF0aWMgdm9pZCByZW1vdmVfcmVzdWx0X3JlZnMoUGxhbm5lckluZm8g KnJvb3QsIGludCB2YXJubywgTm9kZSAqbmV3anRsb2MpOwotc3RhdGljIGJvb2wgZmluZF9kZXBl bmRlbnRfcGh2cyhQbGFubmVySW5mbyAqcm9vdCwgaW50IHZhcm5vKTsKK3N0YXRpYyBib29sIGZp bmRfZGVwZW5kZW50X3BodnMoUGxhbm5lckluZm8gKnJvb3QsIGludCB2YXJubywKKwkJCQkJCQkJ UmVsaWRzIGJhc2VyZWxzKTsKIHN0YXRpYyBib29sIGZpbmRfZGVwZW5kZW50X3BodnNfaW5fam9p bnRyZWUoUGxhbm5lckluZm8gKnJvb3QsCi0JCQkJCQkJCQkJCU5vZGUgKm5vZGUsIGludCB2YXJu byk7CisJCQkJCQkJCQkJCU5vZGUgKm5vZGUsIGludCB2YXJubywKKwkJCQkJCQkJCQkJUmVsaWRz IGJhc2VyZWxzKTsKIHN0YXRpYyB2b2lkIHN1YnN0aXR1dGVfcGh2X3JlbGlkcyhOb2RlICpub2Rl LAogCQkJCQkJCQkgIGludCB2YXJubywgUmVsaWRzIHN1YnJlbGlkcyk7CiBzdGF0aWMgdm9pZCBm aXhfYXBwZW5kX3JlbF9yZWxpZHMoUGxhbm5lckluZm8gKnJvb3QsIGludCB2YXJubywKQEAgLTM4 ODcsOCArMzg5MCwyNCBAQCB2b2lkCiByZW1vdmVfdXNlbGVzc19yZXN1bHRfcnRlcyhQbGFubmVy SW5mbyAqcm9vdCkKIHsKIAlSZWxpZHMJCWRyb3BwZWRfb3V0ZXJfam9pbnMgPSBOVUxMOworCVJl bGlkcwkJYmFzZXJlbHMgPSBOVUxMOworCWludAkJCWk7CiAJTGlzdENlbGwgICAqY2VsbDsKIAor CS8qCisJICogUHJlY29tcHV0ZSB0aGUgc2V0IG9mIGJhc2UgKGkuZS4sIG5vbi1qb2luKSBSVCBp bmRleGVzIGluIHRoZSBxdWVyeSdzCisJICogcmFuZ2V0YWJsZS4gIFdlJ2xsIG5lZWQgdGhpcyBi ZWxvdyB0byBmaWx0ZXIgb3V0IE9KIHJlbGlkcyB3aGVuCisJICogY2hlY2tpbmcgd2hldGhlciBh IFBsYWNlSG9sZGVyVmFyJ3MgcGhyZWxzIGluZGljYXRlcyBhIGdlbnVpbmUKKwkgKiBkZXBlbmRl bmN5IG9uIHNvbWUgb3RoZXIgcmVsYXRpb24sIHNpbmNlIHBocmVscyBjYW4gY29udGFpbiBPSiBy ZWxpZHMKKwkgKiBhcyB3ZWxsIGFzIGJhc2UgcmVsaWRzLCBhbmQgdGhlIHByZXNlbmNlIG9mIGFu IE9KIHJlbGlkIHRoZXJlIGRvZXNuJ3QKKwkgKiBtZWFuIHRoZSBQSFYgbXVzdCBiZSBldmFsdWF0 ZWQgYXQgc29tZSBvdGhlciBwbGFjZS4KKwkgKi8KKwlmb3IgKGkgPSAxOyBpIDw9IGxpc3RfbGVu Z3RoKHJvb3QtPnBhcnNlLT5ydGFibGUpOyBpKyspCisJeworCQlpZiAocnRfZmV0Y2goaSwgcm9v dC0+cGFyc2UtPnJ0YWJsZSktPnJ0ZWtpbmQgIT0gUlRFX0pPSU4pCisJCQliYXNlcmVscyA9IGJt c19hZGRfbWVtYmVyKGJhc2VyZWxzLCBpKTsKKwl9CisKIAkvKiBUb3AgbGV2ZWwgb2Ygam9pbnRy ZWUgbXVzdCBhbHdheXMgYmUgYSBGcm9tRXhwciAqLwogCUFzc2VydChJc0Eocm9vdC0+cGFyc2Ut PmpvaW50cmVlLCBGcm9tRXhwcikpOwogCS8qIFJlY3Vyc2UgLi4uICovCkBAIC0zODk2LDcgKzM5 MTUsOCBAQCByZW1vdmVfdXNlbGVzc19yZXN1bHRfcnRlcyhQbGFubmVySW5mbyAqcm9vdCkKIAkJ cmVtb3ZlX3VzZWxlc3NfcmVzdWx0c19yZWN1cnNlKHJvb3QsCiAJCQkJCQkJCQkgICAoTm9kZSAq KSByb290LT5wYXJzZS0+am9pbnRyZWUsCiAJCQkJCQkJCQkgICBOVUxMLAotCQkJCQkJCQkJICAg JmRyb3BwZWRfb3V0ZXJfam9pbnMpOworCQkJCQkJCQkJICAgJmRyb3BwZWRfb3V0ZXJfam9pbnMs CisJCQkJCQkJCQkgICBiYXNlcmVscyk7CiAJLyogV2Ugc2hvdWxkIHN0aWxsIGhhdmUgYSBGcm9t RXhwciAqLwogCUFzc2VydChJc0Eocm9vdC0+cGFyc2UtPmpvaW50cmVlLCBGcm9tRXhwcikpOwog CkBAIC0zOTU1LDExICszOTc1LDE0IEBAIHJlbW92ZV91c2VsZXNzX3Jlc3VsdF9ydGVzKFBsYW5u ZXJJbmZvICpyb290KQogICogdGhlIHBhcmVudCdzIHF1YWxzIGxpc3Q7IG90aGVyd2lzZSwgcGFz cyBOVUxMIGZvciBwYXJlbnRfcXVhbHMuCiAgKiAoTm90ZSB0aGF0IGluIHNvbWUgY2FzZXMsIHBh cmVudF9xdWFscyBwb2ludHMgdG8gdGhlIHF1YWxzIG9mIGEgcGFyZW50CiAgKiBtb3JlIHRoYW4g b25lIGxldmVsIHVwIGluIHRoZSB0cmVlLikKKyAqCisgKiBiYXNlcmVscyBpcyB0aGUgc2V0IG9m IGJhc2UgKG5vbi1qb2luKSBSVCBpbmRleGVzIGluIHRoZSB3aG9sZSBxdWVyeS4KICAqLwogc3Rh dGljIE5vZGUgKgogcmVtb3ZlX3VzZWxlc3NfcmVzdWx0c19yZWN1cnNlKFBsYW5uZXJJbmZvICpy b290LCBOb2RlICpqdG5vZGUsCiAJCQkJCQkJICAgTm9kZSAqKnBhcmVudF9xdWFscywKLQkJCQkJ CQkgICBSZWxpZHMgKmRyb3BwZWRfb3V0ZXJfam9pbnMpCisJCQkJCQkJICAgUmVsaWRzICpkcm9w cGVkX291dGVyX2pvaW5zLAorCQkJCQkJCSAgIFJlbGlkcyBiYXNlcmVscykKIHsKIAlBc3NlcnQo anRub2RlICE9IE5VTEwpOwogCWlmIChJc0EoanRub2RlLCBSYW5nZVRibFJlZikpCkBAIC0zOTg5 LDcgKzQwMTIsOCBAQCByZW1vdmVfdXNlbGVzc19yZXN1bHRzX3JlY3Vyc2UoUGxhbm5lckluZm8g KnJvb3QsIE5vZGUgKmp0bm9kZSwKIAkJCS8qIFJlY3Vyc2l2ZWx5IHRyYW5zZm9ybSBjaGlsZCwg YWxsb3dpbmcgaXQgdG8gcHVzaCB1cCBxdWFscyAuLi4gKi8KIAkJCWNoaWxkID0gcmVtb3ZlX3Vz ZWxlc3NfcmVzdWx0c19yZWN1cnNlKHJvb3QsIGNoaWxkLAogCQkJCQkJCQkJCQkJICAgJmYtPnF1 YWxzLAotCQkJCQkJCQkJCQkJICAgZHJvcHBlZF9vdXRlcl9qb2lucyk7CisJCQkJCQkJCQkJCQkg ICBkcm9wcGVkX291dGVyX2pvaW5zLAorCQkJCQkJCQkJCQkJICAgYmFzZXJlbHMpOwogCQkJLyog Li4uIGFuZCBzdGljayBpdCBiYWNrIGludG8gdGhlIHRyZWUgKi8KIAkJCWxmaXJzdChjZWxsKSA9 IGNoaWxkOwogCkBAIC00MDAxLDcgKzQwMjUsOCBAQCByZW1vdmVfdXNlbGVzc19yZXN1bHRzX3Jl Y3Vyc2UoUGxhbm5lckluZm8gKnJvb3QsIE5vZGUgKmp0bm9kZSwKIAkJCSAqLwogCQkJaWYgKGxp c3RfbGVuZ3RoKGYtPmZyb21saXN0KSA+IDEgJiYKIAkJCQkodmFybm8gPSBnZXRfcmVzdWx0X3Jl bGlkKHJvb3QsIGNoaWxkKSkgIT0gMCAmJgotCQkJCSFmaW5kX2RlcGVuZGVudF9waHZzX2luX2pv aW50cmVlKHJvb3QsIChOb2RlICopIGYsIHZhcm5vKSkKKwkJCQkhZmluZF9kZXBlbmRlbnRfcGh2 c19pbl9qb2ludHJlZShyb290LCAoTm9kZSAqKSBmLCB2YXJubywKKwkJCQkJCQkJCQkJCSBiYXNl cmVscykpCiAJCQl7CiAJCQkJZi0+ZnJvbWxpc3QgPSBmb3JlYWNoX2RlbGV0ZV9jdXJyZW50KGYt PmZyb21saXN0LCBjZWxsKTsKIAkJCQlyZXN1bHRfcmVsaWRzID0gYm1zX2FkZF9tZW1iZXIocmVz dWx0X3JlbGlkcywgdmFybm8pOwpAQCAtNDA3NCwxMiArNDA5OSwxNCBAQCByZW1vdmVfdXNlbGVz c19yZXN1bHRzX3JlY3Vyc2UoUGxhbm5lckluZm8gKnJvb3QsIE5vZGUgKmp0bm9kZSwKIAkJCQkJ CQkJCQkJCSAmai0+cXVhbHMgOgogCQkJCQkJCQkJCQkJIChqLT5qb2ludHlwZSA9PSBKT0lOX0xF RlQpID8KIAkJCQkJCQkJCQkJCSBwYXJlbnRfcXVhbHMgOiBOVUxMLAotCQkJCQkJCQkJCQkJIGRy b3BwZWRfb3V0ZXJfam9pbnMpOworCQkJCQkJCQkJCQkJIGRyb3BwZWRfb3V0ZXJfam9pbnMsCisJ CQkJCQkJCQkJCQkgYmFzZXJlbHMpOwogCQlqLT5yYXJnID0gcmVtb3ZlX3VzZWxlc3NfcmVzdWx0 c19yZWN1cnNlKHJvb3QsIGotPnJhcmcsCiAJCQkJCQkJCQkJCQkgKGotPmpvaW50eXBlID09IEpP SU5fSU5ORVIgfHwKIAkJCQkJCQkJCQkJCSAgai0+am9pbnR5cGUgPT0gSk9JTl9MRUZUKSA/CiAJ CQkJCQkJCQkJCQkgJmotPnF1YWxzIDogTlVMTCwKLQkJCQkJCQkJCQkJCSBkcm9wcGVkX291dGVy X2pvaW5zKTsKKwkJCQkJCQkJCQkJCSBkcm9wcGVkX291dGVyX2pvaW5zLAorCQkJCQkJCQkJCQkJ IGJhc2VyZWxzKTsKIAogCQkvKiBBcHBseSBqb2luLXR5cGUtc3BlY2lmaWMgb3B0aW1pemF0aW9u IHJ1bGVzICovCiAJCXN3aXRjaCAoai0+am9pbnR5cGUpCkBAIC00MTAzLDcgKzQxMzAsOCBAQCBy ZW1vdmVfdXNlbGVzc19yZXN1bHRzX3JlY3Vyc2UoUGxhbm5lckluZm8gKnJvb3QsIE5vZGUgKmp0 bm9kZSwKIAkJCQkgKiBhbGxvd2VkIHRvIGhhdmUgc3VjaCByZWZzLgogCQkJCSAqLwogCQkJCWlm ICgodmFybm8gPSBnZXRfcmVzdWx0X3JlbGlkKHJvb3QsIGotPmxhcmcpKSAhPSAwICYmCi0JCQkJ CSFmaW5kX2RlcGVuZGVudF9waHZzX2luX2pvaW50cmVlKHJvb3QsIGotPnJhcmcsIHZhcm5vKSkK KwkJCQkJIWZpbmRfZGVwZW5kZW50X3BodnNfaW5fam9pbnRyZWUocm9vdCwgai0+cmFyZywgdmFy bm8sCisJCQkJCQkJCQkJCQkJIGJhc2VyZWxzKSkKIAkJCQl7CiAJCQkJCXJlbW92ZV9yZXN1bHRf cmVmcyhyb290LCB2YXJubywgai0+cmFyZyk7CiAJCQkJCWlmIChqLT5xdWFscyAhPSBOVUxMICYm IHBhcmVudF9xdWFscyA9PSBOVUxMKQpAQCAtNDE1OCw3ICs0MTg2LDcgQEAgcmVtb3ZlX3VzZWxl c3NfcmVzdWx0c19yZWN1cnNlKFBsYW5uZXJJbmZvICpyb290LCBOb2RlICpqdG5vZGUsCiAJCQkJ ICovCiAJCQkJaWYgKCh2YXJubyA9IGdldF9yZXN1bHRfcmVsaWQocm9vdCwgai0+cmFyZykpICE9 IDAgJiYKIAkJCQkJKGotPnF1YWxzID09IE5VTEwgfHwKLQkJCQkJICFmaW5kX2RlcGVuZGVudF9w aHZzKHJvb3QsIHZhcm5vKSkpCisJCQkJCSAhZmluZF9kZXBlbmRlbnRfcGh2cyhyb290LCB2YXJu bywgYmFzZXJlbHMpKSkKIAkJCQl7CiAJCQkJCXJlbW92ZV9yZXN1bHRfcmVmcyhyb290LCB2YXJu bywgai0+bGFyZyk7CiAJCQkJCSpkcm9wcGVkX291dGVyX2pvaW5zID0gYm1zX2FkZF9tZW1iZXIo KmRyb3BwZWRfb3V0ZXJfam9pbnMsCkBAIC00MjgzLDYgKzQzMTEsMTcgQEAgcmVtb3ZlX3Jlc3Vs dF9yZWZzKFBsYW5uZXJJbmZvICpyb290LCBpbnQgdmFybm8sIE5vZGUgKm5ld2p0bG9jKQogICog ZmluZF9kZXBlbmRlbnRfcGh2cyAtIGFyZSB0aGVyZSBhbnkgUGxhY2VIb2xkZXJWYXJzIHdob3Nl IHJlbGlkcyBhcmUKICAqIGV4YWN0bHkgdGhlIGdpdmVuIHZhcm5vPwogICoKKyAqICJyZWxpZHMi IG1lYW5zIHRoZSBQSFYncyBwaHJlbHMgd2l0aCBhbnkgb3V0ZXItam9pbiByZWxpZHMgbWFza2Vk CisgKiBvZmYgYnkgaW50ZXJzZWN0aW5nIHdpdGggdGhlIGNhbGxlci1zdXBwbGllZCAiYmFzZXJl bHMiLiAgcGhyZWxzIGNhbgorICogY29udGFpbiBPSiByZWxpZHMgYXMgd2VsbCBhcyBiYXNlIHJl bGlkcyAoaXQncyB0aGUgc2V0IG9mIGJhc2UrT0ogcmVsaWRzCisgKiBzeW50YWN0aWNhbGx5IHdp dGhpbiB0aGUgUEhWJ3MgZXhwcmVzc2lvbiksIGJ1dCB0aGUgcHJlc2VuY2Ugb2YgYW4gT0oKKyAq IHJlbGlkIHRoZXJlIGRvZXNuJ3QgY3JlYXRlIGFueSBhZGRpdGlvbmFsIHBsYWNlIHdoZXJlIHRo ZSBQSFYgbXVzdCBiZQorICogZXZhbHVhdGVkOyBpdCdzIG9ubHkgYmFzZSByZWxpZHMgdGhhdCBw aW4gZG93biB0aGUgZXZhbHVhdGlvbiBsb2NhdGlvbi4KKyAqIElmIHdlIGNvbXBhcmVkIHBocmVs cyBhcy1pcywgd2UgY291bGQgd3JvbmdseSBjb25jbHVkZSB0aGF0IGEgUEhWIGlzbid0CisgKiBk ZXBlbmRlbnQgb24gYSBSVEVfUkVTVUxUIHJlbCB3ZSdyZSBhYm91dCB0byByZW1vdmUsIGp1c3Qg YmVjYXVzZSB0aGUKKyAqIFBIVidzIHBocmVscyBhbHNvIGhhcHBlbnMgdG8gaW5jbHVkZSBzb21l IE9KIHRoYXQgc2l0cyBiZXR3ZWVuIHRoZSBQSFYKKyAqIGFuZCB0aGUgUlRFX1JFU1VMVCBzeW50 YWN0aWNhbGx5LgorICoKICAqIGZpbmRfZGVwZW5kZW50X3BodnMgc2hvdWxkIGJlIHVzZWQgd2hl biB3ZSB3YW50IHRvIHNlZSBpZiB0aGVyZSBhcmUKICAqIGFueSBzdWNoIFBIVnMgYW55d2hlcmUg aW4gdGhlIFF1ZXJ5LiAgQW5vdGhlciB1c2UtY2FzZSBpcyB0byBzZWUgaWYKICAqIGEgc3VidHJl ZSBvZiB0aGUgam9pbiB0cmVlIGNvbnRhaW5zIHN1Y2ggUEhWczsgYnV0IGZvciB0aGF0LCB3ZSBo YXZlCkBAIC00MjkzLDYgKzQzMzIsNyBAQCByZW1vdmVfcmVzdWx0X3JlZnMoUGxhbm5lckluZm8g KnJvb3QsIGludCB2YXJubywgTm9kZSAqbmV3anRsb2MpCiB0eXBlZGVmIHN0cnVjdAogewogCVJl bGlkcwkJcmVsaWRzOworCVJlbGlkcwkJYmFzZXJlbHM7CQkvKiBzZXQgb2YgYmFzZSAobm9uLU9K KSBSVCBpbmRleGVzIGluIHF1ZXJ5ICovCiAJaW50CQkJc3VibGV2ZWxzX3VwOwogfSBmaW5kX2Rl cGVuZGVudF9waHZzX2NvbnRleHQ7CiAKQEAgLTQzMDYsOSArNDM0NiwxNiBAQCBmaW5kX2RlcGVu ZGVudF9waHZzX3dhbGtlcihOb2RlICpub2RlLAogCXsKIAkJUGxhY2VIb2xkZXJWYXIgKnBodiA9 IChQbGFjZUhvbGRlclZhciAqKSBub2RlOwogCi0JCWlmIChwaHYtPnBobGV2ZWxzdXAgPT0gY29u dGV4dC0+c3VibGV2ZWxzX3VwICYmCi0JCQlibXNfZXF1YWwoY29udGV4dC0+cmVsaWRzLCBwaHYt PnBocmVscykpCi0JCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKHBodi0+cGhsZXZlbHN1cCA9PSBjb250 ZXh0LT5zdWJsZXZlbHNfdXApCisJCXsKKwkJCVJlbGlkcwkJcGhiYXNlcmVscyA9IGJtc19pbnRl cnNlY3QocGh2LT5waHJlbHMsCisJCQkJCQkJCQkJCQkgICBjb250ZXh0LT5iYXNlcmVscyk7CisJ CQlib29sCQltYXRjaCA9IGJtc19lcXVhbChjb250ZXh0LT5yZWxpZHMsIHBoYmFzZXJlbHMpOwor CisJCQlibXNfZnJlZShwaGJhc2VyZWxzKTsKKwkJCWlmIChtYXRjaCkKKwkJCQlyZXR1cm4gdHJ1 ZTsKKwkJfQogCQkvKiBmYWxsIHRocm91Z2ggdG8gZXhhbWluZSBjaGlsZHJlbiAqLwogCX0KIAlp ZiAoSXNBKG5vZGUsIFF1ZXJ5KSkKQEAgLTQzMzIsNyArNDM3OSw3IEBAIGZpbmRfZGVwZW5kZW50 X3BodnNfd2Fsa2VyKE5vZGUgKm5vZGUsCiB9CiAKIHN0YXRpYyBib29sCi1maW5kX2RlcGVuZGVu dF9waHZzKFBsYW5uZXJJbmZvICpyb290LCBpbnQgdmFybm8pCitmaW5kX2RlcGVuZGVudF9waHZz KFBsYW5uZXJJbmZvICpyb290LCBpbnQgdmFybm8sIFJlbGlkcyBiYXNlcmVscykKIHsKIAlmaW5k X2RlcGVuZGVudF9waHZzX2NvbnRleHQgY29udGV4dDsKIApAQCAtNDM0MSw2ICs0Mzg4LDcgQEAg ZmluZF9kZXBlbmRlbnRfcGh2cyhQbGFubmVySW5mbyAqcm9vdCwgaW50IHZhcm5vKQogCQlyZXR1 cm4gZmFsc2U7CiAKIAljb250ZXh0LnJlbGlkcyA9IGJtc19tYWtlX3NpbmdsZXRvbih2YXJubyk7 CisJY29udGV4dC5iYXNlcmVscyA9IGJhc2VyZWxzOwogCWNvbnRleHQuc3VibGV2ZWxzX3VwID0g MDsKIAogCWlmIChxdWVyeV90cmVlX3dhbGtlcihyb290LT5wYXJzZSwgZmluZF9kZXBlbmRlbnRf cGh2c193YWxrZXIsICZjb250ZXh0LCAwKSkKQEAgLTQzNTQsNyArNDQwMiw4IEBAIGZpbmRfZGVw ZW5kZW50X3BodnMoUGxhbm5lckluZm8gKnJvb3QsIGludCB2YXJubykKIH0KIAogc3RhdGljIGJv b2wKLWZpbmRfZGVwZW5kZW50X3BodnNfaW5fam9pbnRyZWUoUGxhbm5lckluZm8gKnJvb3QsIE5v ZGUgKm5vZGUsIGludCB2YXJubykKK2ZpbmRfZGVwZW5kZW50X3BodnNfaW5fam9pbnRyZWUoUGxh bm5lckluZm8gKnJvb3QsIE5vZGUgKm5vZGUsIGludCB2YXJubywKKwkJCQkJCQkJUmVsaWRzIGJh c2VyZWxzKQogewogCWZpbmRfZGVwZW5kZW50X3BodnNfY29udGV4dCBjb250ZXh0OwogCVJlbGlk cwkJc3VicmVsaWRzOwpAQCAtNDM2NSw2ICs0NDE0LDcgQEAgZmluZF9kZXBlbmRlbnRfcGh2c19p bl9qb2ludHJlZShQbGFubmVySW5mbyAqcm9vdCwgTm9kZSAqbm9kZSwgaW50IHZhcm5vKQogCQly ZXR1cm4gZmFsc2U7CiAKIAljb250ZXh0LnJlbGlkcyA9IGJtc19tYWtlX3NpbmdsZXRvbih2YXJu byk7CisJY29udGV4dC5iYXNlcmVscyA9IGJhc2VyZWxzOwogCWNvbnRleHQuc3VibGV2ZWxzX3Vw ID0gMDsKIAogCS8qCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4u b3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dAppbmRleCA4M2JkNTY0OWQ1 Yy4uNjVmYzNjODIwYmMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9p bi5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dApAQCAtMjYzMCw2 ICsyNjMwLDM0IEBAIHNlbGVjdCAqIGZyb20gaW50NF90YmwgdDEKICAgICAgICAgIC0+ICBTZXEg U2NhbiBvbiB0ZW5rMSB0NAogKDE0IHJvd3MpCiAKKy0tIGNoZWNrIGEgY2FzZSB3aGVyZSB3ZSBm b3JtZXJseSBmYWlsZWQgdG8gZGV0ZWN0IHRoYXQgYSBQbGFjZUhvbGRlclZhcgorLS0gY29udGFp bmluZyBhIGNvbnN0YW50IHNob3VsZCBzdGlsbCBiZSBudWxsZWQgYnkgYW4gb3V0ZXIgam9pbiBh Ym92ZSB0aGUKKy0tIG9uZSB0aGF0IHdhcyByZW1vdmVkIGJ5IHJlbW92ZV91c2VsZXNzX3Jlc3Vs dF9ydGVzCitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tICh2YWx1 ZXMgKDEpLCgyKSkgdih4KQorICBsZWZ0IGpvaW4gKHNlbGVjdCBxIGZyb20gKHNlbGVjdCA3IGFz IHEgZnJvbSAoc2VsZWN0IHdoZXJlIGZhbHNlKSBzczEpIHNzMgorICAgICAgICAgICAgIGxlZnQg am9pbiAoc2VsZWN0IDggYXMgeikgc3MzIG9uIHRydWUpIHNzNCBvbiB0cnVlOworICAgICAgICAg ICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIE91dHB1dDogIipWQUxVRVMqIi5j b2x1bW4xLCAoNykKKyAgIEpvaW4gRmlsdGVyOiBmYWxzZQorICAgLT4gIFZhbHVlcyBTY2FuIG9u ICIqVkFMVUVTKiIKKyAgICAgICAgIE91dHB1dDogIipWQUxVRVMqIi5jb2x1bW4xCisgICAtPiAg UmVzdWx0CisgICAgICAgICBPdXRwdXQ6IDcKKyAgICAgICAgIE9uZS1UaW1lIEZpbHRlcjogZmFs c2UKKyg4IHJvd3MpCisKK3NlbGVjdCAqIGZyb20gKHZhbHVlcyAoMSksKDIpKSB2KHgpCisgIGxl ZnQgam9pbiAoc2VsZWN0IHEgZnJvbSAoc2VsZWN0IDcgYXMgcSBmcm9tIChzZWxlY3Qgd2hlcmUg ZmFsc2UpIHNzMSkgc3MyCisgICAgICAgICAgICAgbGVmdCBqb2luIChzZWxlY3QgOCBhcyB6KSBz czMgb24gdHJ1ZSkgc3M0IG9uIHRydWU7CisgeCB8IHEgCistLS0rLS0tCisgMSB8ICAKKyAyIHwg IAorKDIgcm93cykKKwogZXhwbGFpbiAoY29zdHMgb2ZmKQogc2VsZWN0ICogZnJvbSBvbmVrIHQx CiAgICAgbGVmdCBqb2luIG9uZWsgdDIgb24gdDEudW5pcXVlMSA9IHQyLnVuaXF1ZTEKZGlmZiAt LWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9z cWwvam9pbi5zcWwKaW5kZXggMzJkNGE1YTY3N2UuLmFmMTI1NDJiNGZmIDEwMDY0NAotLS0gYS9z cmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9q b2luLnNxbApAQCAtNTMxLDYgKzUzMSwxOCBAQCBzZWxlY3QgKiBmcm9tIGludDRfdGJsIHQxCiAg ICAgICAgICAgICAgbGVmdCBqb2luIHRlbmsxIHQ0IG9uIHMuZjEgPiAxKQogICAgIG9uIHMuZjEg PSB0MS5mMTsKIAorLS0gY2hlY2sgYSBjYXNlIHdoZXJlIHdlIGZvcm1lcmx5IGZhaWxlZCB0byBk ZXRlY3QgdGhhdCBhIFBsYWNlSG9sZGVyVmFyCistLSBjb250YWluaW5nIGEgY29uc3RhbnQgc2hv dWxkIHN0aWxsIGJlIG51bGxlZCBieSBhbiBvdXRlciBqb2luIGFib3ZlIHRoZQorLS0gb25lIHRo YXQgd2FzIHJlbW92ZWQgYnkgcmVtb3ZlX3VzZWxlc3NfcmVzdWx0X3J0ZXMKK2V4cGxhaW4gKHZl cmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gKHZhbHVlcyAoMSksKDIpKSB2KHgpCisg IGxlZnQgam9pbiAoc2VsZWN0IHEgZnJvbSAoc2VsZWN0IDcgYXMgcSBmcm9tIChzZWxlY3Qgd2hl cmUgZmFsc2UpIHNzMSkgc3MyCisgICAgICAgICAgICAgbGVmdCBqb2luIChzZWxlY3QgOCBhcyB6 KSBzczMgb24gdHJ1ZSkgc3M0IG9uIHRydWU7CisKK3NlbGVjdCAqIGZyb20gKHZhbHVlcyAoMSks KDIpKSB2KHgpCisgIGxlZnQgam9pbiAoc2VsZWN0IHEgZnJvbSAoc2VsZWN0IDcgYXMgcSBmcm9t IChzZWxlY3Qgd2hlcmUgZmFsc2UpIHNzMSkgc3MyCisgICAgICAgICAgICAgbGVmdCBqb2luIChz ZWxlY3QgOCBhcyB6KSBzczMgb24gdHJ1ZSkgc3M0IG9uIHRydWU7CisKIGV4cGxhaW4gKGNvc3Rz IG9mZikKIHNlbGVjdCAqIGZyb20gb25layB0MQogICAgIGxlZnQgam9pbiBvbmVrIHQyIG9uIHQx LnVuaXF1ZTEgPSB0Mi51bmlxdWUxCi0tIAoyLjUwLjEgKEFwcGxlIEdpdC0xNTUpCgo= --bd92ef4be5b0067a5492ff80fcb41f95e3776a2454384b6164e8c830780d--