From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from galahad.ideasonboard.com ([185.26.127.97]:37538 "EHLO galahad.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965251AbcKNXjm (ORCPT ); Mon, 14 Nov 2016 18:39:42 -0500 From: Laurent Pinchart To: dri-devel@lists.freedesktop.org Cc: Rob Herring , "devicetree@vger.kernel.org" , Laurent Pinchart , "open list:MEDIA DRIVERS FOR RENESAS - FCP" , Tomi Valkeinen , "linux-media@vger.kernel.org" Subject: Re: [PATCH 1/2] devicetree/bindings: display: Add bindings for LVDS panels Date: Tue, 15 Nov 2016 01:39:47 +0200 Message-ID: <3216002.PGtbontoS9@avalon> In-Reply-To: <1488637.i0jADhlNmg@avalon> References: <1475598210-26857-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <1488637.i0jADhlNmg@avalon> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-renesas-soc-owner@vger.kernel.org List-ID: Hi Rob, Ping ? On Monday 17 Oct 2016 15:42:56 Laurent Pinchart wrote: > On Friday 14 Oct 2016 07:40:14 Rob Herring wrote: > > On Sun, Oct 9, 2016 at 11:33 AM, Laurent Pinchart wrote: > >> On Saturday 08 Oct 2016 20:29:39 Rob Herring wrote: > >>> On Tue, Oct 04, 2016 at 07:23:29PM +0300, Laurent Pinchart wrote: > >>>> LVDS is a physical layer specification defined in ANSI/TIA/EIA-644-A. > >>>> Multiple incompatible data link layers have been used over time to > >>>> transmit image data to LVDS panels. This binding supports display > >>>> panels compatible with the JEIDA-59-1999, Open-LDI and VESA SWPG > >>>> specifications. > >>>> > >>>> Signed-off-by: Laurent Pinchart > >>>> > >>>> --- > >>>> > >>>> .../bindings/display/panel/panel-lvds.txt | 119 ++++++++++++ > >>>> 1 file changed, 119 insertions(+) > >>>> create mode 100644 > >>>> Documentation/devicetree/bindings/display/panel/panel-lvds.txt> > >>>> > >>>> diff --git > >>>> a/Documentation/devicetree/bindings/display/panel/panel-lvds.txt > >>>> b/Documentation/devicetree/bindings/display/panel/panel-lvds.txt > >>>> new file mode 100644 > >>>> index 000000000000..250861f2673e > >>>> --- /dev/null > >>>> +++ b/Documentation/devicetree/bindings/display/panel/panel-lvds.txt > >>>> @@ -0,0 +1,119 @@ > >>>> +Generic LVDS Panel > >>>> +================== > >>>> + > >>>> +LVDS is a physical layer specification defined in ANSI/TIA/EIA-644-A. > >>>> Multiple > >>>> +incompatible data link layers have been used over time to transmit > >>>> image data > >>>> +to LVDS panels. This bindings supports display panels compatible with > >>>> the > >>>> +following specifications. > >>>> + > >>>> +[JEIDA] "Digital Interface Standards for Monitor", JEIDA-59-1999, > >>>> February > >>>> +1999 (Version 1.0), Japan Electronic Industry Development Association > >>>> (JEIDA) > >>>> +[LDI] "Open LVDS Display Interface", May 1999 (Version 0.95), > >>>> National > >>>> +Semiconductor > >>>> +[VESA] "VESA Notebook Panel Standard", October 2007 (Version 1.0), > >>>> Video > >>>> +Electronics Standards Association (VESA) > >>>> + > >>>> +Device compatible with those specifications have been marketed under > >>>> the > >>>> +FPD-Link and FlatLink brands. > >>>> + > >>>> + > >>>> +Required properties: > >>>> +- compatible: shall contain "panel-lvds" > >>> > >>> Maybe as a fallback, but on its own, no way. > >> > >> Which brings an interesting question: when designing generic DT > >> bindings, what's the rule regarding > > Looks like I forgot part of the question. I meant to ask what is the rule > regarding usage of more precise compatible strings ? > > For instance (but perhaps not the best example), the > input/rotary-encoder.txt bindings define a "rotary-encoder" compatible > string, with no other bindings defining more precise compatible strings for > the exact rotary encoder model. When it comes to panels I believe it makes > sense to define model-specific compatible strings even if they're unused by > drivers. I'm however wondering what the rule is there, and where those > device-specific compatible strings should be defined. I'd like to avoid > using one file per panel model as done today for the simple-panel bindings. > > > Call it "simple" so I can easily NAK it. :) > > > > Define a generic structure, not a single binding trying to serve all. > > > >>> > +- width-mm: panel display width in millimeters > >>> > +- height-mm: panel display height in millimeters > >>> > >>> This is already documented for all panels IIRC. > >> > >> Note that this DT binding has nothing to do with the simple-panel > >> binding. It is instead similar to the panel-dpi and panel-dsi-cm bindings > >> (which currently don't but should specify the panel size in DT). The LVDS > >> panel driver will *not* include any panel-specific information such as > >> size or timings, these are specified in DT. > > > > The panel bindings aren't really different. The biggest difference was > > location in the tree, but we now generally allow panels to be either a > > child of the LCD controller or connected with OF graph. We probably > > need to work on restructuring the panel bindings a bit. We should have > > an inheritance with a base panel binding of things like size, label, > > graph, backlight, etc, then perhaps an interface specific bindings for > > LVDS, DSI, and parallel, then a panel specific binding. With this the > > panel specific binding is typically just a compatible string and which > > inherited properties apply to it. > > That sounds good to me, but we have multiple models for panel bindings. > > As you mentioned panels can be referenced through an LCD controller node > property containing a phandle to the panel node, or through OF graph. That's > a situation we have today, and we need to keep supporting both (at least > for existing panels, perhaps not for the new ones). > > Another difference is how to express panel data such as size and timings. > The simple-panel DT bindings don't contain such data and expects the > drivers to contain a table of panel data for all models supported, while > the DPI, DSI and now the proposed LVDS panel bindings contain properties > for panel data. > > How would you like to reconcile all that ? > > >>>> +- data-mapping: the color signals mapping order, "jeida-18", > >>>> "jeida-24" > >>>> + or "vesa-24" > >>> > >>> Maybe this should be part of the compatible. > >> > >> I've thought about it, but given that some panels support selecting > >> between multiple modes (through a mode pin that is usually hardwired), I > >> believe a separate DT property makes sense. > > > > Okay. > > > >> Furthermore, LVDS data organization is controlled by the combination of > >> both data-mapping and data-mirror. It makes little sense from my point > >> of view to handle one as part of the compatible string and the other one > >> as a separate property. > >> > >>> > +Optional properties: > >>> > +- label: a symbolic name for the panel > >>> > >>> Could be for any panel or display connector. > >> > >> Yes, but I'm not sure to understand how that's relevant :-) > > > > Meaning it should be a common property. > > Sure. So you expect me to reorganize all the panels and connectors DT > bindings in order to get this one merged ? :-) > > >>>> +- avdd-supply: reference to the regulator that powers the panel > >>>> analog supply > >>>> +- dvdd-supply: reference to the regulator that powers the panel > >>>> digital supply > >>> > >>> Which one has to be powered on first, what voltage, and with what time > >>> in between? This is why "generic" or "simple" bindings don't work. > >> > >> The above-mentioned specifications also define connectors, pinouts and > >> power supplies, but many LVDS panels compatible with the LVDS physical > >> and data layers use a different connector with small differences in > >> power > >> supplies. > >> > >> I believe the voltage is irrelevant here, it doesn't need to be > >> controlled by the operating system. Power supplies order and timing is > >> relevant, I'll investigate the level of differences between panels. I'm > >> also fine with dropping those properties for now. > > > > Whether you have control of the supplies is dependent on the board. > > Dropping them is just puts us in the simple binding trap. The simple > > bindings start out that way and then people keep adding to them. > > Damn, you can't be fooled easily ;-) > > On a more serious note, I'd like to design the bindings in a way that > wouldn't require adding device-specific code in the driver for each panel > model, given that in most cases power supply handling will be generic. > What's your opinion about a generic power supply model that would be used > in the default case, with the option to override it with device-specific > code when needed ? > > >>>> +- data-mirror: if set, reverse the bit order on all data lanes (6 to > >>>> 0 instead > >>>> + of 0 to 6) > > > > On this one, make the name describe the order. "mirror" requires that > > I know what is normal ordering. Perhaps "data-msb-first". > > Sounds good to me, I'll use that. -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH 1/2] devicetree/bindings: display: Add bindings for LVDS panels Date: Tue, 15 Nov 2016 01:39:47 +0200 Message-ID: <3216002.PGtbontoS9@avalon> References: <1475598210-26857-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <1488637.i0jADhlNmg@avalon> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1488637.i0jADhlNmg@avalon> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: Laurent Pinchart , "devicetree@vger.kernel.org" , "open list:MEDIA DRIVERS FOR RENESAS - FCP" , Tomi Valkeinen , "linux-media@vger.kernel.org" List-Id: devicetree@vger.kernel.org SGkgUm9iLAoKUGluZyA/CgpPbiBNb25kYXkgMTcgT2N0IDIwMTYgMTU6NDI6NTYgTGF1cmVudCBQ aW5jaGFydCB3cm90ZToKPiBPbiBGcmlkYXkgMTQgT2N0IDIwMTYgMDc6NDA6MTQgUm9iIEhlcnJp bmcgd3JvdGU6Cj4gPiBPbiBTdW4sIE9jdCA5LCAyMDE2IGF0IDExOjMzIEFNLCBMYXVyZW50IFBp bmNoYXJ0IHdyb3RlOgo+ID4+IE9uIFNhdHVyZGF5IDA4IE9jdCAyMDE2IDIwOjI5OjM5IFJvYiBI ZXJyaW5nIHdyb3RlOgo+ID4+PiBPbiBUdWUsIE9jdCAwNCwgMjAxNiBhdCAwNzoyMzoyOVBNICsw MzAwLCBMYXVyZW50IFBpbmNoYXJ0IHdyb3RlOgo+ID4+Pj4gTFZEUyBpcyBhIHBoeXNpY2FsIGxh eWVyIHNwZWNpZmljYXRpb24gZGVmaW5lZCBpbiBBTlNJL1RJQS9FSUEtNjQ0LUEuCj4gPj4+PiBN dWx0aXBsZSBpbmNvbXBhdGlibGUgZGF0YSBsaW5rIGxheWVycyBoYXZlIGJlZW4gdXNlZCBvdmVy IHRpbWUgdG8KPiA+Pj4+IHRyYW5zbWl0IGltYWdlIGRhdGEgdG8gTFZEUyBwYW5lbHMuIFRoaXMg YmluZGluZyBzdXBwb3J0cyBkaXNwbGF5Cj4gPj4+PiBwYW5lbHMgY29tcGF0aWJsZSB3aXRoIHRo ZSBKRUlEQS01OS0xOTk5LCBPcGVuLUxESSBhbmQgVkVTQSBTV1BHCj4gPj4+PiBzcGVjaWZpY2F0 aW9ucy4KPiA+Pj4+IAo+ID4+Pj4gU2lnbmVkLW9mZi1ieTogTGF1cmVudCBQaW5jaGFydAo+ID4+ Pj4gPGxhdXJlbnQucGluY2hhcnQrcmVuZXNhc0BpZGVhc29uYm9hcmQuY29tPgo+ID4+Pj4gLS0t Cj4gPj4+PiAKPiA+Pj4+ICAuLi4vYmluZGluZ3MvZGlzcGxheS9wYW5lbC9wYW5lbC1sdmRzLnR4 dCAgICAgICAgICB8IDExOSArKysrKysrKysrKysKPiA+Pj4+ICAxIGZpbGUgY2hhbmdlZCwgMTE5 IGluc2VydGlvbnMoKykKPiA+Pj4+ICBjcmVhdGUgbW9kZSAxMDA2NDQKPiA+Pj4+ICBEb2N1bWVu dGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZGlzcGxheS9wYW5lbC9wYW5lbC1sdmRzLnR4dD4K PiA+Pj4+IAo+ID4+Pj4gZGlmZiAtLWdpdAo+ID4+Pj4gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRy ZWUvYmluZGluZ3MvZGlzcGxheS9wYW5lbC9wYW5lbC1sdmRzLnR4dAo+ID4+Pj4gYi9Eb2N1bWVu dGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZGlzcGxheS9wYW5lbC9wYW5lbC1sdmRzLnR4dAo+ ID4+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+Pj4+IGluZGV4IDAwMDAwMDAwMDAwMC4uMjUw ODYxZjI2NzNlCj4gPj4+PiAtLS0gL2Rldi9udWxsCj4gPj4+PiArKysgYi9Eb2N1bWVudGF0aW9u L2RldmljZXRyZWUvYmluZGluZ3MvZGlzcGxheS9wYW5lbC9wYW5lbC1sdmRzLnR4dAo+ID4+Pj4g QEAgLTAsMCArMSwxMTkgQEAKPiA+Pj4+ICtHZW5lcmljIExWRFMgUGFuZWwKPiA+Pj4+ICs9PT09 PT09PT09PT09PT09PT0KPiA+Pj4+ICsKPiA+Pj4+ICtMVkRTIGlzIGEgcGh5c2ljYWwgbGF5ZXIg c3BlY2lmaWNhdGlvbiBkZWZpbmVkIGluIEFOU0kvVElBL0VJQS02NDQtQS4KPiA+Pj4+IE11bHRp cGxlCj4gPj4+PiAraW5jb21wYXRpYmxlIGRhdGEgbGluayBsYXllcnMgaGF2ZSBiZWVuIHVzZWQg b3ZlciB0aW1lIHRvIHRyYW5zbWl0Cj4gPj4+PiBpbWFnZSBkYXRhCj4gPj4+PiArdG8gTFZEUyBw YW5lbHMuIFRoaXMgYmluZGluZ3Mgc3VwcG9ydHMgZGlzcGxheSBwYW5lbHMgY29tcGF0aWJsZSB3 aXRoCj4gPj4+PiB0aGUKPiA+Pj4+ICtmb2xsb3dpbmcgc3BlY2lmaWNhdGlvbnMuCj4gPj4+PiAr Cj4gPj4+PiArW0pFSURBXSAiRGlnaXRhbCBJbnRlcmZhY2UgU3RhbmRhcmRzIGZvciBNb25pdG9y IiwgSkVJREEtNTktMTk5OSwKPiA+Pj4+IEZlYnJ1YXJ5Cj4gPj4+PiArMTk5OSAoVmVyc2lvbiAx LjApLCBKYXBhbiBFbGVjdHJvbmljIEluZHVzdHJ5IERldmVsb3BtZW50IEFzc29jaWF0aW9uCj4g Pj4+PiAoSkVJREEpCj4gPj4+PiArW0xESV0gIk9wZW4gTFZEUyBEaXNwbGF5IEludGVyZmFjZSIs IE1heSAxOTk5IChWZXJzaW9uIDAuOTUpLAo+ID4+Pj4gTmF0aW9uYWwKPiA+Pj4+ICtTZW1pY29u ZHVjdG9yCj4gPj4+PiArW1ZFU0FdICJWRVNBIE5vdGVib29rIFBhbmVsIFN0YW5kYXJkIiwgT2N0 b2JlciAyMDA3IChWZXJzaW9uIDEuMCksCj4gPj4+PiBWaWRlbwo+ID4+Pj4gK0VsZWN0cm9uaWNz IFN0YW5kYXJkcyBBc3NvY2lhdGlvbiAoVkVTQSkKPiA+Pj4+ICsKPiA+Pj4+ICtEZXZpY2UgY29t cGF0aWJsZSB3aXRoIHRob3NlIHNwZWNpZmljYXRpb25zIGhhdmUgYmVlbiBtYXJrZXRlZCB1bmRl cgo+ID4+Pj4gdGhlCj4gPj4+PiArRlBELUxpbmsgYW5kIEZsYXRMaW5rIGJyYW5kcy4KPiA+Pj4+ ICsKPiA+Pj4+ICsKPiA+Pj4+ICtSZXF1aXJlZCBwcm9wZXJ0aWVzOgo+ID4+Pj4gKy0gY29tcGF0 aWJsZTogc2hhbGwgY29udGFpbiAicGFuZWwtbHZkcyIKPiA+Pj4gCj4gPj4+IE1heWJlIGFzIGEg ZmFsbGJhY2ssIGJ1dCBvbiBpdHMgb3duLCBubyB3YXkuCj4gPj4gCj4gPj4gV2hpY2ggYnJpbmdz IGFuIGludGVyZXN0aW5nIHF1ZXN0aW9uOiB3aGVuIGRlc2lnbmluZyBnZW5lcmljIERUCj4gPj4g YmluZGluZ3MsIHdoYXQncyB0aGUgcnVsZSByZWdhcmRpbmcKPiAKPiBMb29rcyBsaWtlIEkgZm9y Z290IHBhcnQgb2YgdGhlIHF1ZXN0aW9uLiBJIG1lYW50IHRvIGFzayB3aGF0IGlzIHRoZSBydWxl Cj4gcmVnYXJkaW5nIHVzYWdlIG9mIG1vcmUgcHJlY2lzZSBjb21wYXRpYmxlIHN0cmluZ3MgPwo+ IAo+IEZvciBpbnN0YW5jZSAoYnV0IHBlcmhhcHMgbm90IHRoZSBiZXN0IGV4YW1wbGUpLCB0aGUK PiBpbnB1dC9yb3RhcnktZW5jb2Rlci50eHQgYmluZGluZ3MgZGVmaW5lIGEgInJvdGFyeS1lbmNv ZGVyIiBjb21wYXRpYmxlCj4gc3RyaW5nLCB3aXRoIG5vIG90aGVyIGJpbmRpbmdzIGRlZmluaW5n IG1vcmUgcHJlY2lzZSBjb21wYXRpYmxlIHN0cmluZ3MgZm9yCj4gdGhlIGV4YWN0IHJvdGFyeSBl bmNvZGVyIG1vZGVsLiBXaGVuIGl0IGNvbWVzIHRvIHBhbmVscyBJIGJlbGlldmUgaXQgbWFrZXMK PiBzZW5zZSB0byBkZWZpbmUgbW9kZWwtc3BlY2lmaWMgY29tcGF0aWJsZSBzdHJpbmdzIGV2ZW4g aWYgdGhleSdyZSB1bnVzZWQgYnkKPiBkcml2ZXJzLiBJJ20gaG93ZXZlciB3b25kZXJpbmcgd2hh dCB0aGUgcnVsZSBpcyB0aGVyZSwgYW5kIHdoZXJlIHRob3NlCj4gZGV2aWNlLXNwZWNpZmljIGNv bXBhdGlibGUgc3RyaW5ncyBzaG91bGQgYmUgZGVmaW5lZC4gSSdkIGxpa2UgdG8gYXZvaWQKPiB1 c2luZyBvbmUgZmlsZSBwZXIgcGFuZWwgbW9kZWwgYXMgZG9uZSB0b2RheSBmb3IgdGhlIHNpbXBs ZS1wYW5lbCBiaW5kaW5ncy4KPiAKPiA+IENhbGwgaXQgInNpbXBsZSIgc28gSSBjYW4gZWFzaWx5 IE5BSyBpdC4gOikKPiA+IAo+ID4gRGVmaW5lIGEgZ2VuZXJpYyBzdHJ1Y3R1cmUsIG5vdCBhIHNp bmdsZSBiaW5kaW5nIHRyeWluZyB0byBzZXJ2ZSBhbGwuCj4gPiAKPiA+Pj4gPiArLSB3aWR0aC1t bTogcGFuZWwgZGlzcGxheSB3aWR0aCBpbiBtaWxsaW1ldGVycwo+ID4+PiA+ICstIGhlaWdodC1t bTogcGFuZWwgZGlzcGxheSBoZWlnaHQgaW4gbWlsbGltZXRlcnMKPiA+Pj4gCj4gPj4+IFRoaXMg aXMgYWxyZWFkeSBkb2N1bWVudGVkIGZvciBhbGwgcGFuZWxzIElJUkMuCj4gPj4gCj4gPj4gTm90 ZSB0aGF0IHRoaXMgRFQgYmluZGluZyBoYXMgbm90aGluZyB0byBkbyB3aXRoIHRoZSBzaW1wbGUt cGFuZWwKPiA+PiBiaW5kaW5nLiBJdCBpcyBpbnN0ZWFkIHNpbWlsYXIgdG8gdGhlIHBhbmVsLWRw aSBhbmQgcGFuZWwtZHNpLWNtIGJpbmRpbmdzCj4gPj4gKHdoaWNoIGN1cnJlbnRseSBkb24ndCBi dXQgc2hvdWxkIHNwZWNpZnkgdGhlIHBhbmVsIHNpemUgaW4gRFQpLiBUaGUgTFZEUwo+ID4+IHBh bmVsIGRyaXZlciB3aWxsICpub3QqIGluY2x1ZGUgYW55IHBhbmVsLXNwZWNpZmljIGluZm9ybWF0 aW9uIHN1Y2ggYXMKPiA+PiBzaXplIG9yIHRpbWluZ3MsIHRoZXNlIGFyZSBzcGVjaWZpZWQgaW4g RFQuCj4gPiAKPiA+IFRoZSBwYW5lbCBiaW5kaW5ncyBhcmVuJ3QgcmVhbGx5IGRpZmZlcmVudC4g VGhlIGJpZ2dlc3QgZGlmZmVyZW5jZSB3YXMKPiA+IGxvY2F0aW9uIGluIHRoZSB0cmVlLCBidXQg d2Ugbm93IGdlbmVyYWxseSBhbGxvdyBwYW5lbHMgdG8gYmUgZWl0aGVyIGEKPiA+IGNoaWxkIG9m IHRoZSBMQ0QgY29udHJvbGxlciBvciBjb25uZWN0ZWQgd2l0aCBPRiBncmFwaC4gV2UgcHJvYmFi bHkKPiA+IG5lZWQgdG8gd29yayBvbiByZXN0cnVjdHVyaW5nIHRoZSBwYW5lbCBiaW5kaW5ncyBh IGJpdC4gV2Ugc2hvdWxkIGhhdmUKPiA+IGFuIGluaGVyaXRhbmNlIHdpdGggYSBiYXNlIHBhbmVs IGJpbmRpbmcgb2YgdGhpbmdzIGxpa2Ugc2l6ZSwgbGFiZWwsCj4gPiBncmFwaCwgYmFja2xpZ2h0 LCBldGMsIHRoZW4gcGVyaGFwcyBhbiBpbnRlcmZhY2Ugc3BlY2lmaWMgYmluZGluZ3MgZm9yCj4g PiBMVkRTLCBEU0ksIGFuZCBwYXJhbGxlbCwgdGhlbiBhIHBhbmVsIHNwZWNpZmljIGJpbmRpbmcu IFdpdGggdGhpcyB0aGUKPiA+IHBhbmVsIHNwZWNpZmljIGJpbmRpbmcgaXMgdHlwaWNhbGx5IGp1 c3QgYSBjb21wYXRpYmxlIHN0cmluZyBhbmQgd2hpY2gKPiA+IGluaGVyaXRlZCBwcm9wZXJ0aWVz IGFwcGx5IHRvIGl0Lgo+IAo+IFRoYXQgc291bmRzIGdvb2QgdG8gbWUsIGJ1dCB3ZSBoYXZlIG11 bHRpcGxlIG1vZGVscyBmb3IgcGFuZWwgYmluZGluZ3MuCj4gCj4gQXMgeW91IG1lbnRpb25lZCBw YW5lbHMgY2FuIGJlIHJlZmVyZW5jZWQgdGhyb3VnaCBhbiBMQ0QgY29udHJvbGxlciBub2RlCj4g cHJvcGVydHkgY29udGFpbmluZyBhIHBoYW5kbGUgdG8gdGhlIHBhbmVsIG5vZGUsIG9yIHRocm91 Z2ggT0YgZ3JhcGguIFRoYXQncwo+IGEgc2l0dWF0aW9uIHdlIGhhdmUgdG9kYXksIGFuZCB3ZSBu ZWVkIHRvIGtlZXAgc3VwcG9ydGluZyBib3RoIChhdCBsZWFzdAo+IGZvciBleGlzdGluZyBwYW5l bHMsIHBlcmhhcHMgbm90IGZvciB0aGUgbmV3IG9uZXMpLgo+IAo+IEFub3RoZXIgZGlmZmVyZW5j ZSBpcyBob3cgdG8gZXhwcmVzcyBwYW5lbCBkYXRhIHN1Y2ggYXMgc2l6ZSBhbmQgdGltaW5ncy4K PiBUaGUgc2ltcGxlLXBhbmVsIERUIGJpbmRpbmdzIGRvbid0IGNvbnRhaW4gc3VjaCBkYXRhIGFu ZCBleHBlY3RzIHRoZQo+IGRyaXZlcnMgdG8gY29udGFpbiBhIHRhYmxlIG9mIHBhbmVsIGRhdGEg Zm9yIGFsbCBtb2RlbHMgc3VwcG9ydGVkLCB3aGlsZQo+IHRoZSBEUEksIERTSSBhbmQgbm93IHRo ZSBwcm9wb3NlZCBMVkRTIHBhbmVsIGJpbmRpbmdzIGNvbnRhaW4gcHJvcGVydGllcwo+IGZvciBw YW5lbCBkYXRhLgo+IAo+IEhvdyB3b3VsZCB5b3UgbGlrZSB0byByZWNvbmNpbGUgYWxsIHRoYXQg Pwo+IAo+ID4+Pj4gKy0gZGF0YS1tYXBwaW5nOiB0aGUgY29sb3Igc2lnbmFscyBtYXBwaW5nIG9y ZGVyLCAiamVpZGEtMTgiLAo+ID4+Pj4gImplaWRhLTI0Igo+ID4+Pj4gKyAgb3IgInZlc2EtMjQi Cj4gPj4+IAo+ID4+PiBNYXliZSB0aGlzIHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBjb21wYXRpYmxl Lgo+ID4+IAo+ID4+IEkndmUgdGhvdWdodCBhYm91dCBpdCwgYnV0IGdpdmVuIHRoYXQgc29tZSBw YW5lbHMgc3VwcG9ydCBzZWxlY3RpbmcKPiA+PiBiZXR3ZWVuIG11bHRpcGxlIG1vZGVzICh0aHJv dWdoIGEgbW9kZSBwaW4gdGhhdCBpcyB1c3VhbGx5IGhhcmR3aXJlZCksIEkKPiA+PiBiZWxpZXZl IGEgc2VwYXJhdGUgRFQgcHJvcGVydHkgbWFrZXMgc2Vuc2UuCj4gPiAKPiA+IE9rYXkuCj4gPiAK PiA+PiBGdXJ0aGVybW9yZSwgTFZEUyBkYXRhIG9yZ2FuaXphdGlvbiBpcyBjb250cm9sbGVkIGJ5 IHRoZSBjb21iaW5hdGlvbiBvZgo+ID4+IGJvdGggZGF0YS1tYXBwaW5nIGFuZCBkYXRhLW1pcnJv ci4gSXQgbWFrZXMgbGl0dGxlIHNlbnNlIGZyb20gbXkgcG9pbnQKPiA+PiBvZiB2aWV3IHRvIGhh bmRsZSBvbmUgYXMgcGFydCBvZiB0aGUgY29tcGF0aWJsZSBzdHJpbmcgYW5kIHRoZSBvdGhlciBv bmUKPiA+PiBhcyBhIHNlcGFyYXRlIHByb3BlcnR5Lgo+ID4+IAo+ID4+PiA+ICtPcHRpb25hbCBw cm9wZXJ0aWVzOgo+ID4+PiA+ICstIGxhYmVsOiBhIHN5bWJvbGljIG5hbWUgZm9yIHRoZSBwYW5l bAo+ID4+PiAKPiA+Pj4gQ291bGQgYmUgZm9yIGFueSBwYW5lbCBvciBkaXNwbGF5IGNvbm5lY3Rv ci4KPiA+PiAKPiA+PiBZZXMsIGJ1dCBJJ20gbm90IHN1cmUgdG8gdW5kZXJzdGFuZCBob3cgdGhh dCdzIHJlbGV2YW50IDotKQo+ID4gCj4gPiBNZWFuaW5nIGl0IHNob3VsZCBiZSBhIGNvbW1vbiBw cm9wZXJ0eS4KPiAKPiBTdXJlLiBTbyB5b3UgZXhwZWN0IG1lIHRvIHJlb3JnYW5pemUgYWxsIHRo ZSBwYW5lbHMgYW5kIGNvbm5lY3RvcnMgRFQKPiBiaW5kaW5ncyBpbiBvcmRlciB0byBnZXQgdGhp cyBvbmUgbWVyZ2VkID8gOi0pCj4gCj4gPj4+PiArLSBhdmRkLXN1cHBseTogcmVmZXJlbmNlIHRv IHRoZSByZWd1bGF0b3IgdGhhdCBwb3dlcnMgdGhlIHBhbmVsCj4gPj4+PiBhbmFsb2cgc3VwcGx5 Cj4gPj4+PiArLSBkdmRkLXN1cHBseTogcmVmZXJlbmNlIHRvIHRoZSByZWd1bGF0b3IgdGhhdCBw b3dlcnMgdGhlIHBhbmVsCj4gPj4+PiBkaWdpdGFsIHN1cHBseQo+ID4+PiAKPiA+Pj4gV2hpY2gg b25lIGhhcyB0byBiZSBwb3dlcmVkIG9uIGZpcnN0LCB3aGF0IHZvbHRhZ2UsIGFuZCB3aXRoIHdo YXQgdGltZQo+ID4+PiBpbiBiZXR3ZWVuPyBUaGlzIGlzIHdoeSAiZ2VuZXJpYyIgb3IgInNpbXBs ZSIgYmluZGluZ3MgZG9uJ3Qgd29yay4KPiA+PiAKPiA+PiBUaGUgYWJvdmUtbWVudGlvbmVkIHNw ZWNpZmljYXRpb25zIGFsc28gZGVmaW5lIGNvbm5lY3RvcnMsIHBpbm91dHMgYW5kCj4gPj4gcG93 ZXIgc3VwcGxpZXMsIGJ1dCBtYW55IExWRFMgcGFuZWxzIGNvbXBhdGlibGUgd2l0aCB0aGUgTFZE UyBwaHlzaWNhbAo+ID4+IGFuZCBkYXRhIGxheWVycyB1c2UgYSBkaWZmZXJlbnQgY29ubmVjdG9y IHdpdGggc21hbGwgZGlmZmVyZW5jZXMgaW4KPiA+PiBwb3dlcgo+ID4+IHN1cHBsaWVzLgo+ID4+ IAo+ID4+IEkgYmVsaWV2ZSB0aGUgdm9sdGFnZSBpcyBpcnJlbGV2YW50IGhlcmUsIGl0IGRvZXNu J3QgbmVlZCB0byBiZQo+ID4+IGNvbnRyb2xsZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uIFBv d2VyIHN1cHBsaWVzIG9yZGVyIGFuZCB0aW1pbmcgaXMKPiA+PiByZWxldmFudCwgSSdsbCBpbnZl c3RpZ2F0ZSB0aGUgbGV2ZWwgb2YgZGlmZmVyZW5jZXMgYmV0d2VlbiBwYW5lbHMuIEknbQo+ID4+ IGFsc28gZmluZSB3aXRoIGRyb3BwaW5nIHRob3NlIHByb3BlcnRpZXMgZm9yIG5vdy4KPiA+IAo+ ID4gV2hldGhlciB5b3UgaGF2ZSBjb250cm9sIG9mIHRoZSBzdXBwbGllcyBpcyBkZXBlbmRlbnQg b24gdGhlIGJvYXJkLgo+ID4gRHJvcHBpbmcgdGhlbSBpcyBqdXN0IHB1dHMgdXMgaW4gdGhlIHNp bXBsZSBiaW5kaW5nIHRyYXAuIFRoZSBzaW1wbGUKPiA+IGJpbmRpbmdzIHN0YXJ0IG91dCB0aGF0 IHdheSBhbmQgdGhlbiBwZW9wbGUga2VlcCBhZGRpbmcgdG8gdGhlbS4KPiAKPiBEYW1uLCB5b3Ug Y2FuJ3QgYmUgZm9vbGVkIGVhc2lseSA7LSkKPiAKPiBPbiBhIG1vcmUgc2VyaW91cyBub3RlLCBJ J2QgbGlrZSB0byBkZXNpZ24gdGhlIGJpbmRpbmdzIGluIGEgd2F5IHRoYXQKPiB3b3VsZG4ndCBy ZXF1aXJlIGFkZGluZyBkZXZpY2Utc3BlY2lmaWMgY29kZSBpbiB0aGUgZHJpdmVyIGZvciBlYWNo IHBhbmVsCj4gbW9kZWwsIGdpdmVuIHRoYXQgaW4gbW9zdCBjYXNlcyBwb3dlciBzdXBwbHkgaGFu ZGxpbmcgd2lsbCBiZSBnZW5lcmljLgo+IFdoYXQncyB5b3VyIG9waW5pb24gYWJvdXQgYSBnZW5l cmljIHBvd2VyIHN1cHBseSBtb2RlbCB0aGF0IHdvdWxkIGJlIHVzZWQKPiBpbiB0aGUgZGVmYXVs dCBjYXNlLCB3aXRoIHRoZSBvcHRpb24gdG8gb3ZlcnJpZGUgaXQgd2l0aCBkZXZpY2Utc3BlY2lm aWMKPiBjb2RlIHdoZW4gbmVlZGVkID8KPgo+ID4+Pj4gKy0gZGF0YS1taXJyb3I6IGlmIHNldCwg cmV2ZXJzZSB0aGUgYml0IG9yZGVyIG9uIGFsbCBkYXRhIGxhbmVzICg2IHRvCj4gPj4+PiAwIGlu c3RlYWQKPiA+Pj4+ICsgIG9mIDAgdG8gNikKPiA+IAo+ID4gT24gdGhpcyBvbmUsIG1ha2UgdGhl IG5hbWUgZGVzY3JpYmUgdGhlIG9yZGVyLiAibWlycm9yIiByZXF1aXJlcyB0aGF0Cj4gPiBJIGtu b3cgd2hhdCBpcyBub3JtYWwgb3JkZXJpbmcuIFBlcmhhcHMgImRhdGEtbXNiLWZpcnN0Ii4KPiAK PiBTb3VuZHMgZ29vZCB0byBtZSwgSSdsbCB1c2UgdGhhdC4KCi0tIApSZWdhcmRzLAoKTGF1cmVu dCBQaW5jaGFydAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs Cg==