From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E528610A0E for ; Sun, 7 Jan 2024 03:02:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="jP+xBW9w" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-28d0052beb0so385885a91.0 for ; Sat, 06 Jan 2024 19:02:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1704596578; x=1705201378; darn=lists.linux.dev; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=4snqkhUuEW8ZG394EttlpuQ67DH0d6MbBqMG4Ly3wkQ=; b=jP+xBW9w/B6FzX8Gs1tHIN9LFlKZoZcvWM/xUDbxj3pw6c8j+rApzGL3KFnWtVVWLC D2VwffTBEJFQybvVA/R+DBngE7nz3C2buKlWtB0iW9aw9TIaviTnfDxFgEjJNGy9A8gs IBurGZjks/Nmceo32chfy1N99AHlgnVmSorSvCAjsv3U/NsWKUsm5OcaoEeZb438EgU4 w2YrcwHFG5gvDrAICGTAOe4naGInNogn6y2/kNOgTS4ZoC+JseApPEgA9KNJYvztC/tD O+oQNUxGBFlGTFPiKnX6ck/+mvaaBkn7ZfvniPqLCyZJWePAK505CY4it/pz0zGX2b0B CKpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704596578; x=1705201378; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=4snqkhUuEW8ZG394EttlpuQ67DH0d6MbBqMG4Ly3wkQ=; b=CkKg5VfOfoLiRQ/7UwwKQoFXHp6wZoun/aqspS+SxPp2BDox23MhbG7FzL4z6Z18k9 LQhql/qzfvcnLuhVcTQ4ghUOQH4f2LdHhqyg8FS1vVtPm4d3+i6kyg5SZHHxCB468eQj V9SjypDux6fcE7m8W7jYr4NBwHynCr8jytaBLY48/xYwhxZG14yYWjR8qW9zwmf2QN9w upeMLdOYjFqKmQryrzFpJVhJQnupIki3fb9FkaP0dM3I6RaM4C9Bsz9MlsE62uERzhRA dEn8E05pXO/E0nmYWH+j72LN1/Zx2UAW2oY8roWY2CMEYJbdhMCLzftDrDlSfigPhkng jW8Q== X-Gm-Message-State: AOJu0YxMBlU9jPmvV5FwTk70eyzecQAMrhIErZ982gsjGRpX+wfTvXNF u3NzObX0DpZYUZ3ORYrTusUIcKRWCP4+ X-Google-Smtp-Source: AGHT+IFWNyeYcLOxjx7kAt+wXSssgse708DUrf3+R7FincnxfWyy3UrvW3wRM0k+wcgdhEKojCyxOg== X-Received: by 2002:a05:6a20:a89a:b0:199:a10e:13e5 with SMTP id ca26-20020a056a20a89a00b00199a10e13e5mr5093pzb.43.1704596578093; Sat, 06 Jan 2024 19:02:58 -0800 (PST) Received: from thinkpad ([103.197.115.97]) by smtp.gmail.com with ESMTPSA id jb19-20020a170903259300b001d4bcf6cc43sm3707804plb.81.2024.01.06.19.02.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 06 Jan 2024 19:02:57 -0800 (PST) Date: Sun, 7 Jan 2024 08:32:47 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: krzysztof.kozlowski@linaro.org, bhelgaas@google.com, conor+dt@kernel.org, devicetree@vger.kernel.org, festevam@gmail.com, helgaas@kernel.org, hongxing.zhu@nxp.com, imx@lists.linux.dev, kernel@pengutronix.de, krzysztof.kozlowski+dt@linaro.org, kw@linux.com, l.stach@pengutronix.de, linux-arm-kernel@lists.infradead.org, linux-imx@nxp.com, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, lpieralisi@kernel.org, robh@kernel.org, s.hauer@pengutronix.de, shawnguo@kernel.org Subject: Re: [PATCH v7 01/16] PCI: imx6: Simplify clock handling by using bulk_clk_*() function Message-ID: <20240107030247.GA3416@thinkpad> References: <20231227182727.1747435-1-Frank.Li@nxp.com> <20231227182727.1747435-2-Frank.Li@nxp.com> <20240106152708.GD2512@thinkpad> Precedence: bulk X-Mailing-List: imx@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Sat, Jan 06, 2024 at 11:48:35AM -0500, Frank Li wrote: > On Sat, Jan 06, 2024 at 08:57:08PM +0530, Manivannan Sadhasivam wrote: > > On Wed, Dec 27, 2023 at 01:27:12PM -0500, Frank Li wrote: > > > > Subject mentions, 'bulk_clk' APIs but there is no such thing. It should be > > 'clk_bulk()' APIs. > > > > > Refactors the clock handling logic. Adds clk_names[] define in drvdata. > > > Using clk_bulk*() api simplifies the code. > > > > > > > I've mentioned this many times in the past. But let me reiterate here again: > > > > Commit message should be in imperative mood as per Linux Kernel rules for > > submitting patches. Please see here: > > Documentation/process/submitting-patches.rst > > > > The relevant part is: > > > > "Describe your changes in imperative mood, e.g. "make xyzzy do frotz" > > instead of "[This patch] makes xyzzy do frotz" or "[I] changed xyzzy > > to do frotz", as if you are giving orders to the codebase to change > > its behaviour." > > > > Please use this same format for rest of the patches as well for future ones. > > I may have not understand *imperative mode*. Asked an English native > speaker. Do you menas > > *Refector* the clock handling logic. *Add* clk_names[] define in drvdata. > *Use* clk_bulk*() api *simplify* the code. Yes! > > > > > > Signed-off-by: Frank Li > > > --- > > > > > > Notes: > > > Change from v4 to v5 > > > - update commit message > > > - direct using clk name list, instead of macro > > > - still keep caculate clk list count because sizeof return pre allocated > > > array size. > > > > > > Change from v3 to v4 > > > - using clk_bulk_*() API > > > Change from v1 to v3 > > > - none > > > > > > drivers/pci/controller/dwc/pci-imx6.c | 125 ++++++++------------------ > > > 1 file changed, 35 insertions(+), 90 deletions(-) > > > > > > diff --git a/drivers/pci/controller/dwc/pci-imx6.c b/drivers/pci/controller/dwc/pci-imx6.c > > > index 74703362aeec7..50d9faaa17f71 100644 > > > --- a/drivers/pci/controller/dwc/pci-imx6.c > > > +++ b/drivers/pci/controller/dwc/pci-imx6.c [...] > > > > > > - /* Fetch clocks */ > > > - imx6_pcie->pcie_bus = devm_clk_get(dev, "pcie_bus"); > > > - if (IS_ERR(imx6_pcie->pcie_bus)) > > > - return dev_err_probe(dev, PTR_ERR(imx6_pcie->pcie_bus), > > > - "pcie_bus clock source missing or invalid\n"); > > > + while (imx6_pcie->drvdata->clk_names[imx6_pcie->clks_cnt]) { > > > + int i = imx6_pcie->clks_cnt; > > > > Why can't you initialize i to 0 directly? > > can't init i to 0 directly here, otherwise next loop i will not increase. > i just reduce refer imx6_pcie->clks_cnt in > > imx6_pcie->clks[i].id = imx6_pcie->drvdata->clk_names[i]; > Wait... Can't you just use ARRAY_SIZE() to calculate the clks_cnt statically? Like, static const char * const imx8_clk_names[] = { "pcie_bus", "pcie", "pcie_aux", }; [...] .clk_names = imx8_clk_names, .clks_cnt = ARRAY_SIZE(imx8_clk_names), You can use the same clk_names array for multiple SoCs if the clocks are same. I should've mentioned this in last review itself. Sorry about that. - Mani > Frank > > > > > Rest looks good to me. > > > > - Mani > > > > > + > > > + imx6_pcie->clks[i].id = imx6_pcie->drvdata->clk_names[i]; > > > + imx6_pcie->clks_cnt++; > > > + } > > > > > > - imx6_pcie->pcie = devm_clk_get(dev, "pcie"); > > > - if (IS_ERR(imx6_pcie->pcie)) > > > - return dev_err_probe(dev, PTR_ERR(imx6_pcie->pcie), > > > - "pcie clock source missing or invalid\n"); > > > + /* Fetch clocks */ > > > + ret = devm_clk_bulk_get(dev, imx6_pcie->clks_cnt, imx6_pcie->clks); > > > + if (ret) > > > + return ret; > > > > > > switch (imx6_pcie->drvdata->variant) { > > > - case IMX6SX: > > > - imx6_pcie->pcie_inbound_axi = devm_clk_get(dev, > > > - "pcie_inbound_axi"); > > > - if (IS_ERR(imx6_pcie->pcie_inbound_axi)) > > > - return dev_err_probe(dev, PTR_ERR(imx6_pcie->pcie_inbound_axi), > > > - "pcie_inbound_axi clock missing or invalid\n"); > > > - break; > > > - case IMX8MQ: > > > - case IMX8MQ_EP: > > > - imx6_pcie->pcie_aux = devm_clk_get(dev, "pcie_aux"); > > > - if (IS_ERR(imx6_pcie->pcie_aux)) > > > - return dev_err_probe(dev, PTR_ERR(imx6_pcie->pcie_aux), > > > - "pcie_aux clock source missing or invalid\n"); > > > - fallthrough; > > > case IMX7D: > > > if (dbi_base->start == IMX8MQ_PCIE2_BASE_ADDR) > > > imx6_pcie->controller_id = 1; > > > @@ -1353,10 +1300,6 @@ static int imx6_pcie_probe(struct platform_device *pdev) > > > case IMX8MM_EP: > > > case IMX8MP: > > > case IMX8MP_EP: > > > - imx6_pcie->pcie_aux = devm_clk_get(dev, "pcie_aux"); > > > - if (IS_ERR(imx6_pcie->pcie_aux)) > > > - return dev_err_probe(dev, PTR_ERR(imx6_pcie->pcie_aux), > > > - "pcie_aux clock source missing or invalid\n"); > > > imx6_pcie->apps_reset = devm_reset_control_get_exclusive(dev, > > > "apps"); > > > if (IS_ERR(imx6_pcie->apps_reset)) > > > @@ -1372,14 +1315,6 @@ static int imx6_pcie_probe(struct platform_device *pdev) > > > default: > > > break; > > > } > > > - /* Don't fetch the pcie_phy clock, if it has abstract PHY driver */ > > > - if (imx6_pcie->phy == NULL) { > > > - imx6_pcie->pcie_phy = devm_clk_get(dev, "pcie_phy"); > > > - if (IS_ERR(imx6_pcie->pcie_phy)) > > > - return dev_err_probe(dev, PTR_ERR(imx6_pcie->pcie_phy), > > > - "pcie_phy clock source missing or invalid\n"); > > > - } > > > - > > > > > > /* Grab turnoff reset */ > > > imx6_pcie->turnoff_reset = devm_reset_control_get_optional_exclusive(dev, "turnoff"); > > > @@ -1477,6 +1412,7 @@ static const struct imx6_pcie_drvdata drvdata[] = { > > > IMX6_PCIE_FLAG_IMX6_SPEED_CHANGE, > > > .dbi_length = 0x200, > > > .gpr = "fsl,imx6q-iomuxc-gpr", > > > + .clk_names = {"pcie_bus", "pcie", "pcie_phy"}, > > > }, > > > [IMX6SX] = { > > > .variant = IMX6SX, > > > @@ -1484,6 +1420,7 @@ static const struct imx6_pcie_drvdata drvdata[] = { > > > IMX6_PCIE_FLAG_IMX6_SPEED_CHANGE | > > > IMX6_PCIE_FLAG_SUPPORTS_SUSPEND, > > > .gpr = "fsl,imx6q-iomuxc-gpr", > > > + .clk_names = {"pcie_bus", "pcie", "pcie_phy", "pcie_inbound_axi"}, > > > }, > > > [IMX6QP] = { > > > .variant = IMX6QP, > > > @@ -1492,40 +1429,48 @@ static const struct imx6_pcie_drvdata drvdata[] = { > > > IMX6_PCIE_FLAG_SUPPORTS_SUSPEND, > > > .dbi_length = 0x200, > > > .gpr = "fsl,imx6q-iomuxc-gpr", > > > + .clk_names = {"pcie_bus", "pcie", "pcie_phy"}, > > > }, > > > [IMX7D] = { > > > .variant = IMX7D, > > > .flags = IMX6_PCIE_FLAG_SUPPORTS_SUSPEND, > > > .gpr = "fsl,imx7d-iomuxc-gpr", > > > + .clk_names = {"pcie_bus", "pcie", "pcie_phy"}, > > > }, > > > [IMX8MQ] = { > > > .variant = IMX8MQ, > > > .gpr = "fsl,imx8mq-iomuxc-gpr", > > > + .clk_names = {"pcie_bus", "pcie", "pcie_phy", "pcie_aux"}, > > > }, > > > [IMX8MM] = { > > > .variant = IMX8MM, > > > .flags = IMX6_PCIE_FLAG_SUPPORTS_SUSPEND, > > > .gpr = "fsl,imx8mm-iomuxc-gpr", > > > + .clk_names = {"pcie_bus", "pcie", "pcie_aux"}, > > > }, > > > [IMX8MP] = { > > > .variant = IMX8MP, > > > .flags = IMX6_PCIE_FLAG_SUPPORTS_SUSPEND, > > > .gpr = "fsl,imx8mp-iomuxc-gpr", > > > + .clk_names = {"pcie_bus", "pcie", "pcie_aux"}, > > > }, > > > [IMX8MQ_EP] = { > > > .variant = IMX8MQ_EP, > > > .mode = DW_PCIE_EP_TYPE, > > > .gpr = "fsl,imx8mq-iomuxc-gpr", > > > + .clk_names = {"pcie_bus", "pcie", "pcie_phy", "pcie_aux"}, > > > }, > > > [IMX8MM_EP] = { > > > .variant = IMX8MM_EP, > > > .mode = DW_PCIE_EP_TYPE, > > > .gpr = "fsl,imx8mm-iomuxc-gpr", > > > + .clk_names = {"pcie_bus", "pcie", "pcie_aux"}, > > > }, > > > [IMX8MP_EP] = { > > > .variant = IMX8MP_EP, > > > .mode = DW_PCIE_EP_TYPE, > > > .gpr = "fsl,imx8mp-iomuxc-gpr", > > > + .clk_names = {"pcie_bus", "pcie", "pcie_aux"}, > > > }, > > > }; > > > > > > -- > > > 2.34.1 > > > > > > > -- > > மணிவண்ணன் சதாசிவம் -- மணிவண்ணன் சதாசிவம் From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from 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 smtp.lore.kernel.org (Postfix) with ESMTPS id AE1B4C46CD2 for ; Sun, 7 Jan 2024 03:03:30 +0000 (UTC) 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:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=upuKKlfI4tOo2Rm4EKeESTwv9b7faQpvzjVNwtFZSns=; b=wgooOHRdSr6psX 9zs63x1LX0Mk8EOIzNM6Ry+8XULRPVPg0LpW6Ml5m/GX2q4cP9MCZbn5SihoVYi1JOIERYsSclWe4 amzXov4jEI3JtfcrWpSXJqKYoZN0sbu/lInymFcDbRZSbThtoAljw+Z7CFrZHCmQfxZhn/yNfd7U/ wV62SNfr+OJbEsmqxkPxAZWummFKGRwV/LORoUSDhxXUh9U3syQKmxYTHR8SD45h6SfLPNtHlQ3rv H+mNEHzU6DrS00pOvMs8z9DKxh6Mqkvqhr1H61hiUS3L0oI62Cb8tTikgn//nOnfcu/BnoaZwTTyB 5mNG4AitZT/UQAa7UszA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rMJRH-002Fwi-1e; Sun, 07 Jan 2024 03:03:03 +0000 Received: from mail-pj1-x102a.google.com ([2607:f8b0:4864:20::102a]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1rMJRD-002FwK-21 for linux-arm-kernel@lists.infradead.org; Sun, 07 Jan 2024 03:03:01 +0000 Received: by mail-pj1-x102a.google.com with SMTP id 98e67ed59e1d1-28d0052beb0so385886a91.0 for ; Sat, 06 Jan 2024 19:02:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1704596578; x=1705201378; darn=lists.infradead.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=4snqkhUuEW8ZG394EttlpuQ67DH0d6MbBqMG4Ly3wkQ=; b=gphl1+RtyloHi9os8aJClipg+l6pBVTD1y00ey6DRTes1zwdY+7jgb2PpO7OJeeiCd IkHIuhys4gu/d2n5lmjiA3FauUIcScVDp6w43kRSgHzj0W2BPartbPTQDJLVB9Y7yffu O90kHZ/9NaRztip9thUgXnwo0L2jPhEm38xcL+0hIG9dTIsHyVksdHbXBf732Fu+KG8F AFDIyCFnpqoE2cL+n4UoiOTswcQJMRAvwZIX6m4LeBiZQEmpfngc0S1LKbkFCh3lbVTE 85bbLpBrs3WR9gPLpVnFeNQFQE6QK1FhSXqbRsw0GdLhu5EDAoJqMQ1LaG8Ua51Pu+K0 XP0A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1704596578; x=1705201378; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=4snqkhUuEW8ZG394EttlpuQ67DH0d6MbBqMG4Ly3wkQ=; b=pR/vpVUVNIMYm9v4u6p+iKQaHuwxUYb5KNdMM7mCU1GuLNlvAXtpKPHCFygCV1ZWC2 kkQEYO0xhENIa9U1s6P6rBNlzNi6YlAGliiye6+vIhP62D6T5XU3CsPwzF7iYqYgsXhE IAfoIUXLBQ6HLukGC97UyhZI94o6UYsd+a2OZJ1tGFhc09nqSFxIJ+pssy6Ks5zWO3Nd 5CQe9P8461JlJ0exlVjdUhqbEl7R9jTjZhohFLx0ih+pAKeGiWLASUiu+MCQF1lXE6Om F5DazQ6kqymrMM1kIjyK1UUW1lUqM6EaBwH2b1/J/So2TXdil6D9biF22XR0uHBsIPHC 9ZIA== X-Gm-Message-State: AOJu0Yx0eg8GmFyflDB+zN5Q4Ru/gUO0/hPgHRfSDZ3aIjCyJYapffpq CnTc3wfG6+kIk5jzlrFaZ9S7M50fMIyq X-Google-Smtp-Source: AGHT+IFWNyeYcLOxjx7kAt+wXSssgse708DUrf3+R7FincnxfWyy3UrvW3wRM0k+wcgdhEKojCyxOg== X-Received: by 2002:a05:6a20:a89a:b0:199:a10e:13e5 with SMTP id ca26-20020a056a20a89a00b00199a10e13e5mr5093pzb.43.1704596578093; Sat, 06 Jan 2024 19:02:58 -0800 (PST) Received: from thinkpad ([103.197.115.97]) by smtp.gmail.com with ESMTPSA id jb19-20020a170903259300b001d4bcf6cc43sm3707804plb.81.2024.01.06.19.02.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 06 Jan 2024 19:02:57 -0800 (PST) Date: Sun, 7 Jan 2024 08:32:47 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: krzysztof.kozlowski@linaro.org, bhelgaas@google.com, conor+dt@kernel.org, devicetree@vger.kernel.org, festevam@gmail.com, helgaas@kernel.org, hongxing.zhu@nxp.com, imx@lists.linux.dev, kernel@pengutronix.de, krzysztof.kozlowski+dt@linaro.org, kw@linux.com, l.stach@pengutronix.de, linux-arm-kernel@lists.infradead.org, linux-imx@nxp.com, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, lpieralisi@kernel.org, robh@kernel.org, s.hauer@pengutronix.de, shawnguo@kernel.org Subject: Re: [PATCH v7 01/16] PCI: imx6: Simplify clock handling by using bulk_clk_*() function Message-ID: <20240107030247.GA3416@thinkpad> References: <20231227182727.1747435-1-Frank.Li@nxp.com> <20231227182727.1747435-2-Frank.Li@nxp.com> <20240106152708.GD2512@thinkpad> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240106_190259_751118_DC976D5F X-CRM114-Status: GOOD ( 35.92 ) 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 T24gU2F0LCBKYW4gMDYsIDIwMjQgYXQgMTE6NDg6MzVBTSAtMDUwMCwgRnJhbmsgTGkgd3JvdGU6 Cj4gT24gU2F0LCBKYW4gMDYsIDIwMjQgYXQgMDg6NTc6MDhQTSArMDUzMCwgTWFuaXZhbm5hbiBT YWRoYXNpdmFtIHdyb3RlOgo+ID4gT24gV2VkLCBEZWMgMjcsIDIwMjMgYXQgMDE6Mjc6MTJQTSAt MDUwMCwgRnJhbmsgTGkgd3JvdGU6Cj4gPiAKPiA+IFN1YmplY3QgbWVudGlvbnMsICdidWxrX2Ns aycgQVBJcyBidXQgdGhlcmUgaXMgbm8gc3VjaCB0aGluZy4gSXQgc2hvdWxkIGJlCj4gPiAnY2xr X2J1bGsoKScgQVBJcy4KPiA+IAo+ID4gPiBSZWZhY3RvcnMgdGhlIGNsb2NrIGhhbmRsaW5nIGxv Z2ljLiBBZGRzIGNsa19uYW1lc1tdIGRlZmluZSBpbiBkcnZkYXRhLgo+ID4gPiBVc2luZyBjbGtf YnVsayooKSBhcGkgc2ltcGxpZmllcyB0aGUgY29kZS4KPiA+ID4gCj4gPiAKPiA+IEkndmUgbWVu dGlvbmVkIHRoaXMgbWFueSB0aW1lcyBpbiB0aGUgcGFzdC4gQnV0IGxldCBtZSByZWl0ZXJhdGUg aGVyZSBhZ2FpbjoKPiA+IAo+ID4gQ29tbWl0IG1lc3NhZ2Ugc2hvdWxkIGJlIGluIGltcGVyYXRp dmUgbW9vZCBhcyBwZXIgTGludXggS2VybmVsIHJ1bGVzIGZvcgo+ID4gc3VibWl0dGluZyBwYXRj aGVzLiBQbGVhc2Ugc2VlIGhlcmU6Cj4gPiBEb2N1bWVudGF0aW9uL3Byb2Nlc3Mvc3VibWl0dGlu Zy1wYXRjaGVzLnJzdAo+ID4gCj4gPiBUaGUgcmVsZXZhbnQgcGFydCBpczoKPiA+IAo+ID4gIkRl c2NyaWJlIHlvdXIgY2hhbmdlcyBpbiBpbXBlcmF0aXZlIG1vb2QsIGUuZy4gIm1ha2UgeHl6enkg ZG8gZnJvdHoiCj4gPiBpbnN0ZWFkIG9mICJbVGhpcyBwYXRjaF0gbWFrZXMgeHl6enkgZG8gZnJv dHoiIG9yICJbSV0gY2hhbmdlZCB4eXp6eQo+ID4gdG8gZG8gZnJvdHoiLCBhcyBpZiB5b3UgYXJl IGdpdmluZyBvcmRlcnMgdG8gdGhlIGNvZGViYXNlIHRvIGNoYW5nZQo+ID4gaXRzIGJlaGF2aW91 ci4iCj4gPiAKPiA+IFBsZWFzZSB1c2UgdGhpcyBzYW1lIGZvcm1hdCBmb3IgcmVzdCBvZiB0aGUg cGF0Y2hlcyBhcyB3ZWxsIGZvciBmdXR1cmUgb25lcy4KPiAKPiBJIG1heSBoYXZlIG5vdCB1bmRl cnN0YW5kICppbXBlcmF0aXZlIG1vZGUqLiBBc2tlZCBhbiBFbmdsaXNoIG5hdGl2ZQo+IHNwZWFr ZXIuIERvIHlvdSBtZW5hcwo+IAo+ICpSZWZlY3RvciogdGhlIGNsb2NrIGhhbmRsaW5nIGxvZ2lj LiAqQWRkKiBjbGtfbmFtZXNbXSBkZWZpbmUgaW4gZHJ2ZGF0YS4KPiAqVXNlKiBjbGtfYnVsayoo KSBhcGkgKnNpbXBsaWZ5KiB0aGUgY29kZS4KClllcyEKCj4gCj4gPiAKPiA+ID4gU2lnbmVkLW9m Zi1ieTogRnJhbmsgTGkgPEZyYW5rLkxpQG54cC5jb20+Cj4gPiA+IC0tLQo+ID4gPiAKPiA+ID4g Tm90ZXM6Cj4gPiA+ICAgICBDaGFuZ2UgZnJvbSB2NCB0byB2NQo+ID4gPiAgICAgLSB1cGRhdGUg Y29tbWl0IG1lc3NhZ2UKPiA+ID4gICAgIC0gZGlyZWN0IHVzaW5nIGNsayBuYW1lIGxpc3QsIGlu c3RlYWQgb2YgbWFjcm8KPiA+ID4gICAgIC0gc3RpbGwga2VlcCBjYWN1bGF0ZSBjbGsgbGlzdCBj b3VudCBiZWNhdXNlIHNpemVvZiByZXR1cm4gcHJlIGFsbG9jYXRlZAo+ID4gPiAgICAgYXJyYXkg c2l6ZS4KPiA+ID4gICAgIAo+ID4gPiAgICAgQ2hhbmdlIGZyb20gdjMgdG8gdjQKPiA+ID4gICAg IC0gdXNpbmcgY2xrX2J1bGtfKigpIEFQSQo+ID4gPiAgICAgQ2hhbmdlIGZyb20gdjEgdG8gdjMK PiA+ID4gICAgIC0gbm9uZQo+ID4gPiAKPiA+ID4gIGRyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdj L3BjaS1pbXg2LmMgfCAxMjUgKysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0KPiA+ID4gIDEgZmls ZSBjaGFuZ2VkLCAzNSBpbnNlcnRpb25zKCspLCA5MCBkZWxldGlvbnMoLSkKPiA+ID4gCj4gPiA+ IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL2R3Yy9wY2ktaW14Ni5jIGIvZHJp dmVycy9wY2kvY29udHJvbGxlci9kd2MvcGNpLWlteDYuYwo+ID4gPiBpbmRleCA3NDcwMzM2MmFl ZWM3Li41MGQ5ZmFhYTE3ZjcxIDEwMDY0NAo+ID4gPiAtLS0gYS9kcml2ZXJzL3BjaS9jb250cm9s bGVyL2R3Yy9wY2ktaW14Ni5jCj4gPiA+ICsrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdj L3BjaS1pbXg2LmMKClsuLi5dCgo+ID4gPiAgCj4gPiA+IC0JLyogRmV0Y2ggY2xvY2tzICovCj4g PiA+IC0JaW14Nl9wY2llLT5wY2llX2J1cyA9IGRldm1fY2xrX2dldChkZXYsICJwY2llX2J1cyIp Owo+ID4gPiAtCWlmIChJU19FUlIoaW14Nl9wY2llLT5wY2llX2J1cykpCj4gPiA+IC0JCXJldHVy biBkZXZfZXJyX3Byb2JlKGRldiwgUFRSX0VSUihpbXg2X3BjaWUtPnBjaWVfYnVzKSwKPiA+ID4g LQkJCQkgICAgICJwY2llX2J1cyBjbG9jayBzb3VyY2UgbWlzc2luZyBvciBpbnZhbGlkXG4iKTsK PiA+ID4gKwl3aGlsZSAoaW14Nl9wY2llLT5kcnZkYXRhLT5jbGtfbmFtZXNbaW14Nl9wY2llLT5j bGtzX2NudF0pIHsKPiA+ID4gKwkJaW50IGkgPSBpbXg2X3BjaWUtPmNsa3NfY250Owo+ID4gCj4g PiBXaHkgY2FuJ3QgeW91IGluaXRpYWxpemUgaSB0byAwIGRpcmVjdGx5Pwo+IAo+IGNhbid0IGlu aXQgaSB0byAwIGRpcmVjdGx5IGhlcmUsIG90aGVyd2lzZSBuZXh0IGxvb3AgaSB3aWxsIG5vdCBp bmNyZWFzZS4KPiBpIGp1c3QgcmVkdWNlIHJlZmVyIGlteDZfcGNpZS0+Y2xrc19jbnQgaW4gCj4g Cj4gaW14Nl9wY2llLT5jbGtzW2ldLmlkID0gaW14Nl9wY2llLT5kcnZkYXRhLT5jbGtfbmFtZXNb aV07Cj4gCgpXYWl0Li4uIENhbid0IHlvdSBqdXN0IHVzZSBBUlJBWV9TSVpFKCkgdG8gY2FsY3Vs YXRlIHRoZSBjbGtzX2NudCBzdGF0aWNhbGx5PwoKTGlrZSwKCglzdGF0aWMgY29uc3QgY2hhciAq IGNvbnN0IGlteDhfY2xrX25hbWVzW10gPSB7CgkJInBjaWVfYnVzIiwgInBjaWUiLCAicGNpZV9h dXgiLAoJfTsKCglbLi4uXQoKCQkuY2xrX25hbWVzID0gaW14OF9jbGtfbmFtZXMsCgkJLmNsa3Nf Y250ID0gQVJSQVlfU0laRShpbXg4X2Nsa19uYW1lcyksCgpZb3UgY2FuIHVzZSB0aGUgc2FtZSBj bGtfbmFtZXMgYXJyYXkgZm9yIG11bHRpcGxlIFNvQ3MgaWYgdGhlIGNsb2NrcyBhcmUgc2FtZS4K SSBzaG91bGQndmUgbWVudGlvbmVkIHRoaXMgaW4gbGFzdCByZXZpZXcgaXRzZWxmLiBTb3JyeSBh Ym91dCB0aGF0LgoKLSBNYW5pCgo+IEZyYW5rCj4gCj4gPiAKPiA+IFJlc3QgbG9va3MgZ29vZCB0 byBtZS4KPiA+IAo+ID4gLSBNYW5pCj4gPiAKPiA+ID4gKwo+ID4gPiArCQlpbXg2X3BjaWUtPmNs a3NbaV0uaWQgPSBpbXg2X3BjaWUtPmRydmRhdGEtPmNsa19uYW1lc1tpXTsKPiA+ID4gKwkJaW14 Nl9wY2llLT5jbGtzX2NudCsrOwo+ID4gPiArCX0KPiA+ID4gIAo+ID4gPiAtCWlteDZfcGNpZS0+ cGNpZSA9IGRldm1fY2xrX2dldChkZXYsICJwY2llIik7Cj4gPiA+IC0JaWYgKElTX0VSUihpbXg2 X3BjaWUtPnBjaWUpKQo+ID4gPiAtCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIFBUUl9FUlIo aW14Nl9wY2llLT5wY2llKSwKPiA+ID4gLQkJCQkgICAgICJwY2llIGNsb2NrIHNvdXJjZSBtaXNz aW5nIG9yIGludmFsaWRcbiIpOwo+ID4gPiArCS8qIEZldGNoIGNsb2NrcyAqLwo+ID4gPiArCXJl dCA9IGRldm1fY2xrX2J1bGtfZ2V0KGRldiwgaW14Nl9wY2llLT5jbGtzX2NudCwgaW14Nl9wY2ll LT5jbGtzKTsKPiA+ID4gKwlpZiAocmV0KQo+ID4gPiArCQlyZXR1cm4gcmV0Owo+ID4gPiAgCj4g PiA+ICAJc3dpdGNoIChpbXg2X3BjaWUtPmRydmRhdGEtPnZhcmlhbnQpIHsKPiA+ID4gLQljYXNl IElNWDZTWDoKPiA+ID4gLQkJaW14Nl9wY2llLT5wY2llX2luYm91bmRfYXhpID0gZGV2bV9jbGtf Z2V0KGRldiwKPiA+ID4gLQkJCQkJCQkgICAicGNpZV9pbmJvdW5kX2F4aSIpOwo+ID4gPiAtCQlp ZiAoSVNfRVJSKGlteDZfcGNpZS0+cGNpZV9pbmJvdW5kX2F4aSkpCj4gPiA+IC0JCQlyZXR1cm4g ZGV2X2Vycl9wcm9iZShkZXYsIFBUUl9FUlIoaW14Nl9wY2llLT5wY2llX2luYm91bmRfYXhpKSwK PiA+ID4gLQkJCQkJICAgICAicGNpZV9pbmJvdW5kX2F4aSBjbG9jayBtaXNzaW5nIG9yIGludmFs aWRcbiIpOwo+ID4gPiAtCQlicmVhazsKPiA+ID4gLQljYXNlIElNWDhNUToKPiA+ID4gLQljYXNl IElNWDhNUV9FUDoKPiA+ID4gLQkJaW14Nl9wY2llLT5wY2llX2F1eCA9IGRldm1fY2xrX2dldChk ZXYsICJwY2llX2F1eCIpOwo+ID4gPiAtCQlpZiAoSVNfRVJSKGlteDZfcGNpZS0+cGNpZV9hdXgp KQo+ID4gPiAtCQkJcmV0dXJuIGRldl9lcnJfcHJvYmUoZGV2LCBQVFJfRVJSKGlteDZfcGNpZS0+ cGNpZV9hdXgpLAo+ID4gPiAtCQkJCQkgICAgICJwY2llX2F1eCBjbG9jayBzb3VyY2UgbWlzc2lu ZyBvciBpbnZhbGlkXG4iKTsKPiA+ID4gLQkJZmFsbHRocm91Z2g7Cj4gPiA+ICAJY2FzZSBJTVg3 RDoKPiA+ID4gIAkJaWYgKGRiaV9iYXNlLT5zdGFydCA9PSBJTVg4TVFfUENJRTJfQkFTRV9BRERS KQo+ID4gPiAgCQkJaW14Nl9wY2llLT5jb250cm9sbGVyX2lkID0gMTsKPiA+ID4gQEAgLTEzNTMs MTAgKzEzMDAsNiBAQCBzdGF0aWMgaW50IGlteDZfcGNpZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1f ZGV2aWNlICpwZGV2KQo+ID4gPiAgCWNhc2UgSU1YOE1NX0VQOgo+ID4gPiAgCWNhc2UgSU1YOE1Q Ogo+ID4gPiAgCWNhc2UgSU1YOE1QX0VQOgo+ID4gPiAtCQlpbXg2X3BjaWUtPnBjaWVfYXV4ID0g ZGV2bV9jbGtfZ2V0KGRldiwgInBjaWVfYXV4Iik7Cj4gPiA+IC0JCWlmIChJU19FUlIoaW14Nl9w Y2llLT5wY2llX2F1eCkpCj4gPiA+IC0JCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIFBUUl9F UlIoaW14Nl9wY2llLT5wY2llX2F1eCksCj4gPiA+IC0JCQkJCSAgICAgInBjaWVfYXV4IGNsb2Nr IHNvdXJjZSBtaXNzaW5nIG9yIGludmFsaWRcbiIpOwo+ID4gPiAgCQlpbXg2X3BjaWUtPmFwcHNf cmVzZXQgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0X2V4Y2x1c2l2ZShkZXYsCj4gPiA+ICAJCQkJ CQkJCQkgImFwcHMiKTsKPiA+ID4gIAkJaWYgKElTX0VSUihpbXg2X3BjaWUtPmFwcHNfcmVzZXQp KQo+ID4gPiBAQCAtMTM3MiwxNCArMTMxNSw2IEBAIHN0YXRpYyBpbnQgaW14Nl9wY2llX3Byb2Jl KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiA+ICAJZGVmYXVsdDoKPiA+ID4gIAkJ YnJlYWs7Cj4gPiA+ICAJfQo+ID4gPiAtCS8qIERvbid0IGZldGNoIHRoZSBwY2llX3BoeSBjbG9j aywgaWYgaXQgaGFzIGFic3RyYWN0IFBIWSBkcml2ZXIgKi8KPiA+ID4gLQlpZiAoaW14Nl9wY2ll LT5waHkgPT0gTlVMTCkgewo+ID4gPiAtCQlpbXg2X3BjaWUtPnBjaWVfcGh5ID0gZGV2bV9jbGtf Z2V0KGRldiwgInBjaWVfcGh5Iik7Cj4gPiA+IC0JCWlmIChJU19FUlIoaW14Nl9wY2llLT5wY2ll X3BoeSkpCj4gPiA+IC0JCQlyZXR1cm4gZGV2X2Vycl9wcm9iZShkZXYsIFBUUl9FUlIoaW14Nl9w Y2llLT5wY2llX3BoeSksCj4gPiA+IC0JCQkJCSAgICAgInBjaWVfcGh5IGNsb2NrIHNvdXJjZSBt aXNzaW5nIG9yIGludmFsaWRcbiIpOwo+ID4gPiAtCX0KPiA+ID4gLQo+ID4gPiAgCj4gPiA+ICAJ LyogR3JhYiB0dXJub2ZmIHJlc2V0ICovCj4gPiA+ICAJaW14Nl9wY2llLT50dXJub2ZmX3Jlc2V0 ID0gZGV2bV9yZXNldF9jb250cm9sX2dldF9vcHRpb25hbF9leGNsdXNpdmUoZGV2LCAidHVybm9m ZiIpOwo+ID4gPiBAQCAtMTQ3Nyw2ICsxNDEyLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBpbXg2 X3BjaWVfZHJ2ZGF0YSBkcnZkYXRhW10gPSB7Cj4gPiA+ICAJCQkgSU1YNl9QQ0lFX0ZMQUdfSU1Y Nl9TUEVFRF9DSEFOR0UsCj4gPiA+ICAJCS5kYmlfbGVuZ3RoID0gMHgyMDAsCj4gPiA+ICAJCS5n cHIgPSAiZnNsLGlteDZxLWlvbXV4Yy1ncHIiLAo+ID4gPiArCQkuY2xrX25hbWVzID0geyJwY2ll X2J1cyIsICJwY2llIiwgInBjaWVfcGh5In0sCj4gPiA+ICAJfSwKPiA+ID4gIAlbSU1YNlNYXSA9 IHsKPiA+ID4gIAkJLnZhcmlhbnQgPSBJTVg2U1gsCj4gPiA+IEBAIC0xNDg0LDYgKzE0MjAsNyBA QCBzdGF0aWMgY29uc3Qgc3RydWN0IGlteDZfcGNpZV9kcnZkYXRhIGRydmRhdGFbXSA9IHsKPiA+ ID4gIAkJCSBJTVg2X1BDSUVfRkxBR19JTVg2X1NQRUVEX0NIQU5HRSB8Cj4gPiA+ICAJCQkgSU1Y Nl9QQ0lFX0ZMQUdfU1VQUE9SVFNfU1VTUEVORCwKPiA+ID4gIAkJLmdwciA9ICJmc2wsaW14NnEt aW9tdXhjLWdwciIsCj4gPiA+ICsJCS5jbGtfbmFtZXMgPSB7InBjaWVfYnVzIiwgInBjaWUiLCAi cGNpZV9waHkiLCAicGNpZV9pbmJvdW5kX2F4aSJ9LAo+ID4gPiAgCX0sCj4gPiA+ICAJW0lNWDZR UF0gPSB7Cj4gPiA+ICAJCS52YXJpYW50ID0gSU1YNlFQLAo+ID4gPiBAQCAtMTQ5Miw0MCArMTQy OSw0OCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGlteDZfcGNpZV9kcnZkYXRhIGRydmRhdGFbXSA9 IHsKPiA+ID4gIAkJCSBJTVg2X1BDSUVfRkxBR19TVVBQT1JUU19TVVNQRU5ELAo+ID4gPiAgCQku ZGJpX2xlbmd0aCA9IDB4MjAwLAo+ID4gPiAgCQkuZ3ByID0gImZzbCxpbXg2cS1pb211eGMtZ3By IiwKPiA+ID4gKwkJLmNsa19uYW1lcyA9IHsicGNpZV9idXMiLCAicGNpZSIsICJwY2llX3BoeSJ9 LAo+ID4gPiAgCX0sCj4gPiA+ICAJW0lNWDdEXSA9IHsKPiA+ID4gIAkJLnZhcmlhbnQgPSBJTVg3 RCwKPiA+ID4gIAkJLmZsYWdzID0gSU1YNl9QQ0lFX0ZMQUdfU1VQUE9SVFNfU1VTUEVORCwKPiA+ ID4gIAkJLmdwciA9ICJmc2wsaW14N2QtaW9tdXhjLWdwciIsCj4gPiA+ICsJCS5jbGtfbmFtZXMg PSB7InBjaWVfYnVzIiwgInBjaWUiLCAicGNpZV9waHkifSwKPiA+ID4gIAl9LAo+ID4gPiAgCVtJ TVg4TVFdID0gewo+ID4gPiAgCQkudmFyaWFudCA9IElNWDhNUSwKPiA+ID4gIAkJLmdwciA9ICJm c2wsaW14OG1xLWlvbXV4Yy1ncHIiLAo+ID4gPiArCQkuY2xrX25hbWVzID0geyJwY2llX2J1cyIs ICJwY2llIiwgInBjaWVfcGh5IiwgInBjaWVfYXV4In0sCj4gPiA+ICAJfSwKPiA+ID4gIAlbSU1Y OE1NXSA9IHsKPiA+ID4gIAkJLnZhcmlhbnQgPSBJTVg4TU0sCj4gPiA+ICAJCS5mbGFncyA9IElN WDZfUENJRV9GTEFHX1NVUFBPUlRTX1NVU1BFTkQsCj4gPiA+ICAJCS5ncHIgPSAiZnNsLGlteDht bS1pb211eGMtZ3ByIiwKPiA+ID4gKwkJLmNsa19uYW1lcyA9IHsicGNpZV9idXMiLCAicGNpZSIs ICJwY2llX2F1eCJ9LAo+ID4gPiAgCX0sCj4gPiA+ICAJW0lNWDhNUF0gPSB7Cj4gPiA+ICAJCS52 YXJpYW50ID0gSU1YOE1QLAo+ID4gPiAgCQkuZmxhZ3MgPSBJTVg2X1BDSUVfRkxBR19TVVBQT1JU U19TVVNQRU5ELAo+ID4gPiAgCQkuZ3ByID0gImZzbCxpbXg4bXAtaW9tdXhjLWdwciIsCj4gPiA+ ICsJCS5jbGtfbmFtZXMgPSB7InBjaWVfYnVzIiwgInBjaWUiLCAicGNpZV9hdXgifSwKPiA+ID4g IAl9LAo+ID4gPiAgCVtJTVg4TVFfRVBdID0gewo+ID4gPiAgCQkudmFyaWFudCA9IElNWDhNUV9F UCwKPiA+ID4gIAkJLm1vZGUgPSBEV19QQ0lFX0VQX1RZUEUsCj4gPiA+ICAJCS5ncHIgPSAiZnNs LGlteDhtcS1pb211eGMtZ3ByIiwKPiA+ID4gKwkJLmNsa19uYW1lcyA9IHsicGNpZV9idXMiLCAi cGNpZSIsICJwY2llX3BoeSIsICJwY2llX2F1eCJ9LAo+ID4gPiAgCX0sCj4gPiA+ICAJW0lNWDhN TV9FUF0gPSB7Cj4gPiA+ICAJCS52YXJpYW50ID0gSU1YOE1NX0VQLAo+ID4gPiAgCQkubW9kZSA9 IERXX1BDSUVfRVBfVFlQRSwKPiA+ID4gIAkJLmdwciA9ICJmc2wsaW14OG1tLWlvbXV4Yy1ncHIi LAo+ID4gPiArCQkuY2xrX25hbWVzID0geyJwY2llX2J1cyIsICJwY2llIiwgInBjaWVfYXV4In0s Cj4gPiA+ICAJfSwKPiA+ID4gIAlbSU1YOE1QX0VQXSA9IHsKPiA+ID4gIAkJLnZhcmlhbnQgPSBJ TVg4TVBfRVAsCj4gPiA+ICAJCS5tb2RlID0gRFdfUENJRV9FUF9UWVBFLAo+ID4gPiAgCQkuZ3By ID0gImZzbCxpbXg4bXAtaW9tdXhjLWdwciIsCj4gPiA+ICsJCS5jbGtfbmFtZXMgPSB7InBjaWVf YnVzIiwgInBjaWUiLCAicGNpZV9hdXgifSwKPiA+ID4gIAl9LAo+ID4gPiAgfTsKPiA+ID4gIAo+ ID4gPiAtLSAKPiA+ID4gMi4zNC4xCj4gPiA+IAo+ID4gCj4gPiAtLSAKPiA+IOCuruCuo+Cuv+Cu teCuo+CvjeCuo+CuqeCvjSDgrprgrqTgrr7grprgrr/grrXgrq7gr40KCi0tIArgrq7grqPgrr/g rrXgrqPgr43grqPgrqngr40g4K6a4K6k4K6+4K6a4K6/4K614K6u4K+NCgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxp bmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3Rz LmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==