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 1wXINj-003BBK-0c for pgsql-hackers@arkaria.postgresql.org; Wed, 10 Jun 2026 12:50:07 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wXINi-00BR4s-0D for pgsql-hackers@arkaria.postgresql.org; Wed, 10 Jun 2026 12:50:06 +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 1wXINh-00BR4k-29 for pgsql-hackers@lists.postgresql.org; Wed, 10 Jun 2026 12:50:05 +0000 Received: from mail-wr1-x434.google.com ([2a00:1450:4864:20::434]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wXINf-000000020fv-3BWk for pgsql-hackers@lists.postgresql.org; Wed, 10 Jun 2026 12:50:04 +0000 Received: by mail-wr1-x434.google.com with SMTP id ffacd0b85a97d-45eedc94d37so3449863f8f.3 for ; Wed, 10 Jun 2026 05:50:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1781095802; cv=none; d=google.com; s=arc-20240605; b=NiYfiSrN3zKrorHdYQ8kNxCF8QX+lCz7nSp0jNtd7suco+hZegEakXeAyscMLYsx7f YrLK8ZFbQ+fvvGOMT5HCqfavtwb76eQgrFc85tDEiw/3+tKnlr1qjku+LMWnAfT1yjQ6 QNv9Dl+N86vXoC6FxvtuXhpsFGvgvqcRkzwu+zSdFM/bcp7FZEvdNwESepT8wO4glM7f 9iEqK/jHdJKT1FFQZuzJ+MJP948gPRHdClzDW+4tId6PqHEz1Dp+wzTHMOlRDqQDRgT4 qUGNgHDYuGIZ/yZQGKIaWlUauVxtFF4EGCYnEQnZMU0SP45yBARt++BHBtCKJ+KSj/fj gJ9g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=tIMleSBmH2FbQmrkfZ5iBhQ6xRr6I1X64bvvFM+XMOM=; fh=YxBOiVr/XIE2AtM+yKgnp+BPqp5MEATTs3jtCtR8rXQ=; b=Vv23ICB3vpCbRpW/hqEvVGspRqsSFh1/XhtblO17YmdffQpJwg57k4Y5rGEVLgh9vm EAZm2DWvUK9gO2G6CHRFJ0hVjzIR9sYOcwmgwcmGuX7ykQckDsqmcAERK9DrDJOViQ9Y 9uMd1vP5dbWjTE+dhZOpRvIz92gWoZ7XWDp1VUPBJAHHyo0axfPq/fI32UsEvx0u+ic7 MB43Zwtg+Wck+0LGIeFl6JAT6fAWQAMIEXYjasc3gl1sDH41ZnnAzMK//E9nsB+qyE4H WF0jfm1iX3k8gADbk4N2JNGamTos/RXYqemXvjHHEtzKwZ/rXCMn2gMRqXt3VaREkt6R wbnQ==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781095802; x=1781700602; darn=lists.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=tIMleSBmH2FbQmrkfZ5iBhQ6xRr6I1X64bvvFM+XMOM=; b=GuoJ/X5/zELqWW7x1TSOBVQlOU1w6G04mbBE3CH8mSwU2OpRQ/Jfgy96wDcNpoaZq5 Tz3u9pudYKDMr7URp7KQc9cpq8Luevf5sZXH9Bbn4fsbXuzphiEzmPHc/X1GOs1R+axv SvFi+4QmkfwmIQtlV6z4Lr18x+C8Lmg+zKz94ecAYSsl7f0Dh3XHkVafURzKCK8+rdDv PJisFgcE45mQUUi/zZqOVDKuyAHjHLM5HLqZ/FR/HxlWIcU4nVp6FD/s8vhoDQtPlbc2 q0STS+VyNhkb+RhtegVztSHRxJpEbqcIA59pl6WP51gDrYghoetKICBS0aOIVq4HSYXY qt7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781095802; x=1781700602; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=tIMleSBmH2FbQmrkfZ5iBhQ6xRr6I1X64bvvFM+XMOM=; b=lP+2ScX2wC1e5DT6G/nMi6/vJAEQ6CT1B5m8yMukAqevv14GcLMEH/YmaZPKLTF7UM MSUO6egkE5yuHNGWAklPNQbamLApdvlpkQK1eL3Y/I1Fx7lQs8NdXjNxMk/IytBBGMrd 1kErKfAf8b4+ouvFDT/oG+6NaiGfS2XkNmRMHZOfHdTnzxMT4N+qv4ODW/Gj2j4S3nDZ y98cICL39CyjtgIUIw6y+pZ8CIFK+5ktgWd6aSDWsY6Z8ZjSKvPnL27hQ0WB1r2QqJxj nDBA4tW3fgNlMAsOGRZ/St96yUM6r5X4NMkhX7bGYCJP03f7VbN6xbWBZOmTwIjWuV44 TBig== X-Forwarded-Encrypted: i=1; AFNElJ/IJ0E3bc1wk0TNeGgNzrHgvtR1vkIhYecACWvmkYnj46UQEDztNr77DtIRHHftGDVcE1IGKxVPyiBAbe5I@lists.postgresql.org X-Gm-Message-State: AOJu0YzBmsTOnjGShe0z6W0tkdVyD4iCGFXlryMpleL5w7rLOzXbBnBv 0a0v+Bm2Qj+fVwyhkZ/UIRDj48W5bWr5DXAyfvzr7xXZpTxXDhp2O9mPwiejb6VBesNPC8+0V1w Xk+2W8Ll90KHxlpLBKAXxy7Pv7g19USc= X-Gm-Gg: Acq92OGaHWLzxqy4ABZk0nji6/bYeDjhcZ9DTCJiIMF0yfmatzxz273jILO8zorWYh9 eIV6wc3lwLmjNDEjm/Ba88zgMU41oApGC4lzrxHHDDjhBHiuH4iLw4i+DHzIPiGTE+BXqcPHVlT Pa2BcKw88qfjtTONhdQUu7/rSfRi412FYHUK2G1XsDHfuRy/R/VQ6EqaVBDPiNPfHkkKIzl/nKe tVgQ/t4kdOpfRZA0ufxh0r3x7OgRiJqplPInfGVzvjWr0tGOX+l0dH8Xz1Z3xhXk39TLcJ1Ip+3 szm/E8dOLDDu9wjWbYfx2/V00ddd9Ov7KLsMHHof47im8e/aXh7NIDOqi2abpXChvgb9BgZa+6x CX1JJ2P7CSzxskxtKDzbHhNs3KqYfPRNMUyTYUmRPGJ1LCLRh3EpNXzPnvbffDIk= X-Received: by 2002:a5d:5850:0:b0:460:1f34:cf80 with SMTP id ffacd0b85a97d-46056690b39mr9969837f8f.18.1781095802117; Wed, 10 Jun 2026 05:50:02 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Ashutosh Bapat Date: Wed, 10 Jun 2026 18:19:49 +0530 X-Gm-Features: AVVi8CcosKRsJvnUkR1xaMI4S3XsQicP90-VMERl4rmod6eJvcJqjpn5CtJSvas Message-ID: Subject: Re: [Bug] Add the missing RTE_GRAPH_TABLE case to transformLockingClause() To: Ayush Tiwari Cc: Peter Eisentraut , SATYANARAYANA NARLAPURAM , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="00000000000098c53e0653e5aeae" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000098c53e0653e5aeae Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Jun 10, 2026 at 1:03=E2=80=AFAM Ayush Tiwari wrote: > > Hi, > > On Wed, 13 May 2026 at 10:57, Ashutosh Bapat wrote: >> >> > Repro: >> > >> > CREATE TABLE v(id int PRIMARY KEY, vname text); >> > CREATE PROPERTY GRAPH g VERTEX TABLES (v); >> > SELECT * FROM GRAPH_TABLE(g MATCH (a) COLUMNS (a.vname)) gt >> > FOR UPDATE OF gt; >> > -- ERROR: unrecognized RTE type: 8 >> > >> > Attached a patch that returns ERRCODE_FEATURE_NOT_SUPPORTED "FOR ... c= annot be >> > applied to a GRAPH_TABLE" with a position pointer, matching the conven= tion used by >> > the function/tablefunc etc. >> >> In a fully matured SQL/PGQ support, a row mark on GRAPH_TABLE should >> be pushed down to the resulting subqueries in rewriteGraphTable(). I >> see this similar to how the row mark is pushed down into views during >> the rewrite phase. I don't think the code changes will be massive, it >> will be a matter of invoking markQueryForLocking() on the query that >> replaces the graph pattern in rewriteGraphTable(). I am not sure >> whether we want to do that now when stabilizing the feature. Peter, >> what do you think? > > > I wanted to implement this by trying to push FOR UPDATE/SHARE > down into the relational tables underlying the GRAPH_TABLE (the > "fully matured SQL/PGQ" direction mentioned). But had > some doubts around the implementation. > > I'd like input on a few design questions from you/Peter/hackers: > > Q1. Is the right place to do the pushdown rewriteGraphTable(), > mirroring what ApplyRetrieveRule() does for views (i.e. call > markQueryForLocking() on the freshly built subquery)? That > would require exposing markQueryForLocking() outside > rewriteHandler.c. That's right. I think making markQueryForLocking non-static is fine since we are using it in rewriter code itself. > > Q2. How should FOR UPDATE behave when the MATCH expands to more > than one path and rewriteGraphTable() produces a UNION? > markQueryForLocking() refuses to descend into set-operations, > same as it does for views. Options: > (a) reject FOR UPDATE on multi-path MATCH with a clear > "cannot lock rows from a set-operation result" error, > matching the view behaviour; > (b) silently fall back to the current > "raise relation lock only" behaviour and document it. > I think it should be (a). > Building a UNION query is an implementation artifact of GRAPH_TABLE, locking clause should not depend upon it. I think we should build the subqueries within the setop with a locking clause of their own. That's supported. > Q3. SQL/PGQ does not really define UPDATE/DELETE semantics for > graph paths. Is the intent here that FOR UPDATE/SHARE on > GRAPH_TABLE is purely a concurrency hint rather than a > precursor to UPDATE WHERE CURRENT OF? If so, that should > probably be documented next to the GRAPH_TABLE syntax in > the SQL reference. > I don't understand the WHERE CURRENT OF reference here. FOR UPDATE/SHARE is generally used with an intent of locking the read rows so that they don't get modified while the transaction is in progress. One can use just UPDATE to update the FOR UPDATE locked rows as well. >> >> If we decide to not to support it, the code changes look on the right >> path. We need to update the following comment which appears earlier in >> the function to mention GRAPH_TABLE, /* ignore JOIN, SPECIAL, >> FUNCTION, VALUES, CTE RTEs */. I think it will be better to specify >> that this restriction is temporary in the comments at both the places; >> but that's arguable. >> >> > Patch includes tests for all four locking strengths. >> > Since the code path looks simple we can just keep one of them as well = and trim other >> > tests. Thoughts? >> >> I don't think we need all the four tests, but we need a test for >> locking clause without relation since that takes a different code >> path. > > > Attached is v2-0001, rebased on master and addressing > the comments you added in case we plan on parking the feature > work for once v20 opens. Thanks. I revised it a bit. Reworded the commit message to describe user facing behaviour instead of the internals, which are quite obvious from the code changes. Other cases in transformLockingClause() don't mention XXX, they just have ereport(). Removed that comment. Also massaged comments in the test - we usually don't describe the expected behaviour or error when it is obvious from the output. Attached revised patch. --=20 Best Wishes, Ashutosh Bapat --00000000000098c53e0653e5aeae Content-Type: text/x-patch; charset="US-ASCII"; name="v20260610-0009-Prohibit-Locking-Clauses-on-GRAPH_TABLE.patch" Content-Disposition: attachment; filename="v20260610-0009-Prohibit-Locking-Clauses-on-GRAPH_TABLE.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mq81s36b0 RnJvbSBhMmYyYmYyZGFkZDY3MGIzY2RmNDUyYWJjZWQxY2JiZDRjOTliMzczIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBeXVzaCBUaXdhcmkgPGF5dXNodGl3YXJpLnNsZzAxQGdtYWls LmNvbT4KRGF0ZTogVHVlLCA5IEp1biAyMDI2IDIwOjE0OjEzICswNTMwClN1YmplY3Q6IFtQQVRD SCB2MjAyNjA2MTAgOS85XSBQcm9oaWJpdCBMb2NraW5nIENsYXVzZXMgb24gR1JBUEhfVEFCTEUK ClNwZWNpZnlpbmcgYSBsb2NraW5nIGNsYXVzZSAoRk9SIFVQREFURS9TSEFSRSkgdGhhdCBuYW1l cyBhIEdSQVBIX1RBQkxFCmFsaWFzIGN1cnJlbnRseSByZXN1bHRzIGluIGFuIHVuaGVscGZ1bCAi dW5yZWNvZ25pemVkIFJURSB0eXBlOiA4IgplcnJvci4gVGhpcyBjb21taXQgZXhwbGljaXRseSBw cm9oaWJpdHMgc3BlY2lmeWluZyBhIGxvY2tpbmcgY2xhdXNlIG9uIGEKR1JBUEhfVEFCTEUgYWxp YXMsIHJhaXNpbmcgYSBtb3JlIHVzZXItZnJpZW5kbHkgIkZPUiAuLi4gY2Fubm90IGJlCmFwcGxp ZWQgdG8gYSBHUkFQSF9UQUJMRSIgZXJyb3IgaW5zdGVhZC4KCkF1dGhvcjogU0FUWUFOQVJBWUFO QSBOQVJMQVBVUkFNIDxzYXR5YW5hcmxhcHVyYW1AZ21haWwuY29tPgpBdXRob3I6IEF5dXNoIFRp d2FyaSA8YXl1c2h0aXdhcmkuc2xnMDFAZ21haWwuY29tPgpSZXBvcnRlZC1ieTogU0FUWUFOQVJB WUFOQSBOQVJMQVBVUkFNIDxzYXR5YW5hcmxhcHVyYW1AZ21haWwuY29tPgpSZXZpZXdlZC1ieTog QXNodXRvc2ggQmFwYXQgPGFzaHV0b3NoLmJhcGF0Lm9zc0BnbWFpbC5jb20+CkRpc2N1c3Npb246 IGh0dHBzOi8vcG9zdGdyLmVzL20vQ0FIZyUyQlFEY0U5d3A2bk9FQzNTQ1JROTBuckNPJTNEUUYl MkJPWnExTUc4UWM2aG51c21vZ3F3JTQwbWFpbC5nbWFpbC5jb20KLS0tCiBzcmMvYmFja2VuZC9w YXJzZXIvYW5hbHl6ZS5jICAgICAgICAgICAgICB8IDE1ICsrKysrKysrKysrKysrLQogc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9ncmFwaF90YWJsZS5vdXQgfCAxMyArKysrKysrKysrKysrCiBz cmMvdGVzdC9yZWdyZXNzL3NxbC9ncmFwaF90YWJsZS5zcWwgICAgICB8ICA0ICsrKysKIDMgZmls ZXMgY2hhbmdlZCwgMzEgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQoKZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL3BhcnNlci9hbmFseXplLmMgYi9zcmMvYmFja2VuZC9wYXJzZXIvYW5hbHl6 ZS5jCmluZGV4IDkzZmE2NmFlNTdjLi5mNzYyYjY1M2U3NyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvcGFyc2VyL2FuYWx5emUuYworKysgYi9zcmMvYmFja2VuZC9wYXJzZXIvYW5hbHl6ZS5jCkBA IC0zODY2LDcgKzM4NjYsMTEgQEAgdHJhbnNmb3JtTG9ja2luZ0NsYXVzZShQYXJzZVN0YXRlICpw c3RhdGUsIFF1ZXJ5ICpxcnksIExvY2tpbmdDbGF1c2UgKmxjLAogCQkJCQkJCQkJCSAgIGFsbHJl bHMsIHRydWUpOwogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgotCQkJCQkvKiBpZ25vcmUgSk9J TiwgU1BFQ0lBTCwgRlVOQ1RJT04sIFZBTFVFUywgQ1RFIFJURXMgKi8KKworCQkJCQkvKgorCQkJ CQkgKiBpZ25vcmUgSk9JTiwgU1BFQ0lBTCwgRlVOQ1RJT04sIFZBTFVFUywgQ1RFLAorCQkJCQkg KiBHUkFQSF9UQUJMRQorCQkJCQkgKi8KIAkJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTQwMDEs NiArNDAwNSwxNSBAQCB0cmFuc2Zvcm1Mb2NraW5nQ2xhdXNlKFBhcnNlU3RhdGUgKnBzdGF0ZSwg UXVlcnkgKnFyeSwgTG9ja2luZ0NsYXVzZSAqbGMsCiAJCQkJCQkJCQkJCUxDU19hc1N0cmluZyhs Yy0+c3RyZW5ndGgpKSwKIAkJCQkJCQkJCSBwYXJzZXJfZXJycG9zaXRpb24ocHN0YXRlLCB0aGlz cmVsLT5sb2NhdGlvbikpKTsKIAkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgUlRFX0dSQVBIX1RB QkxFOgorCQkJCQkJCWVyZXBvcnQoRVJST1IsCisJCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZF QVRVUkVfTk9UX1NVUFBPUlRFRCksCisJCQkJCQkJLyotLS0tLS0KKwkJCQkJCQkgIHRyYW5zbGF0 b3I6ICVzIGlzIGEgU1FMIHJvdyBsb2NraW5nIGNsYXVzZSBzdWNoIGFzIEZPUiBVUERBVEUgKi8K KwkJCQkJCQkJCSBlcnJtc2coIiVzIGNhbm5vdCBiZSBhcHBsaWVkIHRvIGEgR1JBUEhfVEFCTEUi LAorCQkJCQkJCQkJCQlMQ1NfYXNTdHJpbmcobGMtPnN0cmVuZ3RoKSksCisJCQkJCQkJCQkgcGFy c2VyX2VycnBvc2l0aW9uKHBzdGF0ZSwgdGhpc3JlbC0+bG9jYXRpb24pKSk7CisJCQkJCQkJYnJl YWs7CiAKIAkJCQkJCQkvKiBTaG91bGRuJ3QgYmUgcG9zc2libGUgdG8gc2VlIFJURV9SRVNVTFQg aGVyZSAqLwogCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2dyYXBoX3Rh YmxlLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZ3JhcGhfdGFibGUub3V0CmluZGV4 IGMyMjkyMTJjYjUxLi5jMDYyMmFiNzIzNCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9ncmFwaF90YWJsZS5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9n cmFwaF90YWJsZS5vdXQKQEAgLTExMjksNCArMTEyOSwxNyBAQCBTRUxFQ1Qgc3JjLnZuYW1lLCBj b3VudCgqKSBGUk9NIHYxIEFTIHNyYwogIHYxMyAgIHwgICAgIDEKICgzIHJvd3MpCiAKKy0tIExv Y2tpbmcgY2xhdXNlIG9uIEdSQVBIX1RBQkxFCitTRUxFQ1QgKiBGUk9NIEdSQVBIX1RBQkxFIChn MSBNQVRDSCAoc3JjIElTIHZsMSkgQ09MVU1OUyAoc3JjLnZuYW1lKSkgZ3QgRk9SIFVQREFURSBP RiBndDsgIC0tIG5vdCBzdXBwb3J0ZWQKK0VSUk9SOiAgRk9SIFVQREFURSBjYW5ub3QgYmUgYXBw bGllZCB0byBhIEdSQVBIX1RBQkxFCitMSU5FIDE6IC4uLk1BVENIIChzcmMgSVMgdmwxKSBDT0xV TU5TIChzcmMudm5hbWUpKSBndCBGT1IgVVBEQVRFIE9GIGd0OworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCitTRUxF Q1QgKiBGUk9NIEdSQVBIX1RBQkxFIChnMSBNQVRDSCAoc3JjIElTIHZsMSkgQ09MVU1OUyAoc3Jj LnZuYW1lKSkgZ3QgRk9SIFVQREFURTsgLS0gaWdub3JlZAorIHZuYW1lIAorLS0tLS0tLQorIHYx MQorIHYxMgorIHYxMworKDMgcm93cykKKwogLS0gbGVhdmUgdGhlIG9iamVjdHMgYmVoaW5kIGZv ciBwZ191cGdyYWRlL3BnX2R1bXAgdGVzdHMKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mv c3FsL2dyYXBoX3RhYmxlLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2dyYXBoX3RhYmxlLnNx bAppbmRleCBlMzBjOTA4ZGNjYy4uNDM3ZmIzYjAxZjIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL2dyYXBoX3RhYmxlLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9ncmFw aF90YWJsZS5zcWwKQEAgLTYzNyw0ICs2MzcsOCBAQCBTRUxFQ1Qgc3JjLnZuYW1lLCBjb3VudCgq KSBGUk9NIHYxIEFTIHNyYwogICBIQVZJTkcgY291bnQoKikgPj0gKFNFTEVDVCBjb3VudCgqKSBG Uk9NIEdSQVBIX1RBQkxFIChnMSBNQVRDSCAoYSBJUyB2bDEgfCB2bDIpIENPTFVNTlMgKGEudm5h bWUgQVMgbikpIFdIRVJFIG4gPSBzcmMudm5hbWUpCiAgIE9SREVSIEJZIHZuYW1lOwogCistLSBM b2NraW5nIGNsYXVzZSBvbiBHUkFQSF9UQUJMRQorU0VMRUNUICogRlJPTSBHUkFQSF9UQUJMRSAo ZzEgTUFUQ0ggKHNyYyBJUyB2bDEpIENPTFVNTlMgKHNyYy52bmFtZSkpIGd0IEZPUiBVUERBVEUg T0YgZ3Q7ICAtLSBub3Qgc3VwcG9ydGVkCitTRUxFQ1QgKiBGUk9NIEdSQVBIX1RBQkxFIChnMSBN QVRDSCAoc3JjIElTIHZsMSkgQ09MVU1OUyAoc3JjLnZuYW1lKSkgZ3QgRk9SIFVQREFURTsgLS0g aWdub3JlZAorCiAtLSBsZWF2ZSB0aGUgb2JqZWN0cyBiZWhpbmQgZm9yIHBnX3VwZ3JhZGUvcGdf ZHVtcCB0ZXN0cwotLSAKMi4zNC4xCgo= --00000000000098c53e0653e5aeae--