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 gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 03923C54F54 for ; Fri, 31 Jul 2026 10:30:34 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 4499110E1DE; Fri, 31 Jul 2026 10:30:34 +0000 (UTC) Authentication-Results: gabe.freedesktop.org; dkim=pass (2048-bit key; secure) header.d=sntech.de header.i=@sntech.de header.b="tcimYze/"; dkim-atps=neutral Received: from gloria.sntech.de (gloria.sntech.de [185.11.138.130]) by gabe.freedesktop.org (Postfix) with ESMTPS id BBDFD10E1DE for ; Fri, 31 Jul 2026 10:30:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sntech.de; s=gloria202408; h=Content-Type:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Reply-To; bh=PO5HApjpuCTFoG6dK7eT7+HEMHe6ytFiN3RSifQM+mc=; b=tcimYze/jo5hh4bufcOgKeQjX0 wyD85SoNiH2b0XUX9aEL+MXU+3z+SdA36ny2eU1ECanI6IXsLOe0NBSp/aX8ISgIwU5qYagsXzEbw fEfYU99LsS4ckdkphfm6y2XOZ3Gklbu7qCKM/g5cdMl8vNJZRwydqGO7kcwjYa8XYmwA+2/zppYtO 4gJJzMXF4qEXt7gGAE1/Ia30GUClhfTMQR3f6+qJw/WdNOr9wAvic+YvSC9hPRtJQJkxrQTD7XNGd bRwsooAb0jqRs5cY7R+GK74PY92b4sQrg+naxB7RATVk7BLqA1n+CYGOnRUMSqzUEWpx9UksLSA3g WIWEA4rQ==; From: Heiko =?UTF-8?B?U3TDvGJuZXI=?= To: Andrzej Hajda , Neil Armstrong , Robert Foss , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andy Yan , Damon Ding Cc: Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Dmitry Baryshkov , Marek Szyprowski , Sebastian Reichel , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v1 0/7] Add HPD support for Rockchip Analogix DP Date: Fri, 31 Jul 2026 12:30:03 +0200 Message-ID: <5209243.oAaWjsssbx@diego> In-Reply-To: <44ff5316-43cc-46be-b947-ea6e1f5da1bb@rock-chips.com> References: <20260730032744.381566-1-damon.ding@rock-chips.com> <24131962.ssLaC8jLEa@diego> <44ff5316-43cc-46be-b947-ea6e1f5da1bb@rock-chips.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Hi Damon, Am Freitag, 31. Juli 2026, 11:55:42 Mitteleurop=C3=A4ische Sommerzeit schri= eb Damon Ding: > On 7/31/2026 5:23 PM, Heiko St=C3=BCbner wrote: > > Am Freitag, 31. Juli 2026, 05:08:45 Mitteleurop=C3=A4ische Sommerzeit s= chrieb Damon Ding: > >> On 7/31/2026 2:49 AM, Heiko St=C3=BCbner wrote: > >>> Am Donnerstag, 30. Juli 2026, 05:27:37 Mitteleurop=C3=A4ische Sommerz= eit schrieb Damon Ding: > >>>> This series improves the HPD (Hotplug Detect) interrupt handling in > >>>> the Analogix DP driver to enable reliable native HPD pin detection on > >>>> Rockchip platforms, and introduces platform-specific HPD detection > >>>> schemes with fine-grained interrupt control. > >>> > >>> [...] > >>> > >>>> Tested on RK3576 with both native HPD pin and GPIO HPD configuration= s. > >>>> > >>>> Native HPD pin mode: > >>>> > >>>> &edp { > >>>> status =3D "okay"; > >>>> pinctrl-names =3D "default"; > >>>> pinctrl-0 =3D <&edp_txm0_pins>; > >>>> }; > >>>> > >>>> GPIO HPD mode: > >>>> > >>>> &edp { > >>>> status =3D "okay"; > >>>> pinctrl-names =3D "default"; > >>>> pinctrl-0 =3D <&edp0_hpd>; > >>>> hpd-gpios =3D <&gpio4 RK_PC1 GPIO_ACTIVE_HIGH>; > >>>> }; > >>>> > >>>> &pinctrl { > >>>> edp { > >>>> edp0_hpd: edp0-hpd { > >>>> rockchip,pins =3D <4 RK_PC1 0 &pcfg_pull_none>; > >>>> }; > >>>> }; > >>>> }; > >>> > >>> Yay and thanks a lot for working on that. > >>> > >>> If I roll my display-port carrier board back to the analogix-dp being > >>> the endpoint, this works exactly as expected :-) . > >>> > >>> I can plug in the display at some point after the boot and have it > >>> detected and setup correctly. Same with unplugging it while > >>> the system is running. The connection status is correctly reported > >>> in sysfs. > >>> > >>> > >>> Though there is a caveat. When the eDP is not the last part, this doe= s not > >>> work anymore. The detect function always returns "connected" if there= is > >>> a next bridge available. > >>> > >>> My board [0] has a physical DP connector on it, so models it as > >>> dp-connector, but in that case the Analogix driver always reports bei= ng > >>> connected. > >>> > >>> > >>> [0] https://lore.kernel.org/linux-rockchip/20251009225050.88192-3-hei= ko@sntech.de/ > >>> ... same effect with hpd-gpios in either the edp node or dp-connector= node > >>> > >>> > >> > >> My previous tests were carried out on the modified RK3576 IOTEST board > >> DTS based on RK3576 EVB1, which includes dp-connector by default. I al= so > >> did extra verification without dp-connector, and HPD detection works > >> correctly in both cases. > >> > >> I've taken a look at the Tiger board DT configuration. The pinctrl > >> settings for the eDP HPD GPIO may need adjustment: > >> > >> &pinctrl { > >> edp0 { > >> edp0_hpd_l: edp0-hpd-l-pin { > >> rockchip,pins =3D <4 RK_PB5 RK_FUNC_GPIO &pcfg_pull_down>; > >> }; > >> }; > >> }; > >> > >> It is recommended to configure GPIO4B5 as pull-down or pll-none. Pull-= up > >> configuration may prevent GPIO interrupts from being triggered properl= y, > >> resulting in a permanent "connected" status. > >=20 > > At least on that DP-carrier the pin direction is different. > > I.e. it is active-low, meaning 0 for plugged in. > >=20 > > In the schematics I do see a hw pull up too - so pull-none in the pinco= nfig > > would also be possible, but pull-down is definitly wrong on _this_ boar= d. > >=20 > > So we're talking about the same code, I put the dts up on [0] . > >=20 > > I'm currently running with a printk diff [1] to showcase the issue. > >=20 > > So on boot, with the display unplugged I get: > > [ 14.757911] ---> drm_bridge_connector_detect: detect > > [ 14.757914] ---> analogix_dp_bridge_detect a > > [ 14.757918] ---> drm_bridge_connector_detect: detect > > [ 14.773779] ---> analogix_dp_bridge_detect a > > [ 14.838658] rockchip-dp fdec0000.edp: failed to read dpcd caps: -110 > > [ 14.838662] [drm:analogix_dp_bridge_atomic_enable [analogix_dp]] *ER= ROR* dp commit error, ret =3D -110 > > [ 14.838670] rockchip-dp fdec0000.edp: failed to set bridge, retry: 0 > > [ 14.884791] rockchip-dp fdec0000.edp: failed to read dpcd caps: -110 > > [ 14.884793] [drm:analogix_dp_bridge_atomic_enable [analogix_dp]] *ER= ROR* dp commit error, ret =3D -110 > > [ 14.884796] rockchip-dp fdec0000.edp: failed to set bridge, retry: 1 > > [ 14.930925] rockchip-dp fdec0000.edp: failed to read dpcd caps: -110 > > [ 14.930927] [drm:analogix_dp_bridge_atomic_enable [analogix_dp]] *ER= ROR* dp commit error, ret =3D -110 > > [ 14.930930] rockchip-dp fdec0000.edp: failed to set bridge, retry: 2 > > [ 14.977032] rockchip-dp fdec0000.edp: failed to read dpcd caps: -110 > > [ 14.977034] [drm:analogix_dp_bridge_atomic_enable [analogix_dp]] *ER= ROR* dp commit error, ret =3D -110 > > [ 14.977037] rockchip-dp fdec0000.edp: failed to set bridge, retry: 3 > > [ 15.023150] rockchip-dp fdec0000.edp: failed to read dpcd caps: -110 > > [ 15.023152] [drm:analogix_dp_bridge_atomic_enable [analogix_dp]] *ER= ROR* dp commit error, ret =3D -110 > > [ 15.023155] rockchip-dp fdec0000.edp: failed to set bridge, retry: 4 > > [ 15.023168] rockchip-dp fdec0000.edp: too many times retry set bridg= e, give it up > > [ 15.052485] Console: switching to colour frame buffer device 80x30 > > [ 15.210457] rockchip-drm display-subsystem: [drm] fb0: rockchipdrmfb= frame buffer device > > [ 15.223444] ---> drm_bridge_connector_detect: detect > > [ 15.231974] ---> analogix_dp_bridge_detect a > > [ 15.239587] ---> drm_bridge_connector_detect: detect > > [ 15.245341] ---> analogix_dp_bridge_detect a > >=20 > > So analogix_dp_bridge_detect() is called and always returns connected. > >=20 > > Plugging in the the display, I get: > > [ 290.592096] ---> display_connector_detect gpio value is 1 {display= =2Dconnector returning connected} > > [ 290.598648] ---> drm_bridge_connector_detect: detect > > [ 290.604637] ---> analogix_dp_bridge_detect a > > [ 290.609826] ---> drm_bridge_connector_detect: detect > > [ 290.615784] ---> analogix_dp_bridge_detect a > >=20 > > Unplugging the display, I get: > > [ 302.081444] ---> display_connector_detect gpio value is 0 {display= =2Dconnector returning disconnected} > > [ 302.087996] ---> drm_bridge_connector_detect: detect > > [ 302.093945] ---> analogix_dp_bridge_detect a > > [ 302.099131] ---> drm_bridge_connector_detect: detect > > [ 302.105090] ---> analogix_dp_bridge_detect a > > [ 302.144834] ---> drm_bridge_connector_detect: detect > > [ 302.150784] ---> analogix_dp_bridge_detect a > > [ 302.155933] ---> drm_bridge_connector_detect: detect > > [ 302.161859] ---> analogix_dp_bridge_detect a > >=20 > >=20 > > So it looks like on the gpio-side the detection is correct and/but > > analogix_dp_bridge_detect() is always returning a connected state > > ("b" output is never reached). > >=20 > > I'm still working on understanding how the whole detection logic works > > in drm ;-) . > >=20 > >=20 >=20 > I think I've spotted the environmental difference between our setups. > Your DTS places the hpd-gpios property under the dp-connector node, > which is a scenario I haven't covered yet. I will reproduce and test=20 > this case locally. >=20 > As a quick experiment, could you try removing hpd-gpios from=20 > dp-connector and move it under the edp node instead? As expected, GPIO=20 > HPD should work properly with that configuration. I've updated the branch in [0] with that hpd move to the edp node, but the result is similar: With the panel _disconnected_ on boot I see [ 12.887555] ---> drm_bridge_connector_detect: detect [ 12.893104] ---> analogix_dp_bridge_detect a [ 12.897881] ---> drm_bridge_connector_detect: detect [ 12.903424] ---> analogix_dp_bridge_detect a [ 14.124848] [drm:analogix_dp_bridge_atomic_enable [analogix_dp]] *ERROR*= failed to get hpd single ret =3D -110 [ 14.124891] rockchip-dp fdec0000.edp: failed to set bridge, retry: 0 [ 14.236031] [drm:analogix_dp_bridge_atomic_enable [analogix_dp]] *ERROR*= failed to get hpd single ret =3D -110 [ 14.236074] rockchip-dp fdec0000.edp: failed to set bridge, retry: 1 [ 14.346940] [drm:analogix_dp_bridge_atomic_enable [analogix_dp]] *ERROR*= failed to get hpd single ret =3D -110 [ 14.346990] rockchip-dp fdec0000.edp: failed to set bridge, retry: 2 [ 14.458590] [drm:analogix_dp_bridge_atomic_enable [analogix_dp]] *ERROR*= failed to get hpd single ret =3D -110 [ 14.458638] rockchip-dp fdec0000.edp: failed to set bridge, retry: 3 [ 14.570262] [drm:analogix_dp_bridge_atomic_enable [analogix_dp]] *ERROR*= failed to get hpd single ret =3D -110 [ 14.570312] rockchip-dp fdec0000.edp: failed to set bridge, retry: 4 [ 14.570328] rockchip-dp fdec0000.edp: too many times retry set bridge, g= ive it up [ 14.751371] ---> drm_bridge_connector_detect: detect [ 14.757207] ---> analogix_dp_bridge_detect a So with the diff from earlier, analogix_dp_bridge_detect() still runs, finds its next bridge and returns "connected". I.e. the > > if (dp->plat_data->next_bridge) > > return connector_status_connected; part. Heiko > > [0] https://github.com/mmind/linux-rockchip/blob/dev/v7.3/rk3588-tiger-= dp-carrier-v5/arch/arm64/boot/dts/rockchip/rk3588-tiger-displayport-carrier= =2Edts > > [1] > > diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drive= rs/gpu/drm/bridge/analogix/analogix_dp_core.c > > index 7a89548a7a885..0accdf62637ae 100644 > > --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > > +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > > @@ -915,8 +915,10 @@ analogix_dp_bridge_detect(struct drm_bridge *bridg= e, struct drm_connector *conne > > struct analogix_dp_device *dp =3D to_dp(bridge); > > enum drm_connector_status status =3D connector_status_disconne= cted; > > =20 > > +printk("---> %s a\n", __func__); > > if (dp->plat_data->next_bridge) > > return connector_status_connected; > > +printk("---> %s b\n", __func__); > > =20 > > if (!analogix_dp_detect_hpd(dp)) > > status =3D connector_status_connected; > > diff --git a/drivers/gpu/drm/bridge/display-connector.c b/drivers/gpu/d= rm/bridge/display-connector.c > > index 16c0631adeb18..b0c07694b82e3 100644 > > --- a/drivers/gpu/drm/bridge/display-connector.c > > +++ b/drivers/gpu/drm/bridge/display-connector.c > > @@ -45,6 +45,7 @@ static enum drm_connector_status display_connector_de= tect(struct drm_bridge *bri > > struct display_connector *conn =3D to_display_connector(bridge= ); > > =20 > > if (conn->hpd_gpio) { > > +printk("---> %s gpio value is %d\n", __func__, gpiod_get_value_canslee= p(conn->hpd_gpio)); > > if (gpiod_get_value_cansleep(conn->hpd_gpio)) > > return connector_status_connected; > > else > > @@ -84,6 +85,7 @@ static enum drm_connector_status display_connector_de= tect(struct drm_bridge *bri > > static enum drm_connector_status > > display_connector_bridge_detect(struct drm_bridge *bridge, struct drm= _connector *connector) > > { > > +printk("---> %s\n", __func__); > > return display_connector_detect(bridge); > > } > > =20 > > diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/g= pu/drm/display/drm_bridge_connector.c > > index 649969fca1413..8816d837c9a77 100644 > > --- a/drivers/gpu/drm/display/drm_bridge_connector.c > > +++ b/drivers/gpu/drm/display/drm_bridge_connector.c > > @@ -218,6 +218,7 @@ drm_bridge_connector_detect(struct drm_connector *c= onnector, bool force) > > enum drm_connector_status status; > > =20 > > if (detect) { > > +printk("---> %s: detect\n", __func__); > > status =3D detect->funcs->detect(detect, connector); > > =20 > > if (hdmi) > >=20 > >=20 > >=20 > >=20 > >=20 >=20 >=20 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 D6719C54F54 for ; Fri, 31 Jul 2026 10:30:44 +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: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=R7ZTASHQbhlDrgzvOj/zXy7qo8sbQ1vlopbUAyL7VBE=; b=xGa0PjULSiyqt7 OXPs+Q3kAbgGNZAVOeRWW+22FUIa8zjdJf6gHMwl3NxdIRZJ+rPds/VpdSry8/n289ltdZ5iQJIqV YfymoWfPrxqF7jelqCG4qzq9TOTyW18FLJ0HedQZreQ9OVC47cP0WMP2e9M6gdC6A/ynffEb+xxlO MFiVTpfDjSfCtUh4Li8p73DZvAM8civ80txUCYp7MtN09jBsYqPP5UDla/AQaY9qnURKC6kebGxXW hxikmLxyVIyUANfwtcHJMFfHNYq0VMTiBwI1k33oObmfmSoN15C8nkRSvZPJx+qPSTcJlkuU5jKSz hYpAn8FRbQdHnNlBfIfg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.99.1 #2 (Red Hat Linux)) id 1wpkVh-0000000CJrE-2Azs; Fri, 31 Jul 2026 10:30:37 +0000 Received: from gloria.sntech.de ([185.11.138.130]) by bombadil.infradead.org with esmtps (Exim 4.99.1 #2 (Red Hat Linux)) id 1wpkVe-0000000CJql-4Awt; Fri, 31 Jul 2026 10:30:36 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sntech.de; s=gloria202408; h=Content-Type:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Reply-To; bh=PO5HApjpuCTFoG6dK7eT7+HEMHe6ytFiN3RSifQM+mc=; b=tcimYze/jo5hh4bufcOgKeQjX0 wyD85SoNiH2b0XUX9aEL+MXU+3z+SdA36ny2eU1ECanI6IXsLOe0NBSp/aX8ISgIwU5qYagsXzEbw fEfYU99LsS4ckdkphfm6y2XOZ3Gklbu7qCKM/g5cdMl8vNJZRwydqGO7kcwjYa8XYmwA+2/zppYtO 4gJJzMXF4qEXt7gGAE1/Ia30GUClhfTMQR3f6+qJw/WdNOr9wAvic+YvSC9hPRtJQJkxrQTD7XNGd bRwsooAb0jqRs5cY7R+GK74PY92b4sQrg+naxB7RATVk7BLqA1n+CYGOnRUMSqzUEWpx9UksLSA3g WIWEA4rQ==; From: Heiko =?UTF-8?B?U3TDvGJuZXI=?= To: Andrzej Hajda , Neil Armstrong , Robert Foss , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Andy Yan , Damon Ding Cc: Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Luca Ceresoli , Dmitry Baryshkov , Marek Szyprowski , Sebastian Reichel , dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v1 0/7] Add HPD support for Rockchip Analogix DP Date: Fri, 31 Jul 2026 12:30:03 +0200 Message-ID: <5209243.oAaWjsssbx@diego> In-Reply-To: <44ff5316-43cc-46be-b947-ea6e1f5da1bb@rock-chips.com> References: <20260730032744.381566-1-damon.ding@rock-chips.com> <24131962.ssLaC8jLEa@diego> <44ff5316-43cc-46be-b947-ea6e1f5da1bb@rock-chips.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20260731_033035_243437_2BC5F585 X-CRM114-Status: GOOD ( 42.98 ) X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+linux-rockchip=archiver.kernel.org@lists.infradead.org SGkgRGFtb24sCgpBbSBGcmVpdGFnLCAzMS4gSnVsaSAyMDI2LCAxMTo1NTo0MiBNaXR0ZWxldXJv cMOkaXNjaGUgU29tbWVyemVpdCBzY2hyaWViIERhbW9uIERpbmc6Cj4gT24gNy8zMS8yMDI2IDU6 MjMgUE0sIEhlaWtvIFN0w7xibmVyIHdyb3RlOgo+ID4gQW0gRnJlaXRhZywgMzEuIEp1bGkgMjAy NiwgMDU6MDg6NDUgTWl0dGVsZXVyb3DDpGlzY2hlIFNvbW1lcnplaXQgc2NocmllYiBEYW1vbiBE aW5nOgo+ID4+IE9uIDcvMzEvMjAyNiAyOjQ5IEFNLCBIZWlrbyBTdMO8Ym5lciB3cm90ZToKPiA+ Pj4gQW0gRG9ubmVyc3RhZywgMzAuIEp1bGkgMjAyNiwgMDU6Mjc6MzcgTWl0dGVsZXVyb3DDpGlz Y2hlIFNvbW1lcnplaXQgc2NocmllYiBEYW1vbiBEaW5nOgo+ID4+Pj4gVGhpcyBzZXJpZXMgaW1w cm92ZXMgdGhlIEhQRCAoSG90cGx1ZyBEZXRlY3QpIGludGVycnVwdCBoYW5kbGluZyBpbgo+ID4+ Pj4gdGhlIEFuYWxvZ2l4IERQIGRyaXZlciB0byBlbmFibGUgcmVsaWFibGUgbmF0aXZlIEhQRCBw aW4gZGV0ZWN0aW9uIG9uCj4gPj4+PiBSb2NrY2hpcCBwbGF0Zm9ybXMsIGFuZCBpbnRyb2R1Y2Vz IHBsYXRmb3JtLXNwZWNpZmljIEhQRCBkZXRlY3Rpb24KPiA+Pj4+IHNjaGVtZXMgd2l0aCBmaW5l LWdyYWluZWQgaW50ZXJydXB0IGNvbnRyb2wuCj4gPj4+Cj4gPj4+IFsuLi5dCj4gPj4+Cj4gPj4+ PiBUZXN0ZWQgb24gUkszNTc2IHdpdGggYm90aCBuYXRpdmUgSFBEIHBpbiBhbmQgR1BJTyBIUEQg Y29uZmlndXJhdGlvbnMuCj4gPj4+Pgo+ID4+Pj4gTmF0aXZlIEhQRCBwaW4gbW9kZToKPiA+Pj4+ Cj4gPj4+PiAgICAgJmVkcCB7Cj4gPj4+PiAgICAgICAgIHN0YXR1cyA9ICJva2F5IjsKPiA+Pj4+ ICAgICAgICAgcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKPiA+Pj4+ICAgICAgICAgcGluY3Ry bC0wID0gPCZlZHBfdHhtMF9waW5zPjsKPiA+Pj4+ICAgICB9Owo+ID4+Pj4KPiA+Pj4+IEdQSU8g SFBEIG1vZGU6Cj4gPj4+Pgo+ID4+Pj4gICAgICZlZHAgewo+ID4+Pj4gICAgICAgICBzdGF0dXMg PSAib2theSI7Cj4gPj4+PiAgICAgICAgIHBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7Cj4gPj4+ PiAgICAgICAgIHBpbmN0cmwtMCA9IDwmZWRwMF9ocGQ+Owo+ID4+Pj4gICAgICAgICBocGQtZ3Bp b3MgPSA8JmdwaW80IFJLX1BDMSBHUElPX0FDVElWRV9ISUdIPjsKPiA+Pj4+ICAgICB9Owo+ID4+ Pj4KPiA+Pj4+ICAgICAmcGluY3RybCB7Cj4gPj4+PiAgICAgICAgIGVkcCB7Cj4gPj4+PiAgICAg ICAgICAgICBlZHAwX2hwZDogZWRwMC1ocGQgewo+ID4+Pj4gICAgICAgICAgICAgICAgIHJvY2tj aGlwLHBpbnMgPSA8NCBSS19QQzEgMCAmcGNmZ19wdWxsX25vbmU+Owo+ID4+Pj4gICAgICAgICAg ICAgfTsKPiA+Pj4+ICAgICAgICAgfTsKPiA+Pj4+ICAgICB9Owo+ID4+Pgo+ID4+PiBZYXkgYW5k IHRoYW5rcyBhIGxvdCBmb3Igd29ya2luZyBvbiB0aGF0Lgo+ID4+Pgo+ID4+PiBJZiBJIHJvbGwg bXkgZGlzcGxheS1wb3J0IGNhcnJpZXIgYm9hcmQgYmFjayB0byB0aGUgYW5hbG9naXgtZHAgYmVp bmcKPiA+Pj4gdGhlIGVuZHBvaW50LCB0aGlzIHdvcmtzIGV4YWN0bHkgYXMgZXhwZWN0ZWQgOi0p IC4KPiA+Pj4KPiA+Pj4gSSBjYW4gcGx1ZyBpbiB0aGUgZGlzcGxheSBhdCBzb21lIHBvaW50IGFm dGVyIHRoZSBib290IGFuZCBoYXZlIGl0Cj4gPj4+IGRldGVjdGVkIGFuZCBzZXR1cCBjb3JyZWN0 bHkuIFNhbWUgd2l0aCB1bnBsdWdnaW5nIGl0IHdoaWxlCj4gPj4+IHRoZSBzeXN0ZW0gaXMgcnVu bmluZy4gVGhlIGNvbm5lY3Rpb24gc3RhdHVzIGlzIGNvcnJlY3RseSByZXBvcnRlZAo+ID4+PiBp biBzeXNmcy4KPiA+Pj4KPiA+Pj4KPiA+Pj4gVGhvdWdoIHRoZXJlIGlzIGEgY2F2ZWF0LiBXaGVu IHRoZSBlRFAgaXMgbm90IHRoZSBsYXN0IHBhcnQsIHRoaXMgZG9lcyBub3QKPiA+Pj4gd29yayBh bnltb3JlLiBUaGUgZGV0ZWN0IGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zICJjb25uZWN0ZWQiIGlm IHRoZXJlIGlzCj4gPj4+IGEgbmV4dCBicmlkZ2UgYXZhaWxhYmxlLgo+ID4+Pgo+ID4+PiBNeSBi b2FyZCBbMF0gaGFzIGEgcGh5c2ljYWwgRFAgY29ubmVjdG9yIG9uIGl0LCBzbyBtb2RlbHMgaXQg YXMKPiA+Pj4gZHAtY29ubmVjdG9yLCBidXQgaW4gdGhhdCBjYXNlIHRoZSBBbmFsb2dpeCBkcml2 ZXIgYWx3YXlzIHJlcG9ydHMgYmVpbmcKPiA+Pj4gY29ubmVjdGVkLgo+ID4+Pgo+ID4+Pgo+ID4+ PiBbMF0gaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGludXgtcm9ja2NoaXAvMjAyNTEwMDkyMjUw NTAuODgxOTItMy1oZWlrb0BzbnRlY2guZGUvCj4gPj4+IC4uLiBzYW1lIGVmZmVjdCB3aXRoIGhw ZC1ncGlvcyBpbiBlaXRoZXIgdGhlIGVkcCBub2RlIG9yIGRwLWNvbm5lY3RvciBub2RlCj4gPj4+ Cj4gPj4+Cj4gPj4KPiA+PiBNeSBwcmV2aW91cyB0ZXN0cyB3ZXJlIGNhcnJpZWQgb3V0IG9uIHRo ZSBtb2RpZmllZCBSSzM1NzYgSU9URVNUIGJvYXJkCj4gPj4gRFRTIGJhc2VkIG9uIFJLMzU3NiBF VkIxLCB3aGljaCBpbmNsdWRlcyBkcC1jb25uZWN0b3IgYnkgZGVmYXVsdC4gSSBhbHNvCj4gPj4g ZGlkIGV4dHJhIHZlcmlmaWNhdGlvbiB3aXRob3V0IGRwLWNvbm5lY3RvciwgYW5kIEhQRCBkZXRl Y3Rpb24gd29ya3MKPiA+PiBjb3JyZWN0bHkgaW4gYm90aCBjYXNlcy4KPiA+Pgo+ID4+IEkndmUg dGFrZW4gYSBsb29rIGF0IHRoZSBUaWdlciBib2FyZCBEVCBjb25maWd1cmF0aW9uLiBUaGUgcGlu Y3RybAo+ID4+IHNldHRpbmdzIGZvciB0aGUgZURQIEhQRCBHUElPIG1heSBuZWVkIGFkanVzdG1l bnQ6Cj4gPj4KPiA+PiAmcGluY3RybCB7Cj4gPj4gCWVkcDAgewo+ID4+IAkJZWRwMF9ocGRfbDog ZWRwMC1ocGQtbC1waW4gewo+ID4+IAkJCXJvY2tjaGlwLHBpbnMgPSA8NCBSS19QQjUgUktfRlVO Q19HUElPICZwY2ZnX3B1bGxfZG93bj47Cj4gPj4gCQl9Owo+ID4+IAl9Owo+ID4+IH07Cj4gPj4K PiA+PiBJdCBpcyByZWNvbW1lbmRlZCB0byBjb25maWd1cmUgR1BJTzRCNSBhcyBwdWxsLWRvd24g b3IgcGxsLW5vbmUuIFB1bGwtdXAKPiA+PiBjb25maWd1cmF0aW9uIG1heSBwcmV2ZW50IEdQSU8g aW50ZXJydXB0cyBmcm9tIGJlaW5nIHRyaWdnZXJlZCBwcm9wZXJseSwKPiA+PiByZXN1bHRpbmcg aW4gYSBwZXJtYW5lbnQgImNvbm5lY3RlZCIgc3RhdHVzLgo+ID4gCj4gPiBBdCBsZWFzdCBvbiB0 aGF0IERQLWNhcnJpZXIgdGhlIHBpbiBkaXJlY3Rpb24gaXMgZGlmZmVyZW50Lgo+ID4gSS5lLiBp dCBpcyBhY3RpdmUtbG93LCBtZWFuaW5nIDAgZm9yIHBsdWdnZWQgaW4uCj4gPiAKPiA+IEluIHRo ZSBzY2hlbWF0aWNzIEkgZG8gc2VlIGEgaHcgcHVsbCB1cCB0b28gLSBzbyBwdWxsLW5vbmUgaW4g dGhlIHBpbmNvbmZpZwo+ID4gd291bGQgYWxzbyBiZSBwb3NzaWJsZSwgYnV0IHB1bGwtZG93biBp cyBkZWZpbml0bHkgd3Jvbmcgb24gX3RoaXNfIGJvYXJkLgo+ID4gCj4gPiBTbyB3ZSdyZSB0YWxr aW5nIGFib3V0IHRoZSBzYW1lIGNvZGUsIEkgcHV0IHRoZSBkdHMgdXAgb24gWzBdIC4KPiA+IAo+ ID4gSSdtIGN1cnJlbnRseSBydW5uaW5nIHdpdGggYSBwcmludGsgZGlmZiBbMV0gdG8gc2hvd2Nh c2UgdGhlIGlzc3VlLgo+ID4gCj4gPiBTbyBvbiBib290LCB3aXRoIHRoZSBkaXNwbGF5IHVucGx1 Z2dlZCBJIGdldDoKPiA+IFsgICAxNC43NTc5MTFdIC0tLT4gZHJtX2JyaWRnZV9jb25uZWN0b3Jf ZGV0ZWN0OiBkZXRlY3QKPiA+IFsgICAxNC43NTc5MTRdIC0tLT4gYW5hbG9naXhfZHBfYnJpZGdl X2RldGVjdCBhCj4gPiBbICAgMTQuNzU3OTE4XSAtLS0+IGRybV9icmlkZ2VfY29ubmVjdG9yX2Rl dGVjdDogZGV0ZWN0Cj4gPiBbICAgMTQuNzczNzc5XSAtLS0+IGFuYWxvZ2l4X2RwX2JyaWRnZV9k ZXRlY3QgYQo+ID4gWyAgIDE0LjgzODY1OF0gcm9ja2NoaXAtZHAgZmRlYzAwMDAuZWRwOiBmYWls ZWQgdG8gcmVhZCBkcGNkIGNhcHM6IC0xMTAKPiA+IFsgICAxNC44Mzg2NjJdIFtkcm06YW5hbG9n aXhfZHBfYnJpZGdlX2F0b21pY19lbmFibGUgW2FuYWxvZ2l4X2RwXV0gKkVSUk9SKiBkcCBjb21t aXQgZXJyb3IsIHJldCA9IC0xMTAKPiA+IFsgICAxNC44Mzg2NzBdIHJvY2tjaGlwLWRwIGZkZWMw MDAwLmVkcDogZmFpbGVkIHRvIHNldCBicmlkZ2UsIHJldHJ5OiAwCj4gPiBbICAgMTQuODg0Nzkx XSByb2NrY2hpcC1kcCBmZGVjMDAwMC5lZHA6IGZhaWxlZCB0byByZWFkIGRwY2QgY2FwczogLTEx MAo+ID4gWyAgIDE0Ljg4NDc5M10gW2RybTphbmFsb2dpeF9kcF9icmlkZ2VfYXRvbWljX2VuYWJs ZSBbYW5hbG9naXhfZHBdXSAqRVJST1IqIGRwIGNvbW1pdCBlcnJvciwgcmV0ID0gLTExMAo+ID4g WyAgIDE0Ljg4NDc5Nl0gcm9ja2NoaXAtZHAgZmRlYzAwMDAuZWRwOiBmYWlsZWQgdG8gc2V0IGJy aWRnZSwgcmV0cnk6IDEKPiA+IFsgICAxNC45MzA5MjVdIHJvY2tjaGlwLWRwIGZkZWMwMDAwLmVk cDogZmFpbGVkIHRvIHJlYWQgZHBjZCBjYXBzOiAtMTEwCj4gPiBbICAgMTQuOTMwOTI3XSBbZHJt OmFuYWxvZ2l4X2RwX2JyaWRnZV9hdG9taWNfZW5hYmxlIFthbmFsb2dpeF9kcF1dICpFUlJPUiog ZHAgY29tbWl0IGVycm9yLCByZXQgPSAtMTEwCj4gPiBbICAgMTQuOTMwOTMwXSByb2NrY2hpcC1k cCBmZGVjMDAwMC5lZHA6IGZhaWxlZCB0byBzZXQgYnJpZGdlLCByZXRyeTogMgo+ID4gWyAgIDE0 Ljk3NzAzMl0gcm9ja2NoaXAtZHAgZmRlYzAwMDAuZWRwOiBmYWlsZWQgdG8gcmVhZCBkcGNkIGNh cHM6IC0xMTAKPiA+IFsgICAxNC45NzcwMzRdIFtkcm06YW5hbG9naXhfZHBfYnJpZGdlX2F0b21p Y19lbmFibGUgW2FuYWxvZ2l4X2RwXV0gKkVSUk9SKiBkcCBjb21taXQgZXJyb3IsIHJldCA9IC0x MTAKPiA+IFsgICAxNC45NzcwMzddIHJvY2tjaGlwLWRwIGZkZWMwMDAwLmVkcDogZmFpbGVkIHRv IHNldCBicmlkZ2UsIHJldHJ5OiAzCj4gPiBbICAgMTUuMDIzMTUwXSByb2NrY2hpcC1kcCBmZGVj MDAwMC5lZHA6IGZhaWxlZCB0byByZWFkIGRwY2QgY2FwczogLTExMAo+ID4gWyAgIDE1LjAyMzE1 Ml0gW2RybTphbmFsb2dpeF9kcF9icmlkZ2VfYXRvbWljX2VuYWJsZSBbYW5hbG9naXhfZHBdXSAq RVJST1IqIGRwIGNvbW1pdCBlcnJvciwgcmV0ID0gLTExMAo+ID4gWyAgIDE1LjAyMzE1NV0gcm9j a2NoaXAtZHAgZmRlYzAwMDAuZWRwOiBmYWlsZWQgdG8gc2V0IGJyaWRnZSwgcmV0cnk6IDQKPiA+ IFsgICAxNS4wMjMxNjhdIHJvY2tjaGlwLWRwIGZkZWMwMDAwLmVkcDogdG9vIG1hbnkgdGltZXMg cmV0cnkgc2V0IGJyaWRnZSwgZ2l2ZSBpdCB1cAo+ID4gWyAgIDE1LjA1MjQ4NV0gQ29uc29sZTog c3dpdGNoaW5nIHRvIGNvbG91ciBmcmFtZSBidWZmZXIgZGV2aWNlIDgweDMwCj4gPiBbICAgMTUu MjEwNDU3XSByb2NrY2hpcC1kcm0gZGlzcGxheS1zdWJzeXN0ZW06IFtkcm1dIGZiMDogcm9ja2No aXBkcm1mYiBmcmFtZSBidWZmZXIgZGV2aWNlCj4gPiBbICAgMTUuMjIzNDQ0XSAtLS0+IGRybV9i cmlkZ2VfY29ubmVjdG9yX2RldGVjdDogZGV0ZWN0Cj4gPiBbICAgMTUuMjMxOTc0XSAtLS0+IGFu YWxvZ2l4X2RwX2JyaWRnZV9kZXRlY3QgYQo+ID4gWyAgIDE1LjIzOTU4N10gLS0tPiBkcm1fYnJp ZGdlX2Nvbm5lY3Rvcl9kZXRlY3Q6IGRldGVjdAo+ID4gWyAgIDE1LjI0NTM0MV0gLS0tPiBhbmFs b2dpeF9kcF9icmlkZ2VfZGV0ZWN0IGEKPiA+IAo+ID4gU28gYW5hbG9naXhfZHBfYnJpZGdlX2Rl dGVjdCgpIGlzIGNhbGxlZCBhbmQgYWx3YXlzIHJldHVybnMgY29ubmVjdGVkLgo+ID4gCj4gPiBQ bHVnZ2luZyBpbiB0aGUgdGhlIGRpc3BsYXksIEkgZ2V0Ogo+ID4gWyAgMjkwLjU5MjA5Nl0gLS0t PiBkaXNwbGF5X2Nvbm5lY3Rvcl9kZXRlY3QgZ3BpbyB2YWx1ZSBpcyAxICAge2Rpc3BsYXktY29u bmVjdG9yIHJldHVybmluZyBjb25uZWN0ZWR9Cj4gPiBbICAyOTAuNTk4NjQ4XSAtLS0+IGRybV9i cmlkZ2VfY29ubmVjdG9yX2RldGVjdDogZGV0ZWN0Cj4gPiBbICAyOTAuNjA0NjM3XSAtLS0+IGFu YWxvZ2l4X2RwX2JyaWRnZV9kZXRlY3QgYQo+ID4gWyAgMjkwLjYwOTgyNl0gLS0tPiBkcm1fYnJp ZGdlX2Nvbm5lY3Rvcl9kZXRlY3Q6IGRldGVjdAo+ID4gWyAgMjkwLjYxNTc4NF0gLS0tPiBhbmFs b2dpeF9kcF9icmlkZ2VfZGV0ZWN0IGEKPiA+IAo+ID4gVW5wbHVnZ2luZyB0aGUgZGlzcGxheSwg SSBnZXQ6Cj4gPiBbICAzMDIuMDgxNDQ0XSAtLS0+IGRpc3BsYXlfY29ubmVjdG9yX2RldGVjdCBn cGlvIHZhbHVlIGlzIDAgICB7ZGlzcGxheS1jb25uZWN0b3IgcmV0dXJuaW5nIGRpc2Nvbm5lY3Rl ZH0KPiA+IFsgIDMwMi4wODc5OTZdIC0tLT4gZHJtX2JyaWRnZV9jb25uZWN0b3JfZGV0ZWN0OiBk ZXRlY3QKPiA+IFsgIDMwMi4wOTM5NDVdIC0tLT4gYW5hbG9naXhfZHBfYnJpZGdlX2RldGVjdCBh Cj4gPiBbICAzMDIuMDk5MTMxXSAtLS0+IGRybV9icmlkZ2VfY29ubmVjdG9yX2RldGVjdDogZGV0 ZWN0Cj4gPiBbICAzMDIuMTA1MDkwXSAtLS0+IGFuYWxvZ2l4X2RwX2JyaWRnZV9kZXRlY3QgYQo+ ID4gWyAgMzAyLjE0NDgzNF0gLS0tPiBkcm1fYnJpZGdlX2Nvbm5lY3Rvcl9kZXRlY3Q6IGRldGVj dAo+ID4gWyAgMzAyLjE1MDc4NF0gLS0tPiBhbmFsb2dpeF9kcF9icmlkZ2VfZGV0ZWN0IGEKPiA+ IFsgIDMwMi4xNTU5MzNdIC0tLT4gZHJtX2JyaWRnZV9jb25uZWN0b3JfZGV0ZWN0OiBkZXRlY3QK PiA+IFsgIDMwMi4xNjE4NTldIC0tLT4gYW5hbG9naXhfZHBfYnJpZGdlX2RldGVjdCBhCj4gPiAK PiA+IAo+ID4gU28gaXQgbG9va3MgbGlrZSBvbiB0aGUgZ3Bpby1zaWRlIHRoZSBkZXRlY3Rpb24g aXMgY29ycmVjdCBhbmQvYnV0Cj4gPiBhbmFsb2dpeF9kcF9icmlkZ2VfZGV0ZWN0KCkgaXMgYWx3 YXlzIHJldHVybmluZyBhIGNvbm5lY3RlZCBzdGF0ZQo+ID4gKCJiIiBvdXRwdXQgaXMgbmV2ZXIg cmVhY2hlZCkuCj4gPiAKPiA+IEknbSBzdGlsbCB3b3JraW5nIG9uIHVuZGVyc3RhbmRpbmcgaG93 IHRoZSB3aG9sZSBkZXRlY3Rpb24gbG9naWMgd29ya3MKPiA+IGluIGRybSA7LSkgLgo+ID4gCj4g PiAKPiAKPiBJIHRoaW5rIEkndmUgc3BvdHRlZCB0aGUgZW52aXJvbm1lbnRhbCBkaWZmZXJlbmNl IGJldHdlZW4gb3VyIHNldHVwcy4KPiBZb3VyIERUUyBwbGFjZXMgdGhlIGhwZC1ncGlvcyBwcm9w ZXJ0eSB1bmRlciB0aGUgZHAtY29ubmVjdG9yIG5vZGUsCj4gd2hpY2ggaXMgYSBzY2VuYXJpbyBJ IGhhdmVuJ3QgY292ZXJlZCB5ZXQuIEkgd2lsbCByZXByb2R1Y2UgYW5kIHRlc3QgCj4gdGhpcyBj YXNlIGxvY2FsbHkuCj4gCj4gQXMgYSBxdWljayBleHBlcmltZW50LCBjb3VsZCB5b3UgdHJ5IHJl bW92aW5nIGhwZC1ncGlvcyBmcm9tIAo+IGRwLWNvbm5lY3RvciBhbmQgbW92ZSBpdCB1bmRlciB0 aGUgZWRwIG5vZGUgaW5zdGVhZD8gQXMgZXhwZWN0ZWQsIEdQSU8gCj4gSFBEIHNob3VsZCB3b3Jr IHByb3Blcmx5IHdpdGggdGhhdCBjb25maWd1cmF0aW9uLgoKSSd2ZSB1cGRhdGVkIHRoZSBicmFu Y2ggaW4gWzBdIHdpdGggdGhhdCBocGQgbW92ZSB0byB0aGUgZWRwIG5vZGUsIGJ1dAp0aGUgcmVz dWx0IGlzIHNpbWlsYXI6CgpXaXRoIHRoZSBwYW5lbCBfZGlzY29ubmVjdGVkXyBvbiBib290IEkg c2VlClsgICAxMi44ODc1NTVdIC0tLT4gZHJtX2JyaWRnZV9jb25uZWN0b3JfZGV0ZWN0OiBkZXRl Y3QKWyAgIDEyLjg5MzEwNF0gLS0tPiBhbmFsb2dpeF9kcF9icmlkZ2VfZGV0ZWN0IGEKWyAgIDEy Ljg5Nzg4MV0gLS0tPiBkcm1fYnJpZGdlX2Nvbm5lY3Rvcl9kZXRlY3Q6IGRldGVjdApbICAgMTIu OTAzNDI0XSAtLS0+IGFuYWxvZ2l4X2RwX2JyaWRnZV9kZXRlY3QgYQpbICAgMTQuMTI0ODQ4XSBb ZHJtOmFuYWxvZ2l4X2RwX2JyaWRnZV9hdG9taWNfZW5hYmxlIFthbmFsb2dpeF9kcF1dICpFUlJP UiogZmFpbGVkIHRvIGdldCBocGQgc2luZ2xlIHJldCA9IC0xMTAKWyAgIDE0LjEyNDg5MV0gcm9j a2NoaXAtZHAgZmRlYzAwMDAuZWRwOiBmYWlsZWQgdG8gc2V0IGJyaWRnZSwgcmV0cnk6IDAKWyAg IDE0LjIzNjAzMV0gW2RybTphbmFsb2dpeF9kcF9icmlkZ2VfYXRvbWljX2VuYWJsZSBbYW5hbG9n aXhfZHBdXSAqRVJST1IqIGZhaWxlZCB0byBnZXQgaHBkIHNpbmdsZSByZXQgPSAtMTEwClsgICAx NC4yMzYwNzRdIHJvY2tjaGlwLWRwIGZkZWMwMDAwLmVkcDogZmFpbGVkIHRvIHNldCBicmlkZ2Us IHJldHJ5OiAxClsgICAxNC4zNDY5NDBdIFtkcm06YW5hbG9naXhfZHBfYnJpZGdlX2F0b21pY19l bmFibGUgW2FuYWxvZ2l4X2RwXV0gKkVSUk9SKiBmYWlsZWQgdG8gZ2V0IGhwZCBzaW5nbGUgcmV0 ID0gLTExMApbICAgMTQuMzQ2OTkwXSByb2NrY2hpcC1kcCBmZGVjMDAwMC5lZHA6IGZhaWxlZCB0 byBzZXQgYnJpZGdlLCByZXRyeTogMgpbICAgMTQuNDU4NTkwXSBbZHJtOmFuYWxvZ2l4X2RwX2Jy aWRnZV9hdG9taWNfZW5hYmxlIFthbmFsb2dpeF9kcF1dICpFUlJPUiogZmFpbGVkIHRvIGdldCBo cGQgc2luZ2xlIHJldCA9IC0xMTAKWyAgIDE0LjQ1ODYzOF0gcm9ja2NoaXAtZHAgZmRlYzAwMDAu ZWRwOiBmYWlsZWQgdG8gc2V0IGJyaWRnZSwgcmV0cnk6IDMKWyAgIDE0LjU3MDI2Ml0gW2RybTph bmFsb2dpeF9kcF9icmlkZ2VfYXRvbWljX2VuYWJsZSBbYW5hbG9naXhfZHBdXSAqRVJST1IqIGZh aWxlZCB0byBnZXQgaHBkIHNpbmdsZSByZXQgPSAtMTEwClsgICAxNC41NzAzMTJdIHJvY2tjaGlw LWRwIGZkZWMwMDAwLmVkcDogZmFpbGVkIHRvIHNldCBicmlkZ2UsIHJldHJ5OiA0ClsgICAxNC41 NzAzMjhdIHJvY2tjaGlwLWRwIGZkZWMwMDAwLmVkcDogdG9vIG1hbnkgdGltZXMgcmV0cnkgc2V0 IGJyaWRnZSwgZ2l2ZSBpdCB1cApbICAgMTQuNzUxMzcxXSAtLS0+IGRybV9icmlkZ2VfY29ubmVj dG9yX2RldGVjdDogZGV0ZWN0ClsgICAxNC43NTcyMDddIC0tLT4gYW5hbG9naXhfZHBfYnJpZGdl X2RldGVjdCBhCgpTbyB3aXRoIHRoZSBkaWZmIGZyb20gZWFybGllciwgYW5hbG9naXhfZHBfYnJp ZGdlX2RldGVjdCgpIHN0aWxsIHJ1bnMsCmZpbmRzIGl0cyBuZXh0IGJyaWRnZSBhbmQgcmV0dXJu cyAiY29ubmVjdGVkIi4KCkkuZS4gdGhlCj4gPiAgICAgICAgICBpZiAoZHAtPnBsYXRfZGF0YS0+ bmV4dF9icmlkZ2UpCj4gPiAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0b3Jfc3RhdHVz X2Nvbm5lY3RlZDsKCnBhcnQuCgoKSGVpa28KCgoKPiA+IFswXSBodHRwczovL2dpdGh1Yi5jb20v bW1pbmQvbGludXgtcm9ja2NoaXAvYmxvYi9kZXYvdjcuMy9yazM1ODgtdGlnZXItZHAtY2Fycmll ci12NS9hcmNoL2FybTY0L2Jvb3QvZHRzL3JvY2tjaGlwL3JrMzU4OC10aWdlci1kaXNwbGF5cG9y dC1jYXJyaWVyLmR0cwo+ID4gWzFdCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2Jy aWRnZS9hbmFsb2dpeC9hbmFsb2dpeF9kcF9jb3JlLmMgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdl L2FuYWxvZ2l4L2FuYWxvZ2l4X2RwX2NvcmUuYwo+ID4gaW5kZXggN2E4OTU0OGE3YTg4NS4uMGFj Y2RmNjI2MzdhZSAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvYW5hbG9n aXgvYW5hbG9naXhfZHBfY29yZS5jCj4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2Fu YWxvZ2l4L2FuYWxvZ2l4X2RwX2NvcmUuYwo+ID4gQEAgLTkxNSw4ICs5MTUsMTAgQEAgYW5hbG9n aXhfZHBfYnJpZGdlX2RldGVjdChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLCBzdHJ1Y3QgZHJt X2Nvbm5lY3RvciAqY29ubmUKPiA+ICAgICAgICAgIHN0cnVjdCBhbmFsb2dpeF9kcF9kZXZpY2Ug KmRwID0gdG9fZHAoYnJpZGdlKTsKPiA+ICAgICAgICAgIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0 dXMgc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19kaXNjb25uZWN0ZWQ7Cj4gPiAgIAo+ID4gK3By aW50aygiLS0tPiAlcyBhXG4iLCBfX2Z1bmNfXyk7Cj4gPiAgICAgICAgICBpZiAoZHAtPnBsYXRf ZGF0YS0+bmV4dF9icmlkZ2UpCj4gPiAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0b3Jf c3RhdHVzX2Nvbm5lY3RlZDsKPiA+ICtwcmludGsoIi0tLT4gJXMgYlxuIiwgX19mdW5jX18pOwo+ ID4gICAKPiA+ICAgICAgICAgIGlmICghYW5hbG9naXhfZHBfZGV0ZWN0X2hwZChkcCkpCj4gPiAg ICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwo+ID4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvZGlzcGxheS1jb25uZWN0b3IuYyBi L2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvZGlzcGxheS1jb25uZWN0b3IuYwo+ID4gaW5kZXggMTZj MDYzMWFkZWIxOC4uYjBjMDc2OTRiODJlMyAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2Ry bS9icmlkZ2UvZGlzcGxheS1jb25uZWN0b3IuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2Jy aWRnZS9kaXNwbGF5LWNvbm5lY3Rvci5jCj4gPiBAQCAtNDUsNiArNDUsNyBAQCBzdGF0aWMgZW51 bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBkaXNwbGF5X2Nvbm5lY3Rvcl9kZXRlY3Qoc3RydWN0IGRy bV9icmlkZ2UgKmJyaQo+ID4gICAgICAgICAgc3RydWN0IGRpc3BsYXlfY29ubmVjdG9yICpjb25u ID0gdG9fZGlzcGxheV9jb25uZWN0b3IoYnJpZGdlKTsKPiA+ICAgCj4gPiAgICAgICAgICBpZiAo Y29ubi0+aHBkX2dwaW8pIHsKPiA+ICtwcmludGsoIi0tLT4gJXMgZ3BpbyB2YWx1ZSBpcyAlZFxu IiwgX19mdW5jX18sIGdwaW9kX2dldF92YWx1ZV9jYW5zbGVlcChjb25uLT5ocGRfZ3BpbykpOwo+ ID4gICAgICAgICAgICAgICAgICBpZiAoZ3Bpb2RfZ2V0X3ZhbHVlX2NhbnNsZWVwKGNvbm4tPmhw ZF9ncGlvKSkKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdG9yX3N0 YXR1c19jb25uZWN0ZWQ7Cj4gPiAgICAgICAgICAgICAgICAgIGVsc2UKPiA+IEBAIC04NCw2ICs4 NSw3IEBAIHN0YXRpYyBlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGRpc3BsYXlfY29ubmVjdG9y X2RldGVjdChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpCj4gPiAgIHN0YXRpYyBlbnVtIGRybV9jb25u ZWN0b3Jfc3RhdHVzCj4gPiAgIGRpc3BsYXlfY29ubmVjdG9yX2JyaWRnZV9kZXRlY3Qoc3RydWN0 IGRybV9icmlkZ2UgKmJyaWRnZSwgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiA+ ICAgewo+ID4gK3ByaW50aygiLS0tPiAlc1xuIiwgX19mdW5jX18pOwo+ID4gICAgICAgICAgcmV0 dXJuIGRpc3BsYXlfY29ubmVjdG9yX2RldGVjdChicmlkZ2UpOwo+ID4gICB9Cj4gPiAgIAo+ID4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kaXNwbGF5L2RybV9icmlkZ2VfY29ubmVjdG9y LmMgYi9kcml2ZXJzL2dwdS9kcm0vZGlzcGxheS9kcm1fYnJpZGdlX2Nvbm5lY3Rvci5jCj4gPiBp bmRleCA2NDk5NjlmY2ExNDEzLi44ODE2ZDgzN2M5YTc3IDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVy cy9ncHUvZHJtL2Rpc3BsYXkvZHJtX2JyaWRnZV9jb25uZWN0b3IuYwo+ID4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2Rpc3BsYXkvZHJtX2JyaWRnZV9jb25uZWN0b3IuYwo+ID4gQEAgLTIxOCw2ICsy MTgsNyBAQCBkcm1fYnJpZGdlX2Nvbm5lY3Rvcl9kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3Ig KmNvbm5lY3RvciwgYm9vbCBmb3JjZSkKPiA+ICAgICAgICAgIGVudW0gZHJtX2Nvbm5lY3Rvcl9z dGF0dXMgc3RhdHVzOwo+ID4gICAKPiA+ICAgICAgICAgIGlmIChkZXRlY3QpIHsKPiA+ICtwcmlu dGsoIi0tLT4gJXM6IGRldGVjdFxuIiwgX19mdW5jX18pOwo+ID4gICAgICAgICAgICAgICAgICBz dGF0dXMgPSBkZXRlY3QtPmZ1bmNzLT5kZXRlY3QoZGV0ZWN0LCBjb25uZWN0b3IpOwo+ID4gICAK PiA+ICAgICAgICAgICAgICAgICAgaWYgKGhkbWkpCj4gPiAKPiA+IAo+ID4gCj4gPiAKPiA+IAo+ IAo+IAoKCgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CkxpbnV4LXJvY2tjaGlwIG1haWxpbmcgbGlzdApMaW51eC1yb2NrY2hpcEBsaXN0cy5pbmZyYWRl YWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgt cm9ja2NoaXAK