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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8E262C28D13 for ; Mon, 22 Aug 2022 08:38:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232719AbiHVIiz (ORCPT ); Mon, 22 Aug 2022 04:38:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48464 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233615AbiHVIit (ORCPT ); Mon, 22 Aug 2022 04:38:49 -0400 Received: from comms.puri.sm (comms.puri.sm [159.203.221.185]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A524213D04; Mon, 22 Aug 2022 01:38:48 -0700 (PDT) Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id 26B01E10D7; Mon, 22 Aug 2022 01:38:17 -0700 (PDT) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id NzF1olkKBo4b; Mon, 22 Aug 2022 01:38:16 -0700 (PDT) Message-ID: <77baacb930bf2ba1a65cb1515e6795b48d2d4ed5.camel@puri.sm> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=puri.sm; s=comms; t=1661157496; bh=Or8IwOdSKEWwlGznaa4jIrIy54u6R0bhCX7D8BpveYc=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=G+0ygPseRNiuy7XIUI/F0uRFYjM3u+rJkq/3MHDCQ8gA+QlYmcfFp1vFHIlaVXNYi kyChZfMM6UUO7+Dm+75vexUyQOzpVeClDtMbs2DDX0wS5tfysSJ7Z9mpErUvOPg22l TGxDkJSmIQKXuAUiM81XxXxyAUSGKWwRZU/mGP6+v+9nTRKTzN39VKNdw4qj+KHVcc eGH+I+C46hYGWHBFVSyZvu3I3KzNIV5TvLIZCrEr5ZwIpRXiS2rF9vFkGmiX+3F4/w cuRwbLchuWwx2sAZmUAb9o1EP0IQFvtF+4ybV57q6SjZeuYAgg7hQ5D9/HLhswUsN6 cj9XA0AK9NYIg== Subject: Re: [PATCH v6 1/2] power: domain: handle genpd correctly when needing interrupts From: Martin Kepplinger To: Ulf Hansson Cc: rafael@kernel.org, khilman@kernel.org, robh@kernel.org, krzysztof.kozlowski@linaro.org, shawnguo@kernel.org, s.hauer@pengutronix.de, festevam@gmail.com, pavel@ucw.cz, kernel@puri.sm, linux-imx@nxp.com, broonie@kernel.org, l.stach@pengutronix.de, aford173@gmail.com, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Date: Mon, 22 Aug 2022 10:38:10 +0200 In-Reply-To: References: <20220726083257.1730630-1-martin.kepplinger@puri.sm> <20220726083257.1730630-2-martin.kepplinger@puri.sm> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Am Freitag, dem 19.08.2022 um 16:53 +0200 schrieb Ulf Hansson: > On Fri, 19 Aug 2022 at 11:17, Martin Kepplinger > wrote: > > > > Am Dienstag, dem 26.07.2022 um 17:07 +0200 schrieb Ulf Hansson: > > > On Tue, 26 Jul 2022 at 10:33, Martin Kepplinger > > > wrote: > > > > > > > > If for example the power-domains' power-supply node (regulator) > > > > needs > > > > interrupts to work, the current setup with noirq callbacks > > > > cannot > > > > work; for example a pmic regulator on i2c, when suspending, > > > > usually > > > > already > > > > times out during suspend_noirq: > > > > > > > > [   41.024193] buck4: failed to disable: -ETIMEDOUT > > > > > > > > So fix system suspend and resume for these power-domains by > > > > using > > > > the > > > > "outer" suspend/resume callbacks instead. Tested on the imx8mq- > > > > librem5 board, > > > > but by looking at the dts, this will fix imx8mq-evk and > > > > possibly > > > > many other > > > > boards too. > > > > > > > > This is designed so that genpd providers just say "this genpd > > > > needs > > > > interrupts" (by setting the flag) - without implying an > > > > implementation. > > > > > > > > Initially system suspend problems had been discussed at > > > > https://lore.kernel.org/linux-arm-kernel/20211002005954.1367653-8-l.stach@pengutronix.de/ > > > > which led to discussing the pmic that contains the regulators > > > > which > > > > serve as power-domain power-supplies: > > > > https://lore.kernel.org/linux-pm/573166b75e524517782471c2b7f96e03fd93d175.camel@puri.sm/T/ > > > > > > > > Signed-off-by: Martin Kepplinger > > > > --- > > > >  drivers/base/power/domain.c | 13 +++++++++++-- > > > >  include/linux/pm_domain.h   |  5 +++++ > > > >  2 files changed, 16 insertions(+), 2 deletions(-) > > > > > > > > diff --git a/drivers/base/power/domain.c > > > > b/drivers/base/power/domain.c > > > > index 5a2e0232862e..58376752a4de 100644 > > > > --- a/drivers/base/power/domain.c > > > > +++ b/drivers/base/power/domain.c > > > > @@ -130,6 +130,7 @@ static const struct genpd_lock_ops > > > > genpd_spin_ops = { > > > >  #define genpd_is_active_wakeup(genpd)  (genpd->flags & > > > > GENPD_FLAG_ACTIVE_WAKEUP) > > > >  #define genpd_is_cpu_domain(genpd)     (genpd->flags & > > > > GENPD_FLAG_CPU_DOMAIN) > > > >  #define genpd_is_rpm_always_on(genpd)  (genpd->flags & > > > > GENPD_FLAG_RPM_ALWAYS_ON) > > > > +#define genpd_irq_on(genpd)            (genpd->flags & > > > > GENPD_FLAG_IRQ_ON) > > > > > > > >  static inline bool irq_safe_dev_in_sleep_domain(struct device > > > > *dev, > > > >                 const struct generic_pm_domain *genpd) > > > > @@ -2065,8 +2066,15 @@ int pm_genpd_init(struct > > > > generic_pm_domain > > > > *genpd, > > > >         genpd->domain.ops.runtime_suspend = > > > > genpd_runtime_suspend; > > > >         genpd->domain.ops.runtime_resume = > > > > genpd_runtime_resume; > > > >         genpd->domain.ops.prepare = genpd_prepare; > > > > -       genpd->domain.ops.suspend_noirq = genpd_suspend_noirq; > > > > -       genpd->domain.ops.resume_noirq = genpd_resume_noirq; > > > > + > > > > +       if (genpd_irq_on(genpd)) { > > > > +               genpd->domain.ops.suspend = > > > > genpd_suspend_noirq; > > > > +               genpd->domain.ops.resume = genpd_resume_noirq; > > > > +       } else { > > > > +               genpd->domain.ops.suspend_noirq = > > > > genpd_suspend_noirq; > > > > +               genpd->domain.ops.resume_noirq = > > > > genpd_resume_noirq; > > > > > > As we discussed previously, I am thinking that it may be better > > > to > > > move to using genpd->domain.ops.suspend_late and > > > genpd->domain.ops.resume_early instead. > > > > Wouldn't that better be a separate patch (on top)? Do you really > > want > > me to change the current behaviour (default case) to from noirq to > > late? Then I'll resend this series with such a patch added. > > Sorry, I wasn't clear enough, the default behaviour should remain as > is. > > What I meant was, when genpd_irq_on() is true, we should use the > genpd->domain.ops.suspend_late and genpd->domain.ops.resume_early. Testing that shows that this isn't working. I can provide the logs later, but suspend fails and I think it makes sense: "suspend_late" is simply already too late when i2c (or any needed driver) uses "suspend". > > Kind regards > Uffe 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 19B81C28D13 for ; Mon, 22 Aug 2022 08:56:03 +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: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=zempH8UVGCRdX0OQT3kR0HvmScMMYzVDwcXXLJpTqpg=; b=escFK4XjRoo7U8 /dX/tE0+HZYupXiexJYvVtV1+pux3vlflHzCWyk4NqUZV2gFMnZYHOlbmoTs92ywqdCtFKmURot/v akyfG/4cREoFhOMh6cS/OZojfTby0a8erp/d7fSowySHzgFDESyMoH65PU1PCXlJhhvK0boujW12/ +aB7dWkMLz6Ut7kRow5JuA/F+KbPW1tt6QvJ5nLu1PkJyA6DLs6sguzdhyi0017KBtGY9WlSWcCOm Zh4mbkS8pApgEvvnoB5f7fNg5ki3znuymo8Mpq5DJUHCpMItxFNiBLSiMbpM3F3Dfm4UkHIoh+r3v Y2vPcuU3VBeoWNdueoDw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oQ3Cl-006hVA-5A; Mon, 22 Aug 2022 08:54:43 +0000 Received: from comms.puri.sm ([159.203.221.185]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oQ2wy-006YRB-Dk for linux-arm-kernel@lists.infradead.org; Mon, 22 Aug 2022 08:38:32 +0000 Received: from localhost (localhost [127.0.0.1]) by comms.puri.sm (Postfix) with ESMTP id 26B01E10D7; Mon, 22 Aug 2022 01:38:17 -0700 (PDT) Received: from comms.puri.sm ([127.0.0.1]) by localhost (comms.puri.sm [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id NzF1olkKBo4b; Mon, 22 Aug 2022 01:38:16 -0700 (PDT) Message-ID: <77baacb930bf2ba1a65cb1515e6795b48d2d4ed5.camel@puri.sm> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=puri.sm; s=comms; t=1661157496; bh=Or8IwOdSKEWwlGznaa4jIrIy54u6R0bhCX7D8BpveYc=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=G+0ygPseRNiuy7XIUI/F0uRFYjM3u+rJkq/3MHDCQ8gA+QlYmcfFp1vFHIlaVXNYi kyChZfMM6UUO7+Dm+75vexUyQOzpVeClDtMbs2DDX0wS5tfysSJ7Z9mpErUvOPg22l TGxDkJSmIQKXuAUiM81XxXxyAUSGKWwRZU/mGP6+v+9nTRKTzN39VKNdw4qj+KHVcc eGH+I+C46hYGWHBFVSyZvu3I3KzNIV5TvLIZCrEr5ZwIpRXiS2rF9vFkGmiX+3F4/w cuRwbLchuWwx2sAZmUAb9o1EP0IQFvtF+4ybV57q6SjZeuYAgg7hQ5D9/HLhswUsN6 cj9XA0AK9NYIg== Subject: Re: [PATCH v6 1/2] power: domain: handle genpd correctly when needing interrupts From: Martin Kepplinger To: Ulf Hansson Cc: rafael@kernel.org, khilman@kernel.org, robh@kernel.org, krzysztof.kozlowski@linaro.org, shawnguo@kernel.org, s.hauer@pengutronix.de, festevam@gmail.com, pavel@ucw.cz, kernel@puri.sm, linux-imx@nxp.com, broonie@kernel.org, l.stach@pengutronix.de, aford173@gmail.com, linux-pm@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Date: Mon, 22 Aug 2022 10:38:10 +0200 In-Reply-To: References: <20220726083257.1730630-1-martin.kepplinger@puri.sm> <20220726083257.1730630-2-martin.kepplinger@puri.sm> User-Agent: Evolution 3.38.3-1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220822_013824_549173_F66AD858 X-CRM114-Status: GOOD ( 36.68 ) 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 QW0gRnJlaXRhZywgZGVtIDE5LjA4LjIwMjIgdW0gMTY6NTMgKzAyMDAgc2NocmllYiBVbGYgSGFu c3NvbjoKPiBPbiBGcmksIDE5IEF1ZyAyMDIyIGF0IDExOjE3LCBNYXJ0aW4gS2VwcGxpbmdlcgo+ IDxtYXJ0aW4ua2VwcGxpbmdlckBwdXJpLnNtPiB3cm90ZToKPiA+IAo+ID4gQW0gRGllbnN0YWcs IGRlbSAyNi4wNy4yMDIyIHVtIDE3OjA3ICswMjAwIHNjaHJpZWIgVWxmIEhhbnNzb246Cj4gPiA+ IE9uIFR1ZSwgMjYgSnVsIDIwMjIgYXQgMTA6MzMsIE1hcnRpbiBLZXBwbGluZ2VyCj4gPiA+IDxt YXJ0aW4ua2VwcGxpbmdlckBwdXJpLnNtPiB3cm90ZToKPiA+ID4gPiAKPiA+ID4gPiBJZiBmb3Ig ZXhhbXBsZSB0aGUgcG93ZXItZG9tYWlucycgcG93ZXItc3VwcGx5IG5vZGUgKHJlZ3VsYXRvcikK PiA+ID4gPiBuZWVkcwo+ID4gPiA+IGludGVycnVwdHMgdG8gd29yaywgdGhlIGN1cnJlbnQgc2V0 dXAgd2l0aCBub2lycSBjYWxsYmFja3MKPiA+ID4gPiBjYW5ub3QKPiA+ID4gPiB3b3JrOyBmb3Ig ZXhhbXBsZSBhIHBtaWMgcmVndWxhdG9yIG9uIGkyYywgd2hlbiBzdXNwZW5kaW5nLAo+ID4gPiA+ IHVzdWFsbHkKPiA+ID4gPiBhbHJlYWR5Cj4gPiA+ID4gdGltZXMgb3V0IGR1cmluZyBzdXNwZW5k X25vaXJxOgo+ID4gPiA+IAo+ID4gPiA+IFvCoMKgIDQxLjAyNDE5M10gYnVjazQ6IGZhaWxlZCB0 byBkaXNhYmxlOiAtRVRJTUVET1VUCj4gPiA+ID4gCj4gPiA+ID4gU28gZml4IHN5c3RlbSBzdXNw ZW5kIGFuZCByZXN1bWUgZm9yIHRoZXNlIHBvd2VyLWRvbWFpbnMgYnkKPiA+ID4gPiB1c2luZwo+ ID4gPiA+IHRoZQo+ID4gPiA+ICJvdXRlciIgc3VzcGVuZC9yZXN1bWUgY2FsbGJhY2tzIGluc3Rl YWQuIFRlc3RlZCBvbiB0aGUgaW14OG1xLQo+ID4gPiA+IGxpYnJlbTUgYm9hcmQsCj4gPiA+ID4g YnV0IGJ5IGxvb2tpbmcgYXQgdGhlIGR0cywgdGhpcyB3aWxsIGZpeCBpbXg4bXEtZXZrIGFuZAo+ ID4gPiA+IHBvc3NpYmx5Cj4gPiA+ID4gbWFueSBvdGhlcgo+ID4gPiA+IGJvYXJkcyB0b28uCj4g PiA+ID4gCj4gPiA+ID4gVGhpcyBpcyBkZXNpZ25lZCBzbyB0aGF0IGdlbnBkIHByb3ZpZGVycyBq dXN0IHNheSAidGhpcyBnZW5wZAo+ID4gPiA+IG5lZWRzCj4gPiA+ID4gaW50ZXJydXB0cyIgKGJ5 IHNldHRpbmcgdGhlIGZsYWcpIC0gd2l0aG91dCBpbXBseWluZyBhbgo+ID4gPiA+IGltcGxlbWVu dGF0aW9uLgo+ID4gPiA+IAo+ID4gPiA+IEluaXRpYWxseSBzeXN0ZW0gc3VzcGVuZCBwcm9ibGVt cyBoYWQgYmVlbiBkaXNjdXNzZWQgYXQKPiA+ID4gPiBodHRwczovL2xvcmUua2VybmVsLm9yZy9s aW51eC1hcm0ta2VybmVsLzIwMjExMDAyMDA1OTU0LjEzNjc2NTMtOC1sLnN0YWNoQHBlbmd1dHJv bml4LmRlLwo+ID4gPiA+IHdoaWNoIGxlZCB0byBkaXNjdXNzaW5nIHRoZSBwbWljIHRoYXQgY29u dGFpbnMgdGhlIHJlZ3VsYXRvcnMKPiA+ID4gPiB3aGljaAo+ID4gPiA+IHNlcnZlIGFzIHBvd2Vy LWRvbWFpbiBwb3dlci1zdXBwbGllczoKPiA+ID4gPiBodHRwczovL2xvcmUua2VybmVsLm9yZy9s aW51eC1wbS81NzMxNjZiNzVlNTI0NTE3NzgyNDcxYzJiN2Y5NmUwM2ZkOTNkMTc1LmNhbWVsQHB1 cmkuc20vVC8KPiA+ID4gPiAKPiA+ID4gPiBTaWduZWQtb2ZmLWJ5OiBNYXJ0aW4gS2VwcGxpbmdl ciA8bWFydGluLmtlcHBsaW5nZXJAcHVyaS5zbT4KPiA+ID4gPiAtLS0KPiA+ID4gPiDCoGRyaXZl cnMvYmFzZS9wb3dlci9kb21haW4uYyB8IDEzICsrKysrKysrKysrLS0KPiA+ID4gPiDCoGluY2x1 ZGUvbGludXgvcG1fZG9tYWluLmjCoMKgIHzCoCA1ICsrKysrCj4gPiA+ID4gwqAyIGZpbGVzIGNo YW5nZWQsIDE2IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCj4gPiA+ID4gCj4gPiA+ID4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW4uYwo+ID4gPiA+IGIvZHJpdmVy cy9iYXNlL3Bvd2VyL2RvbWFpbi5jCj4gPiA+ID4gaW5kZXggNWEyZTAyMzI4NjJlLi41ODM3Njc1 MmE0ZGUgMTAwNjQ0Cj4gPiA+ID4gLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbi5jCj4g PiA+ID4gKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbi5jCj4gPiA+ID4gQEAgLTEzMCw2 ICsxMzAsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGdlbnBkX2xvY2tfb3BzCj4gPiA+ID4gZ2Vu cGRfc3Bpbl9vcHMgPSB7Cj4gPiA+ID4gwqAjZGVmaW5lIGdlbnBkX2lzX2FjdGl2ZV93YWtldXAo Z2VucGQpwqAgKGdlbnBkLT5mbGFncyAmCj4gPiA+ID4gR0VOUERfRkxBR19BQ1RJVkVfV0FLRVVQ KQo+ID4gPiA+IMKgI2RlZmluZSBnZW5wZF9pc19jcHVfZG9tYWluKGdlbnBkKcKgwqDCoMKgIChn ZW5wZC0+ZmxhZ3MgJgo+ID4gPiA+IEdFTlBEX0ZMQUdfQ1BVX0RPTUFJTikKPiA+ID4gPiDCoCNk ZWZpbmUgZ2VucGRfaXNfcnBtX2Fsd2F5c19vbihnZW5wZCnCoCAoZ2VucGQtPmZsYWdzICYKPiA+ ID4gPiBHRU5QRF9GTEFHX1JQTV9BTFdBWVNfT04pCj4gPiA+ID4gKyNkZWZpbmUgZ2VucGRfaXJx X29uKGdlbnBkKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGdlbnBkLT5mbGFncyAmCj4gPiA+ID4g R0VOUERfRkxBR19JUlFfT04pCj4gPiA+ID4gCj4gPiA+ID4gwqBzdGF0aWMgaW5saW5lIGJvb2wg aXJxX3NhZmVfZGV2X2luX3NsZWVwX2RvbWFpbihzdHJ1Y3QgZGV2aWNlCj4gPiA+ID4gKmRldiwK PiA+ID4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3Qgc3RydWN0IGdlbmVy aWNfcG1fZG9tYWluICpnZW5wZCkKPiA+ID4gPiBAQCAtMjA2NSw4ICsyMDY2LDE1IEBAIGludCBw bV9nZW5wZF9pbml0KHN0cnVjdAo+ID4gPiA+IGdlbmVyaWNfcG1fZG9tYWluCj4gPiA+ID4gKmdl bnBkLAo+ID4gPiA+IMKgwqDCoMKgwqDCoMKgIGdlbnBkLT5kb21haW4ub3BzLnJ1bnRpbWVfc3Vz cGVuZCA9Cj4gPiA+ID4gZ2VucGRfcnVudGltZV9zdXNwZW5kOwo+ID4gPiA+IMKgwqDCoMKgwqDC oMKgIGdlbnBkLT5kb21haW4ub3BzLnJ1bnRpbWVfcmVzdW1lID0KPiA+ID4gPiBnZW5wZF9ydW50 aW1lX3Jlc3VtZTsKPiA+ID4gPiDCoMKgwqDCoMKgwqDCoCBnZW5wZC0+ZG9tYWluLm9wcy5wcmVw YXJlID0gZ2VucGRfcHJlcGFyZTsKPiA+ID4gPiAtwqDCoMKgwqDCoMKgIGdlbnBkLT5kb21haW4u b3BzLnN1c3BlbmRfbm9pcnEgPSBnZW5wZF9zdXNwZW5kX25vaXJxOwo+ID4gPiA+IC3CoMKgwqDC oMKgwqAgZ2VucGQtPmRvbWFpbi5vcHMucmVzdW1lX25vaXJxID0gZ2VucGRfcmVzdW1lX25vaXJx Owo+ID4gPiA+ICsKPiA+ID4gPiArwqDCoMKgwqDCoMKgIGlmIChnZW5wZF9pcnFfb24oZ2VucGQp KSB7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ2VucGQtPmRvbWFpbi5v cHMuc3VzcGVuZCA9Cj4gPiA+ID4gZ2VucGRfc3VzcGVuZF9ub2lycTsKPiA+ID4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnZW5wZC0+ZG9tYWluLm9wcy5yZXN1bWUgPSBnZW5wZF9y ZXN1bWVfbm9pcnE7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoCB9IGVsc2Ugewo+ID4gPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdlbnBkLT5kb21haW4ub3BzLnN1c3BlbmRfbm9pcnEg PQo+ID4gPiA+IGdlbnBkX3N1c3BlbmRfbm9pcnE7Cj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgZ2VucGQtPmRvbWFpbi5vcHMucmVzdW1lX25vaXJxID0KPiA+ID4gPiBnZW5w ZF9yZXN1bWVfbm9pcnE7Cj4gPiA+IAo+ID4gPiBBcyB3ZSBkaXNjdXNzZWQgcHJldmlvdXNseSwg SSBhbSB0aGlua2luZyB0aGF0IGl0IG1heSBiZSBiZXR0ZXIKPiA+ID4gdG8KPiA+ID4gbW92ZSB0 byB1c2luZyBnZW5wZC0+ZG9tYWluLm9wcy5zdXNwZW5kX2xhdGUgYW5kCj4gPiA+IGdlbnBkLT5k b21haW4ub3BzLnJlc3VtZV9lYXJseSBpbnN0ZWFkLgo+ID4gCj4gPiBXb3VsZG4ndCB0aGF0IGJl dHRlciBiZSBhIHNlcGFyYXRlIHBhdGNoIChvbiB0b3ApPyBEbyB5b3UgcmVhbGx5Cj4gPiB3YW50 Cj4gPiBtZSB0byBjaGFuZ2UgdGhlIGN1cnJlbnQgYmVoYXZpb3VyIChkZWZhdWx0IGNhc2UpIHRv IGZyb20gbm9pcnEgdG8KPiA+IGxhdGU/IFRoZW4gSSdsbCByZXNlbmQgdGhpcyBzZXJpZXMgd2l0 aCBzdWNoIGEgcGF0Y2ggYWRkZWQuCj4gCj4gU29ycnksIEkgd2Fzbid0IGNsZWFyIGVub3VnaCwg dGhlIGRlZmF1bHQgYmVoYXZpb3VyIHNob3VsZCByZW1haW4gYXMKPiBpcy4KPiAKPiBXaGF0IEkg bWVhbnQgd2FzLCB3aGVuIGdlbnBkX2lycV9vbigpIGlzIHRydWUsIHdlIHNob3VsZCB1c2UgdGhl Cj4gZ2VucGQtPmRvbWFpbi5vcHMuc3VzcGVuZF9sYXRlIGFuZCBnZW5wZC0+ZG9tYWluLm9wcy5y ZXN1bWVfZWFybHkuCgpUZXN0aW5nIHRoYXQgc2hvd3MgdGhhdCB0aGlzIGlzbid0IHdvcmtpbmcu IEkgY2FuIHByb3ZpZGUgdGhlIGxvZ3MKbGF0ZXIsIGJ1dCBzdXNwZW5kIGZhaWxzIGFuZCBJIHRo aW5rIGl0IG1ha2VzIHNlbnNlOiAic3VzcGVuZF9sYXRlIiBpcwpzaW1wbHkgYWxyZWFkeSB0b28g bGF0ZSB3aGVuIGkyYyAob3IgYW55IG5lZWRlZCBkcml2ZXIpIHVzZXMgInN1c3BlbmQiLgoKPiAK PiBLaW5kIHJlZ2FyZHMKPiBVZmZlCgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1r ZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWls bWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK