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=-17.4 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable 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 5C847C433E6 for ; Fri, 12 Feb 2021 08:10:07 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1B1F164E6C for ; Fri, 12 Feb 2021 08:10:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229935AbhBLIJw (ORCPT ); Fri, 12 Feb 2021 03:09:52 -0500 Received: from mx08-00178001.pphosted.com ([91.207.212.93]:60942 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S229598AbhBLIJt (ORCPT ); Fri, 12 Feb 2021 03:09:49 -0500 Received: from pps.filterd (m0046661.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 11C86l2M029175; Fri, 12 Feb 2021 09:08:42 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=subject : to : cc : references : from : message-id : date : mime-version : in-reply-to : content-type : content-transfer-encoding; s=selector1; bh=DHLRE2UmB8C4wlDYI8k7uWIN7I9RjaZ2KYe3yihptMU=; b=SgPTIN9lqgwaVVpkZ+RZC5gItARGIhGqsdMWlXL1ng4qFgK0ZH84btADnmv2q3JCF1Kz Dmm8a8gSrwSDMO0D/E6d5q5JaEgv4K3d87myhQStAeUWyuC7qJOksxTAQBeSwdOWURPx ADunrwMYfVxgYkq92XrWDWIargGuzOOt21Smh5SMBGs+RR4AUNP8Ppm3HJlgp8Wl1L3L qpyzqABA08S0MaSiIztNlXwubfAVtZjlMe/h6QK33DVRHc1uo3jFzQ+SGyQzc+mgnteI Qp8BlbUt3PgDCwhlMPga9upVHJ81MNFkgF1QFs9PlyRuIRW2bpgZ5t0JkMJYhHd8OGUg jg== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 36hravbcje-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 12 Feb 2021 09:08:42 +0100 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id DCD72100034; Fri, 12 Feb 2021 09:08:41 +0100 (CET) Received: from Webmail-eu.st.com (gpxdag2node6.st.com [10.75.127.70]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id B967B219D40; Fri, 12 Feb 2021 09:08:41 +0100 (CET) Received: from lmecxl0572.lme.st.com (10.75.127.121) by GPXDAG2NODE6.st.com (10.75.127.70) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Fri, 12 Feb 2021 09:08:40 +0100 Subject: Re: [PATCH v2 02/14] clk: stm32mp1: merge 'ck_hse_rtc' and 'ck_rtc' into one clock To: Stephen Boyd , Alexandre Torgue , Etienne Carriere , "Maxime Coquelin" , Michael Turquette , Philipp Zabel , "Rob Herring" , CC: , , , , References: <20210126090120.19900-1-gabriel.fernandez@foss.st.com> <20210126090120.19900-3-gabriel.fernandez@foss.st.com> <161285764074.418021.15522379930579131077@swboyd.mtv.corp.google.com> From: "gabriel.fernandez@foss.st.com" Message-ID: <5cc12945-0347-820c-1125-30ab4a947a00@foss.st.com> Date: Fri, 12 Feb 2021 09:08:40 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <161285764074.418021.15522379930579131077@swboyd.mtv.corp.google.com> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-Originating-IP: [10.75.127.121] X-ClientProxiedBy: GPXDAG1NODE5.st.com (10.75.127.66) To GPXDAG2NODE6.st.com (10.75.127.70) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.369,18.0.737 definitions=2021-02-12_02:2021-02-12,2021-02-12 signatures=0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2/9/21 9:00 AM, Stephen Boyd wrote: > Quoting gabriel.fernandez@foss.st.com (2021-01-26 01:01:08) >> From: Gabriel Fernandez >> >> 'ck_rtc' has multiple clocks as input (ck_hsi, ck_lsi, and ck_hse). >> A divider is available only on the specific rtc input for ck_hse. >> This Merge will facilitate to have a more coherent clock tree >> in no trusted / trusted world. >> >> Signed-off-by: Gabriel Fernandez >> --- >> drivers/clk/clk-stm32mp1.c | 49 +++++++++++++++++++++++++++++++++----- >> 1 file changed, 43 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/clk/clk-stm32mp1.c b/drivers/clk/clk-stm32mp1.c >> index 35d5aee8f9b0..0e1d4427a8df 100644 >> --- a/drivers/clk/clk-stm32mp1.c >> +++ b/drivers/clk/clk-stm32mp1.c >> @@ -245,7 +245,7 @@ static const char * const dsi_src[] = { >> }; >> >> static const char * const rtc_src[] = { >> - "off", "ck_lse", "ck_lsi", "ck_hse_rtc" >> + "off", "ck_lse", "ck_lsi", "ck_hse" >> }; >> >> static const char * const mco1_src[] = { >> @@ -1031,6 +1031,42 @@ static struct clk_hw *clk_register_cktim(struct device *dev, const char *name, >> return hw; >> } >> >> +/* The divider of RTC clock concerns only ck_hse clock */ >> +#define HSE_RTC 3 >> + >> +static unsigned long clk_divider_rtc_recalc_rate(struct clk_hw *hw, >> + unsigned long parent_rate) >> +{ >> + if (clk_hw_get_parent(hw) == clk_hw_get_parent_by_index(hw, HSE_RTC)) >> + return clk_divider_ops.recalc_rate(hw, parent_rate); >> + >> + return parent_rate; >> +} >> + >> +static long clk_divider_rtc_round_rate(struct clk_hw *hw, unsigned long rate, >> + unsigned long *prate) >> +{ >> + if (clk_hw_get_parent(hw) == clk_hw_get_parent_by_index(hw, HSE_RTC)) > This clk op can be called at basically any time. Maybe this should use > the determine rate op and then look to see what the parent is that comes > in via the rate request structure? Or is the intention to keep this > pinned to one particular parent? Looking at this right now it doesn't > really make much sense why the current parent state should play into > what rate the clk can round to, unless there is some more clk flags > going on that constrain the ability to change this clk's parent. Yes the intention is to keep this pinned for one particular parent. This divider is only applied on the 4th input of the MUX of the RTC and doesn't affect the HSE frequency for all the system. Oscillators  ----- | lse |----------------+----------------> ck_lse  -----                 |  -----                 | | lsi |------------+--------------------> ck_lsi  -----             |   |                    |   |  -----             |   | | hse |----+-------|---|----------------> ck_hse  -----     |       |   |            |       |   |         |\ mux            |       |   |  OFF -->| \            |       |   |         |  \     gate            |       |   --------->|  |     ---            |       |             |  |--->|   |--> ck_rtc            |       ------------->|  |     ---            |    -----------      |  |             ----| % 1 to 64 |--->| /                  -----------     |/                    divider I manage the RTC with a clock composite with a gate a mux and a specific rate ops for hse input. That why i need to the parent state. Best Regards Gabriel >> + return clk_divider_ops.round_rate(hw, rate, prate); >> + >> + return *prate; >> +} >> + >> +static int clk_divider_rtc_set_rate(struct clk_hw *hw, unsigned long rate, >> + unsigned long parent_rate) >> +{ >> + if (clk_hw_get_parent(hw) == clk_hw_get_parent_by_index(hw, HSE_RTC)) >> + return clk_divider_ops.set_rate(hw, rate, parent_rate); >> + >> + return parent_rate; >> +} >> + 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=-15.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 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 6915CC433E0 for ; Fri, 12 Feb 2021 08:10:41 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (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 11F3064E57 for ; Fri, 12 Feb 2021 08:10:41 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 11F3064E57 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=foss.st.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+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=merlin.20170209; h=Sender:Content-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=7QD6TAJhobOJdG3OPqEWCh04FdS7a73yQsCUlvvkRBY=; b=UzxrrloHH1ZKa16Nv420WPPYI Y5lT1qR8iTvtKo53gT6+zbOdHOl0yNrYJ584+5pdmMHIOQtyehJ4NpdSHPKVQkozhaBFmcsojdYbB Y4Nq5aVsbyRle4/p6lLogLEHRTTS6t+nJEkiv6XKuREmqg8BjaDVzGjFivALYWQJdD51/XG9wVaXD Pu8g7Hm5gswxDgDHgDRxEYScVoSh2Nxcz98v/WYbsHc12lwGm4YfN5RFZRUYhlWEDYt82Z0VbodK4 ddwtvX95knLX1pEgp08mL/kAImTd4fHeyZ8rGW3MlI9b25NKyFy6C7BWdkX7QMtAWs+r9VyuN4sT+ eh60uuTQw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1lATVZ-0002Re-VI; Fri, 12 Feb 2021 08:08:58 +0000 Received: from mx08-00178001.pphosted.com ([91.207.212.93] helo=mx07-00178001.pphosted.com) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1lATVW-0002QZ-2l for linux-arm-kernel@lists.infradead.org; Fri, 12 Feb 2021 08:08:55 +0000 Received: from pps.filterd (m0046661.ppops.net [127.0.0.1]) by mx07-00178001.pphosted.com (8.16.0.43/8.16.0.43) with SMTP id 11C86l2M029175; Fri, 12 Feb 2021 09:08:42 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foss.st.com; h=subject : to : cc : references : from : message-id : date : mime-version : in-reply-to : content-type : content-transfer-encoding; s=selector1; bh=DHLRE2UmB8C4wlDYI8k7uWIN7I9RjaZ2KYe3yihptMU=; b=SgPTIN9lqgwaVVpkZ+RZC5gItARGIhGqsdMWlXL1ng4qFgK0ZH84btADnmv2q3JCF1Kz Dmm8a8gSrwSDMO0D/E6d5q5JaEgv4K3d87myhQStAeUWyuC7qJOksxTAQBeSwdOWURPx ADunrwMYfVxgYkq92XrWDWIargGuzOOt21Smh5SMBGs+RR4AUNP8Ppm3HJlgp8Wl1L3L qpyzqABA08S0MaSiIztNlXwubfAVtZjlMe/h6QK33DVRHc1uo3jFzQ+SGyQzc+mgnteI Qp8BlbUt3PgDCwhlMPga9upVHJ81MNFkgF1QFs9PlyRuIRW2bpgZ5t0JkMJYhHd8OGUg jg== Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 36hravbcje-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 12 Feb 2021 09:08:42 +0100 Received: from euls16034.sgp.st.com (euls16034.sgp.st.com [10.75.44.20]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id DCD72100034; Fri, 12 Feb 2021 09:08:41 +0100 (CET) Received: from Webmail-eu.st.com (gpxdag2node6.st.com [10.75.127.70]) by euls16034.sgp.st.com (STMicroelectronics) with ESMTP id B967B219D40; Fri, 12 Feb 2021 09:08:41 +0100 (CET) Received: from lmecxl0572.lme.st.com (10.75.127.121) by GPXDAG2NODE6.st.com (10.75.127.70) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Fri, 12 Feb 2021 09:08:40 +0100 Subject: Re: [PATCH v2 02/14] clk: stm32mp1: merge 'ck_hse_rtc' and 'ck_rtc' into one clock To: Stephen Boyd , Alexandre Torgue , Etienne Carriere , "Maxime Coquelin" , Michael Turquette , Philipp Zabel , "Rob Herring" , References: <20210126090120.19900-1-gabriel.fernandez@foss.st.com> <20210126090120.19900-3-gabriel.fernandez@foss.st.com> <161285764074.418021.15522379930579131077@swboyd.mtv.corp.google.com> From: "gabriel.fernandez@foss.st.com" Message-ID: <5cc12945-0347-820c-1125-30ab4a947a00@foss.st.com> Date: Fri, 12 Feb 2021 09:08:40 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <161285764074.418021.15522379930579131077@swboyd.mtv.corp.google.com> Content-Language: en-US X-Originating-IP: [10.75.127.121] X-ClientProxiedBy: GPXDAG1NODE5.st.com (10.75.127.66) To GPXDAG2NODE6.st.com (10.75.127.70) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.369, 18.0.737 definitions=2021-02-12_02:2021-02-12, 2021-02-12 signatures=0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210212_030854_367719_667C514F X-CRM114-Status: GOOD ( 22.98 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-stm32@st-md-mailman.stormreply.com Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Ck9uIDIvOS8yMSA5OjAwIEFNLCBTdGVwaGVuIEJveWQgd3JvdGU6Cj4gUXVvdGluZyBnYWJyaWVs LmZlcm5hbmRlekBmb3NzLnN0LmNvbSAoMjAyMS0wMS0yNiAwMTowMTowOCkKPj4gRnJvbTogR2Fi cmllbCBGZXJuYW5kZXogPGdhYnJpZWwuZmVybmFuZGV6QGZvc3Muc3QuY29tPgo+Pgo+PiAnY2tf cnRjJyBoYXMgbXVsdGlwbGUgY2xvY2tzIGFzIGlucHV0IChja19oc2ksIGNrX2xzaSwgYW5kIGNr X2hzZSkuCj4+IEEgZGl2aWRlciBpcyBhdmFpbGFibGUgb25seSBvbiB0aGUgc3BlY2lmaWMgcnRj IGlucHV0IGZvciBja19oc2UuCj4+IFRoaXMgTWVyZ2Ugd2lsbCBmYWNpbGl0YXRlIHRvIGhhdmUg YSBtb3JlIGNvaGVyZW50IGNsb2NrIHRyZWUKPj4gaW4gbm8gdHJ1c3RlZCAvIHRydXN0ZWQgd29y bGQuCj4+Cj4+IFNpZ25lZC1vZmYtYnk6IEdhYnJpZWwgRmVybmFuZGV6IDxnYWJyaWVsLmZlcm5h bmRlekBmb3NzLnN0LmNvbT4KPj4gLS0tCj4+ICAgZHJpdmVycy9jbGsvY2xrLXN0bTMybXAxLmMg fCA0OSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLQo+PiAgIDEgZmlsZSBj aGFuZ2VkLCA0MyBpbnNlcnRpb25zKCspLCA2IGRlbGV0aW9ucygtKQo+Pgo+PiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9jbGsvY2xrLXN0bTMybXAxLmMgYi9kcml2ZXJzL2Nsay9jbGstc3RtMzJtcDEu Ywo+PiBpbmRleCAzNWQ1YWVlOGY5YjAuLjBlMWQ0NDI3YThkZiAxMDA2NDQKPj4gLS0tIGEvZHJp dmVycy9jbGsvY2xrLXN0bTMybXAxLmMKPj4gKysrIGIvZHJpdmVycy9jbGsvY2xrLXN0bTMybXAx LmMKPj4gQEAgLTI0NSw3ICsyNDUsNyBAQCBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRzaV9z cmNbXSA9IHsKPj4gICB9Owo+PiAgIAo+PiAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnRj X3NyY1tdID0gewo+PiAtICAgICAgICJvZmYiLCAiY2tfbHNlIiwgImNrX2xzaSIsICJja19oc2Vf cnRjIgo+PiArICAgICAgICJvZmYiLCAiY2tfbHNlIiwgImNrX2xzaSIsICJja19oc2UiCj4+ICAg fTsKPj4gICAKPj4gICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1jbzFfc3JjW10gPSB7Cj4+ IEBAIC0xMDMxLDYgKzEwMzEsNDIgQEAgc3RhdGljIHN0cnVjdCBjbGtfaHcgKmNsa19yZWdpc3Rl cl9ja3RpbShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCj4+ICAgICAgICAg IHJldHVybiBodzsKPj4gICB9Cj4+ICAgCj4+ICsvKiBUaGUgZGl2aWRlciBvZiBSVEMgY2xvY2sg Y29uY2VybnMgb25seSBja19oc2UgY2xvY2sgKi8KPj4gKyNkZWZpbmUgSFNFX1JUQyAzCj4+ICsK Pj4gK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsa19kaXZpZGVyX3J0Y19yZWNhbGNfcmF0ZShzdHJ1 Y3QgY2xrX2h3ICpodywKPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCj4+ICt7Cj4+ICsgICAgICAgaWYg KGNsa19od19nZXRfcGFyZW50KGh3KSA9PSBjbGtfaHdfZ2V0X3BhcmVudF9ieV9pbmRleChodywg SFNFX1JUQykpCj4+ICsgICAgICAgICAgICAgICByZXR1cm4gY2xrX2RpdmlkZXJfb3BzLnJlY2Fs Y19yYXRlKGh3LCBwYXJlbnRfcmF0ZSk7Cj4+ICsKPj4gKyAgICAgICByZXR1cm4gcGFyZW50X3Jh dGU7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBsb25nIGNsa19kaXZpZGVyX3J0Y19yb3VuZF9yYXRl KHN0cnVjdCBjbGtfaHcgKmh3LCB1bnNpZ25lZCBsb25nIHJhdGUsCj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKnByYXRlKQo+PiArewo+PiAr ICAgICAgIGlmIChjbGtfaHdfZ2V0X3BhcmVudChodykgPT0gY2xrX2h3X2dldF9wYXJlbnRfYnlf aW5kZXgoaHcsIEhTRV9SVEMpKQo+IFRoaXMgY2xrIG9wIGNhbiBiZSBjYWxsZWQgYXQgYmFzaWNh bGx5IGFueSB0aW1lLiBNYXliZSB0aGlzIHNob3VsZCB1c2UKPiB0aGUgZGV0ZXJtaW5lIHJhdGUg b3AgYW5kIHRoZW4gbG9vayB0byBzZWUgd2hhdCB0aGUgcGFyZW50IGlzIHRoYXQgY29tZXMKPiBp biB2aWEgdGhlIHJhdGUgcmVxdWVzdCBzdHJ1Y3R1cmU/IE9yIGlzIHRoZSBpbnRlbnRpb24gdG8g a2VlcCB0aGlzCj4gcGlubmVkIHRvIG9uZSBwYXJ0aWN1bGFyIHBhcmVudD8gTG9va2luZyBhdCB0 aGlzIHJpZ2h0IG5vdyBpdCBkb2Vzbid0Cj4gcmVhbGx5IG1ha2UgbXVjaCBzZW5zZSB3aHkgdGhl IGN1cnJlbnQgcGFyZW50IHN0YXRlIHNob3VsZCBwbGF5IGludG8KPiB3aGF0IHJhdGUgdGhlIGNs ayBjYW4gcm91bmQgdG8sIHVubGVzcyB0aGVyZSBpcyBzb21lIG1vcmUgY2xrIGZsYWdzCj4gZ29p bmcgb24gdGhhdCBjb25zdHJhaW4gdGhlIGFiaWxpdHkgdG8gY2hhbmdlIHRoaXMgY2xrJ3MgcGFy ZW50LgoKWWVzIHRoZSBpbnRlbnRpb24gaXMgdG8ga2VlcCB0aGlzIHBpbm5lZCBmb3Igb25lIHBh cnRpY3VsYXIgcGFyZW50LgoKVGhpcyBkaXZpZGVyIGlzIG9ubHkgYXBwbGllZCBvbiB0aGUgNHRo IGlucHV0IG9mIHRoZSBNVVggb2YgdGhlIFJUQyBhbmQKCmRvZXNuJ3QgYWZmZWN0IHRoZSBIU0Ug ZnJlcXVlbmN5IGZvciBhbGwgdGhlIHN5c3RlbS4KCgpPc2NpbGxhdG9ycwogwqAtLS0tLQp8IGxz ZSB8LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tPiBja19sc2UKIMKgLS0tLS3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8CiDCoC0tLS0twqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgfAp8IGxzaSB8LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0t PiBja19sc2kKIMKgLS0tLS3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqAgfAogwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKgIHwKIMKgLS0tLS3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgfMKgwqAgfAp8IGhzZSB8LS0tLSstLS0tLS0tfC0tLXwtLS0tLS0tLS0t LS0tLS0tPiBja19oc2UKIMKgLS0tLS3CoMKgwqDCoCB8wqDCoMKgwqDCoMKgIHzCoMKgIHwKIMKg wqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKgwqDCoMKgwqAgfMKgwqAgfMKgwqDCoMKgwqDCoMKgwqAg fFwgbXV4CiDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgIHzCoMKgIHzCoCBPRkYg LS0+fCBcCiDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgIHzCoMKgIHzCoMKgwqDC oMKgwqDCoMKgIHzCoCBcwqDCoMKgwqAgZ2F0ZQogwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDC oMKgwqDCoCB8wqDCoCAtLS0tLS0tLS0+fMKgIHzCoMKgwqDCoCAtLS0KIMKgwqDCoMKgwqDCoMKg wqDCoMKgIHzCoMKgwqDCoMKgwqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqAgfC0tLT58 wqDCoCB8LS0+IGNrX3J0YwogwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoMKgwqDCoCAtLS0t LS0tLS0tLS0tPnzCoCB8wqDCoMKgwqAgLS0tCiDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKg IC0tLS0tLS0tLS0twqDCoMKgwqDCoCB8wqAgfAogwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAtLS0t fCAlIDEgdG8gNjQgfC0tLT58IC8KIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC0t LS0tLS0tLS0twqDCoMKgwqAgfC8KIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBkaXZpZGVyCgpJIG1hbmFnZSB0aGUgUlRDIHdpdGggYSBjbG9jayBjb21wb3NpdGUgd2l0aCBh IGdhdGUgYSBtdXggYW5kIGEgc3BlY2lmaWMgCnJhdGUgb3BzIGZvciBoc2UgaW5wdXQuCgpUaGF0 IHdoeSBpIG5lZWQgdG8gdGhlIHBhcmVudCBzdGF0ZS4KCkJlc3QgUmVnYXJkcwoKR2FicmllbAoK Cj4+ICsgICAgICAgICAgICAgICByZXR1cm4gY2xrX2RpdmlkZXJfb3BzLnJvdW5kX3JhdGUoaHcs IHJhdGUsIHByYXRlKTsKPj4gKwo+PiArICAgICAgIHJldHVybiAqcHJhdGU7Cj4+ICt9Cj4+ICsK Pj4gK3N0YXRpYyBpbnQgY2xrX2RpdmlkZXJfcnRjX3NldF9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3 LCB1bnNpZ25lZCBsb25nIHJhdGUsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCj4+ICt7Cj4+ICsgICAgICAgaWYgKGNsa19o d19nZXRfcGFyZW50KGh3KSA9PSBjbGtfaHdfZ2V0X3BhcmVudF9ieV9pbmRleChodywgSFNFX1JU QykpCj4+ICsgICAgICAgICAgICAgICByZXR1cm4gY2xrX2RpdmlkZXJfb3BzLnNldF9yYXRlKGh3 LCByYXRlLCBwYXJlbnRfcmF0ZSk7Cj4+ICsKPj4gKyAgICAgICByZXR1cm4gcGFyZW50X3JhdGU7 Cj4+ICt9Cj4+ICsKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMu aW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2xpbnV4LWFybS1rZXJuZWwK