From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6E183C43381 for ; Tue, 2 Mar 2021 08:36:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2956064DE8 for ; Tue, 2 Mar 2021 08:36:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1376770AbhCBHvv (ORCPT ); Tue, 2 Mar 2021 02:51:51 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60084 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1376404AbhCBH2S (ORCPT ); Tue, 2 Mar 2021 02:28:18 -0500 Received: from mail-oi1-x233.google.com (mail-oi1-x233.google.com [IPv6:2607:f8b0:4864:20::233]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EAC82C06178C; Mon, 1 Mar 2021 23:27:17 -0800 (PST) Received: by mail-oi1-x233.google.com with SMTP id w69so21066218oif.1; Mon, 01 Mar 2021 23:27:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=8YWpO+oUelwFS8P7JJPZbCNfi9Z5emBQZAkwd7xewwM=; b=GpSKPNu/vkDcQHKJR83UsrJ0UaIAqOuyiPeD+r1Kq/csfIcgyuBLTiGvz1ykW0Qwf/ gzklNyZpl9jnWKodKVzqQJp0bok88BYXakSDbNko1Mkg5aA4/EBaaO+xOSAwBpJhllba jISs3KkKlS5IrtDMCJxdKaUD+izlsBWtLq6p1YGxiQDVaUc0Kyv34h4TJJmUw3LPJNME CA4jb9cvbhpiX9YqvlXKhrmXyu040o3CMZ9QjqhnYjGaOZpduXzjDqogbw0b6qIN8hTS jX1NPZ3ReiRCPZnkOYC9JY549MPnLQ5SLDZ+EUGsD8rF4aNX5Zv+PdodiYr7qAQ4rJAm xqEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=8YWpO+oUelwFS8P7JJPZbCNfi9Z5emBQZAkwd7xewwM=; b=RNAJ+q5FpLAXlNaCgI2FvJH/DIvS7AUoMBuqnbFAoNZ/DGwOrp+hngY76xix1CMJWj AROX2ZQUu9yN5KY3KdoYjYnlV4rNWpz59NiQILDguqPgFLs5Qu2kP1EaS8CjRA9i18E/ RhJnMSMaplzbrmHvXOdeRydAHNlX3K3LiyV0e+YXppmV221ngPalszPVQDBNmjax4HVk 7L5zVu+2TogTa7WvAEsDJOGtAH0T6KlsTNG8OAYvamOGuVuqx/n+5ZXtI4cauIJj71TW 7MQQlMWr/5DLZnnvp2ZX/94SiXIo0ChnDTNZqyIt820rDHn/L21c0Er/kFpGtpgq8D+N gWIA== X-Gm-Message-State: AOAM530kWbQWjo5Mtrw5y0oEGydUvbJ04MRMEnPtL7O6oQ1JcEPXEDX4 cwmoeBokwHy+hesQuNHDfYDU6Cir6Fa5e0l3pCHV9BUH X-Google-Smtp-Source: ABdhPJyRi5m3vv5FYXRhxrhjCC3K17uS/vOnPaDyyj38T8pYmNPpI0epL0iNLneiDLhMgbxPM47WiJjrPOvdkDYdDAc= X-Received: by 2002:aca:4d55:: with SMTP id a82mr2234507oib.23.1614670037247; Mon, 01 Mar 2021 23:27:17 -0800 (PST) MIME-Version: 1.0 References: <1610973703-676-1-git-send-email-gene.chen.richtek@gmail.com> <1610973703-676-3-git-send-email-gene.chen.richtek@gmail.com> In-Reply-To: <1610973703-676-3-git-send-email-gene.chen.richtek@gmail.com> From: Gene Chen Date: Tue, 2 Mar 2021 15:27:07 +0800 Message-ID: Subject: Re: [PATCH v4 2/2] power: supply: mt6360_charger: add MT6360 charger support To: sre@kernel.org, Matthias Brugger , Rob Herring Cc: linux-pm@vger.kernel.org, devicetree , linux-arm Mailing List , "moderated list:ARM/Mediatek SoC support" , Linux Kernel Mailing List , Gene Chen , Wilma.Wu@mediatek.com, shufan_lee@richtek.com, ChiYuan Huang , benjamin.chao@mediatek.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Gene Chen =E6=96=BC 2021=E5=B9=B41=E6=9C=8818= =E6=97=A5 =E9=80=B1=E4=B8=80 =E4=B8=8B=E5=8D=888:42=E5=AF=AB=E9=81=93=EF=BC= =9A > > From: Gene Chen > > Add basic support for the battery charger for MT6360 PMIC > > Signed-off-by: Gene Chen > --- > drivers/power/supply/Kconfig | 10 + > drivers/power/supply/Makefile | 1 + > drivers/power/supply/mt6360_charger.c | 914 ++++++++++++++++++++++++++++= ++++++ > 3 files changed, 925 insertions(+) > create mode 100644 drivers/power/supply/mt6360_charger.c > > diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig > index eec646c..dd63bed 100644 > --- a/drivers/power/supply/Kconfig > +++ b/drivers/power/supply/Kconfig > @@ -567,6 +567,16 @@ config CHARGER_MP2629 > Battery charger. This driver provides Battery charger power man= agement > functions on the systems. > > +config CHARGER_MT6360 > + tristate "Mediatek MT6360 Charger Driver" > + depends on MFD_MT6360 > + depends on REGULATOR > + help > + Say Y here to enable MT6360 Charger Part. > + The device supports High-Accuracy Voltage/Current Regulation, > + Average Input Current Regulation, Battery Tempature Sensing, > + Over-Temperature Protection, DPDM Detection for BC1.2 > + > config CHARGER_QCOM_SMBB > tristate "Qualcomm Switch-Mode Battery Charger and Boost" > depends on MFD_SPMI_PMIC || COMPILE_TEST > diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefil= e > index dd4b863..9bd0804 100644 > --- a/drivers/power/supply/Makefile > +++ b/drivers/power/supply/Makefile > @@ -77,6 +77,7 @@ obj-$(CONFIG_CHARGER_MAX77693) +=3D max77693_cha= rger.o > obj-$(CONFIG_CHARGER_MAX8997) +=3D max8997_charger.o > obj-$(CONFIG_CHARGER_MAX8998) +=3D max8998_charger.o > obj-$(CONFIG_CHARGER_MP2629) +=3D mp2629_charger.o > +obj-$(CONFIG_CHARGER_MT6360) +=3D mt6360_charger.o > obj-$(CONFIG_CHARGER_QCOM_SMBB) +=3D qcom_smbb.o > obj-$(CONFIG_CHARGER_BQ2415X) +=3D bq2415x_charger.o > obj-$(CONFIG_CHARGER_BQ24190) +=3D bq24190_charger.o > diff --git a/drivers/power/supply/mt6360_charger.c b/drivers/power/supply= /mt6360_charger.c > new file mode 100644 > index 0000000..d80bdad > --- /dev/null > +++ b/drivers/power/supply/mt6360_charger.c > @@ -0,0 +1,914 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (c) 2021 MediaTek Inc. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define MT6360_PMU_CHG_CTRL1 0x311 > +#define MT6360_PMU_CHG_CTRL2 0x312 > +#define MT6360_PMU_CHG_CTRL3 0x313 > +#define MT6360_PMU_CHG_CTRL4 0x314 > +#define MT6360_PMU_CHG_CTRL5 0x315 > +#define MT6360_PMU_CHG_CTRL6 0x316 > +#define MT6360_PMU_CHG_CTRL7 0x317 > +#define MT6360_PMU_CHG_CTRL8 0x318 > +#define MT6360_PMU_CHG_CTRL9 0x319 > +#define MT6360_PMU_CHG_CTRL10 0x31A > +#define MT6360_PMU_DEVICE_TYPE 0x322 > +#define MT6360_PMU_USB_STATUS1 0x327 > +#define MT6360_PMU_CHG_STAT 0x34A > +#define MT6360_PMU_CHG_CTRL19 0x361 > +#define MT6360_PMU_FOD_STAT 0x3E7 > + > +/* MT6360_PMU_CHG_CTRL1 */ > +#define MT6360_FSLP_SHFT (3) > +#define MT6360_FSLP_MASK BIT(MT6360_FSLP_SHFT) > +#define MT6360_OPA_MODE_SHFT (0) > +#define MT6360_OPA_MODE_MASK BIT(MT6360_OPA_MODE_SHFT) > +/* MT6360_PMU_CHG_CTRL2 */ > +#define MT6360_IINLMTSEL_SHFT (2) > +#define MT6360_IINLMTSEL_MASK GENMASK(3, 2) > +/* MT6360_PMU_CHG_CTRL3 */ > +#define MT6360_IAICR_SHFT (2) > +#define MT6360_IAICR_MASK GENMASK(7, 2) > +#define MT6360_ILIM_EN_MASK BIT(0) > +/* MT6360_PMU_CHG_CTRL4 */ > +#define MT6360_VOREG_SHFT (1) > +#define MT6360_VOREG_MASK GENMASK(7, 1) > +/* MT6360_PMU_CHG_CTRL5 */ > +#define MT6360_VOBST_MASK GENMASK(7, 2) > +/* MT6360_PMU_CHG_CTRL6 */ > +#define MT6360_VMIVR_SHFT (1) > +#define MT6360_VMIVR_MASK GENMASK(7, 1) > +/* MT6360_PMU_CHG_CTRL7 */ > +#define MT6360_ICHG_SHFT (2) > +#define MT6360_ICHG_MASK GENMASK(7, 2) > +/* MT6360_PMU_CHG_CTRL8 */ > +#define MT6360_IPREC_SHFT (0) > +#define MT6360_IPREC_MASK GENMASK(3, 0) > +/* MT6360_PMU_CHG_CTRL9 */ > +#define MT6360_IEOC_SHFT (4) > +#define MT6360_IEOC_MASK GENMASK(7, 4) > +/* MT6360_PMU_CHG_CTRL10 */ > +#define MT6360_OTG_OC_MASK GENMASK(3, 0) > +/* MT6360_PMU_DEVICE_TYPE */ > +#define MT6360_USBCHGEN_MASK BIT(7) > +/* MT6360_PMU_USB_STATUS1 */ > +#define MT6360_USB_STATUS_SHFT (4) > +#define MT6360_USB_STATUS_MASK GENMASK(6, 4) > +/* MT6360_PMU_CHG_STAT */ > +#define MT6360_CHG_STAT_SHFT (6) > +#define MT6360_CHG_STAT_MASK GENMASK(7, 6) > +#define MT6360_VBAT_LVL_MASK BIT(5) > +/* MT6360_PMU_CHG_CTRL19 */ > +#define MT6360_VINOVP_SHFT (5) > +#define MT6360_VINOVP_MASK GENMASK(6, 5) > +/* MT6360_PMU_FOD_STAT */ > +#define MT6360_CHRDET_EXT_MASK BIT(4) > + > +/* uV */ > +#define MT6360_VMIVR_MIN 3900000 > +#define MT6360_VMIVR_MAX 13400000 > +#define MT6360_VMIVR_STEP 100000 > +/* uA */ > +#define MT6360_ICHG_MIN 100000 > +#define MT6360_ICHG_MAX 5000000 > +#define MT6360_ICHG_STEP 100000 > +/* uV */ > +#define MT6360_VOREG_MIN 3900000 > +#define MT6360_VOREG_MAX 4710000 > +#define MT6360_VOREG_STEP 10000 > +/* uA */ > +#define MT6360_AICR_MIN 100000 > +#define MT6360_AICR_MAX 3250000 > +#define MT6360_AICR_STEP 50000 > +/* uA */ > +#define MT6360_IPREC_MIN 100000 > +#define MT6360_IPREC_MAX 850000 > +#define MT6360_IPREC_STEP 50000 > +/* uA */ > +#define MT6360_IEOC_MIN 100000 > +#define MT6360_IEOC_MAX 850000 > +#define MT6360_IEOC_STEP 50000 > + > +struct mt6360_chg_info { > + struct device *dev; > + struct regmap *regmap; > + struct power_supply_desc psy_desc; > + struct power_supply *psy; > + struct regulator_dev *otg_rdev; > + struct mutex chgdet_lock; > + u32 vinovp; > + bool pwr_rdy; > + bool bc12_en; > + int psy_usb_type; > + struct work_struct chrdet_work; > +}; > + > +enum mt6360_iinlmtsel { > + MT6360_IINLMTSEL_AICR_3250 =3D 0, > + MT6360_IINLMTSEL_CHG_TYPE, > + MT6360_IINLMTSEL_AICR, > + MT6360_IINLMTSEL_LOWER_LEVEL, > +}; > + > +enum mt6360_pmu_chg_type { > + MT6360_CHG_TYPE_NOVBUS =3D 0, > + MT6360_CHG_TYPE_UNDER_GOING, > + MT6360_CHG_TYPE_SDP, > + MT6360_CHG_TYPE_SDPNSTD, > + MT6360_CHG_TYPE_DCP, > + MT6360_CHG_TYPE_CDP, > + MT6360_CHG_TYPE_DISABLE_BC12, > + MT6360_CHG_TYPE_MAX, > +}; > + > +static enum power_supply_usb_type mt6360_charger_usb_types[] =3D { > + POWER_SUPPLY_USB_TYPE_UNKNOWN, > + POWER_SUPPLY_USB_TYPE_SDP, > + POWER_SUPPLY_USB_TYPE_DCP, > + POWER_SUPPLY_USB_TYPE_CDP, > +}; > + > +static unsigned int mt6360_map_reg_sel(u32 data, u32 min, u32 max, u32 s= tep) > +{ > + u32 target =3D 0, max_sel; > + > + if (data >=3D min) { > + target =3D (data - min) / step; > + max_sel =3D (max - min) / step; > + if (target > max_sel) > + target =3D max_sel; > + } > + return target; > +} > + > +static u32 mt6360_map_real_val(u32 sel, u32 min, u32 max, u32 step) > +{ > + u32 target =3D 0; > + > + target =3D min + (sel * step); > + if (target > max) > + target =3D max; > + return target; > +} > + > +static int mt6360_get_chrdet_ext_stat(struct mt6360_chg_info *mci, > + bool *pwr_rdy) > +{ > + int ret; > + unsigned int regval; > + > + ret =3D regmap_read(mci->regmap, MT6360_PMU_FOD_STAT, ®val); > + if (ret < 0) > + return ret; > + *pwr_rdy =3D (regval & MT6360_CHRDET_EXT_MASK) ? true : false; > + return 0; > +} > + > +static int mt6360_charger_get_online(struct mt6360_chg_info *mci, > + union power_supply_propval *val) > +{ > + int ret; > + bool pwr_rdy; > + > + ret =3D mt6360_get_chrdet_ext_stat(mci, &pwr_rdy); > + if (ret < 0) > + return ret; > + val->intval =3D pwr_rdy ? true : false; > + return 0; > +} > + > +static int mt6360_charger_get_status(struct mt6360_chg_info *mci, > + union power_supply_propval *val) > +{ > + int status, ret; > + unsigned int regval; > + bool pwr_rdy; > + > + ret =3D mt6360_get_chrdet_ext_stat(mci, &pwr_rdy); > + if (ret < 0) > + return ret; > + if (!pwr_rdy) { > + status =3D POWER_SUPPLY_STATUS_DISCHARGING; > + goto out; > + } > + > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_STAT, ®val); > + if (ret < 0) > + return ret; > + regval &=3D MT6360_CHG_STAT_MASK; > + regval >>=3D MT6360_CHG_STAT_SHFT; > + switch (regval) { > + case 0x0: > + status =3D POWER_SUPPLY_STATUS_NOT_CHARGING; > + break; > + case 0x1: > + status =3D POWER_SUPPLY_STATUS_CHARGING; > + break; > + case 0x2: > + status =3D POWER_SUPPLY_STATUS_FULL; > + break; > + default: > + ret =3D -EIO; > + } > +out: > + if (!ret) > + val->intval =3D status; > + return ret; > +} > + > +static int mt6360_charger_get_charge_type(struct mt6360_chg_info *mci, > + union power_supply_propval *val= ) > +{ > + int type, ret; > + unsigned int regval; > + u8 chg_stat; > + > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_STAT, ®val); > + if (ret < 0) > + return ret; > + > + chg_stat =3D (regval & MT6360_CHG_STAT_MASK) >> MT6360_CHG_STAT_S= HFT; > + switch (chg_stat) { > + case 0x01: /* Charge in Progress */ > + if (regval & MT6360_VBAT_LVL_MASK) > + type =3D POWER_SUPPLY_CHARGE_TYPE_FAST; > + else > + type =3D POWER_SUPPLY_CHARGE_TYPE_TRICKLE; > + break; > + case 0x00: /* Not Charging */ > + case 0x02: /* Charge Done */ > + case 0x03: /* Charge Fault */ > + default: > + type =3D POWER_SUPPLY_CHARGE_TYPE_NONE; > + break; > + } > + > + val->intval =3D type; > + return 0; > +} > + > +static int mt6360_charger_get_ichg(struct mt6360_chg_info *mci, > + union power_supply_propval *val) > +{ > + int ret; > + unsigned int regval; > + > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL7, ®val); > + if (ret < 0) > + return ret; > + regval =3D (regval & MT6360_ICHG_MASK) >> MT6360_ICHG_SHFT; > + val->intval =3D mt6360_map_real_val(regval, > + MT6360_ICHG_MIN, > + MT6360_ICHG_MAX, > + MT6360_ICHG_STEP); > + return 0; > +} > + > +static int mt6360_charger_get_max_ichg(struct mt6360_chg_info *mci, > + union power_supply_propval *val) > +{ > + val->intval =3D MT6360_ICHG_MAX; > + return 0; > +} > + > +static int mt6360_charger_get_cv(struct mt6360_chg_info *mci, > + union power_supply_propval *val) > +{ > + int ret; > + unsigned int regval; > + > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL4, ®val); > + if (ret < 0) > + return ret; > + regval =3D (regval & MT6360_VOREG_MASK) >> MT6360_VOREG_SHFT; > + val->intval =3D mt6360_map_real_val(regval, > + MT6360_VOREG_MIN, > + MT6360_VOREG_MAX, > + MT6360_VOREG_STEP); > + return 0; > +} > + > +static int mt6360_charger_get_max_cv(struct mt6360_chg_info *mci, > + union power_supply_propval *val) > +{ > + val->intval =3D MT6360_VOREG_MAX; > + return 0; > +} > + > +static int mt6360_charger_get_aicr(struct mt6360_chg_info *mci, > + union power_supply_propval *val) > +{ > + int ret; > + unsigned int regval; > + > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL3, ®val); > + if (ret < 0) > + return ret; > + regval =3D (regval & MT6360_IAICR_MASK) >> MT6360_IAICR_SHFT; > + val->intval =3D mt6360_map_real_val(regval, > + MT6360_AICR_MIN, > + MT6360_AICR_MAX, > + MT6360_AICR_STEP); > + return 0; > +} > + > +static int mt6360_charger_get_mivr(struct mt6360_chg_info *mci, > + union power_supply_propval *val) > +{ > + int ret; > + unsigned int regval; > + > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL6, ®val); > + if (ret < 0) > + return ret; > + regval =3D (regval & MT6360_VMIVR_MASK) >> MT6360_VMIVR_SHFT; > + val->intval =3D mt6360_map_real_val(regval, > + MT6360_VMIVR_MIN, > + MT6360_VMIVR_MAX, > + MT6360_VMIVR_STEP); > + return 0; > +} > + > +static int mt6360_charger_get_iprechg(struct mt6360_chg_info *mci, > + union power_supply_propval *val) > +{ > + int ret; > + unsigned int regval; > + > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL8, ®val); > + if (ret < 0) > + return ret; > + regval =3D (regval & MT6360_IPREC_MASK) >> MT6360_IPREC_SHFT; > + val->intval =3D mt6360_map_real_val(regval, > + MT6360_IPREC_MIN, > + MT6360_IPREC_MAX, > + MT6360_IPREC_STEP); > + return 0; > +} > + > +static int mt6360_charger_get_ieoc(struct mt6360_chg_info *mci, > + union power_supply_propval *val) > +{ > + int ret; > + unsigned int regval; > + > + ret =3D regmap_read(mci->regmap, MT6360_PMU_CHG_CTRL9, ®val); > + if (ret < 0) > + return ret; > + regval =3D (regval & MT6360_IEOC_MASK) >> MT6360_IEOC_SHFT; > + val->intval =3D mt6360_map_real_val(regval, > + MT6360_IEOC_MIN, > + MT6360_IEOC_MAX, > + MT6360_IEOC_STEP); > + return 0; > +} > + > +static int mt6360_charger_set_online(struct mt6360_chg_info *mci, > + const union power_supply_propval *va= l) > +{ > + u8 force_sleep =3D val->intval ? 0 : 1; > + > + return regmap_update_bits(mci->regmap, > + MT6360_PMU_CHG_CTRL1, > + MT6360_FSLP_MASK, > + force_sleep << MT6360_FSLP_SHFT); > +} > + > +static int mt6360_charger_set_ichg(struct mt6360_chg_info *mci, > + const union power_supply_propval *val) > +{ > + u8 sel; > + > + sel =3D mt6360_map_reg_sel(val->intval, > + MT6360_ICHG_MIN, > + MT6360_ICHG_MAX, > + MT6360_ICHG_STEP); > + return regmap_update_bits(mci->regmap, > + MT6360_PMU_CHG_CTRL7, > + MT6360_ICHG_MASK, > + sel << MT6360_ICHG_SHFT); > +} > + > +static int mt6360_charger_set_cv(struct mt6360_chg_info *mci, > + const union power_supply_propval *val) > +{ > + u8 sel; > + > + sel =3D mt6360_map_reg_sel(val->intval, > + MT6360_VOREG_MIN, > + MT6360_VOREG_MAX, > + MT6360_VOREG_STEP); > + return regmap_update_bits(mci->regmap, > + MT6360_PMU_CHG_CTRL4, > + MT6360_VOREG_MASK, > + sel << MT6360_VOREG_SHFT); > +} > + > +static int mt6360_charger_set_aicr(struct mt6360_chg_info *mci, > + const union power_supply_propval *val) > +{ > + u8 sel; > + > + sel =3D mt6360_map_reg_sel(val->intval, > + MT6360_AICR_MIN, > + MT6360_AICR_MAX, > + MT6360_AICR_STEP); > + return regmap_update_bits(mci->regmap, > + MT6360_PMU_CHG_CTRL3, > + MT6360_IAICR_MASK, > + sel << MT6360_IAICR_SHFT); > +} > + > +static int mt6360_charger_set_mivr(struct mt6360_chg_info *mci, > + const union power_supply_propval *val) > +{ > + u8 sel; > + > + sel =3D mt6360_map_reg_sel(val->intval, > + MT6360_VMIVR_MIN, > + MT6360_VMIVR_MAX, > + MT6360_VMIVR_STEP); > + return regmap_update_bits(mci->regmap, > + MT6360_PMU_CHG_CTRL3, > + MT6360_VMIVR_MASK, > + sel << MT6360_VMIVR_SHFT); > +} > + > +static int mt6360_charger_set_iprechg(struct mt6360_chg_info *mci, > + const union power_supply_propval *v= al) > +{ > + u8 sel; > + > + sel =3D mt6360_map_reg_sel(val->intval, > + MT6360_IPREC_MIN, > + MT6360_IPREC_MAX, > + MT6360_IPREC_STEP); > + return regmap_update_bits(mci->regmap, > + MT6360_PMU_CHG_CTRL8, > + MT6360_IPREC_MASK, > + sel << MT6360_IPREC_SHFT); > +} > + > +static int mt6360_charger_set_ieoc(struct mt6360_chg_info *mci, > + const union power_supply_propval *val) > +{ > + u8 sel; > + > + sel =3D mt6360_map_reg_sel(val->intval, > + MT6360_IEOC_MIN, > + MT6360_IEOC_MAX, > + MT6360_IEOC_STEP); > + return regmap_update_bits(mci->regmap, > + MT6360_PMU_CHG_CTRL9, > + MT6360_IEOC_MASK, > + sel << MT6360_IEOC_SHFT); > +} > + > +static int mt6360_charger_get_property(struct power_supply *psy, > + enum power_supply_property psp, > + union power_supply_propval *val) > +{ > + struct mt6360_chg_info *mci =3D power_supply_get_drvdata(psy); > + int ret =3D 0; > + > + switch (psp) { > + case POWER_SUPPLY_PROP_ONLINE: > + ret =3D mt6360_charger_get_online(mci, val); > + break; > + case POWER_SUPPLY_PROP_STATUS: > + ret =3D mt6360_charger_get_status(mci, val); > + break; > + case POWER_SUPPLY_PROP_CHARGE_TYPE: > + ret =3D mt6360_charger_get_charge_type(mci, val); > + break; > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: > + ret =3D mt6360_charger_get_ichg(mci, val); > + break; > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: > + ret =3D mt6360_charger_get_max_ichg(mci, val); > + break; > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: > + ret =3D mt6360_charger_get_cv(mci, val); > + break; > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX: > + ret =3D mt6360_charger_get_max_cv(mci, val); > + break; > + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: > + ret =3D mt6360_charger_get_aicr(mci, val); > + break; > + case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: > + ret =3D mt6360_charger_get_mivr(mci, val); > + break; > + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: > + ret =3D mt6360_charger_get_iprechg(mci, val); > + break; > + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: > + ret =3D mt6360_charger_get_ieoc(mci, val); > + break; > + case POWER_SUPPLY_PROP_USB_TYPE: > + val->intval =3D mci->psy_usb_type; > + break; > + default: > + ret =3D -ENODATA; > + } > + return ret; > +} > + > +static int mt6360_charger_set_property(struct power_supply *psy, > + enum power_supply_property psp, > + const union power_supply_propval *= val) > +{ > + struct mt6360_chg_info *mci =3D power_supply_get_drvdata(psy); > + int ret; > + > + switch (psp) { > + case POWER_SUPPLY_PROP_ONLINE: > + ret =3D mt6360_charger_set_online(mci, val); > + break; > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: > + ret =3D mt6360_charger_set_ichg(mci, val); > + break; > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: > + ret =3D mt6360_charger_set_cv(mci, val); > + break; > + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: > + ret =3D mt6360_charger_set_aicr(mci, val); > + break; > + case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: > + ret =3D mt6360_charger_set_mivr(mci, val); > + break; > + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: > + ret =3D mt6360_charger_set_iprechg(mci, val); > + break; > + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: > + ret =3D mt6360_charger_set_ieoc(mci, val); > + break; > + default: > + ret =3D -EINVAL; > + } > + return ret; > +} > + > +static int mt6360_charger_property_is_writeable(struct power_supply *psy= , > + enum power_supply_property= psp) > +{ > + switch (psp) { > + case POWER_SUPPLY_PROP_ONLINE: > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: > + case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE: > + case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: > + case POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT: > + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: > + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: > + return 1; > + default: > + return 0; > + } > +} > + > +static enum power_supply_property mt6360_charger_properties[] =3D { > + POWER_SUPPLY_PROP_ONLINE, > + POWER_SUPPLY_PROP_STATUS, > + POWER_SUPPLY_PROP_CHARGE_TYPE, > + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, > + POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, > + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, > + POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX, > + POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, > + POWER_SUPPLY_PROP_INPUT_VOLTAGE_LIMIT, > + POWER_SUPPLY_PROP_PRECHARGE_CURRENT, > + POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT, > + POWER_SUPPLY_PROP_USB_TYPE, > +}; > + > +static const struct power_supply_desc mt6360_charger_desc =3D { > + .type =3D POWER_SUPPLY_TYPE_USB, > + .properties =3D mt6360_charger_properties, > + .num_properties =3D ARRAY_SIZE(mt6360_charger_properties)= , > + .get_property =3D mt6360_charger_get_property, > + .set_property =3D mt6360_charger_set_property, > + .property_is_writeable =3D mt6360_charger_property_is_writeable, > + .usb_types =3D mt6360_charger_usb_types, > + .num_usb_types =3D ARRAY_SIZE(mt6360_charger_usb_types), > +}; > + > +static const struct regulator_ops mt6360_chg_otg_ops =3D { > + .list_voltage =3D regulator_list_voltage_linear, > + .enable =3D regulator_enable_regmap, > + .disable =3D regulator_disable_regmap, > + .is_enabled =3D regulator_is_enabled_regmap, > + .set_voltage_sel =3D regulator_set_voltage_sel_regmap, > + .get_voltage_sel =3D regulator_get_voltage_sel_regmap, > +}; > + > +static const struct regulator_desc mt6360_otg_rdesc =3D { > + .of_match =3D "usb-otg-vbus", > + .name =3D "usb-otg-vbus", > + .ops =3D &mt6360_chg_otg_ops, > + .owner =3D THIS_MODULE, > + .type =3D REGULATOR_VOLTAGE, > + .min_uV =3D 4425000, > + .uV_step =3D 25000, > + .n_voltages =3D 57, > + .vsel_reg =3D MT6360_PMU_CHG_CTRL5, > + .vsel_mask =3D MT6360_VOBST_MASK, > + .enable_reg =3D MT6360_PMU_CHG_CTRL1, > + .enable_mask =3D MT6360_OPA_MODE_MASK, > +}; > + > +static irqreturn_t mt6360_pmu_attach_i_handler(int irq, void *data) > +{ > + struct mt6360_chg_info *mci =3D data; > + int ret; > + unsigned int usb_status; > + int last_usb_type; > + > + mutex_lock(&mci->chgdet_lock); > + if (!mci->bc12_en) { > + dev_warn(mci->dev, "Received attach interrupt, bc12 disab= led, ignore irq\n"); > + goto out; > + } > + last_usb_type =3D mci->psy_usb_type; > + /* Plug in */ > + ret =3D regmap_read(mci->regmap, MT6360_PMU_USB_STATUS1, &usb_sta= tus); > + if (ret < 0) > + goto out; > + usb_status &=3D MT6360_USB_STATUS_MASK; > + usb_status >>=3D MT6360_USB_STATUS_SHFT; > + switch (usb_status) { > + case MT6360_CHG_TYPE_NOVBUS: > + dev_dbg(mci->dev, "Received attach interrupt, no vbus\n")= ; > + goto out; > + case MT6360_CHG_TYPE_UNDER_GOING: > + dev_dbg(mci->dev, "Received attach interrupt, under going= ...\n"); > + goto out; > + case MT6360_CHG_TYPE_SDP: > + mci->psy_usb_type =3D POWER_SUPPLY_USB_TYPE_SDP; > + break; > + case MT6360_CHG_TYPE_SDPNSTD: > + mci->psy_usb_type =3D POWER_SUPPLY_USB_TYPE_SDP; > + break; > + case MT6360_CHG_TYPE_CDP: > + mci->psy_usb_type =3D POWER_SUPPLY_USB_TYPE_CDP; > + break; > + case MT6360_CHG_TYPE_DCP: > + mci->psy_usb_type =3D POWER_SUPPLY_USB_TYPE_DCP; > + break; > + case MT6360_CHG_TYPE_DISABLE_BC12: > + dev_dbg(mci->dev, "Received attach interrupt, bc12 detect= not enable\n"); > + goto out; > + default: > + dev_dbg(mci->dev, "Received attach interrupt, reserved ad= dress\n"); > + goto out; > + } > + > + dev_dbg(mci->dev, "Received attach interrupt, chg_type =3D %d\n",= mci->psy_usb_type); > + if (last_usb_type !=3D mci->psy_usb_type) > + power_supply_changed(mci->psy); > +out: > + mutex_unlock(&mci->chgdet_lock); > + return IRQ_HANDLED; > +} > + > +static void mt6360_handle_chrdet_ext_evt(struct mt6360_chg_info *mci) > +{ > + int ret; > + bool pwr_rdy; > + > + mutex_lock(&mci->chgdet_lock); > + ret =3D mt6360_get_chrdet_ext_stat(mci, &pwr_rdy); > + if (ret < 0) > + goto out; > + if (mci->pwr_rdy =3D=3D pwr_rdy) { > + dev_dbg(mci->dev, "Received vbus interrupt, pwr_rdy is sa= me(%d)\n", pwr_rdy); > + goto out; > + } > + mci->pwr_rdy =3D pwr_rdy; > + dev_dbg(mci->dev, "Received vbus interrupt, pwr_rdy =3D %d\n", pw= r_rdy); > + if (!pwr_rdy) { > + mci->psy_usb_type =3D POWER_SUPPLY_USB_TYPE_UNKNOWN; > + power_supply_changed(mci->psy); > + > + } > + ret =3D regmap_update_bits(mci->regmap, > + MT6360_PMU_DEVICE_TYPE, > + MT6360_USBCHGEN_MASK, > + pwr_rdy ? MT6360_USBCHGEN_MASK : 0); > + if (ret < 0) > + goto out; > + mci->bc12_en =3D pwr_rdy; > +out: > + mutex_unlock(&mci->chgdet_lock); > +} > + > +static void mt6360_chrdet_work(struct work_struct *work) > +{ > + struct mt6360_chg_info *mci =3D (struct mt6360_chg_info *)contain= er_of( > + work, struct mt6360_chg_info, chrdet= _work); > + > + mt6360_handle_chrdet_ext_evt(mci); > +} > + > +static irqreturn_t mt6360_pmu_chrdet_ext_evt_handler(int irq, void *data= ) > +{ > + struct mt6360_chg_info *mci =3D data; > + > + mt6360_handle_chrdet_ext_evt(mci); > + return IRQ_HANDLED; > +} > + > +static int mt6360_chg_irq_register(struct platform_device *pdev) > +{ > + const struct { > + const char *name; > + irq_handler_t handler; > + } irq_descs[] =3D { > + { "attach_i", mt6360_pmu_attach_i_handler }, > + { "chrdet_ext_evt", mt6360_pmu_chrdet_ext_evt_handler } > + }; > + int i, ret; > + > + for (i =3D 0; i < ARRAY_SIZE(irq_descs); i++) { > + ret =3D platform_get_irq_byname(pdev, irq_descs[i].name); > + if (ret < 0) > + return ret; > + > + ret =3D devm_request_threaded_irq(&pdev->dev, ret, NULL, > + irq_descs[i].handler, > + IRQF_TRIGGER_FALLING, > + irq_descs[i].name, > + platform_get_drvdata(pdev= )); > + if (ret < 0) > + return dev_err_probe(&pdev->dev, ret, "Failed to = request %s irq\n", > + irq_descs[i].name); > + } > + > + return 0; > +} > + > +struct mt6360_field_info { > + struct device_attribute dev_attr; > + u16 reg; > + u8 mask; > + u8 shft; > +}; > + > +static int mt6360_chg_init_setting(struct mt6360_chg_info *mci) > +{ > + int ret; > + > + ret =3D regmap_update_bits(mci->regmap, MT6360_PMU_DEVICE_TYPE, > + MT6360_USBCHGEN_MASK, 0); > + if (ret) > + return dev_err_probe(mci->dev, ret, "%s: Failed to disabl= e bc12\n", __func__); > + ret =3D regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL2, > + MT6360_IINLMTSEL_MASK, > + MT6360_IINLMTSEL_AICR << > + MT6360_IINLMTSEL_SHFT); > + if (ret) > + return dev_err_probe(mci->dev, ret, > + "%s: Failed to switch iinlmtsel to a= icr\n", __func__); > + usleep_range(5000, 6000); > + ret =3D regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL3, > + MT6360_ILIM_EN_MASK, 0); > + if (ret) > + return dev_err_probe(mci->dev, ret, > + "%s: Failed to disable ilim\n", __fu= nc__); > + ret =3D regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL10, > + MT6360_OTG_OC_MASK, MT6360_OTG_OC_MASK); > + if (ret) > + return dev_err_probe(mci->dev, ret, > + "%s: Failed to config otg oc to 3A\n= ", __func__); > + return 0; > +} > + > +static u32 mt6360_vinovp_trans_to_sel(u32 val) > +{ > + u32 vinovp_tbl[] =3D { 5500000, 6500000, 11000000, 14500000 }; > + int i; > + > + /* Select the smaller and equal supported value */ > + for (i =3D 0; i < ARRAY_SIZE(vinovp_tbl)-1; i++) { > + if (val < vinovp_tbl[i+1]) > + break; > + } > + return i; > +} > + > +static int mt6360_parse_dt(struct platform_device *pdev) > +{ > + struct mt6360_chg_info *mci =3D dev_get_drvdata(&pdev->dev); > + int ret; > + > + ret =3D device_property_read_u32(&pdev->dev, "richtek,vinovp-micr= ovolt", &mci->vinovp); > + if (ret) > + return dev_err_probe(&pdev->dev, ret, "Failed to parse vi= novp in DT\n"); > + return ret; > +} > + > +static int mt6360_apply_dt(struct platform_device *pdev) > +{ > + struct mt6360_chg_info *mci =3D dev_get_drvdata(&pdev->dev); > + u32 sel; > + > + sel =3D mt6360_vinovp_trans_to_sel(mci->vinovp); > + return regmap_update_bits(mci->regmap, MT6360_PMU_CHG_CTRL19, > + MT6360_VINOVP_MASK, sel << MT6360_VINOV= P_SHFT); > +} > + > +static int mt6360_charger_probe(struct platform_device *pdev) > +{ > + struct mt6360_chg_info *mci; > + struct power_supply_config charger_cfg =3D {}; > + struct regulator_config config =3D { }; > + int ret; > + > + mci =3D devm_kzalloc(&pdev->dev, sizeof(*mci), GFP_KERNEL); > + if (!mci) > + return -ENOMEM; > + > + ret =3D mt6360_parse_dt(pdev); > + if (ret) > + return dev_err_probe(&pdev->dev, ret, "Failed to parse dt= \n"); > + > + mci->dev =3D &pdev->dev; > + mci->vinovp =3D 6500000; > + mutex_init(&mci->chgdet_lock); > + platform_set_drvdata(pdev, mci); > + INIT_WORK(&mci->chrdet_work, &mt6360_chrdet_work); > + > + mci->regmap =3D dev_get_regmap(pdev->dev.parent, NULL); > + if (!mci->regmap) > + return dev_err_probe(&pdev->dev, -ENODEV, "Failed to get = parent regmap\n"); > + > + ret =3D mt6360_apply_dt(pdev); > + if (ret) > + return dev_err_probe(&pdev->dev, ret, "Failed to apply dt= \n"); > + > + memcpy(&mci->psy_desc, &mt6360_charger_desc, sizeof(mci->psy_desc= )); > + mci->psy_desc.name =3D dev_name(&pdev->dev); > + charger_cfg.drv_data =3D mci; > + charger_cfg.of_node =3D pdev->dev.of_node; > + mci->psy =3D devm_power_supply_register(&pdev->dev, > + &mci->psy_desc, &charger_cf= g); > + if (IS_ERR(mci->psy)) > + return dev_err_probe(&pdev->dev, PTR_ERR(mci->psy), > + "Failed to register power supply dev= \n"); > + > + ret =3D mt6360_chg_init_setting(mci); > + if (ret) > + return dev_err_probe(&pdev->dev, ret, "Failed to initial = setting\n"); > + > + schedule_work(&mci->chrdet_work); > + > + ret =3D mt6360_chg_irq_register(pdev); > + if (ret) > + return dev_err_probe(&pdev->dev, ret, "Failed to register= irqs\n"); > + > + config.dev =3D &pdev->dev; > + config.regmap =3D mci->regmap; > + mci->otg_rdev =3D devm_regulator_register(&pdev->dev, &mt6360_otg= _rdesc, > + &config); > + if (IS_ERR(mci->otg_rdev)) > + return PTR_ERR(mci->otg_rdev); > + > + return 0; > +} > + > +static const struct of_device_id __maybe_unused mt6360_charger_of_id[] = =3D { > + { .compatible =3D "mediatek,mt6360-chg", }, > + {}, > +}; > +MODULE_DEVICE_TABLE(of, mt6360_charger_of_id); > + > +static const struct platform_device_id mt6360_charger_id[] =3D { > + { "mt6360-chg", 0 }, > + {}, > +}; > +MODULE_DEVICE_TABLE(platform, mt6360_charger_id); > + > +static struct platform_driver mt6360_charger_driver =3D { > + .driver =3D { > + .name =3D "mt6360-chg", > + .of_match_table =3D of_match_ptr(mt6360_charger_of_id), > + }, > + .probe =3D mt6360_charger_probe, > + .id_table =3D mt6360_charger_id, > +}; > +module_platform_driver(mt6360_charger_driver); > + > +MODULE_AUTHOR("Gene Chen "); > +MODULE_DESCRIPTION("MT6360 Charger Driver"); > +MODULE_LICENSE("GPL"); > -- > 2.7.4 > Dear Reviewers, Is there any change I can fix, please let me know, thanks From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.7 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D0C69C433E0 for ; Tue, 2 Mar 2021 07:27:38 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 38CDE61494 for ; Tue, 2 Mar 2021 07:27:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 38CDE61494 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=WTIrPnRzOQ8XjlzPOe/els8pjQvDQLn53uQhGRHD7Ic=; b=btpEVh8CzVgiBCiCS3kmCtdEP f9gI03JOuFFNsHFhANEu+me9SYR0J5m58/enfujENfWp5c0oiTHSD3jfrVgU3mqXJ0d4VuEnZxfBJ Hf6bM64rFUAfm40eGcZMCXBYcHKip/z3cP5X1KTWWbJc4LuMbeSdtEyCfabcoC4HZbJ8saDlV6U74 7ish7tc+XqTuJ+3d1FXfAgvg2z/K1axKlg5d0Jotk8+A4/4Q1epUYUiB9inwqAlWoGjfTTVyjmzHH BVpA/KhydbaY4+FaZRCuVJnpBIwRghg0tkcrJZbp3UES/kcNmyO3zg2nAACfaRSqx8nb/wJueqoQh Q4W913QdQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1lGzRE-0005PC-H0; Tue, 02 Mar 2021 07:27:24 +0000 Received: from mail-oi1-x230.google.com ([2607:f8b0:4864:20::230]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1lGzR9-0005OV-RB; Tue, 02 Mar 2021 07:27:21 +0000 Received: by mail-oi1-x230.google.com with SMTP id f3so20996797oiw.13; Mon, 01 Mar 2021 23:27:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=8YWpO+oUelwFS8P7JJPZbCNfi9Z5emBQZAkwd7xewwM=; b=GpSKPNu/vkDcQHKJR83UsrJ0UaIAqOuyiPeD+r1Kq/csfIcgyuBLTiGvz1ykW0Qwf/ gzklNyZpl9jnWKodKVzqQJp0bok88BYXakSDbNko1Mkg5aA4/EBaaO+xOSAwBpJhllba jISs3KkKlS5IrtDMCJxdKaUD+izlsBWtLq6p1YGxiQDVaUc0Kyv34h4TJJmUw3LPJNME CA4jb9cvbhpiX9YqvlXKhrmXyu040o3CMZ9QjqhnYjGaOZpduXzjDqogbw0b6qIN8hTS jX1NPZ3ReiRCPZnkOYC9JY549MPnLQ5SLDZ+EUGsD8rF4aNX5Zv+PdodiYr7qAQ4rJAm xqEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=8YWpO+oUelwFS8P7JJPZbCNfi9Z5emBQZAkwd7xewwM=; b=WKxFB2jBW+da4bv6UNm4dHHghnekTRDmlT4slDXNhW8mqHTox/aEFLOCaMAO+nFuoo JhsEVE79xdMCXCevOEzwE7Gl/7TFUXAYBwD7bTc2DzKaO/YFqZwnhbtO9x3Xzam6u092 rWWVJRv065g5T1CBs+CmPcF3TtlpyKFVeL6N4R4uKMtj0Fnvci1N6/UsvngnklK6FBis UOCQyfi0SwRLYgqMmfWeursUDAq6ynhU2QpZJbwEKTqVC/8Qjuuv51GASRYLSIYnDALc vc57AZTGtgKEcdT3mAwJsxiKFG1W8QbI0yDNyoHnChfzCJYHsGtPFEyRJ7wLfq/3EWpp wcNQ== X-Gm-Message-State: AOAM532//vU52xpku34TrFjqLoVjUt84HKlgsOymut6N9WiB+xhHW+BA 7bSC6D/GMblh6KrhSMfI+VXJq+UTlEpGmW++KVc= X-Google-Smtp-Source: ABdhPJyRi5m3vv5FYXRhxrhjCC3K17uS/vOnPaDyyj38T8pYmNPpI0epL0iNLneiDLhMgbxPM47WiJjrPOvdkDYdDAc= X-Received: by 2002:aca:4d55:: with SMTP id a82mr2234507oib.23.1614670037247; Mon, 01 Mar 2021 23:27:17 -0800 (PST) MIME-Version: 1.0 References: <1610973703-676-1-git-send-email-gene.chen.richtek@gmail.com> <1610973703-676-3-git-send-email-gene.chen.richtek@gmail.com> In-Reply-To: <1610973703-676-3-git-send-email-gene.chen.richtek@gmail.com> From: Gene Chen Date: Tue, 2 Mar 2021 15:27:07 +0800 Message-ID: Subject: Re: [PATCH v4 2/2] power: supply: mt6360_charger: add MT6360 charger support To: sre@kernel.org, Matthias Brugger , Rob Herring X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210302_022719_986722_57D418D6 X-CRM114-Status: GOOD ( 23.65 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gene Chen , devicetree , linux-pm@vger.kernel.org, Linux Kernel Mailing List , ChiYuan Huang , benjamin.chao@mediatek.com, "moderated list:ARM/Mediatek SoC support" , Wilma.Wu@mediatek.com, linux-arm Mailing List , shufan_lee@richtek.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org R2VuZSBDaGVuIDxnZW5lLmNoZW4ucmljaHRla0BnbWFpbC5jb20+IOaWvCAyMDIx5bm0MeaciDE4 5pelIOmAseS4gCDkuIvljYg4OjQy5a+r6YGT77yaCj4KPiBGcm9tOiBHZW5lIENoZW4gPGdlbmVf Y2hlbkByaWNodGVrLmNvbT4KPgo+IEFkZCBiYXNpYyBzdXBwb3J0IGZvciB0aGUgYmF0dGVyeSBj aGFyZ2VyIGZvciBNVDYzNjAgUE1JQwo+Cj4gU2lnbmVkLW9mZi1ieTogR2VuZSBDaGVuIDxnZW5l X2NoZW5AcmljaHRlay5jb20+Cj4gLS0tCj4gIGRyaXZlcnMvcG93ZXIvc3VwcGx5L0tjb25maWcg ICAgICAgICAgfCAgMTAgKwo+ICBkcml2ZXJzL3Bvd2VyL3N1cHBseS9NYWtlZmlsZSAgICAgICAg IHwgICAxICsKPiAgZHJpdmVycy9wb3dlci9zdXBwbHkvbXQ2MzYwX2NoYXJnZXIuYyB8IDkxNCAr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgOTI1 IGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvcG93ZXIvc3VwcGx5 L210NjM2MF9jaGFyZ2VyLmMKPgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9L Y29uZmlnIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvS2NvbmZpZwo+IGluZGV4IGVlYzY0NmMuLmRk NjNiZWQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9wb3dlci9zdXBwbHkvS2NvbmZpZwo+ICsrKyBi L2RyaXZlcnMvcG93ZXIvc3VwcGx5L0tjb25maWcKPiBAQCAtNTY3LDYgKzU2NywxNiBAQCBjb25m aWcgQ0hBUkdFUl9NUDI2MjkKPiAgICAgICAgICAgQmF0dGVyeSBjaGFyZ2VyLiBUaGlzIGRyaXZl ciBwcm92aWRlcyBCYXR0ZXJ5IGNoYXJnZXIgcG93ZXIgbWFuYWdlbWVudAo+ICAgICAgICAgICBm dW5jdGlvbnMgb24gdGhlIHN5c3RlbXMuCj4KPiArY29uZmlnIENIQVJHRVJfTVQ2MzYwCj4gKyAg ICAgICB0cmlzdGF0ZSAiTWVkaWF0ZWsgTVQ2MzYwIENoYXJnZXIgRHJpdmVyIgo+ICsgICAgICAg ZGVwZW5kcyBvbiBNRkRfTVQ2MzYwCj4gKyAgICAgICBkZXBlbmRzIG9uIFJFR1VMQVRPUgo+ICsg ICAgICAgaGVscAo+ICsgICAgICAgICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBNVDYzNjAgQ2hhcmdl ciBQYXJ0Lgo+ICsgICAgICAgICBUaGUgZGV2aWNlIHN1cHBvcnRzIEhpZ2gtQWNjdXJhY3kgVm9s dGFnZS9DdXJyZW50IFJlZ3VsYXRpb24sCj4gKyAgICAgICAgIEF2ZXJhZ2UgSW5wdXQgQ3VycmVu dCBSZWd1bGF0aW9uLCBCYXR0ZXJ5IFRlbXBhdHVyZSBTZW5zaW5nLAo+ICsgICAgICAgICBPdmVy LVRlbXBlcmF0dXJlIFByb3RlY3Rpb24sIERQRE0gRGV0ZWN0aW9uIGZvciBCQzEuMgo+ICsKPiAg Y29uZmlnIENIQVJHRVJfUUNPTV9TTUJCCj4gICAgICAgICB0cmlzdGF0ZSAiUXVhbGNvbW0gU3dp dGNoLU1vZGUgQmF0dGVyeSBDaGFyZ2VyIGFuZCBCb29zdCIKPiAgICAgICAgIGRlcGVuZHMgb24g TUZEX1NQTUlfUE1JQyB8fCBDT01QSUxFX1RFU1QKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dl ci9zdXBwbHkvTWFrZWZpbGUgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9NYWtlZmlsZQo+IGluZGV4 IGRkNGI4NjMuLjliZDA4MDQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9wb3dlci9zdXBwbHkvTWFr ZWZpbGUKPiArKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9NYWtlZmlsZQo+IEBAIC03Nyw2ICs3 Nyw3IEBAIG9iai0kKENPTkZJR19DSEFSR0VSX01BWDc3NjkzKSAgICAgICAgKz0gbWF4Nzc2OTNf Y2hhcmdlci5vCj4gIG9iai0kKENPTkZJR19DSEFSR0VSX01BWDg5OTcpICArPSBtYXg4OTk3X2No YXJnZXIubwo+ICBvYmotJChDT05GSUdfQ0hBUkdFUl9NQVg4OTk4KSAgKz0gbWF4ODk5OF9jaGFy Z2VyLm8KPiAgb2JqLSQoQ09ORklHX0NIQVJHRVJfTVAyNjI5KSAgICs9IG1wMjYyOV9jaGFyZ2Vy Lm8KPiArb2JqLSQoQ09ORklHX0NIQVJHRVJfTVQ2MzYwKSAgICs9IG10NjM2MF9jaGFyZ2VyLm8K PiAgb2JqLSQoQ09ORklHX0NIQVJHRVJfUUNPTV9TTUJCKSAgICAgICAgKz0gcWNvbV9zbWJiLm8K PiAgb2JqLSQoQ09ORklHX0NIQVJHRVJfQlEyNDE1WCkgICs9IGJxMjQxNXhfY2hhcmdlci5vCj4g IG9iai0kKENPTkZJR19DSEFSR0VSX0JRMjQxOTApICArPSBicTI0MTkwX2NoYXJnZXIubwo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9tdDYzNjBfY2hhcmdlci5jIGIvZHJpdmVy cy9wb3dlci9zdXBwbHkvbXQ2MzYwX2NoYXJnZXIuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4g aW5kZXggMDAwMDAwMC4uZDgwYmRhZAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL3Bv d2VyL3N1cHBseS9tdDYzNjBfY2hhcmdlci5jCj4gQEAgLTAsMCArMSw5MTQgQEAKPiArLy8gU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiArLyoKPiArICogQ29weXJpZ2h0IChjKSAy MDIxIE1lZGlhVGVrIEluYy4KPiArICovCj4gKwo+ICsjaW5jbHVkZSA8bGludXgvaW5pdC5oPgo+ ICsjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwu aD4KPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4K PiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGludXgv cG93ZXJfc3VwcGx5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9wcm9wZXJ0eS5oPgo+ICsjaW5jbHVk ZSA8bGludXgvcmVnbWFwLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+ Cj4gKwo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkwxICAgMHgzMTEKPiArI2RlZmluZSBN VDYzNjBfUE1VX0NIR19DVFJMMiAgIDB4MzEyCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RS TDMgICAweDMxMwo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkw0ICAgMHgzMTQKPiArI2Rl ZmluZSBNVDYzNjBfUE1VX0NIR19DVFJMNSAgIDB4MzE1Cj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9D SEdfQ1RSTDYgICAweDMxNgo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkw3ICAgMHgzMTcK PiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19DVFJMOCAgIDB4MzE4Cj4gKyNkZWZpbmUgTVQ2MzYw X1BNVV9DSEdfQ1RSTDkgICAweDMxOQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkwxMCAg MHgzMUEKPiArI2RlZmluZSBNVDYzNjBfUE1VX0RFVklDRV9UWVBFIDB4MzIyCj4gKyNkZWZpbmUg TVQ2MzYwX1BNVV9VU0JfU1RBVFVTMSAweDMyNwo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX1NU QVQgICAgMHgzNEEKPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19DVFJMMTkgIDB4MzYxCj4gKyNk ZWZpbmUgTVQ2MzYwX1BNVV9GT0RfU1RBVCAgICAweDNFNwo+ICsKPiArLyogTVQ2MzYwX1BNVV9D SEdfQ1RSTDEgKi8KPiArI2RlZmluZSBNVDYzNjBfRlNMUF9TSEZUICAgICAgICgzKQo+ICsjZGVm aW5lIE1UNjM2MF9GU0xQX01BU0sgICAgICAgQklUKE1UNjM2MF9GU0xQX1NIRlQpCj4gKyNkZWZp bmUgTVQ2MzYwX09QQV9NT0RFX1NIRlQgICAoMCkKPiArI2RlZmluZSBNVDYzNjBfT1BBX01PREVf TUFTSyAgIEJJVChNVDYzNjBfT1BBX01PREVfU0hGVCkKPiArLyogTVQ2MzYwX1BNVV9DSEdfQ1RS TDIgKi8KPiArI2RlZmluZSBNVDYzNjBfSUlOTE1UU0VMX1NIRlQgICgyKQo+ICsjZGVmaW5lIE1U NjM2MF9JSU5MTVRTRUxfTUFTSyAgR0VOTUFTSygzLCAyKQo+ICsvKiBNVDYzNjBfUE1VX0NIR19D VFJMMyAqLwo+ICsjZGVmaW5lIE1UNjM2MF9JQUlDUl9TSEZUICAgICAgKDIpCj4gKyNkZWZpbmUg TVQ2MzYwX0lBSUNSX01BU0sgICAgICBHRU5NQVNLKDcsIDIpCj4gKyNkZWZpbmUgTVQ2MzYwX0lM SU1fRU5fTUFTSyAgICBCSVQoMCkKPiArLyogTVQ2MzYwX1BNVV9DSEdfQ1RSTDQgKi8KPiArI2Rl ZmluZSBNVDYzNjBfVk9SRUdfU0hGVCAgICAgICgxKQo+ICsjZGVmaW5lIE1UNjM2MF9WT1JFR19N QVNLICAgICAgR0VOTUFTSyg3LCAxKQo+ICsvKiBNVDYzNjBfUE1VX0NIR19DVFJMNSAqLwo+ICsj ZGVmaW5lIE1UNjM2MF9WT0JTVF9NQVNLICAgICAgR0VOTUFTSyg3LCAyKQo+ICsvKiBNVDYzNjBf UE1VX0NIR19DVFJMNiAqLwo+ICsjZGVmaW5lIE1UNjM2MF9WTUlWUl9TSEZUICAgICAgKDEpCj4g KyNkZWZpbmUgTVQ2MzYwX1ZNSVZSX01BU0sgICAgICBHRU5NQVNLKDcsIDEpCj4gKy8qIE1UNjM2 MF9QTVVfQ0hHX0NUUkw3ICovCj4gKyNkZWZpbmUgTVQ2MzYwX0lDSEdfU0hGVCAgICAgICAoMikK PiArI2RlZmluZSBNVDYzNjBfSUNIR19NQVNLICAgICAgIEdFTk1BU0soNywgMikKPiArLyogTVQ2 MzYwX1BNVV9DSEdfQ1RSTDggKi8KPiArI2RlZmluZSBNVDYzNjBfSVBSRUNfU0hGVCAgICAgICgw KQo+ICsjZGVmaW5lIE1UNjM2MF9JUFJFQ19NQVNLICAgICAgR0VOTUFTSygzLCAwKQo+ICsvKiBN VDYzNjBfUE1VX0NIR19DVFJMOSAqLwo+ICsjZGVmaW5lIE1UNjM2MF9JRU9DX1NIRlQgICAgICAg KDQpCj4gKyNkZWZpbmUgTVQ2MzYwX0lFT0NfTUFTSyAgICAgICBHRU5NQVNLKDcsIDQpCj4gKy8q IE1UNjM2MF9QTVVfQ0hHX0NUUkwxMCAqLwo+ICsjZGVmaW5lIE1UNjM2MF9PVEdfT0NfTUFTSyAg ICAgR0VOTUFTSygzLCAwKQo+ICsvKiBNVDYzNjBfUE1VX0RFVklDRV9UWVBFICovCj4gKyNkZWZp bmUgTVQ2MzYwX1VTQkNIR0VOX01BU0sgICBCSVQoNykKPiArLyogTVQ2MzYwX1BNVV9VU0JfU1RB VFVTMSAqLwo+ICsjZGVmaW5lIE1UNjM2MF9VU0JfU1RBVFVTX1NIRlQgKDQpCj4gKyNkZWZpbmUg TVQ2MzYwX1VTQl9TVEFUVVNfTUFTSyBHRU5NQVNLKDYsIDQpCj4gKy8qIE1UNjM2MF9QTVVfQ0hH X1NUQVQgKi8KPiArI2RlZmluZSBNVDYzNjBfQ0hHX1NUQVRfU0hGVCAgICg2KQo+ICsjZGVmaW5l IE1UNjM2MF9DSEdfU1RBVF9NQVNLICAgR0VOTUFTSyg3LCA2KQo+ICsjZGVmaW5lIE1UNjM2MF9W QkFUX0xWTF9NQVNLICAgQklUKDUpCj4gKy8qIE1UNjM2MF9QTVVfQ0hHX0NUUkwxOSAqLwo+ICsj ZGVmaW5lIE1UNjM2MF9WSU5PVlBfU0hGVCAgICAgKDUpCj4gKyNkZWZpbmUgTVQ2MzYwX1ZJTk9W UF9NQVNLICAgICBHRU5NQVNLKDYsIDUpCj4gKy8qIE1UNjM2MF9QTVVfRk9EX1NUQVQgKi8KPiAr I2RlZmluZSBNVDYzNjBfQ0hSREVUX0VYVF9NQVNLIEJJVCg0KQo+ICsKPiArLyogdVYgKi8KPiAr I2RlZmluZSBNVDYzNjBfVk1JVlJfTUlOICAgICAgIDM5MDAwMDAKPiArI2RlZmluZSBNVDYzNjBf Vk1JVlJfTUFYICAgICAgIDEzNDAwMDAwCj4gKyNkZWZpbmUgTVQ2MzYwX1ZNSVZSX1NURVAgICAg ICAxMDAwMDAKPiArLyogdUEgKi8KPiArI2RlZmluZSBNVDYzNjBfSUNIR19NSU4gICAgICAgICAg ICAgICAgMTAwMDAwCj4gKyNkZWZpbmUgTVQ2MzYwX0lDSEdfTUFYICAgICAgICAgICAgICAgIDUw MDAwMDAKPiArI2RlZmluZSBNVDYzNjBfSUNIR19TVEVQICAgICAgIDEwMDAwMAo+ICsvKiB1ViAq Lwo+ICsjZGVmaW5lIE1UNjM2MF9WT1JFR19NSU4gICAgICAgMzkwMDAwMAo+ICsjZGVmaW5lIE1U NjM2MF9WT1JFR19NQVggICAgICAgNDcxMDAwMAo+ICsjZGVmaW5lIE1UNjM2MF9WT1JFR19TVEVQ ICAgICAgMTAwMDAKPiArLyogdUEgKi8KPiArI2RlZmluZSBNVDYzNjBfQUlDUl9NSU4gICAgICAg ICAgICAgICAgMTAwMDAwCj4gKyNkZWZpbmUgTVQ2MzYwX0FJQ1JfTUFYICAgICAgICAgICAgICAg IDMyNTAwMDAKPiArI2RlZmluZSBNVDYzNjBfQUlDUl9TVEVQICAgICAgIDUwMDAwCj4gKy8qIHVB ICovCj4gKyNkZWZpbmUgTVQ2MzYwX0lQUkVDX01JTiAgICAgICAxMDAwMDAKPiArI2RlZmluZSBN VDYzNjBfSVBSRUNfTUFYICAgICAgIDg1MDAwMAo+ICsjZGVmaW5lIE1UNjM2MF9JUFJFQ19TVEVQ ICAgICAgNTAwMDAKPiArLyogdUEgKi8KPiArI2RlZmluZSBNVDYzNjBfSUVPQ19NSU4gICAgICAg ICAgICAgICAgMTAwMDAwCj4gKyNkZWZpbmUgTVQ2MzYwX0lFT0NfTUFYICAgICAgICAgICAgICAg IDg1MDAwMAo+ICsjZGVmaW5lIE1UNjM2MF9JRU9DX1NURVAgICAgICAgNTAwMDAKPiArCj4gK3N0 cnVjdCBtdDYzNjBfY2hnX2luZm8gewo+ICsgICAgICAgc3RydWN0IGRldmljZSAqZGV2Owo+ICsg ICAgICAgc3RydWN0IHJlZ21hcCAqcmVnbWFwOwo+ICsgICAgICAgc3RydWN0IHBvd2VyX3N1cHBs eV9kZXNjIHBzeV9kZXNjOwo+ICsgICAgICAgc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5Owo+ICsg ICAgICAgc3RydWN0IHJlZ3VsYXRvcl9kZXYgKm90Z19yZGV2Owo+ICsgICAgICAgc3RydWN0IG11 dGV4IGNoZ2RldF9sb2NrOwo+ICsgICAgICAgdTMyIHZpbm92cDsKPiArICAgICAgIGJvb2wgcHdy X3JkeTsKPiArICAgICAgIGJvb2wgYmMxMl9lbjsKPiArICAgICAgIGludCBwc3lfdXNiX3R5cGU7 Cj4gKyAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2hyZGV0X3dvcms7Cj4gK307Cj4gKwo+ICtl bnVtIG10NjM2MF9paW5sbXRzZWwgewo+ICsgICAgICAgTVQ2MzYwX0lJTkxNVFNFTF9BSUNSXzMy NTAgPSAwLAo+ICsgICAgICAgTVQ2MzYwX0lJTkxNVFNFTF9DSEdfVFlQRSwKPiArICAgICAgIE1U NjM2MF9JSU5MTVRTRUxfQUlDUiwKPiArICAgICAgIE1UNjM2MF9JSU5MTVRTRUxfTE9XRVJfTEVW RUwsCj4gK307Cj4gKwo+ICtlbnVtIG10NjM2MF9wbXVfY2hnX3R5cGUgewo+ICsgICAgICAgTVQ2 MzYwX0NIR19UWVBFX05PVkJVUyA9IDAsCj4gKyAgICAgICBNVDYzNjBfQ0hHX1RZUEVfVU5ERVJf R09JTkcsCj4gKyAgICAgICBNVDYzNjBfQ0hHX1RZUEVfU0RQLAo+ICsgICAgICAgTVQ2MzYwX0NI R19UWVBFX1NEUE5TVEQsCj4gKyAgICAgICBNVDYzNjBfQ0hHX1RZUEVfRENQLAo+ICsgICAgICAg TVQ2MzYwX0NIR19UWVBFX0NEUCwKPiArICAgICAgIE1UNjM2MF9DSEdfVFlQRV9ESVNBQkxFX0JD MTIsCj4gKyAgICAgICBNVDYzNjBfQ0hHX1RZUEVfTUFYLAo+ICt9Owo+ICsKPiArc3RhdGljIGVu dW0gcG93ZXJfc3VwcGx5X3VzYl90eXBlIG10NjM2MF9jaGFyZ2VyX3VzYl90eXBlc1tdID0gewo+ ICsgICAgICAgUE9XRVJfU1VQUExZX1VTQl9UWVBFX1VOS05PV04sCj4gKyAgICAgICBQT1dFUl9T VVBQTFlfVVNCX1RZUEVfU0RQLAo+ICsgICAgICAgUE9XRVJfU1VQUExZX1VTQl9UWVBFX0RDUCwK PiArICAgICAgIFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9DRFAsCj4gK307Cj4gKwo+ICtzdGF0aWMg dW5zaWduZWQgaW50IG10NjM2MF9tYXBfcmVnX3NlbCh1MzIgZGF0YSwgdTMyIG1pbiwgdTMyIG1h eCwgdTMyIHN0ZXApCj4gK3sKPiArICAgICAgIHUzMiB0YXJnZXQgPSAwLCBtYXhfc2VsOwo+ICsK PiArICAgICAgIGlmIChkYXRhID49IG1pbikgewo+ICsgICAgICAgICAgICAgICB0YXJnZXQgPSAo ZGF0YSAtIG1pbikgLyBzdGVwOwo+ICsgICAgICAgICAgICAgICBtYXhfc2VsID0gKG1heCAtIG1p bikgLyBzdGVwOwo+ICsgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID4gbWF4X3NlbCkKPiArICAg ICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBtYXhfc2VsOwo+ICsgICAgICAgfQo+ICsgICAg ICAgcmV0dXJuIHRhcmdldDsKPiArfQo+ICsKPiArc3RhdGljIHUzMiBtdDYzNjBfbWFwX3JlYWxf dmFsKHUzMiBzZWwsIHUzMiBtaW4sIHUzMiBtYXgsIHUzMiBzdGVwKQo+ICt7Cj4gKyAgICAgICB1 MzIgdGFyZ2V0ID0gMDsKPiArCj4gKyAgICAgICB0YXJnZXQgPSBtaW4gKyAoc2VsICogc3RlcCk7 Cj4gKyAgICAgICBpZiAodGFyZ2V0ID4gbWF4KQo+ICsgICAgICAgICAgICAgICB0YXJnZXQgPSBt YXg7Cj4gKyAgICAgICByZXR1cm4gdGFyZ2V0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2 MF9nZXRfY2hyZGV0X2V4dF9zdGF0KHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpwd3JfcmR5KQo+ ICt7Cj4gKyAgICAgICBpbnQgcmV0Owo+ICsgICAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiAr Cj4gKyAgICAgICByZXQgPSByZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9GT0Rf U1RBVCwgJnJlZ3ZhbCk7Cj4gKyAgICAgICBpZiAocmV0IDwgMCkKPiArICAgICAgICAgICAgICAg cmV0dXJuIHJldDsKPiArICAgICAgICpwd3JfcmR5ID0gKHJlZ3ZhbCAmIE1UNjM2MF9DSFJERVRf RVhUX01BU0spID8gdHJ1ZSA6IGZhbHNlOwo+ICsgICAgICAgcmV0dXJuIDA7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X29ubGluZShzdHJ1Y3QgbXQ2MzYwX2NoZ19p bmZvICptY2ksCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIHBv d2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gK3sKPiArICAgICAgIGludCByZXQ7Cj4gKyAgICAg ICBib29sIHB3cl9yZHk7Cj4gKwo+ICsgICAgICAgcmV0ID0gbXQ2MzYwX2dldF9jaHJkZXRfZXh0 X3N0YXQobWNpLCAmcHdyX3JkeSk7Cj4gKyAgICAgICBpZiAocmV0IDwgMCkKPiArICAgICAgICAg ICAgICAgcmV0dXJuIHJldDsKPiArICAgICAgIHZhbC0+aW50dmFsID0gcHdyX3JkeSA/IHRydWUg OiBmYWxzZTsKPiArICAgICAgIHJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2 MF9jaGFyZ2VyX2dldF9zdGF0dXMoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZh bCAqdmFsKQo+ICt7Cj4gKyAgICAgICBpbnQgc3RhdHVzLCByZXQ7Cj4gKyAgICAgICB1bnNpZ25l ZCBpbnQgcmVndmFsOwo+ICsgICAgICAgYm9vbCBwd3JfcmR5Owo+ICsKPiArICAgICAgIHJldCA9 IG10NjM2MF9nZXRfY2hyZGV0X2V4dF9zdGF0KG1jaSwgJnB3cl9yZHkpOwo+ICsgICAgICAgaWYg KHJldCA8IDApCj4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gKyAgICAgICBpZiAoIXB3 cl9yZHkpIHsKPiArICAgICAgICAgICAgICAgc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19E SVNDSEFSR0lORzsKPiArICAgICAgICAgICAgICAgZ290byBvdXQ7Cj4gKyAgICAgICB9Cj4gKwo+ ICsgICAgICAgcmV0ID0gcmVnbWFwX3JlYWQobWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX1NU QVQsICZyZWd2YWwpOwo+ICsgICAgICAgaWYgKHJldCA8IDApCj4gKyAgICAgICAgICAgICAgIHJl dHVybiByZXQ7Cj4gKyAgICAgICByZWd2YWwgJj0gTVQ2MzYwX0NIR19TVEFUX01BU0s7Cj4gKyAg ICAgICByZWd2YWwgPj49IE1UNjM2MF9DSEdfU1RBVF9TSEZUOwo+ICsgICAgICAgc3dpdGNoIChy ZWd2YWwpIHsKPiArICAgICAgIGNhc2UgMHgwOgo+ICsgICAgICAgICAgICAgICBzdGF0dXMgPSBQ T1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKPiArICAgICAgICAgICAgICAgYnJlYWs7 Cj4gKyAgICAgICBjYXNlIDB4MToKPiArICAgICAgICAgICAgICAgc3RhdHVzID0gUE9XRVJfU1VQ UExZX1NUQVRVU19DSEFSR0lORzsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBj YXNlIDB4MjoKPiArICAgICAgICAgICAgICAgc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19G VUxMOwo+ICsgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIGRlZmF1bHQ6Cj4gKyAgICAg ICAgICAgICAgIHJldCA9IC1FSU87Cj4gKyAgICAgICB9Cj4gK291dDoKPiArICAgICAgIGlmICgh cmV0KQo+ICsgICAgICAgICAgICAgICB2YWwtPmludHZhbCA9IHN0YXR1czsKPiArICAgICAgIHJl dHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X2NoYXJn ZV90eXBlKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ ICt7Cj4gKyAgICAgICBpbnQgdHlwZSwgcmV0Owo+ICsgICAgICAgdW5zaWduZWQgaW50IHJlZ3Zh bDsKPiArICAgICAgIHU4IGNoZ19zdGF0Owo+ICsKPiArICAgICAgIHJldCA9IHJlZ21hcF9yZWFk KG1jaS0+cmVnbWFwLCBNVDYzNjBfUE1VX0NIR19TVEFULCAmcmVndmFsKTsKPiArICAgICAgIGlm IChyZXQgPCAwKQo+ICsgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ICsKPiArICAgICAgIGNo Z19zdGF0ID0gKHJlZ3ZhbCAmIE1UNjM2MF9DSEdfU1RBVF9NQVNLKSA+PiBNVDYzNjBfQ0hHX1NU QVRfU0hGVDsKPiArICAgICAgIHN3aXRjaCAoY2hnX3N0YXQpIHsKPiArICAgICAgIGNhc2UgMHgw MTogLyogQ2hhcmdlIGluIFByb2dyZXNzICovCj4gKyAgICAgICAgICAgICAgIGlmIChyZWd2YWwg JiBNVDYzNjBfVkJBVF9MVkxfTUFTSykKPiArICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0g UE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX0ZBU1Q7Cj4gKyAgICAgICAgICAgICAgIGVsc2UKPiAr ICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX1RS SUNLTEU7Cj4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgY2FzZSAweDAwOiAvKiBO b3QgQ2hhcmdpbmcgKi8KPiArICAgICAgIGNhc2UgMHgwMjogLyogQ2hhcmdlIERvbmUgKi8KPiAr ICAgICAgIGNhc2UgMHgwMzogLyogQ2hhcmdlIEZhdWx0ICovCj4gKyAgICAgICBkZWZhdWx0Ogo+ ICsgICAgICAgICAgICAgICB0eXBlID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX05PTkU7Cj4g KyAgICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIHZhbC0+aW50 dmFsID0gdHlwZTsKPiArICAgICAgIHJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10 NjM2MF9jaGFyZ2VyX2dldF9pY2hnKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFs ICp2YWwpCj4gK3sKPiArICAgICAgIGludCByZXQ7Cj4gKyAgICAgICB1bnNpZ25lZCBpbnQgcmVn dmFsOwo+ICsKPiArICAgICAgIHJldCA9IHJlZ21hcF9yZWFkKG1jaS0+cmVnbWFwLCBNVDYzNjBf UE1VX0NIR19DVFJMNywgJnJlZ3ZhbCk7Cj4gKyAgICAgICBpZiAocmV0IDwgMCkKPiArICAgICAg ICAgICAgICAgcmV0dXJuIHJldDsKPiArICAgICAgIHJlZ3ZhbCA9IChyZWd2YWwgJiBNVDYzNjBf SUNIR19NQVNLKSA+PiBNVDYzNjBfSUNIR19TSEZUOwo+ICsgICAgICAgdmFsLT5pbnR2YWwgPSBt dDYzNjBfbWFwX3JlYWxfdmFsKHJlZ3ZhbCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBNVDYzNjBfSUNIR19NSU4sCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lDSEdfTUFYLAo+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JQ0hHX1NURVApOwo+ICsgICAgICAgcmV0dXJu IDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X21heF9pY2hnKHN0 cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ICt7Cj4gKyAgICAg ICB2YWwtPmludHZhbCA9IE1UNjM2MF9JQ0hHX01BWDsKPiArICAgICAgIHJldHVybiAwOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX2dldF9jdihzdHJ1Y3QgbXQ2MzYwX2No Z19pbmZvICptY2ksCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gcG93 ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKPiArewo+ICsgICAgICAgaW50IHJldDsKPiArICAgICAg IHVuc2lnbmVkIGludCByZWd2YWw7Cj4gKwo+ICsgICAgICAgcmV0ID0gcmVnbWFwX3JlYWQobWNp LT5yZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX0NUUkw0LCAmcmVndmFsKTsKPiArICAgICAgIGlmIChy ZXQgPCAwKQo+ICsgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ICsgICAgICAgcmVndmFsID0g KHJlZ3ZhbCAmIE1UNjM2MF9WT1JFR19NQVNLKSA+PiBNVDYzNjBfVk9SRUdfU0hGVDsKPiArICAg ICAgIHZhbC0+aW50dmFsID0gbXQ2MzYwX21hcF9yZWFsX3ZhbChyZWd2YWwsCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1ZPUkVHX01JTiwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfVk9SRUdfTUFYLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9WT1JFR19T VEVQKTsKPiArICAgICAgIHJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9j aGFyZ2VyX2dldF9tYXhfY3Yoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAq dmFsKQo+ICt7Cj4gKyAgICAgICB2YWwtPmludHZhbCA9IE1UNjM2MF9WT1JFR19NQVg7Cj4gKyAg ICAgICByZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9nZXRf YWljcihzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ksCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ICt7Cj4gKyAg ICAgICBpbnQgcmV0Owo+ICsgICAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiArCj4gKyAgICAg ICByZXQgPSByZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdfQ1RSTDMsICZy ZWd2YWwpOwo+ICsgICAgICAgaWYgKHJldCA8IDApCj4gKyAgICAgICAgICAgICAgIHJldHVybiBy ZXQ7Cj4gKyAgICAgICByZWd2YWwgPSAocmVndmFsICYgTVQ2MzYwX0lBSUNSX01BU0spID4+IE1U NjM2MF9JQUlDUl9TSEZUOwo+ICsgICAgICAgdmFsLT5pbnR2YWwgPSBtdDYzNjBfbWFwX3JlYWxf dmFsKHJlZ3ZhbCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBN VDYzNjBfQUlDUl9NSU4sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgTVQ2MzYwX0FJQ1JfTUFYLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIE1UNjM2MF9BSUNSX1NURVApOwo+ICsgICAgICAgcmV0dXJuIDA7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X21pdnIoc3RydWN0IG10NjM2MF9jaGdfaW5m byAqbWNpLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gcG93ZXJf c3VwcGx5X3Byb3B2YWwgKnZhbCkKPiArewo+ICsgICAgICAgaW50IHJldDsKPiArICAgICAgIHVu c2lnbmVkIGludCByZWd2YWw7Cj4gKwo+ICsgICAgICAgcmV0ID0gcmVnbWFwX3JlYWQobWNpLT5y ZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX0NUUkw2LCAmcmVndmFsKTsKPiArICAgICAgIGlmIChyZXQg PCAwKQo+ICsgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ICsgICAgICAgcmVndmFsID0gKHJl Z3ZhbCAmIE1UNjM2MF9WTUlWUl9NQVNLKSA+PiBNVDYzNjBfVk1JVlJfU0hGVDsKPiArICAgICAg IHZhbC0+aW50dmFsID0gbXQ2MzYwX21hcF9yZWFsX3ZhbChyZWd2YWwsCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1ZNSVZSX01JTiwKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfVk1JVlJfTUFYLAo+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9WTUlWUl9TVEVQ KTsKPiArICAgICAgIHJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFy Z2VyX2dldF9pcHJlY2hnKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2 YWwpCj4gK3sKPiArICAgICAgIGludCByZXQ7Cj4gKyAgICAgICB1bnNpZ25lZCBpbnQgcmVndmFs Owo+ICsKPiArICAgICAgIHJldCA9IHJlZ21hcF9yZWFkKG1jaS0+cmVnbWFwLCBNVDYzNjBfUE1V X0NIR19DVFJMOCwgJnJlZ3ZhbCk7Cj4gKyAgICAgICBpZiAocmV0IDwgMCkKPiArICAgICAgICAg ICAgICAgcmV0dXJuIHJldDsKPiArICAgICAgIHJlZ3ZhbCA9IChyZWd2YWwgJiBNVDYzNjBfSVBS RUNfTUFTSykgPj4gTVQ2MzYwX0lQUkVDX1NIRlQ7Cj4gKyAgICAgICB2YWwtPmludHZhbCA9IG10 NjM2MF9tYXBfcmVhbF92YWwocmVndmFsLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIE1UNjM2MF9JUFJFQ19NSU4sCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lQUkVDX01BWCwKPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSVBSRUNfU1RFUCk7Cj4gKyAgICAgICByZXR1 cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9nZXRfaWVvYyhzdHJ1 Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ksCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ICt7Cj4gKyAgICAgICBpbnQg cmV0Owo+ICsgICAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiArCj4gKyAgICAgICByZXQgPSBy ZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdfQ1RSTDksICZyZWd2YWwpOwo+ ICsgICAgICAgaWYgKHJldCA8IDApCj4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gKyAg ICAgICByZWd2YWwgPSAocmVndmFsICYgTVQ2MzYwX0lFT0NfTUFTSykgPj4gTVQ2MzYwX0lFT0Nf U0hGVDsKPiArICAgICAgIHZhbC0+aW50dmFsID0gbXQ2MzYwX21hcF9yZWFsX3ZhbChyZWd2YWws Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lFT0Nf TUlOLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9J RU9DX01BWCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYz NjBfSUVPQ19TVEVQKTsKPiArICAgICAgIHJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IG10NjM2MF9jaGFyZ2VyX3NldF9vbmxpbmUoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiBwb3dlcl9z dXBwbHlfcHJvcHZhbCAqdmFsKQo+ICt7Cj4gKyAgICAgICB1OCBmb3JjZV9zbGVlcCA9IHZhbC0+ aW50dmFsID8gMCA6IDE7Cj4gKwo+ICsgICAgICAgcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyht Y2ktPnJlZ21hcCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1BN VV9DSEdfQ1RSTDEsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9G U0xQX01BU0ssCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlX3NsZWVw IDw8IE1UNjM2MF9GU0xQX1NIRlQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFy Z2VyX3NldF9pY2hnKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2 YWwpCj4gK3sKPiArICAgICAgIHU4IHNlbDsKPiArCj4gKyAgICAgICBzZWwgPSBtdDYzNjBfbWFw X3JlZ19zZWwodmFsLT5pbnR2YWwsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg TVQ2MzYwX0lDSEdfTUlOLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2 MF9JQ0hHX01BWCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSUNI R19TVEVQKTsKPiArICAgICAgIHJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMobWNpLT5yZWdtYXAs Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9QTVVfQ0hHX0NUUkw3 LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSUNIR19NQVNLLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWwgPDwgTVQ2MzYwX0lDSEdfU0hG VCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfc2V0X2N2KHN0cnVjdCBt dDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj b25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ICt7Cj4gKyAgICAgICB1OCBz ZWw7Cj4gKwo+ICsgICAgICAgc2VsID0gbXQ2MzYwX21hcF9yZWdfc2VsKHZhbC0+aW50dmFsLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9WT1JFR19NSU4sCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1ZPUkVHX01BWCwKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfVk9SRUdfU1RFUCk7Cj4gKyAgICAgICBy ZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLAo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBNVDYzNjBfUE1VX0NIR19DVFJMNCwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgTVQ2MzYwX1ZPUkVHX01BU0ssCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHNlbCA8PCBNVDYzNjBfVk9SRUdfU0hGVCk7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfc2V0X2FpY3Ioc3RydWN0IG10NjM2MF9jaGdfaW5mbyAq bWNpLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pb24gcG93 ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKPiArewo+ICsgICAgICAgdTggc2VsOwo+ICsKPiArICAg ICAgIHNlbCA9IG10NjM2MF9tYXBfcmVnX3NlbCh2YWwtPmludHZhbCwKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBNVDYzNjBfQUlDUl9NSU4sCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgTVQ2MzYwX0FJQ1JfTUFYLAo+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIE1UNjM2MF9BSUNSX1NURVApOwo+ICsgICAgICAgcmV0dXJuIHJlZ21hcF91cGRh dGVfYml0cyhtY2ktPnJlZ21hcCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg TVQ2MzYwX1BNVV9DSEdfQ1RSTDMsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IE1UNjM2MF9JQUlDUl9NQVNLLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz ZWwgPDwgTVQ2MzYwX0lBSUNSX1NIRlQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9j aGFyZ2VyX3NldF9taXZyKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFs ICp2YWwpCj4gK3sKPiArICAgICAgIHU4IHNlbDsKPiArCj4gKyAgICAgICBzZWwgPSBtdDYzNjBf bWFwX3JlZ19zZWwodmFsLT5pbnR2YWwsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgTVQ2MzYwX1ZNSVZSX01JTiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBN VDYzNjBfVk1JVlJfTUFYLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2 MF9WTUlWUl9TVEVQKTsKPiArICAgICAgIHJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMobWNpLT5y ZWdtYXAsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9QTVVfQ0hH X0NUUkwzLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfVk1JVlJf TUFTSywKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsIDw8IE1UNjM2MF9W TUlWUl9TSEZUKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9zZXRfaXBy ZWNoZyhzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ksCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ ICt7Cj4gKyAgICAgICB1OCBzZWw7Cj4gKwo+ICsgICAgICAgc2VsID0gbXQ2MzYwX21hcF9yZWdf c2VsKHZhbC0+aW50dmFsLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2 MF9JUFJFQ19NSU4sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lQ UkVDX01BWCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSVBSRUNf U1RFUCk7Cj4gKyAgICAgICByZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfUE1VX0NIR19DVFJMOCwK PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lQUkVDX01BU0ssCj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbCA8PCBNVDYzNjBfSVBSRUNfU0hG VCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfc2V0X2llb2Moc3RydWN0 IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKPiArewo+ICsgICAgICAg dTggc2VsOwo+ICsKPiArICAgICAgIHNlbCA9IG10NjM2MF9tYXBfcmVnX3NlbCh2YWwtPmludHZh bCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSUVPQ19NSU4sCj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lFT0NfTUFYLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JRU9DX1NURVApOwo+ICsgICAgICAg cmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgTVQ2MzYwX1BNVV9DSEdfQ1RSTDksCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JRU9DX01BU0ssCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHNlbCA8PCBNVDYzNjBfSUVPQ19TSEZUKTsKPiArfQo+ICsKPiArc3Rh dGljIGludCBtdDYzNjBfY2hhcmdlcl9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAq cHN5LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcG93ZXJf c3VwcGx5X3Byb3BlcnR5IHBzcCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ICt7Cj4gKyAgICAgICBzdHJ1 Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsK PiArICAgICAgIGludCByZXQgPSAwOwo+ICsKPiArICAgICAgIHN3aXRjaCAocHNwKSB7Cj4gKyAg ICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKPiArICAgICAgICAgICAgICAgcmV0 ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X29ubGluZShtY2ksIHZhbCk7Cj4gKyAgICAgICAgICAgICAg IGJyZWFrOwo+ICsgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6Cj4gKyAgICAg ICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9zdGF0dXMobWNpLCB2YWwpOwo+ICsg ICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hB UkdFX1RZUEU6Cj4gKyAgICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9jaGFy Z2VfdHlwZShtY2ksIHZhbCk7Cj4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgY2Fz ZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVDoKPiArICAgICAgICAg ICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X2ljaGcobWNpLCB2YWwpOwo+ICsgICAgICAg ICAgICAgICBicmVhazsKPiArICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRf Q0hBUkdFX0NVUlJFTlRfTUFYOgo+ICsgICAgICAgICAgICAgICByZXQgPSBtdDYzNjBfY2hhcmdl cl9nZXRfbWF4X2ljaGcobWNpLCB2YWwpOwo+ICsgICAgICAgICAgICAgICBicmVhazsKPiArICAg ICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0U6Cj4gKyAg ICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9jdihtY2ksIHZhbCk7Cj4gKyAg ICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05T VEFOVF9DSEFSR0VfVk9MVEFHRV9NQVg6Cj4gKyAgICAgICAgICAgICAgIHJldCA9IG10NjM2MF9j aGFyZ2VyX2dldF9tYXhfY3YobWNpLCB2YWwpOwo+ICsgICAgICAgICAgICAgICBicmVhazsKPiAr ICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfSU5QVVRfQ1VSUkVOVF9MSU1JVDoKPiArICAg ICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X2FpY3IobWNpLCB2YWwpOwo+ICsg ICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfSU5Q VVRfVk9MVEFHRV9MSU1JVDoKPiArICAgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJf Z2V0X21pdnIobWNpLCB2YWwpOwo+ICsgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIGNh c2UgUE9XRVJfU1VQUExZX1BST1BfUFJFQ0hBUkdFX0NVUlJFTlQ6Cj4gKyAgICAgICAgICAgICAg IHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9pcHJlY2hnKG1jaSwgdmFsKTsKPiArICAgICAgICAg ICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9URVJN X0NVUlJFTlQ6Cj4gKyAgICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9pZW9j KG1jaSwgdmFsKTsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIFBPV0VS X1NVUFBMWV9QUk9QX1VTQl9UWVBFOgo+ICsgICAgICAgICAgICAgICB2YWwtPmludHZhbCA9IG1j aS0+cHN5X3VzYl90eXBlOwo+ICsgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIGRlZmF1 bHQ6Cj4gKyAgICAgICAgICAgICAgIHJldCA9IC1FTk9EQVRBOwo+ICsgICAgICAgfQo+ICsgICAg ICAgcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9zZXRf cHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAo+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiBwb3dlcl9zdXBw bHlfcHJvcHZhbCAqdmFsKQo+ICt7Cj4gKyAgICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICpt Y2kgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKPiArICAgICAgIGludCByZXQ7Cj4g Kwo+ICsgICAgICAgc3dpdGNoIChwc3ApIHsKPiArICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BS T1BfT05MSU5FOgo+ICsgICAgICAgICAgICAgICByZXQgPSBtdDYzNjBfY2hhcmdlcl9zZXRfb25s aW5lKG1jaSwgdmFsKTsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIFBP V0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UOgo+ICsgICAgICAgICAgICAg ICByZXQgPSBtdDYzNjBfY2hhcmdlcl9zZXRfaWNoZyhtY2ksIHZhbCk7Cj4gKyAgICAgICAgICAg ICAgIGJyZWFrOwo+ICsgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFS R0VfVk9MVEFHRToKPiArICAgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfc2V0X2N2 KG1jaSwgdmFsKTsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIFBPV0VS X1NVUFBMWV9QUk9QX0lOUFVUX0NVUlJFTlRfTElNSVQ6Cj4gKyAgICAgICAgICAgICAgIHJldCA9 IG10NjM2MF9jaGFyZ2VyX3NldF9haWNyKG1jaSwgdmFsKTsKPiArICAgICAgICAgICAgICAgYnJl YWs7Cj4gKyAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0lOUFVUX1ZPTFRBR0VfTElNSVQ6 Cj4gKyAgICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX3NldF9taXZyKG1jaSwgdmFs KTsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9Q Uk9QX1BSRUNIQVJHRV9DVVJSRU5UOgo+ICsgICAgICAgICAgICAgICByZXQgPSBtdDYzNjBfY2hh cmdlcl9zZXRfaXByZWNoZyhtY2ksIHZhbCk7Cj4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ICsg ICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVEVSTV9DVVJSRU5UOgo+ICsgICAg ICAgICAgICAgICByZXQgPSBtdDYzNjBfY2hhcmdlcl9zZXRfaWVvYyhtY2ksIHZhbCk7Cj4gKyAg ICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgZGVmYXVsdDoKPiArICAgICAgICAgICAgICAg cmV0ID0gLUVJTlZBTDsKPiArICAgICAgIH0KPiArICAgICAgIHJldHVybiByZXQ7Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfcHJvcGVydHlfaXNfd3JpdGVhYmxlKHN0cnVj dCBwb3dlcl9zdXBwbHkgKnBzeSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCkKPiArewo+ICsgICAg ICAgc3dpdGNoIChwc3ApIHsKPiArICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5F Ogo+ICsgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVO VDoKPiArICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRB R0U6Cj4gKyAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0lOUFVUX0NVUlJFTlRfTElNSVQ6 Cj4gKyAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0lOUFVUX1ZPTFRBR0VfTElNSVQ6Cj4g KyAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRUNIQVJHRV9DVVJSRU5UOgo+ICsgICAg ICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVEVSTV9DVVJSRU5UOgo+ICsgICAgICAg ICAgICAgICByZXR1cm4gMTsKPiArICAgICAgIGRlZmF1bHQ6Cj4gKyAgICAgICAgICAgICAgIHJl dHVybiAwOwo+ICsgICAgICAgfQo+ICt9Cj4gKwo+ICtzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlf cHJvcGVydHkgbXQ2MzYwX2NoYXJnZXJfcHJvcGVydGllc1tdID0gewo+ICsgICAgICAgUE9XRVJf U1VQUExZX1BST1BfT05MSU5FLAo+ICsgICAgICAgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAo+ ICsgICAgICAgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RZUEUsCj4gKyAgICAgICBQT1dFUl9T VVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVCwKPiArICAgICAgIFBPV0VSX1NVUFBM WV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UX01BWCwKPiArICAgICAgIFBPV0VSX1NVUFBM WV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFLAo+ICsgICAgICAgUE9XRVJfU1VQUExZX1BS T1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0VfTUFYLAo+ICsgICAgICAgUE9XRVJfU1VQUExZX1BS T1BfSU5QVVRfQ1VSUkVOVF9MSU1JVCwKPiArICAgICAgIFBPV0VSX1NVUFBMWV9QUk9QX0lOUFVU X1ZPTFRBR0VfTElNSVQsCj4gKyAgICAgICBQT1dFUl9TVVBQTFlfUFJPUF9QUkVDSEFSR0VfQ1VS UkVOVCwKPiArICAgICAgIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9URVJNX0NVUlJFTlQsCj4g KyAgICAgICBQT1dFUl9TVVBQTFlfUFJPUF9VU0JfVFlQRSwKPiArfTsKPiArCj4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbXQ2MzYwX2NoYXJnZXJfZGVzYyA9IHsKPiAr ICAgICAgIC50eXBlICAgICAgICAgICAgICAgICAgID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCLAo+ ICsgICAgICAgLnByb3BlcnRpZXMgICAgICAgICAgICAgPSBtdDYzNjBfY2hhcmdlcl9wcm9wZXJ0 aWVzLAo+ICsgICAgICAgLm51bV9wcm9wZXJ0aWVzICAgICAgICAgPSBBUlJBWV9TSVpFKG10NjM2 MF9jaGFyZ2VyX3Byb3BlcnRpZXMpLAo+ICsgICAgICAgLmdldF9wcm9wZXJ0eSAgICAgICAgICAg PSBtdDYzNjBfY2hhcmdlcl9nZXRfcHJvcGVydHksCj4gKyAgICAgICAuc2V0X3Byb3BlcnR5ICAg ICAgICAgICA9IG10NjM2MF9jaGFyZ2VyX3NldF9wcm9wZXJ0eSwKPiArICAgICAgIC5wcm9wZXJ0 eV9pc193cml0ZWFibGUgID0gbXQ2MzYwX2NoYXJnZXJfcHJvcGVydHlfaXNfd3JpdGVhYmxlLAo+ ICsgICAgICAgLnVzYl90eXBlcyAgICAgICAgICAgICAgPSBtdDYzNjBfY2hhcmdlcl91c2JfdHlw ZXMsCj4gKyAgICAgICAubnVtX3VzYl90eXBlcyAgICAgICAgICA9IEFSUkFZX1NJWkUobXQ2MzYw X2NoYXJnZXJfdXNiX3R5cGVzKSwKPiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVn dWxhdG9yX29wcyBtdDYzNjBfY2hnX290Z19vcHMgPSB7Cj4gKyAgICAgICAubGlzdF92b2x0YWdl ID0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXIsCj4gKyAgICAgICAuZW5hYmxlID0gcmVn dWxhdG9yX2VuYWJsZV9yZWdtYXAsCj4gKyAgICAgICAuZGlzYWJsZSA9IHJlZ3VsYXRvcl9kaXNh YmxlX3JlZ21hcCwKPiArICAgICAgIC5pc19lbmFibGVkID0gcmVndWxhdG9yX2lzX2VuYWJsZWRf cmVnbWFwLAo+ICsgICAgICAgLnNldF92b2x0YWdlX3NlbCA9IHJlZ3VsYXRvcl9zZXRfdm9sdGFn ZV9zZWxfcmVnbWFwLAo+ICsgICAgICAgLmdldF92b2x0YWdlX3NlbCA9IHJlZ3VsYXRvcl9nZXRf dm9sdGFnZV9zZWxfcmVnbWFwLAo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1 bGF0b3JfZGVzYyBtdDYzNjBfb3RnX3JkZXNjID0gewo+ICsgICAgICAgLm9mX21hdGNoID0gInVz Yi1vdGctdmJ1cyIsCj4gKyAgICAgICAubmFtZSA9ICJ1c2Itb3RnLXZidXMiLAo+ICsgICAgICAg Lm9wcyA9ICZtdDYzNjBfY2hnX290Z19vcHMsCj4gKyAgICAgICAub3duZXIgPSBUSElTX01PRFVM RSwKPiArICAgICAgIC50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsCj4gKyAgICAgICAubWluX3VW ID0gNDQyNTAwMCwKPiArICAgICAgIC51Vl9zdGVwID0gMjUwMDAsCj4gKyAgICAgICAubl92b2x0 YWdlcyA9IDU3LAo+ICsgICAgICAgLnZzZWxfcmVnID0gTVQ2MzYwX1BNVV9DSEdfQ1RSTDUsCj4g KyAgICAgICAudnNlbF9tYXNrID0gTVQ2MzYwX1ZPQlNUX01BU0ssCj4gKyAgICAgICAuZW5hYmxl X3JlZyA9IE1UNjM2MF9QTVVfQ0hHX0NUUkwxLAo+ICsgICAgICAgLmVuYWJsZV9tYXNrID0gTVQ2 MzYwX09QQV9NT0RFX01BU0ssCj4gK307Cj4gKwo+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbXQ2MzYw X3BtdV9hdHRhY2hfaV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCj4gK3sKPiArICAgICAg IHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSA9IGRhdGE7Cj4gKyAgICAgICBpbnQgcmV0Owo+ ICsgICAgICAgdW5zaWduZWQgaW50IHVzYl9zdGF0dXM7Cj4gKyAgICAgICBpbnQgbGFzdF91c2Jf dHlwZTsKPiArCj4gKyAgICAgICBtdXRleF9sb2NrKCZtY2ktPmNoZ2RldF9sb2NrKTsKPiArICAg ICAgIGlmICghbWNpLT5iYzEyX2VuKSB7Cj4gKyAgICAgICAgICAgICAgIGRldl93YXJuKG1jaS0+ ZGV2LCAiUmVjZWl2ZWQgYXR0YWNoIGludGVycnVwdCwgYmMxMiBkaXNhYmxlZCwgaWdub3JlIGly cVxuIik7Cj4gKyAgICAgICAgICAgICAgIGdvdG8gb3V0Owo+ICsgICAgICAgfQo+ICsgICAgICAg bGFzdF91c2JfdHlwZSA9IG1jaS0+cHN5X3VzYl90eXBlOwo+ICsgICAgICAgLyogUGx1ZyBpbiAq Lwo+ICsgICAgICAgcmV0ID0gcmVnbWFwX3JlYWQobWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfVVNC X1NUQVRVUzEsICZ1c2Jfc3RhdHVzKTsKPiArICAgICAgIGlmIChyZXQgPCAwKQo+ICsgICAgICAg ICAgICAgICBnb3RvIG91dDsKPiArICAgICAgIHVzYl9zdGF0dXMgJj0gTVQ2MzYwX1VTQl9TVEFU VVNfTUFTSzsKPiArICAgICAgIHVzYl9zdGF0dXMgPj49IE1UNjM2MF9VU0JfU1RBVFVTX1NIRlQ7 Cj4gKyAgICAgICBzd2l0Y2ggKHVzYl9zdGF0dXMpIHsKPiArICAgICAgIGNhc2UgTVQ2MzYwX0NI R19UWVBFX05PVkJVUzoKPiArICAgICAgICAgICAgICAgZGV2X2RiZyhtY2ktPmRldiwgIlJlY2Vp dmVkIGF0dGFjaCBpbnRlcnJ1cHQsIG5vIHZidXNcbiIpOwo+ICsgICAgICAgICAgICAgICBnb3Rv IG91dDsKPiArICAgICAgIGNhc2UgTVQ2MzYwX0NIR19UWVBFX1VOREVSX0dPSU5HOgo+ICsgICAg ICAgICAgICAgICBkZXZfZGJnKG1jaS0+ZGV2LCAiUmVjZWl2ZWQgYXR0YWNoIGludGVycnVwdCwg dW5kZXIgZ29pbmcuLi5cbiIpOwo+ICsgICAgICAgICAgICAgICBnb3RvIG91dDsKPiArICAgICAg IGNhc2UgTVQ2MzYwX0NIR19UWVBFX1NEUDoKPiArICAgICAgICAgICAgICAgbWNpLT5wc3lfdXNi X3R5cGUgPSBQT1dFUl9TVVBQTFlfVVNCX1RZUEVfU0RQOwo+ICsgICAgICAgICAgICAgICBicmVh azsKPiArICAgICAgIGNhc2UgTVQ2MzYwX0NIR19UWVBFX1NEUE5TVEQ6Cj4gKyAgICAgICAgICAg ICAgIG1jaS0+cHN5X3VzYl90eXBlID0gUE9XRVJfU1VQUExZX1VTQl9UWVBFX1NEUDsKPiArICAg ICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIE1UNjM2MF9DSEdfVFlQRV9DRFA6Cj4g KyAgICAgICAgICAgICAgIG1jaS0+cHN5X3VzYl90eXBlID0gUE9XRVJfU1VQUExZX1VTQl9UWVBF X0NEUDsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIE1UNjM2MF9DSEdf VFlQRV9EQ1A6Cj4gKyAgICAgICAgICAgICAgIG1jaS0+cHN5X3VzYl90eXBlID0gUE9XRVJfU1VQ UExZX1VTQl9UWVBFX0RDUDsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNl IE1UNjM2MF9DSEdfVFlQRV9ESVNBQkxFX0JDMTI6Cj4gKyAgICAgICAgICAgICAgIGRldl9kYmco bWNpLT5kZXYsICJSZWNlaXZlZCBhdHRhY2ggaW50ZXJydXB0LCBiYzEyIGRldGVjdCBub3QgZW5h YmxlXG4iKTsKPiArICAgICAgICAgICAgICAgZ290byBvdXQ7Cj4gKyAgICAgICBkZWZhdWx0Ogo+ ICsgICAgICAgICAgICAgICBkZXZfZGJnKG1jaS0+ZGV2LCAiUmVjZWl2ZWQgYXR0YWNoIGludGVy cnVwdCwgcmVzZXJ2ZWQgYWRkcmVzc1xuIik7Cj4gKyAgICAgICAgICAgICAgIGdvdG8gb3V0Owo+ ICsgICAgICAgfQo+ICsKPiArICAgICAgIGRldl9kYmcobWNpLT5kZXYsICJSZWNlaXZlZCBhdHRh Y2ggaW50ZXJydXB0LCBjaGdfdHlwZSA9ICVkXG4iLCBtY2ktPnBzeV91c2JfdHlwZSk7Cj4gKyAg ICAgICBpZiAobGFzdF91c2JfdHlwZSAhPSBtY2ktPnBzeV91c2JfdHlwZSkKPiArICAgICAgICAg ICAgICAgcG93ZXJfc3VwcGx5X2NoYW5nZWQobWNpLT5wc3kpOwo+ICtvdXQ6Cj4gKyAgICAgICBt dXRleF91bmxvY2soJm1jaS0+Y2hnZGV0X2xvY2spOwo+ICsgICAgICAgcmV0dXJuIElSUV9IQU5E TEVEOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBtdDYzNjBfaGFuZGxlX2NocmRldF9leHRfZXZ0 KHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSkKPiArewo+ICsgICAgICAgaW50IHJldDsKPiAr ICAgICAgIGJvb2wgcHdyX3JkeTsKPiArCj4gKyAgICAgICBtdXRleF9sb2NrKCZtY2ktPmNoZ2Rl dF9sb2NrKTsKPiArICAgICAgIHJldCA9IG10NjM2MF9nZXRfY2hyZGV0X2V4dF9zdGF0KG1jaSwg JnB3cl9yZHkpOwo+ICsgICAgICAgaWYgKHJldCA8IDApCj4gKyAgICAgICAgICAgICAgIGdvdG8g b3V0Owo+ICsgICAgICAgaWYgKG1jaS0+cHdyX3JkeSA9PSBwd3JfcmR5KSB7Cj4gKyAgICAgICAg ICAgICAgIGRldl9kYmcobWNpLT5kZXYsICJSZWNlaXZlZCB2YnVzIGludGVycnVwdCwgcHdyX3Jk eSBpcyBzYW1lKCVkKVxuIiwgcHdyX3JkeSk7Cj4gKyAgICAgICAgICAgICAgIGdvdG8gb3V0Owo+ ICsgICAgICAgfQo+ICsgICAgICAgbWNpLT5wd3JfcmR5ID0gcHdyX3JkeTsKPiArICAgICAgIGRl dl9kYmcobWNpLT5kZXYsICJSZWNlaXZlZCB2YnVzIGludGVycnVwdCwgcHdyX3JkeSA9ICVkXG4i LCBwd3JfcmR5KTsKPiArICAgICAgIGlmICghcHdyX3JkeSkgewo+ICsgICAgICAgICAgICAgICBt Y2ktPnBzeV91c2JfdHlwZSA9IFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9VTktOT1dOOwo+ICsgICAg ICAgICAgICAgICBwb3dlcl9zdXBwbHlfY2hhbmdlZChtY2ktPnBzeSk7Cj4gKwo+ICsgICAgICAg fQo+ICsgICAgICAgcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9QTVVfREVWSUNFX1RZUEUsCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1VTQkNIR0VOX01BU0ssCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdyX3JkeSA/IE1UNjM2MF9VU0JDSEdFTl9N QVNLIDogMCk7Cj4gKyAgICAgICBpZiAocmV0IDwgMCkKPiArICAgICAgICAgICAgICAgZ290byBv dXQ7Cj4gKyAgICAgICBtY2ktPmJjMTJfZW4gPSBwd3JfcmR5Owo+ICtvdXQ6Cj4gKyAgICAgICBt dXRleF91bmxvY2soJm1jaS0+Y2hnZGV0X2xvY2spOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBt dDYzNjBfY2hyZGV0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICt7Cj4gKyAgICAg ICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSAoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAq KWNvbnRhaW5lcl9vZigKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29y aywgc3RydWN0IG10NjM2MF9jaGdfaW5mbywgY2hyZGV0X3dvcmspOwo+ICsKPiArICAgICAgIG10 NjM2MF9oYW5kbGVfY2hyZGV0X2V4dF9ldnQobWNpKTsKPiArfQo+ICsKPiArc3RhdGljIGlycXJl dHVybl90IG10NjM2MF9wbXVfY2hyZGV0X2V4dF9ldnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpk YXRhKQo+ICt7Cj4gKyAgICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ ICsKPiArICAgICAgIG10NjM2MF9oYW5kbGVfY2hyZGV0X2V4dF9ldnQobWNpKTsKPiArICAgICAg IHJldHVybiBJUlFfSEFORExFRDsKPiArfQo+ICsKPiArc3RhdGljIGludCBtdDYzNjBfY2hnX2ly cV9yZWdpc3RlcihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKyAgICAgICBj b25zdCBzdHJ1Y3Qgewo+ICsgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lOwo+ICsgICAg ICAgICAgICAgICBpcnFfaGFuZGxlcl90IGhhbmRsZXI7Cj4gKyAgICAgICB9IGlycV9kZXNjc1td ID0gewo+ICsgICAgICAgICAgICAgICB7ICJhdHRhY2hfaSIsIG10NjM2MF9wbXVfYXR0YWNoX2lf aGFuZGxlciB9LAo+ICsgICAgICAgICAgICAgICB7ICJjaHJkZXRfZXh0X2V2dCIsIG10NjM2MF9w bXVfY2hyZGV0X2V4dF9ldnRfaGFuZGxlciB9Cj4gKyAgICAgICB9Owo+ICsgICAgICAgaW50IGks IHJldDsKPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcnFfZGVzY3Mp OyBpKyspIHsKPiArICAgICAgICAgICAgICAgcmV0ID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUo cGRldiwgaXJxX2Rlc2NzW2ldLm5hbWUpOwo+ICsgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkK PiArICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ICsKPiArICAgICAgICAgICAg ICAgcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmcGRldi0+ZGV2LCByZXQsIE5VTEws Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJxX2Rl c2NzW2ldLmhhbmRsZXIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgSVJRRl9UUklHR0VSX0ZBTExJTkcsCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgaXJxX2Rlc2NzW2ldLm5hbWUsCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1fZ2V0X2RydmRhdGEo cGRldikpOwo+ICsgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKPiArICAgICAgICAgICAgICAg ICAgICAgICByZXR1cm4gZGV2X2Vycl9wcm9iZSgmcGRldi0+ZGV2LCByZXQsICJGYWlsZWQgdG8g cmVxdWVzdCAlcyBpcnFcbiIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgaXJxX2Rlc2NzW2ldLm5hbWUpOwo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIHJl dHVybiAwOwo+ICt9Cj4gKwo+ICtzdHJ1Y3QgbXQ2MzYwX2ZpZWxkX2luZm8gewo+ICsgICAgICAg c3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHI7Cj4gKyAgICAgICB1MTYgcmVnOwo+ICsg ICAgICAgdTggbWFzazsKPiArICAgICAgIHU4IHNoZnQ7Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW50 IG10NjM2MF9jaGdfaW5pdF9zZXR0aW5nKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSkKPiAr ewo+ICsgICAgICAgaW50IHJldDsKPiArCj4gKyAgICAgICByZXQgPSByZWdtYXBfdXBkYXRlX2Jp dHMobWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfREVWSUNFX1RZUEUsCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgTVQ2MzYwX1VTQkNIR0VOX01BU0ssIDApOwo+ICsgICAgICAgaWYg KHJldCkKPiArICAgICAgICAgICAgICAgcmV0dXJuIGRldl9lcnJfcHJvYmUobWNpLT5kZXYsIHJl dCwgIiVzOiBGYWlsZWQgdG8gZGlzYWJsZSBiYzEyXG4iLCBfX2Z1bmNfXyk7Cj4gKyAgICAgICBy ZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMobWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX0NUUkwy LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JSU5MTVRTRUxfTUFT SywKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSUlOTE1UU0VMX0FJ Q1IgPDwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lJ TkxNVFNFTF9TSEZUKTsKPiArICAgICAgIGlmIChyZXQpCj4gKyAgICAgICAgICAgICAgIHJldHVy biBkZXZfZXJyX3Byb2JlKG1jaS0+ZGV2LCByZXQsCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHN3aXRjaCBpaW5sbXRzZWwgdG8gYWljclxuIiwg X19mdW5jX18pOwo+ICsgICAgICAgdXNsZWVwX3JhbmdlKDUwMDAsIDYwMDApOwo+ICsgICAgICAg cmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLCBNVDYzNjBfUE1VX0NIR19DVFJM MywKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSUxJTV9FTl9NQVNL LCAwKTsKPiArICAgICAgIGlmIChyZXQpCj4gKyAgICAgICAgICAgICAgIHJldHVybiBkZXZfZXJy X3Byb2JlKG1jaS0+ZGV2LCByZXQsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICIlczogRmFpbGVkIHRvIGRpc2FibGUgaWxpbVxuIiwgX19mdW5jX18pOwo+ICsgICAgICAg cmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLCBNVDYzNjBfUE1VX0NIR19DVFJM MTAsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX09UR19PQ19NQVNL LCBNVDYzNjBfT1RHX09DX01BU0spOwo+ICsgICAgICAgaWYgKHJldCkKPiArICAgICAgICAgICAg ICAgcmV0dXJuIGRldl9lcnJfcHJvYmUobWNpLT5kZXYsIHJldCwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gY29uZmlnIG90ZyBvYyB0byAzQVxu IiwgX19mdW5jX18pOwo+ICsgICAgICAgcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB1MzIg bXQ2MzYwX3Zpbm92cF90cmFuc190b19zZWwodTMyIHZhbCkKPiArewo+ICsgICAgICAgdTMyIHZp bm92cF90YmxbXSA9IHsgNTUwMDAwMCwgNjUwMDAwMCwgMTEwMDAwMDAsIDE0NTAwMDAwIH07Cj4g KyAgICAgICBpbnQgaTsKPiArCj4gKyAgICAgICAvKiBTZWxlY3QgdGhlIHNtYWxsZXIgYW5kIGVx dWFsIHN1cHBvcnRlZCB2YWx1ZSAqLwo+ICsgICAgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJ WkUodmlub3ZwX3RibCktMTsgaSsrKSB7Cj4gKyAgICAgICAgICAgICAgIGlmICh2YWwgPCB2aW5v dnBfdGJsW2krMV0pCj4gKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICB9 Cj4gKyAgICAgICByZXR1cm4gaTsKPiArfQo+ICsKPiArc3RhdGljIGludCBtdDYzNjBfcGFyc2Vf ZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsgICAgICAgc3RydWN0IG10 NjM2MF9jaGdfaW5mbyAqbWNpID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwo+ICsgICAg ICAgaW50IHJldDsKPiArCj4gKyAgICAgICByZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIo JnBkZXYtPmRldiwgInJpY2h0ZWssdmlub3ZwLW1pY3Jvdm9sdCIsICZtY2ktPnZpbm92cCk7Cj4g KyAgICAgICBpZiAocmV0KQo+ICsgICAgICAgICAgICAgICByZXR1cm4gZGV2X2Vycl9wcm9iZSgm cGRldi0+ZGV2LCByZXQsICJGYWlsZWQgdG8gcGFyc2Ugdmlub3ZwIGluIERUXG4iKTsKPiArICAg ICAgIHJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbXQ2MzYwX2FwcGx5X2R0KHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gK3sKPiArICAgICAgIHN0cnVjdCBtdDYzNjBf Y2hnX2luZm8gKm1jaSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKPiArICAgICAgIHUz MiBzZWw7Cj4gKwo+ICsgICAgICAgc2VsID0gbXQ2MzYwX3Zpbm92cF90cmFuc190b19zZWwobWNp LT52aW5vdnApOwo+ICsgICAgICAgcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21h cCwgTVQ2MzYwX1BNVV9DSEdfQ1RSTDE5LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBNVDYzNjBfVklOT1ZQX01BU0ssIHNlbCA8PCBNVDYzNjBfVklOT1ZQX1NIRlQpOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYpCj4gK3sKPiArICAgICAgIHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaTsK PiArICAgICAgIHN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIGNoYXJnZXJfY2ZnID0ge307Cj4g KyAgICAgICBzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07Cj4gKyAgICAgICBp bnQgcmV0Owo+ICsKPiArICAgICAgIG1jaSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXpl b2YoKm1jaSksIEdGUF9LRVJORUwpOwo+ICsgICAgICAgaWYgKCFtY2kpCj4gKyAgICAgICAgICAg ICAgIHJldHVybiAtRU5PTUVNOwo+ICsKPiArICAgICAgIHJldCA9IG10NjM2MF9wYXJzZV9kdChw ZGV2KTsKPiArICAgICAgIGlmIChyZXQpCj4gKyAgICAgICAgICAgICAgIHJldHVybiBkZXZfZXJy X3Byb2JlKCZwZGV2LT5kZXYsIHJldCwgIkZhaWxlZCB0byBwYXJzZSBkdFxuIik7Cj4gKwo+ICsg ICAgICAgbWNpLT5kZXYgPSAmcGRldi0+ZGV2Owo+ICsgICAgICAgbWNpLT52aW5vdnAgPSA2NTAw MDAwOwo+ICsgICAgICAgbXV0ZXhfaW5pdCgmbWNpLT5jaGdkZXRfbG9jayk7Cj4gKyAgICAgICBw bGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtY2kpOwo+ICsgICAgICAgSU5JVF9XT1JLKCZtY2kt PmNocmRldF93b3JrLCAmbXQ2MzYwX2NocmRldF93b3JrKTsKPiArCj4gKyAgICAgICBtY2ktPnJl Z21hcCA9IGRldl9nZXRfcmVnbWFwKHBkZXYtPmRldi5wYXJlbnQsIE5VTEwpOwo+ICsgICAgICAg aWYgKCFtY2ktPnJlZ21hcCkKPiArICAgICAgICAgICAgICAgcmV0dXJuIGRldl9lcnJfcHJvYmUo JnBkZXYtPmRldiwgLUVOT0RFViwgIkZhaWxlZCB0byBnZXQgcGFyZW50IHJlZ21hcFxuIik7Cj4g Kwo+ICsgICAgICAgcmV0ID0gbXQ2MzYwX2FwcGx5X2R0KHBkZXYpOwo+ICsgICAgICAgaWYgKHJl dCkKPiArICAgICAgICAgICAgICAgcmV0dXJuIGRldl9lcnJfcHJvYmUoJnBkZXYtPmRldiwgcmV0 LCAiRmFpbGVkIHRvIGFwcGx5IGR0XG4iKTsKPiArCj4gKyAgICAgICBtZW1jcHkoJm1jaS0+cHN5 X2Rlc2MsICZtdDYzNjBfY2hhcmdlcl9kZXNjLCBzaXplb2YobWNpLT5wc3lfZGVzYykpOwo+ICsg ICAgICAgbWNpLT5wc3lfZGVzYy5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7Cj4gKyAgICAg ICBjaGFyZ2VyX2NmZy5kcnZfZGF0YSA9IG1jaTsKPiArICAgICAgIGNoYXJnZXJfY2ZnLm9mX25v ZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKPiArICAgICAgIG1jaS0+cHN5ID0gZGV2bV9wb3dlcl9z dXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgJm1jaS0+cHN5X2Rlc2MsICZjaGFyZ2VyX2NmZyk7Cj4gKyAgICAg ICBpZiAoSVNfRVJSKG1jaS0+cHN5KSkKPiArICAgICAgICAgICAgICAgcmV0dXJuIGRldl9lcnJf cHJvYmUoJnBkZXYtPmRldiwgUFRSX0VSUihtY2ktPnBzeSksCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVnaXN0ZXIgcG93ZXIgc3VwcGx5IGRldlxu Iik7Cj4gKwo+ICsgICAgICAgcmV0ID0gbXQ2MzYwX2NoZ19pbml0X3NldHRpbmcobWNpKTsKPiAr ICAgICAgIGlmIChyZXQpCj4gKyAgICAgICAgICAgICAgIHJldHVybiBkZXZfZXJyX3Byb2JlKCZw ZGV2LT5kZXYsIHJldCwgIkZhaWxlZCB0byBpbml0aWFsIHNldHRpbmdcbiIpOwo+ICsKPiArICAg ICAgIHNjaGVkdWxlX3dvcmsoJm1jaS0+Y2hyZGV0X3dvcmspOwo+ICsKPiArICAgICAgIHJldCA9 IG10NjM2MF9jaGdfaXJxX3JlZ2lzdGVyKHBkZXYpOwo+ICsgICAgICAgaWYgKHJldCkKPiArICAg ICAgICAgICAgICAgcmV0dXJuIGRldl9lcnJfcHJvYmUoJnBkZXYtPmRldiwgcmV0LCAiRmFpbGVk IHRvIHJlZ2lzdGVyIGlycXNcbiIpOwo+ICsKPiArICAgICAgIGNvbmZpZy5kZXYgPSAmcGRldi0+ ZGV2Owo+ICsgICAgICAgY29uZmlnLnJlZ21hcCA9IG1jaS0+cmVnbWFwOwo+ICsgICAgICAgbWNp LT5vdGdfcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZtdDYzNjBf b3RnX3JkZXNjLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICZjb25maWcpOwo+ICsgICAgICAgaWYgKElTX0VSUihtY2ktPm90Z19yZGV2KSkKPiArICAg ICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIobWNpLT5vdGdfcmRldik7Cj4gKwo+ICsgICAgICAg cmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9f bWF5YmVfdW51c2VkIG10NjM2MF9jaGFyZ2VyX29mX2lkW10gPSB7Cj4gKyAgICAgICB7IC5jb21w YXRpYmxlID0gIm1lZGlhdGVrLG10NjM2MC1jaGciLCB9LAo+ICsgICAgICAge30sCj4gK307Cj4g K01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG10NjM2MF9jaGFyZ2VyX29mX2lkKTsKPiArCj4gK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIG10NjM2MF9jaGFyZ2VyX2lkW10g PSB7Cj4gKyAgICAgICB7ICJtdDYzNjAtY2hnIiwgMCB9LAo+ICsgICAgICAge30sCj4gK307Cj4g K01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIG10NjM2MF9jaGFyZ2VyX2lkKTsKPiArCj4g K3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG10NjM2MF9jaGFyZ2VyX2RyaXZlciA9IHsK PiArICAgICAgIC5kcml2ZXIgPSB7Cj4gKyAgICAgICAgICAgICAgIC5uYW1lID0gIm10NjM2MC1j aGciLAo+ICsgICAgICAgICAgICAgICAub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobXQ2 MzYwX2NoYXJnZXJfb2ZfaWQpLAo+ICsgICAgICAgfSwKPiArICAgICAgIC5wcm9iZSA9IG10NjM2 MF9jaGFyZ2VyX3Byb2JlLAo+ICsgICAgICAgLmlkX3RhYmxlID0gbXQ2MzYwX2NoYXJnZXJfaWQs Cj4gK307Cj4gK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobXQ2MzYwX2NoYXJnZXJfZHJpdmVyKTsK PiArCj4gK01PRFVMRV9BVVRIT1IoIkdlbmUgQ2hlbiA8Z2VuZV9jaGVuQHJpY2h0ZWsuY29tPiIp Owo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIk1UNjM2MCBDaGFyZ2VyIERyaXZlciIpOwo+ICtNT0RV TEVfTElDRU5TRSgiR1BMIik7Cj4gLS0KPiAyLjcuNAo+CgpEZWFyIFJldmlld2VycywKSXMgdGhl cmUgYW55IGNoYW5nZSBJIGNhbiBmaXgsIHBsZWFzZSBsZXQgbWUga25vdywgdGhhbmtzCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eC1tZWRpYXRl ayBtYWlsaW5nIGxpc3QKTGludXgtbWVkaWF0ZWtAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8v bGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LW1lZGlhdGVrCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.7 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C9502C433E0 for ; Tue, 2 Mar 2021 07:28:52 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 49094600CD for ; Tue, 2 Mar 2021 07:28:52 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 49094600CD Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=3MAm5J65Qnygash4EsjzW1NO/vlJhbSoPVE9gIUYVtU=; b=zqNDu1qoWxWqdHpm+A+B8Umi8 euPUJnheXmp2+npS2cUj1fNbmOMIH9nm3mm/V4zIsdKE3TFgAhGTC0h6wix+2Aje+Skd6r60QwQZZ VlaP/soSfTpfXqEVtxPleQJQq6qcTR213n74P8NAytw3ogolZNWriVfr4HAfRHzCxFeQcGgyT7kuV PhbApxtIsnQmymokrvbC9otQYjBpJq4TbBnaSqJ+2XZoPTNFi0ssykvIBOGz9jN3M05eEzUz2CaOa 0xTTIiz2WqZXAZTQeR2ZQVSKDC39WCPvNTV5h2CZaZH+oYY2foXs80TGWs/G3r5MaeA5iNyC6bAs0 8inT2QRoQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1lGzRD-0005Or-4B; Tue, 02 Mar 2021 07:27:23 +0000 Received: from mail-oi1-x230.google.com ([2607:f8b0:4864:20::230]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1lGzR9-0005OV-RB; Tue, 02 Mar 2021 07:27:21 +0000 Received: by mail-oi1-x230.google.com with SMTP id f3so20996797oiw.13; Mon, 01 Mar 2021 23:27:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=8YWpO+oUelwFS8P7JJPZbCNfi9Z5emBQZAkwd7xewwM=; b=GpSKPNu/vkDcQHKJR83UsrJ0UaIAqOuyiPeD+r1Kq/csfIcgyuBLTiGvz1ykW0Qwf/ gzklNyZpl9jnWKodKVzqQJp0bok88BYXakSDbNko1Mkg5aA4/EBaaO+xOSAwBpJhllba jISs3KkKlS5IrtDMCJxdKaUD+izlsBWtLq6p1YGxiQDVaUc0Kyv34h4TJJmUw3LPJNME CA4jb9cvbhpiX9YqvlXKhrmXyu040o3CMZ9QjqhnYjGaOZpduXzjDqogbw0b6qIN8hTS jX1NPZ3ReiRCPZnkOYC9JY549MPnLQ5SLDZ+EUGsD8rF4aNX5Zv+PdodiYr7qAQ4rJAm xqEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=8YWpO+oUelwFS8P7JJPZbCNfi9Z5emBQZAkwd7xewwM=; b=WKxFB2jBW+da4bv6UNm4dHHghnekTRDmlT4slDXNhW8mqHTox/aEFLOCaMAO+nFuoo JhsEVE79xdMCXCevOEzwE7Gl/7TFUXAYBwD7bTc2DzKaO/YFqZwnhbtO9x3Xzam6u092 rWWVJRv065g5T1CBs+CmPcF3TtlpyKFVeL6N4R4uKMtj0Fnvci1N6/UsvngnklK6FBis UOCQyfi0SwRLYgqMmfWeursUDAq6ynhU2QpZJbwEKTqVC/8Qjuuv51GASRYLSIYnDALc vc57AZTGtgKEcdT3mAwJsxiKFG1W8QbI0yDNyoHnChfzCJYHsGtPFEyRJ7wLfq/3EWpp wcNQ== X-Gm-Message-State: AOAM532//vU52xpku34TrFjqLoVjUt84HKlgsOymut6N9WiB+xhHW+BA 7bSC6D/GMblh6KrhSMfI+VXJq+UTlEpGmW++KVc= X-Google-Smtp-Source: ABdhPJyRi5m3vv5FYXRhxrhjCC3K17uS/vOnPaDyyj38T8pYmNPpI0epL0iNLneiDLhMgbxPM47WiJjrPOvdkDYdDAc= X-Received: by 2002:aca:4d55:: with SMTP id a82mr2234507oib.23.1614670037247; Mon, 01 Mar 2021 23:27:17 -0800 (PST) MIME-Version: 1.0 References: <1610973703-676-1-git-send-email-gene.chen.richtek@gmail.com> <1610973703-676-3-git-send-email-gene.chen.richtek@gmail.com> In-Reply-To: <1610973703-676-3-git-send-email-gene.chen.richtek@gmail.com> From: Gene Chen Date: Tue, 2 Mar 2021 15:27:07 +0800 Message-ID: Subject: Re: [PATCH v4 2/2] power: supply: mt6360_charger: add MT6360 charger support To: sre@kernel.org, Matthias Brugger , Rob Herring X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210302_022719_986722_57D418D6 X-CRM114-Status: GOOD ( 23.65 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gene Chen , devicetree , linux-pm@vger.kernel.org, Linux Kernel Mailing List , ChiYuan Huang , benjamin.chao@mediatek.com, "moderated list:ARM/Mediatek SoC support" , Wilma.Wu@mediatek.com, linux-arm Mailing List , shufan_lee@richtek.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org R2VuZSBDaGVuIDxnZW5lLmNoZW4ucmljaHRla0BnbWFpbC5jb20+IOaWvCAyMDIx5bm0MeaciDE4 5pelIOmAseS4gCDkuIvljYg4OjQy5a+r6YGT77yaCj4KPiBGcm9tOiBHZW5lIENoZW4gPGdlbmVf Y2hlbkByaWNodGVrLmNvbT4KPgo+IEFkZCBiYXNpYyBzdXBwb3J0IGZvciB0aGUgYmF0dGVyeSBj aGFyZ2VyIGZvciBNVDYzNjAgUE1JQwo+Cj4gU2lnbmVkLW9mZi1ieTogR2VuZSBDaGVuIDxnZW5l X2NoZW5AcmljaHRlay5jb20+Cj4gLS0tCj4gIGRyaXZlcnMvcG93ZXIvc3VwcGx5L0tjb25maWcg ICAgICAgICAgfCAgMTAgKwo+ICBkcml2ZXJzL3Bvd2VyL3N1cHBseS9NYWtlZmlsZSAgICAgICAg IHwgICAxICsKPiAgZHJpdmVycy9wb3dlci9zdXBwbHkvbXQ2MzYwX2NoYXJnZXIuYyB8IDkxNCAr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgOTI1 IGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvcG93ZXIvc3VwcGx5 L210NjM2MF9jaGFyZ2VyLmMKPgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9L Y29uZmlnIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvS2NvbmZpZwo+IGluZGV4IGVlYzY0NmMuLmRk NjNiZWQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9wb3dlci9zdXBwbHkvS2NvbmZpZwo+ICsrKyBi L2RyaXZlcnMvcG93ZXIvc3VwcGx5L0tjb25maWcKPiBAQCAtNTY3LDYgKzU2NywxNiBAQCBjb25m aWcgQ0hBUkdFUl9NUDI2MjkKPiAgICAgICAgICAgQmF0dGVyeSBjaGFyZ2VyLiBUaGlzIGRyaXZl ciBwcm92aWRlcyBCYXR0ZXJ5IGNoYXJnZXIgcG93ZXIgbWFuYWdlbWVudAo+ICAgICAgICAgICBm dW5jdGlvbnMgb24gdGhlIHN5c3RlbXMuCj4KPiArY29uZmlnIENIQVJHRVJfTVQ2MzYwCj4gKyAg ICAgICB0cmlzdGF0ZSAiTWVkaWF0ZWsgTVQ2MzYwIENoYXJnZXIgRHJpdmVyIgo+ICsgICAgICAg ZGVwZW5kcyBvbiBNRkRfTVQ2MzYwCj4gKyAgICAgICBkZXBlbmRzIG9uIFJFR1VMQVRPUgo+ICsg ICAgICAgaGVscAo+ICsgICAgICAgICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBNVDYzNjAgQ2hhcmdl ciBQYXJ0Lgo+ICsgICAgICAgICBUaGUgZGV2aWNlIHN1cHBvcnRzIEhpZ2gtQWNjdXJhY3kgVm9s dGFnZS9DdXJyZW50IFJlZ3VsYXRpb24sCj4gKyAgICAgICAgIEF2ZXJhZ2UgSW5wdXQgQ3VycmVu dCBSZWd1bGF0aW9uLCBCYXR0ZXJ5IFRlbXBhdHVyZSBTZW5zaW5nLAo+ICsgICAgICAgICBPdmVy LVRlbXBlcmF0dXJlIFByb3RlY3Rpb24sIERQRE0gRGV0ZWN0aW9uIGZvciBCQzEuMgo+ICsKPiAg Y29uZmlnIENIQVJHRVJfUUNPTV9TTUJCCj4gICAgICAgICB0cmlzdGF0ZSAiUXVhbGNvbW0gU3dp dGNoLU1vZGUgQmF0dGVyeSBDaGFyZ2VyIGFuZCBCb29zdCIKPiAgICAgICAgIGRlcGVuZHMgb24g TUZEX1NQTUlfUE1JQyB8fCBDT01QSUxFX1RFU1QKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dl ci9zdXBwbHkvTWFrZWZpbGUgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9NYWtlZmlsZQo+IGluZGV4 IGRkNGI4NjMuLjliZDA4MDQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9wb3dlci9zdXBwbHkvTWFr ZWZpbGUKPiArKysgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9NYWtlZmlsZQo+IEBAIC03Nyw2ICs3 Nyw3IEBAIG9iai0kKENPTkZJR19DSEFSR0VSX01BWDc3NjkzKSAgICAgICAgKz0gbWF4Nzc2OTNf Y2hhcmdlci5vCj4gIG9iai0kKENPTkZJR19DSEFSR0VSX01BWDg5OTcpICArPSBtYXg4OTk3X2No YXJnZXIubwo+ICBvYmotJChDT05GSUdfQ0hBUkdFUl9NQVg4OTk4KSAgKz0gbWF4ODk5OF9jaGFy Z2VyLm8KPiAgb2JqLSQoQ09ORklHX0NIQVJHRVJfTVAyNjI5KSAgICs9IG1wMjYyOV9jaGFyZ2Vy Lm8KPiArb2JqLSQoQ09ORklHX0NIQVJHRVJfTVQ2MzYwKSAgICs9IG10NjM2MF9jaGFyZ2VyLm8K PiAgb2JqLSQoQ09ORklHX0NIQVJHRVJfUUNPTV9TTUJCKSAgICAgICAgKz0gcWNvbV9zbWJiLm8K PiAgb2JqLSQoQ09ORklHX0NIQVJHRVJfQlEyNDE1WCkgICs9IGJxMjQxNXhfY2hhcmdlci5vCj4g IG9iai0kKENPTkZJR19DSEFSR0VSX0JRMjQxOTApICArPSBicTI0MTkwX2NoYXJnZXIubwo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9tdDYzNjBfY2hhcmdlci5jIGIvZHJpdmVy cy9wb3dlci9zdXBwbHkvbXQ2MzYwX2NoYXJnZXIuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4g aW5kZXggMDAwMDAwMC4uZDgwYmRhZAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL3Bv d2VyL3N1cHBseS9tdDYzNjBfY2hhcmdlci5jCj4gQEAgLTAsMCArMSw5MTQgQEAKPiArLy8gU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiArLyoKPiArICogQ29weXJpZ2h0IChjKSAy MDIxIE1lZGlhVGVrIEluYy4KPiArICovCj4gKwo+ICsjaW5jbHVkZSA8bGludXgvaW5pdC5oPgo+ ICsjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwu aD4KPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4K PiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ICsjaW5jbHVkZSA8bGludXgv cG93ZXJfc3VwcGx5Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9wcm9wZXJ0eS5oPgo+ICsjaW5jbHVk ZSA8bGludXgvcmVnbWFwLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+ Cj4gKwo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkwxICAgMHgzMTEKPiArI2RlZmluZSBN VDYzNjBfUE1VX0NIR19DVFJMMiAgIDB4MzEyCj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9DSEdfQ1RS TDMgICAweDMxMwo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkw0ICAgMHgzMTQKPiArI2Rl ZmluZSBNVDYzNjBfUE1VX0NIR19DVFJMNSAgIDB4MzE1Cj4gKyNkZWZpbmUgTVQ2MzYwX1BNVV9D SEdfQ1RSTDYgICAweDMxNgo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkw3ICAgMHgzMTcK PiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19DVFJMOCAgIDB4MzE4Cj4gKyNkZWZpbmUgTVQ2MzYw X1BNVV9DSEdfQ1RSTDkgICAweDMxOQo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX0NUUkwxMCAg MHgzMUEKPiArI2RlZmluZSBNVDYzNjBfUE1VX0RFVklDRV9UWVBFIDB4MzIyCj4gKyNkZWZpbmUg TVQ2MzYwX1BNVV9VU0JfU1RBVFVTMSAweDMyNwo+ICsjZGVmaW5lIE1UNjM2MF9QTVVfQ0hHX1NU QVQgICAgMHgzNEEKPiArI2RlZmluZSBNVDYzNjBfUE1VX0NIR19DVFJMMTkgIDB4MzYxCj4gKyNk ZWZpbmUgTVQ2MzYwX1BNVV9GT0RfU1RBVCAgICAweDNFNwo+ICsKPiArLyogTVQ2MzYwX1BNVV9D SEdfQ1RSTDEgKi8KPiArI2RlZmluZSBNVDYzNjBfRlNMUF9TSEZUICAgICAgICgzKQo+ICsjZGVm aW5lIE1UNjM2MF9GU0xQX01BU0sgICAgICAgQklUKE1UNjM2MF9GU0xQX1NIRlQpCj4gKyNkZWZp bmUgTVQ2MzYwX09QQV9NT0RFX1NIRlQgICAoMCkKPiArI2RlZmluZSBNVDYzNjBfT1BBX01PREVf TUFTSyAgIEJJVChNVDYzNjBfT1BBX01PREVfU0hGVCkKPiArLyogTVQ2MzYwX1BNVV9DSEdfQ1RS TDIgKi8KPiArI2RlZmluZSBNVDYzNjBfSUlOTE1UU0VMX1NIRlQgICgyKQo+ICsjZGVmaW5lIE1U NjM2MF9JSU5MTVRTRUxfTUFTSyAgR0VOTUFTSygzLCAyKQo+ICsvKiBNVDYzNjBfUE1VX0NIR19D VFJMMyAqLwo+ICsjZGVmaW5lIE1UNjM2MF9JQUlDUl9TSEZUICAgICAgKDIpCj4gKyNkZWZpbmUg TVQ2MzYwX0lBSUNSX01BU0sgICAgICBHRU5NQVNLKDcsIDIpCj4gKyNkZWZpbmUgTVQ2MzYwX0lM SU1fRU5fTUFTSyAgICBCSVQoMCkKPiArLyogTVQ2MzYwX1BNVV9DSEdfQ1RSTDQgKi8KPiArI2Rl ZmluZSBNVDYzNjBfVk9SRUdfU0hGVCAgICAgICgxKQo+ICsjZGVmaW5lIE1UNjM2MF9WT1JFR19N QVNLICAgICAgR0VOTUFTSyg3LCAxKQo+ICsvKiBNVDYzNjBfUE1VX0NIR19DVFJMNSAqLwo+ICsj ZGVmaW5lIE1UNjM2MF9WT0JTVF9NQVNLICAgICAgR0VOTUFTSyg3LCAyKQo+ICsvKiBNVDYzNjBf UE1VX0NIR19DVFJMNiAqLwo+ICsjZGVmaW5lIE1UNjM2MF9WTUlWUl9TSEZUICAgICAgKDEpCj4g KyNkZWZpbmUgTVQ2MzYwX1ZNSVZSX01BU0sgICAgICBHRU5NQVNLKDcsIDEpCj4gKy8qIE1UNjM2 MF9QTVVfQ0hHX0NUUkw3ICovCj4gKyNkZWZpbmUgTVQ2MzYwX0lDSEdfU0hGVCAgICAgICAoMikK PiArI2RlZmluZSBNVDYzNjBfSUNIR19NQVNLICAgICAgIEdFTk1BU0soNywgMikKPiArLyogTVQ2 MzYwX1BNVV9DSEdfQ1RSTDggKi8KPiArI2RlZmluZSBNVDYzNjBfSVBSRUNfU0hGVCAgICAgICgw KQo+ICsjZGVmaW5lIE1UNjM2MF9JUFJFQ19NQVNLICAgICAgR0VOTUFTSygzLCAwKQo+ICsvKiBN VDYzNjBfUE1VX0NIR19DVFJMOSAqLwo+ICsjZGVmaW5lIE1UNjM2MF9JRU9DX1NIRlQgICAgICAg KDQpCj4gKyNkZWZpbmUgTVQ2MzYwX0lFT0NfTUFTSyAgICAgICBHRU5NQVNLKDcsIDQpCj4gKy8q IE1UNjM2MF9QTVVfQ0hHX0NUUkwxMCAqLwo+ICsjZGVmaW5lIE1UNjM2MF9PVEdfT0NfTUFTSyAg ICAgR0VOTUFTSygzLCAwKQo+ICsvKiBNVDYzNjBfUE1VX0RFVklDRV9UWVBFICovCj4gKyNkZWZp bmUgTVQ2MzYwX1VTQkNIR0VOX01BU0sgICBCSVQoNykKPiArLyogTVQ2MzYwX1BNVV9VU0JfU1RB VFVTMSAqLwo+ICsjZGVmaW5lIE1UNjM2MF9VU0JfU1RBVFVTX1NIRlQgKDQpCj4gKyNkZWZpbmUg TVQ2MzYwX1VTQl9TVEFUVVNfTUFTSyBHRU5NQVNLKDYsIDQpCj4gKy8qIE1UNjM2MF9QTVVfQ0hH X1NUQVQgKi8KPiArI2RlZmluZSBNVDYzNjBfQ0hHX1NUQVRfU0hGVCAgICg2KQo+ICsjZGVmaW5l IE1UNjM2MF9DSEdfU1RBVF9NQVNLICAgR0VOTUFTSyg3LCA2KQo+ICsjZGVmaW5lIE1UNjM2MF9W QkFUX0xWTF9NQVNLICAgQklUKDUpCj4gKy8qIE1UNjM2MF9QTVVfQ0hHX0NUUkwxOSAqLwo+ICsj ZGVmaW5lIE1UNjM2MF9WSU5PVlBfU0hGVCAgICAgKDUpCj4gKyNkZWZpbmUgTVQ2MzYwX1ZJTk9W UF9NQVNLICAgICBHRU5NQVNLKDYsIDUpCj4gKy8qIE1UNjM2MF9QTVVfRk9EX1NUQVQgKi8KPiAr I2RlZmluZSBNVDYzNjBfQ0hSREVUX0VYVF9NQVNLIEJJVCg0KQo+ICsKPiArLyogdVYgKi8KPiAr I2RlZmluZSBNVDYzNjBfVk1JVlJfTUlOICAgICAgIDM5MDAwMDAKPiArI2RlZmluZSBNVDYzNjBf Vk1JVlJfTUFYICAgICAgIDEzNDAwMDAwCj4gKyNkZWZpbmUgTVQ2MzYwX1ZNSVZSX1NURVAgICAg ICAxMDAwMDAKPiArLyogdUEgKi8KPiArI2RlZmluZSBNVDYzNjBfSUNIR19NSU4gICAgICAgICAg ICAgICAgMTAwMDAwCj4gKyNkZWZpbmUgTVQ2MzYwX0lDSEdfTUFYICAgICAgICAgICAgICAgIDUw MDAwMDAKPiArI2RlZmluZSBNVDYzNjBfSUNIR19TVEVQICAgICAgIDEwMDAwMAo+ICsvKiB1ViAq Lwo+ICsjZGVmaW5lIE1UNjM2MF9WT1JFR19NSU4gICAgICAgMzkwMDAwMAo+ICsjZGVmaW5lIE1U NjM2MF9WT1JFR19NQVggICAgICAgNDcxMDAwMAo+ICsjZGVmaW5lIE1UNjM2MF9WT1JFR19TVEVQ ICAgICAgMTAwMDAKPiArLyogdUEgKi8KPiArI2RlZmluZSBNVDYzNjBfQUlDUl9NSU4gICAgICAg ICAgICAgICAgMTAwMDAwCj4gKyNkZWZpbmUgTVQ2MzYwX0FJQ1JfTUFYICAgICAgICAgICAgICAg IDMyNTAwMDAKPiArI2RlZmluZSBNVDYzNjBfQUlDUl9TVEVQICAgICAgIDUwMDAwCj4gKy8qIHVB ICovCj4gKyNkZWZpbmUgTVQ2MzYwX0lQUkVDX01JTiAgICAgICAxMDAwMDAKPiArI2RlZmluZSBN VDYzNjBfSVBSRUNfTUFYICAgICAgIDg1MDAwMAo+ICsjZGVmaW5lIE1UNjM2MF9JUFJFQ19TVEVQ ICAgICAgNTAwMDAKPiArLyogdUEgKi8KPiArI2RlZmluZSBNVDYzNjBfSUVPQ19NSU4gICAgICAg ICAgICAgICAgMTAwMDAwCj4gKyNkZWZpbmUgTVQ2MzYwX0lFT0NfTUFYICAgICAgICAgICAgICAg IDg1MDAwMAo+ICsjZGVmaW5lIE1UNjM2MF9JRU9DX1NURVAgICAgICAgNTAwMDAKPiArCj4gK3N0 cnVjdCBtdDYzNjBfY2hnX2luZm8gewo+ICsgICAgICAgc3RydWN0IGRldmljZSAqZGV2Owo+ICsg ICAgICAgc3RydWN0IHJlZ21hcCAqcmVnbWFwOwo+ICsgICAgICAgc3RydWN0IHBvd2VyX3N1cHBs eV9kZXNjIHBzeV9kZXNjOwo+ICsgICAgICAgc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5Owo+ICsg ICAgICAgc3RydWN0IHJlZ3VsYXRvcl9kZXYgKm90Z19yZGV2Owo+ICsgICAgICAgc3RydWN0IG11 dGV4IGNoZ2RldF9sb2NrOwo+ICsgICAgICAgdTMyIHZpbm92cDsKPiArICAgICAgIGJvb2wgcHdy X3JkeTsKPiArICAgICAgIGJvb2wgYmMxMl9lbjsKPiArICAgICAgIGludCBwc3lfdXNiX3R5cGU7 Cj4gKyAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2hyZGV0X3dvcms7Cj4gK307Cj4gKwo+ICtl bnVtIG10NjM2MF9paW5sbXRzZWwgewo+ICsgICAgICAgTVQ2MzYwX0lJTkxNVFNFTF9BSUNSXzMy NTAgPSAwLAo+ICsgICAgICAgTVQ2MzYwX0lJTkxNVFNFTF9DSEdfVFlQRSwKPiArICAgICAgIE1U NjM2MF9JSU5MTVRTRUxfQUlDUiwKPiArICAgICAgIE1UNjM2MF9JSU5MTVRTRUxfTE9XRVJfTEVW RUwsCj4gK307Cj4gKwo+ICtlbnVtIG10NjM2MF9wbXVfY2hnX3R5cGUgewo+ICsgICAgICAgTVQ2 MzYwX0NIR19UWVBFX05PVkJVUyA9IDAsCj4gKyAgICAgICBNVDYzNjBfQ0hHX1RZUEVfVU5ERVJf R09JTkcsCj4gKyAgICAgICBNVDYzNjBfQ0hHX1RZUEVfU0RQLAo+ICsgICAgICAgTVQ2MzYwX0NI R19UWVBFX1NEUE5TVEQsCj4gKyAgICAgICBNVDYzNjBfQ0hHX1RZUEVfRENQLAo+ICsgICAgICAg TVQ2MzYwX0NIR19UWVBFX0NEUCwKPiArICAgICAgIE1UNjM2MF9DSEdfVFlQRV9ESVNBQkxFX0JD MTIsCj4gKyAgICAgICBNVDYzNjBfQ0hHX1RZUEVfTUFYLAo+ICt9Owo+ICsKPiArc3RhdGljIGVu dW0gcG93ZXJfc3VwcGx5X3VzYl90eXBlIG10NjM2MF9jaGFyZ2VyX3VzYl90eXBlc1tdID0gewo+ ICsgICAgICAgUE9XRVJfU1VQUExZX1VTQl9UWVBFX1VOS05PV04sCj4gKyAgICAgICBQT1dFUl9T VVBQTFlfVVNCX1RZUEVfU0RQLAo+ICsgICAgICAgUE9XRVJfU1VQUExZX1VTQl9UWVBFX0RDUCwK PiArICAgICAgIFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9DRFAsCj4gK307Cj4gKwo+ICtzdGF0aWMg dW5zaWduZWQgaW50IG10NjM2MF9tYXBfcmVnX3NlbCh1MzIgZGF0YSwgdTMyIG1pbiwgdTMyIG1h eCwgdTMyIHN0ZXApCj4gK3sKPiArICAgICAgIHUzMiB0YXJnZXQgPSAwLCBtYXhfc2VsOwo+ICsK PiArICAgICAgIGlmIChkYXRhID49IG1pbikgewo+ICsgICAgICAgICAgICAgICB0YXJnZXQgPSAo ZGF0YSAtIG1pbikgLyBzdGVwOwo+ICsgICAgICAgICAgICAgICBtYXhfc2VsID0gKG1heCAtIG1p bikgLyBzdGVwOwo+ICsgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID4gbWF4X3NlbCkKPiArICAg ICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBtYXhfc2VsOwo+ICsgICAgICAgfQo+ICsgICAg ICAgcmV0dXJuIHRhcmdldDsKPiArfQo+ICsKPiArc3RhdGljIHUzMiBtdDYzNjBfbWFwX3JlYWxf dmFsKHUzMiBzZWwsIHUzMiBtaW4sIHUzMiBtYXgsIHUzMiBzdGVwKQo+ICt7Cj4gKyAgICAgICB1 MzIgdGFyZ2V0ID0gMDsKPiArCj4gKyAgICAgICB0YXJnZXQgPSBtaW4gKyAoc2VsICogc3RlcCk7 Cj4gKyAgICAgICBpZiAodGFyZ2V0ID4gbWF4KQo+ICsgICAgICAgICAgICAgICB0YXJnZXQgPSBt YXg7Cj4gKyAgICAgICByZXR1cm4gdGFyZ2V0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2 MF9nZXRfY2hyZGV0X2V4dF9zdGF0KHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpwd3JfcmR5KQo+ ICt7Cj4gKyAgICAgICBpbnQgcmV0Owo+ICsgICAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiAr Cj4gKyAgICAgICByZXQgPSByZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9GT0Rf U1RBVCwgJnJlZ3ZhbCk7Cj4gKyAgICAgICBpZiAocmV0IDwgMCkKPiArICAgICAgICAgICAgICAg cmV0dXJuIHJldDsKPiArICAgICAgICpwd3JfcmR5ID0gKHJlZ3ZhbCAmIE1UNjM2MF9DSFJERVRf RVhUX01BU0spID8gdHJ1ZSA6IGZhbHNlOwo+ICsgICAgICAgcmV0dXJuIDA7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X29ubGluZShzdHJ1Y3QgbXQ2MzYwX2NoZ19p bmZvICptY2ksCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIHBv d2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCj4gK3sKPiArICAgICAgIGludCByZXQ7Cj4gKyAgICAg ICBib29sIHB3cl9yZHk7Cj4gKwo+ICsgICAgICAgcmV0ID0gbXQ2MzYwX2dldF9jaHJkZXRfZXh0 X3N0YXQobWNpLCAmcHdyX3JkeSk7Cj4gKyAgICAgICBpZiAocmV0IDwgMCkKPiArICAgICAgICAg ICAgICAgcmV0dXJuIHJldDsKPiArICAgICAgIHZhbC0+aW50dmFsID0gcHdyX3JkeSA/IHRydWUg OiBmYWxzZTsKPiArICAgICAgIHJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2 MF9jaGFyZ2VyX2dldF9zdGF0dXMoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZh bCAqdmFsKQo+ICt7Cj4gKyAgICAgICBpbnQgc3RhdHVzLCByZXQ7Cj4gKyAgICAgICB1bnNpZ25l ZCBpbnQgcmVndmFsOwo+ICsgICAgICAgYm9vbCBwd3JfcmR5Owo+ICsKPiArICAgICAgIHJldCA9 IG10NjM2MF9nZXRfY2hyZGV0X2V4dF9zdGF0KG1jaSwgJnB3cl9yZHkpOwo+ICsgICAgICAgaWYg KHJldCA8IDApCj4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gKyAgICAgICBpZiAoIXB3 cl9yZHkpIHsKPiArICAgICAgICAgICAgICAgc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19E SVNDSEFSR0lORzsKPiArICAgICAgICAgICAgICAgZ290byBvdXQ7Cj4gKyAgICAgICB9Cj4gKwo+ ICsgICAgICAgcmV0ID0gcmVnbWFwX3JlYWQobWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX1NU QVQsICZyZWd2YWwpOwo+ICsgICAgICAgaWYgKHJldCA8IDApCj4gKyAgICAgICAgICAgICAgIHJl dHVybiByZXQ7Cj4gKyAgICAgICByZWd2YWwgJj0gTVQ2MzYwX0NIR19TVEFUX01BU0s7Cj4gKyAg ICAgICByZWd2YWwgPj49IE1UNjM2MF9DSEdfU1RBVF9TSEZUOwo+ICsgICAgICAgc3dpdGNoIChy ZWd2YWwpIHsKPiArICAgICAgIGNhc2UgMHgwOgo+ICsgICAgICAgICAgICAgICBzdGF0dXMgPSBQ T1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKPiArICAgICAgICAgICAgICAgYnJlYWs7 Cj4gKyAgICAgICBjYXNlIDB4MToKPiArICAgICAgICAgICAgICAgc3RhdHVzID0gUE9XRVJfU1VQ UExZX1NUQVRVU19DSEFSR0lORzsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBj YXNlIDB4MjoKPiArICAgICAgICAgICAgICAgc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19G VUxMOwo+ICsgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIGRlZmF1bHQ6Cj4gKyAgICAg ICAgICAgICAgIHJldCA9IC1FSU87Cj4gKyAgICAgICB9Cj4gK291dDoKPiArICAgICAgIGlmICgh cmV0KQo+ICsgICAgICAgICAgICAgICB2YWwtPmludHZhbCA9IHN0YXR1czsKPiArICAgICAgIHJl dHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X2NoYXJn ZV90eXBlKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ ICt7Cj4gKyAgICAgICBpbnQgdHlwZSwgcmV0Owo+ICsgICAgICAgdW5zaWduZWQgaW50IHJlZ3Zh bDsKPiArICAgICAgIHU4IGNoZ19zdGF0Owo+ICsKPiArICAgICAgIHJldCA9IHJlZ21hcF9yZWFk KG1jaS0+cmVnbWFwLCBNVDYzNjBfUE1VX0NIR19TVEFULCAmcmVndmFsKTsKPiArICAgICAgIGlm IChyZXQgPCAwKQo+ICsgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ICsKPiArICAgICAgIGNo Z19zdGF0ID0gKHJlZ3ZhbCAmIE1UNjM2MF9DSEdfU1RBVF9NQVNLKSA+PiBNVDYzNjBfQ0hHX1NU QVRfU0hGVDsKPiArICAgICAgIHN3aXRjaCAoY2hnX3N0YXQpIHsKPiArICAgICAgIGNhc2UgMHgw MTogLyogQ2hhcmdlIGluIFByb2dyZXNzICovCj4gKyAgICAgICAgICAgICAgIGlmIChyZWd2YWwg JiBNVDYzNjBfVkJBVF9MVkxfTUFTSykKPiArICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0g UE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX0ZBU1Q7Cj4gKyAgICAgICAgICAgICAgIGVsc2UKPiAr ICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX1RS SUNLTEU7Cj4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgY2FzZSAweDAwOiAvKiBO b3QgQ2hhcmdpbmcgKi8KPiArICAgICAgIGNhc2UgMHgwMjogLyogQ2hhcmdlIERvbmUgKi8KPiAr ICAgICAgIGNhc2UgMHgwMzogLyogQ2hhcmdlIEZhdWx0ICovCj4gKyAgICAgICBkZWZhdWx0Ogo+ ICsgICAgICAgICAgICAgICB0eXBlID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX05PTkU7Cj4g KyAgICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIHZhbC0+aW50 dmFsID0gdHlwZTsKPiArICAgICAgIHJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10 NjM2MF9jaGFyZ2VyX2dldF9pY2hnKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFs ICp2YWwpCj4gK3sKPiArICAgICAgIGludCByZXQ7Cj4gKyAgICAgICB1bnNpZ25lZCBpbnQgcmVn dmFsOwo+ICsKPiArICAgICAgIHJldCA9IHJlZ21hcF9yZWFkKG1jaS0+cmVnbWFwLCBNVDYzNjBf UE1VX0NIR19DVFJMNywgJnJlZ3ZhbCk7Cj4gKyAgICAgICBpZiAocmV0IDwgMCkKPiArICAgICAg ICAgICAgICAgcmV0dXJuIHJldDsKPiArICAgICAgIHJlZ3ZhbCA9IChyZWd2YWwgJiBNVDYzNjBf SUNIR19NQVNLKSA+PiBNVDYzNjBfSUNIR19TSEZUOwo+ICsgICAgICAgdmFsLT5pbnR2YWwgPSBt dDYzNjBfbWFwX3JlYWxfdmFsKHJlZ3ZhbCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBNVDYzNjBfSUNIR19NSU4sCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lDSEdfTUFYLAo+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JQ0hHX1NURVApOwo+ICsgICAgICAgcmV0dXJu IDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X21heF9pY2hnKHN0 cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ICt7Cj4gKyAgICAg ICB2YWwtPmludHZhbCA9IE1UNjM2MF9JQ0hHX01BWDsKPiArICAgICAgIHJldHVybiAwOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX2dldF9jdihzdHJ1Y3QgbXQ2MzYwX2No Z19pbmZvICptY2ksCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gcG93 ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKPiArewo+ICsgICAgICAgaW50IHJldDsKPiArICAgICAg IHVuc2lnbmVkIGludCByZWd2YWw7Cj4gKwo+ICsgICAgICAgcmV0ID0gcmVnbWFwX3JlYWQobWNp LT5yZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX0NUUkw0LCAmcmVndmFsKTsKPiArICAgICAgIGlmIChy ZXQgPCAwKQo+ICsgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ICsgICAgICAgcmVndmFsID0g KHJlZ3ZhbCAmIE1UNjM2MF9WT1JFR19NQVNLKSA+PiBNVDYzNjBfVk9SRUdfU0hGVDsKPiArICAg ICAgIHZhbC0+aW50dmFsID0gbXQ2MzYwX21hcF9yZWFsX3ZhbChyZWd2YWwsCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1ZPUkVHX01JTiwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfVk9SRUdfTUFYLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9WT1JFR19T VEVQKTsKPiArICAgICAgIHJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9j aGFyZ2VyX2dldF9tYXhfY3Yoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAq dmFsKQo+ICt7Cj4gKyAgICAgICB2YWwtPmludHZhbCA9IE1UNjM2MF9WT1JFR19NQVg7Cj4gKyAg ICAgICByZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9nZXRf YWljcihzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ksCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ICt7Cj4gKyAg ICAgICBpbnQgcmV0Owo+ICsgICAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiArCj4gKyAgICAg ICByZXQgPSByZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdfQ1RSTDMsICZy ZWd2YWwpOwo+ICsgICAgICAgaWYgKHJldCA8IDApCj4gKyAgICAgICAgICAgICAgIHJldHVybiBy ZXQ7Cj4gKyAgICAgICByZWd2YWwgPSAocmVndmFsICYgTVQ2MzYwX0lBSUNSX01BU0spID4+IE1U NjM2MF9JQUlDUl9TSEZUOwo+ICsgICAgICAgdmFsLT5pbnR2YWwgPSBtdDYzNjBfbWFwX3JlYWxf dmFsKHJlZ3ZhbCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBN VDYzNjBfQUlDUl9NSU4sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgTVQ2MzYwX0FJQ1JfTUFYLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIE1UNjM2MF9BSUNSX1NURVApOwo+ICsgICAgICAgcmV0dXJuIDA7Cj4gK30KPiArCj4g K3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfZ2V0X21pdnIoc3RydWN0IG10NjM2MF9jaGdfaW5m byAqbWNpLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gcG93ZXJf c3VwcGx5X3Byb3B2YWwgKnZhbCkKPiArewo+ICsgICAgICAgaW50IHJldDsKPiArICAgICAgIHVu c2lnbmVkIGludCByZWd2YWw7Cj4gKwo+ICsgICAgICAgcmV0ID0gcmVnbWFwX3JlYWQobWNpLT5y ZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX0NUUkw2LCAmcmVndmFsKTsKPiArICAgICAgIGlmIChyZXQg PCAwKQo+ICsgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ICsgICAgICAgcmVndmFsID0gKHJl Z3ZhbCAmIE1UNjM2MF9WTUlWUl9NQVNLKSA+PiBNVDYzNjBfVk1JVlJfU0hGVDsKPiArICAgICAg IHZhbC0+aW50dmFsID0gbXQ2MzYwX21hcF9yZWFsX3ZhbChyZWd2YWwsCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1ZNSVZSX01JTiwKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfVk1JVlJfTUFYLAo+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9WTUlWUl9TVEVQ KTsKPiArICAgICAgIHJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFy Z2VyX2dldF9pcHJlY2hnKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2 YWwpCj4gK3sKPiArICAgICAgIGludCByZXQ7Cj4gKyAgICAgICB1bnNpZ25lZCBpbnQgcmVndmFs Owo+ICsKPiArICAgICAgIHJldCA9IHJlZ21hcF9yZWFkKG1jaS0+cmVnbWFwLCBNVDYzNjBfUE1V X0NIR19DVFJMOCwgJnJlZ3ZhbCk7Cj4gKyAgICAgICBpZiAocmV0IDwgMCkKPiArICAgICAgICAg ICAgICAgcmV0dXJuIHJldDsKPiArICAgICAgIHJlZ3ZhbCA9IChyZWd2YWwgJiBNVDYzNjBfSVBS RUNfTUFTSykgPj4gTVQ2MzYwX0lQUkVDX1NIRlQ7Cj4gKyAgICAgICB2YWwtPmludHZhbCA9IG10 NjM2MF9tYXBfcmVhbF92YWwocmVndmFsLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIE1UNjM2MF9JUFJFQ19NSU4sCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lQUkVDX01BWCwKPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSVBSRUNfU1RFUCk7Cj4gKyAgICAgICByZXR1 cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9nZXRfaWVvYyhzdHJ1 Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ksCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ICt7Cj4gKyAgICAgICBpbnQg cmV0Owo+ICsgICAgICAgdW5zaWduZWQgaW50IHJlZ3ZhbDsKPiArCj4gKyAgICAgICByZXQgPSBy ZWdtYXBfcmVhZChtY2ktPnJlZ21hcCwgTVQ2MzYwX1BNVV9DSEdfQ1RSTDksICZyZWd2YWwpOwo+ ICsgICAgICAgaWYgKHJldCA8IDApCj4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gKyAg ICAgICByZWd2YWwgPSAocmVndmFsICYgTVQ2MzYwX0lFT0NfTUFTSykgPj4gTVQ2MzYwX0lFT0Nf U0hGVDsKPiArICAgICAgIHZhbC0+aW50dmFsID0gbXQ2MzYwX21hcF9yZWFsX3ZhbChyZWd2YWws Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lFT0Nf TUlOLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9J RU9DX01BWCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYz NjBfSUVPQ19TVEVQKTsKPiArICAgICAgIHJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IG10NjM2MF9jaGFyZ2VyX3NldF9vbmxpbmUoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiBwb3dlcl9z dXBwbHlfcHJvcHZhbCAqdmFsKQo+ICt7Cj4gKyAgICAgICB1OCBmb3JjZV9zbGVlcCA9IHZhbC0+ aW50dmFsID8gMCA6IDE7Cj4gKwo+ICsgICAgICAgcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyht Y2ktPnJlZ21hcCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1BN VV9DSEdfQ1RSTDEsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9G U0xQX01BU0ssCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlX3NsZWVw IDw8IE1UNjM2MF9GU0xQX1NIRlQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFy Z2VyX3NldF9pY2hnKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2 YWwpCj4gK3sKPiArICAgICAgIHU4IHNlbDsKPiArCj4gKyAgICAgICBzZWwgPSBtdDYzNjBfbWFw X3JlZ19zZWwodmFsLT5pbnR2YWwsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg TVQ2MzYwX0lDSEdfTUlOLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2 MF9JQ0hHX01BWCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSUNI R19TVEVQKTsKPiArICAgICAgIHJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMobWNpLT5yZWdtYXAs Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9QTVVfQ0hHX0NUUkw3 LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSUNIR19NQVNLLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWwgPDwgTVQ2MzYwX0lDSEdfU0hG VCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfc2V0X2N2KHN0cnVjdCBt dDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj b25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ICt7Cj4gKyAgICAgICB1OCBz ZWw7Cj4gKwo+ICsgICAgICAgc2VsID0gbXQ2MzYwX21hcF9yZWdfc2VsKHZhbC0+aW50dmFsLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9WT1JFR19NSU4sCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1ZPUkVHX01BWCwKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfVk9SRUdfU1RFUCk7Cj4gKyAgICAgICBy ZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLAo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBNVDYzNjBfUE1VX0NIR19DVFJMNCwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgTVQ2MzYwX1ZPUkVHX01BU0ssCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHNlbCA8PCBNVDYzNjBfVk9SRUdfU0hGVCk7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfc2V0X2FpY3Ioc3RydWN0IG10NjM2MF9jaGdfaW5mbyAq bWNpLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pb24gcG93 ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKPiArewo+ICsgICAgICAgdTggc2VsOwo+ICsKPiArICAg ICAgIHNlbCA9IG10NjM2MF9tYXBfcmVnX3NlbCh2YWwtPmludHZhbCwKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBNVDYzNjBfQUlDUl9NSU4sCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgTVQ2MzYwX0FJQ1JfTUFYLAo+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIE1UNjM2MF9BSUNSX1NURVApOwo+ICsgICAgICAgcmV0dXJuIHJlZ21hcF91cGRh dGVfYml0cyhtY2ktPnJlZ21hcCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg TVQ2MzYwX1BNVV9DSEdfQ1RSTDMsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IE1UNjM2MF9JQUlDUl9NQVNLLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz ZWwgPDwgTVQ2MzYwX0lBSUNSX1NIRlQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9j aGFyZ2VyX3NldF9taXZyKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFs ICp2YWwpCj4gK3sKPiArICAgICAgIHU4IHNlbDsKPiArCj4gKyAgICAgICBzZWwgPSBtdDYzNjBf bWFwX3JlZ19zZWwodmFsLT5pbnR2YWwsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgTVQ2MzYwX1ZNSVZSX01JTiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBN VDYzNjBfVk1JVlJfTUFYLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2 MF9WTUlWUl9TVEVQKTsKPiArICAgICAgIHJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMobWNpLT5y ZWdtYXAsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9QTVVfQ0hH X0NUUkwzLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfVk1JVlJf TUFTSywKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsIDw8IE1UNjM2MF9W TUlWUl9TSEZUKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9zZXRfaXBy ZWNoZyhzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2ksCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ ICt7Cj4gKyAgICAgICB1OCBzZWw7Cj4gKwo+ICsgICAgICAgc2VsID0gbXQ2MzYwX21hcF9yZWdf c2VsKHZhbC0+aW50dmFsLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2 MF9JUFJFQ19NSU4sCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lQ UkVDX01BWCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSVBSRUNf U1RFUCk7Cj4gKyAgICAgICByZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfUE1VX0NIR19DVFJMOCwK PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lQUkVDX01BU0ssCj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbCA8PCBNVDYzNjBfSVBSRUNfU0hG VCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfc2V0X2llb2Moc3RydWN0 IG10NjM2MF9jaGdfaW5mbyAqbWNpLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKPiArewo+ICsgICAgICAg dTggc2VsOwo+ICsKPiArICAgICAgIHNlbCA9IG10NjM2MF9tYXBfcmVnX3NlbCh2YWwtPmludHZh bCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSUVPQ19NSU4sCj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lFT0NfTUFYLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JRU9DX1NURVApOwo+ICsgICAgICAg cmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21hcCwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgTVQ2MzYwX1BNVV9DSEdfQ1RSTDksCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JRU9DX01BU0ssCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHNlbCA8PCBNVDYzNjBfSUVPQ19TSEZUKTsKPiArfQo+ICsKPiArc3Rh dGljIGludCBtdDYzNjBfY2hhcmdlcl9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAq cHN5LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gcG93ZXJf c3VwcGx5X3Byb3BlcnR5IHBzcCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQo+ICt7Cj4gKyAgICAgICBzdHJ1 Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsK PiArICAgICAgIGludCByZXQgPSAwOwo+ICsKPiArICAgICAgIHN3aXRjaCAocHNwKSB7Cj4gKyAg ICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKPiArICAgICAgICAgICAgICAgcmV0 ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X29ubGluZShtY2ksIHZhbCk7Cj4gKyAgICAgICAgICAgICAg IGJyZWFrOwo+ICsgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6Cj4gKyAgICAg ICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9zdGF0dXMobWNpLCB2YWwpOwo+ICsg ICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hB UkdFX1RZUEU6Cj4gKyAgICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9jaGFy Z2VfdHlwZShtY2ksIHZhbCk7Cj4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgY2Fz ZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVDoKPiArICAgICAgICAg ICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X2ljaGcobWNpLCB2YWwpOwo+ICsgICAgICAg ICAgICAgICBicmVhazsKPiArICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRf Q0hBUkdFX0NVUlJFTlRfTUFYOgo+ICsgICAgICAgICAgICAgICByZXQgPSBtdDYzNjBfY2hhcmdl cl9nZXRfbWF4X2ljaGcobWNpLCB2YWwpOwo+ICsgICAgICAgICAgICAgICBicmVhazsKPiArICAg ICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0U6Cj4gKyAg ICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9jdihtY2ksIHZhbCk7Cj4gKyAg ICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05T VEFOVF9DSEFSR0VfVk9MVEFHRV9NQVg6Cj4gKyAgICAgICAgICAgICAgIHJldCA9IG10NjM2MF9j aGFyZ2VyX2dldF9tYXhfY3YobWNpLCB2YWwpOwo+ICsgICAgICAgICAgICAgICBicmVhazsKPiAr ICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfSU5QVVRfQ1VSUkVOVF9MSU1JVDoKPiArICAg ICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfZ2V0X2FpY3IobWNpLCB2YWwpOwo+ICsg ICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfSU5Q VVRfVk9MVEFHRV9MSU1JVDoKPiArICAgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJf Z2V0X21pdnIobWNpLCB2YWwpOwo+ICsgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIGNh c2UgUE9XRVJfU1VQUExZX1BST1BfUFJFQ0hBUkdFX0NVUlJFTlQ6Cj4gKyAgICAgICAgICAgICAg IHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9pcHJlY2hnKG1jaSwgdmFsKTsKPiArICAgICAgICAg ICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9URVJN X0NVUlJFTlQ6Cj4gKyAgICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX2dldF9pZW9j KG1jaSwgdmFsKTsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIFBPV0VS X1NVUFBMWV9QUk9QX1VTQl9UWVBFOgo+ICsgICAgICAgICAgICAgICB2YWwtPmludHZhbCA9IG1j aS0+cHN5X3VzYl90eXBlOwo+ICsgICAgICAgICAgICAgICBicmVhazsKPiArICAgICAgIGRlZmF1 bHQ6Cj4gKyAgICAgICAgICAgICAgIHJldCA9IC1FTk9EQVRBOwo+ICsgICAgICAgfQo+ICsgICAg ICAgcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludCBtdDYzNjBfY2hhcmdlcl9zZXRf cHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAo+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiBwb3dlcl9zdXBw bHlfcHJvcHZhbCAqdmFsKQo+ICt7Cj4gKyAgICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICpt Y2kgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKPiArICAgICAgIGludCByZXQ7Cj4g Kwo+ICsgICAgICAgc3dpdGNoIChwc3ApIHsKPiArICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BS T1BfT05MSU5FOgo+ICsgICAgICAgICAgICAgICByZXQgPSBtdDYzNjBfY2hhcmdlcl9zZXRfb25s aW5lKG1jaSwgdmFsKTsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIFBP V0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UOgo+ICsgICAgICAgICAgICAg ICByZXQgPSBtdDYzNjBfY2hhcmdlcl9zZXRfaWNoZyhtY2ksIHZhbCk7Cj4gKyAgICAgICAgICAg ICAgIGJyZWFrOwo+ICsgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFS R0VfVk9MVEFHRToKPiArICAgICAgICAgICAgICAgcmV0ID0gbXQ2MzYwX2NoYXJnZXJfc2V0X2N2 KG1jaSwgdmFsKTsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIFBPV0VS X1NVUFBMWV9QUk9QX0lOUFVUX0NVUlJFTlRfTElNSVQ6Cj4gKyAgICAgICAgICAgICAgIHJldCA9 IG10NjM2MF9jaGFyZ2VyX3NldF9haWNyKG1jaSwgdmFsKTsKPiArICAgICAgICAgICAgICAgYnJl YWs7Cj4gKyAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0lOUFVUX1ZPTFRBR0VfTElNSVQ6 Cj4gKyAgICAgICAgICAgICAgIHJldCA9IG10NjM2MF9jaGFyZ2VyX3NldF9taXZyKG1jaSwgdmFs KTsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9Q Uk9QX1BSRUNIQVJHRV9DVVJSRU5UOgo+ICsgICAgICAgICAgICAgICByZXQgPSBtdDYzNjBfY2hh cmdlcl9zZXRfaXByZWNoZyhtY2ksIHZhbCk7Cj4gKyAgICAgICAgICAgICAgIGJyZWFrOwo+ICsg ICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVEVSTV9DVVJSRU5UOgo+ICsgICAg ICAgICAgICAgICByZXQgPSBtdDYzNjBfY2hhcmdlcl9zZXRfaWVvYyhtY2ksIHZhbCk7Cj4gKyAg ICAgICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgZGVmYXVsdDoKPiArICAgICAgICAgICAgICAg cmV0ID0gLUVJTlZBTDsKPiArICAgICAgIH0KPiArICAgICAgIHJldHVybiByZXQ7Cj4gK30KPiAr Cj4gK3N0YXRpYyBpbnQgbXQ2MzYwX2NoYXJnZXJfcHJvcGVydHlfaXNfd3JpdGVhYmxlKHN0cnVj dCBwb3dlcl9zdXBwbHkgKnBzeSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCkKPiArewo+ICsgICAg ICAgc3dpdGNoIChwc3ApIHsKPiArICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5F Ogo+ICsgICAgICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVO VDoKPiArICAgICAgIGNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRB R0U6Cj4gKyAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0lOUFVUX0NVUlJFTlRfTElNSVQ6 Cj4gKyAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0lOUFVUX1ZPTFRBR0VfTElNSVQ6Cj4g KyAgICAgICBjYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRUNIQVJHRV9DVVJSRU5UOgo+ICsgICAg ICAgY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVEVSTV9DVVJSRU5UOgo+ICsgICAgICAg ICAgICAgICByZXR1cm4gMTsKPiArICAgICAgIGRlZmF1bHQ6Cj4gKyAgICAgICAgICAgICAgIHJl dHVybiAwOwo+ICsgICAgICAgfQo+ICt9Cj4gKwo+ICtzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlf cHJvcGVydHkgbXQ2MzYwX2NoYXJnZXJfcHJvcGVydGllc1tdID0gewo+ICsgICAgICAgUE9XRVJf U1VQUExZX1BST1BfT05MSU5FLAo+ICsgICAgICAgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAo+ ICsgICAgICAgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RZUEUsCj4gKyAgICAgICBQT1dFUl9T VVBQTFlfUFJPUF9DT05TVEFOVF9DSEFSR0VfQ1VSUkVOVCwKPiArICAgICAgIFBPV0VSX1NVUFBM WV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9DVVJSRU5UX01BWCwKPiArICAgICAgIFBPV0VSX1NVUFBM WV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFLAo+ICsgICAgICAgUE9XRVJfU1VQUExZX1BS T1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0VfTUFYLAo+ICsgICAgICAgUE9XRVJfU1VQUExZX1BS T1BfSU5QVVRfQ1VSUkVOVF9MSU1JVCwKPiArICAgICAgIFBPV0VSX1NVUFBMWV9QUk9QX0lOUFVU X1ZPTFRBR0VfTElNSVQsCj4gKyAgICAgICBQT1dFUl9TVVBQTFlfUFJPUF9QUkVDSEFSR0VfQ1VS UkVOVCwKPiArICAgICAgIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9URVJNX0NVUlJFTlQsCj4g KyAgICAgICBQT1dFUl9TVVBQTFlfUFJPUF9VU0JfVFlQRSwKPiArfTsKPiArCj4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbXQ2MzYwX2NoYXJnZXJfZGVzYyA9IHsKPiAr ICAgICAgIC50eXBlICAgICAgICAgICAgICAgICAgID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCLAo+ ICsgICAgICAgLnByb3BlcnRpZXMgICAgICAgICAgICAgPSBtdDYzNjBfY2hhcmdlcl9wcm9wZXJ0 aWVzLAo+ICsgICAgICAgLm51bV9wcm9wZXJ0aWVzICAgICAgICAgPSBBUlJBWV9TSVpFKG10NjM2 MF9jaGFyZ2VyX3Byb3BlcnRpZXMpLAo+ICsgICAgICAgLmdldF9wcm9wZXJ0eSAgICAgICAgICAg PSBtdDYzNjBfY2hhcmdlcl9nZXRfcHJvcGVydHksCj4gKyAgICAgICAuc2V0X3Byb3BlcnR5ICAg ICAgICAgICA9IG10NjM2MF9jaGFyZ2VyX3NldF9wcm9wZXJ0eSwKPiArICAgICAgIC5wcm9wZXJ0 eV9pc193cml0ZWFibGUgID0gbXQ2MzYwX2NoYXJnZXJfcHJvcGVydHlfaXNfd3JpdGVhYmxlLAo+ ICsgICAgICAgLnVzYl90eXBlcyAgICAgICAgICAgICAgPSBtdDYzNjBfY2hhcmdlcl91c2JfdHlw ZXMsCj4gKyAgICAgICAubnVtX3VzYl90eXBlcyAgICAgICAgICA9IEFSUkFZX1NJWkUobXQ2MzYw X2NoYXJnZXJfdXNiX3R5cGVzKSwKPiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVn dWxhdG9yX29wcyBtdDYzNjBfY2hnX290Z19vcHMgPSB7Cj4gKyAgICAgICAubGlzdF92b2x0YWdl ID0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXIsCj4gKyAgICAgICAuZW5hYmxlID0gcmVn dWxhdG9yX2VuYWJsZV9yZWdtYXAsCj4gKyAgICAgICAuZGlzYWJsZSA9IHJlZ3VsYXRvcl9kaXNh YmxlX3JlZ21hcCwKPiArICAgICAgIC5pc19lbmFibGVkID0gcmVndWxhdG9yX2lzX2VuYWJsZWRf cmVnbWFwLAo+ICsgICAgICAgLnNldF92b2x0YWdlX3NlbCA9IHJlZ3VsYXRvcl9zZXRfdm9sdGFn ZV9zZWxfcmVnbWFwLAo+ICsgICAgICAgLmdldF92b2x0YWdlX3NlbCA9IHJlZ3VsYXRvcl9nZXRf dm9sdGFnZV9zZWxfcmVnbWFwLAo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1 bGF0b3JfZGVzYyBtdDYzNjBfb3RnX3JkZXNjID0gewo+ICsgICAgICAgLm9mX21hdGNoID0gInVz Yi1vdGctdmJ1cyIsCj4gKyAgICAgICAubmFtZSA9ICJ1c2Itb3RnLXZidXMiLAo+ICsgICAgICAg Lm9wcyA9ICZtdDYzNjBfY2hnX290Z19vcHMsCj4gKyAgICAgICAub3duZXIgPSBUSElTX01PRFVM RSwKPiArICAgICAgIC50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsCj4gKyAgICAgICAubWluX3VW ID0gNDQyNTAwMCwKPiArICAgICAgIC51Vl9zdGVwID0gMjUwMDAsCj4gKyAgICAgICAubl92b2x0 YWdlcyA9IDU3LAo+ICsgICAgICAgLnZzZWxfcmVnID0gTVQ2MzYwX1BNVV9DSEdfQ1RSTDUsCj4g KyAgICAgICAudnNlbF9tYXNrID0gTVQ2MzYwX1ZPQlNUX01BU0ssCj4gKyAgICAgICAuZW5hYmxl X3JlZyA9IE1UNjM2MF9QTVVfQ0hHX0NUUkwxLAo+ICsgICAgICAgLmVuYWJsZV9tYXNrID0gTVQ2 MzYwX09QQV9NT0RFX01BU0ssCj4gK307Cj4gKwo+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbXQ2MzYw X3BtdV9hdHRhY2hfaV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCj4gK3sKPiArICAgICAg IHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSA9IGRhdGE7Cj4gKyAgICAgICBpbnQgcmV0Owo+ ICsgICAgICAgdW5zaWduZWQgaW50IHVzYl9zdGF0dXM7Cj4gKyAgICAgICBpbnQgbGFzdF91c2Jf dHlwZTsKPiArCj4gKyAgICAgICBtdXRleF9sb2NrKCZtY2ktPmNoZ2RldF9sb2NrKTsKPiArICAg ICAgIGlmICghbWNpLT5iYzEyX2VuKSB7Cj4gKyAgICAgICAgICAgICAgIGRldl93YXJuKG1jaS0+ ZGV2LCAiUmVjZWl2ZWQgYXR0YWNoIGludGVycnVwdCwgYmMxMiBkaXNhYmxlZCwgaWdub3JlIGly cVxuIik7Cj4gKyAgICAgICAgICAgICAgIGdvdG8gb3V0Owo+ICsgICAgICAgfQo+ICsgICAgICAg bGFzdF91c2JfdHlwZSA9IG1jaS0+cHN5X3VzYl90eXBlOwo+ICsgICAgICAgLyogUGx1ZyBpbiAq Lwo+ICsgICAgICAgcmV0ID0gcmVnbWFwX3JlYWQobWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfVVNC X1NUQVRVUzEsICZ1c2Jfc3RhdHVzKTsKPiArICAgICAgIGlmIChyZXQgPCAwKQo+ICsgICAgICAg ICAgICAgICBnb3RvIG91dDsKPiArICAgICAgIHVzYl9zdGF0dXMgJj0gTVQ2MzYwX1VTQl9TVEFU VVNfTUFTSzsKPiArICAgICAgIHVzYl9zdGF0dXMgPj49IE1UNjM2MF9VU0JfU1RBVFVTX1NIRlQ7 Cj4gKyAgICAgICBzd2l0Y2ggKHVzYl9zdGF0dXMpIHsKPiArICAgICAgIGNhc2UgTVQ2MzYwX0NI R19UWVBFX05PVkJVUzoKPiArICAgICAgICAgICAgICAgZGV2X2RiZyhtY2ktPmRldiwgIlJlY2Vp dmVkIGF0dGFjaCBpbnRlcnJ1cHQsIG5vIHZidXNcbiIpOwo+ICsgICAgICAgICAgICAgICBnb3Rv IG91dDsKPiArICAgICAgIGNhc2UgTVQ2MzYwX0NIR19UWVBFX1VOREVSX0dPSU5HOgo+ICsgICAg ICAgICAgICAgICBkZXZfZGJnKG1jaS0+ZGV2LCAiUmVjZWl2ZWQgYXR0YWNoIGludGVycnVwdCwg dW5kZXIgZ29pbmcuLi5cbiIpOwo+ICsgICAgICAgICAgICAgICBnb3RvIG91dDsKPiArICAgICAg IGNhc2UgTVQ2MzYwX0NIR19UWVBFX1NEUDoKPiArICAgICAgICAgICAgICAgbWNpLT5wc3lfdXNi X3R5cGUgPSBQT1dFUl9TVVBQTFlfVVNCX1RZUEVfU0RQOwo+ICsgICAgICAgICAgICAgICBicmVh azsKPiArICAgICAgIGNhc2UgTVQ2MzYwX0NIR19UWVBFX1NEUE5TVEQ6Cj4gKyAgICAgICAgICAg ICAgIG1jaS0+cHN5X3VzYl90eXBlID0gUE9XRVJfU1VQUExZX1VTQl9UWVBFX1NEUDsKPiArICAg ICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIE1UNjM2MF9DSEdfVFlQRV9DRFA6Cj4g KyAgICAgICAgICAgICAgIG1jaS0+cHN5X3VzYl90eXBlID0gUE9XRVJfU1VQUExZX1VTQl9UWVBF X0NEUDsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNlIE1UNjM2MF9DSEdf VFlQRV9EQ1A6Cj4gKyAgICAgICAgICAgICAgIG1jaS0+cHN5X3VzYl90eXBlID0gUE9XRVJfU1VQ UExZX1VTQl9UWVBFX0RDUDsKPiArICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICBjYXNl IE1UNjM2MF9DSEdfVFlQRV9ESVNBQkxFX0JDMTI6Cj4gKyAgICAgICAgICAgICAgIGRldl9kYmco bWNpLT5kZXYsICJSZWNlaXZlZCBhdHRhY2ggaW50ZXJydXB0LCBiYzEyIGRldGVjdCBub3QgZW5h YmxlXG4iKTsKPiArICAgICAgICAgICAgICAgZ290byBvdXQ7Cj4gKyAgICAgICBkZWZhdWx0Ogo+ ICsgICAgICAgICAgICAgICBkZXZfZGJnKG1jaS0+ZGV2LCAiUmVjZWl2ZWQgYXR0YWNoIGludGVy cnVwdCwgcmVzZXJ2ZWQgYWRkcmVzc1xuIik7Cj4gKyAgICAgICAgICAgICAgIGdvdG8gb3V0Owo+ ICsgICAgICAgfQo+ICsKPiArICAgICAgIGRldl9kYmcobWNpLT5kZXYsICJSZWNlaXZlZCBhdHRh Y2ggaW50ZXJydXB0LCBjaGdfdHlwZSA9ICVkXG4iLCBtY2ktPnBzeV91c2JfdHlwZSk7Cj4gKyAg ICAgICBpZiAobGFzdF91c2JfdHlwZSAhPSBtY2ktPnBzeV91c2JfdHlwZSkKPiArICAgICAgICAg ICAgICAgcG93ZXJfc3VwcGx5X2NoYW5nZWQobWNpLT5wc3kpOwo+ICtvdXQ6Cj4gKyAgICAgICBt dXRleF91bmxvY2soJm1jaS0+Y2hnZGV0X2xvY2spOwo+ICsgICAgICAgcmV0dXJuIElSUV9IQU5E TEVEOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBtdDYzNjBfaGFuZGxlX2NocmRldF9leHRfZXZ0 KHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSkKPiArewo+ICsgICAgICAgaW50IHJldDsKPiAr ICAgICAgIGJvb2wgcHdyX3JkeTsKPiArCj4gKyAgICAgICBtdXRleF9sb2NrKCZtY2ktPmNoZ2Rl dF9sb2NrKTsKPiArICAgICAgIHJldCA9IG10NjM2MF9nZXRfY2hyZGV0X2V4dF9zdGF0KG1jaSwg JnB3cl9yZHkpOwo+ICsgICAgICAgaWYgKHJldCA8IDApCj4gKyAgICAgICAgICAgICAgIGdvdG8g b3V0Owo+ICsgICAgICAgaWYgKG1jaS0+cHdyX3JkeSA9PSBwd3JfcmR5KSB7Cj4gKyAgICAgICAg ICAgICAgIGRldl9kYmcobWNpLT5kZXYsICJSZWNlaXZlZCB2YnVzIGludGVycnVwdCwgcHdyX3Jk eSBpcyBzYW1lKCVkKVxuIiwgcHdyX3JkeSk7Cj4gKyAgICAgICAgICAgICAgIGdvdG8gb3V0Owo+ ICsgICAgICAgfQo+ICsgICAgICAgbWNpLT5wd3JfcmR5ID0gcHdyX3JkeTsKPiArICAgICAgIGRl dl9kYmcobWNpLT5kZXYsICJSZWNlaXZlZCB2YnVzIGludGVycnVwdCwgcHdyX3JkeSA9ICVkXG4i LCBwd3JfcmR5KTsKPiArICAgICAgIGlmICghcHdyX3JkeSkgewo+ICsgICAgICAgICAgICAgICBt Y2ktPnBzeV91c2JfdHlwZSA9IFBPV0VSX1NVUFBMWV9VU0JfVFlQRV9VTktOT1dOOwo+ICsgICAg ICAgICAgICAgICBwb3dlcl9zdXBwbHlfY2hhbmdlZChtY2ktPnBzeSk7Cj4gKwo+ICsgICAgICAg fQo+ICsgICAgICAgcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9QTVVfREVWSUNFX1RZUEUsCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX1VTQkNIR0VOX01BU0ssCj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHdyX3JkeSA/IE1UNjM2MF9VU0JDSEdFTl9N QVNLIDogMCk7Cj4gKyAgICAgICBpZiAocmV0IDwgMCkKPiArICAgICAgICAgICAgICAgZ290byBv dXQ7Cj4gKyAgICAgICBtY2ktPmJjMTJfZW4gPSBwd3JfcmR5Owo+ICtvdXQ6Cj4gKyAgICAgICBt dXRleF91bmxvY2soJm1jaS0+Y2hnZGV0X2xvY2spOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBt dDYzNjBfY2hyZGV0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICt7Cj4gKyAgICAg ICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSAoc3RydWN0IG10NjM2MF9jaGdfaW5mbyAq KWNvbnRhaW5lcl9vZigKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29y aywgc3RydWN0IG10NjM2MF9jaGdfaW5mbywgY2hyZGV0X3dvcmspOwo+ICsKPiArICAgICAgIG10 NjM2MF9oYW5kbGVfY2hyZGV0X2V4dF9ldnQobWNpKTsKPiArfQo+ICsKPiArc3RhdGljIGlycXJl dHVybl90IG10NjM2MF9wbXVfY2hyZGV0X2V4dF9ldnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpk YXRhKQo+ICt7Cj4gKyAgICAgICBzdHJ1Y3QgbXQ2MzYwX2NoZ19pbmZvICptY2kgPSBkYXRhOwo+ ICsKPiArICAgICAgIG10NjM2MF9oYW5kbGVfY2hyZGV0X2V4dF9ldnQobWNpKTsKPiArICAgICAg IHJldHVybiBJUlFfSEFORExFRDsKPiArfQo+ICsKPiArc3RhdGljIGludCBtdDYzNjBfY2hnX2ly cV9yZWdpc3RlcihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKyAgICAgICBj b25zdCBzdHJ1Y3Qgewo+ICsgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lOwo+ICsgICAg ICAgICAgICAgICBpcnFfaGFuZGxlcl90IGhhbmRsZXI7Cj4gKyAgICAgICB9IGlycV9kZXNjc1td ID0gewo+ICsgICAgICAgICAgICAgICB7ICJhdHRhY2hfaSIsIG10NjM2MF9wbXVfYXR0YWNoX2lf aGFuZGxlciB9LAo+ICsgICAgICAgICAgICAgICB7ICJjaHJkZXRfZXh0X2V2dCIsIG10NjM2MF9w bXVfY2hyZGV0X2V4dF9ldnRfaGFuZGxlciB9Cj4gKyAgICAgICB9Owo+ICsgICAgICAgaW50IGks IHJldDsKPiArCj4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpcnFfZGVzY3Mp OyBpKyspIHsKPiArICAgICAgICAgICAgICAgcmV0ID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUo cGRldiwgaXJxX2Rlc2NzW2ldLm5hbWUpOwo+ICsgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkK PiArICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ICsKPiArICAgICAgICAgICAg ICAgcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmcGRldi0+ZGV2LCByZXQsIE5VTEws Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJxX2Rl c2NzW2ldLmhhbmRsZXIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgSVJRRl9UUklHR0VSX0ZBTExJTkcsCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgaXJxX2Rlc2NzW2ldLm5hbWUsCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1fZ2V0X2RydmRhdGEo cGRldikpOwo+ICsgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKPiArICAgICAgICAgICAgICAg ICAgICAgICByZXR1cm4gZGV2X2Vycl9wcm9iZSgmcGRldi0+ZGV2LCByZXQsICJGYWlsZWQgdG8g cmVxdWVzdCAlcyBpcnFcbiIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgaXJxX2Rlc2NzW2ldLm5hbWUpOwo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIHJl dHVybiAwOwo+ICt9Cj4gKwo+ICtzdHJ1Y3QgbXQ2MzYwX2ZpZWxkX2luZm8gewo+ICsgICAgICAg c3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHI7Cj4gKyAgICAgICB1MTYgcmVnOwo+ICsg ICAgICAgdTggbWFzazsKPiArICAgICAgIHU4IHNoZnQ7Cj4gK307Cj4gKwo+ICtzdGF0aWMgaW50 IG10NjM2MF9jaGdfaW5pdF9zZXR0aW5nKHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaSkKPiAr ewo+ICsgICAgICAgaW50IHJldDsKPiArCj4gKyAgICAgICByZXQgPSByZWdtYXBfdXBkYXRlX2Jp dHMobWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfREVWSUNFX1RZUEUsCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgTVQ2MzYwX1VTQkNIR0VOX01BU0ssIDApOwo+ICsgICAgICAgaWYg KHJldCkKPiArICAgICAgICAgICAgICAgcmV0dXJuIGRldl9lcnJfcHJvYmUobWNpLT5kZXYsIHJl dCwgIiVzOiBGYWlsZWQgdG8gZGlzYWJsZSBiYzEyXG4iLCBfX2Z1bmNfXyk7Cj4gKyAgICAgICBy ZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMobWNpLT5yZWdtYXAsIE1UNjM2MF9QTVVfQ0hHX0NUUkwy LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1UNjM2MF9JSU5MTVRTRUxfTUFT SywKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSUlOTE1UU0VMX0FJ Q1IgPDwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX0lJ TkxNVFNFTF9TSEZUKTsKPiArICAgICAgIGlmIChyZXQpCj4gKyAgICAgICAgICAgICAgIHJldHVy biBkZXZfZXJyX3Byb2JlKG1jaS0+ZGV2LCByZXQsCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICIlczogRmFpbGVkIHRvIHN3aXRjaCBpaW5sbXRzZWwgdG8gYWljclxuIiwg X19mdW5jX18pOwo+ICsgICAgICAgdXNsZWVwX3JhbmdlKDUwMDAsIDYwMDApOwo+ICsgICAgICAg cmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLCBNVDYzNjBfUE1VX0NIR19DVFJM MywKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVDYzNjBfSUxJTV9FTl9NQVNL LCAwKTsKPiArICAgICAgIGlmIChyZXQpCj4gKyAgICAgICAgICAgICAgIHJldHVybiBkZXZfZXJy X3Byb2JlKG1jaS0+ZGV2LCByZXQsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICIlczogRmFpbGVkIHRvIGRpc2FibGUgaWxpbVxuIiwgX19mdW5jX18pOwo+ICsgICAgICAg cmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKG1jaS0+cmVnbWFwLCBNVDYzNjBfUE1VX0NIR19DVFJM MTAsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVQ2MzYwX09UR19PQ19NQVNL LCBNVDYzNjBfT1RHX09DX01BU0spOwo+ICsgICAgICAgaWYgKHJldCkKPiArICAgICAgICAgICAg ICAgcmV0dXJuIGRldl9lcnJfcHJvYmUobWNpLT5kZXYsIHJldCwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIiVzOiBGYWlsZWQgdG8gY29uZmlnIG90ZyBvYyB0byAzQVxu IiwgX19mdW5jX18pOwo+ICsgICAgICAgcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB1MzIg bXQ2MzYwX3Zpbm92cF90cmFuc190b19zZWwodTMyIHZhbCkKPiArewo+ICsgICAgICAgdTMyIHZp bm92cF90YmxbXSA9IHsgNTUwMDAwMCwgNjUwMDAwMCwgMTEwMDAwMDAsIDE0NTAwMDAwIH07Cj4g KyAgICAgICBpbnQgaTsKPiArCj4gKyAgICAgICAvKiBTZWxlY3QgdGhlIHNtYWxsZXIgYW5kIGVx dWFsIHN1cHBvcnRlZCB2YWx1ZSAqLwo+ICsgICAgICAgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJ WkUodmlub3ZwX3RibCktMTsgaSsrKSB7Cj4gKyAgICAgICAgICAgICAgIGlmICh2YWwgPCB2aW5v dnBfdGJsW2krMV0pCj4gKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4gKyAgICAgICB9 Cj4gKyAgICAgICByZXR1cm4gaTsKPiArfQo+ICsKPiArc3RhdGljIGludCBtdDYzNjBfcGFyc2Vf ZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsgICAgICAgc3RydWN0IG10 NjM2MF9jaGdfaW5mbyAqbWNpID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwo+ICsgICAg ICAgaW50IHJldDsKPiArCj4gKyAgICAgICByZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIo JnBkZXYtPmRldiwgInJpY2h0ZWssdmlub3ZwLW1pY3Jvdm9sdCIsICZtY2ktPnZpbm92cCk7Cj4g KyAgICAgICBpZiAocmV0KQo+ICsgICAgICAgICAgICAgICByZXR1cm4gZGV2X2Vycl9wcm9iZSgm cGRldi0+ZGV2LCByZXQsICJGYWlsZWQgdG8gcGFyc2Ugdmlub3ZwIGluIERUXG4iKTsKPiArICAg ICAgIHJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgbXQ2MzYwX2FwcGx5X2R0KHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gK3sKPiArICAgICAgIHN0cnVjdCBtdDYzNjBf Y2hnX2luZm8gKm1jaSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKPiArICAgICAgIHUz MiBzZWw7Cj4gKwo+ICsgICAgICAgc2VsID0gbXQ2MzYwX3Zpbm92cF90cmFuc190b19zZWwobWNp LT52aW5vdnApOwo+ICsgICAgICAgcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhtY2ktPnJlZ21h cCwgTVQ2MzYwX1BNVV9DSEdfQ1RSTDE5LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBNVDYzNjBfVklOT1ZQX01BU0ssIHNlbCA8PCBNVDYzNjBfVklOT1ZQX1NIRlQpOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgaW50IG10NjM2MF9jaGFyZ2VyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9k ZXZpY2UgKnBkZXYpCj4gK3sKPiArICAgICAgIHN0cnVjdCBtdDYzNjBfY2hnX2luZm8gKm1jaTsK PiArICAgICAgIHN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIGNoYXJnZXJfY2ZnID0ge307Cj4g KyAgICAgICBzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7IH07Cj4gKyAgICAgICBp bnQgcmV0Owo+ICsKPiArICAgICAgIG1jaSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXpl b2YoKm1jaSksIEdGUF9LRVJORUwpOwo+ICsgICAgICAgaWYgKCFtY2kpCj4gKyAgICAgICAgICAg ICAgIHJldHVybiAtRU5PTUVNOwo+ICsKPiArICAgICAgIHJldCA9IG10NjM2MF9wYXJzZV9kdChw ZGV2KTsKPiArICAgICAgIGlmIChyZXQpCj4gKyAgICAgICAgICAgICAgIHJldHVybiBkZXZfZXJy X3Byb2JlKCZwZGV2LT5kZXYsIHJldCwgIkZhaWxlZCB0byBwYXJzZSBkdFxuIik7Cj4gKwo+ICsg ICAgICAgbWNpLT5kZXYgPSAmcGRldi0+ZGV2Owo+ICsgICAgICAgbWNpLT52aW5vdnAgPSA2NTAw MDAwOwo+ICsgICAgICAgbXV0ZXhfaW5pdCgmbWNpLT5jaGdkZXRfbG9jayk7Cj4gKyAgICAgICBw bGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtY2kpOwo+ICsgICAgICAgSU5JVF9XT1JLKCZtY2kt PmNocmRldF93b3JrLCAmbXQ2MzYwX2NocmRldF93b3JrKTsKPiArCj4gKyAgICAgICBtY2ktPnJl Z21hcCA9IGRldl9nZXRfcmVnbWFwKHBkZXYtPmRldi5wYXJlbnQsIE5VTEwpOwo+ICsgICAgICAg aWYgKCFtY2ktPnJlZ21hcCkKPiArICAgICAgICAgICAgICAgcmV0dXJuIGRldl9lcnJfcHJvYmUo JnBkZXYtPmRldiwgLUVOT0RFViwgIkZhaWxlZCB0byBnZXQgcGFyZW50IHJlZ21hcFxuIik7Cj4g Kwo+ICsgICAgICAgcmV0ID0gbXQ2MzYwX2FwcGx5X2R0KHBkZXYpOwo+ICsgICAgICAgaWYgKHJl dCkKPiArICAgICAgICAgICAgICAgcmV0dXJuIGRldl9lcnJfcHJvYmUoJnBkZXYtPmRldiwgcmV0 LCAiRmFpbGVkIHRvIGFwcGx5IGR0XG4iKTsKPiArCj4gKyAgICAgICBtZW1jcHkoJm1jaS0+cHN5 X2Rlc2MsICZtdDYzNjBfY2hhcmdlcl9kZXNjLCBzaXplb2YobWNpLT5wc3lfZGVzYykpOwo+ICsg ICAgICAgbWNpLT5wc3lfZGVzYy5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7Cj4gKyAgICAg ICBjaGFyZ2VyX2NmZy5kcnZfZGF0YSA9IG1jaTsKPiArICAgICAgIGNoYXJnZXJfY2ZnLm9mX25v ZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKPiArICAgICAgIG1jaS0+cHN5ID0gZGV2bV9wb3dlcl9z dXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgJm1jaS0+cHN5X2Rlc2MsICZjaGFyZ2VyX2NmZyk7Cj4gKyAgICAg ICBpZiAoSVNfRVJSKG1jaS0+cHN5KSkKPiArICAgICAgICAgICAgICAgcmV0dXJuIGRldl9lcnJf cHJvYmUoJnBkZXYtPmRldiwgUFRSX0VSUihtY2ktPnBzeSksCj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVnaXN0ZXIgcG93ZXIgc3VwcGx5IGRldlxu Iik7Cj4gKwo+ICsgICAgICAgcmV0ID0gbXQ2MzYwX2NoZ19pbml0X3NldHRpbmcobWNpKTsKPiAr ICAgICAgIGlmIChyZXQpCj4gKyAgICAgICAgICAgICAgIHJldHVybiBkZXZfZXJyX3Byb2JlKCZw ZGV2LT5kZXYsIHJldCwgIkZhaWxlZCB0byBpbml0aWFsIHNldHRpbmdcbiIpOwo+ICsKPiArICAg ICAgIHNjaGVkdWxlX3dvcmsoJm1jaS0+Y2hyZGV0X3dvcmspOwo+ICsKPiArICAgICAgIHJldCA9 IG10NjM2MF9jaGdfaXJxX3JlZ2lzdGVyKHBkZXYpOwo+ICsgICAgICAgaWYgKHJldCkKPiArICAg ICAgICAgICAgICAgcmV0dXJuIGRldl9lcnJfcHJvYmUoJnBkZXYtPmRldiwgcmV0LCAiRmFpbGVk IHRvIHJlZ2lzdGVyIGlycXNcbiIpOwo+ICsKPiArICAgICAgIGNvbmZpZy5kZXYgPSAmcGRldi0+ ZGV2Owo+ICsgICAgICAgY29uZmlnLnJlZ21hcCA9IG1jaS0+cmVnbWFwOwo+ICsgICAgICAgbWNp LT5vdGdfcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZtdDYzNjBf b3RnX3JkZXNjLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICZjb25maWcpOwo+ICsgICAgICAgaWYgKElTX0VSUihtY2ktPm90Z19yZGV2KSkKPiArICAg ICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIobWNpLT5vdGdfcmRldik7Cj4gKwo+ICsgICAgICAg cmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9f bWF5YmVfdW51c2VkIG10NjM2MF9jaGFyZ2VyX29mX2lkW10gPSB7Cj4gKyAgICAgICB7IC5jb21w YXRpYmxlID0gIm1lZGlhdGVrLG10NjM2MC1jaGciLCB9LAo+ICsgICAgICAge30sCj4gK307Cj4g K01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG10NjM2MF9jaGFyZ2VyX29mX2lkKTsKPiArCj4gK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIG10NjM2MF9jaGFyZ2VyX2lkW10g PSB7Cj4gKyAgICAgICB7ICJtdDYzNjAtY2hnIiwgMCB9LAo+ICsgICAgICAge30sCj4gK307Cj4g K01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIG10NjM2MF9jaGFyZ2VyX2lkKTsKPiArCj4g K3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG10NjM2MF9jaGFyZ2VyX2RyaXZlciA9IHsK PiArICAgICAgIC5kcml2ZXIgPSB7Cj4gKyAgICAgICAgICAgICAgIC5uYW1lID0gIm10NjM2MC1j aGciLAo+ICsgICAgICAgICAgICAgICAub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobXQ2 MzYwX2NoYXJnZXJfb2ZfaWQpLAo+ICsgICAgICAgfSwKPiArICAgICAgIC5wcm9iZSA9IG10NjM2 MF9jaGFyZ2VyX3Byb2JlLAo+ICsgICAgICAgLmlkX3RhYmxlID0gbXQ2MzYwX2NoYXJnZXJfaWQs Cj4gK307Cj4gK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobXQ2MzYwX2NoYXJnZXJfZHJpdmVyKTsK PiArCj4gK01PRFVMRV9BVVRIT1IoIkdlbmUgQ2hlbiA8Z2VuZV9jaGVuQHJpY2h0ZWsuY29tPiIp Owo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIk1UNjM2MCBDaGFyZ2VyIERyaXZlciIpOwo+ICtNT0RV TEVfTElDRU5TRSgiR1BMIik7Cj4gLS0KPiAyLjcuNAo+CgpEZWFyIFJldmlld2VycywKSXMgdGhl cmUgYW55IGNoYW5nZSBJIGNhbiBmaXgsIHBsZWFzZSBsZXQgbWUga25vdywgdGhhbmtzCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2Vy bmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0 cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVs Cg==