From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 17094 invoked by alias); 13 Sep 2019 16:26:23 -0000 Mailing-List: contact libc-stable-help@sourceware.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Subscribe: List-Archive: Sender: libc-stable-owner@sourceware.org Received: (qmail 17083 invoked by uid 89); 13 Sep 2019 16:26:23 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.100.3 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-18.6 required=5.0 tests=AWL,BAYES_00,FORGED_SPF_HELO,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LOTSOFHASH,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS,UNSUBSCRIBE_BODY autolearn=ham version=3.3.1 spammy=3-4 X-Spam-Status: No, score=-18.6 required=5.0 tests=AWL,BAYES_00,FORGED_SPF_HELO,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LOTSOFHASH,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS,UNSUBSCRIBE_BODY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on sourceware.org X-Spam-Level: X-HELO: EUR04-DB3-obe.outbound.protection.outlook.com Received: from mail-eopbgr60046.outbound.protection.outlook.com (HELO EUR04-DB3-obe.outbound.protection.outlook.com) (40.107.6.46) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 13 Sep 2019 16:26:19 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+DVkzNeyAqzYjHjD4J7qKSQYmI0SB+n4SdUWOVa8CKM=; b=oklyO8ga7/EF4CjFMH/ulNiiFsW8/YC9t7oPZ21bVoI8dzkYc6Fr8xUNgfNzdwZK90VsbO1IPLlsO0ZJXAcs8OTBOBaTLDWEhah/kBpYFD06sy1Wr0vYd73xDKP8KgrGO0NEL4GVRgUh7ge5melBw7mjHqLLyvJ2gOcuLkP+7x0= Received: from AM6PR08CA0039.eurprd08.prod.outlook.com (2603:10a6:20b:c0::27) by AM0PR08MB5057.eurprd08.prod.outlook.com (2603:10a6:208:165::33) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2263.15; Fri, 13 Sep 2019 16:26:15 +0000 Received: from DB5EUR03FT034.eop-EUR03.prod.protection.outlook.com (2a01:111:f400:7e0a::207) by AM6PR08CA0039.outlook.office365.com (2603:10a6:20b:c0::27) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2263.17 via Frontend Transport; Fri, 13 Sep 2019 16:26:14 +0000 Authentication-Results: spf=temperror (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; sourceware.org; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;sourceware.org; dmarc=none action=none header.from=arm.com; Received-SPF: TempError (protection.outlook.com: error in processing during lookup of arm.com: DNS Timeout) Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by DB5EUR03FT034.mail.protection.outlook.com (10.152.20.87) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2263.14 via Frontend Transport; Fri, 13 Sep 2019 16:26:13 +0000 Received: ("Tessian outbound 96594883d423:v31"); Fri, 13 Sep 2019 16:26:13 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: ad6e2304aeb8f2b9 X-CR-MTA-TID: 64aa7808 Received: from 59fdd4e9a028.1 (ip-172-16-0-2.eu-west-1.compute.internal [104.47.4.57]) by 64aa7808-outbound-1.mta.getcheckrecipient.com id 84C10E21-E613-46FF-BF0F-CD496F2FDFD1.1; Fri, 13 Sep 2019 16:26:08 +0000 Received: from EUR02-AM5-obe.outbound.protection.outlook.com (mail-am5eur02lp2057.outbound.protection.outlook.com [104.47.4.57]) by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 59fdd4e9a028.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Fri, 13 Sep 2019 16:26:08 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=PMHs7YxJwTwmqmwnCsxghXmwvgpovnxc0eJERUSYuDqu168UZOSxzx/H9fhrM9p+ecRON9z/LtJIgnFJxhf/iH6q/FhjZhosxmYfeZ6o4LToqDsdYQJsftCpiJHrfOZxjRpx+/otYOBEFzMU8ZR+bMtXeEdwJdq+0s93SeqHFhb2GFRoG1cukzdLn8DDIhm1nTskD09sfnGRJi6TC+vby6fhlJT6Gz967tN19e0Bb30aAbLqyCV26Gpe0q8XIMd3UYtO4lxYYgUOhukN3Foz46VUljvp3sm3huYSbIo7v2HNdB/EpusKydhPBDOm+/2vTNeUV5bFTaNZ5+h/dR6h6w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+DVkzNeyAqzYjHjD4J7qKSQYmI0SB+n4SdUWOVa8CKM=; b=hQg+yrJaUToGNsxkSJ0AMVnr08YTsVk6wYVxmXM3cC9sgHoGB6TWB+LBJ5XCAKY1sf6ftf7FViZwSdKcWOhPA27Nnz7K6w3E770QIVeSbDWtBM9sIs6tm/Q7LVl1Z1d4SCWbfoT9aUbzq0XKTQNkVnl38HpGbFzic+eSF0lCudQXmF5OUyXOmPOmqoUYb/rntJCvwLC/TSTknVEPQ1kTW+XwHvZJjS13mNr5VAhSVT4ggZaCygqE0QOVWqVC/dyjW9d56/q1X3tMkSUQvU8uvFLRLPnAIxdBL80G3GckmXeqHhld32u0Ro1hkt+SLj8WBY+In8Ud1NiqcX1HwdYbLw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+DVkzNeyAqzYjHjD4J7qKSQYmI0SB+n4SdUWOVa8CKM=; b=oklyO8ga7/EF4CjFMH/ulNiiFsW8/YC9t7oPZ21bVoI8dzkYc6Fr8xUNgfNzdwZK90VsbO1IPLlsO0ZJXAcs8OTBOBaTLDWEhah/kBpYFD06sy1Wr0vYd73xDKP8KgrGO0NEL4GVRgUh7ge5melBw7mjHqLLyvJ2gOcuLkP+7x0= Received: from VI1PR0801MB2127.eurprd08.prod.outlook.com (10.168.62.22) by VI1PR0801MB2094.eurprd08.prod.outlook.com (10.173.76.146) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2263.21; Fri, 13 Sep 2019 16:26:06 +0000 Received: from VI1PR0801MB2127.eurprd08.prod.outlook.com ([fe80::5543:6255:419c:6a7d]) by VI1PR0801MB2127.eurprd08.prod.outlook.com ([fe80::5543:6255:419c:6a7d%8]) with mapi id 15.20.2263.021; Fri, 13 Sep 2019 16:26:06 +0000 From: Wilco Dijkstra To: "libc-stable@sourceware.org" CC: nd Subject: [2.28 COMMITTED] Backport strstr/memmem performance improvements Thread-Topic: [2.28 COMMITTED] Backport strstr/memmem performance improvements Thread-Index: AQHVak9hHHunKnN3VkOzIm99ylXH5g== Date: Tue, 01 Jan 2019 00:00:00 -0000 Message-ID: Accept-Language: en-GB, en-US Content-Language: en-GB X-MS-Has-Attach: yes X-MS-TNEF-Correlator: Authentication-Results-Original: spf=none (sender IP is ) smtp.mailfrom=Wilco.Dijkstra@arm.com; x-originating-ip: [217.140.106.54] x-ms-publictraffictype: Email X-MS-Office365-Filtering-Correlation-Id: 3d42aa71-c792-4112-122f-08d738671833 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam-Untrusted: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600166)(711020)(4605104)(1401327)(4618075)(2017052603328)(49563074)(7193020);SRVR:VI1PR0801MB2094; X-MS-TrafficTypeDiagnostic: VI1PR0801MB2094:|AM0PR08MB5057: X-MS-Exchange-PUrlCount: 1 X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true x-ms-oob-tlc-oobclassifiers: OLM:5797;OLM:5797; x-forefront-prvs: 0159AC2B97 X-Forefront-Antispam-Report-Untrusted: SFV:NSPM;SFS:(10009020)(4636009)(366004)(39860400002)(346002)(396003)(376002)(136003)(189003)(199004)(81156014)(66946007)(8676002)(81166006)(8936002)(64756008)(76116006)(66446008)(66556008)(66476007)(66616009)(71200400001)(71190400001)(3846002)(6116002)(33656002)(5660300002)(52536014)(2906002)(2351001)(476003)(5640700003)(4326008)(6436002)(316002)(99286004)(6506007)(86362001)(53936002)(102836004)(26005)(186003)(25786009)(66066001)(7696005)(55016002)(9686003)(6306002)(256004)(14444005)(305945005)(74316002)(486006)(99936001)(14454004)(508600001)(6916009)(2501003)(7736002);DIR:OUT;SFP:1101;SCL:1;SRVR:VI1PR0801MB2094;H:VI1PR0801MB2127.eurprd08.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;MX:1;A:1; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info-Original: 8lov6np+yjtWfKT3vNDaICxpXOduSJRpHOkvbNbchhN2FmnfG9sJ3lJbZaCViQuWxDaXEtHPLiZH0oDUxIb2UVg83ileL8t7RlVD+ibvSKBVlCNISfUgNDWVYJowtQWS8lYWdjvbxhezsrGHRYwyYBtWU9mygofOyKt2cOWeYb31IEakrvcH2sxMsM4B7iCbkEEAofuP1c3LbU4VyfyQmFkpvZBmXLQh+NUYK8Afhnf/vpfC4Wy9dsdnxbrxRo33H/wbRCiULZEQUZWwVO3s4LAqE63eRD3iwAtGivLhHlI7vK0gmFGIrLbI8uqtSNN5bvkpsLHyHDpldIIRrVvgXoJu+Orab3oyaRjE1g86R1lpBn+rLdVhO8hW3Z3i0HHAWHAQmlGWi2HbIHNIEktycZgEji9oCXqDi8z1k1yHZRo= x-ms-exchange-transport-forked: True Content-Type: multipart/mixed; boundary="_002_VI1PR0801MB2127D98C6DCA00DA140D0A4C83B30VI1PR0801MB2127_" MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0801MB2094 Original-Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Wilco.Dijkstra@arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: DB5EUR03FT034.eop-EUR03.prod.protection.outlook.com X-Forefront-Antispam-Report: CIP:63.35.35.123;IPV:CAL;SCL:-1;CTRY:IE;EFV:NLI;SFV:NSPM;SFS:(10009020)(4636009)(396003)(376002)(346002)(39860400002)(136003)(199004)(189003)(6506007)(235185007)(33656002)(6306002)(316002)(9686003)(16586007)(55016002)(63350400001)(336012)(52536014)(568964002)(486006)(126002)(476003)(14454004)(66616009)(70206006)(6916009)(22756006)(2351001)(2501003)(70586007)(14444005)(5024004)(5640700003)(66066001)(76130400001)(508600001)(8676002)(26826003)(2476003)(5660300002)(305945005)(356004)(7736002)(8936002)(81166006)(81156014)(25786009)(2906002)(3846002)(6116002)(26005)(7696005)(186003)(71190400001)(4326008)(86362001)(102836004)(74316002)(99286004)(99936001);DIR:OUT;SFP:1101;SCL:1;SRVR:AM0PR08MB5057;H:64aa7808-outbound-1.mta.getcheckrecipient.com;FPR:;SPF:TempError;LANG:en;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;A:1;MX:1; X-MS-Office365-Filtering-Correlation-Id-Prvs: 43e56a17-b603-4f72-e2db-08d73867143f X-Microsoft-Antispam: BCL:0;PCL:0;RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600166)(710020)(711020)(4605104)(1401327)(4618075)(2017052603328)(49563074)(7193020);SRVR:AM0PR08MB5057; NoDisclaimer: True X-Forefront-PRVS: 0159AC2B97 X-Microsoft-Antispam-Message-Info: 22Xpt1JB7vSek/luBTB1vZ6XXXg2fkOn4eAyYBPkJH/uI9BypOLKuK4meKmAbQF8txJs/4F8nGb+jsoH55JUihW/bZsMKPLBxhn+c1cJzMtwvHz9hdzZcF0MgAU4JBH4O22p9TUinZU6SG0wrzwANEZUOO/HDTZk7E8kbG8oyAUKhFTmqDPWesX7bXmMmVLhtCaUPo7EklyiZ7CQDhRFU9KowF/jQuhyEweiIOjRfWXlpbRDaWBxmqLghOC/uLFAtmJRMmleodRLxvjeRzV04XtWrlKkmpDUyJStRX8oEASwO83qsPfvqrG8TE3OaIW51T7SticDo8aBS6M3jraPKCqLhqLEGqb7ZtTxL/rS71rNw1hV+xxMP3FfrQdVQO6/mA/ec+EPB1jEkAtJO1Q5K01+tO/Xn86L1rqGx+72FCg= X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Sep 2019 16:26:13.4271 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3d42aa71-c792-4112-122f-08d738671833 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR08MB5057 X-SW-Source: 2019-09/txt/msg00017.txt.bz2 --_002_VI1PR0801MB2127D98C6DCA00DA140D0A4C83B30VI1PR0801MB2127_ Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-length: 4434 commit b58bace7cede42c31c8047907b1e7ad318d24c32 Author: Wilco Dijkstra Date: Wed Jun 12 11:42:34 2019 +0100 Improve performance of memmem =20=20=20=20 This patch significantly improves performance of memmem using a novel modified Horspool algorithm. Needles up to size 256 use a bad-character table indexed by hashed pairs of characters to quickly skip past mismat= ches. Long needles use a self-adapting filtering step to avoid comparing the = whole needle repeatedly. =20=20=20=20 By limiting the needle length to 256, the shift table only requires 8 b= its per entry, lowering preprocessing overhead and minimizing cache effects. This limit also implies worst-case performance is linear. =20=20=20=20 Small needles up to size 2 use a dedicated linear search. Very long ne= edles use the Two-Way algorithm (to avoid increasing stack size or slowing do= wn the common case, inlining is disabled). =20=20=20=20 The performance gain is 6.6 times on English text on AArch64 using rand= om needles with average size 8. =20=20=20=20 Tested against GLIBC testsuite and randomized tests. =20=20=20=20 Reviewed-by: Szabolcs Nagy =20=20=20=20 * string/memmem.c (__memmem): Rewrite to improve performance. =20=20=20=20 (cherry picked from commit 680942b0167715e123d934b609060cd382f8e39f) commit 354f52e984598f336f963aad7c5cbccf986e72d7 Author: Wilco Dijkstra Date: Wed Jun 12 11:38:52 2019 +0100 Improve performance of strstr =20=20=20=20 This patch significantly improves performance of strstr using a novel modified Horspool algorithm. Needles up to size 256 use a bad-character table indexed by hashed pairs of characters to quickly skip past mismat= ches. Long needles use a self-adapting filtering step to avoid comparing the = whole needle repeatedly. =20=20=20=20 By limiting the needle length to 256, the shift table only requires 8 b= its per entry, lowering preprocessing overhead and minimizing cache effects. This limit also implies worst-case performance is linear. =20=20=20=20 Small needles up to size 3 use a dedicated linear search. Very long ne= edles use the Two-Way algorithm. =20=20=20=20 The performance gain using the improved bench-strstr on Cortex-A72 is 5= .8 times basic_strstr and 3.7 times twoway_strstr. =20=20=20=20 Tested against GLIBC testsuite, randomized tests and the GNULIB strstr = test (https://git.savannah.gnu.org/cgit/gnulib.git/tree/tests/test-strstr.c). =20=20=20=20 Reviewed-by: Szabolcs Nagy =20=20=20=20 * string/str-two-way.h (two_way_short_needle): Add inline to avoid warning. (two_way_long_needle): Block inlining. * string/strstr.c (strstr2): Add new function. (strstr3): Likewise. (STRSTR): Completely rewrite strstr to improve performance. =20=20=20=20 (cherry picked from commit 5e0a7ecb6629461b28adc1a5aabcc0ede122f201) commit d6ccf2f45c5e09d3a36321ba695325589e8940fe Author: Rajalakshmi Srinivasaraghavan Date: Tue Aug 28 12:42:19 2018 +0530 Speedup first memmem match =20=20=20=20 As done in commit 284f42bc778e487dfd5dff5c01959f93b9e0c4f5, memcmp can be used after memchr to avoid the initialization overhead of the two-way algorithm for the first match. This has shown improvement >40% for first match. =20=20=20=20 (cherry picked from commit c8dd67e7c958de04c3783cbea7c384431707b5f8) commit 1def6a34aee55e26a0755a3e36bf2e184a4cdf5e Author: Wilco Dijkstra Date: Fri Aug 3 17:24:12 2018 +0100 Simplify and speedup strstr/strcasestr first match =20=20=20=20 Looking at the benchtests, both strstr and strcasestr spend a lot of ti= me in a slow initialization loop handling one character per iteration. This can be simplified and use the much faster strlen/strnlen/strchr/me= mcmp. Read ahead a few cachelines to reduce the number of strnlen calls, which improves performance by ~3-4%. This patch improves the time taken for = the full strstr benchtest by >40%. =20=20=20=20 * string/strcasestr.c (STRCASESTR): Simplify and speedup first matc= h. * string/strstr.c (AVAILABLE): Likewise. =20=20=20=20 (cherry picked from commit 284f42bc778e487dfd5dff5c01959f93b9e0c4f5) --_002_VI1PR0801MB2127D98C6DCA00DA140D0A4C83B30VI1PR0801MB2127_ Content-Type: text/x-patch; name="strstr2.patch" Content-Description: strstr2.patch Content-Disposition: attachment; filename="strstr2.patch"; size=17293; creation-date="Fri, 13 Sep 2019 16:24:36 GMT"; modification-date="Fri, 13 Sep 2019 16:24:36 GMT" Content-Transfer-Encoding: base64 Content-length: 23445 ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBjYjUy MjQ5Li40MTZjNjFhIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hh bmdlTG9nCkBAIC0xLDMgKzEsMjUgQEAKKzIwMTktMDktMTMgIFdpbGNvIERp amtzdHJhICA8d2RpamtzdHJAYXJtLmNvbT4KKworCSogc3RyaW5nL21lbW1l bS5jIChfX21lbW1lbSk6IFJld3JpdGUgdG8gaW1wcm92ZSBwZXJmb3JtYW5j ZS4KKworMjAxOS0wNi0xMiAgV2lsY28gRGlqa3N0cmEgIDx3ZGlqa3N0ckBh cm0uY29tPgorCisJKiBzdHJpbmcvc3RyLXR3by13YXkuaCAodHdvX3dheV9z aG9ydF9uZWVkbGUpOiBBZGQgaW5saW5lIHRvIGF2b2lkCisJd2FybmluZy4K KwkodHdvX3dheV9sb25nX25lZWRsZSk6IEJsb2NrIGlubGluaW5nLgorCSog c3RyaW5nL3N0cnN0ci5jIChzdHJzdHIyKTogQWRkIG5ldyBmdW5jdGlvbi4K Kwkoc3Ryc3RyMyk6IExpa2V3aXNlLgorCShTVFJTVFIpOiBDb21wbGV0ZWx5 IHJld3JpdGUgc3Ryc3RyIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuCisKKzIw MTktMDktMTMgIFJhamFsYWtzaG1pIFNyaW5pdmFzYXJhZ2hhdmFuICA8cmFq aUBsaW51eC52bmV0LmlibS5jb20+CisKKwkqIHN0cmluZy9tZW1tZW0uYzog VXNlIG1lbWNtcCBmb3IgZmlyc3QgbWF0Y2guCisKKzIwMTktMDktMTMgIFdp bGNvIERpamtzdHJhICA8d2RpamtzdHJAYXJtLmNvbT4KKworCSogc3RyaW5n L3N0cmNhc2VzdHIuYyAoU1RSQ0FTRVNUUik6IFNpbXBsaWZ5IGFuZCBzcGVl ZHVwIGZpcnN0IG1hdGNoLgorCSogc3RyaW5nL3N0cnN0ci5jIChBVkFJTEFC TEUpOiBMaWtld2lzZS4KKwogMjAxOS0wOS0wNiAgV2lsY28gRGlqa3N0cmEg IDx3ZGlqa3N0ckBhcm0uY29tPgogCiAJKiBtYW51YWwvdHVuYWJsZXMudGV4 aSAoZ2xpYmMuY3B1Lm5hbWUpOiBBZGQgYXJlcyB0dW5hYmxlLgpkaWZmIC0t Z2l0IGEvc3RyaW5nL21lbW1lbS5jIGIvc3RyaW5nL21lbW1lbS5jCmluZGV4 IDQzZWZhYTMuLjdmYmUxY2IgMTAwNjQ0Ci0tLSBhL3N0cmluZy9tZW1tZW0u YworKysgYi9zdHJpbmcvbWVtbWVtLmMKQEAgLTE1LDE3ICsxNSwxMyBAQAog ICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBu b3QsIHNlZQogICAgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAg Ki8KIAotLyogVGhpcyBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIHdhcyB3 cml0dGVuIGJ5IEVyaWMgQmxha2UsIDIwMDguICAqLwotCiAjaWZuZGVmIF9M SUJDCiAjIGluY2x1ZGUgPGNvbmZpZy5oPgogI2VuZGlmCiAKLS8qIFNwZWNp ZmljYXRpb24gb2YgbWVtbWVtLiAgKi8KICNpbmNsdWRlIDxzdHJpbmcuaD4K IAogI2lmbmRlZiBfTElCQwotIyBkZWZpbmUgX19idWlsdGluX2V4cGVjdChl eHByLCB2YWwpICAgKGV4cHIpCiAjIGRlZmluZSBfX21lbW1lbQltZW1tZW0K ICNlbmRpZgogCkBAIC0zNiw0NyArMzIsOTggQEAKIAogI3VuZGVmIG1lbW1l bQogCi0vKiBSZXR1cm4gdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgTkVFRExF IGluIEhBWVNUQUNLLiAgUmV0dXJuIEhBWVNUQUNLCi0gICBpZiBORUVETEVf TEVOIGlzIDAsIG90aGVyd2lzZSBOVUxMIGlmIE5FRURMRSBpcyBub3QgZm91 bmQgaW4KLSAgIEhBWVNUQUNLLiAgKi8KKy8qIEhhc2ggY2hhcmFjdGVyIHBh aXJzIHNvIGEgc21hbGwgc2hpZnQgdGFibGUgY2FuIGJlIHVzZWQuICBBbGwg Yml0cyBvZgorICAgcFswXSBhcmUgaW5jbHVkZWQsIGJ1dCBub3QgYWxsIGJp dHMgZnJvbSBwWy0xXS4gIFNvIGlmIHR3byBlcXVhbCBoYXNoZXMKKyAgIG1h dGNoIG9uIHBbLTFdLCBwWzBdIG1hdGNoZXMgdG9vLiAgSGFzaCBjb2xsaXNp b25zIGFyZSBoYXJtbGVzcyBhbmQgcmVzdWx0CisgICBpbiBzbWFsbGVyIHNo aWZ0cy4gICovCisjZGVmaW5lIGhhc2gyKHApICgoKHNpemVfdCkocClbMF0g LSAoKHNpemVfdCkocClbLTFdIDw8IDMpKSAlIHNpemVvZiAoc2hpZnQpKQor CisvKiBGYXN0IG1lbW1lbSBhbGdvcml0aG0gd2l0aCBndWFyYW50ZWVkIGxp bmVhci10aW1lIHBlcmZvcm1hbmNlLgorICAgU21hbGwgbmVlZGxlcyB1cCB0 byBzaXplIDIgdXNlIGEgZGVkaWNhdGVkIGxpbmVhciBzZWFyY2guICBMb25n ZXIgbmVlZGxlcworICAgdXAgdG8gc2l6ZSAyNTYgdXNlIGEgbm92ZWwgbW9k aWZpZWQgSG9yc3Bvb2wgYWxnb3JpdGhtLiAgSXQgaGFzaGVzIHBhaXJzCisg ICBvZiBjaGFyYWN0ZXJzIHRvIHF1aWNrbHkgc2tpcCBwYXN0IG1pc21hdGNo ZXMuICBUaGUgbWFpbiBzZWFyY2ggbG9vcCBvbmx5CisgICBleGl0cyBpZiB0 aGUgbGFzdCAyIGNoYXJhY3RlcnMgbWF0Y2gsIGF2b2lkaW5nIHVubmVjZXNz YXJ5IGNhbGxzIHRvIG1lbWNtcAorICAgYW5kIGFsbG93aW5nIGZvciBhIGxh cmdlciBza2lwIGlmIHRoZXJlIGlzIG5vIG1hdGNoLiAgQSBzZWxmLWFkYXB0 aW5nCisgICBmaWx0ZXJpbmcgY2hlY2sgaXMgdXNlZCB0byBxdWlja2x5IGRl dGVjdCBtaXNtYXRjaGVzIGluIGxvbmcgbmVlZGxlcy4KKyAgIEJ5IGxpbWl0 aW5nIHRoZSBuZWVkbGUgbGVuZ3RoIHRvIDI1NiwgdGhlIHNoaWZ0IHRhYmxl IGNhbiBiZSByZWR1Y2VkIHRvIDgKKyAgIGJpdHMgcGVyIGVudHJ5LCBsb3dl cmluZyBwcmVwcm9jZXNzaW5nIG92ZXJoZWFkIGFuZCBtaW5pbWl6aW5nIGNh Y2hlIGVmZmVjdHMuCisgICBUaGUgbGltaXQgYWxzbyBpbXBsaWVzIHdvcnN0 LWNhc2UgcGVyZm9ybWFuY2UgaXMgbGluZWFyLgorICAgTmVlZGxlcyBsYXJn ZXIgdGhhbiAyNTYgY2hhcmFjdGVycyB1c2UgdGhlIGxpbmVhci10aW1lIFR3 by1XYXkgYWxnb3JpdGhtLiAgKi8KIHZvaWQgKgotX19tZW1tZW0gKGNvbnN0 IHZvaWQgKmhheXN0YWNrX3N0YXJ0LCBzaXplX3QgaGF5c3RhY2tfbGVuLAot CSAgY29uc3Qgdm9pZCAqbmVlZGxlX3N0YXJ0LCBzaXplX3QgbmVlZGxlX2xl bikKK19fbWVtbWVtIChjb25zdCB2b2lkICpoYXlzdGFjaywgc2l6ZV90IGhz X2xlbiwKKwkgIGNvbnN0IHZvaWQgKm5lZWRsZSwgc2l6ZV90IG5lX2xlbikK IHsKLSAgLyogQWJzdHJhY3QgbWVtb3J5IGlzIGNvbnNpZGVyZWQgdG8gYmUg YW4gYXJyYXkgb2YgJ3Vuc2lnbmVkIGNoYXInIHZhbHVlcywKLSAgICAgbm90 IGFuIGFycmF5IG9mICdjaGFyJyB2YWx1ZXMuICBTZWUgSVNPIEMgOTkgc2Vj dGlvbiA2LjIuNi4xLiAgKi8KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqaGF5 c3RhY2sgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBoYXlzdGFja19zdGFy dDsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqbmVlZGxlID0gKGNvbnN0IHVu c2lnbmVkIGNoYXIgKikgbmVlZGxlX3N0YXJ0OwotCi0gIGlmIChuZWVkbGVf bGVuID09IDApCi0gICAgLyogVGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhl IGVtcHR5IHN0cmluZyBpcyBkZWVtZWQgdG8gb2NjdXIgYXQKLSAgICAgICB0 aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuICAqLwotICAgIHJldHVybiAo dm9pZCAqKSBoYXlzdGFjazsKLQotICAvKiBTYW5pdHkgY2hlY2ssIG90aGVy d2lzZSB0aGUgbG9vcCBtaWdodCBzZWFyY2ggdGhyb3VnaCB0aGUgd2hvbGUK LSAgICAgbWVtb3J5LiAgKi8KLSAgaWYgKF9fZ2xpYmNfdW5saWtlbHkgKGhh eXN0YWNrX2xlbiA8IG5lZWRsZV9sZW4pKQorICBjb25zdCB1bnNpZ25lZCBj aGFyICpocyA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIGhheXN0YWNrOwor ICBjb25zdCB1bnNpZ25lZCBjaGFyICpuZSA9IChjb25zdCB1bnNpZ25lZCBj aGFyICopIG5lZWRsZTsKKworICBpZiAobmVfbGVuID09IDApCisgICAgcmV0 dXJuICh2b2lkICopIGhzOworICBpZiAobmVfbGVuID09IDEpCisgICAgcmV0 dXJuICh2b2lkICopIG1lbWNociAoaHMsIG5lWzBdLCBoc19sZW4pOworCisg IC8qIEVuc3VyZSBoYXlzdGFjayBsZW5ndGggaXMgPj0gbmVlZGxlIGxlbmd0 aC4gICovCisgIGlmIChoc19sZW4gPCBuZV9sZW4pCiAgICAgcmV0dXJuIE5V TEw7CiAKLSAgLyogVXNlIG9wdGltaXphdGlvbnMgaW4gbWVtY2hyIHdoZW4g cG9zc2libGUsIHRvIHJlZHVjZSB0aGUgc2VhcmNoCi0gICAgIHNpemUgb2Yg aGF5c3RhY2sgdXNpbmcgYSBsaW5lYXIgYWxnb3JpdGhtIHdpdGggYSBzbWFs bGVyCi0gICAgIGNvZWZmaWNpZW50LiAgSG93ZXZlciwgYXZvaWQgbWVtY2hy IGZvciBsb25nIG5lZWRsZXMsIHNpbmNlIHdlCi0gICAgIGNhbiBvZnRlbiBh Y2hpZXZlIHN1YmxpbmVhciBwZXJmb3JtYW5jZS4gICovCi0gIGlmIChuZWVk bGVfbGVuIDwgTE9OR19ORUVETEVfVEhSRVNIT0xEKQorICBjb25zdCB1bnNp Z25lZCBjaGFyICplbmQgPSBocyArIGhzX2xlbiAtIG5lX2xlbjsKKworICBp ZiAobmVfbGVuID09IDIpCisgICAgeworICAgICAgdWludDMyX3QgbncgPSBu ZVswXSA8PCAxNiB8IG5lWzFdLCBodyA9IGhzWzBdIDw8IDE2IHwgaHNbMV07 CisgICAgICBmb3IgKGhzKys7IGhzIDw9IGVuZCAmJiBodyAhPSBudzsgKQor CWh3ID0gaHcgPDwgMTYgfCAqKytoczsKKyAgICAgIHJldHVybiBodyA9PSBu dyA/ICh2b2lkICopaHMgLSAxIDogTlVMTDsKKyAgICB9CisKKyAgLyogVXNl IFR3by1XYXkgYWxnb3JpdGhtIGZvciB2ZXJ5IGxvbmcgbmVlZGxlcy4gICov CisgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChuZV9sZW4gPiAyNTYsIDApKQor ICAgIHJldHVybiB0d29fd2F5X2xvbmdfbmVlZGxlIChocywgaHNfbGVuLCBu ZSwgbmVfbGVuKTsKKworICB1aW50OF90IHNoaWZ0WzI1Nl07CisgIHNpemVf dCB0bXAsIHNoaWZ0MTsKKyAgc2l6ZV90IG0xID0gbmVfbGVuIC0gMTsKKyAg c2l6ZV90IG9mZnNldCA9IDA7CisKKyAgbWVtc2V0IChzaGlmdCwgMCwgc2l6 ZW9mIChzaGlmdCkpOworICBmb3IgKGludCBpID0gMTsgaSA8IG0xOyBpKysp CisgICAgc2hpZnRbaGFzaDIgKG5lICsgaSldID0gaTsKKyAgLyogU2hpZnQx IGlzIHRoZSBhbW91bnQgd2UgY2FuIHNraXAgYWZ0ZXIgbWF0Y2hpbmcgdGhl IGhhc2ggb2YgdGhlCisgICAgIG5lZWRsZSBlbmQgYnV0IG5vdCB0aGUgZnVs bCBuZWVkbGUuICAqLworICBzaGlmdDEgPSBtMSAtIHNoaWZ0W2hhc2gyIChu ZSArIG0xKV07CisgIHNoaWZ0W2hhc2gyIChuZSArIG0xKV0gPSBtMTsKKwor ICBmb3IgKCA7IGhzIDw9IGVuZDsgKQogICAgIHsKLSAgICAgIGhheXN0YWNr ID0gbWVtY2hyIChoYXlzdGFjaywgKm5lZWRsZSwgaGF5c3RhY2tfbGVuKTsK LSAgICAgIGlmICghaGF5c3RhY2sgfHwgX19idWlsdGluX2V4cGVjdCAobmVl ZGxlX2xlbiA9PSAxLCAwKSkKLQlyZXR1cm4gKHZvaWQgKikgaGF5c3RhY2s7 Ci0gICAgICBoYXlzdGFja19sZW4gLT0gaGF5c3RhY2sgLSAoY29uc3QgdW5z aWduZWQgY2hhciAqKSBoYXlzdGFja19zdGFydDsKLSAgICAgIGlmIChoYXlz dGFja19sZW4gPCBuZWVkbGVfbGVuKQotCXJldHVybiBOVUxMOwotICAgICAg cmV0dXJuIHR3b193YXlfc2hvcnRfbmVlZGxlIChoYXlzdGFjaywgaGF5c3Rh Y2tfbGVuLCBuZWVkbGUsIG5lZWRsZV9sZW4pOworICAgICAgLyogU2tpcCBw YXN0IGNoYXJhY3RlciBwYWlycyBub3QgaW4gdGhlIG5lZWRsZS4gICovCisg ICAgICBkbworCXsKKwkgIGhzICs9IG0xOworCSAgdG1wID0gc2hpZnRbaGFz aDIgKGhzKV07CisJfQorICAgICAgd2hpbGUgKHRtcCA9PSAwICYmIGhzIDw9 IGVuZCk7CisKKyAgICAgIC8qIElmIHRoZSBtYXRjaCBpcyBub3QgYXQgdGhl IGVuZCBvZiB0aGUgbmVlZGxlLCBzaGlmdCB0byB0aGUgZW5kCisJIGFuZCBj b250aW51ZSB1bnRpbCB3ZSBtYXRjaCB0aGUgaGFzaCBvZiB0aGUgbmVlZGxl IGVuZC4gICovCisgICAgICBocyAtPSB0bXA7CisgICAgICBpZiAodG1wIDwg bTEpCisJY29udGludWU7CisKKyAgICAgIC8qIEhhc2ggb2YgdGhlIGxhc3Qg MiBjaGFyYWN0ZXJzIG1hdGNoZXMuICBJZiB0aGUgbmVlZGxlIGlzIGxvbmcs CisJIHRyeSB0byBxdWlja2x5IGZpbHRlciBvdXQgbWlzbWF0Y2hlcy4gICov CisgICAgICBpZiAobTEgPCAxNSB8fCBtZW1jbXAgKGhzICsgb2Zmc2V0LCBu ZSArIG9mZnNldCwgOCkgPT0gMCkKKwl7CisJICBpZiAobWVtY21wIChocywg bmUsIG0xKSA9PSAwKQorCSAgICByZXR1cm4gKHZvaWQgKikgaHM7CisKKwkg IC8qIEFkanVzdCBmaWx0ZXIgb2Zmc2V0IHdoZW4gaXQgZG9lc24ndCBmaW5k IHRoZSBtaXNtYXRjaC4gICovCisJICBvZmZzZXQgPSAob2Zmc2V0ID49IDgg PyBvZmZzZXQgOiBtMSkgLSA4OworCX0KKworICAgICAgLyogU2tpcCBiYXNl ZCBvbiBtYXRjaGluZyB0aGUgaGFzaCBvZiB0aGUgbmVlZGxlIGVuZC4gICov CisgICAgICBocyArPSBzaGlmdDE7CiAgICAgfQotICBlbHNlCi0gICAgcmV0 dXJuIHR3b193YXlfbG9uZ19uZWVkbGUgKGhheXN0YWNrLCBoYXlzdGFja19s ZW4sIG5lZWRsZSwgbmVlZGxlX2xlbik7CisgIHJldHVybiBOVUxMOwogfQog bGliY19oaWRkZW5fZGVmIChfX21lbW1lbSkKIHdlYWtfYWxpYXMgKF9fbWVt bWVtLCBtZW1tZW0pCiBsaWJjX2hpZGRlbl93ZWFrIChtZW1tZW0pCi0KLSN1 bmRlZiBMT05HX05FRURMRV9USFJFU0hPTEQKZGlmZiAtLWdpdCBhL3N0cmlu Zy9zdHItdHdvLXdheS5oIGIvc3RyaW5nL3N0ci10d28td2F5LmgKaW5kZXgg NTIzZDk0Ni4uMzU4OTU5YiAxMDA2NDQKLS0tIGEvc3RyaW5nL3N0ci10d28t d2F5LmgKKysrIGIvc3RyaW5nL3N0ci10d28td2F5LmgKQEAgLTIyMSw3ICsy MjEsNyBAQCBjcml0aWNhbF9mYWN0b3JpemF0aW9uIChjb25zdCB1bnNpZ25l ZCBjaGFyICpuZWVkbGUsIHNpemVfdCBuZWVkbGVfbGVuLAogICAgbW9zdCAy ICogSEFZU1RBQ0tfTEVOIC0gTkVFRExFX0xFTiBjb21wYXJpc29ucyBvY2N1 ciBpbiBzZWFyY2hpbmcuCiAgICBJZiBBVkFJTEFCTEUgbW9kaWZpZXMgSEFZ U1RBQ0tfTEVOIChhcyBpbiBzdHJzdHIpLCB0aGVuIGF0IG1vc3QgMyAqCiAg ICBIQVlTVEFDS19MRU4gLSBORUVETEVfTEVOIGNvbXBhcmlzb25zIG9jY3Vy IGluIHNlYXJjaGluZy4gICovCi1zdGF0aWMgUkVUVVJOX1RZUEUKK3N0YXRp YyBpbmxpbmUgUkVUVVJOX1RZUEUKIHR3b193YXlfc2hvcnRfbmVlZGxlIChj b25zdCB1bnNpZ25lZCBjaGFyICpoYXlzdGFjaywgc2l6ZV90IGhheXN0YWNr X2xlbiwKIAkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbmVlZGxlLCBz aXplX3QgbmVlZGxlX2xlbikKIHsKQEAgLTM4Miw4ICszODIsMTEgQEAgdHdv X3dheV9zaG9ydF9uZWVkbGUgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhheXN0 YWNrLCBzaXplX3QgaGF5c3RhY2tfbGVuLAogICAgYW5kIHN1YmxpbmVhciBw ZXJmb3JtYW5jZSBPKEhBWVNUQUNLX0xFTiAvIE5FRURMRV9MRU4pIGlzIHBv c3NpYmxlLgogICAgSWYgQVZBSUxBQkxFIG1vZGlmaWVzIEhBWVNUQUNLX0xF TiAoYXMgaW4gc3Ryc3RyKSwgdGhlbiBhdCBtb3N0IDMgKgogICAgSEFZU1RB Q0tfTEVOIC0gTkVFRExFX0xFTiBjb21wYXJpc29ucyBvY2N1ciBpbiBzZWFy Y2hpbmcsIGFuZAotICAgc3VibGluZWFyIHBlcmZvcm1hbmNlIGlzIG5vdCBw b3NzaWJsZS4gICovCi1zdGF0aWMgUkVUVVJOX1RZUEUKKyAgIHN1YmxpbmVh ciBwZXJmb3JtYW5jZSBpcyBub3QgcG9zc2libGUuCisKKyAgIFNpbmNlIHRo aXMgZnVuY3Rpb24gaXMgbGFyZ2UgYW5kIGNvbXBsZXgsIGJsb2NrIGlubGlu aW5nIHRvIGF2b2lkCisgICBzbG93aW5nIGRvd24gdGhlIGNvbW1vbiBjYXNl IG9mIHNtYWxsIG5lZWRsZXMuICAqLworX19hdHRyaWJ1dGVfXygobm9pbmxp bmUpKSBzdGF0aWMgUkVUVVJOX1RZUEUKIHR3b193YXlfbG9uZ19uZWVkbGUg KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmhheXN0YWNrLCBzaXplX3QgaGF5c3Rh Y2tfbGVuLAogCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5lZWRsZSwg c2l6ZV90IG5lZWRsZV9sZW4pCiB7CmRpZmYgLS1naXQgYS9zdHJpbmcvc3Ry Y2FzZXN0ci5jIGIvc3RyaW5nL3N0cmNhc2VzdHIuYwppbmRleCA0MjE3NjRi Li44YWE3NjAzIDEwMDY0NAotLS0gYS9zdHJpbmcvc3RyY2FzZXN0ci5jCisr KyBiL3N0cmluZy9zdHJjYXNlc3RyLmMKQEAgLTU5LDMxICs1OSwyMiBAQAog ICAgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uLiAgVGhpcyBmdW5jdGlv biBnaXZlcyB1bnNwZWNpZmllZAogICAgcmVzdWx0cyBpbiBtdWx0aWJ5dGUg bG9jYWxlcy4gICovCiBjaGFyICoKLVNUUkNBU0VTVFIgKGNvbnN0IGNoYXIg KmhheXN0YWNrX3N0YXJ0LCBjb25zdCBjaGFyICpuZWVkbGVfc3RhcnQpCitT VFJDQVNFU1RSIChjb25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAq bmVlZGxlKQogewotICBjb25zdCBjaGFyICpoYXlzdGFjayA9IGhheXN0YWNr X3N0YXJ0OwotICBjb25zdCBjaGFyICpuZWVkbGUgPSBuZWVkbGVfc3RhcnQ7 CiAgIHNpemVfdCBuZWVkbGVfbGVuOyAvKiBMZW5ndGggb2YgTkVFRExFLiAg Ki8KICAgc2l6ZV90IGhheXN0YWNrX2xlbjsgLyogS25vd24gbWluaW11bSBs ZW5ndGggb2YgSEFZU1RBQ0suICAqLwotICBib29sIG9rID0gdHJ1ZTsgLyog VHJ1ZSBpZiBORUVETEUgaXMgcHJlZml4IG9mIEhBWVNUQUNLLiAgKi8KLQot ICAvKiBEZXRlcm1pbmUgbGVuZ3RoIG9mIE5FRURMRSwgYW5kIGluIHRoZSBw cm9jZXNzLCBtYWtlIHN1cmUKLSAgICAgSEFZU1RBQ0sgaXMgYXQgbGVhc3Qg YXMgbG9uZyAobm8gcG9pbnQgcHJvY2Vzc2luZyBhbGwgb2YgYSBsb25nCi0g ICAgIE5FRURMRSBpZiBIQVlTVEFDSyBpcyB0b28gc2hvcnQpLiAgKi8KLSAg d2hpbGUgKCpoYXlzdGFjayAmJiAqbmVlZGxlKQotICAgIHsKLSAgICAgIG9r ICY9IChUT0xPV0VSICgodW5zaWduZWQgY2hhcikgKmhheXN0YWNrKQotCSAg ICAgPT0gVE9MT1dFUiAoKHVuc2lnbmVkIGNoYXIpICpuZWVkbGUpKTsKLSAg ICAgIGhheXN0YWNrKys7Ci0gICAgICBuZWVkbGUrKzsKLSAgICB9Ci0gIGlm ICgqbmVlZGxlKQorCisgIC8qIEhhbmRsZSBlbXB0eSBORUVETEUgc3BlY2lh bCBjYXNlLiAgKi8KKyAgaWYgKG5lZWRsZVswXSA9PSAnXDAnKQorICAgIHJl dHVybiAoY2hhciAqKSBoYXlzdGFjazsKKworICAvKiBFbnN1cmUgSEFZU1RB Q0sgbGVuZ3RoIGlzIGF0IGxlYXN0IGFzIGxvbmcgYXMgTkVFRExFIGxlbmd0 aC4KKyAgICAgU2luY2UgYSBtYXRjaCBtYXkgb2NjdXIgZWFybHkgb24gaW4g YSBodWdlIEhBWVNUQUNLLCB1c2Ugc3RybmxlbgorICAgICBhbmQgcmVhZCBh aGVhZCBhIGZldyBjYWNoZWxpbmVzIGZvciBpbXByb3ZlZCBwZXJmb3JtYW5j ZS4gICovCisgIG5lZWRsZV9sZW4gPSBzdHJsZW4gKG5lZWRsZSk7CisgIGhh eXN0YWNrX2xlbiA9IF9fc3RybmxlbiAoaGF5c3RhY2ssIG5lZWRsZV9sZW4g KyAyNTYpOworICBpZiAoaGF5c3RhY2tfbGVuIDwgbmVlZGxlX2xlbikKICAg ICByZXR1cm4gTlVMTDsKLSAgaWYgKG9rKQotICAgIHJldHVybiAoY2hhciAq KSBoYXlzdGFja19zdGFydDsKLSAgbmVlZGxlX2xlbiA9IG5lZWRsZSAtIG5l ZWRsZV9zdGFydDsKLSAgaGF5c3RhY2sgPSBoYXlzdGFja19zdGFydCArIDE7 Ci0gIGhheXN0YWNrX2xlbiA9IG5lZWRsZV9sZW4gLSAxOwogCiAgIC8qIFBl cmZvcm0gdGhlIHNlYXJjaC4gIEFic3RyYWN0IG1lbW9yeSBpcyBjb25zaWRl cmVkIHRvIGJlIGFuIGFycmF5CiAgICAgIG9mICd1bnNpZ25lZCBjaGFyJyB2 YWx1ZXMsIG5vdCBhbiBhcnJheSBvZiAnY2hhcicgdmFsdWVzLiAgU2VlCkBA IC05MSwxMCArODIsMTAgQEAgU1RSQ0FTRVNUUiAoY29uc3QgY2hhciAqaGF5 c3RhY2tfc3RhcnQsIGNvbnN0IGNoYXIgKm5lZWRsZV9zdGFydCkKICAgaWYg KG5lZWRsZV9sZW4gPCBMT05HX05FRURMRV9USFJFU0hPTEQpCiAgICAgcmV0 dXJuIHR3b193YXlfc2hvcnRfbmVlZGxlICgoY29uc3QgdW5zaWduZWQgY2hh ciAqKSBoYXlzdGFjaywKIAkJCQkgaGF5c3RhY2tfbGVuLAotCQkJCSAoY29u c3QgdW5zaWduZWQgY2hhciAqKSBuZWVkbGVfc3RhcnQsCisJCQkJIChjb25z dCB1bnNpZ25lZCBjaGFyICopIG5lZWRsZSwKIAkJCQkgbmVlZGxlX2xlbik7 CiAgIHJldHVybiB0d29fd2F5X2xvbmdfbmVlZGxlICgoY29uc3QgdW5zaWdu ZWQgY2hhciAqKSBoYXlzdGFjaywgaGF5c3RhY2tfbGVuLAotCQkJICAgICAg KGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbmVlZGxlX3N0YXJ0LAorCQkJICAg ICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbmVlZGxlLAogCQkJICAgICAg bmVlZGxlX2xlbik7CiB9CiAKZGlmZiAtLWdpdCBhL3N0cmluZy9zdHJzdHIu YyBiL3N0cmluZy9zdHJzdHIuYwppbmRleCA3OWViY2M3Li43ZmZiMThhIDEw MDY0NAotLS0gYS9zdHJpbmcvc3Ryc3RyLmMKKysrIGIvc3RyaW5nL3N0cnN0 ci5jCkBAIC0xNiwyOSArMTYsMTcgQEAKICAgIExpY2Vuc2UgYWxvbmcgd2l0 aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCBzZWUKICAgIDxodHRwOi8v d3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCiAKLS8qIFRoaXMgcGFydGlj dWxhciBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBieSBFcmljIEJsYWtl LCAyMDA4LiAgKi8KLQogI2lmbmRlZiBfTElCQwogIyBpbmNsdWRlIDxjb25m aWcuaD4KICNlbmRpZgogCi0vKiBTcGVjaWZpY2F0aW9uIG9mIHN0cnN0ci4g ICovCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNpbmNsdWRlIDxzdGRib29s Lmg+Ci0KLSNpZm5kZWYgX0xJQkMKLSMgZGVmaW5lIF9fYnVpbHRpbl9leHBl Y3QoZXhwciwgdmFsKSAgIChleHByKQotI2VuZGlmCi0KICNkZWZpbmUgUkVU VVJOX1RZUEUgY2hhciAqCiAjZGVmaW5lIEFWQUlMQUJMRShoLCBoX2wsIGos IG5fbCkJCQlcCiAgICgoKGopICsgKG5fbCkgPD0gKGhfbCkpIFwKICAgIHx8 ICgoaF9sKSArPSBfX3N0cm5sZW4gKCh2b2lkKikoKGgpICsgKGhfbCkpLCAo bl9sKSArIDUxMiksIFwKICAgICAgICAoaikgKyAobl9sKSA8PSAoaF9sKSkp Ci0jZGVmaW5lIENIRUNLX0VPTCAoMSkKLSNkZWZpbmUgUkVUMF9JRl8wKGEp IGlmICghYSkgZ290byByZXQwCi0jZGVmaW5lIEZBU1RTRUFSQ0goUyxDLE4p ICh2b2lkKikgc3RyY2hyICgodm9pZCopKFMpLCAoQykpCiAjaW5jbHVkZSAi c3RyLXR3by13YXkuaCIKIAogI3VuZGVmIHN0cnN0cgpAQCAtNDcsNDggKzM1 LDEyOCBAQAogI2RlZmluZSBTVFJTVFIgc3Ryc3RyCiAjZW5kaWYKIAotLyog UmV0dXJuIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIE5FRURMRSBpbiBIQVlT VEFDSy4gIFJldHVybiBIQVlTVEFDSwotICAgaWYgTkVFRExFIGlzIGVtcHR5 LCBvdGhlcndpc2UgTlVMTCBpZiBORUVETEUgaXMgbm90IGZvdW5kIGluCi0g ICBIQVlTVEFDSy4gICovCitzdGF0aWMgaW5saW5lIGNoYXIgKgorc3Ryc3Ry MiAoY29uc3QgdW5zaWduZWQgY2hhciAqaHMsIGNvbnN0IHVuc2lnbmVkIGNo YXIgKm5lKQoreworICB1aW50MzJfdCBoMSA9IChuZVswXSA8PCAxNikgfCBu ZVsxXTsKKyAgdWludDMyX3QgaDIgPSAwOworICBmb3IgKGludCBjID0gaHNb MF07IGgxICE9IGgyICYmIGMgIT0gMDsgYyA9ICorK2hzKQorICAgICAgaDIg PSAoaDIgPDwgMTYpIHwgYzsKKyAgcmV0dXJuIGgxID09IGgyID8gKGNoYXIg KilocyAtIDIgOiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKgor c3Ryc3RyMyAoY29uc3QgdW5zaWduZWQgY2hhciAqaHMsIGNvbnN0IHVuc2ln bmVkIGNoYXIgKm5lKQoreworICB1aW50MzJfdCBoMSA9ICgodWludDMyX3Qp bmVbMF0gPDwgMjQpIHwgKG5lWzFdIDw8IDE2KSB8IChuZVsyXSA8PCA4KTsK KyAgdWludDMyX3QgaDIgPSAwOworICBmb3IgKGludCBjID0gaHNbMF07IGgx ICE9IGgyICYmIGMgIT0gMDsgYyA9ICorK2hzKQorICAgICAgaDIgPSAoaDIg fCBjKSA8PCA4OworICByZXR1cm4gaDEgPT0gaDIgPyAoY2hhciAqKWhzIC0g MyA6IE5VTEw7Cit9CisKKy8qIEhhc2ggY2hhcmFjdGVyIHBhaXJzIHNvIGEg c21hbGwgc2hpZnQgdGFibGUgY2FuIGJlIHVzZWQuICBBbGwgYml0cyBvZgor ICAgcFswXSBhcmUgaW5jbHVkZWQsIGJ1dCBub3QgYWxsIGJpdHMgZnJvbSBw Wy0xXS4gIFNvIGlmIHR3byBlcXVhbCBoYXNoZXMKKyAgIG1hdGNoIG9uIHBb LTFdLCBwWzBdIG1hdGNoZXMgdG9vLiAgSGFzaCBjb2xsaXNpb25zIGFyZSBo YXJtbGVzcyBhbmQgcmVzdWx0CisgICBpbiBzbWFsbGVyIHNoaWZ0cy4gICov CisjZGVmaW5lIGhhc2gyKHApICgoKHNpemVfdCkocClbMF0gLSAoKHNpemVf dCkocClbLTFdIDw8IDMpKSAlIHNpemVvZiAoc2hpZnQpKQorCisvKiBGYXN0 IHN0cnN0ciBhbGdvcml0aG0gd2l0aCBndWFyYW50ZWVkIGxpbmVhci10aW1l IHBlcmZvcm1hbmNlLgorICAgU21hbGwgbmVlZGxlcyB1cCB0byBzaXplIDMg dXNlIGEgZGVkaWNhdGVkIGxpbmVhciBzZWFyY2guICBMb25nZXIgbmVlZGxl cworICAgdXAgdG8gc2l6ZSAyNTYgdXNlIGEgbm92ZWwgbW9kaWZpZWQgSG9y c3Bvb2wgYWxnb3JpdGhtLiAgSXQgaGFzaGVzIHBhaXJzCisgICBvZiBjaGFy YWN0ZXJzIHRvIHF1aWNrbHkgc2tpcCBwYXN0IG1pc21hdGNoZXMuICBUaGUg bWFpbiBzZWFyY2ggbG9vcCBvbmx5CisgICBleGl0cyBpZiB0aGUgbGFzdCAy IGNoYXJhY3RlcnMgbWF0Y2gsIGF2b2lkaW5nIHVubmVjZXNzYXJ5IGNhbGxz IHRvIG1lbWNtcAorICAgYW5kIGFsbG93aW5nIGZvciBhIGxhcmdlciBza2lw IGlmIHRoZXJlIGlzIG5vIG1hdGNoLiAgQSBzZWxmLWFkYXB0aW5nCisgICBm aWx0ZXJpbmcgY2hlY2sgaXMgdXNlZCB0byBxdWlja2x5IGRldGVjdCBtaXNt YXRjaGVzIGluIGxvbmcgbmVlZGxlcy4KKyAgIEJ5IGxpbWl0aW5nIHRoZSBu ZWVkbGUgbGVuZ3RoIHRvIDI1NiwgdGhlIHNoaWZ0IHRhYmxlIGNhbiBiZSBy ZWR1Y2VkIHRvIDgKKyAgIGJpdHMgcGVyIGVudHJ5LCBsb3dlcmluZyBwcmVw cm9jZXNzaW5nIG92ZXJoZWFkIGFuZCBtaW5pbWl6aW5nIGNhY2hlIGVmZmVj dHMuCisgICBUaGUgbGltaXQgYWxzbyBpbXBsaWVzIHdvcnN0LWNhc2UgcGVy Zm9ybWFuY2UgaXMgbGluZWFyLgorICAgTmVlZGxlcyBsYXJnZXIgdGhhbiAy NTYgY2hhcmFjdGVycyB1c2UgdGhlIGxpbmVhci10aW1lIFR3by1XYXkgYWxn b3JpdGhtLiAgKi8KIGNoYXIgKgotU1RSU1RSIChjb25zdCBjaGFyICpoYXlz dGFja19zdGFydCwgY29uc3QgY2hhciAqbmVlZGxlX3N0YXJ0KQorU1RSU1RS IChjb25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVlZGxlKQog ewotICBjb25zdCBjaGFyICpoYXlzdGFjayA9IGhheXN0YWNrX3N0YXJ0Owot ICBjb25zdCBjaGFyICpuZWVkbGUgPSBuZWVkbGVfc3RhcnQ7Ci0gIHNpemVf dCBuZWVkbGVfbGVuOyAvKiBMZW5ndGggb2YgTkVFRExFLiAgKi8KLSAgc2l6 ZV90IGhheXN0YWNrX2xlbjsgLyogS25vd24gbWluaW11bSBsZW5ndGggb2Yg SEFZU1RBQ0suICAqLwotICBib29sIG9rID0gdHJ1ZTsgLyogVHJ1ZSBpZiBO RUVETEUgaXMgcHJlZml4IG9mIEhBWVNUQUNLLiAgKi8KLQotICAvKiBEZXRl cm1pbmUgbGVuZ3RoIG9mIE5FRURMRSwgYW5kIGluIHRoZSBwcm9jZXNzLCBt YWtlIHN1cmUKLSAgICAgSEFZU1RBQ0sgaXMgYXQgbGVhc3QgYXMgbG9uZyAo bm8gcG9pbnQgcHJvY2Vzc2luZyBhbGwgb2YgYSBsb25nCi0gICAgIE5FRURM RSBpZiBIQVlTVEFDSyBpcyB0b28gc2hvcnQpLiAgKi8KLSAgd2hpbGUgKCpo YXlzdGFjayAmJiAqbmVlZGxlKQotICAgIG9rICY9ICpoYXlzdGFjaysrID09 ICpuZWVkbGUrKzsKLSAgaWYgKCpuZWVkbGUpCisgIGNvbnN0IHVuc2lnbmVk IGNoYXIgKmhzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgaGF5c3RhY2s7 CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5lID0gKGNvbnN0IHVuc2lnbmVk IGNoYXIgKikgbmVlZGxlOworCisgIC8qIEhhbmRsZSBzaG9ydCBuZWVkbGUg c3BlY2lhbCBjYXNlcyBmaXJzdC4gICovCisgIGlmIChuZVswXSA9PSAnXDAn KQorICAgIHJldHVybiAoY2hhciAqKWhzOworICBocyA9IChjb25zdCB1bnNp Z25lZCBjaGFyICopc3RyY2hyICgoY29uc3QgY2hhciopaHMsIG5lWzBdKTsK KyAgaWYgKGhzID09IE5VTEwgfHwgbmVbMV0gPT0gJ1wwJykKKyAgICByZXR1 cm4gKGNoYXIqKWhzOworICBpZiAobmVbMl0gPT0gJ1wwJykKKyAgICByZXR1 cm4gc3Ryc3RyMiAoaHMsIG5lKTsKKyAgaWYgKG5lWzNdID09ICdcMCcpCisg ICAgcmV0dXJuIHN0cnN0cjMgKGhzLCBuZSk7CisKKyAgLyogRW5zdXJlIGhh eXN0YWNrIGxlbmd0aCBpcyBhdCBsZWFzdCBhcyBsb25nIGFzIG5lZWRsZSBs ZW5ndGguCisgICAgIFNpbmNlIGEgbWF0Y2ggbWF5IG9jY3VyIGVhcmx5IG9u IGluIGEgaHVnZSBoYXlzdGFjaywgdXNlIHN0cm5sZW4KKyAgICAgYW5kIHJl YWQgYWhlYWQgYSBmZXcgY2FjaGVsaW5lcyBmb3IgaW1wcm92ZWQgcGVyZm9y bWFuY2UuICAqLworICBzaXplX3QgbmVfbGVuID0gc3RybGVuICgoY29uc3Qg Y2hhciopbmUpOworICBzaXplX3QgaHNfbGVuID0gX19zdHJubGVuICgoY29u c3QgY2hhciopaHMsIG5lX2xlbiB8IDUxMik7CisgIGlmIChoc19sZW4gPCBu ZV9sZW4pCiAgICAgcmV0dXJuIE5VTEw7Ci0gIGlmIChvaykKLSAgICByZXR1 cm4gKGNoYXIgKikgaGF5c3RhY2tfc3RhcnQ7Ci0KLSAgLyogUmVkdWNlIHRo ZSBzaXplIG9mIGhheXN0YWNrIHVzaW5nIHN0cmNociwgc2luY2UgaXQgaGFz IGEgc21hbGxlcgotICAgICBsaW5lYXIgY29lZmZpY2llbnQgdGhhbiB0aGUg VHdvLVdheSBhbGdvcml0aG0uICAqLwotICBuZWVkbGVfbGVuID0gbmVlZGxl IC0gbmVlZGxlX3N0YXJ0OwotICBoYXlzdGFjayA9IHN0cmNociAoaGF5c3Rh Y2tfc3RhcnQgKyAxLCAqbmVlZGxlX3N0YXJ0KTsKLSAgaWYgKCFoYXlzdGFj ayB8fCBfX2J1aWx0aW5fZXhwZWN0IChuZWVkbGVfbGVuID09IDEsIDApKQot ICAgIHJldHVybiAoY2hhciAqKSBoYXlzdGFjazsKLSAgbmVlZGxlIC09IG5l ZWRsZV9sZW47Ci0gIGhheXN0YWNrX2xlbiA9IChoYXlzdGFjayA+IGhheXN0 YWNrX3N0YXJ0ICsgbmVlZGxlX2xlbiA/IDEKLQkJICA6IG5lZWRsZV9sZW4g KyBoYXlzdGFja19zdGFydCAtIGhheXN0YWNrKTsKLQotICAvKiBQZXJmb3Jt IHRoZSBzZWFyY2guICBBYnN0cmFjdCBtZW1vcnkgaXMgY29uc2lkZXJlZCB0 byBiZSBhbiBhcnJheQotICAgICBvZiAndW5zaWduZWQgY2hhcicgdmFsdWVz LCBub3QgYW4gYXJyYXkgb2YgJ2NoYXInIHZhbHVlcy4gIFNlZQotICAgICBJ U08gQyA5OSBzZWN0aW9uIDYuMi42LjEuICAqLwotICBpZiAobmVlZGxlX2xl biA8IExPTkdfTkVFRExFX1RIUkVTSE9MRCkKLSAgICByZXR1cm4gdHdvX3dh eV9zaG9ydF9uZWVkbGUgKChjb25zdCB1bnNpZ25lZCBjaGFyICopIGhheXN0 YWNrLAotCQkJCSBoYXlzdGFja19sZW4sCi0JCQkJIChjb25zdCB1bnNpZ25l ZCBjaGFyICopIG5lZWRsZSwgbmVlZGxlX2xlbik7Ci0gIHJldHVybiB0d29f d2F5X2xvbmdfbmVlZGxlICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSBoYXlz dGFjaywgaGF5c3RhY2tfbGVuLAotCQkJICAgICAgKGNvbnN0IHVuc2lnbmVk IGNoYXIgKikgbmVlZGxlLCBuZWVkbGVfbGVuKTsKKworICAvKiBDaGVjayB3 aGV0aGVyIHdlIGhhdmUgYSBtYXRjaC4gIFRoaXMgaW1wcm92ZXMgcGVyZm9y bWFuY2Ugc2luY2Ugd2UKKyAgICAgYXZvaWQgaW5pdGlhbGl6YXRpb24gb3Zl cmhlYWRzLiAgKi8KKyAgaWYgKG1lbWNtcCAoaHMsIG5lLCBuZV9sZW4pID09 IDApCisgICAgcmV0dXJuIChjaGFyICopIGhzOworCisgIC8qIFVzZSBUd28t V2F5IGFsZ29yaXRobSBmb3IgdmVyeSBsb25nIG5lZWRsZXMuICAqLworICBp ZiAoX19nbGliY191bmxpa2VseSAobmVfbGVuID4gMjU2KSkKKyAgICByZXR1 cm4gdHdvX3dheV9sb25nX25lZWRsZSAoaHMsIGhzX2xlbiwgbmUsIG5lX2xl bik7CisKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kID0gaHMgKyBoc19s ZW4gLSBuZV9sZW47CisgIHVpbnQ4X3Qgc2hpZnRbMjU2XTsKKyAgc2l6ZV90 IHRtcCwgc2hpZnQxOworICBzaXplX3QgbTEgPSBuZV9sZW4gLSAxOworICBz aXplX3Qgb2Zmc2V0ID0gMDsKKworICAvKiBJbml0aWFsaXplIGJhZCBjaGFy YWN0ZXIgc2hpZnQgaGFzaCB0YWJsZS4gICovCisgIG1lbXNldCAoc2hpZnQs IDAsIHNpemVvZiAoc2hpZnQpKTsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBt MTsgaSsrKQorICAgIHNoaWZ0W2hhc2gyIChuZSArIGkpXSA9IGk7CisgIC8q IFNoaWZ0MSBpcyB0aGUgYW1vdW50IHdlIGNhbiBza2lwIGFmdGVyIG1hdGNo aW5nIHRoZSBoYXNoIG9mIHRoZQorICAgICBuZWVkbGUgZW5kIGJ1dCBub3Qg dGhlIGZ1bGwgbmVlZGxlLiAgKi8KKyAgc2hpZnQxID0gbTEgLSBzaGlmdFto YXNoMiAobmUgKyBtMSldOworICBzaGlmdFtoYXNoMiAobmUgKyBtMSldID0g bTE7CisKKyAgd2hpbGUgKDEpCisgICAgeworICAgICAgaWYgKF9fZ2xpYmNf dW5saWtlbHkgKGhzID4gZW5kKSkKKwl7CisJICBlbmQgKz0gX19zdHJubGVu ICgoY29uc3QgY2hhciopZW5kICsgbTEgKyAxLCAyMDQ4KTsKKwkgIGlmICho cyA+IGVuZCkKKwkgICAgcmV0dXJuIE5VTEw7CisJfQorCisgICAgICAvKiBT a2lwIHBhc3QgY2hhcmFjdGVyIHBhaXJzIG5vdCBpbiB0aGUgbmVlZGxlLiAg Ki8KKyAgICAgIGRvCisJeworCSAgaHMgKz0gbTE7CisJICB0bXAgPSBzaGlm dFtoYXNoMiAoaHMpXTsKKwl9CisgICAgICB3aGlsZSAodG1wID09IDAgJiYg aHMgPD0gZW5kKTsKKworICAgICAgLyogSWYgdGhlIG1hdGNoIGlzIG5vdCBh dCB0aGUgZW5kIG9mIHRoZSBuZWVkbGUsIHNoaWZ0IHRvIHRoZSBlbmQKKwkg YW5kIGNvbnRpbnVlIHVudGlsIHdlIG1hdGNoIHRoZSBoYXNoIG9mIHRoZSBu ZWVkbGUgZW5kLiAgKi8KKyAgICAgIGhzIC09IHRtcDsKKyAgICAgIGlmICh0 bXAgPCBtMSkKKwljb250aW51ZTsKKworICAgICAgLyogSGFzaCBvZiB0aGUg bGFzdCAyIGNoYXJhY3RlcnMgbWF0Y2hlcy4gIElmIHRoZSBuZWVkbGUgaXMg bG9uZywKKwkgdHJ5IHRvIHF1aWNrbHkgZmlsdGVyIG91dCBtaXNtYXRjaGVz LiAgKi8KKyAgICAgIGlmIChtMSA8IDE1IHx8IG1lbWNtcCAoaHMgKyBvZmZz ZXQsIG5lICsgb2Zmc2V0LCA4KSA9PSAwKQorCXsKKwkgIGlmIChtZW1jbXAg KGhzLCBuZSwgbTEpID09IDApCisJICAgIHJldHVybiAodm9pZCAqKSBoczsK KworCSAgLyogQWRqdXN0IGZpbHRlciBvZmZzZXQgd2hlbiBpdCBkb2Vzbid0 IGZpbmQgdGhlIG1pc21hdGNoLiAgKi8KKwkgIG9mZnNldCA9IChvZmZzZXQg Pj0gOCA/IG9mZnNldCA6IG0xKSAtIDg7CisJfQorCisgICAgICAvKiBTa2lw IGJhc2VkIG9uIG1hdGNoaW5nIHRoZSBoYXNoIG9mIHRoZSBuZWVkbGUgZW5k LiAgKi8KKyAgICAgIGhzICs9IHNoaWZ0MTsKKyAgICB9CiB9CiBsaWJjX2hp ZGRlbl9idWlsdGluX2RlZiAoc3Ryc3RyKQotCi0jdW5kZWYgTE9OR19ORUVE TEVfVEhSRVNIT0xECg== --_002_VI1PR0801MB2127D98C6DCA00DA140D0A4C83B30VI1PR0801MB2127_--