Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1l6t2Q-0004O1-8a for pgsql-hackers@arkaria.postgresql.org; Tue, 02 Feb 2021 10:36:02 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1l6t2N-0006AV-U0 for pgsql-hackers@arkaria.postgresql.org; Tue, 02 Feb 2021 10:35:59 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1l6t2M-0006AN-Rc for pgsql-hackers@lists.postgresql.org; Tue, 02 Feb 2021 10:35:59 +0000 Received: from forward2-smtp.messagingengine.com ([66.111.4.226]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1l6t2J-0006Ic-5q for pgsql-hackers@postgresql.org; Tue, 02 Feb 2021 10:35:57 +0000 Received: from compute3.internal (compute3.nyi.internal [10.202.2.43]) by mailforward.nyi.internal (Postfix) with ESMTP id 657EF1941049 for ; Tue, 2 Feb 2021 05:35:52 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute3.internal (MEProxy); Tue, 02 Feb 2021 05:35:52 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-type:date:from:message-id :mime-version:subject:to:x-me-proxy:x-me-proxy:x-me-sender :x-me-sender:x-sasl-enc; s=fm2; bh=NozXBM/7YU0VEffTjPzDdL1EUUsFX 5AZl//q8bVp1/k=; b=TMGTiERyAYsJ2SU6k5TIK6RRadft60DD2iyChyA5kk1lH uWgoh3mG9/rwiRc/YmgWp+i1QvCyOGFYE2vT6zvtnHIT3tDq8r7rajql3+94zs+3 LTVrr5R24q84Muk2QxIQJxfHYhA9HEea+mCMGUWN+jIQqgLToHEVpuJvZFdEvsnI hUbiRp3cJjKbcQcTidIcR1gjOcMLbsBfBtFosBV7/TYG5R+Xf2xD8KCPiAbmzR/7 cniEfTjK6Nc0pjvoiZB9/thYV1H7WdzYSgwKczR3hNwBqroogT/jV/pwfz28Kc/Y 2Mp1BByVbx2EkybgkuMg/olt5VRkGDmvC2MyfWqzw== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrgedtgddujecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecunecujfgurhepvffhufhokffffgggtgesmhdtreertd efjeenucfhrhhomheprfgvthgvrhcugfhishgvnhhtrhgruhhtuceophgvthgvrhdrvghi shgvnhhtrhgruhhtsegvnhhtvghrphhrihhsvggusgdrtghomheqnecuggftrfgrthhtvg hrnhepleefjefghfettedvkedvheeuhfehjeefgeeggfehhfeuleeltddvffehleejfeev necukfhppeekjedrudejjedrieelrddugedtnecuvehluhhsthgvrhfuihiivgeptdenuc frrghrrghmpehmrghilhhfrhhomhepphgvthgvrhdrvghishgvnhhtrhgruhhtsegvnhht vghrphhrihhsvggusgdrtghomh X-ME-Proxy: Received: from april.pezone.net (p57b1458c.dip0.t-ipconnect.de [87.177.69.140]) by mail.messagingengine.com (Postfix) with ESMTPA id 054F5108005B for ; Tue, 2 Feb 2021 05:35:50 -0500 (EST) To: pgsql-hackers From: Peter Eisentraut Subject: Improve new hash partition bound check error messages Organization: EnterpriseDB Message-ID: Date: Tue, 2 Feb 2021 11:35:49 +0100 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------097D4A153A0EC5F214EAB89F" Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk This is a multi-part message in MIME format. --------------097D4A153A0EC5F214EAB89F Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit I had a bit of trouble parsing the error message "every hash partition modulus must be a factor of the next larger modulus", so I went into the code, added some comments and added errdetail messages for each case. I think it's a bit clearer now. --------------097D4A153A0EC5F214EAB89F Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="0001-Improve-new-hash-partition-bound-check-error-message.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*0="0001-Improve-new-hash-partition-bound-check-error-message.pa"; filename*1="tch" RnJvbSBlN2YzOTJlMmY4OTUwMjM2YTIyZjAwN2NjM2FlZDM2NzI5ZGEyMmUxIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBFaXNlbnRyYXV0IDxwZXRlckBlaXNlbnRy YXV0Lm9yZz4KRGF0ZTogVHVlLCAyIEZlYiAyMDIxIDExOjIxOjIxICswMTAwClN1YmplY3Q6 IFtQQVRDSF0gSW1wcm92ZSBuZXcgaGFzaCBwYXJ0aXRpb24gYm91bmQgY2hlY2sgZXJyb3Ig bWVzc2FnZXMKCkZvciB0aGUgZXJyb3IgbWVzc2FnZSAiZXZlcnkgaGFzaCBwYXJ0aXRpb24g bW9kdWx1cyBtdXN0IGJlIGEgZmFjdG9yCm9mIHRoZSBuZXh0IGxhcmdlciBtb2R1bHVzIiwg YWRkIGEgZGV0YWlsIG1lc3NhZ2UgdGhhdCBzaG93cyB0aGUKcGFydGljdWxhciBudW1iZXJz IGludm9sdmVkLiAgQWxzbyBjb21tZW50IHRoZSBjb2RlIG1vcmUuCi0tLQogc3JjL2JhY2tl bmQvcGFydGl0aW9uaW5nL3BhcnRib3VuZHMuYyAgICAgIHwgNTggKysrKysrKysrKysrKysr LS0tLS0tLQogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9hbHRlcl90YWJsZS5vdXQgIHwg IDEgKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jcmVhdGVfdGFibGUub3V0IHwgIDIg KwogMyBmaWxlcyBjaGFuZ2VkLCA0MyBpbnNlcnRpb25zKCspLCAxOCBkZWxldGlvbnMoLSkK CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9wYXJ0aXRpb25pbmcvcGFydGJvdW5kcy5jIGIv c3JjL2JhY2tlbmQvcGFydGl0aW9uaW5nL3BhcnRib3VuZHMuYwppbmRleCAwYzNmMjEyZmYy Li43NDI1ZTM0MDQwIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9wYXJ0aXRpb25pbmcvcGFy dGJvdW5kcy5jCisrKyBiL3NyYy9iYWNrZW5kL3BhcnRpdGlvbmluZy9wYXJ0Ym91bmRzLmMK QEAgLTI4MzIsMTQgKzI4MzIsOSBAQCBjaGVja19uZXdfcGFydGl0aW9uX2JvdW5kKGNoYXIg KnJlbG5hbWUsIFJlbGF0aW9uIHBhcmVudCwKIAogCQkJCWlmIChwYXJ0ZGVzYy0+bnBhcnRz ID4gMCkKIAkJCQl7Ci0JCQkJCURhdHVtCSAgKipkYXR1bXMgPSBib3VuZGluZm8tPmRhdHVt czsKLQkJCQkJaW50CQkJbmRhdHVtcyA9IGJvdW5kaW5mby0+bmRhdHVtczsKIAkJCQkJaW50 CQkJZ3JlYXRlc3RfbW9kdWx1czsKIAkJCQkJaW50CQkJcmVtYWluZGVyOwogCQkJCQlpbnQJ CQlvZmZzZXQ7Ci0JCQkJCWJvb2wJCXZhbGlkX21vZHVsdXMgPSB0cnVlOwotCQkJCQlpbnQJ CQlwcmV2X21vZHVsdXMsCS8qIFByZXZpb3VzIGxhcmdlc3QgbW9kdWx1cyAqLwotCQkJCQkJ CQluZXh0X21vZHVsdXM7CS8qIE5leHQgbGFyZ2VzdCBtb2R1bHVzICovCiAKIAkJCQkJLyoK IAkJCQkJICogQ2hlY2sgcnVsZSB0aGF0IGV2ZXJ5IG1vZHVsdXMgbXVzdCBiZSBhIGZhY3Rv ciBvZiB0aGUKQEAgLTI4NDksNyArMjg0NCw5IEBAIGNoZWNrX25ld19wYXJ0aXRpb25fYm91 bmQoY2hhciAqcmVsbmFtZSwgUmVsYXRpb24gcGFyZW50LAogCQkJCQkgKiBtb2R1bHVzIDE1 LCBidXQgeW91IGNhbm5vdCBhZGQgYm90aCBhIHBhcnRpdGlvbiB3aXRoCiAJCQkJCSAqIG1v ZHVsdXMgMTAgYW5kIGEgcGFydGl0aW9uIHdpdGggbW9kdWx1cyAxNSwgYmVjYXVzZSAxMAog CQkJCQkgKiBpcyBub3QgYSBmYWN0b3Igb2YgMTUuCi0JCQkJCSAqCisJCQkJCSAqLworCisJ CQkJCS8qCiAJCQkJCSAqIEdldCB0aGUgZ3JlYXRlc3QgKG1vZHVsdXMsIHJlbWFpbmRlcikg cGFpciBjb250YWluZWQgaW4KIAkJCQkJICogYm91bmRpbmZvLT5kYXR1bXMgdGhhdCBpcyBs ZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlCiAJCQkJCSAqIChzcGVjLT5tb2R1bHVzLCBzcGVj LT5yZW1haW5kZXIpIHBhaXIuCkBAIC0yODU5LDI2ICsyODU2LDUxIEBAIGNoZWNrX25ld19w YXJ0aXRpb25fYm91bmQoY2hhciAqcmVsbmFtZSwgUmVsYXRpb24gcGFyZW50LAogCQkJCQkJ CQkJCQkJCXNwZWMtPnJlbWFpbmRlcik7CiAJCQkJCWlmIChvZmZzZXQgPCAwKQogCQkJCQl7 Ci0JCQkJCQluZXh0X21vZHVsdXMgPSBEYXR1bUdldEludDMyKGRhdHVtc1swXVswXSk7Ci0J CQkJCQl2YWxpZF9tb2R1bHVzID0gKG5leHRfbW9kdWx1cyAlIHNwZWMtPm1vZHVsdXMpID09 IDA7CisJCQkJCQlpbnQJCQluZXh0X21vZHVsdXM7CisKKwkJCQkJCS8qCisJCQkJCQkgKiBB bGwgZXhpc3RpbmcgbW9kdWxpIGFyZSBncmVhdGVyIG9yIGVxdWFsLCBzbyB0aGUKKwkJCQkJ CSAqIG5ldyBvbmUgbXVzdCBiZSBhIGZhY3RvciBvZiB0aGUgc21hbGxlc3Qgb25lLCB3aGlj aAorCQkJCQkJICogaXMgZmlyc3QgaW4gdGhlIGJvdW5kaW5mby4KKwkJCQkJCSAqLworCQkJ CQkJbmV4dF9tb2R1bHVzID0gRGF0dW1HZXRJbnQzMihib3VuZGluZm8tPmRhdHVtc1swXVsw XSk7CisJCQkJCQlpZiAobmV4dF9tb2R1bHVzICUgc3BlYy0+bW9kdWx1cyAhPSAwKQorCQkJ CQkJCWVyZXBvcnQoRVJST1IsCisJCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURf T0JKRUNUX0RFRklOSVRJT04pLAorCQkJCQkJCQkJIGVycm1zZygiZXZlcnkgaGFzaCBwYXJ0 aXRpb24gbW9kdWx1cyBtdXN0IGJlIGEgZmFjdG9yIG9mIHRoZSBuZXh0IGxhcmdlciBtb2R1 bHVzIiksCisJCQkJCQkJCQkgZXJyZGV0YWlsKCJUaGUgbmV3IG1vZHVsdXMgJWQgaXMgbm90 IGEgZmFjdG9yIG9mIHRoZSBleGlzdGluZyBtb2R1bHVzICVkLiIsCisJCQkJCQkJCQkJCSAg IHNwZWMtPm1vZHVsdXMsIG5leHRfbW9kdWx1cykpKTsKIAkJCQkJfQogCQkJCQllbHNlCiAJ CQkJCXsKLQkJCQkJCXByZXZfbW9kdWx1cyA9IERhdHVtR2V0SW50MzIoZGF0dW1zW29mZnNl dF1bMF0pOwotCQkJCQkJdmFsaWRfbW9kdWx1cyA9IChzcGVjLT5tb2R1bHVzICUgcHJldl9t b2R1bHVzKSA9PSAwOworCQkJCQkJaW50CQkJcHJldl9tb2R1bHVzOwogCi0JCQkJCQlpZiAo dmFsaWRfbW9kdWx1cyAmJiAob2Zmc2V0ICsgMSkgPCBuZGF0dW1zKQorCQkJCQkJLyogV2Ug Zm91bmQgdGhlIGxhcmdlc3QgbW9kdWx1cyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gb3Vycy4g Ki8KKwkJCQkJCXByZXZfbW9kdWx1cyA9IERhdHVtR2V0SW50MzIoYm91bmRpbmZvLT5kYXR1 bXNbb2Zmc2V0XVswXSk7CisKKwkJCQkJCWlmIChzcGVjLT5tb2R1bHVzICUgcHJldl9tb2R1 bHVzICE9IDApCisJCQkJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJCQkJCShlcnJjb2RlKEVS UkNPREVfSU5WQUxJRF9PQkpFQ1RfREVGSU5JVElPTiksCisJCQkJCQkJCQkgZXJybXNnKCJl dmVyeSBoYXNoIHBhcnRpdGlvbiBtb2R1bHVzIG11c3QgYmUgYSBmYWN0b3Igb2YgdGhlIG5l eHQgbGFyZ2VyIG1vZHVsdXMiKSwKKwkJCQkJCQkJCSBlcnJkZXRhaWwoIlRoZSBleGlzdGlu ZyBtb2R1bHVzICVkIGlzIG5vdCBhIGZhY3RvciBvZiB0aGUgbmV3IG1vZHVsdXMgJWQuIiwK KwkJCQkJCQkJCQkJICAgcHJldl9tb2R1bHVzLCBzcGVjLT5tb2R1bHVzKSkpOworCisJCQkJ CQlpZiAob2Zmc2V0ICsgMSA8IGJvdW5kaW5mby0+bmRhdHVtcykKIAkJCQkJCXsKLQkJCQkJ CQluZXh0X21vZHVsdXMgPSBEYXR1bUdldEludDMyKGRhdHVtc1tvZmZzZXQgKyAxXVswXSk7 Ci0JCQkJCQkJdmFsaWRfbW9kdWx1cyA9IChuZXh0X21vZHVsdXMgJSBzcGVjLT5tb2R1bHVz KSA9PSAwOworCQkJCQkJCWludAkJCW5leHRfbW9kdWx1czsKKworCQkJCQkJCS8qIExvb2sg YXQgdGhlIG5leHQgaGlnaGVyIG1vZHVsdXMgKi8KKwkJCQkJCQluZXh0X21vZHVsdXMgPSBE YXR1bUdldEludDMyKGJvdW5kaW5mby0+ZGF0dW1zW29mZnNldCArIDFdWzBdKTsKKworCQkJ CQkJCWlmIChuZXh0X21vZHVsdXMgJSBzcGVjLT5tb2R1bHVzICE9IDApCisJCQkJCQkJCWVy ZXBvcnQoRVJST1IsCisJCQkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX09CSkVD VF9ERUZJTklUSU9OKSwKKwkJCQkJCQkJCQkgZXJybXNnKCJldmVyeSBoYXNoIHBhcnRpdGlv biBtb2R1bHVzIG11c3QgYmUgYSBmYWN0b3Igb2YgdGhlIG5leHQgbGFyZ2VyIG1vZHVsdXMi KSwKKwkJCQkJCQkJCQkgZXJyZGV0YWlsKCJUaGUgbmV3IG1vZHVsdXMgJWQgaXMgbm90IGZh Y3RvciBvZiB0aGUgZXhpc3RpbmcgbW9kdWx1cyAlZC4iLAorCQkJCQkJCQkJCQkJICAgc3Bl Yy0+bW9kdWx1cywgbmV4dF9tb2R1bHVzKSkpOwogCQkJCQkJfQogCQkJCQl9CiAKLQkJCQkJ aWYgKCF2YWxpZF9tb2R1bHVzKQotCQkJCQkJZXJlcG9ydChFUlJPUiwKLQkJCQkJCQkJKGVy cmNvZGUoRVJSQ09ERV9JTlZBTElEX09CSkVDVF9ERUZJTklUSU9OKSwKLQkJCQkJCQkJIGVy cm1zZygiZXZlcnkgaGFzaCBwYXJ0aXRpb24gbW9kdWx1cyBtdXN0IGJlIGEgZmFjdG9yIG9m IHRoZSBuZXh0IGxhcmdlciBtb2R1bHVzIikpKTsKLQogCQkJCQlncmVhdGVzdF9tb2R1bHVz ID0gYm91bmRpbmZvLT5uaW5kZXhlczsKIAkJCQkJcmVtYWluZGVyID0gc3BlYy0+cmVtYWlu ZGVyOwogCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2FsdGVyX3Rh YmxlLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvYWx0ZXJfdGFibGUub3V0Cmlu ZGV4IDBjZTZlZTQ2MjIuLjYyYmYyN2ZjNTAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jl c3MvZXhwZWN0ZWQvYWx0ZXJfdGFibGUub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvYWx0ZXJfdGFibGUub3V0CkBAIC00MTA5LDYgKzQxMDksNyBAQCBBTFRFUiBUQUJM RSBoYXNoX3BhcnRlZCBBVFRBQ0ggUEFSVElUSU9OIGZhaWxfcGFydCBGT1IgVkFMVUVTIFdJ VEggKE1PRFVMVVMgOCwgUgogRVJST1I6ICByZW1haW5kZXIgZm9yIGhhc2ggcGFydGl0aW9u IG11c3QgYmUgbGVzcyB0aGFuIG1vZHVsdXMKIEFMVEVSIFRBQkxFIGhhc2hfcGFydGVkIEFU VEFDSCBQQVJUSVRJT04gZmFpbF9wYXJ0IEZPUiBWQUxVRVMgV0lUSCAoTU9EVUxVUyAzLCBS RU1BSU5ERVIgMik7CiBFUlJPUjogIGV2ZXJ5IGhhc2ggcGFydGl0aW9uIG1vZHVsdXMgbXVz dCBiZSBhIGZhY3RvciBvZiB0aGUgbmV4dCBsYXJnZXIgbW9kdWx1cworREVUQUlMOiAgVGhl IG5ldyBtb2R1bHVzIDMgaXMgbm90IGEgZmFjdG9yIG9mIHRoZSBleGlzdGluZyBtb2R1bHVz IDQuCiBEUk9QIFRBQkxFIGZhaWxfcGFydDsKIC0tCiAtLSBERVRBQ0ggUEFSVElUSU9OCmRp ZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NyZWF0ZV90YWJsZS5vdXQg Yi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NyZWF0ZV90YWJsZS5vdXQKaW5kZXggZWQ4 YzAxYjhkZS4uOTVkOGVkNGM0NSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9jcmVhdGVfdGFibGUub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv Y3JlYXRlX3RhYmxlLm91dApAQCAtNzgzLDkgKzc4MywxMSBAQCBDUkVBVEUgVEFCTEUgaHBh cnRfMyBQQVJUSVRJT04gT0YgaGFzaF9wYXJ0ZWQgRk9SIFZBTFVFUyBXSVRIIChNT0RVTFVT IDIwMCwgUkVNQQogLS0gbW9kdWx1cyAyNSBpcyBmYWN0b3Igb2YgbW9kdWx1cyBvZiA1MCBi dXQgMTAgaXMgbm90IGZhY3RvciBvZiAyNS4KIENSRUFURSBUQUJMRSBmYWlsX3BhcnQgUEFS VElUSU9OIE9GIGhhc2hfcGFydGVkIEZPUiBWQUxVRVMgV0lUSCAoTU9EVUxVUyAyNSwgUkVN QUlOREVSIDMpOwogRVJST1I6ICBldmVyeSBoYXNoIHBhcnRpdGlvbiBtb2R1bHVzIG11c3Qg YmUgYSBmYWN0b3Igb2YgdGhlIG5leHQgbGFyZ2VyIG1vZHVsdXMKK0RFVEFJTDogIFRoZSBl eGlzdGluZyBtb2R1bHVzIDEwIGlzIG5vdCBhIGZhY3RvciBvZiB0aGUgbmV3IG1vZHVsdXMg MjUuCiAtLSBwcmV2aW91cyBtb2R1bHVzIDUwIGlzIGZhY3RvciBvZiAxNTAgYnV0IHRoaXMg bW9kdWx1cyBpcyBub3QgZmFjdG9yIG9mIG5leHQgbW9kdWx1cyAyMDAuCiBDUkVBVEUgVEFC TEUgZmFpbF9wYXJ0IFBBUlRJVElPTiBPRiBoYXNoX3BhcnRlZCBGT1IgVkFMVUVTIFdJVEgg KE1PRFVMVVMgMTUwLCBSRU1BSU5ERVIgMyk7CiBFUlJPUjogIGV2ZXJ5IGhhc2ggcGFydGl0 aW9uIG1vZHVsdXMgbXVzdCBiZSBhIGZhY3RvciBvZiB0aGUgbmV4dCBsYXJnZXIgbW9kdWx1 cworREVUQUlMOiAgVGhlIG5ldyBtb2R1bHVzIDE1MCBpcyBub3QgZmFjdG9yIG9mIHRoZSBl eGlzdGluZyBtb2R1bHVzIDIwMC4KIC0tIHRyeWluZyB0byBzcGVjaWZ5IHJhbmdlIGZvciB0 aGUgaGFzaCBwYXJ0aXRpb25lZCB0YWJsZQogQ1JFQVRFIFRBQkxFIGZhaWxfcGFydCBQQVJU SVRJT04gT0YgaGFzaF9wYXJ0ZWQgRk9SIFZBTFVFUyBGUk9NICgnYScsIDEpIFRPICgneicp OwogRVJST1I6ICBpbnZhbGlkIGJvdW5kIHNwZWNpZmljYXRpb24gZm9yIGEgaGFzaCBwYXJ0 aXRpb24KLS0gCjIuMzAuMAoK --------------097D4A153A0EC5F214EAB89F--