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 1uj35w-00288o-Qv for pgsql-hackers@arkaria.postgresql.org; Mon, 04 Aug 2025 21:51:49 +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 1uj35v-005e3O-OT for pgsql-hackers@arkaria.postgresql.org; Mon, 04 Aug 2025 21:51:47 +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 1uj35v-005e3G-9t for pgsql-hackers@lists.postgresql.org; Mon, 04 Aug 2025 21:51:47 +0000 Received: from mail-ed1-x534.google.com ([2a00:1450:4864:20::534]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1uj35s-000lgj-1q for pgsql-hackers@postgresql.org; Mon, 04 Aug 2025 21:51:46 +0000 Received: by mail-ed1-x534.google.com with SMTP id 4fb4d7f45d1cf-6156463fae9so9580583a12.0 for ; Mon, 04 Aug 2025 14:51:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1754344303; x=1754949103; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=HZLP5MwU0lpCjCwnu166PYbs30CQjfY7g3HknbdoyeQ=; b=QR4C4mQbJ6rGBf4LGkuBc7dPqBf6lqJzQLIQYQIg4h2gIyP64PTtiV9mO0m5Bu/VTZ tjEcG/H/l6txVgJbXs9Zdw3p214MWONdSK+E/1bcLj+gOFD1761c6MaCz/6TtYz9Oj1I FDa/+dCbZ+B1J6oycPhTx3dOZ6ajmwG+Lq8zLO3OzAAmP8He/o9QLKXjqMzLmYFGyK9m hUnee/a7UCRXiRjcqLf1Y7nMnJYEEe24awJtMNpeUVG3hFd0NW/Nu77tbNhiOO2h3+lD 32NQm0yhhnX9Z+38FKp2NVc1jA3u3hiNTJ/1T9adstG/1ZU5nFnnLapX3g/wseDupgWM vBEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1754344303; x=1754949103; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=HZLP5MwU0lpCjCwnu166PYbs30CQjfY7g3HknbdoyeQ=; b=Dtyx6Emb5y7Fi72QtePwiWdQl8RnjxsVeKwyNKy1z3MWCpAiwdzaVJfQ5ERIbyX0E1 Z4jHtdM/CLgwsNBIqD2jDufcsVDRgM37E0bCP4gVOVf11S1eDgdG/4z/jpTrbqItX65M vqNnSKBM7CcueZl83d7xmAF8lDOjb6UyU1JSrDk4u5n1UEeQNKWj+24mY+ewnNomAgct hL7xPo8YoVQALEJ1V9tUp7F9o2xr1GbR4JmuGLZmFgJpVNUI420HHRmdh3e7BvxVsnQE vN+l19bMHg1JHfqO8TtWPQfaUcYSvEXxt26OA8X9TEpCZ3aExUXgTGIyavguXK92Tm4p WO2g== X-Forwarded-Encrypted: i=1; AJvYcCUhgah/6UQeTt0cqIqThjldoF3pjoMIT1zAGpO+85kSIlvrkW+DtHALCbXsirv8bDEq5mk6r57AbVj5tQs3@postgresql.org X-Gm-Message-State: AOJu0YyKYNND8l1ETKObuSaHOW6uQcAeUqH8/TSS+SuiNYD9mfMl9smo p/2vBpP996gA6Y7zZEP+cd4Pl8NS6XwlPnj7qm6DqPy2MMs96uuyDkweW26x4AGd0S35b6Gg1iY 9qhiegKnTCo1Ma3FAC1DvKAqxnDg4mtw= X-Gm-Gg: ASbGncssM2xJKDckmzy5b8P2E2O3N6fCNx7+W22rAduD0i+NSQ68W+zCaNYyPNgxN4m 0mr+Wg3LxfXVBLudnlttXqNvcaNFWraUb74JOQpWpRcOfvCubogPBveUXcsYEXFeCdG1z5S9C2B Tom5FPDAirPOc2wHFfna7qkp/Po0bJK6V5X+mg/SFi13EwCsmtjsrVqLMbqEekmRPCsKppKKwZu MeCXk0= X-Google-Smtp-Source: AGHT+IEXrPq5BksbLODJrUA/ybaf21/QflIDBHTB/rTfLupoVfqVjZJHY8fEo+z8YpkLe0gtW2VaMZnyhEEd69R0RZs= X-Received: by 2002:a17:907:7e88:b0:af9:5b51:2e6d with SMTP id a640c23a62f3a-af97cf70a61mr145201066b.0.1754344302942; Mon, 04 Aug 2025 14:51:42 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Naga Appani Date: Mon, 4 Aug 2025 16:51:30 -0500 X-Gm-Features: Ac12FXySXeQgOlPrpHOcEiaoqZ-2fZluP6D2fGXJmbaWU-fHM2lHzK4tAK6_5jU Message-ID: Subject: Re: [Proposal] Expose internal MultiXact member count function for efficient monitoring To: Ashutosh Bapat Cc: Michael Paquier , Kirill Reshke , pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="000000000000fded84063b911ca8" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000fded84063b911ca8 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Aug 4, 2025 at 1:16=E2=80=AFAM Naga Appani wrot= e: > > Hi Ashutosh, Michael, > > Thanks for the detailed reviews. I have incorporated the feedback; > please find attached v2 and my responses inline below. > > On Fri, Jul 25, 2025 at 5:57=E2=80=AFAM Ashutosh Bapat > wrote: > > > In [1], we decided to document pg_get_multixact_member() in section > > "Transaction ID and Snapshot Information Functions". I think the > > discussion in the email thread applies to this function as well. > > Done -- the function is now documented under =E2=80=9CTransaction ID and > Snapshot Information Functions=E2=80=9D for consistency. > > > The description here doesn't follow the format of the other functions > > in this section. > > Updated the description in func.sgml to match the style of other > functions. Extended usage guidance is now in maintenance.sgml. > > > Throwing an error causes the surrounding transaction to abort, so it > > should be avoided in a monitoring/reporting function if possible. > > The function now returns NULL instead of throwing an error when counts > can=E2=80=99t be read. > > > If ReadMultiXactCounts() returns false, MultiXactMemberFreezeThreshold(= ) returns 0... > > Noted -- the docs now mention that the function can be used to > anticipate more aggressive autovacuum behavior in such cases. > > > In PG14+, the transaction wraparound is triggered if the size of the > > directory exceeds 10GB. This function does not help monitoring that > > condition. So a user will need to use du or pg_ls_multixactdir() > > anyway, which defeats the purpose of this function being more > > efficient than those methods. Am I correct? Can we also report the > > size of the directory in this function? > > Correct, that is the intent of the function. The members count > returned by this function already provides the necessary information > to determine the directory size, since each member entry has a fixed > size. The constants and formulas in [0] and discussed in [1] show that > each group stores four bytes of flags plus four TransactionIds (20 > bytes total), yielding 409 groups per 8=E2=80=AFKB page and a fixed > members=E2=80=91to=E2=80=91bytes ratio. This means ~2=E2=80=AFbillion mem= bers corresponds to > ~10=E2=80=AFGB (aggressive autovacuum threshold) and ~4=E2=80=AFbillion m= embers > corresponds to ~20=E2=80=AFGB (wraparound). > > Since the function already provides the member count, including the > physical size in its output would duplicate information and add no > extra benefit. > > > The patch needs tests. > > Added an isolation test to cover initial state, MultiXact creation, > counts, and oldest MultiXact reporting. > > On Mon, Jul 28, 2025 at 1:00=E2=80=AFAM Ashutosh Bapat > wrote: > > > Let's say if the user knows that the counts are so high that a > > wraparound is imminent, but vacuuming isn't solving the problem... > > Here's a quick patch implementing the same. Please feel free to > > incorporate and refine it in your patch if you like it. > > Thank you for sharing the patch. I have incorporated it into this > version with minor adjustments, and it fits well with the overall > design of the function. > > On Mon, Jul 28, 2025 at 4:22=E2=80=AFAM Michael Paquier wrote: > > > Yep, let's be consistent. > > Done -- placed in =E2=80=9CTransaction ID and Snapshot Information Functi= ons=E2=80=9D > for consistency. > > > Most likely returning NULL is the best thing we can do, as a safe fallb= ack. > > Implemented -- the function now returns NULL if counts can=E2=80=99t be r= ead. > > > The patch needs tests. > > Isolation tests have been added as described above. > > > May I also suggest a split of the multixact SQL functions into a > > separate file, a src/backend/utils/adt/multixactfuncs.c? > > I agree that would be cleaner, but I=E2=80=99d prefer to keep the > implementation in multixact.c for now to maintain focus on this patch > and revisit the refactoring later. > > > +PG_FUNCTION_INFO_V1(pg_get_multixact_count); > > Removed -- now handled entirely by pg_proc.dat. > > > ...You may want to add an example of how one can use it for monitoring = in the docs. > > I=E2=80=99ve added a usage example with sample output in the docs. If you= had > a different kind of demo in mind (e.g., creating multixacts manually > and showing the output), please let me know. > > References: > [0] https://github.com/postgres/postgres/blob/master/src/backend/access/t= ransam/multixact.c#L130-L156 > [1] https://www.postgresql.org/message-id/flat/CACbFw60UOk6fCC02KsyT3OfU9= Dnuq5roYxdw2aFisiN_p1L0bg%40mail.gmail.com > > Best regards, > Naga Appani Following up on my v2 from yesterday =E2=80=94 the recent commit [0] change= d the directory layout, which broke the patch (v2). This v3 updates the code to work with the new structure and also fixes some formatting issues I noticed while revisiting the changes. The rest of the patch remains the same as v2, which incorporated feedback from Ashutosh and Michael (see my previous email for details). Please find v3 attached. References: [0] https://github.com/postgres/postgres/commit/4e23c9ef65accde7eb3e56aa28d= 50ae5cf79b64b Best regards, Naga Appani --000000000000fded84063b911ca8 Content-Type: application/octet-stream; name="v3-0001-Add-pg_get_multixact_stats-SQL-function-for-monit.patch" Content-Disposition: attachment; filename="v3-0001-Add-pg_get_multixact_stats-SQL-function-for-monit.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mdxn8ohj0 RnJvbSA1YjMzNDFmYTk3NTlmMTMxYzVlMzY4YjZkZWJjYjhmMjA4Yzk2YTEyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYWdhIEFwcGFuaSA8bmFnbnJpa0BnbWFpbC5jb20+CkRhdGU6 IE1vbiwgNCBBdWcgMjAyNSAyMTowMjoyNiArMDAwMApTdWJqZWN0OiBbUEFUQ0ggdjJdIEFkZCBw Z19nZXRfbXVsdGl4YWN0X3N0YXRzKCkgU1FMIGZ1bmN0aW9uIGZvciBtb25pdG9yaW5nCiBtdWx0 aXhhY3QgdXNhZ2UKClRoaXMgcGF0Y2ggYWRkcyBwZ19nZXRfbXVsdGl4YWN0X3N0YXRzKCksIGEg U1FMLWNhbGxhYmxlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucwptdWx0aXhhY3Qgc3RhdGlzdGljcyB0 byBhaWQgaW4gbW9uaXRvcmluZyB3cmFwYXJvdW5kIHJpc2sgYW5kIHZhY3V1bSBiZWhhdmlvci4K SXQgcmVwb3J0czoKCm11bHRpeGFjdHM6IHRoZSBudW1iZXIgb2YgbXVsdGl4YWN0IElEcyBjcmVh dGVkIHNpbmNlIHRoZSBvbGRlc3Qgb25lIHN0aWxsIG5lZWRlZAptZW1iZXJzOiB0aGUgbnVtYmVy IG9mIG11bHRpeGFjdCBtZW1iZXIgZW50cmllcyB0aGF0IGN1cnJlbnRseSBleGlzdApvbGRlc3Rf bXVsdGl4YWN0OiB0aGUgb2xkZXN0IG11bHRpeGFjdCBJRCBzdGlsbCBuZWVkZWQgYnkgYW55IGRh dGFiYXNlCgpUaGUgZnVuY3Rpb24gbW9kaWZpZXMgUmVhZE11bHRpWGFjdENvdW50cygpIHRvIGV4 cG9zZSB0aGUgb2xkZXN0TXVsdGlYYWN0SWQgYW5kCnJldHVybnMgYWxsIHRocmVlIHZhbHVlcyBp biBhIGNvbXBvc2l0ZSByZWNvcmQuIFRoaXMgYWxsb3dzIHVzZXJzIHRvIG1vbml0b3IKbXVsdGl4 YWN0IHVzYWdlIGFuZCBpZGVudGlmeSBwb3RlbnRpYWwgd3JhcGFyb3VuZCBpc3N1ZXMsIHBhcnRp Y3VsYXJseSB1c2VmdWwKd2hlbiBjb21iaW5lZCB3aXRoIHBnX2dldF9tdWx0aXhhY3RfbWVtYmVy cygpIHRvIGludmVzdGlnYXRlIHNwZWNpZmljIG11bHRpeGFjdHMuCgpVc2FnZToKU0VMRUNUICog RlJPTSBwZ19nZXRfbXVsdGl4YWN0X3N0YXRzKCk7CgpEb2N1bWVudGF0aW9uIGlzIGFkZGVkIHRv OgotICJUcmFuc2FjdGlvbiBJRCBhbmQgU25hcHNob3QgSW5mb3JtYXRpb24gRnVuY3Rpb25zIiBz ZWN0aW9uIGluIGZ1bmMuc2dtbAotICJNdWx0aXhhY3RzIGFuZCBXcmFwYXJvdW5kIiBzZWN0aW9u IGluIG1haW50ZW5hbmNlLnNnbWwKICAocm91dGluZS12YWN1dW1pbmcuaHRtbCNWQUNVVU0tRk9S LU1VTFRJWEFDVC1XUkFQQVJPVU5EKQoKSXNvbGF0aW9uIHRlc3RzIGFyZSBhZGRlZCB0byB2ZXJp Znk6Ci0gSW5pdGlhbCBzdGF0ZSB3aXRoIHplcm8gbXVsdGl4YWN0cwotIG11bHRpeGFjdCBjcmVh dGlvbiB3aXRoIG92ZXJsYXBwaW5nIHNoYXJlZCBsb2NrcwotIENvcnJlY3QgY291bnRpbmcgb2Yg bXVsdGl4YWN0cyBhbmQgbWVtYmVycwotIFByb3BlciB0cmFja2luZyBvZiBvbGRlc3QgbXVsdGl4 YWN0IElECgpBdXRob3I6IE5hZ2EgQXBwYW5pIDxuYWducmlrQGdtYWlsLmNvbT4KUmV2aWV3ZWQt Ynk6IEFzaHV0b3NoIEJhcGF0IDxhc2h1dG9zaC5iYXBhdC5vc3NAZ21haWwuY29tPgpSZXZpZXdl ZC1ieTogTWljaGFlbCBQYXF1aWVyIDxtaWNoYWVsQHBhcXVpZXIueHl6PgpEaXNjdXNzaW9uOiBo dHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9tZXNzYWdlLWlkL2ZsYXQvQ0FNMkJlb1glMkJSYXNL Zkc2Vzh3NHFZWlp6NEJuaHlFUU1BX3k1Y0VEbktFWV96OG85Q3pnJTQwbWFpbC5nbWFpbC5jb20K LS0tCiBkb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbCAgICAgICAgICAgICAgfCAzMiAr KysrKysrKysrCiBkb2Mvc3JjL3NnbWwvbWFpbnRlbmFuY2Uuc2dtbCAgICAgICAgICAgICAgICAg fCAzNyArKysrKysrKysrLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL211bHRpeGFjdC5j ICAgICAgICB8IDUwICsrKysrKysrKysrKysrLS0KIHNyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJv Yy5kYXQgICAgICAgICAgICAgICB8IDE1ICsrKysrCiAuLi4vaXNvbGF0aW9uL2V4cGVjdGVkL211 bHRpeGFjdF9zdGF0cy5vdXQgICAgfCA1OSArKysrKysrKysrKysrKysrKysrCiBzcmMvdGVzdC9p c29sYXRpb24vc3BlY3MvbXVsdGl4YWN0X3N0YXRzLnNwZWMgfCAzNSArKysrKysrKysrKwogNiBm aWxlcyBjaGFuZ2VkLCAyMTkgaW5zZXJ0aW9ucygrKSwgOSBkZWxldGlvbnMoLSkKIGNyZWF0ZSBt b2RlIDEwMDY0NCBzcmMvdGVzdC9pc29sYXRpb24vZXhwZWN0ZWQvbXVsdGl4YWN0X3N0YXRzLm91 dAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L2lzb2xhdGlvbi9zcGVjcy9tdWx0aXhhY3Rf c3RhdHMuc3BlYwoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21s IGIvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZvLnNnbWwKaW5kZXggYjUwN2JmYWY2NGIuLjc1 Y2UyYzZlNDAzIDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbAor KysgYi9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbApAQCAtMjk2Nyw2ICsyOTY3LDM4 IEBAIGFjbCAgICAgIHwge3Bvc3RncmVzPWFyd2REeHRtL3Bvc3RncmVzLGZvbz1yL3Bvc3RncmVz fQogICAgICAgICBtb2RpZnkga2V5IGNvbHVtbnMuCiAgICAgICAgPC9wYXJhPjwvZW50cnk+CiAg ICAgICA8L3Jvdz4KKworICAgICA8cm93PgorICAgICAgPGVudHJ5IHJvbGU9ImZ1bmNfdGFibGVf ZW50cnkiPgorICAgICAgIDxwYXJhIHJvbGU9ImZ1bmNfc2lnbmF0dXJlIj4KKyAgICAgICAgPGlu ZGV4dGVybT48cHJpbWFyeT5wZ19nZXRfbXVsdGl4YWN0X3N0YXRzPC9wcmltYXJ5PjwvaW5kZXh0 ZXJtPgorICAgICAgICA8ZnVuY3Rpb24+cGdfZ2V0X211bHRpeGFjdF9zdGF0czwvZnVuY3Rpb24+ ICgpCisgICAgICAgIDxyZXR1cm52YWx1ZT5yZWNvcmQ8L3JldHVybnZhbHVlPgorICAgICAgICAo IDxwYXJhbWV0ZXI+bXVsdGl4YWN0czwvcGFyYW1ldGVyPiA8dHlwZT5pbnRlZ2VyPC90eXBlPiwK KyAgICAgICAgICA8cGFyYW1ldGVyPm1lbWJlcnM8L3BhcmFtZXRlcj4gPHR5cGU+YmlnaW50PC90 eXBlPiwKKyAgICAgICAgICA8cGFyYW1ldGVyPm9sZGVzdF9tdWx0aXhhY3Q8L3BhcmFtZXRlcj4g PHR5cGU+aW50ZWdlcjwvdHlwZT4gKQorICAgICAgIDwvcGFyYT4KKworICAgICAgIDxwYXJhPgor ICAgICAgICBSZXR1cm5zIHN0YXRpc3RpY3MgYWJvdXQgY3VycmVudCBtdWx0aXhhY3QgdXNhZ2U6 CisgICAgICAgIDxsaXRlcmFsPm11bHRpeGFjdHM8L2xpdGVyYWw+IGlzIHRoZSBudW1iZXIgb2Yg bXVsdGl4YWN0IElEcyBhc3NpZ25lZCwKKyAgICAgICAgPGxpdGVyYWw+bWVtYmVyczwvbGl0ZXJh bD4gaXMgdGhlIG51bWJlciBvZiBtdWx0aXhhY3QgbWVtYmVyIGVudHJpZXMgY3JlYXRlZCwKKyAg ICAgICAgYW5kIDxsaXRlcmFsPm9sZGVzdF9tdWx0aXhhY3Q8L2xpdGVyYWw+IGlzIHRoZSBvbGRl c3QgTXVsdGlYYWN0IElEIHN0aWxsIGluIHVzZS4KKyAgICAgICAgVGhlc2UgdmFsdWVzIGNhbiBi ZSB1c2VkIHRvIG1vbml0b3IgbXVsdGl4YWN0IGNvbnN1bXB0aW9uIGFuZCBhbnRpY2lwYXRlCisg ICAgICAgIGF1dG92YWN1dW0gYmVoYXZpb3IuIFNlZSA8eHJlZiBsaW5rZW5kPSJ2YWN1dW0tZm9y LW11bHRpeGFjdC13cmFwYXJvdW5kIi8+CisgICAgICAgIGZvciBmdXJ0aGVyIGRldGFpbHMgb24g bXVsdGl4YWN0IHdyYXBhcm91bmQuCisgICAgICAgPC9wYXJhPgorCisgICAgICAgPHBhcmE+Cisg ICAgICAgIDxsaXRlcmFsPlNFTEVDVCAqIEZST00gcGdfZ2V0X211bHRpeGFjdF9zdGF0cygpOzwv bGl0ZXJhbD4KKzxwcm9ncmFtbGlzdGluZz4KKyBtdWx0aXhhY3RzIHwgICBtZW1iZXJzICAgfCBv bGRlc3RfbXVsdGl4YWN0CistLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tLS0KKyAxODIzNzEzOTYgIHwgMjgyNjIyMTE3NCAgfCA3NTQzMjEKKzwvcHJvZ3JhbWxpc3Rp bmc+CisgICAgICAgPC9wYXJhPgorICAgICAgPC9lbnRyeT4KKyAgICAgPC9yb3c+CiAgICAgIDwv dGJvZHk+CiAgICAgPC90Z3JvdXA+CiAgICA8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9z Z21sL21haW50ZW5hbmNlLnNnbWwgYi9kb2Mvc3JjL3NnbWwvbWFpbnRlbmFuY2Uuc2dtbAppbmRl eCBlN2E5ZjU4YzAxNS4uZDZiZDMwNWIwYjAgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9tYWlu dGVuYW5jZS5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9tYWludGVuYW5jZS5zZ21sCkBAIC04MTMs MTIgKzgxMyw0MSBAQCBISU5UOiAgRXhlY3V0ZSBhIGRhdGFiYXNlLXdpZGUgVkFDVVVNIGluIHRo YXQgZGF0YWJhc2UuCiAgICAgPHBhcmE+CiAgICAgIEFzIGEgc2FmZXR5IGRldmljZSwgYW4gYWdn cmVzc2l2ZSB2YWN1dW0gc2NhbiB3aWxsCiAgICAgIG9jY3VyIGZvciBhbnkgdGFibGUgd2hvc2Ug bXVsdGl4YWN0LWFnZSBpcyBncmVhdGVyIHRoYW4gPHhyZWYKLSAgICAgbGlua2VuZD0iZ3VjLWF1 dG92YWN1dW0tbXVsdGl4YWN0LWZyZWV6ZS1tYXgtYWdlIi8+LiAgQWxzbywgaWYgdGhlCi0gICAg IHN0b3JhZ2Ugb2NjdXBpZWQgYnkgbXVsdGl4YWN0cyBtZW1iZXJzIGV4Y2VlZHMgYWJvdXQgMTBH QiwgYWdncmVzc2l2ZSB2YWN1dW0KKyAgICAgbGlua2VuZD0iZ3VjLWF1dG92YWN1dW0tbXVsdGl4 YWN0LWZyZWV6ZS1tYXgtYWdlIi8+LiBBbHNvLCBpZiBlaXRoZXIKKyAgICAgdGhlIHN0b3JhZ2Ug b2NjdXBpZWQgYnkgbXVsdGl4YWN0IG1lbWJlcnMgZXhjZWVkcyBhYm91dCAxMEdCIG9yIHRoZSBu dW1iZXIKKyAgICAgb2YgbWVtYmVycyBjcmVhdGVkIGV4Y2VlZHMgYXBwcm94aW1hdGVseSAyIGJp bGxpb24gZW50cmllcywgYWdncmVzc2l2ZSB2YWN1dW0KICAgICAgc2NhbnMgd2lsbCBvY2N1ciBt b3JlIG9mdGVuIGZvciBhbGwgdGFibGVzLCBzdGFydGluZyB3aXRoIHRob3NlIHRoYXQKLSAgICAg aGF2ZSB0aGUgb2xkZXN0IG11bHRpeGFjdC1hZ2UuICBCb3RoIG9mIHRoZXNlIGtpbmRzIG9mIGFn Z3Jlc3NpdmUKKyAgICAgaGF2ZSB0aGUgb2xkZXN0IG11bHRpeGFjdC1hZ2UuIEJvdGggb2YgdGhl c2Uga2luZHMgb2YgYWdncmVzc2l2ZQogICAgICBzY2FucyB3aWxsIG9jY3VyIGV2ZW4gaWYgYXV0 b3ZhY3V1bSBpcyBub21pbmFsbHkgZGlzYWJsZWQuIFRoZSBtZW1iZXJzIHN0b3JhZ2UKLSAgICAg YXJlYSBjYW4gZ3JvdyB1cCB0byBhYm91dCAyMEdCIGJlZm9yZSByZWFjaGluZyB3cmFwYXJvdW5k LgorICAgICBhcmVhIGNhbiBncm93IHVwIHRvIGFib3V0IDIwR0Igb3IgYXBwcm94aW1hdGVseSA0 IGJpbGxpb24gZW50cmllcyBiZWZvcmUKKyAgICAgcmVhY2hpbmcgd3JhcGFyb3VuZC4KKyAgICA8 L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgVGhlIDxmdW5jdGlvbj5wZ19nZXRfbXVsdGl4YWN0 X3N0YXRzKCk8L2Z1bmN0aW9uPiBmdW5jdGlvbiBwcm92aWRlcyBhIHdheQorICAgICB0byBtb25p dG9yIG11bHRpeGFjdCBhbGxvY2F0aW9uIGFuZCB1c2FnZSBwYXR0ZXJucyBpbiByZWFsIHRpbWUu IEJ5IGV4cG9zaW5nCisgICAgIGNvdW50cyBvZiBtdWx0aXhhY3RzLCBtZW1iZXIgZW50cmllcywg YW5kIHRoZSBvbGRlc3QgbXVsdGl4YWN0IElELCBpdCBoZWxwczoKKyAgICAgPG9yZGVyZWRsaXN0 PgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxzaW1wYXJhPgorICAgICAgICAgSWRlbnRpZnkg dW51c3VhbCBtdWx0aXhhY3QgYWN0aXZpdHkgZnJvbSBjb25jdXJyZW50IHJvdy1sZXZlbCBsb2Nr cworICAgICAgICAgb3IgZm9yZWlnbiBrZXkgb3BlcmF0aW9ucworICAgICAgIDwvc2ltcGFyYT4K KyAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHNpbXBhcmE+Cisg ICAgICAgICBNb25pdG9yIHByb2dyZXNzIHRvd2FyZCB3cmFwYXJvdW5kIHRocmVzaG9sZHMgdGhh dCB0cmlnZ2VyIGFnZ3Jlc3NpdmUKKyAgICAgICAgIGF1dG92YWN1dW0gKGFwcHJveGltYXRlbHkg MiBiaWxsaW9uIG1lbWJlcnMgb3IgMTBHQiBzdG9yYWdlKQorICAgICAgIDwvc2ltcGFyYT4KKyAg ICAgIDwvbGlzdGl0ZW0+CisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHNpbXBhcmE+CisgICAg ICAgICBWZXJpZnkgd2hldGhlciBhdXRvdmFjdXVtIGlzIGVmZmVjdGl2ZWx5IG1hbmFnaW5nIG11 bHRpeGFjdCBjbGVhbnVwCisgICAgICAgICBiZWZvcmUgcmVhY2hpbmcgY3JpdGljYWwgdGhyZXNo b2xkcworICAgICAgIDwvc2ltcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwvb3JkZXJl ZGxpc3Q+CisgICAgIFNlZSA8eHJlZiBsaW5rZW5kPSJmdW5jdGlvbnMtaW5mby1zbmFwc2hvdCIv PiBmb3IgZGV0YWlscy4KICAgICA8L3BhcmE+CiAKICAgICA8cGFyYT4KZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL211bHRpeGFjdC5jIGIvc3JjL2JhY2tlbmQvYWNjZXNz L3RyYW5zYW0vbXVsdGl4YWN0LmMKaW5kZXggM2NiMDljM2Q1OTguLmVjN2ZmOTU5NDE2IDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9tdWx0aXhhY3QuYworKysgYi9zcmMv YmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9tdWx0aXhhY3QuYwpAQCAtMjg2MywxNyArMjg2MywxNiBA QCBmaW5kX211bHRpeGFjdF9zdGFydChNdWx0aVhhY3RJZCBtdWx0aSwgTXVsdGlYYWN0T2Zmc2V0 ICpyZXN1bHQpCiAgKiBleGlzdC4gIFJldHVybiBmYWxzZSBpZiB1bmFibGUgdG8gZGV0ZXJtaW5l LgogICovCiBzdGF0aWMgYm9vbAotUmVhZE11bHRpWGFjdENvdW50cyh1aW50MzIgKm11bHRpeGFj dHMsIE11bHRpWGFjdE9mZnNldCAqbWVtYmVycykKK1JlYWRNdWx0aVhhY3RDb3VudHModWludDMy ICptdWx0aXhhY3RzLCBNdWx0aVhhY3RPZmZzZXQgKm1lbWJlcnMsIE11bHRpWGFjdElkICpvbGRl c3RNdWx0aVhhY3RJZCkKIHsKIAlNdWx0aVhhY3RPZmZzZXQgbmV4dE9mZnNldDsKIAlNdWx0aVhh Y3RPZmZzZXQgb2xkZXN0T2Zmc2V0OwotCU11bHRpWGFjdElkIG9sZGVzdE11bHRpWGFjdElkOwog CU11bHRpWGFjdElkIG5leHRNdWx0aVhhY3RJZDsKIAlib29sCQlvbGRlc3RPZmZzZXRLbm93bjsK IAogCUxXTG9ja0FjcXVpcmUoTXVsdGlYYWN0R2VuTG9jaywgTFdfU0hBUkVEKTsKIAluZXh0T2Zm c2V0ID0gTXVsdGlYYWN0U3RhdGUtPm5leHRPZmZzZXQ7Ci0Jb2xkZXN0TXVsdGlYYWN0SWQgPSBN dWx0aVhhY3RTdGF0ZS0+b2xkZXN0TXVsdGlYYWN0SWQ7CisJKm9sZGVzdE11bHRpWGFjdElkID0g TXVsdGlYYWN0U3RhdGUtPm9sZGVzdE11bHRpWGFjdElkOwogCW5leHRNdWx0aVhhY3RJZCA9IE11 bHRpWGFjdFN0YXRlLT5uZXh0TVhhY3Q7CiAJb2xkZXN0T2Zmc2V0ID0gTXVsdGlYYWN0U3RhdGUt Pm9sZGVzdE9mZnNldDsKIAlvbGRlc3RPZmZzZXRLbm93biA9IE11bHRpWGFjdFN0YXRlLT5vbGRl c3RPZmZzZXRLbm93bjsKQEAgLTI4ODMsNyArMjg4Miw3IEBAIFJlYWRNdWx0aVhhY3RDb3VudHMo dWludDMyICptdWx0aXhhY3RzLCBNdWx0aVhhY3RPZmZzZXQgKm1lbWJlcnMpCiAJCXJldHVybiBm YWxzZTsKIAogCSptZW1iZXJzID0gbmV4dE9mZnNldCAtIG9sZGVzdE9mZnNldDsKLQkqbXVsdGl4 YWN0cyA9IG5leHRNdWx0aVhhY3RJZCAtIG9sZGVzdE11bHRpWGFjdElkOworCSptdWx0aXhhY3Rz ID0gbmV4dE11bHRpWGFjdElkIC0gKm9sZGVzdE11bHRpWGFjdElkOwogCXJldHVybiB0cnVlOwog fQogCkBAIC0yOTIyLDkgKzI5MjEsMTAgQEAgTXVsdGlYYWN0TWVtYmVyRnJlZXplVGhyZXNob2xk KHZvaWQpCiAJdWludDMyCQl2aWN0aW1fbXVsdGl4YWN0czsKIAlkb3VibGUJCWZyYWN0aW9uOwog CWludAkJCXJlc3VsdDsKKwlNdWx0aVhhY3RJZCBvbGRlc3RNdWx0aVhhY3RJZDsKIAogCS8qIElm IHdlIGNhbid0IGRldGVybWluZSBtZW1iZXIgc3BhY2UgdXRpbGl6YXRpb24sIGFzc3VtZSB0aGUg d29yc3QuICovCi0JaWYgKCFSZWFkTXVsdGlYYWN0Q291bnRzKCZtdWx0aXhhY3RzLCAmbWVtYmVy cykpCisJaWYgKCFSZWFkTXVsdGlYYWN0Q291bnRzKCZtdWx0aXhhY3RzLCAmbWVtYmVycywgJm9s ZGVzdE11bHRpWGFjdElkKSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBJZiBtZW1iZXIgc3BhY2UgdXRp bGl6YXRpb24gaXMgbG93LCBubyBzcGVjaWFsIGFjdGlvbiBpcyByZXF1aXJlZC4gKi8KQEAgLTM0 OTMsMyArMzQ5Myw0MyBAQCBtdWx0aXhhY3RtZW1iZXJzc3luY2ZpbGV0YWcoY29uc3QgRmlsZVRh ZyAqZnRhZywgY2hhciAqcGF0aCkKIHsKIAlyZXR1cm4gU2xydVN5bmNGaWxlVGFnKE11bHRpWGFj dE1lbWJlckN0bCwgZnRhZywgcGF0aCk7CiB9CisKKy8qCisgKiBwZ19nZXRfbXVsdGl4YWN0X3N0 YXRzCisgKgorICogU1FMLWNhbGxhYmxlIGZ1bmN0aW9uIHRvIHJldHJpZXZlIE11bHRpWGFjdCBz dGF0aXN0aWNzLgorICoKKyAqIFJldHVybnMgYSBjb21wb3NpdGUgcm93IGNvbnRhaW5pbmc6Cisg KiAtIHRvdGFsIG51bWJlciBvZiBNdWx0aVhhY3QgSURzIGNyZWF0ZWQgc2luY2Ugc3RhcnR1cCwK KyAqIC0gdG90YWwgbnVtYmVyIG9mIE11bHRpWGFjdCBtZW1iZXJzIGNyZWF0ZWQsCisgKiAtIHRo ZSBvbGRlc3QgZXhpc3RpbmcgTXVsdGlYYWN0IElELgorICoKKyAqIFRoaXMgaXMgcHJpbWFyaWx5 IHVzZWZ1bCBmb3IgbW9uaXRvcmluZyBNdWx0aVhhY3QgdXNhZ2UgYW5kIGVuc3VyaW5nCisgKiBh cHByb3ByaWF0ZSB3cmFwYXJvdW5kIHByb3RlY3Rpb24uCisgKi8KK0RhdHVtCitwZ19nZXRfbXVs dGl4YWN0X3N0YXRzKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJVHVwbGVEZXNjCXR1cGRlc2M7CisJ RGF0dW0JCXZhbHVlc1szXTsKKwlib29sCQludWxsc1szXSA9IHtmYWxzZSwgZmFsc2UsIGZhbHNl fTsKKwlNdWx0aVhhY3RPZmZzZXQgbWVtYmVyczsKKwlNdWx0aVhhY3RJZCBvbGRlc3RNdWx0aVhh Y3RJZDsKKwl1aW50MzIJCW11bHRpeGFjdHM7CisJSGVhcFR1cGxlCXR1cGxlOworCisJaWYgKGdl dF9jYWxsX3Jlc3VsdF90eXBlKGZjaW5mbywgTlVMTCwgJnR1cGRlc2MpICE9IFRZUEVGVU5DX0NP TVBPU0lURSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJybXNnKCJyZXR1cm4gdHlwZSBtdXN0 IGJlIGEgcm93IHR5cGUiKSkpOworCisJaWYgKCFSZWFkTXVsdGlYYWN0Q291bnRzKCZtdWx0aXhh Y3RzLCAmbWVtYmVycywgJm9sZGVzdE11bHRpWGFjdElkKSkKKwkJUEdfUkVUVVJOX05VTEwoKTsK KworCXZhbHVlc1swXSA9IFVJbnQzMkdldERhdHVtKG11bHRpeGFjdHMpOworCXZhbHVlc1sxXSA9 IFVJbnQzMkdldERhdHVtKG1lbWJlcnMpOworCXZhbHVlc1syXSA9IFVJbnQzMkdldERhdHVtKG9s ZGVzdE11bHRpWGFjdElkKTsKKworCXR1cGxlID0gaGVhcF9mb3JtX3R1cGxlKHR1cGRlc2MsIHZh bHVlcywgbnVsbHMpOworCisJUEdfUkVUVVJOX0RBVFVNKEhlYXBUdXBsZUdldERhdHVtKHR1cGxl KSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0IGIvc3Jj L2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAppbmRleCAxMThkNmRhMWFjZS4uOWQ5ZTI4YzI3 NzAgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKKysrIGIvc3Jj L2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdApAQCAtMTI1NzYsNCArMTI1NzYsMTkgQEAKICAg cHJvYXJnbmFtZXMgPT4gJ3twaWQsaW9faWQsaW9fZ2VuZXJhdGlvbixzdGF0ZSxvcGVyYXRpb24s b2ZmLGxlbmd0aCx0YXJnZXQsaGFuZGxlX2RhdGFfbGVuLHJhd19yZXN1bHQscmVzdWx0LHRhcmdl dF9kZXNjLGZfc3luYyxmX2xvY2FsbWVtLGZfYnVmZmVyZWR9JywKICAgcHJvc3JjID0+ICdwZ19n ZXRfYWlvcycgfSwKIAorIyBNdWx0aVhhY3Qgc3RhdHMKK3sKKwlvaWQgPT4gJzkwMDEnLAorCWRl c2NyID0+ICdnZXQgY3VycmVudCBtdWx0aXhhY3QgbWVtYmVyIGFuZCBtdWx0aXhhY3QgSUQgY291 bnRzIGFuZCBvbGRlc3QgbXVsdGl4YWN0JywKKwlwcm9uYW1lID0+ICdwZ19nZXRfbXVsdGl4YWN0 X3N0YXRzJywKKwlwcm9yZXR0eXBlID0+ICdyZWNvcmQnLAorCXByb2FyZ3R5cGVzID0+ICcnLAor CXByb2FsbGFyZ3R5cGVzID0+ICd7aW50NCxpbnQ4LGludDR9JywKKwlwcm9hcmdtb2RlcyA9PiAn e28sbyxvfScsCisJcHJvYXJnbmFtZXMgPT4gJ3ttdWx0aXhhY3RzLG1lbWJlcnMsb2xkZXN0X211 bHRpeGFjdH0nLAorCXByb3ZvbGF0aWxlID0+ICd2JywKKwlwcm9wYXJhbGxlbCA9PiAncycsCisJ cHJvc3JjID0+ICdwZ19nZXRfbXVsdGl4YWN0X3N0YXRzJworfSwKKwogXQpkaWZmIC0tZ2l0IGEv c3JjL3Rlc3QvaXNvbGF0aW9uL2V4cGVjdGVkL211bHRpeGFjdF9zdGF0cy5vdXQgYi9zcmMvdGVz dC9pc29sYXRpb24vZXhwZWN0ZWQvbXVsdGl4YWN0X3N0YXRzLm91dApuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNTRlMzIzOGQ3MjcKLS0tIC9kZXYvbnVsbAorKysgYi9z cmMvdGVzdC9pc29sYXRpb24vZXhwZWN0ZWQvbXVsdGl4YWN0X3N0YXRzLm91dApAQCAtMCwwICsx LDU5IEBACitQYXJzZWQgdGVzdCBzcGVjIHdpdGggMyBzZXNzaW9ucworCitzdGFydGluZyBwZXJt dXRhdGlvbjogc3RhdHNfaW5pdCBjaGVjayBiZWdpbjEgbG9jazEgYmVnaW4yIGxvY2syIGNoZWNr IGNvbW1pdDEgY29tbWl0MiBjaGVjaworc3RlcCBzdGF0c19pbml0OiAKKyAgICBDUkVBVEUgVEVN UCBUQUJMRSBzdGF0c19iZWZvcmUgQVMgCisgICAgU0VMRUNUIG11bHRpeGFjdHMsIG1lbWJlcnMs IG9sZGVzdF9tdWx0aXhhY3QgRlJPTSBwZ19nZXRfbXVsdGl4YWN0X3N0YXRzKCk7IAorCitzdGVw IGNoZWNrOiAKKyAgICBTRUxFQ1QgCisgICAgICAgIG11bHRpeGFjdHMsCisgICAgICAgIG1lbWJl cnMsCisgICAgICAgIG9sZGVzdF9tdWx0aXhhY3QgCisgICAgRlJPTSBwZ19nZXRfbXVsdGl4YWN0 X3N0YXRzKCk7CisKK211bHRpeGFjdHN8bWVtYmVyc3xvbGRlc3RfbXVsdGl4YWN0CistLS0tLS0t LS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgMHwgICAgICAwfCAgICAgICAg ICAgICAgIDEKKygxIHJvdykKKworc3RlcCBiZWdpbjE6IEJFR0lOOworc3RlcCBsb2NrMTogU0VM RUNUICogRlJPTSBtdWx0aXhhY3RfdGVzdCBXSEVSRSBpZCA9IDEgRk9SIFNIQVJFOworaWR8dmFs CistLSstLS0KKyAxfCAxMAorKDEgcm93KQorCitzdGVwIGJlZ2luMjogQkVHSU47CitzdGVwIGxv Y2syOiBTRUxFQ1QgKiBGUk9NIG11bHRpeGFjdF90ZXN0IFdIRVJFIGlkID0gMSBGT1IgU0hBUkU7 CitpZHx2YWwKKy0tKy0tLQorIDF8IDEwCisoMSByb3cpCisKK3N0ZXAgY2hlY2s6IAorICAgIFNF TEVDVCAKKyAgICAgICAgbXVsdGl4YWN0cywKKyAgICAgICAgbWVtYmVycywKKyAgICAgICAgb2xk ZXN0X211bHRpeGFjdCAKKyAgICBGUk9NIHBnX2dldF9tdWx0aXhhY3Rfc3RhdHMoKTsKKworbXVs dGl4YWN0c3xtZW1iZXJzfG9sZGVzdF9tdWx0aXhhY3QKKy0tLS0tLS0tLS0rLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tCisgICAgICAgICAxfCAgICAgIDN8ICAgICAgICAgICAgICAgMQorKDEgcm93 KQorCitzdGVwIGNvbW1pdDE6IENPTU1JVDsKK3N0ZXAgY29tbWl0MjogQ09NTUlUOworc3RlcCBj aGVjazogCisgICAgU0VMRUNUIAorICAgICAgICBtdWx0aXhhY3RzLAorICAgICAgICBtZW1iZXJz LAorICAgICAgICBvbGRlc3RfbXVsdGl4YWN0IAorICAgIEZST00gcGdfZ2V0X211bHRpeGFjdF9z dGF0cygpOworCittdWx0aXhhY3RzfG1lbWJlcnN8b2xkZXN0X211bHRpeGFjdAorLS0tLS0tLS0t LSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgIDF8ICAgICAgM3wgICAgICAgICAg ICAgICAxCisoMSByb3cpCisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2lzb2xhdGlvbi9zcGVjcy9t dWx0aXhhY3Rfc3RhdHMuc3BlYyBiL3NyYy90ZXN0L2lzb2xhdGlvbi9zcGVjcy9tdWx0aXhhY3Rf c3RhdHMuc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNTNmY2Fk MzhjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9pc29sYXRpb24vc3BlY3MvbXVsdGl4 YWN0X3N0YXRzLnNwZWMKQEAgLTAsMCArMSwzNSBAQAorc2V0dXAKK3sKKyAgICBDUkVBVEUgVEFC TEUgbXVsdGl4YWN0X3Rlc3QoaWQgaW50IFBSSU1BUlkgS0VZLCB2YWwgaW50KTsKKyAgICBJTlNF UlQgSU5UTyBtdWx0aXhhY3RfdGVzdCBWQUxVRVMgKDEsIDEwKTsKK30KKwordGVhcmRvd24KK3sK KyAgICBEUk9QIFRBQkxFIG11bHRpeGFjdF90ZXN0OworfQorCitzZXNzaW9uIHMxCitzdGVwIGJl Z2luMSAgICAgeyBCRUdJTjsgfQorc3RlcCBsb2NrMSAgICAgIHsgU0VMRUNUICogRlJPTSBtdWx0 aXhhY3RfdGVzdCBXSEVSRSBpZCA9IDEgRk9SIFNIQVJFOyB9CitzdGVwIGNvbW1pdDEgICAgeyBD T01NSVQ7IH0KKworc2Vzc2lvbiBzMgorc3RlcCBiZWdpbjIgICAgIHsgQkVHSU47IH0KK3N0ZXAg bG9jazIgICAgICB7IFNFTEVDVCAqIEZST00gbXVsdGl4YWN0X3Rlc3QgV0hFUkUgaWQgPSAxIEZP UiBTSEFSRTsgfQorc3RlcCBjb21taXQyICAgIHsgQ09NTUlUOyB9CisKK3Nlc3Npb24gczMKK3N0 ZXAgc3RhdHNfaW5pdCB7IAorICAgIENSRUFURSBURU1QIFRBQkxFIHN0YXRzX2JlZm9yZSBBUyAK KyAgICBTRUxFQ1QgbXVsdGl4YWN0cywgbWVtYmVycywgb2xkZXN0X211bHRpeGFjdCBGUk9NIHBn X2dldF9tdWx0aXhhY3Rfc3RhdHMoKTsgCit9CitzdGVwIGNoZWNrICAgICAgeworICAgIFNFTEVD VCAKKyAgICAgICAgbXVsdGl4YWN0cywKKyAgICAgICAgbWVtYmVycywKKyAgICAgICAgb2xkZXN0 X211bHRpeGFjdCAKKyAgICBGUk9NIHBnX2dldF9tdWx0aXhhY3Rfc3RhdHMoKTsKK30KKworcGVy bXV0YXRpb24gc3RhdHNfaW5pdCBjaGVjayBiZWdpbjEgbG9jazEgYmVnaW4yIGxvY2syIGNoZWNr IGNvbW1pdDEgY29tbWl0MiBjaGVjawotLSAKMi40Ny4zCgo= --000000000000fded84063b911ca8--