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 1w7pYr-005jiS-18 for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Apr 2026 07:00:21 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w7pYp-00FTeV-2Z for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Apr 2026 07:00:20 +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 1w7pYo-00FTeL-2Q for pgsql-hackers@lists.postgresql.org; Wed, 01 Apr 2026 07:00:19 +0000 Received: from fhigh-a3-smtp.messagingengine.com ([103.168.172.154]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1w7pYn-0000000267B-0Qsb for pgsql-hackers@postgresql.org; Wed, 01 Apr 2026 07:00:18 +0000 Received: from phl-compute-05.internal (phl-compute-05.internal [10.202.2.45]) by mailfhigh.phl.internal (Postfix) with ESMTP id 130F1140026F for ; Wed, 1 Apr 2026 03:00:16 -0400 (EDT) Received: from phl-imap-03 ([10.202.2.93]) by phl-compute-05.internal (MEProxy); Wed, 01 Apr 2026 03:00:16 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= cc:content-type:content-type:date:date:from:from:in-reply-to :message-id:mime-version:reply-to:subject:subject:to:to; s=fm2; t=1775026816; x=1775113216; bh=tegnItJExp+BNQNs6nDrpIFw7dvEonTv NF8J5YaOwls=; b=fU5iu4kzkCnLwDLOBBDevQo50LhKZ7FwaZ5hg7kr1kAR8u1C qqydfeo+7FfEqAC7FydztC4v1Hl+ZAgfqviG1LBWJecqkixck36HxPTloBH5loaF DnByvequQHT5kdujtooJ4vvDZpoFNjtkro0kB8LfU3NH3qrlEfKRCWTwHhJ8ANiT wJ/1qcXAkUGy6MCvRRdNcn7My6SQLm17M0yOz4Jjdl1rGqIlFBH8nxG7t6CEN+0T Wzwv4v+j1/gypnsKtdL9M4XlJxhMEUTjSyLL+DdidR8zUwwxbw2xfhCdrQ9vrxcx mFaSCEOSBcBMc5528RJUVHwpPQ+DNZFDOr7ohQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:message-id :mime-version:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t=1775026816; x= 1775113216; bh=tegnItJExp+BNQNs6nDrpIFw7dvEonTvNF8J5YaOwls=; b=G XGHug+2tN3CRDqSLbNsAY92MgifUeaGC9YUjbJRuZrUNREo5Y+LIhPEWOOYW6cdl s4NTNQv1nfbVQ29ZZyUZydX6Ka1uVOYSQIi6FJRCUEMe5F9cmJDKxPkfyRq0a+NE rUFCs0TsKj+zMiiT+Xnk3bELbqxaLa7dGvD8pC8xr90kEq9o/pZ5tEvhpxdY8ZB1 QsRYnldMnyB+UDIPUyq2Nso1e+MfupMdG0d5U9VgTC8WQhfkK+kRr1e04Z25FxY6 lSc8rOAAirWZQTGRXiD09n+mzyASkPe92RYVWty/pvNnxR4PKtbVUCW/giI3N+Rj gyand6RcMuAHfxnUVp10A== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefhedrtddtgddvgeehucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceurghi lhhouhhtmecufedttdenucenucfjughrpefoggffhffvkffutgesmhdtreerredttdenuc fhrhhomhepfdflohgvlhculfgrtghosghsohhnfdcuoehjohgvlhestghomhhpihhlvghr rdhorhhgqeenucggtffrrghtthgvrhhnpeelffevfeevuedvkeehgfefhefggffhjeelhf efffeutdffiefhleeuuedugeehvdenucffohhmrghinhepfhhrrghnkhhfuhhrthgvrhdr rghpphenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpe hjohgvlhestghomhhpihhlvghrrdhorhhgpdhnsggprhgtphhtthhopedupdhmohguvgep shhmthhpohhuthdprhgtphhtthhopehpghhsqhhlqdhhrggtkhgvrhhssehpohhsthhgrh gvshhqlhdrohhrgh X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.phl.internal (Postfix, from userid 501) id 81F4818E006C; Wed, 1 Apr 2026 03:00:15 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface MIME-Version: 1.0 X-ThreadId: AWqBRBHUmi83 Date: Wed, 01 Apr 2026 09:00:15 +0200 From: "Joel Jacobson" To: pgsql-hackers Message-Id: Subject: [PATCH] Add fx exchange support to money type Content-Type: multipart/mixed; boundary=41fe7bb2d9c64f2e89a3ff3ffbe1f63b List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --41fe7bb2d9c64f2e89a3ff3ffbe1f63b Content-Type: text/plain Content-Transfer-Encoding: 7bit Hi hackers, During Nordic PGDay 2026, a group of us discussed various open problems, and the money type was a heavily debated topic. We all agreed that something needs to be done, since it's quite a terrible type for various reasons. One idea that was suggested was to move it to contrib/ and try to deprecate it. Instead of doing that, I suggest that we try to fix it. One of the most frequent complaints about the money type is the lack of currency exchange rate support. PostgreSQL recently added a build option for libcurl, so adding support for this now seems doable, and by caching the exchange rate per session, users will not have to pay the cost for an FX lookup more than once per session, per currency pair. This can smoothly be extended to support a shared FX cache, with persistent storage on disk, to ensure FX rates survive reconnections and restarts. The freely available FX API from https://api.frankfurter.app/ is currently hard-coded as a proof of concept, but this should of course be made configurable via a new GUC, which should be a list of API URLs for redundancy. Here is an example that converts from USD to SEK: joel@Mac postgresql % psql psql (19devel) Type "help" for help. joel=# \timing Timing is on. joel=# SELECT 100::money AS usd; usd --------- $100.00 (1 row) Time: 1.429 ms joel=# SET money_source_currency = 'USD'; SET Time: 0.530 ms joel=# SET lc_monetary = 'sv_SE.UTF-8'; SET Time: 0.906 ms joel=# SELECT 100::money AS usd; usd ----------- 949,67 kr (1 row) Time: 38.121 ms joel=# SELECT 100::money AS usd; usd ----------- 949,67 kr (1 row) Time: 0.324 ms joel=# As shown above, the FX lookup takes about 38 ms the first time, after which the session cache makes subsequent lookups cheap. /Joel --41fe7bb2d9c64f2e89a3ff3ffbe1f63b Content-Disposition: attachment; filename*0="0001-Add-fx-exchange-support-to-money-type.patch" Content-Type: application/octet-stream; name="=?UTF-8?Q?0001-Add-fx-exchange-support-to-money-type.patch?=" Content-Transfer-Encoding: base64 RnJvbSBkOTMwMDBjY2MwZTA3MGE3YTAyZjY1ZWVhZDZiNGU5YjA4Y2FmODFlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogTW9uLCAzMCBNYXIgMjAyNiAyMjowNTo0NSArMDIwMApTdWJqZWN0OiBbUEFU Q0hdIEFkZCBmeCBleGNoYW5nZSBzdXBwb3J0IHRvIG1vbmV5IHR5cGUKClRoZSBtb25leSB0 eXBlIGhhcyBsb25nIGJlZW4gY3JpdGljaXplZCBmb3IgYmVpbmcgdG9vIHRpZ2h0bHkgYm91 bmQKdG8gYSBzaW5nbGUgbG9jYWxlJ3MgY3VycmVuY3kuICBUaGlzIGNvbW1pdCBmaXhlcyB0 aGF0IGxpbWl0YXRpb24KYnkgdGVhY2hpbmcgY2FzaF9vdXQoKSB0byBhdXRvbWF0aWNhbGx5 IGNvbnZlcnQgc3RvcmVkIHZhbHVlcyBpbnRvCnRoZSBjbGllbnQncyBsb2NhbCBjdXJyZW5j eSB1c2luZyBsaXZlIGV4Y2hhbmdlIHJhdGVzIGZyb20gdGhlCkV1cm9wZWFuIENlbnRyYWwg QmFuaywgZmV0Y2hlZCB2aWEgbGliY3VybC4KCkEgbmV3IEdVQywgbW9uZXlfc291cmNlX2N1 cnJlbmN5LCBzcGVjaWZpZXMgdGhlIElTTyA0MjE3IGN1cnJlbmN5CmNvZGUgb2YgdGhlIHN0 b3JlZCBkYXRhIChlLmcuICdVU0QnKS4gIFdoZW4gdGhpcyBkaWZmZXJzIGZyb20gdGhlCmN1 cnJlbmN5IGltcGxpZWQgYnkgdGhlIHNlc3Npb24ncyBsY19tb25ldGFyeSBzZXR0aW5nLCBj YXNoX291dCgpCm11bHRpcGxpZXMgdGhlIHN0b3JlZCB2YWx1ZSBieSB0aGUgY3VycmVudCBl eGNoYW5nZSByYXRlIGJlZm9yZQpmb3JtYXR0aW5nLiAgUmF0ZXMgYXJlIGNhY2hlZCBwZXIt c2Vzc2lvbiB3aXRoIGEgb25lLWhvdXIgVFRMIHRvCmtlZXAgdGhlIEVDQidzIEFQSSB0cmFm ZmljIHRvIGEgbWluaW11bS4KCklmIHRoZSBleGNoYW5nZSByYXRlIHNlcnZpY2UgaXMgdW5y ZWFjaGFibGUsIG9yIGlmIG1vbmV5X3NvdXJjZV9jdXJyZW5jeQppcyBlbXB0eSAodGhlIGRl ZmF1bHQpLCB2YWx1ZXMgYXJlIGRpc3BsYXllZCB1bm1vZGlmaWVkIC0tLSBzbyB0aGlzCmlz IGZ1bGx5IGJhY2t3YXJkLWNvbXBhdGlibGUsIG1vZHVsbyB0aGUgbmVlZCBmb3IgYW4gaW50 ZXJuZXQKY29ubmVjdGlvbiBhbmQgYSBzZW5zZSBvZiBodW1vci4KClRoZSBjb252ZXJzaW9u IGlzIGRpc3BsYXktb25seTogc3RvcmVkIGludDY0IHZhbHVlcyBhcmUgbmV2ZXIKdG91Y2hl ZC4gIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2Ugb3RoZXJ3aXNlIHdlJ2QgbmVlZCB0byB3 b3JyeQphYm91dCByb3VuZGluZy1pbmR1Y2VkIHdlYWx0aCBjcmVhdGlvbiwgd2hpY2ggd2hp bGUgdGVtcHRpbmcgaXMKZnJvd25lZCB1cG9uIGJ5IHRoZSBhY2NvdW50aW5nIHByb2Zlc3Np b24uCgpSZXF1aXJlcyBsaWJjdXJsLiAgT24gYnVpbGRzIHdpdGhvdXQgaXQsIHRoZSBmZWF0 dXJlIGNvbXBpbGVzIG91dAphbmQgbW9uZXkgYmVoYXZlcyBleGFjdGx5IGFzIGJlZm9yZSwg d2hpY2ggaXMgdG8gc2F5LCBiYWRseS4KLS0tCiBtZXNvbi5idWlsZCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgNSArCiBzcmMvYmFja2VuZC91dGlscy9hZHQvY2FzaC5j ICAgICAgICAgICAgICB8ICAxMiArCiBzcmMvYmFja2VuZC91dGlscy9hZHQvY2FzaF9leGNo YW5nZS5jICAgICB8IDMyNSArKysrKysrKysrKysrKysrKysrKysrCiBzcmMvYmFja2VuZC91 dGlscy9hZHQvbWVzb24uYnVpbGQgICAgICAgICB8ICAgMSArCiBzcmMvYmFja2VuZC91dGls cy9taXNjL2d1Y19wYXJhbWV0ZXJzLmRhdCB8ICAgOCArCiBzcmMvYmFja2VuZC91dGlscy9t aXNjL2d1Y190YWJsZXMuYyAgICAgICB8ICAgMSArCiBzcmMvaW5jbHVkZS91dGlscy9jYXNo X2V4Y2hhbmdlLmggICAgICAgICB8ICAyMiArKwogc3JjL2luY2x1ZGUvdXRpbHMvZ3VjX2hv b2tzLmggICAgICAgICAgICAgfCAgIDEgKwogOCBmaWxlcyBjaGFuZ2VkLCAzNzUgaW5zZXJ0 aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9jYXNo X2V4Y2hhbmdlLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvaW5jbHVkZS91dGlscy9jYXNo X2V4Y2hhbmdlLmgKCmRpZmYgLS1naXQgYS9tZXNvbi5idWlsZCBiL21lc29uLmJ1aWxkCmlu ZGV4IGVhMzFjYmNlOWMwLi5hY2VjYWIxYTZiNiAxMDA2NDQKLS0tIGEvbWVzb24uYnVpbGQK KysrIGIvbWVzb24uYnVpbGQKQEAgLTEwOTEsNiArMTA5MSwxMSBAQCBlbHNlCiAgIGxpYmN1 cmwgPSBub3RfZm91bmRfZGVwCiBlbmRpZgogCisjIE1ha2UgbGliY3VybCBhdmFpbGFibGUg dG8gdGhlIGJhY2tlbmQgZm9yIEZYIHJhdGUgZmV0Y2hpbmcKK2lmIGxpYmN1cmwuZm91bmQo KQorICBiYWNrZW5kX2JvdGhfZGVwcyArPSBsaWJjdXJsCitlbmRpZgorCiAKICMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IwogIyBMaWJyYXJ5OiBsaWJudW1hCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9h ZHQvY2FzaC5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2Nhc2guYwppbmRleCBmMDQ4N2E2 MGYwMC4uYjhjMTI4ODM4MmYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9j YXNoLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2Nhc2guYwpAQCAtMjksNiArMjks NyBAQAogI2luY2x1ZGUgInV0aWxzL2Nhc2guaCIKICNpbmNsdWRlICJ1dGlscy9mbG9hdC5o IgogI2luY2x1ZGUgInV0aWxzL251bWVyaWMuaCIKKyNpbmNsdWRlICJ1dGlscy9jYXNoX2V4 Y2hhbmdlLmgiCiAjaW5jbHVkZSAidXRpbHMvcGdfbG9jYWxlLmgiCiAKIApAQCAtMzg4LDYg KzM4OSw3IEBAIERhdHVtCiBjYXNoX291dChQR19GVU5DVElPTl9BUkdTKQogewogCUNhc2gJ CXZhbHVlID0gUEdfR0VUQVJHX0NBU0goMCk7CisJZmxvYXQ4CQlmeF9yYXRlOwogCXVpbnQ2 NAkJdXZhbHVlOwogCWNoYXIJICAgKnJlc3VsdDsKIAljaGFyCQlidWZbMTI4XTsKQEAgLTQw NCw2ICs0MDYsMTYgQEAgY2FzaF9vdXQoUEdfRlVOQ1RJT05fQVJHUykKIAkJCQlzZXBfYnlf c3BhY2U7CiAJc3RydWN0IGxjb252ICpsY29udmVydCA9IFBHTENfbG9jYWxlY29udigpOwog CisJLyogQXBwbHkgZXhjaGFuZ2UgcmF0ZSBjb252ZXJzaW9uIGlmIGNvbmZpZ3VyZWQgKi8K KwlmeF9yYXRlID0gY2FzaF9leGNoYW5nZV9yYXRlKCk7CisJaWYgKGZ4X3JhdGUgIT0gMS4w KQorCXsKKwkJZmxvYXQ4CQljb252ZXJ0ZWQgPSByaW50KChmbG9hdDgpIHZhbHVlICogZnhf cmF0ZSk7CisKKwkJaWYgKCFpc25hbihjb252ZXJ0ZWQpICYmIEZMT0FUOF9GSVRTX0lOX0lO VDY0KGNvbnZlcnRlZCkpCisJCQl2YWx1ZSA9IChDYXNoKSBjb252ZXJ0ZWQ7CisJfQorCiAJ Lyogc2VlIGNvbW1lbnRzIGFib3V0IGZyYWNfZGlnaXRzIGluIGNhc2hfaW4oKSAqLwogCXBv aW50cyA9IGxjb252ZXJ0LT5mcmFjX2RpZ2l0czsKIAlpZiAocG9pbnRzIDwgMCB8fCBwb2lu dHMgPiAxMCkKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9jYXNoX2V4Y2hh bmdlLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvY2FzaF9leGNoYW5nZS5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi42YmRjZTRmOGVlMQotLS0gL2Rldi9u dWxsCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9jYXNoX2V4Y2hhbmdlLmMKQEAgLTAs MCArMSwzMjUgQEAKKy8qCisgKiBjYXNoX2V4Y2hhbmdlLmMKKyAqCQlBdXRvbWF0aWMgZXhj aGFuZ2UgcmF0ZSBjb252ZXJzaW9uIGZvciB0aGUgbW9uZXkgdHlwZS4KKyAqCisgKiBXaGVu IG1vbmV5X3NvdXJjZV9jdXJyZW5jeSBpcyBzZXQgdG8gYW4gSVNPIDQyMTcgY29kZSAoZS5n LiAiVVNEIikKKyAqIGFuZCB0aGUgc2Vzc2lvbidzIGxjX21vbmV0YXJ5IGxvY2FsZSBpbXBs aWVzIGEgZGlmZmVyZW50IGN1cnJlbmN5LAorICogY2FzaF9leGNoYW5nZV9yYXRlKCkgcmV0 dXJucyBhIGNvbnZlcnNpb24gZmFjdG9yIHRoYXQgY2FzaF9vdXQoKQorICogYXBwbGllcyBh dCBkaXNwbGF5IHRpbWUuICBSYXRlcyBhcmUgZmV0Y2hlZCBmcm9tIHRoZSBFdXJvcGVhbiBD ZW50cmFsCisgKiBCYW5rIHZpYSB0aGUgRnJhbmtmdXJ0ZXIgQVBJIGFuZCBjYWNoZWQgcGVy LXNlc3Npb24gZm9yIG9uZSBob3VyLgorICoKKyAqIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9j YXNoX2V4Y2hhbmdlLmMKKyAqLworI2luY2x1ZGUgInBvc3RncmVzLmgiCisKKyNpbmNsdWRl IDxjdHlwZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImNvbW1vbi9qc29u YXBpLmgiCisjaW5jbHVkZSAibWIvcGdfd2NoYXIuaCIKKyNpbmNsdWRlICJ1dGlscy9jYXNo X2V4Y2hhbmdlLmgiCisjaW5jbHVkZSAidXRpbHMvZ3VjLmgiCisjaW5jbHVkZSAidXRpbHMv cGdfbG9jYWxlLmgiCisjaW5jbHVkZSAidXRpbHMvdGltZXN0YW1wLmgiCisKKyNpZmRlZiBV U0VfTElCQ1VSTAorI2luY2x1ZGUgPGN1cmwvY3VybC5oPgorI2VuZGlmCisKKy8qIEdVQyB2 YXJpYWJsZSAqLworY2hhcgkgICAqbW9uZXlfc291cmNlX2N1cnJlbmN5ID0gIiI7CisKKy8q CisgKiBTZXNzaW9uLWxvY2FsIGV4Y2hhbmdlIHJhdGUgY2FjaGUuICBXZSBrZWVwIG9ubHkg b25lIGN1cnJlbmN5IHBhaXIKKyAqIGNhY2hlZCwgd2hpY2ggaXMgZmluZSBiZWNhdXNlIGEg c2Vzc2lvbiB0eXBpY2FsbHkgdXNlcyBvbmUgbGNfbW9uZXRhcnkKKyAqIHNldHRpbmcgdGhy b3VnaG91dC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgRlhSYXRlQ2FjaGUKK3sKKwljaGFyCQlm cm9tX2N1cnJlbmN5WzRdOwkvKiBJU08gNDIxNyBzb3VyY2UgKi8KKwljaGFyCQl0b19jdXJy ZW5jeVs0XTsJCS8qIElTTyA0MjE3IHRhcmdldCAqLworCWZsb2F0OAkJcmF0ZTsKKwlUaW1l c3RhbXBUeiBmZXRjaF90aW1lOworCWJvb2wJCXZhbGlkOworfSBGWFJhdGVDYWNoZTsKKwor c3RhdGljIEZYUmF0ZUNhY2hlIGZ4X2NhY2hlID0gey52YWxpZCA9IGZhbHNlfTsKKworLyog Q2FjaGUgVFRMOiAxIGhvdXIgKi8KKyNkZWZpbmUgRlhfQ0FDSEVfVFRMX1VTRUMJKElOVDY0 Q09OU1QoMzYwMCkgKiBVU0VDU19QRVJfU0VDKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgkJR1VD IGNoZWNrIGhvb2sKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworYm9vbAorY2hlY2tfbW9uZXlfc291 cmNlX2N1cnJlbmN5KGNoYXIgKipuZXd2YWwsIHZvaWQgKipleHRyYSwgR3VjU291cmNlIHNv dXJjZSkKK3sKKwljb25zdCBjaGFyICp2YWwgPSAqbmV3dmFsOworCisJLyogRW1wdHkgc3Ry aW5nIGRpc2FibGVzIGNvbnZlcnNpb24gKi8KKwlpZiAodmFsWzBdID09ICdcMCcpCisJCXJl dHVybiB0cnVlOworCisJLyogTXVzdCBiZSBleGFjdGx5IDMgQVNDSUkgYWxwaGFiZXRpYyBj aGFyYWN0ZXJzICovCisJaWYgKHN0cmxlbih2YWwpICE9IDMgfHwKKwkJIWlzYWxwaGEoKHVu c2lnbmVkIGNoYXIpIHZhbFswXSkgfHwKKwkJIWlzYWxwaGEoKHVuc2lnbmVkIGNoYXIpIHZh bFsxXSkgfHwKKwkJIWlzYWxwaGEoKHVuc2lnbmVkIGNoYXIpIHZhbFsyXSkpCisJeworCQlH VUNfY2hlY2tfZXJyZGV0YWlsKCJWYWx1ZSBtdXN0IGJlIGEgMy1sZXR0ZXIgSVNPIDQyMTcg Y3VycmVuY3kgY29kZS4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVl OworfQorCisjaWZkZWYgVVNFX0xJQkNVUkwKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoJCWxpYmN1 cmwgcmVzcG9uc2UgYnVmZmVyCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3R5cGVkZWYgc3RydWN0 IEN1cmxCdWZmZXIKK3sKKwljaGFyCSAgICpkYXRhOworCXNpemVfdAkJbGVuOworCXNpemVf dAkJY2FwYWNpdHk7Cit9IEN1cmxCdWZmZXI7CisKKyNkZWZpbmUgQ1VSTF9CVUZfSU5JVF9T SVpFCTEwMjQKKyNkZWZpbmUgQ1VSTF9CVUZfTUFYX1NJWkUJKDY0ICogMTAyNCkKKworc3Rh dGljIHNpemVfdAorY3VybF93cml0ZV9jYihjaGFyICpwdHIsIHNpemVfdCBzaXplLCBzaXpl X3Qgbm1lbWIsIHZvaWQgKnVzZXJkYXRhKQoreworCUN1cmxCdWZmZXIgKmJ1ZiA9IChDdXJs QnVmZmVyICopIHVzZXJkYXRhOworCXNpemVfdAkJYnl0ZXMgPSBzaXplICogbm1lbWI7CisK KwlpZiAoYnVmLT5sZW4gKyBieXRlcyA+IENVUkxfQlVGX01BWF9TSVpFKQorCQlyZXR1cm4g MDsJCQkJLyogc2lnbmFsIGVycm9yIHRvIGN1cmwgKi8KKworCWlmIChidWYtPmxlbiArIGJ5 dGVzID49IGJ1Zi0+Y2FwYWNpdHkpCisJeworCQlidWYtPmNhcGFjaXR5ID0gTWF4KGJ1Zi0+ Y2FwYWNpdHkgKiAyLCBidWYtPmxlbiArIGJ5dGVzICsgMSk7CisJCWJ1Zi0+ZGF0YSA9IHJl cGFsbG9jKGJ1Zi0+ZGF0YSwgYnVmLT5jYXBhY2l0eSk7CisJfQorCisJbWVtY3B5KGJ1Zi0+ ZGF0YSArIGJ1Zi0+bGVuLCBwdHIsIGJ5dGVzKTsKKwlidWYtPmxlbiArPSBieXRlczsKKwli dWYtPmRhdGFbYnVmLT5sZW5dID0gJ1wwJzsKKwlyZXR1cm4gYnl0ZXM7Cit9CisKKy8qIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyAqCQlKU09OIHJlc3BvbnNlIHBhcnNlcgorICoKKyAqIFdlIHBhcnNlIHRo ZSBGcmFua2Z1cnRlciBBUEkgcmVzcG9uc2Ugd2hpY2ggbG9va3MgbGlrZToKKyAqICAgeyJh bW91bnQiOjEuMCwiYmFzZSI6IlVTRCIsImRhdGUiOiIyMDI2LTAzLTI4IiwicmF0ZXMiOnsi RVVSIjowLjkyfX0KKyAqCisgKiBXZSB0cmFjayB0aGUgY3VycmVudCBmaWVsZCBuYW1lIGFu ZCBsb29rIGZvciBhIHNjYWxhciB2YWx1ZSB3aG9zZQorICogZmllbGQgbmFtZSBtYXRjaGVz IHRoZSB0YXJnZXQgY3VycmVuY3kgY29kZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwordHlwZWRl ZiBzdHJ1Y3QgRlhQYXJzZVN0YXRlCit7CisJY2hhcgkJbGFzdF9maWVsZFs4XTsKKwlmbG9h dDgJCXJhdGU7CisJYm9vbAkJZm91bmRfcmF0ZTsKKwljb25zdCBjaGFyICp0YXJnZXRfY3Vy cmVuY3k7CisJaW50CQkJZGVwdGg7CQkJLyogbmVzdGluZyBkZXB0aCBpbnNpZGUgInJhdGVz IiBvYmplY3QgKi8KKwlib29sCQlpbl9yYXRlczsKK30gRlhQYXJzZVN0YXRlOworCitzdGF0 aWMgSnNvblBhcnNlRXJyb3JUeXBlCitmeF9vYmplY3RfZmllbGRfc3RhcnQodm9pZCAqc3Rh dGUsIGNoYXIgKmZuYW1lLCBib29sIGlzbnVsbCkKK3sKKwlGWFBhcnNlU3RhdGUgKnMgPSAo RlhQYXJzZVN0YXRlICopIHN0YXRlOworCisJaWYgKGZuYW1lKQorCXsKKwkJc3RybGNweShz LT5sYXN0X2ZpZWxkLCBmbmFtZSwgc2l6ZW9mKHMtPmxhc3RfZmllbGQpKTsKKworCQlpZiAo cGdfc3RyY2FzZWNtcChmbmFtZSwgInJhdGVzIikgPT0gMCkKKwkJCXMtPmluX3JhdGVzID0g dHJ1ZTsKKwl9CisKKwlyZXR1cm4gSlNPTl9TVUNDRVNTOworfQorCitzdGF0aWMgSnNvblBh cnNlRXJyb3JUeXBlCitmeF9zY2FsYXIodm9pZCAqc3RhdGUsIGNoYXIgKnRva2VuLCBKc29u VG9rZW5UeXBlIHRva2VudHlwZSkKK3sKKwlGWFBhcnNlU3RhdGUgKnMgPSAoRlhQYXJzZVN0 YXRlICopIHN0YXRlOworCisJaWYgKHMtPmluX3JhdGVzICYmIHRva2VudHlwZSA9PSBKU09O X1RPS0VOX05VTUJFUiAmJgorCQlwZ19zdHJjYXNlY21wKHMtPmxhc3RfZmllbGQsIHMtPnRh cmdldF9jdXJyZW5jeSkgPT0gMCkKKwl7CisJCWNoYXIJICAgKmVuZHB0cjsKKworCQlzLT5y YXRlID0gc3RydG9kKHRva2VuLCAmZW5kcHRyKTsKKwkJaWYgKGVuZHB0ciAhPSB0b2tlbiAm JiBzLT5yYXRlID4gMCkKKwkJCXMtPmZvdW5kX3JhdGUgPSB0cnVlOworCX0KKworCXJldHVy biBKU09OX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBKc29uUGFyc2VFcnJvclR5cGUKK2Z4X29i amVjdF9lbmQodm9pZCAqc3RhdGUpCit7CisJRlhQYXJzZVN0YXRlICpzID0gKEZYUGFyc2VT dGF0ZSAqKSBzdGF0ZTsKKworCS8qIFJlc2V0IGluX3JhdGVzIHdoZW4gbGVhdmluZyB0aGUg cmF0ZXMgb2JqZWN0ICovCisJcy0+aW5fcmF0ZXMgPSBmYWxzZTsKKwlyZXR1cm4gSlNPTl9T VUNDRVNTOworfQorCisvKgorICogRmV0Y2ggZXhjaGFuZ2UgcmF0ZSBmcm9tIHRoZSBGcmFu a2Z1cnRlciBBUEkuCisgKiBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcywgc3RvcmluZyB0aGUg cmF0ZSBpbiAqcmF0ZV9vdXQuCisgKi8KK3N0YXRpYyBib29sCitmZXRjaF9leGNoYW5nZV9y YXRlKGNvbnN0IGNoYXIgKmZyb20sIGNvbnN0IGNoYXIgKnRvLCBmbG9hdDggKnJhdGVfb3V0 KQoreworCUNVUkwJICAgKmN1cmw7CisJQ1VSTGNvZGUJcmVzOworCUN1cmxCdWZmZXIJYnVm OworCWNoYXIJCXVybFsyNTZdOworCUpzb25MZXhDb250ZXh0IGxleDsKKwlKc29uU2VtQWN0 aW9uIHNlbTsKKwlGWFBhcnNlU3RhdGUgcGFyc2Vfc3RhdGU7CisJSnNvblBhcnNlRXJyb3JU eXBlIGpzb25fZXJyb3I7CisKKwlzbnByaW50Zih1cmwsIHNpemVvZih1cmwpLAorCQkJICJo dHRwczovL2FwaS5mcmFua2Z1cnRlci5hcHAvbGF0ZXN0P2Zyb209JS4zcyZ0bz0lLjNzIiwK KwkJCSBmcm9tLCB0byk7CisKKwkvKiBJbml0aWFsaXplIHJlc3BvbnNlIGJ1ZmZlciAqLwor CWJ1Zi5kYXRhID0gcGFsbG9jKENVUkxfQlVGX0lOSVRfU0laRSk7CisJYnVmLmRhdGFbMF0g PSAnXDAnOworCWJ1Zi5sZW4gPSAwOworCWJ1Zi5jYXBhY2l0eSA9IENVUkxfQlVGX0lOSVRf U0laRTsKKworCWN1cmwgPSBjdXJsX2Vhc3lfaW5pdCgpOworCWlmICghY3VybCkKKwl7CisJ CXBmcmVlKGJ1Zi5kYXRhKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWN1cmxfZWFzeV9z ZXRvcHQoY3VybCwgQ1VSTE9QVF9VUkwsIHVybCk7CisJY3VybF9lYXN5X3NldG9wdChjdXJs LCBDVVJMT1BUX1dSSVRFRlVOQ1RJT04sIGN1cmxfd3JpdGVfY2IpOworCWN1cmxfZWFzeV9z ZXRvcHQoY3VybCwgQ1VSTE9QVF9XUklURURBVEEsICZidWYpOworCWN1cmxfZWFzeV9zZXRv cHQoY3VybCwgQ1VSTE9QVF9USU1FT1VULCA1TCk7CisJY3VybF9lYXN5X3NldG9wdChjdXJs LCBDVVJMT1BUX05PU0lHTkFMLCAxTCk7CisJY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJM T1BUX1VTRVJBR0VOVCwgIlBvc3RncmVTUUwiKTsKKworCXJlcyA9IGN1cmxfZWFzeV9wZXJm b3JtKGN1cmwpOworCWN1cmxfZWFzeV9jbGVhbnVwKGN1cmwpOworCisJaWYgKHJlcyAhPSBD VVJMRV9PSykKKwl7CisJCXBmcmVlKGJ1Zi5kYXRhKTsKKwkJcmV0dXJuIGZhbHNlOworCX0K KworCS8qIFBhcnNlIEpTT04gcmVzcG9uc2UgKi8KKwltZW1zZXQoJnNlbSwgMCwgc2l6ZW9m KHNlbSkpOworCW1lbXNldCgmcGFyc2Vfc3RhdGUsIDAsIHNpemVvZihwYXJzZV9zdGF0ZSkp OworCisJcGFyc2Vfc3RhdGUudGFyZ2V0X2N1cnJlbmN5ID0gdG87CisJc2VtLnNlbXN0YXRl ID0gJnBhcnNlX3N0YXRlOworCXNlbS5vYmplY3RfZmllbGRfc3RhcnQgPSBmeF9vYmplY3Rf ZmllbGRfc3RhcnQ7CisJc2VtLnNjYWxhciA9IGZ4X3NjYWxhcjsKKwlzZW0ub2JqZWN0X2Vu ZCA9IGZ4X29iamVjdF9lbmQ7CisKKwltYWtlSnNvbkxleENvbnRleHRDc3RyaW5nTGVuKCZs ZXgsIGJ1Zi5kYXRhLCBidWYubGVuLAorCQkJCQkJCQlQR19VVEY4LCB0cnVlKTsKKworCWpz b25fZXJyb3IgPSBwZ19wYXJzZV9qc29uKCZsZXgsICZzZW0pOworCWZyZWVKc29uTGV4Q29u dGV4dCgmbGV4KTsKKwlwZnJlZShidWYuZGF0YSk7CisKKwlpZiAoanNvbl9lcnJvciAhPSBK U09OX1NVQ0NFU1MgfHwgIXBhcnNlX3N0YXRlLmZvdW5kX3JhdGUpCisJCXJldHVybiBmYWxz ZTsKKworCSpyYXRlX291dCA9IHBhcnNlX3N0YXRlLnJhdGU7CisJcmV0dXJuIHRydWU7Cit9 CisKKyNlbmRpZgkJCQkJCQkvKiBVU0VfTElCQ1VSTCAqLworCisvKiAtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg KgkJUHVibGljIEFQSQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBjYXNoX2V4Y2hh bmdlX3JhdGUKKyAqCisgKiBSZXR1cm5zIHRoZSBleGNoYW5nZSByYXRlIHRvIG11bHRpcGx5 IGEgc3RvcmVkIG1vbmV5IHZhbHVlIGJ5IGZvcgorICogZGlzcGxheSBpbiB0aGUgY2xpZW50 J3MgY3VycmVuY3kuICBSZXR1cm5zIDEuMCBpZiBubyBjb252ZXJzaW9uCisgKiBpcyBuZWVk ZWQgb3IgcG9zc2libGUuCisgKi8KK2Zsb2F0OAorY2FzaF9leGNoYW5nZV9yYXRlKHZvaWQp Cit7CisJc3RydWN0IGxjb252ICpsY29udmVydDsKKwljaGFyCQl0YXJnZXRbNF07CisKKwkv KiBObyBzb3VyY2UgY3VycmVuY3kgY29uZmlndXJlZD8gIE5vIGNvbnZlcnNpb24uICovCisJ aWYgKG1vbmV5X3NvdXJjZV9jdXJyZW5jeVswXSA9PSAnXDAnKQorCQlyZXR1cm4gMS4wOwor CisJLyogRXh0cmFjdCB0YXJnZXQgY3VycmVuY3kgZnJvbSBzZXNzaW9uJ3MgbGNfbW9uZXRh cnkgKi8KKwlsY29udmVydCA9IFBHTENfbG9jYWxlY29udigpOworCWlmIChzdHJsZW4obGNv bnZlcnQtPmludF9jdXJyX3N5bWJvbCkgPCAzKQorCQlyZXR1cm4gMS4wOwkJCQkvKiBsb2Nh bGUgaGFzIG5vIGN1cnJlbmN5IGluZm8gKGUuZy4gIkMiKSAqLworCisJbWVtY3B5KHRhcmdl dCwgbGNvbnZlcnQtPmludF9jdXJyX3N5bWJvbCwgMyk7CisJdGFyZ2V0WzNdID0gJ1wwJzsK KworCS8qIFNhbWUgY3VycmVuY3k/ICBObyBjb252ZXJzaW9uIG5lZWRlZC4gKi8KKwlpZiAo cGdfc3RyY2FzZWNtcChtb25leV9zb3VyY2VfY3VycmVuY3ksIHRhcmdldCkgPT0gMCkKKwkJ cmV0dXJuIDEuMDsKKworCS8qIENoZWNrIHRoZSBzZXNzaW9uLWxvY2FsIGNhY2hlICovCisJ aWYgKGZ4X2NhY2hlLnZhbGlkICYmCisJCXBnX3N0cmNhc2VjbXAoZnhfY2FjaGUuZnJvbV9j dXJyZW5jeSwgbW9uZXlfc291cmNlX2N1cnJlbmN5KSA9PSAwICYmCisJCXBnX3N0cmNhc2Vj bXAoZnhfY2FjaGUudG9fY3VycmVuY3ksIHRhcmdldCkgPT0gMCAmJgorCQkoR2V0Q3VycmVu dFRpbWVzdGFtcCgpIC0gZnhfY2FjaGUuZmV0Y2hfdGltZSkgPCBGWF9DQUNIRV9UVExfVVNF QykKKwl7CisJCXJldHVybiBmeF9jYWNoZS5yYXRlOworCX0KKworI2lmZGVmIFVTRV9MSUJD VVJMCisJeworCQlmbG9hdDgJCXJhdGU7CisKKwkJaWYgKGZldGNoX2V4Y2hhbmdlX3JhdGUo bW9uZXlfc291cmNlX2N1cnJlbmN5LCB0YXJnZXQsICZyYXRlKSkKKwkJeworCQkJc3RybGNw eShmeF9jYWNoZS5mcm9tX2N1cnJlbmN5LCBtb25leV9zb3VyY2VfY3VycmVuY3ksIDQpOwor CQkJc3RybGNweShmeF9jYWNoZS50b19jdXJyZW5jeSwgdGFyZ2V0LCA0KTsKKwkJCWZ4X2Nh Y2hlLnJhdGUgPSByYXRlOworCQkJZnhfY2FjaGUuZmV0Y2hfdGltZSA9IEdldEN1cnJlbnRU aW1lc3RhbXAoKTsKKwkJCWZ4X2NhY2hlLnZhbGlkID0gdHJ1ZTsKKworCQkJZXJlcG9ydChE RUJVRzEsCisJCQkJCShlcnJtc2coImZldGNoZWQgZXhjaGFuZ2UgcmF0ZSAlcy8lcyA9ICVn IiwKKwkJCQkJCQltb25leV9zb3VyY2VfY3VycmVuY3ksIHRhcmdldCwgcmF0ZSkpKTsKKwor CQkJcmV0dXJuIHJhdGU7CisJCX0KKworCQllcmVwb3J0KFdBUk5JTkcsCisJCQkJKGVycmNv ZGUoRVJSQ09ERV9GRFdfVU5BQkxFX1RPX0VTVEFCTElTSF9DT05ORUNUSU9OKSwKKwkJCQkg ZXJybXNnKCJjb3VsZCBub3QgZmV0Y2ggZXhjaGFuZ2UgcmF0ZSBmcm9tICVzIHRvICVzIiwK KwkJCQkJCW1vbmV5X3NvdXJjZV9jdXJyZW5jeSwgdGFyZ2V0KSwKKwkJCQkgZXJyaGludCgi VGhlIGV4Y2hhbmdlIHJhdGUgc2VydmljZSBtYXkgYmUgdW5hdmFpbGFibGUuICIKKwkJCQkJ CSAiRGlzcGxheWluZyB1bmNvbnZlcnRlZCB2YWx1ZS4iKSkpOworCX0KKyNlbmRpZgkJCQkJ CQkvKiBVU0VfTElCQ1VSTCAqLworCisJcmV0dXJuIDEuMDsKK30KZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL3V0aWxzL2FkdC9tZXNvbi5idWlsZCBiL3NyYy9iYWNrZW5kL3V0aWxzL2Fk dC9tZXNvbi5idWlsZAppbmRleCBmYjgyOTRkN2U0YS4uNjcwMTdlMDMyYjggMTAwNjQ0Ci0t LSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9tZXNvbi5idWlsZAorKysgYi9zcmMvYmFja2Vu ZC91dGlscy9hZHQvbWVzb24uYnVpbGQKQEAgLTI0LDYgKzI0LDcgQEAgYmFja2VuZF9zb3Vy Y2VzICs9IGZpbGVzKAogICAnYm9vbC5jJywKICAgJ2J5dGVhLmMnLAogICAnY2FzaC5jJywK KyAgJ2Nhc2hfZXhjaGFuZ2UuYycsCiAgICdjaGFyLmMnLAogICAnY3J5cHRvaGFzaGZ1bmNz LmMnLAogICAnZGF0ZS5jJywKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2Mv Z3VjX3BhcmFtZXRlcnMuZGF0IGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfcGFyYW1l dGVycy5kYXQKaW5kZXggMGE4NjI2OTNmY2QuLjgzYWYzMGY2NWY3IDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC91dGlscy9taXNjL2d1Y19wYXJhbWV0ZXJzLmRhdAorKysgYi9zcmMvYmFj a2VuZC91dGlscy9taXNjL2d1Y19wYXJhbWV0ZXJzLmRhdApAQCAtMjIxMCw2ICsyMjEwLDE0 IEBACiAgIG1heCA9PiAnTUFYX0tJTE9CWVRFUycsCiB9LAogCit7IG5hbWUgPT4gJ21vbmV5 X3NvdXJjZV9jdXJyZW5jeScsIHR5cGUgPT4gJ3N0cmluZycsIGNvbnRleHQgPT4gJ1BHQ19V U0VSU0VUJywgZ3JvdXAgPT4gJ0NMSUVOVF9DT05OX0xPQ0FMRScsCisgIHNob3J0X2Rlc2Mg PT4gJ1NldHMgdGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgZm9yIHN0b3JlZCBtb25leSB2 YWx1ZXMuJywKKyAgbG9uZ19kZXNjID0+ICdXaGVuIHNldCBhbmQgZGlmZmVyZW50IGZyb20g dGhlIHNlc3Npb24gbGNfbW9uZXRhcnkgY3VycmVuY3ksIG1vbmV5IHZhbHVlcyBhcmUgYXV0 b21hdGljYWxseSBjb252ZXJ0ZWQgdXNpbmcgbGl2ZSBleGNoYW5nZSByYXRlcyBhdCBkaXNw bGF5IHRpbWUuIEFuIGVtcHR5IHN0cmluZyBkaXNhYmxlcyBjb252ZXJzaW9uLicsCisgIHZh cmlhYmxlID0+ICdtb25leV9zb3VyY2VfY3VycmVuY3knLAorICBib290X3ZhbCA9PiAnIiIn LAorICBjaGVja19ob29rID0+ICdjaGVja19tb25leV9zb3VyY2VfY3VycmVuY3knLAorfSwK KwogeyBuYW1lID0+ICdtdWx0aXhhY3RfbWVtYmVyX2J1ZmZlcnMnLCB0eXBlID0+ICdpbnQn LCBjb250ZXh0ID0+ICdQR0NfUE9TVE1BU1RFUicsIGdyb3VwID0+ICdSRVNPVVJDRVNfTUVN JywKICAgc2hvcnRfZGVzYyA9PiAnU2V0cyB0aGUgc2l6ZSBvZiB0aGUgZGVkaWNhdGVkIGJ1 ZmZlciBwb29sIHVzZWQgZm9yIHRoZSBNdWx0aVhhY3QgbWVtYmVyIGNhY2hlLicsCiAgIGZs YWdzID0+ICdHVUNfVU5JVF9CTE9DS1MnLApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRp bHMvbWlzYy9ndWNfdGFibGVzLmMgYi9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJs ZXMuYwppbmRleCAxZTE0YjdiNGFmMC4uZDUyYmY1OTNlNjEgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxz L21pc2MvZ3VjX3RhYmxlcy5jCkBAIC05Myw2ICs5Myw3IEBACiAjaW5jbHVkZSAidHNlYXJj aC90c19jYWNoZS5oIgogI2luY2x1ZGUgInV0aWxzL2J1aWx0aW5zLmgiCiAjaW5jbHVkZSAi dXRpbHMvYnl0ZWEuaCIKKyNpbmNsdWRlICJ1dGlscy9jYXNoX2V4Y2hhbmdlLmgiCiAjaW5j bHVkZSAidXRpbHMvZmxvYXQuaCIKICNpbmNsdWRlICJ1dGlscy9ndWNfaG9va3MuaCIKICNp bmNsdWRlICJ1dGlscy9ndWNfdGFibGVzLmgiCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91 dGlscy9jYXNoX2V4Y2hhbmdlLmggYi9zcmMvaW5jbHVkZS91dGlscy9jYXNoX2V4Y2hhbmdl LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjNmY2FiYzJlMTc2 Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvY2FzaF9leGNoYW5nZS5o CkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBjYXNoX2V4Y2hhbmdlLmgKKyAqCQlBdXRvbWF0 aWMgZXhjaGFuZ2UgcmF0ZSBjb252ZXJzaW9uIGZvciB0aGUgbW9uZXkgdHlwZS4KKyAqCisg KiBXaGVuIG1vbmV5X3NvdXJjZV9jdXJyZW5jeSBpcyBzZXQgdG8gYW4gSVNPIDQyMTcgY3Vy cmVuY3kgY29kZSBhbmQKKyAqIHRoZSBzZXNzaW9uJ3MgbGNfbW9uZXRhcnkgaW1wbGllcyBh IGRpZmZlcmVudCBjdXJyZW5jeSwgbW9uZXkgdmFsdWVzCisgKiBhcmUgdHJhbnNwYXJlbnRs eSBjb252ZXJ0ZWQgYXQgZGlzcGxheSB0aW1lIHVzaW5nIGxpdmUgZXhjaGFuZ2UgcmF0ZXMu CisgKgorICogc3JjL2luY2x1ZGUvdXRpbHMvY2FzaF9leGNoYW5nZS5oCisgKi8KKyNpZm5k ZWYgQ0FTSF9FWENIQU5HRV9ICisjZGVmaW5lIENBU0hfRVhDSEFOR0VfSAorCisjaW5jbHVk ZSAicG9zdGdyZXMuaCIKKworLyogR1VDIHZhcmlhYmxlOiBJU08gNDIxNyBjb2RlIG9mIHN0 b3JlZCBtb25leSBjdXJyZW5jeSAoZS5nLiAiVVNEIikgKi8KK2V4dGVybiBQR0RMTElNUE9S VCBjaGFyICptb25leV9zb3VyY2VfY3VycmVuY3k7CisKKy8qIFJldHVybnMgdGhlIGV4Y2hh bmdlIHJhdGUgdG8gYXBwbHkgaW4gY2FzaF9vdXQoKTsgMS4wIG1lYW5zIG5vIGNvbnZlcnNp b24gKi8KK2V4dGVybiBmbG9hdDggY2FzaF9leGNoYW5nZV9yYXRlKHZvaWQpOworCisjZW5k aWYJCQkJCQkJLyogQ0FTSF9FWENIQU5HRV9IICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVk ZS91dGlscy9ndWNfaG9va3MuaCBiL3NyYy9pbmNsdWRlL3V0aWxzL2d1Y19ob29rcy5oCmlu ZGV4IGIwMTY5N2MxZjYwLi4wNDdhYmRkYTJkZCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUv dXRpbHMvZ3VjX2hvb2tzLmgKKysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvZ3VjX2hvb2tzLmgK QEAgLTcwLDYgKzcwLDcgQEAgZXh0ZXJuIGJvb2wgY2hlY2tfbG9jYWxlX21lc3NhZ2VzKGNo YXIgKipuZXd2YWwsIHZvaWQgKipleHRyYSwgR3VjU291cmNlIHNvdXJjZSkKIGV4dGVybiB2 b2lkIGFzc2lnbl9sb2NhbGVfbWVzc2FnZXMoY29uc3QgY2hhciAqbmV3dmFsLCB2b2lkICpl eHRyYSk7CiBleHRlcm4gYm9vbCBjaGVja19sb2NhbGVfbW9uZXRhcnkoY2hhciAqKm5ld3Zh bCwgdm9pZCAqKmV4dHJhLCBHdWNTb3VyY2Ugc291cmNlKTsKIGV4dGVybiB2b2lkIGFzc2ln bl9sb2NhbGVfbW9uZXRhcnkoY29uc3QgY2hhciAqbmV3dmFsLCB2b2lkICpleHRyYSk7Citl eHRlcm4gYm9vbCBjaGVja19tb25leV9zb3VyY2VfY3VycmVuY3koY2hhciAqKm5ld3ZhbCwg dm9pZCAqKmV4dHJhLCBHdWNTb3VyY2Ugc291cmNlKTsKIGV4dGVybiBib29sIGNoZWNrX2xv Y2FsZV9udW1lcmljKGNoYXIgKipuZXd2YWwsIHZvaWQgKipleHRyYSwgR3VjU291cmNlIHNv dXJjZSk7CiBleHRlcm4gdm9pZCBhc3NpZ25fbG9jYWxlX251bWVyaWMoY29uc3QgY2hhciAq bmV3dmFsLCB2b2lkICpleHRyYSk7CiBleHRlcm4gYm9vbCBjaGVja19sb2NhbGVfdGltZShj aGFyICoqbmV3dmFsLCB2b2lkICoqZXh0cmEsIEd1Y1NvdXJjZSBzb3VyY2UpOwotLSAKMi41 Mi4wCgo= --41fe7bb2d9c64f2e89a3ff3ffbe1f63b--