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=-1.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,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 428ECC04EB8 for ; Fri, 30 Nov 2018 12:00:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id EE2ED20868 for ; Fri, 30 Nov 2018 12:00:58 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EE2ED20868 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-clk-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726521AbeK3XKB convert rfc822-to-8bit (ORCPT ); Fri, 30 Nov 2018 18:10:01 -0500 Received: from mail.bootlin.com ([62.4.15.54]:50697 "EHLO mail.bootlin.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726473AbeK3XKB (ORCPT ); Fri, 30 Nov 2018 18:10:01 -0500 Received: by mail.bootlin.com (Postfix, from userid 110) id 6012C207BC; Fri, 30 Nov 2018 13:00:54 +0100 (CET) Received: from xps13 (aaubervilliers-681-1-63-158.w90-88.abo.wanadoo.fr [90.88.18.158]) by mail.bootlin.com (Postfix) with ESMTPSA id 0706E2037D; Fri, 30 Nov 2018 13:00:54 +0100 (CET) Date: Fri, 30 Nov 2018 13:00:53 +0100 From: Miquel Raynal To: Stephen Boyd Cc: Michael Turquette , Russell King , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Thomas Petazzoni , Antoine Tenart , Maxime Chevallier , Gregory Clement , Nadav Haklai , Maxime Ripard Subject: Re: [PATCH 0/2] Link consumer with clock driver Message-ID: <20181130130053.4f944b3b@xps13> In-Reply-To: <154356989722.88331.10134203618475749179@swboyd.mtv.corp.google.com> References: <20181122212212.16039-1-miquel.raynal@bootlin.com> <154356989722.88331.10134203618475749179@swboyd.mtv.corp.google.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.1 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org Hi Stephen, +Maxime Stephen Boyd wrote on Fri, 30 Nov 2018 01:24:57 -0800: > Quoting Miquel Raynal (2018-11-22 13:22:10) > > Hello, > > > > While working on suspend to RAM feature, I ran into troubles multiple > > times when clocks where not suspending/resuming at the desired time. I > > had a look at the core and I think the same logic as in the > > regulator's core may be applied here to (very easily) fix this issue: > > using device links. > > Thanks! I've wanted to add device links to the clk framework for a while > now but haven't gotten around to it. Can you expand on the scenario that > you've run into where you need this? Well, it happened that when working on suspend support on an ESPRESSObin, the peripheral clock driver (armada_37xx_periph.c) was not suspended after/resumed before all the drivers depending on it. > > > > > The only additional change I had to do was to always (when available) > > populate the device entry of the core clock structure so that it could > > be used later. This is the purpose of patch 1. Patch 2 actually adds > > support for device links. > > That's fine. We should do it into clk_core all the time for other > reasons too. > > > > > As I am not used to hack into the clock subsystem I might have missed > > something big preventing such change but so far I could not see > > anything wrong with it. As this touches core code, I am of course > > entirely open to suggestions. > > > > Two questions: > > 1) Do device links work if we make a loop between devices? I'm thinking > of the case where we have two clock controllers that provide clks to > each other and could potentially register some clks and then clk_get() > the ones they depend on. I suspect loops don't work and so we need to > be aware of this and somehow prevent it. For what I understand, when requesting the creation of a link there is a check with "device_is_dependent()" that prevents reverse dependencies, see [1]. Could you please share a situation where there is a loop between clocks or between a device and its clock source? I don't see any. [1] https://elixir.bootlin.com/linux/latest/source/drivers/base/core.c#L214 > > 2) Do we need to link clk consumers to anything besides the device > providing the clk they get from clk_get()? Put another way, do we need > to make links through the clk tree and any potential parent clks of > whatever the device is using at the time. Would clk tree changing > topology because some new parent is chosen need to affect > suspend/resume ordering? Or would that all need to be handled by clk > framework figuring out the ordering of the tree at suspend/resume time > and suspending clock controller drivers in the right order? > In the v2 (coming) I followed Maxime Ripard suggestion and what you describe above is handled automatically, let me explain the scenario. The order of probe has no importance because the framework already handles orphaned clocks so let's be simple and say there are two root clocks, not depending on anything, that are probed first: xtal0 and xtal1. None of these clocks have a parent, there is no device link in the game, yet. +----------------+ +----------------+ | | | | | | | | | xtal0 core | | xtal1 core | | | | | | | | | +-------^^-------+ +-------^^-------+ || || || || +----------------+ +----------------+ | | | | | xtal0 clk | | xtal1 clk | | | | | +----------------+ +----------------+ Then, a peripheral clock periph0 is probed. His parent is xtal1. The clock_register_*() call will run __clk_init_parent() and a link between periph0's core and xtal1's core will be created and stored in periph0's core->parent_clk_link entry. +----------------+ +----------------+ | | | | | | | | | xtal0 core | | xtal1 core | | | | | | | | | +-------^^-------+ +-------^^-------+ || || || || +----------------+ +----------------+ | | | | | xtal0 clk | | xtal1 clk | | | | | +----------------+ +-------^--------+ | | +--------------+ | ->parent_clk_link | +----------------+ | | | | | periph0 core | | | | | +-------^^-------+ || || +----------------+ | | | periph0 clk 0 | | | +----------------+ Then, device0 is probed and "get" the periph0 clock. clk_get() will be called and a struct clk will be instantiated for device0 (called in the figure clk 1). A link between device0 and the new clk 1 instance of periph0 will be created and stored in the clk->consumer_link entry. +----------------+ +----------------+ | | | | | | | | | xtal0 core | | xtal1 core | | | | | | | | | +-------^^-------+ +-------^^-------+ || || || || +----------------+ +----------------+ | | | | | xtal0 clk | | xtal1 clk | | | | | +----------------+ +-------^--------+ | | +--------------+ | ->parent_clk_link | +----------------+ | | | | | periph0 core | | <-------------+ | <-------------| +-------^^-------+ || || || || || +----------------+ +----------------+ | | | | | periph0 clk 0 | | periph0 clk 1 | | | | | +----------------+ +----------------+ | | ->consumer_link | | | +-------v--------+ | device0 | +----------------+ Right now, device0 is linked to periph0, itself linked to xtal1 so everything is fine. Now let's get some fun: the new parent of periph0 is xtal1. The process will call clk_reparent(), periph0's core->parent_clk_link will be destroyed and a new link to xtal1 will be setup and stored. The situation is now that device0 is linked to periph0 and periph0 is linked to xtal1, so the dependency between device0 and xtal1 is still clear. +----------------+ +----------------+ | | | | | | | | | xtal0 core | | xtal1 core | | | | | | | | | +-------^^-------+ +-------^^-------+ || || || || +----------------+ +----------------+ | | | | | xtal0 clk | | xtal1 clk | | | | | +-------^--------+ +----------------+ | | \ / +----------------------------x ->parent_clk_link | / \ | +----------------+ | | | | | periph0 core | | <-------------+ | <-------------| +-------^^-------+ || || || || || +----------------+ +----------------+ | | | | | periph0 clk 0 | | periph0 clk 1 | | | | | +----------------+ +----------------+ | | ->consumer_link | | | +-------v--------+ | device0 | +----------------+ I assume periph0 cannot be removed while there are devices using it, same for xtal0. What can happen is that device0 'put' the clock periph0. The relevant link is deleted and the clk instance dropped. +----------------+ +----------------+ | | | | | | | | | xtal0 core | | xtal1 core | | | | | | | | | +-------^^-------+ +-------^^-------+ || || || || +----------------+ +----------------+ | | | | | xtal0 clk | | xtal1 clk | | | | | +-------^--------+ +----------------+ | | \ / +----------------------------x ->parent_clk_link | / \ | +----------------+ | | | | | periph0 core | | | | | +-------^^-------+ || || +----------------+ | | | periph0 clk 0 | | | +----------------+ Now we can unregister periph0: link with the parent will be destroyed and the clock may be safely removed. +----------------+ +----------------+ | | | | | | | | | xtal0 core | | xtal1 core | | | | | | | | | +-------^^-------+ +-------^^-------+ || || || || +----------------+ +----------------+ | | | | | xtal0 clk | | xtal1 clk | | | | | +----------------+ +----------------+ This is my understanding of the common clock framework and how links can be added to it. I hope this was clear enough :) Thanks, Miquèl 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=-2.5 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,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 88097C04EB8 for ; Fri, 30 Nov 2018 12:01:11 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 56AAB20868 for ; Fri, 30 Nov 2018 12:01:11 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="NYDN6F0/" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 56AAB20868 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject: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=9JVwN5lF/9oJz9uyOnK+ddI1fPd8EvWFAA3AgDrfDrQ=; b=NYDN6F0/wq+vji rt5MX6KUhLrFzY7UEEFlFj3qCfy5gqEim7GPWwhuWRGebC9JtAIV0u+GAT2P+orGrAcxmqOdGVJir iydik1RcKEmC5CeN36w1r4Gg7/vt6NmJGEmcv7zeEftoT83Nv0+hL/kS6Xsw0f09obGMTmGaLkxgD XwUS8NXxt+/ZSJKNmua+S5/m2bV+9rZ5BmwsWLlwoaG+THa2WaUEDoURxqlsKyBujOaZMTcJivCeC KfF8V57rbxGjBTUKESVw0fYuNsjC8qMPOA4/eZAtpoGV9S7aD42spl47CiUzg1zFz7e6Suwyi+txW JG7yKIM5fvBGk5r3H3RA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gShTq-0004ZH-1v; Fri, 30 Nov 2018 12:01:10 +0000 Received: from mail.bootlin.com ([62.4.15.54]) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gShTl-0004Y4-NE for linux-arm-kernel@lists.infradead.org; Fri, 30 Nov 2018 12:01:07 +0000 Received: by mail.bootlin.com (Postfix, from userid 110) id 6012C207BC; Fri, 30 Nov 2018 13:00:54 +0100 (CET) Received: from xps13 (aaubervilliers-681-1-63-158.w90-88.abo.wanadoo.fr [90.88.18.158]) by mail.bootlin.com (Postfix) with ESMTPSA id 0706E2037D; Fri, 30 Nov 2018 13:00:54 +0100 (CET) Date: Fri, 30 Nov 2018 13:00:53 +0100 From: Miquel Raynal To: Stephen Boyd Subject: Re: [PATCH 0/2] Link consumer with clock driver Message-ID: <20181130130053.4f944b3b@xps13> In-Reply-To: <154356989722.88331.10134203618475749179@swboyd.mtv.corp.google.com> References: <20181122212212.16039-1-miquel.raynal@bootlin.com> <154356989722.88331.10134203618475749179@swboyd.mtv.corp.google.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.1 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20181130_040106_035225_A45E5E10 X-CRM114-Status: GOOD ( 31.01 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gregory Clement , Antoine Tenart , Michael Turquette , linux-kernel@vger.kernel.org, Russell King , Nadav Haklai , Thomas Petazzoni , Maxime Ripard , Maxime Chevallier , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgU3RlcGhlbiwKCitNYXhpbWUKClN0ZXBoZW4gQm95ZCA8c2JveWRAa2VybmVsLm9yZz4gd3Jv dGUgb24gRnJpLCAzMCBOb3YgMjAxOCAwMToyNDo1NwotMDgwMDoKCj4gUXVvdGluZyBNaXF1ZWwg UmF5bmFsICgyMDE4LTExLTIyIDEzOjIyOjEwKQo+ID4gSGVsbG8sCj4gPiAKPiA+IFdoaWxlIHdv cmtpbmcgb24gc3VzcGVuZCB0byBSQU0gZmVhdHVyZSwgSSByYW4gaW50byB0cm91YmxlcyBtdWx0 aXBsZQo+ID4gdGltZXMgd2hlbiBjbG9ja3Mgd2hlcmUgbm90IHN1c3BlbmRpbmcvcmVzdW1pbmcg YXQgdGhlIGRlc2lyZWQgdGltZS4gSQo+ID4gaGFkIGEgbG9vayBhdCB0aGUgY29yZSBhbmQgSSB0 aGluayB0aGUgc2FtZSBsb2dpYyBhcyBpbiB0aGUKPiA+IHJlZ3VsYXRvcidzIGNvcmUgbWF5IGJl IGFwcGxpZWQgaGVyZSB0byAodmVyeSBlYXNpbHkpIGZpeCB0aGlzIGlzc3VlOgo+ID4gdXNpbmcg ZGV2aWNlIGxpbmtzLiAgCj4gCj4gVGhhbmtzISBJJ3ZlIHdhbnRlZCB0byBhZGQgZGV2aWNlIGxp bmtzIHRvIHRoZSBjbGsgZnJhbWV3b3JrIGZvciBhIHdoaWxlCj4gbm93IGJ1dCBoYXZlbid0IGdv dHRlbiBhcm91bmQgdG8gaXQuIENhbiB5b3UgZXhwYW5kIG9uIHRoZSBzY2VuYXJpbyB0aGF0Cj4g eW91J3ZlIHJ1biBpbnRvIHdoZXJlIHlvdSBuZWVkIHRoaXM/CgpXZWxsLCBpdCBoYXBwZW5lZCB0 aGF0IHdoZW4gd29ya2luZyBvbiBzdXNwZW5kIHN1cHBvcnQgb24gYW4KRVNQUkVTU09iaW4sIHRo ZSBwZXJpcGhlcmFsIGNsb2NrIGRyaXZlciAoYXJtYWRhXzM3eHhfcGVyaXBoLmMpIHdhcyBub3QK c3VzcGVuZGVkIGFmdGVyL3Jlc3VtZWQgYmVmb3JlIGFsbCB0aGUgZHJpdmVycyBkZXBlbmRpbmcg b24gaXQuCgo+IAo+ID4gCj4gPiBUaGUgb25seSBhZGRpdGlvbmFsIGNoYW5nZSBJIGhhZCB0byBk byB3YXMgdG8gYWx3YXlzICh3aGVuIGF2YWlsYWJsZSkKPiA+IHBvcHVsYXRlIHRoZSBkZXZpY2Ug ZW50cnkgb2YgdGhlIGNvcmUgY2xvY2sgc3RydWN0dXJlIHNvIHRoYXQgaXQgY291bGQKPiA+IGJl IHVzZWQgbGF0ZXIuIFRoaXMgaXMgdGhlIHB1cnBvc2Ugb2YgcGF0Y2ggMS4gUGF0Y2ggMiBhY3R1 YWxseSBhZGRzCj4gPiBzdXBwb3J0IGZvciBkZXZpY2UgbGlua3MuICAKPiAKPiBUaGF0J3MgZmlu ZS4gV2Ugc2hvdWxkIGRvIGl0IGludG8gY2xrX2NvcmUgYWxsIHRoZSB0aW1lIGZvciBvdGhlcgo+ IHJlYXNvbnMgdG9vLgo+IAo+ID4gCj4gPiBBcyBJIGFtIG5vdCB1c2VkIHRvIGhhY2sgaW50byB0 aGUgY2xvY2sgc3Vic3lzdGVtIEkgbWlnaHQgaGF2ZSBtaXNzZWQKPiA+IHNvbWV0aGluZyBiaWcg cHJldmVudGluZyBzdWNoIGNoYW5nZSBidXQgc28gZmFyIEkgY291bGQgbm90IHNlZQo+ID4gYW55 dGhpbmcgd3Jvbmcgd2l0aCBpdC4gQXMgdGhpcyB0b3VjaGVzIGNvcmUgY29kZSwgSSBhbSBvZiBj b3Vyc2UKPiA+IGVudGlyZWx5IG9wZW4gdG8gc3VnZ2VzdGlvbnMuCj4gPiAgIAo+IAo+IFR3byBx dWVzdGlvbnM6Cj4gCj4gIDEpIERvIGRldmljZSBsaW5rcyB3b3JrIGlmIHdlIG1ha2UgYSBsb29w IGJldHdlZW4gZGV2aWNlcz8gSSdtIHRoaW5raW5nCj4gIG9mIHRoZSBjYXNlIHdoZXJlIHdlIGhh dmUgdHdvIGNsb2NrIGNvbnRyb2xsZXJzIHRoYXQgcHJvdmlkZSBjbGtzIHRvCj4gIGVhY2ggb3Ro ZXIgYW5kIGNvdWxkIHBvdGVudGlhbGx5IHJlZ2lzdGVyIHNvbWUgY2xrcyBhbmQgdGhlbiBjbGtf Z2V0KCkKPiAgdGhlIG9uZXMgdGhleSBkZXBlbmQgb24uIEkgc3VzcGVjdCBsb29wcyBkb24ndCB3 b3JrIGFuZCBzbyB3ZSBuZWVkIHRvCj4gIGJlIGF3YXJlIG9mIHRoaXMgYW5kIHNvbWVob3cgcHJl dmVudCBpdC4KCkZvciB3aGF0IEkgdW5kZXJzdGFuZCwgd2hlbiByZXF1ZXN0aW5nIHRoZSBjcmVh dGlvbiBvZiBhIGxpbmsgdGhlcmUgaXMKYSBjaGVjayB3aXRoICJkZXZpY2VfaXNfZGVwZW5kZW50 KCkiIHRoYXQgcHJldmVudHMgcmV2ZXJzZQpkZXBlbmRlbmNpZXMsIHNlZSBbMV0uCgpDb3VsZCB5 b3UgcGxlYXNlIHNoYXJlIGEgc2l0dWF0aW9uIHdoZXJlIHRoZXJlIGlzIGEgbG9vcCBiZXR3ZWVu IGNsb2NrcwpvciBiZXR3ZWVuIGEgZGV2aWNlIGFuZCBpdHMgY2xvY2sgc291cmNlPyBJIGRvbid0 IHNlZSBhbnkuCgpbMV0gaHR0cHM6Ly9lbGl4aXIuYm9vdGxpbi5jb20vbGludXgvbGF0ZXN0L3Nv dXJjZS9kcml2ZXJzL2Jhc2UvY29yZS5jI0wyMTQKCj4gCj4gIDIpIERvIHdlIG5lZWQgdG8gbGlu ayBjbGsgY29uc3VtZXJzIHRvIGFueXRoaW5nIGJlc2lkZXMgdGhlIGRldmljZQo+ICBwcm92aWRp bmcgdGhlIGNsayB0aGV5IGdldCBmcm9tIGNsa19nZXQoKT8gUHV0IGFub3RoZXIgd2F5LCBkbyB3 ZSBuZWVkCj4gIHRvIG1ha2UgbGlua3MgdGhyb3VnaCB0aGUgY2xrIHRyZWUgYW5kIGFueSBwb3Rl bnRpYWwgcGFyZW50IGNsa3Mgb2YKPiAgd2hhdGV2ZXIgdGhlIGRldmljZSBpcyB1c2luZyBhdCB0 aGUgdGltZS4gV291bGQgY2xrIHRyZWUgY2hhbmdpbmcKPiAgdG9wb2xvZ3kgYmVjYXVzZSBzb21l IG5ldyBwYXJlbnQgaXMgY2hvc2VuIG5lZWQgdG8gYWZmZWN0Cj4gIHN1c3BlbmQvcmVzdW1lIG9y ZGVyaW5nPyBPciB3b3VsZCB0aGF0IGFsbCBuZWVkIHRvIGJlIGhhbmRsZWQgYnkgY2xrCj4gIGZy YW1ld29yayBmaWd1cmluZyBvdXQgdGhlIG9yZGVyaW5nIG9mIHRoZSB0cmVlIGF0IHN1c3BlbmQv cmVzdW1lIHRpbWUKPiAgYW5kIHN1c3BlbmRpbmcgY2xvY2sgY29udHJvbGxlciBkcml2ZXJzIGlu IHRoZSByaWdodCBvcmRlcj8KPiAKCkluIHRoZSB2MiAoY29taW5nKSBJIGZvbGxvd2VkIE1heGlt ZSBSaXBhcmQgc3VnZ2VzdGlvbiBhbmQgd2hhdCB5b3UKZGVzY3JpYmUgYWJvdmUgaXMgaGFuZGxl ZCBhdXRvbWF0aWNhbGx5LCBsZXQgbWUgZXhwbGFpbiB0aGUgc2NlbmFyaW8uCgoKVGhlIG9yZGVy IG9mIHByb2JlIGhhcyBubyBpbXBvcnRhbmNlIGJlY2F1c2UgdGhlIGZyYW1ld29yayBhbHJlYWR5 CmhhbmRsZXMgb3JwaGFuZWQgY2xvY2tzIHNvIGxldCdzIGJlIHNpbXBsZSBhbmQgc2F5IHRoZXJl IGFyZSB0d28gcm9vdApjbG9ja3MsIG5vdCBkZXBlbmRpbmcgb24gYW55dGhpbmcsIHRoYXQgYXJl IHByb2JlZCBmaXJzdDogeHRhbDAgYW5kCnh0YWwxLiBOb25lIG9mIHRoZXNlIGNsb2NrcyBoYXZl IGEgcGFyZW50LCB0aGVyZSBpcyBubyBkZXZpY2UgbGluayBpbgp0aGUgZ2FtZSwgeWV0LgoKICAg Ky0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgICAg ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAogICB8ICAgICAgICAg ICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKICAgfCAgIHh0YWwwIGNvcmUg ICB8ICAgICAgICAgICAgfCAgIHh0YWwxIGNvcmUgICB8CiAgIHwgICAgICAgICAgICAgICAgfCAg ICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAogICB8ICAgICAgICAgICAgICAgIHwgICAgICAg ICAgICB8ICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS1eXi0tLS0tLS0rICAgICAgICAgICAg Ky0tLS0tLS1eXi0tLS0tLS0rCiAgICAgICAgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfHwKICAgICAgICAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAogICArLS0t LS0tLS0tLS0tLS0tLSsgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsKICAgfCAgICAgICAg ICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CiAgIHwgICB4dGFsMCBjbGsg ICAgfCAgICAgICAgICAgIHwgICB4dGFsMSBjbGsgICAgfAogICB8ICAgICAgICAgICAgICAgIHwg ICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tLS0tLS0rICAgICAg ICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCiAKVGhlbiwgYSBwZXJpcGhlcmFsIGNsb2NrIHBlcmlw aDAgaXMgcHJvYmVkLiBIaXMgcGFyZW50IGlzIHh0YWwxLiBUaGUKY2xvY2tfcmVnaXN0ZXJfKigp IGNhbGwgd2lsbCBydW4gX19jbGtfaW5pdF9wYXJlbnQoKSBhbmQgYSBsaW5rIGJldHdlZW4KcGVy aXBoMCdzIGNvcmUgYW5kIHh0YWwxJ3MgY29yZSB3aWxsIGJlIGNyZWF0ZWQgYW5kIHN0b3JlZCBp bgpwZXJpcGgwJ3MgY29yZS0+cGFyZW50X2Nsa19saW5rIGVudHJ5LgoKICAgKy0tLS0tLS0tLS0t LS0tLS0rICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgICAgICAgICAgICAgICAg fCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAogICB8ICAgICAgICAgICAgICAgIHwgICAg ICAgICAgICB8ICAgICAgICAgICAgICAgIHwKICAgfCAgIHh0YWwwIGNvcmUgICB8ICAgICAgICAg ICAgfCAgIHh0YWwxIGNvcmUgICB8CiAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwg ICAgICAgICAgICAgICAgfAogICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAg ICAgICAgICAgIHwKICAgKy0tLS0tLS1eXi0tLS0tLS0rICAgICAgICAgICAgKy0tLS0tLS1eXi0t LS0tLS0rCiAgICAgICAgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKICAgICAg ICAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAogICArLS0tLS0tLS0tLS0tLS0t LSsgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsKICAgfCAgICAgICAgICAgICAgICB8ICAg ICAgICAgICAgfCAgICAgICAgICAgICAgICB8CiAgIHwgICB4dGFsMCBjbGsgICAgfCAgICAgICAg ICAgIHwgICB4dGFsMSBjbGsgICAgfAogICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8 ICAgICAgICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgKy0tLS0t LS1eLS0tLS0tLS0rCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAg ICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0rCiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg IC0+cGFyZW50X2Nsa19saW5rCiAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAg ICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsKICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAg ICAgICB8CiAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAg ICAgICB8ICBwZXJpcGgwIGNvcmUgIHwKICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAg ICB8CiAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAg ICArLS0tLS0tLV5eLS0tLS0tLSsKICAgICAgICAgICAgICAgICAgICAgICAgICB8fAogICAgICAg ICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0t KwogICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAg fCAgcGVyaXBoMCBjbGsgMCB8CiAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAog ICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsKClRoZW4sIGRldmljZTAgaXMgcHJv YmVkIGFuZCAiZ2V0IiB0aGUgcGVyaXBoMCBjbG9jay4gY2xrX2dldCgpIHdpbGwgYmUKY2FsbGVk IGFuZCBhIHN0cnVjdCBjbGsgd2lsbCBiZSBpbnN0YW50aWF0ZWQgZm9yIGRldmljZTAgKGNhbGxl ZCBpbgp0aGUgZmlndXJlIGNsayAxKS4gQSBsaW5rIGJldHdlZW4gZGV2aWNlMCBhbmQgdGhlIG5l dyBjbGsgMSBpbnN0YW5jZSBvZgpwZXJpcGgwIHdpbGwgYmUgY3JlYXRlZCBhbmQgc3RvcmVkIGlu IHRoZSBjbGstPmNvbnN1bWVyX2xpbmsgZW50cnkuCgogICArLS0tLS0tLS0tLS0tLS0tLSsgICAg ICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsKICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAg ICAgfCAgICAgICAgICAgICAgICB8CiAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwg ICAgICAgICAgICAgICAgfAogICB8ICAgeHRhbDAgY29yZSAgIHwgICAgICAgICAgICB8ICAgeHRh bDEgY29yZSAgIHwKICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAg ICAgICB8CiAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAg fAogICArLS0tLS0tLV5eLS0tLS0tLSsgICAgICAgICAgICArLS0tLS0tLV5eLS0tLS0tLSsKICAg ICAgICAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgIHx8ICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHx8CiAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICAg ICAgICstLS0tLS0tLS0tLS0tLS0tKwogICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8 ICAgICAgICAgICAgICAgIHwKICAgfCAgIHh0YWwwIGNsayAgICB8ICAgICAgICAgICAgfCAgIHh0 YWwxIGNsayAgICB8CiAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAg ICAgICAgfAogICArLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICArLS0tLS0tLV4tLS0tLS0t LSsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAg ICstLS0tLS0tLS0tLS0tLSsKICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgLT5wYXJlbnRf Y2xrX2xpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICst LS0tLS0tLS0tLS0tLS0tKwogICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKICAg ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgIHwgIHBl cmlwaDAgY29yZSAgfAogICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIDwtLS0tLS0t LS0tLS0tKwogICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIDwtLS0tLS0tLS0tLS0t fAogICAgICAgICAgICAgICAgICArLS0tLS0tLV5eLS0tLS0tLSsgICAgICAgICAgICB8fAogICAg ICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAg ICAgICAgICAgICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgICAgICAg ICArLS0tLS0tLS0tLS0tLS0tLSsgICAgKy0tLS0tLS0tLS0tLS0tLS0rCiAgICAgICAgICAgICAg ICAgIHwgICAgICAgICAgICAgICAgfCAgICB8ICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAg ICAgICAgfCAgcGVyaXBoMCBjbGsgMCB8ICAgIHwgIHBlcmlwaDAgY2xrIDEgfAogICAgICAgICAg ICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgfCAgICAgICAgICAgICAgICB8CiAgICAgICAg ICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tLS0tLS0tLSsKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0+Y29uc3VtZXJfbGluawogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKy0tLS0tLS12LS0tLS0tLS0rCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8ICAgIGRldmljZTAgICAgIHwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwoKUmlnaHQgbm93LCBkZXZpY2Uw IGlzIGxpbmtlZCB0byBwZXJpcGgwLCBpdHNlbGYgbGlua2VkIHRvIHh0YWwxIHNvCmV2ZXJ5dGhp bmcgaXMgZmluZS4KCk5vdyBsZXQncyBnZXQgc29tZSBmdW46IHRoZSBuZXcgcGFyZW50IG9mIHBl cmlwaDAgaXMgeHRhbDEuIFRoZSBwcm9jZXNzCndpbGwgY2FsbCBjbGtfcmVwYXJlbnQoKSwgcGVy aXBoMCdzIGNvcmUtPnBhcmVudF9jbGtfbGluayB3aWxsIGJlCmRlc3Ryb3llZCBhbmQgYSBuZXcg bGluayB0byB4dGFsMSB3aWxsIGJlIHNldHVwIGFuZCBzdG9yZWQuIFRoZQpzaXR1YXRpb24gaXMg bm93IHRoYXQgZGV2aWNlMCBpcyBsaW5rZWQgdG8gcGVyaXBoMCBhbmQgcGVyaXBoMCBpcwpsaW5r ZWQgdG8geHRhbDEsIHNvIHRoZSBkZXBlbmRlbmN5IGJldHdlZW4gZGV2aWNlMCBhbmQgeHRhbDEg aXMgc3RpbGwKY2xlYXIuCgogICArLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICArLS0tLS0t LS0tLS0tLS0tLSsKICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAg ICAgICB8CiAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAg fAogICB8ICAgeHRhbDAgY29yZSAgIHwgICAgICAgICAgICB8ICAgeHRhbDEgY29yZSAgIHwKICAg fCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CiAgIHwgICAg ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAogICArLS0tLS0tLV5e LS0tLS0tLSsgICAgICAgICAgICArLS0tLS0tLV5eLS0tLS0tLSsKICAgICAgICAgICB8fCAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgIHx8ICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHx8CiAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tLS0t LS0tLS0tKwogICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAg IHwKICAgfCAgIHh0YWwwIGNsayAgICB8ICAgICAgICAgICAgfCAgIHh0YWwxIGNsayAgICB8CiAg IHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAogICArLS0t LS0tLV4tLS0tLS0tLSsgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsKICAgICAgICAgICB8 CiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgLwogICAgICAgICAgICst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0teAogICAgICAtPnBhcmVudF9jbGtfbGluayAgIHwg ICAgICAgICAgICAvIFwKICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAg ICAgICstLS0tLS0tLS0tLS0tLS0tKwogICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAg IHwKICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAg IHwgIHBlcmlwaDAgY29yZSAgfAogICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIDwt LS0tLS0tLS0tLS0tKwogICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIDwtLS0tLS0t LS0tLS0tfAogICAgICAgICAgICAgICAgICArLS0tLS0tLV5eLS0tLS0tLSsgICAgICAgICAgICB8 fAogICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICB8fAogICAg ICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAg ICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsgICAgKy0tLS0tLS0tLS0tLS0tLS0rCiAgICAgICAg ICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICB8ICAgICAgICAgICAgICAgIHwKICAgICAg ICAgICAgICAgICAgfCAgcGVyaXBoMCBjbGsgMCB8ICAgIHwgIHBlcmlwaDAgY2xrIDEgfAogICAg ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgfCAgICAgICAgICAgICAgICB8CiAg ICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tLS0tLS0tLSsK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0+Y29uc3VtZXJfbGlu awogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS12LS0tLS0tLS0rCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8ICAgIGRldmljZTAgICAgIHwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwoKSSBhc3N1bWUgcGVy aXBoMCBjYW5ub3QgYmUgcmVtb3ZlZCB3aGlsZSB0aGVyZSBhcmUgZGV2aWNlcyB1c2luZyBpdCwK c2FtZSBmb3IgeHRhbDAuCgpXaGF0IGNhbiBoYXBwZW4gaXMgdGhhdCBkZXZpY2UwICdwdXQnIHRo ZSBjbG9jayBwZXJpcGgwLiBUaGUgcmVsZXZhbnQKbGluayBpcyBkZWxldGVkIGFuZCB0aGUgY2xr IGluc3RhbmNlIGRyb3BwZWQuCgogICArLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICArLS0t LS0tLS0tLS0tLS0tLSsKICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAg ICAgICAgICB8CiAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAg ICAgfAogICB8ICAgeHRhbDAgY29yZSAgIHwgICAgICAgICAgICB8ICAgeHRhbDEgY29yZSAgIHwK ICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CiAgIHwg ICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAogICArLS0tLS0t LV5eLS0tLS0tLSsgICAgICAgICAgICArLS0tLS0tLV5eLS0tLS0tLSsKICAgICAgICAgICB8fCAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgIHx8ICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHx8CiAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0t LS0tLS0tLS0tKwogICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAg ICAgIHwKICAgfCAgIHh0YWwwIGNsayAgICB8ICAgICAgICAgICAgfCAgIHh0YWwxIGNsayAgICB8 CiAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAogICAr LS0tLS0tLV4tLS0tLS0tLSsgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsKICAgICAgICAg ICB8CiAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgLwogICAgICAgICAg ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0teAogICAgICAtPnBhcmVudF9jbGtfbGluayAg IHwgICAgICAgICAgICAvIFwKICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAg ICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwogICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAg ICAgIHwKICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAg ICAgIHwgIHBlcmlwaDAgY29yZSAgfAogICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAg IHwKICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAg ICstLS0tLS0tXl4tLS0tLS0tKwogICAgICAgICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAg ICAgICAgICAgICAgICAgICAgfHwKICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0r CiAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICB8 ICBwZXJpcGgwIGNsayAwIHwKICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8CiAg ICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwoKTm93IHdlIGNhbiB1bnJlZ2lzdGVy IHBlcmlwaDA6IGxpbmsgd2l0aCB0aGUgcGFyZW50IHdpbGwgYmUgZGVzdHJveWVkCmFuZCB0aGUg Y2xvY2sgbWF5IGJlIHNhZmVseSByZW1vdmVkLiAKCiAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAg ICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwogICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAg ICB8ICAgICAgICAgICAgICAgIHwKICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAg ICAgICAgICAgICAgICB8CiAgIHwgICB4dGFsMCBjb3JlICAgfCAgICAgICAgICAgIHwgICB4dGFs MSBjb3JlICAgfAogICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAg ICAgIHwKICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8 CiAgICstLS0tLS0tXl4tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tXl4tLS0tLS0tKwogICAg ICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgfHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfHwKICAgKy0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAg ICAgKy0tLS0tLS0tLS0tLS0tLS0rCiAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwg ICAgICAgICAgICAgICAgfAogICB8ICAgeHRhbDAgY2xrICAgIHwgICAgICAgICAgICB8ICAgeHRh bDEgY2xrICAgIHwKICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAg ICAgICB8CiAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0t KwoKClRoaXMgaXMgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgY29tbW9uIGNsb2NrIGZyYW1ld29y ayBhbmQgaG93IGxpbmtzCmNhbiBiZSBhZGRlZCB0byBpdC4gSSBob3BlIHRoaXMgd2FzIGNsZWFy IGVub3VnaCA6KQoKClRoYW5rcywKTWlxdcOobAoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgt YXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3Jn L21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=