Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1gI7qf-00063j-Bu for pgsql-hackers@arkaria.postgresql.org; Thu, 01 Nov 2018 07:57:01 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1gI7qc-0004rm-Sd for pgsql-hackers@arkaria.postgresql.org; Thu, 01 Nov 2018 07:56:58 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1gI7qc-0004rf-JT for pgsql-hackers@lists.postgresql.org; Thu, 01 Nov 2018 07:56:58 +0000 Received: from lb3-smtp-cloud9.xs4all.net ([194.109.24.30]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1gI7qX-0000sb-21 for pgsql-hackers@postgresql.org; Thu, 01 Nov 2018 07:56:58 +0000 Received: from webmailclassic.xs4all.nl ([IPv6:2001:888:0:22:194:109:20:208]) by smtp-cloud9.xs4all.net with ESMTPA id I7qSgLZnaSskCI7qSgwveL; Thu, 01 Nov 2018 08:56:51 +0100 Received: from 2001:983:39b6:1:3d17:1a27:9300:59df by webmailclassic.xs4all.nl with HTTP (HTTP/1.1 POST); Thu, 01 Nov 2018 08:56:48 +0100 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_b0f821593ccd8cb2d9327186e98632f2" Date: Thu, 01 Nov 2018 08:56:48 +0100 From: Erik Rijkers To: Euler Taveira Cc: pgsql-hackers , Suzuki Hironobu Subject: Re: row filtering for logical replication In-Reply-To: References: Message-ID: <37d16603194380f43b0630ee1357d46f@xs4all.nl> X-Sender: er@xs4all.nl User-Agent: XS4ALL Webmail X-CMAE-Envelope: MS4wfLnLWtX5vsrUZkJNf6HSmTin0kH0//+hlrl1KHRhT85mvhnICfqSRjzfjMmlt3X1kRxWrhpbWrLVcZSZxleDyAejTmV4C/nH9B4hLCNa3LS0icZk5MEO AVYTXxQSdRabPkA8oYOQPQa3voXcZ3Fs9LpGihQhlTQqc/Xr1EaIcscLleGp9V7SIv9+qwQzgpcdFtnchM5JjqRzSkZfHd8JLg/uLlCNxmCW7ESxi4DakMPg nO68k2hkc1LtqdSgahqcu2vJShnrxP0s6I/o9kbecKLVMn2TPg02wdYNW8pVCo6M List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --=_b0f821593ccd8cb2d9327186e98632f2 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed On 2018-11-01 01:29, Euler Taveira wrote: > Em qua, 28 de fev de 2018 às 20:03, Euler Taveira > escreveu: >> The attached patches add support for filtering rows in the publisher. >> I ran pgbench-over-logical-replication with a WHERE-clause and could not get this to do a correct replication. Below is the output of the attached test program. $ ./logrep_rowfilter.sh -- /home/aardvark/pg_stuff/pg_installations/pgsql.logrep_rowfilter/bin.fast/initdb --pgdata=/tmp/cascade/instance1/data --encoding=UTF8 --pwfile=/tmp/bugs -- /home/aardvark/pg_stuff/pg_installations/pgsql.logrep_rowfilter/bin.fast/initdb --pgdata=/tmp/cascade/instance2/data --encoding=UTF8 --pwfile=/tmp/bugs -- /home/aardvark/pg_stuff/pg_installations/pgsql.logrep_rowfilter/bin.fast/initdb --pgdata=/tmp/cascade/instance3/data --encoding=UTF8 --pwfile=/tmp/bugs sleep 3s dropping old tables... creating tables... generating data... 100000 of 100000 tuples (100%) done (elapsed 0.09 s, remaining 0.00 s) vacuuming... creating primary keys... done. create publication pub_6515_to_6516; alter publication pub_6515_to_6516 add table pgbench_accounts where (aid between 40000 and 60000-1) ; --> where 1 alter publication pub_6515_to_6516 add table pgbench_branches; alter publication pub_6515_to_6516 add table pgbench_tellers; alter publication pub_6515_to_6516 add table pgbench_history; create publication pub_6516_to_6517; alter publication pub_6516_to_6517 add table pgbench_accounts ; -- where (aid between 40000 and 60000-1) ; --> where 2 alter publication pub_6516_to_6517 add table pgbench_branches; alter publication pub_6516_to_6517 add table pgbench_tellers; alter publication pub_6516_to_6517 add table pgbench_history; create subscription pub_6516_from_6515 connection 'port=6515 application_name=rowfilter' publication pub_6515_to_6516 with(enabled=false); alter subscription pub_6516_from_6515 enable; create subscription pub_6517_from_6516 connection 'port=6516 application_name=rowfilter' publication pub_6516_to_6517 with(enabled=false); alter subscription pub_6517_from_6516 enable; -- pgbench -p 6515 -c 16 -j 8 -T 5 -n postgres # scale 1 transaction type: scaling factor: 1 query mode: simple number of clients: 16 number of threads: 8 duration: 5 s number of transactions actually processed: 80 latency average = 1178.106 ms tps = 13.581120 (including connections establishing) tps = 13.597443 (excluding connections establishing) accounts branches tellers history --------- --------- --------- --------- 6515 6546b1f0f 2d328ed28 7406473b0 7c1351523 e8c07347b 6516 6546b1f0f 2d328ed28 d41d8cd98 d41d8cd98 e7235f541 6517 f7c0791c8 d9c63e471 d41d8cd98 d41d8cd98 30892eea1 NOK 6515 6546b1f0f 2d328ed28 7406473b0 7c1351523 e8c07347b 6516 6546b1f0f 2d328ed28 7406473b0 5a54cf7c5 191ae1af3 6517 6546b1f0f 2d328ed28 7406473b0 5a54cf7c5 191ae1af3 NOK 6515 6546b1f0f 2d328ed28 7406473b0 7c1351523 e8c07347b 6516 6546b1f0f 2d328ed28 7406473b0 5a54cf7c5 191ae1af3 6517 6546b1f0f 2d328ed28 7406473b0 5a54cf7c5 191ae1af3 NOK [...] I let that run for 10 minutes or so but that pgbench_history table md5-values (of ports 6516 and 6517) do not change anymore, which shows that it is and remains different from the original pgbench_history table in 6515. When there is a where-clause this goes *always* wrong. Without a where-clause all logical replication tests were OK. Perhaps the error is not in our patch but something in logical replication. Attached is the test program (will need some tweaking of PATHs, PG-variables (PGPASSFILE) etc). This is the same program I used in march when you first posted a version of this patch alhough the error is different. thanks, Erik Rijkers --=_b0f821593ccd8cb2d9327186e98632f2 Content-Transfer-Encoding: base64 Content-Type: text/x-shellscript; name=logrep_rowfilter.sh Content-Disposition: attachment; filename=logrep_rowfilter.sh; size=6987 IyEvYmluL2Jhc2gKCiMgcG9zdGdyZXMgYmluYXJ5IGNvbXBpbGVkIHdpdGggCiMKIyAyMDE4MTEw MQojICAgMDAwMS1SZW1vdmUtdW51c2VkLWF0dHR5cG1vZC1jb2x1bW4tZnJvbS1pbml0aWFsLXRh YmxlLXN5LnBhdGNoCiMgICAwMDAyLVN0b3JlLW51bWJlci1vZi10dXBsZXMtaW4tV2FsUmN2RXhl Y1Jlc3VsdC5wYXRjaAojICAgMDAwMy1SZWZhY3Rvci1mdW5jdGlvbi1jcmVhdGVfZXN0YXRlX2Zv cl9yZWxhdGlvbi5wYXRjaAojICAgMDAwNC1SZW5hbWUtYS1XSEVSRS1ub2RlLnBhdGNoCiMgICAw MDA1LVJvdy1maWx0ZXJpbmctZm9yLWxvZ2ljYWwtcmVwbGljYXRpb24ucGF0Y2gKIyAgIDAwMDYt UHJpbnQtcHVibGljYXRpb24tV0hFUkUtY29uZGl0aW9uLWluLXBzcWwucGF0Y2gKIyAgIDAwMDct UHVibGljYXRpb24td2hlcmUtY29uZGl0aW9uLXN1cHBvcnQtZm9yLXBnX2R1bXAucGF0Y2gKIyAg IDAwMDgtRGVidWctZm9yLXJvdy1maWx0ZXJpbmcucGF0Y2gKIwoKdW5zZXQgUEdEQVRBQkFTRSBQ R1BPUlQgUEdTRVJWSUNFCmV4cG9ydCBQR0RBVEFCQVNFPXBvc3RncmVzCgpzY2FsZT0xCgpyb290 X2Rpcj0vdG1wL2Nhc2NhZGUKCkJJTj0kSE9NRS9wZ19zdHVmZi9wZ19pbnN0YWxsYXRpb25zL3Bn c3FsLmxvZ3JlcF9yb3dmaWx0ZXIvYmluLmZhc3QKCmV4cG9ydCBQQVRIPSRCSU46JFBBVEgKCiAg aW5pdGRiPSRCSU4vaW5pdGRiCnBvc3RncmVzPSRCSU4vcG9zdGdyZXMKICBwZ19jdGw9JEJJTi9w Z19jdGwKYmFzZXBvcnQ9NjUxNQogYXBwbmFtZT1yb3dmaWx0ZXIKCmlmIFtbIC1kICRyb290X2Rp ci9pbnN0YW5jZTEgXV07IHRoZW4gcm0gLXJmICRyb290X2Rpci9pbnN0YW5jZTE7IGZpCmlmIFtb IC1kICRyb290X2Rpci9pbnN0YW5jZTIgXV07IHRoZW4gcm0gLXJmICRyb290X2Rpci9pbnN0YW5j ZTI7IGZpCmlmIFtbIC1kICRyb290X2Rpci9pbnN0YW5jZTMgXV07IHRoZW4gcm0gLXJmICRyb290 X2Rpci9pbnN0YW5jZTM7IGZpCmlmIFtbIC1kICRyb290X2Rpci9pbnN0YW5jZTEgXV07IHRoZW4g ZXhpdCA7IGZpCmlmIFtbIC1kICRyb290X2Rpci9pbnN0YW5jZTIgXV07IHRoZW4gZXhpdCA7IGZp CmlmIFtbIC1kICRyb290X2Rpci9pbnN0YW5jZTMgXV07IHRoZW4gZXhpdCA7IGZpCgpkZXZlbF9m aWxlPS90bXAvYnVncwplY2hvIGZpbHRlcmJ1Zz4kZGV2ZWxfZmlsZQoKbnVtX2luc3RhbmNlcz0z Cgpmb3IgbiBpbiBgc2VxIDEgJG51bV9pbnN0YW5jZXNgCmRvCiAgaW5zdGFuY2U9aW5zdGFuY2Uk bgogIHNlcnZlcl9kaXI9JHJvb3RfZGlyLyRpbnN0YW5jZQogIGRhdGFfZGlyPSRzZXJ2ZXJfZGly L2RhdGEKICBwb3J0PSQoKCA2NTE1ICsgJG4gLTEgKSkKICBsb2dmaWxlPSRzZXJ2ZXJfZGlyL2xv Z2ZpbGUuJHBvcnQKICBlY2hvICItLSAkaW5pdGRiIC0tcGdkYXRhPSRkYXRhX2RpciAtLWVuY29k aW5nPVVURjggLS1wd2ZpbGU9JGRldmVsX2ZpbGUgIgogICAgICAgICAgICRpbml0ZGIgLS1wZ2Rh dGE9JGRhdGFfZGlyIC0tZW5jb2Rpbmc9VVRGOCAtLXB3ZmlsZT0kZGV2ZWxfZmlsZSAgJj4gL2Rl di9udWxsCiAgKCAkcG9zdGdyZXMgIC1EICRkYXRhX2RpciAtcCAkcG9ydCBcCiAgICAtLXdhbF9s ZXZlbD1sb2dpY2FsIC0tbG9nZ2luZ19jb2xsZWN0b3I9b24gXAogICAgLS1jbGllbnRfbWluX21l c3NhZ2VzPXdhcm5pbmcgXAogICAgLS1sb2dfZGlyZWN0b3J5PSRzZXJ2ZXJfZGlyIC0tbG9nX2Zp bGVuYW1lPWxvZ2ZpbGUuJHtwb3J0fSBcCiAgICAtLWxvZ19yZXBsaWNhdGlvbl9jb21tYW5kcz1v biAmICkgJj4gL2Rldi9udWxsCmRvbmUgCgplY2hvICJzbGVlcCAzcyIKc2xlZXAgMwoKZWNobyAi CiAgZHJvcCB0YWJsZSBpZiBleGlzdHMgcGdiZW5jaF9hY2NvdW50czsKICBkcm9wIHRhYmxlIGlm IGV4aXN0cyBwZ2JlbmNoX2JyYW5jaGVzOwogIGRyb3AgdGFibGUgaWYgZXhpc3RzIHBnYmVuY2hf dGVsbGVyczsKICBkcm9wIHRhYmxlIGlmIGV4aXN0cyBwZ2JlbmNoX2hpc3Rvcnk7IiB8IHBzcWwg LXFYcCA2NTE1IFwKJiYgZWNobyAiCiAgZHJvcCB0YWJsZSBpZiBleGlzdHMgcGdiZW5jaF9hY2Nv dW50czsKICBkcm9wIHRhYmxlIGlmIGV4aXN0cyBwZ2JlbmNoX2JyYW5jaGVzOwogIGRyb3AgdGFi bGUgaWYgZXhpc3RzIHBnYmVuY2hfdGVsbGVyczsKICBkcm9wIHRhYmxlIGlmIGV4aXN0cyBwZ2Jl bmNoX2hpc3Rvcnk7IiB8IHBzcWwgLXFYcCA2NTE2IFwKJiYgcGdiZW5jaCAtcCA2NTE1IC1xaXMg JHNjYWxlIFwKJiYgZWNobyAiYWx0ZXIgdGFibGUgcGdiZW5jaF9oaXN0b3J5IGFkZCBjb2x1bW4g aGlkIHNlcmlhbCBwcmltYXJ5IGtleTsiIFwKICB8IHBzcWwgLXExWHAgNjUxNSAmJiBwZ19kdW1w IC1GIGMgLXAgNjUxNSBcCiAgICAgLS1leGNsdWRlLXRhYmxlLWRhdGE9cGdiZW5jaF9oaXN0b3J5 ICBcCiAgICAgLS1leGNsdWRlLXRhYmxlLWRhdGE9cGdiZW5jaF9hY2NvdW50cyBcCiAgICAgLS1l eGNsdWRlLXRhYmxlLWRhdGE9cGdiZW5jaF9icmFuY2hlcyBcCiAgICAgLS1leGNsdWRlLXRhYmxl LWRhdGE9cGdiZW5jaF90ZWxsZXJzICBcCiAgIC10IHBnYmVuY2hfaGlzdG9yeSAtdCBwZ2JlbmNo X2FjY291bnRzIFwKICAgLXQgcGdiZW5jaF9icmFuY2hlcyAtdCBwZ2JlbmNoX3RlbGxlcnMgXAog IHwgcGdfcmVzdG9yZSAtMSAtcCA2NTE2IC1kIHBvc3RncmVzCgogICB3aGVyZT0id2hlcmUgKGFp ZCBiZXR3ZWVuIDQwMDAwIGFuZCA2MDAwMC0xKSIKICB3aGVyZTI9IndoZXJlIChhaWQgYmV0d2Vl biA0MDAwMCBhbmQgNjAwMDAtMSkiCgogIG91dGNvbW1lbnQ9JzsgLS0nCgppZiBbWyAkbnVtX2lu c3RhbmNlcyAtZXEgMyBdXTsgdGhlbgoKICBwZ19kdW1wIC1GIGMgLXAgNjUxNSBcCiAgICAgLS1l eGNsdWRlLXRhYmxlLWRhdGE9cGdiZW5jaF9oaXN0b3J5ICBcCiAgICAgLS1leGNsdWRlLXRhYmxl LWRhdGE9cGdiZW5jaF9hY2NvdW50cyBcCiAgICAgLS1leGNsdWRlLXRhYmxlLWRhdGE9cGdiZW5j aF9icmFuY2hlcyBcCiAgICAgLS1leGNsdWRlLXRhYmxlLWRhdGE9cGdiZW5jaF90ZWxsZXJzICBc CiAgICAgLXQgcGdiZW5jaF9oaXN0b3J5IC10IHBnYmVuY2hfYWNjb3VudHMgXAogICAgIC10IHBn YmVuY2hfYnJhbmNoZXMgLXQgcGdiZW5jaF90ZWxsZXJzIFwKICB8IHBnX3Jlc3RvcmUgLTEgLXAg NjUxNyAtZCBwb3N0Z3JlcwpmaQpwdWIxPXB1Yl82NTE1X3RvXzY1MTYgc3ViMT1wdWJfNjUxNl9m cm9tXzY1MTUKcHViMj1wdWJfNjUxNl90b182NTE3IHN1YjI9cHViXzY1MTdfZnJvbV82NTE2CmVj aG8gIgpjcmVhdGUgcHVibGljYXRpb24gJHB1YjE7CmFsdGVyIHB1YmxpY2F0aW9uICRwdWIxIGFk ZCB0YWJsZSBwZ2JlbmNoX2FjY291bnRzICR3aGVyZSA7IC0tPiB3aGVyZSAxCmFsdGVyIHB1Ymxp Y2F0aW9uICRwdWIxIGFkZCB0YWJsZSBwZ2JlbmNoX2JyYW5jaGVzOwphbHRlciBwdWJsaWNhdGlv biAkcHViMSBhZGQgdGFibGUgcGdiZW5jaF90ZWxsZXJzOwphbHRlciBwdWJsaWNhdGlvbiAkcHVi MSBhZGQgdGFibGUgcGdiZW5jaF9oaXN0b3J5OwoiIHwgcHNxbCAtcCA2NTE1IC1hcXRBWAoKCmlm IFtbICRudW1faW5zdGFuY2VzIC1lcSAzIF1dOyB0aGVuCiAgZWNobyAiCmNyZWF0ZSBwdWJsaWNh dGlvbiAkcHViMjsKYWx0ZXIgcHVibGljYXRpb24gJHB1YjIgYWRkIHRhYmxlIHBnYmVuY2hfYWNj b3VudHMgJG91dGNvbW1lbnQgJHdoZXJlMiA7IC0tPiB3aGVyZSAyCmFsdGVyIHB1YmxpY2F0aW9u ICRwdWIyIGFkZCB0YWJsZSBwZ2JlbmNoX2JyYW5jaGVzOwphbHRlciBwdWJsaWNhdGlvbiAkcHVi MiBhZGQgdGFibGUgcGdiZW5jaF90ZWxsZXJzOwphbHRlciBwdWJsaWNhdGlvbiAkcHViMiBhZGQg dGFibGUgcGdiZW5jaF9oaXN0b3J5OwogICIgfCBwc3FsIC1wIDY1MTYgLWFxdEFYCmZpCgplY2hv ICIKY3JlYXRlIHN1YnNjcmlwdGlvbiAkc3ViMSBjb25uZWN0aW9uICdwb3J0PTY1MTUgYXBwbGlj YXRpb25fbmFtZT0kYXBwbmFtZScKICAgICAgIHB1YmxpY2F0aW9uICRwdWIxIHdpdGgoZW5hYmxl ZD1mYWxzZSk7CmFsdGVyIHN1YnNjcmlwdGlvbiAkc3ViMSBlbmFibGU7IiB8IHBzcWwgLXAgNjUx NiAtYXF0QVgKCmlmIFtbICRudW1faW5zdGFuY2VzIC1lcSAzIF1dOyB0aGVuCmVjaG8gIgpjcmVh dGUgc3Vic2NyaXB0aW9uICRzdWIyIGNvbm5lY3Rpb24gJ3BvcnQ9NjUxNiBhcHBsaWNhdGlvbl9u YW1lPSRhcHBuYW1lJwogICAgICAgcHVibGljYXRpb24gJHB1YjIgd2l0aChlbmFibGVkPWZhbHNl KTsKYWx0ZXIgc3Vic2NyaXB0aW9uICRzdWIyIGVuYWJsZTsiIHwgcHNxbCAtcCA2NTE3IC1hcXRB WAoKZmkKCmVjaG8gIi0tIHBnYmVuY2ggLXAgNjUxNSAtYyAxNiAtaiA4IC1UIDUgLW4gcG9zdGdy ZXMgICAgIyAgc2NhbGUgJHNjYWxlIgogICAgICAgICBwZ2JlbmNoIC1wIDY1MTUgLWMgMTYgLWog OCAtVCA1IC1uIHBvc3RncmVzICAgICMgIHNjYWxlICRzY2FsZQplY2hvCgplY2hvICIgICAgICAg YWNjb3VudHMgIGJyYW5jaGVzICAgdGVsbGVycyAgIGhpc3RvcnkiCmVjaG8gIiAgICAgICAtLS0t LS0tLS0gLS0tLS0tLS0tIC0tLS0tLS0tLSAtLS0tLS0tLS0iCgp3aGlsZSBbWyAxIC1lcSAxIF1d CmRvCiAgbWQ1XzY1MTU9NjUxNSBtZDVfNjUxNj02NTE2IG1kNV82NTE3PTY1MTcKCiAgbWQ1X2E9 JChlY2hvICJzZWxlY3QgKiBmcm9tIHBnYmVuY2hfYWNjb3VudHMgJHdoZXJlIG9yZGVyIGJ5IGFp ZCIgfCBwc3FsIC1xdEFYcCA2NTE1IHwgbWQ1c3VtIHwgY3V0IC1iMS05KQogIG1kNV9iPSQoZWNo byAic2VsZWN0ICogZnJvbSBwZ2JlbmNoX2JyYW5jaGVzIG9yZGVyIGJ5IGJpZCIgfCBwc3FsIC1x dEFYcCA2NTE1IHwgbWQ1c3VtIHwgY3V0IC1iMS05KQogIG1kNV90PSQoZWNobyAic2VsZWN0ICog ZnJvbSBwZ2JlbmNoX3RlbGxlcnMgIG9yZGVyIGJ5IHRpZCIgfCBwc3FsIC1xdEFYcCA2NTE1IHwg bWQ1c3VtIHwgY3V0IC1iMS05KQogIG1kNV9oPSQoZWNobyAic2VsZWN0ICogZnJvbSBwZ2JlbmNo X2hpc3RvcnkgIG9yZGVyIGJ5IGhpZCIgfCBwc3FsIC1xdEFYcCA2NTE1IHwgbWQ1c3VtIHwgY3V0 IC1iMS05KQogIG1kNV82NTE1PSQoIGVjaG8gIiRtZDVfYSAkbWQ1X2IgJG1kNV90ICRtZDVfaCIg fCBtZDVzdW0gfCBjdXQgLWIxLTkpCiAgZWNobyAgICAgICI2NTE1ICAgJG1kNV9hICRtZDVfYiAk bWQ1X3QgJG1kNV9oICAgICRtZDVfNjUxNSAiCgogIG1kNV9hPSQoZWNobyAic2VsZWN0ICogZnJv bSBwZ2JlbmNoX2FjY291bnRzICR3aGVyZSBvcmRlciBieSBhaWQiIHwgcHNxbCAtcXRBWHAgNjUx NiB8IG1kNXN1bSB8IGN1dCAtYjEtOSkKICBtZDVfYj0kKGVjaG8gInNlbGVjdCAqIGZyb20gcGdi ZW5jaF9icmFuY2hlcyBvcmRlciBieSBiaWQiIHwgcHNxbCAtcXRBWHAgNjUxNiB8IG1kNXN1bSB8 IGN1dCAtYjEtOSkKICBtZDVfdD0kKGVjaG8gInNlbGVjdCAqIGZyb20gcGdiZW5jaF90ZWxsZXJz ICBvcmRlciBieSB0aWQiIHwgcHNxbCAtcXRBWHAgNjUxNiB8IG1kNXN1bSB8IGN1dCAtYjEtOSkK ICBtZDVfaD0kKGVjaG8gInNlbGVjdCAqIGZyb20gcGdiZW5jaF9oaXN0b3J5ICBvcmRlciBieSBo aWQiIHwgcHNxbCAtcXRBWHAgNjUxNiB8IG1kNXN1bSB8IGN1dCAtYjEtOSkKICBtZDVfNjUxNj0k KCBlY2hvICIkbWQ1X2EgJG1kNV9iICRtZDVfdCAkbWQ1X2giIHwgbWQ1c3VtIHwgY3V0IC1iMS05 KQogIGVjaG8gICAgICAiNjUxNiAgICRtZDVfYSAkbWQ1X2IgJG1kNV90ICRtZDVfaCAgICAkbWQ1 XzY1MTYgIgoKICBpZiBbWyAkbnVtX2luc3RhbmNlcyAtZXEgMyBdXTsgdGhlbgogIG1kNV9hPSQo ZWNobyAic2VsZWN0ICogZnJvbSBwZ2JlbmNoX2FjY291bnRzICR3aGVyZSBvcmRlciBieSBhaWQi IHwgcHNxbCAtcXRBWHAgNjUxNyB8IG1kNXN1bSB8IGN1dCAtYjEtOSkKICBtZDVfYj0kKGVjaG8g InNlbGVjdCAqIGZyb20gcGdiZW5jaF9icmFuY2hlcyBvcmRlciBieSBiaWQiIHwgcHNxbCAtcXRB WHAgNjUxNyB8IG1kNXN1bSB8IGN1dCAtYjEtOSkKICBtZDVfdD0kKGVjaG8gInNlbGVjdCAqIGZy b20gcGdiZW5jaF90ZWxsZXJzICBvcmRlciBieSB0aWQiIHwgcHNxbCAtcXRBWHAgNjUxNyB8IG1k NXN1bSB8IGN1dCAtYjEtOSkKICBtZDVfaD0kKGVjaG8gInNlbGVjdCAqIGZyb20gcGdiZW5jaF9o aXN0b3J5ICBvcmRlciBieSBoaWQiIHwgcHNxbCAtcXRBWHAgNjUxNyB8IG1kNXN1bSB8IGN1dCAt YjEtOSkKICBtZDVfNjUxNz0kKCBlY2hvICIkbWQ1X2EgJG1kNV9iICRtZDVfdCAkbWQ1X2giIHwg bWQ1c3VtIHwgY3V0IC1iMS05KQogIGVjaG8gLW5lICAiNjUxNyAgICRtZDVfYSAkbWQ1X2IgJG1k NV90ICRtZDVfaCAgICAkbWQ1XzY1MTcgIgogIGVsc2UKICAgIGVjaG8KICBmaQoKICBpZiBbWyAi JG1kNV82NTE1IiA9PSAiJG1kNV82NTE2IiBdXQogIHRoZW4KICAgIGlmIFtbICRudW1faW5zdGFu Y2VzIC1lcSAyIF1dOyB0aGVuCiAgICAgIGVjaG8gIiAgIG9rICgyKSIKICAgICAgYnJlYWsKICAg IGVsaWYgW1sgJG51bV9pbnN0YW5jZXMgLWVxIDMgXV07IHRoZW4KICAgICAgaWYgW1sgIiRtZDVf NjUxNSIgPT0gIiRtZDVfNjUxNyIgXV0KICAgICAgdGhlbgogICAgICAgIGVjaG8gIiAgIG9rIgog ICAgICAgIGJyZWFrCiAgICAgIGZpCiAgICBmaQogIGZpCiAgZWNobyAiICBOT0siCiAgZWNobwog IHNsZWVwIDEwCmRvbmUKZWNobwoKIyAgc3RvcCBpbnN0YW5jZXMKZm9yIG4gaW4gYHNlcSAxICRu dW1faW5zdGFuY2VzYApkbwogIGluc3RhbmNlPWluc3RhbmNlJG4KICBzZXJ2ZXJfZGlyPSRyb290 X2Rpci8kaW5zdGFuY2UKICBkYXRhX2Rpcj0kc2VydmVyX2Rpci9kYXRhCiAgcG9ydD0kKCggNjUx NSArICRuIC0gMSApKQogIGxvZ2ZpbGU9JHNlcnZlcl9kaXIvbG9nZmlsZS4kcG9ydAogICRwZ19j dGwgc3RvcCAtRCAkZGF0YV9kaXIgLS1tb2RlPWltbWVkaWF0ZSAtLXdhaXQKZG9uZQoKIyAgZGVs ZXRlIGV2ZXJ5dGhpbmcKZWNobyAicm0gLXJmIC90bXAvY2FzY2FkZS9pbnN0YW5jZSoiCiAgICAg IHJtIC1yZiAvdG1wL2Nhc2NhZGUvaW5zdGFuY2UqCgoK --=_b0f821593ccd8cb2d9327186e98632f2--