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 1oOKJP-0005UL-Ao for pgsql-hackers@arkaria.postgresql.org; Wed, 17 Aug 2022 14:46:27 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1oOKJN-0000Pf-GZ for pgsql-hackers@arkaria.postgresql.org; Wed, 17 Aug 2022 14:46:25 +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 1oOKJM-0000PE-6V for pgsql-hackers@lists.postgresql.org; Wed, 17 Aug 2022 14:46:25 +0000 Received: from mail-wm1-x32b.google.com ([2a00:1450:4864:20::32b]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1oOKJI-00067S-QK for pgsql-hackers@lists.postgresql.org; Wed, 17 Aug 2022 14:46:23 +0000 Received: by mail-wm1-x32b.google.com with SMTP id z14-20020a7bc7ce000000b003a5db0388a8so1835301wmk.1 for ; Wed, 17 Aug 2022 07:46:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; h=in-reply-to:from:references:cc:to:content-language:subject :user-agent:mime-version:date:message-id:from:to:cc; bh=XC0+y7EWxaI7Y2VXWS8laZDk2mkNhYh15bpe2UerLUw=; b=KZxle6RdOSH7h4r7UfdZwZs5S6TS59HXhcRqeYn7nU7CQphC2sQw/mmOeHPHeOLXOy GUPDUm8I5Szyf4mDs5LY7R06x5Ip78f6GQG4GGWVoPxvwysbjD7X1TvinpgtqVOkM8B3 O4vzPA4gK8ukHt5Bi63PAVAgemxj76dZQqovqhP/Nq69w9gSTyS1i6iNpBS5XG5xgqK5 PNSGmMZ24m1t97KnBXk3i4ss8MrIJi7bPl59fYewPEKnWVM6owtgWBvZ9xlcNXKsfAoG RpFoRZJ26oZ7qI5JMPZIlSycYFQCzlxddVrf6X75PGOVFjRL1F6sz/l/2cwGCaJG83QS P5jw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:from:references:cc:to:content-language:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc; bh=XC0+y7EWxaI7Y2VXWS8laZDk2mkNhYh15bpe2UerLUw=; b=A8rxTtCg/wmcWr0TJAxxIF0Xqip8niwEKbo0cMOfCh1eEKv3753o0ElKV6ks2/BRx4 BY/ej1mAQvFUB/6pQitZl/d38y8lbHzInEkLCIIEvY4LOuyE3l4kjSrCE5WVk4mijkPl IJHneoqn5s/leSd8dlrH1fJY9RRC0JXssOcXMpgb1B3uKEa4Hrxz6plW2XJXq9EZWO0l 5ptkUZTEmaE5X4NfbfpKg31k/3LEZdbHgKdHCyWnBnmySgCA4Gxen/T9F8OO0+Q2FbPe XNSgq67IY187+L5KoH2PInU8Xia78Ig7iEU9KEpXOHR4T99n6kxKPn5x3Pp6TTFHtB78 LeaA== X-Gm-Message-State: ACgBeo3GW9LaC1Ahq/IEm8OOtdl+Gmru/HcC+H2JE/Sn+NrUlnG0YaBn SRU57Ez+/47eWObXkSmM+48SihyMOc50UplT6grfo/Zm7B/63kkrVwxOvvMD2FJy4s8QT0oh9cb uqTiBbzQbUZcZjAQM/qy49sE5E0katuC5jmj1imutlPOre5LHv3H+zsJ5kK74lwib4bAnyAMfwn PinJ31Qj/ieCDbEc8HrPyWLEcBy1/4dZmxCm3fk8z93/Ji/o0Y4q8o X-Google-Smtp-Source: AA6agR5s6Ee6p1/3yMnYQ4K6ocrphbOegCgPPe9uZ7d0iB2SIIJ8YL5SSIZpsLZrWOEB1ND+RF3uBw== X-Received: by 2002:a05:600c:3512:b0:3a5:e9d3:d418 with SMTP id h18-20020a05600c351200b003a5e9d3d418mr2435617wmq.0.1660747578839; Wed, 17 Aug 2022 07:46:18 -0700 (PDT) Received: from [10.137.0.17] (static-84-42-175-93.bb.vodafone.cz. [84.42.175.93]) by smtp.gmail.com with ESMTPSA id p30-20020a1c545e000000b003a500b612fcsm2402939wmi.12.2022.08.17.07.46.17 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 17 Aug 2022 07:46:18 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------Jy3EO0I0mZ1X7IQWbXFw0U06" Message-ID: <683635b8-381b-5b08-6069-d6a45de19a12@enterprisedb.com> Date: Wed, 17 Aug 2022 16:46:16 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.0 Subject: Re: POC: GROUP BY optimization Content-Language: en-US To: David Rowley , Michael Paquier Cc: Zhihong Yu , "Andrey V. Lepikhov" , Teodor Sigaev , Tomas Vondra , PostgreSQL Developers References: <721b3ff9-f214-f5d4-86c7-bae515bbec18@enterprisedb.com> <7bea462e-8c3e-0f8c-c7d5-f4daa12f3baf@postgrespro.ru> <9af89543-3d17-4c98-59de-1daa5bceeb06@enterprisedb.com> <9408e450-60c6-6fbc-d5c4-467bb0abfe67@postgrespro.ru> <44472925-f6c6-e8de-6f72-0451458532c4@enterprisedb.com> <7a80a207-5e8e-b80c-476c-2d290b0526e9@enterprisedb.com> <65941e87-86c1-c09c-8ad5-8e102aebe8ee@enterprisedb.com> From: Tomas Vondra In-Reply-To: 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. --------------Jy3EO0I0mZ1X7IQWbXFw0U06 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit On 8/2/22 13:14, David Rowley wrote: > On Tue, 2 Aug 2022 at 22:21, Michael Paquier wrote: >> >> On Fri, Jul 15, 2022 at 09:46:51PM +0200, Tomas Vondra wrote: >>> I agree this is a mistake in db0d67db2 that makes the test useless. >> >> Tomas, please note that this is an open item assigned to you. Are you >> planning to do something with these regression tests by beta3? > > There's still something to do there for PG15, but 1349d2790 (just gone > in to master) made those two tests run as a parallel query again. > Hi, I've been looking at this, and as I speculated before it's due to the sort costing changing a little bit. On PG14, the costing of the plans looks like this: Gather (cost=1869.39..2823.15 rows=8 width=52) and with disabled parallelism, it's like this: Append (cost=998.04..3000.64 rows=10 width=52) so there's a (fairly small) diffrence in favor of the parallel plan. But on PG15 it's the other way around - the selected non-parallel one is costed like this: Append (cost=779.41..2490.61 rows=10 width=52) and by setting parallel_setup_cost=0 you get this: Gather (cost=700.34..1531.76 rows=8 width=52) So with the setup cost included it's ~2531, and it loses to the simple plan. This happens because the patch changed sort costing - the same sort on PG14 and PG15 looks like this: PG14: -> Sort (cost=998.04..1028.04 rows=12000 width=13) PG15: -> Sort (cost=779.41..809.41 rows=12000 width=13) As mentioned, the commit tweaked sort costing - before it was pretty much just comparison_cost * tuples * LOG2(tuples) but the patch needs to cost different pathkey orderings, and consider that maybe we don't need to compare all the keys (which the original costing kind assumes). That's the whole point of this optimization. The costing (compute_cpu_sort_cost) considers a couple other things, like cost of the comparator function for the data type, width of the values, groupings determined by preceding keys, and so on. It might seem strange that a query with a single pathkey changes, but that single pathkey is costed the same way, of course. In principle we might have a special costing for this case, but I'd bet that would result in pretty surprising inconsistencies when adding a sort key (going from 1 to 2 keys). So I don't think the current costing is wrong, but it certainly is more complex. But the test does not test what it intended - I have two ideas how to make it work: 1) increase the number of rows in the table 2) increase cpu_operator_cost (for that one test?) 3) tweak the costing somehow, to increase the cost a bit Both (1) and (2) work - I've tried doubling the number of rows or setting the operator cost to 0.005, and that does the trick, but maybe a smaller change would be enough. I don't like (3) very much - changing the costing just to get the same test behavior as on older release does not seem very principled. Yes, maybe it should be tweaked, but not because of a regression test. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company --------------Jy3EO0I0mZ1X7IQWbXFw0U06 Content-Type: text/x-log; charset=UTF-8; name="plans-14.log" Content-Disposition: attachment; filename="plans-14.log" Content-Transfer-Encoding: base64 LS0gV2l0aG91dCBPUkRFUiBCWSBjbGF1c2UsIHRvIHRlc3QgR2F0aGVyIGF0IHRvcC1tb3N0 IHBhdGgKRVhQTEFJTiAoQ09TVFMgT04pClNFTEVDVCBhLCBzdW0oYiksIGFycmF5X2FnZyhk aXN0aW5jdCBjKSwgY291bnQoKikgRlJPTSBwYWdnX3RhYl9tbCBHUk9VUCBCWSBhIEhBVklO RyBhdmcoYikgPCAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEdhdGhlciAgKGNvc3Q9MTg2OS4zOS4u MjgyMy4xNSByb3dzPTggd2lkdGg9NTIpCiAgIFdvcmtlcnMgUGxhbm5lZDogMgogICAtPiAg UGFyYWxsZWwgQXBwZW5kICAoY29zdD04NjkuMzkuLjE4MjIuMzUgcm93cz00IHdpZHRoPTUy KQogICAgICAgICAtPiAgR3JvdXBBZ2dyZWdhdGUgIChjb3N0PTk5OC4wNC4uMTE3OC4yNSBy b3dzPTQgd2lkdGg9NTIpCiAgICAgICAgICAgICAgIEdyb3VwIEtleTogcGFnZ190YWJfbWwu YQogICAgICAgICAgICAgICBGaWx0ZXI6IChhdmcocGFnZ190YWJfbWwuYikgPCAnMyc6Om51 bWVyaWMpCiAgICAgICAgICAgICAgIC0+ICBTb3J0ICAoY29zdD05OTguMDQuLjEwMjguMDQg cm93cz0xMjAwMCB3aWR0aD0xMykKICAgICAgICAgICAgICAgICAgICAgU29ydCBLZXk6IHBh Z2dfdGFiX21sLmEKICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHBhZ2df dGFiX21sX3AxIHBhZ2dfdGFiX21sICAoY29zdD0wLjAwLi4xODUuMDAgcm93cz0xMjAwMCB3 aWR0aD0xMykKICAgICAgICAgLT4gIEdyb3VwQWdncmVnYXRlICAoY29zdD04NjkuMzkuLjEw MTkuNTYgcm93cz0zIHdpZHRoPTUyKQogICAgICAgICAgICAgICBHcm91cCBLZXk6IHBhZ2df dGFiX21sXzUuYQogICAgICAgICAgICAgICBGaWx0ZXI6IChhdmcocGFnZ190YWJfbWxfNS5i KSA8ICczJzo6bnVtZXJpYykKICAgICAgICAgICAgICAgLT4gIFNvcnQgIChjb3N0PTg2OS4z OS4uODk0LjM5IHJvd3M9MTAwMDAgd2lkdGg9MTMpCiAgICAgICAgICAgICAgICAgICAgIFNv cnQgS2V5OiBwYWdnX3RhYl9tbF81LmEKICAgICAgICAgICAgICAgICAgICAgLT4gIEFwcGVu ZCAgKGNvc3Q9MC4wMC4uMjA1LjAwIHJvd3M9MTAwMDAgd2lkdGg9MTMpCiAgICAgICAgICAg ICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBwYWdnX3RhYl9tbF9wM19zMSBwYWdn X3RhYl9tbF81ICAoY29zdD0wLjAwLi4xMDguMDAgcm93cz03MDAwIHdpZHRoPTEzKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gcGFnZ190YWJfbWxfcDNf czIgcGFnZ190YWJfbWxfNiAgKGNvc3Q9MC4wMC4uNDcuMDAgcm93cz0zMDAwIHdpZHRoPTEz KQogICAgICAgICAtPiAgR3JvdXBBZ2dyZWdhdGUgIChjb3N0PTY4Mi42My4uODAyLjc3IHJv d3M9MyB3aWR0aD01MikKICAgICAgICAgICAgICAgR3JvdXAgS2V5OiBwYWdnX3RhYl9tbF8y LmEKICAgICAgICAgICAgICAgRmlsdGVyOiAoYXZnKHBhZ2dfdGFiX21sXzIuYikgPCAnMyc6 Om51bWVyaWMpCiAgICAgICAgICAgICAgIC0+ICBTb3J0ICAoY29zdD02ODIuNjMuLjcwMi42 MyByb3dzPTgwMDAgd2lkdGg9MTMpCiAgICAgICAgICAgICAgICAgICAgIFNvcnQgS2V5OiBw YWdnX3RhYl9tbF8yLmEKICAgICAgICAgICAgICAgICAgICAgLT4gIEFwcGVuZCAgKGNvc3Q9 MC4wMC4uMTY0LjAwIHJvd3M9ODAwMCB3aWR0aD0xMykKICAgICAgICAgICAgICAgICAgICAg ICAgICAgLT4gIFNlcSBTY2FuIG9uIHBhZ2dfdGFiX21sX3AyX3MxIHBhZ2dfdGFiX21sXzIg IChjb3N0PTAuMDAuLjkzLjAwIHJvd3M9NjAwMCB3aWR0aD0xMykKICAgICAgICAgICAgICAg ICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHBhZ2dfdGFiX21sX3AyX3MyIHBhZ2dfdGFi X21sXzMgIChjb3N0PTAuMDAuLjMxLjAwIHJvd3M9MjAwMCB3aWR0aD0xMykKKDI1IHJvd3Mp CgpTRVQgbWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDA7CkVYUExBSU4gKENP U1RTIE9OKQpTRUxFQ1QgYSwgc3VtKGIpLCBhcnJheV9hZ2coZGlzdGluY3QgYyksIGNvdW50 KCopIEZST00gcGFnZ190YWJfbWwgR1JPVVAgQlkgYSBIQVZJTkcgYXZnKGIpIDwgMzsKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBM QU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CiBBcHBlbmQgIChjb3N0PTk5OC4wNC4uMzAwMC42NCByb3dzPTEwIHdpZHRoPTUyKQogICAt PiAgR3JvdXBBZ2dyZWdhdGUgIChjb3N0PTk5OC4wNC4uMTE3OC4yNSByb3dzPTQgd2lkdGg9 NTIpCiAgICAgICAgIEdyb3VwIEtleTogcGFnZ190YWJfbWwuYQogICAgICAgICBGaWx0ZXI6 IChhdmcocGFnZ190YWJfbWwuYikgPCAnMyc6Om51bWVyaWMpCiAgICAgICAgIC0+ICBTb3J0 ICAoY29zdD05OTguMDQuLjEwMjguMDQgcm93cz0xMjAwMCB3aWR0aD0xMykKICAgICAgICAg ICAgICAgU29ydCBLZXk6IHBhZ2dfdGFiX21sLmEKICAgICAgICAgICAgICAgLT4gIFNlcSBT Y2FuIG9uIHBhZ2dfdGFiX21sX3AxIHBhZ2dfdGFiX21sICAoY29zdD0wLjAwLi4xODUuMDAg cm93cz0xMjAwMCB3aWR0aD0xMykKICAgLT4gIEdyb3VwQWdncmVnYXRlICAoY29zdD02ODIu NjMuLjgwMi43NyByb3dzPTMgd2lkdGg9NTIpCiAgICAgICAgIEdyb3VwIEtleTogcGFnZ190 YWJfbWxfMi5hCiAgICAgICAgIEZpbHRlcjogKGF2ZyhwYWdnX3RhYl9tbF8yLmIpIDwgJzMn OjpudW1lcmljKQogICAgICAgICAtPiAgU29ydCAgKGNvc3Q9NjgyLjYzLi43MDIuNjMgcm93 cz04MDAwIHdpZHRoPTEzKQogICAgICAgICAgICAgICBTb3J0IEtleTogcGFnZ190YWJfbWxf Mi5hCiAgICAgICAgICAgICAgIC0+ICBBcHBlbmQgIChjb3N0PTAuMDAuLjE2NC4wMCByb3dz PTgwMDAgd2lkdGg9MTMpCiAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBw YWdnX3RhYl9tbF9wMl9zMSBwYWdnX3RhYl9tbF8yICAoY29zdD0wLjAwLi45My4wMCByb3dz PTYwMDAgd2lkdGg9MTMpCiAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBw YWdnX3RhYl9tbF9wMl9zMiBwYWdnX3RhYl9tbF8zICAoY29zdD0wLjAwLi4zMS4wMCByb3dz PTIwMDAgd2lkdGg9MTMpCiAgIC0+ICBHcm91cEFnZ3JlZ2F0ZSAgKGNvc3Q9ODY5LjM5Li4x MDE5LjU2IHJvd3M9MyB3aWR0aD01MikKICAgICAgICAgR3JvdXAgS2V5OiBwYWdnX3RhYl9t bF81LmEKICAgICAgICAgRmlsdGVyOiAoYXZnKHBhZ2dfdGFiX21sXzUuYikgPCAnMyc6Om51 bWVyaWMpCiAgICAgICAgIC0+ICBTb3J0ICAoY29zdD04NjkuMzkuLjg5NC4zOSByb3dzPTEw MDAwIHdpZHRoPTEzKQogICAgICAgICAgICAgICBTb3J0IEtleTogcGFnZ190YWJfbWxfNS5h CiAgICAgICAgICAgICAgIC0+ICBBcHBlbmQgIChjb3N0PTAuMDAuLjIwNS4wMCByb3dzPTEw MDAwIHdpZHRoPTEzKQogICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gcGFn Z190YWJfbWxfcDNfczEgcGFnZ190YWJfbWxfNSAgKGNvc3Q9MC4wMC4uMTA4LjAwIHJvd3M9 NzAwMCB3aWR0aD0xMykKICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHBh Z2dfdGFiX21sX3AzX3MyIHBhZ2dfdGFiX21sXzYgIChjb3N0PTAuMDAuLjQ3LjAwIHJvd3M9 MzAwMCB3aWR0aD0xMykKKDIzIHJvd3MpCgpSRVNFVCBtYXhfcGFyYWxsZWxfd29ya2Vyc19w ZXJfZ2F0aGVyOwo= --------------Jy3EO0I0mZ1X7IQWbXFw0U06 Content-Type: text/x-log; charset=UTF-8; name="plans-15.log" Content-Disposition: attachment; filename="plans-15.log" Content-Transfer-Encoding: base64 LS0gV2l0aG91dCBPUkRFUiBCWSBjbGF1c2UsIHRvIHRlc3QgR2F0aGVyIGF0IHRvcC1tb3N0 IHBhdGgKRVhQTEFJTiAoQ09TVFMgT04pClNFTEVDVCBhLCBzdW0oYiksIGFycmF5X2FnZyhk aXN0aW5jdCBjKSwgY291bnQoKikgRlJPTSBwYWdnX3RhYl9tbCBHUk9VUCBCWSBhIEhBVklO RyBhdmcoYikgPCAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KIEFwcGVuZCAgKGNvc3Q9Nzc5LjQxLi4yNDkwLjYxIHJvd3M9 MTAgd2lkdGg9NTIpCiAgIC0+ICBHcm91cEFnZ3JlZ2F0ZSAgKGNvc3Q9Nzc5LjQxLi45NTku NjIgcm93cz00IHdpZHRoPTUyKQogICAgICAgICBHcm91cCBLZXk6IHBhZ2dfdGFiX21sLmEK ICAgICAgICAgRmlsdGVyOiAoYXZnKHBhZ2dfdGFiX21sLmIpIDwgJzMnOjpudW1lcmljKQog ICAgICAgICAtPiAgU29ydCAgKGNvc3Q9Nzc5LjQxLi44MDkuNDEgcm93cz0xMjAwMCB3aWR0 aD0xMykKICAgICAgICAgICAgICAgU29ydCBLZXk6IHBhZ2dfdGFiX21sLmEKICAgICAgICAg ICAgICAgLT4gIFNlcSBTY2FuIG9uIHBhZ2dfdGFiX21sX3AxIHBhZ2dfdGFiX21sICAoY29z dD0wLjAwLi4xODUuMDAgcm93cz0xMjAwMCB3aWR0aD0xMykKICAgLT4gIEdyb3VwQWdncmVn YXRlICAoY29zdD01NjAuMjguLjY4MC40MiByb3dzPTMgd2lkdGg9NTIpCiAgICAgICAgIEdy b3VwIEtleTogcGFnZ190YWJfbWxfMi5hCiAgICAgICAgIEZpbHRlcjogKGF2ZyhwYWdnX3Rh Yl9tbF8yLmIpIDwgJzMnOjpudW1lcmljKQogICAgICAgICAtPiAgU29ydCAgKGNvc3Q9NTYw LjI4Li41ODAuMjggcm93cz04MDAwIHdpZHRoPTEzKQogICAgICAgICAgICAgICBTb3J0IEtl eTogcGFnZ190YWJfbWxfMi5hCiAgICAgICAgICAgICAgIC0+ICBBcHBlbmQgIChjb3N0PTAu MDAuLjE2NC4wMCByb3dzPTgwMDAgd2lkdGg9MTMpCiAgICAgICAgICAgICAgICAgICAgIC0+ ICBTZXEgU2NhbiBvbiBwYWdnX3RhYl9tbF9wMl9zMSBwYWdnX3RhYl9tbF8yICAoY29zdD0w LjAwLi45My4wMCByb3dzPTYwMDAgd2lkdGg9MTMpCiAgICAgICAgICAgICAgICAgICAgIC0+ ICBTZXEgU2NhbiBvbiBwYWdnX3RhYl9tbF9wMl9zMiBwYWdnX3RhYl9tbF8zICAoY29zdD0w LjAwLi4zMS4wMCByb3dzPTIwMDAgd2lkdGg9MTMpCiAgIC0+ICBHcm91cEFnZ3JlZ2F0ZSAg KGNvc3Q9NzAwLjM0Li44NTAuNTIgcm93cz0zIHdpZHRoPTUyKQogICAgICAgICBHcm91cCBL ZXk6IHBhZ2dfdGFiX21sXzUuYQogICAgICAgICBGaWx0ZXI6IChhdmcocGFnZ190YWJfbWxf NS5iKSA8ICczJzo6bnVtZXJpYykKICAgICAgICAgLT4gIFNvcnQgIChjb3N0PTcwMC4zNC4u NzI1LjM0IHJvd3M9MTAwMDAgd2lkdGg9MTMpCiAgICAgICAgICAgICAgIFNvcnQgS2V5OiBw YWdnX3RhYl9tbF81LmEKICAgICAgICAgICAgICAgLT4gIEFwcGVuZCAgKGNvc3Q9MC4wMC4u MjA1LjAwIHJvd3M9MTAwMDAgd2lkdGg9MTMpCiAgICAgICAgICAgICAgICAgICAgIC0+ICBT ZXEgU2NhbiBvbiBwYWdnX3RhYl9tbF9wM19zMSBwYWdnX3RhYl9tbF81ICAoY29zdD0wLjAw Li4xMDguMDAgcm93cz03MDAwIHdpZHRoPTEzKQogICAgICAgICAgICAgICAgICAgICAtPiAg U2VxIFNjYW4gb24gcGFnZ190YWJfbWxfcDNfczIgcGFnZ190YWJfbWxfNiAgKGNvc3Q9MC4w MC4uNDcuMDAgcm93cz0zMDAwIHdpZHRoPTEzKQooMjMgcm93cykKClNFVCBwYXJhbGxlbF9z ZXR1cF9jb3N0ID0gMDsKRVhQTEFJTiAoQ09TVFMgT04pClNFTEVDVCBhLCBzdW0oYiksIGFy cmF5X2FnZyhkaXN0aW5jdCBjKSwgY291bnQoKikgRlJPTSBwYWdnX3RhYl9tbCBHUk9VUCBC WSBhIEhBVklORyBhdmcoYikgPCAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEdhdGhlciAgKGNvc3Q9 NzAwLjM0Li4xNTMxLjc2IHJvd3M9OCB3aWR0aD01MikKICAgV29ya2VycyBQbGFubmVkOiAy CiAgIC0+ICBQYXJhbGxlbCBBcHBlbmQgIChjb3N0PTcwMC4zNC4uMTUzMC45NiByb3dzPTQg d2lkdGg9NTIpCiAgICAgICAgIC0+ICBHcm91cEFnZ3JlZ2F0ZSAgKGNvc3Q9Nzc5LjQxLi45 NTkuNjIgcm93cz00IHdpZHRoPTUyKQogICAgICAgICAgICAgICBHcm91cCBLZXk6IHBhZ2df dGFiX21sLmEKICAgICAgICAgICAgICAgRmlsdGVyOiAoYXZnKHBhZ2dfdGFiX21sLmIpIDwg JzMnOjpudW1lcmljKQogICAgICAgICAgICAgICAtPiAgU29ydCAgKGNvc3Q9Nzc5LjQxLi44 MDkuNDEgcm93cz0xMjAwMCB3aWR0aD0xMykKICAgICAgICAgICAgICAgICAgICAgU29ydCBL ZXk6IHBhZ2dfdGFiX21sLmEKICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9u IHBhZ2dfdGFiX21sX3AxIHBhZ2dfdGFiX21sICAoY29zdD0wLjAwLi4xODUuMDAgcm93cz0x MjAwMCB3aWR0aD0xMykKICAgICAgICAgLT4gIEdyb3VwQWdncmVnYXRlICAoY29zdD03MDAu MzQuLjg1MC41MiByb3dzPTMgd2lkdGg9NTIpCiAgICAgICAgICAgICAgIEdyb3VwIEtleTog cGFnZ190YWJfbWxfNS5hCiAgICAgICAgICAgICAgIEZpbHRlcjogKGF2ZyhwYWdnX3RhYl9t bF81LmIpIDwgJzMnOjpudW1lcmljKQogICAgICAgICAgICAgICAtPiAgU29ydCAgKGNvc3Q9 NzAwLjM0Li43MjUuMzQgcm93cz0xMDAwMCB3aWR0aD0xMykKICAgICAgICAgICAgICAgICAg ICAgU29ydCBLZXk6IHBhZ2dfdGFiX21sXzUuYQogICAgICAgICAgICAgICAgICAgICAtPiAg QXBwZW5kICAoY29zdD0wLjAwLi4yMDUuMDAgcm93cz0xMDAwMCB3aWR0aD0xMykKICAgICAg ICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHBhZ2dfdGFiX21sX3AzX3Mx IHBhZ2dfdGFiX21sXzUgIChjb3N0PTAuMDAuLjEwOC4wMCByb3dzPTcwMDAgd2lkdGg9MTMp CiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBwYWdnX3RhYl9t bF9wM19zMiBwYWdnX3RhYl9tbF82ICAoY29zdD0wLjAwLi40Ny4wMCByb3dzPTMwMDAgd2lk dGg9MTMpCiAgICAgICAgIC0+ICBHcm91cEFnZ3JlZ2F0ZSAgKGNvc3Q9NTYwLjI4Li42ODAu NDIgcm93cz0zIHdpZHRoPTUyKQogICAgICAgICAgICAgICBHcm91cCBLZXk6IHBhZ2dfdGFi X21sXzIuYQogICAgICAgICAgICAgICBGaWx0ZXI6IChhdmcocGFnZ190YWJfbWxfMi5iKSA8 ICczJzo6bnVtZXJpYykKICAgICAgICAgICAgICAgLT4gIFNvcnQgIChjb3N0PTU2MC4yOC4u NTgwLjI4IHJvd3M9ODAwMCB3aWR0aD0xMykKICAgICAgICAgICAgICAgICAgICAgU29ydCBL ZXk6IHBhZ2dfdGFiX21sXzIuYQogICAgICAgICAgICAgICAgICAgICAtPiAgQXBwZW5kICAo Y29zdD0wLjAwLi4xNjQuMDAgcm93cz04MDAwIHdpZHRoPTEzKQogICAgICAgICAgICAgICAg ICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gcGFnZ190YWJfbWxfcDJfczEgcGFnZ190YWJf bWxfMiAgKGNvc3Q9MC4wMC4uOTMuMDAgcm93cz02MDAwIHdpZHRoPTEzKQogICAgICAgICAg ICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gcGFnZ190YWJfbWxfcDJfczIgcGFn Z190YWJfbWxfMyAgKGNvc3Q9MC4wMC4uMzEuMDAgcm93cz0yMDAwIHdpZHRoPTEzKQooMjUg cm93cykK --------------Jy3EO0I0mZ1X7IQWbXFw0U06--