From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756769AbcAYNpA (ORCPT ); Mon, 25 Jan 2016 08:45:00 -0500 Received: from mail-wm0-f48.google.com ([74.125.82.48]:35552 "EHLO mail-wm0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755405AbcAYNo5 (ORCPT ); Mon, 25 Jan 2016 08:44:57 -0500 Subject: Re: linux-4.4 bisected: kwin5 stuck on kde5 loading screen with radeon To: =?UTF-8?B?VmlsbGUgU3lyasOkbMOk?= References: <56A06D2E.4000008@gmail.com> <56A07CF9.5060506@daenzer.net> <56A07D97.6030606@daenzer.net> <20160121075849.GH19130@phenom.ffwll.local> <56A0989E.30006@daenzer.net> <20160121100905.GL19130@phenom.ffwll.local> <56A19C98.8020208@daenzer.net> <20160122151835.GM23290@intel.com> <56A5A171.7000205@daenzer.net> <56A6203D.3030803@gmail.com> <20160125132310.GS23290@intel.com> Cc: =?UTF-8?Q?Michel_D=c3=a4nzer?= , Alex Deucher , Vlastimil Babka , LKML , dri-devel@lists.freedesktop.org, =?UTF-8?Q?Christian_K=c3=b6nig?= From: Mario Kleiner Message-ID: <56A626D5.2040808@gmail.com> Date: Mon, 25 Jan 2016 14:44:53 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 In-Reply-To: <20160125132310.GS23290@intel.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 01/25/2016 02:23 PM, Ville Syrjälä wrote: > On Mon, Jan 25, 2016 at 02:16:45PM +0100, Mario Kleiner wrote: >> >> >> On 01/25/2016 05:15 AM, Michel Dänzer wrote: >>> On 23.01.2016 00:18, Ville Syrjälä wrote: >>>> On Fri, Jan 22, 2016 at 12:06:00PM +0900, Michel Dänzer wrote: >>>>> >>>>> [ Trimming KDE folks from Cc ] >>>>> >>>>> On 21.01.2016 19:09, Daniel Vetter wrote: >>>>>> On Thu, Jan 21, 2016 at 05:36:46PM +0900, Michel Dänzer wrote: >>>>>>> On 21.01.2016 16:58, Daniel Vetter wrote: >>>>>>>> >>>>>>>> Can you please point me at the vblank on/off jump bug please? >>>>>>> >>>>>>> AFAIR I originally reported it in response to >>>>>>> http://lists.freedesktop.org/archives/dri-devel/2015-August/087841.html >>>>>>> , but I can't find that in the archives, so maybe that was just on IRC. >>>>>>> See >>>>>>> http://lists.freedesktop.org/archives/dri-devel/2016-January/099122.html >>>>>>> . Basically, I ran into the bug fixed by your patch because the counter >>>>>>> jumped forward on every DPMS off, so it hit the 32-bit boundary after >>>>>>> just a few days. >>>>>> >>>>>> Ok, so just uncovered the overflow bug. >>>>> >>>>> Not sure what you mean by "just", but to be clear: The drm_vblank_on/off >>>>> counter jumping bug (similar to the bug this thread is about), which >>>>> exposed the overflow bug, is still alive and kicking in 4.5. It seems >>>>> to happen when turning off the CRTC: >>>>> >>>>> [drm:drm_update_vblank_count] updating vblank count on crtc 0: current=218104694, diff=0, hw=916 hw_last=916 >>>>> [drm:radeon_get_vblank_counter_kms] crtc 0: dist from vblank start 3 >>>>> [drm:drm_calc_vbltimestamp_from_scanoutpos] crtc 0 : v 0x7 p(2199,-45)@ 7304.307354 -> 7304.308006 [e 0 us, 0 rep] >>>>> [drm:radeon_get_vblank_counter_kms] crtc 0: dist from vblank start 3 >>>>> [drm:drm_update_vblank_count] updating vblank count on crtc 0: current=218104694, diff=16776301, hw=1 hw_last=916 >>>> >>>> Not sure what bug we're talking about here, but here the hw counter >>>> clearly jumps backwards. >>>> >>>>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 3 >>>>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 3 >>>>> [drm:drm_update_vblank_count] updating vblank count on crtc 1: current=0, diff=0, hw=0 hw_last=0 >>>>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 3 >>>>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 3 >>>>> [drm:drm_update_vblank_count] updating vblank count on crtc 2: current=0, diff=0, hw=0 hw_last=0 >>>>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 3 >>>>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 3 >>>>> [drm:drm_update_vblank_count] updating vblank count on crtc 3: current=0, diff=0, hw=0 hw_last=0 >>>>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 1 >>>>> [drm:drm_calc_vbltimestamp_from_scanoutpos] crtc 0 : v 0x1 p(0,0)@ 7304.317140 -> 7304.317140 [e 0 us, 0 rep] >>>>> [drm:radeon_get_vblank_counter_kms] Query failed! stat 1 >>>>> [drm:drm_update_vblank_count] updating vblank count on crtc 0: current=234880995, diff=16777215, hw=0 hw_last=1 >>>> >>>> Same here. >>> >>> At least one of the jumps is expected, because this is around turning >>> off the CRTC for DPMS off. Don't know yet why there are two jumps back >>> though. >>> >>> >>>> These things just don't happen on i915 because drm_vblank_off() and >>>> drm_vblank_on() are always called around the times when the hw counter >>>> might get reset. Or at least that's how it should be. >>> >>> Which is of course the idea of Daniel's patch (which is what I'm getting >>> the above with) or Mario's patch as well, but clearly something's still >>> wrong. It's certainly possible that it's something in the driver, but >>> since calling drm_vblank_pre/post_modeset from the same places seems to >>> work fine (ignoring the regression discussed in this thread)... Do >>> drm_vblank_on/off require something else to handle this correctly? >>> >>> >> >> I suspect it is because vblank_disable_and_save calls >> drm_update_vblank_count() unconditionally, even if vblank irqs are >> already off. >> >> So on a manual display disable -> reenable you get something like >> >> At disable: >> >> Call to dpms-off --> atombios_crtc_dpms(DPMS_OFF) --> drm_vblank_off -> >> vblank_disable_and_save -> irqs off, drm_update_vblank_count() computes >> final count. >> >> Then the crtc is shut down and its hw counter resets to zero. >> >> At reenable: >> >> Modesetting -> drm_crtc_helper_set_mode -> crtc_funcs->prepare(crtc) -> >> atombios_crtc_prepare() -> atombios_crtc_dpms(DPMS_OFF) -> >> drm_vblank_off -> vblank_disable_and_save -> A pointless >> drm_update_vblank_count() while the hw counter is already reset to zero >> --> Unwanted counter jump. >> >> >> The problem doesn't happen on a pure modeset to a different video >> resolution/refresh rate, as then we only have one call into >> atombios_crtc_dpms(DPMS_OFF). >> >> I think the fix is to fix vblank_disable_and_save() to only call >> drm_update_vblank_count() if vblank irqs get actually disabled, not on >> no-op calls. I will try that now. > > It does that on purpose. Otherwise the vblank counter would appear to > have stalled while the interrupt was off. > Ok, that's what the comments there say, although i don't see atm. why that perceived stall would be a big problem. I checked all callers of vblank_disable_and_save(). They are all careful to not call that function if vblanks are already disabled. The only exception is drm_vblank_off(). If drm_vblank_off/on is supposed to protect kms drivers which have resetting hw counters or other problematic behaviour during modesets etc. then this will break. E.g., calling the vblank timestamping stuff is also not safe/well-defined during modesets when the timestamping constants are not (yet) updated to reflect the new mode timing of the modeset in progress. -mario >> >> Otherwise kms drivers would have to be careful to never call >> drm_vblank_off multiple times before calling drm_vblank_on, but the help >> text to drm_vblank_on() claims that unbalanced calls to these functions >> are perfectly fine. >> >> -mario >> >> >> >> >> >> >> > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mario Kleiner Subject: Re: linux-4.4 bisected: kwin5 stuck on kde5 loading screen with radeon Date: Mon, 25 Jan 2016 14:44:53 +0100 Message-ID: <56A626D5.2040808@gmail.com> References: <56A06D2E.4000008@gmail.com> <56A07CF9.5060506@daenzer.net> <56A07D97.6030606@daenzer.net> <20160121075849.GH19130@phenom.ffwll.local> <56A0989E.30006@daenzer.net> <20160121100905.GL19130@phenom.ffwll.local> <56A19C98.8020208@daenzer.net> <20160122151835.GM23290@intel.com> <56A5A171.7000205@daenzer.net> <56A6203D.3030803@gmail.com> <20160125132310.GS23290@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-f48.google.com (mail-wm0-f48.google.com [74.125.82.48]) by gabe.freedesktop.org (Postfix) with ESMTPS id 65D2B6E12F for ; Mon, 25 Jan 2016 05:44:57 -0800 (PST) Received: by mail-wm0-f48.google.com with SMTP id n5so80538893wmn.0 for ; Mon, 25 Jan 2016 05:44:57 -0800 (PST) In-Reply-To: <20160125132310.GS23290@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: =?UTF-8?B?VmlsbGUgU3lyasOkbMOk?= Cc: =?UTF-8?Q?Michel_D=c3=a4nzer?= , LKML , dri-devel@lists.freedesktop.org, Alex Deucher , =?UTF-8?Q?Christian_K=c3=b6nig?= , Vlastimil Babka List-Id: dri-devel@lists.freedesktop.org CgpPbiAwMS8yNS8yMDE2IDAyOjIzIFBNLCBWaWxsZSBTeXJqw6Rsw6Qgd3JvdGU6Cj4gT24gTW9u LCBKYW4gMjUsIDIwMTYgYXQgMDI6MTY6NDVQTSArMDEwMCwgTWFyaW8gS2xlaW5lciB3cm90ZToK Pj4KPj4KPj4gT24gMDEvMjUvMjAxNiAwNToxNSBBTSwgTWljaGVsIETDpG56ZXIgd3JvdGU6Cj4+ PiBPbiAyMy4wMS4yMDE2IDAwOjE4LCBWaWxsZSBTeXJqw6Rsw6Qgd3JvdGU6Cj4+Pj4gT24gRnJp LCBKYW4gMjIsIDIwMTYgYXQgMTI6MDY6MDBQTSArMDkwMCwgTWljaGVsIETDpG56ZXIgd3JvdGU6 Cj4+Pj4+Cj4+Pj4+IFsgVHJpbW1pbmcgS0RFIGZvbGtzIGZyb20gQ2MgXQo+Pj4+Pgo+Pj4+PiBP biAyMS4wMS4yMDE2IDE5OjA5LCBEYW5pZWwgVmV0dGVyIHdyb3RlOgo+Pj4+Pj4gT24gVGh1LCBK YW4gMjEsIDIwMTYgYXQgMDU6MzY6NDZQTSArMDkwMCwgTWljaGVsIETDpG56ZXIgd3JvdGU6Cj4+ Pj4+Pj4gT24gMjEuMDEuMjAxNiAxNjo1OCwgRGFuaWVsIFZldHRlciB3cm90ZToKPj4+Pj4+Pj4K Pj4+Pj4+Pj4gQ2FuIHlvdSBwbGVhc2UgcG9pbnQgbWUgYXQgdGhlIHZibGFuayBvbi9vZmYganVt cCBidWcgcGxlYXNlPwo+Pj4+Pj4+Cj4+Pj4+Pj4gQUZBSVIgSSBvcmlnaW5hbGx5IHJlcG9ydGVk IGl0IGluIHJlc3BvbnNlIHRvCj4+Pj4+Pj4gaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9h cmNoaXZlcy9kcmktZGV2ZWwvMjAxNS1BdWd1c3QvMDg3ODQxLmh0bWwKPj4+Pj4+PiAsIGJ1dCBJ IGNhbid0IGZpbmQgdGhhdCBpbiB0aGUgYXJjaGl2ZXMsIHNvIG1heWJlIHRoYXQgd2FzIGp1c3Qg b24gSVJDLgo+Pj4+Pj4+IFNlZQo+Pj4+Pj4+IGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcv YXJjaGl2ZXMvZHJpLWRldmVsLzIwMTYtSmFudWFyeS8wOTkxMjIuaHRtbAo+Pj4+Pj4+IC4gQmFz aWNhbGx5LCBJIHJhbiBpbnRvIHRoZSBidWcgZml4ZWQgYnkgeW91ciBwYXRjaCBiZWNhdXNlIHRo ZSBjb3VudGVyCj4+Pj4+Pj4ganVtcGVkIGZvcndhcmQgb24gZXZlcnkgRFBNUyBvZmYsIHNvIGl0 IGhpdCB0aGUgMzItYml0IGJvdW5kYXJ5IGFmdGVyCj4+Pj4+Pj4ganVzdCBhIGZldyBkYXlzLgo+ Pj4+Pj4KPj4+Pj4+IE9rLCBzbyBqdXN0IHVuY292ZXJlZCB0aGUgb3ZlcmZsb3cgYnVnLgo+Pj4+ Pgo+Pj4+PiBOb3Qgc3VyZSB3aGF0IHlvdSBtZWFuIGJ5ICJqdXN0IiwgYnV0IHRvIGJlIGNsZWFy OiBUaGUgZHJtX3ZibGFua19vbi9vZmYKPj4+Pj4gY291bnRlciBqdW1waW5nIGJ1ZyAoc2ltaWxh ciB0byB0aGUgYnVnIHRoaXMgdGhyZWFkIGlzIGFib3V0KSwgd2hpY2gKPj4+Pj4gZXhwb3NlZCB0 aGUgb3ZlcmZsb3cgYnVnLCBpcyBzdGlsbCBhbGl2ZSBhbmQga2lja2luZyBpbiA0LjUuIEl0IHNl ZW1zCj4+Pj4+IHRvIGhhcHBlbiB3aGVuIHR1cm5pbmcgb2ZmIHRoZSBDUlRDOgo+Pj4+Pgo+Pj4+ PiBbZHJtOmRybV91cGRhdGVfdmJsYW5rX2NvdW50XSB1cGRhdGluZyB2YmxhbmsgY291bnQgb24g Y3J0YyAwOiBjdXJyZW50PTIxODEwNDY5NCwgZGlmZj0wLCBodz05MTYgaHdfbGFzdD05MTYKPj4+ Pj4gW2RybTpyYWRlb25fZ2V0X3ZibGFua19jb3VudGVyX2ttc10gY3J0YyAwOiBkaXN0IGZyb20g dmJsYW5rIHN0YXJ0IDMKPj4+Pj4gW2RybTpkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fu b3V0cG9zXSBjcnRjIDAgOiB2IDB4NyBwKDIxOTksLTQ1KUAgNzMwNC4zMDczNTQgLT4gNzMwNC4z MDgwMDYgW2UgMCB1cywgMCByZXBdCj4+Pj4+IFtkcm06cmFkZW9uX2dldF92YmxhbmtfY291bnRl cl9rbXNdIGNydGMgMDogZGlzdCBmcm9tIHZibGFuayBzdGFydCAzCj4+Pj4+IFtkcm06ZHJtX3Vw ZGF0ZV92YmxhbmtfY291bnRdIHVwZGF0aW5nIHZibGFuayBjb3VudCBvbiBjcnRjIDA6IGN1cnJl bnQ9MjE4MTA0Njk0LCBkaWZmPTE2Nzc2MzAxLCBodz0xIGh3X2xhc3Q9OTE2Cj4+Pj4KPj4+PiBO b3Qgc3VyZSB3aGF0IGJ1ZyB3ZSdyZSB0YWxraW5nIGFib3V0IGhlcmUsIGJ1dCBoZXJlIHRoZSBo dyBjb3VudGVyCj4+Pj4gY2xlYXJseSBqdW1wcyBiYWNrd2FyZHMuCj4+Pj4KPj4+Pj4gW2RybTpy YWRlb25fZ2V0X3ZibGFua19jb3VudGVyX2ttc10gUXVlcnkgZmFpbGVkISBzdGF0IDMKPj4+Pj4g W2RybTpyYWRlb25fZ2V0X3ZibGFua19jb3VudGVyX2ttc10gUXVlcnkgZmFpbGVkISBzdGF0IDMK Pj4+Pj4gW2RybTpkcm1fdXBkYXRlX3ZibGFua19jb3VudF0gdXBkYXRpbmcgdmJsYW5rIGNvdW50 IG9uIGNydGMgMTogY3VycmVudD0wLCBkaWZmPTAsIGh3PTAgaHdfbGFzdD0wCj4+Pj4+IFtkcm06 cmFkZW9uX2dldF92YmxhbmtfY291bnRlcl9rbXNdIFF1ZXJ5IGZhaWxlZCEgc3RhdCAzCj4+Pj4+ IFtkcm06cmFkZW9uX2dldF92YmxhbmtfY291bnRlcl9rbXNdIFF1ZXJ5IGZhaWxlZCEgc3RhdCAz Cj4+Pj4+IFtkcm06ZHJtX3VwZGF0ZV92YmxhbmtfY291bnRdIHVwZGF0aW5nIHZibGFuayBjb3Vu dCBvbiBjcnRjIDI6IGN1cnJlbnQ9MCwgZGlmZj0wLCBodz0wIGh3X2xhc3Q9MAo+Pj4+PiBbZHJt OnJhZGVvbl9nZXRfdmJsYW5rX2NvdW50ZXJfa21zXSBRdWVyeSBmYWlsZWQhIHN0YXQgMwo+Pj4+ PiBbZHJtOnJhZGVvbl9nZXRfdmJsYW5rX2NvdW50ZXJfa21zXSBRdWVyeSBmYWlsZWQhIHN0YXQg Mwo+Pj4+PiBbZHJtOmRybV91cGRhdGVfdmJsYW5rX2NvdW50XSB1cGRhdGluZyB2YmxhbmsgY291 bnQgb24gY3J0YyAzOiBjdXJyZW50PTAsIGRpZmY9MCwgaHc9MCBod19sYXN0PTAKPj4+Pj4gW2Ry bTpyYWRlb25fZ2V0X3ZibGFua19jb3VudGVyX2ttc10gUXVlcnkgZmFpbGVkISBzdGF0IDEKPj4+ Pj4gW2RybTpkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fub3V0cG9zXSBjcnRjIDAgOiB2 IDB4MSBwKDAsMClAIDczMDQuMzE3MTQwIC0+IDczMDQuMzE3MTQwIFtlIDAgdXMsIDAgcmVwXQo+ Pj4+PiBbZHJtOnJhZGVvbl9nZXRfdmJsYW5rX2NvdW50ZXJfa21zXSBRdWVyeSBmYWlsZWQhIHN0 YXQgMQo+Pj4+PiBbZHJtOmRybV91cGRhdGVfdmJsYW5rX2NvdW50XSB1cGRhdGluZyB2Ymxhbmsg Y291bnQgb24gY3J0YyAwOiBjdXJyZW50PTIzNDg4MDk5NSwgZGlmZj0xNjc3NzIxNSwgaHc9MCBo d19sYXN0PTEKPj4+Pgo+Pj4+IFNhbWUgaGVyZS4KPj4+Cj4+PiBBdCBsZWFzdCBvbmUgb2YgdGhl IGp1bXBzIGlzIGV4cGVjdGVkLCBiZWNhdXNlIHRoaXMgaXMgYXJvdW5kIHR1cm5pbmcKPj4+IG9m ZiB0aGUgQ1JUQyBmb3IgRFBNUyBvZmYuIERvbid0IGtub3cgeWV0IHdoeSB0aGVyZSBhcmUgdHdv IGp1bXBzIGJhY2sKPj4+IHRob3VnaC4KPj4+Cj4+Pgo+Pj4+IFRoZXNlIHRoaW5ncyBqdXN0IGRv bid0IGhhcHBlbiBvbiBpOTE1IGJlY2F1c2UgZHJtX3ZibGFua19vZmYoKSBhbmQKPj4+PiBkcm1f dmJsYW5rX29uKCkgYXJlIGFsd2F5cyBjYWxsZWQgYXJvdW5kIHRoZSB0aW1lcyB3aGVuIHRoZSBo dyBjb3VudGVyCj4+Pj4gbWlnaHQgZ2V0IHJlc2V0LiBPciBhdCBsZWFzdCB0aGF0J3MgaG93IGl0 IHNob3VsZCBiZS4KPj4+Cj4+PiBXaGljaCBpcyBvZiBjb3Vyc2UgdGhlIGlkZWEgb2YgRGFuaWVs J3MgcGF0Y2ggKHdoaWNoIGlzIHdoYXQgSSdtIGdldHRpbmcKPj4+IHRoZSBhYm92ZSB3aXRoKSBv ciBNYXJpbydzIHBhdGNoIGFzIHdlbGwsIGJ1dCBjbGVhcmx5IHNvbWV0aGluZydzIHN0aWxsCj4+ PiB3cm9uZy4gSXQncyBjZXJ0YWlubHkgcG9zc2libGUgdGhhdCBpdCdzIHNvbWV0aGluZyBpbiB0 aGUgZHJpdmVyLCBidXQKPj4+IHNpbmNlIGNhbGxpbmcgZHJtX3ZibGFua19wcmUvcG9zdF9tb2Rl c2V0IGZyb20gdGhlIHNhbWUgcGxhY2VzIHNlZW1zIHRvCj4+PiB3b3JrIGZpbmUgKGlnbm9yaW5n IHRoZSByZWdyZXNzaW9uIGRpc2N1c3NlZCBpbiB0aGlzIHRocmVhZCkuLi4gRG8KPj4+IGRybV92 Ymxhbmtfb24vb2ZmIHJlcXVpcmUgc29tZXRoaW5nIGVsc2UgdG8gaGFuZGxlIHRoaXMgY29ycmVj dGx5Pwo+Pj4KPj4+Cj4+Cj4+IEkgc3VzcGVjdCBpdCBpcyBiZWNhdXNlIHZibGFua19kaXNhYmxl X2FuZF9zYXZlIGNhbGxzCj4+IGRybV91cGRhdGVfdmJsYW5rX2NvdW50KCkgdW5jb25kaXRpb25h bGx5LCBldmVuIGlmIHZibGFuayBpcnFzIGFyZQo+PiBhbHJlYWR5IG9mZi4KPj4KPj4gU28gb24g YSBtYW51YWwgZGlzcGxheSBkaXNhYmxlIC0+IHJlZW5hYmxlIHlvdSBnZXQgc29tZXRoaW5nIGxp a2UKPj4KPj4gQXQgZGlzYWJsZToKPj4KPj4gQ2FsbCB0byBkcG1zLW9mZiAtLT4gYXRvbWJpb3Nf Y3J0Y19kcG1zKERQTVNfT0ZGKSAtLT4gZHJtX3ZibGFua19vZmYgLT4KPj4gdmJsYW5rX2Rpc2Fi bGVfYW5kX3NhdmUgLT4gaXJxcyBvZmYsIGRybV91cGRhdGVfdmJsYW5rX2NvdW50KCkgY29tcHV0 ZXMKPj4gZmluYWwgY291bnQuCj4+Cj4+IFRoZW4gdGhlIGNydGMgaXMgc2h1dCBkb3duIGFuZCBp dHMgaHcgY291bnRlciByZXNldHMgdG8gemVyby4KPj4KPj4gQXQgcmVlbmFibGU6Cj4+Cj4+IE1v ZGVzZXR0aW5nIC0+IGRybV9jcnRjX2hlbHBlcl9zZXRfbW9kZSAtPiBjcnRjX2Z1bmNzLT5wcmVw YXJlKGNydGMpIC0+Cj4+IGF0b21iaW9zX2NydGNfcHJlcGFyZSgpIC0+IGF0b21iaW9zX2NydGNf ZHBtcyhEUE1TX09GRikgLT4KPj4gZHJtX3ZibGFua19vZmYgLT4gdmJsYW5rX2Rpc2FibGVfYW5k X3NhdmUgLT4gQSBwb2ludGxlc3MKPj4gZHJtX3VwZGF0ZV92YmxhbmtfY291bnQoKSB3aGlsZSB0 aGUgaHcgY291bnRlciBpcyBhbHJlYWR5IHJlc2V0IHRvIHplcm8KPj4gLS0+IFVud2FudGVkIGNv dW50ZXIganVtcC4KPj4KPj4KPj4gVGhlIHByb2JsZW0gZG9lc24ndCBoYXBwZW4gb24gYSBwdXJl IG1vZGVzZXQgdG8gYSBkaWZmZXJlbnQgdmlkZW8KPj4gcmVzb2x1dGlvbi9yZWZyZXNoIHJhdGUs IGFzIHRoZW4gd2Ugb25seSBoYXZlIG9uZSBjYWxsIGludG8KPj4gYXRvbWJpb3NfY3J0Y19kcG1z KERQTVNfT0ZGKS4KPj4KPj4gSSB0aGluayB0aGUgZml4IGlzIHRvIGZpeCB2YmxhbmtfZGlzYWJs ZV9hbmRfc2F2ZSgpIHRvIG9ubHkgY2FsbAo+PiBkcm1fdXBkYXRlX3ZibGFua19jb3VudCgpIGlm IHZibGFuayBpcnFzIGdldCBhY3R1YWxseSBkaXNhYmxlZCwgbm90IG9uCj4+IG5vLW9wIGNhbGxz LiBJIHdpbGwgdHJ5IHRoYXQgbm93Lgo+Cj4gSXQgZG9lcyB0aGF0IG9uIHB1cnBvc2UuIE90aGVy d2lzZSB0aGUgdmJsYW5rIGNvdW50ZXIgd291bGQgYXBwZWFyIHRvCj4gaGF2ZSBzdGFsbGVkIHdo aWxlIHRoZSBpbnRlcnJ1cHQgd2FzIG9mZi4KPgoKT2ssIHRoYXQncyB3aGF0IHRoZSBjb21tZW50 cyB0aGVyZSBzYXksIGFsdGhvdWdoIGkgZG9uJ3Qgc2VlIGF0bS4gd2h5IAp0aGF0IHBlcmNlaXZl ZCBzdGFsbCB3b3VsZCBiZSBhIGJpZyBwcm9ibGVtLiBJIGNoZWNrZWQgYWxsIGNhbGxlcnMgb2Yg CnZibGFua19kaXNhYmxlX2FuZF9zYXZlKCkuIFRoZXkgYXJlIGFsbCBjYXJlZnVsIHRvIG5vdCBj YWxsIHRoYXQgCmZ1bmN0aW9uIGlmIHZibGFua3MgYXJlIGFscmVhZHkgZGlzYWJsZWQuIFRoZSBv bmx5IGV4Y2VwdGlvbiBpcyAKZHJtX3ZibGFua19vZmYoKS4gSWYgZHJtX3ZibGFua19vZmYvb24g aXMgc3VwcG9zZWQgdG8gcHJvdGVjdCBrbXMgCmRyaXZlcnMgd2hpY2ggaGF2ZSByZXNldHRpbmcg aHcgY291bnRlcnMgb3Igb3RoZXIgcHJvYmxlbWF0aWMgYmVoYXZpb3VyIApkdXJpbmcgbW9kZXNl dHMgZXRjLiB0aGVuIHRoaXMgd2lsbCBicmVhay4gRS5nLiwgY2FsbGluZyB0aGUgdmJsYW5rIAp0 aW1lc3RhbXBpbmcgc3R1ZmYgaXMgYWxzbyBub3Qgc2FmZS93ZWxsLWRlZmluZWQgZHVyaW5nIG1v ZGVzZXRzIHdoZW4gCnRoZSB0aW1lc3RhbXBpbmcgY29uc3RhbnRzIGFyZSBub3QgKHlldCkgdXBk YXRlZCB0byByZWZsZWN0IHRoZSBuZXcgbW9kZSAKdGltaW5nIG9mIHRoZSBtb2Rlc2V0IGluIHBy b2dyZXNzLgoKLW1hcmlvCgoKPj4KPj4gT3RoZXJ3aXNlIGttcyBkcml2ZXJzIHdvdWxkIGhhdmUg dG8gYmUgY2FyZWZ1bCB0byBuZXZlciBjYWxsCj4+IGRybV92Ymxhbmtfb2ZmIG11bHRpcGxlIHRp bWVzIGJlZm9yZSBjYWxsaW5nIGRybV92Ymxhbmtfb24sIGJ1dCB0aGUgaGVscAo+PiB0ZXh0IHRv IGRybV92Ymxhbmtfb24oKSBjbGFpbXMgdGhhdCB1bmJhbGFuY2VkIGNhbGxzIHRvIHRoZXNlIGZ1 bmN0aW9ucwo+PiBhcmUgcGVyZmVjdGx5IGZpbmUuCj4+Cj4+IC1tYXJpbwo+Pgo+Pgo+Pgo+Pgo+ Pgo+Pgo+Pgo+Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpo dHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==