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=-8.3 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,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 A96A8C3A5A3 for ; Tue, 27 Aug 2019 16:38:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7881B204EC for ; Tue, 27 Aug 2019 16:38:50 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="XqTQhyCP" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730433AbfH0Qit (ORCPT ); Tue, 27 Aug 2019 12:38:49 -0400 Received: from perceval.ideasonboard.com ([213.167.242.64]:50728 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730333AbfH0Qij (ORCPT ); Tue, 27 Aug 2019 12:38:39 -0400 Received: from pendragon.ideasonboard.com (dfj612yhrgyx302h3jwwy-3.rev.dnainternet.fi [IPv6:2001:14ba:21f5:5b00:ce28:277f:58d7:3ca4]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 1022454B; Tue, 27 Aug 2019 18:38:37 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1566923917; bh=g/Tjvn2DJDTw4Wdp/39XvKehIUZyBqKZl1Ba/0TXUsM=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=XqTQhyCP23qEfCucpDWRlBFXc/U9Ecjgx+lsHlQgdBro2Nu5KxYvl6FAqfG31IN+K WATOGrlFp4J1xl7q0TwTdNSAMrTNeMcRyHzpncX1phGKHqMUROxSyLy02r4+w9k8NP KqCAEkyNdge+qq7v5b/TqYOA/mekO/XmZMg9yHbs= Date: Tue, 27 Aug 2019 19:38:30 +0300 From: Laurent Pinchart To: Jacopo Mondi Cc: Jacopo Mondi , kieran.bingham+renesas@ideasonboard.com, geert@linux-m68k.org, horms@verge.net.au, uli@fpond.eu, airlied@linux.ie, daniel@ffwll.ch, koji.matsuoka.xm@renesas.com, muroya@ksk.co.jp, VenkataRajesh.Kalakodima@in.bosch.com, Harsha.ManjulaMallikarjun@in.bosch.com, linux-renesas-soc@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, Ulrich Hecht Subject: Re: [PATCH v3 13/14] drm: rcar-du: kms: Update CMM in atomic commit tail Message-ID: <20190827163830.GC5054@pendragon.ideasonboard.com> References: <20190825135154.11488-1-jacopo+renesas@jmondi.org> <20190825135154.11488-14-jacopo+renesas@jmondi.org> <20190827000017.GB5274@pendragon.ideasonboard.com> <20190827001927.GA5926@pendragon.ideasonboard.com> <20190827144421.vbcoizfjxj5ashv2@uno.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20190827144421.vbcoizfjxj5ashv2@uno.localdomain> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Jacopo, On Tue, Aug 27, 2019 at 04:44:21PM +0200, Jacopo Mondi wrote: > On Tue, Aug 27, 2019 at 03:19:27AM +0300, Laurent Pinchart wrote: > > On Tue, Aug 27, 2019 at 03:00:17AM +0300, Laurent Pinchart wrote: > >> On Sun, Aug 25, 2019 at 03:51:53PM +0200, Jacopo Mondi wrote: > >>> Update CMM settings at in the atomic commit tail helper method. > >>> > >>> The CMM is updated with new gamma values provided to the driver > >>> in the GAMMA_LUT blob property. > >>> > >>> Reviewed-by: Ulrich Hecht > >>> Reviewed-by: Laurent Pinchart > >>> Signed-off-by: Jacopo Mondi > >>> --- > >>> drivers/gpu/drm/rcar-du/rcar_du_kms.c | 35 +++++++++++++++++++++++++++ > >>> 1 file changed, 35 insertions(+) > >>> > >>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c > >>> index 61ca1d3c379a..047fdb982a11 100644 > >>> --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c > >>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c > >>> @@ -22,6 +22,7 @@ > >>> #include > >>> #include > >>> > >>> +#include "rcar_cmm.h" > >>> #include "rcar_du_crtc.h" > >>> #include "rcar_du_drv.h" > >>> #include "rcar_du_encoder.h" > >>> @@ -368,6 +369,37 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv, > >>> * Atomic Check and Update > >>> */ > >>> > >>> +static void rcar_du_atomic_commit_update_cmm(struct drm_crtc *crtc, > >>> + struct drm_crtc_state *old_state) > >>> +{ > >>> + struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); > >>> + struct rcar_cmm_config cmm_config = {}; > >>> + > >>> + if (!rcrtc->cmm || !crtc->state->color_mgmt_changed) > >>> + return; > >>> + > >>> + if (!crtc->state->gamma_lut) { > >>> + cmm_config.lut.enable = false; > >>> + rcar_cmm_setup(rcrtc->cmm, &cmm_config); > >>> + > >>> + return; > >>> + } > >>> + > >>> + cmm_config.lut.enable = true; > >>> + cmm_config.lut.table = (struct drm_color_lut *) > >>> + crtc->state->gamma_lut->data; > >>> + > >>> + /* Set LUT table size to 0 if entries should not be updated. */ > >>> + if (!old_state->gamma_lut || > >>> + old_state->gamma_lut->base.id != crtc->state->gamma_lut->base.id) > >>> + cmm_config.lut.size = crtc->state->gamma_lut->length > >>> + / sizeof(cmm_config.lut.table[0]); > >> > >> It has just occurred to me that the hardware only support LUTs of > > Where did you find this strict requirement ? I have tried programming > less than 256 entries in the 1-D LUT table, and it seems to me things > are working fine (from a visual inspection of the output image, I > don't see much differences from when I program the full table, maybe > that's an indication something is bad?) Or maybe a previous write of the full 256 entries has initialised the LUT correctly ? There's no hardware register telling how many LUT entries the hardware should use, and the documentation makes it quite clear that the LUT contains 256 entries. It is indexed by the values of the 8-bit pixel components, so it has to be written fully. > >> exactly 256 entries. Should we remove cmm_config.lut.size (simplifying > >> the code in the CMM driver), and add a check to the CRTC .atomic_check() > >> handler to reject invalid LUTs ? Sorry for not having caught this > >> earlier. > > > > Just an additional comment, if we drop the size field, then the > > cmm_config.lut.table pointer should be set to NULL when the LUT contents > > don't need to be updated. > > > >>> + else > >>> + cmm_config.lut.size = 0; > >>> + > >>> + rcar_cmm_setup(rcrtc->cmm, &cmm_config); > >>> +} > >>> + > >>> static int rcar_du_atomic_check(struct drm_device *dev, > >>> struct drm_atomic_state *state) > >>> { > >>> @@ -410,6 +442,9 @@ static void rcar_du_atomic_commit_tail(struct drm_atomic_state *old_state) > >>> rcdu->dpad1_source = rcrtc->index; > >>> } > >>> > >>> + for_each_old_crtc_in_state(old_state, crtc, crtc_state, i) > >>> + rcar_du_atomic_commit_update_cmm(crtc, crtc_state); > >>> + > >>> /* Apply the atomic update. */ > >>> drm_atomic_helper_commit_modeset_disables(dev, old_state); > >>> drm_atomic_helper_commit_planes(dev, old_state, -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v3 13/14] drm: rcar-du: kms: Update CMM in atomic commit tail Date: Tue, 27 Aug 2019 19:38:30 +0300 Message-ID: <20190827163830.GC5054@pendragon.ideasonboard.com> References: <20190825135154.11488-1-jacopo+renesas@jmondi.org> <20190825135154.11488-14-jacopo+renesas@jmondi.org> <20190827000017.GB5274@pendragon.ideasonboard.com> <20190827001927.GA5926@pendragon.ideasonboard.com> <20190827144421.vbcoizfjxj5ashv2@uno.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by gabe.freedesktop.org (Postfix) with ESMTPS id F408589BBD for ; Tue, 27 Aug 2019 16:38:38 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20190827144421.vbcoizfjxj5ashv2@uno.localdomain> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Jacopo Mondi Cc: muroya@ksk.co.jp, uli@fpond.eu, horms@verge.net.au, VenkataRajesh.Kalakodima@in.bosch.com, airlied@linux.ie, koji.matsuoka.xm@renesas.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, kieran.bingham+renesas@ideasonboard.com, geert@linux-m68k.org, Jacopo Mondi , Harsha.ManjulaMallikarjun@in.bosch.com, Ulrich Hecht List-Id: dri-devel@lists.freedesktop.org SGkgSmFjb3BvLAoKT24gVHVlLCBBdWcgMjcsIDIwMTkgYXQgMDQ6NDQ6MjFQTSArMDIwMCwgSmFj b3BvIE1vbmRpIHdyb3RlOgo+IE9uIFR1ZSwgQXVnIDI3LCAyMDE5IGF0IDAzOjE5OjI3QU0gKzAz MDAsIExhdXJlbnQgUGluY2hhcnQgd3JvdGU6Cj4gPiBPbiBUdWUsIEF1ZyAyNywgMjAxOSBhdCAw MzowMDoxN0FNICswMzAwLCBMYXVyZW50IFBpbmNoYXJ0IHdyb3RlOgo+ID4+IE9uIFN1biwgQXVn IDI1LCAyMDE5IGF0IDAzOjUxOjUzUE0gKzAyMDAsIEphY29wbyBNb25kaSB3cm90ZToKPiA+Pj4g VXBkYXRlIENNTSBzZXR0aW5ncyBhdCBpbiB0aGUgYXRvbWljIGNvbW1pdCB0YWlsIGhlbHBlciBt ZXRob2QuCj4gPj4+Cj4gPj4+IFRoZSBDTU0gaXMgdXBkYXRlZCB3aXRoIG5ldyBnYW1tYSB2YWx1 ZXMgcHJvdmlkZWQgdG8gdGhlIGRyaXZlcgo+ID4+PiBpbiB0aGUgR0FNTUFfTFVUIGJsb2IgcHJv cGVydHkuCj4gPj4+Cj4gPj4+IFJldmlld2VkLWJ5OiBVbHJpY2ggSGVjaHQgPHVsaStyZW5lc2Fz QGZwb25kLmV1Pgo+ID4+PiBSZXZpZXdlZC1ieTogTGF1cmVudCBQaW5jaGFydCA8bGF1cmVudC5w aW5jaGFydEBpZGVhc29uYm9hcmQuY29tPgo+ID4+PiBTaWduZWQtb2ZmLWJ5OiBKYWNvcG8gTW9u ZGkgPGphY29wbytyZW5lc2FzQGptb25kaS5vcmc+Cj4gPj4+IC0tLQo+ID4+PiAgZHJpdmVycy9n cHUvZHJtL3JjYXItZHUvcmNhcl9kdV9rbXMuYyB8IDM1ICsrKysrKysrKysrKysrKysrKysrKysr KysrKwo+ID4+PiAgMSBmaWxlIGNoYW5nZWQsIDM1IGluc2VydGlvbnMoKykKPiA+Pj4KPiA+Pj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfa21zLmMgYi9kcml2 ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2ttcy5jCj4gPj4+IGluZGV4IDYxY2ExZDNjMzc5 YS4uMDQ3ZmRiOTgyYTExIDEwMDY0NAo+ID4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmNhci1k dS9yY2FyX2R1X2ttcy5jCj4gPj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJf ZHVfa21zLmMKPiA+Pj4gQEAgLTIyLDYgKzIyLDcgQEAKPiA+Pj4gICNpbmNsdWRlIDxsaW51eC9v Zl9wbGF0Zm9ybS5oPgo+ID4+PiAgI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KPiA+Pj4KPiA+Pj4g KyNpbmNsdWRlICJyY2FyX2NtbS5oIgo+ID4+PiAgI2luY2x1ZGUgInJjYXJfZHVfY3J0Yy5oIgo+ ID4+PiAgI2luY2x1ZGUgInJjYXJfZHVfZHJ2LmgiCj4gPj4+ICAjaW5jbHVkZSAicmNhcl9kdV9l bmNvZGVyLmgiCj4gPj4+IEBAIC0zNjgsNiArMzY5LDM3IEBAIHJjYXJfZHVfZmJfY3JlYXRlKHN0 cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LAo+ID4+PiAg ICogQXRvbWljIENoZWNrIGFuZCBVcGRhdGUKPiA+Pj4gICAqLwo+ID4+Pgo+ID4+PiArc3RhdGlj IHZvaWQgcmNhcl9kdV9hdG9taWNfY29tbWl0X3VwZGF0ZV9jbW0oc3RydWN0IGRybV9jcnRjICpj cnRjLAo+ID4+PiArCQkJCQkgICAgIHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqb2xkX3N0YXRlKQo+ ID4+PiArewo+ID4+PiArCXN0cnVjdCByY2FyX2R1X2NydGMgKnJjcnRjID0gdG9fcmNhcl9jcnRj KGNydGMpOwo+ID4+PiArCXN0cnVjdCByY2FyX2NtbV9jb25maWcgY21tX2NvbmZpZyA9IHt9Owo+ ID4+PiArCj4gPj4+ICsJaWYgKCFyY3J0Yy0+Y21tIHx8ICFjcnRjLT5zdGF0ZS0+Y29sb3JfbWdt dF9jaGFuZ2VkKQo+ID4+PiArCQlyZXR1cm47Cj4gPj4+ICsKPiA+Pj4gKwlpZiAoIWNydGMtPnN0 YXRlLT5nYW1tYV9sdXQpIHsKPiA+Pj4gKwkJY21tX2NvbmZpZy5sdXQuZW5hYmxlID0gZmFsc2U7 Cj4gPj4+ICsJCXJjYXJfY21tX3NldHVwKHJjcnRjLT5jbW0sICZjbW1fY29uZmlnKTsKPiA+Pj4g Kwo+ID4+PiArCQlyZXR1cm47Cj4gPj4+ICsJfQo+ID4+PiArCj4gPj4+ICsJY21tX2NvbmZpZy5s dXQuZW5hYmxlID0gdHJ1ZTsKPiA+Pj4gKwljbW1fY29uZmlnLmx1dC50YWJsZSA9IChzdHJ1Y3Qg ZHJtX2NvbG9yX2x1dCAqKQo+ID4+PiArCQkJICAgICAgIGNydGMtPnN0YXRlLT5nYW1tYV9sdXQt PmRhdGE7Cj4gPj4+ICsKPiA+Pj4gKwkvKiBTZXQgTFVUIHRhYmxlIHNpemUgdG8gMCBpZiBlbnRy aWVzIHNob3VsZCBub3QgYmUgdXBkYXRlZC4gKi8KPiA+Pj4gKwlpZiAoIW9sZF9zdGF0ZS0+Z2Ft bWFfbHV0IHx8Cj4gPj4+ICsJICAgIG9sZF9zdGF0ZS0+Z2FtbWFfbHV0LT5iYXNlLmlkICE9IGNy dGMtPnN0YXRlLT5nYW1tYV9sdXQtPmJhc2UuaWQpCj4gPj4+ICsJCWNtbV9jb25maWcubHV0LnNp emUgPSBjcnRjLT5zdGF0ZS0+Z2FtbWFfbHV0LT5sZW5ndGgKPiA+Pj4gKwkJCQkgICAgLyBzaXpl b2YoY21tX2NvbmZpZy5sdXQudGFibGVbMF0pOwo+ID4+Cj4gPj4gSXQgaGFzIGp1c3Qgb2NjdXJy ZWQgdG8gbWUgdGhhdCB0aGUgaGFyZHdhcmUgb25seSBzdXBwb3J0IExVVHMgb2YKPiAKPiBXaGVy ZSBkaWQgeW91IGZpbmQgdGhpcyBzdHJpY3QgcmVxdWlyZW1lbnQgPyBJIGhhdmUgdHJpZWQgcHJv Z3JhbW1pbmcKPiBsZXNzIHRoYW4gMjU2IGVudHJpZXMgaW4gdGhlIDEtRCBMVVQgdGFibGUsIGFu ZCBpdCBzZWVtcyB0byBtZSB0aGluZ3MKPiBhcmUgd29ya2luZyBmaW5lIChmcm9tIGEgdmlzdWFs IGluc3BlY3Rpb24gb2YgdGhlIG91dHB1dCBpbWFnZSwgSQo+IGRvbid0IHNlZSBtdWNoIGRpZmZl cmVuY2VzIGZyb20gd2hlbiBJIHByb2dyYW0gdGhlIGZ1bGwgdGFibGUsIG1heWJlCj4gdGhhdCdz IGFuIGluZGljYXRpb24gc29tZXRoaW5nIGlzIGJhZD8pCgpPciBtYXliZSBhIHByZXZpb3VzIHdy aXRlIG9mIHRoZSBmdWxsIDI1NiBlbnRyaWVzIGhhcyBpbml0aWFsaXNlZCB0aGUKTFVUIGNvcnJl Y3RseSA/CgpUaGVyZSdzIG5vIGhhcmR3YXJlIHJlZ2lzdGVyIHRlbGxpbmcgaG93IG1hbnkgTFVU IGVudHJpZXMgdGhlIGhhcmR3YXJlCnNob3VsZCB1c2UsIGFuZCB0aGUgZG9jdW1lbnRhdGlvbiBt YWtlcyBpdCBxdWl0ZSBjbGVhciB0aGF0IHRoZSBMVVQKY29udGFpbnMgMjU2IGVudHJpZXMuIEl0 IGlzIGluZGV4ZWQgYnkgdGhlIHZhbHVlcyBvZiB0aGUgOC1iaXQgcGl4ZWwKY29tcG9uZW50cywg c28gaXQgaGFzIHRvIGJlIHdyaXR0ZW4gZnVsbHkuCgo+ID4+IGV4YWN0bHkgMjU2IGVudHJpZXMu IFNob3VsZCB3ZSByZW1vdmUgY21tX2NvbmZpZy5sdXQuc2l6ZSAoc2ltcGxpZnlpbmcKPiA+PiB0 aGUgY29kZSBpbiB0aGUgQ01NIGRyaXZlciksIGFuZCBhZGQgYSBjaGVjayB0byB0aGUgQ1JUQyAu YXRvbWljX2NoZWNrKCkKPiA+PiBoYW5kbGVyIHRvIHJlamVjdCBpbnZhbGlkIExVVHMgPyBTb3Jy eSBmb3Igbm90IGhhdmluZyBjYXVnaHQgdGhpcwo+ID4+IGVhcmxpZXIuCj4gPgo+ID4gSnVzdCBh biBhZGRpdGlvbmFsIGNvbW1lbnQsIGlmIHdlIGRyb3AgdGhlIHNpemUgZmllbGQsIHRoZW4gdGhl Cj4gPiBjbW1fY29uZmlnLmx1dC50YWJsZSBwb2ludGVyIHNob3VsZCBiZSBzZXQgdG8gTlVMTCB3 aGVuIHRoZSBMVVQgY29udGVudHMKPiA+IGRvbid0IG5lZWQgdG8gYmUgdXBkYXRlZC4KPiA+Cj4g Pj4+ICsJZWxzZQo+ID4+PiArCQljbW1fY29uZmlnLmx1dC5zaXplID0gMDsKPiA+Pj4gKwo+ID4+ PiArCXJjYXJfY21tX3NldHVwKHJjcnRjLT5jbW0sICZjbW1fY29uZmlnKTsKPiA+Pj4gK30KPiA+ Pj4gKwo+ID4+PiAgc3RhdGljIGludCByY2FyX2R1X2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2LAo+ID4+PiAgCQkJCXN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKPiA+ Pj4gIHsKPiA+Pj4gQEAgLTQxMCw2ICs0NDIsOSBAQCBzdGF0aWMgdm9pZCByY2FyX2R1X2F0b21p Y19jb21taXRfdGFpbChzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqb2xkX3N0YXRlKQo+ID4+PiAg CQkJcmNkdS0+ZHBhZDFfc291cmNlID0gcmNydGMtPmluZGV4Owo+ID4+PiAgCX0KPiA+Pj4KPiA+ Pj4gKwlmb3JfZWFjaF9vbGRfY3J0Y19pbl9zdGF0ZShvbGRfc3RhdGUsIGNydGMsIGNydGNfc3Rh dGUsIGkpCj4gPj4+ICsJCXJjYXJfZHVfYXRvbWljX2NvbW1pdF91cGRhdGVfY21tKGNydGMsIGNy dGNfc3RhdGUpOwo+ID4+PiArCj4gPj4+ICAJLyogQXBwbHkgdGhlIGF0b21pYyB1cGRhdGUuICov Cj4gPj4+ICAJZHJtX2F0b21pY19oZWxwZXJfY29tbWl0X21vZGVzZXRfZGlzYWJsZXMoZGV2LCBv bGRfc3RhdGUpOwo+ID4+PiAgCWRybV9hdG9taWNfaGVscGVyX2NvbW1pdF9wbGFuZXMoZGV2LCBv bGRfc3RhdGUsCgotLSAKUmVnYXJkcywKCkxhdXJlbnQgUGluY2hhcnQKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApk cmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Au b3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs