From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755760AbeDYRRl (ORCPT ); Wed, 25 Apr 2018 13:17:41 -0400 Received: from mga04.intel.com ([192.55.52.120]:63162 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755586AbeDYRRc (ORCPT ); Wed, 25 Apr 2018 13:17:32 -0400 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,327,1520924400"; d="scan'208";a="194351638" Date: Wed, 25 Apr 2018 10:16:57 -0700 From: Dongwon Kim To: Oleksandr Andrushchenko , jgross@suse.com, Artem Mygaiev , Wei Liu , konrad.wilk@oracle.com, airlied@linux.ie, "Oleksandr_Andrushchenko@epam.com" , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, "Potrola, MateuszX" , xen-devel@lists.xenproject.org, daniel.vetter@intel.com, boris.ostrovsky@oracle.com, Roger Pau =?iso-8859-1?Q?Monn=E9?= Subject: Re: [Xen-devel] [PATCH 0/1] drm/xen-zcopy: Add Xen zero-copy helper DRM driver Message-ID: <20180425171657.GA28803@downor-Z87X-UD5H> References: <20180418101058.hyqk3gr3b2ibxswu@MacBook-Pro-de-Roger.local> <20180420071914.GG31310@phenom.ffwll.local> <76cdc65a-7bb1-9377-7bc5-6164e32f7b5d@gmail.com> <20180423115242.ywdwqblj2aseu3fr@citrix.com> <61105351-8896-072b-abf0-757c7f6c0edf@gmail.com> <20180424115437.GT31310@phenom.ffwll.local> <18ab5f76-00b0-42a0-fcb8-e0cbf4cdd527@gmail.com> <20180424203514.GA26787@downor-Z87X-UD5H> <43bc755f-3e31-6841-0962-542c42515f88@gmail.com> <20180425063455.GH25142@phenom.ffwll.local> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20180425063455.GH25142@phenom.ffwll.local> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Apr 25, 2018 at 08:34:55AM +0200, Daniel Vetter wrote: > On Wed, Apr 25, 2018 at 09:07:07AM +0300, Oleksandr Andrushchenko wrote: > > On 04/24/2018 11:35 PM, Dongwon Kim wrote: > > > Had a meeting with Daniel and talked about bringing out generic > > > part of hyper-dmabuf to the userspace, which means we most likely > > > reuse IOCTLs defined in xen-zcopy for our use-case if we follow > > > his suggestion. > > I will still have kernel side API, so backends/frontends implemented > > in the kernel can access that functionality as well. > > > > > > So assuming we use these IOCTLs as they are, > > > Several things I would like you to double-check.. > > > > > > 1. returning gref as is to the user space is still unsafe because > > > it is a constant, easy to guess and any process that hijacks it can easily > > > exploit the buffer. So I am wondering if it's possible to keep dmabuf-to > > > -gref or gref-to-dmabuf in kernel space and add other layers on top > > > of those in actual IOCTLs to add some safety.. We introduced flink like > > > hyper_dmabuf_id including random number but many says even that is still > > > not safe. > > Yes, it is generally unsafe. But even if we have implemented > > the approach you have in hyper-dmabuf or similar, what stops > > malicious software from doing the same with the existing gntdev UAPI? > > No need to brute force new UAPI if there is a simpler one. > > That being said, I'll put security aside at the first stage, > > but of course we can start investigating ways to improve > > (I assume you already have use-cases where security issues must > > be considered, so, probably you can tell more on what was investigated > > so far). Yeah, although we think we lowered the chance of guessing the right id by adding random number to it, the security hole is still there as far as we use a constant id across VMs. We understood this from the beginning but couldn't find a better way. So what we proposed is to make sure our customer understand this and prepare very secure way to handle this id in the userspace (mattrope however recently proposed a "hyper-pipe" which FD-type id can be converted and exchanged safely through. So we are looking into this now.) And another approach we have proposed is to use event-polling, that lets the privileged userapp in importing guest to know about a new exported DMABUF so that it can retrieve it from the queue then redistribute to other applications. This method is not very flexible however, is one way to hide ID from userspace completely. Anyway, yes, we can continue to investigate the possible way to make it more secure. > > Maybe a bit more context here: > > So in graphics we have this old flink approach for buffer sharing with > processes, and it's unsafe because way too easy to guess the buffer > handles. And anyone with access to the graphics driver can then import > that buffer object. We switched to file descriptor passing to make sure > only the intended recipient can import a buffer. > > So at the vm->vm level it sounds like grefs are safe, because they're only > for a specific other guest (or sets of guests, not sure about). That means > security is only within the OS. For that you need to make sure that > unpriviledge userspace simply can't ever access a gref. If that doesn't > work out, then I guess we should improve the xen gref stuff to have a more > secure cookie. > > > > 2. maybe we could take hypervisor-independent process (e.g. SGT<->page) > > > out of xen-zcopy and put those in a new helper library. > > I believe this can be done, but at the first stage I would go without > > that helper library, so it is clearly seen what can be moved to it later > > (I know that you want to run ACRN as well, but can I run it on ARM? ;) > > There's already helpers for walking sgtables and adding pages/enumerating > pages. I don't think we need more. ok, where would that helpers be located? If we consider we will use these with other hypervisor drivers, maybe it's better to place those in some common area? > > > > 3. please consider the case where original DMA-BUF's first offset > > > and last length are not 0 and PAGE_SIZE respectively. I assume current > > > xen-zcopy only supports page-aligned buffer with PAGE_SIZE x n big. > > Hm, what is the use-case for that? Just in general use-case.. I was just considering the case (might be corner case..) where sg->offset != 0 or sg->length != PAGE_SIZE. Hyper dmabuf sends this information (first offset and last length) together with references for pages. So I was wondering if we should so similar thing in zcopy since your goal is now to cover general dma-buf use-cases (however, danvet mentioned hard constaint of dma-buf below.. so if this can't happen according to the spec, then we can ignore it..) > > dma-buf is always page-aligned. That's a hard constraint of the linux > dma-buf interface spec. > -Daniel Hmm.. I am little bit confused.. So does it mean dmabuf->size is always n*PAGE_SIZE? What is the sgt behind dmabuf has an offset other than 0 for the first sgl or the length of the last sgl is not PAGE_SIZE? You are saying this case is not acceptable for dmabuf? > > > > thanks, > > > DW > > Thank you, > > Oleksandr > > > On Tue, Apr 24, 2018 at 02:59:39PM +0300, Oleksandr Andrushchenko wrote: > > > > On 04/24/2018 02:54 PM, Daniel Vetter wrote: > > > > > On Mon, Apr 23, 2018 at 03:10:35PM +0300, Oleksandr Andrushchenko wrote: > > > > > > On 04/23/2018 02:52 PM, Wei Liu wrote: > > > > > > > On Fri, Apr 20, 2018 at 02:25:20PM +0300, Oleksandr Andrushchenko wrote: > > > > > > > > > > the gntdev. > > > > > > > > > > > > > > > > > > > > I think this is generic enough that it could be implemented by a > > > > > > > > > > device not tied to Xen. AFAICT the hyper_dma guys also wanted > > > > > > > > > > something similar to this. > > > > > > > > > You can't just wrap random userspace memory into a dma-buf. We've just had > > > > > > > > > this discussion with kvm/qemu folks, who proposed just that, and after a > > > > > > > > > bit of discussion they'll now try to have a driver which just wraps a > > > > > > > > > memfd into a dma-buf. > > > > > > > > So, we have to decide either we introduce a new driver > > > > > > > > (say, under drivers/xen/xen-dma-buf) or extend the existing > > > > > > > > gntdev/balloon to support dma-buf use-cases. > > > > > > > > > > > > > > > > Can anybody from Xen community express their preference here? > > > > > > > > > > > > > > > Oleksandr talked to me on IRC about this, he said a few IOCTLs need to > > > > > > > be added to either existing drivers or a new driver. > > > > > > > > > > > > > > I went through this thread twice and skimmed through the relevant > > > > > > > documents, but I couldn't see any obvious pros and cons for either > > > > > > > approach. So I don't really have an opinion on this. > > > > > > > > > > > > > > But, assuming if implemented in existing drivers, those IOCTLs need to > > > > > > > be added to different drivers, which means userspace program needs to > > > > > > > write more code and get more handles, it would be slightly better to > > > > > > > implement a new driver from that perspective. > > > > > > If gntdev/balloon extension is still considered: > > > > > > > > > > > > All the IOCTLs will be in gntdev driver (in current xen-zcopy terminology): > > > > I was lazy to change dumb to dma-buf, so put this notice ;) > > > > > >  - DRM_ICOTL_XEN_ZCOPY_DUMB_FROM_REFS > > > > > >  - DRM_IOCTL_XEN_ZCOPY_DUMB_TO_REFS > > > > > >  - DRM_IOCTL_XEN_ZCOPY_DUMB_WAIT_FREE > > > > > s/DUMB/DMA_BUF/ please. This is generic dma-buf, it has nothing to do with > > > > > the dumb scanout buffer support in the drm/gfx subsystem. This here can be > > > > > used for any zcopy sharing among guests (as long as your endpoints > > > > > understands dma-buf, which most relevant drivers do). > > > > Of course, please see above > > > > > -Daniel > > > > > > > > > > > Balloon driver extension, which is needed for contiguous/DMA > > > > > > buffers, will be to provide new *kernel API*, no UAPI is needed. > > > > > > > > > > > > > Wei. > > > > > > Thank you, > > > > > > Oleksandr > > > > > > _______________________________________________ > > > > > > dri-devel mailing list > > > > > > dri-devel@lists.freedesktop.org > > > > > > https://lists.freedesktop.org/mailman/listinfo/dri-devel > > > > _______________________________________________ > > 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: Dongwon Kim Subject: Re: [Xen-devel] [PATCH 0/1] drm/xen-zcopy: Add Xen zero-copy helper DRM driver Date: Wed, 25 Apr 2018 10:16:57 -0700 Message-ID: <20180425171657.GA28803@downor-Z87X-UD5H> References: <20180418101058.hyqk3gr3b2ibxswu@MacBook-Pro-de-Roger.local> <20180420071914.GG31310@phenom.ffwll.local> <76cdc65a-7bb1-9377-7bc5-6164e32f7b5d@gmail.com> <20180423115242.ywdwqblj2aseu3fr@citrix.com> <61105351-8896-072b-abf0-757c7f6c0edf@gmail.com> <20180424115437.GT31310@phenom.ffwll.local> <18ab5f76-00b0-42a0-fcb8-e0cbf4cdd527@gmail.com> <20180424203514.GA26787@downor-Z87X-UD5H> <43bc755f-3e31-6841-0962-542c42515f88@gmail.com> <20180425063455.GH25142@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTPS id E85116E26E for ; Wed, 25 Apr 2018 17:17:32 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20180425063455.GH25142@phenom.ffwll.local> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Oleksandr Andrushchenko , jgross@suse.com, Artem Mygaiev , Wei Liu , konrad.wilk@oracle.com, airlied@linux.ie, "Oleksandr_Andrushchenko@epam.com" , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, "Potrola, MateuszX" , xen-devel@lists.xenproject.org, daniel.vetter@intel.com, boris.ostrovsky@oracle.com, Roger Pau =?iso-8859-1?Q?Monn=E9?= List-Id: dri-devel@lists.freedesktop.org T24gV2VkLCBBcHIgMjUsIDIwMTggYXQgMDg6MzQ6NTVBTSArMDIwMCwgRGFuaWVsIFZldHRlciB3 cm90ZToKPiBPbiBXZWQsIEFwciAyNSwgMjAxOCBhdCAwOTowNzowN0FNICswMzAwLCBPbGVrc2Fu ZHIgQW5kcnVzaGNoZW5rbyB3cm90ZToKPiA+IE9uIDA0LzI0LzIwMTggMTE6MzUgUE0sIERvbmd3 b24gS2ltIHdyb3RlOgo+ID4gPiBIYWQgYSBtZWV0aW5nIHdpdGggRGFuaWVsIGFuZCB0YWxrZWQg YWJvdXQgYnJpbmdpbmcgb3V0IGdlbmVyaWMKPiA+ID4gcGFydCBvZiBoeXBlci1kbWFidWYgdG8g dGhlIHVzZXJzcGFjZSwgd2hpY2ggbWVhbnMgd2UgbW9zdCBsaWtlbHkKPiA+ID4gcmV1c2UgSU9D VExzIGRlZmluZWQgaW4geGVuLXpjb3B5IGZvciBvdXIgdXNlLWNhc2UgaWYgd2UgZm9sbG93Cj4g PiA+IGhpcyBzdWdnZXN0aW9uLgo+ID4gSSB3aWxsIHN0aWxsIGhhdmUga2VybmVsIHNpZGUgQVBJ LCBzbyBiYWNrZW5kcy9mcm9udGVuZHMgaW1wbGVtZW50ZWQKPiA+IGluIHRoZSBrZXJuZWwgY2Fu IGFjY2VzcyB0aGF0IGZ1bmN0aW9uYWxpdHkgYXMgd2VsbC4KPiA+ID4gCj4gPiA+IFNvIGFzc3Vt aW5nIHdlIHVzZSB0aGVzZSBJT0NUTHMgYXMgdGhleSBhcmUsCj4gPiA+IFNldmVyYWwgdGhpbmdz IEkgd291bGQgbGlrZSB5b3UgdG8gZG91YmxlLWNoZWNrLi4KPiA+ID4gCj4gPiA+IDEuIHJldHVy bmluZyBncmVmIGFzIGlzIHRvIHRoZSB1c2VyIHNwYWNlIGlzIHN0aWxsIHVuc2FmZSBiZWNhdXNl Cj4gPiA+IGl0IGlzIGEgY29uc3RhbnQsIGVhc3kgdG8gZ3Vlc3MgYW5kIGFueSBwcm9jZXNzIHRo YXQgaGlqYWNrcyBpdCBjYW4gZWFzaWx5Cj4gPiA+IGV4cGxvaXQgdGhlIGJ1ZmZlci4gU28gSSBh bSB3b25kZXJpbmcgaWYgaXQncyBwb3NzaWJsZSB0byBrZWVwIGRtYWJ1Zi10bwo+ID4gPiAtZ3Jl ZiBvciBncmVmLXRvLWRtYWJ1ZiBpbiBrZXJuZWwgc3BhY2UgYW5kIGFkZCBvdGhlciBsYXllcnMg b24gdG9wCj4gPiA+IG9mIHRob3NlIGluIGFjdHVhbCBJT0NUTHMgdG8gYWRkIHNvbWUgc2FmZXR5 Li4gV2UgaW50cm9kdWNlZCBmbGluayBsaWtlCj4gPiA+IGh5cGVyX2RtYWJ1Zl9pZCBpbmNsdWRp bmcgcmFuZG9tIG51bWJlciBidXQgbWFueSBzYXlzIGV2ZW4gdGhhdCBpcyBzdGlsbAo+ID4gPiBu b3Qgc2FmZS4KPiA+IFllcywgaXQgaXMgZ2VuZXJhbGx5IHVuc2FmZS4gQnV0IGV2ZW4gaWYgd2Ug aGF2ZSBpbXBsZW1lbnRlZAo+ID4gdGhlIGFwcHJvYWNoIHlvdSBoYXZlIGluIGh5cGVyLWRtYWJ1 ZiBvciBzaW1pbGFyLCB3aGF0IHN0b3BzCj4gPiBtYWxpY2lvdXMgc29mdHdhcmUgZnJvbSBkb2lu ZyB0aGUgc2FtZSB3aXRoIHRoZSBleGlzdGluZyBnbnRkZXYgVUFQST8KPiA+IE5vIG5lZWQgdG8g YnJ1dGUgZm9yY2UgbmV3IFVBUEkgaWYgdGhlcmUgaXMgYSBzaW1wbGVyIG9uZS4KPiA+IFRoYXQg YmVpbmcgc2FpZCwgSSdsbCBwdXQgc2VjdXJpdHkgYXNpZGUgYXQgdGhlIGZpcnN0IHN0YWdlLAo+ ID4gYnV0IG9mIGNvdXJzZSB3ZSBjYW4gc3RhcnQgaW52ZXN0aWdhdGluZyB3YXlzIHRvIGltcHJv dmUKPiA+IChJIGFzc3VtZSB5b3UgYWxyZWFkeSBoYXZlIHVzZS1jYXNlcyB3aGVyZSBzZWN1cml0 eSBpc3N1ZXMgbXVzdAo+ID4gYmUgY29uc2lkZXJlZCwgc28sIHByb2JhYmx5IHlvdSBjYW4gdGVs bCBtb3JlIG9uIHdoYXQgd2FzIGludmVzdGlnYXRlZAo+ID4gc28gZmFyKS4KClllYWgsIGFsdGhv dWdoIHdlIHRoaW5rIHdlIGxvd2VyZWQgdGhlIGNoYW5jZSBvZiBndWVzc2luZyB0aGUgcmlnaHQg aWQKYnkgYWRkaW5nIHJhbmRvbSBudW1iZXIgdG8gaXQsIHRoZSBzZWN1cml0eSBob2xlIGlzIHN0 aWxsIHRoZXJlIGFzIGZhcgphcyB3ZSB1c2UgYSBjb25zdGFudCBpZCBhY3Jvc3MgVk1zLiBXZSB1 bmRlcnN0b29kIHRoaXMgZnJvbSB0aGUgYmVnaW5uaW5nCmJ1dCBjb3VsZG4ndCBmaW5kIGEgYmV0 dGVyIHdheS4gU28gd2hhdCB3ZSBwcm9wb3NlZCBpcyB0byBtYWtlIHN1cmUgb3VyCmN1c3RvbWVy IHVuZGVyc3RhbmQgdGhpcyBhbmQgcHJlcGFyZSB2ZXJ5IHNlY3VyZSB3YXkgdG8gaGFuZGxlIHRo aXMgaWQKaW4gdGhlIHVzZXJzcGFjZSAobWF0dHJvcGUgaG93ZXZlciByZWNlbnRseSBwcm9wb3Nl ZCBhICJoeXBlci1waXBlIiB3aGljaApGRC10eXBlIGlkIGNhbiBiZSBjb252ZXJ0ZWQgYW5kIGV4 Y2hhbmdlZCBzYWZlbHkgdGhyb3VnaC4gU28gd2UgYXJlIGxvb2tpbmcKaW50byB0aGlzIG5vdy4p CgpBbmQgYW5vdGhlciBhcHByb2FjaCB3ZSBoYXZlIHByb3Bvc2VkIGlzIHRvIHVzZSBldmVudC1w b2xsaW5nLCB0aGF0IGxldHMKdGhlIHByaXZpbGVnZWQgdXNlcmFwcCBpbiBpbXBvcnRpbmcgZ3Vl c3QgdG8ga25vdyBhYm91dCBhIG5ldyBleHBvcnRlZApETUFCVUYgc28gdGhhdCBpdCBjYW4gcmV0 cmlldmUgaXQgZnJvbSB0aGUgcXVldWUgdGhlbiByZWRpc3RyaWJ1dGUgdG8Kb3RoZXIgYXBwbGlj YXRpb25zLiBUaGlzIG1ldGhvZCBpcyBub3QgdmVyeSBmbGV4aWJsZSBob3dldmVyLCBpcyBvbmUg d2F5CnRvIGhpZGUgSUQgZnJvbSB1c2Vyc3BhY2UgY29tcGxldGVseS4KCkFueXdheSwgeWVzLCB3 ZSBjYW4gY29udGludWUgdG8gaW52ZXN0aWdhdGUgdGhlIHBvc3NpYmxlIHdheSB0byBtYWtlIGl0 Cm1vcmUgc2VjdXJlLiAKCj4gCj4gTWF5YmUgYSBiaXQgbW9yZSBjb250ZXh0IGhlcmU6Cj4gCj4g U28gaW4gZ3JhcGhpY3Mgd2UgaGF2ZSB0aGlzIG9sZCBmbGluayBhcHByb2FjaCBmb3IgYnVmZmVy IHNoYXJpbmcgd2l0aAo+IHByb2Nlc3NlcywgYW5kIGl0J3MgdW5zYWZlIGJlY2F1c2Ugd2F5IHRv byBlYXN5IHRvIGd1ZXNzIHRoZSBidWZmZXIKPiBoYW5kbGVzLiBBbmQgYW55b25lIHdpdGggYWNj ZXNzIHRvIHRoZSBncmFwaGljcyBkcml2ZXIgY2FuIHRoZW4gaW1wb3J0Cj4gdGhhdCBidWZmZXIg b2JqZWN0LiBXZSBzd2l0Y2hlZCB0byBmaWxlIGRlc2NyaXB0b3IgcGFzc2luZyB0byBtYWtlIHN1 cmUKPiBvbmx5IHRoZSBpbnRlbmRlZCByZWNpcGllbnQgY2FuIGltcG9ydCBhIGJ1ZmZlci4KPiAK PiBTbyBhdCB0aGUgdm0tPnZtIGxldmVsIGl0IHNvdW5kcyBsaWtlIGdyZWZzIGFyZSBzYWZlLCBi ZWNhdXNlIHRoZXkncmUgb25seQo+IGZvciBhIHNwZWNpZmljIG90aGVyIGd1ZXN0IChvciBzZXRz IG9mIGd1ZXN0cywgbm90IHN1cmUgYWJvdXQpLiBUaGF0IG1lYW5zCj4gc2VjdXJpdHkgaXMgb25s eSB3aXRoaW4gdGhlIE9TLiBGb3IgdGhhdCB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdAo+IHVu cHJpdmlsZWRnZSB1c2Vyc3BhY2Ugc2ltcGx5IGNhbid0IGV2ZXIgYWNjZXNzIGEgZ3JlZi4gSWYg dGhhdCBkb2Vzbid0Cj4gd29yayBvdXQsIHRoZW4gSSBndWVzcyB3ZSBzaG91bGQgaW1wcm92ZSB0 aGUgeGVuIGdyZWYgc3R1ZmYgdG8gaGF2ZSBhIG1vcmUKPiBzZWN1cmUgY29va2llLgo+IAo+ID4g PiAyLiBtYXliZSB3ZSBjb3VsZCB0YWtlIGh5cGVydmlzb3ItaW5kZXBlbmRlbnQgcHJvY2VzcyAo ZS5nLiBTR1Q8LT5wYWdlKQo+ID4gPiBvdXQgb2YgeGVuLXpjb3B5IGFuZCBwdXQgdGhvc2UgaW4g YSBuZXcgaGVscGVyIGxpYnJhcnkuCj4gPiBJIGJlbGlldmUgdGhpcyBjYW4gYmUgZG9uZSwgYnV0 IGF0IHRoZSBmaXJzdCBzdGFnZSBJIHdvdWxkIGdvIHdpdGhvdXQKPiA+IHRoYXQgaGVscGVyIGxp YnJhcnksIHNvIGl0IGlzIGNsZWFybHkgc2VlbiB3aGF0IGNhbiBiZSBtb3ZlZCB0byBpdCBsYXRl cgo+ID4gKEkga25vdyB0aGF0IHlvdSB3YW50IHRvIHJ1biBBQ1JOIGFzIHdlbGwsIGJ1dCBjYW4g SSBydW4gaXQgb24gQVJNPyA7KQo+IAo+IFRoZXJlJ3MgYWxyZWFkeSBoZWxwZXJzIGZvciB3YWxr aW5nIHNndGFibGVzIGFuZCBhZGRpbmcgcGFnZXMvZW51bWVyYXRpbmcKPiBwYWdlcy4gSSBkb24n dCB0aGluayB3ZSBuZWVkIG1vcmUuCgpvaywgd2hlcmUgd291bGQgdGhhdCBoZWxwZXJzIGJlIGxv Y2F0ZWQ/IElmIHdlIGNvbnNpZGVyIHdlIHdpbGwgdXNlIHRoZXNlCndpdGggb3RoZXIgaHlwZXJ2 aXNvciBkcml2ZXJzLCBtYXliZSBpdCdzIGJldHRlciB0byBwbGFjZSB0aG9zZSBpbiBzb21lCmNv bW1vbiBhcmVhPwoKPiAKPiA+ID4gMy4gcGxlYXNlIGNvbnNpZGVyIHRoZSBjYXNlIHdoZXJlIG9y aWdpbmFsIERNQS1CVUYncyBmaXJzdCBvZmZzZXQKPiA+ID4gYW5kIGxhc3QgbGVuZ3RoIGFyZSBu b3QgMCBhbmQgUEFHRV9TSVpFIHJlc3BlY3RpdmVseS4gSSBhc3N1bWUgY3VycmVudAo+ID4gPiB4 ZW4temNvcHkgb25seSBzdXBwb3J0cyBwYWdlLWFsaWduZWQgYnVmZmVyIHdpdGggUEFHRV9TSVpF IHggbiBiaWcuCj4gPiBIbSwgd2hhdCBpcyB0aGUgdXNlLWNhc2UgZm9yIHRoYXQ/CgpKdXN0IGlu IGdlbmVyYWwgdXNlLWNhc2UuLiBJIHdhcyBqdXN0IGNvbnNpZGVyaW5nIHRoZSBjYXNlIChtaWdo dCBiZSBjb3JuZXIKY2FzZS4uKSB3aGVyZSBzZy0+b2Zmc2V0ICE9IDAgb3Igc2ctPmxlbmd0aCAh PSBQQUdFX1NJWkUuIEh5cGVyIGRtYWJ1ZiBzZW5kcwp0aGlzIGluZm9ybWF0aW9uIChmaXJzdCBv ZmZzZXQgYW5kIGxhc3QgbGVuZ3RoKSB0b2dldGhlciB3aXRoIHJlZmVyZW5jZXMgZm9yCnBhZ2Vz LiBTbyBJIHdhcyB3b25kZXJpbmcgaWYgd2Ugc2hvdWxkIHNvIHNpbWlsYXIgdGhpbmcgaW4gemNv cHkgc2luY2UgeW91cgpnb2FsIGlzIG5vdyB0byBjb3ZlciBnZW5lcmFsIGRtYS1idWYgdXNlLWNh c2VzIChob3dldmVyLCBkYW52ZXQgbWVudGlvbmVkCmhhcmQgY29uc3RhaW50IG9mIGRtYS1idWYg YmVsb3cuLiBzbyBpZiB0aGlzIGNhbid0IGhhcHBlbiBhY2NvcmRpbmcgdG8gdGhlCnNwZWMsIHRo ZW4gd2UgY2FuIGlnbm9yZSBpdC4uKQoKPiAKPiBkbWEtYnVmIGlzIGFsd2F5cyBwYWdlLWFsaWdu ZWQuIFRoYXQncyBhIGhhcmQgY29uc3RyYWludCBvZiB0aGUgbGludXgKPiBkbWEtYnVmIGludGVy ZmFjZSBzcGVjLgo+IC1EYW5pZWwKCkhtbS4uIEkgYW0gbGl0dGxlIGJpdCBjb25mdXNlZC4uClNv IGRvZXMgaXQgbWVhbiBkbWFidWYtPnNpemUgaXMgYWx3YXlzIG4qUEFHRV9TSVpFPyBXaGF0IGlz IHRoZSBzZ3QgYmVoaW5kCmRtYWJ1ZiBoYXMgYW4gb2Zmc2V0IG90aGVyIHRoYW4gMCBmb3IgdGhl IGZpcnN0IHNnbCBvciB0aGUgbGVuZ3RoIG9mIHRoZQpsYXN0IHNnbCBpcyBub3QgUEFHRV9TSVpF PyBZb3UgYXJlIHNheWluZyB0aGlzIGNhc2UgaXMgbm90IGFjY2VwdGFibGUgZm9yCmRtYWJ1Zj8K Cj4gCj4gPiA+IHRoYW5rcywKPiA+ID4gRFcKPiA+IFRoYW5rIHlvdSwKPiA+IE9sZWtzYW5kcgo+ ID4gPiBPbiBUdWUsIEFwciAyNCwgMjAxOCBhdCAwMjo1OTozOVBNICswMzAwLCBPbGVrc2FuZHIg QW5kcnVzaGNoZW5rbyB3cm90ZToKPiA+ID4gPiBPbiAwNC8yNC8yMDE4IDAyOjU0IFBNLCBEYW5p ZWwgVmV0dGVyIHdyb3RlOgo+ID4gPiA+ID4gT24gTW9uLCBBcHIgMjMsIDIwMTggYXQgMDM6MTA6 MzVQTSArMDMwMCwgT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gd3JvdGU6Cj4gPiA+ID4gPiA+IE9u IDA0LzIzLzIwMTggMDI6NTIgUE0sIFdlaSBMaXUgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gT24gRnJp LCBBcHIgMjAsIDIwMTggYXQgMDI6MjU6MjBQTSArMDMwMCwgT2xla3NhbmRyIEFuZHJ1c2hjaGVu a28gd3JvdGU6Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgdGhlIGdudGRldi4KPiA+ID4gPiA+ ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiBJIHRoaW5rIHRoaXMgaXMgZ2VuZXJpYyBl bm91Z2ggdGhhdCBpdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBieSBhCj4gPiA+ID4gPiA+ID4gPiA+ ID4gZGV2aWNlIG5vdCB0aWVkIHRvIFhlbi4gQUZBSUNUIHRoZSBoeXBlcl9kbWEgZ3V5cyBhbHNv IHdhbnRlZAo+ID4gPiA+ID4gPiA+ID4gPiA+IHNvbWV0aGluZyBzaW1pbGFyIHRvIHRoaXMuCj4g PiA+ID4gPiA+ID4gPiA+IFlvdSBjYW4ndCBqdXN0IHdyYXAgcmFuZG9tIHVzZXJzcGFjZSBtZW1v cnkgaW50byBhIGRtYS1idWYuIFdlJ3ZlIGp1c3QgaGFkCj4gPiA+ID4gPiA+ID4gPiA+IHRoaXMg ZGlzY3Vzc2lvbiB3aXRoIGt2bS9xZW11IGZvbGtzLCB3aG8gcHJvcG9zZWQganVzdCB0aGF0LCBh bmQgYWZ0ZXIgYQo+ID4gPiA+ID4gPiA+ID4gPiBiaXQgb2YgZGlzY3Vzc2lvbiB0aGV5J2xsIG5v dyB0cnkgdG8gaGF2ZSBhIGRyaXZlciB3aGljaCBqdXN0IHdyYXBzIGEKPiA+ID4gPiA+ID4gPiA+ ID4gbWVtZmQgaW50byBhIGRtYS1idWYuCj4gPiA+ID4gPiA+ID4gPiBTbywgd2UgaGF2ZSB0byBk ZWNpZGUgZWl0aGVyIHdlIGludHJvZHVjZSBhIG5ldyBkcml2ZXIKPiA+ID4gPiA+ID4gPiA+IChz YXksIHVuZGVyIGRyaXZlcnMveGVuL3hlbi1kbWEtYnVmKSBvciBleHRlbmQgdGhlIGV4aXN0aW5n Cj4gPiA+ID4gPiA+ID4gPiBnbnRkZXYvYmFsbG9vbiB0byBzdXBwb3J0IGRtYS1idWYgdXNlLWNh c2VzLgo+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiBDYW4gYW55Ym9keSBmcm9tIFhl biBjb21tdW5pdHkgZXhwcmVzcyB0aGVpciBwcmVmZXJlbmNlIGhlcmU/Cj4gPiA+ID4gPiA+ID4g PiAKPiA+ID4gPiA+ID4gPiBPbGVrc2FuZHIgdGFsa2VkIHRvIG1lIG9uIElSQyBhYm91dCB0aGlz LCBoZSBzYWlkIGEgZmV3IElPQ1RMcyBuZWVkIHRvCj4gPiA+ID4gPiA+ID4gYmUgYWRkZWQgdG8g ZWl0aGVyIGV4aXN0aW5nIGRyaXZlcnMgb3IgYSBuZXcgZHJpdmVyLgo+ID4gPiA+ID4gPiA+IAo+ ID4gPiA+ID4gPiA+IEkgd2VudCB0aHJvdWdoIHRoaXMgdGhyZWFkIHR3aWNlIGFuZCBza2ltbWVk IHRocm91Z2ggdGhlIHJlbGV2YW50Cj4gPiA+ID4gPiA+ID4gZG9jdW1lbnRzLCBidXQgSSBjb3Vs ZG4ndCBzZWUgYW55IG9idmlvdXMgcHJvcyBhbmQgY29ucyBmb3IgZWl0aGVyCj4gPiA+ID4gPiA+ ID4gYXBwcm9hY2guIFNvIEkgZG9uJ3QgcmVhbGx5IGhhdmUgYW4gb3BpbmlvbiBvbiB0aGlzLgo+ ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+IEJ1dCwgYXNzdW1pbmcgaWYgaW1wbGVtZW50ZWQg aW4gZXhpc3RpbmcgZHJpdmVycywgdGhvc2UgSU9DVExzIG5lZWQgdG8KPiA+ID4gPiA+ID4gPiBi ZSBhZGRlZCB0byBkaWZmZXJlbnQgZHJpdmVycywgd2hpY2ggbWVhbnMgdXNlcnNwYWNlIHByb2dy YW0gbmVlZHMgdG8KPiA+ID4gPiA+ID4gPiB3cml0ZSBtb3JlIGNvZGUgYW5kIGdldCBtb3JlIGhh bmRsZXMsIGl0IHdvdWxkIGJlIHNsaWdodGx5IGJldHRlciB0bwo+ID4gPiA+ID4gPiA+IGltcGxl bWVudCBhIG5ldyBkcml2ZXIgZnJvbSB0aGF0IHBlcnNwZWN0aXZlLgo+ID4gPiA+ID4gPiBJZiBn bnRkZXYvYmFsbG9vbiBleHRlbnNpb24gaXMgc3RpbGwgY29uc2lkZXJlZDoKPiA+ID4gPiA+ID4g Cj4gPiA+ID4gPiA+IEFsbCB0aGUgSU9DVExzIHdpbGwgYmUgaW4gZ250ZGV2IGRyaXZlciAoaW4g Y3VycmVudCB4ZW4temNvcHkgdGVybWlub2xvZ3kpOgo+ID4gPiA+IEkgd2FzIGxhenkgdG8gY2hh bmdlIGR1bWIgdG8gZG1hLWJ1Ziwgc28gcHV0IHRoaXMgbm90aWNlIDspCj4gPiA+ID4gPiA+ICDC oC0gRFJNX0lDT1RMX1hFTl9aQ09QWV9EVU1CX0ZST01fUkVGUwo+ID4gPiA+ID4gPiAgwqAtIERS TV9JT0NUTF9YRU5fWkNPUFlfRFVNQl9UT19SRUZTCj4gPiA+ID4gPiA+ICDCoC0gRFJNX0lPQ1RM X1hFTl9aQ09QWV9EVU1CX1dBSVRfRlJFRQo+ID4gPiA+ID4gcy9EVU1CL0RNQV9CVUYvIHBsZWFz ZS4gVGhpcyBpcyBnZW5lcmljIGRtYS1idWYsIGl0IGhhcyBub3RoaW5nIHRvIGRvIHdpdGgKPiA+ ID4gPiA+IHRoZSBkdW1iIHNjYW5vdXQgYnVmZmVyIHN1cHBvcnQgaW4gdGhlIGRybS9nZnggc3Vi c3lzdGVtLiBUaGlzIGhlcmUgY2FuIGJlCj4gPiA+ID4gPiB1c2VkIGZvciBhbnkgemNvcHkgc2hh cmluZyBhbW9uZyBndWVzdHMgKGFzIGxvbmcgYXMgeW91ciBlbmRwb2ludHMKPiA+ID4gPiA+IHVu ZGVyc3RhbmRzIGRtYS1idWYsIHdoaWNoIG1vc3QgcmVsZXZhbnQgZHJpdmVycyBkbykuCj4gPiA+ ID4gT2YgY291cnNlLCBwbGVhc2Ugc2VlIGFib3ZlCj4gPiA+ID4gPiAtRGFuaWVsCj4gPiA+ID4g PiAKPiA+ID4gPiA+ID4gQmFsbG9vbiBkcml2ZXIgZXh0ZW5zaW9uLCB3aGljaCBpcyBuZWVkZWQg Zm9yIGNvbnRpZ3VvdXMvRE1BCj4gPiA+ID4gPiA+IGJ1ZmZlcnMsIHdpbGwgYmUgdG8gcHJvdmlk ZSBuZXcgKmtlcm5lbCBBUEkqLCBubyBVQVBJIGlzIG5lZWRlZC4KPiA+ID4gPiA+ID4gCj4gPiA+ ID4gPiA+ID4gV2VpLgo+ID4gPiA+ID4gPiBUaGFuayB5b3UsCj4gPiA+ID4gPiA+IE9sZWtzYW5k cgo+ID4gPiA+ID4gPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwo+ID4gPiA+ID4gPiBkcmktZGV2ZWwgbWFpbGluZyBsaXN0Cj4gPiA+ID4gPiA+IGRyaS1k ZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKPiA+ID4gPiA+ID4gaHR0cHM6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwKPiA+IAo+ID4gX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiA+IGRyaS1kZXZlbCBtYWls aW5nIGxpc3QKPiA+IGRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKPiA+IGh0dHBzOi8v bGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCj4gCj4gLS0g Cj4gRGFuaWVsIFZldHRlcgo+IFNvZnR3YXJlIEVuZ2luZWVyLCBJbnRlbCBDb3Jwb3JhdGlvbgo+ IGh0dHA6Ly9ibG9nLmZmd2xsLmNoCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVk ZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2RyaS1kZXZlbAo=