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 1w8H0n-000N8T-0R for pgsql-hackers@arkaria.postgresql.org; Thu, 02 Apr 2026 12:19:01 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w8H0k-005cRN-13 for pgsql-hackers@arkaria.postgresql.org; Thu, 02 Apr 2026 12:18:58 +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 1w8H0j-005cRF-2e for pgsql-hackers@lists.postgresql.org; Thu, 02 Apr 2026 12:18:58 +0000 Received: from mail-vs1-xe30.google.com ([2607:f8b0:4864:20::e30]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w8H0h-00000000B8w-46f4 for pgsql-hackers@postgresql.org; Thu, 02 Apr 2026 12:18:57 +0000 Received: by mail-vs1-xe30.google.com with SMTP id ada2fe7eead31-605048a9c94so190085137.0 for ; Thu, 02 Apr 2026 05:18:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775132335; x=1775737135; darn=postgresql.org; h=in-reply-to:references:to:from:subject:cc:message-id:date :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=HG2ujX2nNRO3QPXVZdJbMVl4TWmIjnxEOX5oJGKaiBA=; b=SpXs07TogAcmyLIBuz14fXoNXebnZseY/wrija+vYIhJhXk9RJyrCynCQVMTx9bpkp jk+BdU5nA5Ul+KLHsBREs97qUGB1oGCmbojjuWu/pQRjaLPBfGbg3/O4F2fNDcgX2v1K UdivQxlZGBQiZJm+Q3tOYOZXMu+mnyLXNXqCHL2E0Gw/yPKQuJFsgmf2t5rTExOoMWwz aRVqNPMU1AXz5c7wEidWIFjafiGtRyvRe71Vgpns/4tY2D/SU8gQMRC+mcfQMXMmKr8b Psbos0sR/o0vNSGo41uzeX1riUkhULPO7GCkcMXAhtOzODdwQx8WBgHLx9Bw7XjsvfuJ tApw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775132335; x=1775737135; h=in-reply-to:references:to:from:subject:cc:message-id:date :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=HG2ujX2nNRO3QPXVZdJbMVl4TWmIjnxEOX5oJGKaiBA=; b=aVBAzIntUg7Uvw/Ff2Voh06bwawEFAm/uTR/yrF9aoKvv3t0Fm6XMZZN5EymurB0p6 YWNh9o7bNFjCsRZB4wHpMxpCKTf3T1Ifw1dQiRrMJrQXyxqsAp5YrdPZYbEorOpQ1fiU xkFqGrY9h4/4WqpkzvgV0CA3WRcDwk1gpl9uo1FRvZUsBz4BxoswWq0YXUS24fqLySx4 +mEFJRjS0Jggz7N8icq8s/rSnOInnYk7V8EVVvhVLYvGfXNk1/ugwils9AQhARJTdfgK QPzf5LO7qaC0EVWfPlxOTkcfYXb3VPjap7IAYkh2C2RbYdvlzTSg65rcaCBf+ovhmmma 8hOw== X-Forwarded-Encrypted: i=1; AJvYcCUr4DzPZ/6itmwHOYe2L5QGEU16COFoMwvcprqtjiSFydXSdiiUdLMIg5nOa5fuPBTOD1r7PXYvze582dhp@postgresql.org X-Gm-Message-State: AOJu0YwAoo8V+t77tIvn7A2H0teor9NdRrt1VzjSOL6H/RFkiYJai6Sy Gg8zRq5esbmKnTpK2uFZ5EOhqAqthGZU5btZ8KzG4kDeNAaR6CgkUokc X-Gm-Gg: ATEYQzyVinoP0vIEHStd3Kl5O0W/dr+evXtQijzBAmH4qPS3fo/rqdwRFHm0hERYoYC N0u2ghyOOb3uTuSp8AfQOiH38+dcms5/PvcVrhwkzV4UDmaEDWWBHO3CVkvVo7gFpHvX4NT8l+a 1dhdm1R/Dz4ag47xjHP5Yq6gWkck1SUnDvGduZZjioLq64iFTA0LcGqzvky7FKsUgzQbwrCJxua PfRtPXucT3qdeqBXqisUU7s/9GiAnt2Yv4gBKkgzhPTHS4W5nPbGGKAW4/GinDgyJr1EwXBxWnJ 9w1WAD1Oh839PFxXT8OalOAVvvVdzAKQCrPJADTDef4cc1RcYNC5rvUdUpSWprLri894Nqw7Ib0 8ZFvG6t1NuRS1behK4btRs9B4GLfLpJz5QwIuJeW5p5nmoHiV9XdIwxXx2kFiEqcFP6qk9wFK+C 5zm8j8nuoPax8TfXU+PpqJOIy2KZxSss6qJZOlxfnRCSYFjQ== X-Received: by 2002:a05:6102:5109:b0:601:f386:9ed2 with SMTP id ada2fe7eead31-60567d78694mr2748327137.7.1775132335176; Thu, 02 Apr 2026 05:18:55 -0700 (PDT) Received: from localhost ([2804:14d:328a:a59c:28e6:9d10:6558:21fc]) by smtp.gmail.com with ESMTPSA id ada2fe7eead31-60583098fa7sm3277483137.10.2026.04.02.05.18.51 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 02 Apr 2026 05:18:54 -0700 (PDT) Content-Type: multipart/mixed; boundary=2d678c593720d915b3e777dd8a459804699066aa98dbabb9b5b2cc9450da Mime-Version: 1.0 Date: Thu, 02 Apr 2026 09:18:50 -0300 Message-Id: Cc: "Robert Haas" , "Tom Lane" , "Tender Wang" , "Paul George" , "Andy Fan" , "PostgreSQL-development" , Subject: Re: Eager aggregation, take 3 From: "Matheus Alcantara" To: "Richard Guo" , "David Rowley" X-Mailer: aerc 0.21.0 References: <87il22cj51.fsf@163.com> In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --2d678c593720d915b3e777dd8a459804699066aa98dbabb9b5b2cc9450da Content-Type: multipart/alternative; boundary=248ae5cd5e16c81dde8cf15cee530b4f6c1d647b705c4a0acf2de1fbf4ae --248ae5cd5e16c81dde8cf15cee530b4f6c1d647b705c4a0acf2de1fbf4ae Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Content-Type: text/plain; charset=UTF-8 On Mon Mar 30, 2026 at 12:17 AM -03, Richard Guo wrote: > On Thu, Oct 9, 2025 at 5:07=E2=80=AFPM Richard Guo wrote: >> I noticed an unnecessary header include in initsplan.c. Will fix that >> as well. > > I noticed a couple of issues that can lead to unexpected results. > I've attached two patches to fix them. > > 1. Eager aggregation was incorrectly checking the data type's default > collation rather than the expression's actual collation. This allowed > columns with non-deterministic collations to be pushed down, resulting > in incorrect grouping. Fixed by 0001. > > 2. Pushing aggregates containing volatile functions below a join > alters their execution count. Fixed by 0002. > > (As briefly discussed on Discord, this non-deterministic collation > issue also exists in our long-existing logic for pushing HAVING down > to WHERE. But let's fix it for the eager aggregation first.) > Hi Richard, The patches looks good to me and are working as expected. It seems very straightforward, so I don't have any major comments. I'm attaching some new tests that I've added to collate.icu.utf8 and eager_aggregate regression tests during my review, fell free to include any of them if it could be helpful or none. -- Matheus Alcantara EDB: https://www.enterprisedb.com --248ae5cd5e16c81dde8cf15cee530b4f6c1d647b705c4a0acf2de1fbf4ae-- --2d678c593720d915b3e777dd8a459804699066aa98dbabb9b5b2cc9450da Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=more-tests.diff.nocfbot Content-Type: text/plain; charset=utf-8; name=more-tests.diff.nocfbot ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY29sbGF0ZS5pY3UudXRmOC5v dXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NvbGxhdGUuaWN1LnV0Zjgub3V0CmluZGV4 IGZiY2RiN2ViNThjLi5hMmRkOGEzNGRhNCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9jb2xsYXRlLmljdS51dGY4Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL2NvbGxhdGUuaWN1LnV0Zjgub3V0CkBAIC0yNzI2LDYgKzI3MjYsOTUgQEAgR1JPVVAgQlkg dDEuaWQ7CiAKIERST1AgVEFCTEUgZWFnZXJfYWdnX3QxOwogRFJPUCBUQUJMRSBlYWdlcl9hZ2df dDI7CistLQorLS0gVGVzdCBmb3IgZWFnZXIgYWdncmVnYXRpb24gd2l0aCBtdWx0aXBsZSBjb2x1 bW5zIGhhdmluZyBkaWZmZXJlbnQgY29sbGF0aW9ucworLS0KK0NSRUFURSBUQUJMRSBlYWdlcl9h Z2dfdDMgKAorICAgIGlkIGludCwKKyAgICB2YWwxIHRleHQgQ09MTEFURSBjYXNlX2luc2Vuc2l0 aXZlLAorICAgIHZhbDIgdGV4dCBDT0xMQVRFICJDIgorKTsKK0NSRUFURSBUQUJMRSBlYWdlcl9h Z2dfdDQgKAorICAgIHZhbDEgdGV4dCBDT0xMQVRFIGNhc2VfaW5zZW5zaXRpdmUsCisgICAgdmFs MiB0ZXh0IENPTExBVEUgIkMiCispOworSU5TRVJUIElOVE8gZWFnZXJfYWdnX3QzIFNFTEVDVCAx LCAnYScsICd4JyBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCA1MCk7CitJTlNFUlQgSU5UTyBlYWdl cl9hZ2dfdDMgU0VMRUNUIDEsICdBJywgJ3gnIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDUwKTsK K0lOU0VSVCBJTlRPIGVhZ2VyX2FnZ190NCBWQUxVRVMgKCdBJywgJ3gnKTsKK0FOQUxZWkUgZWFn ZXJfYWdnX3QzOworQU5BTFlaRSBlYWdlcl9hZ2dfdDQ7CistLSBFbnN1cmUgdGhhdCBlYWdlciBh Z2dyZWdhdGlvbiBpcyBub3QgdXNlZCB3aGVuIGdyb3VwaW5nIGJ5IGEgY29sdW1uIHdpdGgKKy0t IG5vbi1kZXRlcm1pbmlzdGljIGNvbGxhdGlvbiwgZXZlbiB3aGVuIG90aGVyIGdyb3VwaW5nIGNv bHVtbnMgaGF2ZQorLS0gZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb25zLgorRVhQTEFJTiAoQ09TVFMg T0ZGKQorU0VMRUNUIHQxLmlkLCB0MS52YWwxLCBjb3VudCgqKQorICBGUk9NIGVhZ2VyX2FnZ190 MyB0MQorICBKT0lOIGVhZ2VyX2FnZ190NCB0MiBPTiB0MS52YWwxID0gdDIudmFsMSBDT0xMQVRF ICJDIiBBTkQgdDEudmFsMiA9IHQyLnZhbDIKK0dST1VQIEJZIHQxLmlkLCB0MS52YWwxOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBI YXNoQWdncmVnYXRlCisgICBHcm91cCBLZXk6IHQxLmlkLCB0MS52YWwxCisgICAtPiAgTmVzdGVk IExvb3AKKyAgICAgICAgIEpvaW4gRmlsdGVyOiAoKCh0MS52YWwxKTo6dGV4dCA9ICh0Mi52YWwx KTo6dGV4dCkgQU5EICh0MS52YWwyID0gdDIudmFsMikpCisgICAgICAgICAtPiAgU2VxIFNjYW4g b24gZWFnZXJfYWdnX3Q0IHQyCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gZWFnZXJfYWdnX3Qz IHQxCisoNiByb3dzKQorCistLSBWZXJpZnkgY29ycmVjdCByZXN1bHRzIChzaG91bGQgcmV0dXJu IDEgcm93IHdpdGggY291bnQgPSA1MCkKK1NFTEVDVCB0MS5pZCwgdDEudmFsMSwgY291bnQoKikK KyAgRlJPTSBlYWdlcl9hZ2dfdDMgdDEKKyAgSk9JTiBlYWdlcl9hZ2dfdDQgdDIgT04gdDEudmFs MSA9IHQyLnZhbDEgQ09MTEFURSAiQyIgQU5EIHQxLnZhbDIgPSB0Mi52YWwyCitHUk9VUCBCWSB0 MS5pZCwgdDEudmFsMTsKKyBpZCB8IHZhbDEgfCBjb3VudCAKKy0tLS0rLS0tLS0tKy0tLS0tLS0K KyAgMSB8IEEgICAgfCAgICA1MAorKDEgcm93KQorCitEUk9QIFRBQkxFIGVhZ2VyX2FnZ190MzsK K0RST1AgVEFCTEUgZWFnZXJfYWdnX3Q0OworLS0KKy0tIFRlc3QgZm9yIGVhZ2VyIGFnZ3JlZ2F0 aW9uIHdpdGggZXhwbGljaXQgQ09MTEFURSBvbiBncm91cGluZyBleHByZXNzaW9uCistLQorQ1JF QVRFIFRBQkxFIGVhZ2VyX2FnZ190NSAoaWQgaW50LCB2YWwgdGV4dCBDT0xMQVRFICJDIik7CitD UkVBVEUgVEFCTEUgZWFnZXJfYWdnX3Q2ICh2YWwgdGV4dCBDT0xMQVRFICJDIik7CitJTlNFUlQg SU5UTyBlYWdlcl9hZ2dfdDUgU0VMRUNUIDEsICdhJyBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCA1 MCk7CitJTlNFUlQgSU5UTyBlYWdlcl9hZ2dfdDUgU0VMRUNUIDEsICdBJyBGUk9NIGdlbmVyYXRl X3NlcmllcygxLCA1MCk7CitJTlNFUlQgSU5UTyBlYWdlcl9hZ2dfdDYgVkFMVUVTICgnQScpOwor QU5BTFlaRSBlYWdlcl9hZ2dfdDU7CitBTkFMWVpFIGVhZ2VyX2FnZ190NjsKKy0tIFdoZW4gZ3Jv dXBpbmcgYnkgYW4gZXhwcmVzc2lvbiB3aXRoIGV4cGxpY2l0IG5vbi1kZXRlcm1pbmlzdGljIENP TExBVEUsCistLSBlYWdlciBhZ2dyZWdhdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgZXZlbiBpZiB0 aGUgY29sdW1uJ3MgbmF0aXZlIGNvbGxhdGlvbgorLS0gaXMgZGV0ZXJtaW5pc3RpYy4KK0VYUExB SU4gKENPU1RTIE9GRikKK1NFTEVDVCB0MS5pZCwgdDEudmFsIENPTExBVEUgY2FzZV9pbnNlbnNp dGl2ZSwgY291bnQoKikKKyAgRlJPTSBlYWdlcl9hZ2dfdDUgdDEKKyAgSk9JTiBlYWdlcl9hZ2df dDYgdDIgT04gdDEudmFsID0gdDIudmFsCitHUk9VUCBCWSB0MS5pZCwgdDEudmFsIENPTExBVEUg Y2FzZV9pbnNlbnNpdGl2ZTsKKyAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIEhhc2hBZ2dyZWdhdGUKKyAgIEdyb3VwIEtleTogdDEuaWQsICh0MS52YWwpOjp0ZXh0Cisg ICAtPiAgSGFzaCBKb2luCisgICAgICAgICBIYXNoIENvbmQ6ICh0MS52YWwgPSB0Mi52YWwpCisg ICAgICAgICAtPiAgU2VxIFNjYW4gb24gZWFnZXJfYWdnX3Q1IHQxCisgICAgICAgICAtPiAgSGFz aAorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGVhZ2VyX2FnZ190NiB0MgorKDcgcm93 cykKKworLS0gVmVyaWZ5IGNvcnJlY3QgcmVzdWx0cyAoc2hvdWxkIHJldHVybiAxIHJvdyB3aXRo IGNvdW50ID0gMTAwLCBzaW5jZSAnYScgYW5kCistLSAnQScgYXJlIGVxdWFsIHVuZGVyIGNhc2Vf aW5zZW5zaXRpdmUgY29sbGF0aW9uKQorU0VMRUNUIHQxLmlkLCB0MS52YWwgQ09MTEFURSBjYXNl X2luc2Vuc2l0aXZlLCBjb3VudCgqKQorICBGUk9NIGVhZ2VyX2FnZ190NSB0MQorICBKT0lOIGVh Z2VyX2FnZ190NiB0MiBPTiB0MS52YWwgPSB0Mi52YWwKK0dST1VQIEJZIHQxLmlkLCB0MS52YWwg Q09MTEFURSBjYXNlX2luc2Vuc2l0aXZlOworIGlkIHwgdmFsIHwgY291bnQgCistLS0tKy0tLS0t Ky0tLS0tLS0KKyAgMSB8IEEgICB8ICAgIDUwCisoMSByb3cpCisKK0RST1AgVEFCTEUgZWFnZXJf YWdnX3Q1OworRFJPUCBUQUJMRSBlYWdlcl9hZ2dfdDY7CiAtLSB2aXJ0dWFsIGdlbmVyYXRlZCBj b2x1bW5zCiBDUkVBVEUgVEFCTEUgdDUgKAogICAgIGEgaW50LApkaWZmIC0tZ2l0IGEvc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9lYWdlcl9hZ2dyZWdhdGUub3V0IGIvc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9lYWdlcl9hZ2dyZWdhdGUub3V0CmluZGV4IGQxYjg2YmUzYTYyLi4yYmY5ODNk MTJjYiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9lYWdlcl9hZ2dyZWdh dGUub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZWFnZXJfYWdncmVnYXRlLm91 dApAQCAtNDQ4LDYgKzQ0OCwyNiBAQCBHUk9VUCBCWSB0MS5hIE9SREVSIEJZIHQxLmE7CiAgICAg ICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gZWFnZXJfYWdnX3QxIHQxCiAoOSByb3dz KQogCistLSBFbnN1cmUgZWFnZXIgYWdncmVnYXRpb24gaXMgbm90IGFwcGxpZWQgd2hlbiBGSUxU RVIgY2xhdXNlIGNvbnRhaW5zCistLSB2b2xhdGlsZSBmdW5jdGlvbgorRVhQTEFJTiAoQ09TVFMg T0ZGKQorU0VMRUNUIHQxLmEsIGF2Zyh0Mi5jKSBGSUxURVIgKFdIRVJFIHJhbmRvbSgpID4gMC41 KQorICBGUk9NIGVhZ2VyX2FnZ190MSB0MQorICBKT0lOIGVhZ2VyX2FnZ190MiB0MiBPTiB0MS5i ID0gdDIuYgorR1JPVVAgQlkgdDEuYSBPUkRFUiBCWSB0MS5hOworICAgICAgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgR3JvdXBBZ2dyZWdhdGUKKyAgIEdy b3VwIEtleTogdDEuYQorICAgLT4gIFNvcnQKKyAgICAgICAgIFNvcnQgS2V5OiB0MS5hCisgICAg ICAgICAtPiAgSGFzaCBKb2luCisgICAgICAgICAgICAgICBIYXNoIENvbmQ6ICh0Mi5iID0gdDEu YikKKyAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBlYWdlcl9hZ2dfdDIgdDIKKyAgICAg ICAgICAgICAgIC0+ICBIYXNoCisgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24g ZWFnZXJfYWdnX3QxIHQxCisoOSByb3dzKQorCiBEUk9QIFRBQkxFIGVhZ2VyX2FnZ190MTsKIERS T1AgVEFCTEUgZWFnZXJfYWdnX3QyOwogRFJPUCBUQUJMRSBlYWdlcl9hZ2dfdDM7CmRpZmYgLS1n aXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jb2xsYXRlLmljdS51dGY4LnNxbCBiL3NyYy90ZXN0 L3JlZ3Jlc3Mvc3FsL2NvbGxhdGUuaWN1LnV0Zjguc3FsCmluZGV4IDBlNmI3NmIxMWI4Li45M2My MmIzNzcyNyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY29sbGF0ZS5pY3UudXRm OC5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY29sbGF0ZS5pY3UudXRmOC5zcWwKQEAg LTEwMjEsNiArMTAyMSw3NiBAQCBHUk9VUCBCWSB0MS5pZDsKIERST1AgVEFCTEUgZWFnZXJfYWdn X3QxOwogRFJPUCBUQUJMRSBlYWdlcl9hZ2dfdDI7CiAKKy0tCistLSBUZXN0IGZvciBlYWdlciBh Z2dyZWdhdGlvbiB3aXRoIG11bHRpcGxlIGNvbHVtbnMgaGF2aW5nIGRpZmZlcmVudCBjb2xsYXRp b25zCistLQorQ1JFQVRFIFRBQkxFIGVhZ2VyX2FnZ190MyAoCisgICAgaWQgaW50LAorICAgIHZh bDEgdGV4dCBDT0xMQVRFIGNhc2VfaW5zZW5zaXRpdmUsCisgICAgdmFsMiB0ZXh0IENPTExBVEUg IkMiCispOworQ1JFQVRFIFRBQkxFIGVhZ2VyX2FnZ190NCAoCisgICAgdmFsMSB0ZXh0IENPTExB VEUgY2FzZV9pbnNlbnNpdGl2ZSwKKyAgICB2YWwyIHRleHQgQ09MTEFURSAiQyIKKyk7CisKK0lO U0VSVCBJTlRPIGVhZ2VyX2FnZ190MyBTRUxFQ1QgMSwgJ2EnLCAneCcgRlJPTSBnZW5lcmF0ZV9z ZXJpZXMoMSwgNTApOworSU5TRVJUIElOVE8gZWFnZXJfYWdnX3QzIFNFTEVDVCAxLCAnQScsICd4 JyBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCA1MCk7CitJTlNFUlQgSU5UTyBlYWdlcl9hZ2dfdDQg VkFMVUVTICgnQScsICd4Jyk7CisKK0FOQUxZWkUgZWFnZXJfYWdnX3QzOworQU5BTFlaRSBlYWdl cl9hZ2dfdDQ7CisKKy0tIEVuc3VyZSB0aGF0IGVhZ2VyIGFnZ3JlZ2F0aW9uIGlzIG5vdCB1c2Vk IHdoZW4gZ3JvdXBpbmcgYnkgYSBjb2x1bW4gd2l0aAorLS0gbm9uLWRldGVybWluaXN0aWMgY29s bGF0aW9uLCBldmVuIHdoZW4gb3RoZXIgZ3JvdXBpbmcgY29sdW1ucyBoYXZlCistLSBkZXRlcm1p bmlzdGljIGNvbGxhdGlvbnMuCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgdDEuaWQsIHQx LnZhbDEsIGNvdW50KCopCisgIEZST00gZWFnZXJfYWdnX3QzIHQxCisgIEpPSU4gZWFnZXJfYWdn X3Q0IHQyIE9OIHQxLnZhbDEgPSB0Mi52YWwxIENPTExBVEUgIkMiIEFORCB0MS52YWwyID0gdDIu dmFsMgorR1JPVVAgQlkgdDEuaWQsIHQxLnZhbDE7CisKKy0tIFZlcmlmeSBjb3JyZWN0IHJlc3Vs dHMgKHNob3VsZCByZXR1cm4gMSByb3cgd2l0aCBjb3VudCA9IDUwKQorU0VMRUNUIHQxLmlkLCB0 MS52YWwxLCBjb3VudCgqKQorICBGUk9NIGVhZ2VyX2FnZ190MyB0MQorICBKT0lOIGVhZ2VyX2Fn Z190NCB0MiBPTiB0MS52YWwxID0gdDIudmFsMSBDT0xMQVRFICJDIiBBTkQgdDEudmFsMiA9IHQy LnZhbDIKK0dST1VQIEJZIHQxLmlkLCB0MS52YWwxOworCitEUk9QIFRBQkxFIGVhZ2VyX2FnZ190 MzsKK0RST1AgVEFCTEUgZWFnZXJfYWdnX3Q0OworCistLQorLS0gVGVzdCBmb3IgZWFnZXIgYWdn cmVnYXRpb24gd2l0aCBleHBsaWNpdCBDT0xMQVRFIG9uIGdyb3VwaW5nIGV4cHJlc3Npb24KKy0t CitDUkVBVEUgVEFCTEUgZWFnZXJfYWdnX3Q1IChpZCBpbnQsIHZhbCB0ZXh0IENPTExBVEUgIkMi KTsKK0NSRUFURSBUQUJMRSBlYWdlcl9hZ2dfdDYgKHZhbCB0ZXh0IENPTExBVEUgIkMiKTsKKwor SU5TRVJUIElOVE8gZWFnZXJfYWdnX3Q1IFNFTEVDVCAxLCAnYScgRlJPTSBnZW5lcmF0ZV9zZXJp ZXMoMSwgNTApOworSU5TRVJUIElOVE8gZWFnZXJfYWdnX3Q1IFNFTEVDVCAxLCAnQScgRlJPTSBn ZW5lcmF0ZV9zZXJpZXMoMSwgNTApOworSU5TRVJUIElOVE8gZWFnZXJfYWdnX3Q2IFZBTFVFUyAo J0EnKTsKKworQU5BTFlaRSBlYWdlcl9hZ2dfdDU7CitBTkFMWVpFIGVhZ2VyX2FnZ190NjsKKwor LS0gV2hlbiBncm91cGluZyBieSBhbiBleHByZXNzaW9uIHdpdGggZXhwbGljaXQgbm9uLWRldGVy bWluaXN0aWMgQ09MTEFURSwKKy0tIGVhZ2VyIGFnZ3JlZ2F0aW9uIHNob3VsZCBub3QgYmUgdXNl ZCBldmVuIGlmIHRoZSBjb2x1bW4ncyBuYXRpdmUgY29sbGF0aW9uCistLSBpcyBkZXRlcm1pbmlz dGljLgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIHQxLmlkLCB0MS52YWwgQ09MTEFURSBj YXNlX2luc2Vuc2l0aXZlLCBjb3VudCgqKQorICBGUk9NIGVhZ2VyX2FnZ190NSB0MQorICBKT0lO IGVhZ2VyX2FnZ190NiB0MiBPTiB0MS52YWwgPSB0Mi52YWwKK0dST1VQIEJZIHQxLmlkLCB0MS52 YWwgQ09MTEFURSBjYXNlX2luc2Vuc2l0aXZlOworCistLSBWZXJpZnkgY29ycmVjdCByZXN1bHRz IChzaG91bGQgcmV0dXJuIDEgcm93IHdpdGggY291bnQgPSAxMDAsIHNpbmNlICdhJyBhbmQKKy0t ICdBJyBhcmUgZXF1YWwgdW5kZXIgY2FzZV9pbnNlbnNpdGl2ZSBjb2xsYXRpb24pCitTRUxFQ1Qg dDEuaWQsIHQxLnZhbCBDT0xMQVRFIGNhc2VfaW5zZW5zaXRpdmUsIGNvdW50KCopCisgIEZST00g ZWFnZXJfYWdnX3Q1IHQxCisgIEpPSU4gZWFnZXJfYWdnX3Q2IHQyIE9OIHQxLnZhbCA9IHQyLnZh bAorR1JPVVAgQlkgdDEuaWQsIHQxLnZhbCBDT0xMQVRFIGNhc2VfaW5zZW5zaXRpdmU7CisKK0RS T1AgVEFCTEUgZWFnZXJfYWdnX3Q1OworRFJPUCBUQUJMRSBlYWdlcl9hZ2dfdDY7CisKIC0tIHZp cnR1YWwgZ2VuZXJhdGVkIGNvbHVtbnMKIENSRUFURSBUQUJMRSB0NSAoCiAgICAgYSBpbnQsCmRp ZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9lYWdlcl9hZ2dyZWdhdGUuc3FsIGIvc3Jj L3Rlc3QvcmVncmVzcy9zcWwvZWFnZXJfYWdncmVnYXRlLnNxbAppbmRleCA5N2UxMGRkN2NmNC4u OWM5MzVlZjA2MzMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2VhZ2VyX2FnZ3Jl Z2F0ZS5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZWFnZXJfYWdncmVnYXRlLnNxbApA QCAtMTcxLDYgKzE3MSwxNCBAQCBTRUxFQ1QgdDEuYSwgYXZnKHQyLmMgKyByYW5kb20oKSkKICAg Sk9JTiBlYWdlcl9hZ2dfdDIgdDIgT04gdDEuYiA9IHQyLmIKIEdST1VQIEJZIHQxLmEgT1JERVIg QlkgdDEuYTsKIAorLS0gRW5zdXJlIGVhZ2VyIGFnZ3JlZ2F0aW9uIGlzIG5vdCBhcHBsaWVkIHdo ZW4gRklMVEVSIGNsYXVzZSBjb250YWlucworLS0gdm9sYXRpbGUgZnVuY3Rpb24KK0VYUExBSU4g KENPU1RTIE9GRikKK1NFTEVDVCB0MS5hLCBhdmcodDIuYykgRklMVEVSIChXSEVSRSByYW5kb20o KSA+IDAuNSkKKyAgRlJPTSBlYWdlcl9hZ2dfdDEgdDEKKyAgSk9JTiBlYWdlcl9hZ2dfdDIgdDIg T04gdDEuYiA9IHQyLmIKK0dST1VQIEJZIHQxLmEgT1JERVIgQlkgdDEuYTsKKwogRFJPUCBUQUJM RSBlYWdlcl9hZ2dfdDE7CiBEUk9QIFRBQkxFIGVhZ2VyX2FnZ190MjsKIERST1AgVEFCTEUgZWFn ZXJfYWdnX3QzOwo= --2d678c593720d915b3e777dd8a459804699066aa98dbabb9b5b2cc9450da--