From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, 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 3FDC2C433B4 for ; Thu, 15 Apr 2021 00:47:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 12F5461139 for ; Thu, 15 Apr 2021 00:47:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229559AbhDOAsK (ORCPT ); Wed, 14 Apr 2021 20:48:10 -0400 Received: from perceval.ideasonboard.com ([213.167.242.64]:39442 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229551AbhDOAsK (ORCPT ); Wed, 14 Apr 2021 20:48:10 -0400 Received: from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 6F2F351E; Thu, 15 Apr 2021 02:47:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1618447666; bh=ilnDH2Tmo+0CqI9tBtv+n6dQ1b/F3Pcfu3i0iNkboSk=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=jqWiywpV6pua2IaL+cpO7jXIr2e6qz+0w/zCuO/nkxh/+WQRa2RvpCjIK4eQFZoIj RMn1ufUmvv6VIBjfATZG9+wYUCaTLcf8thB1WmnUzpbKxyub/d24faMz7ZfJe0mt/x ZN51/mbqBPGybTEDxsD0MNudiF0tBDQHcsxgXyW8= Date: Thu, 15 Apr 2021 03:47:45 +0300 From: Laurent Pinchart To: Andrzej Hajda Cc: Doug Anderson , Rob Clark , Jernej Skrabec , Jonas Karlman , David Airlie , linux-arm-msm , Neil Armstrong , LKML , dri-devel , Stephen Boyd , Stanislav Lisovskiy , Robert Foss , Bjorn Andersson , Sam Ravnborg , Steev Klimaszewski Subject: Re: [PATCH v2 11/14] drm/bridge: ti-sn65dsi86: Power things properly for reading the EDID Message-ID: References: <20210330025345.3980086-1-dianders@chromium.org> <20210329195255.v2.11.Ied721dc895156046ac523baa55a71da241cd09c7@changeid> <8887ded7-d1ab-844c-e3a3-f39f6ef6264a@samsung.com> <7bc4ce04-4110-8b8a-067b-824296b52480@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <7bc4ce04-4110-8b8a-067b-824296b52480@samsung.com> Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org Hi Andrzej, On Tue, Apr 06, 2021 at 06:52:07PM +0200, Andrzej Hajda wrote: > Hello again after easter, > > I have looked little bit more at sn65* driver and its application to > have better background. > > I miss only info what panel do you have, how it is enabled/power controlled. > > W dniu 01.04.2021 o 16:57, Doug Anderson pisze: > > On Thu, Apr 1, 2021 at 4:12 AM Andrzej Hajda wrote: > >> W dniu 31.03.2021 o 16:48, Doug Anderson pisze: > >>> On Wed, Mar 31, 2021 at 4:08 AM Andrzej Hajda wrote: > >>>> W dniu 30.03.2021 o 04:53, Douglas Anderson pisze: > >>>>> eDP panels won't provide their EDID unless they're powered on. Let's > >>>>> chain a power-on before we read the EDID. This roughly matches what > >>>>> was done in 'parade-ps8640.c'. > >>>>> > >>>>> NOTE: The old code attempted to call pm_runtime_get_sync() before > >>>>> reading the EDID. While that was enough to power the bridge chip on, > >>>>> it wasn't enough to talk to the panel for two reasons: > >>>>> 1. Since we never ran the bridge chip's pre-enable then we never set > >>>>> the bit to ignore HPD. This meant the bridge chip didn't even _try_ > >>>>> to go out on the bus and communicate with the panel. > >>>>> 2. Even if we fixed things to ignore HPD, the EDID still wouldn't read > >>>>> if the panel wasn't on. > >>>>> > >>>>> One thing that's a bit odd here is taking advantage of the EDID that > >>>>> the core might have cached for us. See the patch ("drm/edid: Use the > >>>>> cached EDID in drm_get_edid() if eDP"). We manage to get at the cache > >>>>> by: > >>>>> - Instantly failing aux transfers if we're not powered. > >>>>> - If the first read of the EDID fails we try again after powering. > >>>>> > >>>>> Fixes: 58074b08c04a ("drm/bridge: ti-sn65dsi86: Read EDID blob over DDC") > >>>>> Signed-off-by: Douglas Anderson > >>>>> --- > >>>>> Depending on what people think of the other patches in this series, > >>>>> some of this could change. > >>>>> - If everyone loves the "runtime PM" in the panel driver then we > >>>>> could, in theory, put the pre-enable chaining straight in the "aux > >>>>> transfer" function. > >>>>> - If everyone hates the EDID cache moving to the core then we can > >>>>> avoid some of the awkward flow of things and keep the EDID cache in > >>>>> the sn65dsi86 driver. > >>>> > >>>> I wonder if this shouldn't be solved in the core - ie caller of > >>>> get_modes callback should be responsible for powering up the pipeline, > >>>> otherwise we need to repeat this stuff in every bridge/panel driver. > >>>> > >>>> Any thoughts? > >>> > >>> Yeah, I did look at this a little bit. Presumably it would only make > >>> sense to do it for eDP connections since: > >>> > >>> a) The concept of reading an EDID doesn't make sense for things like MIPI. > >> > >> I guess you mean MIPI DSI > > > > Yes, sorry! I'll try to be more clear. > > > >> and yes I agree, more generally it usually(!) > >> doesn't make sense for any setup with fixed display panel. > >> > >> On the other hand there are DSI/HDMI or DSI/DP adapters which usually > >> have EDID reading logic. > >> > >> And the concept makes sense for most connectors accepting external > >> displays: HDMI, DP, MHL, VGA... > > > > So, actually, IMO the concept doesn't make sense for anything with an > > external connector. Here's the logic for a handful of connectors: > > > > 1. MIPI DSI: there is no EDID so this doesn't make sense. > > > > 2. An external connector (HDMI, DP, etc): the display that's plugged > > in is externally powered so doesn't need us to power it up to read the > > EDID. By definition, when the HPD signal is asserted then it's OK to > > read the EDID and we don't even know if a display is plugged in until > > HPD is asserted. Thus no special power sequencing is needed to read > > the EDID. (Yes, we need to make sure that the eDP controller itself > > is powered, but that doesn't seem like it's the core's business). > > Not true IMO, even if external device is powered on, you must enable > EDID-reader logic. Sure, but I think Doug was referring to powering up the device connected to the SN65DSI86 output. When that device (from a DT and DRM bridge point of view) is an external connector, it means that the hardware device is an external HDMI/DP sink, and we have no way to control its power. The SN65DSI86 itself of course needs to be powered. > I guess it is not uncommon to have different power states for EDID > reading and bridge/panel pre-enablement (especially in embedded world). > In fact there are setups where EDID-reader is totally different device > than the bridge itself, and these devices should be > powered/enabled/operational only for time of EDID reading. > > > 3. eDP: this is where it matters. This is because: > > > > 3a) eDP displays aren't powered all the time. If you just boot up or > > you blank your screen, likely the display has no power at all. > > > > 3b) Because the display has no power, the "HPD" signal doesn't assert. > > In fact, for eDP the "HPD" signal really should mean "display ready" > > or "display finished powering up". > > > > 3c) Even though we never get a HPD signal, we still simply assume that > > a display is present because this is an "embedded" device. > > > > So eDP is unique (as far as I know) in that it's a type of display > > that has an EDID but that we will report "a display is here" before > > we've powered up the display and before we can read the EDID. > > > >>> b) For something with an external connector (DP and HDMI) you don't > >>> even know they're inserted unless the EDID is ready to read (these > >>> devices are, essentially, always powered). > >> > >> Usually there are two elements which are not the same: > >> > >> 1. HotPlug signal/wire. > >> > >> 2. EDID reading logic. > >> > >> The logic responsible for reading EDID needs to be enabled only for time > >> required for EDID reading :) So it's power state often must be > >> controlled explicitly by the bridge driver. So even if in many cases > >> pre_enable powers on the logic for EDID reading it does not make it the > >> rule, so I must step back from my claim that it is up to caller :) > > > > OK, I'll plan to keep it in the bridge chip driver now. > > > >>> So I started off trying to do this in the core for eDP, but then it > >>> wasn't completely clear how to write this code in a way that was super > >>> generic. Specifically: > >>> > >>> 1. I don't think it's a 100% guarantee that everything is powered on > >>> in pre-enable and powered off in post-disable. In this bridge chip > >>> it's true, but maybe not every eDP driver? Would you want me to just > >>> assume this, or add a flag? > >> > >> Ok, pre_enable should power on the chip, but for performing > >> initialization of video transport layer. Assumption it will power on > >> EDID logic is incorrect, so my claim seems wrong, but also this patch > >> looks incorrect :) > >> > >> In general only device containing EDID logic knows how to power it up. > > > > I still believe my patch is correct. Specifically I don't need to make > > any assumptions about display elements upstream of me (sources of the > > bridge chip). I only need to make assumptions about the pre-enable of > > the bridge driver itself and anything downstream of it. > > > > At the moment downstream of this particular bridge chip is always a > > panel device. Even further, all known downstream devices are > > "simple-panel". That is known to power up the panel enough to read the > > EDID in the "prepare" stage. > > > > Sure, someone _could_ add another bridge downstream in some design, > > but it would be up to that person to either fix that downstream driver > > to power itself in pre-enable or to add some type of quirk disabling > > the EDID reading. > > > >> Since I do not know your particular case I can propose few possible ways > >> to investigate: > >> > >> - call bridge.next->get_modes - you leave responsibility for powering up > >> to the downstream device. > > > > The "next" bridge is the panel, so I don't think this works. > > Then drm_panel_get_modes will work then. Not if the panel exposes modes through EDID, in that case it's the responsibility of the device connected to the DDC/AUX port to read the EDID and provide modes. The panel driver won't be able to handle it on its own. > >> - ddc driver on i2c request should power up the panel - seems also correct, > > > > Right, so I could put the > > "drm_bridge_chain_pre_enable(&pdata->bridge)" into the > > ti_sn_aux_transfer() function. I talked about that a little bit "after > > the cut" in my post where I said: > > > >> - If everyone loves the "runtime PM" in the panel driver then we > >> could, in theory, put the pre-enable chaining straight in the "aux > >> transfer" function. > > > > The reason for the dependence on "runtime PM" in the panel driver is > > that we are doing DDC over AUX and it breaks the EDID reading into > > lots of chunks so if we did the powering up and powering down there it > > would be crazy slow without the delayed poweroff. > > OK, it resembles to me DSI-controlled panel - to query/configure panel > panel driver asks DSI-host to transfer some bytes to the panel and/or > back via DSI-bus. > > In case of eDP panels we could do similar thing to read edid - we call > drm_panel_get_modes - it calls drm_panel_funcs.get_modes callback and it > decides (based on DT) if it should fill modes according to hardcoded > info into the driver or to ask the physical panel via DP-controller - > this way all the players (the panel, AUX/DDC device) will know what to > power-up. > > I guess there is missing pieces - there is no DP bus :), I am not sure > if there is straight way to access panel's aux/ddc from the panel > driver, maybe somehow via drm_connector ??? If the SN65DSI86 has to call drm_panel_get_modes(), which will then call back into the SN65DSI86 driver to perform the EDID read, it seems to me that the panel driver shouldn't be involved at all. DRM bridges have "recently" gained new operations to retrieve EDID, and there's a helper (drm_bridge_connector) that creates a connector for a chain of bridges, delegating connector operations to the appropriate bridge in the chain. This seems a better way forward to me (but I'm biased, as I've authored that code :-)). > Of course this only my idea - to be discussed with others. -- Regards, Laurent Pinchart 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=-8.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, 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 6BF65C433ED for ; Thu, 15 Apr 2021 00:47:51 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id B477561139 for ; Thu, 15 Apr 2021 00:47:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B477561139 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ideasonboard.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id ADF6A6E0A5; Thu, 15 Apr 2021 00:47:49 +0000 (UTC) Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id B94926E0A5 for ; Thu, 15 Apr 2021 00:47:48 +0000 (UTC) Received: from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi [62.78.145.57]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 6F2F351E; Thu, 15 Apr 2021 02:47:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1618447666; bh=ilnDH2Tmo+0CqI9tBtv+n6dQ1b/F3Pcfu3i0iNkboSk=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=jqWiywpV6pua2IaL+cpO7jXIr2e6qz+0w/zCuO/nkxh/+WQRa2RvpCjIK4eQFZoIj RMn1ufUmvv6VIBjfATZG9+wYUCaTLcf8thB1WmnUzpbKxyub/d24faMz7ZfJe0mt/x ZN51/mbqBPGybTEDxsD0MNudiF0tBDQHcsxgXyW8= Date: Thu, 15 Apr 2021 03:47:45 +0300 From: Laurent Pinchart To: Andrzej Hajda Subject: Re: [PATCH v2 11/14] drm/bridge: ti-sn65dsi86: Power things properly for reading the EDID Message-ID: References: <20210330025345.3980086-1-dianders@chromium.org> <20210329195255.v2.11.Ied721dc895156046ac523baa55a71da241cd09c7@changeid> <8887ded7-d1ab-844c-e3a3-f39f6ef6264a@samsung.com> <7bc4ce04-4110-8b8a-067b-824296b52480@samsung.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <7bc4ce04-4110-8b8a-067b-824296b52480@samsung.com> 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: , Cc: Rob Clark , Jernej Skrabec , Jonas Karlman , David Airlie , linux-arm-msm , Neil Armstrong , Doug Anderson , dri-devel , LKML , Stanislav Lisovskiy , Bjorn Andersson , Robert Foss , Stephen Boyd , Sam Ravnborg , Steev Klimaszewski Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" SGkgQW5kcnplaiwKCk9uIFR1ZSwgQXByIDA2LCAyMDIxIGF0IDA2OjUyOjA3UE0gKzAyMDAsIEFu ZHJ6ZWogSGFqZGEgd3JvdGU6Cj4gSGVsbG8gYWdhaW4gYWZ0ZXIgZWFzdGVyLAo+IAo+IEkgaGF2 ZSBsb29rZWQgbGl0dGxlIGJpdCBtb3JlIGF0IHNuNjUqIGRyaXZlciBhbmQgaXRzIGFwcGxpY2F0 aW9uIHRvIAo+IGhhdmUgYmV0dGVyIGJhY2tncm91bmQuCj4gCj4gSSBtaXNzIG9ubHkgaW5mbyB3 aGF0IHBhbmVsIGRvIHlvdSBoYXZlLCBob3cgaXQgaXMgZW5hYmxlZC9wb3dlciBjb250cm9sbGVk Lgo+IAo+IFcgZG5pdSAwMS4wNC4yMDIxIG/CoDE2OjU3LCBEb3VnIEFuZGVyc29uIHBpc3plOgo+ ID4gT24gVGh1LCBBcHIgMSwgMjAyMSBhdCA0OjEyIEFNIEFuZHJ6ZWogSGFqZGEgPGEuaGFqZGFA c2Ftc3VuZy5jb20+IHdyb3RlOgo+ID4+IFcgZG5pdSAzMS4wMy4yMDIxIG8gMTY6NDgsIERvdWcg QW5kZXJzb24gcGlzemU6Cj4gPj4+IE9uIFdlZCwgTWFyIDMxLCAyMDIxIGF0IDQ6MDggQU0gQW5k cnplaiBIYWpkYSA8YS5oYWpkYUBzYW1zdW5nLmNvbT4gd3JvdGU6Cj4gPj4+PiBXIGRuaXUgMzAu MDMuMjAyMSBvIDA0OjUzLCBEb3VnbGFzIEFuZGVyc29uIHBpc3plOgo+ID4+Pj4+IGVEUCBwYW5l bHMgd29uJ3QgcHJvdmlkZSB0aGVpciBFRElEIHVubGVzcyB0aGV5J3JlIHBvd2VyZWQgb24uIExl dCdzCj4gPj4+Pj4gY2hhaW4gYSBwb3dlci1vbiBiZWZvcmUgd2UgcmVhZCB0aGUgRURJRC4gVGhp cyByb3VnaGx5IG1hdGNoZXMgd2hhdAo+ID4+Pj4+IHdhcyBkb25lIGluICdwYXJhZGUtcHM4NjQw LmMnLgo+ID4+Pj4+Cj4gPj4+Pj4gTk9URTogVGhlIG9sZCBjb2RlIGF0dGVtcHRlZCB0byBjYWxs IHBtX3J1bnRpbWVfZ2V0X3N5bmMoKSBiZWZvcmUKPiA+Pj4+PiByZWFkaW5nIHRoZSBFRElELiBX aGlsZSB0aGF0IHdhcyBlbm91Z2ggdG8gcG93ZXIgdGhlIGJyaWRnZSBjaGlwIG9uLAo+ID4+Pj4+ IGl0IHdhc24ndCBlbm91Z2ggdG8gdGFsayB0byB0aGUgcGFuZWwgZm9yIHR3byByZWFzb25zOgo+ ID4+Pj4+IDEuIFNpbmNlIHdlIG5ldmVyIHJhbiB0aGUgYnJpZGdlIGNoaXAncyBwcmUtZW5hYmxl IHRoZW4gd2UgbmV2ZXIgc2V0Cj4gPj4+Pj4gICAgICAgdGhlIGJpdCB0byBpZ25vcmUgSFBELiBU aGlzIG1lYW50IHRoZSBicmlkZ2UgY2hpcCBkaWRuJ3QgZXZlbiBfdHJ5Xwo+ID4+Pj4+ICAgICAg IHRvIGdvIG91dCBvbiB0aGUgYnVzIGFuZCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBwYW5lbC4KPiA+ Pj4+PiAyLiBFdmVuIGlmIHdlIGZpeGVkIHRoaW5ncyB0byBpZ25vcmUgSFBELCB0aGUgRURJRCBz dGlsbCB3b3VsZG4ndCByZWFkCj4gPj4+Pj4gICAgICAgaWYgdGhlIHBhbmVsIHdhc24ndCBvbi4K PiA+Pj4+Pgo+ID4+Pj4+IE9uZSB0aGluZyB0aGF0J3MgYSBiaXQgb2RkIGhlcmUgaXMgdGFraW5n IGFkdmFudGFnZSBvZiB0aGUgRURJRCB0aGF0Cj4gPj4+Pj4gdGhlIGNvcmUgbWlnaHQgaGF2ZSBj YWNoZWQgZm9yIHVzLiBTZWUgdGhlIHBhdGNoICgiZHJtL2VkaWQ6IFVzZSB0aGUKPiA+Pj4+PiBj YWNoZWQgRURJRCBpbiBkcm1fZ2V0X2VkaWQoKSBpZiBlRFAiKS4gV2UgbWFuYWdlIHRvIGdldCBh dCB0aGUgY2FjaGUKPiA+Pj4+PiBieToKPiA+Pj4+PiAtIEluc3RhbnRseSBmYWlsaW5nIGF1eCB0 cmFuc2ZlcnMgaWYgd2UncmUgbm90IHBvd2VyZWQuCj4gPj4+Pj4gLSBJZiB0aGUgZmlyc3QgcmVh ZCBvZiB0aGUgRURJRCBmYWlscyB3ZSB0cnkgYWdhaW4gYWZ0ZXIgcG93ZXJpbmcuCj4gPj4+Pj4K PiA+Pj4+PiBGaXhlczogNTgwNzRiMDhjMDRhICgiZHJtL2JyaWRnZTogdGktc242NWRzaTg2OiBS ZWFkIEVESUQgYmxvYiBvdmVyIEREQyIpCj4gPj4+Pj4gU2lnbmVkLW9mZi1ieTogRG91Z2xhcyBB bmRlcnNvbiA8ZGlhbmRlcnNAY2hyb21pdW0ub3JnPgo+ID4+Pj4+IC0tLQo+ID4+Pj4+IERlcGVu ZGluZyBvbiB3aGF0IHBlb3BsZSB0aGluayBvZiB0aGUgb3RoZXIgcGF0Y2hlcyBpbiB0aGlzIHNl cmllcywKPiA+Pj4+PiBzb21lIG9mIHRoaXMgY291bGQgY2hhbmdlLgo+ID4+Pj4+IC0gSWYgZXZl cnlvbmUgbG92ZXMgdGhlICJydW50aW1lIFBNIiBpbiB0aGUgcGFuZWwgZHJpdmVyIHRoZW4gd2UK PiA+Pj4+PiAgICAgIGNvdWxkLCBpbiB0aGVvcnksIHB1dCB0aGUgcHJlLWVuYWJsZSBjaGFpbmlu ZyBzdHJhaWdodCBpbiB0aGUgImF1eAo+ID4+Pj4+ICAgICAgdHJhbnNmZXIiIGZ1bmN0aW9uLgo+ ID4+Pj4+IC0gSWYgZXZlcnlvbmUgaGF0ZXMgdGhlIEVESUQgY2FjaGUgbW92aW5nIHRvIHRoZSBj b3JlIHRoZW4gd2UgY2FuCj4gPj4+Pj4gICAgICBhdm9pZCBzb21lIG9mIHRoZSBhd2t3YXJkIGZs b3cgb2YgdGhpbmdzIGFuZCBrZWVwIHRoZSBFRElEIGNhY2hlIGluCj4gPj4+Pj4gICAgICB0aGUg c242NWRzaTg2IGRyaXZlci4KPiA+Pj4+Cj4gPj4+PiBJIHdvbmRlciBpZiB0aGlzIHNob3VsZG4n dCBiZSBzb2x2ZWQgaW4gdGhlIGNvcmUgLSBpZSBjYWxsZXIgb2YKPiA+Pj4+IGdldF9tb2RlcyBj YWxsYmFjayBzaG91bGQgYmUgcmVzcG9uc2libGUgZm9yIHBvd2VyaW5nIHVwIHRoZSBwaXBlbGlu ZSwKPiA+Pj4+IG90aGVyd2lzZSB3ZSBuZWVkIHRvIHJlcGVhdCB0aGlzIHN0dWZmIGluIGV2ZXJ5 IGJyaWRnZS9wYW5lbCBkcml2ZXIuCj4gPj4+Pgo+ID4+Pj4gQW55IHRob3VnaHRzPwo+ID4+Pgo+ ID4+PiBZZWFoLCBJIGRpZCBsb29rIGF0IHRoaXMgYSBsaXR0bGUgYml0LiBQcmVzdW1hYmx5IGl0 IHdvdWxkIG9ubHkgbWFrZQo+ID4+PiBzZW5zZSB0byBkbyBpdCBmb3IgZURQIGNvbm5lY3Rpb25z IHNpbmNlOgo+ID4+Pgo+ID4+PiBhKSBUaGUgY29uY2VwdCBvZiByZWFkaW5nIGFuIEVESUQgZG9l c24ndCBtYWtlIHNlbnNlIGZvciB0aGluZ3MgbGlrZSBNSVBJLgo+ID4+Cj4gPj4gSSBndWVzcyB5 b3UgbWVhbiBNSVBJIERTSQo+ID4KPiA+IFllcywgc29ycnkhIEknbGwgdHJ5IHRvIGJlIG1vcmUg Y2xlYXIuCj4gPgo+ID4+IGFuZCB5ZXMgSSBhZ3JlZSwgbW9yZSBnZW5lcmFsbHkgaXQgdXN1YWxs eSghKQo+ID4+IGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3IgYW55IHNldHVwIHdpdGggZml4ZWQgZGlz cGxheSBwYW5lbC4KPiA+Pgo+ID4+IE9uIHRoZSBvdGhlciBoYW5kIHRoZXJlIGFyZSBEU0kvSERN SSBvciBEU0kvRFAgYWRhcHRlcnMgd2hpY2ggdXN1YWxseQo+ID4+IGhhdmUgRURJRCByZWFkaW5n IGxvZ2ljLgo+ID4+Cj4gPj4gQW5kIHRoZSBjb25jZXB0IG1ha2VzIHNlbnNlIGZvciBtb3N0IGNv bm5lY3RvcnMgYWNjZXB0aW5nIGV4dGVybmFsCj4gPj4gZGlzcGxheXM6IEhETUksIERQLCBNSEws IFZHQS4uLgo+ID4KPiA+IFNvLCBhY3R1YWxseSwgSU1PIHRoZSBjb25jZXB0IGRvZXNuJ3QgbWFr ZSBzZW5zZSBmb3IgYW55dGhpbmcgd2l0aCBhbgo+ID4gZXh0ZXJuYWwgY29ubmVjdG9yLiBIZXJl J3MgdGhlIGxvZ2ljIGZvciBhIGhhbmRmdWwgb2YgY29ubmVjdG9yczoKPiA+Cj4gPiAxLiBNSVBJ IERTSTogdGhlcmUgaXMgbm8gRURJRCBzbyB0aGlzIGRvZXNuJ3QgbWFrZSBzZW5zZS4KPiA+Cj4g PiAyLiBBbiBleHRlcm5hbCBjb25uZWN0b3IgKEhETUksIERQLCBldGMpOiB0aGUgZGlzcGxheSB0 aGF0J3MgcGx1Z2dlZAo+ID4gaW4gaXMgZXh0ZXJuYWxseSBwb3dlcmVkIHNvIGRvZXNuJ3QgbmVl ZCB1cyB0byBwb3dlciBpdCB1cCB0byByZWFkIHRoZQo+ID4gRURJRC4gQnkgZGVmaW5pdGlvbiwg d2hlbiB0aGUgSFBEIHNpZ25hbCBpcyBhc3NlcnRlZCB0aGVuIGl0J3MgT0sgdG8KPiA+IHJlYWQg dGhlIEVESUQgYW5kIHdlIGRvbid0IGV2ZW4ga25vdyBpZiBhIGRpc3BsYXkgaXMgcGx1Z2dlZCBp biB1bnRpbAo+ID4gSFBEIGlzIGFzc2VydGVkLiBUaHVzIG5vIHNwZWNpYWwgcG93ZXIgc2VxdWVu Y2luZyBpcyBuZWVkZWQgdG8gcmVhZAo+ID4gdGhlIEVESUQuICAoWWVzLCB3ZSBuZWVkIHRvIG1h a2Ugc3VyZSB0aGF0IHRoZSBlRFAgY29udHJvbGxlciBpdHNlbGYKPiA+IGlzIHBvd2VyZWQsIGJ1 dCB0aGF0IGRvZXNuJ3Qgc2VlbSBsaWtlIGl0J3MgdGhlIGNvcmUncyBidXNpbmVzcykuCj4gCj4g Tm90IHRydWUgSU1PLCBldmVuIGlmIGV4dGVybmFsIGRldmljZSBpcyBwb3dlcmVkIG9uLCB5b3Ug bXVzdCBlbmFibGUgCj4gRURJRC1yZWFkZXIgbG9naWMuCgpTdXJlLCBidXQgSSB0aGluayBEb3Vn IHdhcyByZWZlcnJpbmcgdG8gcG93ZXJpbmcgdXAgdGhlIGRldmljZSBjb25uZWN0ZWQKdG8gdGhl IFNONjVEU0k4NiBvdXRwdXQuIFdoZW4gdGhhdCBkZXZpY2UgKGZyb20gYSBEVCBhbmQgRFJNIGJy aWRnZQpwb2ludCBvZiB2aWV3KSBpcyBhbiBleHRlcm5hbCBjb25uZWN0b3IsIGl0IG1lYW5zIHRo YXQgdGhlIGhhcmR3YXJlCmRldmljZSBpcyBhbiBleHRlcm5hbCBIRE1JL0RQIHNpbmssIGFuZCB3 ZSBoYXZlIG5vIHdheSB0byBjb250cm9sIGl0cwpwb3dlci4gVGhlIFNONjVEU0k4NiBpdHNlbGYg b2YgY291cnNlIG5lZWRzIHRvIGJlIHBvd2VyZWQuCgo+IEkgZ3Vlc3MgaXQgaXMgbm90IHVuY29t bW9uIHRvIGhhdmUgZGlmZmVyZW50IHBvd2VyIHN0YXRlcyBmb3IgRURJRCAKPiByZWFkaW5nIGFu ZCBicmlkZ2UvcGFuZWwgcHJlLWVuYWJsZW1lbnQgKGVzcGVjaWFsbHkgaW4gZW1iZWRkZWQgd29y bGQpLiAKPiBJbiBmYWN0IHRoZXJlIGFyZSBzZXR1cHMgd2hlcmUgRURJRC1yZWFkZXIgaXMgdG90 YWxseSBkaWZmZXJlbnQgZGV2aWNlIAo+IHRoYW4gdGhlIGJyaWRnZSBpdHNlbGYsIGFuZCB0aGVz ZSBkZXZpY2VzIHNob3VsZCBiZSAKPiBwb3dlcmVkL2VuYWJsZWQvb3BlcmF0aW9uYWwgb25seSBm b3IgdGltZSBvZiBFRElEIHJlYWRpbmcuCj4gCj4gPiAzLiBlRFA6IHRoaXMgaXMgd2hlcmUgaXQg bWF0dGVycy4gVGhpcyBpcyBiZWNhdXNlOgo+ID4KPiA+IDNhKSBlRFAgZGlzcGxheXMgYXJlbid0 IHBvd2VyZWQgYWxsIHRoZSB0aW1lLiBJZiB5b3UganVzdCBib290IHVwIG9yCj4gPiB5b3UgYmxh bmsgeW91ciBzY3JlZW4sIGxpa2VseSB0aGUgZGlzcGxheSBoYXMgbm8gcG93ZXIgYXQgYWxsLgo+ ID4KPiA+IDNiKSBCZWNhdXNlIHRoZSBkaXNwbGF5IGhhcyBubyBwb3dlciwgdGhlICJIUEQiIHNp Z25hbCBkb2Vzbid0IGFzc2VydC4KPiA+IEluIGZhY3QsIGZvciBlRFAgdGhlICJIUEQiIHNpZ25h bCByZWFsbHkgc2hvdWxkIG1lYW4gImRpc3BsYXkgcmVhZHkiCj4gPiBvciAiZGlzcGxheSBmaW5p c2hlZCBwb3dlcmluZyB1cCIuCj4gPgo+ID4gM2MpIEV2ZW4gdGhvdWdoIHdlIG5ldmVyIGdldCBh IEhQRCBzaWduYWwsIHdlIHN0aWxsIHNpbXBseSBhc3N1bWUgdGhhdAo+ID4gYSBkaXNwbGF5IGlz IHByZXNlbnQgYmVjYXVzZSB0aGlzIGlzIGFuICJlbWJlZGRlZCIgZGV2aWNlLgo+ID4KPiA+IFNv IGVEUCBpcyB1bmlxdWUgKGFzIGZhciBhcyBJIGtub3cpIGluIHRoYXQgaXQncyBhIHR5cGUgb2Yg ZGlzcGxheQo+ID4gdGhhdCBoYXMgYW4gRURJRCBidXQgdGhhdCB3ZSB3aWxsIHJlcG9ydCAiYSBk aXNwbGF5IGlzIGhlcmUiIGJlZm9yZQo+ID4gd2UndmUgcG93ZXJlZCB1cCB0aGUgZGlzcGxheSBh bmQgYmVmb3JlIHdlIGNhbiByZWFkIHRoZSBFRElELgo+ID4KPiA+Pj4gYikgRm9yIHNvbWV0aGlu ZyB3aXRoIGFuIGV4dGVybmFsIGNvbm5lY3RvciAoRFAgYW5kIEhETUkpIHlvdSBkb24ndAo+ID4+ PiBldmVuIGtub3cgdGhleSdyZSBpbnNlcnRlZCB1bmxlc3MgdGhlIEVESUQgaXMgcmVhZHkgdG8g cmVhZCAodGhlc2UKPiA+Pj4gZGV2aWNlcyBhcmUsIGVzc2VudGlhbGx5LCBhbHdheXMgcG93ZXJl ZCkuCj4gPj4KPiA+PiBVc3VhbGx5IHRoZXJlIGFyZSB0d28gZWxlbWVudHMgd2hpY2ggYXJlIG5v dCB0aGUgc2FtZToKPiA+Pgo+ID4+IDEuIEhvdFBsdWcgc2lnbmFsL3dpcmUuCj4gPj4KPiA+PiAy LiBFRElEIHJlYWRpbmcgbG9naWMuCj4gPj4KPiA+PiBUaGUgbG9naWMgcmVzcG9uc2libGUgZm9y IHJlYWRpbmcgRURJRCBuZWVkcyB0byBiZSBlbmFibGVkIG9ubHkgZm9yIHRpbWUKPiA+PiByZXF1 aXJlZCBmb3IgRURJRCByZWFkaW5nIDopIFNvIGl0J3MgcG93ZXIgc3RhdGUgb2Z0ZW4gbXVzdCBi ZQo+ID4+IGNvbnRyb2xsZWQgZXhwbGljaXRseSBieSB0aGUgYnJpZGdlIGRyaXZlci4gU28gZXZl biBpZiBpbiBtYW55IGNhc2VzCj4gPj4gcHJlX2VuYWJsZSBwb3dlcnMgb24gdGhlIGxvZ2ljIGZv ciBFRElEIHJlYWRpbmcgaXQgZG9lcyBub3QgbWFrZSBpdCB0aGUKPiA+PiBydWxlLCBzbyBJIG11 c3Qgc3RlcCBiYWNrIGZyb20gbXkgY2xhaW0gdGhhdCBpdCBpcyB1cCB0byBjYWxsZXIgOikKPiA+ Cj4gPiBPSywgSSdsbCBwbGFuIHRvIGtlZXAgaXQgaW4gdGhlIGJyaWRnZSBjaGlwIGRyaXZlciBu b3cuCj4gPgo+ID4+PiBTbyBJIHN0YXJ0ZWQgb2ZmIHRyeWluZyB0byBkbyB0aGlzIGluIHRoZSBj b3JlIGZvciBlRFAsIGJ1dCB0aGVuIGl0Cj4gPj4+IHdhc24ndCBjb21wbGV0ZWx5IGNsZWFyIGhv dyB0byB3cml0ZSB0aGlzIGNvZGUgaW4gYSB3YXkgdGhhdCB3YXMgc3VwZXIKPiA+Pj4gZ2VuZXJp Yy4gU3BlY2lmaWNhbGx5Ogo+ID4+Pgo+ID4+PiAxLiBJIGRvbid0IHRoaW5rIGl0J3MgYSAxMDAl IGd1YXJhbnRlZSB0aGF0IGV2ZXJ5dGhpbmcgaXMgcG93ZXJlZCBvbgo+ID4+PiBpbiBwcmUtZW5h YmxlIGFuZCBwb3dlcmVkIG9mZiBpbiBwb3N0LWRpc2FibGUuIEluIHRoaXMgYnJpZGdlIGNoaXAK PiA+Pj4gaXQncyB0cnVlLCBidXQgbWF5YmUgbm90IGV2ZXJ5IGVEUCBkcml2ZXI/IFdvdWxkIHlv dSB3YW50IG1lIHRvIGp1c3QKPiA+Pj4gYXNzdW1lIHRoaXMsIG9yIGFkZCBhIGZsYWc/Cj4gPj4K PiA+PiBPaywgcHJlX2VuYWJsZSBzaG91bGQgcG93ZXIgb24gdGhlIGNoaXAsIGJ1dCBmb3IgcGVy Zm9ybWluZwo+ID4+IGluaXRpYWxpemF0aW9uIG9mIHZpZGVvIHRyYW5zcG9ydCBsYXllci4gQXNz dW1wdGlvbiBpdCB3aWxsIHBvd2VyIG9uCj4gPj4gRURJRCBsb2dpYyBpcyBpbmNvcnJlY3QsIHNv IG15IGNsYWltIHNlZW1zIHdyb25nLCBidXQgYWxzbyB0aGlzIHBhdGNoCj4gPj4gbG9va3MgaW5j b3JyZWN0IDopCj4gPj4KPiA+PiBJbiBnZW5lcmFsIG9ubHkgZGV2aWNlIGNvbnRhaW5pbmcgRURJ RCBsb2dpYyBrbm93cyBob3cgdG8gcG93ZXIgaXQgdXAuCj4gPgo+ID4gSSBzdGlsbCBiZWxpZXZl IG15IHBhdGNoIGlzIGNvcnJlY3QuIFNwZWNpZmljYWxseSBJIGRvbid0IG5lZWQgdG8gbWFrZQo+ ID4gYW55IGFzc3VtcHRpb25zIGFib3V0IGRpc3BsYXkgZWxlbWVudHMgdXBzdHJlYW0gb2YgbWUg KHNvdXJjZXMgb2YgdGhlCj4gPiBicmlkZ2UgY2hpcCkuIEkgb25seSBuZWVkIHRvIG1ha2UgYXNz dW1wdGlvbnMgYWJvdXQgdGhlIHByZS1lbmFibGUgb2YKPiA+IHRoZSBicmlkZ2UgZHJpdmVyIGl0 c2VsZiBhbmQgYW55dGhpbmcgZG93bnN0cmVhbSBvZiBpdC4KPiA+Cj4gPiBBdCB0aGUgbW9tZW50 IGRvd25zdHJlYW0gb2YgdGhpcyBwYXJ0aWN1bGFyIGJyaWRnZSBjaGlwIGlzIGFsd2F5cyBhCj4g PiBwYW5lbCBkZXZpY2UuIEV2ZW4gZnVydGhlciwgYWxsIGtub3duIGRvd25zdHJlYW0gZGV2aWNl cyBhcmUKPiA+ICJzaW1wbGUtcGFuZWwiLiBUaGF0IGlzIGtub3duIHRvIHBvd2VyIHVwIHRoZSBw YW5lbCBlbm91Z2ggdG8gcmVhZCB0aGUKPiA+IEVESUQgaW4gdGhlICJwcmVwYXJlIiBzdGFnZS4K PiA+Cj4gPiBTdXJlLCBzb21lb25lIF9jb3VsZF8gYWRkIGFub3RoZXIgYnJpZGdlIGRvd25zdHJl YW0gaW4gc29tZSBkZXNpZ24sCj4gPiBidXQgaXQgd291bGQgYmUgdXAgdG8gdGhhdCBwZXJzb24g dG8gZWl0aGVyIGZpeCB0aGF0IGRvd25zdHJlYW0gZHJpdmVyCj4gPiB0byBwb3dlciBpdHNlbGYg aW4gcHJlLWVuYWJsZSBvciB0byBhZGQgc29tZSB0eXBlIG9mIHF1aXJrIGRpc2FibGluZwo+ID4g dGhlIEVESUQgcmVhZGluZy4KPiA+Cj4gPj4gU2luY2UgSSBkbyBub3Qga25vdyB5b3VyIHBhcnRp Y3VsYXIgY2FzZSBJIGNhbiBwcm9wb3NlIGZldyBwb3NzaWJsZSB3YXlzCj4gPj4gdG8gaW52ZXN0 aWdhdGU6Cj4gPj4KPiA+PiAtIGNhbGwgYnJpZGdlLm5leHQtPmdldF9tb2RlcyAtIHlvdSBsZWF2 ZSByZXNwb25zaWJpbGl0eSBmb3IgcG93ZXJpbmcgdXAKPiA+PiB0byB0aGUgZG93bnN0cmVhbSBk ZXZpY2UuCj4gPgo+ID4gVGhlICJuZXh0IiBicmlkZ2UgaXMgdGhlIHBhbmVsLCBzbyBJIGRvbid0 IHRoaW5rIHRoaXMgd29ya3MuCj4gCj4gVGhlbiBkcm1fcGFuZWxfZ2V0X21vZGVzIHdpbGwgd29y ayB0aGVuLgoKTm90IGlmIHRoZSBwYW5lbCBleHBvc2VzIG1vZGVzIHRocm91Z2ggRURJRCwgaW4g dGhhdCBjYXNlIGl0J3MgdGhlCnJlc3BvbnNpYmlsaXR5IG9mIHRoZSBkZXZpY2UgY29ubmVjdGVk IHRvIHRoZSBEREMvQVVYIHBvcnQgdG8gcmVhZCB0aGUKRURJRCBhbmQgcHJvdmlkZSBtb2Rlcy4g VGhlIHBhbmVsIGRyaXZlciB3b24ndCBiZSBhYmxlIHRvIGhhbmRsZSBpdCBvbgppdHMgb3duLgoK PiA+PiAtIGRkYyBkcml2ZXIgb24gaTJjIHJlcXVlc3Qgc2hvdWxkIHBvd2VyIHVwIHRoZSBwYW5l bCAtIHNlZW1zIGFsc28gY29ycmVjdCwKPiA+Cj4gPiBSaWdodCwgc28gSSBjb3VsZCBwdXQgdGhl Cj4gPiAiZHJtX2JyaWRnZV9jaGFpbl9wcmVfZW5hYmxlKCZwZGF0YS0+YnJpZGdlKSIgaW50byB0 aGUKPiA+IHRpX3NuX2F1eF90cmFuc2ZlcigpIGZ1bmN0aW9uLiBJIHRhbGtlZCBhYm91dCB0aGF0 IGEgbGl0dGxlIGJpdCAiYWZ0ZXIKPiA+IHRoZSBjdXQiIGluIG15IHBvc3Qgd2hlcmUgSSBzYWlk Ogo+ID4KPiA+PiAtIElmIGV2ZXJ5b25lIGxvdmVzIHRoZSAicnVudGltZSBQTSIgaW4gdGhlIHBh bmVsIGRyaXZlciB0aGVuIHdlCj4gPj4gICBjb3VsZCwgaW4gdGhlb3J5LCBwdXQgdGhlIHByZS1l bmFibGUgY2hhaW5pbmcgc3RyYWlnaHQgaW4gdGhlICJhdXgKPiA+PiAgIHRyYW5zZmVyIiBmdW5j dGlvbi4KPiA+Cj4gPiBUaGUgcmVhc29uIGZvciB0aGUgZGVwZW5kZW5jZSBvbiAicnVudGltZSBQ TSIgaW4gdGhlIHBhbmVsIGRyaXZlciBpcwo+ID4gdGhhdCB3ZSBhcmUgZG9pbmcgRERDIG92ZXIg QVVYIGFuZCBpdCBicmVha3MgdGhlIEVESUQgcmVhZGluZyBpbnRvCj4gPiBsb3RzIG9mIGNodW5r cyBzbyBpZiB3ZSBkaWQgdGhlIHBvd2VyaW5nIHVwIGFuZCBwb3dlcmluZyBkb3duIHRoZXJlIGl0 Cj4gPiB3b3VsZCBiZSBjcmF6eSBzbG93IHdpdGhvdXQgdGhlIGRlbGF5ZWQgcG93ZXJvZmYuCj4g Cj4gT0ssIGl0IHJlc2VtYmxlcyB0byBtZSBEU0ktY29udHJvbGxlZCBwYW5lbCAtIHRvIHF1ZXJ5 L2NvbmZpZ3VyZSBwYW5lbCAKPiBwYW5lbCBkcml2ZXIgYXNrcyBEU0ktaG9zdCB0byB0cmFuc2Zl ciBzb21lIGJ5dGVzIHRvIHRoZSBwYW5lbCBhbmQvb3IgCj4gYmFjayB2aWEgRFNJLWJ1cy4KPiAK PiBJbiBjYXNlIG9mIGVEUCBwYW5lbHMgd2UgY291bGQgZG8gc2ltaWxhciB0aGluZyB0byByZWFk IGVkaWQgLSB3ZSBjYWxsIAo+IGRybV9wYW5lbF9nZXRfbW9kZXMgLSBpdCBjYWxscyBkcm1fcGFu ZWxfZnVuY3MuZ2V0X21vZGVzIGNhbGxiYWNrIGFuZCBpdCAKPiBkZWNpZGVzIChiYXNlZCBvbiBE VCkgaWYgaXQgc2hvdWxkIGZpbGwgbW9kZXMgYWNjb3JkaW5nIHRvIGhhcmRjb2RlZCAKPiBpbmZv IGludG8gdGhlIGRyaXZlciBvciB0byBhc2sgdGhlIHBoeXNpY2FsIHBhbmVsIHZpYSBEUC1jb250 cm9sbGVyIC0gCj4gdGhpcyB3YXkgYWxsIHRoZSBwbGF5ZXJzICh0aGUgcGFuZWwsIEFVWC9EREMg ZGV2aWNlKSB3aWxsIGtub3cgd2hhdCB0byAKPiBwb3dlci11cC4KPiAKPiBJIGd1ZXNzIHRoZXJl IGlzIG1pc3NpbmcgcGllY2VzIC0gdGhlcmUgaXMgbm8gRFAgYnVzIDopLCBJIGFtIG5vdCBzdXJl IAo+IGlmIHRoZXJlIGlzIHN0cmFpZ2h0IHdheSB0byBhY2Nlc3MgcGFuZWwncyBhdXgvZGRjIGZy b20gdGhlIHBhbmVsIAo+IGRyaXZlciwgbWF5YmUgc29tZWhvdyB2aWEgZHJtX2Nvbm5lY3RvciA/ Pz8KCklmIHRoZSBTTjY1RFNJODYgaGFzIHRvIGNhbGwgZHJtX3BhbmVsX2dldF9tb2RlcygpLCB3 aGljaCB3aWxsIHRoZW4gY2FsbApiYWNrIGludG8gdGhlIFNONjVEU0k4NiBkcml2ZXIgdG8gcGVy Zm9ybSB0aGUgRURJRCByZWFkLCBpdCBzZWVtcyB0byBtZQp0aGF0IHRoZSBwYW5lbCBkcml2ZXIg c2hvdWxkbid0IGJlIGludm9sdmVkIGF0IGFsbC4KCkRSTSBicmlkZ2VzIGhhdmUgInJlY2VudGx5 IiBnYWluZWQgbmV3IG9wZXJhdGlvbnMgdG8gcmV0cmlldmUgRURJRCwgYW5kCnRoZXJlJ3MgYSBo ZWxwZXIgKGRybV9icmlkZ2VfY29ubmVjdG9yKSB0aGF0IGNyZWF0ZXMgYSBjb25uZWN0b3IgZm9y IGEKY2hhaW4gb2YgYnJpZGdlcywgZGVsZWdhdGluZyBjb25uZWN0b3Igb3BlcmF0aW9ucyB0byB0 aGUgYXBwcm9wcmlhdGUKYnJpZGdlIGluIHRoZSBjaGFpbi4gVGhpcyBzZWVtcyBhIGJldHRlciB3 YXkgZm9yd2FyZCB0byBtZSAoYnV0IEknbQpiaWFzZWQsIGFzIEkndmUgYXV0aG9yZWQgdGhhdCBj b2RlIDotKSkuCgo+IE9mIGNvdXJzZSB0aGlzIG9ubHkgbXkgaWRlYSAtIHRvIGJlIGRpc2N1c3Nl ZCB3aXRoIG90aGVycy4KCi0tIApSZWdhcmRzLAoKTGF1cmVudCBQaW5jaGFydApfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBs aXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK