From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9FC163932CE; Sat, 15 Aug 2026 22:19:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=148.163.129.52 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786832383; cv=fail; b=qeada1KYjY939Ugda7t/PbNk0LcEFFf07wwjobfUJADA5jM65qhNPNuoXCGWqyvkOaauNruLKSNic6IGK3iSO2l2iXShUf0s+nXuSU0cgnwAcT8IoF5EuwodKFRYTYx+8XLwL/aOuFnt1zxTAobAS43jzDBkFNm8u85oJuJT/nw= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786832383; c=relaxed/simple; bh=wHYY0363Hx6pLLChIeHboN5zQ6j8Z2gNh39rUis6GaM=; h=From:To:CC:Subject:Date:Message-ID:References:In-Reply-To: Content-Type:MIME-Version; b=YqcI6q8KkM7CKmsYBb0Ya2Kl4iWDvuKTxm7/py0+1WTkAT5DoeLpeFv7ni89D55DoWOjFEsHgswD4kgq5jR8AMON36woxt8kNcXyIlGfFmJX/j+PVPx/CDL90jLUGjEtUhsQ/JXIFG9ZBwXVKTsDlX5yKUXZzC9fjOH8UwVahU8= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sitime.com; spf=pass smtp.mailfrom=sitime.com; dkim=pass (2048-bit key) header.d=sitime.com header.i=@sitime.com header.b=cnd8WfZE; dkim=pass (2048-bit key) header.d=Sitime.onmicrosoft.com header.i=@Sitime.onmicrosoft.com header.b=xVRgRZoo; arc=fail smtp.client-ip=148.163.129.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=sitime.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sitime.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sitime.com header.i=@sitime.com header.b="cnd8WfZE"; dkim=pass (2048-bit key) header.d=Sitime.onmicrosoft.com header.i=@Sitime.onmicrosoft.com header.b="xVRgRZoo" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sitime.com; h=cc:cc:content-transfer-encoding:content-transfer-encoding:content-type:content-type:date:date:from:from:in-reply-to:in-reply-to:message-id:message-id:mime-version:mime-version:references:references:subject:subject:to:to; s=mail; bh=wHYY0363Hx6pLLChIeHboN5zQ6j8Z2gNh39rUis6GaM=; b=cnd8WfZEqqXGSyowPVwwDRery+U8YoJrspTxBGIosktdGGukg9EN44bI2OJ84nWNV/pqFqEnI/1uAjhO/8amttwtJp2zzUvhNKhXTYBZ8k2PP3SybVpj/7cp1sKbalZNl9ga3Gli+0vhALOaCahznZqpfv9+3cP0Dq8vEM1/MmRT9XWp3+Zn5vm6LkItuNW/+ekdijqMi/EFkojO67Hs9k0Pb5fpRNejnzntg9cFF9ZNZIuj5Hcw+NNKNkc6kEDxjF5hZr/TKhVzBZCjpz0Gvfoex1cb62gH1grcSHypv0JOe8snxmLMMb+O2wfuNkyoBbU/CfFnGnL0xe/zxvBVuw== X-Virus-Scanned: Proofpoint Essentials engine Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11023083.outbound.protection.outlook.com [40.107.201.83]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mx1-us1.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id F014924006A; Sat, 15 Aug 2026 22:19:26 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=irQXWGn2GM21Ll26UrYnvZnQXKWAZc3AK/zRHvZYvUwktE/khh6HwxywZ/ZnC6Lys+4DFBANaijXOo1iQr4CPOf/RfpLFwqcUjxXZ8ttkWz5+I8K2oNwq8Sb48drEYZ/QvoSX2a5l8W+cUcu/iX2m4EtRF1cGqPjJwE01Sjv3Fx86jHL9h28+2lAZFLcQIIhuqPURoTIu231kKnDZtPa2KTKJrgJ+S79UxOoo2wTlHd0/sUHPj8bGji8/VvVAPJeypaqvKctgJetFv0EHgDosTJ0856aif2pnf2sLszxLAi7dnURlU1zzHFrwBFx6rbo//ejJITqwkWepHDVZPUHUA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=wHYY0363Hx6pLLChIeHboN5zQ6j8Z2gNh39rUis6GaM=; b=ubieuc3XB0Wm1LPuH41Mw8cmFYladSjUrHoxzjgKz5oK9EoxgVHXlXQo1oHzK40FMAiDtfioOjyCS6caAgCXed2nKMsHhLr4GSrIqn2AOJGzhEbrJEFHiVbFG00Tj1vStPWX76w+fEmONEGEwLgfinoilBT+b67yzneJNR5bQowkduA6QVzSp4l/dXZn0ToKRXRPjRgfjxUHPPEG+VCdId/iWEesb/2hGmll6B5kLalhwlaJSVHQcuKhDv2eHcf3BxQ6FbmUX7SI2BPWnRCbmdtA2E7HWCGUHk3BlL7TsiBtBEDU6uwgPwq2YcqoBl+nn0zA75FC1WaOhe+s7Y28Vg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=sitime.com; dmarc=pass action=none header.from=sitime.com; dkim=pass header.d=sitime.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Sitime.onmicrosoft.com; s=selector1-Sitime-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wHYY0363Hx6pLLChIeHboN5zQ6j8Z2gNh39rUis6GaM=; b=xVRgRZooaP7TU8I4qAIGVYv9F2c8//47PGUCMvuz7jjoayvqIJYgeZVzxd/9fy8qU5jQBIeKUzfvPoKFgLyrVd56TOW+bnOb5DYuiP4ke+Dzr0sRLeuQL0TfFCwIu+XVj/MpbkwgF6BfxTEXKX5AwMrCTYxdoG86cuZC7+1rJ8e+j56ImSg1CM42t/MAKRrI2Zxq/KuNe8VRy7tcAPGcr11XrOulDS+J7Laopa/bp5Int59UdoHJvoqWduKsxlgN9aJqCQz6+16B/clxz6zaT0cEj8jsDJo9USkpZwGG77hKWR4NnZaMBdG876VATVaTnkN8Sm2Zs6PUl1UStjFaEg== Received: from LVWPR20MB994915.namprd20.prod.outlook.com (2603:10b6:408:3bf::16) by SA1PR20MB5128.namprd20.prod.outlook.com (2603:10b6:806:254::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.315.13; Sat, 15 Aug 2026 22:19:23 +0000 Received: from LVWPR20MB994915.namprd20.prod.outlook.com ([fe80::9551:3864:128b:8c01]) by LVWPR20MB994915.namprd20.prod.outlook.com ([fe80::9551:3864:128b:8c01%5]) with mapi id 15.21.0315.014; Sat, 15 Aug 2026 22:19:23 +0000 From: Ali Rouhi To: "jiri@resnulli.us" CC: "vadim.fedorenko@linux.dev" , "arkadiusz.kubalewski@intel.com" , "robh@kernel.org" , "krzk+dt@kernel.org" , "conor+dt@kernel.org" , "cjubran@nvidia.com" , "Oleg.Zadorozhnyi@devoxsoftware.com" , "devicetree@vger.kernel.org" , "netdev@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Ali Rouhi Subject: [PATCH net-next v7 3/3] dpll: add SiTime SiT9531x DPLL clock driver Thread-Topic: [PATCH net-next v7 3/3] dpll: add SiTime SiT9531x DPLL clock driver Thread-Index: AQHdLQQfSg/FkjsHkkS39O51qCIspQ== Date: Sat, 15 Aug 2026 22:19:23 +0000 Message-ID: <20260815221919.64226-4-arouhi@sitime.com> References: <20260815221919.64226-1-arouhi@sitime.com> In-Reply-To: <20260815221919.64226-1-arouhi@sitime.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=sitime.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: LVWPR20MB994915:EE_|SA1PR20MB5128:EE_ x-ms-office365-filtering-correlation-id: 4399c2b9-f872-419f-db82-08defb1b4277 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|23010399003|1800799024|366016|376014|38070700021|56012099006|10067099003|22082099003|5023799004|18002099003|6133799003|3023799007; x-microsoft-antispam-message-info: LhNQnCHFlH9asKzqARVDrOUUj3MF1y+yGhNwCoYhIorZDNf52xlAqWbPP3DoMqRKm0ZvxyLHd/y7DPWfoPFGOn+VcEqcE9nn8lgC+dsv3bg9Euv4pRIonbAvjhfEa/ccYi4pse7yDwRjxnX1cqRnDAeJpbM3aHK+QTu6X8U1hPfbILNyY4naWERx3oSDn0r9oRcasu29GYNNi881YZRTb2QG7dcg/T3B0lExK/0NJn/Pj9Fvyn6tJ/9Ht1aPVq9tbPn43ItPHcOQMKG8TkIbnTdFUiLQTDsMMfAcZewBCRo1sqe14pM9QuVCMpYeg1JKnLI0tEtgTniPy2NabOYs6Z+kyW6byUW+HSVYi1mwc9zjb9NOSkbuAVv3xiQ5Ty98LWWsT64U/aPQteQvpgaSXNrFsKiBYtYNOgFt6Rqi2Kb1Xfs3er/LS5YRA/zaFWNWOWGhquSop+Fb01x3v1AE/Yg12cMOOUQ9GEBn4CH09cEJ8iyZSCSePUVsX05LZlI4YsumKlZSyfUPcgg3zHR9GTZ31FILQYk6TJJU39EOqdueYWVbZU1JF5mMO2WkcCzoSPiux4tgQ+zI8zng1qvGmugZmrhnd2idRhhA8rs7p/PFFRdVJh6RZdzPqVOPx1r1HugBj6Ry8gVH+gvgq9kSgS+hoe89cg4qPYl06mlvTx8= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:LVWPR20MB994915.namprd20.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(23010399003)(1800799024)(366016)(376014)(38070700021)(56012099006)(10067099003)(22082099003)(5023799004)(18002099003)(6133799003)(3023799007);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?SUlSeGExUHNuTHNXM25iamY4REtFUDVxeWpZQVZKNkZ3ay9MY3EzWnpFMWtj?= =?utf-8?B?VC9jMlhFRE9zUkNyaTgrTXZSMytIeVh0WGxKTEpQcE9ReDU0amtoNnJMZW1l?= =?utf-8?B?bW5sRTZ3WHZQVjJ5TnRTVWFTMHVHWnBaM1NoNDVDY3lQVzZ5ZEZyUHgrK1lG?= =?utf-8?B?QS9hT0p4MlIzaG5KckVzY1ZhZUJqemJ3eEZZV29TWHFmYklqWGZGTnBLaVpo?= =?utf-8?B?amdldTUzbEFZY2tGSjBOV3RjVlA0VzJ0UFo2TnhxRHBQSmJWbUwxaTA1MDZX?= =?utf-8?B?NkZSOVVKZ0xteC9MaGRucXV1VFpzNWs1WFJ6T0xUT0tlVlFmMmVXeThERnpa?= =?utf-8?B?cE9sUmJDZFVFZ1dXR3VNb2hOODZ3Q3J1MUVya2ZlOHRTOWFjbFE5S210bS8v?= =?utf-8?B?bExjMEQxVnMra29GdjJWWmZlcUtTSkhuRm90bGsyNzUvV1ZFZ215eHhSamFM?= =?utf-8?B?SGZWcDRUWlEyNFZqUlh1Si96Rkw0MTg5SzFYalNLK3pxVkJxMmVOZGgzTTFM?= =?utf-8?B?cHlzM3VFUEdLYy80Z3pScThFMVNzRzNvcmFuZVRaNTRYbHo0NzhVTW1vZUxk?= =?utf-8?B?VDkwZkgzUkNvTzdXRmI1ZWYrejhBTHNvaHhjaHBtYllWSEpSek5ocFpERi9n?= =?utf-8?B?V0NoMHZxM0hSb3BMZnorNXpuK3FVRTlsNXJlOGpWamFWb0prN0ZFazhOcHE4?= =?utf-8?B?elpONFY0LzRDZTZYT2Q0S1NNMlQxVm42Q3FnSE42aTNSYW1yNEgxeTV4V21O?= =?utf-8?B?TWhNdzRZejVLZFlESWZiN2lQTXBPSHpMSStJbHhZUUh5R1p0TExINU9LSnph?= =?utf-8?B?NXg5Nmh5OWQram9jYTgzd0lyYUpYd3VtVXUzNm1sM2ZKaGhkemo0WkhXaXBD?= =?utf-8?B?SEtLRjVQdzB2L2JUV2kwcnhvN0xieVBMTWdDSGJMcGdoYnIwSHV3TVhLckl4?= =?utf-8?B?cEppZHhRSzV3V09RTHNjYUJ4UDd5S0tZSFV0Y1o5azZtcjFFRmRJNjc0M0xT?= =?utf-8?B?ZmZaOXhEVnNQdUVxak9BdzY4VHBRWW8wQmlzMVVTZXRMVHlRblBsSHlaOWFr?= =?utf-8?B?THBQaDBaMzJ5bEJ0S2xzZ09IMmZITlVxUHJBSjhjSWtIcGZtZFJ5U2l4VGNX?= =?utf-8?B?eXBPRGc0bG01bm5ZczhobzRNWURFbThpNUhiN2tyOThiZk9yYU1rajJzc3gv?= =?utf-8?B?UU05OVV2NCtnOFdtcGtDa0RZUGtPcVdpY1pKclMzbEhDa0N5WUN2dnVrd0lP?= =?utf-8?B?d01Cam5WY1djTnZOYWZzMm9Zd052QW5wMkV0cFRkZTcwbHppRncweUlIbVVV?= =?utf-8?B?S3FqT0gyZmVYc3M5SDhidXlnWmJhclQyZFZ1Mk5TOHRHRHRoSEtkM0c2QTls?= =?utf-8?B?VkpBQTV2T2piNjh2bzg3UlVyVk1HcFFqcUp6QW5EY2VhL3BBUFB6N1R1OG0x?= =?utf-8?B?a1QzbFB4RHJtbjMwZ0JMOS9BZGoyYmNxcXRNRjZVcUN2SG1qVUk1VFU2R21y?= =?utf-8?B?V0ZqNDFaZ0VycFpUMGFzeWxyNmlMYnF1VEs1WmVWK0FWczE2U1JRTWJ3SXdW?= =?utf-8?B?ck13T0lJNzM4NmlNWHJCQzFsWWhlNlMvMk41Rm9ET0htelkwdFRpVTFnb3R0?= =?utf-8?B?aDQ3VUd5YlJvZzVNaWZTeFZXNCtkckMzdmR5SmRJMjJib09kUTFNVlhNM2Fs?= =?utf-8?B?Q0pUV0d2cDY3WDJEeFJ0QnJqR0Vnbm9ycmgycUFuOXJ0Q2R6cTJ3bEJoeGh5?= =?utf-8?B?QXVWckJkaU1xMmF4azN0Zno1ckV6UVhNL1MvaFVRVTFXaldtYVkybjRXT3k3?= =?utf-8?B?MHNLTzhibzU4bmpKcTVLZlRxR0d1K1ZoSE5QTEQvbEdxOVBxUUQ3STg3Rlh5?= =?utf-8?B?SGcvVGRIMU44aGlDenZ0d0pLelAvSU0wTm4rTHA5NzAvN0VXelA1RGoyaXJT?= =?utf-8?B?T1c2cG1oNUtaUGJkWjRHNGd5L0FadWF0KzlFMVlxa1F5emdEaGZ1UW8vSHND?= =?utf-8?B?d2hUWWdOOGxOUFJ4RFhLbFNqcUpJZVJoam02MHJXUVFQVGpHQ1l5SVlnR3JR?= =?utf-8?B?L2wxdjhzbElNcnA1Q1QrcUlxdHREcXo1azhiSVpVUjRTWFZQSWM0aStyZ01J?= =?utf-8?B?U2VFWGZoWVJZOUZtbStLYUwvYmIwN3YrTWlqbHU1b09nelZCQ0F0cUJ1OE9J?= =?utf-8?B?MWJHR2REOFAwQnhsQTkxZmhXU3BJSzgvUjlzL2M3YTJSMFBjenp2ZHpvT0Jm?= =?utf-8?B?V0VNbWM2ZCtsMDZBbTRRT1JRdzlYUG9BK0ZCemY1YUZSeWliNE9obG1BakM3?= =?utf-8?Q?zSklTg9J+1gL6m0N2N?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Exchange-RoutingPolicyChecked: besz+oI0ZICqZAXulslcKtrztNpv9/WW+vyLlQShdHbJRzn3uYoow7UjVHCKkdWRhn7P/08vHwgMQy7b2JfoEA0zJMI+FXWD8hWj1KrQzTKp1tccP5jtNkI5h9JjjQeMukfKiMYc6/do1hg/SXi5NOH4EqaOGUDH4kc8KCl+EzWJhmcLL1TZCVpFqtkdIiGPj1uH9Nm6Ub3u48UcyPsAmnjnprzviGnSXr5r2weYPoiAN5T/p7dMyz9sag5KVT592wtQZ4EYBsmD305BxdmvxwCitCNkbJvwoGqD2Qnp6dX8ZUvuaa8RW1SRwr9DTbc4T2oKbQ4yLAXbLmhmWoT7sw== X-OriginatorOrg: sitime.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: LVWPR20MB994915.namprd20.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4399c2b9-f872-419f-db82-08defb1b4277 X-MS-Exchange-CrossTenant-originalarrivaltime: 15 Aug 2026 22:19:23.0456 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 8fb55916-cf10-4b0d-96f4-cf3952657263 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: tiKnByR2hhlVbLV3YzZBaMLug8vkwrum5UP+Cm6JDrBvTj/ltniWZZAT4wTTqEVIkllH4HjRI6Z3+VNrxFPI+A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR20MB5128 X-MDID: 1786832367-IHe8ML9zEidw X-PPE-STACK: {"stack":"us1"} X-MDID-O: us1;ut7;1786832367;IHe8ML9zEidw;;ee4c095510f4a2bc549243be2f087a38 X-PPE-TRUSTED: V=1;DIR=OUT; QWRkIGEgRFBMTCBzdWJzeXN0ZW0gZHJpdmVyIGZvciB0aGUgU2lUaW1lIFNpVDk1MzE2IGFuZCBT aVQ5NTMxNwpjbG9jayBnZW5lcmF0b3JzLiBUaGVzZSBkZXZpY2VzIHByb3ZpZGUgbG93LWppdHRl ciBjbG9jayBvdXRwdXRzCmNvbW1vbmx5IHVzZWQgaW4gdGVsZWNvbSwgbmV0d29ya2luZywgYW5k IGRhdGEgY2VudGVyIHRpbWluZwphcHBsaWNhdGlvbnMuCgpUaGUgZHJpdmVyIGV4cG9zZXMgYWxs IGlucHV0cyBhbmQgb3V0cHV0cyB0aHJvdWdoIHRoZSBMaW51eCBEUExMCnN1YnN5c3RlbSwgc3Vw cG9ydGluZzoKIC0gTG9jayBzdGF0dXMgbW9uaXRvcmluZyB2aWEgcmVnaXN0ZXIgcG9sbGluZyBv ciBvcHRpb25hbCBJTlRSQiBJUlEKIC0gSW5wdXQgcHJpb3JpdHkgbWFuYWdlbWVudCBmb3IgYXV0 b21hdGljIHJlZmVyZW5jZSBzd2l0Y2hvdmVyCiAtIFBlci1vdXRwdXQgZnJlcXVlbmN5IHJlYWRi YWNrIGZyb20gaGFyZHdhcmUgc3RhdGUKIC0gUGhhc2Ugb2Zmc2V0IG1lYXN1cmVtZW50IHZpYSBU REMgKHRpbWUtdG8tZGlnaXRhbCBjb252ZXJ0ZXIpCiAtIFBoYXNlIGFkanVzdG1lbnQgZm9yIGZp bmUgb3V0cHV0IGFsaWdubWVudAogLSBFbWJlZGRlZCBzeW5jIChlc3luYykgcHVsc2UgY29udHJv bCBvbiBvdXRwdXRzCiAtIEZyYWN0aW9uYWwgZnJlcXVlbmN5IG9mZnNldCBvZiB0aGUgc2VsZWN0 ZWQgcmVmZXJlbmNlCiAtIE9wdGlvbmFsIHJlc2V0LWdwaW9zIGZvciBoYXJkd2FyZSByZXNldAoK VGhlIGRyaXZlciByZWFkcyBhbGwgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBkZXZpY2UncyBvbi1j aGlwIE5WTQphdCBwcm9iZSB0aW1lIC0tIG5vIGZpcm13YXJlIGxvYWRpbmcgaXMgcmVxdWlyZWQu CgpDby1kZXZlbG9wZWQtYnk6IE9sZWcgWmFkb3JvemhueWkgPE9sZWcuWmFkb3JvemhueWlAZGV2 b3hzb2Z0d2FyZS5jb20+ClNpZ25lZC1vZmYtYnk6IE9sZWcgWmFkb3JvemhueWkgPE9sZWcuWmFk b3JvemhueWlAZGV2b3hzb2Z0d2FyZS5jb20+CkFzc2lzdGVkLWJ5OiBDbGF1ZGU6Y2xhdWRlLTQt b3B1cyBbY2hhdF0KU2lnbmVkLW9mZi1ieTogQWxpIFJvdWhpIDxhcm91aGlAc2l0aW1lLmNvbT4K LS0tCiBNQUlOVEFJTkVSUyAgICAgICAgICAgICAgICAgICAgfCAgICA3ICsKIGRyaXZlcnMvZHBs bC9LY29uZmlnICAgICAgICAgICB8ICAgIDEgKwogZHJpdmVycy9kcGxsL01ha2VmaWxlICAgICAg ICAgIHwgICAgMSArCiBkcml2ZXJzL2RwbGwvc2l0OTUzMXgvS2NvbmZpZyAgfCAgIDE3ICsKIGRy aXZlcnMvZHBsbC9zaXQ5NTMxeC9NYWtlZmlsZSB8ICAgIDQgKwogZHJpdmVycy9kcGxsL3NpdDk1 MzF4L2NvcmUuYyAgIHwgMzExMSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogZHJp dmVycy9kcGxsL3NpdDk1MzF4L2NvcmUuaCAgIHwgIDM3MiArKysrCiBkcml2ZXJzL2RwbGwvc2l0 OTUzMXgvZHBsbC5jICAgfCAxMjMyICsrKysrKysrKysrKysKIGRyaXZlcnMvZHBsbC9zaXQ5NTMx eC9kcGxsLmggICB8ICAgNjkgKwogZHJpdmVycy9kcGxsL3NpdDk1MzF4L3Byb3AuYyAgIHwgIDM5 NyArKysrCiBkcml2ZXJzL2RwbGwvc2l0OTUzMXgvcHJvcC5oICAgfCAgIDM5ICsKIGRyaXZlcnMv ZHBsbC9zaXQ5NTMxeC9yZWdzLmggICB8ICAzNzEgKysrKwogMTIgZmlsZXMgY2hhbmdlZCwgNTYy MSBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9kcGxsL3NpdDk1MzF4 L0tjb25maWcKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2RwbGwvc2l0OTUzMXgvTWFrZWZp bGUKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2RwbGwvc2l0OTUzMXgvY29yZS5jCiBjcmVh dGUgbW9kZSAxMDA2NDQgZHJpdmVycy9kcGxsL3NpdDk1MzF4L2NvcmUuaAogY3JlYXRlIG1vZGUg MTAwNjQ0IGRyaXZlcnMvZHBsbC9zaXQ5NTMxeC9kcGxsLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL2RwbGwvc2l0OTUzMXgvZHBsbC5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9k cGxsL3NpdDk1MzF4L3Byb3AuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZHBsbC9zaXQ5 NTMxeC9wcm9wLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2RwbGwvc2l0OTUzMXgvcmVn cy5oCgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCBhODJiNmVj OWM1NjcuLjhkZmFiM2FjNmExNyAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRB SU5FUlMKQEAgLTI0OTA1LDYgKzI0OTA1LDEzIEBAIFM6CU1haW50YWluZWQKIFc6CWh0dHA6Ly93 d3cud2luaXNjaGhvZmVyLmF0L2xpbnV4c2lzdXNidmdhLnNodG1sCiBGOglkcml2ZXJzL3VzYi9t aXNjL3Npc3VzYnZnYS8KIAorU0lUSU1FIFNJVDk1MzFYIERQTEwgRFJJVkVSCitNOglBbGkgUm91 aGkgPGFyb3VoaUBzaXRpbWUuY29tPgorTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworUzoJTWFp bnRhaW5lZAorRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RwbGwvc2l0aW1l LHNpdDk1MzE2LnlhbWwKK0Y6CWRyaXZlcnMvZHBsbC9zaXQ5NTMxeC8KKwogU0wyOCBDUExEIE1G RCBEUklWRVIKIE06CU1pY2hhZWwgV2FsbGUgPG13YWxsZUBrZXJuZWwub3JnPgogUzoJTWFpbnRh aW5lZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kcGxsL0tjb25maWcgYi9kcml2ZXJzL2RwbGwvS2Nv bmZpZwppbmRleCBiZTk4OTY5ZjA0MGEuLmVhNzdiOWMxMWFiMSAxMDA2NDQKLS0tIGEvZHJpdmVy cy9kcGxsL0tjb25maWcKKysrIGIvZHJpdmVycy9kcGxsL0tjb25maWcKQEAgLTIzLDYgKzIzLDcg QEAgY29uZmlnIERQTExfUkVGQ05UX1RSQUNLRVIKIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAor c291cmNlICJkcml2ZXJzL2RwbGwvc2l0OTUzMXgvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9k cGxsL3psMzA3M3gvS2NvbmZpZyIKIAogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kcGxs L01ha2VmaWxlIGIvZHJpdmVycy9kcGxsL01ha2VmaWxlCmluZGV4IDllN2EzYTNlNTkyZS4uNGFk YzUwZDc0OGQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RwbGwvTWFrZWZpbGUKKysrIGIvZHJpdmVy cy9kcGxsL01ha2VmaWxlCkBAIC04LDQgKzgsNSBAQCBkcGxsLXkgICAgICAgICAgICAgICAgICAr PSBkcGxsX2NvcmUubwogZHBsbC15ICAgICAgICAgICAgICAgICAgKz0gZHBsbF9uZXRsaW5rLm8K IGRwbGwteSAgICAgICAgICAgICAgICAgICs9IGRwbGxfbmwubwogCitvYmotJChDT05GSUdfU0lU OTUzMVhfRFBMTCkJKz0gc2l0OTUzMXgvCiBvYmotJChDT05GSUdfWkwzMDczWCkJKz0gemwzMDcz eC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZHBsbC9zaXQ5NTMxeC9LY29uZmlnIGIvZHJpdmVycy9k cGxsL3NpdDk1MzF4L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw MDAwLi40N2FlYTg2NzQzMjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RwbGwvc2l0OTUz MXgvS2NvbmZpZwpAQCAtMCwwICsxLDE3IEBACisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wLW9ubHkKKworY29uZmlnIFNJVDk1MzFYX0RQTEwKKwl0cmlzdGF0ZSAiU2lUaW1lIFNp VDk1MzF4IERQTEwgZHJpdmVyIgorCWRlcGVuZHMgb24gSTJDICYmIE5FVAorCXNlbGVjdCBEUExM CisJc2VsZWN0IFJFR01BUF9JMkMKKwloZWxwCisJICBEcml2ZXIgZm9yIFNpVGltZSBTaVQ5NTMx eCBmYW1pbHkgY2xvY2sgZ2VuZXJhdG9ycworCSAgKFNpVDk1MzE3LCBTaVQ5NTMxNikuCisKKwkg IFRoaXMgZHJpdmVyIHJlZ2lzdGVycyBlYWNoIG9uLWNoaXAgUExMIGFzIGEgRFBMTCBkZXZpY2UK KwkgIGFuZCBleHBvc2VzIGlucHV0L291dHB1dCBjbG9ja3MgYXMgRFBMTCBwaW5zLCBwcm92aWRp bmcKKwkgIHJ1bnRpbWUgY29uZmlndXJhdGlvbiB2aWEgR2VuZXJpYyBOZXRsaW5rLgorCisJICBU byBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkg IG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzaXQ5NTMxeC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZHBs bC9zaXQ5NTMxeC9NYWtlZmlsZSBiL2RyaXZlcnMvZHBsbC9zaXQ5NTMxeC9NYWtlZmlsZQpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmI5N2QyNjU2YTQ2MAotLS0gL2Rl di9udWxsCisrKyBiL2RyaXZlcnMvZHBsbC9zaXQ5NTMxeC9NYWtlZmlsZQpAQCAtMCwwICsxLDQg QEAKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQorCitvYmotJChDT05G SUdfU0lUOTUzMVhfRFBMTCkgKz0gc2l0OTUzMXgubworc2l0OTUzMXgteSA6PSBjb3JlLm8gZHBs bC5vIHByb3AubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kcGxsL3NpdDk1MzF4L2NvcmUuYyBiL2Ry aXZlcnMvZHBsbC9zaXQ5NTMxeC9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAwMDAwLi5jZDI4MzkyMmU3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RwbGwv c2l0OTUzMXgvY29yZS5jCkBAIC0wLDAgKzEsMzExMSBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50 aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBTaVRpbWUgU2lUOTUzMXggRFBMTCBjb3JlIGRyaXZlcgor ICoKKyAqIENvcHlyaWdodCAoQykgMjAyNiBTaVRpbWUgQ29ycC4KKyAqIEF1dGhvcjogQWxpIFJv dWhpIDxhcm91aGlAc2l0aW1lLmNvbT4KKyAqIEF1dGhvcjogT2xlZyBaYWRvcm96aG55aSA8T2xl Zy5aYWRvcm96aG55aUBkZXZveHNvZnR3YXJlLmNvbT4KKyAqCisgKiBDb3JlIEkyQyBwcm9iZSwg cmVnbWFwIGNvbmZpZ3VyYXRpb24sIGhhcmR3YXJlIHN0YXRlIG1hbmFnZW1lbnQsCisgKiBhbmQg cGVyaW9kaWMgd29yayB0aHJlYWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdGZpZWxkLmg+ CisjaW5jbHVkZSA8bGludXgvYml0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1 ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2X3ByaW50ay5oPgorI2luY2x1 ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KKyNp bmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNs dWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVk ZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvcGVydHkuaD4KKyNpbmNsdWRl IDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGlu dXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAiZHBsbC5oIgorI2lu Y2x1ZGUgInByb3AuaCIKKyNpbmNsdWRlICJyZWdzLmgiCisKKy8qIE51bWJlciBvZiBpbnB1dCAr IG91dHB1dCBwaW4gcG9zaXRpb25zIGZvciBwaW4gaW5kZXggYWxsb2NhdGlvbiAqLworI2RlZmlu ZSBTSVQ5NTMxWF9OVU1fSU5QVVRfUElOUwkJKFNJVDk1MzFYX01BWF9JTlBVVFMgKyAyKSAvKiAr eHRhbCArSU5UU1lOQyAqLworI2RlZmluZSBTSVQ5NTMxWF9OVU1fT1VUUFVUX1BJTlMJKFNJVDk1 MzFYX01BWF9PVVRQVVRTICsgMSkgLyogK0lOVFNZTkMgc3JjICovCisjZGVmaW5lIFNJVDk1MzFY X05VTV9QSU5TX1RPVEFMCQkoU0lUOTUzMVhfTlVNX0lOUFVUX1BJTlMgKyBTSVQ5NTMxWF9OVU1f T1VUUFVUX1BJTlMpCisKKyNkZWZpbmUgU0lUOTUzMVhfQ0hJUChfaWQsIF9uaW4sIF9ub3V0LCBf bmFtZSwgX21hcCkgXAorCXsgLmlkID0gKF9pZCksIC5udW1faW5wdXRzID0gKF9uaW4pLCAubnVt X291dHB1dHMgPSAoX25vdXQpLCBcCisJICAubmFtZSA9IChfbmFtZSksIC5jbGtvdXRfbWFwID0g KF9tYXApIH0KKworLyogUGVyLXZhcmlhbnQgb3V0cHV0IGluZGV4IC0+IHBoeXNpY2FsIHNsb3Qg bWFwcGluZyAqLworc3RhdGljIGNvbnN0IHU4IGNsa291dF9tYXBfOTUzMTdbXSA9IHswLCAzLCA0 LCA1LCA3LCA4LCA5LCAxMX07CitzdGF0aWMgY29uc3QgdTggY2xrb3V0X21hcF85NTMxNltdID0g ezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMX07CisKK3N0YXRpYyBjb25zdCBz dHJ1Y3Qgc2l0OTUzMXhfY2hpcF9pbmZvIHNpdDk1MzF4X2NoaXBfaWRzW10gPSB7CisJU0lUOTUz MVhfQ0hJUChTSVQ5NTMxWF9WQVJJQU5UX0lEXzk1MzE3LCAgOCwgIDgsICJTaVQ5NTMxNyIsIGNs a291dF9tYXBfOTUzMTcpLAorCVNJVDk1MzFYX0NISVAoU0lUOTUzMVhfVkFSSUFOVF9JRF85NTMx NiwgIDgsIDEyLCAiU2lUOTUzMTYiLCBjbGtvdXRfbWFwXzk1MzE2KSwKK307CisKKyNkZWZpbmUg U0lUOTUzMVhfUkFOR0VfT0ZGU0VUCVNJVDk1MzFYX1BBR0VfU0laRQorCitzdGF0aWMgY29uc3Qg c3RydWN0IHJlZ21hcF9yYW5nZV9jZmcgc2l0OTUzMXhfcmVnbWFwX3JhbmdlID0geworCS5yYW5n ZV9taW4JPSBTSVQ5NTMxWF9SQU5HRV9PRkZTRVQsCisJLnJhbmdlX21heAk9IFNJVDk1MzFYX1JB TkdFX09GRlNFVCArCisJCQkgIChTSVQ5NTMxWF9OVU1fUEFHRVMgKiBTSVQ5NTMxWF9QQUdFX1NJ WkUpIC0gMSwKKwkuc2VsZWN0b3JfcmVnCT0gU0lUOTUzMVhfUEFHRV9TRUwsCisJLnNlbGVjdG9y X21hc2sJPSBHRU5NQVNLKDcsIDApLAorCS5zZWxlY3Rvcl9zaGlmdAk9IDAsCisJLndpbmRvd19z dGFydAk9IDAsCisJLndpbmRvd19sZW4JPSBTSVQ5NTMxWF9QQUdFX1NJWkUsCit9OworCitjb25z dCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzaXQ5NTMxeF9yZWdtYXBfY29uZmlnID0geworCS5yZWdf Yml0cwk9IDgsCisJLnZhbF9iaXRzCT0gOCwKKwkubWF4X3JlZ2lzdGVyCT0gU0lUOTUzMVhfUkFO R0VfT0ZGU0VUICsKKwkJCSAgKFNJVDk1MzFYX05VTV9QQUdFUyAqIFNJVDk1MzFYX1BBR0VfU0la RSkgLSAxLAorCS5yYW5nZXMJCT0gJnNpdDk1MzF4X3JlZ21hcF9yYW5nZSwKKwkubnVtX3Jhbmdl cwk9IDEsCisJLmNhY2hlX3R5cGUJPSBSRUdDQUNIRV9OT05FLAorfTsKKworLyoKKyAqIHNpdDk1 MzF4X3JlYWRfdTggLSByZWFkIGFuIDgtYml0IHJlZ2lzdGVyCisgKiBAcmVnOglyZWdpc3RlciBp biBTSVQ5NTMxWF9SRUcocGFnZSwgb2Zmc2V0KSBmb3JtCisgKiBAdmFsOglvdXRwdXQgdmFsdWUK KyAqLworaW50IHNpdDk1MzF4X3JlYWRfdTgoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2LCB1 bnNpZ25lZCBpbnQgcmVnLAorCQkgICAgIHU4ICp2YWwpCit7CisJdW5zaWduZWQgaW50IHRtcDsK KwlpbnQgcmM7CisKKwlyZWcgPSAoU0lUOTUzMVhfUkVHX1BBR0UocmVnKSAqIFNJVDk1MzFYX1BB R0VfU0laRSkgKworCSAgICAgIFNJVDk1MzFYX1JFR19PRkZTRVQocmVnKSArIFNJVDk1MzFYX1JB TkdFX09GRlNFVDsKKworCXJjID0gcmVnbWFwX3JlYWQoc2l0ZGV2LT5yZWdtYXAsIHJlZywgJnRt cCk7CisJaWYgKHJjKQorCQlkZXZfZXJyKHNpdGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgcmVn IDB4JTA0eDogJWRcbiIsCisJCQlyZWcsIHJjKTsKKwllbHNlCisJCSp2YWwgPSAodTgpdG1wOwor CisJcmV0dXJuIHJjOworfQorCisvKgorICogc2l0OTUzMXhfd3JpdGVfdTggLSB3cml0ZSBhbiA4 LWJpdCByZWdpc3RlcgorICogQHJlZzoJcmVnaXN0ZXIgaW4gU0lUOTUzMVhfUkVHKHBhZ2UsIG9m ZnNldCkgZm9ybQorICogQHZhbDoJdmFsdWUgdG8gd3JpdGUKKyAqLworaW50IHNpdDk1MzF4X3dy aXRlX3U4KHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwgdW5zaWduZWQgaW50IHJlZywKKwkJ ICAgICAgdTggdmFsKQoreworCWludCByYzsKKworCXJlZyA9IChTSVQ5NTMxWF9SRUdfUEFHRShy ZWcpICogU0lUOTUzMVhfUEFHRV9TSVpFKSArCisJICAgICAgU0lUOTUzMVhfUkVHX09GRlNFVChy ZWcpICsgU0lUOTUzMVhfUkFOR0VfT0ZGU0VUOworCisJcmMgPSByZWdtYXBfd3JpdGUoc2l0ZGV2 LT5yZWdtYXAsIHJlZywgdmFsKTsKKwlpZiAocmMpCisJCWRldl9lcnIoc2l0ZGV2LT5kZXYsICJG YWlsZWQgdG8gd3JpdGUgcmVnIDB4JTA0eDogJWRcbiIsCisJCQlyZWcsIHJjKTsKKworCXJldHVy biByYzsKK30KKworLyoKKyAqIHNpdDk1MzF4X3JlYWRfcGxsX3U4IC0gcmVhZCBhIHJlZ2lzdGVy IG9uIGEgUExMIHBhZ2UKKyAqIEB2YWw6CW91dHB1dCB2YWx1ZQorICovCitpbnQgc2l0OTUzMXhf cmVhZF9wbGxfdTgoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2LCB1OCBwbGxfaWR4LAorCQkJ IHU4IG9mZnNldCwgdTggKnZhbCkKK3sKKwlyZXR1cm4gc2l0OTUzMXhfcmVhZF91OChzaXRkZXYs CisJCQkJU0lUOTUzMVhfUkVHKHNpdDk1MzF4X3BsbF9wYWdlKHBsbF9pZHgpLCBvZmZzZXQpLAor CQkJCXZhbCk7Cit9CisKKy8qCisgKiBzaXQ5NTMxeF93cml0ZV9wbGxfdTggLSB3cml0ZSBhIHJl Z2lzdGVyIG9uIGEgUExMIHBhZ2UKKyAqIEB2YWw6CXZhbHVlIHRvIHdyaXRlCisgKi8KK2ludCBz aXQ5NTMxeF93cml0ZV9wbGxfdTgoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2LCB1OCBwbGxf aWR4LAorCQkJICB1OCBvZmZzZXQsIHU4IHZhbCkKK3sKKwlyZXR1cm4gc2l0OTUzMXhfd3JpdGVf dTgoc2l0ZGV2LAorCQkJCSBTSVQ5NTMxWF9SRUcoc2l0OTUzMXhfcGxsX3BhZ2UocGxsX2lkeCks IG9mZnNldCksCisJCQkJIHZhbCk7Cit9CisKKy8qCisgKiBzaXQ5NTMxeF91cGRhdGVfcGxsX3U4 IC0gcmVhZC1tb2RpZnktd3JpdGUgYSByZWdpc3RlciBvbiBhIFBMTCBwYWdlCisgKiBAbWFzazoJ Yml0cyB0byBtb2RpZnkKKyAqIEB2YWw6CW5ldyB2YWx1ZSBmb3IgbWFza2VkIGJpdHMKKyAqLwor aW50IHNpdDk1MzF4X3VwZGF0ZV9wbGxfdTgoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2LCB1 OCBwbGxfaWR4LAorCQkJICAgdTggb2Zmc2V0LCB1OCBtYXNrLCB1OCB2YWwpCit7CisJdW5zaWdu ZWQgaW50IHJlZzsKKworCXJlZyA9IChzaXQ5NTMxeF9wbGxfcGFnZShwbGxfaWR4KSAqIFNJVDk1 MzFYX1BBR0VfU0laRSkgKworCSAgICAgIG9mZnNldCArIFNJVDk1MzFYX1JBTkdFX09GRlNFVDsK KworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoc2l0ZGV2LT5yZWdtYXAsIHJlZywgbWFzaywg dmFsKTsKK30KKworLyoKKyAqIHNpdDk1MzF4X2lucHV0X2dldF9yZWdzIC0gZ2V0IGZvcmNlIG1h c2sgYW5kIHN0YXRlIHJlZ2lzdGVyIGFkZHJlc3NlcworICogQGluZGV4Oglsb2dpY2FsIGlucHV0 IGluZGV4CisgKiBAZm9yY2VfcmVnOglvdXRwdXQgZm9yY2UgbWFzayByZWdpc3RlciBhZGRyZXNz CisgKiBAc3RhdGVfcmVnOglvdXRwdXQgc3RhdGUgcmVnaXN0ZXIgYWRkcmVzcworICoKKyAqIFNl bGVjdHMgdGhlIGNvcnJlY3QgUGFnZSAweDAyIHJlZ2lzdGVyIHBhaXIgYmFzZWQgb24gdGhlIHBh aXIncworICogc2lnbmFsIG1vZGUgYW5kIHRoZSBsYW5lIChQL04pIHRoZSBpbmRleCByZWZlcnMg dG8uCisgKi8KK3N0YXRpYyB2b2lkIHNpdDk1MzF4X2lucHV0X2dldF9yZWdzKGNvbnN0IHN0cnVj dCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwKKwkJCQkgICAgdTggaW5kZXgsCisJCQkJICAgIHVuc2ln bmVkIGludCAqZm9yY2VfcmVnLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnN0YXRlX3JlZykKK3sK KwlpZiAoc2l0ZGV2LT5yZWZbaW5kZXhdLnNpZ19tb2RlID09IFNJVDk1MzFYX01PREVfREUpIHsK KwkJKmZvcmNlX3JlZyA9IFNJVDk1MzFYX1JFR19JTl9ERV9GT1JDRTsKKwkJKnN0YXRlX3JlZyA9 IFNJVDk1MzFYX1JFR19JTl9ERV9TVEFURTsKKwl9IGVsc2UgaWYgKHNpdDk1MzF4X2lucHV0X2lz X24oaW5kZXgpKSB7CisJCSpmb3JjZV9yZWcgPSBTSVQ5NTMxWF9SRUdfSU5fU0VOX0ZPUkNFOwor CQkqc3RhdGVfcmVnID0gU0lUOTUzMVhfUkVHX0lOX1NFTl9TVEFURTsKKwl9IGVsc2UgeworCQkq Zm9yY2VfcmVnID0gU0lUOTUzMVhfUkVHX0lOX1NFUF9GT1JDRTsKKwkJKnN0YXRlX3JlZyA9IFNJ VDk1MzFYX1JFR19JTl9TRVBfU1RBVEU7CisJfQorfQorCisvKgorICogc2l0OTUzMXhfaW5wdXRf ZGlzYWJsZSAtIGRpc2FibGUgYW4gaW5wdXQgcmVmZXJlbmNlCisgKiBAaW5kZXg6CWxvZ2ljYWwg aW5wdXQgaW5kZXggKDAtTikKKyAqCisgKiBTZXRzIHRoZSBmb3JjZSBtYXNrIGJpdCBhbmQgY2xl YXJzIHRoZSBzdGF0ZSBiaXQgZm9yIHRoZSBnaXZlbgorICogaW5wdXQsIGVmZmVjdGl2ZWx5IGRp c2FibGluZyBpdC4gIFJlZ2lzdGVyIHNlbGVjdGlvbiBkZXBlbmRzIG9uCisgKiB0aGUgcGFpcidz IHNpZ25hbCBtb2RlIChTRS9ERSkgYW5kIHRoZSBsYW5lIChQL04pOyB0aGUgYml0IHdpdGhpbgor ICogZWFjaCByZWdpc3RlciBhZGRyZXNzZXMgdGhlIGlucHV0IHBhaXIuCisgKi8KK2ludCBzaXQ5 NTMxeF9pbnB1dF9kaXNhYmxlKHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwgdTggaW5kZXgp Cit7CisJc3RydWN0IHNpdDk1MzF4X3JlZiAqcmVmID0gJnNpdGRldi0+cmVmW2luZGV4XTsKKwl1 bnNpZ25lZCBpbnQgZm9yY2VfcmVnLCBzdGF0ZV9yZWc7CisJdTggcGFpciA9IHNpdDk1MzF4X2lu cHV0X3BhaXIoaW5kZXgpOworCXU4IHZhbDsKKwlpbnQgcmM7CisKKwlzaXQ5NTMxeF9pbnB1dF9n ZXRfcmVncyhzaXRkZXYsIGluZGV4LCAmZm9yY2VfcmVnLCAmc3RhdGVfcmVnKTsKKworCXJjID0g c2l0OTUzMXhfcmVhZF91OChzaXRkZXYsIGZvcmNlX3JlZywgJnZhbCk7CisJaWYgKHJjKQorCQly ZXR1cm4gcmM7CisJcmMgPSBzaXQ5NTMxeF93cml0ZV91OChzaXRkZXYsIGZvcmNlX3JlZywgdmFs IHwgQklUKHBhaXIpKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gc2l0OTUzMXhf cmVhZF91OChzaXRkZXYsIHN0YXRlX3JlZywgJnZhbCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7 CisJcmMgPSBzaXQ5NTMxeF93cml0ZV91OChzaXRkZXYsIHN0YXRlX3JlZywgdmFsICYgfkJJVChw YWlyKSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyZWYtPmVuYWJsZWQgPSBmYWxzZTsK KworCXJldHVybiAwOworfQorCisvKgorICogc2l0OTUzMXhfaW5wdXRfZW5hYmxlIC0gZW5hYmxl IGFuIGlucHV0IHJlZmVyZW5jZQorICogQGluZGV4Oglsb2dpY2FsIGlucHV0IGluZGV4ICgwLU4p CisgKgorICogQ2xlYXJzIHRoZSBmb3JjZSBtYXNrIGJpdCBmb3IgdGhlIGdpdmVuIGlucHV0LCBy ZXR1cm5pbmcgaXQgdG8KKyAqIGhhcmR3YXJlIGRlZmF1bHQgKGVuYWJsZWQpLgorICovCitpbnQg c2l0OTUzMXhfaW5wdXRfZW5hYmxlKHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwgdTggaW5k ZXgpCit7CisJc3RydWN0IHNpdDk1MzF4X3JlZiAqcmVmID0gJnNpdGRldi0+cmVmW2luZGV4XTsK Kwl1bnNpZ25lZCBpbnQgZm9yY2VfcmVnLCBzdGF0ZV9yZWc7CisJdTggcGFpciA9IHNpdDk1MzF4 X2lucHV0X3BhaXIoaW5kZXgpOworCXU4IHZhbDsKKwlpbnQgcmM7CisKKwlzaXQ5NTMxeF9pbnB1 dF9nZXRfcmVncyhzaXRkZXYsIGluZGV4LCAmZm9yY2VfcmVnLCAmc3RhdGVfcmVnKTsKKworCXJj ID0gc2l0OTUzMXhfcmVhZF91OChzaXRkZXYsIGZvcmNlX3JlZywgJnZhbCk7CisJaWYgKHJjKQor CQlyZXR1cm4gcmM7CisJcmMgPSBzaXQ5NTMxeF93cml0ZV91OChzaXRkZXYsIGZvcmNlX3JlZywg dmFsICYgfkJJVChwYWlyKSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyZWYtPmVuYWJs ZWQgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBPdXRwdXQgZW5hYmxlIC8gZGlz YWJsZSAoSGktWiBjb250cm9sKQorICoKKyAqIFNpVDk1MzF4IG91dHB1dHMgY2FuIGJlIGNvbmZp Z3VyZWQgYXMgZGlmZmVyZW50aWFsIChESUZGKSBvcgorICogc2luZ2xlLWVuZGVkIChTRSkgZGVw ZW5kaW5nIG9uIHRoZSBmYWN0b3J5IGJsb2IuICBFYWNoIG91dHB1dCBzbG90CisgKiBoYXMgVFdP IEhpLVogZm9yY2Uvc3RhdGUgcmVnaXN0ZXIgcGFpcnMgb24gUGFnZSAweDAzIC0tIG9uZSBmb3Ig dGhlCisgKiBESUZGIHBhdGgsIG9uZSBmb3IgdGhlIFNFIHBhdGguCisgKgorICogV2Ugd3JpdGUg dG8gQk9USCBwYWlycyBzbyB0aGUgZnVuY3Rpb24gbXV0ZXMgdGhlIG91dHB1dCByZWdhcmRsZXNz CisgKiBvZiB3aGV0aGVyIGl0J3MgYmVlbiBjb25maWd1cmVkIERJRkYgb3IgU0Ugb24gdGhpcyBi b2FyZC4KKyAqCisgKiAgIHNsb3QgMC03IDoKKyAqICAgICBESUZGIG1hc2s9MHhGMiBzdGF0ZT0w eEYzICAgU0UgbWFzaz0weEY4IHN0YXRlPTB4RjkKKyAqICAgc2xvdCA4LTExOgorICogICAgIERJ RkYgbWFzaz0weEY0IHN0YXRlPTB4RjUgICBTRSBtYXNrPTB4RkEgc3RhdGU9MHhGQgorICoKKyAq IE1BU0sgYml0ID0gMSAgLT4gZHJpdmVyIHRha2VzIGNvbnRyb2wgb2YgdGhhdCBvdXRwdXQncyBI aS1aIHN0YXRlCisgKiBTVEFURSBiaXQgPSAwIC0+IG91dHB1dCBpcyBmb3JjZWQgdG8gSGktWiAo bXV0ZWQpCisgKiBTVEFURSBiaXQgPSAxIC0+IG91dHB1dCBpcyBkcml2ZW4gKGFjdGl2ZSkKKyAq CisgKiBUaGUgb3V0cHV0ICJpbmRleCIgaW4gdGhlIGRyaXZlciBpcyBsb2dpY2FsOyB0aGUgcGh5 c2ljYWwgc2xvdCBjb21lcworICogZnJvbSBpbmZvLT5jbGtvdXRfbWFwW10uCisgKi8KKworc3Ry dWN0IHNpdDk1MzF4X2hpel9yZWdzIHsKKwl1bnNpZ25lZCBpbnQgZGlmZl9tYXNrOworCXVuc2ln bmVkIGludCBkaWZmX3N0YXRlOworCXVuc2lnbmVkIGludCBzZV9tYXNrOworCXVuc2lnbmVkIGlu dCBzZV9zdGF0ZTsKKwl1OCBiaXQ7Cit9OworCitzdGF0aWMgdm9pZCBzaXQ5NTMxeF9vdXRwdXRf Z2V0X2hpel9yZWdzKHU4IHNsb3QsCisJCQkJCSBzdHJ1Y3Qgc2l0OTUzMXhfaGl6X3JlZ3MgKnIp Cit7CisJaWYgKHNsb3QgPD0gNykgeworCQlyLT5kaWZmX21hc2sgID0gU0lUOTUzMVhfUkVHX0hJ Wl9ESUZGXzA3X01BU0s7CisJCXItPmRpZmZfc3RhdGUgPSBTSVQ5NTMxWF9SRUdfSElaX0RJRkZf MDdfU1RBVEU7CisJCXItPnNlX21hc2sgICAgPSBTSVQ5NTMxWF9SRUdfSElaX1NFXzA3X01BU0s7 CisJCXItPnNlX3N0YXRlICAgPSBTSVQ5NTMxWF9SRUdfSElaX1NFXzA3X1NUQVRFOworCQlyLT5i aXQgPSBzbG90OworCX0gZWxzZSB7CisJCXItPmRpZmZfbWFzayAgPSBTSVQ5NTMxWF9SRUdfSEla X0RJRkZfODExX01BU0s7CisJCXItPmRpZmZfc3RhdGUgPSBTSVQ5NTMxWF9SRUdfSElaX0RJRkZf ODExX1NUQVRFOworCQlyLT5zZV9tYXNrICAgID0gU0lUOTUzMVhfUkVHX0hJWl9TRV84MTFfTUFT SzsKKwkJci0+c2Vfc3RhdGUgICA9IFNJVDk1MzFYX1JFR19ISVpfU0VfODExX1NUQVRFOworCQly LT5iaXQgPSBzbG90IC0gODsKKwl9Cit9CisKKy8qCisgKiBSZXBvcnQgd2hldGhlciBhIHNsb3Qg aXMgY3VycmVudGx5IGZvcmNlZCBpbnRvIEhpLVosIGkuZS4gdGhlIGRyaXZlcgorICogKG9yIHRo ZSBibG9iKSB0b29rIGNvbnRyb2wgb2YgdGhlIEhpLVogc3RhdGUgKE1BU0sgYml0IHNldCkgYW5k IGRyaXZlcworICogaXQgbG93IChTVEFURSBiaXQgY2xlYXIpLiAgRWl0aGVyIHJlZ2lzdGVyIHBh aXIgbXV0aW5nIHRoZSBzbG90IGNvdW50cywKKyAqIG1pcnJvcmluZyB3aGF0IHNpdDk1MzF4X291 dHB1dF9kaXNhYmxlKCkgcHJvZ3JhbXMuCisgKi8KK3N0YXRpYyBpbnQgc2l0OTUzMXhfb3V0cHV0 X2ZvcmNlZF9oaXooc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2LCB1OCBzbG90LAorCQkJCSAg ICAgIGJvb2wgKm11dGVkKQoreworCXN0cnVjdCBzaXQ5NTMxeF9oaXpfcmVncyByOworCXU4IG1h c2ssIHN0YXRlOworCWludCByYzsKKworCXNpdDk1MzF4X291dHB1dF9nZXRfaGl6X3JlZ3Moc2xv dCwgJnIpOworCisJcmMgPSBzaXQ5NTMxeF9yZWFkX3U4KHNpdGRldiwgci5kaWZmX21hc2ssICZt YXNrKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwlyYyA9IHNpdDk1MzF4X3JlYWRfdTgoc2l0 ZGV2LCByLmRpZmZfc3RhdGUsICZzdGF0ZSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkq bXV0ZWQgPSAobWFzayAmIEJJVChyLmJpdCkpICYmICEoc3RhdGUgJiBCSVQoci5iaXQpKTsKKwlp ZiAoKm11dGVkKQorCQlyZXR1cm4gMDsKKworCXJjID0gc2l0OTUzMXhfcmVhZF91OChzaXRkZXYs IHIuc2VfbWFzaywgJm1hc2spOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCXJjID0gc2l0OTUz MXhfcmVhZF91OChzaXRkZXYsIHIuc2Vfc3RhdGUsICZzdGF0ZSk7CisJaWYgKHJjKQorCQlyZXR1 cm4gcmM7CisKKwkqbXV0ZWQgPSAobWFzayAmIEJJVChyLmJpdCkpICYmICEoc3RhdGUgJiBCSVQo ci5iaXQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpdDk1MzF4X2hpel9zZXRf Yml0KHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwKKwkJCQl1bnNpZ25lZCBpbnQgcmVnLCB1 OCBiaXQsIGJvb2wgc2V0KQoreworCXU4IGN1ciwgbmV3X3ZhbDsKKwlpbnQgcmM7CisKKwlyYyA9 IHNpdDk1MzF4X3JlYWRfdTgoc2l0ZGV2LCByZWcsICZjdXIpOworCWlmIChyYykKKwkJcmV0dXJu IHJjOworCisJbmV3X3ZhbCA9IHNldCA/IChjdXIgfCBCSVQoYml0KSkgOiAoY3VyICYgfkJJVChi aXQpKTsKKworCXJldHVybiBzaXQ5NTMxeF93cml0ZV91OChzaXRkZXYsIHJlZywgbmV3X3ZhbCk7 Cit9CisKKy8qCisgKiBFbnRlciB0aGUgb3V0cHV0LXN5c3RlbSBwcm9ncmFtbWluZyBzdGF0ZTog dW5sb2NrIHRoZSBkZWJ1ZworICogcmVnaXN0ZXJzIG9uIFBhZ2UgMyBhbmQgaXNzdWUgdGhlIFBS R19DTUQgc3RhdGUgY29tbWFuZC4gIFJlZ2lzdGVyCisgKiB3cml0ZXMgdGhhdCByZWNvbmZpZ3Vy ZSB0aGUgb3V0cHV0IHN5c3RlbSBvbmx5IHRha2UgZWZmZWN0IHdoZW4KKyAqIHRoZXkgYXJlIG1h ZGUgaW5zaWRlIHRoaXMgc3RhdGUuCisgKi8KK3N0YXRpYyBpbnQgc2l0OTUzMXhfcHJnX2VudGVy KHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldikKK3sKKwlpbnQgcmM7CisKKwlyYyA9IHNpdDk1 MzF4X3dyaXRlX3U4KHNpdGRldiwgU0lUOTUzMVhfUkVHX09VVFNZU19ERUJVRywKKwkJCSAgICAg ICBTSVQ5NTMxWF9ERUJVR19VTkxPQ0tfVkFMKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwor CXJldHVybiBzaXQ5NTMxeF93cml0ZV91OChzaXRkZXYsIFNJVDk1MzFYX1JFR19QUkdfRElSX0dF TiwKKwkJCQkgU0lUOTUzMVhfUFJHX0NNRF9TVEFURSk7Cit9CisKKy8qCisgKiBDb21taXQgYSBw cm9ncmFtbWluZyBzZXF1ZW5jZSBzdGFydGVkIGJ5IHNpdDk1MzF4X3ByZ19lbnRlcigpOgorICog dXBkYXRlIHRoZSBOVk0gc2hhZG93IGFuZCByZS1sb2NrIHRoZSBsb29wcy4gIFRoZSBzbGVlcCBn aXZlcyB0aGUKKyAqIGhhcmR3YXJlIGl0cyByZXF1aXJlZCBzZXR0bGluZyB0aW1lIGFmdGVyIHRo ZSBsb29wLWxvY2sgY29tbWFuZDsKKyAqIGl0IGlzIGludGVudGlvbmFsIGRlc3BpdGUgdGhlIGNh bGxlciBob2xkaW5nIG11bHRpb3BfbG9jaywgYXMgdGhlCisgKiB3aG9sZSBOVk0gKyBsb2NrIHNl cXVlbmNlIG11c3QgYmUgYXRvbWljLgorICovCitzdGF0aWMgaW50IHNpdDk1MzF4X3ByZ19jb21t aXQoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2KQoreworCWludCByYzsKKworCXJjID0gc2l0 OTUzMXhfd3JpdGVfdTgoc2l0ZGV2LCBTSVQ5NTMxWF9SRUdfUFJHX0RJUl9HRU4sCisJCQkgICAg ICAgU0lUOTUzMVhfVVBEQVRFX05WTSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9 IHNpdDk1MzF4X3dyaXRlX3U4KHNpdGRldiwgU0lUOTUzMVhfUkVHX1BSR19ESVJfR0VOLAorCQkJ ICAgICAgIFNJVDk1MzFYX0xPT1BfTE9DSyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlt c2xlZXAoMTAwKTsKKworCXJldHVybiAwOworfQorCisvKgorICogc2l0OTUzMXhfb3V0cHV0X2Rp c2FibGUgLSBtdXRlIGFuIG91dHB1dCAoZm9yY2UgSGktWikKKyAqIEBpbmRleDoJbG9naWNhbCBv dXRwdXQgaW5kZXggKDAuLmluZm8tPm51bV9vdXRwdXRzLTEpCisgKgorICogU2V0cyBNQVNLK1NU QVRFIG9uIEJPVEggdGhlIERJRkYgYW5kIFNFIHJlZ2lzdGVyIHBhaXJzIHNvIHRoYXQgdGhlCisg KiBvdXRwdXQgaXMgbXV0ZWQgcmVnYXJkbGVzcyBvZiBpdHMgZWxlY3RyaWNhbCBjb25maWd1cmF0 aW9uLiAgVGhlCisgKiB3cml0ZXMgYXJlIHdyYXBwZWQgaW4gdGhlIFBSR19DTUQgLyBOVk0gdXBk YXRlIC8gbG9vcCBsb2NrIHNlcXVlbmNlCisgKiBzbyB0aGUgbmV3IHN0YXRlIGlzIGFwcGxpZWQg YnkgdGhlIGhhcmR3YXJlLgorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgc2l0ZGV2LT5tdWx0aW9w X2xvY2suCisgKi8KK2ludCBzaXQ5NTMxeF9vdXRwdXRfZGlzYWJsZShzdHJ1Y3Qgc2l0OTUzMXhf ZGV2ICpzaXRkZXYsIHU4IGluZGV4KQoreworCWNvbnN0IHN0cnVjdCBzaXQ5NTMxeF9jaGlwX2lu Zm8gKmluZm8gPSBzaXRkZXYtPmluZm87CisJc3RydWN0IHNpdDk1MzF4X2hpel9yZWdzIHI7CisJ dTggc2xvdDsKKwlpbnQgcmMsIHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnNpdGRldi0+ bXVsdGlvcF9sb2NrKTsKKworCWlmIChpbmRleCA+PSBpbmZvLT5udW1fb3V0cHV0cykKKwkJcmV0 dXJuIC1FSU5WQUw7CisKKwlzbG90ID0gaW5mby0+Y2xrb3V0X21hcFtpbmRleF07CisJc2l0OTUz MXhfb3V0cHV0X2dldF9oaXpfcmVncyhzbG90LCAmcik7CisKKwlyYyA9IHNpdDk1MzF4X3ByZ19l bnRlcihzaXRkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogVGFrZSBjb250cm9s IChNQVNLPTEpIGFuZCBtdXRlIChTVEFURT0wKSBvbiBib3RoIERJRkYgYW5kIFNFICovCisJcmMg PSBzaXQ5NTMxeF9oaXpfc2V0X2JpdChzaXRkZXYsIHIuZGlmZl9tYXNrLCByLmJpdCwgdHJ1ZSk7 CisJaWYgKHJjKQorCQlnb3RvIGNvbW1pdDsKKwlyYyA9IHNpdDk1MzF4X2hpel9zZXRfYml0KHNp dGRldiwgci5kaWZmX3N0YXRlLCByLmJpdCwgZmFsc2UpOworCWlmIChyYykKKwkJZ290byBjb21t aXQ7CisJcmMgPSBzaXQ5NTMxeF9oaXpfc2V0X2JpdChzaXRkZXYsIHIuc2VfbWFzaywgci5iaXQs IHRydWUpOworCWlmIChyYykKKwkJZ290byBjb21taXQ7CisJcmMgPSBzaXQ5NTMxeF9oaXpfc2V0 X2JpdChzaXRkZXYsIHIuc2Vfc3RhdGUsIHIuYml0LCBmYWxzZSk7CisKK2NvbW1pdDoKKwkvKgor CSAqIEFsd2F5cyBsZWF2ZSB0aGUgUFJHX0NNRCBwcm9ncmFtbWluZyBzdGF0ZSwgZXZlbiBvbiBh IG1pZC1zZXF1ZW5jZQorCSAqIHdyaXRlIGZhaWx1cmU6IHByZ19lbnRlcigpIHVubG9ja2VkIHRo ZSBvdXRwdXQgbG9vcHMsIHNvIHJldHVybmluZworCSAqIHdpdGhvdXQgcHJnX2NvbW1pdCgpIHdv dWxkIHN0cmFuZCB0aGUgY2hpcCBpbiB0aGUgcHJvZ3JhbW1pbmcgc3RhdGUKKwkgKiB3aXRoIHRo ZSBsb29wcyB1bmxvY2tlZC4gIEJlc3QgZWZmb3J0IC0tIGtlZXAgdGhlIGZpcnN0IGVycm9yLgor CSAqLworCXJldCA9IHNpdDk1MzF4X3ByZ19jb21taXQoc2l0ZGV2KTsKKwlpZiAocmV0ICYmICFy YykKKwkJcmMgPSByZXQ7CisJaWYgKCFyYykKKwkJc2l0ZGV2LT5vdXRbaW5kZXhdLmVuYWJsZWQg PSBmYWxzZTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIHNpdDk1MzF4X291dHB1dF9lbmFi bGUgLSB1bi1tdXRlIGFuIG91dHB1dCAoYWN0aXZlIHN0YXRlKQorICogQGluZGV4Oglsb2dpY2Fs IG91dHB1dCBpbmRleCAoMC4uaW5mby0+bnVtX291dHB1dHMtMSkKKyAqCisgKiBSZWxlYXNlcyBN QVNLIG9uIEJPVEggcmVnaXN0ZXIgcGFpcnMgc28gdGhlIG91dHB1dCByZXR1cm5zIHRvCisgKiB3 aGF0ZXZlciB0aGUgaW5pdGlhbF9jb25maWcgYmxvYiBwcm9ncmFtbWVkLiAgVGhlIHdyaXRlcyBh cmUgd3JhcHBlZAorICogaW4gdGhlIFBSR19DTUQgLyBOVk0gdXBkYXRlIC8gbG9vcCBsb2NrIHNl cXVlbmNlIHNvIHRoZSBuZXcgc3RhdGUgaXMKKyAqIGFwcGxpZWQgYnkgdGhlIGhhcmR3YXJlLgor ICoKKyAqIENhbGxlciBtdXN0IGhvbGQgc2l0ZGV2LT5tdWx0aW9wX2xvY2suCisgKi8KK2ludCBz aXQ5NTMxeF9vdXRwdXRfZW5hYmxlKHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwgdTggaW5k ZXgpCit7CisJY29uc3Qgc3RydWN0IHNpdDk1MzF4X2NoaXBfaW5mbyAqaW5mbyA9IHNpdGRldi0+ aW5mbzsKKwlzdHJ1Y3Qgc2l0OTUzMXhfaGl6X3JlZ3MgcjsKKwl1OCBzbG90OworCWludCByYywg cmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmc2l0ZGV2LT5tdWx0aW9wX2xvY2spOworCisJ aWYgKGluZGV4ID49IGluZm8tPm51bV9vdXRwdXRzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNs b3QgPSBpbmZvLT5jbGtvdXRfbWFwW2luZGV4XTsKKwlzaXQ5NTMxeF9vdXRwdXRfZ2V0X2hpel9y ZWdzKHNsb3QsICZyKTsKKworCXJjID0gc2l0OTUzMXhfcHJnX2VudGVyKHNpdGRldik7CisJaWYg KHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHNpdDk1MzF4X2hpel9zZXRfYml0KHNpdGRldiwg ci5kaWZmX21hc2ssIHIuYml0LCBmYWxzZSk7CisJaWYgKHJjKQorCQlnb3RvIGNvbW1pdDsKKwly YyA9IHNpdDk1MzF4X2hpel9zZXRfYml0KHNpdGRldiwgci5zZV9tYXNrLCByLmJpdCwgZmFsc2Up OworCitjb21taXQ6CisJLyoKKwkgKiBBbHdheXMgbGVhdmUgdGhlIFBSR19DTUQgcHJvZ3JhbW1p bmcgc3RhdGUsIGV2ZW4gb24gYSBtaWQtc2VxdWVuY2UKKwkgKiB3cml0ZSBmYWlsdXJlOiBwcmdf ZW50ZXIoKSB1bmxvY2tlZCB0aGUgb3V0cHV0IGxvb3BzLCBzbyByZXR1cm5pbmcKKwkgKiB3aXRo b3V0IHByZ19jb21taXQoKSB3b3VsZCBzdHJhbmQgdGhlIGNoaXAgaW4gdGhlIHByb2dyYW1taW5n IHN0YXRlCisJICogd2l0aCB0aGUgbG9vcHMgdW5sb2NrZWQuICBCZXN0IGVmZm9ydCAtLSBrZWVw IHRoZSBmaXJzdCBlcnJvci4KKwkgKi8KKwlyZXQgPSBzaXQ5NTMxeF9wcmdfY29tbWl0KHNpdGRl dik7CisJaWYgKHJldCAmJiAhcmMpCisJCXJjID0gcmV0OworCWlmICghcmMpCisJCXNpdGRldi0+ b3V0W2luZGV4XS5lbmFibGVkID0gdHJ1ZTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIElu cHV0IHByaW9yaXR5IHNlbGVjdGlvbgorICoKKyAqIFRoZSBTaVQ5NTMxeCBoYXMgYSAxMi1zbG90 IHByaW9yaXR5IHRhYmxlIHBlciBQTEwgb24gUGFnZSAxLiAgRWFjaAorICogcmVnaXN0ZXIgaG9s ZHMgdHdvIHNsb3RzIG5pYmJsZS1wYWNrZWQgKGV2ZW4gc2xvdCBpbiBbMzowXSwgb2RkIHNsb3QK KyAqIGluIFs3OjRdKS4KKyAqCisgKiBUaGUgcHJvY2VkdXJlOgorICogICAxLiBGb3JjZSBQTEwg aW50byBob2xkb3ZlciAoUExMIHBhZ2UgcmVnIDB4NkYgYml0IDQpCisgKiAgIDIuIFdyaXRlIHBy aW9yaXR5IHNsb3RzIG9uIFBhZ2UgMQorICogICAzLiBTbWFsbCBjaGFuZ2UgdXBkYXRlIChQYWdl IDAgcmVnIDB4MEYgYml0IDEpCisgKiAgIDQuIFJlbGVhc2UgaG9sZG92ZXIKKyAqCisgKiBDYWxs ZXIgbXVzdCBob2xkIHNpdGRldi0+bXVsdGlvcF9sb2NrLgorICovCisKKy8qIFBhZ2UtMSByZWdp c3RlciBob2xkaW5nIHByaW9yaXR5IHNsb3QgQHNsb3Qgb2YgQHBsbF9pZHguICovCitzdGF0aWMg dTE2IHNpdDk1MzF4X3ByaW9fcmVnKHU4IHBsbF9pZHgsIHU4IHNsb3QpCit7CisJcmV0dXJuIFNJ VDk1MzFYX1JFRyhTSVQ5NTMxWF9QQUdFX1BSSU9TWVMsCisJCQkgICAgU0lUOTUzMVhfUFJJT19C QVNFX1JFRyArCisJCQkgICAgU0lUOTUzMVhfUFJJT19SRUdTX1BFUl9QTEwgKiBwbGxfaWR4ICsK KwkJCSAgICBzbG90IC8gU0lUOTUzMVhfUFJJT19TTE9UU19QRVJfUkVHKTsKK30KKworLyoKKyAq IEV4dHJhY3QgcHJpb3JpdHkgc2xvdCBAc2xvdCBmcm9tIGl0cyByZWdpc3RlciB2YWx1ZS4gIFRo ZSByZWdpc3RlcgorICogaG9sZGluZyBzbG90cyAybiBhbmQgMm4rMSBrZWVwcyB0aGUgZWFybGll ciBzbG90IGluIHRoZSBoaWdoIG5pYmJsZQorICogKENMS19TUEFSRTwybj5TRUwpIGFuZCB0aGUg bGF0ZXIgb25lIGluIHRoZSBsb3cgbmliYmxlLgorICovCitzdGF0aWMgdTggc2l0OTUzMXhfcHJp b19zbG90X2dldCh1OCB2YWwsIHU4IHNsb3QpCit7CisJaWYgKHNsb3QgJiAxKQorCQlyZXR1cm4g dmFsICYgU0lUOTUzMVhfUFJJT19OSUJCTEVfTUFTSzsKKworCXJldHVybiB2YWwgPj4gU0lUOTUz MVhfUFJJT19ISV9TSElGVDsKK30KKworLyogUGxhY2Ugc291cmNlIEBzcmMgaW4gcHJpb3JpdHkg c2xvdCBAc2xvdCBvZiBhIHJlZ2lzdGVyIHZhbHVlLiAqLworc3RhdGljIHU4IHNpdDk1MzF4X3By aW9fc2xvdF9zZXQodTggdmFsLCB1OCBzbG90LCB1OCBzcmMpCit7CisJaWYgKHNsb3QgJiAxKQor CQlyZXR1cm4gKHZhbCAmIChTSVQ5NTMxWF9QUklPX05JQkJMRV9NQVNLIDw8CisJCQkgICAgICAg U0lUOTUzMVhfUFJJT19ISV9TSElGVCkpIHwKKwkJICAgICAgIChzcmMgJiBTSVQ5NTMxWF9QUklP X05JQkJMRV9NQVNLKTsKKworCXJldHVybiAodmFsICYgU0lUOTUzMVhfUFJJT19OSUJCTEVfTUFT SykgfAorCSAgICAgICAoKHNyYyAmIFNJVDk1MzFYX1BSSU9fTklCQkxFX01BU0spIDw8CisJCVNJ VDk1MzFYX1BSSU9fSElfU0hJRlQpOworfQorCisvKgorICogQ29tbWl0IGEgcHJpb3JpdHktdGFi bGUgcHJvZ3JhbW1pbmcgc2VxdWVuY2UgdGhyb3VnaCB0aGUgUGFnZS0wCisgKiBwcm9ncmFtbWlu ZyBkaXJlY3RpdmUgcmVnaXN0ZXIuCisgKgorICogQSBzbWFsbCBjaGFuZ2UgdXBkYXRlIGlzIGFs bCB0aGUgdGFibGUgbmVlZHMuICBUaGUgTlZNLWJhbmsgYW5kCisgKiBsb29wLWxvY2sgZGlyZWN0 aXZlcyB0aGF0IHRoZSBvdXRwdXQgc3lzdGVtIGlzc3VlcyBkbyBub3QgYmVsb25nCisgKiBoZXJl OiB0aGUgZm9ybWVyIHByb2dyYW1zIG5vbi12b2xhdGlsZSBzdG9yYWdlIGZyb20gdGhlIGVmdXNl IGFuZAorICogdGhlIGxhdHRlciBvbmx5IG1lYW5zIGFueXRoaW5nIGFmdGVyIGFuIGVzY2FwZSB0 byB0aGUgUFJHX0NNRAorICogc3RhdGUuICBUaGlzIG1hdGNoZXMgdGhlIHZlbmRvciBpbnB1dF9w cmlvcml0eV9zZWwoKSBwcm9jZWR1cmUuCisgKi8KK3N0YXRpYyBpbnQgc2l0OTUzMXhfcHJpb19w cmdfY29tbWl0KHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldikKK3sKKwlpbnQgcmM7CisKKwly YyA9IHNpdDk1MzF4X3dyaXRlX3U4KHNpdGRldiwgU0lUOTUzMVhfUkVHX0dMT0JBTF9VUERBVEUs CisJCQkgICAgICAgU0lUOTUzMVhfU01BTExfVVBEQVRFX0NNRCk7CisJaWYgKHJjKQorCQlyZXR1 cm4gcmM7CisKKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisKKwlyZXR1cm4gMDsKK30KKwor LyoKKyAqIHNpdDk1MzF4X2lucHV0X3ByaW9fZ2V0IC0gcmVhZCBhbiBpbnB1dCdzIHByaW9yaXR5 IHNsb3QgZm9yIGEgUExMCisgKiBAaW5wdXRfaWR4OglpbnB1dCBzb3VyY2UgaW4gaGFyZHdhcmUg ZW5jb2RpbmcgKHNlZQorICoJCXNpdDk1MzF4X2lucHV0X2h3X3NyYygpKQorICogQHByaW86CW91 dHB1dCBzbG90IHBvc2l0aW9uICgwID0gaGlnaGVzdCk7IHNldCB0bworICoJCVNJVDk1MzFYX1BS SU9fTUFYX1NMT1RTIHdoZW4gdGhlIHNvdXJjZSBpcyBub3QgaW4gdGhlIHRhYmxlCisgKgorICog U2NhbnMgdGhlIFBMTCdzIDEyLXNsb3QgcHJpb3JpdHkgdGFibGUgb24gUGFnZSAxIGFuZCByZXR1 cm5zIHRoZQorICogaGlnaGVzdC1wcmlvcml0eSAobG93ZXN0LW51bWJlcmVkKSBzbG90IHRoYXQg cmVmZXJlbmNlcyB0aGUgc291cmNlLgorICogVGhpcyByZWFkcyB0aGUgdmFsdWUgdGhlIGNoaXAg YWN0dWFsbHkgaG9sZHMgcmF0aGVyIHRoYW4gYSBjYWNoZWQKKyAqIGRlZmF1bHQsIHNvIHBpbi1n ZXQgcmVmbGVjdHMgdGhlIHJlYWwgaGFyZHdhcmUgcHJpb3JpdHkuCisgKgorICogQ2FsbGVyIG11 c3QgaG9sZCBzaXRkZXYtPm11bHRpb3BfbG9jay4KKyAqLworaW50IHNpdDk1MzF4X2lucHV0X3By aW9fZ2V0KHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwgdTggcGxsX2lkeCwKKwkJCSAgICB1 OCBpbnB1dF9pZHgsIHU4ICpwcmlvKQoreworCXU4IHZhbCwgc2xvdCwgc3JjOworCWludCByYzsK KworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsKKworCWlmIChw bGxfaWR4ID49IFNJVDk1MzFYX05VTV9QTExTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAo c2xvdCA9IDA7IHNsb3QgPCBTSVQ5NTMxWF9QUklPX01BWF9TTE9UUzsgc2xvdCsrKSB7CisJCXJj ID0gc2l0OTUzMXhfcmVhZF91OChzaXRkZXYsCisJCQkJICAgICAgc2l0OTUzMXhfcHJpb19yZWco cGxsX2lkeCwgc2xvdCksICZ2YWwpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJc3Jj ID0gc2l0OTUzMXhfcHJpb19zbG90X2dldCh2YWwsIHNsb3QpOworCisJCWlmIChzcmMgPT0gaW5w dXRfaWR4KSB7CisJCQkqcHJpbyA9IHNsb3Q7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCSpw cmlvID0gU0lUOTUzMVhfUFJJT19NQVhfU0xPVFM7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBz aXQ5NTMxeF9wcmlvX3RhYmxlX2NvbW1pdCAtIHdyaXRlIGEgZnVsbCBwcmlvcml0eSB0YWJsZSBm b3IgYSBQTEwKKyAqIEBzcmNzOglhcnJheSBvZiBTSVQ5NTMxWF9QUklPX01BWF9TTE9UUyBzb3Vy Y2UgY29kZXMsIHNsb3QgMCBmaXJzdAorICoKKyAqIFByb2dyYW1zIGFsbCBwcmlvcml0eSBzbG90 cyAobmliYmxlLXBhY2tlZCwgdHdvIHBlciByZWdpc3RlcikgZm9yCisgKiB0aGUgUExMIHVzaW5n IHRoZSBzYW1lIGhvbGRvdmVyIC8gc21hbGwtdXBkYXRlIHNlcXVlbmNlIGFzCisgKiBzaXQ5NTMx eF9pbnB1dF9wcmlvX3NldCgpLiAgQ2FsbGVyIG11c3QgaG9sZCBzaXRkZXYtPm11bHRpb3BfbG9j ay4KKyAqLworc3RhdGljIGludCBzaXQ5NTMxeF9wcmlvX3RhYmxlX2NvbW1pdChzdHJ1Y3Qgc2l0 OTUzMXhfZGV2ICpzaXRkZXYsIHU4IHBsbF9pZHgsCisJCQkJICAgICAgY29uc3QgdTggKnNyY3Mp Cit7CisJdTggdmFsLCBzbG90OworCWludCByYywgcHJnX3JjLCBob19yYzsKKwl1MTYgcmVnOwor CisJcmMgPSBzaXQ5NTMxeF91cGRhdGVfcGxsX3U4KHNpdGRldiwgcGxsX2lkeCwgU0lUOTUzMVhf UExMX1JFR19IT19DVFJMLAorCQkJCSAgICBCSVQoU0lUOTUzMVhfUExMX0hPX0ZPUkNFX0JJVCks CisJCQkJICAgIEJJVChTSVQ5NTMxWF9QTExfSE9fRk9SQ0VfQklUKSk7CisJaWYgKHJjKQorCQly ZXR1cm4gcmM7CisKKwl1c2xlZXBfcmFuZ2UoMTAwMDAsIDEyMDAwKTsKKworCWZvciAoc2xvdCA9 IDA7IHNsb3QgPCBTSVQ5NTMxWF9QUklPX01BWF9TTE9UUzsgc2xvdCsrKSB7CisJCXJlZyA9IHNp dDk1MzF4X3ByaW9fcmVnKHBsbF9pZHgsIHNsb3QpOworCisJCXJjID0gc2l0OTUzMXhfcmVhZF91 OChzaXRkZXYsIHJlZywgJnZhbCk7CisJCWlmIChyYykKKwkJCWdvdG8gY29tbWl0OworCisJCXZh bCA9IHNpdDk1MzF4X3ByaW9fc2xvdF9zZXQodmFsLCBzbG90LCBzcmNzW3Nsb3RdKTsKKworCQly YyA9IHNpdDk1MzF4X3dyaXRlX3U4KHNpdGRldiwgcmVnLCB2YWwpOworCQlpZiAocmMpCisJCQln b3RvIGNvbW1pdDsKKwl9CisKK2NvbW1pdDoKKwkvKiBMYXRjaCB1bmNvbmRpdGlvbmFsbHksIGFz IGluIHNpdDk1MzF4X2lucHV0X3ByaW9fc2V0KCkuICovCisJcHJnX3JjID0gc2l0OTUzMXhfcHJp b19wcmdfY29tbWl0KHNpdGRldik7CisJaWYgKHByZ19yYyAmJiAhcmMpCisJCXJjID0gcHJnX3Jj OworCisJaG9fcmMgPSBzaXQ5NTMxeF91cGRhdGVfcGxsX3U4KHNpdGRldiwgcGxsX2lkeCwKKwkJ CQkgICAgICAgU0lUOTUzMVhfUExMX1JFR19IT19DVFJMLAorCQkJCSAgICAgICBCSVQoU0lUOTUz MVhfUExMX0hPX0ZPUkNFX0JJVCksIDApOworCWlmIChob19yYyAmJiAhcmMpCisJCXJjID0gaG9f cmM7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBzaXQ5NTMxeF9wcmlvX3RhYmxlX3JlYWQg LSByZWFkIGEgUExMJ3MgcHJpb3JpdHktdGFibGUgc291cmNlIGNvZGVzCisgKiBAc3JjczoJb3V0 cHV0IGFycmF5IG9mIFNJVDk1MzFYX1BSSU9fTUFYX1NMT1RTIHNvdXJjZSBjb2RlcworICoKKyAq IENhbGxlciBtdXN0IGhvbGQgc2l0ZGV2LT5tdWx0aW9wX2xvY2suCisgKi8KK3N0YXRpYyBpbnQg c2l0OTUzMXhfcHJpb190YWJsZV9yZWFkKHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwgdTgg cGxsX2lkeCwKKwkJCQkgICAgdTggKnNyY3MpCit7CisJdTggdmFsLCBzbG90OworCWludCByYzsK KworCWZvciAoc2xvdCA9IDA7IHNsb3QgPCBTSVQ5NTMxWF9QUklPX01BWF9TTE9UUzsgc2xvdCsr KSB7CisJCXJjID0gc2l0OTUzMXhfcmVhZF91OChzaXRkZXYsCisJCQkJICAgICAgc2l0OTUzMXhf cHJpb19yZWcocGxsX2lkeCwgc2xvdCksICZ2YWwpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7 CisKKwkJc3Jjc1tzbG90XSA9IHNpdDk1MzF4X3ByaW9fc2xvdF9nZXQodmFsLCBzbG90KTsKKwl9 CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNpdDk1MzF4X2lucHV0X3ByaW9fc2V0IC0gbW92 ZSBhbiBpbnB1dCB0byBhIHByaW9yaXR5IHNsb3QKKyAqIEBpbnB1dF9pZHg6CWlucHV0IHNvdXJj ZSBpbiBoYXJkd2FyZSBlbmNvZGluZyAoMC0xMSwgc2VlCisgKgkJc2l0OTUzMXhfaW5wdXRfaHdf c3JjKCkpCisgKiBAcHJpbzoJcHJpb3JpdHkgc2xvdCBwb3NpdGlvbiAoMCA9IGhpZ2hlc3QpCisg KgorICogUmVhZHMgdGhlIFBMTCdzIHRhYmxlLCB0YWtlcyB0aGUgc291cmNlIG91dCBvZiB3aGVy ZXZlciBpdCBzaXRzIGFuZAorICogcmVpbnNlcnRzIGl0IGF0IEBwcmlvLCBzaGlmdGluZyB0aGUg ZW50cmllcyBpbiBiZXR3ZWVuLiAgVGhlIHJlc3Qga2VlcAorICogdGhlaXIgcmVsYXRpdmUgb3Jk ZXI6IGEgcHJpb3JpdHkgY2hhbmdlIGFza3MgYWJvdXQgb25lIGlucHV0LCBzbyB0aGUKKyAqIGZh bGxiYWNrcyBjb25maWd1cmVkIGJlaGluZCBpdCBoYXZlIHRvIHN1cnZpdmUgaXQuCisgKgorICog Q2FsbGVyIG11c3QgaG9sZCBzaXRkZXYtPm11bHRpb3BfbG9jay4KKyAqCisgKiBSZXR1cm46IDAg b24gc3VjY2VzcywgPDAgb24gZXJyb3IKKyAqLworaW50IHNpdDk1MzF4X2lucHV0X3ByaW9fc2V0 KHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwgdTggcGxsX2lkeCwKKwkJCSAgICB1OCBpbnB1 dF9pZHgsIHU4IHByaW8pCit7CisJdTggc3Jjc1tTSVQ5NTMxWF9QUklPX01BWF9TTE9UU107CisJ dTggc2xvdCwgZnJvbTsKKwlpbnQgcmM7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZzaXRkZXYt Pm11bHRpb3BfbG9jayk7CisKKwlpZiAocGxsX2lkeCA+PSBTSVQ5NTMxWF9OVU1fUExMUykKKwkJ cmV0dXJuIC1FSU5WQUw7CisJaWYgKGlucHV0X2lkeCA+PSBTSVQ5NTMxWF9QUklPX05VTV9TUkMp CisJCXJldHVybiAtRUlOVkFMOworCWlmIChwcmlvID49IFNJVDk1MzFYX1BSSU9fTUFYX1NMT1RT KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJjID0gc2l0OTUzMXhfcHJpb190YWJsZV9yZWFkKHNp dGRldiwgcGxsX2lkeCwgc3Jjcyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlmb3IgKGZy b20gPSAwOyBmcm9tIDwgU0lUOTUzMVhfUFJJT19NQVhfU0xPVFM7IGZyb20rKykKKwkJaWYgKHNy Y3NbZnJvbV0gPT0gaW5wdXRfaWR4KQorCQkJYnJlYWs7CisKKwlpZiAoZnJvbSA9PSBwcmlvKQor CQlyZXR1cm4gMDsKKworCWlmIChmcm9tID4gcHJpbykgeworCQkvKgorCQkgKiBNb3ZpbmcgdXAs IG9yIG5vdCBpbiB0aGUgdGFibGUgYXQgYWxsOiBwdXNoIHRoZSB0YWlsIGRvd24KKwkJICogdG8g b3BlbiB0aGUgc2xvdC4gIEZvciBhIHNvdXJjZSB0aGF0IGlzIG5ldywgd2hhdGV2ZXIgc2F0CisJ CSAqIGluIHRoZSBsYXN0IHNsb3QgZmFsbHMgb2ZmIC0tIHRoZSBlbnRyeSB0aGUgY2hpcCB3b3Vs ZCBoYXZlCisJCSAqIHRyaWVkIGxhc3QuCisJCSAqLworCQlpZiAoZnJvbSA9PSBTSVQ5NTMxWF9Q UklPX01BWF9TTE9UUykKKwkJCWZyb20gPSBTSVQ5NTMxWF9QUklPX01BWF9TTE9UUyAtIDE7CisJ CWZvciAoc2xvdCA9IGZyb207IHNsb3QgPiBwcmlvOyBzbG90LS0pCisJCQlzcmNzW3Nsb3RdID0g c3Jjc1tzbG90IC0gMV07CisJfSBlbHNlIHsKKwkJZm9yIChzbG90ID0gZnJvbTsgc2xvdCA8IHBy aW87IHNsb3QrKykKKwkJCXNyY3Nbc2xvdF0gPSBzcmNzW3Nsb3QgKyAxXTsKKwl9CisKKwlzcmNz W3ByaW9dID0gaW5wdXRfaWR4OworCisJcmV0dXJuIHNpdDk1MzF4X3ByaW9fdGFibGVfY29tbWl0 KHNpdGRldiwgcGxsX2lkeCwgc3Jjcyk7Cit9CisKKy8qCisgKiBzaXQ5NTMxeF9pbnB1dF9wcmlv X3JlbW92ZSAtIGRyb3AgYW4gaW5wdXQgZnJvbSBhIFBMTCdzIHByaW9yaXR5IHRhYmxlCisgKiBA aW5wdXRfaWR4OglpbnB1dCBzb3VyY2UgaW4gaGFyZHdhcmUgZW5jb2RpbmcKKyAqCisgKiBSZXdy aXRlcyB0aGUgcHJpb3JpdHkgdGFibGUgd2l0aCB0aGUgc291cmNlIHJlbW92ZWQ6IHRoZSByZW1h aW5pbmcKKyAqIHNvdXJjZXMgYXJlIGNvbXBhY3RlZCB0b3dhcmQgdGhlIGhpZ2hlc3QtcHJpb3Jp dHkgc2xvdHMgYW5kIHRoZSBmcmVlZAorICogdGFpbCBzbG90cyBhcmUgYmFja2ZpbGxlZCB3aXRo IHRoZSBsb3dlc3QtcHJpb3JpdHkgcmVtYWluaW5nIHNvdXJjZQorICogKG1hdGNoaW5nIHNpdDk1 MzF4X2lucHV0X3ByaW9fc2V0KCkpLiAgVGhpcyBtYWtlcyBhIGRpc2Nvbm5lY3RlZAorICogaW5w dXQgaW5lbGlnaWJsZSBmb3IgYXV0b21hdGljIHJlZmVyZW5jZSBzZWxlY3Rpb24sIG5vdCBqdXN0 IGdhdGVkIGF0CisgKiB0aGUgaW5wdXQgYnVmZmVyLiAgSXQgaXMgYSBuby1vcCB3aGVuIHRoZSBz b3VyY2UgaXMgYWJzZW50LCBvciB3aGVuIGl0CisgKiBpcyB0aGUgb25seSBzb3VyY2UgKHRoZSBi dWZmZXIgZGlzYWJsZSB0aGVuIGRyaXZlcyB0aGUgUExMIHRvCisgKiBob2xkb3ZlciBhbmQgdGhl IHRhYmxlIG11c3Qgbm90IGJlIGxlZnQgZW1wdHkpLgorICoKKyAqIENhbGxlciBtdXN0IGhvbGQg c2l0ZGV2LT5tdWx0aW9wX2xvY2suCisgKi8KK2ludCBzaXQ5NTMxeF9pbnB1dF9wcmlvX3JlbW92 ZShzdHJ1Y3Qgc2l0OTUzMXhfZGV2ICpzaXRkZXYsIHU4IHBsbF9pZHgsCisJCQkgICAgICAgdTgg aW5wdXRfaWR4KQoreworCXU4IHNyY3NbU0lUOTUzMVhfUFJJT19NQVhfU0xPVFNdOworCXU4IGtl cHRbU0lUOTUzMVhfUFJJT19NQVhfU0xPVFNdOworCXU4IHNsb3QsIGNvdW50ID0gMDsKKwlib29s IGZvdW5kID0gZmFsc2U7CisJaW50IHJjOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmc2l0ZGV2 LT5tdWx0aW9wX2xvY2spOworCisJaWYgKHBsbF9pZHggPj0gU0lUOTUzMVhfTlVNX1BMTFMpCisJ CXJldHVybiAtRUlOVkFMOworCisJcmMgPSBzaXQ5NTMxeF9wcmlvX3RhYmxlX3JlYWQoc2l0ZGV2 LCBwbGxfaWR4LCBzcmNzKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWZvciAoc2xvdCA9 IDA7IHNsb3QgPCBTSVQ5NTMxWF9QUklPX01BWF9TTE9UUzsgc2xvdCsrKSB7CisJCWlmIChzcmNz W3Nsb3RdID09IGlucHV0X2lkeCkKKwkJCWZvdW5kID0gdHJ1ZTsKKwkJZWxzZQorCQkJa2VwdFtj b3VudCsrXSA9IHNyY3Nbc2xvdF07CisJfQorCisJaWYgKCFmb3VuZCB8fCBjb3VudCA9PSAwKQor CQlyZXR1cm4gMDsKKworCS8qIEJhY2tmaWxsIGZyZWVkIHRhaWwgc2xvdHMgd2l0aCB0aGUgbG93 ZXN0LXByaW9yaXR5IHJlbWFpbmluZyBzcmMgKi8KKwl3aGlsZSAoY291bnQgPCBTSVQ5NTMxWF9Q UklPX01BWF9TTE9UUykgeworCQlrZXB0W2NvdW50XSA9IGtlcHRbY291bnQgLSAxXTsKKwkJY291 bnQrKzsKKwl9CisKKwlyZXR1cm4gc2l0OTUzMXhfcHJpb190YWJsZV9jb21taXQoc2l0ZGV2LCBw bGxfaWR4LCBrZXB0KTsKK30KKworLyoKKyAqIHNpdDk1MzF4X2lucHV0X3ByaW9fYWRkIC0gbWFr ZSBhbiBpbnB1dCBlbGlnaWJsZSBpbiBhIFBMTCdzIHRhYmxlCisgKiBAaW5wdXRfaWR4OglpbnB1 dCBzb3VyY2UgaW4gaGFyZHdhcmUgZW5jb2RpbmcKKyAqCisgKiBFbnN1cmVzIHRoZSBzb3VyY2Ug YXBwZWFycyBpbiB0aGUgcHJpb3JpdHkgdGFibGUgc28gaXQgY2FuIGJlIHBpY2tlZAorICogYnkg YXV0b21hdGljIHJlZmVyZW5jZSBzZWxlY3Rpb24gYWdhaW4gYWZ0ZXIgYSBkaXNjb25uZWN0LiAg SWYgdGhlCisgKiBzb3VyY2UgaXMgYWxyZWFkeSBsaXN0ZWQgdGhlIHRhYmxlIGlzIGxlZnQgdW50 b3VjaGVkOyBvdGhlcndpc2UgaXQgaXMKKyAqIHBsYWNlZCBpbiB0aGUgbG93ZXN0LXByaW9yaXR5 IHNsb3QuICBUaGUgb3JpZ2luYWwgcHJpb3JpdHkgaXMgbm90CisgKiByZXN0b3JlZCAtLSB1c2Ug c2l0OTUzMXhfaW5wdXRfcHJpb19zZXQoKSB0byByZWFzc2lnbiBpdC4KKyAqCisgKiBDYWxsZXIg bXVzdCBob2xkIHNpdGRldi0+bXVsdGlvcF9sb2NrLgorICovCitpbnQgc2l0OTUzMXhfaW5wdXRf cHJpb19hZGQoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2LCB1OCBwbGxfaWR4LAorCQkJICAg IHU4IGlucHV0X2lkeCkKK3sKKwl1OCBzcmNzW1NJVDk1MzFYX1BSSU9fTUFYX1NMT1RTXTsKKwl1 OCBzbG90OworCWludCByYzsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnNpdGRldi0+bXVsdGlv cF9sb2NrKTsKKworCWlmIChwbGxfaWR4ID49IFNJVDk1MzFYX05VTV9QTExTKQorCQlyZXR1cm4g LUVJTlZBTDsKKworCXJjID0gc2l0OTUzMXhfcHJpb190YWJsZV9yZWFkKHNpdGRldiwgcGxsX2lk eCwgc3Jjcyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlmb3IgKHNsb3QgPSAwOyBzbG90 IDwgU0lUOTUzMVhfUFJJT19NQVhfU0xPVFM7IHNsb3QrKykKKwkJaWYgKHNyY3Nbc2xvdF0gPT0g aW5wdXRfaWR4KQorCQkJcmV0dXJuIDA7CisKKwlzcmNzW1NJVDk1MzFYX1BSSU9fTUFYX1NMT1RT IC0gMV0gPSBpbnB1dF9pZHg7CisKKwlyZXR1cm4gc2l0OTUzMXhfcHJpb190YWJsZV9jb21taXQo c2l0ZGV2LCBwbGxfaWR4LCBzcmNzKTsKK30KKworLyogUGVyLXNsb3QgRElWTyBiYXNlIHJlZ2lz dGVyIG9mZnNldHMgKDYgc2xvdHMgcGVyIHBhZ2UpICovCitzdGF0aWMgY29uc3QgdTggY2xrb3V0 X29kcl9kaXZuX2Jhc2VbXSA9IHsKKwkweDE0LCAweDI0LCAweDM0LCAweDQ0LCAweDU0LCAweDY0 Cit9OworCisvKiBYTyBkb3VibGVyIHJlZ2lzdGVyICovCisjZGVmaW5lIFNJVDk1MzFYX1JFR19Y TzJfR0VORVJJQwkJU0lUOTUzMVhfUkVHKDB4MDAsIDB4MkQpCisjZGVmaW5lIFNJVDk1MzFYX1hP X0RPVUJMRVJfRU5CX0JJVAkJNyAgIC8qIGludmVydGVkOiAwID0gZW5hYmxlZCAqLworCisvKiBW Q08gZnJlcXVlbmN5IGJhbmRzIChIeikgKi8KKyNkZWZpbmUgU0lUOTUzMVhfRlZDT19MT1dCQU5E X01JTgkJNDkxNTIwMDAwMFVMTAorI2RlZmluZSBTSVQ5NTMxWF9GVkNPX0xPV0JBTkRfTUFYCQk1 ODk4MjQwMDAwVUxMCisjZGVmaW5lIFNJVDk1MzFYX0ZWQ09fSElHSEJBTkRfTUlOCQk2ODc1MDAw MDAwVUxMCisjZGVmaW5lIFNJVDk1MzFYX0ZWQ09fSElHSEJBTkRfTUFYCQk3ODEyNTAwMDAwVUxM CisKKy8qCisgKiBzaXQ5NTMxeF9pc194b19kb3VibGVyX2VuYWJsZWQgLSBjaGVjayBpZiBGcmVm IGRvdWJsZXIgaXMgYWN0aXZlCisgKgorICogUmVnaXN0ZXIgMHgyRCBiaXQgNyBpcyBhY3RpdmUt bG93OiAwID0gZG91YmxlciBlbmFibGVkLCAxID0gZGlzYWJsZWQuCisgKgorICogUmV0dXJuOiAx IGlmIGVuYWJsZWQsIDAgaWYgZGlzYWJsZWQsIDwwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQg c2l0OTUzMXhfaXNfeG9fZG91Ymxlcl9lbmFibGVkKHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRl dikKK3sKKwl1OCB2YWw7CisJaW50IHJjOworCisJcmMgPSBzaXQ5NTMxeF9yZWFkX3U4KHNpdGRl diwgU0lUOTUzMVhfUkVHX1hPMl9HRU5FUklDLCAmdmFsKTsKKwlpZiAocmMpCisJCXJldHVybiBy YzsKKworCXJldHVybiAofnZhbCA+PiBTSVQ5NTMxWF9YT19ET1VCTEVSX0VOQl9CSVQpICYgMXU7 Cit9CisKKy8qCisgKiBzaXQ5NTMxeF9kYmdfc2FtcGxlIC0gbGF0Y2ggYW5kIHJlYWQgYSBzaWdu YWwgcGF0aHdheSBkZWJ1ZyBzYW1wbGUKKyAqIEBzaXRkZXY6CWRldmljZSBwb2ludGVyCisgKiBA cGxsX2lkeDoJUExMIGluZGV4ICgwLTMpCisgKiBAcmVhZF9jb2RlOgl3aGljaCB0YXAgb2YgdGhl IHBhdGh3YXkgdG8gc2FtcGxlCisgKiBAYnVmOglyZXN1bHQsIGxlYXN0IHNpZ25pZmljYW50IGJ5 dGUgZmlyc3QKKyAqIEBsZW46CWJ5dGVzIHRvIHJlYWQsIGF0IG1vc3QgU0lUOTUzMVhfREJHX0RB VEFfQllURVMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IKKyAqLwor c3RhdGljIGludCBzaXQ5NTMxeF9kYmdfc2FtcGxlKHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRl diwgdTggcGxsX2lkeCwKKwkJCSAgICAgICB1OCByZWFkX2NvZGUsIHU4ICpidWYsIHVuc2lnbmVk IGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJjOworCXU4IHY7CisKKwlpZiAo bGVuID4gU0lUOTUzMVhfREJHX0RBVEFfQllURVMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmMg PSBzaXQ5NTMxeF93cml0ZV9wbGxfdTgoc2l0ZGV2LCBwbGxfaWR4LCBTSVQ5NTMxWF9QTExfUkVH X0RFQlVHLAorCQkJCSAgIFNJVDk1MzFYX1BMTF9ERUJVR19VTkxPQ0spOworCWlmIChyYykKKwkJ cmV0dXJuIHJjOworCisJcmMgPSBzaXQ5NTMxeF93cml0ZV9wbGxfdTgoc2l0ZGV2LCBwbGxfaWR4 LAorCQkJCSAgIFNJVDk1MzFYX1BMTF9SRUdfREJHX1JFQURfQ09ERSwgcmVhZF9jb2RlKTsKKwlp ZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIFJlYWRpbmcgdGhlIHRyaWdnZXIgbGF0Y2hlcyBh IGZyZXNoIHNhbXBsZSBvZiB0aGUgc2VsZWN0ZWQgdGFwLiAqLworCXJjID0gc2l0OTUzMXhfcmVh ZF9wbGxfdTgoc2l0ZGV2LCBwbGxfaWR4LAorCQkJCSAgU0lUOTUzMVhfUExMX1JFR19EQkdfVFJJ R0dFUiwgJnYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJZm9yIChpID0gMDsgaSA8IGxl bjsgaSsrKSB7CisJCXJjID0gc2l0OTUzMXhfcmVhZF9wbGxfdTgoc2l0ZGV2LCBwbGxfaWR4LAor CQkJCQkgIFNJVDk1MzFYX1BMTF9SRUdfREJHX0RBVEFfMCArIGksCisJCQkJCSAgJmJ1ZltpXSk7 CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAq IERJVk4gYXMgYSBmaXhlZC1wb2ludCB2YWx1ZTogaW50X3BhcnQgcGx1cyBmcmFjbi9mcmFjZCwg Y2FycmllZCB3aXRoCisgKiBTSVQ5NTMxWF9ESVZOX1NDQUxFIHN0ZXBzIHBlciB1bml0LiAgVGhl IHNjYWxlIGtlZXBzIGEgd2hvbGUgRElWTgorICogd2VsbCBpbnNpZGUgczY0IHdoaWxlIHJlc29s dmluZyBmYXIgYmVsb3cgdGhlIHBhcnRzLXBlci10cmlsbGlvbiB0aGUKKyAqIGZyZXF1ZW5jeSBv ZmZzZXQgaXMgcmVwb3J0ZWQgaW4uCisgKi8KK3N0YXRpYyBzNjQgc2l0OTUzMXhfZGl2bl9maXhl ZCh1MzIgaW50X3BhcnQsIHM2NCBmcmFjbiwgdTY0IGZyYWNkKQoreworCXM2NCB3aG9sZSA9IChz NjQpaW50X3BhcnQgKiBTSVQ5NTMxWF9ESVZOX1NDQUxFOworCXU2NCBmcmFjOworCisJaWYgKCFm cmFjZCkKKwkJcmV0dXJuIHdob2xlOworCisJZnJhYyA9IG11bF91NjRfdTY0X2Rpdl91NjQoYWJz KGZyYWNuKSwgU0lUOTUzMVhfRElWTl9TQ0FMRSwgZnJhY2QpOworCisJcmV0dXJuIGZyYWNuIDwg MCA/IHdob2xlIC0gKHM2NClmcmFjIDogd2hvbGUgKyAoczY0KWZyYWM7Cit9CisKKy8qCisgKiBz aXQ5NTMxeF9kaXZuX3N0YXRpYyAtIHJlYWQgdGhlIGNvbmZpZ3VyZWQgRElWTiBvZiBhIFBMTAor ICogQHNpdGRldjoJZGV2aWNlIHBvaW50ZXIKKyAqIEBwbGxfaWR4OglQTEwgaW5kZXggKDAtMykK KyAqIEBkaXZuOglyZXN1bHQsIGZpeGVkIHBvaW50IGFzIHBlciBzaXQ5NTMxeF9kaXZuX2ZpeGVk KCkKKyAqCisgKiBSZWFkcyBQTEwgcGFnZSByZWdzIDB4MzAgKGludGVnZXIgcGFydCksIDB4MzIt MHgzNSAobnVtZXJhdG9yKSBhbmQKKyAqIDB4MzgtMHgzQiAoZGVub21pbmF0b3IpLiAgVGhlIG51 bWVyYXRvciBpcyBhIHR3bydzIGNvbXBsZW1lbnQgMzItYml0CisgKiB2YWx1ZSwgc28gRElWTiBj YW4gc2l0IGJlbG93IHRoZSBpbnRlZ2VyIHBhcnQsIGFuZCB0aGUgZGVub21pbmF0b3IKKyAqIHJl Z2lzdGVyIGhvbGRzIHRoZSBkaXZpc29yIG1pbnVzIG9uZS4KKyAqCisgKiBSZXR1cm46IDAgb24g c3VjY2VzcywgPDAgb24gZXJyb3IKKyAqLworc3RhdGljIGludCBzaXQ5NTMxeF9kaXZuX3N0YXRp YyhzdHJ1Y3Qgc2l0OTUzMXhfZGV2ICpzaXRkZXYsIHU4IHBsbF9pZHgsCisJCQkJczY0ICpkaXZu KQoreworCXUzMiBpbnRfcGFydCwgZnJhY25fcmF3ID0gMCwgZnJhY2RfcmF3ID0gMDsKKwlpbnQg cmMsIGk7CisJdTggdjsKKworCXJjID0gc2l0OTUzMXhfcmVhZF9wbGxfdTgoc2l0ZGV2LCBwbGxf aWR4LAorCQkJCSAgU0lUOTUzMVhfUExMX1JFR19ESVZOX0lOVCwgJnYpOworCWlmIChyYykKKwkJ cmV0dXJuIHJjOworCWludF9wYXJ0ID0gdjsKKworCWZvciAoaSA9IDM7IGkgPj0gMDsgaS0tKSB7 CisJCXJjID0gc2l0OTUzMXhfcmVhZF9wbGxfdTgoc2l0ZGV2LCBwbGxfaWR4LAorCQkJCQkgIFNJ VDk1MzFYX1BMTF9SRUdfRElWTl9OVU0gKyBpLCAmdik7CisJCWlmIChyYykKKwkJCXJldHVybiBy YzsKKwkJZnJhY25fcmF3ID0gKGZyYWNuX3JhdyA8PCA4KSB8IHY7CisJfQorCisJZm9yIChpID0g MzsgaSA+PSAwOyBpLS0pIHsKKwkJcmMgPSBzaXQ5NTMxeF9yZWFkX3BsbF91OChzaXRkZXYsIHBs bF9pZHgsCisJCQkJCSAgU0lUOTUzMVhfUExMX1JFR19ESVZOX0RFTiArIGksICZ2KTsKKwkJaWYg KHJjKQorCQkJcmV0dXJuIHJjOworCQlmcmFjZF9yYXcgPSAoZnJhY2RfcmF3IDw8IDgpIHwgdjsK Kwl9CisKKwkqZGl2biA9IHNpdDk1MzF4X2Rpdm5fZml4ZWQoaW50X3BhcnQsIChzMzIpZnJhY25f cmF3LAorCQkJCSAgICAodTY0KWZyYWNkX3JhdyArIDEpOworCisJcmV0dXJuIDA7Cit9CisKKy8q CisgKiBzaXQ5NTMxeF9kaXZuX3J1bnRpbWUgLSByZWFkIHRoZSBESVZOIHRoZSBkaWdpdGFsIGxv b3AgaXMgY29tbWFuZGluZworICogQHNpdGRldjoJZGV2aWNlIHBvaW50ZXIKKyAqIEBwbGxfaWR4 OglQTEwgaW5kZXggKDAtMykKKyAqIEBkaXZuOglyZXN1bHQsIGZpeGVkIHBvaW50IGFzIHBlciBz aXQ5NTMxeF9kaXZuX2ZpeGVkKCkKKyAqCisgKiBTYW1lIHF1YW50aXR5IGFzIHNpdDk1MzF4X2Rp dm5fc3RhdGljKCksIGJ1dCBzYW1wbGVkIGZyb20gdGhlIHJ1bm5pbmcKKyAqIGxvb3AgcmF0aGVy IHRoYW4gZnJvbSB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMsIGFuZCBjYXJyaWVkIGF0IGEK KyAqIHdpZGVyIHByZWNpc2lvbjogdGhlIG51bWVyYXRvciBpcyA0OCBiaXRzLCB0d28ncyBjb21w bGVtZW50LCB0aGUKKyAqIGRlbm9taW5hdG9yIDQ5LiAgVGhlIGludGVnZXIgcGFydCBzaGFyZXMg aXRzIHRhcCB3aXRoIHRoZSBudW1lcmF0b3IuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Ms IDwwIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgc2l0OTUzMXhfZGl2bl9ydW50aW1lKHN0cnVj dCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwgdTggcGxsX2lkeCwKKwkJCQkgczY0ICpkaXZuKQorewor CXU4IGJ1ZltTSVQ5NTMxWF9EQkdfREFUQV9CWVRFU107CisJdTY0IGZyYWNuX3JhdyA9IDAsIGZy YWNkID0gMDsKKwl1MzIgaW50X3BhcnQ7CisJaW50IHJjLCBpOworCisJcmMgPSBzaXQ5NTMxeF9k Ymdfc2FtcGxlKHNpdGRldiwgcGxsX2lkeCwgU0lUOTUzMVhfREJHX1JFQURfQ09ERV9ESVZOLAor CQkJCSBidWYsIFNJVDk1MzFYX0RCR19EQVRBX0JZVEVTKTsKKwlpZiAocmMpCisJCXJldHVybiBy YzsKKworCWZvciAoaSA9IDU7IGkgPj0gMDsgaS0tKQorCQlmcmFjbl9yYXcgPSAoZnJhY25fcmF3 IDw8IDgpIHwgYnVmW2ldOworCisJaW50X3BhcnQgPSBidWZbNl0gfCAoKHUzMikoYnVmWzddICYg U0lUOTUzMVhfRElWTl9SVF9JTlRfSElfQklUKSA8PCA4KTsKKworCXJjID0gc2l0OTUzMXhfZGJn X3NhbXBsZShzaXRkZXYsIHBsbF9pZHgsCisJCQkJIFNJVDk1MzFYX0RCR19SRUFEX0NPREVfRElW Tl9ERU4sIGJ1ZiwKKwkJCQkgU0lUOTUzMVhfREJHX0RBVEFfQllURVMpOworCWlmIChyYykKKwkJ cmV0dXJuIHJjOworCisJZm9yIChpID0gNTsgaSA+PSAwOyBpLS0pCisJCWZyYWNkID0gKGZyYWNk IDw8IDgpIHwgYnVmW2ldOworCisJZnJhY2QgfD0gKHU2NCkoYnVmWzZdICYgU0lUOTUzMVhfRElW Tl9SVF9JTlRfSElfQklUKSA8PCA0ODsKKworCSpkaXZuID0gc2l0OTUzMXhfZGl2bl9maXhlZChp bnRfcGFydCwKKwkJCQkgICAgc2lnbl9leHRlbmQ2NChmcmFjbl9yYXcsCisJCQkJCQkgIFNJVDk1 MzFYX0RJVk5fUlRfTlVNX0JJVFMgLSAxKSwKKwkJCQkgICAgZnJhY2QpOworCisJcmV0dXJuIDA7 Cit9CisKKy8qKgorICogc2l0OTUzMXhfcGxsX2Zmb19wcHQgLSBmcmFjdGlvbmFsIGZyZXF1ZW5j eSBvZmZzZXQgb2YgYSBQTEwncyByZWZlcmVuY2UKKyAqIEBzaXRkZXY6CWRldmljZSBwb2ludGVy CisgKiBAcGxsX2lkeDoJUExMIGluZGV4ICgwLTMpCisgKiBAZmZvOglyZXN1bHQgaW4gcGFydHMg cGVyIHRyaWxsaW9uCisgKgorICogQSBsb2NrZWQgUExMIGNvbW1hbmRzIHdoYXRldmVyIERJVk4g a2VlcHMgaXRzIFZDTyB0cmFja2luZyB0aGUKKyAqIHJlZmVyZW5jZS4gIEhvdyBmYXIgdGhhdCBz aXRzIGZyb20gdGhlIGNvbmZpZ3VyZWQgRElWTiBpcyBob3cgZmFyIHRoZQorICogcmVmZXJlbmNl IHNpdHMgZnJvbSB0aGUgbG9jYWwgb3NjaWxsYXRvciwgd2hpY2ggaXMgdGhlIGZyYWN0aW9uYWwK KyAqIGZyZXF1ZW5jeSBvZmZzZXQgdGhlIERQTEwgQUJJIHJlcG9ydHMgZm9yIHRoZSBwaW4gZmVl ZGluZyB0aGUgZGV2aWNlLgorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgc2l0ZGV2LT5tdWx0aW9w X2xvY2suCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC1FTk9EQVRBIHdoZW4gRElWTiBp cyBub3QgcHJvZ3JhbW1lZCwgPDAgb24KKyAqIGVycm9yLgorICovCitpbnQgc2l0OTUzMXhfcGxs X2Zmb19wcHQoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2LCB1OCBwbGxfaWR4LCBzNjQgKmZm bykKK3sKKwlzNjQgY29uZmlndXJlZCwgcnVubmluZywgZGVsdGE7CisJdTY0IG1hZ25pdHVkZTsK KwlpbnQgcmM7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZzaXRkZXYtPm11bHRpb3BfbG9jayk7 CisKKwlpZiAocGxsX2lkeCA+PSBTSVQ5NTMxWF9OVU1fUExMUykKKwkJcmV0dXJuIC1FSU5WQUw7 CisKKwlyYyA9IHNpdDk1MzF4X2Rpdm5fc3RhdGljKHNpdGRldiwgcGxsX2lkeCwgJmNvbmZpZ3Vy ZWQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCWlmIChjb25maWd1cmVkIDw9IDApCisJCXJl dHVybiAtRU5PREFUQTsKKworCXJjID0gc2l0OTUzMXhfZGl2bl9ydW50aW1lKHNpdGRldiwgcGxs X2lkeCwgJnJ1bm5pbmcpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJZGVsdGEgPSBydW5u aW5nIC0gY29uZmlndXJlZDsKKwltYWduaXR1ZGUgPSBtdWxfdTY0X3U2NF9kaXZfdTY0KGFicyhk ZWx0YSksIFNJVDk1MzFYX1BQVF9QRVJfVU5JVCwKKwkJCQkJKHU2NCljb25maWd1cmVkKTsKKwor CSpmZm8gPSBkZWx0YSA8IDAgPyAtKHM2NCltYWduaXR1ZGUgOiAoczY0KW1hZ25pdHVkZTsKKwor CXJldHVybiAwOworfQorCisvKgorICogc2l0OTUzMXhfZ2V0X2Z2Y28gLSByZWFkIFZDTyBmcmVx dWVuY3kgZnJvbSBjaGlwJ3MgRElWTiByZWdpc3RlcnMKKyAqCisgKiBGdmNvID0gRnJlZiAqIERJ Vk4sIHdoZXJlIERJVk4gY29tZXMgZnJvbSBzaXQ5NTMxeF9kaXZuX3N0YXRpYygpIGFuZAorICog RnJlZiA9IHh0YWxfZnJlcSA8PCBkb3VibGVyLiAgRElWTiBpcyB0aGUKKyAqIHN0ZWFkeS1zdGF0 ZSBGdmNvL0ZyZWYgdGFyZ2V0IHByb2dyYW1tZWQgYnkgdGhlIE5WTSBibG9iIGFuZCBpcworICog YXV0aG9yaXRhdGl2ZSBpbiBib3RoIGZyZWUtcnVuIGFuZCBzeW5jIG1vZGVzOyB0aGUgcHJldmlv dXMgc3BsaXQKKyAqIGJldHdlZW4gZnJlZS1ydW4gYW5kIHN5bmMgZm9ybXVsYXMgcmV0dXJuZWQg MCBvbiBjaGlwcyB0aGF0IGRpZG4ndAorICogaGF2ZSBhIHN5bmMgaW5wdXQgcG9wdWxhdGVkLCB3 aGljaCBicm9rZSB0aGUgVERDIHBoYXNlIHJlYWRiYWNrLgorICoKKyAqIFJldHVybjogRnZjbyBp biBIeiwgb3IgMCBvbiBlcnJvcgorICovCitzdGF0aWMgdTY0IHNpdDk1MzF4X2dldF9mdmNvKHN0 cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwgdTggcGxsX2lkeCkKK3sKKwlpbnQgZG91Ymxlciwg cmM7CisJczY0IGRpdm47CisJdTY0IGZyZWY7CisKKwkvKgorCSAqIERUIGJvYXJkLWNvbmZpZyBv dmVycmlkZTogc29tZSBjb25maWdzIChlLmcuIGFuIElOVFNZTkMgUExMKQorCSAqIHJ1biBhIFZD TyB0aGF0IEZyZWYqRElWTiBkb2VzIG5vdCByZXByb2R1Y2UuICBXaGVuIHRoZSBib2FyZAorCSAq IHN1cHBsaWVzIHRoZSBtZWFzdXJlZCBWQ08sIHVzZSBpdCB2ZXJiYXRpbS4KKwkgKi8KKwlpZiAo cGxsX2lkeCA8IFNJVDk1MzFYX05VTV9QTExTICYmIHNpdGRldi0+cGxsX2Z2Y29bcGxsX2lkeF0p CisJCXJldHVybiBzaXRkZXYtPnBsbF9mdmNvW3BsbF9pZHhdOworCisJcmMgPSBzaXQ5NTMxeF9k aXZuX3N0YXRpYyhzaXRkZXYsIHBsbF9pZHgsICZkaXZuKTsKKwlpZiAocmMgfHwgZGl2biA8PSAw KQorCQlyZXR1cm4gMDsKKworCWRvdWJsZXIgPSBzaXQ5NTMxeF9pc194b19kb3VibGVyX2VuYWJs ZWQoc2l0ZGV2KTsKKwlpZiAoZG91YmxlciA8IDApCisJCXJldHVybiAwOworCisJZnJlZiA9ICh1 NjQpc2l0ZGV2LT54dGFsX2ZyZXEgPDwgZG91YmxlcjsKKworCXJldHVybiBtdWxfdTY0X3U2NF9k aXZfdTY0KGZyZWYsICh1NjQpZGl2biwgU0lUOTUzMVhfRElWTl9TQ0FMRSk7Cit9CisKKy8qCisg KiBzaXQ5NTMxeF9vdXRwdXRfcGhhc2VfZmx1c2ggLSBmbHVzaCB0aGUgb3V0cHV0IHBoYXNlIG9m IGEgUExMCisgKgorICogRmlyZXMgdGhlIGNoaXAncyBvbi1kZW1hbmQgcGhhc2UtZmx1c2ggKFBI RkwpIHNvIGV2ZXJ5IG91dHB1dCBkaXZpZGVyCisgKiBvZiBAcGxsX2lkeCByZXN0YXJ0cyBhbGln bmVkIHRvIHRoZSBQTEwgcGhhc2UuICBXaXRob3V0IGl0IGEgcmV3cml0dGVuCisgKiBESVZPIGtl ZXBzIGNvdW50aW5nIGZyb20gYW4gYXJiaXRyYXJ5IHBvaW50IGFuZCB0aGUgb3V0cHV0IGVkZ2Ug bGFuZHMKKyAqIHdpdGggYSBwZXJzaXN0ZW50IG9mZnNldCBhZ2FpbnN0IHRoZSB0cmFja2VkIHJl ZmVyZW5jZSAob25seSBhIHBvd2VyCisgKiBjeWNsZSByZWFsaWduZWQgaXQpLgorICoKKyAqIFRo ZSBzZXF1ZW5jZSBtaXJyb3JzIHRoZSB2ZW5kb3IgcHJvY2VkdXJlOiBhcm0gdGhlIG9uLWRlbWFu ZCBQSEZMIGFuZAorICogbGF0Y2ggaXQgd2l0aCB0aGUgUExMLXBhZ2Ugc21hbGwtY2hhbmdlIHVw ZGF0ZSwgdGhlbiBzZWxlY3QgdGhlCisgKiBpbi1yZWdpc3RlciBwaGFzZSB0cmlnZ2VyIG9uIFBh Z2UgMCBhbmQgcHVsc2UgaXQuICBUaGUgUGFnZSAwIHRyaWdnZXIKKyAqIHJlZ2lzdGVyIGlzIHRv dWNoZWQgcmVhZC1tb2RpZnktd3JpdGUgc28gdGhlIHVucmVsYXRlZCBPRWIgYml0cyBhcmUKKyAq IHByZXNlcnZlZC4KKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIHNpdGRldi0+bXVsdGlvcF9sb2Nr LgorICovCitzdGF0aWMgaW50IHNpdDk1MzF4X291dHB1dF9waGFzZV9mbHVzaChzdHJ1Y3Qgc2l0 OTUzMXhfZGV2ICpzaXRkZXYsIHU4IHBsbF9pZHgpCit7CisJdTggY3RybCwgb3JpZzsKKwlpbnQg cmMsIHJldDsKKworCS8qIEFybSB0aGUgb24tZGVtYW5kIHBoYXNlLWZsdXNoIG9uIHRoZSBQTEwg cGFnZS4gKi8KKwlyYyA9IHNpdDk1MzF4X3VwZGF0ZV9wbGxfdTgoc2l0ZGV2LCBwbGxfaWR4LAor CQkJCSAgICBTSVQ5NTMxWF9QTExfUkVHX1BIRkxfQ1RSTCwKKwkJCQkgICAgU0lUOTUzMVhfUExM X1BIRkxfT05fREVNQU5EX0VOLAorCQkJCSAgICBTSVQ5NTMxWF9QTExfUEhGTF9PTl9ERU1BTkRf RU4pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogTGF0Y2ggaXQgd2l0aCB0aGUgUExM IHNtYWxsLWNoYW5nZSB1cGRhdGUuICovCisJcmMgPSBzaXQ5NTMxeF91cGRhdGVfcGxsX3U4KHNp dGRldiwgcGxsX2lkeCwKKwkJCQkgICAgU0lUOTUzMVhfUExMX1JFR19TTUFMTF9VUERBVEUsCisJ CQkJICAgIFNJVDk1MzFYX1NNQUxMX1VQREFURV9DTUQsCisJCQkJICAgIFNJVDk1MzFYX1NNQUxM X1VQREFURV9DTUQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyoKKwkgKiBTZWxlY3Qg dGhlIGluLXJlZ2lzdGVyIHBoYXNlIHRyaWdnZXIsIHByZXNlcnZpbmcgdGhlIE9FYiBiaXRzLgor CSAqIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCByZWdpc3RlciB2YWx1ZSAod2l0aCB0aGUgdHJpZ2dl ciBkZS1hc3NlcnRlZCkKKwkgKiBzbyB0aGUgdHJpZ2dlci1zb3VyY2Ugc2VsZWN0IGNhbiBiZSBy ZXN0b3JlZCBvbmNlIHRoZSBwdWxzZSBoYXMKKwkgKiBmaXJlZC4KKwkgKi8KKwlyYyA9IHNpdDk1 MzF4X3JlYWRfdTgoc2l0ZGV2LCBTSVQ5NTMxWF9SRUdfR1BJT19GVU5DX0NUUkwxLCAmY3RybCk7 CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlvcmlnID0gY3RybCAmIH5TSVQ5NTMxWF9ESVZP X1BIQVNFX1RSSUc7CisJY3RybCA9IG9yaWcgfCBTSVQ5NTMxWF9ESVZPX1BIQVNFX1NFTF9SRUc7 CisJcmMgPSBzaXQ5NTMxeF93cml0ZV91OChzaXRkZXYsIFNJVDk1MzFYX1JFR19HUElPX0ZVTkNf Q1RSTDEsIGN0cmwpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyoKKwkgKiBQdWxzZSB0 aGUgcGhhc2UgdHJpZ2dlci4gIE5vIGV4cGxpY2l0IGRlbGF5IGlzIG5lZWRlZCBiZXR3ZWVuIHRo ZQorCSAqIHNldCBhbmQgY2xlYXIgd3JpdGVzOiBlYWNoIEkyQyB0cmFuc2FjdGlvbiB0YWtlcyBm YXIgbG9uZ2VyIHRoYW4KKwkgKiBhbnkgbWluaW11bSBwdWxzZSB3aWR0aC4KKwkgKi8KKwlyYyA9 IHNpdDk1MzF4X3dyaXRlX3U4KHNpdGRldiwgU0lUOTUzMVhfUkVHX0dQSU9fRlVOQ19DVFJMMSwK KwkJCSAgICAgICBjdHJsIHwgU0lUOTUzMVhfRElWT19QSEFTRV9UUklHKTsKKworCS8qCisJICog UmVzdG9yZSB0aGUgb3JpZ2luYWwgdHJpZ2dlci1zb3VyY2Ugc2VsZWN0LiAgVGhlIHB1bHNlIGFi b3ZlIGhhcworCSAqIGFscmVhZHkgbGF0Y2hlZCB0aGUgZmx1c2gsIHNvIGEgb25lLXNob3QgZmx1 c2ggbXVzdCBub3QgbGVhdmUgdGhlCisJICogcGhhc2UgdHJpZ2dlciBwZXJtYW5lbnRseSBwaW5u ZWQgdG8gdGhlIGluLXJlZ2lzdGVyIHNvdXJjZS4gIFRoaXMKKwkgKiBydW5zIGV2ZW4gd2hlbiB0 aGUgcHVsc2Ugd3JpdGUgZmFpbGVkLCBvdGhlcndpc2UgYSBmYWlsZWQgZmx1c2gKKwkgKiB3b3Vs ZCBrZWVwIGEgaGFyZHdhcmUgdHJpZ2dlciBzb3VyY2UgaGlqYWNrZWQ7IHRoZSByZXN0b3JlIGVy cm9yCisJICogaXMgb25seSBzdXJmYWNlZCB3aGVuIGl0IHdvdWxkIG5vdCBtYXNrIHRoZSBwdWxz ZSBmYWlsdXJlLgorCSAqLworCXJldCA9IHNpdDk1MzF4X3dyaXRlX3U4KHNpdGRldiwgU0lUOTUz MVhfUkVHX0dQSU9fRlVOQ19DVFJMMSwgb3JpZyk7CisJaWYgKHJldCAmJiAhcmMpCisJCXJjID0g cmV0OworCisJcmV0dXJuIHJjOworfQorCisvKgorICogc2l0OTUzMXhfb3V0cHV0X2ZyZXFfc2V0 IC0gc2V0IG91dHB1dCBjbG9jayBmcmVxdWVuY3kKKyAqIEBvdXRfaWR4OglvdXRwdXQgaW5kZXgg KDAtTiBmb3IgdGhpcyBjaGlwIHZhcmlhbnQpCisgKiBAcGxsX2lkeDoJUExMIGRyaXZpbmcgdGhp cyBvdXRwdXQgKDAtMykKKyAqIEBmcmVxdWVuY3k6CWRlc2lyZWQgb3V0cHV0IGZyZXF1ZW5jeSBp biBIegorICoKKyAqIENvbXB1dGVzIERJVk8gPSBGdmNvIC8gZnJlcXVlbmN5IGFuZCB3cml0ZXMg dGhlIDM0LWJpdCBvdXRwdXQgZGl2aWRlcgorICogdG8gdGhlIG91dHB1dCBzeXN0ZW0gcmVnaXN0 ZXJzIG9uIFBhZ2VzIDMvNC4gIFRoZSB3cml0ZSBzZXF1ZW5jZSBpczoKKyAqICAgMS4gVW5sb2Nr IGRlYnVnIHJlZ2lzdGVycyAoUGFnZSAzKQorICogICAyLiBFbnRlciBQUkdfQ01EIHN0YXRlCisg KiAgIDMuIFdyaXRlIDUtYnl0ZSBESVZPIHRvIHRoZSBjb3JyZWN0IHBhZ2Uvc2xvdAorICogICA0 LiBOVk0gdXBkYXRlCisgKiAgIDUuIExvb3AgbG9jaworICogICA2LiBXYWl0IGZvciBsb2NrIHRv IHNldHRsZQorICogICA3LiBGbHVzaCB0aGUgb3V0cHV0IHBoYXNlIHNvIHRoZSBuZXcgZGl2aWRl ciBzdGFydHMgYWxpZ25lZAorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgc2l0ZGV2LT5tdWx0aW9w X2xvY2suCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGVycm9yLiAgQWN0dWFs IGZyZXF1ZW5jeSBtYXkgZGlmZmVyCisgKiAgICAgICAgIGR1ZSB0byBpbnRlZ2VyIGRpdmlzaW9u OyB0aGUgb3V0cHV0IHN0YXRlIGlzIHVwZGF0ZWQgd2l0aAorICogICAgICAgICB0aGUgZWZmZWN0 aXZlIGZyZXF1ZW5jeSAoRnZjbyAvIERJVk8pLgorICovCitpbnQgc2l0OTUzMXhfb3V0cHV0X2Zy ZXFfc2V0KHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwgdTggb3V0X2lkeCwKKwkJCSAgICAg dTggcGxsX2lkeCwgdTY0IGZyZXF1ZW5jeSkKK3sKKwljb25zdCBzdHJ1Y3Qgc2l0OTUzMXhfY2hp cF9pbmZvICppbmZvID0gc2l0ZGV2LT5pbmZvOworCXU4IHNsb3QsIHBhZ2UsIGJhc2VfcmVnLCBk aXZvX2J5dGVzWzVdLCBtc2Jfb2xkOworCXU2NCBmdmNvLCBkaXZvLCBmdmNvX21pbiwgZnZjb19t YXg7CisJaW50IHJjLCBqLCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZzaXRkZXYtPm11 bHRpb3BfbG9jayk7CisKKwlpZiAob3V0X2lkeCA+PSBpbmZvLT5udW1fb3V0cHV0cyB8fCBwbGxf aWR4ID49IFNJVDk1MzFYX05VTV9QTExTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZnJl cXVlbmN5KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIERldGVybWluZSBWQ08gZnJlcXVlbmN5 IGJhbmQgbGltaXRzICovCisJaWYgKHBsbF9pZHggPT0gMSB8fCBwbGxfaWR4ID09IDMpIHsKKwkJ LyogUExMQiwgUExMRDogaGlnaCBiYW5kICovCisJCWZ2Y29fbWluID0gU0lUOTUzMVhfRlZDT19I SUdIQkFORF9NSU47CisJCWZ2Y29fbWF4ID0gU0lUOTUzMVhfRlZDT19ISUdIQkFORF9NQVg7CisJ fSBlbHNlIHsKKwkJLyogUExMQSwgUExMQzogbG93IGJhbmQgKi8KKwkJZnZjb19taW4gPSBTSVQ5 NTMxWF9GVkNPX0xPV0JBTkRfTUlOOworCQlmdmNvX21heCA9IFNJVDk1MzFYX0ZWQ09fTE9XQkFO RF9NQVg7CisJfQorCisJLyoKKwkgKiBSZWFkIGN1cnJlbnQgVkNPIGZyZXF1ZW5jeS4gIFdoZW4g dGhlIGJvYXJkIHN1cHBsaWVzIGFuIGV4cGxpY2l0CisJICogRnZjbyB2aWEgInNpdGltZSxwbGwt ZnZjbyIgdGhlIG92ZXJyaWRlIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGgKKwkgKiAoZS5nLiBhIGNo aXAgdmFyaWFudCB0aGF0IHJ1bnMgb3V0IG9mIHRoZSBkb2N1bWVudGVkIGJhbmQsIG9yIGEKKwkg KiBtb2RlIGxpa2UgSU5UU1lOQyB3aGVyZSBGcmVmKkRJVk4gZG9lcyBub3QgcmVwcm9kdWNlIHRo ZSBWQ08pLCBzbworCSAqIHNraXAgdGhlIGJhbmQgY2xhbXAgaW4gdGhhdCBjYXNlLgorCSAqLwor CWZ2Y28gPSBzaXQ5NTMxeF9nZXRfZnZjbyhzaXRkZXYsIHBsbF9pZHgpOworCWlmICghZnZjbykg eworCQlmdmNvID0gZnZjb19taW47CisJfSBlbHNlIGlmICghc2l0ZGV2LT5wbGxfZnZjb1twbGxf aWR4XSkgeworCQlpZiAoZnZjbyA8IGZ2Y29fbWluKQorCQkJZnZjbyA9IGZ2Y29fbWluOworCQll bHNlIGlmIChmdmNvID4gZnZjb19tYXgpCisJCQlmdmNvID0gZnZjb19tYXg7CisJfQorCisJZGl2 byA9IGRpdjY0X3U2NChmdmNvLCBmcmVxdWVuY3kpOworCWlmICghZGl2bykKKwkJcmV0dXJuIC1F SU5WQUw7CisKKwlkZXZfZGJnKHNpdGRldi0+ZGV2LAorCQkib3V0JXU6IEZ2Y289JWxsdSBmcmVx PSVsbHUgRElWTz0lbGx1IChlZmZlY3RpdmUgJWxsdSBIeilcbiIsCisJCW91dF9pZHgsIGZ2Y28s IGZyZXF1ZW5jeSwgZGl2bywgZGl2NjRfdTY0KGZ2Y28sIGRpdm8pKTsKKworCS8qIE1hcCBvdXRw dXQgaW5kZXggdG8gcGh5c2ljYWwgc2xvdCAqLworCXNsb3QgPSBpbmZvLT5jbGtvdXRfbWFwW291 dF9pZHhdOworCisJLyogRGV0ZXJtaW5lIHBhZ2UgYW5kIHBlci1wYWdlIHNsb3QgcmVnaXN0ZXIg Ki8KKwlpZiAoc2xvdCA+IFNJVDk1MzFYX1BBR0VfT1VUU1lTMF9TTE9UX01BWCkKKwkJcGFnZSA9 IFNJVDk1MzFYX1BBR0VfT1VUU1lTMTsKKwllbHNlCisJCXBhZ2UgPSBTSVQ5NTMxWF9QQUdFX09V VFNZUzA7CisJYmFzZV9yZWcgPSBjbGtvdXRfb2RyX2Rpdm5fYmFzZVtzbG90ICUgNl07CisKKwly YyA9IHNpdDk1MzF4X3dyaXRlX3U4KHNpdGRldiwgU0lUOTUzMVhfUkVHX09VVFNZU19ERUJVRywK KwkJCSAgICAgICBTSVQ5NTMxWF9ERUJVR19VTkxPQ0tfVkFMKTsKKwlpZiAocmMpCisJCXJldHVy biByYzsKKworCXJjID0gc2l0OTUzMXhfd3JpdGVfdTgoc2l0ZGV2LCBTSVQ5NTMxWF9SRUdfUFJH X0RJUl9HRU4sCisJCQkgICAgICAgU0lUOTUzMVhfUFJHX0NNRF9TVEFURSk7CisJaWYgKHJjKQor CQlyZXR1cm4gcmM7CisKKwlkaXZvX2J5dGVzWzBdID0gKGRpdm8gPj4gIDApICYgMHhGRjsKKwlk aXZvX2J5dGVzWzFdID0gKGRpdm8gPj4gIDgpICYgMHhGRjsKKwlkaXZvX2J5dGVzWzJdID0gKGRp dm8gPj4gMTYpICYgMHhGRjsKKwlkaXZvX2J5dGVzWzNdID0gKGRpdm8gPj4gMjQpICYgMHhGRjsK KwlkaXZvX2J5dGVzWzRdID0gKGRpdm8gPj4gMzIpICYgMHgwMzsgIC8qIG9ubHkgYml0cyBbMTow XSAqLworCisJcmMgPSBzaXQ5NTMxeF9yZWFkX3U4KHNpdGRldiwKKwkJCSAgICAgIFNJVDk1MzFY X1JFRyhwYWdlLCBiYXNlX3JlZyAtIDQpLCAmbXNiX29sZCk7CisJaWYgKHJjKQorCQlnb3RvIGNv bW1pdDsKKwlkaXZvX2J5dGVzWzRdIHw9IG1zYl9vbGQgJiAweEZDOworCisJZm9yIChqID0gMDsg aiA8IDU7IGorKykgeworCQlyYyA9IHNpdDk1MzF4X3dyaXRlX3U4KHNpdGRldiwKKwkJCQkgICAg ICAgU0lUOTUzMVhfUkVHKHBhZ2UsIGJhc2VfcmVnIC0gaiksCisJCQkJICAgICAgIGRpdm9fYnl0 ZXNbal0pOworCQlpZiAocmMpCisJCQlnb3RvIGNvbW1pdDsKKwl9CisKK2NvbW1pdDoKKwkvKgor CSAqIFN0ZXAgNDogTlZNIHVwZGF0ZSArIGxvb3AgbG9jay4gIEFsd2F5cyBydW4gcHJnX2NvbW1p dCgpIHNvIHRoZSBjaGlwCisJICogbGVhdmVzIHRoZSBQUkdfQ01EIHN0YXRlIHdpdGggdGhlIG91 dHB1dCBsb29wcyByZS1sb2NrZWQsIGV2ZW4gd2hlbiBhCisJICogd3JpdGUgYWJvdmUgZmFpbGVk OyBrZWVwIHRoZSBmaXJzdCBlcnJvciB0byByZXR1cm4uICBJdCBhbHNvIGNhcnJpZXMKKwkgKiB0 aGUgcmVxdWlyZWQgcG9zdC1sb2NrIHNldHRsaW5nIHNsZWVwLgorCSAqLworCXJldCA9IHNpdDk1 MzF4X3ByZ19jb21taXQoc2l0ZGV2KTsKKwlpZiAocmV0ICYmICFyYykKKwkJcmMgPSByZXQ7CisJ aWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKgorCSAqIFN0ZXAgNTogZmx1c2ggdGhlIFBMTCdz IG91dHB1dCBwaGFzZSBzbyB0aGUgbmV3IERJVk8gc3RhcnRzCisJICogYWxpZ25lZCBpbnN0ZWFk IG9mIGtlZXBpbmcgdGhlIGFyYml0cmFyeSBwaGFzZSB0aGUgZGl2aWRlcgorCSAqIGhhcHBlbmVk IHRvIGJlIGF0LgorCSAqLworCXJjID0gc2l0OTUzMXhfb3V0cHV0X3BoYXNlX2ZsdXNoKHNpdGRl diwgcGxsX2lkeCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlzaXRkZXYtPm91dFtvdXRf aWR4XS5mcmVxID0gKHUzMilkaXY2NF91NjQoZnZjbywgZGl2byk7CisKKwlyZXR1cm4gMDsKK30K KworLyoKKyAqIHNpdDk1MzF4X291dHB1dF9mcmVxX2dldCAtIHJlYWQgb3V0cHV0IGNsb2NrIGZy ZXF1ZW5jeSBmcm9tIGhhcmR3YXJlCisgKiBAb3V0X2lkeDoJb3V0cHV0IGluZGV4ICgwLU4gZm9y IHRoaXMgY2hpcCB2YXJpYW50KQorICogQGZyZXF1ZW5jeToJb3V0cHV0IGZyZXF1ZW5jeSBpbiBI egorICoKKyAqIFJlYWRzIHRoZSAzNC1iaXQgRElWTyBkaXZpZGVyIGJhY2sgZnJvbSB0aGUgb3V0 cHV0IHN5c3RlbSByZWdpc3RlcnMKKyAqIGFuZCBjb21wdXRlcyB0aGUgbGl2ZSBvdXRwdXQgZnJl cXVlbmN5IGFzIEZ2Y28gLyBESVZPLiAgVGhpcyBzdGF5cworICogY29ycmVjdCBldmVuIHdoZW4g dGhlIGRpdmlkZXIgd2FzIHJlcHJvZ3JhbW1lZCBiZWhpbmQgdGhlIGRyaXZlcidzCisgKiBiYWNr IChlLmcuIGJ5IGEgZGlyZWN0LUkyQyB1c2Vyc3BhY2UgdG9vbCksIHdoZXJlIHRoZSBjYWNoZWQg dmFsdWUKKyAqIHdvdWxkIGJlIHN0YWxlLgorICoKKyAqIFRoZSBjYWNoZWQgb3V0cHV0IHN0YXRl IGlzIHJlZnJlc2hlZCB3aXRoIHRoZSBjb21wdXRlZCB2YWx1ZS4KKyAqCisgKiBDYWxsZXIgbXVz dCBob2xkIHNpdGRldi0+bXVsdGlvcF9sb2NrLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNz LCAtRU5PREVWIHdoZW4gdGhlIG91dHB1dCBkaXZpZGVyIG9yIFZDTyByYXRlCisgKgkgICBpcyBu b3QgcmVzb2x2YWJsZSwgPDAgb24gcmVnaXN0ZXIgYWNjZXNzIGVycm9yCisgKi8KK2ludCBzaXQ5 NTMxeF9vdXRwdXRfZnJlcV9nZXQoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2LCB1OCBvdXRf aWR4LAorCQkJICAgICB1NjQgKmZyZXF1ZW5jeSkKK3sKKwljb25zdCBzdHJ1Y3Qgc2l0OTUzMXhf Y2hpcF9pbmZvICppbmZvID0gc2l0ZGV2LT5pbmZvOworCXU4IHNsb3QsIHBhZ2UsIGJhc2VfcmVn LCBwbGxfaWR4LCB2OworCXU2NCBmdmNvLCBkaXZvID0gMDsKKwlpbnQgcmMsIGo7CisKKwlsb2Nr ZGVwX2Fzc2VydF9oZWxkKCZzaXRkZXYtPm11bHRpb3BfbG9jayk7CisKKwlpZiAob3V0X2lkeCA+ PSBpbmZvLT5udW1fb3V0cHV0cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwbGxfaWR4ID0gc2l0 ZGV2LT5vdXRbb3V0X2lkeF0ucGxsX2lkeDsKKwlpZiAocGxsX2lkeCA+PSBTSVQ5NTMxWF9OVU1f UExMUykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlmdmNvID0gc2l0OTUzMXhfZ2V0X2Z2Y28oc2l0 ZGV2LCBwbGxfaWR4KTsKKwlpZiAoIWZ2Y28pCisJCXJldHVybiAtRU5PREVWOworCisJc2xvdCA9 IGluZm8tPmNsa291dF9tYXBbb3V0X2lkeF07CisJaWYgKHNsb3QgPiBTSVQ5NTMxWF9QQUdFX09V VFNZUzBfU0xPVF9NQVgpCisJCXBhZ2UgPSBTSVQ5NTMxWF9QQUdFX09VVFNZUzE7CisJZWxzZQor CQlwYWdlID0gU0lUOTUzMVhfUEFHRV9PVVRTWVMwOworCWJhc2VfcmVnID0gY2xrb3V0X29kcl9k aXZuX2Jhc2Vbc2xvdCAlIDZdOworCisJZm9yIChqID0gNDsgaiA+PSAwOyBqLS0pIHsKKwkJcmMg PSBzaXQ5NTMxeF9yZWFkX3U4KHNpdGRldiwKKwkJCQkgICAgICBTSVQ5NTMxWF9SRUcocGFnZSwg YmFzZV9yZWcgLSBqKSwgJnYpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJCWlmIChqID09 IDQpCisJCQl2ICY9IDB4MDM7CisJCWRpdm8gPSAoZGl2byA8PCA4KSB8IHY7CisJfQorCisJaWYg KCFkaXZvKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCSpmcmVxdWVuY3kgPSBkaXY2NF91NjQoZnZj bywgZGl2byk7CisJc2l0ZGV2LT5vdXRbb3V0X2lkeF0uZnJlcSA9ICh1MzIpKmZyZXF1ZW5jeTsK KworCXJldHVybiAwOworfQorCisvKgorICogUGhhc2UgYWRqdXN0IChQUkdfUlNUX0RFTEFZIHJl Z2lzdGVyLWJhc2VkKS4KKyAqCisgKiBUaGUgY2hpcCBleHBvc2VzIGEgcGVyLW91dHB1dCAzNC1i aXQgY29hcnNlIGRlbGF5IG1lYXN1cmVkIGluIFZDTworICogY2xvY2sgcGVyaW9kcyBwbHVzIGEg My1iaXQgZmluZSBkZWxheSBpbiBmaXhlZCAzMCBwcyBzdGVwcy4gIFRoZQorICogZml2ZSBieXRl cyBQUk9HNi4uUFJPRzIgaG9sZCB0aGUgZmllbGQgYWNyb3NzIHJlZ2lzdGVyczoKKyAqICAgYmFz ZSArIDAgIFBST0c2ICBbNzo1XSBPUFNUR19WQ0FTQ19CVU1QIChwcmVzZXJ2ZWQgdmlhIFJNVykK KyAqICAgICAgICAgICAgICAgICAgICBbNDoyXSBQUkdfUlNUX0ZJTkVfREVMQVkKKyAqICAgICAg ICAgICAgICAgICAgICBbMTowXSBQUkdfUlNUX0RFTEFZWzMzOjMyXQorICogICBiYXNlICsgMSAg UFJPRzUgIFBSR19SU1RfREVMQVlbMzE6MjRdCisgKiAgIGJhc2UgKyAyICBQUk9HNCAgUFJHX1JT VF9ERUxBWVsyMzoxNl0KKyAqICAgYmFzZSArIDMgIFBST0czICBQUkdfUlNUX0RFTEFZWzE1Ojhd CisgKiAgIGJhc2UgKyA0ICBQUk9HMiAgUFJHX1JTVF9ERUxBWVs3OjBdCisgKgorICogT3V0cHV0 cyAwLTUgbGl2ZSBvbiBQYWdlIDMsIG91dHB1dHMgNi0xMSBvbiBQYWdlIDQsIHdpdGggZWFjaAor ICogb3V0cHV0J3MgYmxvY2sgYXQgYmFzZSA9IDB4MTUgKyAxNiAqIChvdXRfaWR4ICUgNikuCisg KgorICogVGhlIGNoaXAgb25seSBzdXBwb3J0cyB1bnNpZ25lZCBwb3NpdGl2ZSBkZWxheS4gIEEg bmVnYXRpdmUgcGhhc2UKKyAqIGFkanVzdG1lbnQgKGFkdmFuY2UpIGlzIHdyYXBwZWQgdG8gKFRf b3V0IC0gfHBoYXNlfCkgbW9kdWxvIG9uZQorICogb3V0cHV0IHBlcmlvZCwgd2hpY2ggaXMgaWRl bnRpY2FsIGZvciBhIHBlcmlvZGljIHNpZ25hbC4KKyAqLworCitpbnQgc2l0OTUzMXhfb3V0cHV0 X3BoYXNlX2FkanVzdF9zZXQoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2LAorCQkJCSAgICAg dTggb3V0X2lkeCwgczMyIHBoYXNlX3BzKQoreworCWNvbnN0IHN0cnVjdCBzaXQ5NTMxeF9jaGlw X2luZm8gKmluZm8gPSBzaXRkZXYtPmluZm87CisJdTY0IGFic19wcywgZnZjbywgY29hcnNlLCBj b2Fyc2VfcHMsIHJlbV9wczsKKwl1OCBwYWdlLCBiYXNlLCBwcm9nNl92YWwsIGZpbmUgPSAwOwor CXU4IHBsbF9pZHgsIHNsb3Q7CisJdTMyIGZyZXE7CisJaW50IHJjLCByZXQ7CisKKwlpZiAob3V0 X2lkeCA+PSBpbmZvLT5udW1fb3V0cHV0cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwbGxfaWR4 ID0gc2l0ZGV2LT5vdXRbb3V0X2lkeF0ucGxsX2lkeDsKKwlpZiAocGxsX2lkeCA+PSBTSVQ5NTMx WF9OVU1fUExMUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmcmVxID0gc2l0ZGV2LT5vdXRbb3V0 X2lkeF0uZnJlcTsKKwlpZiAoIWZyZXEpCisJCXJldHVybiAtRUlOVkFMOworCisJZnZjbyA9IHNp dDk1MzF4X2dldF9mdmNvKHNpdGRldiwgcGxsX2lkeCk7CisJaWYgKCFmdmNvKQorCQlyZXR1cm4g LUVJTzsKKworCS8qCisJICogQ29udmVydCB0byB1bnNpZ25lZCBhYnNvbHV0ZSBkZWxheS4gIE5l Z2F0aXZlIHBoYXNlIChhZHZhbmNlKQorCSAqIGlzIHJlbmRlcmVkIGFzIFRfb3V0IC0gfHBoYXNl fCwgbW9kdWxvIHRoZSBvdXRwdXQgcGVyaW9kLgorCSAqLworCWlmIChwaGFzZV9wcyA9PSAwKSB7 CisJCWFic19wcyA9IDA7CisJfSBlbHNlIGlmIChwaGFzZV9wcyA+IDApIHsKKwkJYWJzX3BzID0g KHU2NClwaGFzZV9wczsKKwl9IGVsc2UgeworCQl1NjQgdF9vdXRfcHMgPSBkaXY2NF91NjQoMTAw MDAwMDAwMDAwMFVMTCwgZnJlcSk7CisJCXU2NCBhZHZhbmNlID0gKHU2NCkoLShzNjQpcGhhc2Vf cHMpOworCisJCWlmICh0X291dF9wcyA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWFkdmFu Y2UgJT0gdF9vdXRfcHM7CisJCWFic19wcyA9IChhZHZhbmNlID09IDApID8gMCA6ICh0X291dF9w cyAtIGFkdmFuY2UpOworCX0KKworCS8qCisJICogY29hcnNlX2N5Y2xlcyA9IGFic19wcyAqIEZ2 Y28gLyAxZTEyIHBzL3MuCisJICogbXVsX3U2NF91NjRfZGl2X3U2NCgpIGF2b2lkcyBvdmVyZmxv dyB3aGVuIGFic19wcyBhcHByb2FjaGVzCisJICogb25lIHNlY29uZCBvZiAxIFBQUyB3cmFwLWFy b3VuZC4KKwkgKi8KKwljb2Fyc2UgPSBtdWxfdTY0X3U2NF9kaXZfdTY0KGFic19wcywgZnZjbywg MTAwMDAwMDAwMDAwMFVMTCk7CisJaWYgKGNvYXJzZSA+PSAoMVVMTCA8PCBTSVQ5NTMxWF9PVVRf UFJHX0NPQVJTRV9CSVRTKSkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwkvKiBGaW5lIGRlbGF5ID0g cm91bmQoKGFic19wcyAtIGNvYXJzZSAqIHZjb19wZXJpb2RfcHMpIC8gMzAgcHMpICovCisJY29h cnNlX3BzID0gbXVsX3U2NF91NjRfZGl2X3U2NChjb2Fyc2UsIDEwMDAwMDAwMDAwMDBVTEwsIGZ2 Y28pOworCXJlbV9wcyA9IChhYnNfcHMgPiBjb2Fyc2VfcHMpID8gKGFic19wcyAtIGNvYXJzZV9w cykgOiAwOworCWlmIChyZW1fcHMpIHsKKwkJdTY0IHN0ZXBzOworCisJCXN0ZXBzID0gZGl2NjRf dTY0KHJlbV9wcyArIFNJVDk1MzFYX09VVF9QUkdfRklORV9TVEVQX1BTIC8gMiwKKwkJCQkgIFNJ VDk1MzFYX09VVF9QUkdfRklORV9TVEVQX1BTKTsKKwkJaWYgKHN0ZXBzID4gU0lUOTUzMVhfT1VU X1BSR19GSU5FX01BWCkKKwkJCXN0ZXBzID0gU0lUOTUzMVhfT1VUX1BSR19GSU5FX01BWDsKKwkJ ZmluZSA9ICh1OClzdGVwczsKKwl9CisKKwkvKgorCSAqIE1hcCBsb2dpY2FsIG91dHB1dCBpbmRl eCB0byB0aGUgY2hpcCdzIHBoeXNpY2FsIG91dHB1dCBzbG90LgorCSAqIE9uIFNpVDk1MzE3IHRo ZSBlaWdodCBsb2dpY2FsIG91dHB1dHMgbGFuZCBvbiBjaGlwIHNsb3RzCisJICogezAsIDMsIDQs IDUsIDcsIDgsIDksIDExfTsgb24gU2lUOTUzMTYgdGhlIG1hcCBpcyBpZGVudGl0eS4KKwkgKiBQ YWdlL2Jhc2UgbXVzdCBhZGRyZXNzIHRoZSBzbG90LCBub3QgdGhlIGxvZ2ljYWwgaW5kZXguCisJ ICovCisJc2xvdCA9IGluZm8tPmNsa291dF9tYXBbb3V0X2lkeF07CisJcGFnZSA9IChzbG90ID4g U0lUOTUzMVhfUEFHRV9PVVRTWVMwX1NMT1RfTUFYKSA/CisJICAgICAgIFNJVDk1MzFYX1BBR0Vf T1VUU1lTMSA6IFNJVDk1MzFYX1BBR0VfT1VUU1lTMDsKKwliYXNlID0gU0lUOTUzMVhfT1VUX1BS R19ERUxBWV9CQVNFICsKKwkgICAgICAgU0lUOTUzMVhfT1VUX1BSR19TTE9UX1NUUklERSAqIChz bG90ICUgNik7CisKKwkvKiBDYWxsZXIgKGRwbGwuYykgaG9sZHMgbXVsdGlvcF9sb2NrIGFyb3Vu ZCB0aGUgd2hvbGUgc2VxdWVuY2UuICovCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmc2l0ZGV2LT5t dWx0aW9wX2xvY2spOworCisJLyoKKwkgKiBUaGUgUFJHX1JTVF9ERUxBWSBieXRlcyBsaXZlIGlu IHRoZSBvdXRwdXQgc3lzdGVtLCBzbyB0aGUgd3JpdGVzCisJICogb25seSB0YWtlIGVmZmVjdCB3 aGVuIG1hZGUgaW5zaWRlIHRoZSBQUkdfQ01EIHByb2dyYW1taW5nIHN0YXRlIGFuZAorCSAqIGNv bW1pdHRlZCB0byB0aGUgTlZNIHNoYWRvdywgZXhhY3RseSBsaWtlIHNpdDk1MzF4X291dHB1dF9m cmVxX3NldCgpLgorCSAqLworCXJjID0gc2l0OTUzMXhfcHJnX2VudGVyKHNpdGRldik7CisJaWYg KHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBQUk9HNiBSTVc6IHByZXNlcnZlIE9QU1RHX1ZDQVND X0JVTVAgaW4gWzc6NV0gKi8KKwlyYyA9IHNpdDk1MzF4X3JlYWRfdTgoc2l0ZGV2LCBTSVQ5NTMx WF9SRUcocGFnZSwgYmFzZSksCisJCQkgICAgICAmcHJvZzZfdmFsKTsKKwlpZiAocmMpCisJCWdv dG8gY29tbWl0OworCisJcHJvZzZfdmFsICY9IFNJVDk1MzFYX09VVF9QUkdfT1BTVEdfTUFTSzsK Kwlwcm9nNl92YWwgfD0gKGZpbmUgPDwgU0lUOTUzMVhfT1VUX1BSR19GSU5FX1NISUZUKSAmCisJ CSAgICAgU0lUOTUzMVhfT1VUX1BSR19GSU5FX01BU0s7CisJcHJvZzZfdmFsIHw9ICh1OCkoKGNv YXJzZSA+PiAzMikgJiBTSVQ5NTMxWF9PVVRfUFJHX0NPQVJTRV9ISV9NQVNLKTsKKworCXJjID0g c2l0OTUzMXhfd3JpdGVfdTgoc2l0ZGV2LCBTSVQ5NTMxWF9SRUcocGFnZSwgYmFzZSksCisJCQkg ICAgICAgcHJvZzZfdmFsKTsKKwlpZiAocmMpCisJCWdvdG8gY29tbWl0OworCXJjID0gc2l0OTUz MXhfd3JpdGVfdTgoc2l0ZGV2LCBTSVQ5NTMxWF9SRUcocGFnZSwgYmFzZSArIDEpLAorCQkJICAg ICAgICh1OCkoKGNvYXJzZSA+PiAyNCkgJiAweEZGKSk7CisJaWYgKHJjKQorCQlnb3RvIGNvbW1p dDsKKwlyYyA9IHNpdDk1MzF4X3dyaXRlX3U4KHNpdGRldiwgU0lUOTUzMVhfUkVHKHBhZ2UsIGJh c2UgKyAyKSwKKwkJCSAgICAgICAodTgpKChjb2Fyc2UgPj4gMTYpICYgMHhGRikpOworCWlmIChy YykKKwkJZ290byBjb21taXQ7CisJcmMgPSBzaXQ5NTMxeF93cml0ZV91OChzaXRkZXYsIFNJVDk1 MzFYX1JFRyhwYWdlLCBiYXNlICsgMyksCisJCQkgICAgICAgKHU4KSgoY29hcnNlID4+IDgpICYg MHhGRikpOworCWlmIChyYykKKwkJZ290byBjb21taXQ7CisJcmMgPSBzaXQ5NTMxeF93cml0ZV91 OChzaXRkZXYsIFNJVDk1MzFYX1JFRyhwYWdlLCBiYXNlICsgNCksCisJCQkgICAgICAgKHU4KShj b2Fyc2UgJiAweEZGKSk7CisKK2NvbW1pdDoKKwkvKgorCSAqIEFsd2F5cyBsZWF2ZSB0aGUgUFJH X0NNRCBzdGF0ZSB2aWEgcHJnX2NvbW1pdCgpLCBldmVuIG9uIGEKKwkgKiBtaWQtc2VxdWVuY2Ug d3JpdGUgZmFpbHVyZSwgc28gdGhlIG91dHB1dCBsb29wcyBhcmUgcmUtbG9ja2VkIHJhdGhlcgor CSAqIHRoYW4gc3RyYW5kZWQgdW5sb2NrZWQ7IGtlZXAgdGhlIGZpcnN0IGVycm9yLgorCSAqLwor CXJldCA9IHNpdDk1MzF4X3ByZ19jb21taXQoc2l0ZGV2KTsKKwlpZiAocmV0ICYmICFyYykKKwkJ cmMgPSByZXQ7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKgorCSAqIFJlc3RhcnQgdGhl IG91dHB1dCBkaXZpZGVyIHBoYXNlIHNvIHRoZSBmcmVzaGx5IHByb2dyYW1tZWQgZGVsYXkgaXMK KwkgKiBhcHBsaWVkIGFnYWluc3QgYSBrbm93biBlZGdlIGluc3RlYWQgb2YgdGhlIGRpdmlkZXIn cyBhcmJpdHJhcnkKKwkgKiBydW5uaW5nIHBoYXNlLgorCSAqLworCXJldHVybiBzaXQ5NTMxeF9v dXRwdXRfcGhhc2VfZmx1c2goc2l0ZGV2LCBwbGxfaWR4KTsKK30KKworLyoKKyAqIHNpdDk1MzF4 X2NsZWFyX25vdGlmaWNhdGlvbnMgLSBjbGVhciBhbGwgbm90aWZpY2F0aW9uIHJlZ2lzdGVycwor ICoKKyAqIENsZWFycyBhbGwgd3JpdGUtMS10by1jbGVhciBub3RpZmljYXRpb24gcmVnaXN0ZXJz OgorICogICAtIFBMTCBvdXRlciBMT0wgbm90aWZpY2F0aW9uIChQYWdlIDAsIHJlZyAweDA3KQor ICogICAtIFBMTCBob2xkb3ZlciBmcmVlemUgbm90aWZpY2F0aW9uIChQYWdlIDAsIHJlZyAweDBC KQorICogICAtIFBMTCBpbm5lciBMT0wgbm90aWZpY2F0aW9uIChQYWdlIDAsIHJlZyAweDkzKQor ICogICAtIENsb2NrIG1vbml0b3IgWE8vUExMIG5vdGlmaWNhdGlvbiAoUGFnZSAwLCByZWcgMHg5 RSkKKyAqICAgLSBDbG9jayBpbnB1dCBub3RpZmljYXRpb25zIChQYWdlIDYsIHJlZ3MgMHgwMy8w eDA3LzB4OTMvMHg5NykKKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIHNpdGRldi0+bXVsdGlvcF9s b2NrLgorICovCitpbnQgc2l0OTUzMXhfY2xlYXJfbm90aWZpY2F0aW9ucyhzdHJ1Y3Qgc2l0OTUz MXhfZGV2ICpzaXRkZXYpCit7CisJaW50IHJjOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmc2l0 ZGV2LT5tdWx0aW9wX2xvY2spOworCisJLyogUGFnZSAweDAwIFcxQyBub3RpZmljYXRpb24gcmVn aXN0ZXJzICovCisJcmMgPSBzaXQ5NTMxeF93cml0ZV91OChzaXRkZXYsIFNJVDk1MzFYX1JFR19P VVRFUl9MT0xfTk9USUYsIDB4RkYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCXJjID0gc2l0 OTUzMXhfd3JpdGVfdTgoc2l0ZGV2LCBTSVQ5NTMxWF9SRUdfSE9fRlJFRVpFX05PVElGLCAweEZG KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwlyYyA9IHNpdDk1MzF4X3dyaXRlX3U4KHNpdGRl diwgU0lUOTUzMVhfUkVHX1BMTF9JTk5FUl9MT0xfTk9USUYsIDB4RkYpOworCWlmIChyYykKKwkJ cmV0dXJuIHJjOworCXJjID0gc2l0OTUzMXhfd3JpdGVfdTgoc2l0ZGV2LCBTSVQ5NTMxWF9SRUdf Q01PTl9OT1RJRiwgMHhGRik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBQYWdlIDB4 MDYgY2xvY2sgaW5wdXQgbW9uaXRvciBub3RpZmljYXRpb25zICovCisJcmMgPSBzaXQ5NTMxeF93 cml0ZV91OChzaXRkZXYsIFNJVDk1MzFYX0NMS01PTl9QX05PVElGXzAxLCAweEZGKTsKKwlpZiAo cmMpCisJCXJldHVybiByYzsKKwlyYyA9IHNpdDk1MzF4X3dyaXRlX3U4KHNpdGRldiwgU0lUOTUz MVhfQ0xLTU9OX1BfTk9USUZfMjMsIDB4RkYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCXJj ID0gc2l0OTUzMXhfd3JpdGVfdTgoc2l0ZGV2LCBTSVQ5NTMxWF9DTEtNT05fTl9OT1RJRl8wMSwg MHhGRik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJcmMgPSBzaXQ5NTMxeF93cml0ZV91OChz aXRkZXYsIFNJVDk1MzFYX0NMS01PTl9OX05PVElGXzIzLCAweEZGKTsKKwlpZiAocmMpCisJCXJl dHVybiByYzsKKworCWRldl9kYmcoc2l0ZGV2LT5kZXYsICJBbGwgbm90aWZpY2F0aW9uIHJlZ2lz dGVycyBjbGVhcmVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIElOVFNZTkMgY29uZmln dXJhdGlvbiByZWdpc3RlciB2YWx1ZXMuCisgKiBUaGVzZSBhcmUgd3JpdHRlbiB0byB0aGUgc291 cmNlIFBMTCdzIEVYVCBwYWdlIHRvIGVuYWJsZS9kaXNhYmxlCisgKiBpbnRlci1QTEwgc3luY2hy b25pemF0aW9uIChsb2NrIGZyZXF1ZW5jeSBQTEwgdG8gcGhhc2UgUExMKS4KKyAqLworc3RydWN0 IHNpdDk1MzF4X2ludHN5bmNfcmVnIHsKKwl1OCBvZmZzZXQ7CisJdTggZW5fdmFsOworCXU4IGRp c192YWw7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNpdDk1MzF4X2ludHN5bmNfcmVnIGlu dHN5bmNfY29uZmlnW10gPSB7CisJeyAweDJELCAweDAyLCAweDAwIH0sCisJeyAweDUwLCAweDA4 LCAweDAwIH0sCisJeyAweDUxLCAweDA0LCAweDAwIH0sCisJeyAweDU0LCAweDAyLCAweDAwIH0s CisJeyAweDU1LCAweDI4LCAweDIwIH0sCisJeyAweDVDLCAweDBGLCAweDAwIH0sCisJeyAweDVE LCAweEZGLCAweDAwIH0sCisJeyAweDZDLCAweERELCAweDAwIH0sCit9OworCisvKgorICogc2l0 OTUzMXhfaW50c3luY19lbmFibGUgLSBlbmFibGUgaW50ZXItUExMIHN5bmNocm9uaXphdGlvbgor ICogQHNyY19wbGxfaWR4OiBzb3VyY2UgKGZyZXF1ZW5jeSkgUExMIGluZGV4ICgwLTMpCisgKgor ICogRW5hYmxlcyBJTlRTWU5DIGdsb2JhbCBiaXQsIHVubG9ja3MgdGhlIHNvdXJjZSBQTEwncyBF WFQgcGFnZQorICogZGVidWcgcmVnaXN0ZXJzLCB3cml0ZXMgY29uZmlndXJhdGlvbiwgYW5kIHRy aWdnZXJzIGEgc21hbGwKKyAqIHVwZGF0ZSBvbiB0aGUgc291cmNlIFBMTC4KKyAqCisgKiBDYWxs ZXIgbXVzdCBob2xkIHNpdGRldi0+bXVsdGlvcF9sb2NrLgorICovCitpbnQgc2l0OTUzMXhfaW50 c3luY19lbmFibGUoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2LCB1OCBzcmNfcGxsX2lkeCkK K3sKKwl1OCBleHRfcGFnZSwgdmFsOworCWludCByYywgaTsKKworCWxvY2tkZXBfYXNzZXJ0X2hl bGQoJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsKKworCWlmIChzcmNfcGxsX2lkeCA+PSBTSVQ5NTMx WF9OVU1fUExMUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlleHRfcGFnZSA9IFNJVDk1MzFYX1BM TF9FWFRfUEFHRShzcmNfcGxsX2lkeCk7CisKKwlyYyA9IHNpdDk1MzF4X3JlYWRfdTgoc2l0ZGV2 LCBTSVQ5NTMxWF9SRUdfSU5UU1lOQ19HTE9CQUwsICZ2YWwpOworCWlmIChyYykKKwkJcmV0dXJu IHJjOworCXJjID0gc2l0OTUzMXhfd3JpdGVfdTgoc2l0ZGV2LCBTSVQ5NTMxWF9SRUdfSU5UU1lO Q19HTE9CQUwsCisJCQkgICAgICAgdmFsIHwgQklUKFNJVDk1MzFYX0lOVFNZTkNfRU5fQklUKSk7 CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBTbWFsbCB1cGRhdGUgb24gUGFnZSAwICov CisJcmMgPSBzaXQ5NTMxeF93cml0ZV91OChzaXRkZXYsIFNJVDk1MzFYX1JFR19HTE9CQUxfVVBE QVRFLAorCQkJICAgICAgIFNJVDk1MzFYX1NNQUxMX1VQREFURV9DTUQpOworCWlmIChyYykKKwkJ cmV0dXJuIHJjOworCisJLyogVW5sb2NrIGRlYnVnIG9uIEVYVCBwYWdlICovCisJcmMgPSBzaXQ5 NTMxeF93cml0ZV91OChzaXRkZXYsIFNJVDk1MzFYX1JFRyhleHRfcGFnZSwgU0lUOTUzMVhfUExM X1JFR19ERUJVRyksCisJCQkgICAgICAgU0lUOTUzMVhfUExMX0RFQlVHX1VOTE9DSyk7CisJaWYg KHJjKQorCQlyZXR1cm4gcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbnRzeW5j X2NvbmZpZyk7IGkrKykgeworCQlyYyA9IHNpdDk1MzF4X3dyaXRlX3U4KHNpdGRldiwKKwkJCQkg ICAgICAgU0lUOTUzMVhfUkVHKGV4dF9wYWdlLAorCQkJCQkJICAgIGludHN5bmNfY29uZmlnW2ld Lm9mZnNldCksCisJCQkJICAgICAgIGludHN5bmNfY29uZmlnW2ldLmVuX3ZhbCk7CisJCWlmIChy YykKKwkJCXJldHVybiByYzsKKwl9CisKKwkvKiBTbWFsbCB1cGRhdGUgb24gc291cmNlIFBMTCAq LworCXJjID0gc2l0OTUzMXhfd3JpdGVfcGxsX3U4KHNpdGRldiwgc3JjX3BsbF9pZHgsCisJCQkJ ICAgU0lUOTUzMVhfUExMX1JFR19TTUFMTF9VUERBVEUsCisJCQkJICAgU0lUOTUzMVhfU01BTExf VVBEQVRFX0NNRCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKK30KKwor LyoKKyAqIHNpdDk1MzF4X2ludHN5bmNfZGlzYWJsZSAtIGRpc2FibGUgaW50ZXItUExMIHN5bmNo cm9uaXphdGlvbgorICogQHNyY19wbGxfaWR4OiBzb3VyY2UgKGZyZXF1ZW5jeSkgUExMIGluZGV4 ICgwLTMpCisgKgorICogQ2xlYXJzIElOVFNZTkMgZ2xvYmFsIGJpdCwgd3JpdGVzIGRpc2FibGUg dmFsdWVzIHRvIHRoZSBzb3VyY2UKKyAqIFBMTCdzIEVYVCBwYWdlLCBhbmQgdHJpZ2dlcnMgYSBz bWFsbCB1cGRhdGUuCisgKgorICogQ2FsbGVyIG11c3QgaG9sZCBzaXRkZXYtPm11bHRpb3BfbG9j ay4KKyAqLworaW50IHNpdDk1MzF4X2ludHN5bmNfZGlzYWJsZShzdHJ1Y3Qgc2l0OTUzMXhfZGV2 ICpzaXRkZXYsIHU4IHNyY19wbGxfaWR4KQoreworCXU4IGV4dF9wYWdlLCB2YWw7CisJaW50IHJj LCBpOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmc2l0ZGV2LT5tdWx0aW9wX2xvY2spOworCisJ aWYgKHNyY19wbGxfaWR4ID49IFNJVDk1MzFYX05VTV9QTExTKQorCQlyZXR1cm4gLUVJTlZBTDsK KworCWV4dF9wYWdlID0gU0lUOTUzMVhfUExMX0VYVF9QQUdFKHNyY19wbGxfaWR4KTsKKworCXJj ID0gc2l0OTUzMXhfcmVhZF91OChzaXRkZXYsIFNJVDk1MzFYX1JFR19JTlRTWU5DX0dMT0JBTCwg JnZhbCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJcmMgPSBzaXQ5NTMxeF93cml0ZV91OChz aXRkZXYsIFNJVDk1MzFYX1JFR19JTlRTWU5DX0dMT0JBTCwKKwkJCSAgICAgICB2YWwgJiB+QklU KFNJVDk1MzFYX0lOVFNZTkNfRU5fQklUKSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkv KiBTbWFsbCB1cGRhdGUgb24gUGFnZSAwICovCisJcmMgPSBzaXQ5NTMxeF93cml0ZV91OChzaXRk ZXYsIFNJVDk1MzFYX1JFR19HTE9CQUxfVVBEQVRFLAorCQkJICAgICAgIFNJVDk1MzFYX1NNQUxM X1VQREFURV9DTUQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogVW5sb2NrIGRlYnVn IG9uIEVYVCBwYWdlICovCisJcmMgPSBzaXQ5NTMxeF93cml0ZV91OChzaXRkZXYsIFNJVDk1MzFY X1JFRyhleHRfcGFnZSwgU0lUOTUzMVhfUExMX1JFR19ERUJVRyksCisJCQkgICAgICAgU0lUOTUz MVhfUExMX0RFQlVHX1VOTE9DSyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlmb3IgKGkg PSAwOyBpIDwgQVJSQVlfU0laRShpbnRzeW5jX2NvbmZpZyk7IGkrKykgeworCQlyYyA9IHNpdDk1 MzF4X3dyaXRlX3U4KHNpdGRldiwKKwkJCQkgICAgICAgU0lUOTUzMVhfUkVHKGV4dF9wYWdlLAor CQkJCQkJICAgIGludHN5bmNfY29uZmlnW2ldLm9mZnNldCksCisJCQkJICAgICAgIGludHN5bmNf Y29uZmlnW2ldLmRpc192YWwpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJLyog U21hbGwgdXBkYXRlIG9uIHNvdXJjZSBQTEwgKi8KKwlyYyA9IHNpdDk1MzF4X3dyaXRlX3BsbF91 OChzaXRkZXYsIHNyY19wbGxfaWR4LAorCQkJCSAgIFNJVDk1MzFYX1BMTF9SRUdfU01BTExfVVBE QVRFLAorCQkJCSAgIFNJVDk1MzFYX1NNQUxMX1VQREFURV9DTUQpOworCWlmIChyYykKKwkJcmV0 dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzaXQ5NTMxeF9vdXRwdXRfcHVsc2Vf Y3RybF9zZXQgLSBwcm9ncmFtIHBlci1vdXRwdXQgUFVMU0VfQ1RSTCBieXRlCisgKiBAb3V0X2lk eDoJbG9naWNhbCBvdXRwdXQgaW5kZXggKHRyYW5zbGF0ZWQgdG8gY2hpcCBzbG90IGludGVybmFs bHkpCisgKiBAcHVsc2VfY3RybDoJOC1iaXQgUFVMU0VfQ1RSTCB2YWx1ZSAoUFJPRzApCisgKgor ICogV3JpdGVzIE9EUm5fUFJPRzAgb24gdGhlIG91dHB1dCBwYWdlIChQYWdlIDMgZm9yIHNsb3Rz IDAuLjUsCisgKiBQYWdlIDQgZm9yIHNsb3RzIDYuLjExKSBhdCBvZmZzZXQgMHgxQiArIDE2ICog KHNsb3QgJSA2KS4KKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIHNpdGRldi0+bXVsdGlvcF9sb2Nr LgorICovCitpbnQgc2l0OTUzMXhfb3V0cHV0X3B1bHNlX2N0cmxfc2V0KHN0cnVjdCBzaXQ5NTMx eF9kZXYgKnNpdGRldiwKKwkJCQkgICB1OCBvdXRfaWR4LCB1OCBwdWxzZV9jdHJsKQoreworCWNv bnN0IHN0cnVjdCBzaXQ5NTMxeF9jaGlwX2luZm8gKmluZm8gPSBzaXRkZXYtPmluZm87CisJdTgg c2xvdCwgcGFnZSwgcmVnOworCWludCByYywgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgm c2l0ZGV2LT5tdWx0aW9wX2xvY2spOworCisJaWYgKG91dF9pZHggPj0gaW5mby0+bnVtX291dHB1 dHMpCisJCXJldHVybiAtRUlOVkFMOworCisJc2xvdCA9IGluZm8tPmNsa291dF9tYXBbb3V0X2lk eF07CisJcGFnZSA9IChzbG90ID4gU0lUOTUzMVhfUEFHRV9PVVRTWVMwX1NMT1RfTUFYKSA/CisJ CVNJVDk1MzFYX1BBR0VfT1VUU1lTMSA6IFNJVDk1MzFYX1BBR0VfT1VUU1lTMDsKKwlyZWcgPSBT SVQ5NTMxWF9PVVRfUFJPRzBfQkFTRSArCisJICAgICAgU0lUOTUzMVhfT1VUX1BSR19TTE9UX1NU UklERSAqIChzbG90ICUgNik7CisKKwkvKgorCSAqIFBST0cwIGxpdmVzIGluIHRoZSBvdXRwdXQg c3lzdGVtLCBzbyBsaWtlIHRoZSBESVZPIGFuZAorCSAqIFBSR19SU1RfREVMQVkgd3JpdGVzIGl0 IG9ubHkgdGFrZXMgZWZmZWN0IGluc2lkZSB0aGUgUFJHX0NNRAorCSAqIHByb2dyYW1taW5nIHN0 YXRlIGNvbW1pdHRlZCB0byB0aGUgTlZNIHNoYWRvdy4KKwkgKi8KKwlyYyA9IHNpdDk1MzF4X3By Z19lbnRlcihzaXRkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBzaXQ5NTMx eF93cml0ZV91OChzaXRkZXYsIFNJVDk1MzFYX1JFRyhwYWdlLCByZWcpLCBwdWxzZV9jdHJsKTsK KworCS8qCisJICogQWx3YXlzIGxlYXZlIHRoZSBQUkdfQ01EIHN0YXRlIHZpYSBwcmdfY29tbWl0 KCksIGV2ZW4gaWYgdGhlIHdyaXRlCisJICogZmFpbGVkLCBzbyB0aGUgb3V0cHV0IGxvb3BzIGFy ZSByZS1sb2NrZWQgcmF0aGVyIHRoYW4gc3RyYW5kZWQKKwkgKiB1bmxvY2tlZDsga2VlcCB0aGUg Zmlyc3QgZXJyb3IuCisJICovCisJcmV0ID0gc2l0OTUzMXhfcHJnX2NvbW1pdChzaXRkZXYpOwor CWlmIChyZXQgJiYgIXJjKQorCQlyYyA9IHJldDsKKworCXJldHVybiByYzsKK30KKworLyogUmV0 cmllcyAoYXQgMSBzIGVhY2gpIHRvIHdhaXQgZm9yIGEgUExMIHRvIHJlYWNoIGl0cyBhY3RpdmUg c3RhdGUuICovCisjZGVmaW5lIFNJVDk1MzFYX1BMTF9BQ1RJVkVfUkVUUklFUwk5MAorCisvKgor ICogc2l0OTUzMXhfcGhhc2Vfb2Zmc2V0X3JlYWQgLSByZWFkIHBoYXNlIGRpZmZlcmVuY2Ugdmlh IFREQworICogQHBoYXNlX3BzOglvdXRwdXQgcGhhc2UgZGlmZmVyZW5jZSBpbiBwaWNvc2Vjb25k cworICoKKyAqIFJlYWRzIHRoZSBUaW1lLXRvLURpZ2l0YWwgQ29udmVydGVyIChUREMpIDQwLWJp dCBjb2RlIGZyb20gdGhlCisgKiBQTEwgcGFnZSByZWdpc3RlcnMsIHRoZW4gY29udmVydHMgdG8g cGljb3NlY29uZHMgdXNpbmcgdGhlIFZDTworICogZnJlcXVlbmN5OiBwaGFzZV9kaWZmID0gdGRj X2NvZGUgLyBmdmNvLgorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgc2l0ZGV2LT5tdWx0aW9wX2xv Y2suCisgKi8KK2ludCBzaXQ5NTMxeF9waGFzZV9vZmZzZXRfcmVhZChzdHJ1Y3Qgc2l0OTUzMXhf ZGV2ICpzaXRkZXYsIHU4IHBsbF9pZHgsCisJCQkgICAgICAgczY0ICpwaGFzZV9wcykKK3sKKwl1 NjQgZnZjbywgZnZjb19taHo7CisJczY0IHRkY19zaWduZWQ7CisJdTY0IHRkY19yYXc7CisJaW50 IHJjLCBpOworCWJvb2wgc2lnbjsKKwl1OCB2OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmc2l0 ZGV2LT5tdWx0aW9wX2xvY2spOworCisJaWYgKHBsbF9pZHggPj0gU0lUOTUzMVhfTlVNX1BMTFMp CisJCXJldHVybiAtRUlOVkFMOworCisJLyogVW5sb2NrIHRoZSBkZWJ1ZyBwYWdlIHNvIHRoZSBU REMgcmVnaXN0ZXJzIGFyZSBhY2Nlc3NpYmxlLiAqLworCXJjID0gc2l0OTUzMXhfd3JpdGVfcGxs X3U4KHNpdGRldiwgcGxsX2lkeCwKKwkJCQkgICBTSVQ5NTMxWF9QTExfUkVHX0RFQlVHLAorCQkJ CSAgIFNJVDk1MzFYX1BMTF9ERUJVR19VTkxPQ0spOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwor CisJLyoKKwkgKiBTZWxlY3QgdGhlIGRlYnVnIGNsb2NrIGZvciB0YXBzIGJlbG93IDIwMCBrSHos IHRoZW4gcG9pbnQgdGhlCisJICogcmVhZGJhY2sgYXQgdGhlIFREQy4gIE9ubHkgdGhlIG9uZSBi aXQgaXMgdG91Y2hlZDogd3JpdGluZyB0aGUKKwkgKiBtb2RpZmllciByZWdpc3RlciB3aG9sZSB3 b3VsZCBjbGVhciB0aGUgZmllbGRzIGJlbG9uZ2luZyB0bworCSAqIG90aGVyIHRhcHMuCisJICov CisJcmMgPSBzaXQ5NTMxeF91cGRhdGVfcGxsX3U4KHNpdGRldiwgcGxsX2lkeCwKKwkJCQkgICAg U0lUOTUzMVhfUExMX1JFR19EQkdfV1JJVEVfQ09ERSwKKwkJCQkgICAgU0lUOTUzMVhfREJHX0xP V19GUkVRX0NMS19CSVQsCisJCQkJICAgIFNJVDk1MzFYX0RCR19MT1dfRlJFUV9DTEtfQklUKTsK KwlpZiAocmMpCisJCXJldHVybiByYzsKKwlyYyA9IHNpdDk1MzF4X3dyaXRlX3BsbF91OChzaXRk ZXYsIHBsbF9pZHgsCisJCQkJICAgU0lUOTUzMVhfUExMX1JFR19EQkdfUkVBRF9DT0RFLAorCQkJ CSAgIFNJVDk1MzFYX0RCR19SRUFEX0NPREVfVERDKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsK KworCS8qIExhdGNoIGEgc2FtcGxlIGJ5IHJlYWRpbmcgdGhlIHRyaWdnZXIgcmVnaXN0ZXIgMyB0 aW1lcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXJjID0gc2l0OTUzMXhfcmVh ZF9wbGxfdTgoc2l0ZGV2LCBwbGxfaWR4LAorCQkJCQkgIFNJVDk1MzFYX1BMTF9SRUdfREJHX1RS SUdHRVIsICZ2KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKworCXRkY19yYXcgPSAw OworCisJcmMgPSBzaXQ5NTMxeF9yZWFkX3BsbF91OChzaXRkZXYsIHBsbF9pZHgsCisJCQkJICBT SVQ5NTMxWF9QTExfUkVHX0RCR19EQVRBXzQsICZ2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsK KwlzaWduID0gISEodiAmIEJJVChTSVQ5NTMxWF9URENfU0lHTl9CSVQpKTsKKwl0ZGNfcmF3ID0g KHU2NCkodiAmIDB4MDcpIDw8IDMyOworCisJcmMgPSBzaXQ5NTMxeF9yZWFkX3BsbF91OChzaXRk ZXYsIHBsbF9pZHgsCisJCQkJICBTSVQ5NTMxWF9QTExfUkVHX0RCR19EQVRBXzMsICZ2KTsKKwlp ZiAocmMpCisJCXJldHVybiByYzsKKwl0ZGNfcmF3IHw9ICh1NjQpdiA8PCAyNDsKKworCXJjID0g c2l0OTUzMXhfcmVhZF9wbGxfdTgoc2l0ZGV2LCBwbGxfaWR4LAorCQkJCSAgU0lUOTUzMVhfUExM X1JFR19EQkdfREFUQV8yLCAmdik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJdGRjX3JhdyB8 PSAodTY0KXYgPDwgMTY7CisKKwlyYyA9IHNpdDk1MzF4X3JlYWRfcGxsX3U4KHNpdGRldiwgcGxs X2lkeCwKKwkJCQkgIFNJVDk1MzFYX1BMTF9SRUdfREJHX0RBVEFfMSwgJnYpOworCWlmIChyYykK KwkJcmV0dXJuIHJjOworCXRkY19yYXcgfD0gKHU2NCl2IDw8IDg7CisKKwlyYyA9IHNpdDk1MzF4 X3JlYWRfcGxsX3U4KHNpdGRldiwgcGxsX2lkeCwKKwkJCQkgIFNJVDk1MzFYX1BMTF9SRUdfREJH X0RBVEFfMCwgJnYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCXRkY19yYXcgfD0gdjsKKwor CS8qCisJICogQXBwbHkgc2lnbi4gIFBlciB0aGUgdmVuZG9yIHJlZmVyZW5jZSB0aGUgc2lnbiBi aXQgaXMgYWN0aXZlLWhpZ2gKKwkgKiBmb3IgYSBwb3NpdGl2ZSBvZmZzZXQ6IGJpdCBzZXQgLT4g K2NvZGUsIGJpdCBjbGVhciAtPiAtY29kZS4KKwkgKi8KKwl0ZGNfc2lnbmVkID0gc2lnbiA/IChz NjQpdGRjX3JhdyA6IC0oczY0KXRkY19yYXc7CisKKwkvKgorCSAqIEdldCBWQ08gZnJlcXVlbmN5 IGZvciBjb252ZXJzaW9uLiAgRnZjbz09MCBtZWFucyBESVZOIGlzIG5vdAorCSAqIHByb2dyYW1t ZWQgKFBMTCB1bnVzZWQgb24gdGhpcyBib2FyZCkgLS0gc2tpcCBzaWxlbnRseSByYXRoZXIKKwkg KiB0aGFuIHNwYW1taW5nIHRoZSBsb2cgb24gZXZlcnkgcG9sbCBjeWNsZS4KKwkgKi8KKwlmdmNv ID0gc2l0OTUzMXhfZ2V0X2Z2Y28oc2l0ZGV2LCBwbGxfaWR4KTsKKwlpZiAoIWZ2Y28pIHsKKwkJ ZGV2X2RiZyhzaXRkZXYtPmRldiwgIlBMTCVjOiBGdmNvIHVua25vd24sIHNraXAgVERDXG4iLAor CQkJJ0EnICsgcGxsX2lkeCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qCisJICogcGhh c2VfZGlmZiAoc2Vjb25kcykgPSB0ZGNfY29kZSAvIGZ2Y28KKwkgKiBwaGFzZV9kaWZmIChwcykg PSB0ZGNfY29kZSAqIDFlMTIgLyBmdmNvCisJICoKKwkgKiBUbyBhdm9pZCA2NC1iaXQgb3ZlcmZs b3c6CisJICogICBwaGFzZV9wcyA9IHRkY19jb2RlICogMWU2IC8gKGZ2Y28gLyAxZTYpCisJICov CisJZnZjb19taHogPSBkaXY2NF91NjQoZnZjbywgMTAwMDAwMFVMTCk7CisJaWYgKCFmdmNvX21o eikKKwkJcmV0dXJuIC1FSU87CisKKwkqcGhhc2VfcHMgPSBkaXY2NF9zNjQodGRjX3NpZ25lZCAq IDEwMDAwMDBMTCwgKHM2NClmdmNvX21oeik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNp dDk1MzF4X3JlZl9zdGF0ZV9mZXRjaCAtIHJlYWQgaW5wdXQgcmVmZXJlbmNlIHN0YXR1cyBmcm9t IGhhcmR3YXJlCisgKiBAaW5kZXg6CWxvZ2ljYWwgaW5wdXQgaW5kZXgKKyAqCisgKiBSZWFkcyBM T1MgYW5kIE9PRiBzdGF0dXMgZm9yIHRoZSBnaXZlbiBpbnB1dCBsYW5lIGZyb20gdGhlIFBhZ2Ug MHgwNgorICogY2xvY2sgbW9uaXRvciByZWdpc3RlcnMuICBQIGFuZCBOIGxhbmVzIGhhdmUgc2Vw YXJhdGUgcmVnaXN0ZXIgYmFua3M7CisgKiBlYWNoIHJlZ2lzdGVyIGNhcnJpZXMgdHdvIGlucHV0 IHBhaXJzIG5pYmJsZS1wYWNrZWQgKGV2ZW4gcGFpciBpbgorICogYml0cyBbMzowXSwgb2RkIHBh aXIgaW4gWzc6NF0pLgorICovCitzdGF0aWMgaW50IHNpdDk1MzF4X3JlZl9zdGF0ZV9mZXRjaChz dHJ1Y3Qgc2l0OTUzMXhfZGV2ICpzaXRkZXYsIHU4IGluZGV4KQoreworCXVuc2lnbmVkIGludCBy ZWcsIGZvcmNlX3JlZywgc3RhdGVfcmVnOworCXU4IHBhaXIsIHN0YXR1cywgZm9yY2UsIHN0YXRl OworCXN0cnVjdCBzaXQ5NTMxeF9yZWYgKnJlZjsKKwlpbnQgcmM7CisKKwkvKgorCSAqIFRoZSBY VEFML1hPIHJlZmVyZW5jZSAoaW5kZXggU0lUOTUzMVhfTUFYX0lOUFVUUykgaXMgdGhlIG9uLWNo aXAKKwkgKiBvc2NpbGxhdG9yIHRoYXQgZmVlZHMgZXZlcnkgUExMLiAgSXQgY2Fubm90IGJlIHJv dXRlZCBvciBkZXNlbGVjdGVkLAorCSAqIHNvIGl0cyBwaW4gaXMgbW9kZWxsZWQgYXMgcGVybWFu ZW50bHkgY29ubmVjdGVkIChzZWUKKwkgKiBzaXQ5NTMxeF9kcGxsX3hvX3Bpbl9vcHMpIGFuZCBp dHMgTE9TL09PRiBmbGFncyBhcmUgbmV2ZXIgY29uc3VsdGVkLgorCSAqIE9ubHkgdGhlIHJvdXRh YmxlIHBlci1sYW5lIGlucHV0cyAoMC4ubnVtX2lucHV0cy0xKSBhcmUgcG9sbGVkIGhlcmUuCisJ ICovCisJaWYgKGluZGV4ID49IFNJVDk1MzFYX01BWF9JTlBVVFMpCisJCXJldHVybiAtRUlOVkFM OworCisJcmVmID0gJnNpdGRldi0+cmVmW2luZGV4XTsKKwlwYWlyID0gc2l0OTUzMXhfaW5wdXRf cGFpcihpbmRleCk7CisKKwlpZiAoc2l0OTUzMXhfaW5wdXRfaXNfbihpbmRleCkpCisJCXJlZyA9 IHBhaXIgPCAyID8gU0lUOTUzMVhfQ0xLTU9OX05fU1RBVFVTXzAxCisJCQkgICAgICAgOiBTSVQ5 NTMxWF9DTEtNT05fTl9TVEFUVVNfMjM7CisJZWxzZQorCQlyZWcgPSBwYWlyIDwgMiA/IFNJVDk1 MzFYX0NMS01PTl9QX1NUQVRVU18wMQorCQkJICAgICAgIDogU0lUOTUzMVhfQ0xLTU9OX1BfU1RB VFVTXzIzOworCisJcmMgPSBzaXQ5NTMxeF9yZWFkX3U4KHNpdGRldiwgcmVnLCAmc3RhdHVzKTsK KwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwYWlyICYgMSkKKwkJc3RhdHVzID4+PSA0 OworCisJcmVmLT5sb3MgPSAhIShzdGF0dXMgJiAoQklUKFNJVDk1MzFYX0NMS01PTl9DTEtfTE9T UykgfAorCQkJCUJJVChTSVQ5NTMxWF9DTEtNT05fQ0xLX0xPU1NfRkQpKSk7CisJcmVmLT5vb2Yg PSAhIShzdGF0dXMgJiAoQklUKFNJVDk1MzFYX0NMS01PTl9GUkVRX0ZJTkUpIHwKKwkJCQlCSVQo U0lUOTUzMVhfQ0xLTU9OX0ZSRVFfQ09BUlNFKSkpOworCisJLyoKKwkgKiBXaGV0aGVyIHRoZSBy ZWNlaXZlciBpcyBvbi4gIFRoaXMgaGFzIHRvIGNvbWUgZnJvbSB0aGUgY2hpcDogaXQKKwkgKiBp cyB0aGUgbG9hZGVkIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWNpZGVzLCBhbmQgd2l0aG91dCByZWFk aW5nIGl0CisJICogYmFjayBldmVyeSBpbnB1dCB3b3VsZCBsb29rIGRpc2FibGVkIHVudGlsIHNv bWV0aGluZyBjYWxsZWQKKwkgKiBzaXQ5NTMxeF9pbnB1dF9lbmFibGUoKS4gIEEgbGFuZSBjb3Vu dHMgYXMgZGlzYWJsZWQgb25seSB3aGlsZQorCSAqIHRoZSBmb3JjZSBiaXQgb3ZlcnJpZGVzIGl0 IHRvIHRoZSBvZmYgc3RhdGU7IHdpdGggdGhlIGZvcmNlIGJpdAorCSAqIGNsZWFyIGl0IGZvbGxv d3MgdGhlIGNvbmZpZ3VyYXRpb24sIHdoaWNoIGlzIHRoZSBlbmFibGVkIGNhc2UuCisJICovCisJ c2l0OTUzMXhfaW5wdXRfZ2V0X3JlZ3Moc2l0ZGV2LCBpbmRleCwgJmZvcmNlX3JlZywgJnN0YXRl X3JlZyk7CisKKwlyYyA9IHNpdDk1MzF4X3JlYWRfdTgoc2l0ZGV2LCBmb3JjZV9yZWcsICZmb3Jj ZSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJcmMgPSBzaXQ5NTMxeF9yZWFkX3U4KHNpdGRl diwgc3RhdGVfcmVnLCAmc3RhdGUpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmVmLT5l bmFibGVkID0gISgoZm9yY2UgJiBCSVQocGFpcikpICYmICEoc3RhdGUgJiBCSVQocGFpcikpKTsK KworCXJldHVybiAwOworfQorCisvKgorICogc2l0OTUzMXhfaW5wdXRfbW9kZV9mZXRjaCAtIGRl dGVjdCBTRS9ERSBjb25maWd1cmF0aW9uIG9mIGFuIGlucHV0IHBhaXIKKyAqIEBwYWlyOglpbnB1 dCBwYWlyIG51bWJlciAoMC0zKQorICoKKyAqIFJlYWRzIENMS0lOeF9JTlBVVF9NT0RFIGFuZCBz dG9yZXMgdGhlIGRldGVjdGVkIHNpZ25hbCBtb2RlIG9uIGJvdGgKKyAqIGxhbmVzIG9mIHRoZSBw YWlyLiAgQSBwYWlyIHdpdGggbmVpdGhlciBTRSBsYW5lIGVuYWJsZWQgaXMgcnVubmluZworICog ZGlmZmVyZW50aWFsLgorICovCitzdGF0aWMgaW50IHNpdDk1MzF4X2lucHV0X21vZGVfZmV0Y2go c3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2LCB1OCBwYWlyKQoreworCWVudW0gc2l0OTUzMXhf c2lnbmFsX21vZGUgc2lnX21vZGU7CisJdTggbW9kZTsKKwlpbnQgcmM7CisKKwlyYyA9IHNpdDk1 MzF4X3JlYWRfdTgoc2l0ZGV2LCBTSVQ5NTMxWF9SRUdfSU5fTU9ERShwYWlyKSwgJm1vZGUpOwor CWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKG1vZGUgJiAoU0lUOTUzMVhfSU5fTU9ERV9T RV9QX0VOIHwgU0lUOTUzMVhfSU5fTU9ERV9TRV9OX0VOKSkKKwkJc2lnX21vZGUgPSBTSVQ5NTMx WF9NT0RFX1NFOworCWVsc2UKKwkJc2lnX21vZGUgPSBTSVQ5NTMxWF9NT0RFX0RFOworCisJc2l0 ZGV2LT5yZWZbcGFpciAqIDJdLnNpZ19tb2RlID0gc2lnX21vZGU7CisJc2l0ZGV2LT5yZWZbcGFp ciAqIDIgKyAxXS5zaWdfbW9kZSA9IHNpZ19tb2RlOworCisJZGV2X2RiZyhzaXRkZXYtPmRldiwg IkNMS0lOJXUgbW9kZSByZWcgMHglMDJ4IC0+ICVzXG4iLCBwYWlyLCBtb2RlLAorCQlzaWdfbW9k ZSA9PSBTSVQ5NTMxWF9NT0RFX0RFID8gImRpZmZlcmVudGlhbCIgOiAic2luZ2xlLWVuZGVkIik7 CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNpdDk1MzF4X2NoYW5fc3RhdGVfZmV0Y2ggLSBy ZWFkIFBMTCBjaGFubmVsIHN0YXR1cyBmcm9tIGhhcmR3YXJlCisgKgorICogUmVhZHMgbG9jayBz dGF0dXMgYW5kIG1vZGUgZnJvbSB0aGUgUExMIHN0YXR1cyByZWdpc3Rlci4KKyAqLworLyogUmVh ZCB0aGUgUExMIGFjdGl2ZS1zdGF0ZSBiaXQgKFBMTCBwYWdlIHJlZyAweDAyIGJpdCAwKS4gKi8K K3N0YXRpYyBpbnQgc2l0OTUzMXhfcGxsX2lzX2FjdGl2ZShzdHJ1Y3Qgc2l0OTUzMXhfZGV2ICpz aXRkZXYsIHU4IHBsbF9pZHgsCisJCQkJICBib29sICphY3RpdmUpCit7CisJdTggdjsKKwlpbnQg cmM7CisKKwlyYyA9IHNpdDk1MzF4X3JlYWRfcGxsX3U4KHNpdGRldiwgcGxsX2lkeCwgU0lUOTUz MVhfUExMX1JFR19BQ1RJVkUsICZ2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCSphY3Rp dmUgPSAhISh2ICYgU0lUOTUzMVhfUExMX0FDVElWRV9CSVQpOworCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbnQgc2l0OTUzMXhfY2hhbl9zdGF0ZV9mZXRjaChzdHJ1Y3Qgc2l0OTUzMXhfZGV2 ICpzaXRkZXYsIHU4IHBsbF9pZHgpCit7CisJdTggc3RhdHVzLCBvdXRlcl9sb2wsIGlucHV0X3Nl bCwgaW5uZXJfbG9sLCBob19mcmVlemUsIGFjdGl2ZXNlbF9yZWc7CisJc3RydWN0IHNpdDk1MzF4 X2NoYW4gKmNoYW4gPSAmc2l0ZGV2LT5jaGFuW3BsbF9pZHhdOworCWJvb2wgYWN0aXZlOworCWlu dCByYzsKKworCS8qCisJICogV2hldGhlciB0aGUgUExMIGlzIHJ1bm5pbmcgYXQgYWxsLiAgVGhl IGxvc3Mtb2YtbG9jayBiaXQgcmVhZAorCSAqIGJlbG93IGlzIGRyaXZlbiBieSB0aGUgUExMIGl0 c2VsZiwgc28gb24gb25lIHRoZSBsb2FkZWQKKwkgKiBjb25maWd1cmF0aW9uIGxlYXZlcyB1bnVz ZWQgaXQgc2ltcGx5IHN0YXlzIGNsZWFyIGFuZCB3b3VsZAorCSAqIG90aGVyd2lzZSByZWFkIGFz IGEgbG9jay4KKwkgKi8KKwlyYyA9IHNpdDk1MzF4X3BsbF9pc19hY3RpdmUoc2l0ZGV2LCBwbGxf aWR4LCAmYWN0aXZlKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gc2l0OTUzMXhf cmVhZF9wbGxfdTgoc2l0ZGV2LCBwbGxfaWR4LAorCQkJCSAgU0lUOTUzMVhfUExMX1JFR19TVEFU VVMsICZzdGF0dXMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBzaXQ5NTMxeF9y ZWFkX3U4KHNpdGRldiwgU0lUOTUzMVhfUkVHX09VVEVSX0xPTF9TVEFUVVMsCisJCQkgICAgICAm b3V0ZXJfbG9sKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qCisJICogUmVhZCB0aGUg aW5wdXQgc291cmNlIHRoZSBQTEwgaGFzIGN1cnJlbnRseSBzZWxlY3RlZCBhcyBpdHMKKwkgKiBh Y3RpdmUgcmVmZXJlbmNlLiAgVGhpcyBsaXZlcyBpbiB0aGUgbG93IG5pYmJsZSBvZiB0aGUgbGFz dAorCSAqIHJlZ2lzdGVyIG9mIHRoZSBQTEwncyBwYWdlLTEgcHJpb3JpdHkgYmxvY2sgKENMS19B Q1RJVkVTRUxfUExMKSwKKwkgKiBub3Qgb24gdGhlIFBMTCBwYWdlIC0tIFBMTC1wYWdlIDB4Mjkg aXMgYSBjb25maWcgcmVnaXN0ZXIuCisJICovCisJYWN0aXZlc2VsX3JlZyA9IFNJVDk1MzFYX1BS SU9fQkFTRV9SRUcgKworCQkJU0lUOTUzMVhfUFJJT19SRUdTX1BFUl9QTEwgKiBwbGxfaWR4ICsK KwkJCVNJVDk1MzFYX1BSSU9fQUNUSVZFU0VMX09GRjsKKwlyYyA9IHNpdDk1MzF4X3JlYWRfdTgo c2l0ZGV2LAorCQkJICAgICAgU0lUOTUzMVhfUkVHKFNJVDk1MzFYX1BBR0VfUFJJT1NZUywKKwkJ CQkJICAgYWN0aXZlc2VsX3JlZyksCisJCQkgICAgICAmaW5wdXRfc2VsKTsKKwlpZiAocmMpCisJ CXJldHVybiByYzsKKworCXJjID0gc2l0OTUzMXhfcmVhZF91OChzaXRkZXYsIFNJVDk1MzFYX1JF R19QTExfSU5ORVJfTE9MX1NUQVRVUywKKwkJCSAgICAgICZpbm5lcl9sb2wpOworCWlmIChyYykK KwkJcmV0dXJuIHJjOworCisJcmMgPSBzaXQ5NTMxeF9yZWFkX3U4KHNpdGRldiwgU0lUOTUzMVhf UkVHX0hPX0ZSRUVaRV9TVEFUVVMsICZob19mcmVlemUpOworCWlmIChyYykKKwkJcmV0dXJuIHJj OworCisJLyogU1RBVFVTXzFfR0VORVJJQyByZXBvcnRzIGxvc3Mgb2YgbG9jaywgc28gaW52ZXJ0 IGl0LiAqLworCWNoYW4tPmFjdGl2ZSA9IGFjdGl2ZTsKKwljaGFuLT5sb2NrZWQgPSBhY3RpdmUg JiYgIShvdXRlcl9sb2wgJiBCSVQocGxsX2lkeCkpOworCWNoYW4tPm1vZGUgPSAhIShzdGF0dXMg JiBTSVQ5NTMxWF9QTExfU1RBVFVTX09VVEVSX0RJUyk7CisJY2hhbi0+c2VsZWN0ZWRfcmVmID0K KwkJc2l0OTUzMXhfaHdfc3JjX2lucHV0KGlucHV0X3NlbCAmIFNJVDk1MzFYX1BSSU9fTklCQkxF X01BU0spOworCWNoYW4tPmlubmVyX2xvbCA9ICEhKGlubmVyX2xvbCAmIEJJVChwbGxfaWR4KSk7 CisJY2hhbi0+aG9fZnJlZXplID0gISEoaG9fZnJlZXplICYgQklUKHBsbF9pZHgpKTsKKworCXJl dHVybiAwOworfQorCisvKgorICogc2l0OTUzMXhfb3V0X3N0YXRlX2ZldGNoIC0gcmVhZCBvdXRw dXQgc3RhdHVzIGZyb20gaGFyZHdhcmUKKyAqCisgKiBSZWFkcyB0aGUgb3V0cHV0IFBMTCBhc3Nv Y2lhdGlvbiBmcm9tIHRoZSBQTEwgcGFnZSBvdXRwdXQgbWFwCisgKiByZWdpc3RlcnMgaW50byBv dXQtPnJvdXRlZCAvIG91dC0+cGxsX2lkeCwgYW5kIHRoZSBjdXJyZW50IGRyaXZlCisgKiBzdGF0 ZSBmcm9tIHRoZSBIaS1aIGZvcmNlIGJpdHMgaW50byBvdXQtPmVuYWJsZWQuICBUaGUgdHdvIGFy ZQorICogc2VwYXJhdGU6IHJvdXRpbmcgZGVjaWRlcyB3aGV0aGVyIHRoZSBvdXRwdXQgZ2V0cyBh IERQTEwgcGluIGF0IGFsbCwKKyAqIHdoaWxlIGEgbXV0ZWQgYnV0IHJvdXRlZCBvdXRwdXQga2Vl cHMgaXRzIHBpbiBhbmQgcmVwb3J0cworICogRFBMTF9QSU5fU1RBVEVfRElTQ09OTkVDVEVEIHVu dGlsIGl0IGlzIHVuLW11dGVkLgorICovCitzdGF0aWMgaW50IHNpdDk1MzF4X291dF9zdGF0ZV9m ZXRjaChzdHJ1Y3Qgc2l0OTUzMXhfZGV2ICpzaXRkZXYsIHU4IGluZGV4KQoreworCXN0cnVjdCBz aXQ5NTMxeF9vdXQgKm91dCA9ICZzaXRkZXYtPm91dFtpbmRleF07CisJdTggbWFwX2xvLCBtYXBf aGksIHNsb3Q7CisJaW50IHBsbF9pZHg7CisJYm9vbCBtdXRlZDsKKwlpbnQgcmM7CisKKwlzbG90 ID0gc2l0ZGV2LT5pbmZvLT5jbGtvdXRfbWFwW2luZGV4XTsKKworCXJjID0gc2l0OTUzMXhfb3V0 cHV0X2ZvcmNlZF9oaXooc2l0ZGV2LCBzbG90LCAmbXV0ZWQpOworCWlmIChyYykKKwkJcmV0dXJu IHJjOworCisJLyoKKwkgKiBEVCBib2FyZC1jb25maWcgb3ZlcnJpZGU6IHRoZSBwZXItUExMIE9V VFBVVF9FTkFCTEUgYml0bWFwcworCSAqICgweDI3LzB4MjgpIGRvIG5vdCB1bmFtYmlndW91c2x5 IGV4cHJlc3Mgb3V0cHV0LT5QTEwgcm91dGluZyBvbgorCSAqIGV2ZXJ5IGNvbmZpZyAob3Zlcmxh cHMsIGFuZCBzb21lIG91dHB1dHMgcm91dGVkIG91dHNpZGUgdGhhdAorCSAqIHBhdGgpLiAgV2hl biB0aGUgYm9hcmQgc3VwcGxpZXMgYW4gZXhwbGljaXQgbWFwLCB0cnVzdCBpdC4KKwkgKi8KKwlp ZiAoc2l0ZGV2LT5vdXRfcGxsX21hcF92YWxpZCkgeworCQl1OCBtID0gc2l0ZGV2LT5vdXRfcGxs X21hcFtpbmRleF07CisKKwkJaWYgKG0gPCBTSVQ5NTMxWF9OVU1fUExMUykgeworCQkJb3V0LT5w bGxfaWR4ID0gbTsKKwkJCW91dC0+cm91dGVkID0gdHJ1ZTsKKwkJCW91dC0+ZW5hYmxlZCA9ICFt dXRlZDsKKwkJfSBlbHNlIHsKKwkJCW91dC0+cGxsX2lkeCA9IDA7CisJCQlvdXQtPnJvdXRlZCA9 IGZhbHNlOworCQkJb3V0LT5lbmFibGVkID0gZmFsc2U7CisJCX0KKwkJcmV0dXJuIDA7CisJfQor CisJLyoKKwkgKiBUaGUgT1VUX01BUF9MTy9ISSBiaXRtYXBzIGFyZSBpbmRleGVkIGJ5IHRoZSBw aHlzaWNhbCBzbG90IHRoZQorCSAqIG91dHB1dCBvY2N1cGllcyBvbiB0aGUgY2hpcCwgbm90IGJ5 IHRoZSBkcml2ZXIncyBsb2dpY2FsIG91dHB1dAorCSAqIGluZGV4ICh0cmFuc2xhdGVkIGFib3Zl IHZpYSB0aGUgY2hpcC1pbmZvIGNsa291dF9tYXBbXTogaWRlbnRpdHkKKwkgKiBvbiBTaVQ5NTMx Niwgbm9uLWNvbnRpZ3VvdXMgb24gU2lUOTUzMTcpLgorCSAqCisJICogRGV0ZXJtaW5lIHdoaWNo IFBMTCBkcml2ZXMgdGhpcyBvdXRwdXQgYnkgY2hlY2tpbmcgZWFjaCBQTEwncworCSAqIG91dHB1 dCBtYXAgcmVnaXN0ZXJzICgweDI3ID0gc2xvdHMgOC0xMSwgMHgyOCA9IHNsb3RzIDAtNykuCisJ ICovCisJZm9yIChwbGxfaWR4ID0gMDsgcGxsX2lkeCA8IFNJVDk1MzFYX05VTV9QTExTOyBwbGxf aWR4KyspIHsKKwkJcmMgPSBzaXQ5NTMxeF9yZWFkX3BsbF91OChzaXRkZXYsIHBsbF9pZHgsCisJ CQkJCSAgU0lUOTUzMVhfUExMX1JFR19PVVRfTUFQX0xPLCAmbWFwX2xvKTsKKwkJaWYgKHJjKQor CQkJcmV0dXJuIHJjOworCisJCXJjID0gc2l0OTUzMXhfcmVhZF9wbGxfdTgoc2l0ZGV2LCBwbGxf aWR4LAorCQkJCQkgIFNJVDk1MzFYX1BMTF9SRUdfT1VUX01BUF9ISSwgJm1hcF9oaSk7CisJCWlm IChyYykKKwkJCXJldHVybiByYzsKKworCQlpZiAoc2xvdCA8IDgpIHsKKwkJCWlmIChtYXBfbG8g JiBCSVQoc2xvdCkpIHsKKwkJCQlvdXQtPnBsbF9pZHggPSBwbGxfaWR4OworCQkJCW91dC0+cm91 dGVkID0gdHJ1ZTsKKwkJCQlvdXQtPmVuYWJsZWQgPSAhbXV0ZWQ7CisJCQkJcmV0dXJuIDA7CisJ CQl9CisJCX0gZWxzZSB7CisJCQlpZiAobWFwX2hpICYgQklUKHNsb3QgLSA4KSkgeworCQkJCW91 dC0+cGxsX2lkeCA9IHBsbF9pZHg7CisJCQkJb3V0LT5yb3V0ZWQgPSB0cnVlOworCQkJCW91dC0+ ZW5hYmxlZCA9ICFtdXRlZDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworCS8qIE91 dHB1dCBub3QgbWFwcGVkIHRvIGFueSBQTEwgKi8KKwlvdXQtPnBsbF9pZHggPSAwOworCW91dC0+ cm91dGVkID0gZmFsc2U7CisJb3V0LT5lbmFibGVkID0gZmFsc2U7CisKKwlyZXR1cm4gMDsKK30K KworLyoKKyAqIHNpdDk1MzF4X3JlZl9wbGxfbWFza19mZXRjaCAtIHNlZWQgdGhlIGlucHV0LXRv LVBMTCB1c2FnZSBtYXNrcworICoKKyAqIHJlZi0+cGxsX21hc2sgaXMgdGhlIHJlZmNvdW50IHRo ZSBkaXNjb25uZWN0IHBhdGggdXNlcyB0byBkZWNpZGUgd2hlbgorICogYW4gaW5wdXQgcmVjZWl2 ZXIgbWF5IGJlIHBvd2VyZWQgZG93bjogdGhlIHBoeXNpY2FsIGlucHV0IGlzIG9ubHkKKyAqIGRp c2FibGVkIG9uY2UgdGhlIGxhc3QgRFBMTCBoYXMgcmVsZWFzZWQgaXQuICBJdCB0aGVyZWZvcmUg aGFzIHRvCisgKiBzdGFydCBvdXQgbWF0Y2hpbmcgdGhlIGhhcmR3YXJlLiAgV2l0aG91dCB0aGlz IHBhc3MgZXZlcnkgbWFzayBzdGFydHMKKyAqIGF0IHplcm8sIGFuZCBkaXNjb25uZWN0aW5nIGFu IGlucHV0IGZyb20gb25lIERQTEwgZHJvcHMgdGhlIG1hc2sgdG8KKyAqIHplcm8gYW5kIGRpc2Fi bGVzIGEgcmVjZWl2ZXIgdGhlIG90aGVyIERQTExzIGFyZSBzdGlsbCBsb2NrZWQgdG8uCisgKgor ICogQW4gaW5wdXQgaXMgY291bnRlZCBmb3IgYSBQTEwgd2hlbiBpdCBhcHBlYXJzIGluIHRoYXQg UExMJ3MgUGFnZS0xCisgKiBwcmlvcml0eSB0YWJsZSwgd2hpY2ggaXMgZXhhY3RseSB0aGUgY29u ZGl0aW9uIHRoZSBjb25uZWN0IGFuZAorICogZGlzY29ubmVjdCBjYWxsYmFja3MgbWFpbnRhaW4u ICBTb3VyY2VzIHRoYXQgYXJlIG5vdCBwaHlzaWNhbCBpbnB1dHMKKyAqIChPQ1hPLCBJTlRTWU5D KSBhbmQgcmVzZXJ2ZWQgY29kZXMgYXJlIHNraXBwZWQuCisgKgorICogQ2FsbGVyIG11c3QgaG9s ZCBzaXRkZXYtPm11bHRpb3BfbG9jay4KKyAqLworc3RhdGljIGludCBzaXQ5NTMxeF9yZWZfcGxs X21hc2tfZmV0Y2goc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2KQoreworCXU4IHNyY3NbU0lU OTUzMVhfUFJJT19NQVhfU0xPVFNdOworCXU4IHBsbF9pZHgsIHNsb3QsIGluZGV4OworCWludCBy YzsKKworCWZvciAocGxsX2lkeCA9IDA7IHBsbF9pZHggPCBTSVQ5NTMxWF9OVU1fUExMUzsgcGxs X2lkeCsrKSB7CisJCXJjID0gc2l0OTUzMXhfcHJpb190YWJsZV9yZWFkKHNpdGRldiwgcGxsX2lk eCwgc3Jjcyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlmb3IgKHNsb3QgPSAwOyBz bG90IDwgU0lUOTUzMVhfUFJJT19NQVhfU0xPVFM7IHNsb3QrKykgeworCQkJaW5kZXggPSBzaXQ5 NTMxeF9od19zcmNfaW5wdXQoc3Jjc1tzbG90XSk7CisJCQlpZiAoaW5kZXggPj0gc2l0ZGV2LT5p bmZvLT5udW1faW5wdXRzKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogT24gYSBkaWZm ZXJlbnRpYWxseSBjb25maWd1cmVkIHBhaXIgb25seSB0aGUgUCBsYW5lCisJCQkgKiBoYXMgYSBE UExMIHBpbiwgc28gdGhhdCBpcyB0aGUgbGFuZSB0aGUgY29ubmVjdCBhbmQKKwkJCSAqIGRpc2Nv bm5lY3QgY2FsbGJhY2tzIGFjY291bnQgZm9yLiAgRm9sZCBhbiBOLWxhbmUKKwkJCSAqIHRhYmxl IGVudHJ5IG9udG8gaXRzIFAgbGFuZSwgb3RoZXJ3aXNlIHRoZSBjb3VudAorCQkJICogd291bGQg bGFuZCBvbiBhIGxhbmUgbm90aGluZyBldmVyIHJlbGVhc2VzLiAgVGhlCisJCQkgKiBzaWduYWxs aW5nIG1vZGUgaXMgYWxyZWFkeSBrbm93biBoZXJlOgorCQkJICogc2l0OTUzMXhfaW5wdXRfbW9k ZV9mZXRjaCgpIHJ1bnMgZmlyc3QuCisJCQkgKi8KKwkJCWlmIChzaXQ5NTMxeF9pbnB1dF9pc19u KGluZGV4KSAmJgorCQkJICAgIHNpdGRldi0+cmVmW2luZGV4XS5zaWdfbW9kZSA9PSBTSVQ5NTMx WF9NT0RFX0RFKQorCQkJCWluZGV4LS07CisKKwkJCXNpdGRldi0+cmVmW2luZGV4XS5wbGxfbWFz ayB8PSBCSVQocGxsX2lkeCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNp dDk1MzF4X2Rldl9zdGF0ZV9mZXRjaCAtIHJlYWQgYWxsIGhhcmR3YXJlIHN0YXRlIGF0IHN0YXJ0 dXAKKyAqCisgKiBDYWxsZWQgb25jZSBkdXJpbmcgcHJvYmUgdG8gcG9wdWxhdGUgdGhlIGluaXRp YWwgc3RhdGUgY2FjaGUuCisgKi8KK3N0YXRpYyBpbnQgc2l0OTUzMXhfZGV2X3N0YXRlX2ZldGNo KHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldikKK3sKKwlpbnQgcmM7CisJdTggaTsKKworCS8q IERldGVjdCBTRS9ERSBjb25maWd1cmF0aW9uIGJlZm9yZSBhbnkgcGVyLWxhbmUgYWNjZXNzICov CisJZm9yIChpID0gMDsgaSA8IHNpdGRldi0+aW5mby0+bnVtX2lucHV0cyAvIDI7IGkrKykgewor CQlyYyA9IHNpdDk1MzF4X2lucHV0X21vZGVfZmV0Y2goc2l0ZGV2LCBpKTsKKwkJaWYgKHJjKSB7 CisJCQlkZXZfZXJyKHNpdGRldi0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gZmV0Y2ggQ0xLSU4ldSBt b2RlOiAlZFxuIiwgaSwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJZm9yIChpID0g MDsgaSA8IHNpdGRldi0+aW5mby0+bnVtX2lucHV0czsgaSsrKSB7CisJCXJjID0gc2l0OTUzMXhf cmVmX3N0YXRlX2ZldGNoKHNpdGRldiwgaSk7CisJCWlmIChyYykgeworCQkJZGV2X2VycihzaXRk ZXYtPmRldiwKKwkJCQkiRmFpbGVkIHRvIGZldGNoIGlucHV0ICV1IHN0YXRlOiAlZFxuIiwgaSwg cmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJLyoKKwkgKiBUaGUgcHJpb3JpdHktdGFi bGUgcmVhZCB3YWxrcyB0aGUgUGFnZS0xIHJlZ2lzdGVycywgc28gaXQgcnVucworCSAqIHdpdGgg bXVsdGlvcF9sb2NrIGhlbGQgbGlrZSBldmVyeSBvdGhlciBtdWx0aS1yZWdpc3RlciBzZXF1ZW5j ZS4KKwkgKiBOb3RoaW5nIGNhbiByYWNlIHdpdGggaXQgaGVyZSAtLSB0aGUgRFBMTHMgYXJlIG5v dCByZWdpc3RlcmVkIGFuZAorCSAqIHRoZSBtb25pdG9yIGlzIG5vdCBydW5uaW5nIHlldCAtLSBi dXQgdGhlIHBhZ2UgaGFuZGxpbmcgc3RheXMKKwkgKiBzZXJpYWxpemVkIHRoZSBzYW1lIHdheSBh cyBhdCBydW50aW1lLgorCSAqLworCW11dGV4X2xvY2soJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsK KwlyYyA9IHNpdDk1MzF4X3JlZl9wbGxfbWFza19mZXRjaChzaXRkZXYpOworCW11dGV4X3VubG9j aygmc2l0ZGV2LT5tdWx0aW9wX2xvY2spOworCWlmIChyYykgeworCQlkZXZfZXJyKHNpdGRldi0+ ZGV2LAorCQkJIkZhaWxlZCB0byBmZXRjaCBpbnB1dCBwcmlvcml0eSB0YWJsZXM6ICVkXG4iLCBy Yyk7CisJCXJldHVybiByYzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l0ZGV2LT5pbmZvLT5u dW1fb3V0cHV0czsgaSsrKSB7CisJCXJjID0gc2l0OTUzMXhfb3V0X3N0YXRlX2ZldGNoKHNpdGRl diwgaSk7CisJCWlmIChyYykgeworCQkJZGV2X2VycihzaXRkZXYtPmRldiwKKwkJCQkiRmFpbGVk IHRvIGZldGNoIG91dHB1dCAldSBzdGF0ZTogJWRcbiIsIGksIHJjKTsKKwkJCXJldHVybiByYzsK KwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBTSVQ5NTMxWF9OVU1fUExMUzsgaSsrKSB7CisJ CXJjID0gc2l0OTUzMXhfY2hhbl9zdGF0ZV9mZXRjaChzaXRkZXYsIGkpOworCQlpZiAocmMpIHsK KwkJCWRldl9lcnIoc2l0ZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byBmZXRjaCBQTEwlYyBzdGF0 ZTogJWRcbiIsCisJCQkJJ0EnICsgaSwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNpdDk1MzF4X2Rldl9yZWZfc3RhdGVzX3VwZGF0 ZShzdHJ1Y3Qgc2l0OTUzMXhfZGV2ICpzaXRkZXYpCit7CisJaW50IGksIHJjOworCisJZm9yIChp ID0gMDsgaSA8IHNpdGRldi0+aW5mby0+bnVtX2lucHV0czsgaSsrKSB7CisJCXJjID0gc2l0OTUz MXhfcmVmX3N0YXRlX2ZldGNoKHNpdGRldiwgaSk7CisJCWlmIChyYykKKwkJCWRldl93YXJuKHNp dGRldi0+ZGV2LAorCQkJCSAiRmFpbGVkIHRvIGdldCBSRUYldSBzdGF0dXM6ICVkXG4iLCBpLCBy Yyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaXQ5NTMxeF9kZXZfY2hhbl9zdGF0ZXNfdXBkYXRl KHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldikKK3sKKwlpbnQgaSwgcmM7CisKKwlmb3IgKGkg PSAwOyBpIDwgU0lUOTUzMVhfTlVNX1BMTFM7IGkrKykgeworCQlyYyA9IHNpdDk1MzF4X2NoYW5f c3RhdGVfZmV0Y2goc2l0ZGV2LCBpKTsKKwkJaWYgKHJjKQorCQkJZGV2X3dhcm4oc2l0ZGV2LT5k ZXYsCisJCQkJICJGYWlsZWQgdG8gZ2V0IFBMTCVjIHN0YXRlOiAlZFxuIiwKKwkJCQkgJ0EnICsg aSwgcmMpOworCX0KK30KKworLyoKKyAqIHNpdDk1MzF4X2Rldl9wZXJpb2RpY193b3JrIC0gcGVy aW9kaWMgaGFyZHdhcmUgc3RhdGUgcG9sbGluZworICogQHdvcms6CWt0aHJlYWRfd29yayBwb2lu dGVyCisgKgorICogUG9sbHMgaGFyZHdhcmUgc3RhdGUgYXQgU0lUOTUzMVhfU1RBVFVTX1BPTExf TVMgaW50ZXJ2YWxzLgorICogVXBkYXRlcyByZWZlcmVuY2UgYW5kIGNoYW5uZWwgc3RhdGVzLCB0 aGVuIGRlbGVnYXRlcyBjaGFuZ2UKKyAqIGRldGVjdGlvbiB0byBzaXQ5NTMxeF9kcGxsX2NoYW5n ZXNfY2hlY2soKSBmb3IgZWFjaCByZWdpc3RlcmVkIERQTEwuCisgKi8KK3N0YXRpYyB2b2lkIHNp dDk1MzF4X2Rldl9wZXJpb2RpY193b3JrKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCit7CisJ c3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBz aXQ5NTMxeF9kZXYsCisJCQkJCQkgICB3b3JrLndvcmspOworCXN0cnVjdCBzaXQ5NTMxeF9kcGxs ICpzaXRkcGxsOworCWludCByYzsKKworCS8qCisJICogVXBkYXRlIHRoZSBjYWNoZWQgcmVmW10v Y2hhbltdIGFycmF5cyB1bmRlciBtdWx0aW9wX2xvY2sgc28gdGhlCisJICogZmV0Y2hlcyBhcmUg c2VyaWFsaXplZCBhZ2FpbnN0IHRoZSBEUExMIGNhbGxiYWNrcyB0aGF0IHJlYWQKKwkgKiB0aGVz ZSBmaWVsZHMgYW5kIGFnYWluc3QgdGhlIGNoaXAncyBwYWdlIHNlbGVjdG9yLgorCSAqCisJICog VGhlIGxvY2sgaXMgdGhlbiBkcm9wcGVkIGJlZm9yZSBzaXQ5NTMxeF9kcGxsX2NoYW5nZXNfY2hl Y2soKSwKKwkgKiB3aGljaCBjYWxscyBkcGxsX3Bpbl9jaGFuZ2VfbnRmKCkgLyBkcGxsX2Rldmlj ZV9jaGFuZ2VfbnRmKCkuCisJICogVGhvc2Ugbm90aWZpY2F0aW9uIGhlbHBlcnMgdGFrZSBEUExM LXN1YnN5c3RlbSBsb2NrcyB0aGF0IGFyZQorCSAqIGFscmVhZHkgaGVsZCB3aGVuIG91ciBjYWxs YmFja3MgYXJlIGludm9rZWQgZnJvbSBuZXRsaW5rCisJICogY29udGV4dCwgYW5kIG5lc3Rpbmcg bXVsdGlvcF9sb2NrIGFyb3VuZCB0aGVtIHdvdWxkIGludmVydCB0aGUKKwkgKiBsb2NrIG9yZGVy LiAgY2hhbmdlc19jaGVjaygpIHJlYWRzIHRoZSBjYWNoZSBwdWJsaXNoZWQgYWJvdmUsCisJICog d2hpY2ggaXMgYWxyZWFkeSBjb25zaXN0ZW50LgorCSAqLworCW11dGV4X2xvY2soJnNpdGRldi0+ bXVsdGlvcF9sb2NrKTsKKwlzaXQ5NTMxeF9kZXZfcmVmX3N0YXRlc191cGRhdGUoc2l0ZGV2KTsK KwlzaXQ5NTMxeF9kZXZfY2hhbl9zdGF0ZXNfdXBkYXRlKHNpdGRldik7CisJbXV0ZXhfdW5sb2Nr KCZzaXRkZXYtPm11bHRpb3BfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNpdGRwbGws ICZzaXRkZXYtPmRwbGxzLCBsaXN0KQorCQlzaXQ5NTMxeF9kcGxsX2NoYW5nZXNfY2hlY2soc2l0 ZHBsbCk7CisKKwkvKgorCSAqIEFja25vd2xlZGdlIHRoZSBjaGlwJ3Mgbm90aWZpY2F0aW9uIGxh dGNoZXMgYWZ0ZXIgdGhlIHRpY2sgaGFzCisJICogcmVhZCBhbmQgYWN0ZWQgb24gdGhlbS4gIFdp dGhvdXQgdGhpcywgdGhlIFcxQyBiaXRzIHJlbWFpbiBzZXQKKwkgKiBhbmQgLS0gb24gYm9hcmRz IHRoYXQgd2lyZSBJTlRSQiAtLSB0aGUgbGluZSBzdGF5cyBhc3NlcnRlZCwKKwkgKiByZS1maXJp bmcgdGhlIHRocmVhZGVkIGhhbmRsZXIgYmFjayB0byBiYWNrLiAgVGhlIGhlbHBlciB3cml0ZXMK KwkgKiBXMUMgYml0cyBhY3Jvc3MgcGFnZSAwIGFuZCBwYWdlIDYgYW5kIG11c3QgcnVuIHVuZGVy CisJICogbXVsdGlvcF9sb2NrIHRvIHNlcmlhbGl6ZSB0aGUgcGFnZSBzZWxlY3RvciBhZ2FpbnN0 IHVzZXJzcGFjZQorCSAqIGRwbGwgb3BzLiAgRmFpbHVyZSBpcyBub24tZmF0YWw6IHN0YXR1cyB3 YXMgYWxyZWFkeSBjb25zdW1lZAorCSAqIGZvciB0aGlzIHRpY2sgYW5kIHRoZSBuZXh0IHRpY2sg cmUtcHJvY2Vzc2VzIHdoYXRldmVyIHN0YXllZAorCSAqIGxhdGNoZWQuCisJICovCisJbXV0ZXhf bG9jaygmc2l0ZGV2LT5tdWx0aW9wX2xvY2spOworCXJjID0gc2l0OTUzMXhfY2xlYXJfbm90aWZp Y2F0aW9ucyhzaXRkZXYpOworCW11dGV4X3VubG9jaygmc2l0ZGV2LT5tdWx0aW9wX2xvY2spOwor CWlmIChyYykKKwkJZGV2X3dhcm5fcmF0ZWxpbWl0ZWQoc2l0ZGV2LT5kZXYsCisJCQkJICAgICAi RmFpbGVkIHRvIGNsZWFyIG5vdGlmaWNhdGlvbnM6ICVkXG4iLAorCQkJCSAgICAgcmMpOworCisJ LyogUnVuIHR3aWNlIGEgc2Vjb25kICovCisJa3RocmVhZF9xdWV1ZV9kZWxheWVkX3dvcmsoc2l0 ZGV2LT5rd29ya2VyLCAmc2l0ZGV2LT53b3JrLAorCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoU0lU OTUzMVhfU1RBVFVTX1BPTExfTVMpKTsKK30KKworLyoKKyAqIHNpdDk1MzF4X2lycV90aHJlYWRf Zm4gLSB0aHJlYWRlZCBJUlEgaGFuZGxlciBmb3IgdGhlIGNoaXAncyBJTlRSQiBsaW5lCisgKgor ICogVHJpZ2dlcmVkIHdoZW4gdGhlIGNoaXAgYXNzZXJ0cyBJTlRSQiAoYW5kIG9ubHkgd2hlbiBE VCB3aXJlcyB1cCB0aGUKKyAqIGNsaWVudCBpbnRlcnJ1cHQ7IGFic2VudCBwcm9wZXJ0eSA9PSBo YW5kbGVyIG5ldmVyIGluc3RhbGxlZCkuICBUaGUKKyAqIGFjdGlvbiBtaXJyb3JzIGEgcGVyaW9k aWMtd29yayB0aWNrOiBxdWV1ZSBhbiBpbW1lZGlhdGUgcnVuIHNvIHN0YXR1cworICogcmVnaXN0 ZXJzIGFyZSByZWFkIGFuZCBEUExMIGNoYW5nZXNfY2hlY2sgZmlyZXMgd2l0aG91dCB3YWl0aW5n IGZvcgorICogdGhlIG5leHQgcG9sbCBkZWFkbGluZS4gIFBvbGxpbmcgY29udGludWVzIHRvIHJ1 biBhcyBhIGZhbGxiYWNrLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2l0OTUzMXhfaXJxX3Ro cmVhZF9mbihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNp dGRldiA9IGRhdGE7CisJaW50IHJjOworCisJLyoKKwkgKiBBY2tub3dsZWRnZSB0aGUgY2hpcCdz IG5vdGlmaWNhdGlvbiBsYXRjaGVzIGZyb20gdGhlIHRocmVhZGVkCisJICogaGFuZGxlciBpdHNl bGYuICBXaXRoIElSUUZfT05FU0hPVCB0aGUgbGluZSBpcyB1bm1hc2tlZCBvbgorCSAqIHJldHVy biwgc28gZGVmZXJyaW5nIHRoZSBXMUMgY2xlYXIgdG8gdGhlIGFzeW5jIGt3b3JrZXIgd291bGQK KwkgKiBsZXQgYSBzdGlsbC1hc3NlcnRlZCBJTlRSQiByZS1maXJlIGltbWVkaWF0ZWx5IChpbnRl cnJ1cHQgc3Rvcm0pLgorCSAqIENsZWFyIGhlcmUsIHRoZW4ga2ljayB0aGUgcG9sbCB3b3JrZXIg dG8gcmVhZCBzdGF0ZSBhbmQgcnVuCisJICogY2hhbmdlc19jaGVjay4KKwkgKi8KKwltdXRleF9s b2NrKCZzaXRkZXYtPm11bHRpb3BfbG9jayk7CisJcmMgPSBzaXQ5NTMxeF9jbGVhcl9ub3RpZmlj YXRpb25zKHNpdGRldik7CisJbXV0ZXhfdW5sb2NrKCZzaXRkZXYtPm11bHRpb3BfbG9jayk7CisJ aWYgKHJjKQorCQlkZXZfd2Fybl9yYXRlbGltaXRlZChzaXRkZXYtPmRldiwKKwkJCQkgICAgICJJ UlE6IGZhaWxlZCB0byBjbGVhciBub3RpZmljYXRpb25zOiAlZFxuIiwKKwkJCQkgICAgIHJjKTsK KworCWt0aHJlYWRfbW9kX2RlbGF5ZWRfd29yayhzaXRkZXYtPmt3b3JrZXIsICZzaXRkZXYtPndv cmssIDApOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIHNpdDk1MzF4X2Rldl9z dGFydCAtIHN0YXJ0IG5vcm1hbCBvcGVyYXRpb24KKyAqCisgKiBGZXRjaGVzIGluaXRpYWwgaGFy ZHdhcmUgc3RhdGUsIHJlZ2lzdGVycyBhbGwgRFBMTCBkZXZpY2VzIGFuZAorICogdGhlaXIgcGlu cywgYW5kIHN0YXJ0cyB0aGUgcGVyaW9kaWMgbW9uaXRvcmluZyB0aHJlYWQuCisgKi8KK2ludCBz aXQ5NTMxeF9kZXZfc3RhcnQoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2KQoreworCXN0cnVj dCBzaXQ5NTMxeF9kcGxsICpzaXRkcGxsOworCWludCByYzsKKworCS8qIEZldGNoIGRldmljZSBz dGF0ZSAqLworCXJjID0gc2l0OTUzMXhfZGV2X3N0YXRlX2ZldGNoKHNpdGRldik7CisJaWYgKHJj KQorCQlyZXR1cm4gcmM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNpdGRwbGwsICZzaXRkZXYt PmRwbGxzLCBsaXN0KSB7CisJCXJjID0gc2l0OTUzMXhfZHBsbF9yZWdpc3RlcihzaXRkcGxsKTsK KwkJaWYgKHJjKSB7CisJCQlkZXZfZXJyX3Byb2JlKHNpdGRldi0+ZGV2LCByYywKKwkJCQkgICAg ICAiRmFpbGVkIHRvIHJlZ2lzdGVyIERQTEwldVxuIiwKKwkJCQkgICAgICBzaXRkcGxsLT5pZCk7 CisJCQlnb3RvIGVycl91bnJlZ2lzdGVyOworCQl9CisJfQorCisJa3RocmVhZF9xdWV1ZV9kZWxh eWVkX3dvcmsoc2l0ZGV2LT5rd29ya2VyLCAmc2l0ZGV2LT53b3JrLCAwKTsKKworCXJldHVybiAw OworCitlcnJfdW5yZWdpc3RlcjoKKwkvKgorCSAqIFVucmVnaXN0ZXIgd2hhdCBkaWQgcmVnaXN0 ZXIuICBUaGUgY2FsbGVyIGZyZWVzIHRoZSBsaXN0IG9uIHRoaXMKKwkgKiBwYXRoLCBzbyBsZWF2 aW5nIGEgRFBMTCByZWdpc3RlcmVkIHdvdWxkIGhhbmQgdGhlIHN1YnN5c3RlbSBhCisJICogcG9p bnRlciB0byBmcmVlZCBtZW1vcnkuCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51 ZV9yZXZlcnNlKHNpdGRwbGwsICZzaXRkZXYtPmRwbGxzLCBsaXN0KQorCQlzaXQ5NTMxeF9kcGxs X3VucmVnaXN0ZXIoc2l0ZHBsbCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBzaXQ5NTMx eF9kZXZfc3RvcCAtIHN0b3Agbm9ybWFsIG9wZXJhdGlvbgorICoKKyAqIENhbmNlbHMgdGhlIG1v bml0b3JpbmcgdGhyZWFkIGFuZCB1bnJlZ2lzdGVycyBhbGwgRFBMTCBkZXZpY2VzCisgKiBhbmQg dGhlaXIgcGlucy4KKyAqLwordm9pZCBzaXQ5NTMxeF9kZXZfc3RvcChzdHJ1Y3Qgc2l0OTUzMXhf ZGV2ICpzaXRkZXYpCit7CisJc3RydWN0IHNpdDk1MzF4X2RwbGwgKnNpdGRwbGw7CisKKwlrdGhy ZWFkX2NhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmc2l0ZGV2LT53b3JrKTsKKworCWxpc3RfZm9y X2VhY2hfZW50cnkoc2l0ZHBsbCwgJnNpdGRldi0+ZHBsbHMsIGxpc3QpIHsKKwkJaWYgKHNpdGRw bGwtPmRwbGxfZGV2KQorCQkJc2l0OTUzMXhfZHBsbF91bnJlZ2lzdGVyKHNpdGRwbGwpOworCX0K K30KKworc3RhdGljIHN0cnVjdCBzaXQ5NTMxeF9kcGxsX3BpbiAqCitzaXQ5NTMxeF9kcGxsX3Bp bl9hbGxvYyhzdHJ1Y3Qgc2l0OTUzMXhfZHBsbCAqc2l0ZHBsbCwKKwkJCWVudW0gZHBsbF9waW5f ZGlyZWN0aW9uIGRpciwgdTggaWQpCit7CisJc3RydWN0IHNpdDk1MzF4X2RwbGxfcGluICpwaW47 CisKKwlwaW4gPSBremFsbG9jX29iaigqcGluLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBpbikKKwkJ cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlwaW4tPmRwbGwgPSBzaXRkcGxsOworCXBpbi0+ ZGlyID0gZGlyOworCXBpbi0+aWQgPSBpZDsKKworCXJldHVybiBwaW47Cit9CisKKy8qCisgKiBz aXQ5NTMxeF9kcGxsX3Bpbl9yZWdpc3RlciAtIHJlZ2lzdGVyIGEgRFBMTCBwaW4gd2l0aCB0aGUg c3Vic3lzdGVtCisgKiBAaW5kZXg6CWFic29sdXRlIHBpbiBpbmRleCBmb3IgY2xvY2tfaWQgbmFt ZXNwYWNlCisgKgorICogR2V0cyBwaW4gcHJvcGVydGllcyBmcm9tIGZpcm13YXJlLCBjcmVhdGVz IG9yIGdldHMgYSBkcGxsX3BpbiwKKyAqIGFuZCByZWdpc3RlcnMgaXQgd2l0aCB0aGUgcGFyZW50 IERQTEwgZGV2aWNlLgorICovCitzdGF0aWMgaW50IHNpdDk1MzF4X2RwbGxfcGluX3JlZ2lzdGVy KHN0cnVjdCBzaXQ5NTMxeF9kcGxsX3BpbiAqcGluLAorCQkJCSAgICAgIHUzMiBpbmRleCkKK3sK KwlzdHJ1Y3Qgc2l0OTUzMXhfZHBsbCAqc2l0ZHBsbCA9IHBpbi0+ZHBsbDsKKwlzdHJ1Y3Qgc2l0 OTUzMXhfcGluX3Byb3BzICpwcm9wczsKKwljb25zdCBzdHJ1Y3QgZHBsbF9waW5fb3BzICpvcHM7 CisJaW50IHJjOworCisJcHJvcHMgPSBzaXQ5NTMxeF9waW5fcHJvcHNfZ2V0KHNpdGRwbGwtPmRl diwgcGluLT5kaXIsIHBpbi0+aWQpOworCWlmIChJU19FUlIocHJvcHMpKQorCQlyZXR1cm4gUFRS X0VSUihwcm9wcyk7CisKKwlzdHJzY3B5KHBpbi0+bGFiZWwsIHByb3BzLT5wYWNrYWdlX2xhYmVs LCBzaXplb2YocGluLT5sYWJlbCkpOworCXBpbi0+Zndub2RlID0gZndub2RlX2hhbmRsZV9nZXQo cHJvcHMtPmZ3bm9kZSk7CisJcGluLT5lc3luY19jb250cm9sID0gcHJvcHMtPmVzeW5jX2NvbnRy b2w7CisKKwlwaW4tPmRwbGxfcGluID0gZHBsbF9waW5fZ2V0KHNpdGRwbGwtPmRldi0+Y2xvY2tf aWQsIGluZGV4LAorCQkJCSAgICAgVEhJU19NT0RVTEUsICZwcm9wcy0+ZHBsbF9wcm9wcywKKwkJ CQkgICAgICZwaW4tPnRyYWNrZXIpOworCWlmIChJU19FUlIocGluLT5kcGxsX3BpbikpIHsKKwkJ cmMgPSBQVFJfRVJSKHBpbi0+ZHBsbF9waW4pOworCQlnb3RvIGVycl9waW5fZ2V0OworCX0KKwlk cGxsX3Bpbl9md25vZGVfc2V0KHBpbi0+ZHBsbF9waW4sIHByb3BzLT5md25vZGUpOworCisJb3Bz ID0gc2l0OTUzMXhfZHBsbF9waW5fb3BzX2dldChwaW4pOworCisJcmMgPSBkcGxsX3Bpbl9yZWdp c3RlcihzaXRkcGxsLT5kcGxsX2RldiwgcGluLT5kcGxsX3Bpbiwgb3BzLCBwaW4pOworCWlmIChy YykKKwkJZ290byBlcnJfcmVnaXN0ZXI7CisKKwlzaXQ5NTMxeF9waW5fcHJvcHNfcHV0KHByb3Bz KTsKKworCXJldHVybiAwOworCitlcnJfcmVnaXN0ZXI6CisJZHBsbF9waW5fcHV0KHBpbi0+ZHBs bF9waW4sICZwaW4tPnRyYWNrZXIpOworZXJyX3Bpbl9nZXQ6CisJLyogZHBsbF9waW5fZ2V0KCkg bGVmdCBhbiBFUlJfUFRSIGhlcmUuICovCisJcGluLT5kcGxsX3BpbiA9IE5VTEw7CisJZndub2Rl X2hhbmRsZV9wdXQocGluLT5md25vZGUpOworCXBpbi0+Zndub2RlID0gTlVMTDsKKwlzaXQ5NTMx eF9waW5fcHJvcHNfcHV0KHByb3BzKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQg c2l0OTUzMXhfZHBsbF9waW5fdW5yZWdpc3RlcihzdHJ1Y3Qgc2l0OTUzMXhfZHBsbF9waW4gKnBp bikKK3sKKwlzdHJ1Y3Qgc2l0OTUzMXhfZHBsbCAqc2l0ZHBsbCA9IHBpbi0+ZHBsbDsKKwljb25z dCBzdHJ1Y3QgZHBsbF9waW5fb3BzICpvcHM7CisKKwlvcHMgPSBzaXQ5NTMxeF9kcGxsX3Bpbl9v cHNfZ2V0KHBpbik7CisKKwlkcGxsX3Bpbl91bnJlZ2lzdGVyKHNpdGRwbGwtPmRwbGxfZGV2LCBw aW4tPmRwbGxfcGluLCBvcHMsIHBpbik7CisJZHBsbF9waW5fcHV0KHBpbi0+ZHBsbF9waW4sICZw aW4tPnRyYWNrZXIpOworCXBpbi0+ZHBsbF9waW4gPSBOVUxMOworCisJZndub2RlX2hhbmRsZV9w dXQocGluLT5md25vZGUpOworCXBpbi0+Zndub2RlID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQg c2l0OTUzMXhfZHBsbF9waW5zX3VucmVnaXN0ZXIoc3RydWN0IHNpdDk1MzF4X2RwbGwgKnNpdGRw bGwpCit7CisJc3RydWN0IHNpdDk1MzF4X2RwbGxfcGluICpwaW4sICpuZXh0OworCisJbGlzdF9m b3JfZWFjaF9lbnRyeV9zYWZlKHBpbiwgbmV4dCwgJnNpdGRwbGwtPnBpbnMsIGxpc3QpIHsKKwkJ c2l0OTUzMXhfZHBsbF9waW5fdW5yZWdpc3RlcihwaW4pOworCQlsaXN0X2RlbCgmcGluLT5saXN0 KTsKKwkJa2ZyZWUocGluKTsKKwl9Cit9CisKKy8qCisgKiBzaXQ5NTMxeF9pbnB1dF9waW5faXNf cmVnaXN0cmFibGUgLSBjaGVjayBpZiBhbiBpbnB1dCBwaW4gaXMgcmVnaXN0cmFibGUKKyAqCisg KiBTcGxpdCBvdXQgc28gaW5wdXQtbW9kZWwgY2hhbmdlcyBzdGF5IGxvY2FsIHRvIHRoaXMgaGVs cGVyLgorICoKKyAqIFJldHVybjogdHJ1ZSBpZiB0aGUgaW5wdXQgcGluIHNob3VsZCBiZSByZWdp c3RlcmVkLCBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGJvb2wgc2l0OTUzMXhfaW5wdXRf cGluX2lzX3JlZ2lzdHJhYmxlKHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwKKwkJCQkJICAg ICAgdTggaW5kZXgpCit7CisJaWYgKGluZGV4ID49IHNpdGRldi0+aW5mby0+bnVtX2lucHV0cykK KwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBUaGUgTiBsYW5lIG9mIGEgZGlmZmVyZW50aWFs bHktY29uZmlndXJlZCBwYWlyIGlzIG5vdCBhCisJICogc3RhbmRhbG9uZSBpbnB1dCBhbmQgaXMg c2tpcHBlZCAoemwzMDczeCBtb2RlbCkuCisJICovCisJaWYgKHNpdDk1MzF4X2lucHV0X2lzX24o aW5kZXgpICYmCisJICAgIHNpdGRldi0+cmVmW2luZGV4XS5zaWdfbW9kZSA9PSBTSVQ5NTMxWF9N T0RFX0RFKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIHNp dDk1MzF4X2RwbGxfcGluX2lzX3JlZ2lzdHJhYmxlIC0gY2hlY2sgaWYgYSBwaW4gc2hvdWxkIGJl IHJlZ2lzdGVyZWQKKyAqIEBkaXI6CXBpbiBkaXJlY3Rpb24KKyAqIEBpbmRleDoJcGluIGhhcmR3 YXJlIGluZGV4CisgKgorICogRm9yIGlucHV0IHBpbnM6IGRlbGVnYXRlIHRvIHNpdDk1MzF4X2lu cHV0X3Bpbl9pc19yZWdpc3RyYWJsZSgpLgorICogRm9yIG91dHB1dCBwaW5zOiB0aGUgcGluIGlz IHJlZ2lzdHJhYmxlIGlmIHRoaXMgRFBMTCBpcyByb3V0ZWQgdG8gaXQsCisgKiB3aGV0aGVyIG9y IG5vdCBpdCBpcyBjdXJyZW50bHkgZHJpdmluZy4KKyAqCisgKiBSZXR1cm46IHRydWUgaWYgcGlu IHNob3VsZCBiZSByZWdpc3RlcmVkLCBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGJvb2wg c2l0OTUzMXhfZHBsbF9waW5faXNfcmVnaXN0cmFibGUoc3RydWN0IHNpdDk1MzF4X2RwbGwgKnNp dGRwbGwsCisJCQkJCSAgICAgZW51bSBkcGxsX3Bpbl9kaXJlY3Rpb24gZGlyLAorCQkJCQkgICAg IHU4IGluZGV4KQoreworCXN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiA9IHNpdGRwbGwtPmRl djsKKworCWlmIChkaXIgPT0gRFBMTF9QSU5fRElSRUNUSU9OX0lOUFVUKSB7CisJCS8qIFRoZSBp bnRlcm5hbCBJTlRTWU5DIGFuZCBYTyBwaW5zIGFyZSBhbHdheXMgcmVnaXN0cmFibGUgKi8KKwkJ aWYgKGluZGV4ID09IFNJVDk1MzFYX0lOVFNZTkNfUElOX0lEIHx8CisJCSAgICBpbmRleCA9PSBT SVQ5NTMxWF9NQVhfSU5QVVRTKQorCQkJcmV0dXJuIHRydWU7CisKKwkJcmV0dXJuIHNpdDk1MzF4 X2lucHV0X3Bpbl9pc19yZWdpc3RyYWJsZShzaXRkZXYsIGluZGV4KTsKKwl9CisKKwkvKiBUaGUg aW50ZXJuYWwgSU5UU1lOQyBzb3VyY2UgcGluIGlzIGFsd2F5cyByZWdpc3RyYWJsZSAqLworCWlm IChpbmRleCA9PSBTSVQ5NTMxWF9JTlRTWU5DX09VVF9QSU5fSUQpCisJCXJldHVybiB0cnVlOwor CisJLyogT3V0cHV0IC0tIGNoZWNrIGlmIGRyaXZlbiBieSB0aGlzIERQTEwgKi8KKwlpZiAoaW5k ZXggPj0gc2l0ZGV2LT5pbmZvLT5udW1fb3V0cHV0cykKKwkJcmV0dXJuIGZhbHNlOworCisJLyoK KwkgKiBSb3V0aW5nLCBub3QgdGhlIGN1cnJlbnQgZHJpdmUgc3RhdGU6IGFuIG91dHB1dCB0aGUg aW5pdGlhbAorCSAqIGNvbmZpZ3VyYXRpb24gbXV0ZWQgc3RpbGwgZ2V0cyBhIHBpbiwgc28gdXNl cnNwYWNlIGNhbiBzZWUgaXQgYW5kCisJICogdW4tbXV0ZSBpdC4gIE9ubHkgb3V0cHV0cyBubyBQ TEwgZHJpdmVzIGFyZSBsZWZ0IHVucmVnaXN0ZXJlZC4KKwkgKi8KKwlyZXR1cm4gc2l0ZGV2LT5v dXRbaW5kZXhdLnBsbF9pZHggPT0gc2l0ZHBsbC0+aWQgJiYKKwkgICAgICAgc2l0ZGV2LT5vdXRb aW5kZXhdLnJvdXRlZDsKK30KKworLyoKKyAqIHNpdDk1MzF4X2RwbGxfcGluc19yZWdpc3RlciAt IHJlZ2lzdGVyIGFsbCByZWdpc3RyYWJsZSBwaW5zCisgKgorICogRW51bWVyYXRlcyBhbGwgcG9z c2libGUgaW5wdXQgYW5kIG91dHB1dCBwaW5zLCBjaGVja3MgcmVnaXN0cmFiaWxpdHksCisgKiBh bmQgcmVnaXN0ZXJzIGVhY2ggb25lLiAgSW5wdXQgcGlucyBjb21lIGZpcnN0LCB0aGVuIG91dHB1 dCBwaW5zLAorICogd2l0aCBpbnB1dCBwaW5zIGZpcnN0LCB0aGVuIG91dHB1dCBwaW5zLgorICov CitzdGF0aWMgaW50IHNpdDk1MzF4X2RwbGxfcGluc19yZWdpc3RlcihzdHJ1Y3Qgc2l0OTUzMXhf ZHBsbCAqc2l0ZHBsbCkKK3sKKwlzdHJ1Y3Qgc2l0OTUzMXhfZHBsbF9waW4gKnBpbjsKKwllbnVt IGRwbGxfcGluX2RpcmVjdGlvbiBkaXI7CisJdTggaWQsIGluZGV4OworCWludCByYzsKKworCWZv ciAoaW5kZXggPSAwOyBpbmRleCA8IFNJVDk1MzFYX05VTV9QSU5TX1RPVEFMOyBpbmRleCsrKSB7 CisJCWlmIChpbmRleCA8IFNJVDk1MzFYX05VTV9JTlBVVF9QSU5TKSB7CisJCQlpZCA9IGluZGV4 OworCQkJZGlyID0gRFBMTF9QSU5fRElSRUNUSU9OX0lOUFVUOworCQl9IGVsc2UgeworCQkJaWQg PSBpbmRleCAtIFNJVDk1MzFYX05VTV9JTlBVVF9QSU5TOworCQkJZGlyID0gRFBMTF9QSU5fRElS RUNUSU9OX09VVFBVVDsKKwkJfQorCisJCWlmICghc2l0OTUzMXhfZHBsbF9waW5faXNfcmVnaXN0 cmFibGUoc2l0ZHBsbCwgZGlyLCBpZCkpCisJCQljb250aW51ZTsKKworCQlwaW4gPSBzaXQ5NTMx eF9kcGxsX3Bpbl9hbGxvYyhzaXRkcGxsLCBkaXIsIGlkKTsKKwkJaWYgKElTX0VSUihwaW4pKSB7 CisJCQlyYyA9IFBUUl9FUlIocGluKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlyYyA9IHNp dDk1MzF4X2RwbGxfcGluX3JlZ2lzdGVyKHBpbiwgaW5kZXgpOworCQlpZiAocmMpIHsKKwkJCWtm cmVlKHBpbik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJbGlzdF9hZGQoJnBpbi0+bGlzdCwg JnNpdGRwbGwtPnBpbnMpOworCX0KKworCXJldHVybiAwOworCitlcnJvcjoKKwlzaXQ5NTMxeF9k cGxsX3BpbnNfdW5yZWdpc3RlcihzaXRkcGxsKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBp bnQgc2l0OTUzMXhfZHBsbF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHNpdDk1MzF4X2RwbGwgKnNp dGRwbGwpCit7CisJc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2ID0gc2l0ZHBsbC0+ZGV2Owor CWludCByYzsKKworCXNpdGRwbGwtPm9wcyA9IHNpdDk1MzF4X2RwbGxfZGV2aWNlX29wczsKKwor CXNpdGRwbGwtPmRwbGxfZGV2ID0gZHBsbF9kZXZpY2VfZ2V0KHNpdGRldi0+Y2xvY2tfaWQsIHNp dGRwbGwtPmlkLAorCQkJCQkgICAgVEhJU19NT0RVTEUsICZzaXRkcGxsLT50cmFja2VyKTsKKwlp ZiAoSVNfRVJSKHNpdGRwbGwtPmRwbGxfZGV2KSkgeworCQlyYyA9IFBUUl9FUlIoc2l0ZHBsbC0+ ZHBsbF9kZXYpOworCQlzaXRkcGxsLT5kcGxsX2RldiA9IE5VTEw7CisJCXJldHVybiByYzsKKwl9 CisKKwlyYyA9IGRwbGxfZGV2aWNlX3JlZ2lzdGVyKHNpdGRwbGwtPmRwbGxfZGV2LAorCQkJCSAg c2l0OTUzMXhfcHJvcF9kcGxsX3R5cGVfZ2V0KHNpdGRldiwKKwkJCQkJCQkgICAgICBzaXRkcGxs LT5pZCksCisJCQkJICAmc2l0ZHBsbC0+b3BzLCBzaXRkcGxsKTsKKwlpZiAocmMpIHsKKwkJZHBs bF9kZXZpY2VfcHV0KHNpdGRwbGwtPmRwbGxfZGV2LCAmc2l0ZHBsbC0+dHJhY2tlcik7CisJCXNp dGRwbGwtPmRwbGxfZGV2ID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2 b2lkIHNpdDk1MzF4X2RwbGxfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IHNpdDk1MzF4X2RwbGwg KnNpdGRwbGwpCit7CisJZHBsbF9kZXZpY2VfdW5yZWdpc3RlcihzaXRkcGxsLT5kcGxsX2Rldiwg JnNpdGRwbGwtPm9wcywgc2l0ZHBsbCk7CisJZHBsbF9kZXZpY2VfcHV0KHNpdGRwbGwtPmRwbGxf ZGV2LCAmc2l0ZHBsbC0+dHJhY2tlcik7CisJc2l0ZHBsbC0+ZHBsbF9kZXYgPSBOVUxMOworfQor CisvKgorICogc2l0OTUzMXhfZHBsbF9hbGxvYyAtIGFsbG9jYXRlIGEgRFBMTCBkZXZpY2Ugc3Ry dWN0dXJlCisgKiBAc2l0ZGV2OglwYXJlbnQgZGV2aWNlCisgKiBAY2g6CQlQTEwgY2hhbm5lbCBu dW1iZXIgKDAtMykKKyAqCisgKiBSZXR1cm46IHBvaW50ZXIgdG8gYWxsb2NhdGVkIERQTEwgb24g c3VjY2VzcywgZXJyb3IgcG9pbnRlciBvbiBlcnJvcgorICovCitzdHJ1Y3Qgc2l0OTUzMXhfZHBs bCAqc2l0OTUzMXhfZHBsbF9hbGxvYyhzdHJ1Y3Qgc2l0OTUzMXhfZGV2ICpzaXRkZXYsIHU4IGNo KQoreworCXN0cnVjdCBzaXQ5NTMxeF9kcGxsICpzaXRkcGxsOworCisJc2l0ZHBsbCA9IGt6YWxs b2Nfb2JqKCpzaXRkcGxsLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNpdGRwbGwpCisJCXJldHVybiBF UlJfUFRSKC1FTk9NRU0pOworCisJc2l0ZHBsbC0+ZGV2ID0gc2l0ZGV2OworCXNpdGRwbGwtPmlk ID0gY2g7CisJc2l0ZHBsbC0+bG9ja19zdGF0dXMgPSBEUExMX0xPQ0tfU1RBVFVTX1VOTE9DS0VE OworCUlOSVRfTElTVF9IRUFEKCZzaXRkcGxsLT5waW5zKTsKKworCXJldHVybiBzaXRkcGxsOwor fQorCisvKgorICogc2l0OTUzMXhfZHBsbF9mcmVlIC0gZGVhbGxvY2F0ZSBhIERQTEwgZGV2aWNl IHN0cnVjdHVyZQorICogQHNpdGRwbGw6CURQTEwgdG8gZnJlZQorICovCit2b2lkIHNpdDk1MzF4 X2RwbGxfZnJlZShzdHJ1Y3Qgc2l0OTUzMXhfZHBsbCAqc2l0ZHBsbCkKK3sKKwlrZnJlZShzaXRk cGxsKTsKK30KKworLyoKKyAqIHNpdDk1MzF4X2RwbGxfcmVnaXN0ZXIgLSByZWdpc3RlciBEUExM IGRldmljZSBhbmQgYWxsIGl0cyBwaW5zCisgKgorICogUmVnaXN0ZXJzIHRoZSBEUExMIGRldmlj ZSB3aXRoIHRoZSBzdWJzeXN0ZW0gYW5kIHRoZW4gcmVnaXN0ZXJzCisgKiBhbGwgaW5wdXQgYW5k IG91dHB1dCBwaW5zIHRoYXQgYXJlIGNvbm5lY3RlZCB0byB0aGlzIFBMTC4KKyAqLworaW50IHNp dDk1MzF4X2RwbGxfcmVnaXN0ZXIoc3RydWN0IHNpdDk1MzF4X2RwbGwgKnNpdGRwbGwpCit7CisJ aW50IHJjOworCisJcmMgPSBzaXQ5NTMxeF9kcGxsX2RldmljZV9yZWdpc3RlcihzaXRkcGxsKTsK KwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gc2l0OTUzMXhfZHBsbF9waW5zX3JlZ2lz dGVyKHNpdGRwbGwpOworCWlmIChyYykgeworCQlzaXQ5NTMxeF9kcGxsX2RldmljZV91bnJlZ2lz dGVyKHNpdGRwbGwpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHNp dDk1MzF4X2RwbGxfdW5yZWdpc3RlciAtIHVucmVnaXN0ZXIgRFBMTCBkZXZpY2UgYW5kIGl0cyBw aW5zICovCit2b2lkIHNpdDk1MzF4X2RwbGxfdW5yZWdpc3RlcihzdHJ1Y3Qgc2l0OTUzMXhfZHBs bCAqc2l0ZHBsbCkKK3sKKwlzaXQ5NTMxeF9kcGxsX3BpbnNfdW5yZWdpc3RlcihzaXRkcGxsKTsK KwlzaXQ5NTMxeF9kcGxsX2RldmljZV91bnJlZ2lzdGVyKHNpdGRwbGwpOworfQorCitzdGF0aWMg dm9pZCBzaXQ5NTMxeF9kcGxsX2xpc3RfZnJlZShzdHJ1Y3Qgc2l0OTUzMXhfZGV2ICpzaXRkZXYp Cit7CisJc3RydWN0IHNpdDk1MzF4X2RwbGwgKnNpdGRwbGwsICpuZXh0OworCisJbGlzdF9mb3Jf ZWFjaF9lbnRyeV9zYWZlKHNpdGRwbGwsIG5leHQsICZzaXRkZXYtPmRwbGxzLCBsaXN0KSB7CisJ CWxpc3RfZGVsKCZzaXRkcGxsLT5saXN0KTsKKwkJc2l0OTUzMXhfZHBsbF9mcmVlKHNpdGRwbGwp OworCX0KK30KKworLyogUnVucyBvbmx5IG9uY2UgdGhlIGRldmljZSBpcyBmdWxseSBzdGFydGVk LCBzZWUgdGhlIGNhbGxlci4gKi8KK3N0YXRpYyB2b2lkIHNpdDk1MzF4X2Rldl9kcGxsX2Zpbmko dm9pZCAqcHRyKQoreworCXN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiA9IHB0cjsKKworCXNp dDk1MzF4X2Rldl9zdG9wKHNpdGRldik7CisJa3RocmVhZF9kZXN0cm95X3dvcmtlcihzaXRkZXYt Pmt3b3JrZXIpOworCXNpdDk1MzF4X2RwbGxfbGlzdF9mcmVlKHNpdGRldik7Cit9CisKK3N0YXRp YyBpbnQgc2l0OTUzMXhfZGV2bV9kcGxsX2luaXQoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2 KQoreworCXN0cnVjdCBrdGhyZWFkX3dvcmtlciAqa3dvcmtlcjsKKwlzdHJ1Y3Qgc2l0OTUzMXhf ZHBsbCAqc2l0ZHBsbDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmM7CisKKwlJTklUX0xJU1Rf SEVBRCgmc2l0ZGV2LT5kcGxscyk7CisJa3RocmVhZF9pbml0X2RlbGF5ZWRfd29yaygmc2l0ZGV2 LT53b3JrLCBzaXQ5NTMxeF9kZXZfcGVyaW9kaWNfd29yayk7CisKKwlmb3IgKGkgPSAwOyBpIDwg U0lUOTUzMVhfTlVNX1BMTFM7IGkrKykgeworCQlzaXRkcGxsID0gc2l0OTUzMXhfZHBsbF9hbGxv YyhzaXRkZXYsIGkpOworCQlpZiAoSVNfRVJSKHNpdGRwbGwpKSB7CisJCQlyYyA9IGRldl9lcnJf cHJvYmUoc2l0ZGV2LT5kZXYsIFBUUl9FUlIoc2l0ZHBsbCksCisJCQkJCSAgICJGYWlsZWQgdG8g YWxsb2MgRFBMTCV1XG4iLCBpKTsKKwkJCWdvdG8gZXJyX2ZyZWVfZHBsbHM7CisJCX0KKworCQls aXN0X2FkZF90YWlsKCZzaXRkcGxsLT5saXN0LCAmc2l0ZGV2LT5kcGxscyk7CisJfQorCisJa3dv cmtlciA9IGt0aHJlYWRfcnVuX3dvcmtlcigwLCAic2l0OTUzMXgtJXMiLCBkZXZfbmFtZShzaXRk ZXYtPmRldikpOworCWlmIChJU19FUlIoa3dvcmtlcikpIHsKKwkJcmMgPSBQVFJfRVJSKGt3b3Jr ZXIpOworCQlnb3RvIGVycl9mcmVlX2RwbGxzOworCX0KKwlzaXRkZXYtPmt3b3JrZXIgPSBrd29y a2VyOworCisJcmMgPSBzaXQ5NTMxeF9kZXZfc3RhcnQoc2l0ZGV2KTsKKwlpZiAocmMpIHsKKwkJ cmMgPSBkZXZfZXJyX3Byb2JlKHNpdGRldi0+ZGV2LCByYywgIkZhaWxlZCB0byBzdGFydCBkZXZp Y2VcbiIpOworCQlnb3RvIGVycl9kZXN0cm95X3dvcmtlcjsKKwl9CisKKwkvKgorCSAqIE9ubHkg bm93IGlzIGV2ZXJ5IGZpZWxkIHRoZSBjbGVhbnVwIHRvdWNoZXMgdmFsaWQsIHNvIHRoaXMgaXMg dGhlCisJICogZmlyc3QgcG9pbnQgYXQgd2hpY2ggdGhlIGFjdGlvbiBtYXkgYmUgcmVnaXN0ZXJl ZC4gIE9uIGZhaWx1cmUgaXQKKwkgKiBydW5zIHRoZSBhY3Rpb24gaXRzZWxmLCB3aGljaCBpcyBj b3JyZWN0IGhlcmUgYW5kIG9ubHkgaGVyZS4KKwkgKi8KKwlyZXR1cm4gZGV2bV9hZGRfYWN0aW9u X29yX3Jlc2V0KHNpdGRldi0+ZGV2LCBzaXQ5NTMxeF9kZXZfZHBsbF9maW5pLAorCQkJCQlzaXRk ZXYpOworCitlcnJfZGVzdHJveV93b3JrZXI6CisJa3RocmVhZF9kZXN0cm95X3dvcmtlcihzaXRk ZXYtPmt3b3JrZXIpOworZXJyX2ZyZWVfZHBsbHM6CisJc2l0OTUzMXhfZHBsbF9saXN0X2ZyZWUo c2l0ZGV2KTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIHNpdDk1MzF4X3JlYWRfdmFyaWFu dF9pZCAtIHJlYWQgY2hpcCB2YXJpYW50IElEIGJ5dGUgZnJvbSBoYXJkd2FyZQorICogQGlkOgkJ b3V0cHV0IHZhcmlhbnQgSUQgYnl0ZQorICoKKyAqIFJlYWRzIHRoZSBzaW5nbGUtYnl0ZSB2YXJp YW50IGlkZW50aWZpY2F0aW9uIHJlZ2lzdGVyIGZyb20gUGFnZSAwCisgKiByZWcgMHgwMiAoOTUz MTcgPSAweDE3LCA5NTMxNiA9IDB4MzEpLiAgUmVnIDB4MDMgaG9sZHMgYSBzZXBhcmF0ZQorICog cmV2aXNpb24gYnl0ZSBhbmQgaXMgaW50ZW50aW9uYWxseSBub3QgY29uc3VtZWQgaGVyZS4KKyAq Lworc3RhdGljIGludCBzaXQ5NTMxeF9yZWFkX3ZhcmlhbnRfaWQoc3RydWN0IHNpdDk1MzF4X2Rl diAqc2l0ZGV2LCB1OCAqaWQpCit7CisJcmV0dXJuIHNpdDk1MzF4X3JlYWRfdTgoc2l0ZGV2LCBT SVQ5NTMxWF9SRUdfVkFSSUFOVF9JRCwgaWQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNp dDk1MzF4X2NoaXBfaW5mbyAqc2l0OTUzMXhfbWF0Y2hfdmFyaWFudCh1OCBpZCkKK3sKKwl1bnNp Z25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNpdDk1MzF4X2NoaXBf aWRzKTsgaSsrKSB7CisJCWlmIChzaXQ5NTMxeF9jaGlwX2lkc1tpXS5pZCA9PSBpZCkKKwkJCXJl dHVybiAmc2l0OTUzMXhfY2hpcF9pZHNbaV07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8q CisgKiBzaXQ5NTMxeF9kZXJpdmVfY2xvY2tfaWQgLSBidWlsZCBFVUktNjQgY2xvY2sgaWRlbnRp ZmllcgorICoKKyAqIEdlbmVyYXRlcyBhIGRldGVybWluaXN0aWMgNjQtYml0IGlkZW50aWZpZXIg ZnJvbSB0aGUgU2lUaW1lIE9VSSwKKyAqIHRoZSBjaGlwIElELCBhbmQgdGhlIEkyQyBhZGRyZXNz LiAgVGhpcyBwcm92aWRlcyBhIHN0YWJsZSBjbG9ja19pZAorICogYWNyb3NzIHJlYm9vdHMuCisg KgorICogUmV0dXJuOiA2NC1iaXQgY2xvY2sgaWRlbnRpZmllcgorICovCitzdGF0aWMgdTY0IHNp dDk1MzF4X2Rlcml2ZV9jbG9ja19pZChzdHJ1Y3Qgc2l0OTUzMXhfZGV2ICpzaXRkZXYpCit7CisJ dTY0IGNsa2lkOworCisJY2xraWQgID0gU0lUOTUzMVhfT1VJIDw8IDI0OworCWNsa2lkIHw9ICh1 NjQpc2l0ZGV2LT5pbmZvLT5pZCA8PCA4OworCWNsa2lkIHw9ICh1NjQpc2l0ZGV2LT5jbGllbnQt PmFkZHI7CisKKwlyZXR1cm4gY2xraWQ7Cit9CisKKy8qCisgKiBCb2FyZC1jb25maWcgb3ZlcnJp ZGVzIGZvciBmaXhlZCBlZnVzZS9ibG9iIHJvdXRpbmcgdGhlIGNoaXAgcmVnaXN0ZXJzIGRvCisg KiBub3QgZGVzY3JpYmUgdW5hbWJpZ3VvdXNseS4gIEFic2VudCBwcm9wZXJ0aWVzIGxlYXZlIHBs bF9mdmNvW10gemVyb2VkCisgKiAoZGVyaXZlIGZyb20gRElWTikgYW5kIG91dF9wbGxfbWFwX3Zh bGlkIGZhbHNlICh1c2UgdGhlIE9VVF9NQVAgcmVnaXN0ZXJzKS4KKyAqLworc3RhdGljIHZvaWQg c2l0OTUzMXhfcGFyc2VfYm9hcmRfY29uZmlnKHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldikK K3sKKwl1MzIgbWFwW1NJVDk1MzFYX01BWF9PVVRQVVRTXTsKKwlpbnQgbiwgaTsKKworCWRldmlj ZV9wcm9wZXJ0eV9yZWFkX3U2NF9hcnJheShzaXRkZXYtPmRldiwgInNpdGltZSxwbGwtZnZjbyIs CisJCQkJICAgICAgIHNpdGRldi0+cGxsX2Z2Y28sIFNJVDk1MzFYX05VTV9QTExTKTsKKworCWlm ICghZGV2aWNlX3Byb3BlcnR5X3ByZXNlbnQoc2l0ZGV2LT5kZXYsICJzaXRpbWUsb3V0cHV0LXBs bC1tYXAiKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBBbnkgMS4uTUFYX09VVFBVVFMgbGVuZ3Ro IGlzIGFjY2VwdGVkIHNvIHRoZSA4LW91dHB1dCBTaVQ5NTMxNyBuZWVkCisJICogbm90IHBhZCB0 byAxMjsgdmFyaWFudCBkZXRlY3Rpb24gaGFzIG5vdCBydW4geWV0IGFuZCBlbnRyaWVzIHBhc3QK KwkgKiB0aGUgZGV0ZWN0ZWQgbnVtX291dHB1dHMgYXJlIG5ldmVyIGluZGV4ZWQuICBUcmFpbGlu ZyBlbnRyaWVzIG9mIGEKKwkgKiBzaG9ydCBtYXAgbXVzdCByZWFkIGFzIHVubWFwcGVkIHJhdGhl ciB0aGFuIDAgKD09IFBMTEEpLCB3aGljaAorCSAqIHdvdWxkIG1hcmsgdW5yb3V0ZWQgb3V0cHV0 cyBhY3RpdmUgaW4gc2l0OTUzMXhfb3V0X3N0YXRlX2ZldGNoKCkuCisJICovCisJbWVtc2V0KHNp dGRldi0+b3V0X3BsbF9tYXAsIFNJVDk1MzFYX09VVF9QTExfVU5NQVBQRUQsCisJICAgICAgIHNp emVvZihzaXRkZXYtPm91dF9wbGxfbWFwKSk7CisKKwluID0gZGV2aWNlX3Byb3BlcnR5X2NvdW50 X3UzMihzaXRkZXYtPmRldiwgInNpdGltZSxvdXRwdXQtcGxsLW1hcCIpOworCWlmIChuIDw9IDAg fHwgbiA+IFNJVDk1MzFYX01BWF9PVVRQVVRTIHx8CisJICAgIGRldmljZV9wcm9wZXJ0eV9yZWFk X3UzMl9hcnJheShzaXRkZXYtPmRldiwgInNpdGltZSxvdXRwdXQtcGxsLW1hcCIsCisJCQkJCSAg IG1hcCwgbikpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCXNpdGRl di0+b3V0X3BsbF9tYXBbaV0gPSBtYXBbaV07CisJc2l0ZGV2LT5vdXRfcGxsX21hcF92YWxpZCA9 IHRydWU7Cit9CisKK2ludCBzaXQ5NTMxeF9kZXZfcHJvYmUoc3RydWN0IHNpdDk1MzF4X2RldiAq c2l0ZGV2KQoreworCXN0cnVjdCBjbGsgKnh0YWxfY2xrOworCXU4IHZhcmlhbnRfaWQ7CisJaW50 IHJjOworCisJLyoKKwkgKiBGdmNvID0gRnJlZiAqIChESVZOICsgZnJhYy8yXjMyKSB3aXRoIEZy ZWYgPSB4dGFsX2ZyZXEgPDwgZG91YmxlciwKKwkgKiBzbyBldmVyeSBmcmVxX3NldCBhbmQgcGhh c2VfYWRqdXN0IHBhdGggZGl2aWRlcyBieSBhIHJhdGUgZGVyaXZlZAorCSAqIGZyb20gdGhlIFhP IGZlZWRpbmcgWElOL1hPX0NMSy4KKwkgKi8KKwl4dGFsX2NsayA9IGRldm1fY2xrX2dldF9lbmFi bGVkKHNpdGRldi0+ZGV2LCAieHRhbCIpOworCWlmIChJU19FUlIoeHRhbF9jbGspKQorCQlyZXR1 cm4gZGV2X2Vycl9wcm9iZShzaXRkZXYtPmRldiwgUFRSX0VSUih4dGFsX2NsayksCisJCQkJICAg ICAiRmFpbGVkIHRvIGdldCB4dGFsIGNsb2NrXG4iKTsKKwlzaXRkZXYtPnh0YWxfZnJlcSA9IGNs a19nZXRfcmF0ZSh4dGFsX2Nsayk7CisJaWYgKCFzaXRkZXYtPnh0YWxfZnJlcSkKKwkJcmV0dXJu IGRldl9lcnJfcHJvYmUoc2l0ZGV2LT5kZXYsIC1FSU5WQUwsCisJCQkJICAgICAieHRhbCBjbG9j ayBoYXMgbm8gcmF0ZVxuIik7CisKKwkvKgorCSAqIEhlbGQgZGVhc3NlcnRlZCwgbmV2ZXIgcHVs c2VkOiB0aGUgY2hpcCBjb25maWd1cmF0aW9uIGNvbWVzIGZyb20KKwkgKiBlZnVzZSBvciBhbiBO Vk0gYmxvYiBhcHBsaWVkIGJlZm9yZSBwcm9iZSwgYW5kIGEgcmVzZXQgd291bGQKKwkgKiBkaXNj YXJkIGl0LiAgTXVzdCBwcmVjZWRlIHRoZSBmaXJzdCBJMkMgYWNjZXNzLCBhcyBhIGJvYXJkIHRo YXQKKwkgKiBwb3dlcnMgdXAgYXNzZXJ0ZWQga2VlcHMgdGhlIGNoaXAgdW5yZWFjaGFibGUgdW50 aWwgcmVsZWFzZWQuCisJICovCisJc2l0ZGV2LT5yZXNldF9ncGlvID0gZGV2bV9ncGlvZF9nZXRf b3B0aW9uYWwoc2l0ZGV2LT5kZXYsICJyZXNldCIsCisJCQkJCQkgICAgIEdQSU9EX09VVF9MT1cp OworCWlmIChJU19FUlIoc2l0ZGV2LT5yZXNldF9ncGlvKSkKKwkJcmV0dXJuIGRldl9lcnJfcHJv YmUoc2l0ZGV2LT5kZXYsIFBUUl9FUlIoc2l0ZGV2LT5yZXNldF9ncGlvKSwKKwkJCQkgICAgICJG YWlsZWQgdG8gcmVxdWVzdCByZXNldCBncGlvXG4iKTsKKwlpZiAoc2l0ZGV2LT5yZXNldF9ncGlv KQorCQlmc2xlZXAoMTAwMDApOwkvKiBpbnRlcm5hbCBib290IGFmdGVyIHJlbGVhc2UgKi8KKwor CXNpdDk1MzF4X3BhcnNlX2JvYXJkX2NvbmZpZyhzaXRkZXYpOworCisJcmMgPSBzaXQ5NTMxeF9y ZWFkX3ZhcmlhbnRfaWQoc2l0ZGV2LCAmdmFyaWFudF9pZCk7CisJaWYgKHJjKQorCQlyZXR1cm4g cmM7CisKKwlzaXRkZXYtPmluZm8gPSBzaXQ5NTMxeF9tYXRjaF92YXJpYW50KHZhcmlhbnRfaWQp OworCWlmICghc2l0ZGV2LT5pbmZvKQorCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShzaXRkZXYtPmRl diwgLUVOT0RFViwKKwkJCQkgICAgICJVbmtub3duIHZhcmlhbnQgSUQ6IDB4JTAyeFxuIiwgdmFy aWFudF9pZCk7CisKKwlzaXRkZXYtPmNsb2NrX2lkID0gc2l0OTUzMXhfZGVyaXZlX2Nsb2NrX2lk KHNpdGRldik7CisJc2l0ZGV2LT5pbnRzeW5jX3NyYyA9IC0xOworCisJcmMgPSBkZXZtX211dGV4 X2luaXQoc2l0ZGV2LT5kZXYsICZzaXRkZXYtPm11bHRpb3BfbG9jayk7CisJaWYgKHJjKQorCQly ZXR1cm4gZGV2X2Vycl9wcm9iZShzaXRkZXYtPmRldiwgcmMsCisJCQkJICAgICAiRmFpbGVkIHRv IGluaXRpYWxpemUgbXV0ZXhcbiIpOworCisJLyoKKwkgKiBCZWZvcmUgdGhlIElSUTogdGhlIGhh bmRsZXIgcmVhY2hlcyBzaXRkZXYtPmt3b3JrZXIgdGhyb3VnaAorCSAqIGt0aHJlYWRfbW9kX2Rl bGF5ZWRfd29yaygpLCBzbyB0aGUgd29ya2VyIGhhcyB0byBleGlzdCBiZWZvcmUgYW4KKwkgKiBJ TlRSQiBhc3NlcnRpb24gY2FuIGxhbmQuCisJICovCisJcmMgPSBzaXQ5NTMxeF9kZXZtX2RwbGxf aW5pdChzaXRkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogQWJzZW50ICJpbnRl cnJ1cHRzIiBsZWF2ZXMgY2xpZW50LT5pcnEgMCBhbmQgdGhlIHBvbGwgaW4gY2hhcmdlLiAqLwor CXNpdGRldi0+aXJxID0gc2l0ZGV2LT5jbGllbnQgPyBzaXRkZXYtPmNsaWVudC0+aXJxIDogMDsK KwlpZiAoc2l0ZGV2LT5pcnEgPiAwKSB7CisJCXJjID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2ly cShzaXRkZXYtPmRldiwgc2l0ZGV2LT5pcnEsCisJCQkJCSAgICAgICBOVUxMLCBzaXQ5NTMxeF9p cnFfdGhyZWFkX2ZuLAorCQkJCQkgICAgICAgSVJRRl9PTkVTSE9ULAorCQkJCQkgICAgICAgZGV2 X25hbWUoc2l0ZGV2LT5kZXYpLCBzaXRkZXYpOworCQlpZiAocmMpCisJCQlyZXR1cm4gZGV2X2Vy cl9wcm9iZShzaXRkZXYtPmRldiwgcmMsCisJCQkJCSAgICAgIkZhaWxlZCB0byByZXF1ZXN0IElS USAlZFxuIiwKKwkJCQkJICAgICBzaXRkZXYtPmlycSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbnQgc2l0OTUzMXhfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQp Cit7CisJc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2OworCXN0cnVjdCByZWdtYXAgKnJlZ21h cDsKKworCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJnNpdDk1MzF4X3Jl Z21hcF9jb25maWcpOworCWlmIChJU19FUlIocmVnbWFwKSkKKwkJcmV0dXJuIGRldl9lcnJfcHJv YmUoJmNsaWVudC0+ZGV2LCBQVFJfRVJSKHJlZ21hcCksCisJCQkJICAgICAiRmFpbGVkIHRvIGlu aXRpYWxpemUgcmVnbWFwXG4iKTsKKworCXNpdGRldiA9IGRldm1fa3phbGxvYygmY2xpZW50LT5k ZXYsIHNpemVvZigqc2l0ZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzaXRkZXYpCisJCXJldHVy biAtRU5PTUVNOworCisJc2l0ZGV2LT5kZXYgPSAmY2xpZW50LT5kZXY7CisJc2l0ZGV2LT5jbGll bnQgPSBjbGllbnQ7CisJc2l0ZGV2LT5yZWdtYXAgPSByZWdtYXA7CisJaTJjX3NldF9jbGllbnRk YXRhKGNsaWVudCwgc2l0ZGV2KTsKKworCXJldHVybiBzaXQ5NTMxeF9kZXZfcHJvYmUoc2l0ZGV2 KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2l0OTUzMXhfb2ZfbWF0 Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInNpdGltZSxzaXQ5NTMxNiIgfSwKKwl7IC5jb21w YXRpYmxlID0gInNpdGltZSxzaXQ5NTMxNyIgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RB QkxFKG9mLCBzaXQ5NTMxeF9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBz aXQ5NTMxeF9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9ICJzaXQ5NTMx eCIsCisJCS5vZl9tYXRjaF90YWJsZQk9IHNpdDk1MzF4X29mX21hdGNoLAorCX0sCisJLnByb2Jl CQk9IHNpdDk1MzF4X2kyY19wcm9iZSwKK307Cittb2R1bGVfaTJjX2RyaXZlcihzaXQ5NTMxeF9p MmNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiQWxpIFJvdWhpIDxhcm91aGlAc2l0aW1lLmNv bT4iKTsKK01PRFVMRV9BVVRIT1IoIk9sZWcgWmFkb3JvemhueWkgPE9sZWcuWmFkb3JvemhueWlA ZGV2b3hzb2Z0d2FyZS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNpVGltZSBTaVQ5NTMx eCBEUExMIHN1YnN5c3RlbSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAt LWdpdCBhL2RyaXZlcnMvZHBsbC9zaXQ5NTMxeC9jb3JlLmggYi9kcml2ZXJzL2RwbGwvc2l0OTUz MXgvY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uMDVkNGVl MGM3MTJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kcGxsL3NpdDk1MzF4L2NvcmUuaApA QCAtMCwwICsxLDM3MiBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8K Ky8qCisgKiBTaVRpbWUgU2lUOTUzMXggRFBMTCBjb3JlIGRyaXZlcgorICoKKyAqIENvcHlyaWdo dCAoQykgMjAyNiBTaVRpbWUgQ29ycC4KKyAqIEF1dGhvcjogQWxpIFJvdWhpIDxhcm91aGlAc2l0 aW1lLmNvbT4KKyAqIEF1dGhvcjogT2xlZyBaYWRvcm96aG55aSA8T2xlZy5aYWRvcm96aG55aUBk ZXZveHNvZnR3YXJlLmNvbT4KKyAqCisgKiBEZXZpY2Ugc3RydWN0dXJlLCByZWdpc3RlciBhY2Nl c3MgaGVscGVycywgYW5kIGNvcmUgZnVuY3Rpb24KKyAqIGRlY2xhcmF0aW9ucy4KKyAqLworCisj aWZuZGVmIF9TSVQ5NTMxWF9DT1JFX0gKKyNkZWZpbmUgX1NJVDk1MzFYX0NPUkVfSAorCisjaW5j bHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2lu Y2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVk ZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxs aW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAicmVncy5oIgorCisjZGVmaW5lIFNJVDk1MzFYX05V TV9QTExTCQk0CisjZGVmaW5lIFNJVDk1MzFYX01BWF9JTlBVVFMJCTgKKyNkZWZpbmUgU0lUOTUz MVhfTlVNX0lOUFVUX1BBSVJTCShTSVQ5NTMxWF9NQVhfSU5QVVRTIC8gMikKKyNkZWZpbmUgU0lU OTUzMVhfTUFYX09VVFBVVFMJCTEyCisvKiBvdXRfcGxsX21hcFtdIGVudHJ5IG1lYW5pbmcgInRo aXMgb3V0cHV0IGlzIG5vdCByb3V0ZWQgdG8gYW55IFBMTCIgKi8KKyNkZWZpbmUgU0lUOTUzMVhf T1VUX1BMTF9VTk1BUFBFRAkweEZGCisvKgorICogSU5UU1lOQyAodGhlIGludGVyLVBMTCBzeW5j IG5ldCkgaXMgbW9kZWxsZWQgYXMgdHdvIHBpbnMuICBUaGUKKyAqIGRlc3RpbmF0aW9uIFBMTCB0 aGF0IGxvY2tzIHRvIElOVFNZTkMgc2VlcyBhbiBpbnB1dCBwaW4KKyAqIChTSVQ5NTMxWF9JTlRT WU5DX1BJTl9JRCwgaW4gdGhlIGlucHV0IGlkIG5hbWVzcGFjZSBhZnRlciB0aGUgcGh5c2ljYWwK KyAqIGlucHV0cyBhbmQgdGhlIHh0YWwpOyB0aGUgc291cmNlIFBMTCB0aGF0IGRyaXZlcyBJTlRT WU5DIHNlZXMgYW4gb3V0cHV0CisgKiBwaW4gKFNJVDk1MzFYX0lOVFNZTkNfT1VUX1BJTl9JRCwg YXBwZW5kZWQgYWZ0ZXIgdGhlIHBoeXNpY2FsIG91dHB1dHMpLgorICovCisjZGVmaW5lIFNJVDk1 MzFYX0lOVFNZTkNfUElOX0lECQkoU0lUOTUzMVhfTUFYX0lOUFVUUyArIDEpCisjZGVmaW5lIFNJ VDk1MzFYX0lOVFNZTkNfT1VUX1BJTl9JRAlTSVQ5NTMxWF9NQVhfT1VUUFVUUworI2RlZmluZSBT SVQ5NTMxWF9OVU1fUElOUwkJKFNJVDk1MzFYX01BWF9JTlBVVFMgKyAyICsgU0lUOTUzMVhfTUFY X09VVFBVVFMgKyAxKQorI2RlZmluZSBTSVQ5NTMxWF9TVEFUVVNfUE9MTF9NUwkJNTAwCisKKy8q IHNlbGVjdGVkX3JlZiB2YWx1ZSB3aGVuIHRoZSBhY3RpdmUgc291cmNlIGlzIG5vdCBhIHJlZ2lz dGVyZWQgaW5wdXQgKi8KKyNkZWZpbmUgU0lUOTUzMVhfUkVGX0lOVkFMSUQJCTB4RkYKKworLyog U2lUaW1lIElFRUUgT1VJIGZvciBFVUktNjQgZ2VuZXJhdGlvbiAqLworI2RlZmluZSBTSVQ5NTMx WF9PVUkJCQkweDAwOTBDMkZGRkVVTEwKKworc3RydWN0IHNpdDk1MzF4X2RwbGw7CisKKy8qCisg KiBzdHJ1Y3Qgc2l0OTUzMXhfY2hpcF9pbmZvIC0gY2hpcCB2YXJpYW50IGlkZW50aWZpY2F0aW9u CisgKiBAaWQ6CQl2YXJpYW50IElEIGJ5dGUgcmVhZCBmcm9tIHJlZ2lzdGVyCisgKiBAbnVtX2lu cHV0czoJbnVtYmVyIG9mIGlucHV0IGNsb2NrIHBpbnMKKyAqIEBudW1fb3V0cHV0czogbnVtYmVy IG9mIG91dHB1dCBjbG9jayBwaW5zCisgKiBAbmFtZToJaHVtYW4tcmVhZGFibGUgdmFyaWFudCBu YW1lCisgKiBAY2xrb3V0X21hcDoJcGVyLW91dHB1dCBzbG90IG1hcHBpbmcgKG91dHB1dCBpbmRl eCAtPiBwaHlzaWNhbCBzbG90KQorICovCitzdHJ1Y3Qgc2l0OTUzMXhfY2hpcF9pbmZvIHsKKwl1 OAkJaWQ7CisJdTgJCW51bV9pbnB1dHM7CisJdTgJCW51bV9vdXRwdXRzOworCWNvbnN0IGNoYXIJ Km5hbWU7CisJY29uc3QgdTgJKmNsa291dF9tYXA7Cit9OworCisvKgorICogZW51bSBzaXQ5NTMx eF9zaWduYWxfbW9kZSAtIGlucHV0IHNpZ25hbCBlbGVjdHJpY2FsIG1vZGUKKyAqIEBTSVQ5NTMx WF9NT0RFX1NFOiBzaW5nbGUtZW5kZWQKKyAqIEBTSVQ5NTMxWF9NT0RFX0RFOiBkaWZmZXJlbnRp YWwKKyAqLworZW51bSBzaXQ5NTMxeF9zaWduYWxfbW9kZSB7CisJU0lUOTUzMVhfTU9ERV9TRSA9 IDAsCisJU0lUOTUzMVhfTU9ERV9ERSwKK307CisKKy8qCisgKiBzdHJ1Y3Qgc2l0OTUzMXhfcmVm IC0gaW5wdXQgcmVmZXJlbmNlIHN0YXRlCisgKiBAZnJlcToJCWNvbmZpZ3VyZWQgZnJlcXVlbmN5 IGluIEh6CisgKiBAZW5hYmxlZDoJCXJlZmVyZW5jZSBpcyBlbmFibGVkIGZvciBtb25pdG9yaW5n CisgKiBAbG9zOgkJbG9zcy1vZi1zaWduYWwgZGV0ZWN0ZWQKKyAqIEBvb2Y6CQlvdXQtb2YtZnJl cXVlbmN5IGRldGVjdGVkCisgKiBAcGxsX21hc2s6CQliaXRtYXNrIG9mIFBMTHMgdGhpcyBpbnB1 dCBmZWVkcyAoYml0IDAgPSBQTExBKQorICogQGxhYmVsOgkJYm9hcmQgbGFiZWwgZnJvbSBEVCBv ciBkZWZhdWx0CisgKiBAc2lnX21vZGU6CQlzaWduYWwgbW9kZSBvZiB0aGUgcGFpciB0aGlzIGxh bmUgYmVsb25ncyB0bworICoJCQkoZGV0ZWN0ZWQgZnJvbSBDTEtJTnhfSU5QVVRfTU9ERSBhdCBw cm9iZSkKKyAqLworc3RydWN0IHNpdDk1MzF4X3JlZiB7CisJdTMyCQlmcmVxOworCWJvb2wJCWVu YWJsZWQ7CisJYm9vbAkJbG9zOworCWJvb2wJCW9vZjsKKwl1OAkJcGxsX21hc2s7CisJY29uc3Qg Y2hhcgkqbGFiZWw7CisJZW51bSBzaXQ5NTMxeF9zaWduYWxfbW9kZQlzaWdfbW9kZTsKK307CisK Ky8qCisgKiBzdHJ1Y3Qgc2l0OTUzMXhfb3V0IC0gb3V0cHV0IHN0YXRlCisgKiBAZW5hYmxlZDoJ CW91dHB1dCBpcyBkcml2aW5nLCBpLmUuIG5vdCBmb3JjZWQgaW50byBIaS1aCisgKiBAcm91dGVk OgkJb3V0cHV0IGlzIG1hcHBlZCB0byBAcGxsX2lkeCBieSB0aGUgaW5pdGlhbAorICoJCQljb25m aWd1cmF0aW9uOyBhbiB1bnJvdXRlZCBvdXRwdXQgaGFzIG5vIERQTEwgcGluCisgKiBAcGxsX2lk eDoJCVBMTCBkcml2aW5nIHRoaXMgb3V0cHV0ICgwLTMpCisgKiBAbGFiZWw6CQlib2FyZCBsYWJl bCBmcm9tIERUIG9yIGRlZmF1bHQKKyAqLworc3RydWN0IHNpdDk1MzF4X291dCB7CisJdTMyCQlm cmVxOworCWJvb2wJCWVuYWJsZWQ7CisJYm9vbAkJcm91dGVkOworCXU4CQlwbGxfaWR4OworCWNv bnN0IGNoYXIJKmxhYmVsOworfTsKKworLyoKKyAqIHN0cnVjdCBzaXQ5NTMxeF9jaGFuIC0gcGVy LVBMTCBjaGFubmVsIHN0YXRlCisgKiBAYWN0aXZlOgkJUExMIGhhcyByZWFjaGVkIGl0cyBhY3Rp dmUgc3RhdGU7IGEgUExMIHRoZSBsb2FkZWQKKyAqCQkJY29uZmlndXJhdGlvbiBsZWF2ZXMgdW51 c2VkIG5ldmVyIGRvZXMsIGFuZCBpdHMKKyAqCQkJbG9zcy1vZi1sb2NrIGJpdCBzdGF5cyBjbGVh ciBiZWNhdXNlIG5vdGhpbmcgZHJpdmVzIGl0CisgKiBAbG9ja2VkOgkJUExMIGlzIGxvY2tlZCAo cmF3IHN0YXR1cyByZWdpc3RlciBiaXQpCisgKiBAbW9kZToJCTAgPSBzeW5jIChvdXRlciBsb29w IGVuYWJsZWQpLCAxID0gZnJlZS1ydW4KKyAqIEBzZWxlY3RlZF9yZWY6CWxvZ2ljYWwgaW5wdXQg aW5kZXggb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAorICoJCQlyZWZlcmVuY2UgKHRoZSBJTlRT WU5DIG5ldCBtYXBzIHRvCisgKgkJCVNJVDk1MzFYX0lOVFNZTkNfUElOX0lEKSwgb3IgU0lUOTUz MVhfUkVGX0lOVkFMSUQKKyAqCQkJd2hlbiB0aGUgaGFyZHdhcmUgc291cmNlIGVuY29kaW5nIGlz IHJlc2VydmVkCisgKiBAaW5uZXJfbG9sOgkJUExMIGlubmVyIGxvb3AgbG9zcy1vZi1sb2NrIGRl dGVjdGVkCisgKiBAaG9fZnJlZXplOgkJaG9sZG92ZXIgZnJlZXplIGFjdGl2ZQorICovCitzdHJ1 Y3Qgc2l0OTUzMXhfY2hhbiB7CisJYm9vbAkJYWN0aXZlOworCWJvb2wJCWxvY2tlZDsKKwl1OAkJ bW9kZTsKKwl1OAkJc2VsZWN0ZWRfcmVmOworCWJvb2wJCWlubmVyX2xvbDsKKwlib29sCQlob19m cmVlemU7Cit9OworCisvKgorICogc3RydWN0IHNpdDk1MzF4X2RldiAtIFNpVDk1MzF4IGRldmlj ZSBpbnN0YW5jZQorICogQGluZm86CQlkZXRlY3RlZCBjaGlwIHZhcmlhbnQgaW5mbworICogQG11 bHRpb3BfbG9jazoJbXV0ZXggZm9yIG11bHRpLXJlZ2lzdGVyIGF0b21pYyBvcGVyYXRpb25zCisg KiBAcmVmOgkJYXJyYXkgb2YgaW5wdXQgcmVmZXJlbmNlIHN0YXRlcworICogQG91dDoJCWFycmF5 IG9mIG91dHB1dCBzdGF0ZXMKKyAqIEBjaGFuOgkJYXJyYXkgb2YgcGVyLVBMTCBjaGFubmVsIHN0 YXRlcworICogQHh0YWxfZnJlcToJCWNyeXN0YWwgb3NjaWxsYXRvciBmcmVxdWVuY3kgaW4gSHoK KyAqIEBrd29ya2VyOgkJa3RocmVhZCB3b3JrZXIgZm9yIHBlcmlvZGljIHBvbGxpbmcKKyAqIEB3 b3JrOgkJZGVsYXllZCB3b3JrIGZvciBwZXJpb2RpYyBzdGF0ZSBjaGVja3MKKyAqIEBjbG9ja19p ZDoJCUlFRUUgMTU4OCBFVUktNjQgY2xvY2sgaWRlbnRpZmllcgorICogQHJlc2V0X2dwaW86CQlv cHRpb25hbCByZXNldCBsaW5lIChEVCAicmVzZXQtZ3Bpb3MiKSwgTlVMTCBpZiBhYnNlbnQKKyAq IEBpcnE6CQlvcHRpb25hbCBJTlRSQiBJUlEgbnVtYmVyIChmcm9tIERUICJpbnRlcnJ1cHRzIiB2 aWEgdGhlCisgKgkJCUkyQyBjbGllbnQpLCAwIGlmIG5vIElSUSBpcyB3aXJlZAorICogQHBsbF9m dmNvOgkJb3B0aW9uYWwgcGVyLVBMTCBWQ08gaW4gSHogZnJvbSBEVAorICoJCQkic2l0aW1lLHBs bC1mdmNvIjsgMCBtZWFucyBkZXJpdmUgZnJvbSBESVZOCisgKiBAb3V0X3BsbF9tYXA6CW9wdGlv bmFsIHBlci1vdXRwdXQgc291cmNlIFBMTCAoMC0zLCAweGZmID0KKyAqCQkJdW5tYXBwZWQpIGZy b20gRFQgInNpdGltZSxvdXRwdXQtcGxsLW1hcCIKKyAqIEBvdXRfcGxsX21hcF92YWxpZDoJdHJ1 ZSB3aGVuIG91dF9wbGxfbWFwW10gd2FzIHBvcHVsYXRlZCBmcm9tIERUOworICoJCQlmYWxzZSBt ZWFucyB1c2UgdGhlIGNoaXAncyBPVVRfTUFQIHJlZ2lzdGVycworICogQGludHN5bmNfc3JjOglQ TEwgaW5kZXggY3VycmVudGx5IHNvdXJjaW5nIGludGVyLVBMTAorICoJCQlzeW5jaHJvbml6YXRp b24gKElOVFNZTkMpLCBvciAtMSB3aGVuIGRpc2FibGVkCisgKi8KK3N0cnVjdCBzaXQ5NTMxeF9k ZXYgeworCXN0cnVjdCBkZXZpY2UJCQkqZGV2OworCXN0cnVjdCBpMmNfY2xpZW50CQkqY2xpZW50 OworCXN0cnVjdCByZWdtYXAJCQkqcmVnbWFwOworCWNvbnN0IHN0cnVjdCBzaXQ5NTMxeF9jaGlw X2luZm8JKmluZm87CisJLyogU2VyaWFsaXplcyBtdWx0aS1zdGVwIHJlZ2lzdGVyIHNlcXVlbmNl cyAqLworCXN0cnVjdCBtdXRleAkJCW11bHRpb3BfbG9jazsKKworCS8qIEhhcmR3YXJlIHN0YXRl ICovCisJc3RydWN0IHNpdDk1MzF4X3JlZglyZWZbU0lUOTUzMVhfTUFYX0lOUFVUUyArIDFdOyAv KiArMSBmb3IgeHRhbCAqLworCXN0cnVjdCBzaXQ5NTMxeF9vdXQJb3V0W1NJVDk1MzFYX01BWF9P VVRQVVRTXTsKKwlzdHJ1Y3Qgc2l0OTUzMXhfY2hhbgljaGFuW1NJVDk1MzFYX05VTV9QTExTXTsK Kwl1MzIJCQl4dGFsX2ZyZXE7CisKKwkvKiBEUExMIGNoYW5uZWxzICovCisJc3RydWN0IGxpc3Rf aGVhZAlkcGxsczsKKworCS8qIE1vbml0b3IgKi8KKwlzdHJ1Y3Qga3RocmVhZF93b3JrZXIJCSpr d29ya2VyOworCXN0cnVjdCBrdGhyZWFkX2RlbGF5ZWRfd29yawl3b3JrOworCisJLyogRGV2aWNl IGlkZW50aXR5ICovCisJdTY0CQkJY2xvY2tfaWQ7CisKKwkvKiBPcHRpb25hbCBEVC1kZXNjcmli ZWQgR1BJTyAvIElSUSBsaW5lcyAqLworCXN0cnVjdCBncGlvX2Rlc2MJKnJlc2V0X2dwaW87CisJ aW50CQkJaXJxOworCisJLyogT3B0aW9uYWwgRFQgYm9hcmQtY29uZmlnIG92ZXJyaWRlcyAqLwor CXU2NAkJCXBsbF9mdmNvW1NJVDk1MzFYX05VTV9QTExTXTsKKwl1OAkJCW91dF9wbGxfbWFwW1NJ VDk1MzFYX01BWF9PVVRQVVRTXTsKKwlib29sCQkJb3V0X3BsbF9tYXBfdmFsaWQ7CisKKwkvKiBJ bnRlci1QTEwgc3luY2hyb25pemF0aW9uIHN0YXRlICovCisJczgJCQlpbnRzeW5jX3NyYzsKKwor fTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHNpdDk1MzF4X3JlZ21hcF9j b25maWc7CisKKy8qIC0tLS0gQ29yZSBsaWZlY3ljbGUgLS0tLSAqLworaW50ICBzaXQ5NTMxeF9k ZXZfcHJvYmUoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2KTsKK2ludCAgc2l0OTUzMXhfZGV2 X3N0YXJ0KHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldik7Cit2b2lkIHNpdDk1MzF4X2Rldl9z dG9wKHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldik7CisKKy8qIC0tLS0gUmVnaXN0ZXIgYWNj ZXNzIC0tLS0gKi8KK2ludCBzaXQ5NTMxeF9yZWFkX3U4KHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNp dGRldiwgdW5zaWduZWQgaW50IHJlZywKKwkJICAgICB1OCAqdmFsKTsKK2ludCBzaXQ5NTMxeF93 cml0ZV91OChzdHJ1Y3Qgc2l0OTUzMXhfZGV2ICpzaXRkZXYsIHVuc2lnbmVkIGludCByZWcsCisJ CSAgICAgIHU4IHZhbCk7CitpbnQgc2l0OTUzMXhfcmVhZF9wbGxfdTgoc3RydWN0IHNpdDk1MzF4 X2RldiAqc2l0ZGV2LCB1OCBwbGxfaWR4LAorCQkJIHU4IG9mZnNldCwgdTggKnZhbCk7CitpbnQg c2l0OTUzMXhfd3JpdGVfcGxsX3U4KHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwgdTggcGxs X2lkeCwKKwkJCSAgdTggb2Zmc2V0LCB1OCB2YWwpOworaW50IHNpdDk1MzF4X3VwZGF0ZV9wbGxf dTgoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2LCB1OCBwbGxfaWR4LAorCQkJICAgdTggb2Zm c2V0LCB1OCBtYXNrLCB1OCB2YWwpOworCisvKiAtLS0tIElucHV0IGVuYWJsZS9kaXNhYmxlIC0t LS0gKi8KK2ludCBzaXQ5NTMxeF9pbnB1dF9kaXNhYmxlKHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNp dGRldiwgdTggaW5kZXgpOworaW50IHNpdDk1MzF4X2lucHV0X2VuYWJsZShzdHJ1Y3Qgc2l0OTUz MXhfZGV2ICpzaXRkZXYsIHU4IGluZGV4KTsKKworLyogLS0tLSBJbnB1dCBwcmlvcml0eSAtLS0t ICovCitpbnQgc2l0OTUzMXhfaW5wdXRfcHJpb19zZXQoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0 ZGV2LCB1OCBwbGxfaWR4LAorCQkJICAgIHU4IGlucHV0X2lkeCwgdTggcHJpbyk7CitpbnQgc2l0 OTUzMXhfaW5wdXRfcHJpb19nZXQoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2LCB1OCBwbGxf aWR4LAorCQkJICAgIHU4IGlucHV0X2lkeCwgdTggKnByaW8pOworaW50IHNpdDk1MzF4X2lucHV0 X3ByaW9fcmVtb3ZlKHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwgdTggcGxsX2lkeCwKKwkJ CSAgICAgICB1OCBpbnB1dF9pZHgpOworaW50IHNpdDk1MzF4X2lucHV0X3ByaW9fYWRkKHN0cnVj dCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwgdTggcGxsX2lkeCwKKwkJCSAgICB1OCBpbnB1dF9pZHgp OworCisvKiAtLS0tIE91dHB1dCBlbmFibGUvZGlzYWJsZSAoSGktWiBjb250cm9sKSAtLS0tICov CitpbnQgc2l0OTUzMXhfb3V0cHV0X2Rpc2FibGUoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2 LCB1OCBpbmRleCk7CitpbnQgc2l0OTUzMXhfb3V0cHV0X2VuYWJsZShzdHJ1Y3Qgc2l0OTUzMXhf ZGV2ICpzaXRkZXYsIHU4IGluZGV4KTsKKworLyogLS0tLSBPdXRwdXQgZnJlcXVlbmN5IC0tLS0g Ki8KK2ludCBzaXQ5NTMxeF9vdXRwdXRfZnJlcV9zZXQoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0 ZGV2LCB1OCBvdXRfaWR4LAorCQkJICAgICB1OCBwbGxfaWR4LCB1NjQgZnJlcXVlbmN5KTsKK2lu dCBzaXQ5NTMxeF9vdXRwdXRfZnJlcV9nZXQoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2LCB1 OCBvdXRfaWR4LAorCQkJICAgICB1NjQgKmZyZXF1ZW5jeSk7CisKKy8qIC0tLS0gT3V0cHV0IHBo YXNlIGFkanVzdCAoUFJHX1JTVF9ERUxBWSByZWdpc3Rlci1iYXNlZCkgLS0tLSAqLworaW50IHNp dDk1MzF4X291dHB1dF9waGFzZV9hZGp1c3Rfc2V0KHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRl diwKKwkJCQkgICAgIHU4IG91dF9pZHgsIHMzMiBwaGFzZV9wcyk7CisKKy8qIC0tLS0gTm90aWZp Y2F0aW9uIGNsZWFyIC0tLS0gKi8KK2ludCBzaXQ5NTMxeF9jbGVhcl9ub3RpZmljYXRpb25zKHN0 cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldik7CisKKy8qIC0tLS0gSU5UU1lOQyAoaW50ZXItUExM IHN5bmNocm9uaXphdGlvbikgLS0tLSAqLworaW50IHNpdDk1MzF4X2ludHN5bmNfZW5hYmxlKHN0 cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwgdTggc3JjX3BsbF9pZHgpOworaW50IHNpdDk1MzF4 X2ludHN5bmNfZGlzYWJsZShzdHJ1Y3Qgc2l0OTUzMXhfZGV2ICpzaXRkZXYsIHU4IHNyY19wbGxf aWR4KTsKKworLyogLS0tLSBPdXRwdXQgcHVsc2UgY29udHJvbCAtLS0tICovCitpbnQgc2l0OTUz MXhfb3V0cHV0X3B1bHNlX2N0cmxfc2V0KHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwKKwkJ CQkgICB1OCBvdXRfaWR4LCB1OCBwdWxzZV9jdHJsKTsKKworLyogLS0tLSBQaGFzZSBvZmZzZXQg KFREQyByZWFkYmFjaykgLS0tLSAqLworaW50IHNpdDk1MzF4X3BsbF9mZm9fcHB0KHN0cnVjdCBz aXQ5NTMxeF9kZXYgKnNpdGRldiwgdTggcGxsX2lkeCwgczY0ICpmZm8pOworaW50IHNpdDk1MzF4 X3BoYXNlX29mZnNldF9yZWFkKHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwgdTggcGxsX2lk eCwKKwkJCSAgICAgICBzNjQgKnBoYXNlX3BzKTsKKworLyogLS0tLSBTdGF0ZSBoZWxwZXJzIC0t LS0gKi8KKworLyoKKyAqIHNpdDk1MzF4X3BsbF9wYWdlIC0gZ2V0IHJlZ2lzdGVyIHBhZ2UgZm9y IFBMTCBpbmRleAorICogQHBsbF9pZHg6IFBMTCBpbmRleCAoMCA9IFBMTEEsIDMgPSBQTExEKQor ICovCitzdGF0aWMgaW5saW5lIHU4IHNpdDk1MzF4X3BsbF9wYWdlKHU4IHBsbF9pZHgpCit7CisJ cmV0dXJuIFNJVDk1MzFYX1BBR0VfUExMQSArIHBsbF9pZHg7Cit9CisKKy8qCisgKiBMb2dpY2Fs IGlucHV0IHBpbnMgYXJlIGludGVybGVhdmVkOiBldmVuIGluZGV4ID0gUCBsYW5lLCBvZGQKKyAq IGluZGV4ID0gTiBsYW5lIG9mIHBhaXIgaW5kZXgvMiAoSU4wUCwgSU4wTiwgSU4xUCwgSU4xTiwg Li4uKS4KKyAqIEluZGV4IFNJVDk1MzFYX01BWF9JTlBVVFMgaXMgdGhlIFhPIGlucHV0LgorICov CisKKy8qCisgKiBzaXQ5NTMxeF9pbnB1dF9wYWlyIC0gZ2V0IGlucHV0IHBhaXIgbnVtYmVyIGZv ciBhIGxvZ2ljYWwgaW5wdXQgaW5kZXgKKyAqIEBpbmRleDogbG9naWNhbCBpbnB1dCBwaW4gaW5k ZXgKKyAqLworc3RhdGljIGlubGluZSB1OCBzaXQ5NTMxeF9pbnB1dF9wYWlyKHU4IGluZGV4KQor eworCXJldHVybiBpbmRleCA+PiAxOworfQorCisvKgorICogc2l0OTUzMXhfaW5wdXRfaXNfbiAt IGNoZWNrIGlmIGEgbG9naWNhbCBpbnB1dCBpbmRleCBpcyBhbiBOIGxhbmUKKyAqIEBpbmRleDog bG9naWNhbCBpbnB1dCBwaW4gaW5kZXgKKyAqLworc3RhdGljIGlubGluZSBib29sIHNpdDk1MzF4 X2lucHV0X2lzX24odTggaW5kZXgpCit7CisJcmV0dXJuIGluZGV4ICYgMTsKK30KKworLyoKKyAq IHNpdDk1MzF4X2lucHV0X2h3X3NyYyAtIHRyYW5zbGF0ZSBsb2dpY2FsIGlucHV0IGluZGV4IHRv IHNvdXJjZSBlbmNvZGluZworICogQGluZGV4OiBsb2dpY2FsIGlucHV0IHBpbiBpbmRleAorICoK KyAqIFRoZSBwcmlvcml0eSB0YWJsZSBhbmQgQ0xLX0FDVElWRVNFTCByZWdpc3RlcnMgdXNlIGEg bm9uLWNvbnRpZ3VvdXMKKyAqIHNvdXJjZSBlbmNvZGluZzogMC0zID0gQ0xLMFAuLkNMSzNQLCA1 ID0gT0NYTywgNiA9IElOVFNZTkMsCisgKiA3LTEwID0gQ0xLME4uLkNMSzNOLgorICovCitzdGF0 aWMgaW5saW5lIHU4IHNpdDk1MzF4X2lucHV0X2h3X3NyYyh1OCBpbmRleCkKK3sKKwlpZiAoaW5k ZXggPT0gU0lUOTUzMVhfTUFYX0lOUFVUUykKKwkJcmV0dXJuIFNJVDk1MzFYX1BSSU9fU1JDX09D WE87CisJaWYgKGluZGV4ID09IFNJVDk1MzFYX0lOVFNZTkNfUElOX0lEKQorCQlyZXR1cm4gU0lU OTUzMVhfUFJJT19TUkNfSU5UU1lOQzsKKwlpZiAoc2l0OTUzMXhfaW5wdXRfaXNfbihpbmRleCkp CisJCXJldHVybiBTSVQ5NTMxWF9QUklPX1NSQ19OX0JBU0UgKyBzaXQ5NTMxeF9pbnB1dF9wYWly KGluZGV4KTsKKwlyZXR1cm4gc2l0OTUzMXhfaW5wdXRfcGFpcihpbmRleCk7Cit9CisKKy8qCisg KiBzaXQ5NTMxeF9od19zcmNfaW5wdXQgLSB0cmFuc2xhdGUgc291cmNlIGVuY29kaW5nIHRvIGxv Z2ljYWwgaW5wdXQgaW5kZXgKKyAqIEBzcmM6IDQtYml0IGhhcmR3YXJlIHNvdXJjZSBlbmNvZGlu ZworICoKKyAqIFJldHVybjogbG9naWNhbCBpbnB1dCBpbmRleCAoSU5UU1lOQyBtYXBzIHRvIFNJ VDk1MzFYX0lOVFNZTkNfUElOX0lEKSwKKyAqIG9yIFNJVDk1MzFYX1JFRl9JTlZBTElEIGlmIEBz cmMgaXMgYSByZXNlcnZlZCB2YWx1ZQorICovCitzdGF0aWMgaW5saW5lIHU4IHNpdDk1MzF4X2h3 X3NyY19pbnB1dCh1OCBzcmMpCit7CisJaWYgKHNyYyA8IFNJVDk1MzFYX05VTV9JTlBVVF9QQUlS UykKKwkJcmV0dXJuIHNyYyAqIDI7CisJaWYgKHNyYyA9PSBTSVQ5NTMxWF9QUklPX1NSQ19PQ1hP KQorCQlyZXR1cm4gU0lUOTUzMVhfTUFYX0lOUFVUUzsKKwlpZiAoc3JjID09IFNJVDk1MzFYX1BS SU9fU1JDX0lOVFNZTkMpCisJCXJldHVybiBTSVQ5NTMxWF9JTlRTWU5DX1BJTl9JRDsKKwlpZiAo c3JjID49IFNJVDk1MzFYX1BSSU9fU1JDX05fQkFTRSAmJgorCSAgICBzcmMgPCBTSVQ5NTMxWF9Q UklPX1NSQ19OX0JBU0UgKyBTSVQ5NTMxWF9OVU1fSU5QVVRfUEFJUlMpCisJCXJldHVybiAoc3Jj IC0gU0lUOTUzMVhfUFJJT19TUkNfTl9CQVNFKSAqIDIgKyAxOworCXJldHVybiBTSVQ5NTMxWF9S RUZfSU5WQUxJRDsKK30KKworLyoKKyAqIHNpdDk1MzF4X3JlZl9zdGF0ZV9nZXQgLSBnZXQgcmVm ZXJlbmNlIHN0YXRlIGJ5IGluZGV4CisgKiBAaW5kZXg6CWxvZ2ljYWwgaW5wdXQgaW5kZXgKKyAq CisgKiBSZXR1cm46IHBvaW50ZXIgdG8gdGhlIGNhY2hlZCBpbnB1dCByZWZlcmVuY2Ugc3RhdGUK KyAqLworc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3Qgc2l0OTUzMXhfcmVmICoKK3NpdDk1MzF4 X3JlZl9zdGF0ZV9nZXQoY29uc3Qgc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2LCB1OCBpbmRl eCkKK3sKKwlyZXR1cm4gJnNpdGRldi0+cmVmW2luZGV4XTsKK30KKworLyoKKyAqIHNpdDk1MzF4 X291dF9zdGF0ZV9nZXQgLSBnZXQgb3V0cHV0IHN0YXRlIGJ5IGluZGV4CisgKiBAaW5kZXg6CWxv Z2ljYWwgb3V0cHV0IGluZGV4CisgKgorICogUmV0dXJuOiBwb2ludGVyIHRvIHRoZSBjYWNoZWQg b3V0cHV0IHN0YXRlCisgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IHNpdDk1MzF4X291 dCAqCitzaXQ5NTMxeF9vdXRfc3RhdGVfZ2V0KGNvbnN0IHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNp dGRldiwgdTggaW5kZXgpCit7CisJcmV0dXJuICZzaXRkZXYtPm91dFtpbmRleF07Cit9CisKKy8q CisgKiBzaXQ5NTMxeF9jaGFuX3N0YXRlX2dldCAtIGdldCBjaGFubmVsIHN0YXRlIGJ5IFBMTCBp bmRleAorICoKKyAqIFJldHVybjogcG9pbnRlciB0byB0aGUgY2FjaGVkIHBlci1QTEwgY2hhbm5l bCBzdGF0ZQorICovCitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBzaXQ5NTMxeF9jaGFuICoK K3NpdDk1MzF4X2NoYW5fc3RhdGVfZ2V0KGNvbnN0IHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRl diwgdTggcGxsX2lkeCkKK3sKKwlyZXR1cm4gJnNpdGRldi0+Y2hhbltwbGxfaWR4XTsKK30KKwor I2VuZGlmIC8qIF9TSVQ5NTMxWF9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZHBsbC9z aXQ5NTMxeC9kcGxsLmMgYi9kcml2ZXJzL2RwbGwvc2l0OTUzMXgvZHBsbC5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uZTI1OGJlY2VmZmRkCi0tLSAvZGV2L251bGwK KysrIGIvZHJpdmVycy9kcGxsL3NpdDk1MzF4L2RwbGwuYwpAQCAtMCwwICsxLDEyMzIgQEAKKy8v IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogU2lUaW1lIFNpVDk1MzF4 IERQTEwgc3Vic3lzdGVtIGNhbGxiYWNrcyBhbmQgcmVnaXN0cmF0aW9uCisgKgorICogQ29weXJp Z2h0IChDKSAyMDI2IFNpVGltZSBDb3JwLgorICogQXV0aG9yOiBBbGkgUm91aGkgPGFyb3VoaUBz aXRpbWUuY29tPgorICogQXV0aG9yOiBPbGVnIFphZG9yb3pobnlpIDxPbGVnLlphZG9yb3pobnlp QGRldm94c29mdHdhcmUuY29tPgorICoKKyAqIERQTEwgZGV2aWNlIG9wcywgcGluIG9wcyAoc2Vw YXJhdGUgaW5wdXQvb3V0cHV0KSwgcGluIHJlZ2lzdHJhdGlvbiwKKyAqIGFuZCBwZXJpb2RpYyBj aGFuZ2UgZGV0ZWN0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kcGxsLmg+CisjaW5jbHVk ZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxp bnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgv c2xhYi5oPgorCisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImRwbGwuaCIKKyNpbmNsdWRl ICJwcm9wLmgiCisjaW5jbHVkZSAicmVncy5oIgorCisjZGVmaW5lIFNJVDk1MzFYX0VTWU5DX0ZS RVFfMTBNSFoJMTAwMDAwMDBVTEwKKyNkZWZpbmUgU0lUOTUzMVhfRVNZTkNfUFVMU0VfREVGQVVM VAk1MAorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRwbGxfcGluX2ZyZXF1ZW5jeSBzaXQ5NTMxeF9l c3luY19yYW5nZXNbXSA9IHsKKwlEUExMX1BJTl9GUkVRVUVOQ1koMCksCisJRFBMTF9QSU5fRlJF UVVFTkNZKFNJVDk1MzFYX0VTWU5DX0ZSRVFfMTBNSFopLAorfTsKKworc3RhdGljIGlubGluZSBi b29sCitzaXQ5NTMxeF9kcGxsX2VzeW5jX3Bpbl9zdXBwb3J0ZWQoY29uc3Qgc3RydWN0IHNpdDk1 MzF4X2RwbGxfcGluICpkcGluKQoreworCXJldHVybiBkcGluLT5lc3luY19jb250cm9sOworfQor CitzdGF0aWMgaW5saW5lIGJvb2wgc2l0OTUzMXhfZHBsbF9pc19pbnB1dF9waW4oY29uc3Qgc3Ry dWN0IHNpdDk1MzF4X2RwbGxfcGluICpwaW4pCit7CisJcmV0dXJuIHBpbi0+ZGlyID09IERQTExf UElOX0RJUkVDVElPTl9JTlBVVDsKK30KKworc3RhdGljIGlubGluZSBib29sCitzaXQ5NTMxeF9k cGxsX2lzX2ludHN5bmNfcGluKGNvbnN0IHN0cnVjdCBzaXQ5NTMxeF9kcGxsX3BpbiAqcGluKQor eworCXJldHVybiBzaXQ5NTMxeF9kcGxsX2lzX2lucHV0X3BpbihwaW4pICYmCisJICAgICAgIHBp bi0+aWQgPT0gU0lUOTUzMVhfSU5UU1lOQ19QSU5fSUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9v bAorc2l0OTUzMXhfZHBsbF9pc19pbnRzeW5jX3NyY19waW4oY29uc3Qgc3RydWN0IHNpdDk1MzF4 X2RwbGxfcGluICpwaW4pCit7CisJcmV0dXJuICFzaXQ5NTMxeF9kcGxsX2lzX2lucHV0X3Bpbihw aW4pICYmCisJICAgICAgIHBpbi0+aWQgPT0gU0lUOTUzMVhfSU5UU1lOQ19PVVRfUElOX0lEOwor fQorCitzdGF0aWMgaW5saW5lIGJvb2wKK3NpdDk1MzF4X2RwbGxfaXNfeG9fcGluKGNvbnN0IHN0 cnVjdCBzaXQ5NTMxeF9kcGxsX3BpbiAqcGluKQoreworCXJldHVybiBzaXQ5NTMxeF9kcGxsX2lz X2lucHV0X3BpbihwaW4pICYmCisJICAgICAgIHBpbi0+aWQgPT0gU0lUOTUzMVhfTUFYX0lOUFVU UzsKK30KKworLyoKKyAqIFRoZSBjYWNoZWQgc3RhdGUgdGhpcyByZXBvcnRzIGNvbWVzIGZyb20g dGhlIG91dGVyIGxvc3Mtb2YtbG9jayBieXRlCisgKiAocGFnZSAwLCByZWcgMHgwNiksIHRoZSBQ TEwgbW9kZSBiaXQgKFBMTCBwYWdlLCByZWcgMHgzMSksIGlubmVyIExPTAorICogKHJlZyAweDky KSBhbmQgdGhlIGhvbGRvdmVyIGZyZWV6ZSBieXRlIChyZWcgMHgwQSkuCisgKi8KK3N0YXRpYyBp bnQKK3NpdDk1MzF4X2RwbGxfbG9ja19zdGF0dXNfZ2V0KGNvbnN0IHN0cnVjdCBkcGxsX2Rldmlj ZSAqZHBsbCwgdm9pZCAqZHBsbF9wcml2LAorCQkJICAgICAgZW51bSBkcGxsX2xvY2tfc3RhdHVz ICpzdGF0dXMsCisJCQkgICAgICBlbnVtIGRwbGxfbG9ja19zdGF0dXNfZXJyb3IgKnN0YXR1c19l cnJvciwKKwkJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKK3sKKwlzdHJ1 Y3Qgc2l0OTUzMXhfZHBsbCAqc2l0ZHBsbCA9IGRwbGxfcHJpdjsKKwlzdHJ1Y3Qgc2l0OTUzMXhf ZGV2ICpzaXRkZXYgPSBzaXRkcGxsLT5kZXY7CisJY29uc3Qgc3RydWN0IHNpdDk1MzF4X2NoYW4g KmNoYW47CisKKwlpZiAoc3RhdHVzX2Vycm9yKQorCQkqc3RhdHVzX2Vycm9yID0gRFBMTF9MT0NL X1NUQVRVU19FUlJPUl9OT05FOworCisJY2hhbiA9IHNpdDk1MzF4X2NoYW5fc3RhdGVfZ2V0KHNp dGRldiwgc2l0ZHBsbC0+aWQpOworCisJbXV0ZXhfbG9jaygmc2l0ZGV2LT5tdWx0aW9wX2xvY2sp OworCisJaWYgKCFjaGFuLT5hY3RpdmUpIHsKKwkJLyoKKwkJICogQSBQTEwgdGhlIGxvYWRlZCBj b25maWd1cmF0aW9uIGxlYXZlcyB1bnVzZWQgbmV2ZXIgcmVhY2hlcworCQkgKiBpdHMgYWN0aXZl IHN0YXRlLiAgTm90aGluZyBkcml2ZXMgaXRzIGxvc3Mtb2YtbG9jayBiaXQsIHNvCisJCSAqIHdp dGhvdXQgdGhpcyBpdCB3b3VsZCByZXBvcnQgYSBsb2NrIGl0IGRvZXMgbm90IGhhdmUuCisJCSAq LworCQkqc3RhdHVzID0gRFBMTF9MT0NLX1NUQVRVU19VTkxPQ0tFRDsKKwl9IGVsc2UgaWYgKGNo YW4tPmxvY2tlZCkgeworCQlpZiAoY2hhbi0+bW9kZSkKKwkJCSpzdGF0dXMgPSBEUExMX0xPQ0tf U1RBVFVTX0xPQ0tFRDsgICAgICAgLyogZnJlZS1ydW4gKi8KKwkJZWxzZQorCQkJKnN0YXR1cyA9 IERQTExfTE9DS19TVEFUVVNfTE9DS0VEX0hPX0FDUTsgLyogc3luYyAqLworCX0gZWxzZSBpZiAo Y2hhbi0+aG9fZnJlZXplKSB7CisJCSpzdGF0dXMgPSBEUExMX0xPQ0tfU1RBVFVTX0hPTERPVkVS OworCX0gZWxzZSB7CisJCSpzdGF0dXMgPSBEUExMX0xPQ0tfU1RBVFVTX1VOTE9DS0VEOworCX0K KworCS8qIFJlcG9ydCBpbm5lciBMT0wgYXMgYW4gZXJyb3IgY29uZGl0aW9uICovCisJaWYgKHN0 YXR1c19lcnJvciAmJiBjaGFuLT5pbm5lcl9sb2wpCisJCSpzdGF0dXNfZXJyb3IgPSBEUExMX0xP Q0tfU1RBVFVTX0VSUk9SX1VOREVGSU5FRDsKKworCW11dGV4X3VubG9jaygmc2l0ZGV2LT5tdWx0 aW9wX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzaXQ5NTMxeF9kcGxsX21vZGVf Z2V0IC0gcmVwb3J0IGN1cnJlbnQgUExMIG9wZXJhdGluZyBtb2RlCisgKgorICogcmVhZHMgb3V0 ZXIgbG9vcCBkaXNhYmxlIGJpdCAoUExMIHBhZ2UgcmVnIDB4MzFbNV0pLgorICogRnJlZS1ydW4g LT4gTUFOVUFMLCBzeW5jIC0+IEFVVE9NQVRJQy4KKyAqLworc3RhdGljIGludAorc2l0OTUzMXhf ZHBsbF9tb2RlX2dldChjb25zdCBzdHJ1Y3QgZHBsbF9kZXZpY2UgKmRwbGwsIHZvaWQgKmRwbGxf cHJpdiwKKwkJICAgICAgIGVudW0gZHBsbF9tb2RlICptb2RlLCBzdHJ1Y3QgbmV0bGlua19leHRf YWNrICpleHRhY2spCit7CisJc3RydWN0IHNpdDk1MzF4X2RwbGwgKnNpdGRwbGwgPSBkcGxsX3By aXY7CisJc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2ID0gc2l0ZHBsbC0+ZGV2OworCWNvbnN0 IHN0cnVjdCBzaXQ5NTMxeF9jaGFuICpjaGFuOworCisJY2hhbiA9IHNpdDk1MzF4X2NoYW5fc3Rh dGVfZ2V0KHNpdGRldiwgc2l0ZHBsbC0+aWQpOworCisJbXV0ZXhfbG9jaygmc2l0ZGV2LT5tdWx0 aW9wX2xvY2spOworCSptb2RlID0gY2hhbi0+bW9kZSA/IERQTExfTU9ERV9NQU5VQUwgOiBEUExM X01PREVfQVVUT01BVElDOworCW11dGV4X3VubG9jaygmc2l0ZGV2LT5tdWx0aW9wX2xvY2spOwor CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzaXQ5NTMxeF9kcGxsX21vZGVfc2V0IC0gc3dpdGNo IFBMTCBiZXR3ZWVuIGZyZWUtcnVuIGFuZCBzeW5jIG1vZGUKKyAqCisgKiB3cml0ZXMgUExMIHBh Z2UgcmVnIDB4MzFbNV0gdG8gZW5hYmxlL2Rpc2FibGUgdGhlCisgKiBvdXRlciBsb29wLCB0aGVu IHRyaWdnZXJzIGEgc21hbGwgdXBkYXRlIHZpYSByZWcgMHgwRi4KKyAqCisgKiBUaGUgZHJpdmVy IG1hcHMgQVVUT01BVElDIHRvIHN5bmMgbW9kZSAob3V0ZXIgbG9vcCBlbmFibGVkOyB0aGUgUExM CisgKiBzZWxlY3RzIGl0cyByZWZlcmVuY2UgYXV0b21hdGljYWxseSBmcm9tIHRoZSBwcmlvcml0 eSB0YWJsZSkgYW5kCisgKiBNQU5VQUwgdG8gZnJlZS1ydW4gKG91dGVyIGxvb3AgZGlzYWJsZWQg dmlhIGJpdCAweDMxWzVdKS4gVGhlIGNoaXAKKyAqIGFsc28gaGFzIGEgc2VwYXJhdGUgbWFudWFs LWFjdGl2ZS1zZWxlY3QgcGF0aCAoTUFOVUFMX0FDVElWRV9TRUxfUExMCisgKiBwbHVzIHRoZSBw ZXItUExMIG1hbl9pbl9zZWwgcmVnaXN0ZXJzKSB0aGF0IGNhbiBwaW4gb25lIHJlZmVyZW5jZQor ICogd2hpbGUgc3RpbGwgc3luY2luZzsgdGhhdCBwYXRoIGlzIG5vdCB3aXJlZCB0byBhIERQTEwg Y2FsbGJhY2sgaGVyZS4KKyAqLworc3RhdGljIGludAorc2l0OTUzMXhfZHBsbF9tb2RlX3NldChj b25zdCBzdHJ1Y3QgZHBsbF9kZXZpY2UgKmRwbGwsIHZvaWQgKmRwbGxfcHJpdiwKKwkJICAgICAg IGVudW0gZHBsbF9tb2RlIG1vZGUsIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKK3sK KwlzdHJ1Y3Qgc2l0OTUzMXhfZHBsbCAqc2l0ZHBsbCA9IGRwbGxfcHJpdjsKKwlzdHJ1Y3Qgc2l0 OTUzMXhfZGV2ICpzaXRkZXYgPSBzaXRkcGxsLT5kZXY7CisJdTggdmFsOworCWludCByYzsKKwor CS8qCisJICogT3V0ZXIgbG9vcCBkaXNhYmxlIGJpdDoKKwkgKiAgIDAgPSBzeW5jIG1vZGUgKG91 dGVyIGxvb3AgZW5hYmxlZCkgIC0+IEFVVE9NQVRJQworCSAqICAgMSA9IGZyZWUtcnVuIChvdXRl ciBsb29wIGRpc2FibGVkKSAgLT4gTUFOVUFMCisJICovCisJdmFsID0gKG1vZGUgPT0gRFBMTF9N T0RFX01BTlVBTCkgPyBTSVQ5NTMxWF9QTExfU1RBVFVTX09VVEVSX0RJUyA6IDA7CisKKwltdXRl eF9sb2NrKCZzaXRkZXYtPm11bHRpb3BfbG9jayk7CisKKwlyYyA9IHNpdDk1MzF4X3VwZGF0ZV9w bGxfdTgoc2l0ZGV2LCBzaXRkcGxsLT5pZCwKKwkJCQkgICAgU0lUOTUzMVhfUExMX1JFR19TVEFU VVMsCisJCQkJICAgIFNJVDk1MzFYX1BMTF9TVEFUVVNfT1VURVJfRElTLCB2YWwpOworCWlmIChy YykgeworCQlOTF9TRVRfRVJSX01TRyhleHRhY2ssICJGYWlsZWQgdG8gd3JpdGUgUExMIG1vZGUg cmVnaXN0ZXIiKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJLyogVHJpZ2dlciBzbWFsbCB1cGRh dGUgdG8gYXBwbHkgd2l0aG91dCBmdWxsIE5WTSBjeWNsZSAqLworCXJjID0gc2l0OTUzMXhfd3Jp dGVfcGxsX3U4KHNpdGRldiwgc2l0ZHBsbC0+aWQsCisJCQkJICAgU0lUOTUzMVhfUExMX1JFR19T TUFMTF9VUERBVEUsCisJCQkJICAgU0lUOTUzMVhfU01BTExfVVBEQVRFX0NNRCk7CisJaWYgKHJj KSB7CisJCU5MX1NFVF9FUlJfTVNHKGV4dGFjaywgIkZhaWxlZCB0byB0cmlnZ2VyIHNtYWxsIHVw ZGF0ZSIpOworCQlnb3RvIHVubG9jazsKKwl9CisKKwkvKgorCSAqIEtlZXAgdGhlIGNhY2hlZCBt b2RlIGluIHN0ZXAgd2l0aCB0aGUgcmVnaXN0ZXIuICBUaGUgcGVyaW9kaWMKKwkgKiBtb25pdG9y IHJlZnJlc2hlcyBpdCB0b28sIGJ1dCBtb2RlX2dldCBhbmQgdGhlIHJlZmVyZW5jZS1zZWxlY3Rp b24KKwkgKiBwYXRoIHJlYWQgdGhpcyBjYWNoZSBhbmQgd291bGQgb3RoZXJ3aXNlIHJlcG9ydCBv ciBhY3Qgb24gdGhlCisJICogcHJlLXN3aXRjaCBtb2RlIHVudGlsIHRoZSBuZXh0IHBvbGwuCisJ ICovCisJc2l0ZGV2LT5jaGFuW3NpdGRwbGwtPmlkXS5tb2RlID0gISF2YWw7CisKK3VubG9jazoK KwltdXRleF91bmxvY2soJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsKKworCXJldHVybiByYzsKK30K Kworc3RhdGljIGludAorc2l0OTUzMXhfZHBsbF9zdXBwb3J0ZWRfbW9kZXNfZ2V0KGNvbnN0IHN0 cnVjdCBkcGxsX2RldmljZSAqZHBsbCwKKwkJCQkgIHZvaWQgKmRwbGxfcHJpdiwgdW5zaWduZWQg bG9uZyAqbW9kZXMsCisJCQkJICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCit7CisJ X19zZXRfYml0KERQTExfTU9ERV9BVVRPTUFUSUMsIG1vZGVzKTsKKwlfX3NldF9iaXQoRFBMTF9N T0RFX01BTlVBTCwgbW9kZXMpOworCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBkcGxs X2RldmljZV9vcHMgc2l0OTUzMXhfZHBsbF9kZXZpY2Vfb3BzID0geworCS5sb2NrX3N0YXR1c19n ZXQJPSBzaXQ5NTMxeF9kcGxsX2xvY2tfc3RhdHVzX2dldCwKKwkubW9kZV9nZXQJCT0gc2l0OTUz MXhfZHBsbF9tb2RlX2dldCwKKwkubW9kZV9zZXQJCT0gc2l0OTUzMXhfZHBsbF9tb2RlX3NldCwK Kwkuc3VwcG9ydGVkX21vZGVzX2dldAk9IHNpdDk1MzF4X2RwbGxfc3VwcG9ydGVkX21vZGVzX2dl dCwKKwkvKiB0ZW1wX2dldCBub3QgYXZhaWxhYmxlIC0tIFNpVDk1MzF4IGhhcyBubyBvbi1kaWUg dGVtcCBzZW5zb3IgKi8KK307CisKK3N0YXRpYyBpbnQKK3NpdDk1MzF4X2RwbGxfaW5wdXRfcGlu X2RpcmVjdGlvbl9nZXQoY29uc3Qgc3RydWN0IGRwbGxfcGluICpwaW4sCisJCQkJICAgICAgdm9p ZCAqcGluX3ByaXYsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGRwbGxfZGV2aWNlICpkcGxsLAor CQkJCSAgICAgIHZvaWQgKmRwbGxfcHJpdiwKKwkJCQkgICAgICBlbnVtIGRwbGxfcGluX2RpcmVj dGlvbiAqZGlyZWN0aW9uLAorCQkJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFj aykKK3sKKwkqZGlyZWN0aW9uID0gRFBMTF9QSU5fRElSRUNUSU9OX0lOUFVUOworCXJldHVybiAw OworfQorCisvKgorICogc2l0OTUzMXhfZHBsbF9pbnB1dF9waW5fZnJlcXVlbmN5X2dldCAtIHJl YWQgaW5wdXQgcGluIGZyZXF1ZW5jeQorICoKKyAqIHJldHVybnMgY2FjaGVkIGZyZXF1ZW5jeSBm cm9tIERUIG9yIGxhc3Qgc2V0LgorICovCitzdGF0aWMgaW50CitzaXQ5NTMxeF9kcGxsX2lucHV0 X3Bpbl9mcmVxdWVuY3lfZ2V0KGNvbnN0IHN0cnVjdCBkcGxsX3BpbiAqcGluLAorCQkJCSAgICAg IHZvaWQgKnBpbl9wcml2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBkcGxsX2RldmljZSAqZHBs bCwKKwkJCQkgICAgICB2b2lkICpkcGxsX3ByaXYsIHU2NCAqZnJlcXVlbmN5LAorCQkJCSAgICAg IHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKK3sKKwlzdHJ1Y3Qgc2l0OTUzMXhfZHBs bF9waW4gKmRwaW4gPSBwaW5fcHJpdjsKKwlzdHJ1Y3Qgc2l0OTUzMXhfZHBsbCAqc2l0ZHBsbCA9 IGRwbGxfcHJpdjsKKwljb25zdCBzdHJ1Y3Qgc2l0OTUzMXhfcmVmICpyZWY7CisKKwlyZWYgPSBz aXQ5NTMxeF9yZWZfc3RhdGVfZ2V0KHNpdGRwbGwtPmRldiwgZHBpbi0+aWQpOworCSpmcmVxdWVu Y3kgPSByZWYtPmZyZXE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNpdDk1MzF4X2RwbGxf aW5wdXRfcGluX3N0YXRlX29uX2RwbGxfZ2V0IC0gZ2V0IGlucHV0IHBpbiBEUExMIHN0YXRlCisg KgorICogZGV0ZXJtaW5lcyBwaW4gc3RhdGUgZnJvbSBjaGFubmVsIHN0YXRlOiBjb25uZWN0ZWQK KyAqIGlmIHRoaXMgaW5wdXQgaXMgdGhlIHNlbGVjdGVkIHJlZmVyZW5jZSBvbiBhIGxvY2tlZCBQ TEwsIHNlbGVjdGFibGUKKyAqIGlmIGVuYWJsZWQgaW4gYXV0b21hdGljIG1vZGUsIGRpc2Nvbm5l Y3RlZCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQKK3NpdDk1MzF4X2RwbGxfaW5wdXRfcGlu X3N0YXRlX29uX2RwbGxfZ2V0KGNvbnN0IHN0cnVjdCBkcGxsX3BpbiAqcGluLAorCQkJCQkgIHZv aWQgKnBpbl9wcml2LAorCQkJCQkgIGNvbnN0IHN0cnVjdCBkcGxsX2RldmljZSAqZHBsbCwKKwkJ CQkJICB2b2lkICpkcGxsX3ByaXYsCisJCQkJCSAgZW51bSBkcGxsX3Bpbl9zdGF0ZSAqc3RhdGUs CisJCQkJCSAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQoreworCXN0cnVjdCBzaXQ5 NTMxeF9kcGxsX3BpbiAqZHBpbiA9IHBpbl9wcml2OworCXN0cnVjdCBzaXQ5NTMxeF9kcGxsICpz aXRkcGxsID0gZHBsbF9wcml2OworCXN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiA9IHNpdGRw bGwtPmRldjsKKwljb25zdCBzdHJ1Y3Qgc2l0OTUzMXhfY2hhbiAqY2hhbjsKKwljb25zdCBzdHJ1 Y3Qgc2l0OTUzMXhfcmVmICpyZWY7CisKKwljaGFuID0gc2l0OTUzMXhfY2hhbl9zdGF0ZV9nZXQo c2l0ZGV2LCBzaXRkcGxsLT5pZCk7CisJcmVmID0gc2l0OTUzMXhfcmVmX3N0YXRlX2dldChzaXRk ZXYsIGRwaW4tPmlkKTsKKworCW11dGV4X2xvY2soJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsKKwor CS8qCisJICogUmVwb3J0IENPTk5FQ1RFRCBvbmx5IHdoZW4gdGhlIFBMTCBpcyBnZW51aW5lbHkg bG9ja2VkIHRvIHRoaXMKKwkgKiBpbnB1dC4gIGNoYW4tPmxvY2tlZCBhbHJlYWR5IGV4Y2x1ZGVz IGEgUExMIHRoZSBjb25maWd1cmF0aW9uCisJICogbGVhdmVzIHVudXNlZCwgd2hpY2ggd291bGQg b3RoZXJ3aXNlIGNsYWltIGl0cyBkZWZhdWx0IHNvdXJjZSBhcworCSAqIGNvbm5lY3RlZCByaWdo dCBhZnRlciBwcm9iZTsgdGhlIGlubmVyIGxvb3AgaGFzIHRvIGJlIGxvY2tlZCBhcworCSAqIHdl bGwgYmVmb3JlIHRoZSByZWZlcmVuY2UgY2FuIGJlIGNhbGxlZCBjb25uZWN0ZWQuCisJICovCisJ aWYgKGNoYW4tPmxvY2tlZCAmJiAhY2hhbi0+aW5uZXJfbG9sICYmCisJICAgIGNoYW4tPnNlbGVj dGVkX3JlZiA9PSBkcGluLT5pZCkKKwkJKnN0YXRlID0gRFBMTF9QSU5fU1RBVEVfQ09OTkVDVEVE OworCS8qCisJICogU2VsZWN0YWJsZSBtZWFucyB0aGlzIERQTEwgbWF5IGNob29zZSB0aGUgaW5w dXQsIHNvIGl0IGhhcyB0byBiZQorCSAqIGluIHRoaXMgRFBMTCdzIHByaW9yaXR5IHRhYmxlIC0t IHJlZi0+ZW5hYmxlZCBvbmx5IHNheXMgdGhlCisJICogcmVjZWl2ZXIgaXMgcG93ZXJlZCwgd2hp Y2ggaXMgc2hhcmVkIGJ5IGV2ZXJ5IERQTEwgZmVkIGZyb20gdGhlCisJICogc2FtZSBsYW5lLiAg U2lnbmFsIHF1YWxpdHkgaXMgcmVwb3J0ZWQgdGhyb3VnaCB0aGUgcGluJ3Mgb3duCisJICogYXR0 cmlidXRlcyByYXRoZXIgdGhhbiBieSBkZW1vdGluZyB0aGUgc3RhdGUsIHNvIGEgbGFuZSB0aGF0 IGlzCisJICogcm91dGVkIGhlcmUgYnV0IG1vbWVudGFyaWx5IGluIExPUyBzdGF5cyBzZWxlY3Rh YmxlLgorCSAqLworCWVsc2UgaWYgKCFjaGFuLT5tb2RlICYmIChyZWYtPnBsbF9tYXNrICYgQklU KHNpdGRwbGwtPmlkKSkpCisJCSpzdGF0ZSA9IERQTExfUElOX1NUQVRFX1NFTEVDVEFCTEU7CisJ ZWxzZQorCQkqc3RhdGUgPSBEUExMX1BJTl9TVEFURV9ESVNDT05ORUNURUQ7CisKKwltdXRleF91 bmxvY2soJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICog c2l0OTUzMXhfZHBsbF9pbnB1dF9waW5fc3RhdGVfb25fZHBsbF9zZXQgLSBzZXQgaW5wdXQgcGlu IERQTEwgc3RhdGUKKyAqCisgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBwaHlzaWNhbCBpbnB1 dCByZWNlaXZlciB2aWEgUGFnZSAweDAyCisgKiBmb3JjZS9zdGF0ZSByZWdpc3RlcnMgKHNpdDk1 MzF4X2lucHV0X2Rpc2FibGUvZW5hYmxlKCkpIGFuZCB1cGRhdGVzCisgKiB0aGlzIERQTEwncyBQ YWdlIDEgcHJpb3JpdHkgdGFibGUgc28gdGhlIHN0YXRlIGlzIGhvbm91cmVkIGJ5IHRoZQorICog UExMJ3MgYXV0b21hdGljIHJlZmVyZW5jZSBzZWxlY3Rpb24sIG5vdCBqdXN0IGF0IHRoZSBpbnB1 dCBidWZmZXIuCisgKiAgIERJU0NPTk5FQ1RFRCAtPiBkcm9wIHRoZSBpbnB1dCBmcm9tIHRoaXMg RFBMTCdzIHByaW9yaXR5IHRhYmxlIGFuZAorICogICAgICAgICAgICAgICAgICByZWxlYXNlIHRo aXMgRFBMTCdzIGNsYWltIG9uIHRoZSBpbnB1dAorICogICBTRUxFQ1RBQkxFICAgLT4gY2xhaW0g dGhlIGlucHV0IGZvciB0aGlzIERQTEwgYW5kIG1ha2UgaXQgZWxpZ2libGUKKyAqICAgICAgICAg ICAgICAgICAgYWdhaW4gaW4gdGhlIHByaW9yaXR5IHRhYmxlCisgKiAgIENPTk5FQ1RFRCAgICAt PiBzYW1lIGFzIFNFTEVDVEFCTEUgKHRoZSBQTEwgYXV0by1zd2l0Y2ggbG9naWMgZG9lcworICog ICAgICAgICAgICAgICAgICB0aGUgYWN0dWFsIHNlbGVjdGlvbikKKyAqCisgKiBUaGUgcHJpb3Jp dHkgdGFibGUgaXMgcGVyIFBMTCwgc28gaXQgaXMgYWx3YXlzIHVwZGF0ZWQgZm9yIHRoaXMgRFBM TC4KKyAqIEEgc2luZ2xlIHBoeXNpY2FsIGlucHV0IGZlZWRzIGV2ZXJ5IERQTEwsIHNvIHRoZSBo YXJkd2FyZSByZWNlaXZlciBpcworICogb25seSBjdXQgb2ZmIG9uY2UgdGhlIGxhc3QgRFBMTCBo YXMgcmVsZWFzZWQgaXQ6IHJlZi0+cGxsX21hc2sgdHJhY2tzCisgKiB3aGljaCBEUExMcyBjdXJy ZW50bHkgY2xhaW0gdGhlIGlucHV0LCBhbmQgdGhlIHBoeXNpY2FsIGRpc2FibGUKKyAqIGhhcHBl bnMgb24gdGhlIHRyYW5zaXRpb24gdG8gYW4gZW1wdHkgbWFzay4KKyAqLworc3RhdGljIGludAor c2l0OTUzMXhfZHBsbF9pbnB1dF9waW5fc3RhdGVfb25fZHBsbF9zZXQoY29uc3Qgc3RydWN0IGRw bGxfcGluICpwaW4sCisJCQkJCSAgdm9pZCAqcGluX3ByaXYsCisJCQkJCSAgY29uc3Qgc3RydWN0 IGRwbGxfZGV2aWNlICpkcGxsLAorCQkJCQkgIHZvaWQgKmRwbGxfcHJpdiwKKwkJCQkJICBlbnVt IGRwbGxfcGluX3N0YXRlIHN0YXRlLAorCQkJCQkgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4 dGFjaykKK3sKKwlzdHJ1Y3Qgc2l0OTUzMXhfZHBsbF9waW4gKmRwaW4gPSBwaW5fcHJpdjsKKwlz dHJ1Y3Qgc2l0OTUzMXhfZHBsbCAqc2l0ZHBsbCA9IGRwbGxfcHJpdjsKKwlzdHJ1Y3Qgc2l0OTUz MXhfZGV2ICpzaXRkZXYgPSBzaXRkcGxsLT5kZXY7CisJc3RydWN0IHNpdDk1MzF4X3JlZiAqcmVm ID0gJnNpdGRldi0+cmVmW2RwaW4tPmlkXTsKKwl1OCBod19zcmMgPSBzaXQ5NTMxeF9pbnB1dF9o d19zcmMoZHBpbi0+aWQpOworCXU4IHBsbF9iaXQgPSBCSVQoc2l0ZHBsbC0+aWQpOworCWludCBy YzsKKworCW11dGV4X2xvY2soJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsKKworCXN3aXRjaCAoc3Rh dGUpIHsKKwljYXNlIERQTExfUElOX1NUQVRFX0RJU0NPTk5FQ1RFRDoKKwkJcmMgPSBzaXQ5NTMx eF9pbnB1dF9wcmlvX3JlbW92ZShzaXRkZXYsIHNpdGRwbGwtPmlkLCBod19zcmMpOworCQlpZiAo cmMpCisJCQlicmVhazsKKwkJcmVmLT5wbGxfbWFzayAmPSB+cGxsX2JpdDsKKwkJaWYgKHJlZi0+ cGxsX21hc2spCisJCQlyYyA9IDA7CS8qIGFub3RoZXIgRFBMTCBzdGlsbCB1c2VzIHRoaXMgaW5w dXQgKi8KKwkJZWxzZQorCQkJcmMgPSBzaXQ5NTMxeF9pbnB1dF9kaXNhYmxlKHNpdGRldiwgZHBp bi0+aWQpOworCQlicmVhazsKKwljYXNlIERQTExfUElOX1NUQVRFX0NPTk5FQ1RFRDoKKwkJLyoK KwkJICogQ09OTkVDVEVEIGFza3MgZm9yIHRoaXMgaW5wdXQgYW5kIG5vIG90aGVyLiAgVGhlIGNo aXAgaGFzCisJCSAqIG5vIHN1Y2ggbW9kZTogTUFOVUFMIGRpc2FibGVzIHRoZSBvdXRlciBsb29w IHJhdGhlciB0aGFuCisJCSAqIHBpbm5pbmcgYSByZWZlcmVuY2UsIHNvIGhvbm91cmluZyB0aGUg cmVxdWVzdCB3b3VsZCBtZWFuCisJCSAqIGVtcHR5aW5nIHRoZSBwcmlvcml0eSB0YWJsZSBvZiBl dmVyeSBvdGhlciBzb3VyY2UsIHdoaWNoCisJCSAqIGlzIG5vdCB3aGF0IHRoZSBjYWxsZXIgYXNr ZWQgZm9yLiAgUmVmdXNlIGluc3RlYWQgb2YKKwkJICogcXVpZXRseSBiZWhhdmluZyBsaWtlIFNF TEVDVEFCTEUuCisJCSAqLworCQlOTF9TRVRfRVJSX01TRyhleHRhY2ssCisJCQkgICAgICAgIkRl dmljZSBzZWxlY3RzIGl0cyByZWZlcmVuY2UgYnkgcHJpb3JpdHk7IHVzZSBzZWxlY3RhYmxlIik7 CisJCXJjID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCWNhc2UgRFBMTF9QSU5fU1RBVEVfU0VM RUNUQUJMRToKKwkJcmMgPSBzaXQ5NTMxeF9pbnB1dF9lbmFibGUoc2l0ZGV2LCBkcGluLT5pZCk7 CisJCWlmIChyYykKKwkJCWJyZWFrOworCQlyYyA9IHNpdDk1MzF4X2lucHV0X3ByaW9fYWRkKHNp dGRldiwgc2l0ZHBsbC0+aWQsIGh3X3NyYyk7CisJCWlmIChyYykKKwkJCWJyZWFrOworCQkvKgor CQkgKiBDbGFpbSB0aGUgaW5wdXQgZm9yIHRoaXMgRFBMTCBvbmx5IG9uY2UgaXQgaXMgYm90aCBl bmFibGVkCisJCSAqIGFuZCBwcmVzZW50IGluIHRoZSBwcmlvcml0eSB0YWJsZS4gIFNldHRpbmcg dGhlIG1hc2sgYmVmb3JlCisJCSAqIHByaW9fYWRkIHdvdWxkIGxlYWsgdGhlIGNsYWltIGlmIHBy aW9fYWRkIGZhaWxlZCwga2VlcGluZyB0aGUKKwkJICogc2hhcmVkIGlucHV0IHJlY2VpdmVyIHBv d2VyZWQgZXZlbiBhZnRlciBldmVyeSBEUExMIHJlbGVhc2VkCisJCSAqIGl0LgorCQkgKi8KKwkJ cmVmLT5wbGxfbWFzayB8PSBwbGxfYml0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1F SU5WQUw7CisJCWJyZWFrOworCX0KKworCW11dGV4X3VubG9jaygmc2l0ZGV2LT5tdWx0aW9wX2xv Y2spOworCisJaWYgKHJjKQorCQlOTF9TRVRfRVJSX01TRyhleHRhY2ssICJGYWlsZWQgdG8gc2V0 IGlucHV0IHBpbiBzdGF0ZSIpOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogc2l0OTUzMXhf ZHBsbF9pbnB1dF9waW5fcHJpb19nZXQgLSByZWFkIGlucHV0IHBpbiBwcmlvcml0eQorICoKKyAq IHJlYWRzIHRoZSBQTEwncyBwcmlvcml0eSB0YWJsZSBvbiBQYWdlIDEgKHZpYQorICogc2l0OTUz MXhfaW5wdXRfcHJpb19nZXQoKSkgYW5kIHJldHVybnMgdGhlIHNsb3QgdGhlIGlucHV0CisgKiBv Y2N1cGllcywgc28gcGluLWdldCByZXBvcnRzIHRoZSByZWFsIGhhcmR3YXJlIHByaW9yaXR5IHJh dGhlcgorICogdGhhbiBhIHNvZnR3YXJlIGRlZmF1bHQuCisgKi8KK3N0YXRpYyBpbnQKK3NpdDk1 MzF4X2RwbGxfaW5wdXRfcGluX3ByaW9fZ2V0KGNvbnN0IHN0cnVjdCBkcGxsX3BpbiAqcGluLCB2 b2lkICpwaW5fcHJpdiwKKwkJCQkgY29uc3Qgc3RydWN0IGRwbGxfZGV2aWNlICpkcGxsLCB2b2lk ICpkcGxsX3ByaXYsCisJCQkJIHUzMiAqcHJpbywgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0 YWNrKQoreworCXN0cnVjdCBzaXQ5NTMxeF9kcGxsX3BpbiAqZHBpbiA9IHBpbl9wcml2OworCXN0 cnVjdCBzaXQ5NTMxeF9kcGxsICpzaXRkcGxsID0gZHBsbF9wcml2OworCXN0cnVjdCBzaXQ5NTMx eF9kZXYgKnNpdGRldiA9IHNpdGRwbGwtPmRldjsKKwl1OCBzbG90OworCWludCByYzsKKworCW11 dGV4X2xvY2soJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsKKwlyYyA9IHNpdDk1MzF4X2lucHV0X3By aW9fZ2V0KHNpdGRldiwgc2l0ZHBsbC0+aWQsCisJCQkJICAgICBzaXQ5NTMxeF9pbnB1dF9od19z cmMoZHBpbi0+aWQpLCAmc2xvdCk7CisJbXV0ZXhfdW5sb2NrKCZzaXRkZXYtPm11bHRpb3BfbG9j ayk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlkcGluLT5wcmlvID0gc2xvdDsKKwkqcHJp byA9IHNsb3Q7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzaXQ5NTMxeF9kcGxsX2lucHV0X3Bp bl9wcmlvX3NldCAtIHNldCBpbnB1dCBwaW4gcHJpb3JpdHkKKyAqCisgKiB3cml0ZXMgaW5wdXQg cHJpb3JpdHkgdGFibGUgb24gUGFnZSAxIHZpYQorICogY29yZS5jIHNpdDk1MzF4X2lucHV0X3By aW9fc2V0KCkuICBGb3JjZXMgaG9sZG92ZXIgZHVyaW5nIHVwZGF0ZS4KKyAqLworc3RhdGljIGlu dAorc2l0OTUzMXhfZHBsbF9pbnB1dF9waW5fcHJpb19zZXQoY29uc3Qgc3RydWN0IGRwbGxfcGlu ICpwaW4sIHZvaWQgKnBpbl9wcml2LAorCQkJCSBjb25zdCBzdHJ1Y3QgZHBsbF9kZXZpY2UgKmRw bGwsIHZvaWQgKmRwbGxfcHJpdiwKKwkJCQkgdTMyIHByaW8sIHN0cnVjdCBuZXRsaW5rX2V4dF9h Y2sgKmV4dGFjaykKK3sKKwlzdHJ1Y3Qgc2l0OTUzMXhfZHBsbF9waW4gKmRwaW4gPSBwaW5fcHJp djsKKwlzdHJ1Y3Qgc2l0OTUzMXhfZHBsbCAqc2l0ZHBsbCA9IGRwbGxfcHJpdjsKKwlzdHJ1Y3Qg c2l0OTUzMXhfZGV2ICpzaXRkZXYgPSBzaXRkcGxsLT5kZXY7CisJaW50IHJjOworCisJaWYgKGRw aW4tPmRpciAhPSBEUExMX1BJTl9ESVJFQ1RJT05fSU5QVVQpIHsKKwkJTkxfU0VUX0VSUl9NU0co ZXh0YWNrLCAiUHJpb3JpdHkgYXBwbGllcyBvbmx5IHRvIGlucHV0IHBpbnMiKTsKKwkJcmV0dXJu IC1FSU5WQUw7CisJfQorCisJaWYgKHByaW8gPj0gU0lUOTUzMVhfUFJJT19NQVhfU0xPVFMpIHsK KwkJTkxfU0VUX0VSUl9NU0coZXh0YWNrLCAiUHJpb3JpdHkgb3V0IG9mIHJhbmdlICgwLTEwKSIp OworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZzaXRkZXYtPm11bHRpb3Bf bG9jayk7CisJcmMgPSBzaXQ5NTMxeF9pbnB1dF9wcmlvX3NldChzaXRkZXYsIHNpdGRwbGwtPmlk LAorCQkJCSAgICAgc2l0OTUzMXhfaW5wdXRfaHdfc3JjKGRwaW4tPmlkKSwKKwkJCQkgICAgICh1 OClwcmlvKTsKKwltdXRleF91bmxvY2soJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsKKworCWlmIChy YykgeworCQlOTF9TRVRfRVJSX01TRyhleHRhY2ssICJGYWlsZWQgdG8gc2V0IGlucHV0IHByaW9y aXR5Iik7CisJCXJldHVybiByYzsKKwl9CisKKwlkcGluLT5wcmlvID0gKHU4KXByaW87CisKKwly ZXR1cm4gMDsKK30KKworLyoKKyAqIHNpdDk1MzF4X2RwbGxfaW5wdXRfcGluX3BoYXNlX2FkanVz dF9nZXQgLSByZWFkIHBoYXNlIGFkanVzdG1lbnQKKyAqCisgKiByZXR1cm5zIGNhY2hlZCBwaGFz ZSBhZGp1c3RtZW50IHZhbHVlIChpbiBwcykuCisgKi8KK3N0YXRpYyBpbnQKK3NpdDk1MzF4X2Rw bGxfaW5wdXRfcGluX3BoYXNlX2FkanVzdF9nZXQoY29uc3Qgc3RydWN0IGRwbGxfcGluICpwaW4s CisJCQkJCSB2b2lkICpwaW5fcHJpdiwKKwkJCQkJIGNvbnN0IHN0cnVjdCBkcGxsX2RldmljZSAq ZHBsbCwKKwkJCQkJIHZvaWQgKmRwbGxfcHJpdiwgczMyICpwaGFzZV9hZGp1c3QsCisJCQkJCSBz dHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCit7CisJc3RydWN0IHNpdDk1MzF4X2RwbGxf cGluICpkcGluID0gcGluX3ByaXY7CisKKwkqcGhhc2VfYWRqdXN0ID0gZHBpbi0+cGhhc2VfYWRq dXN0OworCXJldHVybiAwOworfQorCisvKgorICogc2l0OTUzMXhfZHBsbF9pbnB1dF9waW5fcGhh c2Vfb2Zmc2V0X2dldCAtIHJlYWQgcGhhc2Ugb2Zmc2V0CisgKgorICogcmVhZHMgdGhlIFREQyAo VGltZS10by1EaWdpdGFsIENvbnZlcnRlcikgaGFyZHdhcmUKKyAqIHRvIG1lYXN1cmUgdGhlIHBo YXNlIGRpZmZlcmVuY2UgaW4gcGljb3NlY29uZHMgdmlhCisgKiBzaXQ5NTMxeF9waGFzZV9vZmZz ZXRfcmVhZCgpLgorICovCisvKgorICogc2l0OTUzMXhfZHBsbF9pbnB1dF9waW5fZmZvX2dldCAt IHJlYWQgdGhlIGlucHV0J3MgZnJlcXVlbmN5IG9mZnNldAorICoKKyAqIFRoZSBvZmZzZXQgaXMg ZGVyaXZlZCBmcm9tIGhvdyBmYXIgdGhlIFBMTCdzIHJ1bm5pbmcgRElWTiBzaXRzIGZyb20KKyAq IGl0cyBjb25maWd1cmVkIG9uZSwgd2hpY2ggb25seSBzYXlzIHNvbWV0aGluZyBhYm91dCB0aGUg cmVmZXJlbmNlIHRoZQorICogUExMIGlzIGFjdHVhbGx5IHRyYWNraW5nLiAgRm9yIGV2ZXJ5IG90 aGVyIGlucHV0IHRoZXJlIGlzIG5vCisgKiBtZWFzdXJlbWVudCwgYW5kIC1FTk9EQVRBIGxlYXZl cyB0aGUgYXR0cmlidXRlIG91dCByYXRoZXIgdGhhbgorICogcmVwb3J0aW5nIHRoZSBhY3RpdmUg cmVmZXJlbmNlJ3MgZmlndXJlIGFnYWluc3QgdGhlIHdyb25nIHBpbi4KKyAqLworc3RhdGljIGlu dAorc2l0OTUzMXhfZHBsbF9pbnB1dF9waW5fZmZvX2dldChjb25zdCBzdHJ1Y3QgZHBsbF9waW4g KnBpbiwgdm9pZCAqcGluX3ByaXYsCisJCQkJY29uc3Qgc3RydWN0IGRwbGxfZGV2aWNlICpkcGxs LCB2b2lkICpkcGxsX3ByaXYsCisJCQkJc3RydWN0IGRwbGxfZmZvX3BhcmFtICpmZm8sCisJCQkJ c3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQoreworCXN0cnVjdCBzaXQ5NTMxeF9kcGxs X3BpbiAqZHBpbiA9IHBpbl9wcml2OworCXN0cnVjdCBzaXQ5NTMxeF9kcGxsICpzaXRkcGxsID0g ZHBsbF9wcml2OworCXN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiA9IHNpdGRwbGwtPmRldjsK KwlpbnQgcmM7CisKKwlpZiAoc2l0ZGV2LT5jaGFuW3NpdGRwbGwtPmlkXS5zZWxlY3RlZF9yZWYg IT0gZHBpbi0+aWQpCisJCXJldHVybiAtRU5PREFUQTsKKworCW11dGV4X2xvY2soJnNpdGRldi0+ bXVsdGlvcF9sb2NrKTsKKwlyYyA9IHNpdDk1MzF4X3BsbF9mZm9fcHB0KHNpdGRldiwgc2l0ZHBs bC0+aWQsICZmZm8tPmZmbyk7CisJbXV0ZXhfdW5sb2NrKCZzaXRkZXYtPm11bHRpb3BfbG9jayk7 CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK3NpdDk1MzF4X2RwbGxfaW5wdXRfcGlu X3BoYXNlX29mZnNldF9nZXQoY29uc3Qgc3RydWN0IGRwbGxfcGluICpwaW4sCisJCQkJCSB2b2lk ICpwaW5fcHJpdiwKKwkJCQkJIGNvbnN0IHN0cnVjdCBkcGxsX2RldmljZSAqZHBsbCwKKwkJCQkJ IHZvaWQgKmRwbGxfcHJpdiwgczY0ICpwaGFzZV9vZmZzZXQsCisJCQkJCSBzdHJ1Y3QgbmV0bGlu a19leHRfYWNrICpleHRhY2spCit7CisJc3RydWN0IHNpdDk1MzF4X2RwbGxfcGluICpkcGluID0g cGluX3ByaXY7CisJc3RydWN0IHNpdDk1MzF4X2RwbGwgKnNpdGRwbGwgPSBkcGxsX3ByaXY7CisJ c3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2ID0gc2l0ZHBsbC0+ZGV2OworCXM2NCBvZmZzZXQ7 CisJaW50IHJjOworCisJbXV0ZXhfbG9jaygmc2l0ZGV2LT5tdWx0aW9wX2xvY2spOworCisJLyoK KwkgKiBUaGUgb24tY2hpcCBUREMgaXMgYSBwZXItUExMIHJlc291cmNlIHRoYXQgYWx3YXlzIG1l YXN1cmVzIHRoZQorCSAqIHBoYXNlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgVkNPIGFuZCB0aGUg UExMJ3MgY3VycmVudGx5CisJICogc2VsZWN0ZWQgcmVmZXJlbmNlOyBpdCBjYW5ub3QgYmUgcG9p bnRlZCBhdCBhbiBhcmJpdHJhcnkgaW5wdXQuCisJICogRm9yIGFueSBpbnB1dCB0aGF0IGlzIG5v dCB0aGUgYWN0aXZlIHJlZmVyZW5jZSB0aGVyZSBpcyBubworCSAqIG1lYW5pbmdmdWwgcGVyLXBp biBwaGFzZSBvZmZzZXQsIHNvIHJlcG9ydCAwIGluc3RlYWQgb2YgdGhlCisJICogYWN0aXZlIHJl ZmVyZW5jZSdzIHZhbHVlLgorCSAqLworCWlmIChzaXRkZXYtPmNoYW5bc2l0ZHBsbC0+aWRdLnNl bGVjdGVkX3JlZiAhPSBkcGluLT5pZCkgeworCQltdXRleF91bmxvY2soJnNpdGRldi0+bXVsdGlv cF9sb2NrKTsKKwkJZHBpbi0+cGhhc2Vfb2Zmc2V0ID0gMDsKKwkJKnBoYXNlX29mZnNldCA9IDA7 CisJCXJldHVybiAwOworCX0KKworCXJjID0gc2l0OTUzMXhfcGhhc2Vfb2Zmc2V0X3JlYWQoc2l0 ZGV2LCBzaXRkcGxsLT5pZCwgJm9mZnNldCk7CisJbXV0ZXhfdW5sb2NrKCZzaXRkZXYtPm11bHRp b3BfbG9jayk7CisKKwkvKgorCSAqIC1FTk9ERVYgbWVhbnMgdGhlIFBMTCBoYXMgbm8gcHJvZ3Jh bW1lZCBESVZOICh1bnVzZWQgb24gdGhpcworCSAqIGJvYXJkKTsgcmVwb3J0IHBoYXNlX29mZnNl dCA9IDAgc28gYSBmdWxsIHBpbi1nZXQgZHVtcCBkb2VzIG5vdAorCSAqIGZhaWwganVzdCBiZWNh dXNlIG9uZSBEUExMIGlzIGRvcm1hbnQuCisJICovCisJaWYgKHJjID09IC1FTk9ERVYpIHsKKwkJ ZHBpbi0+cGhhc2Vfb2Zmc2V0ID0gMDsKKwkJKnBoYXNlX29mZnNldCA9IDA7CisJCXJldHVybiAw OworCX0KKwlpZiAocmMpIHsKKwkJTkxfU0VUX0VSUl9NU0coZXh0YWNrLCAiVERDIHBoYXNlIHJl YWRiYWNrIGZhaWxlZCIpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyoKKwkgKiBUaGUgQUJJIHJl cG9ydHMgcGhhc2Ugb2Zmc2V0IGluIHVuaXRzIG9mIDEvRFBMTF9QSEFTRV9PRkZTRVRfRElWSURF UgorCSAqIHBpY29zZWNvbmRzOiB0aGUgaW50ZWdlciBwYXJ0IG9mIHRoZSBhdHRyaWJ1dGUgaXMg dGhlIHZhbHVlIGRpdmlkZWQKKwkgKiBieSB0aGUgZGl2aWRlciwgdGhlIHJlbWFpbmRlciBpcyB0 aGUgZnJhY3Rpb24uICBUaGUgVERDIHJlc29sdmVzIG9uZQorCSAqIFZDTyBwZXJpb2QgKGh1bmRy ZWRzIG9mIHBpY29zZWNvbmRzKSwgc28gdGhlIGZyYWN0aW9uYWwgZGlnaXRzIGFyZQorCSAqIGFs d2F5cyB6ZXJvIGhlcmUsIGJ1dCB0aGUgbWFnbml0dWRlIHN0aWxsIGhhcyB0byBiZSBzY2FsZWQg b3IgZXZlcnkKKwkgKiByZWFkaW5nIHdvdWxkIGJlIHJlcG9ydGVkIGEgdGhvdXNhbmQgdGltZXMg dG9vIHNtYWxsLgorCSAqLworCW9mZnNldCAqPSBEUExMX1BIQVNFX09GRlNFVF9ESVZJREVSOwor CisJZHBpbi0+cGhhc2Vfb2Zmc2V0ID0gb2Zmc2V0OworCSpwaGFzZV9vZmZzZXQgPSBvZmZzZXQ7 CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHBsbF9waW5fb3BzIHNpdDk1 MzF4X2RwbGxfaW5wdXRfcGluX29wcyA9IHsKKwkuZGlyZWN0aW9uX2dldAkJPSBzaXQ5NTMxeF9k cGxsX2lucHV0X3Bpbl9kaXJlY3Rpb25fZ2V0LAorCS5mcmVxdWVuY3lfZ2V0CQk9IHNpdDk1MzF4 X2RwbGxfaW5wdXRfcGluX2ZyZXF1ZW5jeV9nZXQsCisJLnN0YXRlX29uX2RwbGxfZ2V0CT0gc2l0 OTUzMXhfZHBsbF9pbnB1dF9waW5fc3RhdGVfb25fZHBsbF9nZXQsCisJLnN0YXRlX29uX2RwbGxf c2V0CT0gc2l0OTUzMXhfZHBsbF9pbnB1dF9waW5fc3RhdGVfb25fZHBsbF9zZXQsCisJLnByaW9f Z2V0CQk9IHNpdDk1MzF4X2RwbGxfaW5wdXRfcGluX3ByaW9fZ2V0LAorCS5wcmlvX3NldAkJPSBz aXQ5NTMxeF9kcGxsX2lucHV0X3Bpbl9wcmlvX3NldCwKKwkucGhhc2VfYWRqdXN0X2dldAk9IHNp dDk1MzF4X2RwbGxfaW5wdXRfcGluX3BoYXNlX2FkanVzdF9nZXQsCisJLnBoYXNlX29mZnNldF9n ZXQJPSBzaXQ5NTMxeF9kcGxsX2lucHV0X3Bpbl9waGFzZV9vZmZzZXRfZ2V0LAorCS8qCisJICog VGhlIG1lYXN1cmVtZW50IGNvbXBhcmVzIHRoZSBQTEwncyBydW5uaW5nIGZlZWRiYWNrIGRpdmlk ZXIgd2l0aAorCSAqIGl0cyBjb25maWd1cmVkIG9uZSwgc28gaXQgZGVzY3JpYmVzIHRoZSBkZXZp Y2UncyBvd24gcmVmZXJlbmNlCisJICogcmF0aGVyIHRoYW4gYSBwb3J0IHJhdGUuCisJICovCisJ LnN1cHBvcnRlZF9mZm8JCT0gQklUKERQTExfRkZPX1BJTl9ERVZJQ0UpLAorCS5mZm9fZ2V0CQk9 IHNpdDk1MzF4X2RwbGxfaW5wdXRfcGluX2Zmb19nZXQsCit9OworCisvKgorICogSU5UU1lOQyBw aW4gb3BzCisgKgorICogSU5UU1lOQyBpcyB0aGUgY2hpcCdzIGludGVyLVBMTCBzeW5jIG5ldDog b25lIFBMTCBkcml2ZXMgaXQgYW5kIG90aGVyCisgKiBQTExzIG1heSBsb2NrIHRvIGl0IGluc3Rl YWQgb2YgdG8gYW4gZXh0ZXJuYWwgcmVmZXJlbmNlLiAgVGhlIHR3bworICogcm9sZXMgYXJlIGV4 cG9zZWQgYXMgdHdvIHNlcGFyYXRlIHBpbnMgc28gbmVpdGhlciBvdmVybG9hZHMgdGhlIG90aGVy OgorICoKKyAqICAgLSBhIHNvdXJjZSAob3V0cHV0KSBwaW4gcmVnaXN0ZXJlZCBvbiBldmVyeSBE UExMLiAgQ29ubmVjdGluZyBpdCBvbiBhCisgKiAgICAgRFBMTCBtYWtlcyB0aGF0IERQTEwgZHJp dmUgSU5UU1lOQzsgb25seSBvbmUgRFBMTCBtYXkgZHJpdmUgaXQgYXQgYQorICogICAgIHRpbWUu ICBJdCBoYXMgbm8gcHJpb3JpdHkgb3BzIC0tIGRyaXZpbmcgdGhlIG5ldCBpcyBub3QgYSByZWZl cmVuY2UKKyAqICAgICBzZWxlY3Rpb24uCisgKiAgIC0gYSBkZXN0aW5hdGlvbiAoaW5wdXQpIHBp biByZWdpc3RlcmVkIG9uIGV2ZXJ5IERQTEwuICBDb25uZWN0aW5nIGl0CisgKiAgICAgb24gYSBE UExMIG1ha2VzIHRoYXQgRFBMTCBlbGlnaWJsZSB0byBsb2NrIHRvIElOVFNZTkMgYXMgYQorICog ICAgIHJlZmVyZW5jZSwgc28gaXQgY2FycmllcyB0aGUgcHJpb3JpdHkgb3BzLgorICovCisKKy8q IC0tLS0gSU5UU1lOQyBzb3VyY2UgKG91dHB1dCkgcGluIC0tLS0gKi8KKworLyogVGhlIElOVFNZ TkMgc291cmNlIHBpbiBpcyBhbiBvdXRwdXQ7IGl0cyBkaXJlY3Rpb25fZ2V0IGlzIGRlZmluZWQg YmVsb3cuICovCitzdGF0aWMgaW50CitzaXQ5NTMxeF9kcGxsX291dHB1dF9waW5fZGlyZWN0aW9u X2dldChjb25zdCBzdHJ1Y3QgZHBsbF9waW4gKnBpbiwKKwkJCQkgICAgICAgdm9pZCAqcGluX3By aXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBkcGxsX2RldmljZSAqZHBsbCwKKwkJCQkgICAg ICAgdm9pZCAqZHBsbF9wcml2LAorCQkJCSAgICAgICBlbnVtIGRwbGxfcGluX2RpcmVjdGlvbiAq ZGlyZWN0aW9uLAorCQkJCSAgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spOwor CitzdGF0aWMgaW50CitzaXQ5NTMxeF9kcGxsX2ludHN5bmNfc3JjX3N0YXRlX29uX2RwbGxfZ2V0 KGNvbnN0IHN0cnVjdCBkcGxsX3BpbiAqcGluLAorCQkJCQkgICAgdm9pZCAqcGluX3ByaXYsCisJ CQkJCSAgICBjb25zdCBzdHJ1Y3QgZHBsbF9kZXZpY2UgKmRwbGwsCisJCQkJCSAgICB2b2lkICpk cGxsX3ByaXYsCisJCQkJCSAgICBlbnVtIGRwbGxfcGluX3N0YXRlICpzdGF0ZSwKKwkJCQkJICAg IHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKK3sKKwlzdHJ1Y3Qgc2l0OTUzMXhfZHBs bCAqc2l0ZHBsbCA9IGRwbGxfcHJpdjsKKwlzdHJ1Y3Qgc2l0OTUzMXhfZGV2ICpzaXRkZXYgPSBz aXRkcGxsLT5kZXY7CisKKwltdXRleF9sb2NrKCZzaXRkZXYtPm11bHRpb3BfbG9jayk7CisJaWYg KHNpdGRldi0+aW50c3luY19zcmMgPT0gc2l0ZHBsbC0+aWQpCisJCSpzdGF0ZSA9IERQTExfUElO X1NUQVRFX0NPTk5FQ1RFRDsKKwllbHNlCisJCSpzdGF0ZSA9IERQTExfUElOX1NUQVRFX0RJU0NP Tk5FQ1RFRDsKKwltdXRleF91bmxvY2soJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsKKworCXJldHVy biAwOworfQorCisvKgorICogc2l0OTUzMXhfZHBsbF9pbnRzeW5jX3NyY19zdGF0ZV9vbl9kcGxs X3NldCAtIGRyaXZlIElOVFNZTkMgZnJvbSBhIFBMTAorICoKKyAqICAgQ09OTkVDVEVEICAgIC0+ IHRoaXMgUExMIGRyaXZlcyB0aGUgSU5UU1lOQyBuZXQKKyAqICAgRElTQ09OTkVDVEVEIC0+IHN0 b3AgZHJpdmluZyBJTlRTWU5DIGlmIHRoaXMgUExMIGRyaXZlcyBpdAorICoKKyAqIFNFTEVDVEFC TEUgaXMgcmVqZWN0ZWQ6IGRyaXZpbmcgdGhlIG5ldCBpcyBhbiBleHBsaWNpdCBvdXRwdXQgcm91 dGluZywKKyAqIG5vdCBhbiBhdXRvbWF0aWMtc2VsZWN0aW9uIGNhbmRpZGF0ZSwgbWF0Y2hpbmcg dGhlIHJlZ3VsYXIgb3V0cHV0IHBpbi4KKyAqLworc3RhdGljIGludAorc2l0OTUzMXhfZHBsbF9p bnRzeW5jX3NyY19zdGF0ZV9vbl9kcGxsX3NldChjb25zdCBzdHJ1Y3QgZHBsbF9waW4gKnBpbiwK KwkJCQkJICAgIHZvaWQgKnBpbl9wcml2LAorCQkJCQkgICAgY29uc3Qgc3RydWN0IGRwbGxfZGV2 aWNlICpkcGxsLAorCQkJCQkgICAgdm9pZCAqZHBsbF9wcml2LAorCQkJCQkgICAgZW51bSBkcGxs X3Bpbl9zdGF0ZSBzdGF0ZSwKKwkJCQkJICAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFj aykKK3sKKwlzdHJ1Y3Qgc2l0OTUzMXhfZHBsbCAqc2l0ZHBsbCA9IGRwbGxfcHJpdjsKKwlzdHJ1 Y3Qgc2l0OTUzMXhfZGV2ICpzaXRkZXYgPSBzaXRkcGxsLT5kZXY7CisJaW50IHJjID0gMDsKKwl1 OCBwcmlvOworCisJbXV0ZXhfbG9jaygmc2l0ZGV2LT5tdWx0aW9wX2xvY2spOworCisJc3dpdGNo IChzdGF0ZSkgeworCWNhc2UgRFBMTF9QSU5fU1RBVEVfQ09OTkVDVEVEOgorCQlpZiAoc2l0ZGV2 LT5pbnRzeW5jX3NyYyA9PSBzaXRkcGxsLT5pZCkKKwkJCWJyZWFrOworCQlpZiAoc2l0ZGV2LT5p bnRzeW5jX3NyYyA+PSAwKSB7CisJCQlOTF9TRVRfRVJSX01TRyhleHRhY2ssCisJCQkJICAgICAg ICJJTlRTWU5DIGlzIGFscmVhZHkgc291cmNlZCBieSBhbm90aGVyIFBMTCIpOworCQkJcmMgPSAt RUJVU1k7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiBBIFBMTCB0aGF0IGFscmVhZHkgbGlz dHMgSU5UU1lOQyBhbW9uZyBpdHMgcmVmZXJlbmNlcyBtdXN0CisJCSAqIG5vdCBhbHNvIGRyaXZl IGl0OiB0aGUgZGVzdGluYXRpb24gc2lkZSByZWZ1c2VzIHRoZSBtaXJyb3IKKwkJICogb2YgdGhp cywgYW5kIHdpdGhvdXQgdGhlIGNoZWNrIGhlcmUgdGhlIG5ldCBjb3VsZCBiZSByb3V0ZWQKKwkJ ICogYmFjayBpbnRvIHRoZSBQTEwgZmVlZGluZyBpdC4KKwkJICovCisJCXJjID0gc2l0OTUzMXhf aW5wdXRfcHJpb19nZXQoc2l0ZGV2LCBzaXRkcGxsLT5pZCwKKwkJCQkJICAgICBzaXQ5NTMxeF9p bnB1dF9od19zcmMoU0lUOTUzMVhfSU5UU1lOQ19QSU5fSUQpLAorCQkJCQkgICAgICZwcmlvKTsK KwkJaWYgKHJjKQorCQkJYnJlYWs7CisJCWlmIChwcmlvIDwgU0lUOTUzMVhfUFJJT19NQVhfU0xP VFMpIHsKKwkJCU5MX1NFVF9FUlJfTVNHKGV4dGFjaywKKwkJCQkgICAgICAgIlBMTCBzZWxlY3Rz IElOVFNZTkMgYXMgYSByZWZlcmVuY2U7IGl0IGNhbm5vdCBkcml2ZSBpdCIpOworCQkJcmMgPSAt RUJVU1k7CisJCQlicmVhazsKKwkJfQorCQlyYyA9IHNpdDk1MzF4X2ludHN5bmNfZW5hYmxlKHNp dGRldiwgc2l0ZHBsbC0+aWQpOworCQlpZiAoIXJjKQorCQkJc2l0ZGV2LT5pbnRzeW5jX3NyYyA9 IHNpdGRwbGwtPmlkOworCQlicmVhazsKKwljYXNlIERQTExfUElOX1NUQVRFX0RJU0NPTk5FQ1RF RDoKKwkJaWYgKHNpdGRldi0+aW50c3luY19zcmMgIT0gc2l0ZHBsbC0+aWQpCisJCQlicmVhazsK KwkJcmMgPSBzaXQ5NTMxeF9pbnRzeW5jX2Rpc2FibGUoc2l0ZGV2LCBzaXRkcGxsLT5pZCk7CisJ CWlmICghcmMpCisJCQlzaXRkZXYtPmludHN5bmNfc3JjID0gLTE7CisJCWJyZWFrOworCWRlZmF1 bHQ6CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZzaXRk ZXYtPm11bHRpb3BfbG9jayk7CisKKwlpZiAocmMgJiYgcmMgIT0gLUVCVVNZKQorCQlOTF9TRVRf RVJSX01TRyhleHRhY2ssICJGYWlsZWQgdG8gc2V0IElOVFNZTkMgc291cmNlIHN0YXRlIik7CisK KwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHBsbF9waW5fb3BzIHNpdDk1 MzF4X2RwbGxfaW50c3luY19zcmNfcGluX29wcyA9IHsKKwkuZGlyZWN0aW9uX2dldAkJPSBzaXQ5 NTMxeF9kcGxsX291dHB1dF9waW5fZGlyZWN0aW9uX2dldCwKKwkuc3RhdGVfb25fZHBsbF9nZXQJ PSBzaXQ5NTMxeF9kcGxsX2ludHN5bmNfc3JjX3N0YXRlX29uX2RwbGxfZ2V0LAorCS5zdGF0ZV9v bl9kcGxsX3NldAk9IHNpdDk1MzF4X2RwbGxfaW50c3luY19zcmNfc3RhdGVfb25fZHBsbF9zZXQs Cit9OworCisvKiAtLS0tIElOVFNZTkMgZGVzdGluYXRpb24gKGlucHV0KSBwaW4gLS0tLSAqLwor CisvKgorICogc2l0OTUzMXhfZHBsbF9pbnRzeW5jX2RzdF9zdGF0ZV9vbl9kcGxsX2dldCAtIElO VFNZTkMgcmVmZXJlbmNlIHN0YXRlCisgKgorICogQ09OTkVDVEVEIHdoZW4gdGhpcyBQTEwgaXMg bG9ja2VkIHRvIElOVFNZTkMgYXMgaXRzIHJlZmVyZW5jZSwKKyAqIFNFTEVDVEFCTEUgd2hlbiBp dCBydW5zIGluIGF1dG9tYXRpYyBtb2RlIGFuZCBhIHNvdXJjZSBQTEwgaXMgZHJpdmluZworICog SU5UU1lOQywgRElTQ09OTkVDVEVEIG90aGVyd2lzZS4gIFRoZSBQTEwgdGhhdCBkcml2ZXMgSU5U U1lOQyBjYW4gbmV2ZXIKKyAqIGJlIGl0cyBvd24gZGVzdGluYXRpb24uCisgKi8KK3N0YXRpYyBp bnQKK3NpdDk1MzF4X2RwbGxfaW50c3luY19kc3Rfc3RhdGVfb25fZHBsbF9nZXQoY29uc3Qgc3Ry dWN0IGRwbGxfcGluICpwaW4sCisJCQkJCSAgICB2b2lkICpwaW5fcHJpdiwKKwkJCQkJICAgIGNv bnN0IHN0cnVjdCBkcGxsX2RldmljZSAqZHBsbCwKKwkJCQkJICAgIHZvaWQgKmRwbGxfcHJpdiwK KwkJCQkJICAgIGVudW0gZHBsbF9waW5fc3RhdGUgKnN0YXRlLAorCQkJCQkgICAgc3RydWN0IG5l dGxpbmtfZXh0X2FjayAqZXh0YWNrKQoreworCXN0cnVjdCBzaXQ5NTMxeF9kcGxsICpzaXRkcGxs ID0gZHBsbF9wcml2OworCXN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiA9IHNpdGRwbGwtPmRl djsKKwljb25zdCBzdHJ1Y3Qgc2l0OTUzMXhfY2hhbiAqY2hhbjsKKworCWNoYW4gPSBzaXQ5NTMx eF9jaGFuX3N0YXRlX2dldChzaXRkZXYsIHNpdGRwbGwtPmlkKTsKKworCW11dGV4X2xvY2soJnNp dGRldi0+bXVsdGlvcF9sb2NrKTsKKwlpZiAoc2l0ZGV2LT5pbnRzeW5jX3NyYyA9PSBzaXRkcGxs LT5pZCkKKwkJKnN0YXRlID0gRFBMTF9QSU5fU1RBVEVfRElTQ09OTkVDVEVEOworCWVsc2UgaWYg KGNoYW4tPmxvY2tlZCAmJiAhY2hhbi0+aW5uZXJfbG9sICYmCisJCSBjaGFuLT5zZWxlY3RlZF9y ZWYgPT0gU0lUOTUzMVhfSU5UU1lOQ19QSU5fSUQpCisJCSpzdGF0ZSA9IERQTExfUElOX1NUQVRF X0NPTk5FQ1RFRDsKKwllbHNlIGlmICghY2hhbi0+bW9kZSAmJiBzaXRkZXYtPmludHN5bmNfc3Jj ID49IDApCisJCSpzdGF0ZSA9IERQTExfUElOX1NUQVRFX1NFTEVDVEFCTEU7CisJZWxzZQorCQkq c3RhdGUgPSBEUExMX1BJTl9TVEFURV9ESVNDT05ORUNURUQ7CisJbXV0ZXhfdW5sb2NrKCZzaXRk ZXYtPm11bHRpb3BfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNpdDk1MzF4X2Rw bGxfaW50c3luY19kc3Rfc3RhdGVfb25fZHBsbF9zZXQgLSBsb2NrIGEgUExMIHRvIElOVFNZTkMK KyAqCisgKiAgIENPTk5FQ1RFRC9TRUxFQ1RBQkxFIC0+IGFkZCBJTlRTWU5DIHRvIHRoaXMgUExM J3MgcHJpb3JpdHkgdGFibGUKKyAqICAgRElTQ09OTkVDVEVEICAgICAgICAgLT4gZHJvcCBJTlRT WU5DIGZyb20gdGhpcyBQTEwncyBwcmlvcml0eSB0YWJsZQorICoKKyAqIElOVFNZTkMgaXMgYW4g aW50ZXJuYWwgbmV0IHdpdGggbm8gcGh5c2ljYWwgcmVjZWl2ZXIsIHNvIG9ubHkgdGhlCisgKiBw ZXItUExMIHByaW9yaXR5IHRhYmxlIGlzIHRvdWNoZWQ7IHRoZSBzb3VyY2UgcGluIGNvbnRyb2xz IGdlbmVyYXRpb24uCisgKi8KK3N0YXRpYyBpbnQKK3NpdDk1MzF4X2RwbGxfaW50c3luY19kc3Rf c3RhdGVfb25fZHBsbF9zZXQoY29uc3Qgc3RydWN0IGRwbGxfcGluICpwaW4sCisJCQkJCSAgICB2 b2lkICpwaW5fcHJpdiwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBkcGxsX2RldmljZSAqZHBsbCwK KwkJCQkJICAgIHZvaWQgKmRwbGxfcHJpdiwKKwkJCQkJICAgIGVudW0gZHBsbF9waW5fc3RhdGUg c3RhdGUsCisJCQkJCSAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCit7CisJc3Ry dWN0IHNpdDk1MzF4X2RwbGwgKnNpdGRwbGwgPSBkcGxsX3ByaXY7CisJc3RydWN0IHNpdDk1MzF4 X2RldiAqc2l0ZGV2ID0gc2l0ZHBsbC0+ZGV2OworCXU4IGh3X3NyYyA9IHNpdDk1MzF4X2lucHV0 X2h3X3NyYyhTSVQ5NTMxWF9JTlRTWU5DX1BJTl9JRCk7CisJaW50IHJjOworCisJbXV0ZXhfbG9j aygmc2l0ZGV2LT5tdWx0aW9wX2xvY2spOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgRFBM TF9QSU5fU1RBVEVfRElTQ09OTkVDVEVEOgorCQlyYyA9IHNpdDk1MzF4X2lucHV0X3ByaW9fcmVt b3ZlKHNpdGRldiwgc2l0ZHBsbC0+aWQsIGh3X3NyYyk7CisJCWJyZWFrOworCWNhc2UgRFBMTF9Q SU5fU1RBVEVfU0VMRUNUQUJMRToKKwljYXNlIERQTExfUElOX1NUQVRFX0NPTk5FQ1RFRDoKKwkJ aWYgKHNpdGRldi0+aW50c3luY19zcmMgPT0gc2l0ZHBsbC0+aWQpIHsKKwkJCU5MX1NFVF9FUlJf TVNHKGV4dGFjaywKKwkJCQkgICAgICAgIlBMTCBjYW5ub3QgbG9jayB0byB0aGUgSU5UU1lOQyBp dCBkcml2ZXMiKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gc2l0 OTUzMXhfaW5wdXRfcHJpb19hZGQoc2l0ZGV2LCBzaXRkcGxsLT5pZCwgaHdfc3JjKTsKKwkJYnJl YWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwltdXRleF91 bmxvY2soJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsKKworCWlmIChyYyAmJiByYyAhPSAtRUlOVkFM KQorCQlOTF9TRVRfRVJSX01TRyhleHRhY2ssICJGYWlsZWQgdG8gc2V0IElOVFNZTkMgaW5wdXQg c3RhdGUiKTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIERvIG5vdCBhZGQgLmZyZXF1ZW5j eV9nZXQgLyB0aGUgZ2VuZXJpYyBpbnB1dCBzdGF0ZSBnZXR0ZXIgaGVyZTogdGhlCisgKiBkZXN0 aW5hdGlvbiBwaW4gaWQgaXMgU0lUOTUzMVhfSU5UU1lOQ19QSU5fSUQsIG9uZSBwYXN0IHRoZSBl bmQgb2YgdGhlCisgKiByZWZbXSBhcnJheSAoSU5UU1lOQyBpcyBhbiBpbnRlcm5hbCBuZXQgd2l0 aCBubyByZWZbXSBlbnRyeSkuICBUaGUgb3BzCisgKiBiZWxvdyBvbmx5IGV2ZXIga2V5IG9uIGNo YW5bXSBhbmQgdGhlIHByaW9yaXR5IHRhYmxlLCBuZXZlciByZWZbaWRdLgorICovCitzdGF0aWMg Y29uc3Qgc3RydWN0IGRwbGxfcGluX29wcyBzaXQ5NTMxeF9kcGxsX2ludHN5bmNfZHN0X3Bpbl9v cHMgPSB7CisJLmRpcmVjdGlvbl9nZXQJCT0gc2l0OTUzMXhfZHBsbF9pbnB1dF9waW5fZGlyZWN0 aW9uX2dldCwKKwkuc3RhdGVfb25fZHBsbF9nZXQJPSBzaXQ5NTMxeF9kcGxsX2ludHN5bmNfZHN0 X3N0YXRlX29uX2RwbGxfZ2V0LAorCS5zdGF0ZV9vbl9kcGxsX3NldAk9IHNpdDk1MzF4X2RwbGxf aW50c3luY19kc3Rfc3RhdGVfb25fZHBsbF9zZXQsCisJLnByaW9fZ2V0CQk9IHNpdDk1MzF4X2Rw bGxfaW5wdXRfcGluX3ByaW9fZ2V0LAorCS5wcmlvX3NldAkJPSBzaXQ5NTMxeF9kcGxsX2lucHV0 X3Bpbl9wcmlvX3NldCwKK307CisKKy8qCisgKiBYTyAoY3J5c3RhbCBvc2NpbGxhdG9yKSBwaW4g b3BzCisgKgorICogVGhlIFhPIGlzIHRoZSBjaGlwJ3MgaW50ZXJuYWwgcmVmZXJlbmNlIG9zY2ls bGF0b3IgdGhhdCBmZWVkcyBldmVyeQorICogUExMLiAgSXQgaXMgZXhwb3NlZCBzbyB1c2Vyc3Bh Y2UgY2FuIHNlZSB0aGUgb24tY2hpcCByZWZlcmVuY2UsIGJ1dCBpdAorICogY2Fubm90IGJlIHJv dXRlZCBvciBkaXNjb25uZWN0ZWQsIHNvIGl0IGlzIHJlcG9ydGVkIHBlcm1hbmVudGx5CisgKiBj b25uZWN0ZWQgYW5kIG9mZmVycyBubyBzdGF0ZV9vbl9kcGxsX3NldCAvIHByaW8gb3BzLgorICov CisKK3N0YXRpYyBpbnQKK3NpdDk1MzF4X2RwbGxfeG9fcGluX3N0YXRlX29uX2RwbGxfZ2V0KGNv bnN0IHN0cnVjdCBkcGxsX3BpbiAqcGluLAorCQkJCSAgICAgICB2b2lkICpwaW5fcHJpdiwKKwkJ CQkgICAgICAgY29uc3Qgc3RydWN0IGRwbGxfZGV2aWNlICpkcGxsLAorCQkJCSAgICAgICB2b2lk ICpkcGxsX3ByaXYsCisJCQkJICAgICAgIGVudW0gZHBsbF9waW5fc3RhdGUgKnN0YXRlLAorCQkJ CSAgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCit7CisJKnN0YXRlID0gRFBM TF9QSU5fU1RBVEVfQ09OTkVDVEVEOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3Ry dWN0IGRwbGxfcGluX29wcyBzaXQ5NTMxeF9kcGxsX3hvX3Bpbl9vcHMgPSB7CisJLmRpcmVjdGlv bl9nZXQJCT0gc2l0OTUzMXhfZHBsbF9pbnB1dF9waW5fZGlyZWN0aW9uX2dldCwKKwkuZnJlcXVl bmN5X2dldAkJPSBzaXQ5NTMxeF9kcGxsX2lucHV0X3Bpbl9mcmVxdWVuY3lfZ2V0LAorCS5zdGF0 ZV9vbl9kcGxsX2dldAk9IHNpdDk1MzF4X2RwbGxfeG9fcGluX3N0YXRlX29uX2RwbGxfZ2V0LAor fTsKKworc3RhdGljIGludAorc2l0OTUzMXhfZHBsbF9vdXRwdXRfcGluX2RpcmVjdGlvbl9nZXQo Y29uc3Qgc3RydWN0IGRwbGxfcGluICpwaW4sCisJCQkJICAgICAgIHZvaWQgKnBpbl9wcml2LAor CQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZHBsbF9kZXZpY2UgKmRwbGwsCisJCQkJICAgICAgIHZv aWQgKmRwbGxfcHJpdiwKKwkJCQkgICAgICAgZW51bSBkcGxsX3Bpbl9kaXJlY3Rpb24gKmRpcmVj dGlvbiwKKwkJCQkgICAgICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQoreworCSpk aXJlY3Rpb24gPSBEUExMX1BJTl9ESVJFQ1RJT05fT1VUUFVUOworCXJldHVybiAwOworfQorCisv KgorICogc2l0OTUzMXhfZHBsbF9vdXRwdXRfcGluX2ZyZXF1ZW5jeV9nZXQgLSByZWFkIG91dHB1 dCBwaW4gZnJlcXVlbmN5CisgKgorICogUmVhZHMgdGhlIERJVk8gZGl2aWRlciBiYWNrIGZyb20g dGhlIGNoaXAgYW5kIGNvbXB1dGVzIHRoZSBsaXZlCisgKiBmcmVxdWVuY3kgYXMgRnZjbyAvIERJ Vk8uICBGYWxscyBiYWNrIHRvIHRoZSBjYWNoZWQgdmFsdWUgd2hlbiB0aGUKKyAqIG91dHB1dCBp cyBub3QgcmVzb2x2YWJsZSB0aHJvdWdoIHRoZSBkaXZpZGVyIGNoYWluIChlLmcuIG5vdCBtYXBw ZWQKKyAqIHRvIGEgUExMKSwgc28gYSBuZXRsaW5rIGR1bXAgbmV2ZXIgZmFpbHMgb24gc3VjaCBw aW5zLgorICovCitzdGF0aWMgaW50CitzaXQ5NTMxeF9kcGxsX291dHB1dF9waW5fZnJlcXVlbmN5 X2dldChjb25zdCBzdHJ1Y3QgZHBsbF9waW4gKnBpbiwKKwkJCQkgICAgICAgdm9pZCAqcGluX3By aXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBkcGxsX2RldmljZSAqZHBsbCwKKwkJCQkgICAg ICAgdm9pZCAqZHBsbF9wcml2LCB1NjQgKmZyZXF1ZW5jeSwKKwkJCQkgICAgICAgc3RydWN0IG5l dGxpbmtfZXh0X2FjayAqZXh0YWNrKQoreworCXN0cnVjdCBzaXQ5NTMxeF9kcGxsX3BpbiAqZHBp biA9IHBpbl9wcml2OworCXN0cnVjdCBzaXQ5NTMxeF9kcGxsICpzaXRkcGxsID0gZHBsbF9wcml2 OworCXN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiA9IHNpdGRwbGwtPmRldjsKKwlpbnQgcmM7 CisKKwltdXRleF9sb2NrKCZzaXRkZXYtPm11bHRpb3BfbG9jayk7CisJcmMgPSBzaXQ5NTMxeF9v dXRwdXRfZnJlcV9nZXQoc2l0ZGV2LCBkcGluLT5pZCwgZnJlcXVlbmN5KTsKKwltdXRleF91bmxv Y2soJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsKKworCWlmIChyYykKKwkJKmZyZXF1ZW5jeSA9IHNp dDk1MzF4X291dF9zdGF0ZV9nZXQoc2l0ZGV2LCBkcGluLT5pZCktPmZyZXE7CisKKwlyZXR1cm4g MDsKK30KKworLyoKKyAqIHNpdDk1MzF4X2RwbGxfb3V0cHV0X3Bpbl9mcmVxdWVuY3lfc2V0IC0g c2V0IG91dHB1dCBwaW4gZnJlcXVlbmN5CisgKgorICogY29tcHV0ZXMgRElWTyA9IEZ2Y28gLyBm cmVxdWVuY3kgYW5kIHdyaXRlcyB0aGUKKyAqIDM0LWJpdCBvdXRwdXQgZGl2aWRlciB0byB0aGUg b3V0cHV0IHN5c3RlbSByZWdpc3RlcnMgdmlhCisgKiBzaXQ5NTMxeF9vdXRwdXRfZnJlcV9zZXQo KS4KKyAqLworc3RhdGljIGludAorc2l0OTUzMXhfZHBsbF9vdXRwdXRfcGluX2ZyZXF1ZW5jeV9z ZXQoY29uc3Qgc3RydWN0IGRwbGxfcGluICpwaW4sCisJCQkJICAgICAgIHZvaWQgKnBpbl9wcml2 LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZHBsbF9kZXZpY2UgKmRwbGwsCisJCQkJICAgICAg IHZvaWQgKmRwbGxfcHJpdiwgdTY0IGZyZXF1ZW5jeSwKKwkJCQkgICAgICAgc3RydWN0IG5ldGxp bmtfZXh0X2FjayAqZXh0YWNrKQoreworCXN0cnVjdCBzaXQ5NTMxeF9kcGxsX3BpbiAqZHBpbiA9 IHBpbl9wcml2OworCXN0cnVjdCBzaXQ5NTMxeF9kcGxsICpzaXRkcGxsID0gZHBsbF9wcml2Owor CXN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiA9IHNpdGRwbGwtPmRldjsKKwl1OCBhY3R1YWxf cGxsOworCWludCByYzsKKworCS8qCisJICogUmVhZCB0aGUgUExMIHRoYXQgZHJpdmVzIHRoaXMg b3V0cHV0IGZyb20gaXRzIE9VVF9NQVAgc3RhdGUKKwkgKiAocG9wdWxhdGVkIGJ5IG91dF9zdGF0 ZV9mZXRjaCBmcm9tIHRoZSBjaGlwJ3MgT1VUX01BUCByZWdpc3RlcnMpLgorCSAqIFRoYXQgaXMg dGhlIGluZGV4IHRoZSBvdXRwdXQgcmVnaXN0ZXIgcHJvZ3JhbW1pbmcgYmVsb3cgaXMga2V5ZWQK KwkgKiBieTsgdGhlIG91dHB1dCBpcyByZWdpc3RlcmVkIHVuZGVyIHRoZSBEUExMIG1hdGNoaW5n IHRoaXMgUExMLgorCSAqLworCWFjdHVhbF9wbGwgPSBzaXRkZXYtPm91dFtkcGluLT5pZF0ucGxs X2lkeDsKKworCW11dGV4X2xvY2soJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsKKwlyYyA9IHNpdDk1 MzF4X291dHB1dF9mcmVxX3NldChzaXRkZXYsIGRwaW4tPmlkLCBhY3R1YWxfcGxsLAorCQkJCSAg ICAgIGZyZXF1ZW5jeSk7CisJbXV0ZXhfdW5sb2NrKCZzaXRkZXYtPm11bHRpb3BfbG9jayk7CisK KwlpZiAocmMpCisJCU5MX1NFVF9FUlJfTVNHKGV4dGFjaywgIk91dHB1dCBmcmVxdWVuY3kgc2V0 IGZhaWxlZCIpOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogc2l0OTUzMXhfZHBsbF9vdXRw dXRfcGluX3N0YXRlX29uX2RwbGxfZ2V0IC0gZ2V0IG91dHB1dCBwaW4gc3RhdGUKKyAqCisgKiBy ZXBvcnRzIENPTk5FQ1RFRCB3aGVuIHRoZSBvdXRwdXQgaXMgZHJpdmVuIGFuZAorICogRElTQ09O TkVDVEVEIHdoZW4gaXQgaGFzIGJlZW4gbXV0ZWQgdmlhIHNpdDk1MzF4X291dHB1dF9kaXNhYmxl KCkuCisgKi8KK3N0YXRpYyBpbnQKK3NpdDk1MzF4X2RwbGxfb3V0cHV0X3Bpbl9zdGF0ZV9vbl9k cGxsX2dldChjb25zdCBzdHJ1Y3QgZHBsbF9waW4gKnBpbiwKKwkJCQkJICAgdm9pZCAqcGluX3By aXYsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBkcGxsX2RldmljZSAqZHBsbCwKKwkJCQkJICAgdm9p ZCAqZHBsbF9wcml2LAorCQkJCQkgICBlbnVtIGRwbGxfcGluX3N0YXRlICpzdGF0ZSwKKwkJCQkJ ICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQoreworCXN0cnVjdCBzaXQ5NTMxeF9k cGxsX3BpbiAqZHBpbiA9IHBpbl9wcml2OworCXN0cnVjdCBzaXQ5NTMxeF9kcGxsICpzaXRkcGxs ID0gZHBsbF9wcml2OworCWNvbnN0IHN0cnVjdCBzaXQ5NTMxeF9vdXQgKm91dDsKKworCW91dCA9 IHNpdDk1MzF4X291dF9zdGF0ZV9nZXQoc2l0ZHBsbC0+ZGV2LCBkcGluLT5pZCk7CisJKnN0YXRl ID0gb3V0LT5lbmFibGVkID8gRFBMTF9QSU5fU1RBVEVfQ09OTkVDVEVECisJCQkgICAgICA6IERQ TExfUElOX1NUQVRFX0RJU0NPTk5FQ1RFRDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNpdDk1 MzF4X2RwbGxfb3V0cHV0X3Bpbl9zdGF0ZV9vbl9kcGxsX3NldCAtIG11dGUvdW4tbXV0ZSBhbiBv dXRwdXQKKyAqCisgKiBmb3JjZXMgSGktWiBvbiB0aGUgb3V0cHV0IHBpbiB2aWEgdGhlIFBhZ2Ug MHgwMworICogZm9yY2Uvc3RhdGUgcmVnaXN0ZXIgcGFpci4KKyAqICAgQ09OTkVDVEVEICAgIC0+ IGVuYWJsZSAocmVsZWFzZSBmb3JjZSwgYmFjayB0byBmYWN0b3J5IGRlZmF1bHQpCisgKiAgIERJ U0NPTk5FQ1RFRCAtPiBkaXNhYmxlIChmb3JjZSBIaS1aKQorICovCitzdGF0aWMgaW50CitzaXQ5 NTMxeF9kcGxsX291dHB1dF9waW5fc3RhdGVfb25fZHBsbF9zZXQoY29uc3Qgc3RydWN0IGRwbGxf cGluICpwaW4sCisJCQkJCSAgIHZvaWQgKnBpbl9wcml2LAorCQkJCQkgICBjb25zdCBzdHJ1Y3Qg ZHBsbF9kZXZpY2UgKmRwbGwsCisJCQkJCSAgIHZvaWQgKmRwbGxfcHJpdiwKKwkJCQkJICAgZW51 bSBkcGxsX3Bpbl9zdGF0ZSBzdGF0ZSwKKwkJCQkJICAgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAq ZXh0YWNrKQoreworCXN0cnVjdCBzaXQ5NTMxeF9kcGxsX3BpbiAqZHBpbiA9IHBpbl9wcml2Owor CXN0cnVjdCBzaXQ5NTMxeF9kcGxsICpzaXRkcGxsID0gZHBsbF9wcml2OworCXN0cnVjdCBzaXQ5 NTMxeF9kZXYgKnNpdGRldiA9IHNpdGRwbGwtPmRldjsKKwlpbnQgcmM7CisKKwltdXRleF9sb2Nr KCZzaXRkZXYtPm11bHRpb3BfbG9jayk7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBEUExM X1BJTl9TVEFURV9DT05ORUNURUQ6CisJCXJjID0gc2l0OTUzMXhfb3V0cHV0X2VuYWJsZShzaXRk ZXYsIGRwaW4tPmlkKTsKKwkJYnJlYWs7CisJY2FzZSBEUExMX1BJTl9TVEFURV9ESVNDT05ORUNU RUQ6CisJCXJjID0gc2l0OTUzMXhfb3V0cHV0X2Rpc2FibGUoc2l0ZGV2LCBkcGluLT5pZCk7CisJ CWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJbXV0 ZXhfdW5sb2NrKCZzaXRkZXYtPm11bHRpb3BfbG9jayk7CisKKwlpZiAocmMpCisJCU5MX1NFVF9F UlJfTVNHKGV4dGFjaywgIkZhaWxlZCB0byBzZXQgb3V0cHV0IHBpbiBzdGF0ZSIpOworCisJcmV0 dXJuIHJjOworfQorCisvKgorICogc2l0OTUzMXhfZHBsbF9vdXRwdXRfcGluX3BoYXNlX2FkanVz dF9nZXQgLSByZWFkIG91dHB1dCBwaGFzZSBhZGp1c3RtZW50CisgKgorICogcmV0dXJucyBjYWNo ZWQgdmFsdWUuCisgKi8KK3N0YXRpYyBpbnQKK3NpdDk1MzF4X2RwbGxfb3V0cHV0X3Bpbl9waGFz ZV9hZGp1c3RfZ2V0KGNvbnN0IHN0cnVjdCBkcGxsX3BpbiAqcGluLAorCQkJCQkgIHZvaWQgKnBp bl9wcml2LAorCQkJCQkgIGNvbnN0IHN0cnVjdCBkcGxsX2RldmljZSAqZHBsbCwKKwkJCQkJICB2 b2lkICpkcGxsX3ByaXYsIHMzMiAqcGhhc2VfYWRqdXN0LAorCQkJCQkgIHN0cnVjdCBuZXRsaW5r X2V4dF9hY2sgKmV4dGFjaykKK3sKKwlzdHJ1Y3Qgc2l0OTUzMXhfZHBsbF9waW4gKmRwaW4gPSBw aW5fcHJpdjsKKworCSpwaGFzZV9hZGp1c3QgPSBkcGluLT5waGFzZV9hZGp1c3Q7CisJcmV0dXJu IDA7Cit9CisKKy8qCisgKiBzaXQ5NTMxeF9kcGxsX291dHB1dF9waW5fcGhhc2VfYWRqdXN0X3Nl dCAtIHNldCBvdXRwdXQgcGhhc2UgYWRqdXN0bWVudAorICoKKyAqIFByb2dyYW1zIHRoZSBwZXIt b3V0cHV0IFBSR19SU1RfREVMQVkgcmVnaXN0ZXJzIGZvciBkZXRlcm1pbmlzdGljCisgKiBwaGFz ZSBvZmZzZXQ7IHNlZSBzaXQ5NTMxeF9vdXRwdXRfcGhhc2VfYWRqdXN0X3NldCgpIGluIGNvcmUu Yy4KKyAqLworc3RhdGljIGludAorc2l0OTUzMXhfZHBsbF9vdXRwdXRfcGluX3BoYXNlX2FkanVz dF9zZXQoY29uc3Qgc3RydWN0IGRwbGxfcGluICpwaW4sCisJCQkJCSAgdm9pZCAqcGluX3ByaXYs CisJCQkJCSAgY29uc3Qgc3RydWN0IGRwbGxfZGV2aWNlICpkcGxsLAorCQkJCQkgIHZvaWQgKmRw bGxfcHJpdiwgczMyIHBoYXNlX2FkanVzdCwKKwkJCQkJICBzdHJ1Y3QgbmV0bGlua19leHRfYWNr ICpleHRhY2spCit7CisJc3RydWN0IHNpdDk1MzF4X2RwbGxfcGluICpkcGluID0gcGluX3ByaXY7 CisJc3RydWN0IHNpdDk1MzF4X2RwbGwgKnNpdGRwbGwgPSBkcGxsX3ByaXY7CisJc3RydWN0IHNp dDk1MzF4X2RldiAqc2l0ZGV2ID0gc2l0ZHBsbC0+ZGV2OworCWludCByYzsKKworCW11dGV4X2xv Y2soJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsKKwlyYyA9IHNpdDk1MzF4X291dHB1dF9waGFzZV9h ZGp1c3Rfc2V0KHNpdGRldiwgZHBpbi0+aWQsIHBoYXNlX2FkanVzdCk7CisJbXV0ZXhfdW5sb2Nr KCZzaXRkZXYtPm11bHRpb3BfbG9jayk7CisKKwlpZiAocmMpIHsKKwkJTkxfU0VUX0VSUl9NU0co ZXh0YWNrLCAiUGhhc2UgYWRqdXN0IGZhaWxlZCIpOworCQlyZXR1cm4gcmM7CisJfQorCisJZHBp bi0+cGhhc2VfYWRqdXN0ID0gcGhhc2VfYWRqdXN0OworCXJldHVybiAwOworfQorCitzdGF0aWMg aW50CitzaXQ5NTMxeF9kcGxsX291dHB1dF9waW5fZXN5bmNfZ2V0KGNvbnN0IHN0cnVjdCBkcGxs X3BpbiAqcGluLAorCQkJCSAgIHZvaWQgKnBpbl9wcml2LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBk cGxsX2RldmljZSAqZHBsbCwKKwkJCQkgICB2b2lkICpkcGxsX3ByaXYsCisJCQkJICAgc3RydWN0 IGRwbGxfcGluX2VzeW5jICplc3luYywKKwkJCQkgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpl eHRhY2spCit7CisJc3RydWN0IHNpdDk1MzF4X2RwbGxfcGluICpkcGluID0gcGluX3ByaXY7CisK KwlpZiAoIXNpdDk1MzF4X2RwbGxfZXN5bmNfcGluX3N1cHBvcnRlZChkcGluKSkKKwkJcmV0dXJu IC1FT1BOT1RTVVBQOworCisJZXN5bmMtPnJhbmdlID0gc2l0OTUzMXhfZXN5bmNfcmFuZ2VzOwor CWVzeW5jLT5yYW5nZV9udW0gPSBBUlJBWV9TSVpFKHNpdDk1MzF4X2VzeW5jX3Jhbmdlcyk7CisJ ZXN5bmMtPnB1bHNlID0gU0lUOTUzMVhfRVNZTkNfUFVMU0VfREVGQVVMVDsKKwllc3luYy0+ZnJl cSA9IGRwaW4tPmVzeW5jX2ZyZXE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorc2l0 OTUzMXhfZHBsbF9vdXRwdXRfcGluX2VzeW5jX3NldChjb25zdCBzdHJ1Y3QgZHBsbF9waW4gKnBp biwKKwkJCQkgICB2b2lkICpwaW5fcHJpdiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZHBsbF9kZXZp Y2UgKmRwbGwsCisJCQkJICAgdm9pZCAqZHBsbF9wcml2LAorCQkJCSAgIHU2NCBmcmVxLAorCQkJ CSAgIHN0cnVjdCBuZXRsaW5rX2V4dF9hY2sgKmV4dGFjaykKK3sKKwlzdHJ1Y3Qgc2l0OTUzMXhf ZHBsbF9waW4gKmRwaW4gPSBwaW5fcHJpdjsKKwlzdHJ1Y3Qgc2l0OTUzMXhfZHBsbCAqc2l0ZHBs bCA9IGRwbGxfcHJpdjsKKwlzdHJ1Y3Qgc2l0OTUzMXhfZGV2ICpzaXRkZXYgPSBzaXRkcGxsLT5k ZXY7CisJdTggYWN0dWFsX3BsbDsKKwlpbnQgcmM7CisKKwlpZiAoIXNpdDk1MzF4X2RwbGxfZXN5 bmNfcGluX3N1cHBvcnRlZChkcGluKSkgeworCQlOTF9TRVRfRVJSX01TRyhleHRhY2ssCisJCQkg ICAgICAgIkVtYmVkZGVkIHN5bmMgbm90IGVuYWJsZWQgZm9yIHRoaXMgcGluIik7CisJCXJldHVy biAtRU9QTk9UU1VQUDsKKwl9CisKKwlhY3R1YWxfcGxsID0gc2l0ZGV2LT5vdXRbZHBpbi0+aWRd LnBsbF9pZHg7CisKKwltdXRleF9sb2NrKCZzaXRkZXYtPm11bHRpb3BfbG9jayk7CisKKwkvKgor CSAqIFRoaXMgb3V0cHV0IGlzIGEgZGVkaWNhdGVkIGVtYmVkZGVkLXN5bmMgcGluLgorCSAqIFRy ZWF0IGZyZXE9MCBhcyBhIHJlcXVlc3QgdG8gZGlzYWJsZSB0aGUgZW50aXJlIG91dHB1dC4KKwkg Ki8KKwlpZiAoIWZyZXEpIHsKKwkJcmMgPSBzaXQ5NTMxeF9vdXRwdXRfZGlzYWJsZShzaXRkZXYs IGRwaW4tPmlkKTsKKwkJaWYgKCFyYykKKwkJCWRwaW4tPmVzeW5jX2ZyZXEgPSAwOworCQltdXRl eF91bmxvY2soJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlm IChmcmVxICE9IFNJVDk1MzFYX0VTWU5DX0ZSRVFfMTBNSFopIHsKKwkJbXV0ZXhfdW5sb2NrKCZz aXRkZXYtPm11bHRpb3BfbG9jayk7CisJCU5MX1NFVF9FUlJfTVNHKGV4dGFjaywKKwkJCSAgICAg ICAiT25seSAxMCBNSHogZXN5bmMgZnJlcXVlbmN5IGlzIHN1cHBvcnRlZCIpOworCQlyZXR1cm4g LUVJTlZBTDsKKwl9CisKKwlyYyA9IHNpdDk1MzF4X291dHB1dF9mcmVxX3NldChzaXRkZXYsIGRw aW4tPmlkLCBhY3R1YWxfcGxsLAorCQkJCSAgICAgIFNJVDk1MzFYX0VTWU5DX0ZSRVFfMTBNSFop OworCS8qCisJICogUHJvZ3JhbSB0aGUgcHVsc2UgZ2VuZXJhdG9yIChQUk9HMCBQVUxTRV9DVFJM KSBzbyB0aGUgZW1iZWRkZWQtc3luYworCSAqIHB1bHNlIGlzIGFjdHVhbGx5IGVtaXR0ZWQ7IHdp dGhvdXQgaXQgdGhlIG91dHB1dCBjYXJyaWVzIHRoZSBjbG9jaworCSAqIGJ1dCBubyBlc3luYyBt YXJrZXIuICBTSVQ5NTMxWF9FU1lOQ19QVUxTRV9ERUZBVUxUIGlzIHRoZSBzYW1lIGR1dHkKKwkg KiB0aGUgZXN5bmNfZ2V0IGNhbGxiYWNrIGFkdmVydGlzZXMuCisJICovCisJaWYgKCFyYykKKwkJ cmMgPSBzaXQ5NTMxeF9vdXRwdXRfcHVsc2VfY3RybF9zZXQoc2l0ZGV2LCBkcGluLT5pZCwKKwkJ CQkJCSAgICBTSVQ5NTMxWF9FU1lOQ19QVUxTRV9ERUZBVUxUKTsKKwlpZiAoIXJjKQorCQlyYyA9 IHNpdDk1MzF4X291dHB1dF9lbmFibGUoc2l0ZGV2LCBkcGluLT5pZCk7CisKKwltdXRleF91bmxv Y2soJnNpdGRldi0+bXVsdGlvcF9sb2NrKTsKKworCWlmICghcmMpCisJCWRwaW4tPmVzeW5jX2Zy ZXEgPSBTSVQ5NTMxWF9FU1lOQ19GUkVRXzEwTUhaOworCisJcmV0dXJuIHJjOworfQorCitzdGF0 aWMgY29uc3Qgc3RydWN0IGRwbGxfcGluX29wcyBzaXQ5NTMxeF9kcGxsX291dHB1dF9waW5fb3Bz ID0geworCS5kaXJlY3Rpb25fZ2V0CQk9IHNpdDk1MzF4X2RwbGxfb3V0cHV0X3Bpbl9kaXJlY3Rp b25fZ2V0LAorCS5mcmVxdWVuY3lfZ2V0CQk9IHNpdDk1MzF4X2RwbGxfb3V0cHV0X3Bpbl9mcmVx dWVuY3lfZ2V0LAorCS5mcmVxdWVuY3lfc2V0CQk9IHNpdDk1MzF4X2RwbGxfb3V0cHV0X3Bpbl9m cmVxdWVuY3lfc2V0LAorCS5zdGF0ZV9vbl9kcGxsX2dldAk9IHNpdDk1MzF4X2RwbGxfb3V0cHV0 X3Bpbl9zdGF0ZV9vbl9kcGxsX2dldCwKKwkuc3RhdGVfb25fZHBsbF9zZXQJPSBzaXQ5NTMxeF9k cGxsX291dHB1dF9waW5fc3RhdGVfb25fZHBsbF9zZXQsCisJLnBoYXNlX2FkanVzdF9nZXQJPSBz aXQ5NTMxeF9kcGxsX291dHB1dF9waW5fcGhhc2VfYWRqdXN0X2dldCwKKwkucGhhc2VfYWRqdXN0 X3NldAk9IHNpdDk1MzF4X2RwbGxfb3V0cHV0X3Bpbl9waGFzZV9hZGp1c3Rfc2V0LAorCS5lc3lu Y19nZXQJCT0gc2l0OTUzMXhfZHBsbF9vdXRwdXRfcGluX2VzeW5jX2dldCwKKwkuZXN5bmNfc2V0 CQk9IHNpdDk1MzF4X2RwbGxfb3V0cHV0X3Bpbl9lc3luY19zZXQsCit9OworCitjb25zdCBzdHJ1 Y3QgZHBsbF9waW5fb3BzICoKK3NpdDk1MzF4X2RwbGxfcGluX29wc19nZXQoY29uc3Qgc3RydWN0 IHNpdDk1MzF4X2RwbGxfcGluICpwaW4pCit7CisJaWYgKCFzaXQ5NTMxeF9kcGxsX2lzX2lucHV0 X3BpbihwaW4pKSB7CisJCWlmIChzaXQ5NTMxeF9kcGxsX2lzX2ludHN5bmNfc3JjX3BpbihwaW4p KQorCQkJcmV0dXJuICZzaXQ5NTMxeF9kcGxsX2ludHN5bmNfc3JjX3Bpbl9vcHM7CisJCXJldHVy biAmc2l0OTUzMXhfZHBsbF9vdXRwdXRfcGluX29wczsKKwl9CisJaWYgKHNpdDk1MzF4X2RwbGxf aXNfaW50c3luY19waW4ocGluKSkKKwkJcmV0dXJuICZzaXQ5NTMxeF9kcGxsX2ludHN5bmNfZHN0 X3Bpbl9vcHM7CisJaWYgKHNpdDk1MzF4X2RwbGxfaXNfeG9fcGluKHBpbikpCisJCXJldHVybiAm c2l0OTUzMXhfZHBsbF94b19waW5fb3BzOworCXJldHVybiAmc2l0OTUzMXhfZHBsbF9pbnB1dF9w aW5fb3BzOworfQorCisvKgorICogc2l0OTUzMXhfZHBsbF9jaGFuZ2VzX2NoZWNrIC0gY2hlY2sg Zm9yIHN0YXRlIGNoYW5nZXMgYW5kIG5vdGlmeQorICoKKyAqIENhbGxlZCBmcm9tIHNpdDk1MzF4 X2Rldl9wZXJpb2RpY193b3JrKCkuICBDb21wYXJlcyBjdXJyZW50IGhhcmR3YXJlCisgKiBzdGF0 ZSBhZ2FpbnN0IGNhY2hlZCB2YWx1ZXMgYW5kIHNlbmRzIG5ldGxpbmsgbm90aWZpY2F0aW9ucyBv biBjaGFuZ2VzLgorICovCit2b2lkIHNpdDk1MzF4X2RwbGxfY2hhbmdlc19jaGVjayhzdHJ1Y3Qg c2l0OTUzMXhfZHBsbCAqc2l0ZHBsbCkKK3sKKwlzdHJ1Y3Qgc2l0OTUzMXhfZGV2ICpzaXRkZXYg PSBzaXRkcGxsLT5kZXY7CisJZW51bSBkcGxsX2xvY2tfc3RhdHVzIGxvY2tfc3RhdHVzOworCXN0 cnVjdCBzaXQ5NTMxeF9kcGxsX3BpbiAqcGluOworCWludCByYzsKKworCXJjID0gc2l0OTUzMXhf ZHBsbF9sb2NrX3N0YXR1c19nZXQoc2l0ZHBsbC0+ZHBsbF9kZXYsIHNpdGRwbGwsCisJCQkJCSAg ICZsb2NrX3N0YXR1cywgTlVMTCwgTlVMTCk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoc2l0ZGV2 LT5kZXYsICJGYWlsZWQgdG8gZ2V0IERQTEwldSBsb2NrIHN0YXR1czogJWRcbiIsCisJCQlzaXRk cGxsLT5pZCwgcmMpOworCQlyZXR1cm47CisJfQorCisJLyogSWYgbG9jayBzdGF0dXMgY2hhbmdl ZCwgbm90aWZ5IERQTEwgY29yZSAqLworCWlmIChzaXRkcGxsLT5sb2NrX3N0YXR1cyAhPSBsb2Nr X3N0YXR1cykgeworCQlzaXRkcGxsLT5sb2NrX3N0YXR1cyA9IGxvY2tfc3RhdHVzOworCQlkcGxs X2RldmljZV9jaGFuZ2VfbnRmKHNpdGRwbGwtPmRwbGxfZGV2KTsKKwl9CisKKwlsaXN0X2Zvcl9l YWNoX2VudHJ5KHBpbiwgJnNpdGRwbGwtPnBpbnMsIGxpc3QpIHsKKwkJY29uc3Qgc3RydWN0IGRw bGxfcGluX29wcyAqb3BzOworCQllbnVtIGRwbGxfcGluX3N0YXRlIHN0YXRlOworCisJCS8qCisJ CSAqIFBvbGwgaW5wdXQgcGlucyB3aG9zZSBzdGF0ZSBjYW4gY2hhbmdlIGF1dG9ub21vdXNseTog cmVndWxhcgorCQkgKiByZWZlcmVuY2VzIGFuZCB0aGUgSU5UU1lOQyBkZXN0aW5hdGlvbiBwaW4u ICBPdXRwdXRzIChpbmNsLgorCQkgKiB0aGUgSU5UU1lOQyBzb3VyY2UpIGNoYW5nZSBvbmx5IHRo cm91Z2ggdGhlaXIgb3duIHNldAorCQkgKiBjYWxsYmFjayBhbmQgdGhlIFhPIGlzIHBlcm1hbmVu dGx5IGNvbm5lY3RlZCwgc28gc2tpcCB0aG9zZS4KKwkJICogRWFjaCBwaW4ncyBvd24gc3RhdGVf b25fZHBsbF9nZXQgcmVzb2x2ZXMgdG8gdGhlIHJpZ2h0IGdldHRlci4KKwkJICovCisJCWlmICgh c2l0OTUzMXhfZHBsbF9pc19pbnB1dF9waW4ocGluKSB8fAorCQkgICAgc2l0OTUzMXhfZHBsbF9p c194b19waW4ocGluKSkKKwkJCWNvbnRpbnVlOworCisJCW9wcyA9IHNpdDk1MzF4X2RwbGxfcGlu X29wc19nZXQocGluKTsKKwkJcmMgPSBvcHMtPnN0YXRlX29uX2RwbGxfZ2V0KHBpbi0+ZHBsbF9w aW4sIHBpbiwKKwkJCQkJICAgIHNpdGRwbGwtPmRwbGxfZGV2LCBzaXRkcGxsLAorCQkJCQkgICAg JnN0YXRlLCBOVUxMKTsKKwkJaWYgKHJjKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0YXRlICE9 IHBpbi0+cGluX3N0YXRlKSB7CisJCQlkZXZfZGJnKHNpdGRldi0+ZGV2LCAiJXMgc3RhdGUgY2hh bmdlZDogJXUtPiV1XG4iLAorCQkJCXBpbi0+bGFiZWwsIHBpbi0+cGluX3N0YXRlLCBzdGF0ZSk7 CisJCQlwaW4tPnBpbl9zdGF0ZSA9IHN0YXRlOworCQkJZHBsbF9waW5fY2hhbmdlX250ZihwaW4t PmRwbGxfcGluKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZHBsbC9zaXQ5NTMx eC9kcGxsLmggYi9kcml2ZXJzL2RwbGwvc2l0OTUzMXgvZHBsbC5oCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uZTVlZWY0NTE0YmNkCi0tLSAvZGV2L251bGwKKysrIGIv ZHJpdmVycy9kcGxsL3NpdDk1MzF4L2RwbGwuaApAQCAtMCwwICsxLDY5IEBACisvKiBTUERYLUxp Y2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLworLyoKKyAqIFNpVGltZSBTaVQ5NTMxeCBEUExM IHN1YnN5c3RlbSBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjYgU2lUaW1lIENv cnAuCisgKiBBdXRob3I6IEFsaSBSb3VoaSA8YXJvdWhpQHNpdGltZS5jb20+CisgKiBBdXRob3I6 IE9sZWcgWmFkb3JvemhueWkgPE9sZWcuWmFkb3JvemhueWlAZGV2b3hzb2Z0d2FyZS5jb20+Cisg KgorICogRFBMTCBkZXZpY2UgYW5kIHBpbiBzdHJ1Y3R1cmVzLCBhbmQgZnVuY3Rpb24gZGVjbGFy YXRpb25zIGZvcgorICogdGhlIERQTEwgcmVnaXN0cmF0aW9uIGFuZCBjYWxsYmFjayBsYXllci4K KyAqLworCisjaWZuZGVmIF9TSVQ5NTMxWF9EUExMX0gKKyNkZWZpbmUgX1NJVDk1MzFYX0RQTExf SAorCisjaW5jbHVkZSA8bGludXgvZHBsbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNp bmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitzdHJ1Y3Qgc2l0OTUzMXhfZGV2OworCisvKiBQZXIt cGluIERQTEwgc3RhdGUuICovCitzdHJ1Y3Qgc2l0OTUzMXhfZHBsbF9waW4geworCXN0cnVjdCBs aXN0X2hlYWQJCWxpc3Q7CisJc3RydWN0IHNpdDk1MzF4X2RwbGwJCSpkcGxsOworCXN0cnVjdCBk cGxsX3BpbgkJCSpkcGxsX3BpbjsKKwlkcGxsX3RyYWNrZXIJCQl0cmFja2VyOworCXN0cnVjdCBm d25vZGVfaGFuZGxlCQkqZndub2RlOworCWNoYXIJCQkJbGFiZWxbOF07CS8qICJJTjAiLCAiT1VU MyIgKi8KKwllbnVtIGRwbGxfcGluX2RpcmVjdGlvbgkJZGlyOworCXU4CQkJCWlkOwkJLyogaGFy ZHdhcmUgaW5kZXggKi8KKwl1OAkJCQlwcmlvOworCWVudW0gZHBsbF9waW5fc3RhdGUJCXBpbl9z dGF0ZTsKKwlzMzIJCQkJcGhhc2VfYWRqdXN0OwkvKiBwaWNvc2Vjb25kcyAqLworCXM2NAkJCQlw aGFzZV9vZmZzZXQ7CS8qIHBpY29zZWNvbmRzICovCisJYm9vbAkJCQllc3luY19jb250cm9sOwor CXU2NAkJCQllc3luY19mcmVxOwkvKiAwID09IGRpc2FibGVkICovCit9OworCisvKiBQZXItUExM IERQTEwgZGV2aWNlIHN0YXRlLiAqLworc3RydWN0IHNpdDk1MzF4X2RwbGwgeworCXN0cnVjdCBs aXN0X2hlYWQJCWxpc3Q7CisJc3RydWN0IHNpdDk1MzF4X2RldgkJKmRldjsKKwlzdHJ1Y3QgZHBs bF9kZXZpY2UJCSpkcGxsX2RldjsKKwlkcGxsX3RyYWNrZXIJCQl0cmFja2VyOworCXN0cnVjdCBk cGxsX2RldmljZV9vcHMJCW9wczsJLyogcGVyLWluc3RhbmNlIGNvcHkgKi8KKwlzdHJ1Y3QgbGlz dF9oZWFkCQlwaW5zOworCXU4CQkJCWlkOwkvKiAwID0gUExMQSAuLiAzID0gUExMRCAqLworCWVu dW0gZHBsbF9sb2NrX3N0YXR1cwkJbG9ja19zdGF0dXM7Cit9OworCisvKiAtLS0tIERQTEwgYWxs b2NhdGlvbiBhbmQgcmVnaXN0cmF0aW9uIC0tLS0gKi8KKy8qCisgKiBUaGUgY2FsbGJhY2sgdGFi bGVzIHN0YXkgd2l0aCB0aGUgY2FsbGJhY2tzOyB0aGUgcmVnaXN0cmF0aW9uIGNvZGUgdGhhdAor ICogaGFuZHMgdGhlbSB0byB0aGUgc3Vic3lzdGVtIGxpdmVzIG5leHQgdG8gcHJvYmUoKSBpbiBj b3JlLmMuCisgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgZHBsbF9kZXZpY2Vfb3BzIHNpdDk1MzF4 X2RwbGxfZGV2aWNlX29wczsKK2NvbnN0IHN0cnVjdCBkcGxsX3Bpbl9vcHMgKgorc2l0OTUzMXhf ZHBsbF9waW5fb3BzX2dldChjb25zdCBzdHJ1Y3Qgc2l0OTUzMXhfZHBsbF9waW4gKnBpbik7CisK K3N0cnVjdCBzaXQ5NTMxeF9kcGxsICpzaXQ5NTMxeF9kcGxsX2FsbG9jKHN0cnVjdCBzaXQ5NTMx eF9kZXYgKnNpdGRldiwgdTggY2gpOwordm9pZCBzaXQ5NTMxeF9kcGxsX2ZyZWUoc3RydWN0IHNp dDk1MzF4X2RwbGwgKnNpdGRwbGwpOworaW50ICBzaXQ5NTMxeF9kcGxsX3JlZ2lzdGVyKHN0cnVj dCBzaXQ5NTMxeF9kcGxsICpzaXRkcGxsKTsKK3ZvaWQgc2l0OTUzMXhfZHBsbF91bnJlZ2lzdGVy KHN0cnVjdCBzaXQ5NTMxeF9kcGxsICpzaXRkcGxsKTsKKworLyogLS0tLSBQZXJpb2RpYyBjaGFu Z2UgZGV0ZWN0aW9uIC0tLS0gKi8KK3ZvaWQgc2l0OTUzMXhfZHBsbF9jaGFuZ2VzX2NoZWNrKHN0 cnVjdCBzaXQ5NTMxeF9kcGxsICpzaXRkcGxsKTsKKworI2VuZGlmIC8qIF9TSVQ5NTMxWF9EUExM X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZHBsbC9zaXQ5NTMxeC9wcm9wLmMgYi9kcml2ZXJz L2RwbGwvc2l0OTUzMXgvcHJvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwMC4uOGEwMTA1YzhjNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kcGxsL3NpdDk1 MzF4L3Byb3AuYwpAQCAtMCwwICsxLDM5NyBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6 IEdQTC0yLjAKKy8qCisgKiBTaVRpbWUgU2lUOTUzMXggZmlybXdhcmUgbm9kZSBwcm9wZXJ0eSBw YXJzaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDI2IFNpVGltZSBDb3JwLgorICogQXV0aG9y OiBBbGkgUm91aGkgPGFyb3VoaUBzaXRpbWUuY29tPgorICogQXV0aG9yOiBPbGVnIFphZG9yb3po bnlpIDxPbGVnLlphZG9yb3pobnlpQGRldm94c29mdHdhcmUuY29tPgorICoKKyAqIFJldHJpZXZl cyBwaW4gcHJvcGVydGllcyBmcm9tIERldmljZSBUcmVlIGZpcm13YXJlIG5vZGVzIChvcgorICog YXBwbGllcyBkZWZhdWx0cyB3aGVuIG5vIGZpcm13YXJlIG5vZGUgZXhpc3RzKS4KKyAqLworCisj aW5jbHVkZSA8bGludXgvZGV2X3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L2RwbGwuaD4KKyNp bmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9md25vZGUuaD4KKyNpbmNsdWRl IDxsaW51eC9wcm9wZXJ0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxs aW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJwcm9wLmgiCisK Ky8qCisgKiBzaXQ5NTMxeF9pbnB1dF9waW5fbGFiZWwgLSBmaWxsIHRoZSBwYWNrYWdlIGxhYmVs IGZvciBhbiBpbnB1dCBwaW4KKyAqCisgKiBTcGxpdCBvdXQgc28gaW5wdXQtbmFtaW5nIGNoYW5n ZXMgc3RheSBsb2NhbCB0byB0aGlzIGhlbHBlci4KKyAqLworc3RhdGljIHZvaWQgc2l0OTUzMXhf aW5wdXRfcGluX2xhYmVsKHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwKKwkJCQkgICAgIHN0 cnVjdCBzaXQ5NTMxeF9waW5fcHJvcHMgKnByb3BzLCB1OCBpZCkKK3sKKwl1OCBwYWlyID0gc2l0 OTUzMXhfaW5wdXRfcGFpcihpZCk7CisKKwlpZiAoc2l0ZGV2LT5yZWZbaWRdLnNpZ19tb2RlID09 IFNJVDk1MzFYX01PREVfREUpCisJCXNucHJpbnRmKHByb3BzLT5wYWNrYWdlX2xhYmVsLAorCQkJ IHNpemVvZihwcm9wcy0+cGFja2FnZV9sYWJlbCksICJJTiV1IiwgcGFpcik7CisJZWxzZQorCQlz bnByaW50Zihwcm9wcy0+cGFja2FnZV9sYWJlbCwKKwkJCSBzaXplb2YocHJvcHMtPnBhY2thZ2Vf bGFiZWwpLCAiSU4ldSVjIiwgcGFpciwKKwkJCSBzaXQ5NTMxeF9pbnB1dF9pc19uKGlkKSA/ICdO JyA6ICdQJyk7Cit9CisKKy8qCisgKiBzaXQ5NTMxeF9wcm9wX3Bpbl9wYWNrYWdlX2xhYmVsX3Nl dCAtIGdlbmVyYXRlIHBhY2thZ2UgbGFiZWwKKyAqIEBkaXI6CXBpbiBkaXJlY3Rpb24KKyAqIEBp ZDoJCXBpbiBpbmRleAorICoKKyAqIEdlbmVyYXRlcyBhIHBhY2thZ2UgbGFiZWwgc3RyaW5nLiAg T3V0cHV0IHBpbnMgYXJlIG5hbWVkICJPVVQwIiwKKyAqICJPVVQxIiwgLi4uICBJbnB1dCBwaW5z IGFyZSBuYW1lZCBhZnRlciB0aGUgcGh5c2ljYWwgcGFpciBhbmQgbGFuZToKKyAqICJJTjBQIiwg IklOME4iLCAiSU4xUCIsIC4uLiBmb3Igc2luZ2xlLWVuZGVkIGxhbmVzLCBvciAiSU4wIiwKKyAq ICJJTjEiLCAuLi4gd2hlbiB0aGUgcGFpciBpcyBjb25maWd1cmVkIGRpZmZlcmVudGlhbCAodGhl IE4gbGFuZSBpcworICogbm90IHJlZ2lzdGVyZWQgaW4gdGhhdCBjYXNlKS4KKyAqLworc3RhdGlj IHZvaWQKK3NpdDk1MzF4X3Byb3BfcGluX3BhY2thZ2VfbGFiZWxfc2V0KHN0cnVjdCBzaXQ5NTMx eF9kZXYgKnNpdGRldiwKKwkJCQkgICAgc3RydWN0IHNpdDk1MzF4X3Bpbl9wcm9wcyAqcHJvcHMs CisJCQkJICAgIGVudW0gZHBsbF9waW5fZGlyZWN0aW9uIGRpciwgdTggaWQpCit7CisJLyogVGhl IGludGVybmFsIElOVFNZTkMgcGluIGhhcyBhIGZpeGVkIGxhYmVsICovCisJaWYgKGRpciA9PSBE UExMX1BJTl9ESVJFQ1RJT05fSU5QVVQgJiYKKwkgICAgaWQgPT0gU0lUOTUzMVhfSU5UU1lOQ19Q SU5fSUQpIHsKKwkJc3Ryc2NweShwcm9wcy0+cGFja2FnZV9sYWJlbCwgIklOVFNZTkMiLAorCQkJ c2l6ZW9mKHByb3BzLT5wYWNrYWdlX2xhYmVsKSk7CisJCXByb3BzLT5kcGxsX3Byb3BzLnBhY2th Z2VfbGFiZWwgPSBwcm9wcy0+cGFja2FnZV9sYWJlbDsKKwkJcmV0dXJuOworCX0KKworCS8qIFRo ZSBpbnRlcm5hbCBYTyByZWZlcmVuY2UgaGFzIGEgZml4ZWQgbGFiZWwgKi8KKwlpZiAoZGlyID09 IERQTExfUElOX0RJUkVDVElPTl9JTlBVVCAmJiBpZCA9PSBTSVQ5NTMxWF9NQVhfSU5QVVRTKSB7 CisJCXN0cnNjcHkocHJvcHMtPnBhY2thZ2VfbGFiZWwsICJYTyIsCisJCQlzaXplb2YocHJvcHMt PnBhY2thZ2VfbGFiZWwpKTsKKwkJcHJvcHMtPmRwbGxfcHJvcHMucGFja2FnZV9sYWJlbCA9IHBy b3BzLT5wYWNrYWdlX2xhYmVsOworCQlyZXR1cm47CisJfQorCisJLyogVGhlIGludGVybmFsIElO VFNZTkMgc291cmNlIChvdXRwdXQpIHBpbiBoYXMgYSBmaXhlZCBsYWJlbCAqLworCWlmIChkaXIg PT0gRFBMTF9QSU5fRElSRUNUSU9OX09VVFBVVCAmJgorCSAgICBpZCA9PSBTSVQ5NTMxWF9JTlRT WU5DX09VVF9QSU5fSUQpIHsKKwkJc3Ryc2NweShwcm9wcy0+cGFja2FnZV9sYWJlbCwgIlNZTkNP VVQiLAorCQkJc2l6ZW9mKHByb3BzLT5wYWNrYWdlX2xhYmVsKSk7CisJCXByb3BzLT5kcGxsX3By b3BzLnBhY2thZ2VfbGFiZWwgPSBwcm9wcy0+cGFja2FnZV9sYWJlbDsKKwkJcmV0dXJuOworCX0K KworCWlmIChkaXIgPT0gRFBMTF9QSU5fRElSRUNUSU9OX0lOUFVUKQorCQlzaXQ5NTMxeF9pbnB1 dF9waW5fbGFiZWwoc2l0ZGV2LCBwcm9wcywgaWQpOworCWVsc2UKKwkJc25wcmludGYocHJvcHMt PnBhY2thZ2VfbGFiZWwsIHNpemVvZihwcm9wcy0+cGFja2FnZV9sYWJlbCksCisJCQkgIk9VVCV1 IiwgaWQpOworCisJcHJvcHMtPmRwbGxfcHJvcHMucGFja2FnZV9sYWJlbCA9IHByb3BzLT5wYWNr YWdlX2xhYmVsOworfQorCisvKgorICogc2l0OTUzMXhfcHJvcF9waW5fZndub2RlX2dldCAtIGZp bmQgZmlybXdhcmUgbm9kZSBmb3IgYSBwaW4KKyAqIEBkaXI6CXBpbiBkaXJlY3Rpb24KKyAqIEBp ZDoJCXBpbiBpbmRleAorICoKKyAqIFNlYXJjaGVzIGZvciBpbnB1dC1waW5zL291dHB1dC1waW5z IGNoaWxkIG5vZGVzIGluIERULCBsb29raW5nCisgKiBmb3IgYSBjaGlsZCB3aG9zZSAicmVnIiBw cm9wZXJ0eSBtYXRjaGVzIEBpZC4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLUVOT0VO VCBpZiBubyBmaXJtd2FyZSBub2RlIGV4aXN0cworICovCitzdGF0aWMgaW50CitzaXQ5NTMxeF9w cm9wX3Bpbl9md25vZGVfZ2V0KHN0cnVjdCBzaXQ5NTMxeF9kZXYgKnNpdGRldiwKKwkJCSAgICAg c3RydWN0IHNpdDk1MzF4X3Bpbl9wcm9wcyAqcHJvcHMsCisJCQkgICAgIGVudW0gZHBsbF9waW5f ZGlyZWN0aW9uIGRpciwgdTggaWQpCit7CisJc3RydWN0IGZ3bm9kZV9oYW5kbGUgKnBpbnNfbm9k ZSwgKnBpbl9ub2RlOworCWNvbnN0IGNoYXIgKm5vZGVfbmFtZTsKKworCWlmIChkaXIgPT0gRFBM TF9QSU5fRElSRUNUSU9OX0lOUFVUKQorCQlub2RlX25hbWUgPSAiaW5wdXQtcGlucyI7CisJZWxz ZQorCQlub2RlX25hbWUgPSAib3V0cHV0LXBpbnMiOworCisJcGluc19ub2RlID0gZGV2aWNlX2dl dF9uYW1lZF9jaGlsZF9ub2RlKHNpdGRldi0+ZGV2LCBub2RlX25hbWUpOworCWlmICghcGluc19u b2RlKSB7CisJCWRldl9kYmcoc2l0ZGV2LT5kZXYsICInJXMnIHN1Yi1ub2RlIGlzIG1pc3Npbmdc biIsIG5vZGVfbmFtZSk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCS8qIEVudW1lcmF0ZSBj aGlsZCBwaW4gbm9kZXMgYW5kIGZpbmQgdGhlIHJlcXVlc3RlZCBvbmUgKi8KKwlmd25vZGVfZm9y X2VhY2hfY2hpbGRfbm9kZShwaW5zX25vZGUsIHBpbl9ub2RlKSB7CisJCXUzMiByZWc7CisKKwkJ aWYgKGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3UzMihwaW5fbm9kZSwgInJlZyIsICZyZWcpKQorCQkJ Y29udGludWU7CisKKwkJaWYgKGlkID09IHJlZykKKwkJCWJyZWFrOworCX0KKworCWZ3bm9kZV9o YW5kbGVfcHV0KHBpbnNfbm9kZSk7CisKKwlwcm9wcy0+Zndub2RlID0gcGluX25vZGU7CisKKwlk ZXZfZGJnKHNpdGRldi0+ZGV2LCAiRmlybXdhcmUgbm9kZSBmb3IgJXMgJXNmb3VuZFxuIiwKKwkJ cHJvcHMtPnBhY2thZ2VfbGFiZWwsIHBpbl9ub2RlID8gIiIgOiAiTk9UICIpOworCisJcmV0dXJu IHBpbl9ub2RlID8gMCA6IC1FTk9FTlQ7Cit9CisKKy8qCisgKiBzaXQ5NTMxeF9waW5fcHJvcHNf Z2V0IC0gZ2V0IHBpbiBwcm9wZXJ0aWVzIGZvciBhIGdpdmVuIHBpbgorICogQGRpcjoJcGluIGRp cmVjdGlvbiAoSU5QVVQgb3IgT1VUUFVUKQorICogQGluZGV4OglwaW4gaW5kZXgKKyAqCisgKiBB bGxvY2F0ZXMgYSBwaW4gcHJvcGVydGllcyBzdHJ1Y3R1cmUsIGdlbmVyYXRlcyBhIHBhY2thZ2Ug bGFiZWwsCisgKiBsb29rcyB1cCB0aGUgZmlybXdhcmUgbm9kZSBpZiBhdmFpbGFibGUsIGFuZCBy ZWFkcyBvcHRpb25hbAorICogcHJvcGVydGllcyAobGFiZWwsIGNvbm5lY3Rpb24tdHlwZSwgc3Vw cG9ydGVkLWZyZXF1ZW5jaWVzLWh6LAorICogZXN5bmMtY29udHJvbCkuCisgKgorICogQ2FsbCBz aXQ5NTMxeF9waW5fcHJvcHNfcHV0KCkgdG8gZnJlZSB0aGUgcmV0dXJuZWQgc3RydWN0dXJlLgor ICoKKyAqIFJldHVybjogcG9pbnRlciB0byBwaW4gcHJvcGVydGllcyBvbiBzdWNjZXNzLCBlcnJv ciBwb2ludGVyIG9uIGVycm9yCisgKi8KK3N0cnVjdCBzaXQ5NTMxeF9waW5fcHJvcHMgKgorc2l0 OTUzMXhfcGluX3Byb3BzX2dldChzdHJ1Y3Qgc2l0OTUzMXhfZGV2ICpzaXRkZXYsCisJCSAgICAg ICBlbnVtIGRwbGxfcGluX2RpcmVjdGlvbiBkaXIsIHU4IGluZGV4KQoreworCXN0cnVjdCBkcGxs X3Bpbl9mcmVxdWVuY3kgKnJhbmdlczsKKwlzdHJ1Y3Qgc2l0OTUzMXhfcGluX3Byb3BzICpwcm9w czsKKwlpbnQgaSwgaiwgbnVtX2ZyZXFzID0gMCwgcmM7CisJdTY0ICpmcmVxcyA9IE5VTEw7CisJ Y29uc3QgY2hhciAqdHlwZTsKKwl1MzIgY3Vycl9mcmVxOworCisJcHJvcHMgPSBremFsbG9jX29i aigqcHJvcHMsIEdGUF9LRVJORUwpOworCWlmICghcHJvcHMpCisJCXJldHVybiBFUlJfUFRSKC1F Tk9NRU0pOworCisJaWYgKGRpciA9PSBEUExMX1BJTl9ESVJFQ1RJT05fSU5QVVQgJiYKKwkgICAg aW5kZXggPT0gU0lUOTUzMVhfSU5UU1lOQ19QSU5fSUQpIHsKKwkJLyoKKwkJICogSU5UU1lOQyBk ZXN0aW5hdGlvbiBwaW46IGEgUExMIGxvY2tzIHRvIHRoZSBJTlRTWU5DIG5ldCBhcyBhCisJCSAq IHJlZmVyZW5jZSwgc28gaXQgY2FuIGJlIGNvbm5lY3RlZCBhbmQgcmUtcHJpb3JpdGlzZWQuCisJ CSAqLworCQlwcm9wcy0+ZHBsbF9wcm9wcy50eXBlID0gRFBMTF9QSU5fVFlQRV9JTlRfT1NDSUxM QVRPUjsKKwkJcHJvcHMtPmRwbGxfcHJvcHMuY2FwYWJpbGl0aWVzID0KKwkJCURQTExfUElOX0NB UEFCSUxJVElFU19QUklPUklUWV9DQU5fQ0hBTkdFIHwKKwkJCURQTExfUElOX0NBUEFCSUxJVElF U19TVEFURV9DQU5fQ0hBTkdFOworCQljdXJyX2ZyZXEgPSAwOworCX0gZWxzZSBpZiAoZGlyID09 IERQTExfUElOX0RJUkVDVElPTl9PVVRQVVQgJiYKKwkJICAgaW5kZXggPT0gU0lUOTUzMVhfSU5U U1lOQ19PVVRfUElOX0lEKSB7CisJCS8qCisJCSAqIElOVFNZTkMgc291cmNlIHBpbjogYSBQTEwg ZHJpdmVzIHRoZSBJTlRTWU5DIG5ldC4gIEl0IGNhbiBiZQorCQkgKiBjb25uZWN0ZWQvZGlzY29u bmVjdGVkIGJ1dCBjYXJyaWVzIG5vIHByaW9yaXR5IChkcml2aW5nIHRoZQorCQkgKiBuZXQgaXMg bm90IGEgcmVmZXJlbmNlIHNlbGVjdGlvbikgYW5kIG5vIGZyZXF1ZW5jeS4KKwkJICovCisJCXBy b3BzLT5kcGxsX3Byb3BzLnR5cGUgPSBEUExMX1BJTl9UWVBFX0lOVF9PU0NJTExBVE9SOworCQlw cm9wcy0+ZHBsbF9wcm9wcy5jYXBhYmlsaXRpZXMgPQorCQkJRFBMTF9QSU5fQ0FQQUJJTElUSUVT X1NUQVRFX0NBTl9DSEFOR0U7CisJCWN1cnJfZnJlcSA9IDA7CisJfSBlbHNlIGlmIChkaXIgPT0g RFBMTF9QSU5fRElSRUNUSU9OX0lOUFVUICYmCisJCSAgIGluZGV4ID09IFNJVDk1MzFYX01BWF9J TlBVVFMpIHsKKwkJLyogVGhlIFhPIHJlZmVyZW5jZSBpcyBmaXhlZDogbm8gc3RhdGUgb3IgcHJp b3JpdHkgY29udHJvbC4gKi8KKwkJcHJvcHMtPmRwbGxfcHJvcHMudHlwZSA9IERQTExfUElOX1RZ UEVfSU5UX09TQ0lMTEFUT1I7CisJCXByb3BzLT5kcGxsX3Byb3BzLmNhcGFiaWxpdGllcyA9IDA7 CisJCXNpdGRldi0+cmVmW2luZGV4XS5mcmVxID0gc2l0ZGV2LT54dGFsX2ZyZXE7CisJCWN1cnJf ZnJlcSA9IHNpdGRldi0+eHRhbF9mcmVxOworCX0gZWxzZSBpZiAoZGlyID09IERQTExfUElOX0RJ UkVDVElPTl9JTlBVVCkgeworCQlwcm9wcy0+ZHBsbF9wcm9wcy50eXBlID0gRFBMTF9QSU5fVFlQ RV9FWFQ7CisJCXByb3BzLT5kcGxsX3Byb3BzLmNhcGFiaWxpdGllcyA9CisJCQlEUExMX1BJTl9D QVBBQklMSVRJRVNfUFJJT1JJVFlfQ0FOX0NIQU5HRSB8CisJCQlEUExMX1BJTl9DQVBBQklMSVRJ RVNfU1RBVEVfQ0FOX0NIQU5HRTsKKwkJY3Vycl9mcmVxID0gc2l0ZGV2LT5yZWZbaW5kZXhdLmZy ZXE7CisJfSBlbHNlIHsKKwkJcHJvcHMtPmRwbGxfcHJvcHMudHlwZSA9IERQTExfUElOX1RZUEVf R05TUzsKKwkJcHJvcHMtPmRwbGxfcHJvcHMuY2FwYWJpbGl0aWVzID0KKwkJCURQTExfUElOX0NB UEFCSUxJVElFU19TVEFURV9DQU5fQ0hBTkdFOworCQljdXJyX2ZyZXEgPSBzaXRkZXYtPm91dFtp bmRleF0uZnJlcTsKKwl9CisKKwkvKiBBbGxvdyBwaGFzZS1hZGp1c3Qgb3ZlciArLy0xIG1zIHdp bmRvdy4gIFRoZSBzdWJzeXN0ZW0gcmVqZWN0cworCSAqIHBpbl9zZXQocGhhc2UtYWRqdXN0LCBY KSB3aGVuIFggZmFsbHMgb3V0c2lkZSBbbWluLCBtYXhdLCBzbworCSAqIGxlYXZpbmcgdGhlc2Ug YXQgMCBzaWxlbnRseSBibG9ja3MgZXZlcnkgbmV0bGluayBjYWxsLiAgMSBtcyBpcworCSAqIHdl bGwgYmV5b25kIHRoZSBEQ08gZHluYW1pYyByYW5nZSBidXQgY29zdHMgbm90aGluZy4KKwkgKi8K Kwlwcm9wcy0+ZHBsbF9wcm9wcy5waGFzZV9yYW5nZS5taW4gPSAtMTAwMDAwMDAwMDsgLyogLTEg bXMgaW4gcHMgKi8KKwlwcm9wcy0+ZHBsbF9wcm9wcy5waGFzZV9yYW5nZS5tYXggPSAgMTAwMDAw MDAwMDsgLyogKzEgbXMgaW4gcHMgKi8KKworCS8qIEdlbmVyYXRlIHBhY2thZ2UgbGFiZWwgKi8K KwlzaXQ5NTMxeF9wcm9wX3Bpbl9wYWNrYWdlX2xhYmVsX3NldChzaXRkZXYsIHByb3BzLCBkaXIs IGluZGV4KTsKKworCS8qCisJICogQm90aCBJTlRTWU5DIHBpbnMgYXJlIGludGVybmFsIHRvIHRo ZSBjaGlwIGFuZCBoYXZlIG5vIGJvYXJkLWxldmVsCisJICogd2lyaW5nLCBzbyB0aGV5IHRha2Ug bm8gcHJvcGVydGllcyBmcm9tIHRoZSBmaXJtd2FyZSBub2RlLgorCSAqLworCWlmIChkaXIgPT0g RFBMTF9QSU5fRElSRUNUSU9OX0lOUFVUICYmCisJICAgIGluZGV4ID09IFNJVDk1MzFYX0lOVFNZ TkNfUElOX0lEKQorCQlnb3RvIHNraXBfZndub2RlX3Byb3BzOworCWlmIChkaXIgPT0gRFBMTF9Q SU5fRElSRUNUSU9OX09VVFBVVCAmJgorCSAgICBpbmRleCA9PSBTSVQ5NTMxWF9JTlRTWU5DX09V VF9QSU5fSUQpCisJCWdvdG8gc2tpcF9md25vZGVfcHJvcHM7CisKKwlyYyA9IHNpdDk1MzF4X3By b3BfcGluX2Z3bm9kZV9nZXQoc2l0ZGV2LCBwcm9wcywgZGlyLCBpbmRleCk7CisJaWYgKHJjKQor CQlnb3RvIHNraXBfZndub2RlX3Byb3BzOworCisJLyogTG9vayBmb3IgImxhYmVsIiBwcm9wZXJ0 eSAtPiBib2FyZCBsYWJlbCAqLworCWZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3N0cmluZyhwcm9wcy0+ Zndub2RlLCAibGFiZWwiLAorCQkJCSAgICAmcHJvcHMtPmRwbGxfcHJvcHMuYm9hcmRfbGFiZWwp OworCisJLyogTG9vayBmb3IgImNvbm5lY3Rpb24tdHlwZSIgcHJvcGVydHkgLT4gcGluIHR5cGUg ZW51bSAqLworCWlmICghZndub2RlX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHByb3BzLT5md25vZGUs ICJjb25uZWN0aW9uLXR5cGUiLAorCQkJCQkgJnR5cGUpKSB7CisJCWlmICghc3RyY21wKHR5cGUs ICJleHQiKSkKKwkJCXByb3BzLT5kcGxsX3Byb3BzLnR5cGUgPSBEUExMX1BJTl9UWVBFX0VYVDsK KwkJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAiZ25zcyIpKQorCQkJcHJvcHMtPmRwbGxfcHJvcHMu dHlwZSA9IERQTExfUElOX1RZUEVfR05TUzsKKwkJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAiaW50 IikgfHwKKwkJCSAhc3RyY21wKHR5cGUsICJpbnQtb3NjaWxsYXRvciIpKQorCQkJcHJvcHMtPmRw bGxfcHJvcHMudHlwZSA9IERQTExfUElOX1RZUEVfSU5UX09TQ0lMTEFUT1I7CisJCWVsc2UgaWYg KCFzdHJjbXAodHlwZSwgInN5bmNlIikgfHwKKwkJCSAhc3RyY21wKHR5cGUsICJzeW5jZS1ldGgt cG9ydCIpKQorCQkJcHJvcHMtPmRwbGxfcHJvcHMudHlwZSA9IERQTExfUElOX1RZUEVfU1lOQ0Vf RVRIX1BPUlQ7CisJCWVsc2UgaWYgKCFzdHJjbXAodHlwZSwgIm11eCIpKQorCQkJcHJvcHMtPmRw bGxfcHJvcHMudHlwZSA9IERQTExfUElOX1RZUEVfTVVYOworCQllbHNlCisJCQlkZXZfd2Fybihz aXRkZXYtPmRldiwKKwkJCQkgIlVua25vd24gcGluIHR5cGUgJyVzJ1xuIiwgdHlwZSk7CisJfQor CisJcHJvcHMtPmVzeW5jX2NvbnRyb2wgPQorCQlmd25vZGVfcHJvcGVydHlfcmVhZF9ib29sKHBy b3BzLT5md25vZGUsICJlc3luYy1jb250cm9sIik7CisKKwludW1fZnJlcXMgPSBmd25vZGVfcHJv cGVydHlfY291bnRfdTY0KHByb3BzLT5md25vZGUsCisJCQkJCSAgICAgICJzdXBwb3J0ZWQtZnJl cXVlbmNpZXMtaHoiKTsKKwlpZiAobnVtX2ZyZXFzIDw9IDApIHsKKwkJbnVtX2ZyZXFzID0gMDsK KwkJZ290byBza2lwX2Z3bm9kZV9wcm9wczsKKwl9CisKKwlmcmVxcyA9IGtjYWxsb2MobnVtX2Zy ZXFzLCBzaXplb2YoKmZyZXFzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmcmVxcykgeworCQlyYyA9 IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jX2ZyZXFzOworCX0KKworCWZ3bm9kZV9wcm9wZXJ0 eV9yZWFkX3U2NF9hcnJheShwcm9wcy0+Zndub2RlLAorCQkJCSAgICAgICAic3VwcG9ydGVkLWZy ZXF1ZW5jaWVzLWh6IiwKKwkJCQkgICAgICAgZnJlcXMsIG51bV9mcmVxcyk7CisKKwkvKgorCSAq IFNlZWQgdGhlIHJ1bnRpbWUgcmVmLT5mcmVxIC8gb3V0LT5mcmVxIHdpdGggdGhlIGZpcnN0IERU LWxpc3RlZAorCSAqIHN1cHBvcnRlZCBmcmVxdWVuY3kgc28gdGhlIG5ldGxpbmsgZnJlcXVlbmN5 X2dldCBjYWxsYmFjayByZXBvcnRzCisJICogYSBzYW5lIGluaXRpYWwgdmFsdWUgYmVmb3JlIGFu eSBwaW5fc2V0IG9jY3Vycy4gIERUIGxpc3RzIHRoZQorCSAqIHBoeXNpY2FsbHktd2lyZWQgcmVm ZXJlbmNlIGZyZXF1ZW5jeSBmb3IgZWFjaCBpbnB1dCBwaW4gYW5kIHRoZQorCSAqIGRlZmF1bHQg b3V0cHV0IGZyZXF1ZW5jeSBmb3IgZWFjaCBvdXRwdXQgcGluLgorCSAqLworCWlmIChudW1fZnJl cXMgPiAwKSB7CisJCWlmIChkaXIgPT0gRFBMTF9QSU5fRElSRUNUSU9OX0lOUFVUKQorCQkJc2l0 ZGV2LT5yZWZbaW5kZXhdLmZyZXEgPSAodTMyKWZyZXFzWzBdOworCQllbHNlCisJCQlzaXRkZXYt Pm91dFtpbmRleF0uZnJlcSA9ICh1MzIpZnJlcXNbMF07CisJCWN1cnJfZnJlcSA9ICh1MzIpZnJl cXNbMF07CisJfQorCitza2lwX2Z3bm9kZV9wcm9wczoKKwkvKiBOZWl0aGVyIElOVFNZTkMgcGlu IGNhcnJpZXMgYSBmcmVxdWVuY3kgYXR0cmlidXRlICovCisJaWYgKGRpciA9PSBEUExMX1BJTl9E SVJFQ1RJT05fSU5QVVQgJiYKKwkgICAgaW5kZXggPT0gU0lUOTUzMVhfSU5UU1lOQ19QSU5fSUQp CisJCXJldHVybiBwcm9wczsKKwlpZiAoZGlyID09IERQTExfUElOX0RJUkVDVElPTl9PVVRQVVQg JiYKKwkgICAgaW5kZXggPT0gU0lUOTUzMVhfSU5UU1lOQ19PVVRfUElOX0lEKQorCQlyZXR1cm4g cHJvcHM7CisKKwkvKiBBbGxvY2F0ZSBmcmVxdWVuY3kgcmFuZ2VzIGxpc3QgLS0gRFQgZGlzY3Jl dGUgZW50cmllcyArIGN1cnJlbnQKKwkgKiBmcmVxICsgb25lIGNhdGNoLWFsbCB3aWRlIHJhbmdl IHNvIHRoZSBzdWJzeXN0ZW0gbmV2ZXIgcHJlLQorCSAqIHJlamVjdHMgYSBmcmVxdWVuY3lfc2V0 IGNhbGwuICBUaGUgY2hpcCdzIHJlYWwgYWRtaXNzaWJsZSBzZXQKKwkgKiBpcyBib3VuZGVkIGJ5 IFZDTyAvIGRpdmlkZXIgbWF0aCBpbiBzaXQ5NTMxeF9vdXRwdXRfZnJlcV9zZXQoKS4KKwkgKi8K KwlyYW5nZXMgPSBrY2FsbG9jKG51bV9mcmVxcyArIDIsIHNpemVvZigqcmFuZ2VzKSwgR0ZQX0tF Uk5FTCk7CisJaWYgKCFyYW5nZXMpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxv Y19yYW5nZXM7CisJfQorCisJLyogQ3VycmVudCBmcmVxIGFzIGZpcnN0IGVudHJ5ICovCisJcmFu Z2VzWzBdID0gKHN0cnVjdCBkcGxsX3Bpbl9mcmVxdWVuY3kpRFBMTF9QSU5fRlJFUVVFTkNZKGN1 cnJfZnJlcSk7CisJaiA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2ZyZXFzOyBpKyspIHsK KwkJc3RydWN0IGRwbGxfcGluX2ZyZXF1ZW5jeSBmcmVxID0gRFBMTF9QSU5fRlJFUVVFTkNZKGZy ZXFzW2ldKTsKKworCQlpZiAoZnJlcXNbaV0gPT0gY3Vycl9mcmVxKQorCQkJY29udGludWU7CisJ CXJhbmdlc1tqKytdID0gZnJlcTsKKwl9CisKKwkvKiBBbHdheXMgYXBwZW5kIGEgd2lkZSBjYXRj aC1hbGwgcmFuZ2UgKi8KKwlyYW5nZXNbal0ubWluID0gMTsKKwlyYW5nZXNbal0ubWF4ID0gMTAw MDAwMDAwMFVMTDsgLyogMSBHSHogKi8KKwlqKys7CisKKwlwcm9wcy0+ZHBsbF9wcm9wcy5mcmVx X3N1cHBvcnRlZCA9IHJhbmdlczsKKwlwcm9wcy0+ZHBsbF9wcm9wcy5mcmVxX3N1cHBvcnRlZF9u dW0gPSBqOworCisJa2ZyZWUoZnJlcXMpOworCisJcmV0dXJuIHByb3BzOworCitlcnJfYWxsb2Nf cmFuZ2VzOgorCWtmcmVlKGZyZXFzKTsKK2Vycl9hbGxvY19mcmVxczoKKwlmd25vZGVfaGFuZGxl X3B1dChwcm9wcy0+Zndub2RlKTsKKwlrZnJlZShwcm9wcyk7CisKKwlyZXR1cm4gRVJSX1BUUihy Yyk7Cit9CisKKy8qCisgKiBzaXQ5NTMxeF9waW5fcHJvcHNfcHV0IC0gcmVsZWFzZSBwaW4gcHJv cGVydGllcworICogQHByb3BzOglwaW4gcHJvcGVydGllcyB0byBmcmVlCisgKi8KK3ZvaWQgc2l0 OTUzMXhfcGluX3Byb3BzX3B1dChzdHJ1Y3Qgc2l0OTUzMXhfcGluX3Byb3BzICpwcm9wcykKK3sK KwlrZnJlZShwcm9wcy0+ZHBsbF9wcm9wcy5mcmVxX3N1cHBvcnRlZCk7CisKKwlpZiAocHJvcHMt PmZ3bm9kZSkKKwkJZndub2RlX2hhbmRsZV9wdXQocHJvcHMtPmZ3bm9kZSk7CisKKwlrZnJlZShw cm9wcyk7Cit9CisKKy8qCisgKiBzaXQ5NTMxeF9wcm9wX2RwbGxfdHlwZV9nZXQgLSBnZXQgRFBM TCBjaGFubmVsIHR5cGUgZnJvbSBmaXJtd2FyZQorICogQGluZGV4OglEUExMIGNoYW5uZWwgaW5k ZXggKDAtMykKKyAqCisgKiBSZWFkcyB0aGUgImRwbGwtdHlwZXMiIHN0cmluZyBhcnJheSBwcm9w ZXJ0eSBmcm9tIHRoZSBmaXJtd2FyZSBub2RlCisgKiBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9u ZGluZyBEUExMIHR5cGUgZW51bS4KKyAqCisgKiBSZXR1cm46IERQTEwgdHlwZSBmb3IgdGhlIGdp dmVuIGNoYW5uZWwgKGRlZmF1bHQ6IERQTExfVFlQRV9QUFMpCisgKi8KK2VudW0gZHBsbF90eXBl CitzaXQ5NTMxeF9wcm9wX2RwbGxfdHlwZV9nZXQoc3RydWN0IHNpdDk1MzF4X2RldiAqc2l0ZGV2 LCB1OCBpbmRleCkKK3sKKwljb25zdCBjaGFyICp0eXBlc1tTSVQ5NTMxWF9OVU1fUExMU107CisJ aW50IGNvdW50OworCisJY291bnQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9zdHJpbmdfYXJyYXko c2l0ZGV2LT5kZXYsICJkcGxsLXR5cGVzIiwKKwkJCQkJCSAgdHlwZXMsIEFSUkFZX1NJWkUodHlw ZXMpKTsKKworCWlmIChpbmRleCA+PSBjb3VudCkKKwkJcmV0dXJuIERQTExfVFlQRV9QUFM7CisK KwlpZiAoIXN0cmNtcCh0eXBlc1tpbmRleF0sICJwcHMiKSkKKwkJcmV0dXJuIERQTExfVFlQRV9Q UFM7CisJZWxzZSBpZiAoIXN0cmNtcCh0eXBlc1tpbmRleF0sICJlZWMiKSkKKwkJcmV0dXJuIERQ TExfVFlQRV9FRUM7CisKKwlkZXZfd2FybihzaXRkZXYtPmRldiwgIlVua25vd24gRFBMTCB0eXBl ICclcycsIHVzaW5nIGRlZmF1bHRcbiIsCisJCSB0eXBlc1tpbmRleF0pOworCisJcmV0dXJuIERQ TExfVFlQRV9QUFM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RwbGwvc2l0OTUzMXgvcHJvcC5o IGIvZHJpdmVycy9kcGxsL3NpdDk1MzF4L3Byb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMDAuLmY3ZjFjODU0Yjk1NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMv ZHBsbC9zaXQ5NTMxeC9wcm9wLmgKQEAgLTAsMCArMSwzOSBAQAorLyogU1BEWC1MaWNlbnNlLUlk ZW50aWZpZXI6IEdQTC0yLjAgKi8KKy8qCisgKiBTaVRpbWUgU2lUOTUzMXggZmlybXdhcmUgbm9k ZSBwcm9wZXJ0eSBwYXJzaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDI2IFNpVGltZSBDb3Jw LgorICogQXV0aG9yOiBBbGkgUm91aGkgPGFyb3VoaUBzaXRpbWUuY29tPgorICogQXV0aG9yOiBP bGVnIFphZG9yb3pobnlpIDxPbGVnLlphZG9yb3pobnlpQGRldm94c29mdHdhcmUuY29tPgorICov CisKKyNpZm5kZWYgX1NJVDk1MzFYX1BST1BfSAorI2RlZmluZSBfU0lUOTUzMVhfUFJPUF9ICisK KyNpbmNsdWRlIDxsaW51eC9kcGxsLmg+CisjaW5jbHVkZSA8bGludXgvZndub2RlLmg+CisKK3N0 cnVjdCBzaXQ5NTMxeF9kZXY7CisKKy8qCisgKiBzdHJ1Y3Qgc2l0OTUzMXhfcGluX3Byb3BzIC0g cGluIHByb3BlcnRpZXMgZnJvbSBmaXJtd2FyZQorICogQGZ3bm9kZToJCWZpcm13YXJlIG5vZGUg aGFuZGxlIChOVUxMIGlmIG5vIERUIG5vZGUpCisgKiBAZHBsbF9wcm9wczoJCURQTEwgY29yZSBw aW4gcHJvcGVydGllcworICogQHBhY2thZ2VfbGFiZWw6CXBpbiBwYWNrYWdlIGxhYmVsIChlLmcu ICJJTjAiLCAiT1VUMyIpCisgKiBAZXN5bmNfY29udHJvbDoJZW1iZWRkZWQgc3luYyBpcyBjb250 cm9sbGFibGUKKyAqLworc3RydWN0IHNpdDk1MzF4X3Bpbl9wcm9wcyB7CisJc3RydWN0IGZ3bm9k ZV9oYW5kbGUJCSpmd25vZGU7CisJc3RydWN0IGRwbGxfcGluX3Byb3BlcnRpZXMJZHBsbF9wcm9w czsKKwljaGFyCQkJCXBhY2thZ2VfbGFiZWxbOF07CisJYm9vbAkJCQllc3luY19jb250cm9sOwor fTsKKworZW51bSBkcGxsX3R5cGUgc2l0OTUzMXhfcHJvcF9kcGxsX3R5cGVfZ2V0KHN0cnVjdCBz aXQ5NTMxeF9kZXYgKnNpdGRldiwKKwkJCQkJICAgdTggaW5kZXgpOworc3RydWN0IHNpdDk1MzF4 X3Bpbl9wcm9wcyAqc2l0OTUzMXhfcGluX3Byb3BzX2dldChzdHJ1Y3Qgc2l0OTUzMXhfZGV2ICpz aXRkZXYsCisJCQkJCQkgIGVudW0gZHBsbF9waW5fZGlyZWN0aW9uIGRpciwKKwkJCQkJCSAgdTgg aW5kZXgpOwordm9pZCBzaXQ5NTMxeF9waW5fcHJvcHNfcHV0KHN0cnVjdCBzaXQ5NTMxeF9waW5f cHJvcHMgKnByb3BzKTsKKworI2VuZGlmIC8qIF9TSVQ5NTMxWF9QUk9QX0ggKi8KZGlmZiAtLWdp dCBhL2RyaXZlcnMvZHBsbC9zaXQ5NTMxeC9yZWdzLmggYi9kcml2ZXJzL2RwbGwvc2l0OTUzMXgv cmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uNWMzZGJlZWZk ODZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kcGxsL3NpdDk1MzF4L3JlZ3MuaApAQCAt MCwwICsxLDM3MSBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KKy8q CisgKiBTaVRpbWUgU2lUOTUzMXggcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmln aHQgKEMpIDIwMjYgU2lUaW1lIENvcnAuCisgKiBBdXRob3I6IEFsaSBSb3VoaSA8YXJvdWhpQHNp dGltZS5jb20+CisgKiBBdXRob3I6IE9sZWcgWmFkb3JvemhueWkgPE9sZWcuWmFkb3JvemhueWlA ZGV2b3hzb2Z0d2FyZS5jb20+CisgKi8KKworI2lmbmRlZiBfU0lUOTUzMVhfUkVHU19ICisjZGVm aW5lIF9TSVQ5NTMxWF9SRUdTX0gKKworLyoKKyAqIEkyQyByZWdpc3RlciBtb2RlbDoKKyAqICAg LSBQYWdlIHNlbGVjdCByZWdpc3RlciBhdCBvZmZzZXQgMHgwMQorICogICAtIEVhY2ggcGFnZSBo YXMgMTI4IHJlZ2lzdGVycyAoMHgwMC0weDdGKQorICogICAtIFNvbWUgcGFnZXMgYXJlIHBhaXJl ZCAoZS5nLiAweDBBLzB4MUEgZm9yIFBMTEEpCisgKi8KKyNkZWZpbmUgU0lUOTUzMVhfUEFHRV9T RUwJCTB4RkYKKyNkZWZpbmUgU0lUOTUzMVhfUEFHRV9TSVpFCQkweDEwMAorI2RlZmluZSBTSVQ5 NTMxWF9OVU1fUEFHRVMJCTMyCisKKy8qIEhlbHBlciBtYWNyb3MgZm9yIHBhZ2U6b2Zmc2V0IGFk ZHJlc3NpbmcgKi8KKyNkZWZpbmUgU0lUOTUzMVhfUkVHKF9wYWdlLCBfb2Zmc2V0KQkJKCgoX3Bh Z2UpIDw8IDgpIHwgKF9vZmZzZXQpKQorI2RlZmluZSBTSVQ5NTMxWF9SRUdfUEFHRShfcmVnKQkJ KChfcmVnKSA+PiA4KQorI2RlZmluZSBTSVQ5NTMxWF9SRUdfT0ZGU0VUKF9yZWcpCQkoKF9yZWcp ICYgMHhGRikKKworLyogLS0tLSBQYWdlIGRlZmluaXRpb25zIC0tLS0gKi8KKyNkZWZpbmUgU0lU OTUzMVhfUEFHRV9NQUlOU1lTMAkJMHgwMAorI2RlZmluZSBTSVQ5NTMxWF9QQUdFX01BSU5TWVMx CQkweDAxCisjZGVmaW5lIFNJVDk1MzFYX1BBR0VfSU5QVVRTWVMJCTB4MDIKKyNkZWZpbmUgU0lU OTUzMVhfUEFHRV9PVVRTWVMwCQkweDAzCisjZGVmaW5lIFNJVDk1MzFYX1BBR0VfT1VUU1lTMQkJ MHgwNAorI2RlZmluZSBTSVQ5NTMxWF9QQUdFX0NMS01PTjAJCTB4MDYKKyNkZWZpbmUgU0lUOTUz MVhfUEFHRV9DTEtNT04xCQkweDA3CisjZGVmaW5lIFNJVDk1MzFYX1BBR0VfUExMQQkJCTB4MEEK KyNkZWZpbmUgU0lUOTUzMVhfUEFHRV9QTExBX0VYVAkJMHgxQQorI2RlZmluZSBTSVQ5NTMxWF9Q QUdFX1BMTEIJCQkweDBCCisjZGVmaW5lIFNJVDk1MzFYX1BBR0VfUExMQl9FWFQJCTB4MUIKKyNk ZWZpbmUgU0lUOTUzMVhfUEFHRV9QTExDCQkJMHgwQworI2RlZmluZSBTSVQ5NTMxWF9QQUdFX1BM TENfRVhUCQkweDFDCisjZGVmaW5lIFNJVDk1MzFYX1BBR0VfUExMRAkJCTB4MEQKKyNkZWZpbmUg U0lUOTUzMVhfUEFHRV9QTExEX0VYVAkJMHgxRAorCisvKiBQTEwgaW5kZXggdG8gcGFnZSBtYXBw aW5nICovCisjZGVmaW5lIFNJVDk1MzFYX1BMTF9QQUdFKF9pZHgpIFwKKwkoU0lUOTUzMVhfUEFH RV9QTExBICsgKF9pZHgpKQorCisvKgorICogVkFSSUFOVF9JRCBpcyBhIHNpbmdsZSBieXRlIGF0 IHBhZ2UgMCByZWcgMHgwMiAoOTUzMTcgPSAweDE3LCA5NTMxNiA9IDB4MzEpLgorICogUmVnIDB4 MDMgY2FycmllcyBhbiB1bnJlbGF0ZWQgcmV2aXNpb24gYnl0ZSBhbmQgbXVzdCBub3QgYmUgY29t YmluZWQgaW50bworICogdGhlIHZhcmlhbnQgaWRlbnRpZmllci4KKyAqLworI2RlZmluZSBTSVQ5 NTMxWF9SRUdfVkFSSUFOVF9JRAkJU0lUOTUzMVhfUkVHKDB4MDAsIDB4MDIpCisKKy8qIERDTyB0 cmlnZ2VyIHB1bHNlIHRpbWluZzogbWluaW11bSA2IG5zIHJlcXVpcmVkIGJ5IGhhcmR3YXJlICov CisKKyNkZWZpbmUgU0lUOTUzMVhfUkVHX0hPTERPVkVSX0hJU1RPUlkJU0lUOTUzMVhfUkVHKDB4 MDAsIDB4NTgpCisKKy8qIFBhZ2UgMCAtLSBQTEwgaW5uZXIgbG9vcCBsb3NzLW9mLWxvY2sgKi8K KyNkZWZpbmUgU0lUOTUzMVhfUkVHX1BMTF9JTk5FUl9MT0xfU1RBVFVTCVNJVDk1MzFYX1JFRygw eDAwLCAweDkyKQorI2RlZmluZSBTSVQ5NTMxWF9SRUdfUExMX0lOTkVSX0xPTF9OT1RJRglTSVQ5 NTMxWF9SRUcoMHgwMCwgMHg5MykKKworLyogUGFnZSAwIC0tIENsb2NrIG1vbml0b3IgUExMIC8g WE8gc3RhdHVzICovCisjZGVmaW5lIFNJVDk1MzFYX1JFR19DTU9OX05PVElGCQlTSVQ5NTMxWF9S RUcoMHgwMCwgMHg5RSkKKworLyogUGFnZSAwIC0tIFBMTCBvdXRlci1sb29wIGxvc3Mtb2YtbG9j ayAqLworI2RlZmluZSBTSVQ5NTMxWF9SRUdfT1VURVJfTE9MX1NUQVRVUwlTSVQ5NTMxWF9SRUco MHgwMCwgMHgwNikKKyNkZWZpbmUgU0lUOTUzMVhfUkVHX09VVEVSX0xPTF9OT1RJRgkJU0lUOTUz MVhfUkVHKDB4MDAsIDB4MDcpCisKKy8qIFBhZ2UgMCAtLSBQTEwgaG9sZG92ZXIgZnJlZXplIHN0 YXR1cyAqLworI2RlZmluZSBTSVQ5NTMxWF9SRUdfSE9fRlJFRVpFX1NUQVRVUwlTSVQ5NTMxWF9S RUcoMHgwMCwgMHgwQSkKKyNkZWZpbmUgU0lUOTUzMVhfUkVHX0hPX0ZSRUVaRV9OT1RJRglTSVQ5 NTMxWF9SRUcoMHgwMCwgMHgwQikKKworLyogUGFnZSAwIC0tIElOVFNZTkMgKGludGVyLVBMTCBz eW5jaHJvbml6YXRpb24pIGdsb2JhbCBlbmFibGUgKi8KKyNkZWZpbmUgU0lUOTUzMVhfUkVHX0lO VFNZTkNfR0xPQkFMCQlTSVQ5NTMxWF9SRUcoMHgwMCwgMHg0MCkKKyNkZWZpbmUgU0lUOTUzMVhf SU5UU1lOQ19FTl9CSVQJCTYKKworLyoKKyAqIFByaW9yaXR5IHRhYmxlOiA2IHJlZ2lzdGVycyBw ZXIgUExMLCBlYWNoIGhvbGRzIHR3byBwcmlvcml0eSBzbG90cworICogbmliYmxlLXBhY2tlZC4g IFRoZSByZWdpc3RlciBob2xkaW5nIHNsb3RzIDJuIGFuZCAybisxIGtlZXBzIHRoZQorICogZWFy bGllciBzbG90IChDTEtfU1BBUkU8Mm4+U0VMX1BMTCkgaW4gWzc6NF0gYW5kIHRoZSBsYXRlciBv bmUgaW4KKyAqIFszOjBdLgorICoKKyAqIEJhc2UgcmVnaXN0ZXJzIGZvciBQTExBOiAweDE2LTB4 MUIgKHNsb3RzIDAtMTAgcGx1cyB0aGUKKyAqIGFjdGl2ZS1yZWZlcmVuY2UgbmliYmxlKS4KKyAq IEZvciBQTEwgTjogIGJhc2UgKyA2ICogTiAgKGUuZy4gUExMQiBzdGFydHMgYXQgMHgxQykuCisg KgorICogSW5wdXQgc291cmNlIGVuY29kaW5nICg0LWJpdCB2YWx1ZSk6CisgKiAgIDA9SU4wUCwg MT1JTjFQLCAyPUlOMlAsIDM9SU4zUCwgND1JTjRQLAorICogICA1PU9DWE8sIDY9SU5UU1lOQywK KyAqICAgNz1JTjBOLCA4PUlOMU4sIDk9SU4yTiwgMTA9SU4zTiwgMTE9SU40TgorICovCisjZGVm aW5lIFNJVDk1MzFYX1BBR0VfUFJJT1NZUwkJMHgwMQorI2RlZmluZSBTSVQ5NTMxWF9QUklPX0JB U0VfUkVHCQkweDE2CisjZGVmaW5lIFNJVDk1MzFYX1BSSU9fUkVHU19QRVJfUExMCQk2CisjZGVm aW5lIFNJVDk1MzFYX1BSSU9fU0xPVFNfUEVSX1JFRwkJMgorLyoKKyAqIDExIHByaW9yaXR5IHNs b3RzLCBDTEtfU1BBUkUwU0VMX1BMTCB0aHJvdWdoIENMS19TUEFSRTEwU0VMX1BMTC4KKyAqIFRo ZSB0d2VsZnRoIG5pYmJsZSBvZiB0aGUgYmxvY2sgaXMgbm90IGEgc2xvdDogaXQgaXMKKyAqIENM S19BQ1RJVkVTRUxfUExMLCBzZWUgU0lUOTUzMVhfUFJJT19BQ1RJVkVTRUxfT0ZGIGJlbG93Lgor ICovCisjZGVmaW5lIFNJVDk1MzFYX1BSSU9fTUFYX1NMT1RTCQkxMQorLyogTnVtYmVyIG9mIHNv dXJjZSBlbmNvZGluZ3MgKDAtMTEpLCB1bnJlbGF0ZWQgdG8gdGhlIHNsb3QgY291bnQgKi8KKyNk ZWZpbmUgU0lUOTUzMVhfUFJJT19OVU1fU1JDCQkxMgorI2RlZmluZSBTSVQ5NTMxWF9QUklPX05J QkJMRV9NQVNLCQkweDBGCisjZGVmaW5lIFNJVDk1MzFYX1BSSU9fSElfU0hJRlQJCTQKKy8qIElu cHV0IHNvdXJjZSBlbmNvZGluZyB2YWx1ZXMgKHNlZSB0YWJsZSBhYm92ZSkgKi8KKyNkZWZpbmUg U0lUOTUzMVhfUFJJT19TUkNfT0NYTwkJNQorI2RlZmluZSBTSVQ5NTMxWF9QUklPX1NSQ19JTlRT WU5DCQk2CisjZGVmaW5lIFNJVDk1MzFYX1BSSU9fU1JDX05fQkFTRQkJNworLyoKKyAqIFRoZSBs YXN0IHJlZ2lzdGVyIG9mIGVhY2ggUExMJ3MgcHJpb3JpdHkgYmxvY2sgaG9sZHMsIGluIGl0cyBs b3cKKyAqIG5pYmJsZSwgdGhlIGlucHV0IHNvdXJjZSB0aGUgUExMIGhhcyBjdXJyZW50bHkgc2Vs ZWN0ZWQgYXMgaXRzCisgKiBhY3RpdmUgcmVmZXJlbmNlIChDTEtfQUNUSVZFU0VMX1BMTCwgc2Ft ZSA0LWJpdCBlbmNvZGluZyBhcyBhYm92ZSkuCisgKi8KKyNkZWZpbmUgU0lUOTUzMVhfUFJJT19B Q1RJVkVTRUxfT0ZGCQk1CisKKy8qCisgKiBQYWdlIDAgLS0gUFJHX0RpcmVjdGl2ZXNfR0VORVJJ Q18wLCB0aGUgbWFpbiBzeXN0ZW0ncyBwcm9ncmFtbWluZworICogZGlyZWN0aXZlIHJlZ2lzdGVy LiAgRXZlcnkgcGFnZSBjYXJyaWVzIGl0cyBvd24gY29weSBvZiB0aGlzCisgKiByZWdpc3RlciBh dCBvZmZzZXQgMHgwRiB3aXRoIHRoZSBzYW1lIGJpdCBsYXlvdXQ6CisgKgorICogICBiaXQgNiAg cHJvY2VlZCB0byBsb29wIGxvY2sgLyBhY3RpdmUgc3RhdGUgZnJvbSB0aGUgUFJHX0NNRCBzdGF0 ZQorICogICBiaXQgNCAgdXBkYXRlIHRoZSBOVk0gYmFuayBmcm9tIHRoZSBlZnVzZSBjb250ZW50 cworICogICBiaXQgMyAgcmVhZCB0aGUgZWZ1c2UKKyAqICAgYml0IDIgIHByb2dyYW0gdGhlIGVm dXNlCisgKiAgIGJpdCAxICBzbWFsbCBjaGFuZ2UgdXBkYXRlIChTSVQ5NTMxWF9TTUFMTF9VUERB VEVfQ01EKQorICogICBiaXQgMCAgZXNjYXBlIHRvIHRoZSBQUkdfQ01EIHN0YXRlCisgKgorICog T25seSB0aGUgc21hbGwgY2hhbmdlIHVwZGF0ZSBiZWxvbmdzIGluIGEgcnVudGltZSBwYXRoOyB0 aGUgZWZ1c2UKKyAqIGFuZCBOVk0gZGlyZWN0aXZlcyB0b3VjaCBub24tdm9sYXRpbGUgc3RvcmFn ZS4KKyAqLworI2RlZmluZSBTSVQ5NTMxWF9SRUdfR0xPQkFMX1VQREFURQkJU0lUOTUzMVhfUkVH KDB4MDAsIDB4MEYpCisjZGVmaW5lIFNJVDk1MzFYX1NNQUxMX1VQREFURV9DTUQJCTB4MDIKKwor LyogUExMIGhvbGRvdmVyIGNvbnRyb2wgKFBMTCBwYWdlIG9mZnNldCkgKi8KKyNkZWZpbmUgU0lU OTUzMVhfUExMX1JFR19IT19DVFJMCQkweDZGCisjZGVmaW5lIFNJVDk1MzFYX1BMTF9IT19GT1JD RV9CSVQJCTQKKworLyogT25lIGJpdCBwZXIgaW5wdXQgUEFJUiAoYml0IDAgPSBDTEtJTjAsIC4u LiwgYml0IDMgPSBDTEtJTjMpICovCisjZGVmaW5lIFNJVDk1MzFYX1JFR19JTl9ERV9GT1JDRQkJ U0lUOTUzMVhfUkVHKDB4MDIsIDB4RTgpCisjZGVmaW5lIFNJVDk1MzFYX1JFR19JTl9ERV9TVEFU RQkJU0lUOTUzMVhfUkVHKDB4MDIsIDB4RTkpCisjZGVmaW5lIFNJVDk1MzFYX1JFR19JTl9TRVBf Rk9SQ0UJCVNJVDk1MzFYX1JFRygweDAyLCAweEVBKQorI2RlZmluZSBTSVQ5NTMxWF9SRUdfSU5f U0VQX1NUQVRFCQlTSVQ5NTMxWF9SRUcoMHgwMiwgMHhFQikKKyNkZWZpbmUgU0lUOTUzMVhfUkVH X0lOX1NFTl9GT1JDRQkJU0lUOTUzMVhfUkVHKDB4MDIsIDB4RjIpCisjZGVmaW5lIFNJVDk1MzFY X1JFR19JTl9TRU5fU1RBVEUJCVNJVDk1MzFYX1JFRygweDAyLCAweEYzKQorCisvKgorICogT25l IHJlZ2lzdGVyIHBlciBpbnB1dCBwYWlyIGF0IDB4MUIgKyAweDEwICogcGFpcgorICogKENMS0lO MCA9IDB4MUIsIENMS0lOMSA9IDB4MkIsIENMS0lOMiA9IDB4M0IsIENMS0lOMyA9IDB4NEIpLgor ICogU0VfUF9FTi9TRV9OX0VOIHNldCBtZWFucyB0aGUgY29ycmVzcG9uZGluZyBsYW5lIGlzIGNv bmZpZ3VyZWQKKyAqIHNpbmdsZS1lbmRlZDsgYm90aCBjbGVhciBtZWFucyB0aGUgcGFpciBydW5z IGRpZmZlcmVudGlhbC4KKyAqLworI2RlZmluZSBTSVQ5NTMxWF9SRUdfSU5fTU9ERShfcGFpcikJ CVwKKwlTSVQ5NTMxWF9SRUcoMHgwMiwgMHgxQiArIDB4MTAgKiAoX3BhaXIpKQorI2RlZmluZSBT SVQ5NTMxWF9JTl9NT0RFX1NFX1BfRU4JCUJJVCgwKQorI2RlZmluZSBTSVQ5NTMxWF9JTl9NT0RF X1NFX05fRU4JCUJJVCgxKQorCisvKiAtLS0tIFBhZ2UgMHgwMyAoT3V0cHV0IFN5c3RlbSkgcmVn aXN0ZXJzIC0tIEhpLVogY29udHJvbCAtLS0tICovCisjZGVmaW5lIFNJVDk1MzFYX1JFR19ISVpf RElGRl8wN19NQVNLCVNJVDk1MzFYX1JFRygweDAzLCAweEYyKQorI2RlZmluZSBTSVQ5NTMxWF9S RUdfSElaX0RJRkZfMDdfU1RBVEUJU0lUOTUzMVhfUkVHKDB4MDMsIDB4RjMpCisjZGVmaW5lIFNJ VDk1MzFYX1JFR19ISVpfRElGRl84MTFfTUFTSwlTSVQ5NTMxWF9SRUcoMHgwMywgMHhGNCkKKyNk ZWZpbmUgU0lUOTUzMVhfUkVHX0hJWl9ESUZGXzgxMV9TVEFURQlTSVQ5NTMxWF9SRUcoMHgwMywg MHhGNSkKKyNkZWZpbmUgU0lUOTUzMVhfUkVHX0hJWl9TRV8wN19NQVNLCQlTSVQ5NTMxWF9SRUco MHgwMywgMHhGOCkKKyNkZWZpbmUgU0lUOTUzMVhfUkVHX0hJWl9TRV8wN19TVEFURQkJU0lUOTUz MVhfUkVHKDB4MDMsIDB4RjkpCisjZGVmaW5lIFNJVDk1MzFYX1JFR19ISVpfU0VfODExX01BU0sJ CVNJVDk1MzFYX1JFRygweDAzLCAweEZBKQorI2RlZmluZSBTSVQ5NTMxWF9SRUdfSElaX1NFXzgx MV9TVEFURQlTSVQ5NTMxWF9SRUcoMHgwMywgMHhGQikKKworLyoKKyAqIE91dHB1dCBkaXZpZGVy IHJlZ2lzdGVycyBpbiBQYWdlcyAzLzQuICBFYWNoIG91dHB1dCBoYXMgYSAzNC1iaXQKKyAqIGlu dGVnZXIgZGl2aWRlciBtYXBwZWQgdG8gNSBieXRlcyAoTFNCIGF0IGJhc2UgcmVnLCBNU0IgYXQg YmFzZS00KS4KKyAqIE91dHB1dHMgMC01IGFyZSBvbiBQYWdlIDMsIG91dHB1dHMgNi0xMSBhcmUg b24gUGFnZSA0LgorICoKKyAqIFRoZSBiYXNlIHJlZ2lzdGVyIGZvciBzbG90IE4gd2l0aGluIGEg cGFnZSBpczoKKyAqICAgY2xrb3V0X29kcl9kaXZuX2Jhc2Vbc2xvdF0gPSB7IDB4MTQsIDB4MjQs IDB4MzQsIDB4NDQsIDB4NTQsIDB4NjQgfQorICoKKyAqIExheW91dDogYmFzZT1MU0IsIGJhc2Ut MSwgYmFzZS0yLCBiYXNlLTMsIGJhc2UtNFsxOjBdPU1TQi4KKyAqCisgKiBQZXItY2hpcCBjbGtv dXRfbWFwW10gdHJhbnNsYXRlcyBvdXRwdXQgaW5kZXggdG8gc2xvdCBwb3NpdGlvbi4KKyAqLwor I2RlZmluZSBTSVQ5NTMxWF9QQUdFX09VVFNZUzBfU0xPVF9NQVgJNSAgIC8qIHNsb3RzIDAtNSBv biBQYWdlIDB4MDMgKi8KKworLyogTWlzYyBvdXRwdXQgc3lzdGVtIHJlZ2lzdGVycyAqLworI2Rl ZmluZSBTSVQ5NTMxWF9SRUdfUFJHX0RJUl9HRU4JCVNJVDk1MzFYX1JFRygweDAzLCAweDBGKQor I2RlZmluZSBTSVQ5NTMxWF9QUkdfQ01EX1NUQVRFCQkweDAxCisjZGVmaW5lIFNJVDk1MzFYX1VQ REFURV9OVk0JCQkweDEwCisjZGVmaW5lIFNJVDk1MzFYX0xPT1BfTE9DSwkJCTB4NDAKKworLyog RGVidWcgcmVnaXN0ZXIgKHNhbWUgb2Zmc2V0LCBwZXItcGFnZSkgKi8KKyNkZWZpbmUgU0lUOTUz MVhfUkVHX09VVFNZU19ERUJVRwkJU0lUOTUzMVhfUkVHKDB4MDMsIDB4QkQpCisjZGVmaW5lIFNJ VDk1MzFYX0RFQlVHX1VOTE9DS19WQUwJCTB4QzMKKworLyoKKyAqIFBlci1vdXRwdXQgcHJvZ3Jh bW1hYmxlIHBoYXNlIGRlbGF5OiAzNC1iaXQgY29hcnNlIChpbiBWQ08gY2xvY2sKKyAqIGN5Y2xl cykgcGx1cyBhIDMtYml0IGZpbmUgZmllbGQgd2l0aCBmaXhlZCAzMCBwcyBzdGVwcy4gIEVhY2gg b3V0cHV0CisgKiBoYXMgYSBmaXZlLWJ5dGUgYmxvY2sgUFJPRzYuLlBST0cyOgorICoKKyAqICAg YmFzZSArIDAgIFBST0c2ICBbNzo1XSBPUFNUR19WQ0FTQ19CVU1QIChwcmVzZXJ2ZSB2aWEgUk1X KQorICogICAgICAgICAgICAgICAgICAgIFs0OjJdIFBSR19SU1RfRklORV9ERUxBWVsyOjBdCisg KiAgICAgICAgICAgICAgICAgICAgWzE6MF0gUFJHX1JTVF9ERUxBWVszMzozMl0KKyAqICAgYmFz ZSArIDEgIFBST0c1ICBbNzowXSBQUkdfUlNUX0RFTEFZWzMxOjI0XQorICogICBiYXNlICsgMiAg UFJPRzQgIFs3OjBdIFBSR19SU1RfREVMQVlbMjM6MTZdCisgKiAgIGJhc2UgKyAzICBQUk9HMyAg Wzc6MF0gUFJHX1JTVF9ERUxBWVsxNTo4XQorICogICBiYXNlICsgNCAgUFJPRzIgIFs3OjBdIFBS R19SU1RfREVMQVlbNzowXQorICoKKyAqIE91dHB1dHMgMC01IGFyZSBvbiBQYWdlIDMsIG91dHB1 dHMgNi0xMSBvbiBQYWdlIDQuICBUaGUgYmxvY2sgYmFzZQorICogd2l0aGluIGEgcGFnZSBpcyAw eDE1ICsgMTYgKiAob3V0X2lkeCAlIDYpLgorICovCisjZGVmaW5lIFNJVDk1MzFYX09VVF9QUkdf REVMQVlfQkFTRQkJMHgxNQorI2RlZmluZSBTSVQ5NTMxWF9PVVRfUFJHX1NMT1RfU1RSSURFCQkw eDEwCisjZGVmaW5lIFNJVDk1MzFYX09VVF9QUkdfT1BTVEdfTUFTSwkJMHhFMAkvKiBiaXRzIFs3 OjVdLCBwcmVzZXJ2ZSAqLworI2RlZmluZSBTSVQ5NTMxWF9PVVRfUFJHX0ZJTkVfU0hJRlQJCTIK KyNkZWZpbmUgU0lUOTUzMVhfT1VUX1BSR19GSU5FX01BU0sJCTB4MUMJLyogYml0cyBbNDoyXSAq LworI2RlZmluZSBTSVQ5NTMxWF9PVVRfUFJHX0NPQVJTRV9ISV9NQVNLCQkweDAzCS8qIGJpdHMg WzE6MF0gKi8KKyNkZWZpbmUgU0lUOTUzMVhfT1VUX1BSR19GSU5FX1NURVBfUFMJCTMwCisjZGVm aW5lIFNJVDk1MzFYX09VVF9QUkdfRklORV9NQVgJCTcJLyogMy1iaXQgZmllbGQgKi8KKyNkZWZp bmUgU0lUOTUzMVhfT1VUX1BSR19DT0FSU0VfQklUUwkJMzQKKworLyoKKyAqIFBlci1vdXRwdXQg cHVsc2UtY291bnQgY29udHJvbCBieXRlIHVzZWQgaW4gU1lTUkVGIC8gU1lOQ0IgbW9kZXMuCisg KiBTbG90IE4gd2l0aGluIGEgcGFnZSBzaXRzIGF0IDB4MUIgKyAxNiAqIChzbG90ICUgNikuICBT YW1lIHBhZ2UKKyAqIG1hcHBpbmcgYXMgUFJHX1JTVF9ERUxBWTogc2xvdHMgMC01IG9uIFBhZ2Ug Mywgc2xvdHMgNi0xMSBvbiBQYWdlIDQuCisgKi8KKyNkZWZpbmUgU0lUOTUzMVhfT1VUX1BST0cw X0JBU0UJCTB4MUIKKworLyoKKyAqIE9uLWRlbWFuZCBwaGFzZS1mbHVzaCBmaXJlZCBmcm9tIGEg cmVnaXN0ZXIgcmF0aGVyIHRoYW4gYSBHUElPIHBpbi4KKyAqIERJVk9fUEhBU0VfU0VMX1JFRyBz ZWxlY3RzIHRoZSBpbi1yZWdpc3RlciB0cmlnZ2VyIHNvdXJjZSBhbmQKKyAqIERJVk9fUEhBU0Vf VFJJRyBmbHVzaGVzIHRoZSBvdXRwdXQgcGhhc2Ugd2hlbiBwdWxzZWQgaGlnaCB0aGVuIGxvdy4K KyAqIFRoZSB1bnJlbGF0ZWQgT0ViIHRyaWdnZXIgcGFpciBpbiBiaXRzIFs3OjZdIG11c3QgYmUg cHJlc2VydmVkLgorICovCisjZGVmaW5lIFNJVDk1MzFYX1JFR19HUElPX0ZVTkNfQ1RSTDEJU0lU OTUzMVhfUkVHKDB4MDAsIDB4NjUpCisjZGVmaW5lIFNJVDk1MzFYX0RJVk9fUEhBU0VfU0VMX1JF RwlCSVQoNSkKKyNkZWZpbmUgU0lUOTUzMVhfRElWT19QSEFTRV9UUklHCUJJVCg0KQorCisvKiAt LS0tIFBMTCBwYWdlIHJlZ2lzdGVycyAoYXBwbHkgdG8gcGFnZXMgMHgwQS0weDBEKSAtLS0tICov CisjZGVmaW5lIFNJVDk1MzFYX1BMTF9SRUdfU01BTExfVVBEQVRFCTB4MEYKKworLyogT24tZGVt YW5kIHBoYXNlLWZsdXNoIGVuYWJsZSAoUExMIHBhZ2UgcmVnIDB4M0QgYml0IDcpICovCisjZGVm aW5lIFNJVDk1MzFYX1BMTF9SRUdfUEhGTF9DVFJMCTB4M0QKKyNkZWZpbmUgU0lUOTUzMVhfUExM X1BIRkxfT05fREVNQU5EX0VOCUJJVCg3KQorCisvKgorICogTG9vcC1maWx0ZXIgY29lZmZpY2ll bnRzIG9uIFBMTF9QQUdFIHJlZ3MgMHgxMC0weDE1ICgzIG5vcm1hbCArCisgKiAzIGZhc3QtbG9j aykgYXJlIEdVSS9OVk0tZ2VuZXJhdGVkIGJ5IHRoZSB0aW1pbmcgY29uZmlndXJhdG9yIGFuZCBt dXN0IG5vdCBiZQorICogcmVwcm9ncmFtbWVkIGF0IHJ1bnRpbWU7IHRoZSByZWdpc3RlciBtYXAg ZmxhZ3MgdGhlbSBhcworICogIkdVSSBnZW5lcmF0ZWQgY29uZmlndXJhdGlvbiBzaG91bGQgbm90 IGNoYW5nZSBtYW51YWxseSIuCisgKi8KKworI2RlZmluZSBTSVQ5NTMxWF9QTExfUkVHX09VVF9N QVBfSEkJCTB4MjcKKyNkZWZpbmUgU0lUOTUzMVhfUExMX1JFR19PVVRfTUFQX0xPCQkweDI4Cisj ZGVmaW5lIFNJVDk1MzFYX1BMTF9SRUdfU1RBVFVTCQkweDMxCisjZGVmaW5lIFNJVDk1MzFYX1BM TF9SRUdfTlZNX1VQREFURQkJMHgzRgorCisvKiBESVZOIHJlZ2lzdGVycyAoZnJlZS1ydW4gZGl2 aWRlciByZWFkYmFjaykgKi8KKyNkZWZpbmUgU0lUOTUzMVhfUExMX1JFR19ESVZOX0lOVAkJMHgz MAorI2RlZmluZSBTSVQ5NTMxWF9QTExfUkVHX0RJVk5fTlVNCQkweDMyICAvKiA0IGJ5dGVzICgw eDMyLTB4MzUpICovCisjZGVmaW5lIFNJVDk1MzFYX1BMTF9SRUdfRElWTl9ERU4JCTB4MzggIC8q IDQgYnl0ZXMgKDB4MzgtMHgzQikgKi8KKworLyogRElWTjIgcmVnaXN0ZXJzIChzeW5jIGRpdmlk ZXIgcmVhZGJhY2spICovCisjZGVmaW5lIFNJVDk1MzFYX1BMTF9SRUdfRElWTjJfSU5UCQkweDNF ICAvKiA1IGJ5dGVzICgweDNFLTB4NDIpICovCisjZGVmaW5lIFNJVDk1MzFYX1BMTF9SRUdfRElW TjJfRlJBQ19OVU0JMHg0MyAgLyogNCBieXRlcyAoMHg0My0weDQ2KSAqLworI2RlZmluZSBTSVQ5 NTMxWF9QTExfUkVHX0RJVk4yX0ZSQUNfREVOCTB4NDkgIC8qIDQgYnl0ZXMgKDB4NDktMHg0Qykg Ki8KKworLyogRGVidWcgcmVnaXN0ZXIgdW5sb2NrICovCisjZGVmaW5lIFNJVDk1MzFYX1BMTF9S RUdfREVCVUcJCTB4QkQKKyNkZWZpbmUgU0lUOTUzMVhfUExMX0RFQlVHX1VOTE9DSwkJMHhDMwor CisvKgorICogU2lnbmFsIHBhdGh3YXkgZGVidWcgcmVhZGJhY2sgLS0gUExMIHBhZ2UuICBEaWdf U3lzX1JlYWRDb2RlIHNlbGVjdHMKKyAqIHdoaWNoIHBvaW50IG9mIHRoZSBwYXRod2F5IGlzIHRh cHBlZCwgRGlnX1N5c19Xcml0ZUNvZGUgY2FycmllcyB0aGUKKyAqIG1vZGlmaWVycyBmb3IgdGhh dCByZWFkLCBEaWdfU3lzX3JlYWQ3Li5yZWFkMCBob2xkIHRoZSBzYW1wbGVkIGJ5dGVzCisgKiBh bmQgdGhlIHRyaWdnZXIgcmVnaXN0ZXIgbGF0Y2hlcyBhIHNhbXBsZS4gIFRoZSBUREMgcGhhc2UK KyAqIG1lYXN1cmVtZW50IGlzIG9uZSB0YXAgYW1vbmcgc2V2ZXJhbCwgcmVhY2hlZCB0aHJvdWdo IHJlYWQgY29kZSA2OS4KKyAqLworI2RlZmluZSBTSVQ5NTMxWF9QTExfUkVHX0RCR19SRUFEX0NP REUJMHhCMworI2RlZmluZSBTSVQ5NTMxWF9QTExfUkVHX0RCR19XUklURV9DT0RFCTB4QjQKKyNk ZWZpbmUgU0lUOTUzMVhfREJHX0xPV19GUkVRX0NMS19CSVQJQklUKDcpCisjZGVmaW5lIFNJVDk1 MzFYX1BMTF9SRUdfREJHX0RBVEFfMAkJMHhCNSAgLyogWzc6MF0gKi8KKyNkZWZpbmUgU0lUOTUz MVhfUExMX1JFR19EQkdfREFUQV8xCQkweEI2ICAvKiBbMTU6OF0gKi8KKyNkZWZpbmUgU0lUOTUz MVhfUExMX1JFR19EQkdfREFUQV8yCQkweEI3ICAvKiBbMjM6MTZdICovCisjZGVmaW5lIFNJVDk1 MzFYX1BMTF9SRUdfREJHX0RBVEFfMwkJMHhCOCAgLyogWzMxOjI0XSAqLworI2RlZmluZSBTSVQ5 NTMxWF9QTExfUkVHX0RCR19EQVRBXzQJCTB4QjkgIC8qIFszOTozMl0gKyBzaWduICovCisjZGVm aW5lIFNJVDk1MzFYX1BMTF9SRUdfREJHX0RBVEFfNQkJMHhCQSAgLyogWzQ3OjQwXSAqLworI2Rl ZmluZSBTSVQ5NTMxWF9QTExfUkVHX0RCR19EQVRBXzYJCTB4QkIKKyNkZWZpbmUgU0lUOTUzMVhf UExMX1JFR19EQkdfREFUQV83CQkweEJDCisjZGVmaW5lIFNJVDk1MzFYX1BMTF9SRUdfREJHX1RS SUdHRVIJCTB4RDAgIC8qIHJlYWQgdG8gbGF0Y2ggYSBzYW1wbGUgKi8KKyNkZWZpbmUgU0lUOTUz MVhfREJHX0RBVEFfQllURVMJCTgKKworLyogUmVhZCBjb2RlIG9mIHRoZSBUREMgcGhhc2UgdGFw LCBhbmQgdGhlIHNpZ24gYml0IG9mIGl0cyBzYW1wbGUgKi8KKyNkZWZpbmUgU0lUOTUzMVhfREJH X1JFQURfQ09ERV9UREMJCTY5CisjZGVmaW5lIFNJVDk1MzFYX1REQ19TSUdOX0JJVAkJMworCisv KgorICogUmVhZCBjb2RlcyBvZiB0aGUgcnVubmluZyBESVZOIHRhcHMuICBVbmxpa2UgdGhlIGNv bmZpZ3VyYXRpb24KKyAqIHJlZ2lzdGVycyB0aGVzZSByZXBvcnQgd2hhdCB0aGUgZGlnaXRhbCBs b29wIGN1cnJlbnRseSBjb21tYW5kcywgc28KKyAqIHRoZXkgY2FycnkgdGhlIGNvcnJlY3Rpb24g dGhlIGxvb3AgYXBwbGllcyB0byB0cmFjayBpdHMgcmVmZXJlbmNlLgorICogVGhlIGludGVnZXIg cGFydCBhbmQgdGhlIG51bWVyYXRvciBzaGFyZSBvbmUgdGFwLCB0aGUgZGVub21pbmF0b3IKKyAq IGhhcyBpdHMgb3duLgorICovCisjZGVmaW5lIFNJVDk1MzFYX0RCR19SRUFEX0NPREVfRElWTgkJ MHg1NworI2RlZmluZSBTSVQ5NTMxWF9EQkdfUkVBRF9DT0RFX0RJVk5fREVOCTB4NTYKKyNkZWZp bmUgU0lUOTUzMVhfRElWTl9SVF9OVU1fQklUUwkJNDgKKyNkZWZpbmUgU0lUOTUzMVhfRElWTl9S VF9JTlRfSElfQklUCQlCSVQoMCkKKworLyoKKyAqIERJVk4gY2FycmllZCBhcyBmaXhlZCBwb2lu dCwgYW5kIHRoZSB1bml0IHRoZSBEUExMIEFCSSB3YW50cyB0aGUKKyAqIGZyYWN0aW9uYWwgZnJl cXVlbmN5IG9mZnNldCBpbi4gIEVxdWFsIGluIHZhbHVlLCBkaXN0aW5jdCBpbiBtZWFuaW5nLgor ICovCisjZGVmaW5lIFNJVDk1MzFYX0RJVk5fU0NBTEUJCTEwMDAwMDAwMDAwMDBVTEwKKyNkZWZp bmUgU0lUOTUzMVhfUFBUX1BFUl9VTklUCQkxMDAwMDAwMDAwMDAwVUxMCisKKy8qCisgKiBUREMg cGhhc2UtZGlmZmVyZW5jZSBtZWFzdXJlbWVudCBzZXR1cCAoUExMIHBhZ2UpLiAgUGVyIHRoZSB2 ZW5kb3IKKyAqIFBoYXNlRGlmZmVyZW5jZVJlYWRlciByZWZlcmVuY2UgcHJvY2VkdXJlLCBhIHZh bGlkIFREQyByZWFkaW5nIG5lZWRzCisgKiB0aGUgZGlnaXRhbCBsb29wIGZpbHRlciBmcm96ZW4g KHNvIHRoZSBWQ08gZG9lcyBub3QgdHJhY2sgb3V0IHRoZQorICogbWVhc3VyZWQgb2Zmc2V0IG1p ZC1zYW1wbGUpIGFuZCwgb24gUExMQSAodGhlIDFQUFMgcGhhc2UgRFBMTCksIHRoZQorICogYXV0 b21hdGljIHBoYXNlL2ZyZXF1ZW5jeS1sb2NrIGhlbHBlcnMgaGVsZCBvZmYuCisgKi8KKyNkZWZp bmUgU0lUOTUzMVhfUExMX1JFR19ETFBGX0ZSRUVaRTAJMHg4QQorI2RlZmluZSBTSVQ5NTMxWF9Q TExfUkVHX0RMUEZfRlJFRVpFMQkweDhCCisjZGVmaW5lIFNJVDk1MzFYX1BMTF9ETFBGX0ZSRUVa RV9CSVQJQklUKDUpICAvKiBmcmVlemUgRExQRiAoaGl0bGVzcyBITykgKi8KKyNkZWZpbmUgU0lU OTUzMVhfUExMX1JFR19BUExfQ1RSTAkJMHg0RAorI2RlZmluZSBTSVQ5NTMxWF9QTExfQVBMX1dB S0VVUF9ESVNfQklUCUJJVCg3KSAgLyogZGlzYWJsZSBBUEwgYXQgd2FrZS11cCAqLworI2RlZmlu ZSBTSVQ5NTMxWF9QTExfQVBMX1NXSVRDSF9FTl9CSVQJQklUKDUpICAvKiBBUEwgb24gc3dpdGNo b3ZlciAqLworI2RlZmluZSBTSVQ5NTMxWF9QTExfUkVHX0FGTF9DVFJMCQkweDRFCisjZGVmaW5l IFNJVDk1MzFYX1BMTF9BRkxfV0FLRVVQX0RJU19CSVQJQklUKDUpICAvKiBkaXNhYmxlIEFGTCBh dCB3YWtlLXVwICovCisjZGVmaW5lIFNJVDk1MzFYX1BMTF9DT05GSUc0N19QSEZMX0JJVAlCSVQo NykgIC8qIFBIRkwgZW5hYmxlIChyZWcgMHg0NykgKi8KKyNkZWZpbmUgU0lUOTUzMVhfUExMX1JF R19BQ1RJVkUJCTB4MDIKKyNkZWZpbmUgU0lUOTUzMVhfUExMX0FDVElWRV9CSVQJCUJJVCgwKSAg LyogUExMIHJlYWNoZWQgYWN0aXZlIHN0YXRlICovCisjZGVmaW5lIFNJVDk1MzFYX1BMTF9SRUdf UkVTVEFSVAkJMHgwNQorI2RlZmluZSBTSVQ5NTMxWF9QTExfUkVTVEFSVF9CSVQJCUJJVCgwKSAg LyogcmVzdGFydCB0aGUgUExMICovCisjZGVmaW5lIFNJVDk1MzFYX1BMTF9SRUdfWkRCMAkJMHgy QgorI2RlZmluZSBTSVQ5NTMxWF9QTExfUkVHX1pEQjEJCTB4MUUKKyNkZWZpbmUgU0lUOTUzMVhf UExMX1pEQl9FTl9CSVQJCUJJVCg0KSAgLyogemVyby1kZWxheSBidWZmZXIgZW5hYmxlZCAqLwor CisvKiBQTEwgRVhUIHBhZ2UgSU5UU1lOQyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworI2Rl ZmluZSBTSVQ5NTMxWF9QTExfRVhUX1BBR0UoX2lkeCkJCShTSVQ5NTMxWF9QQUdFX1BMTEFfRVhU ICsgKF9pZHgpKQorCisvKiBQTEwgU1RBVFVTIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgU0lU OTUzMVhfUExMX1NUQVRVU19MT0NLCQlCSVQoMCkKKyNkZWZpbmUgU0lUOTUzMVhfUExMX1NUQVRV U19PVVRFUl9ESVMJQklUKDUpCisKKy8qIFAtcG9sYXJpdHkgc3RhdHVzIHJlZ2lzdGVycyAqLwor I2RlZmluZSBTSVQ5NTMxWF9DTEtNT05fUF9TVEFUVVNfMDEJCVNJVDk1MzFYX1JFRygweDA2LCAw eDAyKSAgLyogaW5wdXRzIDAsMSAqLworI2RlZmluZSBTSVQ5NTMxWF9DTEtNT05fUF9OT1RJRl8w MQkJU0lUOTUzMVhfUkVHKDB4MDYsIDB4MDMpCisjZGVmaW5lIFNJVDk1MzFYX0NMS01PTl9QX1NU QVRVU18yMwkJU0lUOTUzMVhfUkVHKDB4MDYsIDB4MDYpICAvKiBpbnB1dHMgMiwzICovCisjZGVm aW5lIFNJVDk1MzFYX0NMS01PTl9QX05PVElGXzIzCQlTSVQ5NTMxWF9SRUcoMHgwNiwgMHgwNykK KworLyogTi1wb2xhcml0eSBzdGF0dXMgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNJVDk1MzFYX0NM S01PTl9OX1NUQVRVU18wMQkJU0lUOTUzMVhfUkVHKDB4MDYsIDB4OTIpICAvKiBpbnB1dHMgMCwx ICovCisjZGVmaW5lIFNJVDk1MzFYX0NMS01PTl9OX05PVElGXzAxCQlTSVQ5NTMxWF9SRUcoMHgw NiwgMHg5MykKKyNkZWZpbmUgU0lUOTUzMVhfQ0xLTU9OX05fU1RBVFVTXzIzCQlTSVQ5NTMxWF9S RUcoMHgwNiwgMHg5NikgIC8qIGlucHV0cyAyLDMgKi8KKyNkZWZpbmUgU0lUOTUzMVhfQ0xLTU9O X05fTk9USUZfMjMJCVNJVDk1MzFYX1JFRygweDA2LCAweDk3KQorCisvKiBQZXItaW5wdXQgYml0 IG9mZnNldHMgd2l0aGluIGNsb2NrIG1vbml0b3IgbmliYmxlICovCisjZGVmaW5lIFNJVDk1MzFY X0NMS01PTl9GUkVRX0ZJTkUJCTAgIC8qIGJpdCAwIC8gYml0IDQgKi8KKyNkZWZpbmUgU0lUOTUz MVhfQ0xLTU9OX0ZSRVFfQ09BUlNFCQkxICAvKiBiaXQgMSAvIGJpdCA1ICovCisjZGVmaW5lIFNJ VDk1MzFYX0NMS01PTl9DTEtfTE9TUwkJMiAgLyogYml0IDIgLyBiaXQgNiAqLworI2RlZmluZSBT SVQ5NTMxWF9DTEtNT05fQ0xLX0xPU1NfRkQJCTMgIC8qIGJpdCAzIC8gYml0IDcgKi8KKworLyog LS0tLSBEZWJ1ZyAvIE5WTSB1bmxvY2sgcmVnaXN0ZXJzIC0tLS0gKi8KKyNkZWZpbmUgU0lUOTUz MVhfUkVHX0RCR19VTkxPQ0sxCQkweDI0CisjZGVmaW5lIFNJVDk1MzFYX1JFR19EQkdfVU5MT0NL MgkJMHgyNQorCisvKiAtLS0tIFZhcmlhbnQgSUQgdmFsdWVzIChzaW5nbGUgYnl0ZSByZWFkIGZy b20gU0lUOTUzMVhfUkVHX1ZBUklBTlRfSUQpIC0tLS0gKi8KKyNkZWZpbmUgU0lUOTUzMVhfVkFS SUFOVF9JRF85NTMxNwkweDE3CisjZGVmaW5lIFNJVDk1MzFYX1ZBUklBTlRfSURfOTUzMTYJMHgz MQorCisjZW5kaWYgLyogX1NJVDk1MzFYX1JFR1NfSCAqLwotLSAKMi4zNC4xCgo=