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.94.2) (envelope-from ) id 1tV7PU-005dCA-Kt for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Jan 2025 11:06:09 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tV7PT-002Wsv-WC for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Jan 2025 11:06:07 +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.94.2) (envelope-from ) id 1tV7PT-002Wsn-Jd for pgsql-hackers@lists.postgresql.org; Tue, 07 Jan 2025 11:06:07 +0000 Received: from forward100d.mail.yandex.net ([178.154.239.211]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1tV7PK-000KeD-2u for pgsql-hackers@postgresql.org; Tue, 07 Jan 2025 11:06:06 +0000 Received: from mail-nwsmtp-smtp-production-main-73.iva.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-73.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:2ea9:0:640:6af4:0]) by forward100d.mail.yandex.net (Yandex) with ESMTPS id 64FCB6096C; Tue, 7 Jan 2025 14:05:57 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-73.iva.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id t5jHitDOea60-gL1RiT1H; Tue, 07 Jan 2025 14:05:56 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tantorlabs.com; s=mail; t=1736247956; bh=+m7RO9+JcM2bdKX9V6NXjU00H7k5lVhhqx0fEJ6+tS4=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=h5LzbzAWZy46M4MvyzL0gaSDA+fo+JnvVC2NbSuArgTFUvAXT64g2yezXRRRenBrS cKdjb1vR5HB87acqwhPufBZoPWKi/zadvbeSUKWWX4U7hIUWyGe0UQlIqwIQ78ZTy8 PLhYVz9fRzSB/7X9EyPz7G93KIh7ANxY7FnCeJ7c= Authentication-Results: mail-nwsmtp-smtp-production-main-73.iva.yp-c.yandex.net; dkim=pass header.i=@tantorlabs.com Content-Type: multipart/mixed; boundary="------------YAGqmFfGen0zOlliaBxfU0DT" Message-ID: <20994d10-ab44-4c6b-91bc-c4675cd2e58e@tantorlabs.com> Date: Tue, 7 Jan 2025 14:05:54 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Sample rate added to pg_stat_statements To: Sami Imseih , "Andrey M. Borodin" Cc: Alexander Korotkov , Michael Paquier , Greg Sabino Mullane , pgsql-hackers References: <6707FCA9-FD1A-4609-A1A6-142456C14E0C@yandex-team.ru> <320a31e6-4c91-438b-ab17-8a1d72384727@tantorlabs.com> <52e5e3aa-066a-4daf-8d65-77c34a2f0d98@tantorlabs.com> <6482A576-4465-4E46-A42C-F1767E8DDE30@yandex-team.ru> Content-Language: en-US From: Ilia Evdokimov In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------YAGqmFfGen0zOlliaBxfU0DT Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 06.01.2025 18:57, Andrey M. Borodin wrote: >> On 6 Jan 2025, at 15:50, Ilia Evdokimov wrote: >> >> Any suggestions for improvements? > The patch looks good to me, just a few nits. > > 0. Perhaps, we could have a test for edge values of 0 and 1. I do not insist, just an idea to think about. I would add tests, because they are never useless. I've added a simple test which verifies hash table with queries after setting sample_rate = 0.0 and sample_rate = 1.0. > > 1. This code seems a little different from your patch. It is trying to avoid engaging PRNG. I'm not sure it's a good idea, but still. Also, it uses "<=", not "<". > > xact_is_sampled = log_xact_sample_rate != 0 && > (log_xact_sample_rate == 1 || > pg_prng_double(&pg_global_prng_state) <= log_xact_sample_rate); > > Thanks! > > > Best regards, Andrey Borodin. > Are we sure we're discussing the same patch? Because these remarks refer to the 5 version of the patch, which I abandoned due to your remarks. On 06.01.2025 20:51, Sami Imseih wrote: > Hi, > > I was looking at this patch, and I was specifically curious about > how this works with prepared statements. The way the patch > works now is that it determines if the statement is to be sampled > at post_parse_analyze time which could lead to unexpected > behavior. > > Let's take an example below in which the > pg_stat_statements.sample_rate is set to 0 ( to mimic > some sampling rate < 1 in which this query does not > get sampled ). At that point, all subsequent executions > of the statement will not get tracked at all. Is this > what is expected for prepared statements? My concern > is we will even lose more stats than what a user > may expect. > > This of course will not be an issue for simple query. > > postgres=# set pg_stat_statements.sample_rate = 0; > SET > postgres=# select pg_stat_statements_reset(); > pg_stat_statements_reset > ------------------------------- > 2025-01-06 11:45:23.484793-06 > (1 row) > > postgres=# SELECT $1 \parse stmt > > postgres=# > postgres=# \bind_named stmt 1 \g > ?column? > ---------- > 1 > (1 row) > > postgres=# \bind_named stmt 1 \g > ?column? > ---------- > 1 > (1 row) > > postgres=# set pg_stat_statements.sample_rate = 1; > SET > postgres=# \bind_named stmt 1 \g > ?column? > ---------- > 1 > (1 row) > > postgres=# \bind_named stmt 1 \g > ?column? > ---------- > 1 > (1 row) > > postgres=# SELECT query, calls FROM pg_stat_statements; > query | calls > -------+------- > (0 rows) > > Regards, > > Sami Imseih > Amazon Web Services (AWS) > > You are right. This is absolutely unexpected for users. Thank you for the review. To fix this, I suggest storing a random number in the [0, 1) range in a separate variable, which will be used for comparisons in any place. We will compare 'sample_rate' and random value not only in pgss_post_parse_analyze(), but also in pgss_ProcessUtility() and pgss_planner(). I attached patch with test and fixes. If you have any objections or suggestions on how to improve it, I'm always open to feedback. -- Best regards, Ilia Evdokimov, Tantor Labs LLC. --------------YAGqmFfGen0zOlliaBxfU0DT Content-Type: text/x-patch; charset=UTF-8; name="v7-0001-Allow-setting-sample-ratio-for-pg_stat_statements.patch" Content-Disposition: attachment; filename*0="v7-0001-Allow-setting-sample-ratio-for-pg_stat_statements.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSAzODhjMTI2MzI2MTBjYzZhYmRkZDZmYzc1MGExYjE1NzEyZDYyZTYzIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBJbGlhIEV2ZG9raW1vdiA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5jb20+CkRhdGU6IFR1ZSwgNyBKYW4gMjAyNSAxNDowMjozMiArMDMwMApT dWJqZWN0OiBbUEFUQ0hdIEFsbG93IHNldHRpbmcgc2FtcGxlIHJhdGlvIGZvciBwZ19zdGF0 X3N0YXRlbWVudHMKCk5ldyBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBwZ19zdGF0X3N0YXRl bWVudHMuc2FtcGxlX3JhdGlvIG1ha2VzIGl0CnBvc3NpYmxlIHRvIHRyYWNrIGp1c3QgYSBm cmFjdGlvbiBvZiB0aGUgcXVlcmllcyBtZWV0aW5nIHRoZSBjb25maWd1cmVkCnRocmVzaG9s ZCwgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgdHJhY2tpbmcuCi0tLQogLi4uL3BnX3N0YXRf c3RhdGVtZW50cy9leHBlY3RlZC9zZWxlY3Qub3V0ICAgIHwgMzcgKysrKysrKysrKysrKysr KysrCiAuLi4vcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jICAgfCAz OCArKysrKysrKysrKysrKysrKystCiBjb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9zcWwv c2VsZWN0LnNxbCAgICAgfCAxMSArKysrKysKIGRvYy9zcmMvc2dtbC9wZ3N0YXRzdGF0ZW1l bnRzLnNnbWwgICAgICAgICAgICB8IDE4ICsrKysrKysrKwogNCBmaWxlcyBjaGFuZ2VkLCAx MDIgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jb250cmli L3BnX3N0YXRfc3RhdGVtZW50cy9leHBlY3RlZC9zZWxlY3Qub3V0IGIvY29udHJpYi9wZ19z dGF0X3N0YXRlbWVudHMvZXhwZWN0ZWQvc2VsZWN0Lm91dAppbmRleCAzN2EzMGFmMDM0Li43 MjRlYzljOGFjIDEwMDY0NAotLS0gYS9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9leHBl Y3RlZC9zZWxlY3Qub3V0CisrKyBiL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL2V4cGVj dGVkL3NlbGVjdC5vdXQKQEAgLTE1Myw2ICsxNTMsNDMgQEAgU0VMRUNUIHBnX3N0YXRfc3Rh dGVtZW50c19yZXNldCgpIElTIE5PVCBOVUxMIEFTIHQ7CiAgdAogKDEgcm93KQogCistLQor LS0gc2FtcGxlIHN0YXRlbWVudHMKKy0tCitTRVQgcGdfc3RhdF9zdGF0ZW1lbnRzLnNhbXBs ZV9yYXRlID0gMC4wOworU0VMRUNUIDEgQVMgImludCI7CisgaW50IAorLS0tLS0KKyAgIDEK KygxIHJvdykKKworU0VMRUNUIHF1ZXJ5LCBjYWxscyBGUk9NIHBnX3N0YXRfc3RhdGVtZW50 czsKKyAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgICAgICAgICAgICAgICAgICAgICAg ICB8IGNhbGxzIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tCisgU0VMRUNUIHBnX3N0YXRfc3RhdGVtZW50c19yZXNldCgp IElTIE5PVCBOVUxMIEFTIHQgfCAgICAgMQorKDEgcm93KQorCitTRVQgcGdfc3RhdF9zdGF0 ZW1lbnRzLnNhbXBsZV9yYXRlID0gMS4wOworU0VMRUNUIDEgQVMgImludCI7CisgaW50IAor LS0tLS0KKyAgIDEKKygxIHJvdykKKworU0VMRUNUIHF1ZXJ5LCBjYWxscyBGUk9NIHBnX3N0 YXRfc3RhdGVtZW50czsKKyAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgICAgICAgICAg ICAgICAgICAgICAgICB8IGNhbGxzIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tCisgU0VMRUNUICQxIEFTICJpbnQiICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgMQorIFNFTEVDVCBwZ19zdGF0 X3N0YXRlbWVudHNfcmVzZXQoKSBJUyBOT1QgTlVMTCBBUyB0IHwgICAgIDEKKyBTRUxFQ1Qg cXVlcnksIGNhbGxzIEZST00gcGdfc3RhdF9zdGF0ZW1lbnRzICAgICAgICB8ICAgICAwCiso MyByb3dzKQorCitTRUxFQ1QgcGdfc3RhdF9zdGF0ZW1lbnRzX3Jlc2V0KCkgSVMgTk9UIE5V TEwgQVMgdDsKKyB0IAorLS0tCisgdAorKDEgcm93KQorCiAtLQogLS0gcXVlcmllcyB3aXRo IGxvY2tpbmcgY2xhdXNlcwogLS0KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0 ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jIGIvY29udHJpYi9wZ19zdGF0X3N0YXRlbWVu dHMvcGdfc3RhdF9zdGF0ZW1lbnRzLmMKaW5kZXggYmViZjgxMzRlYi4uNGJhYjJhNzRlYSAx MDA2NDQKLS0tIGEvY29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1l bnRzLmMKKysrIGIvY29udHJpYi9wZ19zdGF0X3N0YXRlbWVudHMvcGdfc3RhdF9zdGF0ZW1l bnRzLmMKQEAgLTUwLDYgKzUwLDcgQEAKICNpbmNsdWRlICJhY2Nlc3MvcGFyYWxsZWwuaCIK ICNpbmNsdWRlICJjYXRhbG9nL3BnX2F1dGhpZC5oIgogI2luY2x1ZGUgImNvbW1vbi9pbnQu aCIKKyNpbmNsdWRlICJjb21tb24vcGdfcHJuZy5oIgogI2luY2x1ZGUgImV4ZWN1dG9yL2lu c3RydW1lbnQuaCIKICNpbmNsdWRlICJmdW5jYXBpLmgiCiAjaW5jbHVkZSAiaml0L2ppdC5o IgpAQCAtMjU1LDYgKzI1Niw3IEBAIHR5cGVkZWYgc3RydWN0IHBnc3NTaGFyZWRTdGF0ZQog CiAvKiBDdXJyZW50IG5lc3RpbmcgZGVwdGggb2YgcGxhbm5lci9FeGVjdXRvclJ1bi9Qcm9j ZXNzVXRpbGl0eSBjYWxscyAqLwogc3RhdGljIGludAluZXN0aW5nX2xldmVsID0gMDsKK3N0 YXRpYyBkb3VibGUJcmFuZG9tX3NhbXBsZSA9IDAuMDsKIAogLyogU2F2ZWQgaG9vayB2YWx1 ZXMgKi8KIHN0YXRpYyBzaG1lbV9yZXF1ZXN0X2hvb2tfdHlwZSBwcmV2X3NobWVtX3JlcXVl c3RfaG9vayA9IE5VTEw7CkBAIC0yOTQsMTIgKzI5NiwxNyBAQCBzdGF0aWMgYm9vbCBwZ3Nz X3RyYWNrX3V0aWxpdHkgPSB0cnVlOwkvKiB3aGV0aGVyIHRvIHRyYWNrIHV0aWxpdHkgY29t bWFuZHMgKi8KIHN0YXRpYyBib29sIHBnc3NfdHJhY2tfcGxhbm5pbmcgPSBmYWxzZTsJLyog d2hldGhlciB0byB0cmFjayBwbGFubmluZwogCQkJCQkJCQkJCQkgKiBkdXJhdGlvbiAqLwog c3RhdGljIGJvb2wgcGdzc19zYXZlID0gdHJ1ZTsJLyogd2hldGhlciB0byBzYXZlIHN0YXRz IGFjcm9zcyBzaHV0ZG93biAqLworc3RhdGljIGRvdWJsZSBwZ3NzX3NhbXBsZV9yYXRlID0g MTsKKworLyogSXMgdGhlIGN1cnJlbnQgdG9wLWxldmVsIHF1ZXJ5IHRvIGJlIHNhbXBsZWQ/ ICovCitzdGF0aWMgYm9vbCBjdXJyZW50X3F1ZXJ5X3NhbXBsZWQgPSBmYWxzZTsKIAogCiAj ZGVmaW5lIHBnc3NfZW5hYmxlZChsZXZlbCkgXAogCSghSXNQYXJhbGxlbFdvcmtlcigpICYm IFwKIAkocGdzc190cmFjayA9PSBQR1NTX1RSQUNLX0FMTCB8fCBcCi0JKHBnc3NfdHJhY2sg PT0gUEdTU19UUkFDS19UT1AgJiYgKGxldmVsKSA9PSAwKSkpCisJKHBnc3NfdHJhY2sgPT0g UEdTU19UUkFDS19UT1AgJiYgKGxldmVsKSA9PSAwKSkgJiYgXAorCWN1cnJlbnRfcXVlcnlf c2FtcGxlZCkKIAogI2RlZmluZSByZWNvcmRfZ2NfcXRleHRzKCkgXAogCWRvIHsgXApAQCAt NDE0LDYgKzQyMSwxOSBAQCBfUEdfaW5pdCh2b2lkKQogCQkJCQkJCU5VTEwsCiAJCQkJCQkJ TlVMTCk7CiAKKwlEZWZpbmVDdXN0b21SZWFsVmFyaWFibGUoInBnX3N0YXRfc3RhdGVtZW50 cy5zYW1wbGVfcmF0ZSIsCisJCQkJCQkJICJGcmFjdGlvbiBvZiBxdWVyaWVzIHRvIHRyYWNr LiIsCisJCQkJCQkJIE5VTEwsCisJCQkJCQkJICZwZ3NzX3NhbXBsZV9yYXRlLAorCQkJCQkJ CSAxLjAsCisJCQkJCQkJIDAuMCwKKwkJCQkJCQkgMS4wLAorCQkJCQkJCSBQR0NfU1VTRVQs CisJCQkJCQkJIDAsCisJCQkJCQkJIE5VTEwsCisJCQkJCQkJIE5VTEwsCisJCQkJCQkJIE5V TEwpOworCiAJRGVmaW5lQ3VzdG9tRW51bVZhcmlhYmxlKCJwZ19zdGF0X3N0YXRlbWVudHMu dHJhY2siLAogCQkJCQkJCSAiU2VsZWN0cyB3aGljaCBzdGF0ZW1lbnRzIGFyZSB0cmFja2Vk IGJ5IHBnX3N0YXRfc3RhdGVtZW50cy4iLAogCQkJCQkJCSBOVUxMLApAQCAtODM1LDYgKzg1 NSwxMSBAQCBwZ3NzX3Bvc3RfcGFyc2VfYW5hbHl6ZShQYXJzZVN0YXRlICpwc3RhdGUsIFF1 ZXJ5ICpxdWVyeSwgSnVtYmxlU3RhdGUgKmpzdGF0ZSkKIAlpZiAocHJldl9wb3N0X3BhcnNl X2FuYWx5emVfaG9vaykKIAkJcHJldl9wb3N0X3BhcnNlX2FuYWx5emVfaG9vayhwc3RhdGUs IHF1ZXJ5LCBqc3RhdGUpOwogCisJcmFuZG9tX3NhbXBsZSA9IHBnX3BybmdfZG91YmxlKCZw Z19nbG9iYWxfcHJuZ19zdGF0ZSk7CisKKwlpZiAobmVzdGluZ19sZXZlbCA9PSAwKQorCQlj dXJyZW50X3F1ZXJ5X3NhbXBsZWQgPSByYW5kb21fc2FtcGxlIDwgcGdzc19zYW1wbGVfcmF0 ZTsKKwogCS8qIFNhZmV0eSBjaGVjay4uLiAqLwogCWlmICghcGdzcyB8fCAhcGdzc19oYXNo IHx8ICFwZ3NzX2VuYWJsZWQobmVzdGluZ19sZXZlbCkpCiAJCXJldHVybjsKQEAgLTg4OSw2 ICs5MTQsOSBAQCBwZ3NzX3BsYW5uZXIoUXVlcnkgKnBhcnNlLAogewogCVBsYW5uZWRTdG10 ICpyZXN1bHQ7CiAKKwlpZiAobmVzdGluZ19sZXZlbCA9PSAwKQorCQljdXJyZW50X3F1ZXJ5 X3NhbXBsZWQgPSByYW5kb21fc2FtcGxlIDwgcGdzc19zYW1wbGVfcmF0ZTsKKwogCS8qCiAJ ICogV2UgY2FuJ3QgcHJvY2VzcyB0aGUgcXVlcnkgaWYgbm8gcXVlcnlfc3RyaW5nIGlzIHBy b3ZpZGVkLCBhcwogCSAqIHBnc3Nfc3RvcmUgbmVlZHMgaXQuICBXZSBhbHNvIGlnbm9yZSBx dWVyeSB3aXRob3V0IHF1ZXJ5aWQsIGFzIGl0IHdvdWxkCkBAIC0xMTExLDcgKzExMzksMTMg QEAgcGdzc19Qcm9jZXNzVXRpbGl0eShQbGFubmVkU3RtdCAqcHN0bXQsIGNvbnN0IGNoYXIg KnF1ZXJ5U3RyaW5nLAogCXVpbnQ2NAkJc2F2ZWRfcXVlcnlJZCA9IHBzdG10LT5xdWVyeUlk OwogCWludAkJCXNhdmVkX3N0bXRfbG9jYXRpb24gPSBwc3RtdC0+c3RtdF9sb2NhdGlvbjsK IAlpbnQJCQlzYXZlZF9zdG10X2xlbiA9IHBzdG10LT5zdG10X2xlbjsKLQlib29sCQllbmFi bGVkID0gcGdzc190cmFja191dGlsaXR5ICYmIHBnc3NfZW5hYmxlZChuZXN0aW5nX2xldmVs KTsKKwlib29sCQllbmFibGVkOworCisJaWYgKG5lc3RpbmdfbGV2ZWwgPT0gMCkKKwkJY3Vy cmVudF9xdWVyeV9zYW1wbGVkID0gcmFuZG9tX3NhbXBsZSA8IHBnc3Nfc2FtcGxlX3JhdGU7 CisKKwkvKiBjdXJyZW50X3F1ZXJ5X3NhbXBsZWQgaXMgaW4gcGdzc19lbmFibGVkICovCisJ ZW5hYmxlZCA9IHBnc3NfdHJhY2tfdXRpbGl0eSAmJiBwZ3NzX2VuYWJsZWQobmVzdGluZ19s ZXZlbCk7CiAKIAkvKgogCSAqIEZvcmNlIHV0aWxpdHkgc3RhdGVtZW50cyB0byBnZXQgcXVl cnlJZCB6ZXJvLiAgV2UgZG8gdGhpcyBldmVuIGluIGNhc2VzCmRpZmYgLS1naXQgYS9jb250 cmliL3BnX3N0YXRfc3RhdGVtZW50cy9zcWwvc2VsZWN0LnNxbCBiL2NvbnRyaWIvcGdfc3Rh dF9zdGF0ZW1lbnRzL3NxbC9zZWxlY3Quc3FsCmluZGV4IGUwYmU1OGQ1ZTIuLjBhODgxYzNj YmYgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3NxbC9zZWxlY3Qu c3FsCisrKyBiL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3NxbC9zZWxlY3Quc3FsCkBA IC01OSw2ICs1OSwxNyBAQCBERUFMTE9DQVRFIHBnc3NfdGVzdDsKIFNFTEVDVCBjYWxscywg cm93cywgcXVlcnkgRlJPTSBwZ19zdGF0X3N0YXRlbWVudHMgT1JERVIgQlkgcXVlcnkgQ09M TEFURSAiQyI7CiBTRUxFQ1QgcGdfc3RhdF9zdGF0ZW1lbnRzX3Jlc2V0KCkgSVMgTk9UIE5V TEwgQVMgdDsKIAorLS0KKy0tIHNhbXBsZSBzdGF0ZW1lbnRzCistLQorU0VUIHBnX3N0YXRf c3RhdGVtZW50cy5zYW1wbGVfcmF0ZSA9IDAuMDsKK1NFTEVDVCAxIEFTICJpbnQiOworU0VM RUNUIHF1ZXJ5LCBjYWxscyBGUk9NIHBnX3N0YXRfc3RhdGVtZW50czsKK1NFVCBwZ19zdGF0 X3N0YXRlbWVudHMuc2FtcGxlX3JhdGUgPSAxLjA7CitTRUxFQ1QgMSBBUyAiaW50IjsKK1NF TEVDVCBxdWVyeSwgY2FsbHMgRlJPTSBwZ19zdGF0X3N0YXRlbWVudHM7CitTRUxFQ1QgcGdf c3RhdF9zdGF0ZW1lbnRzX3Jlc2V0KCkgSVMgTk9UIE5VTEwgQVMgdDsKKwogLS0KIC0tIHF1 ZXJpZXMgd2l0aCBsb2NraW5nIGNsYXVzZXMKIC0tCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3Nn bWwvcGdzdGF0c3RhdGVtZW50cy5zZ21sIGIvZG9jL3NyYy9zZ21sL3Bnc3RhdHN0YXRlbWVu dHMuc2dtbAppbmRleCA1MDFiNDY4ZTlhLi44YWRlNGUzY2VkIDEwMDY0NAotLS0gYS9kb2Mv c3JjL3NnbWwvcGdzdGF0c3RhdGVtZW50cy5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9wZ3N0 YXRzdGF0ZW1lbnRzLnNnbWwKQEAgLTkzNiw2ICs5MzYsMjQgQEAKICAgICA8L2xpc3RpdGVt PgogICAgPC92YXJsaXN0ZW50cnk+CiAKKyAgIDx2YXJsaXN0ZW50cnk+CisgICAgPHRlcm0+ CisgICAgIDx2YXJuYW1lPnBnX3N0YXRfc3RhdGVtZW50cy5zYW1wbGVfcmF0ZTwvdmFybmFt ZT4gKDx0eXBlPnJlYWw8L3R5cGU+KQorICAgICA8aW5kZXh0ZXJtPgorICAgICAgPHByaW1h cnk+PHZhcm5hbWU+cGdfc3RhdF9zdGF0ZW1lbnRzLnNhbXBsZV9yYXRlPC92YXJuYW1lPiBj b25maWd1cmF0aW9uIHBhcmFtZXRlcjwvcHJpbWFyeT4KKyAgICAgPC9pbmRleHRlcm0+Cisg ICAgPC90ZXJtPgorCisgICAgPGxpc3RpdGVtPgorICAgICA8cGFyYT4KKyAgICAgIDx2YXJu YW1lPnBnX3N0YXRfc3RhdGVtZW50cy5zYW1wbGVfcmF0ZTwvdmFybmFtZT4gY2F1c2VzIHBn X3N0YXRfc3RhdGVtZW50cyB0byBvbmx5CisgICAgICB0cmFjayBhIGZyYWN0aW9uIG9mIHRo ZSBzdGF0ZW1lbnRzIGluIGVhY2ggc2Vzc2lvbi4gVGhlIGRlZmF1bHQgaXMgMSwKKyAgICAg IG1lYW5pbmcgdHJhY2sgYWxsIHRoZSBxdWVyaWVzLiBJbiBjYXNlIG9mIG5lc3RlZCBzdGF0 ZW1lbnRzLAorICAgICAgZWl0aGVyIGFsbCB3aWxsIGJlIHRyYWNrZWQgb3Igbm9uZS4gT25s eSBzdXBlcnVzZXJzIGNhbiBjaGFuZ2UgdGhpcyBzZXR0aW5nLgorICAgICA8L3BhcmE+Cisg ICAgPC9saXN0aXRlbT4KKyAgIDwvdmFybGlzdGVudHJ5PgorCiAgICA8dmFybGlzdGVudHJ5 PgogICAgIDx0ZXJtPgogICAgICA8dmFybmFtZT5wZ19zdGF0X3N0YXRlbWVudHMuc2F2ZTwv dmFybmFtZT4gKDx0eXBlPmJvb2xlYW48L3R5cGU+KQotLSAKMi4zNC4xCgo= --------------YAGqmFfGen0zOlliaBxfU0DT--