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 1sbemd-000X5o-LM for pgsql-hackers@arkaria.postgresql.org; Wed, 07 Aug 2024 11:24:48 +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 1sbemc-006Yme-6p for pgsql-hackers@arkaria.postgresql.org; Wed, 07 Aug 2024 11:24:46 +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 1sbemb-006YmV-MT for pgsql-hackers@lists.postgresql.org; Wed, 07 Aug 2024 11:24:45 +0000 Received: from meesny.iki.fi ([195.140.195.201]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sbemY-003cWg-Jx for pgsql-hackers@postgresql.org; Wed, 07 Aug 2024 11:24:45 +0000 Received: from [192.168.1.110] (dsl-hkibng22-54f8db-125.dhcp.inet.fi [84.248.219.125]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: hlinnaka) by meesny.iki.fi (Postfix) with ESMTPSA id 4Wf7B03ZJtzyPM for ; Wed, 7 Aug 2024 14:24:40 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1723029880; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type; bh=KGGBHwoBghs8ESGs/y5DVUTPENxlkv401oN/Yv6bHM8=; b=dwTJHV1SDB+z6mCviTbVgbbdxpAS5Mw7vRnQU8bu2rUBSYLXlWVxTaFa4sAlRjLeaZbrBh ga8DopBuNbhkHrOPZcBb4LRvw3ZpaYUbS1cvoWp54TFX6KYqUHZLy3JBZ3cVcD3PWNWCzO 2l/P/szqyfHnB5EK+HDrI+fXxDnOC+M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1723029880; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type; bh=KGGBHwoBghs8ESGs/y5DVUTPENxlkv401oN/Yv6bHM8=; b=kU+LQ8u3haukKIk7qxSdbT/7jToTbRD2ErHviu7ShFzJfkxXlFfyVToB3Z4VtGxbUS8NKC kvkIapXMe0A5taa8InbOt5uzdlSZ1gOzKOIIXW3Rku3Ds0AcCCRuaP4ALIEfqjBqRMl858 1Q53nt9nVM+Ze1S26zX9ZbCxRnJU/+Y= ARC-Seal: i=1; s=meesny; d=iki.fi; t=1723029880; a=rsa-sha256; cv=none; b=iIt9yoh1nYISXCqp65IszBlTSzg/XFxBx6pff1+sXbcoXTobyC0fgrIJ7ZxucgGp7e4BW2 LArAY019MKJwVcXmqaBhxqgSIza1l8/8o4EsYm+SrOdclRL4qiM0EGscd0LbNzryM7EWpp dp/h2FACNE1Vjq/NXdjXWAQ9xdh5rCM= ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=hlinnaka smtp.mailfrom=hlinnaka@iki.fi Content-Type: multipart/mixed; boundary="------------s6wxVh9chRdkKlEQuCnGvtw0" Message-ID: <85e0acb8-76b5-465b-bef0-4036efc65035@iki.fi> Date: Wed, 7 Aug 2024 14:24:39 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US From: Heikki Linnakangas To: "pgsql-hackers@postgresql.org" Subject: Call rm_redo in a temporary memory context List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------s6wxVh9chRdkKlEQuCnGvtw0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Many resource managers set up a temporary memory context which is reset after replaying the record. It seems a bit silly for each rmgr to do that on their own, so I propose that we do it in a centralized fashion. The attached patch creates one new temporary context and switches to it for each rm_redo() call. I was afraid of the overhead of the MemoryContextReset between each WAL record since this is a very hot codepath, but it doesn't seem to be noticeable. I used the attached scripts to benchmark it. redobench-setup.sh sets up a base backup and about 5 GB of WAL. The WAL consists of just tiny logical decoding messages, no real page modifications. The idea is that replaying that WAL should make any per-record overhead stand out as much as possible, since there's no real work to do. Use redobench.sh to perform the replay. I am not seeing any measurable difference this patch, so I think we're good. But if we needed to optimize, we could e.g. have an inlined fastpath version of MemoryContextReset for the common case that the context is empty, or only reset it every 100 records or something. This leaves no built-in rmgrs with any rm_startup or rm_clenaup hooks. Extensions might still use them, and they seem like they might be useful, so I kept them. There was no natural place to document this, so I added a brief explanation of rm_redo in the RmgrData comment, and then tacked the information about the memory context there too. I also added a note in "Custom WAL Resource Managers" section of the docs to point out that this changed in v18. (Why am I doing this now? I was browsing through all the global variables for the multithreading work, and these "opCtx"s caught my eye. This is in no way critical for multithreading though.) -- Heikki Linnakangas Neon (https://neon.tech) --------------s6wxVh9chRdkKlEQuCnGvtw0 Content-Type: text/x-patch; charset=UTF-8; name="v1-0001-Run-WAL-redo-functions-in-a-temporary-memory-cont.patch" Content-Disposition: attachment; filename*0="v1-0001-Run-WAL-redo-functions-in-a-temporary-memory-cont.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA5YmZjMGFmMjZkY2ZjMGMwMDYxYjk4ZTE3MGJjNmZhMDJhY2FmNzA5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IFdlZCwgNyBBdWcgMjAyNCAxNDowMzowOCArMDMwMApT dWJqZWN0OiBbUEFUQ0ggdjEgMS8xXSBSdW4gV0FMIHJlZG8gZnVuY3Rpb25zIGluIGEgdGVt cG9yYXJ5IG1lbW9yeSBjb250ZXh0CgpTb21lIHJlc291cmNlIG1hbmFnZXJzIGFscmVhZHkg dXNlZCBzdWNoIGEgdGVtcG9yYXJ5IG1lbW9yeSBjb250ZXh0IG9uCnRoZWlyIG93bi4gTGV0 J3MgY29uc29saWRhdGUgdGhhdCBhbmQgcnVuIGFsbCBXQUwgcmVkbyBmdW5jdGlvbnMgaW4g YQp0ZW1wb3JhcnkgY29udGV4dCB0aGF0IGlzIHJlc2V0IGJldHdlZW4gZWFjaCByZWNvcmQu CgpUaGlzIGxlYXZlcyB0aGUgcm1fc3RhcnR1cCBhbmQgcm1fY2xlYW51cCBob29rcyB1bnVz ZWQgaW4gY29yZSBjb2RlLApidXQgSSBrZXB0IHRoZW0gYmVjYXVzZSB0aGV5IG1pZ2h0IHN0 aWxsIGJlIHVzZWQgYnkgZXh0ZW5zaW9ucywgYW5kIGl0Cm1pZ2h0IGNvbWUgaGFuZHkgZm9y IGJ1aWx0aW4gcm1ncnMgYWdhaW4gaW4gdGhlIGZ1dHVyZSB0b28uCi0tLQogZG9jL3NyYy9z Z21sL2N1c3RvbS1ybWdyLnNnbWwgICAgICAgICAgICAgfCAxNyArKysrKysrKysrKysrKysr Kwogc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW54bG9nLmMgICAgICAgICAgfCAyMSAtLS0t LS0tLS0tLS0tLS0tLS0tLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy9naXN0L2dpc3R4bG9nLmMg ICAgICAgIHwgMTkgLS0tLS0tLS0tLS0tLS0tLS0tLQogc3JjL2JhY2tlbmQvYWNjZXNzL25i dHJlZS9uYnR4bG9nLmMgICAgICAgfCAyMSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHNyYy9i YWNrZW5kL2FjY2Vzcy9zcGdpc3Qvc3BneGxvZy5jICAgICAgIHwgMjMgLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dyZWNvdmVyeS5j IHwgMTIgKysrKysrKysrKysrCiBzcmMvaW5jbHVkZS9hY2Nlc3MvZ2lueGxvZy5oICAgICAg ICAgICAgICB8ICAyIC0tCiBzcmMvaW5jbHVkZS9hY2Nlc3MvZ2lzdHhsb2cuaCAgICAgICAg ICAgICB8ICAyIC0tCiBzcmMvaW5jbHVkZS9hY2Nlc3MvbmJ0eGxvZy5oICAgICAgICAgICAg ICB8ICAyIC0tCiBzcmMvaW5jbHVkZS9hY2Nlc3Mvcm1ncmxpc3QuaCAgICAgICAgICAgICB8 ICA4ICsrKystLS0tCiBzcmMvaW5jbHVkZS9hY2Nlc3Mvc3BneGxvZy5oICAgICAgICAgICAg ICB8ICAyIC0tCiBzcmMvaW5jbHVkZS9hY2Nlc3MveGxvZ19pbnRlcm5hbC5oICAgICAgICB8 ICA1ICsrKysrCiAxMiBmaWxlcyBjaGFuZ2VkLCAzOCBpbnNlcnRpb25zKCspLCA5NiBkZWxl dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvY3VzdG9tLXJtZ3Iuc2dtbCBi L2RvYy9zcmMvc2dtbC9jdXN0b20tcm1nci5zZ21sCmluZGV4IDMwMzJiMmRjMGQuLmJmYTE1 ZTMzZDYgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9jdXN0b20tcm1nci5zZ21sCisrKyBi L2RvYy9zcmMvc2dtbC9jdXN0b20tcm1nci5zZ21sCkBAIC0yOSw2ICsyOSwxMSBAQAogICog VGhpcyBzdHJ1Y3QgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgUEdfUk1HUiBkZWZp bml0aW9uIGluCiAgKiBybWdyLmMuCiAgKgorICogcm1fcmVkbyBpcyB0aGUgY29yZSBmdW5j dGlvbiB0aGF0IHJlcGxheXMgb25lIFdBTCByZWNvcmQuICBEdXJpbmcgV0FMCisgKiByZWNv dmVyeSwgaXQgaXMgY2FsbGVkIG9uY2UgZm9yIGV2ZXJ5IFdBTCByZWNvcmQgYmVsb25naW5n IHRvIHRoZSByZXNvdXJjZQorICogbWFuYWdlci4gIEl0J3MgY2FsbGVkIGluIGEgdGVtcG9y YXJ5IG1lbW9yeSBjb250ZXh0IHRoYXQgaXMgcmVzZXQgYmV0d2VlbgorICogZXZlcnkgcmVj b3JkLgorICoKICAqIHJtX2lkZW50aWZ5IG11c3QgcmV0dXJuIGEgbmFtZSBmb3IgdGhlIHJl Y29yZCBiYXNlZCBvbiB4bF9pbmZvICh3aXRob3V0CiAgKiByZWZlcmVuY2UgdG8gdGhlIHJt aWQpLiBGb3IgZXhhbXBsZSwgWExPR19CVFJFRV9WQUNVVU0gd291bGQgYmUgbmFtZWQKICAq ICJWQUNVVU0iLiBybV9kZXNjIGNhbiB0aGVuIGJlIGNhbGxlZCB0byBvYnRhaW4gYWRkaXRp b25hbCBkZXRhaWwgZm9yIHRoZQpAQCAtNTUsNiArNjAsMTggQEAgdHlwZWRlZiBzdHJ1Y3Qg Um1nckRhdGEKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAgPC9wYXJhPgogCisgPG5vdGU+CisgICA8 cGFyYT4KKyAgICAgUHJpb3IgdG8gPHByb2R1Y3RuYW1lPlBvc3RncmVTUUw8L3Byb2R1Y3Ru YW1lPiB2ZXJzaW9uIDE4LjAsCisgICAgIHRoZSA8dmFybmFtZT5ybV9yZWRvPC92YXJuYW1l PiBmdW5jdGlvbiB3YXMgY2FsbGVkIGluIGEgbG9uZy1saXZlZCBtZW1vcnkKKyAgICAgY29u dGV4dCwgYW5kIGlmIHlvdSBuZWVkZWQgYSBzaG9ydC1saXZlZCBjb250ZXh0IHlvdSBoYWQg dG8gY3JlYXRlIG9uZQorICAgICB5b3Vyc2VsZiBlLmcuIGluIDx2YXJuYW1lPnJtX3N0YXJ0 dXA8L3Zhcm5hbWU+LiBTdGFydGluZyB3aXRoIHZlcnNpb24KKyAgICAgMTguMCwgaXQncyBj YWxsZWQgaW4gYSB0ZW1wb3JhcnkgbWVtb3J5IGNvbnRleHQgaW5zdGVhZCwgYW5kIGlmIHlv dSBuZWVkCisgICAgIHRvIHJldGFpbiBkYXRhIG92ZXIgY2FsbHMsIHlvdSBuZWVkIHRvIGV4 cGxpY2l0bHkgYWxsb2NhdGUgdGhlbSBpbgorICAgICA8bGl0ZXJhbD5Ub3BNZW1vcnlDb250 ZXh0PC9saXRlcmFsPi4KKyAgIDwvcGFyYT4KKyA8L25vdGU+CisKICAgPHBhcmE+CiAgICBU aGUgPGZpbGVuYW1lPnNyYy90ZXN0L21vZHVsZXMvdGVzdF9jdXN0b21fcm1ncnM8L2ZpbGVu YW1lPiBtb2R1bGUKICAgIGNvbnRhaW5zIGEgd29ya2luZyBleGFtcGxlLCB3aGljaCBkZW1v bnN0cmF0ZXMgdXNhZ2Ugb2YgY3VzdG9tIFdBTApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv YWNjZXNzL2dpbi9naW54bG9nLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbnhsb2cu YwppbmRleCAwN2JhMGI1NTllLi41OWFmZDVlNGI0IDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9hY2Nlc3MvZ2luL2dpbnhsb2cuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dp bnhsb2cuYwpAQCAtMTksOCArMTksNiBAQAogI2luY2x1ZGUgImFjY2Vzcy94bG9ndXRpbHMu aCIKICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogCi1zdGF0aWMgTWVtb3J5Q29udGV4 dCBvcEN0eDsJCS8qIHdvcmtpbmcgbWVtb3J5IGZvciBvcGVyYXRpb25zICovCi0KIHN0YXRp YyB2b2lkCiBnaW5SZWRvQ2xlYXJJbmNvbXBsZXRlU3BsaXQoWExvZ1JlYWRlclN0YXRlICpy ZWNvcmQsIHVpbnQ4IGJsb2NrX2lkKQogewpAQCAtNzI2LDcgKzcyNCw2IEBAIHZvaWQKIGdp bl9yZWRvKFhMb2dSZWFkZXJTdGF0ZSAqcmVjb3JkKQogewogCXVpbnQ4CQlpbmZvID0gWExv Z1JlY0dldEluZm8ocmVjb3JkKSAmIH5YTFJfSU5GT19NQVNLOwotCU1lbW9yeUNvbnRleHQg b2xkQ3R4OwogCiAJLyoKIAkgKiBHSU4gaW5kZXhlcyBkbyBub3QgcmVxdWlyZSBhbnkgY29u ZmxpY3QgcHJvY2Vzc2luZy4gTkI6IElmIHdlIGV2ZXIKQEAgLTczNCw3ICs3MzEsNiBAQCBn aW5fcmVkbyhYTG9nUmVhZGVyU3RhdGUgKnJlY29yZCkKIAkgKiBraWxsZWQgdHVwbGVzIG91 dHNpZGUgVkFDVVVNLCB3ZSdsbCBuZWVkIHRvIGhhbmRsZSB0aGF0IGhlcmUuCiAJICovCiAK LQlvbGRDdHggPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8ob3BDdHgpOwogCXN3aXRjaCAoaW5m bykKIAl7CiAJCWNhc2UgWExPR19HSU5fQ1JFQVRFX1BUUkVFOgpAQCAtNzY3LDIzICs3NjMs NiBAQCBnaW5fcmVkbyhYTG9nUmVhZGVyU3RhdGUgKnJlY29yZCkKIAkJZGVmYXVsdDoKIAkJ CWVsb2coUEFOSUMsICJnaW5fcmVkbzogdW5rbm93biBvcCBjb2RlICV1IiwgaW5mbyk7CiAJ fQotCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRDdHgpOwotCU1lbW9yeUNvbnRleHRSZXNl dChvcEN0eCk7Ci19Ci0KLXZvaWQKLWdpbl94bG9nX3N0YXJ0dXAodm9pZCkKLXsKLQlvcEN0 eCA9IEFsbG9jU2V0Q29udGV4dENyZWF0ZShDdXJyZW50TWVtb3J5Q29udGV4dCwKLQkJCQkJ CQkJICAiR0lOIHJlY292ZXJ5IHRlbXBvcmFyeSBjb250ZXh0IiwKLQkJCQkJCQkJICBBTExP Q1NFVF9ERUZBVUxUX1NJWkVTKTsKLX0KLQotdm9pZAotZ2luX3hsb2dfY2xlYW51cCh2b2lk KQotewotCU1lbW9yeUNvbnRleHREZWxldGUob3BDdHgpOwotCW9wQ3R4ID0gTlVMTDsKIH0K IAogLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naXN0L2dpc3R4bG9nLmMg Yi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2lzdC9naXN0eGxvZy5jCmluZGV4IDQ1MWU4ZDhkOTgu LjMxMjdjZmZjMDMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naXN0L2dpc3R4 bG9nLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2dpc3QvZ2lzdHhsb2cuYwpAQCAtMjMs OCArMjMsNiBAQAogI2luY2x1ZGUgInV0aWxzL21lbXV0aWxzLmgiCiAjaW5jbHVkZSAidXRp bHMvcmVsLmgiCiAKLXN0YXRpYyBNZW1vcnlDb250ZXh0IG9wQ3R4OwkJLyogd29ya2luZyBt ZW1vcnkgZm9yIG9wZXJhdGlvbnMgKi8KLQogLyoKICAqIFJlcGxheSB0aGUgY2xlYXJpbmcg b2YgRl9GT0xMT1dfUklHSFQgZmxhZyBvbiBhIGNoaWxkIHBhZ2UuCiAgKgpAQCAtMzk3LDcg KzM5NSw2IEBAIHZvaWQKIGdpc3RfcmVkbyhYTG9nUmVhZGVyU3RhdGUgKnJlY29yZCkKIHsK IAl1aW50OAkJaW5mbyA9IFhMb2dSZWNHZXRJbmZvKHJlY29yZCkgJiB+WExSX0lORk9fTUFT SzsKLQlNZW1vcnlDb250ZXh0IG9sZEN4dDsKIAogCS8qCiAJICogR2lTVCBpbmRleGVzIGRv IG5vdCByZXF1aXJlIGFueSBjb25mbGljdCBwcm9jZXNzaW5nLiBOQjogSWYgd2UgZXZlcgpA QCAtNDA1LDcgKzQwMiw2IEBAIGdpc3RfcmVkbyhYTG9nUmVhZGVyU3RhdGUgKnJlY29yZCkK IAkgKiB0dXBsZXMgb3V0c2lkZSBWQUNVVU0sIHdlJ2xsIG5lZWQgdG8gaGFuZGxlIHRoYXQg aGVyZS4KIAkgKi8KIAotCW9sZEN4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvcEN0eCk7 CiAJc3dpdGNoIChpbmZvKQogCXsKIAkJY2FzZSBYTE9HX0dJU1RfUEFHRV9VUERBVEU6CkBA IC00MjksMjEgKzQyNSw2IEBAIGdpc3RfcmVkbyhYTG9nUmVhZGVyU3RhdGUgKnJlY29yZCkK IAkJZGVmYXVsdDoKIAkJCWVsb2coUEFOSUMsICJnaXN0X3JlZG86IHVua25vd24gb3AgY29k ZSAldSIsIGluZm8pOwogCX0KLQotCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRDeHQpOwot CU1lbW9yeUNvbnRleHRSZXNldChvcEN0eCk7Ci19Ci0KLXZvaWQKLWdpc3RfeGxvZ19zdGFy dHVwKHZvaWQpCi17Ci0Jb3BDdHggPSBjcmVhdGVUZW1wR2lzdENvbnRleHQoKTsKLX0KLQot dm9pZAotZ2lzdF94bG9nX2NsZWFudXAodm9pZCkKLXsKLQlNZW1vcnlDb250ZXh0RGVsZXRl KG9wQ3R4KTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRy ZWUvbmJ0eGxvZy5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnR4bG9nLmMKaW5k ZXggYjViMGUyMjQ0Ny4uMDA3M2U4YmNkYiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNj ZXNzL25idHJlZS9uYnR4bG9nLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9u YnR4bG9nLmMKQEAgLTIyLDggKzIyLDYgQEAKICNpbmNsdWRlICJzdG9yYWdlL3N0YW5kYnku aCIKICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogCi1zdGF0aWMgTWVtb3J5Q29udGV4 dCBvcEN0eDsJCS8qIHdvcmtpbmcgbWVtb3J5IGZvciBvcGVyYXRpb25zICovCi0KIC8qCiAg KiBfYnRfcmVzdG9yZV9wYWdlIC0tIHJlLWVudGVyIGFsbCB0aGUgaW5kZXggdHVwbGVzIG9u IGEgcGFnZQogICoKQEAgLTEwMTQsOSArMTAxMiw3IEBAIHZvaWQKIGJ0cmVlX3JlZG8oWExv Z1JlYWRlclN0YXRlICpyZWNvcmQpCiB7CiAJdWludDgJCWluZm8gPSBYTG9nUmVjR2V0SW5m byhyZWNvcmQpICYgflhMUl9JTkZPX01BU0s7Ci0JTWVtb3J5Q29udGV4dCBvbGRDdHg7CiAK LQlvbGRDdHggPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8ob3BDdHgpOwogCXN3aXRjaCAoaW5m bykKIAl7CiAJCWNhc2UgWExPR19CVFJFRV9JTlNFUlRfTEVBRjoKQEAgLTEwNjUsMjMgKzEw NjEsNiBAQCBidHJlZV9yZWRvKFhMb2dSZWFkZXJTdGF0ZSAqcmVjb3JkKQogCQlkZWZhdWx0 OgogCQkJZWxvZyhQQU5JQywgImJ0cmVlX3JlZG86IHVua25vd24gb3AgY29kZSAldSIsIGlu Zm8pOwogCX0KLQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkQ3R4KTsKLQlNZW1vcnlDb250 ZXh0UmVzZXQob3BDdHgpOwotfQotCi12b2lkCi1idHJlZV94bG9nX3N0YXJ0dXAodm9pZCkK LXsKLQlvcEN0eCA9IEFsbG9jU2V0Q29udGV4dENyZWF0ZShDdXJyZW50TWVtb3J5Q29udGV4 dCwKLQkJCQkJCQkJICAiQnRyZWUgcmVjb3ZlcnkgdGVtcG9yYXJ5IGNvbnRleHQiLAotCQkJ CQkJCQkgIEFMTE9DU0VUX0RFRkFVTFRfU0laRVMpOwotfQotCi12b2lkCi1idHJlZV94bG9n X2NsZWFudXAodm9pZCkKLXsKLQlNZW1vcnlDb250ZXh0RGVsZXRlKG9wQ3R4KTsKLQlvcEN0 eCA9IE5VTEw7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3Mvc3Bn aXN0L3NwZ3hsb2cuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9zcGdpc3Qvc3BneGxvZy5jCmlu ZGV4IDRlMzFkMzNlNzAuLmI0MjIwNDk5MjAgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2Fj Y2Vzcy9zcGdpc3Qvc3BneGxvZy5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9zcGdpc3Qv c3BneGxvZy5jCkBAIC0yMiw5ICsyMiw2IEBACiAjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMu aCIKIAogCi1zdGF0aWMgTWVtb3J5Q29udGV4dCBvcEN0eDsJCS8qIHdvcmtpbmcgbWVtb3J5 IGZvciBvcGVyYXRpb25zICovCi0KLQogLyoKICAqIFByZXBhcmUgYSBkdW1teSBTcEdpc3RT dGF0ZSwgd2l0aCBqdXN0IHRoZSBtaW5pbXVtIGluZm8gbmVlZGVkIGZvciByZXBsYXkuCiAg KgpAQCAtOTM1LDkgKzkzMiw3IEBAIHZvaWQKIHNwZ19yZWRvKFhMb2dSZWFkZXJTdGF0ZSAq cmVjb3JkKQogewogCXVpbnQ4CQlpbmZvID0gWExvZ1JlY0dldEluZm8ocmVjb3JkKSAmIH5Y TFJfSU5GT19NQVNLOwotCU1lbW9yeUNvbnRleHQgb2xkQ3h0OwogCi0Jb2xkQ3h0ID0gTWVt b3J5Q29udGV4dFN3aXRjaFRvKG9wQ3R4KTsKIAlzd2l0Y2ggKGluZm8pCiAJewogCQljYXNl IFhMT0dfU1BHSVNUX0FERF9MRUFGOgpAQCAtOTY3LDI0ICs5NjIsNiBAQCBzcGdfcmVkbyhY TG9nUmVhZGVyU3RhdGUgKnJlY29yZCkKIAkJZGVmYXVsdDoKIAkJCWVsb2coUEFOSUMsICJz cGdfcmVkbzogdW5rbm93biBvcCBjb2RlICV1IiwgaW5mbyk7CiAJfQotCi0JTWVtb3J5Q29u dGV4dFN3aXRjaFRvKG9sZEN4dCk7Ci0JTWVtb3J5Q29udGV4dFJlc2V0KG9wQ3R4KTsKLX0K LQotdm9pZAotc3BnX3hsb2dfc3RhcnR1cCh2b2lkKQotewotCW9wQ3R4ID0gQWxsb2NTZXRD b250ZXh0Q3JlYXRlKEN1cnJlbnRNZW1vcnlDb250ZXh0LAotCQkJCQkJCQkgICJTUC1HaVNU IHRlbXBvcmFyeSBjb250ZXh0IiwKLQkJCQkJCQkJICBBTExPQ1NFVF9ERUZBVUxUX1NJWkVT KTsKLX0KLQotdm9pZAotc3BnX3hsb2dfY2xlYW51cCh2b2lkKQotewotCU1lbW9yeUNvbnRl eHREZWxldGUob3BDdHgpOwotCW9wQ3R4ID0gTlVMTDsKIH0KIAogLyoKZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dyZWNvdmVyeS5jIGIvc3JjL2JhY2tl bmQvYWNjZXNzL3RyYW5zYW0veGxvZ3JlY292ZXJ5LmMKaW5kZXggYWQ4MTdmYmNhNi4uYjg4 NGY4NDk3NCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3Jl Y292ZXJ5LmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3JlY292ZXJ5 LmMKQEAgLTYxLDYgKzYxLDcgQEAKICNpbmNsdWRlICJ1dGlscy9kYXRldGltZS5oIgogI2lu Y2x1ZGUgInV0aWxzL2ZtZ3Jwcm90b3MuaCIKICNpbmNsdWRlICJ1dGlscy9ndWNfaG9va3Mu aCIKKyNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogI2luY2x1ZGUgInV0aWxzL3BnX2xz bi5oIgogI2luY2x1ZGUgInV0aWxzL3BzX3N0YXR1cy5oIgogI2luY2x1ZGUgInV0aWxzL3Bn X3J1c2FnZS5oIgpAQCAtMTcyOCw2ICsxNzI5LDggQEAgUGVyZm9ybVdhbFJlY292ZXJ5KHZv aWQpCiAKIAlpZiAocmVjb3JkICE9IE5VTEwpCiAJeworCQlNZW1vcnlDb250ZXh0IG9sZEN0 eDsKKwkJTWVtb3J5Q29udGV4dCByZWRvQ3R4OwogCQlUaW1lc3RhbXBUeiB4dGltZTsKIAkJ UEdSVXNhZ2UJcnUwOwogCkBAIC0xNzQ1LDYgKzE3NDgsMTAgQEAgUGVyZm9ybVdhbFJlY292 ZXJ5KHZvaWQpCiAJCWlmICghU3RhbmRieU1vZGUpCiAJCQliZWdpbl9zdGFydHVwX3Byb2dy ZXNzX3BoYXNlKCk7CiAKKwkJcmVkb0N0eCA9IEFsbG9jU2V0Q29udGV4dENyZWF0ZShDdXJy ZW50TWVtb3J5Q29udGV4dCwKKwkJCQkJCQkJCQkicmVjb3ZlcnkgdGVtcG9yYXJ5IGNvbnRl eHQiLAorCQkJCQkJCQkJCUFMTE9DU0VUX0RFRkFVTFRfU0laRVMpOworCiAJCS8qCiAJCSAq IG1haW4gcmVkbyBhcHBseSBsb29wCiAJCSAqLwpAQCAtMTgyMCw3ICsxODI3LDEwIEBAIFBl cmZvcm1XYWxSZWNvdmVyeSh2b2lkKQogCQkJLyoKIAkJCSAqIEFwcGx5IHRoZSByZWNvcmQK IAkJCSAqLworCQkJb2xkQ3R4ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKHJlZG9DdHgpOwog CQkJQXBwbHlXYWxSZWNvcmQoeGxvZ3JlYWRlciwgcmVjb3JkLCAmcmVwbGF5VExJKTsKKwkJ CU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRDdHgpOworCQkJTWVtb3J5Q29udGV4dFJlc2V0 KHJlZG9DdHgpOwogCiAJCQkvKiBFeGl0IGxvb3AgaWYgd2UgcmVhY2hlZCBpbmNsdXNpdmUg cmVjb3ZlcnkgdGFyZ2V0ICovCiAJCQlpZiAocmVjb3ZlcnlTdG9wc0FmdGVyKHhsb2dyZWFk ZXIpKQpAQCAtMTg0Nyw2ICsxODU3LDggQEAgUGVyZm9ybVdhbFJlY292ZXJ5KHZvaWQpCiAJ CSAqIGVuZCBvZiBtYWluIHJlZG8gYXBwbHkgbG9vcAogCQkgKi8KIAorCQlNZW1vcnlDb250 ZXh0U3dpdGNoVG8ob2xkQ3R4KTsKKwogCQlpZiAocmVhY2hlZFJlY292ZXJ5VGFyZ2V0KQog CQl7CiAJCQlpZiAoIXJlYWNoZWRDb25zaXN0ZW5jeSkKZGlmZiAtLWdpdCBhL3NyYy9pbmNs dWRlL2FjY2Vzcy9naW54bG9nLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2lueGxvZy5oCmlu ZGV4IDBjMmRkYmQ4MmEuLjNlNTE4NWZiZGMgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2Fj Y2Vzcy9naW54bG9nLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL2dpbnhsb2cuaApAQCAt MjA5LDggKzIwOSw2IEBAIHR5cGVkZWYgc3RydWN0IGdpbnhsb2dEZWxldGVMaXN0UGFnZXMK IGV4dGVybiB2b2lkIGdpbl9yZWRvKFhMb2dSZWFkZXJTdGF0ZSAqcmVjb3JkKTsKIGV4dGVy biB2b2lkIGdpbl9kZXNjKFN0cmluZ0luZm8gYnVmLCBYTG9nUmVhZGVyU3RhdGUgKnJlY29y ZCk7CiBleHRlcm4gY29uc3QgY2hhciAqZ2luX2lkZW50aWZ5KHVpbnQ4IGluZm8pOwotZXh0 ZXJuIHZvaWQgZ2luX3hsb2dfc3RhcnR1cCh2b2lkKTsKLWV4dGVybiB2b2lkIGdpbl94bG9n X2NsZWFudXAodm9pZCk7CiBleHRlcm4gdm9pZCBnaW5fbWFzayhjaGFyICpwYWdlZGF0YSwg QmxvY2tOdW1iZXIgYmxrbm8pOwogCiAjZW5kaWYJCQkJCQkJLyogR0lOWExPR19IICovCmRp ZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2lzdHhsb2cuaCBiL3NyYy9pbmNsdWRl L2FjY2Vzcy9naXN0eGxvZy5oCmluZGV4IGEwYmRjNWQ3ZDcuLjgwOTUxMmFjZDkgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9naXN0eGxvZy5oCisrKyBiL3NyYy9pbmNsdWRl L2FjY2Vzcy9naXN0eGxvZy5oCkBAIC0xMTAsOCArMTEwLDYgQEAgdHlwZWRlZiBzdHJ1Y3Qg Z2lzdHhsb2dQYWdlUmV1c2UKIGV4dGVybiB2b2lkIGdpc3RfcmVkbyhYTG9nUmVhZGVyU3Rh dGUgKnJlY29yZCk7CiBleHRlcm4gdm9pZCBnaXN0X2Rlc2MoU3RyaW5nSW5mbyBidWYsIFhM b2dSZWFkZXJTdGF0ZSAqcmVjb3JkKTsKIGV4dGVybiBjb25zdCBjaGFyICpnaXN0X2lkZW50 aWZ5KHVpbnQ4IGluZm8pOwotZXh0ZXJuIHZvaWQgZ2lzdF94bG9nX3N0YXJ0dXAodm9pZCk7 Ci1leHRlcm4gdm9pZCBnaXN0X3hsb2dfY2xlYW51cCh2b2lkKTsKIGV4dGVybiB2b2lkIGdp c3RfbWFzayhjaGFyICpwYWdlZGF0YSwgQmxvY2tOdW1iZXIgYmxrbm8pOwogCiAjZW5kaWYK ZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9uYnR4bG9nLmggYi9zcmMvaW5jbHVk ZS9hY2Nlc3MvbmJ0eGxvZy5oCmluZGV4IGU0MmFjMTYxMWMuLjM5MjI2ODc4NTggMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9uYnR4bG9nLmgKKysrIGIvc3JjL2luY2x1ZGUv YWNjZXNzL25idHhsb2cuaApAQCAtMzU0LDggKzM1NCw2IEBAIHR5cGVkZWYgc3RydWN0IHhs X2J0cmVlX25ld3Jvb3QKICAqIHByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyBpbiBuYnR4bG9n LmMKICAqLwogZXh0ZXJuIHZvaWQgYnRyZWVfcmVkbyhYTG9nUmVhZGVyU3RhdGUgKnJlY29y ZCk7Ci1leHRlcm4gdm9pZCBidHJlZV94bG9nX3N0YXJ0dXAodm9pZCk7Ci1leHRlcm4gdm9p ZCBidHJlZV94bG9nX2NsZWFudXAodm9pZCk7CiBleHRlcm4gdm9pZCBidHJlZV9tYXNrKGNo YXIgKnBhZ2VkYXRhLCBCbG9ja051bWJlciBibGtubyk7CiAKIC8qCmRpZmYgLS1naXQgYS9z cmMvaW5jbHVkZS9hY2Nlc3Mvcm1ncmxpc3QuaCBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9ybWdy bGlzdC5oCmluZGV4IDc4ZTZiOTA4YzYuLjhiY2M4MmNiNTQgMTAwNjQ0Ci0tLSBhL3NyYy9p bmNsdWRlL2FjY2Vzcy9ybWdybGlzdC5oCisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9ybWdy bGlzdC5oCkBAIC0zNiwxMiArMzYsMTIgQEAgUEdfUk1HUihSTV9SRUxNQVBfSUQsICJSZWxN YXAiLCByZWxtYXBfcmVkbywgcmVsbWFwX2Rlc2MsIHJlbG1hcF9pZGVudGlmeSwgTlVMTCwK IFBHX1JNR1IoUk1fU1RBTkRCWV9JRCwgIlN0YW5kYnkiLCBzdGFuZGJ5X3JlZG8sIHN0YW5k YnlfZGVzYywgc3RhbmRieV9pZGVudGlmeSwgTlVMTCwgTlVMTCwgTlVMTCwgc3RhbmRieV9k ZWNvZGUpCiBQR19STUdSKFJNX0hFQVAyX0lELCAiSGVhcDIiLCBoZWFwMl9yZWRvLCBoZWFw Ml9kZXNjLCBoZWFwMl9pZGVudGlmeSwgTlVMTCwgTlVMTCwgaGVhcF9tYXNrLCBoZWFwMl9k ZWNvZGUpCiBQR19STUdSKFJNX0hFQVBfSUQsICJIZWFwIiwgaGVhcF9yZWRvLCBoZWFwX2Rl c2MsIGhlYXBfaWRlbnRpZnksIE5VTEwsIE5VTEwsIGhlYXBfbWFzaywgaGVhcF9kZWNvZGUp Ci1QR19STUdSKFJNX0JUUkVFX0lELCAiQnRyZWUiLCBidHJlZV9yZWRvLCBidHJlZV9kZXNj LCBidHJlZV9pZGVudGlmeSwgYnRyZWVfeGxvZ19zdGFydHVwLCBidHJlZV94bG9nX2NsZWFu dXAsIGJ0cmVlX21hc2ssIE5VTEwpCitQR19STUdSKFJNX0JUUkVFX0lELCAiQnRyZWUiLCBi dHJlZV9yZWRvLCBidHJlZV9kZXNjLCBidHJlZV9pZGVudGlmeSwgTlVMTCwgTlVMTCwgYnRy ZWVfbWFzaywgTlVMTCkKIFBHX1JNR1IoUk1fSEFTSF9JRCwgIkhhc2giLCBoYXNoX3JlZG8s IGhhc2hfZGVzYywgaGFzaF9pZGVudGlmeSwgTlVMTCwgTlVMTCwgaGFzaF9tYXNrLCBOVUxM KQotUEdfUk1HUihSTV9HSU5fSUQsICJHaW4iLCBnaW5fcmVkbywgZ2luX2Rlc2MsIGdpbl9p ZGVudGlmeSwgZ2luX3hsb2dfc3RhcnR1cCwgZ2luX3hsb2dfY2xlYW51cCwgZ2luX21hc2ss IE5VTEwpCi1QR19STUdSKFJNX0dJU1RfSUQsICJHaXN0IiwgZ2lzdF9yZWRvLCBnaXN0X2Rl c2MsIGdpc3RfaWRlbnRpZnksIGdpc3RfeGxvZ19zdGFydHVwLCBnaXN0X3hsb2dfY2xlYW51 cCwgZ2lzdF9tYXNrLCBOVUxMKQorUEdfUk1HUihSTV9HSU5fSUQsICJHaW4iLCBnaW5fcmVk bywgZ2luX2Rlc2MsIGdpbl9pZGVudGlmeSwgTlVMTCwgTlVMTCwgZ2luX21hc2ssIE5VTEwp CitQR19STUdSKFJNX0dJU1RfSUQsICJHaXN0IiwgZ2lzdF9yZWRvLCBnaXN0X2Rlc2MsIGdp c3RfaWRlbnRpZnksIE5VTEwsIE5VTEwsIGdpc3RfbWFzaywgTlVMTCkKIFBHX1JNR1IoUk1f U0VRX0lELCAiU2VxdWVuY2UiLCBzZXFfcmVkbywgc2VxX2Rlc2MsIHNlcV9pZGVudGlmeSwg TlVMTCwgTlVMTCwgc2VxX21hc2ssIE5VTEwpCi1QR19STUdSKFJNX1NQR0lTVF9JRCwgIlNQ R2lzdCIsIHNwZ19yZWRvLCBzcGdfZGVzYywgc3BnX2lkZW50aWZ5LCBzcGdfeGxvZ19zdGFy dHVwLCBzcGdfeGxvZ19jbGVhbnVwLCBzcGdfbWFzaywgTlVMTCkKK1BHX1JNR1IoUk1fU1BH SVNUX0lELCAiU1BHaXN0Iiwgc3BnX3JlZG8sIHNwZ19kZXNjLCBzcGdfaWRlbnRpZnksIE5V TEwsIE5VTEwsIHNwZ19tYXNrLCBOVUxMKQogUEdfUk1HUihSTV9CUklOX0lELCAiQlJJTiIs IGJyaW5fcmVkbywgYnJpbl9kZXNjLCBicmluX2lkZW50aWZ5LCBOVUxMLCBOVUxMLCBicmlu X21hc2ssIE5VTEwpCiBQR19STUdSKFJNX0NPTU1JVF9UU19JRCwgIkNvbW1pdFRzIiwgY29t bWl0X3RzX3JlZG8sIGNvbW1pdF90c19kZXNjLCBjb21taXRfdHNfaWRlbnRpZnksIE5VTEws IE5VTEwsIE5VTEwsIE5VTEwpCiBQR19STUdSKFJNX1JFUExPUklHSU5fSUQsICJSZXBsaWNh dGlvbk9yaWdpbiIsIHJlcGxvcmlnaW5fcmVkbywgcmVwbG9yaWdpbl9kZXNjLCByZXBsb3Jp Z2luX2lkZW50aWZ5LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKQpkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvYWNjZXNzL3NwZ3hsb2cuaCBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9zcGd4bG9n LmgKaW5kZXggMTZjYzczNTAwMS4uZmNkNzY4YTFjMSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1 ZGUvYWNjZXNzL3NwZ3hsb2cuaAorKysgYi9zcmMvaW5jbHVkZS9hY2Nlc3Mvc3BneGxvZy5o CkBAIC0yNTIsOCArMjUyLDYgQEAgdHlwZWRlZiBzdHJ1Y3Qgc3BneGxvZ1ZhY3V1bVJlZGly ZWN0CiBleHRlcm4gdm9pZCBzcGdfcmVkbyhYTG9nUmVhZGVyU3RhdGUgKnJlY29yZCk7CiBl eHRlcm4gdm9pZCBzcGdfZGVzYyhTdHJpbmdJbmZvIGJ1ZiwgWExvZ1JlYWRlclN0YXRlICpy ZWNvcmQpOwogZXh0ZXJuIGNvbnN0IGNoYXIgKnNwZ19pZGVudGlmeSh1aW50OCBpbmZvKTsK LWV4dGVybiB2b2lkIHNwZ194bG9nX3N0YXJ0dXAodm9pZCk7Ci1leHRlcm4gdm9pZCBzcGdf eGxvZ19jbGVhbnVwKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3BnX21hc2soY2hhciAqcGFnZWRh dGEsIEJsb2NrTnVtYmVyIGJsa25vKTsKIAogI2VuZGlmCQkJCQkJCS8qIFNQR1hMT0dfSCAq LwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL3hsb2dfaW50ZXJuYWwuaCBiL3Ny Yy9pbmNsdWRlL2FjY2Vzcy94bG9nX2ludGVybmFsLmgKaW5kZXggYzZhOTFmYjQ1Ni4uNGRm MjI0YmIxNiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvYWNjZXNzL3hsb2dfaW50ZXJuYWwu aAorKysgYi9zcmMvaW5jbHVkZS9hY2Nlc3MveGxvZ19pbnRlcm5hbC5oCkBAIC0zMzUsNiAr MzM1LDExIEBAIHN0cnVjdCBYTG9nUmVjb3JkQnVmZmVyOwogICogVGhpcyBzdHJ1Y3QgbXVz dCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgUEdfUk1HUiBkZWZpbml0aW9uIGluCiAgKiBy bWdyLmMuCiAgKgorICogcm1fcmVkbyBpcyB0aGUgY29yZSBmdW5jdGlvbiB0aGF0IHJlcGxh eXMgb25lIFdBTCByZWNvcmQuICBEdXJpbmcgV0FMCisgKiByZWNvdmVyeSwgaXQgaXMgY2Fs bGVkIG9uY2UgZm9yIGV2ZXJ5IFdBTCByZWNvcmQgYmVsb25naW5nIHRvIHRoZSByZXNvdXJj ZQorICogbWFuYWdlci4gIEl0J3MgY2FsbGVkIGluIGEgdGVtcG9yYXJ5IG1lbW9yeSBjb250 ZXh0IHRoYXQgaXMgcmVzZXQgYmV0d2VlbgorICogZXZlcnkgcmVjb3JkLgorICoKICAqIHJt X2lkZW50aWZ5IG11c3QgcmV0dXJuIGEgbmFtZSBmb3IgdGhlIHJlY29yZCBiYXNlZCBvbiB4 bF9pbmZvICh3aXRob3V0CiAgKiByZWZlcmVuY2UgdG8gdGhlIHJtaWQpLiBGb3IgZXhhbXBs ZSwgWExPR19CVFJFRV9WQUNVVU0gd291bGQgYmUgbmFtZWQKICAqICJWQUNVVU0iLiBybV9k ZXNjIGNhbiB0aGVuIGJlIGNhbGxlZCB0byBvYnRhaW4gYWRkaXRpb25hbCBkZXRhaWwgZm9y IHRoZQotLSAKMi4zOS4yCgo= --------------s6wxVh9chRdkKlEQuCnGvtw0 Content-Type: application/x-shellscript; name="redobench.sh" Content-Disposition: attachment; filename="redobench.sh" Content-Transfer-Encoding: base64 IyEvYmluL2Jhc2gKIwojIFJlc3RvcmUgdGhlIGJhY2t1cCBjcmVhdGVkIGJ5ICdyZWRvYmVu Y2gtc2V0dXAuc2gnLCBhbmQgdGltZSBob3cKIyBsb25nIGl0IHRha2VzIHRvIHJlcGxheSBh bGwgdGhlIFdBTC4KCnNldCAtZQoKcm0gLXJmIHBnZGF0YQoKY3AgLWEgcGdkYXRhLWJhY2t1 cCBwZ2RhdGEKCmVjaG8gIiIgPiBwZ2RhdGEvcmVjb3Zlcnkuc2lnbmFsCmNhdCA8PEVPRiA+ PiBwZ2RhdGEvcG9zdGdyZXNxbC5jb25mCnJlc3RvcmVfY29tbWFuZCA9ICdjcCAvaG9tZS9o ZWlra2kvcGdzcWwuZnNtZm9yay9wZ2RhdGEtYXJjaGl2ZS8lZiAiJXAiJwpyZWNvdmVyeV90 YXJnZXRfbmFtZSA9ICd0aGUtZW5kJwpyZWNvdmVyeV90YXJnZXRfYWN0aW9uID0gJ3NodXRk b3duJwpFT0YKCnRpbWUgcG9zdGdyZXMgLUQgcGdkYXRhCiNwZXJmIHJlY29yZCAtLWNhbGwt Z3JhcGg9bGJyIHBvc3RncmVzIC1EIHBnZGF0YQo= --------------s6wxVh9chRdkKlEQuCnGvtw0 Content-Type: application/x-shellscript; name="redobench-setup.sh" Content-Disposition: attachment; filename="redobench-setup.sh" Content-Transfer-Encoding: base64 IyEvYmluL2Jhc2gKIwojIENyZWF0ZSBhIGJhY2t1cCBhbmQgYWJvdXQgNSBHQiBvZiBXQUwu IFRoZSBXQUwgY29uc2lzdHMgb2YganVzdAojIGxvZ2ljYWwgbWVzc2FnZXMsIHdoaWNoIHJl cXVpcmUgcHJhY3RpY2FsbHkgbm8gZWZmb3J0IHRvCiMgcmVwbGF5LiBUaGF0IG1ha2VzIGFu eSBwZXItcmVjb3JkIG92ZXJoZWFkIGluIHJlYWRpbmcgdGhlIFdBTCBhbmQKIyBjYWxsaW5n IHRoZSByZWRvIGZ1bmN0aW9uIHN0YW5kIG91dC4KCnNldCAtZQoKcm0gLXJmIHBnZGF0YSBw Z2RhdGEtYXJjaGl2ZSBwZ2RhdGEtYmFja3VwCm1rZGlyIHBnZGF0YS1hcmNoaXZlCmluaXRk YiAtRCBwZ2RhdGEKCmNwIC1hIHBnZGF0YSBwZ2RhdGEtYmFja3VwCgpjYXQgPDxFT0YgPj4g cGdkYXRhL3Bvc3RncmVzcWwuY29uZgphcmNoaXZlX21vZGUgPSBvbgphcmNoaXZlX2NvbW1h bmQgPSAndGVzdCAhIC1mIC9ob21lL2hlaWtraS9wZ3NxbC5mc21mb3JrL3BnZGF0YS1hcmNo aXZlLyVmICYmIGNwICVwIC9ob21lL2hlaWtraS9wZ3NxbC5mc21mb3JrL3BnZGF0YS1hcmNo aXZlLyVmJwpFT0YKCnBnX2N0bCAtRCBwZ2RhdGEgc3RhcnQgLWwgbG9nCgpmb3IgKCggaT0w OyBpPDEwOyBpKysgKSkgOyB7CiAgICBwc3FsIHBvc3RncmVzIC1jICJzZWxlY3QgcGdfbG9n aWNhbF9lbWl0X21lc3NhZ2UoZmFsc2UsICcnLCAnJywgZmFsc2UpIGZyb20gZ2VuZXJhdGVf c2VyaWVzKDEsIDEwMDAwMDAwKSBnOyIgPiAvZGV2L251bGwKfQoKcHNxbCBwb3N0Z3JlcyAt YyAic2VsZWN0IHBnX2NyZWF0ZV9yZXN0b3JlX3BvaW50KCd0aGUtZW5kJykiID4gL2Rldi9u dWxsCnBzcWwgcG9zdGdyZXMgLWMgInNlbGVjdCBwZ19zd2l0Y2hfd2FsKCkiID4gL2Rldi9u dWxsCgojIHdhaXQgZm9yIGFsbCB0aGUgV0FMIHRvIGJlIGFyY2hpdmVkCnNsZWVwIDIKcGdf Y3RsIC1EIHBnZGF0YSBzdG9wCg== --------------s6wxVh9chRdkKlEQuCnGvtw0--