From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id B6381C433FE for ; Wed, 4 May 2022 01:07:57 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3408E6B007E; Tue, 3 May 2022 21:07:57 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 2C9A18D0005; Tue, 3 May 2022 21:07:57 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E3B408D0003; Tue, 3 May 2022 21:07:56 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id B9A246B007E for ; Tue, 3 May 2022 21:07:56 -0400 (EDT) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 79ED160858 for ; Wed, 4 May 2022 01:07:56 +0000 (UTC) X-FDA: 79426273752.23.B5B355B Received: from mx0a-00069f02.pphosted.com (mx0a-00069f02.pphosted.com [205.220.165.32]) by imf10.hostedemail.com (Postfix) with ESMTP id DF4ABC007F for ; Wed, 4 May 2022 01:07:39 +0000 (UTC) Received: from pps.filterd (m0246629.ppops.net [127.0.0.1]) by mx0b-00069f02.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 243LNHUA032436; Wed, 4 May 2022 01:07:54 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=Xkefls0FNy/LqJ+eglH/5gVXAcqHT+DeWZS19xb9DvA=; b=ORBpZLfIyk/l9BKOb8Cgv0g9w+VEcVwa7Ma5/7acoB0jJNbrHVz6Cl99qemLgvWPaROo 3ZvdoHYgt7d9quhFBzSm10F0Z8z4nYwZqQlJF4329KM/8h2Vto5NaNIXv2/P1jgEqRhn eaYdvAJqSp5fiZvtCc4WhM4z9UUzTVCPjQrUQSDcymerZRGRGlWJeaoQE33Ap8LEJ6YJ mjlPeSw0LP4ZVRD187Epx7uSHpEypBgyHOj3nkcS9WXU6ZSEWJdK0C5DLIJpUH4XX2Dl z+XCRLmG4Sdq12hfbb10Q9q4mTbNEdWJUrqJCJkciq7nuCphp2UbkBWKxw25hTaNdJ00 QQ== Received: from iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (iadpaimrmta01.appoci.oracle.com [130.35.100.223]) by mx0b-00069f02.pphosted.com (PPS) with ESMTPS id 3frw0apxsv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 04 May 2022 01:07:50 +0000 Received: from pps.filterd (iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com [127.0.0.1]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com (8.16.1.2/8.16.1.2) with SMTP id 24414u6i010296; Wed, 4 May 2022 01:07:49 GMT Received: from nam12-mw2-obe.outbound.protection.outlook.com (mail-mw2nam12lp2048.outbound.protection.outlook.com [104.47.66.48]) by iadpaimrmta01.imrmtpd1.prodappiadaev1.oraclevcn.com with ESMTP id 3fruj91yyv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 04 May 2022 01:07:47 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Yzbarx+sMLcl9cJcYbmzsgxtkbUdKUDZi2XVUR+vOPPykVe7VdXB0c85vFIh+dT/ESZAgdXOx+PPPTCvq89A7AnSN6bALVb64HI15sV9THjBD39GqUZszPp1BfGXAoXD/25Ub1+i2qcL+53n+M2z8mLnbLuIpazUEw37idpSbJOIqGiRuG5hqXhEl1ySDV9BLFmCm9PS78jH2mc3WsZpR6Jc0k6ydbFFLVAMQrO0Q9e07hGf7VspxIniv4igBC+uQsAjGNdrqysVhhsgZ0QZQxDYNhquscsV62QDJaXC/TDO6SjVYuTFiCbhyD6HIUYqsAz7/MgN1JO0M2vH6sFvgg== 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=Xkefls0FNy/LqJ+eglH/5gVXAcqHT+DeWZS19xb9DvA=; b=bUDl/bE0ghz7NJ1etP8zWy+N4IYVnmWDbphpAcY3N/fN+zObaRhPbOvyhwDOEb74WkqQB47wRFRvBnnrZ1noYAO05/c///LJoO4Gkm1/i8BQSIfz2giDnWf/PfMnm1WY9uYkc8LzozU+3o8OTpTPrBKUyav65AElKP05TJ6POpbODJoct+zAop647ZBOLenZKB9gEQBqkiDyQ61Vno0NPqIANXATJYtRXQnqMS/5gwTKbVVQ+qRGxdn1+nK+oEkNApOdi0cRGEgOOE/VeBg1a5/V1FeGrbzNaEHnEFu9c1nyQ3RWT8HHjqz8ifCCmJm+vrq4HfWhNwIZuQ6Qg9VTNw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; 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=Xkefls0FNy/LqJ+eglH/5gVXAcqHT+DeWZS19xb9DvA=; b=DYLwlAYR7LryDwWwchhe/5+Pt6I1vod4ObMeVMQGseHczzwwk/mjwrh45oZXQzi71p83WHSnPjQf/SyDMu2K+RetdWyjCI4N1DCeNT6SwFoc7LAk5fajRnYsKXSwq3OasubCad5Su62RNQHeJFf5/qvgg05PvrOGACs6lsaYsSg= Received: from SN6PR10MB3022.namprd10.prod.outlook.com (2603:10b6:805:d8::25) by DM8PR10MB5445.namprd10.prod.outlook.com (2603:10b6:8:27::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5206.24; Wed, 4 May 2022 01:07:41 +0000 Received: from SN6PR10MB3022.namprd10.prod.outlook.com ([fe80::318c:d02:2280:c2c]) by SN6PR10MB3022.namprd10.prod.outlook.com ([fe80::318c:d02:2280:c2c%7]) with mapi id 15.20.5206.024; Wed, 4 May 2022 01:07:41 +0000 From: Liam Howlett To: "maple-tree@lists.infradead.org" , "linux-mm@kvack.org" , "linux-kernel@vger.kernel.org" , Andrew Morton Subject: [PATCH v9 01/69] Maple Tree: add new data structure Thread-Topic: [PATCH v9 01/69] Maple Tree: add new data structure Thread-Index: AQHYX1NaF+s7m2+ZgE69Qb+ATOyLOg== Date: Wed, 4 May 2022 01:07:41 +0000 Message-ID: <20220504010716.661115-3-Liam.Howlett@oracle.com> References: <20220504010716.661115-1-Liam.Howlett@oracle.com> In-Reply-To: <20220504010716.661115-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.35.1 x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: 0ba0a16f-03f0-4644-d321-08da2d6a7d1b x-ms-traffictypediagnostic: DM8PR10MB5445:EE_ x-microsoft-antispam-prvs: x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: WkxAKsLq3zHR5aG/3yCjvS5O+eB/sPvmT52IJhI1pMsCXTAU7xiyJu/q7f9f/W3okX0Q1MVL5BMOp5IgqWmHKnLPc4z/UhCpRFCFwQEonKR3LjjdRP+DlWoP6ZfIjPJ5uyM1bU2zihcWL6nZERuyoWFjRzK0W6DbU6x59s1B8g9b7T3z3QwrRTCVRjYWW+yYaxc/SPSiXZ4NgUO8wQiGszwxKvIslxL45ygWGiqdKFWCSUf61cwfGK/j99r1XNMcrHu9zbArYorZGs4i69a1JTxsgsN96BRhwgs49gjlymXh5MRJCr2niqOTkcZIMyrJ58QAHSwGyzbOxntTE3xPKKWJK9+gYi0xK4ZXUTvAc9eFyU9T60DCCX8K+x7j5LmGgWQCDRMqVpammhQ69Fkou7e5YvxB7EASeTdscPOjAJ2NRGrkj048eu0GWu4oTJ7X6yYN56O6aZSmlABeDAL9ikWahenB78W4d8TvBUz3JId7P8q+J6r2oqkl20ySHpc+wizZDL2twS+qXRIv633q0cT4pHL6c92ihQ5d1+RI67ceP3aX8crharbwwdDuuOTAo9KG30KktPtGPzKe1KhY9pP0N2SARK5V1P6ggTlso998jIB2ldsKdeV4O34DhKT6KbXViCwJPwSO3pVlRfFhc2hQ5sadlawO3ZTuJ4jWHBR58WuPHmUOPKWUjl30YO6MojTMHLF8nU2QqUfXNPeDT/McCtIwL8gS8S5GnkkOVjvyqY0TbDHetlaclnGmzqI5c4xiecB8SROiRUZYmOofX9jG/yB8p/mXu6kwq19CB3u5H4lhd0uVHepE4TG3KHhe 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)(2906002)(83380400001)(6506007)(26005)(5660300002)(36756003)(6512007)(1076003)(6486002)(508600001)(30864003)(8936002)(966005)(38100700002)(110136005)(64756008)(66446008)(8676002)(71200400001)(66476007)(38070700005)(186003)(44832011)(122000001)(316002)(2616005)(76116006)(66946007)(66556008)(86362001)(579004)(559001)(309714004);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?ZzRFTGxvM1EvQ1lWR2xySEc5NVV0Q1M0NWN2eFRTcG52WFhrS3RCNzZXUTVr?= =?utf-8?B?YkNCUHNpM0lHb0dUbjRrMVN3NWxwRDNUOEhYVzhrNG1iRWZXck5EcVhKZHE4?= =?utf-8?B?djQyZGw4aDNEb3hmbmhyWm5GWVVCWG1WWmVnQzdzZ2ZjZGttMkRna2xwUGgx?= =?utf-8?B?V293dWg4aWU2WmZSK3M2QVVQcWo5c2RBdXdTSzJZYXlnckRrZFA3WGt4U2Vt?= =?utf-8?B?eDhrMGVXcEZCdC9EK1hqaUR1cFd6bC9xTm5FS05GM21JWE1WTU41NThPeWpV?= =?utf-8?B?TVgwL1Y3L1cxTUtKeHIrYjJDY3p4Mks3VTVERm80MFZlN25wdEx1SkdyRVk3?= =?utf-8?B?akJOcmphYlNOMXVoRE5XSDVMQktBWW85UFcwSjA5dnVZRnAxNXROQjdFQUwv?= =?utf-8?B?dTBWc2JXZ0dkVDV1SDZEL1BsbG5lMzhVV3NCUWk4L3BEOW5LeEkwQk8yT0Nm?= =?utf-8?B?L2FkUEVQQitnSldVdHZtVnRjdWlnb2loOVNsQlVNNHIrK0Rnb25UQnQ2M3R6?= =?utf-8?B?Q3ZKa1NnZmFoQXVyUzBYa0pZc2phWFVvaVJIeUFDMk5xUTlFUUR5T0U3VkZJ?= =?utf-8?B?UitQTVpRRFdXYTlIRllEQzAzaHJQVS9wbEV1amRqQmd1OE1ESGJkTytNRUZi?= =?utf-8?B?TlMveEo1Qy8yMHZ5THp1TnpFcG9XeXBjNmtrUTh0dFk4d0k2OThnYUw1dGpq?= =?utf-8?B?ZzQ0UFZ5ZzdkcmpzYnE2Q2s2cTd4bktZbXQyWlNNUU9kQjRrMVRnaS9UeDhw?= =?utf-8?B?eTlYNjNlUXJtRWRyZSthNHgwa3FhQldsTVVSSmJFbC9LTEtHUVg3bXFFaE1a?= =?utf-8?B?ZWYxSmppNUdtQjU3RlU1WnZmbHVxcWJva2x4VDY5MmtObENqT0hkeUZ2RmtZ?= =?utf-8?B?TG1LNTVxRU8zR3lsSFpDK2lZQitTR21WMEh3QnN0M0xHVG1XYmEreDBsNUg1?= =?utf-8?B?VEIzWDBuaGxuYUc5MmxHS1BBZ1lRcUdsUG44Rk56QWpnNGlSK28zMG9GZlJn?= =?utf-8?B?Q1pvRGdvMXV1RkMzYzg0M3NMUmxkYk9haE5RbExOTUhlbytNNjViTHBnaWIr?= =?utf-8?B?RGppUjE2dlNDYVZ4OWNLdmVqKzBHcVpqQzI4MUxJMjFuejRTMnJPUDFDbGVO?= =?utf-8?B?TnlHZUszd1BuWmJMUFNSbzNoSUxieFRHT3ZndFJoNEJVYlQ5bnZTb25oNEhv?= =?utf-8?B?N2VPcFYvTzRwSEp6UmM4VWtiUlBGTWhjYnM5T3c3RmUwS3BERll5VWpDejRQ?= =?utf-8?B?eXV6WDV4b3I1dkdJMU5CV0p2dXZ5NEJmYXI5Q2w3dUpWUExJNUlUblByVUpi?= =?utf-8?B?RDFwSHQxb2orTDVxcDlIQnRhSENuM0JoelVZKzVFNFh6S3lJajNtUk9CVVF1?= =?utf-8?B?S1dac3Jua2VjUW5NWW54M2VPZ29XMWNRNWdRR2twdUw4V1JEZS9nWW5yUEh6?= =?utf-8?B?Tk1CQWJ0VVcyVktEZ2JhUDd6ODdtZnBDdkMveVNyU3pOdlBCb1dGaDNzZjZ0?= =?utf-8?B?OGt1ZjN1SkFOU3RyTGJHcm5NTHpXTlF2WWRtWkdOdkFzTkNMbkp2bVM0NmJ3?= =?utf-8?B?eHE1ci96U1lDWlZhQ08zeUpaRmZaTmc2RjdvTW1hRUZVQlNvRkxiRjNwWnRC?= =?utf-8?B?QmZoZkVkRnQzTVhaOVdacnZQZHVMd2RBdVRvYnRuTWxuM05JT3JGMHFOSldx?= =?utf-8?B?cklXZHF1dGMvR0lpeXh6VmEwUDgzOGdDQXhDMUxkaG5SdE8zTGJrencrTG14?= =?utf-8?B?YkpyRHJNa2RFWXhRSGFQbFdFNENWNktGVEJSV3daWnJHT0VQSlQvMWhjZ21u?= =?utf-8?B?OVg2MnZ3ckJDT201bGtJZzlNZW1EOWMxU1hGK1Q0Vlcza3ZMcDNLcDVlYWxK?= =?utf-8?B?WEE5OHN2ZVlNeXpGY0M1endGM2p1Z0gwRGNZbGY1WGo2c1h5UVlsenNydjRh?= =?utf-8?B?MlNMQXJSWnhXbXU0Njh2STZwQ0RNdjMxVExBenU0NTRLOWJId3dkTW9DNmJu?= =?utf-8?B?YnByR09MMFNFNHpsYUROdUNJSWNTYnlxMldWTHBmUktpUXlCZTByMzd2Z3Vq?= =?utf-8?B?Qld0UENuU04vcDAvUUROSm81Q2pvdFFLMlp0NWVMZWpYWWhDY1JHalpDQXpv?= =?utf-8?B?ZzdUc1BxZW9zblE2UnhyTGhaYm95elUveTJ4VCtTL3VjM1Ird2g2RXMrZDJ1?= =?utf-8?B?eldETktyWkJNZkpEemJFRXF6c3hjbXpSNEp6NDB6WFp4aGVrbDdMK3VqVGtz?= =?utf-8?B?cE1WSTZTTlBHdzNyazZ0Z3E1RjJ0OXI4Mk5Pemd3eGdvYmoyRWlEL2lHWHBh?= =?utf-8?B?b2hqZ0ZyY08xOUduVzhTMjlKekRjdS9uWWhXM2ZuVHU4RUhPZVBncXRCTnlD?= =?utf-8?Q?fxxSP/no88czYwP4=3D?= Content-Type: text/plain; charset="utf-8" Content-ID: <5CABDD513BEADF44AB58F625D4E55289@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: 0ba0a16f-03f0-4644-d321-08da2d6a7d1b X-MS-Exchange-CrossTenant-originalarrivaltime: 04 May 2022 01:07:41.4949 (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: 4bIjITMJmTTsq7mRUGvXDPRZKmEW7ffkk/SAAu5sOH+2X0vNroFm4w3qUVJVguU+iO+ZE9YA6Fke591UGG1LxA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM8PR10MB5445 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.486,18.0.858 definitions=2022-05-03_10:2022-05-02,2022-05-03 signatures=0 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 mlxscore=0 adultscore=0 bulkscore=0 suspectscore=0 mlxlogscore=999 malwarescore=0 phishscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2202240000 definitions=main-2205040005 X-Proofpoint-GUID: dF-m87Py1Aqk8Pq6a6g3yHehxc4UZ4cO X-Proofpoint-ORIG-GUID: dF-m87Py1Aqk8Pq6a6g3yHehxc4UZ4cO X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: DF4ABC007F X-Stat-Signature: qh3r54obukajpsdw1bcfz5hakt5m3mws X-Rspam-User: Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=oracle.com header.s=corp-2021-07-09 header.b=ORBpZLfI; dkim=pass header.d=oracle.onmicrosoft.com header.s=selector2-oracle-onmicrosoft-com header.b=DYLwlAYR; spf=none (imf10.hostedemail.com: domain of liam.howlett@oracle.com has no SPF policy when checking 205.220.165.32) smtp.mailfrom=liam.howlett@oracle.com; dmarc=pass (policy=none) header.from=oracle.com X-HE-Tag: 1651626459-467153 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: RnJvbTogIkxpYW0gUi4gSG93bGV0dCIgPExpYW0uSG93bGV0dEBPcmFjbGUuY29tPg0KDQpUaGUg bWFwbGUgdHJlZSBpcyBhbiBSQ1Utc2FmZSByYW5nZSBiYXNlZCBCLXRyZWUgZGVzaWduZWQgdG8g dXNlIG1vZGVybg0KcHJvY2Vzc29yIGNhY2hlIGVmZmljaWVudGx5LiAgVGhlcmUgYXJlIGEgbnVt YmVyIG9mIHBsYWNlcyBpbiB0aGUga2VybmVsIHRoYXQgYQ0Kbm9uLW92ZXJsYXBwaW5nIHJhbmdl LWJhc2VkIHRyZWUgd291bGQgYmUgYmVuZWZpY2lhbCwgZXNwZWNpYWxseSBvbmUgd2l0aCBhDQpz aW1wbGUgaW50ZXJmYWNlLiAgSWYgeW91IHVzZSBhbiByYnRyZWUgd2l0aCBvdGhlciBkYXRhIHN0 cnVjdHVyZXMgdG8gaW1wcm92ZQ0KcGVyZm9ybWFuY2Ugb3IgYW4gaW50ZXJ2YWwgdHJlZSB0byB0 cmFjayBub24tb3ZlcmxhcHBpbmcgcmFuZ2VzLCB0aGVuIHRoaXMgaXMNCmZvciB5b3UuDQoNClRo ZSB0cmVlIGhhcyBhIGJyYW5jaGluZyBmYWN0b3Igb2YgMTAgZm9yIG5vbi1sZWFmIG5vZGVzIGFu ZCAxNiBmb3IgbGVhZiBub2Rlcy4NCldpdGggdGhlIGluY3JlYXNlZCBicmFuY2hpbmcgZmFjdG9y LCBpdCBpcyBzaWduaWZpY2FudGx5IHNob3J0ZXIgdGhhbiB0aGUNCnJidHJlZSBzbyBpdCBoYXMg ZmV3ZXIgY2FjaGUgbWlzc2VzLiAgVGhlIHJlbW92YWwgb2YgdGhlIGxpbmtlZCBsaXN0IGJldHdl ZW4NCnN1YnNlcXVlbnQgZW50cmllcyBhbHNvIHJlZHVjZXMgdGhlIGNhY2hlIG1pc3NlcyBhbmQg dGhlIG5lZWQgdG8gcHVsbCBpbiB0aGUNCnByZXZpb3VzIGFuZCBuZXh0IFZNQSBkdXJpbmcgbWFu eSB0cmVlIGFsdGVyYXRpb25zLg0KDQpUaGUgZmlyc3QgdXNlciB0aGF0IGlzIGNvdmVyZWQgaW4g dGhpcyBwYXRjaCBzZXQgaXMgdGhlIHZtX2FyZWFfc3RydWN0LCB3aGVyZQ0KdGhyZWUgZGF0YSBz dHJ1Y3R1cmVzIGFyZSByZXBsYWNlZCBieSB0aGUgbWFwbGUgdHJlZTogdGhlIGF1Z21lbnRlZCBy YnRyZWUsIHRoZQ0Kdm1hIGNhY2hlLCBhbmQgdGhlIGxpbmtlZCBsaXN0IG9mIFZNQXMgaW4gdGhl IG1tX3N0cnVjdC4gIFRoZSBsb25nIHRlcm0gZ29hbCBpcw0KdG8gcmVkdWNlIG9yIHJlbW92ZSB0 aGUgbW1hcF9sb2NrIGNvbnRlbnRpb24uDQoNClRoZSBwbGFuIGlzIHRvIGdldCB0byB0aGUgcG9p bnQgd2hlcmUgd2UgdXNlIHRoZSBtYXBsZSB0cmVlIGluIFJDVSBtb2RlLg0KUmVhZGVycyB3aWxs IG5vdCBibG9jayBmb3Igd3JpdGVycy4gIEEgc2luZ2xlIHdyaXRlIG9wZXJhdGlvbiB3aWxsIGJl IGFsbG93ZWQNCmF0IGEgdGltZS4gIEEgcmVhZGVyIHJlLXdhbGtzIGlmIHN0YWxlIGRhdGEgaXMg ZW5jb3VudGVyZWQuIFZNQXMgd291bGQgYmUgUkNVDQplbmFibGVkIGFuZCB0aGlzIG1vZGUgd291 bGQgYmUgZW50ZXJlZCBvbmNlIG11bHRpcGxlIHRhc2tzIGFyZSB1c2luZyB0aGUNCm1tX3N0cnVj dC4NCg0KU2lnbmVkLW9mZi1ieTogTGlhbSBSLiBIb3dsZXR0IDxMaWFtLkhvd2xldHRAb3JhY2xl LmNvbT4NClNpZ25lZC1vZmYtYnk6IE1hdHRoZXcgV2lsY294IChPcmFjbGUpIDx3aWxseUBpbmZy YWRlYWQub3JnPg0KVGVzdGVkLWJ5OiBEYXZpZCBIb3dlbGxzIDxkaG93ZWxsc0ByZWRoYXQuY29t Pg0KLS0tDQogRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9pbmRleC5yc3QgICAgICAgICAgICAgIHwg ICAgMSArDQogRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9tYXBsZV90cmVlLnJzdCAgICAgICAgIHwg IDIxOCArDQogTUFJTlRBSU5FUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICAxMiArDQogaW5jbHVkZS9saW51eC9tYXBsZV90cmVlLmggICAgICAgICAgICAgICAgICAgIHwg IDY4NSArKw0KIGluY2x1ZGUvdHJhY2UvZXZlbnRzL21hcGxlX3RyZWUuaCAgICAgICAgICAgICB8 ICAxMjMgKw0KIGluaXQvbWFpbi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgIDIgKw0KIGxpYi9LY29uZmlnLmRlYnVnICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgMTUgKw0KIGxpYi9NYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8 ICAgIDMgKy0NCiBsaWIvbWFwbGVfdHJlZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCA2OTY1ICsrKysrKysrKysrKysrKysrDQogdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlLy5naXRp Z25vcmUgICAgICAgICAgIHwgICAgMiArDQogdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2dlbmVy YXRlZC9hdXRvY29uZi5oIHwgICAgMSArDQogdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4 L21hcGxlX3RyZWUuaCAgIHwgICAgNyArDQogdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL21hcGxl LmMgICAgICAgICAgICAgIHwgICA1OSArDQogLi4uL3JhZGl4LXRyZWUvdHJhY2UvZXZlbnRzL21h cGxlX3RyZWUuaCAgICAgIHwgICAgMyArDQogMTQgZmlsZXMgY2hhbmdlZCwgODA5NSBpbnNlcnRp b25zKCspLCAxIGRlbGV0aW9uKC0pDQogY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3VtZW50YXRpb24v Y29yZS1hcGkvbWFwbGVfdHJlZS5yc3QNCiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9saW51 eC9tYXBsZV90cmVlLmgNCiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS90cmFjZS9ldmVudHMv bWFwbGVfdHJlZS5oDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9tYXBsZV90cmVlLmMNCiBjcmVh dGUgbW9kZSAxMDA2NDQgdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4L21hcGxlX3RyZWUu aA0KIGNyZWF0ZSBtb2RlIDEwMDY0NCB0b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0K IGNyZWF0ZSBtb2RlIDEwMDY0NCB0b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvdHJhY2UvZXZlbnRz L21hcGxlX3RyZWUuaA0KDQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9pbmRl eC5yc3QgYi9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL2luZGV4LnJzdA0KaW5kZXggOTcyZDQ2YTVk ZGY2Li4xZGRmMzdkY2E1ZmQgMTAwNjQ0DQotLS0gYS9Eb2N1bWVudGF0aW9uL2NvcmUtYXBpL2lu ZGV4LnJzdA0KKysrIGIvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9pbmRleC5yc3QNCkBAIC0zNCw2 ICszNCw3IEBAIExpYnJhcnkgZnVuY3Rpb25hbGl0eSB0aGF0IGlzIHVzZWQgdGhyb3VnaG91dCB0 aGUga2VybmVsLg0KICAgIGtyZWYNCiAgICBhc3NvY19hcnJheQ0KICAgIHhhcnJheQ0KKyAgIG1h cGxlX3RyZWUNCiAgICBpZHINCiAgICBjaXJjdWxhci1idWZmZXJzDQogICAgcmJ0cmVlDQpkaWZm IC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9tYXBsZV90cmVlLnJzdCBiL0RvY3VtZW50 YXRpb24vY29yZS1hcGkvbWFwbGVfdHJlZS5yc3QNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRl eCAwMDAwMDAwMDAwMDAuLmM5NTE2YTJlMDMyNA0KLS0tIC9kZXYvbnVsbA0KKysrIGIvRG9jdW1l bnRhdGlvbi9jb3JlLWFwaS9tYXBsZV90cmVlLnJzdA0KQEAgLTAsMCArMSwyMTggQEANCisuLiBT UERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsNCisNCisNCis9PT09PT09PT09DQorTWFw bGUgVHJlZQ0KKz09PT09PT09PT0NCisNCis6QXV0aG9yOiBMaWFtIFIuIEhvd2xldHQNCisNCitP dmVydmlldw0KKz09PT09PT09DQorDQorVGhlIE1hcGxlIFRyZWUgaXMgYSBCLVRyZWUgZGF0YSB0 eXBlIHdoaWNoIGlzIG9wdGltaXplZCBmb3Igc3RvcmluZw0KK25vbi1vdmVybGFwcGluZyByYW5n ZXMsIGluY2x1ZGluZyByYW5nZXMgb2Ygc2l6ZSAxLiAgVGhlIHRyZWUgd2FzIGRlc2lnbmVkIHRv DQorYmUgc2ltcGxlIHRvIHVzZSBhbmQgZG9lcyBub3QgcmVxdWlyZSBhIHVzZXIgd3JpdHRlbiBz ZWFyY2ggbWV0aG9kLiAgSXQNCitzdXBwb3J0cyBpdGVyYXRpbmcgb3ZlciBhIHJhbmdlIG9mIGVu dHJpZXMgYW5kIGdvaW5nIHRvIHRoZSBwcmV2aW91cyBvciBuZXh0DQorZW50cnkgaW4gYSBjYWNo ZS1lZmZpY2llbnQgbWFubmVyLiAgVGhlIHRyZWUgY2FuIGFsc28gYmUgcHV0IGludG8gYW4gUkNV LXNhZmUNCittb2RlIG9mIG9wZXJhdGlvbiB3aGljaCBhbGxvd3MgcmVhZGluZyBhbmQgd3JpdGlu ZyBjb25jdXJyZW50bHkuICBXcml0ZXJzIG11c3QNCitzeW5jaHJvbml6ZSBvbiBhIGxvY2ssIHdo aWNoIGNhbiBiZSB0aGUgZGVmYXVsdCBzcGlubG9jaywgb3IgdGhlIHVzZXIgY2FuIHNldA0KK3Ro ZSBsb2NrIHRvIGFuIGV4dGVybmFsIGxvY2sgb2YgYSBkaWZmZXJlbnQgdHlwZS4NCisNCitUaGUg TWFwbGUgVHJlZSBtYWludGFpbnMgYSBzbWFsbCBtZW1vcnkgZm9vdHByaW50IGFuZCB3YXMgZGVz aWduZWQgdG8gdXNlDQorbW9kZXJuIHByb2Nlc3NvciBjYWNoZSBlZmZpY2llbnRseS4gIFRoZSBt YWpvcml0eSBvZiB0aGUgdXNlcnMgd2lsbCBiZSBhYmxlIHRvDQordXNlIHRoZSBub3JtYWwgQVBJ LiAgQW4gOnJlZjpgbWFwbGUtdHJlZS1hZHZhbmNlZC1hcGlgIGV4aXN0cyBmb3IgbW9yZSBjb21w bGV4DQorc2NlbmFyaW9zLiAgVGhlIG1vc3QgaW1wb3J0YW50IHVzYWdlIG9mIHRoZSBNYXBsZSBU cmVlIGlzIHRoZSB0cmFja2luZyBvZiB0aGUNCit2aXJ0dWFsIG1lbW9yeSBhcmVhcy4NCisNCitU aGUgTWFwbGUgVHJlZSBjYW4gc3RvcmUgdmFsdWVzIGJldHdlZW4gYGAwYGAgYW5kIGBgVUxPTkdf TUFYYGAuICBUaGUgTWFwbGUNCitUcmVlIHJlc2VydmVzIHZhbHVlcyB3aXRoIHRoZSBib3R0b20g dHdvIGJpdHMgc2V0IHRvICcxMCcgd2hpY2ggYXJlIGJlbG93IDQwOTYNCisoaWUgMiwgNiwgMTAg Li4gNDA5NCkgZm9yIGludGVybmFsIHVzZS4gIElmIHRoZSBlbnRyaWVzIG1heSB1c2UgcmVzZXJ2 ZWQNCitlbnRyaWVzIHRoZW4gdGhlIHVzZXJzIGNhbiBjb252ZXJ0IHRoZSBlbnRyaWVzIHVzaW5n IHhhX21rX3ZhbHVlKCkgYW5kIGNvbnZlcnQNCit0aGVtIGJhY2sgYnkgY2FsbGluZyB4YV90b192 YWx1ZSgpLiAgSWYgdGhlIHVzZXIgbmVlZHMgdG8gdXNlIGEgcmVzZXJ2ZWQNCit2YWx1ZSwgdGhl biB0aGUgdXNlciBjYW4gY29udmVydCB0aGUgdmFsdWUgd2hlbiB1c2luZyB0aGUNCis6cmVmOmBt YXBsZS10cmVlLWFkdmFuY2VkLWFwaWAsIGJ1dCBhcmUgYmxvY2tlZCBieSB0aGUgbm9ybWFsIEFQ SS4NCisNCitUaGUgTWFwbGUgVHJlZSBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHRvIHN1cHBvcnQg c2VhcmNoaW5nIGZvciBhIGdhcCBvZiBhIGdpdmVuDQorc2l6ZSAob3IgbGFyZ2VyKS4NCisNCitQ cmUtYWxsb2NhdGluZyBvZiBub2RlcyBpcyBhbHNvIHN1cHBvcnRlZCB1c2luZyB0aGUNCis6cmVm OmBtYXBsZS10cmVlLWFkdmFuY2VkLWFwaWAuICBUaGlzIGlzIHVzZWZ1bCBmb3IgdXNlcnMgd2hv IG11c3QgZ3VhcmFudGVlIGENCitzdWNjZXNzZnVsIHN0b3JlIG9wZXJhdGlvbiB3aXRoaW4gYSBn aXZlbg0KK2NvZGUgc2VnbWVudCB3aGVuIGFsbG9jYXRpbmcgY2Fubm90IGJlIGRvbmUuICBBbGxv Y2F0aW9ucyBvZiBub2RlcyBhcmUNCityZWxhdGl2ZWx5IHNtYWxsIGF0IGFyb3VuZCAyNTYgYnl0 ZXMuDQorDQorLi4gX21hcGxlLXRyZWUtbm9ybWFsLWFwaToNCisNCitOb3JtYWwgQVBJDQorPT09 PT09PT09PQ0KKw0KK1N0YXJ0IGJ5IGluaXRpYWxpc2luZyBhIG1hcGxlIHRyZWUsIGVpdGhlciB3 aXRoIERFRklORV9NVFJFRSgpIGZvciBzdGF0aWNhbGx5DQorYWxsb2NhdGVkIG1hcGxlIHRyZWVz IG9yIG10X2luaXQoKSBmb3IgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG9uZXMuICBBDQorZnJlc2hs eS1pbml0aWFsaXNlZCBtYXBsZSB0cmVlIGNvbnRhaW5zIGEgYGBOVUxMYGAgcG9pbnRlciBmb3Ig dGhlIHJhbmdlIGBgMGBgDQorLSBgYFVMT05HX01BWGBgLiAgVGhlcmUgYXJlIGN1cnJlbnRseSB0 d28gdHlwZXMgb2YgbWFwbGUgdHJlZXMgc3VwcG9ydGVkOiB0aGUNCithbGxvY2F0aW9uIHRyZWUg YW5kIHRoZSByZWd1bGFyIHRyZWUuICBUaGUgcmVndWxhciB0cmVlIGhhcyBhIGhpZ2hlciBicmFu Y2hpbmcNCitmYWN0b3IgZm9yIGludGVybmFsIG5vZGVzLiAgVGhlIGFsbG9jYXRpb24gdHJlZSBo YXMgYSBsb3dlciBicmFuY2hpbmcgZmFjdG9yDQorYnV0IGFsbG93cyB0aGUgdXNlciB0byBzZWFy Y2ggZm9yIGEgZ2FwIG9mIGEgZ2l2ZW4gc2l6ZSBvciBsYXJnZXIgZnJvbSBlaXRoZXINCitgYDBg YCB1cHdhcmRzIG9yIGBgVUxPTkdfTUFYYGAgZG93bi4gIEFuIGFsbG9jYXRpb24gdHJlZSBjYW4g YmUgdXNlZCBieQ0KK3Bhc3NpbmcgaW4gdGhlIGBgTVRfRkxBR1NfQUxMT0NfUkFOR0VgYCBmbGFn IHdoZW4gaW5pdGlhbGlzaW5nIHRoZSB0cmVlLg0KKw0KK1lvdSBjYW4gdGhlbiBzZXQgZW50cmll cyB1c2luZyBtdHJlZV9zdG9yZSgpIG9yIG10cmVlX3N0b3JlX3JhbmdlKCkuDQorbXRyZWVfc3Rv cmUoKSB3aWxsIG92ZXJ3cml0ZSBhbnkgZW50cnkgd2l0aCB0aGUgbmV3IGVudHJ5IGFuZCByZXR1 cm4gMCBvbg0KK3N1Y2Nlc3Mgb3IgYW4gZXJyb3IgY29kZSBvdGhlcndpc2UuICBtdHJlZV9zdG9y ZV9yYW5nZSgpIHdvcmtzIGluIHRoZSBzYW1lIHdheQ0KK2J1dCB0YWtlcyBhIHJhbmdlLiAgbXRy ZWVfbG9hZCgpIGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGVudHJ5IHN0b3JlZCBhdCBhDQorZ2l2 ZW4gaW5kZXguICBZb3UgY2FuIHVzZSBtdHJlZV9lcmFzZSgpIHRvIGVyYXNlIGFuIGVudGlyZSBy YW5nZSBieSBvbmx5DQora25vd2luZyBvbmUgdmFsdWUgd2l0aGluIHRoYXQgcmFuZ2UsIG9yIG10 cmVlX3N0b3JlKCkgY2FsbCB3aXRoIGFuIGVudHJ5IG9mDQorTlVMTCBtYXkgYmUgdXNlZCB0byBw YXJ0aWFsbHkgZXJhc2UgYSByYW5nZSBvciBtYW55IHJhbmdlcyBhdCBvbmNlLg0KKw0KK0lmIHlv dSB3YW50IHRvIG9ubHkgc3RvcmUgYSBuZXcgZW50cnkgdG8gYSByYW5nZSAob3IgaW5kZXgpIGlm IHRoYXQgcmFuZ2UgaXMNCitjdXJyZW50bHkgYGBOVUxMYGAsIHlvdSBjYW4gdXNlIG10cmVlX2lu c2VydF9yYW5nZSgpIG9yIG10cmVlX2luc2VydCgpIHdoaWNoDQorcmV0dXJuIC1FRVhJU1QgaWYg dGhlIHJhbmdlIGlzIG5vdCBlbXB0eS4NCisNCitZb3UgY2FuIHNlYXJjaCBmb3IgYW4gZW50cnkg ZnJvbSBhbiBpbmRleCB1cHdhcmRzIGJ5IHVzaW5nIG10X2ZpbmQoKS4NCisNCitZb3UgY2FuIHdh bGsgZWFjaCBlbnRyeSB3aXRoaW4gYSByYW5nZSBieSBjYWxsaW5nIG10X2Zvcl9lYWNoKCkuICBZ b3UgbXVzdA0KK3Byb3ZpZGUgYSB0ZW1wb3JhcnkgdmFyaWFibGUgdG8gc3RvcmUgYSBjdXJzb3Iu ICBJZiB5b3Ugd2FudCB0byB3YWxrIGVhY2gNCitlbGVtZW50IG9mIHRoZSB0cmVlIHRoZW4gYGAw YGAgYW5kIGBgVUxPTkdfTUFYYGAgbWF5IGJlIHVzZWQgYXMgdGhlIHJhbmdlLiAgSWYNCit0aGUg Y2FsbGVyIGlzIGdvaW5nIHRvIGhvbGQgdGhlIGxvY2sgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUg d2FsayB0aGVuIGl0IGlzDQord29ydGggbG9va2luZyBhdCB0aGUgbWFzX2Zvcl9lYWNoKCkgQVBJ IGluIHRoZSA6cmVmOmBtYXBsZS10cmVlLWFkdmFuY2VkLWFwaWANCitzZWN0aW9uLg0KKw0KK1Nv bWV0aW1lcyBpdCBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZSBuZXh0IGNhbGwgdG8gc3RvcmUg dG8gYSBtYXBsZSB0cmVlIGRvZXMNCitub3QgYWxsb2NhdGUgbWVtb3J5LCBwbGVhc2Ugc2VlIDpy ZWY6YG1hcGxlLXRyZWUtYWR2YW5jZWQtYXBpYCBmb3IgdGhpcyB1c2UgY2FzZS4NCisNCitGaW5h bGx5LCB5b3UgY2FuIHJlbW92ZSBhbGwgZW50cmllcyBmcm9tIGEgbWFwbGUgdHJlZSBieSBjYWxs aW5nDQorbXRyZWVfZGVzdHJveSgpLiAgSWYgdGhlIG1hcGxlIHRyZWUgZW50cmllcyBhcmUgcG9p bnRlcnMsIHlvdSBtYXkgd2lzaCB0byBmcmVlDQordGhlIGVudHJpZXMgZmlyc3QuDQorDQorQWxs b2NhdGluZyBOb2Rlcw0KKy0tLS0tLS0tLS0tLS0tLS0NCisNCitUaGUgYWxsb2NhdGlvbnMgYXJl IGhhbmRsZWQgYnkgdGhlIGludGVybmFsIHRyZWUgY29kZS4gIFNlZQ0KKzpyZWY6YG1hcGxlLXRy ZWUtYWR2YW5jZWQtYWxsb2NgIGZvciBvdGhlciBvcHRpb25zLg0KKw0KK0xvY2tpbmcNCistLS0t LS0tDQorDQorWW91IGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IGxvY2tpbmcuICBTZWUgOnJl ZjpgbWFwbGUtdHJlZS1hZHZhbmNlZC1sb2Nrc2ANCitmb3Igb3RoZXIgb3B0aW9ucy4NCisNCitU aGUgTWFwbGUgVHJlZSB1c2VzIFJDVSBhbmQgYW4gaW50ZXJuYWwgc3BpbmxvY2sgdG8gc3luY2hy b25pc2UgYWNjZXNzOg0KKw0KK1Rha2VzIFJDVSByZWFkIGxvY2s6DQorICogbXRyZWVfbG9hZCgp DQorICogbXRfZmluZCgpDQorICogbXRfZm9yX2VhY2goKQ0KKyAqIG10X25leHQoKQ0KKyAqIG10 X3ByZXYoKQ0KKw0KK1Rha2VzIG1hX2xvY2sgaW50ZXJuYWxseToNCisgKiBtdHJlZV9zdG9yZSgp DQorICogbXRyZWVfc3RvcmVfcmFuZ2UoKQ0KKyAqIG10cmVlX2luc2VydCgpDQorICogbXRyZWVf aW5zZXJ0X3JhbmdlKCkNCisgKiBtdHJlZV9lcmFzZSgpDQorICogbXRyZWVfZGVzdHJveSgpDQor ICogbXRfc2V0X2luX3JjdSgpDQorICogbXRfY2xlYXJfaW5fcmN1KCkNCisNCitJZiB5b3Ugd2Fu dCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgaW50ZXJuYWwgbG9jayB0byBwcm90ZWN0IHRoZSBk YXRhDQorc3RydWN0dXJlcyB0aGF0IHlvdSBhcmUgc3RvcmluZyBpbiB0aGUgTWFwbGUgVHJlZSwg eW91IGNhbiBjYWxsIG10cmVlX2xvY2soKQ0KK2JlZm9yZSBjYWxsaW5nIG10cmVlX2xvYWQoKSwg dGhlbiB0YWtlIGEgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSBvYmplY3QgeW91DQoraGF2ZSBmb3Vu ZCBiZWZvcmUgY2FsbGluZyBtdHJlZV91bmxvY2soKS4gIFRoaXMgd2lsbCBwcmV2ZW50IHN0b3Jl cyBmcm9tDQorcmVtb3ZpbmcgdGhlIG9iamVjdCBmcm9tIHRoZSB0cmVlIGJldHdlZW4gbG9va2lu ZyB1cCB0aGUgb2JqZWN0IGFuZA0KK2luY3JlbWVudGluZyB0aGUgcmVmY291bnQuICBZb3UgY2Fu IGFsc28gdXNlIFJDVSB0byBhdm9pZCBkZXJlZmVyZW5jaW5nDQorZnJlZWQgbWVtb3J5LCBidXQg YW4gZXhwbGFuYXRpb24gb2YgdGhhdCBpcyBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMNCitkb2N1 bWVudC4NCisNCisuLiBfbWFwbGUtdHJlZS1hZHZhbmNlZC1hcGk6DQorDQorQWR2YW5jZWQgQVBJ DQorPT09PT09PT09PT09DQorDQorVGhlIGFkdmFuY2VkIEFQSSBvZmZlcnMgbW9yZSBmbGV4aWJp bGl0eSBhbmQgYmV0dGVyIHBlcmZvcm1hbmNlIGF0IHRoZQ0KK2Nvc3Qgb2YgYW4gaW50ZXJmYWNl IHdoaWNoIGNhbiBiZSBoYXJkZXIgdG8gdXNlIGFuZCBoYXMgZmV3ZXIgc2FmZWd1YXJkcy4NCitZ b3UgbXVzdCB0YWtlIGNhcmUgb2YgeW91ciBvd24gbG9ja2luZyB3aGlsZSB1c2luZyB0aGUgYWR2 YW5jZWQgQVBJLg0KK1lvdSBjYW4gdXNlIHRoZSBtYV9sb2NrLCBSQ1Ugb3IgYW4gZXh0ZXJuYWwg bG9jayBmb3IgcHJvdGVjdGlvbi4NCitZb3UgY2FuIG1peCBhZHZhbmNlZCBhbmQgbm9ybWFsIG9w ZXJhdGlvbnMgb24gdGhlIHNhbWUgYXJyYXksIGFzIGxvbmcNCithcyB0aGUgbG9ja2luZyBpcyBj b21wYXRpYmxlLiAgVGhlIDpyZWY6YG1hcGxlLXRyZWUtbm9ybWFsLWFwaWAgaXMgaW1wbGVtZW50 ZWQNCitpbiB0ZXJtcyBvZiB0aGUgYWR2YW5jZWQgQVBJLg0KKw0KK1RoZSBhZHZhbmNlZCBBUEkg aXMgYmFzZWQgYXJvdW5kIHRoZSBtYV9zdGF0ZSwgdGhpcyBpcyB3aGVyZSB0aGUgJ21hcycNCitw cmVmaXggb3JpZ2luYXRlcy4gIFRoZSBtYV9zdGF0ZSBzdHJ1Y3Qga2VlcHMgdHJhY2sgb2YgdHJl ZSBvcGVyYXRpb25zIHRvIG1ha2UNCitsaWZlIGVhc2llciBmb3IgYm90aCBpbnRlcm5hbCBhbmQg ZXh0ZXJuYWwgdHJlZSB1c2Vycy4NCisNCitJbml0aWFsaXNpbmcgdGhlIG1hcGxlIHRyZWUgaXMg dGhlIHNhbWUgYXMgaW4gdGhlIDpyZWY6YG1hcGxlLXRyZWUtbm9ybWFsLWFwaWAuDQorUGxlYXNl IHNlZSBhYm92ZS4NCisNCitUaGUgbWFwbGUgc3RhdGUga2VlcHMgdHJhY2sgb2YgdGhlIHJhbmdl IHN0YXJ0IGFuZCBlbmQgaW4gbWFzLT5pbmRleCBhbmQNCittYXMtPmxhc3QsIHJlc3BlY3RpdmVs eS4NCisNCittYXNfd2FsaygpIHdpbGwgd2FsayB0aGUgdHJlZSB0byB0aGUgbG9jYXRpb24gb2Yg bWFzLT5pbmRleCBhbmQgc2V0IHRoZQ0KK21hcy0+aW5kZXggYW5kIG1hcy0+bGFzdCBhY2NvcmRp bmcgdG8gdGhlIHJhbmdlIGZvciB0aGUgZW50cnkuDQorDQorWW91IGNhbiBzZXQgZW50cmllcyB1 c2luZyBtYXNfc3RvcmUoKS4gIG1hc19zdG9yZSgpIHdpbGwgb3ZlcndyaXRlIGFueSBlbnRyeQ0K K3dpdGggdGhlIG5ldyBlbnRyeSBhbmQgcmV0dXJuIHRoZSBmaXJzdCBleGlzdGluZyBlbnRyeSB0 aGF0IGlzIG92ZXJ3cml0dGVuLg0KK1RoZSByYW5nZSBpcyBwYXNzZWQgaW4gYXMgbWVtYmVycyBv ZiB0aGUgbWFwbGUgc3RhdGU6IGluZGV4IGFuZCBsYXN0Lg0KKw0KK1lvdSBjYW4gdXNlIG1hc19l cmFzZSgpIHRvIGVyYXNlIGFuIGVudGlyZSByYW5nZSBieSBzZXR0aW5nIGluZGV4IGFuZA0KK2xh c3Qgb2YgdGhlIG1hcGxlIHN0YXRlIHRvIHRoZSBkZXNpcmVkIHJhbmdlIHRvIGVyYXNlLiAgVGhp cyB3aWxsIGVyYXNlDQordGhlIGZpcnN0IHJhbmdlIHRoYXQgaXMgZm91bmQgaW4gdGhhdCByYW5n ZSwgc2V0IHRoZSBtYXBsZSBzdGF0ZSBpbmRleA0KK2FuZCBsYXN0IGFzIHRoZSByYW5nZSB0aGF0 IHdhcyBlcmFzZWQgYW5kIHJldHVybiB0aGUgZW50cnkgdGhhdCBleGlzdGVkDQorYXQgdGhhdCBs b2NhdGlvbi4NCisNCitZb3UgY2FuIHdhbGsgZWFjaCBlbnRyeSB3aXRoaW4gYSByYW5nZSBieSB1 c2luZyBtYXNfZm9yX2VhY2goKS4gIElmIHlvdSB3YW50DQordG8gd2FsayBlYWNoIGVsZW1lbnQg b2YgdGhlIHRyZWUgdGhlbiBgYDBgYCBhbmQgYGBVTE9OR19NQVhgYCBtYXkgYmUgdXNlZCBhcw0K K3RoZSByYW5nZS4gIElmIHRoZSBsb2NrIG5lZWRzIHRvIGJlIHBlcmlvZGljYWxseSBkcm9wcGVk LCBzZWUgdGhlIGxvY2tpbmcNCitzZWN0aW9uIG1hc19wYXVzZSgpLg0KKw0KK1VzaW5nIGEgbWFw bGUgc3RhdGUgYWxsb3dzIG1hc19uZXh0KCkgYW5kIG1hc19wcmV2KCkgdG8gZnVuY3Rpb24gYXMg aWYgdGhlDQordHJlZSB3YXMgYSBsaW5rZWQgbGlzdC4gIFdpdGggc3VjaCBhIGhpZ2ggYnJhbmNo aW5nIGZhY3RvciB0aGUgYW1vcnRpemVkDQorcGVyZm9ybWFuY2UgcGVuYWx0eSBpcyBvdXR3ZWln aGVkIGJ5IGNhY2hlIG9wdGltaXphdGlvbi4gIG1hc19uZXh0KCkgd2lsbA0KK3JldHVybiB0aGUg bmV4dCBlbnRyeSB3aGljaCBvY2N1cnMgYWZ0ZXIgdGhlIGVudHJ5IGF0IGluZGV4LiAgbWFzX3By ZXYoKQ0KK3dpbGwgcmV0dXJuIHRoZSBwcmV2aW91cyBlbnRyeSB3aGljaCBvY2N1cnMgYmVmb3Jl IHRoZSBlbnRyeSBhdCBpbmRleC4NCisNCittYXNfZmluZCgpIHdpbGwgZmluZCB0aGUgZmlyc3Qg ZW50cnkgd2hpY2ggZXhpc3RzIGF0IG9yIGFib3ZlIGluZGV4IG9uDQordGhlIGZpcnN0IGNhbGws IGFuZCB0aGUgbmV4dCBlbnRyeSBmcm9tIGV2ZXJ5IHN1YnNlcXVlbnQgY2FsbHMuDQorDQorbWFz X2ZpbmRfcmV2KCkgd2lsbCBmaW5kIHRoZSBmaXN0IGVudHJ5IHdoaWNoIGV4aXN0cyBhdCBvciBi ZWxvdyB0aGUgbGFzdCBvbg0KK3RoZSBmaXJzdCBjYWxsLCBhbmQgdGhlIHByZXZpb3VzIGVudHJ5 IGZyb20gZXZlcnkgc3Vic2VxdWVudCBjYWxscy4NCisNCitJZiB0aGUgdXNlciBuZWVkcyB0byB5 aWVsZCB0aGUgbG9jayBkdXJpbmcgYW4gb3BlcmF0aW9uLCB0aGVuIHRoZSBtYXBsZSBzdGF0ZQ0K K211c3QgYmUgcGF1c2VkIHVzaW5nIG1hc19wYXVzZSgpLg0KKw0KK1RoZXJlIGFyZSBhIGZldyBl eHRyYSBpbnRlcmZhY2VzIHByb3ZpZGVkIHdoZW4gdXNpbmcgYW4gYWxsb2NhdGlvbiB0cmVlLg0K K0lmIHlvdSB3aXNoIHRvIHNlYXJjaCBmb3IgYSBnYXAgd2l0aGluIGEgcmFuZ2UsIHRoZW4gbWFz X2VtcHR5X2FyZWEoKQ0KK29yIG1hc19lbXB0eV9hcmVhX3JldigpIGNhbiBiZSB1c2VkLiAgbWFz X2VtcHR5X2FyZWEoKSBzZWFyY2hlcyBmb3IgYSBnYXANCitzdGFydGluZyBhdCB0aGUgbG93ZXN0 IGluZGV4IGdpdmVuIHVwIHRvIHRoZSBtYXhpbXVtIG9mIHRoZSByYW5nZS4NCittYXNfZW1wdHlf YXJlYV9yZXYoKSBzZWFyY2hlcyBmb3IgYSBnYXAgc3RhcnRpbmcgYXQgdGhlIGhpZ2hlc3QgaW5k ZXggZ2l2ZW4NCithbmQgY29udGludWVzIGRvd253YXJkIHRvIHRoZSBsb3dlciBib3VuZCBvZiB0 aGUgcmFuZ2UuDQorDQorLi4gX21hcGxlLXRyZWUtYWR2YW5jZWQtYWxsb2M6DQorDQorQWR2YW5j ZWQgQWxsb2NhdGluZyBOb2Rlcw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitBbGxv Y2F0aW9ucyBhcmUgdXN1YWxseSBoYW5kbGVkIGludGVybmFsbHkgdG8gdGhlIHRyZWUsIGhvd2V2 ZXIgaWYgYWxsb2NhdGlvbnMNCituZWVkIHRvIG9jY3VyIGJlZm9yZSBhIHdyaXRlIG9jY3VycyB0 aGVuIGNhbGxpbmcgbWFzX2V4cGVjdGVkX2VudHJpZXMoKSB3aWxsDQorYWxsb2NhdGUgdGhlIHdv cnN0LWNhc2UgbnVtYmVyIG9mIG5lZWRlZCBub2RlcyB0byBpbnNlcnQgdGhlIHByb3ZpZGVkIG51 bWJlciBvZg0KK3Jhbmdlcy4gIFRoaXMgYWxzbyBjYXVzZXMgdGhlIHRyZWUgdG8gZW50ZXIgbWFz cyBpbnNlcnRpb24gbW9kZS4gIE9uY2UNCitpbnNlcnRpb25zIGFyZSBjb21wbGV0ZSBjYWxsaW5n IG1hc19kZXN0cm95KCkgb24gdGhlIG1hcGxlIHN0YXRlIHdpbGwgZnJlZSB0aGUNCit1bnVzZWQg YWxsb2NhdGlvbnMuDQorDQorLi4gX21hcGxlLXRyZWUtYWR2YW5jZWQtbG9ja3M6DQorDQorQWR2 YW5jZWQgTG9ja2luZw0KKy0tLS0tLS0tLS0tLS0tLS0NCisNCitUaGUgbWFwbGUgdHJlZSB1c2Vz IGEgc3BpbmxvY2sgYnkgZGVmYXVsdCwgYnV0IGV4dGVybmFsIGxvY2tzIGNhbiBiZSB1c2VkIGZv cg0KK3RyZWUgdXBkYXRlcyBhcyB3ZWxsLiAgVG8gdXNlIGFuIGV4dGVybmFsIGxvY2ssIHRoZSB0 cmVlIG11c3QgYmUgaW5pdGlhbGl6ZWQNCit3aXRoIHRoZSBgYE1UX0ZMQUdTX0xPQ0tfRVhURVJO IGZsYWdgYCwgdGhpcyBpcyB1c3VhbGx5IGRvbmUgd2l0aCB0aGUNCitNVFJFRV9JTklUX0VYVCgp ICNkZWZpbmUsIHdoaWNoIHRha2VzIGFuIGV4dGVybmFsIGxvY2sgYXMgYW4gYXJndW1lbnQuDQor DQorRnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmVzDQorPT09PT09PT09PT09PT09PT09PT09PT09DQor DQorLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvbWFwbGVfdHJlZS5oDQorLi4ga2VybmVs LWRvYzo6IGxpYi9tYXBsZV90cmVlLmMNCisNCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01B SU5UQUlORVJTDQppbmRleCA3OGM1NzA0NmZhOTMuLjE4M2E4MzE5MDc5YiAxMDA2NDQNCi0tLSBh L01BSU5UQUlORVJTDQorKysgYi9NQUlOVEFJTkVSUw0KQEAgLTExNjYzLDYgKzExNjYzLDE4IEBA IEw6CWxpbnV4LW1hbkB2Z2VyLmtlcm5lbC5vcmcNCiBTOglNYWludGFpbmVkDQogVzoJaHR0cDov L3d3dy5rZXJuZWwub3JnL2RvYy9tYW4tcGFnZXMNCiANCitNQVBMRSBUUkVFDQorTToJTGlhbSBS LiBIb3dsZXR0IDxMaWFtLkhvd2xldHRAb3JhY2xlLmNvbT4NCitMOglsaW51eC1tbUBrdmFjay5v cmcNCitTOglTdXBwb3J0ZWQNCitGOglEb2N1bWVudGF0aW9uL2NvcmUtYXBpL21hcGxlX3RyZWUu cnN0DQorRjoJaW5jbHVkZS9saW51eC9tYXBsZV90cmVlLmgNCitGOglpbmNsdWRlL3RyYWNlL2V2 ZW50cy9tYXBsZV90cmVlLmgNCitGOglsaWIvbWFwbGVfdHJlZS5jDQorRjoJbGliL3Rlc3RfbWFw bGVfdHJlZS5jDQorRjoJdG9vbHMvdGVzdGluZy9fYWRpeC10cmVlL2xpbnV4L21hcGxlX3RyZWUu aA0KK0Y6CXRvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9tYXBsZS5jDQorDQogTUFSRFVLIChDUkVB VE9SIENJNDApIERFVklDRSBUUkVFIFNVUFBPUlQNCiBNOglSYWh1bCBCZWRhcmthciA8cmFodWxi ZWRhcmthcjg5QGdtYWlsLmNvbT4NCiBMOglsaW51eC1taXBzQHZnZXIua2VybmVsLm9yZw0KZGlm ZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWFwbGVfdHJlZS5oIGIvaW5jbHVkZS9saW51eC9tYXBs ZV90cmVlLmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLmZiNjg5 ZDYyOGNmNw0KLS0tIC9kZXYvbnVsbA0KKysrIGIvaW5jbHVkZS9saW51eC9tYXBsZV90cmVlLmgN CkBAIC0wLDAgKzEsNjg1IEBADQorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAr ICovDQorI2lmbmRlZiBfTElOVVhfTUFQTEVfVFJFRV9IDQorI2RlZmluZSBfTElOVVhfTUFQTEVf VFJFRV9IDQorLyoNCisgKiBNYXBsZSBUcmVlIC0gQW4gUkNVLXNhZmUgYWRhcHRpdmUgdHJlZSBm b3Igc3RvcmluZyByYW5nZXMNCisgKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMiBPcmFjbGUNCisg KiBBdXRob3JzOiAgICAgTGlhbSBSLiBIb3dsZXR0IDxMaWFtLkhvd2xldHRAT3JhY2xlLmNvbT4N CisgKiAgICAgICAgICAgICAgTWF0dGhldyBXaWxjb3ggPHdpbGx5QGluZnJhZGVhZC5vcmc+DQor ICovDQorDQorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPg0KKyNpbmNsdWRlIDxsaW51eC9yY3Vw ZGF0ZS5oPg0KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPg0KKy8qICNkZWZpbmUgQ09ORklH X01BUExFX1JDVV9ESVNBQkxFRCAqLw0KKy8qICNkZWZpbmUgQ09ORklHX0RFQlVHX01BUExFX1RS RUVfVkVSQk9TRSAqLw0KKw0KKy8qDQorICogQWxsb2NhdGVkIG5vZGVzIGFyZSBtdXRhYmxlIHVu dGlsIHRoZXkgaGF2ZSBiZWVuIGluc2VydGVkIGludG8gdGhlIHRyZWUsDQorICogYXQgd2hpY2gg dGltZSB0aGV5IGNhbm5vdCBjaGFuZ2UgdGhlaXIgdHlwZSB1bnRpbCB0aGV5IGhhdmUgYmVlbiBy ZW1vdmVkDQorICogZnJvbSB0aGUgdHJlZSBhbmQgYW4gUkNVIGdyYWNlIHBlcmlvZCBoYXMgcGFz c2VkLg0KKyAqDQorICogUmVtb3ZlZCBub2RlcyBoYXZlIHRoZWlyIC0+cGFyZW50IHNldCB0byBw b2ludCB0byB0aGVtc2VsdmVzLiAgUkNVIHJlYWRlcnMNCisgKiBjaGVjayAtPnBhcmVudCBiZWZv cmUgcmVseWluZyBvbiB0aGUgdmFsdWUgdGhhdCB0aGV5IGxvYWRlZCBmcm9tIHRoZQ0KKyAqIHNs b3RzIGFycmF5LiAgVGhpcyBsZXRzIHVzIHJldXNlIHRoZSBzbG90cyBhcnJheSBmb3IgdGhlIFJD VSBoZWFkLg0KKyAqDQorICogTm9kZXMgaW4gdGhlIHRyZWUgcG9pbnQgdG8gdGhlaXIgcGFyZW50 IHVubGVzcyBiaXQgMCBpcyBzZXQuDQorICovDQorI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKSB8 fCBkZWZpbmVkKEJVSUxEX1ZEU08zMl82NCkNCisvKiA2NGJpdCBzaXplcyAqLw0KKyNkZWZpbmUg TUFQTEVfTk9ERV9TTE9UUwkzMQkvKiAyNTYgYnl0ZXMgaW5jbHVkaW5nIC0+cGFyZW50ICovDQor I2RlZmluZSBNQVBMRV9SQU5HRTY0X1NMT1RTCTE2CS8qIDI1NiBieXRlcyAqLw0KKyNkZWZpbmUg TUFQTEVfQVJBTkdFNjRfU0xPVFMJMTAJLyogMjQwIGJ5dGVzICovDQorI2RlZmluZSBNQVBMRV9B UkFOR0U2NF9NRVRBX01BWAkxNQkvKiBPdXQgb2YgcmFuZ2UgZm9yIG1ldGFkYXRhICovDQorI2Rl ZmluZSBNQVBMRV9BTExPQ19TTE9UUwkoTUFQTEVfTk9ERV9TTE9UUyAtIDEpDQorI2Vsc2UNCisv KiAzMmJpdCBzaXplcyAqLw0KKyNkZWZpbmUgTUFQTEVfTk9ERV9TTE9UUwk2MwkvKiAyNTYgYnl0 ZXMgaW5jbHVkaW5nIC0+cGFyZW50ICovDQorI2RlZmluZSBNQVBMRV9SQU5HRTY0X1NMT1RTCTMy CS8qIDI1NiBieXRlcyAqLw0KKyNkZWZpbmUgTUFQTEVfQVJBTkdFNjRfU0xPVFMJMjEJLyogMjQw IGJ5dGVzICovDQorI2RlZmluZSBNQVBMRV9BUkFOR0U2NF9NRVRBX01BWAkyMgkvKiBPdXQgb2Yg cmFuZ2UgZm9yIG1ldGFkYXRhICovDQorI2RlZmluZSBNQVBMRV9BTExPQ19TTE9UUwkoTUFQTEVf Tk9ERV9TTE9UUyAtIDIpDQorI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHXzY0QklUKSB8fCBkZWZp bmVkKEJVSUxEX1ZEU08zMl82NCkgKi8NCisNCisjZGVmaW5lIE1BUExFX05PREVfTUFTSwkJMjU1 VUwNCisNCisvKg0KKyAqIFRoZSBub2RlLT5wYXJlbnQgb2YgdGhlIHJvb3Qgbm9kZSBoYXMgYml0 IDAgc2V0IGFuZCB0aGUgcmVzdCBvZiB0aGUgcG9pbnRlcg0KKyAqIGlzIGEgcG9pbnRlciB0byB0 aGUgdHJlZSBpdHNlbGYuICBObyBtb3JlIGJpdHMgYXJlIGF2YWlsYWJsZSBpbiB0aGlzIHBvaW50 ZXINCisgKiAob24gbTY4aywgdGhlIGRhdGEgc3RydWN0dXJlIG1heSBvbmx5IGJlIDItYnl0ZSBh bGlnbmVkKS4NCisgKg0KKyAqIEludGVybmFsIG5vbi1yb290IG5vZGVzIGNhbiBvbmx5IGhhdmUg bWFwbGVfcmFuZ2VfKiBub2RlcyBhcyBwYXJlbnRzLiAgVGhlDQorICogcGFyZW50IHBvaW50ZXIg aXMgMjU2QiBhbGlnbmVkIGxpa2UgYWxsIG90aGVyIHRyZWUgbm9kZXMuICBXaGVuIHN0b3Jpbmcg YSAzMg0KKyAqIG9yIDY0IGJpdCB2YWx1ZXMsIHRoZSBvZmZzZXQgY2FuIGZpdCBpbnRvIDQgYml0 cy4gIFRoZSAxNiBiaXQgdmFsdWVzIG5lZWQgYW4NCisgKiBleHRyYSBiaXQgdG8gc3RvcmUgdGhl IG9mZnNldC4gIFRoaXMgZXh0cmEgYml0IGNvbWVzIGZyb20gYSByZXVzZSBvZiB0aGUgbGFzdA0K KyAqIGJpdCBpbiB0aGUgbm9kZSB0eXBlLiAgVGhpcyBpcyBwb3NzaWJsZSBieSB1c2luZyBiaXQg MSB0byBpbmRpY2F0ZSBpZiBiaXQgMg0KKyAqIGlzIHBhcnQgb2YgdGhlIHR5cGUgb3IgdGhlIHNs b3QuDQorICoNCisgKiBPbmNlIHRoZSB0eXBlIGlzIGRlY2lkZWQsIHRoZSBkZWNpc2lvbiBvZiBh biBhbGxvY2F0aW9uIHJhbmdlIHR5cGUgb3IgYSByYW5nZQ0KKyAqIHR5cGUgaXMgZG9uZSBieSBl eGFtaW5pbmcgdGhlIGltbXV0YWJsZSB0cmVlIGZsYWcgZm9yIHRoZSBNQVBMRV9BTExPQ19SQU5H RQ0KKyAqIGZsYWcuDQorICoNCisgKiAgTm9kZSB0eXBlczoNCisgKiAgIDB4Pz8xID0gUm9vdA0K KyAqICAgMHg/MDAgPSAxNiBiaXQgbm9kZXMNCisgKiAgIDB4MDEwID0gMzIgYml0IG5vZGVzDQor ICogICAweDExMCA9IDY0IGJpdCBub2Rlcw0KKyAqDQorICogIFNsb3Qgc2l6ZSBhbmQgbG9jYXRp b24gaW4gdGhlIHBhcmVudCBwb2ludGVyOg0KKyAqICAgdHlwZSAgOiBzbG90IGxvY2F0aW9uDQor ICogICAweD8/MSA6IFJvb3QNCisgKiAgIDB4PzAwIDogMTYgYml0IHZhbHVlcywgdHlwZSBpbiAw LTEsIHNsb3QgaW4gMi02DQorICogICAweDAxMCA6IDMyIGJpdCB2YWx1ZXMsIHR5cGUgaW4gMC0y LCBzbG90IGluIDMtNg0KKyAqICAgMHgxMTAgOiA2NCBiaXQgdmFsdWVzLCB0eXBlIGluIDAtMiwg c2xvdCBpbiAzLTYNCisgKi8NCit0eXBlZGVmIHN0cnVjdCBtYXBsZV9lbm9kZSAqbWFwbGVfZW5v ZGU7IC8qIGVuY29kZWQgbm9kZSAqLw0KK3R5cGVkZWYgc3RydWN0IG1hcGxlX3Bub2RlICptYXBs ZV9wbm9kZTsgLyogcGFyZW50IG5vZGUgKi8NCisNCisvKg0KKyAqIFRoaXMgbWV0YWRhdGEgaXMg dXNlZCB0byBvcHRpbWl6ZSB0aGUgZ2FwIHVwZGF0aW5nIGNvZGUgYW5kIGluIHJldmVyc2UNCisg KiBzZWFyY2hpbmcgZm9yIGdhcHMgb3IgYW55IG90aGVyIGNvZGUgdGhhdCBuZWVkcyB0byBmaW5k IHRoZSBlbmQgb2YgdGhlIGRhdGEuDQorICovDQorc3RydWN0IG1hcGxlX21ldGFkYXRhIHsNCisJ dW5zaWduZWQgY2hhciBlbmQ7DQorCXVuc2lnbmVkIGNoYXIgZ2FwOw0KK307DQorDQorLyoNCisg KiBMZWFmIG5vZGVzIGRvIG5vdCBzdG9yZSBwb2ludGVycyB0byBub2RlcywgdGhleSBzdG9yZSB1 c2VyIGRhdGEuICBVc2VycyBtYXkNCisgKiBzdG9yZSBhbG1vc3QgYW55IGJpdCBwYXR0ZXJuLiAg QXMgbm90ZWQgYWJvdmUsIHRoZSBvcHRpbWlzYXRpb24gb2Ygc3RvcmluZyBhbg0KKyAqIGVudHJ5 IGF0IDAgaW4gdGhlIHJvb3QgcG9pbnRlciBjYW5ub3QgYmUgZG9uZSBmb3IgZGF0YSB3aGljaCBo YXZlIHRoZSBib3R0b20NCisgKiB0d28gYml0cyBzZXQgdG8gJzEwJy4gIFdlIGFsc28gcmVzZXJ2 ZSB2YWx1ZXMgd2l0aCB0aGUgYm90dG9tIHR3byBiaXRzIHNldCB0bw0KKyAqICcxMCcgd2hpY2gg YXJlIGJlbG93IDQwOTYgKGllIDIsIDYsIDEwIC4uIDQwOTQpIGZvciBpbnRlcm5hbCB1c2UuICBT b21lIEFQSXMNCisgKiByZXR1cm4gZXJybm9zIGFzIGEgbmVnYXRpdmUgZXJybm8gc2hpZnRlZCBy aWdodCBieSB0d28gYml0cyBhbmQgdGhlIGJvdHRvbQ0KKyAqIHR3byBiaXRzIHNldCB0byAnMTAn LCBhbmQgd2hpbGUgY2hvb3NpbmcgdG8gc3RvcmUgdGhlc2UgdmFsdWVzIGluIHRoZSBhcnJheQ0K KyAqIGlzIG5vdCBhbiBlcnJvciwgaXQgbWF5IGxlYWQgdG8gY29uZnVzaW9uIGlmIHlvdSdyZSB0 ZXN0aW5nIGZvciBhbiBlcnJvciB3aXRoDQorICogbWFzX2lzX2VycigpLg0KKyAqDQorICogTm9u LWxlYWYgbm9kZXMgc3RvcmUgdGhlIHR5cGUgb2YgdGhlIG5vZGUgcG9pbnRlZCB0byAoZW51bSBt YXBsZV90eXBlIGluIGJpdHMNCisgKiAzLTYpLCBiaXQgMiBpcyByZXNlcnZlZC4gIFRoYXQgbGVh dmVzIGJpdHMgMC0xIHVudXNlZCBmb3Igbm93Lg0KKyAqDQorICogSW4gcmVndWxhciBCLVRyZWUg dGVybXMsIHBpdm90cyBhcmUgY2FsbGVkIGtleXMuICBUaGUgdGVybSBwaXZvdCBpcyB1c2VkIHRv DQorICogaW5kaWNhdGUgdGhhdCB0aGUgdHJlZSBpcyBzcGVjaWZ5aW5nIHJhbmdlcywgIFBpdm90 cyBtYXkgYXBwZWFyIGluIHRoZQ0KKyAqIHN1YnRyZWUgd2l0aCBhbiBlbnRyeSBhdHRhY2hlZCB0 byB0aGUgdmFsdWUgd2hlcmVhcyBrZXlzIGFyZSB1bmlxdWUgdG8gYQ0KKyAqIHNwZWNpZmljIHBv c2l0aW9uIG9mIGEgQi10cmVlLiAgUGl2b3QgdmFsdWVzIGFyZSBpbmNsdXNpdmUgb2YgdGhlIHNs b3Qgd2l0aA0KKyAqIHRoZSBzYW1lIGluZGV4Lg0KKyAqLw0KKw0KK3N0cnVjdCBtYXBsZV9yYW5n ZV82NCB7DQorCXN0cnVjdCBtYXBsZV9wbm9kZSAqcGFyZW50Ow0KKwl1bnNpZ25lZCBsb25nIHBp dm90W01BUExFX1JBTkdFNjRfU0xPVFMgLSAxXTsNCisJdW5pb24gew0KKwkJdm9pZCBfX3JjdSAq c2xvdFtNQVBMRV9SQU5HRTY0X1NMT1RTXTsNCisJCXN0cnVjdCB7DQorCQkJdm9pZCBfX3JjdSAq cGFkW01BUExFX1JBTkdFNjRfU0xPVFMgLSAxXTsNCisJCQlzdHJ1Y3QgbWFwbGVfbWV0YWRhdGEg bWV0YTsNCisJCX07DQorCX07DQorfTsNCisNCisvKg0KKyAqIEF0IHRyZWUgY3JlYXRpb24gdGlt ZSwgdGhlIHVzZXIgY2FuIHNwZWNpZnkgdGhhdCB0aGV5J3JlIHdpbGxpbmcgdG8gdHJhZGUgb2Zm DQorICogc3RvcmluZyBmZXdlciBlbnRyaWVzIGluIGEgdHJlZSBpbiByZXR1cm4gZm9yIHN0b3Jp bmcgbW9yZSBpbmZvcm1hdGlvbiBpbg0KKyAqIGVhY2ggbm9kZS4NCisgKg0KKyAqIFRoZSBtYXBs ZSB0cmVlIHN1cHBvcnRzIHJlY29yZGluZyB0aGUgbGFyZ2VzdCByYW5nZSBvZiBOVUxMIGVudHJp ZXMgYXZhaWxhYmxlDQorICogaW4gdGhpcyBub2RlLCBhbHNvIGNhbGxlZCBnYXBzLiAgVGhpcyBv cHRpbWlzZXMgdGhlIHRyZWUgZm9yIGFsbG9jYXRpbmcgYQ0KKyAqIHJhbmdlLg0KKyAqLw0KK3N0 cnVjdCBtYXBsZV9hcmFuZ2VfNjQgew0KKwlzdHJ1Y3QgbWFwbGVfcG5vZGUgKnBhcmVudDsNCisJ dW5zaWduZWQgbG9uZyBwaXZvdFtNQVBMRV9BUkFOR0U2NF9TTE9UUyAtIDFdOw0KKwl2b2lkIF9f cmN1ICpzbG90W01BUExFX0FSQU5HRTY0X1NMT1RTXTsNCisJdW5zaWduZWQgbG9uZyBnYXBbTUFQ TEVfQVJBTkdFNjRfU0xPVFNdOw0KKwlzdHJ1Y3QgbWFwbGVfbWV0YWRhdGEgbWV0YTsNCit9Ow0K Kw0KK3N0cnVjdCBtYXBsZV9hbGxvYyB7DQorCXVuc2lnbmVkIGxvbmcgdG90YWw7DQorCXVuc2ln bmVkIGNoYXIgbm9kZV9jb3VudDsNCisJdW5zaWduZWQgaW50IHJlcXVlc3RfY291bnQ7DQorCXN0 cnVjdCBtYXBsZV9hbGxvYyAqc2xvdFtNQVBMRV9BTExPQ19TTE9UU107DQorfTsNCisNCitzdHJ1 Y3QgbWFwbGVfdG9waWFyeSB7DQorCXN0cnVjdCBtYXBsZV9wbm9kZSAqcGFyZW50Ow0KKwlzdHJ1 Y3QgbWFwbGVfZW5vZGUgKm5leHQ7IC8qIE92ZXJsYXBzIHRoZSBwaXZvdCAqLw0KK307DQorDQor ZW51bSBtYXBsZV90eXBlIHsNCisJbWFwbGVfZGVuc2UsDQorCW1hcGxlX2xlYWZfNjQsDQorCW1h cGxlX3JhbmdlXzY0LA0KKwltYXBsZV9hcmFuZ2VfNjQsDQorfTsNCisNCisNCisvKioNCisgKiBE T0M6IE1hcGxlIHRyZWUgZmxhZ3MNCisgKg0KKyAqICogTVRfRkxBR1NfQUxMT0NfUkFOR0UJLSBU cmFjayBnYXBzIGluIHRoaXMgdHJlZQ0KKyAqICogTVRfRkxBR1NfVVNFX1JDVQkJLSBPcGVyYXRl IGluIFJDVSBtb2RlDQorICogKiBNVF9GTEFHU19IRUlHSFRfT0ZGU0VUCS0gVGhlIHBvc2l0aW9u IG9mIHRoZSB0cmVlIGhlaWdodCBpbiB0aGUgZmxhZ3MNCisgKiAqIE1UX0ZMQUdTX0hFSUdIVF9N QVNLCS0gVGhlIG1hc2sgZm9yIHRoZSBtYXBsZSB0cmVlIGhlaWdodCB2YWx1ZQ0KKyAqICogTVRf RkxBR1NfTE9DS19NQVNLCQktIEhvdyB0aGUgbXRfbG9jayBpcyB1c2VkDQorICogKiBNVF9GTEFH U19MT0NLX0lSUQkJLSBBY3F1aXJlZCBpcnEtc2FmZQ0KKyAqICogTVRfRkxBR1NfTE9DS19CSAkJ LSBBY3F1aXJlZCBiaC1zYWZlDQorICogKiBNVF9GTEFHU19MT0NLX0VYVEVSTgktIG10X2xvY2sg aXMgbm90IHVzZWQNCisgKg0KKyAqIE1BUExFX0hFSUdIVF9NQVgJVGhlIGxhcmdlc3QgaGVpZ2h0 IHRoYXQgY2FuIGJlIHN0b3JlZA0KKyAqLw0KKyNkZWZpbmUgTVRfRkxBR1NfQUxMT0NfUkFOR0UJ MHgwMQ0KKyNkZWZpbmUgTVRfRkxBR1NfVVNFX1JDVQkweDAyDQorI2RlZmluZSBNVF9GTEFHU19I RUlHSFRfT0ZGU0VUCTB4MDINCisjZGVmaW5lIE1UX0ZMQUdTX0hFSUdIVF9NQVNLCTB4N0MNCisj ZGVmaW5lIE1UX0ZMQUdTX0xPQ0tfTUFTSwkweDMwMA0KKyNkZWZpbmUgTVRfRkxBR1NfTE9DS19J UlEJMHgxMDANCisjZGVmaW5lIE1UX0ZMQUdTX0xPQ0tfQkgJMHgyMDANCisjZGVmaW5lIE1UX0ZM QUdTX0xPQ0tfRVhURVJOCTB4MzAwDQorDQorI2RlZmluZSBNQVBMRV9IRUlHSFRfTUFYCTMxDQor DQorDQorI2RlZmluZSBNQVBMRV9OT0RFX1RZUEVfTUFTSwkweDBGDQorI2RlZmluZSBNQVBMRV9O T0RFX1RZUEVfU0hJRlQJMHgwMw0KKw0KKyNkZWZpbmUgTUFQTEVfUkVTRVJWRURfUkFOR0UJNDA5 Ng0KKw0KKyNpZmRlZiBDT05GSUdfTE9DS0RFUA0KK3R5cGVkZWYgc3RydWN0IGxvY2tkZXBfbWFw ICpsb2NrZGVwX21hcF9wOw0KKyNkZWZpbmUgbXRfbG9ja19pc19oZWxkKG10KQlsb2NrX2lzX2hl bGQobXQtPm1hX2V4dGVybmFsX2xvY2spDQorI2RlZmluZSBtdF9zZXRfZXh0ZXJuYWxfbG9jayht dCwgbG9jaykJCQkJCVwNCisJKG10KS0+bWFfZXh0ZXJuYWxfbG9jayA9ICYobG9jayktPmRlcF9t YXA7DQorI2Vsc2UNCit0eXBlZGVmIHN0cnVjdCB7IC8qIG5vdGhpbmcgKi8gfSBsb2NrZGVwX21h cF9wOw0KKyNkZWZpbmUgbXRfbG9ja19pc19oZWxkKG10KQkxDQorI2RlZmluZSBtdF9zZXRfZXh0 ZXJuYWxfbG9jayhtdCwgbG9jaykJZG8geyB9IHdoaWxlICgwKQ0KKyNlbmRpZg0KKw0KKy8qDQor ICogSWYgdGhlIHRyZWUgY29udGFpbnMgYSBzaW5nbGUgZW50cnkgYXQgaW5kZXggMCwgaXQgaXMg dXN1YWxseSBzdG9yZWQgaW4NCisgKiB0cmVlLT5tYV9yb290LiAgVG8gb3B0aW1pc2UgZm9yIHRo ZSBwYWdlIGNhY2hlLCBhbiBlbnRyeSB3aGljaCBlbmRzIGluICcwMCcsDQorICogJzAxJyBvciAn MTEnIGlzIHN0b3JlZCBpbiB0aGUgcm9vdCwgYnV0IGFuIGVudHJ5IHdoaWNoIGVuZHMgaW4gJzEw JyB3aWxsIGJlDQorICogc3RvcmVkIGluIGEgbm9kZS4gIEJpdHMgMy02IGFyZSB1c2VkIHRvIHN0 b3JlIGVudW0gbWFwbGVfdHlwZS4NCisgKg0KKyAqIFRoZSBmbGFncyBhcmUgdXNlZCBib3RoIHRv IHN0b3JlIHNvbWUgaW1tdXRhYmxlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdHJlZQ0KKyAqIChz ZXQgYXQgdHJlZSBjcmVhdGlvbiB0aW1lKSBhbmQgZHluYW1pYyBpbmZvcm1hdGlvbiBzZXQgdW5k ZXIgdGhlIHNwaW5sb2NrLg0KKyAqDQorICogQW5vdGhlciB1c2Ugb2YgZmxhZ3MgYXJlIHRvIGlu ZGljYXRlIGdsb2JhbCBzdGF0ZXMgb2YgdGhlIHRyZWUuICBUaGlzIGlzIHRoZQ0KKyAqIGNhc2Ug d2l0aCB0aGUgTUFQTEVfVVNFX1JDVSBmbGFnLCB3aGljaCBpbmRpY2F0ZXMgdGhlIHRyZWUgaXMg Y3VycmVudGx5IGluDQorICogUkNVIG1vZGUuICBUaGlzIG1vZGUgd2FzIGFkZGVkIHRvIGFsbG93 IHRoZSB0cmVlIHRvIHJldXNlIG5vZGVzIGluc3RlYWQgb2YNCisgKiByZS1hbGxvY2F0aW5nIGFu ZCBSQ1UgZnJlZWluZyBub2RlcyB3aGVuIHRoZXJlIGlzIGEgc2luZ2xlIHVzZXIuDQorICovDQor c3RydWN0IG1hcGxlX3RyZWUgew0KKwl1bmlvbiB7DQorCQlzcGlubG9ja190CW1hX2xvY2s7DQor CQlsb2NrZGVwX21hcF9wCW1hX2V4dGVybmFsX2xvY2s7DQorCX07DQorCXZvaWQgX19yY3UgICAg ICAqbWFfcm9vdDsNCisJdW5zaWduZWQgaW50CW1hX2ZsYWdzOw0KK307DQorDQorLyoqDQorICog TVRSRUVfSU5JVCgpIC0gSW5pdGlhbGl6ZSBhIG1hcGxlIHRyZWUNCisgKiBAbmFtZTogVGhlIG1h cGxlIHRyZWUgbmFtZQ0KKyAqIEBmbGFnczogVGhlIG1hcGxlIHRyZWUgZmxhZ3MNCisgKg0KKyAq Lw0KKyNkZWZpbmUgTVRSRUVfSU5JVChuYW1lLCBmbGFncykgewkJCQkJXA0KKwkubWFfbG9jayA9 IF9fU1BJTl9MT0NLX1VOTE9DS0VEKG5hbWUubWFfbG9jayksCQkJXA0KKwkubWFfZmxhZ3MgPSBm bGFncywJCQkJCQlcDQorCS5tYV9yb290ID0gTlVMTCwJCQkJCQlcDQorfQ0KKw0KKy8qKg0KKyAq IE1UUkVFX0lOSVRfRVhUKCkgLSBJbml0aWFsaXplIGEgbWFwbGUgdHJlZSB3aXRoIGFuIGV4dGVy bmFsIGxvY2suDQorICogQG5hbWU6IFRoZSB0cmVlIG5hbWUNCisgKiBAZmxhZ3M6IFRoZSBtYXBs ZSB0cmVlIGZsYWdzDQorICogQGxvY2s6IFRoZSBleHRlcm5hbCBsb2NrDQorICovDQorI2lmZGVm IENPTkZJR19MT0NLREVQDQorI2RlZmluZSBNVFJFRV9JTklUX0VYVChuYW1lLCBmbGFncywgbG9j aykgewkJCQlcDQorCS5tYV9leHRlcm5hbF9sb2NrID0gJihsb2NrKS5kZXBfbWFwLAkJCQlcDQor CS5tYV9mbGFncyA9IGZsYWdzLAkJCQkJCVwNCisJLm1hX3Jvb3QgPSBOVUxMLAkJCQkJCVwNCit9 DQorI2Vsc2UNCisjZGVmaW5lIE1UUkVFX0lOSVRfRVhUKG5hbWUsIGZsYWdzLCBsb2NrKQlNVFJF RV9JTklUKG5hbWUsIGZsYWdzKQ0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgREVGSU5FX01UUkVFKG5h bWUpCQkJCQkJXA0KKwlzdHJ1Y3QgbWFwbGVfdHJlZSBuYW1lID0gTVRSRUVfSU5JVChuYW1lLCAw KQ0KKw0KKyNkZWZpbmUgbXRyZWVfbG9jayhtdCkJCXNwaW5fbG9jaygoJihtdCktPm1hX2xvY2sp KQ0KKyNkZWZpbmUgbXRyZWVfdW5sb2NrKG10KQlzcGluX3VubG9jaygoJihtdCktPm1hX2xvY2sp KQ0KKw0KKy8qDQorICogVGhlIE1hcGxlIFRyZWUgc3F1ZWV6ZXMgdmFyaW91cyBiaXRzIGluIGF0 IHZhcmlvdXMgcG9pbnRzIHdoaWNoIGFyZW4ndA0KKyAqIG5lY2Vzc2FyaWx5IG9idmlvdXMuICBV c3VhbGx5LCB0aGlzIGlzIGRvbmUgYnkgb2JzZXJ2aW5nIHRoYXQgcG9pbnRlcnMgYXJlDQorICog Ti1ieXRlIGFsaWduZWQgYW5kIHRodXMgdGhlIGJvdHRvbSBsb2dfMihOKSBiaXRzIGFyZSBhdmFp bGFibGUgZm9yIHVzZS4gIFdlDQorICogZG9uJ3QgdXNlIHRoZSBoaWdoIGJpdHMgb2YgcG9pbnRl cnMgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBiZWNhdXNlDQorICogd2UgZG9uJ3Qg a25vdyB3aGF0IGJpdHMgYXJlIHVudXNlZCBvbiBhbnkgZ2l2ZW4gYXJjaGl0ZWN0dXJlLg0KKyAq DQorICogTm9kZXMgYXJlIDI1NiBieXRlcyBpbiBzaXplIGFuZCBhcmUgYWxzbyBhbGlnbmVkIHRv IDI1NiBieXRlcywgZ2l2aW5nIHVzIDgNCisgKiBsb3cgYml0cyBmb3Igb3VyIG93biBwdXJwb3Nl cy4gIE5vZGVzIGFyZSBjdXJyZW50bHkgb2YgNCB0eXBlczoNCisgKiAxLiBTaW5nbGUgcG9pbnRl ciAoUmFuZ2UgaXMgMC0wKQ0KKyAqIDIuIE5vbi1sZWFmIEFsbG9jYXRpb24gUmFuZ2Ugbm9kZXMN CisgKiAzLiBOb24tbGVhZiBSYW5nZSBub2Rlcw0KKyAqIDQuIExlYWYgUmFuZ2Ugbm9kZXMgQWxs IG5vZGVzIGNvbnNpc3Qgb2YgYSBudW1iZXIgb2Ygbm9kZSBzbG90cywNCisgKiAgICBwaXZvdHMs IGFuZCBhIHBhcmVudCBwb2ludGVyLg0KKyAqLw0KKw0KK3N0cnVjdCBtYXBsZV9ub2RlIHsNCisJ dW5pb24gew0KKwkJc3RydWN0IHsNCisJCQlzdHJ1Y3QgbWFwbGVfcG5vZGUgKnBhcmVudDsNCisJ CQl2b2lkIF9fcmN1ICpzbG90W01BUExFX05PREVfU0xPVFNdOw0KKwkJfTsNCisJCXN0cnVjdCB7 DQorCQkJdm9pZCAqcGFkOw0KKwkJCXN0cnVjdCByY3VfaGVhZCByY3U7DQorCQkJc3RydWN0IG1h cGxlX2Vub2RlICpwaXZfcGFyZW50Ow0KKwkJCXVuc2lnbmVkIGNoYXIgcGFyZW50X3Nsb3Q7DQor CQkJZW51bSBtYXBsZV90eXBlIHR5cGU7DQorCQkJdW5zaWduZWQgY2hhciBzbG90X2xlbjsNCisJ CQl1bnNpZ25lZCBpbnQgbWFfZmxhZ3M7DQorCQl9Ow0KKwkJc3RydWN0IG1hcGxlX3JhbmdlXzY0 IG1yNjQ7DQorCQlzdHJ1Y3QgbWFwbGVfYXJhbmdlXzY0IG1hNjQ7DQorCQlzdHJ1Y3QgbWFwbGVf YWxsb2MgYWxsb2M7DQorCX07DQorfTsNCisNCisvKg0KKyAqIE1vcmUgY29tcGxpY2F0ZWQgc3Rv cmVzIGNhbiBjYXVzZSB0d28gbm9kZXMgdG8gYmVjb21lIG9uZSBvciB0aHJlZSBhbmQNCisgKiBw b3RlbnRpYWxseSBhbHRlciB0aGUgaGVpZ2h0IG9mIHRoZSB0cmVlLiAgRWl0aGVyIGhhbGYgb2Yg dGhlIHRyZWUgbWF5IG5lZWQNCisgKiB0byBiZSByZWJhbGFuY2VkIGFnYWluc3QgdGhlIG90aGVy LiAgVGhlIG1hX3RvcGlhcnkgc3RydWN0IGlzIHVzZWQgdG8gdHJhY2sNCisgKiB3aGljaCBub2Rl cyBoYXZlIGJlZW4gJ2N1dCcgZnJvbSB0aGUgdHJlZSBzbyB0aGF0IHRoZSBjaGFuZ2UgY2FuIGJl IGRvbmUNCisgKiBzYWZlbHkgYXQgYSBsYXRlciBkYXRlLiAgVGhpcyBpcyBkb25lIHRvIHN1cHBv cnQgUkNVLg0KKyAqLw0KK3N0cnVjdCBtYV90b3BpYXJ5IHsNCisJc3RydWN0IG1hcGxlX2Vub2Rl ICpoZWFkOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnRhaWw7DQorCXN0cnVjdCBtYXBsZV90cmVl ICptdHJlZTsNCit9Ow0KKw0KK3ZvaWQgKm10cmVlX2xvYWQoc3RydWN0IG1hcGxlX3RyZWUgKm10 LCB1bnNpZ25lZCBsb25nIGluZGV4KTsNCisNCitpbnQgbXRyZWVfaW5zZXJ0KHN0cnVjdCBtYXBs ZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBpbmRleCwNCisJCXZvaWQgKmVudHJ5LCBnZnBfdCBn ZnApOw0KK2ludCBtdHJlZV9pbnNlcnRfcmFuZ2Uoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNp Z25lZCBsb25nIGZpcnN0LA0KKwkJdW5zaWduZWQgbG9uZyBsYXN0LCB2b2lkICplbnRyeSwgZ2Zw X3QgZ2ZwKTsNCitpbnQgbXRyZWVfYWxsb2NfcmFuZ2Uoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1 bnNpZ25lZCBsb25nICpzdGFydHAsDQorCQl2b2lkICplbnRyeSwgdW5zaWduZWQgbG9uZyBzaXpl LCB1bnNpZ25lZCBsb25nIG1pbiwNCisJCXVuc2lnbmVkIGxvbmcgbWF4LCBnZnBfdCBnZnApOw0K K2ludCBtdHJlZV9hbGxvY19ycmFuZ2Uoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBs b25nICpzdGFydHAsDQorCQl2b2lkICplbnRyeSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25l ZCBsb25nIG1pbiwNCisJCXVuc2lnbmVkIGxvbmcgbWF4LCBnZnBfdCBnZnApOw0KKw0KK2ludCBt dHJlZV9zdG9yZV9yYW5nZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgZmly c3QsDQorCQkgICAgICB1bnNpZ25lZCBsb25nIGxhc3QsIHZvaWQgKmVudHJ5LCBnZnBfdCBnZnAp Ow0KK2ludCBtdHJlZV9zdG9yZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcg aW5kZXgsDQorCQl2b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKTsNCit2b2lkICptdHJlZV9lcmFzZShz dHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgaW5kZXgpOw0KKw0KK3ZvaWQgbXRy ZWVfZGVzdHJveShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpOw0KK3ZvaWQgX19tdF9kZXN0cm95KHN0 cnVjdCBtYXBsZV90cmVlICptdCk7DQorDQorLyoqDQorICogbXRyZWVfZW1wdHkoKSAtIERldGVy bWluZSBpZiBhIHRyZWUgaGFzIGFueSBwcmVzZW50IGVudHJpZXMuDQorICogQG10OiBNYXBsZSBU cmVlLg0KKyAqDQorICogQ29udGV4dDogQW55IGNvbnRleHQuDQorICogUmV0dXJuOiAldHJ1ZSBp ZiB0aGUgdHJlZSBjb250YWlucyBvbmx5IE5VTEwgcG9pbnRlcnMuDQorICovDQorc3RhdGljIGlu bGluZSBib29sIG10cmVlX2VtcHR5KGNvbnN0IHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQor CXJldHVybiBtdC0+bWFfcm9vdCA9PSBOVUxMOw0KK30NCisNCisvKiBBZHZhbmNlZCBBUEkgKi8N CisNCisvKg0KKyAqIFRoZSBtYXBsZSBzdGF0ZSBpcyBkZWZpbmVkIGluIHRoZSBzdHJ1Y3QgbWFf c3RhdGUgYW5kIGlzIHVzZWQgdG8ga2VlcCB0cmFjaw0KKyAqIG9mIGluZm9ybWF0aW9uIGR1cmlu ZyBvcGVyYXRpb25zLCBhbmQgZXZlbiBiZXR3ZWVuIG9wZXJhdGlvbnMgd2hlbiB1c2luZyB0aGUN CisgKiBhZHZhbmNlZCBBUEkuDQorICoNCisgKiBJZiBzdGF0ZS0+bm9kZSBoYXMgYml0IDAgc2V0 IHRoZW4gaXQgcmVmZXJlbmNlcyBhIHRyZWUgbG9jYXRpb24gd2hpY2ggaXMgbm90DQorICogYSBu b2RlIChlZyB0aGUgcm9vdCkuICBJZiBiaXQgMSBpcyBzZXQsIHRoZSByZXN0IG9mIHRoZSBiaXRz IGFyZSBhIG5lZ2F0aXZlDQorICogZXJybm8uICBCaXQgMiAodGhlICd1bmFsbG9jYXRlZCBzbG90 cycgYml0KSBpcyBjbGVhci4gIEJpdHMgMy02IGluZGljYXRlIHRoZQ0KKyAqIG5vZGUgdHlwZS4N CisgKg0KKyAqIHN0YXRlLT5hbGxvYyBlaXRoZXIgaGFzIGEgcmVxdWVzdCBudW1iZXIgb2Ygbm9k ZXMgb3IgYW4gYWxsb2NhdGVkIG5vZGUuICBJZg0KKyAqIHN0YXQtPmFsbG9jIGhhcyBhIHJlcXVl c3RlZCBudW1iZXIgb2Ygbm9kZXMsIHRoZSBmaXJzdCBiaXQgd2lsbCBiZSBzZXQgKDB4MSkNCisg KiBhbmQgdGhlIHJlbWFpbmluZyBiaXRzIGFyZSB0aGUgdmFsdWUuICBJZiBzdGF0ZS0+YWxsb2Mg aXMgYSBub2RlLCB0aGVuIHRoZQ0KKyAqIG5vZGUgd2lsbCBiZSBvZiB0eXBlIG1hcGxlX2FsbG9j LiAgbWFwbGVfYWxsb2MgaGFzIE1BUExFX05PREVfU0xPVFMgLSAxIGZvcg0KKyAqIHN0b3Jpbmcg bW9yZSBhbGxvY2F0ZWQgbm9kZXMsIGEgdG90YWwgbnVtYmVyIG9mIG5vZGVzIGFsbG9jYXRlZCwg YW5kIHRoZQ0KKyAqIG5vZGVfY291bnQgaW4gdGhpcyBub2RlLiAgbm9kZV9jb3VudCBpcyB0aGUg bnVtYmVyIG9mIGFsbG9jYXRlZCBub2RlcyBpbiB0aGlzDQorICogbm9kZS4gIFRoZSBzY2FsaW5n IGJleW9uZCBNQVBMRV9OT0RFX1NMT1RTIC0gMSBpcyBoYW5kbGVkIGJ5IHN0b3JpbmcgZnVydGhl cg0KKyAqIG5vZGVzIGludG8gc3RhdGUtPmFsbG9jLT5zbG90WzBdJ3Mgbm9kZS4gIE5vZGVzIGFy ZSB0YWtlbiBmcm9tIHN0YXRlLT5hbGxvYw0KKyAqIGJ5IHJlbW92aW5nIGEgbm9kZSBmcm9tIHRo ZSBzdGF0ZS0+YWxsb2Mgbm9kZSB1bnRpbCBzdGF0ZS0+YWxsb2MtPm5vZGVfY291bnQNCisgKiBp cyAxLCB3aGVuIHN0YXRlLT5hbGxvYyBpcyByZXR1cm5lZCBhbmQgdGhlIHN0YXRlLT5hbGxvYy0+ c2xvdFswXSBpcyBwcm9tb3RlZA0KKyAqIHRvIHN0YXRlLT5hbGxvYy4gIE5vZGVzIGFyZSBwdXNo ZWQgb250byBzdGF0ZS0+YWxsb2MgYnkgcHV0dGluZyB0aGUgY3VycmVudA0KKyAqIHN0YXRlLT5h bGxvYyBpbnRvIHRoZSBwdXNoZWQgbm9kZSdzIHNsb3RbMF0uDQorICoNCisgKiBUaGUgc3RhdGUg YWxzbyBjb250YWlucyB0aGUgaW1wbGllZCBtaW4vbWF4IG9mIHRoZSBzdGF0ZS0+bm9kZSwgdGhl IGRlcHRoIG9mDQorICogdGhpcyBzZWFyY2gsIGFuZCB0aGUgb2Zmc2V0LiBUaGUgaW1wbGllZCBt aW4vbWF4IGFyZSBlaXRoZXIgZnJvbSB0aGUgcGFyZW50DQorICogbm9kZSBvciBhcmUgMC1vbyBm b3IgdGhlIHJvb3Qgbm9kZS4gIFRoZSBkZXB0aCBpcyBpbmNyZW1lbnRlZCBvciBkZWNyZW1lbnRl ZA0KKyAqIGV2ZXJ5IHRpbWUgYSBub2RlIGlzIHdhbGtlZCBkb3duIG9yIHVwLiAgVGhlIG9mZnNl dCBpcyB0aGUgc2xvdC9waXZvdCBvZg0KKyAqIGludGVyZXN0IGluIHRoZSBub2RlIC0gZWl0aGVy IGZvciByZWFkaW5nIG9yIHdyaXRpbmcuDQorICoNCisgKiBXaGVuIHJldHVybmluZyBhIHZhbHVl IHRoZSBtYXBsZSBzdGF0ZSBpbmRleCBhbmQgbGFzdCByZXNwZWN0aXZlbHkgY29udGFpbg0KKyAq IHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSByYW5nZSBmb3IgdGhlIGVudHJ5LiAgUmFuZ2VzIGFy ZSBpbmNsdXNpdmUgaW4gdGhlDQorICogTWFwbGUgVHJlZS4NCisgKi8NCitzdHJ1Y3QgbWFfc3Rh dGUgew0KKwlzdHJ1Y3QgbWFwbGVfdHJlZSAqdHJlZTsJLyogVGhlIHRyZWUgd2UncmUgb3BlcmF0 aW5nIGluICovDQorCXVuc2lnbmVkIGxvbmcgaW5kZXg7CQkvKiBUaGUgaW5kZXggd2UncmUgb3Bl cmF0aW5nIG9uIC0gcmFuZ2Ugc3RhcnQgKi8NCisJdW5zaWduZWQgbG9uZyBsYXN0OwkJLyogVGhl IGxhc3QgaW5kZXggd2UncmUgb3BlcmF0aW5nIG9uIC0gcmFuZ2UgZW5kICovDQorCXN0cnVjdCBt YXBsZV9lbm9kZSAqbm9kZTsJLyogVGhlIG5vZGUgY29udGFpbmluZyB0aGlzIGVudHJ5ICovDQor CXVuc2lnbmVkIGxvbmcgbWluOwkJLyogVGhlIG1pbmltdW0gaW5kZXggb2YgdGhpcyBub2RlIC0g aW1wbGllZCBwaXZvdCBtaW4gKi8NCisJdW5zaWduZWQgbG9uZyBtYXg7CQkvKiBUaGUgbWF4aW11 bSBpbmRleCBvZiB0aGlzIG5vZGUgLSBpbXBsaWVkIHBpdm90IG1heCAqLw0KKwlzdHJ1Y3QgbWFw bGVfYWxsb2MgKmFsbG9jOwkvKiBBbGxvY2F0ZWQgbm9kZXMgZm9yIHRoaXMgb3BlcmF0aW9uICov DQorCXVuc2lnbmVkIGNoYXIgZGVwdGg7CQkvKiBkZXB0aCBvZiB0cmVlIGRlc2NlbnQgZHVyaW5n IHdyaXRlICovDQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwl1bnNpZ25lZCBjaGFyIG1hc19m bGFnczsNCit9Ow0KKw0KK3N0cnVjdCBtYV93cl9zdGF0ZSB7DQorCXN0cnVjdCBtYV9zdGF0ZSAq bWFzOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsJLyogRGVjb2RlZCBtYXMtPm5vZGUgKi8N CisJdW5zaWduZWQgbG9uZyByX21pbjsJCS8qIHJhbmdlIG1pbiAqLw0KKwl1bnNpZ25lZCBsb25n IHJfbWF4OwkJLyogcmFuZ2UgbWF4ICovDQorCWVudW0gbWFwbGVfdHlwZSB0eXBlOwkJLyogbWFz LT5ub2RlIHR5cGUgKi8NCisJdW5zaWduZWQgY2hhciBvZmZzZXRfZW5kOwkvKiBUaGUgb2Zmc2V0 IHdoZXJlIHRoZSB3cml0ZSBlbmRzICovDQorCXVuc2lnbmVkIGNoYXIgbm9kZV9lbmQ7CQkvKiBt YXMtPm5vZGUgZW5kICovDQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsJCS8qIG1hcy0+bm9kZS0+ cGl2b3RzIHBvaW50ZXIgKi8NCisJdW5zaWduZWQgbG9uZyBlbmRfcGl2OwkJLyogVGhlIHBpdm90 IGF0IHRoZSBvZmZzZXQgZW5kICovDQorCXZvaWQgX19yY3UgKipzbG90czsJCS8qIG1hcy0+bm9k ZS0+c2xvdHMgcG9pbnRlciAqLw0KKwl2b2lkICplbnRyeTsJCQkvKiBUaGUgZW50cnkgdG8gd3Jp dGUgKi8NCisJdm9pZCAqY29udGVudDsJCQkvKiBUaGUgZXhpc3RpbmcgZW50cnkgdGhhdCBpcyBi ZWluZyBvdmVyd3JpdHRlbiAqLw0KK307DQorDQorI2RlZmluZSBtYXNfbG9jayhtYXMpICAgICAg ICAgICBzcGluX2xvY2soJigobWFzKS0+dHJlZS0+bWFfbG9jaykpDQorI2RlZmluZSBtYXNfdW5s b2NrKG1hcykgICAgICAgICBzcGluX3VubG9jaygmKChtYXMpLT50cmVlLT5tYV9sb2NrKSkNCisN CisNCisvKg0KKyAqIFNwZWNpYWwgdmFsdWVzIGZvciBtYV9zdGF0ZS5ub2RlLg0KKyAqIE1BU19T VEFSVCBtZWFucyB3ZSBoYXZlIG5vdCBzZWFyY2hlZCB0aGUgdHJlZS4NCisgKiBNQVNfUk9PVCBt ZWFucyB3ZSBoYXZlIHNlYXJjaGVkIHRoZSB0cmVlIGFuZCB0aGUgZW50cnkgd2UgZm91bmQgbGl2 ZXMgaW4NCisgKiB0aGUgcm9vdCBvZiB0aGUgdHJlZSAoaWUgaXQgaGFzIGluZGV4IDAsIGxlbmd0 aCAxIGFuZCBpcyB0aGUgb25seSBlbnRyeSBpbg0KKyAqIHRoZSB0cmVlKS4NCisgKiBNQVNfTk9O RSBtZWFucyB3ZSBoYXZlIHNlYXJjaGVkIHRoZSB0cmVlIGFuZCB0aGVyZSBpcyBubyBub2RlIGlu IHRoZQ0KKyAqIHRyZWUgZm9yIHRoaXMgZW50cnkuICBGb3IgZXhhbXBsZSwgd2Ugc2VhcmNoZWQg Zm9yIGluZGV4IDEgaW4gYW4gZW1wdHkNCisgKiB0cmVlLiAgT3Igd2UgaGF2ZSBhIHRyZWUgd2hp Y2ggcG9pbnRzIHRvIGEgZnVsbCBsZWFmIG5vZGUgYW5kIHdlDQorICogc2VhcmNoZWQgZm9yIGFu IGVudHJ5IHdoaWNoIGlzIGxhcmdlciB0aGFuIGNhbiBiZSBjb250YWluZWQgaW4gdGhhdA0KKyAq IGxlYWYgbm9kZS4NCisgKiBNQV9FUlJPUiByZXByZXNlbnRzIGFuIGVycm5vLiAgQWZ0ZXIgZHJv cHBpbmcgdGhlIGxvY2sgYW5kIGF0dGVtcHRpbmcNCisgKiB0byByZXNvbHZlIHRoZSBlcnJvciwg dGhlIHdhbGsgd291bGQgaGF2ZSB0byBiZSByZXN0YXJ0ZWQgZnJvbSB0aGUNCisgKiB0b3Agb2Yg dGhlIHRyZWUgYXMgdGhlIHRyZWUgbWF5IGhhdmUgYmVlbiBtb2RpZmllZC4NCisgKi8NCisjZGVm aW5lIE1BU19TVEFSVAkoKHN0cnVjdCBtYXBsZV9lbm9kZSAqKTFVTCkNCisjZGVmaW5lIE1BU19S T09UCSgoc3RydWN0IG1hcGxlX2Vub2RlICopNVVMKQ0KKyNkZWZpbmUgTUFTX05PTkUJKChzdHJ1 Y3QgbWFwbGVfZW5vZGUgKik5VUwpDQorI2RlZmluZSBNQVNfUEFVU0UJKChzdHJ1Y3QgbWFwbGVf ZW5vZGUgKikxN1VMKQ0KKyNkZWZpbmUgTUFfRVJST1IoZXJyKSBcDQorCQkoKHN0cnVjdCBtYXBs ZV9lbm9kZSAqKSgoKHVuc2lnbmVkIGxvbmcpZXJyIDw8IDIpIHwgMlVMKSkNCisNCisjZGVmaW5l IE1BX1NUQVRFKG5hbWUsIG10LCBmaXJzdCwgZW5kKQkJCQkJXA0KKwlzdHJ1Y3QgbWFfc3RhdGUg bmFtZSA9IHsJCQkJCVwNCisJCS50cmVlID0gbXQsCQkJCQkJXA0KKwkJLmluZGV4ID0gZmlyc3Qs CQkJCQkJXA0KKwkJLmxhc3QgPSBlbmQsCQkJCQkJXA0KKwkJLm5vZGUgPSBNQVNfU1RBUlQsCQkJ CQlcDQorCQkubWluID0gMCwJCQkJCQlcDQorCQkubWF4ID0gVUxPTkdfTUFYLAkJCQkJXA0KKwl9 DQorDQorI2RlZmluZSBNQV9XUl9TVEFURShuYW1lLCBtYV9zdGF0ZSwgd3JfZW50cnkpCQkJCVwN CisJc3RydWN0IG1hX3dyX3N0YXRlIG5hbWUgPSB7CQkJCQlcDQorCQkubWFzID0gbWFfc3RhdGUs CQkJCQlcDQorCQkuY29udGVudCA9IE5VTEwsCQkJCQlcDQorCQkuZW50cnkgPSB3cl9lbnRyeSwJ CQkJCVwNCisJfQ0KKw0KKyNkZWZpbmUgTUFfVE9QSUFSWShuYW1lLCB0cmVlKQkJCQkJCVwNCisJ c3RydWN0IG1hX3RvcGlhcnkgbmFtZSA9IHsJCQkJCVwNCisJCS5oZWFkID0gTlVMTCwJCQkJCQlc DQorCQkudGFpbCA9IE5VTEwsCQkJCQkJXA0KKwkJLm10cmVlID0gdHJlZSwJCQkJCQlcDQorCX0N CisNCit2b2lkICptYXNfd2FsayhzdHJ1Y3QgbWFfc3RhdGUgKm1hcyk7DQordm9pZCAqbWFzX3N0 b3JlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSk7DQordm9pZCAqbWFzX2VyYXNl KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKTsNCitpbnQgbWFzX3N0b3JlX2dmcChzdHJ1Y3QgbWFfc3Rh dGUgKm1hcywgdm9pZCAqZW50cnksIGdmcF90IGdmcCk7DQordm9pZCBtYXNfc3RvcmVfcHJlYWxs b2Moc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5KTsNCit2b2lkICptYXNfZmluZChz dHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtYXgpOw0KK3ZvaWQgKm1hc19maW5k X3JldihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtaW4pOw0KK2ludCBtYXNf cHJlYWxsb2NhdGUoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5LCBnZnBfdCBnZnAp Ow0KKw0KK2Jvb2wgbWFzX25vbWVtKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBnZnBfdCBnZnApOw0K K3ZvaWQgbWFzX3BhdXNlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKTsNCit2b2lkIG1hcGxlX3RyZWVf aW5pdCh2b2lkKTsNCit2b2lkIG1hc19kZXN0cm95KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKTsNCitp bnQgbWFzX2V4cGVjdGVkX2VudHJpZXMoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxv bmcgbnJfZW50cmllcyk7DQorDQordm9pZCAqbWFzX3ByZXYoc3RydWN0IG1hX3N0YXRlICptYXMs IHVuc2lnbmVkIGxvbmcgbWluKTsNCit2b2lkICptYXNfbmV4dChzdHJ1Y3QgbWFfc3RhdGUgKm1h cywgdW5zaWduZWQgbG9uZyBtYXgpOw0KKw0KK2ludCBtYXNfZW1wdHlfYXJlYShzdHJ1Y3QgbWFf c3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtaW4sIHVuc2lnbmVkIGxvbmcgbWF4LA0KKwkJICAg dW5zaWduZWQgbG9uZyBzaXplKTsNCisNCisvKiBDaGVja3MgaWYgYSBtYXMgaGFzIG5vdCBmb3Vu ZCBhbnl0aGluZyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfaXNfbm9uZShzdHJ1Y3QgbWFf c3RhdGUgKm1hcykNCit7DQorCXJldHVybiBtYXMtPm5vZGUgPT0gTUFTX05PTkU7DQorfQ0KKw0K Ky8qIENoZWNrcyBpZiBhIG1hcyBoYXMgYmVlbiBwYXVzZWQgKi8NCitzdGF0aWMgaW5saW5lIGJv b2wgbWFzX2lzX3BhdXNlZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXJldHVybiBtYXMt Pm5vZGUgPT0gTUFTX1BBVVNFOw0KK30NCisNCit2b2lkIG1hc19kdXBfdHJlZShzdHJ1Y3QgbWFf c3RhdGUgKm9sZG1hcywgc3RydWN0IG1hX3N0YXRlICptYXMpOw0KK3ZvaWQgbWFzX2R1cF9zdG9y ZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50cnkpOw0KKw0KKy8qDQorICogVGhpcyBm aW5kcyBhbiBlbXB0eSBhcmVhIGZyb20gdGhlIGhpZ2hlc3QgYWRkcmVzcyB0byB0aGUgbG93ZXN0 Lg0KKyAqIEFLQSAiVG9wZG93biIgdmVyc2lvbiwNCisgKi8NCitpbnQgbWFzX2VtcHR5X2FyZWFf cmV2KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbiwNCisJCSAgICAgICB1 bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgbG9uZyBzaXplKTsNCisvKioNCisgKiBtYXNfcmVz ZXQoKSAtIFJlc2V0IGEgTWFwbGUgVHJlZSBvcGVyYXRpb24gc3RhdGUuDQorICogQG1hczogTWFw bGUgVHJlZSBvcGVyYXRpb24gc3RhdGUuDQorICoNCisgKiBSZXNldHMgdGhlIGVycm9yIG9yIHdh bGsgc3RhdGUgb2YgdGhlIEBtYXMgc28gZnV0dXJlIHdhbGtzIG9mIHRoZQ0KKyAqIGFycmF5IHdp bGwgc3RhcnQgZnJvbSB0aGUgcm9vdC4gIFVzZSB0aGlzIGlmIHlvdSBoYXZlIGRyb3BwZWQgdGhl DQorICogbG9jayBhbmQgd2FudCB0byByZXVzZSB0aGUgbWFfc3RhdGUuDQorICoNCisgKiBDb250 ZXh0OiBBbnkgY29udGV4dC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3Jlc2V0KHN0 cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJbWFzLT5ub2RlID0gTUFTX1NUQVJUOw0KK30NCisN CisvKioNCisgKiBtYXNfZm9yX2VhY2goKSAtIEl0ZXJhdGUgb3ZlciBhIHJhbmdlIG9mIHRoZSBt YXBsZSB0cmVlLg0KKyAqIEBtYXM6IE1hcGxlIFRyZWUgb3BlcmF0aW9uIHN0YXRlIChtYXBsZV9z dGF0ZSkNCisgKiBAZW50cnk6IEVudHJ5IHJldHJpZXZlZCBmcm9tIHRoZSB0cmVlDQorICogQG1h eDogbWF4aW11bSBpbmRleCB0byByZXRyaWV2ZSBmcm9tIHRoZSB0cmVlDQorICoNCisgKiBXaGVu IHJldHVybmVkLCBtYXMtPmluZGV4IGFuZCBtYXMtPmxhc3Qgd2lsbCBob2xkIHRoZSBlbnRpcmUg cmFuZ2UgZm9yIHRoZQ0KKyAqIGVudHJ5Lg0KKyAqDQorICogTm90ZTogbWF5IHJldHVybiB0aGUg emVybyBlbnRyeS4NCisgKg0KKyAqLw0KKyNkZWZpbmUgbWFzX2Zvcl9lYWNoKG1hcywgZW50cnks IG1heCkgXA0KKwl3aGlsZSAoKChlbnRyeSkgPSBtYXNfZmluZCgobWFzKSwgKG1heCkpKSAhPSBO VUxMKQ0KKw0KKw0KKy8qKg0KKyAqIG1hc19zZXRfcmFuZ2UoKSAtIFNldCB1cCBNYXBsZSBUcmVl IG9wZXJhdGlvbiBzdGF0ZSBmb3IgYSBkaWZmZXJlbnQgaW5kZXguDQorICogQG1hczogTWFwbGUg VHJlZSBvcGVyYXRpb24gc3RhdGUuDQorICogQHN0YXJ0OiBOZXcgc3RhcnQgb2YgcmFuZ2UgaW4g dGhlIE1hcGxlIFRyZWUuDQorICogQGxhc3Q6IE5ldyBlbmQgb2YgcmFuZ2UgaW4gdGhlIE1hcGxl IFRyZWUuDQorICoNCisgKiBNb3ZlIHRoZSBvcGVyYXRpb24gc3RhdGUgdG8gcmVmZXIgdG8gYSBk aWZmZXJlbnQgcmFuZ2UuICBUaGlzIHdpbGwNCisgKiBoYXZlIHRoZSBlZmZlY3Qgb2Ygc3RhcnRp bmcgYSB3YWxrIGZyb20gdGhlIHRvcDsgc2VlIG1hc19uZXh0KCkNCisgKiB0byBtb3ZlIHRvIGFu IGFkamFjZW50IGluZGV4Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUNCit2b2lkIG1hc19zZXRfcmFu Z2Uoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxv bmcgbGFzdCkNCit7DQorCSAgICAgICBtYXMtPmluZGV4ID0gc3RhcnQ7DQorCSAgICAgICBtYXMt Pmxhc3QgPSBsYXN0Ow0KKwkgICAgICAgbWFzLT5ub2RlID0gTUFTX1NUQVJUOw0KK30NCisNCisv KioNCisgKiBtYXNfc2V0KCkgLSBTZXQgdXAgTWFwbGUgVHJlZSBvcGVyYXRpb24gc3RhdGUgZm9y IGEgZGlmZmVyZW50IGluZGV4Lg0KKyAqIEBtYXM6IE1hcGxlIFRyZWUgb3BlcmF0aW9uIHN0YXRl Lg0KKyAqIEBpbmRleDogTmV3IGluZGV4IGludG8gdGhlIE1hcGxlIFRyZWUuDQorICoNCisgKiBN b3ZlIHRoZSBvcGVyYXRpb24gc3RhdGUgdG8gcmVmZXIgdG8gYSBkaWZmZXJlbnQgaW5kZXguICBU aGlzIHdpbGwNCisgKiBoYXZlIHRoZSBlZmZlY3Qgb2Ygc3RhcnRpbmcgYSB3YWxrIGZyb20gdGhl IHRvcDsgc2VlIG1hc19uZXh0KCkNCisgKiB0byBtb3ZlIHRvIGFuIGFkamFjZW50IGluZGV4Lg0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfc2V0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1 bnNpZ25lZCBsb25nIGluZGV4KQ0KK3sNCisNCisJbWFzX3NldF9yYW5nZShtYXMsIGluZGV4LCBp bmRleCk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtdF9leHRlcm5hbF9sb2NrKGNvbnN0 IHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCXJldHVybiAobXQtPm1hX2ZsYWdzICYgTVRf RkxBR1NfTE9DS19NQVNLKSA9PSBNVF9GTEFHU19MT0NLX0VYVEVSTjsNCit9DQorDQorLyoqDQor ICogbXRfaW5pdF9mbGFncygpIC0gSW5pdGlhbGlzZSBhbiBlbXB0eSBtYXBsZSB0cmVlIHdpdGgg ZmxhZ3MuDQorICogQG10OiBNYXBsZSBUcmVlDQorICogQGZsYWdzOiBtYXBsZSB0cmVlIGZsYWdz Lg0KKyAqDQorICogSWYgeW91IG5lZWQgdG8gaW5pdGlhbGlzZSBhIE1hcGxlIFRyZWUgd2l0aCBz cGVjaWFsIGZsYWdzIChlZywgYW4NCisgKiBhbGxvY2F0aW9uIHRyZWUpLCB1c2UgdGhpcyBmdW5j dGlvbi4NCisgKg0KKyAqIENvbnRleHQ6IEFueSBjb250ZXh0Lg0KKyAqLw0KK3N0YXRpYyBpbmxp bmUgdm9pZCBtdF9pbml0X2ZsYWdzKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgaW50 IGZsYWdzKQ0KK3sNCisJbXQtPm1hX2ZsYWdzID0gZmxhZ3M7DQorCWlmICghbXRfZXh0ZXJuYWxf bG9jayhtdCkpDQorCQlzcGluX2xvY2tfaW5pdCgmbXQtPm1hX2xvY2spOw0KKwlyY3VfYXNzaWdu X3BvaW50ZXIobXQtPm1hX3Jvb3QsIE5VTEwpOw0KK30NCisNCisvKioNCisgKiBtdF9pbml0KCkg LSBJbml0aWFsaXNlIGFuIGVtcHR5IG1hcGxlIHRyZWUuDQorICogQG10OiBNYXBsZSBUcmVlDQor ICoNCisgKiBBbiBlbXB0eSBNYXBsZSBUcmVlLg0KKyAqDQorICogQ29udGV4dDogQW55IGNvbnRl eHQuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG10X2luaXQoc3RydWN0IG1hcGxlX3RyZWUg Km10KQ0KK3sNCisJbXRfaW5pdF9mbGFncyhtdCwgMCk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUg Ym9vbCBtdF9pbl9yY3Uoc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisjaWZkZWYgQ09ORklH X01BUExFX1JDVV9ESVNBQkxFRA0KKwlyZXR1cm4gZmFsc2U7DQorI2VuZGlmDQorCXJldHVybiBt dC0+bWFfZmxhZ3MgJiBNVF9GTEFHU19VU0VfUkNVOw0KK30NCisNCisvKioNCisgKiBtdF9jbGVh cl9pbl9yY3UoKSAtIFN3aXRjaCB0aGUgdHJlZSB0byBub24tUkNVIG1vZGUuDQorICogQG10OiBU aGUgTWFwbGUgVHJlZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtdF9jbGVhcl9pbl9yY3Uo c3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJaWYgKCFtdF9pbl9yY3UobXQpKQ0KKwkJcmV0 dXJuOw0KKw0KKwlpZiAobXRfZXh0ZXJuYWxfbG9jayhtdCkpIHsNCisJCUJVR19PTighbXRfbG9j a19pc19oZWxkKG10KSk7DQorCQltdC0+bWFfZmxhZ3MgJj0gfk1UX0ZMQUdTX1VTRV9SQ1U7DQor CX0gZWxzZSB7DQorCQltdHJlZV9sb2NrKG10KTsNCisJCW10LT5tYV9mbGFncyAmPSB+TVRfRkxB R1NfVVNFX1JDVTsNCisJCW10cmVlX3VubG9jayhtdCk7DQorCX0NCit9DQorDQorLyoqDQorICog bXRfc2V0X2luX3JjdSgpIC0gU3dpdGNoIHRoZSB0cmVlIHRvIFJDVSBzYWZlIG1vZGUuDQorICog QG10OiBUaGUgTWFwbGUgVHJlZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtdF9zZXRfaW5f cmN1KHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCWlmIChtdF9pbl9yY3UobXQpKQ0KKwkJ cmV0dXJuOw0KKw0KKwlpZiAobXRfZXh0ZXJuYWxfbG9jayhtdCkpIHsNCisJCUJVR19PTighbXRf bG9ja19pc19oZWxkKG10KSk7DQorCQltdC0+bWFfZmxhZ3MgfD0gTVRfRkxBR1NfVVNFX1JDVTsN CisJfSBlbHNlIHsNCisJCW10cmVlX2xvY2sobXQpOw0KKwkJbXQtPm1hX2ZsYWdzIHw9IE1UX0ZM QUdTX1VTRV9SQ1U7DQorCQltdHJlZV91bmxvY2sobXQpOw0KKwl9DQorfQ0KKw0KK3ZvaWQgKm10 X2ZpbmQoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nICppbmRleCwgdW5zaWdu ZWQgbG9uZyBtYXgpOw0KK3ZvaWQgKm10X2ZpbmRfYWZ0ZXIoc3RydWN0IG1hcGxlX3RyZWUgKm10 LCB1bnNpZ25lZCBsb25nICppbmRleCwNCisJCSAgICB1bnNpZ25lZCBsb25nIG1heCk7DQordm9p ZCAqbXRfcHJldihzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgaW5kZXgsICB1 bnNpZ25lZCBsb25nIG1pbik7DQordm9pZCAqbXRfbmV4dChzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQs IHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgbWF4KTsNCisNCisvKioNCisgKiBt dF9mb3JfZWFjaCAtIEl0ZXJhdGUgb3ZlciBlYWNoIGVudHJ5IHN0YXJ0aW5nIGF0IGluZGV4IHVu dGlsIG1heC4NCisgKiBAdHJlZTogVGhlIE1hcGxlIFRyZWUNCisgKiBAZW50cnk6IFRoZSBjdXJy ZW50IGVudHJ5DQorICogQGluZGV4OiBUaGUgaW5kZXggdG8gdXBkYXRlIHRvIHRyYWNrIHRoZSBs b2NhdGlvbiBpbiB0aGUgdHJlZQ0KKyAqIEBtYXg6IFRoZSBtYXhpbXVtIGxpbWl0IGZvciBAaW5k ZXgNCisgKg0KKyAqIE5vdGU6IFdpbGwgbm90IHJldHVybiB0aGUgemVybyBlbnRyeS4NCisgKi8N CisjZGVmaW5lIG10X2Zvcl9lYWNoKHRyZWUsIGVudHJ5LCBpbmRleCwgbWF4KSBcDQorCWZvciAo ZW50cnkgPSBtdF9maW5kKHRyZWUsICYoaW5kZXgpLCBtYXgpOyBcDQorCQllbnRyeTsgZW50cnkg PSBtdF9maW5kX2FmdGVyKHRyZWUsICYoaW5kZXgpLCBtYXgpKQ0KKw0KKw0KKyNpZmRlZiBDT05G SUdfREVCVUdfTUFQTEVfVFJFRQ0KK2V4dGVybiBhdG9taWNfdCBtYXBsZV90cmVlX3Rlc3RzX3J1 bjsNCitleHRlcm4gYXRvbWljX3QgbWFwbGVfdHJlZV90ZXN0c19wYXNzZWQ7DQorDQordm9pZCBt dF9kdW1wKGNvbnN0IHN0cnVjdCBtYXBsZV90cmVlICptdCk7DQordm9pZCBtdF92YWxpZGF0ZShz dHJ1Y3QgbWFwbGVfdHJlZSAqbXQpOw0KKyNkZWZpbmUgTVRfQlVHX09OKHRyZWUsIHgpIGRvIHsJ CQkJCQlcDQorCWF0b21pY19pbmMoJm1hcGxlX3RyZWVfdGVzdHNfcnVuKTsJCQkJXA0KKwlpZiAo eCkgewkJCQkJCQlcDQorCQlwcl9pbmZvKCJCVUcgYXQgJXM6JWQgKCV1KVxuIiwJCQkJXA0KKwkJ X19mdW5jX18sIF9fTElORV9fLCB4KTsJCQkJCVwNCisJCW10X2R1bXAodHJlZSk7CQkJCQkJXA0K KwkJcHJfaW5mbygiUGFzczogJXUgUnVuOiV1XG4iLAkJCQlcDQorCQkJYXRvbWljX3JlYWQoJm1h cGxlX3RyZWVfdGVzdHNfcGFzc2VkKSwJCVwNCisJCQlhdG9taWNfcmVhZCgmbWFwbGVfdHJlZV90 ZXN0c19ydW4pKTsJCVwNCisJCWR1bXBfc3RhY2soKTsJCQkJCQlcDQorCX0gZWxzZSB7CQkJCQkJ CVwNCisJCWF0b21pY19pbmMoJm1hcGxlX3RyZWVfdGVzdHNfcGFzc2VkKTsJCQlcDQorCX0JCQkJ CQkJCVwNCit9IHdoaWxlICgwKQ0KKyNlbHNlDQorI2RlZmluZSBNVF9CVUdfT04odHJlZSwgeCkg QlVHX09OKHgpDQorI2VuZGlmIC8qIENPTkZJR19ERUJVR19NQVBMRV9UUkVFICovDQorDQorI2Vu ZGlmIC8qX0xJTlVYX01BUExFX1RSRUVfSCAqLw0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2Uv ZXZlbnRzL21hcGxlX3RyZWUuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL21hcGxlX3RyZWUuaA0K bmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAwMDAwMC4uZmJkMTU4MzlmOWFhDQot LS0gL2Rldi9udWxsDQorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9tYXBsZV90cmVlLmgNCkBA IC0wLDAgKzEsMTIzIEBADQorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8N CisjdW5kZWYgVFJBQ0VfU1lTVEVNDQorI2RlZmluZSBUUkFDRV9TWVNURU0gbWFwbGVfdHJlZQ0K Kw0KKyNpZiAhZGVmaW5lZChfVFJBQ0VfTU1fSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVM VElfUkVBRCkNCisjZGVmaW5lIF9UUkFDRV9NTV9IDQorDQorDQorI2luY2x1ZGUgPGxpbnV4L3Ry YWNlcG9pbnQuaD4NCisNCitzdHJ1Y3QgbWFfc3RhdGU7DQorDQorVFJBQ0VfRVZFTlQobWFfb3As DQorDQorCVRQX1BST1RPKGNvbnN0IGNoYXIgKmZuLCBzdHJ1Y3QgbWFfc3RhdGUgKm1hcyksDQor DQorCVRQX0FSR1MoZm4sIG1hcyksDQorDQorCVRQX1NUUlVDVF9fZW50cnkoDQorCQkJX19maWVs ZChjb25zdCBjaGFyICosIGZuKQ0KKwkJCV9fZmllbGQodW5zaWduZWQgbG9uZywgbWluKQ0KKwkJ CV9fZmllbGQodW5zaWduZWQgbG9uZywgbWF4KQ0KKwkJCV9fZmllbGQodW5zaWduZWQgbG9uZywg aW5kZXgpDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBsYXN0KQ0KKwkJCV9fZmllbGQodm9p ZCAqLCBub2RlKQ0KKwkpLA0KKw0KKwlUUF9mYXN0X2Fzc2lnbigNCisJCQlfX2VudHJ5LT5mbgkJ PSBmbjsNCisJCQlfX2VudHJ5LT5taW4JCT0gbWFzLT5taW47DQorCQkJX19lbnRyeS0+bWF4CQk9 IG1hcy0+bWF4Ow0KKwkJCV9fZW50cnktPmluZGV4CQk9IG1hcy0+aW5kZXg7DQorCQkJX19lbnRy eS0+bGFzdAkJPSBtYXMtPmxhc3Q7DQorCQkJX19lbnRyeS0+bm9kZQkJPSBtYXMtPm5vZGU7DQor CSksDQorDQorCVRQX3ByaW50aygiJXNcdE5vZGU6ICVweCAoJWx1ICVsdSkgcmFuZ2U6ICVsdS0l bHUiLA0KKwkJICBfX2VudHJ5LT5mbiwNCisJCSAgKHZvaWQgKikgX19lbnRyeS0+bm9kZSwNCisJ CSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPm1pbiwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9f ZW50cnktPm1heCwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmluZGV4LA0KKwkJICAo dW5zaWduZWQgbG9uZykgX19lbnRyeS0+bGFzdA0KKwkpDQorKQ0KK1RSQUNFX0VWRU5UKG1hX3Jl YWQsDQorDQorCVRQX1BST1RPKGNvbnN0IGNoYXIgKmZuLCBzdHJ1Y3QgbWFfc3RhdGUgKm1hcyks DQorDQorCVRQX0FSR1MoZm4sIG1hcyksDQorDQorCVRQX1NUUlVDVF9fZW50cnkoDQorCQkJX19m aWVsZChjb25zdCBjaGFyICosIGZuKQ0KKwkJCV9fZmllbGQodW5zaWduZWQgbG9uZywgbWluKQ0K KwkJCV9fZmllbGQodW5zaWduZWQgbG9uZywgbWF4KQ0KKwkJCV9fZmllbGQodW5zaWduZWQgbG9u ZywgaW5kZXgpDQorCQkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBsYXN0KQ0KKwkJCV9fZmllbGQo dm9pZCAqLCBub2RlKQ0KKwkpLA0KKw0KKwlUUF9mYXN0X2Fzc2lnbigNCisJCQlfX2VudHJ5LT5m bgkJPSBmbjsNCisJCQlfX2VudHJ5LT5taW4JCT0gbWFzLT5taW47DQorCQkJX19lbnRyeS0+bWF4 CQk9IG1hcy0+bWF4Ow0KKwkJCV9fZW50cnktPmluZGV4CQk9IG1hcy0+aW5kZXg7DQorCQkJX19l bnRyeS0+bGFzdAkJPSBtYXMtPmxhc3Q7DQorCQkJX19lbnRyeS0+bm9kZQkJPSBtYXMtPm5vZGU7 DQorCSksDQorDQorCVRQX3ByaW50aygiJXNcdE5vZGU6ICVweCAoJWx1ICVsdSkgcmFuZ2U6ICVs dS0lbHUiLA0KKwkJICBfX2VudHJ5LT5mbiwNCisJCSAgKHZvaWQgKikgX19lbnRyeS0+bm9kZSwN CisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPm1pbiwNCisJCSAgKHVuc2lnbmVkIGxvbmcp IF9fZW50cnktPm1heCwNCisJCSAgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmluZGV4LA0KKwkJ ICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+bGFzdA0KKwkpDQorKQ0KKw0KK1RSQUNFX0VWRU5U KG1hX3dyaXRlLA0KKw0KKwlUUF9QUk9UTyhjb25zdCBjaGFyICpmbiwgc3RydWN0IG1hX3N0YXRl ICptYXMsIHVuc2lnbmVkIGxvbmcgcGl2LA0KKwkJIHZvaWQgKnZhbCksDQorDQorCVRQX0FSR1Mo Zm4sIG1hcywgcGl2LCB2YWwpLA0KKw0KKwlUUF9TVFJVQ1RfX2VudHJ5KA0KKwkJCV9fZmllbGQo Y29uc3QgY2hhciAqLCBmbikNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIG1pbikNCisJCQlf X2ZpZWxkKHVuc2lnbmVkIGxvbmcsIG1heCkNCisJCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIGlu ZGV4KQ0KKwkJCV9fZmllbGQodW5zaWduZWQgbG9uZywgbGFzdCkNCisJCQlfX2ZpZWxkKHVuc2ln bmVkIGxvbmcsIHBpdikNCisJCQlfX2ZpZWxkKHZvaWQgKiwgdmFsKQ0KKwkJCV9fZmllbGQodm9p ZCAqLCBub2RlKQ0KKwkpLA0KKw0KKwlUUF9mYXN0X2Fzc2lnbigNCisJCQlfX2VudHJ5LT5mbgkJ PSBmbjsNCisJCQlfX2VudHJ5LT5taW4JCT0gbWFzLT5taW47DQorCQkJX19lbnRyeS0+bWF4CQk9 IG1hcy0+bWF4Ow0KKwkJCV9fZW50cnktPmluZGV4CQk9IG1hcy0+aW5kZXg7DQorCQkJX19lbnRy eS0+bGFzdAkJPSBtYXMtPmxhc3Q7DQorCQkJX19lbnRyeS0+cGl2CQk9IHBpdjsNCisJCQlfX2Vu dHJ5LT52YWwJCT0gdmFsOw0KKwkJCV9fZW50cnktPm5vZGUJCT0gbWFzLT5ub2RlOw0KKwkpLA0K Kw0KKwlUUF9wcmludGsoIiVzXHROb2RlICVweCAoJWx1ICVsdSkgcmFuZ2U6JWx1LSVsdSBwaXYg KCVsdSkgdmFsICVweCIsDQorCQkgIF9fZW50cnktPmZuLA0KKwkJICAodm9pZCAqKSBfX2VudHJ5 LT5ub2RlLA0KKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+bWluLA0KKwkJICAodW5zaWdu ZWQgbG9uZykgX19lbnRyeS0+bWF4LA0KKwkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5k ZXgsDQorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5sYXN0LA0KKwkJICAodW5zaWduZWQg bG9uZykgX19lbnRyeS0+cGl2LA0KKwkJICAodm9pZCAqKSBfX2VudHJ5LT52YWwNCisJKQ0KKykN CisjZW5kaWYgLyogX1RSQUNFX01NX0ggKi8NCisNCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRz aWRlIHByb3RlY3Rpb24gKi8NCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+DQpkaWZm IC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYw0KaW5kZXggOTgxODJjM2MyYzRiLi4y NTQxYTZlOWZhNDEgMTAwNjQ0DQotLS0gYS9pbml0L21haW4uYw0KKysrIGIvaW5pdC9tYWluLmMN CkBAIC0xMTYsNiArMTE2LDcgQEAgc3RhdGljIGludCBrZXJuZWxfaW5pdCh2b2lkICopOw0KIA0K IGV4dGVybiB2b2lkIGluaXRfSVJRKHZvaWQpOw0KIGV4dGVybiB2b2lkIHJhZGl4X3RyZWVfaW5p dCh2b2lkKTsNCitleHRlcm4gdm9pZCBtYXBsZV90cmVlX2luaXQodm9pZCk7DQogDQogLyoNCiAg KiBEZWJ1ZyBoZWxwZXI6IHZpYSB0aGlzIGZsYWcgd2Uga25vdyB0aGF0IHdlIGFyZSBpbiAnZWFy bHkgYm9vdHVwIGNvZGUnDQpAQCAtMTAwMSw2ICsxMDAyLDcgQEAgYXNtbGlua2FnZSBfX3Zpc2li bGUgdm9pZCBfX2luaXQgX19ub19zYW5pdGl6ZV9hZGRyZXNzIHN0YXJ0X2tlcm5lbCh2b2lkKQ0K IAkJICJJbnRlcnJ1cHRzIHdlcmUgZW5hYmxlZCAqdmVyeSogZWFybHksIGZpeGluZyBpdFxuIikp DQogCQlsb2NhbF9pcnFfZGlzYWJsZSgpOw0KIAlyYWRpeF90cmVlX2luaXQoKTsNCisJbWFwbGVf dHJlZV9pbml0KCk7DQogDQogCS8qDQogCSAqIFNldCB1cCBob3VzZWtlZXBpbmcgYmVmb3JlIHNl dHRpbmcgdXAgd29ya3F1ZXVlcyB0byBhbGxvdyB0aGUgdW5ib3VuZA0KZGlmZiAtLWdpdCBhL2xp Yi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcNCmluZGV4IDA3NWNkMjUzNjNhYy4u M2Q5MzY2MDc1MTUzIDEwMDY0NA0KLS0tIGEvbGliL0tjb25maWcuZGVidWcNCisrKyBiL2xpYi9L Y29uZmlnLmRlYnVnDQpAQCAtODQ1LDYgKzg0NSwxMyBAQCBjb25maWcgREVCVUdfVk1fVk1BQ0FD SEUNCiAJICBjYW4gY2F1c2Ugc2lnbmlmaWNhbnQgb3ZlcmhlYWQsIHNvIG9ubHkgZW5hYmxlIGl0 IGluIG5vbi1wcm9kdWN0aW9uDQogCSAgZW52aXJvbm1lbnRzLg0KIA0KK2NvbmZpZyBERUJVR19W TV9NQVBMRV9UUkVFDQorCWJvb2wgIkRlYnVnIFZNIG1hcGxlIHRyZWVzIg0KKwlkZXBlbmRzIG9u IERFQlVHX1ZNDQorCXNlbGVjdCBERUJVR19NQVBMRV9UUkVFDQorCWhlbHANCisJICBFbmFibGUg Vk0gbWFwbGUgdHJlZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYW5kIGV4dHJhIHZhbGlkYXRpb25z Lg0KKw0KIAkgIElmIHVuc3VyZSwgc2F5IE4uDQogDQogY29uZmlnIERFQlVHX1ZNX1JCDQpAQCAt MTcwNSw2ICsxNzEyLDE0IEBAIGNvbmZpZyBCVUdfT05fREFUQV9DT1JSVVBUSU9ODQogDQogCSAg SWYgdW5zdXJlLCBzYXkgTi4NCiANCitjb25maWcgREVCVUdfTUFQTEVfVFJFRQ0KKwlib29sICJE ZWJ1ZyBtYXBsZSB0cmVlcyINCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwNCisJaGVscA0KKwkg IEVuYWJsZSBtYXBsZSB0cmVlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhbmQgZXh0cmEgdmFsaWRh dGlvbnMuDQorDQorCSAgSWYgdW5zdXJlLCBzYXkgTi4NCisNCiBlbmRtZW51DQogDQogY29uZmln IERFQlVHX0NSRURFTlRJQUxTDQpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlIGIvbGliL01ha2Vm aWxlDQppbmRleCA2YjlmZmMxYmQxZWUuLjI4YjQxMzYzYTYzNiAxMDA2NDQNCi0tLSBhL2xpYi9N YWtlZmlsZQ0KKysrIGIvbGliL01ha2VmaWxlDQpAQCAtMjksNyArMjksOCBAQCBlbmRpZg0KIA0K IGxpYi15IDo9IGN0eXBlLm8gc3RyaW5nLm8gdnNwcmludGYubyBjbWRsaW5lLm8gXA0KIAkgcmJ0 cmVlLm8gcmFkaXgtdHJlZS5vIHRpbWVycXVldWUubyB4YXJyYXkubyBcDQotCSBpZHIubyBleHRh YmxlLm8gc2hhMS5vIGlycV9yZWdzLm8gYXJndl9zcGxpdC5vIFwNCisJIG1hcGxlX3RyZWUubyBp ZHIubyBleHRhYmxlLm8gXA0KKwkgc2hhMS5vIGlycV9yZWdzLm8gYXJndl9zcGxpdC5vIFwNCiAJ IGZsZXhfcHJvcG9ydGlvbnMubyByYXRlbGltaXQubyBzaG93X21lbS5vIFwNCiAJIGlzX3Npbmds ZV90aHJlYWRlZC5vIHBsaXN0Lm8gZGVjb21wcmVzcy5vIGtvYmplY3RfdWV2ZW50Lm8gXA0KIAkg ZWFybHljcGlvLm8gc2VxX2J1Zi5vIHNpcGhhc2gubyBkZWNfYW5kX2xvY2subyBcDQpkaWZmIC0t Z2l0IGEvbGliL21hcGxlX3RyZWUuYyBiL2xpYi9tYXBsZV90cmVlLmMNCm5ldyBmaWxlIG1vZGUg MTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLmM3YjdhMTBiMTVkNQ0KLS0tIC9kZXYvbnVsbA0K KysrIGIvbGliL21hcGxlX3RyZWUuYw0KQEAgLTAsMCArMSw2OTY1IEBADQorLy8gU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjArDQorLyoNCisgKiBNYXBsZSBUcmVlIGltcGxlbWVudGF0 aW9uDQorICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgT3JhY2xlIENvcnBvcmF0aW9uDQorICog QXV0aG9yczogTGlhbSBSLiBIb3dsZXR0IDxMaWFtLkhvd2xldHRAb3JhY2xlLmNvbT4NCisgKgkg ICAgTWF0dGhldyBXaWxjb3ggPHdpbGx5QGluZnJhZGVhZC5vcmc+DQorICovDQorDQorLyoNCisg KiBET0M6IEludGVyZXN0aW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgdGhlIE1hcGxlIFRy ZWUNCisgKg0KKyAqIEVhY2ggbm9kZSB0eXBlIGhhcyBhIG51bWJlciBvZiBzbG90cyBmb3IgZW50 cmllcyBhbmQgYSBudW1iZXIgb2Ygc2xvdHMgZm9yDQorICogcGl2b3RzLiAgSW4gdGhlIGNhc2Ug b2YgZGVuc2Ugbm9kZXMsIHRoZSBwaXZvdHMgYXJlIGltcGxpZWQgYnkgdGhlIHBvc2l0aW9uDQor ICogYW5kIGFyZSBzaW1wbHkgdGhlIHNsb3QgaW5kZXggKyB0aGUgbWluaW11bSBvZiB0aGUgbm9k ZS4NCisgKg0KKyAqIEluIHJlZ3VsYXIgQi1UcmVlIHRlcm1zLCBwaXZvdHMgYXJlIGNhbGxlZCBr ZXlzLiAgVGhlIHRlcm0gcGl2b3QgaXMgdXNlZCB0bw0KKyAqIGluZGljYXRlIHRoYXQgdGhlIHRy ZWUgaXMgc3BlY2lmeWluZyByYW5nZXMsICBQaXZvdHMgbWF5IGFwcGVhciBpbiB0aGUNCisgKiBz dWJ0cmVlIHdpdGggYW4gZW50cnkgYXR0YWNoZWQgdG8gdGhlIHZhbHVlIHdoZXJlIGFzIGtleXMg YXJlIHVuaXF1ZSB0byBhDQorICogc3BlY2lmaWMgcG9zaXRpb24gb2YgYSBCLXRyZWUuICBQaXZv dCB2YWx1ZXMgYXJlIGluY2x1c2l2ZSBvZiB0aGUgc2xvdCB3aXRoDQorICogdGhlIHNhbWUgaW5k ZXguDQorICoNCisgKg0KKyAqIFRoZSBmb2xsb3dpbmcgaWxsdXN0cmF0ZXMgdGhlIGxheW91dCBv ZiBhIHJhbmdlNjQgbm9kZXMgc2xvdHMgYW5kIHBpdm90cy4NCisgKg0KKyAqDQorICogIFNsb3Rz IC0+IHwgMCB8IDEgfCAyIHwgLi4uIHwgMTIgfCAxMyB8IDE0IHwgMTUgfA0KKyAqICAgICAgICAg ICDilKwgICDilKwgICDilKwgICDilKwgICAgIOKUrCAgICDilKwgICAg4pSsICAgIOKUrCAgICDi lKwNCisgKiAgICAgICAgICAg4pSCICAg4pSCICAg4pSCICAg4pSCICAgICDilIIgICAg4pSCICAg IOKUgiAgICDilIIgICAg4pSU4pSAIEltcGxpZWQgbWF4aW11bQ0KKyAqICAgICAgICAgICDilIIg ICDilIIgICDilIIgICDilIIgICAgIOKUgiAgICDilIIgICAg4pSCICAgIOKUlOKUgCBQaXZvdCAx NA0KKyAqICAgICAgICAgICDilIIgICDilIIgICDilIIgICDilIIgICAgIOKUgiAgICDilIIgICAg 4pSU4pSAIFBpdm90IDEzDQorICogICAgICAgICAgIOKUgiAgIOKUgiAgIOKUgiAgIOKUgiAgICAg 4pSCICAgIOKUlOKUgCBQaXZvdCAxMg0KKyAqICAgICAgICAgICDilIIgICDilIIgICDilIIgICDi lIIgICAgIOKUlOKUgCBQaXZvdCAxMQ0KKyAqICAgICAgICAgICDilIIgICDilIIgICDilIIgICDi lJTilIAgUGl2b3QgMg0KKyAqICAgICAgICAgICDilIIgICDilIIgICDilJTilIAgUGl2b3QgMQ0K KyAqICAgICAgICAgICDilIIgICDilJTilIAgUGl2b3QgMA0KKyAqICAgICAgICAgICDilJTilIAg IEltcGxpZWQgbWluaW11bQ0KKyAqDQorICogU2xvdCBjb250ZW50czoNCisgKiAgSW50ZXJuYWwg KG5vbi1sZWFmKSBub2RlcyBjb250YWluIHBvaW50ZXJzIHRvIG90aGVyIG5vZGVzLg0KKyAqICBM ZWFmIG5vZGVzIGNvbnRhaW4gZW50cmllcy4NCisgKg0KKyAqIFRoZSBsb2NhdGlvbiBvZiBpbnRl cmVzdCBpcyBvZnRlbiByZWZlcnJlZCB0byBhcyBhbiBvZmZzZXQuICBBbGwgb2Zmc2V0cyBoYXZl DQorICogYSBzbG90LCBidXQgdGhlIGxhc3Qgb2Zmc2V0IGhhcyBhbiBpbXBsaWVkIHBpdm90IGZy b20gdGhlIG5vZGUgYWJvdmUgKG9yDQorICogVUlOVF9NQVggZm9yIHRoZSByb290IG5vZGUuDQor ICoNCisgKiBSYW5nZXMgY29tcGxpY2F0ZSBjZXJ0YWluIHdyaXRlIGFjdGl2aXRpZXMuICBXaGVu IG1vZGlmeWluZyBhbnkgb2YNCisgKiB0aGUgQi10cmVlIHZhcmlhbnRzLCBpdCBpcyBrbm93biB0 aGF0IG9uZSBlbnRyeSB3aWxsIGVpdGhlciBiZSBhZGRlZCBvcg0KKyAqIGRlbGV0ZWQuICBXaGVu IG1vZGlmeWluZyB0aGUgTWFwbGUgVHJlZSwgb25lIHN0b3JlIG9wZXJhdGlvbiBtYXkgb3Zlcndy aXRlDQorICogdGhlIGVudGlyZSBkYXRhIHNldCwgb3Igb25lIGhhbGYgb2YgdGhlIHRyZWUsIG9y IHRoZSBtaWRkbGUgaGFsZiBvZiB0aGUgdHJlZS4NCisgKg0KKyAqLw0KKw0KKw0KKyNpbmNsdWRl IDxsaW51eC9tYXBsZV90cmVlLmg+DQorI2luY2x1ZGUgPGxpbnV4L3hhcnJheS5oPg0KKyNpbmNs dWRlIDxsaW51eC90eXBlcy5oPg0KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4NCisjaW5jbHVk ZSA8bGludXgvc2xhYi5oPg0KKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4NCisjaW5jbHVkZSA8 YXNtL2JhcnJpZXIuaD4NCisNCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMNCisjaW5jbHVk ZSA8dHJhY2UvZXZlbnRzL21hcGxlX3RyZWUuaD4NCisNCisjZGVmaW5lIE1BX1JPT1RfUEFSRU5U IDENCisNCisvKiBNYXBsZSBzdGF0ZSBmbGFncyAqLw0KKyNkZWZpbmUgTUFfU1RBVEVfQlVMSwkJ MQ0KKyNkZWZpbmUgTUFfU1RBVEVfUkVCQUxBTkNFCTINCisNCisjZGVmaW5lIG1hX3BhcmVudF9w dHIoeCkgKChzdHJ1Y3QgbWFwbGVfcG5vZGUgKikoeCkpDQorI2RlZmluZSBtYV9tbm9kZV9wdHIo eCkgKChzdHJ1Y3QgbWFwbGVfbm9kZSAqKSh4KSkNCisjZGVmaW5lIG1hX2Vub2RlX3B0cih4KSAo KHN0cnVjdCBtYXBsZV9lbm9kZSAqKSh4KSkNCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm1h cGxlX25vZGVfY2FjaGU7DQorDQorI2lmZGVmIENPTkZJR19ERUJVR19NQVBMRV9UUkVFDQorc3Rh dGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbXRfbWF4W10gPSB7DQorCVttYXBsZV9kZW5zZV0JCT0g TUFQTEVfTk9ERV9TTE9UUywNCisJW21hcGxlX2xlYWZfNjRdCQk9IFVMT05HX01BWCwNCisJW21h cGxlX3JhbmdlXzY0XQk9IFVMT05HX01BWCwNCisJW21hcGxlX2FyYW5nZV82NF0JPSBVTE9OR19N QVgsDQorfTsNCisjZGVmaW5lIG10X25vZGVfbWF4KHgpIG10X21heFttdGVfbm9kZV90eXBlKHgp XQ0KKyNlbmRpZg0KKw0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG10X3Nsb3RzW10gPSB7 DQorCVttYXBsZV9kZW5zZV0JCT0gTUFQTEVfTk9ERV9TTE9UUywNCisJW21hcGxlX2xlYWZfNjRd CQk9IE1BUExFX1JBTkdFNjRfU0xPVFMsDQorCVttYXBsZV9yYW5nZV82NF0JPSBNQVBMRV9SQU5H RTY0X1NMT1RTLA0KKwlbbWFwbGVfYXJhbmdlXzY0XQk9IE1BUExFX0FSQU5HRTY0X1NMT1RTLA0K K307DQorI2RlZmluZSBtdF9zbG90X2NvdW50KHgpIG10X3Nsb3RzW210ZV9ub2RlX3R5cGUoeCld DQorDQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbXRfcGl2b3RzW10gPSB7DQorCVttYXBs ZV9kZW5zZV0JCT0gMCwNCisJW21hcGxlX2xlYWZfNjRdCQk9IE1BUExFX1JBTkdFNjRfU0xPVFMg LSAxLA0KKwlbbWFwbGVfcmFuZ2VfNjRdCT0gTUFQTEVfUkFOR0U2NF9TTE9UUyAtIDEsDQorCVtt YXBsZV9hcmFuZ2VfNjRdCT0gTUFQTEVfQVJBTkdFNjRfU0xPVFMgLSAxLA0KK307DQorI2RlZmlu ZSBtdF9waXZvdF9jb3VudCh4KSBtdF9waXZvdHNbbXRlX25vZGVfdHlwZSh4KV0NCisNCitzdGF0 aWMgY29uc3QgdW5zaWduZWQgY2hhciBtdF9taW5fc2xvdHNbXSA9IHsNCisJW21hcGxlX2RlbnNl XQkJPSBNQVBMRV9OT0RFX1NMT1RTIC8gMiwNCisJW21hcGxlX2xlYWZfNjRdCQk9IChNQVBMRV9S QU5HRTY0X1NMT1RTIC8gMikgLSAyLA0KKwlbbWFwbGVfcmFuZ2VfNjRdCT0gKE1BUExFX1JBTkdF NjRfU0xPVFMgLyAyKSAtIDIsDQorCVttYXBsZV9hcmFuZ2VfNjRdCT0gKE1BUExFX0FSQU5HRTY0 X1NMT1RTIC8gMikgLSAxLA0KK307DQorI2RlZmluZSBtdF9taW5fc2xvdF9jb3VudCh4KSBtdF9t aW5fc2xvdHNbbXRlX25vZGVfdHlwZSh4KV0NCisNCisjZGVmaW5lIE1BUExFX0JJR19OT0RFX1NM T1RTCShNQVBMRV9SQU5HRTY0X1NMT1RTICogMiArIDIpDQorI2RlZmluZSBNQVBMRV9CSUdfTk9E RV9HQVBTCShNQVBMRV9BUkFOR0U2NF9TTE9UUyAqIDIgKyAxKQ0KKw0KK3N0cnVjdCBtYXBsZV9i aWdfbm9kZSB7DQorCXN0cnVjdCBtYXBsZV9wbm9kZSAqcGFyZW50Ow0KKwl1bnNpZ25lZCBsb25n IHBpdm90W01BUExFX0JJR19OT0RFX1NMT1RTIC0gMV07DQorCXVuaW9uIHsNCisJCXN0cnVjdCBt YXBsZV9lbm9kZSAqc2xvdFtNQVBMRV9CSUdfTk9ERV9TTE9UU107DQorCQlzdHJ1Y3Qgew0KKwkJ CXVuc2lnbmVkIGxvbmcgcGFkZGluZ1tNQVBMRV9CSUdfTk9ERV9HQVBTXTsNCisJCQl1bnNpZ25l ZCBsb25nIGdhcFtNQVBMRV9CSUdfTk9ERV9HQVBTXTsNCisJCX07DQorCX07DQorCXVuc2lnbmVk IGNoYXIgYl9lbmQ7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlOw0KK307DQorDQorLyoNCisgKiBU aGUgbWFwbGVfc3VidHJlZV9zdGF0ZSBpcyB1c2VkIHRvIGJ1aWxkIGEgdHJlZSB0byByZXBsYWNl IGEgc2VnbWVudCBvZiBhbg0KKyAqIGV4aXN0aW5nIHRyZWUgaW4gYSBtb3JlIGF0b21pYyB3YXku ICBBbnkgd2Fsa2VycyBvZiB0aGUgb2xkZXIgdHJlZSB3aWxsIGhpdCBhDQorICogZGVhZCBub2Rl IGFuZCByZXN0YXJ0IG9uIHVwZGF0ZXMuDQorICovDQorc3RydWN0IG1hcGxlX3N1YnRyZWVfc3Rh dGUgew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm9yaWdfbDsJLyogT3JpZ2luYWwgbGVmdCBzaWRlIG9m IHN1YnRyZWUgKi8NCisJc3RydWN0IG1hX3N0YXRlICpvcmlnX3I7CS8qIE9yaWdpbmFsIHJpZ2h0 IHNpZGUgb2Ygc3VidHJlZSAqLw0KKwlzdHJ1Y3QgbWFfc3RhdGUgKmw7CQkvKiBOZXcgbGVmdCBz aWRlIG9mIHN1YnRyZWUgKi8NCisJc3RydWN0IG1hX3N0YXRlICptOwkJLyogTmV3IG1pZGRsZSBv ZiBzdWJ0cmVlIChyYXJlKSAqLw0KKwlzdHJ1Y3QgbWFfc3RhdGUgKnI7CQkvKiBOZXcgcmlnaHQg c2lkZSBvZiBzdWJ0cmVlICovDQorCXN0cnVjdCBtYV90b3BpYXJ5ICpmcmVlOwkvKiBub2RlcyB0 byBiZSBmcmVlZCAqLw0KKwlzdHJ1Y3QgbWFfdG9waWFyeSAqZGVzdHJveTsJLyogTm9kZXMgdG8g YmUgZGVzdHJveWVkICh3YWxrZWQgYW5kIGZyZWVkKSAqLw0KKwlzdHJ1Y3QgbWFwbGVfYmlnX25v ZGUgKmJuOw0KK307DQorDQorLyogRnVuY3Rpb25zICovDQorc3RhdGljIGlubGluZSBzdHJ1Y3Qg bWFwbGVfbm9kZSAqbXRfYWxsb2Nfb25lKGdmcF90IGdmcCkNCit7DQorCXJldHVybiBrbWVtX2Nh Y2hlX2FsbG9jKG1hcGxlX25vZGVfY2FjaGUsIGdmcCB8IF9fR0ZQX1pFUk8pOw0KK30NCisNCitz dGF0aWMgaW5saW5lIGludCBtdF9hbGxvY19idWxrKGdmcF90IGdmcCwgc2l6ZV90IHNpemUsIHZv aWQgKipub2RlcykNCit7DQorCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jX2J1bGsobWFwbGVfbm9k ZV9jYWNoZSwgZ2ZwIHwgX19HRlBfWkVSTywgc2l6ZSwNCisJCQkJICAgICBub2Rlcyk7DQorfQ0K Kw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtdF9mcmVlX2J1bGsoc2l6ZV90IHNpemUsIHZvaWQgX19y Y3UgKipub2RlcykNCit7DQorCWttZW1fY2FjaGVfZnJlZV9idWxrKG1hcGxlX25vZGVfY2FjaGUs IHNpemUsICh2b2lkICoqKW5vZGVzKTsNCit9DQorDQorc3RhdGljIHZvaWQgbXRfZnJlZV9yY3Uo c3RydWN0IHJjdV9oZWFkICpoZWFkKQ0KK3sNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUgPSBj b250YWluZXJfb2YoaGVhZCwgc3RydWN0IG1hcGxlX25vZGUsIHJjdSk7DQorDQorCWttZW1fY2Fj aGVfZnJlZShtYXBsZV9ub2RlX2NhY2hlLCBub2RlKTsNCit9DQorDQorLyoNCisgKiBtYV9mcmVl X3JjdSgpIC0gVXNlIHJjdSBjYWxsYmFjayB0byBmcmVlIGEgbWFwbGUgbm9kZQ0KKyAqIEBub2Rl OiBUaGUgbm9kZSB0byBmcmVlDQorICoNCisgKiBUaGUgbWFwbGUgdHJlZSB1c2VzIHRoZSBwYXJl bnQgcG9pbnRlciB0byBpbmRpY2F0ZSB0aGlzIG5vZGUgaXMgbm8gbG9uZ2VyIGluDQorICogdXNl IGFuZCB3aWxsIGJlIGZyZWVkLg0KKyAqLw0KK3N0YXRpYyB2b2lkIG1hX2ZyZWVfcmN1KHN0cnVj dCBtYXBsZV9ub2RlICpub2RlKQ0KK3sNCisJbm9kZS0+cGFyZW50ID0gbWFfcGFyZW50X3B0cihu b2RlKTsNCisJY2FsbF9yY3UoJm5vZGUtPnJjdSwgbXRfZnJlZV9yY3UpOw0KK30NCisNCitzdGF0 aWMgdW5zaWduZWQgaW50IG10X2hlaWdodChjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQor ew0KKwlyZXR1cm4gKG10LT5tYV9mbGFncyAmIE1UX0ZMQUdTX0hFSUdIVF9NQVNLKSA+PiBNVF9G TEFHU19IRUlHSFRfT0ZGU0VUOw0KK30NCisNCitzdGF0aWMgdm9pZCBtYXNfc2V0X2hlaWdodChz dHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXVuc2lnbmVkIGludCBuZXdfZmxhZ3MgPSBtYXMt PnRyZWUtPm1hX2ZsYWdzOw0KKw0KKwluZXdfZmxhZ3MgJj0gfk1UX0ZMQUdTX0hFSUdIVF9NQVNL Ow0KKwlCVUdfT04obWFzLT5kZXB0aCA+IE1BUExFX0hFSUdIVF9NQVgpOw0KKwluZXdfZmxhZ3Mg fD0gbWFzLT5kZXB0aCA8PCBNVF9GTEFHU19IRUlHSFRfT0ZGU0VUOw0KKwltYXMtPnRyZWUtPm1h X2ZsYWdzID0gbmV3X2ZsYWdzOw0KK30NCisNCitzdGF0aWMgdW5zaWduZWQgaW50IG1hc19tdF9o ZWlnaHQoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gbXRfaGVpZ2h0KG1hcy0+ dHJlZSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgZW51bSBtYXBsZV90eXBlIG10ZV9ub2RlX3R5 cGUoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICplbnRyeSkNCit7DQorCXJldHVybiAoKHVuc2ln bmVkIGxvbmcpZW50cnkgPj4gTUFQTEVfTk9ERV9UWVBFX1NISUZUKSAmDQorCQlNQVBMRV9OT0RF X1RZUEVfTUFTSzsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hX2lzX2RlbnNlKGNvbnN0 IGVudW0gbWFwbGVfdHlwZSB0eXBlKQ0KK3sNCisJcmV0dXJuIHR5cGUgPCBtYXBsZV9sZWFmXzY0 Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbWFfaXNfbGVhZihjb25zdCBlbnVtIG1hcGxl X3R5cGUgdHlwZSkNCit7DQorCXJldHVybiB0eXBlIDwgbWFwbGVfcmFuZ2VfNjQ7DQorfQ0KKw0K K3N0YXRpYyBpbmxpbmUgYm9vbCBtdGVfaXNfbGVhZihjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUg KmVudHJ5KQ0KK3sNCisJcmV0dXJuIG1hX2lzX2xlYWYobXRlX25vZGVfdHlwZShlbnRyeSkpOw0K K30NCisNCisvKg0KKyAqIFdlIGFsc28gcmVzZXJ2ZSB2YWx1ZXMgd2l0aCB0aGUgYm90dG9tIHR3 byBiaXRzIHNldCB0byAnMTAnIHdoaWNoIGFyZQ0KKyAqIGJlbG93IDQwOTYNCisgKi8NCitzdGF0 aWMgaW5saW5lIGJvb2wgbXRfaXNfcmVzZXJ2ZWQoY29uc3Qgdm9pZCAqZW50cnkpDQorew0KKwly ZXR1cm4gKCh1bnNpZ25lZCBsb25nKWVudHJ5IDwgTUFQTEVfUkVTRVJWRURfUkFOR0UpICYmDQor CQl4YV9pc19pbnRlcm5hbChlbnRyeSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNf c2V0X2VycihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgbG9uZyBlcnIpDQorew0KKwltYXMtPm5vZGUg PSBNQV9FUlJPUihlcnIpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX2lzX3B0cihz dHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXJldHVybiBtYXMtPm5vZGUgPT0gTUFTX1JPT1Q7 DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfaXNfc3RhcnQoc3RydWN0IG1hX3N0YXRl ICptYXMpDQorew0KKwlyZXR1cm4gbWFzLT5ub2RlID09IE1BU19TVEFSVDsNCit9DQorDQorc3Rh dGljIGlubGluZSBib29sIG1hc19pc19lcnIoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwly ZXR1cm4geGFfaXNfZXJyKG1hcy0+bm9kZSk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBt YXNfc2VhcmNoYWJsZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCWlmIChtYXNfaXNfbm9u ZShtYXMpKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0KKwlpZiAobWFzX2lzX3B0cihtYXMpKQ0KKwkJ cmV0dXJuIGZhbHNlOw0KKw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorc3RhdGljIGlubGluZSBz dHJ1Y3QgbWFwbGVfbm9kZSAqbXRlX3RvX25vZGUoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICpl bnRyeSkNCit7DQorCXJldHVybiAoc3RydWN0IG1hcGxlX25vZGUgKikoKHVuc2lnbmVkIGxvbmcp ZW50cnkgJiB+TUFQTEVfTk9ERV9NQVNLKTsNCit9DQorDQorLyoNCisgKiBtdGVfdG9fbWF0KCkg LSBDb252ZXJ0IGEgbWFwbGUgZW5jb2RlZCBub2RlIHRvIGEgbWFwbGUgdG9waWFyeSBub2RlLg0K KyAqIEBlbnRyeTogVGhlIG1hcGxlIGVuY29kZWQgbm9kZQ0KKyAqDQorICogUmV0dXJuOiBhIG1h cGxlIHRvcGlhcnkgcG9pbnRlcg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX3Rv cGlhcnkgKm10ZV90b19tYXQoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICplbnRyeSkNCit7DQor CXJldHVybiAoc3RydWN0IG1hcGxlX3RvcGlhcnkgKikNCisJCSgodW5zaWduZWQgbG9uZyllbnRy eSAmIH5NQVBMRV9OT0RFX01BU0spOw0KK30NCisNCisvKg0KKyAqIG1hc19tbigpIC0gR2V0IHRo ZSBtYXBsZSBzdGF0ZSBub2RlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICog UmV0dXJuOiB0aGUgbWFwbGUgbm9kZSAobm90IGVuY29kZWQgLSBiYXJlIHBvaW50ZXIpLg0KKyAq Lw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX25vZGUgKm1hc19tbihjb25zdCBzdHJ1Y3Qg bWFfc3RhdGUgKm1hcykNCit7DQorCXJldHVybiBtdGVfdG9fbm9kZShtYXMtPm5vZGUpOw0KK30N CisNCisvKg0KKyAqIG10ZV9zZXRfbm9kZV9kZWFkKCkgLSBTZXQgYSBtYXBsZSBlbmNvZGVkIG5v ZGUgYXMgZGVhZC4NCisgKiBAbW46IFRoZSBtYXBsZSBlbmNvZGVkIG5vZGUuDQorICovDQorc3Rh dGljIGlubGluZSB2b2lkIG10ZV9zZXRfbm9kZV9kZWFkKHN0cnVjdCBtYXBsZV9lbm9kZSAqbW4p DQorew0KKwltdGVfdG9fbm9kZShtbiktPnBhcmVudCA9IG1hX3BhcmVudF9wdHIobXRlX3RvX25v ZGUobW4pKTsNCisJc21wX3dtYigpOw0KK30NCisNCisvKiBCaXQgMSBpbmRpY2F0ZXMgdGhlIHJv b3QgaXMgYSBub2RlICovDQorI2RlZmluZSBNQVBMRV9ST09UX05PREUJCQkweDAyDQorLyogbWFw bGVfdHlwZSBzdG9yZWQgYml0IDMtNiAqLw0KKyNkZWZpbmUgTUFQTEVfRU5PREVfVFlQRV9TSElG VAkJMHgwMw0KKy8qIEJpdCAyIG1lYW5zIGEgTlVMTCBzb21ld2hlcmUgYmVsb3cgKi8NCisjZGVm aW5lIE1BUExFX0VOT0RFX05VTEwJCTB4MDQNCisNCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtYXBs ZV9lbm9kZSAqbXRfbWtfbm9kZShjb25zdCBzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwNCisJCQkJ CSAgICAgZW51bSBtYXBsZV90eXBlIHR5cGUpDQorew0KKwlyZXR1cm4gKHZvaWQgKikoKHVuc2ln bmVkIGxvbmcpbm9kZSB8DQorCQkJKHR5cGUgPDwgTUFQTEVfRU5PREVfVFlQRV9TSElGVCkgfCBN QVBMRV9FTk9ERV9OVUxMKTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkICptdGVfbWtfcm9v dChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5vZGUpDQorew0KKwlyZXR1cm4gKHZvaWQgKiko KHVuc2lnbmVkIGxvbmcpbm9kZSB8IE1BUExFX1JPT1RfTk9ERSk7DQorfQ0KKw0KK3N0YXRpYyBp bmxpbmUgdm9pZCAqbXRlX3NhZmVfcm9vdChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKm5vZGUp DQorew0KKwlyZXR1cm4gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpbm9kZSAmIH5NQVBMRV9ST09U X05PREUpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbXRlX3NldF9mdWxsKGNvbnN0IHN0 cnVjdCBtYXBsZV9lbm9kZSAqbm9kZSkNCit7DQorCW5vZGUgPSAodm9pZCAqKSgodW5zaWduZWQg bG9uZylub2RlICYgfk1BUExFX0VOT0RFX05VTEwpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZv aWQgbXRlX2NsZWFyX2Z1bGwoY29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICpub2RlKQ0KK3sNCisJ bm9kZSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKW5vZGUgfCBNQVBMRV9FTk9ERV9OVUxMKTsN Cit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hX2lzX3Jvb3Qoc3RydWN0IG1hcGxlX25vZGUg Km5vZGUpDQorew0KKwlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKW5vZGUtPnBhcmVudCAmIE1BX1JP T1RfUEFSRU5UKTsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG10ZV9pc19yb290KGNvbnN0 IHN0cnVjdCBtYXBsZV9lbm9kZSAqbm9kZSkNCit7DQorCXJldHVybiBtYV9pc19yb290KG10ZV90 b19ub2RlKG5vZGUpKTsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hc19pc19yb290X2xp bWl0cyhjb25zdCBzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXJldHVybiAhbWFzLT5taW4g JiYgbWFzLT5tYXggPT0gVUxPTkdfTUFYOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbXRf aXNfYWxsb2Moc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJcmV0dXJuIChtdC0+bWFfZmxh Z3MgJiBNVF9GTEFHU19BTExPQ19SQU5HRSk7DQorfQ0KKw0KKy8qDQorICogVGhlIFBhcmVudCBQ b2ludGVyDQorICogRXhjbHVkaW5nIHJvb3QsIHRoZSBwYXJlbnQgcG9pbnRlciBpcyAyNTZCIGFs aWduZWQgbGlrZSBhbGwgb3RoZXIgdHJlZSBub2Rlcy4NCisgKiBXaGVuIHN0b3JpbmcgYSAzMiBv ciA2NCBiaXQgdmFsdWVzLCB0aGUgb2Zmc2V0IGNhbiBmaXQgaW50byA0IGJpdHMuICBUaGUgMTYN CisgKiBiaXQgdmFsdWVzIG5lZWQgYW4gZXh0cmEgYml0IHRvIHN0b3JlIHRoZSBvZmZzZXQuICBU aGlzIGV4dHJhIGJpdCBjb21lcyBmcm9tDQorICogYSByZXVzZSBvZiB0aGUgbGFzdCBiaXQgaW4g dGhlIG5vZGUgdHlwZS4gIFRoaXMgaXMgcG9zc2libGUgYnkgdXNpbmcgYml0IDEgdG8NCisgKiBp bmRpY2F0ZSBpZiBiaXQgMiBpcyBwYXJ0IG9mIHRoZSB0eXBlIG9yIHRoZSBzbG90Lg0KKyAqDQor ICogTm90ZSB0eXBlczoNCisgKiAgMHg/PzEgPSBSb290DQorICogIDB4PzAwID0gMTYgYml0IG5v ZGVzDQorICogIDB4MDEwID0gMzIgYml0IG5vZGVzDQorICogIDB4MTEwID0gNjQgYml0IG5vZGVz DQorICoNCisgKiBTbG90IHNpemUgYW5kIGFsaWdubWVudA0KKyAqICAweD8/MSA6IFJvb3QNCisg KiAgMHg/MDAgOiAxNiBiaXQgdmFsdWVzLCB0eXBlIGluIDAtMSwgc2xvdCBpbiAyLTYNCisgKiAg MHgwMTAgOiAzMiBiaXQgdmFsdWVzLCB0eXBlIGluIDAtMiwgc2xvdCBpbiAzLTYNCisgKiAgMHgx MTAgOiA2NCBiaXQgdmFsdWVzLCB0eXBlIGluIDAtMiwgc2xvdCBpbiAzLTYNCisgKi8NCisNCisj ZGVmaW5lIE1BUExFX1BBUkVOVF9ST09UCQkweDAxDQorDQorI2RlZmluZSBNQVBMRV9QQVJFTlRf U0xPVF9TSElGVAkJMHgwMw0KKyNkZWZpbmUgTUFQTEVfUEFSRU5UX1NMT1RfTUFTSwkJMHg3OA0K Kw0KKyNkZWZpbmUgTUFQTEVfUEFSRU5UXzE2Ql9TTE9UX1NISUZUCTB4MDINCisjZGVmaW5lIE1B UExFX1BBUkVOVF8xNkJfU0xPVF9NQVNLCTB4N0MNCisNCisjZGVmaW5lIE1BUExFX1BBUkVOVF9S QU5HRTY0CQkweDA2DQorI2RlZmluZSBNQVBMRV9QQVJFTlRfUkFOR0UzMgkJMHgwNA0KKyNkZWZp bmUgTUFQTEVfUEFSRU5UX05PVF9SQU5HRTE2CTB4MDINCisNCisvKg0KKyAqIG10ZV9wYXJlbnRf c2hpZnQoKSAtIEdldCB0aGUgcGFyZW50IHNoaWZ0IGZvciB0aGUgc2xvdCBzdG9yYWdlLg0KKyAq IEBwYXJlbnQ6IFRoZSBwYXJlbnQgcG9pbnRlciBjYXN0IGFzIGFuIHVuc2lnbmVkIGxvbmcNCisg KiBSZXR1cm46IFRoZSBzaGlmdCBpbnRvIHRoYXQgcG9pbnRlciB0byB0aGUgc3RhciB0byBvZiB0 aGUgc2xvdA0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtdGVfcGFyZW50X3No aWZ0KHVuc2lnbmVkIGxvbmcgcGFyZW50KQ0KK3sNCisJLyogTm90ZSBiaXQgMSA9PSAwIG1lYW5z IDE2QiAqLw0KKwlpZiAobGlrZWx5KHBhcmVudCAmIE1BUExFX1BBUkVOVF9OT1RfUkFOR0UxNikp DQorCQlyZXR1cm4gTUFQTEVfUEFSRU5UX1NMT1RfU0hJRlQ7DQorDQorCXJldHVybiBNQVBMRV9Q QVJFTlRfMTZCX1NMT1RfU0hJRlQ7DQorfQ0KKw0KKy8qDQorICogbXRlX3BhcmVudF9zbG90X21h c2soKSAtIEdldCB0aGUgc2xvdCBtYXNrIGZvciB0aGUgcGFyZW50Lg0KKyAqIEBwYXJlbnQ6IFRo ZSBwYXJlbnQgcG9pbnRlciBjYXN0IGFzIGFuIHVuc2lnbmVkIGxvbmcuDQorICogUmV0dXJuOiBU aGUgc2xvdCBtYXNrIGZvciB0aGF0IHBhcmVudC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2ln bmVkIGxvbmcgbXRlX3BhcmVudF9zbG90X21hc2sodW5zaWduZWQgbG9uZyBwYXJlbnQpDQorew0K KwkvKiBOb3RlIGJpdCAxID09IDAgbWVhbnMgMTZCICovDQorCWlmIChsaWtlbHkocGFyZW50ICYg TUFQTEVfUEFSRU5UX05PVF9SQU5HRTE2KSkNCisJCXJldHVybiBNQVBMRV9QQVJFTlRfU0xPVF9N QVNLOw0KKw0KKwlyZXR1cm4gTUFQTEVfUEFSRU5UXzE2Ql9TTE9UX01BU0s7DQorfQ0KKw0KKy8q DQorICogbWFzX3BhcmVudF9lbnVtKCkgLSBSZXR1cm4gdGhlIG1hcGxlX3R5cGUgb2YgdGhlIHBh cmVudCBmcm9tIHRoZSBzdG9yZWQNCisgKiBwYXJlbnQgdHlwZS4NCisgKiBAbWFzOiBUaGUgbWFw bGUgc3RhdGUNCisgKiBAbm9kZTogVGhlIG1hcGxlX2Vub2RlIHRvIGV4dHJhY3QgdGhlIHBhcmVu dCdzIGVudW0NCisgKiBSZXR1cm46IFRoZSBub2RlLT5wYXJlbnQgbWFwbGVfdHlwZQ0KKyAqLw0K K3N0YXRpYyBpbmxpbmUNCitlbnVtIG1hcGxlX3R5cGUgbXRlX3BhcmVudF9lbnVtKHN0cnVjdCBt YXBsZV9lbm9kZSAqcF9lbm9kZSwNCisJCQkJc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJ dW5zaWduZWQgbG9uZyBwX3R5cGU7DQorDQorCXBfdHlwZSA9ICh1bnNpZ25lZCBsb25nKXBfZW5v ZGU7DQorCWlmIChwX3R5cGUgJiBNQVBMRV9QQVJFTlRfUk9PVCkNCisJCXJldHVybiAwOyAvKiBW YWxpZGF0ZWQgaW4gdGhlIGNhbGxlci4gKi8NCisNCisJcF90eXBlICY9IE1BUExFX05PREVfTUFT SzsNCisJcF90eXBlID0gcF90eXBlICYgfihNQVBMRV9QQVJFTlRfUk9PVCB8IG10ZV9wYXJlbnRf c2xvdF9tYXNrKHBfdHlwZSkpOw0KKw0KKwlzd2l0Y2ggKHBfdHlwZSkgew0KKwljYXNlIE1BUExF X1BBUkVOVF9SQU5HRTY0OiAvKiBvciBNQVBMRV9QQVJFTlRfQVJBTkdFNjQgKi8NCisJCWlmICht dF9pc19hbGxvYyhtdCkpDQorCQkJcmV0dXJuIG1hcGxlX2FyYW5nZV82NDsNCisJCXJldHVybiBt YXBsZV9yYW5nZV82NDsNCisJfQ0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIGlubGlu ZQ0KK2VudW0gbWFwbGVfdHlwZSBtYXNfcGFyZW50X2VudW0oc3RydWN0IG1hX3N0YXRlICptYXMs IHN0cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGUpDQorew0KKwlyZXR1cm4gbXRlX3BhcmVudF9lbnVt KG1hX2Vub2RlX3B0cihtdGVfdG9fbm9kZShlbm9kZSktPnBhcmVudCksIG1hcy0+dHJlZSk7DQor fQ0KKw0KKy8qDQorICogbXRlX3NldF9wYXJlbnQoKSAtIFNldCB0aGUgcGFyZW50IG5vZGUgYW5k IGVuY29kZSB0aGUgc2xvdA0KKyAqIEBlbm9kZTogVGhlIGVuY29kZWQgbWFwbGUgbm9kZS4NCisg KiBAcGFyZW50OiBUaGUgZW5jb2RlZCBtYXBsZSBub2RlIHRoYXQgaXMgdGhlIHBhcmVudCBvZiBA ZW5vZGUuDQorICogQHNsb3Q6IFRoZSBzbG90IHRoYXQgQGVub2RlIHJlc2lkZXMgaW4gQHBhcmVu dC4NCisgKg0KKyAqIFNsb3QgbnVtYmVyIGlzIGVuY29kZWQgaW4gdGhlIGVub2RlLT5wYXJlbnQg Yml0IDMtNiBvciAyLTYsIGRlcGVuZGluZyBvbiB0aGUNCisgKiBwYXJlbnQgdHlwZS4NCisgKi8N CitzdGF0aWMgaW5saW5lDQordm9pZCBtdGVfc2V0X3BhcmVudChzdHJ1Y3QgbWFwbGVfZW5vZGUg KmVub2RlLCBjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKnBhcmVudCwNCisJCSAgICB1bnNpZ25l ZCBjaGFyIHNsb3QpDQorew0KKwl1bnNpZ25lZCBsb25nIHZhbCA9ICh1bnNpZ25lZCBsb25nKSBw YXJlbnQ7DQorCXVuc2lnbmVkIGxvbmcgc2hpZnQ7DQorCXVuc2lnbmVkIGxvbmcgdHlwZTsNCisJ ZW51bSBtYXBsZV90eXBlIHBfdHlwZSA9IG10ZV9ub2RlX3R5cGUocGFyZW50KTsNCisNCisJQlVH X09OKHBfdHlwZSA9PSBtYXBsZV9kZW5zZSk7DQorCUJVR19PTihwX3R5cGUgPT0gbWFwbGVfbGVh Zl82NCk7DQorDQorCXN3aXRjaChwX3R5cGUpIHsNCisJY2FzZSBtYXBsZV9yYW5nZV82NDoNCisJ Y2FzZSBtYXBsZV9hcmFuZ2VfNjQ6DQorCQlzaGlmdCA9IE1BUExFX1BBUkVOVF9TTE9UX1NISUZU Ow0KKwkJdHlwZSA9IE1BUExFX1BBUkVOVF9SQU5HRTY0Ow0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6 DQorCWNhc2UgbWFwbGVfZGVuc2U6DQorCWNhc2UgbWFwbGVfbGVhZl82NDoNCisJCXNoaWZ0ID0g dHlwZSA9IDA7DQorCQlicmVhazsNCisJfQ0KKw0KKwl2YWwgJj0gfk1BUExFX05PREVfTUFTSzsg LyogQ2xlYXIgYWxsIG5vZGUgbWV0YWRhdGEgaW4gcGFyZW50ICovDQorCXZhbCB8PSAoc2xvdCA8 PCBzaGlmdCkgfCB0eXBlOw0KKwltdGVfdG9fbm9kZShlbm9kZSktPnBhcmVudCA9IG1hX3BhcmVu dF9wdHIodmFsKTsNCit9DQorDQorLyoNCisgKiBtdGVfcGFyZW50X3Nsb3QoKSAtIGdldCB0aGUg cGFyZW50IHNsb3Qgb2YgQGVub2RlLg0KKyAqIEBlbm9kZTogVGhlIGVuY29kZWQgbWFwbGUgbm9k ZS4NCisgKg0KKyAqIFJldHVybjogVGhlIHNsb3QgaW4gdGhlIHBhcmVudCBub2RlIHdoZXJlIEBl bm9kZSByZXNpZGVzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG10ZV9wYXJl bnRfc2xvdChjb25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVub2RlKQ0KK3sNCisJdW5zaWduZWQg bG9uZyB2YWwgPSAodW5zaWduZWQgbG9uZykgbXRlX3RvX25vZGUoZW5vZGUpLT5wYXJlbnQ7DQor DQorCS8qIFJvb3QuICovDQorCWlmICh2YWwgJiAxKQ0KKwkJcmV0dXJuIDA7DQorDQorCS8qDQor CSAqIE9rYXkgdG8gdXNlIE1BUExFX1BBUkVOVF8xNkJfU0xPVF9NQVNLIGFzIHRoZSBsYXN0IGJp dCB3aWxsIGJlIGxvc3QNCisJICogYnkgc2hpZnQgaWYgdGhlIHBhcmVudCBzaGlmdCBpcyBNQVBM RV9QQVJFTlRfU0xPVF9TSElGVA0KKwkgKi8NCisJcmV0dXJuICh2YWwgJiBNQVBMRV9QQVJFTlRf MTZCX1NMT1RfTUFTSykgPj4gbXRlX3BhcmVudF9zaGlmdCh2YWwpOw0KK30NCisNCisvKg0KKyAq IG10ZV9wYXJlbnQoKSAtIEdldCB0aGUgcGFyZW50IG9mIEBub2RlLg0KKyAqIEBub2RlOiBUaGUg ZW5jb2RlZCBtYXBsZSBub2RlLg0KKyAqDQorICogUmV0dXJuOiBUaGUgcGFyZW50IG1hcGxlIG5v ZGUuDQorICovDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwbGVfbm9kZSAqbXRlX3BhcmVudChj b25zdCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVub2RlKQ0KK3sNCisJcmV0dXJuICh2b2lkICopKCh1 bnNpZ25lZCBsb25nKQ0KKwkJCShtdGVfdG9fbm9kZShlbm9kZSktPnBhcmVudCkgJiB+TUFQTEVf Tk9ERV9NQVNLKTsNCit9DQorDQorLyoNCisgKiBtYV9kZWFkX25vZGUoKSAtIGNoZWNrIGlmIHRo ZSBAZW5vZGUgaXMgZGVhZC4NCisgKiBAZW5vZGU6IFRoZSBlbmNvZGVkIG1hcGxlIG5vZGUNCisg Kg0KKyAqIFJldHVybjogdHJ1ZSBpZiBkZWFkLCBmYWxzZSBvdGhlcndpc2UuDQorICovDQorc3Rh dGljIGlubGluZSBib29sIG1hX2RlYWRfbm9kZShjb25zdCBzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9k ZSkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpwYXJlbnQgPSAodm9pZCAqKSgodW5zaWduZWQg bG9uZykNCisJCQkJCSAgICAgbm9kZS0+cGFyZW50ICYgfk1BUExFX05PREVfTUFTSyk7DQorDQor CXJldHVybiAocGFyZW50ID09IG5vZGUpOw0KK30NCisvKg0KKyAqIG10ZV9kZWFkX25vZGUoKSAt IGNoZWNrIGlmIHRoZSBAZW5vZGUgaXMgZGVhZC4NCisgKiBAZW5vZGU6IFRoZSBlbmNvZGVkIG1h cGxlIG5vZGUNCisgKg0KKyAqIFJldHVybjogdHJ1ZSBpZiBkZWFkLCBmYWxzZSBvdGhlcndpc2Uu DQorICovDQorc3RhdGljIGlubGluZSBib29sIG10ZV9kZWFkX25vZGUoY29uc3Qgc3RydWN0IG1h cGxlX2Vub2RlICplbm9kZSkNCit7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpwYXJlbnQsICpub2Rl Ow0KKw0KKwlub2RlID0gbXRlX3RvX25vZGUoZW5vZGUpOw0KKwlwYXJlbnQgPSBtdGVfcGFyZW50 KGVub2RlKTsNCisJcmV0dXJuIChwYXJlbnQgPT0gbm9kZSk7DQorfQ0KKw0KKy8qDQorICogbWFz X2FsbG9jYXRlZCgpIC0gR2V0IHRoZSBudW1iZXIgb2Ygbm9kZXMgYWxsb2NhdGVkIGluIGEgbWFw bGUgc3RhdGUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICoNCisgKiBUaGUgbWFfc3Rh dGUgYWxsb2MgbWVtYmVyIGlzIG92ZXJsb2FkZWQgdG8gaG9sZCBhIHBvaW50ZXIgdG8gdGhlIGZp cnN0DQorICogYWxsb2NhdGVkIG5vZGUgb3IgdG8gdGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgbm9k ZXMgdG8gYWxsb2NhdGUuICBJZiBiaXQgMCBpcw0KKyAqIHNldCwgdGhlbiB0aGUgYWxsb2MgY29u dGFpbnMgdGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgbm9kZXMuICBJZiB0aGVyZSBpcyBhbg0KKyAq IGFsbG9jYXRlZCBub2RlLCB0aGVuIHRoZSB0b3RhbCBhbGxvY2F0ZWQgbm9kZXMgaXMgaW4gdGhh dCBub2RlLg0KKyAqDQorICogUmV0dXJuOiBUaGUgdG90YWwgbnVtYmVyIG9mIG5vZGVzIGFsbG9j YXRlZA0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtYXNfYWxsb2NhdGVkKGNv bnN0IHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJaWYgKCFtYXMtPmFsbG9jIHx8ICgodW5z aWduZWQgbG9uZyltYXMtPmFsbG9jICYgMHgxKSkNCisJCXJldHVybiAwOw0KKw0KKwlyZXR1cm4g bWFzLT5hbGxvYy0+dG90YWw7DQorfQ0KKw0KKy8qDQorICogbWFzX3NldF9hbGxvY19yZXEoKSAt IFNldCB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBhbGxvY2F0aW9ucy4NCisgKiBAbWFzOiB0aGUg bWFwbGUgc3RhdGUNCisgKiBAY291bnQ6IHRoZSBudW1iZXIgb2YgYWxsb2NhdGlvbnMuDQorICoN CisgKiBUaGUgcmVxdWVzdGVkIG51bWJlciBvZiBhbGxvY2F0aW9ucyBpcyBlaXRoZXIgaW4gdGhl IGZpcnN0IGFsbG9jYXRlZCBub2RlLA0KKyAqIGxvY2F0ZWQgaW4gQG1hcy0+YWxsb2MtPnJlcXVl c3RfY291bnQsIG9yIGRpcmVjdGx5IGluIEBtYXMtPmFsbG9jIGlmIHRoZXJlIGlzDQorICogbm8g YWxsb2NhdGVkIG5vZGUuICBTZXQgdGhlIHJlcXVlc3QgZWl0aGVyIGluIHRoZSBub2RlIG9yIGRv IHRoZSBuZWNlc3NhcnkNCisgKiBlbmNvZGluZyB0byBzdG9yZSBpbiBAbWFzLT5hbGxvYyBkaXJl Y3RseS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3NldF9hbGxvY19yZXEoc3RydWN0 IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgY291bnQpDQorew0KKwlpZiAoIW1hcy0+YWxs b2MgfHwgKCh1bnNpZ25lZCBsb25nKW1hcy0+YWxsb2MgJiAweDEpKSB7DQorCQlpZiAoIWNvdW50 KQ0KKwkJCW1hcy0+YWxsb2MgPSBOVUxMOw0KKwkJZWxzZQ0KKwkJCW1hcy0+YWxsb2MgPSAoc3Ry dWN0IG1hcGxlX2FsbG9jICopKCgoY291bnQpIDw8IDFVKSB8IDFVKTsNCisJCXJldHVybjsNCisJ fQ0KKw0KKwltYXMtPmFsbG9jLT5yZXF1ZXN0X2NvdW50ID0gY291bnQ7DQorfQ0KKw0KKy8qDQor ICogbWFzX2FsbG9jX3JlcSgpIC0gZ2V0IHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGFsbG9jYXRp b25zLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogVGhlIGFsbG9jIGNvdW50 IGlzIGVpdGhlciBzdG9yZWQgZGlyZWN0bHkgaW4gQG1hcywgb3IgaW4NCisgKiBAbWFzLT5hbGxv Yy0+cmVxdWVzdF9jb3VudCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgbm9kZSBhbGxvY2F0ZWQu ICBEZWNvZGUNCisgKiB0aGUgcmVxdWVzdCBjb3VudCBpZiBpdCdzIHN0b3JlZCBkaXJlY3RseSBp biBAbWFzLT5hbGxvYy4NCisgKg0KKyAqIFJldHVybjogVGhlIGFsbG9jYXRpb24gcmVxdWVzdCBj b3VudC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBtYXNfYWxsb2NfcmVxKGNv bnN0IHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJaWYgKCh1bnNpZ25lZCBsb25nKW1hcy0+ YWxsb2MgJiAweDEpDQorCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpKG1hcy0+YWxsb2MpID4+IDE7 DQorCWVsc2UgaWYgKG1hcy0+YWxsb2MpDQorCQlyZXR1cm4gbWFzLT5hbGxvYy0+cmVxdWVzdF9j b3VudDsNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qDQorICogbWFfcGl2b3RzKCkgLSBHZXQgYSBw b2ludGVyIHRvIHRoZSBtYXBsZSBub2RlIHBpdm90cy4NCisgKiBAbm9kZSAtIHRoZSBtYXBsZSBu b2RlDQorICogQHR5cGUgLSB0aGUgbm9kZSB0eXBlDQorICoNCisgKiBSZXR1cm46IEEgcG9pbnRl ciB0byB0aGUgbWFwbGUgbm9kZSBwaXZvdHMNCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVk IGxvbmcgKm1hX3Bpdm90cyhzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwNCisJCQkJCSAgIGVudW0g bWFwbGVfdHlwZSB0eXBlKQ0KK3sNCisJc3dpdGNoICh0eXBlKSB7DQorCWNhc2UgbWFwbGVfYXJh bmdlXzY0Og0KKwkJcmV0dXJuIG5vZGUtPm1hNjQucGl2b3Q7DQorCWNhc2UgbWFwbGVfcmFuZ2Vf NjQ6DQorCWNhc2UgbWFwbGVfbGVhZl82NDoNCisJCXJldHVybiBub2RlLT5tcjY0LnBpdm90Ow0K KwljYXNlIG1hcGxlX2RlbnNlOg0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisJcmV0dXJuIE5VTEw7 DQorfQ0KKw0KKy8qDQorICogbWFfZ2FwcygpIC0gR2V0IGEgcG9pbnRlciB0byB0aGUgbWFwbGUg bm9kZSBnYXBzLg0KKyAqIEBub2RlIC0gdGhlIG1hcGxlIG5vZGUNCisgKiBAdHlwZSAtIHRoZSBu b2RlIHR5cGUNCisgKg0KKyAqIFJldHVybjogQSBwb2ludGVyIHRvIHRoZSBtYXBsZSBub2RlIGdh cHMNCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKm1hX2dhcHMoc3RydWN0IG1h cGxlX25vZGUgKm5vZGUsDQorCQkJCSAgICAgZW51bSBtYXBsZV90eXBlIHR5cGUpDQorew0KKwlz d2l0Y2ggKHR5cGUpIHsNCisJY2FzZSBtYXBsZV9hcmFuZ2VfNjQ6DQorCQlyZXR1cm4gbm9kZS0+ bWE2NC5nYXA7DQorCWNhc2UgbWFwbGVfcmFuZ2VfNjQ6DQorCWNhc2UgbWFwbGVfbGVhZl82NDoN CisJY2FzZSBtYXBsZV9kZW5zZToNCisJCXJldHVybiBOVUxMOw0KKwl9DQorCXJldHVybiBOVUxM Ow0KK30NCisNCisvKg0KKyAqIG10ZV9waXZvdCgpIC0gR2V0IHRoZSBwaXZvdCBhdCBAcGl2IG9m IHRoZSBtYXBsZSBlbmNvZGVkIG5vZGUuDQorICogQG1uOiBUaGUgbWFwbGUgZW5jb2RlZCBub2Rl Lg0KKyAqIEBwaXY6IFRoZSBwaXZvdC4NCisgKg0KKyAqIFJldHVybjogdGhlIHBpdm90IGF0IEBw aXYgb2YgQG1uLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtdGVfcGl2b3Qo Y29uc3Qgc3RydWN0IG1hcGxlX2Vub2RlICptbiwNCisJCQkJIHVuc2lnbmVkIGNoYXIgcGl2KQ0K K3sNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUgPSBtdGVfdG9fbm9kZShtbik7DQorDQorCWlm KHBpdiA+PSBtdF9waXZvdHNbcGl2XSkgew0KKwkJV0FSTl9PTigxKTsNCisJCXJldHVybiAwOw0K Kwl9DQorCXN3aXRjaCAobXRlX25vZGVfdHlwZShtbikpIHsNCisJY2FzZSBtYXBsZV9hcmFuZ2Vf NjQ6DQorCQlyZXR1cm4gbm9kZS0+bWE2NC5waXZvdFtwaXZdOw0KKwljYXNlIG1hcGxlX3Jhbmdl XzY0Og0KKwljYXNlIG1hcGxlX2xlYWZfNjQ6DQorCQlyZXR1cm4gbm9kZS0+bXI2NC5waXZvdFtw aXZdOw0KKwljYXNlIG1hcGxlX2RlbnNlOg0KKwkJcmV0dXJuIDA7DQorCX0NCisJcmV0dXJuIDA7 DQorfQ0KKw0KKy8qDQorICogbWFzX3NhZmVfcGl2b3QoKSAtIGdldCB0aGUgcGl2b3QgYXQgQHBp diBvciBtYXMtPm1heC4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAcGl2b3RzOiBU aGUgcG9pbnRlciB0byB0aGUgbWFwbGUgbm9kZSBwaXZvdHMNCisgKiBAcGl2OiBUaGUgcGl2b3Qg dG8gZmV0Y2gNCisgKiBAdHlwZTogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqDQorICogUmV0dXJu OiBUaGUgcGl2b3QgYXQgQHBpdiB3aXRoaW4gdGhlIGxpbWl0IG9mIHRoZSBAcGl2b3RzIGFycmF5 LCBAbWFzLT5tYXgNCisgKiBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25l ZCBsb25nDQorbWFzX3NhZmVfcGl2b3QoY29uc3Qgc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2ln bmVkIGxvbmcgKnBpdm90cywNCisJICAgICAgIHVuc2lnbmVkIGNoYXIgcGl2LCBlbnVtIG1hcGxl X3R5cGUgdHlwZSkNCit7DQorCWlmIChwaXYgPj0gbXRfcGl2b3RzW3R5cGVdKQ0KKwkJcmV0dXJu IG1hcy0+bWF4Ow0KKw0KKwlyZXR1cm4gcGl2b3RzW3Bpdl07DQorfQ0KKw0KKy8qDQorICogbWFz X3NhZmVfbWluKCkgLSBSZXR1cm4gdGhlIG1pbmltdW0gZm9yIGEgZ2l2ZW4gb2Zmc2V0Lg0KKyAq IEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBwaXZvdHM6IFRoZSBwb2ludGVyIHRvIHRoZSBt YXBsZSBub2RlIHBpdm90cw0KKyAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgaW50byB0aGUgcGl2b3Qg YXJyYXkNCisgKg0KKyAqIFJldHVybjogVGhlIG1pbmltdW0gcmFuZ2UgdmFsdWUgdGhhdCBpcyBj b250YWluZWQgaW4gQG9mZnNldC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcN CittYXNfc2FmZV9taW4oc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgKnBpdm90 cywgdW5zaWduZWQgY2hhciBvZmZzZXQpDQorew0KKwlpZiAobGlrZWx5KG9mZnNldCkpDQorCQly ZXR1cm4gcGl2b3RzW29mZnNldCAtIDFdICsgMTsNCisNCisJcmV0dXJuIG1hcy0+bWluOw0KK30N CisNCisvKg0KKyAqIG1hc19sb2dpY2FsX3Bpdm90KCkgLSBHZXQgdGhlIGxvZ2ljYWwgcGl2b3Qg b2YgYSBnaXZlbiBvZmZzZXQuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQHBpdm90 czogVGhlIHBvaW50ZXIgdG8gdGhlIG1hcGxlIG5vZGUgcGl2b3RzDQorICogQG9mZnNldDogVGhl IG9mZnNldCBpbnRvIHRoZSBwaXZvdCBhcnJheQ0KKyAqIEB0eXBlOiBUaGUgbWFwbGUgbm9kZSB0 eXBlDQorICoNCisgKiBXaGVuIHRoZXJlIGlzIG5vIHZhbHVlIGF0IGEgcGl2b3QgKGJleW9uZCB0 aGUgZW5kIG9mIHRoZSBkYXRhKSwgdGhlbiB0aGUNCisgKiBwaXZvdCBpcyBhY3R1YWxseSBAbWFz LT5tYXguDQorICoNCisgKiBSZXR1cm46IHRoZSBsb2dpY2FsIHBpdm90IG9mIGEgZ2l2ZW4gQG9m ZnNldC4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcNCittYXNfbG9naWNhbF9w aXZvdChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyAqcGl2b3RzLA0KKwkJICB1 bnNpZ25lZCBjaGFyIG9mZnNldCwgZW51bSBtYXBsZV90eXBlIHR5cGUpDQorew0KKwl1bnNpZ25l ZCBsb25nIGxwaXYgPSBtYXNfc2FmZV9waXZvdChtYXMsIHBpdm90cywgb2Zmc2V0LCB0eXBlKTsN CisNCisJaWYgKGxpa2VseShscGl2KSkNCisJCXJldHVybiBscGl2Ow0KKw0KKwlpZiAobGlrZWx5 KG9mZnNldCkpDQorCQlyZXR1cm4gbWFzLT5tYXg7DQorDQorCXJldHVybiBscGl2Ow0KK30NCisN CisvKg0KKyAqIG10ZV9zZXRfcGl2b3QoKSAtIFNldCBhIHBpdm90IHRvIGEgdmFsdWUgaW4gYW4g ZW5jb2RlZCBtYXBsZSBub2RlLg0KKyAqIEBtbjogVGhlIGVuY29kZWQgbWFwbGUgbm9kZQ0KKyAq IEBwaXY6IFRoZSBwaXZvdCBvZmZzZXQNCisgKiBAdmFsOiBUaGUgdmFsdWUgb2YgdGhlIHBpdm90 DQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG10ZV9zZXRfcGl2b3Qoc3RydWN0IG1hcGxlX2Vu b2RlICptbiwgdW5zaWduZWQgY2hhciBwaXYsDQorCQkJCXVuc2lnbmVkIGxvbmcgdmFsKQ0KK3sN CisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGUgPSBtdGVfdG9fbm9kZShtbik7DQorCWVudW0gbWFw bGVfdHlwZSB0eXBlID0gbXRlX25vZGVfdHlwZShtbik7DQorDQorCUJVR19PTihwaXYgPj0gbXRf cGl2b3RzW3R5cGVdKTsNCisJc3dpdGNoICh0eXBlKSB7DQorCWRlZmF1bHQ6DQorCWNhc2UgbWFw bGVfcmFuZ2VfNjQ6DQorCWNhc2UgbWFwbGVfbGVhZl82NDoNCisJCW5vZGUtPm1yNjQucGl2b3Rb cGl2XSA9IHZhbDsNCisJCWJyZWFrOw0KKwljYXNlIG1hcGxlX2FyYW5nZV82NDoNCisJCW5vZGUt Pm1hNjQucGl2b3RbcGl2XSA9IHZhbDsNCisJCWJyZWFrOw0KKwljYXNlIG1hcGxlX2RlbnNlOg0K KwkJYnJlYWs7DQorCX0NCisNCit9DQorDQorLyoNCisgKiBtYV9zbG90cygpIC0gR2V0IGEgcG9p bnRlciB0byB0aGUgbWFwbGUgbm9kZSBzbG90cy4NCisgKiBAbW46IFRoZSBtYXBsZSBub2RlDQor ICogQG10OiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICoNCisgKiBSZXR1cm46IEEgcG9pbnRlciB0 byB0aGUgbWFwbGUgbm9kZSBzbG90cw0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3JjdSAq Km1hX3Nsb3RzKHN0cnVjdCBtYXBsZV9ub2RlICptbiwgZW51bSBtYXBsZV90eXBlIG10KQ0KK3sN CisJc3dpdGNoIChtdCkgew0KKwlkZWZhdWx0Og0KKwljYXNlIG1hcGxlX2FyYW5nZV82NDoNCisJ CXJldHVybiBtbi0+bWE2NC5zbG90Ow0KKwljYXNlIG1hcGxlX3JhbmdlXzY0Og0KKwljYXNlIG1h cGxlX2xlYWZfNjQ6DQorCQlyZXR1cm4gbW4tPm1yNjQuc2xvdDsNCisJY2FzZSBtYXBsZV9kZW5z ZToNCisJCXJldHVybiBtbi0+c2xvdDsNCisJfQ0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wg bXRfbG9ja2VkKGNvbnN0IHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCXJldHVybiBtdF9l eHRlcm5hbF9sb2NrKG10KSA/IG10X2xvY2tfaXNfaGVsZChtdCkgOg0KKwkJbG9ja2RlcF9pc19o ZWxkKCZtdC0+bWFfbG9jayk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbXRfc2xvdChj b25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsDQorCQl2b2lkIF9fcmN1ICoqc2xvdHMsIHVuc2ln bmVkIGNoYXIgb2Zmc2V0KQ0KK3sNCisJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZV9jaGVjayhzbG90 c1tvZmZzZXRdLCBtdF9sb2NrZWQobXQpKTsNCit9DQorDQorLyoNCisgKiBtYXNfc2xvdF9sb2Nr ZWQoKSAtIEdldCB0aGUgc2xvdCB2YWx1ZSB3aGVuIGhvbGRpbmcgdGhlIG1hcGxlIHRyZWUgbG9j ay4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAc2xvdHM6IFRoZSBwb2ludGVyIHRv IHRoZSBzbG90cw0KKyAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgaW50byB0aGUgc2xvdHMgYXJyYXkg dG8gZmV0Y2gNCisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IHN0b3JlZCBpbiBAc2xvdHMgYXQg dGhlIEBvZmZzZXQuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkICptYXNfc2xvdF9sb2NrZWQo c3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgX19yY3UgKipzbG90cywNCisJCQkJICAgICAgIHVu c2lnbmVkIGNoYXIgb2Zmc2V0KQ0KK3sNCisJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0 ZWQoc2xvdHNbb2Zmc2V0XSwgbXRfbG9ja2VkKG1hcy0+dHJlZSkpOw0KK30NCisNCisvKg0KKyAq IG1hc19zbG90KCkgLSBHZXQgdGhlIHNsb3QgdmFsdWUgd2hlbiBub3QgaG9sZGluZyB0aGUgbWFw bGUgdHJlZSBsb2NrLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBzbG90czogVGhl IHBvaW50ZXIgdG8gdGhlIHNsb3RzDQorICogQG9mZnNldDogVGhlIG9mZnNldCBpbnRvIHRoZSBz bG90cyBhcnJheSB0byBmZXRjaA0KKyAqDQorICogUmV0dXJuOiBUaGUgZW50cnkgc3RvcmVkIGlu IEBzbG90cyBhdCB0aGUgQG9mZnNldA0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbWFzX3Ns b3Qoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgX19yY3UgKipzbG90cywNCisJCQkgICAgIHVu c2lnbmVkIGNoYXIgb2Zmc2V0KQ0KK3sNCisJcmV0dXJuIG10X3Nsb3QobWFzLT50cmVlLCBzbG90 cywgb2Zmc2V0KTsNCit9DQorDQorLyoNCisgKiBtYXNfcm9vdCgpIC0gR2V0IHRoZSBtYXBsZSB0 cmVlIHJvb3QuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlLg0KKyAqDQorICogUmV0dXJuOiBU aGUgcG9pbnRlciB0byB0aGUgcm9vdCBvZiB0aGUgdHJlZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUg dm9pZCAqbWFzX3Jvb3Qoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwlyZXR1cm4gcmN1X2Rl cmVmZXJlbmNlX2NoZWNrKG1hcy0+dHJlZS0+bWFfcm9vdCwgbXRfbG9ja2VkKG1hcy0+dHJlZSkp Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgKm10X3Jvb3RfbG9ja2VkKHN0cnVjdCBtYXBs ZV90cmVlICptdCkNCit7DQorCXJldHVybiByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG10LT5t YV9yb290LCBtdF9sb2NrZWQobXQpKTsNCit9DQorDQorLyoNCisgKiBtYXNfcm9vdF9sb2NrZWQo KSAtIEdldCB0aGUgbWFwbGUgdHJlZSByb290IHdoZW4gaG9sZGluZyB0aGUgbWFwbGUgdHJlZSBs b2NrLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIFJldHVybjogVGhlIHBv aW50ZXIgdG8gdGhlIHJvb3Qgb2YgdGhlIHRyZWUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQg Km1hc19yb290X2xvY2tlZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXJldHVybiBtdF9y b290X2xvY2tlZChtYXMtPnRyZWUpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtYXBs ZV9tZXRhZGF0YSAqbWFfbWV0YShzdHJ1Y3QgbWFwbGVfbm9kZSAqbW4sDQorCQkJCQkgICAgIGVu dW0gbWFwbGVfdHlwZSBtdCkNCit7DQorCXN3aXRjaCAobXQpIHsNCisJY2FzZSBtYXBsZV9hcmFu Z2VfNjQ6DQorCQlyZXR1cm4gJm1uLT5tYTY0Lm1ldGE7DQorCWRlZmF1bHQ6DQorCQlyZXR1cm4g Jm1uLT5tcjY0Lm1ldGE7DQorCX0NCit9DQorDQorLyoNCisgKiBtYV9zZXRfbWV0YSgpIC0gU2V0 IHRoZSBtZXRhZGF0YSBpbmZvcm1hdGlvbiBvZiBhIG5vZGUuDQorICogQG1uOiBUaGUgbWFwbGUg bm9kZQ0KKyAqIEBtdDogVGhlIG1hcGxlIG5vZGUgdHlwZQ0KKyAqIEBvZmZzZXQ6IFRoZSBvZmZz ZXQgb2YgdGhlIGhpZ2hlc3Qgc3ViLWdhcCBpbiB0aGlzIG5vZGUuDQorICogQGVuZDogVGhlIGVu ZCBvZiB0aGUgZGF0YSBpbiB0aGlzIG5vZGUuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1h X3NldF9tZXRhKHN0cnVjdCBtYXBsZV9ub2RlICptbiwgZW51bSBtYXBsZV90eXBlIG10LA0KKwkJ CSAgICAgICB1bnNpZ25lZCBjaGFyIG9mZnNldCwgdW5zaWduZWQgY2hhciBlbmQpDQorew0KKwlz dHJ1Y3QgbWFwbGVfbWV0YWRhdGEgKm1ldGEgPSBtYV9tZXRhKG1uLCBtdCk7DQorDQorCW1ldGEt PmdhcCA9IG9mZnNldDsNCisJbWV0YS0+ZW5kID0gZW5kOw0KK30NCisNCisvKg0KKyAqIG1hX21l dGFfZW5kKCkgLSBHZXQgdGhlIGRhdGEgZW5kIG9mIGEgbm9kZSBmcm9tIHRoZSBtZXRhZGF0YQ0K KyAqIEBtbjogVGhlIG1hcGxlIG5vZGUNCisgKiBAbXQ6IFRoZSBtYXBsZSBub2RlIHR5cGUNCisg Ki8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgbWFfbWV0YV9lbmQoc3RydWN0IG1hcGxl X25vZGUgKm1uLA0KKwkJCQkJZW51bSBtYXBsZV90eXBlIG10KQ0KK3sNCisJc3RydWN0IG1hcGxl X21ldGFkYXRhICptZXRhID0gbWFfbWV0YShtbiwgbXQpOw0KKw0KKwlyZXR1cm4gbWV0YS0+ZW5k Ow0KK30NCisNCisvKg0KKyAqIG1hX21ldGFfZ2FwKCkgLSBHZXQgdGhlIGxhcmdlc3QgZ2FwIGxv Y2F0aW9uIG9mIGEgbm9kZSBmcm9tIHRoZSBtZXRhZGF0YQ0KKyAqIEBtbjogVGhlIG1hcGxlIG5v ZGUNCisgKiBAbXQ6IFRoZSBtYXBsZSBub2RlIHR5cGUNCisgKi8NCitzdGF0aWMgaW5saW5lIHVu c2lnbmVkIGNoYXIgbWFfbWV0YV9nYXAoc3RydWN0IG1hcGxlX25vZGUgKm1uLA0KKwkJCQkJZW51 bSBtYXBsZV90eXBlIG10KQ0KK3sNCisJQlVHX09OKG10ICE9IG1hcGxlX2FyYW5nZV82NCk7DQor DQorCXJldHVybiBtbi0+bWE2NC5tZXRhLmdhcDsNCit9DQorDQorLyoNCisgKiBtYV9zZXRfbWV0 YV9nYXAoKSAtIFNldCB0aGUgbGFyZ2VzdCBnYXAgbG9jYXRpb24gaW4gYSBub2RlcyBtZXRhZGF0 YQ0KKyAqIEBtbjogVGhlIG1hcGxlIG5vZGUNCisgKiBAbW46IFRoZSBtYXBsZSBub2RlIHR5cGUN CisgKiBAb2Zmc2V0OiBUaGUgbG9jYXRpb24gb2YgdGhlIGxhcmdlc3QgZ2FwLg0KKyAqLw0KK3N0 YXRpYyBpbmxpbmUgdm9pZCBtYV9zZXRfbWV0YV9nYXAoc3RydWN0IG1hcGxlX25vZGUgKm1uLCBl bnVtIG1hcGxlX3R5cGUgbXQsDQorCQkJCSAgIHVuc2lnbmVkIGNoYXIgb2Zmc2V0KQ0KK3sNCisN CisJc3RydWN0IG1hcGxlX21ldGFkYXRhICptZXRhID0gbWFfbWV0YShtbiwgbXQpOw0KKw0KKwlt ZXRhLT5nYXAgPSBvZmZzZXQ7DQorfQ0KKw0KKy8qDQorICogbWF0X2FkZCgpIC0gQWRkIGEgQGRl YWRfZW5vZGUgdG8gdGhlIG1hX3RvcGlhcnkgb2YgYSBsaXN0IG9mIGRlYWQgbm9kZXMuDQorICog QG1hdCAtIHRoZSBtYV90b3BpYXJ5LCBhIGxpbmtlZCBsaXN0IG9mIGRlYWQgbm9kZXMuDQorICog QGRlYWRfZW5vZGUgLSB0aGUgbm9kZSB0byBiZSBtYXJrZWQgYXMgZGVhZCBhbmQgYWRkZWQgdG8g dGhlIHRhaWwgb2YgdGhlIGxpc3QNCisgKg0KKyAqIEFkZCB0aGUgQGRlYWRfZW5vZGUgdG8gdGhl IGxpbmtlZCBsaXN0IGluIEBtYXQuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hdF9hZGQo c3RydWN0IG1hX3RvcGlhcnkgKm1hdCwNCisJCQkgICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKmRlYWRf ZW5vZGUpDQorew0KKwltdGVfc2V0X25vZGVfZGVhZChkZWFkX2Vub2RlKTsNCisJbXRlX3RvX21h dChkZWFkX2Vub2RlKS0+bmV4dCA9IE5VTEw7DQorCWlmICghbWF0LT50YWlsKSB7DQorCQltYXQt PnRhaWwgPSBtYXQtPmhlYWQgPSBkZWFkX2Vub2RlOw0KKwkJcmV0dXJuOw0KKwl9DQorDQorCW10 ZV90b19tYXQobWF0LT50YWlsKS0+bmV4dCA9IGRlYWRfZW5vZGU7DQorCW1hdC0+dGFpbCA9IGRl YWRfZW5vZGU7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG10ZV9kZXN0cm95X3dhbGsoc3RydWN0IG1h cGxlX2Vub2RlICosIHN0cnVjdCBtYXBsZV90cmVlICopOw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBt YXNfZnJlZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0IG1hcGxlX2Vub2RlICp1c2VkKTsN CisNCisvKg0KKyAqIG1hc19tYXRfZnJlZSgpIC0gRnJlZSBhbGwgbm9kZXMgaW4gYSBkZWFkIGxp c3QuDQorICogQG1hcyAtIHRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtYXQgLSB0aGUgbWFfdG9waWFy eSBsaW5rZWQgbGlzdCBvZiBkZWFkIG5vZGVzIHRvIGZyZWUuDQorICoNCisgKiBGcmVlIHdhbGsg YSBkZWFkIGxpc3QuDQorICovDQorc3RhdGljIHZvaWQgbWFzX21hdF9mcmVlKHN0cnVjdCBtYV9z dGF0ZSAqbWFzLCBzdHJ1Y3QgbWFfdG9waWFyeSAqbWF0KQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vu b2RlICpuZXh0Ow0KKw0KKwl3aGlsZSAobWF0LT5oZWFkKSB7DQorCQluZXh0ID0gbXRlX3RvX21h dChtYXQtPmhlYWQpLT5uZXh0Ow0KKwkJbWFzX2ZyZWUobWFzLCBtYXQtPmhlYWQpOw0KKwkJbWF0 LT5oZWFkID0gbmV4dDsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc19tYXRfZGVzdHJveSgpIC0g RnJlZSBhbGwgbm9kZXMgYW5kIHN1YnRyZWVzIGluIGEgZGVhZCBsaXN0Lg0KKyAqIEBtYXMgLSB0 aGUgbWFwbGUgc3RhdGUNCisgKiBAbWF0IC0gdGhlIG1hX3RvcGlhcnkgbGlua2VkIGxpc3Qgb2Yg ZGVhZCBub2RlcyB0byBmcmVlLg0KKyAqDQorICogRGVzdHJveSB3YWxrIGEgZGVhZCBsaXN0Lg0K KyAqLw0KK3N0YXRpYyB2b2lkIG1hc19tYXRfZGVzdHJveShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywg c3RydWN0IG1hX3RvcGlhcnkgKm1hdCkNCit7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbmV4dDsN CisNCisJd2hpbGUgKG1hdC0+aGVhZCkgew0KKwkJbmV4dCA9IG10ZV90b19tYXQobWF0LT5oZWFk KS0+bmV4dDsNCisJCW10ZV9kZXN0cm95X3dhbGsobWF0LT5oZWFkLCBtYXQtPm10cmVlKTsNCisJ CW1hdC0+aGVhZCA9IG5leHQ7DQorCX0NCit9DQorLyoNCisgKiBtYXNfZGVzY2VuZCgpIC0gRGVz Y2VuZCBpbnRvIHRoZSBzbG90IHN0b3JlZCBpbiB0aGUgbWFfc3RhdGUuDQorICogQG1hcyAtIHRo ZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIE5vdGU6IE5vdCBSQ1Ugc2FmZSwgb25seSB1c2UgaW4g d3JpdGUgc2lkZSBvciBkZWJ1ZyBjb2RlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNf ZGVzY2VuZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBl Ow0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOw0K Kwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorDQorCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJdHlwZSA9 IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJcGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIHR5 cGUpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIHR5cGUpOw0KKw0KKwlpZiAobWFzLT5vZmZz ZXQpDQorCQltYXMtPm1pbiA9IHBpdm90c1ttYXMtPm9mZnNldCAtIDFdICsgMTsNCisJbWFzLT5t YXggPSBtYXNfc2FmZV9waXZvdChtYXMsIHBpdm90cywgbWFzLT5vZmZzZXQsIHR5cGUpOw0KKwlt YXMtPm5vZGUgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBtYXMtPm9mZnNldCk7DQorfQ0KKw0KKy8q DQorICogbXRlX3NldF9nYXAoKSAtIFNldCBhIG1hcGxlIG5vZGUgZ2FwLg0KKyAqIEBtbjogVGhl IGVuY29kZWQgbWFwbGUgbm9kZQ0KKyAqIEBnYXA6IFRoZSBvZmZzZXQgb2YgdGhlIGdhcCB0byBz ZXQNCisgKiBAdmFsOiBUaGUgZ2FwIHZhbHVlDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG10 ZV9zZXRfZ2FwKGNvbnN0IHN0cnVjdCBtYXBsZV9lbm9kZSAqbW4sDQorCQkJCSB1bnNpZ25lZCBj aGFyIGdhcCwgdW5zaWduZWQgbG9uZyB2YWwpDQorew0KKwlzd2l0Y2ggKG10ZV9ub2RlX3R5cGUo bW4pKSB7DQorCWRlZmF1bHQ6DQorCQlicmVhazsNCisJY2FzZSBtYXBsZV9hcmFuZ2VfNjQ6DQor CQltdGVfdG9fbm9kZShtbiktPm1hNjQuZ2FwW2dhcF0gPSB2YWw7DQorCQlicmVhazsNCisJfQ0K K30NCisNCisvKg0KKyAqIG1hc19hc2NlbmQoKSAtIFdhbGsgdXAgYSBsZXZlbCBvZiB0aGUgdHJl ZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKg0KKyAqIFNldHMgdGhlIEBtYXMtPm1h eCBhbmQgQG1hcy0+bWluIHRvIHRoZSBjb3JyZWN0IHZhbHVlcyB3aGVuIHdhbGtpbmcgdXAuICBU aGlzDQorICogbWF5IGNhdXNlIHNldmVyYWwgbGV2ZWxzIG9mIHdhbGtpbmcgdXAgdG8gZmluZCB0 aGUgY29ycmVjdCBtaW4gYW5kIG1heC4NCisgKiBNYXkgZmluZCBhIGRlYWQgbm9kZSB3aGljaCB3 aWxsIGNhdXNlIGEgcHJlbWF0dXJlIHJldHVybi4NCisgKiBSZXR1cm46IDEgb24gZGVhZCBub2Rl LCAwIG90aGVyd2lzZQ0KKyAqLw0KK3N0YXRpYyBpbnQgbWFzX2FzY2VuZChzdHJ1Y3QgbWFfc3Rh dGUgKm1hcykNCit7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqcF9lbm9kZTsgLyogcGFyZW50IGVu b2RlLiAqLw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmFfZW5vZGU7IC8qIGFuY2VzdG9yIGVub2Rl LiAqLw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqYV9ub2RlOyAvKiBhbmNlc3RvciBub2RlLiAqLw0K KwlzdHJ1Y3QgbWFwbGVfbm9kZSAqcF9ub2RlOyAvKiBwYXJlbnQgbm9kZS4gKi8NCisJdW5zaWdu ZWQgY2hhciBhX3Nsb3Q7DQorCWVudW0gbWFwbGVfdHlwZSBhX3R5cGU7DQorCXVuc2lnbmVkIGxv bmcgbWluLCBtYXg7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJdW5zaWduZWQgY2hhciBv ZmZzZXQ7DQorCWJvb2wgc2V0X21heCA9IGZhbHNlLCBzZXRfbWluID0gZmFsc2U7DQorDQorCWFf bm9kZSA9IG1hc19tbihtYXMpOw0KKwlpZiAobWFfaXNfcm9vdChhX25vZGUpKSB7DQorCQltYXMt Pm9mZnNldCA9IDA7DQorCQlyZXR1cm4gMDsNCisJfQ0KKw0KKwlwX25vZGUgPSBtdGVfcGFyZW50 KG1hcy0+bm9kZSk7DQorCWlmICh1bmxpa2VseShhX25vZGUgPT0gcF9ub2RlKSkNCisJCXJldHVy biAxOw0KKwlhX3R5cGUgPSBtYXNfcGFyZW50X2VudW0obWFzLCBtYXMtPm5vZGUpOw0KKwlvZmZz ZXQgPSBtdGVfcGFyZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJYV9lbm9kZSA9IG10X21rX25vZGUo cF9ub2RlLCBhX3R5cGUpOw0KKw0KKwkvKiBDaGVjayB0byBtYWtlIHN1cmUgYWxsIHBhcmVudCBp bmZvcm1hdGlvbiBpcyBzdGlsbCBhY2N1cmF0ZSAqLw0KKwlpZiAocF9ub2RlICE9IG10ZV9wYXJl bnQobWFzLT5ub2RlKSkNCisJCXJldHVybiAxOw0KKw0KKwltYXMtPm5vZGUgPSBhX2Vub2RlOw0K KwltYXMtPm9mZnNldCA9IG9mZnNldDsNCisNCisJaWYgKG10ZV9pc19yb290KGFfZW5vZGUpKSB7 DQorCQltYXMtPm1heCA9IFVMT05HX01BWDsNCisJCW1hcy0+bWluID0gMDsNCisJCXJldHVybiAw Ow0KKwl9DQorDQorCW1pbiA9IDA7DQorCW1heCA9IFVMT05HX01BWDsNCisJZG8gew0KKwkJcF9l bm9kZSA9IGFfZW5vZGU7DQorCQlhX3R5cGUgPSBtYXNfcGFyZW50X2VudW0obWFzLCBwX2Vub2Rl KTsNCisJCWFfbm9kZSA9IG10ZV9wYXJlbnQocF9lbm9kZSk7DQorCQlhX3Nsb3QgPSBtdGVfcGFy ZW50X3Nsb3QocF9lbm9kZSk7DQorCQlwaXZvdHMgPSBtYV9waXZvdHMoYV9ub2RlLCBhX3R5cGUp Ow0KKwkJYV9lbm9kZSA9IG10X21rX25vZGUoYV9ub2RlLCBhX3R5cGUpOw0KKw0KKwkJaWYgKCFz ZXRfbWluICYmIGFfc2xvdCkgew0KKwkJCXNldF9taW4gPSB0cnVlOw0KKwkJCW1pbiA9IHBpdm90 c1thX3Nsb3QgLSAxXSArIDE7DQorCQl9DQorDQorCQlpZiAoIXNldF9tYXggJiYgYV9zbG90IDwg bXRfcGl2b3RzW2FfdHlwZV0pIHsNCisJCQlzZXRfbWF4ID0gdHJ1ZTsNCisJCQltYXggPSBwaXZv dHNbYV9zbG90XTsNCisJCX0NCisNCisJCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUoYV9ub2Rl KSkpDQorCQkJcmV0dXJuIDE7DQorDQorCQlpZiAodW5saWtlbHkobWFfaXNfcm9vdChhX25vZGUp KSkNCisJCQlicmVhazsNCisNCisJfSB3aGlsZSAoIXNldF9taW4gfHwgIXNldF9tYXgpOw0KKw0K KwltYXMtPm1heCA9IG1heDsNCisJbWFzLT5taW4gPSBtaW47DQorCXJldHVybiAwOw0KK30NCisN CisvKg0KKyAqIG1hc19wb3Bfbm9kZSgpIC0gR2V0IGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgbWFw bGUgbm9kZSBmcm9tIHRoZSBtYXBsZSBzdGF0ZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUN CisgKg0KKyAqIFJldHVybjogQSBwb2ludGVyIHRvIGEgbWFwbGUgbm9kZS4NCisgKi8NCitzdGF0 aWMgaW5saW5lIHN0cnVjdCBtYXBsZV9ub2RlICptYXNfcG9wX25vZGUoc3RydWN0IG1hX3N0YXRl ICptYXMpDQorew0KKwlzdHJ1Y3QgbWFwbGVfYWxsb2MgKnJldCwgKm5vZGUgPSBtYXMtPmFsbG9j Ow0KKwl1bnNpZ25lZCBsb25nIHRvdGFsID0gbWFzX2FsbG9jYXRlZChtYXMpOw0KKw0KKwkvKiBu b3RoaW5nIG9yIGEgcmVxdWVzdCBwZW5kaW5nLiAqLw0KKwlpZiAodW5saWtlbHkoIXRvdGFsKSkN CisJCXJldHVybiBOVUxMOw0KKw0KKwlpZiAodG90YWwgPT0gMSkgew0KKwkJLyogc2luZ2xlIGFs bG9jYXRpb24gaW4gdGhpcyBtYV9zdGF0ZSAqLw0KKwkJbWFzLT5hbGxvYyA9IE5VTEw7DQorCQly ZXQgPSBub2RlOw0KKwkJZ290byBzaW5nbGVfbm9kZTsNCisJfQ0KKw0KKwlpZiAoIW5vZGUtPm5v ZGVfY291bnQpIHsNCisJCS8qIFNpbmdsZSBhbGxvY2F0aW9uIGluIHRoaXMgbm9kZS4gKi8NCisJ CW1hcy0+YWxsb2MgPSBub2RlLT5zbG90WzBdOw0KKwkJbm9kZS0+c2xvdFswXSA9IE5VTEw7DQor CQltYXMtPmFsbG9jLT50b3RhbCA9IG5vZGUtPnRvdGFsIC0gMTsNCisJCXJldCA9IG5vZGU7DQor CQlnb3RvIG5ld19oZWFkOw0KKwl9DQorDQorCW5vZGUtPnRvdGFsLS07DQorCXJldCA9IG5vZGUt PnNsb3Rbbm9kZS0+bm9kZV9jb3VudF07DQorCW5vZGUtPnNsb3Rbbm9kZS0+bm9kZV9jb3VudC0t XSA9IE5VTEw7DQorDQorc2luZ2xlX25vZGU6DQorbmV3X2hlYWQ6DQorCXJldC0+dG90YWwgPSAw Ow0KKwlyZXQtPm5vZGVfY291bnQgPSAwOw0KKwlpZiAocmV0LT5yZXF1ZXN0X2NvdW50KSB7DQor CQltYXNfc2V0X2FsbG9jX3JlcShtYXMsIHJldC0+cmVxdWVzdF9jb3VudCArIDEpOw0KKwkJcmV0 LT5yZXF1ZXN0X2NvdW50ID0gMDsNCisJfQ0KKwlyZXR1cm4gKHN0cnVjdCBtYXBsZV9ub2RlICop cmV0Ow0KK30NCisNCisvKg0KKyAqIG1hc19wdXNoX25vZGUoKSAtIFB1c2ggYSBub2RlIGJhY2sg b24gdGhlIG1hcGxlIHN0YXRlIGFsbG9jYXRpb24uDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRl DQorICogQHVzZWQ6IFRoZSB1c2VkIG1hcGxlIG5vZGUNCisgKg0KKyAqIFN0b3JlcyB0aGUgbWFw bGUgbm9kZSBiYWNrIGludG8gQG1hcy0+YWxsb2MgZm9yIHJldXNlLiAgVXBkYXRlcyBhbGxvY2F0 ZWQgYW5kDQorICogcmVxdWVzdGVkIG5vZGUgY291bnQgYXMgbmVjZXNzYXJ5Lg0KKyAqLw0KK3N0 YXRpYyBpbmxpbmUgdm9pZCBtYXNfcHVzaF9ub2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1 Y3QgbWFwbGVfbm9kZSAqdXNlZCkNCit7DQorCXN0cnVjdCBtYXBsZV9hbGxvYyAqcmV1c2UgPSAo c3RydWN0IG1hcGxlX2FsbG9jICopdXNlZDsNCisJc3RydWN0IG1hcGxlX2FsbG9jICpoZWFkID0g bWFzLT5hbGxvYzsNCisJdW5zaWduZWQgbG9uZyBjb3VudDsNCisJdW5zaWduZWQgaW50IHJlcXVl c3RlZCA9IG1hc19hbGxvY19yZXEobWFzKTsNCisNCisJbWVtc2V0KHJldXNlLCAwLCBzaXplb2Yo KnJldXNlKSk7DQorCWNvdW50ID0gbWFzX2FsbG9jYXRlZChtYXMpOw0KKw0KKwlpZiAoY291bnQg JiYgKGhlYWQtPm5vZGVfY291bnQgPCBNQVBMRV9BTExPQ19TTE9UUyAtIDEpKSB7DQorCQlpZiAo aGVhZC0+c2xvdFswXSkNCisJCQloZWFkLT5ub2RlX2NvdW50Kys7DQorCQloZWFkLT5zbG90W2hl YWQtPm5vZGVfY291bnRdID0gcmV1c2U7DQorCQloZWFkLT50b3RhbCsrOw0KKwkJZ290byBkb25l Ow0KKwl9DQorDQorCXJldXNlLT50b3RhbCA9IDE7DQorCWlmICgoaGVhZCkgJiYgISgodW5zaWdu ZWQgbG9uZyloZWFkICYgMHgxKSkgew0KKwkJaGVhZC0+cmVxdWVzdF9jb3VudCA9IDA7DQorCQly ZXVzZS0+c2xvdFswXSA9IGhlYWQ7DQorCQlyZXVzZS0+dG90YWwgKz0gaGVhZC0+dG90YWw7DQor CX0NCisNCisJbWFzLT5hbGxvYyA9IHJldXNlOw0KK2RvbmU6DQorCWlmIChyZXF1ZXN0ZWQgPiAx KQ0KKwkJbWFzX3NldF9hbGxvY19yZXEobWFzLCByZXF1ZXN0ZWQgLSAxKTsNCit9DQorDQorLyoN CisgKiBtYXNfYWxsb2Nfbm9kZXMoKSAtIEFsbG9jYXRlIG5vZGVzIGludG8gYSBtYXBsZSBzdGF0 ZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBnZnA6IFRoZSBHRlAgRmxhZ3MNCisg Ki8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2FsbG9jX25vZGVzKHN0cnVjdCBtYV9zdGF0ZSAq bWFzLCBnZnBfdCBnZnApDQorew0KKwlzdHJ1Y3QgbWFwbGVfYWxsb2MgKm5vZGU7DQorCXN0cnVj dCBtYXBsZV9hbGxvYyAqKm5vZGVwID0gJm1hcy0+YWxsb2M7DQorCXVuc2lnbmVkIGxvbmcgYWxs b2NhdGVkID0gbWFzX2FsbG9jYXRlZChtYXMpOw0KKwl1bnNpZ25lZCBsb25nIHN1Y2Nlc3MgPSBh bGxvY2F0ZWQ7DQorCXVuc2lnbmVkIGludCByZXF1ZXN0ZWQgPSBtYXNfYWxsb2NfcmVxKG1hcyk7 DQorCXVuc2lnbmVkIGludCBjb3VudDsNCisJdm9pZCAqKnNsb3RzID0gTlVMTDsNCisJdW5zaWdu ZWQgaW50IG1heF9yZXEgPSAwOw0KKw0KKwlpZiAoIXJlcXVlc3RlZCkNCisJCXJldHVybjsNCisN CisJbWFzX3NldF9hbGxvY19yZXEobWFzLCAwKTsNCisJaWYgKCFhbGxvY2F0ZWQgfHwgbWFzLT5h bGxvYy0+bm9kZV9jb3VudCA9PSBNQVBMRV9BTExPQ19TTE9UUyAtIDEpIHsNCisJCW5vZGUgPSAo c3RydWN0IG1hcGxlX2FsbG9jICopbXRfYWxsb2Nfb25lKGdmcCk7DQorCQlpZiAoIW5vZGUpDQor CQkJZ290byBub21lbV9vbmU7DQorDQorCQlpZiAoYWxsb2NhdGVkKQ0KKwkJCW5vZGUtPnNsb3Rb MF0gPSBtYXMtPmFsbG9jOw0KKw0KKwkJc3VjY2VzcysrOw0KKwkJbWFzLT5hbGxvYyA9IG5vZGU7 DQorCQlyZXF1ZXN0ZWQtLTsNCisJfQ0KKw0KKwlub2RlID0gbWFzLT5hbGxvYzsNCisJd2hpbGUg KHJlcXVlc3RlZCkgew0KKwkJbWF4X3JlcSA9IE1BUExFX05PREVfU0xPVFMgLSAxOw0KKwkJaWYg KG5vZGUtPnNsb3RbMF0pIHsNCisJCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gbm9kZS0+bm9kZV9j b3VudCArIDE7DQorDQorCQkJc2xvdHMgPSAodm9pZCAqKikmbm9kZS0+c2xvdFtvZmZzZXRdOw0K KwkJCW1heF9yZXEgLT0gb2Zmc2V0Ow0KKwkJfSBlbHNlIHsNCisJCQlzbG90cyA9ICh2b2lkICoq KSZub2RlLT5zbG90Ow0KKwkJfQ0KKw0KKwkJbWF4X3JlcSA9IG1pbihyZXF1ZXN0ZWQsIG1heF9y ZXEpOw0KKwkJY291bnQgPSBtdF9hbGxvY19idWxrKGdmcCwgbWF4X3JlcSwgc2xvdHMpOw0KKwkJ aWYgKCFjb3VudCkNCisJCQlnb3RvIG5vbWVtX2J1bGs7DQorDQorCQlub2RlLT5ub2RlX2NvdW50 ICs9IGNvdW50Ow0KKwkJLyogemVybyBpbmRleGVkLiAqLw0KKwkJaWYgKHNsb3RzID09ICh2b2lk ICoqKSZub2RlLT5zbG90KQ0KKwkJCW5vZGUtPm5vZGVfY291bnQtLTsNCisNCisJCXN1Y2Nlc3Mg Kz0gY291bnQ7DQorCQlub2RlcCA9ICZub2RlLT5zbG90WzBdOw0KKwkJbm9kZSA9ICpub2RlcDsN CisJCXJlcXVlc3RlZCAtPSBjb3VudDsNCisJfQ0KKwltYXMtPmFsbG9jLT50b3RhbCA9IHN1Y2Nl c3M7DQorCXJldHVybjsNCisNCitub21lbV9idWxrOg0KKwkvKiBDbGVhbiB1cCBwb3RlbnRpYWwg ZnJlZWQgYWxsb2NhdGlvbnMgb24gYnVsayBmYWlsdXJlICovDQorCW1lbXNldChzbG90cywgMCwg bWF4X3JlcSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7DQorbm9tZW1fb25lOg0KKwltYXNfc2V0 X2FsbG9jX3JlcShtYXMsIHJlcXVlc3RlZCk7DQorCWlmIChtYXMtPmFsbG9jICYmICEoKCh1bnNp Z25lZCBsb25nKW1hcy0+YWxsb2MgJiAweDEpKSkNCisJCW1hcy0+YWxsb2MtPnRvdGFsID0gc3Vj Y2VzczsNCisJbWFzX3NldF9lcnIobWFzLCAtRU5PTUVNKTsNCisJcmV0dXJuOw0KKw0KK30NCisN CisvKg0KKyAqIG1hc19mcmVlKCkgLSBGcmVlIGFuIGVuY29kZWQgbWFwbGUgbm9kZQ0KKyAqIEBt YXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEB1c2VkOiBUaGUgZW5jb2RlZCBtYXBsZSBub2RlIHRv IGZyZWUuDQorICoNCisgKiBVc2VzIHJjdSBmcmVlIGlmIG5lY2Vzc2FyeSwgcHVzaGVzIEB1c2Vk IGJhY2sgb24gdGhlIG1hcGxlIHN0YXRlIGFsbG9jYXRpb25zDQorICogb3RoZXJ3aXNlLg0KKyAq Lw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfZnJlZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3Ry dWN0IG1hcGxlX2Vub2RlICp1c2VkKQ0KK3sNCisJc3RydWN0IG1hcGxlX25vZGUgKnRtcCA9IG10 ZV90b19ub2RlKHVzZWQpOw0KKw0KKwlpZiAobXRfaW5fcmN1KG1hcy0+dHJlZSkpDQorCQltYV9m cmVlX3JjdSh0bXApOw0KKwllbHNlDQorCQltYXNfcHVzaF9ub2RlKG1hcywgdG1wKTsNCit9DQor DQorLyoNCisgKiBtYXNfbm9kZV9jb3VudCgpIC0gQ2hlY2sgaWYgZW5vdWdoIG5vZGVzIGFyZSBh bGxvY2F0ZWQgYW5kIHJlcXVlc3QgbW9yZSBpZg0KKyAqIHRoZXJlIGlzIG5vdCBlbm91Z2ggbm9k ZXMuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGNvdW50OiBUaGUgbnVtYmVyIG9m IG5vZGVzIG5lZWRlZA0KKyAqLw0KK3N0YXRpYyB2b2lkIG1hc19ub2RlX2NvdW50KHN0cnVjdCBt YV9zdGF0ZSAqbWFzLCBpbnQgY291bnQpDQorew0KKwl1bnNpZ25lZCBsb25nIGFsbG9jYXRlZCA9 IG1hc19hbGxvY2F0ZWQobWFzKTsNCisNCisJaWYgKGFsbG9jYXRlZCA8IGNvdW50KSB7DQorCQlt YXNfc2V0X2FsbG9jX3JlcShtYXMsIGNvdW50IC0gYWxsb2NhdGVkKTsNCisJCW1hc19hbGxvY19u b2RlcyhtYXMsIEdGUF9OT1dBSVQgfCBfX0dGUF9OT1dBUk4pOw0KKwl9DQorfQ0KKw0KKy8qDQor ICogbWFzX3N0YXJ0KCkgLSBTZXRzIHVwIG1hcGxlIHN0YXRlIGZvciBvcGVyYXRpb25zLg0KKyAq IEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIElmIG1hcy0+bm9kZSA9PSBNQVNfU1RB UlQsIHRoZW4gc2V0IHRoZSBtaW4sIG1heCwgZGVwdGgsIGFuZCBvZmZzZXQgdG8NCisgKiBkZWZh dWx0cy4NCisgKg0KKyAqIFJldHVybjoNCisgKiAtIElmIG1hcy0+bm9kZSBpcyBhbiBlcnJvciBv ciBub3QgTUFTX1NUQVJULCByZXR1cm4gTlVMTC4NCisgKiAtIElmIGl0J3MgYW4gZW1wdHkgdHJl ZTogICAgIE5VTEwgJiBtYXMtPm5vZGUgPT0gTUFTX05PTkUNCisgKiAtIElmIGl0J3MgYSBzaW5n bGUgZW50cnk6ICAgIFRoZSBlbnRyeSAmIG1hcy0+bm9kZSA9PSBNQVNfUk9PVA0KKyAqIC0gSWYg aXQncyBhIHRyZWU6ICAgICAgICAgICAgTlVMTCAmIG1hcy0+bm9kZSA9PSBzYWZlIHJvb3Qgbm9k ZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtYXBsZV9lbm9kZSAqbWFzX3N0YXJ0KHN0 cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJaWYgKGxpa2VseShtYXNfaXNfc3RhcnQobWFzKSkp IHsNCisJCXN0cnVjdCBtYXBsZV9lbm9kZSAqcm9vdDsNCisNCisJCW1hcy0+bm9kZSA9IE1BU19O T05FOw0KKwkJbWFzLT5taW4gPSAwOw0KKwkJbWFzLT5tYXggPSBVTE9OR19NQVg7DQorCQltYXMt PmRlcHRoID0gMDsNCisJCW1hcy0+b2Zmc2V0ID0gMDsNCisNCisJCXJvb3QgPSBtYXNfcm9vdCht YXMpOw0KKwkJLyogVHJlZSB3aXRoIG5vZGVzICovDQorCQlpZiAobGlrZWx5KHhhX2lzX25vZGUo cm9vdCkpKSB7DQorCQkJbWFzLT5ub2RlID0gbXRlX3NhZmVfcm9vdChyb290KTsNCisJCQlyZXR1 cm4gTlVMTDsNCisJCX0NCisNCisJCS8qIGVtcHR5IHRyZWUgKi8NCisJCWlmICh1bmxpa2VseSgh cm9vdCkpIHsNCisJCQltYXMtPm9mZnNldCA9IE1BUExFX05PREVfU0xPVFM7DQorCQkJcmV0dXJu IE5VTEw7DQorCQl9DQorDQorCQkvKiBTaW5nbGUgZW50cnkgdHJlZSAqLw0KKwkJbWFzLT5ub2Rl ID0gTUFTX1JPT1Q7DQorCQltYXMtPm9mZnNldCA9IE1BUExFX05PREVfU0xPVFM7DQorDQorCQkv KiBTaW5nbGUgZW50cnkgdHJlZS4gKi8NCisJCWlmIChtYXMtPmluZGV4ID4gMCkNCisJCQlyZXR1 cm4gTlVMTDsNCisNCisJCXJldHVybiByb290Ow0KKwl9DQorDQorCXJldHVybiBOVUxMOw0KK30N CisNCisvKg0KKyAqIG1hX2RhdGFfZW5kKCkgLSBGaW5kIHRoZSBlbmQgb2YgdGhlIGRhdGEgaW4g YSBub2RlLg0KKyAqIEBub2RlOiBUaGUgbWFwbGUgbm9kZQ0KKyAqIEB0eXBlOiBUaGUgbWFwbGUg bm9kZSB0eXBlDQorICogQHBpdm90czogVGhlIGFycmF5IG9mIHBpdm90cyBpbiB0aGUgbm9kZQ0K KyAqIEBtYXg6IFRoZSBtYXhpbXVtIHZhbHVlIGluIHRoZSBub2RlDQorICoNCisgKiBVc2VzIG1l dGFkYXRhIHRvIGZpbmQgdGhlIGVuZCBvZiB0aGUgZGF0YSB3aGVuIHBvc3NpYmxlLg0KKyAqIFJl dHVybjogVGhlIHplcm8gaW5kZXhlZCBsYXN0IHNsb3Qgd2l0aCBkYXRhIChtYXkgYmUgbnVsbCku DQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIG1hX2RhdGFfZW5kKHN0cnVjdCBt YXBsZV9ub2RlICpub2RlLA0KKwkJCQkJZW51bSBtYXBsZV90eXBlIHR5cGUsDQorCQkJCQl1bnNp Z25lZCBsb25nICpwaXZvdHMsDQorCQkJCQl1bnNpZ25lZCBsb25nIG1heCkNCit7DQorCXVuc2ln bmVkIGNoYXIgb2Zmc2V0Ow0KKw0KKwlpZiAodHlwZSA9PSBtYXBsZV9hcmFuZ2VfNjQpDQorCQly ZXR1cm4gbWFfbWV0YV9lbmQobm9kZSwgdHlwZSk7DQorDQorCW9mZnNldCA9IG10X3Bpdm90c1t0 eXBlXSAtIDE7DQorCWlmIChsaWtlbHkoIXBpdm90c1tvZmZzZXRdKSkNCisJCXJldHVybiBtYV9t ZXRhX2VuZChub2RlLCB0eXBlKTsNCisNCisJaWYgKGxpa2VseShwaXZvdHNbb2Zmc2V0XSA9PSBt YXgpKQ0KKwkJcmV0dXJuIG9mZnNldDsNCisNCisJcmV0dXJuIG10X3Bpdm90c1t0eXBlXTsNCit9 DQorDQorLyoNCisgKiBtYXNfZGF0YV9lbmQoKSAtIEZpbmQgdGhlIGVuZCBvZiB0aGUgZGF0YSAo c2xvdCkuDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlDQorICogQHR5cGU6IHRoZSB0eXBlIG9m IG1hcGxlIG5vZGUNCisgKg0KKyAqIFRoaXMgbWV0aG9kIGlzIG9wdGltaXplZCB0byBjaGVjayB0 aGUgbWV0YWRhdGEgb2YgYSBub2RlIGlmIHRoZSBub2RlIHR5cGUNCisgKiBzdXBwb3J0cyBkYXRh IGVuZCBtZXRhZGF0YS4NCisgKg0KKyAqIFJldHVybjogVGhlIHplcm8gaW5kZXhlZCBsYXN0IHNs b3Qgd2l0aCBkYXRhIChtYXkgYmUgbnVsbCkuDQorICovDQorc3RhdGljIGlubGluZSB1bnNpZ25l ZCBjaGFyIG1hc19kYXRhX2VuZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCWVudW0gbWFw bGVfdHlwZSB0eXBlOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJdW5zaWduZWQgY2hh ciBvZmZzZXQ7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisNCisJdHlwZSA9IG10ZV9ub2Rl X3R5cGUobWFzLT5ub2RlKTsNCisJbm9kZSA9IG1hc19tbihtYXMpOw0KKwlpZiAodHlwZSA9PSBt YXBsZV9hcmFuZ2VfNjQpDQorCQlyZXR1cm4gbWFfbWV0YV9lbmQobm9kZSwgdHlwZSk7DQorDQor CXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJb2Zmc2V0ID0gbXRfcGl2b3RzW3R5 cGVdIC0gMTsNCisJaWYgKGxpa2VseSghcGl2b3RzW29mZnNldF0pKQ0KKwkJcmV0dXJuIG1hX21l dGFfZW5kKG5vZGUsIHR5cGUpOw0KKw0KKwlpZiAobGlrZWx5KHBpdm90c1tvZmZzZXRdID09IG1h cy0+bWF4KSkNCisJCXJldHVybiBvZmZzZXQ7DQorDQorCXJldHVybiBtdF9waXZvdHNbdHlwZV07 DQorfQ0KKw0KKy8qDQorICogbWFzX2xlYWZfbWF4X2dhcCgpIC0gUmV0dXJucyB0aGUgbGFyZ2Vz dCBnYXAgaW4gYSBsZWFmIG5vZGUNCisgKiBAbWFzIC0gdGhlIG1hcGxlIHN0YXRlDQorICoNCisg KiBSZXR1cm46IFRoZSBtYXhpbXVtIGdhcCBpbiB0aGUgbGVhZi4NCisgKi8NCitzdGF0aWMgdW5z aWduZWQgbG9uZyBtYXNfbGVhZl9tYXhfZ2FwKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJ ZW51bSBtYXBsZV90eXBlIG10Ow0KKwl1bnNpZ25lZCBsb25nIHBzdGFydCwgZ2FwLCBtYXhfZ2Fw Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbW47DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJ dm9pZCBfX3JjdSAqKnNsb3RzOw0KKwl1bnNpZ25lZCBjaGFyIGk7DQorCXVuc2lnbmVkIGNoYXIg bWF4X3BpdjsNCisNCisJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCW1uID0gbWFz X21uKG1hcyk7DQorCXNsb3RzID0gbWFfc2xvdHMobW4sIG10KTsNCisJbWF4X2dhcCA9IDA7DQor CWlmICh1bmxpa2VseShtYV9pc19kZW5zZShtdCkpKSB7DQorCQlnYXAgPSAwOw0KKwkJZm9yIChp ID0gMDsgaSA8IG10X3Nsb3RzW210XTsgaSsrKSB7DQorCQkJaWYgKHNsb3RzW2ldKSB7DQorCQkJ CWlmIChnYXAgPiBtYXhfZ2FwKQ0KKwkJCQkJbWF4X2dhcCA9IGdhcDsNCisJCQkJZ2FwID0gMDsN CisJCQl9IGVsc2Ugew0KKwkJCQlnYXArKzsNCisJCQl9DQorCQl9DQorCQlpZiAoZ2FwID4gbWF4 X2dhcCkNCisJCQltYXhfZ2FwID0gZ2FwOw0KKwkJcmV0dXJuIG1heF9nYXA7DQorCX0NCisNCisJ LyoNCisJICogQ2hlY2sgdGhlIGZpcnN0IGltcGxpZWQgcGl2b3Qgb3B0aW1pemVzIHRoZSBsb29w IGJlbG93IGFuZCBzbG90IDEgbWF5DQorCSAqIGJlIHNraXBwZWQgaWYgdGhlcmUgaXMgYSBnYXAg aW4gc2xvdCAwLg0KKwkgKi8NCisJcGl2b3RzID0gbWFfcGl2b3RzKG1uLCBtdCk7DQorCWlmIChs aWtlbHkoIXNsb3RzWzBdKSkgew0KKwkJbWF4X2dhcCA9IHBpdm90c1swXSAtIG1hcy0+bWluICsg MTsNCisJCWkgPSAyOw0KKwl9IGVsc2Ugew0KKwkJaSA9IDE7DQorCX0NCisNCisJLyogcmVkdWNl IG1heF9waXYgYXMgdGhlIHNwZWNpYWwgY2FzZSBpcyBjaGVja2VkIGJlZm9yZSB0aGUgbG9vcCAq Lw0KKwltYXhfcGl2ID0gbWFfZGF0YV9lbmQobW4sIG10LCBwaXZvdHMsIG1hcy0+bWF4KSAtIDE7 DQorCS8qDQorCSAqIENoZWNrIGVuZCBpbXBsaWVkIHBpdm90IHdoaWNoIGNhbiBvbmx5IGJlIGEg Z2FwIG9uIHRoZSByaWdodCBtb3N0DQorCSAqIG5vZGUuDQorCSAqLw0KKwlpZiAodW5saWtlbHko bWFzLT5tYXggPT0gVUxPTkdfTUFYKSAmJiAhc2xvdHNbbWF4X3BpdiArIDFdKSB7DQorCQlnYXAg PSBVTE9OR19NQVggLSBwaXZvdHNbbWF4X3Bpdl07DQorCQlpZiAoZ2FwID4gbWF4X2dhcCkNCisJ CQltYXhfZ2FwID0gZ2FwOw0KKwl9DQorDQorCWZvciAoOyBpIDw9IG1heF9waXY7IGkrKykgew0K KwkJLyogZGF0YSA9PSBubyBnYXAuICovDQorCQlpZiAobGlrZWx5KHNsb3RzW2ldKSkNCisJCQlj b250aW51ZTsNCisNCisJCXBzdGFydCA9IHBpdm90c1tpIC0gMV07DQorCQlnYXAgPSBwaXZvdHNb aV0gLSBwc3RhcnQ7DQorCQlpZiAoZ2FwID4gbWF4X2dhcCkNCisJCQltYXhfZ2FwID0gZ2FwOw0K Kw0KKwkJLyogVGhlcmUgY2Fubm90IGJlIHR3byBnYXBzIGluIGEgcm93LiAqLw0KKwkJaSsrOw0K Kwl9DQorCXJldHVybiBtYXhfZ2FwOw0KK30NCisNCisvKg0KKyAqIG1hX21heF9nYXAoKSAtIEdl dCB0aGUgbWF4aW11bSBnYXAgaW4gYSBtYXBsZSBub2RlIChub24tbGVhZikNCisgKiBAbm9kZTog VGhlIG1hcGxlIG5vZGUNCisgKiBAZ2FwczogVGhlIHBvaW50ZXIgdG8gdGhlIGdhcHMNCisgKiBA bXQ6IFRoZSBtYXBsZSBub2RlIHR5cGUNCisgKiBAKm9mZjogUG9pbnRlciB0byBzdG9yZSB0aGUg b2Zmc2V0IGxvY2F0aW9uIG9mIHRoZSBnYXAuDQorICoNCisgKiBVc2VzIHRoZSBtZXRhZGF0YSBk YXRhIGVuZCB0byBzY2FuIGJhY2t3YXJkcyBhY3Jvc3Mgc2V0IGdhcHMuDQorICoNCisgKiBSZXR1 cm46IFRoZSBtYXhpbXVtIGdhcCB2YWx1ZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQg bG9uZw0KK21hX21heF9nYXAoc3RydWN0IG1hcGxlX25vZGUgKm5vZGUsIHVuc2lnbmVkIGxvbmcg KmdhcHMsIGVudW0gbWFwbGVfdHlwZSBtdCwNCisJICAgIHVuc2lnbmVkIGNoYXIgKm9mZikNCit7 DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0LCBpOw0KKwl1bnNpZ25lZCBsb25nIG1heF9nYXAgPSAw Ow0KKw0KKwlpID0gb2Zmc2V0ID0gbWFfbWV0YV9lbmQobm9kZSwgbXQpOw0KKwlkbyB7DQorCQlp ZiAoZ2Fwc1tpXSA+IG1heF9nYXApIHsNCisJCQltYXhfZ2FwID0gZ2Fwc1tpXTsNCisJCQlvZmZz ZXQgPSBpOw0KKwkJfQ0KKwl9IHdoaWxlIChpLS0pOw0KKw0KKwkqb2ZmID0gb2Zmc2V0Ow0KKwly ZXR1cm4gbWF4X2dhcDsNCit9DQorDQorLyoNCisgKiBtYXNfbWF4X2dhcCgpIC0gZmluZCB0aGUg bGFyZ2VzdCBnYXAgaW4gYSBub24tbGVhZiBub2RlIGFuZCBzZXQgdGhlIHNsb3QuDQorICogQG1h czogVGhlIG1hcGxlIHN0YXRlLg0KKyAqDQorICogSWYgdGhlIG1ldGFkYXRhIGdhcCBpcyBzZXQg dG8gTUFQTEVfQVJBTkdFNjRfTUVUQV9NQVgsIHRoZXJlIGlzIG5vIGdhcC4NCisgKg0KKyAqIFJl dHVybjogVGhlIGdhcCB2YWx1ZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcg bWFzX21heF9nYXAoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl1bnNpZ25lZCBsb25nICpn YXBzOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJZW51bSBtYXBsZV90eXBlIG10Ow0KKwlz dHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisNCisJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9k ZSk7DQorCWlmIChtYV9pc19sZWFmKG10KSkNCisJCXJldHVybiBtYXNfbGVhZl9tYXhfZ2FwKG1h cyk7DQorDQorCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJb2Zmc2V0ID0gbWFfbWV0YV9nYXAobm9k ZSwgbXQpOw0KKwlpZiAob2Zmc2V0ID09IE1BUExFX0FSQU5HRTY0X01FVEFfTUFYKQ0KKwkJcmV0 dXJuIDA7DQorDQorCWdhcHMgPSBtYV9nYXBzKG5vZGUsIG10KTsNCisJcmV0dXJuIGdhcHNbb2Zm c2V0XTsNCit9DQorDQorLyoNCisgKiBtYXNfcGFyZW50X2dhcCgpIC0gU2V0IHRoZSBwYXJlbnQg Z2FwIGFuZCBhbnkgZ2FwcyBhYm92ZSwgYXMgbmVlZGVkDQorICogQG1hczogVGhlIG1hcGxlIHN0 YXRlDQorICogQG9mZnNldDogVGhlIGdhcCBvZmZzZXQgaW4gdGhlIHBhcmVudCB0byBzZXQNCisg KiBAbmV3OiBUaGUgbmV3IGdhcCB2YWx1ZS4NCisgKg0KKyAqIFNldCB0aGUgcGFyZW50IGdhcCB0 aGVuIGNvbnRpbnVlIHRvIHNldCB0aGUgZ2FwIHVwd2FyZHMsIHVzaW5nIHRoZSBtZXRhZGF0YQ0K KyAqIG9mIHRoZSBwYXJlbnQgdG8gc2VlIGlmIGl0IGlzIG5lY2Vzc2FyeSB0byBjaGVjayB0aGUg bm9kZSBhYm92ZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3BhcmVudF9nYXAoc3Ry dWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGNoYXIgb2Zmc2V0LA0KKwkJdW5zaWduZWQgbG9u ZyBuZXcpDQorew0KKwl1bnNpZ25lZCBsb25nIG1ldGFfZ2FwID0gMDsNCisJc3RydWN0IG1hcGxl X25vZGUgKnBub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnBlbm9kZTsNCisJdW5zaWduZWQg bG9uZyAqcGdhcHM7DQorCXVuc2lnbmVkIGNoYXIgbWV0YV9vZmZzZXQ7DQorCWVudW0gbWFwbGVf dHlwZSBwbXQ7DQorDQorCXBub2RlID0gbXRlX3BhcmVudChtYXMtPm5vZGUpOw0KKwlwbXQgPSBt YXNfcGFyZW50X2VudW0obWFzLCBtYXMtPm5vZGUpOw0KKwlwZW5vZGUgPSBtdF9ta19ub2RlKHBu b2RlLCBwbXQpOw0KKwlwZ2FwcyA9IG1hX2dhcHMocG5vZGUsIHBtdCk7DQorDQorYXNjZW5kOg0K KwltZXRhX29mZnNldCA9IG1hX21ldGFfZ2FwKHBub2RlLCBwbXQpOw0KKwlpZiAobWV0YV9vZmZz ZXQgPT0gTUFQTEVfQVJBTkdFNjRfTUVUQV9NQVgpDQorCQltZXRhX2dhcCA9IDA7DQorCWVsc2UN CisJCW1ldGFfZ2FwID0gcGdhcHNbbWV0YV9vZmZzZXRdOw0KKw0KKwlwZ2Fwc1tvZmZzZXRdID0g bmV3Ow0KKw0KKwlpZiAobWV0YV9nYXAgPT0gbmV3KQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAob2Zm c2V0ICE9IG1ldGFfb2Zmc2V0KSB7DQorCQlpZiAobWV0YV9nYXAgPiBuZXcpDQorCQkJcmV0dXJu Ow0KKw0KKwkJbWFfc2V0X21ldGFfZ2FwKHBub2RlLCBwbXQsIG9mZnNldCk7DQorCX0gZWxzZSBp ZiAobmV3IDwgbWV0YV9nYXApIHsNCisJCW1ldGFfb2Zmc2V0ID0gMTU7DQorCQluZXcgPSBtYV9t YXhfZ2FwKHBub2RlLCBwZ2FwcywgcG10LCAmbWV0YV9vZmZzZXQpOw0KKwkJbWFfc2V0X21ldGFf Z2FwKHBub2RlLCBwbXQsIG1ldGFfb2Zmc2V0KTsNCisJfQ0KKw0KKwlpZiAobWFfaXNfcm9vdChw bm9kZSkpDQorCQlyZXR1cm47DQorDQorCS8qIEdvIHRvIHRoZSBwYXJlbnQgbm9kZS4gKi8NCisJ cG5vZGUgPSBtdGVfcGFyZW50KHBlbm9kZSk7DQorCXBtdCA9IG1hc19wYXJlbnRfZW51bShtYXMs IHBlbm9kZSk7DQorCXBnYXBzID0gbWFfZ2Fwcyhwbm9kZSwgcG10KTsNCisJb2Zmc2V0ID0gbXRl X3BhcmVudF9zbG90KHBlbm9kZSk7DQorCXBlbm9kZSA9IG10X21rX25vZGUocG5vZGUsIHBtdCk7 DQorCWdvdG8gYXNjZW5kOw0KK30NCisNCisvKg0KKyAqIG1hc191cGRhdGVfZ2FwKCkgLSBVcGRh dGUgYSBub2RlcyBnYXBzIGFuZCBwcm9wYWdhdGUgdXAgaWYgbmVjZXNzYXJ5Lg0KKyAqIEBtYXMg LSB0aGUgbWFwbGUgc3RhdGUuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc191cGRhdGVf Z2FwKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJdW5zaWduZWQgY2hhciBwc2xvdDsNCisJ dW5zaWduZWQgbG9uZyBwX2dhcDsNCisJdW5zaWduZWQgbG9uZyBtYXhfZ2FwOw0KKw0KKwlpZiAo IW10X2lzX2FsbG9jKG1hcy0+dHJlZSkpDQorCQlyZXR1cm47DQorDQorCWlmIChtdGVfaXNfcm9v dChtYXMtPm5vZGUpKQ0KKwkJcmV0dXJuOw0KKw0KKwltYXhfZ2FwID0gbWFzX21heF9nYXAobWFz KTsNCisNCisJcHNsb3QgPSBtdGVfcGFyZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJcF9nYXAgPSBt YV9nYXBzKG10ZV9wYXJlbnQobWFzLT5ub2RlKSwNCisJCQltYXNfcGFyZW50X2VudW0obWFzLCBt YXMtPm5vZGUpKVtwc2xvdF07DQorDQorCWlmIChwX2dhcCAhPSBtYXhfZ2FwKQ0KKwkJbWFzX3Bh cmVudF9nYXAobWFzLCBwc2xvdCwgbWF4X2dhcCk7DQorfQ0KKw0KKy8qDQorICogbWFzX2Fkb3B0 X2NoaWxkcmVuKCkgLSBTZXQgdGhlIHBhcmVudCBwb2ludGVyIG9mIGFsbCBub2RlcyBpbiBAcGFy ZW50IHRvDQorICogQHBhcmVudCB3aXRoIHRoZSBzbG90IGVuY29kZWQuDQorICogQG1hcyAtIHRo ZSBtYXBsZSBzdGF0ZSAoZm9yIHRoZSB0cmVlKQ0KKyAqIEBwYXJlbnQgLSB0aGUgbWFwbGUgZW5j b2RlZCBub2RlIGNvbnRhaW5pbmcgdGhlIGNoaWxkcmVuLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUg dm9pZCBtYXNfYWRvcHRfY2hpbGRyZW4oc3RydWN0IG1hX3N0YXRlICptYXMsDQorCQlzdHJ1Y3Qg bWFwbGVfZW5vZGUgKnBhcmVudCkNCit7DQorCWVudW0gbWFwbGVfdHlwZSB0eXBlID0gbXRlX25v ZGVfdHlwZShwYXJlbnQpOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSA9IG1hc19tbihtYXMp Ow0KKwl2b2lkIF9fcmN1ICoqc2xvdHMgPSBtYV9zbG90cyhub2RlLCB0eXBlKTsNCisJdW5zaWdu ZWQgbG9uZyAqcGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIHR5cGUpOw0KKwlzdHJ1Y3QgbWFwbGVf ZW5vZGUgKmNoaWxkOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisNCisJb2Zmc2V0ID0gbWFf ZGF0YV9lbmQobm9kZSwgdHlwZSwgcGl2b3RzLCBtYXMtPm1heCk7DQorCWRvIHsNCisJCWNoaWxk ID0gbWFzX3Nsb3RfbG9ja2VkKG1hcywgc2xvdHMsIG9mZnNldCk7DQorCQltdGVfc2V0X3BhcmVu dChjaGlsZCwgcGFyZW50LCBvZmZzZXQpOw0KKwl9IHdoaWxlKG9mZnNldC0tKTsNCit9DQorDQor LyoNCisgKiBtYXNfcmVwbGFjZSgpIC0gUmVwbGFjZSBhIG1hcGxlIG5vZGUgaW4gdGhlIHRyZWUg d2l0aCBtYXMtPm5vZGUuICBVc2VzIHRoZQ0KKyAqIHBhcmVudCBlbmNvZGluZyB0byBsb2NhdGUg dGhlIG1hcGxlIG5vZGUgaW4gdGhlIHRyZWUuDQorICogQG1hcyAtIHRoZSBtYV9zdGF0ZSB0byB1 c2UgZm9yIG9wZXJhdGlvbnMuDQorICogQGFkdmFuY2VkIC0gYm9vbGVhbiB0byBhZG9wdCB0aGUg Y2hpbGQgbm9kZXMgYW5kIGZyZWUgdGhlIG9sZCBub2RlIChmYWxzZSkgb3INCisgKiBsZWF2ZSB0 aGUgbm9kZSAodHJ1ZSkgYW5kIGhhbmRsZSB0aGUgYWRvcHRpb24gYW5kIGZyZWUgZWxzZXdoZXJl Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfcmVwbGFjZShzdHJ1Y3QgbWFfc3RhdGUg Km1hcywgYm9vbCBhZHZhbmNlZCkNCisJX19tdXN0X2hvbGQobWFzLT50cmVlLT5sb2NrKQ0KK3sN CisJc3RydWN0IG1hcGxlX25vZGUgKm1uID0gbWFzX21uKG1hcyk7DQorCXN0cnVjdCBtYXBsZV9l bm9kZSAqb2xkX2Vub2RlOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldCA9IDA7DQorCXZvaWQgX19y Y3UgKipzbG90cyA9IE5VTEw7DQorDQorCWlmIChtYV9pc19yb290KG1uKSkgew0KKwkJb2xkX2Vu b2RlID0gbWFzX3Jvb3RfbG9ja2VkKG1hcyk7DQorCX0gZWxzZSB7DQorCQlvZmZzZXQgPSBtdGVf cGFyZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJCXNsb3RzID0gbWFfc2xvdHMobXRlX3BhcmVudCht YXMtPm5vZGUpLA0KKwkJCQkgbWFzX3BhcmVudF9lbnVtKG1hcywgbWFzLT5ub2RlKSk7DQorCQlv bGRfZW5vZGUgPSBtYXNfc2xvdF9sb2NrZWQobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJfQ0KKw0K KwlpZiAoIWFkdmFuY2VkICYmICFtdGVfaXNfbGVhZihtYXMtPm5vZGUpKQ0KKwkJbWFzX2Fkb3B0 X2NoaWxkcmVuKG1hcywgbWFzLT5ub2RlKTsNCisNCisJaWYgKG10ZV9pc19yb290KG1hcy0+bm9k ZSkpIHsNCisJCW1uLT5wYXJlbnQgPSBtYV9wYXJlbnRfcHRyKA0KKwkJCSAgICAgICgodW5zaWdu ZWQgbG9uZyltYXMtPnRyZWUgfCBNQV9ST09UX1BBUkVOVCkpOw0KKwkJcmN1X2Fzc2lnbl9wb2lu dGVyKG1hcy0+dHJlZS0+bWFfcm9vdCwgbXRlX21rX3Jvb3QobWFzLT5ub2RlKSk7DQorCQltYXNf c2V0X2hlaWdodChtYXMpOw0KKwl9IGVsc2Ugew0KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHNsb3Rz W29mZnNldF0sIG1hcy0+bm9kZSk7DQorCX0NCisNCisJaWYgKCFhZHZhbmNlZCkNCisJCW1hc19m cmVlKG1hcywgb2xkX2Vub2RlKTsNCit9DQorDQorLyoNCisgKiBtYXNfbmV3X2NoaWxkKCkgLSBG aW5kIHRoZSBuZXcgY2hpbGQgb2YgYSBub2RlLg0KKyAqIEBtYXM6IHRoZSBtYXBsZSBzdGF0ZQ0K KyAqIEBjaGlsZDogdGhlIG1hcGxlIHN0YXRlIHRvIHN0b3JlIHRoZSBjaGlsZC4NCisgKi8NCitz dGF0aWMgaW5saW5lIGJvb2wgbWFzX25ld19jaGlsZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3Ry dWN0IG1hX3N0YXRlICpjaGlsZCkNCisJX19tdXN0X2hvbGQobWFzLT50cmVlLT5sb2NrKQ0KK3sN CisJZW51bSBtYXBsZV90eXBlIG10Ow0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJdW5zaWdu ZWQgY2hhciBlbmQ7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJc3RydWN0IG1hcGxlX2Vu b2RlICplbnRyeTsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXZvaWQgX19yY3UgKipz bG90czsNCisNCisJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCW5vZGUgPSBtYXNf bW4obWFzKTsNCisJc2xvdHMgPSBtYV9zbG90cyhub2RlLCBtdCk7DQorCXBpdm90cyA9IG1hX3Bp dm90cyhub2RlLCBtdCk7DQorCWVuZCA9IG1hX2RhdGFfZW5kKG5vZGUsIG10LCBwaXZvdHMsIG1h cy0+bWF4KTsNCisJZm9yIChvZmZzZXQgPSBtYXMtPm9mZnNldDsgb2Zmc2V0IDw9IGVuZDsgb2Zm c2V0KyspIHsNCisJCWVudHJ5ID0gbWFzX3Nsb3RfbG9ja2VkKG1hcywgc2xvdHMsIG9mZnNldCk7 DQorCQlpZiAobXRlX3BhcmVudChlbnRyeSkgPT0gbm9kZSkgew0KKwkJCSpjaGlsZCA9ICptYXM7 DQorCQkJbWFzLT5vZmZzZXQgPSBvZmZzZXQgKyAxOw0KKwkJCWNoaWxkLT5vZmZzZXQgPSBvZmZz ZXQ7DQorCQkJbWFzX2Rlc2NlbmQoY2hpbGQpOw0KKwkJCWNoaWxkLT5vZmZzZXQgPSAwOw0KKwkJ CXJldHVybiB0cnVlOw0KKwkJfQ0KKwl9DQorCXJldHVybiBmYWxzZTsNCit9DQorDQorLyoNCisg KiBtYWJfc2hpZnRfcmlnaHQoKSAtIFNoaWZ0IHRoZSBkYXRhIGluIG1hYiByaWdodC4gTm90ZSwg ZG9lcyBub3QgY2xlYW4gb3V0IHRoZQ0KKyAqIG9sZCBkYXRhIG9yIHNldCBiX25vZGUtPmJfZW5k Lg0KKyAqIEBiX25vZGU6IHRoZSBtYXBsZV9iaWdfbm9kZQ0KKyAqIEBzaGlmdDogdGhlIHNoaWZ0 IGNvdW50DQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hYl9zaGlmdF9yaWdodChzdHJ1Y3Qg bWFwbGVfYmlnX25vZGUgKmJfbm9kZSwNCisJCQkJIHVuc2lnbmVkIGNoYXIgc2hpZnQpDQorew0K Kwl1bnNpZ25lZCBsb25nIHNpemUgPSBiX25vZGUtPmJfZW5kICogc2l6ZW9mKHVuc2lnbmVkIGxv bmcpOw0KKw0KKwltZW1tb3ZlKGJfbm9kZS0+cGl2b3QgKyBzaGlmdCwgYl9ub2RlLT5waXZvdCwg c2l6ZSk7DQorCW1lbW1vdmUoYl9ub2RlLT5zbG90ICsgc2hpZnQsIGJfbm9kZS0+c2xvdCwgc2l6 ZSk7DQorCWlmIChiX25vZGUtPnR5cGUgPT0gbWFwbGVfYXJhbmdlXzY0KQ0KKwkJbWVtbW92ZShi X25vZGUtPmdhcCArIHNoaWZ0LCBiX25vZGUtPmdhcCwgc2l6ZSk7DQorfQ0KKw0KKy8qDQorICog bWFiX21pZGRsZV9ub2RlKCkgLSBDaGVjayBpZiBhIG1pZGRsZSBub2RlIGlzIG5lZWRlZCAodW5s aWtlbHkpDQorICogQGJfbm9kZTogdGhlIG1hcGxlX2JpZ19ub2RlIHRoYXQgY29udGFpbnMgdGhl IGRhdGEuDQorICogQHNpemU6IHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgYl9ub2RlDQorICog QHNwbGl0OiB0aGUgcG90ZW50aWFsIHNwbGl0IGxvY2F0aW9uDQorICogQHNsb3RfY291bnQ6IHRo ZSBzaXplIHRoYXQgY2FuIGJlIHN0b3JlZCBpbiBhIHNpbmdsZSBub2RlIGJlaW5nIGNvbnNpZGVy ZWQuDQorICoNCisgKiBSZXR1cm46IHRydWUgaWYgYSBtaWRkbGUgbm9kZSBpcyByZXF1aXJlZC4N CisgKi8NCitzdGF0aWMgaW5saW5lIGJvb2wgbWFiX21pZGRsZV9ub2RlKHN0cnVjdCBtYXBsZV9i aWdfbm9kZSAqYl9ub2RlLCBpbnQgc3BsaXQsDQorCQkJCSAgIHVuc2lnbmVkIGNoYXIgc2xvdF9j b3VudCkNCit7DQorCXVuc2lnbmVkIGNoYXIgc2l6ZSA9IGJfbm9kZS0+Yl9lbmQ7DQorDQorCWlm IChzaXplID49IDIgKiBzbG90X2NvdW50KQ0KKwkJcmV0dXJuIHRydWU7DQorDQorCWlmICghYl9u b2RlLT5zbG90W3NwbGl0XSAmJiAoc2l6ZSA+PSAyICogc2xvdF9jb3VudCAtIDEpKQ0KKwkJcmV0 dXJuIHRydWU7DQorDQorCXJldHVybiBmYWxzZTsNCit9DQorDQorLyoNCisgKiBtYWJfbm9fbnVs bF9zcGxpdCgpIC0gZW5zdXJlIHRoZSBzcGxpdCBkb2Vzbid0IGZhbGwgb24gYSBOVUxMDQorICog QGJfbm9kZTogdGhlIG1hcGxlX2JpZ19ub2RlIHdpdGggdGhlIGRhdGENCisgKiBAc3BsaXQ6IHRo ZSBzdWdnZXN0ZWQgc3BsaXQgbG9jYXRpb24NCisgKiBAc2xvdF9jb3VudDogdGhlIG51bWJlciBv ZiBzbG90cyBpbiB0aGUgbm9kZSBiZWluZyBjb25zaWRlcmVkLg0KKyAqDQorICogUmV0dXJuOiB0 aGUgc3BsaXQgbG9jYXRpb24uDQorICovDQorc3RhdGljIGlubGluZSBpbnQgbWFiX25vX251bGxf c3BsaXQoc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUsDQorCQkJCSAgICB1bnNpZ25lZCBj aGFyIHNwbGl0LCB1bnNpZ25lZCBjaGFyIHNsb3RfY291bnQpDQorew0KKwlpZiAoIWJfbm9kZS0+ c2xvdFtzcGxpdF0pIHsNCisJCS8qDQorCQkgKiBJZiB0aGUgc3BsaXQgaXMgbGVzcyB0aGFuIHRo ZSBtYXggc2xvdCAmJiB0aGUgcmlnaHQgc2lkZSB3aWxsDQorCQkgKiBzdGlsbCBiZSBzdWZmaWNp ZW50LCB0aGVuIGluY3JlbWVudCB0aGUgc3BsaXQgb24gTlVMTC4NCisJCSAqLw0KKwkJaWYgKChz cGxpdCA8IHNsb3RfY291bnQgLSAxKSAmJg0KKwkJICAgIChiX25vZGUtPmJfZW5kIC0gc3BsaXQp ID4gKG10X21pbl9zbG90c1tiX25vZGUtPnR5cGVdKSkNCisJCQlzcGxpdCsrOw0KKwkJZWxzZQ0K KwkJCXNwbGl0LS07DQorCX0NCisJcmV0dXJuIHNwbGl0Ow0KK30NCisNCisvKg0KKyAqIG1hYl9j YWxjX3NwbGl0KCkgLSBDYWxjdWxhdGUgdGhlIHNwbGl0IGxvY2F0aW9uIGFuZCBpZiB0aGVyZSBu ZWVkcyB0byBiZSB0d28NCisgKiBzcGxpdHMuDQorICogQGJuOiBUaGUgbWFwbGVfYmlnX25vZGUg d2l0aCB0aGUgZGF0YQ0KKyAqIEBtaWRfc3BsaXQ6IFRoZSBzZWNvbmQgc3BsaXQsIGlmIHJlcXVp cmVkLiAgMCBvdGhlcndpc2UuDQorICoNCisgKiBSZXR1cm46IFRoZSBmaXJzdCBzcGxpdCBsb2Nh dGlvbi4gIFRoZSBtaWRkbGUgc3BsaXQgaXMgc2V0IGluIEBtaWRfc3BsaXQuDQorICovDQorc3Rh dGljIGlubGluZSBpbnQgbWFiX2NhbGNfc3BsaXQoc3RydWN0IG1hX3N0YXRlICptYXMsDQorCSBz dHJ1Y3QgbWFwbGVfYmlnX25vZGUgKmJuLCB1bnNpZ25lZCBjaGFyICptaWRfc3BsaXQsIHVuc2ln bmVkIGxvbmcgbWluKQ0KK3sNCisJdW5zaWduZWQgY2hhciBiX2VuZCA9IGJuLT5iX2VuZDsNCisJ aW50IHNwbGl0ID0gYl9lbmQgLyAyOyAvKiBBc3N1bWUgZXF1YWwgc3BsaXQuICovDQorCXVuc2ln bmVkIGNoYXIgc2xvdF9taW4sIHNsb3RfY291bnQgPSBtdF9zbG90c1tibi0+dHlwZV07DQorDQor CS8qDQorCSAqIFRvIHN1cHBvcnQgZ2FwIHRyYWNraW5nLCBhbGwgTlVMTCBlbnRyaWVzIGFyZSBr ZXB0IHRvZ2V0aGVyIGFuZCBhIG5vZGUgY2Fubm90DQorCSAqIGVuZCBvbiBhIE5VTEwgZW50cnks IHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgbGVmdC1tb3N0IGxlYWYuICBUaGUNCisJICogbGlt aXRhdGlvbiBtZWFucyB0aGF0IHRoZSBzcGxpdCBvZiBhIG5vZGUgbXVzdCBiZSBjaGVja2VkIGZv ciB0aGlzIGNvbmRpdGlvbg0KKwkgKiBhbmQgYmUgYWJsZSB0byBwdXQgbW9yZSBkYXRhIGluIG9u ZSBkaXJlY3Rpb24gb3IgdGhlIG90aGVyLg0KKwkgKi8NCisJaWYgKHVubGlrZWx5KChtYXMtPm1h c19mbGFncyAmIE1BX1NUQVRFX0JVTEspKSkgew0KKwkJKm1pZF9zcGxpdCA9IDA7DQorCQlpZiAo bWFfaXNfbGVhZihibi0+dHlwZSkpDQorCQkJc2xvdF9taW4gPSAyOw0KKwkJZWxzZQ0KKwkJCXJl dHVybiBiX2VuZCAtIG10X21pbl9zbG90c1tibi0+dHlwZV07DQorDQorCQlzcGxpdCA9IGJfZW5k IC0gc2xvdF9taW47DQorCQltYXMtPm1hc19mbGFncyB8PSBNQV9TVEFURV9SRUJBTEFOQ0U7DQor CQlpZiAoIWJuLT5zbG90W3NwbGl0XSkNCisJCQlzcGxpdC0tOw0KKwkJcmV0dXJuIHNwbGl0Ow0K Kwl9DQorDQorCS8qDQorCSAqIEFsdGhvdWdoIGV4dHJlbWVseSByYXJlLCBpdCBpcyBwb3NzaWJs ZSB0byBlbnRlciB3aGF0IGlzIGtub3duIGFzIHRoZSAzLXdheQ0KKwkgKiBzcGxpdCBzY2VuYXJp by4gIFRoZSAzLXdheSBzcGxpdCBjb21lcyBhYm91dCBieSBtZWFucyBvZiBhIHN0b3JlIG9mIGEg cmFuZ2UNCisJICogdGhhdCBvdmVyd3JpdGVzIHRoZSBlbmQgYW5kIGJlZ2lubmluZyBvZiB0d28g ZnVsbCBub2Rlcy4gIFRoZSByZXN1bHQgaXMgYSBzZXQNCisJICogb2YgZW50cmllcyB0aGF0IGNh bm5vdCBiZSBzdG9yZWQgaW4gMiBub2Rlcy4gIFNvbWV0aW1lcywgdGhlc2UgdHdvIG5vZGVzIGNh bg0KKwkgKiBhbHNvIGJlIGxvY2F0ZWQgaW4gZGlmZmVyZW50IHBhcmVudCBub2RlcyB3aGljaCBh cmUgYWxzbyBmdWxsLiAgVGhpcyBjYW4NCisJICogY2FycnkgdXB3YXJkcyBhbGwgdGhlIHdheSB0 byB0aGUgcm9vdCBpbiB0aGUgd29yc3QgY2FzZS4NCisJICovDQorCWlmICh1bmxpa2VseShtYWJf bWlkZGxlX25vZGUoYm4sIHNwbGl0LCBzbG90X2NvdW50KSkpIHsNCisJCXNwbGl0ID0gYl9lbmQg LyAzOw0KKwkJKm1pZF9zcGxpdCA9IHNwbGl0ICogMjsNCisJfSBlbHNlIHsNCisJCXNsb3RfbWlu ID0gbXRfbWluX3Nsb3RzW2JuLT50eXBlXTsNCisNCisJCSptaWRfc3BsaXQgPSAwOw0KKwkJLyoN CisJCSAqIEF2b2lkIGhhdmluZyBhIHJhbmdlIGxlc3MgdGhhbiB0aGUgc2xvdCBjb3VudCB1bmxl c3MgaXQNCisJCSAqIGNhdXNlcyBvbmUgbm9kZSB0byBiZSBkZWZpY2llbnQuDQorCQkgKiBOT1RF OiBtdF9taW5fc2xvdHMgaXMgMSBiYXNlZCwgYl9lbmQgYW5kIHNwbGl0IGFyZSB6ZXJvLg0KKwkJ ICovDQorCQl3aGlsZSAoKChibi0+cGl2b3Rbc3BsaXRdIC0gbWluKSA8IHNsb3RfY291bnQgLSAx KSAmJg0KKwkJICAgICAgIChzcGxpdCA8IHNsb3RfY291bnQgLSAxKSAmJiAoYl9lbmQgLSBzcGxp dCA+IHNsb3RfbWluKSkNCisJCQlzcGxpdCsrOw0KKwl9DQorDQorCS8qIEF2b2lkIGVuZGluZyBh IG5vZGUgb24gYSBOVUxMIGVudHJ5ICovDQorCXNwbGl0ID0gbWFiX25vX251bGxfc3BsaXQoYm4s IHNwbGl0LCBzbG90X2NvdW50KTsNCisJaWYgKCEoKm1pZF9zcGxpdCkpDQorCQlyZXR1cm4gc3Bs aXQ7DQorDQorCSptaWRfc3BsaXQgPSBtYWJfbm9fbnVsbF9zcGxpdChibiwgKm1pZF9zcGxpdCwg c2xvdF9jb3VudCk7DQorDQorCXJldHVybiBzcGxpdDsNCit9DQorDQorLyoNCisgKiBtYXNfbWFi X2NwKCkgLSBDb3B5IGRhdGEgZnJvbSBhIG1hcGxlIHN0YXRlIGluY2x1c2l2ZWx5IHRvIGEgbWFw bGVfYmlnX25vZGUNCisgKiBhbmQgc2V0IEBiX25vZGUtPmJfZW5kIHRvIHRoZSBuZXh0IGZyZWUg c2xvdC4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWFzX3N0YXJ0OiBUaGUgc3Rh cnRpbmcgc2xvdCB0byBjb3B5DQorICogQG1hc19lbmQ6IFRoZSBlbmQgc2xvdCB0byBjb3B5IChp bmNsdXNpdmVseSkNCisgKiBAYl9ub2RlOiBUaGUgbWFwbGVfYmlnX25vZGUgdG8gcGxhY2UgdGhl IGRhdGENCisgKiBAbWFiX3N0YXJ0OiBUaGUgc3RhcnRpbmcgbG9jYXRpb24gaW4gbWFwbGVfYmln X25vZGUgdG8gc3RvcmUgdGhlIGRhdGEuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19t YWJfY3Aoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGNoYXIgbWFzX3N0YXJ0LA0KKwkJ CXVuc2lnbmVkIGNoYXIgbWFzX2VuZCwgc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUsDQor CQkJdW5zaWduZWQgY2hhciBtYWJfc3RhcnQpDQorew0KKwllbnVtIG1hcGxlX3R5cGUgbXQ7DQor CXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCXVuc2ln bmVkIGxvbmcgKnBpdm90cywgKmdhcHM7DQorCWludCBpID0gbWFzX3N0YXJ0LCBqID0gbWFiX3N0 YXJ0Ow0KKwl1bnNpZ25lZCBjaGFyIHBpdl9lbmQ7DQorDQorCW5vZGUgPSBtYXNfbW4obWFzKTsN CisJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCXBpdm90cyA9IG1hX3Bpdm90cyhu b2RlLCBtdCk7DQorCWlmICghaSkgew0KKwkJYl9ub2RlLT5waXZvdFtqXSA9IHBpdm90c1tpKytd Ow0KKwkJaWYgKHVubGlrZWx5KGkgPiBtYXNfZW5kKSkNCisJCQlnb3RvIGNvbXBsZXRlOw0KKwkJ aisrOw0KKwl9DQorDQorCXBpdl9lbmQgPSBtaW4obWFzX2VuZCwgbXRfcGl2b3RzW210XSk7DQor CWZvciAoOyBpIDwgcGl2X2VuZDsgaSsrLCBqKyspIHsNCisJCWJfbm9kZS0+cGl2b3Rbal0gPSBw aXZvdHNbaV07DQorCQlpZiAodW5saWtlbHkoIWJfbm9kZS0+cGl2b3Rbal0pKQ0KKwkJCWJyZWFr Ow0KKw0KKwkJaWYgKHVubGlrZWx5KG1hcy0+bWF4ID09IGJfbm9kZS0+cGl2b3Rbal0pKQ0KKwkJ CWdvdG8gY29tcGxldGU7DQorCX0NCisNCisJaWYgKGxpa2VseShpIDw9IG1hc19lbmQpKQ0KKwkJ Yl9ub2RlLT5waXZvdFtqXSA9IG1hc19zYWZlX3Bpdm90KG1hcywgcGl2b3RzLCBpLCBtdCk7DQor DQorY29tcGxldGU6DQorCWJfbm9kZS0+Yl9lbmQgPSArK2o7DQorCWogLT0gbWFiX3N0YXJ0Ow0K KwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIG10KTsNCisJbWVtY3B5KGJfbm9kZS0+c2xvdCArIG1h Yl9zdGFydCwgc2xvdHMgKyBtYXNfc3RhcnQsIHNpemVvZih2b2lkICopICogaik7DQorCWlmICgh bWFfaXNfbGVhZihtdCkgJiYgbXRfaXNfYWxsb2MobWFzLT50cmVlKSkgew0KKwkJZ2FwcyA9IG1h X2dhcHMobm9kZSwgbXQpOw0KKwkJbWVtY3B5KGJfbm9kZS0+Z2FwICsgbWFiX3N0YXJ0LCBnYXBz ICsgbWFzX3N0YXJ0LA0KKwkJICAgICAgIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIGopOw0KKwl9 DQorfQ0KKw0KKy8qDQorICogbWFzX2xlYWZfc2V0X21ldGEoKSAtIFNldCB0aGUgbWV0YWRhdGEg b2YgYSBsZWFmIGlmIHBvc3NpYmxlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBu b2RlOiBUaGUgbWFwbGUgbm9kZQ0KKyAqIEBwaXZvdHM6IHBvaW50ZXIgdG8gdGhlIG1hcGxlIG5v ZGUgcGl2b3RzDQorICogQG10OiBUaGUgbWFwbGUgdHlwZQ0KKyAqIEBlbmQ6IFRoZSBhc3N1bWVk IGVuZA0KKyAqDQorICogTm90ZSwgZW5kIG1heSBiZSBpbmNyZW1lbnRlZCB3aXRoaW4gdGhpcyBm dW5jdGlvbiBidXQgbm90IG1vZGlmaWVkIGF0IHRoZQ0KKyAqIHNvdXJjZS4gIFRoaXMgaXMgZmlu ZSBzaW5jZSB0aGUgbWV0YWRhdGEgaXMgdGhlIGxhc3QgdGhpbmcgdG8gYmUgc3RvcmVkIGluIGEN CisgKiBub2RlIGR1cmluZyBhIHdyaXRlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNf bGVhZl9zZXRfbWV0YShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJCXN0cnVjdCBtYXBsZV9ub2Rl ICpub2RlLCB1bnNpZ25lZCBsb25nICpwaXZvdHMsDQorCQllbnVtIG1hcGxlX3R5cGUgbXQsIHVu c2lnbmVkIGNoYXIgZW5kKQ0KK3sNCisJLyogVGhlcmUgaXMgbm8gcm9vbSBmb3IgbWV0YWRhdGEg YWxyZWFkeSAqLw0KKwlpZiAobXRfcGl2b3RzW210XSA8PSBlbmQpDQorCQlyZXR1cm47DQorDQor CWlmIChwaXZvdHNbZW5kXSAmJiBwaXZvdHNbZW5kXSA8IG1hcy0+bWF4KQ0KKwkJZW5kKys7DQor DQorCWlmIChlbmQgPCBtdF9zbG90c1ttdF0gLSAxKQ0KKwkJbWFfc2V0X21ldGEobm9kZSwgbXQs IDAsIGVuZCk7DQorfQ0KKw0KKy8qDQorICogbWFiX21hc19jcCgpIC0gQ29weSBkYXRhIGZyb20g bWFwbGVfYmlnX25vZGUgdG8gYSBtYXBsZSBlbmNvZGVkIG5vZGUuDQorICogQGJfbm9kZTogdGhl IG1hcGxlX2JpZ19ub2RlIHRoYXQgaGFzIHRoZSBkYXRhDQorICogQG1hYl9zdGFydDogdGhlIHN0 YXJ0IGxvY2F0aW9uIGluIEBiX25vZGUuDQorICogQG1hYl9lbmQ6IFRoZSBlbmQgbG9jYXRpb24g aW4gQGJfbm9kZSAoaW5jbHVzaXZlbHkpDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlIHdpdGgg dGhlIG1hcGxlIGVuY29kZWQgbm9kZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFiX21h c19jcChzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgKmJfbm9kZSwNCisJCQkgICAgICB1bnNpZ25lZCBj aGFyIG1hYl9zdGFydCwgdW5zaWduZWQgY2hhciBtYWJfZW5kLA0KKwkJCSAgICAgIHN0cnVjdCBt YV9zdGF0ZSAqbWFzLCBib29sIG5ld19tYXgpDQorew0KKwlpbnQgaSwgaiA9IDA7DQorCWVudW0g bWFwbGVfdHlwZSBtdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJc3RydWN0IG1hcGxl X25vZGUgKm5vZGUgPSBtdGVfdG9fbm9kZShtYXMtPm5vZGUpOw0KKwl2b2lkIF9fcmN1ICoqc2xv dHMgPSBtYV9zbG90cyhub2RlLCBtdCk7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90cyA9IG1hX3Bp dm90cyhub2RlLCBtdCk7DQorCXVuc2lnbmVkIGxvbmcgKmdhcHMgPSBOVUxMOw0KKwl1bnNpZ25l ZCBjaGFyIGVuZDsNCisNCisJaWYgKG1hYl9lbmQgLSBtYWJfc3RhcnQgPiBtdF9waXZvdHNbbXRd KQ0KKwkJbWFiX2VuZC0tOw0KKw0KKwlpZiAoIXBpdm90c1ttdF9waXZvdHNbbXRdIC0gMV0pDQor CQlzbG90c1ttdF9waXZvdHNbbXRdXSA9IE5VTEw7DQorDQorCWkgPSBtYWJfc3RhcnQ7DQorCXBp dm90c1tqKytdID0gYl9ub2RlLT5waXZvdFtpKytdOw0KKwlkbyB7DQorCQlwaXZvdHNbaisrXSA9 IGJfbm9kZS0+cGl2b3RbaSsrXTsNCisJfSB3aGlsZSAoaSA8PSBtYWJfZW5kICYmIGxpa2VseShi X25vZGUtPnBpdm90W2ldKSk7DQorDQorCW1lbWNweShzbG90cywgYl9ub2RlLT5zbG90ICsgbWFi X3N0YXJ0LA0KKwkgICAgICAgc2l6ZW9mKHZvaWQgKikgKiAoaSAtIG1hYl9zdGFydCkpOw0KKw0K KwlpZiAobmV3X21heCkNCisJCW1hcy0+bWF4ID0gYl9ub2RlLT5waXZvdFtpIC0gMV07DQorDQor CWVuZCA9IGogLSAxOw0KKwlpZiAobGlrZWx5KCFtYV9pc19sZWFmKG10KSAmJiBtdF9pc19hbGxv YyhtYXMtPnRyZWUpKSkgew0KKwkJdW5zaWduZWQgbG9uZyBtYXhfZ2FwID0gMDsNCisJCXVuc2ln bmVkIGNoYXIgb2Zmc2V0ID0gMTU7DQorDQorCQlnYXBzID0gbWFfZ2Fwcyhub2RlLCBtdCk7DQor CQlkbyB7DQorCQkJZ2Fwc1stLWpdID0gYl9ub2RlLT5nYXBbLS1pXTsNCisJCQlpZiAoZ2Fwc1tq XSA+IG1heF9nYXApIHsNCisJCQkJb2Zmc2V0ID0gajsNCisJCQkJbWF4X2dhcCA9IGdhcHNbal07 DQorCQkJfQ0KKwkJfSB3aGlsZSAoaik7DQorDQorCQltYV9zZXRfbWV0YShub2RlLCBtdCwgb2Zm c2V0LCBlbmQpOw0KKwl9IGVsc2Ugew0KKwkJbWFzX2xlYWZfc2V0X21ldGEobWFzLCBub2RlLCBw aXZvdHMsIG10LCBlbmQpOw0KKwl9DQorfQ0KKw0KKy8qDQorICogbWFzX2Rlc2NlbmRfYWRvcHQo KSAtIERlc2NlbmQgdGhyb3VnaCBhIHN1Yi10cmVlIGFuZCBhZG9wdCBjaGlsZHJlbi4NCisgKiBA bWFzOiB0aGUgbWFwbGUgc3RhdGUgd2l0aCB0aGUgbWFwbGUgZW5jb2RlZCBub2RlIG9mIHRoZSBz dWItdHJlZS4NCisgKg0KKyAqIERlc2NlbmQgdGhyb3VnaCBhIHN1Yi10cmVlIGFuZCBhZG9wdCBj aGlsZHJlbiB3aG8gZG8gbm90IGhhdmUgdGhlIGNvcnJlY3QNCisgKiBwYXJlbnRzIHNldC4gIEZv bGxvdyB0aGUgcGFyZW50cyB3aGljaCBoYXZlIHRoZSBjb3JyZWN0IHBhcmVudHMgYXMgdGhleSBh cmUNCisgKiB0aGUgbmV3IGVudHJpZXMgd2hpY2ggbmVlZCB0byBiZSBmb2xsb3dlZCB0byBmaW5k IG90aGVyIGluY29ycmVjdGx5IHNldA0KKyAqIHBhcmVudHMuDQorICovDQorc3RhdGljIGlubGlu ZSB2b2lkIG1hc19kZXNjZW5kX2Fkb3B0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJc3Ry dWN0IG1hX3N0YXRlIGxpc3RbM10sIG5leHRbM107DQorCWludCBpLCBuOw0KKw0KKwkvKg0KKwkg KiBBdCBlYWNoIGxldmVsIHRoZXJlIG1heSBiZSB1cCB0byAzIGNvcnJlY3QgcGFyZW50IHBvaW50 ZXJzIHdoaWNoIGluZGljYXRlcw0KKwkgKiB0aGUgbmV3IG5vZGVzIHdoaWNoIG5lZWQgdG8gYmUg d2Fsa2VkIHRvIGZpbmQgYW55IG5ldyBub2RlcyBhdCBhIGxvd2VyIGxldmVsLg0KKwkgKi8NCisN CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgew0KKwkJbGlzdFtpXSA9ICptYXM7DQorCQlsaXN0 W2ldLm9mZnNldCA9IDA7DQorCQluZXh0W2ldLm9mZnNldCA9IDA7DQorCX0NCisJbmV4dFswXSA9 ICptYXM7DQorDQorCXdoaWxlICghbXRlX2lzX2xlYWYobGlzdFswXS5ub2RlKSkgew0KKwkJbiA9 IDA7DQorCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7DQorCQkJaWYgKG1hc19pc19ub25lKCZs aXN0W2ldKSkNCisJCQkJY29udGludWU7DQorDQorCQkJaWYgKGkgJiYgbGlzdFtpLTFdLm5vZGUg PT0gbGlzdFtpXS5ub2RlKQ0KKwkJCQljb250aW51ZTsNCisNCisJCQl3aGlsZSAoKG4gPCAzKSAm JiAobWFzX25ld19jaGlsZCgmbGlzdFtpXSwgJm5leHRbbl0pKSkNCisJCQkJbisrOw0KKw0KKwkJ CW1hc19hZG9wdF9jaGlsZHJlbigmbGlzdFtpXSwgbGlzdFtpXS5ub2RlKTsNCisJCX0NCisNCisJ CXdoaWxlIChuIDwgMykNCisJCQluZXh0W24rK10ubm9kZSA9IE1BU19OT05FOw0KKw0KKwkJLyog ZGVzY2VuZCBieSBzZXR0aW5nIHRoZSBsaXN0IHRvIHRoZSBjaGlsZHJlbiAqLw0KKwkJZm9yIChp ID0gMDsgaSA8IDM7IGkrKykNCisJCQlsaXN0W2ldID0gbmV4dFtpXTsNCisJfQ0KK30NCisNCisv Kg0KKyAqIG1hc19idWxrX3JlYmFsYW5jZSgpIC0gUmViYWxhbmNlIHRoZSBlbmQgb2YgYSB0cmVl IGFmdGVyIGEgYnVsayBpbnNlcnQuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGVu ZDogVGhlIG1hcGxlIG5vZGUgZW5kDQorICogQG10OiBUaGUgbWFwbGUgbm9kZSB0eXBlDQorICov DQorc3RhdGljIGlubGluZSB2b2lkIG1hc19idWxrX3JlYmFsYW5jZShzdHJ1Y3QgbWFfc3RhdGUg Km1hcywgdW5zaWduZWQgY2hhciBlbmQsDQorCQkJCSAgICAgIGVudW0gbWFwbGVfdHlwZSBtdCkN Cit7DQorCWlmICghKG1hcy0+bWFzX2ZsYWdzICYgTUFfU1RBVEVfQlVMSykpDQorCQlyZXR1cm47 DQorDQorCWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKQ0KKwkJcmV0dXJuOw0KKw0KKwlpZiAo ZW5kID4gbXRfbWluX3Nsb3RzW210XSkgew0KKwkJbWFzLT5tYXNfZmxhZ3MgJj0gfk1BX1NUQVRF X1JFQkFMQU5DRTsNCisJCXJldHVybjsNCisJfQ0KK30NCisNCisvKg0KKyAqIG1hc19zdG9yZV9i X25vZGUoKSAtIFN0b3JlIGFuIEBlbnRyeSBpbnRvIHRoZSBiX25vZGUgd2hpbGUgYWxzbyBjb3B5 aW5nIHRoZQ0KKyAqIGRhdGEgZnJvbSBhIG1hcGxlIGVuY29kZWQgbm9kZS4NCisgKiBAd3JfbWFz OiB0aGUgbWFwbGUgd3JpdGUgc3RhdGUNCisgKiBAYl9ub2RlOiB0aGUgbWFwbGVfYmlnX25vZGUg dG8gZmlsbCB3aXRoIGRhdGENCisgKiBAb2Zmc2V0X2VuZDogdGhlIG9mZnNldCB0byBlbmQgY29w eWluZw0KKyAqDQorICogUmV0dXJuOiBUaGUgYWN0dWFsIGVuZCBvZiB0aGUgZGF0YSBzdG9yZWQg aW4gQGJfbm9kZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfc3RvcmVfYl9ub2RlKHN0 cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzLA0KKwkJc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25v ZGUsIHVuc2lnbmVkIGNoYXIgb2Zmc2V0X2VuZCkNCit7DQorCXVuc2lnbmVkIGNoYXIgc2xvdDsN CisJdW5zaWduZWQgY2hhciBiX2VuZDsNCisJLyogUG9zc2libGUgdW5kZXJmbG93IG9mIHBpdiB3 aWxsIHdyYXAgYmFjayB0byAwIGJlZm9yZSB1c2UuICovDQorCXVuc2lnbmVkIGxvbmcgcGl2Ow0K KwlzdHJ1Y3QgbWFfc3RhdGUgKm1hcyA9IHdyX21hcy0+bWFzOw0KKw0KKwliX25vZGUtPnR5cGUg PSB3cl9tYXMtPnR5cGU7DQorCWJfZW5kID0gMDsNCisJc2xvdCA9IG1hcy0+b2Zmc2V0Ow0KKwlp ZiAoc2xvdCkgew0KKwkJLyogQ29weSBzdGFydCBkYXRhIHVwIHRvIGluc2VydC4gKi8NCisJCW1h c19tYWJfY3AobWFzLCAwLCBzbG90IC0gMSwgYl9ub2RlLCAwKTsNCisJCWJfZW5kID0gYl9ub2Rl LT5iX2VuZDsNCisJCXBpdiA9IGJfbm9kZS0+cGl2b3RbYl9lbmQgLSAxXTsNCisJfSBlbHNlDQor CQlwaXYgPSBtYXMtPm1pbiAtIDE7DQorDQorCWlmIChwaXYgKyAxIDwgbWFzLT5pbmRleCkgew0K KwkJLyogSGFuZGxlIHJhbmdlIHN0YXJ0aW5nIGFmdGVyIG9sZCByYW5nZSAqLw0KKwkJYl9ub2Rl LT5zbG90W2JfZW5kXSA9IHdyX21hcy0+Y29udGVudDsNCisJCWlmICghd3JfbWFzLT5jb250ZW50 KQ0KKwkJCWJfbm9kZS0+Z2FwW2JfZW5kXSA9IG1hcy0+aW5kZXggLSAxIC0gcGl2Ow0KKwkJYl9u b2RlLT5waXZvdFtiX2VuZCsrXSA9IG1hcy0+aW5kZXggLSAxOw0KKwl9DQorDQorCS8qIFN0b3Jl IHRoZSBuZXcgZW50cnkuICovDQorCW1hcy0+b2Zmc2V0ID0gYl9lbmQ7DQorCWJfbm9kZS0+c2xv dFtiX2VuZF0gPSB3cl9tYXMtPmVudHJ5Ow0KKwliX25vZGUtPnBpdm90W2JfZW5kXSA9IG1hcy0+ bGFzdDsNCisNCisJLyogQXBwZW5kZWQuICovDQorCWlmIChtYXMtPmxhc3QgPj0gbWFzLT5tYXgp DQorCQlnb3RvIGJfZW5kOw0KKw0KKwkvKiBIYW5kbGUgbmV3IHJhbmdlIGVuZGluZyBiZWZvcmUg b2xkIHJhbmdlIGVuZHMgKi8NCisJcGl2ID0gbWFzX2xvZ2ljYWxfcGl2b3QobWFzLCB3cl9tYXMt PnBpdm90cywgb2Zmc2V0X2VuZCwgd3JfbWFzLT50eXBlKTsNCisJaWYgKHBpdiA+IG1hcy0+bGFz dCkgew0KKwkJaWYgKHBpdiA9PSBVTE9OR19NQVgpDQorCQkJbWFzX2J1bGtfcmViYWxhbmNlKG1h cywgYl9ub2RlLT5iX2VuZCwgd3JfbWFzLT50eXBlKTsNCisNCisJCWlmIChvZmZzZXRfZW5kICE9 IHNsb3QpDQorCQkJd3JfbWFzLT5jb250ZW50ID0gbWFzX3Nsb3RfbG9ja2VkKG1hcywgd3JfbWFz LT5zbG90cywNCisJCQkJCQkJICBvZmZzZXRfZW5kKTsNCisNCisJCWJfbm9kZS0+c2xvdFsrK2Jf ZW5kXSA9IHdyX21hcy0+Y29udGVudDsNCisJCWlmICghd3JfbWFzLT5jb250ZW50KQ0KKwkJCWJf bm9kZS0+Z2FwW2JfZW5kXSA9IHBpdiAtIG1hcy0+bGFzdCArIDE7DQorCQliX25vZGUtPnBpdm90 W2JfZW5kXSA9IHBpdjsNCisJfQ0KKw0KKwlzbG90ID0gb2Zmc2V0X2VuZCArIDE7DQorCWlmIChz bG90ID4gd3JfbWFzLT5ub2RlX2VuZCkNCisJCWdvdG8gYl9lbmQ7DQorDQorCS8qIENvcHkgZW5k IGRhdGEgdG8gdGhlIGVuZCBvZiB0aGUgbm9kZS4gKi8NCisJbWFzX21hYl9jcChtYXMsIHNsb3Qs IHdyX21hcy0+bm9kZV9lbmQgKyAxLCBiX25vZGUsICsrYl9lbmQpOw0KKwliX25vZGUtPmJfZW5k LS07DQorCXJldHVybjsNCisNCitiX2VuZDoNCisJYl9ub2RlLT5iX2VuZCA9IGJfZW5kOw0KK30N CisNCisvKg0KKyAqIG1hc19wcmV2X3NpYmxpbmcoKSAtIEZpbmQgdGhlIHByZXZpb3VzIG5vZGUg d2l0aCB0aGUgc2FtZSBwYXJlbnQuDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlDQorICoNCisg KiBSZXR1cm46IFRydWUgaWYgdGhlcmUgaXMgYSBwcmV2aW91cyBzaWJsaW5nLCBmYWxzZSBvdGhl cndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19wcmV2X3NpYmxpbmcoc3RydWN0 IG1hX3N0YXRlICptYXMpDQorew0KKwl1bnNpZ25lZCBpbnQgcF9zbG90ID0gbXRlX3BhcmVudF9z bG90KG1hcy0+bm9kZSk7DQorDQorCWlmIChtdGVfaXNfcm9vdChtYXMtPm5vZGUpKQ0KKwkJcmV0 dXJuIGZhbHNlOw0KKw0KKwlpZiAoIXBfc2xvdCkNCisJCXJldHVybiBmYWxzZTsNCisNCisJbWFz X2FzY2VuZChtYXMpOw0KKwltYXMtPm9mZnNldCA9IHBfc2xvdCAtIDE7DQorCW1hc19kZXNjZW5k KG1hcyk7DQorCXJldHVybiB0cnVlOw0KK30NCisNCisvKg0KKyAqIG1hc19uZXh0X3NpYmxpbmco KSAtIEZpbmQgdGhlIG5leHQgbm9kZSB3aXRoIHRoZSBzYW1lIHBhcmVudC4NCisgKiBAbWFzOiB0 aGUgbWFwbGUgc3RhdGUNCisgKg0KKyAqIFJldHVybjogdHJ1ZSBpZiB0aGVyZSBpcyBhIG5leHQg c2libGluZywgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNf bmV4dF9zaWJsaW5nKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJTUFfU1RBVEUocGFyZW50 LCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+bGFzdCk7DQorDQorCWlmIChtdGVfaXNfcm9v dChtYXMtPm5vZGUpKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0KKwlwYXJlbnQgPSAqbWFzOw0KKwlt YXNfYXNjZW5kKCZwYXJlbnQpOw0KKwlwYXJlbnQub2Zmc2V0ID0gbXRlX3BhcmVudF9zbG90KG1h cy0+bm9kZSkgKyAxOw0KKwlpZiAocGFyZW50Lm9mZnNldCA+IG1hc19kYXRhX2VuZCgmcGFyZW50 KSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJKm1hcyA9IHBhcmVudDsNCisJbWFzX2Rlc2NlbmQo bWFzKTsNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KKy8qDQorICogbXRlX25vZGVfb3Jfbm9kZSgp IC0gUmV0dXJuIHRoZSBlbmNvZGVkIG5vZGUgb3IgTUFTX05PTkUuDQorICogQGVub2RlOiBUaGUg ZW5jb2RlZCBtYXBsZSBub2RlLg0KKyAqDQorICogU2hvcnRoYW5kIHRvIGF2b2lkIHNldHRpbmcg JU5VTExzIGluIHRoZSB0cmVlIG9yIG1hcGxlX3N1YnRyZWVfc3RhdGUuDQorICoNCisgKiBSZXR1 cm46IEBlbm9kZSBvciBNQVNfTk9ORQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxl X2Vub2RlICptdGVfbm9kZV9vcl9ub25lKHN0cnVjdCBtYXBsZV9lbm9kZSAqZW5vZGUpDQorew0K KwlpZiAoZW5vZGUpDQorCQlyZXR1cm4gZW5vZGU7DQorDQorCXJldHVybiBtYV9lbm9kZV9wdHIo TUFTX05PTkUpOw0KK30NCisNCisvKg0KKyAqIG1hc193cl9ub2RlX3dhbGsoKSAtIEZpbmQgdGhl IGNvcnJlY3Qgb2Zmc2V0IGZvciB0aGUgaW5kZXggaW4gdGhlIEBtYXMuDQorICogQHdyX21hczog VGhlIG1hcGxlIHdyaXRlIHN0YXRlDQorICoNCisgKiBVc2VzIG1hc19zbG90X2xvY2tlZCgpIGFu ZCBkb2VzIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IGRlYWQgbm9kZXMuDQorICovDQorc3RhdGlj IGlubGluZSB2b2lkIG1hc193cl9ub2RlX3dhbGsoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMp DQorew0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm1hcyA9IHdyX21hcy0+bWFzOw0KKwl1bnNpZ25lZCBj aGFyIGNvdW50Ow0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJdW5zaWduZWQgbG9uZyBpbmRl eCwgbWluLCBtYXg7DQorDQorCWlmICh1bmxpa2VseShtYV9pc19kZW5zZSh3cl9tYXMtPnR5cGUp KSkgew0KKwkJd3JfbWFzLT5yX21heCA9IHdyX21hcy0+cl9taW4gPSBtYXMtPmluZGV4Ow0KKwkJ bWFzLT5vZmZzZXQgPSBtYXMtPmluZGV4ID0gbWFzLT5taW47DQorCQlyZXR1cm47DQorCX0NCisN CisJd3JfbWFzLT5ub2RlID0gbWFzX21uKHdyX21hcy0+bWFzKTsNCisJd3JfbWFzLT5waXZvdHMg PSBtYV9waXZvdHMod3JfbWFzLT5ub2RlLCB3cl9tYXMtPnR5cGUpOw0KKwljb3VudCA9IHdyX21h cy0+bm9kZV9lbmQgPSBtYV9kYXRhX2VuZCh3cl9tYXMtPm5vZGUsIHdyX21hcy0+dHlwZSwNCisJ CQkJCSAgICAgICB3cl9tYXMtPnBpdm90cywgbWFzLT5tYXgpOw0KKwlvZmZzZXQgPSBtYXMtPm9m ZnNldDsNCisJbWluID0gbWFzX3NhZmVfbWluKG1hcywgd3JfbWFzLT5waXZvdHMsIG9mZnNldCk7 DQorCW1heCA9IHdyX21hcy0+cGl2b3RzW29mZnNldF07DQorCWlmICh1bmxpa2VseShvZmZzZXQg PT0gY291bnQpKQ0KKwkJZ290byBtYXg7IC8qIG1heSBoYXZlIGJlZW4gc2V0IHRvIHplcm8gKi8N CisNCisJaW5kZXggPSBtYXMtPmluZGV4Ow0KKwlpZiAodW5saWtlbHkoaW5kZXggPD0gbWF4KSkN CisJCWdvdG8gZG9uZTsNCisNCisJaWYgKHVubGlrZWx5KCFtYXggJiYgb2Zmc2V0KSkNCisJCWdv dG8gbWF4Ow0KKw0KKwltaW4gPSBtYXggKyAxOw0KKwl3aGlsZSAoKytvZmZzZXQgPCBjb3VudCkg ew0KKwkJbWF4ID0gd3JfbWFzLT5waXZvdHNbb2Zmc2V0XTsNCisJCWlmIChpbmRleCA8PSBtYXgp DQorCQkJZ290byBkb25lOw0KKwkJZWxzZSBpZiAodW5saWtlbHkoIW1heCkpDQorCQkJYnJlYWs7 DQorDQorCQltaW4gPSBtYXggKyAxOw0KKwl9DQorDQorbWF4Og0KKwltYXggPSBtYXMtPm1heDsN Citkb25lOg0KKwl3cl9tYXMtPnJfbWF4ID0gbWF4Ow0KKwl3cl9tYXMtPnJfbWluID0gbWluOw0K Kwl3cl9tYXMtPm9mZnNldF9lbmQgPSBtYXMtPm9mZnNldCA9IG9mZnNldDsNCit9DQorDQorLyoN CisgKiBtYXN0X3RvcGlhcnkoKSAtIEFkZCB0aGUgcG9ydGlvbnMgb2YgdGhlIHRyZWUgdG8gdGhl IHJlbW92YWwgbGlzdDsgZWl0aGVyIHRvDQorICogYmUgZnJlZWQgb3IgZGlzY2FyZGVkIChkZXN0 cm95IHdhbGspLg0KKyAqIEBtYXN0OiBUaGUgbWFwbGVfc3VidHJlZV9zdGF0ZS4NCisgKi8NCitz dGF0aWMgaW5saW5lIHZvaWQgbWFzdF90b3BpYXJ5KHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRl ICptYXN0KQ0KK3sNCisJTUFfV1JfU1RBVEUod3JfbWFzLCBtYXN0LT5vcmlnX2wsIE5VTEwpOw0K Kwl1bnNpZ25lZCBjaGFyIGxfb2ZmLCByX29mZiwgb2Zmc2V0Ow0KKwl1bnNpZ25lZCBsb25nIGxf aW5kZXg7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqY2hpbGQ7DQorCXZvaWQgX19yY3UgKipzbG90 czsNCisNCisJd3JfbWFzLnR5cGUgPSBtdGVfbm9kZV90eXBlKG1hc3QtPm9yaWdfbC0+bm9kZSk7 DQorCS8qIFRoZSBsZWZ0IG5vZGUgaXMgY29uc3VtZWQsIHNvIGFkZCB0byB0aGUgZnJlZSBsaXN0 LiAqLw0KKwlsX2luZGV4ID0gbWFzdC0+b3JpZ19sLT5pbmRleDsNCisJbWFzdC0+b3JpZ19sLT5p bmRleCA9IG1hc3QtPm9yaWdfbC0+bGFzdDsNCisJbWFzX3dyX25vZGVfd2Fsaygmd3JfbWFzKTsN CisJbWFzdC0+b3JpZ19sLT5pbmRleCA9IGxfaW5kZXg7DQorCWxfb2ZmID0gbWFzdC0+b3JpZ19s LT5vZmZzZXQ7DQorCXJfb2ZmID0gbWFzdC0+b3JpZ19yLT5vZmZzZXQ7DQorCWlmIChtYXN0LT5v cmlnX2wtPm5vZGUgPT0gbWFzdC0+b3JpZ19yLT5ub2RlKSB7DQorCQlzbG90cyA9IG1hX3Nsb3Rz KG10ZV90b19ub2RlKG1hc3QtPm9yaWdfbC0+bm9kZSksIHdyX21hcy50eXBlKTsNCisJCWZvciAo b2Zmc2V0ID0gbF9vZmYgKyAxOyBvZmZzZXQgPCByX29mZjsgb2Zmc2V0KyspDQorCQkJbWF0X2Fk ZChtYXN0LT5kZXN0cm95LCBtYXNfc2xvdF9sb2NrZWQobWFzdC0+b3JpZ19sLA0KKwkJCQkJCQlz bG90cywgb2Zmc2V0KSk7DQorDQorCQlyZXR1cm47DQorCX0NCisNCisJLyogbWFzdC0+b3JpZ19y IGlzIGRpZmZlcmVudCBhbmQgY29uc3VtZWQuICovDQorCWlmIChtdGVfaXNfbGVhZihtYXN0LT5v cmlnX3ItPm5vZGUpKQ0KKwkJcmV0dXJuOw0KKw0KKwkvKiBOb3cgZGVzdHJveSBsX29mZiArIDEg LT4gZW5kIGFuZCAwIC0+IHJfb2ZmIC0gMSAqLw0KKwlvZmZzZXQgPSBsX29mZiArIDE7DQorCXNs b3RzID0gbWFfc2xvdHMobXRlX3RvX25vZGUobWFzdC0+b3JpZ19sLT5ub2RlKSwgd3JfbWFzLnR5 cGUpOw0KKwl3aGlsZSAob2Zmc2V0IDwgbXRfc2xvdHNbd3JfbWFzLnR5cGVdKSB7DQorCQljaGls ZCA9IG1hc19zbG90X2xvY2tlZChtYXN0LT5vcmlnX2wsIHNsb3RzLCBvZmZzZXQrKyk7DQorCQlp ZiAoIWNoaWxkKQ0KKwkJCWJyZWFrOw0KKw0KKwkJbWF0X2FkZChtYXN0LT5kZXN0cm95LCBjaGls ZCk7DQorCX0NCisNCisJc2xvdHMgPSBtYV9zbG90cyhtdGVfdG9fbm9kZShtYXN0LT5vcmlnX3It Pm5vZGUpLA0KKwkJCSAgICAgbXRlX25vZGVfdHlwZShtYXN0LT5vcmlnX3ItPm5vZGUpKTsNCisJ Zm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCByX29mZjsgb2Zmc2V0KyspDQorCQltYXRfYWRkKG1h c3QtPmRlc3Ryb3ksDQorCQkJCW1hc19zbG90X2xvY2tlZChtYXN0LT5vcmlnX2wsIHNsb3RzLCBv ZmZzZXQpKTsNCit9DQorDQorLyoNCisgKiBtYXN0X3JlYmFsYW5jZV9uZXh0KCkgLSBSZWJhbGFu Y2UgYWdhaW5zdCB0aGUgbmV4dCBub2RlDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0 YXRlDQorICogQG9sZF9yOiBUaGUgZW5jb2RlZCBtYXBsZSBub2RlIHRvIHRoZSByaWdodCAobmV4 dCBub2RlKS4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF9yZWJhbGFuY2VfbmV4dChz dHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwNCisJCQkJICAgICAgIHN0cnVjdCBtYXBs ZV9lbm9kZSAqb2xkX3IsIGJvb2wgZnJlZSkNCit7DQorCXVuc2lnbmVkIGNoYXIgYl9lbmQgPSBt YXN0LT5ibi0+Yl9lbmQ7DQorDQorCW1hc19tYWJfY3AobWFzdC0+b3JpZ19yLCAwLCBtdF9zbG90 X2NvdW50KG1hc3QtPm9yaWdfci0+bm9kZSksDQorCQkgICBtYXN0LT5ibiwgYl9lbmQpOw0KKwlp ZiAoZnJlZSkNCisJCW1hdF9hZGQobWFzdC0+ZnJlZSwgb2xkX3IpOw0KKw0KKwltYXN0LT5vcmln X3ItPmxhc3QgPSBtYXN0LT5vcmlnX3ItPm1heDsNCisJaWYgKG9sZF9yID09IG1hc3QtPm9yaWdf bC0+bm9kZSkNCisJCW1hc3QtPm9yaWdfbC0+bm9kZSA9IG1hc3QtPm9yaWdfci0+bm9kZTsNCit9 DQorDQorLyoNCisgKiBtYXN0X3JlYmFsYW5jZV9wcmV2KCkgLSBSZWJhbGFuY2UgYWdhaW5zdCB0 aGUgcHJldmlvdXMgbm9kZQ0KKyAqIEBtYXN0OiBUaGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAq IEBvbGRfbDogVGhlIGVuY29kZWQgbWFwbGUgbm9kZSB0byB0aGUgbGVmdCAocHJldmlvdXMgbm9k ZSkNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF9yZWJhbGFuY2VfcHJldihzdHJ1Y3Qg bWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwNCisJCQkJICAgICAgIHN0cnVjdCBtYXBsZV9lbm9k ZSAqb2xkX2wpDQorew0KKwl1bnNpZ25lZCBjaGFyIGVuZCA9IG1hc19kYXRhX2VuZChtYXN0LT5v cmlnX2wpICsgMTsNCisJdW5zaWduZWQgY2hhciBiX2VuZCA9IG1hc3QtPmJuLT5iX2VuZDsNCisN CisJbWFiX3NoaWZ0X3JpZ2h0KG1hc3QtPmJuLCBlbmQpOw0KKwltYXNfbWFiX2NwKG1hc3QtPm9y aWdfbCwgMCwgZW5kIC0gMSwgbWFzdC0+Ym4sIDApOw0KKwltYXRfYWRkKG1hc3QtPmZyZWUsIG9s ZF9sKTsNCisJaWYgKG1hc3QtPm9yaWdfci0+bm9kZSA9PSBvbGRfbCkNCisJCW1hc3QtPm9yaWdf ci0+bm9kZSA9IG1hc3QtPm9yaWdfbC0+bm9kZTsNCisJbWFzdC0+bC0+bWluID0gbWFzdC0+b3Jp Z19sLT5taW47DQorCW1hc3QtPm9yaWdfbC0+aW5kZXggPSBtYXN0LT5vcmlnX2wtPm1pbjsNCisJ bWFzdC0+Ym4tPmJfZW5kID0gZW5kICsgYl9lbmQ7DQorCW1hc3QtPmwtPm9mZnNldCArPSBlbmQ7 DQorfQ0KKw0KKy8qDQorICogbWFzdF9zaWJsaW5nX3JlYmFsYW5jZV9yaWdodCgpIC0gUmViYWxh bmNlIGZyb20gbm9kZXMgd2l0aCB0aGUgc2FtZSBwYXJlbnRzLg0KKyAqIENoZWNrIHRoZSByaWdo dCBzaWRlLCB0aGVuIHRoZSBsZWZ0LiAgRGF0YSBpcyBjb3BpZWQgaW50byB0aGUgQG1hc3QtPmJu Lg0KKyAqIEBtYXN0OiBUaGUgbWFwbGVfc3VidHJlZV9zdGF0ZS4NCisgKi8NCitzdGF0aWMgaW5s aW5lDQorYm9vbCBtYXN0X3NpYmxpbmdfcmViYWxhbmNlX3JpZ2h0KHN0cnVjdCBtYXBsZV9zdWJ0 cmVlX3N0YXRlICptYXN0LCBib29sIGZyZWUpDQorew0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm9s ZF9yOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKm9sZF9sOw0KKw0KKwlvbGRfciA9IG1hc3QtPm9y aWdfci0+bm9kZTsNCisJaWYgKG1hc19uZXh0X3NpYmxpbmcobWFzdC0+b3JpZ19yKSkgew0KKwkJ bWFzdF9yZWJhbGFuY2VfbmV4dChtYXN0LCBvbGRfciwgZnJlZSk7DQorCQlyZXR1cm4gdHJ1ZTsN CisJfQ0KKw0KKwlvbGRfbCA9IG1hc3QtPm9yaWdfbC0+bm9kZTsNCisJaWYgKG1hc19wcmV2X3Np YmxpbmcobWFzdC0+b3JpZ19sKSkgew0KKwkJbWFzdC0+Ym4tPnR5cGUgPSBtdGVfbm9kZV90eXBl KG1hc3QtPm9yaWdfbC0+bm9kZSk7DQorCQltYXN0X3JlYmFsYW5jZV9wcmV2KG1hc3QsIG9sZF9s KTsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCXJldHVybiBmYWxzZTsNCit9DQorDQorc3Rh dGljIGlubGluZSBpbnQgbWFzX3ByZXZfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWdu ZWQgbG9uZyBtaW4pOw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hc19uZXh0X25vZGUoc3RydWN0IG1h X3N0YXRlICptYXMsIHN0cnVjdCBtYXBsZV9ub2RlICpub2RlLA0KKwkJCQl1bnNpZ25lZCBsb25n IG1heCk7DQorLyoNCisgKiBtYXN0X2NvdXNpbl9yZWJhbGFuY2VfcmlnaHQoKSAtIFJlYmFsYW5j ZSBmcm9tIG5vZGVzIHdpdGggZGlmZmVyZW50IHBhcmVudHMuDQorICogQ2hlY2sgdGhlIHJpZ2h0 IHNpZGUsIHRoZW4gdGhlIGxlZnQuICBEYXRhIGlzIGNvcGllZCBpbnRvIHRoZSBAbWFzdC0+Ym4u DQorICogQG1hc3Q6IFRoZSBtYXBsZV9zdWJ0cmVlX3N0YXRlLg0KKyAqLw0KK3N0YXRpYyBpbmxp bmUNCitib29sIG1hc3RfY291c2luX3JlYmFsYW5jZV9yaWdodChzdHJ1Y3QgbWFwbGVfc3VidHJl ZV9zdGF0ZSAqbWFzdCwgYm9vbCBmcmVlKQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vub2RlICpvbGRf bCA9IG1hc3QtPm9yaWdfbC0+bm9kZTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpvbGRfciA9IG1h c3QtPm9yaWdfci0+bm9kZTsNCisNCisJTUFfU1RBVEUodG1wLCBtYXN0LT5vcmlnX3ItPnRyZWUs IG1hc3QtPm9yaWdfci0+aW5kZXgsIG1hc3QtPm9yaWdfci0+bGFzdCk7DQorDQorCXRtcCA9ICpt YXN0LT5vcmlnX3I7DQorCW1hc19uZXh0X25vZGUobWFzdC0+b3JpZ19yLCBtYXNfbW4obWFzdC0+ b3JpZ19yKSwgVUxPTkdfTUFYKTsNCisJaWYgKCFtYXNfaXNfbm9uZShtYXN0LT5vcmlnX3IpKSB7 DQorCQltYXN0X3JlYmFsYW5jZV9uZXh0KG1hc3QsIG9sZF9yLCBmcmVlKTsNCisJCXJldHVybiB0 cnVlOw0KKwl9DQorDQorCSptYXN0LT5vcmlnX3IgPSAqbWFzdC0+b3JpZ19sOw0KKwkqbWFzdC0+ ciA9ICptYXN0LT5sOw0KKwltYXNfcHJldl9ub2RlKG1hc3QtPm9yaWdfbCwgMCk7DQorCWlmICht YXNfaXNfbm9uZShtYXN0LT5vcmlnX2wpKSB7DQorCQkvKiBNYWtpbmcgYSBuZXcgcm9vdCB3aXRo IHRoZSBjb250ZW50cyBvZiBtYXN0LT5ibiAqLw0KKwkJKm1hc3QtPm9yaWdfbCA9ICptYXN0LT5v cmlnX3I7DQorCQkqbWFzdC0+b3JpZ19yID0gdG1wOw0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQor DQorCW1hc3QtPm9yaWdfbC0+b2Zmc2V0ID0gMDsNCisJbWFzdF9yZWJhbGFuY2VfcHJldihtYXN0 LCBvbGRfbCk7DQorCXJldHVybiB0cnVlOw0KK30NCisNCisvKg0KKyAqIG1hc3RfYXNjZW5kX2Zy ZWUoKSAtIEFkZCBjdXJyZW50IG9yaWdpbmFsIG1hcGxlIHN0YXRlIG5vZGVzIHRvIHRoZSBmcmVl IGxpc3QNCisgKiBhbmQgYXNjZW5kLg0KKyAqIEBtYXN0OiB0aGUgbWFwbGUgc3VidHJlZSBzdGF0 ZS4NCisgKg0KKyAqIEFzY2VuZCB0aGUgb3JpZ2luYWwgbGVmdCBhbmQgcmlnaHQgc2lkZXMgYW5k IGFkZCB0aGUgcHJldmlvdXMgbm9kZXMgdG8gdGhlDQorICogZnJlZSBsaXN0LiAgU2V0IHRoZSBz bG90cyB0byBwb2ludCB0byB0aGUgY29ycmVjdCBsb2NhdGlvbiBpbiB0aGUgbmV3IG5vZGVzLg0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZA0KK21hc3RfYXNjZW5kX2ZyZWUoc3RydWN0IG1hcGxl X3N1YnRyZWVfc3RhdGUgKm1hc3QpDQorew0KKwlNQV9XUl9TVEFURSh3cl9tYXMsIG1hc3QtPm9y aWdfciwgIE5VTEwpOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmxlZnQgPSBtYXN0LT5vcmlnX2wt Pm5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqcmlnaHQgPSBtYXN0LT5vcmlnX3ItPm5vZGU7 DQorDQorCW1hc19hc2NlbmQobWFzdC0+b3JpZ19sKTsNCisJbWFzX2FzY2VuZChtYXN0LT5vcmln X3IpOw0KKwltYXRfYWRkKG1hc3QtPmZyZWUsIGxlZnQpOw0KKw0KKwlpZiAobGVmdCAhPSByaWdo dCkNCisJCW1hdF9hZGQobWFzdC0+ZnJlZSwgcmlnaHQpOw0KKw0KKwltYXN0LT5vcmlnX3ItPm9m ZnNldCA9IDA7DQorCW1hc3QtPm9yaWdfci0+aW5kZXggPSBtYXN0LT5yLT5tYXg7DQorCS8qIGxh c3Qgc2hvdWxkIGJlIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIGluZGV4ICovDQorCWlmIChtYXN0 LT5vcmlnX3ItPmxhc3QgPCBtYXN0LT5vcmlnX3ItPmluZGV4KQ0KKwkJbWFzdC0+b3JpZ19yLT5s YXN0ID0gbWFzdC0+b3JpZ19yLT5pbmRleDsNCisJLyoNCisJICogVGhlIG5vZGUgbWF5IG5vdCBj b250YWluIHRoZSB2YWx1ZSBzbyBzZXQgc2xvdCB0byBlbnN1cmUgYWxsDQorCSAqIG9mIHRoZSBu b2RlcyBjb250ZW50cyBhcmUgZnJlZWQgb3IgZGVzdHJveWVkLg0KKwkgKi8NCisJaWYgKG1hc3Qt Pm9yaWdfci0+bWF4IDwgbWFzdC0+b3JpZ19yLT5sYXN0KQ0KKwkJbWFzdC0+b3JpZ19yLT5vZmZz ZXQgPSBtYXNfZGF0YV9lbmQobWFzdC0+b3JpZ19yKSArIDE7DQorCWVsc2Ugew0KKwkJd3JfbWFz LnR5cGUgPSBtdGVfbm9kZV90eXBlKG1hc3QtPm9yaWdfci0+bm9kZSk7DQorCQltYXNfd3Jfbm9k ZV93YWxrKCZ3cl9tYXMpOw0KKwl9DQorCS8qIFNldCB1cCB0aGUgbGVmdCBzaWRlIG9mIHRoaW5n cyAqLw0KKwltYXN0LT5vcmlnX2wtPm9mZnNldCA9IDA7DQorCW1hc3QtPm9yaWdfbC0+aW5kZXgg PSBtYXN0LT5sLT5taW47DQorCXdyX21hcy5tYXMgPSBtYXN0LT5vcmlnX2w7DQorCXdyX21hcy50 eXBlID0gbXRlX25vZGVfdHlwZShtYXN0LT5vcmlnX2wtPm5vZGUpOw0KKwltYXNfd3Jfbm9kZV93 YWxrKCZ3cl9tYXMpOw0KK30NCisNCisvKg0KKyAqIG1hc19uZXdfbWFfbm9kZSgpIC0gQ3JlYXRl IGFuZCByZXR1cm4gYSBuZXcgbWFwbGUgbm9kZS4gIEhlbHBlciBmdW5jdGlvbi4NCisgKiBAbWFz OiB0aGUgbWFwbGUgc3RhdGUgd2l0aCB0aGUgYWxsb2NhdGlvbnMuDQorICogQGJfbm9kZTogdGhl IG1hcGxlX2JpZ19ub2RlIHdpdGggdGhlIHR5cGUgZW5jb2RpbmcuDQorICoNCisgKiBVc2UgdGhl IG5vZGUgdHlwZSBmcm9tIHRoZSBtYXBsZV9iaWdfbm9kZSB0byBhbGxvY2F0ZSBhIG5ldyBub2Rl IGZyb20gdGhlDQorICogbWFfc3RhdGUuICBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBtYWlubHkgZm9y IGNvZGUgcmVhZGFiaWxpdHkuDQorICoNCisgKiBSZXR1cm46IEEgbmV3IG1hcGxlIGVuY29kZWQg bm9kZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxlX2Vub2RlDQorKm1hc19uZXdf bWFfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgc3RydWN0IG1hcGxlX2JpZ19ub2RlICpiX25v ZGUpDQorew0KKwlyZXR1cm4gbXRfbWtfbm9kZShtYV9tbm9kZV9wdHIobWFzX3BvcF9ub2RlKG1h cykpLCBiX25vZGUtPnR5cGUpOw0KK30NCisNCisvKg0KKyAqIG1hc19tYWJfdG9fbm9kZSgpIC0g U2V0IHVwIHJpZ2h0IGFuZCBtaWRkbGUgbm9kZXMNCisgKg0KKyAqIEBtYXM6IHRoZSBtYXBsZSBz dGF0ZSB0aGF0IGNvbnRhaW5zIHRoZSBhbGxvY2F0aW9ucy4NCisgKiBAYl9ub2RlOiB0aGUgbm9k ZSB3aGljaCBjb250YWlucyB0aGUgZGF0YS4NCisgKiBAbGVmdDogVGhlIHBvaW50ZXIgd2hpY2gg d2lsbCBoYXZlIHRoZSBsZWZ0IG5vZGUNCisgKiBAcmlnaHQ6IFRoZSBwb2ludGVyIHdoaWNoIG1h eSBoYXZlIHRoZSByaWdodCBub2RlDQorICogQG1pZGRsZTogdGhlIHBvaW50ZXIgd2hpY2ggbWF5 IGhhdmUgdGhlIG1pZGRsZSBub2RlIChyYXJlKQ0KKyAqIEBtaWRfc3BsaXQ6IHRoZSBzcGxpdCBs b2NhdGlvbiBmb3IgdGhlIG1pZGRsZSBub2RlDQorICoNCisgKiBSZXR1cm46IHRoZSBzcGxpdCBv ZiBsZWZ0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciBtYXNfbWFiX3RvX25v ZGUoc3RydWN0IG1hX3N0YXRlICptYXMsDQorCXN0cnVjdCBtYXBsZV9iaWdfbm9kZSAqYl9ub2Rl LCBzdHJ1Y3QgbWFwbGVfZW5vZGUgKipsZWZ0LA0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKipyaWdo dCwgc3RydWN0IG1hcGxlX2Vub2RlICoqbWlkZGxlLA0KKwl1bnNpZ25lZCBjaGFyICptaWRfc3Bs aXQsIHVuc2lnbmVkIGxvbmcgbWluKQ0KK3sNCisJdW5zaWduZWQgY2hhciBzcGxpdCA9IDA7DQor CXVuc2lnbmVkIGNoYXIgc2xvdF9jb3VudCA9IG10X3Nsb3RzW2Jfbm9kZS0+dHlwZV07DQorDQor CSpsZWZ0ID0gbWFzX25ld19tYV9ub2RlKG1hcywgYl9ub2RlKTsNCisJKnJpZ2h0ID0gTlVMTDsN CisJKm1pZGRsZSA9IE5VTEw7DQorCSptaWRfc3BsaXQgPSAwOw0KKw0KKwlpZiAoYl9ub2RlLT5i X2VuZCA8IHNsb3RfY291bnQpIHsNCisJCXNwbGl0ID0gYl9ub2RlLT5iX2VuZDsNCisJfSBlbHNl IHsNCisJCXNwbGl0ID0gbWFiX2NhbGNfc3BsaXQobWFzLCBiX25vZGUsIG1pZF9zcGxpdCwgbWlu KTsNCisJCSpyaWdodCA9IG1hc19uZXdfbWFfbm9kZShtYXMsIGJfbm9kZSk7DQorCX0NCisNCisJ aWYgKCptaWRfc3BsaXQpDQorCQkqbWlkZGxlID0gbWFzX25ld19tYV9ub2RlKG1hcywgYl9ub2Rl KTsNCisNCisJcmV0dXJuIHNwbGl0Ow0KKw0KK30NCisNCisvKg0KKyAqIG1hYl9zZXRfYl9lbmQo KSAtIEFkZCBlbnRyeSB0byBiX25vZGUgYXQgYl9ub2RlLT5iX2VuZCBhbmQgaW5jcmVtZW50IHRo ZSBlbmQNCisgKiBwb2ludGVyLg0KKyAqIEBiX25vZGUgLSB0aGUgYmlnIG5vZGUgdG8gYWRkIHRo ZSBlbnRyeQ0KKyAqIEBtYXMgLSB0aGUgbWFwbGUgc3RhdGUgdG8gZ2V0IHRoZSBwaXZvdCAobWFz LT5tYXgpDQorICogQGVudHJ5IC0gdGhlIGVudHJ5IHRvIGFkZCwgaWYgTlVMTCBub3RoaW5nIGhh cHBlbnMuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hYl9zZXRfYl9lbmQoc3RydWN0IG1h cGxlX2JpZ19ub2RlICpiX25vZGUsDQorCQkJCSBzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJCQkJ IHZvaWQgKmVudHJ5KQ0KK3sNCisJaWYgKCFlbnRyeSkNCisJCXJldHVybjsNCisNCisJYl9ub2Rl LT5zbG90W2Jfbm9kZS0+Yl9lbmRdID0gZW50cnk7DQorCWlmIChtdF9pc19hbGxvYyhtYXMtPnRy ZWUpKQ0KKwkJYl9ub2RlLT5nYXBbYl9ub2RlLT5iX2VuZF0gPSBtYXNfbWF4X2dhcChtYXMpOw0K KwliX25vZGUtPnBpdm90W2Jfbm9kZS0+Yl9lbmQrK10gPSBtYXMtPm1heDsNCit9DQorDQorLyoN CisgKiBtYXNfc2V0X3NwbGl0X3BhcmVudCgpIC0gY29tYmluZV90aGVuX3NlcGFyYXRlIGhlbHBl ciBmdW5jdGlvbi4gIFNldHMgdGhlIHBhcmVudA0KKyAqIG9mIEBtYXMtPm5vZGUgdG8gZWl0aGVy IEBsZWZ0IG9yIEByaWdodCwgZGVwZW5kaW5nIG9uIEBzbG90IGFuZCBAc3BsaXQNCisgKg0KKyAq IEBtYXMgLSB0aGUgbWFwbGUgc3RhdGUgd2l0aCB0aGUgbm9kZSB0aGF0IG5lZWRzIGEgcGFyZW50 DQorICogQGxlZnQgLSBwb3NzaWJsZSBwYXJlbnQgMQ0KKyAqIEByaWdodCAtIHBvc3NpYmxlIHBh cmVudCAyDQorICogQHNsb3QgLSB0aGUgc2xvdCB0aGUgbWFzLT5ub2RlIHdhcyBwbGFjZWQNCisg KiBAc3BsaXQgLSB0aGUgc3BsaXQgbG9jYXRpb24gYmV0d2VlbiBAbGVmdCBhbmQgQHJpZ2h0DQor ICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19zZXRfc3BsaXRfcGFyZW50KHN0cnVjdCBtYV9z dGF0ZSAqbWFzLA0KKwkJCQkJc3RydWN0IG1hcGxlX2Vub2RlICpsZWZ0LA0KKwkJCQkJc3RydWN0 IG1hcGxlX2Vub2RlICpyaWdodCwNCisJCQkJCXVuc2lnbmVkIGNoYXIgKnNsb3QsIHVuc2lnbmVk IGNoYXIgc3BsaXQpDQorew0KKwlpZiAobWFzX2lzX25vbmUobWFzKSkNCisJCXJldHVybjsNCisN CisJaWYgKCgqc2xvdCkgPD0gc3BsaXQpDQorCQltdGVfc2V0X3BhcmVudChtYXMtPm5vZGUsIGxl ZnQsICpzbG90KTsNCisJZWxzZSBpZiAocmlnaHQpDQorCQltdGVfc2V0X3BhcmVudChtYXMtPm5v ZGUsIHJpZ2h0LCAoKnNsb3QpIC0gc3BsaXQgLSAxKTsNCisNCisJKCpzbG90KSsrOw0KK30NCisN CisvKg0KKyAqIG10ZV9taWRfc3BsaXRfY2hlY2soKSAtIENoZWNrIGlmIHRoZSBuZXh0IG5vZGUg cGFzc2VzIHRoZSBtaWQtc3BsaXQNCisgKiBAKipsOiBQb2ludGVyIHRvIGxlZnQgZW5jb2RlZCBt YXBsZSBub2RlLg0KKyAqIEAqKm06IFBvaW50ZXIgdG8gbWlkZGxlIGVuY29kZWQgbWFwbGUgbm9k ZS4NCisgKiBAKipyOiBQb2ludGVyIHRvIHJpZ2h0IGVuY29kZWQgbWFwbGUgbm9kZS4NCisgKiBA c2xvdDogVGhlIG9mZnNldA0KKyAqIEAqc3BsaXQ6IFRoZSBzcGxpdCBsb2NhdGlvbi4NCisgKiBA bWlkX3NwbGl0OiBUaGUgbWlkZGxlIHNwbGl0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBt dGVfbWlkX3NwbGl0X2NoZWNrKHN0cnVjdCBtYXBsZV9lbm9kZSAqKmwsDQorCQkJCSAgICAgICBz dHJ1Y3QgbWFwbGVfZW5vZGUgKipyLA0KKwkJCQkgICAgICAgc3RydWN0IG1hcGxlX2Vub2RlICpy aWdodCwNCisJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgc2xvdCwNCisJCQkJICAgICAgIHVuc2ln bmVkIGNoYXIgKnNwbGl0LA0KKwkJCQkgICAgICAgdW5zaWduZWQgY2hhciBtaWRfc3BsaXQpDQor ew0KKwlpZiAoKnIgPT0gcmlnaHQpDQorCQlyZXR1cm47DQorDQorCWlmIChzbG90IDwgbWlkX3Nw bGl0KQ0KKwkJcmV0dXJuOw0KKw0KKwkqbCA9ICpyOw0KKwkqciA9IHJpZ2h0Ow0KKwkqc3BsaXQg PSBtaWRfc3BsaXQ7DQorfQ0KKw0KKy8qDQorICogbWFzdF9zZXRfc3BsaXRfcGFyZW50cygpIC0g SGVscGVyIGZ1bmN0aW9uIHRvIHNldCB0aHJlZSBub2RlcyBwYXJlbnRzLiAgU2xvdA0KKyAqIGlz IHRha2VuIGZyb20gQG1hc3QtPmwuDQorICogQG1hc3QgLSB0aGUgbWFwbGUgc3VidHJlZSBzdGF0 ZQ0KKyAqIEBsZWZ0IC0gdGhlIGxlZnQgbm9kZQ0KKyAqIEByaWdodCAtIHRoZSByaWdodCBub2Rl DQorICogQHNwbGl0IC0gdGhlIHNwbGl0IGxvY2F0aW9uLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUg dm9pZCBtYXN0X3NldF9zcGxpdF9wYXJlbnRzKHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICpt YXN0LA0KKwkJCQkJICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKmxlZnQsDQorCQkJCQkgIHN0cnVjdCBt YXBsZV9lbm9kZSAqbWlkZGxlLA0KKwkJCQkJICBzdHJ1Y3QgbWFwbGVfZW5vZGUgKnJpZ2h0LA0K KwkJCQkJICB1bnNpZ25lZCBjaGFyIHNwbGl0LA0KKwkJCQkJICB1bnNpZ25lZCBjaGFyIG1pZF9z cGxpdCkNCit7DQorCXVuc2lnbmVkIGNoYXIgc2xvdDsNCisJc3RydWN0IG1hcGxlX2Vub2RlICps ID0gbGVmdDsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpyID0gcmlnaHQ7DQorDQorCWlmIChtYXNf aXNfbm9uZShtYXN0LT5sKSkNCisJCXJldHVybjsNCisNCisJaWYgKG1pZGRsZSkNCisJCXIgPSBt aWRkbGU7DQorDQorCXNsb3QgPSBtYXN0LT5sLT5vZmZzZXQ7DQorDQorCW10ZV9taWRfc3BsaXRf Y2hlY2soJmwsICZyLCByaWdodCwgc2xvdCwgJnNwbGl0LCBtaWRfc3BsaXQpOw0KKwltYXNfc2V0 X3NwbGl0X3BhcmVudChtYXN0LT5sLCBsLCByLCAmc2xvdCwgc3BsaXQpOw0KKw0KKwltdGVfbWlk X3NwbGl0X2NoZWNrKCZsLCAmciwgcmlnaHQsIHNsb3QsICZzcGxpdCwgbWlkX3NwbGl0KTsNCisJ bWFzX3NldF9zcGxpdF9wYXJlbnQobWFzdC0+bSwgbCwgciwgJnNsb3QsIHNwbGl0KTsNCisNCisJ bXRlX21pZF9zcGxpdF9jaGVjaygmbCwgJnIsIHJpZ2h0LCBzbG90LCAmc3BsaXQsIG1pZF9zcGxp dCk7DQorCW1hc19zZXRfc3BsaXRfcGFyZW50KG1hc3QtPnIsIGwsIHIsICZzbG90LCBzcGxpdCk7 DQorfQ0KKw0KKy8qDQorICogbWFzX3dtYl9yZXBsYWNlKCkgLSBXcml0ZSBtZW1vcnkgYmFycmll ciBhbmQgcmVwbGFjZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBmcmVlOiB0aGUg bWFwbGUgdG9waWFyeSBsaXN0IG9mIG5vZGVzIHRvIGZyZWUNCisgKiBAZGVzdHJveTogVGhlIG1h cGxlIHRvcGlhcnkgbGlzdCBvZiBub2RlcyB0byBkZXN0cm95ICh3YWxrIGFuZCBmcmVlKQ0KKyAq DQorICogVXBkYXRlcyBnYXAgYXMgbmVjZXNzYXJ5Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9p ZCBtYXNfd21iX3JlcGxhY2Uoc3RydWN0IG1hX3N0YXRlICptYXMsDQorCQkJCSAgIHN0cnVjdCBt YV90b3BpYXJ5ICpmcmVlLA0KKwkJCQkgICBzdHJ1Y3QgbWFfdG9waWFyeSAqZGVzdHJveSkNCit7 DQorCS8qIEFsbCBub2RlcyBtdXN0IHNlZSBvbGQgZGF0YSBhcyBkZWFkIHByaW9yIHRvIHJlcGxh Y2luZyB0aGF0IGRhdGEgKi8NCisJc21wX3dtYigpOw0KKw0KKwkvKiBJbnNlcnQgdGhlIG5ldyBk YXRhIGluIHRoZSB0cmVlICovDQorCW1hc19yZXBsYWNlKG1hcywgdHJ1ZSk7DQorDQorCWlmICgh bXRlX2lzX2xlYWYobWFzLT5ub2RlKSkNCisJCW1hc19kZXNjZW5kX2Fkb3B0KG1hcyk7DQorDQor CW1hc19tYXRfZnJlZShtYXMsIGZyZWUpOw0KKw0KKwlpZiAoZGVzdHJveSkNCisJCW1hc19tYXRf ZGVzdHJveShtYXMsIGRlc3Ryb3kpOw0KKw0KKwlpZiAobXRlX2lzX2xlYWYobWFzLT5ub2RlKSkN CisJCXJldHVybjsNCisNCisJbWFzX3VwZGF0ZV9nYXAobWFzKTsNCit9DQorDQorLyoNCisgKiBt YXN0X25ld19yb290KCkgLSBTZXQgYSBuZXcgdHJlZSByb290IGR1cmluZyBzdWJ0cmVlIGNyZWF0 aW9uDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICogQG1hczogVGhlIG1h cGxlIHN0YXRlDQorICogKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF9uZXdfcm9vdChzdHJ1 Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwNCisJCQkJIHN0cnVjdCBtYV9zdGF0ZSAqbWFz KQ0KK3sNCisJbWFzX21uKG1hc3QtPmwpLT5wYXJlbnQgPQ0KKwkJbWFfcGFyZW50X3B0cigoKHVu c2lnbmVkIGxvbmcpbWFzLT50cmVlIHwgTUFfUk9PVF9QQVJFTlQpKTsNCisJaWYgKCFtdGVfZGVh ZF9ub2RlKG1hc3QtPm9yaWdfbC0+bm9kZSkgJiYNCisJICAgICFtdGVfaXNfcm9vdChtYXN0LT5v cmlnX2wtPm5vZGUpKSB7DQorCQlkbyB7DQorCQkJbWFzdF9hc2NlbmRfZnJlZShtYXN0KTsNCisJ CQltYXN0X3RvcGlhcnkobWFzdCk7DQorCQl9IHdoaWxlICghbXRlX2lzX3Jvb3QobWFzdC0+b3Jp Z19sLT5ub2RlKSk7DQorCX0NCisJaWYgKChtYXN0LT5vcmlnX2wtPm5vZGUgIT0gbWFzLT5ub2Rl KSAmJg0KKwkJICAgKG1hc3QtPmwtPmRlcHRoID4gbWFzX210X2hlaWdodChtYXMpKSkgew0KKwkJ bWF0X2FkZChtYXN0LT5mcmVlLCBtYXMtPm5vZGUpOw0KKwl9DQorfQ0KKw0KKy8qDQorICogbWFz dF9jcF90b19ub2RlcygpIC0gQ29weSBkYXRhIG91dCB0byBub2Rlcy4NCisgKiBAbWFzdDogVGhl IG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKiBAbGVmdDogVGhlIGxlZnQgZW5jb2RlZCBtYXBsZSBu b2RlDQorICogQG1pZGRsZTogVGhlIG1pZGRsZSBlbmNvZGVkIG1hcGxlIG5vZGUNCisgKiBAcmln aHQ6IFRoZSByaWdodCBlbmNvZGVkIG1hcGxlIG5vZGUNCisgKiBAc3BsaXQ6IFRoZSBsb2NhdGlv biB0byBzcGxpdCBiZXR3ZWVuIGxlZnQgYW5kIChtaWRkbGUgPyBtaWRkbGUgOiByaWdodCkNCisg KiBAbWlkX3NwbGl0OiBUaGUgbG9jYXRpb24gdG8gc3BsaXQgYmV0d2VlbiBtaWRkbGUgYW5kIHJp Z2h0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXN0X2NwX3RvX25vZGVzKHN0cnVjdCBt YXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0LA0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmxlZnQsIHN0 cnVjdCBtYXBsZV9lbm9kZSAqbWlkZGxlLA0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKnJpZ2h0LCB1 bnNpZ25lZCBjaGFyIHNwbGl0LCB1bnNpZ25lZCBjaGFyIG1pZF9zcGxpdCkNCit7DQorCWJvb2wg bmV3X2xtYXggPSB0cnVlOw0KKw0KKwltYXN0LT5sLT5ub2RlID0gbXRlX25vZGVfb3Jfbm9uZShs ZWZ0KTsNCisJbWFzdC0+bS0+bm9kZSA9IG10ZV9ub2RlX29yX25vbmUobWlkZGxlKTsNCisJbWFz dC0+ci0+bm9kZSA9IG10ZV9ub2RlX29yX25vbmUocmlnaHQpOw0KKw0KKwltYXN0LT5sLT5taW4g PSBtYXN0LT5vcmlnX2wtPm1pbjsNCisJaWYgKHNwbGl0ID09IG1hc3QtPmJuLT5iX2VuZCkgew0K KwkJbWFzdC0+bC0+bWF4ID0gbWFzdC0+b3JpZ19yLT5tYXg7DQorCQluZXdfbG1heCA9IGZhbHNl Ow0KKwl9DQorDQorCW1hYl9tYXNfY3AobWFzdC0+Ym4sIDAsIHNwbGl0LCBtYXN0LT5sLCBuZXdf bG1heCk7DQorDQorCWlmIChtaWRkbGUpIHsNCisJCW1hYl9tYXNfY3AobWFzdC0+Ym4sIDEgKyBz cGxpdCwgbWlkX3NwbGl0LCBtYXN0LT5tLCB0cnVlKTsNCisJCW1hc3QtPm0tPm1pbiA9IG1hc3Qt PmJuLT5waXZvdFtzcGxpdF0gKyAxOw0KKwkJc3BsaXQgPSBtaWRfc3BsaXQ7DQorCX0NCisNCisJ bWFzdC0+ci0+bWF4ID0gbWFzdC0+b3JpZ19yLT5tYXg7DQorCWlmIChyaWdodCkgew0KKwkJbWFi X21hc19jcChtYXN0LT5ibiwgMSArIHNwbGl0LCBtYXN0LT5ibi0+Yl9lbmQsIG1hc3QtPnIsIGZh bHNlKTsNCisJCW1hc3QtPnItPm1pbiA9IG1hc3QtPmJuLT5waXZvdFtzcGxpdF0gKyAxOw0KKwl9 DQorfQ0KKw0KKy8qDQorICogbWFzdF9jb21iaW5lX2NwX2xlZnQgLSBDb3B5IGluIHRoZSBvcmln aW5hbCBsZWZ0IHNpZGUgb2YgdGhlIHRyZWUgaW50byB0aGUNCisgKiBjb21iaW5lZCBkYXRhIHNl dCBpbiB0aGUgbWFwbGUgc3VidHJlZSBzdGF0ZSBiaWcgbm9kZS4NCisgKiBAbWFzdDogVGhlIG1h cGxlIHN1YnRyZWUgc3RhdGUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzdF9jb21iaW5l X2NwX2xlZnQoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QpDQorew0KKwl1bnNpZ25l ZCBjaGFyIGxfc2xvdCA9IG1hc3QtPm9yaWdfbC0+b2Zmc2V0Ow0KKw0KKwlpZiAoIWxfc2xvdCkN CisJCXJldHVybjsNCisNCisJbWFzX21hYl9jcChtYXN0LT5vcmlnX2wsIDAsIGxfc2xvdCAtIDEs IG1hc3QtPmJuLCAwKTsNCit9DQorDQorLyoNCisgKiBtYXN0X2NvbWJpbmVfY3BfcmlnaHQ6IENv cHkgaW4gdGhlIG9yaWdpbmFsIHJpZ2h0IHNpZGUgb2YgdGhlIHRyZWUgaW50byB0aGUNCisgKiBj b21iaW5lZCBkYXRhIHNldCBpbiB0aGUgbWFwbGUgc3VidHJlZSBzdGF0ZSBiaWcgbm9kZS4NCisg KiBAbWFzdDogVGhlIG1hcGxlIHN1YnRyZWUgc3RhdGUNCisgKi8NCitzdGF0aWMgaW5saW5lIHZv aWQgbWFzdF9jb21iaW5lX2NwX3JpZ2h0KHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0 KQ0KK3sNCisJaWYgKG1hc3QtPmJuLT5waXZvdFttYXN0LT5ibi0+Yl9lbmQgLSAxXSA+PSBtYXN0 LT5vcmlnX3ItPm1heCkNCisJCXJldHVybjsNCisNCisJbWFzX21hYl9jcChtYXN0LT5vcmlnX3Is IG1hc3QtPm9yaWdfci0+b2Zmc2V0ICsgMSwNCisJCSAgIG10X3Nsb3RfY291bnQobWFzdC0+b3Jp Z19yLT5ub2RlKSwgbWFzdC0+Ym4sDQorCQkgICBtYXN0LT5ibi0+Yl9lbmQpOw0KKwltYXN0LT5v cmlnX3ItPmxhc3QgPSBtYXN0LT5vcmlnX3ItPm1heDsNCit9DQorDQorLyoNCisgKiBtYXN0X3N1 ZmZpY2llbnQ6IENoZWNrIGlmIHRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlIGhhcyBlbm91Z2ggZGF0 YSBpbiB0aGUgYmlnDQorICogbm9kZSB0byBjcmVhdGUgYXQgbGVhc3Qgb25lIHN1ZmZpY2llbnQg bm9kZQ0KKyAqIEBtYXN0OiB0aGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgYm9vbCBtYXN0X3N1ZmZpY2llbnQoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1h c3QpDQorew0KKwlpZiAobWFzdC0+Ym4tPmJfZW5kID4gbXRfbWluX3Nsb3RfY291bnQobWFzdC0+ b3JpZ19sLT5ub2RlKSkNCisJCXJldHVybiB0cnVlOw0KKw0KKwlyZXR1cm4gZmFsc2U7DQorfQ0K Kw0KKy8qDQorICogbWFzdF9vdmVyZmxvdzogQ2hlY2sgaWYgdGhlcmUgaXMgdG9vIG11Y2ggZGF0 YSBpbiB0aGUgc3VidHJlZSBzdGF0ZSBmb3IgYQ0KKyAqIHNpbmdsZSBub2RlLg0KKyAqIEBtYXN0 OiBUaGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXN0 X292ZXJmbG93KHN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRlICptYXN0KQ0KK3sNCisJaWYgKG1h c3QtPmJuLT5iX2VuZCA+PSBtdF9zbG90X2NvdW50KG1hc3QtPm9yaWdfbC0+bm9kZSkpDQorCQly ZXR1cm4gdHJ1ZTsNCisNCisJcmV0dXJuIGZhbHNlOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZv aWQgKm10cmVlX3JhbmdlX3dhbGsoc3RydWN0IG1hX3N0YXRlICptYXMpDQorew0KKwl1bnNpZ25l ZCBsb25nICpwaXZvdHM7DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKwlzdHJ1Y3QgbWFwbGVf bm9kZSAqbm9kZTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpuZXh0LCAqbGFzdDsNCisJZW51bSBt YXBsZV90eXBlIHR5cGU7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdW5zaWduZWQgY2hhciBl bmQ7DQorCXVuc2lnbmVkIGxvbmcgbWF4LCBtaW47DQorCXVuc2lnbmVkIGxvbmcgcHJldl9tYXgs IHByZXZfbWluOw0KKw0KKwlsYXN0ID0gbmV4dCA9IG1hcy0+bm9kZTsNCisJcHJldl9taW4gPSBt aW4gPSBtYXMtPm1pbjsNCisJbWF4ID0gbWFzLT5tYXg7DQorCWRvIHsNCisJCW9mZnNldCA9IDA7 DQorCQlsYXN0ID0gbmV4dDsNCisJCW5vZGUgPSBtdGVfdG9fbm9kZShuZXh0KTsNCisJCXR5cGUg PSBtdGVfbm9kZV90eXBlKG5leHQpOw0KKwkJcGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIHR5cGUp Ow0KKwkJZW5kID0gbWFfZGF0YV9lbmQobm9kZSwgdHlwZSwgcGl2b3RzLCBtYXgpOw0KKwkJaWYg KHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQkJZ290byBkZWFkX25vZGU7DQorDQor CQlpZiAocGl2b3RzW29mZnNldF0gPj0gbWFzLT5pbmRleCkgew0KKwkJCXByZXZfbWF4ID0gbWF4 Ow0KKwkJCXByZXZfbWluID0gbWluOw0KKwkJCW1heCA9IHBpdm90c1tvZmZzZXRdOw0KKwkJCWdv dG8gbmV4dDsNCisJCX0NCisNCisJCWRvIHsNCisJCQlvZmZzZXQrKzsNCisJCX0gd2hpbGUoKG9m ZnNldCA8IGVuZCkgJiYgKHBpdm90c1tvZmZzZXRdIDwgbWFzLT5pbmRleCkpOw0KKw0KKwkJcHJl dl9taW4gPSBtaW47DQorCQltaW4gPSBwaXZvdHNbb2Zmc2V0IC0gMV0gKyAxOw0KKwkJcHJldl9t YXggPSBtYXg7DQorCQlpZiAobGlrZWx5KG9mZnNldCA8IGVuZCAmJiBwaXZvdHNbb2Zmc2V0XSkp DQorCQkJbWF4ID0gcGl2b3RzW29mZnNldF07DQorDQorbmV4dDoNCisJCXNsb3RzID0gbWFfc2xv dHMobm9kZSwgdHlwZSk7DQorCQluZXh0ID0gbXRfc2xvdChtYXMtPnRyZWUsIHNsb3RzLCBvZmZz ZXQpOw0KKwkJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9kZShub2RlKSkpDQorCQkJZ290byBkZWFk X25vZGU7DQorCX0gd2hpbGUgKCFtYV9pc19sZWFmKHR5cGUpKTsNCisNCisJbWFzLT5vZmZzZXQg PSBvZmZzZXQ7DQorCW1hcy0+aW5kZXggPSBtaW47DQorCW1hcy0+bGFzdCA9IG1heDsNCisJbWFz LT5taW4gPSBwcmV2X21pbjsNCisJbWFzLT5tYXggPSBwcmV2X21heDsNCisJbWFzLT5ub2RlID0g bGFzdDsNCisJcmV0dXJuICh2b2lkICopIG5leHQ7DQorDQorZGVhZF9ub2RlOg0KKwltYXNfcmVz ZXQobWFzKTsNCisJcmV0dXJuIE5VTEw7DQorfQ0KKw0KKy8qDQorICogbWFzX3NwYW5uaW5nX3Jl YmFsYW5jZSgpIC0gUmViYWxhbmNlIGFjcm9zcyB0d28gbm9kZXMgd2hpY2ggbWF5IG5vdCBiZSBw ZWVycy4NCisgKiBAbWFzOiBUaGUgc3RhcnRpbmcgbWFwbGUgc3RhdGUNCisgKiBAbWFzdDogVGhl IG1hcGxlX3N1YnRyZWVfc3RhdGUsIGtlZXBzIHRyYWNrIG9mIDQgbWFwbGUgc3RhdGVzLg0KKyAq IEBjb3VudDogVGhlIGVzdGltYXRlZCBjb3VudCBvZiBpdGVyYXRpb25zIG5lZWRlZC4NCisgKg0K KyAqIEZvbGxvdyB0aGUgdHJlZSB1cHdhcmRzIGZyb20gQGxfbWFzIGFuZCBAcl9tYXMgZm9yIEBj b3VudCwgb3IgdW50aWwgdGhlIHJvb3QNCisgKiBpcyBoaXQuICBGaXJzdCBAYl9ub2RlIGlzIHNw bGl0IGludG8gdHdvIGVudHJpZXMgd2hpY2ggYXJlIGluc2VydGVkIGludG8gdGhlDQorICogbmV4 dCBpdGVyYXRpb24gb2YgdGhlIGxvb3AuICBAYl9ub2RlIGlzIHJldHVybmVkIHBvcHVsYXRlZCB3 aXRoIHRoZSBmaW5hbA0KKyAqIGl0ZXJhdGlvbi4gQG1hcyBpcyB1c2VkIHRvIG9idGFpbiBhbGxv Y2F0aW9ucy4gIG9yaWdfbF9tYXMga2VlcHMgdHJhY2sgb2YgdGhlDQorICogbm9kZXMgdGhhdCB3 aWxsIHJlbWFpbiBhY3RpdmUgYnkgdXNpbmcgb3JpZ19sX21hcy0+aW5kZXggYW5kIG9yaWdfbF9t YXMtPmxhc3QNCisgKiB0byBhY2NvdW50IG9mIHdoYXQgaGFzIGJlZW4gY29waWVkIGludG8gdGhl IG5ldyBzdWItdHJlZS4gIFRoZSB1cGRhdGUgb2YNCisgKiBvcmlnX2xfbWFzLT5sYXN0IGlzIHVz ZWQgaW4gbWFzX2NvbnN1bWUgdG8gZmluZCB0aGUgc2xvdHMgdGhhdCB3aWxsIG5lZWQgdG8NCisg KiBiZSBlaXRoZXIgZnJlZWQgb3IgZGVzdHJveWVkLiAgb3JpZ19sX21hcy0+ZGVwdGgga2VlcHMg dHJhY2sgb2YgdGhlIGhlaWdodCBvZg0KKyAqIHRoZSBuZXcgc3ViLXRyZWUgaW4gY2FzZSB0aGUg c3ViLXRyZWUgYmVjb21lcyB0aGUgZnVsbCB0cmVlLg0KKyAqDQorICogUmV0dXJuOiB0aGUgbnVt YmVyIG9mIGVsZW1lbnRzIGluIGJfbm9kZSBkdXJpbmcgdGhlIGxhc3QgbG9vcC4NCisgKi8NCitz dGF0aWMgaW50IG1hc19zcGFubmluZ19yZWJhbGFuY2Uoc3RydWN0IG1hX3N0YXRlICptYXMsDQor CQlzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFzdCwgdW5zaWduZWQgY2hhciBjb3VudCkN Cit7DQorCXVuc2lnbmVkIGNoYXIgc3BsaXQsIG1pZF9zcGxpdDsNCisJdW5zaWduZWQgY2hhciBz bG90ID0gMDsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpsZWZ0ID0gTlVMTCwgKm1pZGRsZSA9IE5V TEwsICpyaWdodCA9IE5VTEw7DQorDQorCU1BX1NUQVRFKGxfbWFzLCBtYXMtPnRyZWUsIG1hcy0+ aW5kZXgsIG1hcy0+aW5kZXgpOw0KKwlNQV9TVEFURShyX21hcywgbWFzLT50cmVlLCBtYXMtPmlu ZGV4LCBtYXMtPmluZGV4KTsNCisJTUFfU1RBVEUobV9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRl eCwgbWFzLT5pbmRleCk7DQorCU1BX1RPUElBUlkoZnJlZSwgbWFzLT50cmVlKTsNCisJTUFfVE9Q SUFSWShkZXN0cm95LCBtYXMtPnRyZWUpOw0KKw0KKwkvKg0KKwkgKiBUaGUgdHJlZSBuZWVkcyB0 byBiZSByZWJhbGFuY2VkIGFuZCBsZWF2ZXMgbmVlZCB0byBiZSBrZXB0IGF0IHRoZSBzYW1lIGxl dmVsLg0KKwkgKiBSZWJhbGFuY2luZyBpcyBkb25lIGJ5IHVzZSBvZiB0aGUgYGBzdHJ1Y3QgbWFw bGVfdG9waWFyeWBgLg0KKwkgKi8NCisJbWFzdC0+bCA9ICZsX21hczsNCisJbWFzdC0+bSA9ICZt X21hczsNCisJbWFzdC0+ciA9ICZyX21hczsNCisJbWFzdC0+ZnJlZSA9ICZmcmVlOw0KKwltYXN0 LT5kZXN0cm95ID0gJmRlc3Ryb3k7DQorCWxfbWFzLm5vZGUgPSByX21hcy5ub2RlID0gbV9tYXMu bm9kZSA9IE1BU19OT05FOw0KKwlpZiAoIW1hc19pc19yb290X2xpbWl0cyhtYXN0LT5vcmlnX2wp ICYmDQorCSAgICB1bmxpa2VseShtYXN0LT5ibi0+Yl9lbmQgPD0gbXRfbWluX3Nsb3RzW21hc3Qt PmJuLT50eXBlXSkpIHsNCisJCS8qDQorCQkgKiBEbyBub3QgZnJlZSB0aGUgY3VycmVudCBub2Rl IGFzIGl0IG1heSBiZSBmcmVlZCBpbiBhIGJ1bGsNCisJCSAqIGZyZWUuDQorCQkgKi8NCisJCWlm ICghbWFzdF9zaWJsaW5nX3JlYmFsYW5jZV9yaWdodChtYXN0LCBmYWxzZSkpDQorCQkJbWFzdF9j b3VzaW5fcmViYWxhbmNlX3JpZ2h0KG1hc3QsIGZhbHNlKTsNCisJfQ0KKwltYXN0LT5vcmlnX2wt PmRlcHRoID0gMDsNCisNCisJLyoNCisJICogRWFjaCBsZXZlbCBvZiB0aGUgdHJlZSBpcyBleGFt aW5lZCBhbmQgYmFsYW5jZWQsIHB1c2hpbmcgZGF0YSB0byB0aGUgbGVmdCBvcg0KKwkgKiByaWdo dCwgb3IgcmViYWxhbmNpbmcgYWdhaW5zdCBsZWZ0IG9yIHJpZ2h0IG5vZGVzIGlzIGVtcGxveWVk IHRvIGF2b2lkDQorCSAqIHJpcHBsaW5nIHVwIHRoZSB0cmVlIHRvIGxpbWl0IHRoZSBhbW91bnQg b2YgY2h1cm4uICBPbmNlIGEgbmV3IHN1Yi1zZWN0aW9uIG9mDQorCSAqIHRoZSB0cmVlIGlzIGNy ZWF0ZWQsIHRoZXJlIG1heSBiZSBhIG1peCBvZiBuZXcgYW5kIG9sZCBub2Rlcy4gIFRoZSBvbGQg bm9kZXMNCisJICogd2lsbCBoYXZlIHRoZSBpbmNvcnJlY3QgcGFyZW50IHBvaW50ZXJzIGFuZCBj dXJyZW50bHkgYmUgaW4gdHdvIHRyZWVzOiB0aGUNCisJICogb3JpZ2luYWwgdHJlZSBhbmQgdGhl IHBhcnRpYWxseSBuZXcgdHJlZS4gIFRvIHJlbWVkeSB0aGUgcGFyZW50IHBvaW50ZXJzIGluDQor CSAqIHRoZSBvbGQgdHJlZSwgdGhlIG5ldyBkYXRhIGlzIHN3YXBwZWQgaW50byB0aGUgYWN0aXZl IHRyZWUgYW5kIGEgd2FsayBkb3duDQorCSAqIHRoZSB0cmVlIGlzIHBlcmZvcm1lZCBhbmQgdGhl IHBhcmVudCBwb2ludGVycyBhcmUgdXBkYXRlZC4NCisJICogU2VlIG1hc19kZXNjZW5kX2Fkb3B0 KCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uLg0KKwkgKi8NCisJd2hpbGUgKGNvdW50LS0pIHsNCisJ CW1hc3QtPmJuLT5iX2VuZC0tOw0KKwkJbWFzdC0+Ym4tPnR5cGUgPSBtdGVfbm9kZV90eXBlKG1h c3QtPm9yaWdfbC0+bm9kZSk7DQorCQlzcGxpdCA9IG1hc19tYWJfdG9fbm9kZShtYXMsIG1hc3Qt PmJuLCAmbGVmdCwgJnJpZ2h0LCAmbWlkZGxlLA0KKwkJCQkJJm1pZF9zcGxpdCwgbWFzdC0+b3Jp Z19sLT5taW4pOw0KKwkJbWFzdF9zZXRfc3BsaXRfcGFyZW50cyhtYXN0LCBsZWZ0LCBtaWRkbGUs 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 LCBsX21hcy5ub2RlLCArK3Nsb3QpOw0KKw0KKwlpZiAobWFzX2lzX3Jvb3RfbGltaXRzKG1hc3Qt PmwpKSB7DQorbmV3X3Jvb3Q6DQorCQltYXN0X25ld19yb290KG1hc3QsIG1hcyk7DQorCX0gZWxz ZSB7DQorCQltYXNfbW4oJmxfbWFzKS0+cGFyZW50ID0gbWFzX21uKG1hc3QtPm9yaWdfbCktPnBh cmVudDsNCisJfQ0KKw0KKwlpZiAoIW10ZV9kZWFkX25vZGUobWFzdC0+b3JpZ19sLT5ub2RlKSkN CisJCW1hdF9hZGQoJmZyZWUsIG1hc3QtPm9yaWdfbC0+bm9kZSk7DQorDQorCW1hcy0+ZGVwdGgg PSBtYXN0LT5vcmlnX2wtPmRlcHRoOw0KKwkqbWFzdC0+b3JpZ19sID0gbF9tYXM7DQorCW10ZV9z ZXRfbm9kZV9kZWFkKG1hcy0+bm9kZSk7DQorDQorCS8qIFNldCB1cCBtYXMgZm9yIGluc2VydGlv bi4gKi8NCisJbWFzdC0+b3JpZ19sLT5kZXB0aCA9IG1hcy0+ZGVwdGg7DQorCW1hc3QtPm9yaWdf bC0+YWxsb2MgPSBtYXMtPmFsbG9jOw0KKwkqbWFzID0gKm1hc3QtPm9yaWdfbDsNCisJbWFzX3dt Yl9yZXBsYWNlKG1hcywgJmZyZWUsICZkZXN0cm95KTsNCisJbXRyZWVfcmFuZ2Vfd2FsayhtYXMp Ow0KKwlyZXR1cm4gbWFzdC0+Ym4tPmJfZW5kOw0KK30NCisNCisvKg0KKyAqIG1hc19yZWJhbGFu Y2UoKSAtIFJlYmFsYW5jZSBhIGdpdmVuIG5vZGUuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRl DQorICogQGJfbm9kZTogVGhlIGJpZyBtYXBsZSBub2RlLg0KKyAqDQorICogUmViYWxhbmNlIHR3 byBub2RlcyBpbnRvIGEgc2luZ2xlIG5vZGUgb3IgdHdvIG5ldyBub2RlcyB0aGF0IGFyZSBzdWZm aWNpZW50Lg0KKyAqIENvbnRpbnVlIHVwd2FyZHMgdW50aWwgdHJlZSBpcyBzdWZmaWNpZW50Lg0K KyAqDQorICogUmV0dXJuOiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGJfbm9kZSBkdXJpbmcg dGhlIGxhc3QgbG9vcC4NCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBtYXNfcmViYWxhbmNlKHN0 cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkJCQlzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgKmJfbm9kZSkN Cit7DQorCWNoYXIgZW1wdHlfY291bnQgPSBtYXNfbXRfaGVpZ2h0KG1hcyk7DQorCXN0cnVjdCBt YXBsZV9zdWJ0cmVlX3N0YXRlIG1hc3Q7DQorCXVuc2lnbmVkIGNoYXIgc2hpZnQsIGJfZW5kID0g KytiX25vZGUtPmJfZW5kOw0KKw0KKwlNQV9TVEFURShsX21hcywgbWFzLT50cmVlLCBtYXMtPmlu ZGV4LCBtYXMtPmxhc3QpOw0KKwlNQV9TVEFURShyX21hcywgbWFzLT50cmVlLCBtYXMtPmluZGV4 LCBtYXMtPmxhc3QpOw0KKw0KKwl0cmFjZV9tYV9vcChfX2Z1bmNfXywgbWFzKTsNCisNCisJLyoN CisJICogUmViYWxhbmNpbmcgb2NjdXJzIGlmIGEgbm9kZSBpcyBpbnN1ZmZpY2llbnQuICBEYXRh IGlzIHJlYmFsYW5jZWQNCisJICogYWdhaW5zdCB0aGUgbm9kZSB0byB0aGUgcmlnaHQgaWYgaXQg ZXhpc3RzLCBvdGhlcndpc2UgdGhlIG5vZGUgdG8gdGhlDQorCSAqIGxlZnQgb2YgdGhpcyBub2Rl IGlzIHJlYmFsYW5jZWQgYWdhaW5zdCB0aGlzIG5vZGUuICBJZiByZWJhbGFuY2luZw0KKwkgKiBj YXVzZXMganVzdCBvbmUgbm9kZSB0byBiZSBwcm9kdWNlZCBpbnN0ZWFkIG9mIHR3bywgdGhlbiB0 aGUgcGFyZW50DQorCSAqIGlzIGFsc28gZXhhbWluZWQgYW5kIHJlYmFsYW5jZWQgaWYgaXQgaXMg aW5zdWZmaWNpZW50LiAgRXZlcnkgbGV2ZWwNCisJICogdHJpZXMgdG8gY29tYmluZSB0aGUgZGF0 YSBpbiB0aGUgc2FtZSB3YXkuICBJZiBvbmUgbm9kZSBjb250YWlucyB0aGUNCisJICogZW50aXJl IHJhbmdlIG9mIHRoZSB0cmVlLCB0aGVuIHRoYXQgbm9kZSBpcyB1c2VkIGFzIGEgbmV3IHJvb3Qg bm9kZS4NCisJICovDQorCW1hc19ub2RlX2NvdW50KG1hcywgMSArIGVtcHR5X2NvdW50ICogMyk7 DQorCWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQlyZXR1cm4gMDsNCisNCisJbWFzdC5vcmlnX2wg PSAmbF9tYXM7DQorCW1hc3Qub3JpZ19yID0gJnJfbWFzOw0KKwltYXN0LmJuID0gYl9ub2RlOw0K Kw0KKwlsX21hcyA9IHJfbWFzID0gKm1hczsNCisNCisJaWYgKG1hc19uZXh0X3NpYmxpbmcoJnJf bWFzKSkgew0KKwkJbWFzX21hYl9jcCgmcl9tYXMsIDAsIG10X3Nsb3RfY291bnQocl9tYXMubm9k ZSksIGJfbm9kZSwgYl9lbmQpOw0KKwkJcl9tYXMubGFzdCA9IHJfbWFzLmluZGV4ID0gcl9tYXMu bWF4Ow0KKwl9IGVsc2Ugew0KKwkJbWFzX3ByZXZfc2libGluZygmbF9tYXMpOw0KKwkJc2hpZnQg PSBtYXNfZGF0YV9lbmQoJmxfbWFzKSArIDE7DQorCQltYWJfc2hpZnRfcmlnaHQoYl9ub2RlLCBz aGlmdCk7DQorCQltYXMtPm9mZnNldCArPSBzaGlmdDsNCisJCW1hc19tYWJfY3AoJmxfbWFzLCAw LCBzaGlmdCAtIDEsIGJfbm9kZSwgMCk7DQorCQliX25vZGUtPmJfZW5kID0gc2hpZnQgKyBiX2Vu ZDsNCisJCWxfbWFzLmluZGV4ID0gbF9tYXMubGFzdCA9IGxfbWFzLm1pbjsNCisJfQ0KKw0KKwly ZXR1cm4gbWFzX3NwYW5uaW5nX3JlYmFsYW5jZShtYXMsICZtYXN0LCBlbXB0eV9jb3VudCk7DQor fQ0KKw0KKy8qDQorICogbWFzX2Rlc3Ryb3lfcmViYWxhbmNlKCkgLSBSZWJhbGFuY2UgbGVmdC1t b3N0IG5vZGUgd2hpbGUgZGVzdHJveWluZyB0aGUgbWFwbGUNCisgKiBzdGF0ZS4NCisgKiBAbWFz OiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAZW5kOiBUaGUgZW5kIG9mIHRoZSBsZWZ0LW1vc3Qgbm9k ZS4NCisgKg0KKyAqIER1cmluZyBhIG1hc3MtaW5zZXJ0IGV2ZW50IChzdWNoIGFzIGZvcmtpbmcp LCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvDQorICogcmViYWxhbmNlIHRoZSBsZWZ0LW1vc3Qgbm9k ZSB3aGVuIGl0IGlzIG5vdCBzdWZmaWNpZW50Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBt YXNfZGVzdHJveV9yZWJhbGFuY2Uoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGNoYXIg ZW5kKQ0KK3sNCisJZW51bSBtYXBsZV90eXBlIG10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUp Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSByZXVzZSwgKm5ld25vZGUsICpwYXJlbnQsICpuZXdfbGVm dCwgKmxlZnQsICpub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUgKmVwYXJlbnQ7DQorCXVuc2ln bmVkIGNoYXIgb2Zmc2V0LCB0bXAsIHNwbGl0ID0gbXRfc2xvdHNbbXRdIC8gMjsNCisJdm9pZCBf X3JjdSAqKmxfc2xvdHMsICoqc2xvdHM7DQorCXVuc2lnbmVkIGxvbmcgKmxfcGl2cywgKnBpdnMs IGdhcDsNCisJYm9vbCBpbl9yY3UgPSBtdF9pbl9yY3UobWFzLT50cmVlKTsNCisNCisJTUFfU1RB VEUobF9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0KTsNCisNCisJbF9tYXMg PSAqbWFzOw0KKwltYXNfcHJldl9zaWJsaW5nKCZsX21hcyk7DQorDQorCS8qIHNldCB1cCBub2Rl LiAqLw0KKwlpZiAoaW5fcmN1KSB7DQorCQkvKiBBbGxvY2F0ZSBmb3IgYm90aCBsZWZ0IGFuZCBy aWdodCBhcyB3ZWxsIGFzIHBhcmVudC4gKi8NCisJCW1hc19ub2RlX2NvdW50KG1hcywgMyk7DQor CQlpZiAobWFzX2lzX2VycihtYXMpKQ0KKwkJCXJldHVybjsNCisNCisJCW5ld25vZGUgPSBtYXNf cG9wX25vZGUobWFzKTsNCisJfSBlbHNlIHsNCisJCW5ld25vZGUgPSAmcmV1c2U7DQorCX0NCisN CisJbm9kZSA9IG1hc19tbihtYXMpOw0KKwluZXdub2RlLT5wYXJlbnQgPSBub2RlLT5wYXJlbnQ7 DQorCXNsb3RzID0gbWFfc2xvdHMobmV3bm9kZSwgbXQpOw0KKwlwaXZzID0gbWFfcGl2b3RzKG5l d25vZGUsIG10KTsNCisJbGVmdCA9IG1hc19tbigmbF9tYXMpOw0KKwlsX3Nsb3RzID0gbWFfc2xv dHMobGVmdCwgbXQpOw0KKwlsX3BpdnMgPSBtYV9waXZvdHMobGVmdCwgbXQpOw0KKwlpZiAoIWxf c2xvdHNbc3BsaXRdKQ0KKwkJc3BsaXQrKzsNCisJdG1wID0gbWFzX2RhdGFfZW5kKCZsX21hcykg LSBzcGxpdDsNCisNCisJbWVtY3B5KHNsb3RzLCBsX3Nsb3RzICsgc3BsaXQgKyAxLCBzaXplb2Yo dm9pZCAqKSAqIHRtcCk7DQorCW1lbWNweShwaXZzLCBsX3BpdnMgKyBzcGxpdCArIDEsIHNpemVv Zih1bnNpZ25lZCBsb25nKSAqIHRtcCk7DQorCXBpdnNbdG1wXSA9IGxfbWFzLm1heDsNCisJbWVt Y3B5KHNsb3RzICsgdG1wLCBtYV9zbG90cyhub2RlLCBtdCksIHNpemVvZih2b2lkICopICogZW5k KTsNCisJbWVtY3B5KHBpdnMgKyB0bXAsIG1hX3Bpdm90cyhub2RlLCBtdCksIHNpemVvZih1bnNp Z25lZCBsb25nKSAqIGVuZCk7DQorDQorCWxfbWFzLm1heCA9IGxfcGl2c1tzcGxpdF07DQorCW1h cy0+bWluID0gbF9tYXMubWF4ICsgMTsNCisJZXBhcmVudCA9IG10X21rX25vZGUobXRlX3BhcmVu dChsX21hcy5ub2RlKSwNCisJCQkgICAgIG1hc19wYXJlbnRfZW51bSgmbF9tYXMsIGxfbWFzLm5v ZGUpKTsNCisJdG1wICs9IGVuZDsNCisJaWYgKCFpbl9yY3UpIHsNCisJCXVuc2lnbmVkIGNoYXIg bWF4X3AgPSBtdF9waXZvdHNbbXRdOw0KKwkJdW5zaWduZWQgY2hhciBtYXhfcyA9IG10X3Nsb3Rz W210XTsNCisNCisJCWlmICh0bXAgPCBtYXhfcCkNCisJCQltZW1zZXQocGl2cyArIHRtcCwgMCwN CisJCQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgKikgKiAobWF4X3AgLSB0bXApKTsNCisN CisJCWlmICh0bXAgPCBtdF9zbG90c1ttdF0pDQorCQkJbWVtc2V0KHNsb3RzICsgdG1wLCAwLCBz aXplb2Yodm9pZCAqKSAqIChtYXhfcyAtIHRtcCkpOw0KKw0KKwkJbWVtY3B5KG5vZGUsIG5ld25v ZGUsIHNpemVvZihzdHJ1Y3QgbWFwbGVfbm9kZSkpOw0KKwkJbWFfc2V0X21ldGEobm9kZSwgbXQs IDAsIHRtcCAtIDEpOw0KKwkJbXRlX3NldF9waXZvdChlcGFyZW50LCBtdGVfcGFyZW50X3Nsb3Qo bF9tYXMubm9kZSksDQorCQkJICAgICAgbF9waXZzW3NwbGl0XSk7DQorDQorCQkvKiBSZW1vdmUg ZGF0YSBmcm9tIGxfcGl2cy4gKi8NCisJCXRtcCA9IHNwbGl0ICsgMTsNCisJCW1lbXNldChsX3Bp dnMgKyB0bXAsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIChtYXhfcCAtIHRtcCkpOw0KKwkJ bWVtc2V0KGxfc2xvdHMgKyB0bXAsIDAsIHNpemVvZih2b2lkICopICogKG1heF9zIC0gdG1wKSk7 DQorCQltYV9zZXRfbWV0YShsZWZ0LCBtdCwgMCwgc3BsaXQpOw0KKw0KKwkJZ290byBkb25lOw0K Kwl9DQorDQorCS8qIFJDVSByZXF1aXJlcyByZXBsYWNpbmcgYm90aCBsX21hcywgbWFzLCBhbmQg cGFyZW50LiAqLw0KKwltYXMtPm5vZGUgPSBtdF9ta19ub2RlKG5ld25vZGUsIG10KTsNCisJbWFf c2V0X21ldGEobmV3bm9kZSwgbXQsIDAsIHRtcCk7DQorDQorCW5ld19sZWZ0ID0gbWFzX3BvcF9u b2RlKG1hcyk7DQorCW5ld19sZWZ0LT5wYXJlbnQgPSBsZWZ0LT5wYXJlbnQ7DQorCW10ID0gbXRl X25vZGVfdHlwZShsX21hcy5ub2RlKTsNCisJc2xvdHMgPSBtYV9zbG90cyhuZXdfbGVmdCwgbXQp Ow0KKwlwaXZzID0gbWFfcGl2b3RzKG5ld19sZWZ0LCBtdCk7DQorCW1lbWNweShzbG90cywgbF9z bG90cywgc2l6ZW9mKHZvaWQgKikgKiBzcGxpdCk7DQorCW1lbWNweShwaXZzLCBsX3BpdnMsIHNp emVvZih1bnNpZ25lZCBsb25nKSAqIHNwbGl0KTsNCisJbWFfc2V0X21ldGEobmV3X2xlZnQsIG10 LCAwLCBzcGxpdCk7DQorCWxfbWFzLm5vZGUgPSBtdF9ta19ub2RlKG5ld19sZWZ0LCBtdCk7DQor DQorCS8qIHJlcGxhY2UgcGFyZW50LiAqLw0KKwlvZmZzZXQgPSBtdGVfcGFyZW50X3Nsb3QobWFz LT5ub2RlKTsNCisJbXQgPSBtYXNfcGFyZW50X2VudW0oJmxfbWFzLCBsX21hcy5ub2RlKTsNCisJ cGFyZW50ID0gbWFzX3BvcF9ub2RlKG1hcyk7DQorCXNsb3RzID0gbWFfc2xvdHMocGFyZW50LCBt dCk7DQorCXBpdnMgPSBtYV9waXZvdHMocGFyZW50LCBtdCk7DQorCW1lbWNweShwYXJlbnQsIG10 ZV90b19ub2RlKGVwYXJlbnQpLCBzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUpKTsNCisJcmN1X2Fz c2lnbl9wb2ludGVyKHNsb3RzW29mZnNldF0sIG1hcy0+bm9kZSk7DQorCXJjdV9hc3NpZ25fcG9p bnRlcihzbG90c1tvZmZzZXQgLSAxXSwgbF9tYXMubm9kZSk7DQorCXBpdnNbb2Zmc2V0IC0gMV0g PSBsX21hcy5tYXg7DQorCWVwYXJlbnQgPSBtdF9ta19ub2RlKHBhcmVudCwgbXQpOw0KK2RvbmU6 DQorCWdhcCA9IG1hc19sZWFmX21heF9nYXAobWFzKTsNCisJbXRlX3NldF9nYXAoZXBhcmVudCwg bXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSksIGdhcCk7DQorCWdhcCA9IG1hc19sZWFmX21heF9n YXAoJmxfbWFzKTsNCisJbXRlX3NldF9nYXAoZXBhcmVudCwgbXRlX3BhcmVudF9zbG90KGxfbWFz Lm5vZGUpLCBnYXApOw0KKwltYXNfYXNjZW5kKG1hcyk7DQorDQorCWlmIChpbl9yY3UpDQorCQlt YXNfcmVwbGFjZShtYXMsIGZhbHNlKTsNCisNCisJbWFzX3VwZGF0ZV9nYXAobWFzKTsNCit9DQor DQorLyoNCisgKiBtYXNfc3BsaXRfZmluYWxfbm9kZSgpIC0gU3BsaXQgdGhlIGZpbmFsIG5vZGUg aW4gYSBzdWJ0cmVlIG9wZXJhdGlvbi4NCisgKiBAbWFzdDogdGhlIG1hcGxlIHN1YnRyZWUgc3Rh dGUNCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAaGVpZ2h0OiBUaGUgaGVpZ2h0IG9m IHRoZSB0cmVlIGluIGNhc2UgaXQncyBhIG5ldyByb290Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUg Ym9vbCBtYXNfc3BsaXRfZmluYWxfbm9kZShzdHJ1Y3QgbWFwbGVfc3VidHJlZV9zdGF0ZSAqbWFz dCwNCisJCQkJCXN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBpbnQgaGVpZ2h0KQ0KK3sNCisJc3RydWN0 IG1hcGxlX2Vub2RlICphbmNlc3RvcjsNCisNCisJaWYgKG10ZV9pc19yb290KG1hcy0+bm9kZSkp IHsNCisJCWlmIChtdF9pc19hbGxvYyhtYXMtPnRyZWUpKQ0KKwkJCW1hc3QtPmJuLT50eXBlID0g bWFwbGVfYXJhbmdlXzY0Ow0KKwkJZWxzZQ0KKwkJCW1hc3QtPmJuLT50eXBlID0gbWFwbGVfcmFu Z2VfNjQ7DQorCQltYXMtPmRlcHRoID0gaGVpZ2h0Ow0KKwl9DQorCS8qDQorCSAqIE9ubHkgYSBz aW5nbGUgbm9kZSBpcyB1c2VkIGhlcmUsIGNvdWxkIGJlIHJvb3QuDQorCSAqIFRoZSBCaWdfbm9k ZSBkYXRhIHNob3VsZCBqdXN0IGZpdCBpbiBhIHNpbmdsZSBub2RlLg0KKwkgKi8NCisJYW5jZXN0 b3IgPSBtYXNfbmV3X21hX25vZGUobWFzLCBtYXN0LT5ibik7DQorCW10ZV9zZXRfcGFyZW50KG1h c3QtPmwtPm5vZGUsIGFuY2VzdG9yLCBtYXN0LT5sLT5vZmZzZXQpOw0KKwltdGVfc2V0X3BhcmVu dChtYXN0LT5yLT5ub2RlLCBhbmNlc3RvciwgbWFzdC0+ci0+b2Zmc2V0KTsNCisJbXRlX3RvX25v ZGUoYW5jZXN0b3IpLT5wYXJlbnQgPSBtYXNfbW4obWFzKS0+cGFyZW50Ow0KKw0KKwltYXN0LT5s LT5ub2RlID0gYW5jZXN0b3I7DQorCW1hYl9tYXNfY3AobWFzdC0+Ym4sIDAsIG10X3Nsb3RzW21h c3QtPmJuLT50eXBlXSAtIDEsIG1hc3QtPmwsIHRydWUpOw0KKwltYXMtPm9mZnNldCA9IG1hc3Qt PmJuLT5iX2VuZCAtIDE7DQorCXJldHVybiB0cnVlOw0KK30NCisNCisvKg0KKyAqIG1hc3RfZmls bF9ibm9kZSgpIC0gQ29weSBkYXRhIGludG8gdGhlIGJpZyBub2RlIGluIHRoZSBzdWJ0cmVlIHN0 YXRlDQorICogQG1hc3Q6IFRoZSBtYXBsZSBzdWJ0cmVlIHN0YXRlDQorICogQG1hczogdGhlIG1h cGxlIHN0YXRlDQorICogQHNraXA6IFRoZSBudW1iZXIgb2YgZW50cmllcyB0byBza2lwIGZvciBu ZXcgbm9kZXMgaW5zZXJ0aW9uLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXN0X2ZpbGxf Ym5vZGUoc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QsDQorCQkJCQkgc3RydWN0IG1h X3N0YXRlICptYXMsDQorCQkJCQkgdW5zaWduZWQgY2hhciBza2lwKQ0KK3sNCisJYm9vbCBjcCA9 IHRydWU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqb2xkID0gbWFzLT5ub2RlOw0KKwl1bnNpZ25l ZCBjaGFyIHNwbGl0Ow0KKw0KKwltZW1zZXQobWFzdC0+Ym4tPmdhcCwgMCwgc2l6ZW9mKHVuc2ln bmVkIGxvbmcpICogQVJSQVlfU0laRShtYXN0LT5ibi0+Z2FwKSk7DQorCW1lbXNldChtYXN0LT5i bi0+c2xvdCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogQVJSQVlfU0laRShtYXN0LT5ibi0+ c2xvdCkpOw0KKwltZW1zZXQobWFzdC0+Ym4tPnBpdm90LCAwLCBzaXplb2YodW5zaWduZWQgbG9u ZykgKiBBUlJBWV9TSVpFKG1hc3QtPmJuLT5waXZvdCkpOw0KKwltYXN0LT5ibi0+Yl9lbmQgPSAw Ow0KKw0KKwlpZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkgew0KKwkJY3AgPSBmYWxzZTsNCisJ fSBlbHNlIHsNCisJCW1hc19hc2NlbmQobWFzKTsNCisJCW1hdF9hZGQobWFzdC0+ZnJlZSwgb2xk KTsNCisJCW1hcy0+b2Zmc2V0ID0gbXRlX3BhcmVudF9zbG90KG1hcy0+bm9kZSk7DQorCX0NCisN CisJaWYgKGNwICYmIG1hc3QtPmwtPm9mZnNldCkNCisJCW1hc19tYWJfY3AobWFzLCAwLCBtYXN0 LT5sLT5vZmZzZXQgLSAxLCBtYXN0LT5ibiwgMCk7DQorDQorCXNwbGl0ID0gbWFzdC0+Ym4tPmJf ZW5kOw0KKwltYWJfc2V0X2JfZW5kKG1hc3QtPmJuLCBtYXN0LT5sLCBtYXN0LT5sLT5ub2RlKTsN CisJbWFzdC0+ci0+b2Zmc2V0ID0gbWFzdC0+Ym4tPmJfZW5kOw0KKwltYWJfc2V0X2JfZW5kKG1h c3QtPmJuLCBtYXN0LT5yLCBtYXN0LT5yLT5ub2RlKTsNCisJaWYgKG1hc3QtPmJuLT5waXZvdFtt YXN0LT5ibi0+Yl9lbmQgLSAxXSA9PSBtYXMtPm1heCkNCisJCWNwID0gZmFsc2U7DQorDQorCWlm IChjcCkNCisJCW1hc19tYWJfY3AobWFzLCBzcGxpdCArIHNraXAsIG10X3Nsb3RfY291bnQobWFz LT5ub2RlKSAtIDEsDQorCQkJICAgbWFzdC0+Ym4sIG1hc3QtPmJuLT5iX2VuZCk7DQorDQorCW1h c3QtPmJuLT5iX2VuZC0tOw0KKwltYXN0LT5ibi0+dHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5u b2RlKTsNCit9DQorDQorLyoNCisgKiBtYXN0X3NwbGl0X2RhdGEoKSAtIFNwbGl0IHRoZSBkYXRh IGluIHRoZSBzdWJ0cmVlIHN0YXRlIGJpZyBub2RlIGludG8gcmVndWxhcg0KKyAqIG5vZGVzLg0K KyAqIEBtYXN0OiBUaGUgbWFwbGUgc3VidHJlZSBzdGF0ZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBz dGF0ZQ0KKyAqIEBzcGxpdDogVGhlIGxvY2F0aW9uIHRvIHNwbGl0IHRoZSBiaWcgbm9kZQ0KKyAq Lw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXN0X3NwbGl0X2RhdGEoc3RydWN0IG1hcGxlX3N1YnRy ZWVfc3RhdGUgKm1hc3QsDQorCSAgIHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBjaGFy IHNwbGl0KQ0KK3sNCisJdW5zaWduZWQgY2hhciBwX3Nsb3Q7DQorDQorCW1hYl9tYXNfY3AobWFz dC0+Ym4sIDAsIHNwbGl0LCBtYXN0LT5sLCB0cnVlKTsNCisJbXRlX3NldF9waXZvdChtYXN0LT5y LT5ub2RlLCAwLCBtYXN0LT5yLT5tYXgpOw0KKwltYWJfbWFzX2NwKG1hc3QtPmJuLCBzcGxpdCAr IDEsIG1hc3QtPmJuLT5iX2VuZCwgbWFzdC0+ciwgZmFsc2UpOw0KKwltYXN0LT5sLT5vZmZzZXQg PSBtdGVfcGFyZW50X3Nsb3QobWFzLT5ub2RlKTsNCisJbWFzdC0+bC0+bWF4ID0gbWFzdC0+Ym4t PnBpdm90W3NwbGl0XTsNCisJbWFzdC0+ci0+bWluID0gbWFzdC0+bC0+bWF4ICsgMTsNCisJaWYg KG10ZV9pc19sZWFmKG1hcy0+bm9kZSkpDQorCSAgICByZXR1cm47DQorDQorCXBfc2xvdCA9IG1h c3QtPm9yaWdfbC0+b2Zmc2V0Ow0KKwltYXNfc2V0X3NwbGl0X3BhcmVudChtYXN0LT5vcmlnX2ws IG1hc3QtPmwtPm5vZGUsIG1hc3QtPnItPm5vZGUsDQorCQkJICAgICAmcF9zbG90LCBzcGxpdCk7 DQorCW1hc19zZXRfc3BsaXRfcGFyZW50KG1hc3QtPm9yaWdfciwgbWFzdC0+bC0+bm9kZSwgbWFz dC0+ci0+bm9kZSwNCisJCQkgICAgICZwX3Nsb3QsIHNwbGl0KTsNCit9DQorDQorLyoNCisgKiBt YXNfcHVzaF9kYXRhKCkgLSBJbnN0ZWFkIG9mIHNwbGl0dGluZyBhIG5vZGUsIGl0IGlzIGJlbmVm aWNpYWwgdG8gcHVzaCB0aGUNCisgKiBkYXRhIHRvIHRoZSByaWdodCBvciBsZWZ0IG5vZGUgaWYg dGhlcmUgaXMgcm9vbS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAaGVpZ2h0OiBU aGUgY3VycmVudCBoZWlnaHQgb2YgdGhlIG1hcGxlIHN0YXRlDQorICogQG1hc3Q6IFRoZSBtYXBs ZSBzdWJ0cmVlIHN0YXRlDQorICogQGxlZnQ6IFB1c2ggbGVmdCBvciBub3QuDQorICoNCisgKiBL ZWVwaW5nIHRoZSBoZWlnaHQgb2YgdGhlIHRyZWUgbG93IG1lYW5zIGZhc3RlciBsb29rdXBzLg0K KyAqDQorICogUmV0dXJuOiBUcnVlIGlmIHB1c2hlZCwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqLw0K K3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfcHVzaF9kYXRhKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBp bnQgaGVpZ2h0LA0KKwkJCQkgc3RydWN0IG1hcGxlX3N1YnRyZWVfc3RhdGUgKm1hc3QsIGJvb2wg bGVmdCkNCit7DQorCXVuc2lnbmVkIGNoYXIgc2xvdF90b3RhbCA9IG1hc3QtPmJuLT5iX2VuZDsN CisJdW5zaWduZWQgY2hhciBlbmQsIHNwYWNlLCBzcGxpdDsNCisNCisJTUFfU1RBVEUodG1wX21h cywgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBtYXMtPmxhc3QpOw0KKwl0bXBfbWFzID0gKm1hczsN CisJdG1wX21hcy5kZXB0aCA9IG1hc3QtPmwtPmRlcHRoOw0KKw0KKwlpZiAobGVmdCAmJiAhbWFz X3ByZXZfc2libGluZygmdG1wX21hcykpDQorCQlyZXR1cm4gZmFsc2U7DQorCWVsc2UgaWYgKCFs ZWZ0ICYmICFtYXNfbmV4dF9zaWJsaW5nKCZ0bXBfbWFzKSkNCisJCXJldHVybiBmYWxzZTsNCisN CisJZW5kID0gbWFzX2RhdGFfZW5kKCZ0bXBfbWFzKTsNCisJc2xvdF90b3RhbCArPSBlbmQ7DQor CXNwYWNlID0gMiAqIG10X3Nsb3RfY291bnQobWFzLT5ub2RlKSAtIDI7DQorCS8qIC0yIGluc3Rl YWQgb2YgLTEgdG8gZW5zdXJlIHRoZXJlIGlzbid0IGEgdHJpcGxlIHNwbGl0ICovDQorCWlmICht YV9pc19sZWFmKG1hc3QtPmJuLT50eXBlKSkNCisJCXNwYWNlLS07DQorDQorCWlmIChtYXMtPm1h eCA9PSBVTE9OR19NQVgpDQorCQlzcGFjZS0tOw0KKw0KKwlpZiAoc2xvdF90b3RhbCA+PSBzcGFj ZSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJLyogR2V0IHRoZSBkYXRhOyBGaWxsIG1hc3QtPmJu ICovDQorCW1hc3QtPmJuLT5iX2VuZCsrOw0KKwlpZiAobGVmdCkgew0KKwkJbWFiX3NoaWZ0X3Jp Z2h0KG1hc3QtPmJuLCBlbmQgKyAxKTsNCisJCW1hc19tYWJfY3AoJnRtcF9tYXMsIDAsIGVuZCwg bWFzdC0+Ym4sIDApOw0KKwkJbWFzdC0+Ym4tPmJfZW5kID0gc2xvdF90b3RhbCArIDE7DQorCX0g ZWxzZSB7DQorCQltYXNfbWFiX2NwKCZ0bXBfbWFzLCAwLCBlbmQsIG1hc3QtPmJuLCBtYXN0LT5i bi0+Yl9lbmQpOw0KKwl9DQorDQorCS8qIENvbmZpZ3VyZSBtYXN0IGZvciBzcGxpdHRpbmcgb2Yg bWFzdC0+Ym4gKi8NCisJc3BsaXQgPSBtdF9zbG90c1ttYXN0LT5ibi0+dHlwZV0gLSAyOw0KKwlp ZiAobGVmdCkgew0KKwkJLyogIFN3aXRjaCBtYXMgdG8gcHJldiBub2RlICAqLw0KKwkJbWF0X2Fk ZChtYXN0LT5mcmVlLCBtYXMtPm5vZGUpOw0KKwkJKm1hcyA9IHRtcF9tYXM7DQorCQkvKiBTdGFy dCB1c2luZyBtYXN0LT5sIGZvciB0aGUgbGVmdCBzaWRlLiAqLw0KKwkJdG1wX21hcy5ub2RlID0g bWFzdC0+bC0+bm9kZTsNCisJCSptYXN0LT5sID0gdG1wX21hczsNCisJfSBlbHNlIHsNCisJCW1h dF9hZGQobWFzdC0+ZnJlZSwgdG1wX21hcy5ub2RlKTsNCisJCXRtcF9tYXMubm9kZSA9IG1hc3Qt PnItPm5vZGU7DQorCQkqbWFzdC0+ciA9IHRtcF9tYXM7DQorCQlzcGxpdCA9IHNsb3RfdG90YWwg LSBzcGxpdDsNCisJfQ0KKwlzcGxpdCA9IG1hYl9ub19udWxsX3NwbGl0KG1hc3QtPmJuLCBzcGxp dCwgbXRfc2xvdHNbbWFzdC0+Ym4tPnR5cGVdKTsNCisJLyogVXBkYXRlIHBhcmVudCBzbG90IGZv ciBzcGxpdCBjYWxjdWxhdGlvbi4gKi8NCisJaWYgKGxlZnQpDQorCQltYXN0LT5vcmlnX2wtPm9m ZnNldCArPSBlbmQgKyAxOw0KKw0KKwltYXN0X3NwbGl0X2RhdGEobWFzdCwgbWFzLCBzcGxpdCk7 DQorCW1hc3RfZmlsbF9ibm9kZShtYXN0LCBtYXMsIDIpOw0KKwltYXNfc3BsaXRfZmluYWxfbm9k ZShtYXN0LCBtYXMsIGhlaWdodCArIDEpOw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorLyoNCisg KiBtYXNfc3BsaXQoKSAtIFNwbGl0IGRhdGEgdGhhdCBpcyB0b28gYmlnIGZvciBvbmUgbm9kZSBp bnRvIHR3by4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAYl9ub2RlOiBUaGUgbWFw bGUgYmlnIG5vZGUNCisgKiBSZXR1cm46IDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlLg0KKyAq Lw0KK3N0YXRpYyBpbnQgbWFzX3NwbGl0KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1Y3QgbWFw bGVfYmlnX25vZGUgKmJfbm9kZSkNCit7DQorDQorCXN0cnVjdCBtYXBsZV9zdWJ0cmVlX3N0YXRl IG1hc3Q7DQorCWludCBoZWlnaHQgPSAwOw0KKwl1bnNpZ25lZCBjaGFyIG1pZF9zcGxpdCwgc3Bs aXQgPSAwOw0KKw0KKwkvKg0KKwkgKiBTcGxpdHRpbmcgaXMgaGFuZGxlZCBkaWZmZXJlbnRseSBm cm9tIGFueSBvdGhlciBCLXRyZWU7IHRoZSBNYXBsZQ0KKwkgKiBUcmVlIHNwbGl0cyB1cHdhcmRz LiAgU3BsaXR0aW5nIHVwIG1lYW5zIHRoYXQgdGhlIHNwbGl0IG9wZXJhdGlvbg0KKwkgKiBvY2N1 cnMgd2hlbiB0aGUgd2FsayBvZiB0aGUgdHJlZSBoaXRzIHRoZSBsZWF2ZXMgYW5kIG5vdCBvbiB0 aGUgd2F5DQorCSAqIGRvd24uICBUaGUgcmVhc29uIGZvciBzcGxpdHRpbmcgdXAgaXMgdGhhdCBp dCBpcyBpbXBvc3NpYmxlIHRvIGtub3cNCisJICogaG93IG11Y2ggc3BhY2Ugd2lsbCBiZSBuZWVk ZWQgdW50aWwgdGhlIGxlYWYgaXMgKG9yIGxlYXZlcyBhcmUpDQorCSAqIHJlYWNoZWQuICBTaW5j ZSBvdmVyd3JpdGluZyBkYXRhIGlzIGFsbG93ZWQgYW5kIGEgcmFuZ2UgY291bGQNCisJICogb3Zl cndyaXRlIG1vcmUgdGhhbiBvbmUgcmFuZ2Ugb3IgcmVzdWx0IGluIGNoYW5naW5nIG9uZSBlbnRy eSBpbnRvIDMNCisJICogZW50cmllcywgaXQgaXMgaW1wb3NzaWJsZSB0byBrbm93IGlmIGEgc3Bs aXQgaXMgcmVxdWlyZWQgdW50aWwgdGhlDQorCSAqIGRhdGEgaXMgZXhhbWluZWQuDQorCSAqDQor CSAqIFNwbGl0dGluZyBpcyBhIGJhbGFuY2luZyBhY3QgYmV0d2VlbiBrZWVwaW5nIGFsbG9jYXRp b25zIHRvIGEgbWluaW11bQ0KKwkgKiBhbmQgYXZvaWRpbmcgYSAnaml0dGVyJyBldmVudCB3aGVy ZSBhIHRyZWUgaXMgZXhwYW5kZWQgdG8gbWFrZSByb29tDQorCSAqIGZvciBhbiBlbnRyeSBmb2xs b3dlZCBieSBhIGNvbnRyYWN0aW9uIHdoZW4gdGhlIGVudHJ5IGlzIHJlbW92ZWQuICBUbw0KKwkg KiBhY2NvbXBsaXNoIHRoZSBiYWxhbmNlLCB0aGVyZSBhcmUgZW1wdHkgc2xvdHMgcmVtYWluaW5n IGluIGJvdGggbGVmdA0KKwkgKiBhbmQgcmlnaHQgbm9kZXMgYWZ0ZXIgYSBzcGxpdC4NCisJICov DQorCU1BX1NUQVRFKGxfbWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+bGFzdCk7DQor CU1BX1NUQVRFKHJfbWFzLCBtYXMtPnRyZWUsIG1hcy0+aW5kZXgsIG1hcy0+bGFzdCk7DQorCU1B X1NUQVRFKHByZXZfbF9tYXMsIG1hcy0+dHJlZSwgbWFzLT5pbmRleCwgbWFzLT5sYXN0KTsNCisJ TUFfU1RBVEUocHJldl9yX21hcywgbWFzLT50cmVlLCBtYXMtPmluZGV4LCBtYXMtPmxhc3QpOw0K KwlNQV9UT1BJQVJZKG1hdCwgbWFzLT50cmVlKTsNCisNCisJdHJhY2VfbWFfb3AoX19mdW5jX18s IG1hcyk7DQorCW1hcy0+ZGVwdGggPSBtYXNfbXRfaGVpZ2h0KG1hcyk7DQorCS8qIEFsbG9jYXRp b24gZmFpbHVyZXMgd2lsbCBoYXBwZW4gZWFybHkuICovDQorCW1hc19ub2RlX2NvdW50KG1hcywg MSArIG1hcy0+ZGVwdGggKiAyKTsNCisJaWYgKG1hc19pc19lcnIobWFzKSkNCisJCXJldHVybiAw Ow0KKw0KKwltYXN0LmwgPSAmbF9tYXM7DQorCW1hc3QuciA9ICZyX21hczsNCisJbWFzdC5vcmln X2wgPSAmcHJldl9sX21hczsNCisJbWFzdC5vcmlnX3IgPSAmcHJldl9yX21hczsNCisJbWFzdC5m cmVlID0gJm1hdDsNCisJbWFzdC5ibiA9IGJfbm9kZTsNCisNCisJd2hpbGUgKGhlaWdodCsrIDw9 IG1hcy0+ZGVwdGgpIHsNCisJCWlmIChtdF9zbG90c1tiX25vZGUtPnR5cGVdID4gYl9ub2RlLT5i X2VuZCkgew0KKwkJCW1hc19zcGxpdF9maW5hbF9ub2RlKCZtYXN0LCBtYXMsIGhlaWdodCk7DQor CQkJYnJlYWs7DQorCQl9DQorDQorCQlsX21hcyA9IHJfbWFzID0gKm1hczsNCisJCWxfbWFzLm5v ZGUgPSBtYXNfbmV3X21hX25vZGUobWFzLCBiX25vZGUpOw0KKwkJcl9tYXMubm9kZSA9IG1hc19u ZXdfbWFfbm9kZShtYXMsIGJfbm9kZSk7DQorCQkvKg0KKwkJICogQW5vdGhlciB3YXkgdGhhdCAn aml0dGVyJyBpcyBhdm9pZGVkIGlzIHRvIHRlcm1pbmF0ZSBhIHNwbGl0IHVwIGVhcmx5IGlmIHRo ZQ0KKwkJICogbGVmdCBvciByaWdodCBub2RlIGhhcyBzcGFjZSB0byBzcGFyZS4gIFRoaXMgaXMg cmVmZXJyZWQgdG8gYXMgInB1c2hpbmcgbGVmdCINCisJCSAqIG9yICJwdXNoaW5nIHJpZ2h0IiBh bmQgaXMgc2ltaWxhciB0byB0aGUgQiogdHJlZSwgZXhjZXB0IHRoZSBub2RlcyBsZWZ0IG9yDQor CQkgKiByaWdodCBjYW4gcmFyZWx5IGJlIHJldXNlZCBkdWUgdG8gUkNVLCBidXQgdGhlIHJpcHBs ZSB1cHdhcmRzIGlzIGhhbHRlZCB3aGljaA0KKwkJICogaXMgYSBzaWduaWZpY2FudCBzYXZpbmdz Lg0KKwkJICovDQorCQkvKiBUcnkgdG8gcHVzaCBsZWZ0LiAqLw0KKwkJaWYgKG1hc19wdXNoX2Rh dGEobWFzLCBoZWlnaHQsICZtYXN0LCB0cnVlKSkNCisJCQlicmVhazsNCisNCisJCS8qIFRyeSB0 byBwdXNoIHJpZ2h0LiAqLw0KKwkJaWYgKG1hc19wdXNoX2RhdGEobWFzLCBoZWlnaHQsICZtYXN0 LCBmYWxzZSkpDQorCQkJYnJlYWs7DQorDQorCQlzcGxpdCA9IG1hYl9jYWxjX3NwbGl0KG1hcywg Yl9ub2RlLCAmbWlkX3NwbGl0LCBwcmV2X2xfbWFzLm1pbik7DQorCQltYXN0X3NwbGl0X2RhdGEo Jm1hc3QsIG1hcywgc3BsaXQpOw0KKwkJLyoNCisJCSAqIFVzdWFsbHkgY29ycmVjdCwgbWFiX21h c19jcCBpbiB0aGUgYWJvdmUgY2FsbCBvdmVyd3JpdGVzDQorCQkgKiByLT5tYXguDQorCQkgKi8N CisJCW1hc3Quci0+bWF4ID0gbWFzLT5tYXg7DQorCQltYXN0X2ZpbGxfYm5vZGUoJm1hc3QsIG1h cywgMSk7DQorCQlwcmV2X2xfbWFzID0gKm1hc3QubDsNCisJCXByZXZfcl9tYXMgPSAqbWFzdC5y Ow0KKwl9DQorDQorCS8qIFNldCB0aGUgb3JpZ2luYWwgbm9kZSBhcyBkZWFkICovDQorCW1hdF9h ZGQobWFzdC5mcmVlLCBtYXMtPm5vZGUpOw0KKwltYXMtPm5vZGUgPSBsX21hcy5ub2RlOw0KKwlt YXNfd21iX3JlcGxhY2UobWFzLCBtYXN0LmZyZWUsIE5VTEwpOw0KKwltdHJlZV9yYW5nZV93YWxr KG1hcyk7DQorCXJldHVybiAxOw0KK30NCisNCisvKg0KKyAqIG1hc19yZXVzZV9ub2RlKCkgLSBS ZXVzZSB0aGUgbm9kZSB0byBzdG9yZSB0aGUgZGF0YS4NCisgKiBAd3JfbWFzOiBUaGUgbWFwbGUg d3JpdGUgc3RhdGUNCisgKiBAYm46IFRoZSBtYXBsZSBiaWcgbm9kZQ0KKyAqIEBlbmQ6IFRoZSBl bmQgb2YgdGhlIGRhdGEuDQorICoNCisgKiBXaWxsIGFsd2F5cyByZXR1cm4gZmFsc2UgaW4gUkNV IG1vZGUuDQorICoNCisgKiBSZXR1cm46IFRydWUgaWYgbm9kZSB3YXMgcmV1c2VkLCBmYWxzZSBv dGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGluZSBib29sIG1hc19yZXVzZV9ub2RlKHN0cnVj dCBtYV93cl9zdGF0ZSAqd3JfbWFzLA0KKwkJCSAgc3RydWN0IG1hcGxlX2JpZ19ub2RlICpibiwg dW5zaWduZWQgY2hhciBlbmQpDQorew0KKwkvKiBOZWVkIHRvIGJlIHJjdSBzYWZlLiAqLw0KKwlp ZiAobXRfaW5fcmN1KHdyX21hcy0+bWFzLT50cmVlKSkNCisJCXJldHVybiBmYWxzZTsNCisNCisJ aWYgKGVuZCA+IGJuLT5iX2VuZCkgew0KKwkJCWludCBjbGVhciA9IG10X3Nsb3RzW3dyX21hcy0+ dHlwZV0gLSBibi0+Yl9lbmQ7DQorCQkJbWVtc2V0KHdyX21hcy0+c2xvdHMgKyBibi0+Yl9lbmQs IDAsDQorCQkJICAgICAgIHNpemVvZih2b2lkICopICogY2xlYXItLSk7DQorCQkJbWVtc2V0KHdy X21hcy0+cGl2b3RzICsgYm4tPmJfZW5kLCAwLA0KKwkJCSAgICAgICBzaXplb2Yodm9pZCAqKSAq IGNsZWFyKTsNCisJfQ0KKwltYWJfbWFzX2NwKGJuLCAwLCBibi0+Yl9lbmQsIHdyX21hcy0+bWFz LCBmYWxzZSk7DQorCXJldHVybiB0cnVlOw0KK30NCisNCisvKg0KKyAqIG1hc19jb21taXRfYl9u b2RlKCkgLSBDb21taXQgdGhlIGJpZyBub2RlIGludG8gdGhlIHRyZWUuDQorICogQHdyX21hczog VGhlIG1hcGxlIHdyaXRlIHN0YXRlDQorICogQGJfbm9kZTogVGhlIG1hcGxlIGJpZyBub2RlDQor ICogQGVuZDogVGhlIGVuZCBvZiB0aGUgZGF0YS4NCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBt YXNfY29tbWl0X2Jfbm9kZShzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcywNCisJCQkgICAgc3Ry dWN0IG1hcGxlX2JpZ19ub2RlICpiX25vZGUsIHVuc2lnbmVkIGNoYXIgZW5kKQ0KK3sNCisJc3Ry dWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXVuc2lnbmVkIGNoYXIgYl9lbmQgPSBiX25vZGUtPmJf ZW5kOw0KKwllbnVtIG1hcGxlX3R5cGUgYl90eXBlID0gYl9ub2RlLT50eXBlOw0KKw0KKwlpZiAo KGJfZW5kIDwgbXRfbWluX3Nsb3RzW2JfdHlwZV0pICYmDQorCSAgICAoIW10ZV9pc19yb290KHdy X21hcy0+bWFzLT5ub2RlKSkgJiYNCisJICAgIChtYXNfbXRfaGVpZ2h0KHdyX21hcy0+bWFzKSA+ IDEpKQ0KKwkJcmV0dXJuIG1hc19yZWJhbGFuY2Uod3JfbWFzLT5tYXMsIGJfbm9kZSk7DQorDQor CWlmIChiX2VuZCA+PSBtdF9zbG90c1tiX3R5cGVdKQ0KKwkJcmV0dXJuIG1hc19zcGxpdCh3cl9t YXMtPm1hcywgYl9ub2RlKTsNCisNCisJaWYgKG1hc19yZXVzZV9ub2RlKHdyX21hcywgYl9ub2Rl LCBlbmQpKQ0KKwkJZ290byByZXVzZV9ub2RlOw0KKw0KKwltYXNfbm9kZV9jb3VudCh3cl9tYXMt Pm1hcywgMSk7DQorCWlmIChtYXNfaXNfZXJyKHdyX21hcy0+bWFzKSkNCisJCXJldHVybiAwOw0K Kw0KKwlub2RlID0gbWFzX3BvcF9ub2RlKHdyX21hcy0+bWFzKTsNCisJbm9kZS0+cGFyZW50ID0g bWFzX21uKHdyX21hcy0+bWFzKS0+cGFyZW50Ow0KKwl3cl9tYXMtPm1hcy0+bm9kZSA9IG10X21r X25vZGUobm9kZSwgYl90eXBlKTsNCisJbWFiX21hc19jcChiX25vZGUsIDAsIGJfZW5kLCB3cl9t YXMtPm1hcywgdHJ1ZSk7DQorDQorCW1hc19yZXBsYWNlKHdyX21hcy0+bWFzLCBmYWxzZSk7DQor cmV1c2Vfbm9kZToNCisJbWFzX3VwZGF0ZV9nYXAod3JfbWFzLT5tYXMpOw0KKwlyZXR1cm4gMTsN Cit9DQorDQorLyoNCisgKiBtYXNfcm9vdF9leHBhbmQoKSAtIEV4cGFuZCBhIHJvb3QgdG8gYSBu b2RlDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGVudHJ5OiBUaGUgZW50cnkgdG8g c3RvcmUgaW50byB0aGUgdHJlZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hc19yb290X2V4 cGFuZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50cnkpDQorew0KKwl2b2lkICpjb250 ZW50cyA9IG1hc19yb290X2xvY2tlZChtYXMpOw0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZSA9IG1h cGxlX2xlYWZfNjQ7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlOw0KKwl2b2lkIF9fcmN1ICoq c2xvdHM7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJaW50IHNsb3QgPSAwOw0KKw0KKwlt YXNfbm9kZV9jb3VudChtYXMsIDEpOw0KKwlpZiAodW5saWtlbHkobWFzX2lzX2VycihtYXMpKSkN CisJCXJldHVybiAwOw0KKw0KKwlub2RlID0gbWFzX3BvcF9ub2RlKG1hcyk7DQorCXBpdm90cyA9 IG1hX3Bpdm90cyhub2RlLCB0eXBlKTsNCisJc2xvdHMgPSBtYV9zbG90cyhub2RlLCB0eXBlKTsN CisJbm9kZS0+cGFyZW50ID0gbWFfcGFyZW50X3B0cigNCisJCSAgICAgICgodW5zaWduZWQgbG9u ZyltYXMtPnRyZWUgfCBNQV9ST09UX1BBUkVOVCkpOw0KKwltYXMtPm5vZGUgPSBtdF9ta19ub2Rl KG5vZGUsIHR5cGUpOw0KKw0KKwlpZiAobWFzLT5pbmRleCkgew0KKwkJaWYgKGNvbnRlbnRzKSB7 DQorCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHNsb3RzW3Nsb3RdLCBjb250ZW50cyk7DQorCQkJaWYg KGxpa2VseShtYXMtPmluZGV4ID4gMSkpDQorCQkJCXNsb3QrKzsNCisJCX0NCisJCXBpdm90c1tz bG90KytdID0gbWFzLT5pbmRleCAtIDE7DQorCX0NCisNCisJcmN1X2Fzc2lnbl9wb2ludGVyKHNs 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 DQorCQkvKiBEZXRlY3Qgc3Bhbm5pbmcgc3RvcmUgd3Igd2FsayAqLw0KKwkJaWYgKGxhc3QgPT0g VUxPTkdfTUFYKQ0KKwkJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwl0cmFjZV9tYV93cml0ZShf X2Z1bmNfXywgd3JfbWFzLT5tYXMsIHBpdiwgZW50cnkpOw0KKw0KKwlyZXR1cm4gdHJ1ZTsNCit9 DQorDQorc3RhdGljIGlubGluZSB2b2lkIG1hc193cl93YWxrX2Rlc2NlbmQoc3RydWN0IG1hX3dy X3N0YXRlICp3cl9tYXMpDQorew0KKwl3cl9tYXMtPm1hcy0+ZGVwdGgrKzsNCisJd3JfbWFzLT50 eXBlID0gbXRlX25vZGVfdHlwZSh3cl9tYXMtPm1hcy0+bm9kZSk7DQorCW1hc193cl9ub2RlX3dh bGsod3JfbWFzKTsNCisJd3JfbWFzLT5zbG90cyA9IG1hX3Nsb3RzKHdyX21hcy0+bm9kZSwgd3Jf bWFzLT50eXBlKTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG1hc193cl93YWxrX3RyYXZl cnNlKHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJd3JfbWFzLT5tYXMtPm1heCA9 IHdyX21hcy0+cl9tYXg7DQorCXdyX21hcy0+bWFzLT5taW4gPSB3cl9tYXMtPnJfbWluOw0KKwl3 cl9tYXMtPm1hcy0+bm9kZSA9IHdyX21hcy0+Y29udGVudDsNCisJd3JfbWFzLT5tYXMtPm9mZnNl dCA9IDA7DQorfQ0KKy8qDQorICogbWFzX3dyX3dhbGsoKSAtIFdhbGsgdGhlIHRyZWUgZm9yIGEg d3JpdGUuDQorICogQHdyX21hczogVGhlIG1hcGxlIHdyaXRlIHN0YXRlDQorICoNCisgKiBVc2Vz IG1hc19zbG90X2xvY2tlZCgpIGFuZCBkb2VzIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IGRlYWQg bm9kZXMuDQorICoNCisgKiBSZXR1cm46IFRydWUgaWYgaXQncyBjb250YWluZWQgaW4gYSBub2Rl LCBmYWxzZSBvbiBzcGFubmluZyB3cml0ZS4NCisgKi8NCitzdGF0aWMgYm9vbCBtYXNfd3Jfd2Fs ayhzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFz ID0gd3JfbWFzLT5tYXM7DQorDQorCXdoaWxlICh0cnVlKSB7DQorCQltYXNfd3Jfd2Fsa19kZXNj ZW5kKHdyX21hcyk7DQorCQlpZiAodW5saWtlbHkobWFzX2lzX3NwYW5fd3Iod3JfbWFzKSkpDQor CQkJcmV0dXJuIGZhbHNlOw0KKw0KKwkJd3JfbWFzLT5jb250ZW50ID0gbWFzX3Nsb3RfbG9ja2Vk KG1hcywgd3JfbWFzLT5zbG90cywNCisJCQkJCQkgIG1hcy0+b2Zmc2V0KTsNCisJCWlmIChtYV9p c19sZWFmKHdyX21hcy0+dHlwZSkpDQorCQkJcmV0dXJuIHRydWU7DQorDQorCQltYXNfd3Jfd2Fs a190cmF2ZXJzZSh3cl9tYXMpOw0KKwl9DQorDQorCXJldHVybiB0cnVlOw0KK30NCisNCitzdGF0 aWMgYm9vbCBtYXNfd3Jfd2Fsa19pbmRleChzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7 DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQorDQorCXdoaWxlICh0cnVl KSB7DQorCQltYXNfd3Jfd2Fsa19kZXNjZW5kKHdyX21hcyk7DQorCQl3cl9tYXMtPmNvbnRlbnQg PSBtYXNfc2xvdF9sb2NrZWQobWFzLCB3cl9tYXMtPnNsb3RzLA0KKwkJCQkJCSAgbWFzLT5vZmZz ZXQpOw0KKwkJaWYgKG1hX2lzX2xlYWYod3JfbWFzLT50eXBlKSkNCisJCQlyZXR1cm4gdHJ1ZTsN CisJCW1hc193cl93YWxrX3RyYXZlcnNlKHdyX21hcyk7DQorDQorCX0NCisJcmV0dXJuIHRydWU7 DQorfQ0KKy8qDQorICogbWFzX2V4dGVuZF9zcGFubmluZ19udWxsKCkgLSBFeHRlbmQgYSBzdG9y ZSBvZiBhICVOVUxMIHRvIGluY2x1ZGUgc3Vycm91bmRpbmcgJU5VTExzLg0KKyAqIEBsX3dyX21h czogVGhlIGxlZnQgbWFwbGUgd3JpdGUgc3RhdGUNCisgKiBAcl93cl9tYXM6IFRoZSByaWdodCBt YXBsZSB3cml0ZSBzdGF0ZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXNfZXh0ZW5kX3Nw YW5uaW5nX251bGwoc3RydWN0IG1hX3dyX3N0YXRlICpsX3dyX21hcywNCisJCQkJCSAgICBzdHJ1 Y3QgbWFfd3Jfc3RhdGUgKnJfd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hX3N0YXRlICpyX21hcyA9 IHJfd3JfbWFzLT5tYXM7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbF9tYXMgPSBsX3dyX21hcy0+bWFz Ow0KKwl1bnNpZ25lZCBjaGFyIGxfc2xvdDsNCisNCisJbF9zbG90ID0gbF9tYXMtPm9mZnNldDsN CisJaWYgKCFsX3dyX21hcy0+Y29udGVudCkNCisJCWxfbWFzLT5pbmRleCA9IGxfd3JfbWFzLT5y X21pbjsNCisNCisJaWYgKChsX21hcy0+aW5kZXggPT0gbF93cl9tYXMtPnJfbWluKSAmJg0KKwkJ IChsX3Nsb3QgJiYNCisJCSAgIW1hc19zbG90X2xvY2tlZChsX21hcywgbF93cl9tYXMtPnNsb3Rz LCBsX3Nsb3QgLSAxKSkpIHsNCisJCWlmIChsX3Nsb3QgPiAxKQ0KKwkJCWxfbWFzLT5pbmRleCA9 IGxfd3JfbWFzLT5waXZvdHNbbF9zbG90IC0gMl0gKyAxOw0KKwkJZWxzZQ0KKwkJCWxfbWFzLT5p bmRleCA9IGxfbWFzLT5taW47DQorDQorCQlsX21hcy0+b2Zmc2V0ID0gbF9zbG90IC0gMTsNCisJ fQ0KKw0KKwlpZiAoIXJfd3JfbWFzLT5jb250ZW50KSB7DQorCQlpZiAocl9tYXMtPmxhc3QgPCBy X3dyX21hcy0+cl9tYXgpDQorCQkJcl9tYXMtPmxhc3QgPSByX3dyX21hcy0+cl9tYXg7DQorCQly X21hcy0+b2Zmc2V0Kys7DQorCX0gZWxzZSBpZiAoKHJfbWFzLT5sYXN0ID09IHJfd3JfbWFzLT5y X21heCkgJiYNCisJICAgIChyX21hcy0+bGFzdCA8IHJfbWFzLT5tYXgpICYmDQorCSAgICAhbWFz X3Nsb3RfbG9ja2VkKHJfbWFzLCByX3dyX21hcy0+c2xvdHMsIHJfbWFzLT5vZmZzZXQgKyAxKSkg ew0KKwkJcl9tYXMtPmxhc3QgPSBtYXNfc2FmZV9waXZvdChyX21hcywgcl93cl9tYXMtPnBpdm90 cywNCisJCQkJCSAgICAgcl93cl9tYXMtPnR5cGUsIHJfbWFzLT5vZmZzZXQgKyAxKTsNCisJCXJf bWFzLT5vZmZzZXQrKzsNCisJfQ0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19zdGF0 ZV93YWxrKHN0cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJdm9pZCAqZW50cnk7DQorDQorCWVu dHJ5ID0gbWFzX3N0YXJ0KG1hcyk7DQorCWlmIChtYXNfaXNfbm9uZShtYXMpKQ0KKwkJcmV0dXJu IE5VTEw7DQorDQorCWlmIChtYXNfaXNfcHRyKG1hcykpDQorCQlyZXR1cm4gZW50cnk7DQorDQor CXJldHVybiBtdHJlZV9yYW5nZV93YWxrKG1hcyk7DQorfQ0KKw0KKy8qDQorICogbXRyZWVfbG9v a3VwX3dhbGsoKSAtIEludGVybmFsIHF1aWNrIGxvb2t1cCB0aGF0IGRvZXMgbm90IGtlZXAgbWFw bGUgc3RhdGUgdXANCisgKiB0byBkYXRlLg0KKyAqDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRl Lg0KKyAqDQorICogTm90ZTogTGVhdmVzIG1hcyBpbiB1bmRlc2lyYWJsZSBzdGF0ZS4NCisgKiBS ZXR1cm46IFRoZSBlbnRyeSBmb3IgQG1hcy0+aW5kZXggb3IgJU5VTEwgb24gZGVhZCBub2RlLg0K KyAqLw0KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbXRyZWVfbG9va3VwX3dhbGsoc3RydWN0IG1hX3N0 YXRlICptYXMpDQorew0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorCXVuc2lnbmVkIGNoYXIg b2Zmc2V0Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJc3RydWN0IG1hcGxlX2Vub2Rl ICpuZXh0Ow0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0K Kwl1bnNpZ25lZCBjaGFyIGVuZDsNCisJdW5zaWduZWQgbG9uZyBtYXg7DQorDQorCW5leHQgPSBt YXMtPm5vZGU7DQorCW1heCA9IFVMT05HX01BWDsNCisJZG8gew0KKwkJb2Zmc2V0ID0gMDsNCisJ CW5vZGUgPSBtdGVfdG9fbm9kZShuZXh0KTsNCisJCXR5cGUgPSBtdGVfbm9kZV90eXBlKG5leHQp Ow0KKwkJcGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIHR5cGUpOw0KKwkJZW5kID0gbWFfZGF0YV9l bmQobm9kZSwgdHlwZSwgcGl2b3RzLCBtYXgpOw0KKwkJaWYgKHVubGlrZWx5KG1hX2RlYWRfbm9k ZShub2RlKSkpDQorCQkJZ290byBkZWFkX25vZGU7DQorDQorCQlpZiAocGl2b3RzW29mZnNldF0g Pj0gbWFzLT5pbmRleCkNCisJCQlnb3RvIG5leHQ7DQorDQorCQlkbyB7DQorCQkJb2Zmc2V0Kys7 DQorCQl9IHdoaWxlKChvZmZzZXQgPCBlbmQpICYmIChwaXZvdHNbb2Zmc2V0XSA8IG1hcy0+aW5k ZXgpKTsNCisNCisJCWlmIChsaWtlbHkob2Zmc2V0ID4gZW5kKSkNCisJCQltYXggPSBwaXZvdHNb b2Zmc2V0XTsNCisNCituZXh0Og0KKwkJc2xvdHMgPSBtYV9zbG90cyhub2RlLCB0eXBlKTsNCisJ CW5leHQgPSBtdF9zbG90KG1hcy0+dHJlZSwgc2xvdHMsIG9mZnNldCk7DQorCQlpZiAodW5saWtl bHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCQlnb3RvIGRlYWRfbm9kZTsNCisJfSB3aGlsZSAo IW1hX2lzX2xlYWYodHlwZSkpOw0KKw0KKwlyZXR1cm4gKHZvaWQgKikgbmV4dDsNCisNCitkZWFk X25vZGU6DQorCW1hc19yZXNldChtYXMpOw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyoNCisg KiBtYXNfbmV3X3Jvb3QoKSAtIENyZWF0ZSBhIG5ldyByb290IG5vZGUgdGhhdCBvbmx5IGNvbnRh aW5zIHRoZSBlbnRyeSBwYXNzZWQNCisgKiBpbi4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUN CisgKiBAZW50cnk6IFRoZSBlbnRyeSB0byBzdG9yZS4NCisgKg0KKyAqIE9ubHkgdmFsaWQgd2hl biB0aGUgaW5kZXggPT0gMCBhbmQgdGhlIGxhc3QgPT0gVUxPTkdfTUFYDQorICoNCisgKiBSZXR1 cm4gMCBvbiBlcnJvciwgMSBvbiBzdWNjZXNzLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgaW50IG1h c19uZXdfcm9vdChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50cnkpDQorew0KKwlzdHJ1 Y3QgbWFwbGVfZW5vZGUgKnJvb3QgPSBtYXNfcm9vdF9sb2NrZWQobWFzKTsNCisJZW51bSBtYXBs ZV90eXBlIHR5cGUgPSBtYXBsZV9sZWFmXzY0Ow0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsN CisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHM7DQorDQorCWlm ICghZW50cnkgJiYgIW1hcy0+aW5kZXggJiYgbWFzLT5sYXN0ID09IFVMT05HX01BWCkgew0KKwkJ bWFzLT5kZXB0aCA9IDA7DQorCQltYXNfc2V0X2hlaWdodChtYXMpOw0KKwkJcmN1X2Fzc2lnbl9w b2ludGVyKG1hcy0+dHJlZS0+bWFfcm9vdCwgZW50cnkpOw0KKwkJbWFzLT5ub2RlID0gTUFTX1NU QVJUOw0KKwkJZ290byBkb25lOw0KKwl9DQorDQorCW1hc19ub2RlX2NvdW50KG1hcywgMSk7DQor CWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQlyZXR1cm4gMDsNCisNCisJbm9kZSA9IG1hc19wb3Bf bm9kZShtYXMpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgdHlwZSk7DQorCXNsb3RzID0g bWFfc2xvdHMobm9kZSwgdHlwZSk7DQorCW5vZGUtPnBhcmVudCA9IG1hX3BhcmVudF9wdHIoDQor CQkgICAgICAoKHVuc2lnbmVkIGxvbmcpbWFzLT50cmVlIHwgTUFfUk9PVF9QQVJFTlQpKTsNCisJ bWFzLT5ub2RlID0gbXRfbWtfbm9kZShub2RlLCB0eXBlKTsNCisJcmN1X2Fzc2lnbl9wb2ludGVy KHNsb3RzWzBdLCBlbnRyeSk7DQorCXBpdm90c1swXSA9IG1hcy0+bGFzdDsNCisJbWFzLT5kZXB0 aCA9IDE7DQorCW1hc19zZXRfaGVpZ2h0KG1hcyk7DQorCXJjdV9hc3NpZ25fcG9pbnRlcihtYXMt PnRyZWUtPm1hX3Jvb3QsIG10ZV9ta19yb290KG1hcy0+bm9kZSkpOw0KKw0KK2RvbmU6DQorCWlm ICh4YV9pc19ub2RlKHJvb3QpKQ0KKwkJbXRlX2Rlc3Ryb3lfd2Fsayhyb290LCBtYXMtPnRyZWUp Ow0KKw0KKwlyZXR1cm4gMTsNCit9DQorLyoNCisgKiBtYXNfc3Bhbm5pbmdfc3RvcmUoKSAtIENy ZWF0ZSBhIHN1YnRyZWUgd2l0aCB0aGUgc3RvcmUgb3BlcmF0aW9uIGNvbXBsZXRlZA0KKyAqIGFu ZCBuZXcgbm9kZXMgd2hlcmUgbmVjZXNzYXJ5LCB0aGVuIHBsYWNlIHRoZSBzdWItdHJlZSBpbiB0 aGUgYWN0dWFsIHRyZWUuDQorICogTm90ZSB0aGF0IG1hcyBpcyBleHBlY3RlZCB0byBwb2ludCB0 byB0aGUgbm9kZSB3aGljaCBjYXVzZWQgdGhlIHN0b3JlIHRvDQorICogc3Bhbi4NCisgKiBAd3Jf bWFzOiBUaGUgbWFwbGUgd3JpdGUgc3RhdGUNCisgKg0KKyAqIFJldHVybjogMCBvbiBlcnJvciwg cG9zaXRpdmUgb24gc3VjY2Vzcy4NCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBtYXNfd3Jfc3Bh bm5pbmdfc3RvcmUoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9tYXMpDQorew0KKwlzdHJ1Y3QgbWFw bGVfc3VidHJlZV9zdGF0ZSBtYXN0Ow0KKwlzdHJ1Y3QgbWFwbGVfYmlnX25vZGUgYl9ub2RlOw0K KwlzdHJ1Y3QgbWFfc3RhdGUgKm1hczsNCisJdW5zaWduZWQgY2hhciBoZWlnaHQ7DQorDQorCS8q IExlZnQgYW5kIFJpZ2h0IHNpZGUgb2Ygc3Bhbm5pbmcgc3RvcmUgKi8NCisJTUFfU1RBVEUobF9t YXMsIE5VTEwsIDAsIDApOw0KKwlNQV9TVEFURShyX21hcywgTlVMTCwgMCwgMCk7DQorDQorCU1B X1dSX1NUQVRFKHJfd3JfbWFzLCAmcl9tYXMsIHdyX21hcy0+ZW50cnkpOw0KKwlNQV9XUl9TVEFU RShsX3dyX21hcywgJmxfbWFzLCB3cl9tYXMtPmVudHJ5KTsNCisNCisJLyoNCisJICogQSBzdG9y ZSBvcGVyYXRpb24gdGhhdCBzcGFucyBtdWx0aXBsZSBub2RlcyBpcyBjYWxsZWQgYSBzcGFubmlu Zw0KKwkgKiBzdG9yZSBhbmQgaXMgaGFuZGxlZCBlYXJseSBpbiB0aGUgc3RvcmUgY2FsbCBzdGFj ayBieSB0aGUgZnVuY3Rpb24NCisJICogbWFzX2lzX3NwYW5fd3IoKS4gIFdoZW4gYSBzcGFubmlu ZyBzdG9yZSBpcyBpZGVudGlmaWVkLCB0aGUgbWFwbGUNCisJICogc3RhdGUgaXMgZHVwbGljYXRl ZC4gIFRoZSBmaXJzdCBtYXBsZSBzdGF0ZSB3YWxrcyB0aGUgbGVmdCB0cmVlIHBhdGgNCisJICog dG8gYGBpbmRleGBgLCB0aGUgZHVwbGljYXRlIHdhbGtzIHRoZSByaWdodCB0cmVlIHBhdGggdG8g YGBsYXN0YGAuDQorCSAqIFRoZSBkYXRhIGluIHRoZSB0d28gbm9kZXMgYXJlIGNvbWJpbmVkIGlu dG8gYSBzaW5nbGUgbm9kZSwgdHdvIG5vZGVzLA0KKwkgKiBvciBwb3NzaWJseSB0aHJlZSBub2Rl cyAoc2VlIHRoZSAzLXdheSBzcGxpdCBhYm92ZSkuICBBIGBgTlVMTGBgDQorCSAqIHdyaXR0ZW4g dG8gdGhlIGxhc3QgZW50cnkgb2YgYSBub2RlIGlzIGNvbnNpZGVyZWQgYSBzcGFubmluZyBzdG9y ZSBhcw0KKwkgKiBhIHJlYmFsYW5jZSBpcyByZXF1aXJlZCBmb3IgdGhlIG9wZXJhdGlvbiB0byBj b21wbGV0ZSBhbmQgYW4gb3ZlcmZsb3cNCisJICogb2YgZGF0YSBtYXkgaGFwcGVuLg0KKwkgKi8N CisJbWFzID0gd3JfbWFzLT5tYXM7DQorCXRyYWNlX21hX29wKF9fZnVuY19fLCBtYXMpOw0KKw0K KwlpZiAodW5saWtlbHkoIW1hcy0+aW5kZXggJiYgbWFzLT5sYXN0ID09IFVMT05HX01BWCkpDQor CQlyZXR1cm4gbWFzX25ld19yb290KG1hcywgd3JfbWFzLT5lbnRyeSk7DQorCS8qDQorCSAqIE5v ZGUgcmViYWxhbmNpbmcgbWF5IG9jY3VyIGR1ZSB0byB0aGlzIHN0b3JlLCBzbyB0aGVyZSBtYXkg YmUgdHdvIG5ldw0KKwkgKiBlbnRyaWVzIHBlciBsZXZlbCBwbHVzIGEgbmV3IHJvb3QuDQorCSAq Lw0KKwloZWlnaHQgPSBtYXNfbXRfaGVpZ2h0KG1hcyk7DQorCW1hc19ub2RlX2NvdW50KG1hcywg MSArIGhlaWdodCAqIDMpOw0KKwlpZiAobWFzX2lzX2VycihtYXMpKQ0KKwkJcmV0dXJuIDA7DQor DQorCS8qDQorCSAqIFNldCB1cCByaWdodCBzaWRlLiAgTmVlZCB0byBnZXQgdG8gdGhlIG5leHQg b2Zmc2V0IGFmdGVyIHRoZSBzcGFubmluZw0KKwkgKiBzdG9yZSB0byBlbnN1cmUgaXQncyBub3Qg TlVMTCBhbmQgdG8gY29tYmluZSBib3RoIHRoZSBuZXh0IG5vZGUgYW5kDQorCSAqIHRoZSBub2Rl IHdpdGggdGhlIHN0YXJ0IHRvZ2V0aGVyLg0KKwkgKi8NCisJcl9tYXMgPSAqbWFzOw0KKwkvKiBB dm9pZCBvdmVyZmxvdywgd2FsayB0byBuZXh0IHNsb3QgaW4gdGhlIHRyZWUuICovDQorCWlmIChy X21hcy5sYXN0ICsgMSkNCisJCXJfbWFzLmxhc3QrKzsNCisNCisJcl9tYXMuaW5kZXggPSByX21h cy5sYXN0Ow0KKwltYXNfd3Jfd2Fsa19pbmRleCgmcl93cl9tYXMpOw0KKwlyX21hcy5sYXN0ID0g cl9tYXMuaW5kZXggPSBtYXMtPmxhc3Q7DQorDQorCS8qIFNldCB1cCBsZWZ0IHNpZGUuICovDQor CWxfbWFzID0gKm1hczsNCisJbWFzX3dyX3dhbGtfaW5kZXgoJmxfd3JfbWFzKTsNCisNCisJaWYg KCF3cl9tYXMtPmVudHJ5KSB7DQorCQltYXNfZXh0ZW5kX3NwYW5uaW5nX251bGwoJmxfd3JfbWFz LCAmcl93cl9tYXMpOw0KKwkJbWFzLT5vZmZzZXQgPSBsX21hcy5vZmZzZXQ7DQorCQltYXMtPmlu ZGV4ID0gbF9tYXMuaW5kZXg7DQorCQltYXMtPmxhc3QgPSBsX21hcy5sYXN0ID0gcl9tYXMubGFz dDsNCisJfQ0KKw0KKwltZW1zZXQoJmJfbm9kZSwgMCwgc2l6ZW9mKHN0cnVjdCBtYXBsZV9iaWdf bm9kZSkpOw0KKwkvKiBDb3B5IGxfbWFzIGFuZCBzdG9yZSB0aGUgdmFsdWUgaW4gYl9ub2RlLiAq Lw0KKwltYXNfc3RvcmVfYl9ub2RlKCZsX3dyX21hcywgJmJfbm9kZSwgbF93cl9tYXMubm9kZV9l bmQpOw0KKwkvKiBDb3B5IHJfbWFzIGludG8gYl9ub2RlLiAqLw0KKwlpZiAocl9tYXMub2Zmc2V0 IDw9IHJfd3JfbWFzLm5vZGVfZW5kKQ0KKwkJbWFzX21hYl9jcCgmcl9tYXMsIHJfbWFzLm9mZnNl dCwgcl93cl9tYXMubm9kZV9lbmQsDQorCQkJICAgJmJfbm9kZSwgYl9ub2RlLmJfZW5kICsgMSk7 DQorCS8qIFN0b3Agc3Bhbm5pbmcgc2VhcmNoZXMgYnkgc2VhcmNoaW5nIGZvciBqdXN0IGluZGV4 LiAqLw0KKwlsX21hcy5pbmRleCA9IGxfbWFzLmxhc3QgPSBtYXMtPmluZGV4Ow0KKw0KKwltYXN0 LmJuID0gJmJfbm9kZTsNCisJbWFzdC5vcmlnX2wgPSAmbF9tYXM7DQorCW1hc3Qub3JpZ19yID0g JnJfbWFzOw0KKwkvKiBDb21iaW5lIGxfbWFzIGFuZCByX21hcyBhbmQgc3BsaXQgdGhlbSB1cCBl dmVubHkgYWdhaW4uICovDQorCXJldHVybiBtYXNfc3Bhbm5pbmdfcmViYWxhbmNlKG1hcywgJm1h c3QsIGhlaWdodCArIDEpOw0KK30NCisNCisvKg0KKyAqIG1hc193cl9ub2RlX3N0b3JlKCkgLSBB dHRlbXB0IHRvIHN0b3JlIHRoZSB2YWx1ZSBpbiBhIG5vZGUNCisgKiBAd3JfbWFzOiBUaGUgbWFw bGUgd3JpdGUgc3RhdGUNCisgKg0KKyAqIEF0dGVtcHRzIHRvIHJldXNlIHRoZSBub2RlLCBidXQg bWF5IGFsbG9jYXRlLg0KKyAqDQorICogUmV0dXJuOiBUcnVlIGlmIHN0b3JlZCwgZmFsc2Ugb3Ro ZXJ3aXNlDQorICovDQorc3RhdGljIGlubGluZSBib29sIG1hc193cl9ub2RlX3N0b3JlKHN0cnVj dCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJc3RydWN0IG1hX3N0YXRlICptYXMgPSB3cl9t YXMtPm1hczsNCisJdm9pZCBfX3JjdSAqKmRzdF9zbG90czsNCisJdW5zaWduZWQgbG9uZyAqZHN0 X3Bpdm90czsNCisJdW5zaWduZWQgY2hhciBkc3Rfb2Zmc2V0Ow0KKwl1bnNpZ25lZCBjaGFyIG5l d19lbmQgPSB3cl9tYXMtPm5vZGVfZW5kOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJdW5z aWduZWQgY2hhciBub2RlX3Nsb3RzID0gbXRfc2xvdHNbd3JfbWFzLT50eXBlXTsNCisJc3RydWN0 IG1hcGxlX25vZGUgcmV1c2UsICpuZXdub2RlOw0KKwl1bnNpZ25lZCBjaGFyIGNvcHlfc2l6ZSwg bWF4X3BpdiA9IG10X3Bpdm90c1t3cl9tYXMtPnR5cGVdOw0KKwlib29sIGluX3JjdSA9IG10X2lu X3JjdShtYXMtPnRyZWUpOw0KKw0KKwlvZmZzZXQgPSBtYXMtPm9mZnNldDsNCisJaWYgKG1hcy0+ bGFzdCA9PSB3cl9tYXMtPnJfbWF4KSB7DQorCQkvKiBydW5zIHJpZ2h0IHRvIHRoZSBlbmQgb2Yg dGhlIG5vZGUgKi8NCisJCWlmIChtYXMtPmxhc3QgPT0gbWFzLT5tYXgpDQorCQkJbmV3X2VuZCA9 IG9mZnNldDsNCisJCS8qIGRvbid0IGNvcHkgdGhpcyBvZmZzZXQgKi8NCisJCXdyX21hcy0+b2Zm c2V0X2VuZCsrOw0KKwl9IGVsc2UgaWYgKG1hcy0+bGFzdCA8IHdyX21hcy0+cl9tYXgpIHsNCisJ CS8qIG5ldyByYW5nZSBlbmRzIGluIHRoaXMgcmFuZ2UgKi8NCisJCWlmICh1bmxpa2VseSh3cl9t YXMtPnJfbWF4ID09IFVMT05HX01BWCkpDQorCQkJbWFzX2J1bGtfcmViYWxhbmNlKG1hcywgd3Jf bWFzLT5ub2RlX2VuZCwgd3JfbWFzLT50eXBlKTsNCisNCisJCW5ld19lbmQrKzsNCisJfSBlbHNl IHsNCisJCWlmIChtYXNfc2FmZV9waXZvdChtYXMsIHdyX21hcy0+cGl2b3RzLCB3cl9tYXMtPm9m ZnNldF9lbmQsDQorCQkJCSAgIHdyX21hcy0+dHlwZSkgPT0gbWFzLT5sYXN0KQ0KKwkJCXdyX21h cy0+b2Zmc2V0X2VuZCsrOw0KKw0KKwkJbmV3X2VuZCAtPSB3cl9tYXMtPm9mZnNldF9lbmQgLSBv ZmZzZXQgLSAxOw0KKwl9DQorDQorCS8qIG5ldyByYW5nZSBzdGFydHMgd2l0aGluIGEgcmFuZ2Ug Ki8NCisJaWYgKHdyX21hcy0+cl9taW4gPCBtYXMtPmluZGV4KQ0KKwkJbmV3X2VuZCsrOw0KKw0K KwkvKiBOb3QgZW5vdWdoIHJvb20gKi8NCisJaWYgKG5ld19lbmQgPj0gbm9kZV9zbG90cykNCisJ CXJldHVybiBmYWxzZTsNCisNCisJLyogTm90IGVub3VnaCBkYXRhLiAqLw0KKwlpZiAoIW10ZV9p c19yb290KG1hcy0+bm9kZSkgJiYgKG5ld19lbmQgPD0gbXRfbWluX3Nsb3RzW3dyX21hcy0+dHlw ZV0pICYmDQorCSAgICAhKG1hcy0+bWFzX2ZsYWdzICYgTUFfU1RBVEVfQlVMSykpDQorCQlyZXR1 cm4gZmFsc2U7DQorDQorCS8qIHNldCB1cCBub2RlLiAqLw0KKwlpZiAoaW5fcmN1KSB7DQorCQlt YXNfbm9kZV9jb3VudChtYXMsIDEpOw0KKwkJaWYgKG1hc19pc19lcnIobWFzKSkNCisJCQlyZXR1 cm4gZmFsc2U7DQorDQorCQluZXdub2RlID0gbWFzX3BvcF9ub2RlKG1hcyk7DQorCX0gZWxzZSB7 DQorCQltZW1zZXQoJnJldXNlLCAwLCBzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUpKTsNCisJCW5l d25vZGUgPSAmcmV1c2U7DQorCX0NCisNCisJbmV3bm9kZS0+cGFyZW50ID0gbWFzX21uKG1hcykt PnBhcmVudDsNCisJZHN0X3Bpdm90cyA9IG1hX3Bpdm90cyhuZXdub2RlLCB3cl9tYXMtPnR5cGUp Ow0KKwlkc3Rfc2xvdHMgPSBtYV9zbG90cyhuZXdub2RlLCB3cl9tYXMtPnR5cGUpOw0KKwkvKiBD b3B5IGZyb20gc3RhcnQgdG8gaW5zZXJ0IHBvaW50ICovDQorCW1lbWNweShkc3RfcGl2b3RzLCB3 cl9tYXMtPnBpdm90cywgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogKG9mZnNldCArIDEpKTsNCisJ bWVtY3B5KGRzdF9zbG90cywgd3JfbWFzLT5zbG90cywgc2l6ZW9mKHZvaWQgKikgKiAob2Zmc2V0 ICsgMSkpOw0KKwlkc3Rfb2Zmc2V0ID0gb2Zmc2V0Ow0KKw0KKwkvKiBIYW5kbGUgaW5zZXJ0IG9m IG5ldyByYW5nZSBzdGFydGluZyBhZnRlciBvbGQgcmFuZ2UgKi8NCisJaWYgKHdyX21hcy0+cl9t aW4gPCBtYXMtPmluZGV4KSB7DQorCQltYXMtPm9mZnNldCsrOw0KKwkJcmN1X2Fzc2lnbl9wb2lu dGVyKGRzdF9zbG90c1tkc3Rfb2Zmc2V0XSwgd3JfbWFzLT5jb250ZW50KTsNCisJCWRzdF9waXZv dHNbZHN0X29mZnNldCsrXSA9IG1hcy0+aW5kZXggLSAxOw0KKwl9DQorDQorCS8qIFN0b3JlIHRo ZSBuZXcgZW50cnkgYW5kIHJhbmdlIGVuZC4gKi8NCisJaWYgKGRzdF9vZmZzZXQgPCBtYXhfcGl2 KQ0KKwkJZHN0X3Bpdm90c1tkc3Rfb2Zmc2V0XSA9IG1hcy0+bGFzdDsNCisJbWFzLT5vZmZzZXQg PSBkc3Rfb2Zmc2V0Ow0KKwlyY3VfYXNzaWduX3BvaW50ZXIoZHN0X3Nsb3RzW2RzdF9vZmZzZXQr K10sIHdyX21hcy0+ZW50cnkpOw0KKw0KKwkvKiB0aGlzIHJhbmdlIHdyb3RlIHRvIHRoZSBlbmQg b2YgdGhlIG5vZGUuICovDQorCWlmICh3cl9tYXMtPm9mZnNldF9lbmQgPiB3cl9tYXMtPm5vZGVf ZW5kKQ0KKwkJZ290byBkb25lOw0KKw0KKwkvKiBDb3B5IHRvIHRoZSBlbmQgb2Ygbm9kZSBpZiBu ZWNlc3NhcnkuICovDQorCWNvcHlfc2l6ZSA9IHdyX21hcy0+bm9kZV9lbmQgLSB3cl9tYXMtPm9m ZnNldF9lbmQgKyAxOw0KKwltZW1jcHkoZHN0X3Nsb3RzICsgZHN0X29mZnNldCwgd3JfbWFzLT5z bG90cyArIHdyX21hcy0+b2Zmc2V0X2VuZCwNCisJICAgICAgIHNpemVvZih2b2lkICopICogY29w eV9zaXplKTsNCisJaWYgKGRzdF9vZmZzZXQgPCBtYXhfcGl2KSB7DQorCQlpZiAoY29weV9zaXpl ID4gbWF4X3BpdiAtIGRzdF9vZmZzZXQpDQorCQkJY29weV9zaXplID0gbWF4X3BpdiAtIGRzdF9v ZmZzZXQ7DQorCQltZW1jcHkoZHN0X3Bpdm90cyArIGRzdF9vZmZzZXQsIHdyX21hcy0+cGl2b3Rz ICsgd3JfbWFzLT5vZmZzZXRfZW5kLA0KKwkJICAgICAgIHNpemVvZih1bnNpZ25lZCBsb25nKSAq IGNvcHlfc2l6ZSk7DQorCX0NCisNCitkb25lOg0KKwlpZiAoKHdyX21hcy0+bm9kZV9lbmQgPT0g bm9kZV9zbG90cyAtIDEpICYmIChuZXdfZW5kIDwgbm9kZV9zbG90cyAtIDEpKQ0KKwkJZHN0X3Bp dm90c1tuZXdfZW5kXSA9IG1hcy0+bWF4Ow0KKw0KKwltYXNfbGVhZl9zZXRfbWV0YShtYXMsIG5l d25vZGUsIGRzdF9waXZvdHMsIG1hcGxlX2xlYWZfNjQsIG5ld19lbmQpOw0KKwlpZiAoaW5fcmN1 KSB7DQorCQltYXMtPm5vZGUgPSBtdF9ta19ub2RlKG5ld25vZGUsIHdyX21hcy0+dHlwZSk7DQor CQltYXNfcmVwbGFjZShtYXMsIGZhbHNlKTsNCisJfSBlbHNlIHsNCisJCW1lbWNweSh3cl9tYXMt Pm5vZGUsIG5ld25vZGUsIHNpemVvZihzdHJ1Y3QgbWFwbGVfbm9kZSkpOw0KKwl9DQorCXRyYWNl X21hX3dyaXRlKF9fZnVuY19fLCBtYXMsIDAsIHdyX21hcy0+ZW50cnkpOw0KKwltYXNfdXBkYXRl X2dhcChtYXMpOw0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorLyoNCisgKiBtYXNfd3Jfc2xvdF9z dG9yZTogQXR0ZW1wdCB0byBzdG9yZSBhIHZhbHVlIGluIGEgc2xvdC4NCisgKiBAd3JfbWFzOiB0 aGUgbWFwbGUgd3JpdGUgc3RhdGUNCisgKg0KKyAqIFJldHVybjogVHJ1ZSBpZiBzdG9yZWQsIGZh bHNlIG90aGVyd2lzZQ0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfd3Jfc2xvdF9zdG9y ZShzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21hcykNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFz ID0gd3JfbWFzLT5tYXM7DQorCXVuc2lnbmVkIGxvbmcgbG1heDsgLyogTG9naWNhbCBtYXguICov DQorCXVuc2lnbmVkIGNoYXIgb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorDQorCWlmICgod3JfbWFz LT5yX21heCA+IG1hcy0+bGFzdCkgJiYgKCh3cl9tYXMtPnJfbWluICE9IG1hcy0+aW5kZXgpIHx8 DQorCQkJCSAgKG9mZnNldCAhPSB3cl9tYXMtPm5vZGVfZW5kKSkpDQorCQlyZXR1cm4gZmFsc2U7 DQorDQorCWlmIChvZmZzZXQgPT0gd3JfbWFzLT5ub2RlX2VuZCAtIDEpDQorCQlsbWF4ID0gbWFz LT5tYXg7DQorCWVsc2UNCisJCWxtYXggPSB3cl9tYXMtPnBpdm90c1tvZmZzZXQgKyAxXTsNCisN CisJLyogZ29pbmcgdG8gb3ZlcndyaXRlIHRvbyBtYW55IHNsb3RzLiAqLw0KKwlpZiAobG1heCA8 IG1hcy0+bGFzdCkNCisJCXJldHVybiBmYWxzZTsNCisNCisJaWYgKHdyX21hcy0+cl9taW4gPT0g bWFzLT5pbmRleCkgew0KKwkJLyogb3ZlcndyaXRpbmcgdHdvIG9yIG1vcmUgcmFuZ2VzIHdpdGgg b25lLiAqLw0KKwkJaWYgKGxtYXggPT0gbWFzLT5sYXN0KQ0KKwkJCXJldHVybiBmYWxzZTsNCisN CisJCS8qIE92ZXJ3cml0aW5nIGFsbCBvZiBvZmZzZXQgYW5kIGEgcG9ydGlvbiBvZiBvZmZzZXQg KyAxLiAqLw0KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHdyX21hcy0+c2xvdHNbb2Zmc2V0XSwgd3Jf bWFzLT5lbnRyeSk7DQorCQl3cl9tYXMtPnBpdm90c1tvZmZzZXRdID0gbWFzLT5sYXN0Ow0KKwkJ Z290byBkb25lOw0KKwl9DQorDQorCS8qIERvZXNuJ3QgZW5kIG9uIHRoZSBuZXh0IHJhbmdlIGVu ZC4gKi8NCisJaWYgKGxtYXggIT0gbWFzLT5sYXN0KQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0KKwkv KiBPdmVyd3JpdGluZyBhIHBvcnRpb24gb2Ygb2Zmc2V0IGFuZCBhbGwgb2Ygb2Zmc2V0ICsgMSAq Lw0KKwlpZiAoKG9mZnNldCArIDEgPCBtdF9waXZvdHNbd3JfbWFzLT50eXBlXSkgJiYNCisJICAg ICh3cl9tYXMtPmVudHJ5IHx8IHdyX21hcy0+cGl2b3RzW29mZnNldCArIDFdKSkNCisJCQl3cl9t YXMtPnBpdm90c1tvZmZzZXQgKyAxXSA9IG1hcy0+bGFzdDsNCisNCisJcmN1X2Fzc2lnbl9wb2lu dGVyKHdyX21hcy0+c2xvdHNbb2Zmc2V0ICsgMV0sIHdyX21hcy0+ZW50cnkpOw0KKwl3cl9tYXMt PnBpdm90c1tvZmZzZXRdID0gbWFzLT5pbmRleCAtIDE7DQorCW1hcy0+b2Zmc2V0Kys7IC8qIEtl ZXAgbWFzIGFjY3VyYXRlLiAqLw0KKw0KK2RvbmU6DQorCXRyYWNlX21hX3dyaXRlKF9fZnVuY19f LCBtYXMsIDAsIHdyX21hcy0+ZW50cnkpOw0KKwltYXNfdXBkYXRlX2dhcChtYXMpOw0KKwlyZXR1 cm4gdHJ1ZTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG1hc193cl9lbmRfcGl2KHN0cnVj dCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJd2hpbGUgKCh3cl9tYXMtPm1hcy0+bGFzdCA+ IHdyX21hcy0+ZW5kX3BpdikgJiYNCisJICAgICAgICh3cl9tYXMtPm9mZnNldF9lbmQgPCB3cl9t YXMtPm5vZGVfZW5kKSkNCisJCXdyX21hcy0+ZW5kX3BpdiA9IHdyX21hcy0+cGl2b3RzWysrd3Jf bWFzLT5vZmZzZXRfZW5kXTsNCisNCisJaWYgKHdyX21hcy0+bWFzLT5sYXN0ID4gd3JfbWFzLT5l bmRfcGl2KQ0KKwkJd3JfbWFzLT5lbmRfcGl2ID0gd3JfbWFzLT5tYXMtPm1heDsNCit9DQorDQor c3RhdGljIGlubGluZSB2b2lkIG1hc193cl9leHRlbmRfbnVsbChzdHJ1Y3QgbWFfd3Jfc3RhdGUg KndyX21hcykNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQorDQor CWlmIChtYXMtPmxhc3QgPCB3cl9tYXMtPmVuZF9waXYgJiYgIXdyX21hcy0+c2xvdHNbd3JfbWFz LT5vZmZzZXRfZW5kXSkNCisJCW1hcy0+bGFzdCA9IHdyX21hcy0+ZW5kX3BpdjsNCisNCisJLyog Q2hlY2sgbmV4dCBzbG90KHMpIGlmIHdlIGFyZSBvdmVyd3JpdGluZyB0aGUgZW5kICovDQorCWlm ICgobWFzLT5sYXN0ID09IHdyX21hcy0+ZW5kX3BpdikgJiYNCisJICAgICh3cl9tYXMtPm5vZGVf ZW5kICE9IHdyX21hcy0+b2Zmc2V0X2VuZCkgJiYNCisJICAgICF3cl9tYXMtPnNsb3RzW3dyX21h cy0+b2Zmc2V0X2VuZCArIDFdKSB7DQorCQl3cl9tYXMtPm9mZnNldF9lbmQrKzsNCisJCWlmICh3 cl9tYXMtPm9mZnNldF9lbmQgPT0gd3JfbWFzLT5ub2RlX2VuZCkNCisJCQltYXMtPmxhc3QgPSBt YXMtPm1heDsNCisJCWVsc2UNCisJCQltYXMtPmxhc3QgPSB3cl9tYXMtPnBpdm90c1t3cl9tYXMt Pm9mZnNldF9lbmRdOw0KKwl9IGVsc2UgaWYgKChtYXMtPmxhc3QgPiB3cl9tYXMtPmVuZF9waXYp ICYmDQorCQkgICAhd3JfbWFzLT5zbG90c1t3cl9tYXMtPm9mZnNldF9lbmRdKSB7DQorCQltYXMt Pmxhc3QgPSB3cl9tYXMtPmVuZF9waXY7DQorCQl3cl9tYXMtPm9mZnNldF9lbmQrKzsNCisJfQ0K Kw0KKwlpZiAoIXdyX21hcy0+Y29udGVudCkgew0KKwkJLyogSWYgdGhpcyBvbmUgaXMgbnVsbCwg dGhlIG5leHQgYW5kIHByZXYgYXJlIG5vdCAqLw0KKwkJbWFzLT5pbmRleCA9IHdyX21hcy0+cl9t aW47DQorCX0gZWxzZSB7DQorCQkvKiBDaGVjayBwcmV2IHNsb3QgaWYgd2UgYXJlIG92ZXJ3cml0 aW5nIHRoZSBzdGFydCAqLw0KKwkJaWYgKG1hcy0+aW5kZXggPT0gd3JfbWFzLT5yX21pbiAmJiBt YXMtPm9mZnNldCAmJg0KKwkJICAgICF3cl9tYXMtPnNsb3RzW21hcy0+b2Zmc2V0IC0gMV0pIHsN CisJCQltYXMtPm9mZnNldC0tOw0KKwkJCXdyX21hcy0+cl9taW4gPSBtYXMtPmluZGV4ID0NCisJ CQkJbWFzX3NhZmVfbWluKG1hcywgd3JfbWFzLT5waXZvdHMsIG1hcy0+b2Zmc2V0KTsNCisJCQl3 cl9tYXMtPnJfbWF4ID0gd3JfbWFzLT5waXZvdHNbbWFzLT5vZmZzZXRdOw0KKwkJfQ0KKwl9DQor fQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXNfd3JfYXBwZW5kKHN0cnVjdCBtYV93cl9zdGF0 ZSAqd3JfbWFzKQ0KK3sNCisJdW5zaWduZWQgY2hhciBlbmQgPSB3cl9tYXMtPm5vZGVfZW5kOw0K Kwl1bnNpZ25lZCBjaGFyIG5ld19lbmQgPSBlbmQgKyAxOw0KKwlzdHJ1Y3QgbWFfc3RhdGUgKm1h cyA9IHdyX21hcy0+bWFzOw0KKwl1bnNpZ25lZCBjaGFyIG5vZGVfcGl2b3RzID0gbXRfcGl2b3Rz W3dyX21hcy0+dHlwZV07DQorDQorCWlmICgobWFzLT5pbmRleCAhPSB3cl9tYXMtPnJfbWluKSAm JiAobWFzLT5sYXN0ID09IHdyX21hcy0+cl9tYXgpKSB7DQorCQlpZiAobmV3X2VuZCA8IG5vZGVf cGl2b3RzKQ0KKwkJCXdyX21hcy0+cGl2b3RzW25ld19lbmRdID0gd3JfbWFzLT5waXZvdHNbZW5k XTsNCisNCisJCWlmIChuZXdfZW5kIDwgbm9kZV9waXZvdHMpDQorCQkJbWFfc2V0X21ldGEod3Jf bWFzLT5ub2RlLCBtYXBsZV9sZWFmXzY0LCAwLCBuZXdfZW5kKTsNCisNCisJCXJjdV9hc3NpZ25f cG9pbnRlcih3cl9tYXMtPnNsb3RzW25ld19lbmRdLCB3cl9tYXMtPmVudHJ5KTsNCisJCW1hcy0+ b2Zmc2V0ID0gbmV3X2VuZDsNCisJCXdyX21hcy0+cGl2b3RzW2VuZF0gPSBtYXMtPmluZGV4IC0g MTsNCisNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCWlmICgobWFzLT5pbmRleCA9PSB3cl9t YXMtPnJfbWluKSAmJiAobWFzLT5sYXN0IDwgd3JfbWFzLT5yX21heCkpIHsNCisJCWlmIChuZXdf ZW5kIDwgbm9kZV9waXZvdHMpDQorCQkJd3JfbWFzLT5waXZvdHNbbmV3X2VuZF0gPSB3cl9tYXMt PnBpdm90c1tlbmRdOw0KKw0KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHdyX21hcy0+c2xvdHNbbmV3 X2VuZF0sIHdyX21hcy0+Y29udGVudCk7DQorCQlpZiAobmV3X2VuZCA8IG5vZGVfcGl2b3RzKQ0K KwkJCW1hX3NldF9tZXRhKHdyX21hcy0+bm9kZSwgbWFwbGVfbGVhZl82NCwgMCwgbmV3X2VuZCk7 DQorDQorCQl3cl9tYXMtPnBpdm90c1tlbmRdID0gbWFzLT5sYXN0Ow0KKwkJcmN1X2Fzc2lnbl9w b2ludGVyKHdyX21hcy0+c2xvdHNbZW5kXSwgd3JfbWFzLT5lbnRyeSk7DQorCQlyZXR1cm4gdHJ1 ZTsNCisJfQ0KKw0KKwlyZXR1cm4gZmFsc2U7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBt YXNfd3JfbW9kaWZ5KHN0cnVjdCBtYV93cl9zdGF0ZSAqd3JfbWFzKQ0KK3sNCisJdW5zaWduZWQg Y2hhciBub2RlX3Nsb3RzOw0KKwl1bnNpZ25lZCBjaGFyIG5vZGVfc2l6ZTsNCisJc3RydWN0IG1h X3N0YXRlICptYXMgPSB3cl9tYXMtPm1hczsNCisJc3RydWN0IG1hcGxlX2JpZ19ub2RlIGJfbm9k ZTsNCisNCisJLyogRGlyZWN0IHJlcGxhY2VtZW50ICovDQorCWlmICh3cl9tYXMtPnJfbWluID09 IG1hcy0+aW5kZXggJiYgd3JfbWFzLT5yX21heCA9PSBtYXMtPmxhc3QpIHsNCisJCXJjdV9hc3Np Z25fcG9pbnRlcih3cl9tYXMtPnNsb3RzW21hcy0+b2Zmc2V0XSwgd3JfbWFzLT5lbnRyeSk7DQor CQlpZiAoISF3cl9tYXMtPmVudHJ5IF4gISF3cl9tYXMtPmNvbnRlbnQpDQorCQkJbWFzX3VwZGF0 ZV9nYXAobWFzKTsNCisJCXJldHVybjsNCisJfQ0KKw0KKwkvKiBBdHRlbXB0IHRvIGFwcGVuZCAq Lw0KKwlub2RlX3Nsb3RzID0gbXRfc2xvdHNbd3JfbWFzLT50eXBlXTsNCisJbm9kZV9zaXplID0g d3JfbWFzLT5ub2RlX2VuZCAtIHdyX21hcy0+b2Zmc2V0X2VuZCArIG1hcy0+b2Zmc2V0ICsgMjsN CisJaWYgKG1hcy0+bWF4ID09IFVMT05HX01BWCkNCisJCW5vZGVfc2l6ZSsrOw0KKw0KKwkvKiBz bG90IGFuZCBub2RlIHN0b3JlIHdpbGwgbm90IGZpdCwgZ28gdG8gdGhlIHNsb3cgcGF0aCAqLw0K KwlpZiAodW5saWtlbHkobm9kZV9zaXplID49IG5vZGVfc2xvdHMpKQ0KKwkJZ290byBzbG93X3Bh dGg7DQorDQorCWlmICh3cl9tYXMtPmVudHJ5ICYmICh3cl9tYXMtPm5vZGVfZW5kIDwgbm9kZV9z bG90cyAtIDEpICYmDQorCSAgICAobWFzLT5vZmZzZXQgPT0gd3JfbWFzLT5ub2RlX2VuZCkgJiYg bWFzX3dyX2FwcGVuZCh3cl9tYXMpKSB7DQorCQkJaWYgKCF3cl9tYXMtPmNvbnRlbnQgfHwgIXdy X21hcy0+ZW50cnkpDQorCQkJCW1hc191cGRhdGVfZ2FwKG1hcyk7DQorCQkJcmV0dXJuOw0KKwl9 DQorDQorCWlmICgod3JfbWFzLT5vZmZzZXRfZW5kIC0gbWFzLT5vZmZzZXQgPD0gMSkgJiYgbWFz X3dyX3Nsb3Rfc3RvcmUod3JfbWFzKSkNCisJCXJldHVybjsNCisJZWxzZSBpZiAobWFzX3dyX25v ZGVfc3RvcmUod3JfbWFzKSkNCisJCXJldHVybjsNCisNCisJaWYgKG1hc19pc19lcnIobWFzKSkN CisJCXJldHVybjsNCisNCitzbG93X3BhdGg6DQorCW1lbXNldCgmYl9ub2RlLCAwLCBzaXplb2Yo c3RydWN0IG1hcGxlX2JpZ19ub2RlKSk7DQorCW1hc19zdG9yZV9iX25vZGUod3JfbWFzLCAmYl9u b2RlLCB3cl9tYXMtPm9mZnNldF9lbmQpOw0KKwl0cmFjZV9tYV93cml0ZShfX2Z1bmNfXywgbWFz LCAwLCB3cl9tYXMtPmVudHJ5KTsNCisJbWFzX2NvbW1pdF9iX25vZGUod3JfbWFzLCAmYl9ub2Rl LCB3cl9tYXMtPm5vZGVfZW5kKTsNCit9DQorDQorLyoNCisgKiBtYXNfd3Jfc3RvcmVfZW50cnko KSAtIEludGVybmFsIGNhbGwgdG8gc3RvcmUgYSB2YWx1ZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBz dGF0ZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlLg0KKyAqDQorICogUmV0dXJuOiBU aGUgY29udGVudHMgdGhhdCB3YXMgc3RvcmVkIGF0IHRoZSBpbmRleC4NCisgKi8NCitzdGF0aWMg aW5saW5lIHZvaWQgKm1hc193cl9zdG9yZV9lbnRyeShzdHJ1Y3QgbWFfd3Jfc3RhdGUgKndyX21h cykNCit7DQorCXN0cnVjdCBtYV9zdGF0ZSAqbWFzID0gd3JfbWFzLT5tYXM7DQorDQorCWlmICgo d3JfbWFzLT5jb250ZW50ID0gbWFzX3N0YXJ0KG1hcykpIHx8IG1hc19pc19ub25lKG1hcykgfHwN CisJICAgIG1hc19pc19wdHIobWFzKSkgew0KKwkJbWFzX3N0b3JlX3Jvb3QobWFzLCB3cl9tYXMt PmVudHJ5KTsNCisJCXJldHVybiB3cl9tYXMtPmNvbnRlbnQ7DQorCX0NCisNCisJaWYgKHVubGlr ZWx5KCFtYXNfd3Jfd2Fsayh3cl9tYXMpKSkgew0KKwkJbWFzX3dyX3NwYW5uaW5nX3N0b3JlKHdy X21hcyk7DQorCQlyZXR1cm4gd3JfbWFzLT5jb250ZW50Ow0KKwl9DQorDQorCS8qIEF0IHRoaXMg cG9pbnQsIHdlIGFyZSBhdCB0aGUgbGVhZiBub2RlIHRoYXQgbmVlZHMgdG8gYmUgYWx0ZXJlZC4g Ki8NCisJd3JfbWFzLT5lbmRfcGl2ID0gd3JfbWFzLT5yX21heDsNCisJbWFzX3dyX2VuZF9waXYo d3JfbWFzKTsNCisNCisJaWYgKCF3cl9tYXMtPmVudHJ5KQ0KKwkJbWFzX3dyX2V4dGVuZF9udWxs KHdyX21hcyk7DQorDQorCS8qIE5ldyByb290IGZvciBhIHNpbmdsZSBwb2ludGVyICovDQorCWlm ICh1bmxpa2VseSghbWFzLT5pbmRleCAmJiBtYXMtPmxhc3QgPT0gVUxPTkdfTUFYKSkgew0KKwkJ bWFzX25ld19yb290KG1hcywgd3JfbWFzLT5lbnRyeSk7DQorCQlyZXR1cm4gd3JfbWFzLT5jb250 ZW50Ow0KKwl9DQorDQorCW1hc193cl9tb2RpZnkod3JfbWFzKTsNCisJcmV0dXJuIHdyX21hcy0+ Y29udGVudDsNCit9DQorDQorLyoqDQorICogbWFzX2luc2VydCgpIC0gSW50ZXJuYWwgY2FsbCB0 byBpbnNlcnQgYSB2YWx1ZQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbnRyeTog VGhlIGVudHJ5IHRvIHN0b3JlDQorICoNCisgKiBSZXR1cm46ICVOVUxMIG9yIHRoZSBjb250ZW50 cyB0aGF0IGFscmVhZHkgZXhpc3RzIGF0IHRoZSByZXF1ZXN0ZWQgaW5kZXgNCisgKiBvdGhlcndp c2UuICBUaGUgbWFwbGUgc3RhdGUgbmVlZHMgdG8gYmUgY2hlY2tlZCBmb3IgZXJyb3IgY29uZGl0 aW9ucy4NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgKm1hc19pbnNlcnQoc3RydWN0IG1hX3N0 YXRlICptYXMsIHZvaWQgKmVudHJ5KQ0KK3sNCisJTUFfV1JfU1RBVEUod3JfbWFzLCBtYXMsIGVu dHJ5KTsNCisNCisJLyoNCisJICogSW5zZXJ0aW5nIGEgbmV3IHJhbmdlIGluc2VydHMgZWl0aGVy IDAsIDEsIG9yIDIgcGl2b3RzIHdpdGhpbiB0aGUNCisJICogdHJlZS4gIElmIHRoZSBpbnNlcnQg Zml0cyBleGFjdGx5IGludG8gYW4gZXhpc3RpbmcgZ2FwIHdpdGggYSB2YWx1ZQ0KKwkgKiBvZiBO VUxMLCB0aGVuIHRoZSBzbG90IG9ubHkgbmVlZHMgdG8gYmUgd3JpdHRlbiB3aXRoIHRoZSBuZXcg dmFsdWUuDQorCSAqIElmIHRoZSByYW5nZSBiZWluZyBpbnNlcnRlZCBpcyBhZGphY2VudCB0byBh bm90aGVyIHJhbmdlLCB0aGVuIG9ubHkgYQ0KKwkgKiBzaW5nbGUgcGl2b3QgbmVlZHMgdG8gYmUg aW5zZXJ0ZWQgKGFzIHdlbGwgYXMgd3JpdGluZyB0aGUgZW50cnkpLiAgSWYNCisJICogdGhlIG5l dyByYW5nZSBpcyB3aXRoaW4gYSBnYXAgYnV0IGRvZXMgbm90IHRvdWNoIGFueSBvdGhlciByYW5n ZXMsDQorCSAqIHRoZW4gdHdvIHBpdm90cyBuZWVkIHRvIGJlIGluc2VydGVkOiB0aGUgc3RhcnQg LSAxLCBhbmQgdGhlIGVuZC4gIEFzDQorCSAqIHVzdWFsLCB0aGUgZW50cnkgbXVzdCBiZSB3cml0 dGVuLiAgTW9zdCBvcGVyYXRpb25zIHJlcXVpcmUgYSBuZXcgbm9kZQ0KKwkgKiB0byBiZSBhbGxv Y2F0ZWQgYW5kIHJlcGxhY2UgYW4gZXhpc3Rpbmcgbm9kZSB0byBlbnN1cmUgUkNVIHNhZmV0eSwN CisJICogd2hlbiBpbiBSQ1UgbW9kZS4gIFRoZSBleGNlcHRpb24gdG8gcmVxdWlyaW5nIGEgbmV3 bHkgYWxsb2NhdGVkIG5vZGUNCisJICogaXMgd2hlbiBpbnNlcnRpbmcgYXQgdGhlIGVuZCBvZiBh IG5vZGUgKGFwcGVuZGluZykuICBXaGVuIGRvbmUNCisJICogY2FyZWZ1bGx5LCBhcHBlbmRpbmcg Y2FuIHJldXNlIHRoZSBub2RlIGluIHBsYWNlLg0KKwkgKi8NCisJd3JfbWFzLmNvbnRlbnQgPSBt YXNfc3RhcnQobWFzKTsNCisJaWYgKHdyX21hcy5jb250ZW50KQ0KKwkJZ290byBleGlzdHM7DQor DQorCWlmIChtYXNfaXNfbm9uZShtYXMpIHx8IG1hc19pc19wdHIobWFzKSkgew0KKwkJbWFzX3N0 b3JlX3Jvb3QobWFzLCBlbnRyeSk7DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwkvKiBzcGFu bmluZyB3cml0ZXMgYWx3YXlzIG92ZXJ3cml0ZSBzb21ldGhpbmcgKi8NCisJaWYgKCFtYXNfd3Jf d2Fsaygmd3JfbWFzKSkNCisJCWdvdG8gZXhpc3RzOw0KKw0KKwkvKiBBdCB0aGlzIHBvaW50LCB3 ZSBhcmUgYXQgdGhlIGxlYWYgbm9kZSB0aGF0IG5lZWRzIHRvIGJlIGFsdGVyZWQuICovDQorCXdy X21hcy5vZmZzZXRfZW5kID0gbWFzLT5vZmZzZXQ7DQorCXdyX21hcy5lbmRfcGl2ID0gd3JfbWFz LnJfbWF4Ow0KKw0KKwlpZiAod3JfbWFzLmNvbnRlbnQgfHwgKG1hcy0+bGFzdCA+IHdyX21hcy5y X21heCkpDQorCQlnb3RvIGV4aXN0czsNCisNCisJaWYgKCFlbnRyeSkNCisJCXJldHVybiBOVUxM Ow0KKw0KKwltYXNfd3JfbW9kaWZ5KCZ3cl9tYXMpOw0KKwlyZXR1cm4gd3JfbWFzLmNvbnRlbnQ7 DQorDQorZXhpc3RzOg0KKwltYXNfc2V0X2VycihtYXMsIC1FRVhJU1QpOw0KKwlyZXR1cm4gd3Jf bWFzLmNvbnRlbnQ7DQorDQorfQ0KKw0KKy8qDQorICogbWFzX3ByZXZfbm9kZSgpIC0gRmluZCB0 aGUgcHJldiBub24tbnVsbCBlbnRyeSBhdCB0aGUgc2FtZSBsZXZlbCBpbiB0aGUNCisgKiB0cmVl LiAgVGhlIHByZXYgdmFsdWUgd2lsbCBiZSBtYXMtPm5vZGVbbWFzLT5vZmZzZXRdIG9yIE1BU19O T05FLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtaW46IFRoZSBsb3dlciBsaW1p dCB0byBzZWFyY2gNCisgKg0KKyAqIFRoZSBwcmV2IG5vZGUgdmFsdWUgd2lsbCBiZSBtYXMtPm5v ZGVbbWFzLT5vZmZzZXRdIG9yIE1BU19OT05FLg0KKyAqIFJldHVybjogMSBpZiB0aGUgbm9kZSBp cyBkZWFkLCAwIG90aGVyd2lzZS4NCisgKi8NCitzdGF0aWMgaW5saW5lIGludCBtYXNfcHJldl9u b2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1pbikNCit7DQorCWVudW0g bWFwbGVfdHlwZSBtdDsNCisJaW50IG9mZnNldCwgbGV2ZWw7DQorCXZvaWQgX19yY3UgKipzbG90 czsNCisJc3RydWN0IG1hcGxlX25vZGUgKm5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqZW5v ZGU7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisNCisJaWYgKG1hc19pc19ub25lKG1hcykp DQorCQlyZXR1cm4gMDsNCisNCisJbGV2ZWwgPSAwOw0KKwlkbyB7DQorCQlub2RlID0gbWFzX21u KG1hcyk7DQorCQlpZiAobWFfaXNfcm9vdChub2RlKSkNCisJCQlnb3RvIG5vX2VudHJ5Ow0KKw0K KwkJLyogV2FsayB1cC4gKi8NCisJCWlmICh1bmxpa2VseShtYXNfYXNjZW5kKG1hcykpKQ0KKwkJ CXJldHVybiAxOw0KKwkJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCQlsZXZlbCsrOw0KKwl9IHdo aWxlICghb2Zmc2V0KTsNCisNCisJb2Zmc2V0LS07DQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMt Pm5vZGUpOw0KKwlub2RlID0gbWFzX21uKG1hcyk7DQorCXNsb3RzID0gbWFfc2xvdHMobm9kZSwg bXQpOw0KKwlwaXZvdHMgPSBtYV9waXZvdHMobm9kZSwgbXQpOw0KKwltYXMtPm1heCA9IHBpdm90 c1tvZmZzZXRdOw0KKwlpZiAob2Zmc2V0KQ0KKwkJbWFzLT5taW4gPSBwaXZvdHNbb2Zmc2V0IC0g MV0gKyAxOw0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCXJldHVybiAx Ow0KKw0KKwlpZiAobWFzLT5tYXggPCBtaW4pDQorCQlnb3RvIG5vX2VudHJ5X21pbjsNCisNCisJ d2hpbGUgKGxldmVsID4gMSkgew0KKwkJbGV2ZWwtLTsNCisJCWVub2RlID0gbWFzX3Nsb3QobWFz LCBzbG90cywgb2Zmc2V0KTsNCisJCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUobm9kZSkpKQ0K KwkJCXJldHVybiAxOw0KKw0KKwkJbWFzLT5ub2RlID0gZW5vZGU7DQorCQltdCA9IG10ZV9ub2Rl X3R5cGUobWFzLT5ub2RlKTsNCisJCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJCXNsb3RzID0gbWFf c2xvdHMobm9kZSwgbXQpOw0KKwkJcGl2b3RzID0gbWFfcGl2b3RzKG5vZGUsIG10KTsNCisJCW9m ZnNldCA9IG1hX2RhdGFfZW5kKG5vZGUsIG10LCBwaXZvdHMsIG1hcy0+bWF4KTsNCisJCWlmIChv ZmZzZXQpDQorCQkJbWFzLT5taW4gPSBwaXZvdHNbb2Zmc2V0IC0gMV0gKyAxOw0KKw0KKwkJaWYg KG9mZnNldCA8IG10X3Bpdm90c1ttdF0pDQorCQkJbWFzLT5tYXggPSBwaXZvdHNbb2Zmc2V0XTsN CisNCisJCWlmIChtYXMtPm1heCA8IG1pbikNCisJCQlnb3RvIG5vX2VudHJ5Ow0KKwl9DQorDQor CW1hcy0+bm9kZSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG9mZnNldCk7DQorCWlmICh1bmxpa2Vs eShtYV9kZWFkX25vZGUobm9kZSkpKQ0KKwkJcmV0dXJuIDE7DQorDQorCW1hcy0+b2Zmc2V0ID0g bWFzX2RhdGFfZW5kKG1hcyk7DQorCWlmICh1bmxpa2VseShtdGVfZGVhZF9ub2RlKG1hcy0+bm9k ZSkpKQ0KKwkJcmV0dXJuIDE7DQorDQorCXJldHVybiAwOw0KKw0KK25vX2VudHJ5X21pbjoNCisJ bWFzLT5vZmZzZXQgPSBvZmZzZXQ7DQorCWlmIChvZmZzZXQpDQorCQltYXMtPm1pbiA9IHBpdm90 c1tvZmZzZXQgLSAxXSArIDE7DQorbm9fZW50cnk6DQorCWlmICh1bmxpa2VseShtYV9kZWFkX25v ZGUobm9kZSkpKQ0KKwkJcmV0dXJuIDE7DQorDQorCW1hcy0+bm9kZSA9IE1BU19OT05FOw0KKwly ZXR1cm4gMDsNCit9DQorDQorLyoNCisgKiBtYXNfbmV4dF9ub2RlKCkgLSBHZXQgdGhlIG5leHQg bm9kZSBhdCB0aGUgc2FtZSBsZXZlbCBpbiB0aGUgdHJlZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUg c3RhdGUNCisgKiBAbWF4OiBUaGUgbWF4aW11bSBwaXZvdCB2YWx1ZSB0byBjaGVjay4NCisgKg0K KyAqIFRoZSBuZXh0IHZhbHVlIHdpbGwgYmUgbWFzLT5ub2RlW21hcy0+b2Zmc2V0XSBvciBNQVNf Tk9ORS4NCisgKiBSZXR1cm46IDEgb24gZGVhZCBub2RlLCAwIG90aGVyd2lzZS4NCisgKi8NCitz dGF0aWMgaW5saW5lIGludCBtYXNfbmV4dF9ub2RlKHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCBzdHJ1 Y3QgbWFwbGVfbm9kZSAqbm9kZSwNCisJCQkJdW5zaWduZWQgbG9uZyBtYXgpDQorew0KKwl1bnNp Z25lZCBsb25nIG1pbiwgcGl2b3Q7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJc3RydWN0 IG1hcGxlX2Vub2RlICplbm9kZTsNCisJaW50IGxldmVsID0gMDsNCisJdW5zaWduZWQgY2hhciBv ZmZzZXQ7DQorCWVudW0gbWFwbGVfdHlwZSBtdDsNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKw0K KwlpZiAobWFzLT5tYXggPj0gbWF4KQ0KKwkJZ290byBub19lbnRyeTsNCisNCisJbGV2ZWwgPSAw Ow0KKwlkbyB7DQorCQlpZiAobWFfaXNfcm9vdChub2RlKSkNCisJCQlnb3RvIG5vX2VudHJ5Ow0K Kw0KKwkJbWluID0gbWFzLT5tYXggKyAxOw0KKwkJaWYgKG1pbiA+IG1heCkNCisJCQlnb3RvIG5v X2VudHJ5Ow0KKw0KKwkJaWYgKHVubGlrZWx5KG1hc19hc2NlbmQobWFzKSkpDQorCQkJcmV0dXJu IDE7DQorDQorCQlvZmZzZXQgPSBtYXMtPm9mZnNldDsNCisJCWxldmVsKys7DQorCQlub2RlID0g bWFzX21uKG1hcyk7DQorCQltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJCXBpdm90 cyA9IG1hX3Bpdm90cyhub2RlLCBtdCk7DQorCX0gd2hpbGUgKHVubGlrZWx5KG9mZnNldCA9PSBt YV9kYXRhX2VuZChub2RlLCBtdCwgcGl2b3RzLCBtYXMtPm1heCkpKTsNCisNCisJc2xvdHMgPSBt YV9zbG90cyhub2RlLCBtdCk7DQorCXBpdm90ID0gbWFzX3NhZmVfcGl2b3QobWFzLCBwaXZvdHMs ICsrb2Zmc2V0LCBtdCk7DQorCXdoaWxlICh1bmxpa2VseShsZXZlbCA+IDEpKSB7DQorCQkvKiBE ZXNjZW5kLCBpZiBuZWNlc3NhcnkgKi8NCisJCWVub2RlID0gbWFzX3Nsb3QobWFzLCBzbG90cywg b2Zmc2V0KTsNCisJCWlmICh1bmxpa2VseShtYV9kZWFkX25vZGUobm9kZSkpKQ0KKwkJCXJldHVy biAxOw0KKw0KKwkJbWFzLT5ub2RlID0gZW5vZGU7DQorCQlsZXZlbC0tOw0KKwkJbm9kZSA9IG1h c19tbihtYXMpOw0KKwkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7DQorCQlzbG90cyA9 IG1hX3Nsb3RzKG5vZGUsIG10KTsNCisJCXBpdm90cyA9IG1hX3Bpdm90cyhub2RlLCBtdCk7DQor CQlvZmZzZXQgPSAwOw0KKwkJcGl2b3QgPSBwaXZvdHNbMF07DQorCX0NCisNCisJZW5vZGUgPSBt YXNfc2xvdChtYXMsIHNsb3RzLCBvZmZzZXQpOw0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2Rl KG5vZGUpKSkNCisJCXJldHVybiAxOw0KKw0KKwltYXMtPm5vZGUgPSBlbm9kZTsNCisJbWFzLT5t aW4gPSBtaW47DQorCW1hcy0+bWF4ID0gcGl2b3Q7DQorCXJldHVybiAwOw0KKw0KK25vX2VudHJ5 Og0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG5vZGUpKSkNCisJCXJldHVybiAxOw0KKw0K KwltYXMtPm5vZGUgPSBNQVNfTk9ORTsNCisJcmV0dXJuIDA7DQorfQ0KKw0KKy8qDQorICogbWFz X25leHRfbmVudHJ5KCkgLSBHZXQgdGhlIG5leHQgbm9kZSBlbnRyeQ0KKyAqIEBtYXM6IFRoZSBt YXBsZSBzdGF0ZQ0KKyAqIEBtYXg6IFRoZSBtYXhpbXVtIHZhbHVlIHRvIGNoZWNrDQorICogQCpy YW5nZV9zdGFydDogUG9pbnRlciB0byBzdG9yZSB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlLg0KKyAq DQorICogU2V0cyBAbWFzLT5vZmZzZXQgdG8gdGhlIG9mZnNldCBvZiB0aGUgbmV4dCBub2RlIGVu dHJ5LCBAbWFzLT5sYXN0IHRvIHRoZQ0KKyAqIHBpdm90IG9mIHRoZSBlbnRyeS4NCisgKg0KKyAq IFJldHVybjogVGhlIG5leHQgZW50cnksICVOVUxMIG90aGVyd2lzZQ0KKyAqLw0KK3N0YXRpYyBp bmxpbmUgdm9pZCAqbWFzX25leHRfbmVudHJ5KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLA0KKwkgICAg c3RydWN0IG1hcGxlX25vZGUgKm5vZGUsIHVuc2lnbmVkIGxvbmcgbWF4LCBlbnVtIG1hcGxlX3R5 cGUgdHlwZSkNCit7DQorCXVuc2lnbmVkIGNoYXIgY291bnQ7DQorCXVuc2lnbmVkIGxvbmcgcGl2 b3Q7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwl2 b2lkICplbnRyeTsNCisNCisJaWYgKG1hcy0+bGFzdCA9PSBtYXMtPm1heCkgew0KKwkJbWFzLT5p bmRleCA9IG1hcy0+bWF4Ow0KKwkJcmV0dXJuIE5VTEw7DQorCX0NCisNCisJcGl2b3RzID0gbWFf cGl2b3RzKG5vZGUsIHR5cGUpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIHR5cGUpOw0KKwlt YXMtPmluZGV4ID0gbWFzX3NhZmVfbWluKG1hcywgcGl2b3RzLCBtYXMtPm9mZnNldCk7DQorCWlm IChtYV9kZWFkX25vZGUobm9kZSkpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJaWYgKG1hcy0+aW5k ZXggPiBtYXgpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJY291bnQgPSBtYV9kYXRhX2VuZChub2Rl LCB0eXBlLCBwaXZvdHMsIG1hcy0+bWF4KTsNCisJd2hpbGUgKG1hcy0+b2Zmc2V0IDwgY291bnQp IHsNCisJCXBpdm90ID0gcGl2b3RzW21hcy0+b2Zmc2V0XTsNCisJCWVudHJ5ID0gbWFzX3Nsb3Qo bWFzLCBzbG90cywgbWFzLT5vZmZzZXQpOw0KKwkJaWYgKG1hX2RlYWRfbm9kZShub2RlKSkNCisJ CQlyZXR1cm4gTlVMTDsNCisNCisJCWlmIChlbnRyeSkNCisJCQlnb3RvIGZvdW5kOw0KKw0KKwkJ aWYgKHBpdm90ID49IG1heCkNCisJCQlyZXR1cm4gTlVMTDsNCisNCisJCW1hcy0+aW5kZXggPSBw aXZvdCArIDE7DQorCQltYXMtPm9mZnNldCsrOw0KKwl9DQorDQorCWlmIChtYXMtPmluZGV4ID4g bWFzLT5tYXgpIHsNCisJCW1hcy0+aW5kZXggPSBtYXMtPmxhc3Q7DQorCQlyZXR1cm4gTlVMTDsN CisJfQ0KKw0KKwlwaXZvdCA9IG1hc19zYWZlX3Bpdm90KG1hcywgcGl2b3RzLCBtYXMtPm9mZnNl dCwgdHlwZSk7DQorCWVudHJ5ID0gbWFzX3Nsb3QobWFzLCBzbG90cywgbWFzLT5vZmZzZXQpOw0K KwlpZiAobWFfZGVhZF9ub2RlKG5vZGUpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCWlmICghcGl2 b3QpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJaWYgKCFlbnRyeSkNCisJCXJldHVybiBOVUxMOw0K Kw0KK2ZvdW5kOg0KKwltYXMtPmxhc3QgPSBwaXZvdDsNCisJcmV0dXJuIGVudHJ5Ow0KK30NCisN CitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX3Jld2FsayhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5z aWduZWQgbG9uZyBpbmRleCkNCit7DQorDQorcmV0cnk6DQorCW1hc19zZXQobWFzLCBpbmRleCk7 DQorCW1hc19zdGF0ZV93YWxrKG1hcyk7DQorCWlmIChtYXNfaXNfc3RhcnQobWFzKSkNCisJCWdv dG8gcmV0cnk7DQorDQorCXJldHVybjsNCisNCit9DQorDQorLyoNCisgKiBtYXNfbmV4dF9lbnRy eSgpIC0gSW50ZXJuYWwgZnVuY3Rpb24gdG8gZ2V0IHRoZSBuZXh0IGVudHJ5Lg0KKyAqIEBtYXM6 IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBsaW1pdDogVGhlIG1heGltdW0gcmFuZ2Ugc3RhcnQuDQor ICoNCisgKiBTZXQgdGhlIEBtYXMtPm5vZGUgdG8gdGhlIG5leHQgZW50cnkgYW5kIHRoZSByYW5n ZV9zdGFydCB0bw0KKyAqIHRoZSBiZWdpbm5pbmcgdmFsdWUgZm9yIHRoZSBlbnRyeS4gIERvZXMg bm90IGNoZWNrIGJleW9uZCBAbGltaXQuDQorICogU2V0cyBAbWFzLT5pbmRleCBhbmQgQG1hcy0+ bGFzdCB0byB0aGUgbGltaXQgaWYgaXQgaXMgaGl0Lg0KKyAqIFJlc3RhcnRzIG9uIGRlYWQgbm9k ZXMuDQorICoNCisgKiBSZXR1cm46IHRoZSBuZXh0IGVudHJ5IG9yICVOVUxMLg0KKyAqLw0KK3N0 YXRpYyBpbmxpbmUgdm9pZCAqbWFzX25leHRfZW50cnkoc3RydWN0IG1hX3N0YXRlICptYXMsIHVu c2lnbmVkIGxvbmcgbGltaXQpDQorew0KKwl2b2lkICplbnRyeSA9IE5VTEw7DQorCXN0cnVjdCBt YXBsZV9lbm9kZSAqcHJldl9ub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZTsNCisJdW5z aWduZWQgY2hhciBvZmZzZXQ7DQorCXVuc2lnbmVkIGxvbmcgbGFzdDsNCisJZW51bSBtYXBsZV90 eXBlIG10Ow0KKw0KKwlsYXN0ID0gbWFzLT5sYXN0Ow0KK3JldHJ5Og0KKwlvZmZzZXQgPSBtYXMt Pm9mZnNldDsNCisJcHJldl9ub2RlID0gbWFzLT5ub2RlOw0KKwlub2RlID0gbWFzX21uKG1hcyk7 DQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0KKwltYXMtPm9mZnNldCsrOw0KKwlp ZiAodW5saWtlbHkobWFzLT5vZmZzZXQgPj0gbXRfc2xvdHNbbXRdKSkNCisJCWdvdG8gbmV4dF9u b2RlOw0KKw0KKwl3aGlsZSAoIW1hc19pc19ub25lKG1hcykpIHsNCisJCWVudHJ5ID0gbWFzX25l eHRfbmVudHJ5KG1hcywgbm9kZSwgbGltaXQsIG10KTsNCisJCWlmICh1bmxpa2VseShtYV9kZWFk X25vZGUobm9kZSkpKSB7DQorCQkJbWFzX3Jld2FsayhtYXMsIGxhc3QpOw0KKwkJCWdvdG8gcmV0 cnk7DQorCQl9DQorDQorCQlpZiAobGlrZWx5KGVudHJ5KSkNCisJCQlyZXR1cm4gZW50cnk7DQor DQorCQlpZiAodW5saWtlbHkoKG1hcy0+aW5kZXggPiBsaW1pdCkpKQ0KKwkJCWJyZWFrOw0KKw0K K25leHRfbm9kZToNCisJCXByZXZfbm9kZSA9IG1hcy0+bm9kZTsNCisJCW9mZnNldCA9IG1hcy0+ b2Zmc2V0Ow0KKwkJaWYgKHVubGlrZWx5KG1hc19uZXh0X25vZGUobWFzLCBub2RlLCBsaW1pdCkp KSB7DQorCQkJbWFzX3Jld2FsayhtYXMsIGxhc3QpOw0KKwkJCWdvdG8gcmV0cnk7DQorCQl9DQor CQltYXMtPm9mZnNldCA9IDA7DQorCQlub2RlID0gbWFzX21uKG1hcyk7DQorCQltdCA9IG10ZV9u b2RlX3R5cGUobWFzLT5ub2RlKTsNCisJfQ0KKw0KKwltYXMtPmluZGV4ID0gbWFzLT5sYXN0ID0g bGltaXQ7DQorCW1hcy0+b2Zmc2V0ID0gb2Zmc2V0Ow0KKwltYXMtPm5vZGUgPSBwcmV2X25vZGU7 DQorCXJldHVybiBOVUxMOw0KK30NCisNCisvKg0KKyAqIG1hc19wcmV2X25lbnRyeSgpIC0gR2V0 IHRoZSBwcmV2aW91cyBub2RlIGVudHJ5Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisg KiBAbGltaXQ6IFRoZSBsb3dlciBsaW1pdCB0byBjaGVjayBmb3IgYSB2YWx1ZS4NCisgKg0KKyAq IFJldHVybjogdGhlIGVudHJ5LCAlTlVMTCBvdGhlcndpc2UuDQorICovDQorc3RhdGljIGlubGlu ZSB2b2lkICptYXNfcHJldl9uZW50cnkoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxv bmcgbGltaXQsDQorCQkJCSAgICB1bnNpZ25lZCBsb25nIGluZGV4KQ0KK3sNCisJdW5zaWduZWQg bG9uZyBwaXZvdCwgbWluOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsNCisJc3RydWN0IG1hcGxl X25vZGUgKm1uOw0KKwllbnVtIG1hcGxlX3R5cGUgbXQ7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90 czsNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwl2b2lkICplbnRyeTsNCisNCityZXRyeToNCisJ aWYgKCFtYXMtPm9mZnNldCkNCisJCXJldHVybiBOVUxMOw0KKw0KKwltbiA9IG1hc19tbihtYXMp Ow0KKwltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJb2Zmc2V0ID0gbWFzLT5vZmZz ZXQgLSAxOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG1uLCBtdCk7DQorCXBpdm90cyA9IG1hX3Bpdm90 cyhtbiwgbXQpOw0KKwlpZiAob2Zmc2V0ID09IG10X3Bpdm90c1ttdF0pDQorCQlwaXZvdCA9IG1h cy0+bWF4Ow0KKwllbHNlDQorCQlwaXZvdCA9IHBpdm90c1tvZmZzZXRdOw0KKw0KKwlpZiAodW5s aWtlbHkobWFfZGVhZF9ub2RlKG1uKSkpIHsNCisJCW1hc19yZXdhbGsobWFzLCBpbmRleCk7DQor CQlnb3RvIHJldHJ5Ow0KKwl9DQorDQorCXdoaWxlIChvZmZzZXQgJiYgKCghbWFzX3Nsb3QobWFz LCBzbG90cywgb2Zmc2V0KSAmJiBwaXZvdCA+PSBsaW1pdCkgfHwNCisJICAgICAgICFwaXZvdCkp DQorCQlwaXZvdCA9IHBpdm90c1stLW9mZnNldF07DQorDQorCW1pbiA9IG1hc19zYWZlX21pbiht YXMsIHBpdm90cywgb2Zmc2V0KTsNCisJZW50cnkgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBvZmZz ZXQpOw0KKwlpZiAodW5saWtlbHkobWFfZGVhZF9ub2RlKG1uKSkpIHsNCisJCW1hc19yZXdhbGso bWFzLCBpbmRleCk7DQorCQlnb3RvIHJldHJ5Ow0KKwl9DQorDQorCWlmIChsaWtlbHkoZW50cnkp KSB7DQorCQltYXMtPm9mZnNldCA9IG9mZnNldDsNCisJCW1hcy0+bGFzdCA9IHBpdm90Ow0KKwkJ bWFzLT5pbmRleCA9IG1pbjsNCisJfQ0KKwlyZXR1cm4gZW50cnk7DQorfQ0KKw0KK3N0YXRpYyBp bmxpbmUgdm9pZCAqbWFzX3ByZXZfZW50cnkoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVk IGxvbmcgbWluKQ0KK3sNCisJdm9pZCAqZW50cnk7DQorDQorcmV0cnk6DQorCXdoaWxlIChsaWtl bHkoIW1hc19pc19ub25lKG1hcykpKSB7DQorCQllbnRyeSA9IG1hc19wcmV2X25lbnRyeShtYXMs IG1pbiwgbWFzLT5pbmRleCk7DQorCQlpZiAodW5saWtlbHkobWFzLT5sYXN0IDwgbWluKSkNCisJ CQlnb3RvIG5vdF9mb3VuZDsNCisNCisJCWlmIChsaWtlbHkoZW50cnkpKQ0KKwkJCXJldHVybiBl bnRyeTsNCisNCisJCWlmICh1bmxpa2VseShtYXNfcHJldl9ub2RlKG1hcywgbWluKSkpIHsNCisJ CQltYXNfcmV3YWxrKG1hcywgbWFzLT5pbmRleCk7DQorCQkJZ290byByZXRyeTsNCisJCX0NCisN CisJCW1hcy0+b2Zmc2V0Kys7DQorCX0NCisNCisJbWFzLT5vZmZzZXQtLTsNCitub3RfZm91bmQ6 DQorCW1hcy0+aW5kZXggPSBtYXMtPmxhc3QgPSBtaW47DQorCXJldHVybiBOVUxMOw0KK30NCisN CisvKg0KKyAqIG1hc19yZXZfYXdhbGsoKSAtIEludGVybmFsIGZ1bmN0aW9uLiAgUmV2ZXJzZSBh bGxvY2F0aW9uIHdhbGsuICBGaW5kIHRoZQ0KKyAqIGhpZ2hlc3QgZ2FwIGFkZHJlc3Mgb2YgYSBn aXZlbiBzaXplIGluIGEgZ2l2ZW4gbm9kZSBhbmQgZGVzY2VuZC4NCisgKiBAbWFzOiBUaGUgbWFw bGUgc3RhdGUNCisgKiBAc2l6ZTogVGhlIG5lZWRlZCBzaXplLg0KKyAqDQorICogUmV0dXJuOiBU cnVlIGlmIGZvdW5kIGluIGEgbGVhZiwgZmFsc2Ugb3RoZXJ3aXNlLg0KKyAqDQorICovDQorc3Rh dGljIGJvb2wgbWFzX3Jldl9hd2FsayhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9u ZyBzaXplKQ0KK3sNCisJZW51bSBtYXBsZV90eXBlIHR5cGUgPSBtdGVfbm9kZV90eXBlKG1hcy0+ bm9kZSk7DQorCXN0cnVjdCBtYXBsZV9ub2RlICpub2RlID0gbWFzX21uKG1hcyk7DQorCXVuc2ln bmVkIGxvbmcgKnBpdm90cywgKmdhcHM7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdW5zaWdu ZWQgbG9uZyBnYXAgPSAwOw0KKwl1bnNpZ25lZCBsb25nIG1heCwgbWluLCBpbmRleDsNCisJdW5z aWduZWQgY2hhciBvZmZzZXQ7DQorDQorCWlmICh1bmxpa2VseShtYXNfaXNfZXJyKG1hcykpKQ0K KwkgICAgcmV0dXJuIHRydWU7DQorDQorCWlmIChtYV9pc19kZW5zZSh0eXBlKSkgew0KKwkJLyog ZGVuc2Ugbm9kZXMuICovDQorCQltYXMtPm9mZnNldCA9ICh1bnNpZ25lZCBjaGFyKShtYXMtPmlu ZGV4IC0gbWFzLT5taW4pOw0KKwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJcGl2b3RzID0gbWFf cGl2b3RzKG5vZGUsIHR5cGUpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKG5vZGUsIHR5cGUpOw0KKwln YXBzID0gbWFfZ2Fwcyhub2RlLCB0eXBlKTsNCisJb2Zmc2V0ID0gbWFzLT5vZmZzZXQ7DQorCW1p biA9IG1hc19zYWZlX21pbihtYXMsIHBpdm90cywgb2Zmc2V0KTsNCisJLyogU2tpcCBvdXQgb2Yg Ym91bmRzLiAqLw0KKwl3aGlsZSAobWFzLT5sYXN0IDwgbWluKQ0KKwkJbWluID0gbWFzX3NhZmVf bWluKG1hcywgcGl2b3RzLCAtLW9mZnNldCk7DQorDQorCW1heCA9IG1hc19zYWZlX3Bpdm90KG1h cywgcGl2b3RzLCBvZmZzZXQsIHR5cGUpOw0KKwlpbmRleCA9IG1hcy0+aW5kZXg7DQorCXdoaWxl IChpbmRleCA8PSBtYXgpIHsNCisJCWdhcCA9IDA7DQorCQlpZiAoZ2FwcykNCisJCQlnYXAgPSBn YXBzW29mZnNldF07DQorCQllbHNlIGlmICghbWFzX3Nsb3QobWFzLCBzbG90cywgb2Zmc2V0KSkN CisJCQlnYXAgPSBtYXggLSBtaW4gKyAxOw0KKw0KKwkJaWYgKGdhcCkgew0KKwkJCWlmICgoc2l6 ZSA8PSBnYXApICYmIChzaXplIDw9IG1hcy0+bGFzdCAtIG1pbiArIDEpKQ0KKwkJCQlicmVhazsN CisNCisJCQlpZiAoIWdhcHMpIHsNCisJCQkJLyogU2tpcCB0aGUgbmV4dCBzbG90LCBpdCBjYW5u b3QgYmUgYSBnYXAuICovDQorCQkJCWlmIChvZmZzZXQgPCAyKQ0KKwkJCQkJZ290byBhc2NlbmQ7 DQorDQorCQkJCW9mZnNldCAtPSAyOw0KKwkJCQltYXggPSBwaXZvdHNbb2Zmc2V0XTsNCisJCQkJ bWluID0gbWFzX3NhZmVfbWluKG1hcywgcGl2b3RzLCBvZmZzZXQpOw0KKwkJCQljb250aW51ZTsN CisJCQl9DQorCQl9DQorDQorCQlpZiAoIW9mZnNldCkNCisJCQlnb3RvIGFzY2VuZDsNCisNCisJ CW9mZnNldC0tOw0KKwkJbWF4ID0gbWluIC0gMTsNCisJCW1pbiA9IG1hc19zYWZlX21pbihtYXMs IHBpdm90cywgb2Zmc2V0KTsNCisJfQ0KKw0KKwlpZiAodW5saWtlbHkoaW5kZXggPiBtYXgpKSB7 DQorCQltYXNfc2V0X2VycihtYXMsIC1FQlVTWSk7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisN CisJaWYgKHVubGlrZWx5KG1hX2lzX2xlYWYodHlwZSkpKSB7DQorCQltYXMtPm9mZnNldCA9IG9m ZnNldDsNCisJCW1hcy0+bWluID0gbWluOw0KKwkJbWFzLT5tYXggPSBtaW4gKyBnYXAgLSAxOw0K KwkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJLyogZGVzY2VuZCwgb25seSBoYXBwZW5zIHVuZGVy IGxvY2suICovDQorCW1hcy0+bm9kZSA9IG1hc19zbG90KG1hcywgc2xvdHMsIG9mZnNldCk7DQor CW1hcy0+bWluID0gbWluOw0KKwltYXMtPm1heCA9IG1heDsNCisJbWFzLT5vZmZzZXQgPSBtYXNf ZGF0YV9lbmQobWFzKTsNCisJcmV0dXJuIGZhbHNlOw0KKw0KK2FzY2VuZDoNCisJaWYgKG10ZV9p c19yb290KG1hcy0+bm9kZSkpDQorCQltYXNfc2V0X2VycihtYXMsIC1FQlVTWSk7DQorDQorCXJl dHVybiBmYWxzZTsNCit9DQorDQorc3RhdGljIGlubGluZSBib29sIG1hc19hbm9kZV9kZXNjZW5k KHN0cnVjdCBtYV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIHNpemUpDQorew0KKwllbnVtIG1h cGxlX3R5cGUgdHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJdW5zaWduZWQgbG9u ZyBwaXZvdCwgbWluLCBnYXAgPSAwOw0KKwl1bnNpZ25lZCBjaGFyIGNvdW50LCBvZmZzZXQ7DQor CXVuc2lnbmVkIGxvbmcgKmdhcHMgPSBOVUxMLCAqcGl2b3RzID0gbWFfcGl2b3RzKG1hc19tbiht YXMpLCB0eXBlKTsNCisJdm9pZCBfX3JjdSAqKnNsb3RzID0gbWFfc2xvdHMobWFzX21uKG1hcyks IHR5cGUpOw0KKwlib29sIGZvdW5kID0gZmFsc2U7DQorDQorCWlmIChtYV9pc19kZW5zZSh0eXBl KSkgew0KKwkJbWFzLT5vZmZzZXQgPSAodW5zaWduZWQgY2hhcikobWFzLT5pbmRleCAtIG1hcy0+ bWluKTsNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCWdhcHMgPSBtYV9nYXBzKG10ZV90b19u b2RlKG1hcy0+bm9kZSksIHR5cGUpOw0KKwlvZmZzZXQgPSBtYXMtPm9mZnNldDsNCisJY291bnQg PSBtdF9zbG90c1t0eXBlXTsNCisJbWluID0gbWFzX3NhZmVfbWluKG1hcywgcGl2b3RzLCBvZmZz ZXQpOw0KKwlmb3IgKDsgb2Zmc2V0IDwgY291bnQ7IG9mZnNldCsrKSB7DQorCQlwaXZvdCA9IG1h c19zYWZlX3Bpdm90KG1hcywgcGl2b3RzLCBvZmZzZXQsIHR5cGUpOw0KKwkJaWYgKG9mZnNldCAm JiAhcGl2b3QpDQorCQkJYnJlYWs7DQorDQorCQkvKiBOb3Qgd2l0aGluIGxvd2VyIGJvdW5kcyAq Lw0KKwkJaWYgKG1hcy0+aW5kZXggPiBwaXZvdCkNCisJCQlnb3RvIG5leHRfc2xvdDsNCisNCisJ CWlmIChnYXBzKQ0KKwkJCWdhcCA9IGdhcHNbb2Zmc2V0XTsNCisJCWVsc2UgaWYgKCFtYXNfc2xv dChtYXMsIHNsb3RzLCBvZmZzZXQpKQ0KKwkJCWdhcCA9IG1pbihwaXZvdCwgbWFzLT5sYXN0KSAt IG1heChtYXMtPmluZGV4LCBtaW4pICsgMTsNCisJCWVsc2UNCisJCQlnb3RvIG5leHRfc2xvdDsN CisNCisJCWlmIChnYXAgPj0gc2l6ZSkgew0KKwkJCWlmIChtYV9pc19sZWFmKHR5cGUpKSB7DQor CQkJCWZvdW5kID0gdHJ1ZTsNCisJCQkJZ290byBkb25lOw0KKwkJCX0NCisJCQlpZiAobWFzLT5p bmRleCA8PSBwaXZvdCkgew0KKwkJCQltYXMtPm5vZGUgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBv ZmZzZXQpOw0KKwkJCQltYXMtPm1pbiA9IG1pbjsNCisJCQkJbWFzLT5tYXggPSBwaXZvdDsNCisJ CQkJb2Zmc2V0ID0gMDsNCisJCQkJdHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJ CQkJY291bnQgPSBtdF9zbG90c1t0eXBlXTsNCisJCQkJYnJlYWs7DQorCQkJfQ0KKwkJfQ0KK25l eHRfc2xvdDoNCisJCW1pbiA9IHBpdm90ICsgMTsNCisJCWlmIChtYXMtPmxhc3QgPCBtaW4pIHsN CisJCQltYXNfc2V0X2VycihtYXMsIC1FQlVTWSk7DQorCQkJcmV0dXJuIHRydWU7DQorCQl9DQor CX0NCisNCisJaWYgKG10ZV9pc19yb290KG1hcy0+bm9kZSkpDQorCQlmb3VuZCA9IHRydWU7DQor ZG9uZToNCisJbWFzLT5vZmZzZXQgPSBvZmZzZXQ7DQorCXJldHVybiBmb3VuZDsNCit9DQorDQor LyoqDQorICogbWFzX3dhbGsoKSAtIFNlYXJjaCBmb3IgQG1hcy0+aW5kZXggaW4gdGhlIHRyZWUu DQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlLg0KKyAqDQorICogbWFzLT5pbmRleCBhbmQgbWFz LT5sYXN0IHdpbGwgYmUgc2V0IHRvIHRoZSByYW5nZSBpZiB0aGVyZSBpcyBhIHZhbHVlLiAgSWYN CisgKiBtYXMtPm5vZGUgaXMgTUFTX05PTkUsIHJlc2V0IHRvIE1BU19TVEFSVC4NCisgKg0KKyAq IFJldHVybjogdGhlIGVudHJ5IGF0IHRoZSBsb2NhdGlvbiBvciAlTlVMTC4NCisgKi8NCit2b2lk ICptYXNfd2FsayhzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXZvaWQgKmVudHJ5Ow0KKw0K K3JldHJ5Og0KKwllbnRyeSA9IG1hc19zdGF0ZV93YWxrKG1hcyk7DQorCWlmIChtYXNfaXNfc3Rh cnQobWFzKSkNCisJCWdvdG8gcmV0cnk7DQorDQorCWlmIChtYXNfaXNfcHRyKG1hcykpIHsNCisJ CWlmICghbWFzLT5pbmRleCkgew0KKwkJCW1hcy0+bGFzdCA9IDA7DQorCQl9IGVsc2Ugew0KKwkJ CW1hcy0+aW5kZXggPSAxOw0KKwkJCW1hcy0+bGFzdCA9IFVMT05HX01BWDsNCisJCX0NCisJCXJl dHVybiBlbnRyeTsNCisJfQ0KKw0KKwlpZiAobWFzX2lzX25vbmUobWFzKSkgew0KKwkJbWFzLT5p bmRleCA9IDA7DQorCQltYXMtPmxhc3QgPSBVTE9OR19NQVg7DQorCX0NCisNCisJcmV0dXJuIGVu dHJ5Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIGJvb2wgbWFzX3Jld2luZF9ub2RlKHN0cnVjdCBt YV9zdGF0ZSAqbWFzKQ0KK3sNCisJdW5zaWduZWQgY2hhciBzbG90Ow0KKw0KKwlkbyB7DQorCQlp ZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkgew0KKwkJCXNsb3QgPSBtYXMtPm9mZnNldDsNCisJ CQlpZiAoIXNsb3QpDQorCQkJCXJldHVybiBmYWxzZTsNCisJCX0gZWxzZSB7DQorCQkJbWFzX2Fz Y2VuZChtYXMpOw0KKwkJCXNsb3QgPSBtYXMtPm9mZnNldDsNCisJCX0NCisJfSB3aGlsZSAoIXNs b3QpOw0KKw0KKwltYXMtPm9mZnNldCA9IC0tc2xvdDsNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0K Ky8qDQorICogbWFzX3NraXBfbm9kZSgpIC0gSW50ZXJuYWwgZnVuY3Rpb24uICBTa2lwIG92ZXIg YSBub2RlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZS4NCisgKg0KKyAqIFJldHVybjogdHJ1 ZSBpZiB0aGVyZSBpcyBhbm90aGVyIG5vZGUsIGZhbHNlIG90aGVyd2lzZS4NCisgKi8NCitzdGF0 aWMgaW5saW5lIGJvb2wgbWFzX3NraXBfbm9kZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQor CXVuc2lnbmVkIGNoYXIgc2xvdCwgc2xvdF9jb3VudDsNCisJdW5zaWduZWQgbG9uZyAqcGl2b3Rz Ow0KKwllbnVtIG1hcGxlX3R5cGUgbXQ7DQorDQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5v ZGUpOw0KKwlzbG90X2NvdW50ID0gbXRfc2xvdHNbbXRdIC0gMTsNCisJZG8gew0KKwkJaWYgKG10 ZV9pc19yb290KG1hcy0+bm9kZSkpIHsNCisJCQlzbG90ID0gbWFzLT5vZmZzZXQ7DQorCQkJaWYg KHNsb3QgPiBzbG90X2NvdW50KSB7DQorCQkJCW1hc19zZXRfZXJyKG1hcywgLUVCVVNZKTsNCisJ CQkJcmV0dXJuIGZhbHNlOw0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJbWFzX2FzY2VuZChtYXMp Ow0KKwkJCXNsb3QgPSBtYXMtPm9mZnNldDsNCisJCQltdCA9IG10ZV9ub2RlX3R5cGUobWFzLT5u b2RlKTsNCisJCQlzbG90X2NvdW50ID0gbXRfc2xvdHNbbXRdIC0gMTsNCisJCX0NCisJfSB3aGls ZSAoc2xvdCA+IHNsb3RfY291bnQpOw0KKw0KKwltYXMtPm9mZnNldCA9ICsrc2xvdDsNCisJcGl2 b3RzID0gbWFfcGl2b3RzKG1hc19tbihtYXMpLCBtdCk7DQorCWlmIChzbG90ID4gMCkNCisJCW1h cy0+bWluID0gcGl2b3RzW3Nsb3QgLSAxXSArIDE7DQorDQorCWlmIChzbG90IDw9IHNsb3RfY291 bnQpDQorCQltYXMtPm1heCA9IHBpdm90c1tzbG90XTsNCisNCisJcmV0dXJuIHRydWU7DQorfQ0K Kw0KKy8qDQorICogbWFzX2F3YWxrKCkgLSBBbGxvY2F0aW9uIHdhbGsuICBTZWFyY2ggZnJvbSBs b3cgYWRkcmVzcyB0byBoaWdoLCBmb3IgYSBnYXAgb2YNCisgKiBAc2l6ZQ0KKyAqIEBtYXM6IFRo ZSBtYXBsZSBzdGF0ZQ0KKyAqIEBzaXplOiBUaGUgc2l6ZSBvZiB0aGUgZ2FwIHJlcXVpcmVkDQor ICoNCisgKiBTZWFyY2ggYmV0d2VlbiBAbWFzLT5pbmRleCBhbmQgQG1hcy0+bGFzdCBmb3IgYSBn YXAgb2YgQHNpemUuDQorICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19hd2FsayhzdHJ1Y3Qg bWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBzaXplKQ0KK3sNCisJc3RydWN0IG1hcGxlX2Vu b2RlICpsYXN0ID0gTlVMTDsNCisNCisJLyoNCisJICogVGhlcmUgYXJlIDQgb3B0aW9uczoNCisJ ICogZ28gdG8gY2hpbGQgKGRlc2NlbmQpDQorCSAqIGdvIGJhY2sgdG8gcGFyZW50IChhc2NlbmQp DQorCSAqIG5vIGdhcCBmb3VuZC4gKHJldHVybiwgc2xvdCA9PSBNQVBMRV9OT0RFX1NMT1RTKQ0K KwkgKiBmb3VuZCB0aGUgZ2FwLiAocmV0dXJuLCBzbG90ICE9IE1BUExFX05PREVfU0xPVFMpDQor CSAqLw0KKwl3aGlsZSAoIW1hc19pc19lcnIobWFzKSAmJiAhbWFzX2Fub2RlX2Rlc2NlbmQobWFz LCBzaXplKSkgew0KKwkJaWYgKGxhc3QgPT0gbWFzLT5ub2RlKQ0KKwkJCW1hc19za2lwX25vZGUo bWFzKTsNCisJCWVsc2UNCisJCQlsYXN0ID0gbWFzLT5ub2RlOw0KKwl9DQorfQ0KKw0KKy8qDQor ICogbWFzX2ZpbGxfZ2FwKCkgLSBGaWxsIGEgbG9jYXRlZCBnYXAgd2l0aCBAZW50cnkuDQorICog QG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQGVudHJ5OiBUaGUgdmFsdWUgdG8gc3RvcmUNCisg KiBAc2xvdDogVGhlIG9mZnNldCBpbnRvIHRoZSBub2RlIHRvIHN0b3JlIHRoZSBAZW50cnkNCisg KiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIGVudHJ5DQorICogQGluZGV4OiBUaGUgc3RhcnQgbG9j YXRpb24NCisgKi8NCitzdGF0aWMgaW5saW5lIHZvaWQgbWFzX2ZpbGxfZ2FwKHN0cnVjdCBtYV9z dGF0ZSAqbWFzLCB2b2lkICplbnRyeSwNCisJCXVuc2lnbmVkIGNoYXIgc2xvdCwgdW5zaWduZWQg bG9uZyBzaXplLCB1bnNpZ25lZCBsb25nICppbmRleCkNCit7DQorCU1BX1dSX1NUQVRFKHdyX21h cywgbWFzLCBlbnRyeSk7DQorCXVuc2lnbmVkIGNoYXIgcHNsb3QgPSBtdGVfcGFyZW50X3Nsb3Qo bWFzLT5ub2RlKTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICptbiA9IG1hcy0+bm9kZTsNCisJdW5z aWduZWQgbG9uZyAqcGl2b3RzOw0KKwllbnVtIG1hcGxlX3R5cGUgcHR5cGU7DQorCS8qDQorCSAq IG1hcy0+aW5kZXggaXMgdGhlIHN0YXJ0IGFkZHJlc3MgZm9yIHRoZSBzZWFyY2gNCisJICogIHdo aWNoIG1heSBubyBsb25nZXIgYmUgbmVlZGVkLg0KKwkgKiBtYXMtPmxhc3QgaXMgdGhlIGVuZCBh ZGRyZXNzIGZvciB0aGUgc2VhcmNoDQorCSAqLw0KKw0KKwkqaW5kZXggPSBtYXMtPmluZGV4Ow0K KwltYXMtPmxhc3QgPSBtYXMtPmluZGV4ICsgc2l6ZSAtIDE7DQorDQorCS8qDQorCSAqIEl0IGlz IHBvc3NpYmxlIHRoYXQgdXNpbmcgbWFzLT5tYXggYW5kIG1hcy0+bWluIHRvIGNvcnJlY3RseQ0K KwkgKiBjYWxjdWxhdGUgdGhlIGluZGV4IGFuZCBsYXN0IHdpbGwgY2F1c2UgYW4gaXNzdWUgaW4g dGhlIGdhcA0KKwkgKiBjYWxjdWxhdGlvbiwgc28gZml4IHRoZSBtYV9zdGF0ZSBoZXJlDQorCSAq Lw0KKwltYXNfYXNjZW5kKG1hcyk7DQorCXB0eXBlID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUp Ow0KKwlwaXZvdHMgPSBtYV9waXZvdHMobWFzX21uKG1hcyksIHB0eXBlKTsNCisJbWFzLT5tYXgg PSBtYXNfc2FmZV9waXZvdChtYXMsIHBpdm90cywgcHNsb3QsIHB0eXBlKTsNCisJbWFzLT5taW4g PSBtYXNfc2FmZV9taW4obWFzLCBwaXZvdHMsIHBzbG90KTsNCisJbWFzLT5ub2RlID0gbW47DQor CW1hcy0+b2Zmc2V0ID0gc2xvdDsNCisJbWFzX3dyX3N0b3JlX2VudHJ5KCZ3cl9tYXMpOw0KK30N CisNCisvKg0KKyAqIG1hc19zcGFyc2VfYXJlYSgpIC0gSW50ZXJuYWwgZnVuY3Rpb24uICBSZXR1 cm4gdXBwZXIgb3IgbG93ZXIgbGltaXQgd2hlbg0KKyAqIHNlYXJjaGluZyBmb3IgYSBnYXAgaW4g YW4gZW1wdHkgdHJlZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBAbWluOiB0aGUg bWluaW11bSByYW5nZQ0KKyAqIEBtYXg6IFRoZSBtYXhpbXVtIHJhbmdlDQorICogQHNpemU6IFRo ZSBzaXplIG9mIHRoZSBnYXANCisgKiBAZndkOiBTZWFyY2hpbmcgZm9yd2FyZCBvciBiYWNrDQor ICovDQorc3RhdGljIGlubGluZSB2b2lkIG1hc19zcGFyc2VfYXJlYShzdHJ1Y3QgbWFfc3RhdGUg Km1hcywgdW5zaWduZWQgbG9uZyBtaW4sDQorCQkJCXVuc2lnbmVkIGxvbmcgbWF4LCB1bnNpZ25l ZCBsb25nIHNpemUsIGJvb2wgZndkKQ0KK3sNCisJdW5zaWduZWQgbG9uZyBzdGFydCA9IDA7DQor DQorCWlmICghdW5saWtlbHkobWFzX2lzX25vbmUobWFzKSkpDQorCQlzdGFydCsrOw0KKwkvKiBt YXNfaXNfcHRyICovDQorDQorCWlmIChzdGFydCA8IG1pbikNCisJCXN0YXJ0ID0gbWluOw0KKw0K KwlpZiAoZndkKSB7DQorCQltYXMtPmluZGV4ID0gc3RhcnQ7DQorCQltYXMtPmxhc3QgPSBzdGFy dCArIHNpemUgLSAxOw0KKwkJcmV0dXJuOw0KKwl9DQorDQorCW1hcy0+aW5kZXggPSBtYXg7DQor fQ0KKw0KKy8qDQorICogbWFzX2VtcHR5X2FyZWEoKSAtIEdldCB0aGUgbG93ZXN0IGFkZHJlc3Mg d2l0aGluIHRoZSByYW5nZSB0aGF0IGlzDQorICogc3VmZmljaWVudCBmb3IgdGhlIHNpemUgcmVx dWVzdGVkLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtaW46IFRoZSBsb3dlc3Qg dmFsdWUgb2YgdGhlIHJhbmdlDQorICogQG1heDogVGhlIGhpZ2hlc3QgdmFsdWUgb2YgdGhlIHJh bmdlDQorICogQHNpemU6IFRoZSBzaXplIG5lZWRlZA0KKyAqLw0KK2ludCBtYXNfZW1wdHlfYXJl YShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtaW4sDQorCQl1bnNpZ25lZCBs b25nIG1heCwgdW5zaWduZWQgbG9uZyBzaXplKQ0KK3sNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7 DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90czsNCisJZW51bSBtYXBsZV90eXBlIG10Ow0KKw0KKwlp ZiAobWFzX2lzX3N0YXJ0KG1hcykpIHsNCisJCW1hc19zdGFydChtYXMpOw0KKwl9IGVsc2UgaWYg KG1hcy0+b2Zmc2V0ID49IDIpIHsNCisJCW1hcy0+b2Zmc2V0IC09IDI7DQorCX0gZWxzZSBpZiAo IW1hc19za2lwX25vZGUobWFzKSkgew0KKwkJcmV0dXJuIC1FQlVTWTsNCisJfQ0KKw0KKwkvKiBF bXB0eSBzZXQgKi8NCisJaWYgKG1hc19pc19ub25lKG1hcykgfHwgbWFzX2lzX3B0cihtYXMpKSB7 DQorCQltYXNfc3BhcnNlX2FyZWEobWFzLCBtaW4sIG1heCwgc2l6ZSwgdHJ1ZSk7DQorCQlyZXR1 cm4gMDsNCisJfQ0KKw0KKwkvKiBUaGUgc3RhcnQgb2YgdGhlIHdpbmRvdyBjYW4gb25seSBiZSB3 aXRoaW4gdGhlc2UgdmFsdWVzICovDQorCW1hcy0+aW5kZXggPSBtaW47DQorCW1hcy0+bGFzdCA9 IG1heDsNCisJbWFzX2F3YWxrKG1hcywgc2l6ZSk7DQorDQorCWlmICh1bmxpa2VseShtYXNfaXNf ZXJyKG1hcykpKQ0KKwkJcmV0dXJuIHhhX2VycihtYXMtPm5vZGUpOw0KKw0KKwlvZmZzZXQgPSBt YXMtPm9mZnNldDsNCisJaWYgKHVubGlrZWx5KG9mZnNldCA9PSBNQVBMRV9OT0RFX1NMT1RTKSkN CisJCXJldHVybiAtRUJVU1k7DQorDQorCW10ID0gbXRlX25vZGVfdHlwZShtYXMtPm5vZGUpOw0K KwlwaXZvdHMgPSBtYV9waXZvdHMobWFzX21uKG1hcyksIG10KTsNCisJaWYgKG9mZnNldCkNCisJ CW1hcy0+bWluID0gcGl2b3RzW29mZnNldCAtIDFdICsgMTsNCisNCisJaWYgKG9mZnNldCA8IG10 X3Bpdm90c1ttdF0pDQorCQltYXMtPm1heCA9IHBpdm90c1tvZmZzZXRdOw0KKw0KKwlpZiAobWFz LT5pbmRleCA8IG1hcy0+bWluKQ0KKwkJbWFzLT5pbmRleCA9IG1hcy0+bWluOw0KKw0KKwltYXMt Pmxhc3QgPSBtYXMtPmluZGV4ICsgc2l6ZSAtIDE7DQorCXJldHVybiAwOw0KK30NCisNCisvKg0K KyAqIG1hc19lbXB0eV9hcmVhX3JldigpIC0gR2V0IHRoZSBoaWdoZXN0IGFkZHJlc3Mgd2l0aGlu IHRoZSByYW5nZSB0aGF0IGlzDQorICogc3VmZmljaWVudCBmb3IgdGhlIHNpemUgcmVxdWVzdGVk Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtaW46IFRoZSBsb3dlc3QgdmFsdWUg b2YgdGhlIHJhbmdlDQorICogQG1heDogVGhlIGhpZ2hlc3QgdmFsdWUgb2YgdGhlIHJhbmdlDQor ICogQHNpemU6IFRoZSBzaXplIG5lZWRlZA0KKyAqLw0KK2ludCBtYXNfZW1wdHlfYXJlYV9yZXYo c3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJdW5zaWduZWQgbG9u ZyBtYXgsIHVuc2lnbmVkIGxvbmcgc2l6ZSkNCit7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbGFz dCA9IG1hcy0+bm9kZTsNCisNCisJaWYgKG1hc19pc19zdGFydChtYXMpKSB7DQorCQltYXNfc3Rh cnQobWFzKTsNCisJCW1hcy0+b2Zmc2V0ID0gbWFzX2RhdGFfZW5kKG1hcyk7DQorCX0gZWxzZSBp ZiAobWFzLT5vZmZzZXQgPj0gMikgew0KKwkJbWFzLT5vZmZzZXQgLT0gMjsNCisJfSBlbHNlIGlm ICghbWFzX3Jld2luZF9ub2RlKG1hcykpIHsNCisJCXJldHVybiAtRUJVU1k7DQorCX0NCisNCisJ LyogRW1wdHkgc2V0LiAqLw0KKwlpZiAobWFzX2lzX25vbmUobWFzKSB8fCBtYXNfaXNfcHRyKG1h cykpIHsNCisJCW1hc19zcGFyc2VfYXJlYShtYXMsIG1pbiwgbWF4LCBzaXplLCBmYWxzZSk7DQor CQlyZXR1cm4gMDsNCisJfQ0KKw0KKwkvKiBUaGUgc3RhcnQgb2YgdGhlIHdpbmRvdyBjYW4gb25s eSBiZSB3aXRoaW4gdGhlc2UgdmFsdWVzLiAqLw0KKwltYXMtPmluZGV4ID0gbWluOw0KKwltYXMt Pmxhc3QgPSBtYXg7DQorDQorCXdoaWxlICghbWFzX3Jldl9hd2FsayhtYXMsIHNpemUpKSB7DQor CQlpZiAobGFzdCA9PSBtYXMtPm5vZGUpIHsNCisJCQlpZiAoIW1hc19yZXdpbmRfbm9kZShtYXMp KQ0KKwkJCQlyZXR1cm4gLUVCVVNZOw0KKwkJfSBlbHNlIHsNCisJCQlsYXN0ID0gbWFzLT5ub2Rl Ow0KKwkJfQ0KKwl9DQorDQorCWlmICh1bmxpa2VseShtYXMtPm9mZnNldCA9PSBNQVBMRV9OT0RF X1NMT1RTKSkNCisJCXJldHVybiAtRUJVU1k7DQorDQorCS8qDQorCSAqIG1hc19yZXZfYXdhbGso KSBoYXMgc2V0IG1hcy0+bWluIGFuZCBtYXMtPm1heCB0byB0aGUgZ2FwIHZhbHVlcy4gIElmDQor CSAqIHRoZSBtYXhpbXVtIGlzIG91dHNpZGUgdGhlIHdpbmRvdyB3ZSBhcmUgc2VhcmNoaW5nLCB0 aGVuIHVzZSB0aGUgbGFzdA0KKwkgKiBsb2NhdGlvbiBpbiB0aGUgc2VhcmNoLg0KKwkgKiBtYXMt Pm1heCBhbmQgbWFzLT5taW4gaXMgdGhlIHJhbmdlIG9mIHRoZSBnYXAuDQorCSAqIG1hcy0+aW5k ZXggYW5kIG1hcy0+bGFzdCBhcmUgY3VycmVudGx5IHNldCB0byB0aGUgc2VhcmNoIHJhbmdlLg0K KwkgKi8NCisNCisJLyogVHJpbSB0aGUgdXBwZXIgbGltaXQgdG8gdGhlIG1heC4gKi8NCisJaWYg KG1hcy0+bWF4IDw9IG1hcy0+bGFzdCkNCisJCW1hcy0+bGFzdCA9IG1hcy0+bWF4Ow0KKw0KKwlt YXMtPmluZGV4ID0gbWFzLT5sYXN0IC0gc2l6ZSArIDE7DQorCXJldHVybiAwOw0KK30NCisNCitz dGF0aWMgaW5saW5lIGludCBtYXNfYWxsb2Moc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVu dHJ5LA0KKwkJdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nICppbmRleCkNCit7DQor CXVuc2lnbmVkIGxvbmcgbWluOw0KKw0KKwltYXNfc3RhcnQobWFzKTsNCisJaWYgKG1hc19pc19u b25lKG1hcykgfHwgbWFzX2lzX3B0cihtYXMpKSB7DQorCQltYXNfcm9vdF9leHBhbmQobWFzLCBl bnRyeSk7DQorCQlpZiAobWFzX2lzX2VycihtYXMpKQ0KKwkJCXJldHVybiB4YV9lcnIobWFzLT5u b2RlKTsNCisNCisJCWlmICghbWFzLT5pbmRleCkNCisJCQlyZXR1cm4gbXRlX3Bpdm90KG1hcy0+ bm9kZSwgMCk7DQorCQlyZXR1cm4gbXRlX3Bpdm90KG1hcy0+bm9kZSwgMSk7DQorCX0NCisNCisJ LyogTXVzdCBiZSB3YWxraW5nIGEgdHJlZS4gKi8NCisJbWFzX2F3YWxrKG1hcywgc2l6ZSk7DQor CWlmIChtYXNfaXNfZXJyKG1hcykpDQorCQlyZXR1cm4geGFfZXJyKG1hcy0+bm9kZSk7DQorDQor CWlmIChtYXMtPm9mZnNldCA9PSBNQVBMRV9OT0RFX1NMT1RTKQ0KKwkJZ290byBub19nYXA7DQor DQorCS8qDQorCSAqIEF0IHRoaXMgcG9pbnQsIG1hcy0+bm9kZSBwb2ludHMgdG8gdGhlIHJpZ2h0 IG5vZGUgYW5kIHdlIGhhdmUgYW4NCisJICogb2Zmc2V0IHRoYXQgaGFzIGEgc3VmZmljaWVudCBn YXAuDQorCSAqLw0KKwltaW4gPSBtYXMtPm1pbjsNCisJaWYgKG1hcy0+b2Zmc2V0KQ0KKwkJbWlu ID0gbXRlX3Bpdm90KG1hcy0+bm9kZSwgbWFzLT5vZmZzZXQgLSAxKSArIDE7DQorDQorCWlmICht YXMtPmluZGV4IDwgbWluKQ0KKwkJbWFzLT5pbmRleCA9IG1pbjsNCisNCisJbWFzX2ZpbGxfZ2Fw KG1hcywgZW50cnksIG1hcy0+b2Zmc2V0LCBzaXplLCBpbmRleCk7DQorCXJldHVybiAwOw0KKw0K K25vX2dhcDoNCisJcmV0dXJuIC1FQlVTWTsNCit9DQorDQorc3RhdGljIGlubGluZSBpbnQgbWFz X3Jldl9hbGxvYyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtaW4sDQorCQkJ CXVuc2lnbmVkIGxvbmcgbWF4LCB2b2lkICplbnRyeSwNCisJCQkJdW5zaWduZWQgbG9uZyBzaXpl LCB1bnNpZ25lZCBsb25nICppbmRleCkNCit7DQorCWludCByZXQgPSAwOw0KKw0KKwlyZXQgPSBt YXNfZW1wdHlfYXJlYV9yZXYobWFzLCBtaW4sIG1heCwgc2l6ZSk7DQorCWlmIChyZXQpDQorCQly ZXR1cm4gcmV0Ow0KKw0KKwlpZiAobWFzX2lzX2VycihtYXMpKQ0KKwkJcmV0dXJuIHhhX2Vyciht YXMtPm5vZGUpOw0KKw0KKwlpZiAobWFzLT5vZmZzZXQgPT0gTUFQTEVfTk9ERV9TTE9UUykNCisJ CWdvdG8gbm9fZ2FwOw0KKw0KKwltYXNfZmlsbF9nYXAobWFzLCBlbnRyeSwgbWFzLT5vZmZzZXQs IHNpemUsIGluZGV4KTsNCisJcmV0dXJuIDA7DQorDQorbm9fZ2FwOg0KKwlyZXR1cm4gLUVCVVNZ Ow0KK30NCisNCisvKg0KKyAqIG1hc19kZWFkX2xlYXZlcygpIC0gTWFyayBhbGwgbGVhdmVzIG9m IGEgbm9kZSBhcyBkZWFkLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBzbG90czog UG9pbnRlciB0byB0aGUgc2xvdCBhcnJheQ0KKyAqDQorICogTXVzdCBob2xkIHRoZSB3cml0ZSBs b2NrLg0KKyAqDQorICogUmV0dXJuOiBUaGUgbnVtYmVyIG9mIGxlYXZlcyBtYXJrZWQgYXMgZGVh ZC4NCisgKi8NCitzdGF0aWMgaW5saW5lDQordW5zaWduZWQgY2hhciBtYXNfZGVhZF9sZWF2ZXMo c3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgX19yY3UgKipzbG90cykNCit7DQorCXN0cnVjdCBt YXBsZV9ub2RlICpub2RlOw0KKwllbnVtIG1hcGxlX3R5cGUgdHlwZTsNCisJdm9pZCAqZW50cnk7 DQorCWludCBvZmZzZXQ7DQorDQorCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbXRfc2xvdF9j b3VudChtYXMtPm5vZGUpOyBvZmZzZXQrKykgew0KKwkJZW50cnkgPSBtYXNfc2xvdF9sb2NrZWQo bWFzLCBzbG90cywgb2Zmc2V0KTsNCisJCXR5cGUgPSBtdGVfbm9kZV90eXBlKGVudHJ5KTsNCisJ CW5vZGUgPSBtdGVfdG9fbm9kZShlbnRyeSk7DQorCQkvKiBVc2UgYm90aCBub2RlIGFuZCB0eXBl IHRvIGNhdGNoIExFICYgQkUgbWV0YWRhdGEgKi8NCisJCWlmICghbm9kZSB8fCAhdHlwZSkNCisJ CQlicmVhazsNCisNCisJCW10ZV9zZXRfbm9kZV9kZWFkKGVudHJ5KTsNCisJCXNtcF93bWIoKTsN CisJCW5vZGUtPnR5cGUgPSB0eXBlOw0KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHNsb3RzW29mZnNl dF0sIG5vZGUpOw0KKwl9DQorDQorCXJldHVybiBvZmZzZXQ7DQorfQ0KKw0KK3N0YXRpYyB2b2lk IF9fcmN1ICoqbWFzX2RlYWRfd2FsayhzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgY2hh ciBvZmZzZXQpDQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwgKm5leHQ7DQorCXZvaWQg X19yY3UgKipzbG90cyA9IE5VTEw7DQorDQorCW5leHQgPSBtYXNfbW4obWFzKTsNCisJZG8gew0K KwkJbWFzLT5ub2RlID0gbWFfZW5vZGVfcHRyKG5leHQpOw0KKwkJbm9kZSA9IG1hc19tbihtYXMp Ow0KKwkJc2xvdHMgPSBtYV9zbG90cyhub2RlLCBub2RlLT50eXBlKTsNCisJCW5leHQgPSBtYXNf c2xvdF9sb2NrZWQobWFzLCBzbG90cywgb2Zmc2V0KTsNCisJCW9mZnNldCA9IDA7DQorCX0gd2hp bGUgKCFtYV9pc19sZWFmKG5leHQtPnR5cGUpKTsNCisNCisJcmV0dXJuIHNsb3RzOw0KK30NCisN CitzdGF0aWMgdm9pZCBtdF9mcmVlX3dhbGsoc3RydWN0IHJjdV9oZWFkICpoZWFkKQ0KK3sNCisJ dm9pZCBfX3JjdSAqKnNsb3RzOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSwgKnN0YXJ0Ow0K KwlzdHJ1Y3QgbWFwbGVfdHJlZSBtdDsNCisJdW5zaWduZWQgY2hhciBvZmZzZXQ7DQorCWVudW0g bWFwbGVfdHlwZSB0eXBlOw0KKwlNQV9TVEFURShtYXMsICZtdCwgMCwgMCk7DQorDQorCW5vZGUg PSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IG1hcGxlX25vZGUsIHJjdSk7DQorDQorCWlmICht YV9pc19sZWFmKG5vZGUtPnR5cGUpKQ0KKwkJZ290byBmcmVlX2xlYWY7DQorDQorCW10X2luaXRf ZmxhZ3MoJm10LCBub2RlLT5tYV9mbGFncyk7DQorCW1hc19sb2NrKCZtYXMpOw0KKwlzdGFydCA9 IG5vZGU7DQorCW1hcy5ub2RlID0gbXRfbWtfbm9kZShub2RlLCBub2RlLT50eXBlKTsNCisJc2xv dHMgPSBtYXNfZGVhZF93YWxrKCZtYXMsIDApOw0KKwlub2RlID0gbWFzX21uKCZtYXMpOw0KKwlk byB7DQorCQltdF9mcmVlX2J1bGsobm9kZS0+c2xvdF9sZW4sIHNsb3RzKTsNCisJCW9mZnNldCA9 IG5vZGUtPnBhcmVudF9zbG90ICsgMTsNCisJCW1hcy5ub2RlID0gbm9kZS0+cGl2X3BhcmVudDsN CisJCWlmIChtYXNfbW4oJm1hcykgPT0gbm9kZSkNCisJCQlnb3RvIHN0YXJ0X3Nsb3RzX2ZyZWU7 DQorDQorCQl0eXBlID0gbXRlX25vZGVfdHlwZShtYXMubm9kZSk7DQorCQlzbG90cyA9IG1hX3Ns b3RzKG10ZV90b19ub2RlKG1hcy5ub2RlKSwgdHlwZSk7DQorCQlpZiAoKG9mZnNldCA8IG10X3Ns b3RzW3R5cGVdKSAmJiAoc2xvdHNbb2Zmc2V0XSkpDQorCQkJc2xvdHMgPSBtYXNfZGVhZF93YWxr KCZtYXMsIG9mZnNldCk7DQorDQorCQlub2RlID0gbWFzX21uKCZtYXMpOw0KKwl9IHdoaWxlICgo bm9kZSAhPSBzdGFydCkgfHwgKG5vZGUtPnNsb3RfbGVuIDwgb2Zmc2V0KSk7DQorDQorCXNsb3Rz ID0gbWFfc2xvdHMobm9kZSwgbm9kZS0+dHlwZSk7DQorCW10X2ZyZWVfYnVsayhub2RlLT5zbG90 X2xlbiwgc2xvdHMpOw0KKw0KK3N0YXJ0X3Nsb3RzX2ZyZWU6DQorZnJlZV9sZWFmOg0KKwltdF9m cmVlX3JjdSgmbm9kZS0+cmN1KTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIF9fcmN1ICoq bWFzX2Rlc3Ryb3lfZGVzY2VuZChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywNCisJCQlzdHJ1Y3QgbWFw bGVfZW5vZGUgKnByZXYsIHVuc2lnbmVkIGNoYXIgb2Zmc2V0KQ0KK3sNCisJc3RydWN0IG1hcGxl X25vZGUgKm5vZGU7DQorCXN0cnVjdCBtYXBsZV9lbm9kZSAqbmV4dCA9IG1hcy0+bm9kZTsNCisJ dm9pZCBfX3JjdSAqKnNsb3RzID0gTlVMTDsNCisNCisJZG8gew0KKwkJbWFzLT5ub2RlID0gbmV4 dDsNCisJCW5vZGUgPSBtYXNfbW4obWFzKTsNCisJCXNsb3RzID0gbWFfc2xvdHMobm9kZSwgbXRl X25vZGVfdHlwZShtYXMtPm5vZGUpKTsNCisJCW5leHQgPSBtYXNfc2xvdF9sb2NrZWQobWFzLCBz bG90cywgMCk7DQorCQltdGVfc2V0X25vZGVfZGVhZChtYXMtPm5vZGUpOw0KKwkJbm9kZS0+dHlw ZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJCW5vZGUtPnBpdl9wYXJlbnQgPSBwcmV2 Ow0KKwkJbm9kZS0+cGFyZW50X3Nsb3QgPSBvZmZzZXQ7DQorCQlvZmZzZXQgPSAwOw0KKwkJcHJl diA9IG1hcy0+bm9kZTsNCisJfSB3aGlsZSAoIW10ZV9pc19sZWFmKG5leHQpKTsNCisJcmV0dXJu IHNsb3RzOw0KK30NCisNCitzdGF0aWMgdm9pZCBtdF9kZXN0cm95X3dhbGsoc3RydWN0IG1hcGxl X2Vub2RlICplbm9kZSwgdW5zaWduZWQgY2hhciBtYV9mbGFncywNCisJCQkgICAgYm9vbCBmcmVl KQ0KK3sNCisJdm9pZCBfX3JjdSAqKnNsb3RzOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSA9 IG10ZV90b19ub2RlKGVub2RlKTsNCisJc3RydWN0IG1hcGxlX2Vub2RlICpzdGFydDsNCisJc3Ry dWN0IG1hcGxlX3RyZWUgbXQ7DQorDQorCU1BX1NUQVRFKG1hcywgJm10LCAwLCAwKTsNCisNCisJ aWYgKG10ZV9pc19sZWFmKGVub2RlKSkNCisJCWdvdG8gZnJlZV9sZWFmOw0KKw0KKwltdF9pbml0 X2ZsYWdzKCZtdCwgbWFfZmxhZ3MpOw0KKwltYXNfbG9jaygmbWFzKTsNCisNCisJbWFzLm5vZGUg PSBzdGFydCA9IGVub2RlOw0KKwlzbG90cyA9IG1hc19kZXN0cm95X2Rlc2NlbmQoJm1hcywgc3Rh cnQsIDApOw0KKwlub2RlID0gbWFzX21uKCZtYXMpOw0KKwlkbyB7DQorCQllbnVtIG1hcGxlX3R5 cGUgdHlwZTsNCisJCXVuc2lnbmVkIGNoYXIgb2Zmc2V0Ow0KKw0KKwkJbm9kZS0+c2xvdF9sZW4g PSBtYXNfZGVhZF9sZWF2ZXMoJm1hcywgc2xvdHMpOw0KKwkJaWYgKGZyZWUpDQorCQkJbXRfZnJl ZV9idWxrKG5vZGUtPnNsb3RfbGVuLCBzbG90cyk7DQorCQlvZmZzZXQgPSBub2RlLT5wYXJlbnRf c2xvdCArIDE7DQorCQltYXMubm9kZSA9IG5vZGUtPnBpdl9wYXJlbnQ7DQorCQlpZiAobWFzX21u KCZtYXMpID09IG5vZGUpDQorCQkJZ290byBzdGFydF9zbG90c19mcmVlOw0KKwkJdHlwZSA9IG10 ZV9ub2RlX3R5cGUobWFzLm5vZGUpOw0KKwkJc2xvdHMgPSBtYV9zbG90cyhtdGVfdG9fbm9kZSht YXMubm9kZSksIHR5cGUpOw0KKwkJaWYgKChvZmZzZXQgPCBtdF9zbG90c1t0eXBlXSkgJiYgKHNs b3RzW29mZnNldF0pKSB7DQorCQkJc3RydWN0IG1hcGxlX2Vub2RlICpwYXJlbnQgPSBtYXMubm9k ZTsNCisNCisJCQltYXMubm9kZSA9IG1hc19zbG90X2xvY2tlZCgmbWFzLCBzbG90cywgb2Zmc2V0 KTsNCisJCQlzbG90cyA9IG1hc19kZXN0cm95X2Rlc2NlbmQoJm1hcywgcGFyZW50LCBvZmZzZXQp Ow0KKwkJfQ0KKwkJbm9kZSA9IG1hc19tbigmbWFzKTsNCisJfSB3aGlsZSAoc3RhcnQgIT0gbWFz Lm5vZGUpOw0KKw0KKwlub2RlID0gbWFzX21uKCZtYXMpOw0KKwlub2RlLT5zbG90X2xlbiA9IG1h c19kZWFkX2xlYXZlcygmbWFzLCBzbG90cyk7DQorCWlmIChmcmVlKQ0KKwkJbXRfZnJlZV9idWxr KG5vZGUtPnNsb3RfbGVuLCBzbG90cyk7DQorDQorc3RhcnRfc2xvdHNfZnJlZToNCisJbWFzX3Vu bG9jaygmbWFzKTsNCisNCitmcmVlX2xlYWY6DQorCWlmIChmcmVlKQ0KKwkJbXRfZnJlZV9yY3Uo Jm5vZGUtPnJjdSk7DQorfQ0KKw0KKy8qDQorICogbXRlX2Rlc3Ryb3lfd2FsaygpIC0gRnJlZSBh IHRyZWUgb3Igc3ViLXRyZWUuDQorICogQGVub2RlIC0gdGhlIGVuY29kZWQgbWFwbGUgbm9kZSAo bWFwbGVfZW5vZGUpIHRvIHN0YXJ0DQorICogQG1uIC0gdGhlIHRyZWUgdG8gZnJlZSAtIG5lZWRl ZCBmb3Igbm9kZSB0eXBlcy4NCisgKg0KKyAqIE11c3QgaG9sZCB0aGUgd3JpdGUgbG9jay4NCisg Ki8NCitzdGF0aWMgaW5saW5lIHZvaWQgbXRlX2Rlc3Ryb3lfd2FsayhzdHJ1Y3QgbWFwbGVfZW5v ZGUgKmVub2RlLA0KKwkJCQkgICAgc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJc3RydWN0 IG1hcGxlX25vZGUgKm5vZGUgPSBtdGVfdG9fbm9kZShlbm9kZSk7DQorDQorCWlmIChtdF9pbl9y Y3UobXQpKSB7DQorCQltdF9kZXN0cm95X3dhbGsoZW5vZGUsIG10LT5tYV9mbGFncywgZmFsc2Up Ow0KKwkJY2FsbF9yY3UoJm5vZGUtPnJjdSwgbXRfZnJlZV93YWxrKTsNCisJfSBlbHNlIHsNCisJ CW10X2Rlc3Ryb3lfd2Fsayhlbm9kZSwgbXQtPm1hX2ZsYWdzLCB0cnVlKTsNCisJfQ0KK30NCisN CitzdGF0aWMgdm9pZCBtYXNfd3Jfc3RvcmVfc2V0dXAoc3RydWN0IG1hX3dyX3N0YXRlICp3cl9t YXMpDQorew0KKwlpZiAoIW1hc19pc19zdGFydCh3cl9tYXMtPm1hcykpIHsNCisJCWlmIChtYXNf aXNfbm9uZSh3cl9tYXMtPm1hcykpIHsNCisJCQltYXNfcmVzZXQod3JfbWFzLT5tYXMpOw0KKwkJ fSBlbHNlIHsNCisJCQl3cl9tYXMtPnJfbWF4ID0gd3JfbWFzLT5tYXMtPm1heDsNCisJCQl3cl9t YXMtPnR5cGUgPSBtdGVfbm9kZV90eXBlKHdyX21hcy0+bWFzLT5ub2RlKTsNCisJCQlpZiAobWFz X2lzX3NwYW5fd3Iod3JfbWFzKSkNCisJCQkJbWFzX3Jlc2V0KHdyX21hcy0+bWFzKTsNCisJCX0N CisJfQ0KKw0KK30NCisNCisvKiBJbnRlcmZhY2UgKi8NCisNCisvKioNCisgKiBtYXNfc3RvcmUo KSAtIFN0b3JlIGFuIEBlbnRyeS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUuDQorICogQGVu dHJ5OiBUaGUgZW50cnkgdG8gc3RvcmUuDQorICoNCisgKiBUaGUgQG1hcy0+aW5kZXggYW5kIEBt YXMtPmxhc3QgaXMgdXNlZCB0byBzZXQgdGhlIHJhbmdlIGZvciB0aGUgQGVudHJ5Lg0KKyAqIE5v dGU6IFRoZSBAbWFzIHNob3VsZCBoYXZlIHByZS1hbGxvY2F0ZWQgZW50cmllcyB0byBlbnN1cmUg dGhlcmUgaXMgbWVtb3J5IHRvDQorICogc3RvcmUgdGhlIGVudHJ5LiAgUGxlYXNlIHNlZSBtYXNf ZXhwZWN0ZWRfZW50cmllcygpL21hc19kZXN0cm95KCkgZm9yIG1vcmUgZGV0YWlscy4NCisgKg0K KyAqIFJldHVybjogdGhlIGZpcnN0IGVudHJ5IGJldHdlZW4gbWFzLT5pbmRleCBhbmQgbWFzLT5s YXN0IG9yICVOVUxMLg0KKyAqLw0KK3ZvaWQgKm1hc19zdG9yZShzdHJ1Y3QgbWFfc3RhdGUgKm1h cywgdm9pZCAqZW50cnkpDQorew0KKwlNQV9XUl9TVEFURSh3cl9tYXMsIG1hcywgZW50cnkpOw0K Kw0KKwl0cmFjZV9tYV93cml0ZShfX2Z1bmNfXywgbWFzLCAwLCBlbnRyeSk7DQorI2lmZGVmIENP TkZJR19ERUJVR19NQVBMRV9UUkVFDQorCWlmIChtYXMtPmluZGV4ID4gbWFzLT5sYXN0KQ0KKwkJ cHJpbnRrKCJFcnJvciAlbHUgPiAlbHUgJXBcbiIsIG1hcy0+aW5kZXgsIG1hcy0+bGFzdCwgZW50 cnkpOw0KKwlNVF9CVUdfT04obWFzLT50cmVlLCBtYXMtPmluZGV4ID4gbWFzLT5sYXN0KTsNCisJ aWYgKG1hcy0+aW5kZXggPiBtYXMtPmxhc3QpIHsNCisJCW1hc19zZXRfZXJyKG1hcywgLUVJTlZB TCk7DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKyNlbmRpZg0KKw0KKwkvKg0KKwkgKiBTdG9y aW5nIGlzIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyBpbnNlcnQgd2l0aCB0aGUgYWRkZWQgY2F2ZWF0 IHRoYXQgaXQNCisJICogY2FuIG92ZXJ3cml0ZSBlbnRyaWVzLiAgQWx0aG91Z2ggdGhpcyBzZWVt cyBzaW1wbGUgZW5vdWdoLCBvbmUgbWF5DQorCSAqIHdhbnQgdG8gZXhhbWluZSB3aGF0IGhhcHBl bnMgaWYgYSBzaW5nbGUgc3RvcmUgb3BlcmF0aW9uIHdhcyB0bw0KKwkgKiBvdmVyd3JpdGUgbXVs dGlwbGUgZW50cmllcyB3aXRoaW4gYSBzZWxmLWJhbGFuY2luZyBCLVRyZWUuDQorCSAqLw0KKwlt YXNfd3Jfc3RvcmVfc2V0dXAoJndyX21hcyk7DQorCW1hc193cl9zdG9yZV9lbnRyeSgmd3JfbWFz KTsNCisJcmV0dXJuIHdyX21hcy5jb250ZW50Ow0KK30NCisNCisvKioNCisgKiBtYXNfc3RvcmVf Z2ZwKCkgLSBTdG9yZSBhIHZhbHVlIGludG8gdGhlIHRyZWUuDQorICogQG1hczogVGhlIG1hcGxl IHN0YXRlDQorICogQGVudHJ5OiBUaGUgZW50cnkgdG8gc3RvcmUNCisgKiBAZ2ZwOiBUaGUgR0ZQ X0ZMQUdTIHRvIHVzZSBmb3IgYWxsb2NhdGlvbnMgaWYgbmVjZXNzYXJ5Lg0KKyAqDQorICogUmV0 dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgb24gaW52YWxpZCByZXF1ZXN0LCAtRU5PTUVNIGlm IG1lbW9yeSBjb3VsZCBub3QNCisgKiBiZSBhbGxvY2F0ZWQuDQorICovDQoraW50IG1hc19zdG9y ZV9nZnAoc3RydWN0IG1hX3N0YXRlICptYXMsIHZvaWQgKmVudHJ5LCBnZnBfdCBnZnApDQorew0K KwlNQV9XUl9TVEFURSh3cl9tYXMsIG1hcywgZW50cnkpOw0KKw0KKwltYXNfd3Jfc3RvcmVfc2V0 dXAoJndyX21hcyk7DQorCXRyYWNlX21hX3dyaXRlKF9fZnVuY19fLCBtYXMsIDAsIGVudHJ5KTsN CityZXRyeToNCisJbWFzX3dyX3N0b3JlX2VudHJ5KCZ3cl9tYXMpOw0KKwlpZiAodW5saWtlbHko bWFzX25vbWVtKG1hcywgZ2ZwKSkpDQorCQlnb3RvIHJldHJ5Ow0KKw0KKwlpZiAodW5saWtlbHko bWFzX2lzX2VycihtYXMpKSkNCisJCXJldHVybiB4YV9lcnIobWFzLT5ub2RlKTsNCisNCisJcmV0 dXJuIDA7DQorfQ0KKw0KKy8qKg0KKyAqIG1hc19zdG9yZV9wcmVhbGxvYygpIC0gU3RvcmUgYSB2 YWx1ZSBpbnRvIHRoZSB0cmVlIHVzaW5nIG1lbWVvcnkNCisgKiBwcmVhbGxvY2F0ZWQgaW4gdGhl IG1hcGxlIHN0YXRlLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBlbnRyeTogVGhl IGVudHJ5IHRvIHN0b3JlLg0KKyAqLw0KK3ZvaWQgbWFzX3N0b3JlX3ByZWFsbG9jKHN0cnVjdCBt YV9zdGF0ZSAqbWFzLCB2b2lkICplbnRyeSkNCit7DQorCU1BX1dSX1NUQVRFKHdyX21hcywgbWFz LCBlbnRyeSk7DQorDQorCW1hc193cl9zdG9yZV9zZXR1cCgmd3JfbWFzKTsNCisJdHJhY2VfbWFf d3JpdGUoX19mdW5jX18sIG1hcywgMCwgZW50cnkpOw0KKwltYXNfd3Jfc3RvcmVfZW50cnkoJndy X21hcyk7DQorCUJVR19PTihtYXNfaXNfZXJyKG1hcykpOw0KKwltYXNfZGVzdHJveShtYXMpOw0K K30NCisNCisvKioNCisgKiBtYXNfcHJlYWxsb2NhdGUoKSAtIFByZWFsbG9jYXRlIGVub3VnaCBu b2RlcyBmb3IgYSBzdG9yZSBvcGVyYXRpb24NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisg KiBAZW50cnk6IFRoZSBlbnRyeSB0aGF0IHdpbGwgYmUgc3RvcmVkDQorICogQGdmcDogVGhlIEdG UF9GTEFHUyB0byB1c2UgZm9yIGFsbG9jYXRpb25zLg0KKyAqDQorICogUmV0dXJuOiAwIG9uIHN1 Y2Nlc3MsIC1FTk9NRU0gaWYgbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuDQorICovDQor aW50IG1hc19wcmVhbGxvY2F0ZShzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdm9pZCAqZW50cnksIGdm cF90IGdmcCkNCit7DQorDQorCW1hc19zZXRfYWxsb2NfcmVxKG1hcywgMSArIG1hc19tdF9oZWln aHQobWFzKSAqIDMpOw0KKwltYXNfYWxsb2Nfbm9kZXMobWFzLCBnZnApOw0KKwlpZiAobGlrZWx5 KG1hcy0+bm9kZSAhPSBNQV9FUlJPUigtRU5PTUVNKSkpDQorCQlyZXR1cm4gMDsNCisNCisJbWFz X3NldF9hbGxvY19yZXEobWFzLCAwKTsNCisJbWFzX2Rlc3Ryb3kobWFzKTsNCisJbWFzLT5ub2Rl ID0gTUFTX1NUQVJUOw0KKwlyZXR1cm4gLUVOT01FTTsNCit9DQorDQorLyoNCisgKiBtYXNfZXhw ZWN0ZWRfZW50cmllcygpIC0gU2V0IHRoZSBleHBlY3RlZCBudW1iZXIgb2YgZW50cmllcyB0aGF0 IHdpbGwgYmUgaW5zZXJ0ZWQuDQorICogQG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG5yX2Vu dHJpZXM6IFRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZW50cmllcy4NCisgKg0KKyAqIFRoaXMgd2ls bCBhdHRlbXB0IHRvIHByZS1hbGxvY2F0ZSBlbm91Z2ggbm9kZXMgdG8gc3RvcmUgdGhlIGV4cGVj dGVkIG51bWJlcg0KKyAqIG9mIGVudHJpZXMuICBUaGUgYWxsb2NhdGlvbnMgd2lsbCBvY2N1ciB1 c2luZyB0aGUgYnVsayBhbGxvY2F0b3IgaW50ZXJmYWNlDQorICogZm9yIHNwZWVkLiAgUGxlYXNl IGNhbGwgbWFzX2Rlc3Ryb3koKSBvbiB0aGUgQG1hcyBhZnRlciBpbnNlcnRpbmcgdGhlIGVudHJp ZXMNCisgKiB0byBlbnN1cmUgYW55IHVudXNlZCBub2RlcyBhcmUgZnJlZWQuDQorICoNCisgKiBS ZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT01FTSBpZiBtZW1vcnkgY291bGQgbm90IGJlIGFsbG9j YXRlZC4NCisgKi8NCitpbnQgbWFzX2V4cGVjdGVkX2VudHJpZXMoc3RydWN0IG1hX3N0YXRlICpt YXMsIHVuc2lnbmVkIGxvbmcgbnJfZW50cmllcykNCit7DQorCWludCBub25sZWFmX2NhcCA9IE1B UExFX0FSQU5HRTY0X1NMT1RTIC0gMjsNCisJc3RydWN0IG1hcGxlX2Vub2RlICplbm9kZSA9IG1h cy0+bm9kZTsNCisJaW50IG5yX25vZGVzOw0KKwlpbnQgcmV0Ow0KKw0KKwkvKg0KKwkgKiBTb21l dGltZXMgaXQgaXMgbmVjZXNzYXJ5IHRvIGR1cGxpY2F0ZSBhIHRyZWUgdG8gYSBuZXcgdHJlZSwg c3VjaCBhcw0KKwkgKiBmb3JraW5nIGEgcHJvY2VzcyBhbmQgZHVwbGljYXRpbmcgdGhlIFZNQXMg ZnJvbSBvbmUgdHJlZSB0byBhIG5ldw0KKwkgKiB0cmVlLiAgV2hlbiBzdWNoIGEgc2l0dWF0aW9u IGFyaXNlcywgaXQgaXMga25vd24gdGhhdCB0aGUgbmV3IHRyZWUgaXMNCisJICogbm90IGdvaW5n IHRvIGJlIHVzZWQgdW50aWwgdGhlIGVudGlyZSB0cmVlIGlzIHBvcHVsYXRlZC4gIEZvcg0KKwkg KiBwZXJmb3JtYW5jZSByZWFzb25zLCBpdCBpcyBiZXN0IHRvIHVzZSBhIGJ1bGsgbG9hZCB3aXRo IFJDVSBkaXNhYmxlZC4NCisJICogVGhpcyBhbGxvd3MgZm9yIG9wdGltaXN0aWMgc3BsaXR0aW5n IHRoYXQgZmF2b3VycyB0aGUgbGVmdCBhbmQgcmV1c2UNCisJICogb2Ygbm9kZXMgZHVyaW5nIHRo ZSBvcGVyYXRpb24uDQorCSAqLw0KKw0KKwkvKiBPcHRpbWl6ZSBzcGxpdHRpbmcgZm9yIGJ1bGsg aW5zZXJ0IGluLW9yZGVyICovDQorCW1hcy0+bWFzX2ZsYWdzIHw9IE1BX1NUQVRFX0JVTEs7DQor DQorCS8qDQorCSAqIEF2b2lkIG92ZXJmbG93LCBhc3N1bWUgYSBnYXAgYmV0d2VlbiBlYWNoIGVu dHJ5IGFuZCBhIHRyYWlsaW5nIG51bGwuDQorCSAqIElmIHRoaXMgaXMgd3JvbmcsIGl0IGp1c3Qg bWVhbnMgYWxsb2NhdGlvbiBjYW4gaGFwcGVuIGR1cmluZw0KKwkgKiBpbnNlcnRpb24gb2YgZW50 cmllcy4NCisJICovDQorCW5yX25vZGVzID0gbWF4KG5yX2VudHJpZXMsIG5yX2VudHJpZXMgKiAy ICsgMSk7DQorDQorCWlmICghbXRfaXNfYWxsb2MobWFzLT50cmVlKSkNCisJCW5vbmxlYWZfY2Fw ID0gTUFQTEVfUkFOR0U2NF9TTE9UUyAtIDI7DQorDQorCS8qIExlYXZlcyAqLw0KKwlucl9ub2Rl cyA9IERJVl9ST1VORF9VUChucl9ub2RlcywgTUFQTEVfUkFOR0U2NF9TTE9UUyAtIDEpOw0KKwkv KiBJbnRlcm5hbCBub2RlcyAqLw0KKwlucl9ub2RlcyArPSBESVZfUk9VTkRfVVAobnJfbm9kZXMs IG5vbmxlYWZfY2FwKTsNCisJbWFzX25vZGVfY291bnQobWFzLCBucl9ub2Rlcyk7DQorDQorCWlm ICghbWFzX2lzX2VycihtYXMpKQ0KKwkJcmV0dXJuIDA7DQorDQorCXJldCA9IHhhX2VycihtYXMt Pm5vZGUpOw0KKwltYXMtPm5vZGUgPSBlbm9kZTsNCisJcmV0dXJuIHJldDsNCisNCit9DQorDQor LyoNCisgKiBtYXNfZGVzdHJveSgpIC0gZGVzdHJveSBhIG1hcGxlIHN0YXRlLg0KKyAqIEBtYXM6 IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqDQorICogVXBvbiBjb21wbGV0aW9uLCBjaGVjayB0aGUgbGVm dC1tb3N0IG5vZGUgYW5kIHJlYmFsYW5jZSBhZ2FpbnN0IHRoZSBub2RlIHRvDQorICogdGhlIHJp Z2h0IGlmIG5lY2Vzc2FyeS4gIEZyZWVzIGFueSBhbGxvY2F0ZWQgbm9kZXMgYXNzb2NpYXRlZCB3 aXRoIHRoaXMgbWFwbGUNCisgKiBzdGF0ZS4NCisgKi8NCit2b2lkIG1hc19kZXN0cm95KHN0cnVj dCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJc3RydWN0IG1hcGxlX2FsbG9jICpub2RlOw0KKw0KKwkv Kg0KKwkgKiBXaGVuIHVzaW5nIG1hc19mb3JfZWFjaCgpIHRvIGluc2VydCBhbiBleHBlY3RlZCBu dW1iZXIgb2YgZWxlbWVudHMsDQorCSAqIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIG51bWJlciBp bnNlcnRlZCBpcyBsZXNzIHRoYW4gdGhlIGV4cGVjdGVkDQorCSAqIG51bWJlci4gIFRvIGZpeCBh biBpbnZhbGlkIGZpbmFsIG5vZGUsIGEgY2hlY2sgaXMgcGVyZm9ybWVkIGhlcmUgdG8NCisJICog cmViYWxhbmNlIHRoZSBwcmV2aW91cyBub2RlIHdpdGggdGhlIGZpbmFsIG5vZGUuDQorCSAqLw0K KwlpZiAobWFzLT5tYXNfZmxhZ3MgJiBNQV9TVEFURV9SRUJBTEFOQ0UpIHsNCisJCXVuc2lnbmVk IGNoYXIgZW5kOw0KKw0KKwkJaWYgKG1hc19pc19zdGFydChtYXMpKQ0KKwkJCW1hc19zdGFydCht YXMpOw0KKw0KKwkJbXRyZWVfcmFuZ2Vfd2FsayhtYXMpOw0KKwkJZW5kID0gbWFzX2RhdGFfZW5k KG1hcykgKyAxOw0KKwkJaWYgKGVuZCA8IG10X21pbl9zbG90X2NvdW50KG1hcy0+bm9kZSkgLSAx KQ0KKwkJCW1hc19kZXN0cm95X3JlYmFsYW5jZShtYXMsIGVuZCk7DQorDQorCQltYXMtPm1hc19m bGFncyAmPSB+TUFfU1RBVEVfUkVCQUxBTkNFOw0KKwl9DQorCW1hcy0+bWFzX2ZsYWdzICY9IH5N QV9TVEFURV9CVUxLOw0KKw0KKwl3aGlsZSAobWFzLT5hbGxvYyAmJiAhKCh1bnNpZ25lZCBsb25n KW1hcy0+YWxsb2MgJiAweDEpKSB7DQorCQlub2RlID0gbWFzLT5hbGxvYzsNCisJCW1hcy0+YWxs b2MgPSBub2RlLT5zbG90WzBdOw0KKwkJaWYgKG5vZGUtPm5vZGVfY291bnQgPiAwKQ0KKwkJCW10 X2ZyZWVfYnVsayhub2RlLT5ub2RlX2NvdW50LA0KKwkJCQkgICAgICh2b2lkIF9fcmN1ICoqKSZu b2RlLT5zbG90WzFdKTsNCisJCWttZW1fY2FjaGVfZnJlZShtYXBsZV9ub2RlX2NhY2hlLCBub2Rl KTsNCisJfQ0KKwltYXMtPmFsbG9jID0gTlVMTDsNCit9DQorDQorLyoqDQorICogbWFzX25leHQo KSAtIEdldCB0aGUgbmV4dCBlbnRyeS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUNCisgKiBA bWF4OiBUaGUgbWF4aW11bSBpbmRleCB0byBjaGVjay4NCisgKg0KKyAqIFJldHVybnMgdGhlIG5l eHQgZW50cnkgYWZ0ZXIgQG1hcy0+aW5kZXguDQorICogTXVzdCBob2xkIHJjdV9yZWFkX2xvY2sg b3IgdGhlIHdyaXRlIGxvY2suDQorICogQ2FuIHJldHVybiB0aGUgemVybyBlbnRyeS4NCisgKg0K KyAqIFJldHVybjogVGhlIG5leHQgZW50cnkgb3IgJU5VTEwNCisgKi8NCit2b2lkICptYXNfbmV4 dChzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtYXgpDQorew0KKwlpZiAobWFz X2lzX25vbmUobWFzKSB8fCBtYXNfaXNfcGF1c2VkKG1hcykpDQorCQltYXMtPm5vZGUgPSBNQVNf U1RBUlQ7DQorDQorCWlmIChtYXNfaXNfc3RhcnQobWFzKSkNCisJCW1hc193YWxrKG1hcyk7IC8q IFJldHJpZXMgb24gZGVhZCBub2RlcyBoYW5kbGVkIGJ5IG1hc193YWxrICovDQorDQorCWlmICht YXNfaXNfcHRyKG1hcykpIHsNCisJCWlmICghbWFzLT5pbmRleCkgew0KKwkJCW1hcy0+aW5kZXgg PSAxOw0KKwkJCW1hcy0+bGFzdCA9IFVMT05HX01BWDsNCisJCX0NCisJCXJldHVybiBOVUxMOw0K Kwl9DQorDQorCWlmIChtYXMtPmxhc3QgPT0gVUxPTkdfTUFYKQ0KKwkJcmV0dXJuIE5VTEw7DQor DQorCS8qIFJldHJpZXMgb24gZGVhZCBub2RlcyBoYW5kbGVkIGJ5IG1hc19uZXh0X2VudHJ5ICov DQorCXJldHVybiBtYXNfbmV4dF9lbnRyeShtYXMsIG1heCk7DQorfQ0KK0VYUE9SVF9TWU1CT0xf R1BMKG1hc19uZXh0KTsNCisNCisvKioNCisgKiBtdF9uZXh0KCkgLSBnZXQgdGhlIG5leHQgdmFs dWUgaW4gdGhlIG1hcGxlIHRyZWUNCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4 OiBUaGUgc3RhcnQgaW5kZXgNCisgKiBAbWF4OiBUaGUgbWF4aW11bSBpbmRleCB0byBjaGVjaw0K KyAqDQorICogUmV0dXJuOiBUaGUgZW50cnkgYXQgQGluZGV4IG9yIGhpZ2hlciwgb3IgJU5VTEwg aWYgbm90aGluZyBpcyBmb3VuZC4NCisgKi8NCit2b2lkICptdF9uZXh0KHN0cnVjdCBtYXBsZV90 cmVlICptdCwgdW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBtYXgpDQorew0KKwl2 b2lkICplbnRyeSA9IE5VTEw7DQorCU1BX1NUQVRFKG1hcywgbXQsIGluZGV4LCBpbmRleCk7DQor DQorCXJjdV9yZWFkX2xvY2soKTsNCisJZW50cnkgPSBtYXNfbmV4dCgmbWFzLCBtYXgpOw0KKwly Y3VfcmVhZF91bmxvY2soKTsNCisJcmV0dXJuIGVudHJ5Ow0KK30NCitFWFBPUlRfU1lNQk9MX0dQ TChtdF9uZXh0KTsNCisNCisvKioNCisgKiBtYXNfcHJldigpIC0gR2V0IHRoZSBwcmV2aW91cyBl bnRyeQ0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtaW46IFRoZSBtaW5pbXVtIHZh bHVlIHRvIGNoZWNrLg0KKyAqDQorICogTXVzdCBob2xkIHJjdV9yZWFkX2xvY2sgb3IgdGhlIHdy aXRlIGxvY2suDQorICogV2lsbCByZXNldCBtYXMgdG8gTUFTX1NUQVJUIGlmIHRoZSBub2RlIGlz IE1BU19OT05FLiAgV2lsbCBzdG9wIG9uIG5vdA0KKyAqIHNlYXJjaGFibGUgbm9kZXMuDQorICoN CisgKiBSZXR1cm46IHRoZSBwcmV2aW91cyB2YWx1ZSBvciAlTlVMTC4NCisgKi8NCit2b2lkICpt YXNfcHJldihzdHJ1Y3QgbWFfc3RhdGUgKm1hcywgdW5zaWduZWQgbG9uZyBtaW4pDQorew0KKwlp ZiAoIW1hcy0+aW5kZXgpIHsNCisJCS8qIE5vdGhpbmcgY29tZXMgYmVmb3JlIDAgKi8NCisJCW1h cy0+bGFzdCA9IDA7DQorCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwlpZiAodW5saWtlbHkobWFz X2lzX3B0cihtYXMpKSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlpZiAobWFzX2lzX25vbmUobWFz KSB8fCBtYXNfaXNfcGF1c2VkKG1hcykpDQorCQltYXMtPm5vZGUgPSBNQVNfU1RBUlQ7DQorDQor CWlmIChtYXNfaXNfc3RhcnQobWFzKSkgew0KKwkJbWFzX3dhbGsobWFzKTsNCisJCWlmICghbWFz LT5pbmRleCkNCisJCQlyZXR1cm4gTlVMTDsNCisJfQ0KKw0KKwlpZiAobWFzX2lzX3B0cihtYXMp KSB7DQorCQlpZiAoIW1hcy0+aW5kZXgpIHsNCisJCQltYXMtPmxhc3QgPSAwOw0KKwkJCXJldHVy biBOVUxMOw0KKwkJfQ0KKw0KKwkJbWFzLT5pbmRleCA9IG1hcy0+bGFzdCA9IDA7DQorCQlyZXR1 cm4gbWFzX3Jvb3RfbG9ja2VkKG1hcyk7DQorCX0NCisJcmV0dXJuIG1hc19wcmV2X2VudHJ5KG1h cywgbWluKTsNCit9DQorRVhQT1JUX1NZTUJPTF9HUEwobWFzX3ByZXYpOw0KKw0KKy8qKg0KKyAq IG10X3ByZXYoKSAtIGdldCB0aGUgcHJldmlvdXMgdmFsdWUgaW4gdGhlIG1hcGxlIHRyZWUNCisg KiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4OiBUaGUgc3RhcnQgaW5kZXgNCisgKiBA bWluOiBUaGUgbWluaW11bSBpbmRleCB0byBjaGVjaw0KKyAqDQorICogUmV0dXJuOiBUaGUgZW50 cnkgYXQgQGluZGV4IG9yIGxvd2VyLCBvciAlTlVMTCBpZiBub3RoaW5nIGlzIGZvdW5kLg0KKyAq Lw0KK3ZvaWQgKm10X3ByZXYoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGlu ZGV4LCB1bnNpZ25lZCBsb25nIG1pbikNCit7DQorCXZvaWQgKmVudHJ5ID0gTlVMTDsNCisJTUFf U1RBVEUobWFzLCBtdCwgaW5kZXgsIGluZGV4KTsNCisNCisJcmN1X3JlYWRfbG9jaygpOw0KKwll bnRyeSA9IG1hc19wcmV2KCZtYXMsIG1pbik7DQorCXJjdV9yZWFkX3VubG9jaygpOw0KKwlyZXR1 cm4gZW50cnk7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKG10X3ByZXYpOw0KKw0KKy8qKg0KKyAq IG1hc19wYXVzZSgpIC0gUGF1c2UgYSBtYXNfZmluZC9tYXNfZm9yX2VhY2ggdG8gZHJvcCB0aGUg bG9jay4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUgdG8gcGF1c2UNCisgKg0KKyAqIFNvbWUg dXNlcnMgbmVlZCB0byBwYXVzZSBhIHdhbGsgYW5kIGRyb3AgdGhlIGxvY2sgdGhleSdyZSBob2xk aW5nIGluDQorICogb3JkZXIgdG8geWllbGQgdG8gYSBoaWdoZXIgcHJpb3JpdHkgdGhyZWFkIG9y IGNhcnJ5IG91dCBhbiBvcGVyYXRpb24NCisgKiBvbiBhbiBlbnRyeS4gIFRob3NlIHVzZXJzIHNo b3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIHRoZXkgZHJvcA0KKyAqIHRoZSBsb2NrLiAg SXQgcmVzZXRzIHRoZSBAbWFzIHRvIGJlIHN1aXRhYmxlIGZvciB0aGUgbmV4dCBpdGVyYXRpb24N CisgKiBvZiB0aGUgbG9vcCBhZnRlciB0aGUgdXNlciBoYXMgcmVhY3F1aXJlZCB0aGUgbG9jay4g IElmIG1vc3QgZW50cmllcw0KKyAqIGZvdW5kIGR1cmluZyBhIHdhbGsgcmVxdWlyZSB5b3UgdG8g Y2FsbCBtYXNfcGF1c2UoKSwgdGhlIG10X2Zvcl9lYWNoKCkNCisgKiBpdGVyYXRvciBtYXkgYmUg bW9yZSBhcHByb3ByaWF0ZS4NCisgKg0KKyAqLw0KK3ZvaWQgbWFzX3BhdXNlKHN0cnVjdCBtYV9z dGF0ZSAqbWFzKQ0KK3sNCisJbWFzLT5ub2RlID0gTUFTX1BBVVNFOw0KK30NCitFWFBPUlRfU1lN Qk9MX0dQTChtYXNfcGF1c2UpOw0KKw0KKy8qKg0KKyAqIG1hc19maW5kKCkgLSBPbiB0aGUgZmly c3QgY2FsbCwgZmluZCB0aGUgZW50cnkgYXQgb3IgYWZ0ZXIgbWFzLT5pbmRleCB1cCB0bw0KKyAq ICVtYXguICBPdGhlcndpc2UsIGZpbmQgdGhlIGVudHJ5IGFmdGVyIG1hcy0+aW5kZXguDQorICog QG1hczogVGhlIG1hcGxlIHN0YXRlDQorICogQG1heDogVGhlIG1heGltdW0gdmFsdWUgdG8gY2hl Y2suDQorICoNCisgKiBNdXN0IGhvbGQgcmN1X3JlYWRfbG9jayBvciB0aGUgd3JpdGUgbG9jay4N CisgKiBJZiBhbiBlbnRyeSBleGlzdHMsIGxhc3QgYW5kIGluZGV4IGFyZSB1cGRhdGVkIGFjY29y ZGluZ2x5Lg0KKyAqIE1heSBzZXQgQG1hcy0+bm9kZSB0byBNQVNfTk9ORS4NCisgKg0KKyAqIFJl dHVybjogVGhlIGVudHJ5IG9yICVOVUxMLg0KKyAqLw0KK3ZvaWQgKm1hc19maW5kKHN0cnVjdCBt YV9zdGF0ZSAqbWFzLCB1bnNpZ25lZCBsb25nIG1heCkNCit7DQorCWlmICh1bmxpa2VseShtYXNf aXNfcGF1c2VkKG1hcykpKSB7DQorCQlpZiAodW5saWtlbHkobWFzLT5sYXN0ID09IFVMT05HX01B WCkpIHsNCisJCQltYXMtPm5vZGUgPSBNQVNfTk9ORTsNCisJCQlyZXR1cm4gTlVMTDsNCisJCX0N CisJCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisJCW1hcy0+aW5kZXggPSArK21hcy0+bGFzdDsN CisJfQ0KKw0KKwlpZiAodW5saWtlbHkobWFzX2lzX3N0YXJ0KG1hcykpKSB7DQorCQkvKiBGaXJz dCBydW4gb3IgY29udGludWUgKi8NCisJCXZvaWQgKmVudHJ5Ow0KKw0KKwkJaWYgKG1hcy0+aW5k ZXggPiBtYXgpDQorCQkJcmV0dXJuIE5VTEw7DQorDQorCQllbnRyeSA9IG1hc193YWxrKG1hcyk7 DQorCQlpZiAoZW50cnkpDQorCQkJcmV0dXJuIGVudHJ5Ow0KKwl9DQorDQorCWlmICh1bmxpa2Vs eSghbWFzX3NlYXJjaGFibGUobWFzKSkpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJLyogUmV0cmll cyBvbiBkZWFkIG5vZGVzIGhhbmRsZWQgYnkgbWFzX25leHRfZW50cnkgKi8NCisJcmV0dXJuIG1h c19uZXh0X2VudHJ5KG1hcywgbWF4KTsNCit9DQorDQorLyoqDQorICogbWFzX2ZpbmRfcmV2OiBP biB0aGUgZmlyc3QgY2FsbCwgZmluZCB0aGUgZmlyc3Qgbm9uLW51bGwgZW50cnkgYXQgb3IgYmVs b3cNCisgKiBtYXMtPmluZGV4IGRvd24gdG8gJW1pbi4gIE90aGVyd2lzZSBmaW5kIHRoZSBmaXJz dCBub24tbnVsbCBlbnRyeSBiZWxvdw0KKyAqIG1hcy0+aW5kZXggZG93biB0byAlbWluLg0KKyAq IEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBtaW46IFRoZSBtaW5pbXVtIHZhbHVlIHRvIGNo ZWNrLg0KKyAqDQorICogTXVzdCBob2xkIHJjdV9yZWFkX2xvY2sgb3IgdGhlIHdyaXRlIGxvY2su DQorICogSWYgYW4gZW50cnkgZXhpc3RzLCBsYXN0IGFuZCBpbmRleCBhcmUgdXBkYXRlZCBhY2Nv cmRpbmdseS4NCisgKiBNYXkgc2V0IEBtYXMtPm5vZGUgdG8gTUFTX05PTkUuDQorICoNCisgKiBS ZXR1cm46IFRoZSBlbnRyeSBvciAlTlVMTC4NCisgKi8NCit2b2lkICptYXNfZmluZF9yZXYoc3Ry dWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWluKQ0KK3sNCisJaWYgKHVubGlrZWx5 KG1hc19pc19wYXVzZWQobWFzKSkpIHsNCisJCWlmICh1bmxpa2VseShtYXMtPmxhc3QgPT0gVUxP TkdfTUFYKSkgew0KKwkJCW1hcy0+bm9kZSA9IE1BU19OT05FOw0KKwkJCXJldHVybiBOVUxMOw0K KwkJfQ0KKwkJbWFzLT5ub2RlID0gTUFTX1NUQVJUOw0KKwkJbWFzLT5sYXN0ID0gLS1tYXMtPmlu ZGV4Ow0KKwl9DQorDQorCWlmICh1bmxpa2VseShtYXNfaXNfc3RhcnQobWFzKSkpIHsNCisJCS8q IEZpcnN0IHJ1biBvciBjb250aW51ZSAqLw0KKwkJdm9pZCAqZW50cnk7DQorDQorCQlpZiAobWFz LT5pbmRleCA8IG1pbikNCisJCQlyZXR1cm4gTlVMTDsNCisNCisJCWVudHJ5ID0gbWFzX3dhbGso bWFzKTsNCisJCWlmIChlbnRyeSkNCisJCQlyZXR1cm4gZW50cnk7DQorCX0NCisNCisJaWYgKHVu bGlrZWx5KCFtYXNfc2VhcmNoYWJsZShtYXMpKSkNCisJCXJldHVybiBOVUxMOw0KKw0KKwlpZiAo bWFzLT5pbmRleCA8IG1pbikNCisJCXJldHVybiBOVUxMOw0KKw0KKwkvKiBSZXRyaWVzIG9uIGRl YWQgbm9kZXMgaGFuZGxlZCBieSBtYXNfbmV4dF9lbnRyeSAqLw0KKwlyZXR1cm4gbWFzX3ByZXZf ZW50cnkobWFzLCBtaW4pOw0KK30NCitFWFBPUlRfU1lNQk9MX0dQTChtYXNfZmluZCk7DQorDQor LyoqDQorICogbWFzX2VyYXNlKCkgLSBGaW5kIHRoZSByYW5nZSBpbiB3aGljaCBpbmRleCByZXNp ZGVzIGFuZCBlcmFzZSB0aGUgZW50aXJlDQorICogcmFuZ2UuDQorICogQG1hczogVGhlIG1hcGxl IHN0YXRlDQorICoNCisgKiBNdXN0IGhvbGQgdGhlIHdyaXRlIGxvY2suDQorICogU2VhcmNoZXMg Zm9yIEBtYXMtPmluZGV4LCBzZXRzIEBtYXMtPmluZGV4IGFuZCBAbWFzLT5sYXN0IHRvIHRoZSBy YW5nZSBhbmQNCisgKiBlcmFzZXMgdGhhdCByYW5nZS4NCisgKg0KKyAqIFJldHVybjogdGhlIGVu dHJ5IHRoYXQgd2FzIGVyYXNlZCBvciAlTlVMTCwgQG1hcy0+aW5kZXggYW5kIEBtYXMtPmxhc3Qg YXJlIHVwZGF0ZWQuDQorICovDQordm9pZCAqbWFzX2VyYXNlKHN0cnVjdCBtYV9zdGF0ZSAqbWFz KQ0KK3sNCisJdm9pZCAqZW50cnk7DQorCU1BX1dSX1NUQVRFKHdyX21hcywgbWFzLCBOVUxMKTsN CisNCisJaWYgKG1hc19pc19ub25lKG1hcykgfHwgbWFzX2lzX3BhdXNlZChtYXMpKQ0KKwkJbWFz LT5ub2RlID0gTUFTX1NUQVJUOw0KKw0KKwkvKiBSZXRyeSB1bm5lY2Vzc2FyeSB3aGVuIGhvbGRp bmcgdGhlIHdyaXRlIGxvY2suICovDQorCWVudHJ5ID0gbWFzX3N0YXRlX3dhbGsobWFzKTsNCisJ aWYgKCFlbnRyeSkNCisJCXJldHVybiBOVUxMOw0KKw0KK3dyaXRlX3JldHJ5Og0KKwkvKiBNdXN0 IHJlc2V0IHRvIGVuc3VyZSBzcGFubmluZyB3cml0ZXMgb2YgbGFzdCBzbG90IGFyZSBkZXRlY3Rl ZCAqLw0KKwltYXNfcmVzZXQobWFzKTsNCisJbWFzX3dyX3N0b3JlX3NldHVwKCZ3cl9tYXMpOw0K KwltYXNfd3Jfc3RvcmVfZW50cnkoJndyX21hcyk7DQorCWlmIChtYXNfbm9tZW0obWFzLCBHRlBf S0VSTkVMKSkNCisJCWdvdG8gd3JpdGVfcmV0cnk7DQorDQorCXJldHVybiBlbnRyeTsNCit9DQor RVhQT1JUX1NZTUJPTF9HUEwobWFzX2VyYXNlKTsNCisNCisvKioNCisgKiBtYXNfbm9tZW0oKSAt IENoZWNrIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBhbGxvY2F0aW5nIGFuZCBkbyB0aGUgYWxsb2Nh dGlvbg0KKyAqIGlmIG5lY2Vzc2FyeSBJZiB0aGVyZSBhcmUgYWxsb2NhdGlvbnMsIHRoZW4gZnJl ZSB0aGVtLg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBnZnA6IFRoZSBHRlBfRkxB R1MgdG8gdXNlIGZvciBhbGxvY2F0aW9ucw0KKyAqIFJldHVybjogdHJ1ZSBvbiBhbGxvY2F0aW9u LCBmYWxzZSBvdGhlcndpc2UuDQorICovDQorYm9vbCBtYXNfbm9tZW0oc3RydWN0IG1hX3N0YXRl ICptYXMsIGdmcF90IGdmcCkNCisJX19tdXN0X2hvbGQobWFzLT50cmVlLT5sb2NrKQ0KK3sNCisJ aWYgKGxpa2VseShtYXMtPm5vZGUgIT0gTUFfRVJST1IoLUVOT01FTSkpKSB7DQorCQltYXNfZGVz dHJveShtYXMpOw0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorDQorCWlmIChnZnBmbGFnc19hbGxv d19ibG9ja2luZyhnZnApICYmICFtdF9leHRlcm5hbF9sb2NrKG1hcy0+dHJlZSkpIHsNCisJCW10 cmVlX3VubG9jayhtYXMtPnRyZWUpOw0KKwkJbWFzX2FsbG9jX25vZGVzKG1hcywgZ2ZwKTsNCisJ CW10cmVlX2xvY2sobWFzLT50cmVlKTsNCisJfSBlbHNlIHsNCisJCW1hc19hbGxvY19ub2Rlcyht YXMsIGdmcCk7DQorCX0NCisNCisJaWYgKCFtYXNfYWxsb2NhdGVkKG1hcykpDQorCQlyZXR1cm4g ZmFsc2U7DQorDQorCW1hcy0+bm9kZSA9IE1BU19TVEFSVDsNCisJcmV0dXJuIHRydWU7DQorfQ0K Kw0KK3ZvaWQgX19pbml0IG1hcGxlX3RyZWVfaW5pdCh2b2lkKQ0KK3sNCisJbWFwbGVfbm9kZV9j YWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJtYXBsZV9ub2RlIiwNCisJCQlzaXplb2Yoc3RydWN0 IG1hcGxlX25vZGUpLCBzaXplb2Yoc3RydWN0IG1hcGxlX25vZGUpLA0KKwkJCVNMQUJfUEFOSUMs IE5VTEwpOw0KK30NCisNCisvKioNCisgKiBtdHJlZV9sb2FkKCkgLSBMb2FkIGEgdmFsdWUgc3Rv cmVkIGluIGEgbWFwbGUgdHJlZQ0KKyAqIEBtdDogVGhlIG1hcGxlIHRyZWUNCisgKiBAaW5kZXg6 IFRoZSBpbmRleCB0byBsb2FkDQorICoNCisgKiBSZXR1cm46IHRoZSBlbnRyeSBvciAlTlVMTA0K KyAqLw0KK3ZvaWQgKm10cmVlX2xvYWQoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBs b25nIGluZGV4KQ0KK3sNCisJTUFfU1RBVEUobWFzLCBtdCwgaW5kZXgsIGluZGV4KTsNCisJdm9p ZCAqZW50cnk7DQorDQorCXRyYWNlX21hX3JlYWQoX19mdW5jX18sICZtYXMpOw0KKwlyY3VfcmVh ZF9sb2NrKCk7DQorcmV0cnk6DQorCWVudHJ5ID0gbWFzX3N0YXJ0KCZtYXMpOw0KKwlpZiAodW5s aWtlbHkobWFzX2lzX25vbmUoJm1hcykpKQ0KKwkJZ290byB1bmxvY2s7DQorDQorCWlmICh1bmxp a2VseShtYXNfaXNfcHRyKCZtYXMpKSkgew0KKwkJaWYgKGluZGV4KQ0KKwkJCWVudHJ5ID0gTlVM TDsNCisNCisJCWdvdG8gdW5sb2NrOw0KKwl9DQorDQorCWVudHJ5ID0gbXRyZWVfbG9va3VwX3dh bGsoJm1hcyk7DQorCWlmICghZW50cnkgJiYgdW5saWtlbHkobWFzX2lzX3N0YXJ0KCZtYXMpKSkN CisJCWdvdG8gcmV0cnk7DQordW5sb2NrOg0KKwlyY3VfcmVhZF91bmxvY2soKTsNCisJaWYgKHhh X2lzX3plcm8oZW50cnkpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCXJldHVybiBlbnRyeTsNCit9 DQorRVhQT1JUX1NZTUJPTChtdHJlZV9sb2FkKTsNCisNCisvKioNCisgKiBtdHJlZV9zdG9yZV9y YW5nZSgpIC0gU3RvcmUgYW4gZW50cnkgYXQgYSBnaXZlbiByYW5nZS4NCisgKiBAbXQ6IFRoZSBt YXBsZSB0cmVlDQorICogQGluZGV4OiBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlDQorICogQGxhc3Q6 IFRoZSBlbmQgb2YgdGhlIHJhbmdlDQorICogQGVudHJ5OiBUaGUgZW50cnkgdG8gc3RvcmUNCisg KiBAZ2ZwOiBUaGUgR0ZQX0ZMQUdTIHRvIHVzZSBmb3IgYWxsb2NhdGlvbnMNCisgKg0KKyAqIFJl dHVybjogMCBvbiBzdWNjZXNzLCAtRUlOVkFMIG9uIGludmFsaWQgcmVxdWVzdCwgLUVOT01FTSBp ZiBtZW1vcnkgY291bGQgbm90DQorICogYmUgYWxsb2NhdGVkLg0KKyAqLw0KK2ludCBtdHJlZV9z dG9yZV9yYW5nZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgaW5kZXgsDQor CQl1bnNpZ25lZCBsb25nIGxhc3QsIHZvaWQgKmVudHJ5LCBnZnBfdCBnZnApDQorew0KKwlNQV9T VEFURShtYXMsIG10LCBpbmRleCwgbGFzdCk7DQorCU1BX1dSX1NUQVRFKHdyX21hcywgJm1hcywg ZW50cnkpOw0KKw0KKwl0cmFjZV9tYV93cml0ZShfX2Z1bmNfXywgJm1hcywgMCwgZW50cnkpOw0K KwlpZiAoV0FSTl9PTl9PTkNFKHhhX2lzX2FkdmFuY2VkKGVudHJ5KSkpDQorCQlyZXR1cm4gLUVJ TlZBTDsNCisNCisJaWYgKGluZGV4ID4gbGFzdCkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlt dHJlZV9sb2NrKG10KTsNCityZXRyeToNCisJbWFzX3dyX3N0b3JlX2VudHJ5KCZ3cl9tYXMpOw0K KwlpZiAobWFzX25vbWVtKCZtYXMsIGdmcCkpDQorCQlnb3RvIHJldHJ5Ow0KKw0KKwltdHJlZV91 bmxvY2sobXQpOw0KKwlpZiAobWFzX2lzX2VycigmbWFzKSkNCisJCXJldHVybiB4YV9lcnIobWFz Lm5vZGUpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9zdG9yZV9y YW5nZSk7DQorDQorLyoqDQorICogbXRyZWVfc3RvcmUoKSAtIFN0b3JlIGFuIGVudHJ5IGF0IGEg Z2l2ZW4gaW5kZXguDQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAqIEBpbmRleDogVGhlIGlu ZGV4IHRvIHN0b3JlIHRoZSB2YWx1ZQ0KKyAqIEBlbnRyeTogVGhlIGVudHJ5IHRvIHN0b3JlDQor ICogQGdmcDogVGhlIEdGUF9GTEFHUyB0byB1c2UgZm9yIGFsbG9jYXRpb25zDQorICoNCisgKiBS ZXR1cm46IDAgb24gc3VjY2VzcywgLUVJTlZBTCBvbiBpbnZhbGlkIHJlcXVlc3QsIC1FTk9NRU0g aWYgbWVtb3J5IGNvdWxkIG5vdA0KKyAqIGJlIGFsbG9jYXRlZC4NCisgKi8NCitpbnQgbXRyZWVf c3RvcmUoc3RydWN0IG1hcGxlX3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGluZGV4LCB2b2lkICpl bnRyeSwNCisJCSBnZnBfdCBnZnApDQorew0KKwlyZXR1cm4gbXRyZWVfc3RvcmVfcmFuZ2UobXQs IGluZGV4LCBpbmRleCwgZW50cnksIGdmcCk7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfc3Rv cmUpOw0KKw0KKy8qKg0KKyAqIG10cmVlX2luc2VydF9yYW5nZSgpIC0gSW5zZXJ0IGFuIGVudHJ5 IGF0IGEgZ2l2ZSByYW5nZSBpZiB0aGVyZSBpcyBubyB2YWx1ZS4NCisgKiBAbXQ6IFRoZSBtYXBs ZSB0cmVlDQorICogQGZpcnN0OiBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlDQorICogQGxhc3Q6IFRo ZSBlbmQgb2YgdGhlIHJhbmdlDQorICogQGVudHJ5OiBUaGUgZW50cnkgdG8gc3RvcmUNCisgKiBA Z2ZwOiBUaGUgR0ZQX0ZMQUdTIHRvIHVzZSBmb3IgYWxsb2NhdGlvbnMuDQorICoNCisgKiBSZXR1 cm46IDAgb24gc3VjY2VzcywgLUVFWElTVFMgaWYgdGhlIHJhbmdlIGlzIG9jY3VwaWVkLCAtRUlO VkFMIG9uIGludmFsaWQNCisgKiByZXF1ZXN0LCAtRU5PTUVNIGlmIG1lbW9yeSBjb3VsZCBub3Qg YmUgYWxsb2NhdGVkLg0KKyAqLw0KK2ludCBtdHJlZV9pbnNlcnRfcmFuZ2Uoc3RydWN0IG1hcGxl X3RyZWUgKm10LCB1bnNpZ25lZCBsb25nIGZpcnN0LA0KKwkJdW5zaWduZWQgbG9uZyBsYXN0LCB2 b2lkICplbnRyeSwgZ2ZwX3QgZ2ZwKQ0KK3sNCisJTUFfU1RBVEUobXMsIG10LCBmaXJzdCwgbGFz dCk7DQorDQorCWlmIChXQVJOX09OX09OQ0UoeGFfaXNfYWR2YW5jZWQoZW50cnkpKSkNCisJCXJl dHVybiAtRUlOVkFMOw0KKw0KKwlpZiAoZmlyc3QgPiBsYXN0KQ0KKwkJcmV0dXJuIC1FSU5WQUw7 DQorDQorCW10cmVlX2xvY2sobXQpOw0KK3JldHJ5Og0KKwltYXNfaW5zZXJ0KCZtcywgZW50cnkp Ow0KKwlpZiAobWFzX25vbWVtKCZtcywgZ2ZwKSkNCisJCWdvdG8gcmV0cnk7DQorDQorCW10cmVl X3VubG9jayhtdCk7DQorCWlmIChtYXNfaXNfZXJyKCZtcykpDQorCQlyZXR1cm4geGFfZXJyKG1z Lm5vZGUpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9pbnNlcnRf cmFuZ2UpOw0KKw0KKy8qKg0KKyAqIG10cmVlX2luc2VydCgpIC0gSW5zZXJ0IGFuIGVudHJ5IGF0 IGEgZ2l2ZSBpbmRleCBpZiB0aGVyZSBpcyBubyB2YWx1ZS4NCisgKiBAbXQ6IFRoZSBtYXBsZSB0 cmVlDQorICogQGluZGV4IDogVGhlIGluZGV4IHRvIHN0b3JlIHRoZSB2YWx1ZQ0KKyAqIEBlbnRy eTogVGhlIGVudHJ5IHRvIHN0b3JlDQorICogQGdmcDogVGhlIEZHUF9GTEFHUyB0byB1c2UgZm9y IGFsbG9jYXRpb25zLg0KKyAqDQorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FRVhJU1RTIGlm IHRoZSByYW5nZSBpcyBvY2N1cGllZCwgLUVJTlZBTCBvbiBpbnZhbGlkDQorICogcmVxdWVzdCwg LUVOT01FTSBpZiBtZW1vcnkgY291bGQgbm90IGJlIGFsbG9jYXRlZC4NCisgKi8NCitpbnQgbXRy ZWVfaW5zZXJ0KHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9uZyBpbmRleCwgdm9p ZCAqZW50cnksDQorCQkgZ2ZwX3QgZ2ZwKQ0KK3sNCisJcmV0dXJuIG10cmVlX2luc2VydF9yYW5n ZShtdCwgaW5kZXgsIGluZGV4LCBlbnRyeSwgZ2ZwKTsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJl ZV9pbnNlcnQpOw0KKw0KK2ludCBtdHJlZV9hbGxvY19yYW5nZShzdHJ1Y3QgbWFwbGVfdHJlZSAq bXQsIHVuc2lnbmVkIGxvbmcgKnN0YXJ0cCwNCisJCXZvaWQgKmVudHJ5LCB1bnNpZ25lZCBsb25n IHNpemUsIHVuc2lnbmVkIGxvbmcgbWluLA0KKwkJdW5zaWduZWQgbG9uZyBtYXgsIGdmcF90IGdm cCkNCit7DQorCWludCByZXQgPSAwOw0KKw0KKwlNQV9TVEFURShtYXMsIG10LCBtaW4sIG1heCAt IHNpemUpOw0KKwlpZiAoIW10X2lzX2FsbG9jKG10KSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0K KwlpZiAoV0FSTl9PTl9PTkNFKG10X2lzX3Jlc2VydmVkKGVudHJ5KSkpDQorCQlyZXR1cm4gLUVJ TlZBTDsNCisNCisJaWYgKG1pbiA+IG1heCkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAo bWF4IDwgc2l6ZSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAoIXNpemUpDQorCQlyZXR1 cm4gLUVJTlZBTDsNCisNCisJbXRyZWVfbG9jayhtdCk7DQorcmV0cnk6DQorCW1hcy5vZmZzZXQg PSAwOw0KKwltYXMuaW5kZXggPSBtaW47DQorCW1hcy5sYXN0ID0gbWF4IC0gc2l6ZTsNCisJcmV0 ID0gbWFzX2FsbG9jKCZtYXMsIGVudHJ5LCBzaXplLCBzdGFydHApOw0KKwlpZiAobWFzX25vbWVt KCZtYXMsIGdmcCkpDQorCQlnb3RvIHJldHJ5Ow0KKw0KKwltdHJlZV91bmxvY2sobXQpOw0KKwly ZXR1cm4gcmV0Ow0KK30NCitFWFBPUlRfU1lNQk9MKG10cmVlX2FsbG9jX3JhbmdlKTsNCisNCitp bnQgbXRyZWVfYWxsb2NfcnJhbmdlKHN0cnVjdCBtYXBsZV90cmVlICptdCwgdW5zaWduZWQgbG9u ZyAqc3RhcnRwLA0KKwkJdm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQg bG9uZyBtaW4sDQorCQl1bnNpZ25lZCBsb25nIG1heCwgZ2ZwX3QgZ2ZwKQ0KK3sNCisJaW50IHJl dCA9IDA7DQorDQorCU1BX1NUQVRFKG1hcywgbXQsIG1pbiwgbWF4IC0gc2l6ZSk7DQorCWlmICgh bXRfaXNfYWxsb2MobXQpKQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCWlmIChXQVJOX09OX09O Q0UobXRfaXNfcmVzZXJ2ZWQoZW50cnkpKSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAo bWluID49IG1heCkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwlpZiAobWF4IDwgc2l6ZSAtIDEp DQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJaWYgKCFzaXplKQ0KKwkJcmV0dXJuIC1FSU5WQUw7 DQorDQorCW10cmVlX2xvY2sobXQpOw0KK3JldHJ5Og0KKwlyZXQgPSBtYXNfcmV2X2FsbG9jKCZt YXMsIG1pbiwgbWF4LCBlbnRyeSwgc2l6ZSwgc3RhcnRwKTsNCisJaWYgKG1hc19ub21lbSgmbWFz LCBnZnApKQ0KKwkJZ290byByZXRyeTsNCisNCisJbXRyZWVfdW5sb2NrKG10KTsNCisJcmV0dXJu IHJldDsNCit9DQorRVhQT1JUX1NZTUJPTChtdHJlZV9hbGxvY19ycmFuZ2UpOw0KKw0KKy8qKg0K KyAqIG10cmVlX2VyYXNlKCkgLSBGaW5kIGFuIGluZGV4IGFuZCBlcmFzZSB0aGUgZW50aXJlIHJh bmdlLg0KKyAqIEBtdDogVGhlIG1hcGxlIHRyZWUNCisgKiBAaW5kZXg6IFRoZSBpbmRleCB0byBl cmFzZQ0KKyAqDQorICogRXJhc2luZyBpcyB0aGUgc2FtZSBhcyBhIHdhbGsgdG8gYW4gZW50cnkg dGhlbiBhIHN0b3JlIG9mIGEgTlVMTCB0byB0aGF0DQorICogRU5USVJFIHJhbmdlLiAgSW4gZmFj dCwgaXQgaXMgaW1wbGVtZW50ZWQgYXMgc3VjaCB1c2luZyB0aGUgYWR2YW5jZWQgQVBJLg0KKyAq DQorICogUmV0dXJuOiBUaGUgZW50cnkgc3RvcmVkIGF0IHRoZSBAaW5kZXggb3IgJU5VTEwNCisg Ki8NCit2b2lkICptdHJlZV9lcmFzZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxv bmcgaW5kZXgpDQorew0KKwl2b2lkICplbnRyeSA9IE5VTEw7DQorDQorCU1BX1NUQVRFKG1hcywg bXQsIGluZGV4LCBpbmRleCk7DQorCXRyYWNlX21hX29wKF9fZnVuY19fLCAmbWFzKTsNCisNCisJ bXRyZWVfbG9jayhtdCk7DQorCWVudHJ5ID0gbWFzX2VyYXNlKCZtYXMpOw0KKwltdHJlZV91bmxv Y2sobXQpOw0KKw0KKwlyZXR1cm4gZW50cnk7DQorfQ0KK0VYUE9SVF9TWU1CT0wobXRyZWVfZXJh c2UpOw0KKw0KKy8qKg0KKyAqIF9fbXRfZGVzdHJveSgpIC0gV2FsayBhbmQgZnJlZSBhbGwgbm9k ZXMgb2YgYSBsb2NrZWQgbWFwbGUgdHJlZS4NCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICoN CisgKiBOb3RlOiBEb2VzIG5vdCBoYW5kbGUgbG9ja2luZy4NCisgKi8NCit2b2lkIF9fbXRfZGVz dHJveShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwl2b2lkICpyb290ID0gbXRfcm9vdF9s b2NrZWQobXQpOw0KKw0KKwlyY3VfYXNzaWduX3BvaW50ZXIobXQtPm1hX3Jvb3QsIE5VTEwpOw0K KwlpZiAoeGFfaXNfbm9kZShyb290KSkNCisJCW10ZV9kZXN0cm95X3dhbGsocm9vdCwgbXQpOw0K Kw0KKwltdC0+bWFfZmxhZ3MgPSAwOw0KK30NCitFWFBPUlRfU1lNQk9MX0dQTChfX210X2Rlc3Ry b3kpOw0KKw0KKy8qKg0KKyAqIG10cmVlX2Rlc3Ryb3koKSAtIERlc3Ryb3kgYSBtYXBsZSB0cmVl DQorICogQG10OiBUaGUgbWFwbGUgdHJlZQ0KKyAqDQorICogRnJlZXMgYWxsIHJlc291cmNlcyB1 c2VkIGJ5IHRoZSB0cmVlLiAgSGFuZGxlcyBsb2NraW5nLg0KKyAqLw0KK3ZvaWQgbXRyZWVfZGVz dHJveShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0KKwltdHJlZV9sb2NrKG10KTsNCisJX19t dF9kZXN0cm95KG10KTsNCisJbXRyZWVfdW5sb2NrKG10KTsNCit9DQorRVhQT1JUX1NZTUJPTCht dHJlZV9kZXN0cm95KTsNCisNCisvKioNCisgKiBtdF9maW5kKCkgLSBTZWFyY2ggZnJvbSB0aGUg c3RhcnQgdXAgdW50aWwgYW4gZW50cnkgaXMgZm91bmQuDQorICogQG10OiBUaGUgbWFwbGUgdHJl ZQ0KKyAqIEBpbmRleDogUG9pbnRlciB3aGljaCBjb250YWlucyB0aGUgc3RhcnQgbG9jYXRpb24g b2YgdGhlIHNlYXJjaA0KKyAqIEBtYXg6IFRoZSBtYXhpbXVtIHZhbHVlIHRvIGNoZWNrDQorICoN CisgKiBIYW5kbGVzIGxvY2tpbmcuICBAaW5kZXggd2lsbCBiZSBpbmNyZW1lbnRlZCB0byBvbmUg YmV5b25kIHRoZSByYW5nZS4NCisgKg0KKyAqIFJldHVybjogVGhlIGVudHJ5IGF0IG9yIGFmdGVy IHRoZSBAaW5kZXggb3IgJU5VTEwNCisgKi8NCit2b2lkICptdF9maW5kKHN0cnVjdCBtYXBsZV90 cmVlICptdCwgdW5zaWduZWQgbG9uZyAqaW5kZXgsIHVuc2lnbmVkIGxvbmcgbWF4KQ0KK3sNCisJ TUFfU1RBVEUobWFzLCBtdCwgKmluZGV4LCAqaW5kZXgpOw0KKwl2b2lkICplbnRyeTsNCisjaWZk ZWYgQ09ORklHX0RFQlVHX01BUExFX1RSRUUNCisJdW5zaWduZWQgbG9uZyBjb3B5ID0gKmluZGV4 Ow0KKyNlbmRpZg0KKw0KKwl0cmFjZV9tYV9yZWFkKF9fZnVuY19fLCAmbWFzKTsNCisNCisJaWYg KCgqaW5kZXgpID4gbWF4KQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCXJjdV9yZWFkX2xvY2soKTsN CityZXRyeToNCisJZW50cnkgPSBtYXNfc3RhdGVfd2FsaygmbWFzKTsNCisJaWYgKG1hc19pc19z dGFydCgmbWFzKSkNCisJCWdvdG8gcmV0cnk7DQorDQorCWlmICh1bmxpa2VseSh4YV9pc196ZXJv KGVudHJ5KSkpDQorCQllbnRyeSA9IE5VTEw7DQorDQorCWlmIChlbnRyeSkNCisJCWdvdG8gdW5s b2NrOw0KKw0KKwl3aGlsZSAobWFzX3NlYXJjaGFibGUoJm1hcykgJiYgKG1hcy5pbmRleCA8IG1h eCkpIHsNCisJCWVudHJ5ID0gbWFzX25leHRfZW50cnkoJm1hcywgbWF4KTsNCisJCWlmIChsaWtl bHkoZW50cnkgJiYgIXhhX2lzX3plcm8oZW50cnkpKSkNCisJCQlicmVhazsNCisJfQ0KKw0KKwlp ZiAodW5saWtlbHkoeGFfaXNfemVybyhlbnRyeSkpKQ0KKwkJZW50cnkgPSBOVUxMOw0KK3VubG9j azoNCisJcmN1X3JlYWRfdW5sb2NrKCk7DQorCWlmIChsaWtlbHkoZW50cnkpKSB7DQorCQkqaW5k ZXggPSBtYXMubGFzdCArIDE7DQorI2lmZGVmIENPTkZJR19ERUJVR19NQVBMRV9UUkVFDQorCQlp ZiAoKCppbmRleCkgJiYgKCppbmRleCkgPD0gY29weSkNCisJCQlwcmludGsoImluZGV4IG5vdCBp bmNyZWFzZWQhICVseCA8PSAlbHhcbiIsDQorCQkJICAgICAgICppbmRleCwgY29weSk7DQorCQlN VF9CVUdfT04obXQsICgqaW5kZXgpICYmICgoKmluZGV4KSA8PSBjb3B5KSk7DQorI2VuZGlmDQor CX0NCisNCisJcmV0dXJuIGVudHJ5Ow0KK30NCitFWFBPUlRfU1lNQk9MKG10X2ZpbmQpOw0KKw0K Ky8qKg0KKyAqIG10X2ZpbmRfYWZ0ZXIoKSAtIFNlYXJjaCBmcm9tIHRoZSBzdGFydCB1cCB1bnRp bCBhbiBlbnRyeSBpcyBmb3VuZC4NCisgKiBAbXQ6IFRoZSBtYXBsZSB0cmVlDQorICogQGluZGV4 OiBQb2ludGVyIHdoaWNoIGNvbnRhaW5zIHRoZSBzdGFydCBsb2NhdGlvbiBvZiB0aGUgc2VhcmNo DQorICogQG1heDogVGhlIG1heGltdW0gdmFsdWUgdG8gY2hlY2sNCisgKg0KKyAqIEhhbmRsZXMg bG9ja2luZywgZGV0ZWN0cyB3cmFwcGluZyBvbiBpbmRleCA9PSAwDQorICoNCisgKiBSZXR1cm46 IFRoZSBlbnRyeSBhdCBvciBhZnRlciB0aGUgQGluZGV4IG9yICVOVUxMDQorICovDQordm9pZCAq bXRfZmluZF9hZnRlcihzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHVuc2lnbmVkIGxvbmcgKmluZGV4 LA0KKwkJICAgIHVuc2lnbmVkIGxvbmcgbWF4KQ0KK3sNCisJaWYgKCEoKmluZGV4KSkNCisJCXJl dHVybiBOVUxMOw0KKw0KKwlyZXR1cm4gbXRfZmluZChtdCwgaW5kZXgsIG1heCk7DQorfQ0KK0VY UE9SVF9TWU1CT0wobXRfZmluZF9hZnRlcik7DQorDQorI2lmZGVmIENPTkZJR19ERUJVR19NQVBM RV9UUkVFDQorYXRvbWljX3QgbWFwbGVfdHJlZV90ZXN0c19ydW47DQorRVhQT1JUX1NZTUJPTF9H UEwobWFwbGVfdHJlZV90ZXN0c19ydW4pOw0KK2F0b21pY190IG1hcGxlX3RyZWVfdGVzdHNfcGFz c2VkOw0KK0VYUE9SVF9TWU1CT0xfR1BMKG1hcGxlX3RyZWVfdGVzdHNfcGFzc2VkKTsNCisNCisj aWZuZGVmIF9fS0VSTkVMX18NCitleHRlcm4gdm9pZCBrbWVtX2NhY2hlX3NldF9ub25fa2VybmVs KHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGludCk7DQordm9pZCBtdF9zZXRfbm9uX2tl cm5lbCh1bnNpZ25lZCBpbnQgdmFsKQ0KK3sNCisJa21lbV9jYWNoZV9zZXRfbm9uX2tlcm5lbCht YXBsZV9ub2RlX2NhY2hlLCB2YWwpOw0KK30NCisNCitleHRlcm4gdW5zaWduZWQgbG9uZyBrbWVt X2NhY2hlX2dldF9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqKTsNCit1bnNpZ25lZCBsb25nIG10 X2dldF9hbGxvY19zaXplKHZvaWQpDQorew0KKwlyZXR1cm4ga21lbV9jYWNoZV9nZXRfYWxsb2Mo bWFwbGVfbm9kZV9jYWNoZSk7DQorfQ0KKw0KK2V4dGVybiB2b2lkIGttZW1fY2FjaGVfemVyb19u cl90YWxsb2NhdGVkKHN0cnVjdCBrbWVtX2NhY2hlICopOw0KK3ZvaWQgbXRfemVyb19ucl90YWxs b2NhdGVkKCkNCit7DQorCWttZW1fY2FjaGVfemVyb19ucl90YWxsb2NhdGVkKG1hcGxlX25vZGVf Y2FjaGUpOw0KK30NCisNCitleHRlcm4gdW5zaWduZWQgaW50IGttZW1fY2FjaGVfbnJfdGFsbG9j YXRlZChzdHJ1Y3Qga21lbV9jYWNoZSAqKTsNCit1bnNpZ25lZCBpbnQgbXRfbnJfdGFsbG9jYXRl ZCgpDQorew0KKwlyZXR1cm4ga21lbV9jYWNoZV9ucl90YWxsb2NhdGVkKG1hcGxlX25vZGVfY2Fj aGUpOw0KK30NCisNCitleHRlcm4gdW5zaWduZWQgaW50IGttZW1fY2FjaGVfbnJfYWxsb2NhdGVk KHN0cnVjdCBrbWVtX2NhY2hlICopOw0KK3Vuc2lnbmVkIGludCBtdF9ucl9hbGxvY2F0ZWQoKQ0K K3sNCisJcmV0dXJuIGttZW1fY2FjaGVfbnJfYWxsb2NhdGVkKG1hcGxlX25vZGVfY2FjaGUpOw0K K30NCisNCisvKg0KKyAqIG1hc19kZWFkX25vZGUoKSAtIENoZWNrIGlmIHRoZSBtYXBsZSBzdGF0 ZSBpcyBwb2ludGluZyB0byBhIGRlYWQgbm9kZS4NCisgKiBAbWFzOiBUaGUgbWFwbGUgc3RhdGUN CisgKiBAaW5kZXg6IFRoZSBpbmRleCB0byByZXN0b3JlIGluIEBtYXMuDQorICoNCisgKiBVc2Vk IGluIHRlc3QgY29kZS4NCisgKiBSZXR1cm46IDEgaWYgQG1hcyBoYXMgYmVlbiByZXNldCB0byBN QVNfU1RBUlQsIDAgb3RoZXJ3aXNlLg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgaW50IG1hc19kZWFk X25vZGUoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgaW5kZXgpDQorew0KKyAg ICAgICBpZiAodW5saWtlbHkoIW1hc19zZWFyY2hhYmxlKG1hcykgfHwgbWFzX2lzX3N0YXJ0KG1h cykpKQ0KKyAgICAgICAgICAgICAgIHJldHVybiAwOw0KKw0KKyAgICAgICBpZiAobGlrZWx5KCFt dGVfZGVhZF9ub2RlKG1hcy0+bm9kZSkpKQ0KKyAgICAgICAgICAgICAgIHJldHVybiAwOw0KKw0K KyAgICAgICBtYXNfcmV3YWxrKG1hcywgaW5kZXgpOw0KKyAgICAgICByZXR1cm4gMTsNCit9DQor DQorI2RlZmluZSBNQV9QVFIgIiVwIg0KKyNlbHNlIC8qICBfX0tFUk5FTF9fIGlzIGRlZmluZWQg Ki8NCisjZGVmaW5lIE1BX1BUUiAiJXB4Ig0KKyNlbmRpZg0KKw0KKy8qDQorICogbWFzX2dldF9z bG90KCkgLSBHZXQgdGhlIGVudHJ5IGluIHRoZSBtYXBsZSBzdGF0ZSBub2RlIHN0b3JlZCBhdCBA b2Zmc2V0Lg0KKyAqIEBtYXM6IFRoZSBtYXBsZSBzdGF0ZQ0KKyAqIEBvZmZzZXQ6IFRoZSBvZmZz ZXQgaW50byB0aGUgc2xvdCBhcnJheSB0byBmZXRjaC4NCisgKg0KKyAqIFJldHVybjogVGhlIGVu dHJ5IHN0b3JlZCBhdCBAb2Zmc2V0Lg0KKyAqLw0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1hcGxl X2Vub2RlICptYXNfZ2V0X3Nsb3Qoc3RydWN0IG1hX3N0YXRlICptYXMsDQorCQl1bnNpZ25lZCBj aGFyIG9mZnNldCkNCit7DQorCXJldHVybiBtYXNfc2xvdChtYXMsIG1hX3Nsb3RzKG1hc19tbiht YXMpLCBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSkpLA0KKwkJICAgICAgIG9mZnNldCk7DQorfQ0K Kw0KKw0KKy8qDQorICogbWFzX2ZpcnN0X2VudHJ5KCkgLSBHbyB0aGUgZmlyc3QgbGVhZiBhbmQg ZmluZCB0aGUgZmlyc3QgZW50cnkuDQorICogQG1hczogdGhlIG1hcGxlIHN0YXRlLg0KKyAqIEBs aW1pdDogdGhlIG1heGltdW0gaW5kZXggdG8gY2hlY2suDQorICogQCpyX3N0YXJ0OiBQb2ludGVy IHRvIHNldCB0byB0aGUgcmFuZ2Ugc3RhcnQuDQorICoNCisgKiBTZXRzIG1hcy0+b2Zmc2V0IHRv IHRoZSBvZmZzZXQgb2YgdGhlIGVudHJ5LCByX3N0YXJ0IHRvIHRoZSByYW5nZSBtaW5pbXVtLg0K KyAqDQorICogUmV0dXJuOiBUaGUgZmlyc3QgZW50cnkgb3IgTUFTX05PTkUuDQorICovDQorc3Rh dGljIGlubGluZSB2b2lkICptYXNfZmlyc3RfZW50cnkoc3RydWN0IG1hX3N0YXRlICptYXMsIHN0 cnVjdCBtYXBsZV9ub2RlICptbiwNCisJCXVuc2lnbmVkIGxvbmcgbGltaXQsIGVudW0gbWFwbGVf dHlwZSBtdCkNCisNCit7DQorCXVuc2lnbmVkIGxvbmcgbWF4Ow0KKwl1bnNpZ25lZCBsb25nICpw aXZvdHM7DQorCXZvaWQgX19yY3UgKipzbG90czsNCisJdm9pZCAqZW50cnkgPSBOVUxMOw0KKw0K KwltYXMtPmluZGV4ID0gbWFzLT5taW47DQorCWlmIChtYXMtPmluZGV4ID4gbGltaXQpDQorCQln b3RvIG5vbmU7DQorDQorCW1heCA9IG1hcy0+bWF4Ow0KKwltYXMtPm9mZnNldCA9IDA7DQorCXdo aWxlIChsaWtlbHkoIW1hX2lzX2xlYWYobXQpKSkgew0KKwkJc2xvdHMgPSBtYV9zbG90cyhtbiwg bXQpOw0KKwkJcGl2b3RzID0gbWFfcGl2b3RzKG1uLCBtdCk7DQorCQltYXggPSBwaXZvdHNbMF07 DQorCQllbnRyeSA9IG1hc19zbG90KG1hcywgc2xvdHMsIDApOw0KKwkJaWYgKHVubGlrZWx5KG1h X2RlYWRfbm9kZShtbikpKQ0KKwkJCXJldHVybiBOVUxMOw0KKwkJbWFzLT5ub2RlID0gZW50cnk7 DQorCQltbiA9IG1hc19tbihtYXMpOw0KKwkJbXQgPSBtdGVfbm9kZV90eXBlKG1hcy0+bm9kZSk7 DQorCX0NCisNCisJbWFzLT5tYXggPSBtYXg7DQorCXNsb3RzID0gbWFfc2xvdHMobW4sIG10KTsN CisJZW50cnkgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCAwKTsNCisJaWYgKHVubGlrZWx5KG1hX2Rl YWRfbm9kZShtbikpKQ0KKwkJcmV0dXJuIE5VTEw7DQorDQorCS8qIFNsb3QgMCBvciAxIG11c3Qg YmUgc2V0ICovDQorCWlmIChtYXMtPmluZGV4ID4gbGltaXQpDQorCQlnb3RvIG5vbmU7DQorDQor CWlmKGxpa2VseShlbnRyeSkpDQorCQlyZXR1cm4gZW50cnk7DQorDQorCXBpdm90cyA9IG1hX3Bp dm90cyhtbiwgbXQpOw0KKwltYXMtPmluZGV4ID0gcGl2b3RzWzBdICsgMTsNCisJbWFzLT5vZmZz ZXQgPSAxOw0KKwllbnRyeSA9IG1hc19zbG90KG1hcywgc2xvdHMsIDEpOw0KKwlpZiAodW5saWtl bHkobWFfZGVhZF9ub2RlKG1uKSkpDQorCQlyZXR1cm4gTlVMTDsNCisNCisJaWYgKG1hcy0+aW5k ZXggPiBsaW1pdCkNCisJCWdvdG8gbm9uZTsNCisNCisJaWYobGlrZWx5KGVudHJ5KSkNCisJCXJl dHVybiBlbnRyeTsNCisNCitub25lOg0KKwlpZiAobGlrZWx5KCFtYV9kZWFkX25vZGUobW4pKSkN CisJCW1hcy0+bm9kZSA9IE1BU19OT05FOw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorLyogRGVw dGggZmlyc3Qgc2VhcmNoLCBwb3N0LW9yZGVyICovDQorc3RhdGljIHZvaWQgbWFzX2Rmc19wb3N0 b3JkZXIoc3RydWN0IG1hX3N0YXRlICptYXMsIHVuc2lnbmVkIGxvbmcgbWF4KQ0KK3sNCisNCisJ c3RydWN0IG1hcGxlX2Vub2RlICpwID0gTUFTX05PTkUsICptbiA9IG1hcy0+bm9kZTsNCisJdW5z aWduZWQgbG9uZyBwX21pbiwgcF9tYXg7DQorDQorCW1hc19uZXh0X25vZGUobWFzLCBtYXNfbW4o bWFzKSwgbWF4KTsNCisJaWYgKCFtYXNfaXNfbm9uZShtYXMpKQ0KKwkJcmV0dXJuOw0KKw0KKwlp ZiAobXRlX2lzX3Jvb3QobW4pKQ0KKwkJcmV0dXJuOw0KKw0KKwltYXMtPm5vZGUgPSBtbjsNCisJ bWFzX2FzY2VuZChtYXMpOw0KKwl3aGlsZSAobWFzLT5ub2RlICE9IE1BU19OT05FKSB7DQorCQlw ID0gbWFzLT5ub2RlOw0KKwkJcF9taW4gPSBtYXMtPm1pbjsNCisJCXBfbWF4ID0gbWFzLT5tYXg7 DQorCQltYXNfcHJldl9ub2RlKG1hcywgMCk7DQorCX0NCisNCisJaWYgKHAgPT0gTUFTX05PTkUp DQorCQlyZXR1cm47DQorDQorCW1hcy0+bm9kZSA9IHA7DQorCW1hcy0+bWF4ID0gcF9tYXg7DQor CW1hcy0+bWluID0gcF9taW47DQorfQ0KKw0KKy8qIFRyZWUgdmFsaWRhdGlvbnMgKi8NCitzdGF0 aWMgdm9pZCBtdF9kdW1wX25vZGUoY29uc3Qgc3RydWN0IG1hcGxlX3RyZWUgKm10LCB2b2lkICpl bnRyeSwNCisJCXVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQg aW50IGRlcHRoKTsNCitzdGF0aWMgdm9pZCBtdF9kdW1wX3JhbmdlKHVuc2lnbmVkIGxvbmcgbWlu LCB1bnNpZ25lZCBsb25nIG1heCwNCisJCQkgIHVuc2lnbmVkIGludCBkZXB0aCkNCit7DQorCXN0 YXRpYyBjb25zdCBjaGFyIHNwYWNlc1tdID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIjsNCisNCisJaWYgKG1pbiA9PSBtYXgpDQorCQlwcl9pbmZvKCIlLipzJWx1OiAiLCBkZXB0 aCAqIDIsIHNwYWNlcywgbWluKTsNCisJZWxzZQ0KKwkJcHJfaW5mbygiJS4qcyVsdS0lbHU6ICIs IGRlcHRoICogMiwgc3BhY2VzLCBtaW4sIG1heCk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG10X2R1 bXBfZW50cnkodm9pZCAqZW50cnksIHVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBsb25nIG1h eCwNCisJCQkgIHVuc2lnbmVkIGludCBkZXB0aCkNCit7DQorCW10X2R1bXBfcmFuZ2UobWluLCBt YXgsIGRlcHRoKTsNCisNCisJaWYgKHhhX2lzX3ZhbHVlKGVudHJ5KSkNCisJCXByX2NvbnQoInZh bHVlICVsZCAoMHglbHgpIFsiTUFfUFRSIl1cbiIsIHhhX3RvX3ZhbHVlKGVudHJ5KSwNCisJCQkJ eGFfdG9fdmFsdWUoZW50cnkpLCBlbnRyeSk7DQorCWVsc2UgaWYgKHhhX2lzX3plcm8oZW50cnkp KQ0KKwkJcHJfY29udCgiemVybyAoJWxkKVxuIiwgeGFfdG9faW50ZXJuYWwoZW50cnkpKTsNCisJ ZWxzZSBpZiAobXRfaXNfcmVzZXJ2ZWQoZW50cnkpKQ0KKwkJcHJfY29udCgiVU5LTk9XTiBFTlRS WSAoIk1BX1BUUiIpXG4iLCBlbnRyeSk7DQorCWVsc2UNCisJCXByX2NvbnQoIiJNQV9QVFIiXG4i LCBlbnRyeSk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG10X2R1bXBfcmFuZ2U2NChjb25zdCBzdHJ1 Y3QgbWFwbGVfdHJlZSAqbXQsIHZvaWQgKmVudHJ5LA0KKwkJCXVuc2lnbmVkIGxvbmcgbWluLCB1 bnNpZ25lZCBsb25nIG1heCwgdW5zaWduZWQgaW50IGRlcHRoKQ0KK3sNCisJc3RydWN0IG1hcGxl X3JhbmdlXzY0ICpub2RlID0gJm10ZV90b19ub2RlKGVudHJ5KS0+bXI2NDsNCisJYm9vbCBsZWFm ID0gbXRlX2lzX2xlYWYoZW50cnkpOw0KKwl1bnNpZ25lZCBsb25nIGZpcnN0ID0gbWluOw0KKwlp bnQgaTsNCisNCisJcHJfY29udCgiIGNvbnRlbnRzOiAiKTsNCisJZm9yIChpID0gMDsgaSA8IE1B UExFX1JBTkdFNjRfU0xPVFMgLSAxOyBpKyspDQorCQlwcl9jb250KCIiTUFfUFRSIiAlbHUgIiwg bm9kZS0+c2xvdFtpXSwgbm9kZS0+cGl2b3RbaV0pOw0KKwlwcl9jb250KCIiTUFfUFRSIlxuIiwg bm9kZS0+c2xvdFtpXSk7DQorCWZvciAoaSA9IDA7IGkgPCBNQVBMRV9SQU5HRTY0X1NMT1RTOyBp KyspIHsNCisJCXVuc2lnbmVkIGxvbmcgbGFzdCA9IG1heDsNCisNCisJCWlmIChpIDwgKE1BUExF X1JBTkdFNjRfU0xPVFMgLSAxKSkNCisJCQlsYXN0ID0gbm9kZS0+cGl2b3RbaV07DQorCQllbHNl IGlmICghbm9kZS0+c2xvdFtpXSAmJiBtYXggIT0gbXRfbWF4W210ZV9ub2RlX3R5cGUoZW50cnkp XSkNCisJCQlicmVhazsNCisJCWlmIChsYXN0ID09IDAgJiYgaSA+IDApDQorCQkJYnJlYWs7DQor CQlpZiAobGVhZikNCisJCQltdF9kdW1wX2VudHJ5KG10X3Nsb3QobXQsIG5vZGUtPnNsb3QsIGkp LA0KKwkJCQkJZmlyc3QsIGxhc3QsIGRlcHRoICsgMSk7DQorCQllbHNlIGlmIChub2RlLT5zbG90 W2ldKQ0KKwkJCW10X2R1bXBfbm9kZShtdCwgbXRfc2xvdChtdCwgbm9kZS0+c2xvdCwgaSksDQor CQkJCQlmaXJzdCwgbGFzdCwgZGVwdGggKyAxKTsNCisNCisJCWlmIChsYXN0ID09IG1heCkNCisJ CQlicmVhazsNCisJCWlmIChsYXN0ID4gbWF4KSB7DQorCQkJcHJfZXJyKCJub2RlICJNQV9QVFIi IGxhc3QgKCVsdSkgPiBtYXggKCVsdSkgYXQgcGl2b3QgJWQhXG4iLA0KKwkJCQkJbm9kZSwgbGFz dCwgbWF4LCBpKTsNCisJCQlicmVhazsNCisJCX0NCisJCWZpcnN0ID0gbGFzdCArIDE7DQorCX0N Cit9DQorDQorc3RhdGljIHZvaWQgbXRfZHVtcF9hcmFuZ2U2NChjb25zdCBzdHJ1Y3QgbWFwbGVf dHJlZSAqbXQsIHZvaWQgKmVudHJ5LA0KKwkJCXVuc2lnbmVkIGxvbmcgbWluLCB1bnNpZ25lZCBs b25nIG1heCwgdW5zaWduZWQgaW50IGRlcHRoKQ0KK3sNCisJc3RydWN0IG1hcGxlX2FyYW5nZV82 NCAqbm9kZSA9ICZtdGVfdG9fbm9kZShlbnRyeSktPm1hNjQ7DQorCWJvb2wgbGVhZiA9IG10ZV9p c19sZWFmKGVudHJ5KTsNCisJdW5zaWduZWQgbG9uZyBmaXJzdCA9IG1pbjsNCisJaW50IGk7DQor DQorCXByX2NvbnQoIiBjb250ZW50czogIik7DQorCWZvciAoaSA9IDA7IGkgPCBNQVBMRV9BUkFO R0U2NF9TTE9UUzsgaSsrKQ0KKwkJcHJfY29udCgiJWx1ICIsIG5vZGUtPmdhcFtpXSk7DQorCXBy X2NvbnQoInwgJTAyWCAlMDJYfCAiLCBub2RlLT5tZXRhLmVuZCwgbm9kZS0+bWV0YS5nYXApOw0K Kwlmb3IgKGkgPSAwOyBpIDwgTUFQTEVfQVJBTkdFNjRfU0xPVFMgLSAxOyBpKyspDQorCQlwcl9j b250KE1BX1BUUiIgJWx1ICIsIG5vZGUtPnNsb3RbaV0sIG5vZGUtPnBpdm90W2ldKTsNCisJcHJf Y29udChNQV9QVFIiXG4iLCBub2RlLT5zbG90W2ldKTsNCisJZm9yIChpID0gMDsgaSA8IE1BUExF X0FSQU5HRTY0X1NMT1RTOyBpKyspIHsNCisJCXVuc2lnbmVkIGxvbmcgbGFzdCA9IG1heDsNCisN CisJCWlmIChpIDwgKE1BUExFX0FSQU5HRTY0X1NMT1RTIC0gMSkpDQorCQkJbGFzdCA9IG5vZGUt PnBpdm90W2ldOw0KKwkJZWxzZSBpZiAoIW5vZGUtPnNsb3RbaV0pDQorCQkJYnJlYWs7DQorCQlp ZiAobGFzdCA9PSAwICYmIGkgPiAwKQ0KKwkJCWJyZWFrOw0KKwkJaWYgKGxlYWYpDQorCQkJbXRf ZHVtcF9lbnRyeShtdF9zbG90KG10LCBub2RlLT5zbG90LCBpKSwNCisJCQkJCWZpcnN0LCBsYXN0 LCBkZXB0aCArIDEpOw0KKwkJZWxzZSBpZiAobm9kZS0+c2xvdFtpXSkNCisJCQltdF9kdW1wX25v ZGUobXQsIG10X3Nsb3QobXQsIG5vZGUtPnNsb3QsIGkpLA0KKwkJCQkJZmlyc3QsIGxhc3QsIGRl cHRoICsgMSk7DQorDQorCQlpZiAobGFzdCA9PSBtYXgpDQorCQkJYnJlYWs7DQorCQlpZiAobGFz dCA+IG1heCkgew0KKwkJCXByX2Vycigibm9kZSAiTUFfUFRSIiBsYXN0ICglbHUpID4gbWF4ICgl bHUpIGF0IHBpdm90ICVkIVxuIiwNCisJCQkJCW5vZGUsIGxhc3QsIG1heCwgaSk7DQorCQkJYnJl YWs7DQorCQl9DQorCQlmaXJzdCA9IGxhc3QgKyAxOw0KKwl9DQorfQ0KKw0KK3N0YXRpYyB2b2lk IG10X2R1bXBfbm9kZShjb25zdCBzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQsIHZvaWQgKmVudHJ5LA0K KwkJdW5zaWduZWQgbG9uZyBtaW4sIHVuc2lnbmVkIGxvbmcgbWF4LCB1bnNpZ25lZCBpbnQgZGVw dGgpDQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqbm9kZSA9IG10ZV90b19ub2RlKGVudHJ5KTsN CisJdW5zaWduZWQgaW50IHR5cGUgPSBtdGVfbm9kZV90eXBlKGVudHJ5KTsNCisJdW5zaWduZWQg aW50IGk7DQorDQorCW10X2R1bXBfcmFuZ2UobWluLCBtYXgsIGRlcHRoKTsNCisNCisJcHJfY29u dCgibm9kZSAiTUFfUFRSIiBkZXB0aCAlZCB0eXBlICVkIHBhcmVudCAiTUFfUFRSLCBub2RlLCBk ZXB0aCwgdHlwZSwNCisJCQlub2RlID8gbm9kZS0+cGFyZW50IDogTlVMTCk7DQorCXN3aXRjaCAo dHlwZSkgew0KKwljYXNlIG1hcGxlX2RlbnNlOg0KKwkJcHJfY29udCgiXG4iKTsNCisJCWZvciAo aSA9IDA7IGkgPCBNQVBMRV9OT0RFX1NMT1RTOyBpKyspIHsNCisJCQlpZiAobWluICsgaSA+IG1h eCkNCisJCQkJcHJfY29udCgiT1VUIE9GIFJBTkdFOiAiKTsNCisJCQltdF9kdW1wX2VudHJ5KG10 X3Nsb3QobXQsIG5vZGUtPnNsb3QsIGkpLA0KKwkJCQkJbWluICsgaSwgbWluICsgaSwgZGVwdGgp Ow0KKwkJfQ0KKwkJYnJlYWs7DQorCWNhc2UgbWFwbGVfbGVhZl82NDoNCisJY2FzZSBtYXBsZV9y YW5nZV82NDoNCisJCW10X2R1bXBfcmFuZ2U2NChtdCwgZW50cnksIG1pbiwgbWF4LCBkZXB0aCk7 DQorCQlicmVhazsNCisJY2FzZSBtYXBsZV9hcmFuZ2VfNjQ6DQorCQltdF9kdW1wX2FyYW5nZTY0 KG10LCBlbnRyeSwgbWluLCBtYXgsIGRlcHRoKTsNCisJCWJyZWFrOw0KKw0KKwlkZWZhdWx0Og0K KwkJcHJfY29udCgiIFVOS05PV04gVFlQRVxuIik7DQorCX0NCit9DQorDQordm9pZCBtdF9kdW1w KGNvbnN0IHN0cnVjdCBtYXBsZV90cmVlICptdCkNCit7DQorCXZvaWQgKmVudHJ5ID0gcmN1X2Rl cmVmZXJlbmNlX2NoZWNrKG10LT5tYV9yb290LCBtdF9sb2NrZWQobXQpKTsNCisNCisJcHJfaW5m bygibWFwbGVfdHJlZSgiTUFfUFRSIikgZmxhZ3MgJVgsIGhlaWdodCAldSByb290ICJNQV9QVFIi XG4iLA0KKwkJIG10LCBtdC0+bWFfZmxhZ3MsIG10X2hlaWdodChtdCksIGVudHJ5KTsNCisJaWYg KCF4YV9pc19ub2RlKGVudHJ5KSkNCisJCW10X2R1bXBfZW50cnkoZW50cnksIDAsIDAsIDApOw0K KwllbHNlIGlmIChlbnRyeSkNCisJCW10X2R1bXBfbm9kZShtdCwgZW50cnksIDAsIG10X21heFtt dGVfbm9kZV90eXBlKGVudHJ5KV0sIDApOw0KK30NCisNCisvKg0KKyAqIENhbGN1bGF0ZSB0aGUg bWF4aW11bSBnYXAgaW4gYSBub2RlIGFuZCBjaGVjayBpZiB0aGF0J3Mgd2hhdCBpcyByZXBvcnRl ZCBpbg0KKyAqIHRoZSBwYXJlbnQgKHVubGVzcyByb290KS4NCisgKi8NCitzdGF0aWMgdm9pZCBt YXNfdmFsaWRhdGVfZ2FwcyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQorCXN0cnVjdCBtYXBs ZV9lbm9kZSAqbXRlID0gbWFzLT5ub2RlOw0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqcF9tbjsNCisJ dW5zaWduZWQgbG9uZyBnYXAgPSAwLCBtYXhfZ2FwID0gMDsNCisJdW5zaWduZWQgbG9uZyBwX2Vu ZCwgcF9zdGFydCA9IG1hcy0+bWluOw0KKwl1bnNpZ25lZCBjaGFyIHBfc2xvdDsNCisJdW5zaWdu ZWQgbG9uZyAqZ2FwcyA9IE5VTEw7DQorCXVuc2lnbmVkIGxvbmcgKnBpdm90cyA9IG1hX3Bpdm90 cyhtdGVfdG9fbm9kZShtdGUpLCBtdGVfbm9kZV90eXBlKG10ZSkpOw0KKwlpbnQgaTsNCisNCisJ aWYgKG1hX2lzX2RlbnNlKG10ZV9ub2RlX3R5cGUobXRlKSkpIHsNCisJCWZvciAoaSA9IDA7IGkg PCBtdF9zbG90X2NvdW50KG10ZSk7IGkrKykgew0KKwkJCWlmIChtYXNfZ2V0X3Nsb3QobWFzLCBp KSkgew0KKwkJCQlpZiAoZ2FwID4gbWF4X2dhcCkNCisJCQkJCW1heF9nYXAgPSBnYXA7DQorCQkJ CWdhcCA9IDA7DQorCQkJCWNvbnRpbnVlOw0KKwkJCX0NCisJCQlnYXArKzsNCisJCX0NCisJCWdv dG8gY291bnRlZDsNCisJfQ0KKw0KKwlnYXBzID0gbWFfZ2FwcyhtdGVfdG9fbm9kZShtdGUpLCBt dGVfbm9kZV90eXBlKG10ZSkpOw0KKwlmb3IgKGkgPSAwOyBpIDwgbXRfc2xvdF9jb3VudChtdGUp OyBpKyspIHsNCisJCXBfZW5kID0gbWFzX2xvZ2ljYWxfcGl2b3QobWFzLCBwaXZvdHMsIGksIG10 ZV9ub2RlX3R5cGUobXRlKSk7DQorDQorCQlpZiAoIWdhcHMpIHsNCisJCQlpZiAobWFzX2dldF9z bG90KG1hcywgaSkpIHsNCisJCQkJZ2FwID0gMDsNCisJCQkJZ290byBub3RfZW1wdHk7DQorCQkJ fQ0KKw0KKwkJCWdhcCArPSBwX2VuZCAtIHBfc3RhcnQgKyAxOw0KKwkJfSBlbHNlIHsNCisJCQl2 b2lkICplbnRyeSA9IG1hc19nZXRfc2xvdChtYXMsIGkpOw0KKw0KKwkJCWdhcCA9IGdhcHNbaV07 DQorCQkJaWYgKCFlbnRyeSkgew0KKwkJCQlpZiAoZ2FwICE9IHBfZW5kIC0gcF9zdGFydCArIDEp IHsNCisJCQkJCXByX2VycihNQV9QVFIiWyV1XSAtPiAiTUFfUFRSIiAlbHUgIT0gJWx1IC0gJWx1 ICsgMVxuIiwNCisJCQkJCQltYXNfbW4obWFzKSwgaSwNCisJCQkJCQltYXNfZ2V0X3Nsb3QobWFz LCBpKSwgZ2FwLA0KKwkJCQkJCXBfZW5kLCBwX3N0YXJ0KTsNCisJCQkJCW10X2R1bXAobWFzLT50 cmVlKTsNCisNCisJCQkJCU1UX0JVR19PTihtYXMtPnRyZWUsDQorCQkJCQkJZ2FwICE9IHBfZW5k IC0gcF9zdGFydCArIDEpOw0KKwkJCQl9DQorCQkJfSBlbHNlIHsNCisJCQkJaWYgKGdhcCA+IHBf ZW5kIC0gcF9zdGFydCArIDEpIHsNCisJCQkJCXByX2VycihNQV9QVFIiWyV1XSAlbHUgPj0gJWx1 IC0gJWx1ICsgMSAoJWx1KVxuIiwNCisJCQkJCW1hc19tbihtYXMpLCBpLCBnYXAsIHBfZW5kLCBw X3N0YXJ0LA0KKwkJCQkJcF9lbmQgLSBwX3N0YXJ0ICsgMSk7DQorCQkJCQlNVF9CVUdfT04obWFz LT50cmVlLA0KKwkJCQkJCWdhcCA+IHBfZW5kIC0gcF9zdGFydCArIDEpOw0KKwkJCQl9DQorCQkJ fQ0KKwkJfQ0KKw0KKwkJaWYgKGdhcCA+IG1heF9nYXApDQorCQkJbWF4X2dhcCA9IGdhcDsNCitu b3RfZW1wdHk6DQorCQlwX3N0YXJ0ID0gcF9lbmQgKyAxOw0KKwkJaWYgKHBfZW5kID49IG1hcy0+ bWF4KQ0KKwkJCWJyZWFrOw0KKwl9DQorDQorY291bnRlZDoNCisJaWYgKG10ZV9pc19yb290KG10 ZSkpDQorCQlyZXR1cm47DQorDQorCXBfc2xvdCA9IG10ZV9wYXJlbnRfc2xvdChtYXMtPm5vZGUp Ow0KKwlwX21uID0gbXRlX3BhcmVudChtdGUpOw0KKwlNVF9CVUdfT04obWFzLT50cmVlLCBtYXhf Z2FwID4gbWFzLT5tYXgpOw0KKwlpZiAobWFfZ2FwcyhwX21uLCBtYXNfcGFyZW50X2VudW0obWFz LCBtdGUpKVtwX3Nsb3RdICE9IG1heF9nYXApIHsNCisJCXByX2VycigiZ2FwICJNQV9QVFIiWyV1 XSAhPSAlbHVcbiIsIHBfbW4sIHBfc2xvdCwgbWF4X2dhcCk7DQorCQltdF9kdW1wKG1hcy0+dHJl ZSk7DQorCX0NCisNCisJTVRfQlVHX09OKG1hcy0+dHJlZSwNCisJCSAgbWFfZ2FwcyhwX21uLCBt YXNfcGFyZW50X2VudW0obWFzLCBtdGUpKVtwX3Nsb3RdICE9IG1heF9nYXApOw0KK30NCisNCitz dGF0aWMgdm9pZCBtYXNfdmFsaWRhdGVfcGFyZW50X3Nsb3Qoc3RydWN0IG1hX3N0YXRlICptYXMp DQorew0KKwlzdHJ1Y3QgbWFwbGVfbm9kZSAqcGFyZW50Ow0KKwlzdHJ1Y3QgbWFwbGVfZW5vZGUg Km5vZGU7DQorCWVudW0gbWFwbGVfdHlwZSBwX3R5cGUgPSBtYXNfcGFyZW50X2VudW0obWFzLCBt YXMtPm5vZGUpOw0KKwl1bnNpZ25lZCBjaGFyIHBfc2xvdCA9IG10ZV9wYXJlbnRfc2xvdChtYXMt Pm5vZGUpOw0KKwl2b2lkIF9fcmN1ICoqc2xvdHM7DQorCWludCBpOw0KKw0KKwlpZiAobXRlX2lz X3Jvb3QobWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJcGFyZW50ID0gbXRlX3BhcmVudCht YXMtPm5vZGUpOw0KKwlzbG90cyA9IG1hX3Nsb3RzKHBhcmVudCwgcF90eXBlKTsNCisJTVRfQlVH X09OKG1hcy0+dHJlZSwgbWFzX21uKG1hcykgPT0gcGFyZW50KTsNCisNCisJLyogQ2hlY2sgcHJl di9uZXh0IHBhcmVudCBzbG90IGZvciBkdXBsaWNhdGUgbm9kZSBlbnRyeSAqLw0KKw0KKwlmb3Ig KGkgPSAwOyBpIDwgbXRfc2xvdHNbcF90eXBlXTsgaSsrKSB7DQorCQlub2RlID0gbWFzX3Nsb3Qo bWFzLCBzbG90cywgaSk7DQorCQlpZiAoaSA9PSBwX3Nsb3QpIHsNCisJCQlpZiAobm9kZSAhPSBt YXMtPm5vZGUpDQorCQkJCXByX2VycigicGFyZW50ICVwWyV1XSBkb2VzIG5vdCBoYXZlICVwXG4i LA0KKwkJCQkJcGFyZW50LCBpLCBtYXNfbW4obWFzKSk7DQorCQkJTVRfQlVHX09OKG1hcy0+dHJl ZSwgbm9kZSAhPSBtYXMtPm5vZGUpOw0KKwkJfSBlbHNlIGlmIChub2RlID09IG1hcy0+bm9kZSkg ew0KKwkJCXByX2VycigicGFyZW50IGNvbnRhaW5zIGludmFsaWQgY2hpbGQgYXQgIk1BX1BUUiJb JXVdICINCisJCQkJTUFfUFRSIiBwX3Nsb3QgJXVcbiIsIHBhcmVudCwgaSwgbWFzX21uKG1hcyks IHBfc2xvdCk7DQorCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwgbm9kZSA9PSBtYXMtPm5vZGUpOw0K KwkJfQ0KKwl9DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG1hc192YWxpZGF0ZV9jaGlsZF9zbG90KHN0 cnVjdCBtYV9zdGF0ZSAqbWFzKQ0KK3sNCisJZW51bSBtYXBsZV90eXBlIHR5cGUgPSBtdGVfbm9k ZV90eXBlKG1hcy0+bm9kZSk7DQorCXZvaWQgX19yY3UgKipzbG90cyA9IG1hX3Nsb3RzKG10ZV90 b19ub2RlKG1hcy0+bm9kZSksIHR5cGUpOw0KKwl1bnNpZ25lZCBsb25nICpwaXZvdHMgPSBtYV9w aXZvdHMobXRlX3RvX25vZGUobWFzLT5ub2RlKSwgdHlwZSk7DQorCXN0cnVjdCBtYXBsZV9lbm9k ZSAqY2hpbGQ7DQorCXVuc2lnbmVkIGNoYXIgaTsNCisNCisJaWYgKG10ZV9pc19sZWFmKG1hcy0+ bm9kZSkpDQorCQlyZXR1cm47DQorDQorCWZvciAoaSA9IDA7IGkgPCBtdF9zbG90c1t0eXBlXTsg aSsrKSB7DQorCQljaGlsZCA9IG1hc19zbG90KG1hcywgc2xvdHMsIGkpOw0KKwkJaWYgKCFwaXZv dHNbaV0gfHwgcGl2b3RzW2ldID09IG1hcy0+bWF4KQ0KKwkJCWJyZWFrOw0KKw0KKwkJaWYgKCFj aGlsZCkNCisJCQlicmVhazsNCisNCisJCWlmIChtdGVfcGFyZW50X3Nsb3QoY2hpbGQpICE9IGkp IHsNCisJCQlwcl9lcnIoImNoaWxkIGhhcyBpbmNvcnJlY3Qgc2xvdCBhdCAiTUFfUFRSIlsldV0g Ig0KKwkJCQlNQV9QVFIiIGlzIHNldCB0byAldVxuIiwgbWFzX21uKG1hcyksDQorCQkJCWksIG10 ZV90b19ub2RlKGNoaWxkKSwgbXRlX3BhcmVudF9zbG90KGNoaWxkKSk7DQorCQkJTVRfQlVHX09O KG1hcy0+dHJlZSwgMSk7DQorCQl9DQorDQorCQlpZiAobXRlX3BhcmVudChjaGlsZCkgIT0gbXRl X3RvX25vZGUobWFzLT5ub2RlKSkgew0KKwkJCXByX2VycigiY2hpbGQgIk1BX1BUUiIgaGFzIHBh cmVudCAiTUFfUFRSIiBub3QgIk1BX1BUUiJcbiIsDQorCQkJbXRlX3RvX25vZGUoY2hpbGQpLCBt dGVfcGFyZW50KGNoaWxkKSwNCisJCQltdGVfdG9fbm9kZShtYXMtPm5vZGUpKTsNCisJCQlNVF9C VUdfT04obWFzLT50cmVlLCAxKTsNCisJCX0NCisJfQ0KK30NCisNCisvKg0KKyAqIFZhbGlkYXRl IGFsbCBwaXZvdHMgYXJlIHdpdGhpbiBtYXMtPm1pbiBhbmQgbWFzLT5tYXguDQorICovDQorc3Rh dGljIHZvaWQgbWFzX3ZhbGlkYXRlX2xpbWl0cyhzdHJ1Y3QgbWFfc3RhdGUgKm1hcykNCit7DQor CWludCBpOw0KKwl1bnNpZ25lZCBsb25nIHByZXZfcGl2ID0gMDsNCisJdm9pZCBfX3JjdSAqKnNs b3RzID0gbWFfc2xvdHMobXRlX3RvX25vZGUobWFzLT5ub2RlKSwNCisJCQkJbXRlX25vZGVfdHlw ZShtYXMtPm5vZGUpKTsNCisNCisJLyogYWxsIGxpbWl0cyBhcmUgZmluZSBoZXJlLiAqLw0KKwlp ZiAobXRlX2lzX3Jvb3QobWFzLT5ub2RlKSkNCisJCXJldHVybjsNCisNCisJZm9yIChpID0gMDsg aSA8IG10X3Nsb3RfY291bnQobWFzLT5ub2RlKTsgaSsrKSB7DQorCQllbnVtIG1hcGxlX3R5cGUg dHlwZSA9IG10ZV9ub2RlX3R5cGUobWFzLT5ub2RlKTsNCisJCXVuc2lnbmVkIGxvbmcgKnBpdm90 cyA9IG1hX3Bpdm90cyhtYXNfbW4obWFzKSwgdHlwZSk7DQorCQl1bnNpZ25lZCBsb25nIHBpdiA9 IG1hc19zYWZlX3Bpdm90KG1hcywgcGl2b3RzLCB0eXBlLCBpKTsNCisNCisJCWlmICghcGl2KQ0K KwkJCWJyZWFrOw0KKw0KKwkJaWYgKCFtdGVfaXNfbGVhZihtYXMtPm5vZGUpKSB7DQorCQkJdm9p ZCAqZW50cnkgPSBtYXNfc2xvdChtYXMsIHNsb3RzLCBpKTsNCisJCQlpZiAoIWVudHJ5KQ0KKwkJ CQlwcl9lcnIoTUFfUFRSIlsldV0gY2Fubm90IGJlIG51bGxcbiIsDQorCQkJCSAgICAgICBtYXNf bW4obWFzKSwgaSk7DQorDQorCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwgIWVudHJ5KTsNCisJCX0N CisNCisJCWlmIChwcmV2X3BpdiA+IHBpdikgew0KKwkJCXByX2VycihNQV9QVFIiWyV1XSBwaXYg JWx1IDwgcHJldl9waXYgJWx1XG4iLA0KKwkJCQltYXNfbW4obWFzKSwgaSwgcGl2LCBwcmV2X3Bp dik7DQorCQkJTVRfQlVHX09OKG1hcy0+dHJlZSwgcGl2IDwgcHJldl9waXYpOw0KKwkJfQ0KKw0K KwkJaWYgKHBpdiA8IG1hcy0+bWluKSB7DQorCQkJcHJfZXJyKE1BX1BUUiJbJXVdICVsdSA8ICVs dVxuIiwgbWFzX21uKG1hcyksIGksDQorCQkJCXBpdiwgbWFzLT5taW4pOw0KKwkJCU1UX0JVR19P TihtYXMtPnRyZWUsIHBpdiA8IG1hcy0+bWluKTsNCisJCX0NCisJCWlmIChwaXYgPiBtYXMtPm1h eCkgew0KKwkJCXByX2VycihNQV9QVFIiWyV1XSAlbHUgPiAlbHVcbiIsIG1hc19tbihtYXMpLCBp LA0KKwkJCQlwaXYsIG1hcy0+bWF4KTsNCisJCQlNVF9CVUdfT04obWFzLT50cmVlLCBwaXYgPiBt YXMtPm1heCk7DQorCQl9DQorCQlwcmV2X3BpdiA9IHBpdjsNCisJCWlmIChwaXYgPT0gbWFzLT5t YXgpDQorCQkJYnJlYWs7DQorCX0NCit9DQorDQorc3RhdGljIHZvaWQgbXRfdmFsaWRhdGVfbnVs bHMoc3RydWN0IG1hcGxlX3RyZWUgKm10KQ0KK3sNCisJdm9pZCAqZW50cnksICpsYXN0ID0gKHZv aWQgKikxOw0KKwl1bnNpZ25lZCBjaGFyIG9mZnNldCA9IDA7DQorCXZvaWQgX19yY3UgKipzbG90 czsNCisJTUFfU1RBVEUobWFzLCBtdCwgMCwgMCk7DQorDQorCW1hc19zdGFydCgmbWFzKTsNCisJ aWYgKG1hc19pc19ub25lKCZtYXMpIHx8IChtYXMubm9kZSA9PSBNQVNfUk9PVCkpDQorCQlyZXR1 cm47DQorDQorCXdoaWxlICghbXRlX2lzX2xlYWYobWFzLm5vZGUpKQ0KKwkJbWFzX2Rlc2NlbmQo Jm1hcyk7DQorDQorCXNsb3RzID0gbWFfc2xvdHMobXRlX3RvX25vZGUobWFzLm5vZGUpLCBtdGVf bm9kZV90eXBlKG1hcy5ub2RlKSk7DQorCWRvIHsNCisJCWVudHJ5ID0gbWFzX3Nsb3QoJm1hcywg c2xvdHMsIG9mZnNldCk7DQorCQlpZiAoIWxhc3QgJiYgIWVudHJ5KSB7DQorCQkJcHJfZXJyKCJT ZXF1ZW50aWFsIG51bGxzIGVuZCBhdCAlcFsldV1cbiIsDQorCQkJCW1hc19tbigmbWFzKSwgb2Zm c2V0KTsNCisJCX0NCisJCU1UX0JVR19PTihtdCwgIWxhc3QgJiYgIWVudHJ5KTsNCisJCWxhc3Qg PSBlbnRyeTsNCisJCWlmIChvZmZzZXQgPT0gbWFzX2RhdGFfZW5kKCZtYXMpKSB7DQorCQkJbWFz X25leHRfbm9kZSgmbWFzLCBtYXNfbW4oJm1hcyksIFVMT05HX01BWCk7DQorCQkJaWYgKG1hc19p c19ub25lKCZtYXMpKQ0KKwkJCQlyZXR1cm47DQorCQkJb2Zmc2V0ID0gMDsNCisJCQlzbG90cyA9 IG1hX3Nsb3RzKG10ZV90b19ub2RlKG1hcy5ub2RlKSwNCisJCQkJCSBtdGVfbm9kZV90eXBlKG1h cy5ub2RlKSk7DQorCQl9IGVsc2UNCisJCQlvZmZzZXQrKzsNCisNCisJfSB3aGlsZSAoIW1hc19p c19ub25lKCZtYXMpKTsNCit9DQorDQorLyoNCisgKiB2YWxpZGF0ZSBhIG1hcGxlIHRyZWUgYnkg Y2hlY2tpbmc6DQorICogMS4gVGhlIGxpbWl0cyAocGl2b3RzIGFyZSB3aXRoaW4gbWFzLT5taW4g dG8gbWFzLT5tYXgpDQorICogMi4gVGhlIGdhcCBpcyBjb3JyZWN0bHkgc2V0IGluIHRoZSBwYXJl bnRzDQorICovDQordm9pZCBtdF92YWxpZGF0ZShzdHJ1Y3QgbWFwbGVfdHJlZSAqbXQpDQorew0K Kwl1bnNpZ25lZCBjaGFyIGVuZDsNCisNCisJTUFfU1RBVEUobWFzLCBtdCwgMCwgMCk7DQorCXJj dV9yZWFkX2xvY2soKTsNCisJbWFzX3N0YXJ0KCZtYXMpOw0KKwlpZiAoIW1hc19zZWFyY2hhYmxl KCZtYXMpKQ0KKwkJZ290byBkb25lOw0KKw0KKwltYXNfZmlyc3RfZW50cnkoJm1hcywgbWFzX21u KCZtYXMpLCBVTE9OR19NQVgsIG10ZV9ub2RlX3R5cGUobWFzLm5vZGUpKTsNCisJd2hpbGUgKCFt YXNfaXNfbm9uZSgmbWFzKSkgew0KKwkJTVRfQlVHX09OKG1hcy50cmVlLCBtdGVfZGVhZF9ub2Rl KG1hcy5ub2RlKSk7DQorCQlpZiAoIW10ZV9pc19yb290KG1hcy5ub2RlKSkgew0KKwkJCWVuZCA9 IG1hc19kYXRhX2VuZCgmbWFzKTsNCisJCQlpZiAoKGVuZCA8IG10X21pbl9zbG90X2NvdW50KG1h cy5ub2RlKSkgJiYNCisJCQkgICAgKG1hcy5tYXggIT0gVUxPTkdfTUFYKSkgew0KKwkJCQlwcl9l cnIoIkludmFsaWQgc2l6ZSAldSBvZiAiTUFfUFRSIlxuIiwgZW5kLA0KKwkJCQltYXNfbW4oJm1h cykpOw0KKwkJCQlNVF9CVUdfT04obWFzLnRyZWUsIDEpOw0KKwkJCX0NCisNCisJCX0NCisJCW1h c192YWxpZGF0ZV9wYXJlbnRfc2xvdCgmbWFzKTsNCisJCW1hc192YWxpZGF0ZV9jaGlsZF9zbG90 KCZtYXMpOw0KKwkJbWFzX3ZhbGlkYXRlX2xpbWl0cygmbWFzKTsNCisJCWlmIChtdF9pc19hbGxv YyhtdCkpDQorCQkJbWFzX3ZhbGlkYXRlX2dhcHMoJm1hcyk7DQorCQltYXNfZGZzX3Bvc3RvcmRl cigmbWFzLCBVTE9OR19NQVgpOw0KKwl9DQorCW10X3ZhbGlkYXRlX251bGxzKG10KTsNCitkb25l Og0KKwlyY3VfcmVhZF91bmxvY2soKTsNCisNCit9DQorDQorI2VuZGlmIC8qIENPTkZJR19ERUJV R19NQVBMRV9UUkVFICovDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlLy5n aXRpZ25vcmUgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvLmdpdGlnbm9yZQ0KaW5kZXggZDk3 MTUxNjQwMWU2Li5jOTAxZDk2ZGQwMTMgMTAwNjQ0DQotLS0gYS90b29scy90ZXN0aW5nL3JhZGl4 LXRyZWUvLmdpdGlnbm9yZQ0KKysrIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlLy5naXRpZ25v cmUNCkBAIC02LDMgKzYsNSBAQCBtYWluDQogbXVsdGlvcmRlcg0KIHJhZGl4LXRyZWUuYw0KIHhh cnJheQ0KK21hcGxlDQorbWFfeGFfYmVuY2htYXJrDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGlu Zy9yYWRpeC10cmVlL2dlbmVyYXRlZC9hdXRvY29uZi5oIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10 cmVlL2dlbmVyYXRlZC9hdXRvY29uZi5oDQppbmRleCAyMjE4YjNjYzE4NGUuLmU3ZGE4MDM1MDIz NiAxMDA2NDQNCi0tLSBhL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9nZW5lcmF0ZWQvYXV0b2Nv bmYuaA0KKysrIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2dlbmVyYXRlZC9hdXRvY29uZi5o DQpAQCAtMSArMSwyIEBADQogI2RlZmluZSBDT05GSUdfWEFSUkFZX01VTFRJIDENCisjZGVmaW5l IENPTkZJR182NEJJVCAxDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xp bnV4L21hcGxlX3RyZWUuaCBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51eC9tYXBsZV90 cmVlLmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLjg5ZjU2MWU2 ODg0MQ0KLS0tIC9kZXYvbnVsbA0KKysrIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4 L21hcGxlX3RyZWUuaA0KQEAgLTAsMCArMSw3IEBADQorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZp ZXI6IEdQTC0yLjArICovDQorI2RlZmluZSBhdG9taWNfdCBpbnQzMl90DQorI2luY2x1ZGUgIi4u Ly4uLy4uLy4uL2luY2x1ZGUvbGludXgvbWFwbGVfdHJlZS5oIg0KKyNkZWZpbmUgYXRvbWljX2lu Yyh4KSB1YXRvbWljX2luYyh4KQ0KKyNkZWZpbmUgYXRvbWljX3JlYWQoeCkgdWF0b21pY19yZWFk KHgpDQorI2RlZmluZSBhdG9taWNfc2V0KHgsIHkpIGRvIHt9IHdoaWxlKDApDQorI2RlZmluZSBV OF9NQVggVUNIQVJfTUFYDQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL21h cGxlLmMgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0KbmV3IGZpbGUgbW9kZSAx MDA2NDQNCmluZGV4IDAwMDAwMDAwMDAwMC4uMzUwODI2NzE5MjhhDQotLS0gL2Rldi9udWxsDQor KysgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbWFwbGUuYw0KQEAgLTAsMCArMSw1OSBAQA0K Ky8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKw0KKy8qDQorICogbWFwbGVfdHJl ZS5jOiBVc2Vyc3BhY2Ugc2hpbSBmb3IgbWFwbGUgdHJlZSB0ZXN0LXN1aXRlDQorICogQ29weXJp Z2h0IChjKSAyMDE4IExpYW0gUi4gSG93bGV0dCA8TGlhbS5Ib3dsZXR0QE9yYWNsZS5jb20+DQor ICovDQorDQorI2RlZmluZSBDT05GSUdfREVCVUdfTUFQTEVfVFJFRQ0KKyNkZWZpbmUgQ09ORklH X01BUExFX1NFQVJDSA0KKyNpbmNsdWRlICJ0ZXN0LmgiDQorDQorI2RlZmluZSBtb2R1bGVfaW5p dCh4KQ0KKyNkZWZpbmUgbW9kdWxlX2V4aXQoeCkNCisjZGVmaW5lIE1PRFVMRV9BVVRIT1IoeCkN CisjZGVmaW5lIE1PRFVMRV9MSUNFTlNFKHgpDQorI2RlZmluZSBkdW1wX3N0YWNrKCkJYXNzZXJ0 KDApDQorDQorI2luY2x1ZGUgIi4uLy4uLy4uL2xpYi9tYXBsZV90cmVlLmMiDQorI3VuZGVmIENP TkZJR19ERUJVR19NQVBMRV9UUkVFDQorI2luY2x1ZGUgIi4uLy4uLy4uL2xpYi90ZXN0X21hcGxl X3RyZWUuYyINCisNCit2b2lkIGZhcm1lcl90ZXN0cyh2b2lkKQ0KK3sNCisJc3RydWN0IG1hcGxl X25vZGUgKm5vZGU7DQorCURFRklORV9NVFJFRSh0cmVlKTsNCisNCisJbXRfZHVtcCgmdHJlZSk7 DQorDQorCXRyZWUubWFfcm9vdCA9IHhhX21rX3ZhbHVlKDApOw0KKwltdF9kdW1wKCZ0cmVlKTsN CisNCisJbm9kZSA9IG10X2FsbG9jX29uZShHRlBfS0VSTkVMKTsNCisJbm9kZS0+cGFyZW50ID0g KHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKCZ0cmVlKSB8IDEpOw0KKwlub2RlLT5zbG90WzBdID0g eGFfbWtfdmFsdWUoMCk7DQorCW5vZGUtPnNsb3RbMV0gPSB4YV9ta192YWx1ZSgxKTsNCisJbm9k ZS0+bXI2NC5waXZvdFswXSA9IDA7DQorCW5vZGUtPm1yNjQucGl2b3RbMV0gPSAxOw0KKwlub2Rl LT5tcjY0LnBpdm90WzJdID0gMDsNCisJdHJlZS5tYV9yb290ID0gbXRfbWtfbm9kZShub2RlLCBt YXBsZV9sZWFmXzY0KTsNCisJbXRfZHVtcCgmdHJlZSk7DQorDQorCW1hX2ZyZWVfcmN1KG5vZGUp Ow0KK30NCisNCit2b2lkIG1hcGxlX3RyZWVfdGVzdHModm9pZCkNCit7DQorCWZhcm1lcl90ZXN0 cygpOw0KKwltYXBsZV90cmVlX3NlZWQoKTsNCisJbWFwbGVfdHJlZV9oYXJ2ZXN0KCk7DQorfQ0K Kw0KK2ludCBfX3dlYWsgbWFpbih2b2lkKQ0KK3sNCisJbWFwbGVfdHJlZV9pbml0KCk7DQorCW1h cGxlX3RyZWVfdGVzdHMoKTsNCisJcmN1X2JhcnJpZXIoKTsNCisJaWYgKG5yX2FsbG9jYXRlZCkN CisJCXByaW50ZigibnJfYWxsb2NhdGVkID0gJWRcbiIsIG5yX2FsbG9jYXRlZCk7DQorCXJldHVy biAwOw0KK30NCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvdHJhY2UvZXZl bnRzL21hcGxlX3RyZWUuaCBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS90cmFjZS9ldmVudHMv bWFwbGVfdHJlZS5oDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAwLi5l NjUzZDAyMzY2M2INCi0tLSAvZGV2L251bGwNCisrKyBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJl ZS90cmFjZS9ldmVudHMvbWFwbGVfdHJlZS5oDQpAQCAtMCwwICsxLDMgQEANCisjZGVmaW5lIHRy YWNlX21hX29wKGEsIGIpIGRvIHt9IHdoaWxlKDApOw0KKyNkZWZpbmUgdHJhY2VfbWFfcmVhZChh LCBiKSBkbyB7fSB3aGlsZSgwKTsNCisjZGVmaW5lIHRyYWNlX21hX3dyaXRlKGEsIGIsIGMsIGQp IGRvIHt9IHdoaWxlKDApOw0KLS0gDQoyLjM1LjENCg==