From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jani Nikula Subject: RE: [PATCH] drm/edid: fixup EDID 1.3 and 1.4 judge reduced-blanking timings logic Date: Tue, 03 Dec 2019 10:02:25 +0200 Message-ID: <87muc9kfam.fsf@intel.com> References: <1574761572-26585-1-git-send-email-allen.chen@ite.com.tw> <87pnhdobns.fsf@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8BIT Return-path: In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org To: allen.chen@ite.com.tw Cc: Jau-Chih.Tseng@ite.com.tw, maxime.ripard@bootlin.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, airlied@linux.ie, pihsun@chromium.org, sean@poorly.run List-Id: dri-devel@lists.freedesktop.org On Tue, 03 Dec 2019, wrote: > Hi Jani Nikula > > > > Thanks for your suggestion and I have replied two comments below. Please read my question again. BR, Jani. > > > > -----Original Message----- > From: Jani Nikula [mailto:jani.nikula@linux.intel.com] > Sent: Wednesday, November 27, 2019 6:29 PM > To: Allen Chen (陳柏宇) > Cc: Jau-Chih Tseng (曾昭智); Maxime Ripard; Allen Chen (陳柏宇); open list; open list:DRM DRIVERS; David Airlie; Pi-Hsun Shih; Sean Paul > Subject: Re: [PATCH] drm/edid: fixup EDID 1.3 and 1.4 judge reduced-blanking timings logic > > > > On Tue, 26 Nov 2019, allen wrote: > >> According to VESA ENHANCED EXTENDED DISPLAY IDENTIFICATION DATA STANDARD > >> (Defines EDID Structure Version 1, Revision 4) page: 39 > >> How to determine whether the monitor support RB timing or not? > >> EDID 1.4 > >> First: read detailed timing descriptor and make sure byte 0 = 0x00, > >> byte 1 = 0x00, byte 2 = 0x00 and byte 3 = 0xFD > >> Second: read EDID bit 0 in feature support byte at address 18h = 1 > >> and detailed timing descriptor byte 10 = 0x04 > >> Third: if EDID bit 0 in feature support byte = 1 && > >> detailed timing descriptor byte 10 = 0x04 > >> then we can check byte 15, if bit 4 in byte 15 = 1 is support RB > >> if EDID bit 0 in feature support byte != 1 || > >> detailed timing descriptor byte 10 != 0x04, > >> then byte 15 can not be used > >> > >> The linux code is_rb function not follow the VESA's rule > >> > >> Signed-off-by: Allen Chen > >> Reported-by: kbuild test robot > >> --- > >> drivers/gpu/drm/drm_edid.c | 36 ++++++++++++++++++++++++++++++------ > >> 1 file changed, 30 insertions(+), 6 deletions(-) > >> > >> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c > >> index f5926bf..e11e585 100644 > >> --- a/drivers/gpu/drm/drm_edid.c > >> +++ b/drivers/gpu/drm/drm_edid.c > >> @@ -93,6 +93,12 @@ struct detailed_mode_closure { > >> int modes; > >> }; > >> > >> +struct edid_support_rb_closure { > >> + struct edid *edid; > >> + bool valid_support_rb; > >> + bool support_rb; > >> +}; > >> + > >> #define LEVEL_DMT 0 > >> #define LEVEL_GTF 1 > >> #define LEVEL_GTF2 2 > >> @@ -2017,23 +2023,41 @@ struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, > >> } > >> } > >> > >> +static bool > >> +is_display_descriptor(const u8 *r, u8 tag) > >> +{ > >> + return (!r[0] && !r[1] && !r[2] && r[3] == tag) ? true : false; > >> +} > >> + > >> static void > >> is_rb(struct detailed_timing *t, void *data) > >> { > >> u8 *r = (u8 *)t; > >> - if (r[3] == EDID_DETAIL_MONITOR_RANGE) > >> - if (r[15] & 0x10) > >> - *(bool *)data = true; > >> + struct edid_support_rb_closure *closure = data; > >> + struct edid *edid = closure->edid; > >> + > >> + if (is_display_descriptor(r, EDID_DETAIL_MONITOR_RANGE)) { > >> + if (edid->features & BIT(0) && r[10] == BIT(2)) { > >> + closure->valid_support_rb = true; > >> + closure->support_rb = (r[15] & 0x10) ? true : false; > >> + } > >> + } > >> } > >> > >> /* EDID 1.4 defines this explicitly. For EDID 1.3, we guess, badly. */ > >> static bool > >> drm_monitor_supports_rb(struct edid *edid) > >> { > >> + struct edid_support_rb_closure closure = { > >> + .edid = edid, > >> + .valid_support_rb = false, > >> + .support_rb = false, > >> + }; > >> + > >> if (edid->revision >= 4) { > >> - bool ret = false; > >> - drm_for_each_detailed_block((u8 *)edid, is_rb, &ret); > >> - return ret; > >> + drm_for_each_detailed_block((u8 *)edid, is_rb, &closure); > >> + if (closure.valid_support_rb) > >> + return closure.support_rb; > > > > Are you planning on extending the closure use somehow? > > > > I did not look up the spec, > > > > ==> iTE: as the picture below, from VESA E-EDID standard > > [cid:image003.jpg@01D5A9EA.9B7364D0] > > > > [cid:image005.jpg@01D5A9EA.9B7364D0] > > > > if EDID bit 0 in feature support byte = 1 && detailed timing descriptor byte 10 = 0x04 then the CVT timing supported. > > > > [cid:image009.jpg@01D5A9EA.9B7364D0] > > > > If CVT timing supported then we can check byte 15 bit 4 to determine whether the reduced-blanking timings suported or not. > > If CVT timing not supported then we can not use byte 15 to judge. > > but purely on the code changes alone, you > > could just move the edid->features bit check at this level, and not pass > > it down, and nothing would change. I.e. don't iterate the EDID at all if > > the bit is not set. > > > > ð iTE: We still have to check whether detailed timing descriptor byte 10 = 0x04 or not, so it is hard to check at this level > > You also don't actually use the distinction between valid_support_rb > > vs. support_rb for anything, so the closure just adds code. > > > > BR, > > Jani. > > > > > >> } > >> > >> return ((edid->input & DRM_EDID_INPUT_DIGITAL) != 0); > > > > -- > > Jani Nikula, Intel Open Source Graphics Center -- Jani Nikula, Intel Open Source Graphics Center 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=-6.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS 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 0F7AEC43215 for ; Tue, 3 Dec 2019 08:02:33 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 DA5ED20726 for ; Tue, 3 Dec 2019 08:02:32 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DA5ED20726 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 176E56E3EB; Tue, 3 Dec 2019 08:02:32 +0000 (UTC) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTPS id 75BAB6E3EB for ; Tue, 3 Dec 2019 08:02:31 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Dec 2019 00:02:30 -0800 X-IronPort-AV: E=Sophos;i="5.69,272,1571727600"; d="scan'208";a="200908546" Received: from jnikula-mobl3.fi.intel.com (HELO localhost) ([10.237.66.161]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Dec 2019 00:02:27 -0800 From: Jani Nikula To: allen.chen@ite.com.tw Subject: RE: [PATCH] drm/edid: fixup EDID 1.3 and 1.4 judge reduced-blanking timings logic In-Reply-To: Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo References: <1574761572-26585-1-git-send-email-allen.chen@ite.com.tw> <87pnhdobns.fsf@intel.com> Date: Tue, 03 Dec 2019 10:02:25 +0200 Message-ID: <87muc9kfam.fsf@intel.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Jau-Chih.Tseng@ite.com.tw, maxime.ripard@bootlin.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, airlied@linux.ie, pihsun@chromium.org, sean@poorly.run Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Message-ID: <20191203080225.q99Z7xNBF-fTCazUcLCsRLYHk4FLucZdXe_DAT6Rf0I@z> T24gVHVlLCAwMyBEZWMgMjAxOSwgPGFsbGVuLmNoZW5AaXRlLmNvbS50dz4gd3JvdGU6Cj4gSGkg SmFuaSBOaWt1bGEKPgo+Cj4KPiBUaGFua3MgZm9yIHlvdXIgc3VnZ2VzdGlvbiBhbmQgSSBoYXZl IHJlcGxpZWQgdHdvIGNvbW1lbnRzIGJlbG93LgoKUGxlYXNlIHJlYWQgbXkgcXVlc3Rpb24gYWdh aW4uCgpCUiwKSmFuaS4KCj4KPgo+Cj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPiBGcm9t OiBKYW5pIE5pa3VsYSBbbWFpbHRvOmphbmkubmlrdWxhQGxpbnV4LmludGVsLmNvbV0KPiBTZW50 OiBXZWRuZXNkYXksIE5vdmVtYmVyIDI3LCAyMDE5IDY6MjkgUE0KPiBUbzogQWxsZW4gQ2hlbiAo 6Zmz5p+P5a6HKQo+IENjOiBKYXUtQ2hpaCBUc2VuZyAo5pu+5pit5pm6KTsgTWF4aW1lIFJpcGFy ZDsgQWxsZW4gQ2hlbiAo6Zmz5p+P5a6HKTsgb3BlbiBsaXN0OyBvcGVuIGxpc3Q6RFJNIERSSVZF UlM7IERhdmlkIEFpcmxpZTsgUGktSHN1biBTaGloOyBTZWFuIFBhdWwKPiBTdWJqZWN0OiBSZTog W1BBVENIXSBkcm0vZWRpZDogZml4dXAgRURJRCAxLjMgYW5kIDEuNCBqdWRnZSByZWR1Y2VkLWJs YW5raW5nIHRpbWluZ3MgbG9naWMKPgo+Cj4KPiBPbiBUdWUsIDI2IE5vdiAyMDE5LCBhbGxlbiA8 YWxsZW4uY2hlbkBpdGUuY29tLnR3PiB3cm90ZToKPgo+PiBBY2NvcmRpbmcgdG8gVkVTQSBFTkhB TkNFRCBFWFRFTkRFRCBESVNQTEFZIElERU5USUZJQ0FUSU9OIERBVEEgU1RBTkRBUkQKPgo+PiAo RGVmaW5lcyBFRElEIFN0cnVjdHVyZSBWZXJzaW9uIDEsIFJldmlzaW9uIDQpIHBhZ2U6IDM5Cj4K Pj4gSG93IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBtb25pdG9yIHN1cHBvcnQgUkIgdGltaW5n IG9yIG5vdD8KPgo+PiBFRElEIDEuNAo+Cj4+IEZpcnN0OiAgcmVhZCBkZXRhaWxlZCB0aW1pbmcg ZGVzY3JpcHRvciBhbmQgbWFrZSBzdXJlIGJ5dGUgMCA9IDB4MDAsCj4KPj4gICAgIGJ5dGUgMSA9 IDB4MDAsIGJ5dGUgMiA9IDB4MDAgYW5kIGJ5dGUgMyA9IDB4RkQKPgo+PiBTZWNvbmQ6IHJlYWQg RURJRCBiaXQgMCBpbiBmZWF0dXJlIHN1cHBvcnQgYnl0ZSBhdCBhZGRyZXNzIDE4aCA9IDEKPgo+ PiAgICAgYW5kIGRldGFpbGVkIHRpbWluZyBkZXNjcmlwdG9yIGJ5dGUgMTAgPSAweDA0Cj4KPj4g VGhpcmQ6ICBpZiBFRElEIGJpdCAwIGluIGZlYXR1cmUgc3VwcG9ydCBieXRlID0gMSAmJgo+Cj4+ ICAgICBkZXRhaWxlZCB0aW1pbmcgZGVzY3JpcHRvciBieXRlIDEwID0gMHgwNAo+Cj4+ICAgICB0 aGVuIHdlIGNhbiBjaGVjayBieXRlIDE1LCBpZiBiaXQgNCBpbiBieXRlIDE1ID0gMSBpcyBzdXBw b3J0IFJCCj4KPj4gICAgICAgICBpZiBFRElEIGJpdCAwIGluIGZlYXR1cmUgc3VwcG9ydCBieXRl ICE9IDEgfHwKPgo+PiAgICAgZGV0YWlsZWQgdGltaW5nIGRlc2NyaXB0b3IgYnl0ZSAxMCAhPSAw eDA0LAo+Cj4+ICAgICB0aGVuIGJ5dGUgMTUgY2FuIG5vdCBiZSB1c2VkCj4KPj4KPgo+PiBUaGUg bGludXggY29kZSBpc19yYiBmdW5jdGlvbiBub3QgZm9sbG93IHRoZSBWRVNBJ3MgcnVsZQo+Cj4+ Cj4KPj4gU2lnbmVkLW9mZi1ieTogQWxsZW4gQ2hlbiA8YWxsZW4uY2hlbkBpdGUuY29tLnR3Pgo+ Cj4+IFJlcG9ydGVkLWJ5OiBrYnVpbGQgdGVzdCByb2JvdCA8bGtwQGludGVsLmNvbT4KPgo+PiAt LS0KPgo+PiAgZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMgfCAzNiArKysrKysrKysrKysrKysr KysrKysrKysrKysrKystLS0tLS0KPgo+PiAgMSBmaWxlIGNoYW5nZWQsIDMwIGluc2VydGlvbnMo KyksIDYgZGVsZXRpb25zKC0pCj4KPj4KPgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L2RybV9lZGlkLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWQuYwo+Cj4+IGluZGV4IGY1OTI2 YmYuLmUxMWU1ODUgMTAwNjQ0Cj4KPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMK Pgo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWQuYwo+Cj4+IEBAIC05Myw2ICs5Mywx MiBAQCBzdHJ1Y3QgZGV0YWlsZWRfbW9kZV9jbG9zdXJlIHsKPgo+PiAgICBpbnQgbW9kZXM7Cj4K Pj4gIH07Cj4KPj4KPgo+PiArc3RydWN0IGVkaWRfc3VwcG9ydF9yYl9jbG9zdXJlIHsKPgo+PiAr ICAgc3RydWN0IGVkaWQgKmVkaWQ7Cj4KPj4gKyAgIGJvb2wgdmFsaWRfc3VwcG9ydF9yYjsKPgo+ PiArICAgYm9vbCBzdXBwb3J0X3JiOwo+Cj4+ICt9Owo+Cj4+ICsKPgo+PiAgI2RlZmluZSBMRVZF TF9ETVQgMAo+Cj4+ICAjZGVmaW5lIExFVkVMX0dURiAgIDEKPgo+PiAgI2RlZmluZSBMRVZFTF9H VEYyIDIKPgo+PiBAQCAtMjAxNywyMyArMjAyMyw0MSBAQCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9k ZSAqZHJtX21vZGVfZmluZF9kbXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKPgo+PiAgICB9Cj4K Pj4gIH0KPgo+Pgo+Cj4+ICtzdGF0aWMgYm9vbAo+Cj4+ICtpc19kaXNwbGF5X2Rlc2NyaXB0b3Io Y29uc3QgdTggKnIsIHU4IHRhZykKPgo+PiArewo+Cj4+ICsgICByZXR1cm4gKCFyWzBdICYmICFy WzFdICYmICFyWzJdICYmIHJbM10gPT0gdGFnKSA/IHRydWUgOiBmYWxzZTsKPgo+PiArfQo+Cj4+ ICsKPgo+PiAgc3RhdGljIHZvaWQKPgo+PiAgaXNfcmIoc3RydWN0IGRldGFpbGVkX3RpbWluZyAq dCwgdm9pZCAqZGF0YSkKPgo+PiAgewo+Cj4+ICAgIHU4ICpyID0gKHU4ICopdDsKPgo+PiAtICAg IGlmIChyWzNdID09IEVESURfREVUQUlMX01PTklUT1JfUkFOR0UpCj4KPj4gLSAgICAgICAgICAg IGlmIChyWzE1XSAmIDB4MTApCj4KPj4gLSAgICAgICAgICAgICAgICAgICAgKihib29sICopZGF0 YSA9IHRydWU7Cj4KPj4gKyAgIHN0cnVjdCBlZGlkX3N1cHBvcnRfcmJfY2xvc3VyZSAqY2xvc3Vy ZSA9IGRhdGE7Cj4KPj4gKyAgIHN0cnVjdCBlZGlkICplZGlkID0gY2xvc3VyZS0+ZWRpZDsKPgo+ PiArCj4KPj4gKyAgIGlmIChpc19kaXNwbGF5X2Rlc2NyaXB0b3IociwgRURJRF9ERVRBSUxfTU9O SVRPUl9SQU5HRSkpIHsKPgo+PiArICAgICAgICAgICBpZiAoZWRpZC0+ZmVhdHVyZXMgJiBCSVQo MCkgJiYgclsxMF0gPT0gQklUKDIpKSB7Cj4KPj4gKyAgICAgICAgICAgICAgICAgICBjbG9zdXJl LT52YWxpZF9zdXBwb3J0X3JiID0gdHJ1ZTsKPgo+PiArICAgICAgICAgICAgICAgICAgIGNsb3N1 cmUtPnN1cHBvcnRfcmIgPSAoclsxNV0gJiAweDEwKSA/IHRydWUgOiBmYWxzZTsKPgo+PiArICAg ICAgICAgICB9Cj4KPj4gKyAgIH0KPgo+PiAgfQo+Cj4+Cj4KPj4gIC8qIEVESUQgMS40IGRlZmlu ZXMgdGhpcyBleHBsaWNpdGx5LiAgRm9yIEVESUQgMS4zLCB3ZSBndWVzcywgYmFkbHkuICovCj4K Pj4gIHN0YXRpYyBib29sCj4KPj4gIGRybV9tb25pdG9yX3N1cHBvcnRzX3JiKHN0cnVjdCBlZGlk ICplZGlkKQo+Cj4+ICB7Cj4KPj4gKyAgIHN0cnVjdCBlZGlkX3N1cHBvcnRfcmJfY2xvc3VyZSBj bG9zdXJlID0gewo+Cj4+ICsgICAgICAgICAgIC5lZGlkID0gZWRpZCwKPgo+PiArICAgICAgICAg ICAudmFsaWRfc3VwcG9ydF9yYiA9IGZhbHNlLAo+Cj4+ICsgICAgICAgICAgIC5zdXBwb3J0X3Ji ID0gZmFsc2UsCj4KPj4gKyAgIH07Cj4KPj4gKwo+Cj4+ICAgIGlmIChlZGlkLT5yZXZpc2lvbiA+ PSA0KSB7Cj4KPj4gLSAgICAgICAgICAgIGJvb2wgcmV0ID0gZmFsc2U7Cj4KPj4gLSAgICAgICAg ICAgIGRybV9mb3JfZWFjaF9kZXRhaWxlZF9ibG9jaygodTggKillZGlkLCBpc19yYiwgJnJldCk7 Cj4KPj4gLSAgICAgICAgICAgIHJldHVybiByZXQ7Cj4KPj4gKyAgICAgICAgICAgZHJtX2Zvcl9l YWNoX2RldGFpbGVkX2Jsb2NrKCh1OCAqKWVkaWQsIGlzX3JiLCAmY2xvc3VyZSk7Cj4KPj4gKyAg ICAgICAgICAgaWYgKGNsb3N1cmUudmFsaWRfc3VwcG9ydF9yYikKPgo+PiArICAgICAgICAgICAg ICAgICAgIHJldHVybiBjbG9zdXJlLnN1cHBvcnRfcmI7Cj4KPgo+Cj4gQXJlIHlvdSBwbGFubmlu ZyBvbiBleHRlbmRpbmcgdGhlIGNsb3N1cmUgdXNlIHNvbWVob3c/Cj4KPgo+Cj4gSSBkaWQgbm90 IGxvb2sgdXAgdGhlIHNwZWMsCj4KPgo+Cj4gPT0+IGlURTogYXMgdGhlIHBpY3R1cmUgYmVsb3cs IGZyb20gVkVTQSBFLUVESUQgc3RhbmRhcmQKPgo+IFtjaWQ6aW1hZ2UwMDMuanBnQDAxRDVBOUVB LjlCNzM2NEQwXQo+Cj4KPgo+IFtjaWQ6aW1hZ2UwMDUuanBnQDAxRDVBOUVBLjlCNzM2NEQwXQo+ Cj4KPgo+IGlmIEVESUQgYml0IDAgaW4gZmVhdHVyZSBzdXBwb3J0IGJ5dGUgPSAxICYmIGRldGFp bGVkIHRpbWluZyBkZXNjcmlwdG9yIGJ5dGUgMTAgPSAweDA0IHRoZW4gdGhlIENWVCB0aW1pbmcg c3VwcG9ydGVkLgo+Cj4KPgo+IFtjaWQ6aW1hZ2UwMDkuanBnQDAxRDVBOUVBLjlCNzM2NEQwXQo+ Cj4KPgo+IElmIENWVCB0aW1pbmcgc3VwcG9ydGVkIHRoZW4gd2UgY2FuIGNoZWNrIGJ5dGUgMTUg Yml0IDQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJlZHVjZWQtYmxhbmtpbmcgdGltaW5ncyBz dXBvcnRlZCBvciBub3QuCj4KPiBJZiBDVlQgdGltaW5nIG5vdCBzdXBwb3J0ZWQgdGhlbiB3ZSBj YW4gbm90IHVzZSBieXRlIDE1IHRvIGp1ZGdlLgo+Cj4gYnV0IHB1cmVseSBvbiB0aGUgY29kZSBj aGFuZ2VzIGFsb25lLCB5b3UKPgo+IGNvdWxkIGp1c3QgbW92ZSB0aGUgZWRpZC0+ZmVhdHVyZXMg Yml0IGNoZWNrIGF0IHRoaXMgbGV2ZWwsIGFuZCBub3QgcGFzcwo+Cj4gaXQgZG93biwgYW5kIG5v dGhpbmcgd291bGQgY2hhbmdlLiBJLmUuIGRvbid0IGl0ZXJhdGUgdGhlIEVESUQgYXQgYWxsIGlm Cj4KPiB0aGUgYml0IGlzIG5vdCBzZXQuCj4KPgo+Cj4gw7AgIGlURTogV2Ugc3RpbGwgaGF2ZSB0 byBjaGVjayB3aGV0aGVyIGRldGFpbGVkIHRpbWluZyBkZXNjcmlwdG9yIGJ5dGUgMTAgPSAweDA0 IG9yIG5vdCwgc28gaXQgaXMgaGFyZCB0byBjaGVjayBhdCB0aGlzIGxldmVsCj4KPiBZb3UgYWxz byBkb24ndCBhY3R1YWxseSB1c2UgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gdmFsaWRfc3VwcG9y dF9yYgo+Cj4gdnMuIHN1cHBvcnRfcmIgZm9yIGFueXRoaW5nLCBzbyB0aGUgY2xvc3VyZSBqdXN0 IGFkZHMgY29kZS4KPgo+Cj4KPiBCUiwKPgo+IEphbmkuCj4KPgo+Cj4KPgo+PiAgICB9Cj4KPj4K Pgo+PiAgICByZXR1cm4gKChlZGlkLT5pbnB1dCAmIERSTV9FRElEX0lOUFVUX0RJR0lUQUwpICE9 IDApOwo+Cj4KPgo+IC0tCj4KPiBKYW5pIE5pa3VsYSwgSW50ZWwgT3BlbiBTb3VyY2UgR3JhcGhp Y3MgQ2VudGVyCgotLSAKSmFuaSBOaWt1bGEsIEludGVsIE9wZW4gU291cmNlIEdyYXBoaWNzIENl bnRlcgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmkt ZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6 Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWw=