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 1w3Iqh-0015s8-0F for pgsql-hackers@arkaria.postgresql.org; Thu, 19 Mar 2026 19:16:03 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w3Iqf-00291Y-1Z for pgsql-hackers@arkaria.postgresql.org; Thu, 19 Mar 2026 19:16:01 +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.96) (envelope-from ) id 1w3Iqf-00291Q-0P for pgsql-hackers@lists.postgresql.org; Thu, 19 Mar 2026 19:16:01 +0000 Received: from mail-ed1-x52c.google.com ([2a00:1450:4864:20::52c]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w3Iqc-000000003XI-3DkB for pgsql-hackers@lists.postgresql.org; Thu, 19 Mar 2026 19:16:01 +0000 Received: by mail-ed1-x52c.google.com with SMTP id 4fb4d7f45d1cf-666ee394529so1556632a12.1 for ; Thu, 19 Mar 2026 12:15:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1773947758; cv=none; d=google.com; s=arc-20240605; b=dP/vwX7tX6pUNk0wr3v1ZiWSXZqw+FGpFuRoCaDAYuFOWpk/19JUpnjX9rDTsIOM1+ A2y6nrVQM/HkyZFjn99EBlDTNStjpl3UtIAIZjy4Y/xnuJLeCaoXvR+IIwZMuldjbZh7 rMbyFDtOV0nHUZU/sq1cZHKz5zRkSinLdtyRG4mNcnZITZP9eDeL6hfMqXyinWfeI0H4 Hxo17XVFNqHHDvfhBI0Fo78da5ELtDTf/nWfLunSRTE0hbXew1Uck4NzIqiOEod6npiF 1dhdsmJwNMTWLYtohpn2wXvfICRWOn40UP8scY7xzMTi2ci6rCyPJWJXkslWDCnEhh55 yHHw== 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=Oo08VKjE/fdTKbHWso+OaIg6ahuBIf92jKr5FwIr8Xo=; fh=f++R1UPDagM6ceFu8LmHSHEzn77Ot9zth2gw3/fRjpU=; b=FXpmonBLpFIwZkEkIk/FbanPP63R8ShkPHDExRmpYrsjSNjzKxYR6I1lWHkvakYsbw VCr9y2yElqs6bnKKAtqlP8gsqCET6+G1mf8wp//1J2KSaT4TTz6KAoV1HXEE99iymDgu 74CpofEtKbqas4ycWkrBTl2aiFzQGlF4LpT4KKLk3SFLGOLtYbtbcazm9FeEtKCFIVtC bqrsaKJAeoDcrjak64DZVkDPhzYne74W1/hQ3hniGGb1gbQGsXCzCN8kd3D+yYNNX59z rEURVYjGPX3vTGTse+RVYT7xgqsc5XxGTMVNOZTtUwdcf3MybCR1daOOkUWkj/ue1Ivr p9lw==; 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=20230601; t=1773947758; x=1774552558; 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=Oo08VKjE/fdTKbHWso+OaIg6ahuBIf92jKr5FwIr8Xo=; b=GJDlXbt/Ag+YG1DyPs021ncwF8K1rWE79LwOBoG3AI0TCIBDnOP2+aUM3TXgXMoyfF gyLv5lmTtjOB5IPp7XuIOx1upcGBd/noS2Ny0i92c5Ag5PFpF7cNUgzCUi17onpr/sBS jQA3a2ZZ6XJIZQu/kI4q4q4iSBV5oA30ExzzQv0gbQziTOU8N1U7ouM/VRpx8rPk1nKq vizRc9RrKfsPMtRwUmB6zVOlT/s+pTQAQM7P8R9M8iydXSTGe4i42vy4kGUaOiqHsA1v 11RcOLKFgrfeZjmDWZEDMVco5T8JtWP4444gP4gVuDMXSrIRWZ8jDBkL7bSmqsTvaZfv DebQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773947758; x=1774552558; 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=Oo08VKjE/fdTKbHWso+OaIg6ahuBIf92jKr5FwIr8Xo=; b=nOKS+aYKGl8+/MDowucaWYZbYiU5GolUQBNRoAf/qilTwnHDkE6pf0pnq5TyYvx6Z8 6G846H2TdIf+aobgKum3DFJg0Bm7NcCuy/nYCzMUaBvpKfj1C9Tmmk62KoK+1xu2/tHK Xy/TZ/8bnd8iicW/fDcqMmoIFUGluyzaWF7edjo8nH8M3eEmnYCGkxeJzarBjzHJS9VK Y/+qtTfx/V+DdwLIFNI3vRwU9Z869HPA/UdUk08O6A1wlw3UMire+xqBUJ5htYSDplVZ mPKYhXTBwpMiBGw0XYTBaOkLV4eKhebOWokDiBqyhQVgshB3r/Nel6jEFUkC2azM4zFM d65g== X-Gm-Message-State: AOJu0YzDED+gB9IzriG4JTlayVZs7lQYv6HX8AjVK1FVIIubjTz9lNaK 3xnABE5voQvJZpoMaA5RsIAPo4NAAot63RXhI2Zq7348QFGid11Y2zFivDFVOjiezv6Tv33uVXw VyYKg5dpBVYMhmf22iSLYErO2iapAHCE= X-Gm-Gg: ATEYQzxAylfjnrePOCdAG0f1xRGKbCHIkAOFQIhg1/xCmdX4ZjEtY9tK2HrNHLeLTUL idxeeHWMZjt4HJseUSaNiI2SJzD6RcWYWyI7kbQHkSqdI9f/NjdAH/cRvPkW3Z5Kj72SwOEo0AW 5kdwfvvFc4Obx1FsDmAtInYg7M/0megxsTlt1YWKFpSGKuxXEFDXMDaGuVyhC9PtvNKepgu3sZ2 1IJtsLSrjEsXChO6GijVZSnHkWZXCoWuFPtwK+WcFRIsIoRuovIsp5T8p6B3gI8zbk+hG8HEyZK NI2UBA== X-Received: by 2002:a05:6402:2790:b0:662:86a7:17a6 with SMTP id 4fb4d7f45d1cf-668c911e2bemr513511a12.8.1773947757573; Thu, 19 Mar 2026 12:15:57 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Sami Imseih Date: Thu, 19 Mar 2026 14:15:45 -0500 X-Gm-Features: AaiRm53Uma2-V94-ISntSGPDpBtE5v-e13BM6O85e2FL3PAvu0IP0ApVwEa5GOE Message-ID: Subject: Re: dshash_find_or_insert vs. OOM To: Robert Haas Cc: PostgreSQL Hackers , Andres Freund , Thomas Munro Content-Type: multipart/mixed; boundary="000000000000f0fb5c064d65658b" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000f0fb5c064d65658b Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thanks for the review! > > I did some testing by triggering an OOM, a no-OOM, and an OOM with > > eviction afterwards, as a sanity check. All looks good. > > I've attached the tests I created with other basic testing, as dshash > > lacks direct testing in general, if you're inclined to add them. > > I tried running a coverage report for this. It's pretty good. It > doesn't cover these things: > > - dshash_create: OOM while allocating the bucket array. > - dshash_find_or_insert_extended: OOM while inserting an item > (apparently, at least here, it instead hits OOM while resizing) > - dshash_delete_key: the case where the entry not found > - dshash_dump: not called at all > - resize: the case where we exit early due to a concurrent resize > - delete_item_from_bucket: the case where there is more than one item > in the bucket These are good to add. I also included delete_entry and dshash_dump for more coverage. delete_item_from_bucket will require us to hash the item to the same bucket, and I'm not sure it's worth the hassle. resize() will occur in the OOM test. > I think that adding a call to dshash_dump() somewhere would probably Done > make sense, and I'd suggest also trying to delete a nonexistent key. Done > > On the code itself: > > + /* Verify all entries via find. */ > + for (int i =3D 0; i < count; i++) > + { > + entry =3D dshash_find(ht, &i, false); > + if (entry =3D=3D NULL) > + elog(ERROR, "key %d not found", i); > + dshash_release_lock(ht, entry); > + } > > You could verify that entry->key =3D=3D i. The current code wouldn't > notice if the hash table returned a garbage pointer. You could > possibly also include some kind of a payload in each record and verify > that, e.g. set entry->value =3D > some_homomorphism_over_0_to_9(entry->key). I added key verification as you suggested. > + dsa_set_size_limit(area, dsa_minimum_size()); > > This is an abuse of the documented purpose of dsa_set_size_limit(). > Seems better to just pick a constant here. I changed this to use a different limit. > + /* Insert until OOM =E2=80=94 without NO_OOM flag, this should raise= ERROR. */ > + for (;;) > > I think it would be safer to code this as a fixed iteration count. For > example, if you choose the size limit so that we should run out of > memory after 10 entries, you could terminate this loop after 1000 > iterations. That way, if something goes wrong, we're more likely to > see "expected out-of-memory, but completed all %d iterations" in the > log rather than a core dump or whatever. Done. I also removed the OOM retry test and just kept a simple test. Adding entries after a delete is now happening in the basic test. > I+ { > + TestDshashEntry *entry; > + > + entry =3D dshash_find_or_insert(ht, &key, &found); > + dshash_release_lock(ht, entry); > + key++; > + } > > In other places, you check for entry =3D=3D NULL, but not here. Fixed. > I just got in trouble for letting a bare block sneak into my code, so > now it's my turn to complain. ugggh. fixed. > I suggest git config user.email in whatever directory you use to > generate patches like this, just to make life a bit easier for anyone > who might eventually be committing one of them. Sorry. I usually do, but I started using a new machine :( -- Sami Imseih Amazon Web Services (AWS) --000000000000f0fb5c064d65658b Content-Type: application/octet-stream; name="v2-0001-Add-test-module-for-dshash.patch" Content-Disposition: attachment; filename="v2-0001-Add-test-module-for-dshash.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmxuiulv0 RnJvbSA0OTkzMDQ1NTMyNzYwNTkzYmNlOTQ4NTc3MjA5YjkyODVlMGNhMDFjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBTYW1pIEltc2VpaCA8c2FtaW1zZWloQGdtYWlsLmNvbT4KRGF0 ZTogVGh1LCAxOSBNYXIgMjAyNiAxNToyNjo0NiArMDAwMApTdWJqZWN0OiBbUEFUQ0ggdjIgMS8x XSBBZGQgdGVzdCBtb2R1bGUgZm9yIGRzaGFzaAoKVGhpcyBpbnRyb2R1Y2VzIGNvbXByZWhlbnNp dmUgdGVzdHMgdG8gdGhlIGRzaGFzaCBBUElzOiBpbnNlcnQsIGZpbmQsCnNlcXVlbnRpYWwgc2Nh biwgZGVsZXRlX2VudHJ5LCBkZWxldGVfY3VycmVudCwgZGVsZXRlX2tleSwKYW5kIGRzaGFzaF9k dW1wLCBwYXlsb2FkIHZlcmlmaWNhdGlvbiwgcmVzaXplIGFuZCBPT00gaGFuZGxpbmcuCi0tLQog c3JjL3Rlc3QvbW9kdWxlcy9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgIHwgICAxICsKIHNy Yy90ZXN0L21vZHVsZXMvbWVzb24uYnVpbGQgICAgICAgICAgICAgICAgICB8ICAgMSArCiBzcmMv dGVzdC9tb2R1bGVzL3Rlc3RfZHNoYXNoLy5naXRpZ25vcmUgICAgICAgfCAgIDQgKwogc3JjL3Rl c3QvbW9kdWxlcy90ZXN0X2RzaGFzaC9NYWtlZmlsZSAgICAgICAgIHwgIDIzICsrCiAuLi4vdGVz dF9kc2hhc2gvZXhwZWN0ZWQvdGVzdF9kc2hhc2gub3V0ICAgICAgfCAgMTQgKysKIHNyYy90ZXN0 L21vZHVsZXMvdGVzdF9kc2hhc2gvbWVzb24uYnVpbGQgICAgICB8ICAzMyArKysKIC4uLi9tb2R1 bGVzL3Rlc3RfZHNoYXNoL3NxbC90ZXN0X2RzaGFzaC5zcWwgICB8ICAxMCArCiAuLi4vbW9kdWxl cy90ZXN0X2RzaGFzaC90ZXN0X2RzaGFzaC0tMS4wLnNxbCAgfCAgMTAgKwogc3JjL3Rlc3QvbW9k dWxlcy90ZXN0X2RzaGFzaC90ZXN0X2RzaGFzaC5jICAgIHwgMjE4ICsrKysrKysrKysrKysrKysr KwogLi4uL21vZHVsZXMvdGVzdF9kc2hhc2gvdGVzdF9kc2hhc2guY29udHJvbCAgIHwgICA0ICsK IDEwIGZpbGVzIGNoYW5nZWQsIDMxOCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQg c3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2RzaGFzaC8uZ2l0aWdub3JlCiBjcmVhdGUgbW9kZSAxMDA2 NDQgc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2RzaGFzaC9NYWtlZmlsZQogY3JlYXRlIG1vZGUgMTAw NjQ0IHNyYy90ZXN0L21vZHVsZXMvdGVzdF9kc2hhc2gvZXhwZWN0ZWQvdGVzdF9kc2hhc2gub3V0 CiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2RzaGFzaC9tZXNvbi5i dWlsZAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVsZXMvdGVzdF9kc2hhc2gvc3Fs L3Rlc3RfZHNoYXNoLnNxbAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L21vZHVsZXMvdGVz dF9kc2hhc2gvdGVzdF9kc2hhc2gtLTEuMC5zcWwKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVz dC9tb2R1bGVzL3Rlc3RfZHNoYXNoL3Rlc3RfZHNoYXNoLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBz cmMvdGVzdC9tb2R1bGVzL3Rlc3RfZHNoYXNoL3Rlc3RfZHNoYXNoLmNvbnRyb2wKCmRpZmYgLS1n aXQgYS9zcmMvdGVzdC9tb2R1bGVzL01ha2VmaWxlIGIvc3JjL3Rlc3QvbW9kdWxlcy9NYWtlZmls ZQppbmRleCAyOGNlM2IzNWVkYS4uNTFmMmIxYjQ4YzUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L21v ZHVsZXMvTWFrZWZpbGUKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy9NYWtlZmlsZQpAQCAtMjYsNiAr MjYsNyBAQCBTVUJESVJTID0gXAogCQkgIHRlc3RfY3VzdG9tX3R5cGVzIFwKIAkJICB0ZXN0X2Rk bF9kZXBhcnNlIFwKIAkJICB0ZXN0X2RzYSBcCisJCSAgdGVzdF9kc2hhc2ggXAogCQkgIHRlc3Rf ZHNtX3JlZ2lzdHJ5IFwKIAkJICB0ZXN0X2VzY2FwZSBcCiAJCSAgdGVzdF9leHRlbnNpb25zIFwK ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvbWVzb24uYnVpbGQgYi9zcmMvdGVzdC9tb2R1 bGVzL21lc29uLmJ1aWxkCmluZGV4IDNhYzI5MTY1NmMxLi5kY2Y4MTNiMDgyMyAxMDA2NDQKLS0t IGEvc3JjL3Rlc3QvbW9kdWxlcy9tZXNvbi5idWlsZAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL21l c29uLmJ1aWxkCkBAIC0yNyw2ICsyNyw3IEBAIHN1YmRpcigndGVzdF9jdXN0b21fc3RhdHMnKQog c3ViZGlyKCd0ZXN0X2N1c3RvbV90eXBlcycpCiBzdWJkaXIoJ3Rlc3RfZGRsX2RlcGFyc2UnKQog c3ViZGlyKCd0ZXN0X2RzYScpCitzdWJkaXIoJ3Rlc3RfZHNoYXNoJykKIHN1YmRpcigndGVzdF9k c21fcmVnaXN0cnknKQogc3ViZGlyKCd0ZXN0X2VzY2FwZScpCiBzdWJkaXIoJ3Rlc3RfZXh0ZW5z aW9ucycpCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfZHNoYXNoLy5naXRpZ25v cmUgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfZHNoYXNoLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjVkY2IzZmY5NzIzCi0tLSAvZGV2L251bGwKKysr IGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2RzaGFzaC8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNCBA QAorIyBHZW5lcmF0ZWQgc3ViZGlyZWN0b3JpZXMKKy9sb2cvCisvcmVzdWx0cy8KKy90bXBfY2hl Y2svCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfZHNoYXNoL01ha2VmaWxlIGIv c3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2RzaGFzaC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMDAwMC4uYWVmYmEzYWY1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMv dGVzdC9tb2R1bGVzL3Rlc3RfZHNoYXNoL01ha2VmaWxlCkBAIC0wLDAgKzEsMjMgQEAKKyMgc3Jj L3Rlc3QvbW9kdWxlcy90ZXN0X2RzaGFzaC9NYWtlZmlsZQorCitNT0RVTEVfYmlnID0gdGVzdF9k c2hhc2gKK09CSlMgPSBcCisJJChXSU4zMlJFUykgXAorCXRlc3RfZHNoYXNoLm8KK1BHRklMRURF U0MgPSAidGVzdF9kc2hhc2ggLSB0ZXN0IGNvZGUgZm9yIGRzaGFzaCIKKworRVhURU5TSU9OID0g dGVzdF9kc2hhc2gKK0RBVEEgPSB0ZXN0X2RzaGFzaC0tMS4wLnNxbAorCitSRUdSRVNTID0gdGVz dF9kc2hhc2gKKworaWZkZWYgVVNFX1BHWFMKK1BHX0NPTkZJRyA9IHBnX2NvbmZpZworUEdYUyA6 PSAkKHNoZWxsICQoUEdfQ09ORklHKSAtLXBneHMpCitpbmNsdWRlICQoUEdYUykKK2Vsc2UKK3N1 YmRpciA9IHNyYy90ZXN0L21vZHVsZXMvdGVzdF9kc2hhc2gKK3RvcF9idWlsZGRpciA9IC4uLy4u Ly4uLy4uCitpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9zcmMvTWFrZWZpbGUuZ2xvYmFsCitpbmNs dWRlICQodG9wX3NyY2RpcikvY29udHJpYi9jb250cmliLWdsb2JhbC5taworZW5kaWYKZGlmZiAt LWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9kc2hhc2gvZXhwZWN0ZWQvdGVzdF9kc2hhc2gu b3V0IGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2RzaGFzaC9leHBlY3RlZC90ZXN0X2RzaGFzaC5v dXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjY5ZjQ2MjhiZDVlCi0t LSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2RzaGFzaC9leHBlY3RlZC90 ZXN0X2RzaGFzaC5vdXQKQEAgLTAsMCArMSwxNCBAQAorQ1JFQVRFIEVYVEVOU0lPTiB0ZXN0X2Rz aGFzaDsKKy0tIEV4ZXJjaXNlIGNvcmUgZHNoYXNoIG9wZXJhdGlvbnMuCitTRUxFQ1QgdGVzdF9k c2hhc2hfYmFzaWMoKTsKKyB0ZXN0X2RzaGFzaF9iYXNpYyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0K KyAKKygxIHJvdykKKworLS0gUmVndWxhciBkc2hhc2hfZmluZF9vcl9pbnNlcnQgcmFpc2VzIEVS Uk9SIG9uIE9PTS4KKy0tIFVzZSB0ZXJzZSBmb3IgdmVyYm9zaXR5IHRvIGlnbm9yZSB0aGUgREVU QUlMIG1lc3NhZ2UuCitcc2V0IFZFUkJPU0lUWSB0ZXJzZQorU0VMRUNUIHRlc3RfZHNoYXNoX2Zp bmRfb3JfaW5zZXJ0X29vbV9lcnJvcigpOworRVJST1I6ICBvdXQgb2YgbWVtb3J5Citcc2V0IFZF UkJPU0lUWSBkZWZhdWx0CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfZHNoYXNo L21lc29uLmJ1aWxkIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2RzaGFzaC9tZXNvbi5idWlsZApu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNGMwY2U5MzgzNzkKLS0tIC9k ZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfZHNoYXNoL21lc29uLmJ1aWxkCkBA IC0wLDAgKzEsMzMgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDI0LTIwMjYsIFBvc3RncmVTUUwgR2xv YmFsIERldmVsb3BtZW50IEdyb3VwCisKK3Rlc3RfZHNoYXNoX3NvdXJjZXMgPSBmaWxlcygKKyAg J3Rlc3RfZHNoYXNoLmMnLAorKQorCitpZiBob3N0X3N5c3RlbSA9PSAnd2luZG93cycKKyAgdGVz dF9kc2hhc2hfc291cmNlcyArPSByY19saWJfZ2VuLnByb2Nlc3Mod2luMzJ2ZXJfcmMsIGV4dHJh X2FyZ3M6IFsKKyAgICAnLS1OQU1FJywgJ3Rlc3RfZHNoYXNoJywKKyAgICAnLS1GSUxFREVTQycs ICd0ZXN0X2RzaGFzaCAtIHRlc3QgY29kZSBmb3IgZHNoYXNoJyxdKQorZW5kaWYKKwordGVzdF9k c2hhc2ggPSBzaGFyZWRfbW9kdWxlKCd0ZXN0X2RzaGFzaCcsCisgIHRlc3RfZHNoYXNoX3NvdXJj ZXMsCisgIGt3YXJnczogcGdfdGVzdF9tb2RfYXJncywKKykKK3Rlc3RfaW5zdGFsbF9saWJzICs9 IHRlc3RfZHNoYXNoCisKK3Rlc3RfaW5zdGFsbF9kYXRhICs9IGZpbGVzKAorICAndGVzdF9kc2hh c2guY29udHJvbCcsCisgICd0ZXN0X2RzaGFzaC0tMS4wLnNxbCcsCispCisKK3Rlc3RzICs9IHsK KyAgJ25hbWUnOiAndGVzdF9kc2hhc2gnLAorICAnc2QnOiBtZXNvbi5jdXJyZW50X3NvdXJjZV9k aXIoKSwKKyAgJ2JkJzogbWVzb24uY3VycmVudF9idWlsZF9kaXIoKSwKKyAgJ3JlZ3Jlc3MnOiB7 CisgICAgJ3NxbCc6IFsKKyAgICAgICd0ZXN0X2RzaGFzaCcsCisgICAgXSwKKyAgfSwKK30KZGlm ZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9kc2hhc2gvc3FsL3Rlc3RfZHNoYXNoLnNx bCBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9kc2hhc2gvc3FsL3Rlc3RfZHNoYXNoLnNxbApuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNjcyYjg3YWMwMzUKLS0tIC9kZXYv bnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfZHNoYXNoL3NxbC90ZXN0X2RzaGFzaC5z cWwKQEAgLTAsMCArMSwxMCBAQAorQ1JFQVRFIEVYVEVOU0lPTiB0ZXN0X2RzaGFzaDsKKworLS0g RXhlcmNpc2UgY29yZSBkc2hhc2ggb3BlcmF0aW9ucy4KK1NFTEVDVCB0ZXN0X2RzaGFzaF9iYXNp YygpOworCistLSBSZWd1bGFyIGRzaGFzaF9maW5kX29yX2luc2VydCByYWlzZXMgRVJST1Igb24g T09NLgorLS0gVXNlIHRlcnNlIGZvciB2ZXJib3NpdHkgdG8gaWdub3JlIHRoZSBERVRBSUwgbWVz c2FnZS4KK1xzZXQgVkVSQk9TSVRZIHRlcnNlCitTRUxFQ1QgdGVzdF9kc2hhc2hfZmluZF9vcl9p bnNlcnRfb29tX2Vycm9yKCk7Citcc2V0IFZFUkJPU0lUWSBkZWZhdWx0CmRpZmYgLS1naXQgYS9z cmMvdGVzdC9tb2R1bGVzL3Rlc3RfZHNoYXNoL3Rlc3RfZHNoYXNoLS0xLjAuc3FsIGIvc3JjL3Rl c3QvbW9kdWxlcy90ZXN0X2RzaGFzaC90ZXN0X2RzaGFzaC0tMS4wLnNxbApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uODVhNjI4OTg1MGIKLS0tIC9kZXYvbnVsbAorKysg Yi9zcmMvdGVzdC9tb2R1bGVzL3Rlc3RfZHNoYXNoL3Rlc3RfZHNoYXNoLS0xLjAuc3FsCkBAIC0w LDAgKzEsMTAgQEAKKy8qIHNyYy90ZXN0L21vZHVsZXMvdGVzdF9kc2hhc2gvdGVzdF9kc2hhc2gt LTEuMC5zcWwgKi8KKworLS0gY29tcGxhaW4gaWYgc2NyaXB0IGlzIHNvdXJjZWQgaW4gcHNxbCwg cmF0aGVyIHRoYW4gdmlhIENSRUFURSBFWFRFTlNJT04KK1xlY2hvIFVzZSAiQ1JFQVRFIEVYVEVO U0lPTiB0ZXN0X2RzaGFzaCIgdG8gbG9hZCB0aGlzIGZpbGUuIFxxdWl0CisKK0NSRUFURSBGVU5D VElPTiB0ZXN0X2RzaGFzaF9iYXNpYygpIFJFVFVSTlMgVk9JRAorCUFTICdNT0RVTEVfUEFUSE5B TUUnIExBTkdVQUdFIEM7CisKK0NSRUFURSBGVU5DVElPTiB0ZXN0X2RzaGFzaF9maW5kX29yX2lu c2VydF9vb21fZXJyb3IoKSBSRVRVUk5TIFZPSUQKKwlBUyAnTU9EVUxFX1BBVEhOQU1FJyBMQU5H VUFHRSBDOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2RzaGFzaC90ZXN0X2Rz aGFzaC5jIGIvc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2RzaGFzaC90ZXN0X2RzaGFzaC5jCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5iZmQ5YWJkZjE2NAotLS0gL2Rldi9u dWxsCisrKyBiL3NyYy90ZXN0L21vZHVsZXMvdGVzdF9kc2hhc2gvdGVzdF9kc2hhc2guYwpAQCAt MCwwICsxLDIxOCBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIHRlc3RfZHNoYXNoLmMK KyAqCQlUZXN0IGR5bmFtaWMgc2hhcmVkIGhhc2ggdGFibGVzIChkc2hhc2gpLgorICoKKyAqIENv cHlyaWdodCAoYykgMjAyNC0yMDI2LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91 cAorICoKKyAqIElERU5USUZJQ0FUSU9OCisgKgkJc3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2RzaGFz aC90ZXN0X2RzaGFzaC5jCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAi cG9zdGdyZXMuaCIKKworI2luY2x1ZGUgImZtZ3IuaCIKKyNpbmNsdWRlICJsaWIvZHNoYXNoLmgi CisjaW5jbHVkZSAic3RvcmFnZS9kc21fcmVnaXN0cnkuaCIKKyNpbmNsdWRlICJzdG9yYWdlL2x3 bG9jay5oIgorI2luY2x1ZGUgInV0aWxzL2RzYS5oIgorCitQR19NT0RVTEVfTUFHSUM7CisKKy8q IFNpemUgbGltaXQgZm9yIE9PTSB0ZXN0cyAqLworI2RlZmluZSBURVNUX0RTSEFTSF9TSVpFX0xJ TUlUCSgxMjggKiAxMDI0KQorCisvKiBNb3JlIHRoYW4gZW5vdWdoIHRvIGV4aGF1c3QgVEVTVF9E U0hBU0hfU0laRV9MSU1JVCAqLworI2RlZmluZSBURVNUX0RTSEFTSF9NQVhfT09NX0lURVJBVElP TlMJMTAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgVGVzdERzaGFzaEVudHJ5Cit7CisJaW50CQkJa2V5 OworCWludAkJCXZhbHVlOworfQkJCVRlc3REc2hhc2hFbnRyeTsKKworLyogVG8gdmVyaWZ5IHBh eWxvYWQgaW50ZWdyaXR5ICovCisjZGVmaW5lIEtFWV9UT19WQUxVRShrKQkJKChrKSBeIDB4MTIz NDU2NzgpCisKK3N0YXRpYyBjb25zdCBkc2hhc2hfcGFyYW1ldGVycyB0ZXN0X3BhcmFtcyA9IHsK KwlzaXplb2YoaW50KSwJCQkJLyoga2V5X3NpemUgKi8KKwlzaXplb2YoVGVzdERzaGFzaEVudHJ5 KSwJLyogZW50cnlfc2l6ZSAqLworCWRzaGFzaF9tZW1jbXAsCisJZHNoYXNoX21lbWhhc2gsCisJ ZHNoYXNoX21lbWNweSwKKwlMV1RSQU5DSEVfRklSU1RfVVNFUl9ERUZJTkVECS8qIHRyYW5jaGVf aWQsIG92ZXJ3cml0dGVuIGF0IHJ1bnRpbWUgKi8KK307CisKK3N0YXRpYyB2b2lkCitpbml0X3Ry YW5jaGUodm9pZCAqcHRyLCB2b2lkICphcmcpCit7CisJaW50CQkgICAqdHJhbmNoZV9pZCA9IChp bnQgKikgcHRyOworCisJKnRyYW5jaGVfaWQgPSBMV0xvY2tOZXdUcmFuY2hlSWQoInRlc3RfZHNo YXNoIik7Cit9CisKKy8qCisgKiB0ZXN0X2RzaGFzaF9iYXNpYworICoKKyAqIFRlc3QgaW5zZXJ0 LCBmaW5kLCBzZXF1ZW50aWFsIHNjYW4sIGRlbGV0ZV9jdXJyZW50LCBkZWxldGVfa2V5LAorICog ZGVsZXRlIG9mIGEgbm9uZXhpc3RlbnQga2V5LCBhbmQgZHNoYXNoX2R1bXAsIGFuZCByZS1pbnNl cnRpb25zCisgKiBhZnRlciBkZWxldGVzLgorICovCitQR19GVU5DVElPTl9JTkZPX1YxKHRlc3Rf ZHNoYXNoX2Jhc2ljKTsKK0RhdHVtCit0ZXN0X2RzaGFzaF9iYXNpYyhQR19GVU5DVElPTl9BUkdT KQoreworCWludAkJICAgKnRyYW5jaGVfaWQ7CisJYm9vbAkJZm91bmQ7CisJZHNhX2FyZWEgICAq YXJlYTsKKwlkc2hhc2hfdGFibGUgKmh0OworCWRzaGFzaF9wYXJhbWV0ZXJzIHBhcmFtcyA9IHRl c3RfcGFyYW1zOworCWRzaGFzaF9zZXFfc3RhdHVzIHN0YXR1czsKKwlUZXN0RHNoYXNoRW50cnkg KmVudHJ5OworCWludAkJCWNvdW50ID0gMTA7CisJaW50CQkJc2Nhbm5lZDsKKwlpbnQJCQlub25l eGlzdGVudF9rZXk7CisKKwl0cmFuY2hlX2lkID0gR2V0TmFtZWREU01TZWdtZW50KCJ0ZXN0X2Rz aGFzaCIsIHNpemVvZihpbnQpLAorCQkJCQkJCQkJaW5pdF90cmFuY2hlLCAmZm91bmQsIE5VTEwp OworCXBhcmFtcy50cmFuY2hlX2lkID0gKnRyYW5jaGVfaWQ7CisKKwlhcmVhID0gZHNhX2NyZWF0 ZSgqdHJhbmNoZV9pZCk7CisJaHQgPSBkc2hhc2hfY3JlYXRlKGFyZWEsICZwYXJhbXMsIE5VTEwp OworCisJLyogSW5zZXJ0IGVudHJpZXMgd2l0aCBhIHBheWxvYWQuICovCisJZm9yIChpbnQgaSA9 IDA7IGkgPCBjb3VudDsgaSsrKQorCXsKKwkJZW50cnkgPSBkc2hhc2hfZmluZF9vcl9pbnNlcnQo aHQsICZpLCAmZm91bmQpOworCQlpZiAoZm91bmQpCisJCQllbG9nKEVSUk9SLCAidW5leHBlY3Rl ZCBkdXBsaWNhdGUga2V5ICVkIiwgaSk7CisJCWVudHJ5LT52YWx1ZSA9IEtFWV9UT19WQUxVRShp KTsKKwkJZHNoYXNoX3JlbGVhc2VfbG9jayhodCwgZW50cnkpOworCX0KKworCS8qIFZlcmlmeSBh bGwgZW50cmllcyB2aWEgZmluZCwgY2hlY2tpbmcgYm90aCBrZXkgYW5kIHZhbHVlLiAqLworCWZv ciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwl7CisJCWVudHJ5ID0gZHNoYXNoX2ZpbmQo aHQsICZpLCBmYWxzZSk7CisJCWlmIChlbnRyeSA9PSBOVUxMIHx8IGVudHJ5LT5rZXkgIT0gaSB8 fCBlbnRyeS0+dmFsdWUgIT0gS0VZX1RPX1ZBTFVFKGkpKQorCQkJZWxvZyhFUlJPUiwgImtleSAl ZCBub3QgZm91bmQgb3IgY29ycnVwdGVkIiwgaSk7CisJCWRzaGFzaF9yZWxlYXNlX2xvY2soaHQs IGVudHJ5KTsKKwl9CisKKwkvKiBEdW1wIHRoZSBoYXNoIHRhYmxlLiAqLworCWRzaGFzaF9kdW1w KGh0KTsKKworCS8qIFRyeSB0byBkZWxldGUgYSBrZXkgdGhhdCBkb2VzIG5vdCBleGlzdC4gKi8K Kwlub25leGlzdGVudF9rZXkgPSBjb3VudCArIDE7CisJZm91bmQgPSBkc2hhc2hfZGVsZXRlX2tl eShodCwgJm5vbmV4aXN0ZW50X2tleSk7CisJaWYgKGZvdW5kKQorCQllbG9nKEVSUk9SLCAiZGVs ZXRlIG9mIG5vbmV4aXN0ZW50IGtleSAlZCByZXBvcnRlZCBmb3VuZCIsIG5vbmV4aXN0ZW50X2tl eSk7CisKKwkvKiBWZXJpZnkgZW50cnkgY291bnQgdmlhIHNlcXVlbnRpYWwgc2Nhbi4gKi8KKwlz Y2FubmVkID0gMDsKKwlkc2hhc2hfc2VxX2luaXQoJnN0YXR1cywgaHQsIGZhbHNlKTsKKwl3aGls ZSAoKGVudHJ5ID0gZHNoYXNoX3NlcV9uZXh0KCZzdGF0dXMpKSAhPSBOVUxMKQorCQlzY2FubmVk Kys7CisJZHNoYXNoX3NlcV90ZXJtKCZzdGF0dXMpOworCisJaWYgKHNjYW5uZWQgIT0gY291bnQp CisJCWVsb2coRVJST1IsICJzZXEgc2NhbiByZXR1cm5lZCAlZCBlbnRyaWVzLCBleHBlY3RlZCAl ZCIsIHNjYW5uZWQsIGNvdW50KTsKKworCS8qIERlbGV0ZSBvbmUgZW50cnkgdmlhIGRzaGFzaF9k ZWxldGVfZW50cnkuICovCisJeworCQlpbnQJCQlkZWxldGVfa2V5ID0gMDsKKworCQllbnRyeSA9 IGRzaGFzaF9maW5kKGh0LCAmZGVsZXRlX2tleSwgdHJ1ZSk7CisJCWlmIChlbnRyeSA9PSBOVUxM KQorCQkJZWxvZyhFUlJPUiwgImtleSAlZCBub3QgZm91bmQgZm9yIGRlbGV0ZV9lbnRyeSIsIGRl bGV0ZV9rZXkpOworCQlkc2hhc2hfZGVsZXRlX2VudHJ5KGh0LCBlbnRyeSk7CisJfQorCisJLyog VmVyaWZ5IGl0J3MgZ29uZS4gKi8KKwl7CisJCWludAkJCWRlbGV0ZV9rZXkgPSAwOworCisJCWVu dHJ5ID0gZHNoYXNoX2ZpbmQoaHQsICZkZWxldGVfa2V5LCBmYWxzZSk7CisJCWlmIChlbnRyeSAh PSBOVUxMKQorCQl7CisJCQlkc2hhc2hfcmVsZWFzZV9sb2NrKGh0LCBlbnRyeSk7CisJCQllbG9n KEVSUk9SLCAia2V5ICVkIHN0aWxsIHByZXNlbnQgYWZ0ZXIgZGVsZXRlX2VudHJ5IiwgZGVsZXRl X2tleSk7CisJCX0KKwl9CisKKwkvKiBEZWxldGUgcmVtYWluaW5nIGVudHJpZXMgdmlhIGRlbGV0 ZV9jdXJyZW50LiAqLworCWRzaGFzaF9zZXFfaW5pdCgmc3RhdHVzLCBodCwgdHJ1ZSk7CisJd2hp bGUgKChlbnRyeSA9IGRzaGFzaF9zZXFfbmV4dCgmc3RhdHVzKSkgIT0gTlVMTCkKKwkJZHNoYXNo X2RlbGV0ZV9jdXJyZW50KCZzdGF0dXMpOworCWRzaGFzaF9zZXFfdGVybSgmc3RhdHVzKTsKKwor CS8qIFZlcmlmeSB0YWJsZSBpcyBlbXB0eS4gKi8KKwlzY2FubmVkID0gMDsKKwlkc2hhc2hfc2Vx X2luaXQoJnN0YXR1cywgaHQsIGZhbHNlKTsKKwl3aGlsZSAoKGVudHJ5ID0gZHNoYXNoX3NlcV9u ZXh0KCZzdGF0dXMpKSAhPSBOVUxMKQorCQlzY2FubmVkKys7CisJZHNoYXNoX3NlcV90ZXJtKCZz dGF0dXMpOworCisJaWYgKHNjYW5uZWQgIT0gMCkKKwkJZWxvZyhFUlJPUiwgImV4cGVjdGVkIGVt cHR5IHRhYmxlLCBnb3QgJWQgZW50cmllcyIsIHNjYW5uZWQpOworCisJLyogUmUtaW5zZXJ0IHRv IHZlcmlmeSB0aGUgdGFibGUgaXMgcmV1c2FibGUgYWZ0ZXIgYmVpbmcgZW1wdGllZC4gKi8KKwlm b3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJeworCQllbnRyeSA9IGRzaGFzaF9maW5k X29yX2luc2VydChodCwgJmksICZmb3VuZCk7CisJCWlmIChmb3VuZCkKKwkJCWVsb2coRVJST1Is ICJ1bmV4cGVjdGVkIGR1cGxpY2F0ZSBrZXkgJWQiLCBpKTsKKwkJZW50cnktPnZhbHVlID0gS0VZ X1RPX1ZBTFVFKGkpOworCQlkc2hhc2hfcmVsZWFzZV9sb2NrKGh0LCBlbnRyeSk7CisJfQorCisJ ZHNoYXNoX2Rlc3Ryb3koaHQpOworCWRzYV9kZXRhY2goYXJlYSk7CisKKwlQR19SRVRVUk5fVk9J RCgpOworfQorCisvKgorICogdGVzdF9kc2hhc2hfZmluZF9vcl9pbnNlcnRfb29tX2Vycm9yCisg KgorICogVGVzdCB0aGF0IHRoZSByZWd1bGFyIGRzaGFzaF9maW5kX29yX2luc2VydCAod2l0aG91 dCBEU0hBU0hfSU5TRVJUX05PX09PTSkKKyAqIHJhaXNlcyBFUlJPUiB3aGVuIHRoZSBEU0EgYXJl YSBpcyAib3V0IG9mIG1lbW9yeSIuIFRoaXMgYWxzbyBleGVyY2lzZXMKKyAqIHJlc2l6ZSgpIGFs b25nIHRoZSB3YXkgYXMgZW50cmllcyBhcmUgaW5zZXJ0ZWQuCisgKi8KK1BHX0ZVTkNUSU9OX0lO Rk9fVjEodGVzdF9kc2hhc2hfZmluZF9vcl9pbnNlcnRfb29tX2Vycm9yKTsKK0RhdHVtCit0ZXN0 X2RzaGFzaF9maW5kX29yX2luc2VydF9vb21fZXJyb3IoUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlp bnQJCSAgICp0cmFuY2hlX2lkOworCWJvb2wJCWZvdW5kOworCWRzYV9hcmVhICAgKmFyZWE7CisJ ZHNoYXNoX3RhYmxlICpodDsKKwlkc2hhc2hfcGFyYW1ldGVycyBwYXJhbXMgPSB0ZXN0X3BhcmFt czsKKwlpbnQJCQlrZXkgPSAwOworCisJdHJhbmNoZV9pZCA9IEdldE5hbWVkRFNNU2VnbWVudCgi dGVzdF9kc2hhc2giLCBzaXplb2YoaW50KSwKKwkJCQkJCQkJCWluaXRfdHJhbmNoZSwgJmZvdW5k LCBOVUxMKTsKKwlwYXJhbXMudHJhbmNoZV9pZCA9ICp0cmFuY2hlX2lkOworCisJYXJlYSA9IGRz YV9jcmVhdGUoKnRyYW5jaGVfaWQpOworCWRzYV9zZXRfc2l6ZV9saW1pdChhcmVhLCBURVNUX0RT SEFTSF9TSVpFX0xJTUlUKTsKKwlodCA9IGRzaGFzaF9jcmVhdGUoYXJlYSwgJnBhcmFtcywgTlVM TCk7CisKKwkvKiBJbnNlcnQgdW50aWwgT09NIOKAlCB3aXRob3V0IE5PX09PTSBmbGFnLCB0aGlz IHNob3VsZCByYWlzZSBFUlJPUi4gKi8KKwlmb3IgKGtleSA9IDA7IGtleSA8IFRFU1RfRFNIQVNI X01BWF9PT01fSVRFUkFUSU9OUzsga2V5KyspCisJeworCQlUZXN0RHNoYXNoRW50cnkgKmVudHJ5 OworCisJCWVudHJ5ID0gZHNoYXNoX2ZpbmRfb3JfaW5zZXJ0KGh0LCAma2V5LCAmZm91bmQpOwor CQlpZiAoZW50cnkgPT0gTlVMTCkKKwkJCWVsb2coRVJST1IsICJkc2hhc2hfZmluZF9vcl9pbnNl cnQgcmV0dXJuZWQgTlVMTCB1bmV4cGVjdGVkbHkiKTsKKwkJZHNoYXNoX3JlbGVhc2VfbG9jayho dCwgZW50cnkpOworCX0KKworCS8qIFNob3VsZCBub3QgcmVhY2ggaGVyZSDigJQgT09NIGVycm9y IGlzIGV4cGVjdGVkIGFib3ZlLiAqLworCWVsb2coRVJST1IsICJleHBlY3RlZCBvdXQtb2YtbWVt b3J5LCBidXQgY29tcGxldGVkIGFsbCAlZCBpdGVyYXRpb25zIiwKKwkJIFRFU1RfRFNIQVNIX01B WF9PT01fSVRFUkFUSU9OUyk7CisKKwlQR19SRVRVUk5fVk9JRCgpOworfQpkaWZmIC0tZ2l0IGEv c3JjL3Rlc3QvbW9kdWxlcy90ZXN0X2RzaGFzaC90ZXN0X2RzaGFzaC5jb250cm9sIGIvc3JjL3Rl c3QvbW9kdWxlcy90ZXN0X2RzaGFzaC90ZXN0X2RzaGFzaC5jb250cm9sCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi43YWIwNjY2ZDIyNwotLS0gL2Rldi9udWxsCisrKyBi L3NyYy90ZXN0L21vZHVsZXMvdGVzdF9kc2hhc2gvdGVzdF9kc2hhc2guY29udHJvbApAQCAtMCww ICsxLDQgQEAKK2NvbW1lbnQgPSAnVGVzdCBjb2RlIGZvciBkc2hhc2gnCitkZWZhdWx0X3ZlcnNp b24gPSAnMS4wJworbW9kdWxlX3BhdGhuYW1lID0gJyRsaWJkaXIvdGVzdF9kc2hhc2gnCityZWxv Y2F0YWJsZSA9IHRydWUKLS0gCjIuNDcuMwoK --000000000000f0fb5c064d65658b--