From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 54343 invoked by alias); 6 Sep 2019 14:46:16 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 53854 invoked by uid 89); 6 Sep 2019 14:46:15 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-11.0 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.1 spammy=HX-Envelope-From:sk:Matthew, tech, sk:communi, complaint X-HELO: EUR03-AM5-obe.outbound.protection.outlook.com Received: from mail-eopbgr30048.outbound.protection.outlook.com (HELO EUR03-AM5-obe.outbound.protection.outlook.com) (40.107.3.48) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 06 Sep 2019 14:46:12 +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=4bNn7zVE96RjSXyAcDnwysBaUyQw++WnuflrUjWnSco=; b=pFpNzJwfk/Tvak9Q1KXHjMDtHb2RMlgc7lEVUhgiYWLpdQFHB+8P6cXutlBXam6HbyfApm8cFJtlvUoF25uKzGWhu8CxMg2eY4A+PRZQaXEQE0tsDQrll8ZEtLjfRonV9TBYgPCg12Lm988vcPrH6LBTTk/Hkoa0kAeMe5ZygpQ= Received: from VI1PR0802CA0037.eurprd08.prod.outlook.com (2603:10a6:800:a9::23) by DB6PR0801MB1830.eurprd08.prod.outlook.com (2603:10a6:4:35::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2220.21; Fri, 6 Sep 2019 14:46:07 +0000 Received: from AM5EUR03FT060.eop-EUR03.prod.protection.outlook.com (2a01:111:f400:7e08::208) by VI1PR0802CA0037.outlook.office365.com (2603:10a6:800:a9::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2241.15 via Frontend Transport; Fri, 6 Sep 2019 14:46:07 +0000 Authentication-Results: spf=temperror (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; gcc.gnu.org; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;gcc.gnu.org; dmarc=temperror 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 AM5EUR03FT060.mail.protection.outlook.com (10.152.16.160) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2241.14 via Frontend Transport; Fri, 6 Sep 2019 14:46:06 +0000 Received: ("Tessian outbound aa6cb5c8f945:v27"); Fri, 06 Sep 2019 14:46:06 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 1ca72fbf757d21eb X-CR-MTA-TID: 64aa7808 Received: from b92a3c7d0147.1 (cr-mta-lb-1.cr-mta-net [104.47.13.55]) by 64aa7808-outbound-1.mta.getcheckrecipient.com id 600540D4-2493-481E-A7BD-77DFF34023AE.1; Fri, 06 Sep 2019 14:46:06 +0000 Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-he1eur04lp2055.outbound.protection.outlook.com [104.47.13.55]) by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id b92a3c7d0147.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Fri, 06 Sep 2019 14:46:06 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=G6m1WGFR7CbuVbhVTwr6KBe1GJnf4qG7z0t04Boua+AZQ7HvM5t2HmciF630yB9PlQhYUYmIexQYyS13At8Alcsw26EV/+vY8Ck6bYKGRu+shKLQxBTWl6MewJy36pjhOulz/i2o3JqA5O/zoHtzk4wBpt7DIfN3CFEiN2fIKR9pFw2kP9/uqvaxE/+7tDDDAmFkHyIG1sUzOF4PzUac8zqHqz7lAVqCkSwvgr85iDpPiZiX3tZPzFZJbCJnExBdEg6yxyo3cxQPb6XRY7T2ZswY8Y05k/8vI5ChLKeU+ItTGEXk4oZcg9ckt1T/ndBCKP45QXmZrUSkSkO1joOJjQ== 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=4bNn7zVE96RjSXyAcDnwysBaUyQw++WnuflrUjWnSco=; b=aWALojmB7Ah1OO3//MPboLSJBlQrmCNWBhbEEYfirQbeFYCv/laJDbSCsSu3zgGPK4dVK2mdMB261v5d3YofA9JumVEBhUH8Dq2k+gkxnsWYOp0VhmXs81MyuglGbrpuNHwcpEHs3DxI0W7icv4WZo4uP6slcMcbNdknc2AQrQhTKSVHYGYKWMhX9giO2G/RRPq0TzzudH3GlP4OIEOdbGrWRy4NpePYukeH9ihg5/YnofV5nWLA1aa7mDyBr2Saz4IctAI7+FtBbTdei1rek1tmaM7o+z5NLpuuaYZ2MYZMTI2jHAX/boC9PP6hv15LCWINMgTQE/fB/d20qDOXKw== 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=4bNn7zVE96RjSXyAcDnwysBaUyQw++WnuflrUjWnSco=; b=pFpNzJwfk/Tvak9Q1KXHjMDtHb2RMlgc7lEVUhgiYWLpdQFHB+8P6cXutlBXam6HbyfApm8cFJtlvUoF25uKzGWhu8CxMg2eY4A+PRZQaXEQE0tsDQrll8ZEtLjfRonV9TBYgPCg12Lm988vcPrH6LBTTk/Hkoa0kAeMe5ZygpQ= Received: from VI1PR08MB5471.eurprd08.prod.outlook.com (52.133.246.83) by VI1PR08MB3392.eurprd08.prod.outlook.com (20.177.58.222) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2241.14; Fri, 6 Sep 2019 14:46:03 +0000 Received: from VI1PR08MB5471.eurprd08.prod.outlook.com ([fe80::206a:65bd:e6a9:536b]) by VI1PR08MB5471.eurprd08.prod.outlook.com ([fe80::206a:65bd:e6a9:536b%2]) with mapi id 15.20.2241.018; Fri, 6 Sep 2019 14:46:03 +0000 From: Matthew Malcomson To: "gcc-patches@gcc.gnu.org" CC: "mliska@suse.cz" , "dodji@redhat.com" , nd , "kcc@google.com" , "jakub@redhat.com" , "dvyukov@google.com" Subject: [Patch 0/X] [WIP][RFC][libsanitizer] Introduce HWASAN to GCC Date: Fri, 06 Sep 2019 14:46:00 -0000 Message-ID: <156778058239.16148.17480879484406897649.scripted-patch-series@arm.com> Authentication-Results-Original: spf=none (sender IP is ) smtp.mailfrom=Matthew.Malcomson@arm.com; 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:VI1PR08MB3392; X-MS-Exchange-PUrlCount: 3 x-checkrecipientrouted: true x-ms-oob-tlc-oobclassifiers: OLM:5797;OLM:5797; X-Forefront-Antispam-Report-Untrusted: SFV:NSPM;SFS:(10009020)(4636009)(376002)(39860400002)(136003)(396003)(346002)(366004)(199004)(189003)(66476007)(66556008)(64756008)(66446008)(81166006)(5660300002)(2501003)(14454004)(966005)(25786009)(52116002)(478600001)(86362001)(4326008)(99936001)(8936002)(81156014)(6916009)(66946007)(71200400001)(71190400001)(8676002)(36756003)(66616009)(3846002)(2616005)(476003)(6116002)(103116003)(2906002)(53936002)(186003)(6512007)(6306002)(6486002)(6436002)(66066001)(256004)(14444005)(5024004)(5640700003)(54906003)(386003)(6506007)(44832011)(486006)(7736002)(305945005)(316002)(99286004)(26005)(2351001)(102836004);DIR:OUT;SFP:1101;SCL:1;SRVR:VI1PR08MB3392;H:VI1PR08MB5471.eurprd08.prod.outlook.com;FPR:;SPF:None;LANG:en;PTR:InfoNoRecords;A:1;MX: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: 5YuM9OnElAphmZJeDjyBR2NXp8MJKVksFjnb3lbsazWo0GRTjJDjsFJX1DU4uvxp3WeOctWHc07I9xIxEpuVCVIY5iD1VXz5vnCLIfwypBQZr2qTHOqNkpuoJ9ULllRwBanlRwhsIkFjAuqpsi9ir96DvSnKV4ezcN4Yx8GhjFseOi8wnyg6FFQxHzVOtdTkpKFSrj//5JQGYLlbSbK9B25TS9vGFCsZgxViPmenyt06UDkYm4UkIrSpEmR9WCXHWKjfmPU+RuLaJM62fySJPbkPRhZcFd11o1cBxoF9ncD7+tv6qu7yiTnIaNiY9v/ApPaTFvX+MoqMNK2EFJMrJl8AcClVCxkWaKr8Imui6HD4//28otD3q8dzCX98fGdJcfptw4Sz/Ql/uWyT5qqgTVrpATv8ysRnvnM0ygIIMSQ= x-ms-exchange-transport-forked: True Content-Type: multipart/mixed; boundary="_002_1567780582391614817480879484406897649scriptedpatchserie_" MIME-Version: 1.0 Original-Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Matthew.Malcomson@arm.com; Return-Path: Matthew.Malcomson@arm.com X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM5EUR03FT060.eop-EUR03.prod.protection.outlook.com X-MS-Office365-Filtering-Correlation-Id-Prvs: 5ea0c3a2-9742-468c-3d59-08d732d8f0d8 X-IsSubscribed: yes X-SW-Source: 2019-09/txt/msg00387.txt.bz2 --_002_1567780582391614817480879484406897649scriptedpatchserie_ Content-Type: text/plain; charset="us-ascii" Content-ID: <8462541FAFE8F7429EB90B8B0EFEB36E@eurprd08.prod.outlook.com> Content-Transfer-Encoding: quoted-printable Content-length: 3823 Hello, This patch series is a WORK-IN-PROGRESS towards porting the LLVM hardware address sanitizer (HWASAN) in GCC. The document describing HWASAN can be f= ound here http://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html. The current patch series is far from complete, but I'm posting the current = state to provide something to discuss at the Cauldron next week. In its current state, this sanitizer only works on AArch64 with a custom ke= rnel to allow tagged pointers in system calls. This is discussed in the below l= ink https://source.android.com/devices/tech/debug/hwasan -- the custom kernel a= llows tagged pointers in syscalls. I have also not yet put tests into the DejaGNU framework, but instead have a simple test file from which the tests will eventually come. That test file= is attached to this email despite not being in the patch series. Something close to this patch series bootstraps and passes most regression tests when ~--with-build-config=3Dbootstrap-hwasan~ is used. The regressio= ns it doesn't pass are all the other sanitizer tests and all linker plugin tests. The linker plugin tests fail due to a configuration problem where the libra= ry path is not correctly set. (I say "something close to this patch series" because I recently made a cha= nge that breaks bootstrap but I believe is the best approach once I've fixed it, hence for an RFC I'm leaving it in). HWASAN works by storing a tag in the top bits of every pointer and a colour= in a shadow memory region corresponding to every area of memory. On every mem= ory access through a pointer the tag in the pointer is checked against the colo= ur in shadow memory corresponding to the memory the pointer is accessing. If the= tag and colour do not match then a fault is signalled. The instrumentation required for this sanitizer has a large overlap with the instrumentation required for implementing MTE (which has similar functional= ity but checks are automatically done in the hardware and instructions for colo= uring shadow memory and for managing tags are provided by the architecture). https://community.arm.com/developer/ip-products/processors/b/processors-ip-= blog/posts/arm-a-profile-architecture-2018-developments-armv85a We hope to use the HWASAN framework to implement MTE tagging on the stack, = and hence I have a "dummy" patch demonstrating the approach envisaged for this. Though there is still much to implement here, the general approach should be clear. Any feedback is welcomed, but I have three main points that I'm particularly hoping for external opinions. 1) The current approach stores a tag on the RTL representing a given variab= le, in order to implement HWASAN for x86_64 the tag needs to be removed befo= re every memory access but not on things like function calls. Is there any obvious way to handle removing the tag in these places? Maybe something with legitimize_address? 2) The first draft presented here introduces a new RTL expression called ADDTAG. I now believe that a hook would be neater here but haven't yet looked into it. Do people agree? (addtag is introduced in the patch titled "Put tags into each stack vari= able pointer", but the reason it's introduced is so the backend can define how this gets implemented with a ~define_expand~ and that's only needed for = the MTE handling as introduced in "Add in MTE stubs") 3) This patch series has not yet had much thought go towards it around comm= and line arguments. I personally quite like the idea of having ~-fsanitize=3Dhwaddress~ turn on "checking memory tags against shadow me= mory colour", and MTE being just a hardware acceleration of this ability. I suspect this idea wouldn't be liked by all and would like to hear some opinions. Thanks, Matthew --_002_1567780582391614817480879484406897649scriptedpatchserie_ Content-Type: text/plain; name="testcases.c" Content-Description: testcases.c Content-Disposition: attachment; filename="testcases.c"; size=17443; creation-date="Fri, 06 Sep 2019 14:46:03 GMT"; modification-date="Fri, 06 Sep 2019 14:46:03 GMT" Content-ID: Content-Transfer-Encoding: base64 Content-length: 23648 I2luY2x1ZGUgPGFzc2VydC5oPg0KI2luY2x1ZGUgPHN0ZGFyZy5oPg0KI2lu Y2x1ZGUgPHN0ZGRlZi5oPg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVk ZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQojaW5jbHVkZSA8 c3RkaW50Lmg+DQoNCnN0cnVjdCB0d29fdmFsdWVzIHsNCiAgICBpbnQgbGVm dDsNCiAgICBpbnQgcmlnaHQ7DQp9Ow0KDQpzdHJ1Y3QgYmlnX3N0cnVjdCB7 DQogICAgaW50IGxlZnQ7DQogICAgaW50IHJpZ2h0Ow0KICAgIGludCBiaWdf YXJyYXlbMTAwXTsNCn07DQoNCnN0cnVjdCBiaXRtYXBwZWRfc3RydWN0IHsN CiAgICB1bnNpZ25lZCBvbmUgOiAxOw0KICAgIHVuc2lnbmVkIHR3byA6IDE7 DQogICAgdW5zaWduZWQgdGhyZWUgOiAxOw0KICAgIHVuc2lnbmVkIGZvdXIg OiAxOw0KICAgIHVuc2lnbmVkIGZpdmUgOiAxOw0KICAgIHVuc2lnbmVkIHNp eCA6IDE7DQogICAgdW5zaWduZWQgc2V2ZW4gOiAxOw0KICAgIHVuc2lnbmVk IGVpZ2h0IDogMTsNCn07DQoNCnVpbnQ4X3QNCnRhZ19vZiAodm9pZCAqIHgp IHsgcmV0dXJuICgodWludHB0cl90KXgpID4+IDU2OyB9DQoNCi8qDQogICBU ZXN0cyBvZiBuZXN0ZWQgZnVudGlvbnMgYXJlOg0KICAgIDApIEFjY2Vzc2lu ZyBjbG9zZWQgb3ZlciB2YXJpYWJsZXMgd29ya3MuDQogICAgMSkgQWNjZXNz ZXMgb3V0c2lkZSBvZiB2YXJpYWJsZXMgaXMgY2F1Z2h0Lg0KICAgIDIpIEFj Y2Vzc2luZyB2YXJpYWJsZSBvdXQgb2Ygc2NvcGUgaXMgY2F1Z2h0Lg0KICov DQppbnQgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkNCmludGVybWVkaWF0 ZSAodm9pZCAoKmYpIChpbnQsIHVpbnQ4X3QpLA0KCSAgICAgIHVpbnQ4X3Qg bnVtKQ0Kew0KICBpZiAobnVtID09IDEpDQogICAgZiAoMjAsIDEwMCk7DQog IGVsc2UNCiAgICBmICgzLCAxMDApOw0KICAvKiBKdXN0IHJldHVybiBzb21l dGhpbmcgLi4uICovDQogIHJldHVybiBudW0gJSAzOw0KfQ0KDQppbnQqIF9f YXR0cmlidXRlX18gKChub2lubGluZSkpDQpuZXN0ZWRfZnVuY3Rpb24gKHVp bnQ4X3QgbnVtKQ0Kew0KICBpbnQgYmlnX2FycmF5WzE2XTsNCiAgaW50IG90 aGVyX2FycmF5WzE2XTsNCiAgdm9pZCBzdG9yZSAoaW50IGluZGV4LCB1aW50 OF90IHZhbHVlKQ0KICAgIHsgYmlnX2FycmF5W2luZGV4XSA9IHZhbHVlOyB9 DQogIHJldHVybiAmb3RoZXJfYXJyYXlbaW50ZXJtZWRpYXRlIChzdG9yZSwg bnVtKV07DQp9DQoNCmludCBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKQ0K dGVzdF9uZXN0ZWQgKHVpbnQ4X3QgY2hlY2tfbW9kZSkNCnsNCiAgYXNzZXJ0 IChjaGVja19tb2RlIDwgMyk7DQogIGludCAqcmV0dmFsID0gbmVzdGVkX2Z1 bmN0aW9uIChjaGVja19tb2RlKTsNCiAgaWYgKGNoZWNrX21vZGUgPT0gMCkN CiAgICByZXR1cm4gMDsNCiAgZWxzZSBpZiAoY2hlY2tfbW9kZSA9PSAyKQ0K ICAgICpyZXR2YWwgPSAxMDA7DQoNCiAgLyogRm9yIGNoZWNrX21vZGUgYW55 dGhpbmcgb3RoZXIgdGhhbiAxIHdlIHNob3VsZCBoYXZlIGNhdWdodCBhbiBl cnJvci4gICovDQogIHJldHVybiAxOw0KfQ0KDQojaW5jbHVkZSA8c2V0am1w Lmg+DQojaW5jbHVkZSA8c3RkaW8uaD4NCg0KLyoNCiAgIFRlc3RpbmcgbG9u Z2ptcC9zZXRqbXAgc2hvdWxkIHRlc3QuDQoNCiAgIDApIE5vdGhpbmcgc3Bl Y2lhbCBoYXBwZW5zIHdpdGggdGhlIGptcF9idWYuDQogICAxKSBBY2Nlc3Nl cyB0byBzY29wZXMgam1wJ2Qgb3ZlciBhcmUgY2F1Z2h0Lg0KICovDQppbnQg X19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkNCnVzZXNfbG9uZ2ptcCAoaW50 ICoqb3RoZXJfYXJyYXksIGludCBudW0sIGptcF9idWYgZW52KQ0Kew0KICBp bnQgaW50ZXJuYWxfYXJyYXlbMTAwXSA9IHswfTsNCiAgKm90aGVyX2FycmF5 ID0gJmludGVybmFsX2FycmF5WzBdOw0KICBpZiAobnVtICUgMikNCiAgICBs b25nam1wIChlbnYsIG51bSk7DQogIGVsc2UNCiAgICByZXR1cm4gbnVtICUg ODsNCn0NCg0KaW50IF9fYXR0cmlidXRlX18gKChub2lubGluZSkpDQp1c2Vz X3NldGptcCAoaW50IG51bSkNCnsNCiAgaW50IGJpZ19hcnJheVsxMDBdOw0K ICBpbnQgKm90aGVyX2FycmF5ID0gTlVMTDsNCiAgc2lnam1wX2J1ZiBjdXJf ZW52Ow0KICBpbnQgdGVtcCA9IDA7DQogIGlmICgodGVtcCA9IHNpZ3NldGpt cCAoY3VyX2VudiwgMSkpICE9IDApDQogICAgew0KICAgICAgaWYgKG90aGVy X2FycmF5ICE9IE5VTEwpDQoJcHJpbnRmICgiVmFsdWUgcG9pbnRlZCB0byBp biBvdGhlcl9hcnJheVswXTogJWRcbiIsDQoJCW90aGVyX2FycmF5WzBdKTsN CiAgICAgIGVsc2UNCglwdXRzICgib3RoZXJfYXJyYXkgd2FzIG5vdCBpbml0 aWFsaXNlZCEiKTsNCg0KICAgICAgcHJpbnRmICgiWW91IGdhdmUgJWQgYXJn dW1lbnRzLlxuIiwgdGVtcCk7DQogICAgICByZXR1cm4gMTA7DQogICAgfQ0K ICBlbHNlDQogICAgew0KICAgICAgcmV0dXJuIHVzZXNfbG9uZ2ptcCAoJm90 aGVyX2FycmF5LCBudW0sIGN1cl9lbnYpOw0KICAgIH0NCn0NCg0KaW50IF9f YXR0cmlidXRlX18gKChub2lubGluZSkpDQp0ZXN0X2xvbmdqbXAgKHVpbnQ4 X3QgY2hlY2tfbW9kZSkNCnsNCiAgYXNzZXJ0IChjaGVja19tb2RlIDwgMik7 DQogIGlmIChjaGVja19tb2RlKQ0KICAgIHsNCiAgICAgIHVzZXNfc2V0am1w ICgxKTsNCiAgICAgIHJldHVybiAxOw0KICAgIH0NCiAgZWxzZQ0KICAgIG5l c3RlZF9mdW5jdGlvbiAoMCk7DQogIHJldHVybiAwOw0KfQ0KDQovKiBCYXNp YyB0ZXN0cyBmb3Igc3RhY2sgdGFnZ2luZy4NCg0KICAgMCkgQWNjZXNzZXMg b3V0c2lkZSBvZiBhIHZhcmlhYmxlIGNyYXNoLg0KICAgMSkgVmFsaWQgYWNj ZXNzZXMgd29yay4NCiovDQppbnQgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5l KSkNCmFjY2Vzc2luZ19wb2ludGVycyAoaW50ICpsZWZ0LCBpbnQgKnJpZ2h0 KQ0Kew0KICBpbnQgeCA9IHJpZ2h0WzJdOw0KICBsZWZ0WzNdID0gcmlnaHRb MV07DQogIHJldHVybiByaWdodFsxXSArIGxlZnRbMl07DQp9DQoNCmludCBf X2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKQ0KdXNpbmdfc3RhY2sgKGludCBu dW0pDQp7DQogIGludCBiaWdfYXJyYXlbMTBdOw0KICBpbnQgb3RoZXJfYXJy YXlbMjBdOw0KICBhY2Nlc3NpbmdfcG9pbnRlcnMob3RoZXJfYXJyYXksIGJp Z19hcnJheSk7DQogIHJldHVybiBiaWdfYXJyYXlbbnVtXTsNCn0NCg0KaW50 IF9fYXR0cmlidXRlX18gKChub2lubGluZSkpDQp0ZXN0X2Jhc2ljX3N0YWNr ICh1aW50OF90IGNoZWNrX21vZGUpDQp7DQogIGFzc2VydCAoY2hlY2tfbW9k ZSA8IDIpOw0KICBpZiAoY2hlY2tfbW9kZSkNCiAgICB7DQogICAgICB1c2lu Z19zdGFjayAoNSk7DQogICAgICByZXR1cm4gMDsNCiAgICB9DQogIGVsc2UN CiAgICB1c2luZ19zdGFjayAoMTcpOw0KICByZXR1cm4gMTsNCn0NCg0KDQov Kg0KICAgVGVzdHMgZm9yIGFsbG9jYSBhcmU6DQoNCiAgIDApIGFsbG9jYSBp cyBnaXZlbiBhIGRpZmZlcmVudCB0YWcgdG8gb3RoZXIgdmFyaWFibGVzLg0K ICAgMSkgZW50aXJlIGFsbG9jYSBhcnJheSBpcyBhY2Nlc3NpYmxlIHdpdGgg cG9pbnRlciByZXR1cm5lZC4NCiAgIDIpIE91dHNpZGUgb2YgYWxsb2NhIGFy cmF5IGlzIG5vdCBhY2Nlc3NpYmxlIChvbmNlIGNyb3NzIDE2IGJ5dGUgYWxp Z25tZW50KS4NCiAqLw0KDQojaW5jbHVkZSA8YWxsb2NhLmg+DQppbnQgX19h dHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkNCmNoZWNrX2FsbG9jYSAoaW50IG51 bSkNCnsNCiAgaW50ICphbGxvY2RfYXJyYXkgPSBhbGxvY2EgKG51bSAqIHNp emVvZihpbnQpKTsNCiAgaW50IG90aGVyX2FycmF5WzEwXTsNCiAgaWYgKG51 bSAlIDIpDQogICAgew0KICAgICAgcmV0dXJuIGFsbG9jZF9hcnJheVtudW0g KyAyXTsNCiAgICB9DQogIHJldHVybiBvdGhlcl9hcnJheVsxMl07DQp9DQoN CmludCBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKQ0KYWxsb2NhX2RpZmZl cmVudF90YWcgKGludCBudW0pDQp7DQogIHN0cnVjdCB0d29fdmFsdWVzIHRt cF9vYmplY3QgPSB7DQogICAgICAubGVmdCA9IDEwMCwNCiAgICAgIC5yaWdo dCA9IG51bSwNCiAgfTsNCiAgaW50ICpiaWdfYXJyYXkgPSBhbGxvY2EgKG51 bSAqIHNpemVvZiAoaW50KSk7DQogIGludCBvdGhlcl9hcnJheVsxMDBdOw0K ICANCiAgdWludDhfdCBmaXJzdF90YWcgPSB0YWdfb2YgKCZ0bXBfb2JqZWN0 KTsNCiAgdWludDhfdCBzZWNvbmRfdGFnID0gdGFnX29mIChiaWdfYXJyYXkp Ow0KICB1aW50OF90IG90aGVyX3RhZyA9IHRhZ19vZiAob3RoZXJfYXJyYXkp Ow0KICBhc3NlcnQgKGZpcnN0X3RhZyAhPSBzZWNvbmRfdGFnKTsNCiAgYXNz ZXJ0IChzZWNvbmRfdGFnICE9IG90aGVyX3RhZyk7DQogIGFzc2VydCAoZmly c3RfdGFnICE9IG90aGVyX3RhZyk7DQogIHJldHVybiAwOw0KfQ0KDQppbnQg X19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkNCnVzaW5nX2FsbG9jYSAoaW50 IG51bSkNCnsNCiAgaW50IHJldHZhbCA9IDA7DQogIGludCAqYmlnX2FycmF5 ID0gYWxsb2NhIChudW0gKiBzaXplb2YgKGludCkpOw0KICBmb3IgKGludCBp ID0gMDsgaSA8IG51bTsgKytpKSB7DQogICAgICByZXR2YWwgKz0gYmlnX2Fy cmF5W2ldOw0KICB9DQogIHJldHVybiByZXR2YWw7DQp9DQoNCmludCBfX2F0 dHJpYnV0ZV9fICgobm9pbmxpbmUpKQ0KdGVzdF9hbGxvY2EgKHVpbnQ4X3Qg Y2hlY2tfbW9kZSkNCnsNCiAgYXNzZXJ0IChjaGVja19tb2RlIDwgMyk7DQog IGlmIChjaGVja19tb2RlID09IDEpDQogICAgdXNpbmdfYWxsb2NhICgxNik7 DQogIGVsc2UgaWYgKGNoZWNrX21vZGUgPT0gMCkNCiAgICBhbGxvY2FfZGlm ZmVyZW50X3RhZyAoY2hlY2tfbW9kZSk7DQogIGVsc2UNCiAgICB7DQogICAg ICBjaGVja19hbGxvY2EgKDMpOw0KICAgICAgcmV0dXJuIDE7DQogICAgfQ0K ICByZXR1cm4gMDsNCn0NCg0KLyoNCiAgIFRlc3RzIGZvciB2YXJpYWJsZSBh cnJheXMgYXJlOg0KDQogICBTRUUgQUJPVkUgUkVRVUlSRU1FTlRTIChhbGxv Y2EpLg0KICovDQojaW5jbHVkZSA8YWxsb2NhLmg+DQppbnQgX19hdHRyaWJ1 dGVfXyAoKG5vaW5saW5lKSkNCmNoZWNrX3ZhcmFycmF5IChpbnQgbnVtKQ0K ew0KICBpbnQgdmFyX2FycmF5W251bV07DQogIGludCBvdGhlcl9hcnJheVsx MF07DQogIGlmIChudW0gJSAyKQ0KICAgIHsNCiAgICAgIHJldHVybiB2YXJf YXJyYXlbbnVtICsgMl07DQogICAgfQ0KICByZXR1cm4gb3RoZXJfYXJyYXlb MTJdOw0KfQ0KDQppbnQgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkNCnZh cmFycmF5X2RpZmZlcmVudF90YWcgKGludCBudW0pDQp7DQogIHN0cnVjdCB0 d29fdmFsdWVzIHRtcF9vYmplY3QgPSB7DQogICAgICAubGVmdCA9IDEwMCwN CiAgICAgIC5yaWdodCA9IG51bSwNCiAgfTsNCiAgaW50IGJpZ19hcnJheVtu dW1dOw0KICBpbnQgb3RoZXJfYXJyYXlbMTAwXTsNCiAgDQogIHVpbnQ4X3Qg Zmlyc3RfdGFnID0gdGFnX29mICgmdG1wX29iamVjdCk7DQogIHVpbnQ4X3Qg c2Vjb25kX3RhZyA9IHRhZ19vZiAoYmlnX2FycmF5KTsNCiAgdWludDhfdCBv dGhlcl90YWcgPSB0YWdfb2YgKG90aGVyX2FycmF5KTsNCiAgYXNzZXJ0IChm aXJzdF90YWcgIT0gc2Vjb25kX3RhZyk7DQogIGFzc2VydCAoc2Vjb25kX3Rh ZyAhPSBvdGhlcl90YWcpOw0KICBhc3NlcnQgKGZpcnN0X3RhZyAhPSBvdGhl cl90YWcpOw0KICByZXR1cm4gMDsNCn0NCg0KaW50IF9fYXR0cmlidXRlX18g KChub2lubGluZSkpDQp1c2luZ192YXJhcnJheSAoaW50IG51bSkNCnsNCiAg aW50IHJldHZhbCA9IDA7DQogIGludCBiaWdfYXJyYXlbbnVtXTsNCiAgZm9y IChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkgew0KICAgICAgcmV0dmFsICs9 IGJpZ19hcnJheVtpXTsNCiAgfQ0KICByZXR1cm4gcmV0dmFsOw0KfQ0KDQpp bnQgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkNCnRlc3RfdmFyYXJyYXkg KHVpbnQ4X3QgY2hlY2tfbW9kZSkNCnsNCiAgYXNzZXJ0IChjaGVja19tb2Rl IDwgMyk7DQogIGlmIChjaGVja19tb2RlID09IDEpDQogICAgdXNpbmdfdmFy YXJyYXkgKDE2KTsNCiAgZWxzZSBpZiAoY2hlY2tfbW9kZSA9PSAwKQ0KICAg IHZhcmFycmF5X2RpZmZlcmVudF90YWcgKGNoZWNrX21vZGUpOw0KICBlbHNl DQogICAgew0KICAgICAgY2hlY2tfdmFyYXJyYXkgKDMpOw0KICAgICAgcmV0 dXJuIDE7DQogICAgfQ0KICByZXR1cm4gMDsNCn0NCg0KLyoNCiAgIFRlc3Rz IGZvciBSVk8NCg0KICAgMCkgVGhlIHZhbHVlIGlzIGFjY2Vzc2libGUgaW4g dGhlIGdpdmVuIGZ1bmN0aW9uLg0KICAgMSkgUlZPIGRvZXMgaGFwcGVuLg0K ICAgMikgVGhlIHBvaW50ZXIgZm9yIGJvdGggY2FsbGVyIGFuZCBjYWxsZWUg YXJlIHRoZSBzYW1lLg0KICovDQoNCnN0cnVjdCBiaWdfc3RydWN0IF9fYXR0 cmlidXRlX18gKChub2lubGluZSkpDQpyZXR1cm5fb25fc3RhY2soKQ0Kew0K ICBzdHJ1Y3QgYmlnX3N0cnVjdCB4Ow0KICB4LmxlZnQgPSAxMDA7DQogIHgu cmlnaHQgPSAyMDsNCiAgeC5iaWdfYXJyYXlbMTBdID0gMzA7DQogIHJldHVy biB4Ow0KfQ0KDQpzdHJ1Y3QgYmlnX3N0cnVjdCBfX2F0dHJpYnV0ZV9fICgo bm9pbmxpbmUpKQ0KdW5uYW1lZF9yZXR1cm5fb25fc3RhY2soKQ0Kew0KICBy ZXR1cm4gKHN0cnVjdCBiaWdfc3RydWN0KXsgLmxlZnQgPSAxMDAsIC5yaWdo dCA9IDIwLCAuYmlnX2FycmF5ID0gezB9IH07DQp9DQoNCg0KLyogTWlzYyB0 ZXN0cyB0aGF0IEkgYWRkZWQgZWFjaCB0aW1lIEkgbWFkZSBhIG1pc3Rha2Ug aW4gdGhlIGltcGxlbWVudGF0aW9uIGFuZA0KICAgYnJva2Ugc29tZXRoaW5n LiAgKi8NCg0KaW50IF9fYXR0cmlidXRlX18gKChub2lubGluZSkpDQp0d29f aXRlbXNfb25fc3RhY2sgKGludCBudW0pDQp7DQogIGludCBsZWZ0X2FycmF5 WzEwMF07DQogIGludCByaWdodF9hcnJheVsyMDBdOw0KICByZXR1cm4gbGVm dF9hcnJheVtudW1dICsgcmlnaHRfYXJyYXlbbnVtXTsNCn0NCg0KaW50IF9f YXR0cmlidXRlX18gKChub2lubGluZSkpDQpzdGFja19vYmplY3RfdXNlKGlu dCBkaXJlY3Rpb24pDQp7DQogIHN0cnVjdCB0d29fdmFsdWVzIHN0YWNrX29i amVjdCA9IHsNCiAgICAgIC5sZWZ0ID0gMSwNCiAgICAgIC5yaWdodCA9IDIs DQogIH07DQoNCiAgaW50ICpwdHIgPSAoaW50ICopMDsNCiAgaWYgKGRpcmVj dGlvbikgew0KICAgICAgcHRyID0gJnN0YWNrX29iamVjdC5sZWZ0Ow0KICB9 IGVsc2Ugew0KICAgICAgcHRyID0gJnN0YWNrX29iamVjdC5yaWdodDsNCiAg fQ0KDQogICpwdHIgPSBkaXJlY3Rpb247DQogIGlmIChkaXJlY3Rpb24gJiAy KSB7DQogICAgICByZXR1cm4gc3RhY2tfb2JqZWN0LnJpZ2h0Ow0KICB9IGVs c2Ugew0KICAgICAgcmV0dXJuIHN0YWNrX29iamVjdC5sZWZ0Ow0KICB9DQp9 DQoNCnN0cnVjdCB0d29fdmFsdWVzIF9fYXR0cmlidXRlX18gKChub2lubGlu ZSkpDQpiYXNpY19zdGFja19vYmplY3QgKGludCBkaXJlY3Rpb24pDQp7DQog IHN0cnVjdCB0d29fdmFsdWVzIHggPSB7DQogICAgICAubGVmdCA9IDEsDQog ICAgICAucmlnaHQgPSAyLA0KICB9Ow0KICB4LmxlZnQgKz0gZGlyZWN0aW9u Ow0KICByZXR1cm4geDsNCn0NCg0KaW50IF9fYXR0cmlidXRlX18gKChub2lu bGluZSkpDQpzZXRfdmFsdWVfdG9fcmFuZG9tKGludCAqdmFsdWVfcCkNCnsN CiAgaW50IGJpZ19hcnJheVsxMDBdOw0KICAqdmFsdWVfcCA9IGJpZ19hcnJh eVsxMF07DQogIHJldHVybiAxOw0KfQ0KDQoNCi8qIEVuc3VyZSBteSBpbnN0 cnVtZW50YXRpb24gZG9lc24ndCBjcmFzaCBvbiB1bmFsaWduZWQgYWNjZXNz IChhbiBvbGRlcg0KICAgdmVyc2lvbiB3aXRoIGEgY29tcGxldGVseSBkaWZm ZXJlbnQgYXBwcm9hY2ggZGlkbid0IGhhbmRsZSB0aGlzIHdlbGwpLiAgKi8N Cg0KaW50IF9fYXR0cmlidXRlX18gKChub2lubGluZSkpDQpoYW5kbGVfdW5h bGlnbmVkX2FjY2VzcyAoc3RydWN0IGJpdG1hcHBlZF9zdHJ1Y3QgKmZvbykN CnsNCiAgaWYgKGZvby0+dGhyZWUpDQogICAgcmV0dXJuIGZvby0+Zm91cjsN Cg0KICBmb28tPmZpdmUgPSAxOw0KICByZXR1cm4gMTsNCn0NCg0KLyogSGFu ZGxpbmcgbGFyZ2UgYWxpZ25lZCB2YXJpYWJsZXMuDQogICBMYXJnZSBhbGln bmVkIHZhcmlhYmxlcyB0YWtlIGEgZGlmZmVyZW50IGNvZGUtcGF0aCB0aHJv dWdoIGV4cGFuZF9zdGFja192YXJzDQogICBpbiBjZmdleHBhbmQuYy4gIFRo aXMgdGVzdGNhc2UgaXMganVzdCB0byBleGVyY2lzZSB0aGF0IGNvZGUtcGF0 aC4NCg0KICAgVGhlIGFsdGVybmF0ZSBjb2RlLXBhdGggcHJvZHVjZXMgYSBz ZWNvbmQgYmFzZS1wb2ludGVyIHRocm91Z2ggc29tZQ0KICAgaW5zdHJ1Y3Rp b25zIGVtaXR0ZWQgaW4gdGhlIHByb2xvZ3VlLg0KICAgDQogICBUZXN0IGNh c2VzIGFyZToNCiAgIDApIFZhbGlkIGFjY2VzcyB3b3JrcyB3aXRob3V0IGNv bXBsYWludC4NCiAgIDEpIEludmFsaWQgYWNjZXNzIGlzIGNhdWdodC4gICov DQppbnQgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkNCmhhbmRsZV9sYXJn ZV9hbGlnbm1lbnQgKGludCBudW0pDQp7DQogIGludCBvdGhlcl9hcnJheVsx MF07DQogIGludCBiaWdfYXJyYXlbMTAwXSBfX2F0dHJpYnV0ZV9fICgoYWxp Z25lZCAoMzIpKSk7DQogIHJldHVybiBiaWdfYXJyYXlbbnVtXSArIG90aGVy X2FycmF5W251bV07DQp9DQoNCmludCBfX2F0dHJpYnV0ZV9fICgobm9pbmxp bmUpKQ0KdGVzdF9sYXJnZV9hbGlnbm1lbnQgKHVpbnQ4X3QgY2hlY2tfbW9k ZSkNCnsNCiAgYXNzZXJ0IChjaGVja19tb2RlIDwgMik7DQogIGlmIChjaGVj a19tb2RlKQ0KICAgIHsNCiAgICAgIGhhbmRsZV9sYXJnZV9hbGlnbm1lbnQg KDExKTsNCiAgICAgIHJldHVybiAxOw0KICAgIH0NCiAgZWxzZQ0KICAgIGhh bmRsZV9sYXJnZV9hbGlnbm1lbnQgKDEpOw0KICByZXR1cm4gMDsNCn0NCg0K Lyoge3t7IFRoaXMgaXMgYSByZWR1Y2VkIHRlc3RjYXNlIGZyb20gYW4gSUNF IGEgd2hpbGUgYWdvLg0KICAgQXQgdGhlIHRpbWUgSSB3YXMgbW9kaWZ5aW5n IHRoZSBHSU1QTEUgYW5kIG1hZGUgYW4gYXNzdW1wdGlvbiB0aGF0IGFsbA0K ICAgc3RhdGVtZW50cyB1c2VkIGFsbCB0aGVpciBvcGVyYW5kcy4NCiAgIFRo aXMgdGVzdCBpcyByZWR1bmRhbnQgbm93LCBidXQgdGhlcmUncyBubyBoYXJt IGluIHN0aWxsIGNvbXBpbGluZyBpdC4gKi8NCiNpbmNsdWRlIDxzdHJpbmcu aD4NCiNpbmNsdWRlIDxzdGRpbnQuaD4NCg0KY29uc3Qgc2hvcnQgRFBEMkJJ TlsxMDI0XSA9IHswfTsNCmNvbnN0IGNoYXIgIEJJTjJDSEFSWzQwMDFdID0g ezB9Ow0KDQpjaGFyICogZGVjaW1hbDY0VG9TdHJpbmcoY2hhciAqc3RyaW5n KQ0Kew0KICBjaGFyICpjOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBv dXRwdXQgcG9pbnRlciBpbiBzdHJpbmcgKi8NCiAgY29uc3QgdWludDhfdCAq dTsgICAgICAgICAgICAgICAgLyogd29yayAqLw0KICBpbnQzMl90ICBkcGQ7 ICAgICAgICAgICAgICAgICAgICAvKiAuLiAqLw0KDQogIHU9KGNvbnN0IHVp bnQ4X3QgKikmQklOMkNIQVJbRFBEMkJJTltkcGRdKjRdOyANCiAgaWYgKHN0 cmluZ1szXSkge21lbWNweShjLCB1KzEsIDQpOyBjKz0zO30NCiAgZWxzZSBp ZiAoc3RyaW5nWzRdKSAge21lbWNweShjLCB1KzQtKnUsIDQpOyBjKz1zdHJp bmdbNF07fQ0KICByZXR1cm4gc3RyaW5nOw0KfQ0KDQppbnQgX19hdHRyaWJ1 dGVfXyAoKG5vaW5saW5lKSkNCnZhcmlhYmxlc19zYW1lX3BhcnRpdGlvbiAo KQ0Kew0KICBpbnQgcmV0ID0gMDsNCiAgICB7DQogICAgICBzdHJ1Y3QgYml0 bWFwcGVkX3N0cnVjdCBvcmlnOw0KICAgICAgcmV0ID0gaGFuZGxlX3VuYWxp Z25lZF9hY2Nlc3MgKCZvcmlnKTsNCiAgICB9DQogICAgew0KICAgICAgc3Ry dWN0IGJpdG1hcHBlZF9zdHJ1Y3Qgb3RoZXI7DQogICAgICByZXQgKz0gaGFu ZGxlX3VuYWxpZ25lZF9hY2Nlc3MgKCZvdGhlcik7DQogICAgfQ0KICByZXR1 cm4gcmV0Ow0KfQ0KDQovKiB9fX0gKi8NCg0KLyoge3t7IFVucmVjb2duaXNl YWJsZSBpbnNuIHByb2JsZW0uDQogICBUaGlzIGNvZGUgaXMgcmVkdWNlZCBm cm9tIHNvbWV0aGluZyBpbiB0aGUgYm9vdHN0cmFwIHRoYXQgdHJpZ2dlcmVk IGENCiAgIHByb2JsZW0gd2hlcmUgbXkgYmFja2VuZCBwYXR0ZXJucyBkaWRu J3QgaGFuZGxlIHZlcnkgbGFyZ2Ugb2Zmc2V0cy4gICovDQojaWZuZGVmIEFT SVpFDQojIGRlZmluZSBBU0laRSAweDEwMDAwMDAwMDAwVUwNCiNlbmRpZg0K DQojaW5jbHVkZSA8bGltaXRzLmg+DQoNCiNpZiBMT05HX01BWCA8IDggKiBB U0laRQ0KIyB1bmRlZiBBU0laRQ0KIyBkZWZpbmUgQVNJWkUgNDA5Ng0KI2Vu ZGlmDQoNCmV4dGVybiB2b2lkIGFib3J0ICh2b2lkKTsNCg0KaW50IF9fYXR0 cmlidXRlX18oKG5vaW5saW5lKSkNCmZvbyAoY29uc3QgY2hhciAqcykNCnsN CiAgaWYgKCFzKQ0KICAgIHJldHVybiAxOw0KICBpZiAoc1swXSAhPSAnYScp DQogICAgYWJvcnQgKCk7DQogIHMgKz0gQVNJWkUgLSAxOw0KICBpZiAoc1sw XSAhPSAnYicpDQogICAgYWJvcnQgKCk7DQogIHJldHVybiAwOw0KfQ0KDQpp bnQgKCpmbikgKGNvbnN0IGNoYXIgKikgPSBmb287DQoNCmludCBfX2F0dHJp YnV0ZV9fKChub2lubGluZSkpDQpiYXIgKHZvaWQpDQp7DQogIGNoYXIgc1tB U0laRV07DQogIHNbMF0gPSAnYSc7DQogIHNbQVNJWkUgLSAxXSA9ICdiJzsN CiAgZm9vIChzKTsNCiAgZm9vIChzKTsNCiAgcmV0dXJuIDA7DQp9DQoNCmlu dCBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpDQpiYXogKGxvbmcgaSkNCnsN CiAgaWYgKGkpDQogICAgcmV0dXJuIGZuICgwKTsNCiAgZWxzZQ0KICAgIHsN CiAgICAgIGNoYXIgc1tBU0laRV07DQogICAgICBzWzBdID0gJ2EnOw0KICAg ICAgc1tBU0laRSAtIDFdID0gJ2InOw0KICAgICAgZm9vIChzKTsNCiAgICAg IGZvbyAocyk7DQogICAgICByZXR1cm4gZm4gKDApOw0KICAgIH0NCn0NCi8q IH19fSAqLw0KDQovKiB7e3sgTm9uLWNvbnN0YW50IHNpemVzLg0KICAgQ29k ZSBkZXNpZ25lZCB0byBzdG9yZSBTVkUgcmVnaXN0ZXJzIG9uIHRoZSBzdGFj ay4NCiAgIFRoaXMgaXMgbmVlZGVkIHRvIGV4ZXJjaXNlIHRoZSBwb2x5X2lu dDY0IGhhbmRsaW5nIGZvciBIV0FTQU4gYW5kIE1URQ0KICAgaW5zdHJ1bWVu dGF0aW9uLiAqLw0KaW50IHU7DQoNCnZvaWQNCmZvb19zdmUgKGludCAqcCkN CnsNCiAgaW50IGk7DQogICNwcmFnbWEgb21wIGZvciBzaW1kIGxhc3Rwcml2 YXRlKHUpIHNjaGVkdWxlIChzdGF0aWMsIDMyKQ0KICBmb3IgKGkgPSAwOyBp IDwgMTAyNDsgaSsrKQ0KICAgIHUgPSBwW2ldOw0KfQ0KDQp2b2lkDQpiYXJf c3ZlIChpbnQgKnApDQp7DQogIGludCBpOw0KICAjcHJhZ21hIG9tcCB0YXNr bG9vcCBzaW1kIGxhc3Rwcml2YXRlKHUpDQogIGZvciAoaSA9IDA7IGkgPCAx MDI0OyBpKyspDQogICAgdSA9IHBbaV07DQp9DQovKiB9fX0gKi8NCg0KLyog QW4gb2xkIFJUTCB0ZXN0Y2FzZS4gIFRoaXMgd2FzIG9yaWdpbmFsbHkgaW50 cm9kdWNlZCBzaW5jZSBpdCB3YXMgcHJvZHVjZWQNCiAgIHNvbWV3aGVyZSBp biBib290c3RyYXAgYW5kIHRoZSBjb21waWxlciBJQ0UnZCBvbiBpdC4NCiAg IEl0J3Mgb25seSByZWxldmFudCBmb3IgTVRFLCBzaW5jZSBmb3IgSFdBU0FO IHRoZSBBRERUQUcgcGF0dGVybiBpcyBjb252ZXJ0ZWQNCiAgIGludG8gYSBw bGFpbiBBREQgYXQgZXhwYW5kIHRpbWUuDQogICBNb3Jlb3ZlciwgdGhpcyBw YXR0ZXJuIG9ubHkgd29ya3MgZm9yIE1URSwgc2luY2UgdGhlcmUgaXMgbm8g ZGVmaW5lX2luc24NCiAgIG1hdGNoaW5nIEFERFRBRyBwYXR0ZXJucyB3aGVu IE1URSBpcyBub3QgYXZhaWxhYmxlLiAgKi8NCi8vIC8vIEFwcGFyZW50bHkg Y2xhbmcgZGVmaW5lcyB0aGUgX19HTlVDX18gbWFjcm8uDQovLyAvLyBUaGF0 J3MgYSBsaXR0bGUgYW5ub3lpbmcsIGJ1dCB0aGUgYmVsb3cgd29ya3MgZm9y IHdoYXQgSSBuZWVkLg0KLy8gI2lmbmRlZiBfX2NsYW5nX18NCi8vIGludCBf X1JUTCAoc3RhcnR3aXRoICgiZmluYWwiKSkNCi8vIGJvb3RzdHJhcF9wcm9i bGVtICgpDQovLyB7DQovLyAgIChmdW5jdGlvbiAiYm9vdHN0cmFwX3Byb2Js ZW0iDQovLyAgICAoaW5zbi1jaGFpbg0KLy8gICAgIChibG9jayAyDQovLyAg ICAgIChlZGdlLWZyb20gZW50cnkgKGZsYWdzICJGQUxMVEhSVSIpKQ0KLy8g ICAgICAoY25vdGUgMyBbYmIgMl0gTk9URV9JTlNOX0JBU0lDX0JMT0NLKQ0K Ly8gICAgICAoY2luc24gOTAgKHNldCAocmVnOkRJIHgwKQ0KLy8gCQkoYWRk dGFnOkRJIChyZWc6REkgeDApDQovLyAJCSAoY29uc3RfaW50IC0xNikNCi8v IAkJIChjb25zdF9pbnQgMSkpKSkNCi8vICAgICAgKGVkZ2UtdG8gZXhpdCAo ZmxhZ3MgIkZBTExUSFJVIikpDQovLyAgICAgKSA7OyBibG9jayAyDQovLyAg ICApIDs7IGluc24tY2hhaW4NCi8vICAgKSA7OyBmdW5jdGlvbiAiYm9vdHN0 cmFwX3Byb2JsZW0iDQovLyB9DQovLyAjZW5kaWYNCg0KDQppbnQgX19hdHRy aWJ1dGVfXygobm9pbmxpbmUpKQ0KdmVyeV9sYXJnZV9vZmZzZXQgKGludCAq cCkNCnsNCiAgY2hhciBpbml0X2FycmF5Wyh1aW50NjRfdCkweGZlZmVmZWZd Ow0KICBjaGFyIG90aGVyX2FycmF5Wyh1aW50NjRfdCkweGZlZmVmZWZdOw0K ICByZXR1cm4gKGludClpbml0X2FycmF5W3BbMV1dICsgKGludClvdGhlcl9h cnJheVtwWzBdXTsNCn0NCg0Kdm9pZCBfX2F0dHJpYnV0ZV9fKChub2lubGlu ZSkpDQpqdXN0X2Fib3J0KCkgeyBhYm9ydCgpOyB9DQoNCi8qIFRoaXMgdGVz dCBpcyBvbmx5IGFyb3VuZCBmb3Igb2JzZXJ2aW5nIHdoYXQgdGhlIGNvbXBp bGVyIGRvZXMsIG5vdCBmb3INCiAgIGNoZWNraW5nIHRoZSBIV0FTQU4gaW1w bGVtZW50YXRpb24gd29ya3MgcHJvcGVybHkuICBIV0FTQU4gYW5kIE1URSBk bw0KICAgbm90aGluZyBzcGVjaWFsIGZvciB2YXJhcmdzLiAgKi8NCnZvaWQg X19hdHRyaWJ1dGVfXygobm9pbmxpbmUpKQ0KdmFyYXJnc19mdW5jdGlvbiAo c2l6ZV90IG51bWFyZ3MsIC4uLikNCnsNCiAgdmFfbGlzdCBhcmdzOw0KICB2 YV9zdGFydCAoYXJncywgbnVtYXJncyk7DQoNCiAgd2hpbGUgKG51bWFyZ3Mg PiAwKQ0KICAgIHsNCiAgICAgIGNoYXIgKnggPSB2YV9hcmcgKGFyZ3MsIGNo YXIgKik7DQogICAgICBwcmludGYgKCJBZGRyZXNzIG9mIG5leHQgYXJndW1l bnQgaXM6ICVwXG4iLCAmeCk7DQogICAgICBudW1hcmdzIC09IDE7DQogICAg fQ0KICB2YV9lbmQgKGFyZ3MpOw0KfQ0KDQovKiBGdW5jdGlvbnMgdG8gb2Jz ZXJ2ZSB0aGF0IEhXQVNBTiBpbnN0cnVtZW50cyBtZW1vcnkgYnVpbHRpbnMg aW4gdGhlIGV4cGVjdGVkDQogICBtYW5uZXIuICAqLw0Kdm9pZCAqIF9fYXR0 cmlidXRlX18oKG5vaW5saW5lKSkNCm1lbXNldF9idWlsdGluICh2b2lkICpk ZXN0LCBpbnQgdmFsdWUsIHNpemVfdCBsZW4pDQp7DQogIHJldHVybiBfX2J1 aWx0aW5fbWVtc2V0IChkZXN0LCB2YWx1ZSwgbGVuKTsNCn0NCg0KLyogSFdB U0FOIGF2b2lkcyBzdHJsZW4gYmVjYXVzZSBpdCBkb2Vzbid0IGtub3cgdGhl IHNpemUgb2YgdGhlIG1lbW9yeSBhY2Nlc3MNCiAgIHVudGlsICphZnRlciog dGhlIGZ1bmN0aW9uIGNhbGwuICAqLw0Kc2l6ZV90IF9fYXR0cmlidXRlX18g KChub2lubGluZSkpDQpzdHJsZW5fYnVpbHRpbiAoY2hhciAqZWxlbWVudCkN CnsNCiAgcmV0dXJuIF9fYnVpbHRpbl9zdHJsZW4gKGVsZW1lbnQpOw0KfQ0K DQovKiBIZXJlIHRvIGNoZWNrIHRoYXQgdGhlIEFTQU5fUE9JU09OIHN0dWZm IHdvcmtzIGp1c3QgZmluZS4NCiAgIFRIaXMgbWVjaGFuaXNtIGlzbid0IHZl cnkgb2Z0ZW4gdXNlZCwgYnV0IEkgc2hvdWxkIGF0IGxlYXN0IGdvIHRocm91 Z2ggdGhlDQogICBjb2RlLXBhdGggb25jZSBpbiBteSB0ZXN0ZmlsZS4gICov DQppbnQgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkNCmFjY2Vzc19vdXRz aWRlX29mX3Njb3BlICgpDQp7DQogIGludCAqcHRyID0gMDsNCg0KICB7DQog ICAgaW50IGE7DQogICAgcHRyID0gJmE7DQogICAgKnB0ciA9IDEyMzQ1Ow0K ICB9DQoNCiAgcmV0dXJuICpwdHI7DQp9DQoNCmludA0KbWFpbiAoaW50IGFy Z2MsIGNoYXIgKmFyZ3ZbXSkNCnsNCiAgcHJpbnRmKCJvdXRzaWRlLXNjb3Bl IHJldHVybiB2YWx1ZTogJWRcbiIsIGFjY2Vzc19vdXRzaWRlX29mX3Njb3Bl ICgpKTsNCiAgcHJpbnRmKCJSZXR1cm5lZCB2YWx1ZSBvZiAlZFxuIiwNCgkg dXNlc19zZXRqbXAgKGFyZ2MpKTsNCiAgcHJpbnRmICgiVmFsdWUgaXMgJWRc biIsDQoJICBoYW5kbGVfbGFyZ2VfYWxpZ25tZW50IChhcmdjKSk7DQogIHBy aW50ZiAoIlZhbHVlIGlzICVkXG4iLA0KCSAgY2hlY2tfYWxsb2NhIChhcmdj KSk7DQogIHVzaW5nX2FsbG9jYSAoYXJnYyk7DQoNCiAgaW50IGxlZnRbMTAw XSA9IHswfTsNCiAgbWVtc2V0X2J1aWx0aW4gKGxlZnQsIDEsIDEwMCk7DQoN CiAgY2hhciAqbXlzdHJpbmcgPSAiaGVsbG8gd29ybGQhXG4iOw0KICBwcmlu dGYgKCJMZW5ndGggb2Ygc3RyaW5nIGlzOiAldVxuIiwgc3RybGVuX2J1aWx0 aW4gKG15c3RyaW5nKSk7DQogIHZhcmFyZ3NfZnVuY3Rpb24gKDQsICJoZWxs byB0aGVyZSIsIChjaGFyKTEsDQoJCSAgICAoY2hhcikyKTsNCg0KICBpbnQg cmlnaHRbMTAwXSA9IHswfTsNCiAgYWNjZXNzaW5nX3BvaW50ZXJzIChsZWZ0 LCByaWdodCk7DQogIHVzaW5nX3N0YWNrKGFyZ2MpOw0KDQogIGludCBudW0g PSBhcmdjOw0KICB0d29faXRlbXNfb25fc3RhY2sobnVtKTsNCg0KICBpbnQg ZGlyZWN0aW9uID0gYXJnYzsNCiAgc3RhY2tfb2JqZWN0X3VzZShkaXJlY3Rp b24pOw0KICBpbnQgKm51bV9hZGRyID0gJm51bTsNCiAgc2V0X3ZhbHVlX3Rv X3JhbmRvbShudW1fYWRkcik7DQogIHN0cnVjdCBiaWdfc3RydWN0IHg7DQog IHggPSByZXR1cm5fb25fc3RhY2soKTsNCiAgc3RydWN0IGJpZ19zdHJ1Y3Qg eTsNCiAgeSA9IHVubmFtZWRfcmV0dXJuX29uX3N0YWNrKCk7DQogIHByaW50 ZigiVmFsdWUgaXMgJWQgLi4uICVkXG4iLCB4LmxlZnQsIHkubGVmdCk7DQog IHJldHVybiAwOw0KfQ0KDQovKiB7e3sgU2ltcGx5IGNoZWNraW5nIHRoYXQg SFdBU0FOIGNhdWdodCBmYWlsdXJlcyBiZWhhdmUgc2Vuc2libHkgd2hlbiBy dW4NCiAgIHVuZGVyIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudC4gICov DQovLyAjaW5jbHVkZSA8cHRocmVhZC5oPg0KLy8gI2luY2x1ZGUgPHN0ZGlv Lmg+DQovLyAjaW5jbHVkZSA8c3RyaW5nLmg+DQovLyAjaW5jbHVkZSA8c3Rk YXJnLmg+DQovLyAjaW5jbHVkZSA8c3RkYm9vbC5oPg0KLy8gI2luY2x1ZGUg PHN0ZGludC5oPg0KDQovLyB2b2lkICoNCi8vIGZhaWxpbmdfdGhyZWFkX2Z1 bmN0aW9uICh2b2lkICphcmd1bWVudCkNCi8vIHsNCi8vICAgICB2b2lkICog b3RoZXIgPSAodm9pZCAqKSgodWludDY0X3QpYXJndW1lbnQgJiAweGZmZmZm ZmZmZmZmZmZmVUxMKTsNCi8vICAgICBpbnQgKm51bSA9IGFyZ3VtZW50Ow0K Ly8gICAgIHByaW50ZiAoIihzaG91bGQgc3VjY2VlZCk6IGZpcnN0IG51bWJl ciA9ICVkXG4iLCBudW1bMF0pOw0KLy8gICAgIHByaW50ZiAoIihub3cgc2hv dWxkIGZhaWwpOiIpOw0KLy8gICAgIGZmbHVzaCAoc3Rkb3V0KTsNCg0KLy8g ICAgIGludCAqb3RoZXJudW0gPSBvdGhlcjsNCi8vICAgICBwcmludGYgKCIg c2Vjb25kIG51bWJlciA9ICVkXG4iLCBvdGhlcm51bVswXSk7DQovLyAgICAg cmV0dXJuICh2b2lkICopMTsNCi8vIH0NCg0KLy8gdm9pZCAqDQovLyBmYWls aW5nX2Zyb21fc3RhY2sgKHZvaWQgKiBhcmd1bWVudCkNCi8vIHsNCi8vICAg ICBpbnQgaW50ZXJuYWxfYXJyYXlbMTZdID0gezB9Ow0KLy8gICAgIHByaW50 ZiAoIihub3cgc2hvdWxkIGZhaWwpOiIpOw0KLy8gICAgIGZmbHVzaCAoc3Rk b3V0KTsNCi8vICAgICBwcmludGYgKCIgcHJvYmxlbSBudW1iZXIgaXMgJWRc biIsIGludGVybmFsX2FycmF5WzE3XSk7DQovLyAgICAgcmV0dXJuICh2b2lk ICopMTsNCi8vIH0NCg0KLy8gdm9pZCAqDQovLyBwdGhyZWFkX3N0YWNrX2lz X2NsZWFyZWQgKHZvaWQgKmFyZ3VtZW50KQ0KLy8gew0KLy8gICAgKHZvaWQp YXJndW1lbnQ7DQovLyAgICBpbnQgaW50ZXJuYWxfYXJyYXlbMTZdID0gezB9 Ow0KLy8gICAgcmV0dXJuICh2b2lkKilpbnRlcm5hbF9hcnJheTsNCi8vIH0N Cg0KLy8gdm9pZCAqDQovLyBzdWNjZXNzZnVsX3RocmVhZF9mdW5jdGlvbiAo dm9pZCAqIGFyZ3VtZW50KQ0KLy8gew0KLy8gICAgIGludCAqZGVyZWYgPSAo aW50ICopYXJndW1lbnQ7DQovLyAgICAgcHJpbnRmICgiKHNob3VsZCBiZSBm aW5lKTogc3VtIG9mIGZpcnN0IHR3byBudW1iZXJzIGlzICVkXG4iLA0KLy8g ICAgICAgICAgICAgZGVyZWZbMF0gKyBkZXJlZlsxXSk7DQovLyAgICAgcmV0 dXJuICh2b2lkICopMDsNCi8vIH0NCg0KLy8gaW50DQovLyBtYWluIChpbnQg YXJnYywgY2hhciAqKmFyZ3YpDQovLyB7DQovLyAgICAgaW50IGFyZ3VtZW50 WzEwMF0gPSB7MH07DQovLyAgICAgYXJndW1lbnRbMV0gPSAxMDsNCi8vICAg ICB2b2lkICooKnRocmVhZF9mdW5jdGlvbikgKHZvaWQgKikgPSBOVUxMOw0K Ly8gICAgIGJvb2wgYWNjZXNzX3ZhcmlhYmxlID0gZmFsc2U7DQoNCi8vICAg ICBpZiAoYXJnYyA8IDIgfHwgc3RyY21wIChhcmd2WzFdLCAic3VjY2VzcyIp ID09IDApDQovLyAgICAgICB0aHJlYWRfZnVuY3Rpb24gPSBzdWNjZXNzZnVs X3RocmVhZF9mdW5jdGlvbjsNCi8vICAgICBlbHNlIGlmIChzdHJjbXAgKGFy Z3ZbMV0sICJleHRlcm5hbC1mYWlsIikgPT0gMCkNCi8vICAgICAgIHRocmVh ZF9mdW5jdGlvbiA9IGZhaWxpbmdfdGhyZWFkX2Z1bmN0aW9uOw0KLy8gICAg IGVsc2UgaWYgKHN0cmNtcCAoYXJndlsxXSwgImludGVybmFsLWZhaWwiKSA9 PSAwKQ0KLy8gICAgICAgdGhyZWFkX2Z1bmN0aW9uID0gZmFpbGluZ19mcm9t X3N0YWNrOw0KLy8gICAgIGVsc2UNCi8vICAgICAgIHsNCi8vICAgICAgICAg dGhyZWFkX2Z1bmN0aW9uID0gcHRocmVhZF9zdGFja19pc19jbGVhcmVkOw0K Ly8gICAgICAgICBhY2Nlc3NfdmFyaWFibGUgPSB0cnVlOw0KLy8gICAgICAg fQ0KDQovLyAgICAgcHRocmVhZF90IHRocmVhZF9pbmRleDsNCi8vICAgICBw dGhyZWFkX2NyZWF0ZSAoJnRocmVhZF9pbmRleCwgTlVMTCwgdGhyZWFkX2Z1 bmN0aW9uLCAodm9pZCopYXJndW1lbnQpOw0KDQovLyAgICAgdm9pZCAqcmV0 dmFsOw0KLy8gICAgIHB0aHJlYWRfam9pbiAodGhyZWFkX2luZGV4LCAmcmV0 dmFsKTsNCg0KLy8gICAgIGlmIChhY2Nlc3NfdmFyaWFibGUpDQovLyAgICAg ICB7DQovLyAgICAgICAgIHByaW50ZiAoIihzaG91bGQgZmFpbCk6ICIpOw0K Ly8gICAgICAgICBmZmx1c2ggKHN0ZG91dCk7DQovLyAgICAgICAgIHByaW50 ZiAoInZhbHVlIGxlZnQgaW4gc3RhY2sgaXM6ICVkXG4iLCAoKGludCAqKXJl dHZhbClbMF0pOw0KLy8gICAgICAgfQ0KDQovLyAgICAgcmV0dXJuIChpbnQp cmV0dmFsOw0KLy8gfQ0KDQovKiB9fX0gKi8NCg== --_002_1567780582391614817480879484406897649scriptedpatchserie_--