From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4F94AC433EF for ; Thu, 14 Jul 2022 07:07:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229928AbiGNHHV (ORCPT ); Thu, 14 Jul 2022 03:07:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45602 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229817AbiGNHHU (ORCPT ); Thu, 14 Jul 2022 03:07:20 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 64DA72CCBD for ; Thu, 14 Jul 2022 00:07:18 -0700 (PDT) Received: from ptx.hi.pengutronix.de ([2001:67c:670:100:1d::c0]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oBswF-0007Pf-PS; Thu, 14 Jul 2022 09:07:07 +0200 Received: from ore by ptx.hi.pengutronix.de with local (Exim 4.92) (envelope-from ) id 1oBswD-0000Nz-Mq; Thu, 14 Jul 2022 09:07:05 +0200 Date: Thu, 14 Jul 2022 09:07:05 +0200 From: Oleksij Rempel To: Francesco Dolcini Cc: Wolfram Sang , Oleksandr Suvorov , Uwe =?utf-8?Q?Kleine-K=C3=B6nig?= , Marco Felsch , Oleksij Rempel , Pengutronix Kernel Team , Shawn Guo , Sascha Hauer , Fabio Estevam , NXP Linux Team , linux-i2c@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v1] i2c: imx: Retry transfer on transient failure Message-ID: <20220714070705.GH24373@pengutronix.de> References: <20220712082415.319738-1-francesco.dolcini@toradex.com> <20220712090514.lt4r4dvlkn55jf2o@pengutronix.de> <20220712100504.GB319880@francesco-nb.int.toradex.com> <20220713115750.GA504159@francesco-nb.int.toradex.com> <20220713132437.GF24373@pengutronix.de> <20220713134329.GA495155@francesco-nb.int.toradex.com> <20220713155723.GG24373@pengutronix.de> <20220713202541.GA532546@francesco-nb.int.toradex.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20220713202541.GA532546@francesco-nb.int.toradex.com> X-Sent-From: Pengutronix Hildesheim X-URL: http://www.pengutronix.de/ X-Accept-Language: de,en X-Accept-Content-Type: text/plain User-Agent: Mutt/1.10.1 (2018-07-13) X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::c0 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-i2c@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org Hello Francesco, On Wed, Jul 13, 2022 at 10:25:41PM +0200, Francesco Dolcini wrote: > Hello Oleksij, > > On Wed, Jul 13, 2022 at 05:57:23PM +0200, Oleksij Rempel wrote: > > On Wed, Jul 13, 2022 at 03:43:29PM +0200, Francesco Dolcini wrote: > > > On Wed, Jul 13, 2022 at 03:24:37PM +0200, Oleksij Rempel wrote: > > > > On Wed, Jul 13, 2022 at 01:57:50PM +0200, Francesco Dolcini wrote: > > > > > + oleksandr.suvorov@foundries.io > > > > > > > > > > Hello all, > > > > > > > > > > On Tue, Jul 12, 2022 at 12:05:04PM +0200, Francesco Dolcini wrote: > > > > > > On Tue, Jul 12, 2022 at 11:05:14AM +0200, Uwe Kleine-König wrote: > > > > > > > In which situations does this help? Please mention these in the > > > > > > > commit log. > > > > > > I'll do > > > > > > > > > > I did some investigation on this, unfortunately we have this change > > > > > laying around since 1 year, it was written by Oleksandr, and in the > > > > > meantime he moved to a new company. I added him to this email thread, so > > > > > he can comment in case he remembers more. > > > > > > > > > > We introduced this change while working on OV5640 camera sensor on an > > > > > apalis-imx6q evaluation board, without this change we had some sporadic > > > > > i2c communication issues. Unfortunately I do not have any better > > > > > details. > > > > > > > > > > To me looks like having some (3? 5?) retry as a default is somehow > > > > > more reasonable than to never retry, not sure if this should be > > > > > implemented as a default for all the i2c adapters. From what I was able > > > > > to see that would not be a trivial change (the retry parameter is coming > > > > > from the i2c_imx driver, there is no obvious way to have a default in > > > > > the i2c core). > > > > > > > > > > Would it work for you to keep the change as it is (just getting rid > > > > > of the useless define) and add a little bit more blurb to the commit > > > > > message to include the various comments collected so far? > > > > > > > > I assume, it is related to reset time or other reason where the camera > > > > is not responding. In this case, amount of retries would depend on I2C > > > > CLK speed and host CPU speed. > > > > > > > > > > The retry on the I2C IMX driver would trigger only on tx arbitration > > > failure, that would be the SDA being tied low by the slave in an > > > unexpected moment, correct? > > > > If it is the case, it is better to understand why. Are there some > > special timing requirements? > > > > > If the camera does not respond it will just > > > not ack the transaction and that would not be recovered by the retry > > > in this change. > > > > > > Can this just a layout/cabling issue with some noise on the SDA line? We > > > are talking about somehow long board to board cables with various > > > signals on it. This is an issue that we had for sure in the past, > > > however I do have record of this only on a different camera. > > > > If it is cabling issue, then I would take a look at pinmux > > configuration. If it is so noisy, that some errors are expected, then it would > > affect camera configuration as well. I mean, system is potentially > > writing trash to the config register. > > I do not think that this is possible in the way you defined, if SDA is > low when the master is driving it high the master will just stop > transmitting and an arbitration lost interrupt is raised. I guess this > is just the same for any I2C controller, anyway is defined in > `35.7.4 I2C Status Register (I2Cx_I2SR)` in the i.MX6QDL reference manual. > > I guess it would be still theoretically possible that the master read > garbage from the slave, I'm not aware of any mechanism to avoid it. > > Said that I do not have more details, for some unfortunate reason this > change was laying in our downstream kernel since too long. > > Anyway, let's look at this in a different way, from what I was able to > understand digging on this topic retrying on I2C arbitration lost is > just the normal thing to do and the I2C core provides support for this > since ever, the comment in i2c-core is > /* Retry automatically on arbitration loss */. > > Setting retries to something like 3 or 5 is just very common, various > drivers have this value in the first commit or had it added later on (as > Uwe already commented) > > To me it seems like the most sensible thing to do, is there any reason > why the i2c_imx driver should not do it? Here we go: https://www.i2c-bus.org/i2c-primer/analysing-obscure-problems/master-reports-arbitration-lost/ "Possible reasons are the same as the ones described in “No Acknowledge >From I2C Slave”" So, lets see what it can be: https://www.i2c-bus.org/i2c-primer/analysing-obscure-problems/no-acknowledge-from-i2c-slave/ "Possible reasons are: - The I2C slave could not correctly interpret the data on SDA because the SDA high or low-level voltages do not reach its appropriate input thresholds. - The I2C slave missed an SCL cycle because the SCL high or low-level voltages do not reach its appropriate input thresholds. - The I2C slave accidently interpreted a spike etc. as an SCL cycle. With adequate serial resistors between master and slave, an analog shot of the signals at the slave’s SDA and SCL pins provides a clue whether the slave acknowledges and to which SCL clock pulse. The different SDA low levels due to the serial resistor make it possible to distinguish acknowledges from the slave from data bits from the master. " I interpret it, that setting retry count on any non zero value is an workaround for brocken circuit. It means, on HW development phase we won't be able to detect HW issue, if retry count will be not 0. IMHO, it board specific configuration and should not be set by driver. Regards, Oleksij -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2C7FCC43334 for ; Thu, 14 Jul 2022 07:08:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc: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=FYhrGkppan+r4UqDaWyFJxANWczPtscIRCdxuCxKaFY=; b=4Wz6+bUUe1Escx nEUPvfOhjKFrO+Av3GWMMe4sW//1QUr74u4lROvpoGg1xFjJ8Eodewn4o1o68mSbR4Mj5TEVqig69 ttpRRRfJ5jl3/850UF6HiDNfozDWzcTuc+wxpGMPjocuRnnrJN7Lsohei7/Tb02weypFRXApR4vK6 ESL+aBE6NnyVzvF2v8C4GxaOKzjr6zTFpzVpXARSlMzgMbZBPBcAkc4F9PZuWc26a3iG9uTZQObbP YLnjDJnBcraj7ztJHZsOiDLJOKEsXVPXBe6+BvnzWAyyCCM355MPE6JerEkhVu2btzUpCAVU6eLWq wZY0wg/ZY0kJAURKodQA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oBswY-00Bg5T-CS; Thu, 14 Jul 2022 07:07:26 +0000 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oBswU-00Bg28-74 for linux-arm-kernel@lists.infradead.org; Thu, 14 Jul 2022 07:07:24 +0000 Received: from ptx.hi.pengutronix.de ([2001:67c:670:100:1d::c0]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oBswF-0007Pf-PS; Thu, 14 Jul 2022 09:07:07 +0200 Received: from ore by ptx.hi.pengutronix.de with local (Exim 4.92) (envelope-from ) id 1oBswD-0000Nz-Mq; Thu, 14 Jul 2022 09:07:05 +0200 Date: Thu, 14 Jul 2022 09:07:05 +0200 From: Oleksij Rempel To: Francesco Dolcini Cc: Wolfram Sang , Oleksandr Suvorov , Uwe =?utf-8?Q?Kleine-K=C3=B6nig?= , Marco Felsch , Oleksij Rempel , Pengutronix Kernel Team , Shawn Guo , Sascha Hauer , Fabio Estevam , NXP Linux Team , linux-i2c@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v1] i2c: imx: Retry transfer on transient failure Message-ID: <20220714070705.GH24373@pengutronix.de> References: <20220712082415.319738-1-francesco.dolcini@toradex.com> <20220712090514.lt4r4dvlkn55jf2o@pengutronix.de> <20220712100504.GB319880@francesco-nb.int.toradex.com> <20220713115750.GA504159@francesco-nb.int.toradex.com> <20220713132437.GF24373@pengutronix.de> <20220713134329.GA495155@francesco-nb.int.toradex.com> <20220713155723.GG24373@pengutronix.de> <20220713202541.GA532546@francesco-nb.int.toradex.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20220713202541.GA532546@francesco-nb.int.toradex.com> X-Sent-From: Pengutronix Hildesheim X-URL: http://www.pengutronix.de/ X-Accept-Language: de,en X-Accept-Content-Type: text/plain User-Agent: Mutt/1.10.1 (2018-07-13) X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::c0 X-SA-Exim-Mail-From: ore@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-arm-kernel@lists.infradead.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220714_000722_432614_7F85EA75 X-CRM114-Status: GOOD ( 58.70 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGVsbG8gRnJhbmNlc2NvLAoKT24gV2VkLCBKdWwgMTMsIDIwMjIgYXQgMTA6MjU6NDFQTSArMDIw MCwgRnJhbmNlc2NvIERvbGNpbmkgd3JvdGU6Cj4gSGVsbG8gT2xla3NpaiwKPiAKPiBPbiBXZWQs IEp1bCAxMywgMjAyMiBhdCAwNTo1NzoyM1BNICswMjAwLCBPbGVrc2lqIFJlbXBlbCB3cm90ZToK PiA+IE9uIFdlZCwgSnVsIDEzLCAyMDIyIGF0IDAzOjQzOjI5UE0gKzAyMDAsIEZyYW5jZXNjbyBE b2xjaW5pIHdyb3RlOgo+ID4gPiBPbiBXZWQsIEp1bCAxMywgMjAyMiBhdCAwMzoyNDozN1BNICsw MjAwLCBPbGVrc2lqIFJlbXBlbCB3cm90ZToKPiA+ID4gPiBPbiBXZWQsIEp1bCAxMywgMjAyMiBh dCAwMTo1Nzo1MFBNICswMjAwLCBGcmFuY2VzY28gRG9sY2luaSB3cm90ZToKPiA+ID4gPiA+ICsg b2xla3NhbmRyLnN1dm9yb3ZAZm91bmRyaWVzLmlvCj4gPiA+ID4gPiAKPiA+ID4gPiA+IEhlbGxv IGFsbCwKPiA+ID4gPiA+IAo+ID4gPiA+ID4gT24gVHVlLCBKdWwgMTIsIDIwMjIgYXQgMTI6MDU6 MDRQTSArMDIwMCwgRnJhbmNlc2NvIERvbGNpbmkgd3JvdGU6Cj4gPiA+ID4gPiA+IE9uIFR1ZSwg SnVsIDEyLCAyMDIyIGF0IDExOjA1OjE0QU0gKzAyMDAsIFV3ZSBLbGVpbmUtS8O2bmlnIHdyb3Rl Ogo+ID4gPiA+ID4gPiA+IEluIHdoaWNoIHNpdHVhdGlvbnMgZG9lcyB0aGlzIGhlbHA/IFBsZWFz ZSBtZW50aW9uIHRoZXNlIGluIHRoZQo+ID4gPiA+ID4gPiA+IGNvbW1pdCBsb2cuCj4gPiA+ID4g PiA+IEknbGwgZG8KPiA+ID4gPiA+IAo+ID4gPiA+ID4gSSBkaWQgc29tZSBpbnZlc3RpZ2F0aW9u IG9uIHRoaXMsIHVuZm9ydHVuYXRlbHkgd2UgaGF2ZSB0aGlzIGNoYW5nZQo+ID4gPiA+ID4gbGF5 aW5nIGFyb3VuZCBzaW5jZSAxIHllYXIsIGl0IHdhcyB3cml0dGVuIGJ5IE9sZWtzYW5kciwgYW5k IGluIHRoZQo+ID4gPiA+ID4gbWVhbnRpbWUgaGUgbW92ZWQgdG8gYSBuZXcgY29tcGFueS4gSSBh ZGRlZCBoaW0gdG8gdGhpcyBlbWFpbCB0aHJlYWQsIHNvCj4gPiA+ID4gPiBoZSBjYW4gY29tbWVu dCBpbiBjYXNlIGhlIHJlbWVtYmVycyBtb3JlLgo+ID4gPiA+ID4gCj4gPiA+ID4gPiBXZSBpbnRy b2R1Y2VkIHRoaXMgY2hhbmdlIHdoaWxlIHdvcmtpbmcgb24gT1Y1NjQwIGNhbWVyYSBzZW5zb3Ig b24gYW4KPiA+ID4gPiA+IGFwYWxpcy1pbXg2cSBldmFsdWF0aW9uIGJvYXJkLCB3aXRob3V0IHRo aXMgY2hhbmdlIHdlIGhhZCBzb21lIHNwb3JhZGljCj4gPiA+ID4gPiBpMmMgY29tbXVuaWNhdGlv biBpc3N1ZXMuIFVuZm9ydHVuYXRlbHkgSSBkbyBub3QgaGF2ZSBhbnkgYmV0dGVyCj4gPiA+ID4g PiBkZXRhaWxzLgo+ID4gPiA+ID4gCj4gPiA+ID4gPiBUbyBtZSBsb29rcyBsaWtlIGhhdmluZyBz b21lICgzPyA1PykgcmV0cnkgYXMgYSBkZWZhdWx0IGlzIHNvbWVob3cKPiA+ID4gPiA+IG1vcmUg cmVhc29uYWJsZSB0aGFuIHRvIG5ldmVyIHJldHJ5LCBub3Qgc3VyZSBpZiB0aGlzIHNob3VsZCBi ZQo+ID4gPiA+ID4gaW1wbGVtZW50ZWQgYXMgYSBkZWZhdWx0IGZvciBhbGwgdGhlIGkyYyBhZGFw dGVycy4gRnJvbSB3aGF0IEkgd2FzIGFibGUKPiA+ID4gPiA+IHRvIHNlZSB0aGF0IHdvdWxkIG5v dCBiZSBhIHRyaXZpYWwgY2hhbmdlICh0aGUgcmV0cnkgcGFyYW1ldGVyIGlzIGNvbWluZwo+ID4g PiA+ID4gZnJvbSB0aGUgaTJjX2lteCBkcml2ZXIsIHRoZXJlIGlzIG5vIG9idmlvdXMgd2F5IHRv IGhhdmUgYSBkZWZhdWx0IGluCj4gPiA+ID4gPiB0aGUgaTJjIGNvcmUpLgo+ID4gPiA+ID4gCj4g PiA+ID4gPiBXb3VsZCBpdCB3b3JrIGZvciB5b3UgdG8ga2VlcCB0aGUgY2hhbmdlIGFzIGl0IGlz IChqdXN0IGdldHRpbmcgcmlkCj4gPiA+ID4gPiBvZiB0aGUgdXNlbGVzcyBkZWZpbmUpIGFuZCBh ZGQgYSBsaXR0bGUgYml0IG1vcmUgYmx1cmIgdG8gdGhlIGNvbW1pdAo+ID4gPiA+ID4gbWVzc2Fn ZSB0byBpbmNsdWRlIHRoZSB2YXJpb3VzIGNvbW1lbnRzIGNvbGxlY3RlZCBzbyBmYXI/Cj4gPiA+ ID4gCj4gPiA+ID4gSSBhc3N1bWUsIGl0IGlzIHJlbGF0ZWQgdG8gcmVzZXQgdGltZSBvciBvdGhl ciByZWFzb24gd2hlcmUgdGhlIGNhbWVyYQo+ID4gPiA+IGlzIG5vdCByZXNwb25kaW5nLiBJbiB0 aGlzIGNhc2UsIGFtb3VudCBvZiByZXRyaWVzIHdvdWxkIGRlcGVuZCBvbiBJMkMKPiA+ID4gPiBD TEsgc3BlZWQgYW5kIGhvc3QgQ1BVIHNwZWVkLgo+ID4gPiA+IAo+ID4gPiAKPiA+ID4gVGhlIHJl dHJ5IG9uIHRoZSBJMkMgSU1YIGRyaXZlciB3b3VsZCB0cmlnZ2VyIG9ubHkgb24gdHggYXJiaXRy YXRpb24KPiA+ID4gZmFpbHVyZSwgdGhhdCB3b3VsZCBiZSB0aGUgU0RBIGJlaW5nIHRpZWQgbG93 IGJ5IHRoZSBzbGF2ZSBpbiBhbgo+ID4gPiB1bmV4cGVjdGVkIG1vbWVudCwgY29ycmVjdD8gCj4g PiAKPiA+IElmIGl0IGlzIHRoZSBjYXNlLCBpdCBpcyBiZXR0ZXIgdG8gdW5kZXJzdGFuZCB3aHku IEFyZSB0aGVyZSBzb21lCj4gPiBzcGVjaWFsIHRpbWluZyByZXF1aXJlbWVudHM/Cj4gPiAKPiA+ ID4gSWYgdGhlIGNhbWVyYSBkb2VzIG5vdCByZXNwb25kIGl0IHdpbGwganVzdAo+ID4gPiBub3Qg YWNrIHRoZSB0cmFuc2FjdGlvbiBhbmQgdGhhdCB3b3VsZCBub3QgYmUgcmVjb3ZlcmVkIGJ5IHRo ZSByZXRyeQo+ID4gPiBpbiB0aGlzIGNoYW5nZS4KPiA+ID4gCj4gPiA+IENhbiB0aGlzIGp1c3Qg YSBsYXlvdXQvY2FibGluZyBpc3N1ZSB3aXRoIHNvbWUgbm9pc2Ugb24gdGhlIFNEQSBsaW5lPyBX ZQo+ID4gPiBhcmUgdGFsa2luZyBhYm91dCBzb21laG93IGxvbmcgYm9hcmQgdG8gYm9hcmQgY2Fi bGVzIHdpdGggdmFyaW91cwo+ID4gPiBzaWduYWxzIG9uIGl0LiBUaGlzIGlzIGFuIGlzc3VlIHRo YXQgd2UgaGFkIGZvciBzdXJlIGluIHRoZSBwYXN0LAo+ID4gPiBob3dldmVyIEkgZG8gaGF2ZSBy ZWNvcmQgb2YgdGhpcyBvbmx5IG9uIGEgZGlmZmVyZW50IGNhbWVyYS4KPiA+IAo+ID4gSWYgaXQg aXMgY2FibGluZyBpc3N1ZSwgdGhlbiBJIHdvdWxkIHRha2UgYSBsb29rIGF0IHBpbm11eAo+ID4g Y29uZmlndXJhdGlvbi4gSWYgaXQgaXMgc28gbm9pc3ksIHRoYXQgc29tZSBlcnJvcnMgYXJlIGV4 cGVjdGVkLCB0aGVuIGl0IHdvdWxkCj4gPiBhZmZlY3QgY2FtZXJhIGNvbmZpZ3VyYXRpb24gYXMg d2VsbC4gSSBtZWFuLCBzeXN0ZW0gaXMgcG90ZW50aWFsbHkKPiA+IHdyaXRpbmcgdHJhc2ggdG8g dGhlIGNvbmZpZyByZWdpc3Rlci4KPiAKPiBJIGRvIG5vdCB0aGluayB0aGF0IHRoaXMgaXMgcG9z c2libGUgaW4gdGhlIHdheSB5b3UgZGVmaW5lZCwgaWYgU0RBIGlzCj4gbG93IHdoZW4gdGhlIG1h c3RlciBpcyBkcml2aW5nIGl0IGhpZ2ggdGhlIG1hc3RlciB3aWxsIGp1c3Qgc3RvcAo+IHRyYW5z bWl0dGluZyBhbmQgYW4gYXJiaXRyYXRpb24gbG9zdCBpbnRlcnJ1cHQgaXMgcmFpc2VkLiBJIGd1 ZXNzIHRoaXMKPiBpcyBqdXN0IHRoZSBzYW1lIGZvciBhbnkgSTJDIGNvbnRyb2xsZXIsIGFueXdh eSBpcyBkZWZpbmVkIGluCj4gYDM1LjcuNCBJMkMgU3RhdHVzIFJlZ2lzdGVyIChJMkN4X0kyU1Ip YCBpbiB0aGUgaS5NWDZRREwgcmVmZXJlbmNlIG1hbnVhbC4KPiAKPiBJIGd1ZXNzIGl0IHdvdWxk IGJlIHN0aWxsIHRoZW9yZXRpY2FsbHkgcG9zc2libGUgdGhhdCB0aGUgbWFzdGVyIHJlYWQKPiBn YXJiYWdlIGZyb20gdGhlIHNsYXZlLCBJJ20gbm90IGF3YXJlIG9mIGFueSBtZWNoYW5pc20gdG8g YXZvaWQgaXQuCj4gCj4gU2FpZCB0aGF0IEkgZG8gbm90IGhhdmUgbW9yZSBkZXRhaWxzLCBmb3Ig c29tZSB1bmZvcnR1bmF0ZSByZWFzb24gdGhpcwo+IGNoYW5nZSB3YXMgbGF5aW5nIGluIG91ciBk b3duc3RyZWFtIGtlcm5lbCBzaW5jZSB0b28gbG9uZy4KPiAKPiBBbnl3YXksIGxldCdzIGxvb2sg YXQgdGhpcyBpbiBhIGRpZmZlcmVudCB3YXksIGZyb20gd2hhdCBJIHdhcyBhYmxlIHRvCj4gdW5k ZXJzdGFuZCBkaWdnaW5nIG9uIHRoaXMgdG9waWMgcmV0cnlpbmcgb24gSTJDIGFyYml0cmF0aW9u IGxvc3QgaXMKPiBqdXN0IHRoZSBub3JtYWwgdGhpbmcgdG8gZG8gYW5kIHRoZSBJMkMgY29yZSBw cm92aWRlcyBzdXBwb3J0IGZvciB0aGlzCj4gc2luY2UgZXZlciwgdGhlIGNvbW1lbnQgaW4gaTJj LWNvcmUgaXMKPiAvKiBSZXRyeSBhdXRvbWF0aWNhbGx5IG9uIGFyYml0cmF0aW9uIGxvc3MgKi8u Cj4gCj4gU2V0dGluZyByZXRyaWVzIHRvIHNvbWV0aGluZyBsaWtlIDMgb3IgNSBpcyBqdXN0IHZl cnkgY29tbW9uLCB2YXJpb3VzCj4gZHJpdmVycyBoYXZlIHRoaXMgdmFsdWUgaW4gdGhlIGZpcnN0 IGNvbW1pdCBvciBoYWQgaXQgYWRkZWQgbGF0ZXIgb24gKGFzCj4gVXdlIGFscmVhZHkgY29tbWVu dGVkKQo+IAo+IFRvIG1lIGl0IHNlZW1zIGxpa2UgdGhlIG1vc3Qgc2Vuc2libGUgdGhpbmcgdG8g ZG8sIGlzIHRoZXJlIGFueSByZWFzb24KPiB3aHkgdGhlIGkyY19pbXggZHJpdmVyIHNob3VsZCBu b3QgZG8gaXQ/CgpIZXJlIHdlIGdvOgpodHRwczovL3d3dy5pMmMtYnVzLm9yZy9pMmMtcHJpbWVy L2FuYWx5c2luZy1vYnNjdXJlLXByb2JsZW1zL21hc3Rlci1yZXBvcnRzLWFyYml0cmF0aW9uLWxv c3QvCiJQb3NzaWJsZSByZWFzb25zIGFyZSB0aGUgc2FtZSBhcyB0aGUgb25lcyBkZXNjcmliZWQg aW4g4oCcTm8gQWNrbm93bGVkZ2UKRnJvbSBJMkMgU2xhdmXigJ0iCgpTbywgbGV0cyBzZWUgd2hh dCBpdCBjYW4gYmU6Cmh0dHBzOi8vd3d3LmkyYy1idXMub3JnL2kyYy1wcmltZXIvYW5hbHlzaW5n LW9ic2N1cmUtcHJvYmxlbXMvbm8tYWNrbm93bGVkZ2UtZnJvbS1pMmMtc2xhdmUvCiJQb3NzaWJs ZSByZWFzb25zIGFyZToKCi0gVGhlIEkyQyBzbGF2ZSBjb3VsZCBub3QgY29ycmVjdGx5IGludGVy cHJldCB0aGUgZGF0YSBvbiBTREEgYmVjYXVzZSB0aGUgU0RBCiAgaGlnaCBvciBsb3ctbGV2ZWwg dm9sdGFnZXMgZG8gbm90IHJlYWNoIGl0cyBhcHByb3ByaWF0ZSBpbnB1dAogIHRocmVzaG9sZHMu Ci0gVGhlIEkyQyBzbGF2ZSBtaXNzZWQgYW4gU0NMIGN5Y2xlIGJlY2F1c2UgdGhlIFNDTCBoaWdo IG9yIGxvdy1sZXZlbCB2b2x0YWdlcwogIGRvIG5vdCByZWFjaCBpdHMgYXBwcm9wcmlhdGUgaW5w dXQgdGhyZXNob2xkcy4KLSBUaGUgSTJDIHNsYXZlIGFjY2lkZW50bHkgaW50ZXJwcmV0ZWQgYSBz cGlrZSBldGMuIGFzIGFuIFNDTCBjeWNsZS4KCldpdGggYWRlcXVhdGUgc2VyaWFsIHJlc2lzdG9y cyBiZXR3ZWVuIG1hc3RlciBhbmQgc2xhdmUsIGFuIGFuYWxvZyBzaG90Cm9mIHRoZSBzaWduYWxz IGF0IHRoZSBzbGF2ZeKAmXMgU0RBIGFuZCBTQ0wgcGlucyBwcm92aWRlcyBhIGNsdWUgd2hldGhl cgp0aGUgc2xhdmUgYWNrbm93bGVkZ2VzIGFuZCB0byB3aGljaCBTQ0wgY2xvY2sgcHVsc2UuIFRo ZSBkaWZmZXJlbnQgU0RBCmxvdyBsZXZlbHMgZHVlIHRvIHRoZSBzZXJpYWwgcmVzaXN0b3IgbWFr ZSBpdCBwb3NzaWJsZSB0byBkaXN0aW5ndWlzaAphY2tub3dsZWRnZXMgZnJvbSB0aGUgc2xhdmUg ZnJvbSBkYXRhIGJpdHMgZnJvbSB0aGUgbWFzdGVyLiAiCgpJIGludGVycHJldCBpdCwgdGhhdCBz ZXR0aW5nIHJldHJ5IGNvdW50IG9uIGFueSBub24gemVybyB2YWx1ZSBpcyBhbgp3b3JrYXJvdW5k IGZvciBicm9ja2VuIGNpcmN1aXQuIEl0IG1lYW5zLCBvbiBIVyBkZXZlbG9wbWVudCBwaGFzZSB3 ZQp3b24ndCBiZSBhYmxlIHRvIGRldGVjdCBIVyBpc3N1ZSwgaWYgcmV0cnkgY291bnQgd2lsbCBi ZSBub3QgMC4KCklNSE8sIGl0IGJvYXJkIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gYW5kIHNob3Vs ZCBub3QgYmUgc2V0IGJ5IGRyaXZlci4KClJlZ2FyZHMsCk9sZWtzaWoKLS0gClBlbmd1dHJvbml4 IGUuSy4gICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8ClN0ZXVlcndhbGRlciBTdHIuIDIxICAgICAgICAgICAgICAgICAgICAgICB8IGh0dHA6 Ly93d3cucGVuZ3V0cm9uaXguZGUvICB8CjMxMTM3IEhpbGRlc2hlaW0sIEdlcm1hbnkgICAgICAg ICAgICAgICAgICB8IFBob25lOiArNDktNTEyMS0yMDY5MTctMCAgICB8CkFtdHNnZXJpY2h0IEhp bGRlc2hlaW0sIEhSQSAyNjg2ICAgICAgICAgICB8IEZheDogICArNDktNTEyMS0yMDY5MTctNTU1 NSB8CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51 eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVh ZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1h cm0ta2VybmVsCg==