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 1vqAGH-005kw3-3B for pgsql-hackers@arkaria.postgresql.org; Wed, 11 Feb 2026 13:28:11 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vqAGF-003wCi-2o for pgsql-hackers@arkaria.postgresql.org; Wed, 11 Feb 2026 13:28:08 +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 1vqAGF-003wCa-0m for pgsql-hackers@lists.postgresql.org; Wed, 11 Feb 2026 13:28:08 +0000 Received: from mail-dy1-x1335.google.com ([2607:f8b0:4864:20::1335]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vqAGC-0000000083M-2rOI for pgsql-hackers@postgresql.org; Wed, 11 Feb 2026 13:28:06 +0000 Received: by mail-dy1-x1335.google.com with SMTP id 5a478bee46e88-2b86ce04c5cso1473855eec.1 for ; Wed, 11 Feb 2026 05:28:05 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1770816484; cv=none; d=google.com; s=arc-20240605; b=h+4EArAUfkxK9yqEy5HsxXg8MpA4uHPvL7/3hUhRzZ2Ytxv76jlzrwTbf2//LP1HGO 6gjwYUlfq5UcNim14xGALShqFyRki9Y2ck8kTjNz4b5xtDnQi7rSecvcf9qojjoHd3dO MF6Y/FyRpnZ4YFfkyNWpDyrf7LA8IDDgJ16zV36L9Fz74zTg5tzficr4PpMI0nOmP0d2 7+0nwP7DpuBNXru1xrVn1XHvJdGQCiu0O+72LgU7CIVU/Z044QRJp1JDen+JRTDjXpWK +5ir7ZYMhFu+2FDE/J3M8Yhy8PcIeWoKOcJdBwPz+NPmut274fBIMzOVBNXoLxPHHUR0 gYyA== 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=OFQV4uJs6l1ezo4CUH+lwosCjLb2UuhNovghVzTfN7U=; fh=IwDLYdl4Uuph/5EBs/RskDnj/SPT9wTCmJAOTQtjqj8=; b=FWMTg+yTgY01tp6wJlT4U+IFQ979uHp83ieMqcUMd3PUCu2vQIVHRQqiNowNtnAUQi YLNuDbcl71reRWdgBXiGj+owl8qFy0Li85A8P4SutTszuY1ColvA8rJVK+xYskz1M1JF Rr26EyCfZlNX+p/Mk0d6a1cXjRGqntjgfIyKsuZd66G7WstNDe/eBNsSj89POnn4wJOF NDR00yDhETc0HCzh7WJYs45nDW/QB1rwytQis+eZR6djqf602dZyGboOATV9jF9AUVIf 7uLTeB7VTV4omrsjBFjrmXT6QAJ6ygyOv0v5SVCwtfhJz3HL8zk4IFCkHP5K+xmqXWPJ rMEA==; darn=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=1770816484; x=1771421284; darn=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=OFQV4uJs6l1ezo4CUH+lwosCjLb2UuhNovghVzTfN7U=; b=cA99l6pXoTwmzd+yOtJNV0Bq7LuAx0L3rn+T54ZrCHBJpSmvdngGUd0wsReawZgTXx 61aVAhncWnwocOVmGE2bKAmx/roL1eAquo1MLMqcihhhOaxufE9Em2ThNU2AE0woX+rC yLJ3jBA3fi5Fxi9t3DEYc1XomwboD+nqiiR9Z8EGKsRHUByFJ4dyxOzcWJMp2RAHeK5n n1k5yDKtqqcMa5+9pqV1JYBQ/OMGeHzB6zq9C5X6itim/1GWsNqaCz9oO4vy0ZDHIzc+ BRUPOpVgCtg1X7AQke0Fedt3hVXUmwo0Ky/DhhPb+/gCpS72nHP5/hDxfcU3Bzgyak6E 5E0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770816484; x=1771421284; 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=OFQV4uJs6l1ezo4CUH+lwosCjLb2UuhNovghVzTfN7U=; b=qpm2ve0vCK0COjKhYJOxgDoD4LnlAylxlRBzeeossv0fdpLtk0Vxa0O8f565+AGy9s 1wERbl0khe1XBdeFkNAXbKkjn0+mo05OFaxdZyM1fneERrOkKHJonqZWQxyIbxVlA7+Y OJtuzwg6BL4bsbS+9yY5ekp//1DEPDK+QAxqkTDfzz6D6LABS2Gxujp8vX2Iw3hiXqfB jtLpuj8WcBH+1oukG0NhOtaVqhAqa/tGyTUoIS1/mneAq4ceZjtJ4NdOmbOjeCKRtFzR 2XNYSb4ztf3BLKDMaX+RfjhPLFXxtlPJrcp9z/BvqbAj7p2wt7B8nubnxiLBRngS5gfz Mb2g== X-Forwarded-Encrypted: i=1; AJvYcCXE1VKxtaj2zNzpMUvHDPPdPAxNKkOiphw7BIPE4hf0eaxDzoIh1yDFdyQaHcIHK290rUzeSj+WwRDCTvZQ@postgresql.org X-Gm-Message-State: AOJu0Yxf32jFLIR43DJDuAvrz1gQucXsMm/V9DgqLUZK0h4NTawduF6J /iQjYAQBdduvOoBWjhGx/Tncrj9Y2k/dq2sYedXr4H8JS0YPWUafd6/rO1X9zwcIC/0BD5JN0Nq IQhKz0ClwJAyCCG4eU4QpX60pUnSSJPU= X-Gm-Gg: AZuq6aIrFf93ek1hkwWwyzM25SOM8j5wqX9fEJHIEzSxVJdgq5IR297FIP7sAa5RK8+ y7tO2Fzxk3Wb+OQFkpLR8bzs6OYgAeniTynrVM27l8L5LP/Ss2MaaVYQQa6mooDrEQNgyIxomOS 2kt4IcybJ1dI4tKrM0hnyVVyt586rJbG8tSFxalVhXhPydVPcqUK15+wxZBq9CdpJ6oyhVnTv3/ ngRc1cNf5QdRe/EUbuwZF2v4ujLCwADBtt7il4IfFG3GIY8paUd9ZhY//8oWqpeVvAaHF7Z0Ik7 X4a5h0o= X-Received: by 2002:a05:7301:6088:b0:2b7:2bf3:ce01 with SMTP id 5a478bee46e88-2ba8a8779a6mr2048517eec.30.1770816483762; Wed, 11 Feb 2026 05:28:03 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Nazir Bilal Yavuz Date: Wed, 11 Feb 2026 16:27:50 +0300 X-Gm-Features: AZwV_QiNXfc1UvTSJGwSHsgLnbjRcjc4y_SiJ0-DgQQSCxlcG4aK9aIlkQbWD_4 Message-ID: Subject: Re: Speed up COPY FROM text/CSV parsing using SIMD To: Nathan Bossart Cc: KAZAR Ayoub , Neil Conway , Manni Wood , Andrew Dunstan , Shinya Kato , PostgreSQL-development Content-Type: multipart/mixed; boundary="0000000000007a9fd8064a8c57b1" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000007a9fd8064a8c57b1 Content-Type: text/plain; charset="UTF-8" Hi, On Sat, 7 Feb 2026 at 01:47, Nathan Bossart wrote: > > On Sat, Feb 07, 2026 at 01:19:16AM +0300, Nazir Bilal Yavuz wrote: > > I have three possible approaches in my mind, they are actually similar > > to each other. > > > > 1- After encountering a special character, disable SIMD for the rest > > of the current line and also for the rest of the data. > > > > 2- It is a mixed version of the current heuristic and #1. After > > encountering a special character, skip SIMD for the current line (let' > > say line 1) and for the next line (line 2). Then try running SIMD for > > the next line (line 3), if there is no special character continue to > > run SIMD but if there is a special character then skip running SIMD > > for two lines this time. And it goes like that, everytime special > > character is encountered in the SIMD run, skipped SIMD lines are > > doubled. > > > > 3- This version is a bit different from #2. Instead of calculating the > > number of lines to skip dynamically, skip the constant N number of > > lines and then try to run SIMD again after these lines. N could be > > something like 100, 1000, or 10000 etc.. Actually, you and Andrew > > suggested this approach before [1]. > > > > I think what you suggested is closer to #1 or #3. I just wanted to > > hear your opinions, and whether you think any of these approaches are > > good to implement / work on. > > Yeah, I think either (1) or (3) would be a good starting point. (1) is > basically just (3) with N set to infinity, anyway. I imagine there's some > value less than infinity that is acceptable, but if I had to pick an > approach right now, I'd probably go with (1) to essentially remove the > heuristic from the discussion until we're ready to focus on it. I am sharing a v6 which implements (1). My benchmark results show almost no difference for the special-character cases and a nice improvement for the no-special-character cases. Timing results after running Manni's v1.2.1 benchmark: +---------+---------------+----------------+--------------+----------------+ | | text | no sp. | text | 1/3 sp. | csv | no sp. | csv | 1/3 sp. | +---------+---------------+----------------+--------------+----------------+ | master | 104437 | 118711 | 121173 | 151589 | +---------+---------------+----------------+--------------+----------------+ | patched | 90062 -%13.7 | 119070 +%0.003 | 88964 -%26.5 | 153710 +%0.013 | +---------+---------------+----------------+--------------+----------------+ In case the table does not render well in your email client, here is a short summary: - Text, no special characters: 13.7% faster - Text, 1/3 special characters: %0.003 slower, no meaningful change - CSV, no special characters: 26.5% faster - CSV, 1/3 special characters: %0.013 slower, no meaningful change -- Regards, Nazir Bilal Yavuz Microsoft --0000000000007a9fd8064a8c57b1 Content-Type: text/x-patch; charset="US-ASCII"; name="v6-0001-Speed-up-COPY-FROM-text-CSV-parsing-using-SIMD.patch" Content-Disposition: attachment; filename="v6-0001-Speed-up-COPY-FROM-text-CSV-parsing-using-SIMD.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mli2deco0 RnJvbSA0OTRmODZlMmNkMDFjOWQ1NWU5MGY3NjgzZTE1MTgyOGQxMjdiOGU0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYXppciBCaWxhbCBZYXZ1eiA8YnlhdnV6ODFAZ21haWwuY29t PgpEYXRlOiBXZWQsIDExIEZlYiAyMDI2IDE0OjQ5OjIxICswMzAwClN1YmplY3Q6IFtQQVRDSCB2 Nl0gU3BlZWQgdXAgQ09QWSBGUk9NIHRleHQvQ1NWIHBhcnNpbmcgdXNpbmcgU0lNRAoKVGhpcyBw YXRjaCBkaXNhYmxlcyBTSU1EIHdoZW4gU0lNRCBlbmNvdW50ZXJzIGEgc3BlY2lhbCBjaGFyYWN0 ZXIgd2hpY2gKaXMgbmVpdGhlciBFT0Ygbm9yIEVPTC4KCkF1dGhvcjogU2hpbnlhIEthdG8gPHNo aW55YTExLmthdG9AZ21haWwuY29tPgpBdXRob3I6IE5hemlyIEJpbGFsIFlhdnV6IDxieWF2dXo4 MUBnbWFpbC5jb20+ClJldmlld2VkLWJ5OiBLYXphciBBeW91YiA8bWFfa2F6YXJAZXNpLmR6PgpS ZXZpZXdlZC1ieTogTmF0aGFuIEJvc3NhcnQgPG5hdGhhbmRib3NzYXJ0QGdtYWlsLmNvbT4KUmV2 aWV3ZWQtYnk6IE5laWwgQ29ud2F5IDxuZWlsLmNvbndheUBnbWFpbC5jb20+ClJldmlld2VkLWJ5 OiBBbmRyZXcgRHVuc3RhbiA8YW5kcmV3QGR1bnNsYW5lLm5ldD4KUmV2aWV3ZWQtYnk6IE1hbm5p IFdvb2QgPG1hbm5pLndvb2RAZW50ZXJwcmlzZWRiLmNvbT4KUmV2aWV3ZWQtYnk6IE1hcmsgV29u ZyA8bWFya3drbUBnbWFpbC5jb20+CkRpc2N1c3Npb246IGh0dHBzOi8vcG9zdGdyLmVzL20vQ0FP ekV1clNXOGNOcjZUUEtzanJzdG5QZmhmNFF5UXFCNHRuUFhHR2U4TjRlX3Y3SmlnJTQwbWFpbC5n bWFpbC5jb20KLS0tCiBzcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbS5jICAgICAgICAgIHwg ICA0ICsKIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tcGFyc2UuYyAgICAgfCAxMzIgKysr KysrKysrKysrKysrKysrKysrKy0KIHNyYy9pbmNsdWRlL2NvbW1hbmRzL2NvcHlmcm9tX2ludGVy bmFsLmggfCAgIDQgKwogMyBmaWxlcyBjaGFuZ2VkLCAxMzUgaW5zZXJ0aW9ucygrKSwgNSBkZWxl dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbS5jIGIv c3JjL2JhY2tlbmQvY29tbWFuZHMvY29weWZyb20uYwppbmRleCAyNWVlMjBiMjNkYi4uZmJmNzhi NjY5OGIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tLmMKKysrIGIv c3JjL2JhY2tlbmQvY29tbWFuZHMvY29weWZyb20uYwpAQCAtMTcyMSw2ICsxNzIxLDEwIEBAIEJl Z2luQ29weUZyb20oUGFyc2VTdGF0ZSAqcHN0YXRlLAogCWNzdGF0ZS0+Y3VyX2F0dHZhbCA9IE5V TEw7CiAJY3N0YXRlLT5yZWxuYW1lX29ubHkgPSBmYWxzZTsKIAorCS8qIEluaXRpYWxpemUgU0lN RCB2YXJpYWJsZXMgKi8KKwljc3RhdGUtPnNpbWRfZW5hYmxlZCA9IGZhbHNlOworCWNzdGF0ZS0+ c2ltZF9pbml0aWFsaXplZCA9IGZhbHNlOworCiAJLyoKIAkgKiBBbGxvY2F0ZSBidWZmZXJzIGZv ciB0aGUgaW5wdXQgcGlwZWxpbmUuCiAJICoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1h bmRzL2NvcHlmcm9tcGFyc2UuYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tcGFyc2Uu YwppbmRleCA5NGQ2ZjQxNWEwNi4uNTU0YjNjYjliZjggMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L2NvbW1hbmRzL2NvcHlmcm9tcGFyc2UuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5 ZnJvbXBhcnNlLmMKQEAgLTcyLDYgKzcyLDcgQEAKICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKICNp bmNsdWRlICJwZ3N0YXQuaCIKICNpbmNsdWRlICJwb3J0L3BnX2Jzd2FwLmgiCisjaW5jbHVkZSAi cG9ydC9zaW1kLmgiCiAjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKICNpbmNsdWRlICJ1dGls cy9yZWwuaCIKIApAQCAtMTQxLDEyICsxNDIsMTQgQEAgc3RhdGljIGNvbnN0IGNoYXIgQmluYXJ5 U2lnbmF0dXJlWzExXSA9ICJQR0NPUFlcblwzNzdcclxuXDAiOwogCiAvKiBub24tZXhwb3J0IGZ1 bmN0aW9uIHByb3RvdHlwZXMgKi8KIHN0YXRpYyBib29sIENvcHlSZWFkTGluZShDb3B5RnJvbVN0 YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YpOwotc3RhdGljIGJvb2wgQ29weVJlYWRMaW5lVGV4dChD b3B5RnJvbVN0YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YpOwogc3RhdGljIGludAlDb3B5UmVhZEF0 dHJpYnV0ZXNUZXh0KENvcHlGcm9tU3RhdGUgY3N0YXRlKTsKIHN0YXRpYyBpbnQJQ29weVJlYWRB dHRyaWJ1dGVzQ1NWKENvcHlGcm9tU3RhdGUgY3N0YXRlKTsKIHN0YXRpYyBEYXR1bSBDb3B5UmVh ZEJpbmFyeUF0dHJpYnV0ZShDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgRm1nckluZm8gKmZsaW5mbywK IAkJCQkJCQkJCSBPaWQgdHlwaW9wYXJhbSwgaW50MzIgdHlwbW9kLAogCQkJCQkJCQkJIGJvb2wg KmlzbnVsbCk7CitzdGF0aWMgcGdfYXR0cmlidXRlX2Fsd2F5c19pbmxpbmUgYm9vbCBDb3B5UmVh ZExpbmVUZXh0KENvcHlGcm9tU3RhdGUgY3N0YXRlLAorCQkJCQkJCQkJCQkJCQlib29sIGlzX2Nz diwKKwkJCQkJCQkJCQkJCQkJYm9vbCBzaW1kX2VuYWJsZWQpOwogc3RhdGljIHBnX2F0dHJpYnV0 ZV9hbHdheXNfaW5saW5lIGJvb2wgQ29weUZyb21UZXh0TGlrZU9uZVJvdyhDb3B5RnJvbVN0YXRl IGNzdGF0ZSwKIAkJCQkJCQkJCQkJCQkJCSAgRXhwckNvbnRleHQgKmVjb250ZXh0LAogCQkJCQkJ CQkJCQkJCQkJICBEYXR1bSAqdmFsdWVzLApAQCAtMTE3Myw4ICsxMTc2LDIxIEBAIENvcHlSZWFk TGluZShDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YpCiAJcmVzZXRTdHJpbmdJbmZv KCZjc3RhdGUtPmxpbmVfYnVmKTsKIAljc3RhdGUtPmxpbmVfYnVmX3ZhbGlkID0gZmFsc2U7CiAK LQkvKiBQYXJzZSBkYXRhIGFuZCB0cmFuc2ZlciBpbnRvIGxpbmVfYnVmICovCi0JcmVzdWx0ID0g Q29weVJlYWRMaW5lVGV4dChjc3RhdGUsIGlzX2Nzdik7CisJLyogSW5pdGlhbGl6ZSBTSU1EIG9u IHRoZSBmaXJzdCByZWFkICovCisJaWYgKHVubGlrZWx5KCFjc3RhdGUtPnNpbWRfaW5pdGlhbGl6 ZWQpKQorCXsKKwkJY3N0YXRlLT5zaW1kX2luaXRpYWxpemVkID0gdHJ1ZTsKKwkJY3N0YXRlLT5z aW1kX2VuYWJsZWQgPSB0cnVlOworCX0KKworCS8qCisJICogUGFyc2UgZGF0YSBhbmQgdHJhbnNm ZXIgaW50byBsaW5lX2J1Zi4gVG8gYmVuZWZpdCBmcm9tIGlubGluaW5nLCBjYWxsCisJICogQ29w eVJlYWRMaW5lVGV4dCgpIHdpdGggY29uc3RhbnQgYm9vbGVhbiBhcmd1bWVudHMuCisJICovCisJ aWYgKGNzdGF0ZS0+c2ltZF9lbmFibGVkKQorCQlyZXN1bHQgPSBDb3B5UmVhZExpbmVUZXh0KGNz dGF0ZSwgaXNfY3N2LCB0cnVlKTsKKwllbHNlCisJCXJlc3VsdCA9IENvcHlSZWFkTGluZVRleHQo Y3N0YXRlLCBpc19jc3YsIGZhbHNlKTsKIAogCWlmIChyZXN1bHQpCiAJewpAQCAtMTI0MSw4ICsx MjU3LDggQEAgQ29weVJlYWRMaW5lKENvcHlGcm9tU3RhdGUgY3N0YXRlLCBib29sIGlzX2NzdikK IC8qCiAgKiBDb3B5UmVhZExpbmVUZXh0IC0gaW5uZXIgbG9vcCBvZiBDb3B5UmVhZExpbmUgZm9y IHRleHQgbW9kZQogICovCi1zdGF0aWMgYm9vbAotQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0 YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YpCitzdGF0aWMgcGdfYXR0cmlidXRlX2Fsd2F5c19pbmxp bmUgYm9vbAorQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgYm9vbCBpc19j c3YsIGJvb2wgc2ltZF9lbmFibGVkKQogewogCWNoYXIJICAgKmNvcHlfaW5wdXRfYnVmOwogCWlu dAkJCWlucHV0X2J1Zl9wdHI7CkBAIC0xMjU3LDYgKzEyNzMsMTQgQEAgQ29weVJlYWRMaW5lVGV4 dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YpCiAJY2hhcgkJcXVvdGVjID0gJ1ww JzsKIAljaGFyCQllc2NhcGVjID0gJ1wwJzsKIAorI2lmbmRlZiBVU0VfTk9fU0lNRAorCVZlY3Rv cjgJCW5sID0gdmVjdG9yOF9icm9hZGNhc3QoJ1xuJyk7CisJVmVjdG9yOAkJY3IgPSB2ZWN0b3I4 X2Jyb2FkY2FzdCgnXHInKTsKKwlWZWN0b3I4CQlicyA9IHZlY3RvcjhfYnJvYWRjYXN0KCdcXCcp OworCVZlY3RvcjgJCXF1b3RlID0gdmVjdG9yOF9icm9hZGNhc3QoMCk7CisJVmVjdG9yOAkJZXNj YXBlID0gdmVjdG9yOF9icm9hZGNhc3QoMCk7CisjZW5kaWYKKwogCWlmIChpc19jc3YpCiAJewog CQlxdW90ZWMgPSBjc3RhdGUtPm9wdHMucXVvdGVbMF07CkBAIC0xMjY0LDYgKzEyODgsMTIgQEAg Q29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YpCiAJCS8q IGlnbm9yZSBzcGVjaWFsIGVzY2FwZSBwcm9jZXNzaW5nIGlmIGl0J3MgdGhlIHNhbWUgYXMgcXVv dGVjICovCiAJCWlmIChxdW90ZWMgPT0gZXNjYXBlYykKIAkJCWVzY2FwZWMgPSAnXDAnOworCisj aWZuZGVmIFVTRV9OT19TSU1ECisJCXF1b3RlID0gdmVjdG9yOF9icm9hZGNhc3QocXVvdGVjKTsK KwkJaWYgKHF1b3RlYyAhPSBlc2NhcGVjKQorCQkJZXNjYXBlID0gdmVjdG9yOF9icm9hZGNhc3Qo ZXNjYXBlYyk7CisjZW5kaWYKIAl9CiAKIAkvKgpAQCAtMTMzMCw2ICsxMzYwLDk4IEBAIENvcHlS ZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wgaXNfY3N2KQogCQkJbmVlZF9k YXRhID0gZmFsc2U7CiAJCX0KIAorI2lmbmRlZiBVU0VfTk9fU0lNRAorCisJCS8qCisJCSAqIFVz ZSBTSU1EIGluc3RydWN0aW9ucyB0byBlZmZpY2llbnRseSBzY2FuIHRoZSBpbnB1dCBidWZmZXIg Zm9yCisJCSAqIHNwZWNpYWwgY2hhcmFjdGVycyAoZS5nLiwgbmV3bGluZSwgY2FycmlhZ2UgcmV0 dXJuLCBxdW90ZSwgYW5kCisJCSAqIGVzY2FwZSkuIFRoaXMgaXMgZmFzdGVyIHRoYW4gYnl0ZS1i eS1ieXRlIGl0ZXJhdGlvbiwgZXNwZWNpYWxseSBvbgorCQkgKiBsYXJnZSBidWZmZXJzLgorCQkg KgorCQkgKiBXZSBkbyBub3QgYXBwbHkgdGhlIFNJTUQgZmFzdCBwYXRoIGluIGVpdGhlciBvZiB0 aGUgZm9sbG93aW5nCisJCSAqIGNhc2VzOiAtIFdoZW4gdGhlIHByZXZpb3VzbHkgcHJvY2Vzc2Vk IGNoYXJhY3RlciB3YXMgYW4gZXNjYXBlCisJCSAqIGNoYXJhY3RlciAobGFzdF93YXNfZXNjKSwg c2luY2UgdGhlIG5leHQgYnl0ZSBtdXN0IGJlIGV4YW1pbmVkCisJCSAqIHNlcXVlbnRpYWxseS4g LSBXaGVuIHRoZSByZW1haW5pbmcgYnVmZmVyIGlzIHNtYWxsZXIgdGhhbiBvbmUKKwkJICogdmVj dG9yIHdpZHRoIChzaXplb2YoVmVjdG9yOCkpLCBzaW5jZSBTSU1EIG9wZXJhdGVzIG9uIGZpeGVk LXNpemUKKwkJICogY2h1bmtzLgorCQkgKgorCQkgKiBOb3RlIHRoYXQsIFNJTUQgbWF5IGJlY29t ZSBzbG93ZXIgd2hlbiB0aGUgaW5wdXQgY29udGFpbnMgbWFueQorCQkgKiBzcGVjaWFsIGNoYXJh Y3RlcnMuIFRvIGF2b2lkIHRoaXMgcmVncmVzc2lvbiwgd2UgZGlzYWJsZSBTSU1EIGZvcgorCQkg KiB0aGUgcmVzdCBvZiB0aGUgaW5wdXQgb25jZSB3ZSBlbmNvdW50ZXIgYSBzcGVjaWFsIGNoYXJh Y3RlciB3aGljaAorCQkgKiBpcyBuZWl0aGVyIEVPRiBub3IgRU9MLgorCQkgKi8KKwkJaWYgKHNp bWRfZW5hYmxlZCAmJiAhbGFzdF93YXNfZXNjICYmIGNvcHlfYnVmX2xlbiAtIGlucHV0X2J1Zl9w dHIgPiBzaXplb2YoVmVjdG9yOCkpCisJCXsKKwkJCVZlY3RvcjgJCWNodW5rOworCQkJVmVjdG9y OAkJbWF0Y2ggPSB2ZWN0b3I4X2Jyb2FkY2FzdCgwKTsKKwkJCXVpbnQzMgkJbWFzazsKKworCQkJ LyogTG9hZCBhIGNodW5rIG9mIGRhdGEgaW50byBhIHZlY3RvciByZWdpc3RlciAqLworCQkJdmVj dG9yOF9sb2FkKCZjaHVuaywgKGNvbnN0IHVpbnQ4ICopICZjb3B5X2lucHV0X2J1ZltpbnB1dF9i dWZfcHRyXSk7CisKKwkJCWlmIChpc19jc3YpCisJCQl7CisJCQkJLyogXG4gYW5kIFxyIGFyZSBu b3Qgc3BlY2lhbCBpbnNpZGUgcXVvdGVzICovCisJCQkJaWYgKCFpbl9xdW90ZSkKKwkJCQkJbWF0 Y2ggPSB2ZWN0b3I4X29yKHZlY3RvcjhfZXEoY2h1bmssIG5sKSwgdmVjdG9yOF9lcShjaHVuaywg Y3IpKTsKKworCQkJCW1hdGNoID0gdmVjdG9yOF9vcihtYXRjaCwgdmVjdG9yOF9lcShjaHVuaywg cXVvdGUpKTsKKwkJCQlpZiAoZXNjYXBlYyAhPSAnXDAnKQorCQkJCQltYXRjaCA9IHZlY3Rvcjhf b3IobWF0Y2gsIHZlY3RvcjhfZXEoY2h1bmssIGVzY2FwZSkpOworCQkJfQorCQkJZWxzZQorCQkJ eworCQkJCW1hdGNoID0gdmVjdG9yOF9vcih2ZWN0b3I4X2VxKGNodW5rLCBubCksIHZlY3Rvcjhf ZXEoY2h1bmssIGNyKSk7CisJCQkJbWF0Y2ggPSB2ZWN0b3I4X29yKG1hdGNoLCB2ZWN0b3I4X2Vx KGNodW5rLCBicykpOworCQkJfQorCisJCQkvKiBDaGVjayBpZiB3ZSBmb3VuZCBhbnkgc3BlY2lh bCBjaGFyYWN0ZXJzICovCisJCQltYXNrID0gdmVjdG9yOF9oaWdoYml0X21hc2sobWF0Y2gpOwor CQkJaWYgKG1hc2sgIT0gMCkKKwkJCXsKKwkJCQkvKgorCQkJCSAqIEZvdW5kIGEgc3BlY2lhbCBj aGFyYWN0ZXIuIEFkdmFuY2UgdXAgdG8gdGhhdCBwb2ludCBhbmQgbGV0CisJCQkJICogdGhlIHNj YWxhciBjb2RlIGhhbmRsZSBpdC4KKwkJCQkgKi8KKwkJCQlpbnQJCQlhZHZhbmNlID0gcGdfcmln aHRtb3N0X29uZV9wb3MzMihtYXNrKTsKKwkJCQljaGFyCQljMSwKKwkJCQkJCQljMjsKKwkJCQli b29sCQlzaW1kX2hpdF9lb2wsCisJCQkJCQkJc2ltZF9oaXRfZW9mOworCisJCQkJaW5wdXRfYnVm X3B0ciArPSBhZHZhbmNlOworCQkJCWMxID0gY29weV9pbnB1dF9idWZbaW5wdXRfYnVmX3B0cl07 CisKKwkJCQkvKgorCQkJCSAqIFNpbmNlIHdlIHN0b3BwZWQgd2l0aGluIHRoZSBjaHVuayBhbmQg KChjb3B5X2J1Zl9sZW4gLQorCQkJCSAqIGlucHV0X2J1Zl9wdHIpID4gc2l6ZW9mKFZlY3Rvcjgp KSBpcyB0cnVlLAorCQkJCSAqIGNvcHlfaW5wdXRfYnVmW2lucHV0X2J1Zl9wdHIgKyAxXSBpcyBn dWFyYW50ZWVkIHRvIGJlCisJCQkJICogcmVhZGFibGUuCisJCQkJICovCisJCQkJYzIgPSBjb3B5 X2lucHV0X2J1ZltpbnB1dF9idWZfcHRyICsgMV07CisJCQkJc2ltZF9oaXRfZW9sID0gKGMxID09 ICdccicgfHwgYzEgPT0gJ1xuJykgJiYgKCFpc19jc3YgfHwgIWluX3F1b3RlKTsKKwkJCQlzaW1k X2hpdF9lb2YgPSBjMSA9PSAnXFwnICYmIGMyID09ICcuJyAmJiAhaXNfY3N2OworCisJCQkJLyoK KwkJCQkgKiBEbyBub3QgZGlzYWJsZSBTSU1EIHdoZW4gd2UgaGl0IEVPTCBvciBFT0YgY2hhcmFj dGVycy4gSW4KKwkJCQkgKiBwcmFjdGljZSwgaXQgZG9lcyBub3QgbWF0dGVyIGZvciBFT0YgYmVj YXVzZSBwYXJzaW5nIGVuZHMKKwkJCQkgKiB0aGVyZSwgYnV0IHdlIGtlZXAgdGhlIGJlaGF2aW9y IGNvbnNpc3RlbnQuCisJCQkJICovCisJCQkJaWYgKCEoc2ltZF9oaXRfZW9mIHx8IHNpbWRfaGl0 X2VvbCkpCisJCQkJeworCQkJCQlzaW1kX2VuYWJsZWQgPSBmYWxzZTsKKwkJCQkJY3N0YXRlLT5z aW1kX2VuYWJsZWQgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyog Tm8gc3BlY2lhbCBjaGFyYWN0ZXJzIGZvdW5kLCBzbyBza2lwIHRoZSBlbnRpcmUgY2h1bmsgKi8K KwkJCQlpbnB1dF9idWZfcHRyICs9IHNpemVvZihWZWN0b3I4KTsKKwkJCQljb250aW51ZTsKKwkJ CX0KKwkJfQorI2VuZGlmCisKIAkJLyogT0sgdG8gZmV0Y2ggYSBjaGFyYWN0ZXIgKi8KIAkJcHJl dl9yYXdfcHRyID0gaW5wdXRfYnVmX3B0cjsKIAkJYyA9IGNvcHlfaW5wdXRfYnVmW2lucHV0X2J1 Zl9wdHIrK107CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jb21tYW5kcy9jb3B5ZnJvbV9pbnRl cm5hbC5oIGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvY29weWZyb21faW50ZXJuYWwuaAppbmRleCA4 MjJlZjMzY2Y2OS4uNTY5NDJhMTU0NjkgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NvbW1hbmRz L2NvcHlmcm9tX2ludGVybmFsLmgKKysrIGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvY29weWZyb21f aW50ZXJuYWwuaApAQCAtODksNiArODksMTAgQEAgdHlwZWRlZiBzdHJ1Y3QgQ29weUZyb21TdGF0 ZURhdGEKIAljb25zdCBjaGFyICpjdXJfYXR0dmFsOwkJLyogY3VycmVudCBhdHQgdmFsdWUgZm9y IGVycm9yIG1lc3NhZ2VzICovCiAJYm9vbAkJcmVsbmFtZV9vbmx5OwkvKiBkb24ndCBvdXRwdXQg bGluZSBudW1iZXIsIGF0dCwgZXRjLiAqLwogCisJLyogU0lNRCB2YXJpYWJsZXMgKi8KKwlib29s CQlzaW1kX2VuYWJsZWQ7CisJYm9vbAkJc2ltZF9pbml0aWFsaXplZDsKKwogCS8qCiAJICogV29y a2luZyBzdGF0ZQogCSAqLwotLSAKMi40Ny4zCgo= --0000000000007a9fd8064a8c57b1--