From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.kernel.org ([198.145.29.99]:54362 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751236AbeCQUan (ORCPT ); Sat, 17 Mar 2018 16:30:43 -0400 Date: Sat, 17 Mar 2018 20:30:37 +0000 From: Jonathan Cameron To: John Syne Cc: Rodrigo Siqueira , devel@driverdev.osuosl.org, Lars-Peter Clausen , linux-iio@vger.kernel.org, Greg Kroah-Hartman , linux-kernel@vger.kernel.org, Peter Meerwald-Stadler , Hartmut Knaack , daniel.baluta@nxp.com Subject: Re: [PATCH v2 1/3] staging:iio:meter: Replaces IIO_DEV_ATTR_CH_OFF by IIO_DEVICE_ATTR Message-ID: <20180317203037.1093cc11@archlinux> In-Reply-To: <79D3051B-FF2F-4DD3-AF75-F6A4BAD81838@gmail.com> References: <3af0e5a795059a8418cf08ff29f05f8d5e00da9b.1520382753.git.rodrigosiqueiramelo@gmail.com> <20180307200730.08ed3c2f@archlinux> <20180309003733.aichruo53vqryafg@smtp.gmail.com> <20180310151045.4570e85d@archlinux> <79D3051B-FF2F-4DD3-AF75-F6A4BAD81838@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-iio-owner@vger.kernel.org List-Id: linux-iio@vger.kernel.org On Wed, 14 Mar 2018 23:12:02 -0700 John Syne wrote: > Hi Jonathan, > > I have been looking at the IIO ABI docs and if I understand > correctly, the idea is to use consistent naming conventions? So for > example, looking at the ADE7854 datasheet, the naming matching the > ADE7854 registers would be as follows: Welcome to one of the big reasons no one tidied these drivers up originally. Still we have moved on somewhat since then so similar circumstances have come up in other types of sensor. > > {direction}_{type}_{index}_{modifier}_{info_mask} > > AIGAIN - In_current_a_gain Other than the fact that gain isn't an ABI element and that index doesn't have _ before it that is right. in_voltageA_scale That was a weird quirk a long time back which we should probably not have done (copied it from hwmon) > AVGAIN - in_voltage_a_gain > BIGAIN - in_current_b_gain > BVGAIN - in_voltage_b_gain > — > How do we represent the rms and offset > AIRMSOS - in_current_a_rmsoffset > AVRMSOS - in_voltage_a_rmsoffset Right now we can't unfortunately though this one is easier to fix. We already have modifiers for multi axis devices doing sum_squared so add one of those for root_mean_square - this one is well known enough that rms is fine in the string. It's a effectively a different channel be it one derived from a simple one. This is going to get tricky however as we would normally use modifier to specialise a channel type - thoughts on this below. > — > Here I don’t understand how to represent both the phase and the active/reactive/apparent power components. Do we combine the phase and quadrature part like this > AVAGAIN - in_power_a_gain /* apparent power */ > — > AWGAIN - in_power_ai_gain /* active power */ And that is the problem. How do we represent the various power types. Hmm. We could do it with modifiers but above we show that we have already used them. It would be easy enough to add yet another field to the channel spec to specify this but there is a problem - Events. The event format is already pretty full so where do we put this extra element if we need to define a channel separated only by it. One thought is we could instead define these as different top level IIO_CHAN_TYPES in a similar fashion to we do for relative humidity vs the proposed absolute humidity. in_powerreactiveA_scale in_poweractivceA_scale (or in_powerrealA_scale to match with what I got taught years ago?) I presume we keep in_powerA_scale etc for the apparent power and modify any docs to make that clear. > — > AVARGAIN - in_power_aq_gain /* reactive power */ > — > Now here it becomes more complicated. Not sure how this gets handled. > AFWATTOS - in_power_a_active/fundamental/offset Yeah, some of these are getting odd. If I read this correctly this is the active power estimate based on only the fundamental frequency - so no harmonics? Hmm. This then becomes a separate channel with additional properties specifying it is only the fundamental. This feels a bit like a filter be it an unusual one? Might just be necessary to add a _fundamental_only element on the end (would be info_mask if this is common enough to justify that rather than using the extended methods to define it.). > — > AWATTHR - in_energy_ai_accumulation Great, just when I thought we had gone far enough they define reactive energy which is presumably roughly the same as reactivepower * time? In that case we need types for that as well. in_energyreactiveA_* in_energyactiveA_* > — > AVARHR - in_energy_aq_accumulation > — > IPEAK - in_current_peak That one is easy as we have an info_mask element for peak and one for peak_scale that has always been a bit odd but was needed somewhere. > — > > I’ll leave it there, because there are some even more complicated register naming issues. Something to look forward to. Gah, I always hated power engineering though I taught it very briefly (I really pity those students :( Jonathan > > Regards, > John > > > > > > > On Mar 10, 2018, at 7:10 AM, Jonathan Cameron wrote: > > > > On Thu, 8 Mar 2018 21:37:33 -0300 > > Rodrigo Siqueira wrote: > > > >> On 03/07, Jonathan Cameron wrote: > >>> On Tue, 6 Mar 2018 21:43:47 -0300 > >>> Rodrigo Siqueira wrote: > >>> > >>>> The macro IIO_DEV_ATTR_CH_OFF is a wrapper for IIO_DEVICE_ATTR, with a > >>>> tiny change in the name definition. This extra macro does not improve > >>>> the readability and also creates some checkpatch errors. > >>>> > >>>> This patch fixes the checkpatch.pl errors: > >>>> > >>>> staging/iio/meter/ade7753.c:391: ERROR: Use 4 digit octal (0777) not > >>>> decimal permissions > >>>> staging/iio/meter/ade7753.c:395: ERROR: Use 4 digit octal (0777) not > >>>> decimal permissions > >>>> staging/iio/meter/ade7759.c:331: ERROR: Use 4 digit octal (0777) not > >>>> decimal permissions > >>>> staging/iio/meter/ade7759.c:335: ERROR: Use 4 digit octal (0777) not > >>>> decimal permissions > >>>> > >>>> Signed-off-by: Rodrigo Siqueira > >>> > >>> Hmm. I wondered a bit about this one. It's a correct patch in of > >>> itself but the interface in question doesn't even vaguely conform > >>> to any of defined IIO ABI. Anyhow, it's still and improvement so > >>> I'll take it. > >> > >> I am not sure if I understood the comment about the ABI. The meter > >> interface is wrong because it uses things like IIO_DEVICE_ATTR? It > >> should use iio_info together with *write_raw and *read_raw. Right? Is it > >> the ABI problem that you refer? > > The ABI is about the userspace interface of IIO. It is defined > > in Documentation/ABI/testing/sysfs-bus-iio* > > So this documents the naming of sysfs attributes and (more or less) > > describes a consistent interface to userspace across lots of different > > types of devices. > > > > A lot of these older drivers in staging involve a good deal of ABI that > > was not reviewed or discussed. That is one of the biggest reasons we > > didn't take them out of staging in the first place. > > > > In order for generic userspace programs to have any idea what to do > > with these devices this all needs to be fixed. > > > > There may well be cases where we need to expand the existing ABI to > > cover new things. That's fine, but it has to be done with full > > review of the relevant documentation patches. > > > > Incidentally if you want an easy driver to work on moving out of staging > > then first thing to do is to compare what it shows to userspace with these > > docs. If it's totally different then you have a big job on your hands > > as often ABI can take a lot of discussion and a long time to establish > > a consensus. > > > > Jonathan > > > > > >> > >> Thanks :) > >> > >>> Applied to the togreg branch of iio.git and pushed out as testing > >>> for the autobuilders to play with it. > >>> > >>> I also added the removal of the header define which is no > >>> longer used. > >>> > >>> Please note, following discussions with Michael, I am going to send > >>> an email announcing an intent to drop these meter drivers next > >>> cycle unless someone can provide testing for any attempt to > >>> move them out of staging. I'm still taking patches on the basis > >>> that 'might' happen - but I wouldn't focus on these until we > >>> have some certainty on whether they will be around long term! > >>> > >>> Jonathan > >>> > >>>> --- > >>>> drivers/staging/iio/meter/ade7753.c | 18 ++++++++++-------- > >>>> drivers/staging/iio/meter/ade7759.c | 18 ++++++++++-------- > >>>> 2 files changed, 20 insertions(+), 16 deletions(-) > >>>> > >>>> diff --git a/drivers/staging/iio/meter/ade7753.c b/drivers/staging/iio/meter/ade7753.c > >>>> index c44eb577dc35..275e8dfff836 100644 > >>>> --- a/drivers/staging/iio/meter/ade7753.c > >>>> +++ b/drivers/staging/iio/meter/ade7753.c > >>>> @@ -388,14 +388,16 @@ static IIO_DEV_ATTR_VPERIOD(0444, > >>>> ade7753_read_16bit, > >>>> NULL, > >>>> ADE7753_PERIOD); > >>>> -static IIO_DEV_ATTR_CH_OFF(1, 0644, > >>>> - ade7753_read_8bit, > >>>> - ade7753_write_8bit, > >>>> - ADE7753_CH1OS); > >>>> -static IIO_DEV_ATTR_CH_OFF(2, 0644, > >>>> - ade7753_read_8bit, > >>>> - ade7753_write_8bit, > >>>> - ADE7753_CH2OS); > >>>> + > >>>> +static IIO_DEVICE_ATTR(choff_1, 0644, > >>>> + ade7753_read_8bit, > >>>> + ade7753_write_8bit, > >>>> + ADE7753_CH1OS); > >>>> + > >>>> +static IIO_DEVICE_ATTR(choff_2, 0644, > >>>> + ade7753_read_8bit, > >>>> + ade7753_write_8bit, > >>>> + ADE7753_CH2OS); > >>>> > >>>> static int ade7753_set_irq(struct device *dev, bool enable) > >>>> { > >>>> diff --git a/drivers/staging/iio/meter/ade7759.c b/drivers/staging/iio/meter/ade7759.c > >>>> index 1decb2b8afab..c078b770fa53 100644 > >>>> --- a/drivers/staging/iio/meter/ade7759.c > >>>> +++ b/drivers/staging/iio/meter/ade7759.c > >>>> @@ -328,14 +328,16 @@ static IIO_DEV_ATTR_ACTIVE_POWER_GAIN(0644, > >>>> ade7759_read_16bit, > >>>> ade7759_write_16bit, > >>>> ADE7759_APGAIN); > >>>> -static IIO_DEV_ATTR_CH_OFF(1, 0644, > >>>> - ade7759_read_8bit, > >>>> - ade7759_write_8bit, > >>>> - ADE7759_CH1OS); > >>>> -static IIO_DEV_ATTR_CH_OFF(2, 0644, > >>>> - ade7759_read_8bit, > >>>> - ade7759_write_8bit, > >>>> - ADE7759_CH2OS); > >>>> + > >>>> +static IIO_DEVICE_ATTR(choff_1, 0644, > >>>> + ade7759_read_8bit, > >>>> + ade7759_write_8bit, > >>>> + ADE7759_CH1OS); > >>>> + > >>>> +static IIO_DEVICE_ATTR(choff_2, 0644, > >>>> + ade7759_read_8bit, > >>>> + ade7759_write_8bit, > >>>> + ADE7759_CH2OS); > >>>> > >>>> static int ade7759_set_irq(struct device *dev, bool enable) > >>>> { > >>> > >> -- > >> To unsubscribe from this list: send the line "unsubscribe linux-iio" in > >> the body of a message to majordomo@vger.kernel.org > >> More majordomo info at http://vger.kernel.org/majordomo-info.html > > > > _______________________________________________ > > devel mailing list > > devel@linuxdriverproject.org > > http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Cyrus-Session-Id: sloti22d1t05-2228409-1521318652-2-61497745912472415 X-Sieve: CMU Sieve 3.0 X-Spam-known-sender: no X-Spam-score: 0.0 X-Spam-hits: BAYES_00 -1.9, HEADER_FROM_DIFFERENT_DOMAINS 0.25, RCVD_IN_DNSWL_MED -2.3, SPF_PASS -0.001, LANGUAGES en, BAYES_USED global, SA_VERSION 3.4.0 X-Spam-source: IP='140.211.166.136', Host='smtp3.osuosl.org', Country='US', FromHeader='org', MailFrom='org' X-Spam-charsets: plain='utf-8' X-Resolved-to: greg@kroah.com X-Delivered-to: greg@kroah.com X-Mail-from: driverdev-devel-bounces@linuxdriverproject.org ARC-Seal: i=1; a=rsa-sha256; cv=none; d=messagingengine.com; s=arctest; t=1521318651; b=pydRm6KTMnKuutKn0v3T+XFlq03t3MgLyqpgRAreRouJmj3 CwF5t6602PcQ1A01d8PWXaKC3KE7nHxVRg1GX8tx3mLMdTPYFsoOyvzy/BViL7Oz ZSTCNa9lF6cVpg+ywkbS+7DDGuI8qjgwUcBUT5zf3MBdw8UPdpYTcQ6DHy630YU6 Ry7h/Lg+lFBC8s5ldwvVpIKk2pzKeSnCclF19nshgqomiTL6duRn8yLkapoFAwrt a7IlYeIdcB0dItJu87aaQwTqd5qoYYia7RPN9EEoxTuKb/ygPaxd+dG2rLcGsejd VrMYXks9l50rnKjum5+PGCgr9LZCrbib8MVm0bw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=date:from:to:subject:message-id :in-reply-to:references:mime-version:list-id:list-unsubscribe :list-archive:list-post:list-help:list-subscribe:cc:content-type :content-transfer-encoding:sender; s=arctest; t=1521318651; bh=d Q6Pu16N9T8mOUtjT4nXljKNGQSs09NfqcXz7LJvtoE=; b=FRJZ668zf2fEWh8da uMRAaV62mt7bKpTppuZzgG/moGdethYlqGqMfs/qDQHpfx6HSmlkYVyINLgUa016 ikQmWDsufxhPSCm514su3epCGyFCvCtwaSjUaGufduEAvwRaUSivFKN2rQHqO942 ToFL0TtShfLZ53S6T8XGxXtGKy7c1rvvniX6YbkxuEtOeBo7mCTp8nZc7fQFrajb B3zvOJAsKOlSzxw5qk7KZevExVniUaU7et2qRzygrPiI+p7lPBrIsmOUeIPzsTJo FRAXPI9QpaIK365cprhz2yF0D6g/m1fJM55FtjtRuNVeGrIeDOo0j89dvVO+Mx6L mea8w== ARC-Authentication-Results: i=1; mx4.messagingengine.com; arc=none (no signatures found); dkim=none (no signatures found); dmarc=none (p=none,has-list-id=yes,d=none) header.from=kernel.org; iprev=pass policy.iprev=140.211.166.136 (smtp3.osuosl.org); spf=pass smtp.mailfrom=driverdev-devel-bounces@linuxdriverproject.org smtp.helo=silver.osuosl.org; x-aligned-from=fail; x-category=clean score=-100 state=0; x-ptr=fail x-ptr-helo=silver.osuosl.org x-ptr-lookup=smtp3.osuosl.org; x-return-mx=pass smtp.domain=linuxdriverproject.org smtp.result=pass smtp_is_org_domain=yes header.domain=kernel.org header.result=pass header_is_org_domain=yes; x-tls=pass version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128 Authentication-Results: mx4.messagingengine.com; arc=none (no signatures found); dkim=none (no signatures found); dmarc=none (p=none,has-list-id=yes,d=none) header.from=kernel.org; iprev=pass policy.iprev=140.211.166.136 (smtp3.osuosl.org); spf=pass smtp.mailfrom=driverdev-devel-bounces@linuxdriverproject.org smtp.helo=silver.osuosl.org; x-aligned-from=fail; x-category=clean score=-100 state=0; x-ptr=fail x-ptr-helo=silver.osuosl.org x-ptr-lookup=smtp3.osuosl.org; x-return-mx=pass smtp.domain=linuxdriverproject.org smtp.result=pass smtp_is_org_domain=yes header.domain=kernel.org header.result=pass header_is_org_domain=yes; x-tls=pass version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128 X-Remote-Delivered-To: driverdev-devel@osuosl.org DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BD39721737 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=jic23@kernel.org Date: Sat, 17 Mar 2018 20:30:37 +0000 From: Jonathan Cameron To: John Syne Subject: Re: [PATCH v2 1/3] staging:iio:meter: Replaces IIO_DEV_ATTR_CH_OFF by IIO_DEVICE_ATTR Message-ID: <20180317203037.1093cc11@archlinux> In-Reply-To: <79D3051B-FF2F-4DD3-AF75-F6A4BAD81838@gmail.com> References: <3af0e5a795059a8418cf08ff29f05f8d5e00da9b.1520382753.git.rodrigosiqueiramelo@gmail.com> <20180307200730.08ed3c2f@archlinux> <20180309003733.aichruo53vqryafg@smtp.gmail.com> <20180310151045.4570e85d@archlinux> <79D3051B-FF2F-4DD3-AF75-F6A4BAD81838@gmail.com> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-BeenThere: driverdev-devel@linuxdriverproject.org X-Mailman-Version: 2.1.24 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devel@driverdev.osuosl.org, Lars-Peter Clausen , Rodrigo Siqueira , linux-iio@vger.kernel.org, Greg Kroah-Hartman , linux-kernel@vger.kernel.org, Peter Meerwald-Stadler , Hartmut Knaack , daniel.baluta@nxp.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: driverdev-devel-bounces@linuxdriverproject.org Sender: "devel" X-getmail-retrieved-from-mailbox: INBOX X-Mailing-List: linux-kernel@vger.kernel.org List-ID: T24gV2VkLCAxNCBNYXIgMjAxOCAyMzoxMjowMiAtMDcwMApKb2huIFN5bmUgPGpvaG4zOTA5QGdt YWlsLmNvbT4gd3JvdGU6Cgo+IEhpIEpvbmF0aGFuLAo+IAo+IEkgaGF2ZSBiZWVuIGxvb2tpbmcg YXQgdGhlIElJTyBBQkkgZG9jcyBhbmQgaWYgSSB1bmRlcnN0YW5kCj4gY29ycmVjdGx5LCB0aGUg aWRlYSBpcyB0byB1c2UgY29uc2lzdGVudCBuYW1pbmcgY29udmVudGlvbnM/IFNvIGZvcgo+IGV4 YW1wbGUsIGxvb2tpbmcgYXQgdGhlIEFERTc4NTQgZGF0YXNoZWV0LCB0aGUgbmFtaW5nIG1hdGNo aW5nIHRoZQo+IEFERTc4NTQgcmVnaXN0ZXJzIHdvdWxkIGJlIGFzIGZvbGxvd3M6CgpXZWxjb21l IHRvIG9uZSBvZiB0aGUgYmlnIHJlYXNvbnMgbm8gb25lIHRpZGllZCB0aGVzZSBkcml2ZXJzCnVw IG9yaWdpbmFsbHkuICBTdGlsbCB3ZSBoYXZlIG1vdmVkIG9uIHNvbWV3aGF0IHNpbmNlIHRoZW4K c28gc2ltaWxhciBjaXJjdW1zdGFuY2VzIGhhdmUgY29tZSB1cCBpbiBvdGhlciB0eXBlcyBvZiBz ZW5zb3IuCgo+IAo+IHtkaXJlY3Rpb259X3t0eXBlfV97aW5kZXh9X3ttb2RpZmllcn1fe2luZm9f bWFza30KPiAKPiBBSUdBSU4JLQlJbl9jdXJyZW50X2FfZ2FpbgpPdGhlciB0aGFuIHRoZSBmYWN0 IHRoYXQgZ2FpbiBpc24ndCBhbiBBQkkgZWxlbWVudCBhbmQgdGhhdCBpbmRleApkb2Vzbid0IGhh dmUKXyBiZWZvcmUgaXQgdGhhdCBpcyByaWdodC4KaW5fdm9sdGFnZUFfc2NhbGUKClRoYXQgd2Fz IGEgd2VpcmQgcXVpcmsgYSBsb25nIHRpbWUgYmFjayB3aGljaCB3ZSBzaG91bGQgcHJvYmFibHkK bm90IGhhdmUgZG9uZSAoY29waWVkIGl0IGZyb20gaHdtb24pCgo+IEFWR0FJTgktCWluX3ZvbHRh Z2VfYV9nYWluCj4gQklHQUlOCS0JaW5fY3VycmVudF9iX2dhaW4KPiBCVkdBSU4JLQlpbl92b2x0 YWdlX2JfZ2Fpbgo+IOKAlAo+IEhvdyBkbyB3ZSByZXByZXNlbnQgdGhlIHJtcyBhbmQgb2Zmc2V0 Cj4gQUlSTVNPUwktCWluX2N1cnJlbnRfYV9ybXNvZmZzZXQKPiBBVlJNU09TCS0JaW5fdm9sdGFn ZV9hX3Jtc29mZnNldAoKUmlnaHQgbm93IHdlIGNhbid0IHVuZm9ydHVuYXRlbHkgdGhvdWdoIHRo aXMgb25lIGlzIGVhc2llciB0byBmaXguCldlIGFscmVhZHkgaGF2ZSBtb2RpZmllcnMgZm9yIG11 bHRpIGF4aXMgZGV2aWNlcyBkb2luZyBzdW1fc3F1YXJlZApzbyBhZGQgb25lIG9mIHRob3NlIGZv ciByb290X21lYW5fc3F1YXJlIC0gdGhpcyBvbmUgaXMgd2VsbCBrbm93bgplbm91Z2ggdGhhdCBy bXMgaXMgZmluZSBpbiB0aGUgc3RyaW5nLgoKSXQncyBhIGVmZmVjdGl2ZWx5IGEgZGlmZmVyZW50 IGNoYW5uZWwgYmUgaXQgb25lIGRlcml2ZWQgZnJvbSBhIHNpbXBsZQpvbmUuICBUaGlzIGlzIGdv aW5nIHRvIGdldCB0cmlja3kgaG93ZXZlciBhcyB3ZSB3b3VsZCBub3JtYWxseSB1c2UKbW9kaWZp ZXIgdG8gc3BlY2lhbGlzZSBhIGNoYW5uZWwgdHlwZSAtIHRob3VnaHRzIG9uIHRoaXMgYmVsb3cu Cgo+IOKAlAo+IEhlcmUgSSBkb27igJl0IHVuZGVyc3RhbmQgaG93IHRvIHJlcHJlc2VudCBib3Ro IHRoZSBwaGFzZSBhbmQgdGhlIGFjdGl2ZS9yZWFjdGl2ZS9hcHBhcmVudCBwb3dlciBjb21wb25l bnRzLiBEbyB3ZSBjb21iaW5lIHRoZSBwaGFzZSBhbmQgcXVhZHJhdHVyZSBwYXJ0IGxpa2UgdGhp cwo+IEFWQUdBSU4JCS0JaW5fcG93ZXJfYV9nYWluCQkJCS8qIGFwcGFyZW50IHBvd2VyICovCj4g 4oCUCj4gQVdHQUlOCQktCWluX3Bvd2VyX2FpX2dhaW4JCQkJLyogYWN0aXZlIHBvd2VyICovCkFu ZCB0aGF0IGlzIHRoZSBwcm9ibGVtLiAgSG93IGRvIHdlIHJlcHJlc2VudCB0aGUgdmFyaW91cyBw b3dlciB0eXBlcy4KSG1tLiBXZSBjb3VsZCBkbyBpdCB3aXRoIG1vZGlmaWVycyBidXQgYWJvdmUg d2Ugc2hvdyB0aGF0IHdlIGhhdmUgYWxyZWFkeSB1c2VkIHRoZW0uCgpJdCB3b3VsZCBiZSBlYXN5 IGVub3VnaCB0byBhZGQgeWV0IGFub3RoZXIgZmllbGQgdG8gdGhlIGNoYW5uZWwgc3BlYyB0byBz cGVjaWZ5CnRoaXMgYnV0IHRoZXJlIGlzIGEgcHJvYmxlbSAtIEV2ZW50cy4gIFRoZSBldmVudCBm b3JtYXQgaXMgYWxyZWFkeSBwcmV0dHkgZnVsbApzbyB3aGVyZSBkbyB3ZSBwdXQgdGhpcyBleHRy YSBlbGVtZW50IGlmIHdlIG5lZWQgdG8gZGVmaW5lIGEgY2hhbm5lbCBzZXBhcmF0ZWQKb25seSBi eSBpdC4KCk9uZSB0aG91Z2h0IGlzIHdlIGNvdWxkIGluc3RlYWQgZGVmaW5lIHRoZXNlIGFzIGRp ZmZlcmVudCB0b3AgbGV2ZWwKSUlPX0NIQU5fVFlQRVMgaW4gYSBzaW1pbGFyIGZhc2hpb24gdG8g d2UgZG8gZm9yIHJlbGF0aXZlIGh1bWlkaXR5IHZzCnRoZSBwcm9wb3NlZCBhYnNvbHV0ZSBodW1p ZGl0eS4KCmluX3Bvd2VycmVhY3RpdmVBX3NjYWxlCmluX3Bvd2VyYWN0aXZjZUFfc2NhbGUKKG9y IGluX3Bvd2VycmVhbEFfc2NhbGUgdG8gbWF0Y2ggd2l0aCB3aGF0IEkgZ290IHRhdWdodCB5ZWFy cyBhZ28/KQoKSSBwcmVzdW1lIHdlIGtlZXAgaW5fcG93ZXJBX3NjYWxlIGV0YyBmb3IgdGhlIGFw cGFyZW50IHBvd2VyIGFuZAptb2RpZnkgYW55IGRvY3MgdG8gbWFrZSB0aGF0IGNsZWFyLgoKPiDi gJQKPiBBVkFSR0FJTgktCWluX3Bvd2VyX2FxX2dhaW4JCQkJLyogcmVhY3RpdmUgcG93ZXIgKi8K PiDigJQKPiBOb3cgaGVyZSBpdCBiZWNvbWVzIG1vcmUgY29tcGxpY2F0ZWQuIE5vdCBzdXJlIGhv dyB0aGlzIGdldHMgaGFuZGxlZC4gCj4gQUZXQVRUT1MJLQlpbl9wb3dlcl9hX2FjdGl2ZS9mdW5k YW1lbnRhbC9vZmZzZXQKWWVhaCwgc29tZSBvZiB0aGVzZSBhcmUgZ2V0dGluZyBvZGQuCklmIEkg cmVhZCB0aGlzIGNvcnJlY3RseSB0aGlzIGlzIHRoZSBhY3RpdmUgcG93ZXIgZXN0aW1hdGUgYmFz ZWQgb24gb25seQp0aGUgZnVuZGFtZW50YWwgZnJlcXVlbmN5IC0gc28gbm8gaGFybW9uaWNzPwoK SG1tLiAgVGhpcyB0aGVuIGJlY29tZXMgYSBzZXBhcmF0ZSBjaGFubmVsIHdpdGggYWRkaXRpb25h bCBwcm9wZXJ0aWVzCnNwZWNpZnlpbmcgaXQgaXMgb25seSB0aGUgZnVuZGFtZW50YWwuICBUaGlz IGZlZWxzIGEgYml0IGxpa2UgYSBmaWx0ZXIKYmUgaXQgYW4gdW51c3VhbCBvbmU/ICBNaWdodCBq dXN0IGJlIG5lY2Vzc2FyeSB0byBhZGQgYSBfZnVuZGFtZW50YWxfb25seQplbGVtZW50IG9uIHRo ZSBlbmQgKHdvdWxkIGJlIGluZm9fbWFzayBpZiB0aGlzIGlzIGNvbW1vbiBlbm91Z2ggdG8KanVz dGlmeSB0aGF0IHJhdGhlciB0aGFuIHVzaW5nIHRoZSBleHRlbmRlZCBtZXRob2RzIHRvIGRlZmlu ZSBpdC4pLgoKCj4g4oCUCj4gQVdBVFRIUgktCWluX2VuZXJneV9haV9hY2N1bXVsYXRpb24KR3Jl YXQsIGp1c3Qgd2hlbiBJIHRob3VnaHQgd2UgaGFkIGdvbmUgZmFyIGVub3VnaCB0aGV5IGRlZmlu ZSByZWFjdGl2ZQplbmVyZ3kgd2hpY2ggaXMgcHJlc3VtYWJseSByb3VnaGx5IHRoZSBzYW1lIGFz IHJlYWN0aXZlcG93ZXIgKiB0aW1lPwpJbiB0aGF0IGNhc2Ugd2UgbmVlZCB0eXBlcyBmb3IgdGhh dCBhcyB3ZWxsLgppbl9lbmVyZ3lyZWFjdGl2ZUFfKgppbl9lbmVyZ3lhY3RpdmVBXyoKCj4g4oCU Cj4gQVZBUkhSCQktCWluX2VuZXJneV9hcV9hY2N1bXVsYXRpb24KPiDigJQKPiBJUEVBSwkJLQlp bl9jdXJyZW50X3BlYWsKVGhhdCBvbmUgaXMgZWFzeSBhcyB3ZSBoYXZlIGFuIGluZm9fbWFzayBl bGVtZW50IGZvciBwZWFrIGFuZCBvbmUKZm9yIHBlYWtfc2NhbGUgdGhhdCBoYXMgYWx3YXlzIGJl ZW4gYSBiaXQgb2RkIGJ1dCB3YXMgbmVlZGVkIHNvbWV3aGVyZS4KCj4g4oCUCj4gCj4gSeKAmWxs IGxlYXZlIGl0IHRoZXJlLCBiZWNhdXNlIHRoZXJlIGFyZSBzb21lIGV2ZW4gbW9yZSBjb21wbGlj YXRlZCByZWdpc3RlciBuYW1pbmcgaXNzdWVzLgpTb21ldGhpbmcgdG8gbG9vayBmb3J3YXJkIHRv LiAgR2FoLCBJIGFsd2F5cyBoYXRlZCBwb3dlciBlbmdpbmVlcmluZwp0aG91Z2ggSSB0YXVnaHQg aXQgdmVyeSBicmllZmx5IChJIHJlYWxseSBwaXR5IHRob3NlIHN0dWRlbnRzIDooCgpKb25hdGhh bgoKPiAKPiBSZWdhcmRzLAo+IEpvaG4KPiAKPiAKPiAKPiAKPiAKPiA+IE9uIE1hciAxMCwgMjAx OCwgYXQgNzoxMCBBTSwgSm9uYXRoYW4gQ2FtZXJvbiA8amljMjNAa2VybmVsLm9yZz4gd3JvdGU6 Cj4gPiAKPiA+IE9uIFRodSwgOCBNYXIgMjAxOCAyMTozNzozMyAtMDMwMAo+ID4gUm9kcmlnbyBT aXF1ZWlyYSA8cm9kcmlnb3NpcXVlaXJhbWVsb0BnbWFpbC5jb20+IHdyb3RlOgo+ID4gICAKPiA+ PiBPbiAwMy8wNywgSm9uYXRoYW4gQ2FtZXJvbiB3cm90ZTogIAo+ID4+PiBPbiBUdWUsIDYgTWFy IDIwMTggMjE6NDM6NDcgLTAzMDAKPiA+Pj4gUm9kcmlnbyBTaXF1ZWlyYSA8cm9kcmlnb3NpcXVl aXJhbWVsb0BnbWFpbC5jb20+IHdyb3RlOgo+ID4+PiAgIAo+ID4+Pj4gVGhlIG1hY3JvIElJT19E RVZfQVRUUl9DSF9PRkYgaXMgYSB3cmFwcGVyIGZvciBJSU9fREVWSUNFX0FUVFIsIHdpdGggYQo+ ID4+Pj4gdGlueSBjaGFuZ2UgaW4gdGhlIG5hbWUgZGVmaW5pdGlvbi4gVGhpcyBleHRyYSBtYWNy byBkb2VzIG5vdCBpbXByb3ZlCj4gPj4+PiB0aGUgcmVhZGFiaWxpdHkgYW5kIGFsc28gY3JlYXRl cyBzb21lIGNoZWNrcGF0Y2ggZXJyb3JzLgo+ID4+Pj4gCj4gPj4+PiBUaGlzIHBhdGNoIGZpeGVz IHRoZSBjaGVja3BhdGNoLnBsIGVycm9yczoKPiA+Pj4+IAo+ID4+Pj4gc3RhZ2luZy9paW8vbWV0 ZXIvYWRlNzc1My5jOjM5MTogRVJST1I6IFVzZSA0IGRpZ2l0IG9jdGFsICgwNzc3KSBub3QKPiA+ Pj4+IGRlY2ltYWwgcGVybWlzc2lvbnMKPiA+Pj4+IHN0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMu YzozOTU6IEVSUk9SOiBVc2UgNCBkaWdpdCBvY3RhbCAoMDc3Nykgbm90Cj4gPj4+PiBkZWNpbWFs IHBlcm1pc3Npb25zCj4gPj4+PiBzdGFnaW5nL2lpby9tZXRlci9hZGU3NzU5LmM6MzMxOiBFUlJP UjogVXNlIDQgZGlnaXQgb2N0YWwgKDA3NzcpIG5vdAo+ID4+Pj4gZGVjaW1hbCBwZXJtaXNzaW9u cwo+ID4+Pj4gc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OS5jOjMzNTogRVJST1I6IFVzZSA0IGRp Z2l0IG9jdGFsICgwNzc3KSBub3QKPiA+Pj4+IGRlY2ltYWwgcGVybWlzc2lvbnMKPiA+Pj4+IAo+ ID4+Pj4gU2lnbmVkLW9mZi1ieTogUm9kcmlnbyBTaXF1ZWlyYSA8cm9kcmlnb3NpcXVlaXJhbWVs b0BnbWFpbC5jb20+ICAgIAo+ID4+PiAKPiA+Pj4gSG1tLiBJIHdvbmRlcmVkIGEgYml0IGFib3V0 IHRoaXMgb25lLiBJdCdzIGEgY29ycmVjdCBwYXRjaCBpbiBvZgo+ID4+PiBpdHNlbGYgYnV0IHRo ZSBpbnRlcmZhY2UgaW4gcXVlc3Rpb24gZG9lc24ndCBldmVuIHZhZ3VlbHkgY29uZm9ybQo+ID4+ PiB0byBhbnkgb2YgZGVmaW5lZCBJSU8gQUJJLiAgQW55aG93LCBpdCdzIHN0aWxsIGFuZCBpbXBy b3ZlbWVudCBzbwo+ID4+PiBJJ2xsIHRha2UgaXQuICAgIAo+ID4+IAo+ID4+IEkgYW0gbm90IHN1 cmUgaWYgSSB1bmRlcnN0b29kIHRoZSBjb21tZW50IGFib3V0IHRoZSBBQkkuIFRoZSBtZXRlcgo+ ID4+IGludGVyZmFjZSBpcyB3cm9uZyBiZWNhdXNlIGl0IHVzZXMgdGhpbmdzIGxpa2UgSUlPX0RF VklDRV9BVFRSPyBJdAo+ID4+IHNob3VsZCB1c2UgaWlvX2luZm8gdG9nZXRoZXIgd2l0aCAqd3Jp dGVfcmF3IGFuZCAqcmVhZF9yYXcuIFJpZ2h0PyBJcyBpdAo+ID4+IHRoZSBBQkkgcHJvYmxlbSB0 aGF0IHlvdSByZWZlcj8gIAo+ID4gVGhlIEFCSSBpcyBhYm91dCB0aGUgdXNlcnNwYWNlIGludGVy ZmFjZSBvZiBJSU8uICBJdCBpcyBkZWZpbmVkCj4gPiBpbiBEb2N1bWVudGF0aW9uL0FCSS90ZXN0 aW5nL3N5c2ZzLWJ1cy1paW8qCj4gPiBTbyB0aGlzIGRvY3VtZW50cyB0aGUgbmFtaW5nIG9mIHN5 c2ZzIGF0dHJpYnV0ZXMgYW5kIChtb3JlIG9yIGxlc3MpCj4gPiBkZXNjcmliZXMgYSBjb25zaXN0 ZW50IGludGVyZmFjZSB0byB1c2Vyc3BhY2UgYWNyb3NzIGxvdHMgb2YgZGlmZmVyZW50Cj4gPiB0 eXBlcyBvZiBkZXZpY2VzLgo+ID4gCj4gPiBBIGxvdCBvZiB0aGVzZSBvbGRlciBkcml2ZXJzIGlu IHN0YWdpbmcgaW52b2x2ZSBhIGdvb2QgZGVhbCBvZiBBQkkgdGhhdAo+ID4gd2FzIG5vdCByZXZp ZXdlZCBvciBkaXNjdXNzZWQuICBUaGF0IGlzIG9uZSBvZiB0aGUgYmlnZ2VzdCByZWFzb25zIHdl Cj4gPiBkaWRuJ3QgdGFrZSB0aGVtIG91dCBvZiBzdGFnaW5nIGluIHRoZSBmaXJzdCBwbGFjZS4K PiA+IAo+ID4gSW4gb3JkZXIgZm9yIGdlbmVyaWMgdXNlcnNwYWNlIHByb2dyYW1zIHRvIGhhdmUg YW55IGlkZWEgd2hhdCB0byBkbwo+ID4gd2l0aCB0aGVzZSBkZXZpY2VzIHRoaXMgYWxsIG5lZWRz IHRvIGJlIGZpeGVkLgo+ID4gCj4gPiBUaGVyZSBtYXkgd2VsbCBiZSBjYXNlcyB3aGVyZSB3ZSBu ZWVkIHRvIGV4cGFuZCB0aGUgZXhpc3RpbmcgQUJJIHRvCj4gPiBjb3ZlciBuZXcgdGhpbmdzLiAg IFRoYXQncyBmaW5lLCBidXQgaXQgaGFzIHRvIGJlIGRvbmUgd2l0aCBmdWxsCj4gPiByZXZpZXcg b2YgdGhlIHJlbGV2YW50IGRvY3VtZW50YXRpb24gcGF0Y2hlcy4KPiA+IAo+ID4gSW5jaWRlbnRh bGx5IGlmIHlvdSB3YW50IGFuIGVhc3kgZHJpdmVyIHRvIHdvcmsgb24gbW92aW5nIG91dCBvZiBz dGFnaW5nCj4gPiB0aGVuIGZpcnN0IHRoaW5nIHRvIGRvIGlzIHRvIGNvbXBhcmUgd2hhdCBpdCBz aG93cyB0byB1c2Vyc3BhY2Ugd2l0aCB0aGVzZQo+ID4gZG9jcy4gIElmIGl0J3MgdG90YWxseSBk aWZmZXJlbnQgdGhlbiB5b3UgaGF2ZSBhIGJpZyBqb2Igb24geW91ciBoYW5kcwo+ID4gYXMgb2Z0 ZW4gQUJJIGNhbiB0YWtlIGEgbG90IG9mIGRpc2N1c3Npb24gYW5kIGEgbG9uZyB0aW1lIHRvIGVz dGFibGlzaAo+ID4gYSBjb25zZW5zdXMuCj4gPiAKPiA+IEpvbmF0aGFuCj4gPiAKPiA+ICAgCj4g Pj4gCj4gPj4gVGhhbmtzIDopCj4gPj4gICAKPiA+Pj4gQXBwbGllZCB0byB0aGUgdG9ncmVnIGJy YW5jaCBvZiBpaW8uZ2l0IGFuZCBwdXNoZWQgb3V0IGFzIHRlc3RpbmcKPiA+Pj4gZm9yIHRoZSBh dXRvYnVpbGRlcnMgdG8gcGxheSB3aXRoIGl0Lgo+ID4+PiAKPiA+Pj4gSSBhbHNvIGFkZGVkIHRo ZSByZW1vdmFsIG9mIHRoZSBoZWFkZXIgZGVmaW5lIHdoaWNoIGlzIG5vCj4gPj4+IGxvbmdlciB1 c2VkLgo+ID4+PiAKPiA+Pj4gUGxlYXNlIG5vdGUsIGZvbGxvd2luZyBkaXNjdXNzaW9ucyB3aXRo IE1pY2hhZWwsIEkgYW0gZ29pbmcgdG8gc2VuZAo+ID4+PiBhbiBlbWFpbCBhbm5vdW5jaW5nIGFu IGludGVudCB0byBkcm9wIHRoZXNlIG1ldGVyIGRyaXZlcnMgbmV4dAo+ID4+PiBjeWNsZSB1bmxl c3Mgc29tZW9uZSBjYW4gcHJvdmlkZSB0ZXN0aW5nIGZvciBhbnkgYXR0ZW1wdCB0bwo+ID4+PiBt b3ZlIHRoZW0gb3V0IG9mIHN0YWdpbmcuICBJJ20gc3RpbGwgdGFraW5nIHBhdGNoZXMgb24gdGhl IGJhc2lzCj4gPj4+IHRoYXQgJ21pZ2h0JyBoYXBwZW4gLSBidXQgSSB3b3VsZG4ndCBmb2N1cyBv biB0aGVzZSB1bnRpbCB3ZQo+ID4+PiBoYXZlIHNvbWUgY2VydGFpbnR5IG9uIHdoZXRoZXIgdGhl eSB3aWxsIGJlIGFyb3VuZCBsb25nIHRlcm0hCj4gPj4+IAo+ID4+PiBKb25hdGhhbgo+ID4+PiAg IAo+ID4+Pj4gLS0tCj4gPj4+PiBkcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuYyB8 IDE4ICsrKysrKysrKystLS0tLS0tLQo+ID4+Pj4gZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9h ZGU3NzU5LmMgfCAxOCArKysrKysrKysrLS0tLS0tLS0KPiA+Pj4+IDIgZmlsZXMgY2hhbmdlZCwg MjAgaW5zZXJ0aW9ucygrKSwgMTYgZGVsZXRpb25zKC0pCj4gPj4+PiAKPiA+Pj4+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuYyBiL2RyaXZlcnMvc3RhZ2lu Zy9paW8vbWV0ZXIvYWRlNzc1My5jCj4gPj4+PiBpbmRleCBjNDRlYjU3N2RjMzUuLjI3NWU4ZGZm ZjgzNiAxMDA2NDQKPiA+Pj4+IC0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1 My5jCj4gPj4+PiArKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuYwo+ID4+ Pj4gQEAgLTM4OCwxNCArMzg4LDE2IEBAIHN0YXRpYyBJSU9fREVWX0FUVFJfVlBFUklPRCgwNDQ0 LAo+ID4+Pj4gCQlhZGU3NzUzX3JlYWRfMTZiaXQsCj4gPj4+PiAJCU5VTEwsCj4gPj4+PiAJCUFE RTc3NTNfUEVSSU9EKTsKPiA+Pj4+IC1zdGF0aWMgSUlPX0RFVl9BVFRSX0NIX09GRigxLCAwNjQ0 LAo+ID4+Pj4gLQkJYWRlNzc1M19yZWFkXzhiaXQsCj4gPj4+PiAtCQlhZGU3NzUzX3dyaXRlXzhi aXQsCj4gPj4+PiAtCQlBREU3NzUzX0NIMU9TKTsKPiA+Pj4+IC1zdGF0aWMgSUlPX0RFVl9BVFRS X0NIX09GRigyLCAwNjQ0LAo+ID4+Pj4gLQkJYWRlNzc1M19yZWFkXzhiaXQsCj4gPj4+PiAtCQlh ZGU3NzUzX3dyaXRlXzhiaXQsCj4gPj4+PiAtCQlBREU3NzUzX0NIMk9TKTsKPiA+Pj4+ICsKPiA+ Pj4+ICtzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGNob2ZmXzEsIDA2NDQsCj4gPj4+PiArCQkJYWRl Nzc1M19yZWFkXzhiaXQsCj4gPj4+PiArCQkJYWRlNzc1M193cml0ZV84Yml0LAo+ID4+Pj4gKwkJ CUFERTc3NTNfQ0gxT1MpOwo+ID4+Pj4gKwo+ID4+Pj4gK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIo Y2hvZmZfMiwgMDY0NCwKPiA+Pj4+ICsJCQlhZGU3NzUzX3JlYWRfOGJpdCwKPiA+Pj4+ICsJCQlh ZGU3NzUzX3dyaXRlXzhiaXQsCj4gPj4+PiArCQkJQURFNzc1M19DSDJPUyk7Cj4gPj4+PiAKPiA+ Pj4+IHN0YXRpYyBpbnQgYWRlNzc1M19zZXRfaXJxKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBl bmFibGUpCj4gPj4+PiB7Cj4gPj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9t ZXRlci9hZGU3NzU5LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuYwo+ID4+ Pj4gaW5kZXggMWRlY2IyYjhhZmFiLi5jMDc4Yjc3MGZhNTMgMTAwNjQ0Cj4gPj4+PiAtLS0gYS9k cml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuYwo+ID4+Pj4gKysrIGIvZHJpdmVycy9z dGFnaW5nL2lpby9tZXRlci9hZGU3NzU5LmMKPiA+Pj4+IEBAIC0zMjgsMTQgKzMyOCwxNiBAQCBz dGF0aWMgSUlPX0RFVl9BVFRSX0FDVElWRV9QT1dFUl9HQUlOKDA2NDQsCj4gPj4+PiAJCWFkZTc3 NTlfcmVhZF8xNmJpdCwKPiA+Pj4+IAkJYWRlNzc1OV93cml0ZV8xNmJpdCwKPiA+Pj4+IAkJQURF Nzc1OV9BUEdBSU4pOwo+ID4+Pj4gLXN0YXRpYyBJSU9fREVWX0FUVFJfQ0hfT0ZGKDEsIDA2NDQs Cj4gPj4+PiAtCQlhZGU3NzU5X3JlYWRfOGJpdCwKPiA+Pj4+IC0JCWFkZTc3NTlfd3JpdGVfOGJp dCwKPiA+Pj4+IC0JCUFERTc3NTlfQ0gxT1MpOwo+ID4+Pj4gLXN0YXRpYyBJSU9fREVWX0FUVFJf Q0hfT0ZGKDIsIDA2NDQsCj4gPj4+PiAtCQlhZGU3NzU5X3JlYWRfOGJpdCwKPiA+Pj4+IC0JCWFk ZTc3NTlfd3JpdGVfOGJpdCwKPiA+Pj4+IC0JCUFERTc3NTlfQ0gyT1MpOwo+ID4+Pj4gKwo+ID4+ Pj4gK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoY2hvZmZfMSwgMDY0NCwKPiA+Pj4+ICsJCQlhZGU3 NzU5X3JlYWRfOGJpdCwKPiA+Pj4+ICsJCQlhZGU3NzU5X3dyaXRlXzhiaXQsCj4gPj4+PiArCQkJ QURFNzc1OV9DSDFPUyk7Cj4gPj4+PiArCj4gPj4+PiArc3RhdGljIElJT19ERVZJQ0VfQVRUUihj aG9mZl8yLCAwNjQ0LAo+ID4+Pj4gKwkJCWFkZTc3NTlfcmVhZF84Yml0LAo+ID4+Pj4gKwkJCWFk ZTc3NTlfd3JpdGVfOGJpdCwKPiA+Pj4+ICsJCQlBREU3NzU5X0NIMk9TKTsKPiA+Pj4+IAo+ID4+ Pj4gc3RhdGljIGludCBhZGU3NzU5X3NldF9pcnEoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVu YWJsZSkKPiA+Pj4+IHsgICAgCj4gPj4+ICAgCj4gPj4gLS0KPiA+PiBUbyB1bnN1YnNjcmliZSBm cm9tIHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtaWlvIiBpbgo+ ID4+IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnCj4g Pj4gTW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRv bW8taW5mby5odG1sICAKPiA+IAo+ID4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KPiA+IGRldmVsIG1haWxpbmcgbGlzdAo+ID4gZGV2ZWxAbGludXhkcml2 ZXJwcm9qZWN0Lm9yZwo+ID4gaHR0cDovL2RyaXZlcmRldi5saW51eGRyaXZlcnByb2plY3Qub3Jn L21haWxtYW4vbGlzdGluZm8vZHJpdmVyZGV2LWRldmVsICAKPiAKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRldmVsIG1haWxpbmcgbGlzdApkZXZlbEBs aW51eGRyaXZlcnByb2plY3Qub3JnCmh0dHA6Ly9kcml2ZXJkZXYubGludXhkcml2ZXJwcm9qZWN0 Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaXZlcmRldi1kZXZlbAo=