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=-11.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, 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 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 2AE96C4727D for ; Fri, 25 Sep 2020 16:53:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id BC50421D7A for ; Fri, 25 Sep 2020 16:53:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="XTEOlNzh" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729576AbgIYQxi (ORCPT ); Fri, 25 Sep 2020 12:53:38 -0400 Received: from us-smtp-delivery-124.mimecast.com ([63.128.21.124]:59247 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727324AbgIYQxi (ORCPT ); Fri, 25 Sep 2020 12:53:38 -0400 Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1601052813; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bpUGMcwvdNI1X0aDj/iwu1akGrhtmnN7zlVK5NxAg2g=; b=XTEOlNzhYPCsthOQtIkHqHts/sK6b8ddtJuPHDQ5k+ovmHrkBL+Bvc1TwVD9MB6Wl2kPMy vwLUDfOsFfLEZZW8eR82U6P1Tc99VV56Z4o0uegZ7vbUwTjMZNBU2Atho/J8iBNkuVKu4q GXl9f4ytLB8WyuhJUxNpQn8gPFO813k= Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-422-qV5x_XtCNK6LvizgUKd9yw-1; Fri, 25 Sep 2020 12:53:26 -0400 X-MC-Unique: qV5x_XtCNK6LvizgUKd9yw-1 Received: by mail-qk1-f200.google.com with SMTP id a2so2366987qkg.19 for ; Fri, 25 Sep 2020 09:53:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:organization:user-agent:mime-version :content-transfer-encoding; bh=bpUGMcwvdNI1X0aDj/iwu1akGrhtmnN7zlVK5NxAg2g=; b=HWaZyWMqQAnlyB+XlU7LvUuDjMTQsE1pjnxXDc7SRHRGJ07fuwmwEB63Knzh3aMAm6 WYloN5EDWfnRq5+ImM11QC7DX7o11cwpAeB4LK3e/vdCdVL/kPS1II/enyPCe50xO7Ar sK6NS3GHC0fSW4Y3EEpHf2/cAO5ebTEdv9EL961ze1BKHVVdgxki3XsAU/3e0mYyCQ8G qb1mbaQo7P8sSR3doL3WvNYEPORBaGg+z6+1wxJJRop+yJrF3lbYbZi9O4LN4Xcl+Fhj TuuhquM4P4Qyzaztb6C/ECgRZHxxA2podT21F84QEVJxdrVbXC8Xe9ziqVv95EPlmQhu tl5w== X-Gm-Message-State: AOAM530t49V7kR01lSc/J3gEUCGsgIB0GvgM5VWiI9FLat6YJJLHwfvm ctKLE3xbNshY04ezbAPkpwIJM9oxBt7/Rf8TMUCJ3gXA9G48EKpg1F/J+mMlYOIvuQGmnVjfZ20 PisqxCeuFE/uZA/bUikd0bMAu X-Received: by 2002:a05:620a:1ef:: with SMTP id x15mr900390qkn.182.1601052804974; Fri, 25 Sep 2020 09:53:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwm9l3TXZPpxknhjOWRt17WwfTMryKg+4+HlKa45rrHHHdVUq1ob7Z42sctCucVFuX8lWGeog== X-Received: by 2002:a05:620a:1ef:: with SMTP id x15mr900327qkn.182.1601052804141; Fri, 25 Sep 2020 09:53:24 -0700 (PDT) Received: from Ruby.lyude.net (pool-108-49-102-102.bstnma.fios.verizon.net. [108.49.102.102]) by smtp.gmail.com with ESMTPSA id j25sm2233312qtr.83.2020.09.25.09.53.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Sep 2020 09:53:23 -0700 (PDT) Message-ID: Subject: Re: [Intel-gfx] [PATCH] i915: Introduce quirk for shifting eDP brightness. From: Lyude Paul To: Kevin Chowski , Jani Nikula Cc: Puthikorn Voravootivat , Ville =?ISO-8859-1?Q?Syrj=E4l=E4?= , David Airlie , intel-gfx , LKML , dri-devel@lists.freedesktop.org, Wambui Karuga , Rodrigo Vivi , Juha-Pekka Heikkila , Joonas Lahtinen , Hans de Goede , Daniel Vetter Date: Fri, 25 Sep 2020 12:53:21 -0400 In-Reply-To: References: <20200917110838.1.I63d52f5b96d7e81e1e2dc2a72c4bf5fd84d3d3d0@changeid> <87o8m4uxcn.fsf@intel.com> <20200917182535.GC6112@intel.com> <20200917201102.GD6112@intel.com> Organization: Red Hat Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.36.5 (3.36.5-1.fc32) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, 2020-09-24 at 17:46 -0600, Kevin Chowski wrote: > cc back a few others who were unintentionally dropped from the thread > earlier. > > Someone (at Google) helped me dig into this a little more and they > found a document titled "eDP Backlight Brightness bit alignment" sent > out for review in January 2017. I registered for a new account (google > is a member) and have access to the document; here is the URL for > those who also have access: > https://groups.vesa.org/wg/AllMem/document/7786. For what it's worth, > it seems like Lyude's contact Bill Lempesis uploaded this > change-request document, so I think we can reach out to him if we have > further questions. It's actually unclear to me what the status of this > change request is, and whether it's been officially accepted. But I > think it can be seen as some official advice on how we can move > forward here. > > Basically, this is a change request to the spec which acknowledges > that, despite the original spec implying that the > most-significant-bits were relevant here, many implementations used > the least-significant-bits. In defense of most-significant it laid out > some similar arguments to what Ville was saying. But it ends up > saying: > > > Unfortunately, the most common interpretation that we have > > encountered is case 1 in the example above. TCON vendors > > tend to align the valid bits to the LSBs, not the MSBs. > > Instead of changing the default defined functionality (as some earlier > version of this doc apparently suggested), this doc prefers to > allocate two extra bits in EDP_GENERAL_CAPABILITY_2 so that future > backlight devices can specify to the Source how to program them: > > 00: the current functionality, i,e. no defined interpretation > 01: aligned to most-significant bits > 10: aligned to least-significant bits > 11: reserved > > It also says "[Sources] should only need panel-specific workarounds > for the currently available panels." > > So I believe this document is an acknowledgement of many > implementations having their alignment to the least-significant bits, > and (to my eyes) clearly validates that the spec "should" be the > opposite. If we believe the doc's claim that "the most common > interpretation" is least-significant, it seems to me that it would > require more quirks if we made most-significant the default > implementation. > > Ville mentioned at some point earlier that we should try to match the > spec, whereas Lyude mentioned we should prefer to do what the majority > of machines do. What do you both think of this new development? That's how displayport happens to be sometimes :). Definitely isn't the first time something in the spec like this got implemented incorrectly so many times by different vendors that they had to update the spec in response (same thing happened with MST and interleaved sideband messages as of DP 2.0), so I'm really glad we went and actually investigated this. So yes - I think a quirk for this would definitely be a good idea, and IMO we should always lean on the side that more panels implement even if it's not according to spec - so defaulting to the behavior we currently have in the kernel, and adding quirks for panels that were smart enough not to fall for this would probably be the best way to go. That just leaves the challenge of "how do we figure out which panels actually need this and which ones don't?" This might end up being a bit of a challenge, but I've got some ideas on how we might be able to tackle it to the best of our ability based off my discussions with laptop vendors. It seems like some of the homegrown backlight interfaces might help us out here. Note I'm mentioning other laptop vendors here because at least for nouveau, our plan for DPCD backlight support is to move a lot of the code for handling it that currently lives in i915 into shared DRM helpers (which now we'll definitely need to do as a result of these quirks). So, on the x86 front, there's already a few different interfaces in use for laptop panels: * AMD usually uses their own backlight interface, so for AMD-only laptops we can probably safely ignore this * Intel uses their own DPCD backlight interface on most of the _non-ChromeOS_ machines on the market right now afaik based off my discussion with some laptop vendors. For panels that only come up in Intel-only machines, that means we only really need to care about the ChromeOS case here. So-if Google's able to actually survey the devices they're shipping with ChromeOS right now to figure out which ones are using DPCD backlight controls, and which ones need to be MSB aligned - then I'd think we could probably build an accurate quirk list of those panels easily. * This just leaves the nvidia case. Nvidia seems to be one of the only GPU vendors that didn't come up with their own backlight interface over DPCD, and they actually require that the panel support the VESA backlight control interface. Incidentally, a lot of the laptops that I've force-enabled VESA backlight controls on have nvidia GPUs in them, and so far every single one has worked with the code we currently use in the kernel. My hope with this would be that since nvidia's driver support is somewhat consistent, they either might have a list of problematic panels or can just verify with us that all of the panels that their driver interacts with follow the LSB preference. For the ChromeOS guys in the thread, does this sound like it could be workable? For the time being, I'll also send my nvidia contacts a poke to see what info they can give us. As well, we should probably poke Bill just in case he might know of some resource that documents some of the problematic panels out there (probably not, but it's at least worth a shot). I'll try to get around this today, but we might have to poke him once or twice since there originally was a problem with any of the emails from Red Hat getting through to him… > > I will also look into whether my specific device supports this > extension, and in that case I'll volunteer to implement this new > functionality in the driver. > > Thanks for your time, > Kevin > > On Tue, Sep 22, 2020 at 3:30 PM Lyude Paul wrote: > > Hi! Since I got dropped from the thread, many responses inline > > > > On Tue, 2020-09-22 at 12:58 -0700, Puthikorn Voravootivat wrote: > > > +Lyude > > > I notice that Lyude email was somehow dropped from the thread. > > > Lyude was the person who submitted the patch for Thinkpad and should > > > know the OUI of the panel. > > > > no need - currently because of some confusion that got caused by the Intel > > HDR > > backlight interface being the only backlight interface that works properly > > on > > a lot of panels (many panels will advertise both interfaces, but might > > only > > work with the Intel one), we actually rely on a small allowlist of > > "approved" > > panels for enabling DPCD backlight control. > > > > …however, many of these panels are annoying and don't actually provide a > > reliable enough OUID to use for quirk detection, which is why we had to > > add > > EDID quirk detection as a temporary workaround for this. The current list > > of > > panels lives in drm_dp_helper.c: > > > > /* > > * Some devices have unreliable OUIDs where they don't set the device ID > > * correctly, and as a result we need to use the EDID for finding > > additional > > * DP quirks in such cases. > > */ > > static const struct edid_quirk edid_quirk_list[] = { > > /* Optional 4K AMOLED panel in the ThinkPad X1 Extreme 2nd > > Generation > > * only supports DPCD backlight controls > > */ > > { MFG(0x4c, 0x83), PROD_ID(0x41, 0x41), > > BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) }, > > /* > > * Some Dell CML 2020 systems have panels support both AUX and PWM > > * backlight control, and some only support AUX backlight control. > > All > > * said panels start up in AUX mode by default, and we don't have > > any > > * support for disabling HDR mode on these panels which would be > > * required to switch to PWM backlight control mode (plus, I'm not > > * even sure we want PWM backlight controls over DPCD backlight > > * controls anyway...). Until we have a better way of detecting > > these, > > * force DPCD backlight mode on all of them. > > */ > > { MFG(0x06, 0xaf), PROD_ID(0x9b, 0x32), > > BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) }, > > { MFG(0x06, 0xaf), PROD_ID(0xeb, 0x41), > > BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) }, > > { MFG(0x4d, 0x10), PROD_ID(0xc7, 0x14), > > BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) }, > > { MFG(0x4d, 0x10), PROD_ID(0xe6, 0x14), > > BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) }, > > { MFG(0x4c, 0x83), PROD_ID(0x47, 0x41), > > BIT(DP_QUIRK_FORCE_DPCD_BACKLIGHT) }, > > }; > > > > Also note that I think just about every panel on that list supports the > > Intel > > HDR backlight interface, so it's -possible- that the VESA interface could > > be > > broken on these panels. But, that would be a lot of different panels from > > different vendors to all be broken in the same way. > > > > > On Tue, Sep 22, 2020 at 11:47 AM Kevin Chowski > > > wrote: > > > > Alrighty, I'll take everyone else's silence as tacit approval of > > > > Ville's opinions. (I didn't receive any email bounces this time, so I > > > > think my issue was transient.) I will start on inverting the quirk and > > > > making the most-significant-alignment matter for these registers by > > > > default. > > > > > > > > Who can help me gather a list of OUIs that we need to add to the > > > > quirk? I can follow up with Puthikorn about the relevant Chromebooks, > > > > but I don't know what other types of laptops are using this driver. > > > > > > > > Thanks for your time, > > > > Kevin Chowski > > > > > > > > > > > > On Fri, Sep 18, 2020 at 12:16 PM Puthikorn Voravootivat > > > > wrote: > > > > > I'll defer to Ville & Lyude. > > > > > > > > > > I dug up more on the bug report and found that both Thinkpad and > > > > > Galaxy Chromebook use the same Samsung OLED. > > > > > So my 2 vs 1 argument is actually not valid. > > > > > > > > > > On Fri, Sep 18, 2020 at 10:59 AM Kevin Chowski > > > > > > > > > > wrote: > > > > > > Apologies once again, some of my emails were bouncing for some > > > > > > addresses yesterday. Hopefully it was a temporary condition; I'll > > > > > > continue trying to dig into it on my end if it happens again for > > > > > > this > > > > > > email. > > > > > > > > > > > > Since there's evidence that some models want lsb and some (well, > > > > > > at > > > > > > least one) want msb, my understanding is that we'll need a quirk > > > > > > one > > > > > > way or the other (please correct if I'm mistaken). I unfortunately > > > > > > don't have the ability to test anything other than the Pixelbook, > > > > > > so > > > > > > if we decide the msb is the "right" way, then I will have to rely > > > > > > on > > > > > > others to test (and find the OUI of) other models which require > > > > > > lsb. > > > > > > > > > > > > I am happy to make any changes requested, but I do not at all have > > > > > > enough background here to make the decision on whether the msb > > > > > > functionality deserves the quirk or if the lsb one does. How can I > > > > > > help you all come to an agreement here? > > > > > > > > > > > > * It seems like Ville feels strongly about the msb being the > > > > > > correct > > > > > > interpretation of the spec. > > > > > > * It's unclear to me on which side of the fence Lyude falls, I > > > > > > couldn't pick up a strong opinion in her clarifying question. > > > > > > * Puthikorn seems to be on the side of lsb being correct, but > > > > > > maybe > > > > > > was swayed by Ville's argument. > > > > Honestly I'm not hard to convince :P, if it looks like we got the bit > > shift > > wrong for the majority of devices and everyone else agrees then I'm fine > > with > > assuming that's the case. I'm just quite surprised, seeing as we've tested > > many different panels from a few vendors and haven't run into any issues > > with > > this before. > > > > Honestly - if there's this much uncertainty about it, maybe we should just > > ask > > VESA directly what the correct interpretation of this is? Note I'm not on > > the > > VESA board (I get access to DP/eDP specs through X.org) so unless the > > contacts > > I've got from VESA would work (Bill Lempesis bill at vesa dot org) for > > that it > > might be a better idea for someone from Google or Intel to ask. > > > > > > > > If no one feels that Ville's argument is not strong in some way, > > > > > > and > > > > > > we go with that, I will get to work on the requested changes. I am > > > > > > concerned, though, about changing the default functionality > > > > > > without > > > > > > testing it widely to find the set of laptops which require the lsb > > > > > > quirk. I'd appreciate any advice people might have about making > > > > > > this > > > > > > change safely. > > > > Usually, I just try to stick with what the majority of machines need to > > do. I > > still think it'd be a good idea for us to verify this with VESA if there's > > that much confusion though > > > > > > > > Thank you for your time, > > > > > > Kevin > > > > > > > > > > > > On Thu, Sep 17, 2020 at 2:11 PM Ville Syrjälä > > > > > > wrote: > > > > > > > On Thu, Sep 17, 2020 at 09:25:35PM +0300, Ville Syrjälä wrote: > > > > > > > > On Thu, Sep 17, 2020 at 11:14:43AM -0700, Puthikorn > > > > > > > > Voravootivat > > > > > > > > wrote: > > > > > > > > > The Lyude fde7266fb2f6 change is actually based on Chromium > > > > > > > > > change > > > > > > > > > (https://crrev.com/c/1650325) that fixes the brightness for > > > > > > > > > Samsung > > > > > > > > > Galaxy Chromebook. So currently we have 2 examples that use > > > > > > > > > LSB > > > > > > > > > interpretation and 1 that use MSB. > > > > > > > > > > > > > > > > "If field 4:0 of the EDP_PWMGEN_BIT_COUNT register represents > > > > > > > > a > > > > > > > > value > > > > > > > > of greater than 8 and the BACKLIGHT_BRIGHTNESS_BYTE_COUNT bit > > > > > > > > is cleared to 0, only the 8 MSB of the brightness control > > > > > > > > value > > > > > > > > can be > > > > > > > > controlled. > > > > > > > > (See Note below.) > > > > > > > > Assigned bits are allocated to the MSB of the enabled register > > > > > > > > combination." > > > > > > > > > > > > > > > > I think that's pretty clear the assigned bits are supposed to > > > > > > > > be > > > > > > > > msb aligned. > > > > > > > > > > > > > > I guess there's some email issues happening, but just to > > > > > > > clarify: > > > > > > > > > > > > > > When the spec says MSB in caps here it clearly means > > > > > > > "most significant-bit(s)" since otherwise "8 MSB" would not make > > > > > > > any sense in the context of a 2 byte value. > > > > > > > > > > > > > > Granted the spec is crap here since "Table 1-1: Acronyms and > > > > > > > Initialism" does claim "MSB" should be byte(s) and "msb" bit(s). > > > > > > > > > > > > > > Also I can't imagine anyone would allocate the bits starting > > > > > > > from the lsb when the whole thing is clearly supposed to be a > > > > > > > 16bit big endian integer. So with >8 assigned bits you'd end > > > > > > > up with crazy stuff like this: > > > > > > > > > > > > > > [ 7 ... 0 ][7 ... 0] > > > > > > > [ 8 MSB ][XXXX][N LSB] > > > > > > > > > > > > > > so you couldn't even treat the value as a regular big endian > > > > > > > thing. Instead, if you squint a bit, it now looks like a funky > > > > > > > little endian value. So we're deep into some mixed endian land > > > > > > > where nothing makes sense anymore. > > > > > > > > > > > > > > Anyways I think the code should simply do this to match the > > > > > > > spec: > > > > > > > u16 value = brightness << (16 - num_assigned_bits); > > > > > > > val[0] = value >> 8; > > > > > > > val[1] = value & 0xff; > > > > > > > > > > > > > > > > > > > > > > > On Thu, Sep 17, 2020 at 10:55 AM Kevin Chowski < > > > > > > > > > chowski@chromium.org> wrote: > > > > > > > > > > Apologies for being too vague. To be as precise I can be, > > > > > > > > > > here > > > > > > > > > > is the > > > > > > > > > > specific code delta I tested: https://crrev.com/c/2406616 > > > > > > > > > > . To > > > > > > > > > > answer > > > > > > > > > > your other question, the code I tested against is indeed > > > > > > > > > > including the > > > > > > > > > > fde7266fb2f6 (despite ostensibly being called 5.4 in my > > > > > > > > > > commit > > > > > > > > > > message): our current top-of-tree for our 5.4 branch > > > > > > > > > > includes > > > > > > > > > > the > > > > > > > > > > intel_dp_aux_calc_max_backlight logic. Further, I'll note > > > > > > > > > > that > > > > > > > > > > change > > > > > > > > > > is exactly the change which breaks my Pixelbook model: > > > > > > > > > > prior > > > > > > > > > > to the > > > > > > > > > > change, the max_brightness was hard-coded to 0xFFFF and > > > > > > > > > > the > > > > > > > > > > math > > > > > > > > > > worked out that it didn't matter that the hardware cared > > > > > > > > > > about > > > > > > > > > > the MSB > > > > > > > > > > despite the driver code caring about the LSB. > > > > > > > > > > > > > > > > > > > > To answer Ville's question: the fde7266fb2f6 change which > > > > > > > > > > fixes one > > > > > > > > > > laptop (I believe Thinkpad X1 extreme Gen 2, from some bug > > > > > > > > > > reports I > > > > > > > > > > dug up) and breaks another (Pixelbook); so unfortunately I > > > > > > > > > > believe we > > > > > > > > > > need a quirk at least for some laptop. Reading through the > > > > > > > > > > copy of the > > > > > > > > > > datasheet I have, it wasn't clear to me which was the > > > > > > > > > > correct > > > > > > > > > > interpretation. I'm cc'ing puthik@, who was leaning toward > > > > > > > > > > the > > > > > > > > > > current > > > > > > > > > > kernel code (caring about LSB) being the correct > > > > > > > > > > interpretation. I > > > > > > > > > > believe we have other chromebooks which do rely on LSB > > > > > > > > > > functionality, > > > > > > > > > > so unless we can find more examples of laptops wanting MSB > > > > > > > > > > it > > > > > > > > > > currently looks like Pixelbook is the outlier. > > > > > > > > > > > > > > > > > > > > On Thu, Sep 17, 2020 at 11:28 AM Jani Nikula > > > > > > > > > > wrote: > > > > > > > > > > > On Thu, 17 Sep 2020, Kevin Chowski > > > > > > > > > > > > > > > > > > > > > > wrote: > > > > > > > > > > > > We have observed that Google Pixelbook's backlight > > > > > > > > > > > > hardware is > > > > > > > > > > > > interpretting these backlight bits from the most- > > > > > > > > > > > > significant side of the > > > > > > > > > > > > 16 bit word (if DP_EDP_PWMGEN_BIT_COUNT < 16), whereas > > > > > > > > > > > > the > > > > > > > > > > > > driver code > > > > > > > > > > > > assumes the peripheral cares about the least- > > > > > > > > > > > > significant > > > > > > > > > > > > bits. > > > > > > > > > > > > > > > > > > > > > > > > Testing was done from within Chrome OS's build > > > > > > > > > > > > environment > > > > > > > > > > > > when the > > > > > > > > > > > > patch is backported to 5.4 (the version we are newly > > > > > > > > > > > > targeting for the > > > > > > > > > > > > Pixelbook); for the record: > > > > > > > > > > > > $ emerge-eve-kernelnext sys-kernel/chromeos-kernel- > > > > > > > > > > > > 5_4 > > > > > > > > > > > > && \ > > > > > > > > > > > > ./update_kernel.sh --remote=$IP > > > > > > > > > > > > > > > > > > > > > > > > I used `/sys/kernel/debug/dri/0/eDP-1/i915_dpcd` on my > > > > > > > > > > > > laptop to verify > > > > > > > > > > > > that the registers were being set according to what > > > > > > > > > > > > the > > > > > > > > > > > > actual hardware > > > > > > > > > > > > expects; I also observe that the backlight is > > > > > > > > > > > > noticeably > > > > > > > > > > > > brighter with > > > > > > > > > > > > this patch. > > > > > > > > > > > > > > > > > > > > > > It's unclear to me what kernel version this is against, > > > > > > > > > > > and > > > > > > > > > > > what you've > > > > > > > > > > > actually tested. > > > > > > > > > > > > > > > > > > > > > > Have you tried v5.7 kernel with Lyude's fde7266fb2f6 > > > > > > > > > > > ("drm/i915: Fix eDP > > > > > > > > > > > DPCD aux max backlight calculations")? > > > > > > > > > > > > > > > > > > > > > > I just want to make sure you've tested with all the > > > > > > > > > > > relevant > > > > > > > > > > > fixes > > > > > > > > > > > before adding quirks. > > > > > > > > > > > > > > > > > > > > > > BR, > > > > > > > > > > > Jani. > > > > > > > > > > > > > > > > > > > > > > > Signed-off-by: Kevin Chowski > > > > > > > > > > > > --- > > > > > > > > > > > > > > > > > > > > > > > > .../drm/i915/display/intel_dp_aux_backlight.c | 34 > > > > > > > > > > > > +++++++++++++++++++ > > > > > > > > > > > > drivers/gpu/drm/i915/display/intel_quirks.c | 13 > > > > > > > > > > > > +++++++ > > > > > > > > > > > > drivers/gpu/drm/i915/i915_drv.h | 1 + > > > > > > > > > > > > 3 files changed, 48 insertions(+) > > > > > > > > > > > > > > > > > > > > > > > > diff --git > > > > > > > > > > > > a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight. > > > > > > > > > > > > c > > > > > > > > > > > > b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight. > > > > > > > > > > > > c > > > > > > > > > > > > index acbd7eb66cbe3..99c98f217356d 100644 > > > > > > > > > > > > --- > > > > > > > > > > > > a/drivers/gpu/drm/i915/display/intel_dp_aux_backlight. > > > > > > > > > > > > c > > > > > > > > > > > > +++ > > > > > > > > > > > > b/drivers/gpu/drm/i915/display/intel_dp_aux_backlight. > > > > > > > > > > > > c > > > > > > > > > > > > @@ -91,6 +91,23 @@ static u32 > > > > > > > > > > > > intel_dp_aux_get_backlight(struct intel_connector > > > > > > > > > > > > *connector) > > > > > > > > > > > > if (intel_dp->edp_dpcd[2] & > > > > > > > > > > > > DP_EDP_BACKLIGHT_BRIGHTNESS_BYTE_COUNT) > > > > > > > > > > > > level = (read_val[0] << 8 | > > > > > > > > > > > > read_val[1]); > > > > > > > > > > > > > > > > > > > > > > > > + if (i915->quirks & > > > > > > > > > > > > QUIRK_SHIFT_EDP_BACKLIGHT_BRIGHTNESS) { > > > > > > > > > > > > + if (!drm_dp_dpcd_readb(&intel_dp->aux, > > > > > > > > > > > > DP_EDP_PWMGEN_BIT_COUNT, > > > > > > > > > > > > + &read_va > > > > > > > > > > > > l[0] > > > > > > > > > > > > )) { > > > > > > > > > > > > + DRM_DEBUG_KMS("Failed to read > > > > > > > > > > > > DPCD > > > > > > > > > > > > register 0x%x\n", > > > > > > > > > > > > + DP_EDP_PWMGEN_BI > > > > > > > > > > > > T_CO > > > > > > > > > > > > UNT); > > > > > > > > > > > > + return 0; > > > > > > > > > > > > + } > > > > > > > > > > > > + // Only bits 4:0 are used, 7:5 are > > > > > > > > > > > > reserved. > > > > > > > > > > > > + read_val[0] = read_val[0] & 0x1F; > > > > > > > > > > > > + if (read_val[0] > 16) { > > > > > > > > > > > > + DRM_DEBUG_KMS("Invalid > > > > > > > > > > > > DP_EDP_PWNGEN_BIT_COUNT 0x%X, expected at most 16\n", > > > > > > > > > > > > + read_val > > > > > > > > > > > > [0]) > > > > > > > > > > > > ; > > > > > > > > > > > > + return 0; > > > > > > > > > > > > + } > > > > > > > > > > > > + level >>= 16 - read_val[0]; > > > > > > > > > > > > + } > > > > > > > > > > > > + > > > > > > > > > > > > return level; > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > > > @@ -106,6 +123,23 @@ intel_dp_aux_set_backlight(const > > > > > > > > > > > > struct drm_connector_state *conn_state, u32 lev > > > > > > > > > > > > struct drm_i915_private *i915 = > > > > > > > > > > > > dp_to_i915(intel_dp); > > > > > > > > > > > > u8 vals[2] = { 0x0 }; > > > > > > > > > > > > > > > > > > > > > > > > + if (i915->quirks & > > > > > > > > > > > > QUIRK_SHIFT_EDP_BACKLIGHT_BRIGHTNESS) { > > > > > > > > > > > > + if (!drm_dp_dpcd_readb(&intel_dp->aux, > > > > > > > > > > > > DP_EDP_PWMGEN_BIT_COUNT, > > > > > > > > > > > > + &vals[0] > > > > > > > > > > > > )) { > > > > > > > > > > > > + DRM_DEBUG_KMS("Failed to write > > > > > > > > > > > > aux > > > > > > > > > > > > backlight level: Failed to read DPCD register 0x%x\n", > > > > > > > > > > > > + DP_EDP_PWMGEN_ > > > > > > > > > > > > BIT_ > > > > > > > > > > > > COUNT); > > > > > > > > > > > > + return; > > > > > > > > > > > > + } > > > > > > > > > > > > + // Only bits 4:0 are used, 7:5 are > > > > > > > > > > > > reserved. > > > > > > > > > > > > + vals[0] = vals[0] & 0x1F; > > > > > > > > > > > > + if (vals[0] > 16) { > > > > > > > > > > > > + DRM_DEBUG_KMS("Failed to write > > > > > > > > > > > > aux > > > > > > > > > > > > backlight level: Invalid DP_EDP_PWNGEN_BIT_COUNT 0x%X, > > > > > > > > > > > > expected at most 16\n", > > > > > > > > > > > > + vals[0]) > > > > > > > > > > > > ; > > > > > > > > > > > > + return; > > > > > > > > > > > > + } > > > > > > > > > > > > + level <<= (16 - vals[0]) & 0xFFFF; > > > > > > > > > > > > + } > > > > > > > > > > > > + > > > > > > > > > > > > vals[0] = level; > > > > > > > > > > > > > > > > > > > > > > > > /* Write the MSB and/or LSB */ > > > > > > > > > > > > diff --git > > > > > > > > > > > > a/drivers/gpu/drm/i915/display/intel_quirks.c > > > > > > > > > > > > b/drivers/gpu/drm/i915/display/intel_quirks.c > > > > > > > > > > > > index 46beb155d835f..63b27d49b2864 100644 > > > > > > > > > > > > --- a/drivers/gpu/drm/i915/display/intel_quirks.c > > > > > > > > > > > > +++ b/drivers/gpu/drm/i915/display/intel_quirks.c > > > > > > > > > > > > @@ -53,6 +53,16 @@ static void > > > > > > > > > > > > quirk_increase_ddi_disabled_time(struct > > > > > > > > > > > > drm_i915_private > > > > > > > > > > > > *i915) > > > > > > > > > > > > drm_info(&i915->drm, "Applying Increase DDI > > > > > > > > > > > > Disabled > > > > > > > > > > > > quirk\n"); > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > > > +/* > > > > > > > > > > > > + * Some eDP backlight hardware uses the most- > > > > > > > > > > > > significant > > > > > > > > > > > > bits of the brightness > > > > > > > > > > > > + * register, so brightness values must be shifted > > > > > > > > > > > > first. > > > > > > > > > > > > + */ > > > > > > > > > > > > +static void > > > > > > > > > > > > quirk_shift_edp_backlight_brightness(struct > > > > > > > > > > > > drm_i915_private *i915) > > > > > > > > > > > > +{ > > > > > > > > > > > > + i915->quirks |= > > > > > > > > > > > > QUIRK_SHIFT_EDP_BACKLIGHT_BRIGHTNESS; > > > > > > > > > > > > + DRM_INFO("Applying shift eDP backlight > > > > > > > > > > > > brightness > > > > > > > > > > > > quirk\n"); > > > > > > > > > > > > +} > > > > > > > > > > > > + > > > > > > > > > > > > struct intel_quirk { > > > > > > > > > > > > int device; > > > > > > > > > > > > int subsystem_vendor; > > > > > > > > > > > > @@ -156,6 +166,9 @@ static struct intel_quirk > > > > > > > > > > > > intel_quirks[] = { > > > > > > > > > > > > /* ASRock ITX*/ > > > > > > > > > > > > { 0x3185, 0x1849, 0x2212, > > > > > > > > > > > > quirk_increase_ddi_disabled_time }, > > > > > > > > > > > > { 0x3184, 0x1849, 0x2212, > > > > > > > > > > > > quirk_increase_ddi_disabled_time }, > > > > > > > > > > > > + > > > > > > > > > > > > + /* Google Pixelbook */ > > > > > > > > > > > > + { 0x591E, 0x8086, 0x2212, > > > > > > > > > > > > quirk_shift_edp_backlight_brightness }, > > > > > > > > > > > > }; > > > > > > > > > > > > > > > > > > > > > > > > void intel_init_quirks(struct drm_i915_private *i915) > > > > > > > > > > > > diff --git a/drivers/gpu/drm/i915/i915_drv.h > > > > > > > > > > > > b/drivers/gpu/drm/i915/i915_drv.h > > > > > > > > > > > > index e4f7f6518945b..cc93bede4fab8 100644 > > > > > > > > > > > > --- a/drivers/gpu/drm/i915/i915_drv.h > > > > > > > > > > > > +++ b/drivers/gpu/drm/i915/i915_drv.h > > > > > > > > > > > > @@ -525,6 +525,7 @@ struct i915_psr { > > > > > > > > > > > > #define QUIRK_PIN_SWIZZLED_PAGES (1<<5) > > > > > > > > > > > > #define QUIRK_INCREASE_T12_DELAY (1<<6) > > > > > > > > > > > > #define QUIRK_INCREASE_DDI_DISABLED_TIME (1<<7) > > > > > > > > > > > > +#define QUIRK_SHIFT_EDP_BACKLIGHT_BRIGHTNESS (1<<8) > > > > > > > > > > > > > > > > > > > > > > > > struct intel_fbdev; > > > > > > > > > > > > struct intel_fbc_work; > > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > > > > > Jani Nikula, Intel Open Source Graphics Center > > > > > > > > > > > > > > > > -- > > > > > > > > Ville Syrjälä > > > > > > > > Intel > > > > > > > > _______________________________________________ > > > > > > > > Intel-gfx mailing list > > > > > > > > Intel-gfx@lists.freedesktop.org > > > > > > > > https://lists.freedesktop.org/mailman/listinfo/intel-gfx > > > > > > > > > > > > > > -- > > > > > > > Ville Syrjälä > > > > > > > Intel > > -- > > Cheers, > > Lyude Paul (she/her) > > Software Engineer at Red Hat > > -- Cheers, Lyude Paul (she/her) Software Engineer at Red Hat 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=-9.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable 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 DD814C4363D for ; Fri, 25 Sep 2020 16:53:45 +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 946F9208B6 for ; Fri, 25 Sep 2020 16:53:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="iJqqvnCF" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 946F9208B6 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.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 04BD16ED57; Fri, 25 Sep 2020 16:53:45 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3B0886ED45 for ; Fri, 25 Sep 2020 16:53:43 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1601052822; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bpUGMcwvdNI1X0aDj/iwu1akGrhtmnN7zlVK5NxAg2g=; b=iJqqvnCFCk1vtcLfah1V+UqPWoYHT1Te+8dBdJzK6TxLPRvjgDJ133+9w5JfPTmNJmqdm/ xeUowLiEIklaGqKlcUaAnoq28Zo+VM4vPRy0Q7rYhzOXlW0tYPXiZbkDUDMBGEvv3AhZzs sb+dD1ycxiTTrwjjN7NAGM+wvf033GQ= Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-356-E58mOU2_PmWfFfloMMkCkw-1; Fri, 25 Sep 2020 12:53:26 -0400 X-MC-Unique: E58mOU2_PmWfFfloMMkCkw-1 Received: by mail-qk1-f199.google.com with SMTP id x191so2396732qkb.3 for ; Fri, 25 Sep 2020 09:53:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:organization:user-agent:mime-version :content-transfer-encoding; bh=bpUGMcwvdNI1X0aDj/iwu1akGrhtmnN7zlVK5NxAg2g=; b=MB3q3LDEOce5ak1Vc4bDYxhj/LrvPAP77uPazswFoAbvpIP7Btm8RoE5nMQ++Mkjwl 2WPmI5XM5wsP+DhLFEFGXs/YNA0TluTiypPWZpUtpJSTSTSC3f5oHnc1cimbsCTUsgyy AknG2EubEZNRC/i1y4KJRSznZacrMDNL6qibe3ONwnF9aNBqkGJWXqu8XS51Pz7Ef+Xu Q5VvGegjeme0aF2/pdtio8HWvSkBtJ/jlIPuMQp87DtkWcQS5vQsR5n/54B42i4Kllow W1ftroZnosapJJGoT98QbkZMdIBKmW0KeGWs3inWssBjrcGDvp10NmbUtiD3rk9ouP4V DgyQ== X-Gm-Message-State: AOAM533Oi178QhGsUQBmw+CJNpG0uQM/K8nr8ayajEYRn4Q2aLAuY96O wOUTFI1h2f2pHdUQm3q9P4wA2whiSoCA1iARbIeRAIMb22Fs5RFdY0zFCzUJ+eMgl3oRaaC03/W qeKTUCqhY3FcH/4O9wPyXYcCmyuoZ X-Received: by 2002:a05:620a:1ef:: with SMTP id x15mr900393qkn.182.1601052805016; Fri, 25 Sep 2020 09:53:25 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwm9l3TXZPpxknhjOWRt17WwfTMryKg+4+HlKa45rrHHHdVUq1ob7Z42sctCucVFuX8lWGeog== X-Received: by 2002:a05:620a:1ef:: with SMTP id x15mr900327qkn.182.1601052804141; Fri, 25 Sep 2020 09:53:24 -0700 (PDT) Received: from Ruby.lyude.net (pool-108-49-102-102.bstnma.fios.verizon.net. [108.49.102.102]) by smtp.gmail.com with ESMTPSA id j25sm2233312qtr.83.2020.09.25.09.53.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Sep 2020 09:53:23 -0700 (PDT) Message-ID: Subject: Re: [Intel-gfx] [PATCH] i915: Introduce quirk for shifting eDP brightness. From: Lyude Paul To: Kevin Chowski , Jani Nikula Date: Fri, 25 Sep 2020 12:53:21 -0400 In-Reply-To: References: <20200917110838.1.I63d52f5b96d7e81e1e2dc2a72c4bf5fd84d3d3d0@changeid> <87o8m4uxcn.fsf@intel.com> <20200917182535.GC6112@intel.com> <20200917201102.GD6112@intel.com> Organization: Red Hat User-Agent: Evolution 3.36.5 (3.36.5-1.fc32) MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=lyude@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Juha-Pekka Heikkila , David Airlie , intel-gfx , LKML , dri-devel@lists.freedesktop.org, Hans de Goede , Rodrigo Vivi , Puthikorn Voravootivat , Wambui Karuga Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" T24gVGh1LCAyMDIwLTA5LTI0IGF0IDE3OjQ2IC0wNjAwLCBLZXZpbiBDaG93c2tpIHdyb3RlOgo+ IGNjIGJhY2sgYSBmZXcgb3RoZXJzIHdobyB3ZXJlIHVuaW50ZW50aW9uYWxseSBkcm9wcGVkIGZy b20gdGhlIHRocmVhZAo+IGVhcmxpZXIuCj4gCj4gU29tZW9uZSAoYXQgR29vZ2xlKSBoZWxwZWQg bWUgZGlnIGludG8gdGhpcyBhIGxpdHRsZSBtb3JlIGFuZCB0aGV5Cj4gZm91bmQgYSBkb2N1bWVu dCB0aXRsZWQgImVEUCBCYWNrbGlnaHQgQnJpZ2h0bmVzcyBiaXQgYWxpZ25tZW50IiBzZW50Cj4g b3V0IGZvciByZXZpZXcgaW4gSmFudWFyeSAyMDE3LiBJIHJlZ2lzdGVyZWQgZm9yIGEgbmV3IGFj Y291bnQgKGdvb2dsZQo+IGlzIGEgbWVtYmVyKSBhbmQgaGF2ZSBhY2Nlc3MgdG8gdGhlIGRvY3Vt ZW50OyBoZXJlIGlzIHRoZSBVUkwgZm9yCj4gdGhvc2Ugd2hvIGFsc28gaGF2ZSBhY2Nlc3M6Cj4g aHR0cHM6Ly9ncm91cHMudmVzYS5vcmcvd2cvQWxsTWVtL2RvY3VtZW50Lzc3ODYuIEZvciB3aGF0 IGl0J3Mgd29ydGgsCj4gaXQgc2VlbXMgbGlrZSBMeXVkZSdzIGNvbnRhY3QgQmlsbCBMZW1wZXNp cyB1cGxvYWRlZCB0aGlzCj4gY2hhbmdlLXJlcXVlc3QgZG9jdW1lbnQsIHNvIEkgdGhpbmsgd2Ug Y2FuIHJlYWNoIG91dCB0byBoaW0gaWYgd2UgaGF2ZQo+IGZ1cnRoZXIgcXVlc3Rpb25zLiBJdCdz IGFjdHVhbGx5IHVuY2xlYXIgdG8gbWUgd2hhdCB0aGUgc3RhdHVzIG9mIHRoaXMKPiBjaGFuZ2Ug cmVxdWVzdCBpcywgYW5kIHdoZXRoZXIgaXQncyBiZWVuIG9mZmljaWFsbHkgYWNjZXB0ZWQuIEJ1 dCBJCj4gdGhpbmsgaXQgY2FuIGJlIHNlZW4gYXMgc29tZSBvZmZpY2lhbCBhZHZpY2Ugb24gaG93 IHdlIGNhbiBtb3ZlCj4gZm9yd2FyZCBoZXJlLgo+IAo+IEJhc2ljYWxseSwgdGhpcyBpcyBhIGNo YW5nZSByZXF1ZXN0IHRvIHRoZSBzcGVjIHdoaWNoIGFja25vd2xlZGdlcwo+IHRoYXQsIGRlc3Bp dGUgdGhlIG9yaWdpbmFsIHNwZWMgaW1wbHlpbmcgdGhhdCB0aGUKPiBtb3N0LXNpZ25pZmljYW50 LWJpdHMgd2VyZSByZWxldmFudCBoZXJlLCBtYW55IGltcGxlbWVudGF0aW9ucyB1c2VkCj4gdGhl IGxlYXN0LXNpZ25pZmljYW50LWJpdHMuIEluIGRlZmVuc2Ugb2YgbW9zdC1zaWduaWZpY2FudCBp dCBsYWlkIG91dAo+IHNvbWUgc2ltaWxhciBhcmd1bWVudHMgdG8gd2hhdCBWaWxsZSB3YXMgc2F5 aW5nLiBCdXQgaXQgZW5kcyB1cAo+IHNheWluZzoKPiAKPiA+IFVuZm9ydHVuYXRlbHksIHRoZSBt b3N0IGNvbW1vbiBpbnRlcnByZXRhdGlvbiB0aGF0IHdlIGhhdmUKPiA+IGVuY291bnRlcmVkIGlz IGNhc2UgMSBpbiB0aGUgZXhhbXBsZSBhYm92ZS4gVENPTiB2ZW5kb3JzCj4gPiB0ZW5kIHRvIGFs aWduIHRoZSB2YWxpZCBiaXRzIHRvIHRoZSBMU0JzLCBub3QgdGhlIE1TQnMuCj4gCj4gSW5zdGVh ZCBvZiBjaGFuZ2luZyB0aGUgZGVmYXVsdCBkZWZpbmVkIGZ1bmN0aW9uYWxpdHkgKGFzIHNvbWUg ZWFybGllcgo+IHZlcnNpb24gb2YgdGhpcyBkb2MgYXBwYXJlbnRseSBzdWdnZXN0ZWQpLCB0aGlz IGRvYyBwcmVmZXJzIHRvCj4gYWxsb2NhdGUgdHdvIGV4dHJhIGJpdHMgaW4gRURQX0dFTkVSQUxf Q0FQQUJJTElUWV8yIHNvIHRoYXQgZnV0dXJlCj4gYmFja2xpZ2h0IGRldmljZXMgY2FuIHNwZWNp ZnkgdG8gdGhlIFNvdXJjZSBob3cgdG8gcHJvZ3JhbSB0aGVtOgo+IAo+IDAwOiB0aGUgY3VycmVu dCBmdW5jdGlvbmFsaXR5LCBpLGUuIG5vIGRlZmluZWQgaW50ZXJwcmV0YXRpb24KPiAwMTogYWxp Z25lZCB0byBtb3N0LXNpZ25pZmljYW50IGJpdHMKPiAxMDogYWxpZ25lZCB0byBsZWFzdC1zaWdu aWZpY2FudCBiaXRzCj4gMTE6IHJlc2VydmVkCj4gCj4gSXQgYWxzbyBzYXlzICJbU291cmNlc10g c2hvdWxkIG9ubHkgbmVlZCBwYW5lbC1zcGVjaWZpYyB3b3JrYXJvdW5kcwo+IGZvciB0aGUgY3Vy cmVudGx5IGF2YWlsYWJsZSBwYW5lbHMuIgo+IAo+IFNvIEkgYmVsaWV2ZSB0aGlzIGRvY3VtZW50 IGlzIGFuIGFja25vd2xlZGdlbWVudCBvZiBtYW55Cj4gaW1wbGVtZW50YXRpb25zIGhhdmluZyB0 aGVpciBhbGlnbm1lbnQgdG8gdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdHMsCj4gYW5kICh0byBt eSBleWVzKSBjbGVhcmx5IHZhbGlkYXRlcyB0aGF0IHRoZSBzcGVjICJzaG91bGQiIGJlIHRoZQo+ IG9wcG9zaXRlLiBJZiB3ZSBiZWxpZXZlIHRoZSBkb2MncyBjbGFpbSB0aGF0ICJ0aGUgbW9zdCBj b21tb24KPiBpbnRlcnByZXRhdGlvbiIgaXMgbGVhc3Qtc2lnbmlmaWNhbnQsIGl0IHNlZW1zIHRv IG1lIHRoYXQgaXQgd291bGQKPiByZXF1aXJlIG1vcmUgcXVpcmtzIGlmIHdlIG1hZGUgbW9zdC1z aWduaWZpY2FudCB0aGUgZGVmYXVsdAo+IGltcGxlbWVudGF0aW9uLgo+IAo+IFZpbGxlIG1lbnRp b25lZCBhdCBzb21lIHBvaW50IGVhcmxpZXIgdGhhdCB3ZSBzaG91bGQgdHJ5IHRvIG1hdGNoIHRo ZQo+IHNwZWMsIHdoZXJlYXMgTHl1ZGUgbWVudGlvbmVkIHdlIHNob3VsZCBwcmVmZXIgdG8gZG8g d2hhdCB0aGUgbWFqb3JpdHkKPiBvZiBtYWNoaW5lcyBkby4gV2hhdCBkbyB5b3UgYm90aCB0aGlu ayBvZiB0aGlzIG5ldyBkZXZlbG9wbWVudD8KClRoYXQncyBob3cgZGlzcGxheXBvcnQgaGFwcGVu cyB0byBiZSBzb21ldGltZXMgOikuIERlZmluaXRlbHkgaXNuJ3QgdGhlIGZpcnN0CnRpbWUgc29t ZXRoaW5nIGluIHRoZSBzcGVjIGxpa2UgdGhpcyBnb3QgaW1wbGVtZW50ZWQgaW5jb3JyZWN0bHkg c28gbWFueSB0aW1lcwpieSBkaWZmZXJlbnQgdmVuZG9ycyB0aGF0IHRoZXkgaGFkIHRvIHVwZGF0 ZSB0aGUgc3BlYyBpbiByZXNwb25zZSAoc2FtZSB0aGluZwpoYXBwZW5lZCB3aXRoIE1TVCBhbmQg aW50ZXJsZWF2ZWQgc2lkZWJhbmQgbWVzc2FnZXMgYXMgb2YgRFAgMi4wKSwgc28gSSdtCnJlYWxs eSBnbGFkIHdlIHdlbnQgYW5kIGFjdHVhbGx5IGludmVzdGlnYXRlZCB0aGlzLgoKU28geWVzIC0g SSB0aGluayBhIHF1aXJrIGZvciB0aGlzIHdvdWxkIGRlZmluaXRlbHkgYmUgYSBnb29kIGlkZWEs IGFuZCBJTU8gd2UKc2hvdWxkIGFsd2F5cyBsZWFuIG9uIHRoZSBzaWRlIHRoYXQgbW9yZSBwYW5l bHMgaW1wbGVtZW50IGV2ZW4gaWYgaXQncyBub3QKYWNjb3JkaW5nIHRvIHNwZWMgLSBzbyBkZWZh dWx0aW5nIHRvIHRoZSBiZWhhdmlvciB3ZSBjdXJyZW50bHkgaGF2ZSBpbiB0aGUKa2VybmVsLCBh bmQgYWRkaW5nIHF1aXJrcyBmb3IgcGFuZWxzIHRoYXQgd2VyZSBzbWFydCBlbm91Z2ggbm90IHRv IGZhbGwgZm9yCnRoaXMgd291bGQgcHJvYmFibHkgYmUgdGhlIGJlc3Qgd2F5IHRvIGdvLiBUaGF0 IGp1c3QgbGVhdmVzIHRoZSBjaGFsbGVuZ2Ugb2YKImhvdyBkbyB3ZSBmaWd1cmUgb3V0IHdoaWNo IHBhbmVscyBhY3R1YWxseSBuZWVkIHRoaXMgYW5kIHdoaWNoIG9uZXMgZG9uJ3Q/IgoKVGhpcyBt aWdodCBlbmQgdXAgYmVpbmcgYSBiaXQgb2YgYSBjaGFsbGVuZ2UsIGJ1dCBJJ3ZlIGdvdCBzb21l IGlkZWFzIG9uIGhvdwp3ZSBtaWdodCBiZSBhYmxlIHRvIHRhY2tsZSBpdCB0byB0aGUgYmVzdCBv ZiBvdXIgYWJpbGl0eSBiYXNlZCBvZmYgbXkKZGlzY3Vzc2lvbnMgd2l0aCBsYXB0b3AgdmVuZG9y cy4gSXQgc2VlbXMgbGlrZSBzb21lIG9mIHRoZSBob21lZ3Jvd24gYmFja2xpZ2h0CmludGVyZmFj ZXMgbWlnaHQgaGVscCB1cyBvdXQgaGVyZS4gTm90ZSBJJ20gbWVudGlvbmluZyBvdGhlciBsYXB0 b3AgdmVuZG9ycwpoZXJlIGJlY2F1c2UgYXQgbGVhc3QgZm9yIG5vdXZlYXUsIG91ciBwbGFuIGZv ciBEUENEIGJhY2tsaWdodCBzdXBwb3J0IGlzIHRvCm1vdmUgYSBsb3Qgb2YgdGhlIGNvZGUgZm9y IGhhbmRsaW5nIGl0IHRoYXQgY3VycmVudGx5IGxpdmVzIGluIGk5MTUgaW50bwpzaGFyZWQgRFJN IGhlbHBlcnMgKHdoaWNoIG5vdyB3ZSdsbCBkZWZpbml0ZWx5IG5lZWQgdG8gZG8gYXMgYSByZXN1 bHQgb2YgdGhlc2UKcXVpcmtzKS4KClNvLCBvbiB0aGUgeDg2IGZyb250LCB0aGVyZSdzIGFscmVh ZHkgYSBmZXcgZGlmZmVyZW50IGludGVyZmFjZXMgaW4gdXNlIGZvcgpsYXB0b3AgcGFuZWxzOgog KiBBTUQgdXN1YWxseSB1c2VzIHRoZWlyIG93biBiYWNrbGlnaHQgaW50ZXJmYWNlLCBzbyBmb3Ig QU1ELW9ubHkgbGFwdG9wcyB3ZQogICBjYW4gcHJvYmFibHkgc2FmZWx5IGlnbm9yZSB0aGlzCiAq IEludGVsIHVzZXMgdGhlaXIgb3duIERQQ0QgYmFja2xpZ2h0IGludGVyZmFjZSBvbiBtb3N0IG9m IHRoZSBfbm9uLUNocm9tZU9TXyAKICAgbWFjaGluZXMgb24gdGhlIG1hcmtldCByaWdodCBub3cg YWZhaWsgYmFzZWQgb2ZmIG15IGRpc2N1c3Npb24gd2l0aCBzb21lCiAgIGxhcHRvcCB2ZW5kb3Jz LiBGb3IgcGFuZWxzIHRoYXQgb25seSBjb21lIHVwIGluIEludGVsLW9ubHkgbWFjaGluZXMsIHRo YXQKICAgbWVhbnMgd2Ugb25seSByZWFsbHkgbmVlZCB0byBjYXJlIGFib3V0IHRoZSBDaHJvbWVP UyBjYXNlIGhlcmUuIFNvLWlmCiAgIEdvb2dsZSdzIGFibGUgdG8gYWN0dWFsbHkgc3VydmV5IHRo ZSBkZXZpY2VzIHRoZXkncmUgc2hpcHBpbmcgd2l0aCBDaHJvbWVPUwogICByaWdodCBub3cgdG8g ZmlndXJlIG91dCB3aGljaCBvbmVzIGFyZSB1c2luZyBEUENEIGJhY2tsaWdodCBjb250cm9scywg YW5kCiAgIHdoaWNoIG9uZXMgbmVlZCB0byBiZSBNU0IgYWxpZ25lZCAtIHRoZW4gSSdkIHRoaW5r IHdlIGNvdWxkIHByb2JhYmx5IGJ1aWxkCiAgIGFuIGFjY3VyYXRlIHF1aXJrIGxpc3Qgb2YgdGhv c2UgcGFuZWxzIGVhc2lseS4KICogVGhpcyBqdXN0IGxlYXZlcyB0aGUgbnZpZGlhIGNhc2UuIE52 aWRpYSBzZWVtcyB0byBiZSBvbmUgb2YgdGhlIG9ubHkgR1BVCiAgIHZlbmRvcnMgdGhhdCBkaWRu J3QgY29tZSB1cCB3aXRoIHRoZWlyIG93biBiYWNrbGlnaHQgaW50ZXJmYWNlIG92ZXIgRFBDRCwK ICAgYW5kIHRoZXkgYWN0dWFsbHkgcmVxdWlyZSB0aGF0IHRoZSBwYW5lbCBzdXBwb3J0IHRoZSBW RVNBIGJhY2tsaWdodCBjb250cm9sCiAgIGludGVyZmFjZS4gSW5jaWRlbnRhbGx5LCBhIGxvdCBv ZiB0aGUgbGFwdG9wcyB0aGF0IEkndmUgZm9yY2UtZW5hYmxlZCBWRVNBCiAgIGJhY2tsaWdodCBj b250cm9scyBvbiBoYXZlIG52aWRpYSBHUFVzIGluIHRoZW0sIGFuZCBzbyBmYXIgZXZlcnkgc2lu Z2xlIG9uZQogICBoYXMgd29ya2VkIHdpdGggdGhlIGNvZGUgd2UgY3VycmVudGx5IHVzZSBpbiB0 aGUga2VybmVsLiBNeSBob3BlIHdpdGggdGhpcwogICB3b3VsZCBiZSB0aGF0IHNpbmNlIG52aWRp YSdzIGRyaXZlciBzdXBwb3J0IGlzIHNvbWV3aGF0IGNvbnNpc3RlbnQsIHRoZXkKICAgZWl0aGVy IG1pZ2h0IGhhdmUgYSBsaXN0IG9mIHByb2JsZW1hdGljIHBhbmVscyBvciBjYW4ganVzdCB2ZXJp Znkgd2l0aCB1cwogICB0aGF0IGFsbCBvZiB0aGUgcGFuZWxzIHRoYXQgdGhlaXIgZHJpdmVyIGlu dGVyYWN0cyB3aXRoIGZvbGxvdyB0aGUgTFNCCiAgIHByZWZlcmVuY2UuCgpGb3IgdGhlIENocm9t ZU9TIGd1eXMgaW4gdGhlIHRocmVhZCwgZG9lcyB0aGlzIHNvdW5kIGxpa2UgaXQgY291bGQgYmUK d29ya2FibGU/IEZvciB0aGUgdGltZSBiZWluZywgSSdsbCBhbHNvIHNlbmQgbXkgbnZpZGlhIGNv bnRhY3RzIGEgcG9rZSB0byBzZWUKd2hhdCBpbmZvIHRoZXkgY2FuIGdpdmUgdXMuIEFzIHdlbGws IHdlIHNob3VsZCBwcm9iYWJseSBwb2tlIEJpbGwganVzdCBpbiBjYXNlCmhlIG1pZ2h0IGtub3cg b2Ygc29tZSByZXNvdXJjZSB0aGF0IGRvY3VtZW50cyBzb21lIG9mIHRoZSBwcm9ibGVtYXRpYyBw YW5lbHMKb3V0IHRoZXJlIChwcm9iYWJseSBub3QsIGJ1dCBpdCdzIGF0IGxlYXN0IHdvcnRoIGEg c2hvdCkuIEknbGwgdHJ5IHRvIGdldAphcm91bmQgdGhpcyB0b2RheSwgYnV0IHdlIG1pZ2h0IGhh dmUgdG8gcG9rZSBoaW0gb25jZSBvciB0d2ljZSBzaW5jZSB0aGVyZQpvcmlnaW5hbGx5IHdhcyBh IHByb2JsZW0gd2l0aCBhbnkgb2YgdGhlIGVtYWlscyBmcm9tIFJlZCBIYXQgZ2V0dGluZyB0aHJv dWdoCnRvIGhpbeKApgoKPiAKPiBJIHdpbGwgYWxzbyBsb29rIGludG8gd2hldGhlciBteSBzcGVj aWZpYyBkZXZpY2Ugc3VwcG9ydHMgdGhpcwo+IGV4dGVuc2lvbiwgYW5kIGluIHRoYXQgY2FzZSBJ J2xsIHZvbHVudGVlciB0byBpbXBsZW1lbnQgdGhpcyBuZXcKPiBmdW5jdGlvbmFsaXR5IGluIHRo ZSBkcml2ZXIuCj4gCj4gVGhhbmtzIGZvciB5b3VyIHRpbWUsCj4gS2V2aW4KPiAKPiBPbiBUdWUs IFNlcCAyMiwgMjAyMCBhdCAzOjMwIFBNIEx5dWRlIFBhdWwgPGx5dWRlQHJlZGhhdC5jb20+IHdy b3RlOgo+ID4gSGkhIFNpbmNlIEkgZ290IGRyb3BwZWQgZnJvbSB0aGUgdGhyZWFkLCBtYW55IHJl c3BvbnNlcyBpbmxpbmUKPiA+IAo+ID4gT24gVHVlLCAyMDIwLTA5LTIyIGF0IDEyOjU4IC0wNzAw LCBQdXRoaWtvcm4gVm9yYXZvb3RpdmF0IHdyb3RlOgo+ID4gPiArTHl1ZGUKPiA+ID4gSSBub3Rp Y2UgdGhhdCBMeXVkZSBlbWFpbCB3YXMgc29tZWhvdyBkcm9wcGVkIGZyb20gdGhlIHRocmVhZC4K PiA+ID4gTHl1ZGUgd2FzIHRoZSBwZXJzb24gd2hvIHN1Ym1pdHRlZCB0aGUgcGF0Y2ggZm9yIFRo aW5rcGFkIGFuZCBzaG91bGQKPiA+ID4ga25vdyB0aGUgT1VJIG9mIHRoZSBwYW5lbC4KPiA+IAo+ ID4gbm8gbmVlZCAtIGN1cnJlbnRseSBiZWNhdXNlIG9mIHNvbWUgY29uZnVzaW9uIHRoYXQgZ290 IGNhdXNlZCBieSB0aGUgSW50ZWwKPiA+IEhEUgo+ID4gYmFja2xpZ2h0IGludGVyZmFjZSBiZWlu ZyB0aGUgb25seSBiYWNrbGlnaHQgaW50ZXJmYWNlIHRoYXQgd29ya3MgcHJvcGVybHkKPiA+IG9u Cj4gPiBhIGxvdCBvZiBwYW5lbHMgKG1hbnkgcGFuZWxzIHdpbGwgYWR2ZXJ0aXNlIGJvdGggaW50 ZXJmYWNlcywgYnV0IG1pZ2h0Cj4gPiBvbmx5Cj4gPiB3b3JrIHdpdGggdGhlIEludGVsIG9uZSks IHdlIGFjdHVhbGx5IHJlbHkgb24gYSBzbWFsbCBhbGxvd2xpc3Qgb2YKPiA+ICJhcHByb3ZlZCIK PiA+IHBhbmVscyBmb3IgZW5hYmxpbmcgRFBDRCBiYWNrbGlnaHQgY29udHJvbC4KPiA+IAo+ID4g 4oCmaG93ZXZlciwgbWFueSBvZiB0aGVzZSBwYW5lbHMgYXJlIGFubm95aW5nIGFuZCBkb24ndCBh Y3R1YWxseSBwcm92aWRlIGEKPiA+IHJlbGlhYmxlIGVub3VnaCBPVUlEIHRvIHVzZSBmb3IgcXVp cmsgZGV0ZWN0aW9uLCB3aGljaCBpcyB3aHkgd2UgaGFkIHRvCj4gPiBhZGQKPiA+IEVESUQgcXVp cmsgZGV0ZWN0aW9uIGFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIHRoaXMuIFRoZSBjdXJy ZW50IGxpc3QKPiA+IG9mCj4gPiBwYW5lbHMgbGl2ZXMgaW4gZHJtX2RwX2hlbHBlci5jOgo+ID4g Cj4gPiAvKgo+ID4gICogU29tZSBkZXZpY2VzIGhhdmUgdW5yZWxpYWJsZSBPVUlEcyB3aGVyZSB0 aGV5IGRvbid0IHNldCB0aGUgZGV2aWNlIElECj4gPiAgKiBjb3JyZWN0bHksIGFuZCBhcyBhIHJl c3VsdCB3ZSBuZWVkIHRvIHVzZSB0aGUgRURJRCBmb3IgZmluZGluZwo+ID4gYWRkaXRpb25hbAo+ ID4gICogRFAgcXVpcmtzIGluIHN1Y2ggY2FzZXMuCj4gPiAgKi8KPiA+IHN0YXRpYyBjb25zdCBz dHJ1Y3QgZWRpZF9xdWlyayBlZGlkX3F1aXJrX2xpc3RbXSA9IHsKPiA+ICAgICAgICAgLyogT3B0 aW9uYWwgNEsgQU1PTEVEIHBhbmVsIGluIHRoZSBUaGlua1BhZCBYMSBFeHRyZW1lIDJuZAo+ID4g R2VuZXJhdGlvbgo+ID4gICAgICAgICAgKiBvbmx5IHN1cHBvcnRzIERQQ0QgYmFja2xpZ2h0IGNv bnRyb2xzCj4gPiAgICAgICAgICAqLwo+ID4gICAgICAgICB7IE1GRygweDRjLCAweDgzKSwgUFJP RF9JRCgweDQxLCAweDQxKSwKPiA+IEJJVChEUF9RVUlSS19GT1JDRV9EUENEX0JBQ0tMSUdIVCkg fSwKPiA+ICAgICAgICAgLyoKPiA+ICAgICAgICAgICogU29tZSBEZWxsIENNTCAyMDIwIHN5c3Rl bXMgaGF2ZSBwYW5lbHMgc3VwcG9ydCBib3RoIEFVWCBhbmQgUFdNCj4gPiAgICAgICAgICAqIGJh Y2tsaWdodCBjb250cm9sLCBhbmQgc29tZSBvbmx5IHN1cHBvcnQgQVVYIGJhY2tsaWdodCBjb250 cm9sLgo+ID4gQWxsCj4gPiAgICAgICAgICAqIHNhaWQgcGFuZWxzIHN0YXJ0IHVwIGluIEFVWCBt b2RlIGJ5IGRlZmF1bHQsIGFuZCB3ZSBkb24ndCBoYXZlCj4gPiBhbnkKPiA+ICAgICAgICAgICog c3VwcG9ydCBmb3IgZGlzYWJsaW5nIEhEUiBtb2RlIG9uIHRoZXNlIHBhbmVscyB3aGljaCB3b3Vs ZCBiZQo+ID4gICAgICAgICAgKiByZXF1aXJlZCB0byBzd2l0Y2ggdG8gUFdNIGJhY2tsaWdodCBj b250cm9sIG1vZGUgKHBsdXMsIEknbSBub3QKPiA+ICAgICAgICAgICogZXZlbiBzdXJlIHdlIHdh bnQgUFdNIGJhY2tsaWdodCBjb250cm9scyBvdmVyIERQQ0QgYmFja2xpZ2h0Cj4gPiAgICAgICAg ICAqIGNvbnRyb2xzIGFueXdheS4uLikuIFVudGlsIHdlIGhhdmUgYSBiZXR0ZXIgd2F5IG9mIGRl dGVjdGluZwo+ID4gdGhlc2UsCj4gPiAgICAgICAgICAqIGZvcmNlIERQQ0QgYmFja2xpZ2h0IG1v ZGUgb24gYWxsIG9mIHRoZW0uCj4gPiAgICAgICAgICAqLwo+ID4gICAgICAgICB7IE1GRygweDA2 LCAweGFmKSwgUFJPRF9JRCgweDliLCAweDMyKSwKPiA+IEJJVChEUF9RVUlSS19GT1JDRV9EUENE X0JBQ0tMSUdIVCkgfSwKPiA+ICAgICAgICAgeyBNRkcoMHgwNiwgMHhhZiksIFBST0RfSUQoMHhl YiwgMHg0MSksCj4gPiBCSVQoRFBfUVVJUktfRk9SQ0VfRFBDRF9CQUNLTElHSFQpIH0sCj4gPiAg ICAgICAgIHsgTUZHKDB4NGQsIDB4MTApLCBQUk9EX0lEKDB4YzcsIDB4MTQpLAo+ID4gQklUKERQ X1FVSVJLX0ZPUkNFX0RQQ0RfQkFDS0xJR0hUKSB9LAo+ID4gICAgICAgICB7IE1GRygweDRkLCAw eDEwKSwgUFJPRF9JRCgweGU2LCAweDE0KSwKPiA+IEJJVChEUF9RVUlSS19GT1JDRV9EUENEX0JB Q0tMSUdIVCkgfSwKPiA+ICAgICAgICAgeyBNRkcoMHg0YywgMHg4MyksIFBST0RfSUQoMHg0Nywg MHg0MSksCj4gPiBCSVQoRFBfUVVJUktfRk9SQ0VfRFBDRF9CQUNLTElHSFQpIH0sCj4gPiB9Owo+ ID4gCj4gPiBBbHNvIG5vdGUgdGhhdCBJIHRoaW5rIGp1c3QgYWJvdXQgZXZlcnkgcGFuZWwgb24g dGhhdCBsaXN0IHN1cHBvcnRzIHRoZQo+ID4gSW50ZWwKPiA+IEhEUiBiYWNrbGlnaHQgaW50ZXJm YWNlLCBzbyBpdCdzIC1wb3NzaWJsZS0gdGhhdCB0aGUgVkVTQSBpbnRlcmZhY2UgY291bGQKPiA+ IGJlCj4gPiBicm9rZW4gb24gdGhlc2UgcGFuZWxzLiBCdXQsIHRoYXQgd291bGQgYmUgYSBsb3Qg b2YgZGlmZmVyZW50IHBhbmVscyBmcm9tCj4gPiBkaWZmZXJlbnQgdmVuZG9ycyB0byBhbGwgYmUg YnJva2VuIGluIHRoZSBzYW1lIHdheS4KPiA+IAo+ID4gPiBPbiBUdWUsIFNlcCAyMiwgMjAyMCBh dCAxMTo0NyBBTSBLZXZpbiBDaG93c2tpIDxjaG93c2tpQGNocm9taXVtLm9yZz4KPiA+ID4gd3Jv dGU6Cj4gPiA+ID4gQWxyaWdodHksIEknbGwgdGFrZSBldmVyeW9uZSBlbHNlJ3Mgc2lsZW5jZSBh cyB0YWNpdCBhcHByb3ZhbCBvZgo+ID4gPiA+IFZpbGxlJ3Mgb3BpbmlvbnMuIChJIGRpZG4ndCBy ZWNlaXZlIGFueSBlbWFpbCBib3VuY2VzIHRoaXMgdGltZSwgc28gSQo+ID4gPiA+IHRoaW5rIG15 IGlzc3VlIHdhcyB0cmFuc2llbnQuKSBJIHdpbGwgc3RhcnQgb24gaW52ZXJ0aW5nIHRoZSBxdWly ayBhbmQKPiA+ID4gPiBtYWtpbmcgdGhlIG1vc3Qtc2lnbmlmaWNhbnQtYWxpZ25tZW50IG1hdHRl ciBmb3IgdGhlc2UgcmVnaXN0ZXJzIGJ5Cj4gPiA+ID4gZGVmYXVsdC4KPiA+ID4gPiAKPiA+ID4g PiBXaG8gY2FuIGhlbHAgbWUgZ2F0aGVyIGEgbGlzdCBvZiBPVUlzIHRoYXQgd2UgbmVlZCB0byBh ZGQgdG8gdGhlCj4gPiA+ID4gcXVpcms/IEkgY2FuIGZvbGxvdyB1cCB3aXRoIFB1dGhpa29ybiBh Ym91dCB0aGUgcmVsZXZhbnQgQ2hyb21lYm9va3MsCj4gPiA+ID4gYnV0IEkgZG9uJ3Qga25vdyB3 aGF0IG90aGVyIHR5cGVzIG9mIGxhcHRvcHMgYXJlIHVzaW5nIHRoaXMgZHJpdmVyLgo+ID4gPiA+ IAo+ID4gPiA+IFRoYW5rcyBmb3IgeW91ciB0aW1lLAo+ID4gPiA+IEtldmluIENob3dza2kKPiA+ ID4gPiAKPiA+ID4gPiAKPiA+ID4gPiBPbiBGcmksIFNlcCAxOCwgMjAyMCBhdCAxMjoxNiBQTSBQ dXRoaWtvcm4gVm9yYXZvb3RpdmF0Cj4gPiA+ID4gPHB1dGhpa0BjaHJvbWl1bS5vcmc+IHdyb3Rl Ogo+ID4gPiA+ID4gSSdsbCBkZWZlciB0byBWaWxsZSAmIEx5dWRlLgo+ID4gPiA+ID4gCj4gPiA+ ID4gPiBJIGR1ZyB1cCBtb3JlIG9uIHRoZSBidWcgcmVwb3J0IGFuZCBmb3VuZCB0aGF0IGJvdGgg VGhpbmtwYWQgYW5kCj4gPiA+ID4gPiBHYWxheHkgQ2hyb21lYm9vayB1c2UgdGhlIHNhbWUgU2Ft c3VuZyBPTEVELgo+ID4gPiA+ID4gU28gbXkgMiB2cyAxIGFyZ3VtZW50IGlzIGFjdHVhbGx5IG5v dCB2YWxpZC4KPiA+ID4gPiA+IAo+ID4gPiA+ID4gT24gRnJpLCBTZXAgMTgsIDIwMjAgYXQgMTA6 NTkgQU0gS2V2aW4gQ2hvd3NraSA8Y2hvd3NraUBjaHJvbWl1bS5vcmcKPiA+ID4gPiA+ID4KPiA+ ID4gPiA+IHdyb3RlOgo+ID4gPiA+ID4gPiBBcG9sb2dpZXMgb25jZSBhZ2Fpbiwgc29tZSBvZiBt eSBlbWFpbHMgd2VyZSBib3VuY2luZyBmb3Igc29tZQo+ID4gPiA+ID4gPiBhZGRyZXNzZXMgeWVz dGVyZGF5LiBIb3BlZnVsbHkgaXQgd2FzIGEgdGVtcG9yYXJ5IGNvbmRpdGlvbjsgSSdsbAo+ID4g PiA+ID4gPiBjb250aW51ZSB0cnlpbmcgdG8gZGlnIGludG8gaXQgb24gbXkgZW5kIGlmIGl0IGhh cHBlbnMgYWdhaW4gZm9yCj4gPiA+ID4gPiA+IHRoaXMKPiA+ID4gPiA+ID4gZW1haWwuCj4gPiA+ ID4gPiA+IAo+ID4gPiA+ID4gPiBTaW5jZSB0aGVyZSdzIGV2aWRlbmNlIHRoYXQgc29tZSBtb2Rl bHMgd2FudCBsc2IgYW5kIHNvbWUgKHdlbGwsCj4gPiA+ID4gPiA+IGF0Cj4gPiA+ID4gPiA+IGxl YXN0IG9uZSkgd2FudCBtc2IsIG15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCB3ZSdsbCBuZWVkIGEg cXVpcmsKPiA+ID4gPiA+ID4gb25lCj4gPiA+ID4gPiA+IHdheSBvciB0aGUgb3RoZXIgKHBsZWFz ZSBjb3JyZWN0IGlmIEknbSBtaXN0YWtlbikuIEkgdW5mb3J0dW5hdGVseQo+ID4gPiA+ID4gPiBk b24ndCBoYXZlIHRoZSBhYmlsaXR5IHRvIHRlc3QgYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUgUGl4 ZWxib29rLAo+ID4gPiA+ID4gPiBzbwo+ID4gPiA+ID4gPiBpZiB3ZSBkZWNpZGUgdGhlIG1zYiBp cyB0aGUgInJpZ2h0IiB3YXksIHRoZW4gSSB3aWxsIGhhdmUgdG8gcmVseQo+ID4gPiA+ID4gPiBv bgo+ID4gPiA+ID4gPiBvdGhlcnMgdG8gdGVzdCAoYW5kIGZpbmQgdGhlIE9VSSBvZikgb3RoZXIg bW9kZWxzIHdoaWNoIHJlcXVpcmUKPiA+ID4gPiA+ID4gbHNiLgo+ID4gPiA+ID4gPiAKPiA+ID4g PiA+ID4gSSBhbSBoYXBweSB0byBtYWtlIGFueSBjaGFuZ2VzIHJlcXVlc3RlZCwgYnV0IEkgZG8g bm90IGF0IGFsbCBoYXZlCj4gPiA+ID4gPiA+IGVub3VnaCBiYWNrZ3JvdW5kIGhlcmUgdG8gbWFr ZSB0aGUgZGVjaXNpb24gb24gd2hldGhlciB0aGUgbXNiCj4gPiA+ID4gPiA+IGZ1bmN0aW9uYWxp dHkgZGVzZXJ2ZXMgdGhlIHF1aXJrIG9yIGlmIHRoZSBsc2Igb25lIGRvZXMuIEhvdyBjYW4gSQo+ ID4gPiA+ID4gPiBoZWxwIHlvdSBhbGwgY29tZSB0byBhbiBhZ3JlZW1lbnQgaGVyZT8KPiA+ID4g PiA+ID4gCj4gPiA+ID4gPiA+ICogSXQgc2VlbXMgbGlrZSBWaWxsZSBmZWVscyBzdHJvbmdseSBh Ym91dCB0aGUgbXNiIGJlaW5nIHRoZQo+ID4gPiA+ID4gPiBjb3JyZWN0Cj4gPiA+ID4gPiA+IGlu dGVycHJldGF0aW9uIG9mIHRoZSBzcGVjLgo+ID4gPiA+ID4gPiAqIEl0J3MgdW5jbGVhciB0byBt ZSBvbiB3aGljaCBzaWRlIG9mIHRoZSBmZW5jZSBMeXVkZSBmYWxscywgSQo+ID4gPiA+ID4gPiBj b3VsZG4ndCBwaWNrIHVwIGEgc3Ryb25nIG9waW5pb24gaW4gaGVyIGNsYXJpZnlpbmcgcXVlc3Rp b24uCj4gPiA+ID4gPiA+ICogUHV0aGlrb3JuIHNlZW1zIHRvIGJlIG9uIHRoZSBzaWRlIG9mIGxz YiBiZWluZyBjb3JyZWN0LCBidXQKPiA+ID4gPiA+ID4gbWF5YmUKPiA+ID4gPiA+ID4gd2FzIHN3 YXllZCBieSBWaWxsZSdzIGFyZ3VtZW50Lgo+ID4gCj4gPiBIb25lc3RseSBJJ20gbm90IGhhcmQg dG8gY29udmluY2UgOlAsIGlmIGl0IGxvb2tzIGxpa2Ugd2UgZ290IHRoZSBiaXQKPiA+IHNoaWZ0 Cj4gPiB3cm9uZyBmb3IgdGhlIG1ham9yaXR5IG9mIGRldmljZXMgYW5kIGV2ZXJ5b25lIGVsc2Ug YWdyZWVzIHRoZW4gSSdtIGZpbmUKPiA+IHdpdGgKPiA+IGFzc3VtaW5nIHRoYXQncyB0aGUgY2Fz ZS4gSSdtIGp1c3QgcXVpdGUgc3VycHJpc2VkLCBzZWVpbmcgYXMgd2UndmUgdGVzdGVkCj4gPiBt YW55IGRpZmZlcmVudCBwYW5lbHMgZnJvbSBhIGZldyB2ZW5kb3JzIGFuZCBoYXZlbid0IHJ1biBp bnRvIGFueSBpc3N1ZXMKPiA+IHdpdGgKPiA+IHRoaXMgYmVmb3JlLgo+ID4gCj4gPiBIb25lc3Rs eSAtIGlmIHRoZXJlJ3MgdGhpcyBtdWNoIHVuY2VydGFpbnR5IGFib3V0IGl0LCBtYXliZSB3ZSBz aG91bGQganVzdAo+ID4gYXNrCj4gPiBWRVNBIGRpcmVjdGx5IHdoYXQgdGhlIGNvcnJlY3QgaW50 ZXJwcmV0YXRpb24gb2YgdGhpcyBpcz8gTm90ZSBJJ20gbm90IG9uCj4gPiB0aGUKPiA+IFZFU0Eg Ym9hcmQgKEkgZ2V0IGFjY2VzcyB0byBEUC9lRFAgc3BlY3MgdGhyb3VnaCBYLm9yZykgc28gdW5s ZXNzIHRoZQo+ID4gY29udGFjdHMKPiA+IEkndmUgZ290IGZyb20gVkVTQSB3b3VsZCB3b3JrIChC aWxsIExlbXBlc2lzIGJpbGwgYXQgdmVzYSBkb3Qgb3JnKSBmb3IKPiA+IHRoYXQgaXQKPiA+IG1p Z2h0IGJlIGEgYmV0dGVyIGlkZWEgZm9yIHNvbWVvbmUgZnJvbSBHb29nbGUgb3IgSW50ZWwgdG8g YXNrLgo+ID4gCj4gPiA+ID4gPiA+IElmIG5vIG9uZSBmZWVscyB0aGF0IFZpbGxlJ3MgYXJndW1l bnQgaXMgbm90IHN0cm9uZyBpbiBzb21lIHdheSwKPiA+ID4gPiA+ID4gYW5kCj4gPiA+ID4gPiA+ IHdlIGdvIHdpdGggdGhhdCwgSSB3aWxsIGdldCB0byB3b3JrIG9uIHRoZSByZXF1ZXN0ZWQgY2hh bmdlcy4gSSBhbQo+ID4gPiA+ID4gPiBjb25jZXJuZWQsIHRob3VnaCwgYWJvdXQgY2hhbmdpbmcg dGhlIGRlZmF1bHQgZnVuY3Rpb25hbGl0eQo+ID4gPiA+ID4gPiB3aXRob3V0Cj4gPiA+ID4gPiA+ IHRlc3RpbmcgaXQgd2lkZWx5IHRvIGZpbmQgdGhlIHNldCBvZiBsYXB0b3BzIHdoaWNoIHJlcXVp cmUgdGhlIGxzYgo+ID4gPiA+ID4gPiBxdWlyay4gSSdkIGFwcHJlY2lhdGUgYW55IGFkdmljZSBw ZW9wbGUgbWlnaHQgaGF2ZSBhYm91dCBtYWtpbmcKPiA+ID4gPiA+ID4gdGhpcwo+ID4gPiA+ID4g PiBjaGFuZ2Ugc2FmZWx5Lgo+ID4gCj4gPiBVc3VhbGx5LCBJIGp1c3QgdHJ5IHRvIHN0aWNrIHdp dGggd2hhdCB0aGUgbWFqb3JpdHkgb2YgbWFjaGluZXMgbmVlZCB0bwo+ID4gZG8uIEkKPiA+IHN0 aWxsIHRoaW5rIGl0J2QgYmUgYSBnb29kIGlkZWEgZm9yIHVzIHRvIHZlcmlmeSB0aGlzIHdpdGgg VkVTQSBpZiB0aGVyZSdzCj4gPiB0aGF0IG11Y2ggY29uZnVzaW9uIHRob3VnaAo+ID4gCj4gPiA+ ID4gPiA+IFRoYW5rIHlvdSBmb3IgeW91ciB0aW1lLAo+ID4gPiA+ID4gPiBLZXZpbgo+ID4gPiA+ ID4gPiAKPiA+ID4gPiA+ID4gT24gVGh1LCBTZXAgMTcsIDIwMjAgYXQgMjoxMSBQTSBWaWxsZSBT eXJqw6Rsw6QKPiA+ID4gPiA+ID4gPHZpbGxlLnN5cmphbGFAbGludXguaW50ZWwuY29tPiB3cm90 ZToKPiA+ID4gPiA+ID4gPiBPbiBUaHUsIFNlcCAxNywgMjAyMCBhdCAwOToyNTozNVBNICswMzAw LCBWaWxsZSBTeXJqw6Rsw6Qgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gPiBPbiBUaHUsIFNlcCAxNywg MjAyMCBhdCAxMToxNDo0M0FNIC0wNzAwLCBQdXRoaWtvcm4KPiA+ID4gPiA+ID4gPiA+IFZvcmF2 b290aXZhdAo+ID4gPiA+ID4gPiA+ID4gd3JvdGU6Cj4gPiA+ID4gPiA+ID4gPiA+IFRoZSBMeXVk ZSBmZGU3MjY2ZmIyZjYgY2hhbmdlIGlzIGFjdHVhbGx5IGJhc2VkIG9uIENocm9taXVtCj4gPiA+ ID4gPiA+ID4gPiA+IGNoYW5nZQo+ID4gPiA+ID4gPiA+ID4gPiAoaHR0cHM6Ly9jcnJldi5jb20v Yy8xNjUwMzI1KSB0aGF0IGZpeGVzIHRoZSBicmlnaHRuZXNzIGZvcgo+ID4gPiA+ID4gPiA+ID4g PiBTYW1zdW5nCj4gPiA+ID4gPiA+ID4gPiA+IEdhbGF4eSBDaHJvbWVib29rLiBTbyBjdXJyZW50 bHkgd2UgaGF2ZSAyIGV4YW1wbGVzIHRoYXQgdXNlCj4gPiA+ID4gPiA+ID4gPiA+IExTQgo+ID4g PiA+ID4gPiA+ID4gPiBpbnRlcnByZXRhdGlvbiBhbmQgMSB0aGF0IHVzZSBNU0IuCj4gPiA+ID4g PiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ICJJZiBmaWVsZCA0OjAgb2YgdGhlIEVEUF9QV01HRU5f QklUX0NPVU5UIHJlZ2lzdGVyIHJlcHJlc2VudHMKPiA+ID4gPiA+ID4gPiA+IGEKPiA+ID4gPiA+ ID4gPiA+IHZhbHVlCj4gPiA+ID4gPiA+ID4gPiBvZiBncmVhdGVyIHRoYW4gOCBhbmQgdGhlIEJB Q0tMSUdIVF9CUklHSFRORVNTX0JZVEVfQ09VTlQgYml0Cj4gPiA+ID4gPiA+ID4gPiBpcyBjbGVh cmVkIHRvIDAsIG9ubHkgdGhlIDggTVNCIG9mIHRoZSBicmlnaHRuZXNzIGNvbnRyb2wKPiA+ID4g PiA+ID4gPiA+IHZhbHVlCj4gPiA+ID4gPiA+ID4gPiBjYW4gYmUKPiA+ID4gPiA+ID4gPiA+IGNv bnRyb2xsZWQuCj4gPiA+ID4gPiA+ID4gPiAoU2VlIE5vdGUgYmVsb3cuKQo+ID4gPiA+ID4gPiA+ ID4gQXNzaWduZWQgYml0cyBhcmUgYWxsb2NhdGVkIHRvIHRoZSBNU0Igb2YgdGhlIGVuYWJsZWQg cmVnaXN0ZXIKPiA+ID4gPiA+ID4gPiA+IGNvbWJpbmF0aW9uLiIKPiA+ID4gPiA+ID4gPiA+IAo+ ID4gPiA+ID4gPiA+ID4gSSB0aGluayB0aGF0J3MgcHJldHR5IGNsZWFyIHRoZSBhc3NpZ25lZCBi aXRzIGFyZSBzdXBwb3NlZCB0bwo+ID4gPiA+ID4gPiA+ID4gYmUKPiA+ID4gPiA+ID4gPiA+IG1z YiBhbGlnbmVkLgo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+IEkgZ3Vlc3MgdGhlcmUncyBz b21lIGVtYWlsIGlzc3VlcyBoYXBwZW5pbmcsIGJ1dCBqdXN0IHRvCj4gPiA+ID4gPiA+ID4gY2xh cmlmeToKPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiBXaGVuIHRoZSBzcGVjIHNheXMgTVNC IGluIGNhcHMgaGVyZSBpdCBjbGVhcmx5IG1lYW5zCj4gPiA+ID4gPiA+ID4gIm1vc3Qgc2lnbmlm aWNhbnQtYml0KHMpIiBzaW5jZSBvdGhlcndpc2UgIjggTVNCIiB3b3VsZCBub3QgbWFrZQo+ID4g PiA+ID4gPiA+IGFueSBzZW5zZSBpbiB0aGUgY29udGV4dCBvZiBhIDIgYnl0ZSB2YWx1ZS4KPiA+ ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiBHcmFudGVkIHRoZSBzcGVjIGlzIGNyYXAgaGVyZSBz aW5jZSAiVGFibGUgMS0xOiBBY3JvbnltcyBhbmQKPiA+ID4gPiA+ID4gPiBJbml0aWFsaXNtIiBk b2VzIGNsYWltICJNU0IiIHNob3VsZCBiZSBieXRlKHMpIGFuZCAibXNiIiBiaXQocykuCj4gPiA+ ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gQWxzbyBJIGNhbid0IGltYWdpbmUgYW55b25lIHdvdWxk IGFsbG9jYXRlIHRoZSBiaXRzIHN0YXJ0aW5nCj4gPiA+ID4gPiA+ID4gZnJvbSB0aGUgbHNiIHdo ZW4gdGhlIHdob2xlIHRoaW5nIGlzIGNsZWFybHkgc3VwcG9zZWQgdG8gYmUgYQo+ID4gPiA+ID4g PiA+IDE2Yml0IGJpZyBlbmRpYW4gaW50ZWdlci4gU28gd2l0aCA+OCBhc3NpZ25lZCBiaXRzIHlv dSdkIGVuZAo+ID4gPiA+ID4gPiA+IHVwIHdpdGggY3Jhenkgc3R1ZmYgbGlrZSB0aGlzOgo+ID4g PiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+IFsgNyAuLi4gMCBdWzcgICAuLi4gICAwXQo+ID4gPiA+ ID4gPiA+IFsgOCBNU0IgICBdW1hYWFhdW04gTFNCXQo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4g PiA+IHNvIHlvdSBjb3VsZG4ndCBldmVuIHRyZWF0IHRoZSB2YWx1ZSBhcyBhIHJlZ3VsYXIgYmln IGVuZGlhbgo+ID4gPiA+ID4gPiA+IHRoaW5nLiBJbnN0ZWFkLCBpZiB5b3Ugc3F1aW50IGEgYml0 LCBpdCBub3cgbG9va3MgbGlrZSBhIGZ1bmt5Cj4gPiA+ID4gPiA+ID4gbGl0dGxlIGVuZGlhbiB2 YWx1ZS4gU28gd2UncmUgZGVlcCBpbnRvIHNvbWUgbWl4ZWQgZW5kaWFuIGxhbmQKPiA+ID4gPiA+ ID4gPiB3aGVyZSBub3RoaW5nIG1ha2VzIHNlbnNlIGFueW1vcmUuCj4gPiA+ID4gPiA+ID4gCj4g PiA+ID4gPiA+ID4gQW55d2F5cyBJIHRoaW5rIHRoZSBjb2RlIHNob3VsZCBzaW1wbHkgZG8gdGhp cyB0byBtYXRjaCB0aGUKPiA+ID4gPiA+ID4gPiBzcGVjOgo+ID4gPiA+ID4gPiA+IHUxNiB2YWx1 ZSA9IGJyaWdodG5lc3MgPDwgKDE2IC0gbnVtX2Fzc2lnbmVkX2JpdHMpOwo+ID4gPiA+ID4gPiA+ IHZhbFswXSA9IHZhbHVlID4+IDg7Cj4gPiA+ID4gPiA+ID4gdmFsWzFdID0gdmFsdWUgJiAweGZm Owo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiBPbiBUaHUs IFNlcCAxNywgMjAyMCBhdCAxMDo1NSBBTSBLZXZpbiBDaG93c2tpIDwKPiA+ID4gPiA+ID4gPiA+ ID4gY2hvd3NraUBjaHJvbWl1bS5vcmc+IHdyb3RlOgo+ID4gPiA+ID4gPiA+ID4gPiA+IEFwb2xv Z2llcyBmb3IgYmVpbmcgdG9vIHZhZ3VlLiBUbyBiZSBhcyBwcmVjaXNlIEkgY2FuIGJlLAo+ID4g PiA+ID4gPiA+ID4gPiA+IGhlcmUKPiA+ID4gPiA+ID4gPiA+ID4gPiBpcyB0aGUKPiA+ID4gPiA+ ID4gPiA+ID4gPiBzcGVjaWZpYyBjb2RlIGRlbHRhIEkgdGVzdGVkOiBodHRwczovL2NycmV2LmNv bS9jLzI0MDY2MTYKPiA+ID4gPiA+ID4gPiA+ID4gPiAuIFRvCj4gPiA+ID4gPiA+ID4gPiA+ID4g YW5zd2VyCj4gPiA+ID4gPiA+ID4gPiA+ID4geW91ciBvdGhlciBxdWVzdGlvbiwgdGhlIGNvZGUg SSB0ZXN0ZWQgYWdhaW5zdCBpcyBpbmRlZWQKPiA+ID4gPiA+ID4gPiA+ID4gPiBpbmNsdWRpbmcg dGhlCj4gPiA+ID4gPiA+ID4gPiA+ID4gZmRlNzI2NmZiMmY2IChkZXNwaXRlIG9zdGVuc2libHkg YmVpbmcgY2FsbGVkIDUuNCBpbiBteQo+ID4gPiA+ID4gPiA+ID4gPiA+IGNvbW1pdAo+ID4gPiA+ ID4gPiA+ID4gPiA+IG1lc3NhZ2UpOiBvdXIgY3VycmVudCB0b3Atb2YtdHJlZSBmb3Igb3VyIDUu NCBicmFuY2gKPiA+ID4gPiA+ID4gPiA+ID4gPiBpbmNsdWRlcwo+ID4gPiA+ID4gPiA+ID4gPiA+ IHRoZQo+ID4gPiA+ID4gPiA+ID4gPiA+IGludGVsX2RwX2F1eF9jYWxjX21heF9iYWNrbGlnaHQg bG9naWMuIEZ1cnRoZXIsIEknbGwgbm90ZQo+ID4gPiA+ID4gPiA+ID4gPiA+IHRoYXQKPiA+ID4g PiA+ID4gPiA+ID4gPiBjaGFuZ2UKPiA+ID4gPiA+ID4gPiA+ID4gPiBpcyBleGFjdGx5IHRoZSBj aGFuZ2Ugd2hpY2ggYnJlYWtzIG15IFBpeGVsYm9vayBtb2RlbDoKPiA+ID4gPiA+ID4gPiA+ID4g PiBwcmlvcgo+ID4gPiA+ID4gPiA+ID4gPiA+IHRvIHRoZQo+ID4gPiA+ID4gPiA+ID4gPiA+IGNo YW5nZSwgdGhlIG1heF9icmlnaHRuZXNzIHdhcyBoYXJkLWNvZGVkIHRvIDB4RkZGRiBhbmQKPiA+ ID4gPiA+ID4gPiA+ID4gPiB0aGUKPiA+ID4gPiA+ID4gPiA+ID4gPiBtYXRoCj4gPiA+ID4gPiA+ ID4gPiA+ID4gd29ya2VkIG91dCB0aGF0IGl0IGRpZG4ndCBtYXR0ZXIgdGhhdCB0aGUgaGFyZHdh cmUgY2FyZWQKPiA+ID4gPiA+ID4gPiA+ID4gPiBhYm91dAo+ID4gPiA+ID4gPiA+ID4gPiA+IHRo ZSBNU0IKPiA+ID4gPiA+ID4gPiA+ID4gPiBkZXNwaXRlIHRoZSBkcml2ZXIgY29kZSBjYXJpbmcg YWJvdXQgdGhlIExTQi4KPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiBU byBhbnN3ZXIgVmlsbGUncyBxdWVzdGlvbjogdGhlIGZkZTcyNjZmYjJmNiBjaGFuZ2Ugd2hpY2gK PiA+ID4gPiA+ID4gPiA+ID4gPiBmaXhlcyBvbmUKPiA+ID4gPiA+ID4gPiA+ID4gPiBsYXB0b3Ag KEkgYmVsaWV2ZSBUaGlua3BhZCBYMSBleHRyZW1lIEdlbiAyLCBmcm9tIHNvbWUgYnVnCj4gPiA+ ID4gPiA+ID4gPiA+ID4gcmVwb3J0cyBJCj4gPiA+ID4gPiA+ID4gPiA+ID4gZHVnIHVwKSBhbmQg YnJlYWtzIGFub3RoZXIgKFBpeGVsYm9vayk7IHNvIHVuZm9ydHVuYXRlbHkgSQo+ID4gPiA+ID4g PiA+ID4gPiA+IGJlbGlldmUgd2UKPiA+ID4gPiA+ID4gPiA+ID4gPiBuZWVkIGEgcXVpcmsgYXQg bGVhc3QgZm9yIHNvbWUgbGFwdG9wLiBSZWFkaW5nIHRocm91Z2ggdGhlCj4gPiA+ID4gPiA+ID4g PiA+ID4gY29weSBvZiB0aGUKPiA+ID4gPiA+ID4gPiA+ID4gPiBkYXRhc2hlZXQgSSBoYXZlLCBp dCB3YXNuJ3QgY2xlYXIgdG8gbWUgd2hpY2ggd2FzIHRoZQo+ID4gPiA+ID4gPiA+ID4gPiA+IGNv cnJlY3QKPiA+ID4gPiA+ID4gPiA+ID4gPiBpbnRlcnByZXRhdGlvbi4gSSdtIGNjJ2luZyBwdXRo aWtALCB3aG8gd2FzIGxlYW5pbmcgdG93YXJkCj4gPiA+ID4gPiA+ID4gPiA+ID4gdGhlCj4gPiA+ ID4gPiA+ID4gPiA+ID4gY3VycmVudAo+ID4gPiA+ID4gPiA+ID4gPiA+IGtlcm5lbCBjb2RlIChj YXJpbmcgYWJvdXQgTFNCKSBiZWluZyB0aGUgY29ycmVjdAo+ID4gPiA+ID4gPiA+ID4gPiA+IGlu dGVycHJldGF0aW9uLiBJCj4gPiA+ID4gPiA+ID4gPiA+ID4gYmVsaWV2ZSB3ZSBoYXZlIG90aGVy IGNocm9tZWJvb2tzIHdoaWNoIGRvIHJlbHkgb24gTFNCCj4gPiA+ID4gPiA+ID4gPiA+ID4gZnVu Y3Rpb25hbGl0eSwKPiA+ID4gPiA+ID4gPiA+ID4gPiBzbyB1bmxlc3Mgd2UgY2FuIGZpbmQgbW9y ZSBleGFtcGxlcyBvZiBsYXB0b3BzIHdhbnRpbmcgTVNCCj4gPiA+ID4gPiA+ID4gPiA+ID4gaXQK PiA+ID4gPiA+ID4gPiA+ID4gPiBjdXJyZW50bHkgbG9va3MgbGlrZSBQaXhlbGJvb2sgaXMgdGhl IG91dGxpZXIuCj4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gT24gVGh1 LCBTZXAgMTcsIDIwMjAgYXQgMTE6MjggQU0gSmFuaSBOaWt1bGEKPiA+ID4gPiA+ID4gPiA+ID4g PiA8amFuaS5uaWt1bGFAbGludXguaW50ZWwuY29tPiB3cm90ZToKPiA+ID4gPiA+ID4gPiA+ID4g PiA+IE9uIFRodSwgMTcgU2VwIDIwMjAsIEtldmluIENob3dza2kgPGNob3dza2lAY2hyb21pdW0u b3JnCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiB3cm90ZToK PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gV2UgaGF2ZSBvYnNlcnZlZCB0aGF0IEdvb2dsZSBQaXhl bGJvb2sncyBiYWNrbGlnaHQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gaGFyZHdhcmUgaXMKPiA+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gaW50ZXJwcmV0dGluZyB0aGVzZSBiYWNrbGlnaHQgYml0cyBm cm9tIHRoZSBtb3N0LQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBzaWduaWZpY2FudCBzaWRlIG9m IHRoZQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAxNiBiaXQgd29yZCAoaWYgRFBfRURQX1BXTUdF Tl9CSVRfQ09VTlQgPCAxNiksIHdoZXJlYXMKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gdGhlCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+IGRyaXZlciBjb2RlCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ IGFzc3VtZXMgdGhlIHBlcmlwaGVyYWwgY2FyZXMgYWJvdXQgdGhlIGxlYXN0LQo+ID4gPiA+ID4g PiA+ID4gPiA+ID4gPiBzaWduaWZpY2FudAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBiaXRzLgo+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gVGVzdGluZyB3 YXMgZG9uZSBmcm9tIHdpdGhpbiBDaHJvbWUgT1MncyBidWlsZAo+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiBlbnZpcm9ubWVudAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiB3aGVuIHRoZQo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiBwYXRjaCBpcyBiYWNrcG9ydGVkIHRvIDUuNCAodGhlIHZlcnNpb24g d2UgYXJlIG5ld2x5Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IHRhcmdldGluZyBmb3IgdGhlCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+IFBpeGVsYm9vayk7IGZvciB0aGUgcmVjb3JkOgo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiAgICAkIGVtZXJnZS1ldmUta2VybmVsbmV4dCBzeXMta2VybmVsL2No cm9tZW9zLWtlcm5lbC0KPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gNV80Cj4gPiA+ID4gPiA+ID4g PiA+ID4gPiA+ICYmIFwKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgLi91cGRhdGVfa2Vy bmVsLnNoIC0tcmVtb3RlPSRJUAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gSSB1c2VkIGAvc3lzL2tlcm5lbC9kZWJ1Zy9kcmkvMC9lRFAtMS9pOTE1X2Rw Y2RgIG9uIG15Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IGxhcHRvcCB0byB2ZXJpZnkKPiA+ID4g PiA+ID4gPiA+ID4gPiA+ID4gdGhhdCB0aGUgcmVnaXN0ZXJzIHdlcmUgYmVpbmcgc2V0IGFjY29y ZGluZyB0byB3aGF0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IHRoZQo+ID4gPiA+ID4gPiA+ID4g PiA+ID4gPiBhY3R1YWwgaGFyZHdhcmUKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gZXhwZWN0czsg SSBhbHNvIG9ic2VydmUgdGhhdCB0aGUgYmFja2xpZ2h0IGlzCj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+IG5vdGljZWFibHkKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gYnJpZ2h0ZXIgd2l0aAo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiB0aGlzIHBhdGNoLgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiBJdCdzIHVuY2xlYXIgdG8gbWUgd2hhdCBrZXJuZWwgdmVyc2lv biB0aGlzIGlzIGFnYWluc3QsCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiBhbmQKPiA+ID4gPiA+ID4g PiA+ID4gPiA+IHdoYXQgeW91J3ZlCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiBhY3R1YWxseSB0ZXN0 ZWQuCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IEhhdmUgeW91 IHRyaWVkIHY1Ljcga2VybmVsIHdpdGggTHl1ZGUncyBmZGU3MjY2ZmIyZjYKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ICgiZHJtL2k5MTU6IEZpeCBlRFAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IERQQ0Qg YXV4IG1heCBiYWNrbGlnaHQgY2FsY3VsYXRpb25zIik/Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiAK PiA+ID4gPiA+ID4gPiA+ID4gPiA+IEkganVzdCB3YW50IHRvIG1ha2Ugc3VyZSB5b3UndmUgdGVz dGVkIHdpdGggYWxsIHRoZQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gcmVsZXZhbnQKPiA+ID4gPiA+ ID4gPiA+ID4gPiA+IGZpeGVzCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiBiZWZvcmUgYWRkaW5nIHF1 aXJrcy4KPiA+ID4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gQlIsCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiBKYW5pLgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+IFNpZ25lZC1vZmYtYnk6IEtldmluIENob3dza2kgPGNob3dza2lAY2hy b21pdW0ub3JnPgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAtLS0KPiA+ID4gPiA+ID4gPiA+ID4g PiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAuLi4vZHJtL2k5MTUvZGlzcGxheS9pbnRl bF9kcF9hdXhfYmFja2xpZ2h0LmMgfCAzNAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArKysrKysr KysrKysrKysrKysrCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICBkcml2ZXJzL2dwdS9kcm0vaTkx NS9kaXNwbGF5L2ludGVsX3F1aXJrcy5jICAgfCAxMwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAr KysrKysrCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1 X2Rydi5oICAgICAgICAgICAgICAgfCAgMSArCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAzIGZp bGVzIGNoYW5nZWQsIDQ4IGluc2VydGlvbnMoKykKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+IGRpZmYgLS1naXQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4g YS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2RwX2F1eF9iYWNrbGlnaHQuCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+IGMKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2RwX2F1eF9iYWNrbGlnaHQuCj4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+IGMKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gaW5kZXggYWNiZDdlYjY2Y2Jl My4uOTljOThmMjE3MzU2ZCAxMDA2NDQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gLS0tCj4gPiA+ ID4gPiA+ID4gPiA+ID4gPiA+IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9k cF9hdXhfYmFja2xpZ2h0Lgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBjCj4gPiA+ID4gPiA+ID4g PiA+ID4gPiA+ICsrKwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2JhY2tsaWdodC4KPiA+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gYwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBAQCAtOTEsNiArOTEsMjMgQEAgc3RhdGljIHUz Mgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBpbnRlbF9kcF9hdXhfZ2V0X2JhY2tsaWdodChzdHJ1 Y3QgaW50ZWxfY29ubmVjdG9yCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICpjb25uZWN0b3IpCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgIGlmIChpbnRlbF9kcC0+ZWRwX2RwY2RbMl0gJgo+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBEUF9FRFBfQkFDS0xJR0hUX0JSSUdIVE5FU1NfQllURV9D T1VOVCkKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgICAgICAgICBsZXZlbCA9IChyZWFk X3ZhbFswXSA8PCA4IHwKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gcmVhZF92YWxbMV0pOwo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgaWYgKGk5 MTUtPnF1aXJrcyAmCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IFFVSVJLX1NISUZUX0VEUF9CQUNL TElHSFRfQlJJR0hUTkVTUykgewo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAg IGlmICghZHJtX2RwX2RwY2RfcmVhZGIoJmludGVsX2RwLT5hdXgsCj4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+IERQX0VEUF9QV01HRU5fQklUX0NPVU5ULAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRfdmEKPiA+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gbFswXQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiApKSB7Cj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICBEUk1fREVCVUdfS01T KCJGYWlsZWQgdG8gcmVhZAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBEUENECj4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+IHJlZ2lzdGVyIDB4JXhcbiIsCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFBfRURQX1BXTUdFTl9CSQo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiBUX0NPCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IFVOVCk7Cj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKPiA+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+ICsgICAgICAgICAgICAgLy8gT25seSBiaXRzIDQ6MCBhcmUgdXNlZCwgNzo1IGFyZQo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiByZXNlcnZlZC4KPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAg ICAgICAgICAgICByZWFkX3ZhbFswXSA9IHJlYWRfdmFsWzBdICYgMHgxRjsKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gKyAgICAgICAgICAgICBpZiAocmVhZF92YWxbMF0gPiAxNikgewo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgRFJNX0RFQlVHX0tNUygiSW52 YWxpZAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBEUF9FRFBfUFdOR0VOX0JJVF9DT1VOVCAweCVY LCBleHBlY3RlZCBhdCBtb3N0IDE2XG4iLAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF92YWwKPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gWzBdKQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA7Cj4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gKyAgICAgICAgICAgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAg ICAgICAgICAgbGV2ZWwgPj49IDE2IC0gcmVhZF92YWxbMF07Cj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+ICsgICAgIH0KPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiAgICAgICByZXR1cm4gbGV2ZWw7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICB9Cj4gPiA+ ID4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBAQCAtMTA2LDYgKzEy MywyMyBAQCBpbnRlbF9kcF9hdXhfc2V0X2JhY2tsaWdodChjb25zdAo+ID4gPiA+ID4gPiA+ID4g PiA+ID4gPiBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubl9zdGF0ZSwgdTMyIGxldgo+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkx NSA9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IGRwX3RvX2k5MTUoaW50ZWxfZHApOwo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiAgICAgICB1OCB2YWxzWzJdID0geyAweDAgfTsKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgIGlmIChpOTE1LT5xdWly a3MgJgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBRVUlSS19TSElGVF9FRFBfQkFDS0xJR0hUX0JS SUdIVE5FU1MpIHsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICBpZiAoIWRy bV9kcF9kcGNkX3JlYWRiKCZpbnRlbF9kcC0+YXV4LAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBE UF9FRFBfUFdNR0VOX0JJVF9DT1VOVCwKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxzWzBdCj4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ICkpIHsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAg ICAgICAgIERSTV9ERUJVR19LTVMoIkZhaWxlZCB0byB3cml0ZQo+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiBhdXgKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gYmFja2xpZ2h0IGxldmVsOiBGYWlsZWQg dG8gcmVhZCBEUENEIHJlZ2lzdGVyIDB4JXhcbiIsCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUF9FRFBfUFdNR0VOXwo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiBCSVRfCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IENPVU5UKTsK PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKPiA+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+ICsgICAgICAgICAgICAgLy8gT25seSBiaXRzIDQ6MCBhcmUgdXNlZCwgNzo1IGFyZQo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiByZXNlcnZlZC4KPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAg ICAgICAgICAgICB2YWxzWzBdID0gdmFsc1swXSAmIDB4MUY7Cj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+ICsgICAgICAgICAgICAgaWYgKHZhbHNbMF0gPiAxNikgewo+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiArICAgICAgICAgICAgICAgICAgICAgRFJNX0RFQlVHX0tNUygiRmFpbGVkIHRvIHdyaXRl Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IGF1eAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBiYWNr bGlnaHQgbGV2ZWw6IEludmFsaWQgRFBfRURQX1BXTkdFTl9CSVRfQ09VTlQgMHglWCwKPiA+ID4g PiA+ID4gPiA+ID4gPiA+ID4gZXhwZWN0ZWQgYXQgbW9zdCAxNlxuIiwKPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZh bHNbMF0pCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IDsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4g KyAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAg ICAgICAgICAgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgbGV2ZWwg PDw9ICgxNiAtIHZhbHNbMF0pICYgMHhGRkZGOwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArICAg ICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICAg ICAgdmFsc1swXSA9IGxldmVsOwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gICAgICAgLyogV3JpdGUgdGhlIE1TQiBhbmQvb3IgTFNCICovCj4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+IGRpZmYgLS1naXQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX3F1aXJrcy5jCj4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9xdWlya3MuYwo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiBpbmRleCA0NmJlYjE1NWQ4MzVmLi42M2IyN2Q0OWIyODY0IDEw MDY0NAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9k aXNwbGF5L2ludGVsX3F1aXJrcy5jCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsrKyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfcXVpcmtzLmMKPiA+ID4gPiA+ID4gPiA+ID4g PiA+ID4gQEAgLTUzLDYgKzUzLDE2IEBAIHN0YXRpYyB2b2lkCj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+IHF1aXJrX2luY3JlYXNlX2RkaV9kaXNhYmxlZF90aW1lKHN0cnVjdAo+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gPiBkcm1faTkxNV9wcml2YXRlCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICppOTE1 KQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICBkcm1faW5mbygmaTkxNS0+ZHJtLCAiQXBw bHlpbmcgSW5jcmVhc2UgRERJCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IERpc2FibGVkCj4gPiA+ ID4gPiA+ID4gPiA+ID4gPiA+IHF1aXJrXG4iKTsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gIH0K PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsvKgo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiArICogU29tZSBlRFAgYmFja2xpZ2h0IGhhcmR3YXJlIHVzZXMg dGhlIG1vc3QtCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IHNpZ25pZmljYW50Cj4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+IGJpdHMgb2YgdGhlIGJyaWdodG5lc3MKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gKyAqIHJlZ2lzdGVyLCBzbyBicmlnaHRuZXNzIHZhbHVlcyBtdXN0IGJlIHNoaWZ0ZWQKPiA+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gZmlyc3QuCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsgKi8K PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gK3N0YXRpYyB2b2lkCj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+IHF1aXJrX3NoaWZ0X2VkcF9iYWNrbGlnaHRfYnJpZ2h0bmVzcyhzdHJ1Y3QKPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKPiA+ID4gPiA+ID4gPiA+ID4g PiA+ID4gK3sKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgaTkxNS0+cXVpcmtzIHw9Cj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+IFFVSVJLX1NISUZUX0VEUF9CQUNLTElHSFRfQlJJR0hUTkVT UzsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgRFJNX0lORk8oIkFwcGx5aW5nIHNoaWZ0 IGVEUCBiYWNrbGlnaHQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gYnJpZ2h0bmVzcwo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiBxdWlya1xuIik7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICt9Cj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gIHN0cnVjdCBp bnRlbF9xdWlyayB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgIGludCBkZXZpY2U7Cj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgIGludCBzdWJzeXN0ZW1fdmVuZG9yOwo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiBAQCAtMTU2LDYgKzE2Niw5IEBAIHN0YXRpYyBzdHJ1Y3QgaW50ZWxf cXVpcmsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gaW50ZWxfcXVpcmtzW10gPSB7Cj4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+ICAgICAgIC8qIEFTUm9jayBJVFgqLwo+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiAgICAgICB7IDB4MzE4NSwgMHgxODQ5LCAweDIyMTIsCj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+IHF1aXJrX2luY3JlYXNlX2RkaV9kaXNhYmxlZF90aW1lIH0sCj4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ICAgICAgIHsgMHgzMTg0LCAweDE4NDksIDB4MjIxMiwKPiA+ID4gPiA+ID4gPiA+ID4g PiA+ID4gcXVpcmtfaW5jcmVhc2VfZGRpX2Rpc2FibGVkX3RpbWUgfSwKPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAvKiBHb29nbGUgUGl4ZWxi b29rICovCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgIHsgMHg1OTFFLCAweDgwODYsIDB4 MjIxMiwKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gcXVpcmtfc2hpZnRfZWRwX2JhY2tsaWdodF9i cmlnaHRuZXNzIH0sCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICB9Owo+ID4gPiA+ID4gPiA+ID4g PiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gIHZvaWQgaW50ZWxfaW5pdF9xdWlya3Mo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCj4gPiA+ID4gPiA+ID4g PiA+ID4gPiA+IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAo+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gPiBpbmRleCBlNGY3ZjY1MTg5NDViLi5jYzkzYmVkZTRmYWI4IDEwMDY0NAo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5o Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf ZHJ2LmgKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gQEAgLTUyNSw2ICs1MjUsNyBAQCBzdHJ1Y3Qg aTkxNV9wc3Igewo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgI2RlZmluZSBRVUlSS19QSU5fU1dJ WlpMRURfUEFHRVMgKDE8PDUpCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAjZGVmaW5lIFFVSVJL X0lOQ1JFQVNFX1QxMl9ERUxBWSAoMTw8NikKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICNkZWZp bmUgUVVJUktfSU5DUkVBU0VfRERJX0RJU0FCTEVEX1RJTUUgKDE8PDcpCj4gPiA+ID4gPiA+ID4g PiA+ID4gPiA+ICsjZGVmaW5lIFFVSVJLX1NISUZUX0VEUF9CQUNLTElHSFRfQlJJR0hUTkVTUyAo MTw8OCkKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICBz dHJ1Y3QgaW50ZWxfZmJkZXY7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICBzdHJ1Y3QgaW50ZWxf ZmJjX3dvcms7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IC0t Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiBKYW5pIE5pa3VsYSwgSW50ZWwgT3BlbiBTb3VyY2UgR3Jh cGhpY3MgQ2VudGVyCj4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+IC0tCj4gPiA+ID4g PiA+ID4gPiBWaWxsZSBTeXJqw6Rsw6QKPiA+ID4gPiA+ID4gPiA+IEludGVsCj4gPiA+ID4gPiA+ ID4gPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+ID4g PiA+ID4gPiA+ID4gSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdAo+ID4gPiA+ID4gPiA+ID4gSW50ZWwt Z2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+ID4gPiA+ID4gPiA+ID4gaHR0cHM6Ly9saXN0cy5m cmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngKPiA+ID4gPiA+ID4gPiAK PiA+ID4gPiA+ID4gPiAtLQo+ID4gPiA+ID4gPiA+IFZpbGxlIFN5cmrDpGzDpAo+ID4gPiA+ID4g PiA+IEludGVsCj4gPiAtLQo+ID4gQ2hlZXJzLAo+ID4gICAgICAgICBMeXVkZSBQYXVsIChzaGUv aGVyKQo+ID4gICAgICAgICBTb2Z0d2FyZSBFbmdpbmVlciBhdCBSZWQgSGF0Cj4gPiAKLS0gCkNo ZWVycywKCUx5dWRlIFBhdWwgKHNoZS9oZXIpCglTb2Z0d2FyZSBFbmdpbmVlciBhdCBSZWQgSGF0 CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2 ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK 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=-9.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 083D9C4363D for ; Fri, 25 Sep 2020 16:53:38 +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 9725620936 for ; Fri, 25 Sep 2020 16:53:37 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="g4/yXUdf" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9725620936 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 24ADC6ED44; Fri, 25 Sep 2020 16:53:37 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [63.128.21.124]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3F4146ED45 for ; Fri, 25 Sep 2020 16:53:35 +0000 (UTC) Dkim-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1601052814; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bpUGMcwvdNI1X0aDj/iwu1akGrhtmnN7zlVK5NxAg2g=; b=g4/yXUdf0QfpR2o/Ivj1v2oWqJjuyeVnpfcFKz8AsS/pMy737snrqIoL4pmIOvGoSjreSO XOcluMvBmlCqqpZjnASC/fpIAUSQi8weFJ2GOwf2MPCYNVClKiGbPepDvwOSRUZAPQCoqD 3O/ehlCRodT3ltfPixZn1ebB1Dus5pM= Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-418-07V0NTSCMgeFoN_S-rcGKA-1; Fri, 25 Sep 2020 12:53:26 -0400 X-MC-Unique: 07V0NTSCMgeFoN_S-rcGKA-1 Received: by mail-qt1-f197.google.com with SMTP id p43so2410109qtb.23 for ; Fri, 25 Sep 2020 09:53:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:subject:from:to:cc:date:in-reply-to :references:organization:user-agent:mime-version :content-transfer-encoding; bh=bpUGMcwvdNI1X0aDj/iwu1akGrhtmnN7zlVK5NxAg2g=; b=SPWeRbM9e42Bt1MKPxTQAFBigEzYbcqdiNwU4rttB3jbNC8KChckVNWQvWgwG1YjTv 3LPzVQLa97HRg1osfMIiXyF8sZkY2owLM7g51cQOPPFdRh2ngvYHYlLJkUBXRLobHCJO /tULd2Yiz48h/Ct6Q6njIH2LVFUhxHEepQZ5lwvdDbZVrzfM5nm3EVJHvGFBZ4f3nq7W wVgdI04IHUcCE6PJl5HRlQ2W1UA7ejZlKFcWaVY+XnkaU/THhc3qhLGKSfYHukM5X1Vy FI010bA/EiXkQdDN1eZa/TRBQxcDBVCOqLW8GDChMs1HMWo0S9br0U2oRI9vGmBPJ5g4 B0cg== X-Gm-Message-State: AOAM531Z7RhDS+iuu4htcWSv8nASLQzBHXbVqgQGLCFf4iVlC7LVHRb+ pzF62xACfKN2HMCLuVGhnZefQc4gRS7Pot2gzLgUgTu2r3pOyuw3+HC3eFjUG6kDru25ZQWb1CU e0Dg/+7ypiEku2qnGyzQ/vTHnJePL X-Received: by 2002:a05:620a:1ef:: with SMTP id x15mr900381qkn.182.1601052804968; Fri, 25 Sep 2020 09:53:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwm9l3TXZPpxknhjOWRt17WwfTMryKg+4+HlKa45rrHHHdVUq1ob7Z42sctCucVFuX8lWGeog== X-Received: by 2002:a05:620a:1ef:: with SMTP id x15mr900327qkn.182.1601052804141; Fri, 25 Sep 2020 09:53:24 -0700 (PDT) Received: from Ruby.lyude.net (pool-108-49-102-102.bstnma.fios.verizon.net. [108.49.102.102]) by smtp.gmail.com with ESMTPSA id j25sm2233312qtr.83.2020.09.25.09.53.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 25 Sep 2020 09:53:23 -0700 (PDT) Message-ID: From: Lyude Paul To: Kevin Chowski , Jani Nikula Date: Fri, 25 Sep 2020 12:53:21 -0400 In-Reply-To: References: <20200917110838.1.I63d52f5b96d7e81e1e2dc2a72c4bf5fd84d3d3d0@changeid> <87o8m4uxcn.fsf@intel.com> <20200917182535.GC6112@intel.com> <20200917201102.GD6112@intel.com> Organization: Red Hat User-Agent: Evolution 3.36.5 (3.36.5-1.fc32) MIME-Version: 1.0 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=lyude@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: Re: [Intel-gfx] [PATCH] i915: Introduce quirk for shifting eDP brightness. X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: David Airlie , intel-gfx , LKML , dri-devel@lists.freedesktop.org, Puthikorn Voravootivat , Wambui Karuga Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" T24gVGh1LCAyMDIwLTA5LTI0IGF0IDE3OjQ2IC0wNjAwLCBLZXZpbiBDaG93c2tpIHdyb3RlOgo+ IGNjIGJhY2sgYSBmZXcgb3RoZXJzIHdobyB3ZXJlIHVuaW50ZW50aW9uYWxseSBkcm9wcGVkIGZy b20gdGhlIHRocmVhZAo+IGVhcmxpZXIuCj4gCj4gU29tZW9uZSAoYXQgR29vZ2xlKSBoZWxwZWQg bWUgZGlnIGludG8gdGhpcyBhIGxpdHRsZSBtb3JlIGFuZCB0aGV5Cj4gZm91bmQgYSBkb2N1bWVu dCB0aXRsZWQgImVEUCBCYWNrbGlnaHQgQnJpZ2h0bmVzcyBiaXQgYWxpZ25tZW50IiBzZW50Cj4g b3V0IGZvciByZXZpZXcgaW4gSmFudWFyeSAyMDE3LiBJIHJlZ2lzdGVyZWQgZm9yIGEgbmV3IGFj Y291bnQgKGdvb2dsZQo+IGlzIGEgbWVtYmVyKSBhbmQgaGF2ZSBhY2Nlc3MgdG8gdGhlIGRvY3Vt ZW50OyBoZXJlIGlzIHRoZSBVUkwgZm9yCj4gdGhvc2Ugd2hvIGFsc28gaGF2ZSBhY2Nlc3M6Cj4g aHR0cHM6Ly9ncm91cHMudmVzYS5vcmcvd2cvQWxsTWVtL2RvY3VtZW50Lzc3ODYuIEZvciB3aGF0 IGl0J3Mgd29ydGgsCj4gaXQgc2VlbXMgbGlrZSBMeXVkZSdzIGNvbnRhY3QgQmlsbCBMZW1wZXNp cyB1cGxvYWRlZCB0aGlzCj4gY2hhbmdlLXJlcXVlc3QgZG9jdW1lbnQsIHNvIEkgdGhpbmsgd2Ug Y2FuIHJlYWNoIG91dCB0byBoaW0gaWYgd2UgaGF2ZQo+IGZ1cnRoZXIgcXVlc3Rpb25zLiBJdCdz IGFjdHVhbGx5IHVuY2xlYXIgdG8gbWUgd2hhdCB0aGUgc3RhdHVzIG9mIHRoaXMKPiBjaGFuZ2Ug cmVxdWVzdCBpcywgYW5kIHdoZXRoZXIgaXQncyBiZWVuIG9mZmljaWFsbHkgYWNjZXB0ZWQuIEJ1 dCBJCj4gdGhpbmsgaXQgY2FuIGJlIHNlZW4gYXMgc29tZSBvZmZpY2lhbCBhZHZpY2Ugb24gaG93 IHdlIGNhbiBtb3ZlCj4gZm9yd2FyZCBoZXJlLgo+IAo+IEJhc2ljYWxseSwgdGhpcyBpcyBhIGNo YW5nZSByZXF1ZXN0IHRvIHRoZSBzcGVjIHdoaWNoIGFja25vd2xlZGdlcwo+IHRoYXQsIGRlc3Bp dGUgdGhlIG9yaWdpbmFsIHNwZWMgaW1wbHlpbmcgdGhhdCB0aGUKPiBtb3N0LXNpZ25pZmljYW50 LWJpdHMgd2VyZSByZWxldmFudCBoZXJlLCBtYW55IGltcGxlbWVudGF0aW9ucyB1c2VkCj4gdGhl IGxlYXN0LXNpZ25pZmljYW50LWJpdHMuIEluIGRlZmVuc2Ugb2YgbW9zdC1zaWduaWZpY2FudCBp dCBsYWlkIG91dAo+IHNvbWUgc2ltaWxhciBhcmd1bWVudHMgdG8gd2hhdCBWaWxsZSB3YXMgc2F5 aW5nLiBCdXQgaXQgZW5kcyB1cAo+IHNheWluZzoKPiAKPiA+IFVuZm9ydHVuYXRlbHksIHRoZSBt b3N0IGNvbW1vbiBpbnRlcnByZXRhdGlvbiB0aGF0IHdlIGhhdmUKPiA+IGVuY291bnRlcmVkIGlz IGNhc2UgMSBpbiB0aGUgZXhhbXBsZSBhYm92ZS4gVENPTiB2ZW5kb3JzCj4gPiB0ZW5kIHRvIGFs aWduIHRoZSB2YWxpZCBiaXRzIHRvIHRoZSBMU0JzLCBub3QgdGhlIE1TQnMuCj4gCj4gSW5zdGVh ZCBvZiBjaGFuZ2luZyB0aGUgZGVmYXVsdCBkZWZpbmVkIGZ1bmN0aW9uYWxpdHkgKGFzIHNvbWUg ZWFybGllcgo+IHZlcnNpb24gb2YgdGhpcyBkb2MgYXBwYXJlbnRseSBzdWdnZXN0ZWQpLCB0aGlz IGRvYyBwcmVmZXJzIHRvCj4gYWxsb2NhdGUgdHdvIGV4dHJhIGJpdHMgaW4gRURQX0dFTkVSQUxf Q0FQQUJJTElUWV8yIHNvIHRoYXQgZnV0dXJlCj4gYmFja2xpZ2h0IGRldmljZXMgY2FuIHNwZWNp ZnkgdG8gdGhlIFNvdXJjZSBob3cgdG8gcHJvZ3JhbSB0aGVtOgo+IAo+IDAwOiB0aGUgY3VycmVu dCBmdW5jdGlvbmFsaXR5LCBpLGUuIG5vIGRlZmluZWQgaW50ZXJwcmV0YXRpb24KPiAwMTogYWxp Z25lZCB0byBtb3N0LXNpZ25pZmljYW50IGJpdHMKPiAxMDogYWxpZ25lZCB0byBsZWFzdC1zaWdu aWZpY2FudCBiaXRzCj4gMTE6IHJlc2VydmVkCj4gCj4gSXQgYWxzbyBzYXlzICJbU291cmNlc10g c2hvdWxkIG9ubHkgbmVlZCBwYW5lbC1zcGVjaWZpYyB3b3JrYXJvdW5kcwo+IGZvciB0aGUgY3Vy cmVudGx5IGF2YWlsYWJsZSBwYW5lbHMuIgo+IAo+IFNvIEkgYmVsaWV2ZSB0aGlzIGRvY3VtZW50 IGlzIGFuIGFja25vd2xlZGdlbWVudCBvZiBtYW55Cj4gaW1wbGVtZW50YXRpb25zIGhhdmluZyB0 aGVpciBhbGlnbm1lbnQgdG8gdGhlIGxlYXN0LXNpZ25pZmljYW50IGJpdHMsCj4gYW5kICh0byBt eSBleWVzKSBjbGVhcmx5IHZhbGlkYXRlcyB0aGF0IHRoZSBzcGVjICJzaG91bGQiIGJlIHRoZQo+ IG9wcG9zaXRlLiBJZiB3ZSBiZWxpZXZlIHRoZSBkb2MncyBjbGFpbSB0aGF0ICJ0aGUgbW9zdCBj b21tb24KPiBpbnRlcnByZXRhdGlvbiIgaXMgbGVhc3Qtc2lnbmlmaWNhbnQsIGl0IHNlZW1zIHRv IG1lIHRoYXQgaXQgd291bGQKPiByZXF1aXJlIG1vcmUgcXVpcmtzIGlmIHdlIG1hZGUgbW9zdC1z aWduaWZpY2FudCB0aGUgZGVmYXVsdAo+IGltcGxlbWVudGF0aW9uLgo+IAo+IFZpbGxlIG1lbnRp b25lZCBhdCBzb21lIHBvaW50IGVhcmxpZXIgdGhhdCB3ZSBzaG91bGQgdHJ5IHRvIG1hdGNoIHRo ZQo+IHNwZWMsIHdoZXJlYXMgTHl1ZGUgbWVudGlvbmVkIHdlIHNob3VsZCBwcmVmZXIgdG8gZG8g d2hhdCB0aGUgbWFqb3JpdHkKPiBvZiBtYWNoaW5lcyBkby4gV2hhdCBkbyB5b3UgYm90aCB0aGlu ayBvZiB0aGlzIG5ldyBkZXZlbG9wbWVudD8KClRoYXQncyBob3cgZGlzcGxheXBvcnQgaGFwcGVu cyB0byBiZSBzb21ldGltZXMgOikuIERlZmluaXRlbHkgaXNuJ3QgdGhlIGZpcnN0CnRpbWUgc29t ZXRoaW5nIGluIHRoZSBzcGVjIGxpa2UgdGhpcyBnb3QgaW1wbGVtZW50ZWQgaW5jb3JyZWN0bHkg c28gbWFueSB0aW1lcwpieSBkaWZmZXJlbnQgdmVuZG9ycyB0aGF0IHRoZXkgaGFkIHRvIHVwZGF0 ZSB0aGUgc3BlYyBpbiByZXNwb25zZSAoc2FtZSB0aGluZwpoYXBwZW5lZCB3aXRoIE1TVCBhbmQg aW50ZXJsZWF2ZWQgc2lkZWJhbmQgbWVzc2FnZXMgYXMgb2YgRFAgMi4wKSwgc28gSSdtCnJlYWxs eSBnbGFkIHdlIHdlbnQgYW5kIGFjdHVhbGx5IGludmVzdGlnYXRlZCB0aGlzLgoKU28geWVzIC0g SSB0aGluayBhIHF1aXJrIGZvciB0aGlzIHdvdWxkIGRlZmluaXRlbHkgYmUgYSBnb29kIGlkZWEs IGFuZCBJTU8gd2UKc2hvdWxkIGFsd2F5cyBsZWFuIG9uIHRoZSBzaWRlIHRoYXQgbW9yZSBwYW5l bHMgaW1wbGVtZW50IGV2ZW4gaWYgaXQncyBub3QKYWNjb3JkaW5nIHRvIHNwZWMgLSBzbyBkZWZh dWx0aW5nIHRvIHRoZSBiZWhhdmlvciB3ZSBjdXJyZW50bHkgaGF2ZSBpbiB0aGUKa2VybmVsLCBh bmQgYWRkaW5nIHF1aXJrcyBmb3IgcGFuZWxzIHRoYXQgd2VyZSBzbWFydCBlbm91Z2ggbm90IHRv IGZhbGwgZm9yCnRoaXMgd291bGQgcHJvYmFibHkgYmUgdGhlIGJlc3Qgd2F5IHRvIGdvLiBUaGF0 IGp1c3QgbGVhdmVzIHRoZSBjaGFsbGVuZ2Ugb2YKImhvdyBkbyB3ZSBmaWd1cmUgb3V0IHdoaWNo IHBhbmVscyBhY3R1YWxseSBuZWVkIHRoaXMgYW5kIHdoaWNoIG9uZXMgZG9uJ3Q/IgoKVGhpcyBt aWdodCBlbmQgdXAgYmVpbmcgYSBiaXQgb2YgYSBjaGFsbGVuZ2UsIGJ1dCBJJ3ZlIGdvdCBzb21l IGlkZWFzIG9uIGhvdwp3ZSBtaWdodCBiZSBhYmxlIHRvIHRhY2tsZSBpdCB0byB0aGUgYmVzdCBv ZiBvdXIgYWJpbGl0eSBiYXNlZCBvZmYgbXkKZGlzY3Vzc2lvbnMgd2l0aCBsYXB0b3AgdmVuZG9y cy4gSXQgc2VlbXMgbGlrZSBzb21lIG9mIHRoZSBob21lZ3Jvd24gYmFja2xpZ2h0CmludGVyZmFj ZXMgbWlnaHQgaGVscCB1cyBvdXQgaGVyZS4gTm90ZSBJJ20gbWVudGlvbmluZyBvdGhlciBsYXB0 b3AgdmVuZG9ycwpoZXJlIGJlY2F1c2UgYXQgbGVhc3QgZm9yIG5vdXZlYXUsIG91ciBwbGFuIGZv ciBEUENEIGJhY2tsaWdodCBzdXBwb3J0IGlzIHRvCm1vdmUgYSBsb3Qgb2YgdGhlIGNvZGUgZm9y IGhhbmRsaW5nIGl0IHRoYXQgY3VycmVudGx5IGxpdmVzIGluIGk5MTUgaW50bwpzaGFyZWQgRFJN IGhlbHBlcnMgKHdoaWNoIG5vdyB3ZSdsbCBkZWZpbml0ZWx5IG5lZWQgdG8gZG8gYXMgYSByZXN1 bHQgb2YgdGhlc2UKcXVpcmtzKS4KClNvLCBvbiB0aGUgeDg2IGZyb250LCB0aGVyZSdzIGFscmVh ZHkgYSBmZXcgZGlmZmVyZW50IGludGVyZmFjZXMgaW4gdXNlIGZvcgpsYXB0b3AgcGFuZWxzOgog KiBBTUQgdXN1YWxseSB1c2VzIHRoZWlyIG93biBiYWNrbGlnaHQgaW50ZXJmYWNlLCBzbyBmb3Ig QU1ELW9ubHkgbGFwdG9wcyB3ZQogICBjYW4gcHJvYmFibHkgc2FmZWx5IGlnbm9yZSB0aGlzCiAq IEludGVsIHVzZXMgdGhlaXIgb3duIERQQ0QgYmFja2xpZ2h0IGludGVyZmFjZSBvbiBtb3N0IG9m IHRoZSBfbm9uLUNocm9tZU9TXyAKICAgbWFjaGluZXMgb24gdGhlIG1hcmtldCByaWdodCBub3cg YWZhaWsgYmFzZWQgb2ZmIG15IGRpc2N1c3Npb24gd2l0aCBzb21lCiAgIGxhcHRvcCB2ZW5kb3Jz LiBGb3IgcGFuZWxzIHRoYXQgb25seSBjb21lIHVwIGluIEludGVsLW9ubHkgbWFjaGluZXMsIHRo YXQKICAgbWVhbnMgd2Ugb25seSByZWFsbHkgbmVlZCB0byBjYXJlIGFib3V0IHRoZSBDaHJvbWVP UyBjYXNlIGhlcmUuIFNvLWlmCiAgIEdvb2dsZSdzIGFibGUgdG8gYWN0dWFsbHkgc3VydmV5IHRo ZSBkZXZpY2VzIHRoZXkncmUgc2hpcHBpbmcgd2l0aCBDaHJvbWVPUwogICByaWdodCBub3cgdG8g ZmlndXJlIG91dCB3aGljaCBvbmVzIGFyZSB1c2luZyBEUENEIGJhY2tsaWdodCBjb250cm9scywg YW5kCiAgIHdoaWNoIG9uZXMgbmVlZCB0byBiZSBNU0IgYWxpZ25lZCAtIHRoZW4gSSdkIHRoaW5r IHdlIGNvdWxkIHByb2JhYmx5IGJ1aWxkCiAgIGFuIGFjY3VyYXRlIHF1aXJrIGxpc3Qgb2YgdGhv c2UgcGFuZWxzIGVhc2lseS4KICogVGhpcyBqdXN0IGxlYXZlcyB0aGUgbnZpZGlhIGNhc2UuIE52 aWRpYSBzZWVtcyB0byBiZSBvbmUgb2YgdGhlIG9ubHkgR1BVCiAgIHZlbmRvcnMgdGhhdCBkaWRu J3QgY29tZSB1cCB3aXRoIHRoZWlyIG93biBiYWNrbGlnaHQgaW50ZXJmYWNlIG92ZXIgRFBDRCwK ICAgYW5kIHRoZXkgYWN0dWFsbHkgcmVxdWlyZSB0aGF0IHRoZSBwYW5lbCBzdXBwb3J0IHRoZSBW RVNBIGJhY2tsaWdodCBjb250cm9sCiAgIGludGVyZmFjZS4gSW5jaWRlbnRhbGx5LCBhIGxvdCBv ZiB0aGUgbGFwdG9wcyB0aGF0IEkndmUgZm9yY2UtZW5hYmxlZCBWRVNBCiAgIGJhY2tsaWdodCBj b250cm9scyBvbiBoYXZlIG52aWRpYSBHUFVzIGluIHRoZW0sIGFuZCBzbyBmYXIgZXZlcnkgc2lu Z2xlIG9uZQogICBoYXMgd29ya2VkIHdpdGggdGhlIGNvZGUgd2UgY3VycmVudGx5IHVzZSBpbiB0 aGUga2VybmVsLiBNeSBob3BlIHdpdGggdGhpcwogICB3b3VsZCBiZSB0aGF0IHNpbmNlIG52aWRp YSdzIGRyaXZlciBzdXBwb3J0IGlzIHNvbWV3aGF0IGNvbnNpc3RlbnQsIHRoZXkKICAgZWl0aGVy IG1pZ2h0IGhhdmUgYSBsaXN0IG9mIHByb2JsZW1hdGljIHBhbmVscyBvciBjYW4ganVzdCB2ZXJp Znkgd2l0aCB1cwogICB0aGF0IGFsbCBvZiB0aGUgcGFuZWxzIHRoYXQgdGhlaXIgZHJpdmVyIGlu dGVyYWN0cyB3aXRoIGZvbGxvdyB0aGUgTFNCCiAgIHByZWZlcmVuY2UuCgpGb3IgdGhlIENocm9t ZU9TIGd1eXMgaW4gdGhlIHRocmVhZCwgZG9lcyB0aGlzIHNvdW5kIGxpa2UgaXQgY291bGQgYmUK d29ya2FibGU/IEZvciB0aGUgdGltZSBiZWluZywgSSdsbCBhbHNvIHNlbmQgbXkgbnZpZGlhIGNv bnRhY3RzIGEgcG9rZSB0byBzZWUKd2hhdCBpbmZvIHRoZXkgY2FuIGdpdmUgdXMuIEFzIHdlbGws IHdlIHNob3VsZCBwcm9iYWJseSBwb2tlIEJpbGwganVzdCBpbiBjYXNlCmhlIG1pZ2h0IGtub3cg b2Ygc29tZSByZXNvdXJjZSB0aGF0IGRvY3VtZW50cyBzb21lIG9mIHRoZSBwcm9ibGVtYXRpYyBw YW5lbHMKb3V0IHRoZXJlIChwcm9iYWJseSBub3QsIGJ1dCBpdCdzIGF0IGxlYXN0IHdvcnRoIGEg c2hvdCkuIEknbGwgdHJ5IHRvIGdldAphcm91bmQgdGhpcyB0b2RheSwgYnV0IHdlIG1pZ2h0IGhh dmUgdG8gcG9rZSBoaW0gb25jZSBvciB0d2ljZSBzaW5jZSB0aGVyZQpvcmlnaW5hbGx5IHdhcyBh IHByb2JsZW0gd2l0aCBhbnkgb2YgdGhlIGVtYWlscyBmcm9tIFJlZCBIYXQgZ2V0dGluZyB0aHJv dWdoCnRvIGhpbeKApgoKPiAKPiBJIHdpbGwgYWxzbyBsb29rIGludG8gd2hldGhlciBteSBzcGVj aWZpYyBkZXZpY2Ugc3VwcG9ydHMgdGhpcwo+IGV4dGVuc2lvbiwgYW5kIGluIHRoYXQgY2FzZSBJ J2xsIHZvbHVudGVlciB0byBpbXBsZW1lbnQgdGhpcyBuZXcKPiBmdW5jdGlvbmFsaXR5IGluIHRo ZSBkcml2ZXIuCj4gCj4gVGhhbmtzIGZvciB5b3VyIHRpbWUsCj4gS2V2aW4KPiAKPiBPbiBUdWUs IFNlcCAyMiwgMjAyMCBhdCAzOjMwIFBNIEx5dWRlIFBhdWwgPGx5dWRlQHJlZGhhdC5jb20+IHdy b3RlOgo+ID4gSGkhIFNpbmNlIEkgZ290IGRyb3BwZWQgZnJvbSB0aGUgdGhyZWFkLCBtYW55IHJl c3BvbnNlcyBpbmxpbmUKPiA+IAo+ID4gT24gVHVlLCAyMDIwLTA5LTIyIGF0IDEyOjU4IC0wNzAw LCBQdXRoaWtvcm4gVm9yYXZvb3RpdmF0IHdyb3RlOgo+ID4gPiArTHl1ZGUKPiA+ID4gSSBub3Rp Y2UgdGhhdCBMeXVkZSBlbWFpbCB3YXMgc29tZWhvdyBkcm9wcGVkIGZyb20gdGhlIHRocmVhZC4K PiA+ID4gTHl1ZGUgd2FzIHRoZSBwZXJzb24gd2hvIHN1Ym1pdHRlZCB0aGUgcGF0Y2ggZm9yIFRo aW5rcGFkIGFuZCBzaG91bGQKPiA+ID4ga25vdyB0aGUgT1VJIG9mIHRoZSBwYW5lbC4KPiA+IAo+ ID4gbm8gbmVlZCAtIGN1cnJlbnRseSBiZWNhdXNlIG9mIHNvbWUgY29uZnVzaW9uIHRoYXQgZ290 IGNhdXNlZCBieSB0aGUgSW50ZWwKPiA+IEhEUgo+ID4gYmFja2xpZ2h0IGludGVyZmFjZSBiZWlu ZyB0aGUgb25seSBiYWNrbGlnaHQgaW50ZXJmYWNlIHRoYXQgd29ya3MgcHJvcGVybHkKPiA+IG9u Cj4gPiBhIGxvdCBvZiBwYW5lbHMgKG1hbnkgcGFuZWxzIHdpbGwgYWR2ZXJ0aXNlIGJvdGggaW50 ZXJmYWNlcywgYnV0IG1pZ2h0Cj4gPiBvbmx5Cj4gPiB3b3JrIHdpdGggdGhlIEludGVsIG9uZSks IHdlIGFjdHVhbGx5IHJlbHkgb24gYSBzbWFsbCBhbGxvd2xpc3Qgb2YKPiA+ICJhcHByb3ZlZCIK PiA+IHBhbmVscyBmb3IgZW5hYmxpbmcgRFBDRCBiYWNrbGlnaHQgY29udHJvbC4KPiA+IAo+ID4g 4oCmaG93ZXZlciwgbWFueSBvZiB0aGVzZSBwYW5lbHMgYXJlIGFubm95aW5nIGFuZCBkb24ndCBh Y3R1YWxseSBwcm92aWRlIGEKPiA+IHJlbGlhYmxlIGVub3VnaCBPVUlEIHRvIHVzZSBmb3IgcXVp cmsgZGV0ZWN0aW9uLCB3aGljaCBpcyB3aHkgd2UgaGFkIHRvCj4gPiBhZGQKPiA+IEVESUQgcXVp cmsgZGV0ZWN0aW9uIGFzIGEgdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIHRoaXMuIFRoZSBjdXJy ZW50IGxpc3QKPiA+IG9mCj4gPiBwYW5lbHMgbGl2ZXMgaW4gZHJtX2RwX2hlbHBlci5jOgo+ID4g Cj4gPiAvKgo+ID4gICogU29tZSBkZXZpY2VzIGhhdmUgdW5yZWxpYWJsZSBPVUlEcyB3aGVyZSB0 aGV5IGRvbid0IHNldCB0aGUgZGV2aWNlIElECj4gPiAgKiBjb3JyZWN0bHksIGFuZCBhcyBhIHJl c3VsdCB3ZSBuZWVkIHRvIHVzZSB0aGUgRURJRCBmb3IgZmluZGluZwo+ID4gYWRkaXRpb25hbAo+ ID4gICogRFAgcXVpcmtzIGluIHN1Y2ggY2FzZXMuCj4gPiAgKi8KPiA+IHN0YXRpYyBjb25zdCBz dHJ1Y3QgZWRpZF9xdWlyayBlZGlkX3F1aXJrX2xpc3RbXSA9IHsKPiA+ICAgICAgICAgLyogT3B0 aW9uYWwgNEsgQU1PTEVEIHBhbmVsIGluIHRoZSBUaGlua1BhZCBYMSBFeHRyZW1lIDJuZAo+ID4g R2VuZXJhdGlvbgo+ID4gICAgICAgICAgKiBvbmx5IHN1cHBvcnRzIERQQ0QgYmFja2xpZ2h0IGNv bnRyb2xzCj4gPiAgICAgICAgICAqLwo+ID4gICAgICAgICB7IE1GRygweDRjLCAweDgzKSwgUFJP RF9JRCgweDQxLCAweDQxKSwKPiA+IEJJVChEUF9RVUlSS19GT1JDRV9EUENEX0JBQ0tMSUdIVCkg fSwKPiA+ICAgICAgICAgLyoKPiA+ICAgICAgICAgICogU29tZSBEZWxsIENNTCAyMDIwIHN5c3Rl bXMgaGF2ZSBwYW5lbHMgc3VwcG9ydCBib3RoIEFVWCBhbmQgUFdNCj4gPiAgICAgICAgICAqIGJh Y2tsaWdodCBjb250cm9sLCBhbmQgc29tZSBvbmx5IHN1cHBvcnQgQVVYIGJhY2tsaWdodCBjb250 cm9sLgo+ID4gQWxsCj4gPiAgICAgICAgICAqIHNhaWQgcGFuZWxzIHN0YXJ0IHVwIGluIEFVWCBt b2RlIGJ5IGRlZmF1bHQsIGFuZCB3ZSBkb24ndCBoYXZlCj4gPiBhbnkKPiA+ICAgICAgICAgICog c3VwcG9ydCBmb3IgZGlzYWJsaW5nIEhEUiBtb2RlIG9uIHRoZXNlIHBhbmVscyB3aGljaCB3b3Vs ZCBiZQo+ID4gICAgICAgICAgKiByZXF1aXJlZCB0byBzd2l0Y2ggdG8gUFdNIGJhY2tsaWdodCBj b250cm9sIG1vZGUgKHBsdXMsIEknbSBub3QKPiA+ICAgICAgICAgICogZXZlbiBzdXJlIHdlIHdh bnQgUFdNIGJhY2tsaWdodCBjb250cm9scyBvdmVyIERQQ0QgYmFja2xpZ2h0Cj4gPiAgICAgICAg ICAqIGNvbnRyb2xzIGFueXdheS4uLikuIFVudGlsIHdlIGhhdmUgYSBiZXR0ZXIgd2F5IG9mIGRl dGVjdGluZwo+ID4gdGhlc2UsCj4gPiAgICAgICAgICAqIGZvcmNlIERQQ0QgYmFja2xpZ2h0IG1v ZGUgb24gYWxsIG9mIHRoZW0uCj4gPiAgICAgICAgICAqLwo+ID4gICAgICAgICB7IE1GRygweDA2 LCAweGFmKSwgUFJPRF9JRCgweDliLCAweDMyKSwKPiA+IEJJVChEUF9RVUlSS19GT1JDRV9EUENE X0JBQ0tMSUdIVCkgfSwKPiA+ICAgICAgICAgeyBNRkcoMHgwNiwgMHhhZiksIFBST0RfSUQoMHhl YiwgMHg0MSksCj4gPiBCSVQoRFBfUVVJUktfRk9SQ0VfRFBDRF9CQUNLTElHSFQpIH0sCj4gPiAg ICAgICAgIHsgTUZHKDB4NGQsIDB4MTApLCBQUk9EX0lEKDB4YzcsIDB4MTQpLAo+ID4gQklUKERQ X1FVSVJLX0ZPUkNFX0RQQ0RfQkFDS0xJR0hUKSB9LAo+ID4gICAgICAgICB7IE1GRygweDRkLCAw eDEwKSwgUFJPRF9JRCgweGU2LCAweDE0KSwKPiA+IEJJVChEUF9RVUlSS19GT1JDRV9EUENEX0JB Q0tMSUdIVCkgfSwKPiA+ICAgICAgICAgeyBNRkcoMHg0YywgMHg4MyksIFBST0RfSUQoMHg0Nywg MHg0MSksCj4gPiBCSVQoRFBfUVVJUktfRk9SQ0VfRFBDRF9CQUNLTElHSFQpIH0sCj4gPiB9Owo+ ID4gCj4gPiBBbHNvIG5vdGUgdGhhdCBJIHRoaW5rIGp1c3QgYWJvdXQgZXZlcnkgcGFuZWwgb24g dGhhdCBsaXN0IHN1cHBvcnRzIHRoZQo+ID4gSW50ZWwKPiA+IEhEUiBiYWNrbGlnaHQgaW50ZXJm YWNlLCBzbyBpdCdzIC1wb3NzaWJsZS0gdGhhdCB0aGUgVkVTQSBpbnRlcmZhY2UgY291bGQKPiA+ IGJlCj4gPiBicm9rZW4gb24gdGhlc2UgcGFuZWxzLiBCdXQsIHRoYXQgd291bGQgYmUgYSBsb3Qg b2YgZGlmZmVyZW50IHBhbmVscyBmcm9tCj4gPiBkaWZmZXJlbnQgdmVuZG9ycyB0byBhbGwgYmUg YnJva2VuIGluIHRoZSBzYW1lIHdheS4KPiA+IAo+ID4gPiBPbiBUdWUsIFNlcCAyMiwgMjAyMCBh dCAxMTo0NyBBTSBLZXZpbiBDaG93c2tpIDxjaG93c2tpQGNocm9taXVtLm9yZz4KPiA+ID4gd3Jv dGU6Cj4gPiA+ID4gQWxyaWdodHksIEknbGwgdGFrZSBldmVyeW9uZSBlbHNlJ3Mgc2lsZW5jZSBh cyB0YWNpdCBhcHByb3ZhbCBvZgo+ID4gPiA+IFZpbGxlJ3Mgb3BpbmlvbnMuIChJIGRpZG4ndCBy ZWNlaXZlIGFueSBlbWFpbCBib3VuY2VzIHRoaXMgdGltZSwgc28gSQo+ID4gPiA+IHRoaW5rIG15 IGlzc3VlIHdhcyB0cmFuc2llbnQuKSBJIHdpbGwgc3RhcnQgb24gaW52ZXJ0aW5nIHRoZSBxdWly ayBhbmQKPiA+ID4gPiBtYWtpbmcgdGhlIG1vc3Qtc2lnbmlmaWNhbnQtYWxpZ25tZW50IG1hdHRl ciBmb3IgdGhlc2UgcmVnaXN0ZXJzIGJ5Cj4gPiA+ID4gZGVmYXVsdC4KPiA+ID4gPiAKPiA+ID4g PiBXaG8gY2FuIGhlbHAgbWUgZ2F0aGVyIGEgbGlzdCBvZiBPVUlzIHRoYXQgd2UgbmVlZCB0byBh ZGQgdG8gdGhlCj4gPiA+ID4gcXVpcms/IEkgY2FuIGZvbGxvdyB1cCB3aXRoIFB1dGhpa29ybiBh Ym91dCB0aGUgcmVsZXZhbnQgQ2hyb21lYm9va3MsCj4gPiA+ID4gYnV0IEkgZG9uJ3Qga25vdyB3 aGF0IG90aGVyIHR5cGVzIG9mIGxhcHRvcHMgYXJlIHVzaW5nIHRoaXMgZHJpdmVyLgo+ID4gPiA+ IAo+ID4gPiA+IFRoYW5rcyBmb3IgeW91ciB0aW1lLAo+ID4gPiA+IEtldmluIENob3dza2kKPiA+ ID4gPiAKPiA+ID4gPiAKPiA+ID4gPiBPbiBGcmksIFNlcCAxOCwgMjAyMCBhdCAxMjoxNiBQTSBQ dXRoaWtvcm4gVm9yYXZvb3RpdmF0Cj4gPiA+ID4gPHB1dGhpa0BjaHJvbWl1bS5vcmc+IHdyb3Rl Ogo+ID4gPiA+ID4gSSdsbCBkZWZlciB0byBWaWxsZSAmIEx5dWRlLgo+ID4gPiA+ID4gCj4gPiA+ ID4gPiBJIGR1ZyB1cCBtb3JlIG9uIHRoZSBidWcgcmVwb3J0IGFuZCBmb3VuZCB0aGF0IGJvdGgg VGhpbmtwYWQgYW5kCj4gPiA+ID4gPiBHYWxheHkgQ2hyb21lYm9vayB1c2UgdGhlIHNhbWUgU2Ft c3VuZyBPTEVELgo+ID4gPiA+ID4gU28gbXkgMiB2cyAxIGFyZ3VtZW50IGlzIGFjdHVhbGx5IG5v dCB2YWxpZC4KPiA+ID4gPiA+IAo+ID4gPiA+ID4gT24gRnJpLCBTZXAgMTgsIDIwMjAgYXQgMTA6 NTkgQU0gS2V2aW4gQ2hvd3NraSA8Y2hvd3NraUBjaHJvbWl1bS5vcmcKPiA+ID4gPiA+ID4KPiA+ ID4gPiA+IHdyb3RlOgo+ID4gPiA+ID4gPiBBcG9sb2dpZXMgb25jZSBhZ2Fpbiwgc29tZSBvZiBt eSBlbWFpbHMgd2VyZSBib3VuY2luZyBmb3Igc29tZQo+ID4gPiA+ID4gPiBhZGRyZXNzZXMgeWVz dGVyZGF5LiBIb3BlZnVsbHkgaXQgd2FzIGEgdGVtcG9yYXJ5IGNvbmRpdGlvbjsgSSdsbAo+ID4g PiA+ID4gPiBjb250aW51ZSB0cnlpbmcgdG8gZGlnIGludG8gaXQgb24gbXkgZW5kIGlmIGl0IGhh cHBlbnMgYWdhaW4gZm9yCj4gPiA+ID4gPiA+IHRoaXMKPiA+ID4gPiA+ID4gZW1haWwuCj4gPiA+ ID4gPiA+IAo+ID4gPiA+ID4gPiBTaW5jZSB0aGVyZSdzIGV2aWRlbmNlIHRoYXQgc29tZSBtb2Rl bHMgd2FudCBsc2IgYW5kIHNvbWUgKHdlbGwsCj4gPiA+ID4gPiA+IGF0Cj4gPiA+ID4gPiA+IGxl YXN0IG9uZSkgd2FudCBtc2IsIG15IHVuZGVyc3RhbmRpbmcgaXMgdGhhdCB3ZSdsbCBuZWVkIGEg cXVpcmsKPiA+ID4gPiA+ID4gb25lCj4gPiA+ID4gPiA+IHdheSBvciB0aGUgb3RoZXIgKHBsZWFz ZSBjb3JyZWN0IGlmIEknbSBtaXN0YWtlbikuIEkgdW5mb3J0dW5hdGVseQo+ID4gPiA+ID4gPiBk b24ndCBoYXZlIHRoZSBhYmlsaXR5IHRvIHRlc3QgYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUgUGl4 ZWxib29rLAo+ID4gPiA+ID4gPiBzbwo+ID4gPiA+ID4gPiBpZiB3ZSBkZWNpZGUgdGhlIG1zYiBp cyB0aGUgInJpZ2h0IiB3YXksIHRoZW4gSSB3aWxsIGhhdmUgdG8gcmVseQo+ID4gPiA+ID4gPiBv bgo+ID4gPiA+ID4gPiBvdGhlcnMgdG8gdGVzdCAoYW5kIGZpbmQgdGhlIE9VSSBvZikgb3RoZXIg bW9kZWxzIHdoaWNoIHJlcXVpcmUKPiA+ID4gPiA+ID4gbHNiLgo+ID4gPiA+ID4gPiAKPiA+ID4g PiA+ID4gSSBhbSBoYXBweSB0byBtYWtlIGFueSBjaGFuZ2VzIHJlcXVlc3RlZCwgYnV0IEkgZG8g bm90IGF0IGFsbCBoYXZlCj4gPiA+ID4gPiA+IGVub3VnaCBiYWNrZ3JvdW5kIGhlcmUgdG8gbWFr ZSB0aGUgZGVjaXNpb24gb24gd2hldGhlciB0aGUgbXNiCj4gPiA+ID4gPiA+IGZ1bmN0aW9uYWxp dHkgZGVzZXJ2ZXMgdGhlIHF1aXJrIG9yIGlmIHRoZSBsc2Igb25lIGRvZXMuIEhvdyBjYW4gSQo+ ID4gPiA+ID4gPiBoZWxwIHlvdSBhbGwgY29tZSB0byBhbiBhZ3JlZW1lbnQgaGVyZT8KPiA+ID4g PiA+ID4gCj4gPiA+ID4gPiA+ICogSXQgc2VlbXMgbGlrZSBWaWxsZSBmZWVscyBzdHJvbmdseSBh Ym91dCB0aGUgbXNiIGJlaW5nIHRoZQo+ID4gPiA+ID4gPiBjb3JyZWN0Cj4gPiA+ID4gPiA+IGlu dGVycHJldGF0aW9uIG9mIHRoZSBzcGVjLgo+ID4gPiA+ID4gPiAqIEl0J3MgdW5jbGVhciB0byBt ZSBvbiB3aGljaCBzaWRlIG9mIHRoZSBmZW5jZSBMeXVkZSBmYWxscywgSQo+ID4gPiA+ID4gPiBj b3VsZG4ndCBwaWNrIHVwIGEgc3Ryb25nIG9waW5pb24gaW4gaGVyIGNsYXJpZnlpbmcgcXVlc3Rp b24uCj4gPiA+ID4gPiA+ICogUHV0aGlrb3JuIHNlZW1zIHRvIGJlIG9uIHRoZSBzaWRlIG9mIGxz YiBiZWluZyBjb3JyZWN0LCBidXQKPiA+ID4gPiA+ID4gbWF5YmUKPiA+ID4gPiA+ID4gd2FzIHN3 YXllZCBieSBWaWxsZSdzIGFyZ3VtZW50Lgo+ID4gCj4gPiBIb25lc3RseSBJJ20gbm90IGhhcmQg dG8gY29udmluY2UgOlAsIGlmIGl0IGxvb2tzIGxpa2Ugd2UgZ290IHRoZSBiaXQKPiA+IHNoaWZ0 Cj4gPiB3cm9uZyBmb3IgdGhlIG1ham9yaXR5IG9mIGRldmljZXMgYW5kIGV2ZXJ5b25lIGVsc2Ug YWdyZWVzIHRoZW4gSSdtIGZpbmUKPiA+IHdpdGgKPiA+IGFzc3VtaW5nIHRoYXQncyB0aGUgY2Fz ZS4gSSdtIGp1c3QgcXVpdGUgc3VycHJpc2VkLCBzZWVpbmcgYXMgd2UndmUgdGVzdGVkCj4gPiBt YW55IGRpZmZlcmVudCBwYW5lbHMgZnJvbSBhIGZldyB2ZW5kb3JzIGFuZCBoYXZlbid0IHJ1biBp bnRvIGFueSBpc3N1ZXMKPiA+IHdpdGgKPiA+IHRoaXMgYmVmb3JlLgo+ID4gCj4gPiBIb25lc3Rs eSAtIGlmIHRoZXJlJ3MgdGhpcyBtdWNoIHVuY2VydGFpbnR5IGFib3V0IGl0LCBtYXliZSB3ZSBz aG91bGQganVzdAo+ID4gYXNrCj4gPiBWRVNBIGRpcmVjdGx5IHdoYXQgdGhlIGNvcnJlY3QgaW50 ZXJwcmV0YXRpb24gb2YgdGhpcyBpcz8gTm90ZSBJJ20gbm90IG9uCj4gPiB0aGUKPiA+IFZFU0Eg Ym9hcmQgKEkgZ2V0IGFjY2VzcyB0byBEUC9lRFAgc3BlY3MgdGhyb3VnaCBYLm9yZykgc28gdW5s ZXNzIHRoZQo+ID4gY29udGFjdHMKPiA+IEkndmUgZ290IGZyb20gVkVTQSB3b3VsZCB3b3JrIChC aWxsIExlbXBlc2lzIGJpbGwgYXQgdmVzYSBkb3Qgb3JnKSBmb3IKPiA+IHRoYXQgaXQKPiA+IG1p Z2h0IGJlIGEgYmV0dGVyIGlkZWEgZm9yIHNvbWVvbmUgZnJvbSBHb29nbGUgb3IgSW50ZWwgdG8g YXNrLgo+ID4gCj4gPiA+ID4gPiA+IElmIG5vIG9uZSBmZWVscyB0aGF0IFZpbGxlJ3MgYXJndW1l bnQgaXMgbm90IHN0cm9uZyBpbiBzb21lIHdheSwKPiA+ID4gPiA+ID4gYW5kCj4gPiA+ID4gPiA+ IHdlIGdvIHdpdGggdGhhdCwgSSB3aWxsIGdldCB0byB3b3JrIG9uIHRoZSByZXF1ZXN0ZWQgY2hh bmdlcy4gSSBhbQo+ID4gPiA+ID4gPiBjb25jZXJuZWQsIHRob3VnaCwgYWJvdXQgY2hhbmdpbmcg dGhlIGRlZmF1bHQgZnVuY3Rpb25hbGl0eQo+ID4gPiA+ID4gPiB3aXRob3V0Cj4gPiA+ID4gPiA+ IHRlc3RpbmcgaXQgd2lkZWx5IHRvIGZpbmQgdGhlIHNldCBvZiBsYXB0b3BzIHdoaWNoIHJlcXVp cmUgdGhlIGxzYgo+ID4gPiA+ID4gPiBxdWlyay4gSSdkIGFwcHJlY2lhdGUgYW55IGFkdmljZSBw ZW9wbGUgbWlnaHQgaGF2ZSBhYm91dCBtYWtpbmcKPiA+ID4gPiA+ID4gdGhpcwo+ID4gPiA+ID4g PiBjaGFuZ2Ugc2FmZWx5Lgo+ID4gCj4gPiBVc3VhbGx5LCBJIGp1c3QgdHJ5IHRvIHN0aWNrIHdp dGggd2hhdCB0aGUgbWFqb3JpdHkgb2YgbWFjaGluZXMgbmVlZCB0bwo+ID4gZG8uIEkKPiA+IHN0 aWxsIHRoaW5rIGl0J2QgYmUgYSBnb29kIGlkZWEgZm9yIHVzIHRvIHZlcmlmeSB0aGlzIHdpdGgg VkVTQSBpZiB0aGVyZSdzCj4gPiB0aGF0IG11Y2ggY29uZnVzaW9uIHRob3VnaAo+ID4gCj4gPiA+ ID4gPiA+IFRoYW5rIHlvdSBmb3IgeW91ciB0aW1lLAo+ID4gPiA+ID4gPiBLZXZpbgo+ID4gPiA+ ID4gPiAKPiA+ID4gPiA+ID4gT24gVGh1LCBTZXAgMTcsIDIwMjAgYXQgMjoxMSBQTSBWaWxsZSBT eXJqw6Rsw6QKPiA+ID4gPiA+ID4gPHZpbGxlLnN5cmphbGFAbGludXguaW50ZWwuY29tPiB3cm90 ZToKPiA+ID4gPiA+ID4gPiBPbiBUaHUsIFNlcCAxNywgMjAyMCBhdCAwOToyNTozNVBNICswMzAw LCBWaWxsZSBTeXJqw6Rsw6Qgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gPiBPbiBUaHUsIFNlcCAxNywg MjAyMCBhdCAxMToxNDo0M0FNIC0wNzAwLCBQdXRoaWtvcm4KPiA+ID4gPiA+ID4gPiA+IFZvcmF2 b290aXZhdAo+ID4gPiA+ID4gPiA+ID4gd3JvdGU6Cj4gPiA+ID4gPiA+ID4gPiA+IFRoZSBMeXVk ZSBmZGU3MjY2ZmIyZjYgY2hhbmdlIGlzIGFjdHVhbGx5IGJhc2VkIG9uIENocm9taXVtCj4gPiA+ ID4gPiA+ID4gPiA+IGNoYW5nZQo+ID4gPiA+ID4gPiA+ID4gPiAoaHR0cHM6Ly9jcnJldi5jb20v Yy8xNjUwMzI1KSB0aGF0IGZpeGVzIHRoZSBicmlnaHRuZXNzIGZvcgo+ID4gPiA+ID4gPiA+ID4g PiBTYW1zdW5nCj4gPiA+ID4gPiA+ID4gPiA+IEdhbGF4eSBDaHJvbWVib29rLiBTbyBjdXJyZW50 bHkgd2UgaGF2ZSAyIGV4YW1wbGVzIHRoYXQgdXNlCj4gPiA+ID4gPiA+ID4gPiA+IExTQgo+ID4g PiA+ID4gPiA+ID4gPiBpbnRlcnByZXRhdGlvbiBhbmQgMSB0aGF0IHVzZSBNU0IuCj4gPiA+ID4g PiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ICJJZiBmaWVsZCA0OjAgb2YgdGhlIEVEUF9QV01HRU5f QklUX0NPVU5UIHJlZ2lzdGVyIHJlcHJlc2VudHMKPiA+ID4gPiA+ID4gPiA+IGEKPiA+ID4gPiA+ ID4gPiA+IHZhbHVlCj4gPiA+ID4gPiA+ID4gPiBvZiBncmVhdGVyIHRoYW4gOCBhbmQgdGhlIEJB Q0tMSUdIVF9CUklHSFRORVNTX0JZVEVfQ09VTlQgYml0Cj4gPiA+ID4gPiA+ID4gPiBpcyBjbGVh cmVkIHRvIDAsIG9ubHkgdGhlIDggTVNCIG9mIHRoZSBicmlnaHRuZXNzIGNvbnRyb2wKPiA+ID4g PiA+ID4gPiA+IHZhbHVlCj4gPiA+ID4gPiA+ID4gPiBjYW4gYmUKPiA+ID4gPiA+ID4gPiA+IGNv bnRyb2xsZWQuCj4gPiA+ID4gPiA+ID4gPiAoU2VlIE5vdGUgYmVsb3cuKQo+ID4gPiA+ID4gPiA+ ID4gQXNzaWduZWQgYml0cyBhcmUgYWxsb2NhdGVkIHRvIHRoZSBNU0Igb2YgdGhlIGVuYWJsZWQg cmVnaXN0ZXIKPiA+ID4gPiA+ID4gPiA+IGNvbWJpbmF0aW9uLiIKPiA+ID4gPiA+ID4gPiA+IAo+ ID4gPiA+ID4gPiA+ID4gSSB0aGluayB0aGF0J3MgcHJldHR5IGNsZWFyIHRoZSBhc3NpZ25lZCBi aXRzIGFyZSBzdXBwb3NlZCB0bwo+ID4gPiA+ID4gPiA+ID4gYmUKPiA+ID4gPiA+ID4gPiA+IG1z YiBhbGlnbmVkLgo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+IEkgZ3Vlc3MgdGhlcmUncyBz b21lIGVtYWlsIGlzc3VlcyBoYXBwZW5pbmcsIGJ1dCBqdXN0IHRvCj4gPiA+ID4gPiA+ID4gY2xh cmlmeToKPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiBXaGVuIHRoZSBzcGVjIHNheXMgTVNC IGluIGNhcHMgaGVyZSBpdCBjbGVhcmx5IG1lYW5zCj4gPiA+ID4gPiA+ID4gIm1vc3Qgc2lnbmlm aWNhbnQtYml0KHMpIiBzaW5jZSBvdGhlcndpc2UgIjggTVNCIiB3b3VsZCBub3QgbWFrZQo+ID4g PiA+ID4gPiA+IGFueSBzZW5zZSBpbiB0aGUgY29udGV4dCBvZiBhIDIgYnl0ZSB2YWx1ZS4KPiA+ ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiBHcmFudGVkIHRoZSBzcGVjIGlzIGNyYXAgaGVyZSBz aW5jZSAiVGFibGUgMS0xOiBBY3JvbnltcyBhbmQKPiA+ID4gPiA+ID4gPiBJbml0aWFsaXNtIiBk b2VzIGNsYWltICJNU0IiIHNob3VsZCBiZSBieXRlKHMpIGFuZCAibXNiIiBiaXQocykuCj4gPiA+ ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gQWxzbyBJIGNhbid0IGltYWdpbmUgYW55b25lIHdvdWxk IGFsbG9jYXRlIHRoZSBiaXRzIHN0YXJ0aW5nCj4gPiA+ID4gPiA+ID4gZnJvbSB0aGUgbHNiIHdo ZW4gdGhlIHdob2xlIHRoaW5nIGlzIGNsZWFybHkgc3VwcG9zZWQgdG8gYmUgYQo+ID4gPiA+ID4g PiA+IDE2Yml0IGJpZyBlbmRpYW4gaW50ZWdlci4gU28gd2l0aCA+OCBhc3NpZ25lZCBiaXRzIHlv dSdkIGVuZAo+ID4gPiA+ID4gPiA+IHVwIHdpdGggY3Jhenkgc3R1ZmYgbGlrZSB0aGlzOgo+ID4g PiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+IFsgNyAuLi4gMCBdWzcgICAuLi4gICAwXQo+ID4gPiA+ ID4gPiA+IFsgOCBNU0IgICBdW1hYWFhdW04gTFNCXQo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4g PiA+IHNvIHlvdSBjb3VsZG4ndCBldmVuIHRyZWF0IHRoZSB2YWx1ZSBhcyBhIHJlZ3VsYXIgYmln IGVuZGlhbgo+ID4gPiA+ID4gPiA+IHRoaW5nLiBJbnN0ZWFkLCBpZiB5b3Ugc3F1aW50IGEgYml0 LCBpdCBub3cgbG9va3MgbGlrZSBhIGZ1bmt5Cj4gPiA+ID4gPiA+ID4gbGl0dGxlIGVuZGlhbiB2 YWx1ZS4gU28gd2UncmUgZGVlcCBpbnRvIHNvbWUgbWl4ZWQgZW5kaWFuIGxhbmQKPiA+ID4gPiA+ ID4gPiB3aGVyZSBub3RoaW5nIG1ha2VzIHNlbnNlIGFueW1vcmUuCj4gPiA+ID4gPiA+ID4gCj4g PiA+ID4gPiA+ID4gQW55d2F5cyBJIHRoaW5rIHRoZSBjb2RlIHNob3VsZCBzaW1wbHkgZG8gdGhp cyB0byBtYXRjaCB0aGUKPiA+ID4gPiA+ID4gPiBzcGVjOgo+ID4gPiA+ID4gPiA+IHUxNiB2YWx1 ZSA9IGJyaWdodG5lc3MgPDwgKDE2IC0gbnVtX2Fzc2lnbmVkX2JpdHMpOwo+ID4gPiA+ID4gPiA+ IHZhbFswXSA9IHZhbHVlID4+IDg7Cj4gPiA+ID4gPiA+ID4gdmFsWzFdID0gdmFsdWUgJiAweGZm Owo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiBPbiBUaHUs IFNlcCAxNywgMjAyMCBhdCAxMDo1NSBBTSBLZXZpbiBDaG93c2tpIDwKPiA+ID4gPiA+ID4gPiA+ ID4gY2hvd3NraUBjaHJvbWl1bS5vcmc+IHdyb3RlOgo+ID4gPiA+ID4gPiA+ID4gPiA+IEFwb2xv Z2llcyBmb3IgYmVpbmcgdG9vIHZhZ3VlLiBUbyBiZSBhcyBwcmVjaXNlIEkgY2FuIGJlLAo+ID4g PiA+ID4gPiA+ID4gPiA+IGhlcmUKPiA+ID4gPiA+ID4gPiA+ID4gPiBpcyB0aGUKPiA+ID4gPiA+ ID4gPiA+ID4gPiBzcGVjaWZpYyBjb2RlIGRlbHRhIEkgdGVzdGVkOiBodHRwczovL2NycmV2LmNv bS9jLzI0MDY2MTYKPiA+ID4gPiA+ID4gPiA+ID4gPiAuIFRvCj4gPiA+ID4gPiA+ID4gPiA+ID4g YW5zd2VyCj4gPiA+ID4gPiA+ID4gPiA+ID4geW91ciBvdGhlciBxdWVzdGlvbiwgdGhlIGNvZGUg SSB0ZXN0ZWQgYWdhaW5zdCBpcyBpbmRlZWQKPiA+ID4gPiA+ID4gPiA+ID4gPiBpbmNsdWRpbmcg dGhlCj4gPiA+ID4gPiA+ID4gPiA+ID4gZmRlNzI2NmZiMmY2IChkZXNwaXRlIG9zdGVuc2libHkg YmVpbmcgY2FsbGVkIDUuNCBpbiBteQo+ID4gPiA+ID4gPiA+ID4gPiA+IGNvbW1pdAo+ID4gPiA+ ID4gPiA+ID4gPiA+IG1lc3NhZ2UpOiBvdXIgY3VycmVudCB0b3Atb2YtdHJlZSBmb3Igb3VyIDUu NCBicmFuY2gKPiA+ID4gPiA+ID4gPiA+ID4gPiBpbmNsdWRlcwo+ID4gPiA+ID4gPiA+ID4gPiA+ IHRoZQo+ID4gPiA+ID4gPiA+ID4gPiA+IGludGVsX2RwX2F1eF9jYWxjX21heF9iYWNrbGlnaHQg bG9naWMuIEZ1cnRoZXIsIEknbGwgbm90ZQo+ID4gPiA+ID4gPiA+ID4gPiA+IHRoYXQKPiA+ID4g PiA+ID4gPiA+ID4gPiBjaGFuZ2UKPiA+ID4gPiA+ID4gPiA+ID4gPiBpcyBleGFjdGx5IHRoZSBj aGFuZ2Ugd2hpY2ggYnJlYWtzIG15IFBpeGVsYm9vayBtb2RlbDoKPiA+ID4gPiA+ID4gPiA+ID4g PiBwcmlvcgo+ID4gPiA+ID4gPiA+ID4gPiA+IHRvIHRoZQo+ID4gPiA+ID4gPiA+ID4gPiA+IGNo YW5nZSwgdGhlIG1heF9icmlnaHRuZXNzIHdhcyBoYXJkLWNvZGVkIHRvIDB4RkZGRiBhbmQKPiA+ ID4gPiA+ID4gPiA+ID4gPiB0aGUKPiA+ID4gPiA+ID4gPiA+ID4gPiBtYXRoCj4gPiA+ID4gPiA+ ID4gPiA+ID4gd29ya2VkIG91dCB0aGF0IGl0IGRpZG4ndCBtYXR0ZXIgdGhhdCB0aGUgaGFyZHdh cmUgY2FyZWQKPiA+ID4gPiA+ID4gPiA+ID4gPiBhYm91dAo+ID4gPiA+ID4gPiA+ID4gPiA+IHRo ZSBNU0IKPiA+ID4gPiA+ID4gPiA+ID4gPiBkZXNwaXRlIHRoZSBkcml2ZXIgY29kZSBjYXJpbmcg YWJvdXQgdGhlIExTQi4KPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiBU byBhbnN3ZXIgVmlsbGUncyBxdWVzdGlvbjogdGhlIGZkZTcyNjZmYjJmNiBjaGFuZ2Ugd2hpY2gK PiA+ID4gPiA+ID4gPiA+ID4gPiBmaXhlcyBvbmUKPiA+ID4gPiA+ID4gPiA+ID4gPiBsYXB0b3Ag KEkgYmVsaWV2ZSBUaGlua3BhZCBYMSBleHRyZW1lIEdlbiAyLCBmcm9tIHNvbWUgYnVnCj4gPiA+ ID4gPiA+ID4gPiA+ID4gcmVwb3J0cyBJCj4gPiA+ID4gPiA+ID4gPiA+ID4gZHVnIHVwKSBhbmQg YnJlYWtzIGFub3RoZXIgKFBpeGVsYm9vayk7IHNvIHVuZm9ydHVuYXRlbHkgSQo+ID4gPiA+ID4g PiA+ID4gPiA+IGJlbGlldmUgd2UKPiA+ID4gPiA+ID4gPiA+ID4gPiBuZWVkIGEgcXVpcmsgYXQg bGVhc3QgZm9yIHNvbWUgbGFwdG9wLiBSZWFkaW5nIHRocm91Z2ggdGhlCj4gPiA+ID4gPiA+ID4g PiA+ID4gY29weSBvZiB0aGUKPiA+ID4gPiA+ID4gPiA+ID4gPiBkYXRhc2hlZXQgSSBoYXZlLCBp dCB3YXNuJ3QgY2xlYXIgdG8gbWUgd2hpY2ggd2FzIHRoZQo+ID4gPiA+ID4gPiA+ID4gPiA+IGNv cnJlY3QKPiA+ID4gPiA+ID4gPiA+ID4gPiBpbnRlcnByZXRhdGlvbi4gSSdtIGNjJ2luZyBwdXRo aWtALCB3aG8gd2FzIGxlYW5pbmcgdG93YXJkCj4gPiA+ID4gPiA+ID4gPiA+ID4gdGhlCj4gPiA+ ID4gPiA+ID4gPiA+ID4gY3VycmVudAo+ID4gPiA+ID4gPiA+ID4gPiA+IGtlcm5lbCBjb2RlIChj YXJpbmcgYWJvdXQgTFNCKSBiZWluZyB0aGUgY29ycmVjdAo+ID4gPiA+ID4gPiA+ID4gPiA+IGlu dGVycHJldGF0aW9uLiBJCj4gPiA+ID4gPiA+ID4gPiA+ID4gYmVsaWV2ZSB3ZSBoYXZlIG90aGVy IGNocm9tZWJvb2tzIHdoaWNoIGRvIHJlbHkgb24gTFNCCj4gPiA+ID4gPiA+ID4gPiA+ID4gZnVu Y3Rpb25hbGl0eSwKPiA+ID4gPiA+ID4gPiA+ID4gPiBzbyB1bmxlc3Mgd2UgY2FuIGZpbmQgbW9y ZSBleGFtcGxlcyBvZiBsYXB0b3BzIHdhbnRpbmcgTVNCCj4gPiA+ID4gPiA+ID4gPiA+ID4gaXQK PiA+ID4gPiA+ID4gPiA+ID4gPiBjdXJyZW50bHkgbG9va3MgbGlrZSBQaXhlbGJvb2sgaXMgdGhl IG91dGxpZXIuCj4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gT24gVGh1 LCBTZXAgMTcsIDIwMjAgYXQgMTE6MjggQU0gSmFuaSBOaWt1bGEKPiA+ID4gPiA+ID4gPiA+ID4g PiA8amFuaS5uaWt1bGFAbGludXguaW50ZWwuY29tPiB3cm90ZToKPiA+ID4gPiA+ID4gPiA+ID4g PiA+IE9uIFRodSwgMTcgU2VwIDIwMjAsIEtldmluIENob3dza2kgPGNob3dza2lAY2hyb21pdW0u b3JnCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiB3cm90ZToK PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gV2UgaGF2ZSBvYnNlcnZlZCB0aGF0IEdvb2dsZSBQaXhl bGJvb2sncyBiYWNrbGlnaHQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gaGFyZHdhcmUgaXMKPiA+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gaW50ZXJwcmV0dGluZyB0aGVzZSBiYWNrbGlnaHQgYml0cyBm cm9tIHRoZSBtb3N0LQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBzaWduaWZpY2FudCBzaWRlIG9m IHRoZQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAxNiBiaXQgd29yZCAoaWYgRFBfRURQX1BXTUdF Tl9CSVRfQ09VTlQgPCAxNiksIHdoZXJlYXMKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gdGhlCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+IGRyaXZlciBjb2RlCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ IGFzc3VtZXMgdGhlIHBlcmlwaGVyYWwgY2FyZXMgYWJvdXQgdGhlIGxlYXN0LQo+ID4gPiA+ID4g PiA+ID4gPiA+ID4gPiBzaWduaWZpY2FudAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBiaXRzLgo+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gVGVzdGluZyB3 YXMgZG9uZSBmcm9tIHdpdGhpbiBDaHJvbWUgT1MncyBidWlsZAo+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiBlbnZpcm9ubWVudAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiB3aGVuIHRoZQo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiBwYXRjaCBpcyBiYWNrcG9ydGVkIHRvIDUuNCAodGhlIHZlcnNpb24g d2UgYXJlIG5ld2x5Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IHRhcmdldGluZyBmb3IgdGhlCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+IFBpeGVsYm9vayk7IGZvciB0aGUgcmVjb3JkOgo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiAgICAkIGVtZXJnZS1ldmUta2VybmVsbmV4dCBzeXMta2VybmVsL2No cm9tZW9zLWtlcm5lbC0KPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gNV80Cj4gPiA+ID4gPiA+ID4g PiA+ID4gPiA+ICYmIFwKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgLi91cGRhdGVfa2Vy bmVsLnNoIC0tcmVtb3RlPSRJUAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gSSB1c2VkIGAvc3lzL2tlcm5lbC9kZWJ1Zy9kcmkvMC9lRFAtMS9pOTE1X2Rw Y2RgIG9uIG15Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IGxhcHRvcCB0byB2ZXJpZnkKPiA+ID4g PiA+ID4gPiA+ID4gPiA+ID4gdGhhdCB0aGUgcmVnaXN0ZXJzIHdlcmUgYmVpbmcgc2V0IGFjY29y ZGluZyB0byB3aGF0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IHRoZQo+ID4gPiA+ID4gPiA+ID4g PiA+ID4gPiBhY3R1YWwgaGFyZHdhcmUKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gZXhwZWN0czsg SSBhbHNvIG9ic2VydmUgdGhhdCB0aGUgYmFja2xpZ2h0IGlzCj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+IG5vdGljZWFibHkKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gYnJpZ2h0ZXIgd2l0aAo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiB0aGlzIHBhdGNoLgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiBJdCdzIHVuY2xlYXIgdG8gbWUgd2hhdCBrZXJuZWwgdmVyc2lv biB0aGlzIGlzIGFnYWluc3QsCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiBhbmQKPiA+ID4gPiA+ID4g PiA+ID4gPiA+IHdoYXQgeW91J3ZlCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiBhY3R1YWxseSB0ZXN0 ZWQuCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IEhhdmUgeW91 IHRyaWVkIHY1Ljcga2VybmVsIHdpdGggTHl1ZGUncyBmZGU3MjY2ZmIyZjYKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ICgiZHJtL2k5MTU6IEZpeCBlRFAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IERQQ0Qg YXV4IG1heCBiYWNrbGlnaHQgY2FsY3VsYXRpb25zIik/Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiAK PiA+ID4gPiA+ID4gPiA+ID4gPiA+IEkganVzdCB3YW50IHRvIG1ha2Ugc3VyZSB5b3UndmUgdGVz dGVkIHdpdGggYWxsIHRoZQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gcmVsZXZhbnQKPiA+ID4gPiA+ ID4gPiA+ID4gPiA+IGZpeGVzCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiBiZWZvcmUgYWRkaW5nIHF1 aXJrcy4KPiA+ID4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gQlIsCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiBKYW5pLgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+IFNpZ25lZC1vZmYtYnk6IEtldmluIENob3dza2kgPGNob3dza2lAY2hy b21pdW0ub3JnPgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAtLS0KPiA+ID4gPiA+ID4gPiA+ID4g PiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAuLi4vZHJtL2k5MTUvZGlzcGxheS9pbnRl bF9kcF9hdXhfYmFja2xpZ2h0LmMgfCAzNAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArKysrKysr KysrKysrKysrKysrCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICBkcml2ZXJzL2dwdS9kcm0vaTkx NS9kaXNwbGF5L2ludGVsX3F1aXJrcy5jICAgfCAxMwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAr KysrKysrCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1 X2Rydi5oICAgICAgICAgICAgICAgfCAgMSArCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAzIGZp bGVzIGNoYW5nZWQsIDQ4IGluc2VydGlvbnMoKykKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+IGRpZmYgLS1naXQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4g YS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2RwX2F1eF9iYWNrbGlnaHQuCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+IGMKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX2RwX2F1eF9iYWNrbGlnaHQuCj4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+IGMKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gaW5kZXggYWNiZDdlYjY2Y2Jl My4uOTljOThmMjE3MzU2ZCAxMDA2NDQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gLS0tCj4gPiA+ ID4gPiA+ID4gPiA+ID4gPiA+IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9k cF9hdXhfYmFja2xpZ2h0Lgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBjCj4gPiA+ID4gPiA+ID4g PiA+ID4gPiA+ICsrKwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2Rpc3BsYXkvaW50ZWxfZHBfYXV4X2JhY2tsaWdodC4KPiA+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gYwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBAQCAtOTEsNiArOTEsMjMgQEAgc3RhdGljIHUz Mgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBpbnRlbF9kcF9hdXhfZ2V0X2JhY2tsaWdodChzdHJ1 Y3QgaW50ZWxfY29ubmVjdG9yCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICpjb25uZWN0b3IpCj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgIGlmIChpbnRlbF9kcC0+ZWRwX2RwY2RbMl0gJgo+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBEUF9FRFBfQkFDS0xJR0hUX0JSSUdIVE5FU1NfQllURV9D T1VOVCkKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgICAgICAgICBsZXZlbCA9IChyZWFk X3ZhbFswXSA8PCA4IHwKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gcmVhZF92YWxbMV0pOwo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgaWYgKGk5 MTUtPnF1aXJrcyAmCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IFFVSVJLX1NISUZUX0VEUF9CQUNL TElHSFRfQlJJR0hUTkVTUykgewo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAg IGlmICghZHJtX2RwX2RwY2RfcmVhZGIoJmludGVsX2RwLT5hdXgsCj4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+IERQX0VEUF9QV01HRU5fQklUX0NPVU5ULAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlYWRfdmEKPiA+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gbFswXQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiApKSB7Cj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICBEUk1fREVCVUdfS01T KCJGYWlsZWQgdG8gcmVhZAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBEUENECj4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+IHJlZ2lzdGVyIDB4JXhcbiIsCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFBfRURQX1BXTUdFTl9CSQo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiBUX0NPCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IFVOVCk7Cj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKPiA+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+ICsgICAgICAgICAgICAgLy8gT25seSBiaXRzIDQ6MCBhcmUgdXNlZCwgNzo1IGFyZQo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiByZXNlcnZlZC4KPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAg ICAgICAgICAgICByZWFkX3ZhbFswXSA9IHJlYWRfdmFsWzBdICYgMHgxRjsKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gKyAgICAgICAgICAgICBpZiAocmVhZF92YWxbMF0gPiAxNikgewo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgRFJNX0RFQlVHX0tNUygiSW52 YWxpZAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBEUF9FRFBfUFdOR0VOX0JJVF9DT1VOVCAweCVY LCBleHBlY3RlZCBhdCBtb3N0IDE2XG4iLAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF92YWwKPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gWzBdKQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiA7Cj4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gKyAgICAgICAgICAgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAg ICAgICAgICAgbGV2ZWwgPj49IDE2IC0gcmVhZF92YWxbMF07Cj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+ICsgICAgIH0KPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiAgICAgICByZXR1cm4gbGV2ZWw7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICB9Cj4gPiA+ ID4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBAQCAtMTA2LDYgKzEy MywyMyBAQCBpbnRlbF9kcF9hdXhfc2V0X2JhY2tsaWdodChjb25zdAo+ID4gPiA+ID4gPiA+ID4g PiA+ID4gPiBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAqY29ubl9zdGF0ZSwgdTMyIGxldgo+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICBzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkx NSA9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IGRwX3RvX2k5MTUoaW50ZWxfZHApOwo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiAgICAgICB1OCB2YWxzWzJdID0geyAweDAgfTsKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgIGlmIChpOTE1LT5xdWly a3MgJgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBRVUlSS19TSElGVF9FRFBfQkFDS0xJR0hUX0JS SUdIVE5FU1MpIHsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICBpZiAoIWRy bV9kcF9kcGNkX3JlYWRiKCZpbnRlbF9kcC0+YXV4LAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBE UF9FRFBfUFdNR0VOX0JJVF9DT1VOVCwKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxzWzBdCj4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ICkpIHsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAg ICAgICAgIERSTV9ERUJVR19LTVMoIkZhaWxlZCB0byB3cml0ZQo+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiBhdXgKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gYmFja2xpZ2h0IGxldmVsOiBGYWlsZWQg dG8gcmVhZCBEUENEIHJlZ2lzdGVyIDB4JXhcbiIsCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUF9FRFBfUFdNR0VOXwo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiBCSVRfCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IENPVU5UKTsK PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKPiA+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+ICsgICAgICAgICAgICAgLy8gT25seSBiaXRzIDQ6MCBhcmUgdXNlZCwgNzo1IGFyZQo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiByZXNlcnZlZC4KPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAg ICAgICAgICAgICB2YWxzWzBdID0gdmFsc1swXSAmIDB4MUY7Cj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+ICsgICAgICAgICAgICAgaWYgKHZhbHNbMF0gPiAxNikgewo+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiArICAgICAgICAgICAgICAgICAgICAgRFJNX0RFQlVHX0tNUygiRmFpbGVkIHRvIHdyaXRl Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IGF1eAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiBiYWNr bGlnaHQgbGV2ZWw6IEludmFsaWQgRFBfRURQX1BXTkdFTl9CSVRfQ09VTlQgMHglWCwKPiA+ID4g PiA+ID4gPiA+ID4gPiA+ID4gZXhwZWN0ZWQgYXQgbW9zdCAxNlxuIiwKPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZh bHNbMF0pCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IDsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4g KyAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAg ICAgICAgICAgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgbGV2ZWwg PDw9ICgxNiAtIHZhbHNbMF0pICYgMHhGRkZGOwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArICAg ICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICAg ICAgdmFsc1swXSA9IGxldmVsOwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4g PiA+ID4gPiA+ID4gICAgICAgLyogV3JpdGUgdGhlIE1TQiBhbmQvb3IgTFNCICovCj4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+IGRpZmYgLS1naXQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9kaXNwbGF5L2ludGVsX3F1aXJrcy5jCj4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZGlzcGxheS9pbnRlbF9xdWlya3MuYwo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiBpbmRleCA0NmJlYjE1NWQ4MzVmLi42M2IyN2Q0OWIyODY0IDEw MDY0NAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9k aXNwbGF5L2ludGVsX3F1aXJrcy5jCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsrKyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2Rpc3BsYXkvaW50ZWxfcXVpcmtzLmMKPiA+ID4gPiA+ID4gPiA+ID4g PiA+ID4gQEAgLTUzLDYgKzUzLDE2IEBAIHN0YXRpYyB2b2lkCj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+IHF1aXJrX2luY3JlYXNlX2RkaV9kaXNhYmxlZF90aW1lKHN0cnVjdAo+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gPiBkcm1faTkxNV9wcml2YXRlCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICppOTE1 KQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICBkcm1faW5mbygmaTkxNS0+ZHJtLCAiQXBw bHlpbmcgSW5jcmVhc2UgRERJCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IERpc2FibGVkCj4gPiA+ ID4gPiA+ID4gPiA+ID4gPiA+IHF1aXJrXG4iKTsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gIH0K PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsvKgo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiArICogU29tZSBlRFAgYmFja2xpZ2h0IGhhcmR3YXJlIHVzZXMg dGhlIG1vc3QtCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IHNpZ25pZmljYW50Cj4gPiA+ID4gPiA+ ID4gPiA+ID4gPiA+IGJpdHMgb2YgdGhlIGJyaWdodG5lc3MKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gKyAqIHJlZ2lzdGVyLCBzbyBicmlnaHRuZXNzIHZhbHVlcyBtdXN0IGJlIHNoaWZ0ZWQKPiA+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gZmlyc3QuCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsgKi8K PiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gK3N0YXRpYyB2b2lkCj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+IHF1aXJrX3NoaWZ0X2VkcF9iYWNrbGlnaHRfYnJpZ2h0bmVzcyhzdHJ1Y3QKPiA+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKPiA+ID4gPiA+ID4gPiA+ID4g PiA+ID4gK3sKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgaTkxNS0+cXVpcmtzIHw9Cj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+IFFVSVJLX1NISUZUX0VEUF9CQUNLTElHSFRfQlJJR0hUTkVT UzsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgRFJNX0lORk8oIkFwcGx5aW5nIHNoaWZ0 IGVEUCBiYWNrbGlnaHQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gYnJpZ2h0bmVzcwo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiBxdWlya1xuIik7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICt9Cj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gIHN0cnVjdCBp bnRlbF9xdWlyayB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgIGludCBkZXZpY2U7Cj4g PiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgIGludCBzdWJzeXN0ZW1fdmVuZG9yOwo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gPiBAQCAtMTU2LDYgKzE2Niw5IEBAIHN0YXRpYyBzdHJ1Y3QgaW50ZWxf cXVpcmsKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gaW50ZWxfcXVpcmtzW10gPSB7Cj4gPiA+ID4g PiA+ID4gPiA+ID4gPiA+ICAgICAgIC8qIEFTUm9jayBJVFgqLwo+ID4gPiA+ID4gPiA+ID4gPiA+ ID4gPiAgICAgICB7IDB4MzE4NSwgMHgxODQ5LCAweDIyMTIsCj4gPiA+ID4gPiA+ID4gPiA+ID4g PiA+IHF1aXJrX2luY3JlYXNlX2RkaV9kaXNhYmxlZF90aW1lIH0sCj4gPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ICAgICAgIHsgMHgzMTg0LCAweDE4NDksIDB4MjIxMiwKPiA+ID4gPiA+ID4gPiA+ID4g PiA+ID4gcXVpcmtfaW5jcmVhc2VfZGRpX2Rpc2FibGVkX3RpbWUgfSwKPiA+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAvKiBHb29nbGUgUGl4ZWxi b29rICovCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgIHsgMHg1OTFFLCAweDgwODYsIDB4 MjIxMiwKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gcXVpcmtfc2hpZnRfZWRwX2JhY2tsaWdodF9i cmlnaHRuZXNzIH0sCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICB9Owo+ID4gPiA+ID4gPiA+ID4g PiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gIHZvaWQgaW50ZWxfaW5pdF9xdWlya3Mo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCj4gPiA+ID4gPiA+ID4g PiA+ID4gPiA+IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAo+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gPiBpbmRleCBlNGY3ZjY1MTg5NDViLi5jYzkzYmVkZTRmYWI4IDEwMDY0NAo+ID4g PiA+ID4gPiA+ID4gPiA+ID4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5o Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf ZHJ2LmgKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gQEAgLTUyNSw2ICs1MjUsNyBAQCBzdHJ1Y3Qg aTkxNV9wc3Igewo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgI2RlZmluZSBRVUlSS19QSU5fU1dJ WlpMRURfUEFHRVMgKDE8PDUpCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAjZGVmaW5lIFFVSVJL X0lOQ1JFQVNFX1QxMl9ERUxBWSAoMTw8NikKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICNkZWZp bmUgUVVJUktfSU5DUkVBU0VfRERJX0RJU0FCTEVEX1RJTUUgKDE8PDcpCj4gPiA+ID4gPiA+ID4g PiA+ID4gPiA+ICsjZGVmaW5lIFFVSVJLX1NISUZUX0VEUF9CQUNLTElHSFRfQlJJR0hUTkVTUyAo MTw8OCkKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICBz dHJ1Y3QgaW50ZWxfZmJkZXY7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICBzdHJ1Y3QgaW50ZWxf ZmJjX3dvcms7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IC0t Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiBKYW5pIE5pa3VsYSwgSW50ZWwgT3BlbiBTb3VyY2UgR3Jh cGhpY3MgQ2VudGVyCj4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+IC0tCj4gPiA+ID4g PiA+ID4gPiBWaWxsZSBTeXJqw6Rsw6QKPiA+ID4gPiA+ID4gPiA+IEludGVsCj4gPiA+ID4gPiA+ ID4gPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+ID4g PiA+ID4gPiA+ID4gSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdAo+ID4gPiA+ID4gPiA+ID4gSW50ZWwt Z2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+ID4gPiA+ID4gPiA+ID4gaHR0cHM6Ly9saXN0cy5m cmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngKPiA+ID4gPiA+ID4gPiAK PiA+ID4gPiA+ID4gPiAtLQo+ID4gPiA+ID4gPiA+IFZpbGxlIFN5cmrDpGzDpAo+ID4gPiA+ID4g PiA+IEludGVsCj4gPiAtLQo+ID4gQ2hlZXJzLAo+ID4gICAgICAgICBMeXVkZSBQYXVsIChzaGUv aGVyKQo+ID4gICAgICAgICBTb2Z0d2FyZSBFbmdpbmVlciBhdCBSZWQgSGF0Cj4gPiAKLS0gCkNo ZWVycywKCUx5dWRlIFBhdWwgKHNoZS9oZXIpCglTb2Z0d2FyZSBFbmdpbmVlciBhdCBSZWQgSGF0 CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1n ZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK