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=-7.3 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,MENTIONS_GIT_HOSTING, SPF_PASS,USER_AGENT_MUTT 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 DF7E5C43381 for ; Thu, 21 Feb 2019 14:15:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 989772070B for ; Thu, 21 Feb 2019 14:15:25 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=ffwll.ch header.i=@ffwll.ch header.b="VpeHHJgU" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728121AbfBUOPY (ORCPT ); Thu, 21 Feb 2019 09:15:24 -0500 Received: from mail-ed1-f67.google.com ([209.85.208.67]:42829 "EHLO mail-ed1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725880AbfBUOPY (ORCPT ); Thu, 21 Feb 2019 09:15:24 -0500 Received: by mail-ed1-f67.google.com with SMTP id j89so13855674edb.9 for ; Thu, 21 Feb 2019 06:15:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=sender:date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=1+2akAeOBDxt2US2WUvmBIOJ4VmYS9nLVjyC6PsJqK0=; b=VpeHHJgUWR4zbM/VgObyCv1i55w4YWDcTPDX3A97BnwLLYG2+hpbKD6dn4f9hvp1of vI/rhavha42p983NF1sIUDNaqyUVhQFfnIbh2d/0MGkSCSTMKXgw7nYePCgnqzetTonj dJgXZenU5iAHRw0MCEVL9fhSfmdkd87Pqq2N8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:from:to:cc:subject:message-id :references:mime-version:content-disposition:in-reply-to:user-agent; bh=1+2akAeOBDxt2US2WUvmBIOJ4VmYS9nLVjyC6PsJqK0=; b=he/u2bQQR3thpGDz5d6d/MKNMSGZvXggGUdYPJQ8dezMghnjIlFJGcDK2eWOgq/acl mkF4dP+bhWJKvRcigi9W6EZrG+805HvUTcsTVJ3KVesnIi5CAvEbQEIvaUTqbyVmgzdZ 0BQJuMVKRUBtAOM1LSLznTl3es1aDMo0aCQIiKjjzSlW8WASV9U+2gASzwzYJQd7lUAM 3ZLDQ14HkeUTKrhQnufva0F7Yr/aYv8l7A4HRAKsySUn8qlYNvBC2i3sbjCKs6B6kOj3 3cR4y65+3pmAh0ixvp/c/vnJWXQDDOd3UbHwE2HMaaAn8MFnUhe5W9DTE0pchFJZSnue cLXA== X-Gm-Message-State: AHQUAuaEhOJwB9yF0XD5sifWa+IS7M0UkJk+t6KWj1cvKpEL09sDtSwu apv3W620YCvuQ3h2Z4tW5faRhQ== X-Google-Smtp-Source: AHgI3IbMq47utvlVU9q60g7mTSppraDVofojTEw2Fc4a2KD3ukdE2yxc3iHBdw7+GO6BLPVCa6fdKA== X-Received: by 2002:a17:906:a49:: with SMTP id x9mr27161486ejf.186.1550758521445; Thu, 21 Feb 2019 06:15:21 -0800 (PST) Received: from phenom.ffwll.local ([2a02:168:569e:0:3106:d637:d723:e855]) by smtp.gmail.com with ESMTPSA id f1sm4931475ejl.65.2019.02.21.06.15.19 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 21 Feb 2019 06:15:20 -0800 (PST) Date: Thu, 21 Feb 2019 15:15:18 +0100 From: Daniel Vetter To: Brian Starkey Cc: Laurent Pinchart , Laurent Pinchart , Liviu Dudau , Kieran Bingham , "dri-devel@lists.freedesktop.org" , nd , "linux-media@vger.kernel.org" Subject: Re: [PATCH v4 0/7] VSP1: Display writeback support Message-ID: <20190221141518.GR2665@phenom.ffwll.local> References: <20190217024852.23328-1-laurent.pinchart+renesas@ideasonboard.com> <20190218122257.o5blxfs7jo5xu7ge@DESKTOP-E1NTVVP.localdomain> <20190221082317.GB3451@pendragon.ideasonboard.com> <20190221095019.rht64aylk52jqe5r@DESKTOP-E1NTVVP.localdomain> <20190221100257.GD3451@pendragon.ideasonboard.com> <20190221121913.l7e5zlitcfpvkupi@DESKTOP-E1NTVVP.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190221121913.l7e5zlitcfpvkupi@DESKTOP-E1NTVVP.localdomain> X-Operating-System: Linux phenom 4.19.0-1-amd64 User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org On Thu, Feb 21, 2019 at 12:19:13PM +0000, Brian Starkey wrote: > Hi Laurent, > > On Thu, Feb 21, 2019 at 12:02:57PM +0200, Laurent Pinchart wrote: > > Hi Brian, > > > > On Thu, Feb 21, 2019 at 09:50:19AM +0000, Brian Starkey wrote: > > > On Thu, Feb 21, 2019 at 10:23:17AM +0200, Laurent Pinchart wrote: > > > > On Mon, Feb 18, 2019 at 12:22:58PM +0000, Brian Starkey wrote: > > > >> On Sun, Feb 17, 2019 at 04:48:45AM +0200, Laurent Pinchart wrote: > > > >>> Hello, > > > >>> > > > >>> This patch series implements display writeback support for the R-Car > > > >>> Gen3 platforms in the VSP1 driver. > > > >>> > > > >>> DRM/KMS provides a writeback API through a special type of writeback > > > >>> connectors. This series takes a different approach by exposing writeback > > > >>> as a V4L2 device. While there is nothing fundamentally wrong with > > > >>> writeback connectors, display for R-Car Gen3 platforms relies on the > > > >>> VSP1 driver behind the scene, which already implements V4L2 support. > > > >>> Enabling writeback through V4L2 is thus significantly easier in this > > > >>> case. > > > >> > > > >> How does this look to an application? (I'm entirely ignorant about > > > >> R-Car). They are interacting with the DRM device, and then need to > > > >> open and configure a v4l2 device to get the writeback? Can the process > > > >> which isn't controlling the DRM device independently capture the > > > >> screen output? > > > >> > > > >> I didn't see any major complication to implementing this as a > > > >> writeback connector. If you want/need to use the vb2_queue, couldn't > > > >> you just do that entirely from within the kernel? > > > >> > > > >> Honestly (predictably?), to me it seems like a bad idea to introduce a > > > >> second, non-compatible interface for display writeback. Any > > > >> application interested in display writeback (e.g. compositors) will > > > >> need to implement both in order to support all HW. drm_hwcomposer > > > >> already supports writeback via DRM writeback connectors. > > > >> > > > >> While I can see the advantages of having writeback exposed via v4l2 > > > >> for streaming use-cases, I think it would be better to have it done in > > > >> such a way that it works for all writeback connectors, rather than > > > >> being VSP1-specific. That would allow any application to choose > > > >> whichever method is most appropriate for their use-case, without > > > >> limiting themselves to a subset of hardware. > > > > > > > > So I gave writeback connectors a go, and it wasn't very pretty. > > > > > > Sorry you didn't have a good time :-( > > > > No worries. That was to be expected with such young code :-) > > > > > > There writeback support in the DRM core leaks jobs, > > > > > > Is this the cleanup on check fail, or something else? > > > > Yes, that's the problem. I have patches for it that I will post soon. > > > > > One possible pitfall is that you must set the job in the connector > > > state to NULL after you call drm_writeback_queue_job(). The API there > > > could easily be changed to pass in the connector_state and clear it in > > > drm_writeback_queue_job() instead of relying on drivers to do it. > > > > I also have a patch for that :-) > > > > > > and is missing support for > > > > the equivalent of .prepare_fb()/.cleanup_fb(), which requires per-job > > > > driver-specific data. I'm working on these issues and will submit > > > > patches. > > > > > > Hm, yes that didn't occur to me; we don't have a prepare_fb callback. > > > > > > > In the meantime, I need to test my implementation, so I need a command > > > > line application that will let me exercise the API. I assume you've > > > > tested your code, haven't you ? :-) Could you tell me how I can test > > > > writeback ? > > > > > > Indeed, there's igts on the list which I wrote and tested: > > > > > > https://patchwork.kernel.org/patch/10764975/ > > > > Will you get these merged ? Pushing everybody to use the writeback > > connector API without any test is mainline isn't nice, it almost makes > > me want to go back to V4L2. > > I wasn't trying to be pushy - I only shared my opinion that I didn't > think it was a good idea to introduce a second display writeback API, > when we already have one. You're entirely entitled to ignore my > opinion. > > The tests have been available since the very early versions of the > writeback series. I don't know what's blocking them from merging, I > haven't been tracking it very closely. > > If you'd be happy to provide your review and test on them, that may > help the process along? > > > > > igt test cases are nice to have, but what I need now is a tool to > > execise the API manually, similar to modetest, with command line > > parameters to configure the device, and the ability to capture frames to > > disk using writeback. How did you perform such tests when you developed > > writeback support ? > > > > I used a pre-existing internal tool which does exactly that. > > I appreciate that we don't have upstream tooling for writeback. As you > say, it's a young API (well, not by date, but certainly by usage). > > I also do appreciate you taking the time to consider it, identifying > issues which we did not, and for fixing them. The only way it stops > being a young API, with bugs and no tooling, is if people adopt it. Mentioned on irc already to Laurent, but here for completeness: igt has pretty decent support for combining that into one utility. We support piles of standard stuff like --interactive-debug already, plus you can add whatever additional things you need and feel like. There's quite a few such igt tests/tools combinations already. -Daniel > > Thanks, > -Brian > > > > And there's support in drm_hwcomposer (though I must admit I haven't > > > personally run the drm_hwc code): > > > > > > https://gitlab.freedesktop.org/drm-hwcomposer/drm-hwcomposer/merge_requests/3 > > > > That won't help me much as I don't have an android port for the R-Car > > boards. > > > > > I'm afraid I haven't really touched any of the writeback code for a > > > couple of years - Liviu picked that up. He's on holiday until Monday, > > > but he should be able to help with the status of the igts. > > > > > > Hope that helps, > > > > > > >>> The writeback pixel format is restricted to RGB, due to the VSP1 > > > >>> outputting RGB to the display and lacking a separate colour space > > > >>> conversion unit for writeback. The resolution can be freely picked by > > > >>> will result in cropping or composing, not scaling. > > > >>> > > > >>> Writeback requests are queued to the hardware on page flip (atomic > > > >>> flush), and complete at the next vblank. This means that a queued > > > >>> writeback buffer will not be processed until the next page flip, but > > > >>> once it starts being written to by the VSP, it will complete at the next > > > >>> vblank regardless of whether another page flip occurs at that time. > > > >> > > > >> This sounds the same as mali-dp, and so fits directly with the > > > >> semantics of writeback connectors. > > > >> > > > >>> The code is based on a merge of the media master branch, the drm-next > > > >>> branch and the R-Car DT next branch. For convenience patches can be > > > >>> found at > > > >>> > > > >>> git://linuxtv.org/pinchartl/media.git v4l2/vsp1/writeback > > > >>> > > > >>> Kieran Bingham (2): > > > >>> Revert "[media] v4l: vsp1: Supply frames to the DU continuously" > > > >>> media: vsp1: Provide a writeback video device > > > >>> > > > >>> Laurent Pinchart (5): > > > >>> media: vsp1: wpf: Fix partition configuration for display pipelines > > > >>> media: vsp1: Replace leftover occurrence of fragment with body > > > >>> media: vsp1: Fix addresses of display-related registers for VSP-DL > > > >>> media: vsp1: Refactor vsp1_video_complete_buffer() for later reuse > > > >>> media: vsp1: Replace the display list internal flag with a flags field > > > >>> > > > >>> drivers/media/platform/vsp1/vsp1_dl.c | 118 ++++++++++++-- > > > >>> drivers/media/platform/vsp1/vsp1_dl.h | 6 +- > > > >>> drivers/media/platform/vsp1/vsp1_drm.c | 24 ++- > > > >>> drivers/media/platform/vsp1/vsp1_drv.c | 17 +- > > > >>> drivers/media/platform/vsp1/vsp1_pipe.c | 5 + > > > >>> drivers/media/platform/vsp1/vsp1_pipe.h | 6 + > > > >>> drivers/media/platform/vsp1/vsp1_regs.h | 6 +- > > > >>> drivers/media/platform/vsp1/vsp1_rwpf.h | 2 + > > > >>> drivers/media/platform/vsp1/vsp1_video.c | 198 +++++++++++++++++++---- > > > >>> drivers/media/platform/vsp1/vsp1_video.h | 6 + > > > >>> drivers/media/platform/vsp1/vsp1_wpf.c | 65 ++++++-- > > > >>> 11 files changed, 378 insertions(+), 75 deletions(-) > > > > -- > > Regards, > > > > Laurent Pinchart > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH v4 0/7] VSP1: Display writeback support Date: Thu, 21 Feb 2019 15:15:18 +0100 Message-ID: <20190221141518.GR2665@phenom.ffwll.local> References: <20190217024852.23328-1-laurent.pinchart+renesas@ideasonboard.com> <20190218122257.o5blxfs7jo5xu7ge@DESKTOP-E1NTVVP.localdomain> <20190221082317.GB3451@pendragon.ideasonboard.com> <20190221095019.rht64aylk52jqe5r@DESKTOP-E1NTVVP.localdomain> <20190221100257.GD3451@pendragon.ideasonboard.com> <20190221121913.l7e5zlitcfpvkupi@DESKTOP-E1NTVVP.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-ed1-x543.google.com (mail-ed1-x543.google.com [IPv6:2a00:1450:4864:20::543]) by gabe.freedesktop.org (Postfix) with ESMTPS id EE5C5893D0 for ; Thu, 21 Feb 2019 14:15:22 +0000 (UTC) Received: by mail-ed1-x543.google.com with SMTP id x7so23247007eds.8 for ; Thu, 21 Feb 2019 06:15:22 -0800 (PST) Content-Disposition: inline In-Reply-To: <20190221121913.l7e5zlitcfpvkupi@DESKTOP-E1NTVVP.localdomain> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Brian Starkey Cc: Laurent Pinchart , Liviu Dudau , Kieran Bingham , "dri-devel@lists.freedesktop.org" , Laurent Pinchart , nd , "linux-media@vger.kernel.org" List-Id: dri-devel@lists.freedesktop.org T24gVGh1LCBGZWIgMjEsIDIwMTkgYXQgMTI6MTk6MTNQTSArMDAwMCwgQnJpYW4gU3RhcmtleSB3 cm90ZToKPiBIaSBMYXVyZW50LAo+IAo+IE9uIFRodSwgRmViIDIxLCAyMDE5IGF0IDEyOjAyOjU3 UE0gKzAyMDAsIExhdXJlbnQgUGluY2hhcnQgd3JvdGU6Cj4gPiBIaSBCcmlhbiwKPiA+IAo+ID4g T24gVGh1LCBGZWIgMjEsIDIwMTkgYXQgMDk6NTA6MTlBTSArMDAwMCwgQnJpYW4gU3RhcmtleSB3 cm90ZToKPiA+ID4gT24gVGh1LCBGZWIgMjEsIDIwMTkgYXQgMTA6MjM6MTdBTSArMDIwMCwgTGF1 cmVudCBQaW5jaGFydCB3cm90ZToKPiA+ID4gPiBPbiBNb24sIEZlYiAxOCwgMjAxOSBhdCAxMjoy Mjo1OFBNICswMDAwLCBCcmlhbiBTdGFya2V5IHdyb3RlOgo+ID4gPiA+PiBPbiBTdW4sIEZlYiAx NywgMjAxOSBhdCAwNDo0ODo0NUFNICswMjAwLCBMYXVyZW50IFBpbmNoYXJ0IHdyb3RlOgo+ID4g PiA+Pj4gSGVsbG8sCj4gPiA+ID4+PiAKPiA+ID4gPj4+IFRoaXMgcGF0Y2ggc2VyaWVzIGltcGxl bWVudHMgZGlzcGxheSB3cml0ZWJhY2sgc3VwcG9ydCBmb3IgdGhlIFItQ2FyCj4gPiA+ID4+PiBH ZW4zIHBsYXRmb3JtcyBpbiB0aGUgVlNQMSBkcml2ZXIuCj4gPiA+ID4+PiAKPiA+ID4gPj4+IERS TS9LTVMgcHJvdmlkZXMgYSB3cml0ZWJhY2sgQVBJIHRocm91Z2ggYSBzcGVjaWFsIHR5cGUgb2Yg d3JpdGViYWNrCj4gPiA+ID4+PiBjb25uZWN0b3JzLiBUaGlzIHNlcmllcyB0YWtlcyBhIGRpZmZl cmVudCBhcHByb2FjaCBieSBleHBvc2luZyB3cml0ZWJhY2sKPiA+ID4gPj4+IGFzIGEgVjRMMiBk ZXZpY2UuIFdoaWxlIHRoZXJlIGlzIG5vdGhpbmcgZnVuZGFtZW50YWxseSB3cm9uZyB3aXRoCj4g PiA+ID4+PiB3cml0ZWJhY2sgY29ubmVjdG9ycywgZGlzcGxheSBmb3IgUi1DYXIgR2VuMyBwbGF0 Zm9ybXMgcmVsaWVzIG9uIHRoZQo+ID4gPiA+Pj4gVlNQMSBkcml2ZXIgYmVoaW5kIHRoZSBzY2Vu ZSwgd2hpY2ggYWxyZWFkeSBpbXBsZW1lbnRzIFY0TDIgc3VwcG9ydC4KPiA+ID4gPj4+IEVuYWJs aW5nIHdyaXRlYmFjayB0aHJvdWdoIFY0TDIgaXMgdGh1cyBzaWduaWZpY2FudGx5IGVhc2llciBp biB0aGlzCj4gPiA+ID4+PiBjYXNlLgo+ID4gPiA+PiAKPiA+ID4gPj4gSG93IGRvZXMgdGhpcyBs b29rIHRvIGFuIGFwcGxpY2F0aW9uPyAoSSdtIGVudGlyZWx5IGlnbm9yYW50IGFib3V0Cj4gPiA+ ID4+IFItQ2FyKS4gVGhleSBhcmUgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgRFJNIGRldmljZSwgYW5k IHRoZW4gbmVlZCB0bwo+ID4gPiA+PiBvcGVuIGFuZCBjb25maWd1cmUgYSB2NGwyIGRldmljZSB0 byBnZXQgdGhlIHdyaXRlYmFjaz8gQ2FuIHRoZSBwcm9jZXNzCj4gPiA+ID4+IHdoaWNoIGlzbid0 IGNvbnRyb2xsaW5nIHRoZSBEUk0gZGV2aWNlIGluZGVwZW5kZW50bHkgY2FwdHVyZSB0aGUKPiA+ ID4gPj4gc2NyZWVuIG91dHB1dD8KPiA+ID4gPj4gCj4gPiA+ID4+IEkgZGlkbid0IHNlZSBhbnkg bWFqb3IgY29tcGxpY2F0aW9uIHRvIGltcGxlbWVudGluZyB0aGlzIGFzIGEKPiA+ID4gPj4gd3Jp dGViYWNrIGNvbm5lY3Rvci4gSWYgeW91IHdhbnQvbmVlZCB0byB1c2UgdGhlIHZiMl9xdWV1ZSwg Y291bGRuJ3QKPiA+ID4gPj4geW91IGp1c3QgZG8gdGhhdCBlbnRpcmVseSBmcm9tIHdpdGhpbiB0 aGUga2VybmVsPwo+ID4gPiA+PiAKPiA+ID4gPj4gSG9uZXN0bHkgKHByZWRpY3RhYmx5PyksIHRv IG1lIGl0IHNlZW1zIGxpa2UgYSBiYWQgaWRlYSB0byBpbnRyb2R1Y2UgYQo+ID4gPiA+PiBzZWNv bmQsIG5vbi1jb21wYXRpYmxlIGludGVyZmFjZSBmb3IgZGlzcGxheSB3cml0ZWJhY2suIEFueQo+ ID4gPiA+PiBhcHBsaWNhdGlvbiBpbnRlcmVzdGVkIGluIGRpc3BsYXkgd3JpdGViYWNrIChlLmcu IGNvbXBvc2l0b3JzKSB3aWxsCj4gPiA+ID4+IG5lZWQgdG8gaW1wbGVtZW50IGJvdGggaW4gb3Jk ZXIgdG8gc3VwcG9ydCBhbGwgSFcuIGRybV9od2NvbXBvc2VyCj4gPiA+ID4+IGFscmVhZHkgc3Vw cG9ydHMgd3JpdGViYWNrIHZpYSBEUk0gd3JpdGViYWNrIGNvbm5lY3RvcnMuCj4gPiA+ID4+IAo+ ID4gPiA+PiBXaGlsZSBJIGNhbiBzZWUgdGhlIGFkdmFudGFnZXMgb2YgaGF2aW5nIHdyaXRlYmFj ayBleHBvc2VkIHZpYSB2NGwyCj4gPiA+ID4+IGZvciBzdHJlYW1pbmcgdXNlLWNhc2VzLCBJIHRo aW5rIGl0IHdvdWxkIGJlIGJldHRlciB0byBoYXZlIGl0IGRvbmUgaW4KPiA+ID4gPj4gc3VjaCBh IHdheSB0aGF0IGl0IHdvcmtzIGZvciBhbGwgd3JpdGViYWNrIGNvbm5lY3RvcnMsIHJhdGhlciB0 aGFuCj4gPiA+ID4+IGJlaW5nIFZTUDEtc3BlY2lmaWMuIFRoYXQgd291bGQgYWxsb3cgYW55IGFw cGxpY2F0aW9uIHRvIGNob29zZQo+ID4gPiA+PiB3aGljaGV2ZXIgbWV0aG9kIGlzIG1vc3QgYXBw cm9wcmlhdGUgZm9yIHRoZWlyIHVzZS1jYXNlLCB3aXRob3V0Cj4gPiA+ID4+IGxpbWl0aW5nIHRo ZW1zZWx2ZXMgdG8gYSBzdWJzZXQgb2YgaGFyZHdhcmUuCj4gPiA+ID4gCj4gPiA+ID4gU28gSSBn YXZlIHdyaXRlYmFjayBjb25uZWN0b3JzIGEgZ28sIGFuZCBpdCB3YXNuJ3QgdmVyeSBwcmV0dHku Cj4gPiA+IAo+ID4gPiBTb3JyeSB5b3UgZGlkbid0IGhhdmUgYSBnb29kIHRpbWUgOi0oCj4gPiAK PiA+IE5vIHdvcnJpZXMuIFRoYXQgd2FzIHRvIGJlIGV4cGVjdGVkIHdpdGggc3VjaCB5b3VuZyBj b2RlIDotKQo+ID4gCj4gPiA+ID4gVGhlcmUgd3JpdGViYWNrIHN1cHBvcnQgaW4gdGhlIERSTSBj b3JlIGxlYWtzIGpvYnMsCj4gPiA+IAo+ID4gPiBJcyB0aGlzIHRoZSBjbGVhbnVwIG9uIGNoZWNr IGZhaWwsIG9yIHNvbWV0aGluZyBlbHNlPwo+ID4gCj4gPiBZZXMsIHRoYXQncyB0aGUgcHJvYmxl bS4gSSBoYXZlIHBhdGNoZXMgZm9yIGl0IHRoYXQgSSB3aWxsIHBvc3Qgc29vbi4KPiA+IAo+ID4g PiBPbmUgcG9zc2libGUgcGl0ZmFsbCBpcyB0aGF0IHlvdSBtdXN0IHNldCB0aGUgam9iIGluIHRo ZSBjb25uZWN0b3IKPiA+ID4gc3RhdGUgdG8gTlVMTCBhZnRlciB5b3UgY2FsbCBkcm1fd3JpdGVi YWNrX3F1ZXVlX2pvYigpLiBUaGUgQVBJIHRoZXJlCj4gPiA+IGNvdWxkIGVhc2lseSBiZSBjaGFu Z2VkIHRvIHBhc3MgaW4gdGhlIGNvbm5lY3Rvcl9zdGF0ZSBhbmQgY2xlYXIgaXQgaW4KPiA+ID4g ZHJtX3dyaXRlYmFja19xdWV1ZV9qb2IoKSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gZHJpdmVycyB0 byBkbyBpdC4KPiA+IAo+ID4gSSBhbHNvIGhhdmUgYSBwYXRjaCBmb3IgdGhhdCA6LSkKPiA+IAo+ ID4gPiA+IGFuZCBpcyBtaXNzaW5nIHN1cHBvcnQgZm9yCj4gPiA+ID4gdGhlIGVxdWl2YWxlbnQg b2YgLnByZXBhcmVfZmIoKS8uY2xlYW51cF9mYigpLCB3aGljaCByZXF1aXJlcyBwZXItam9iCj4g PiA+ID4gZHJpdmVyLXNwZWNpZmljIGRhdGEuIEknbSB3b3JraW5nIG9uIHRoZXNlIGlzc3VlcyBh bmQgd2lsbCBzdWJtaXQKPiA+ID4gPiBwYXRjaGVzLgo+ID4gPiAKPiA+ID4gSG0sIHllcyB0aGF0 IGRpZG4ndCBvY2N1ciB0byBtZTsgd2UgZG9uJ3QgaGF2ZSBhIHByZXBhcmVfZmIgY2FsbGJhY2su Cj4gPiA+IAo+ID4gPiA+IEluIHRoZSBtZWFudGltZSwgSSBuZWVkIHRvIHRlc3QgbXkgaW1wbGVt ZW50YXRpb24sIHNvIEkgbmVlZCBhIGNvbW1hbmQKPiA+ID4gPiBsaW5lIGFwcGxpY2F0aW9uIHRo YXQgd2lsbCBsZXQgbWUgZXhlcmNpc2UgdGhlIEFQSS4gSSBhc3N1bWUgeW91J3ZlCj4gPiA+ID4g dGVzdGVkIHlvdXIgY29kZSwgaGF2ZW4ndCB5b3UgPyA6LSkgQ291bGQgeW91IHRlbGwgbWUgaG93 IEkgY2FuIHRlc3QKPiA+ID4gPiB3cml0ZWJhY2sgPwo+ID4gPiAKPiA+ID4gSW5kZWVkLCB0aGVy ZSdzIGlndHMgb24gdGhlIGxpc3Qgd2hpY2ggSSB3cm90ZSBhbmQgdGVzdGVkOgo+ID4gPiAKPiA+ ID4gaHR0cHM6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy9wYXRjaC8xMDc2NDk3NS8KPiA+IAo+ID4g V2lsbCB5b3UgZ2V0IHRoZXNlIG1lcmdlZCA/IFB1c2hpbmcgZXZlcnlib2R5IHRvIHVzZSB0aGUg d3JpdGViYWNrCj4gPiBjb25uZWN0b3IgQVBJIHdpdGhvdXQgYW55IHRlc3QgaXMgbWFpbmxpbmUg aXNuJ3QgbmljZSwgaXQgYWxtb3N0IG1ha2VzCj4gPiBtZSB3YW50IHRvIGdvIGJhY2sgdG8gVjRM Mi4KPiAKPiBJIHdhc24ndCB0cnlpbmcgdG8gYmUgcHVzaHkgLSBJIG9ubHkgc2hhcmVkIG15IG9w aW5pb24gdGhhdCBJIGRpZG4ndAo+IHRoaW5rIGl0IHdhcyBhIGdvb2QgaWRlYSB0byBpbnRyb2R1 Y2UgYSBzZWNvbmQgZGlzcGxheSB3cml0ZWJhY2sgQVBJLAo+IHdoZW4gd2UgYWxyZWFkeSBoYXZl IG9uZS4gWW91J3JlIGVudGlyZWx5IGVudGl0bGVkIHRvIGlnbm9yZSBteQo+IG9waW5pb24uCj4g Cj4gVGhlIHRlc3RzIGhhdmUgYmVlbiBhdmFpbGFibGUgc2luY2UgdGhlIHZlcnkgZWFybHkgdmVy c2lvbnMgb2YgdGhlCj4gd3JpdGViYWNrIHNlcmllcy4gSSBkb24ndCBrbm93IHdoYXQncyBibG9j a2luZyB0aGVtIGZyb20gbWVyZ2luZywgSQo+IGhhdmVuJ3QgYmVlbiB0cmFja2luZyBpdCB2ZXJ5 IGNsb3NlbHkuCj4gCj4gSWYgeW91J2QgYmUgaGFwcHkgdG8gcHJvdmlkZSB5b3VyIHJldmlldyBh bmQgdGVzdCBvbiB0aGVtLCB0aGF0IG1heQo+IGhlbHAgdGhlIHByb2Nlc3MgYWxvbmc/Cj4gCj4g PiAKPiA+IGlndCB0ZXN0IGNhc2VzIGFyZSBuaWNlIHRvIGhhdmUsIGJ1dCB3aGF0IEkgbmVlZCBu b3cgaXMgYSB0b29sIHRvCj4gPiBleGVjaXNlIHRoZSBBUEkgbWFudWFsbHksIHNpbWlsYXIgdG8g bW9kZXRlc3QsIHdpdGggY29tbWFuZCBsaW5lCj4gPiBwYXJhbWV0ZXJzIHRvIGNvbmZpZ3VyZSB0 aGUgZGV2aWNlLCBhbmQgdGhlIGFiaWxpdHkgdG8gY2FwdHVyZSBmcmFtZXMgdG8KPiA+IGRpc2sg dXNpbmcgd3JpdGViYWNrLiBIb3cgZGlkIHlvdSBwZXJmb3JtIHN1Y2ggdGVzdHMgd2hlbiB5b3Ug ZGV2ZWxvcGVkCj4gPiB3cml0ZWJhY2sgc3VwcG9ydCA/Cj4gPiAKPiAKPiBJIHVzZWQgYSBwcmUt ZXhpc3RpbmcgaW50ZXJuYWwgdG9vbCB3aGljaCBkb2VzIGV4YWN0bHkgdGhhdC4KPiAKPiBJIGFw cHJlY2lhdGUgdGhhdCB3ZSBkb24ndCBoYXZlIHVwc3RyZWFtIHRvb2xpbmcgZm9yIHdyaXRlYmFj ay4gQXMgeW91Cj4gc2F5LCBpdCdzIGEgeW91bmcgQVBJICh3ZWxsLCBub3QgYnkgZGF0ZSwgYnV0 IGNlcnRhaW5seSBieSB1c2FnZSkuCj4gCj4gSSBhbHNvIGRvIGFwcHJlY2lhdGUgeW91IHRha2lu ZyB0aGUgdGltZSB0byBjb25zaWRlciBpdCwgaWRlbnRpZnlpbmcKPiBpc3N1ZXMgd2hpY2ggd2Ug ZGlkIG5vdCwgYW5kIGZvciBmaXhpbmcgdGhlbS4gVGhlIG9ubHkgd2F5IGl0IHN0b3BzCj4gYmVp bmcgYSB5b3VuZyBBUEksIHdpdGggYnVncyBhbmQgbm8gdG9vbGluZywgaXMgaWYgcGVvcGxlIGFk b3B0IGl0LgoKTWVudGlvbmVkIG9uIGlyYyBhbHJlYWR5IHRvIExhdXJlbnQsIGJ1dCBoZXJlIGZv ciBjb21wbGV0ZW5lc3M6IGlndCBoYXMKcHJldHR5IGRlY2VudCBzdXBwb3J0IGZvciBjb21iaW5p bmcgdGhhdCBpbnRvIG9uZSB1dGlsaXR5LiBXZSBzdXBwb3J0CnBpbGVzIG9mIHN0YW5kYXJkIHN0 dWZmIGxpa2UgLS1pbnRlcmFjdGl2ZS1kZWJ1ZyBhbHJlYWR5LCBwbHVzIHlvdSBjYW4gYWRkCndo YXRldmVyIGFkZGl0aW9uYWwgdGhpbmdzIHlvdSBuZWVkIGFuZCBmZWVsIGxpa2UuIFRoZXJlJ3Mg cXVpdGUgYSBmZXcKc3VjaCBpZ3QgdGVzdHMvdG9vbHMgY29tYmluYXRpb25zIGFscmVhZHkuCi1E YW5pZWwKCj4gCj4gVGhhbmtzLAo+IC1Ccmlhbgo+IAo+ID4gPiBBbmQgdGhlcmUncyBzdXBwb3J0 IGluIGRybV9od2NvbXBvc2VyICh0aG91Z2ggSSBtdXN0IGFkbWl0IEkgaGF2ZW4ndAo+ID4gPiBw ZXJzb25hbGx5IHJ1biB0aGUgZHJtX2h3YyBjb2RlKToKPiA+ID4gCj4gPiA+IGh0dHBzOi8vZ2l0 bGFiLmZyZWVkZXNrdG9wLm9yZy9kcm0taHdjb21wb3Nlci9kcm0taHdjb21wb3Nlci9tZXJnZV9y ZXF1ZXN0cy8zCj4gPiAKPiA+IFRoYXQgd29uJ3QgaGVscCBtZSBtdWNoIGFzIEkgZG9uJ3QgaGF2 ZSBhbiBhbmRyb2lkIHBvcnQgZm9yIHRoZSBSLUNhcgo+ID4gYm9hcmRzLgo+ID4gCj4gPiA+IEkn bSBhZnJhaWQgSSBoYXZlbid0IHJlYWxseSB0b3VjaGVkIGFueSBvZiB0aGUgd3JpdGViYWNrIGNv ZGUgZm9yIGEKPiA+ID4gY291cGxlIG9mIHllYXJzIC0gTGl2aXUgcGlja2VkIHRoYXQgdXAuIEhl J3Mgb24gaG9saWRheSB1bnRpbCBNb25kYXksCj4gPiA+IGJ1dCBoZSBzaG91bGQgYmUgYWJsZSB0 byBoZWxwIHdpdGggdGhlIHN0YXR1cyBvZiB0aGUgaWd0cy4KPiA+ID4gCj4gPiA+IEhvcGUgdGhh dCBoZWxwcywKPiA+ID4gCj4gPiA+ID4+PiBUaGUgd3JpdGViYWNrIHBpeGVsIGZvcm1hdCBpcyBy ZXN0cmljdGVkIHRvIFJHQiwgZHVlIHRvIHRoZSBWU1AxCj4gPiA+ID4+PiBvdXRwdXR0aW5nIFJH QiB0byB0aGUgZGlzcGxheSBhbmQgbGFja2luZyBhIHNlcGFyYXRlIGNvbG91ciBzcGFjZQo+ID4g PiA+Pj4gY29udmVyc2lvbiB1bml0IGZvciB3cml0ZWJhY2suIFRoZSByZXNvbHV0aW9uIGNhbiBi ZSBmcmVlbHkgcGlja2VkIGJ5Cj4gPiA+ID4+PiB3aWxsIHJlc3VsdCBpbiBjcm9wcGluZyBvciBj b21wb3NpbmcsIG5vdCBzY2FsaW5nLgo+ID4gPiA+Pj4gCj4gPiA+ID4+PiBXcml0ZWJhY2sgcmVx dWVzdHMgYXJlIHF1ZXVlZCB0byB0aGUgaGFyZHdhcmUgb24gcGFnZSBmbGlwIChhdG9taWMKPiA+ ID4gPj4+IGZsdXNoKSwgYW5kIGNvbXBsZXRlIGF0IHRoZSBuZXh0IHZibGFuay4gVGhpcyBtZWFu cyB0aGF0IGEgcXVldWVkCj4gPiA+ID4+PiB3cml0ZWJhY2sgYnVmZmVyIHdpbGwgbm90IGJlIHBy b2Nlc3NlZCB1bnRpbCB0aGUgbmV4dCBwYWdlIGZsaXAsIGJ1dAo+ID4gPiA+Pj4gb25jZSBpdCBz dGFydHMgYmVpbmcgd3JpdHRlbiB0byBieSB0aGUgVlNQLCBpdCB3aWxsIGNvbXBsZXRlIGF0IHRo ZSBuZXh0Cj4gPiA+ID4+PiB2YmxhbmsgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFub3RoZXIgcGFn ZSBmbGlwIG9jY3VycyBhdCB0aGF0IHRpbWUuCj4gPiA+ID4+IAo+ID4gPiA+PiBUaGlzIHNvdW5k cyB0aGUgc2FtZSBhcyBtYWxpLWRwLCBhbmQgc28gZml0cyBkaXJlY3RseSB3aXRoIHRoZQo+ID4g PiA+PiBzZW1hbnRpY3Mgb2Ygd3JpdGViYWNrIGNvbm5lY3RvcnMuCj4gPiA+ID4+IAo+ID4gPiA+ Pj4gVGhlIGNvZGUgaXMgYmFzZWQgb24gYSBtZXJnZSBvZiB0aGUgbWVkaWEgbWFzdGVyIGJyYW5j aCwgdGhlIGRybS1uZXh0Cj4gPiA+ID4+PiBicmFuY2ggYW5kIHRoZSBSLUNhciBEVCBuZXh0IGJy YW5jaC4gRm9yIGNvbnZlbmllbmNlIHBhdGNoZXMgY2FuIGJlCj4gPiA+ID4+PiBmb3VuZCBhdAo+ ID4gPiA+Pj4gCj4gPiA+ID4+PiAJZ2l0Oi8vbGludXh0di5vcmcvcGluY2hhcnRsL21lZGlhLmdp dCB2NGwyL3ZzcDEvd3JpdGViYWNrCj4gPiA+ID4+PiAKPiA+ID4gPj4+IEtpZXJhbiBCaW5naGFt ICgyKToKPiA+ID4gPj4+ICAgUmV2ZXJ0ICJbbWVkaWFdIHY0bDogdnNwMTogU3VwcGx5IGZyYW1l cyB0byB0aGUgRFUgY29udGludW91c2x5Igo+ID4gPiA+Pj4gICBtZWRpYTogdnNwMTogUHJvdmlk ZSBhIHdyaXRlYmFjayB2aWRlbyBkZXZpY2UKPiA+ID4gPj4+IAo+ID4gPiA+Pj4gTGF1cmVudCBQ aW5jaGFydCAoNSk6Cj4gPiA+ID4+PiAgIG1lZGlhOiB2c3AxOiB3cGY6IEZpeCBwYXJ0aXRpb24g Y29uZmlndXJhdGlvbiBmb3IgZGlzcGxheSBwaXBlbGluZXMKPiA+ID4gPj4+ICAgbWVkaWE6IHZz cDE6IFJlcGxhY2UgbGVmdG92ZXIgb2NjdXJyZW5jZSBvZiBmcmFnbWVudCB3aXRoIGJvZHkKPiA+ ID4gPj4+ICAgbWVkaWE6IHZzcDE6IEZpeCBhZGRyZXNzZXMgb2YgZGlzcGxheS1yZWxhdGVkIHJl Z2lzdGVycyBmb3IgVlNQLURMCj4gPiA+ID4+PiAgIG1lZGlhOiB2c3AxOiBSZWZhY3RvciB2c3Ax X3ZpZGVvX2NvbXBsZXRlX2J1ZmZlcigpIGZvciBsYXRlciByZXVzZQo+ID4gPiA+Pj4gICBtZWRp YTogdnNwMTogUmVwbGFjZSB0aGUgZGlzcGxheSBsaXN0IGludGVybmFsIGZsYWcgd2l0aCBhIGZs YWdzIGZpZWxkCj4gPiA+ID4+PiAKPiA+ID4gPj4+ICBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL3Zz cDEvdnNwMV9kbC5jICAgIHwgMTE4ICsrKysrKysrKysrKy0tCj4gPiA+ID4+PiAgZHJpdmVycy9t ZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZGwuaCAgICB8ICAgNiArLQo+ID4gPiA+Pj4gIGRyaXZl cnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2RybS5jICAgfCAgMjQgKystCj4gPiA+ID4+PiAg ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZHJ2LmMgICB8ICAxNyArLQo+ID4gPiA+ Pj4gIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3BpcGUuYyAgfCAgIDUgKwo+ID4g PiA+Pj4gIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3BpcGUuaCAgfCAgIDYgKwo+ ID4gPiA+Pj4gIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3JlZ3MuaCAgfCAgIDYg Ky0KPiA+ID4gPj4+ICBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9yd3BmLmggIHwg ICAyICsKPiA+ID4gPj4+ICBkcml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV92aWRlby5j IHwgMTk4ICsrKysrKysrKysrKysrKysrKystLS0tCj4gPiA+ID4+PiAgZHJpdmVycy9tZWRpYS9w bGF0Zm9ybS92c3AxL3ZzcDFfdmlkZW8uaCB8ICAgNiArCj4gPiA+ID4+PiAgZHJpdmVycy9tZWRp YS9wbGF0Zm9ybS92c3AxL3ZzcDFfd3BmLmMgICB8ICA2NSArKysrKystLQo+ID4gPiA+Pj4gIDEx IGZpbGVzIGNoYW5nZWQsIDM3OCBpbnNlcnRpb25zKCspLCA3NSBkZWxldGlvbnMoLSkKPiA+IAo+ ID4gLS0gCj4gPiBSZWdhcmRzLAo+ID4gCj4gPiBMYXVyZW50IFBpbmNoYXJ0Cj4gX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBkcmktZGV2ZWwgbWFpbGlu ZyBsaXN0Cj4gZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+IGh0dHBzOi8vbGlzdHMu ZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCgotLSAKRGFuaWVsIFZl dHRlcgpTb2Z0d2FyZSBFbmdpbmVlciwgSW50ZWwgQ29ycG9yYXRpb24KaHR0cDovL2Jsb2cuZmZ3 bGwuY2gKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJp LWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBz Oi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs