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.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, 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 B4B16C282CB for ; Tue, 5 Feb 2019 10:45:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6D9182175B for ; Tue, 5 Feb 2019 10:45:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="DP0i5jvy" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727119AbfBEKpD (ORCPT ); Tue, 5 Feb 2019 05:45:03 -0500 Received: from mail-lj1-f196.google.com ([209.85.208.196]:36775 "EHLO mail-lj1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725934AbfBEKpD (ORCPT ); Tue, 5 Feb 2019 05:45:03 -0500 Received: by mail-lj1-f196.google.com with SMTP id g11-v6so2476824ljk.3 for ; Tue, 05 Feb 2019 02:45:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-transfer-encoding:content-language; bh=pSPg3AljVPOcTEPcPV14eRNuX1Y9nF3vVMj7ndTbM5Q=; b=DP0i5jvya5HdZPuDiWJ90YMxvTRrRNtllT34RqaP3McfFw5EuEiKMrPKq3cp3SeWVl Uc9fOysxDCL8JKFgBpMI0rNu/gpwiZQRWA42muHcfnop7GhAivgOywnOkf8vdrtsV83+ ZL8okK2rXD/HoeHtMQXL2sKu5pb7sWZdj7TmJo7QnZ636TL4fmzFgbHLw52Q9tImSCOm AzmwbwaPZYFkeoZ27PhP0eQM7Fp3choahhMkG1fPMX+cYYxi7q2sSqAN3S8cpmYMh6tB 24Yy0CqB5bGOZsQynDaRR8VVn8ug8erlYcxDzD0mXAqNmMKcWl2BGEZ0MSZpTFjXWH9x a32A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=pSPg3AljVPOcTEPcPV14eRNuX1Y9nF3vVMj7ndTbM5Q=; b=kYL3KuTeWGxQotGIVrfquyeCD+X98B6l2xvgqZuth5L2jojR9RRWBsBO1iVW5Q6C7l lDYGnfJ/SaDV9B+cHFZB0H0wsUT6sohg4sUQxRnvr9Kb2gLbpou8SUOoIrbUwqVsglqx mAZ+U4EeJ0ve3D3l1rNEzE8j+OFsV9UIzPfWbI7yiyHaktOm/esYvXD1XqqH2cc4xucg sEpbluBQX30U2MWdfuWx4X7csS16xWUjJgrDjMy1YmVCvSNa4DCFaqvQ4B4kkabNcXVb BzQL9lTW9MMCFCVJnJyMEj+FIvqy0R1w8xw/AQZIo34YvfC70IYz+3iChbTKuX8oyjOW GbEw== X-Gm-Message-State: AHQUAubaR1fSNaXZccqhaEjxlM6hne6UvOFi2FAdp4UOjqBKu+6IVsBo okq/gcAbOc2sSvFfu8+/32s= X-Google-Smtp-Source: AHgI3IbLN6mvytgfg9d97UsJT8Mq2rqfjN/5gSxeeHkKXnZpjttQFb7lc4jBeBoX7VdvWQBk/pdcEQ== X-Received: by 2002:a2e:750a:: with SMTP id q10-v6mr2273263ljc.39.1549363499947; Tue, 05 Feb 2019 02:44:59 -0800 (PST) Received: from [10.17.182.20] (ll-22.209.223.85.sovam.net.ua. [85.223.209.22]) by smtp.gmail.com with ESMTPSA id l3-v6sm3246032ljg.21.2019.02.05.02.44.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Feb 2019 02:44:59 -0800 (PST) Subject: Re: [Xen-devel][PATCH v4 1/1] cameraif: add ABI for para-virtual camera To: Hans Verkuil , Oleksandr Andrushchenko , "xen-devel@lists.xenproject.org" , "konrad.wilk@oracle.com" , "jgross@suse.com" , "boris.ostrovsky@oracle.com" , "mchehab@kernel.org" , "linux-media@vger.kernel.org" , "sakari.ailus@linux.intel.com" , "koji.matsuoka.xm@renesas.com" References: <20190115093853.15495-1-andr2000@gmail.com> <20190115093853.15495-2-andr2000@gmail.com> <393f824d-e543-476c-777f-402bcc1c0bcb@xs4all.nl> <1152536e-9238-4192-653e-b784b34b8a0d@epam.com> From: Oleksandr Andrushchenko Message-ID: Date: Tue, 5 Feb 2019 12:44:57 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org On 2/5/19 11:34 AM, Hans Verkuil wrote: > On 2/5/19 9:48 AM, Oleksandr Andrushchenko wrote: >> On 1/23/19 10:14 AM, Oleksandr Andrushchenko wrote: >>> Any comments from Xen community? >>> Konrad? >> While I am still looking forward to any comments from Xen community... >>> On 1/15/19 4:44 PM, Hans Verkuil wrote: >>>> Hi Oleksandr, >>>> >>>> Just two remaining comments: >>>> >>>> On 1/15/19 10:38 AM, Oleksandr Andrushchenko wrote: >>>>> From: Oleksandr Andrushchenko >>>>> >>>>> This is the ABI for the two halves of a para-virtualized >>>>> camera driver which extends Xen's reach multimedia capabilities even >>>>> farther enabling it for video conferencing, In-Vehicle Infotainment, >>>>> high definition maps etc. >>>>> >>>>> The initial goal is to support most needed functionality with the >>>>> final idea to make it possible to extend the protocol if need be: >>>>> >>>>> 1. Provide means for base virtual device configuration: >>>>>    - pixel formats >>>>>    - resolutions >>>>>    - frame rates >>>>> 2. Support basic camera controls: >>>>>    - contrast >>>>>    - brightness >>>>>    - hue >>>>>    - saturation >>>>> 3. Support streaming control >>>>> >>>>> Signed-off-by: Oleksandr Andrushchenko >>>>> --- >>>>>    xen/include/public/io/cameraif.h | 1364 ++++++++++++++++++++++++++++++ >>>>>    1 file changed, 1364 insertions(+) >>>>>    create mode 100644 xen/include/public/io/cameraif.h >>>>> >>>>> diff --git a/xen/include/public/io/cameraif.h b/xen/include/public/io/cameraif.h >>>>> new file mode 100644 >>>>> index 000000000000..246eb2457f40 >>>>> --- /dev/null >>>>> +++ b/xen/include/public/io/cameraif.h >>>>> @@ -0,0 +1,1364 @@ >>>> >>>> >>>>> +/* >>>>> + ****************************************************************************** >>>>> + *                                 EVENT CODES >>>>> + ****************************************************************************** >>>>> + */ >>>>> +#define XENCAMERA_EVT_FRAME_AVAIL      0x00 >>>>> +#define XENCAMERA_EVT_CTRL_CHANGE      0x01 >>>>> + >>>>> +/* Resolution has changed. */ >>>>> +#define XENCAMERA_EVT_CFG_FLG_RESOL    (1 << 0) >>>> I think this flag is a left-over from v2 and should be removed. >>>> >>>> >>>> >>>>> + * Request number of buffers to be used: >>>>> + *         0                1                 2               3        octet >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * |               id                | _OP_BUF_REQUEST|   reserved     | 4 >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * |                             reserved                              | 8 >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * |    num_bufs    |                     reserved                     | 12 >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * |                             reserved                              | 16 >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * |                             reserved                              | 64 >>>>> + * +----------------+----------------+----------------+----------------+ >>>>> + * >>>>> + * num_bufs - uint8_t, desired number of buffers to be used. This is >>>>> + *   limited to the value configured in XenStore.max-buffers. >>>>> + *   Passing zero num_bufs in this request (after streaming has stopped >>>>> + *   and all buffers destroyed) unblocks camera configuration changes. >>>> I think the phrase 'unblocks camera configuration changes' is confusing. >>>> >>>> In v3 this sentence came after the third note below, and so it made sense >>>> in that context, but now the order has been reversed and it became hard to >>>> understand. >>>> >>>> I'm not sure what the best approach is to fix this. One option is to remove >>>> the third note and integrate it somehow in the sentence above. Or perhaps >>>> do away with the 'notes' at all and just write a more extensive documentation >>>> for this op. I leave that up to you. >> Hans, how about: >> >>  * num_bufs - uint8_t, desired number of buffers to be used. >>  * >>  * The number of buffers in this request must not exceed the value configured >>  * in XenStore.max-buffers. If the number of buffers is not zero then after this >>  * request the camera configuration cannot be changed. In order to allow camera >>  * (re)configuration this request must be sent with num_bufs set to zero and >>  * the streaming must be stopped and buffers destroyed. >>  * It is allowed for the frontend to send multiple XENCAMERA_OP_BUF_REQUEST >>  * requests before sending XENCAMERA_OP_STREAM_START request to update or >>  * tune the final configuration. >>  * Frontend is responsible for checking the corresponding response in order to >>  * see if the values reported back by the backend do match the desired ones >>  * and can be accepted. >>  * >>  * See response format for this request. >>  */ > Hmm, it still is awkward. Part of the reason for that is that VIDIOC_REQBUFS > is just weird in that a value of 0 has a special meaning. > > Perhaps it would be much cleaner for the Xen implementation to just add a new > OP: _OP_FREE_ALL_BUFS (or perhaps _RELEASE_ALL_BUFS) that effectively does > VIDIOC_REQBUFS with a 0 count value. And this OP_BUF_REQUEST (wouldn't > OP_REQUEST_BUFS be a better name?) I have all operation categorized, e.g. there are commands for configuration (XENCAMERA_OP_CONFIG_XXX), buffer handling (XENCAMERA_OP_BUF_XXX) etc., so I prefer to keep the name as is. > would then do nothing or return an error > if num_bufs == 0. > > If you don't want to create a new Xen op, then I would change the text some > more since you do not actually explain what the op does if num_bufs is 0. Well, I tend to keep this as is with no additional op. > > I would write something like this: > > If num_bufs is greater than 0, then . > > If num_bufs is equal to 0, then . > > If num_bufs is not zero then after this request the camera configuration > cannot be changed. In order to allow camera (re)configuration this request > must be sent with num_bufs set to zero and the streaming must be stopped > and buffers destroyed. Next try:  * num_bufs - uint8_t, desired number of buffers to be used.  *  * If num_bufs is not zero then the backend validates the requested number of  * buffers and responds with the number of buffers allowed for this frontend.  * Frontend is responsible for checking the corresponding response in order to  * see if the values reported back by the backend do match the desired ones  * and can be accepted.  * Frontend is allowed to send multiple XENCAMERA_OP_BUF_REQUEST requests  * before sending XENCAMERA_OP_STREAM_START request to update or tune the  * final configuration.  * Frontend is not allowed to change the number of buffers and/or camera  * configuration after the streaming has started.  *  * In order to allow camera (re)configuration this request must be sent with  * num_bufs set to zero and the streaming must be stopped and buffers destroyed.  *  * Please note, that the number of buffers in this request must not exceed  * the value configured in XenStore.max-buffers.  *  * See response format for this request. > Regards, > > Hans > >>>>> + * >>>>> + * See response format for this request. >>>>> + * >>>>> + * Notes: >>>>> + *  - frontend must check the corresponding response in order to see >>>>> + *    if the values reported back by the backend do match the desired ones >>>>> + *    and can be accepted. >>>>> + *  - frontend may send multiple XENCAMERA_OP_BUF_REQUEST requests before >>>>> + *    sending XENCAMERA_OP_STREAM_START request to update or tune the >>>>> + *    configuration. >>>>> + *  - after this request camera configuration cannot be changed, unless >>>> camera configuration -> the camera configuration >>>> >>>>> + *    streaming is stopped and buffers destroyed >>>>> + */ >>>> Regards, >>>> >>>>     Hans From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [PATCH v4 1/1] cameraif: add ABI for para-virtual camera Date: Tue, 5 Feb 2019 12:44:57 +0200 Message-ID: References: <20190115093853.15495-1-andr2000@gmail.com> <20190115093853.15495-2-andr2000@gmail.com> <393f824d-e543-476c-777f-402bcc1c0bcb@xs4all.nl> <1152536e-9238-4192-653e-b784b34b8a0d@epam.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1gqyDv-0000ss-UN for xen-devel@lists.xenproject.org; Tue, 05 Feb 2019 10:45:03 +0000 Received: by mail-lj1-x241.google.com with SMTP id k15-v6so2442408ljc.8 for ; Tue, 05 Feb 2019 02:45:01 -0800 (PST) In-Reply-To: Content-Language: en-US List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Hans Verkuil , Oleksandr Andrushchenko , "xen-devel@lists.xenproject.org" , "konrad.wilk@oracle.com" , "jgross@suse.com" , "boris.ostrovsky@oracle.com" , "mchehab@kernel.org" , "linux-media@vger.kernel.org" , "sakari.ailus@linux.intel.com" , "koji.matsuoka.xm@renesas.com" List-Id: xen-devel@lists.xenproject.org T24gMi81LzE5IDExOjM0IEFNLCBIYW5zIFZlcmt1aWwgd3JvdGU6Cj4gT24gMi81LzE5IDk6NDgg QU0sIE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIHdyb3RlOgo+PiBPbiAxLzIzLzE5IDEwOjE0IEFN LCBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyB3cm90ZToKPj4+IEFueSBjb21tZW50cyBmcm9tIFhl biBjb21tdW5pdHk/Cj4+PiBLb25yYWQ/Cj4+IFdoaWxlIEkgYW0gc3RpbGwgbG9va2luZyBmb3J3 YXJkIHRvIGFueSBjb21tZW50cyBmcm9tIFhlbiBjb21tdW5pdHkuLi4KPj4+IE9uIDEvMTUvMTkg NDo0NCBQTSwgSGFucyBWZXJrdWlsIHdyb3RlOgo+Pj4+IEhpIE9sZWtzYW5kciwKPj4+Pgo+Pj4+ IEp1c3QgdHdvIHJlbWFpbmluZyBjb21tZW50czoKPj4+Pgo+Pj4+IE9uIDEvMTUvMTkgMTA6Mzgg QU0sIE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIHdyb3RlOgo+Pj4+PiBGcm9tOiBPbGVrc2FuZHIg QW5kcnVzaGNoZW5rbyA8b2xla3NhbmRyX2FuZHJ1c2hjaGVua29AZXBhbS5jb20+Cj4+Pj4+Cj4+ Pj4+IFRoaXMgaXMgdGhlIEFCSSBmb3IgdGhlIHR3byBoYWx2ZXMgb2YgYSBwYXJhLXZpcnR1YWxp emVkCj4+Pj4+IGNhbWVyYSBkcml2ZXIgd2hpY2ggZXh0ZW5kcyBYZW4ncyByZWFjaCBtdWx0aW1l ZGlhIGNhcGFiaWxpdGllcyBldmVuCj4+Pj4+IGZhcnRoZXIgZW5hYmxpbmcgaXQgZm9yIHZpZGVv IGNvbmZlcmVuY2luZywgSW4tVmVoaWNsZSBJbmZvdGFpbm1lbnQsCj4+Pj4+IGhpZ2ggZGVmaW5p dGlvbiBtYXBzIGV0Yy4KPj4+Pj4KPj4+Pj4gVGhlIGluaXRpYWwgZ29hbCBpcyB0byBzdXBwb3J0 IG1vc3QgbmVlZGVkIGZ1bmN0aW9uYWxpdHkgd2l0aCB0aGUKPj4+Pj4gZmluYWwgaWRlYSB0byBt YWtlIGl0IHBvc3NpYmxlIHRvIGV4dGVuZCB0aGUgcHJvdG9jb2wgaWYgbmVlZCBiZToKPj4+Pj4K Pj4+Pj4gMS4gUHJvdmlkZSBtZWFucyBmb3IgYmFzZSB2aXJ0dWFsIGRldmljZSBjb25maWd1cmF0 aW9uOgo+Pj4+PiAgwqDCoCAtIHBpeGVsIGZvcm1hdHMKPj4+Pj4gIMKgwqAgLSByZXNvbHV0aW9u cwo+Pj4+PiAgwqDCoCAtIGZyYW1lIHJhdGVzCj4+Pj4+IDIuIFN1cHBvcnQgYmFzaWMgY2FtZXJh IGNvbnRyb2xzOgo+Pj4+PiAgwqDCoCAtIGNvbnRyYXN0Cj4+Pj4+ICDCoMKgIC0gYnJpZ2h0bmVz cwo+Pj4+PiAgwqDCoCAtIGh1ZQo+Pj4+PiAgwqDCoCAtIHNhdHVyYXRpb24KPj4+Pj4gMy4gU3Vw cG9ydCBzdHJlYW1pbmcgY29udHJvbAo+Pj4+Pgo+Pj4+PiBTaWduZWQtb2ZmLWJ5OiBPbGVrc2Fu ZHIgQW5kcnVzaGNoZW5rbyA8b2xla3NhbmRyX2FuZHJ1c2hjaGVua29AZXBhbS5jb20+Cj4+Pj4+ IC0tLQo+Pj4+PiAgwqDCoCB4ZW4vaW5jbHVkZS9wdWJsaWMvaW8vY2FtZXJhaWYuaCB8IDEzNjQg KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4+Pj4+ICDCoMKgIDEgZmlsZSBjaGFuZ2Vk LCAxMzY0IGluc2VydGlvbnMoKykKPj4+Pj4gIMKgwqAgY3JlYXRlIG1vZGUgMTAwNjQ0IHhlbi9p bmNsdWRlL3B1YmxpYy9pby9jYW1lcmFpZi5oCj4+Pj4+Cj4+Pj4+IGRpZmYgLS1naXQgYS94ZW4v aW5jbHVkZS9wdWJsaWMvaW8vY2FtZXJhaWYuaCBiL3hlbi9pbmNsdWRlL3B1YmxpYy9pby9jYW1l cmFpZi5oCj4+Pj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+Pj4+IGluZGV4IDAwMDAwMDAwMDAw MC4uMjQ2ZWIyNDU3ZjQwCj4+Pj4+IC0tLSAvZGV2L251bGwKPj4+Pj4gKysrIGIveGVuL2luY2x1 ZGUvcHVibGljL2lvL2NhbWVyYWlmLmgKPj4+Pj4gQEAgLTAsMCArMSwxMzY0IEBACj4+Pj4gPHNu aXA+Cj4+Pj4KPj4+Pj4gKy8qCj4+Pj4+ICsgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCj4+Pj4+ICsg KsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgRVZFTlQgQ09ERVMKPj4+Pj4gKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKPj4+Pj4g KyAqLwo+Pj4+PiArI2RlZmluZSBYRU5DQU1FUkFfRVZUX0ZSQU1FX0FWQUlMwqDCoMKgwqDCoCAw eDAwCj4+Pj4+ICsjZGVmaW5lIFhFTkNBTUVSQV9FVlRfQ1RSTF9DSEFOR0XCoMKgwqDCoMKgIDB4 MDEKPj4+Pj4gKwo+Pj4+PiArLyogUmVzb2x1dGlvbiBoYXMgY2hhbmdlZC4gKi8KPj4+Pj4gKyNk ZWZpbmUgWEVOQ0FNRVJBX0VWVF9DRkdfRkxHX1JFU09MwqDCoMKgICgxIDw8IDApCj4+Pj4gSSB0 aGluayB0aGlzIGZsYWcgaXMgYSBsZWZ0LW92ZXIgZnJvbSB2MiBhbmQgc2hvdWxkIGJlIHJlbW92 ZWQuCj4+Pj4KPj4+PiA8c25pcD4KPj4+Pgo+Pj4+PiArICogUmVxdWVzdCBudW1iZXIgb2YgYnVm ZmVycyB0byBiZSB1c2VkOgo+Pj4+PiArICrCoMKgwqDCoMKgwqDCoMKgIDDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgMcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDLCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIDPCoMKgwqDCoMKgwqDCoCBvY3RldAo+Pj4+PiArICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCj4+Pj4+ICsgKiB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8IF9PUF9CVUZfUkVRVUVTVHzCoMKgIHJlc2Vy dmVkwqDCoMKgwqAgfCA0Cj4+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+Pj4gKyAqIHzCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXNlcnZl ZMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgfCA4Cj4+Pj4+ICsgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKPj4+Pj4gKyAqIHzCoMKgwqAgbnVtX2J1ZnPC oMKgwqAgfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmVzZXJ2ZWTC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwgMTIKPj4+Pj4gKyAqICst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKwo+Pj4+PiArICogfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJlc2VydmVkwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8IDE2Cj4+Pj4+ICsgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKPj4+Pj4gKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAo+Pj4+PiArICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCj4+Pj4+ICsg KiB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgcmVzZXJ2ZWTCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHwgNjQKPj4+Pj4gKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwo+Pj4+PiArICoKPj4+Pj4g KyAqIG51bV9idWZzIC0gdWludDhfdCwgZGVzaXJlZCBudW1iZXIgb2YgYnVmZmVycyB0byBiZSB1 c2VkLiBUaGlzIGlzCj4+Pj4+ICsgKsKgwqAgbGltaXRlZCB0byB0aGUgdmFsdWUgY29uZmlndXJl ZCBpbiBYZW5TdG9yZS5tYXgtYnVmZmVycy4KPj4+Pj4gKyAqwqDCoCBQYXNzaW5nIHplcm8gbnVt X2J1ZnMgaW4gdGhpcyByZXF1ZXN0IChhZnRlciBzdHJlYW1pbmcgaGFzIHN0b3BwZWQKPj4+Pj4g KyAqwqDCoCBhbmQgYWxsIGJ1ZmZlcnMgZGVzdHJveWVkKSB1bmJsb2NrcyBjYW1lcmEgY29uZmln dXJhdGlvbiBjaGFuZ2VzLgo+Pj4+IEkgdGhpbmsgdGhlIHBocmFzZSAndW5ibG9ja3MgY2FtZXJh IGNvbmZpZ3VyYXRpb24gY2hhbmdlcycgaXMgY29uZnVzaW5nLgo+Pj4+Cj4+Pj4gSW4gdjMgdGhp cyBzZW50ZW5jZSBjYW1lIGFmdGVyIHRoZSB0aGlyZCBub3RlIGJlbG93LCBhbmQgc28gaXQgbWFk ZSBzZW5zZQo+Pj4+IGluIHRoYXQgY29udGV4dCwgYnV0IG5vdyB0aGUgb3JkZXIgaGFzIGJlZW4g cmV2ZXJzZWQgYW5kIGl0IGJlY2FtZSBoYXJkIHRvCj4+Pj4gdW5kZXJzdGFuZC4KPj4+Pgo+Pj4+ IEknbSBub3Qgc3VyZSB3aGF0IHRoZSBiZXN0IGFwcHJvYWNoIGlzIHRvIGZpeCB0aGlzLiBPbmUg b3B0aW9uIGlzIHRvIHJlbW92ZQo+Pj4+IHRoZSB0aGlyZCBub3RlIGFuZCBpbnRlZ3JhdGUgaXQg c29tZWhvdyBpbiB0aGUgc2VudGVuY2UgYWJvdmUuIE9yIHBlcmhhcHMKPj4+PiBkbyBhd2F5IHdp dGggdGhlICdub3RlcycgYXQgYWxsIGFuZCBqdXN0IHdyaXRlIGEgbW9yZSBleHRlbnNpdmUgZG9j dW1lbnRhdGlvbgo+Pj4+IGZvciB0aGlzIG9wLiBJIGxlYXZlIHRoYXQgdXAgdG8geW91Lgo+PiBI YW5zLCBob3cgYWJvdXQ6Cj4+Cj4+ICDCoCogbnVtX2J1ZnMgLSB1aW50OF90LCBkZXNpcmVkIG51 bWJlciBvZiBidWZmZXJzIHRvIGJlIHVzZWQuCj4+ICDCoCoKPj4gIMKgKiBUaGUgbnVtYmVyIG9m IGJ1ZmZlcnMgaW4gdGhpcyByZXF1ZXN0IG11c3Qgbm90IGV4Y2VlZCB0aGUgdmFsdWUgY29uZmln dXJlZAo+PiAgwqAqIGluIFhlblN0b3JlLm1heC1idWZmZXJzLiBJZiB0aGUgbnVtYmVyIG9mIGJ1 ZmZlcnMgaXMgbm90IHplcm8gdGhlbiBhZnRlciB0aGlzCj4+ICDCoCogcmVxdWVzdCB0aGUgY2Ft ZXJhIGNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIGNoYW5nZWQuIEluIG9yZGVyIHRvIGFsbG93IGNh bWVyYQo+PiAgwqAqIChyZSljb25maWd1cmF0aW9uIHRoaXMgcmVxdWVzdCBtdXN0IGJlIHNlbnQg d2l0aCBudW1fYnVmcyBzZXQgdG8gemVybyBhbmQKPj4gIMKgKiB0aGUgc3RyZWFtaW5nIG11c3Qg YmUgc3RvcHBlZCBhbmQgYnVmZmVycyBkZXN0cm95ZWQuCj4+ICDCoCogSXQgaXMgYWxsb3dlZCBm b3IgdGhlIGZyb250ZW5kIHRvIHNlbmQgbXVsdGlwbGUgWEVOQ0FNRVJBX09QX0JVRl9SRVFVRVNU Cj4+ICDCoCogcmVxdWVzdHMgYmVmb3JlIHNlbmRpbmcgWEVOQ0FNRVJBX09QX1NUUkVBTV9TVEFS VCByZXF1ZXN0IHRvIHVwZGF0ZSBvcgo+PiAgwqAqIHR1bmUgdGhlIGZpbmFsIGNvbmZpZ3VyYXRp b24uCj4+ICDCoCogRnJvbnRlbmQgaXMgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHRoZSBjb3Jy ZXNwb25kaW5nIHJlc3BvbnNlIGluIG9yZGVyIHRvCj4+ICDCoCogc2VlIGlmIHRoZSB2YWx1ZXMg cmVwb3J0ZWQgYmFjayBieSB0aGUgYmFja2VuZCBkbyBtYXRjaCB0aGUgZGVzaXJlZCBvbmVzCj4+ ICDCoCogYW5kIGNhbiBiZSBhY2NlcHRlZC4KPj4gIMKgKgo+PiAgwqAqIFNlZSByZXNwb25zZSBm b3JtYXQgZm9yIHRoaXMgcmVxdWVzdC4KPj4gIMKgKi8KPiBIbW0sIGl0IHN0aWxsIGlzIGF3a3dh cmQuIFBhcnQgb2YgdGhlIHJlYXNvbiBmb3IgdGhhdCBpcyB0aGF0IFZJRElPQ19SRVFCVUZTCj4g aXMganVzdCB3ZWlyZCBpbiB0aGF0IGEgdmFsdWUgb2YgMCBoYXMgYSBzcGVjaWFsIG1lYW5pbmcu Cj4KPiBQZXJoYXBzIGl0IHdvdWxkIGJlIG11Y2ggY2xlYW5lciBmb3IgdGhlIFhlbiBpbXBsZW1l bnRhdGlvbiB0byBqdXN0IGFkZCBhIG5ldwo+IE9QOiBfT1BfRlJFRV9BTExfQlVGUyAob3IgcGVy aGFwcyBfUkVMRUFTRV9BTExfQlVGUykgdGhhdCBlZmZlY3RpdmVseSBkb2VzCj4gVklESU9DX1JF UUJVRlMgd2l0aCBhIDAgY291bnQgdmFsdWUuIEFuZCB0aGlzIE9QX0JVRl9SRVFVRVNUICh3b3Vs ZG4ndAo+IE9QX1JFUVVFU1RfQlVGUyBiZSBhIGJldHRlciBuYW1lPykKSSBoYXZlIGFsbCBvcGVy YXRpb24gY2F0ZWdvcml6ZWQsIGUuZy4gdGhlcmUgYXJlIGNvbW1hbmRzCmZvciBjb25maWd1cmF0 aW9uIChYRU5DQU1FUkFfT1BfQ09ORklHX1hYWCksCmJ1ZmZlciBoYW5kbGluZyAoWEVOQ0FNRVJB X09QX0JVRl9YWFgpIGV0Yy4sIHNvIEkgcHJlZmVyIHRvCmtlZXAgdGhlIG5hbWUgYXMgaXMuCj4g ICB3b3VsZCB0aGVuIGRvIG5vdGhpbmcgb3IgcmV0dXJuIGFuIGVycm9yCj4gaWYgbnVtX2J1ZnMg PT0gMC4KPgo+IElmIHlvdSBkb24ndCB3YW50IHRvIGNyZWF0ZSBhIG5ldyBYZW4gb3AsIHRoZW4g SSB3b3VsZCBjaGFuZ2UgdGhlIHRleHQgc29tZQo+IG1vcmUgc2luY2UgeW91IGRvIG5vdCBhY3R1 YWxseSBleHBsYWluIHdoYXQgdGhlIG9wIGRvZXMgaWYgbnVtX2J1ZnMgaXMgMC4KV2VsbCwgSSB0 ZW5kIHRvIGtlZXAgdGhpcyBhcyBpcyB3aXRoIG5vIGFkZGl0aW9uYWwgb3AuCj4KPiBJIHdvdWxk IHdyaXRlIHNvbWV0aGluZyBsaWtlIHRoaXM6Cj4KPiBJZiBudW1fYnVmcyBpcyBncmVhdGVyIHRo YW4gMCwgdGhlbiA8ZGVzY3JpYmUgd2hhdCBoYXBwZW5zPi4KPgo+IElmIG51bV9idWZzIGlzIGVx dWFsIHRvIDAsIHRoZW4gPGRlc2NyaWJlIHdoYXQgaGFwcGVucz4uCj4KPiBJZiBudW1fYnVmcyBp cyBub3QgemVybyB0aGVuIGFmdGVyIHRoaXMgcmVxdWVzdCB0aGUgY2FtZXJhIGNvbmZpZ3VyYXRp b24KPiBjYW5ub3QgYmUgY2hhbmdlZC4gSW4gb3JkZXIgdG8gYWxsb3cgY2FtZXJhIChyZSljb25m aWd1cmF0aW9uIHRoaXMgcmVxdWVzdAo+IG11c3QgYmUgc2VudCB3aXRoIG51bV9idWZzIHNldCB0 byB6ZXJvIGFuZCB0aGUgc3RyZWFtaW5nIG11c3QgYmUgc3RvcHBlZAo+IGFuZCBidWZmZXJzIGRl c3Ryb3llZC4KTmV4dCB0cnk6CgogwqAqIG51bV9idWZzIC0gdWludDhfdCwgZGVzaXJlZCBudW1i ZXIgb2YgYnVmZmVycyB0byBiZSB1c2VkLgogwqAqCiDCoCogSWYgbnVtX2J1ZnMgaXMgbm90IHpl cm8gdGhlbiB0aGUgYmFja2VuZCB2YWxpZGF0ZXMgdGhlIHJlcXVlc3RlZCAKbnVtYmVyIG9mCiDC oCogYnVmZmVycyBhbmQgcmVzcG9uZHMgd2l0aCB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb3dl ZCBmb3IgdGhpcyAKZnJvbnRlbmQuCiDCoCogRnJvbnRlbmQgaXMgcmVzcG9uc2libGUgZm9yIGNo ZWNraW5nIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlIGluIApvcmRlciB0bwogwqAqIHNlZSBp ZiB0aGUgdmFsdWVzIHJlcG9ydGVkIGJhY2sgYnkgdGhlIGJhY2tlbmQgZG8gbWF0Y2ggdGhlIGRl c2lyZWQgb25lcwogwqAqIGFuZCBjYW4gYmUgYWNjZXB0ZWQuCiDCoCogRnJvbnRlbmQgaXMgYWxs b3dlZCB0byBzZW5kIG11bHRpcGxlIFhFTkNBTUVSQV9PUF9CVUZfUkVRVUVTVCByZXF1ZXN0cwog wqAqIGJlZm9yZSBzZW5kaW5nIFhFTkNBTUVSQV9PUF9TVFJFQU1fU1RBUlQgcmVxdWVzdCB0byB1 cGRhdGUgb3IgdHVuZSB0aGUKIMKgKiBmaW5hbCBjb25maWd1cmF0aW9uLgogwqAqIEZyb250ZW5k IGlzIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgYW5kL29yIGNh bWVyYQogwqAqIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgdGhlIHN0cmVhbWluZyBoYXMgc3RhcnRlZC4K IMKgKgogwqAqIEluIG9yZGVyIHRvIGFsbG93IGNhbWVyYSAocmUpY29uZmlndXJhdGlvbiB0aGlz IHJlcXVlc3QgbXVzdCBiZSBzZW50IAp3aXRoCiDCoCogbnVtX2J1ZnMgc2V0IHRvIHplcm8gYW5k IHRoZSBzdHJlYW1pbmcgbXVzdCBiZSBzdG9wcGVkIGFuZCBidWZmZXJzIApkZXN0cm95ZWQuCiDC oCoKIMKgKiBQbGVhc2Ugbm90ZSwgdGhhdCB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhpcyBy ZXF1ZXN0IG11c3Qgbm90IGV4Y2VlZAogwqAqIHRoZSB2YWx1ZSBjb25maWd1cmVkIGluIFhlblN0 b3JlLm1heC1idWZmZXJzLgogwqAqCiDCoCogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhpcyBy ZXF1ZXN0LgoKPiBSZWdhcmRzLAo+Cj4gCUhhbnMKPgo+Pj4+PiArICoKPj4+Pj4gKyAqIFNlZSBy ZXNwb25zZSBmb3JtYXQgZm9yIHRoaXMgcmVxdWVzdC4KPj4+Pj4gKyAqCj4+Pj4+ICsgKiBOb3Rl czoKPj4+Pj4gKyAqwqAgLSBmcm9udGVuZCBtdXN0IGNoZWNrIHRoZSBjb3JyZXNwb25kaW5nIHJl c3BvbnNlIGluIG9yZGVyIHRvIHNlZQo+Pj4+PiArICrCoMKgwqAgaWYgdGhlIHZhbHVlcyByZXBv cnRlZCBiYWNrIGJ5IHRoZSBiYWNrZW5kIGRvIG1hdGNoIHRoZSBkZXNpcmVkIG9uZXMKPj4+Pj4g KyAqwqDCoMKgIGFuZCBjYW4gYmUgYWNjZXB0ZWQuCj4+Pj4+ICsgKsKgIC0gZnJvbnRlbmQgbWF5 IHNlbmQgbXVsdGlwbGUgWEVOQ0FNRVJBX09QX0JVRl9SRVFVRVNUIHJlcXVlc3RzIGJlZm9yZQo+ Pj4+PiArICrCoMKgwqAgc2VuZGluZyBYRU5DQU1FUkFfT1BfU1RSRUFNX1NUQVJUIHJlcXVlc3Qg dG8gdXBkYXRlIG9yIHR1bmUgdGhlCj4+Pj4+ICsgKsKgwqDCoCBjb25maWd1cmF0aW9uLgo+Pj4+ PiArICrCoCAtIGFmdGVyIHRoaXMgcmVxdWVzdCBjYW1lcmEgY29uZmlndXJhdGlvbiBjYW5ub3Qg YmUgY2hhbmdlZCwgdW5sZXNzCj4+Pj4gY2FtZXJhIGNvbmZpZ3VyYXRpb24gLT4gdGhlIGNhbWVy YSBjb25maWd1cmF0aW9uCj4+Pj4KPj4+Pj4gKyAqwqDCoMKgIHN0cmVhbWluZyBpcyBzdG9wcGVk IGFuZCBidWZmZXJzIGRlc3Ryb3llZAo+Pj4+PiArICovCj4+Pj4gUmVnYXJkcywKPj4+Pgo+Pj4+ ICDCoMKgwqDCoEhhbnMKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0 Lm9yZwpodHRwczovL2xpc3RzLnhlbnByb2plY3Qub3JnL21haWxtYW4vbGlzdGluZm8veGVuLWRl dmVs