Received: by 2002:a05:6a10:1a4d:0:0:0:0 with SMTP id nk13csp1936219pxb; Wed, 2 Feb 2022 16:26:11 -0800 (PST) X-Google-Smtp-Source: ABdhPJx/TP7/t6lNWmX2IFnldgy86AqOwfSK1L/H1B/Mv3zXhQBT2NmOFWW3XmTxKAx0+q7S8OFv X-Received: by 2002:a17:907:1b16:: with SMTP id mp22mr28016904ejc.537.1643847970548; Wed, 02 Feb 2022 16:26:10 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1643847970; cv=pass; d=google.com; s=arc-20160816; b=z9SmkA3wnCcHHrOsc+1AD5reJqKR6pLhn9HOXbnrEVy9EVa3zguMaYK8zItpCRVeXc 9ocOK55psn5iuhBeYsHRXxdxCWNqkuTZGCBl9WjdyD9wc1KU3exCOJnEu9bRsptsgKX2 3nee87uc3Obu6GwJrU8eCtkdeWO74tpcWnQSzQHy6Dv4kvgSBgHi37LkIx9LaRUV/I7V 5XJFIT4iFxPi6a9SoaTd6pI+60pEb1nBlKhbIz1MncckCbt6c9rPF+UZTQm+UBzEKX1V dv5EsG2t1B5MX7Jmwnx5wuzth7xXefcey5VsibxHhN7EeheCHo1KVXz2b+CVwNs7wgeQ CsiQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:content-transfer-encoding :content-id:content-language:accept-language:in-reply-to:references :message-id:date:thread-index:thread-topic:subject:to:from :dkim-signature:dkim-signature; bh=td+otZHNYqNHccLsC5RlnCxQefI8WvrBcCgqS7vsmVE=; b=N3Hctccs13DhBlSIoTOuo/JbgtnHiDMo0C6rH01bMgPd0jP41aCXEvOp9XjhAg7ypJ ipohdHwbwwjku6rIvBK3i2H947meHJU1CwYAcUUAR6Ob1Yxg7q1uLVtGqmNPq2HjTawF +VtEnwKnB+28hOAHQJMC9XW/0IdW67bKiKFdkKt3Twu8vQgrT1BngJLw0CMMPZXkwe5+ oSBNdA4vv7Z5ftbHw4Qw9JGTvL39yyzrf4dWwD+ZvhiGuVqH+3vseD5AZAvUmeqbjnTH CvoJAUHyZbGz7K5gH2ewMPGuVCTKMs/PDxvKPBlwn+EK3aXznN9z6oTTJC1AYepojrE9 dXEA== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2021-07-09 header.b=GnhzNJo1; dkim=pass header.i=@oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=Sa8ZaMOw; arc=pass (i=1); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id t22si409126ejf.191.2022.02.02.16.25.46; Wed, 02 Feb 2022 16:26:10 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2021-07-09 header.b=GnhzNJo1; dkim=pass header.i=@oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=Sa8ZaMOw; arc=pass (i=1); spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S244401AbiBBCnh (ORCPT + 99 others); Tue, 1 Feb 2022 21:43:37 -0500 Received: from mx0a-00069f02.pphosted.com ([205.220.165.32]:50906 "EHLO mx0a-00069f02.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243973AbiBBCmZ (ORCPT ); Tue, 1 Feb 2022 21:42:25 -0500 Received: from pps.filterd (m0246627.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 2120LxWt008539; Wed, 2 Feb 2022 02:42:09 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : subject : date : message-id : references : in-reply-to : content-type : content-id : content-transfer-encoding : mime-version; s=corp-2021-07-09; bh=td+otZHNYqNHccLsC5RlnCxQefI8WvrBcCgqS7vsmVE=; b=GnhzNJo11C4DFAqtdcpf8bn0obKgufa3IZCvFgzK0PNEXeM4wEs2v7nElB7zptK039Qn +DzS+Or6veK0VU7ol2/hoVLY0DM1QI6V9vsqnDBx5+TCS/yx0hLnJ5iZVFuVpKS0yxQI vHLPZ1wfL2W/zYP/35jcBcih2IJsB6Uf0o1XY2i0iimcjPMmrJSaALuoakW7q6fWkTmd 0C0mTASKJ+9KDtHLNgqVMF+ntOcbG+6wv2cfHUw1FzDsqIGo4iLgyWd9EMZ87pDO4ACp fr6nbnQWa75Ye9XdakLB24sCSibZenJI9TuhvVnSPtDD8cjJYWVycEgYqTopz+GCMq/7 rw== Received: from aserp3030.oracle.com (aserp3030.oracle.com [141.146.126.71]) by mx0b-00069f02.pphosted.com with ESMTP id 3dxjatvuf3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 02 Feb 2022 02:42:07 +0000 Received: from pps.filterd (aserp3030.oracle.com [127.0.0.1]) by aserp3030.oracle.com (8.16.1.2/8.16.1.2) with SMTP id 2122ZvFd015143; Wed, 2 Feb 2022 02:42:06 GMT Received: from nam04-dm6-obe.outbound.protection.outlook.com (mail-dm6nam08lp2042.outbound.protection.outlook.com [104.47.73.42]) by aserp3030.oracle.com with ESMTP id 3dvumggtje-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 02 Feb 2022 02:42:04 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=c5yQYutBvdJwlJ3u6T7+Pc1PaIGxOzLuFPrGahE5B0spVjv6QN90cnmXEsM2Kt2v7p+Oat0hmedC8RAN79p/ScP+Em+FqFtSTh+/vI9ksYtMsF9p/CzUSAEWh3eip3lR6cTQF+tcSsT/KZRM6cjvoEOpj9XY45VhS/IqGdWHIOB8+Up5rw2et5Eqe1s6gwTfo7SvqyhWszg9pD0Fof8//HVb5W9hlWo85YbULDpGFcT3A5iH+e5yIfW0MHuo+QkLLUJ40sYO3NTJfUwX3EksSKYKpDyIukm8wWg+073paoCD+M+l8zX6Tzs0xvVdq+b8WEb4cVJFojeZDgaulw7qdQ== 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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=td+otZHNYqNHccLsC5RlnCxQefI8WvrBcCgqS7vsmVE=; b=Ttnofp6KH4ApcOpMIKn3EpTTYRFpdMCQ89TXYKJskewPAQIvym4KAyVh0yBLwtAIzrMf4ntyXCuS4vROBh7wWPIMCF8riLID16wsXXuFVpv6a9XctyiTYija8w1ovOcKQR0UHXx+1ddXwHO2oEwUbdnPMsum7ZiKF21KJkCd3OtWF25Tle1l6OwM7OH63Ykr/9CuBHPDQD/6u2B/yVlJIqr9BUYLtwfSc4fu6jjMrb/61+3pPtmhoGywzCsPkhOHDhFjxLgbSeCwKYKwZK+VGo56Mrc4poNWgcpUkQTCWUQobDk5ly6Fh9Wwe6jL/Zt2c5h0OGRviNHEK9788NM2Cg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=td+otZHNYqNHccLsC5RlnCxQefI8WvrBcCgqS7vsmVE=; b=Sa8ZaMOwhA+nkC1B7Z2TLY/A6A0lxq6kpQ2OsJ+HnYG1YKzdyDItwE9MrpuDyoSx4iMnTOhfGjOcfwRYzVZFszkoU3qrhGYlM6gv73LwBILZnYNaXYS6PxmyZ0t4+zKUCyVSoQNNw/BMNUGWxr2M6/4IuDKTBo2mwgSIDRlLs+g= Received: from SN6PR10MB3022.namprd10.prod.outlook.com (2603:10b6:805:d8::25) by MWHPR10MB1325.namprd10.prod.outlook.com (2603:10b6:300:1e::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4930.18; Wed, 2 Feb 2022 02:41:57 +0000 Received: from SN6PR10MB3022.namprd10.prod.outlook.com ([fe80::3857:3a25:3444:fdd3]) by SN6PR10MB3022.namprd10.prod.outlook.com ([fe80::3857:3a25:3444:fdd3%5]) with mapi id 15.20.4930.022; Wed, 2 Feb 2022 02:41:57 +0000 From: Liam Howlett To: "maple-tree@lists.infradead.org" , "linux-mm@kvack.org" , "linux-kernel@vger.kernel.org" , Andrew Morton Subject: [PATCH v5 07/70] Maple Tree: Add new data structure Thread-Topic: [PATCH v5 07/70] Maple Tree: Add new data structure Thread-Index: AQHYF95x/Sfcc+vEiUSQ90JwlBJbIg== Date: Wed, 2 Feb 2022 02:41:56 +0000 Message-ID: <20220202024137.2516438-8-Liam.Howlett@oracle.com> References: <20220202024137.2516438-1-Liam.Howlett@oracle.com> In-Reply-To: <20220202024137.2516438-1-Liam.Howlett@oracle.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-mailer: git-send-email 2.34.1 x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 85543d00-5fd8-4fb0-2858-08d9e5f59474 x-ms-traffictypediagnostic: MWHPR10MB1325:EE_ x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:8273; x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: GiDQbznMHhLUmc54zZwCpRfbuXRTCv39IxxDob3iiCyo41TYci0KNwEnxQ+u3+01jNosWpF9TFIl2SCiSHD+EjifcpHXv5FWIYREG0MgCiLdfFWFIdcgRbz8RJYsykMDbWuyl5h6LySdAfbT4O8WQNZpRtcmy+Stxkd9ZjocAsI06V6RgQ4PONXVWSDA7wdTIxb5lZbDVRXDgArxos7doMFFhmopIKomzwkRhkgDV1d+m86XfiWtsQEKmIjh1AyaPqIRK8Py4uYP6/bC2bRzxJqXIHo0WSPw3zdQSwGOYTTHxjShRGlZHJOyGb2CorEMI5a9F8iG30M2Km5hJ1xDgSAOEqaAzpPf3Zvo2z7HZe3yawneYpqoC4rFiS0GrUO+PF1etEr9m66OhcKiHBcc/1y97Hs3xSmMcby4DUth8FqFmMCXWVfRsCywY8fBoKakCkOaITvBAm5vK6uIgFPyyauMe8UmHZuZUI2NdEI2Kc4J0n20l0QQVoTh6jOaHTmHJN8g8gZ3s+jCiVZDED6rfsFy2Z6ocCA99Pnnu1BQywmBwbcHaXbKbaXsWQ+hmrTZoqYMGWxpCP8d0ow3SoPWefcBukSkqhIAe5IvNdQFDhNUzDs870yzcy/KqHFKP8akCG/7xxoysmLhYFBf0mVIunXtnWhc1MRpEpLGQ6e4UiWGxhExyd9SLBBY/S+LWe7vuqoOvvXAS3pxCBATQxZT+pH1KMaPMKhetIhEqu9Gt56sC0+aLQl17inUfeJrJJJ956OeXeVmN12/k9sh0no0pJQTsOrSUh7N7QBfBxF/oc1eevmz/kOeAYdKr8r6VosO x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN6PR10MB3022.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230001)(366004)(83380400001)(5660300002)(38100700002)(30864003)(110136005)(86362001)(508600001)(6486002)(966005)(6506007)(44832011)(91956017)(66946007)(26005)(38070700005)(2906002)(122000001)(71200400001)(66556008)(186003)(66476007)(66446008)(64756008)(1076003)(8936002)(76116006)(36756003)(316002)(2616005)(8676002)(6512007)(579004)(559001)(309714004);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?ZXNxMmtDU0orZDMzaURtWVZiY243UmhqT1BRUTd3aEZ2Q21IK0d6ZlBRaDVU?= =?utf-8?B?eTFZQ2x6bzVZaFc5Y2EzM2hETHp5UE43OFVNdW9yeHY0L0tUZGNhelRBc28x?= =?utf-8?B?WGxMSWRqZG1qTnpBWWorczdXdUpUcFZ4RmZ4VmVJb0s1NXZFWTMrbERJRWg2?= =?utf-8?B?WEhtUEd4d0dVbC9pbkVjcUJLVHdNVGE3a1cyTDRZRk1sS0xPNFNMTDkrYVpU?= =?utf-8?B?bDAxUG5sWUtKbFh0dE9nSUs4emhNS0kva2RWSDJrSEJjWXFvODFtdEdDcS85?= =?utf-8?B?WG0zcG4yalBTRXV6eEVIeHZnWWxFRDZnZjZydW5VZVhRWFRpeksweVNWZnRk?= =?utf-8?B?d0Y4VU40V1hGRXArSEc0RGVrdE40QU96NGNZbzVEWFhjcDdvSS9OSklrQnhU?= =?utf-8?B?NUMrOVhVTFNvUUgxakFyeUhxM3hkT2oyZklaakt2Q0ZnWmR5eldDUFpxaUJx?= =?utf-8?B?bnZoNGtmYm9hN3pkR1RYRUhJUDZPbjBiL3F4a2wxWkg5VUtzSzhoSVdhdC9F?= =?utf-8?B?N2xjWHZVbGdDMDd2eW1zQkFnQ2dvMW1OLzFLblZHT2lQQ3ZIRWd6eWpHdHM5?= =?utf-8?B?Zzd0V29ZZC9rQ3BoemxGT0pTZzhHTkxZWEh4Uk83SnVPaVZSYjd5YWY4MzlM?= =?utf-8?B?Y0NEWTduZEljSzJ6L2tpNXJDYUJEa0lFR3U2V05DZHZkb3FjQVhKeUhHOUo3?= =?utf-8?B?SG5XMmdBSGQ1Wjg5UXlaUjVJRmZIV3pDNmRWdFVZV21jdHo0RVpVWTZPdWtY?= =?utf-8?B?bWJKRVJ5dWVhb0ZuNW44WFA2Umk2YWJ4K01xUHR4RU5XYlNPeEk5a0p0N2hI?= =?utf-8?B?ZU5DQnNSTi9YdUFsd29OWVh3bXF6WloxS0lmUDkwU3ExdDlSeFgxK2ZJVGYw?= =?utf-8?B?Uy9qak5nVGIwc0Rtc3pVRUM2Tk1aTDFIa2hOVE9EeGd5OWdDdWViZjdPQk54?= =?utf-8?B?bnhCS2tCN1hodHVtUkJEUWJXVDA1OUNZUDdVRU81eGpMbnRNWWJ6VFpmcEZB?= =?utf-8?B?U0F3ZzFoWnZNQU4wVDhBcGE3cUdTN0lNQm5KRTRQTlZ2TUgweUN0ZWlpeGI1?= =?utf-8?B?b2JRMTJyVmxDL21acVNtUE5qdGNGM3NPNUpyZ1RmZ0xoVGV3cG5rMkRPdUt4?= =?utf-8?B?STRNbHdGTlpFenhnQ1BHWEc1NHRRZmdKVE16em92QVNsS2Z1NTBEOUZLb0cr?= =?utf-8?B?UGJWVm5BZGN6eC8zcitCd1dEUGZhQnNiWTg3YU5MZFlNVWpBZGZXS1FGcHE5?= =?utf-8?B?RGF1SkpQMGxqaGkyL296NUZtdEFDY05nbFVOUXpWRE5oVG5vS25iQ09yT3h1?= =?utf-8?B?NGh1VVREZnN0UFptWUZMVHY5M2NJczlKWWxjdWhzTWExYVYwTmhIbXFFZ0gw?= =?utf-8?B?ODIxZnkwS01zRzU4L1NBeDZzVVlNWjBBWTZ5UEd1NWZyVmdhR2V6NXpxTVJz?= =?utf-8?B?aWRmZ0RDMHJkYTFma3dpWTVzVk84czlXTlJ5MFRhNGJuSGVidVRvRXYrMDA2?= =?utf-8?B?THBMcEhsY3h1eVlNODNSQ3p2N0dLT0krc25aaVQyUnFtTDZWc1VnVE85QmxM?= =?utf-8?B?cXhrNGMzOTZrandqL1R0WFFuallXMW1LTDNpWXVPVmpNUU40eUxicmtocFVD?= =?utf-8?B?VDdaTE9CNEI3Y3A3TGd3ZFFxc2hEVWdBc1hpU3psUWhlQnhRcm1zTDRweXAz?= =?utf-8?B?QWJ2d0RxQWRoUjVQNjNvNjhSdWNiWlgweW0rSVFoc0s5Ly82RlQzTTAyRTNY?= =?utf-8?B?aFJyMG00d3dVSXlwVUxKWkdTS0YxazNvbmdNcXppZDVaWHQzcGtBUzE0UnVs?= =?utf-8?B?YjJvc1k1MWpyUkhLNDlCd1A1cGdzR3RtTnJ6TEd1M3hqMnVKZ3FESGI0TkNz?= =?utf-8?B?L2JRK2JaNjVHOGlwMTZ2bVZzWU9zYi9zenVXWFRnSFNuZm1tQWRQbWptb3k2?= =?utf-8?B?b0hyR2F5VkliZDNGZERVYytZREg0R2tPM24zRWswcm9hNUlCc3lPRXpPbnlC?= =?utf-8?B?OEVXWloxL3MwTXBRNHVhVXJZQy96NkoxdXNjbFQ0cXM4RzZQYTNTQ0VpYko1?= =?utf-8?B?c1VLZGlhNStlalZEOStkSFhYUC9zRUlXZkRoL2sxdG91d2VHMHBTbWxPYVhr?= =?utf-8?B?dVNHUzhwQ012R1dyVVVja01XeGxobklHNFljUzRsd1oxWk1MUkV2cHU1OExy?= =?utf-8?Q?otHcofx3AKwm4NX8oLHq5lU=3D?= Content-Type: text/plain; charset="utf-8" Content-ID: <9706CC4B82E0C249BC568AA00EB6EE54@namprd10.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SN6PR10MB3022.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 85543d00-5fd8-4fb0-2858-08d9e5f59474 X-MS-Exchange-CrossTenant-originalarrivaltime: 02 Feb 2022 02:41:56.6118 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 6X5b5A+18esROTmzzDbv2N7fqoueTYBU+9Q4Aozp4fE5Ds7Lt89txuSD3XJSR0QmpoehmR26dK6nT8e70uByIA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR10MB1325 X-Proofpoint-Virus-Version: vendor=nai engine=6300 definitions=10245 signatures=673430 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 malwarescore=0 phishscore=0 mlxscore=0 adultscore=0 suspectscore=0 mlxlogscore=999 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2201110000 definitions=main-2202020010 X-Proofpoint-GUID: YkH9EzAk6L97bd7PnvKV7TzGIuv7-uSj X-Proofpoint-ORIG-GUID: YkH9EzAk6L97bd7PnvKV7TzGIuv7-uSj Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org RnJvbTogIkxpYW0gUi4gSG93bGV0dCIgPExpYW0uSG93bGV0dEBPcmFjbGUuY29tPg0KDQpUaGUg bWFwbGUgdHJlZSBpcyBhbiBSQ1Utc2FmZSByYW5nZSBiYXNlZCBCLXRyZWUgZGVzaWduZWQgdG8g dXNlIG1vZGVybg0KcHJvY2Vzc29yIGNhY2hlIGVmZmljaWVudGx5LiAgVGhlcmUgYXJlIGEgbnVt YmVyIG9mIHBsYWNlcyBpbiB0aGUga2VybmVsDQp0aGF0IGEgbm9uLW92ZXJsYXBwaW5nIHJhbmdl LWJhc2VkIHRyZWUgd291bGQgYmUgYmVuZWZpY2lhbCwgZXNwZWNpYWxseQ0Kb25lIHdpdGggYSBz aW1wbGUgaW50ZXJmYWNlLiAgVGhlIGZpcnN0IHVzZXIgdGhhdCBpcyBjb3ZlcmVkIGluIHRoaXMN CnBhdGNoIHNldCBpcyB0aGUgdm1fYXJlYV9zdHJ1Y3QsIHdoZXJlIHRocmVlIGRhdGEgc3RydWN0 dXJlcyBhcmUNCnJlcGxhY2VkIGJ5IHRoZSBtYXBsZSB0cmVlOiB0aGUgYXVnbWVudGVkIHJidHJl ZSwgdGhlIHZtYSBjYWNoZSwgYW5kIHRoZQ0KbGlua2VkIGxpc3Qgb2YgVk1BcyBpbiB0aGUgbW1f c3RydWN0LiAgVGhlIGxvbmcgdGVybSBnb2FsIGlzIHRvIHJlZHVjZQ0Kb3IgcmVtb3ZlIHRoZSBt bWFwX3NlbSBjb250ZW50aW9uLg0KDQpUaGUgdHJlZSBoYXMgYSBicmFuY2hpbmcgZmFjdG9yIG9m IDEwIGZvciBub24tbGVhZiBub2RlcyBhbmQgMTYgZm9yIGxlYWYNCm5vZGVzLiAgV2l0aCB0aGUg aW5jcmVhc2VkIGJyYW5jaGluZyBmYWN0b3IsIGl0IGlzIHNpZ25pZmljYW50bHkgc2hvcnRlciB0 aGFuDQp0aGUgcmJ0cmVlIHNvIGl0IGhhcyBmZXdlciBjYWNoZSBtaXNzZXMuICBUaGUgcmVtb3Zh bCBvZiB0aGUgbGlua2VkIGxpc3QNCmJldHdlZW4gc3Vic2VxdWVudCBlbnRyaWVzIGFsc28gcmVk dWNlcyB0aGUgY2FjaGUgbWlzc2VzIGFuZCB0aGUgbmVlZCB0byBwdWxsDQppbiB0aGUgcHJldmlv dXMgYW5kIG5leHQgVk1BIGR1cmluZyBtYW55IHRyZWUgYWx0ZXJhdGlvbnMuDQoNClNpZ25lZC1v ZmYtYnk6IE1hdHRoZXcgV2lsY294IChPcmFjbGUpIDx3aWxseUBpbmZyYWRlYWQub3JnPg0KU2ln bmVkLW9mZi1ieTogTGlhbSBSLiBIb3dsZXR0IDxMaWFtLkhvd2xldHRAb3JhY2xlLmNvbT4NCi0t LQ0KIERvY3VtZW50YXRpb24vY29yZS1hcGkvaW5kZXgucnN0ICAgICAgICAgICAgICB8ICAgIDEg Kw0KIERvY3VtZW50YXRpb24vY29yZS1hcGkvbWFwbGVfdHJlZS5yc3QgICAgICAgICB8ICAxOTYg Kw0KIE1BSU5UQUlORVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMTIg Kw0KIGluY2x1ZGUvbGludXgvbWFwbGVfdHJlZS5oICAgICAgICAgICAgICAgICAgICB8ICA2NzMg KysNCiBpbmNsdWRlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmggICAgICAgICAgICAgfCAgMTIz ICsNCiBsaWIvS2NvbmZpZy5kZWJ1ZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA5 ICsNCiBsaWIvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAz ICstDQogbGliL21hcGxlX3RyZWUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjk0 MyArKysrKysrKysrKysrKysrKw0KIHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS8uZ2l0aWdub3Jl ICAgICAgICAgICB8ICAgIDIgKw0KIHRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9NYWtlZmlsZSAg ICAgICAgICAgICB8ICAgMTMgKy0NCiB0b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvZ2VuZXJhdGVk L2F1dG9jb25mLmggfCAgICAxICsNCiB0b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbGludXgvbWFw bGVfdHJlZS5oICAgfCAgICA3ICsNCiB0b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYyAg ICAgICAgICAgICAgfCAgIDU5ICsNCiAuLi4vcmFkaXgtdHJlZS90cmFjZS9ldmVudHMvbWFwbGVf dHJlZS5oICAgICAgfCAgICAzICsNCiAxNCBmaWxlcyBjaGFuZ2VkLCA4MDQyIGluc2VydGlvbnMo KyksIDMgZGVsZXRpb25zKC0pDQogY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3VtZW50YXRpb24vY29y ZS1hcGkvbWFwbGVfdHJlZS5yc3QNCiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9saW51eC9t YXBsZV90cmVlLmgNCiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS90cmFjZS9ldmVudHMvbWFw bGVfdHJlZS5oDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9tYXBsZV90cmVlLmMNCiBjcmVhdGUg bW9kZSAxMDA2NDQgdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4L21hcGxlX3RyZWUuaA0K IGNyZWF0ZSBtb2RlIDEwMDY0NCB0b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0KIGNy ZWF0ZSBtb2RlIDEwMDY0NCB0b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvdHJhY2UvZXZlbnRzL21h cGxlX3RyZWUuaA0KDQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9pbmRleC5y c3QgYi9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL2luZGV4LnJzdA0KaW5kZXggNWRlMmM3YTRiMWIz Li5jNjY5ZTBhYmNmZDYgMTAwNjQ0DQotLS0gYS9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL2luZGV4 LnJzdA0KKysrIGIvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9pbmRleC5yc3QNCkBAIC0zNCw2ICsz NCw3IEBAIExpYnJhcnkgZnVuY3Rpb25hbGl0eSB0aGF0IGlzIHVzZWQgdGhyb3VnaG91dCB0aGUg a2VybmVsLg0KICAgIGtyZWYNCiAgICBhc3NvY19hcnJheQ0KICAgIHhhcnJheQ0KKyAgIG1hcGxl X3RyZWUNCiAgICBpZHINCiAgICBjaXJjdWxhci1idWZmZXJzDQogICAgcmJ0cmVlDQpkaWZmIC0t Z2l0IGEvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9tYXBsZV90cmVlLnJzdCBiL0RvY3VtZW50YXRp b24vY29yZS1hcGkvbWFwbGVfdHJlZS5yc3QNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAw MDAwMDAwMDAwMDAuLjA2YzU0MjMwZDk4NQ0KLS0tIC9kZXYvbnVsbA0KKysrIGIvRG9jdW1lbnRh dGlvbi9jb3JlLWFwaS9tYXBsZV90cmVlLnJzdA0KQEAgLTAsMCArMSwxOTYgQEANCisuLiBTUERY LUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsNCisNCisNCis9PT09PT09PT09DQorTWFwbGUg VHJlZQ0KKz09PT09PT09PT0NCisNCis6QXV0aG9yOiBMaWFtIFIuIEhvd2xldHQNCisNCitPdmVy dmlldw0KKz09PT09PT09DQorDQorVGhlIE1hcGxlIFRyZWUgaXMgYSBCLVRyZWUgZGF0YSB0eXBl IHdoaWNoIGlzIG9wdGltaXplZCBmb3Igc3RvcmluZw0KK25vbi1vdmVybGFwcGluZyByYW5nZXMs IGluY2x1ZGluZyByYW5nZXMgb2Ygc2l6ZSAxLiAgVGhlIHRyZWUgd2FzIGRlc2lnbmVkIHRvDQor YmUgc2ltcGxlIHRvIHVzZSBhbmQgZG9lcyBub3QgcmVxdWlyZSBhIHVzZXIgd3JpdHRlbiBzZWFy Y2ggbWV0aG9kLiAgSXQNCitzdXBwb3J0cyBpdGVyYXRpbmcgb3ZlciBhIHJhbmdlIG9mIGVudHJp ZXMgYW5kIGdvaW5nIHRvIHRoZSBwcmV2aW91cyBvciBuZXh0IGluDQorYSBjYWNoZS1lZmZpY2ll bnQgbWFubmVyLiAgVGhlIHRyZWUgY2FuIGFsc28gYmUgcHV0IGludG8gYW4gUkNVLXNhZmUgbW9k ZSBvZg0KK29wZXJhdGlvbiB3aGljaCBhbGxvd3MgcmVhZGluZyBhbmQgd3JpdGluZyBjb25jdXJy ZW50bHkuICBXcml0ZXJzIG11c3QNCitzeW5jaHJvbml6ZSBvbiBhIGxvY2ssIHdoaWNoIGNhbiBi ZSB0aGUgZGVmYXVsdCBzcGlubG9jaywgb3IgdGhlIHVzZXIgY2FuIHNldA0KK3RoZSBsb2NrIHRv IGFuIGV4dGVybmFsIGxvY2sgb2YgYSBkaWZmZXJlbnQgdHlwZS4NCisNCitUaGUgTWFwbGUgVHJl ZSBtYWludGFpbnMgYSBzbWFsbCBtZW1vcnkgZm9vdHByaW50IGFuZCB3YXMgZGVzaWduZWQgdG8g dXNlDQorbW9kZXJuIHByb2Nlc3NvciBjYWNoZSBlZmZpY2llbnRseS4gIFRoZSBtb3N0IGltcG9y dGFudCB1c2VyIG9mIHRoZSBNYXBsZSBUcmVlDQoraXMgdGhlIHZpcnR1YWwgbWVtb3J5IGFyZWEu DQorDQorVGhlIE1hcGxlIFRyZWUgY2FuIHN0b3JlIGJldHdlZW4gMCBhbmQgYGBVTE9OR19NQVhg YC4gIFRoZSBNYXBsZSBUcmVlIHJlc2VydmVzDQordmFsdWVzIHdpdGggdGhlIGJvdHRvbSB0d28g Yml0cyBzZXQgdG8gJzEwJyB3aGljaCBhcmUgYmVsb3cgNDA5NiAoaWUgMiwgNiwgMTANCisuLiA0 MDk0KSBmb3IgaW50ZXJuYWwgdXNlLiAgSWYgdGhlIGVudHJpZXMgbWF5IHVzZSByZXNlcnZlZCBl bnRyaWVzIHRoZW4gdGhlDQordXNlcnMgY2FuIGNvbnZlcnQgdGhlIGVudHJpZXMgdXNpbmcgeGFf bWtfdmFsdWUoKSBhbmQgY29udmVydCB0aGVtIGJhY2sgYnkNCitjYWxsaW5nIHhhX3RvX3ZhbHVl KCkuICBUaGUgcmVzZXJ2ZWQgdmFsdWVzIGNhbiBiZSB1c2VkIGJ5IHRoZSBhZHZhbmNlZCBBUEks DQorYnV0IGFyZSBibG9ja2VkIGJ5IHRoZSBub3JtYWwgQVBJLg0KKw0KK1RoZSBNYXBsZSBUcmVl IGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBzZWFyY2hpbmcgZm9yIGEgZ2FwIG9m IGEgZ2l2ZW4NCitzaXplIChvciBsYXJnZXIpLiAgVGhlIHRyZWUgbXVzdCBiZSBpbml0aWFsaXpl ZCBhcyBhbiBhbGxvY2F0aW9uIHRyZWUgdG8NCitzdXBwb3J0IHRoaXMgZmVhdHVyZS4NCisNCitQ cmUtYWxsb2NhdGluZyBvZiBub2RlcyBpcyBhbHNvIHN1cHBvcnRlZCB1c2luZyB0aGUgYWR2YW5j ZWQgQVBJLiAgVGhpcyBpcw0KK3VzZWZ1bCBmb3IgdXNlcnMgd2hvIG11c3QgZ3VhcmFudGVlIGEg c3VjY2Vzc2Z1bCBzdG9yZSBvcGVyYXRpb24gd2l0aGluIGEgZ2l2ZW4NCitjb2RlIHNlZ21lbnQg d2hlbiBhbGxvY2F0aW5nIGNhbm5vdCBiZSBkb25lLiAgQWxsb2NhdGlvbnMgb2Ygbm9kZXMgYXJl DQorcmVsYXRpdmVseSBzbWFsbCBhdCAyNTYgYnl0ZXMuDQorDQorTm9ybWFsIEFQSQ0KKz09PT09 PT09PT0NCisNCitTdGFydCBieSBpbml0aWFsaXNpbmcgYSBtYXBsZSB0cmVlLCBlaXRoZXIgd2l0 aCBERUZJTkVfTVRSRUUoKSBmb3Igc3RhdGljYWxseQ0KK2FsbG9jYXRlZCBtYXBsZSB0cmVlcyBv ciBtdF9pbml0KCkgZm9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBvbmVzLiAgQQ0KK2ZyZXNobHkt aW5pdGlhbGlzZWQgbWFwbGUgdHJlZSBjb250YWlucyBhIGBgTlVMTGBgIHBvaW50ZXIgZm9yIHRo ZSByYW5nZSAwIC0NCitgYFVMT05HX01BWGBgLiAgVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gdHlw ZXMgb2YgbWFwbGUgdHJlZXMgc3VwcG9ydGVkOiB0aGUNCithbGxvY2F0aW9uIHRyZWUgYW5kIHRo ZSByZWd1bGFyIHRyZWUuICBUaGUgcmVndWxhciB0cmVlIGhhcyBhIGhpZ2hlciBicmFuY2hpbmcN CitmYWN0b3IgZm9yIGludGVybmFsIG5vZGVzLiAgVGhlIGFsbG9jYXRpb24gdHJlZSBoYXMgYSBs b3dlciBicmFuY2hpbmcgZmFjdG9yDQorYnV0IGFsbG93cyB0aGUgdXNlciB0byBzZWFyY2ggZm9y IGEgZ2FwIG9mIGEgZ2l2ZW4gc2l6ZSBvciBsYXJnZXIgZnJvbSBlaXRoZXIgMA0KK3Vwd2FyZHMg b3IgYGBVTE9OR19NQVhgYCBkb3duLiAgQW4gYWxsb2NhdGlvbiB0cmVlIGNhbiBiZSB1c2VkIGJ5 IHBhc3NpbmcgaW4NCit0aGUgYGBNQVBMRV9BTExPQ19SQU5HRWBgIGZsYWcgd2hlbiBpbml0aWFs aXNpbmcgdGhlIHRyZWUuDQorDQorWW91IGNhbiB0aGVuIHNldCBlbnRyaWVzIHVzaW5nIG10cmVl X3N0b3JlKCkgb3IgbXRyZWVfc3RvcmVfcmFuZ2UoKS4NCittdHJlZV9zdG9yZSB3aWxsIG92ZXJ3 cml0ZSBhbnkgZW50cnkgd2l0aCB0aGUgbmV3IGVudHJ5IGFuZCByZXR1cm4gdGhlIHByZXZpb3Vz DQorZW50cnkgc3RvcmVkIGF0IHRoYXQgaW5kZXguICBtdHJlZV9zdG9yZV9yYW5nZSB3b3JrcyBp biB0aGUgc2FtZSB3YXkgYnV0IG9ubHkNCityZXR1cm5zIHRoZSBmaXJzdCBlbnRyeSB0aGF0IGlz IG92ZXJ3cml0dGVuLiAgbXRyZWVfbG9hZCgpIGlzIHVzZWQgdG8gcmV0cmlldmUNCit0aGUgZW50 cnkgc3RvcmVkIGF0IGEgZ2l2ZW4gaW5kZXguICBZb3UgY2FuIHVzZSBtdHJlZV9lcmFzZSgpIHRv IGVyYXNlIGFuDQorZW50aXJlIHJhbmdlIGJ5IG9ubHkga25vd2luZyBvbmUgdmFsdWUgd2l0aGlu IHRoYXQgcmFuZ2UsIG9yIG10cmVlX3N0b3JlKCkgY2FsbA0KK3dpdGggYW4gZW50cnkgb2YgTlVM TCBtYXkgYmUgdXNlZCB0byBwYXJ0aWFsbHkgZXJhc2UgYSByYW5nZS4NCisNCitJZiB5b3Ugd2Fu dCB0byBvbmx5IHN0b3JlIGEgbmV3IGVudHJ5IHRvIGEgcmFuZ2UgKG9yIGluZGV4KSBpZiB0aGF0 IHJhbmdlIGlzDQorY3VycmVudGx5IGBgTlVMTGBgLCB5b3UgY2FuIHVzZSBtdHJlZV9pbnNlcnRf cmFuZ2UoKSBvciBtdHJlZV9pbnNlcnQoKSB3aGljaA0KK3JldHVybiAtRUVYSVNUIGlmIHRoZSBy YW5nZSBpcyBub3QgZW1wdHkuDQorDQorWW91IGNhbiBzZWFyY2ggZm9yIGFuIGVudHJ5IGZyb20g YW4gaW5kZXggdXB3YXJkcyBieSB1c2luZyBtdF9maW5kKCkuDQorDQorWW91IGNhbiB3YWxrIGVh Y2ggZW50cnkgd2l0aGluIGEgcmFuZ2UgYnkgY2FsbGluZyBtdF9mb3JfZWFjaCgpLiAgWW91IG11 c3QNCitwcm92aWRlIGEgdGVtcG9yYXJ5IHZhcmlhYmxlIHRvIHN0b3JlIGEgY3Vyc29yLiAgSWYg eW91IHdhbnQgdG8gd2FsayBlYWNoDQorZWxlbWVudCBvZiB0aGUgdHJlZSB0aGVuIDAgYW5kIGBg VUxPTkdfTUFYYGAgbWF5IGJlIHVzZWQgYXMgdGhlIHJhbmdlLiAgSWYgdGhlDQorY2FsbGVyIGlz IGdvaW5nIHRvIGhvbGQgdGhlIGxvY2sgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgd2FsayB0aGVu IGl0IGlzIHdvcnRoDQorbG9va2luZyBhdCB0aGUgbWFzX2Zvcl9lYWNoKCkgQVBJIGluIHRoZSBB ZHZhbmNlZCBBUEkgc2VjdGlvbi4NCisNCitTb21ldGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGVu c3VyZSB0aGUgbmV4dCBjYWxsIHRvIHN0b3JlIHRvIGEgbWFwbGUgdHJlZSBkb2VzDQorbm90IGFs bG9jYXRlIG1lbW9yeSwgcGxlYXNlIHNlZSB0aGUgYWR2YW5jZWQgQVBJIGZvciB0aGlzIHVzZSBj YXNlLg0KKw0KK0ZpbmFsbHksIHlvdSBjYW4gcmVtb3ZlIGFsbCBlbnRyaWVzIGZyb20gYSBtYXBs ZSB0cmVlIGJ5IGNhbGxpbmcNCittdHJlZV9kZXN0cm95KCkuICBJZiB0aGUgbWFwbGUgdHJlZSBl bnRyaWVzIGFyZSBwb2ludGVycywgeW91IG1heSB3aXNoIHRvIGZyZWUNCit0aGUgZW50cmllcyBm aXJzdC4NCisNCitBbGxvY2F0aW5nIE5vZGVzDQorLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK1doZW4g dXNpbmcgdGhlIG5vcm1hbCBBUEksIHRoZSBhbGxvY2F0aW9ucyBhcmUgaGFuZGxlZCBieSB0aGUg aW50ZXJuYWwNCit0cmVlIGNvZGUuDQorDQorTG9ja2luZw0KKy0tLS0tLS0NCisNCitXaGVuIHVz aW5nIHRoZSBOb3JtYWwgQVBJLCB5b3UgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgbG9ja2lu Zy4NCitUaGUgTWFwbGUgVHJlZSB1c2VzIFJDVSBhbmQgYW4gaW50ZXJuYWwgc3BpbmxvY2sgdG8g c3luY2hyb25pc2UgYWNjZXNzOg0KKw0KK1Rha2VzIFJDVSByZWFkIGxvY2s6DQorICogbXRyZWVf bG9hZCgpDQorICogbXRfZmluZCgpDQorICogbXRfZm9yX2VhY2goKQ0KKyAqIG10X25leHQoKQ0K KyAqIG10X3ByZXYoKQ0KKw0KK1Rha2VzIG1hX2xvY2sgaW50ZXJuYWxseToNCisgKiBtdHJlZV9z dG9yZSgpDQorICogbXRyZWVfc3RvcmVfcmFuZ2UoKQ0KKyAqIG10cmVlX2luc2VydCgpDQorICog bXRyZWVfaW5zZXJ0X3JhbmdlKCkNCisgKiBtdHJlZV9lcmFzZSgpDQorICogbXRyZWVfZGVzdHJv eSgpDQorICogbXRfc2V0X2luX3JjdSgpDQorICogbXRfY2xlYXJfaW5fcmN1KCkNCisNCitJZiB5 b3Ugd2FudCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgbG9jayB0byBwcm90ZWN0IHRoZSBkYXRh IHN0cnVjdHVyZXMNCit0aGF0IHlvdSBhcmUgc3RvcmluZyBpbiB0aGUgTWFwbGUgVHJlZSwgeW91 IGNhbiBjYWxsIG10cmVlX2xvY2soKSBiZWZvcmUNCitjYWxsaW5nIG10cmVlX2xvYWQoKSwgdGhl biB0YWtlIGEgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBvYmplY3QgeW91IGhhdmUNCitmb3VuZCBi ZWZvcmUgY2FsbGluZyBtdHJlZV91bmxvY2soKS4gIFRoaXMgd2lsbCBwcmV2ZW50IHN0b3JlcyBm cm9tDQorcmVtb3ZpbmcgdGhlIG9iamVjdCBmcm9tIHRoZSB0cmVlIGJldHdlZW4gbG9va2luZyB1 cCB0aGUgb2JqZWN0IGFuZA0KK2luY3JlbWVudGluZyB0aGUgcmVmY291bnQuICBZb3UgY2FuIGFs c28gdXNlIFJDVSB0byBhdm9pZCBkZXJlZmVyZW5jaW5nDQorZnJlZWQgbWVtb3J5LCBidXQgYW4g ZXhwbGFuYXRpb24gb2YgdGhhdCBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMNCitkb2N1bWVu dC4NCisNCitBZHZhbmNlZCBBUEkNCis9PT09PT09PT09PT0NCisNCitUaGUgYWR2YW5jZWQgQVBJ IG9mZmVycyBtb3JlIGZsZXhpYmlsaXR5IGFuZCBiZXR0ZXIgcGVyZm9ybWFuY2UgYXQgdGhlDQor Y29zdCBvZiBhbiBpbnRlcmZhY2Ugd2hpY2ggY2FuIGJlIGhhcmRlciB0byB1c2UgYW5kIGhhcyBm ZXdlciBzYWZlZ3VhcmRzLg0KK1lvdSBtdXN0IHRha2UgY2FyZSBvZiB5b3VyIG93biBsb2NraW5n IHdoaWxlIHVzaW5nIHRoZSBhZHZhbmNlZCBBUEkuDQorWW91IGNhbiB1c2UgdGhlIG1hX2xvY2ss IFJDVSBvciBhbiBleHRlcm5hbCBsb2NrIGZvciBwcm90ZWN0aW9uLg0KK1lvdSBjYW4gbWl4IGFk dmFuY2VkIGFuZCBub3JtYWwgb3BlcmF0aW9ucyBvbiB0aGUgc2FtZSBhcnJheSwgYXMgbG9uZw0K K2FzIHRoZSBsb2NraW5nIGlzIGNvbXBhdGlibGUuICBUaGUgbm9ybWFsIEFQSSBpcyBpbXBsZW1l bnRlZCBpbiB0ZXJtcw0KK29mIHRoZSBhZHZhbmNlZCBBUEkuDQorDQorVGhlIGFkdmFuY2VkIEFQ SSBpcyBiYXNlZCBhcm91bmQgdGhlIG1hX3N0YXRlLCB0aGlzIGlzIHdoZXJlIHRoZSAnbWFzJw0K K3ByZWZpeCBvcmlnaW5hdGVzLiAgVGhlIG1hX3N0YXRlIHN0cnVjdCBrZWVwcyB0cmFjayBvZiB0 cmVlIG9wZXJhdGlvbnMgdG8gbWFrZQ0KK2xpZmUgZWFzaWVyIGZvciBib3RoIGludGVybmFsIGFu ZCBleHRlcm5hbCB0cmVlIHVzZXJzLg0KKw0KK0luaXRpYWxpc2luZyB0aGUgbWFwbGUgdHJlZSBp cyB0aGUgc2FtZSBhcyBpbiB0aGUgbm9ybWFsIEFQSS4gIFBsZWFzZSBzZWUNCithYm92ZS4NCisN CitUaGUgbWFwbGUgc3RhdGUga2VlcHMgdHJhY2sgb2YgdGhlIHJhbmdlIHN0YXJ0IGFuZCBlbmQg aW4gbWFzLT5pbmRleCBhbmQNCittYXMtPmxhc3QsIHJlc3BlY3RpdmVseS4NCisNCittYXNfd2Fs aygpIHdpbGwgd2FsayB0aGUgdHJlZSB0byB0aGUgbG9jYXRpb24gb2YgaW5kZXggYW5kIHNldCB0 aGUgaW5kZXgNCithbmQgbGFzdCBhY2NvcmRpbmcgdG8gdGhlIHJhbmdlIGZvciB0aGUgZW50cnku DQorDQorWW91IGNhbiBzZXQgZW50cmllcyB1c2luZyBtYXNfc3RvcmUoKS4gIG1hc19zdG9yZSgp IHdpbGwgb3ZlcndyaXRlIGFueSBlbnRyeQ0KK3dpdGggdGhlIG5ldyBlbnRyeSBhbmQgcmV0dXJu IHRoZSBmaXJzdCBleGlzdGluZyBlbnRyeSB0aGF0IGlzIG92ZXJ3cml0dGVuLg0KK1RoZSByYW5n ZSBpcyBwYXNzZWQgaW4gYXMgbWVtYmVycyBvZiB0aGUgbWFwbGUgc3RhdGU6IGluZGV4IGFuZCBs YXN0Lg0KKw0KK1lvdSBjYW4gdXNlIG1hc19lcmFzZSgpIHRvIGVyYXNlIGFuIGVudGlyZSByYW5n ZSBieSBzZXR0aW5nIGluZGV4IGFuZA0KK2xhc3Qgb2YgdGhlIG1hcGxlIHN0YXRlIHRvIHRoZSBk ZXNpcmVkIHJhbmdlIHRvIGVyYXNlLiAgVGhpcyB3aWxsIGVyYXNlDQordGhlIGZpcnN0IHJhbmdl IHRoYXQgaXMgZm91bmQgaW4gdGhhdCByYW5nZSwgc2V0IHRoZSBtYXBsZSBzdGF0ZSBpbmRleA0K K2FuZCBsYXN0IGFzIHRoZSByYW5nZSB0aGF0IHdhcyBlcmFzZWQgYW5kIHJldHVybiB0aGUgZW50 cnkgdGhhdCBleGlzdGVkDQorYXQgdGhhdCBsb2NhdGlvbi4NCisNCitZb3UgY2FuIHdhbGsgZWFj aCBlbnRyeSB3aXRoaW4gYSByYW5nZSBieSB1c2luZyBtYXNfZm9yX2VhY2goKS4gIElmIHlvdSB3 YW50IHRvDQord2FsayBlYWNoIGVsZW1lbnQgb2YgdGhlIHRyZWUgdGhlbiAwIGFuZCBgYFVMT05H X01BWGBgIG1heSBiZSB1c2VkIGFzIHRoZQ0KK3JhbmdlLiAgSWYgdGhlIGxvY2sgbmVlZHMgdG8g YmUgcGVyaW9kaWNhbGx5IGRyb3BwZWQsIHNlZSB0aGUgbG9ja2luZyBzZWN0aW9uDQorbWFzX3Bh dXNlKCkuDQorDQorVXNpbmcgYSBtYXBsZSBzdGF0ZSBhbGxvd3MgbWFzX25leHQoKSBhbmQgbWFz X3ByZXYoKSB0byBmdW5jdGlvbiBhcyBpZiB0aGUNCit0cmVlIHdhcyBhIGxpbmtlZCBsaXN0LiAg V2l0aCBzdWNoIGEgaGlnaCBicmFuY2hpbmcgZmFjdG9yIHRoZSBhbW9ydGl6ZWQNCitwZXJmb3Jt YW5jZSBwZW5hbHR5IGlzIG91dHdlaWdoZWQgYnkgY2FjaGUgb3B0aW1pemF0aW9uLiAgbWFzX25l eHQoKSB3aWxsDQorcmV0dXJuIHRoZSBuZXh0IGVudHJ5IHdoaWNoIG9jY3VycyBhZnRlciB0aGUg ZW50cnkgYXQgaW5kZXguICBtYXNfcHJldigpDQord2lsbCByZXR1cm4gdGhlIHByZXZpb3VzIGVu dHJ5IHdoaWNoIG9jY3VycyBiZWZvcmUgdGhlIGVudHJ5IGF0IGluZGV4Lg0KKw0KK21hc19maW5k KCkgd2lsbCBmaW5kIHRoZSBmaXJzdCBlbnRyeSB3aGljaCBleGlzdHMgYXQgb3IgYWJvdmUgaW5k ZXggb24NCit0aGUgZmlyc3QgY2FsbCwgYW5kIHRoZSBuZXh0IGVudHJ5IGZyb20gZXZlcnkgc3Vi c2VxdWVudCBjYWxscy4NCisNCittYXNfZmluZF9yZXYoKSB3aWxsIGZpbmQgdGhlIGZpc3QgZW50 cnkgd2hpY2ggZXhpc3RzIGF0IG9yIGJlbG93IHRoZSBsYXN0IG9uDQordGhlIGZpcnN0IGNhbGws IGFuZCB0aGUgcHJldmlvdXMgZW50cnkgZnJvbSBldmVyeSBzdWJzZXF1ZW50IGNhbGxzLg0KKw0K K0lmIHRoZSB1c2VyIG5lZWRzIHRvIHlpZWxkIHRoZSBsb2NrIGR1cmluZyBhbiBvcGVyYXRpb24s IHRoZW4gdGhlIG1hcGxlIHN0YXRlDQorbXVzdCBiZSBwYXVzZWQgdXNpbmcgbWFzX3BhdXNlKCku DQorDQorVGhlcmUgYXJlIGEgZmV3IGV4dHJhIGludGVyZmFjZXMgcHJvdmlkZWQgd2hlbiB1c2lu ZyBhbiBhbGxvY2F0aW9uIHRyZWUuDQorSWYgeW91IHdpc2ggdG8gc2VhcmNoIGZvciBhIGdhcCB3 aXRoaW4gYSByYW5nZSwgdGhlbiBtYXNfZW1wdHlfYXJlYSgpDQorb3IgbWFzX2VtcHR5X2FyZWFf cmV2KCkgY2FuIGJlIHVzZWQuICBtYXNfZW1wdHlfYXJlYSBzZWFyY2hlcyBmb3IgYQ0KK2dhcCBz dGFydGluZyBhdCB0aGUgbG93ZXN0IGluZGV4IGdpdmVuIHVwIHRvIHRoZSBtYXhpbXVtIG9mIHRo ZSByYW5nZS4NCittYXNfZW1wdHlfYXJlYV9yZXYgc2VhcmNoZXMgZm9yIGEgZ2FwIHN0YXJ0aW5n IGF0IHRoZSBoaWdoZXN0IGluZGV4DQorZ2l2ZW4gYW5kIGNvbnRpbnVlcyBkb3dud2FyZCB0byB0 aGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLg0KKw0KK0FsbG9jYXRpbmcgTm9kZXMNCistLS0t LS0tLS0tLS0tLS0tDQorDQorQWxsb2NhdGlvbnMgYXJlIHVzdWFsbHkgaGFuZGxlZCBpbnRlcm5h bGx5IHRvIHRoZSB0cmVlLCBob3dldmVyIGlmIGFsbG9jYXRpb25zDQorbmVlZCB0byBvY2N1ciBi ZWZvcmUgYSB3cml0ZSBvY2N1cnMgdGhlbiBjYWxsaW5nIG1hc19lbnRyeV9jb3VudCgpIHdpbGwN CithbGxvY2F0ZSB0aGUgd29yc3QtY2FzZSBudW1iZXIgb2YgbmVlZGVkIG5vZGVzIHRvIGluc2Vy dCB0aGUgcHJvdmlkZWQgbnVtYmVyIG9mDQorcmFuZ2VzLiAgVGhpcyBhbHNvIGNhdXNlcyB0aGUg dHJlZSB0byBlbnRlciBtYXNzIGluc2VydGlvbiBtb2RlLiAgT25jZQ0KK2luc2VydGlvbnMgYXJl IGNvbXBsZXRlIGNhbGxpbmcgbWFzX2Rlc3Ryb3koKSBvbiB0aGUgbWFwbGUgc3RhdGUgd2lsbCBm cmVlIHRoZQ0KK3VudXNlZCBhbGxvY2F0aW9ucy4NCisNCitGdW5jdGlvbnMgYW5kIHN0cnVjdHVy ZXMNCis9PT09PT09PT09PT09PT09PT09PT09PT0NCisNCisuLiBrZXJuZWwtZG9jOjogaW5jbHVk ZS9saW51eC9tYXBsZV90cmVlLmgNCisuLiBrZXJuZWwtZG9jOjogbGliL21hcGxlX3RyZWUuYw0K Kw0KZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMNCmluZGV4IGY0MTA4ODQx OGFhZS4uYTM1NDc4YTNkZWUzIDEwMDY0NA0KLS0tIGEvTUFJTlRBSU5FUlMNCisrKyBiL01BSU5U QUlORVJTDQpAQCAtMTE0MTUsNiArMTE0MTUsMTggQEAgTDoJbGludXgtbWFuQHZnZXIua2VybmVs Lm9yZw0KIFM6CU1haW50YWluZWQNCiBXOglodHRwOi8vd3d3Lmtlcm5lbC5vcmcvZG9jL21hbi1w YWdlcw0KIA0KK01BUExFIFRSRUUNCitNOglMaWFtIFIuIEhvd2xldHQgPExpYW0uSG93bGV0dEBv cmFjbGUuY29tPg0KK0w6CWxpbnV4LW1tQGt2YWNrLm9yZw0KK1M6CVN1cHBvcnRlZA0KK0Y6CURv Y3VtZW50YXRpb24vY29yZS1hcGkvbWFwbGVfdHJlZS5yc3QNCitGOglpbmNsdWRlL2xpbnV4L21h cGxlX3RyZWUuaA0KK0Y6CWluY2x1ZGUvdHJhY2UvZXZlbnRzL21hcGxlX3RyZWUuaA0KK0Y6CWxp Yi9tYXBsZV90cmVlLmMNCitGOglsaWIvdGVzdF9tYXBsZV90cmVlLmMNCitGOgl0b29scy90ZXN0 aW5nL19hZGl4LXRyZWUvbGludXgvbWFwbGVfdHJlZS5oDQorRjoJdG9vbHMvdGVzdGluZy9yYWRp eC10cmVlL21hcGxlLmMNCisNCiBNQVJEVUsgKENSRUFUT1IgQ0k0MCkgREVWSUNFIFRSRUUgU1VQ UE9SVA0KIE06CVJhaHVsIEJlZGFya2FyIDxyYWh1bGJlZGFya2FyODlAZ21haWwuY29tPg0KIEw6 CWxpbnV4LW1pcHNAdmdlci5rZXJuZWwub3JnDQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9t YXBsZV90cmVlLmggYi9pbmNsdWRlL2xpbnV4L21hcGxlX3RyZWUuaA0KbmV3IGZpbGUgbW9kZSAx MDA2NDQNCmluZGV4IDAwMDAwMDAwMDAwMC4uMTRkZGVhYThmM2U3DQotLS0gL2Rldi9udWxsDQor KysgYi9pbmNsdWRlL2xpbnV4L21hcGxlX3RyZWUuaA0KQEAgLTAsMCArMSw2NzMgQEANCisvKiBT UERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsgKi8NCisjaWZuZGVmIF9MSU5VWF9NQVBM RV9UUkVFX0gNCisjZGVmaW5lIF9MSU5VWF9NQVBMRV9UUkVFX0gNCisvKg0KKyAqIE1hcGxlIFRy ZWUgLSBBbiBSQ1Utc2FmZSBhZGFwdGl2ZSB0cmVlIGZvciBzdG9yaW5nIHJhbmdlcw0KKyAqIENv cHlyaWdodCAoYykgMjAxOCBPcmFjbGUNCisgKiBBdXRob3JzOiAgICAgTGlhbSBSLiBIb3dsZXR0 IDxMaWFtLkhvd2xldHRAT3JhY2xlLmNvbT4NCisgKiAgICAgICAgICAgICAgTWF0dGhldyBXaWxj b3ggPHdpbGx5QGluZnJhZGVhZC5vcmc+DQorICovDQorDQorI2luY2x1ZGUgPGxpbnV4L2tlcm5l bC5oPg0KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPg0KKyNpbmNsdWRlIDxsaW51eC9zcGlu bG9jay5oPg0KKy8qICNkZWZpbmUgQ09ORklHX01BUExFX1JDVV9ESVNBQkxFRCAqLw0KKy8qICNk ZWZpbmUgQ09ORklHX0RFQlVHX01BUExFX1RSRUVfVkVSQk9TRSAqLw0KKw0KKy8qDQorICogQWxs b2NhdGVkIG5vZGVzIGFyZSBtdXRhYmxlIHVudGlsIHRoZXkgaGF2ZSBiZWVuIGluc2VydGVkIGlu dG8gdGhlIHRyZWUsDQorICogYXQgd2hpY2ggdGltZSB0aGV5IGNhbm5vdCBjaGFuZ2UgdGhlaXIg dHlwZSB1bnRpbCB0aGV5IGhhdmUgYmVlbiByZW1vdmVkDQorICogZnJvbSB0aGUgdHJlZSBhbmQg YW4gUkNVIGdyYWNlIHBlcmlvZCBoYXMgcGFzc2VkLg0KKyAqDQorICogUmVtb3ZlZCBub2RlcyBo YXZlIHRoZWlyIC0+cGFyZW50IHNldCB0byBwb2ludCB0byB0aGVtc2VsdmVzLiAgUkNVIHJlYWRl cnMNCisgKiBjaGVjayAtPnBhcmVudCBiZWZvcmUgcmVseWluZyBvbiB0aGUgdmFsdWUgdGhhdCB0 aGV5IGxvYWRlZCBmcm9tIHRoZQ0KKyAqIHNsb3RzIGFycmF5LiAgVGhpcyBsZXRzIHVzIHJldXNl IHRoZSBzbG90cyBhcnJheSBmb3IgdGhlIFJDVSBoZWFkLg0KKyAqDQorICogTm9kZXMgaW4gdGhl IHRyZWUgcG9pbnQgdG8gdGhlaXIgcGFyZW50IHVubGVzcyBiaXQgMCBpcyBzZXQuDQorICovDQor I2lmIGRlZmluZWQoQ09ORklHXzY0QklUKSB8fCBkZWZpbmVkKEJVSUxEX1ZEU08zMl82NCkNCisv KiA2NGJpdCBzaXplcyAqLw0KKyNkZWZpbmUgTUFQTEVfTk9ERV9TTE9UUwkzMQkvKiAyNTYgYnl0 ZXMgaW5jbHVkaW5nIC0+cGFyZW50ICovDQorI2RlZmluZSBNQVBMRV9SQU5HRTY0X1NMT1RTCTE2 CS8qIDI1NiBieXRlcyAqLw0KKyNkZWZpbmUgTUFQTEVfQVJBTkdFNjRfU0xPVFMJMTAJLyogMjQw IGJ5dGVzICovDQorI2RlZmluZSBNQVBMRV9BUkFOR0U2NF9NRVRBX01BWAkxNQkvKiBPdXQgb2Yg cmFuZ2UgZm9yIG1ldGFkYXRhICovDQorI2RlZmluZSBNQVBMRV9BTExPQ19TTE9UUwkoTUFQTEVf Tk9ERV9TTE9UUyAtIDEpDQorI2Vsc2UNCisvKiAzMmJpdCBzaXplcyAqLw0KKyNkZWZpbmUgTUFQ TEVfTk9ERV9TTE9UUwk2MwkvKiAyNTYgYnl0ZXMgaW5jbHVkaW5nIC0+cGFyZW50ICovDQorI2Rl ZmluZSBNQVBMRV9SQU5HRTY0X1NMT1RTCTMyCS8qIDI1NiBieXRlcyAqLw0KKyNkZWZpbmUgTUFQ TEVfQVJBTkdFNjRfU0xPVFMJMjEJLyogMjQwIGJ5dGVzICovDQorI2RlZmluZSBNQVBMRV9BUkFO R0U2NF9NRVRBX01BWAkyMgkvKiBPdXQgb2YgcmFuZ2UgZm9yIG1ldGFkYXRhICovDQorI2RlZmlu ZSBNQVBMRV9BTExPQ19TTE9UUwkoTUFQTEVfTk9ERV9TTE9UUyAtIDIpDQorI2VuZGlmIC8qIGRl ZmluZWQoQ09ORklHXzY0QklUKSB8fCBkZWZpbmVkKEJVSUxEX1ZEU08zMl82NCkgKi8NCisNCisj ZGVmaW5lIE1BUExFX05PREVfTUFTSwkJMjU1VUwNCisNCisvKg0KKyAqIFRoZSBub2RlLT5wYXJl bnQgb2YgdGhlIHJvb3Qgbm9kZSBoYXMgYml0IDAgc2V0IGFuZCB0aGUgcmVzdCBvZiB0aGUgcG9p bnRlcg0KKyAqIGlzIGEgcG9pbnRlciB0byB0aGUgdHJlZSBpdHNlbGYuICBObyBtb3JlIGJpdHMg YXJlIGF2YWlsYWJsZSBpbiB0aGlzIHBvaW50ZXINCisgKiAob24gbTY4aywgdGhlIGRhdGEgc3Ry dWN0dXJlIG1heSBvbmx5IGJlIDItYnl0ZSBhbGlnbmVkKS4NCisgKg0KKyAqIEludGVybmFsIG5v bi1yb290IG5vZGVzIGNhbiBvbmx5IGhhdmUgbWFwbGVfcmFuZ2VfKiBub2RlcyBhcyBwYXJlbnRz LiAgVGhlDQorICogcGFyZW50IHBvaW50ZXIgaXMgMjU2QiBhbGlnbmVkIGxpa2UgYWxsIG90aGVy IHRyZWUgbm9kZXMuICBXaGVuIHN0b3JpbmcgYSAzMg0KKyAqIG9yIDY0IGJpdCB2YWx1ZXMsIHRo ZSBvZmZzZXQgY2FuIGZpdCBpbnRvIDQgYml0cy4gIFRoZSAxNiBiaXQgdmFsdWVzIG5lZWQgYW4N CisgKiBleHRyYSBiaXQgdG8gc3RvcmUgdGhlIG9mZnNldC4gIFRoaXMgZXh0cmEgYml0IGNvbWVz IGZyb20gYSByZXVzZSBvZiB0aGUgbGFzdA0KKyAqIGJpdCBpbiB0aGUgbm9kZSB0eXBlLiAgVGhp cyBpcyBwb3NzaWJsZSBieSB1c2luZyBiaXQgMSB0byBpbmRpY2F0ZSBpZiBiaXQgMg0KKyAqIGlz IHBhcnQgb2YgdGhlIHR5cGUgb3IgdGhlIHNsb3QuDQorICoNCisgKiBPbmNlIHRoZSB0eXBlIGlz IGRlY2lkZWQsIHRoZSBkZWNpc2lvbiBvZiBhbiBhbGxvY2F0aW9uIHJhbmdlIHR5cGUgb3IgYSBy YW5nZQ0KKyAqIHR5cGUgaXMgZG9uZSBieSBleGFtaW5pbmcgdGhlIGltbXV0YWJsZSB0cmVlIGZs YWcgZm9yIHRoZSBNQVBMRV9BTExPQ19SQU5HRQ0KKyAqIGZsYWcuDQorICoNCisgKiAgTm9kZSB0 eXBlczoNCisgKiAgIDB4Pz8xID0gUm9vdA0KKyAqICAgMHg/MDAgPSAxNiBiaXQgbm9kZXMNCisg KiAgIDB4MDEwID0gMzIgYml0IG5vZGVzDQorICogICAweDExMCA9IDY0IGJpdCBub2Rlcw0KKyAq DQorICogIFNsb3Qgc2l6ZSBhbmQgbG9jYXRpb24gaW4gdGhlIHBhcmVudCBwb2ludGVyOg0KKyAq ICAgdHlwZSAgOiBzbG90IGxvY2F0aW9uDQorICogICAweD8/MSA6IFJvb3QNCisgKiAgIDB4PzAw IDogMTYgYml0IHZhbHVlcywgdHlwZSBpbiAwLTEsIHNsb3QgaW4gMi02DQorICogICAweDAxMCA6 IDMyIGJpdCB2YWx1ZXMsIHR5cGUgaW4gMC0yLCBzbG90IGluIDMtNg0KKyAqICAgMHgxMTAgOiA2 NCBiaXQgdmFsdWVzLCB0eXBlIGluIDAtMiwgc2xvdCBpbiAzLTYNCisgKi8NCit0eXBlZGVmIHN0 cnVjdCBtYXBsZV9lbm9kZSAqbWFwbGVfZW5vZGU7IC8qIGVuY29kZWQgbm9kZSAqLw0KK3R5cGVk ZWYgc3RydWN0IG1hcGxlX3Bub2RlICptYXBsZV9wbm9kZTsgLyogcGFyZW50IG5vZGUgKi8NCisN CisNCisvKg0KKyAqIFRoZSBub2RlLT5tZXRhIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBp biBhbGxvY2F0aW9uIHJhbmdlIDY0IChhcmFuZ2VfNjQpDQorICogbm9kZSB0eXBlLiAgQXMgYSBy ZXN1bHQgb2YgdHJhY2tpbmcgZ2FwcywgdGhlcmUgaXMgYSBzbWFsbCBhcmVhIHRoYXQgaXMgbm90 DQorICogdXNlZCBmb3IgZGF0YSBzdG9yYWdlIGluIHRoaXMgbm9kZSB0eXBlLiAgVGhpcyBhcmVh IGlzIHJldXNlZCB0byBzdG9yZQ0KKyAqIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIG5vZGUgaXRz ZWxmIGluY2x1ZGluZyB0aGUgZGF0YSBlbmQgYW5kIHRoZSBsYXJnZXN0DQorICogZ2FwIGxvY2F0 aW9uLiAgVGhpcyBtZXRhZGF0YSBpcyB1c2VkIHRvIG9wdGltaXplIHRoZSBnYXAgdXBkYXRpbmcg Y29kZSBhbmQgaW4NCisgKiByZXZlcnNlIHNlYXJjaGluZyBmb3IgZ2FwcyBvciBhbnkgb3RoZXIg Y29kZSB0aGF0IG5lZWRzIHRvIGZpbmQgdGhlIGVuZCBvZg0KKyAqIHRoZSBkYXRhLg0KKyAqLw0K K3N0cnVjdCBtYXBsZV9tZXRhZGF0YSB7DQorCXVuc2lnbmVkIGNoYXIgZW5kOw0KKwl1bnNpZ25l ZCBjaGFyIGdhcDsNCisNCit9Ow0KKw0KKy8qDQorICogTGVhZiBub2RlcyBkbyBub3Qgc3RvcmUg cG9pbnRlcnMgdG8gbm9kZXMsIHRoZXkgc3RvcmUgdXNlciBkYXRhLiAgVXNlcnMgbWF5DQorICog c3RvcmUgYWxtb3N0IGFueSBiaXQgcGF0dGVybi4gIEFzIG5vdGVkIGFib3ZlLCB0aGUgb3B0aW1p c2F0aW9uIG9mIHN0b3JpbmcgYW4NCisgKiBlbnRyeSBhdCAwIGluIHRoZSByb290IHBvaW50ZXIg Y2Fubm90IGJlIGRvbmUgZm9yIGRhdGEgd2hpY2ggaGF2ZSB0aGUgYm90dG9tDQorICogdHdvIGJp dHMgc2V0IHRvICcxMCcuICBXZSBhbHNvIHJlc2VydmUgdmFsdWVzIHdpdGggdGhlIGJvdHRvbSB0 d28gYml0cyBzZXQgdG8NCisgKiAnMTAnIHdoaWNoIGFyZSBiZWxvdyA0MDk2IChpZSAyLCA2LCAx MCAuLiA0MDk0KSBmb3IgaW50ZXJuYWwgdXNlLiAgU29tZSBBUElzDQorICogcmV0dXJuIGVycm5v cyBhcyBhIG5lZ2F0aXZlIGVycm5vIHNoaWZ0ZWQgcmlnaHQgYnkgdHdvIGJpdHMgYW5kIHRoZSBi b3R0b20NCisgKiB0d28gYml0cyBzZXQgdG8gJzEwJywgYW5kIHdoaWxlIGNob29zaW5nIHRvIHN0 b3JlIHRoZXNlIHZhbHVlcyBpbiB0aGUgYXJyYXkNCisgKiBpcyBub3QgYW4gZXJyb3IsIGl0IG1h eSBsZWFkIHRvIGNvbmZ1c2lvbiBpZiB5b3UncmUgdGVzdGluZyBmb3IgYW4gZXJyb3Igd2l0aA0K KyAqIG1hc19pc19lcnIoKS4NCisgKg0KKyAqIE5vbi1sZWFmIG5vZGVzIHN0b3JlIHRoZSB0eXBl IG9mIHRoZSBub2RlIHBvaW50ZWQgdG8gKGVudW0gbWFwbGVfdHlwZSBpbiBiaXRzDQorICogMy02 KSwgYml0IDIgaXMgcmVzZXJ2ZWQuICBUaGF0IGxlYXZlcyBiaXRzIDAtMSB1bnVzZWQgZm9yIG5v dy4NCisgKg0KKyAqIEluIHJlZ3VsYXIgQi1UcmVlIHRlcm1zLCBwaXZvdHMgYXJlIGNhbGxlZCBr ZXlzLiAgVGhlIHRlcm0gcGl2b3QgaXMgdXNlZCB0bw0KKyAqIGluZGljYXRlIHRoYXQgdGhlIHRy ZWUgaXMgc3BlY2lmeWluZyByYW5nZXMsICBQaXZvdHMgbWF5IGFwcGVhciBpbiB0aGUNCisgKiBz dWJ0cmVlIHdpdGggYW4gZW50cnkgYXR0YWNoZWQgdG8gdGhlIHZhbHVlIHdoZXJlYXMga2V5cyBh cmUgdW5pcXVlIHRvIGENCisgKiBzcGVjaWZpYyBwb3NpdGlvbiBvZiBhIEItdHJlZS4gIFBpdm90 IHZhbHVlcyBhcmUgaW5jbHVzaXZlIG9mIHRoZSBzbG90IHdpdGgNCisgKiB0aGUgc2FtZSBpbmRl eC4NCisgKi8NCisNCitzdHJ1Y3QgbWFwbGVfcmFuZ2VfNjQgew0KKwlzdHJ1Y3QgbWFwbGVfcG5v ZGUgKnBhcmVudDsNCisJdW5zaWduZWQgbG9uZyBwaXZvdFtNQVBMRV9SQU5HRTY0X1NMT1RTIC0g MV07DQorCXVuaW9uIHsNCisJCXZvaWQgX19yY3UgKnNsb3RbTUFQTEVfUkFOR0U2NF9TTE9UU107 DQorCQlzdHJ1Y3Qgew0KKwkJCXZvaWQgX19yY3UgKnBhZFtNQVBMRV9SQU5HRTY0X1NMT1RTIC0g MV07DQorCQkJc3RydWN0IG1hcGxlX21ldGFkYXRhIG1ldGE7DQorCQl9Ow0KKwl9Ow0KK307DQor DQorLyoNCisgKiBBdCB0cmVlIGNyZWF0aW9uIHRpbWUsIHRoZSB1c2VyIGNhbiBzcGVjaWZ5IHRo YXQgdGhleSdyZSB3aWxsaW5nIHRvIHRyYWRlIG9mZg0KKyAqIHN0b3JpbmcgZmV3ZXIgZW50cmll cyBpbiBhIHRyZWUgaW4gcmV0dXJuIGZvciBzdG9yaW5nIG1vcmUgaW5mb3JtYXRpb24gaW4NCisg KiBlYWNoIG5vZGUuDQorICoNCisgKiBUaGUgbWFwbGUgdHJlZSBzdXBwb3J0cyByZWNvcmRpbmcg dGhlIGxhcmdlc3QgcmFuZ2Ugb2YgTlVMTCBlbnRyaWVzIGF2YWlsYWJsZQ0KKyAqIGluIHRoaXMg bm9kZSwgYWxzbyBjYWxsZWQgZ2Fwcy4gIFRoaXMgb3B0aW1pc2VzIHRoZSB0cmVlIGZvciBhbGxv Y2F0aW5nIGENCisgKiByYW5nZS4NCisgKi8NCitzdHJ1Y3QgbWFwbGVfYXJhbmdlXzY0IHsNCisJ c3RydWN0IG1hcGxlX3Bub2RlICpwYXJlbnQ7DQorCXVuc2lnbmVkIGxvbmcgcGl2b3RbTUFQTEVf QVJBTkdFNjRfU0xPVFMgLSAxXTsNCisJdm9pZCBfX3JjdSAqc2xvdFtNQVBMRV9BUkFOR0U2NF9T TE9UU107DQorCXVuc2lnbmVkIGxvbmcgZ2FwW01BUExFX0FSQU5HRTY0X1NMT1RTXTsNCisJc3Ry dWN0IG1hcGxlX21ldGFkYXRhIG1ldGE7DQorfTsNCisNCitzdHJ1Y3QgbWFwbGVfYWxsb2Mgew0K Kwl1bnNpZ25lZCBsb25nIHRvdGFsOw0KKwl1bnNpZ25lZCBjaGFyIG5vZGVfY291bnQ7DQorCXVu c2lnbmVkIGludCByZXF1ZXN0X2NvdW50Ow0KKwlzdHJ1Y3QgbWFwbGVfYWxsb2MgKnNsb3RbTUFQ TEVfQUxMT0NfU0xPVFNdOw0KK307DQorDQorc3RydWN0IG1hcGxlX3RvcGlhcnkgew0KKwlzdHJ1 Y3QgbWFwbGVfcG5vZGUgKnBhcmVudDsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpuZXh0OyAvKiBP dmVybGFwcyB0aGUgcGl2b3QgKi8NCit9Ow0KKw0KK2VudW0gbWFwbGVfdHlwZSB7DQorCW1hcGxl X2RlbnNlLA0KKwltYXBsZV9sZWFmXzY0LA0KKwltYXBsZV9yYW5nZV82NCwNCisJbWFwbGVfYXJh bmdlXzY0LA0KK307DQorDQorDQorLyoqDQorICogRE9DOiBNYXBsZSB0cmVlIGZsYWdzDQorICoN CisgKiAqIE1UX0ZMQUdTX0FMTE9DX1JBTkdFCS0gVHJhY2sgZ2FwcyBpbiB0aGlzIHRyZWUNCisg KiAqIE1UX0ZMQUdTX1VTRV9SQ1UJCS0gT3BlcmF0ZSBpbiBSQ1UgbW9kZQ0KKyAqICogTVRfRkxB R1NfSEVJR0hUX09GRlNFVAktIFRoZSBwb3NpdGlvbiBvZiB0aGUgdHJlZSBoZWlnaHQgaW4gdGhl IGZsYWdzDQorICogKiBNVF9GTEFHU19IRUlHSFRfTUFTSwktIFRoZSBtYXNrIGZvciB0aGUgbWFw bGUgdHJlZSBoZWlnaHQgdmFsdWUNCisgKiAqIE1UX0ZMQUdTX0xPQ0tfTUFTSwkJLSBIb3cgdGhl IG10X2xvY2sgaXMgdXNlZA0KKyAqICogTVRfRkxBR1NfTE9DS19JUlEJCS0gQWNxdWlyZWQgaXJx LXNhZmUNCisgKiAqIE1UX0ZMQUdTX0xPQ0tfQkgJCS0gQWNxdWlyZWQgYmgtc2FmZQ0KKyAqICog TVRfRkxBR1NfTE9DS19FWFRFUk4JLSBtdF9sb2NrIGlzIG5vdCB1c2VkDQorICoNCisgKiBNQVBM RV9IRUlHSFRfTUFYCVRoZSBsYXJnZXN0IGhlaWdodCB0aGF0IGNhbiBiZSBzdG9yZWQNCisgKi8N CisjZGVmaW5lIE1UX0ZMQUdTX0FMTE9DX1JBTkdFCTB4MDENCisjZGVmaW5lIE1UX0ZMQUdTX1VT RV9SQ1UJMHgwMg0KKyNkZWZpbmUJTVRfRkxBR1NfSEVJR0hUX09GRlNFVAkweDAyDQorI2RlZmlu ZQlNVF9GTEFHU19IRUlHSFRfTUFTSwkweDdDDQorI2RlZmluZSBNVF9GTEFHU19MT0NLX01BU0sJ MHgzMDANCisjZGVmaW5lIE1UX0ZMQUdTX0xPQ0tfSVJRCTB4MTAwDQorI2RlZmluZSBNVF9GTEFH U19MT0NLX0JICTB4MjAwDQorI2RlZmluZSBNVF9GTEFHU19MT0NLX0VYVEVSTgkweDMwMA0KKw0K KyNkZWZpbmUgTUFQTEVfSEVJR0hUX01BWAkzMQ0KKw0KKw0KKyNkZWZpbmUgTUFQTEVfTk9ERV9U WVBFX01BU0sJMHgwRg0KKyNkZWZpbmUgTUFQTEVfTk9ERV9UWVBFX1NISUZUCTB4MDMNCisNCisj ZGVmaW5lIE1BUExFX1JFU0VSVkVEX1JBTkdFCTQwOTYNCisNCisjaWZkZWYgQ09ORklHX0xPQ0tE RVANCit0eXBlZGVmIHN0cnVjdCBsb2NrZGVwX21hcCAqbG9ja2RlcF9tYXBfcDsNCisjZGVmaW5l IG10X2xvY2tfaXNfaGVsZChtdCkJbG9ja19pc19oZWxkKG10LT5tYV9leHRlcm5hbF9sb2NrKQ0K KyNkZWZpbmUgbXRfc2V0X2V4dGVybmFsX2xvY2sobXQsIGxvY2spCQkJCQlcDQorCShtdCktPm1h X2V4dGVybmFsX2xvY2sgPSAmKGxvY2spLT5kZXBfbWFwOw0KKyNlbHNlDQordHlwZWRlZiBzdHJ1 Y3QgeyAvKiBub3RoaW5nICovIH0gbG9ja2RlcF9tYXBfcDsNCisjZGVmaW5lIG10X2xvY2tfaXNf aGVsZChtdCkJMQ0KKyNkZWZpbmUgbXRfc2V0X2V4dGVybmFsX2xvY2sobXQsIGxvY2spCWRvIHsg fSB3aGlsZSAoMCkNCisjZW5kaWYNCisNCisvKg0KKyAqIElmIHRoZSB0cmVlIGNvbnRhaW5zIGEg c2luZ2xlIGVudHJ5IGF0IGluZGV4IDAsIGl0IGlzIHVzdWFsbHkgc3RvcmVkIGluDQorICogdHJl ZS0+bWFfcm9vdC4gIFRvIG9wdGltaXNlIGZvciB0aGUgcGFnZSBjYWNoZSwgYW4gZW50cnkgd2hp Y2ggZW5kcyBpbiAnMDAnLA0KKyAqICcwMScgb3IgJzExJyBpcyBzdG9yZWQgaW4gdGhlIHJvb3Qs IGJ1dCBhbiBlbnRyeSB3aGljaCBlbmRzIGluICcxMCcgd2lsbCBiZQ0KKyAqIHN0b3JlZCBpbiBh IG5vZGUuICBCaXRzIDMtNiBhcmUgdXNlZCB0byBzdG9yZSBlbnVtIG1hcGxlX3R5cGUuDQorICoN CisgKiBUaGUgZmxhZ3MgYXJlIHVzZWQgYm90aCB0byBzdG9yZSBzb21lIGltbXV0YWJsZSBpbmZv cm1hdGlvbiBhYm91dCB0aGlzIHRyZWUNCisgKiAoc2V0IGF0IHRyZWUgY3JlYXRpb24gdGltZSkg YW5kIGR5bmFtaWMgaW5mb3JtYXRpb24gc2V0IHVuZGVyIHRoZSBzcGlubG9jay4NCisgKg0KKyAq IEFub3RoZXIgdXNlIG9mIGZsYWdzIGFyZSB0byBpbmRpY2F0ZSBnbG9iYWwgc3RhdGVzIG9mIHRo ZSB0cmVlLiAgVGhpcyBpcyB0aGUNCisgKiBjYXNlIHdpdGggdGhlIE1BUExFX1VTRV9SQ1UgZmxh Zywgd2hpY2ggaW5kaWNhdGVzIHRoZSB0cmVlIGlzIGN1cnJlbnRseSBpbg0KKyAqIFJDVSBtb2Rl LiAgVGhpcyBtb2RlIHdhcyBhZGRlZCB0byBhbGxvdyB0aGUgdHJlZSB0byByZXVzZSBub2RlcyBp bnN0ZWFkIG9mDQorICogcmUtYWxsb2NhdGluZyBhbmQgUkNVIGZyZWVpbmcgbm9kZXMgd2hlbiB0 aGVyZSBpcyBhIHNpbmdsZSB1c2VyLg0KKyAqLw0KK3N0cnVjdCBtYXBsZV90cmVlIHsNCisJdW5p b24gew0KKwkJc3BpbmxvY2tfdAltYV9sb2NrOw0KKwkJbG9ja2RlcF9tYXBfcAltYV9leHRlcm5h bF9sb2NrOw0KKwl9Ow0KKwl1bnNpZ25lZCBpbnQJbWFfZmxhZ3M7DQorCXZvaWQgX19yY3UgICAg ICAqbWFfcm9vdDsNCit9Ow0KKw0KKw0KKyNkZWZpbmUgTVRSRUVfSU5JVChuYW1lLCBmbGFncykg ewkJCQkJXA0KKwkubWFfbG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKG5hbWUubWFfbG9jayks CQkJXA0KKwkubWFfZmxhZ3MgPSBmbGFncywJCQkJCQlcDQorCS5tYV9yb290ID0gTlVMTCwJCQkJ CQlcDQorfQ0KKw0KKyNpZmRlZiBDT05GSUdfTE9DS0RFUA0KKyNkZWZpbmUgTVRSRUVfSU5JVF9F WFQobmFtZSwgZmxhZ3MsIGxvY2spIHsJCQkJXA0KKwkubWFfZXh0ZXJuYWxfbG9jayA9ICYobG9j aykuZGVwX21hcCwJCQkJXA0KKwkubWFfZmxhZ3MgPSBmbGFncywJCQkJCQlcDQorCS5tYV9yb290 ID0gTlVMTCwJCQkJCQlcDQorfQ0KKyNlbHNlDQorI2RlZmluZSBNVFJFRV9JTklUX0VYVChuYW1l LCBmbGFncywgbG9jaykJTVRSRUVfSU5JVChuYW1lLCBmbGFncykNCisjZW5kaWYNCisNCisjZGVm aW5lIERFRklORV9NVFJFRShuYW1lKQkJCQkJCVwNCisJc3RydWN0IG1hcGxlX3RyZWUgbmFtZSA9 IE1UUkVFX0lOSVQobmFtZSwgMCkNCisNCisjZGVmaW5lIG10cmVlX2xvY2sobXQpCQlzcGluX2xv Y2soKCYobXQpLT5tYV9sb2NrKSkNCisjZGVmaW5lIG10cmVlX3VubG9jayhtdCkJc3Bpbl91bmxv Y2soKCYobXQpLT5tYV9sb2NrKSkNCisNCisvKg0KKyAqIFRoZSBNYXBsZSBUcmVlIHNxdWVlemVz IHZhcmlvdXMgYml0cyBpbiBhdCB2YXJpb3VzIHBvaW50cyB3aGljaCBhcmVuJ3QNCisgKiBuZWNl c3NhcmlseSBvYnZpb3VzLiAgVXN1YWxseSwgdGhpcyBpcyBkb25lIGJ5IG9ic2VydmluZyB0aGF0 IHBvaW50ZXJzIGFyZQ0KKyAqIE4tYnl0ZSBhbGlnbmVkIGFuZCB0aHVzIHRoZSBib3R0b20gbG9n XzIoTikgYml0cyBhcmUgYXZhaWxhYmxlIGZvciB1c2UuICBXZQ0KKyAqIGRvbid0IHVzZSB0aGUg aGlnaCBiaXRzIG9mIHBvaW50ZXJzIHRvIHN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYmVj YXVzZQ0KKyAqIHdlIGRvbid0IGtub3cgd2hhdCBiaXRzIGFyZSB1bnVzZWQgb24gYW55IGdpdmVu IGFyY2hpdGVjdHVyZS4NCisgKg0KKyAqIE5vZGVzIGFyZSAyNTYgYnl0ZXMgaW4gc2l6ZSBhbmQg YXJlIGFsc28gYWxpZ25lZCB0byAyNTYgYnl0ZXMsIGdpdmluZyB1cyA4DQorICogbG93IGJpdHMg Zm9yIG91ciBvd24gcHVycG9zZXMuICBOb2RlcyBhcmUgY3VycmVudGx5IG9mIDQgdHlwZXM6DQor ICogMS4gU2luZ2xlIHBvaW50ZXIgKFJhbmdlIGlzIDAtMCkNCisgKiAyLiBOb24tbGVhZiBBbGxv Y2F0aW9uIFJhbmdlIG5vZGVzDQorICogMy4gTm9uLWxlYWYgUmFuZ2Ugbm9kZXMNCisgKiA0LiBM ZWFmIFJhbmdlIG5vZGVzIEFsbCBub2RlcyBjb25zaXN0IG9mIGEgbnVtYmVyIG9mIG5vZGUgc2xv dHMsDQorICogICAgcGl2b3RzLCBhbmQgYSBwYXJlbnQgcG9pbnRlci4NCisgKi8NCisNCitzdHJ1 Y3QgbWFwbGVfbm9kZSB7DQorCXVuaW9uIHsNCisJCXN0cnVjdCB7DQorCQkJc3RydWN0IG1hcGxl X3Bub2RlICpwYXJlbnQ7DQorCQkJdm9pZCBfX3JjdSAqc2xvdFtNQVBMRV9OT0RFX1NMT1RTXTsN CisJCX07DQorCQlzdHJ1Y3Qgew0KKwkJCXZvaWQgKnBhZDsNCisJCQlzdHJ1Y3QgcmN1X2hlYWQg cmN1Ow0KKwkJCXN0cnVjdCBtYXBsZV9lbm9kZSAqcGl2X3BhcmVudDsNCisJCQl1bnNpZ25lZCBj aGFyIHBhcmVudF9zbG90Ow0KKwkJCWVudW0gbWFwbGVfdHlwZSB0eXBlOw0KKwkJCXVuc2lnbmVk IGNoYXIgc2xvdF9sZW47DQorCQkJdW5zaWduZWQgaW50IG1hX2ZsYWdzOw0KKwkJfTsNCisJCXN0 cnVjdCBtYXBsZV9yYW5nZV82NCBtcjY0Ow0KKwkJc3RydWN0IG1hcGxlX2FyYW5nZV82NCBtYTY0 Ow0KKwkJc3RydWN0IG1hcGxlX2FsbG9jIGFsbG9jOw0KKwl9Ow0KK307DQorDQorLyoNCisgKiBN b3JlIGNvbXBsaWNhdGVkIHN0b3JlcyBjYW4gY2F1c2UgdHdvIG5vZGVzIHRvIGJlY29tZSBvbmUg b3IgdHJlZSBhbmQNCisgKiBwb3RlbnRpYWxseSBhbHRlciB0aGUgaGVpZ2h0IG9mIHRoZSB0cmVl LiAgRWl0aGVyIGhhbGYgb2YgdGhlIHRyZWUgbWF5IG5lZWQNCisgKiB0byBiZSByZWJhbGFuY2Vk IGFnYWluc3QgdGhlIG90aGVyLiAgVGhlIG1hX3RvcGlhcnkgc3RydWN0IGlzIHVzZWQgdG8gdHJh Y2sNCisgKiB3aGljaCBub2RlcyBoYXZlIGJlZW4gJ2N1dCcgZnJvbSB0aGUgdHJlZSBzbyB0aGF0 IHRoZSBjaGFuZ2UgY2FuIGJlIGRvbmUNCisgKiBzYWZlbHkgYXQgYSBsYXRlciBkYXRlLiAgVGhp cyBpcyBkb25lIHRvIHN1cHBvcnQgUkNVLg0KKyAqLw0KK3N0cnVjdCBtYV90b3BpYXJ5IHsNCisJ c3RydWN0IG1hcGxlX2Vub2RlICpoZWFkOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnRhaWw7DQor CXN0cnVjdCBtYXBsZV90cmVlICptdHJlZTsNCit9Ow0KKw0KK3ZvaWQgKm10cmVlX2xvYWQoc3Ry dWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4KTsNCisNCitpbnQgbXRyZWVf aW5zZXJ0KHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBpbmRleCwNCisJCXZv aWQgKmVudHJ5LCBnZnBfdCBnZnApOw0KK2ludCBtdHJlZV9pbnNlcnRfcmFuZ2Uoc3RydWN0IG1h cGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGZpcnN0LA0KKwkJdW5zaWduZWQgbG9uZyBsYXN0 LCB2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKTsNCisNCitpbnQgbXRyZWVfc3RvcmVfcmFuZ2Uoc3Ry dWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGZpcnN0LA0KKwkJICAgICAgdW5zaWdu ZWQgbG9uZyBsYXN0LCB2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKTsNCitpbnQgbXRyZWVfc3RvcmUo c3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4LA0KKwkJdm9pZCAqZW50 cnksIGdmcF90IGdmcCk7DQordm9pZCAqbXRyZWVfZXJhc2Uoc3RydWN0IG1hcGxlX3RyZWUgKm10 LCB1bnNpZ25lZCBsb25nIGluZGV4KTsNCisNCit2b2lkIG10cmVlX2Rlc3Ryb3koc3RydWN0IG1h cGxlX3RyZWUgKm10KTsNCit2b2lkIF9fbXRfZGVzdHJveShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQp Ow0KKw0KKy8qKg0KKyAqIG10cmVlX2VtcHR5KCkgLSBEZXRlcm1pbmUgaWYgYSB0cmVlIGhhcyBh bnkgcHJlc2VudCBlbnRyaWVzLg0KKyAqIEBtdDogTWFwbGUgVHJlZS4NCisgKg0KKyAqIENvbnRl eHQ6IEFueSBjb250ZXh0Lg0KKyAqIFJldHVybjogJXRydWUgaWYgdGhlIHRyZWUgY29udGFpbnMg b25seSBOVUxMIHBvaW50ZXJzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtdHJlZV9lbXB0 eShjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwlyZXR1cm4gbXQtPm1hX3Jvb3Qg PT0gTlVMTDsNCit9DQorDQorLyogQWR2YW5jZWQgQVBJICovDQorDQorLyoNCisgKiBUaGUgbWFw bGUgc3RhdGUgaXMgZGVmaW5lZCBpbiB0aGUgc3RydWN0IG1hX3N0YXRlIGFuZCBpcyB1c2VkIHRv IGtlZXAgdHJhY2sNCisgKiBvZiBpbmZvcm1hdGlvbiBkdXJpbmcgb3BlcmF0aW9ucywgYW5kIGV2 ZW4gYmV0d2VlbiBvcGVyYXRpb25zIHdoZW4gdXNpbmcgdGhlDQorICogYWR2YW5jZWQgQVBJLg0K KyAqDQorICogSWYgc3RhdGUtPm5vZGUgaGFzIGJpdCAwIHNldCB0aGVuIGl0IHJlZmVyZW5jZXMg YSB0cmVlIGxvY2F0aW9uIHdoaWNoIGlzIG5vdA0KKyAqIGEgbm9kZSAoZWcgdGhlIHJvb3QpLiAg SWYgYml0IDEgaXMgc2V0LCB0aGUgcmVzdCBvZiB0aGUgYml0cyBhcmUgYSBuZWdhdGl2ZQ0KKyAq IGVycm5vLiAgQml0IDIgKHRoZSAndW5hbGxvY2F0ZWQgc2xvdHMnIGJpdCkgaXMgY2xlYXIuICBC aXRzIDMtNiBpbmRpY2F0ZSB0aGUNCisgKiBub2RlIHR5cGUuDQorICoNCisgKiBzdGF0ZS0+YWxs b2MgZWl0aGVyIGhhcyBhIHJlcXVlc3QgbnVtYmVyIG9mIG5vZGVzIG9yIGFuIGFsbG9jYXRlZCBu b2RlLiAgSWYNCisgKiBzdGF0LT5hbGxvYyBoYXMgYSByZXF1ZXN0ZWQgbnVtYmVyIG9mIG5vZGVz LCB0aGUgZmlyc3QgYml0IHdpbGwgYmUgc2V0ICgweDEpDQorICogYW5kIHRoZSByZW1haW5pbmcg Yml0cyBhcmUgdGhlIHZhbHVlLiAgSWYgc3RhdGUtPmFsbG9jIGlzIGEgbm9kZSwgdGhlbiB0aGUN CisgKiBub2RlIHdpbGwgYmUgb2YgdHlwZSBtYXBsZV9hbGxvYy4gIG1hcGxlX2FsbG9jIGhhcyBN QVBMRV9OT0RFX1NMT1RTIC0gMSBmb3INCisgKiBzdG9yaW5nIG1vcmUgYWxsb2NhdGVkIG5vZGVz LCBhIHRvdGFsLCBhbmQgdGhlIG5vZGVfY291bnQgaW4gdGhpcyBub2RlLg0KKyAqIHRvdGFsIGlz IHRoZSBudW1iZXIgb2Ygbm9kZXMgYWxsb2NhdGVkLiAgbm9kZV9jb3VudCBpcyB0aGUgbnVtYmVy IG9mDQorICogYWxsb2NhdGVkIG5vZGVzIGluIHRoaXMgbm9kZS4gIFRoZSBzY2FsaW5nIGJleW9u ZCBNQVBMRV9OT0RFX1NMT1RTIC0gMSBpcw0KKyAqIGhhbmRsZWQgYnkgc3RvcmluZyBmdXJ0aGVy IG5vZGVzIGludG8gc3RhdGUtPmFsbG9jLT5zbG90WzBdJ3Mgbm9kZS4gIE5vZGVzDQorICogYXJl IHRha2VuIGZyb20gc3RhdGUtPmFsbG9jIGJ5IHJlbW92aW5nIGEgbm9kZSBmcm9tIHRoZSBzdGF0 ZS0+YWxsb2Mgbm9kZQ0KKyAqIHVudGlsIHN0YXRlLT5hbGxvYy0+bm9kZV9jb3VudCBpcyAxLCB3 aGVuIHN0YXRlLT5hbGxvYyBpcyByZXR1cm5lZCBhbmQgdGhlDQorICogc3RhdGUtPmFsbG9jLT5z bG90WzBdIGlzIHByb21vdGVkIHRvIHN0YXRlLT5hbGxvYy4gIE5vZGVzIGFyZSBwdXNoZWQgb250 bw0KKyAqIHN0YXRlLT5hbGxvYyBieSBwdXR0aW5nIHRoZSBjdXJyZW50IHN0YXRlLT5hbGxvYyBp bnRvIHRoZSBwdXNoZWQgbm9kZSdzDQorICogc2xvdFswXS4NCisgKg0KKyAqIFRoZSBzdGF0ZSBh bHNvIGNvbnRhaW5zIHRoZSBpbXBsaWVkIG1pbi9tYXggb2YgdGhlIHN0YXRlLT5ub2RlLCB0aGUg ZGVwdGggb2YNCisgKiB0aGlzIHNlYXJjaCwgYW5kIHRoZSBvZmZzZXQuIFRoZSBpbXBsaWVkIG1p bi9tYXggYXJlIGVpdGhlciBmcm9tIHRoZSBwYXJlbnQNCisgKiBub2RlIG9yIGFyZSAwLW9vIGZv ciB0aGUgcm9vdCBub2RlLiAgVGhlIGRlcHRoIGlzIGluY3JlbWVudGVkIG9yIGRlY3JlbWVudGVk DQorICogZXZlcnkgdGltZSBhIG5vZGUgaXMgd2Fsa2VkIGRvd24gb3IgdXAuICBUaGUgb2Zmc2V0 IGlzIHRoZSBzbG90L3Bpdm90IG9mDQorICogaW50ZXJlc3QgaW4gdGhlIG5vZGUgLSBlaXRoZXIg Zm9yIHJlYWRpbmcgb3Igd3JpdGluZy4NCisgKg0KKyAqIFdoZW4gcmV0dXJuaW5nIGEgdmFsdWUg dGhlIG1hcGxlIHN0YXRlIGluZGV4IGFuZCBsYXN0IHJlc3BlY3RpdmVseSBjb250YWluDQorICog dGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHJhbmdlIGZvciB0aGUgZW50cnkuICBSYW5nZXMgYXJl IGluY2x1c2l2ZSBpbiB0aGUNCisgKiBNYXBsZSBUcmVlLg0KKyAqLw0KK3N0cnVjdCBtYV9zdGF0 ZSB7DQorCXN0cnVjdCBtYXBsZV90cmVlICp0cmVlOwkvKiBUaGUgdHJlZSB3ZSdyZSBvcGVyYXRp bmcgaW4gKi8NCisJdW5zaWduZWQgbG9uZyBpbmRleDsJCS8qIFRoZSBpbmRleCB3ZSdyZSBvcGVy YXRpbmcgb24gLSByYW5nZSBzdGFydCAqLw0KKwl1bnNpZ25lZCBsb25nIGxhc3Q7CQkvKiBUaGUg bGFzdCBpbmRleCB3ZSdyZSBvcGVyYXRpbmcgb24gLSByYW5nZSBlbmQgKi8NCisJc3RydWN0IG1h cGxlX2Vub2RlICpub2RlOwkvKiBUaGUgbm9kZSBjb250YWluaW5nIHRoaXMgZW50cnkgKi8NCisJ dW5zaWduZWQgbG9uZyBtaW47CQkvKiBUaGUgbWluaW11bSBpbmRleCBvZiB0aGlzIG5vZGUgLSBp bXBsaWVkIHBpdm90IG1pbiAqLw0KKwl1bnNpZ25lZCBsb25nIG1heDsJCS8qIFRoZSBtYXhpbXVt IGluZGV4IG9mIHRoaXMgbm9kZSAtIGltcGxpZWQgcGl2b3QgbWF4ICovDQorCXN0cnVjdCBtYXBs ZV9hbGxvYyAqYWxsb2M7CS8qIEFsbG9jYXRlZCBub2RlcyBmb3IgdGhpcyBvcGVyYXRpb24gKi8N CisJdW5zaWduZWQgY2hhciBkZXB0aDsJCS8qIGRlcHRoIG9mIHRyZWUgZGVzY2VudCBkdXJpbmcg d3JpdGUgKi8NCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCXVuc2lnbmVkIGNoYXIgbWFzX2Zs YWdzOw0KK307DQorDQorc3RydWN0IG1hX3dyX3N0YXRlIHsNCisJc3RydWN0IG1hX3N0YXRlICpt YXM7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOw0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsN CisJdW5zaWduZWQgbG9uZyByX21pbjsNCisJdW5zaWduZWQgbG9uZyByX21heDsNCisJdW5zaWdu ZWQgY2hhciBvZmZzZXRfZW5kOw0KKwl1bnNpZ25lZCBjaGFyIG5vZGVfZW5kOw0KKwl1bnNpZ25l ZCBsb25nICpwaXZvdHM7DQorCXVuc2lnbmVkIGxvbmcgZW5kX3BpdjsNCisJdm9pZCBfX3JjdSAq KnNsb3RzOw0KKwl2b2lkICplbnRyeTsNCisJdm9pZCAqY29udGVudDsNCit9Ow0KKw0KKyNkZWZp bmUgbWFzX2xvY2sobWFzKSAgICAgICAgICAgc3Bpbl9sb2NrKCYoKG1hcyktPnRyZWUtPm1hX2xv Y2spKQ0KKyNkZWZpbmUgbWFzX3VubG9jayhtYXMpICAgICAgICAgc3Bpbl91bmxvY2soJigobWFz KS0+dHJlZS0+bWFfbG9jaykpDQorDQorDQorLyoNCisgKiBTcGVjaWFsIHZhbHVlcyBmb3IgbWFf c3RhdGUubm9kZS4NCisgKiBNQVNfU1RBUlQgbWVhbnMgd2UgaGF2ZSBub3Qgc2VhcmNoZWQgdGhl IHRyZWUuDQorICogTUFTX1JPT1QgbWVhbnMgd2UgaGF2ZSBzZWFyY2hlZCB0aGUgdHJlZSBhbmQg dGhlIGVudHJ5IHdlIGZvdW5kIGxpdmVzIGluDQorICogdGhlIHJvb3Qgb2YgdGhlIHRyZWUgKGll IGl0IGhhcyBpbmRleCAwLCBsZW5ndGggMSBhbmQgaXMgdGhlIG9ubHkgZW50cnkgaW4NCisgKiB0 aGUgdHJlZSkuDQorICogTUFTX05PTkUgbWVhbnMgd2UgaGF2ZSBzZWFyY2hlZCB0aGUgdHJlZSBh bmQgdGhlcmUgaXMgbm8gbm9kZSBpbiB0aGUNCisgKiB0cmVlIGZvciB0aGlzIGVudHJ5LiAgRm9y IGV4YW1wbGUsIHdlIHNlYXJjaGVkIGZvciBpbmRleCAxIGluIGFuIGVtcHR5DQorICogdHJlZS4g IE9yIHdlIGhhdmUgYSB0cmVlIHdoaWNoIHBvaW50cyB0byBhIGZ1bGwgbGVhZiBub2RlIGFuZCB3 ZQ0KKyAqIHNlYXJjaGVkIGZvciBhbiBlbnRyeSB3aGljaCBpcyBsYXJnZXIgdGhhbiBjYW4gYmUg Y29udGFpbmVkIGluIHRoYXQNCisgKiBsZWFmIG5vZGUuDQorICogTUFfRVJST1IgcmVwcmVzZW50 cyBhbiBlcnJuby4gIEFmdGVyIGRyb3BwaW5nIHRoZSBsb2NrIGFuZCBhdHRlbXB0aW5nDQorICog dG8gcmVzb2x2ZSB0aGUgZXJyb3IsIHRoZSB3YWxrIHdvdWxkIGhhdmUgdG8gYmUgcmVzdGFydGVk IGZyb20gdGhlDQorICogdG9wIG9mIHRoZSB0cmVlIGFzIHRoZSB0cmVlIG1heSBoYXZlIGJlZW4g bW9kaWZpZWQuDQorICovDQorI2RlZmluZSBNQVNfU1RBUlQJKChzdHJ1Y3QgbWFwbGVfZW5vZGUg KikxVUwpDQorI2RlZmluZSBNQVNfUk9PVAkoKHN0cnVjdCBtYXBsZV9lbm9kZSAqKTVVTCkNCisj ZGVmaW5lIE1BU19OT05FCSgoc3RydWN0IG1hcGxlX2Vub2RlICopOVVMKQ0KKyNkZWZpbmUgTUFT X1BBVVNFCSgoc3RydWN0IG1hcGxlX2Vub2RlICopMTdVTCkNCisjZGVmaW5lIE1BX0VSUk9SKGVy cikgXA0KKwkJKChzdHJ1Y3QgbWFwbGVfZW5vZGUgKikoKCh1bnNpZ25lZCBsb25nKWVyciA8PCAy KSB8IDJVTCkpDQorDQorI2RlZmluZSBNQV9TVEFURShuYW1lLCBtdCwgZmlyc3QsIGVuZCkJCQkJ CVwNCisJc3RydWN0IG1hX3N0YXRlIG5hbWUgPSB7CQkJCQlcDQorCQkudHJlZSA9IG10LAkJCQkJ CVwNCisJCS5pbmRleCA9IGZpcnN0LAkJCQkJCVwNCisJCS5sYXN0ID0gZW5kLAkJCQkJCVwNCisJ CS5ub2RlID0gTUFTX1NUQVJULAkJCQkJXA0KKwkJLm1pbiA9IDAsCQkJCQkJXA0KKwkJLm1heCA9 IFVMT05HX01BWCwJCQkJCVwNCisJfQ0KKw0KKyNkZWZpbmUgTUFfV1JfU1RBVEUobmFtZSwgbWFf c3RhdGUsIHdyX2VudHJ5KQkJCQlcDQorCXN0cnVjdCBtYV93cl9zdGF0ZSBuYW1lID0gewkJCQkJ XA0KKwkJLm1hcyA9IG1hX3N0YXRlLAkJCQkJXA0KKwkJLmNvbnRlbnQgPSBOVUxMLAkJCQkJXA0K KwkJLmVudHJ5ID0gd3JfZW50cnksCQkJCQlcDQorCX0NCisNCisjZGVmaW5lIE1BX1RPUElBUlko bmFtZSwgdHJlZSkJCQkJCQlcDQorCXN0cnVjdCBtYV90b3BpYXJ5IG5hbWUgPSB7CQkJCQlcDQor CQkuaGVhZCA9IE5VTEwsCQkJCQkJXA0KKwkJLnRhaWwgPSBOVUxMLAkJCQkJCVwNCisJCS5tdHJl ZSA9IHRyZWUsCQkJCQkJXA0KKwl9DQorDQordm9pZCAqbWFzX3dhbGsoc3RydWN0IG1hX3N0YXRl ICptYXMpOw0KK3ZvaWQgKm1hc19zdG9yZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50 cnkpOw0KK3ZvaWQgKm1hc19lcmFzZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcyk7DQoraW50IG1hc19z dG9yZV9nZnAoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5LCBnZnBfdCBnZnApOw0K K3ZvaWQgKm1hc19maW5kKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1heCk7 DQordm9pZCAqbWFzX2ZpbmRfcmV2KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25n IG1pbik7DQorDQorYm9vbCBtYXNfbm9tZW0oc3RydWN0IG1hX3N0YXRlICptYXMsIGdmcF90IGdm cCk7DQordm9pZCBtYXNfcGF1c2Uoc3RydWN0IG1hX3N0YXRlICptYXMpOw0KK3ZvaWQgbWFwbGVf dHJlZV9pbml0KHZvaWQpOw0KK3ZvaWQgbWFzX2Rlc3Ryb3koc3RydWN0IG1hX3N0YXRlICptYXMp Ow0KK2ludCBtYXNfZXhwZWN0ZWRfZW50cmllcyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWdu ZWQgbG9uZyBucl9lbnRyaWVzKTsNCisNCit2b2lkICptYXNfcHJldihzdHJ1Y3QgbWFfc3RhdGUg Km1hcywgdW5zaWduZWQgbG9uZyBtaW4pOw0KK3ZvaWQgKm1hc19uZXh0KHN0cnVjdCBtYV9zdGF0 ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1heCk7DQorDQoraW50IG1hc19lbXB0eV9hcmVhKHN0cnVj dCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbiwgdW5zaWduZWQgbG9uZyBtYXgsDQor CQkgICB1bnNpZ25lZCBsb25nIHNpemUpOw0KKw0KKy8qIENoZWNrcyBpZiBhIG1hcyBoYXMgbm90 IGZvdW5kIGFueXRoaW5nICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19pc19ub25lKHN0cnVj dCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIG1hcy0+bm9kZSA9PSBNQVNfTk9ORTsNCit9 DQorDQorLyogQ2hlY2tzIGlmIGEgbWFzIGhhcyBiZWVuIHBhdXNlZCAqLw0KK3N0YXRpYyBpbmxp bmUgYm9vbCBtYXNfaXNfcGF1c2VkKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJu IG1hcy0+bm9kZSA9PSBNQVNfUEFVU0U7DQorfQ0KKw0KK3ZvaWQgbWFzX2R1cF90cmVlKHN0cnVj dCBtYV9zdGF0ZSAqb2xkbWFzLCBzdHJ1Y3QgbWFfc3RhdGUgKm1hcyk7DQordm9pZCBtYXNfZHVw X3N0b3JlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSk7DQorDQorLyoNCisgKiBU aGlzIGZpbmRzIGFuIGVtcHR5IGFyZWEgZnJvbSB0aGUgaGlnaGVzdCBhZGRyZXNzIHRvIHRoZSBs b3dlc3QuDQorICogQUtBICJUb3Bkb3duIiB2ZXJzaW9uLA0KKyAqLw0KK2ludCBtYXNfZW1wdHlf YXJlYV9yZXYoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJICAg ICAgIHVuc2lnbmVkIGxvbmcgbWF4LCB1bnNpZ25lZCBsb25nIHNpemUpOw0KKy8qKg0KKyAqIG1h c19yZXNldCgpIC0gUmVzZXQgYSBNYXBsZSBUcmVlIG9wZXJhdGlvbiBzdGF0ZS4NCisgKiBAbWFz OiBNYXBsZSBUcmVlIG9wZXJhdGlvbiBzdGF0ZS4NCisgKg0KKyAqIFJlc2V0cyB0aGUgZXJyb3Ig b3Igd2FsayBzdGF0ZSBvZiB0aGUgQG1hcyBzbyBmdXR1cmUgd2Fsa3Mgb2YgdGhlDQorICogYXJy YXkgd2lsbCBzdGFydCBmcm9tIHRoZSByb290LiAgVXNlIHRoaXMgaWYgeW91IGhhdmUgZHJvcHBl ZCB0aGUNCisgKiBsb2NrIGFuZCB3YW50IHRvIHJldXNlIHRoZSBtYV9zdGF0ZS4NCisgKg0KKyAq IENvbnRleHQ6IEFueSBjb250ZXh0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfcmVz ZXQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwltYXMtPm5vZGUgPSBNQVNfU1RBUlQ7DQor fQ0KKw0KKy8qKg0KKyAqIG1hc19mb3JfZWFjaCgpIC0gSXRlcmF0ZSBvdmVyIGEgcmFuZ2Ugb2Yg dGhlIG1hcGxlIHRyZWUuDQorICogQG1hczogTWFwbGUgVHJlZSBvcGVyYXRpb24gc3RhdGUgKG1h cGxlX3N0YXRlKQ0KKyAqIEBlbnRyeTogRW50cnkgcmV0cmlldmVkIGZyb20gdGhlIHRyZWUNCisg KiBAbWF4OiBtYXhpbXVtIGluZGV4IHRvIHJldHJpZXZlIGZyb20gdGhlIHRyZWUNCisgKg0KKyAq IFdoZW4gcmV0dXJuZWQsIG1hcy0+aW5kZXggYW5kIG1hcy0+bGFzdCB3aWxsIGhvbGQgdGhlIGVu dGlyZSByYW5nZSBmb3IgdGhlDQorICogZW50cnkuDQorICoNCisgKiBOb3RlOiBtYXkgcmV0dXJu IHRoZSB6ZXJvIGVudHJ5Lg0KKyAqDQorICovDQorI2RlZmluZSBtYXNfZm9yX2VhY2gobWFzLCBl bnRyeSwgbWF4KSBcDQorCXdoaWxlICgoKGVudHJ5KSA9IG1hc19maW5kKChtYXMpLCAobWF4KSkp ICE9IE5VTEwpDQorDQorDQorLyoqDQorICogbWFzX3NldF9yYW5nZSgpIC0gU2V0IHVwIE1hcGxl IFRyZWUgb3BlcmF0aW9uIHN0YXRlIGZvciBhIGRpZmZlcmVudCBpbmRleC4NCisgKiBAbWFzOiBN YXBsZSBUcmVlIG9wZXJhdGlvbiBzdGF0ZS4NCisgKiBAc3RhcnQ6IE5ldyBzdGFydCBvZiByYW5n ZSBpbiB0aGUgTWFwbGUgVHJlZS4NCisgKiBAbGFzdDogTmV3IGVuZCBvZiByYW5nZSBpbiB0aGUg TWFwbGUgVHJlZS4NCisgKg0KKyAqIE1vdmUgdGhlIG9wZXJhdGlvbiBzdGF0ZSB0byByZWZlciB0 byBhIGRpZmZlcmVudCByYW5nZS4gIFRoaXMgd2lsbA0KKyAqIGhhdmUgdGhlIGVmZmVjdCBvZiBz dGFydGluZyBhIHdhbGsgZnJvbSB0aGUgdG9wOyBzZWUgbWFzX25leHQoKQ0KKyAqIHRvIG1vdmUg dG8gYW4gYWRqYWNlbnQgaW5kZXguDQorICovDQorc3RhdGljIGlubGluZQ0KK3ZvaWQgbWFzX3Nl dF9yYW5nZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWdu ZWQgbG9uZyBsYXN0KQ0KK3sNCisJICAgICAgIG1hcy0+aW5kZXggPSBzdGFydDsNCisJICAgICAg IG1hcy0+bGFzdCA9IGxhc3Q7DQorCSAgICAgICBtYXMtPm5vZGUgPSBNQVNfU1RBUlQ7DQorfQ0K Kw0KKy8qKg0KKyAqIG1hc19zZXQoKSAtIFNldCB1cCBNYXBsZSBUcmVlIG9wZXJhdGlvbiBzdGF0 ZSBmb3IgYSBkaWZmZXJlbnQgaW5kZXguDQorICogQG1hczogTWFwbGUgVHJlZSBvcGVyYXRpb24g c3RhdGUuDQorICogQGluZGV4OiBOZXcgaW5kZXggaW50byB0aGUgTWFwbGUgVHJlZS4NCisgKg0K KyAqIE1vdmUgdGhlIG9wZXJhdGlvbiBzdGF0ZSB0byByZWZlciB0byBhIGRpZmZlcmVudCBpbmRl eC4gIFRoaXMgd2lsbA0KKyAqIGhhdmUgdGhlIGVmZmVjdCBvZiBzdGFydGluZyBhIHdhbGsgZnJv bSB0aGUgdG9wOyBzZWUgbWFzX25leHQoKQ0KKyAqIHRvIG1vdmUgdG8gYW4gYWRqYWNlbnQgaW5k ZXguDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19zZXQoc3RydWN0IG1hX3N0YXRlICpt YXMsIHVuc2lnbmVkIGxvbmcgaW5kZXgpDQorew0KKw0KKwltYXNfc2V0X3JhbmdlKG1hcywgaW5k ZXgsIGluZGV4KTsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG10X2V4dGVybmFsX2xvY2so Y29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJcmV0dXJuIChtdC0+bWFfZmxhZ3Mg JiBNVF9GTEFHU19MT0NLX01BU0spID09IE1UX0ZMQUdTX0xPQ0tfRVhURVJOOw0KK30NCisNCisv KioNCisgKiBtdF9pbml0X2ZsYWdzKCkgLSBJbml0aWFsaXNlIGFuIGVtcHR5IG1hcGxlIHRyZWUg d2l0aCBmbGFncy4NCisgKiBAbXQ6IE1hcGxlIFRyZWUNCisgKiBAZmxhZ3M6IG1hcGxlIHRyZWUg ZmxhZ3MuDQorICoNCisgKiBJZiB5b3UgbmVlZCB0byBpbml0aWFsaXNlIGEgTWFwbGUgVHJlZSB3 aXRoIHNwZWNpYWwgZmxhZ3MgKGVnLCBhbg0KKyAqIGFsbG9jYXRpb24gdHJlZSksIHVzZSB0aGlz IGZ1bmN0aW9uLg0KKyAqDQorICogQ29udGV4dDogQW55IGNvbnRleHQuDQorICovDQorc3RhdGlj IGlubGluZSB2b2lkIG10X2luaXRfZmxhZ3Moc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25l ZCBpbnQgZmxhZ3MpDQorew0KKwltdC0+bWFfZmxhZ3MgPSBmbGFnczsNCisJaWYgKCFtdF9leHRl cm5hbF9sb2NrKG10KSkNCisJCXNwaW5fbG9ja19pbml0KCZtdC0+bWFfbG9jayk7DQorCXJjdV9h c3NpZ25fcG9pbnRlcihtdC0+bWFfcm9vdCwgTlVMTCk7DQorfQ0KKw0KKy8qKg0KKyAqIG10X2lu aXQoKSAtIEluaXRpYWxpc2UgYW4gZW1wdHkgbWFwbGUgdHJlZS4NCisgKiBAbXQ6IE1hcGxlIFRy ZWUNCisgKg0KKyAqIEFuIGVtcHR5IE1hcGxlIFRyZWUuDQorICoNCisgKiBDb250ZXh0OiBBbnkg Y29udGV4dC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRfaW5pdChzdHJ1Y3QgbWFwbGVf dHJlZSAqbXQpDQorew0KKwltdF9pbml0X2ZsYWdzKG10LCAwKTsNCit9DQorDQorc3RhdGljIGlu bGluZSBib29sIG10X2luX3JjdShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKyNpZmRlZiBD T05GSUdfTUFQTEVfUkNVX0RJU0FCTEVEDQorCXJldHVybiBmYWxzZTsNCisjZW5kaWYNCisJcmV0 dXJuIG10LT5tYV9mbGFncyAmIE1UX0ZMQUdTX1VTRV9SQ1U7DQorfQ0KKw0KKy8qKg0KKyAqIG10 X2NsZWFyX2luX3JjdSgpIC0gU3dpdGNoIHRoZSB0cmVlIHRvIG5vbi1SQ1UgbW9kZS4NCisgKiBA bXQ6IFRoZSBNYXBsZSBUcmVlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG10X2NsZWFyX2lu X3JjdShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwlpZiAoIW10X2luX3JjdShtdCkpDQor CQlyZXR1cm47DQorDQorCWlmIChtdF9leHRlcm5hbF9sb2NrKG10KSkgew0KKwkJQlVHX09OKCFt dF9sb2NrX2lzX2hlbGQobXQpKTsNCisJCW10LT5tYV9mbGFncyAmPSB+TVRfRkxBR1NfVVNFX1JD VTsNCisJfSBlbHNlIHsNCisJCW10cmVlX2xvY2sobXQpOw0KKwkJbXQtPm1hX2ZsYWdzICY9IH5N VF9GTEFHU19VU0VfUkNVOw0KKwkJbXRyZWVfdW5sb2NrKG10KTsNCisJfQ0KK30NCisNCisvKioN CisgKiBtdF9zZXRfaW5fcmN1KCkgLSBTd2l0Y2ggdGhlIHRyZWUgdG8gUkNVIHNhZmUgbW9kZS4N CisgKiBAbXQ6IFRoZSBNYXBsZSBUcmVlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG10X3Nl dF9pbl9yY3Uoc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJaWYgKG10X2luX3JjdShtdCkp DQorCQlyZXR1cm47DQorDQorCWlmIChtdF9leHRlcm5hbF9sb2NrKG10KSkgew0KKwkJQlVHX09O KCFtdF9sb2NrX2lzX2hlbGQobXQpKTsNCisJCW10LT5tYV9mbGFncyB8PSBNVF9GTEFHU19VU0Vf UkNVOw0KKwl9IGVsc2Ugew0KKwkJbXRyZWVfbG9jayhtdCk7DQorCQltdC0+bWFfZmxhZ3MgfD0g TVRfRkxBR1NfVVNFX1JDVTsNCisJCW10cmVlX3VubG9jayhtdCk7DQorCX0NCit9DQorDQordm9p ZCAqbXRfZmluZChzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgKmluZGV4LCB1 bnNpZ25lZCBsb25nIG1heCk7DQordm9pZCAqbXRfZmluZF9hZnRlcihzdHJ1Y3QgbWFwbGVfdHJl ZSAqbXQsIHVuc2lnbmVkIGxvbmcgKmluZGV4LA0KKwkJICAgIHVuc2lnbmVkIGxvbmcgbWF4KTsN Cit2b2lkICptdF9wcmV2KHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBpbmRl eCwgIHVuc2lnbmVkIGxvbmcgbWluKTsNCit2b2lkICptdF9uZXh0KHN0cnVjdCBtYXBsZV90cmVl ICptdCwgdW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBtYXgpOw0KKw0KKy8qKg0K KyAqIG10X2Zvcl9lYWNoIC0gU2VhcmNoZXMgZm9yIGFuIGVudHJ5IHN0YXJ0aW5nIGF0IGluZGV4 IHVudGlsIG1heC4NCisgKiBAdHJlZTogVGhlIE1hcGxlIFRyZWUNCisgKiBAZW50cnk6IFRoZSBj dXJyZW50IGVudHJ5DQorICogQGluZGV4OiBUaGUgaW5kZXggdG8gdXBkYXRlIHRvIHRyYWNrIHRo ZSBsb2NhdGlvbiBpbiB0aGUgdHJlZQ0KKyAqIEBtYXg6IFRoZSBtYXhpbXVtIGxpbWl0IGZvciBA aW5kZXgNCisgKg0KKyAqIE5vdGU6IFdpbGwgbm90IHJldHVybiB0aGUgemVybyBlbnRyeS4NCisg Ki8NCisjZGVmaW5lIG10X2Zvcl9lYWNoKHRyZWUsIGVudHJ5LCBpbmRleCwgbWF4KSBcDQorCWZv ciAoZW50cnkgPSBtdF9maW5kKHRyZWUsICZpbmRleCwgbWF4KTsgXA0KKwkJZW50cnk7IGVudHJ5 ID0gbXRfZmluZF9hZnRlcih0cmVlLCAmaW5kZXgsIG1heCkpDQorDQorDQorI2lmZGVmIENPTkZJ R19ERUJVR19NQVBMRV9UUkVFDQorZXh0ZXJuIGF0b21pY190IG1hcGxlX3RyZWVfdGVzdHNfcnVu Ow0KK2V4dGVybiBhdG9taWNfdCBtYXBsZV90cmVlX3Rlc3RzX3Bhc3NlZDsNCisNCit2b2lkIG10 X2R1bXAoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10KTsNCisjZGVmaW5lIE1UX0JVR19PTih0 cmVlLCB4KSBkbyB7CQkJCQkJXA0KKwlhdG9taWNfaW5jKCZtYXBsZV90cmVlX3Rlc3RzX3J1bik7 CQkJCVwNCisJaWYgKHgpIHsJCQkJCQkJXA0KKwkJcHJfaW5mbygiQlVHIGF0ICVzOiVkICgldSlc biIsCQkJCVwNCisJCV9fZnVuY19fLCBfX0xJTkVfXywgeCk7CQkJCQlcDQorCQltdF9kdW1wKHRy ZWUpOwkJCQkJCVwNCisJCXByX2luZm8oIlBhc3M6ICV1IFJ1bjoldVxuIiwJCQkJXA0KKwkJCWF0 b21pY19yZWFkKCZtYXBsZV90cmVlX3Rlc3RzX3Bhc3NlZCksCQlcDQorCQkJYXRvbWljX3JlYWQo Jm1hcGxlX3RyZWVfdGVzdHNfcnVuKSk7CQlcDQorCQlkdW1wX3N0YWNrKCk7CQkJCQkJXA0KKwl9 IGVsc2UgewkJCQkJCQlcDQorCQlhdG9taWNfaW5jKCZtYXBsZV90cmVlX3Rlc3RzX3Bhc3NlZCk7 CQkJXA0KKwl9CQkJCQkJCQlcDQorfSB3aGlsZSAoMCkNCisjZWxzZQ0KKyNkZWZpbmUgTVRfQlVH X09OKHRyZWUsIHgpIEJVR19PTih4KQ0KKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfTUFQTEVfVFJF RSAqLw0KKw0KKyNlbmRpZiAvKl9MSU5VWF9NQVBMRV9UUkVFX0ggKi8NCmRpZmYgLS1naXQgYS9p bmNsdWRlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9t YXBsZV90cmVlLmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLmZi ZDE1ODM5ZjlhYQ0KLS0tIC9kZXYvbnVsbA0KKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbWFw bGVfdHJlZS5oDQpAQCAtMCwwICsxLDEyMyBAQA0KKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wICovDQorI3VuZGVmIFRSQUNFX1NZU1RFTQ0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVN IG1hcGxlX3RyZWUNCisNCisjaWYgIWRlZmluZWQoX1RSQUNFX01NX0gpIHx8IGRlZmluZWQoVFJB Q0VfSEVBREVSX01VTFRJX1JFQUQpDQorI2RlZmluZSBfVFJBQ0VfTU1fSA0KKw0KKw0KKyNpbmNs dWRlIDxsaW51eC90cmFjZXBvaW50Lmg+DQorDQorc3RydWN0IG1hX3N0YXRlOw0KKw0KK1RSQUNF X0VWRU5UKG1hX29wLA0KKw0KKwlUUF9QUk9UTyhjb25zdCBjaGFyICpmbiwgc3RydWN0IG1hX3N0 YXRlICptYXMpLA0KKw0KKwlUUF9BUkdTKGZuLCBtYXMpLA0KKw0KKwlUUF9TVFJVQ1RfX2VudHJ5 KA0KKwkJCV9fZmllbGQoY29uc3QgY2hhciAqLCBmbikNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxv bmcsIG1pbikNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIG1heCkNCisJCQlfX2ZpZWxkKHVu c2lnbmVkIGxvbmcsIGluZGV4KQ0KKwkJCV9fZmllbGQodW5zaWduZWQgbG9uZywgbGFzdCkNCisJ CQlfX2ZpZWxkKHZvaWQgKiwgbm9kZSkNCisJKSwNCisNCisJVFBfZmFzdF9hc3NpZ24oDQorCQkJ X19lbnRyeS0+Zm4JCT0gZm47DQorCQkJX19lbnRyeS0+bWluCQk9IG1hcy0+bWluOw0KKwkJCV9f ZW50cnktPm1heAkJPSBtYXMtPm1heDsNCisJCQlfX2VudHJ5LT5pbmRleAkJPSBtYXMtPmluZGV4 Ow0KKwkJCV9fZW50cnktPmxhc3QJCT0gbWFzLT5sYXN0Ow0KKwkJCV9fZW50cnktPm5vZGUJCT0g bWFzLT5ub2RlOw0KKwkpLA0KKw0KKwlUUF9wcmludGsoIiVzXHROb2RlOiAlcHggKCVsdSAlbHUp IHJhbmdlOiAlbHUtJWx1IiwNCisJCSAgX19lbnRyeS0+Zm4sDQorCQkgICh2b2lkICopIF9fZW50 cnktPm5vZGUsDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5taW4sDQorCQkgICh1bnNp Z25lZCBsb25nKSBfX2VudHJ5LT5tYXgsDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5p bmRleCwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmxhc3QNCisJKQ0KKykNCitUUkFD RV9FVkVOVChtYV9yZWFkLA0KKw0KKwlUUF9QUk9UTyhjb25zdCBjaGFyICpmbiwgc3RydWN0IG1h X3N0YXRlICptYXMpLA0KKw0KKwlUUF9BUkdTKGZuLCBtYXMpLA0KKw0KKwlUUF9TVFJVQ1RfX2Vu dHJ5KA0KKwkJCV9fZmllbGQoY29uc3QgY2hhciAqLCBmbikNCisJCQlfX2ZpZWxkKHVuc2lnbmVk IGxvbmcsIG1pbikNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIG1heCkNCisJCQlfX2ZpZWxk KHVuc2lnbmVkIGxvbmcsIGluZGV4KQ0KKwkJCV9fZmllbGQodW5zaWduZWQgbG9uZywgbGFzdCkN CisJCQlfX2ZpZWxkKHZvaWQgKiwgbm9kZSkNCisJKSwNCisNCisJVFBfZmFzdF9hc3NpZ24oDQor CQkJX19lbnRyeS0+Zm4JCT0gZm47DQorCQkJX19lbnRyeS0+bWluCQk9IG1hcy0+bWluOw0KKwkJ CV9fZW50cnktPm1heAkJPSBtYXMtPm1heDsNCisJCQlfX2VudHJ5LT5pbmRleAkJPSBtYXMtPmlu ZGV4Ow0KKwkJCV9fZW50cnktPmxhc3QJCT0gbWFzLT5sYXN0Ow0KKwkJCV9fZW50cnktPm5vZGUJ CT0gbWFzLT5ub2RlOw0KKwkpLA0KKw0KKwlUUF9wcmludGsoIiVzXHROb2RlOiAlcHggKCVsdSAl bHUpIHJhbmdlOiAlbHUtJWx1IiwNCisJCSAgX19lbnRyeS0+Zm4sDQorCQkgICh2b2lkICopIF9f ZW50cnktPm5vZGUsDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5taW4sDQorCQkgICh1 bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5tYXgsDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5 LT5pbmRleCwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmxhc3QNCisJKQ0KKykNCisN CitUUkFDRV9FVkVOVChtYV93cml0ZSwNCisNCisJVFBfUFJPVE8oY29uc3QgY2hhciAqZm4sIHN0 cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIHBpdiwNCisJCSB2b2lkICp2YWwpLA0K Kw0KKwlUUF9BUkdTKGZuLCBtYXMsIHBpdiwgdmFsKSwNCisNCisJVFBfU1RSVUNUX19lbnRyeSgN CisJCQlfX2ZpZWxkKGNvbnN0IGNoYXIgKiwgZm4pDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25n LCBtaW4pDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBtYXgpDQorCQkJX19maWVsZCh1bnNp Z25lZCBsb25nLCBpbmRleCkNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGxhc3QpDQorCQkJ X19maWVsZCh1bnNpZ25lZCBsb25nLCBwaXYpDQorCQkJX19maWVsZCh2b2lkICosIHZhbCkNCisJ CQlfX2ZpZWxkKHZvaWQgKiwgbm9kZSkNCisJKSwNCisNCisJVFBfZmFzdF9hc3NpZ24oDQorCQkJ X19lbnRyeS0+Zm4JCT0gZm47DQorCQkJX19lbnRyeS0+bWluCQk9IG1hcy0+bWluOw0KKwkJCV9f ZW50cnktPm1heAkJPSBtYXMtPm1heDsNCisJCQlfX2VudHJ5LT5pbmRleAkJPSBtYXMtPmluZGV4 Ow0KKwkJCV9fZW50cnktPmxhc3QJCT0gbWFzLT5sYXN0Ow0KKwkJCV9fZW50cnktPnBpdgkJPSBw aXY7DQorCQkJX19lbnRyeS0+dmFsCQk9IHZhbDsNCisJCQlfX2VudHJ5LT5ub2RlCQk9IG1hcy0+ bm9kZTsNCisJKSwNCisNCisJVFBfcHJpbnRrKCIlc1x0Tm9kZSAlcHggKCVsdSAlbHUpIHJhbmdl OiVsdS0lbHUgcGl2ICglbHUpIHZhbCAlcHgiLA0KKwkJICBfX2VudHJ5LT5mbiwNCisJCSAgKHZv aWQgKikgX19lbnRyeS0+bm9kZSwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPm1pbiwN CisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPm1heCwNCisJCSAgKHVuc2lnbmVkIGxvbmcp IF9fZW50cnktPmluZGV4LA0KKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+bGFzdCwNCisJ CSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPnBpdiwNCisJCSAgKHZvaWQgKikgX19lbnRyeS0+ dmFsDQorCSkNCispDQorI2VuZGlmIC8qIF9UUkFDRV9NTV9IICovDQorDQorLyogVGhpcyBwYXJ0 IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovDQorI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90 cmFjZS5oPg0KZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVi dWcNCmluZGV4IDE0Yjg5YWEzN2M1Yy4uYjcyNjQ3YzEyOTQwIDEwMDY0NA0KLS0tIGEvbGliL0tj b25maWcuZGVidWcNCisrKyBiL2xpYi9LY29uZmlnLmRlYnVnDQpAQCAtODI3LDYgKzgyNywxNSBA QCBjb25maWcgREVCVUdfVk1fUkINCiANCiAJICBJZiB1bnN1cmUsIHNheSBOLg0KIA0KKw0KK2Nv bmZpZyBERUJVR19NQVBMRV9UUkVFDQorCWJvb2wgIkRlYnVnIFZNIG1hcGxlIHRyZWVzIg0KKwlk ZXBlbmRzIG9uIERFQlVHX1ZNDQorCWhlbHANCisJICBFbmFibGUgVk0gbWFwbGUgdHJlZSBkZWJ1 Z2dpbmcgaW5mb3JtYXRpb24gYW5kIGV4dHJhIHZhbGlkYXRpb25zLg0KKw0KKwkgIElmIHVuc3Vy ZSwgc2F5IE4uDQorDQogY29uZmlnIERFQlVHX1ZNX1BHRkxBR1MNCiAJYm9vbCAiRGVidWcgcGFn ZS1mbGFncyBvcGVyYXRpb25zIg0KIAlkZXBlbmRzIG9uIERFQlVHX1ZNDQpkaWZmIC0tZ2l0IGEv bGliL01ha2VmaWxlIGIvbGliL01ha2VmaWxlDQppbmRleCAzMDBmNTY5YzYyNmIuLjdkMGI1OGQw YjE1YSAxMDA2NDQNCi0tLSBhL2xpYi9NYWtlZmlsZQ0KKysrIGIvbGliL01ha2VmaWxlDQpAQCAt MjksNyArMjksOCBAQCBlbmRpZg0KIA0KIGxpYi15IDo9IGN0eXBlLm8gc3RyaW5nLm8gdnNwcmlu dGYubyBjbWRsaW5lLm8gXA0KIAkgcmJ0cmVlLm8gcmFkaXgtdHJlZS5vIHRpbWVycXVldWUubyB4 YXJyYXkubyBcDQotCSBpZHIubyBleHRhYmxlLm8gc2hhMS5vIGlycV9yZWdzLm8gYXJndl9zcGxp dC5vIFwNCisJIG1hcGxlX3RyZWUubyBpZHIubyBleHRhYmxlLm8gXA0KKwkgc2hhMS5vIGlycV9y ZWdzLm8gYXJndl9zcGxpdC5vIFwNCiAJIGZsZXhfcHJvcG9ydGlvbnMubyByYXRlbGltaXQubyBz aG93X21lbS5vIFwNCiAJIGlzX3NpbmdsZV90aHJlYWRlZC5vIHBsaXN0Lm8gZGVjb21wcmVzcy5v IGtvYmplY3RfdWV2ZW50Lm8gXA0KIAkgZWFybHljcGlvLm8gc2VxX2J1Zi5vIHNpcGhhc2gubyBk ZWNfYW5kX2xvY2subyBcDQpkaWZmIC0tZ2l0IGEvbGliL21hcGxlX3RyZWUuYyBiL2xpYi9tYXBs ZV90cmVlLmMNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLjZhNTc3 NDUzMTliYQ0KLS0tIC9kZXYvbnVsbA0KKysrIGIvbGliL21hcGxlX3RyZWUuYw0KQEAgLTAsMCAr MSw2OTQzIEBADQorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArDQorLyoNCisg KiBNYXBsZSBUcmVlIGltcGxlbWVudGF0aW9uDQorICogQ29weXJpZ2h0IChjKSAyMDE4IE9yYWNs ZSBDb3Jwb3JhdGlvbg0KKyAqIEF1dGhvcnM6IExpYW0gUi4gSG93bGV0dCA8TGlhbS5Ib3dsZXR0 QG9yYWNsZS5jb20+DQorICoJICAgIE1hdHRoZXcgV2lsY294IDx3aWxseUBpbmZyYWRlYWQub3Jn Pg0KKyAqLw0KKw0KKy8qDQorICogSW50ZXJlc3RpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBv ZiB0aGUgTWFwbGUgVHJlZQ0KKyAqDQorICogRWFjaCBub2RlIHR5cGUgaGFzIGEgbnVtYmVyIG9m IHNsb3RzIGZvciBlbnRyaWVzIGFuZCBhIG51bWJlciBvZiBzbG90cyBmb3INCisgKiBwaXZvdHMu ICBJbiB0aGUgY2FzZSBvZiBkZW5zZSBub2RlcywgdGhlIHBpdm90cyBhcmUgaW1wbGllZCBieSB0 aGUgcG9zaXRpb24NCisgKiBhbmQgYXJlIHNpbXBseSB0aGUgc2xvdCBpbmRleCArIHRoZSBtaW5p bXVtIG9mIHRoZSBub2RlLg0KKyAqDQorICogSW4gcmVndWxhciBCLVRyZWUgdGVybXMsIHBpdm90 cyBhcmUgY2FsbGVkIGtleXMuICBUaGUgdGVybSBwaXZvdCBpcyB1c2VkIHRvDQorICogaW5kaWNh dGUgdGhhdCB0aGUgdHJlZSBpcyBzcGVjaWZ5aW5nIHJhbmdlcywgIFBpdm90cyBtYXkgYXBwZWFy IGluIHRoZQ0KKyAqIHN1YnRyZWUgd2l0aCBhbiBlbnRyeSBhdHRhY2hlZCB0byB0aGUgdmFsdWUg d2hlcmUgYXMga2V5cyBhcmUgdW5pcXVlIHRvIGENCisgKiBzcGVjaWZpYyBwb3NpdGlvbiBvZiBh IEItdHJlZS4gIFBpdm90IHZhbHVlcyBhcmUgaW5jbHVzaXZlIG9mIHRoZSBzbG90IHdpdGgNCisg KiB0aGUgc2FtZSBpbmRleC4NCisgKg0KKyAqDQorICogVGhlIGZvbGxvd2luZyBpbGx1c3RyYXRl cyB0aGUgbGF5b3V0IG9mIGEgcmFuZ2U2NCBub2RlcyBzbG90cyBhbmQgcGl2b3RzLg0KKyAqDQor ICoNCisgKiAgU2xvdHMgLT4gfCAwIHwgMSB8IDIgfCAuLi4gfCAxMiB8IDEzIHwgMTQgfCAxNSB8 DQorICogICAgICAgICAgIOKUrCAgIOKUrCAgIOKUrCAgIOKUrCAgICAg4pSsICAgIOKUrCAgICDi lKwgICAg4pSsICAgIOKUrA0KKyAqICAgICAgICAgICDilIIgICDilIIgICDilIIgICDilIIgICAg IOKUgiAgICDilIIgICAg4pSCICAgIOKUgiAgICDilJTilIAgSW1wbGllZCBtYXhpbXVtDQorICog ICAgICAgICAgIOKUgiAgIOKUgiAgIOKUgiAgIOKUgiAgICAg4pSCICAgIOKUgiAgICDilIIgICAg 4pSU4pSAIFBpdm90IDE0DQorICogICAgICAgICAgIOKUgiAgIOKUgiAgIOKUgiAgIOKUgiAgICAg 4pSCICAgIOKUgiAgICDilJTilIAgUGl2b3QgMTMNCisgKiAgICAgICAgICAg4pSCICAg4pSCICAg 4pSCICAg4pSCICAgICDilIIgICAg4pSU4pSAIFBpdm90IDEyDQorICogICAgICAgICAgIOKUgiAg IOKUgiAgIOKUgiAgIOKUgiAgICAg4pSU4pSAIFBpdm90IDExDQorICogICAgICAgICAgIOKUgiAg IOKUgiAgIOKUgiAgIOKUlOKUgCBQaXZvdCAyDQorICogICAgICAgICAgIOKUgiAgIOKUgiAgIOKU lOKUgCBQaXZvdCAxDQorICogICAgICAgICAgIOKUgiAgIOKUlOKUgCBQaXZvdCAwDQorICogICAg ICAgICAgIOKUlOKUgCAgSW1wbGllZCBtaW5pbXVtDQorICoNCisgKiBTbG90IGNvbnRlbnRzOg0K KyAqICBJbnRlcm5hbCAobm9uLWxlYWYpIG5vZGVzIGNvbnRhaW4gcG9pbnRlcnMgdG8gb3RoZXIg bm9kZXMuDQorICogIExlYWYgbm9kZXMgY29udGFpbiBlbnRyaWVzLg0KKyAqDQorICogVGhlIGxv Y2F0aW9uIG9mIGludGVyZXN0IGlzIG9mdGVuIHJlZmVycmVkIHRvIGFzIGFuIG9mZnNldC4gIEFs bCBvZmZzZXRzIGhhdmUNCisgKiBhIHNsb3QsIGJ1dCB0aGUgbGFzdCBvZmZzZXQgaGFzIGFuIGlt cGxpZWQgcGl2b3QgZnJvbSB0aGUgbm9kZSBhYm92ZSAob3INCisgKiBVSU5UX01BWCBmb3IgdGhl IHJvb3Qgbm9kZS4NCisgKg0KKyAqIFJhbmdlcyBjb21wbGljYXRlIGNlcnRhaW4gd3JpdGUgYWN0 aXZpdGllcy4gIFdoZW4gbW9kaWZ5aW5nIGFueSBvZg0KKyAqIHRoZSBCLXRyZWUgdmFyaWFudHMs IGl0IGlzIGtub3duIHRoYXQgb25lIGVudHJ5IHdpbGwgZWl0aGVyIGJlIGFkZGVkIG9yDQorICog ZGVsZXRlZC4gIFdoZW4gbW9kaWZ5aW5nIHRoZSBNYXBsZSBUcmVlLCBvbmUgc3RvcmUgb3BlcmF0 aW9uIG1heSBvdmVyd3JpdGUNCisgKiB0aGUgZW50aXJlIGRhdGEgc2V0LCBvciBvbmUgaGFsZiBv ZiB0aGUgdHJlZSwgb3IgdGhlIG1pZGRsZSBoYWxmIG9mIHRoZSB0cmVlLg0KKyAqDQorICovDQor DQorDQorI2luY2x1ZGUgPGxpbnV4L21hcGxlX3RyZWUuaD4NCisjaW5jbHVkZSA8bGludXgveGFy cmF5Lmg+DQorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+DQorI2luY2x1ZGUgPGxpbnV4L2V4cG9y dC5oPg0KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+DQorI2luY2x1ZGUgPGxpbnV4L2xpbWl0cy5o Pg0KKyNpbmNsdWRlIDxhc20vYmFycmllci5oPg0KKw0KKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BP SU5UUw0KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvbWFwbGVfdHJlZS5oPg0KKw0KKyNkZWZpbmUg TUFfUk9PVF9QQVJFTlQgMQ0KKw0KKy8qIE1hcGxlIHN0YXRlIGZsYWdzICovDQorI2RlZmluZSBN QV9TVEFURV9CVUxLCQkxDQorI2RlZmluZSBNQV9TVEFURV9SRUJBTEFOQ0UJMg0KKw0KKyNkZWZp bmUgbWFfcGFyZW50X3B0cih4KSAoKHN0cnVjdCBtYXBsZV9wbm9kZSAqKSh4KSkNCisjZGVmaW5l IG1hX21ub2RlX3B0cih4KSAoKHN0cnVjdCBtYXBsZV9ub2RlICopKHgpKQ0KKyNkZWZpbmUgbWFf ZW5vZGVfcHRyKHgpICgoc3RydWN0IG1hcGxlX2Vub2RlICopKHgpKQ0KK3N0YXRpYyBzdHJ1Y3Qg a21lbV9jYWNoZSAqbWFwbGVfbm9kZV9jYWNoZTsNCisNCitzdGF0aWMgY29uc3QgdW5zaWduZWQg bG9uZyBtdF9tYXhbXSA9IHsNCisJW21hcGxlX2RlbnNlXQkJPSBNQVBMRV9OT0RFX1NMT1RTLA0K KwlbbWFwbGVfbGVhZl82NF0JCT0gVUxPTkdfTUFYLA0KKwlbbWFwbGVfcmFuZ2VfNjRdCT0gVUxP TkdfTUFYLA0KKwlbbWFwbGVfYXJhbmdlXzY0XQk9IFVMT05HX01BWCwNCit9Ow0KKyNkZWZpbmUg bXRfbm9kZV9tYXgoeCkgbXRfbWF4W210ZV9ub2RlX3R5cGUoeCldDQorDQorc3RhdGljIGNvbnN0 IHVuc2lnbmVkIGNoYXIgbXRfc2xvdHNbXSA9IHsNCisJW21hcGxlX2RlbnNlXQkJPSBNQVBMRV9O T0RFX1NMT1RTLA0KKwlbbWFwbGVfbGVhZl82NF0JCT0gTUFQTEVfUkFOR0U2NF9TTE9UUywNCisJ W21hcGxlX3JhbmdlXzY0XQk9IE1BUExFX1JBTkdFNjRfU0xPVFMsDQorCVttYXBsZV9hcmFuZ2Vf NjRdCT0gTUFQTEVfQVJBTkdFNjRfU0xPVFMsDQorfTsNCisjZGVmaW5lIG10X3Nsb3RfY291bnQo eCkgbXRfc2xvdHNbbXRlX25vZGVfdHlwZSh4KV0NCisNCitzdGF0aWMgY29uc3QgdW5zaWduZWQg Y2hhciBtdF9waXZvdHNbXSA9IHsNCisJW21hcGxlX2RlbnNlXQkJPSAwLA0KKwlbbWFwbGVfbGVh Zl82NF0JCT0gTUFQTEVfUkFOR0U2NF9TTE9UUyAtIDEsDQorCVttYXBsZV9yYW5nZV82NF0JPSBN QVBMRV9SQU5HRTY0X1NMT1RTIC0gMSwNCisJW21hcGxlX2FyYW5nZV82NF0JPSBNQVBMRV9BUkFO R0U2NF9TTE9UUyAtIDEsDQorfTsNCisjZGVmaW5lIG10X3Bpdm90X2NvdW50KHgpIG10X3Bpdm90 c1ttdGVfbm9kZV90eXBlKHgpXQ0KKw0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG10X21p bl9zbG90c1tdID0gew0KKwlbbWFwbGVfZGVuc2VdCQk9IE1BUExFX05PREVfU0xPVFMgLyAyLA0K KwlbbWFwbGVfbGVhZl82NF0JCT0gKE1BUExFX1JBTkdFNjRfU0xPVFMgLyAyKSAtIDIsDQorCVtt YXBsZV9yYW5nZV82NF0JPSAoTUFQTEVfUkFOR0U2NF9TTE9UUyAvIDIpIC0gMiwNCisJW21hcGxl X2FyYW5nZV82NF0JPSAoTUFQTEVfQVJBTkdFNjRfU0xPVFMgLyAyKSAtIDEsDQorfTsNCisjZGVm aW5lIG10X21pbl9zbG90X2NvdW50KHgpIG10X21pbl9zbG90c1ttdGVfbm9kZV90eXBlKHgpXQ0K Kw0KKyNkZWZpbmUgTUFQTEVfQklHX05PREVfU0xPVFMJKE1BUExFX1JBTkdFNjRfU0xPVFMgKiAy ICsgMikNCisNCitzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgew0KKwlzdHJ1Y3QgbWFwbGVfcG5vZGUg KnBhcmVudDsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpzbG90W01BUExFX0JJR19OT0RFX1NMT1RT XTsNCisJdW5zaWduZWQgbG9uZyBwaXZvdFtNQVBMRV9CSUdfTk9ERV9TTE9UUyAtIDFdOw0KKwl1 bnNpZ25lZCBsb25nIGdhcFtNQVBMRV9CSUdfTk9ERV9TTE9UU107DQorCXVuc2lnbmVkIGxvbmcg bWluOw0KKwl1bnNpZ25lZCBjaGFyIGJfZW5kOw0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsNCit9 Ow0KKw0KKy8qDQorICogVGhlIG1hcGxlX3N1YnRyZWVfc3RhdGUgaXMgdXNlZCB0byBidWlsZCBh IHRyZWUgdG8gcmVwbGFjZSBhIHNlZ21lbnQgb2YgYW4NCisgKiBleGlzdGluZyB0cmVlIGluIGEg bW9yZSBhdG9taWMgd2F5LiAgQW55IHdhbGtlcnMgb2YgdGhlIG9sZGVyIHRyZWUgd2lsbCBoaXQg YQ0KKyAqIGRlYWQgbm9kZSBhbmQgcmVzdGFydCBvbiB1cGRhdGVzLg0KKyAqLw0KK3N0cnVjdCBt YXBsZV9zdWJ0cmVlX3N0YXRlIHsNCisJc3RydWN0IG1hX3N0YXRlICpvcmlnX2w7CS8qIE9yaWdp bmFsIGxlZnQgc2lkZSBvZiBzdWJ0cmVlICovDQorCXN0cnVjdCBtYV9zdGF0ZSAqb3JpZ19yOwkv KiBPcmlnaW5hbCByaWdodCBzaWRlIG9mIHN1YnRyZWUgKi8NCisJc3RydWN0IG1hX3N0YXRlICps OwkJLyogTmV3IGxlZnQgc2lkZSBvZiBzdWJ0cmVlICovDQorCXN0cnVjdCBtYV9zdGF0ZSAqbTsJ CS8qIE5ldyBtaWRkbGUgb2Ygc3VidHJlZSAocmFyZSkgKi8NCisJc3RydWN0IG1hX3N0YXRlICpy OwkJLyogTmV3IHJpZ2h0IHNpZGUgb2Ygc3VidHJlZSAqLw0KKwlzdHJ1Y3QgbWFfdG9waWFyeSAq ZnJlZTsJLyogbm9kZXMgdG8gYmUgZnJlZWQgKi8NCisJc3RydWN0IG1hX3RvcGlhcnkgKmRlc3Ry b3k7CS8qIE5vZGVzIHRvIGJlIGRlc3Ryb3llZCAod2Fsa2VkIGFuZCBmcmVlZCkgKi8NCisJc3Ry dWN0IG1hcGxlX2JpZ19ub2RlICpibjsNCit9Ow0KKw0KKy8qIEZ1bmN0aW9ucyAqLw0KK3N0YXRp YyBpbmxpbmUgc3RydWN0IG1hcGxlX25vZGUgKm10X2FsbG9jX29uZShnZnBfdCBnZnApDQorew0K KwlyZXR1cm4ga21lbV9jYWNoZV9hbGxvYyhtYXBsZV9ub2RlX2NhY2hlLCBnZnAgfCBfX0dGUF9a RVJPKTsNCit9DQorDQorc3RhdGljIGlubGluZSBpbnQgbXRfYWxsb2NfYnVsayhnZnBfdCBnZnAs IHNpemVfdCBzaXplLCB2b2lkICoqbm9kZXMpDQorew0KKwlyZXR1cm4ga21lbV9jYWNoZV9hbGxv Y19idWxrKG1hcGxlX25vZGVfY2FjaGUsIGdmcCB8IF9fR0ZQX1pFUk8sIHNpemUsDQorCQkJCSAg ICAgbm9kZXMpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbXRfZnJlZV9idWxrKHNpemVf dCBzaXplLCB2b2lkIF9fcmN1ICoqbm9kZXMpDQorew0KKwlrbWVtX2NhY2hlX2ZyZWVfYnVsayht YXBsZV9ub2RlX2NhY2hlLCBzaXplLCAodm9pZCAqKilub2Rlcyk7DQorfQ0KKw0KK3N0YXRpYyB2 b2lkIG10X2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkNCit7DQorCXN0cnVjdCBtYXBs ZV9ub2RlICpub2RlID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBtYXBsZV9ub2RlLCByY3Up Ow0KKw0KKwlrbWVtX2NhY2hlX2ZyZWUobWFwbGVfbm9kZV9jYWNoZSwgbm9kZSk7DQorfQ0KKw0K Ky8qDQorICogbWFfZnJlZV9yY3UoKSAtIFVzZSByY3UgY2FsbGJhY2sgdG8gZnJlZSBhIG1hcGxl IG5vZGUNCisgKiBAbm9kZTogVGhlIG5vZGUgdG8gZnJlZQ0KKyAqDQorICogVGhlIG1hcGxlIHRy ZWUgdXNlcyB0aGUgcGFyZW50IHBvaW50ZXIgdG8gaW5kaWNhdGUgdGhpcyBub2RlIGlzIG5vIGxv bmdlciBpbg0KKyAqIHVzZSBhbmQgd2lsbCBiZSBmcmVlZC4NCisgKi8NCitzdGF0aWMgdm9pZCBt YV9mcmVlX3JjdShzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSkNCit7DQorCW5vZGUtPnBhcmVudCA9 IG1hX3BhcmVudF9wdHIobm9kZSk7DQorCWNhbGxfcmN1KCZub2RlLT5yY3UsIG10X2ZyZWVfcmN1 KTsNCit9DQorDQorc3RhdGljIHVuc2lnbmVkIGludCBtdF9oZWlnaHQoY29uc3Qgc3RydWN0IG1h cGxlX3RyZWUgKm10KQ0KK3sNCisJcmV0dXJuIChtdC0+bWFfZmxhZ3MgJiBNVF9GTEFHU19IRUlH SFRfTUFTSykgPj4gTVRfRkxBR1NfSEVJR0hUX09GRlNFVDsNCit9DQorDQorc3RhdGljIHZvaWQg bWFzX3NldF9oZWlnaHQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl1bnNpZ25lZCBpbnQg bmV3X2ZsYWdzID0gbWFzLT50cmVlLT5tYV9mbGFnczsNCisNCisJbmV3X2ZsYWdzICY9IH5NVF9G TEFHU19IRUlHSFRfTUFTSzsNCisJQlVHX09OKG1hcy0+ZGVwdGggPiBNQVBMRV9IRUlHSFRfTUFY KTsNCisJbmV3X2ZsYWdzIHw9IG1hcy0+ZGVwdGggPDwgTVRfRkxBR1NfSEVJR0hUX09GRlNFVDsN CisJbWFzLT50cmVlLT5tYV9mbGFncyA9IG5ld19mbGFnczsNCit9DQorDQorc3RhdGljIHVuc2ln bmVkIGludCBtYXNfbXRfaGVpZ2h0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJu IG10X2hlaWdodChtYXMtPnRyZWUpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGVudW0gbWFwbGVf dHlwZSBtdGVfbm9kZV90eXBlKGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqZW50cnkpDQorew0K KwlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKWVudHJ5ID4+IE1BUExFX05PREVfVFlQRV9TSElGVCkg Jg0KKwkJTUFQTEVfTk9ERV9UWVBFX01BU0s7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBt YV9pc19kZW5zZShjb25zdCBlbnVtIG1hcGxlX3R5cGUgdHlwZSkNCit7DQorCXJldHVybiB0eXBl IDwgbWFwbGVfbGVhZl82NDsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hX2lzX2xlYWYo Y29uc3QgZW51bSBtYXBsZV90eXBlIHR5cGUpDQorew0KKwlyZXR1cm4gdHlwZSA8IG1hcGxlX3Jh bmdlXzY0Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbXRlX2lzX2xlYWYoY29uc3Qgc3Ry dWN0IG1hcGxlX2Vub2RlICplbnRyeSkNCit7DQorCXJldHVybiBtYV9pc19sZWFmKG10ZV9ub2Rl X3R5cGUoZW50cnkpKTsNCit9DQorDQorLyoNCisgKiBXZSBhbHNvIHJlc2VydmUgdmFsdWVzIHdp dGggdGhlIGJvdHRvbSB0d28gYml0cyBzZXQgdG8gJzEwJyB3aGljaCBhcmUNCisgKiBiZWxvdyA0 MDk2DQorICovDQorc3RhdGljIGlubGluZSBib29sIG10X2lzX3Jlc2VydmVkKGNvbnN0IHZvaWQg KmVudHJ5KQ0KK3sNCisJcmV0dXJuICgodW5zaWduZWQgbG9uZyllbnRyeSA8IE1BUExFX1JFU0VS VkVEX1JBTkdFKSAmJg0KKwkJeGFfaXNfaW50ZXJuYWwoZW50cnkpOw0KK30NCisNCitzdGF0aWMg aW5saW5lIHZvaWQgbWFzX3NldF9lcnIoc3RydWN0IG1hX3N0YXRlICptYXMsIGxvbmcgZXJyKQ0K K3sNCisJbWFzLT5ub2RlID0gTUFfRVJST1IoZXJyKTsNCit9DQorDQorc3RhdGljIGlubGluZSBi b29sIG1hc19pc19wdHIoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gbWFzLT5u b2RlID09IE1BU19ST09UOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX2lzX3N0YXJ0 KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIG1hcy0+bm9kZSA9PSBNQVNfU1RB UlQ7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfaXNfZXJyKHN0cnVjdCBtYV9zdGF0 ZSAqbWFzKQ0KK3sNCisJcmV0dXJuIHhhX2lzX2VycihtYXMtPm5vZGUpOw0KK30NCisNCitzdGF0 aWMgaW5saW5lIGJvb2wgbWFzX3NlYXJjaGFibGUoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0K KwlpZiAobWFzX2lzX25vbmUobWFzKSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJaWYgKG1hc19p c19wdHIobWFzKSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0K K3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX25vZGUgKm10ZV90b19ub2RlKGNvbnN0IHN0cnVj dCBtYXBsZV9lbm9kZSAqZW50cnkpDQorew0KKwlyZXR1cm4gKHN0cnVjdCBtYXBsZV9ub2RlICop KCh1bnNpZ25lZCBsb25nKWVudHJ5ICYgfk1BUExFX05PREVfTUFTSyk7DQorfQ0KKw0KKy8qDQor ICogbXRlX3RvX21hdCgpIC0gQ29udmVydCBhIG1hcGxlIGVuY29kZWQgbm9kZSB0byBhIG1hcGxl IHRvcGlhcnkgbm9kZS4NCisgKiBAZW50cnk6IFRoZSBtYXBsZSBlbmNvZGVkIG5vZGUNCisgKg0K KyAqIFJldHVybjogYSBtYXBsZSB0b3BpYXJ5IHBvaW50ZXINCisgKi8NCitzdGF0aWMgaW5saW5l IHN0cnVjdCBtYXBsZV90b3BpYXJ5ICptdGVfdG9fbWF0KGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9k ZSAqZW50cnkpDQorew0KKwlyZXR1cm4gKHN0cnVjdCBtYXBsZV90b3BpYXJ5ICopDQorCQkoKHVu c2lnbmVkIGxvbmcpZW50cnkgJiB+TUFQTEVfTk9ERV9NQVNLKTsNCit9DQorDQorLyoNCisgKiBt YXNfbW4oKSAtIEdldCB0aGUgbWFwbGUgc3RhdGUgbm9kZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUg c3RhdGUNCisgKg0KKyAqIFJldHVybjogdGhlIG1hcGxlIG5vZGUgKG5vdCBlbmNvZGVkIC0gYmFy ZSBwb2ludGVyKS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtYXBsZV9ub2RlICptYXNf bW4oY29uc3Qgc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gbXRlX3RvX25vZGUo bWFzLT5ub2RlKTsNCit9DQorDQorLyoNCisgKiBtdGVfc2V0X25vZGVfZGVhZCgpIC0gU2V0IGEg bWFwbGUgZW5jb2RlZCBub2RlIGFzIGRlYWQuDQorICogQG1uOiBUaGUgbWFwbGUgZW5jb2RlZCBu b2RlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtdGVfc2V0X25vZGVfZGVhZChzdHJ1Y3Qg bWFwbGVfZW5vZGUgKm1uKQ0KK3sNCisJbXRlX3RvX25vZGUobW4pLT5wYXJlbnQgPSBtYV9wYXJl bnRfcHRyKG10ZV90b19ub2RlKG1uKSk7DQorCXNtcF93bWIoKTsNCit9DQorDQorLyogQml0IDEg aW5kaWNhdGVzIHRoZSByb290IGlzIGEgbm9kZSAqLw0KKyNkZWZpbmUgTUFQTEVfUk9PVF9OT0RF CQkJMHgwMg0KKy8qIG1hcGxlX3R5cGUgc3RvcmVkIGJpdCAzLTYgKi8NCisjZGVmaW5lIE1BUExF X0VOT0RFX1RZUEVfU0hJRlQJCTB4MDMNCisvKiBCaXQgMiBtZWFucyBhIE5VTEwgc29tZXdoZXJl IGJlbG93ICovDQorI2RlZmluZSBNQVBMRV9FTk9ERV9OVUxMCQkweDA0DQorDQorc3RhdGljIGlu bGluZSBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm10X21rX25vZGUoY29uc3Qgc3RydWN0IG1hcGxlX25v ZGUgKm5vZGUsDQorCQkJCQkgICAgIGVudW0gbWFwbGVfdHlwZSB0eXBlKQ0KK3sNCisJcmV0dXJu ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKW5vZGUgfA0KKwkJCSh0eXBlIDw8IE1BUExFX0VOT0RF X1RZUEVfU0hJRlQpIHwgTUFQTEVfRU5PREVfTlVMTCk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUg dm9pZCAqbXRlX21rX3Jvb3QoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICpub2RlKQ0KK3sNCisJ cmV0dXJuICh2b2lkICopKCh1bnNpZ25lZCBsb25nKW5vZGUgfCBNQVBMRV9ST09UX05PREUpOw0K K30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgKm10ZV9zYWZlX3Jvb3QoY29uc3Qgc3RydWN0IG1h cGxlX2Vub2RlICpub2RlKQ0KK3sNCisJcmV0dXJuICh2b2lkICopKCh1bnNpZ25lZCBsb25nKW5v ZGUgJiB+TUFQTEVfUk9PVF9OT0RFKTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG10ZV9z ZXRfZnVsbChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5vZGUpDQorew0KKwlub2RlID0gKHZv aWQgKikoKHVuc2lnbmVkIGxvbmcpbm9kZSAmIH5NQVBMRV9FTk9ERV9OVUxMKTsNCit9DQorDQor c3RhdGljIGlubGluZSB2b2lkIG10ZV9jbGVhcl9mdWxsKGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9k ZSAqbm9kZSkNCit7DQorCW5vZGUgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZylub2RlIHwgTUFQ TEVfRU5PREVfTlVMTCk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYV9pc19yb290KHN0 cnVjdCBtYXBsZV9ub2RlICpub2RlKQ0KK3sNCisJcmV0dXJuICgodW5zaWduZWQgbG9uZylub2Rl LT5wYXJlbnQgJiBNQV9ST09UX1BBUkVOVCk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBt dGVfaXNfcm9vdChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5vZGUpDQorew0KKwlyZXR1cm4g bWFfaXNfcm9vdChtdGVfdG9fbm9kZShub2RlKSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9v bCBtYXNfaXNfcm9vdF9saW1pdHMoY29uc3Qgc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwly ZXR1cm4gIW1hcy0+bWluICYmIG1hcy0+bWF4ID09IFVMT05HX01BWDsNCit9DQorDQorc3RhdGlj IGlubGluZSBib29sIG10X2lzX2FsbG9jKHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCXJl dHVybiAobXQtPm1hX2ZsYWdzICYgTVRfRkxBR1NfQUxMT0NfUkFOR0UpOw0KK30NCisNCisvKg0K KyAqIFRoZSBQYXJlbnQgUG9pbnRlcg0KKyAqIEV4Y2x1ZGluZyByb290LCB0aGUgcGFyZW50IHBv aW50ZXIgaXMgMjU2QiBhbGlnbmVkIGxpa2UgYWxsIG90aGVyIHRyZWUgbm9kZXMuDQorICogV2hl biBzdG9yaW5nIGEgMzIgb3IgNjQgYml0IHZhbHVlcywgdGhlIG9mZnNldCBjYW4gZml0IGludG8g NCBiaXRzLiAgVGhlIDE2DQorICogYml0IHZhbHVlcyBuZWVkIGFuIGV4dHJhIGJpdCB0byBzdG9y ZSB0aGUgb2Zmc2V0LiAgVGhpcyBleHRyYSBiaXQgY29tZXMgZnJvbQ0KKyAqIGEgcmV1c2Ugb2Yg dGhlIGxhc3QgYml0IGluIHRoZSBub2RlIHR5cGUuICBUaGlzIGlzIHBvc3NpYmxlIGJ5IHVzaW5n IGJpdCAxIHRvDQorICogaW5kaWNhdGUgaWYgYml0IDIgaXMgcGFydCBvZiB0aGUgdHlwZSBvciB0 aGUgc2xvdC4NCisgKg0KKyAqIE5vdGUgdHlwZXM6DQorICogIDB4Pz8xID0gUm9vdA0KKyAqICAw eD8wMCA9IDE2IGJpdCBub2Rlcw0KKyAqICAweDAxMCA9IDMyIGJpdCBub2Rlcw0KKyAqICAweDEx MCA9IDY0IGJpdCBub2Rlcw0KKyAqDQorICogU2xvdCBzaXplIGFuZCBhbGlnbm1lbnQNCisgKiAg MHg/PzEgOiBSb290DQorICogIDB4PzAwIDogMTYgYml0IHZhbHVlcywgdHlwZSBpbiAwLTEsIHNs b3QgaW4gMi02DQorICogIDB4MDEwIDogMzIgYml0IHZhbHVlcywgdHlwZSBpbiAwLTIsIHNsb3Qg aW4gMy02DQorICogIDB4MTEwIDogNjQgYml0IHZhbHVlcywgdHlwZSBpbiAwLTIsIHNsaXQgaW4g My02DQorICovDQorDQorI2RlZmluZSBNQVBMRV9QQVJFTlRfUk9PVAkJMHgwMQ0KKw0KKyNkZWZp bmUgTUFQTEVfUEFSRU5UX1NMT1RfU0hJRlQJCTB4MDMNCisjZGVmaW5lIE1BUExFX1BBUkVOVF9T TE9UX01BU0sJCTB4NzgNCisNCisjZGVmaW5lIE1BUExFX1BBUkVOVF8xNkJfU0xPVF9TSElGVAkw eDAyDQorI2RlZmluZSBNQVBMRV9QQVJFTlRfMTZCX1NMT1RfTUFTSwkweDdDDQorDQorI2RlZmlu ZSBNQVBMRV9QQVJFTlRfUkFOR0U2NAkJMHgwNg0KKyNkZWZpbmUgTUFQTEVfUEFSRU5UX1JBTkdF MzIJCTB4MDQNCisjZGVmaW5lIE1BUExFX1BBUkVOVF9OT1RfUkFOR0UxNgkweDAyDQorDQorLyoN CisgKiBtdGVfcGFyZW50X3NoaWZ0KCkgLSBHZXQgdGhlIHBhcmVudCBzaGlmdCBmb3IgdGhlIHNs b3Qgc3RvcmFnZS4NCisgKiBAcGFyZW50OiBUaGUgcGFyZW50IHBvaW50ZXIgY2FzdCBhcyBhbiB1 bnNpZ25lZCBsb25nDQorICogUmV0dXJuczogVGhlIHNoaWZ0IGludG8gdGhhdCBwb2ludGVyIHRv IHRoZSBzdGFyIHRvIG9mIHRoZSBzbG90DQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBs b25nIG10ZV9wYXJlbnRfc2hpZnQodW5zaWduZWQgbG9uZyBwYXJlbnQpDQorew0KKwkvKiBOb3Rl IGJpdCAxID09IDAgbWVhbnMgMTZCICovDQorCWlmIChsaWtlbHkocGFyZW50ICYgTUFQTEVfUEFS RU5UX05PVF9SQU5HRTE2KSkNCisJCXJldHVybiBNQVBMRV9QQVJFTlRfU0xPVF9TSElGVDsNCisN CisJcmV0dXJuIE1BUExFX1BBUkVOVF8xNkJfU0xPVF9TSElGVDsNCit9DQorDQorLyoNCisgKiBt dGVfcGFyZW50X3Nsb3RfbWFzaygpIC0gR2V0IHRoZSBzbG90IG1hc2sgZm9yIHRoZSBwYXJlbnQu DQorICogQHBhcmVudDogVGhlIHBhcmVudCBwb2ludGVyIGNhc3QgYXMgYW4gdW5zaWduZWQgbG9u Zy4NCisgKiBSZXR1cm5zOiBUaGUgc2xvdCBtYXNrIGZvciB0aGF0IHBhcmVudC4NCisgKi8NCitz dGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXRlX3BhcmVudF9zbG90X21hc2sodW5zaWduZWQg bG9uZyBwYXJlbnQpDQorew0KKwkvKiBOb3RlIGJpdCAxID09IDAgbWVhbnMgMTZCICovDQorCWlm IChsaWtlbHkocGFyZW50ICYgTUFQTEVfUEFSRU5UX05PVF9SQU5HRTE2KSkNCisJCXJldHVybiBN QVBMRV9QQVJFTlRfU0xPVF9NQVNLOw0KKw0KKwlyZXR1cm4gTUFQTEVfUEFSRU5UXzE2Ql9TTE9U X01BU0s7DQorfQ0KKw0KKy8qDQorICogbWFzX3BhcmVudF9lbnVtKCkgLSBSZXR1cm4gdGhlIG1h cGxlX3R5cGUgb2YgdGhlIHBhcmVudCBmcm9tIHRoZSBzdG9yZWQNCisgKiBwYXJlbnQgdHlwZS4N CisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbm9kZTogVGhlIG1hcGxlX2Vub2RlIHRv IGV4dHJhY3QgdGhlIHBhcmVudCdzIGVudW0NCisgKiBSZXR1cm5zOiBUaGUgbm9kZS0+cGFyZW50 IG1hcGxlX3R5cGUNCisgKi8NCitzdGF0aWMgaW5saW5lDQorZW51bSBtYXBsZV90eXBlIG10ZV9w YXJlbnRfZW51bShzdHJ1Y3QgbWFwbGVfZW5vZGUgKnBfZW5vZGUsDQorCQkJCXN0cnVjdCBtYXBs ZV90cmVlICptdCkNCit7DQorCXVuc2lnbmVkIGxvbmcgcF90eXBlOw0KKw0KKwlwX3R5cGUgPSAo dW5zaWduZWQgbG9uZylwX2Vub2RlOw0KKwlpZiAocF90eXBlICYgTUFQTEVfUEFSRU5UX1JPT1Qp DQorCQlyZXR1cm4gMDsgLyogVmFsaWRhdGVkIGluIHRoZSBjYWxsZXIuICovDQorDQorCXBfdHlw ZSAmPSBNQVBMRV9OT0RFX01BU0s7DQorCXBfdHlwZSA9IHBfdHlwZSAmIH4oTUFQTEVfUEFSRU5U X1JPT1QgfCBtdGVfcGFyZW50X3Nsb3RfbWFzayhwX3R5cGUpKTsNCisNCisJc3dpdGNoIChwX3R5 cGUpIHsNCisJY2FzZSBNQVBMRV9QQVJFTlRfUkFOR0U2NDogLyogb3IgTUFQTEVfUEFSRU5UX0FS QU5HRTY0ICovDQorCQlpZiAobXRfaXNfYWxsb2MobXQpKQ0KKwkJCXJldHVybiBtYXBsZV9hcmFu Z2VfNjQ7DQorCQlyZXR1cm4gbWFwbGVfcmFuZ2VfNjQ7DQorCX0NCisNCisJcmV0dXJuIDA7DQor fQ0KKw0KK3N0YXRpYyBpbmxpbmUNCitlbnVtIG1hcGxlX3R5cGUgbWFzX3BhcmVudF9lbnVtKHN0 cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVub2RlKQ0KK3sNCisJcmV0 dXJuIG10ZV9wYXJlbnRfZW51bShtYV9lbm9kZV9wdHIobXRlX3RvX25vZGUoZW5vZGUpLT5wYXJl bnQpLCBtYXMtPnRyZWUpOw0KK30NCisNCisvKg0KKyAqIG10ZV9zZXRfcGFyZW50KCkgLSBTZXQg dGhlIHBhcmVudCBub2RlIGFuZCBlbmNvZGUgdGhlIHNsb3QNCisgKiBAZW5vZGU6IFRoZSBlbmNv ZGVkIG1hcGxlIG5vZGUuDQorICogQHBhcmVudDogVGhlIGVuY29kZWQgbWFwbGUgbm9kZSB0aGF0 IGlzIHRoZSBwYXJlbnQgb2YgQGVub2RlLg0KKyAqIEBzbG90OiBUaGUgc2xvdCB0aGF0IEBlbm9k ZSByZXNpZGVzIGluIEBwYXJlbnQuDQorICoNCisgKiBTbG90IG51bWJlciBpcyBlbmNvZGVkIGlu IHRoZSBlbm9kZS0+cGFyZW50IGJpdCAzLTYgb3IgMi02LCBkZXBlbmRpbmcgb24gdGhlDQorICog cGFyZW50IHR5cGUuDQorICovDQorc3RhdGljIGlubGluZQ0KK3ZvaWQgbXRlX3NldF9wYXJlbnQo c3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSwgY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICpwYXJl bnQsDQorCQkgICAgdW5zaWduZWQgY2hhciBzbG90KQ0KK3sNCisJdW5zaWduZWQgbG9uZyB2YWwg PSAodW5zaWduZWQgbG9uZykgcGFyZW50Ow0KKwl1bnNpZ25lZCBsb25nIHNoaWZ0Ow0KKwl1bnNp Z25lZCBsb25nIHR5cGU7DQorCWVudW0gbWFwbGVfdHlwZSBwX3R5cGUgPSBtdGVfbm9kZV90eXBl KHBhcmVudCk7DQorDQorCXN3aXRjaChwX3R5cGUpIHsNCisJY2FzZSBtYXBsZV9yYW5nZV82NDoN CisJY2FzZSBtYXBsZV9hcmFuZ2VfNjQ6DQorCQlzaGlmdCA9IE1BUExFX1BBUkVOVF9TTE9UX1NI SUZUOw0KKwkJdHlwZSA9IE1BUExFX1BBUkVOVF9SQU5HRTY0Ow0KKwkJYnJlYWs7DQorCWNhc2Ug bWFwbGVfZGVuc2U6DQorCWNhc2UgbWFwbGVfbGVhZl82NDoNCisJCXNoaWZ0ID0gdHlwZSA9IDA7 DQorCQlCVUdfT04oMSk7DQorCQlicmVhazsNCisJfQ0KKw0KKwl2YWwgJj0gfk1BUExFX05PREVf TUFTSzsgLyogQ2xlYXIgYWxsIG5vZGUgbWV0YWRhdGEgaW4gcGFyZW50ICovDQorCXZhbCB8PSAo c2xvdCA8PCBzaGlmdCkgfCB0eXBlOw0KKwltdGVfdG9fbm9kZShlbm9kZSktPnBhcmVudCA9IG1h X3BhcmVudF9wdHIodmFsKTsNCit9DQorDQorLyoNCisgKiBtdGVfcGFyZW50X3Nsb3QoKSAtIGdl dCB0aGUgcGFyZW50IHNsb3Qgb2YgQGVub2RlLg0KKyAqIEBlbm9kZTogVGhlIGVuY29kZWQgbWFw bGUgbm9kZS4NCisgKg0KKyAqIFJldHVybjogVGhlIHNsb3QgaW4gdGhlIHBhcmVudCBub2RlIHdo ZXJlIEBlbm9kZSByZXNpZGVzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG10 ZV9wYXJlbnRfc2xvdChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVub2RlKQ0KK3sNCisJdW5z aWduZWQgbG9uZyB2YWwgPSAodW5zaWduZWQgbG9uZykgbXRlX3RvX25vZGUoZW5vZGUpLT5wYXJl bnQ7DQorDQorCS8qIFJvb3QuICovDQorCWlmICh2YWwgJiAxKQ0KKwkJcmV0dXJuIDA7DQorDQor CS8qDQorCSAqIE9rYXkgdG8gdXNlIE1BUExFX1BBUkVOVF8xNkJfU0xPVF9NQVNLIGFzIHRoZSBs YXN0IGJpdCB3aWxsIGJlIGxvc3QNCisJICogYnkgc2hpZnQgaWYgdGhlIHBhcmVudCBzaGlmdCBp cyBNQVBMRV9QQVJFTlRfU0xPVF9TSElGVA0KKwkgKi8NCisJcmV0dXJuICh2YWwgJiBNQVBMRV9Q QVJFTlRfMTZCX1NMT1RfTUFTSykgPj4gbXRlX3BhcmVudF9zaGlmdCh2YWwpOw0KK30NCisNCisv Kg0KKyAqIG10ZV9wYXJlbnQoKSAtIEdldCB0aGUgcGFyZW50IG9mIEBub2RlLg0KKyAqIEBub2Rl OiBUaGUgZW5jb2RlZCBtYXBsZSBub2RlLg0KKyAqDQorICogUmV0dXJuOiBUaGUgcGFyZW50IG1h cGxlIG5vZGUuDQorICovDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfbm9kZSAqbXRlX3Bh cmVudChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVub2RlKQ0KK3sNCisJcmV0dXJuICh2b2lk ICopKCh1bnNpZ25lZCBsb25nKQ0KKwkJCShtdGVfdG9fbm9kZShlbm9kZSktPnBhcmVudCkgJiB+ TUFQTEVfTk9ERV9NQVNLKTsNCit9DQorDQorLyoNCisgKiBtYV9kZWFkX25vZGUoKSAtIGNoZWNr IGlmIHRoZSBAZW5vZGUgaXMgZGVhZC4NCisgKiBAZW5vZGU6IFRoZSBlbmNvZGVkIG1hcGxlIG5v ZGUNCisgKg0KKyAqIFJldHVybjogdHJ1ZSBpZiBkZWFkLCBmYWxzZSBvdGhlcndpc2UuDQorICov DQorc3RhdGljIGlubGluZSBib29sIG1hX2RlYWRfbm9kZShjb25zdCBzdHJ1Y3QgbWFwbGVfbm9k ZSAqbm9kZSkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpwYXJlbnQgPSAodm9pZCAqKSgodW5z aWduZWQgbG9uZykNCisJCQkJCSAgICAgbm9kZS0+cGFyZW50ICYgfk1BUExFX05PREVfTUFTSyk7 DQorDQorCXJldHVybiAocGFyZW50ID09IG5vZGUpOw0KK30NCisvKg0KKyAqIG10ZV9kZWFkX25v ZGUoKSAtIGNoZWNrIGlmIHRoZSBAZW5vZGUgaXMgZGVhZC4NCisgKiBAZW5vZGU6IFRoZSBlbmNv ZGVkIG1hcGxlIG5vZGUNCisgKg0KKyAqIFJldHVybjogdHJ1ZSBpZiBkZWFkLCBmYWxzZSBvdGhl cndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBib29sIG10ZV9kZWFkX25vZGUoY29uc3Qgc3Ry dWN0IG1hcGxlX2Vub2RlICplbm9kZSkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpwYXJlbnQs ICpub2RlOw0KKw0KKwlub2RlID0gbXRlX3RvX25vZGUoZW5vZGUpOw0KKwlwYXJlbnQgPSBtdGVf cGFyZW50KGVub2RlKTsNCisJcmV0dXJuIChwYXJlbnQgPT0gbm9kZSk7DQorfQ0KKw0KKy8qDQor ICogbWFzX2FsbG9jYXRlZCgpIC0gR2V0IHRoZSBudW1iZXIgb2Ygbm9kZXMgYWxsb2NhdGVkIGlu IGEgbWFwbGUgc3RhdGUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICoNCisgKiBUaGUg bWFfc3RhdGUgYWxsb2MgbWVtYmVyIGlzIG92ZXJsb2FkZWQgdG8gaG9sZCBhIHBvaW50ZXIgdG8g dGhlIGZpcnN0DQorICogYWxsb2NhdGVkIG5vZGUgb3IgdG8gdGhlIG51bWJlciBvZiByZXF1ZXN0 ZWQgbm9kZXMgdG8gYWxsb2NhdGUuICBJZiBiaXQgMCBpcw0KKyAqIHNldCwgdGhlbiB0aGUgYWxs b2MgY29udGFpbnMgdGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgbm9kZXMuICBJZiB0aGVyZSBpcyBh bg0KKyAqIGFsbG9jYXRlZCBub2RlLCB0aGVuIHRoZSB0b3RhbCBhbGxvY2F0ZWQgbm9kZXMgaXMg aW4gdGhhdCBub2RlLg0KKyAqDQorICogUmV0dXJuOiBUaGUgdG90YWwgbnVtYmVyIG9mIG5vZGVz IGFsbG9jYXRlZA0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtYXNfYWxsb2Nh dGVkKGNvbnN0IHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJaWYgKCFtYXMtPmFsbG9jIHx8 ICgodW5zaWduZWQgbG9uZyltYXMtPmFsbG9jICYgMHgxKSkNCisJCXJldHVybiAwOw0KKw0KKwly ZXR1cm4gbWFzLT5hbGxvYy0+dG90YWw7DQorfQ0KKw0KKy8qDQorICogbWFzX3NldF9hbGxvY19y ZXEoKSAtIFNldCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBhbGxvY2F0aW9ucy4NCisgKiBAbWFz OiB0aGUgbWFwbGUgc3RhdGUNCisgKiBAY291bnQ6IHRoZSBudW1iZXIgb2YgYWxsb2NhdGlvbnMu DQorICoNCisgKiBUaGUgcmVxdWVzdGVkIG51bWJlciBvZiBhbGxvY2F0aW9ucyBpcyBlaXRoZXIg aW4gdGhlIGZpcnN0IGFsbG9jYXRlZCBub2RlLA0KKyAqIGxvY2F0ZWQgaW4gQG1hcy0+YWxsb2Mt PnJlcXVlc3RfY291bnQsIG9yIGRpcmVjdGx5IGluIEBtYXMtPmFsbG9jIGlmIHRoZXJlIGlzDQor ICogbm8gYWxsb2NhdGVkIG5vZGUuICBTZXQgdGhlIHJlcXVlc3QgZWl0aGVyIGluIHRoZSBub2Rl IG9yIGRvIHRoZSBuZWNlc3NhcnkNCisgKiBlbmNvZGluZyB0byBzdG9yZSBpbiBAbWFzLT5hbGxv YyBkaXJlY3RseS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3NldF9hbGxvY19yZXEo c3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgY291bnQpDQorew0KKwlpZiAoIW1h cy0+YWxsb2MgfHwgKCh1bnNpZ25lZCBsb25nKW1hcy0+YWxsb2MgJiAweDEpKSB7DQorCQlpZiAo IWNvdW50KQ0KKwkJCW1hcy0+YWxsb2MgPSBOVUxMOw0KKwkJZWxzZQ0KKwkJCW1hcy0+YWxsb2Mg PSAoc3RydWN0IG1hcGxlX2FsbG9jICopKCgoY291bnQpIDw8IDFVKSB8IDFVKTsNCisJCXJldHVy bjsNCisJfQ0KKw0KKwltYXMtPmFsbG9jLT5yZXF1ZXN0X2NvdW50ID0gY291bnQ7DQorfQ0KKw0K Ky8qDQorICogbWFzX2FsbG9jX3JlcSgpIC0gZ2V0IHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGFs bG9jYXRpb25zLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogVGhlIGFsbG9j IGNvdW50IGlzIGVpdGhlciBzdG9yZWQgZGlyZWN0bHkgaW4gQG1hcywgb3IgaW4NCisgKiBAbWFz LT5hbGxvYy0+cmVxdWVzdF9jb3VudCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgbm9kZSBhbGxv Y2F0ZWQuICBEZWNvZGUNCisgKiB0aGUgcmVxdWVzdCBjb3VudCBpZiBpdCdzIHN0b3JlZCBkaXJl Y3RseSBpbiBAbWFzLT5hbGxvYy4NCisgKg0KKyAqIFJldHVybjogVGhlIGFsbG9jYXRpb24gcmVx dWVzdCBjb3VudC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtYXNfYWxsb2Nf cmVxKGNvbnN0IHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJaWYgKCh1bnNpZ25lZCBsb25n KW1hcy0+YWxsb2MgJiAweDEpDQorCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpKG1hcy0+YWxsb2Mp ID4+IDE7DQorCWVsc2UgaWYgKG1hcy0+YWxsb2MpDQorCQlyZXR1cm4gbWFzLT5hbGxvYy0+cmVx dWVzdF9jb3VudDsNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qDQorICogbWFfcGl2b3RzKCkgLSBH ZXQgYSBwb2ludGVyIHRvIHRoZSBtYXBsZSBub2RlIHBpdm90cy4NCisgKiBAbm9kZSAtIHRoZSBt YXBsZSBub2RlDQorICogQHR5cGUgLSB0aGUgbm9kZSB0eXBlDQorICoNCisgKiBSZXR1cm46IEEg cG9pbnRlciB0byB0aGUgbWFwbGUgbm9kZSBwaXZvdHMNCisgKi8NCitzdGF0aWMgaW5saW5lIHVu c2lnbmVkIGxvbmcgKm1hX3Bpdm90cyhzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwNCisJCQkJCSAg IGVudW0gbWFwbGVfdHlwZSB0eXBlKQ0KK3sNCisJc3dpdGNoICh0eXBlKSB7DQorCWNhc2UgbWFw bGVfYXJhbmdlXzY0Og0KKwkJcmV0dXJuIG5vZGUtPm1hNjQucGl2b3Q7DQorCWNhc2UgbWFwbGVf cmFuZ2VfNjQ6DQorCWNhc2UgbWFwbGVfbGVhZl82NDoNCisJCXJldHVybiBub2RlLT5tcjY0LnBp dm90Ow0KKwljYXNlIG1hcGxlX2RlbnNlOg0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisJcmV0dXJu IE5VTEw7DQorfQ0KKw0KKy8qDQorICogbWFfZ2FwcygpIC0gR2V0IGEgcG9pbnRlciB0byB0aGUg bWFwbGUgbm9kZSBnYXBzLg0KKyAqIEBub2RlIC0gdGhlIG1hcGxlIG5vZGUNCisgKiBAdHlwZSAt IHRoZSBub2RlIHR5cGUNCisgKg0KKyAqIFJldHVybjogQSBwb2ludGVyIHRvIHRoZSBtYXBsZSBu b2RlIGdhcHMNCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKm1hX2dhcHMoc3Ry dWN0IG1hcGxlX25vZGUgKm5vZGUsDQorCQkJCSAgICAgZW51bSBtYXBsZV90eXBlIHR5cGUpDQor ew0KKwlzd2l0Y2ggKHR5cGUpIHsNCisJY2FzZSBtYXBsZV9hcmFuZ2VfNjQ6DQorCQlyZXR1cm4g bm9kZS0+bWE2NC5nYXA7DQorCWNhc2UgbWFwbGVfcmFuZ2VfNjQ6DQorCWNhc2UgbWFwbGVfbGVh Zl82NDoNCisJY2FzZSBtYXBsZV9kZW5zZToNCisJCXJldHVybiBOVUxMOw0KKwl9DQorCXJldHVy biBOVUxMOw0KK30NCisNCisvKg0KKyAqIG10ZV9waXZvdCgpIC0gR2V0IHRoZSBwaXZvdCBhdCBA cGl2IG9mIHRoZSBtYXBsZSBlbmNvZGVkIG5vZGUuDQorICogQG1uOiBUaGUgbWFwbGUgZW5jb2Rl ZCBub2RlLg0KKyAqIEBwaXY6IFRoZSBwaXZvdC4NCisgKg0KKyAqIFJldHVybjogdGhlIHBpdm90 IGF0IEBwaXYgb2YgQG1uLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtdGVf cGl2b3QoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICptbiwNCisJCQkJIHVuc2lnbmVkIGNoYXIg cGl2KQ0KK3sNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUgPSBtdGVfdG9fbm9kZShtbik7DQor DQorCWlmKHBpdiA+PSBtdF9waXZvdHNbcGl2XSkgew0KKwkJV0FSTl9PTigxKTsNCisJCXJldHVy biAwOw0KKwl9DQorCXN3aXRjaCAobXRlX25vZGVfdHlwZShtbikpIHsNCisJY2FzZSBtYXBsZV9h cmFuZ2VfNjQ6DQorCQlyZXR1cm4gbm9kZS0+bWE2NC5waXZvdFtwaXZdOw0KKwljYXNlIG1hcGxl X3JhbmdlXzY0Og0KKwljYXNlIG1hcGxlX2xlYWZfNjQ6DQorCQlyZXR1cm4gbm9kZS0+bXI2NC5w aXZvdFtwaXZdOw0KKwljYXNlIG1hcGxlX2RlbnNlOg0KKwkJcmV0dXJuIDA7DQorCX0NCisJcmV0 dXJuIDA7DQorfQ0KKw0KKy8qDQorICogbWFzX3NhZmVfcGl2b3QoKSAtIGdldCB0aGUgcGl2b3Qg YXQgQHBpdiBvciBtYXMtPm1heC4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAcGl2 b3RzOiBUaGUgcG9pbnRlciB0byB0aGUgbWFwbGUgbm9kZSBwaXZvdHMNCisgKiBAcGl2OiBUaGUg cGl2b3QgdG8gZmV0Y2gNCisgKiBAdHlwZTogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqDQorICog UmV0dXJuOiBUaGUgcGl2b3QgYXQgQHBpdiB3aXRoaW4gdGhlIGxpbWl0IG9mIHRoZSBAcGl2b3Rz IGFycmF5LCBAbWFzLT5tYXgNCisgKiBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGluZSB1 bnNpZ25lZCBsb25nDQorbWFzX3NhZmVfcGl2b3QoY29uc3Qgc3RydWN0IG1hX3N0YXRlICptYXMs IHVuc2lnbmVkIGxvbmcgKnBpdm90cywNCisJICAgICAgIHVuc2lnbmVkIGNoYXIgcGl2LCBlbnVt IG1hcGxlX3R5cGUgdHlwZSkNCit7DQorCWlmIChwaXYgPj0gbXRfcGl2b3RzW3R5cGVdKQ0KKwkJ cmV0dXJuIG1hcy0+bWF4Ow0KKw0KKwlyZXR1cm4gcGl2b3RzW3Bpdl07DQorfQ0KKw0KKy8qDQor ICogbWFzX3NhZmVfbWluKCkgLSBSZXR1cm4gdGhlIG1pbmltdW0gZm9yIGEgZ2l2ZW4gb2Zmc2V0 Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBwaXZvdHM6IFRoZSBwb2ludGVyIHRv IHRoZSBtYXBsZSBub2RlIHBpdm90cw0KKyAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgaW50byB0aGUg cGl2b3QgYXJyYXkNCisgKg0KKyAqIFJldHVybnM6IFRoZSBtaW5pbXVtIHJhbmdlIHZhbHVlIHRo YXQgaXMgY29udGFpbmVkIGluIEBvZmZzZXQuDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25l ZCBsb25nDQorbWFzX3NhZmVfbWluKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25n ICpwaXZvdHMsIHVuc2lnbmVkIGNoYXIgb2Zmc2V0KQ0KK3sNCisJaWYgKGxpa2VseShvZmZzZXQp KQ0KKwkJcmV0dXJuIHBpdm90c1tvZmZzZXQgLSAxXSArIDE7DQorDQorCXJldHVybiBtYXMtPm1p bjsNCit9DQorDQorLyoNCisgKiBtYXNfbG9naWNhbF9waXZvdCgpIC0gR2V0IHRoZSBsb2dpY2Fs IHBpdm90IG9mIGEgZ2l2ZW4gb2Zmc2V0Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAq IEBwaXZvdHM6IFRoZSBwb2ludGVyIHRvIHRoZSBtYXBsZSBub2RlIHBpdm90cw0KKyAqIEBvZmZz ZXQ6IFRoZSBvZmZzZXQgaW50byB0aGUgcGl2b3QgYXJyYXkNCisgKiBAdHlwZTogVGhlIG1hcGxl IG5vZGUgdHlwZQ0KKyAqDQorICogV2hlbiB0aGVyZSBpcyBubyB2YWx1ZSBhdCBhIHBpdm90IChi ZXlvbmQgdGhlIGVuZCBvZiB0aGUgZGF0YSksIHRoZW4gdGhlDQorICogcGl2b3QgaXMgYWN0dWFs bHkgQG1hcy0+bWF4Lg0KKyAqDQorICogUmV0dXJuOiB0aGUgbG9naWNhbCBwaXZvdCBvZiBhIGdp dmVuIEBvZmZzZXQuDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nDQorbWFzX2xv Z2ljYWxfcGl2b3Qoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgKnBpdm90cywN CisJCSAgdW5zaWduZWQgY2hhciBvZmZzZXQsIGVudW0gbWFwbGVfdHlwZSB0eXBlKQ0KK3sNCisJ dW5zaWduZWQgbG9uZyBscGl2ID0gbWFzX3NhZmVfcGl2b3QobWFzLCBwaXZvdHMsIG9mZnNldCwg dHlwZSk7DQorDQorCWlmIChsaWtlbHkobHBpdikpDQorCQlyZXR1cm4gbHBpdjsNCisNCisJaWYg KGxpa2VseShvZmZzZXQpKQ0KKwkJcmV0dXJuIG1hcy0+bWF4Ow0KKw0KKwlyZXR1cm4gbHBpdjsN Cit9DQorDQorLyoNCisgKiBtdGVfc2V0X3Bpdm90KCkgLSBTZXQgYSBwaXZvdCB0byBhIHZhbHVl IGluIGFuIGVuY29kZWQgbWFwbGUgbm9kZS4NCisgKiBAbW46IFRoZSBlbmNvZGVkIG1hcGxlIG5v ZGUNCisgKiBAcGl2OiBUaGUgcGl2b3Qgb2Zmc2V0DQorICogQHZhbDogVGhlIHZhbHVlIG9mIHRo ZSBwaXZvdA0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtdGVfc2V0X3Bpdm90KHN0cnVjdCBt YXBsZV9lbm9kZSAqbW4sIHVuc2lnbmVkIGNoYXIgcGl2LA0KKwkJCQl1bnNpZ25lZCBsb25nIHZh bCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlID0gbXRlX3RvX25vZGUobW4pOw0KKwll bnVtIG1hcGxlX3R5cGUgdHlwZSA9IG10ZV9ub2RlX3R5cGUobW4pOw0KKw0KKwlCVUdfT04ocGl2 ID49IG10X3Bpdm90c1t0eXBlXSk7DQorCXN3aXRjaCAodHlwZSkgew0KKwlkZWZhdWx0Og0KKwlj YXNlIG1hcGxlX3JhbmdlXzY0Og0KKwljYXNlIG1hcGxlX2xlYWZfNjQ6DQorCQkoJm5vZGUtPm1y NjQpLT5waXZvdFtwaXZdID0gdmFsOw0KKwkJYnJlYWs7DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0 Og0KKwkJKCZub2RlLT5tYTY0KS0+cGl2b3RbcGl2XSA9IHZhbDsNCisJY2FzZSBtYXBsZV9kZW5z ZToNCisJCWJyZWFrOw0KKwl9DQorDQorfQ0KKw0KKy8qDQorICogbWFfc2xvdHMoKSAtIEdldCBh IHBvaW50ZXIgdG8gdGhlIG1hcGxlIG5vZGUgc2xvdHMuDQorICogQG1uOiBUaGUgbWFwbGUgbm9k ZQ0KKyAqIEBtdDogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqDQorICogUmV0dXJuOiBBIHBvaW50 ZXIgdG8gdGhlIG1hcGxlIG5vZGUgc2xvdHMNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgX19y Y3UgKiptYV9zbG90cyhzdHJ1Y3QgbWFwbGVfbm9kZSAqbW4sIGVudW0gbWFwbGVfdHlwZSBtdCkN Cit7DQorCXN3aXRjaCAobXQpIHsNCisJZGVmYXVsdDoNCisJY2FzZSBtYXBsZV9hcmFuZ2VfNjQ6 DQorCQlyZXR1cm4gbW4tPm1hNjQuc2xvdDsNCisJY2FzZSBtYXBsZV9yYW5nZV82NDoNCisJY2Fz ZSBtYXBsZV9sZWFmXzY0Og0KKwkJcmV0dXJuIG1uLT5tcjY0LnNsb3Q7DQorCWNhc2UgbWFwbGVf ZGVuc2U6DQorCQlyZXR1cm4gbW4tPnNsb3Q7DQorCX0NCit9DQorDQorc3RhdGljIGlubGluZSBi b29sIG10X2xvY2tlZChjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwlyZXR1cm4g bXRfZXh0ZXJuYWxfbG9jayhtdCkgPyBtdF9sb2NrX2lzX2hlbGQobXQpIDoNCisJCWxvY2tkZXBf aXNfaGVsZCgmbXQtPm1hX2xvY2spOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgKm10X3Ns b3QoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10LA0KKwkJdm9pZCBfX3JjdSAqKnNsb3RzLCB1 bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorCXJldHVybiByY3VfZGVyZWZlcmVuY2VfY2hlY2so c2xvdHNbb2Zmc2V0XSwgbXRfbG9ja2VkKG10KSk7DQorfQ0KKw0KKy8qDQorICogbWFzX3Nsb3Rf bG9ja2VkKCkgLSBHZXQgdGhlIHNsb3QgdmFsdWUgd2hlbiBob2xkaW5nIHRoZSBtYXBsZSB0cmVl IGxvY2suDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQHNsb3RzOiBUaGUgcG9pbnRl ciB0byB0aGUgc2xvdHMNCisgKiBAb2Zmc2V0OiBUaGUgb2Zmc2V0IGludG8gdGhlIHNsb3RzIGFy cmF5IHRvIGZldGNoDQorICoNCisgKiBSZXR1cm46IFRoZSBlbnRyeSBzdG9yZWQgaW4gQHNsb3Rz IGF0IHRoZSBAb2Zmc2V0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWFzX3Nsb3RfbG9j a2VkKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkIF9fcmN1ICoqc2xvdHMsDQorCQkJCSAgICAg ICB1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorCXJldHVybiByY3VfZGVyZWZlcmVuY2VfcHJv dGVjdGVkKHNsb3RzW29mZnNldF0sIG10X2xvY2tlZChtYXMtPnRyZWUpKTsNCit9DQorDQorLyoN CisgKiBtYXNfc2xvdCgpIC0gR2V0IHRoZSBzbG90IHZhbHVlIHdoZW4gbm90IGhvbGRpbmcgdGhl IG1hcGxlIHRyZWUgbG9jay4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAc2xvdHM6 IFRoZSBwb2ludGVyIHRvIHRoZSBzbG90cw0KKyAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgaW50byB0 aGUgc2xvdHMgYXJyYXkgdG8gZmV0Y2gNCisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IHN0b3Jl ZCBpbiBAc2xvdHMgYXQgdGhlIEBvZmZzZXQNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1h c19zbG90KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkIF9fcmN1ICoqc2xvdHMsDQorCQkJICAg ICB1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7DQorCXJldHVybiBtdF9zbG90KG1hcy0+dHJlZSwg c2xvdHMsIG9mZnNldCk7DQorfQ0KKw0KKy8qDQorICogbWFzX2dldF9zbG90KCkgLSBHZXQgdGhl IGVudHJ5IGluIHRoZSBtYXBsZSBzdGF0ZSBub2RlIHN0b3JlZCBhdCBAb2Zmc2V0Lg0KKyAqIEBt YXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgaW50byB0aGUgc2xv dCBhcnJheSB0byBmZXRjaC4NCisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IHN0b3JlZCBhdCBA b2Zmc2V0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX2Vub2RlICptYXNfZ2V0 X3Nsb3Qoc3RydWN0IG1hX3N0YXRlICptYXMsDQorCQl1bnNpZ25lZCBjaGFyIG9mZnNldCkNCit7 DQorCXJldHVybiBtYXNfc2xvdChtYXMsIG1hX3Nsb3RzKG1hc19tbihtYXMpLCBtdGVfbm9kZV90 eXBlKG1hcy0+bm9kZSkpLA0KKwkJICAgICAgIG9mZnNldCk7DQorfQ0KKw0KKy8qDQorICogbWFz X3Jvb3QoKSAtIEdldCB0aGUgbWFwbGUgdHJlZSByb290Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBz dGF0ZS4NCisgKg0KKyAqIFJldHVybjogVGhlIHBvaW50ZXIgdG8gdGhlIHJvb3Qgb2YgdGhlIHRy ZWUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19yb290KHN0cnVjdCBtYV9zdGF0ZSAq bWFzKQ0KK3sNCisJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZV9jaGVjayhtYXMtPnRyZWUtPm1hX3Jv b3QsIG10X2xvY2tlZChtYXMtPnRyZWUpKTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkICpt dF9yb290X2xvY2tlZChjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwlyZXR1cm4g cmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChtdC0+bWFfcm9vdCwgbXRfbG9ja2VkKG10KSk7DQor fQ0KKw0KKy8qDQorICogbWFzX3Jvb3RfbG9ja2VkKCkgLSBHZXQgdGhlIG1hcGxlIHRyZWUgcm9v dCB3aGVuIGhvbGRpbmcgdGhlIG1hcGxlIHRyZWUgbG9jay4NCisgKiBAbWFzOiBUaGUgbWFwbGUg c3RhdGUuDQorICoNCisgKiBSZXR1cm46IFRoZSBwb2ludGVyIHRvIHRoZSByb290IG9mIHRoZSB0 cmVlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkICptYXNfcm9vdF9sb2NrZWQoc3RydWN0IG1h X3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gbXRfcm9vdF9sb2NrZWQobWFzLT50cmVlKTsNCit9 DQorDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfbWV0YWRhdGEgKm1hX21ldGEoc3RydWN0 IG1hcGxlX25vZGUgKm1uLA0KKwkJCQkJICAgICBlbnVtIG1hcGxlX3R5cGUgbXQpDQorew0KKwlz d2l0Y2ggKG10KSB7DQorCWNhc2UgbWFwbGVfYXJhbmdlXzY0Og0KKwkJcmV0dXJuICZtbi0+bWE2 NC5tZXRhOw0KKwlkZWZhdWx0Og0KKwkJcmV0dXJuICZtbi0+bXI2NC5tZXRhOw0KKwl9DQorfQ0K Kw0KKy8qDQorICogbWFfc2V0X21ldGEoKSAtIFNldCB0aGUgbWV0YWRhdGEgaW5mb3JtYXRpb24g b2YgYSBub2RlLg0KKyAqIEBtbjogVGhlIG1hcGxlIG5vZGUNCisgKiBAbXQ6IFRoZSBtYXBsZSBu b2RlIHR5cGUNCisgKiBAb2Zmc2V0OiBUaGUgb2Zmc2V0IG9mIHRoZSBoaWdoZXN0IHN1Yi1nYXAg aW4gdGhpcyBub2RlLg0KKyAqIEBlbmQ6IFRoZSBlbmQgb2YgdGhlIGRhdGEgaW4gdGhpcyBub2Rl Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYV9zZXRfbWV0YShzdHJ1Y3QgbWFwbGVfbm9k ZSAqbW4sIGVudW0gbWFwbGVfdHlwZSBtdCwNCisJCQkgICAgICAgdW5zaWduZWQgY2hhciBvZmZz ZXQsIHVuc2lnbmVkIGNoYXIgZW5kKQ0KK3sNCisJc3RydWN0IG1hcGxlX21ldGFkYXRhICptZXRh ID0gbWFfbWV0YShtbiwgbXQpOw0KKw0KKwltZXRhLT5nYXAgPSBvZmZzZXQ7DQorCW1ldGEtPmVu ZCA9IGVuZDsNCit9DQorDQorLyoNCisgKiBtYV9tZXRhX2VuZCgpIC0gR2V0IHRoZSBkYXRhIGVu ZCBvZiBhIG5vZGUgZnJvbSB0aGUgbWV0YWRhdGENCisgKiBAbW46IFRoZSBtYXBsZSBub2RlDQor ICogQG10OiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25l ZCBjaGFyIG1hX21ldGFfZW5kKHN0cnVjdCBtYXBsZV9ub2RlICptbiwNCisJCQkJCWVudW0gbWFw bGVfdHlwZSBtdCkNCit7DQorCXN0cnVjdCBtYXBsZV9tZXRhZGF0YSAqbWV0YSA9IG1hX21ldGEo bW4sIG10KTsNCisNCisJcmV0dXJuIG1ldGEtPmVuZDsNCit9DQorDQorLyoNCisgKiBtYV9tZXRh X2dhcCgpIC0gR2V0IHRoZSBsYXJnZXN0IGdhcCBsb2NhdGlvbiBvZiBhIG5vZGUgZnJvbSB0aGUg bWV0YWRhdA0KKyAqIEBtbjogVGhlIG1hcGxlIG5vZGUNCisgKiBAbXQ6IFRoZSBtYXBsZSBub2Rl IHR5cGUNCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgbWFfbWV0YV9nYXAoc3Ry dWN0IG1hcGxlX25vZGUgKm1uLA0KKwkJCQkJZW51bSBtYXBsZV90eXBlIG10KQ0KK3sNCisNCisJ cmV0dXJuIG1uLT5tYTY0Lm1ldGEuZ2FwOw0KK30NCisNCisvKg0KKyAqIG1hX3NldF9tZXRhX2dh cCgpIC0gU2V0IHRoZSBsYXJnZXN0IGdhcCBsb2NhdGlvbiBpbiBhIG5vZGVzIG1ldGFkYXRhDQor ICogQG1uOiBUaGUgbWFwbGUgbm9kZQ0KKyAqIEBtbjogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAq IEBvZmZzZXQ6IFRoZSBsb2NhdGlvbiBvZiB0aGUgbGFyZ2VzdCBnYXAuDQorICovDQorc3RhdGlj IGlubGluZSB2b2lkIG1hX3NldF9tZXRhX2dhcChzdHJ1Y3QgbWFwbGVfbm9kZSAqbW4sIGVudW0g bWFwbGVfdHlwZSBtdCwNCisJCQkJICAgdW5zaWduZWQgY2hhciBvZmZzZXQpDQorew0KKw0KKwlz dHJ1Y3QgbWFwbGVfbWV0YWRhdGEgKm1ldGEgPSBtYV9tZXRhKG1uLCBtdCk7DQorDQorCW1ldGEt PmdhcCA9IG9mZnNldDsNCit9DQorDQorLyoNCisgKiBtYXRfYWRkKCkgLSBBZGQgYSBAZGVhZF9l bm9kZSB0byB0aGUgbWFfdG9waWFyeSBvZiBhIGxpc3Qgb2YgZGVhZCBub2Rlcy4NCisgKiBAbWF0 IC0gdGhlIG1hX3RvcGlhcnksIGEgbGlua2VkIGxpc3Qgb2YgZGVhZCBub2Rlcy4NCisgKiBAZGVh ZF9lbm9kZSAtIHRoZSBub2RlIHRvIGJlIG1hcmtlZCBhcyBkZWFkIGFuZCBhZGRlZCB0byB0aGUg dGFpbCBvZiB0aGUgbGlzdA0KKyAqDQorICogQWRkIHRoZSBAZGVhZF9lbm9kZSB0byB0aGUgbGlu a2VkIGxpc3QgaW4gQG1hdC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWF0X2FkZChzdHJ1 Y3QgbWFfdG9waWFyeSAqbWF0LA0KKwkJCSAgIHN0cnVjdCBtYXBsZV9lbm9kZSAqZGVhZF9lbm9k ZSkNCit7DQorCW10ZV9zZXRfbm9kZV9kZWFkKGRlYWRfZW5vZGUpOw0KKwltdGVfdG9fbWF0KGRl YWRfZW5vZGUpLT5uZXh0ID0gTlVMTDsNCisJaWYgKCFtYXQtPnRhaWwpIHsNCisJCW1hdC0+dGFp bCA9IG1hdC0+aGVhZCA9IGRlYWRfZW5vZGU7DQorCQlyZXR1cm47DQorCX0NCisNCisJbXRlX3Rv X21hdChtYXQtPnRhaWwpLT5uZXh0ID0gZGVhZF9lbm9kZTsNCisJbWF0LT50YWlsID0gZGVhZF9l bm9kZTsNCit9DQorDQorc3RhdGljIHZvaWQgbXRlX2Rlc3Ryb3lfd2FsayhzdHJ1Y3QgbWFwbGVf ZW5vZGUgKiwgc3RydWN0IG1hcGxlX3RyZWUgKik7DQorc3RhdGljIGlubGluZSB2b2lkIG1hc19m cmVlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKnVzZWQpOw0KKw0K Ky8qDQorICogbWFzX21hdF9mcmVlKCkgLSBGcmVlIGFsbCBub2RlcyBpbiBhIGRlYWQgbGlzdC4N CisgKiBAbWFzIC0gdGhlIG1hcGxlIHN0YXRlDQorICogQG1hdCAtIHRoZSBtYV90b3BpYXJ5IGxp bmtlZCBsaXN0IG9mIGRlYWQgbm9kZXMgdG8gZnJlZS4NCisgKg0KKyAqIEZyZWUgd2FsayBhIGRl YWQgbGlzdC4NCisgKi8NCitzdGF0aWMgdm9pZCBtYXNfbWF0X2ZyZWUoc3RydWN0IG1hX3N0YXRl ICptYXMsIHN0cnVjdCBtYV90b3BpYXJ5ICptYXQpDQorew0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUg Km5leHQ7DQorDQorCXdoaWxlIChtYXQtPmhlYWQpIHsNCisJCW5leHQgPSBtdGVfdG9fbWF0KG1h dC0+aGVhZCktPm5leHQ7DQorCQltYXNfZnJlZShtYXMsIG1hdC0+aGVhZCk7DQorCQltYXQtPmhl YWQgPSBuZXh0Ow0KKwl9DQorfQ0KKw0KKy8qDQorICogbWFzX21hdF9kZXN0cm95KCkgLSBGcmVl IGFsbCBub2RlcyBhbmQgc3VidHJlZXMgaW4gYSBkZWFkIGxpc3QuDQorICogQG1hcyAtIHRoZSBt YXBsZSBzdGF0ZQ0KKyAqIEBtYXQgLSB0aGUgbWFfdG9waWFyeSBsaW5rZWQgbGlzdCBvZiBkZWFk IG5vZGVzIHRvIGZyZWUuDQorICoNCisgKiBEZXN0cm95IHdhbGsgYSBkZWFkIGxpc3QuDQorICov DQorc3RhdGljIHZvaWQgbWFzX21hdF9kZXN0cm95KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1 Y3QgbWFfdG9waWFyeSAqbWF0KQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vub2RlICpuZXh0Ow0KKw0K Kwl3aGlsZSAobWF0LT5oZWFkKSB7DQorCQluZXh0ID0gbXRlX3RvX21hdChtYXQtPmhlYWQpLT5u ZXh0Ow0KKwkJbXRlX2Rlc3Ryb3lfd2FsayhtYXQtPmhlYWQsIG1hdC0+bXRyZWUpOw0KKwkJbWF0 LT5oZWFkID0gbmV4dDsNCisJfQ0KK30NCisvKg0KKyAqIG1hc19kZXNjZW5kKCkgLSBEZXNjZW5k IGludG8gdGhlIHNsb3Qgc3RvcmVkIGluIHRoZSBtYV9zdGF0ZS4NCisgKiBAbWFzIC0gdGhlIG1h cGxlIHN0YXRlLg0KKyAqDQorICogTm90ZTogTm90IFJDVSBzYWZlLCBvbmx5IHVzZSBpbiB3cml0 ZSBzaWRlIG9yIGRlYnVnIGNvZGUuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19kZXNj ZW5kKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJZW51bSBtYXBsZV90eXBlIHR5cGU7DQor CXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXZv aWQgX19yY3UgKipzbG90czsNCisNCisJbm9kZSA9IG1hc19tbihtYXMpOw0KKwl0eXBlID0gbXRl X25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgdHlwZSk7 DQorCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgdHlwZSk7DQorDQorCWlmIChtYXMtPm9mZnNldCkN CisJCW1hcy0+bWluID0gcGl2b3RzW21hcy0+b2Zmc2V0IC0gMV0gKyAxOw0KKwltYXMtPm1heCA9 IG1hc19zYWZlX3Bpdm90KG1hcywgcGl2b3RzLCBtYXMtPm9mZnNldCwgdHlwZSk7DQorCW1hcy0+ bm9kZSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG1hcy0+b2Zmc2V0KTsNCit9DQorDQorLyoNCisg KiBtdGVfc2V0X2dhcCgpIC0gU2V0IGEgbWFwbGUgbm9kZSBnYXAuDQorICogQG1uOiBUaGUgZW5j b2RlZCBtYXBsZSBub2RlDQorICogQGdhcDogVGhlIG9mZnNldCBvZiB0aGUgZ2FwIHRvIHNldA0K KyAqIEB2YWw6IFRoZSBnYXAgdmFsdWUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRlX3Nl dF9nYXAoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICptbiwNCisJCQkJIHVuc2lnbmVkIGNoYXIg Z2FwLCB1bnNpZ25lZCBsb25nIHZhbCkNCit7DQorCXN3aXRjaCAobXRlX25vZGVfdHlwZShtbikp IHsNCisJZGVmYXVsdDoNCisJCWJyZWFrOw0KKwljYXNlIG1hcGxlX2FyYW5nZV82NDoNCisJCW10 ZV90b19ub2RlKG1uKS0+bWE2NC5nYXBbZ2FwXSA9IHZhbDsNCisJCWJyZWFrOw0KKwl9DQorfQ0K Kw0KKy8qDQorICogbWFzX2FzY2VuZCgpIC0gV2FsayB1cCBhIGxldmVsIG9mIHRoZSB0cmVlLg0K KyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogU2V0cyB0aGUgQG1hcy0+bWF4IGFu ZCBAbWFzLT5taW4gdG8gdGhlIGNvcnJlY3QgdmFsdWVzIHdoZW4gd2Fsa2luZyB1cC4gIFRoaXMN CisgKiBtYXkgY2F1c2Ugc2V2ZXJhbCBsZXZlbHMgb2Ygd2Fsa2luZyB1cCB0byBmaW5kIHRoZSBj b3JyZWN0IG1pbiBhbmQgbWF4Lg0KKyAqIE1heSBmaW5kIGEgZGVhZCBub2RlIHdoaWNoIHdpbGwg Y2F1c2UgYSBwcmVtYXR1cmUgcmV0dXJuLg0KKyAqIFJldHVybnM6IDEgb24gZGVhZCBub2RlLCAw IG90aGVyd2lzZQ0KKyAqLw0KK3N0YXRpYyBpbnQgbWFzX2FzY2VuZChzdHJ1Y3QgbWFfc3RhdGUg Km1hcykNCit7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqcF9lbm9kZTsgLyogcGFyZW50IGVub2Rl LiAqLw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmFfZW5vZGU7IC8qIGFuY2VzdG9yIGVub2RlLiAq Lw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqYV9ub2RlOyAvKiBhbmNlc3RvciBub2RlLiAqLw0KKwlz dHJ1Y3QgbWFwbGVfbm9kZSAqcF9ub2RlOyAvKiBwYXJlbnQgbm9kZS4gKi8NCisJdW5zaWduZWQg Y2hhciBhX3Nsb3Q7DQorCWVudW0gbWFwbGVfdHlwZSBhX3R5cGU7DQorCXVuc2lnbmVkIGxvbmcg bWluLCBtYXg7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJdW5zaWduZWQgY2hhciBvZmZz ZXQ7DQorCWJvb2wgc2V0X21heCA9IGZhbHNlLCBzZXRfbWluID0gZmFsc2U7DQorDQorCWFfbm9k ZSA9IG1hc19tbihtYXMpOw0KKwlpZiAobWFfaXNfcm9vdChhX25vZGUpKSB7DQorCQltYXMtPm9m ZnNldCA9IDA7DQorCQlyZXR1cm4gMDsNCisJfQ0KKw0KKwlwX25vZGUgPSBtdGVfcGFyZW50KG1h cy0+bm9kZSk7DQorCWlmICh1bmxpa2VseShhX25vZGUgPT0gcF9ub2RlKSkNCisJCXJldHVybiAx Ow0KKwlhX3R5cGUgPSBtYXNfcGFyZW50X2VudW0obWFzLCBtYXMtPm5vZGUpOw0KKwlvZmZzZXQg PSBtdGVfcGFyZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJYV9lbm9kZSA9IG10X21rX25vZGUocF9u b2RlLCBhX3R5cGUpOw0KKw0KKwkvKiBDaGVjayB0byBtYWtlIHN1cmUgYWxsIHBhcmVudCBpbmZv cm1hdGlvbiBpcyBzdGlsbCBhY2N1cmF0ZSAqLw0KKwlpZiAocF9ub2RlICE9IG10ZV9wYXJlbnQo bWFzLT5ub2RlKSkNCisJCXJldHVybiAxOw0KKw0KKwltYXMtPm5vZGUgPSBhX2Vub2RlOw0KKwlt YXMtPm9mZnNldCA9IG9mZnNldDsNCisNCisJaWYgKG10ZV9pc19yb290KGFfZW5vZGUpKSB7DQor CQltYXMtPm1heCA9IFVMT05HX01BWDsNCisJCW1hcy0+bWluID0gMDsNCisJCXJldHVybiAwOw0K Kwl9DQorDQorCW1pbiA9IDA7DQorCW1heCA9IFVMT05HX01BWDsNCisJZG8gew0KKwkJcF9lbm9k ZSA9IGFfZW5vZGU7DQorCQlhX3R5cGUgPSBtYXNfcGFyZW50X2VudW0obWFzLCBwX2Vub2RlKTsN CisJCWFfbm9kZSA9IG10ZV9wYXJlbnQocF9lbm9kZSk7DQorCQlhX3Nsb3QgPSBtdGVfcGFyZW50 X3Nsb3QocF9lbm9kZSk7DQorCQlwaXZvdHMgPSBtYV9waXZvdHMoYV9ub2RlLCBhX3R5cGUpOw0K KwkJYV9lbm9kZSA9IG10X21rX25vZGUoYV9ub2RlLCBhX3R5cGUpOw0KKw0KKwkJaWYgKCFzZXRf bWluICYmIGFfc2xvdCkgew0KKwkJCXNldF9taW4gPSB0cnVlOw0KKwkJCW1pbiA9IHBpdm90c1th X3Nsb3QgLSAxXSArIDE7DQorCQl9DQorDQorCQlpZiAoIXNldF9tYXggJiYgYV9zbG90IDwgbXRf cGl2b3RzW2FfdHlwZV0pIHsNCisJCQlzZXRfbWF4ID0gdHJ1ZTsNCisJCQltYXggPSBwaXZvdHNb YV9zbG90XTsNCisJCX0NCisNCisJCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUoYV9ub2RlKSkp DQorCQkJcmV0dXJuIDE7DQorDQorCQlpZiAodW5saWtlbHkobWFfaXNfcm9vdChhX25vZGUpKSkN CisJCQlicmVhazsNCisNCisJfSB3aGlsZSAoIXNldF9taW4gfHwgIXNldF9tYXgpOw0KKw0KKwlt YXMtPm1heCA9IG1heDsNCisJbWFzLT5taW4gPSBtaW47DQorCXJldHVybiAwOw0KK30NCisNCisv Kg0KKyAqIG1hc19wb3Bfbm9kZSgpIC0gR2V0IGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgbWFwbGUg bm9kZSBmcm9tIHRoZSBtYXBsZSBzdGF0ZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisg Kg0KKyAqIFJldHVybjogQSBwb2ludGVyIHRvIGEgbWFwbGUgbm9kZS4NCisgKi8NCitzdGF0aWMg aW5saW5lIHN0cnVjdCBtYXBsZV9ub2RlICptYXNfcG9wX25vZGUoc3RydWN0IG1hX3N0YXRlICpt YXMpDQorew0KKwlzdHJ1Y3QgbWFwbGVfYWxsb2MgKnJldCwgKm5vZGUgPSBtYXMtPmFsbG9jOw0K Kwl1bnNpZ25lZCBsb25nIHRvdGFsID0gbWFzX2FsbG9jYXRlZChtYXMpOw0KKw0KKwkvKiBub3Ro aW5nIG9yIGEgcmVxdWVzdCBwZW5kaW5nLiAqLw0KKwlpZiAodW5saWtlbHkoIXRvdGFsKSkNCisJ CXJldHVybiBOVUxMOw0KKw0KKwlpZiAodG90YWwgPT0gMSkgew0KKwkJLyogc2luZ2xlIGFsbG9j YXRpb24gaW4gdGhpcyBtYV9zdGF0ZSAqLw0KKwkJbWFzLT5hbGxvYyA9IE5VTEw7DQorCQlyZXQg PSBub2RlOw0KKwkJZ290byBzaW5nbGVfbm9kZTsNCisJfQ0KKw0KKwlpZiAoIW5vZGUtPm5vZGVf Y291bnQpIHsNCisJCS8qIFNpbmdsZSBhbGxvY2F0aW9uIGluIHRoaXMgbm9kZS4gKi8NCisJCW1h cy0+YWxsb2MgPSBub2RlLT5zbG90WzBdOw0KKwkJbm9kZS0+c2xvdFswXSA9IE5VTEw7DQorCQlt YXMtPmFsbG9jLT50b3RhbCA9IG5vZGUtPnRvdGFsIC0gMTsNCisJCXJldCA9IG5vZGU7DQorCQln b3RvIG5ld19oZWFkOw0KKwl9DQorDQorCW5vZGUtPnRvdGFsLS07DQorCXJldCA9IG5vZGUtPnNs b3Rbbm9kZS0+bm9kZV9jb3VudF07DQorCW5vZGUtPnNsb3Rbbm9kZS0+bm9kZV9jb3VudC0tXSA9 IE5VTEw7DQorDQorc2luZ2xlX25vZGU6DQorbmV3X2hlYWQ6DQorCXJldC0+dG90YWwgPSAwOw0K KwlyZXQtPm5vZGVfY291bnQgPSAwOw0KKwlpZiAocmV0LT5yZXF1ZXN0X2NvdW50KSB7DQorCQlt YXNfc2V0X2FsbG9jX3JlcShtYXMsIHJldC0+cmVxdWVzdF9jb3VudCArIDEpOw0KKwkJcmV0LT5y ZXF1ZXN0X2NvdW50ID0gMDsNCisJfQ0KKwlyZXR1cm4gKHN0cnVjdCBtYXBsZV9ub2RlICopcmV0 Ow0KK30NCisNCisvKg0KKyAqIG1hc19wdXNoX25vZGUoKSAtIFB1c2ggYSBub2RlIGJhY2sgb24g dGhlIG1hcGxlIHN0YXRlIGFsbG9jYXRpb24uDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQor ICogQHVzZWQ6IFRoZSB1c2VkIGVuY29kZWQgbWFwbGUgbm9kZQ0KKyAqDQorICogU3RvcmVzIHRo ZSBtYXBsZSBub2RlIGJhY2sgaW50byBAbWFzLT5hbGxvYyBmb3IgcmV1c2UuICBVcGRhdGVzIGFs bG9jYXRlZCBhbmQNCisgKiByZXF1ZXN0ZWQgbm9kZSBjb3VudCBhcyBuZWNlc3NhcnkuDQorICov DQorc3RhdGljIGlubGluZSB2b2lkIG1hc19wdXNoX25vZGUoc3RydWN0IG1hX3N0YXRlICptYXMs IHN0cnVjdCBtYXBsZV9lbm9kZSAqdXNlZCkNCit7DQorCXN0cnVjdCBtYXBsZV9hbGxvYyAqcmV1 c2UgPSAoc3RydWN0IG1hcGxlX2FsbG9jICopbXRlX3RvX25vZGUodXNlZCk7DQorCXN0cnVjdCBt YXBsZV9hbGxvYyAqaGVhZCA9IG1hcy0+YWxsb2M7DQorCXVuc2lnbmVkIGxvbmcgY291bnQ7DQor CXVuc2lnbmVkIGludCByZXF1ZXN0ZWQgPSBtYXNfYWxsb2NfcmVxKG1hcyk7DQorDQorCW1lbXNl dChyZXVzZSwgMCwgc2l6ZW9mKCpyZXVzZSkpOw0KKwljb3VudCA9IG1hc19hbGxvY2F0ZWQobWFz KTsNCisNCisJaWYgKGNvdW50ICYmIChoZWFkLT5ub2RlX2NvdW50IDwgTUFQTEVfQUxMT0NfU0xP VFMgLSAxKSkgew0KKwkJaWYgKGhlYWQtPnNsb3RbMF0pDQorCQkJaGVhZC0+bm9kZV9jb3VudCsr Ow0KKwkJaGVhZC0+c2xvdFtoZWFkLT5ub2RlX2NvdW50XSA9IHJldXNlOw0KKwkJaGVhZC0+dG90 YWwrKzsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwlyZXVzZS0+dG90YWwgPSAxOw0KKwlpZiAo KGhlYWQpICYmICEoKHVuc2lnbmVkIGxvbmcpaGVhZCAmIDB4MSkpIHsNCisJCWhlYWQtPnJlcXVl c3RfY291bnQgPSAwOw0KKwkJcmV1c2UtPnNsb3RbMF0gPSBoZWFkOw0KKwkJcmV1c2UtPnRvdGFs ICs9IGhlYWQtPnRvdGFsOw0KKwl9DQorDQorCW1hcy0+YWxsb2MgPSByZXVzZTsNCitkb25lOg0K KwlpZiAocmVxdWVzdGVkID4gMSkNCisJCW1hc19zZXRfYWxsb2NfcmVxKG1hcywgcmVxdWVzdGVk IC0gMSk7DQorfQ0KKw0KKy8qDQorICogbWFzX2FsbG9jX25vZGVzKCkgLSBBbGxvY2F0ZSBub2Rl cyBpbnRvIGEgbWFwbGUgc3RhdGUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZ2Zw OiBUaGUgR0ZQIEZsYWdzDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19hbGxvY19ub2Rl cyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgZ2ZwX3QgZ2ZwKQ0KK3sNCisJc3RydWN0IG1hcGxlX2Fs bG9jICpub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfYWxsb2MgKipub2RlcCA9ICZtYXMtPmFsbG9jOw0K Kwl1bnNpZ25lZCBsb25nIGFsbG9jYXRlZCA9IG1hc19hbGxvY2F0ZWQobWFzKTsNCisJdW5zaWdu ZWQgbG9uZyBzdWNjZXNzID0gYWxsb2NhdGVkOw0KKwl1bnNpZ25lZCBpbnQgcmVxdWVzdGVkID0g bWFzX2FsbG9jX3JlcShtYXMpOw0KKwl1bnNpZ25lZCBpbnQgY291bnQ7DQorDQorCWlmICghcmVx dWVzdGVkKQ0KKwkJcmV0dXJuOw0KKw0KKwltYXNfc2V0X2FsbG9jX3JlcShtYXMsIDApOw0KKwlp ZiAoIWFsbG9jYXRlZCB8fCBtYXMtPmFsbG9jLT5ub2RlX2NvdW50ID09IE1BUExFX0FMTE9DX1NM T1RTIC0gMSkgew0KKwkJbm9kZSA9IChzdHJ1Y3QgbWFwbGVfYWxsb2MgKiltdF9hbGxvY19vbmUo Z2ZwKTsNCisJCWlmICghbm9kZSkNCisJCQlnb3RvIG5vbWVtOw0KKw0KKwkJaWYgKGFsbG9jYXRl ZCkNCisJCQlub2RlLT5zbG90WzBdID0gbWFzLT5hbGxvYzsNCisNCisJCXN1Y2Nlc3MrKzsNCisJ CW1hcy0+YWxsb2MgPSBub2RlOw0KKwkJcmVxdWVzdGVkLS07DQorCX0NCisNCisJbm9kZSA9IG1h cy0+YWxsb2M7DQorCXdoaWxlIChyZXF1ZXN0ZWQpIHsNCisJCXZvaWQgKipzbG90cyA9ICh2b2lk ICoqKSZub2RlLT5zbG90Ow0KKwkJdW5zaWduZWQgaW50IG1heF9yZXEgPSBNQVBMRV9OT0RFX1NM T1RTIC0gMTsNCisNCisJCWlmIChub2RlLT5zbG90WzBdKSB7DQorCQkJdW5zaWduZWQgaW50IG9m ZnNldCA9IG5vZGUtPm5vZGVfY291bnQgKyAxOw0KKw0KKwkJCXNsb3RzID0gKHZvaWQgKiopJm5v ZGUtPnNsb3Rbb2Zmc2V0XTsNCisJCQltYXhfcmVxIC09IG9mZnNldDsNCisJCX0NCisNCisJCWNv dW50ID0gbXRfYWxsb2NfYnVsayhnZnAsIG1pbihyZXF1ZXN0ZWQsIG1heF9yZXEpLA0KKwkJCQkg ICAgICBzbG90cyk7DQorCQlpZiAoIWNvdW50KQ0KKwkJCWdvdG8gbm9tZW07DQorDQorCQlub2Rl LT5ub2RlX2NvdW50ICs9IGNvdW50Ow0KKwkJLyogemVybyBpbmRleGVkLiAqLw0KKwkJaWYgKHNs b3RzID09ICh2b2lkICoqKSZub2RlLT5zbG90KQ0KKwkJCW5vZGUtPm5vZGVfY291bnQtLTsNCisN CisJCXN1Y2Nlc3MgKz0gY291bnQ7DQorCQlub2RlcCA9ICZub2RlLT5zbG90WzBdOw0KKwkJbm9k ZSA9ICpub2RlcDsNCisJCXJlcXVlc3RlZCAtPSBjb3VudDsNCisJfQ0KKwltYXMtPmFsbG9jLT50 b3RhbCA9IHN1Y2Nlc3M7DQorCXJldHVybjsNCitub21lbToNCisJbWFzX3NldF9hbGxvY19yZXEo bWFzLCByZXF1ZXN0ZWQpOw0KKwlpZiAobWFzLT5hbGxvYyAmJiAhKCgodW5zaWduZWQgbG9uZylt YXMtPmFsbG9jICYgMHgxKSkpDQorCQltYXMtPmFsbG9jLT50b3RhbCA9IHN1Y2Nlc3M7DQorCW1h c19zZXRfZXJyKG1hcywgLUVOT01FTSk7DQorCXJldHVybjsNCisNCit9DQorDQorLyoNCisgKiBt YXNfZnJlZSgpIC0gRnJlZSBhbiBlbmNvZGVkIG1hcGxlIG5vZGUNCisgKiBAbWFzOiBUaGUgbWFw bGUgc3RhdGUNCisgKiBAdXNlZDogVGhlIGVuY29kZWQgbWFwbGUgbm9kZSB0byBmcmVlLg0KKyAq DQorICogVXNlcyByY3UgZnJlZSBpZiBuZWNlc3NhcnksIHB1c2hlcyBAdXNlZCBiYWNrIG9uIHRo ZSBtYXBsZSBzdGF0ZSBhbGxvY2F0aW9ucw0KKyAqIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMg aW5saW5lIHZvaWQgbWFzX2ZyZWUoc3RydWN0IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYXBsZV9l bm9kZSAqdXNlZCkNCit7DQorCWlmIChtdF9pbl9yY3UobWFzLT50cmVlKSkNCisJCW1hX2ZyZWVf cmN1KG10ZV90b19ub2RlKHVzZWQpKTsNCisJZWxzZQ0KKwkJbWFzX3B1c2hfbm9kZShtYXMsIHVz ZWQpOw0KK30NCisNCisvKg0KKyAqIG1hc19ub2RlX2NvdW50KCkgLSBDaGVjayBpZiBlbm91Z2gg bm9kZXMgYXJlIGFsbG9jYXRlZCBhbmQgcmVxdWVzdCBtb3JlIGlmDQorICogdGhlcmUgaXMgbm90 IGVub3VnaCBub2Rlcy4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAY291bnQ6IFRo ZSBudW1iZXIgb2Ygbm9kZXMgbmVlZGVkDQorICovDQorc3RhdGljIHZvaWQgbWFzX25vZGVfY291 bnQoc3RydWN0IG1hX3N0YXRlICptYXMsIGludCBjb3VudCkNCit7DQorCXVuc2lnbmVkIGxvbmcg YWxsb2NhdGVkID0gbWFzX2FsbG9jYXRlZChtYXMpOw0KKw0KKwlpZiAoYWxsb2NhdGVkIDwgY291 bnQpIHsNCisJCW1hc19zZXRfYWxsb2NfcmVxKG1hcywgY291bnQgLSBhbGxvY2F0ZWQpOw0KKwkJ bWFzX2FsbG9jX25vZGVzKG1hcywgR0ZQX05PV0FJVCB8IF9fR0ZQX05PV0FSTik7DQorCX0NCit9 DQorDQorLyoNCisgKiBtYXNfc3RhcnQoKSAtIFNldHMgdXAgbWFwbGUgc3RhdGUgZm9yIG9wZXJh dGlvbnMuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlLg0KKyAqDQorICogSWYgbWFzLT5ub2Rl ID09IE1BU19TVEFSVCwgdGhlbiBzZXQgdGhlIG1pbiwgbWF4LCBkZXB0aCwgYW5kIG9mZnNldCB0 bw0KKyAqIGRlZmF1bHRzLg0KKyAqDQorICogUmV0dXJuOg0KKyAqIC0gSWYgbWFzLT5ub2RlIGlz IGFuIGVycm9yIG9yIE1BU19TVEFSVCwgcmV0dXJuIE5VTEwuDQorICogLSBJZiBpdCdzIGFuIGVt cHR5IHRyZWU6ICAgICBOVUxMICYgbWFzLT5ub2RlID09IE1BU19OT05FDQorICogLSBJZiBpdCdz IGEgc2luZ2xlIGVudHJ5OiAgICBUaGUgZW50cnkgJiBtYXMtPm5vZGUgPT0gTUFTX1JPT1QNCisg KiAtIElmIGl0J3MgYSB0cmVlOiAgICAgICAgICAgIE5VTEwgJiBtYXMtPm5vZGUgPT0gc2FmZSBy b290IG5vZGUuDQorICovDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1hc19z dGFydChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXZvaWQgKmVudHJ5ID0gTlVMTDsNCisN CisJaWYgKGxpa2VseShtYXNfaXNfc3RhcnQobWFzKSkpIHsNCisJCXN0cnVjdCBtYXBsZV9lbm9k ZSAqcm9vdDsNCisNCisJCW1hcy0+bm9kZSA9IE1BU19OT05FOw0KKwkJbWFzLT5taW4gPSAwOw0K KwkJbWFzLT5tYXggPSBVTE9OR19NQVg7DQorCQltYXMtPmRlcHRoID0gMDsNCisJCW1hcy0+b2Zm c2V0ID0gMDsNCisNCisJCXJvb3QgPSBtYXNfcm9vdChtYXMpOw0KKwkJLyogZW1wdHkgdHJlZSAq Lw0KKwkJaWYgKHVubGlrZWx5KCFyb290KSkNCisJCQlnb3RvIGRvbmU7DQorDQorCQlpZiAobGlr ZWx5KHhhX2lzX25vZGUocm9vdCkpKSB7DQorCQkJbWFzLT5ub2RlID0gbXRlX3NhZmVfcm9vdChy b290KTsNCisJCX0gZWxzZSB7DQorCQkJLyogU2luZ2xlIGVudHJ5IHRyZWUuICovDQorCQkJaWYg KG1hcy0+aW5kZXggPiAwKQ0KKwkJCQlnb3RvIGRvbmU7DQorDQorCQkJZW50cnkgPSByb290Ow0K KwkJCW1hcy0+bm9kZSA9IE1BU19ST09UOw0KKwkJCW1hcy0+b2Zmc2V0ID0gTUFQTEVfTk9ERV9T TE9UUzsNCisJCX0NCisJfQ0KKw0KK2RvbmU6DQorCXJldHVybiBlbnRyeTsNCit9DQorDQorLyoN CisgKiBtYV9kYXRhX2VuZCgpIC0gRmluZCB0aGUgZW5kIG9mIHRoZSBkYXRhIGluIGEgbm9kZS4N CisgKiBAbm9kZTogVGhlIG1hcGxlIG5vZGUNCisgKiBAdHlwZTogVGhlIG1hcGxlIG5vZGUgdHlw ZQ0KKyAqIEBwaXZvdHM6IFRoZSBhcnJheSBvZiBwaXZvdHMgaW4gdGhlIG5vZGUNCisgKiBAbWF4 OiBUaGUgbWF4aW11bSB2YWx1ZSBpbiB0aGUgbm9kZQ0KKyAqDQorICogVXNlcyBtZXRhZGF0YSB0 byBmaW5kIHRoZSBlbmQgb2YgdGhlIGRhdGEgd2hlbiBwb3NzaWJsZS4NCisgKiBSZXR1cm46IFRo ZSB6ZXJvIGluZGV4ZWQgbGFzdCBzbG90IHdpdGggZGF0YSAobWF5IGJlIG51bGwpLg0KKyAqLw0K K3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBtYV9kYXRhX2VuZChzdHJ1Y3QgbWFwbGVfbm9k ZSAqbm9kZSwNCisJCQkJCWVudW0gbWFwbGVfdHlwZSB0eXBlLA0KKwkJCQkJdW5zaWduZWQgbG9u ZyAqcGl2b3RzLA0KKwkJCQkJdW5zaWduZWQgbG9uZyBtYXgpDQorew0KKwl1bnNpZ25lZCBjaGFy IG9mZnNldDsNCisNCisJaWYgKHR5cGUgPT0gbWFwbGVfYXJhbmdlXzY0KQ0KKwkJcmV0dXJuIG1h X21ldGFfZW5kKG5vZGUsIHR5cGUpOw0KKw0KKwlvZmZzZXQgPSBtdF9waXZvdHNbdHlwZV0gLSAx Ow0KKwlpZiAobGlrZWx5KCFwaXZvdHNbb2Zmc2V0XSkpDQorCQlyZXR1cm4gbWFfbWV0YV9lbmQo bm9kZSwgdHlwZSk7DQorDQorCWlmIChsaWtlbHkocGl2b3RzW29mZnNldF0gPT0gbWF4KSkNCisJ CXJldHVybiBvZmZzZXQ7DQorDQorCXJldHVybiBtdF9waXZvdHNbdHlwZV07DQorfQ0KKw0KKy8q DQorICogbWFzX2RhdGFfZW5kKCkgLSBGaW5kIHRoZSBlbmQgb2YgdGhlIGRhdGEgKHNsb3QpLg0K KyAqIEBtYXM6IHRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEB0eXBlOiB0aGUgdHlwZSBvZiBtYXBsZSBu b2RlDQorICoNCisgKiBUaGlzIG1ldGhvZCBpcyBvcHRpbWl6ZWQgdG8gY2hlY2sgdGhlIG1ldGFk YXRhIG9mIGEgbm9kZSBpZiB0aGUgbm9kZSB0eXBlDQorICogc3VwcG9ydHMgZGF0YSBlbmQgbWV0 YWRhdGEuDQorICoNCisgKiBSZXR1cm46IFRoZSB6ZXJvIGluZGV4ZWQgbGFzdCBzbG90IHdpdGgg ZGF0YSAobWF5IGJlIG51bGwpLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBt YXNfZGF0YV9lbmQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwllbnVtIG1hcGxlX3R5cGUg dHlwZTsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0 Ow0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorDQorCXR5cGUgPSBtdGVfbm9kZV90eXBlKG1h cy0+bm9kZSk7DQorCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJaWYgKHR5cGUgPT0gbWFwbGVfYXJh bmdlXzY0KQ0KKwkJcmV0dXJuIG1hX21ldGFfZW5kKG5vZGUsIHR5cGUpOw0KKw0KKwlwaXZvdHMg PSBtYV9waXZvdHMobm9kZSwgdHlwZSk7DQorCW9mZnNldCA9IG10X3Bpdm90c1t0eXBlXSAtIDE7 DQorCWlmIChsaWtlbHkoIXBpdm90c1tvZmZzZXRdKSkNCisJCXJldHVybiBtYV9tZXRhX2VuZChu b2RlLCB0eXBlKTsNCisNCisJaWYgKGxpa2VseShwaXZvdHNbb2Zmc2V0XSA9PSBtYXMtPm1heCkp DQorCQlyZXR1cm4gb2Zmc2V0Ow0KKw0KKwlyZXR1cm4gbXRfcGl2b3RzW3R5cGVdOw0KK30NCisN CisvKg0KKyAqIG1hc19sZWFmX21heF9nYXAoKSAtIFJldHVybnMgdGhlIGxhcmdlc3QgZ2FwIGlu IGEgbGVhZiBub2RlDQorICogQG1hcyAtIHRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogUmV0dXJu OiBUaGUgbWF4aW11bSBnYXAgaW4gdGhlIGxlYWYuDQorICovDQorc3RhdGljIHVuc2lnbmVkIGxv bmcgbWFzX2xlYWZfbWF4X2dhcChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCWVudW0gbWFw bGVfdHlwZSBtdDsNCisJdW5zaWduZWQgbG9uZyBwc3RhcnQsIGdhcCwgbWF4X2dhcDsNCisJc3Ry dWN0IG1hcGxlX25vZGUgKm1uOw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXZvaWQgX19y Y3UgKipzbG90czsNCisJdW5zaWduZWQgY2hhciBpOw0KKwl1bnNpZ25lZCBjaGFyIG1heF9waXY7 DQorDQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwltbiA9IG1hc19tbihtYXMp Ow0KKwlzbG90cyA9IG1hX3Nsb3RzKG1uLCBtdCk7DQorCW1heF9nYXAgPSAwOw0KKwlpZiAodW5s aWtlbHkobWFfaXNfZGVuc2UobXQpKSkgew0KKwkJZ2FwID0gMDsNCisJCWZvciAoaSA9IDA7IGkg PCBtdF9zbG90c1ttdF07IGkrKykgew0KKwkJCWlmIChzbG90c1tpXSkgew0KKwkJCQlpZiAoZ2Fw ID4gbWF4X2dhcCkNCisJCQkJCW1heF9nYXAgPSBnYXA7DQorCQkJCWdhcCA9IDA7DQorCQkJfSBl bHNlIHsNCisJCQkJZ2FwKys7DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKGdhcCA+IG1heF9nYXApDQor CQkJbWF4X2dhcCA9IGdhcDsNCisJCXJldHVybiBtYXhfZ2FwOw0KKwl9DQorDQorCS8qDQorCSAq IFJlbW92aW5nIHRoZSBwaXZvdCBvdmVyZmxvdyBvcHRpbWl6ZXMgdGhlIGxvb3AgYmVsb3cuDQor CSAqIENoZWNrIHRoZSBmaXJzdCBpbXBsaWVkIHBpdm90Lg0KKwkgKi8NCisJcGl2b3RzID0gbWFf cGl2b3RzKG1uLCBtdCk7DQorCWkgPSAyOw0KKwlpZiAobGlrZWx5KCFzbG90c1swXSkpIHsNCisJ CW1heF9nYXAgPSBwaXZvdHNbMF0gLSBtYXMtPm1pbiArIDE7DQorCX0gZWxzZSBpZiAoIXNsb3Rz WzFdKSB7DQorCQkvKg0KKwkJICogQ2hlY2tpbmcgdGhlIGZpcnN0IHNsb3QgcmVtb3ZlIHRoZSAh cHN0YXJ0ICYmIG1hcy0+bWluIGNoZWNrDQorCQkgKiBiZWxvdy4NCisJCSAqLw0KKwkJaSA9IDM7 DQorCQltYXhfZ2FwID0gcGl2b3RzWzFdIC0gcGl2b3RzWzBdOw0KKwl9DQorDQorCS8qDQorCSAq IENoZWNrIGVuZCBpbXBsaWVkIHBpdm90IHdoaWNoIGNhbiBvbmx5IGJlIGEgZ2FwIG9uIHRoZSBy aWdodCBtb3N0DQorCSAqIG5vZGUuDQorCSAqLw0KKwltYXhfcGl2ID0gbXRfcGl2b3RzW210XSAt IDE7DQorCWlmICh1bmxpa2VseShtYXMtPm1heCA9PSBVTE9OR19NQVgpICYmICFzbG90c1ttYXhf cGl2ICsgMV0gJiYNCisJICAgIHBpdm90c1ttYXhfcGl2XSAmJiBwaXZvdHNbbWF4X3Bpdl0gIT0g bWFzLT5tYXgpIHsNCisJCWdhcCA9IG1hcy0+bWF4IC0gcGl2b3RzW21heF9waXZdOw0KKwkJaWYg KGdhcCA+IG1heF9nYXApDQorCQkJbWF4X2dhcCA9IGdhcDsNCisJfQ0KKw0KKwlmb3IgKDsgaSA8 PSBtYXhfcGl2OyBpKyspIHsNCisJCS8qIGRhdGEgPT0gbm8gZ2FwLiAqLw0KKwkJaWYgKGxpa2Vs eShzbG90c1tpXSkpDQorCQkJY29udGludWU7DQorDQorCQlwc3RhcnQgPSBwaXZvdHNbaSAtIDFd Ow0KKwkJLyogVGhlIGVuZCBjYW5ub3QgYmUgYSBnYXAsIHNvIHRoaXMgaXMgYmV5b25kIHRoZSBk YXRhLiAqLw0KKwkJaWYgKCFwc3RhcnQgfHwgcHN0YXJ0ID09IG1hcy0+bWF4KQ0KKwkJCWJyZWFr Ow0KKw0KKwkJZ2FwID0gcGl2b3RzW2ldIC0gcHN0YXJ0Ow0KKwkJaWYgKGdhcCA+IG1heF9nYXAp DQorCQkJbWF4X2dhcCA9IGdhcDsNCisNCisJCS8qIFRoZXJlIGNhbm5vdCBiZSB0d28gZ2FwcyBp biBhIHJvdy4gKi8NCisJCWkrKzsNCisJfQ0KKwlyZXR1cm4gbWF4X2dhcDsNCit9DQorDQorLyoN CisgKiBtYV9tYXhfZ2FwKCkgLSBHZXQgdGhlIG1heGltdW0gZ2FwIGluIGEgbWFwbGUgbm9kZSAo bm9uLWxlYWYpDQorICogQG5vZGU6IFRoZSBtYXBsZSBub2RlDQorICogQGdhcHM6IFRoZSBwb2lu dGVyIHRvIHRoZSBnYXBzDQorICogQG10OiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICogQCpvZmY6 IFBvaW50ZXIgdG8gc3RvcmUgdGhlIG9mZnNldCBsb2NhdGlvbiBvZiB0aGUgZ2FwLg0KKyAqDQor ICogVXNlcyB0aGUgbWV0YWRhdGEgZGF0YSBlbmQgdG8gc2NhbiBiYWNrd2FyZHMgYWNyb3NzIHNl dCBnYXBzLg0KKyAqDQorICogUmV0dXJuOiBUaGUgbWF4aW11bSBnYXAgdmFsdWUNCisgKi8NCitz dGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcNCittYV9tYXhfZ2FwKHN0cnVjdCBtYXBsZV9ub2Rl ICpub2RlLCB1bnNpZ25lZCBsb25nICpnYXBzLCBlbnVtIG1hcGxlX3R5cGUgbXQsDQorCSAgICB1 bnNpZ25lZCBjaGFyICpvZmYpDQorew0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldCwgaTsNCisJdW5z aWduZWQgbG9uZyBtYXhfZ2FwID0gMDsNCisNCisJaSA9IG9mZnNldCA9IG1hX21ldGFfZW5kKG5v ZGUsIG10KTsNCisJZG8gew0KKwkJaWYgKGdhcHNbaV0gPiBtYXhfZ2FwKSB7DQorCQkJbWF4X2dh cCA9IGdhcHNbaV07DQorCQkJb2Zmc2V0ID0gaTsNCisJCX0NCisJfSB3aGlsZSAoaS0tKTsNCisN CisJKm9mZiA9IG9mZnNldDsNCisJcmV0dXJuIG1heF9nYXA7DQorfQ0KKw0KKy8qDQorICogbWFz X21heF9nYXAoKSAtIGZpbmQgdGhlIGxhcmdlc3QgZ2FwIGluIGEgbm9uLWxlYWYgbm9kZSBhbmQg c2V0IHRoZSBzbG90Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIElmIHRo ZSBtZXRhZGF0YSBnYXAgaXMgc2V0IHRvIE1BUExFX0FSQU5HRTY0X01FVEFfTUFYLCB0aGVyZSBp cyBubyBnYXAuDQorICoNCisgKiBSZXR1cm46IFRoZSBnYXAgdmFsdWUuDQorICovDQorc3RhdGlj IGlubGluZSB1bnNpZ25lZCBsb25nIG1hc19tYXhfZ2FwKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0K K3sNCisJdW5zaWduZWQgbG9uZyAqZ2FwczsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCWVu dW0gbWFwbGVfdHlwZSBtdDsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorDQorCW10ID0g bXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlpZiAobWFfaXNfbGVhZihtdCkpDQorCQlyZXR1 cm4gbWFzX2xlYWZfbWF4X2dhcChtYXMpOw0KKw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCW9m ZnNldCA9IG1hX21ldGFfZ2FwKG5vZGUsIG10KTsNCisJaWYgKG9mZnNldCA9PSBNQVBMRV9BUkFO R0U2NF9NRVRBX01BWCkNCisJCXJldHVybiAwOw0KKw0KKwlnYXBzID0gbWFfZ2Fwcyhub2RlLCBt dCk7DQorCXJldHVybiBnYXBzW29mZnNldF07DQorfQ0KKw0KKy8qDQorICogbWFzX3BhcmVudF9n YXAoKSAtIFNldCB0aGUgcGFyZW50IGdhcCBhbmQgYW55IGdhcHMgYWJvdmUsIGFzIG5lZWRlZA0K KyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBvZmZzZXQ6IFRoZSBnYXAgb2Zmc2V0IGlu IHRoZSBwYXJlbnQgdG8gc2V0DQorICogQG5ldzogVGhlIG5ldyBnYXAgdmFsdWUuDQorICoNCisg KiBTZXQgdGhlIHBhcmVudCBnYXAgdGhlbiBjb250aW51ZSB0byBzZXQgdGhlIGdhcCB1cHdhcmRz LCB1c2luZyB0aGUgbWV0YWRhdGENCisgKiBvZiB0aGUgcGFyZW50IHRvIHNlZSBpZiBpdCBpcyBu ZWNlc3NhcnkgdG8gY2hlY2sgdGhlIG5vZGUgYWJvdmUuDQorICovDQorc3RhdGljIGlubGluZSB2 b2lkIG1hc19wYXJlbnRfZ2FwKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBjaGFyIG9m ZnNldCwNCisJCXVuc2lnbmVkIGxvbmcgbmV3KQ0KK3sNCisJdW5zaWduZWQgbG9uZyBtZXRhX2dh cCA9IDA7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpwbm9kZTsNCisJc3RydWN0IG1hcGxlX2Vub2Rl ICpwZW5vZGU7DQorCXVuc2lnbmVkIGxvbmcgKnBnYXBzOw0KKwl1bnNpZ25lZCBjaGFyIG1ldGFf b2Zmc2V0Ow0KKwllbnVtIG1hcGxlX3R5cGUgcG10Ow0KKw0KKwlwbm9kZSA9IG10ZV9wYXJlbnQo bWFzLT5ub2RlKTsNCisJcG10ID0gbWFzX3BhcmVudF9lbnVtKG1hcywgbWFzLT5ub2RlKTsNCisJ cGVub2RlID0gbXRfbWtfbm9kZShwbm9kZSwgcG10KTsNCisJcGdhcHMgPSBtYV9nYXBzKHBub2Rl LCBwbXQpOw0KKw0KK2FzY2VuZDoNCisJbWV0YV9vZmZzZXQgPSBtYV9tZXRhX2dhcChwbm9kZSwg cG10KTsNCisJaWYgKG1ldGFfb2Zmc2V0ID09IE1BUExFX0FSQU5HRTY0X01FVEFfTUFYKQ0KKwkJ bWV0YV9nYXAgPSAwOw0KKwllbHNlDQorCQltZXRhX2dhcCA9IHBnYXBzW21ldGFfb2Zmc2V0XTsN CisNCisJcGdhcHNbb2Zmc2V0XSA9IG5ldzsNCisNCisJaWYgKG1ldGFfZ2FwID09IG5ldykNCisJ CXJldHVybjsNCisNCisJaWYgKG9mZnNldCAhPSBtZXRhX29mZnNldCkgew0KKwkJaWYgKG1ldGFf Z2FwID4gbmV3KQ0KKwkJCXJldHVybjsNCisNCisJCW1hX3NldF9tZXRhX2dhcChwbm9kZSwgcG10 LCBvZmZzZXQpOw0KKwl9IGVsc2UgaWYgKG5ldyA8IG1ldGFfZ2FwKSB7DQorCQltZXRhX29mZnNl dCA9IDE1Ow0KKwkJbmV3ID0gbWFfbWF4X2dhcChwbm9kZSwgcGdhcHMsIHBtdCwgJm1ldGFfb2Zm c2V0KTsNCisJCW1hX3NldF9tZXRhX2dhcChwbm9kZSwgcG10LCBtZXRhX29mZnNldCk7DQorCX0N CisNCisJaWYgKG1hX2lzX3Jvb3QocG5vZGUpKQ0KKwkJcmV0dXJuOw0KKw0KKwkvKiBHbyB0byB0 aGUgcGFyZW50IG5vZGUuICovDQorCXBub2RlID0gbXRlX3BhcmVudChwZW5vZGUpOw0KKwlwbXQg PSBtYXNfcGFyZW50X2VudW0obWFzLCBwZW5vZGUpOw0KKwlwZ2FwcyA9IG1hX2dhcHMocG5vZGUs IHBtdCk7DQorCW9mZnNldCA9IG10ZV9wYXJlbnRfc2xvdChwZW5vZGUpOw0KKwlwZW5vZGUgPSBt dF9ta19ub2RlKHBub2RlLCBwbXQpOw0KKwlnb3RvIGFzY2VuZDsNCit9DQorDQorLyoNCisgKiBt YXNfdXBkYXRlX2dhcCgpIC0gVXBkYXRlIGEgbm9kZXMgZ2FwcyBhbmQgcHJvcGFnYXRlIHVwIGlm IG5lY2Vzc2FyeS4NCisgKiBAbWFzIC0gdGhlIG1hcGxlIHN0YXRlLg0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgdm9pZCBtYXNfdXBkYXRlX2dhcChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXVu c2lnbmVkIGNoYXIgcHNsb3Q7DQorCXVuc2lnbmVkIGxvbmcgcF9nYXA7DQorCXVuc2lnbmVkIGxv bmcgbWF4X2dhcDsNCisNCisJaWYgKCFtdF9pc19hbGxvYyhtYXMtPnRyZWUpKQ0KKwkJcmV0dXJu Ow0KKw0KKwlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJbWF4 X2dhcCA9IG1hc19tYXhfZ2FwKG1hcyk7DQorDQorCXBzbG90ID0gbXRlX3BhcmVudF9zbG90KG1h cy0+bm9kZSk7DQorCXBfZ2FwID0gbWFfZ2FwcyhtdGVfcGFyZW50KG1hcy0+bm9kZSksDQorCQkJ bWFzX3BhcmVudF9lbnVtKG1hcywgbWFzLT5ub2RlKSlbcHNsb3RdOw0KKw0KKwlpZiAocF9nYXAg IT0gbWF4X2dhcCkNCisJCW1hc19wYXJlbnRfZ2FwKG1hcywgcHNsb3QsIG1heF9nYXApOw0KK30N CisNCisvKg0KKyAqIG1hc19hZG9wdF9jaGlsZHJlbigpIC0gU2V0IHRoZSBwYXJlbnQgcG9pbnRl ciBvZiBhbGwgbm9kZXMgaW4gQHBhcmVudCB0bw0KKyAqIEBwYXJlbnQgd2l0aCB0aGUgc2xvdCBl bmNvZGVkLg0KKyAqIEBtYXMgLSB0aGUgbWFwbGUgc3RhdGUgKGZvciB0aGUgdHJlZSkNCisgKiBA cGFyZW50IC0gdGhlIG1hcGxlIGVuY29kZWQgbm9kZSBjb250YWluaW5nIHRoZSBjaGlsZHJlbi4N CisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2Fkb3B0X2NoaWxkcmVuKHN0cnVjdCBtYV9z dGF0ZSAqbWFzLA0KKwkJc3RydWN0IG1hcGxlX2Vub2RlICpwYXJlbnQpDQorew0KKwllbnVtIG1h cGxlX3R5cGUgdHlwZSA9IG10ZV9ub2RlX3R5cGUocGFyZW50KTsNCisJc3RydWN0IG1hcGxlX25v ZGUgKm5vZGUgPSBtYXNfbW4obWFzKTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzID0gbWFfc2xvdHMo bm9kZSwgdHlwZSk7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0 eXBlKTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpjaGlsZDsNCisJdW5zaWduZWQgY2hhciBvZmZz ZXQ7DQorDQorCW9mZnNldCA9IG1hX2RhdGFfZW5kKG5vZGUsIHR5cGUsIHBpdm90cywgbWFzLT5t YXgpOw0KKwlkbyB7DQorCQljaGlsZCA9IG1hc19zbG90X2xvY2tlZChtYXMsIHNsb3RzLCBvZmZz ZXQpOw0KKwkJbXRlX3NldF9wYXJlbnQoY2hpbGQsIHBhcmVudCwgb2Zmc2V0KTsNCisJfSB3aGls ZShvZmZzZXQtLSk7DQorfQ0KKw0KKy8qDQorICogbWFzX3JlcGxhY2UoKSAtIFJlcGxhY2UgYSBt YXBsZSBub2RlIGluIHRoZSB0cmVlIHdpdGggbWFzLT5ub2RlLiAgVXNlcyB0aGUNCisgKiBwYXJl bnQgZW5jb2RpbmcgdG8gbG9jYXRlIHRoZSBtYXBsZSBub2RlIGluIHRoZSB0cmVlLg0KKyAqIEBt YXMgLSB0aGUgbWFfc3RhdGUgdG8gdXNlIGZvciBvcGVyYXRpb25zLg0KKyAqIEBhZHZhbmNlZCAt IGJvb2xlYW4gdG8gYWRvcHQgdGhlIGNoaWxkIG5vZGVzIGFuZCBmcmVlIHRoZSBvbGQgbm9kZSAo ZmFsc2UpIG9yDQorICogbGVhdmUgdGhlIG5vZGUgKHRydWUpIGFuZCBoYW5kbGUgdGhlIGFkb3B0 aW9uIGFuZCBmcmVlIGVsc2V3aGVyZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3Jl cGxhY2Uoc3RydWN0IG1hX3N0YXRlICptYXMsIGJvb2wgYWR2YW5jZWQpDQorCV9fbXVzdF9ob2xk KG1hcy0+dHJlZS0+bG9jaykNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICptbiA9IG1hc19tbiht YXMpOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm9sZF9lbm9kZTsNCisJdW5zaWduZWQgY2hhciBv ZmZzZXQgPSAwOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHMgPSBOVUxMOw0KKw0KKwlpZiAobWFfaXNf cm9vdChtbikpIHsNCisJCW9sZF9lbm9kZSA9IG1hc19yb290X2xvY2tlZChtYXMpOw0KKwl9IGVs c2Ugew0KKwkJb2Zmc2V0ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7DQorCQlzbG90cyA9 IG1hX3Nsb3RzKG10ZV9wYXJlbnQobWFzLT5ub2RlKSwNCisJCQkJIG1hc19wYXJlbnRfZW51bSht YXMsIG1hcy0+bm9kZSkpOw0KKwkJb2xkX2Vub2RlID0gbWFzX3Nsb3RfbG9ja2VkKG1hcywgc2xv dHMsIG9mZnNldCk7DQorCX0NCisNCisJaWYgKCFhZHZhbmNlZCAmJiAhbXRlX2lzX2xlYWYobWFz LT5ub2RlKSkNCisJCW1hc19hZG9wdF9jaGlsZHJlbihtYXMsIG1hcy0+bm9kZSk7DQorDQorCWlm IChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKSB7DQorCQltbi0+cGFyZW50ID0gbWFfcGFyZW50X3B0 cigNCisJCQkgICAgICAoKHVuc2lnbmVkIGxvbmcpbWFzLT50cmVlIHwgTUFfUk9PVF9QQVJFTlQp KTsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcihtYXMtPnRyZWUtPm1hX3Jvb3QsIG10ZV9ta19yb290 KG1hcy0+bm9kZSkpOw0KKwkJbWFzX3NldF9oZWlnaHQobWFzKTsNCisJfSBlbHNlIHsNCisJCXJj dV9hc3NpZ25fcG9pbnRlcihzbG90c1tvZmZzZXRdLCBtYXMtPm5vZGUpOw0KKwl9DQorDQorCWlm ICghYWR2YW5jZWQpDQorCQltYXNfZnJlZShtYXMsIG9sZF9lbm9kZSk7DQorfQ0KKw0KKy8qDQor ICogbWFzX25ld19jaGlsZCgpIC0gRmluZCB0aGUgbmV3IGNoaWxkIG9mIGEgbm9kZS4NCisgKiBA bWFzOiB0aGUgbWFwbGUgc3RhdGUNCisgKiBAY2hpbGQ6IHRoZSBtYXBsZSBzdGF0ZSB0byBzdG9y ZSB0aGUgY2hpbGQuDQorICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19uZXdfY2hpbGQoc3Ry dWN0IG1hX3N0YXRlICptYXMsIHN0cnVjdCBtYV9zdGF0ZSAqY2hpbGQpDQorCV9fbXVzdF9ob2xk KG1hcy0+dHJlZS0+bG9jaykNCit7DQorCWVudW0gbWFwbGVfdHlwZSBtdDsNCisJdW5zaWduZWQg Y2hhciBvZmZzZXQ7DQorCXVuc2lnbmVkIGNoYXIgZW5kOw0KKwl1bnNpZ25lZCBsb25nICpwaXZv dHM7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqZW50cnk7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpu b2RlOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorDQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMt Pm5vZGUpOw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCXNsb3RzID0gbWFfc2xvdHMobm9kZSwg bXQpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQpOw0KKwllbmQgPSBtYV9kYXRhX2Vu ZChub2RlLCBtdCwgcGl2b3RzLCBtYXMtPm1heCk7DQorCWZvciAob2Zmc2V0ID0gbWFzLT5vZmZz ZXQ7IG9mZnNldCA8PSBlbmQ7IG9mZnNldCsrKSB7DQorCQllbnRyeSA9IG1hc19zbG90X2xvY2tl ZChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwkJaWYgKG10ZV9wYXJlbnQoZW50cnkpID09IG5vZGUp IHsNCisJCQkqY2hpbGQgPSAqbWFzOw0KKwkJCW1hcy0+b2Zmc2V0ID0gb2Zmc2V0ICsgMTsNCisJ CQljaGlsZC0+b2Zmc2V0ID0gb2Zmc2V0Ow0KKwkJCW1hc19kZXNjZW5kKGNoaWxkKTsNCisJCQlj aGlsZC0+b2Zmc2V0ID0gMDsNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisJfQ0KKwlyZXR1cm4g ZmFsc2U7DQorfQ0KKw0KKy8qDQorICogbWFiX3NoaWZ0X3JpZ2h0KCkgLSBTaGlmdCB0aGUgZGF0 YSBpbiBtYWIgcmlnaHQuIE5vdGUsIGRvZXMgbm90IGNsZWFuIG91dCB0aGUNCisgKiBvbGQgZGF0 YSBvciBzZXQgYl9ub2RlLT5iX2VuZC4NCisgKiBAYl9ub2RlOiB0aGUgbWFwbGVfYmlnX25vZGUN CisgKiBAc2hpZnQ6IHRoZSBzaGlmdCBjb3VudA0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBt YWJfc2hpZnRfcmlnaHQoc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUsDQorCQkJCSB1bnNp Z25lZCBjaGFyIHNoaWZ0KQ0KK3sNCisJdW5zaWduZWQgbG9uZyBzaXplID0gYl9ub2RlLT5iX2Vu ZCAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsNCisNCisJbWVtbW92ZShiX25vZGUtPnBpdm90ICsg c2hpZnQsIGJfbm9kZS0+cGl2b3QsIHNpemUpOw0KKwltZW1tb3ZlKGJfbm9kZS0+c2xvdCArIHNo aWZ0LCBiX25vZGUtPnNsb3QsIHNpemUpOw0KKwltZW1tb3ZlKGJfbm9kZS0+Z2FwICsgc2hpZnQs IGJfbm9kZS0+Z2FwLCBzaXplKTsNCit9DQorDQorLyoNCisgKiBtYWJfbWlkZGxlX25vZGUoKSAt IENoZWNrIGlmIGEgbWlkZGxlIG5vZGUgaXMgbmVlZGVkICh1bmxpa2VseSkNCisgKiBAYl9ub2Rl OiB0aGUgbWFwbGVfYmlnX25vZGUgdGhhdCBjb250YWlucyB0aGUgZGF0YS4NCisgKiBAc2l6ZTog dGhlIGFtb3VudCBvZiBkYXRhIGluIHRoZSBiX25vZGUNCisgKiBAc3BsaXQ6IHRoZSBwb3RlbnRp YWwgc3BsaXQgbG9jYXRpb24NCisgKiBAc2xvdF9jb3VudDogdGhlIHNpemUgdGhhdCBjYW4gYmUg c3RvcmVkIGluIGEgc2luZ2xlIG5vZGUgYmVpbmcgY29uc2lkZXJlZC4NCisgKg0KKyAqIFJldHVy bjogdHJ1ZSBpZiBhIG1pZGRsZSBub2RlIGlzIHJlcXVpcmVkLg0KKyAqLw0KK3N0YXRpYyBpbmxp bmUgYm9vbCBtYWJfbWlkZGxlX25vZGUoc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUsIGlu dCBzcGxpdCwNCisJCQkJICAgdW5zaWduZWQgY2hhciBzbG90X2NvdW50KQ0KK3sNCisJdW5zaWdu ZWQgY2hhciBzaXplID0gYl9ub2RlLT5iX2VuZDsNCisNCisJaWYgKHNpemUgPj0gMiAqIHNsb3Rf Y291bnQpDQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJaWYgKCFiX25vZGUtPnNsb3Rbc3BsaXRdICYm IChzaXplID49IDIgKiBzbG90X2NvdW50IC0gMSkpDQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJcmV0 dXJuIGZhbHNlOw0KK30NCisNCisvKg0KKyAqIG1hYl9ub19udWxsX3NwbGl0KCkgLSBlbnN1cmUg dGhlIHNwbGl0IGRvZXNuJ3QgZmFsbCBvbiBhIE5VTEwNCisgKiBAYl9ub2RlOiB0aGUgbWFwbGVf YmlnX25vZGUgd2l0aCB0aGUgZGF0YQ0KKyAqIEBzcGxpdDogdGhlIHN1Z2dlc3RlZCBzcGxpdCBs b2NhdGlvbg0KKyAqIEBzbG90X2NvdW50OiB0aGUgbnVtYmVyIG9mIHNsb3RzIGluIHRoZSBub2Rl IGJlaW5nIGNvbnNpZGVyZWQuDQorICoNCisgKiBSZXR1cm46IHRoZSBzcGxpdCBsb2NhdGlvbi4N CisgKi8NCitzdGF0aWMgaW5saW5lIGludCBtYWJfbm9fbnVsbF9zcGxpdChzdHJ1Y3QgbWFwbGVf YmlnX25vZGUgKmJfbm9kZSwNCisJCQkJICAgIHVuc2lnbmVkIGNoYXIgc3BsaXQsIHVuc2lnbmVk IGNoYXIgc2xvdF9jb3VudCkNCit7DQorCWlmICghYl9ub2RlLT5zbG90W3NwbGl0XSkgew0KKwkJ LyoNCisJCSAqIElmIHRoZSBzcGxpdCBpcyBsZXNzIHRoYW4gdGhlIG1heCBzbG90ICYmIHRoZSBy aWdodCBzaWRlIHdpbGwNCisJCSAqIHN0aWxsIGJlIHN1ZmZpY2llbnQsIHRoZW4gaW5jcmVtZW50 IHRoZSBzcGxpdCBvbiBOVUxMLg0KKwkJICovDQorCQlpZiAoKHNwbGl0IDwgc2xvdF9jb3VudCAt IDEpICYmDQorCQkgICAgKGJfbm9kZS0+Yl9lbmQgLSBzcGxpdCkgPiAobXRfbWluX3Nsb3RzW2Jf bm9kZS0+dHlwZV0pKQ0KKwkJCXNwbGl0Kys7DQorCQllbHNlDQorCQkJc3BsaXQtLTsNCisJfQ0K KwlyZXR1cm4gc3BsaXQ7DQorfQ0KKw0KKy8qDQorICogbWFiX2NhbGNfc3BsaXQoKSAtIENhbGN1 bGF0ZSB0aGUgc3BsaXQgbG9jYXRpb24gYW5kIGlmIHRoZXJlIG5lZWRzIHRvIGJlIHR3bw0KKyAq IHNwbGl0cy4NCisgKiBAYm46IFRoZSBtYXBsZV9iaWdfbm9kZSB3aXRoIHRoZSBkYXRhDQorICog QG1pZF9zcGxpdDogVGhlIHNlY29uZCBzcGxpdCwgaWYgcmVxdWlyZWQuICAwIG90aGVyd2lzZS4N CisgKg0KKyAqIFJldHVybjogVGhlIGZpcnN0IHNwbGl0IGxvY2F0aW9uLiAgVGhlIG1pZGRsZSBz cGxpdCBpcyBzZXQgaW4gQG1pZF9zcGxpdC4NCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBtYWJf Y2FsY19zcGxpdChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJCQkJIHN0cnVjdCBtYXBsZV9iaWdf bm9kZSAqYm4sDQorCQkJCSB1bnNpZ25lZCBjaGFyICptaWRfc3BsaXQpDQorew0KKwl1bnNpZ25l ZCBjaGFyIGJfZW5kID0gYm4tPmJfZW5kOw0KKwlpbnQgc3BsaXQgPSBiX2VuZCAvIDI7IC8qIEFz c3VtZSBlcXVhbCBzcGxpdC4gKi8NCisJdW5zaWduZWQgY2hhciBtaW4sIHNsb3RfY291bnQgPSBt dF9zbG90c1tibi0+dHlwZV07DQorDQorCS8qDQorCSAqIFRvIHN1cHBvcnQgZ2FwIHRyYWNraW5n LCBhbGwgTlVMTCBlbnRyaWVzIGFyZSBrZXB0IHRvZ2V0aGVyIGFuZCBhIG5vZGUgY2Fubm90DQor CSAqIGVuZCBvbiBhIE5VTEwgZW50cnksIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgbGVmdC1t b3N0IGxlYWYuICBUaGUNCisJICogbGltaXRhdGlvbiBtZWFucyB0aGF0IHRoZSBzcGxpdCBvZiBh IG5vZGUgbXVzdCBiZSBjaGVja2VkIGZvciB0aGlzIGNvbmRpdGlvbg0KKwkgKiBhbmQgYmUgYWJs ZSB0byBwdXQgbW9yZSBkYXRhIGluIG9uZSBkaXJlY3Rpb24gb3IgdGhlIG90aGVyLg0KKwkgKi8N CisJaWYgKHVubGlrZWx5KChtYXMtPm1hc19mbGFncyAmIE1BX1NUQVRFX0JVTEspKSkgew0KKwkJ Km1pZF9zcGxpdCA9IDA7DQorCQlpZiAobWFfaXNfbGVhZihibi0+dHlwZSkpDQorCQkJbWluID0g MjsNCisJCWVsc2UNCisJCQlyZXR1cm4gYl9lbmQgLSBtdF9taW5fc2xvdHNbYm4tPnR5cGVdOw0K Kw0KKwkJc3BsaXQgPSBiX2VuZCAtIG1pbjsNCisJCW1hcy0+bWFzX2ZsYWdzIHw9IE1BX1NUQVRF X1JFQkFMQU5DRTsNCisJCWlmICghYm4tPnNsb3Rbc3BsaXRdKQ0KKwkJCXNwbGl0LS07DQorCQly ZXR1cm4gc3BsaXQ7DQorCX0NCisNCisJLyoNCisJICogQWx0aG91Z2ggZXh0cmVtZWx5IHJhcmUs IGl0IGlzIHBvc3NpYmxlIHRvIGVudGVyIHdoYXQgaXMga25vd24gYXMgdGhlIDMtd2F5DQorCSAq IHNwbGl0IHNjZW5hcmlvLiAgVGhlIDMtd2F5IHNwbGl0IGNvbWVzIGFib3V0IGJ5IG1lYW5zIG9m IGEgc3RvcmUgb2YgYSByYW5nZQ0KKwkgKiB0aGF0IG92ZXJ3cml0ZXMgdGhlIGVuZCBhbmQgYmVn aW5uaW5nIG9mIHR3byBmdWxsIG5vZGVzLiAgVGhlIHJlc3VsdCBpcyBhIHNldA0KKwkgKiBvZiBl bnRyaWVzIHRoYXQgY2Fubm90IGJlIHN0b3JlZCBpbiAyIG5vZGVzLiAgU29tZXRpbWVzLCB0aGVz ZSB0d28gbm9kZXMgY2FuDQorCSAqIGFsc28gYmUgbG9jYXRlZCBpbiBkaWZmZXJlbnQgcGFyZW50 IG5vZGVzIHdoaWNoIGFyZSBhbHNvIGZ1bGwuICBUaGlzIGNhbg0KKwkgKiBjYXJyeSB1cHdhcmRz IGFsbCB0aGUgd2F5IHRvIHRoZSByb290IGluIHRoZSB3b3JzdCBjYXNlLg0KKwkgKi8NCisJaWYg KHVubGlrZWx5KG1hYl9taWRkbGVfbm9kZShibiwgc3BsaXQsIHNsb3RfY291bnQpKSkgew0KKwkJ c3BsaXQgPSBiX2VuZCAvIDM7DQorCQkqbWlkX3NwbGl0ID0gc3BsaXQgKiAyOw0KKwl9IGVsc2Ug ew0KKwkJbWluID0gbXRfbWluX3Nsb3RzW2JuLT50eXBlXTsNCisNCisJCSptaWRfc3BsaXQgPSAw Ow0KKwkJLyoNCisJCSAqIEF2b2lkIGhhdmluZyBhIHJhbmdlIGxlc3MgdGhhbiB0aGUgc2xvdCBj b3VudCB1bmxlc3MgaXQNCisJCSAqIGNhdXNlcyBvbmUgbm9kZSB0byBiZSBkZWZpY2llbnQuDQor CQkgKiBOT1RFOiBtdF9taW5fc2xvdHMgaXMgMSBiYXNlZCwgYl9lbmQgYW5kIHNwbGl0IGFyZSB6 ZXJvLg0KKwkJICovDQorCQl3aGlsZSAoKChibi0+cGl2b3Rbc3BsaXRdIC0gYm4tPm1pbikgPCBz bG90X2NvdW50IC0gMSkgJiYNCisJCSAgICAgICAoc3BsaXQgPCBzbG90X2NvdW50IC0gMSkgJiYg KGJfZW5kIC0gc3BsaXQgPiBtaW4pKQ0KKwkJCXNwbGl0Kys7DQorCX0NCisNCisJLyogQXZvaWQg ZW5kaW5nIGEgbm9kZSBvbiBhIE5VTEwgZW50cnkgKi8NCisJc3BsaXQgPSBtYWJfbm9fbnVsbF9z cGxpdChibiwgc3BsaXQsIHNsb3RfY291bnQpOw0KKwlpZiAoISgqbWlkX3NwbGl0KSkNCisJCXJl dHVybiBzcGxpdDsNCisNCisJKm1pZF9zcGxpdCA9IG1hYl9ub19udWxsX3NwbGl0KGJuLCAqbWlk X3NwbGl0LCBzbG90X2NvdW50KTsNCisNCisJcmV0dXJuIHNwbGl0Ow0KK30NCisNCisvKg0KKyAq IG1hc19tYWJfY3AoKSAtIENvcHkgZGF0YSBmcm9tIGEgbWFwbGUgc3RhdGUgaW5jbHVzaXZlbHkg dG8gYSBtYXBsZV9iaWdfbm9kZQ0KKyAqIGFuZCBzZXQgQGJfbm9kZS0+Yl9lbmQgdG8gdGhlIG5l eHQgZnJlZSBzbG90Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtYXNfc3RhcnQ6 IFRoZSBzdGFydGluZyBzbG90IHRvIGNvcHkNCisgKiBAbWFzX2VuZDogVGhlIGVuZCBzbG90IHRv IGNvcHkgKGluY2x1c2l2ZWx5KQ0KKyAqIEBiX25vZGU6IFRoZSBtYXBsZV9iaWdfbm9kZSB0byBw bGFjZSB0aGUgZGF0YQ0KKyAqIEBtYWJfc3RhcnQ6IFRoZSBzdGFydGluZyBsb2NhdGlvbiBpbiBt YXBsZV9iaWdfbm9kZSB0byBzdG9yZSB0aGUgZGF0YS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZv aWQgbWFzX21hYl9jcChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgY2hhciBtYXNfc3Rh cnQsDQorCQkJdW5zaWduZWQgY2hhciBtYXNfZW5kLCBzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgKmJf bm9kZSwNCisJCQl1bnNpZ25lZCBjaGFyIG1hYl9zdGFydCkNCit7DQorCWVudW0gbWFwbGVfdHlw ZSBtdDsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXZvaWQgX19yY3UgKipzbG90czsN CisJdW5zaWduZWQgbG9uZyAqcGl2b3RzLCAqZ2FwczsNCisJaW50IGkgPSBtYXNfc3RhcnQsIGog PSBtYWJfc3RhcnQ7DQorCXVuc2lnbmVkIGNoYXIgcGl2X2VuZDsNCisNCisJbm9kZSA9IG1hc19t bihtYXMpOw0KKwltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJcGl2b3RzID0gbWFf cGl2b3RzKG5vZGUsIG10KTsNCisJaWYgKCFpKSB7DQorCQliX25vZGUtPnBpdm90W2pdID0gcGl2 b3RzW2krK107DQorCQlpZiAodW5saWtlbHkoaSA+IG1hc19lbmQpKQ0KKwkJCWdvdG8gY29tcGxl dGU7DQorCQlqKys7DQorCX0NCisNCisJcGl2X2VuZCA9IG1pbihtYXNfZW5kLCBtdF9waXZvdHNb bXRdKTsNCisJZm9yICg7IGkgPCBwaXZfZW5kOyBpKyssIGorKykgew0KKwkJYl9ub2RlLT5waXZv dFtqXSA9IHBpdm90c1tpXTsNCisJCWlmICh1bmxpa2VseSghYl9ub2RlLT5waXZvdFtqXSkpDQor CQkJYnJlYWs7DQorDQorCQlpZiAodW5saWtlbHkobWFzLT5tYXggPT0gYl9ub2RlLT5waXZvdFtq XSkpDQorCQkJZ290byBjb21wbGV0ZTsNCisJfQ0KKw0KKwlpZiAobGlrZWx5KGkgPD0gbWFzX2Vu ZCkpDQorCQliX25vZGUtPnBpdm90W2pdID0gbWFzX3NhZmVfcGl2b3QobWFzLCBwaXZvdHMsIGks IG10KTsNCisNCitjb21wbGV0ZToNCisJYl9ub2RlLT5iX2VuZCA9ICsrajsNCisJaiAtPSBtYWJf c3RhcnQ7DQorCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgbXQpOw0KKwltZW1jcHkoYl9ub2RlLT5z bG90ICsgbWFiX3N0YXJ0LCBzbG90cyArIG1hc19zdGFydCwgc2l6ZW9mKHZvaWQgKikgKiBqKTsN CisJaWYgKCFtYV9pc19sZWFmKG10KSAmJiBtdF9pc19hbGxvYyhtYXMtPnRyZWUpKSB7DQorCQln YXBzID0gbWFfZ2Fwcyhub2RlLCBtdCk7DQorCQltZW1jcHkoYl9ub2RlLT5nYXAgKyBtYWJfc3Rh cnQsIGdhcHMgKyBtYXNfc3RhcnQsDQorCQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICog aik7DQorCX0NCit9DQorDQorLyoNCisgKiBtYWJfbWFzX2NwKCkgLSBDb3B5IGRhdGEgZnJvbSBt YXBsZV9iaWdfbm9kZSB0byBhIG1hcGxlIGVuY29kZWQgbm9kZS4NCisgKiBAYl9ub2RlOiB0aGUg bWFwbGVfYmlnX25vZGUgdGhhdCBoYXMgdGhlIGRhdGENCisgKiBAbWFiX3N0YXJ0OiB0aGUgc3Rh cnQgbG9jYXRpb24gaW4gQGJfbm9kZS4NCisgKiBAbWFiX2VuZDogVGhlIGVuZCBsb2NhdGlvbiBp biBAYl9ub2RlIChpbmNsdXNpdmVseSkNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUgd2l0aCB0 aGUgbWFwbGUgZW5jb2RlZCBub2RlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWJfbWFz X2NwKHN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2RlLA0KKwkJCSAgICAgIHVuc2lnbmVkIGNo YXIgbWFiX3N0YXJ0LCB1bnNpZ25lZCBjaGFyIG1hYl9lbmQsDQorCQkJICAgICAgc3RydWN0IG1h X3N0YXRlICptYXMsIGJvb2wgbmV3X21heCkNCit7DQorCWludCBpLCBqID0gMDsNCisJZW51bSBt YXBsZV90eXBlIG10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlzdHJ1Y3QgbWFwbGVf bm9kZSAqbm9kZSA9IG10ZV90b19ub2RlKG1hcy0+bm9kZSk7DQorCXZvaWQgX19yY3UgKipzbG90 cyA9IG1hX3Nsb3RzKG5vZGUsIG10KTsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzID0gbWFfcGl2 b3RzKG5vZGUsIG10KTsNCisJdW5zaWduZWQgbG9uZyAqZ2FwcyA9IE5VTEw7DQorCXVuc2lnbmVk IGNoYXIgZW5kOw0KKw0KKwlpZiAobWFiX2VuZCAtIG1hYl9zdGFydCA+IG10X3Bpdm90c1ttdF0p DQorCQltYWJfZW5kLS07DQorDQorCWlmICghcGl2b3RzW210X3Bpdm90c1ttdF0gLSAxXSkNCisJ CXNsb3RzW210X3Bpdm90c1ttdF1dID0gTlVMTDsNCisNCisJaSA9IG1hYl9zdGFydDsNCisJcGl2 b3RzW2orK10gPSBiX25vZGUtPnBpdm90W2krK107DQorCWRvIHsNCisJCXBpdm90c1tqKytdID0g Yl9ub2RlLT5waXZvdFtpKytdOw0KKwl9IHdoaWxlIChpIDw9IG1hYl9lbmQgJiYgbGlrZWx5KGJf bm9kZS0+cGl2b3RbaV0pKTsNCisNCisJbWVtY3B5KHNsb3RzLCBiX25vZGUtPnNsb3QgKyBtYWJf c3RhcnQsDQorCSAgICAgICBzaXplb2Yodm9pZCAqKSAqIChpIC0gbWFiX3N0YXJ0KSk7DQorDQor CWlmIChuZXdfbWF4KQ0KKwkJbWFzLT5tYXggPSBiX25vZGUtPnBpdm90W2kgLSAxXTsNCisNCisJ ZW5kID0gaiAtIDE7DQorCWlmIChsaWtlbHkoIW1hX2lzX2xlYWYobXQpICYmIG10X2lzX2FsbG9j KG1hcy0+dHJlZSkpKSB7DQorCQl1bnNpZ25lZCBsb25nIG1heF9nYXAgPSAwOw0KKwkJdW5zaWdu ZWQgY2hhciBvZmZzZXQgPSAxNTsNCisNCisJCWdhcHMgPSBtYV9nYXBzKG5vZGUsIG10KTsNCisJ CWRvIHsNCisJCQlnYXBzWy0tal0gPSBiX25vZGUtPmdhcFstLWldOw0KKwkJCWlmIChnYXBzW2pd ID4gbWF4X2dhcCkgew0KKwkJCQlvZmZzZXQgPSBqOw0KKwkJCQltYXhfZ2FwID0gZ2Fwc1tqXTsN CisJCQl9DQorCQl9IHdoaWxlIChqKTsNCisNCisJCW1hX3NldF9tZXRhKG5vZGUsIG10LCBvZmZz ZXQsIGVuZCk7DQorCX0gZWxzZSBpZiAoZW5kIDw9IG10X3Bpdm90c1ttdF0gLSAxKSB7DQorCQlp ZiAocGl2b3RzW2VuZF0gIT0gbWFzLT5tYXgpDQorCQkJZW5kKys7DQorDQorCQltYV9zZXRfbWV0 YShub2RlLCBtdCwgMCwgZW5kKTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc19kZXNjZW5kX2Fk b3B0KCkgLSBEZXNjZW5kIHRocm91Z2ggYSBzdWItdHJlZSBhbmQgYWRvcHQgY2hpbGRyZW4uDQor ICogQG1hczogdGhlIG1hcGxlIHN0YXRlIHdpdGggdGhlIG1hcGxlIGVuY29kZWQgbm9kZSBvZiB0 aGUgc3ViLXRyZWUuDQorICoNCisgKiBEZXNjZW5kIHRocm91Z2ggYSBzdWItdHJlZSBhbmQgYWRv cHQgY2hpbGRyZW4gd2hvIGRvIG5vdCBoYXZlIHRoZSBjb3JyZWN0DQorICogcGFyZW50cyBzZXQu ICBGb2xsb3cgdGhlIHBhcmVudHMgd2hpY2ggaGF2ZSB0aGUgY29ycmVjdCBwYXJlbnRzIGFzIHRo ZXkgYXJlDQorICogdGhlIG5ldyBlbnRyaWVzIHdoaWNoIG5lZWQgdG8gYmUgZm9sbG93ZWQgdG8g ZmluZCBvdGhlciBpbmNvcnJlY3RseSBzZXQNCisgKiBwYXJlbnRzLg0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgdm9pZCBtYXNfZGVzY2VuZF9hZG9wdChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQor CXN0cnVjdCBtYV9zdGF0ZSBsaXN0WzNdLCBuZXh0WzNdOw0KKwlpbnQgaSwgbjsNCisNCisJLyoN CisJICogQXQgZWFjaCBsZXZlbCB0aGVyZSBtYXkgYmUgdXAgdG8gMyBjb3JyZWN0IHBhcmVudCBw b2ludGVycyB3aGljaCBpbmRpY2F0ZXMNCisJICogdGhlIG5ldyBub2RlcyB3aGljaCBuZWVkIHRv IGJlIHdhbGtlZCB0byBmaW5kIGFueSBuZXcgbm9kZXMgYXQgYSBsb3dlciBsZXZlbC4NCisJICov DQorDQorCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsNCisJCWxpc3RbaV0gPSAqbWFzOw0KKwkJ bGlzdFtpXS5vZmZzZXQgPSAwOw0KKwkJbmV4dFtpXS5vZmZzZXQgPSAwOw0KKwl9DQorCW5leHRb MF0gPSAqbWFzOw0KKw0KKwl3aGlsZSAoIW10ZV9pc19sZWFmKGxpc3RbMF0ubm9kZSkpIHsNCisJ CW4gPSAwOw0KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgew0KKwkJCWlmIChtYXNfaXNfbm9u ZSgmbGlzdFtpXSkpDQorCQkJCWNvbnRpbnVlOw0KKw0KKwkJCWlmIChpICYmIGxpc3RbaS0xXS5u b2RlID09IGxpc3RbaV0ubm9kZSkNCisJCQkJY29udGludWU7DQorDQorCQkJd2hpbGUgKChuIDwg MykgJiYgKG1hc19uZXdfY2hpbGQoJmxpc3RbaV0sICZuZXh0W25dKSkpDQorCQkJCW4rKzsNCisN CisJCQltYXNfYWRvcHRfY2hpbGRyZW4oJmxpc3RbaV0sIGxpc3RbaV0ubm9kZSk7DQorCQl9DQor DQorCQl3aGlsZSAobiA8IDMpDQorCQkJbmV4dFtuKytdLm5vZGUgPSBNQVNfTk9ORTsNCisNCisJ CS8qIGRlc2NlbmQgYnkgc2V0dGluZyB0aGUgbGlzdCB0byB0aGUgY2hpbGRyZW4gKi8NCisJCWZv ciAoaSA9IDA7IGkgPCAzOyBpKyspDQorCQkJbGlzdFtpXSA9IG5leHRbaV07DQorCX0NCit9DQor DQorLyoNCisgKiBtYXNfYnVsa19yZWJhbGFuY2UoKSAtIFJlYmFsYW5jZSB0aGUgZW5kIG9mIGEg dHJlZSBhZnRlciBhIGJ1bGsgaW5zZXJ0Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAq IEBlbmQ6IFRoZSBtYXBsZSBub2RlIGVuZA0KKyAqIEBtdDogVGhlIG1hcGxlIG5vZGUgdHlwZQ0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfYnVsa19yZWJhbGFuY2Uoc3RydWN0IG1hX3N0 YXRlICptYXMsIHVuc2lnbmVkIGNoYXIgZW5kLA0KKwkJCQkgICAgICBlbnVtIG1hcGxlX3R5cGUg bXQpDQorew0KKwlpZiAoIShtYXMtPm1hc19mbGFncyAmIE1BX1NUQVRFX0JVTEspKQ0KKwkJcmV0 dXJuOw0KKw0KKwlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJ aWYgKGVuZCA+IG10X21pbl9zbG90c1ttdF0pIHsNCisJCW1hcy0+bWFzX2ZsYWdzICY9IH5NQV9T VEFURV9SRUJBTEFOQ0U7DQorCQlyZXR1cm47DQorCX0NCit9DQorDQorLyoNCisgKiBtYXNfc3Rv cmVfYl9ub2RlKCkgLSBTdG9yZSBhbiBAZW50cnkgaW50byB0aGUgYl9ub2RlIHdoaWxlIGFsc28g Y29weWluZyB0aGUNCisgKiBkYXRhIGZyb20gYSBtYXBsZSBlbmNvZGVkIG5vZGUuDQorICogQG1h czogdGhlIG1hcGxlIHN0YXRlDQorICogQGJfbm9kZTogdGhlIG1hcGxlX2JpZ19ub2RlIHRvIGZp bGwgd2l0aCBkYXRhDQorICogQGVudHJ5OiB0aGUgZGF0YSB0byBzdG9yZS4NCisgKg0KKyAqIFJl dHVybjogVGhlIGFjdHVhbCBlbmQgb2YgdGhlIGRhdGEgc3RvcmVkIGluIEBiX25vZGUNCisgKi8N CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgbWFzX3N0b3JlX2Jfbm9kZShzdHJ1Y3QgbWFf d3Jfc3RhdGUgKndyX21hcywNCisJCQkJICAgIHN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2Rl LA0KKwkJCQkgICAgdW5zaWduZWQgY2hhciBvZmZzZXRfZW5kKQ0KK3sNCisJdW5zaWduZWQgY2hh ciBzbG90Ow0KKwl1bnNpZ25lZCBjaGFyIGJfZW5kOw0KKwkvKiBQb3NzaWJsZSB1bmRlcmZsb3cg b2YgcGl2IHdpbGwgd3JhcCBiYWNrIHRvIDAgYmVmb3JlIHVzZS4gKi8NCisJdW5zaWduZWQgbG9u ZyBwaXY7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQorDQorCWJfbm9k ZS0+dHlwZSA9IHdyX21hcy0+dHlwZTsNCisJYl9lbmQgPSAwOw0KKwlzbG90ID0gbWFzLT5vZmZz ZXQ7DQorCWlmIChzbG90KSB7DQorCQkvKiBDb3B5IHN0YXJ0IGRhdGEgdXAgdG8gaW5zZXJ0LiAq Lw0KKwkJbWFzX21hYl9jcChtYXMsIDAsIHNsb3QgLSAxLCBiX25vZGUsIDApOw0KKwkJYl9lbmQg PSBiX25vZGUtPmJfZW5kOw0KKwkJcGl2ID0gYl9ub2RlLT5waXZvdFtiX2VuZCAtIDFdOw0KKwl9 IGVsc2UNCisJCXBpdiA9IG1hcy0+bWluIC0gMTsNCisNCisJaWYgKHBpdiArIDEgPCBtYXMtPmlu ZGV4KSB7DQorCQkvKiBIYW5kbGUgcmFuZ2Ugc3RhcnRpbmcgYWZ0ZXIgb2xkIHJhbmdlICovDQor CQliX25vZGUtPnNsb3RbYl9lbmRdID0gd3JfbWFzLT5jb250ZW50Ow0KKwkJaWYgKCF3cl9tYXMt PmNvbnRlbnQpDQorCQkJYl9ub2RlLT5nYXBbYl9lbmRdID0gbWFzLT5pbmRleCAtIDEgLSBwaXY7 DQorCQliX25vZGUtPnBpdm90W2JfZW5kKytdID0gbWFzLT5pbmRleCAtIDE7DQorCX0NCisNCisJ LyogU3RvcmUgdGhlIG5ldyBlbnRyeS4gKi8NCisJbWFzLT5vZmZzZXQgPSBiX2VuZDsNCisJYl9u b2RlLT5zbG90W2JfZW5kXSA9IHdyX21hcy0+ZW50cnk7DQorCWJfbm9kZS0+cGl2b3RbYl9lbmRd ID0gbWFzLT5sYXN0Ow0KKw0KKwkvKiBBcHBlbmRlZC4gKi8NCisJaWYgKG1hcy0+bGFzdCA+PSBt YXMtPm1heCkNCisJCXJldHVybiBiX2VuZDsNCisNCisJLyogSGFuZGxlIG5ldyByYW5nZSBlbmRp bmcgYmVmb3JlIG9sZCByYW5nZSBlbmRzICovDQorCXBpdiA9IG1hc19sb2dpY2FsX3Bpdm90KG1h cywgd3JfbWFzLT5waXZvdHMsIG9mZnNldF9lbmQsIHdyX21hcy0+dHlwZSk7DQorCWlmIChwaXYg PiBtYXMtPmxhc3QpIHsNCisJCWlmIChwaXYgPT0gVUxPTkdfTUFYKQ0KKwkJCW1hc19idWxrX3Jl YmFsYW5jZShtYXMsIGJfbm9kZS0+Yl9lbmQsIHdyX21hcy0+dHlwZSk7DQorDQorCQlpZiAob2Zm c2V0X2VuZCAhPSBzbG90KQ0KKwkJCXdyX21hcy0+Y29udGVudCA9IG1hc19zbG90X2xvY2tlZCht YXMsIHdyX21hcy0+c2xvdHMsDQorCQkJCQkJCSAgb2Zmc2V0X2VuZCk7DQorDQorCQliX25vZGUt PnNsb3RbKytiX2VuZF0gPSB3cl9tYXMtPmNvbnRlbnQ7DQorCQlpZiAoIXdyX21hcy0+Y29udGVu dCkNCisJCQliX25vZGUtPmdhcFtiX2VuZF0gPSBwaXYgLSBtYXMtPmxhc3QgKyAxOw0KKwkJYl9u b2RlLT5waXZvdFtiX2VuZF0gPSBwaXY7DQorCX0NCisNCisJc2xvdCA9IG9mZnNldF9lbmQgKyAx Ow0KKwlpZiAoc2xvdCA+IHdyX21hcy0+bm9kZV9lbmQpDQorCQlyZXR1cm4gYl9lbmQ7DQorDQor CS8qIENvcHkgZW5kIGRhdGEgdG8gdGhlIGVuZCBvZiB0aGUgbm9kZS4gKi8NCisJbWFzX21hYl9j cChtYXMsIHNsb3QsIHdyX21hcy0+bm9kZV9lbmQgKyAxLCBiX25vZGUsICsrYl9lbmQpOw0KKwli X2VuZCA9IGJfbm9kZS0+Yl9lbmQgLSAxOw0KKwlyZXR1cm4gYl9lbmQ7DQorfQ0KKw0KKy8qDQor ICogbWFzX3ByZXZfc2libGluZygpIC0gRmluZCB0aGUgcHJldmlvdXMgbm9kZSB3aXRoIHRoZSBz YW1lIHBhcmVudC4NCisgKiBAbWFzOiB0aGUgbWFwbGUgc3RhdGUNCisgKg0KKyAqIFJldHVybjog VHJ1ZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHNpYmxpbmcsIGZhbHNlIG90aGVyd2lzZS4NCisg Ki8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3ByZXZfc2libGluZyhzdHJ1Y3QgbWFfc3RhdGUg Km1hcykNCit7DQorCXVuc2lnbmVkIGludCBwX3Nsb3QgPSBtdGVfcGFyZW50X3Nsb3QobWFzLT5u b2RlKTsNCisNCisJaWYgKG10ZV9pc19yb290KG1hcy0+bm9kZSkpDQorCQlyZXR1cm4gZmFsc2U7 DQorDQorCWlmICghcF9zbG90KQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0KKwltYXNfYXNjZW5kKG1h cyk7DQorCW1hcy0+b2Zmc2V0ID0gcF9zbG90IC0gMTsNCisJbWFzX2Rlc2NlbmQobWFzKTsNCisJ cmV0dXJuIHRydWU7DQorfQ0KKw0KKy8qDQorICogbWFzX25leHRfc2libGluZygpIC0gRmluZCB0 aGUgbmV4dCBub2RlIHdpdGggdGhlIHNhbWUgcGFyZW50Lg0KKyAqIEBtYXM6IHRoZSBtYXBsZSBz dGF0ZQ0KKyAqDQorICogUmV0dXJuOiB0cnVlIGlmIHRoZXJlIGlzIGEgbmV4dCBzaWJsaW5nLCBm YWxzZSBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19uZXh0X3NpYmxp bmcoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlNQV9TVEFURShwYXJlbnQsIG1hcy0+dHJl ZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0KTsNCisNCisJaWYgKG10ZV9pc19yb290KG1hcy0+bm9k ZSkpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCXBhcmVudCA9ICptYXM7DQorCW1hc19hc2NlbmQo JnBhcmVudCk7DQorCXBhcmVudC5vZmZzZXQgPSBtdGVfcGFyZW50X3Nsb3QobWFzLT5ub2RlKSAr IDE7DQorCWlmIChwYXJlbnQub2Zmc2V0ID4gbWFzX2RhdGFfZW5kKCZwYXJlbnQpKQ0KKwkJcmV0 dXJuIGZhbHNlOw0KKw0KKwkqbWFzID0gcGFyZW50Ow0KKwltYXNfZGVzY2VuZChtYXMpOw0KKwly ZXR1cm4gdHJ1ZTsNCit9DQorDQorLyoNCisgKiBtdGVfbm9kZV9vcl9ub2RlKCkgLSBSZXR1cm4g dGhlIGVuY29kZWQgbm9kZSBvciBNQVNfTk9ORS4NCisgKiBAZW5vZGU6IFRoZSBlbmNvZGVkIG1h cGxlIG5vZGUuDQorICoNCisgKiBTaG9ydGhhbmQgdG8gYXZvaWQgc2V0dGluZyAlTlVMTHMgaW4g dGhlIHRyZWUgb3IgbWFwbGVfc3VidHJlZV9zdGF0ZS4NCisgKg0KKyAqIFJldHVybjogQGVub2Rl IG9yIE1BU19OT05FDQorICovDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm10 ZV9ub2RlX29yX25vbmUoc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSkNCit7DQorCWlmIChlbm9k ZSkNCisJCXJldHVybiBlbm9kZTsNCisNCisJcmV0dXJuIG1hX2Vub2RlX3B0cihNQVNfTk9ORSk7 DQorfQ0KKw0KKy8qDQorICogbWFzX3dyX25vZGVfd2FsaygpIC0gRmluZCB0aGUgY29ycmVjdCBv ZmZzZXQgZm9yIHRoZSBpbmRleCBpbiB0aGUgQG1hcy4NCisgKiBAd3JfbWFzOiBUaGUgbWFwbGUg d3JpdGUgc3RhdGUNCisgKg0KKyAqIFVzZXMgbWFzX3Nsb3RfbG9ja2VkKCkgYW5kIGRvZXMgbm90 IG5lZWQgdG8gd29ycnkgYWJvdXQgZGVhZCBub2Rlcy4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZv aWQgbWFzX3dyX25vZGVfd2FsayhzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQorCXN0 cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQorCXVuc2lnbmVkIGNoYXIgY291bnQ7 DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwl1bnNpZ25lZCBsb25nIGluZGV4LCBtaW4sIG1h eDsNCisNCisJaWYgKHVubGlrZWx5KG1hX2lzX2RlbnNlKHdyX21hcy0+dHlwZSkpKSB7DQorCQl3 cl9tYXMtPnJfbWF4ID0gd3JfbWFzLT5yX21pbiA9IG1hcy0+aW5kZXg7DQorCQltYXMtPm9mZnNl dCA9IG1hcy0+aW5kZXggPSBtYXMtPm1pbjsNCisJCXJldHVybjsNCisJfQ0KKw0KKwl3cl9tYXMt Pm5vZGUgPSBtYXNfbW4od3JfbWFzLT5tYXMpOw0KKwl3cl9tYXMtPnBpdm90cyA9IG1hX3Bpdm90 cyh3cl9tYXMtPm5vZGUsIHdyX21hcy0+dHlwZSk7DQorCWNvdW50ID0gd3JfbWFzLT5ub2RlX2Vu ZCA9IG1hX2RhdGFfZW5kKHdyX21hcy0+bm9kZSwgd3JfbWFzLT50eXBlLA0KKwkJCQkJICAgICAg IHdyX21hcy0+cGl2b3RzLCBtYXMtPm1heCk7DQorCW9mZnNldCA9IG1hcy0+b2Zmc2V0Ow0KKwlt aW4gPSBtYXNfc2FmZV9taW4obWFzLCB3cl9tYXMtPnBpdm90cywgb2Zmc2V0KTsNCisJbWF4ID0g d3JfbWFzLT5waXZvdHNbb2Zmc2V0XTsNCisJaWYgKHVubGlrZWx5KG9mZnNldCA9PSBjb3VudCkp DQorCQlnb3RvIG1heDsgLyogbWF5IGhhdmUgYmVlbiBzZXQgdG8gemVybyAqLw0KKw0KKwlpbmRl eCA9IG1hcy0+aW5kZXg7DQorCWlmICh1bmxpa2VseShpbmRleCA8PSBtYXgpKQ0KKwkJZ290byBk b25lOw0KKw0KKwlpZiAodW5saWtlbHkoIW1heCAmJiBvZmZzZXQpKQ0KKwkJZ290byBtYXg7DQor DQorCW1pbiA9IG1heCArIDE7DQorCXdoaWxlICgrK29mZnNldCA8IGNvdW50KSB7DQorCQltYXgg PSB3cl9tYXMtPnBpdm90c1tvZmZzZXRdOw0KKwkJaWYgKGluZGV4IDw9IG1heCkNCisJCQlnb3Rv IGRvbmU7DQorCQllbHNlIGlmICh1bmxpa2VseSghbWF4KSkNCisJCQlicmVhazsNCisNCisJCW1p biA9IG1heCArIDE7DQorCX0NCisNCittYXg6DQorCW1heCA9IG1hcy0+bWF4Ow0KK2RvbmU6DQor CXdyX21hcy0+cl9tYXggPSBtYXg7DQorCXdyX21hcy0+cl9taW4gPSBtaW47DQorCXdyX21hcy0+ b2Zmc2V0X2VuZCA9IG1hcy0+b2Zmc2V0ID0gb2Zmc2V0Ow0KK30NCisNCisvKg0KKyAqIG1hc3Rf dG9waWFyeSgpIC0gQWRkIHRoZSBwb3J0aW9ucyBvZiB0aGUgdHJlZSB0byB0aGUgcmVtb3ZhbCBs aXN0OyBlaXRoZXIgdG8NCisgKiBiZSBmcmVlZCBvciBkaXNjYXJkZWQgKGRlc3Ryb3kgd2Fsayku DQorICogQG1hc3Q6IFRoZSBtYXBsZV9zdWJ0cmVlX3N0YXRlLg0KKyAqLw0KK3N0YXRpYyBpbmxp bmUgdm9pZCBtYXN0X3RvcGlhcnkoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QpDQor ew0KKwlNQV9XUl9TVEFURSh3cl9tYXMsIG1hc3QtPm9yaWdfbCwgTlVMTCk7DQorCXVuc2lnbmVk IGNoYXIgbF9vZmYsIHJfb2ZmLCBvZmZzZXQ7DQorCXVuc2lnbmVkIGxvbmcgbF9pbmRleDsNCisJ c3RydWN0IG1hcGxlX2Vub2RlICpjaGlsZDsNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKw0KKwl3 cl9tYXMudHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzdC0+b3JpZ19sLT5ub2RlKTsNCisJLyogVGhl IGxlZnQgbm9kZSBpcyBjb25zdW1lZCwgc28gYWRkIHRvIHRoZSBmcmVlIGxpc3QuICovDQorCWxf aW5kZXggPSBtYXN0LT5vcmlnX2wtPmluZGV4Ow0KKwltYXN0LT5vcmlnX2wtPmluZGV4ID0gbWFz dC0+b3JpZ19sLT5sYXN0Ow0KKwltYXNfd3Jfbm9kZV93YWxrKCZ3cl9tYXMpOw0KKwltYXN0LT5v cmlnX2wtPmluZGV4ID0gbF9pbmRleDsNCisJbF9vZmYgPSBtYXN0LT5vcmlnX2wtPm9mZnNldDsN CisJcl9vZmYgPSBtYXN0LT5vcmlnX3ItPm9mZnNldDsNCisJaWYgKG1hc3QtPm9yaWdfbC0+bm9k ZSA9PSBtYXN0LT5vcmlnX3ItPm5vZGUpIHsNCisJCXNsb3RzID0gbWFfc2xvdHMobXRlX3RvX25v ZGUobWFzdC0+b3JpZ19sLT5ub2RlKSwgd3JfbWFzLnR5cGUpOw0KKwkJZm9yIChvZmZzZXQgPSBs X29mZiArIDE7IG9mZnNldCA8IHJfb2ZmOyBvZmZzZXQrKykNCisJCQltYXRfYWRkKG1hc3QtPmRl c3Ryb3ksIG1hc19zbG90X2xvY2tlZChtYXN0LT5vcmlnX2wsDQorCQkJCQkJCXNsb3RzLCBvZmZz ZXQpKTsNCisNCisJCXJldHVybjsNCisJfQ0KKw0KKwkvKiBtYXN0LT5vcmlnX3IgaXMgZGlmZmVy ZW50IGFuZCBjb25zdW1lZC4gKi8NCisJaWYgKG10ZV9pc19sZWFmKG1hc3QtPm9yaWdfci0+bm9k ZSkpDQorCQlyZXR1cm47DQorDQorCS8qIE5vdyBkZXN0cm95IGxfb2ZmICsgMSAtPiBlbmQgYW5k IDAgLT4gcl9vZmYgLSAxICovDQorCW9mZnNldCA9IGxfb2ZmICsgMTsNCisJc2xvdHMgPSBtYV9z bG90cyhtdGVfdG9fbm9kZShtYXN0LT5vcmlnX2wtPm5vZGUpLCB3cl9tYXMudHlwZSk7DQorCXdo aWxlIChvZmZzZXQgPCBtdF9zbG90c1t3cl9tYXMudHlwZV0pIHsNCisJCWNoaWxkID0gbWFzX3Ns b3RfbG9ja2VkKG1hc3QtPm9yaWdfbCwgc2xvdHMsIG9mZnNldCsrKTsNCisJCWlmICghY2hpbGQp DQorCQkJYnJlYWs7DQorDQorCQltYXRfYWRkKG1hc3QtPmRlc3Ryb3ksIGNoaWxkKTsNCisJfQ0K Kw0KKwlzbG90cyA9IG1hX3Nsb3RzKG10ZV90b19ub2RlKG1hc3QtPm9yaWdfci0+bm9kZSksDQor CQkJICAgICBtdGVfbm9kZV90eXBlKG1hc3QtPm9yaWdfci0+bm9kZSkpOw0KKwlmb3IgKG9mZnNl dCA9IDA7IG9mZnNldCA8IHJfb2ZmOyBvZmZzZXQrKykNCisJCW1hdF9hZGQobWFzdC0+ZGVzdHJv eSwNCisJCQkJbWFzX3Nsb3RfbG9ja2VkKG1hc3QtPm9yaWdfbCwgc2xvdHMsIG9mZnNldCkpOw0K K30NCisNCisvKg0KKyAqIG1hc3RfcmViYWxhbmNlX25leHQoKSAtIFJlYmFsYW5jZSBhZ2FpbnN0 IHRoZSBuZXh0IG5vZGUNCisgKiBAbWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKiBA b2xkX3I6IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUgdG8gdGhlIHJpZ2h0IChuZXh0IG5vZGUpLg0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXN0X3JlYmFsYW5jZV9uZXh0KHN0cnVjdCBtYXBs ZV9zdWJ0cmVlX3N0YXRlICptYXN0LA0KKwkJCQkgICAgICAgc3RydWN0IG1hcGxlX2Vub2RlICpv bGRfciwgYm9vbCBmcmVlKQ0KK3sNCisJdW5zaWduZWQgY2hhciBiX2VuZCA9IG1hc3QtPmJuLT5i X2VuZDsNCisNCisJbWFzX21hYl9jcChtYXN0LT5vcmlnX3IsIDAsIG10X3Nsb3RfY291bnQobWFz dC0+b3JpZ19yLT5ub2RlKSwNCisJCSAgIG1hc3QtPmJuLCBiX2VuZCk7DQorCWlmIChmcmVlKQ0K KwkJbWF0X2FkZChtYXN0LT5mcmVlLCBvbGRfcik7DQorDQorCW1hc3QtPm9yaWdfci0+bGFzdCA9 IG1hc3QtPm9yaWdfci0+bWF4Ow0KKwlpZiAob2xkX3IgPT0gbWFzdC0+b3JpZ19sLT5ub2RlKQ0K KwkJbWFzdC0+b3JpZ19sLT5ub2RlID0gbWFzdC0+b3JpZ19yLT5ub2RlOw0KK30NCisNCisvKg0K KyAqIG1hc3RfcmViYWxhY2VfcHJldigpIC0gUmViYWxhbmNlIGFnYWluc3QgdGhlIHByZXZpb3Vz IG5vZGUNCisgKiBAbWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKiBAb2xkX2w6IFRo ZSBlbmNvZGVkIG1hcGxlIG5vZGUgdG8gdGhlIGxlZnQgKHByZXZpb3VzIG5vZGUpDQorICovDQor c3RhdGljIGlubGluZSB2b2lkIG1hc3RfcmViYWxhbmNlX3ByZXYoc3RydWN0IG1hcGxlX3N1YnRy ZWVfc3RhdGUgKm1hc3QsDQorCQkJCSAgICAgICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm9sZF9sKQ0K K3sNCisJdW5zaWduZWQgY2hhciBlbmQgPSBtYXNfZGF0YV9lbmQobWFzdC0+b3JpZ19sKSArIDE7 DQorCXVuc2lnbmVkIGNoYXIgYl9lbmQgPSBtYXN0LT5ibi0+Yl9lbmQ7DQorDQorCW1hYl9zaGlm dF9yaWdodChtYXN0LT5ibiwgZW5kKTsNCisJbWFzX21hYl9jcChtYXN0LT5vcmlnX2wsIDAsIGVu ZCAtIDEsIG1hc3QtPmJuLCAwKTsNCisJbWF0X2FkZChtYXN0LT5mcmVlLCBvbGRfbCk7DQorCWlm IChtYXN0LT5vcmlnX3ItPm5vZGUgPT0gb2xkX2wpDQorCQltYXN0LT5vcmlnX3ItPm5vZGUgPSBt YXN0LT5vcmlnX2wtPm5vZGU7DQorCW1hc3QtPmwtPm1pbiA9IG1hc3QtPm9yaWdfbC0+bWluOw0K KwltYXN0LT5vcmlnX2wtPmluZGV4ID0gbWFzdC0+b3JpZ19sLT5taW47DQorCW1hc3QtPmJuLT5i X2VuZCA9IGVuZCArIGJfZW5kOw0KKwltYXN0LT5sLT5vZmZzZXQgKz0gZW5kOw0KK30NCisNCisv Kg0KKyAqIG1hc3Rfc2libGluZ19yZWJhbGFuY2VfcmlnaHQoKSAtIFJlYmFsYW5jZSBmcm9tIG5v ZGVzIHdpdGggdGhlIHNhbWUgcGFyZW50cy4NCisgKiBDaGVjayB0aGUgcmlnaHQgc2lkZSwgdGhl biB0aGUgbGVmdC4gIERhdGEgaXMgY29waWVkIGludG8gdGhlIEBtYXN0LT5ibi4NCisgKiBAbWFz dDogVGhlIG1hcGxlX3N1YnRyZWVfc3RhdGUuDQorICovDQorc3RhdGljIGlubGluZQ0KK2Jvb2wg bWFzdF9zaWJsaW5nX3JlYmFsYW5jZV9yaWdodChzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAq bWFzdCwgYm9vbCBmcmVlKQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vub2RlICpvbGRfcjsNCisJc3Ry dWN0IG1hcGxlX2Vub2RlICpvbGRfbDsNCisNCisJb2xkX3IgPSBtYXN0LT5vcmlnX3ItPm5vZGU7 DQorCWlmIChtYXNfbmV4dF9zaWJsaW5nKG1hc3QtPm9yaWdfcikpIHsNCisJCW1hc3RfcmViYWxh bmNlX25leHQobWFzdCwgb2xkX3IsIGZyZWUpOw0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJ b2xkX2wgPSBtYXN0LT5vcmlnX2wtPm5vZGU7DQorCWlmIChtYXNfcHJldl9zaWJsaW5nKG1hc3Qt Pm9yaWdfbCkpIHsNCisJCW1hc3RfcmViYWxhbmNlX3ByZXYobWFzdCwgb2xkX2wpOw0KKwkJcmV0 dXJuIHRydWU7DQorCX0NCisNCisJcmV0dXJuIGZhbHNlOw0KK30NCisNCitzdGF0aWMgaW5saW5l IGludCBtYXNfcHJldl9ub2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1p bik7DQorc3RhdGljIGlubGluZSBpbnQgbWFzX25leHRfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1h cywgc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsDQorCQkJCXVuc2lnbmVkIGxvbmcgbWF4KTsNCisv Kg0KKyAqIG1hc3RfY291c2luX3JlYmFsYW5jZV9yaWdodCgpIC0gUmViYWxhbmNlIGZyb20gbm9k ZXMgd2l0aCBkaWZmZXJlbnQgcGFyZW50cy4NCisgKiBDaGVjayB0aGUgcmlnaHQgc2lkZSwgdGhl biB0aGUgbGVmdC4gIERhdGEgaXMgY29waWVkIGludG8gdGhlIEBtYXN0LT5ibi4NCisgKiBAbWFz dDogVGhlIG1hcGxlX3N1YnRyZWVfc3RhdGUuDQorICovDQorc3RhdGljIGlubGluZQ0KK2Jvb2wg bWFzdF9jb3VzaW5fcmViYWxhbmNlX3JpZ2h0KHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICpt YXN0LCBib29sIGZyZWUpDQorew0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm9sZF9sID0gbWFzdC0+ b3JpZ19sLT5ub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm9sZF9yID0gbWFzdC0+b3JpZ19y LT5ub2RlOw0KKw0KKwlNQV9TVEFURSh0bXAsIG1hc3QtPm9yaWdfci0+dHJlZSwgbWFzdC0+b3Jp Z19yLT5pbmRleCwgbWFzdC0+b3JpZ19yLT5sYXN0KTsNCisNCisJdG1wID0gKm1hc3QtPm9yaWdf cjsNCisJbWFzX25leHRfbm9kZShtYXN0LT5vcmlnX3IsIG1hc19tbihtYXN0LT5vcmlnX3IpLCBV TE9OR19NQVgpOw0KKwlpZiAoIW1hc19pc19ub25lKG1hc3QtPm9yaWdfcikpIHsNCisJCW1hc3Rf cmViYWxhbmNlX25leHQobWFzdCwgb2xkX3IsIGZyZWUpOw0KKwkJcmV0dXJuIHRydWU7DQorCX0N CisNCisJKm1hc3QtPm9yaWdfciA9ICptYXN0LT5vcmlnX2w7DQorCSptYXN0LT5yID0gKm1hc3Qt Pmw7DQorCW1hc19wcmV2X25vZGUobWFzdC0+b3JpZ19sLCAwKTsNCisJaWYgKG1hc19pc19ub25l KG1hc3QtPm9yaWdfbCkpIHsNCisJCS8qIE1ha2luZyBhIG5ldyByb290IHdpdGggdGhlIGNvbnRl bnRzIG9mIG1hc3QtPmJuICovDQorCQkqbWFzdC0+b3JpZ19sID0gKm1hc3QtPm9yaWdfcjsNCisJ CSptYXN0LT5vcmlnX3IgPSB0bXA7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJbWFzdC0+ b3JpZ19sLT5vZmZzZXQgPSAwOw0KKwltYXN0X3JlYmFsYW5jZV9wcmV2KG1hc3QsIG9sZF9sKTsN CisJcmV0dXJuIHRydWU7DQorfQ0KKw0KKy8qDQorICogbWFzdF9hc2NlbmRfZnJlZSgpIC0gQWRk IGN1cnJlbnQgb3JpZ2luYWwgbWFwbGUgc3RhdGUgbm9kZXMgdG8gdGhlIGZyZWUgbGlzdA0KKyAq IGFuZCBhc2NlbmQuDQorICogQG1hc3Q6IHRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlLg0KKyAqDQor ICogQXNjZW5kIHRoZSBvcmlnaW5hbCBsZWZ0IGFuZCByaWdodCBzaWRlcyBhbmQgYWRkIHRoZSBw cmV2aW91cyBub2RlcyB0byB0aGUNCisgKiBmcmVlIGxpc3QuICBTZXQgdGhlIHNsb3RzIHRvIHBv aW50IHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uIGluIHRoZSBuZXcgbm9kZXMuDQorICovDQorc3Rh dGljIGlubGluZSB2b2lkDQorbWFzdF9hc2NlbmRfZnJlZShzdHJ1Y3QgbWFwbGVfc3VidHJlZV9z dGF0ZSAqbWFzdCkNCit7DQorCU1BX1dSX1NUQVRFKHdyX21hcywgbWFzdC0+b3JpZ19yLCAgTlVM TCk7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbGVmdCA9IG1hc3QtPm9yaWdfbC0+bm9kZTsNCisJ c3RydWN0IG1hcGxlX2Vub2RlICpyaWdodCA9IG1hc3QtPm9yaWdfci0+bm9kZTsNCisNCisJbWFz X2FzY2VuZChtYXN0LT5vcmlnX2wpOw0KKwltYXNfYXNjZW5kKG1hc3QtPm9yaWdfcik7DQorCW1h dF9hZGQobWFzdC0+ZnJlZSwgbGVmdCk7DQorDQorCWlmIChsZWZ0ICE9IHJpZ2h0KQ0KKwkJbWF0 X2FkZChtYXN0LT5mcmVlLCByaWdodCk7DQorDQorCW1hc3QtPm9yaWdfci0+b2Zmc2V0ID0gMDsN CisJbWFzdC0+b3JpZ19yLT5pbmRleCA9IG1hc3QtPnItPm1heDsNCisJLyogbGFzdCBzaG91bGQg YmUgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gaW5kZXggKi8NCisJaWYgKG1hc3QtPm9yaWdfci0+ bGFzdCA8IG1hc3QtPm9yaWdfci0+aW5kZXgpDQorCQltYXN0LT5vcmlnX3ItPmxhc3QgPSBtYXN0 LT5vcmlnX3ItPmluZGV4Ow0KKwkvKg0KKwkgKiBUaGUgbm9kZSBtYXkgbm90IGNvbnRhaW4gdGhl IHZhbHVlIHNvIHNldCBzbG90IHRvIGVuc3VyZSBhbGwNCisJICogb2YgdGhlIG5vZGVzIGNvbnRl bnRzIGFyZSBmcmVlZCBvciBkZXN0cm95ZWQuDQorCSAqLw0KKwlpZiAobWFzdC0+b3JpZ19yLT5t YXggPCBtYXN0LT5vcmlnX3ItPmxhc3QpDQorCQltYXN0LT5vcmlnX3ItPm9mZnNldCA9IG1hc19k YXRhX2VuZChtYXN0LT5vcmlnX3IpICsgMTsNCisJZWxzZSB7DQorCQl3cl9tYXMudHlwZSA9IG10 ZV9ub2RlX3R5cGUobWFzdC0+b3JpZ19yLT5ub2RlKTsNCisJCW1hc193cl9ub2RlX3dhbGsoJndy X21hcyk7DQorCX0NCisJLyogU2V0IHVwIHRoZSBsZWZ0IHNpZGUgb2YgdGhpbmdzICovDQorCW1h c3QtPm9yaWdfbC0+b2Zmc2V0ID0gMDsNCisJbWFzdC0+b3JpZ19sLT5pbmRleCA9IG1hc3QtPmwt Pm1pbjsNCisJd3JfbWFzLm1hcyA9IG1hc3QtPm9yaWdfbDsNCisJd3JfbWFzLnR5cGUgPSBtdGVf bm9kZV90eXBlKG1hc3QtPm9yaWdfbC0+bm9kZSk7DQorCW1hc193cl9ub2RlX3dhbGsoJndyX21h cyk7DQorfQ0KKw0KKy8qDQorICogbWFzX25ld19tYV9ub2RlKCkgLSBDcmVhdGUgYW5kIHJldHVy biBhIG5ldyBtYXBsZSBub2RlLiAgSGVscGVyIGZ1bmN0aW9uLg0KKyAqIEBtYXM6IHRoZSBtYXBs ZSBzdGF0ZSB3aXRoIHRoZSBhbGxvY2F0aW9ucy4NCisgKiBAYl9ub2RlOiB0aGUgbWFwbGVfYmln X25vZGUgd2l0aCB0aGUgdHlwZSBlbmNvZGluZy4NCisgKg0KKyAqIFVzZSB0aGUgbm9kZSB0eXBl IGZyb20gdGhlIG1hcGxlX2JpZ19ub2RlIHRvIGFsbG9jYXRlIGEgbmV3IG5vZGUgZnJvbSB0aGUN CisgKiBtYV9zdGF0ZS4gIFRoaXMgZnVuY3Rpb24gZXhpc3RzIG1haW5seSBmb3IgY29kZSByZWFk YWJpbGl0eS4NCisgKg0KKyAqIFJldHVybjogQSBuZXcgbWFwbGUgZW5jb2RlZCBub2RlDQorICov DQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfZW5vZGUNCisqbWFzX25ld19tYV9ub2RlKHN0 cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgKmJfbm9kZSkNCit7DQor CXJldHVybiBtdF9ta19ub2RlKG1hX21ub2RlX3B0cihtYXNfcG9wX25vZGUobWFzKSksIGJfbm9k ZS0+dHlwZSk7DQorfQ0KKw0KKy8qDQorICogbWFzX21hYl90b19ub2RlKCkgLSBTZXQgdXAgcmln aHQgYW5kIG1pZGRsZSBub2Rlcw0KKyAqDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlIHRoYXQg Y29udGFpbnMgdGhlIGFsbG9jYXRpb25zLg0KKyAqIEBiX25vZGU6IHRoZSBub2RlIHdoaWNoIGNv bnRhaW5zIHRoZSBkYXRhLg0KKyAqIEBsZWZ0OiBUaGUgcG9pbnRlciB3aGljaCB3aWxsIGhhdmUg dGhlIGxlZnQgbm9kZQ0KKyAqIEByaWdodDogVGhlIHBvaW50ZXIgd2hpY2ggbWF5IGhhdmUgdGhl IHJpZ2h0IG5vZGUNCisgKiBAbWlkZGxlOiB0aGUgcG9pbnRlciB3aGljaCBtYXkgaGF2ZSB0aGUg bWlkZGxlIG5vZGUgKHJhcmUpDQorICogQG1pZF9zcGxpdDogdGhlIHNwbGl0IGxvY2F0aW9uIGZv ciB0aGUgbWlkZGxlIG5vZGUNCisgKg0KKyAqIFJldHVybjogdGhlIHNwbGl0IG9mIGxlZnQuDQor ICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG1hc19tYWJfdG9fbm9kZShzdHJ1Y3Qg bWFfc3RhdGUgKm1hcywNCisJCQkJCSAgICBzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgKmJfbm9kZSwN CisJCQkJCSAgICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKipsZWZ0LA0KKwkJCQkJICAgIHN0cnVjdCBt YXBsZV9lbm9kZSAqKnJpZ2h0LA0KKwkJCQkJICAgIHN0cnVjdCBtYXBsZV9lbm9kZSAqKm1pZGRs ZSwNCisJCQkJCSAgICB1bnNpZ25lZCBjaGFyICptaWRfc3BsaXQpDQorew0KKwl1bnNpZ25lZCBj aGFyIHNwbGl0ID0gMDsNCisJdW5zaWduZWQgY2hhciBzbG90X2NvdW50ID0gbXRfc2xvdHNbYl9u b2RlLT50eXBlXTsNCisNCisJKmxlZnQgPSBtYXNfbmV3X21hX25vZGUobWFzLCBiX25vZGUpOw0K KwkqcmlnaHQgPSBOVUxMOw0KKwkqbWlkZGxlID0gTlVMTDsNCisJKm1pZF9zcGxpdCA9IDA7DQor DQorCWlmIChiX25vZGUtPmJfZW5kIDwgc2xvdF9jb3VudCkgew0KKwkJc3BsaXQgPSBiX25vZGUt PmJfZW5kOw0KKwl9IGVsc2Ugew0KKwkJc3BsaXQgPSBtYWJfY2FsY19zcGxpdChtYXMsIGJfbm9k ZSwgbWlkX3NwbGl0KTsNCisJCSpyaWdodCA9IG1hc19uZXdfbWFfbm9kZShtYXMsIGJfbm9kZSk7 DQorCX0NCisNCisJaWYgKCptaWRfc3BsaXQpDQorCQkqbWlkZGxlID0gbWFzX25ld19tYV9ub2Rl KG1hcywgYl9ub2RlKTsNCisNCisJcmV0dXJuIHNwbGl0Ow0KKw0KK30NCisNCisvKg0KKyAqIG1h Yl9zZXRfYl9lbmQoKSAtIEFkZCBlbnRyeSB0byBiX25vZGUgYXQgYl9ub2RlLT5iX2VuZCBhbmQg aW5jcmVtZW50IHRoZSBlbmQNCisgKiBwb2ludGVyLg0KKyAqIEBiX25vZGUgLSB0aGUgYmlnIG5v ZGUgdG8gYWRkIHRoZSBlbnRyeQ0KKyAqIEBtYXMgLSB0aGUgbWFwbGUgc3RhdGUgdG8gZ2V0IHRo ZSBwaXZvdCAobWFzLT5tYXgpDQorICogQGVudHJ5IC0gdGhlIGVudHJ5IHRvIGFkZCwgaWYgTlVM TCBub3RoaW5nIGhhcHBlbnMuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hYl9zZXRfYl9l bmQoc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUsDQorCQkJCSBzdHJ1Y3QgbWFfc3RhdGUg Km1hcywNCisJCQkJIHZvaWQgKmVudHJ5KQ0KK3sNCisJaWYgKCFlbnRyeSkNCisJCXJldHVybjsN CisNCisJYl9ub2RlLT5zbG90W2Jfbm9kZS0+Yl9lbmRdID0gZW50cnk7DQorCWlmIChtdF9pc19h bGxvYyhtYXMtPnRyZWUpKQ0KKwkJYl9ub2RlLT5nYXBbYl9ub2RlLT5iX2VuZF0gPSBtYXNfbWF4 X2dhcChtYXMpOw0KKwliX25vZGUtPnBpdm90W2Jfbm9kZS0+Yl9lbmQrK10gPSBtYXMtPm1heDsN Cit9DQorDQorLyoNCisgKiBtYXNfc2V0X3NwbGl0X3BhcmVudCgpIC0gY29tYmluZV90aGVuX3Nl cGFyYXRlIGhlbHBlciBmdW5jdGlvbi4gIFNldHMgdGhlIHBhcmVudA0KKyAqIG9mIEBtYXMtPm5v ZGUgdG8gZWl0aGVyIEBsZWZ0IG9yIEByaWdodCwgZGVwZW5kaW5nIG9uIEBzbG90IGFuZCBAc3Bs aXQNCisgKg0KKyAqIEBtYXMgLSB0aGUgbWFwbGUgc3RhdGUgd2l0aCB0aGUgbm9kZSB0aGF0IG5l ZWRzIGEgcGFyZW50DQorICogQGxlZnQgLSBwb3NzaWJsZSBwYXJlbnQgMQ0KKyAqIEByaWdodCAt IHBvc3NpYmxlIHBhcmVudCAyDQorICogQHNsb3QgLSB0aGUgc2xvdCB0aGUgbWFzLT5ub2RlIHdh cyBwbGFjZWQNCisgKiBAc3BsaXQgLSB0aGUgc3BsaXQgbG9jYXRpb24gYmV0d2VlbiBAbGVmdCBh bmQgQHJpZ2h0DQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19zZXRfc3BsaXRfcGFyZW50 KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkJCQkJc3RydWN0IG1hcGxlX2Vub2RlICpsZWZ0LA0K KwkJCQkJc3RydWN0IG1hcGxlX2Vub2RlICpyaWdodCwNCisJCQkJCXVuc2lnbmVkIGNoYXIgKnNs b3QsIHVuc2lnbmVkIGNoYXIgc3BsaXQpDQorew0KKwlpZiAobWFzX2lzX25vbmUobWFzKSkNCisJ CXJldHVybjsNCisNCisJaWYgKCgqc2xvdCkgPD0gc3BsaXQpDQorCQltdGVfc2V0X3BhcmVudCht YXMtPm5vZGUsIGxlZnQsICpzbG90KTsNCisJZWxzZSBpZiAocmlnaHQpDQorCQltdGVfc2V0X3Bh cmVudChtYXMtPm5vZGUsIHJpZ2h0LCAoKnNsb3QpIC0gc3BsaXQgLSAxKTsNCisNCisJKCpzbG90 KSsrOw0KK30NCisNCisvKg0KKyAqIG10ZV9taWRfc3BsaXRfY2hlY2soKSAtIENoZWNrIGlmIHRo ZSBuZXh0IG5vZGUgcGFzc2VzIHRoZSBtaWQtc3BsaXQNCisgKiBAKipsOiBQb2ludGVyIHRvIGxl ZnQgZW5jb2RlZCBtYXBsZSBub2RlLg0KKyAqIEAqKm06IFBvaW50ZXIgdG8gbWlkZGxlIGVuY29k ZWQgbWFwbGUgbm9kZS4NCisgKiBAKipyOiBQb2ludGVyIHRvIHJpZ2h0IGVuY29kZWQgbWFwbGUg bm9kZS4NCisgKiBAc2xvdDogVGhlIG9mZnNldA0KKyAqIEAqc3BsaXQ6IFRoZSBzcGxpdCBsb2Nh dGlvbi4NCisgKiBAbWlkX3NwbGl0OiBUaGUgbWlkZGxlIHNwbGl0Lg0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgdm9pZCBtdGVfbWlkX3NwbGl0X2NoZWNrKHN0cnVjdCBtYXBsZV9lbm9kZSAqKmwsDQor CQkJCSAgICAgICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKipyLA0KKwkJCQkgICAgICAgc3RydWN0IG1h cGxlX2Vub2RlICpyaWdodCwNCisJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgc2xvdCwNCisJCQkJ ICAgICAgIHVuc2lnbmVkIGNoYXIgKnNwbGl0LA0KKwkJCQkgICAgICAgdW5zaWduZWQgY2hhciBt aWRfc3BsaXQpDQorew0KKwlpZiAoKnIgPT0gcmlnaHQpDQorCQlyZXR1cm47DQorDQorCWlmIChz bG90IDwgbWlkX3NwbGl0KQ0KKwkJcmV0dXJuOw0KKw0KKwkqbCA9ICpyOw0KKwkqciA9IHJpZ2h0 Ow0KKwkqc3BsaXQgPSBtaWRfc3BsaXQ7DQorfQ0KKw0KKy8qDQorICogbWFzdF9zZXRfc3BsaXRf cGFyZW50cygpIC0gSGVscGVyIGZ1bmN0aW9uIHRvIHNldCB0aHJlZSBub2RlcyBwYXJlbnRzLiAg U2xvdA0KKyAqIGlzIHRha2VuIGZyb20gQG1hc3QtPmwuDQorICogQG1hc3QgLSB0aGUgbWFwbGUg c3VidHJlZSBzdGF0ZQ0KKyAqIEBsZWZ0IC0gdGhlIGxlZnQgbm9kZQ0KKyAqIEByaWdodCAtIHRo ZSByaWdodCBub2RlDQorICogQHNwbGl0IC0gdGhlIHNwbGl0IGxvY2F0aW9uLg0KKyAqLw0KK3N0 YXRpYyBpbmxpbmUgdm9pZCBtYXN0X3NldF9zcGxpdF9wYXJlbnRzKHN0cnVjdCBtYXBsZV9zdWJ0 cmVlX3N0YXRlICptYXN0LA0KKwkJCQkJICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKmxlZnQsDQorCQkJ CQkgIHN0cnVjdCBtYXBsZV9lbm9kZSAqbWlkZGxlLA0KKwkJCQkJICBzdHJ1Y3QgbWFwbGVfZW5v ZGUgKnJpZ2h0LA0KKwkJCQkJICB1bnNpZ25lZCBjaGFyIHNwbGl0LA0KKwkJCQkJICB1bnNpZ25l ZCBjaGFyIG1pZF9zcGxpdCkNCit7DQorCXVuc2lnbmVkIGNoYXIgc2xvdDsNCisJc3RydWN0IG1h cGxlX2Vub2RlICpsID0gbGVmdDsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpyID0gcmlnaHQ7DQor DQorCWlmIChtYXNfaXNfbm9uZShtYXN0LT5sKSkNCisJCXJldHVybjsNCisNCisJaWYgKG1pZGRs ZSkNCisJCXIgPSBtaWRkbGU7DQorDQorCXNsb3QgPSBtYXN0LT5sLT5vZmZzZXQ7DQorDQorCW10 ZV9taWRfc3BsaXRfY2hlY2soJmwsICZyLCByaWdodCwgc2xvdCwgJnNwbGl0LCBtaWRfc3BsaXQp Ow0KKwltYXNfc2V0X3NwbGl0X3BhcmVudChtYXN0LT5sLCBsLCByLCAmc2xvdCwgc3BsaXQpOw0K Kw0KKwltdGVfbWlkX3NwbGl0X2NoZWNrKCZsLCAmciwgcmlnaHQsIHNsb3QsICZzcGxpdCwgbWlk X3NwbGl0KTsNCisJbWFzX3NldF9zcGxpdF9wYXJlbnQobWFzdC0+bSwgbCwgciwgJnNsb3QsIHNw bGl0KTsNCisNCisJbXRlX21pZF9zcGxpdF9jaGVjaygmbCwgJnIsIHJpZ2h0LCBzbG90LCAmc3Bs aXQsIG1pZF9zcGxpdCk7DQorCW1hc19zZXRfc3BsaXRfcGFyZW50KG1hc3QtPnIsIGwsIHIsICZz bG90LCBzcGxpdCk7DQorfQ0KKw0KKy8qDQorICogbWFzX3dtYl9yZXBsYWNlKCkgLSBXcml0ZSBt ZW1vcnkgYmFycmllciBhbmQgcmVwbGFjZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAq IEBmcmVlOiB0aGUgbWFwbGUgdG9waWFyeSBsaXN0IG9mIG5vZGVzIHRvIGZyZWUNCisgKiBAZGVz dHJveTogVGhlIG1hcGxlIHRvcGlhcnkgbGlzdCBvZiBub2RlcyB0byBkZXN0cm95ICh3YWxrIGFu ZCBmcmVlKQ0KKyAqDQorICogVXBkYXRlcyBnYXAgYXMgbmVjZXNzYXJ5Lg0KKyAqLw0KK3N0YXRp YyBpbmxpbmUgdm9pZCBtYXNfd21iX3JlcGxhY2Uoc3RydWN0IG1hX3N0YXRlICptYXMsDQorCQkJ CSAgIHN0cnVjdCBtYV90b3BpYXJ5ICpmcmVlLA0KKwkJCQkgICBzdHJ1Y3QgbWFfdG9waWFyeSAq ZGVzdHJveSkNCit7DQorCS8qIEFsbCBub2RlcyBtdXN0IHNlZSBvbGQgZGF0YSBhcyBkZWFkIHBy aW9yIHRvIHJlcGxhY2luZyB0aGF0IGRhdGEgKi8NCisJc21wX3dtYigpOw0KKw0KKwkvKiBJbnNl cnQgdGhlIG5ldyBkYXRhIGluIHRoZSB0cmVlICovDQorCW1hc19yZXBsYWNlKG1hcywgdHJ1ZSk7 DQorDQorCWlmICghbXRlX2lzX2xlYWYobWFzLT5ub2RlKSkNCisJCW1hc19kZXNjZW5kX2Fkb3B0 KG1hcyk7DQorDQorCW1hc19tYXRfZnJlZShtYXMsIGZyZWUpOw0KKw0KKwlpZiAoZGVzdHJveSkN CisJCW1hc19tYXRfZGVzdHJveShtYXMsIGRlc3Ryb3kpOw0KKw0KKwlpZiAobXRlX2lzX2xlYWYo bWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJbWFzX3VwZGF0ZV9nYXAobWFzKTsNCit9DQor DQorLyoNCisgKiBtYXN0X25ld19yb290KCkgLSBTZXQgYSBuZXcgdHJlZSByb290IGR1cmluZyBz dWJ0cmVlIGNyZWF0aW9uDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICog QG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF9u ZXdfcm9vdChzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwNCisJCQkJIHN0cnVjdCBt YV9zdGF0ZSAqbWFzKQ0KK3sNCisJbWFzX21uKG1hc3QtPmwpLT5wYXJlbnQgPQ0KKwkJbWFfcGFy ZW50X3B0cigoKHVuc2lnbmVkIGxvbmcpbWFzLT50cmVlIHwgTUFfUk9PVF9QQVJFTlQpKTsNCisJ aWYgKCFtdGVfZGVhZF9ub2RlKG1hc3QtPm9yaWdfbC0+bm9kZSkgJiYNCisJICAgICFtdGVfaXNf cm9vdChtYXN0LT5vcmlnX2wtPm5vZGUpKSB7DQorCQlkbyB7DQorCQkJbWFzdF9hc2NlbmRfZnJl ZShtYXN0KTsNCisJCQltYXN0X3RvcGlhcnkobWFzdCk7DQorCQl9IHdoaWxlICghbXRlX2lzX3Jv b3QobWFzdC0+b3JpZ19sLT5ub2RlKSk7DQorCX0NCisJaWYgKChtYXN0LT5vcmlnX2wtPm5vZGUg IT0gbWFzLT5ub2RlKSAmJg0KKwkJICAgKG1hc3QtPmwtPmRlcHRoID4gbWFzX210X2hlaWdodCht YXMpKSkgew0KKwkJbWF0X2FkZChtYXN0LT5mcmVlLCBtYXMtPm5vZGUpOw0KKwl9DQorfQ0KKw0K Ky8qDQorICogbWFzdF9jcF90b19ub2RlcygpIC0gQ29weSBkYXRhIG91dCB0byBub2Rlcy4NCisg KiBAbWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKiBAbGVmdDogVGhlIGxlZnQgZW5j b2RlZCBtYXBsZSBub2RlDQorICogQG1pZGRsZTogVGhlIG1pZGRsZSBlbmNvZGVkIG1hcGxlIG5v ZGUNCisgKiBAcmlnaHQ6IFRoZSByaWdodCBlbmNvZGVkIG1hcGxlIG5vZGUNCisgKiBAc3BsaXQ6 IFRoZSBsb2NhdGlvbiB0byBzcGxpdCBiZXR3ZWVuIGxlZnQgYW5kIChtaWRkbGUgPyBtaWRkbGUg OiByaWdodCkNCisgKiBAbWlkX3NwbGl0OiBUaGUgbG9jYXRpb24gdG8gc3BsaXQgYmV0d2VlbiBt aWRkbGUgYW5kIHJpZ2h0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXN0X2NwX3RvX25v ZGVzKHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0LA0KKwlzdHJ1Y3QgbWFwbGVfZW5v ZGUgKmxlZnQsIHN0cnVjdCBtYXBsZV9lbm9kZSAqbWlkZGxlLA0KKwlzdHJ1Y3QgbWFwbGVfZW5v ZGUgKnJpZ2h0LCB1bnNpZ25lZCBjaGFyIHNwbGl0LCB1bnNpZ25lZCBjaGFyIG1pZF9zcGxpdCkN Cit7DQorCW1hc3QtPmwtPm5vZGUgPSBtdGVfbm9kZV9vcl9ub25lKGxlZnQpOw0KKwltYXN0LT5t LT5ub2RlID0gbXRlX25vZGVfb3Jfbm9uZShtaWRkbGUpOw0KKwltYXN0LT5yLT5ub2RlID0gbXRl X25vZGVfb3Jfbm9uZShyaWdodCk7DQorDQorCW1hc3QtPmwtPm1pbiA9IG1hc3QtPm9yaWdfbC0+ bWluOw0KKwltYXN0LT5sLT5tYXggPSBtYXN0LT5ibi0+cGl2b3Rbc3BsaXRdOw0KKwltYWJfbWFz X2NwKG1hc3QtPmJuLCAwLCBzcGxpdCwgbWFzdC0+bCwgdHJ1ZSk7DQorCW1hc3QtPnItPm1heCA9 IG1hc3QtPmwtPm1heDsNCisNCisJaWYgKG1pZGRsZSkgew0KKwkJbWFiX21hc19jcChtYXN0LT5i biwgMSArIHNwbGl0LCBtaWRfc3BsaXQsIG1hc3QtPm0sIHRydWUpOw0KKwkJbWFzdC0+bS0+bWlu ID0gbWFzdC0+Ym4tPnBpdm90W3NwbGl0XSArIDE7DQorCQltYXN0LT5tLT5tYXggPSBtYXN0LT5i bi0+cGl2b3RbbWlkX3NwbGl0XTsNCisJCXNwbGl0ID0gbWlkX3NwbGl0Ow0KKwl9DQorDQorCWlm IChyaWdodCkgew0KKwkJbWFiX21hc19jcChtYXN0LT5ibiwgMSArIHNwbGl0LCBtYXN0LT5ibi0+ Yl9lbmQsIG1hc3QtPnIsIHRydWUpOw0KKwkJbWFzdC0+ci0+bWluID0gbWFzdC0+Ym4tPnBpdm90 W3NwbGl0XSArIDE7DQorCQltYXN0LT5yLT5tYXggPSBtYXN0LT5ibi0+cGl2b3RbbWFzdC0+Ym4t PmJfZW5kXTsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc3RfY29tYmluZV9jcF9sZWZ0IC0gQ29w eSBpbiB0aGUgb3JpZ2luYWwgbGVmdCBzaWRlIG9mIHRoZSB0cmVlIGludG8gdGhlDQorICogY29t YmluZWQgZGF0YSBzZXQgaW4gdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUgYmlnIG5vZGUuDQorICog QG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICovDQorc3RhdGljIGlubGluZSB2b2lk IG1hc3RfY29tYmluZV9jcF9sZWZ0KHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0KQ0K K3sNCisJdW5zaWduZWQgY2hhciBsX3Nsb3QgPSBtYXN0LT5vcmlnX2wtPm9mZnNldDsNCisNCisJ aWYgKCFsX3Nsb3QpDQorCQlyZXR1cm47DQorDQorCW1hc19tYWJfY3AobWFzdC0+b3JpZ19sLCAw LCBsX3Nsb3QgLSAxLCBtYXN0LT5ibiwgMCk7DQorfQ0KKw0KKy8qDQorICogbWFzdF9jb21iaW5l X2NwX3JpZ2h0OiBDb3B5IGluIHRoZSBvcmlnaW5hbCByaWdodCBzaWRlIG9mIHRoZSB0cmVlIGlu dG8gdGhlDQorICogY29tYmluZWQgZGF0YSBzZXQgaW4gdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUg YmlnIG5vZGUuDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICovDQorc3Rh dGljIGlubGluZSB2b2lkIG1hc3RfY29tYmluZV9jcF9yaWdodChzdHJ1Y3QgbWFwbGVfc3VidHJl ZV9zdGF0ZSAqbWFzdCkNCit7DQorCWlmIChtYXN0LT5ibi0+cGl2b3RbbWFzdC0+Ym4tPmJfZW5k IC0gMV0gPj0gbWFzdC0+b3JpZ19yLT5tYXgpDQorCQlyZXR1cm47DQorDQorCW1hc19tYWJfY3Ao bWFzdC0+b3JpZ19yLCBtYXN0LT5vcmlnX3ItPm9mZnNldCArIDEsDQorCQkgICBtdF9zbG90X2Nv dW50KG1hc3QtPm9yaWdfci0+bm9kZSksIG1hc3QtPmJuLA0KKwkJICAgbWFzdC0+Ym4tPmJfZW5k KTsNCisJbWFzdC0+b3JpZ19yLT5sYXN0ID0gbWFzdC0+b3JpZ19yLT5tYXg7DQorfQ0KKw0KKy8q DQorICogbWFzdF9zdWZmaWNpZW50OiBDaGVjayBpZiB0aGUgbWFwbGUgc3VidHJlZSBzdGF0ZSBo YXMgZW5vdWdoIGRhdGEgaW4gdGhlIGJpZw0KKyAqIG5vZGUgdG8gY3JlYXRlIGF0IGxlYXN0IG9u ZSBzdWZmaWNpZW50IG5vZGUNCisgKiBAbWFzdDogdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisg Ki8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzdF9zdWZmaWNpZW50KHN0cnVjdCBtYXBsZV9zdWJ0 cmVlX3N0YXRlICptYXN0KQ0KK3sNCisJaWYgKG1hc3QtPmJuLT5iX2VuZCA+IG10X21pbl9zbG90 X2NvdW50KG1hc3QtPm9yaWdfbC0+bm9kZSkpDQorCQlyZXR1cm4gdHJ1ZTsNCisNCisJcmV0dXJu IGZhbHNlOw0KK30NCisNCisvKg0KKyAqIG1hc3Rfb3ZlcmZsb3c6IENoZWNrIGlmIHRoZXJlIGlz IHRvbyBtdWNoIGRhdGEgaW4gdGhlIHN1YnRyZWUgc3RhdGUgZm9yIGENCisgKiBzaW5nbGUgbm9k ZS4NCisgKiBAbWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKi8NCitzdGF0aWMgaW5s aW5lIGJvb2wgbWFzdF9vdmVyZmxvdyhzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCkN Cit7DQorCWlmIChtYXN0LT5ibi0+Yl9lbmQgPj0gbXRfc2xvdF9jb3VudChtYXN0LT5vcmlnX2wt Pm5vZGUpKQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCXJldHVybiBmYWxzZTsNCit9DQorDQorLyoN CisgKiBtYXN0X3NldHVwX2Jub2RlX2Zvcl9zcGxpdCgpIC0gUHJlcGFyZSB0aGUgc3VidHJlZSBz dGF0ZSBiaWcgbm9kZSBmb3INCisgKiBzcGxpdHRpbmcNCisgKiBAbWFzdDogVGhlIG1hcGxlIHN1 YnRyZWUgc3RhdGUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF9zZXR1cF9ibm9kZV9m b3Jfc3BsaXQoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QpDQorew0KKwltYXN0LT5i bi0+Yl9lbmQtLTsNCisJbWFzdC0+Ym4tPm1pbiA9IG1hc3QtPm9yaWdfbC0+bWluOw0KKwltYXN0 LT5ibi0+dHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzdC0+b3JpZ19sLT5ub2RlKTsNCit9DQorDQor c3RhdGljIGlubGluZSB2b2lkICptdHJlZV9yYW5nZV93YWxrKHN0cnVjdCBtYV9zdGF0ZSAqbWFz KQ0KK3sNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsN CisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbmV4dCwg Kmxhc3Q7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQor CXVuc2lnbmVkIGNoYXIgZW5kOw0KKwl1bnNpZ25lZCBsb25nIG1heCwgbWluOw0KKwl1bnNpZ25l ZCBsb25nIHByZXZfbWF4LCBwcmV2X21pbjsNCisNCisJbGFzdCA9IG5leHQgPSBtYXMtPm5vZGU7 DQorCXByZXZfbWluID0gbWluID0gbWFzLT5taW47DQorCW1heCA9IG1hcy0+bWF4Ow0KKwlkbyB7 DQorCQlvZmZzZXQgPSAwOw0KKwkJbGFzdCA9IG5leHQ7DQorCQlub2RlID0gbXRlX3RvX25vZGUo bmV4dCk7DQorCQl0eXBlID0gbXRlX25vZGVfdHlwZShuZXh0KTsNCisJCXBpdm90cyA9IG1hX3Bp dm90cyhub2RlLCB0eXBlKTsNCisJCWVuZCA9IG1hX2RhdGFfZW5kKG5vZGUsIHR5cGUsIHBpdm90 cywgbWF4KTsNCisJCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUobm9kZSkpKQ0KKwkJCWdvdG8g ZGVhZF9ub2RlOw0KKw0KKwkJaWYgKHBpdm90c1tvZmZzZXRdID49IG1hcy0+aW5kZXgpIHsNCisJ CQlwcmV2X21heCA9IG1heDsNCisJCQlwcmV2X21pbiA9IG1pbjsNCisJCQltYXggPSBwaXZvdHNb b2Zmc2V0XTsNCisJCQlnb3RvIG5leHQ7DQorCQl9DQorDQorCQlkbyB7DQorCQkJb2Zmc2V0Kys7 DQorCQl9IHdoaWxlKChvZmZzZXQgPCBlbmQpICYmIChwaXZvdHNbb2Zmc2V0XSA8IG1hcy0+aW5k ZXgpKTsNCisNCisJCXByZXZfbWluID0gbWluOw0KKwkJcHJldl9tYXggPSBtYXg7DQorCQlpZiAo b2Zmc2V0IDwgbXRfcGl2b3RzW3R5cGVdICYmIHBpdm90c1tvZmZzZXRdKQ0KKwkJCW1heCA9IHBp dm90c1tvZmZzZXRdOw0KKw0KKwkJaWYgKG9mZnNldCkNCisJCQltaW4gPSBwaXZvdHNbb2Zmc2V0 IC0gMV0gKyAxOw0KKw0KKwkJaWYgKGxpa2VseShvZmZzZXQgPiBlbmQpICYmIHBpdm90c1tvZmZz ZXRdKSB7DQorbmV4dDoNCisJCQltYXggPSBwaXZvdHNbb2Zmc2V0XTsNCisJCX0NCisNCisJCXNs b3RzID0gbWFfc2xvdHMobm9kZSwgdHlwZSk7DQorCQluZXh0ID0gbXRfc2xvdChtYXMtPnRyZWUs IHNsb3RzLCBvZmZzZXQpOw0KKwkJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQor CQkJZ290byBkZWFkX25vZGU7DQorCX0gd2hpbGUgKCFtYV9pc19sZWFmKHR5cGUpKTsNCisNCisJ bWFzLT5vZmZzZXQgPSBvZmZzZXQ7DQorCW1hcy0+aW5kZXggPSBtaW47DQorCW1hcy0+bGFzdCA9 IG1heDsNCisJbWFzLT5taW4gPSBwcmV2X21pbjsNCisJbWFzLT5tYXggPSBwcmV2X21heDsNCisJ bWFzLT5ub2RlID0gbGFzdDsNCisJcmV0dXJuICh2b2lkICopIG5leHQ7DQorDQorZGVhZF9ub2Rl Og0KKwltYXNfcmVzZXQobWFzKTsNCisJcmV0dXJuIE5VTEw7DQorfQ0KKw0KKy8qDQorICogbWFz X3NwYW5uaW5nX3JlYmFsYW5jZSgpIC0gUmViYWxhbmNlIGFjcm9zcyB0d28gbm9kZXMgd2hpY2gg bWF5IG5vdCBiZSBwZWVycy4NCisgKiBAbWFzOiBUaGUgc3RhcnRpbmcgbWFwbGUgc3RhdGUNCisg KiBAbWFzdDogVGhlIG1hcGxlX3N1YnRyZWVfc3RhdGUsIGtlZXBzIHRyYWNrIG9mIDQgbWFwbGUg c3RhdGVzLg0KKyAqIEBjb3VudDogVGhlIGVzdGltYXRlZCBjb3VudCBvZiBpdGVyYXRpb25zIG5l ZWRlZC4NCisgKg0KKyAqIEZvbGxvdyB0aGUgdHJlZSB1cHdhcmRzIGZyb20gQGxfbWFzIGFuZCBA cl9tYXMgZm9yIEBjb3VudCwgb3IgdW50aWwgdGhlIHJvb3QNCisgKiBpcyBoaXQuICBGaXJzdCBA Yl9ub2RlIGlzIHNwbGl0IGludG8gdHdvIGVudHJpZXMgd2hpY2ggYXJlIGluc2VydGVkIGludG8g dGhlDQorICogbmV4dCBpdGVyYXRpb24gb2YgdGhlIGxvb3AuICBAYl9ub2RlIGlzIHJldHVybmVk IHBvcHVsYXRlZCB3aXRoIHRoZSBmaW5hbA0KKyAqIGl0ZXJhdGlvbi4gQG1hcyBpcyB1c2VkIHRv IG9idGFpbiBhbGxvY2F0aW9ucy4gIG9yaWdfbF9tYXMga2VlcHMgdHJhY2sgb2YgdGhlDQorICog bm9kZXMgdGhhdCB3aWxsIHJlbWFpbiBhY3RpdmUgYnkgdXNpbmcgb3JpZ19sX21hcy0+aW5kZXgg YW5kIG9yaWdfbF9tYXMtPmxhc3QNCisgKiB0byBhY2NvdW50IG9mIHdoYXQgaGFzIGJlZW4gY29w aWVkIGludG8gdGhlIG5ldyBzdWItdHJlZS4gIFRoZSB1cGRhdGUgb2YNCisgKiBvcmlnX2xfbWFz LT5sYXN0IGlzIHVzZWQgaW4gbWFzX2NvbnN1bWUgdG8gZmluZCB0aGUgc2xvdHMgdGhhdCB3aWxs IG5lZWQgdG8NCisgKiBiZSBlaXRoZXIgZnJlZWQgb3IgZGVzdHJveWVkLiAgb3JpZ19sX21hcy0+ ZGVwdGgga2VlcHMgdHJhY2sgb2YgdGhlIGhlaWdodCBvZg0KKyAqIHRoZSBuZXcgc3ViLXRyZWUg aW4gY2FzZSB0aGUgc3ViLXRyZWUgYmVjb21lcyB0aGUgZnVsbCB0cmVlLg0KKyAqDQorICogUmV0 dXJuOiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGJfbm9kZSBkdXJpbmcgdGhlIGxhc3QgbG9v cC4NCisgKi8NCitzdGF0aWMgaW50IG1hc19zcGFubmluZ19yZWJhbGFuY2Uoc3RydWN0IG1hX3N0 YXRlICptYXMsDQorCQlzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwgdW5zaWduZWQg Y2hhciBjb3VudCkNCit7DQorCXVuc2lnbmVkIGNoYXIgc3BsaXQsIG1pZF9zcGxpdDsNCisJdW5z aWduZWQgY2hhciBzbG90ID0gMDsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpsZWZ0ID0gTlVMTCwg Km1pZGRsZSA9IE5VTEwsICpyaWdodCA9IE5VTEw7DQorDQorCU1BX1NUQVRFKGxfbWFzLCBtYXMt PnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+aW5kZXgpOw0KKwlNQV9TVEFURShyX21hcywgbWFzLT50 cmVlLCBtYXMtPmluZGV4LCBtYXMtPmluZGV4KTsNCisJTUFfU1RBVEUobV9tYXMsIG1hcy0+dHJl ZSwgbWFzLT5pbmRleCwgbWFzLT5pbmRleCk7DQorCU1BX1RPUElBUlkoZnJlZSwgbWFzLT50cmVl KTsNCisJTUFfVE9QSUFSWShkZXN0cm95LCBtYXMtPnRyZWUpOw0KKw0KKwkvKg0KKwkgKiBUaGUg dHJlZSBuZWVkcyB0byBiZSByZWJhbGFuY2VkIGFuZCBsZWF2ZXMgbmVlZCB0byBiZSBrZXB0IGF0 IHRoZSBzYW1lIGxldmVsLg0KKwkgKiBSZWJhbGFuY2luZyBpcyBkb25lIGJ5IHVzZSBvZiB0aGUg YGBzdHJ1Y3QgbWFwbGVfdG9waWFyeWBgLg0KKwkgKi8NCisJbWFzdC0+bCA9ICZsX21hczsNCisJ bWFzdC0+bSA9ICZtX21hczsNCisJbWFzdC0+ciA9ICZyX21hczsNCisJbWFzdC0+ZnJlZSA9ICZm cmVlOw0KKwltYXN0LT5kZXN0cm95ID0gJmRlc3Ryb3k7DQorCWxfbWFzLm5vZGUgPSByX21hcy5u b2RlID0gbV9tYXMubm9kZSA9IE1BU19OT05FOw0KKwlpZiAoIW1hc19pc19yb290X2xpbWl0cyht YXMpICYmDQorCSAgICB1bmxpa2VseShtYXN0LT5ibi0+Yl9lbmQgPD0gbXRfbWluX3Nsb3RzW21h c3QtPmJuLT50eXBlXSkpIHsNCisJCS8qDQorCQkgKiBEbyBub3QgZnJlZSB0aGUgY3VycmVudCBu b2RlIGFzIGl0IG1heSBiZSBmcmVlZCBpbiBhIGJ1bGsNCisJCSAqIGZyZWUuDQorCQkgKi8NCisJ CWlmICghbWFzdF9zaWJsaW5nX3JlYmFsYW5jZV9yaWdodChtYXN0LCBmYWxzZSkpDQorCQkJbWFz dF9jb3VzaW5fcmViYWxhbmNlX3JpZ2h0KG1hc3QsIGZhbHNlKTsNCisJfQ0KKwltYXN0LT5vcmln X2wtPmRlcHRoID0gMDsNCisNCisJLyoNCisJICogRWFjaCBsZXZlbCBvZiB0aGUgdHJlZSBpcyBl eGFtaW5lZCBhbmQgYmFsYW5jZWQsIHB1c2hpbmcgZGF0YSB0byB0aGUgbGVmdCBvcg0KKwkgKiBy aWdodCwgb3IgcmViYWxhbmNpbmcgYWdhaW5zdCBsZWZ0IG9yIHJpZ2h0IG5vZGVzIGlzIGVtcGxv eWVkIHRvIGF2b2lkDQorCSAqIHJpcHBsaW5nIHVwIHRoZSB0cmVlIHRvIGxpbWl0IHRoZSBhbW91 bnQgb2YgY2h1cm4uICBPbmNlIGEgbmV3IHN1Yi1zZWN0aW9uIG9mDQorCSAqIHRoZSB0cmVlIGlz IGNyZWF0ZWQsIHRoZXJlIG1heSBiZSBhIG1peCBvZiBuZXcgYW5kIG9sZCBub2Rlcy4gIFRoZSBv bGQgbm9kZXMNCisJICogd2lsbCBoYXZlIHRoZSBpbmNvcnJlY3QgcGFyZW50IHBvaW50ZXJzIGFu ZCBjdXJyZW50bHkgYmUgaW4gdHdvIHRyZWVzOiB0aGUNCisJICogb3JpZ2luYWwgdHJlZSBhbmQg dGhlIHBhcnRpYWxseSBuZXcgdHJlZS4gIFRvIHJlbWVkeSB0aGUgcGFyZW50IHBvaW50ZXJzIGlu DQorCSAqIHRoZSBvbGQgdHJlZSwgdGhlIG5ldyBkYXRhIGlzIHN3YXBwZWQgaW50byB0aGUgYWN0 aXZlIHRyZWUgYW5kIGEgd2FsayBkb3duDQorCSAqIHRoZSB0cmVlIGlzIHBlcmZvcm1lZCBhbmQg dGhlIHBhcmVudCBwb2ludGVycyBhcmUgdXBkYXRlZC4NCisJICogU2VlIG1hc19kZXNjZW5kX2Fk b3B0KCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uLg0KKwkgKi8NCisJd2hpbGUgKGNvdW50LS0pIHsN CisJCW1hc3Rfc2V0dXBfYm5vZGVfZm9yX3NwbGl0KG1hc3QpOw0KKwkJc3BsaXQgPSBtYXNfbWFi X3RvX25vZGUobWFzLCBtYXN0LT5ibiwgJmxlZnQsICZyaWdodCwgJm1pZGRsZSwNCisJCQkJCSZt aWRfc3BsaXQpOw0KKwkJbWFzdF9zZXRfc3BsaXRfcGFyZW50cyhtYXN0LCBsZWZ0LCBtaWRkbGUs IHJpZ2h0LCBzcGxpdCwNCisJCQkJICAgICAgIG1pZF9zcGxpdCk7DQorCQltYXN0X2NwX3RvX25v ZGVzKG1hc3QsIGxlZnQsIG1pZGRsZSwgcmlnaHQsIHNwbGl0LCBtaWRfc3BsaXQpOw0KKw0KKwkJ LyoNCisJCSAqIENvcHkgZGF0YSBmcm9tIG5leHQgbGV2ZWwgaW4gdGhlIHRyZWUgdG8gbWFzdC0+ Ym4gZnJvbSBuZXh0DQorCQkgKiBpdGVyYXRpb24NCisJCSAqLw0KKwkJbWVtc2V0KG1hc3QtPmJu LCAwLCBzaXplb2Yoc3RydWN0IG1hcGxlX2JpZ19ub2RlKSk7DQorCQltYXN0LT5ibi0+dHlwZSA9 IG10ZV9ub2RlX3R5cGUobGVmdCk7DQorCQltYXN0LT5vcmlnX2wtPmRlcHRoKys7DQorDQorCQkv KiBSb290IGFscmVhZHkgc3RvcmVkIGluIGwtPm5vZGUuICovDQorCQlpZiAobWFzX2lzX3Jvb3Rf bGltaXRzKG1hc3QtPmwpKQ0KKwkJCWdvdG8gbmV3X3Jvb3Q7DQorDQorCQltYXN0X2FzY2VuZF9m cmVlKG1hc3QpOw0KKwkJbWFzdF9jb21iaW5lX2NwX2xlZnQobWFzdCk7DQorCQlsX21hcy5vZmZz ZXQgPSBtYXN0LT5ibi0+Yl9lbmQ7DQorCQltYWJfc2V0X2JfZW5kKG1hc3QtPmJuLCAmbF9tYXMs IGxlZnQpOw0KKwkJbWFiX3NldF9iX2VuZChtYXN0LT5ibiwgJm1fbWFzLCBtaWRkbGUpOw0KKwkJ bWFiX3NldF9iX2VuZChtYXN0LT5ibiwgJnJfbWFzLCByaWdodCk7DQorDQorCQkvKiBDb3B5IGFu eXRoaW5nIG5lY2Vzc2FyeSBvdXQgb2YgdGhlIHJpZ2h0IG5vZGUuICovDQorCQltYXN0X2NvbWJp bmVfY3BfcmlnaHQobWFzdCk7DQorCQltYXN0X3RvcGlhcnkobWFzdCk7DQorCQltYXN0LT5vcmln X2wtPmxhc3QgPSBtYXN0LT5vcmlnX2wtPm1heDsNCisNCisJCWlmIChtYXN0X3N1ZmZpY2llbnQo bWFzdCkpDQorCQkJY29udGludWU7DQorDQorCQlpZiAobWFzdF9vdmVyZmxvdyhtYXN0KSkNCisJ CQljb250aW51ZTsNCisNCisJCS8qIE1heSBiZSBhIG5ldyByb290IHN0b3JlZCBpbiBtYXN0LT5i biAqLw0KKwkJaWYgKG1hc19pc19yb290X2xpbWl0cyhtYXN0LT5vcmlnX2wpKQ0KKwkJCWJyZWFr Ow0KKw0KKwkJLyogVHJ5IHRvIGdldCBlbm91Z2ggZGF0YSBmb3IgdGhlIG5leHQgaXRlcmF0aW9u LiAqLw0KKwkJaWYgKCFtYXN0X3NpYmxpbmdfcmViYWxhbmNlX3JpZ2h0KG1hc3QsIHRydWUpKQ0K KwkJCWlmICghbWFzdF9jb3VzaW5fcmViYWxhbmNlX3JpZ2h0KG1hc3QsIHRydWUpKQ0KKwkJCQli cmVhazsNCisNCisJCS8qIHJlYmFsYW5jaW5nIGZyb20gb3RoZXIgbm9kZXMgbWF5IHJlcXVpcmUg YW5vdGhlciBsb29wLiAqLw0KKwkJaWYgKCFjb3VudCkNCisJCQljb3VudCsrOw0KKwl9DQorCWxf bWFzLm5vZGUgPSBtdF9ta19ub2RlKG1hX21ub2RlX3B0cihtYXNfcG9wX25vZGUobWFzKSksDQor CQkJCW10ZV9ub2RlX3R5cGUobWFzdC0+b3JpZ19sLT5ub2RlKSk7DQorCW1hc3QtPm9yaWdfbC0+ ZGVwdGgrKzsNCisJbWFiX21hc19jcChtYXN0LT5ibiwgMCwgbXRfc2xvdHNbbWFzdC0+Ym4tPnR5 cGVdIC0gMSwgJmxfbWFzLCB0cnVlKTsNCisJbXRlX3NldF9wYXJlbnQobGVmdCwgbF9tYXMubm9k ZSwgc2xvdCk7DQorCWlmIChtaWRkbGUpDQorCQltdGVfc2V0X3BhcmVudChtaWRkbGUsIGxfbWFz Lm5vZGUsICsrc2xvdCk7DQorDQorCWlmIChyaWdodCkNCisJCW10ZV9zZXRfcGFyZW50KHJpZ2h0 LCBsX21hcy5ub2RlLCArK3Nsb3QpOw0KKw0KK25ld19yb290Og0KKwlpZiAobWFzX2lzX3Jvb3Rf bGltaXRzKG1hc3QtPmwpKQ0KKwkJbWFzdF9uZXdfcm9vdChtYXN0LCBtYXMpOw0KKwllbHNlDQor CQltYXNfbW4oJmxfbWFzKS0+cGFyZW50ID0gbWFzX21uKG1hc3QtPm9yaWdfbCktPnBhcmVudDsN CisNCisJaWYgKCFtdGVfZGVhZF9ub2RlKG1hc3QtPm9yaWdfbC0+bm9kZSkpDQorCQltYXRfYWRk KCZmcmVlLCBtYXN0LT5vcmlnX2wtPm5vZGUpOw0KKw0KKwltYXMtPmRlcHRoID0gbWFzdC0+b3Jp Z19sLT5kZXB0aDsNCisJKm1hc3QtPm9yaWdfbCA9IGxfbWFzOw0KKwltdGVfc2V0X25vZGVfZGVh ZChtYXMtPm5vZGUpOw0KKw0KKwkvKiBTZXQgdXAgbWFzIGZvciBpbnNlcnRpb24uICovDQorCW1h c3QtPm9yaWdfbC0+ZGVwdGggPSBtYXMtPmRlcHRoOw0KKwltYXN0LT5vcmlnX2wtPmFsbG9jID0g bWFzLT5hbGxvYzsNCisJKm1hcyA9ICptYXN0LT5vcmlnX2w7DQorCW1hc193bWJfcmVwbGFjZSht YXMsICZmcmVlLCAmZGVzdHJveSk7DQorCW10cmVlX3JhbmdlX3dhbGsobWFzKTsNCisJcmV0dXJu IG1hc3QtPmJuLT5iX2VuZDsNCit9DQorDQorLyoNCisgKiBtYXNfcmViYWxhbmNlKCkgLSBSZWJh bGFuY2UgYSBnaXZlbiBub2RlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBiX25v ZGU6IFRoZSBiaWcgbWFwbGUgbm9kZS4NCisgKg0KKyAqIFJlYmFsYW5jZSB0d28gbm9kZXMgaW50 byBhIHNpbmdsZSBub2RlIG9yIHR3byBuZXcgbm9kZXMgdGhhdCBhcmUgc3VmZmljaWVudC4NCisg KiBDb250aW51ZSB1cHdhcmRzIHVudGlsIHRyZWUgaXMgc3VmZmljaWVudC4NCisgKg0KKyAqIFJl dHVybjogdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBiX25vZGUgZHVyaW5nIHRoZSBsYXN0IGxv b3AuDQorICovDQorc3RhdGljIGlubGluZSBpbnQgbWFzX3JlYmFsYW5jZShzdHJ1Y3QgbWFfc3Rh dGUgKm1hcywNCisJCQkJc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUpDQorew0KKwljaGFy IGVtcHR5X2NvdW50ID0gbWFzX210X2hlaWdodChtYXMpOw0KKwlzdHJ1Y3QgbWFwbGVfc3VidHJl ZV9zdGF0ZSBtYXN0Ow0KKwl1bnNpZ25lZCBjaGFyIHNoaWZ0LCBiX2VuZCA9ICsrYl9ub2RlLT5i X2VuZDsNCisNCisJTUFfU1RBVEUobF9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5s YXN0KTsNCisJTUFfU1RBVEUocl9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0 KTsNCisNCisJdHJhY2VfbWFfb3AoX19mdW5jX18sIG1hcyk7DQorDQorLyoNCisgKiBSZWJhbGFu Y2luZyBvY2N1cnMgaWYgYSBub2RlIGlzIGluc3VmZmljaWVudC4gIERhdGEgaXMgcmViYWxhbmNl ZCBhZ2FpbnN0IHRoZQ0KKyAqIG5vZGUgdG8gdGhlIHJpZ2h0IGlmIGl0IGV4aXN0cywgb3RoZXJ3 aXNlIHRoZSBub2RlIHRvIHRoZSBsZWZ0IG9mIHRoaXMgbm9kZQ0KKyAqIGlzIHJlYmFsYW5jZWQg YWdhaW5zdCB0aGlzIG5vZGUuICBJZiByZWJhbGFuY2luZyBjYXVzZXMganVzdCBvbmUgbm9kZSB0 byBiZQ0KKyAqIHByb2R1Y2VkIGluc3RlYWQgb2YgdHdvLCB0aGVuIHRoZSBwYXJlbnQgaXMgYWxz byBleGFtaW5lZCBhbmQgcmViYWxhbmNlZCBpZg0KKyAqIGl0IGlzIGluc3VmZmljaWVudC4gIEV2 ZXJ5IGxldmVsIHRyaWVzIHRvIGNvbWJpbmUgdGhlIGRhdGEgaW4gdGhlIHNhbWUgd2F5Lg0KKyAq IElmIG9uZSBub2RlIGNvbnRhaW5zIHRoZSBlbnRpcmUgcmFuZ2Ugb2YgdGhlIHRyZWUsIHRoZW4g dGhhdCBub2RlIGlzIHVzZWQgYXMNCisgKiBhIG5ldyByb290IG5vZGUuDQorICovDQorCW1hc19u b2RlX2NvdW50KG1hcywgMSArIGVtcHR5X2NvdW50ICogMyk7DQorCWlmIChtYXNfaXNfZXJyKG1h cykpDQorCQlyZXR1cm4gMDsNCisNCisJbWFzdC5vcmlnX2wgPSAmbF9tYXM7DQorCW1hc3Qub3Jp Z19yID0gJnJfbWFzOw0KKwltYXN0LmJuID0gYl9ub2RlOw0KKw0KKwlsX21hcyA9IHJfbWFzID0g Km1hczsNCisNCisJaWYgKG1hc19uZXh0X3NpYmxpbmcoJnJfbWFzKSkgew0KKwkJbWFzX21hYl9j cCgmcl9tYXMsIDAsIG10X3Nsb3RfY291bnQocl9tYXMubm9kZSksIGJfbm9kZSwgYl9lbmQpOw0K KwkJcl9tYXMubGFzdCA9IHJfbWFzLmluZGV4ID0gcl9tYXMubWF4Ow0KKw0KKwl9IGVsc2Ugew0K KwkJbWFzX3ByZXZfc2libGluZygmbF9tYXMpOw0KKwkJc2hpZnQgPSBtYXNfZGF0YV9lbmQoJmxf bWFzKSArIDE7DQorCQltYWJfc2hpZnRfcmlnaHQoYl9ub2RlLCBzaGlmdCk7DQorCQltYXMtPm9m ZnNldCArPSBzaGlmdDsNCisJCW1hc19tYWJfY3AoJmxfbWFzLCAwLCBzaGlmdCAtIDEsIGJfbm9k ZSwgMCk7DQorCQliX25vZGUtPmJfZW5kID0gc2hpZnQgKyBiX2VuZDsNCisJCWxfbWFzLmluZGV4 ID0gbF9tYXMubGFzdCA9IGxfbWFzLm1pbjsNCisJfQ0KKw0KKwlyZXR1cm4gbWFzX3NwYW5uaW5n X3JlYmFsYW5jZShtYXMsICZtYXN0LCBlbXB0eV9jb3VudCk7DQorfQ0KKw0KKy8qDQorICogbWFz X2Rlc3Ryb3lfcmViYWxhbmNlKCkgLSBSZWJhbGFuY2UgbGVmdC1tb3N0IG5vZGUgd2hpbGUgZGVz dHJveWluZyB0aGUgbWFwbGUNCisgKiBzdGF0ZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUN CisgKiBAZW5kOiBUaGUgZW5kIG9mIHRoZSBsZWZ0LW1vc3Qgbm9kZS4NCisgKg0KKyAqIER1cmlu ZyBhIG1hc3MtaW5zZXJ0IGV2ZW50IChzdWNoIGFzIGZvcmtpbmcpLCBpdCBtYXkgYmUgbmVjZXNz YXJ5IHRvDQorICogcmViYWxhbmNlIHRoZSBsZWZ0LW1vc3Qgbm9kZSB3aGVuIGl0IGlzIG5vdCBz dWZmaWNpZW50Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfZGVzdHJveV9yZWJhbGFu Y2Uoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGNoYXIgZW5kKQ0KK3sNCisJZW51bSBt YXBsZV90eXBlIG10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlzdHJ1Y3QgbWFwbGVf bm9kZSByZXVzZSwgKm5ld25vZGUsICpwYXJlbnQsICpuZXdfbGVmdCwgKmxlZnQsICpub2RlOw0K KwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVwYXJlbnQ7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0LCB0 bXAsIHNwbGl0ID0gbXRfc2xvdHNbbXRdIC8gMjsNCisJdm9pZCBfX3JjdSAqKmxfc2xvdHMsICoq c2xvdHM7DQorCXVuc2lnbmVkIGxvbmcgKmxfcGl2cywgKnBpdnMsIGdhcDsNCisNCisJTUFfU1RB VEUobF9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0KTsNCisNCisJbF9tYXMg PSAqbWFzOw0KKwltYXNfcHJldl9zaWJsaW5nKCZsX21hcyk7DQorDQorCS8qIHNldCB1cCBub2Rl LiAqLw0KKwlpZiAobXRfaW5fcmN1KG1hcy0+dHJlZSkpIHsNCisJCS8qIEFsbG9jYXRlIGZvciBi b3RoIGxlZnQgYW5kIHJpZ2h0IGFzIHdlbGwgYXMgcGFyZW50LiAqLw0KKwkJbWFzX25vZGVfY291 bnQobWFzLCAzKTsNCisJCWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQkJcmV0dXJuOw0KKw0KKwkJ bmV3bm9kZSA9IG1hc19wb3Bfbm9kZShtYXMpOw0KKwl9IGVsc2Ugew0KKwkJbmV3bm9kZSA9ICZy ZXVzZTsNCisJfQ0KKw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCW5ld25vZGUtPnBhcmVudCA9 IG5vZGUtPnBhcmVudDsNCisJc2xvdHMgPSBtYV9zbG90cyhuZXdub2RlLCBtdCk7DQorCXBpdnMg PSBtYV9waXZvdHMobmV3bm9kZSwgbXQpOw0KKwlsZWZ0ID0gbWFzX21uKCZsX21hcyk7DQorCWxf c2xvdHMgPSBtYV9zbG90cyhsZWZ0LCBtdCk7DQorCWxfcGl2cyA9IG1hX3Bpdm90cyhsZWZ0LCBt dCk7DQorCWlmICghbF9zbG90c1tzcGxpdF0pDQorCQlzcGxpdCsrOw0KKwl0bXAgPSBtYXNfZGF0 YV9lbmQoJmxfbWFzKSAtIHNwbGl0Ow0KKw0KKwltZW1jcHkoc2xvdHMsIGxfc2xvdHMgKyBzcGxp dCArIDEsIHNpemVvZih2b2lkICopICogdG1wKTsNCisJbWVtY3B5KHBpdnMsIGxfcGl2cyArIHNw bGl0ICsgMSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogdG1wKTsNCisJcGl2c1t0bXBdID0gbF9t YXMubWF4Ow0KKwltZW1jcHkoc2xvdHMgKyB0bXAsIG1hX3Nsb3RzKG5vZGUsIG10KSwgc2l6ZW9m KHZvaWQgKikgKiBlbmQpOw0KKwltZW1jcHkocGl2cyArIHRtcCwgbWFfcGl2b3RzKG5vZGUsIG10 KSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogZW5kKTsNCisNCisJbF9tYXMubWF4ID0gbF9waXZz W3NwbGl0XTsNCisJbWFzLT5taW4gPSBsX21hcy5tYXggKyAxOw0KKwllcGFyZW50ID0gbXRfbWtf bm9kZShtdGVfcGFyZW50KGxfbWFzLm5vZGUpLA0KKwkJCSAgICAgbWFzX3BhcmVudF9lbnVtKCZs X21hcywgbF9tYXMubm9kZSkpOw0KKwl0bXAgKz0gZW5kOw0KKwlpZiAoIW10X2luX3JjdShtYXMt PnRyZWUpKSB7DQorCQl1bnNpZ25lZCBjaGFyIG1heF9wID0gbXRfcGl2b3RzW210XTsNCisJCXVu c2lnbmVkIGNoYXIgbWF4X3MgPSBtdF9zbG90c1ttdF07DQorDQorCQlpZiAodG1wIDwgbWF4X3Ap DQorCQkJbWVtc2V0KHBpdnMgKyB0bXAsIDAsDQorCQkJICAgICAgIHNpemVvZih1bnNpZ25lZCBs b25nICopICogKG1heF9wIC0gdG1wKSk7DQorDQorCQlpZiAodG1wIDwgbXRfc2xvdHNbbXRdKQ0K KwkJCW1lbXNldChzbG90cyArIHRtcCwgMCwgc2l6ZW9mKHZvaWQgKikgKiAobWF4X3MgLSB0bXAp KTsNCisNCisJCW1lbWNweShub2RlLCBuZXdub2RlLCBzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUp KTsNCisJCW1hX3NldF9tZXRhKG5vZGUsIG10LCAwLCB0bXAgLSAxKTsNCisJCW10ZV9zZXRfcGl2 b3QoZXBhcmVudCwgbXRlX3BhcmVudF9zbG90KGxfbWFzLm5vZGUpLA0KKwkJCSAgICAgIGxfcGl2 c1tzcGxpdF0pOw0KKw0KKwkJLyogUmVtb3ZlIGRhdGEgZnJvbSBsX3BpdnMuICovDQorCQl0bXAg PSBzcGxpdCArIDE7DQorCQltZW1zZXQobF9waXZzICsgdG1wLCAwLCBzaXplb2YodW5zaWduZWQg bG9uZykgKiAobWF4X3AgLSB0bXApKTsNCisJCW1lbXNldChsX3Nsb3RzICsgdG1wLCAwLCBzaXpl b2Yodm9pZCAqKSAqIChtYXhfcyAtIHRtcCkpOw0KKwkJbWFfc2V0X21ldGEobGVmdCwgbXQsIDAs IHNwbGl0KTsNCisNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwkvKiBSQ1UgcmVxdWlyZXMgcmVw bGFjaW5nIGJvdGggbF9tYXMsIG1hcywgYW5kIHBhcmVudC4gKi8NCisJbWFzLT5ub2RlID0gbXRf bWtfbm9kZShuZXdub2RlLCBtdCk7DQorCW1hX3NldF9tZXRhKG5ld25vZGUsIG10LCAwLCB0bXAp Ow0KKw0KKwluZXdfbGVmdCA9IG1hc19wb3Bfbm9kZShtYXMpOw0KKwluZXdfbGVmdC0+cGFyZW50 ID0gbGVmdC0+cGFyZW50Ow0KKwltdCA9IG10ZV9ub2RlX3R5cGUobF9tYXMubm9kZSk7DQorCXNs b3RzID0gbWFfc2xvdHMobmV3X2xlZnQsIG10KTsNCisJcGl2cyA9IG1hX3Bpdm90cyhuZXdfbGVm dCwgbXQpOw0KKwltZW1jcHkoc2xvdHMsIGxfc2xvdHMsIHNpemVvZih2b2lkICopICogc3BsaXQp Ow0KKwltZW1jcHkocGl2cywgbF9waXZzLCBzaXplb2YodW5zaWduZWQgbG9uZykgKiBzcGxpdCk7 DQorCW1hX3NldF9tZXRhKG5ld19sZWZ0LCBtdCwgMCwgc3BsaXQpOw0KKwlsX21hcy5ub2RlID0g bXRfbWtfbm9kZShuZXdfbGVmdCwgbXQpOw0KKw0KKwkvKiByZXBsYWNlIHBhcmVudC4gKi8NCisJ b2Zmc2V0ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7DQorCW10ID0gbWFzX3BhcmVudF9l bnVtKCZsX21hcywgbF9tYXMubm9kZSk7DQorCXBhcmVudCA9IG1hc19wb3Bfbm9kZShtYXMpOw0K KwlzbG90cyA9IG1hX3Nsb3RzKHBhcmVudCwgbXQpOw0KKwlwaXZzID0gbWFfcGl2b3RzKHBhcmVu dCwgbXQpOw0KKwltZW1jcHkocGFyZW50LCBtdGVfdG9fbm9kZShlcGFyZW50KSwgc2l6ZW9mKHN0 cnVjdCBtYXBsZV9ub2RlKSk7DQorCXJjdV9hc3NpZ25fcG9pbnRlcihzbG90c1tvZmZzZXRdLCBt YXMtPm5vZGUpOw0KKwlyY3VfYXNzaWduX3BvaW50ZXIoc2xvdHNbb2Zmc2V0IC0gMV0sIGxfbWFz Lm5vZGUpOw0KKwlwaXZzW29mZnNldCAtIDFdID0gbF9tYXMubWF4Ow0KKwllcGFyZW50ID0gbXRf bWtfbm9kZShwYXJlbnQsIG10KTsNCitkb25lOg0KKwlnYXAgPSBtYXNfbGVhZl9tYXhfZ2FwKG1h cyk7DQorCW10ZV9zZXRfZ2FwKGVwYXJlbnQsIG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpLCBn YXApOw0KKwlnYXAgPSBtYXNfbGVhZl9tYXhfZ2FwKCZsX21hcyk7DQorCW10ZV9zZXRfZ2FwKGVw YXJlbnQsIG10ZV9wYXJlbnRfc2xvdChsX21hcy5ub2RlKSwgZ2FwKTsNCisJbWFzX2FzY2VuZCht YXMpOw0KKw0KKwlpZiAobXRfaW5fcmN1KG1hcy0+dHJlZSkpDQorCQltYXNfcmVwbGFjZShtYXMs IGZhbHNlKTsNCisNCisJbWFzX3VwZGF0ZV9nYXAobWFzKTsNCit9DQorDQorLyoNCisgKiBtYXNf c3BsaXRfZmluYWxfbm9kZSgpIC0gU3BsaXQgdGhlIGZpbmFsIG5vZGUgaW4gYSBzdWJ0cmVlIG9w ZXJhdGlvbi4NCisgKiBAbWFzdDogdGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKiBAbWFzOiBU aGUgbWFwbGUgc3RhdGUNCisgKiBAaGVpZ2h0OiBUaGUgaGVpZ2h0IG9mIHRoZSB0cmVlIGluIGNh c2UgaXQncyBhIG5ldyByb290Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfc3BsaXRf ZmluYWxfbm9kZShzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwNCisJCQkJCXN0cnVj dCBtYV9zdGF0ZSAqbWFzLCBpbnQgaGVpZ2h0KQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vub2RlICph bmNlc3RvcjsNCisNCisJaWYgKG10ZV9pc19yb290KG1hcy0+bm9kZSkpIHsNCisJCWlmIChtdF9p c19hbGxvYyhtYXMtPnRyZWUpKQ0KKwkJCW1hc3QtPmJuLT50eXBlID0gbWFwbGVfYXJhbmdlXzY0 Ow0KKwkJZWxzZQ0KKwkJCW1hc3QtPmJuLT50eXBlID0gbWFwbGVfcmFuZ2VfNjQ7DQorCQltYXMt PmRlcHRoID0gaGVpZ2h0Ow0KKwl9DQorCS8qDQorCSAqIE9ubHkgYSBzaW5nbGUgbm9kZSBpcyB1 c2VkIGhlcmUsIGNvdWxkIGJlIHJvb3QuDQorCSAqIFRoZSBCaWdfbm9kZSBkYXRhIHNob3VsZCBq dXN0IGZpdCBpbiBhIHNpbmdsZSBub2RlLg0KKwkgKi8NCisJYW5jZXN0b3IgPSBtYXNfbmV3X21h X25vZGUobWFzLCBtYXN0LT5ibik7DQorCW10ZV9zZXRfcGFyZW50KG1hc3QtPmwtPm5vZGUsIGFu Y2VzdG9yLCBtYXN0LT5sLT5vZmZzZXQpOw0KKwltdGVfc2V0X3BhcmVudChtYXN0LT5yLT5ub2Rl LCBhbmNlc3RvciwgbWFzdC0+ci0+b2Zmc2V0KTsNCisJbXRlX3RvX25vZGUoYW5jZXN0b3IpLT5w YXJlbnQgPSBtYXNfbW4obWFzKS0+cGFyZW50Ow0KKw0KKwltYXN0LT5sLT5ub2RlID0gYW5jZXN0 b3I7DQorCW1hYl9tYXNfY3AobWFzdC0+Ym4sIDAsIG10X3Nsb3RzW21hc3QtPmJuLT50eXBlXSAt IDEsIG1hc3QtPmwsIHRydWUpOw0KKwltYXMtPm9mZnNldCA9IG1hc3QtPmJuLT5iX2VuZCAtIDE7 DQorCXJldHVybiB0cnVlOw0KK30NCisNCisvKg0KKyAqIG1hc3RfZmlsbF9ibm9kZSgpIC0gQ29w eSBkYXRhIGludG8gdGhlIGJpZyBub2RlIGluIHRoZSBzdWJ0cmVlIHN0YXRlDQorICogQG1hc3Q6 IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlDQorICog QHNraXA6IFRoZSBudW1iZXIgb2YgZW50cmllcyB0byBza2lwIGZvciBuZXcgbm9kZXMgaW5zZXJ0 aW9uLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXN0X2ZpbGxfYm5vZGUoc3RydWN0IG1h cGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QsDQorCQkJCQkgc3RydWN0IG1hX3N0YXRlICptYXMsDQor CQkJCQkgdW5zaWduZWQgY2hhciBza2lwKQ0KK3sNCisJYm9vbCBjcCA9IHRydWU7DQorCXN0cnVj dCBtYXBsZV9lbm9kZSAqb2xkID0gbWFzLT5ub2RlOw0KKwl1bnNpZ25lZCBjaGFyIHNwbGl0LCB6 ZXJvOw0KKw0KKwltYXN0LT5ibi0+Yl9lbmQgPSAwOw0KKwlpZiAobXRlX2lzX3Jvb3QobWFzLT5u b2RlKSkgew0KKwkJY3AgPSBmYWxzZTsNCisJfSBlbHNlIHsNCisJCW1hc19hc2NlbmQobWFzKTsN CisJCW1hdF9hZGQobWFzdC0+ZnJlZSwgb2xkKTsNCisJCW1hcy0+b2Zmc2V0ID0gbXRlX3BhcmVu dF9zbG90KG1hcy0+bm9kZSk7DQorCX0NCisNCisJbWFzdC0+Ym4tPm1pbiA9IG1hcy0+bWluOw0K KwlpZiAoY3AgJiYgbWFzdC0+bC0+b2Zmc2V0KQ0KKwkJbWFzX21hYl9jcChtYXMsIDAsIG1hc3Qt PmwtPm9mZnNldCAtIDEsIG1hc3QtPmJuLCAwKTsNCisNCisJc3BsaXQgPSBtYXN0LT5ibi0+Yl9l bmQ7DQorCW1hYl9zZXRfYl9lbmQobWFzdC0+Ym4sIG1hc3QtPmwsIG1hc3QtPmwtPm5vZGUpOw0K KwltYXN0LT5yLT5vZmZzZXQgPSBtYXN0LT5ibi0+Yl9lbmQ7DQorCW1hYl9zZXRfYl9lbmQobWFz dC0+Ym4sIG1hc3QtPnIsIG1hc3QtPnItPm5vZGUpOw0KKwlpZiAobWFzdC0+Ym4tPnBpdm90W21h c3QtPmJuLT5iX2VuZCAtIDFdID09IG1hcy0+bWF4KQ0KKwkJY3AgPSBmYWxzZTsNCisNCisJaWYg KGNwKQ0KKwkJbWFzX21hYl9jcChtYXMsIHNwbGl0ICsgc2tpcCwgbXRfc2xvdF9jb3VudChtYXMt Pm5vZGUpIC0gMSwNCisJCQkgICBtYXN0LT5ibiwgbWFzdC0+Ym4tPmJfZW5kKTsNCisNCisJbWFz dC0+Ym4tPmJfZW5kLS07DQorCW1hc3QtPmJuLT50eXBlID0gbXRlX25vZGVfdHlwZShtYXMtPm5v ZGUpOw0KKw0KKwl6ZXJvID0gTUFQTEVfQklHX05PREVfU0xPVFMgLSBtYXN0LT5ibi0+Yl9lbmQg LSAyOw0KKwltZW1zZXQobWFzdC0+Ym4tPmdhcCArIG1hc3QtPmJuLT5iX2VuZCArIDEsIDAsDQor CSAgICAgICBzaXplb2YodW5zaWduZWQgbG9uZykgKiB6ZXJvKTsNCisJbWVtc2V0KG1hc3QtPmJu LT5zbG90ICsgbWFzdC0+Ym4tPmJfZW5kICsgMSwgMCwgc2l6ZW9mKHZvaWQqKSAqIHplcm8tLSk7 DQorCW1lbXNldChtYXN0LT5ibi0+cGl2b3QgKyBtYXN0LT5ibi0+Yl9lbmQgKyAxLCAwLA0KKwkg ICAgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogemVybyk7DQorfQ0KKw0KKy8qDQorICogbWFz dF9zcGxpdF9kYXRhKCkgLSBTcGxpdCB0aGUgZGF0YSBpbiB0aGUgc3VidHJlZSBzdGF0ZSBiaWcg bm9kZSBpbnRvIHJlZ3VsYXINCisgKiBub2Rlcy4NCisgKiBAbWFzdDogVGhlIG1hcGxlIHN1YnRy ZWUgc3RhdGUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAc3BsaXQ6IFRoZSBsb2Nh dGlvbiB0byBzcGxpdCB0aGUgYmlnIG5vZGUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFz dF9zcGxpdF9kYXRhKHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0LA0KKwkgICBzdHJ1 Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgY2hhciBzcGxpdCkNCit7DQorCXVuc2lnbmVkIGNo YXIgcF9zbG90Ow0KKw0KKwltYWJfbWFzX2NwKG1hc3QtPmJuLCAwLCBzcGxpdCwgbWFzdC0+bCwg dHJ1ZSk7DQorCW10ZV9zZXRfcGl2b3QobWFzdC0+ci0+bm9kZSwgMCwgbWFzdC0+ci0+bWF4KTsN CisJbWFiX21hc19jcChtYXN0LT5ibiwgc3BsaXQgKyAxLCBtYXN0LT5ibi0+Yl9lbmQsIG1hc3Qt PnIsIGZhbHNlKTsNCisJbWFzdC0+bC0+b2Zmc2V0ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9k ZSk7DQorCW1hc3QtPmwtPm1heCA9IG1hc3QtPmJuLT5waXZvdFtzcGxpdF07DQorCW1hc3QtPnIt Pm1pbiA9IG1hc3QtPmwtPm1heCArIDE7DQorCWlmIChtdGVfaXNfbGVhZihtYXMtPm5vZGUpKQ0K KwkgICAgcmV0dXJuOw0KKw0KKwlwX3Nsb3QgPSBtYXN0LT5vcmlnX2wtPm9mZnNldDsNCisJbWFz X3NldF9zcGxpdF9wYXJlbnQobWFzdC0+b3JpZ19sLCBtYXN0LT5sLT5ub2RlLCBtYXN0LT5yLT5u b2RlLA0KKwkJCSAgICAgJnBfc2xvdCwgc3BsaXQpOw0KKwltYXNfc2V0X3NwbGl0X3BhcmVudCht YXN0LT5vcmlnX3IsIG1hc3QtPmwtPm5vZGUsIG1hc3QtPnItPm5vZGUsDQorCQkJICAgICAmcF9z bG90LCBzcGxpdCk7DQorfQ0KKw0KKy8qDQorICogbWFzX3B1c2hfZGF0YSgpIC0gSW5zdGVhZCBv ZiBzcGxpdHRpbmcgYSBub2RlLCBpdCBpcyBiZW5lZmljaWFsIHRvIHB1c2ggdGhlDQorICogZGF0 YSB0byB0aGUgcmlnaHQgb3IgbGVmdCBub2RlIGlmIHRoZXJlIGlzIHJvb20uDQorICogQG1hczog VGhlIG1hcGxlIHN0YXRlDQorICogQGhlaWdodDogVGhlIGN1cnJlbnQgaGVpZ2h0IG9mIHRoZSBt YXBsZSBzdGF0ZQ0KKyAqIEBtYXN0OiBUaGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqIEBsZWZ0 OiBQdXNoIGxlZnQgb3Igbm90Lg0KKyAqDQorICogS2VlcGluZyB0aGUgaGVpZ2h0IG9mIHRoZSB0 cmVlIGxvdyBtZWFucyBmYXN0ZXIgbG9va3Vwcy4NCisgKg0KKyAqIFJldHVybjogVHJ1ZSBpZiBw dXNoZWQsIGZhbHNlIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3B1 c2hfZGF0YShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgaW50IGhlaWdodCwNCisJCQkJIHN0cnVjdCBt YXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0LCBib29sIGxlZnQpDQorew0KKwl1bnNpZ25lZCBjaGFy IHNsb3RfdG90YWwgPSBtYXN0LT5ibi0+Yl9lbmQ7DQorCXVuc2lnbmVkIGNoYXIgZW5kLCBzcGFj ZSwgc3BsaXQ7DQorDQorCU1BX1NUQVRFKHRtcF9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwg bWFzLT5sYXN0KTsNCisJdG1wX21hcyA9ICptYXM7DQorCXRtcF9tYXMuZGVwdGggPSBtYXN0LT5s LT5kZXB0aDsNCisNCisJaWYgKGxlZnQgJiYgIW1hc19wcmV2X3NpYmxpbmcoJnRtcF9tYXMpKQ0K KwkJcmV0dXJuIGZhbHNlOw0KKwllbHNlIGlmICghbGVmdCAmJiAhbWFzX25leHRfc2libGluZygm dG1wX21hcykpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCWVuZCA9IG1hc19kYXRhX2VuZCgmdG1w X21hcyk7DQorCXNsb3RfdG90YWwgKz0gZW5kOw0KKwlzcGFjZSA9IDIgKiBtdF9zbG90X2NvdW50 KG1hcy0+bm9kZSkgLSAyOw0KKwkvKiAtMiBpbnN0ZWFkIG9mIC0xIHRvIGVuc3VyZSB0aGVyZSBp c24ndCBhIHRyaXBsZSBzcGxpdCAqLw0KKwlpZiAobWFfaXNfbGVhZihtYXN0LT5ibi0+dHlwZSkp DQorCQlzcGFjZS0tOw0KKw0KKwlpZiAobWFzLT5tYXggPT0gVUxPTkdfTUFYKQ0KKwkJc3BhY2Ut LTsNCisNCisJaWYgKHNsb3RfdG90YWwgPj0gc3BhY2UpDQorCQlyZXR1cm4gZmFsc2U7DQorDQor CS8qIEdldCB0aGUgZGF0YTsgRmlsbCBtYXN0LT5ibiAqLw0KKwltYXN0LT5ibi0+Yl9lbmQrKzsN CisJaWYgKGxlZnQpIHsNCisJCW1hYl9zaGlmdF9yaWdodChtYXN0LT5ibiwgZW5kICsgMSk7DQor CQltYXNfbWFiX2NwKCZ0bXBfbWFzLCAwLCBlbmQsIG1hc3QtPmJuLCAwKTsNCisJCW1hc3QtPmJu LT5iX2VuZCA9IHNsb3RfdG90YWwgKyAxOw0KKwl9IGVsc2Ugew0KKwkJbWFzX21hYl9jcCgmdG1w X21hcywgMCwgZW5kLCBtYXN0LT5ibiwgbWFzdC0+Ym4tPmJfZW5kKTsNCisJfQ0KKw0KKwkvKiBD b25maWd1cmUgbWFzdCBmb3Igc3BsaXR0aW5nIG9mIG1hc3QtPmJuICovDQorCXNwbGl0ID0gbXRf c2xvdHNbbWFzdC0+Ym4tPnR5cGVdIC0gMjsNCisJaWYgKGxlZnQpIHsNCisJCS8qICBTd2l0Y2gg bWFzIHRvIHByZXYgbm9kZSAgKi8NCisJCW1hdF9hZGQobWFzdC0+ZnJlZSwgbWFzLT5ub2RlKTsN CisJCSptYXMgPSB0bXBfbWFzOw0KKwkJLyogU3RhcnQgdXNpbmcgbWFzdC0+bCBmb3IgdGhlIGxl ZnQgc2lkZS4gKi8NCisJCXRtcF9tYXMubm9kZSA9IG1hc3QtPmwtPm5vZGU7DQorCQkqbWFzdC0+ bCA9IHRtcF9tYXM7DQorCX0gZWxzZSB7DQorCQltYXRfYWRkKG1hc3QtPmZyZWUsIHRtcF9tYXMu bm9kZSk7DQorCQl0bXBfbWFzLm5vZGUgPSBtYXN0LT5yLT5ub2RlOw0KKwkJKm1hc3QtPnIgPSB0 bXBfbWFzOw0KKwkJc3BsaXQgPSBzbG90X3RvdGFsIC0gc3BsaXQ7DQorCX0NCisJc3BsaXQgPSBt YWJfbm9fbnVsbF9zcGxpdChtYXN0LT5ibiwgc3BsaXQsIG10X3Nsb3RzW21hc3QtPmJuLT50eXBl XSk7DQorCS8qIFVwZGF0ZSBwYXJlbnQgc2xvdCBmb3Igc3BsaXQgY2FsY3VsYXRpb24uICovDQor CWlmIChsZWZ0KQ0KKwkJbWFzdC0+b3JpZ19sLT5vZmZzZXQgKz0gZW5kICsgMTsNCisNCisJbWFz dF9zcGxpdF9kYXRhKG1hc3QsIG1hcywgc3BsaXQpOw0KKwltYXN0X2ZpbGxfYm5vZGUobWFzdCwg bWFzLCAyKTsNCisJbWFzX3NwbGl0X2ZpbmFsX25vZGUobWFzdCwgbWFzLCBoZWlnaHQgKyAxKTsN CisJcmV0dXJuIHRydWU7DQorfQ0KKw0KKy8qDQorICogbWFzX3NwbGl0KCkgLSBTcGxpdCBkYXRh IHRoYXQgaXMgdG9vIGJpZyBmb3Igb25lIG5vZGUgaW50byB0d28uDQorICogQG1hczogVGhlIG1h cGxlIHN0YXRlDQorICogQGJfbm9kZTogVGhlIG1hcGxlIGJpZyBub2RlDQorICogUmV0dXJuOiAx IG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZS4NCisgKi8NCitzdGF0aWMgaW50IG1hc19zcGxpdChz dHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUpDQorew0K Kw0KKwlzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSBtYXN0Ow0KKwlpbnQgaGVpZ2h0ID0gMDsN CisJdW5zaWduZWQgY2hhciBtaWRfc3BsaXQsIHNwbGl0ID0gMDsNCisNCisJLyoNCisJICogU3Bs aXR0aW5nIGlzIGhhbmRsZWQgZGlmZmVyZW50bHkgZnJvbSBhbnkgb3RoZXIgQi10cmVlOyB0aGUg TWFwbGUNCisJICogVHJlZSBzcGxpdHMgdXB3YXJkcy4gIFNwbGl0dGluZyB1cCBtZWFucyB0aGF0 IHRoZSBzcGxpdCBvcGVyYXRpb24NCisJICogb2NjdXJzIHdoZW4gdGhlIHdhbGsgb2YgdGhlIHRy ZWUgaGl0cyB0aGUgbGVhdmVzIGFuZCBub3Qgb24gdGhlIHdheQ0KKwkgKiBkb3duLiAgVGhlIHJl YXNvbiBmb3Igc3BsaXR0aW5nIHVwIGlzIHRoYXQgaXQgaXMgaW1wb3NzaWJsZSB0byBrbm93DQor CSAqIGhvdyBtdWNoIHNwYWNlIHdpbGwgYmUgbmVlZGVkIHVudGlsIHRoZSBsZWFmIGlzIChvciBs ZWF2ZXMgYXJlKQ0KKwkgKiByZWFjaGVkLiAgU2luY2Ugb3ZlcndyaXRpbmcgZGF0YSBpcyBhbGxv d2VkIGFuZCBhIHJhbmdlIGNvdWxkDQorCSAqIG92ZXJ3cml0ZSBtb3JlIHRoYW4gb25lIHJhbmdl IG9yIHJlc3VsdCBpbiBjaGFuZ2luZyBvbmUgZW50cnkgaW50byAzDQorCSAqIGVudHJpZXMsIGl0 IGlzIGltcG9zc2libGUgdG8ga25vdyBpZiBhIHNwbGl0IGlzIHJlcXVpcmVkIHVudGlsIHRoZQ0K KwkgKiBkYXRhIGlzIGV4YW1pbmVkLg0KKwkgKg0KKwkgKiBTcGxpdHRpbmcgaXMgYSBiYWxhbmNp bmcgYWN0IGJldHdlZW4ga2VlcGluZyBhbGxvY2F0aW9ucyB0byBhIG1pbmltdW0NCisJICogYW5k IGF2b2lkaW5nIGEgJ2ppdHRlcicgZXZlbnQgd2hlcmUgYSB0cmVlIGlzIGV4cGFuZGVkIHRvIG1h a2Ugcm9vbQ0KKwkgKiBmb3IgYW4gZW50cnkgZm9sbG93ZWQgYnkgYSBjb250cmFjdGlvbiB3aGVu IHRoZSBlbnRyeSBpcyByZW1vdmVkLiAgVG8NCisJICogYWNjb21wbGlzaCB0aGUgYmFsYW5jZSwg dGhlcmUgYXJlIGVtcHR5IHNsb3RzIHJlbWFpbmluZyBpbiBib3RoIGxlZnQNCisJICogYW5kIHJp Z2h0IG5vZGVzIGFmdGVyIGEgc3BsaXQuDQorCSAqLw0KKwlNQV9TVEFURShsX21hcywgbWFzLT50 cmVlLCBtYXMtPmluZGV4LCBtYXMtPmxhc3QpOw0KKwlNQV9TVEFURShyX21hcywgbWFzLT50cmVl LCBtYXMtPmluZGV4LCBtYXMtPmxhc3QpOw0KKwlNQV9TVEFURShwcmV2X2xfbWFzLCBtYXMtPnRy ZWUsIG1hcy0+aW5kZXgsIG1hcy0+bGFzdCk7DQorCU1BX1NUQVRFKHByZXZfcl9tYXMsIG1hcy0+ dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0KTsNCisJTUFfVE9QSUFSWShtYXQsIG1hcy0+dHJl ZSk7DQorDQorCXRyYWNlX21hX29wKF9fZnVuY19fLCBtYXMpOw0KKwltYXMtPmRlcHRoID0gbWFz X210X2hlaWdodChtYXMpOw0KKwkvKiBBbGxvY2F0aW9uIGZhaWx1cmVzIHdpbGwgaGFwcGVuIGVh cmx5LiAqLw0KKwltYXNfbm9kZV9jb3VudChtYXMsIDEgKyBtYXMtPmRlcHRoICogMik7DQorCWlm IChtYXNfaXNfZXJyKG1hcykpDQorCQlyZXR1cm4gMDsNCisNCisJbWFzdC5sID0gJmxfbWFzOw0K KwltYXN0LnIgPSAmcl9tYXM7DQorCW1hc3Qub3JpZ19sID0gJnByZXZfbF9tYXM7DQorCW1hc3Qu b3JpZ19yID0gJnByZXZfcl9tYXM7DQorCW1hc3QuZnJlZSA9ICZtYXQ7DQorCW1hc3QuYm4gPSBi X25vZGU7DQorDQorCXdoaWxlIChoZWlnaHQrKyA8PSBtYXMtPmRlcHRoKSB7DQorCQlpZiAobXRf c2xvdHNbYl9ub2RlLT50eXBlXSA+IGJfbm9kZS0+Yl9lbmQpIHsNCisJCQltYXNfc3BsaXRfZmlu YWxfbm9kZSgmbWFzdCwgbWFzLCBoZWlnaHQpOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKw0KKwkJbF9t YXMgPSByX21hcyA9ICptYXM7DQorCQlsX21hcy5ub2RlID0gbWFzX25ld19tYV9ub2RlKG1hcywg Yl9ub2RlKTsNCisJCXJfbWFzLm5vZGUgPSBtYXNfbmV3X21hX25vZGUobWFzLCBiX25vZGUpOw0K KwkJLyoNCisJCSAqIEFub3RoZXIgd2F5IHRoYXQgJ2ppdHRlcicgaXMgYXZvaWRlZCBpcyB0byB0 ZXJtaW5hdGUgYSBzcGxpdCB1cCBlYXJseSBpZiB0aGUNCisJCSAqIGxlZnQgb3IgcmlnaHQgbm9k ZSBoYXMgc3BhY2UgdG8gc3BhcmUuICBUaGlzIGlzIHJlZmVycmVkIHRvIGFzICJwdXNoaW5nIGxl ZnQiDQorCQkgKiBvciAicHVzaGluZyByaWdodCIgYW5kIGlzIHNpbWlsYXIgdG8gdGhlIEIqIHRy ZWUsIGV4Y2VwdCB0aGUgbm9kZXMgbGVmdCBvcg0KKwkJICogcmlnaHQgY2FuIHJhcmVseSBiZSBy ZXVzZWQgZHVlIHRvIFJDVSwgYnV0IHRoZSByaXBwbGUgdXB3YXJkcyBpcyBoYWx0ZWQgd2hpY2gN CisJCSAqIGlzIGEgc2lnbmlmaWNhbnQgc2F2aW5ncy4NCisJCSAqLw0KKwkJLyogVHJ5IHRvIHB1 c2ggbGVmdC4gKi8NCisJCWlmIChtYXNfcHVzaF9kYXRhKG1hcywgaGVpZ2h0LCAmbWFzdCwgdHJ1 ZSkpDQorCQkJYnJlYWs7DQorDQorCQkvKiBUcnkgdG8gcHVzaCByaWdodC4gKi8NCisJCWlmICht YXNfcHVzaF9kYXRhKG1hcywgaGVpZ2h0LCAmbWFzdCwgZmFsc2UpKQ0KKwkJCWJyZWFrOw0KKw0K KwkJc3BsaXQgPSBtYWJfY2FsY19zcGxpdChtYXMsIGJfbm9kZSwgJm1pZF9zcGxpdCk7DQorCQlt YXN0X3NwbGl0X2RhdGEoJm1hc3QsIG1hcywgc3BsaXQpOw0KKwkJLyoNCisJCSAqIFVzdWFsbHkg Y29ycmVjdCwgbWFiX21hc19jcCBpbiB0aGUgYWJvdmUgY2FsbCBvdmVyd3JpdGVzDQorCQkgKiBy LT5tYXguDQorCQkgKi8NCisJCW1hc3Quci0+bWF4ID0gbWFzLT5tYXg7DQorCQltYXN0X2ZpbGxf Ym5vZGUoJm1hc3QsIG1hcywgMSk7DQorCQlwcmV2X2xfbWFzID0gKm1hc3QubDsNCisJCXByZXZf cl9tYXMgPSAqbWFzdC5yOw0KKwl9DQorDQorCS8qIFNldCB0aGUgb3JpZ2luYWwgbm9kZSBhcyBk ZWFkICovDQorCW1hdF9hZGQobWFzdC5mcmVlLCBtYXMtPm5vZGUpOw0KKwltYXMtPm5vZGUgPSBs X21hcy5ub2RlOw0KKwltYXNfd21iX3JlcGxhY2UobWFzLCBtYXN0LmZyZWUsIE5VTEwpOw0KKwlt dHJlZV9yYW5nZV93YWxrKG1hcyk7DQorCXJldHVybiAxOw0KK30NCisNCisvKg0KKyAqIG1hc19y ZXVzZV9ub2RlKCkgLSBSZXVzZSB0aGUgbm9kZSB0byBzdG9yZSB0aGUgZGF0YS4NCisgKiBAbWFz OiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAYm46IFRoZSBtYXBsZSBiaWcgbm9kZQ0KKyAqIEBlbmQ6 IFRoZSBlbmQgb2YgdGhlIGRhdGEuDQorICoNCisgKiBXaWxsIGFsd2F5cyByZXR1cm4gZmFsc2Ug aW4gUkNVIG1vZGUuDQorICoNCisgKiBSZXR1cm46IFRydWUgaWYgbm9kZSB3YXMgcmV1c2VkLCBm YWxzZSBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19yZXVzZV9ub2Rl KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkJCSAgc3RydWN0IG1hcGxlX2JpZ19ub2RlICpibiwg dW5zaWduZWQgY2hhciBlbmQpDQorew0KKwkvKiBOZWVkIHRvIGJlIHJjdSBzYWZlLiAqLw0KKwlp ZiAobXRfaW5fcmN1KG1hcy0+dHJlZSkpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCW1hYl9tYXNf Y3AoYm4sIDAsIGJuLT5iX2VuZCwgbWFzLCBmYWxzZSk7DQorDQorCWlmIChlbmQgPiBibi0+Yl9l bmQpIHsNCisJCS8qIFplcm8gZW5kIG9mIG5vZGUuICovDQorCQllbnVtIG1hcGxlX3R5cGUgbXQg PSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCQlzdHJ1Y3QgbWFwbGVfbm9kZSAqbW4gPSBt YXNfbW4obWFzKTsNCisJCXVuc2lnbmVkIGxvbmcgKnBpdm90cyA9IG1hX3Bpdm90cyhtbiwgbXQp Ow0KKwkJdm9pZCBfX3JjdSAqKnNsb3RzID0gbWFfc2xvdHMobW4sIG10KTsNCisJCWNoYXIgY2xl YXIgPSBtdF9zbG90c1ttdF0gLSBibi0+Yl9lbmQgLSAyOw0KKw0KKwkJaWYgKGNsZWFyID4gMCkg ew0KKwkJCW1lbXNldChzbG90cyArIGJuLT5iX2VuZCArIDEsIDAsDQorCQkJICAgICAgIHNpemVv Zih2b2lkICopICogY2xlYXIpOw0KKwkJCW1lbXNldChwaXZvdHMgKyBibi0+Yl9lbmQgKyAxLCAw LA0KKwkJCSAgICAgICBzaXplb2YodW5zaWduZWQgbG9uZyAqKSAqIGNsZWFyKTsNCisJCX0NCisJ fQ0KKw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorLyoNCisgKiBtYXNfY29tbWl0X2Jfbm9kZSgp IC0gQ29tbWl0IHRoZSBiaWcgbm9kZSBpbnRvIHRoZSB0cmVlLg0KKyAqIEBtYXM6IFRoZSBtYXBs ZSBzdGF0ZQ0KKyAqIEBiX25vZGU6IFRoZSBtYXBsZSBiaWcgbm9kZQ0KKyAqIEBlbmQ6IFRoZSBl bmQgb2YgdGhlIGRhdGEuDQorICovDQorc3RhdGljIGlubGluZSBpbnQgbWFzX2NvbW1pdF9iX25v ZGUoc3RydWN0IG1hX3N0YXRlICptYXMsDQorCQkJICAgIHN0cnVjdCBtYXBsZV9iaWdfbm9kZSAq Yl9ub2RlLCB1bnNpZ25lZCBjaGFyIGVuZCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2Rl Ow0KKwl1bnNpZ25lZCBjaGFyIGJfZW5kID0gYl9ub2RlLT5iX2VuZDsNCisJZW51bSBtYXBsZV90 eXBlIGJfdHlwZSA9IGJfbm9kZS0+dHlwZTsNCisNCisJaWYgKChiX2VuZCA8IG10X21pbl9zbG90 c1tiX3R5cGVdKSAmJg0KKwkgICAgKCFtdGVfaXNfcm9vdChtYXMtPm5vZGUpKSAmJiAobWFzX210 X2hlaWdodChtYXMpID4gMSkpDQorCQlyZXR1cm4gbWFzX3JlYmFsYW5jZShtYXMsIGJfbm9kZSk7 DQorDQorCWlmIChiX2VuZCA+PSBtdF9zbG90c1tiX3R5cGVdKQ0KKwkJcmV0dXJuIG1hc19zcGxp dChtYXMsIGJfbm9kZSk7DQorDQorCWlmIChtYXNfcmV1c2Vfbm9kZShtYXMsIGJfbm9kZSwgZW5k KSkNCisJCWdvdG8gcmV1c2Vfbm9kZTsNCisNCisJbWFzX25vZGVfY291bnQobWFzLCAxKTsNCisJ aWYgKG1hc19pc19lcnIobWFzKSkNCisJCXJldHVybiAwOw0KKw0KKwlub2RlID0gbWFzX3BvcF9u b2RlKG1hcyk7DQorCW5vZGUtPnBhcmVudCA9IG1hc19tbihtYXMpLT5wYXJlbnQ7DQorCW1hcy0+ bm9kZSA9IG10X21rX25vZGUobm9kZSwgYl90eXBlKTsNCisJbWFiX21hc19jcChiX25vZGUsIDAs IGJfZW5kLCBtYXMsIHRydWUpOw0KKwlpZiAoYl9lbmQgPCBtdF9waXZvdHNbYl90eXBlXSAtIDEp DQorCQltYV9zZXRfbWV0YShub2RlLCBiX3R5cGUsIDAsIGJfZW5kKTsNCisNCisJbWFzX3JlcGxh Y2UobWFzLCBmYWxzZSk7DQorcmV1c2Vfbm9kZToNCisJbWFzX3VwZGF0ZV9nYXAobWFzKTsNCisJ cmV0dXJuIDE7DQorfQ0KKw0KKy8qDQorICogbWFzX3Jvb3RfZXhwYW5kKCkgLSBFeHBhbmQgYSBy b290IHRvIGEgbm9kZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbnRyeTogVGhl IGVudHJ5IHRvIHN0b3JlIGludG8gdGhlIHRyZWUNCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBt YXNfcm9vdF9leHBhbmQoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5KQ0KK3sNCisJ dm9pZCAqY29udGVudHMgPSBtYXNfcm9vdF9sb2NrZWQobWFzKTsNCisJZW51bSBtYXBsZV90eXBl IHR5cGUgPSBtYXBsZV9sZWFmXzY0Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJdm9p ZCBfX3JjdSAqKnNsb3RzOw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCWludCBzbG90ID0g MDsNCisNCisJbWFzX25vZGVfY291bnQobWFzLCAxKTsNCisJaWYgKHVubGlrZWx5KG1hc19pc19l cnIobWFzKSkpDQorCQlyZXR1cm4gMDsNCisNCisJbm9kZSA9IG1hc19wb3Bfbm9kZShtYXMpOw0K KwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgdHlwZSk7DQorCXNsb3RzID0gbWFfc2xvdHMobm9k ZSwgdHlwZSk7DQorCW5vZGUtPnBhcmVudCA9IG1hX3BhcmVudF9wdHIoDQorCQkgICAgICAoKHVu c2lnbmVkIGxvbmcpbWFzLT50cmVlIHwgTUFfUk9PVF9QQVJFTlQpKTsNCisJbWFzLT5ub2RlID0g bXRfbWtfbm9kZShub2RlLCB0eXBlKTsNCisNCisJaWYgKGNvbnRlbnRzKQ0KKwkJcmN1X2Fzc2ln bl9wb2ludGVyKHNsb3RzW3Nsb3QrK10sIGNvbnRlbnRzKTsNCisNCisJaWYgKCFtYXMtPmluZGV4 ICYmIHNsb3QpDQorCQlzbG90LS07DQorCWVsc2UgaWYgKG1hcy0+aW5kZXggPiAxKQ0KKwkJcGl2 b3RzW3Nsb3QrK10gPSBtYXMtPmluZGV4IC0gMTsNCisNCisJcmN1X2Fzc2lnbl9wb2ludGVyKHNs b3RzW3Nsb3RdLCBlbnRyeSk7DQorCW1hcy0+b2Zmc2V0ID0gc2xvdDsNCisJcGl2b3RzW3Nsb3Rd ID0gbWFzLT5sYXN0Ow0KKwlpZiAobWFzLT5sYXN0ICE9IFVMT05HX01BWCkNCisJCXNsb3QrKzsN CisJbWFzLT5kZXB0aCA9IDE7DQorCW1hc19zZXRfaGVpZ2h0KG1hcyk7DQorDQorCS8qIHN3YXAg dGhlIG5ldyByb290IGludG8gdGhlIHRyZWUgKi8NCisJcmN1X2Fzc2lnbl9wb2ludGVyKG1hcy0+ dHJlZS0+bWFfcm9vdCwgbXRlX21rX3Jvb3QobWFzLT5ub2RlKSk7DQorCW1hX3NldF9tZXRhKG5v ZGUsIG1hcGxlX2xlYWZfNjQsIDAsIHNsb3QpOw0KKwlyZXR1cm4gc2xvdDsNCit9DQorDQorc3Rh dGljIGlubGluZSB2b2lkIG1hc19zdG9yZV9yb290KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lk ICplbnRyeSkNCit7DQorCWlmIChsaWtlbHkoKG1hcy0+bGFzdCAhPSAwKSB8fCAobWFzLT5pbmRl eCAhPSAwKSkpDQorCQltYXNfcm9vdF9leHBhbmQobWFzLCBlbnRyeSk7DQorCWVsc2UgaWYgKCgo dW5zaWduZWQgbG9uZykgKGVudHJ5KSAmIDMpID09IDIpDQorCQltYXNfcm9vdF9leHBhbmQobWFz LCBlbnRyeSk7DQorCWVsc2Ugew0KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG1hcy0+dHJlZS0+bWFf cm9vdCwgZW50cnkpOw0KKwkJbWFzLT5ub2RlID0gTUFTX1NUQVJUOw0KKwl9DQorfQ0KKw0KKy8q DQorICogbWFzX2lzX3NwYW5fd3IoKSAtIENoZWNrIGlmIHRoZSB3cml0ZSBuZWVkcyB0byBiZSB0 cmVhdGVkIGFzIGEgd3JpdGUgdGhhdA0KKyAqIHNwYW5zIHRoZSBub2RlLg0KKyAqIEBtYXM6IFRo ZSBtYXBsZSBzdGF0ZQ0KKyAqIEBwaXY6IFRoZSBwaXZvdCB2YWx1ZSBiZWluZyB3cml0dGVuDQor ICogQHR5cGU6IFRoZSBtYXBsZSBub2RlIHR5cGUNCisgKiBAZW50cnk6IFRoZSBkYXRhIHRvIHdy aXRlDQorICoNCisgKiBTcGFubmluZyB3cml0ZXMgYXJlIHdyaXRlcyB0aGF0IHN0YXJ0IGluIG9u ZSBub2RlIGFuZCBlbmQgaW4gYW5vdGhlciBPUiBpZg0KKyAqIHRoZSB3cml0ZSBvZiBhICVOVUxM IHdpbGwgY2F1c2UgdGhlIG5vZGUgdG8gZW5kIHdpdGggYSAlTlVMTC4NCisgKg0KKyAqIFJldHVy bjogVHJ1ZSBpZiB0aGlzIGlzIGEgc3Bhbm5pbmcgd3JpdGUsIGZhbHNlIG90aGVyd2lzZS4NCisg Ki8NCitzdGF0aWMgYm9vbCBtYXNfaXNfc3Bhbl93cihzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21h cykNCit7DQorCXVuc2lnbmVkIGxvbmcgbWF4Ow0KKwl1bnNpZ25lZCBsb25nIGxhc3QgPSB3cl9t YXMtPm1hcy0+bGFzdDsNCisJdW5zaWduZWQgbG9uZyBwaXYgPSB3cl9tYXMtPnJfbWF4Ow0KKwll bnVtIG1hcGxlX3R5cGUgdHlwZSA9IHdyX21hcy0+dHlwZTsNCisJdm9pZCAqZW50cnkgPSB3cl9t YXMtPmVudHJ5Ow0KKw0KKwkvKiBDb250YWluZWQgaW4gdGhpcyBwaXZvdCAqLw0KKwlpZiAocGl2 ID4gbGFzdCkNCisJCXJldHVybiBmYWxzZTsNCisNCisJbWF4ID0gd3JfbWFzLT5tYXMtPm1heDsN CisJaWYgKHVubGlrZWx5KG1hX2lzX2xlYWYodHlwZSkpKSB7DQorCQkvKiBGaXRzIGluIHRoZSBu b2RlLCBidXQgbWF5IHNwYW4gc2xvdHMuICovDQorCQlpZiAobGFzdCA8IG1heCkNCisJCQlyZXR1 cm4gZmFsc2U7DQorDQorCQkvKiBXcml0ZXMgdG8gdGhlIGVuZCBvZiB0aGUgbm9kZSBidXQgbm90 IG51bGwuICovDQorCQlpZiAoKGxhc3QgPT0gbWF4KSAmJiBlbnRyeSkNCisJCQlyZXR1cm4gZmFs c2U7DQorDQorCQkvKg0KKwkJICogV3JpdGluZyBVTE9OR19NQVggaXMgbm90IGEgc3Bhbm5pbmcg d3JpdGUgcmVnYXJkbGVzcyBvZiB0aGUNCisJCSAqIHZhbHVlIGJlaW5nIHdyaXR0ZW4gYXMgbG9u ZyBhcyB0aGUgcmFuZ2UgZml0cyBpbiB0aGUgbm9kZS4NCisJCSAqLw0KKwkJaWYgKChsYXN0ID09 IFVMT05HX01BWCkgJiYgKGxhc3QgPT0gbWF4KSkNCisJCQlyZXR1cm4gZmFsc2U7DQorCX0gZWxz ZSBpZiAocGl2ID09IGxhc3QpIHsNCisJCWlmIChlbnRyeSkNCisJCQlyZXR1cm4gZmFsc2U7DQor DQorCQkvKiBEZXRlY3Qgc3Bhbm5pbmcgc3RvcmUgd3Igd2FsayAqLw0KKwkJaWYgKChsYXN0ID09 IFVMT05HX01BWCkgJiYgKHdyX21hcy0+bWFzLT5pbmRleCA9PSBVTE9OR19NQVgpKQ0KKwkJCXJl dHVybiBmYWxzZTsNCisJfQ0KKw0KKwl0cmFjZV9tYV93cml0ZShfX2Z1bmNfXywgd3JfbWFzLT5t YXMsIHBpdiwgZW50cnkpOw0KKw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorc3RhdGljIGlubGlu ZSB2b2lkIG1hc193cl93YWxrX2Rlc2NlbmQoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQor ew0KKwl3cl9tYXMtPm1hcy0+ZGVwdGgrKzsNCisJd3JfbWFzLT50eXBlID0gbXRlX25vZGVfdHlw ZSh3cl9tYXMtPm1hcy0+bm9kZSk7DQorCW1hc193cl9ub2RlX3dhbGsod3JfbWFzKTsNCisJd3Jf bWFzLT5zbG90cyA9IG1hX3Nsb3RzKHdyX21hcy0+bm9kZSwgd3JfbWFzLT50eXBlKTsNCit9DQor DQorc3RhdGljIGlubGluZSB2b2lkIG1hc193cl93YWxrX3RyYXZlcnNlKHN0cnVjdCBtYV93cl9z dGF0ZSAqd3JfbWFzKQ0KK3sNCisJd3JfbWFzLT5tYXMtPm1heCA9IHdyX21hcy0+cl9tYXg7DQor CXdyX21hcy0+bWFzLT5taW4gPSB3cl9tYXMtPnJfbWluOw0KKwl3cl9tYXMtPm1hcy0+bm9kZSA9 IHdyX21hcy0+Y29udGVudDsNCisJd3JfbWFzLT5tYXMtPm9mZnNldCA9IDA7DQorfQ0KKy8qDQor ICogbWFzX3dyX3dhbGsoKTogV2FsayB0aGUgdHJlZSBmb3IgYSB3cml0ZS4NCisgKiBAd3JfbWFz OiBUaGUgbWFwbGUgd3JpdGUgc3RhdGUNCisgKg0KKyAqIFVzZXMgbWFzX3Nsb3RfbG9ja2VkKCkg YW5kIGRvZXMgbm90IG5lZWQgdG8gd29ycnkgYWJvdXQgZGVhZCBub2Rlcy4NCisgKg0KKyAqIFJl dHVybjogVHJ1ZSBpZiBpdCdzIGNvbnRhaW5lZCBpbiBhIG5vZGUsIGZhbHNlIG9uIHNwYW5uaW5n IHdyaXRlLg0KKyAqLw0KK3N0YXRpYyBib29sIG1hc193cl93YWxrKHN0cnVjdCBtYV93cl9zdGF0 ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hX3N0YXRlICptYXMgPSB3cl9tYXMtPm1hczsNCisN CisJd2hpbGUgKHRydWUpIHsNCisJCW1hc193cl93YWxrX2Rlc2NlbmQod3JfbWFzKTsNCisJCWlm ICh1bmxpa2VseShtYXNfaXNfc3Bhbl93cih3cl9tYXMpKSkNCisJCQlyZXR1cm4gZmFsc2U7DQor DQorCQl3cl9tYXMtPmNvbnRlbnQgPSBtYXNfc2xvdF9sb2NrZWQobWFzLCB3cl9tYXMtPnNsb3Rz LA0KKwkJCQkJCSAgbWFzLT5vZmZzZXQpOw0KKwkJaWYgKG1hX2lzX2xlYWYod3JfbWFzLT50eXBl KSkNCisJCQlyZXR1cm4gdHJ1ZTsNCisNCisJCW1hc193cl93YWxrX3RyYXZlcnNlKHdyX21hcyk7 DQorCX0NCisNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KK3N0YXRpYyBib29sIG1hc193cl93YWxr X2luZGV4KHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hX3N0YXRl ICptYXMgPSB3cl9tYXMtPm1hczsNCisNCisJd2hpbGUgKHRydWUpIHsNCisJCW1hc193cl93YWxr X2Rlc2NlbmQod3JfbWFzKTsNCisJCXdyX21hcy0+Y29udGVudCA9IG1hc19zbG90X2xvY2tlZCht YXMsIHdyX21hcy0+c2xvdHMsDQorCQkJCQkJICBtYXMtPm9mZnNldCk7DQorCQlpZiAobWFfaXNf bGVhZih3cl9tYXMtPnR5cGUpKQ0KKwkJCXJldHVybiB0cnVlOw0KKwkJbWFzX3dyX3dhbGtfdHJh dmVyc2Uod3JfbWFzKTsNCisNCisJfQ0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorLyoNCisgKiBtYXNf ZXh0ZW5kX3NwYW5uaW5nX251bGwoKSAtIEV4dGVuZCBhIHN0b3JlIG9mIGEgJU5VTEwgdG8gaW5j bHVkZSBzdXJyb3VuZGluZyAlTlVMTHMuDQorICogQGxfd3JfbWFzOiBUaGUgbGVmdCBtYXBsZSB3 cml0ZSBzdGF0ZQ0KKyAqIEByX3dyX21hczogVGhlIHJpZ2h0IG1hcGxlIHdyaXRlIHN0YXRlDQor ICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19leHRlbmRfc3Bhbm5pbmdfbnVsbChzdHJ1Y3Qg bWFfd3Jfc3RhdGUgKmxfd3JfbWFzLA0KKwkJCQkJICAgIHN0cnVjdCBtYV93cl9zdGF0ZSAqcl93 cl9tYXMpDQorew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKnJfbWFzID0gcl93cl9tYXMtPm1hczsNCisJ c3RydWN0IG1hX3N0YXRlICpsX21hcyA9IGxfd3JfbWFzLT5tYXM7DQorCXVuc2lnbmVkIGNoYXIg bF9zbG90Ow0KKw0KKwlsX3Nsb3QgPSBsX21hcy0+b2Zmc2V0Ow0KKwlpZiAoIWxfd3JfbWFzLT5j b250ZW50KQ0KKwkJbF9tYXMtPmluZGV4ID0gbF93cl9tYXMtPnJfbWluOw0KKw0KKwlpZiAoKGxf bWFzLT5pbmRleCA9PSBsX3dyX21hcy0+cl9taW4pICYmDQorCQkgKGxfc2xvdCAmJg0KKwkJICAh bWFzX3Nsb3RfbG9ja2VkKGxfbWFzLCBsX3dyX21hcy0+c2xvdHMsIGxfc2xvdCAtIDEpKSkgew0K KwkJaWYgKGxfc2xvdCA+IDEpDQorCQkJbF9tYXMtPmluZGV4ID0gbF93cl9tYXMtPnBpdm90c1ts X3Nsb3QgLSAyXSArIDE7DQorCQllbHNlDQorCQkJbF9tYXMtPmluZGV4ID0gbF9tYXMtPm1pbjsN CisNCisJCWxfbWFzLT5vZmZzZXQgPSBsX3Nsb3QgLSAxOw0KKwl9DQorDQorCWlmICghcl93cl9t YXMtPmNvbnRlbnQpIHsNCisJCWlmIChyX21hcy0+bGFzdCA8IHJfd3JfbWFzLT5yX21heCkNCisJ CQlyX21hcy0+bGFzdCA9IHJfd3JfbWFzLT5yX21heDsNCisJCXJfbWFzLT5vZmZzZXQrKzsNCisJ fSBlbHNlIGlmICgocl9tYXMtPmxhc3QgPT0gcl93cl9tYXMtPnJfbWF4KSAmJg0KKwkgICAgKHJf bWFzLT5sYXN0IDwgcl9tYXMtPm1heCkgJiYNCisJICAgICFtYXNfc2xvdF9sb2NrZWQocl9tYXMs IHJfd3JfbWFzLT5zbG90cywgcl9tYXMtPm9mZnNldCArIDEpKSB7DQorCQlyX21hcy0+bGFzdCA9 IG1hc19zYWZlX3Bpdm90KHJfbWFzLCByX3dyX21hcy0+cGl2b3RzLA0KKwkJCQkJICAgICByX3dy X21hcy0+dHlwZSwgcl9tYXMtPm9mZnNldCArIDEpOw0KKwkJcl9tYXMtPm9mZnNldCsrOw0KKwl9 DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWFzX3N0YXRlX3dhbGsoc3RydWN0IG1hX3N0 YXRlICptYXMpDQorew0KKwl2b2lkICplbnRyeTsNCisNCisJZW50cnkgPSBtYXNfc3RhcnQobWFz KTsNCisJaWYgKG1hc19pc19ub25lKG1hcykpDQorCQlnb3RvIG5vdF9mb3VuZDsNCisNCisJaWYg KG1hc19pc19wdHIobWFzKSkgew0KKwkJaWYgKCFtYXMtPmluZGV4KQ0KKwkJCXJldHVybiBlbnRy eTsNCisNCisJCWdvdG8gbm90X2ZvdW5kOw0KKwl9DQorDQorCXJldHVybiBtdHJlZV9yYW5nZV93 YWxrKG1hcyk7DQorDQorbm90X2ZvdW5kOg0KKwltYXMtPm9mZnNldCA9IE1BUExFX05PREVfU0xP VFM7DQorCXJldHVybiBOVUxMOw0KK30NCisvKg0KKyAqIG10cmVlX2xvb2t1cF93YWxrKCkgLSBJ bnRlcm5hbCBxdWljayBsb29rdXAgdGhhdCBkb2VzIG5vdCBrZWVwIG1hcGxlIHN0YXRlIHVwDQor ICogdG8gZGF0ZS4NCisgKg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIE5v dGU6IExlYXZlcyBtYXMgaW4gdW5kZXNpcmFibGUgc3RhdGUuDQorICogUmV0dXJuOiBUaGUgZW50 cnkgZm9yIEBtYXMtPmluZGV4IG9yICVOVUxMIG9uIGRlYWQgbm9kZS4NCisgKi8NCitzdGF0aWMg aW5saW5lIHZvaWQgKm10cmVlX2xvb2t1cF93YWxrKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sN CisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJc3Ry dWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbmV4dDsNCisJZW51 bSBtYXBsZV90eXBlIHR5cGU7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdW5zaWduZWQgY2hh ciBlbmQ7DQorCXVuc2lnbmVkIGxvbmcgbWF4Ow0KKw0KKwluZXh0ID0gbWFzLT5ub2RlOw0KKwlt YXggPSBVTE9OR19NQVg7DQorCWRvIHsNCisJCW9mZnNldCA9IDA7DQorCQlub2RlID0gbXRlX3Rv X25vZGUobmV4dCk7DQorCQl0eXBlID0gbXRlX25vZGVfdHlwZShuZXh0KTsNCisJCXBpdm90cyA9 IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUobm9k ZSkpKQ0KKwkJCWdvdG8gZGVhZF9ub2RlOw0KKw0KKwkJaWYgKHBpdm90c1tvZmZzZXRdID49IG1h cy0+aW5kZXgpDQorCQkJZ290byBuZXh0Ow0KKw0KKwkJZW5kID0gbWFfZGF0YV9lbmQobm9kZSwg dHlwZSwgcGl2b3RzLCBtYXgpOw0KKwkJZG8gew0KKwkJCW9mZnNldCsrOw0KKwkJfSB3aGlsZSgo b2Zmc2V0IDwgZW5kKSAmJiAocGl2b3RzW29mZnNldF0gPCBtYXMtPmluZGV4KSk7DQorDQorCQlp ZiAobGlrZWx5KG9mZnNldCA+IGVuZCkpDQorCQkJbWF4ID0gcGl2b3RzW29mZnNldF07DQorDQor bmV4dDoNCisJCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgdHlwZSk7DQorCQluZXh0ID0gbXRfc2xv dChtYXMtPnRyZWUsIHNsb3RzLCBvZmZzZXQpOw0KKwkJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9k ZShub2RlKSkpDQorCQkJZ290byBkZWFkX25vZGU7DQorCX0gd2hpbGUgKCFtYV9pc19sZWFmKHR5 cGUpKTsNCisNCisJcmV0dXJuICh2b2lkICopIG5leHQ7DQorDQorZGVhZF9ub2RlOg0KKwltYXNf cmVzZXQobWFzKTsNCisJcmV0dXJuIE5VTEw7DQorfQ0KKw0KKy8qDQorICogbWFzX25ld19yb290 KCkgLSBDcmVhdGUgYSBuZXcgcm9vdCBub2RlIHRoYXQgb25seSBjb250YWlucyB0aGUgZW50cnkg cGFzc2VkDQorICogaW4uDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGVudHJ5OiBU aGUgZW50cnkgdG8gc3RvcmUuDQorICoNCisgKiBPbmx5IHZhbGlkIHdoZW4gdGhlIGluZGV4ID09 IDAgYW5kIHRoZSBsYXN0ID09IFVMT05HX01BWA0KKyAqDQorICogUmV0dXJuIDAgb24gZXJyb3Is IDEgb24gc3VjY2Vzcy4NCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBtYXNfbmV3X3Jvb3Qoc3Ry dWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5KQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vub2Rl ICpyb290ID0gbWFzX3Jvb3RfbG9ja2VkKG1hcyk7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlID0g bWFwbGVfbGVhZl82NDsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXZvaWQgX19yY3Ug KipzbG90czsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKw0KKwlpZiAoIWVudHJ5ICYmICFt YXMtPmluZGV4ICYmIG1hcy0+bGFzdCA9PSBVTE9OR19NQVgpIHsNCisJCW1hcy0+ZGVwdGggPSAw Ow0KKwkJbWFzX3NldF9oZWlnaHQobWFzKTsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcihtYXMtPnRy ZWUtPm1hX3Jvb3QsIGVudHJ5KTsNCisJCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisJCWdvdG8g ZG9uZTsNCisJfQ0KKw0KKwltYXNfbm9kZV9jb3VudChtYXMsIDEpOw0KKwlpZiAobWFzX2lzX2Vy cihtYXMpKQ0KKwkJcmV0dXJuIDA7DQorDQorCW5vZGUgPSBtYXNfcG9wX25vZGUobWFzKTsNCisJ cGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIHR5cGUpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUs IHR5cGUpOw0KKwlub2RlLT5wYXJlbnQgPSBtYV9wYXJlbnRfcHRyKA0KKwkJICAgICAgKCh1bnNp Z25lZCBsb25nKW1hcy0+dHJlZSB8IE1BX1JPT1RfUEFSRU5UKSk7DQorCW1hcy0+bm9kZSA9IG10 X21rX25vZGUobm9kZSwgdHlwZSk7DQorCXJjdV9hc3NpZ25fcG9pbnRlcihzbG90c1swXSwgZW50 cnkpOw0KKwlwaXZvdHNbMF0gPSBtYXMtPmxhc3Q7DQorCW1hcy0+ZGVwdGggPSAxOw0KKwltYXNf c2V0X2hlaWdodChtYXMpOw0KKwlyY3VfYXNzaWduX3BvaW50ZXIobWFzLT50cmVlLT5tYV9yb290 LCBtdGVfbWtfcm9vdChtYXMtPm5vZGUpKTsNCisNCitkb25lOg0KKwlpZiAoeGFfaXNfbm9kZShy b290KSkNCisJCW10ZV9kZXN0cm95X3dhbGsocm9vdCwgbWFzLT50cmVlKTsNCisNCisJcmV0dXJu IDE7DQorfQ0KKy8qDQorICogbWFzX3NwYW5uaW5nX3N0b3JlKCkgLSBDcmVhdGUgYSBzdWJ0cmVl IHdpdGggdGhlIHN0b3JlIG9wZXJhdGlvbiBjb21wbGV0ZWQNCisgKiBhbmQgbmV3IG5vZGVzIHdo ZXJlIG5lY2Vzc2FyeSwgdGhlbiBwbGFjZSB0aGUgc3ViLXRyZWUgaW4gdGhlIGFjdHVhbCB0cmVl Lg0KKyAqIE5vdGUgdGhhdCBtYXMgaXMgZXhwZWN0ZWQgdG8gcG9pbnQgdG8gdGhlIG5vZGUgd2hp Y2ggY2F1c2VkIHRoZSBzdG9yZSB0bw0KKyAqIHNwYW4uDQorICogQHdyX21hczogVGhlIG1hcGxl IHdyaXRlIHN0YXRlDQorICoNCisgKiBSZXR1cm46IDAgb24gZXJyb3IsIHBvc2l0aXZlIG9uIHN1 Y2Nlc3MuDQorICovDQorc3RhdGljIGlubGluZSBpbnQgbWFzX3dyX3NwYW5uaW5nX3N0b3JlKHN0 cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hcGxlX3N1YnRyZWVfc3Rh dGUgbWFzdDsNCisJc3RydWN0IG1hcGxlX2JpZ19ub2RlIGJfbm9kZTsNCisJc3RydWN0IG1hX3N0 YXRlICptYXM7DQorCXVuc2lnbmVkIGNoYXIgaGVpZ2h0Ow0KKw0KKwkvKiBMZWZ0IGFuZCBSaWdo dCBzaWRlIG9mIHNwYW5uaW5nIHN0b3JlICovDQorCU1BX1NUQVRFKGxfbWFzLCBOVUxMLCAwLCAw KTsNCisJTUFfU1RBVEUocl9tYXMsIE5VTEwsIDAsIDApOw0KKw0KKwlNQV9XUl9TVEFURShyX3dy X21hcywgJnJfbWFzLCB3cl9tYXMtPmVudHJ5KTsNCisJTUFfV1JfU1RBVEUobF93cl9tYXMsICZs X21hcywgd3JfbWFzLT5lbnRyeSk7DQorDQorCS8qDQorCSAqIEEgc3RvcmUgb3BlcmF0aW9uIHRo YXQgc3BhbnMgbXVsdGlwbGUgbm9kZXMgaXMgY2FsbGVkIGEgc3Bhbm5pbmcNCisJICogc3RvcmUg YW5kIGlzIGhhbmRsZWQgZWFybHkgaW4gdGhlIHN0b3JlIGNhbGwgc3RhY2sgYnkgdGhlIGZ1bmN0 aW9uDQorCSAqIG1hc19pc19zcGFuX3dyKCkuICBXaGVuIGEgc3Bhbm5pbmcgc3RvcmUgaXMgaWRl bnRpZmllZCwgdGhlIG1hcGxlDQorCSAqIHN0YXRlIGlzIGR1cGxpY2F0ZWQuICBUaGUgZmlyc3Qg bWFwbGUgc3RhdGUgd2Fsa3MgdGhlIGxlZnQgdHJlZSBwYXRoDQorCSAqIHRvIGBgaW5kZXhgYCwg dGhlIGR1cGxpY2F0ZSB3YWxrcyB0aGUgcmlnaHQgdHJlZSBwYXRoIHRvIGBgbGFzdGBgLg0KKwkg KiBUaGUgZGF0YSBpbiB0aGUgdHdvIG5vZGVzIGFyZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIG5v ZGUsIHR3byBub2RlcywNCisJICogb3IgcG9zc2libHkgdGhyZWUgbm9kZXMgKHNlZSB0aGUgMy13 YXkgc3BsaXQgYWJvdmUpLiAgQSBgYE5VTExgYA0KKwkgKiB3cml0dGVuIHRvIHRoZSBsYXN0IGVu dHJ5IG9mIGEgbm9kZSBpcyBjb25zaWRlcmVkIGEgc3Bhbm5pbmcgc3RvcmUgYXMNCisJICogYSBy ZWJhbGFuY2UgaXMgcmVxdWlyZWQgZm9yIHRoZSBvcGVyYXRpb24gdG8gY29tcGxldGUgYW5kIGFu IG92ZXJmbG93DQorCSAqIG9mIGRhdGEgbWF5IGhhcHBlbi4NCisJICovDQorCW1hcyA9IHdyX21h cy0+bWFzOw0KKwl0cmFjZV9tYV9vcChfX2Z1bmNfXywgbWFzKTsNCisNCisJaWYgKHVubGlrZWx5 KCFtYXMtPmluZGV4ICYmIG1hcy0+bGFzdCA9PSBVTE9OR19NQVgpKQ0KKwkJcmV0dXJuIG1hc19u ZXdfcm9vdChtYXMsIHdyX21hcy0+ZW50cnkpOw0KKwkvKg0KKwkgKiBOb2RlIHJlYmFsYW5jaW5n IG1heSBvY2N1ciBkdWUgdG8gdGhpcyBzdG9yZSwgc28gdGhlcmUgbWF5IGJlIHR3byBuZXcNCisJ ICogZW50cmllcyBwZXIgbGV2ZWwgcGx1cyBhIG5ldyByb290Lg0KKwkgKi8NCisJaGVpZ2h0ID0g bWFzX210X2hlaWdodChtYXMpOw0KKwltYXNfbm9kZV9jb3VudChtYXMsIDEgKyBoZWlnaHQgKiAz KTsNCisJaWYgKG1hc19pc19lcnIobWFzKSkNCisJCXJldHVybiAwOw0KKw0KKwkvKg0KKwkgKiBT ZXQgdXAgcmlnaHQgc2lkZS4gIE5lZWQgdG8gZ2V0IHRvIHRoZSBuZXh0IG9mZnNldCBhZnRlciB0 aGUgc3Bhbm5pbmcNCisJICogc3RvcmUgdG8gZW5zdXJlIGl0J3Mgbm90IE5VTEwgYW5kIHRvIGNv bWJpbmUgYm90aCB0aGUgbmV4dCBub2RlIGFuZA0KKwkgKiB0aGUgbm9kZSB3aXRoIHRoZSBzdGFy dCB0b2dldGhlci4NCisJICovDQorCXJfbWFzID0gKm1hczsNCisJLyogQXZvaWQgb3ZlcmZsb3cs IHdhbGsgdG8gbmV4dCBzbG90IGluIHRoZSB0cmVlLiAqLw0KKwlpZiAocl9tYXMubGFzdCArIDEp DQorCQlyX21hcy5sYXN0Kys7DQorDQorCXJfbWFzLmluZGV4ID0gcl9tYXMubGFzdDsNCisJbWFz X3dyX3dhbGtfaW5kZXgoJnJfd3JfbWFzKTsNCisJcl9tYXMubGFzdCA9IHJfbWFzLmluZGV4ID0g bWFzLT5sYXN0Ow0KKw0KKwkvKiBTZXQgdXAgbGVmdCBzaWRlLiAqLw0KKwlsX21hcyA9ICptYXM7 DQorCW1hc193cl93YWxrX2luZGV4KCZsX3dyX21hcyk7DQorDQorCWlmICghd3JfbWFzLT5lbnRy eSkgew0KKwkJbWFzX2V4dGVuZF9zcGFubmluZ19udWxsKCZsX3dyX21hcywgJnJfd3JfbWFzKTsN CisJCW1hcy0+b2Zmc2V0ID0gbF9tYXMub2Zmc2V0Ow0KKwkJbWFzLT5pbmRleCA9IGxfbWFzLmlu ZGV4Ow0KKwkJbWFzLT5sYXN0ID0gbF9tYXMubGFzdCA9IHJfbWFzLmxhc3Q7DQorCX0NCisNCisJ LyogQ29weSBsX21hcyBhbmQgc3RvcmUgdGhlIHZhbHVlIGluIGJfbm9kZS4gKi8NCisJYl9ub2Rl LmJfZW5kID0gbWFzX3N0b3JlX2Jfbm9kZSgmbF93cl9tYXMsICZiX25vZGUsIGxfd3JfbWFzLm5v ZGVfZW5kKTsNCisJLyogQ29weSByX21hcyBpbnRvIGJfbm9kZS4gKi8NCisJbWFzX21hYl9jcCgm cl9tYXMsIHJfbWFzLm9mZnNldCwgcl93cl9tYXMubm9kZV9lbmQsDQorCQkgICAmYl9ub2RlLCBi X25vZGUuYl9lbmQgKyAxKTsNCisJLyogU3RvcCBzcGFubmluZyBzZWFyY2hlcyBieSBzZWFyY2hp bmcgZm9yIGp1c3QgaW5kZXguICovDQorCWxfbWFzLmluZGV4ID0gbF9tYXMubGFzdCA9IG1hcy0+ aW5kZXg7DQorDQorCW1hc3QuYm4gPSAmYl9ub2RlOw0KKwltYXN0Lm9yaWdfbCA9ICZsX21hczsN CisJbWFzdC5vcmlnX3IgPSAmcl9tYXM7DQorCS8qIENvbWJpbmUgbF9tYXMgYW5kIHJfbWFzIGFu ZCBzcGxpdCB0aGVtIHVwIGV2ZW5seSBhZ2Fpbi4gKi8NCisJcmV0dXJuIG1hc19zcGFubmluZ19y ZWJhbGFuY2UobWFzLCAmbWFzdCwgaGVpZ2h0ICsgMSk7DQorfQ0KKw0KKy8qDQorICogbWFzX3dy X25vZGVfc3RvcmUoKSAtIEF0dGVtcHQgdG8gc3RvcmUgdGhlIHZhbHVlIGluIGEgbm9kZQ0KKyAq IEB3cl9tYXM6IFRoZSBtYXBsZSB3cml0ZSBzdGF0ZQ0KKyAqDQorICogQXR0ZW1wdHMgdG8gcmV1 c2UgdGhlIG5vZGUsIGJ1dCBtYXkgYWxsb2NhdGUuDQorICoNCisgKiBSZXR1cm46IFRydWUgaWYg c3RvcmVkLCBmYWxzZSBvdGhlcndpc2UNCisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3dy X25vZGVfc3RvcmUoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1Y3QgbWFf c3RhdGUgKm1hcyA9IHdyX21hcy0+bWFzOw0KKwl2b2lkIF9fcmN1ICoqZHN0X3Nsb3RzOw0KKwl1 bnNpZ25lZCBsb25nICpkc3RfcGl2b3RzOw0KKwl1bnNpZ25lZCBjaGFyIGRzdF9vZmZzZXQ7DQor CXVuc2lnbmVkIGNoYXIgbmV3X2VuZCA9IHdyX21hcy0+bm9kZV9lbmQ7DQorCXVuc2lnbmVkIGNo YXIgb2Zmc2V0Ow0KKwl1bnNpZ25lZCBjaGFyIG5vZGVfc2xvdHMgPSBtdF9zbG90c1t3cl9tYXMt PnR5cGVdOw0KKwl1bnNpZ25lZCBjaGFyIG5vZGVfcGl2b3RzID0gbXRfcGl2b3RzW3dyX21hcy0+ dHlwZV07DQorCXN0cnVjdCBtYXBsZV9ub2RlIHJldXNlLCAqbmV3bm9kZTsNCisJdW5zaWduZWQg Y2hhciBjb3B5X3NpemUsIG1heF9waXYgPSBtdF9waXZvdHNbd3JfbWFzLT50eXBlXTsNCisNCisJ b2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCWlmIChtYXMtPmxhc3QgPT0gd3JfbWFzLT5yX21heCkg ew0KKwkJLyogcnVucyByaWdodCB0byB0aGUgZW5kIG9mIHRoZSBub2RlICovDQorCQlpZiAobWFz LT5sYXN0ID09IG1hcy0+bWF4KQ0KKwkJCW5ld19lbmQgPSBvZmZzZXQ7DQorCQkvKiBkb24ndCBj b3B5IHRoaXMgb2Zmc2V0ICovDQorCQl3cl9tYXMtPm9mZnNldF9lbmQrKzsNCisJfSBlbHNlIGlm IChtYXMtPmxhc3QgPCB3cl9tYXMtPnJfbWF4KSB7DQorCQkvKiBuZXcgcmFuZ2UgZW5kcyBpbiB0 aGlzIHJhbmdlICovDQorCQlpZiAodW5saWtlbHkod3JfbWFzLT5yX21heCA9PSBVTE9OR19NQVgp KQ0KKwkJCW1hc19idWxrX3JlYmFsYW5jZShtYXMsIHdyX21hcy0+bm9kZV9lbmQsIHdyX21hcy0+ dHlwZSk7DQorDQorCQluZXdfZW5kKys7DQorCX0gZWxzZSB7DQorCQlpZiAobWFzX3NhZmVfcGl2 b3QobWFzLCB3cl9tYXMtPnBpdm90cywgd3JfbWFzLT5vZmZzZXRfZW5kLA0KKwkJCQkgICB3cl9t YXMtPnR5cGUpID09IG1hcy0+bGFzdCkNCisJCQl3cl9tYXMtPm9mZnNldF9lbmQrKzsNCisNCisJ CW5ld19lbmQgLT0gd3JfbWFzLT5vZmZzZXRfZW5kIC0gb2Zmc2V0IC0gMTsNCisJfQ0KKw0KKwkv KiBuZXcgcmFuZ2Ugc3RhcnRzIHdpdGhpbiBhIHJhbmdlICovDQorCWlmICh3cl9tYXMtPnJfbWlu IDwgbWFzLT5pbmRleCkNCisJCW5ld19lbmQrKzsNCisNCisJLyogTm90IGVub3VnaCByb29tICov DQorCWlmIChuZXdfZW5kID49IG5vZGVfc2xvdHMpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCS8q IE5vdCBlbm91Z2ggZGF0YS4gKi8NCisJaWYgKCFtdGVfaXNfcm9vdChtYXMtPm5vZGUpICYmIChu ZXdfZW5kIDw9IG10X21pbl9zbG90c1t3cl9tYXMtPnR5cGVdKSAmJg0KKwkgICAgIShtYXMtPm1h c19mbGFncyAmIE1BX1NUQVRFX0JVTEspKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0KKwkvKiBzZXQg dXAgbm9kZS4gKi8NCisJaWYgKG10X2luX3JjdShtYXMtPnRyZWUpKSB7DQorCQltYXNfbm9kZV9j b3VudChtYXMsIDEpOw0KKwkJaWYgKG1hc19pc19lcnIobWFzKSkNCisJCQlyZXR1cm4gZmFsc2U7 DQorDQorCQluZXdub2RlID0gbWFzX3BvcF9ub2RlKG1hcyk7DQorCX0gZWxzZSB7DQorCQltZW1z ZXQoJnJldXNlLCAwLCBzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUpKTsNCisJCW5ld25vZGUgPSAm cmV1c2U7DQorCX0NCisNCisJbmV3bm9kZS0+cGFyZW50ID0gbWFzX21uKG1hcyktPnBhcmVudDsN CisJZHN0X3Bpdm90cyA9IG1hX3Bpdm90cyhuZXdub2RlLCB3cl9tYXMtPnR5cGUpOw0KKwlkc3Rf c2xvdHMgPSBtYV9zbG90cyhuZXdub2RlLCB3cl9tYXMtPnR5cGUpOw0KKwkvKiBDb3B5IGZyb20g c3RhcnQgdG8gaW5zZXJ0IHBvaW50ICovDQorCW1lbWNweShkc3RfcGl2b3RzLCB3cl9tYXMtPnBp dm90cywgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogKG9mZnNldCArIDEpKTsNCisJbWVtY3B5KGRz dF9zbG90cywgd3JfbWFzLT5zbG90cywgc2l6ZW9mKHZvaWQgKikgKiAob2Zmc2V0ICsgMSkpOw0K Kwlkc3Rfb2Zmc2V0ID0gb2Zmc2V0Ow0KKw0KKwkvKiBIYW5kbGUgaW5zZXJ0IG9mIG5ldyByYW5n ZSBzdGFydGluZyBhZnRlciBvbGQgcmFuZ2UgKi8NCisJaWYgKHdyX21hcy0+cl9taW4gPCBtYXMt PmluZGV4KSB7DQorCQltYXMtPm9mZnNldCsrOw0KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGRzdF9z bG90c1tkc3Rfb2Zmc2V0XSwgd3JfbWFzLT5jb250ZW50KTsNCisJCWRzdF9waXZvdHNbZHN0X29m ZnNldCsrXSA9IG1hcy0+aW5kZXggLSAxOw0KKwl9DQorDQorCS8qIFN0b3JlIHRoZSBuZXcgZW50 cnkgYW5kIHJhbmdlIGVuZC4gKi8NCisJaWYgKGRzdF9vZmZzZXQgPCBtYXhfcGl2KQ0KKwkJZHN0 X3Bpdm90c1tkc3Rfb2Zmc2V0XSA9IG1hcy0+bGFzdDsNCisJbWFzLT5vZmZzZXQgPSBkc3Rfb2Zm c2V0Ow0KKwlyY3VfYXNzaWduX3BvaW50ZXIoZHN0X3Nsb3RzW2RzdF9vZmZzZXQrK10sIHdyX21h cy0+ZW50cnkpOw0KKw0KKwkvKiB0aGlzIHJhbmdlIHdyb3RlIHRvIHRoZSBlbmQgb2YgdGhlIG5v ZGUuICovDQorCWlmICh3cl9tYXMtPm9mZnNldF9lbmQgPiB3cl9tYXMtPm5vZGVfZW5kKQ0KKwkJ Z290byBkb25lOw0KKw0KKwkvKiBDb3B5IHRvIHRoZSBlbmQgb2Ygbm9kZSBpZiBuZWNlc3Nhcnku ICovDQorCWNvcHlfc2l6ZSA9IHdyX21hcy0+bm9kZV9lbmQgLSB3cl9tYXMtPm9mZnNldF9lbmQg KyAxOw0KKwltZW1jcHkoZHN0X3Nsb3RzICsgZHN0X29mZnNldCwgd3JfbWFzLT5zbG90cyArIHdy X21hcy0+b2Zmc2V0X2VuZCwNCisJICAgICAgIHNpemVvZih2b2lkICopICogY29weV9zaXplKTsN CisJaWYgKGRzdF9vZmZzZXQgPCBtYXhfcGl2KSB7DQorCQlpZiAoY29weV9zaXplID4gbWF4X3Bp diAtIGRzdF9vZmZzZXQpDQorCQkJY29weV9zaXplID0gbWF4X3BpdiAtIGRzdF9vZmZzZXQ7DQor CQltZW1jcHkoZHN0X3Bpdm90cyArIGRzdF9vZmZzZXQsIHdyX21hcy0+cGl2b3RzICsgd3JfbWFz LT5vZmZzZXRfZW5kLA0KKwkJICAgICAgIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIGNvcHlfc2l6 ZSk7DQorCX0NCisNCitkb25lOg0KKwlpZiAoKHdyX21hcy0+bm9kZV9lbmQgPT0gbm9kZV9zbG90 cyAtIDEpICYmIChuZXdfZW5kIDwgbm9kZV9zbG90cyAtIDEpKQ0KKwkJZHN0X3Bpdm90c1tuZXdf ZW5kXSA9IG1hcy0+bWF4Ow0KKw0KKwlpZiAoIWRzdF9waXZvdHNbbm9kZV9waXZvdHMgLSAxXSB8 fCBkc3RfcGl2b3RzW25vZGVfcGl2b3RzIC0gMV0gPT0gbWFzLT5tYXgpIHsNCisJCWlmIChkc3Rf cGl2b3RzW25ld19lbmRdICYmIGRzdF9waXZvdHNbbmV3X2VuZF0gPCBtYXMtPm1heCkNCisJCQlu ZXdfZW5kKys7DQorCQltYV9zZXRfbWV0YShuZXdub2RlLCBtYXBsZV9sZWFmXzY0LCAwLCBuZXdf ZW5kKTsNCisJfQ0KKw0KKwlpZiAobXRfaW5fcmN1KG1hcy0+dHJlZSkpIHsNCisJCW1hcy0+bm9k ZSA9IG10X21rX25vZGUobmV3bm9kZSwgd3JfbWFzLT50eXBlKTsNCisJCW1hc19yZXBsYWNlKG1h cywgZmFsc2UpOw0KKwl9IGVsc2Ugew0KKwkJbWVtY3B5KHdyX21hcy0+bm9kZSwgbmV3bm9kZSwg c2l6ZW9mKHN0cnVjdCBtYXBsZV9ub2RlKSk7DQorCX0NCisJdHJhY2VfbWFfd3JpdGUoX19mdW5j X18sIG1hcywgMCwgd3JfbWFzLT5lbnRyeSk7DQorCW1hc191cGRhdGVfZ2FwKG1hcyk7DQorCXJl dHVybiB0cnVlOw0KK30NCisNCisvKg0KKyAqIG1hc193cl9zbG90X3N0b3JlOiBBdHRlbXB0IHRv IHN0b3JlIGEgdmFsdWUgaW4gYSBzbG90Lg0KKyAqIEB3cl9tYXM6IHRoZSBtYXBsZSB3cml0ZSBz dGF0ZQ0KKyAqDQorICogUmV0dXJuOiBUcnVlIGlmIHN0b3JlZCwgZmFsc2Ugb3RoZXJ3aXNlDQor ICovDQorc3RhdGljIGlubGluZSBib29sIG1hc193cl9zbG90X3N0b3JlKHN0cnVjdCBtYV93cl9z dGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hX3N0YXRlICptYXMgPSB3cl9tYXMtPm1hczsN CisJdW5zaWduZWQgbG9uZyBsbWF4OyAvKiBMb2dpY2FsIG1heC4gKi8NCisJdW5zaWduZWQgY2hh ciBvZmZzZXQgPSBtYXMtPm9mZnNldDsNCisNCisJaWYgKCh3cl9tYXMtPnJfbWF4ID4gbWFzLT5s YXN0KSAmJiAoKHdyX21hcy0+cl9taW4gIT0gbWFzLT5pbmRleCkgfHwNCisJCQkJICAob2Zmc2V0 ICE9IHdyX21hcy0+bm9kZV9lbmQpKSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJaWYgKG9mZnNl dCA9PSB3cl9tYXMtPm5vZGVfZW5kIC0gMSkNCisJCWxtYXggPSBtYXMtPm1heDsNCisJZWxzZQ0K KwkJbG1heCA9IHdyX21hcy0+cGl2b3RzW29mZnNldCArIDFdOw0KKw0KKwkvKiBnb2luZyB0byBv dmVyd3JpdGUgdG9vIG1hbnkgc2xvdHMuICovDQorCWlmIChsbWF4IDwgbWFzLT5sYXN0KQ0KKwkJ cmV0dXJuIGZhbHNlOw0KKw0KKwlpZiAod3JfbWFzLT5yX21pbiA9PSBtYXMtPmluZGV4KSB7DQor CQkvKiBvdmVyd3JpdGluZyB0d28gb3IgbW9yZSByYW5nZXMgd2l0aCBvbmUuICovDQorCQlpZiAo bG1heCA9PSBtYXMtPmxhc3QpDQorCQkJcmV0dXJuIGZhbHNlOw0KKw0KKwkJLyogT3ZlcndyaXRp bmcgYWxsIG9mIG9mZnNldCBhbmQgYSBwb3J0aW9uIG9mIG9mZnNldCArIDEuICovDQorCQlyY3Vf YXNzaWduX3BvaW50ZXIod3JfbWFzLT5zbG90c1tvZmZzZXRdLCB3cl9tYXMtPmVudHJ5KTsNCisJ CXdyX21hcy0+cGl2b3RzW29mZnNldF0gPSBtYXMtPmxhc3Q7DQorCQlnb3RvIGRvbmU7DQorCX0N CisNCisJLyogRG9lc24ndCBlbmQgb24gdGhlIG5leHQgcmFuZ2UgZW5kLiAqLw0KKwlpZiAobG1h eCAhPSBtYXMtPmxhc3QpDQorCQlyZXR1cm4gZmFsc2U7DQorDQorCS8qIE92ZXJ3cml0aW5nIGEg cG9ydGlvbiBvZiBvZmZzZXQgYW5kIGFsbCBvZiBvZmZzZXQgKyAxICovDQorCWlmICgob2Zmc2V0 ICsgMSA8IG10X3Bpdm90c1t3cl9tYXMtPnR5cGVdKSAmJg0KKwkgICAgKHdyX21hcy0+ZW50cnkg fHwgd3JfbWFzLT5waXZvdHNbb2Zmc2V0ICsgMV0pKQ0KKwkJCXdyX21hcy0+cGl2b3RzW29mZnNl dCArIDFdID0gbWFzLT5sYXN0Ow0KKw0KKwlyY3VfYXNzaWduX3BvaW50ZXIod3JfbWFzLT5zbG90 c1tvZmZzZXQgKyAxXSwgd3JfbWFzLT5lbnRyeSk7DQorCXdyX21hcy0+cGl2b3RzW29mZnNldF0g PSBtYXMtPmluZGV4IC0gMTsNCisJbWFzLT5vZmZzZXQrKzsgLyogS2VlcCBtYXMgYWNjdXJhdGUu ICovDQorDQorZG9uZToNCisJdHJhY2VfbWFfd3JpdGUoX19mdW5jX18sIG1hcywgMCwgd3JfbWFz LT5lbnRyeSk7DQorCW1hc191cGRhdGVfZ2FwKG1hcyk7DQorCXJldHVybiB0cnVlOw0KK30NCisN CitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3dyX2VuZF9waXYoc3RydWN0IG1hX3dyX3N0YXRlICp3 cl9tYXMpDQorew0KKwl3aGlsZSAoKHdyX21hcy0+bWFzLT5sYXN0ID4gd3JfbWFzLT5lbmRfcGl2 KSAmJg0KKwkgICAgICAgKHdyX21hcy0+b2Zmc2V0X2VuZCA8IHdyX21hcy0+bm9kZV9lbmQpKQ0K KwkJd3JfbWFzLT5lbmRfcGl2ID0gd3JfbWFzLT5waXZvdHNbKyt3cl9tYXMtPm9mZnNldF9lbmRd Ow0KKw0KKwlpZiAod3JfbWFzLT5tYXMtPmxhc3QgPiB3cl9tYXMtPmVuZF9waXYpDQorCQl3cl9t YXMtPmVuZF9waXYgPSB3cl9tYXMtPm1hcy0+bWF4Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIHZv aWQgbWFzX3dyX2V4dGVuZF9udWxsKHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJ c3RydWN0IG1hX3N0YXRlICptYXMgPSB3cl9tYXMtPm1hczsNCisNCisJaWYgKG1hcy0+bGFzdCA8 IHdyX21hcy0+ZW5kX3BpdiAmJiAhd3JfbWFzLT5zbG90c1t3cl9tYXMtPm9mZnNldF9lbmRdKQ0K KwkJbWFzLT5sYXN0ID0gd3JfbWFzLT5lbmRfcGl2Ow0KKw0KKwkvKiBDaGVjayBuZXh0IHNsb3Qo cykgaWYgd2UgYXJlIG92ZXJ3cml0aW5nIHRoZSBlbmQgKi8NCisJaWYgKChtYXMtPmxhc3QgPT0g d3JfbWFzLT5lbmRfcGl2KSAmJg0KKwkgICAgIXdyX21hcy0+c2xvdHNbd3JfbWFzLT5vZmZzZXRf ZW5kICsgMV0pIHsNCisJCXdyX21hcy0+b2Zmc2V0X2VuZCsrOw0KKwkJaWYgKHdyX21hcy0+b2Zm c2V0X2VuZCA9PSB3cl9tYXMtPm5vZGVfZW5kKQ0KKwkJCW1hcy0+bGFzdCA9IG1hcy0+bWF4Ow0K KwkJZWxzZQ0KKwkJCW1hcy0+bGFzdCA9IHdyX21hcy0+cGl2b3RzW3dyX21hcy0+b2Zmc2V0X2Vu ZF07DQorCX0gZWxzZSBpZiAoKG1hcy0+bGFzdCA+IHdyX21hcy0+ZW5kX3BpdikgJiYNCisJCSAg ICF3cl9tYXMtPnNsb3RzW3dyX21hcy0+b2Zmc2V0X2VuZF0pIHsNCisJCW1hcy0+bGFzdCA9IHdy X21hcy0+ZW5kX3BpdjsNCisJCXdyX21hcy0+b2Zmc2V0X2VuZCsrOw0KKwl9DQorDQorCWlmICgh d3JfbWFzLT5jb250ZW50KSB7DQorCQkvKiBJZiB0aGlzIG9uZSBpcyBudWxsLCB0aGUgbmV4dCBh bmQgcHJldiBhcmUgbm90ICovDQorCQltYXMtPmluZGV4ID0gd3JfbWFzLT5yX21pbjsNCisJfSBl bHNlIHsNCisJCS8qIENoZWNrIHByZXYgc2xvdCBpZiB3ZSBhcmUgb3ZlcndyaXRpbmcgdGhlIHN0 YXJ0ICovDQorCQlpZiAobWFzLT5pbmRleCA9PSB3cl9tYXMtPnJfbWluICYmIG1hcy0+b2Zmc2V0 ICYmDQorCQkgICAgIXdyX21hcy0+c2xvdHNbbWFzLT5vZmZzZXQgLSAxXSkgew0KKwkJCW1hcy0+ b2Zmc2V0LS07DQorCQkJd3JfbWFzLT5yX21pbiA9IG1hcy0+aW5kZXggPQ0KKwkJCQltYXNfc2Fm ZV9taW4obWFzLCB3cl9tYXMtPnBpdm90cywgbWFzLT5vZmZzZXQpOw0KKwkJCXdyX21hcy0+cl9t YXggPSB3cl9tYXMtPnBpdm90c1ttYXMtPm9mZnNldF07DQorCQl9DQorCX0NCit9DQorDQorc3Rh dGljIGlubGluZSBib29sIG1hc193cl9hcHBlbmQoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMp DQorew0KKwl1bnNpZ25lZCBjaGFyIGVuZCA9IHdyX21hcy0+bm9kZV9lbmQ7DQorCXVuc2lnbmVk IGNoYXIgbmV3X2VuZCA9IGVuZCArIDE7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFz LT5tYXM7DQorCXVuc2lnbmVkIGNoYXIgbm9kZV9waXZvdHMgPSBtdF9waXZvdHNbd3JfbWFzLT50 eXBlXTsNCisNCisJaWYgKChtYXMtPmluZGV4ICE9IHdyX21hcy0+cl9taW4pICYmIChtYXMtPmxh c3QgPT0gd3JfbWFzLT5yX21heCkpIHsNCisJCWlmIChuZXdfZW5kIDwgbm9kZV9waXZvdHMpDQor CQkJd3JfbWFzLT5waXZvdHNbbmV3X2VuZF0gPSB3cl9tYXMtPnBpdm90c1tlbmRdOw0KKw0KKwkJ aWYgKG5ld19lbmQgPCBub2RlX3Bpdm90cykNCisJCQltYV9zZXRfbWV0YSh3cl9tYXMtPm5vZGUs IG1hcGxlX2xlYWZfNjQsIDAsIG5ld19lbmQpOw0KKw0KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHdy X21hcy0+c2xvdHNbbmV3X2VuZF0sIHdyX21hcy0+ZW50cnkpOw0KKwkJbWFzLT5vZmZzZXQgPSBu ZXdfZW5kOw0KKwkJd3JfbWFzLT5waXZvdHNbZW5kXSA9IG1hcy0+aW5kZXggLSAxOw0KKw0KKwkJ cmV0dXJuIDE7DQorCX0gZWxzZSBpZiAoKG1hcy0+aW5kZXggPT0gd3JfbWFzLT5yX21pbikgJiYg KG1hcy0+bGFzdCA8IHdyX21hcy0+cl9tYXgpKSB7DQorCQlpZiAobmV3X2VuZCA8IG5vZGVfcGl2 b3RzKQ0KKwkJCXdyX21hcy0+cGl2b3RzW25ld19lbmRdID0gd3JfbWFzLT5waXZvdHNbZW5kXTsN CisNCisJCXJjdV9hc3NpZ25fcG9pbnRlcih3cl9tYXMtPnNsb3RzW25ld19lbmRdLCB3cl9tYXMt PmNvbnRlbnQpOw0KKwkJaWYgKG5ld19lbmQgPCBub2RlX3Bpdm90cykNCisJCQltYV9zZXRfbWV0 YSh3cl9tYXMtPm5vZGUsIG1hcGxlX2xlYWZfNjQsIDAsIG5ld19lbmQpOw0KKw0KKwkJd3JfbWFz LT5waXZvdHNbZW5kXSA9IG1hcy0+bGFzdDsNCisJCXJjdV9hc3NpZ25fcG9pbnRlcih3cl9tYXMt PnNsb3RzW2VuZF0sIHdyX21hcy0+ZW50cnkpOw0KKwkJcmV0dXJuIDE7DQorCX0NCisJcmV0dXJu IDA7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfd3JfbW9kaWZ5KHN0cnVjdCBtYV93 cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJdW5zaWduZWQgY2hhciB6ZXJvOw0KKwl1bnNpZ25lZCBj aGFyIG5vZGVfc2xvdHM7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQor CXN0cnVjdCBtYXBsZV9iaWdfbm9kZSBiX25vZGU7DQorDQorCS8qIERpcmVjdCByZXBsYWNlbWVu dCAqLw0KKwlpZiAod3JfbWFzLT5yX21pbiA9PSBtYXMtPmluZGV4ICYmIHdyX21hcy0+cl9tYXgg PT0gbWFzLT5sYXN0KSB7DQorCQlyY3VfYXNzaWduX3BvaW50ZXIod3JfbWFzLT5zbG90c1ttYXMt Pm9mZnNldF0sIHdyX21hcy0+ZW50cnkpOw0KKwkJaWYgKCEhd3JfbWFzLT5lbnRyeSBeICEhd3Jf bWFzLT5jb250ZW50KQ0KKwkJCW1hc191cGRhdGVfZ2FwKG1hcyk7DQorCQlyZXR1cm47DQorCX0N CisNCisJLyogQXR0ZW1wdCB0byBhcHBlbmQgKi8NCisJbm9kZV9zbG90cyA9IG10X3Nsb3RzW3dy X21hcy0+dHlwZV07DQorCS8qIHNsb3QgYW5kIG5vZGUgc3RvcmUgd2lsbCBub3QgZml0LCBnbyB0 byB0aGUgc2xvdyBwYXRoICovDQorCWlmICh1bmxpa2VseSh3cl9tYXMtPm9mZnNldF9lbmQgKyAx ID49IG5vZGVfc2xvdHMpKQ0KKwkJZ290byBzbG93X3BhdGg7DQorDQorCWlmICh3cl9tYXMtPmVu dHJ5ICYmICh3cl9tYXMtPm5vZGVfZW5kIDwgbm9kZV9zbG90cyAtIDEpICYmDQorCSAgICAobWFz LT5vZmZzZXQgPT0gd3JfbWFzLT5ub2RlX2VuZCkgJiYgbWFzX3dyX2FwcGVuZCh3cl9tYXMpKSB7 DQorCQkJaWYgKCF3cl9tYXMtPmNvbnRlbnQgfHwgIXdyX21hcy0+ZW50cnkpDQorCQkJCW1hc191 cGRhdGVfZ2FwKG1hcyk7DQorCQkJcmV0dXJuOw0KKwl9DQorDQorCWlmICgod3JfbWFzLT5vZmZz ZXRfZW5kIC0gbWFzLT5vZmZzZXQgPD0gMSkgJiYgbWFzX3dyX3Nsb3Rfc3RvcmUod3JfbWFzKSkN CisJCXJldHVybjsNCisJZWxzZSBpZiAobWFzX3dyX25vZGVfc3RvcmUod3JfbWFzKSkNCisJCXJl dHVybjsNCisNCisJaWYgKG1hc19pc19lcnIobWFzKSkNCisJCXJldHVybjsNCisNCitzbG93X3Bh dGg6DQorCWJfbm9kZS5iX2VuZCA9IG1hc19zdG9yZV9iX25vZGUod3JfbWFzLCAmYl9ub2RlLCB3 cl9tYXMtPm9mZnNldF9lbmQpOw0KKwliX25vZGUubWluID0gbWFzLT5taW47DQorCXplcm8gPSBN QVBMRV9CSUdfTk9ERV9TTE9UUyAtIGJfbm9kZS5iX2VuZCAtIDE7DQorCW1lbXNldChiX25vZGUu c2xvdCArIGJfbm9kZS5iX2VuZCArIDEsIDAsIHNpemVvZih2b2lkICopICogemVyby0tKTsNCisJ bWVtc2V0KGJfbm9kZS5waXZvdCArIGJfbm9kZS5iX2VuZCArIDEsIDAsDQorCSAgICAgICBzaXpl b2YodW5zaWduZWQgbG9uZykgKiB6ZXJvKTsNCisNCisJdHJhY2VfbWFfd3JpdGUoX19mdW5jX18s IG1hcywgMCwgd3JfbWFzLT5lbnRyeSk7DQorCW1hc19jb21taXRfYl9ub2RlKG1hcywgJmJfbm9k ZSwgd3JfbWFzLT5ub2RlX2VuZCk7DQorfQ0KKw0KKy8qDQorICogbWFzX3dyX3N0b3JlX2VudHJ5 KCkgLSBJbnRlcm5hbCBjYWxsIHRvIHN0b3JlIGEgdmFsdWUNCisgKiBAbWFzOiBUaGUgbWFwbGUg c3RhdGUNCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBzdG9yZS4NCisgKg0KKyAqIFJldHVybjog VGhlIGNvbnRlbnRzIHRoYXQgd2FzIHN0b3JlZCBhdCB0aGUgaW5kZXguDQorICovDQorc3RhdGlj IGlubGluZSB2b2lkICptYXNfd3Jfc3RvcmVfZW50cnkoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9t YXMpDQorew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm1hcyA9IHdyX21hcy0+bWFzOw0KKw0KKwlpZiAo KHdyX21hcy0+Y29udGVudCA9IG1hc19zdGFydChtYXMpKSB8fCBtYXNfaXNfbm9uZShtYXMpIHx8 DQorCSAgICBtYXNfaXNfcHRyKG1hcykpIHsNCisJCW1hc19zdG9yZV9yb290KG1hcywgd3JfbWFz LT5lbnRyeSk7DQorCQlyZXR1cm4gd3JfbWFzLT5jb250ZW50Ow0KKwl9DQorDQorCWlmICh1bmxp a2VseSghbWFzX3dyX3dhbGsod3JfbWFzKSkpIHsNCisJCW1hc193cl9zcGFubmluZ19zdG9yZSh3 cl9tYXMpOw0KKwkJcmV0dXJuIHdyX21hcy0+Y29udGVudDsNCisJfQ0KKw0KKwkvKiBBdCB0aGlz IHBvaW50LCB3ZSBhcmUgYXQgdGhlIGxlYWYgbm9kZSB0aGF0IG5lZWRzIHRvIGJlIGFsdGVyZWQu ICovDQorCXdyX21hcy0+ZW5kX3BpdiA9IHdyX21hcy0+cl9tYXg7DQorCW1hc193cl9lbmRfcGl2 KHdyX21hcyk7DQorDQorCWlmICghd3JfbWFzLT5lbnRyeSkNCisJCW1hc193cl9leHRlbmRfbnVs bCh3cl9tYXMpOw0KKw0KKwkvKiBOZXcgcm9vdCBmb3IgYSBzaW5nbGUgcG9pbnRlciAqLw0KKwlp ZiAodW5saWtlbHkoIW1hcy0+aW5kZXggJiYgbWFzLT5sYXN0ID09IFVMT05HX01BWCkpIHsNCisJ CW1hc19uZXdfcm9vdChtYXMsIHdyX21hcy0+ZW50cnkpOw0KKwkJcmV0dXJuIHdyX21hcy0+Y29u dGVudDsNCisJfQ0KKw0KKwltYXNfd3JfbW9kaWZ5KHdyX21hcyk7DQorCXJldHVybiB3cl9tYXMt PmNvbnRlbnQ7DQorfQ0KKw0KKy8qKg0KKyAqIG1hc19pbnNlcnQoKSAtIEludGVybmFsIGNhbGwg dG8gaW5zZXJ0IGEgdmFsdWUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZW50cnk6 IFRoZSBlbnRyeSB0byBzdG9yZQ0KKyAqDQorICogUmV0dXJuOiAlTlVMTCBvciB0aGUgY29udGVu dHMgdGhhdCBhbHJlYWR5IGV4aXN0cyBhdCB0aGUgcmVxdWVzdGVkIGluZGV4DQorICogb3RoZXJ3 aXNlLiAgVGhlIG1hcGxlIHN0YXRlIG5lZWRzIHRvIGJlIGNoZWNrZWQgZm9yIGVycm9yIGNvbmRp dGlvbnMuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkICptYXNfaW5zZXJ0KHN0cnVjdCBtYV9z dGF0ZSAqbWFzLCB2b2lkICplbnRyeSkNCit7DQorCU1BX1dSX1NUQVRFKHdyX21hcywgbWFzLCBl bnRyeSk7DQorDQorCS8qDQorCSAqIEluc2VydGluZyBhIG5ldyByYW5nZSBpbnNlcnRzIGVpdGhl ciAwLCAxLCBvciAyIHBpdm90cyB3aXRoaW4gdGhlDQorCSAqIHRyZWUuICBJZiB0aGUgaW5zZXJ0 IGZpdHMgZXhhY3RseSBpbnRvIGFuIGV4aXN0aW5nIGdhcCB3aXRoIGEgdmFsdWUNCisJICogb2Yg TlVMTCwgdGhlbiB0aGUgc2xvdCBvbmx5IG5lZWRzIHRvIGJlIHdyaXR0ZW4gd2l0aCB0aGUgbmV3 IHZhbHVlLg0KKwkgKiBJZiB0aGUgcmFuZ2UgYmVpbmcgaW5zZXJ0ZWQgaXMgYWRqYWNlbnQgdG8g YW5vdGhlciByYW5nZSwgdGhlbiBvbmx5IGENCisJICogc2luZ2xlIHBpdm90IG5lZWRzIHRvIGJl IGluc2VydGVkIChhcyB3ZWxsIGFzIHdyaXRpbmcgdGhlIGVudHJ5KS4gIElmDQorCSAqIHRoZSBu ZXcgcmFuZ2UgaXMgd2l0aGluIGEgZ2FwIGJ1dCBkb2VzIG5vdCB0b3VjaCBhbnkgb3RoZXIgcmFu Z2VzLA0KKwkgKiB0aGVuIHR3byBwaXZvdHMgbmVlZCB0byBiZSBpbnNlcnRlZDogdGhlIHN0YXJ0 IC0gMSwgYW5kIHRoZSBlbmQuICBBcw0KKwkgKiB1c3VhbCwgdGhlIGVudHJ5IG11c3QgYmUgd3Jp dHRlbi4gIE1vc3Qgb3BlcmF0aW9ucyByZXF1aXJlIGEgbmV3IG5vZGUNCisJICogdG8gYmUgYWxs b2NhdGVkIGFuZCByZXBsYWNlIGFuIGV4aXN0aW5nIG5vZGUgdG8gZW5zdXJlIFJDVSBzYWZldHks DQorCSAqIHdoZW4gaW4gUkNVIG1vZGUuICBUaGUgZXhjZXB0aW9uIHRvIHJlcXVpcmluZyBhIG5l d2x5IGFsbG9jYXRlZCBub2RlDQorCSAqIGlzIHdoZW4gaW5zZXJ0aW5nIGF0IHRoZSBlbmQgb2Yg YSBub2RlIChhcHBlbmRpbmcpLiAgV2hlbiBkb25lDQorCSAqIGNhcmVmdWxseSwgYXBwZW5kaW5n IGNhbiByZXVzZSB0aGUgbm9kZSBpbiBwbGFjZS4NCisJICovDQorCXdyX21hcy5jb250ZW50ID0g bWFzX3N0YXJ0KG1hcyk7DQorCWlmICh3cl9tYXMuY29udGVudCkNCisJCWdvdG8gZXhpc3RzOw0K Kw0KKwlpZiAobWFzX2lzX25vbmUobWFzKSkgew0KKwkJbWFzX3N0b3JlX3Jvb3QobWFzLCBlbnRy eSk7DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwkvKiBzcGFubmluZyB3cml0ZXMgYWx3YXlz IG92ZXJ3cml0ZSBzb21ldGhpbmcgKi8NCisJaWYgKCFtYXNfd3Jfd2Fsaygmd3JfbWFzKSkNCisJ CWdvdG8gZXhpc3RzOw0KKw0KKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBhcmUgYXQgdGhlIGxlYWYg bm9kZSB0aGF0IG5lZWRzIHRvIGJlIGFsdGVyZWQuICovDQorCXdyX21hcy5vZmZzZXRfZW5kID0g bWFzLT5vZmZzZXQ7DQorCXdyX21hcy5lbmRfcGl2ID0gd3JfbWFzLnJfbWF4Ow0KKw0KKwlpZiAo d3JfbWFzLmNvbnRlbnQgfHwgKG1hcy0+bGFzdCA+IHdyX21hcy5yX21heCkpDQorCQlnb3RvIGV4 aXN0czsNCisNCisJaWYgKCFlbnRyeSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwltYXNfd3JfbW9k aWZ5KCZ3cl9tYXMpOw0KKwlyZXR1cm4gd3JfbWFzLmNvbnRlbnQ7DQorDQorZXhpc3RzOg0KKwlt YXNfc2V0X2VycihtYXMsIC1FRVhJU1QpOw0KKwlyZXR1cm4gd3JfbWFzLmNvbnRlbnQ7DQorDQor fQ0KKw0KKy8qDQorICogbWFzX3ByZXZfbm9kZSgpIC0gRmluZCB0aGUgcHJldiBub24tbnVsbCBl bnRyeSBhdCB0aGUgc2FtZSBsZXZlbCBpbiB0aGUNCisgKiB0cmVlLiAgVGhlIHByZXYgdmFsdWUg d2lsbCBiZSBtYXMtPm5vZGVbbWFzLT5vZmZzZXRdIG9yIE1BU19OT05FLg0KKyAqIEBtYXM6IFRo ZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtaW46IFRoZSBsb3dlciBsaW1pdCB0byBzZWFyY2gNCisgKg0K KyAqIFRoZSBwcmV2IG5vZGUgdmFsdWUgd2lsbCBiZSBtYXMtPm5vZGVbbWFzLT5vZmZzZXRdIG9y IE1BU19OT05FLg0KKyAqIFJldHVybnM6IDEgaWYgdGhlIG5vZGUgaXMgZGVhZCwgMCBvdGhlcndp c2UuDQorICovDQorc3RhdGljIGlubGluZSBpbnQgbWFzX3ByZXZfbm9kZShzdHJ1Y3QgbWFfc3Rh dGUgKm1hcywgdW5zaWduZWQgbG9uZyBtaW4pDQorew0KKwllbnVtIG1hcGxlX3R5cGUgbXQ7DQor CWludCBvZmZzZXQsIGxldmVsOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCXN0cnVjdCBtYXBs ZV9ub2RlICpub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVub2RlOw0KKwl1bnNpZ25lZCBs b25nICpwaXZvdHM7DQorDQorCWlmIChtYXNfaXNfbm9uZShtYXMpKQ0KKwkJcmV0dXJuIDA7DQor DQorCWxldmVsID0gMDsNCisJZG8gew0KKwkJbm9kZSA9IG1hc19tbihtYXMpOw0KKwkJaWYgKG1h X2lzX3Jvb3Qobm9kZSkpDQorCQkJZ290byBub19lbnRyeTsNCisNCisJCS8qIFdhbGsgdXAuICov DQorCQlpZiAodW5saWtlbHkobWFzX2FzY2VuZChtYXMpKSkNCisJCQlyZXR1cm4gMTsNCisJCW9m ZnNldCA9IG1hcy0+b2Zmc2V0Ow0KKwkJbGV2ZWwrKzsNCisJfSB3aGlsZSAoIW9mZnNldCk7DQor DQorCW9mZnNldC0tOw0KKwltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJbm9kZSA9 IG1hc19tbihtYXMpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIG10KTsNCisJcGl2b3RzID0g bWFfcGl2b3RzKG5vZGUsIG10KTsNCisJbWFzLT5tYXggPSBwaXZvdHNbb2Zmc2V0XTsNCisJaWYg KG9mZnNldCkNCisJCW1hcy0+bWluID0gcGl2b3RzW29mZnNldCAtIDFdICsgMTsNCisJaWYgKHVu bGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQlyZXR1cm4gMTsNCisNCisJaWYgKG1hcy0+ bWF4IDwgbWluKQ0KKwkJZ290byBub19lbnRyeV9taW47DQorDQorCXdoaWxlIChsZXZlbCA+IDEp IHsNCisJCWxldmVsLS07DQorCQllbm9kZSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG9mZnNldCk7 DQorCQlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCQlyZXR1cm4gMTsNCisN CisJCW1hcy0+bm9kZSA9IGVub2RlOw0KKwkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7 DQorCQlub2RlID0gbWFzX21uKG1hcyk7DQorCQlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIG10KTsN CisJCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCBtdCk7DQorCQlvZmZzZXQgPSBtYV9kYXRhX2Vu ZChub2RlLCBtdCwgcGl2b3RzLCBtYXMtPm1heCk7DQorCQlpZiAob2Zmc2V0KQ0KKwkJCW1hcy0+ bWluID0gcGl2b3RzW29mZnNldCAtIDFdICsgMTsNCisNCisJCWlmIChvZmZzZXQgPCBtdF9waXZv dHNbbXRdKQ0KKwkJCW1hcy0+bWF4ID0gcGl2b3RzW29mZnNldF07DQorDQorCQlpZiAobWFzLT5t YXggPCBtaW4pDQorCQkJZ290byBub19lbnRyeTsNCisJfQ0KKw0KKwltYXMtPm5vZGUgPSBtYXNf c2xvdChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5v ZGUpKSkNCisJCXJldHVybiAxOw0KKw0KKwltYXMtPm9mZnNldCA9IG1hc19kYXRhX2VuZChtYXMp Ow0KKwlpZiAodW5saWtlbHkobXRlX2RlYWRfbm9kZShtYXMtPm5vZGUpKSkNCisJCXJldHVybiAx Ow0KKw0KKwlyZXR1cm4gMDsNCisNCitub19lbnRyeV9taW46DQorCW1hcy0+b2Zmc2V0ID0gb2Zm c2V0Ow0KKwlpZiAob2Zmc2V0KQ0KKwkJbWFzLT5taW4gPSBwaXZvdHNbb2Zmc2V0IC0gMV0gKyAx Ow0KK25vX2VudHJ5Og0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCXJl dHVybiAxOw0KKw0KKwltYXMtPm5vZGUgPSBNQVNfTk9ORTsNCisJcmV0dXJuIDA7DQorfQ0KKw0K Ky8qDQorICogbWFzX25leHRfbm9kZSgpIC0gR2V0IHRoZSBuZXh0IG5vZGUgYXQgdGhlIHNhbWUg bGV2ZWwgaW4gdGhlIHRyZWUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG1heDog VGhlIG1heGltdW0gcGl2b3QgdmFsdWUgdG8gY2hlY2suDQorICoNCisgKiBUaGUgbmV4dCB2YWx1 ZSB3aWxsIGJlIG1hcy0+bm9kZVttYXMtPm9mZnNldF0gb3IgTUFTX05PTkUuDQorICogUmV0dXJu OiAxIG9uIGRlYWQgbm9kZSwgMCBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBpbnQg bWFzX25leHRfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0IG1hcGxlX25vZGUgKm5v ZGUsDQorCQkJCXVuc2lnbmVkIGxvbmcgbWF4KQ0KK3sNCisJdW5zaWduZWQgbG9uZyBtaW4sIHBp dm90Ow0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqZW5v ZGU7DQorCWludCBsZXZlbCA9IDA7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwllbnVtIG1h cGxlX3R5cGUgbXQ7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisNCisJaWYgKG1hcy0+bWF4ID49 IG1heCkNCisJCWdvdG8gbm9fZW50cnk7DQorDQorCWxldmVsID0gMDsNCisJZG8gew0KKwkJaWYg KG1hX2lzX3Jvb3Qobm9kZSkpDQorCQkJZ290byBub19lbnRyeTsNCisNCisJCW1pbiA9IG1hcy0+ bWF4ICsgMTsNCisJCWlmIChtaW4gPiBtYXgpDQorCQkJZ290byBub19lbnRyeTsNCisNCisJCWlm ICh1bmxpa2VseShtYXNfYXNjZW5kKG1hcykpKQ0KKwkJCXJldHVybiAxOw0KKw0KKwkJb2Zmc2V0 ID0gbWFzLT5vZmZzZXQ7DQorCQlsZXZlbCsrOw0KKwkJbm9kZSA9IG1hc19tbihtYXMpOw0KKwkJ bXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCQlwaXZvdHMgPSBtYV9waXZvdHMobm9k ZSwgbXQpOw0KKwl9IHdoaWxlICh1bmxpa2VseShvZmZzZXQgPT0gbWFfZGF0YV9lbmQobm9kZSwg bXQsIHBpdm90cywgbWFzLT5tYXgpKSk7DQorDQorCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgbXQp Ow0KKwlwaXZvdCA9IG1hc19zYWZlX3Bpdm90KG1hcywgcGl2b3RzLCArK29mZnNldCwgbXQpOw0K Kwl3aGlsZSAodW5saWtlbHkobGV2ZWwgPiAxKSkgew0KKwkJLyogRGVzY2VuZCwgaWYgbmVjZXNz YXJ5ICovDQorCQllbm9kZSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG9mZnNldCk7DQorCQlpZiAo dW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCQlyZXR1cm4gMTsNCisNCisJCW1hcy0+ bm9kZSA9IGVub2RlOw0KKwkJbGV2ZWwtLTsNCisJCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJCW10 ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwkJc2xvdHMgPSBtYV9zbG90cyhub2RlLCBt dCk7DQorCQlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQpOw0KKwkJb2Zmc2V0ID0gMDsNCisJ CXBpdm90ID0gcGl2b3RzWzBdOw0KKwl9DQorDQorCWVub2RlID0gbWFzX3Nsb3QobWFzLCBzbG90 cywgb2Zmc2V0KTsNCisJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQlyZXR1 cm4gMTsNCisNCisJbWFzLT5ub2RlID0gZW5vZGU7DQorCW1hcy0+bWluID0gbWluOw0KKwltYXMt Pm1heCA9IHBpdm90Ow0KKwlyZXR1cm4gMDsNCisNCitub19lbnRyeToNCisJaWYgKHVubGlrZWx5 KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQlyZXR1cm4gMTsNCisNCisJbWFzLT5ub2RlID0gTUFT X05PTkU7DQorCXJldHVybiAwOw0KK30NCisNCisvKg0KKyAqIG1hc19uZXh0X25lbnRyeSgpIC0g R2V0IHRoZSBuZXh0IG5vZGUgZW50cnkNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBA bWF4OiBUaGUgbWF4aW11bSB2YWx1ZSB0byBjaGVjaw0KKyAqIEAqcmFuZ2Vfc3RhcnQ6IFBvaW50 ZXIgdG8gc3RvcmUgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZS4NCisgKg0KKyAqIFNldHMgQG1hcy0+ b2Zmc2V0IHRvIHRoZSBvZmZzZXQgb2YgdGhlIG5leHQgbm9kZSBlbnRyeSwgQG1hcy0+bGFzdCB0 byB0aGUNCisgKiBwaXZvdCBvZiB0aGUgZW50cnkuDQorICoNCisgKiBSZXR1cm46IFRoZSBuZXh0 IGVudHJ5LCAlTlVMTCBvdGhlcndpc2UNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19u ZXh0X25lbnRyeShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJICAgIHN0cnVjdCBtYXBsZV9ub2Rl ICpub2RlLCB1bnNpZ25lZCBsb25nIG1heCwgZW51bSBtYXBsZV90eXBlIHR5cGUpDQorew0KKwl1 bnNpZ25lZCBjaGFyIGNvdW50Ow0KKwl1bnNpZ25lZCBsb25nIHBpdm90Ow0KKwl1bnNpZ25lZCBs b25nICpwaXZvdHM7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdm9pZCAqZW50cnk7DQorDQor CWlmIChtYXMtPmxhc3QgPT0gbWFzLT5tYXgpIHsNCisJCW1hcy0+aW5kZXggPSBtYXMtPm1heDsN CisJCXJldHVybiBOVUxMOw0KKwl9DQorDQorCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0eXBl KTsNCisJc2xvdHMgPSBtYV9zbG90cyhub2RlLCB0eXBlKTsNCisJbWFzLT5pbmRleCA9IG1hc19z YWZlX21pbihtYXMsIHBpdm90cywgbWFzLT5vZmZzZXQpOw0KKwlpZiAobWFfZGVhZF9ub2RlKG5v ZGUpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCWlmIChtYXMtPmluZGV4ID4gbWF4KQ0KKwkJcmV0 dXJuIE5VTEw7DQorDQorCWNvdW50ID0gbWFfZGF0YV9lbmQobm9kZSwgdHlwZSwgcGl2b3RzLCBt YXMtPm1heCk7DQorCXdoaWxlIChtYXMtPm9mZnNldCA8IGNvdW50KSB7DQorCQlwaXZvdCA9IHBp dm90c1ttYXMtPm9mZnNldF07DQorCQllbnRyeSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG1hcy0+ b2Zmc2V0KTsNCisJCWlmIChtYV9kZWFkX25vZGUobm9kZSkpDQorCQkJcmV0dXJuIE5VTEw7DQor DQorCQlpZiAoZW50cnkpDQorCQkJZ290byBmb3VuZDsNCisNCisJCWlmIChwaXZvdCA+PSBtYXgp DQorCQkJcmV0dXJuIE5VTEw7DQorDQorCQltYXMtPmluZGV4ID0gcGl2b3QgKyAxOw0KKwkJbWFz LT5vZmZzZXQrKzsNCisJfQ0KKw0KKwlpZiAobWFzLT5pbmRleCA+IG1hcy0+bWF4KSB7DQorCQlt YXMtPmluZGV4ID0gbWFzLT5sYXN0Ow0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisJcGl2b3Qg PSBtYXNfc2FmZV9waXZvdChtYXMsIHBpdm90cywgbWFzLT5vZmZzZXQsIHR5cGUpOw0KKwllbnRy eSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG1hcy0+b2Zmc2V0KTsNCisJaWYgKG1hX2RlYWRfbm9k ZShub2RlKSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlpZiAoIXBpdm90KQ0KKwkJcmV0dXJuIE5V TEw7DQorDQorCWlmICghZW50cnkpDQorCQlyZXR1cm4gTlVMTDsNCisNCitmb3VuZDoNCisJbWFz LT5sYXN0ID0gcGl2b3Q7DQorCXJldHVybiBlbnRyeTsNCit9DQorDQorc3RhdGljIGlubGluZSB2 b2lkIG1hc19yZXdhbGsoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgaW5kZXgp DQorew0KKw0KK3JldHJ5Og0KKwltYXNfc2V0KG1hcywgaW5kZXgpOw0KKwltYXNfc3RhdGVfd2Fs ayhtYXMpOw0KKwlpZiAobWFzX2lzX3N0YXJ0KG1hcykpDQorCQlnb3RvIHJldHJ5Ow0KKw0KKwly ZXR1cm47DQorDQorfQ0KKw0KKy8qDQorICogbWFzX2RlYWRfbm9kZSgpIC0gQ2hlY2sgaWYgdGhl IG1hcGxlIHN0YXRlIGlzIHBvaW50aW5nIHRvIGEgZGVhZCBub2RlLg0KKyAqIEBtYXM6IFRoZSBt YXBsZSBzdGF0ZQ0KKyAqIEBpbmRleDogVGhlIGluZGV4IHRvIHJlc3RvcmUgaW4gQG1hcy4NCisg Kg0KKyAqIFJldHVybjogMSBpZiBAbWFzIGhhcyBiZWVuIHJlc2V0IHRvIE1BU19TVEFSVCwgMCBv dGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBpbnQgbWFzX2RlYWRfbm9kZShzdHJ1Y3Qg bWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBpbmRleCkNCit7DQorCWlmICh1bmxpa2VseSgh bWFzX3NlYXJjaGFibGUobWFzKSB8fCBtYXNfaXNfc3RhcnQobWFzKSkpDQorCQlyZXR1cm4gMDsN CisNCisJaWYgKGxpa2VseSghbXRlX2RlYWRfbm9kZShtYXMtPm5vZGUpKSkNCisJCXJldHVybiAw Ow0KKw0KKwltYXNfcmV3YWxrKG1hcywgaW5kZXgpOw0KKwlyZXR1cm4gMTsNCit9DQorDQorLyoN CisgKiBtYXNfZmlyc3RfZW50cnkoKSAtIEdvIHRoZSBmaXJzdCBsZWFmIGFuZCBmaW5kIHRoZSBm aXJzdCBlbnRyeS4NCisgKiBAbWFzOiB0aGUgbWFwbGUgc3RhdGUuDQorICogQGxpbWl0OiB0aGUg bWF4aW11bSBpbmRleCB0byBjaGVjay4NCisgKiBAKnJfc3RhcnQ6IFBvaW50ZXIgdG8gc2V0IHRv IHRoZSByYW5nZSBzdGFydC4NCisgKg0KKyAqIFNldHMgbWFzLT5vZmZzZXQgdG8gdGhlIG9mZnNl dCBvZiB0aGUgZW50cnksIHJfc3RhcnQgdG8gdGhlIHJhbmdlIG1pbmltdW0uDQorICoNCisgKiBS ZXR1cm46IFRoZSBmaXJzdCBlbnRyeSBvciBNQVNfTk9ORS4NCisgKi8NCitzdGF0aWMgaW5saW5l IHZvaWQgKm1hc19maXJzdF9lbnRyeShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0IG1hcGxl X25vZGUgKm1uLA0KKwkJdW5zaWduZWQgbG9uZyBsaW1pdCwgZW51bSBtYXBsZV90eXBlIG10KQ0K K3sNCisJdW5zaWduZWQgbG9uZyBtYXg7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJdm9p ZCBfX3JjdSAqKnNsb3RzOw0KKwl2b2lkICplbnRyeSA9IE5VTEw7DQorDQorCW1hcy0+aW5kZXgg PSBtYXMtPm1pbjsNCisJaWYgKG1hcy0+aW5kZXggPiBsaW1pdCkNCisJCWdvdG8gbm9uZTsNCisN CisJbWF4ID0gbWFzLT5tYXg7DQorCW1hcy0+b2Zmc2V0ID0gMDsNCisJd2hpbGUgKGxpa2VseSgh bWFfaXNfbGVhZihtdCkpKSB7DQorCQlzbG90cyA9IG1hX3Nsb3RzKG1uLCBtdCk7DQorCQlwaXZv dHMgPSBtYV9waXZvdHMobW4sIG10KTsNCisJCW1heCA9IHBpdm90c1swXTsNCisJCWVudHJ5ID0g bWFzX3Nsb3QobWFzLCBzbG90cywgMCk7DQorCQlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG1u KSkpDQorCQkJcmV0dXJuIE5VTEw7DQorCQltYXMtPm5vZGUgPSBlbnRyeTsNCisJCW1uID0gbWFz X21uKG1hcyk7DQorCQltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJfQ0KKw0KKwlt YXMtPm1heCA9IG1heDsNCisJc2xvdHMgPSBtYV9zbG90cyhtbiwgbXQpOw0KKwllbnRyeSA9IG1h c19zbG90KG1hcywgc2xvdHMsIDApOw0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG1uKSkp DQorCQlyZXR1cm4gTlVMTDsNCisNCisJLyogU2xvdCAwIG9yIDEgbXVzdCBiZSBzZXQgKi8NCisJ aWYgKG1hcy0+aW5kZXggPiBsaW1pdCkNCisJCWdvdG8gbm9uZTsNCisNCisJaWYobGlrZWx5KGVu dHJ5KSkNCisJCXJldHVybiBlbnRyeTsNCisNCisJcGl2b3RzID0gbWFfcGl2b3RzKG1uLCBtdCk7 DQorCW1hcy0+aW5kZXggPSBwaXZvdHNbMF0gKyAxOw0KKwltYXMtPm9mZnNldCA9IDE7DQorCWVu dHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywgMSk7DQorCWlmICh1bmxpa2VseShtYV9kZWFkX25v ZGUobW4pKSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlpZiAobWFzLT5pbmRleCA+IGxpbWl0KQ0K KwkJZ290byBub25lOw0KKw0KKwlpZihsaWtlbHkoZW50cnkpKQ0KKwkJcmV0dXJuIGVudHJ5Ow0K Kw0KK25vbmU6DQorCWlmIChsaWtlbHkoIW1hX2RlYWRfbm9kZShtbikpKQ0KKwkJbWFzLT5ub2Rl ID0gTUFTX05PTkU7DQorCXJldHVybiBOVUxMOw0KK30NCisNCisvKg0KKyAqIG1hc19uZXh0X2Vu dHJ5KCkgLSBJbnRlcm5hbCBmdW5jdGlvbiB0byBnZXQgdGhlIG5leHQgZW50cnkuDQorICogQG1h czogVGhlIG1hcGxlIHN0YXRlDQorICogQGxpbWl0OiBUaGUgbWF4aW11bSByYW5nZSBzdGFydC4N CisgKg0KKyAqIFNldCB0aGUgQG1hcy0+bm9kZSB0byB0aGUgbmV4dCBlbnRyeSBhbmQgdGhlIHJh bmdlX3N0YXJ0IHRvDQorICogdGhlIGJlZ2lubmluZyB2YWx1ZSBmb3IgdGhlIGVudHJ5LiAgRG9l cyBub3QgY2hlY2sgYmV5b25kIEBsaW1pdC4NCisgKiBTZXRzIEBtYXMtPmluZGV4IGFuZCBAbWFz LT5sYXN0IHRvIHRoZSBsaW1pdCBpZiBpdCBpcyBoaXQuDQorICogUmVzdGFydHMgb24gZGVhZCBu b2Rlcy4NCisgKg0KKyAqIFJldHVybjogdGhlIG5leHQgZW50cnkgb3IgJU5VTEwuDQorICovDQor c3RhdGljIGlubGluZSB2b2lkICptYXNfbmV4dF9lbnRyeShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywg dW5zaWduZWQgbG9uZyBsaW1pdCkNCit7DQorCXZvaWQgKmVudHJ5ID0gTlVMTDsNCisJc3RydWN0 IG1hcGxlX2Vub2RlICpwcmV2X25vZGU7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOw0KKwl1 bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJdW5zaWduZWQgbG9uZyBsYXN0Ow0KKwllbnVtIG1hcGxl X3R5cGUgbXQ7DQorDQorCWxhc3QgPSBtYXMtPmxhc3Q7DQorcmV0cnk6DQorCW9mZnNldCA9IG1h cy0+b2Zmc2V0Ow0KKwlwcmV2X25vZGUgPSBtYXMtPm5vZGU7DQorCW5vZGUgPSBtYXNfbW4obWFz KTsNCisJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCW1hcy0+b2Zmc2V0Kys7DQor CWlmICh1bmxpa2VseShtYXMtPm9mZnNldCA+PSBtdF9zbG90c1ttdF0pKQ0KKwkJZ290byBuZXh0 X25vZGU7DQorDQorCXdoaWxlICghbWFzX2lzX25vbmUobWFzKSkgew0KKwkJZW50cnkgPSBtYXNf bmV4dF9uZW50cnkobWFzLCBub2RlLCBsaW1pdCwgbXQpOw0KKwkJaWYgKHVubGlrZWx5KG1hX2Rl YWRfbm9kZShub2RlKSkpIHsNCisJCQltYXNfcmV3YWxrKG1hcywgbGFzdCk7DQorCQkJZ290byBy ZXRyeTsNCisJCX0NCisNCisJCWlmIChsaWtlbHkoZW50cnkpKQ0KKwkJCXJldHVybiBlbnRyeTsN CisNCisJCWlmICh1bmxpa2VseSgobWFzLT5pbmRleCA+IGxpbWl0KSkpDQorCQkJYnJlYWs7DQor DQorbmV4dF9ub2RlOg0KKwkJcHJldl9ub2RlID0gbWFzLT5ub2RlOw0KKwkJb2Zmc2V0ID0gbWFz LT5vZmZzZXQ7DQorCQlpZiAodW5saWtlbHkobWFzX25leHRfbm9kZShtYXMsIG5vZGUsIGxpbWl0 KSkpIHsNCisJCQltYXNfcmV3YWxrKG1hcywgbGFzdCk7DQorCQkJZ290byByZXRyeTsNCisJCX0N CisJCW1hcy0+b2Zmc2V0ID0gMDsNCisJCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJCW10ID0gbXRl X25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwl9DQorDQorCW1hcy0+aW5kZXggPSBtYXMtPmxhc3Qg PSBsaW1pdDsNCisJbWFzLT5vZmZzZXQgPSBvZmZzZXQ7DQorCW1hcy0+bm9kZSA9IHByZXZfbm9k ZTsNCisJcmV0dXJuIE5VTEw7DQorfQ0KKw0KKy8qDQorICogbWFzX3ByZXZfbmVudHJ5KCkgLSBH ZXQgdGhlIHByZXZpb3VzIG5vZGUgZW50cnkuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlLg0K KyAqIEBsaW1pdDogVGhlIGxvd2VyIGxpbWl0IHRvIGNoZWNrIGZvciBhIHZhbHVlLg0KKyAqDQor ICogUmV0dXJuOiB0aGUgZW50cnksICVOVUxMIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgaW5s aW5lIHZvaWQgKm1hc19wcmV2X25lbnRyeShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQg bG9uZyBsaW1pdCwNCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgaW5kZXgpDQorew0KKwl1bnNpZ25l ZCBsb25nIHBpdm90LCBtaW47DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwlzdHJ1Y3QgbWFw bGVfbm9kZSAqbW47DQorCWVudW0gbWFwbGVfdHlwZSBtdDsNCisJdW5zaWduZWQgbG9uZyAqcGl2 b3RzOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCXZvaWQgKmVudHJ5Ow0KKw0KK3JldHJ5Og0K KwlpZiAoIW1hcy0+b2Zmc2V0KQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCW1uID0gbWFzX21uKG1h cyk7DQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwlvZmZzZXQgPSBtYXMtPm9m ZnNldCAtIDE7DQorCXNsb3RzID0gbWFfc2xvdHMobW4sIG10KTsNCisJcGl2b3RzID0gbWFfcGl2 b3RzKG1uLCBtdCk7DQorCWlmIChvZmZzZXQgPT0gbXRfcGl2b3RzW210XSkNCisJCXBpdm90ID0g bWFzLT5tYXg7DQorCWVsc2UNCisJCXBpdm90ID0gcGl2b3RzW29mZnNldF07DQorDQorCWlmICh1 bmxpa2VseShtYV9kZWFkX25vZGUobW4pKSkgew0KKwkJbWFzX3Jld2FsayhtYXMsIGluZGV4KTsN CisJCWdvdG8gcmV0cnk7DQorCX0NCisNCisJd2hpbGUgKChvZmZzZXQgJiYgIW1hc19zbG90KG1h cywgc2xvdHMsIG9mZnNldCkgJiYgcGl2b3QgPj0gbGltaXQpIHx8DQorCSAgICAgICAhcGl2b3Qp DQorCQlwaXZvdCA9IHBpdm90c1stLW9mZnNldF07DQorDQorCW1pbiA9IG1hc19zYWZlX21pbiht YXMsIHBpdm90cywgb2Zmc2V0KTsNCisJZW50cnkgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBvZmZz ZXQpOw0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG1uKSkpIHsNCisJCW1hc19yZXdhbGso bWFzLCBpbmRleCk7DQorCQlnb3RvIHJldHJ5Ow0KKwl9DQorDQorCWlmIChsaWtlbHkoZW50cnkp KSB7DQorCQltYXMtPm9mZnNldCA9IG9mZnNldDsNCisJCW1hcy0+bGFzdCA9IHBpdm90Ow0KKwkJ bWFzLT5pbmRleCA9IG1pbjsNCisJfQ0KKwlyZXR1cm4gZW50cnk7DQorfQ0KKw0KK3N0YXRpYyBp bmxpbmUgdm9pZCAqbWFzX3ByZXZfZW50cnkoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVk IGxvbmcgbWluKQ0KK3sNCisJdm9pZCAqZW50cnk7DQorDQorcmV0cnk6DQorCXdoaWxlIChsaWtl bHkoIW1hc19pc19ub25lKG1hcykpKSB7DQorCQllbnRyeSA9IG1hc19wcmV2X25lbnRyeShtYXMs IG1pbiwgbWFzLT5pbmRleCk7DQorCQlpZiAobGlrZWx5KGVudHJ5KSkNCisJCQlyZXR1cm4gZW50 cnk7DQorDQorCQlpZiAodW5saWtlbHkobWFzX3ByZXZfbm9kZShtYXMsIG1pbikpKSB7DQorCQkJ bWFzX3Jld2FsayhtYXMsIG1hcy0+aW5kZXgpOw0KKwkJCWdvdG8gcmV0cnk7DQorCQl9DQorDQor CQlpZiAoIW1hc19pc19ub25lKG1hcykpDQorCQkJbWFzLT5vZmZzZXQrKzsNCisJfQ0KKw0KKwlt YXMtPmluZGV4ID0gbWFzLT5sYXN0ID0gbWluOw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyoN CisgKiBtYXNfcmV2X2F3YWxrKCkgLSBJbnRlcm5hbCBmdW5jdGlvbi4gIFJldmVyc2UgYWxsb2Nh dGlvbiB3YWxrLiAgRmluZCB0aGUNCisgKiBoaWdoZXN0IGdhcCBhZGRyZXNzIG9mIGEgZ2l2ZW4g c2l6ZSBpbiBhIGdpdmVuIG5vZGUgYW5kIGRlc2NlbmQuDQorICogQG1hczogVGhlIG1hcGxlIHN0 YXRlDQorICogQHNpemU6IFRoZSBuZWVkZWQgc2l6ZS4NCisgKg0KKyAqIFJldHVybjogVHJ1ZSBp ZiBmb3VuZCBpbiBhIGxlYWYsIGZhbHNlIG90aGVyd2lzZS4NCisgKg0KKyAqLw0KK3N0YXRpYyBi b29sIG1hc19yZXZfYXdhbGsoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgc2l6 ZSkNCit7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUp Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSA9IG1hc19tbihtYXMpOw0KKwl1bnNpZ25lZCBs b25nICpwaXZvdHMsICpnYXBzOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCXVuc2lnbmVkIGxv bmcgZ2FwID0gMDsNCisJdW5zaWduZWQgbG9uZyBtYXgsIG1pbiwgaW5kZXg7DQorCXVuc2lnbmVk IGNoYXIgb2Zmc2V0Ow0KKw0KKwlpZiAodW5saWtlbHkobWFzX2lzX2VycihtYXMpKSkNCisJICAg IHJldHVybiB0cnVlOw0KKw0KKwlpZiAobWFfaXNfZGVuc2UodHlwZSkpIHsNCisJCS8qIGRlbnNl IG5vZGVzLiAqLw0KKwkJbWFzLT5vZmZzZXQgPSAodW5zaWduZWQgY2hhcikobWFzLT5pbmRleCAt IG1hcy0+bWluKTsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCXBpdm90cyA9IG1hX3Bpdm90 cyhub2RlLCB0eXBlKTsNCisJc2xvdHMgPSBtYV9zbG90cyhub2RlLCB0eXBlKTsNCisJaWYgKG1h X2lzX2xlYWYodHlwZSkpDQorCQlnYXBzID0gTlVMTDsNCisJZWxzZQ0KKwkJZ2FwcyA9IG1hX2dh cHMobm9kZSwgdHlwZSk7DQorDQorCW9mZnNldCA9IG1hcy0+b2Zmc2V0Ow0KKwltaW4gPSBtYXNf c2FmZV9taW4obWFzLCBwaXZvdHMsIG9mZnNldCk7DQorCS8qIFNraXAgb3V0IG9mIGJvdW5kcy4g Ki8NCisJd2hpbGUgKG1hcy0+bGFzdCA8IG1pbikNCisJCW1pbiA9IG1hc19zYWZlX21pbihtYXMs IHBpdm90cywgLS1vZmZzZXQpOw0KKw0KKwltYXggPSBtYXNfc2FmZV9waXZvdChtYXMsIHBpdm90 cywgb2Zmc2V0LCB0eXBlKTsNCisJaW5kZXggPSBtYXMtPmluZGV4Ow0KKwl3aGlsZSAoaW5kZXgg PD0gbWF4KSB7DQorCQlnYXAgPSAwOw0KKwkJaWYgKGdhcHMpDQorCQkJZ2FwID0gZ2Fwc1tvZmZz ZXRdOw0KKwkJZWxzZSBpZiAoIW1hc19zbG90KG1hcywgc2xvdHMsIG9mZnNldCkpDQorCQkJZ2Fw ID0gbWF4IC0gbWluICsgMTsNCisNCisJCWlmIChnYXApIHsNCisJCQlpZiAoKHNpemUgPD0gZ2Fw KSAmJiAoc2l6ZSA8PSBtYXMtPmxhc3QgLSBtaW4gKyAxKSkNCisJCQkJYnJlYWs7DQorDQorCQkJ aWYgKCFnYXBzKSB7DQorCQkJCS8qIFNraXAgdGhlIG5leHQgc2xvdCwgaXQgY2Fubm90IGJlIGEg Z2FwLiAqLw0KKwkJCQlpZiAob2Zmc2V0IDwgMikNCisJCQkJCWdvdG8gYXNjZW5kOw0KKw0KKwkJ CQlvZmZzZXQgLT0gMjsNCisJCQkJbWF4ID0gcGl2b3RzW29mZnNldF07DQorCQkJCW1pbiA9IG1h c19zYWZlX21pbihtYXMsIHBpdm90cywgb2Zmc2V0KTsNCisJCQkJY29udGludWU7DQorCQkJfQ0K KwkJfQ0KKw0KKwkJaWYgKCFvZmZzZXQpDQorCQkJZ290byBhc2NlbmQ7DQorDQorCQlvZmZzZXQt LTsNCisJCW1heCA9IG1pbiAtIDE7DQorCQltaW4gPSBtYXNfc2FmZV9taW4obWFzLCBwaXZvdHMs IG9mZnNldCk7DQorCX0NCisNCisJaWYgKHVubGlrZWx5KGluZGV4ID4gbWF4KSkgew0KKwkJbWFz X3NldF9lcnIobWFzLCAtRUJVU1kpOw0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCWlmICh1 bmxpa2VseShtYV9pc19sZWFmKHR5cGUpKSkgew0KKwkJbWFzLT5vZmZzZXQgPSBvZmZzZXQ7DQor CQltYXMtPm1pbiA9IG1pbjsNCisJCW1hcy0+bWF4ID0gbWluICsgZ2FwIC0gMTsNCisJCXJldHVy biB0cnVlOw0KKwl9DQorDQorCS8qIGRlc2NlbmQsIG9ubHkgaGFwcGVucyB1bmRlciBsb2NrLiAq Lw0KKwltYXMtPm5vZGUgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwltYXMtPm1p biA9IG1pbjsNCisJbWFzLT5tYXggPSBtYXg7DQorCW1hcy0+b2Zmc2V0ID0gbWFzX2RhdGFfZW5k KG1hcyk7DQorCXJldHVybiBmYWxzZTsNCisNCithc2NlbmQ6DQorCWlmIChtdGVfaXNfcm9vdCht YXMtPm5vZGUpKQ0KKwkJbWFzX3NldF9lcnIobWFzLCAtRUJVU1kpOw0KKw0KKwlyZXR1cm4gZmFs c2U7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfYW5vZGVfZGVzY2VuZChzdHJ1Y3Qg bWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBzaXplKQ0KK3sNCisJZW51bSBtYXBsZV90eXBl IHR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCXVuc2lnbmVkIGxvbmcgcGl2b3Qs IG1pbiwgZ2FwID0gMDsNCisJdW5zaWduZWQgY2hhciBjb3VudCwgb2Zmc2V0Ow0KKwl1bnNpZ25l ZCBsb25nICpnYXBzID0gTlVMTCwgKnBpdm90cyA9IG1hX3Bpdm90cyhtYXNfbW4obWFzKSwgdHlw ZSk7DQorCXZvaWQgX19yY3UgKipzbG90cyA9IG1hX3Nsb3RzKG1hc19tbihtYXMpLCB0eXBlKTsN CisJYm9vbCBmb3VuZCA9IGZhbHNlOw0KKw0KKwlpZiAobWFfaXNfZGVuc2UodHlwZSkpIHsNCisJ CW1hcy0+b2Zmc2V0ID0gKHVuc2lnbmVkIGNoYXIpKG1hcy0+aW5kZXggLSBtYXMtPm1pbik7DQor CQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKw0KKwlpZiAoIW1hX2lzX2xlYWYodHlwZSkpDQorCQlnYXBz ID0gbWFfZ2FwcyhtdGVfdG9fbm9kZShtYXMtPm5vZGUpLCB0eXBlKTsNCisNCisJb2Zmc2V0ID0g bWFzLT5vZmZzZXQ7DQorCWNvdW50ID0gbXRfc2xvdHNbdHlwZV07DQorCW1pbiA9IG1hc19zYWZl X21pbihtYXMsIHBpdm90cywgb2Zmc2V0KTsNCisJZm9yICg7IG9mZnNldCA8IGNvdW50OyBvZmZz ZXQrKykgew0KKwkJcGl2b3QgPSBtYXNfc2FmZV9waXZvdChtYXMsIHBpdm90cywgb2Zmc2V0LCB0 eXBlKTsNCisJCWlmIChvZmZzZXQgJiYgIXBpdm90KQ0KKwkJCWJyZWFrOw0KKw0KKwkJLyogTm90 IHdpdGhpbiBsb3dlciBib3VuZHMgKi8NCisJCWlmIChtYXMtPmluZGV4ID4gcGl2b3QpDQorCQkJ Z290byBuZXh0X3Nsb3Q7DQorDQorCQlpZiAoZ2FwcykNCisJCQlnYXAgPSBnYXBzW29mZnNldF07 DQorCQllbHNlIGlmICghbWFzX3Nsb3QobWFzLCBzbG90cywgb2Zmc2V0KSkNCisJCQlnYXAgPSBt aW4ocGl2b3QsIG1hcy0+bGFzdCkgLSBtYXgobWFzLT5pbmRleCwgbWluKSArIDE7DQorCQllbHNl DQorCQkJZ290byBuZXh0X3Nsb3Q7DQorDQorCQlpZiAoZ2FwID49IHNpemUpIHsNCisJCQlpZiAo bWFfaXNfbGVhZih0eXBlKSkgew0KKwkJCQlmb3VuZCA9IHRydWU7DQorCQkJCWdvdG8gZG9uZTsN CisJCQl9DQorCQkJaWYgKG1hcy0+aW5kZXggPD0gcGl2b3QpIHsNCisJCQkJbWFzLT5ub2RlID0g bWFzX3Nsb3QobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJCQkJbWFzLT5taW4gPSBtaW47DQorCQkJ CW1hcy0+bWF4ID0gcGl2b3Q7DQorCQkJCW9mZnNldCA9IDA7DQorCQkJCXR5cGUgPSBtdGVfbm9k ZV90eXBlKG1hcy0+bm9kZSk7DQorCQkJCWNvdW50ID0gbXRfc2xvdHNbdHlwZV07DQorCQkJCWJy ZWFrOw0KKwkJCX0NCisJCX0NCituZXh0X3Nsb3Q6DQorCQltaW4gPSBwaXZvdCArIDE7DQorCQlp ZiAobWFzLT5sYXN0IDwgbWluKSB7DQorCQkJbWFzX3NldF9lcnIobWFzLCAtRUJVU1kpOw0KKwkJ CXJldHVybiB0cnVlOw0KKwkJfQ0KKwl9DQorDQorCWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUp KQ0KKwkJZm91bmQgPSB0cnVlOw0KK2RvbmU6DQorCW1hcy0+b2Zmc2V0ID0gb2Zmc2V0Ow0KKwly ZXR1cm4gZm91bmQ7DQorfQ0KKw0KKy8qKg0KKyAqIG1hc193YWxrKCkgLSBTZWFyY2ggZm9yIEBt YXMtPmluZGV4IGluIHRoZSB0cmVlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisgKg0K KyAqIG1hcy0+aW5kZXggYW5kIG1hcy0+bGFzdCB3aWxsIGJlIHNldCB0byB0aGUgcmFuZ2UgaWYg dGhlcmUgaXMgYSB2YWx1ZS4gIElmDQorICogbWFzLT5ub2RlIGlzIE1BU19OT05FLCByZXNldCB0 byBNQVNfU1RBUlQuDQorICoNCisgKiBSZXR1cm46IHRoZSBlbnRyeSBhdCB0aGUgbG9jYXRpb24g b3IgJU5VTEwuDQorICovDQordm9pZCAqbWFzX3dhbGsoc3RydWN0IG1hX3N0YXRlICptYXMpDQor ew0KKwl2b2lkICplbnRyeTsNCisNCityZXRyeToNCisJZW50cnkgPSBtYXNfc3RhdGVfd2Fsayht YXMpOw0KKwlpZiAobWFzX2lzX3N0YXJ0KG1hcykpDQorCQlnb3RvIHJldHJ5Ow0KKw0KKwlyZXR1 cm4gZW50cnk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfcmV3aW5kX25vZGUoc3Ry dWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl1bnNpZ25lZCBjaGFyIHNsb3Q7DQorDQorCWRvIHsN CisJCWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKSB7DQorCQkJc2xvdCA9IG1hcy0+b2Zmc2V0 Ow0KKwkJCWlmICghc2xvdCkNCisJCQkJcmV0dXJuIGZhbHNlOw0KKwkJfSBlbHNlIHsNCisJCQlt YXNfYXNjZW5kKG1hcyk7DQorCQkJc2xvdCA9IG1hcy0+b2Zmc2V0Ow0KKwkJfQ0KKwl9IHdoaWxl ICghc2xvdCk7DQorDQorCW1hcy0+b2Zmc2V0ID0gLS1zbG90Ow0KKwlyZXR1cm4gdHJ1ZTsNCit9 DQorDQorLyoNCisgKiBtYXNfc2tpcF9ub2RlKCkgLSBJbnRlcm5hbCBmdW5jdGlvbi4gIFNraXAg b3ZlciBhIG5vZGUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlLg0KKyAqDQorICogUmV0dXJu OiB0cnVlIGlmIHRoZXJlIGlzIGFub3RoZXIgbm9kZSwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0K K3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfc2tpcF9ub2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0K K3sNCisJdW5zaWduZWQgY2hhciBzbG90LCBzbG90X2NvdW50Ow0KKwl1bnNpZ25lZCBsb25nICpw aXZvdHM7DQorCWVudW0gbWFwbGVfdHlwZSBtdDsNCisNCisJbXQgPSBtdGVfbm9kZV90eXBlKG1h cy0+bm9kZSk7DQorCXNsb3RfY291bnQgPSBtdF9zbG90c1ttdF0gLSAxOw0KKwlkbyB7DQorCQlp ZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkgew0KKwkJCXNsb3QgPSBtYXMtPm9mZnNldDsNCisJ CQlpZiAoc2xvdCA+IHNsb3RfY291bnQpIHsNCisJCQkJbWFzX3NldF9lcnIobWFzLCAtRUJVU1kp Ow0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQltYXNfYXNjZW5k KG1hcyk7DQorCQkJc2xvdCA9IG1hcy0+b2Zmc2V0Ow0KKwkJCW10ID0gbXRlX25vZGVfdHlwZSht YXMtPm5vZGUpOw0KKwkJCXNsb3RfY291bnQgPSBtdF9zbG90c1ttdF0gLSAxOw0KKwkJfQ0KKwl9 IHdoaWxlIChzbG90ID4gc2xvdF9jb3VudCk7DQorDQorCW1hcy0+b2Zmc2V0ID0gKytzbG90Ow0K KwlwaXZvdHMgPSBtYV9waXZvdHMobWFzX21uKG1hcyksIG10KTsNCisJaWYgKHNsb3QgPiAwKQ0K KwkJbWFzLT5taW4gPSBwaXZvdHNbc2xvdCAtIDFdICsgMTsNCisNCisJaWYgKHNsb3QgPD0gc2xv dF9jb3VudCkNCisJCW1hcy0+bWF4ID0gcGl2b3RzW3Nsb3RdOw0KKw0KKwlyZXR1cm4gdHJ1ZTsN Cit9DQorDQorLyoNCisgKiBtYXNfYXdhbGsoKSAtIEFsbG9jYXRpb24gd2Fsay4gIFNlYXJjaCBm cm9tIGxvdyBhZGRyZXNzIHRvIGhpZ2gsIGZvciBhIGdhcCBvZg0KKyAqIEBzaXplDQorICogQG1h czogVGhlIG1hcGxlIHN0YXRlDQorICogQHNpemU6IFRoZSBzaXplIG9mIHRoZSBnYXAgcmVxdWly ZWQNCisgKg0KKyAqIFNlYXJjaCBiZXR3ZWVuIEBtYXMtPmluZGV4IGFuZCBAbWFzLT5sYXN0IGZv ciBhIGdhcCBvZiBAc2l6ZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2F3YWxrKHN0 cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIHNpemUpDQorew0KKwlzdHJ1Y3QgbWFw bGVfZW5vZGUgKmxhc3QgPSBOVUxMOw0KKw0KKwkvKg0KKwkgKiBUaGVyZSBhcmUgNCBvcHRpb25z Og0KKwkgKiBnbyB0byBjaGlsZCAoZGVzY2VuZCkNCisJICogZ28gYmFjayB0byBwYXJlbnQgKGFz Y2VuZCkNCisJICogbm8gZ2FwIGZvdW5kLiAocmV0dXJuLCBzbG90ID09IE1BUExFX05PREVfU0xP VFMpDQorCSAqIGZvdW5kIHRoZSBnYXAuIChyZXR1cm4sIHNsb3QgIT0gTUFQTEVfTk9ERV9TTE9U UykNCisJICovDQorCXdoaWxlICghbWFzX2lzX2VycihtYXMpICYmICFtYXNfYW5vZGVfZGVzY2Vu ZChtYXMsIHNpemUpKSB7DQorCQlpZiAobGFzdCA9PSBtYXMtPm5vZGUpDQorCQkJbWFzX3NraXBf bm9kZShtYXMpOw0KKwkJZWxzZQ0KKwkJCWxhc3QgPSBtYXMtPm5vZGU7DQorCX0NCit9DQorDQor LyoNCisgKiBtYXNfZmlsbF9nYXAoKSAtIEZpbGwgYSBsb2NhdGVkIGdhcCB3aXRoIEBlbnRyeS4N CisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZW50cnk6IFRoZSB2YWx1ZSB0byBzdG9y ZQ0KKyAqIEBzbG90OiBUaGUgb2Zmc2V0IGludG8gdGhlIG5vZGUgdG8gc3RvcmUgdGhlIEBlbnRy eQ0KKyAqIEBzaXplOiBUaGUgc2l6ZSBvZiB0aGUgZW50cnkNCisgKiBAaW5kZXg6IFRoZSBzdGFy dCBsb2NhdGlvbg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfZmlsbF9nYXAoc3RydWN0 IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5LA0KKwkJdW5zaWduZWQgY2hhciBzbG90LCB1bnNp Z25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgKmluZGV4KQ0KK3sNCisJTUFfV1JfU1RBVEUo d3JfbWFzLCBtYXMsIGVudHJ5KTsNCisJdW5zaWduZWQgY2hhciBwc2xvdCA9IG10ZV9wYXJlbnRf c2xvdChtYXMtPm5vZGUpOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm1uID0gbWFzLT5ub2RlOw0K Kwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCWVudW0gbWFwbGVfdHlwZSBwdHlwZTsNCisJLyoN CisJICogbWFzLT5pbmRleCBpcyB0aGUgc3RhcnQgYWRkcmVzcyBmb3IgdGhlIHNlYXJjaA0KKwkg KiAgd2hpY2ggbWF5IG5vIGxvbmdlciBiZSBuZWVkZWQuDQorCSAqIG1hcy0+bGFzdCBpcyB0aGUg ZW5kIGFkZHJlc3MgZm9yIHRoZSBzZWFyY2gNCisJICovDQorDQorCSppbmRleCA9IG1hcy0+aW5k ZXg7DQorCW1hcy0+bGFzdCA9IG1hcy0+aW5kZXggKyBzaXplIC0gMTsNCisNCisJLyoNCisJICog SXQgaXMgcG9zc2libGUgdGhhdCB1c2luZyBtYXMtPm1heCBhbmQgbWFzLT5taW4gdG8gY29ycmVj dGx5DQorCSAqIGNhbGN1bGF0ZSB0aGUgaW5kZXggYW5kIGxhc3Qgd2lsbCBjYXVzZSBhbiBpc3N1 ZSBpbiB0aGUgZ2FwDQorCSAqIGNhbGN1bGF0aW9uLCBzbyBmaXggdGhlIG1hX3N0YXRlIGhlcmUN CisJICovDQorCW1hc19hc2NlbmQobWFzKTsNCisJcHR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+ bm9kZSk7DQorCXBpdm90cyA9IG1hX3Bpdm90cyhtYXNfbW4obWFzKSwgcHR5cGUpOw0KKwltYXMt Pm1heCA9IG1hc19zYWZlX3Bpdm90KG1hcywgcGl2b3RzLCBwc2xvdCwgcHR5cGUpOw0KKwltYXMt Pm1pbiA9IG1hc19zYWZlX21pbihtYXMsIHBpdm90cywgcHNsb3QpOw0KKwltYXMtPm5vZGUgPSBt bjsNCisJbWFzLT5vZmZzZXQgPSBzbG90Ow0KKwltYXNfd3Jfc3RvcmVfZW50cnkoJndyX21hcyk7 DQorfQ0KKw0KKy8qDQorICogbWFzX3NwYXJzZV9hcmVhKCkgLSBJbnRlcm5hbCBmdW5jdGlvbi4g IFJldHVybiB1cHBlciBvciBsb3dlciBsaW1pdCB3aGVuDQorICogc2VhcmNoaW5nIGZvciBhIGdh cCBpbiBhbiBlbXB0eSB0cmVlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtaW46 IHRoZSBtaW5pbXVtIHJhbmdlDQorICogQG1heDogVGhlIG1heGltdW0gcmFuZ2UNCisgKiBAc2l6 ZTogVGhlIHNpemUgb2YgdGhlIGdhcA0KKyAqIEBmd2Q6IFNlYXJjaGluZyBmb3J3YXJkIG9yIGJh Y2sNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3NwYXJzZV9hcmVhKHN0cnVjdCBtYV9z dGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbiwNCisJCQkJdW5zaWduZWQgbG9uZyBtYXgsIHVu c2lnbmVkIGxvbmcgc2l6ZSwgYm9vbCBmd2QpDQorew0KKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0g MDsNCisNCisJaWYgKCF1bmxpa2VseShtYXNfaXNfbm9uZShtYXMpKSkNCisJCXN0YXJ0Kys7DQor CS8qIG1hc19pc19wdHIgKi8NCisNCisJaWYgKHN0YXJ0IDwgbWluKQ0KKwkJc3RhcnQgPSBtaW47 DQorDQorCWlmIChmd2QpIHsNCisJCW1hcy0+aW5kZXggPSBzdGFydDsNCisJCW1hcy0+bGFzdCA9 IHN0YXJ0ICsgc2l6ZSAtIDE7DQorCQlyZXR1cm47DQorCX0NCisNCisJbWFzLT5pbmRleCA9IG1h eDsNCit9DQorDQorLyoNCisgKiBtYXNfZW1wdHlfYXJlYSgpIC0gR2V0IHRoZSBsb3dlc3QgYWRk cmVzcyB3aXRoaW4gdGhlIHJhbmdlIHRoYXQgaXMNCisgKiBzdWZmaWNpZW50IGZvciB0aGUgc2l6 ZSByZXF1ZXN0ZWQuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG1pbjogVGhlIGxv d2VzdCB2YWx1ZSBvZiB0aGUgcmFuZ2UNCisgKiBAbWF4OiBUaGUgaGlnaGVzdCB2YWx1ZSBvZiB0 aGUgcmFuZ2UNCisgKiBAc2l6ZTogVGhlIHNpemUgbmVlZGVkDQorICovDQoraW50IG1hc19lbXB0 eV9hcmVhKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbiwNCisJCXVuc2ln bmVkIGxvbmcgbWF4LCB1bnNpZ25lZCBsb25nIHNpemUpDQorew0KKwl1bnNpZ25lZCBjaGFyIG9m ZnNldDsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3RzOw0KKwllbnVtIG1hcGxlX3R5cGUgbXQ7DQor DQorCWlmIChtYXNfaXNfc3RhcnQobWFzKSkgew0KKwkJbWFzX3N0YXJ0KG1hcyk7DQorCX0gZWxz ZSBpZiAobWFzLT5vZmZzZXQgPj0gMikgew0KKwkJbWFzLT5vZmZzZXQgLT0gMjsNCisJfSBlbHNl IGlmICghbWFzX3NraXBfbm9kZShtYXMpKSB7DQorCQlyZXR1cm4gLUVCVVNZOw0KKwl9DQorDQor CS8qIEVtcHR5IHNldCAqLw0KKwlpZiAobWFzX2lzX25vbmUobWFzKSB8fCBtYXNfaXNfcHRyKG1h cykpIHsNCisJCW1hc19zcGFyc2VfYXJlYShtYXMsIG1pbiwgbWF4LCBzaXplLCB0cnVlKTsNCisJ CXJldHVybiAwOw0KKwl9DQorDQorCS8qIFRoZSBzdGFydCBvZiB0aGUgd2luZG93IGNhbiBvbmx5 IGJlIHdpdGhpbiB0aGVzZSB2YWx1ZXMgKi8NCisJbWFzLT5pbmRleCA9IG1pbjsNCisJbWFzLT5s YXN0ID0gbWF4Ow0KKwltYXNfYXdhbGsobWFzLCBzaXplKTsNCisNCisJaWYgKHVubGlrZWx5KG1h c19pc19lcnIobWFzKSkpDQorCQlyZXR1cm4geGFfZXJyKG1hcy0+bm9kZSk7DQorDQorCW9mZnNl dCA9IG1hcy0+b2Zmc2V0Ow0KKwlpZiAodW5saWtlbHkob2Zmc2V0ID09IE1BUExFX05PREVfU0xP VFMpKQ0KKwkJcmV0dXJuIC1FQlVTWTsNCisNCisJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9k ZSk7DQorCXBpdm90cyA9IG1hX3Bpdm90cyhtYXNfbW4obWFzKSwgbXQpOw0KKwlpZiAob2Zmc2V0 KQ0KKwkJbWFzLT5taW4gPSBwaXZvdHNbb2Zmc2V0IC0gMV0gKyAxOw0KKw0KKwlpZiAob2Zmc2V0 IDwgbXRfcGl2b3RzW210XSkNCisJCW1hcy0+bWF4ID0gcGl2b3RzW29mZnNldF07DQorDQorCWlm IChtYXMtPmluZGV4IDwgbWFzLT5taW4pDQorCQltYXMtPmluZGV4ID0gbWFzLT5taW47DQorDQor CW1hcy0+bGFzdCA9IG1hcy0+aW5kZXggKyBzaXplIC0gMTsNCisJcmV0dXJuIDA7DQorfQ0KKw0K Ky8qDQorICogbWFzX2VtcHR5X2FyZWFfcmV2KCkgLSBHZXQgdGhlIGhpZ2hlc3QgYWRkcmVzcyB3 aXRoaW4gdGhlIHJhbmdlIHRoYXQgaXMNCisgKiBzdWZmaWNpZW50IGZvciB0aGUgc2l6ZSByZXF1 ZXN0ZWQuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG1pbjogVGhlIGxvd2VzdCB2 YWx1ZSBvZiB0aGUgcmFuZ2UNCisgKiBAbWF4OiBUaGUgaGlnaGVzdCB2YWx1ZSBvZiB0aGUgcmFu Z2UNCisgKiBAc2l6ZTogVGhlIHNpemUgbmVlZGVkDQorICovDQoraW50IG1hc19lbXB0eV9hcmVh X3JldihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtaW4sDQorCQl1bnNpZ25l ZCBsb25nIG1heCwgdW5zaWduZWQgbG9uZyBzaXplKQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vub2Rl ICpsYXN0ID0gbWFzLT5ub2RlOw0KKw0KKwlpZiAobWFzX2lzX3N0YXJ0KG1hcykpIHsNCisJCW1h c19zdGFydChtYXMpOw0KKwkJbWFzLT5vZmZzZXQgPSBtYXNfZGF0YV9lbmQobWFzKTsNCisJfSBl bHNlIGlmIChtYXMtPm9mZnNldCA+PSAyKSB7DQorCQltYXMtPm9mZnNldCAtPSAyOw0KKwl9IGVs c2UgaWYgKCFtYXNfcmV3aW5kX25vZGUobWFzKSkgew0KKwkJcmV0dXJuIC1FQlVTWTsNCisJfQ0K Kw0KKwkvKiBFbXB0eSBzZXQuICovDQorCWlmIChtYXNfaXNfbm9uZShtYXMpIHx8IG1hc19pc19w dHIobWFzKSkgew0KKwkJbWFzX3NwYXJzZV9hcmVhKG1hcywgbWluLCBtYXgsIHNpemUsIGZhbHNl KTsNCisJCXJldHVybiAwOw0KKwl9DQorDQorCS8qIFRoZSBzdGFydCBvZiB0aGUgd2luZG93IGNh biBvbmx5IGJlIHdpdGhpbiB0aGVzZSB2YWx1ZXMuICovDQorCW1hcy0+aW5kZXggPSBtaW47DQor CW1hcy0+bGFzdCA9IG1heDsNCisNCisJd2hpbGUgKCFtYXNfcmV2X2F3YWxrKG1hcywgc2l6ZSkp IHsNCisJCWlmIChsYXN0ID09IG1hcy0+bm9kZSkgew0KKwkJCWlmICghbWFzX3Jld2luZF9ub2Rl KG1hcykpDQorCQkJCXJldHVybiAtRUJVU1k7DQorCQl9IGVsc2Ugew0KKwkJCWxhc3QgPSBtYXMt Pm5vZGU7DQorCQl9DQorCX0NCisNCisJaWYgKHVubGlrZWx5KG1hcy0+b2Zmc2V0ID09IE1BUExF X05PREVfU0xPVFMpKQ0KKwkJcmV0dXJuIC1FQlVTWTsNCisNCisJLyoNCisJICogbWFzX3Jldl9h d2FsaygpIGhhcyBzZXQgbWFzLT5taW4gYW5kIG1hcy0+bWF4IHRvIHRoZSBnYXAgdmFsdWVzLiAg SWYNCisJICogdGhlIG1heGltdW0gaXMgb3V0c2lkZSB0aGUgd2luZG93IHdlIGFyZSBzZWFyY2hp bmcsIHRoZW4gdXNlIHRoZSBsYXN0DQorCSAqIGxvY2F0aW9uIGluIHRoZSBzZWFyY2guDQorCSAq IG1hcy0+bWF4IGFuZCBtYXMtPm1pbiBpcyB0aGUgcmFuZ2Ugb2YgdGhlIGdhcC4NCisJICogbWFz LT5pbmRleCBhbmQgbWFzLT5sYXN0IGFyZSBjdXJyZW50bHkgc2V0IHRvIHRoZSBzZWFyY2ggcmFu Z2UuDQorCSAqLw0KKw0KKwkvKiBUcmltIHRoZSB1cHBlciBsaW1pdCB0byB0aGUgbWF4LiAqLw0K KwlpZiAobWFzLT5tYXggPD0gbWFzLT5sYXN0KQ0KKwkJbWFzLT5sYXN0ID0gbWFzLT5tYXg7DQor DQorCW1hcy0+aW5kZXggPSBtYXMtPmxhc3QgLSBzaXplICsgMTsNCisJcmV0dXJuIDA7DQorfQ0K Kw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hc19hbGxvYyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9p ZCAqZW50cnksDQorCQl1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgKmluZGV4KQ0K K3sNCisJdW5zaWduZWQgbG9uZyBtaW47DQorDQorCW1hc19zdGFydChtYXMpOw0KKwlpZiAobWFz X2lzX25vbmUobWFzKSB8fCBtYXNfaXNfcHRyKG1hcykpIHsNCisJCW1hc19yb290X2V4cGFuZCht YXMsIGVudHJ5KTsNCisJCWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQkJcmV0dXJuIHhhX2Vyciht YXMtPm5vZGUpOw0KKw0KKwkJaWYgKCFtYXMtPmluZGV4KQ0KKwkJCXJldHVybiBtdGVfcGl2b3Qo bWFzLT5ub2RlLCAwKTsNCisJCXJldHVybiBtdGVfcGl2b3QobWFzLT5ub2RlLCAxKTsNCisJfQ0K Kw0KKwkvKiBNdXN0IGJlIHdhbGtpbmcgYSB0cmVlLiAqLw0KKwltYXNfYXdhbGsobWFzLCBzaXpl KTsNCisJaWYgKG1hc19pc19lcnIobWFzKSkNCisJCXJldHVybiB4YV9lcnIobWFzLT5ub2RlKTsN CisNCisJaWYgKG1hcy0+b2Zmc2V0ID09IE1BUExFX05PREVfU0xPVFMpDQorCQlnb3RvIG5vX2dh cDsNCisNCisJLyoNCisJICogQXQgdGhpcyBwb2ludCwgbWFzLT5ub2RlIHBvaW50cyB0byB0aGUg cmlnaHQgbm9kZSBhbmQgd2UgaGF2ZSBhbg0KKwkgKiBvZmZzZXQgdGhhdCBoYXMgYSBzdWZmaWNp ZW50IGdhcC4NCisJICovDQorCW1pbiA9IG1hcy0+bWluOw0KKwlpZiAobWFzLT5vZmZzZXQpDQor CQltaW4gPSBtdGVfcGl2b3QobWFzLT5ub2RlLCBtYXMtPm9mZnNldCAtIDEpICsgMTsNCisNCisJ aWYgKG1hcy0+aW5kZXggPCBtaW4pDQorCQltYXMtPmluZGV4ID0gbWluOw0KKw0KKwltYXNfZmls bF9nYXAobWFzLCBlbnRyeSwgbWFzLT5vZmZzZXQsIHNpemUsIGluZGV4KTsNCisJcmV0dXJuIDA7 DQorDQorbm9fZ2FwOg0KKwlyZXR1cm4gLUVCVVNZOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGlu dCBtYXNfcmV2X2FsbG9jKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbiwN CisJCQkJdW5zaWduZWQgbG9uZyBtYXgsIHZvaWQgKmVudHJ5LA0KKwkJCQl1bnNpZ25lZCBsb25n IHNpemUsIHVuc2lnbmVkIGxvbmcgKmluZGV4KQ0KK3sNCisJaW50IHJldCA9IDA7DQorDQorCXJl dCA9IG1hc19lbXB0eV9hcmVhX3JldihtYXMsIG1pbiwgbWF4LCBzaXplKTsNCisJaWYgKHJldCkN CisJCXJldHVybiByZXQ7DQorDQorCWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQlyZXR1cm4geGFf ZXJyKG1hcy0+bm9kZSk7DQorDQorCWlmIChtYXMtPm9mZnNldCA9PSBNQVBMRV9OT0RFX1NMT1RT KQ0KKwkJZ290byBub19nYXA7DQorDQorCW1hc19maWxsX2dhcChtYXMsIGVudHJ5LCBtYXMtPm9m ZnNldCwgc2l6ZSwgaW5kZXgpOw0KKwlyZXR1cm4gMDsNCisNCitub19nYXA6DQorCXJldHVybiAt RUJVU1k7DQorfQ0KKw0KKy8qDQorICogbWFzX2RlYWRfbGVhdmVzKCkgLSBNYXJrIGFsbCBsZWF2 ZXMgb2YgYSBub2RlIGFzIGRlYWQuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQHNs b3RzOiBQb2ludGVyIHRvIHRoZSBzbG90IGFycmF5DQorICoNCisgKiBNdXN0IGhvbGQgdGhlIHdy aXRlIGxvY2suDQorICoNCisgKiBSZXR1cm46IFRoZSBudW1iZXIgb2YgbGVhdmVzIG1hcmtlZCBh cyBkZWFkLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUNCit1bnNpZ25lZCBjaGFyIG1hc19kZWFkX2xl YXZlcyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCBfX3JjdSAqKnNsb3RzKQ0KK3sNCisJc3Ry dWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCWludCBvZmZzZXQ7DQorDQorCWZvciAob2Zmc2V0ID0g MDsgb2Zmc2V0IDwgbXRfc2xvdF9jb3VudChtYXMtPm5vZGUpOyBvZmZzZXQrKykgew0KKwkJdm9p ZCAqZW50cnkgPSBtYXNfc2xvdF9sb2NrZWQobWFzLCBzbG90cywgb2Zmc2V0KTsNCisNCisJCW5v ZGUgPSBtdGVfdG9fbm9kZShlbnRyeSk7DQorCQlpZiAoIW5vZGUpDQorCQkJYnJlYWs7DQorCQlt dGVfc2V0X25vZGVfZGVhZChlbnRyeSk7DQorCQlzbXBfd21iKCk7DQorCQlub2RlLT50eXBlID0g bXRlX25vZGVfdHlwZShlbnRyeSk7DQorCQlyY3VfYXNzaWduX3BvaW50ZXIoc2xvdHNbb2Zmc2V0 XSwgbm9kZSk7DQorCX0NCisNCisJcmV0dXJuIG9mZnNldDsNCit9DQorDQorc3RhdGljIHZvaWQg KiptYXNfZGVhZF93YWxrKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBjaGFyIG9mZnNl dCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpuZXh0Ow0KKwl2b2lkICoqc2xvdHMgPSBOVUxM Ow0KKw0KKwluZXh0ID0gbWFzX21uKG1hcyk7DQorCWRvIHsNCisJCXN0cnVjdCBtYXBsZV9ub2Rl ICpub2RlOw0KKwkJbWFzLT5ub2RlID0gbWFfZW5vZGVfcHRyKG5leHQpOw0KKwkJbm9kZSA9IG1h c19tbihtYXMpOw0KKwkJc2xvdHMgPSBtYV9zbG90cyhub2RlLCBub2RlLT50eXBlKTsNCisJCW5l eHQgPSBtYXNfc2xvdF9sb2NrZWQobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJCW9mZnNldCA9IDA7 DQorCX0gd2hpbGUgKCFtYV9pc19sZWFmKG5leHQtPnR5cGUpKTsNCisNCisJcmV0dXJuIHNsb3Rz Ow0KK30NCisNCitzdGF0aWMgdm9pZCBtdF9mcmVlX3dhbGsoc3RydWN0IHJjdV9oZWFkICpoZWFk KQ0KK3sNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwg KnN0YXJ0Ow0KKwlzdHJ1Y3QgbWFwbGVfdHJlZSBtdDsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7 DQorCU1BX1NUQVRFKG1hcywgJm10LCAwLCAwKTsNCisNCisJbm9kZSA9IGNvbnRhaW5lcl9vZiho ZWFkLCBzdHJ1Y3QgbWFwbGVfbm9kZSwgcmN1KTsNCisNCisJaWYgKG1hX2lzX2xlYWYobm9kZS0+ dHlwZSkpDQorCQlnb3RvIGZyZWVfbGVhZjsNCisNCisJbXRfaW5pdF9mbGFncygmbXQsIG5vZGUt Pm1hX2ZsYWdzKTsNCisJbWFzX2xvY2soJm1hcyk7DQorCXN0YXJ0ID0gbm9kZTsNCisJbWFzLm5v ZGUgPSBtdF9ta19ub2RlKG5vZGUsIG5vZGUtPnR5cGUpOw0KKwlzbG90cyA9IG1hc19kZWFkX3dh bGsoJm1hcywgMCk7DQorCW5vZGUgPSBtYXNfbW4oJm1hcyk7DQorCWRvIHsNCisJCWVudW0gbWFw bGVfdHlwZSB0eXBlOw0KKw0KKwkJbXRfZnJlZV9idWxrKG5vZGUtPnNsb3RfbGVuLCBzbG90cyk7 DQorCQlvZmZzZXQgPSBub2RlLT5wYXJlbnRfc2xvdCArIDE7DQorCQltYXMubm9kZSA9IG5vZGUt PnBpdl9wYXJlbnQ7DQorCQlpZiAobWFzX21uKCZtYXMpID09IG5vZGUpDQorCQkJZ290byBzdGFy dF9zbG90c19mcmVlOw0KKwkJdHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLm5vZGUpOw0KKwkJc2xv dHMgPSBtYV9zbG90cyhtdGVfdG9fbm9kZShtYXMubm9kZSksIHR5cGUpOw0KKwkJaWYgKChvZmZz ZXQgPCBtdF9zbG90c1t0eXBlXSkgJiYgKHNsb3RzW29mZnNldF0pKSB7DQorCQkJc2xvdHMgPSBt YXNfZGVhZF93YWxrKCZtYXMsIG9mZnNldCk7DQorCQl9DQorCQlub2RlID0gbWFzX21uKCZtYXMp Ow0KKwl9IHdoaWxlICgobm9kZSAhPSBzdGFydCkgfHwgKG5vZGUtPnNsb3RfbGVuIDwgb2Zmc2V0 KSk7DQorDQorCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgbm9kZS0+dHlwZSk7DQorCW10X2ZyZWVf YnVsayhub2RlLT5zbG90X2xlbiwgc2xvdHMpOw0KKw0KK3N0YXJ0X3Nsb3RzX2ZyZWU6DQorZnJl ZV9sZWFmOg0KKwltdF9mcmVlX3JjdSgmbm9kZS0+cmN1KTsNCit9DQorDQorc3RhdGljIGlubGlu ZSB2b2lkIF9fcmN1ICoqbWFzX2Rlc3Ryb3lfZGVzY2VuZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywN CisJCQlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnByZXYsIHVuc2lnbmVkIGNoYXIgb2Zmc2V0KQ0KK3sN CisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbmV4dCA9 IG1hcy0+bm9kZTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzID0gTlVMTDsNCisNCisJZG8gew0KKwkJ bWFzLT5ub2RlID0gbmV4dDsNCisJCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJCXNsb3RzID0gbWFf c2xvdHMobm9kZSwgbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpKTsNCisJCW5leHQgPSBtYXNfc2xv dF9sb2NrZWQobWFzLCBzbG90cywgMCk7DQorCQltdGVfc2V0X25vZGVfZGVhZChtYXMtPm5vZGUp Ow0KKwkJbm9kZS0+dHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJCW5vZGUtPnBp dl9wYXJlbnQgPSBwcmV2Ow0KKwkJbm9kZS0+cGFyZW50X3Nsb3QgPSBvZmZzZXQ7DQorCQlvZmZz ZXQgPSAwOw0KKwkJcHJldiA9IG1hcy0+bm9kZTsNCisJfSB3aGlsZSAoIW10ZV9pc19sZWFmKG5l eHQpKTsNCisJcmV0dXJuIHNsb3RzOw0KK30NCisNCitzdGF0aWMgdm9pZCBtdF9kZXN0cm95X3dh bGsoc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSwgdW5zaWduZWQgY2hhciBtYV9mbGFncywNCisJ CQkgICAgYm9vbCBmcmVlKQ0KK3sNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwlzdHJ1Y3QgbWFw bGVfbm9kZSAqbm9kZSA9IG10ZV90b19ub2RlKGVub2RlKTsNCisJc3RydWN0IG1hcGxlX2Vub2Rl ICpzdGFydDsNCisJc3RydWN0IG1hcGxlX3RyZWUgbXQ7DQorDQorCU1BX1NUQVRFKG1hcywgJm10 LCAwLCAwKTsNCisNCisJaWYgKG10ZV9pc19sZWFmKGVub2RlKSkNCisJCWdvdG8gZnJlZV9sZWFm Ow0KKw0KKwltdF9pbml0X2ZsYWdzKCZtdCwgbWFfZmxhZ3MpOw0KKwltYXNfbG9jaygmbWFzKTsN CisNCisJbWFzLm5vZGUgPSBzdGFydCA9IGVub2RlOw0KKwlzbG90cyA9IG1hc19kZXN0cm95X2Rl c2NlbmQoJm1hcywgc3RhcnQsIDApOw0KKwlub2RlID0gbWFzX21uKCZtYXMpOw0KKwlkbyB7DQor CQllbnVtIG1hcGxlX3R5cGUgdHlwZTsNCisJCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKw0KKwkJ bm9kZS0+c2xvdF9sZW4gPSBtYXNfZGVhZF9sZWF2ZXMoJm1hcywgc2xvdHMpOw0KKwkJaWYgKGZy ZWUpDQorCQkJbXRfZnJlZV9idWxrKG5vZGUtPnNsb3RfbGVuLCBzbG90cyk7DQorCQlvZmZzZXQg PSBub2RlLT5wYXJlbnRfc2xvdCArIDE7DQorCQltYXMubm9kZSA9IG5vZGUtPnBpdl9wYXJlbnQ7 DQorCQlpZiAobWFzX21uKCZtYXMpID09IG5vZGUpDQorCQkJZ290byBzdGFydF9zbG90c19mcmVl Ow0KKwkJdHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLm5vZGUpOw0KKwkJc2xvdHMgPSBtYV9zbG90 cyhtdGVfdG9fbm9kZShtYXMubm9kZSksIHR5cGUpOw0KKwkJaWYgKChvZmZzZXQgPCBtdF9zbG90 c1t0eXBlXSkgJiYgKHNsb3RzW29mZnNldF0pKSB7DQorCQkJc3RydWN0IG1hcGxlX2Vub2RlICpw YXJlbnQgPSBtYXMubm9kZTsNCisNCisJCQltYXMubm9kZSA9IHNsb3RzW29mZnNldF07DQorCQkJ c2xvdHMgPSBtYXNfZGVzdHJveV9kZXNjZW5kKCZtYXMsIHBhcmVudCwgb2Zmc2V0KTsNCisJCX0N CisJCW5vZGUgPSBtYXNfbW4oJm1hcyk7DQorCX0gd2hpbGUgKHN0YXJ0ICE9IG1hcy5ub2RlKTsN CisNCisJbm9kZSA9IG1hc19tbigmbWFzKTsNCisJbm9kZS0+c2xvdF9sZW4gPSBtYXNfZGVhZF9s ZWF2ZXMoJm1hcywgc2xvdHMpOw0KKwlpZiAoZnJlZSkNCisJCW10X2ZyZWVfYnVsayhub2RlLT5z bG90X2xlbiwgc2xvdHMpOw0KKw0KK3N0YXJ0X3Nsb3RzX2ZyZWU6DQorCW1hc191bmxvY2soJm1h cyk7DQorDQorZnJlZV9sZWFmOg0KKwlpZiAoZnJlZSkNCisJCW10X2ZyZWVfcmN1KCZub2RlLT5y Y3UpOw0KK30NCisNCisvKg0KKyAqIG10ZV9kZXN0cm95X3dhbGsoKSAtIEZyZWUgYSB0cmVlIG9y IHN1Yi10cmVlLg0KKyAqIEBlbm9kZSAtIHRoZSBlbmNvZGVkIG1hcGxlIG5vZGUgKG1hcGxlX2Vu b2RlKSB0byBzdGFydA0KKyAqIEBtbiAtIHRoZSB0cmVlIHRvIGZyZWUgLSBuZWVkZWQgZm9yIG5v ZGUgdHlwZXMuDQorICoNCisgKiBNdXN0IGhvbGQgdGhlIHdyaXRlIGxvY2suDQorICovDQorc3Rh dGljIGlubGluZSB2b2lkIG10ZV9kZXN0cm95X3dhbGsoc3RydWN0IG1hcGxlX2Vub2RlICplbm9k ZSwNCisJCQkJICAgIHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCXN0cnVjdCBtYXBsZV9u b2RlICpub2RlID0gbXRlX3RvX25vZGUoZW5vZGUpOw0KKw0KKwlpZiAobXRfaW5fcmN1KG10KSkg ew0KKwkJbXRfZGVzdHJveV93YWxrKGVub2RlLCBtdC0+bWFfZmxhZ3MsIGZhbHNlKTsNCisJCWNh bGxfcmN1KCZub2RlLT5yY3UsIG10X2ZyZWVfd2Fsayk7DQorCX0gZWxzZSB7DQorCQltdF9kZXN0 cm95X3dhbGsoZW5vZGUsIG10LT5tYV9mbGFncywgdHJ1ZSk7DQorCX0NCit9DQorDQordm9pZCBt YXNfd3Jfc3RvcmVfc2V0dXAoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwlpZiAo IW1hc19pc19zdGFydCh3cl9tYXMtPm1hcykpIHsNCisJCWlmIChtYXNfaXNfbm9uZSh3cl9tYXMt Pm1hcykpDQorCQkJbWFzX3Jlc2V0KHdyX21hcy0+bWFzKTsNCisJCWVsc2Ugew0KKwkJCXdyX21h cy0+cl9tYXggPSB3cl9tYXMtPm1hcy0+bWF4Ow0KKwkJCXdyX21hcy0+dHlwZSA9IG10ZV9ub2Rl X3R5cGUod3JfbWFzLT5tYXMtPm5vZGUpOw0KKwkJCWlmIChtYXNfaXNfc3Bhbl93cih3cl9tYXMp KQ0KKwkJCQltYXNfcmVzZXQod3JfbWFzLT5tYXMpOw0KKwkJfQ0KKwl9DQorDQorfQ0KKw0KKy8q IEludGVyZmFjZSAqLw0KKw0KKy8qKg0KKyAqIG1hc19zdG9yZSgpIC0gU3RvcmUgYW4gQGVudHJ5 Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBz dG9yZS4NCisgKg0KKyAqIFRoZSBAbWFzLT5pbmRleCBhbmQgQG1hcy0+bGFzdCBpcyB1c2VkIHRv IHNldCB0aGUgcmFuZ2UgZm9yIHRoZSBAZW50cnkuDQorICogTm90ZTogVGhlIEBtYXMgc2hvdWxk IGhhdmUgcHJlLWFsbG9jYXRlZCBlbnRyaWVzIHRvIGVuc3VyZSB0aGVyZSBpcyBtZW1vcnkgdG8N CisgKiBzdG9yZSB0aGUgZW50cnkuICBQbGVhc2Ugc2VlIG1hc19leHBlY3RlZF9lbnRyaWVzKCkv bWFzX2Rlc3Ryb3koKSBmb3IgbW9yZSBkZXRhaWxzLg0KKyAqLw0KK3ZvaWQgKm1hc19zdG9yZShz dHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50cnkpDQorew0KKwlNQV9XUl9TVEFURSh3cl9t YXMsIG1hcywgZW50cnkpOw0KKw0KKwl0cmFjZV9tYV93cml0ZShfX2Z1bmNfXywgbWFzLCAwLCBl bnRyeSk7DQorI2lmZGVmIENPTkZJR19ERUJVR19NQVBMRV9UUkVFDQorCWlmIChtYXMtPmluZGV4 ID4gbWFzLT5sYXN0KQ0KKwkJcHJpbnRrKCJFcnJvciAlbHUgPiAlbHUgJXBcbiIsIG1hcy0+aW5k ZXgsIG1hcy0+bGFzdCwgZW50cnkpOw0KKwlNVF9CVUdfT04obWFzLT50cmVlLCBtYXMtPmluZGV4 ID4gbWFzLT5sYXN0KTsNCisJaWYgKG1hcy0+aW5kZXggPiBtYXMtPmxhc3QpIHsNCisJCW1hc19z ZXRfZXJyKG1hcywgLUVJTlZBTCk7DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKyNlbmRpZg0K Kw0KKy8qDQorICogU3RvcmluZyBpcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgaW5zZXJ0IHdpdGgg dGhlIGFkZGVkIGNhdmVhdCB0aGF0IGl0IGNhbg0KKyAqIG92ZXJ3cml0ZSBlbnRyaWVzLiAgQWx0 aG91Z2ggdGhpcyBzZWVtcyBzaW1wbGUgZW5vdWdoLCBvbmUgbWF5IHdhbnQgdG8NCisgKiBleGFt aW5lIHdoYXQgaGFwcGVucyBpZiBhIHNpbmdsZSBzdG9yZSBvcGVyYXRpb24gd2FzIHRvIG92ZXJ3 cml0ZSBtdWx0aXBsZQ0KKyAqIGVudHJpZXMgd2l0aGluIGEgc2VsZi1iYWxhbmNpbmcgQi1UcmVl Lg0KKyAqLw0KKwltYXNfd3Jfc3RvcmVfc2V0dXAoJndyX21hcyk7DQorCW1hc193cl9zdG9yZV9l bnRyeSgmd3JfbWFzKTsNCisJcmV0dXJuIHdyX21hcy5jb250ZW50Ow0KK30NCisNCisvKioNCisg KiBtYXNfc3RvcmVfZ2ZwKCkgLSBTdG9yZSBhIHZhbHVlIGludG8gdGhlIHRyZWUuDQorICogQG1h czogVGhlIG1hcGxlIHN0YXRlDQorICogQGVudHJ5OiBUaGUgZW50cnkgdG8gc3RvcmUNCisgKiBA Z2ZwOiBUaGUgR0ZQX0ZMQUdTIHRvIHVzZSBmb3IgYWxsb2NhdGlvbnMgaWYgbmVjZXNzYXJ5Lg0K KyAqDQorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgb24gaW52YWxpZCByZXF1ZXN0 LCAtRU5PTUVNIGlmIG1lbW9yeSBjb3VsZCBub3QNCisgKiBiZSBhbGxvY2F0ZWQuDQorICovDQor aW50IG1hc19zdG9yZV9nZnAoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5LCBnZnBf dCBnZnApDQorew0KKwlNQV9XUl9TVEFURSh3cl9tYXMsIG1hcywgZW50cnkpOw0KKw0KKwltYXNf d3Jfc3RvcmVfc2V0dXAoJndyX21hcyk7DQorCXRyYWNlX21hX3dyaXRlKF9fZnVuY19fLCBtYXMs IDAsIGVudHJ5KTsNCityZXRyeToNCisJbWFzX3dyX3N0b3JlX2VudHJ5KCZ3cl9tYXMpOw0KKwlp ZiAodW5saWtlbHkobWFzX25vbWVtKG1hcywgZ2ZwKSkpDQorCQlnb3RvIHJldHJ5Ow0KKw0KKwlp ZiAodW5saWtlbHkobWFzX2lzX2VycihtYXMpKSkNCisJCXJldHVybiB4YV9lcnIobWFzLT5ub2Rl KTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qDQorICogbWFzX2V4cGVjdGVkX2VudHJpZXMo KSAtIFNldCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGVudHJpZXMgdGhhdCB3aWxsIGJlIGluc2Vy dGVkLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBucl9lbnRyaWVzOiBUaGUgbnVt YmVyIG9mIGV4cGVjdGVkIGVudHJpZXMuDQorICoNCisgKiBUaGlzIHdpbGwgYXR0ZW1wdCB0byBw cmUtYWxsb2NhdGUgZW5vdWdoIG5vZGVzIHRvIHN0b3JlIHRoZSBleHBlY3RlZCBudW1iZXINCisg KiBvZiBlbnRyaWVzLiAgVGhlIGFsbG9jYXRpb25zIHdpbGwgb2NjdXIgdXNpbmcgdGhlIGJ1bGsg YWxsb2NhdG9yIGludGVyZmFjZQ0KKyAqIGZvciBzcGVlZC4gIFBsZWFzZSBjYWxsIG1hc19kZXN0 cm95KCkgb24gdGhlIEBtYXMgYWZ0ZXIgaW5zZXJ0aW5nIHRoZSBlbnRyaWVzDQorICogdG8gZW5z dXJlIGFueSB1bnVzZWQgbm9kZXMgYXJlIGZyZWVkLg0KKyAqDQorICogUmV0dXJuOiAwIG9uIHN1 Y2Nlc3MsIC1FTk9NRU0gaWYgbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuDQorICovDQor aW50IG1hc19leHBlY3RlZF9lbnRyaWVzKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBs b25nIG5yX2VudHJpZXMpDQorew0KKwlpbnQgbm9ubGVhZl9jYXAgPSBNQVBMRV9BUkFOR0U2NF9T TE9UUyAtIDI7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGUgPSBtYXMtPm5vZGU7DQorCWlu dCBucl9ub2RlczsNCisJaW50IHJldDsNCisNCisJLyoNCisJICogU29tZXRpbWVzIGl0IGlzIG5l Y2Vzc2FyeSB0byBkdXBsaWNhdGUgYSB0cmVlIHRvIGEgbmV3IHRyZWUsIHN1Y2ggYXMNCisJICog Zm9ya2luZyBhIHByb2Nlc3MgYW5kIGR1cGxpY2F0aW5nIHRoZSBWTUFzIGZyb20gb25lIHRyZWUg dG8gYSBuZXcNCisJICogdHJlZS4gIFdoZW4gc3VjaCBhIHNpdHVhdGlvbiBhcmlzZXMsIGl0IGlz IGtub3duIHRoYXQgdGhlIG5ldyB0cmVlIGlzDQorCSAqIG5vdCBnb2luZyB0byBiZSB1c2VkIHVu dGlsIHRoZSBlbnRpcmUgdHJlZSBpcyBwb3B1bGF0ZWQuICBGb3INCisJICogcGVyZm9ybWFuY2Ug cmVhc29ucywgaXQgaXMgYmVzdCB0byB1c2UgYSBidWxrIGxvYWQgd2l0aCBSQ1UgZGlzYWJsZWQu DQorCSAqIFRoaXMgYWxsb3dzIGZvciBvcHRpbWlzdGljIHNwbGl0dGluZyB0aGF0IGZhdm91cnMg dGhlIGxlZnQgYW5kIHJldXNlDQorCSAqIG9mIG5vZGVzIGR1cmluZyB0aGUgb3BlcmF0aW9uLg0K KwkgKi8NCisNCisJLyogT3B0aW1pemUgc3BsaXR0aW5nIGZvciBidWxrIGluc2VydCBpbi1vcmRl ciAqLw0KKwltYXMtPm1hc19mbGFncyB8PSBNQV9TVEFURV9CVUxLOw0KKw0KKwkvKg0KKwkgKiBB dm9pZCBvdmVyZmxvdywgYXNzdW1lIGEgZ2FwIGJldHdlZW4gZWFjaCBlbnRyeSBhbmQgYSB0cmFp bGluZyBudWxsLg0KKwkgKiBJZiB0aGlzIGlzIHdyb25nLCBpdCBqdXN0IG1lYW5zIGFsbG9jYXRp b24gY2FuIGhhcHBlbiBkdXJpbmcNCisJICogaW5zZXJ0aW9uIG9mIGVudHJpZXMuDQorCSAqLw0K Kwlucl9ub2RlcyA9IG1heChucl9lbnRyaWVzLCBucl9lbnRyaWVzICogMiArIDEpOw0KKw0KKwlp ZiAoIW10X2lzX2FsbG9jKG1hcy0+dHJlZSkpDQorCQlub25sZWFmX2NhcCA9IE1BUExFX1JBTkdF NjRfU0xPVFMgLSAyOw0KKw0KKwkvKiBMZWF2ZXMgKi8NCisJbnJfbm9kZXMgPSBESVZfUk9VTkRf VVAobnJfbm9kZXMsIE1BUExFX1JBTkdFNjRfU0xPVFMgLSAxKTsNCisJLyogSW50ZXJuYWwgbm9k ZXMgKi8NCisJbnJfbm9kZXMgKz0gRElWX1JPVU5EX1VQKG5yX25vZGVzLCBub25sZWFmX2NhcCk7 DQorCW1hc19ub2RlX2NvdW50KG1hcywgbnJfbm9kZXMpOw0KKw0KKwlpZiAoIW1hc19pc19lcnIo bWFzKSkNCisJCXJldHVybiAwOw0KKw0KKwlyZXQgPSB4YV9lcnIobWFzLT5ub2RlKTsNCisJbWFz LT5ub2RlID0gZW5vZGU7DQorCXJldHVybiByZXQ7DQorDQorfQ0KKw0KKy8qDQorICogbWFzX2Rl c3Ryb3koKSAtIGRlc3Ryb3kgYSBtYXBsZSBzdGF0ZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3Rh dGUNCisgKg0KKyAqIFVwb24gY29tcGxldGlvbiwgY2hlY2sgdGhlIGxlZnQtbW9zdCBub2RlIGFu ZCByZWJhbGFuY2UgYWdhaW5zdCB0aGUgbm9kZSB0bw0KKyAqIHRoZSByaWdodCBpZiBuZWNlc3Nh cnkuICBGcmVlcyBhbnkgYWxsb2NhdGVkIG5vZGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1hcGxl DQorICogc3RhdGUuDQorICovDQordm9pZCBtYXNfZGVzdHJveShzdHJ1Y3QgbWFfc3RhdGUgKm1h cykNCit7DQorCXN0cnVjdCBtYXBsZV9hbGxvYyAqbm9kZTsNCisNCisJLyoNCisJICogV2hlbiB1 c2luZyBtYXNfZm9yX2VhY2goKSB0byBpbnNlcnQgYW4gZXhwZWN0ZWQgbnVtYmVyIG9mIGVsZW1l bnRzLA0KKwkgKiBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBudW1iZXIgaW5zZXJ0ZWQgaXMgbGVz cyB0aGFuIHRoZSBleHBlY3RlZA0KKwkgKiBudW1iZXIuICBUbyBmaXggYW4gaW52YWxpZCBmaW5h bCBub2RlLCBhIGNoZWNrIGlzIHBlcmZvcm1lZCBoZXJlIHRvDQorCSAqIHJlYmFsYW5jZSB0aGUg cHJldmlvdXMgbm9kZSB3aXRoIHRoZSBmaW5hbCBub2RlLg0KKwkgKi8NCisJaWYgKG1hcy0+bWFz X2ZsYWdzICYgTUFfU1RBVEVfUkVCQUxBTkNFKSB7DQorCQl1bnNpZ25lZCBjaGFyIGVuZDsNCisN CisJCWlmIChtYXNfaXNfc3RhcnQobWFzKSkNCisJCQltYXNfc3RhcnQobWFzKTsNCisNCisJCW10 cmVlX3JhbmdlX3dhbGsobWFzKTsNCisJCWVuZCA9IG1hc19kYXRhX2VuZChtYXMpICsgMTsNCisJ CWlmIChlbmQgPCBtdF9taW5fc2xvdF9jb3VudChtYXMtPm5vZGUpIC0gMSkNCisJCQltYXNfZGVz dHJveV9yZWJhbGFuY2UobWFzLCBlbmQpOw0KKw0KKwkJbWFzLT5tYXNfZmxhZ3MgJj0gfk1BX1NU QVRFX1JFQkFMQU5DRTsNCisJfQ0KKwltYXMtPm1hc19mbGFncyAmPSB+TUFfU1RBVEVfQlVMSzsN CisNCisJd2hpbGUgKG1hcy0+YWxsb2MgJiYgISgodW5zaWduZWQgbG9uZyltYXMtPmFsbG9jICYg MHgxKSkgew0KKwkJbm9kZSA9IG1hcy0+YWxsb2M7DQorCQltYXMtPmFsbG9jID0gbm9kZS0+c2xv dFswXTsNCisJCWlmIChub2RlLT5ub2RlX2NvdW50ID4gMCkNCisJCQltdF9mcmVlX2J1bGsobm9k ZS0+bm9kZV9jb3VudCwNCisJCQkJICAgICAodm9pZCBfX3JjdSAqKikmbm9kZS0+c2xvdFsxXSk7 DQorCQlrbWVtX2NhY2hlX2ZyZWUobWFwbGVfbm9kZV9jYWNoZSwgbm9kZSk7DQorCX0NCisJbWFz LT5hbGxvYyA9IE5VTEw7DQorfQ0KKw0KKy8qKg0KKyAqIG1hc19uZXh0KCkgLSBHZXQgdGhlIG5l eHQgZW50cnkuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG1heDogVGhlIG1heGlt dW0gaW5kZXggdG8gY2hlY2suDQorICoNCisgKiBSZXR1cm5zIHRoZSBuZXh0IGVudHJ5IGFmdGVy IEBtYXMtPmluZGV4Lg0KKyAqIE11c3QgaG9sZCByY3VfcmVhZF9sb2NrIG9yIHRoZSB3cml0ZSBs b2NrLg0KKyAqIENhbiByZXR1cm4gdGhlIHplcm8gZW50cnkuDQorICoNCisgKiBSZXR1cm46IFRo ZSBuZXh0IGVudHJ5IG9yICVOVUxMDQorICovDQordm9pZCAqbWFzX25leHQoc3RydWN0IG1hX3N0 YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWF4KQ0KK3sNCisJaWYgKG1hc19pc19ub25lKG1hcykg fHwgbWFzX2lzX3BhdXNlZChtYXMpKQ0KKwkJbWFzLT5ub2RlID0gTUFTX1NUQVJUOw0KKw0KKwlp ZiAodW5saWtlbHkoIW1hc19zZWFyY2hhYmxlKG1hcykpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQor CWlmIChtYXNfaXNfc3RhcnQobWFzKSkgew0KKwkJLyogUmV0cmllcyBvbiBkZWFkIG5vZGVzIGhh bmRsZWQgYnkgbWFzX3dhbGsgKi8NCisJCW1hc193YWxrKG1hcyk7DQorCQlpZiAobWFzLT5sYXN0 ID09IFVMT05HX01BWCkNCisJCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwkvKiBSZXRyaWVzIG9u IGRlYWQgbm9kZXMgaGFuZGxlZCBieSBtYXNfbmV4dF9lbnRyeSAqLw0KKwlyZXR1cm4gbWFzX25l eHRfZW50cnkobWFzLCBtYXgpOw0KK30NCitFWFBPUlRfU1lNQk9MX0dQTChtYXNfbmV4dCk7DQor DQorLyoqDQorICogbXRfbmV4dCgpIC0gZ2V0IHRoZSBuZXh0IHZhbHVlIGluIHRoZSBtYXBsZSB0 cmVlDQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAqIEBpbmRleDogVGhlIHN0YXJ0IGluZGV4 DQorICogQG1heDogVGhlIG1heGltdW0gaW5kZXggdG8gY2hlY2sNCisgKg0KKyAqIFJldHVybnM6 IFRoZSBlbnRyeSBhdCBAaW5kZXggb3IgaGlnaGVyLCBvciAlTlVMTCBpZiBub3RoaW5nIGlzIGZv dW5kLg0KKyAqLw0KK3ZvaWQgKm10X25leHQoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25l ZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIG1heCkNCit7DQorCXZvaWQgKmVudHJ5ID0gTlVM TDsNCisJTUFfU1RBVEUobWFzLCBtdCwgaW5kZXgsIGluZGV4KTsNCisNCisJcmN1X3JlYWRfbG9j aygpOw0KKwllbnRyeSA9IG1hc19uZXh0KCZtYXMsIG1heCk7DQorCXJjdV9yZWFkX3VubG9jaygp Ow0KKwlyZXR1cm4gZW50cnk7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKG10X25leHQpOw0KKw0K Ky8qKg0KKyAqIG1hc19wcmV2KCkgLSBHZXQgdGhlIHByZXZpb3VzIGVudHJ5DQorICogQG1hczog VGhlIG1hcGxlIHN0YXRlDQorICogQG1pbjogVGhlIG1pbmltdW0gdmFsdWUgdG8gY2hlY2suDQor ICoNCisgKiBNdXN0IGhvbGQgcmN1X3JlYWRfbG9jayBvciB0aGUgd3JpdGUgbG9jay4NCisgKiBX aWxsIHJlc2V0IG1hcyB0byBNQVNfU1RBUlQgaWYgdGhlIG5vZGUgaXMgTUFTX05PTkUuICBXaWxs IHN0b3Agb24gbm90DQorICogc2VhcmNoYWJsZSBub2Rlcy4NCisgKg0KKyAqIFJldHVybjogdGhl IHByZXZpb3VzIHZhbHVlIG9yICVOVUxMLg0KKyAqLw0KK3ZvaWQgKm1hc19wcmV2KHN0cnVjdCBt YV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbikNCit7DQorCWlmICghbWFzLT5pbmRleCkg ew0KKwkJLyogTm90aGluZyBjb21lcyBiZWZvcmUgMCAqLw0KKwkJbWFzLT5sYXN0ID0gMDsNCisJ CXJldHVybiBOVUxMOw0KKwl9DQorDQorCWlmICh1bmxpa2VseShtYXNfaXNfcHRyKG1hcykpKQ0K KwkJcmV0dXJuIE5VTEw7DQorDQorCWlmIChtYXNfaXNfbm9uZShtYXMpIHx8IG1hc19pc19wYXVz ZWQobWFzKSkNCisJCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisNCisJaWYgKG1hc19pc19zdGFy dChtYXMpKSB7DQorCQltYXNfd2FsayhtYXMpOw0KKwkJaWYgKCFtYXMtPmluZGV4KQ0KKwkJCXJl dHVybiBOVUxMOw0KKwl9DQorDQorCXJldHVybiBtYXNfcHJldl9lbnRyeShtYXMsIG1pbik7DQor fQ0KK0VYUE9SVF9TWU1CT0xfR1BMKG1hc19wcmV2KTsNCisNCisvKioNCisgKiBtdF9wcmV2KCkg LSBnZXQgdGhlIHByZXZpb3VzIHZhbHVlIGluIHRoZSBtYXBsZSB0cmVlDQorICogQG10OiBUaGUg bWFwbGUgdHJlZQ0KKyAqIEBpbmRleDogVGhlIHN0YXJ0IGluZGV4DQorICogQG1heDogVGhlIG1p bnVtdW0gaW5kZXggdG8gY2hlY2sNCisgKg0KKyAqIFJldHVybnM6IFRoZSBlbnRyeSBhdCBAaW5k ZXggb3IgbG93ZXIsIG9yICVOVUxMIGlmIG5vdGhpbmcgaXMgZm91bmQuDQorICovDQordm9pZCAq bXRfcHJldihzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2ln bmVkIGxvbmcgbWluKQ0KK3sNCisJdm9pZCAqZW50cnkgPSBOVUxMOw0KKwlNQV9TVEFURShtYXMs IG10LCBpbmRleCwgaW5kZXgpOw0KKw0KKwlyY3VfcmVhZF9sb2NrKCk7DQorCWVudHJ5ID0gbWFz X3ByZXYoJm1hcywgbWluKTsNCisJcmN1X3JlYWRfdW5sb2NrKCk7DQorCXJldHVybiBlbnRyeTsN Cit9DQorRVhQT1JUX1NZTUJPTF9HUEwobXRfcHJldik7DQorDQorLyoqDQorICogbWFzX3BhdXNl KCkgLSBQYXVzZSBhIG1hc19maW5kL21hc19mb3JfZWFjaCB0byBkcm9wIHRoZSBsb2NrLg0KKyAq DQorICogU29tZSB1c2VycyBuZWVkIHRvIHBhdXNlIGEgd2FsayBhbmQgZHJvcCB0aGUgbG9jayB0 aGV5J3JlIGhvbGRpbmcgaW4NCisgKiBvcmRlciB0byB5aWVsZCB0byBhIGhpZ2hlciBwcmlvcml0 eSB0aHJlYWQgb3IgY2Fycnkgb3V0IGFuIG9wZXJhdGlvbg0KKyAqIG9uIGFuIGVudHJ5LiAgVGhv c2UgdXNlcnMgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgdGhleSBkcm9wDQorICog dGhlIGxvY2suICBJdCByZXNldHMgdGhlIEBtYXMgdG8gYmUgc3VpdGFibGUgZm9yIHRoZSBuZXh0 IGl0ZXJhdGlvbg0KKyAqIG9mIHRoZSBsb29wIGFmdGVyIHRoZSB1c2VyIGhhcyByZWFjcXVpcmVk IHRoZSBsb2NrLiAgSWYgbW9zdCBlbnRyaWVzDQorICogZm91bmQgZHVyaW5nIGEgd2FsayByZXF1 aXJlIHlvdSB0byBjYWxsIG1hc19wYXVzZSgpLCB0aGUgbXRfZm9yX2VhY2goKQ0KKyAqIGl0ZXJh dG9yIG1heSBiZSBtb3JlIGFwcHJvcHJpYXRlLg0KKyAqDQorICovDQordm9pZCBtYXNfcGF1c2Uo c3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwltYXMtPm5vZGUgPSBNQVNfUEFVU0U7DQorfQ0K K0VYUE9SVF9TWU1CT0xfR1BMKG1hc19wYXVzZSk7DQorDQorLyoNCisgKiBtYXNfZmluZDogSWYg bWFzLT5ub2RlID09IE1BU19TVEFSVCwgZmluZCB0aGUgZmlyc3QNCisgKiBub24tTlVMTCBlbnRy eSA+PSBtYXMtPmluZGV4Lg0KKyAqIE90aGVyd2lzZSwgZmluZCB0aGUgZmlyc3Qgbm9uLU5VTEwg ZW50cnkgPiBtYXMtPmluZGV4DQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG1heDog VGhlIG1heGltdW0gdmFsdWUgdG8gY2hlY2suDQorICoNCisgKiBNdXN0IGhvbGQgcmN1X3JlYWRf bG9jayBvciB0aGUgd3JpdGUgbG9jay4NCisgKiBJZiBhbiBlbnRyeSBleGlzdHMsIGxhc3QgYW5k IGluZGV4IGFyZSB1cGRhdGVkIGFjY29yZGluZ2x5Lg0KKyAqIE1heSBzZXQgQG1hcy0+bm9kZSB0 byBNQVNfTk9ORS4NCisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IG9yICVOVUxMLg0KKyAqLw0K K3ZvaWQgKm1hc19maW5kKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1heCkN Cit7DQorCWlmICh1bmxpa2VseShtYXNfaXNfcGF1c2VkKG1hcykpKSB7DQorCQlpZiAodW5saWtl bHkobWFzLT5sYXN0ID09IFVMT05HX01BWCkpIHsNCisJCQltYXMtPm5vZGUgPSBNQVNfTk9ORTsN CisJCQlyZXR1cm4gTlVMTDsNCisJCX0NCisJCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisJCW1h cy0+aW5kZXggPSArK21hcy0+bGFzdDsNCisJfQ0KKw0KKwlpZiAodW5saWtlbHkobWFzX2lzX3N0 YXJ0KG1hcykpKSB7DQorCQkvKiBGaXJzdCBydW4gb3IgY29udGludWUgKi8NCisJCXZvaWQgKmVu dHJ5Ow0KKw0KKwkJaWYgKG1hcy0+aW5kZXggPiBtYXgpDQorCQkJcmV0dXJuIE5VTEw7DQorDQor CQllbnRyeSA9IG1hc193YWxrKG1hcyk7DQorCQlpZiAoZW50cnkpDQorCQkJcmV0dXJuIGVudHJ5 Ow0KKwl9DQorDQorCWlmICh1bmxpa2VseSghbWFzX3NlYXJjaGFibGUobWFzKSkpDQorCQlyZXR1 cm4gTlVMTDsNCisNCisJLyogUmV0cmllcyBvbiBkZWFkIG5vZGVzIGhhbmRsZWQgYnkgbWFzX25l eHRfZW50cnkgKi8NCisJcmV0dXJuIG1hc19uZXh0X2VudHJ5KG1hcywgbWF4KTsNCit9DQorDQor LyoqDQorICogbWFzX2ZpbmQ6IElmIG1hcy0+bm9kZSA9PSBNQVNfU1RBUlQsIGZpbmQgdGhlIGZp cnN0DQorICogbm9uLU5VTEwgZW50cnkgPD0gbWFzLT5sYXN0Lg0KKyAqIE90aGVyd2lzZSwgZmlu ZCB0aGUgZmlyc3Qgbm9uLU5VTEwgZW50cnkgPCBtYXMtPmluZGV4DQorICogQG1hczogVGhlIG1h cGxlIHN0YXRlDQorICogQG1pbjogVGhlIG1pbmltdW0gdmFsdWUgdG8gY2hlY2suDQorICoNCisg KiBNdXN0IGhvbGQgcmN1X3JlYWRfbG9jayBvciB0aGUgd3JpdGUgbG9jay4NCisgKiBJZiBhbiBl bnRyeSBleGlzdHMsIGxhc3QgYW5kIGluZGV4IGFyZSB1cGRhdGVkIGFjY29yZGluZ2x5Lg0KKyAq IE1heSBzZXQgQG1hcy0+bm9kZSB0byBNQVNfTk9ORS4NCisgKg0KKyAqIFJldHVybjogVGhlIGVu dHJ5IG9yICVOVUxMLg0KKyAqL3ZvaWQgKm1hc19maW5kX3JldihzdHJ1Y3QgbWFfc3RhdGUgKm1h cywgdW5zaWduZWQgbG9uZyBtaW4pDQorew0KKwlpZiAodW5saWtlbHkobWFzX2lzX3BhdXNlZCht YXMpKSkgew0KKwkJaWYgKHVubGlrZWx5KG1hcy0+bGFzdCA9PSBVTE9OR19NQVgpKSB7DQorCQkJ bWFzLT5ub2RlID0gTUFTX05PTkU7DQorCQkJcmV0dXJuIE5VTEw7DQorCQl9DQorCQltYXMtPm5v ZGUgPSBNQVNfU1RBUlQ7DQorCQltYXMtPmxhc3QgPSAtLW1hcy0+aW5kZXg7DQorCX0NCisNCisJ aWYgKHVubGlrZWx5KG1hc19pc19zdGFydChtYXMpKSkgew0KKwkJLyogRmlyc3QgcnVuIG9yIGNv bnRpbnVlICovDQorCQl2b2lkICplbnRyeTsNCisNCisJCWlmIChtYXMtPmluZGV4IDwgbWluKQ0K KwkJCXJldHVybiBOVUxMOw0KKw0KKwkJZW50cnkgPSBtYXNfd2FsayhtYXMpOw0KKwkJaWYgKGVu dHJ5KQ0KKwkJCXJldHVybiBlbnRyeTsNCisJfQ0KKw0KKwlpZiAodW5saWtlbHkoIW1hc19zZWFy Y2hhYmxlKG1hcykpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCS8qIFJldHJpZXMgb24gZGVhZCBu b2RlcyBoYW5kbGVkIGJ5IG1hc19uZXh0X2VudHJ5ICovDQorCXJldHVybiBtYXNfcHJldl9lbnRy eShtYXMsIG1pbik7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKG1hc19maW5kKTsNCisNCisvKioN CisgKiBtYXNfZXJhc2UoKSAtIEZpbmQgdGhlIHJhbmdlIGluIHdoaWNoIGluZGV4IHJlc2lkZXMg YW5kIGVyYXNlIHRoZSBlbnRpcmUNCisgKiByYW5nZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3Rh dGUNCisgKg0KKyAqIE11c3QgaG9sZCB0aGUgd3JpdGUgbG9jay4NCisgKiBTZWFyY2hlcyBmb3Ig QG1hcy0+aW5kZXgsIHNldHMgQG1hcy0+aW5kZXggYW5kIEBtYXMtPmxhc3QgdG8gdGhlIHJhbmdl IGFuZA0KKyAqIGVyYXNlcyB0aGF0IHJhbmdlLg0KKyAqDQorICogUmV0dXJuOiB0aGUgZW50cnkg dGhhdCB3YXMgZXJhc2VkLCBAbWFzLT5pbmRleCBhbmQgQG1hcy0+bGFzdCBhcmUgdXBkYXRlZC4N CisgKi8NCit2b2lkICptYXNfZXJhc2Uoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl2b2lk ICplbnRyeTsNCisJTUFfV1JfU1RBVEUod3JfbWFzLCBtYXMsIE5VTEwpOw0KKw0KKwlpZiAobWFz X2lzX25vbmUobWFzKSB8fCBtYXNfaXNfcGF1c2VkKG1hcykpDQorCQltYXMtPm5vZGUgPSBNQVNf U1RBUlQ7DQorDQorCS8qIFJldHJ5IHVubmVjZXNzYXJ5IHdoZW4gaG9sZGluZyB0aGUgd3JpdGUg bG9jay4gKi8NCisJZW50cnkgPSBtYXNfc3RhdGVfd2FsayhtYXMpOw0KKwlpZiAoIWVudHJ5KQ0K KwkJcmV0dXJuIE5VTEw7DQorDQord3JpdGVfcmV0cnk6DQorCS8qIE11c3QgcmVzZXQgdG8gZW5z dXJlIHNwYW5uaW5nIHdyaXRlcyBvZiBsYXN0IHNsb3QgYXJlIGRldGVjdGVkICovDQorCW1hc19y ZXNldChtYXMpOw0KKwltYXNfd3Jfc3RvcmVfc2V0dXAoJndyX21hcyk7DQorCW1hc193cl9zdG9y ZV9lbnRyeSgmd3JfbWFzKTsNCisJaWYgKG1hc19ub21lbShtYXMsIEdGUF9LRVJORUwpKQ0KKwkJ Z290byB3cml0ZV9yZXRyeTsNCisNCisJcmV0dXJuIGVudHJ5Ow0KK30NCitFWFBPUlRfU1lNQk9M X0dQTChtYXNfZXJhc2UpOw0KKw0KKy8qDQorICogbWFzX25vbWVtKCkgLSAqIENoZWNrIGlmIHRo ZXJlIHdhcyBhbiBlcnJvciBhbGxvY2F0aW5nIGFuZCBkbyB0aGUgYWxsb2NhdGlvbg0KKyAqIGlm IG5lY2Vzc2FyeSBJZiB0aGVyZSBhcmUgYWxsb2NhdGlvbnMsIHRoZW4gZnJlZSB0aGVtLg0KKyAq IEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBnZnA6IFRoZSBHRlBfRkFMR1MgdG8gdXNlIGZv ciBhbGxvY2F0aW9ucw0KKyAqLw0KK2Jvb2wgbWFzX25vbWVtKHN0cnVjdCBtYV9zdGF0ZSAqbWFz LCBnZnBfdCBnZnApDQorCV9fbXVzdF9ob2xkKG1hcy0+dHJlZS0+bG9jaykNCit7DQorCWlmIChs aWtlbHkobWFzLT5ub2RlICE9IE1BX0VSUk9SKC1FTk9NRU0pKSkgew0KKwkJbWFzX2Rlc3Ryb3ko bWFzKTsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwlpZiAoZ2ZwZmxhZ3NfYWxsb3dfYmxv Y2tpbmcoZ2ZwKSAmJiAhbXRfZXh0ZXJuYWxfbG9jayhtYXMtPnRyZWUpKSB7DQorCQltdHJlZV91 bmxvY2sobWFzLT50cmVlKTsNCisJCW1hc19hbGxvY19ub2RlcyhtYXMsIGdmcCk7DQorCQltdHJl ZV9sb2NrKG1hcy0+dHJlZSk7DQorCX0gZWxzZSB7DQorCQltYXNfYWxsb2Nfbm9kZXMobWFzLCBn ZnApOw0KKwl9DQorDQorCWlmICghbWFzX2FsbG9jYXRlZChtYXMpKQ0KKwkJcmV0dXJuIGZhbHNl Ow0KKw0KKwltYXMtPm5vZGUgPSBNQVNfU1RBUlQ7DQorCXJldHVybiB0cnVlOw0KK30NCisNCit2 b2lkIF9faW5pdCBtYXBsZV90cmVlX2luaXQodm9pZCkNCit7DQorCW1hcGxlX25vZGVfY2FjaGUg PSBrbWVtX2NhY2hlX2NyZWF0ZSgibWFwbGVfbm9kZSIsDQorCQkJc2l6ZW9mKHN0cnVjdCBtYXBs ZV9ub2RlKSwgc2l6ZW9mKHN0cnVjdCBtYXBsZV9ub2RlKSwNCisJCQlTTEFCX1BBTklDLCBOVUxM KTsNCit9DQorDQorLyoqDQorICogbXRyZWVfbG9hZCgpIC0gTG9hZCBhIHZhbHVlIHN0b3JlZCBp biBhIG1hcGxlIHRyZWUNCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4OiBUaGUg aW5kZXggdG8gbG9hZA0KKyAqDQorICogUmV0dXJuOiB0aGUgZW50cnkgb2YgJU5VTEwNCisgKi8N Cit2b2lkICptdHJlZV9sb2FkKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBp bmRleCkNCit7DQorCU1BX1NUQVRFKG1hcywgbXQsIGluZGV4LCBpbmRleCk7DQorCXZvaWQgKmVu dHJ5Ow0KKw0KKwl0cmFjZV9tYV9yZWFkKF9fZnVuY19fLCAmbWFzKTsNCisJcmN1X3JlYWRfbG9j aygpOw0KK3JldHJ5Og0KKwllbnRyeSA9IG1hc19zdGFydCgmbWFzKTsNCisJaWYgKHVubGlrZWx5 KG1hc19pc19ub25lKCZtYXMpKSkNCisJCWdvdG8gdW5sb2NrOw0KKw0KKwlpZiAodW5saWtlbHko bWFzX2lzX3B0cigmbWFzKSkpIHsNCisJCWlmIChpbmRleCkNCisJCQllbnRyeSA9IE5VTEw7DQor DQorCQlnb3RvIHVubG9jazsNCisJfQ0KKw0KKwllbnRyeSA9IG10cmVlX2xvb2t1cF93YWxrKCZt YXMpOw0KKwlpZiAoIWVudHJ5ICYmIHVubGlrZWx5KG1hc19pc19zdGFydCgmbWFzKSkpDQorCQln b3RvIHJldHJ5Ow0KK3VubG9jazoNCisJcmN1X3JlYWRfdW5sb2NrKCk7DQorCWlmICh4YV9pc196 ZXJvKGVudHJ5KSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlyZXR1cm4gZW50cnk7DQorfQ0KK0VY UE9SVF9TWU1CT0wobXRyZWVfbG9hZCk7DQorDQorLyoqDQorICogbXRyZWVfc3RvcmVfcmFuZ2Uo KSAtIFN0b3JlIGFuIGVudHJ5IGF0IGEgZ2l2ZW4gcmFuZ2UuDQorICogQG10OiBUaGUgbWFwbGUg dHJlZQ0KKyAqIEBpbmRleDogVGhlIHN0YXJ0IG9mIHRoZSByYW5nZQ0KKyAqIEBsYXN0OiBUaGUg ZW5kIG9mIHRoZSByYW5nZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlDQorICogQGdm cDogVGhlIEdGUF9GTEFHUyB0byB1c2UgZm9yIGFsbG9jYXRpb25zDQorICoNCisgKiBSZXR1cm46 IDAgb24gc3VjY2VzcywgLUVJTlZBTCBvbiBpbnZhbGlkIHJlcXVlc3QsIC1FTk9NRU0gaWYgbWVt b3J5IGNvdWxkIG5vdA0KKyAqIGJlIGFsbG9jYXRlZC4NCisgKi8NCitpbnQgbXRyZWVfc3RvcmVf cmFuZ2Uoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4LA0KKwkJdW5z aWduZWQgbG9uZyBsYXN0LCB2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKQ0KK3sNCisJTUFfU1RBVEUo bWFzLCBtdCwgaW5kZXgsIGxhc3QpOw0KKwlNQV9XUl9TVEFURSh3cl9tYXMsICZtYXMsIGVudHJ5 KTsNCisNCisJdHJhY2VfbWFfd3JpdGUoX19mdW5jX18sICZtYXMsIDAsIGVudHJ5KTsNCisJaWYg KFdBUk5fT05fT05DRSh4YV9pc19hZHZhbmNlZChlbnRyeSkpKQ0KKwkJcmV0dXJuIC1FSU5WQUw7 DQorDQorCWlmIChpbmRleCA+IGxhc3QpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJbXRyZWVf bG9jayhtdCk7DQorcmV0cnk6DQorCW1hc193cl9zdG9yZV9lbnRyeSgmd3JfbWFzKTsNCisJaWYg KG1hc19ub21lbSgmbWFzLCBnZnApKQ0KKwkJZ290byByZXRyeTsNCisNCisJbXRyZWVfdW5sb2Nr KG10KTsNCisJaWYgKG1hc19pc19lcnIoJm1hcykpDQorCQlyZXR1cm4geGFfZXJyKG1hcy5ub2Rl KTsNCisNCisJcmV0dXJuIDA7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfc3RvcmVfcmFuZ2Up Ow0KKw0KKy8qKg0KKyAqIG10cmVlX3N0b3JlKCkgLSBTdG9yZSBhbiBlbnRyeSBhdCBhIGdpdmVu IGluZGV4Lg0KKyAqIEBtdDogVGhlIG1hcGxlIHRyZWUNCisgKiBAaW5kZXg6IFRoZSBpbmRleCB0 byBzdG9yZSB0aGUgdmFsdWUNCisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBzdG9yZQ0KKyAqIEBn ZnA6IFRoZSBHRlBfRkxBR1MgdG8gdXNlIGZvciBhbGxvY2F0aW9ucw0KKyAqDQorICogUmV0dXJu OiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgb24gaW52YWxpZCByZXF1ZXN0LCAtRU5PTUVNIGlmIG1l bW9yeSBjb3VsZCBub3QNCisgKiBiZSBhbGxvY2F0ZWQuDQorICovDQoraW50IG10cmVlX3N0b3Jl KHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBpbmRleCwgdm9pZCAqZW50cnks DQorCQkgZ2ZwX3QgZ2ZwKQ0KK3sNCisJcmV0dXJuIG10cmVlX3N0b3JlX3JhbmdlKG10LCBpbmRl eCwgaW5kZXgsIGVudHJ5LCBnZnApOw0KK30NCitFWFBPUlRfU1lNQk9MKG10cmVlX3N0b3JlKTsN CisNCisvKioNCisgKiBtdHJlZV9pbnNlcnRfcmFuZ2UoKSAtIEluc2VydCBhbiBlbnRyeSBhdCBh IGdpdmUgcmFuZ2UgaWYgdGhlcmUgaXMgbm8gdmFsdWUuDQorICogQG10OiBUaGUgbWFwbGUgdHJl ZQ0KKyAqIEBmaXJzdDogVGhlIHN0YXJ0IG9mIHRoZSByYW5nZQ0KKyAqIEBsYXN0OiBUaGUgZW5k IG9mIHRoZSByYW5nZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlDQorICogQGdmcDog VGhlIEZHUF9GTEFHUyB0byB1c2UgZm9yIGFsbG9jYXRpb25zLg0KKyAqDQorICogUmV0dXJuOiAw IG9uIHN1Y2Nlc3MsIC1FRVhJU1RTIGlmIHRoZSByYW5nZSBpcyBvY2N1cGllZCwgLUVJTlZBTCBv biBpbnZhbGlkDQorICogcmVxdWVzdCwgLUVOT01FTSBpZiBtZW1vcnkgY291bGQgbm90IGJlIGFs bG9jYXRlZC4NCisgKi8NCitpbnQgbXRyZWVfaW5zZXJ0X3JhbmdlKHN0cnVjdCBtYXBsZV90cmVl ICptdCwgdW5zaWduZWQgbG9uZyBmaXJzdCwNCisJCXVuc2lnbmVkIGxvbmcgbGFzdCwgdm9pZCAq ZW50cnksIGdmcF90IGdmcCkNCit7DQorCU1BX1NUQVRFKG1zLCBtdCwgZmlyc3QsIGxhc3QpOw0K Kw0KKwlpZiAoV0FSTl9PTl9PTkNFKHhhX2lzX2FkdmFuY2VkKGVudHJ5KSkpDQorCQlyZXR1cm4g LUVJTlZBTDsNCisNCisJaWYgKGZpcnN0ID4gbGFzdCkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0K KwltdHJlZV9sb2NrKG10KTsNCityZXRyeToNCisJbWFzX2luc2VydCgmbXMsIGVudHJ5KTsNCisJ aWYgKG1hc19ub21lbSgmbXMsIGdmcCkpDQorCQlnb3RvIHJldHJ5Ow0KKw0KKwltdHJlZV91bmxv Y2sobXQpOw0KKwlpZiAobWFzX2lzX2VycigmbXMpKQ0KKwkJcmV0dXJuIHhhX2Vycihtcy5ub2Rl KTsNCisNCisJcmV0dXJuIDA7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfaW5zZXJ0X3Jhbmdl KTsNCisNCisvKioNCisgKiBtdHJlZV9pbnNlcnQoKSAtIEluc2VydCBhbiBlbnRyeSBhdCBhIGdp dmUgaW5kZXggaWYgdGhlcmUgaXMgbm8gdmFsdWUuDQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0K KyAqIEBpbmRleCA6IFRoZSBpbmRleCB0byBzdG9yZSB0aGUgdmFsdWUNCisgKiBAZW50cnk6IFRo ZSBlbnRyeSB0byBzdG9yZQ0KKyAqIEBnZnA6IFRoZSBGR1BfRkxBR1MgdG8gdXNlIGZvciBhbGxv Y2F0aW9ucy4NCisgKg0KKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtRUVYSVNUUyBpZiB0aGUg cmFuZ2UgaXMgb2NjdXBpZWQsIC1FSU5WQUwgb24gaW52YWxpZA0KKyAqIHJlcXVlc3QsIC1FTk9N RU0gaWYgbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuDQorICovDQoraW50IG10cmVlX2lu c2VydChzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgaW5kZXgsIHZvaWQgKmVu dHJ5LA0KKwkJIGdmcF90IGdmcCkNCit7DQorCXJldHVybiBtdHJlZV9pbnNlcnRfcmFuZ2UobXQs IGluZGV4LCBpbmRleCwgZW50cnksIGdmcCk7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfaW5z ZXJ0KTsNCisNCitpbnQgbXRyZWVfYWxsb2NfcmFuZ2Uoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1 bnNpZ25lZCBsb25nICpzdGFydHAsDQorCQl2b2lkICplbnRyeSwgdW5zaWduZWQgbG9uZyBzaXpl LCB1bnNpZ25lZCBsb25nIG1pbiwNCisJCXVuc2lnbmVkIGxvbmcgbWF4LCBnZnBfdCBnZnApDQor ew0KKwlpbnQgcmV0ID0gMDsNCisNCisJTUFfU1RBVEUobWFzLCBtdCwgbWluLCBtYXggLSBzaXpl KTsNCisJaWYgKCFtdF9pc19hbGxvYyhtdCkpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYg KFdBUk5fT05fT05DRShtdF9pc19yZXNlcnZlZChlbnRyeSkpKQ0KKwkJcmV0dXJuIC1FSU5WQUw7 DQorDQorCWlmIChtaW4gPiBtYXgpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKG1heCA8 IHNpemUpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKCFzaXplKQ0KKwkJcmV0dXJuIC1F SU5WQUw7DQorDQorCW10cmVlX2xvY2sobXQpOw0KK3JldHJ5Og0KKwltYXMub2Zmc2V0ID0gMDsN CisJbWFzLmluZGV4ID0gbWluOw0KKwltYXMubGFzdCA9IG1heCAtIHNpemU7DQorCXJldCA9IG1h c19hbGxvYygmbWFzLCBlbnRyeSwgc2l6ZSwgc3RhcnRwKTsNCisJaWYgKG1hc19ub21lbSgmbWFz LCBnZnApKQ0KKwkJZ290byByZXRyeTsNCisNCisJbXRyZWVfdW5sb2NrKG10KTsNCisJcmV0dXJu IHJldDsNCit9DQorDQoraW50IG10cmVlX2FsbG9jX3JyYW5nZShzdHJ1Y3QgbWFwbGVfdHJlZSAq bXQsIHVuc2lnbmVkIGxvbmcgKnN0YXJ0cCwNCisJCXZvaWQgKmVudHJ5LCB1bnNpZ25lZCBsb25n IHNpemUsIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJdW5zaWduZWQgbG9uZyBtYXgsIGdmcF90IGdm cCkNCit7DQorCWludCByZXQgPSAwOw0KKw0KKwlNQV9TVEFURShtYXMsIG10LCBtaW4sIG1heCAt IHNpemUpOw0KKwlpZiAoIW10X2lzX2FsbG9jKG10KSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0K KwlpZiAoV0FSTl9PTl9PTkNFKG10X2lzX3Jlc2VydmVkKGVudHJ5KSkpDQorCQlyZXR1cm4gLUVJ TlZBTDsNCisNCisJaWYgKG1pbiA+PSBtYXgpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYg KG1heCA8IHNpemUgLSAxKQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCWlmICghc2l6ZSkNCisJ CXJldHVybiAtRUlOVkFMOw0KKw0KKwltdHJlZV9sb2NrKG10KTsNCityZXRyeToNCisJcmV0ID0g bWFzX3Jldl9hbGxvYygmbWFzLCBtaW4sIG1heCwgZW50cnksIHNpemUsIHN0YXJ0cCk7DQorCWlm IChtYXNfbm9tZW0oJm1hcywgZ2ZwKSkNCisJCWdvdG8gcmV0cnk7DQorDQorCW10cmVlX3VubG9j ayhtdCk7DQorCXJldHVybiByZXQ7DQorfQ0KKw0KKy8qKg0KKyAqIG10cmVlX2VyYXNlKCkgLSBG aW5kIGFuIGluZGV4IGFuZCBlcmFzZSB0aGUgZW50aXJlIHJhbmdlLg0KKyAqIEBtdDogVGhlIG1h cGxlIHRyZWUNCisgKiBAaW5kZXg6IFRoZSBpbmRleCB0byBlcmFzZQ0KKyAqDQorICogRXJhc2lu ZyBpcyB0aGUgc2FtZSBhcyBhIHdhbGsgdG8gYW4gZW50cnkgdGhlbiBhIHN0b3JlIG9mIGEgTlVM TCB0byB0aGF0DQorICogRU5USVJFIHJhbmdlLiAgSW4gZmFjdCwgaXQgaXMgaW1wbGVtZW50ZWQg YXMgc3VjaCB1c2luZyB0aGUgYWR2YW5jZWQgQVBJLg0KKyAqDQorICogUmV0dXJuOiBUaGUgZW50 cnkgc3RvcmVkIGF0IHRoZSBAaW5kZXggb3IgJU5VTEwNCisgKi8NCit2b2lkICptdHJlZV9lcmFz ZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgaW5kZXgpDQorew0KKwl2b2lk ICplbnRyeSA9IE5VTEw7DQorDQorCU1BX1NUQVRFKG1hcywgbXQsIGluZGV4LCBpbmRleCk7DQor CXRyYWNlX21hX29wKF9fZnVuY19fLCAmbWFzKTsNCisNCisJbXRyZWVfbG9jayhtdCk7DQorCWVu dHJ5ID0gbWFzX2VyYXNlKCZtYXMpOw0KKwltdHJlZV91bmxvY2sobXQpOw0KKw0KKwlyZXR1cm4g ZW50cnk7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfZXJhc2UpOw0KKw0KKy8qKg0KKyAqIF9f bXRfZGVzdHJveSgpIC0gV2FsayBhbmQgZnJlZSBhbGwgbm9kZXMgb2YgYSBsb2NrZWQgbWFwbGUg dHJlZS4NCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICoNCisgKiBOb3RlOiBEb2VzIG5vdCBo YW5kbGUgbG9ja2luZy4NCisgKi8NCit2b2lkIF9fbXRfZGVzdHJveShzdHJ1Y3QgbWFwbGVfdHJl ZSAqbXQpDQorew0KKwl2b2lkICpyb290ID0gbXRfcm9vdF9sb2NrZWQobXQpOw0KKw0KKwlyY3Vf YXNzaWduX3BvaW50ZXIobXQtPm1hX3Jvb3QsIE5VTEwpOw0KKwlpZiAoeGFfaXNfbm9kZShyb290 KSkNCisJCW10ZV9kZXN0cm95X3dhbGsocm9vdCwgbXQpOw0KKw0KKwltdC0+bWFfZmxhZ3MgPSAw Ow0KK30NCitFWFBPUlRfU1lNQk9MX0dQTChfX210X2Rlc3Ryb3kpOw0KKw0KKy8qKg0KKyAqIG10 cmVlX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBtYXBsZSB0cmVlDQorICogQG10OiBUaGUgbWFwbGUg dHJlZQ0KKyAqDQorICogRnJlZXMgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSB0cmVlLiAgSGFu ZGxlcyBsb2NraW5nLg0KKyAqLw0KK3ZvaWQgbXRyZWVfZGVzdHJveShzdHJ1Y3QgbWFwbGVfdHJl ZSAqbXQpDQorew0KKwltdHJlZV9sb2NrKG10KTsNCisJX19tdF9kZXN0cm95KG10KTsNCisJbXRy ZWVfdW5sb2NrKG10KTsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9kZXN0cm95KTsNCisNCisv KioNCisgKiBtdF9maW5kKCkgLSBTZWFyY2ggZnJvbSB0aGUgc3RhcnQgdXAgdW50aWwgYW4gZW50 cnkgaXMgZm91bmQuDQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAqIEAqaW5kZXg6IFBvaW50 ZXIgd2hpY2ggY29udGFpbnMgdGhlIHN0YXJ0IGxvY2F0aW9uIG9mIHRoZSBzZWFyY2gNCisgKiBA bWF4OiBUaGUgbWF4aW11bSB2YWx1ZSB0byBjaGVjaw0KKyAqDQorICogSGFuZGxlcyBsb2NraW5n LiAgQGluZGV4IHdpbGwgYmUgaW5jcmVtZW50ZWQgdG8gb25lIGJleW9uZCB0aGUgcmFuZ2UuDQor ICoNCisgKiBSZXR1cm46IFRoZSBlbnRyeSBhdCBvciBhZnRlciB0aGUgQCppbmRleCBvciAlTlVM TA0KKyAqLw0KK3ZvaWQgKm10X2ZpbmQoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBs b25nICppbmRleCwgdW5zaWduZWQgbG9uZyBtYXgpDQorew0KKwlNQV9TVEFURShtYXMsIG10LCAq aW5kZXgsICppbmRleCk7DQorCXZvaWQgKmVudHJ5Ow0KKyNpZmRlZiBDT05GSUdfREVCVUdfTUFQ TEVfVFJFRQ0KKwl1bnNpZ25lZCBsb25nIGNvcHkgPSAqaW5kZXg7DQorI2VuZGlmDQorDQorCXRy YWNlX21hX3JlYWQoX19mdW5jX18sICZtYXMpOw0KKw0KKwlpZiAoKCppbmRleCkgPiBtYXgpDQor CQlyZXR1cm4gTlVMTDsNCisNCisJcmN1X3JlYWRfbG9jaygpOw0KK3JldHJ5Og0KKwllbnRyeSA9 IG1hc19zdGF0ZV93YWxrKCZtYXMpOw0KKwlpZiAobWFzX2lzX3N0YXJ0KCZtYXMpKQ0KKwkJZ290 byByZXRyeTsNCisNCisJaWYgKHVubGlrZWx5KHhhX2lzX3plcm8oZW50cnkpKSkNCisJCWVudHJ5 ID0gTlVMTDsNCisNCisJaWYgKGVudHJ5KQ0KKwkJZ290byB1bmxvY2s7DQorDQorCXdoaWxlICht YXNfc2VhcmNoYWJsZSgmbWFzKSAmJiAobWFzLmluZGV4IDwgbWF4KSkgew0KKwkJZW50cnkgPSBt YXNfbmV4dF9lbnRyeSgmbWFzLCBtYXgpOw0KKwkJaWYgKGxpa2VseShlbnRyeSAmJiAheGFfaXNf emVybyhlbnRyeSkpKQ0KKwkJCWJyZWFrOw0KKwl9DQorDQorCWlmICh1bmxpa2VseSh4YV9pc196 ZXJvKGVudHJ5KSkpDQorCQllbnRyeSA9IE5VTEw7DQordW5sb2NrOg0KKwlyY3VfcmVhZF91bmxv Y2soKTsNCisJaWYgKGxpa2VseShlbnRyeSkpIHsNCisJCSppbmRleCA9IG1hcy5sYXN0ICsgMTsN CisjaWZkZWYgQ09ORklHX0RFQlVHX01BUExFX1RSRUUNCisJCWlmICgoKmluZGV4KSAmJiAoKmlu ZGV4KSA8PSBjb3B5KQ0KKwkJCXByaW50aygiaW5kZXggbm90IGluY3JlYXNlZCEgJWx4IDw9ICVs eFxuIiwNCisJCQkgICAgICAgKmluZGV4LCBjb3B5KTsNCisJCU1UX0JVR19PTihtdCwgKCppbmRl eCkgJiYgKCgqaW5kZXgpIDw9IGNvcHkpKTsNCisjZW5kaWYNCisJfQ0KKw0KKwlyZXR1cm4gZW50 cnk7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRfZmluZCk7DQorDQorLyoqDQorICogbXRfZmluZF9h ZnRlcigpIC0gU2VhcmNoIGZyb20gdGhlIHN0YXJ0IHVwIHVudGlsIGFuIGVudHJ5IGlzIGZvdW5k Lg0KKyAqIEBtdDogVGhlIG1hcGxlIHRyZWUNCisgKiBAKmluZGV4OiBQb2ludGVyIHdoaWNoIGNv bnRhaW5zIHRoZSBzdGFydCBsb2NhdGlvbiBvZiB0aGUgc2VhcmNoDQorICogQG1heDogVGhlIG1h eGltdW0gdmFsdWUgdG8gY2hlY2sNCisgKg0KKyAqIEhhbmRsZXMgbG9ja2luZywgZGV0ZWN0cyB3 cmFwcGluZyBvbiAqaW5kZXggPT0gMA0KKyAqDQorICogUmV0dXJuOiBUaGUgZW50cnkgYXQgb3Ig YWZ0ZXIgdGhlIEAqaW5kZXggb3IgJU5VTEwNCisgKi8NCit2b2lkICptdF9maW5kX2FmdGVyKHN0 cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyAqaW5kZXgsDQorCQkgICAgdW5zaWdu ZWQgbG9uZyBtYXgpDQorew0KKwlpZiAoISgqaW5kZXgpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQor CXJldHVybiBtdF9maW5kKG10LCBpbmRleCwgbWF4KTsNCit9DQorRVhQT1JUX1NZTUJPTChtdF9m aW5kX2FmdGVyKTsNCisNCisjaWZkZWYgQ09ORklHX0RFQlVHX01BUExFX1RSRUUNCithdG9taWNf dCBtYXBsZV90cmVlX3Rlc3RzX3J1bjsNCitFWFBPUlRfU1lNQk9MX0dQTChtYXBsZV90cmVlX3Rl c3RzX3J1bik7DQorYXRvbWljX3QgbWFwbGVfdHJlZV90ZXN0c19wYXNzZWQ7DQorRVhQT1JUX1NZ TUJPTF9HUEwobWFwbGVfdHJlZV90ZXN0c19wYXNzZWQpOw0KKw0KKyNpZm5kZWYgX19LRVJORUxf Xw0KK2V4dGVybiB2b2lkIGttZW1fY2FjaGVfc2V0X25vbl9rZXJuZWwoc3RydWN0IGttZW1fY2Fj aGUgKiwgdW5zaWduZWQgaW50KTsNCit2b2lkIG10X3NldF9ub25fa2VybmVsKHVuc2lnbmVkIGlu dCB2YWwpDQorew0KKwlrbWVtX2NhY2hlX3NldF9ub25fa2VybmVsKG1hcGxlX25vZGVfY2FjaGUs IHZhbCk7DQorfQ0KKw0KK2V4dGVybiB1bnNpZ25lZCBsb25nIGttZW1fY2FjaGVfZ2V0X2FsbG9j KHN0cnVjdCBrbWVtX2NhY2hlICopOw0KK3Vuc2lnbmVkIGxvbmcgbXRfZ2V0X2FsbG9jX3NpemUo dm9pZCkNCit7DQorCXJldHVybiBrbWVtX2NhY2hlX2dldF9hbGxvYyhtYXBsZV9ub2RlX2NhY2hl KTsNCit9DQorDQorZXh0ZXJuIHZvaWQga21lbV9jYWNoZV96ZXJvX25yX3RhbGxvY2F0ZWQoc3Ry dWN0IGttZW1fY2FjaGUgKik7DQordm9pZCBtdF96ZXJvX25yX3RhbGxvY2F0ZWQoKQ0KK3sNCisJ a21lbV9jYWNoZV96ZXJvX25yX3RhbGxvY2F0ZWQobWFwbGVfbm9kZV9jYWNoZSk7DQorfQ0KKw0K K2V4dGVybiB1bnNpZ25lZCBpbnQga21lbV9jYWNoZV9ucl90YWxsb2NhdGVkKHN0cnVjdCBrbWVt X2NhY2hlICopOw0KK3Vuc2lnbmVkIGludCBtdF9ucl90YWxsb2NhdGVkKCkNCit7DQorCXJldHVy biBrbWVtX2NhY2hlX25yX3RhbGxvY2F0ZWQobWFwbGVfbm9kZV9jYWNoZSk7DQorfQ0KKw0KK2V4 dGVybiB1bnNpZ25lZCBpbnQga21lbV9jYWNoZV9ucl9hbGxvY2F0ZWQoc3RydWN0IGttZW1fY2Fj aGUgKik7DQordW5zaWduZWQgaW50IG10X25yX2FsbG9jYXRlZCgpDQorew0KKwlyZXR1cm4ga21l bV9jYWNoZV9ucl9hbGxvY2F0ZWQobWFwbGVfbm9kZV9jYWNoZSk7DQorfQ0KKw0KKyNkZWZpbmUg TUFfUFRSICIlcCINCisjZWxzZSAvKiAgX19LRVJORUxfXyBpcyBkZWZpbmVkICovDQorI2RlZmlu ZSBNQV9QVFIgIiVweCINCisjZW5kaWYNCisNCisjaWZkZWYgQ09ORklHX01BUExFX1NFQVJDSA0K Ky8qIG1hcyBsaW1pdHMgbm90IGFkanVzdGVkICovDQorc3RhdGljIHZvaWQgbWFzX2Rmc19wcmVv cmRlcihzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorDQorCXN0cnVjdCBtYXBsZV9lbm9kZSAq cHJldjsNCisJdW5zaWduZWQgY2hhciBlbmQsIHNsb3QgPSAwOw0KKw0KKwlpZiAobWFzX2lzX3N0 YXJ0KG1hcykpIHsNCisJCW1hc19zdGFydChtYXMpOw0KKwkJcmV0dXJuOw0KKwl9DQorDQorCWlm IChtdGVfaXNfbGVhZihtYXMtPm5vZGUpICYmIG10ZV9pc19yb290KG1hcy0+bm9kZSkpDQorCQln b3RvIGRvbmU7DQorDQord2Fsa191cDoNCisJZW5kID0gbWFzX2RhdGFfZW5kKG1hcyk7DQorCWlm IChtdGVfaXNfbGVhZihtYXMtPm5vZGUpIHx8DQorCSAgICAoc2xvdCA+IGVuZCkpIHsNCisJCWlm IChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKQ0KKwkJCWdvdG8gZG9uZTsNCisNCisJCXNsb3QgPSBt dGVfcGFyZW50X3Nsb3QobWFzLT5ub2RlKSArIDE7DQorCQltYXNfYXNjZW5kKG1hcyk7DQorCQln b3RvIHdhbGtfdXA7DQorCX0NCisNCisJcHJldiA9IG1hcy0+bm9kZTsNCisJbWFzLT5ub2RlID0g bWFzX2dldF9zbG90KG1hcywgc2xvdCk7DQorCWlmICghbWFzLT5ub2RlIHx8IHNsb3QgPiBlbmQp IHsNCisJCWlmIChtdGVfaXNfcm9vdChwcmV2KSkNCisJCQlnb3RvIGRvbmU7DQorDQorCQltYXMt Pm5vZGUgPSBwcmV2Ow0KKwkJc2xvdCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpICsgMTsN CisJCW1hc19hc2NlbmQobWFzKTsNCisJCWdvdG8gd2Fsa191cDsNCisJfQ0KKw0KKwlyZXR1cm47 DQorZG9uZToNCisJbWFzLT5ub2RlID0gTUFTX05PTkU7DQorfQ0KKyNpZmRlZiBDT05GSUdfTUFQ TEVfRVhUUkFTDQorc3RhdGljIHZvaWQgbWFzX2Jmc19wcmVvcmRlcihzdHJ1Y3QgbWFfc3RhdGUg Km1hcykNCit7DQorDQorCWlmIChtYXNfaXNfc3RhcnQobWFzKSkgew0KKwkJbWFzX3N0YXJ0KG1h cyk7DQorCQlyZXR1cm47DQorCX0NCisNCisJaWYgKG10ZV9pc19sZWFmKG1hcy0+bm9kZSkgJiYg bXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkgew0KKwkJbWFzLT5ub2RlID0gTUFTX05PTkU7DQorCQly ZXR1cm47DQorCX0NCisNCit9DQorI2VuZGlmIC8qIENPTkZJR19NQVBMRV9FWFRSQVMgKi8NCisN CisjZW5kaWYNCisNCisvKiBEZXB0aCBmaXJzdCBzZWFyY2gsIHBvc3Qtb3JkZXIgKi8NCitzdGF0 aWMgdm9pZCBtYXNfZGZzX3Bvc3RvcmRlcihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQg bG9uZyBtYXgpDQorew0KKw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnAgPSBNQVNfTk9ORSwgKm1u ID0gbWFzLT5ub2RlOw0KKwl1bnNpZ25lZCBsb25nIHBfbWluLCBwX21heDsNCisNCisJbWFzX25l eHRfbm9kZShtYXMsIG1hc19tbihtYXMpLCBtYXgpOw0KKwlpZiAoIW1hc19pc19ub25lKG1hcykp DQorCQlyZXR1cm47DQorDQorCWlmIChtdGVfaXNfcm9vdChtbikpDQorCQlyZXR1cm47DQorDQor CW1hcy0+bm9kZSA9IG1uOw0KKwltYXNfYXNjZW5kKG1hcyk7DQorCXdoaWxlIChtYXMtPm5vZGUg IT0gTUFTX05PTkUpIHsNCisJCXAgPSBtYXMtPm5vZGU7DQorCQlwX21pbiA9IG1hcy0+bWluOw0K KwkJcF9tYXggPSBtYXMtPm1heDsNCisJCW1hc19wcmV2X25vZGUobWFzLCAwKTsNCisJfQ0KKw0K KwlpZiAocCA9PSBNQVNfTk9ORSkNCisJCXJldHVybjsNCisNCisJbWFzLT5ub2RlID0gcDsNCisJ bWFzLT5tYXggPSBwX21heDsNCisJbWFzLT5taW4gPSBwX21pbjsNCit9DQorDQorLyogVHJlZSB2 YWxpZGF0aW9ucyAqLw0KK3ZvaWQgbXRfZHVtcF9ub2RlKGNvbnN0IHN0cnVjdCBtYXBsZV90cmVl ICptdCwgdm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJdW5zaWduZWQgbG9uZyBt YXgsIHVuc2lnbmVkIGludCBkZXB0aCk7DQordm9pZCBtdF9kdW1wX3JhbmdlKHVuc2lnbmVkIGxv bmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgaW50IGRlcHRoKQ0KK3sNCisJc3Rh dGljIGNvbnN0IGNoYXIgc3BhY2VzW10gPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAiOw0KKw0KKwlpZiAobWluID09IG1heCkNCisJCXByX2luZm8oIiUuKnMlbHU6ICIsIGRlcHRo ICogMiwgc3BhY2VzLCBtaW4pOw0KKwllbHNlDQorCQlwcl9pbmZvKCIlLipzJWx1LSVsdTogIiwg ZGVwdGggKiAyLCBzcGFjZXMsIG1pbiwgbWF4KTsNCit9DQorDQordm9pZCBtdF9kdW1wX2VudHJ5 KHZvaWQgKmVudHJ5LCB1bnNpZ25lZCBsb25nIG1pbiwgdW5zaWduZWQgbG9uZyBtYXgsDQorCQl1 bnNpZ25lZCBpbnQgZGVwdGgpDQorew0KKwltdF9kdW1wX3JhbmdlKG1pbiwgbWF4LCBkZXB0aCk7 DQorDQorCWlmICh4YV9pc192YWx1ZShlbnRyeSkpDQorCQlwcl9jb250KCJ2YWx1ZSAlbGQgKDB4 JWx4KSBbIk1BX1BUUiJdXG4iLCB4YV90b192YWx1ZShlbnRyeSksDQorCQkJCXhhX3RvX3ZhbHVl KGVudHJ5KSwgZW50cnkpOw0KKwllbHNlIGlmICh4YV9pc196ZXJvKGVudHJ5KSkNCisJCXByX2Nv bnQoInplcm8gKCVsZClcbiIsIHhhX3RvX2ludGVybmFsKGVudHJ5KSk7DQorCWVsc2UgaWYgKG10 X2lzX3Jlc2VydmVkKGVudHJ5KSkNCisJCXByX2NvbnQoIlVOS05PV04gRU5UUlkgKCJNQV9QVFIi KVxuIiwgZW50cnkpOw0KKwllbHNlDQorCQlwcl9jb250KCIiTUFfUFRSIlxuIiwgZW50cnkpOw0K K30NCisNCit2b2lkIG10X2R1bXBfcmFuZ2U2NChjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQs IHZvaWQgKmVudHJ5LA0KKwkJdW5zaWduZWQgbG9uZyBtaW4sIHVuc2lnbmVkIGxvbmcgbWF4LCB1 bnNpZ25lZCBpbnQgZGVwdGgpDQorew0KKwlzdHJ1Y3QgbWFwbGVfcmFuZ2VfNjQgKm5vZGUgPSAm bXRlX3RvX25vZGUoZW50cnkpLT5tcjY0Ow0KKwlib29sIGxlYWYgPSBtdGVfaXNfbGVhZihlbnRy eSk7DQorCXVuc2lnbmVkIGxvbmcgZmlyc3QgPSBtaW47DQorCWludCBpOw0KKw0KKwlwcl9jb250 KCIgY29udGVudHM6ICIpOw0KKwlmb3IgKGkgPSAwOyBpIDwgTUFQTEVfUkFOR0U2NF9TTE9UUyAt IDE7IGkrKykNCisJCXByX2NvbnQoIiJNQV9QVFIiICVsdSAiLCBub2RlLT5zbG90W2ldLCBub2Rl LT5waXZvdFtpXSk7DQorCXByX2NvbnQoIiJNQV9QVFIiXG4iLCBub2RlLT5zbG90W2ldKTsNCisJ Zm9yIChpID0gMDsgaSA8IE1BUExFX1JBTkdFNjRfU0xPVFM7IGkrKykgew0KKwkJdW5zaWduZWQg bG9uZyBsYXN0ID0gbWF4Ow0KKw0KKwkJaWYgKGkgPCAoTUFQTEVfUkFOR0U2NF9TTE9UUyAtIDEp KQ0KKwkJCWxhc3QgPSBub2RlLT5waXZvdFtpXTsNCisJCWVsc2UgaWYgKCFub2RlLT5zbG90W2ld ICYmIG1heCAhPSBtdF9tYXhbbXRlX25vZGVfdHlwZShlbnRyeSldKQ0KKwkJCWJyZWFrOw0KKwkJ aWYgKGxhc3QgPT0gMCAmJiBpID4gMCkNCisJCQlicmVhazsNCisJCWlmIChsZWFmKQ0KKwkJCW10 X2R1bXBfZW50cnkobXRfc2xvdChtdCwgbm9kZS0+c2xvdCwgaSksDQorCQkJCQlmaXJzdCwgbGFz dCwgZGVwdGggKyAxKTsNCisJCWVsc2UgaWYgKG5vZGUtPnNsb3RbaV0pDQorCQkJbXRfZHVtcF9u b2RlKG10LCBtdF9zbG90KG10LCBub2RlLT5zbG90LCBpKSwNCisJCQkJCWZpcnN0LCBsYXN0LCBk ZXB0aCArIDEpOw0KKw0KKwkJaWYgKGxhc3QgPT0gbWF4KQ0KKwkJCWJyZWFrOw0KKwkJaWYgKGxh c3QgPiBtYXgpIHsNCisJCQlwcl9lcnIoIm5vZGUgIk1BX1BUUiIgbGFzdCAoJWx1KSA+IG1heCAo JWx1KSBhdCBwaXZvdCAlZCFcbiIsDQorCQkJCQlub2RlLCBsYXN0LCBtYXgsIGkpOw0KKwkJCWJy ZWFrOw0KKwkJfQ0KKwkJZmlyc3QgPSBsYXN0ICsgMTsNCisJfQ0KK30NCisNCit2b2lkIG10X2R1 bXBfYXJhbmdlNjQoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10LCB2b2lkICplbnRyeSwNCisJ CXVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgaW50IGRlcHRo KQ0KK3sNCisJc3RydWN0IG1hcGxlX2FyYW5nZV82NCAqbm9kZSA9ICZtdGVfdG9fbm9kZShlbnRy eSktPm1hNjQ7DQorCWJvb2wgbGVhZiA9IG10ZV9pc19sZWFmKGVudHJ5KTsNCisJdW5zaWduZWQg bG9uZyBmaXJzdCA9IG1pbjsNCisJaW50IGk7DQorDQorCXByX2NvbnQoIiBjb250ZW50czogIik7 DQorCWZvciAoaSA9IDA7IGkgPCBNQVBMRV9BUkFOR0U2NF9TTE9UUzsgaSsrKQ0KKwkJcHJfY29u dCgiJWx1ICIsIG5vZGUtPmdhcFtpXSk7DQorCXByX2NvbnQoInwgJTAyWCAlMDJYfCAiLCBub2Rl LT5tZXRhLmVuZCwgbm9kZS0+bWV0YS5nYXApOw0KKwlmb3IgKGkgPSAwOyBpIDwgTUFQTEVfQVJB TkdFNjRfU0xPVFMgLSAxOyBpKyspDQorCQlwcl9jb250KE1BX1BUUiIgJWx1ICIsIG5vZGUtPnNs b3RbaV0sIG5vZGUtPnBpdm90W2ldKTsNCisJcHJfY29udChNQV9QVFIiXG4iLCBub2RlLT5zbG90 W2ldKTsNCisJZm9yIChpID0gMDsgaSA8IE1BUExFX0FSQU5HRTY0X1NMT1RTOyBpKyspIHsNCisJ CXVuc2lnbmVkIGxvbmcgbGFzdCA9IG1heDsNCisNCisJCWlmIChpIDwgKE1BUExFX0FSQU5HRTY0 X1NMT1RTIC0gMSkpDQorCQkJbGFzdCA9IG5vZGUtPnBpdm90W2ldOw0KKwkJZWxzZSBpZiAoIW5v ZGUtPnNsb3RbaV0pDQorCQkJYnJlYWs7DQorCQlpZiAobGFzdCA9PSAwICYmIGkgPiAwKQ0KKwkJ CWJyZWFrOw0KKwkJaWYgKGxlYWYpDQorCQkJbXRfZHVtcF9lbnRyeShtdF9zbG90KG10LCBub2Rl LT5zbG90LCBpKSwNCisJCQkJCWZpcnN0LCBsYXN0LCBkZXB0aCArIDEpOw0KKwkJZWxzZSBpZiAo bm9kZS0+c2xvdFtpXSkNCisJCQltdF9kdW1wX25vZGUobXQsIG10X3Nsb3QobXQsIG5vZGUtPnNs b3QsIGkpLA0KKwkJCQkJZmlyc3QsIGxhc3QsIGRlcHRoICsgMSk7DQorDQorCQlpZiAobGFzdCA9 PSBtYXgpDQorCQkJYnJlYWs7DQorCQlpZiAobGFzdCA+IG1heCkgew0KKwkJCXByX2Vycigibm9k ZSAiTUFfUFRSIiBsYXN0ICglbHUpID4gbWF4ICglbHUpIGF0IHBpdm90ICVkIVxuIiwNCisJCQkJ CW5vZGUsIGxhc3QsIG1heCwgaSk7DQorCQkJYnJlYWs7DQorCQl9DQorCQlmaXJzdCA9IGxhc3Qg KyAxOw0KKwl9DQorfQ0KKw0KK3ZvaWQgbXRfZHVtcF9ub2RlKGNvbnN0IHN0cnVjdCBtYXBsZV90 cmVlICptdCwgdm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJdW5zaWduZWQgbG9u ZyBtYXgsIHVuc2lnbmVkIGludCBkZXB0aCkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2Rl ID0gbXRlX3RvX25vZGUoZW50cnkpOw0KKwl1bnNpZ25lZCBpbnQgdHlwZSA9IG10ZV9ub2RlX3R5 cGUoZW50cnkpOw0KKwl1bnNpZ25lZCBpbnQgaTsNCisNCisJbXRfZHVtcF9yYW5nZShtaW4sIG1h eCwgZGVwdGgpOw0KKw0KKwlwcl9jb250KCJub2RlICJNQV9QVFIiIGRlcHRoICVkIHR5cGUgJWQg cGFyZW50ICJNQV9QVFIsIG5vZGUsIGRlcHRoLCB0eXBlLA0KKwkJCW5vZGUgPyBub2RlLT5wYXJl bnQgOiBOVUxMKTsNCisJc3dpdGNoICh0eXBlKSB7DQorCWNhc2UgbWFwbGVfZGVuc2U6DQorCQlw cl9jb250KCJcbiIpOw0KKwkJZm9yIChpID0gMDsgaSA8IE1BUExFX05PREVfU0xPVFM7IGkrKykg ew0KKwkJCWlmIChtaW4gKyBpID4gbWF4KQ0KKwkJCQlwcl9jb250KCJPVVQgT0YgUkFOR0U6ICIp Ow0KKwkJCW10X2R1bXBfZW50cnkobXRfc2xvdChtdCwgbm9kZS0+c2xvdCwgaSksDQorCQkJCQlt aW4gKyBpLCBtaW4gKyBpLCBkZXB0aCk7DQorCQl9DQorCQlicmVhazsNCisJY2FzZSBtYXBsZV9s ZWFmXzY0Og0KKwljYXNlIG1hcGxlX3JhbmdlXzY0Og0KKwkJbXRfZHVtcF9yYW5nZTY0KG10LCBl bnRyeSwgbWluLCBtYXgsIGRlcHRoKTsNCisJCWJyZWFrOw0KKwljYXNlIG1hcGxlX2FyYW5nZV82 NDoNCisJCW10X2R1bXBfYXJhbmdlNjQobXQsIGVudHJ5LCBtaW4sIG1heCwgZGVwdGgpOw0KKwkJ YnJlYWs7DQorDQorCWRlZmF1bHQ6DQorCQlwcl9jb250KCIgVU5LTk9XTiBUWVBFXG4iKTsNCisJ fQ0KK30NCisNCit2b2lkIG10X2R1bXAoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sN CisJdm9pZCAqZW50cnkgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2sobXQtPm1hX3Jvb3QsIG10X2xv Y2tlZChtdCkpOw0KKw0KKwlwcl9pbmZvKCJtYXBsZV90cmVlKCJNQV9QVFIiKSBmbGFncyAlWCwg aGVpZ2h0ICV1IHJvb3QgIk1BX1BUUiJcbiIsDQorCQkgbXQsIG10LT5tYV9mbGFncywgbXRfaGVp Z2h0KG10KSwgZW50cnkpOw0KKwlpZiAoIXhhX2lzX25vZGUoZW50cnkpKQ0KKwkJbXRfZHVtcF9l bnRyeShlbnRyeSwgMCwgMCwgMCk7DQorCWVsc2UgaWYgKGVudHJ5KQ0KKwkJbXRfZHVtcF9ub2Rl KG10LCBlbnRyeSwgMCwgbXRfbWF4W210ZV9ub2RlX3R5cGUoZW50cnkpXSwgMCk7DQorfQ0KKw0K Ky8qDQorICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGdhcCBpbiBhIG5vZGUgYW5kIGNoZWNrIGlm IHRoYXQncyB3aGF0IGlzIHJlcG9ydGVkIGluDQorICogdGhlIHBhcmVudCAodW5sZXNzIHJvb3Qp Lg0KKyAqLw0KK3ZvaWQgbWFzX3ZhbGlkYXRlX2dhcHMoc3RydWN0IG1hX3N0YXRlICptYXMpDQor ew0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm10ZSA9IG1hcy0+bm9kZTsNCisJc3RydWN0IG1hcGxl X25vZGUgKnBfbW47DQorCXVuc2lnbmVkIGxvbmcgZ2FwID0gMCwgbWF4X2dhcCA9IDA7DQorCXVu c2lnbmVkIGxvbmcgcF9lbmQsIHBfc3RhcnQgPSBtYXMtPm1pbjsNCisJdW5zaWduZWQgY2hhciBw X3Nsb3Q7DQorCXVuc2lnbmVkIGxvbmcgKmdhcHMgPSBOVUxMOw0KKwl1bnNpZ25lZCBsb25nICpw aXZvdHMgPSBtYV9waXZvdHMobXRlX3RvX25vZGUobXRlKSwgbXRlX25vZGVfdHlwZShtdGUpKTsN CisJaW50IGk7DQorDQorCWlmIChtYV9pc19kZW5zZShtdGVfbm9kZV90eXBlKG10ZSkpKSB7DQor CQlmb3IgKGkgPSAwOyBpIDwgbXRfc2xvdF9jb3VudChtdGUpOyBpKyspIHsNCisJCQlpZiAobWFz X2dldF9zbG90KG1hcywgaSkpIHsNCisJCQkJaWYgKGdhcCA+IG1heF9nYXApDQorCQkJCQltYXhf Z2FwID0gZ2FwOw0KKwkJCQlnYXAgPSAwOw0KKwkJCQljb250aW51ZTsNCisJCQl9DQorCQkJZ2Fw Kys7DQorCQl9DQorCQlnb3RvIGNvdW50ZWQ7DQorCX0NCisNCisJaWYgKCFtdGVfaXNfbGVhZiht dGUpKQ0KKwkJZ2FwcyA9IG1hX2dhcHMobXRlX3RvX25vZGUobXRlKSwgbXRlX25vZGVfdHlwZSht dGUpKTsNCisNCisJZm9yIChpID0gMDsgaSA8IG10X3Nsb3RfY291bnQobXRlKTsgaSsrKSB7DQor CQlwX2VuZCA9IG1hc19sb2dpY2FsX3Bpdm90KG1hcywgcGl2b3RzLCBpLCBtdGVfbm9kZV90eXBl KG10ZSkpOw0KKw0KKwkJaWYgKCFnYXBzKSB7DQorCQkJaWYgKG1hc19nZXRfc2xvdChtYXMsIGkp KSB7DQorCQkJCWdhcCA9IDA7DQorCQkJCWdvdG8gbm90X2VtcHR5Ow0KKwkJCX0NCisNCisJCQln YXAgKz0gcF9lbmQgLSBwX3N0YXJ0ICsgMTsNCisJCX0gZWxzZSB7DQorCQkJdm9pZCAqZW50cnkg PSBtYXNfZ2V0X3Nsb3QobWFzLCBpKTsNCisNCisJCQlnYXAgPSBnYXBzW2ldOw0KKwkJCWlmICgh ZW50cnkpIHsNCisJCQkJaWYgKGdhcCAhPSBwX2VuZCAtIHBfc3RhcnQgKyAxKSB7DQorCQkJCQlw cl9lcnIoTUFfUFRSIlsldV0gLT4gIk1BX1BUUiIgJWx1ICE9ICVsdSAtICVsdSArIDFcbiIsDQor CQkJCQkJbWFzX21uKG1hcyksIGksDQorCQkJCQkJbWFzX2dldF9zbG90KG1hcywgaSksIGdhcCwN CisJCQkJCQlwX2VuZCwgcF9zdGFydCk7DQorCQkJCQltdF9kdW1wKG1hcy0+dHJlZSk7DQorDQor CQkJCQlNVF9CVUdfT04obWFzLT50cmVlLA0KKwkJCQkJCWdhcCAhPSBwX2VuZCAtIHBfc3RhcnQg KyAxKTsNCisJCQkJfQ0KKwkJCX0gZWxzZSB7DQorCQkJCWlmIChnYXAgPiBwX2VuZCAtIHBfc3Rh cnQgKyAxKSB7DQorCQkJCQlwcl9lcnIoTUFfUFRSIlsldV0gJWx1ID49ICVsdSAtICVsdSArIDEg KCVsdSlcbiIsDQorCQkJCQltYXNfbW4obWFzKSwgaSwgZ2FwLCBwX2VuZCwgcF9zdGFydCwNCisJ CQkJCXBfZW5kIC0gcF9zdGFydCArIDEpOw0KKwkJCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwNCisJ CQkJCQlnYXAgPiBwX2VuZCAtIHBfc3RhcnQgKyAxKTsNCisJCQkJfQ0KKwkJCX0NCisJCX0NCisN CisJCWlmIChnYXAgPiBtYXhfZ2FwKQ0KKwkJCW1heF9nYXAgPSBnYXA7DQorbm90X2VtcHR5Og0K KwkJcF9zdGFydCA9IHBfZW5kICsgMTsNCisJCWlmIChwX2VuZCA+PSBtYXMtPm1heCkNCisJCQli cmVhazsNCisJfQ0KKw0KK2NvdW50ZWQ6DQorCWlmIChtdGVfaXNfcm9vdChtdGUpKQ0KKwkJcmV0 dXJuOw0KKw0KKwlwX3Nsb3QgPSBtdGVfcGFyZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJcF9tbiA9 IG10ZV9wYXJlbnQobXRlKTsNCisJTVRfQlVHX09OKG1hcy0+dHJlZSwgbWF4X2dhcCA+IG1hcy0+ bWF4KTsNCisJaWYgKG1hX2dhcHMocF9tbiwgbWFzX3BhcmVudF9lbnVtKG1hcywgbXRlKSlbcF9z bG90XSAhPSBtYXhfZ2FwKSB7DQorCQlwcl9lcnIoImdhcCAiTUFfUFRSIlsldV0gIT0gJWx1XG4i LCBwX21uLCBwX3Nsb3QsIG1heF9nYXApOw0KKwkJbXRfZHVtcChtYXMtPnRyZWUpOw0KKwl9DQor DQorCU1UX0JVR19PTihtYXMtPnRyZWUsDQorCQkgIG1hX2dhcHMocF9tbiwgbWFzX3BhcmVudF9l bnVtKG1hcywgbXRlKSlbcF9zbG90XSAhPSBtYXhfZ2FwKTsNCit9DQorDQordm9pZCBtYXNfdmFs aWRhdGVfcGFyZW50X3Nsb3Qoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlzdHJ1Y3QgbWFw bGVfbm9kZSAqcGFyZW50Ow0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5vZGU7DQorCWVudW0gbWFw bGVfdHlwZSBwX3R5cGUgPSBtYXNfcGFyZW50X2VudW0obWFzLCBtYXMtPm5vZGUpOw0KKwl1bnNp Z25lZCBjaGFyIHBfc2xvdCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUpOw0KKwl2b2lkIF9f cmN1ICoqc2xvdHM7DQorCWludCBpOw0KKw0KKwlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkN CisJCXJldHVybjsNCisNCisJcGFyZW50ID0gbXRlX3BhcmVudChtYXMtPm5vZGUpOw0KKwlzbG90 cyA9IG1hX3Nsb3RzKHBhcmVudCwgcF90eXBlKTsNCisJTVRfQlVHX09OKG1hcy0+dHJlZSwgbWFz X21uKG1hcykgPT0gcGFyZW50KTsNCisNCisJLyogQ2hlY2sgcHJldi9uZXh0IHBhcmVudCBzbG90 IGZvciBkdXBsaWNhdGUgbm9kZSBlbnRyeSAqLw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwgbXRfc2xv dHNbcF90eXBlXTsgaSsrKSB7DQorCQlub2RlID0gbWFzX3Nsb3QobWFzLCBzbG90cywgaSk7DQor CQlpZiAoaSA9PSBwX3Nsb3QpIHsNCisJCQlpZiAobm9kZSAhPSBtYXMtPm5vZGUpDQorCQkJCXBy X2VycigicGFyZW50ICVwWyV1XSBkb2VzIG5vdCBoYXZlICVwXG4iLA0KKwkJCQkJcGFyZW50LCBp LCBtYXNfbW4obWFzKSk7DQorCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwgbm9kZSAhPSBtYXMtPm5v ZGUpOw0KKwkJfSBlbHNlIGlmIChub2RlID09IG1hcy0+bm9kZSkgew0KKwkJCXByX2VycigicGFy ZW50IGNvbnRhaW5zIGludmFsaWQgY2hpbGQgYXQgIk1BX1BUUiJbJXVdICINCisJCQkJTUFfUFRS IiBwX3Nsb3QgJXVcbiIsIHBhcmVudCwgaSwgbWFzX21uKG1hcyksIHBfc2xvdCk7DQorCQkJTVRf QlVHX09OKG1hcy0+dHJlZSwgbm9kZSA9PSBtYXMtPm5vZGUpOw0KKwkJfQ0KKwl9DQorfQ0KKw0K K3ZvaWQgbWFzX3ZhbGlkYXRlX2NoaWxkX3Nsb3Qoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0K KwllbnVtIG1hcGxlX3R5cGUgdHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJdm9p ZCBfX3JjdSAqKnNsb3RzID0gbWFfc2xvdHMobXRlX3RvX25vZGUobWFzLT5ub2RlKSwgdHlwZSk7 DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90cyA9IG1hX3Bpdm90cyhtdGVfdG9fbm9kZShtYXMtPm5v ZGUpLCB0eXBlKTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpjaGlsZDsNCisJdW5zaWduZWQgY2hh ciBpOw0KKw0KKwlpZiAobXRlX2lzX2xlYWYobWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJ Zm9yIChpID0gMDsgaSA8IG10X3Nsb3RzW3R5cGVdOyBpKyspIHsNCisJCWNoaWxkID0gbWFzX3Ns b3QobWFzLCBzbG90cywgaSk7DQorCQlpZiAoIXBpdm90c1tpXSB8fCBwaXZvdHNbaV0gPT0gbWFz LT5tYXgpDQorCQkJYnJlYWs7DQorDQorCQlpZiAoIWNoaWxkKQ0KKwkJCWJyZWFrOw0KKw0KKwkJ aWYgKG10ZV9wYXJlbnRfc2xvdChjaGlsZCkgIT0gaSkgew0KKwkJCXByX2VycigiY2hpbGQgaGFz IGluY29ycmVjdCBzbG90IGF0ICJNQV9QVFIiWyV1XSAiDQorCQkJCU1BX1BUUiIgaXMgc2V0IHRv ICV1XG4iLCBtYXNfbW4obWFzKSwNCisJCQkJaSwgbXRlX3RvX25vZGUoY2hpbGQpLCBtdGVfcGFy ZW50X3Nsb3QoY2hpbGQpKTsNCisJCQlNVF9CVUdfT04obWFzLT50cmVlLCAxKTsNCisJCX0NCisN CisJCWlmIChtdGVfcGFyZW50KGNoaWxkKSAhPSBtdGVfdG9fbm9kZShtYXMtPm5vZGUpKSB7DQor CQkJcHJfZXJyKCJjaGlsZCAiTUFfUFRSIiBoYXMgcGFyZW50ICJNQV9QVFIiIG5vdCAiTUFfUFRS IlxuIiwNCisJCQltdGVfdG9fbm9kZShjaGlsZCksIG10ZV9wYXJlbnQoY2hpbGQpLA0KKwkJCW10 ZV90b19ub2RlKG1hcy0+bm9kZSkpOw0KKwkJCU1UX0JVR19PTihtYXMtPnRyZWUsIDEpOw0KKwkJ fQ0KKwl9DQorfQ0KKw0KKy8qDQorICogVmFsaWRhdGUgYWxsIHBpdm90cyBhcmUgd2l0aGluIG1h cy0+bWluIGFuZCBtYXMtPm1heC4NCisgKi8NCit2b2lkIG1hc192YWxpZGF0ZV9saW1pdHMoc3Ry dWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlpbnQgaTsNCisJdW5zaWduZWQgbG9uZyBwcmV2X3Bp diA9IDA7DQorCXZvaWQgX19yY3UgKipzbG90cyA9IG1hX3Nsb3RzKG10ZV90b19ub2RlKG1hcy0+ bm9kZSksDQorCQkJCW10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKSk7DQorDQorCS8qIGFsbCBsaW1p dHMgYXJlIGZpbmUgaGVyZS4gKi8NCisJaWYgKG10ZV9pc19yb290KG1hcy0+bm9kZSkpDQorCQly ZXR1cm47DQorDQorCWZvciAoaSA9IDA7IGkgPCBtdF9zbG90X2NvdW50KG1hcy0+bm9kZSk7IGkr Kykgew0KKwkJZW51bSBtYXBsZV90eXBlIHR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7 DQorCQl1bnNpZ25lZCBsb25nICpwaXZvdHMgPSBtYV9waXZvdHMobWFzX21uKG1hcyksIHR5cGUp Ow0KKwkJdW5zaWduZWQgbG9uZyBwaXYgPSBtYXNfc2FmZV9waXZvdChtYXMsIHBpdm90cywgdHlw ZSwgaSk7DQorDQorCQlpZiAoIXBpdikNCisJCQlicmVhazsNCisNCisJCWlmICghbXRlX2lzX2xl YWYobWFzLT5ub2RlKSkgew0KKwkJCXZvaWQgKmVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywg aSk7DQorCQkJaWYgKCFlbnRyeSkNCisJCQkJcHJfZXJyKE1BX1BUUiJbJXVdIGNhbm5vdCBiZSBu dWxsXG4iLA0KKwkJCQkgICAgICAgbWFzX21uKG1hcyksIGkpOw0KKw0KKwkJCU1UX0JVR19PTiht YXMtPnRyZWUsICFlbnRyeSk7DQorCQl9DQorDQorCQlpZiAocHJldl9waXYgPiBwaXYpIHsNCisJ CQlwcl9lcnIoTUFfUFRSIlsldV0gcGl2ICVsdSA8IHByZXZfcGl2ICVsdVxuIiwNCisJCQkJbWFz X21uKG1hcyksIGksIHBpdiwgcHJldl9waXYpOw0KKwkJCU1UX0JVR19PTihtYXMtPnRyZWUsIHBp diA8IHByZXZfcGl2KTsNCisJCX0NCisNCisJCWlmIChwaXYgPCBtYXMtPm1pbikgew0KKwkJCXBy X2VycihNQV9QVFIiWyV1XSAlbHUgPCAlbHVcbiIsIG1hc19tbihtYXMpLCBpLA0KKwkJCQlwaXYs IG1hcy0+bWluKTsNCisJCQlNVF9CVUdfT04obWFzLT50cmVlLCBwaXYgPCBtYXMtPm1pbik7DQor CQl9DQorCQlpZiAocGl2ID4gbWFzLT5tYXgpIHsNCisJCQlwcl9lcnIoTUFfUFRSIlsldV0gJWx1 ID4gJWx1XG4iLCBtYXNfbW4obWFzKSwgaSwNCisJCQkJcGl2LCBtYXMtPm1heCk7DQorCQkJTVRf QlVHX09OKG1hcy0+dHJlZSwgcGl2ID4gbWFzLT5tYXgpOw0KKwkJfQ0KKwkJcHJldl9waXYgPSBw aXY7DQorCQlpZiAocGl2ID09IG1hcy0+bWF4KQ0KKwkJCWJyZWFrOw0KKwl9DQorfQ0KKw0KK3Zv aWQgbXRfdmFsaWRhdGVfbnVsbHMoc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJdm9pZCAq ZW50cnksICpsYXN0ID0gKHZvaWQgKikxOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldCA9IDA7DQor CXZvaWQgX19yY3UgKipzbG90czsNCisJTUFfU1RBVEUobWFzLCBtdCwgMCwgMCk7DQorDQorCW1h c19zdGFydCgmbWFzKTsNCisJaWYgKG1hc19pc19ub25lKCZtYXMpIHx8IChtYXMubm9kZSA9PSBN QVNfUk9PVCkpDQorCQlyZXR1cm47DQorDQorCXdoaWxlICghbXRlX2lzX2xlYWYobWFzLm5vZGUp KQ0KKwkJbWFzX2Rlc2NlbmQoJm1hcyk7DQorDQorCXNsb3RzID0gbWFfc2xvdHMobXRlX3RvX25v ZGUobWFzLm5vZGUpLCBtdGVfbm9kZV90eXBlKG1hcy5ub2RlKSk7DQorCWRvIHsNCisJCWVudHJ5 ID0gbWFzX3Nsb3QoJm1hcywgc2xvdHMsIG9mZnNldCk7DQorCQlpZiAoIWxhc3QgJiYgIWVudHJ5 KSB7DQorCQkJcHJfZXJyKCJTZXF1ZW50aWFsIG51bGxzIGVuZCBhdCAlcFsldV1cbiIsDQorCQkJ CW1hc19tbigmbWFzKSwgb2Zmc2V0KTsNCisJCX0NCisJCU1UX0JVR19PTihtdCwgIWxhc3QgJiYg IWVudHJ5KTsNCisJCWxhc3QgPSBlbnRyeTsNCisJCWlmIChvZmZzZXQgPT0gbWFzX2RhdGFfZW5k KCZtYXMpKSB7DQorCQkJbWFzX25leHRfbm9kZSgmbWFzLCBtYXNfbW4oJm1hcyksIFVMT05HX01B WCk7DQorCQkJaWYgKG1hc19pc19ub25lKCZtYXMpKQ0KKwkJCQlyZXR1cm47DQorCQkJb2Zmc2V0 ID0gMDsNCisJCQlzbG90cyA9IG1hX3Nsb3RzKG10ZV90b19ub2RlKG1hcy5ub2RlKSwNCisJCQkJ CSBtdGVfbm9kZV90eXBlKG1hcy5ub2RlKSk7DQorCQl9IGVsc2UNCisJCQlvZmZzZXQrKzsNCisN CisJfSB3aGlsZSAoIW1hc19pc19ub25lKCZtYXMpKTsNCit9DQorDQorLyoNCisgKiB2YWxpZGF0 ZSBhIG1hcGxlIHRyZWUgYnkgY2hlY2tpbmc6DQorICogMS4gVGhlIGxpbWl0cyAocGl2b3RzIGFy ZSB3aXRoaW4gbWFzLT5taW4gdG8gbWFzLT5tYXgpDQorICogMi4gVGhlIGdhcCBpcyBjb3JyZWN0 bHkgc2V0IGluIHRoZSBwYXJlbnRzDQorICovDQordm9pZCBtdF92YWxpZGF0ZShzdHJ1Y3QgbWFw bGVfdHJlZSAqbXQpDQorew0KKwl1bnNpZ25lZCBjaGFyIGVuZDsNCisNCisJTUFfU1RBVEUobWFz LCBtdCwgMCwgMCk7DQorCXJjdV9yZWFkX2xvY2soKTsNCisJbWFzX3N0YXJ0KCZtYXMpOw0KKwlp ZiAoIW1hc19zZWFyY2hhYmxlKCZtYXMpKQ0KKwkJZ290byBkb25lOw0KKw0KKwltYXNfZmlyc3Rf ZW50cnkoJm1hcywgbWFzX21uKCZtYXMpLCBVTE9OR19NQVgsIG10ZV9ub2RlX3R5cGUobWFzLm5v ZGUpKTsNCisJd2hpbGUgKCFtYXNfaXNfbm9uZSgmbWFzKSkgew0KKwkJTVRfQlVHX09OKG1hcy50 cmVlLCBtdGVfZGVhZF9ub2RlKG1hcy5ub2RlKSk7DQorCQlpZiAoIW10ZV9pc19yb290KG1hcy5u b2RlKSkgew0KKwkJCWVuZCA9IG1hc19kYXRhX2VuZCgmbWFzKTsNCisJCQlpZiAoKGVuZCA8IG10 X21pbl9zbG90X2NvdW50KG1hcy5ub2RlKSkgJiYNCisJCQkgICAgKG1hcy5tYXggIT0gVUxPTkdf TUFYKSkgew0KKwkJCQlwcl9lcnIoIkludmFsaWQgc2l6ZSAldSBvZiAiTUFfUFRSIlxuIiwgZW5k LA0KKwkJCQltYXNfbW4oJm1hcykpOw0KKwkJCQlNVF9CVUdfT04obWFzLnRyZWUsIDEpOw0KKwkJ CX0NCisNCisJCX0NCisJCW1hc192YWxpZGF0ZV9wYXJlbnRfc2xvdCgmbWFzKTsNCisJCW1hc192 YWxpZGF0ZV9jaGlsZF9zbG90KCZtYXMpOw0KKwkJbWFzX3ZhbGlkYXRlX2xpbWl0cygmbWFzKTsN CisJCWlmIChtdF9pc19hbGxvYyhtdCkpDQorCQkJbWFzX3ZhbGlkYXRlX2dhcHMoJm1hcyk7DQor CQltYXNfZGZzX3Bvc3RvcmRlcigmbWFzLCBVTE9OR19NQVgpOw0KKwl9DQorCW10X3ZhbGlkYXRl X251bGxzKG10KTsNCitkb25lOg0KKwlyY3VfcmVhZF91bmxvY2soKTsNCisNCit9DQorDQorI2Vu ZGlmIC8qIENPTkZJR19ERUJVR19NQVBMRV9UUkVFICovDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVz dGluZy9yYWRpeC10cmVlLy5naXRpZ25vcmUgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvLmdp dGlnbm9yZQ0KaW5kZXggZDk3MTUxNjQwMWU2Li5jOTAxZDk2ZGQwMTMgMTAwNjQ0DQotLS0gYS90 b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvLmdpdGlnbm9yZQ0KKysrIGIvdG9vbHMvdGVzdGluZy9y YWRpeC10cmVlLy5naXRpZ25vcmUNCkBAIC02LDMgKzYsNSBAQCBtYWluDQogbXVsdGlvcmRlcg0K IHJhZGl4LXRyZWUuYw0KIHhhcnJheQ0KK21hcGxlDQorbWFfeGFfYmVuY2htYXJrDQpkaWZmIC0t Z2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9y YWRpeC10cmVlL01ha2VmaWxlDQppbmRleCBhYTZhYmZlMDc0OWMuLjU1MTkzN2JhNjY0OSAxMDA2 NDQNCi0tLSBhL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9NYWtlZmlsZQ0KKysrIGIvdG9vbHMv dGVzdGluZy9yYWRpeC10cmVlL01ha2VmaWxlDQpAQCAtNCw4ICs0LDggQEAgQ0ZMQUdTICs9IC1J LiAtSS4uLy4uL2luY2x1ZGUgLWcgLU9nIC1XYWxsIC1EX0xHUExfU09VUkNFIC1mc2FuaXRpemU9 YWRkcmVzcyBcDQogCSAgLWZzYW5pdGl6ZT11bmRlZmluZWQNCiBMREZMQUdTICs9IC1mc2FuaXRp emU9YWRkcmVzcyAtZnNhbml0aXplPXVuZGVmaW5lZA0KIExETElCUys9IC1scHRocmVhZCAtbHVy Y3UNCi1UQVJHRVRTID0gbWFpbiBpZHItdGVzdCBtdWx0aW9yZGVyIHhhcnJheQ0KLUNPUkVfT0ZJ TEVTIDo9IHhhcnJheS5vIHJhZGl4LXRyZWUubyBpZHIubyBsaW51eC5vIHRlc3QubyBmaW5kX2Jp dC5vIGJpdG1hcC5vDQorVEFSR0VUUyA9IG1haW4gaWRyLXRlc3QgbXVsdGlvcmRlciB4YXJyYXkg bWFwbGUgbWFfeGFfYmVuY2htYXJrDQorQ09SRV9PRklMRVMgOj0geGFycmF5Lm8gcmFkaXgtdHJl ZS5vIGlkci5vIGxpbnV4Lm8gdGVzdC5vIGZpbmRfYml0Lm8gYml0bWFwLm8gbWFwbGUubw0KIE9G SUxFUyA9IG1haW4ubyAkKENPUkVfT0ZJTEVTKSByZWdyZXNzaW9uMS5vIHJlZ3Jlc3Npb24yLm8g cmVncmVzc2lvbjMubyBcDQogCSByZWdyZXNzaW9uNC5vIHRhZ19jaGVjay5vIG11bHRpb3JkZXIu byBpZHItdGVzdC5vIGl0ZXJhdGlvbl9jaGVjay5vIFwNCiAJIGl0ZXJhdGlvbl9jaGVja18yLm8g YmVuY2htYXJrLm8NCkBAIC0yOCw2ICsyOCwxMCBAQCBpZHItdGVzdDogaWRyLXRlc3QubyAkKENP UkVfT0ZJTEVTKQ0KIA0KIHhhcnJheTogJChDT1JFX09GSUxFUykNCiANCittYXBsZTogJChDT1JF X09GSUxFUykNCisNCittYV94YV9iZW5jaG1hcms6IG1hX3hhX2JlbmNobWFyay5vICQoQ09SRV9P RklMRVMpDQorDQogbXVsdGlvcmRlcjogbXVsdGlvcmRlci5vICQoQ09SRV9PRklMRVMpDQogDQog Y2xlYW46DQpAQCAtMzksNiArNDMsNyBAQCAkKE9GSUxFUyk6IE1ha2VmaWxlICouaCAqLyouaCBn ZW5lcmF0ZWQvbWFwLXNoaWZ0LmggXA0KIAkuLi8uLi9pbmNsdWRlL2xpbnV4LyouaCBcDQogCS4u Ly4uL2luY2x1ZGUvYXNtLyouaCBcDQogCS4uLy4uLy4uL2luY2x1ZGUvbGludXgveGFycmF5Lmgg XA0KKwkuLi8uLi8uLi9pbmNsdWRlL2xpbnV4L21hcGxlX3RyZWUuaCBcDQogCS4uLy4uLy4uL2lu Y2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oIFwNCiAJLi4vLi4vLi4vaW5jbHVkZS9saW51eC9pZHIu aA0KIA0KQEAgLTUwLDYgKzU1LDEwIEBAIGlkci5jOiAuLi8uLi8uLi9saWIvaWRyLmMNCiANCiB4 YXJyYXkubzogLi4vLi4vLi4vbGliL3hhcnJheS5jIC4uLy4uLy4uL2xpYi90ZXN0X3hhcnJheS5j DQogDQorbWFwbGUubzogLi4vLi4vLi4vbGliL21hcGxlX3RyZWUuYyAuLi8uLi8uLi9saWIvdGVz dF9tYXBsZV90cmVlLmMNCisNCittYV94YV9iZW5jaG1hcmsubzoNCisNCiBnZW5lcmF0ZWQvbWFw LXNoaWZ0Lmg6DQogCUBpZiAhIGdyZXAgLXF3cyAkKFNISUZUKSBnZW5lcmF0ZWQvbWFwLXNoaWZ0 Lmg7IHRoZW4JCVwNCiAJCWVjaG8gIiNkZWZpbmUgWEFfQ0hVTktfU0hJRlQgJChTSElGVCkiID4J CVwNCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvZ2VuZXJhdGVkL2F1dG9j b25mLmggYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvZ2VuZXJhdGVkL2F1dG9jb25mLmgNCmlu ZGV4IDIyMThiM2NjMTg0ZS4uZTdkYTgwMzUwMjM2IDEwMDY0NA0KLS0tIGEvdG9vbHMvdGVzdGlu Zy9yYWRpeC10cmVlL2dlbmVyYXRlZC9hdXRvY29uZi5oDQorKysgYi90b29scy90ZXN0aW5nL3Jh ZGl4LXRyZWUvZ2VuZXJhdGVkL2F1dG9jb25mLmgNCkBAIC0xICsxLDIgQEANCiAjZGVmaW5lIENP TkZJR19YQVJSQVlfTVVMVEkgMQ0KKyNkZWZpbmUgQ09ORklHXzY0QklUIDENCmRpZmYgLS1naXQg YS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbGludXgvbWFwbGVfdHJlZS5oIGIvdG9vbHMvdGVz dGluZy9yYWRpeC10cmVlL2xpbnV4L21hcGxlX3RyZWUuaA0KbmV3IGZpbGUgbW9kZSAxMDA2NDQN CmluZGV4IDAwMDAwMDAwMDAwMC4uODlmNTYxZTY4ODQxDQotLS0gL2Rldi9udWxsDQorKysgYi90 b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbGludXgvbWFwbGVfdHJlZS5oDQpAQCAtMCwwICsxLDcg QEANCisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsgKi8NCisjZGVmaW5lIGF0 b21pY190IGludDMyX3QNCisjaW5jbHVkZSAiLi4vLi4vLi4vLi4vaW5jbHVkZS9saW51eC9tYXBs ZV90cmVlLmgiDQorI2RlZmluZSBhdG9taWNfaW5jKHgpIHVhdG9taWNfaW5jKHgpDQorI2RlZmlu ZSBhdG9taWNfcmVhZCh4KSB1YXRvbWljX3JlYWQoeCkNCisjZGVmaW5lIGF0b21pY19zZXQoeCwg eSkgZG8ge30gd2hpbGUoMCkNCisjZGVmaW5lIFU4X01BWCBVQ0hBUl9NQVgNCmRpZmYgLS1naXQg YS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYyBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgt dHJlZS9tYXBsZS5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAwLi4z NTA4MjY3MTkyOGENCi0tLSAvZGV2L251bGwNCisrKyBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJl ZS9tYXBsZS5jDQpAQCAtMCwwICsxLDU5IEBADQorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6 IEdQTC0yLjArDQorLyoNCisgKiBtYXBsZV90cmVlLmM6IFVzZXJzcGFjZSBzaGltIGZvciBtYXBs ZSB0cmVlIHRlc3Qtc3VpdGUNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTggTGlhbSBSLiBIb3dsZXR0 IDxMaWFtLkhvd2xldHRAT3JhY2xlLmNvbT4NCisgKi8NCisNCisjZGVmaW5lIENPTkZJR19ERUJV R19NQVBMRV9UUkVFDQorI2RlZmluZSBDT05GSUdfTUFQTEVfU0VBUkNIDQorI2luY2x1ZGUgInRl c3QuaCINCisNCisjZGVmaW5lIG1vZHVsZV9pbml0KHgpDQorI2RlZmluZSBtb2R1bGVfZXhpdCh4 KQ0KKyNkZWZpbmUgTU9EVUxFX0FVVEhPUih4KQ0KKyNkZWZpbmUgTU9EVUxFX0xJQ0VOU0UoeCkN CisjZGVmaW5lIGR1bXBfc3RhY2soKQlhc3NlcnQoMCkNCisNCisjaW5jbHVkZSAiLi4vLi4vLi4v bGliL21hcGxlX3RyZWUuYyINCisjdW5kZWYgQ09ORklHX0RFQlVHX01BUExFX1RSRUUNCisjaW5j bHVkZSAiLi4vLi4vLi4vbGliL3Rlc3RfbWFwbGVfdHJlZS5jIg0KKw0KK3ZvaWQgZmFybWVyX3Rl c3RzKHZvaWQpDQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJREVGSU5FX01UUkVF KHRyZWUpOw0KKw0KKwltdF9kdW1wKCZ0cmVlKTsNCisNCisJdHJlZS5tYV9yb290ID0geGFfbWtf dmFsdWUoMCk7DQorCW10X2R1bXAoJnRyZWUpOw0KKw0KKwlub2RlID0gbXRfYWxsb2Nfb25lKEdG UF9LRVJORUwpOw0KKwlub2RlLT5wYXJlbnQgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZykoJnRy ZWUpIHwgMSk7DQorCW5vZGUtPnNsb3RbMF0gPSB4YV9ta192YWx1ZSgwKTsNCisJbm9kZS0+c2xv dFsxXSA9IHhhX21rX3ZhbHVlKDEpOw0KKwlub2RlLT5tcjY0LnBpdm90WzBdID0gMDsNCisJbm9k ZS0+bXI2NC5waXZvdFsxXSA9IDE7DQorCW5vZGUtPm1yNjQucGl2b3RbMl0gPSAwOw0KKwl0cmVl Lm1hX3Jvb3QgPSBtdF9ta19ub2RlKG5vZGUsIG1hcGxlX2xlYWZfNjQpOw0KKwltdF9kdW1wKCZ0 cmVlKTsNCisNCisJbWFfZnJlZV9yY3Uobm9kZSk7DQorfQ0KKw0KK3ZvaWQgbWFwbGVfdHJlZV90 ZXN0cyh2b2lkKQ0KK3sNCisJZmFybWVyX3Rlc3RzKCk7DQorCW1hcGxlX3RyZWVfc2VlZCgpOw0K KwltYXBsZV90cmVlX2hhcnZlc3QoKTsNCit9DQorDQoraW50IF9fd2VhayBtYWluKHZvaWQpDQor ew0KKwltYXBsZV90cmVlX2luaXQoKTsNCisJbWFwbGVfdHJlZV90ZXN0cygpOw0KKwlyY3VfYmFy cmllcigpOw0KKwlpZiAobnJfYWxsb2NhdGVkKQ0KKwkJcHJpbnRmKCJucl9hbGxvY2F0ZWQgPSAl ZFxuIiwgbnJfYWxsb2NhdGVkKTsNCisJcmV0dXJuIDA7DQorfQ0KZGlmZiAtLWdpdCBhL3Rvb2xz L3Rlc3RpbmcvcmFkaXgtdHJlZS90cmFjZS9ldmVudHMvbWFwbGVfdHJlZS5oIGIvdG9vbHMvdGVz dGluZy9yYWRpeC10cmVlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmgNCm5ldyBmaWxlIG1vZGUg MTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLmU2NTNkMDIzNjYzYg0KLS0tIC9kZXYvbnVsbA0K KysrIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmgN CkBAIC0wLDAgKzEsMyBAQA0KKyNkZWZpbmUgdHJhY2VfbWFfb3AoYSwgYikgZG8ge30gd2hpbGUo MCk7DQorI2RlZmluZSB0cmFjZV9tYV9yZWFkKGEsIGIpIGRvIHt9IHdoaWxlKDApOw0KKyNkZWZp bmUgdHJhY2VfbWFfd3JpdGUoYSwgYiwgYywgZCkgZG8ge30gd2hpbGUoMCk7DQotLSANCjIuMzQu MQ0K