From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtpbg.qq.com (smtpbg127.qq.com [109.244.180.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2B07F70 for ; Mon, 2 Aug 2021 09:54:47 +0000 (UTC) X-QQ-mid: bizesmtp37t1627897973tswe4cud Received: from [192.168.0.46] (unknown [113.89.245.207]) by esmtp6.qq.com (ESMTP) with id ; Mon, 02 Aug 2021 17:52:52 +0800 (CST) X-QQ-SSF: 00100000002000209000D00A0000000 X-QQ-FEAT: JN+C/NT9bLPnvSsDS+Rz5vENXxe8N1Wx5bYyvoQrGp+sPrsGLouO+1xgixt/q NfkCKAK6dwEnwhDPKnkIpw2orTv5S5EdN6G7Whb5Q28rwCAQa8BbhYuwQSdTFvo61PT0KbA ZBhwv+4FX13cQHMGW71XLRDjIedT3Em9C1yS9W++FfNcvwLb+hrtWNjBelXiy6Icc0e68in eo1TGiIfwBmFGsjyCp/3LBUs8C+zSZO6ODtsMnA2YOxx60rx7CIVYmR7qtTtA9fBt21PZf7 uPk8UtAgSYlitN05XCZN6qhjZsHIkWWi2ZmRC0+Rp6VCAehK17/4dmxnuU5NWWJQbupXRKM 6PzNQfVDqTdLHAnUElS7uEbvyKWa+O9wyActyMG X-QQ-GoodBg: 0 Message-ID: +B00387BDD8D62B3B Subject: Re: [PATCH 10/17] clk: sunxi=ng: add support for R329 R-CCU From: Icenowy Zheng To: Rob Herring , Maxime Ripard , Chen-Yu Tsai , Jernej Skrabec , Ulf Hansson , Linus Walleij , Alexandre Belloni , Andre Przywara , Samuel Holland Cc: devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org Date: Mon, 02 Aug 2021 17:52:52 +0800 In-Reply-To: <20210802062212.73220-11-icenowy@sipeed.com> References: <20210802062212.73220-1-icenowy@sipeed.com> <20210802062212.73220-11-icenowy@sipeed.com> Organization: Sipeed Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.40.0 Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:sipeed.com:qybgspam:qybgspam1 在 2021-08-02星期一的 14:22 +0800,Icenowy Zheng写道: > Allwinner R329 has clock controls in PRCM, like other new Allwinner > SoCs. > > Add support for them. > > This driver is added before the main CCU because PLLs are controlled > by > R-CCU on R329. > > Signed-off-by: Icenowy Zheng > --- >  drivers/clk/sunxi-ng/Kconfig                  |   5 + >  drivers/clk/sunxi-ng/Makefile                 |   1 + >  drivers/clk/sunxi-ng/ccu-sun50i-r329-r.c      | 374 > ++++++++++++++++++ >  drivers/clk/sunxi-ng/ccu-sun50i-r329-r.h      |  33 ++ >  include/dt-bindings/clock/sun50i-r329-r-ccu.h |  33 ++ >  include/dt-bindings/reset/sun50i-r329-r-ccu.h |  24 ++ >  6 files changed, 470 insertions(+) >  create mode 100644 drivers/clk/sunxi-ng/ccu-sun50i-r329-r.c >  create mode 100644 drivers/clk/sunxi-ng/ccu-sun50i-r329-r.h >  create mode 100644 include/dt-bindings/clock/sun50i-r329-r-ccu.h >  create mode 100644 include/dt-bindings/reset/sun50i-r329-r-ccu.h > > diff --git a/drivers/clk/sunxi-ng/Kconfig b/drivers/clk/sunxi- > ng/Kconfig > index cd46d8853876..e49b2c2fa5b7 100644 > --- a/drivers/clk/sunxi-ng/Kconfig > +++ b/drivers/clk/sunxi-ng/Kconfig > @@ -42,6 +42,11 @@ config SUN50I_H6_R_CCU >         default ARM64 && ARCH_SUNXI >         depends on (ARM64 && ARCH_SUNXI) || COMPILE_TEST >   > +config SUN50I_R329_R_CCU > +       bool "Support for the Allwinner R329 PRCM CCU" > +       default ARM64 && ARCH_SUNXI > +       depends on (ARM64 && ARCH_SUNXI) || COMPILE_TEST > + >  config SUN4I_A10_CCU >         bool "Support for the Allwinner A10/A20 CCU" >         default MACH_SUN4I > diff --git a/drivers/clk/sunxi-ng/Makefile b/drivers/clk/sunxi- > ng/Makefile > index 96c324306d97..db338a2188fd 100644 > --- a/drivers/clk/sunxi-ng/Makefile > +++ b/drivers/clk/sunxi-ng/Makefile > @@ -28,6 +28,7 @@ obj-$(CONFIG_SUN50I_A100_R_CCU)       += ccu- > sun50i-a100-r.o >  obj-$(CONFIG_SUN50I_H6_CCU)    += ccu-sun50i-h6.o >  obj-$(CONFIG_SUN50I_H616_CCU)  += ccu-sun50i-h616.o >  obj-$(CONFIG_SUN50I_H6_R_CCU)  += ccu-sun50i-h6-r.o > +obj-$(CONFIG_SUN50I_R329_R_CCU)        += ccu-sun50i-r329-r.o >  obj-$(CONFIG_SUN4I_A10_CCU)    += ccu-sun4i-a10.o >  obj-$(CONFIG_SUN5I_CCU)                += ccu-sun5i.o >  obj-$(CONFIG_SUN6I_A31_CCU)    += ccu-sun6i-a31.o > diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-r329-r.c > b/drivers/clk/sunxi-ng/ccu-sun50i-r329-r.c > new file mode 100644 > index 000000000000..5413a701cb57 > --- /dev/null > +++ b/drivers/clk/sunxi-ng/ccu-sun50i-r329-r.c > @@ -0,0 +1,374 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (c) 2021 Sipeed > + * Based on the H616 CCU driver, which is: > + *   Copyright (c) 2020 Arm Ltd. > + */ > + > +#include > +#include > +#include > +#include > + > +#include "ccu_common.h" > +#include "ccu_reset.h" > + > +#include "ccu_div.h" > +#include "ccu_gate.h" > +#include "ccu_mp.h" > +#include "ccu_mult.h" > +#include "ccu_nk.h" > +#include "ccu_nkm.h" > +#include "ccu_nkmp.h" > +#include "ccu_nm.h" > + > +#include "ccu-sun50i-r329-r.h" > + > +/* > + * The M factor is present in the register's description, but not in > the > + * frequency formula, and it's documented as "The bit is only for > + * testing", so it's not modelled and then force to 0. > + */ > +#define SUN50I_R329_PLL_CPUX_REG       0x1000 > +static struct ccu_mult pll_cpux_clk = { > +       .enable         = BIT(31), > +       .lock           = BIT(28), > +       .mult           = _SUNXI_CCU_MULT_MIN(8, 8, 12), > +       .common         = { > +               .reg            = 0x1000, > +               .hw.init        = CLK_HW_INIT("pll-cpux", "osc24M", > +                                             &ccu_mult_ops, > +                                             CLK_SET_RATE_UNGATE), > +       }, > +}; > + > +#define SUN50I_R329_PLL_PERIPH_REG     0x1010 > +static struct ccu_nm pll_periph_base_clk = { > +       .enable         = BIT(31), > +       .lock           = BIT(28), > +       .n              = _SUNXI_CCU_MULT_MIN(8, 8, 12), > +       .m              = _SUNXI_CCU_DIV(1, 1), /* input divider */ > +       .common         = { > +               .reg            = 0x1010, > +               .hw.init        = CLK_HW_INIT("pll-periph-base", > "osc24M", > +                                             &ccu_nm_ops, > +                                             CLK_SET_RATE_UNGATE), > +       }, > +}; > + > +static SUNXI_CCU_M(pll_periph_2x_clk, "pll-periph-2x", "pll-periph- > base", > +                  0x1010, 16, 3, 0); > +static SUNXI_CCU_M(pll_periph_800m_clk, "pll-periph-800m", "pll- > periph-base", > +                  0x1010, 20, 3, 0); > +static CLK_FIXED_FACTOR_HW(pll_periph_clk, "pll-periph", > +                          &pll_periph_2x_clk.common.hw, 2, 1, 0); > + > +#define SUN50I_R329_PLL_AUDIO0_REG     0x1020 > +static struct ccu_sdm_setting pll_audio0_sdm_table[] = { > +       { .rate = 1548288000, .pattern = 0xc0070624, .m = 1, .n = 64 > }, > +}; > + > +static struct ccu_nm pll_audio0_clk = { > +       .enable         = BIT(31), > +       .lock           = BIT(28), > +       .n              = _SUNXI_CCU_MULT_MIN(8, 8, 12), > +       .m              = _SUNXI_CCU_DIV(1, 1), > +       .sdm            = _SUNXI_CCU_SDM(pll_audio0_sdm_table, > +                                        BIT(24), 0x1120, BIT(31)), > +       .common         = { > +               .features       = CCU_FEATURE_SIGMA_DELTA_MOD, > +               .reg            = 0x1020, > +               .hw.init        = CLK_HW_INIT("pll-audio0", "osc24M", > +                                             &ccu_nm_ops, > +                                             CLK_SET_RATE_UNGATE), > +       }, > +}; > + > +static SUNXI_CCU_M(pll_audio0_div2_clk, "pll-audio0-div2", "pll- > audio0", > +                  0x1020, 16, 3, 0); > +static SUNXI_CCU_M(pll_audio0_div5_clk, "pll-audio0-div5", "pll- > audio0", > +                  0x1020, 20, 3, 0); > + > +/* > + * PLL-AUDIO1 has 3 dividers defined in the datasheet, however the > + * BSP driver always has M0 = 1 and M1 = 2 (this is also the > + * reset value in the register). > + * > + * Here just module it as NM clock, and force M0 = 1 and M1 = 2. > + */ > +#define SUN50I_R329_PLL_AUDIO1_REG     0x1030 > +static struct ccu_sdm_setting pll_audio1_4x_sdm_table[] = { > +       { .rate = 22579200, .pattern = 0xc001288d, .m = 12, .n = 22 > }, > +       { .rate = 24576000, .pattern = 0xc00126e9, .m = 12, .n = 24 > }, > +       { .rate = 90316800, .pattern = 0xc001288d, .m = 3, .n = 22 }, > +       { .rate = 98304000, .pattern = 0xc00126e9, .m = 3, .n = 24 }, > +}; Sorry, the SDM table here is wrong -- all rate here should be *2 (because I wrongly assumed how postdiv works with sdm). > +static struct ccu_nm pll_audio1_4x_clk = { > +       .enable         = BIT(31), > +       .lock           = BIT(28), > +       .n              = _SUNXI_CCU_MULT_MIN(8, 8, 12), > +       .m              = _SUNXI_CCU_DIV(16, 6), > +       .fixed_post_div = 2, > +       .sdm            = _SUNXI_CCU_SDM(pll_audio1_4x_sdm_table, > +                                        BIT(24), 0x1130, BIT(31)), > +       .common         = { > +               .features       = CCU_FEATURE_FIXED_POSTDIV | > +                                 CCU_FEATURE_SIGMA_DELTA_MOD, > +               .reg            = 0x1030, > +               .hw.init        = CLK_HW_INIT("pll-audio1-4x", > "osc24M", > +                                             &ccu_nm_ops, > +                                             CLK_SET_RATE_UNGATE), > +       }, > +}; > + > +static CLK_FIXED_FACTOR_HW(pll_audio1_2x_clk, "pll-audio1-2x", > +                          &pll_audio1_4x_clk.common.hw, 2, 1, > +                          CLK_SET_RATE_PARENT); > +static CLK_FIXED_FACTOR_HW(pll_audio1_clk, "pll-audio1", > +                          &pll_audio1_4x_clk.common.hw, 4, 1, > +                          CLK_SET_RATE_PARENT); > + > +static const char * const r_bus_parents[] = { "osc24M", "osc32k", > "iosc", > +                                             "pll-periph-2x", > +                                             "pll-audio0-div2" }; > +static SUNXI_CCU_MP_WITH_MUX(r_ahb_clk, "r-ahb", r_bus_parents, > 0x000, > +                            0, 5,      /* M */ > +                            8, 2,      /* P */ > +                            24, 3,     /* mux */ > +                            0); > + > +static SUNXI_CCU_MP_WITH_MUX(r_apb1_clk, "r-apb1", r_bus_parents, > 0x00c, > +                            0, 5,      /* M */ > +                            8, 2,      /* P */ > +                            24, 3,     /* mux */ > +                            0); > + > +static SUNXI_CCU_MP_WITH_MUX(r_apb2_clk, "r-apb2", r_bus_parents, > 0x010, > +                            0, 5,      /* M */ > +                            8, 2,      /* P */ > +                            24, 3,     /* mux */ > +                            0); > + > +static SUNXI_CCU_GATE(r_bus_gpadc_clk, "r-bus-gpadc", "r-apb1", > +                     0x0ec, BIT(0), 0); > +static SUNXI_CCU_GATE(r_bus_ths_clk, "r-bus-ths", "r-apb1", 0x0fc, > BIT(0), 0); > + > +static SUNXI_CCU_GATE(r_bus_dma_clk, "r-bus-dma", "r-apb1", 0x10c, > BIT(0), 0); > + > +static const char * const r_pwm_parents[] = { "osc24M", "osc32k", > "iosc" }; > +static SUNXI_CCU_MUX_WITH_GATE(r_pwm_clk, "r-pwm", r_pwm_parents, > 0x130, > +                              24, 3,   /* mux */ > +                              BIT(31), /* gate */ > +                              0); > + > +static SUNXI_CCU_GATE(r_bus_pwm_clk, "r-bus-pwm", "r-apb1", 0x13c, > BIT(0), 0); > + > +static const char * const r_audio_parents[] = { "pll-audio0-div5", > "pll-audio0-div2", > +                                               "pll-audio1-1x", > "pll-audio1-4x" }; > +static SUNXI_CCU_MP_WITH_MUX_GATE(r_codec_adc_clk, "r-codec-adc", > r_audio_parents, 0x140, > +                                 0, 5,         /* M */ > +                                 8, 2,         /* P */ > +                                 24, 3,        /* mux */ > +                                 BIT(31),      /* gate */ > +                                 0); > +static SUNXI_CCU_MP_WITH_MUX_GATE(r_codec_dac_clk, "r-codec-dac", > r_audio_parents, 0x144, > +                                 0, 5,         /* M */ > +                                 8, 2,         /* P */ > +                                 24, 3,        /* mux */ > +                                 BIT(31),      /* gate */ > +                                 0); > + > +static SUNXI_CCU_GATE(r_bus_codec_clk, "r-bus-codec", "r-apb1", > +                     0x14c, BIT(0), 0); > + > +static SUNXI_CCU_MP_WITH_MUX_GATE(r_dmic_clk, "r-dmic", > r_audio_parents, 0x150, > +                                 0, 5,         /* M */ > +                                 8, 2,         /* P */ > +                                 24, 3,        /* mux */ > +                                 BIT(31),      /* gate */ > +                                 0); > + > +static SUNXI_CCU_GATE(r_bus_dmic_clk, "r-bus-dmic", "r-apb1", 0x15c, > BIT(0), 0); > +static SUNXI_CCU_GATE(r_bus_lradc_clk, "r-bus-lradc", "r-apb1", > +                     0x16c, BIT(0), 0); > + > +static SUNXI_CCU_MP_WITH_MUX_GATE(r_i2s_clk, "r-i2s", > r_audio_parents, 0x170, > +                                 0, 5,         /* M */ > +                                 8, 2,         /* P */ > +                                 24, 3,        /* mux */ > +                                 BIT(31),      /* gate */ > +                                 0); > +static SUNXI_CCU_MP_WITH_MUX_GATE(r_i2s_asrc_clk, "r-i2s-asrc", > +                                 r_audio_parents, 0x174, > +                                 0, 5,         /* M */ > +                                 8, 2,         /* P */ > +                                 24, 3,        /* mux */ > +                                 BIT(31),      /* gate */ > +                                 0); > +static SUNXI_CCU_GATE(r_bus_i2s_clk, "r-bus-i2s", "r-apb1", 0x17c, > BIT(0), 0); > +static SUNXI_CCU_GATE(r_bus_uart_clk, "r-bus-uart", "r-apb2", 0x18c, > BIT(0), 0); > +static SUNXI_CCU_GATE(r_bus_i2c_clk, "r-bus-i2c", "r-apb2", 0x19c, > BIT(0), 0); > + > +static const char * const r_ir_parents[] = { "osc32k", "osc24M" }; > +static SUNXI_CCU_MP_WITH_MUX_GATE(r_ir_clk, "r-ir", r_ir_parents, > 0x1c0, > +                                 0, 5,         /* M */ > +                                 8, 2,         /* P */ > +                                 24, 3,        /* mux */ > +                                 BIT(31),      /* gate */ > +                                 0); > + > +static SUNXI_CCU_GATE(r_bus_ir_clk, "r-bus-ir", "r-apb1", 0x1cc, > BIT(0), 0); > +static SUNXI_CCU_GATE(r_bus_msgbox_clk, "r-bus-msgbox", "r-apb1", > +                     0x1dc, BIT(0), 0); > +static SUNXI_CCU_GATE(r_bus_spinlock_clk, "r-bus-spinlock", "r- > apb1", > +                     0x1ec, BIT(0), 0); > +static SUNXI_CCU_GATE(r_bus_rtc_clk, "r-bus-rtc", "r-ahb", > +                     0x20c, BIT(0), CLK_IS_CRITICAL); > + > +static struct ccu_common *sun50i_r329_r_ccu_clks[] = { > +       &pll_cpux_clk.common, > +       &pll_periph_base_clk.common, > +       &pll_periph_2x_clk.common, > +       &pll_periph_800m_clk.common, > +       &pll_audio0_clk.common, > +       &pll_audio0_div2_clk.common, > +       &pll_audio0_div5_clk.common, > +       &pll_audio1_4x_clk.common, > +       &r_ahb_clk.common, > +       &r_apb1_clk.common, > +       &r_apb2_clk.common, > +       &r_bus_gpadc_clk.common, > +       &r_bus_ths_clk.common, > +       &r_bus_dma_clk.common, > +       &r_pwm_clk.common, > +       &r_bus_pwm_clk.common, > +       &r_codec_adc_clk.common, > +       &r_codec_dac_clk.common, > +       &r_bus_codec_clk.common, > +       &r_dmic_clk.common, > +       &r_bus_dmic_clk.common, > +       &r_bus_lradc_clk.common, > +       &r_i2s_clk.common, > +       &r_i2s_asrc_clk.common, > +       &r_bus_i2s_clk.common, > +       &r_bus_uart_clk.common, > +       &r_bus_i2c_clk.common, > +       &r_ir_clk.common, > +       &r_bus_ir_clk.common, > +       &r_bus_msgbox_clk.common, > +       &r_bus_spinlock_clk.common, > +       &r_bus_rtc_clk.common, > +}; > + > +static struct clk_hw_onecell_data sun50i_r329_r_hw_clks = { > +       .hws    = { > +               [CLK_PLL_CPUX]          = &pll_cpux_clk.common.hw, > +               [CLK_PLL_PERIPH_BASE]   = > &pll_periph_base_clk.common.hw, > +               [CLK_PLL_PERIPH_2X]     = > &pll_periph_2x_clk.common.hw, > +               [CLK_PLL_PERIPH_800M]   = > &pll_periph_800m_clk.common.hw, > +               [CLK_PLL_PERIPH]        = &pll_periph_clk.hw, > +               [CLK_PLL_AUDIO0]        = &pll_audio0_clk.common.hw, > +               [CLK_PLL_AUDIO0_DIV2]   = > &pll_audio0_div2_clk.common.hw, > +               [CLK_PLL_AUDIO0_DIV5]   = > &pll_audio0_div5_clk.common.hw, > +               [CLK_PLL_AUDIO1_4X]     = > &pll_audio1_4x_clk.common.hw, > +               [CLK_PLL_AUDIO1_2X]     = &pll_audio1_2x_clk.hw, > +               [CLK_PLL_AUDIO1]        = &pll_audio1_clk.hw, > +               [CLK_R_AHB]             = &r_ahb_clk.common.hw, > +               [CLK_R_APB1]            = &r_apb1_clk.common.hw, > +               [CLK_R_APB2]            = &r_apb2_clk.common.hw, > +               [CLK_R_BUS_GPADC]       = &r_bus_gpadc_clk.common.hw, > +               [CLK_R_BUS_THS]         = &r_bus_ths_clk.common.hw, > +               [CLK_R_BUS_DMA]         = &r_bus_dma_clk.common.hw, > +               [CLK_R_PWM]             = &r_pwm_clk.common.hw, > +               [CLK_R_BUS_PWM]         = &r_bus_pwm_clk.common.hw, > +               [CLK_R_CODEC_ADC]       = &r_codec_adc_clk.common.hw, > +               [CLK_R_CODEC_DAC]       = &r_codec_dac_clk.common.hw, > +               [CLK_R_BUS_CODEC]       = &r_bus_codec_clk.common.hw, > +               [CLK_R_DMIC]            = &r_dmic_clk.common.hw, > +               [CLK_R_BUS_DMIC]        = &r_bus_dmic_clk.common.hw, > +               [CLK_R_BUS_LRADC]       = &r_bus_lradc_clk.common.hw, > +               [CLK_R_I2S]             = &r_i2s_clk.common.hw, > +               [CLK_R_I2S_ASRC]        = &r_i2s_asrc_clk.common.hw, > +               [CLK_R_BUS_I2S]         = &r_bus_i2s_clk.common.hw, > +               [CLK_R_BUS_UART]        = &r_bus_uart_clk.common.hw, > +               [CLK_R_BUS_I2C]         = &r_bus_i2c_clk.common.hw, > +               [CLK_R_IR]              = &r_ir_clk.common.hw, > +               [CLK_R_BUS_IR]          = &r_bus_ir_clk.common.hw, > +               [CLK_R_BUS_MSGBOX]      = > &r_bus_msgbox_clk.common.hw, > +               [CLK_R_BUS_SPINLOCK]    = > &r_bus_spinlock_clk.common.hw, > +               [CLK_R_BUS_RTC]         = &r_bus_rtc_clk.common.hw, > +       }, > +       .num = CLK_NUMBER, > +}; > + > +static struct ccu_reset_map sun50i_r329_r_ccu_resets[] = { > +       [RST_R_BUS_GPADC]       = { 0x0ec, BIT(16) }, > +       [RST_R_BUS_THS]         = { 0x0fc, BIT(16) }, > +       [RST_R_BUS_DMA]         = { 0x10c, BIT(16) }, > +       [RST_R_BUS_PWM]         = { 0x13c, BIT(16) }, > +       [RST_R_BUS_CODEC]       = { 0x14c, BIT(16) }, > +       [RST_R_BUS_DMIC]        = { 0x15c, BIT(16) }, > +       [RST_R_BUS_LRADC]       = { 0x16c, BIT(16) }, > +       [RST_R_BUS_I2S]         = { 0x17c, BIT(16) }, > +       [RST_R_BUS_UART]        = { 0x18c, BIT(16) }, > +       [RST_R_BUS_I2C]         = { 0x19c, BIT(16) }, > +       [RST_R_BUS_IR]          = { 0x1cc, BIT(16) }, > +       [RST_R_BUS_MSGBOX]      = { 0x1dc, BIT(16) }, > +       [RST_R_BUS_SPINLOCK]    = { 0x1ec, BIT(16) }, > +       [RST_R_BUS_RTC]         = { 0x20c, BIT(16) }, > +}; > + > +static const struct sunxi_ccu_desc sun50i_r329_r_ccu_desc = { > +       .ccu_clks       = sun50i_r329_r_ccu_clks, > +       .num_ccu_clks   = ARRAY_SIZE(sun50i_r329_r_ccu_clks), > + > +       .hw_clks        = &sun50i_r329_r_hw_clks, > + > +       .resets         = sun50i_r329_r_ccu_resets, > +       .num_resets     = ARRAY_SIZE(sun50i_r329_r_ccu_resets), > +}; > + > +static const u32 pll_regs[] = { > +       SUN50I_R329_PLL_CPUX_REG, > +       SUN50I_R329_PLL_PERIPH_REG, > +       SUN50I_R329_PLL_AUDIO0_REG, > +       SUN50I_R329_PLL_AUDIO1_REG, > +}; > + > +static void __init sun50i_r329_r_ccu_setup(struct device_node *node) > +{ > +       void __iomem *reg; > +       u32 val; > +       int i; > + > +       reg = of_io_request_and_map(node, 0, > of_node_full_name(node)); > +       if (IS_ERR(reg)) { > +               pr_err("%pOF: Could not map clock registers\n", > node); > +               return; > +       } > + > +       /* Enable the lock bits and the output enable bits on all > PLLs */ > +       for (i = 0; i < ARRAY_SIZE(pll_regs); i++) { > +               val = readl(reg + pll_regs[i]); > +               val |= BIT(29) | BIT(27); > +               writel(val, reg + pll_regs[i]); > +       } > + > +       /* > +        * Force the I/O dividers of PLL-AUDIO1 to reset default > value > +        * > +        * See the comment before pll-audio1 definition for the > reason. > +        */ > + > +       val = readl(reg + SUN50I_R329_PLL_AUDIO1_REG); > +       val &= ~BIT(1); > +       val |= BIT(0); > +       writel(val, reg + SUN50I_R329_PLL_AUDIO1_REG); > + > +       i = sunxi_ccu_probe(node, reg, &sun50i_r329_r_ccu_desc); > +       if (i) > +               pr_err("%pOF: probing clocks fails: %d\n", node, i); > +} > + > +CLK_OF_DECLARE(sun50i_r329_r_ccu, "allwinner,sun50i-r329-r-ccu", > +              sun50i_r329_r_ccu_setup); > diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-r329-r.h > b/drivers/clk/sunxi-ng/ccu-sun50i-r329-r.h > new file mode 100644 > index 000000000000..62cf65322116 > --- /dev/null > +++ b/drivers/clk/sunxi-ng/ccu-sun50i-r329-r.h > @@ -0,0 +1,33 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (c) 2021 Sipeed > + */ > + > +#ifndef _CCU_SUN50I_R329_R_H > +#define _CCU_SUN50I_R329_R_H > + > +#include > +#include > + > +#define CLK_PLL_CPUX           0 > +#define CLK_PLL_PERIPH_BASE    1 > +#define CLK_PLL_PERIPH_2X      2 > +#define CLK_PLL_PERIPH_800M    3 > +#define CLK_PLL_PERIPH         4 > +#define CLK_PLL_AUDIO0         5 > +#define CLK_PLL_AUDIO0_DIV2    6 > +#define CLK_PLL_AUDIO0_DIV5    7 > +#define CLK_PLL_AUDIO1_4X      8 > +#define CLK_PLL_AUDIO1_2X      9 > +#define CLK_PLL_AUDIO1         10 > +#define CLK_R_AHB              11 > + > +/* R_APB1 exported for PIO */ > + > +#define CLK_R_APB2             13 > + > +/* All module / bus gate clocks exported */ > + > +#define CLK_NUMBER     (CLK_R_BUS_RTC + 1) > + > +#endif /* _CCU_SUN50I_R329_R_H */ > diff --git a/include/dt-bindings/clock/sun50i-r329-r-ccu.h > b/include/dt-bindings/clock/sun50i-r329-r-ccu.h > new file mode 100644 > index 000000000000..df9bc58de5c4 > --- /dev/null > +++ b/include/dt-bindings/clock/sun50i-r329-r-ccu.h > @@ -0,0 +1,33 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Copyright (c) 2021 Sipeed > + */ > + > +#ifndef _DT_BINDINGS_CLK_SUN50I_R329_R_CCU_H_ > +#define _DT_BINDINGS_CLK_SUN50I_R329_R_CCU_H_ > + > +#define CLK_R_APB1             12 > + > +#define CLK_R_BUS_GPADC                14 > +#define CLK_R_BUS_THS          15 > +#define CLK_R_BUS_DMA          16 > +#define CLK_R_PWM              17 > +#define CLK_R_BUS_PWM          18 > +#define CLK_R_CODEC_ADC                19 > +#define CLK_R_CODEC_DAC                20 > +#define CLK_R_BUS_CODEC                21 > +#define CLK_R_DMIC             22 > +#define CLK_R_BUS_DMIC         23 > +#define CLK_R_BUS_LRADC                24 > +#define CLK_R_I2S              25 > +#define CLK_R_I2S_ASRC         26 > +#define CLK_R_BUS_I2S          27 > +#define CLK_R_BUS_UART         28 > +#define CLK_R_BUS_I2C          29 > +#define CLK_R_IR               30 > +#define CLK_R_BUS_IR           31 > +#define CLK_R_BUS_MSGBOX       32 > +#define CLK_R_BUS_SPINLOCK     33 > +#define CLK_R_BUS_RTC          34 > + > +#endif /* _DT_BINDINGS_CLK_SUN50I_R329_R_CCU_H_ */ > diff --git a/include/dt-bindings/reset/sun50i-r329-r-ccu.h > b/include/dt-bindings/reset/sun50i-r329-r-ccu.h > new file mode 100644 > index 000000000000..40644f2f21c6 > --- /dev/null > +++ b/include/dt-bindings/reset/sun50i-r329-r-ccu.h > @@ -0,0 +1,24 @@ > +/* SPDX-License-Identifier: (GPL-2.0+ or MIT) */ > +/* > + * Copyright (c) 2021 Sipeed > + */ > + > +#ifndef _DT_BINDINGS_RST_SUN50I_R329_R_CCU_H_ > +#define _DT_BINDINGS_RST_SUN50I_R329_R_CCU_H_ > + > +#define RST_R_BUS_GPADC                0 > +#define RST_R_BUS_THS          1 > +#define RST_R_BUS_DMA          2 > +#define RST_R_BUS_PWM          3 > +#define RST_R_BUS_CODEC                4 > +#define RST_R_BUS_DMIC         5 > +#define RST_R_BUS_LRADC                6 > +#define RST_R_BUS_I2S          7 > +#define RST_R_BUS_UART         8 > +#define RST_R_BUS_I2C          9 > +#define RST_R_BUS_IR           10 > +#define RST_R_BUS_MSGBOX       11 > +#define RST_R_BUS_SPINLOCK     12 > +#define RST_R_BUS_RTC          13 > + > +#endif /* _DT_BINDINGS_RST_SUN50I_R329_R_CCU_H_ */ 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=-13.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,INVALID_MSGID,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 7154AC4338F for ; Mon, 2 Aug 2021 09:56:49 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 2A94260F58 for ; Mon, 2 Aug 2021 09:56:49 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 2A94260F58 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=sipeed.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:Cc:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=1yo2ZRMxVoOBOn9ftR4z9DwHkwDi9s8FgdvqacIz/VA=; b=eC9dLGTYi5dfnu CPvSl97S2UdDypS0FOZVC5Z8sJbyy8pn7ujdALkifTDvTLKw+ZwM8Aq587OuNBahqLc4k48noNAft GB+KAwx2Lw3hxV3fwdWbVmr8p9du10N6MxxTw69nAzj0xie5luySfRIlRM7GMcRs5h/VOrBo57sfA RX9KkLJ/Tk1K7iQOi5qSSLa8qDsqDcYjT85p/FtWiW/r9rMmWRBS4JCDc6awm3aHbcmGsTIeFcgD2 ahUmD6EXsRixc1AZfcFGW9Wl4FBr2+MXu2b+i71Wwvy9aXcadmdIe2tBj+Oz6ZBjBDJJsvz8RZLNj wyoMa63EozN67ZGHxehA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mAUel-00FdSm-Vj; Mon, 02 Aug 2021 09:54:48 +0000 Received: from smtpbg127.qq.com ([109.244.180.96] helo=smtpbg.qq.com) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mAUec-00FdOA-7u for linux-arm-kernel@lists.infradead.org; Mon, 02 Aug 2021 09:54:45 +0000 X-QQ-mid: bizesmtp37t1627897973tswe4cud Received: from [192.168.0.46] (unknown [113.89.245.207]) by esmtp6.qq.com (ESMTP) with id ; Mon, 02 Aug 2021 17:52:52 +0800 (CST) X-QQ-SSF: 00100000002000209000D00A0000000 X-QQ-FEAT: JN+C/NT9bLPnvSsDS+Rz5vENXxe8N1Wx5bYyvoQrGp+sPrsGLouO+1xgixt/q NfkCKAK6dwEnwhDPKnkIpw2orTv5S5EdN6G7Whb5Q28rwCAQa8BbhYuwQSdTFvo61PT0KbA ZBhwv+4FX13cQHMGW71XLRDjIedT3Em9C1yS9W++FfNcvwLb+hrtWNjBelXiy6Icc0e68in eo1TGiIfwBmFGsjyCp/3LBUs8C+zSZO6ODtsMnA2YOxx60rx7CIVYmR7qtTtA9fBt21PZf7 uPk8UtAgSYlitN05XCZN6qhjZsHIkWWi2ZmRC0+Rp6VCAehK17/4dmxnuU5NWWJQbupXRKM 6PzNQfVDqTdLHAnUElS7uEbvyKWa+O9wyActyMG X-QQ-GoodBg: 0 Message-ID: +B00387BDD8D62B3B Subject: Re: [PATCH 10/17] clk: sunxi=ng: add support for R329 R-CCU From: Icenowy Zheng To: Rob Herring , Maxime Ripard , Chen-Yu Tsai , Jernej Skrabec , Ulf Hansson , Linus Walleij , Alexandre Belloni , Andre Przywara , Samuel Holland Cc: devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org Date: Mon, 02 Aug 2021 17:52:52 +0800 In-Reply-To: <20210802062212.73220-11-icenowy@sipeed.com> References: <20210802062212.73220-1-icenowy@sipeed.com> <20210802062212.73220-11-icenowy@sipeed.com> Organization: Sipeed User-Agent: Evolution 3.40.0 MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:sipeed.com:qybgspam:qybgspam1 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210802_025438_866868_DC5421AF X-CRM114-Status: GOOD ( 28.28 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , 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 5ZyoIDIwMjEtMDgtMDLmmJ/mnJ/kuIDnmoQgMTQ6MjIgKzA4MDDvvIxJY2Vub3d5IFpoZW5n5YaZ 6YGT77yaCj4gQWxsd2lubmVyIFIzMjkgaGFzIGNsb2NrIGNvbnRyb2xzIGluIFBSQ00sIGxpa2Ug b3RoZXIgbmV3IEFsbHdpbm5lcgo+IFNvQ3MuCj4gCj4gQWRkIHN1cHBvcnQgZm9yIHRoZW0uCj4g Cj4gVGhpcyBkcml2ZXIgaXMgYWRkZWQgYmVmb3JlIHRoZSBtYWluIENDVSBiZWNhdXNlIFBMTHMg YXJlIGNvbnRyb2xsZWQKPiBieQo+IFItQ0NVIG9uIFIzMjkuCj4gCj4gU2lnbmVkLW9mZi1ieTog SWNlbm93eSBaaGVuZyA8aWNlbm93eUBzaXBlZWQuY29tPgo+IC0tLQo+IMKgZHJpdmVycy9jbGsv c3VueGktbmcvS2NvbmZpZ8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqAg NSArCj4gwqBkcml2ZXJzL2Nsay9zdW54aS1uZy9NYWtlZmlsZcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHzCoMKgIDEgKwo+IMKgZHJpdmVycy9jbGsvc3VueGktbmcvY2N1LXN1bjUw aS1yMzI5LXIuY8KgwqDCoMKgwqAgfCAzNzQKPiArKysrKysrKysrKysrKysrKysKPiDCoGRyaXZl cnMvY2xrL3N1bnhpLW5nL2NjdS1zdW41MGktcjMyOS1yLmjCoMKgwqDCoMKgIHzCoCAzMyArKwo+ IMKgaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9zdW41MGktcjMyOS1yLWNjdS5oIHzCoCAzMyAr Kwo+IMKgaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9zdW41MGktcjMyOS1yLWNjdS5oIHzCoCAy NCArKwo+IMKgNiBmaWxlcyBjaGFuZ2VkLCA0NzAgaW5zZXJ0aW9ucygrKQo+IMKgY3JlYXRlIG1v ZGUgMTAwNjQ0IGRyaXZlcnMvY2xrL3N1bnhpLW5nL2NjdS1zdW41MGktcjMyOS1yLmMKPiDCoGNy ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNTBpLXIzMjktci5o Cj4gwqBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9zdW41MGkt cjMyOS1yLWNjdS5oCj4gwqBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9kdC1iaW5kaW5ncy9y ZXNldC9zdW41MGktcjMyOS1yLWNjdS5oCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL3N1 bnhpLW5nL0tjb25maWcgYi9kcml2ZXJzL2Nsay9zdW54aS0KPiBuZy9LY29uZmlnCj4gaW5kZXgg Y2Q0NmQ4ODUzODc2Li5lNDliMmMyZmE1YjcgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9jbGsvc3Vu eGktbmcvS2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvY2xrL3N1bnhpLW5nL0tjb25maWcKPiBAQCAt NDIsNiArNDIsMTEgQEAgY29uZmlnIFNVTjUwSV9INl9SX0NDVQo+IMKgwqDCoMKgwqDCoMKgwqBk ZWZhdWx0IEFSTTY0ICYmIEFSQ0hfU1VOWEkKPiDCoMKgwqDCoMKgwqDCoMKgZGVwZW5kcyBvbiAo QVJNNjQgJiYgQVJDSF9TVU5YSSkgfHwgQ09NUElMRV9URVNUCj4gwqAKPiArY29uZmlnIFNVTjUw SV9SMzI5X1JfQ0NVCj4gK8KgwqDCoMKgwqDCoMKgYm9vbCAiU3VwcG9ydCBmb3IgdGhlIEFsbHdp bm5lciBSMzI5IFBSQ00gQ0NVIgo+ICvCoMKgwqDCoMKgwqDCoGRlZmF1bHQgQVJNNjQgJiYgQVJD SF9TVU5YSQo+ICvCoMKgwqDCoMKgwqDCoGRlcGVuZHMgb24gKEFSTTY0ICYmIEFSQ0hfU1VOWEkp IHx8IENPTVBJTEVfVEVTVAo+ICsKPiDCoGNvbmZpZyBTVU40SV9BMTBfQ0NVCj4gwqDCoMKgwqDC oMKgwqDCoGJvb2wgIlN1cHBvcnQgZm9yIHRoZSBBbGx3aW5uZXIgQTEwL0EyMCBDQ1UiCj4gwqDC oMKgwqDCoMKgwqDCoGRlZmF1bHQgTUFDSF9TVU40SQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Ns ay9zdW54aS1uZy9NYWtlZmlsZSBiL2RyaXZlcnMvY2xrL3N1bnhpLQo+IG5nL01ha2VmaWxlCj4g aW5kZXggOTZjMzI0MzA2ZDk3Li5kYjMzOGEyMTg4ZmQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9j bGsvc3VueGktbmcvTWFrZWZpbGUKPiArKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9NYWtlZmls ZQo+IEBAIC0yOCw2ICsyOCw3IEBAIG9iai0kKENPTkZJR19TVU41MElfQTEwMF9SX0NDVSnCoMKg wqDCoMKgwqDCoCs9IGNjdS0KPiBzdW41MGktYTEwMC1yLm8KPiDCoG9iai0kKENPTkZJR19TVU41 MElfSDZfQ0NVKcKgwqDCoMKgKz0gY2N1LXN1bjUwaS1oNi5vCj4gwqBvYmotJChDT05GSUdfU1VO NTBJX0g2MTZfQ0NVKcKgwqArPSBjY3Utc3VuNTBpLWg2MTYubwo+IMKgb2JqLSQoQ09ORklHX1NV TjUwSV9INl9SX0NDVSnCoMKgKz0gY2N1LXN1bjUwaS1oNi1yLm8KPiArb2JqLSQoQ09ORklHX1NV TjUwSV9SMzI5X1JfQ0NVKcKgwqDCoMKgwqDCoMKgwqArPSBjY3Utc3VuNTBpLXIzMjktci5vCj4g wqBvYmotJChDT05GSUdfU1VONElfQTEwX0NDVSnCoMKgwqDCoCs9IGNjdS1zdW40aS1hMTAubwo+ IMKgb2JqLSQoQ09ORklHX1NVTjVJX0NDVSnCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCs9IGNjdS1zdW41aS5vCj4gwqBvYmotJChDT05GSUdfU1VONklfQTMxX0NDVSnCoMKgwqDCoCs9 IGNjdS1zdW42aS1hMzEubwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Ut c3VuNTBpLXIzMjktci5jCj4gYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNTBpLXIzMjkt ci5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjU0MTNhNzAx Y2I1Nwo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3Vu NTBpLXIzMjktci5jCj4gQEAgLTAsMCArMSwzNzQgQEAKPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50 aWZpZXI6IEdQTC0yLjAKPiArLyoKPiArICogQ29weXJpZ2h0IChjKSAyMDIxIFNpcGVlZAo+ICsg KiBCYXNlZCBvbiB0aGUgSDYxNiBDQ1UgZHJpdmVyLCB3aGljaCBpczoKPiArICrCoMKgIENvcHly aWdodCAoYykgMjAyMCBBcm0gTHRkLgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9jbGst cHJvdmlkZXIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2lvLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9v Zl9hZGRyZXNzLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KPiArCj4g KyNpbmNsdWRlICJjY3VfY29tbW9uLmgiCj4gKyNpbmNsdWRlICJjY3VfcmVzZXQuaCIKPiArCj4g KyNpbmNsdWRlICJjY3VfZGl2LmgiCj4gKyNpbmNsdWRlICJjY3VfZ2F0ZS5oIgo+ICsjaW5jbHVk ZSAiY2N1X21wLmgiCj4gKyNpbmNsdWRlICJjY3VfbXVsdC5oIgo+ICsjaW5jbHVkZSAiY2N1X25r LmgiCj4gKyNpbmNsdWRlICJjY3VfbmttLmgiCj4gKyNpbmNsdWRlICJjY3VfbmttcC5oIgo+ICsj aW5jbHVkZSAiY2N1X25tLmgiCj4gKwo+ICsjaW5jbHVkZSAiY2N1LXN1bjUwaS1yMzI5LXIuaCIK PiArCj4gKy8qCj4gKyAqIFRoZSBNIGZhY3RvciBpcyBwcmVzZW50IGluIHRoZSByZWdpc3Rlcidz IGRlc2NyaXB0aW9uLCBidXQgbm90IGluCj4gdGhlCj4gKyAqIGZyZXF1ZW5jeSBmb3JtdWxhLCBh bmQgaXQncyBkb2N1bWVudGVkIGFzICJUaGUgYml0IGlzIG9ubHkgZm9yCj4gKyAqIHRlc3Rpbmci LCBzbyBpdCdzIG5vdCBtb2RlbGxlZCBhbmQgdGhlbiBmb3JjZSB0byAwLgo+ICsgKi8KPiArI2Rl ZmluZSBTVU41MElfUjMyOV9QTExfQ1BVWF9SRUfCoMKgwqDCoMKgwqDCoDB4MTAwMAo+ICtzdGF0 aWMgc3RydWN0IGNjdV9tdWx0IHBsbF9jcHV4X2NsayA9IHsKPiArwqDCoMKgwqDCoMKgwqAuZW5h YmxlwqDCoMKgwqDCoMKgwqDCoMKgPSBCSVQoMzEpLAo+ICvCoMKgwqDCoMKgwqDCoC5sb2NrwqDC oMKgwqDCoMKgwqDCoMKgwqDCoD0gQklUKDI4KSwKPiArwqDCoMKgwqDCoMKgwqAubXVsdMKgwqDC oMKgwqDCoMKgwqDCoMKgwqA9IF9TVU5YSV9DQ1VfTVVMVF9NSU4oOCwgOCwgMTIpLAo+ICvCoMKg wqDCoMKgwqDCoC5jb21tb27CoMKgwqDCoMKgwqDCoMKgwqA9IHsKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgLnJlZ8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoD0gMHgxMDAwLAo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAuaHcuaW5pdMKgwqDCoMKgwqDCoMKgwqA9IENM S19IV19JTklUKCJwbGwtY3B1eCIsICJvc2MyNE0iLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgICZjY3VfbXVsdF9vcHMsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgQ0xLX1NFVF9SQVRFX1VOR0FURSksCj4gK8KgwqDCoMKgwqDCoMKgfSwKPiArfTsKPiArCj4g KyNkZWZpbmUgU1VONTBJX1IzMjlfUExMX1BFUklQSF9SRUfCoMKgwqDCoMKgMHgxMDEwCj4gK3N0 YXRpYyBzdHJ1Y3QgY2N1X25tIHBsbF9wZXJpcGhfYmFzZV9jbGsgPSB7Cj4gK8KgwqDCoMKgwqDC oMKgLmVuYWJsZcKgwqDCoMKgwqDCoMKgwqDCoD0gQklUKDMxKSwKPiArwqDCoMKgwqDCoMKgwqAu bG9ja8KgwqDCoMKgwqDCoMKgwqDCoMKgwqA9IEJJVCgyOCksCj4gK8KgwqDCoMKgwqDCoMKgLm7C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgPSBfU1VOWElfQ0NVX01VTFRfTUlOKDgsIDgsIDEy KSwKPiArwqDCoMKgwqDCoMKgwqAubcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA9IF9TVU5Y SV9DQ1VfRElWKDEsIDEpLCAvKiBpbnB1dCBkaXZpZGVyICovCj4gK8KgwqDCoMKgwqDCoMKgLmNv bW1vbsKgwqDCoMKgwqDCoMKgwqDCoD0gewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAucmVnwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgPSAweDEwMTAsCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoC5ody5pbml0wqDCoMKgwqDCoMKgwqDCoD0gQ0xLX0hXX0lOSVQoInBs bC1wZXJpcGgtYmFzZSIsCj4gIm9zYzI0TSIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgJmNjdV9ubV9vcHMsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQ0xL X1NFVF9SQVRFX1VOR0FURSksCj4gK8KgwqDCoMKgwqDCoMKgfSwKPiArfTsKPiArCj4gK3N0YXRp YyBTVU5YSV9DQ1VfTShwbGxfcGVyaXBoXzJ4X2NsaywgInBsbC1wZXJpcGgtMngiLCAicGxsLXBl cmlwaC0KPiBiYXNlIiwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAweDEw MTAsIDE2LCAzLCAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9NKHBsbF9wZXJpcGhfODAwbV9jbGss ICJwbGwtcGVyaXBoLTgwMG0iLCAicGxsLQo+IHBlcmlwaC1iYXNlIiwKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAweDEwMTAsIDIwLCAzLCAwKTsKPiArc3RhdGljIENMS19G SVhFRF9GQUNUT1JfSFcocGxsX3BlcmlwaF9jbGssICJwbGwtcGVyaXBoIiwKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJnBsbF9wZXJpcGhfMnhf Y2xrLmNvbW1vbi5odywgMiwgMSwgMCk7Cj4gKwo+ICsjZGVmaW5lIFNVTjUwSV9SMzI5X1BMTF9B VURJTzBfUkVHwqDCoMKgwqDCoDB4MTAyMAo+ICtzdGF0aWMgc3RydWN0IGNjdV9zZG1fc2V0dGlu ZyBwbGxfYXVkaW8wX3NkbV90YWJsZVtdID0gewo+ICvCoMKgwqDCoMKgwqDCoHsgLnJhdGUgPSAx NTQ4Mjg4MDAwLCAucGF0dGVybiA9IDB4YzAwNzA2MjQsIC5tID0gMSwgLm4gPSA2NAo+IH0sCj4g K307Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGNjdV9ubSBwbGxfYXVkaW8wX2NsayA9IHsKPiArwqDC oMKgwqDCoMKgwqAuZW5hYmxlwqDCoMKgwqDCoMKgwqDCoMKgPSBCSVQoMzEpLAo+ICvCoMKgwqDC oMKgwqDCoC5sb2NrwqDCoMKgwqDCoMKgwqDCoMKgwqDCoD0gQklUKDI4KSwKPiArwqDCoMKgwqDC oMKgwqAubsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA9IF9TVU5YSV9DQ1VfTVVMVF9NSU4o OCwgOCwgMTIpLAo+ICvCoMKgwqDCoMKgwqDCoC5twqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oD0gX1NVTlhJX0NDVV9ESVYoMSwgMSksCj4gK8KgwqDCoMKgwqDCoMKgLnNkbcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoD0gX1NVTlhJX0NDVV9TRE0ocGxsX2F1ZGlvMF9zZG1fdGFibGUsCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBCSVQoMjQpLCAweDExMjAsIEJJVCgzMSkpLAo+ICvCoMKgwqDC oMKgwqDCoC5jb21tb27CoMKgwqDCoMKgwqDCoMKgwqA9IHsKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgLmZlYXR1cmVzwqDCoMKgwqDCoMKgwqA9IENDVV9GRUFUVVJFX1NJR01BX0RF TFRBX01PRCwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLnJlZ8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoD0gMHgxMDIwLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAu aHcuaW5pdMKgwqDCoMKgwqDCoMKgwqA9IENMS19IV19JTklUKCJwbGwtYXVkaW8wIiwgIm9zYzI0 TSIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJmNjdV9ubV9vcHMsCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQ0xLX1NFVF9SQVRFX1VOR0FURSksCj4gK8Kg wqDCoMKgwqDCoMKgfSwKPiArfTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfTShwbGxfYXVkaW8w X2RpdjJfY2xrLCAicGxsLWF1ZGlvMC1kaXYyIiwgInBsbC0KPiBhdWRpbzAiLAo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDB4MTAyMCwgMTYsIDMsIDApOwo+ICtzdGF0aWMg U1VOWElfQ0NVX00ocGxsX2F1ZGlvMF9kaXY1X2NsaywgInBsbC1hdWRpbzAtZGl2NSIsICJwbGwt Cj4gYXVkaW8wIiwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAweDEwMjAs IDIwLCAzLCAwKTsKPiArCj4gKy8qCj4gKyAqIFBMTC1BVURJTzEgaGFzIDMgZGl2aWRlcnMgZGVm aW5lZCBpbiB0aGUgZGF0YXNoZWV0LCBob3dldmVyIHRoZQo+ICsgKiBCU1AgZHJpdmVyIGFsd2F5 cyBoYXMgTTAgPSAxIGFuZCBNMSA9IDIgKHRoaXMgaXMgYWxzbyB0aGUKPiArICogcmVzZXQgdmFs dWUgaW4gdGhlIHJlZ2lzdGVyKS4KPiArICoKPiArICogSGVyZSBqdXN0IG1vZHVsZSBpdCBhcyBO TSBjbG9jaywgYW5kIGZvcmNlIE0wID0gMSBhbmQgTTEgPSAyLgo+ICsgKi8KPiArI2RlZmluZSBT VU41MElfUjMyOV9QTExfQVVESU8xX1JFR8KgwqDCoMKgwqAweDEwMzAKPiArc3RhdGljIHN0cnVj dCBjY3Vfc2RtX3NldHRpbmcgcGxsX2F1ZGlvMV80eF9zZG1fdGFibGVbXSA9IHsKPiArwqDCoMKg wqDCoMKgwqB7IC5yYXRlID0gMjI1NzkyMDAsIC5wYXR0ZXJuID0gMHhjMDAxMjg4ZCwgLm0gPSAx MiwgLm4gPSAyMgo+IH0sCj4gK8KgwqDCoMKgwqDCoMKgeyAucmF0ZSA9IDI0NTc2MDAwLCAucGF0 dGVybiA9IDB4YzAwMTI2ZTksIC5tID0gMTIsIC5uID0gMjQKPiB9LAo+ICvCoMKgwqDCoMKgwqDC oHsgLnJhdGUgPSA5MDMxNjgwMCwgLnBhdHRlcm4gPSAweGMwMDEyODhkLCAubSA9IDMsIC5uID0g MjIgfSwKPiArwqDCoMKgwqDCoMKgwqB7IC5yYXRlID0gOTgzMDQwMDAsIC5wYXR0ZXJuID0gMHhj MDAxMjZlOSwgLm0gPSAzLCAubiA9IDI0IH0sCj4gK307CgpTb3JyeSwgdGhlIFNETSB0YWJsZSBo ZXJlIGlzIHdyb25nIC0tIGFsbCByYXRlIGhlcmUgc2hvdWxkIGJlICoyCihiZWNhdXNlIEkgd3Jv bmdseSBhc3N1bWVkIGhvdyBwb3N0ZGl2IHdvcmtzIHdpdGggc2RtKS4KCj4gK3N0YXRpYyBzdHJ1 Y3QgY2N1X25tIHBsbF9hdWRpbzFfNHhfY2xrID0gewo+ICvCoMKgwqDCoMKgwqDCoC5lbmFibGXC oMKgwqDCoMKgwqDCoMKgwqA9IEJJVCgzMSksCj4gK8KgwqDCoMKgwqDCoMKgLmxvY2vCoMKgwqDC oMKgwqDCoMKgwqDCoMKgPSBCSVQoMjgpLAo+ICvCoMKgwqDCoMKgwqDCoC5uwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoD0gX1NVTlhJX0NDVV9NVUxUX01JTig4LCA4LCAxMiksCj4gK8KgwqDC oMKgwqDCoMKgLm3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgPSBfU1VOWElfQ0NVX0RJVigx NiwgNiksCj4gK8KgwqDCoMKgwqDCoMKgLmZpeGVkX3Bvc3RfZGl2wqA9IDIsCj4gK8KgwqDCoMKg wqDCoMKgLnNkbcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoD0gX1NVTlhJX0NDVV9TRE0ocGxsX2F1 ZGlvMV80eF9zZG1fdGFibGUsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBCSVQoMjQpLCAweDEx MzAsIEJJVCgzMSkpLAo+ICvCoMKgwqDCoMKgwqDCoC5jb21tb27CoMKgwqDCoMKgwqDCoMKgwqA9 IHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLmZlYXR1cmVzwqDCoMKgwqDCoMKg wqA9IENDVV9GRUFUVVJFX0ZJWEVEX1BPU1RESVYgfAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIENDVV9GRUFUVVJFX1NJ R01BX0RFTFRBX01PRCwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLnJlZ8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoD0gMHgxMDMwLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAuaHcuaW5pdMKgwqDCoMKgwqDCoMKgwqA9IENMS19IV19JTklUKCJwbGwtYXVkaW8xLTR4 IiwKPiAib3NjMjRNIiwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmY2N1X25t X29wcywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBDTEtfU0VUX1JBVEVfVU5H QVRFKSwKPiArwqDCoMKgwqDCoMKgwqB9LAo+ICt9Owo+ICsKPiArc3RhdGljIENMS19GSVhFRF9G QUNUT1JfSFcocGxsX2F1ZGlvMV8yeF9jbGssICJwbGwtYXVkaW8xLTJ4IiwKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgJnBsbF9hdWRpbzFfNHhf Y2xrLmNvbW1vbi5odywgMiwgMSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgQ0xLX1NFVF9SQVRFX1BBUkVOVCk7Cj4gK3N0YXRpYyBDTEtfRklY RURfRkFDVE9SX0hXKHBsbF9hdWRpbzFfY2xrLCAicGxsLWF1ZGlvMSIsCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZwbGxfYXVkaW8xXzR4X2Ns ay5jb21tb24uaHcsIDQsIDEsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIENMS19TRVRfUkFURV9QQVJFTlQpOwo+ICsKPiArc3RhdGljIGNvbnN0 IGNoYXIgKiBjb25zdCByX2J1c19wYXJlbnRzW10gPSB7ICJvc2MyNE0iLCAib3NjMzJrIiwKPiAi aW9zYyIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgInBsbC1wZXJpcGgtMngi LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJwbGwtYXVkaW8wLWRpdjIiIH07 Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVgocl9haGJfY2xrLCAici1haGIiLCByX2J1 c19wYXJlbnRzLAo+IDB4MDAwLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgMCwgNSzCoMKgwqDCoMKgwqAvKiBNICovCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCA4LCAyLMKgwqDC oMKgwqDCoC8qIFAgKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIDI0LCAzLMKgwqDCoMKgwqAvKiBtdXggKi8KPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDApOwo+ICsKPiArc3Rh dGljIFNVTlhJX0NDVV9NUF9XSVRIX01VWChyX2FwYjFfY2xrLCAici1hcGIxIiwgcl9idXNfcGFy ZW50cywKPiAweDAwYywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIDAsIDUswqDCoMKgwqDCoMKgLyogTSAqLwo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOCwgMizCoMKgwqDCoMKg wqAvKiBQICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAyNCwgMyzCoMKgwqDCoMKgLyogbXV4ICovCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAwKTsKPiArCj4gK3N0YXRpYyBT VU5YSV9DQ1VfTVBfV0lUSF9NVVgocl9hcGIyX2NsaywgInItYXBiMiIsIHJfYnVzX3BhcmVudHMs Cj4gMHgwMTAsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAwLCA1LMKgwqDCoMKgwqDCoC8qIE0gKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDgsIDIswqDCoMKgwqDCoMKgLyog UCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgMjQsIDMswqDCoMKgwqDCoC8qIG11eCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElf Q0NVX0dBVEUocl9idXNfZ3BhZGNfY2xrLCAici1idXMtZ3BhZGMiLCAici1hcGIxIiwKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAweDBlYywgQklUKDApLCAwKTsK PiArc3RhdGljIFNVTlhJX0NDVV9HQVRFKHJfYnVzX3Roc19jbGssICJyLWJ1cy10aHMiLCAici1h cGIxIiwgMHgwZmMsCj4gQklUKDApLCAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShy X2J1c19kbWFfY2xrLCAici1idXMtZG1hIiwgInItYXBiMSIsIDB4MTBjLAo+IEJJVCgwKSwgMCk7 Cj4gKwo+ICtzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJfcHdtX3BhcmVudHNbXSA9IHsgIm9z YzI0TSIsICJvc2MzMmsiLAo+ICJpb3NjIiB9Owo+ICtzdGF0aWMgU1VOWElfQ0NVX01VWF9XSVRI X0dBVEUocl9wd21fY2xrLCAici1wd20iLCByX3B3bV9wYXJlbnRzLAo+IDB4MTMwLAo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDI0 LCAzLMKgwqDCoC8qIG11eCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEJJVCgzMSkswqAvKiBnYXRlICovCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMCk7Cj4g Kwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEUocl9idXNfcHdtX2NsaywgInItYnVzLXB3bSIsICJy LWFwYjEiLCAweDEzYywKPiBCSVQoMCksIDApOwo+ICsKPiArc3RhdGljIGNvbnN0IGNoYXIgKiBj b25zdCByX2F1ZGlvX3BhcmVudHNbXSA9IHsgInBsbC1hdWRpbzAtZGl2NSIsCj4gInBsbC1hdWRp bzAtZGl2MiIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAicGxsLWF1 ZGlvMS0xeCIsCj4gInBsbC1hdWRpbzEtNHgiIH07Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lU SF9NVVhfR0FURShyX2NvZGVjX2FkY19jbGssICJyLWNvZGVjLWFkYyIsCj4gcl9hdWRpb19wYXJl bnRzLCAweDE0MCwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAwLCA1LMKgwqDCoMKgwqDCoMKgwqDCoC8qIE0gKi8KPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCA4LCAyLMKgwqDCoMKgwqDCoMKgwqDCoC8qIFAgKi8KPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAyNCwgMyzC oMKgwqDCoMKgwqDCoMKgLyogbXV4ICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQklUKDMxKSzCoMKgwqDCoMKgwqAv KiBnYXRlICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhf R0FURShyX2NvZGVjX2RhY19jbGssICJyLWNvZGVjLWRhYyIsCj4gcl9hdWRpb19wYXJlbnRzLCAw eDE0NCwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAwLCA1LMKgwqDCoMKgwqDCoMKgwqDCoC8qIE0gKi8KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCA4LCAyLMKgwqDCoMKgwqDCoMKgwqDCoC8qIFAgKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAyNCwgMyzCoMKgwqDC oMKgwqDCoMKgLyogbXV4ICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQklUKDMxKSzCoMKgwqDCoMKgwqAvKiBnYXRl ICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEUocl9idXNfY29k ZWNfY2xrLCAici1idXMtY29kZWMiLCAici1hcGIxIiwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAweDE0YywgQklUKDApLCAwKTsKPiArCj4gK3N0YXRpYyBTVU5Y SV9DQ1VfTVBfV0lUSF9NVVhfR0FURShyX2RtaWNfY2xrLCAici1kbWljIiwKPiByX2F1ZGlvX3Bh cmVudHMsIDB4MTUwLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDAsIDUswqDCoMKgwqDCoMKgwqDCoMKgLyogTSAqLwo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIDgsIDIswqDCoMKgwqDCoMKgwqDCoMKgLyogUCAqLwo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDI0LCAz LMKgwqDCoMKgwqDCoMKgwqAvKiBtdXggKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBCSVQoMzEpLMKgwqDCoMKgwqDC oC8qIGdhdGUgKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAwKTsKPiArCj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShy X2J1c19kbWljX2NsaywgInItYnVzLWRtaWMiLCAici1hcGIxIiwgMHgxNWMsCj4gQklUKDApLCAw KTsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFKHJfYnVzX2xyYWRjX2NsaywgInItYnVzLWxyYWRj IiwgInItYXBiMSIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg MHgxNmMsIEJJVCgwKSwgMCk7Cj4gKwo+ICtzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dB VEUocl9pMnNfY2xrLCAici1pMnMiLAo+IHJfYXVkaW9fcGFyZW50cywgMHgxNzAsCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgMCwgNSzCoMKgwqDCoMKgwqDCoMKgwqAvKiBNICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgOCwgMizCoMKgwqDC oMKgwqDCoMKgwqAvKiBQICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMjQsIDMswqDCoMKgwqDCoMKgwqDCoC8qIG11 eCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIEJJVCgzMSkswqDCoMKgwqDCoMKgLyogZ2F0ZSAqLwo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX01QX1dJVEhfTVVYX0dBVEUocl9pMnNfYXNyY19jbGss ICJyLWkycy1hc3JjIiwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByX2F1ZGlvX3BhcmVudHMsIDB4MTc0LAo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIDAsIDUswqDCoMKgwqDCoMKgwqDCoMKgLyogTSAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDgsIDIswqDCoMKg wqDCoMKgwqDCoMKgLyogUCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDI0LCAzLMKgwqDCoMKgwqDCoMKgwqAvKiBt dXggKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBCSVQoMzEpLMKgwqDCoMKgwqDCoC8qIGdhdGUgKi8KPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFKHJfYnVzX2kyc19jbGssICJyLWJ1cy1pMnMi LCAici1hcGIxIiwgMHgxN2MsCj4gQklUKDApLCAwKTsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRF KHJfYnVzX3VhcnRfY2xrLCAici1idXMtdWFydCIsICJyLWFwYjIiLCAweDE4YywKPiBCSVQoMCks IDApOwo+ICtzdGF0aWMgU1VOWElfQ0NVX0dBVEUocl9idXNfaTJjX2NsaywgInItYnVzLWkyYyIs ICJyLWFwYjIiLCAweDE5YywKPiBCSVQoMCksIDApOwo+ICsKPiArc3RhdGljIGNvbnN0IGNoYXIg KiBjb25zdCByX2lyX3BhcmVudHNbXSA9IHsgIm9zYzMyayIsICJvc2MyNE0iIH07Cj4gK3N0YXRp YyBTVU5YSV9DQ1VfTVBfV0lUSF9NVVhfR0FURShyX2lyX2NsaywgInItaXIiLCByX2lyX3BhcmVu dHMsCj4gMHgxYzAsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMCwgNSzCoMKgwqDCoMKgwqDCoMKgwqAvKiBNICovCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgOCwgMizCoMKgwqDCoMKgwqDCoMKgwqAvKiBQICovCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMjQsIDMs wqDCoMKgwqDCoMKgwqDCoC8qIG11eCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEJJVCgzMSkswqDCoMKgwqDCoMKg LyogZ2F0ZSAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIDApOwo+ICsKPiArc3RhdGljIFNVTlhJX0NDVV9HQVRFKHJf YnVzX2lyX2NsaywgInItYnVzLWlyIiwgInItYXBiMSIsIDB4MWNjLAo+IEJJVCgwKSwgMCk7Cj4g K3N0YXRpYyBTVU5YSV9DQ1VfR0FURShyX2J1c19tc2dib3hfY2xrLCAici1idXMtbXNnYm94Iiwg InItYXBiMSIsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMHgx ZGMsIEJJVCgwKSwgMCk7Cj4gK3N0YXRpYyBTVU5YSV9DQ1VfR0FURShyX2J1c19zcGlubG9ja19j bGssICJyLWJ1cy1zcGlubG9jayIsICJyLQo+IGFwYjEiLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIDB4MWVjLCBCSVQoMCksIDApOwo+ICtzdGF0aWMgU1VOWElf Q0NVX0dBVEUocl9idXNfcnRjX2NsaywgInItYnVzLXJ0YyIsICJyLWFoYiIsCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgMHgyMGMsIEJJVCgwKSwgQ0xLX0lTX0NS SVRJQ0FMKTsKPiArCj4gK3N0YXRpYyBzdHJ1Y3QgY2N1X2NvbW1vbiAqc3VuNTBpX3IzMjlfcl9j Y3VfY2xrc1tdID0gewo+ICvCoMKgwqDCoMKgwqDCoCZwbGxfY3B1eF9jbGsuY29tbW9uLAo+ICvC oMKgwqDCoMKgwqDCoCZwbGxfcGVyaXBoX2Jhc2VfY2xrLmNvbW1vbiwKPiArwqDCoMKgwqDCoMKg wqAmcGxsX3BlcmlwaF8yeF9jbGsuY29tbW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZwbGxfcGVyaXBo XzgwMG1fY2xrLmNvbW1vbiwKPiArwqDCoMKgwqDCoMKgwqAmcGxsX2F1ZGlvMF9jbGsuY29tbW9u LAo+ICvCoMKgwqDCoMKgwqDCoCZwbGxfYXVkaW8wX2RpdjJfY2xrLmNvbW1vbiwKPiArwqDCoMKg wqDCoMKgwqAmcGxsX2F1ZGlvMF9kaXY1X2Nsay5jb21tb24sCj4gK8KgwqDCoMKgwqDCoMKgJnBs bF9hdWRpbzFfNHhfY2xrLmNvbW1vbiwKPiArwqDCoMKgwqDCoMKgwqAmcl9haGJfY2xrLmNvbW1v biwKPiArwqDCoMKgwqDCoMKgwqAmcl9hcGIxX2Nsay5jb21tb24sCj4gK8KgwqDCoMKgwqDCoMKg JnJfYXBiMl9jbGsuY29tbW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZyX2J1c19ncGFkY19jbGsuY29t bW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZyX2J1c190aHNfY2xrLmNvbW1vbiwKPiArwqDCoMKgwqDC oMKgwqAmcl9idXNfZG1hX2Nsay5jb21tb24sCj4gK8KgwqDCoMKgwqDCoMKgJnJfcHdtX2Nsay5j b21tb24sCj4gK8KgwqDCoMKgwqDCoMKgJnJfYnVzX3B3bV9jbGsuY29tbW9uLAo+ICvCoMKgwqDC oMKgwqDCoCZyX2NvZGVjX2FkY19jbGsuY29tbW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZyX2NvZGVj X2RhY19jbGsuY29tbW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZyX2J1c19jb2RlY19jbGsuY29tbW9u LAo+ICvCoMKgwqDCoMKgwqDCoCZyX2RtaWNfY2xrLmNvbW1vbiwKPiArwqDCoMKgwqDCoMKgwqAm cl9idXNfZG1pY19jbGsuY29tbW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZyX2J1c19scmFkY19jbGsu Y29tbW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZyX2kyc19jbGsuY29tbW9uLAo+ICvCoMKgwqDCoMKg wqDCoCZyX2kyc19hc3JjX2Nsay5jb21tb24sCj4gK8KgwqDCoMKgwqDCoMKgJnJfYnVzX2kyc19j bGsuY29tbW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZyX2J1c191YXJ0X2Nsay5jb21tb24sCj4gK8Kg wqDCoMKgwqDCoMKgJnJfYnVzX2kyY19jbGsuY29tbW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZyX2ly X2Nsay5jb21tb24sCj4gK8KgwqDCoMKgwqDCoMKgJnJfYnVzX2lyX2Nsay5jb21tb24sCj4gK8Kg wqDCoMKgwqDCoMKgJnJfYnVzX21zZ2JveF9jbGsuY29tbW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZy X2J1c19zcGlubG9ja19jbGsuY29tbW9uLAo+ICvCoMKgwqDCoMKgwqDCoCZyX2J1c19ydGNfY2xr LmNvbW1vbiwKPiArfTsKPiArCj4gK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSBz dW41MGlfcjMyOV9yX2h3X2Nsa3MgPSB7Cj4gK8KgwqDCoMKgwqDCoMKgLmh3c8KgwqDCoMKgPSB7 Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFtDTEtfUExMX0NQVVhdwqDCoMKgwqDC oMKgwqDCoMKgwqA9ICZwbGxfY3B1eF9jbGsuY29tbW9uLmh3LAo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBbQ0xLX1BMTF9QRVJJUEhfQkFTRV3CoMKgwqA9Cj4gJnBsbF9wZXJpcGhf YmFzZV9jbGsuY29tbW9uLmh3LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbQ0xL X1BMTF9QRVJJUEhfMlhdwqDCoMKgwqDCoD0KPiAmcGxsX3BlcmlwaF8yeF9jbGsuY29tbW9uLmh3 LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbQ0xLX1BMTF9QRVJJUEhfODAwTV3C oMKgwqA9Cj4gJnBsbF9wZXJpcGhfODAwbV9jbGsuY29tbW9uLmh3LAo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBbQ0xLX1BMTF9QRVJJUEhdwqDCoMKgwqDCoMKgwqDCoD0gJnBsbF9w ZXJpcGhfY2xrLmh3LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbQ0xLX1BMTF9B VURJTzBdwqDCoMKgwqDCoMKgwqDCoD0gJnBsbF9hdWRpbzBfY2xrLmNvbW1vbi5odywKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19QTExfQVVESU8wX0RJVjJdwqDCoMKgPQo+ ICZwbGxfYXVkaW8wX2RpdjJfY2xrLmNvbW1vbi5odywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgW0NMS19QTExfQVVESU8wX0RJVjVdwqDCoMKgPQo+ICZwbGxfYXVkaW8wX2RpdjVf Y2xrLmNvbW1vbi5odywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19QTExf QVVESU8xXzRYXcKgwqDCoMKgwqA9Cj4gJnBsbF9hdWRpbzFfNHhfY2xrLmNvbW1vbi5odywKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19QTExfQVVESU8xXzJYXcKgwqDCoMKg wqA9ICZwbGxfYXVkaW8xXzJ4X2Nsay5odywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgW0NMS19QTExfQVVESU8xXcKgwqDCoMKgwqDCoMKgwqA9ICZwbGxfYXVkaW8xX2Nsay5odywK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19SX0FIQl3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoD0gJnJfYWhiX2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoFtDTEtfUl9BUEIxXcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoD0gJnJfYXBi MV9jbGsuY29tbW9uLmh3LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbQ0xLX1Jf QVBCMl3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA9ICZyX2FwYjJfY2xrLmNvbW1vbi5odywKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19SX0JVU19HUEFEQ13CoMKgwqDCoMKg wqDCoD0gJnJfYnVzX2dwYWRjX2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoFtDTEtfUl9CVVNfVEhTXcKgwqDCoMKgwqDCoMKgwqDCoD0gJnJfYnVzX3Roc19j bGsuY29tbW9uLmh3LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbQ0xLX1JfQlVT X0RNQV3CoMKgwqDCoMKgwqDCoMKgwqA9ICZyX2J1c19kbWFfY2xrLmNvbW1vbi5odywKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19SX1BXTV3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoD0gJnJfcHdtX2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoFtDTEtfUl9CVVNfUFdNXcKgwqDCoMKgwqDCoMKgwqDCoD0gJnJfYnVzX3B3bV9jbGsu Y29tbW9uLmh3LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbQ0xLX1JfQ09ERUNf QURDXcKgwqDCoMKgwqDCoMKgPSAmcl9jb2RlY19hZGNfY2xrLmNvbW1vbi5odywKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19SX0NPREVDX0RBQ13CoMKgwqDCoMKgwqDCoD0g JnJfY29kZWNfZGFjX2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoFtDTEtfUl9CVVNfQ09ERUNdwqDCoMKgwqDCoMKgwqA9ICZyX2J1c19jb2RlY19jbGsuY29t bW9uLmh3LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbQ0xLX1JfRE1JQ13CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqA9ICZyX2RtaWNfY2xrLmNvbW1vbi5odywKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19SX0JVU19ETUlDXcKgwqDCoMKgwqDCoMKgwqA9ICZy X2J1c19kbWljX2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oFtDTEtfUl9CVVNfTFJBRENdwqDCoMKgwqDCoMKgwqA9ICZyX2J1c19scmFkY19jbGsuY29tbW9u Lmh3LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbQ0xLX1JfSTJTXcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgPSAmcl9pMnNfY2xrLmNvbW1vbi5odywKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgW0NMS19SX0kyU19BU1JDXcKgwqDCoMKgwqDCoMKgwqA9ICZyX2ky c19hc3JjX2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFtD TEtfUl9CVVNfSTJTXcKgwqDCoMKgwqDCoMKgwqDCoD0gJnJfYnVzX2kyc19jbGsuY29tbW9uLmh3 LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbQ0xLX1JfQlVTX1VBUlRdwqDCoMKg wqDCoMKgwqDCoD0gJnJfYnVzX3VhcnRfY2xrLmNvbW1vbi5odywKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgW0NMS19SX0JVU19JMkNdwqDCoMKgwqDCoMKgwqDCoMKgPSAmcl9idXNf aTJjX2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFtDTEtf Ul9JUl3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgPSAmcl9pcl9jbGsuY29tbW9uLmh3LAo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBbQ0xLX1JfQlVTX0lSXcKgwqDCoMKgwqDC oMKgwqDCoMKgPSAmcl9idXNfaXJfY2xrLmNvbW1vbi5odywKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgW0NMS19SX0JVU19NU0dCT1hdwqDCoMKgwqDCoMKgPQo+ICZyX2J1c19tc2di b3hfY2xrLmNvbW1vbi5odywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19S X0JVU19TUElOTE9DS13CoMKgwqDCoD0KPiAmcl9idXNfc3BpbmxvY2tfY2xrLmNvbW1vbi5odywK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgW0NMS19SX0JVU19SVENdwqDCoMKgwqDC oMKgwqDCoMKgPSAmcl9idXNfcnRjX2Nsay5jb21tb24uaHcsCj4gK8KgwqDCoMKgwqDCoMKgfSwK PiArwqDCoMKgwqDCoMKgwqAubnVtID0gQ0xLX05VTUJFUiwKPiArfTsKPiArCj4gK3N0YXRpYyBz dHJ1Y3QgY2N1X3Jlc2V0X21hcCBzdW41MGlfcjMyOV9yX2NjdV9yZXNldHNbXSA9IHsKPiArwqDC oMKgwqDCoMKgwqBbUlNUX1JfQlVTX0dQQURDXcKgwqDCoMKgwqDCoMKgPSB7IDB4MGVjLCBCSVQo MTYpIH0sCj4gK8KgwqDCoMKgwqDCoMKgW1JTVF9SX0JVU19USFNdwqDCoMKgwqDCoMKgwqDCoMKg PSB7IDB4MGZjLCBCSVQoMTYpIH0sCj4gK8KgwqDCoMKgwqDCoMKgW1JTVF9SX0JVU19ETUFdwqDC oMKgwqDCoMKgwqDCoMKgPSB7IDB4MTBjLCBCSVQoMTYpIH0sCj4gK8KgwqDCoMKgwqDCoMKgW1JT VF9SX0JVU19QV01dwqDCoMKgwqDCoMKgwqDCoMKgPSB7IDB4MTNjLCBCSVQoMTYpIH0sCj4gK8Kg wqDCoMKgwqDCoMKgW1JTVF9SX0JVU19DT0RFQ13CoMKgwqDCoMKgwqDCoD0geyAweDE0YywgQklU KDE2KSB9LAo+ICvCoMKgwqDCoMKgwqDCoFtSU1RfUl9CVVNfRE1JQ13CoMKgwqDCoMKgwqDCoMKg PSB7IDB4MTVjLCBCSVQoMTYpIH0sCj4gK8KgwqDCoMKgwqDCoMKgW1JTVF9SX0JVU19MUkFEQ13C oMKgwqDCoMKgwqDCoD0geyAweDE2YywgQklUKDE2KSB9LAo+ICvCoMKgwqDCoMKgwqDCoFtSU1Rf Ul9CVVNfSTJTXcKgwqDCoMKgwqDCoMKgwqDCoD0geyAweDE3YywgQklUKDE2KSB9LAo+ICvCoMKg wqDCoMKgwqDCoFtSU1RfUl9CVVNfVUFSVF3CoMKgwqDCoMKgwqDCoMKgPSB7IDB4MThjLCBCSVQo MTYpIH0sCj4gK8KgwqDCoMKgwqDCoMKgW1JTVF9SX0JVU19JMkNdwqDCoMKgwqDCoMKgwqDCoMKg PSB7IDB4MTljLCBCSVQoMTYpIH0sCj4gK8KgwqDCoMKgwqDCoMKgW1JTVF9SX0JVU19JUl3CoMKg wqDCoMKgwqDCoMKgwqDCoD0geyAweDFjYywgQklUKDE2KSB9LAo+ICvCoMKgwqDCoMKgwqDCoFtS U1RfUl9CVVNfTVNHQk9YXcKgwqDCoMKgwqDCoD0geyAweDFkYywgQklUKDE2KSB9LAo+ICvCoMKg wqDCoMKgwqDCoFtSU1RfUl9CVVNfU1BJTkxPQ0tdwqDCoMKgwqA9IHsgMHgxZWMsIEJJVCgxNikg fSwKPiArwqDCoMKgwqDCoMKgwqBbUlNUX1JfQlVTX1JUQ13CoMKgwqDCoMKgwqDCoMKgwqA9IHsg MHgyMGMsIEJJVCgxNikgfSwKPiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VueGlf Y2N1X2Rlc2Mgc3VuNTBpX3IzMjlfcl9jY3VfZGVzYyA9IHsKPiArwqDCoMKgwqDCoMKgwqAuY2N1 X2Nsa3PCoMKgwqDCoMKgwqDCoD0gc3VuNTBpX3IzMjlfcl9jY3VfY2xrcywKPiArwqDCoMKgwqDC oMKgwqAubnVtX2NjdV9jbGtzwqDCoMKgPSBBUlJBWV9TSVpFKHN1bjUwaV9yMzI5X3JfY2N1X2Ns a3MpLAo+ICsKPiArwqDCoMKgwqDCoMKgwqAuaHdfY2xrc8KgwqDCoMKgwqDCoMKgwqA9ICZzdW41 MGlfcjMyOV9yX2h3X2Nsa3MsCj4gKwo+ICvCoMKgwqDCoMKgwqDCoC5yZXNldHPCoMKgwqDCoMKg wqDCoMKgwqA9IHN1bjUwaV9yMzI5X3JfY2N1X3Jlc2V0cywKPiArwqDCoMKgwqDCoMKgwqAubnVt X3Jlc2V0c8KgwqDCoMKgwqA9IEFSUkFZX1NJWkUoc3VuNTBpX3IzMjlfcl9jY3VfcmVzZXRzKSwK PiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCB1MzIgcGxsX3JlZ3NbXSA9IHsKPiArwqDCoMKgwqDC oMKgwqBTVU41MElfUjMyOV9QTExfQ1BVWF9SRUcsCj4gK8KgwqDCoMKgwqDCoMKgU1VONTBJX1Iz MjlfUExMX1BFUklQSF9SRUcsCj4gK8KgwqDCoMKgwqDCoMKgU1VONTBJX1IzMjlfUExMX0FVRElP MF9SRUcsCj4gK8KgwqDCoMKgwqDCoMKgU1VONTBJX1IzMjlfUExMX0FVRElPMV9SRUcsCj4gK307 Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2luaXQgc3VuNTBpX3IzMjlfcl9jY3Vfc2V0dXAoc3RydWN0 IGRldmljZV9ub2RlICpub2RlKQo+ICt7Cj4gK8KgwqDCoMKgwqDCoMKgdm9pZCBfX2lvbWVtICpy ZWc7Cj4gK8KgwqDCoMKgwqDCoMKgdTMyIHZhbDsKPiArwqDCoMKgwqDCoMKgwqBpbnQgaTsKPiAr Cj4gK8KgwqDCoMKgwqDCoMKgcmVnID0gb2ZfaW9fcmVxdWVzdF9hbmRfbWFwKG5vZGUsIDAsCj4g b2Zfbm9kZV9mdWxsX25hbWUobm9kZSkpOwo+ICvCoMKgwqDCoMKgwqDCoGlmIChJU19FUlIocmVn KSkgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwcl9lcnIoIiVwT0Y6IENvdWxk IG5vdCBtYXAgY2xvY2sgcmVnaXN0ZXJzXG4iLAo+IG5vZGUpOwo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqByZXR1cm47Cj4gK8KgwqDCoMKgwqDCoMKgfQo+ICsKPiArwqDCoMKgwqDC oMKgwqAvKiBFbmFibGUgdGhlIGxvY2sgYml0cyBhbmQgdGhlIG91dHB1dCBlbmFibGUgYml0cyBv biBhbGwKPiBQTExzICovCj4gK8KgwqDCoMKgwqDCoMKgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJ WkUocGxsX3JlZ3MpOyBpKyspIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdmFs ID0gcmVhZGwocmVnICsgcGxsX3JlZ3NbaV0pOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqB2YWwgfD0gQklUKDI5KSB8IEJJVCgyNyk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHdyaXRlbCh2YWwsIHJlZyArIHBsbF9yZWdzW2ldKTsKPiArwqDCoMKgwqDCoMKgwqB9 Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoC8qCj4gK8KgwqDCoMKgwqDCoMKgICogRm9yY2UgdGhlIEkv TyBkaXZpZGVycyBvZiBQTEwtQVVESU8xIHRvIHJlc2V0IGRlZmF1bHQKPiB2YWx1ZQo+ICvCoMKg wqDCoMKgwqDCoCAqCj4gK8KgwqDCoMKgwqDCoMKgICogU2VlIHRoZSBjb21tZW50IGJlZm9yZSBw bGwtYXVkaW8xIGRlZmluaXRpb24gZm9yIHRoZQo+IHJlYXNvbi4KPiArwqDCoMKgwqDCoMKgwqAg Ki8KPiArCj4gK8KgwqDCoMKgwqDCoMKgdmFsID0gcmVhZGwocmVnICsgU1VONTBJX1IzMjlfUExM X0FVRElPMV9SRUcpOwo+ICvCoMKgwqDCoMKgwqDCoHZhbCAmPSB+QklUKDEpOwo+ICvCoMKgwqDC oMKgwqDCoHZhbCB8PSBCSVQoMCk7Cj4gK8KgwqDCoMKgwqDCoMKgd3JpdGVsKHZhbCwgcmVnICsg U1VONTBJX1IzMjlfUExMX0FVRElPMV9SRUcpOwo+ICsKPiArwqDCoMKgwqDCoMKgwqBpID0gc3Vu eGlfY2N1X3Byb2JlKG5vZGUsIHJlZywgJnN1bjUwaV9yMzI5X3JfY2N1X2Rlc2MpOwo+ICvCoMKg wqDCoMKgwqDCoGlmIChpKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwcl9lcnIo IiVwT0Y6IHByb2JpbmcgY2xvY2tzIGZhaWxzOiAlZFxuIiwgbm9kZSwgaSk7Cj4gK30KPiArCj4g K0NMS19PRl9ERUNMQVJFKHN1bjUwaV9yMzI5X3JfY2N1LCAiYWxsd2lubmVyLHN1bjUwaS1yMzI5 LXItY2N1IiwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3VuNTBpX3IzMjlfcl9jY3Vf c2V0dXApOwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNTBpLXIz Mjktci5oCj4gYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNTBpLXIzMjktci5oCj4gbmV3 IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjYyY2Y2NTMyMjExNgo+IC0t LSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNTBpLXIzMjkt ci5oCj4gQEAgLTAsMCArMSwzMyBAQAo+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BM LTIuMCAqLwo+ICsvKgo+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMjEgU2lwZWVkCj4gKyAqLwo+ICsK PiArI2lmbmRlZiBfQ0NVX1NVTjUwSV9SMzI5X1JfSAo+ICsjZGVmaW5lIF9DQ1VfU1VONTBJX1Iz MjlfUl9ICj4gKwo+ICsjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svc3VuNTBpLXIzMjktci1j Y3UuaD4KPiArI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3Jlc2V0L3N1bjUwaS1yMzI5LXItY2N1Lmg+ Cj4gKwo+ICsjZGVmaW5lIENMS19QTExfQ1BVWMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAwCj4gKyNk ZWZpbmUgQ0xLX1BMTF9QRVJJUEhfQkFTRcKgwqDCoMKgMQo+ICsjZGVmaW5lIENMS19QTExfUEVS SVBIXzJYwqDCoMKgwqDCoMKgMgo+ICsjZGVmaW5lIENMS19QTExfUEVSSVBIXzgwME3CoMKgwqDC oDMKPiArI2RlZmluZSBDTEtfUExMX1BFUklQSMKgwqDCoMKgwqDCoMKgwqDCoDQKPiArI2RlZmlu ZSBDTEtfUExMX0FVRElPMMKgwqDCoMKgwqDCoMKgwqDCoDUKPiArI2RlZmluZSBDTEtfUExMX0FV RElPMF9ESVYywqDCoMKgwqA2Cj4gKyNkZWZpbmUgQ0xLX1BMTF9BVURJTzBfRElWNcKgwqDCoMKg Nwo+ICsjZGVmaW5lIENMS19QTExfQVVESU8xXzRYwqDCoMKgwqDCoMKgOAo+ICsjZGVmaW5lIENM S19QTExfQVVESU8xXzJYwqDCoMKgwqDCoMKgOQo+ICsjZGVmaW5lIENMS19QTExfQVVESU8xwqDC oMKgwqDCoMKgwqDCoMKgMTAKPiArI2RlZmluZSBDTEtfUl9BSELCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgMTEKPiArCj4gKy8qIFJfQVBCMSBleHBvcnRlZCBmb3IgUElPICovCj4gKwo+ICsj ZGVmaW5lIENMS19SX0FQQjLCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDEzCj4gKwo+ICsvKiBB bGwgbW9kdWxlIC8gYnVzIGdhdGUgY2xvY2tzIGV4cG9ydGVkICovCj4gKwo+ICsjZGVmaW5lIENM S19OVU1CRVLCoMKgwqDCoMKgKENMS19SX0JVU19SVEMgKyAxKQo+ICsKPiArI2VuZGlmIC8qIF9D Q1VfU1VONTBJX1IzMjlfUl9IICovCj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3Mv Y2xvY2svc3VuNTBpLXIzMjktci1jY3UuaAo+IGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9z dW41MGktcjMyOS1yLWNjdS5oCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAw MDAwMDAuLmRmOWJjNThkZTVjNAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9pbmNsdWRlL2R0LWJp bmRpbmdzL2Nsb2NrL3N1bjUwaS1yMzI5LXItY2N1LmgKPiBAQCAtMCwwICsxLDMzIEBACj4gKy8q IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCj4gKy8qCj4gKyAqIENvcHlyaWdo dCAoYykgMjAyMSBTaXBlZWQKPiArICovCj4gKwo+ICsjaWZuZGVmIF9EVF9CSU5ESU5HU19DTEtf U1VONTBJX1IzMjlfUl9DQ1VfSF8KPiArI2RlZmluZSBfRFRfQklORElOR1NfQ0xLX1NVTjUwSV9S MzI5X1JfQ0NVX0hfCj4gKwo+ICsjZGVmaW5lIENMS19SX0FQQjHCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoDEyCj4gKwo+ICsjZGVmaW5lIENMS19SX0JVU19HUEFEQ8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgMTQKPiArI2RlZmluZSBDTEtfUl9CVVNfVEhTwqDCoMKgwqDCoMKgwqDC oMKgwqAxNQo+ICsjZGVmaW5lIENMS19SX0JVU19ETUHCoMKgwqDCoMKgwqDCoMKgwqDCoDE2Cj4g KyNkZWZpbmUgQ0xLX1JfUFdNwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDE3Cj4gKyNkZWZp bmUgQ0xLX1JfQlVTX1BXTcKgwqDCoMKgwqDCoMKgwqDCoMKgMTgKPiArI2RlZmluZSBDTEtfUl9D T0RFQ19BREPCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDE5Cj4gKyNkZWZpbmUgQ0xL X1JfQ09ERUNfREFDwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAyMAo+ICsjZGVmaW5l IENMS19SX0JVU19DT0RFQ8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgMjEKPiArI2Rl ZmluZSBDTEtfUl9ETUlDwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAyMgo+ICsjZGVmaW5lIENM S19SX0JVU19ETUlDwqDCoMKgwqDCoMKgwqDCoMKgMjMKPiArI2RlZmluZSBDTEtfUl9CVVNfTFJB REPCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDI0Cj4gKyNkZWZpbmUgQ0xLX1JfSTJT wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDI1Cj4gKyNkZWZpbmUgQ0xLX1JfSTJTX0FTUkPC oMKgwqDCoMKgwqDCoMKgwqAyNgo+ICsjZGVmaW5lIENMS19SX0JVU19JMlPCoMKgwqDCoMKgwqDC oMKgwqDCoDI3Cj4gKyNkZWZpbmUgQ0xLX1JfQlVTX1VBUlTCoMKgwqDCoMKgwqDCoMKgwqAyOAo+ ICsjZGVmaW5lIENMS19SX0JVU19JMkPCoMKgwqDCoMKgwqDCoMKgwqDCoDI5Cj4gKyNkZWZpbmUg Q0xLX1JfSVLCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAzMAo+ICsjZGVmaW5lIENMS19S X0JVU19JUsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAzMQo+ICsjZGVmaW5lIENMS19SX0JVU19NU0dC T1jCoMKgwqDCoMKgwqDCoDMyCj4gKyNkZWZpbmUgQ0xLX1JfQlVTX1NQSU5MT0NLwqDCoMKgwqDC oDMzCj4gKyNkZWZpbmUgQ0xLX1JfQlVTX1JUQ8KgwqDCoMKgwqDCoMKgwqDCoMKgMzQKPiArCj4g KyNlbmRpZiAvKiBfRFRfQklORElOR1NfQ0xLX1NVTjUwSV9SMzI5X1JfQ0NVX0hfICovCj4gZGlm ZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvcmVzZXQvc3VuNTBpLXIzMjktci1jY3UuaAo+ IGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9zdW41MGktcjMyOS1yLWNjdS5oCj4gbmV3IGZp bGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjQwNjQ0ZjJmMjFjNgo+IC0tLSAv ZGV2L251bGwKPiArKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L3N1bjUwaS1yMzI5LXIt Y2N1LmgKPiBAQCAtMCwwICsxLDI0IEBACj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiAo R1BMLTIuMCsgb3IgTUlUKSAqLwo+ICsvKgo+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMjEgU2lwZWVk Cj4gKyAqLwo+ICsKPiArI2lmbmRlZiBfRFRfQklORElOR1NfUlNUX1NVTjUwSV9SMzI5X1JfQ0NV X0hfCj4gKyNkZWZpbmUgX0RUX0JJTkRJTkdTX1JTVF9TVU41MElfUjMyOV9SX0NDVV9IXwo+ICsK PiArI2RlZmluZSBSU1RfUl9CVVNfR1BBREPCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oDAKPiArI2RlZmluZSBSU1RfUl9CVVNfVEhTwqDCoMKgwqDCoMKgwqDCoMKgwqAxCj4gKyNkZWZp bmUgUlNUX1JfQlVTX0RNQcKgwqDCoMKgwqDCoMKgwqDCoMKgMgo+ICsjZGVmaW5lIFJTVF9SX0JV U19QV03CoMKgwqDCoMKgwqDCoMKgwqDCoDMKPiArI2RlZmluZSBSU1RfUl9CVVNfQ09ERUPCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDQKPiArI2RlZmluZSBSU1RfUl9CVVNfRE1JQ8Kg wqDCoMKgwqDCoMKgwqDCoDUKPiArI2RlZmluZSBSU1RfUl9CVVNfTFJBREPCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoDYKPiArI2RlZmluZSBSU1RfUl9CVVNfSTJTwqDCoMKgwqDCoMKg wqDCoMKgwqA3Cj4gKyNkZWZpbmUgUlNUX1JfQlVTX1VBUlTCoMKgwqDCoMKgwqDCoMKgwqA4Cj4g KyNkZWZpbmUgUlNUX1JfQlVTX0kyQ8KgwqDCoMKgwqDCoMKgwqDCoMKgOQo+ICsjZGVmaW5lIFJT VF9SX0JVU19JUsKgwqDCoMKgwqDCoMKgwqDCoMKgwqAxMAo+ICsjZGVmaW5lIFJTVF9SX0JVU19N U0dCT1jCoMKgwqDCoMKgwqDCoDExCj4gKyNkZWZpbmUgUlNUX1JfQlVTX1NQSU5MT0NLwqDCoMKg wqDCoDEyCj4gKyNkZWZpbmUgUlNUX1JfQlVTX1JUQ8KgwqDCoMKgwqDCoMKgwqDCoMKgMTMKPiAr Cj4gKyNlbmRpZiAvKiBfRFRfQklORElOR1NfUlNUX1NVTjUwSV9SMzI5X1JfQ0NVX0hfICovCgoK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFy bS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9y ZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1r ZXJuZWwK