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=-15.7 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 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 E4B10C4708F for ; Thu, 3 Jun 2021 03:35:09 +0000 (UTC) Received: from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6ED3E60FF0 for ; Thu, 3 Jun 2021 03:35:09 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6ED3E60FF0 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=virtualization-bounces@lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 324E860ABF; Thu, 3 Jun 2021 03:35:09 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id KA-ActIYZC_X; Thu, 3 Jun 2021 03:35:07 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp3.osuosl.org (Postfix) with ESMTP id 287846058F; Thu, 3 Jun 2021 03:35:07 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id D3B8AC000D; Thu, 3 Jun 2021 03:35:06 +0000 (UTC) Received: from smtp2.osuosl.org (smtp2.osuosl.org [IPv6:2605:bc80:3010::133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 18B59C0001 for ; Thu, 3 Jun 2021 03:35:05 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id E0893404E2 for ; Thu, 3 Jun 2021 03:35:04 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Authentication-Results: smtp2.osuosl.org (amavisd-new); dkim=pass (1024-bit key) header.d=redhat.com Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Yao73CRB2klr for ; Thu, 3 Jun 2021 03:35:03 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by smtp2.osuosl.org (Postfix) with ESMTPS id 7FE7E400B8 for ; Thu, 3 Jun 2021 03:35:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1622691302; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=48L635BSRt1BmHf2HxDC20epOuKm/S3is/vj04LbT5Y=; b=YWwpgHhGbntDkhauNy2qe0v2E/EcF4oA1hC1uC1g8tRQ4kbI0UXQMzinKlU4ADb3eS9DSU XpngJWq6qXOFC0ci2CD4NATjKuDTvcepEpcavji/WkEQ65dYNpb7LR0P/naNYrP+/WWoq1 hZarn4syM3oZ/Kpyelhg7yU9krA1Oh4= Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-439-JsgPYpAiN_WuqYkc6tX5Bg-1; Wed, 02 Jun 2021 23:34:46 -0400 X-MC-Unique: JsgPYpAiN_WuqYkc6tX5Bg-1 Received: by mail-pl1-f197.google.com with SMTP id p7-20020a170902e747b02900ef00d14127so1264522plf.23 for ; Wed, 02 Jun 2021 20:34:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding :content-language; bh=48L635BSRt1BmHf2HxDC20epOuKm/S3is/vj04LbT5Y=; b=TdI6eXNsopFAUw8J50LCUMZzOmZi3AoCWkzmPjNJPGcGl0gTV3R0FGa4sC1i+Ljzi2 6orrGj3tUUwXBVJG/CD8HWSinI6hQDDHqxqP81wK24nv7+A6N6qOo3dAC3XeVJ31J7B8 V84aOsc1IPumVsG9CP9/gIBwSNtvmDGPfQ/mu4e82yKeBbxJaL/sMe2SApvOHodg3XYs 7C437/u2nkpw2p18ZiCb+2UIpr9TNMmbGd3SHKXLTZiZdiiB+AMSez9U/SRoFJA4swBB MlcsmWDIQhLPp/BWFjkXb/25iNxkWPAc6tAfNq1GHwNOt4A9Hwwg7AHMLQaoLKfDVImX T1Bw== X-Gm-Message-State: AOAM5301fYXvYWzf3yk++X4CeQq3VU+a/9r9JRFbt+HRtCDRzhU12uMQ ueG9Pp+pYYUAblsFVmQmY+s5SzsIthySQUXpQyXnKjE3nsH683gjAKhK3boQP9d1ulFYh0hdENS uOVHJCfODwGhQqiGxJdQCvjwoScwDIV/S7EbaB1uBTriGMk3NaiZ98gDugQLkpCodctJx9eHARW QEIlEGbVbB/ZbJUHvVOg== X-Received: by 2002:a17:90b:3a88:: with SMTP id om8mr2502372pjb.99.1622691284392; Wed, 02 Jun 2021 20:34:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzUBWbCDaEeeBsquw/GPmzqzqM4sMD+Sj49eD9YhOIICBq0aLipP5lRhrpxVosRVUQ2YY4BVA== X-Received: by 2002:a17:90b:3a88:: with SMTP id om8mr2502328pjb.99.1622691283914; Wed, 02 Jun 2021 20:34:43 -0700 (PDT) Received: from wangxiaodeMacBook-Air.local ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id y73sm788924pfb.129.2021.06.02.20.34.38 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 02 Jun 2021 20:34:43 -0700 (PDT) Subject: Re: [RFC v3 17/29] vhost: Shadow virtqueue buffers forwarding To: Eugenio Perez Martin References: <20210519162903.1172366-1-eperezma@redhat.com> <20210519162903.1172366-18-eperezma@redhat.com> From: Jason Wang Message-ID: <66d83472-7cde-76e6-5e23-a85037156206@redhat.com> Date: Thu, 3 Jun 2021 11:34:33 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.10.2 MIME-Version: 1.0 In-Reply-To: Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jasowang@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Cc: Parav Pandit , "Michael S. Tsirkin" , Markus Armbruster , qemu-level , Harpreet Singh Anand , Xiao W Wang , Stefan Hajnoczi , Eli Cohen , virtualization@lists.linux-foundation.org, Eric Blake , Michael Lilja X-BeenThere: virtualization@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Linux virtualization List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: virtualization-bounces@lists.linux-foundation.org Sender: "Virtualization" CuWcqCAyMDIxLzYvMyDkuIrljYgxOjE4LCBFdWdlbmlvIFBlcmV6IE1hcnRpbiDlhpnpgZM6Cj4g T24gV2VkLCBKdW4gMiwgMjAyMSBhdCAxMTo1MSBBTSBKYXNvbiBXYW5nIDxqYXNvd2FuZ0ByZWRo YXQuY29tPiB3cm90ZToKPj4KPj4g5ZyoIDIwMjEvNS8yMCDkuIrljYgxMjoyOCwgRXVnZW5pbyBQ w6lyZXog5YaZ6YGTOgo+Pj4gSW5pdGlhbCB2ZXJzaW9uIG9mIHNoYWRvdyB2aXJ0cXVldWUgdGhh dCBhY3R1YWxseSBmb3J3YXJkIGJ1ZmZlcnMuIFRoZQo+Pj4gZXhwb3NlZCBhZGRyZXNzZXMgYXJl IHRoZSBxZW11J3MgdmlydHVhbCBhZGRyZXNzLCBzbyBkZXZpY2VzIHdpdGggSU9NTVUKPj4+IHRo YXQgZG9lcyBub3QgYWxsb3cgZnVsbCBtYXBwaW5nIG9mIHFlbXUncyBhZGRyZXNzIHNwYWNlIGRv ZXMgbm90IHdvcmsKPj4+IGF0IHRoZSBtb21lbnQuCj4+Pgo+Pj4gQWxzbyBmb3Igc2ltcGxpY2l0 eSBpdCBvbmx5IHN1cHBvcnRzIG1vZGVybiBkZXZpY2VzLCB0aGF0IGV4cGVjdHMgdnJpbmcKPj4+ IGluIGxpdHRsZSBlbmRpYW4sIHdpdGggc3BsaXQgcmluZyBhbmQgbm8gZXZlbnQgaWR4IG9yIGlu ZGlyZWN0Cj4+PiBkZXNjcmlwdG9ycy4KPj4+Cj4+PiBJdCByZXVzZXMgdGhlIFZpcnRRdWV1ZSBj b2RlIGZvciB0aGUgZGV2aWNlIHBhcnQuIFRoZSBkcml2ZXIgcGFydCBpcwo+Pj4gYmFzZWQgb24g TGludXgncyB2aXJ0aW9fcmluZyBkcml2ZXIsIGJ1dCB3aXRoIHN0cmlwcGVkIGZ1bmN0aW9uYWxp dHkKPj4+IGFuZCBvcHRpbWl6YXRpb25zIHNvIGl0J3MgZWFzaWVyIHRvIHJldmlldy4KPj4+Cj4+ PiBMYXRlciBjb21taXRzIHdpbGwgc29sdmUgc29tZSBvZiB0aGVzZSBjb25jZXJucy4KPj4KPj4g SXQgd291bGQgYmUgbW9yZSBtb3JlIGVhc2llciB0byByZXZpZXcgaWYgeW91IHNxdWFzaCB0aG9z ZQo+PiAiZW5oYW5jZW1lbnRzIiBpbnRvIHRoaXMgcGF0Y2guCj4+Cj4gT2ssIHRoZXkgd2lsbCBi ZSBpbiB0aGUgc2FtZSBjb21taXQgZm9yIHRoZSBuZXh0IHZlcnNpb24uCj4KPj4+IENvZGUgYWxz byBuZWVkIHRvIG1hcCB1c2VkIHJpbmcgKGRldmljZSBwYXJ0KSBhcyBSVyBpbiwgYW5kIG9ubHkg aW4sCj4+PiB2aG9zdC1uZXQuIFRvIG1hcCAob3IgY2FsbCB2aG9zdF9kZXZpY2VfaW90bGJfbWlz cykgaW5jb25kaXRpb25hbGx5Cj4+PiB3b3VsZCBwcmludCBhbiBlcnJvciBpbiBjYXNlIG9mIHZo b3N0IGRldmljZXMgd2l0aCBpdHMgb3duIG1hcHBpbmcKPj4+ICh2ZHBhKS4KPj4KPj4gSSB0aGlu ayB3ZSBzaG91bGQgbm90IGRlcGVuZCBvbiB0aGUgSU9UTEIgbWlzcy4gSW5zdGVhZCwgd2Ugc2hv dWxkCj4+IHByb2dyYW0gdGhlIGRldmljZSBJT1RMQiBiZWZvcmUgc3RhcnRpbmcgdGhlIHN2cS4g T3IgaXMgdGhlcmUgYW55dGhpbmcKPj4gdGhhdCBwcmV2ZW50IHlvdSBmcm9tIGRvaW5nIHRoaXM/ Cj4+Cj4gU29ycnkgZm9yIGJlaW5nIHVuY2xlYXIsIHRoYXQgaXMgd2hhdCBJIG1lYW50IGluIHRo ZSBtZXNzYWdlOiBObyBvdGhlcgo+IGRldmljZSB0aGFuIGtlcm5lbCB2aG9zdCBuZWVkcyB0aGUg bWFwIChhcyAic2VudCBpb3RsYiBtaXNzIGFoZWFkIiksCj4gc28gd2UgbXVzdCBtYWtlIGl0IGNv bmRpdGlvbmFsLiBEb2luZyBpdCB1bmNvbmRpdGlvbmFsbHkgd291bGQgbWFrZQo+IG5vdGhpbmcg YnV0IGFuIGVycm9yIGFwcGVhciBvbiB0aGUgc2NyZWVuLCBidXQgaXQgaXMgaW5jb3JyZWN0IGFu eXdheS4KPgo+IElzIGl0IGNsZWFyZXIgdGhpcyB3YXk/CgoKU28gd2hhdCBJJ20gd29ycnlpbmcg aXMgdGhlIGZvbGxvd2luZyBjb2RlOgoKaW50IHZob3N0X2RldmljZV9pb3RsYl9taXNzKHN0cnVj dCB2aG9zdF9kZXYgKmRldiwgdWludDY0X3QgaW92YSwgaW50IHdyaXRlKQp7Ci4uLgoKIMKgwqDC oCBpZiAoZGV2LT5zaGFkb3dfdnFzX2VuYWJsZWQpIHsKIMKgwqDCoMKgwqDCoMKgIC8qIFNoYWRv dyB2aXJ0cXVldWUgdHJhbnNsYXRpb25zIGluIGl0cyBWaXJ0dWFsIEFkZHJlc3MgU3BhY2UgKi8K IMKgwqDCoMKgwqDCoMKgIGNvbnN0IFZob3N0RE1BTWFwICpyZXN1bHQ7CiDCoMKgwqDCoMKgwqDC oCBjb25zdCBWaG9zdERNQU1hcCBuZWVkbGUgPSB7CiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC5p b3ZhID0gaW92YSwKIMKgwqDCoMKgwqDCoMKgIH07CgogwqDCoMKgwqDCoMKgwqAgcmVzdWx0ID0g dmhvc3RfaW92YV90cmVlX2ZpbmRfdGFkZHIoJmRldi0+aW92YV9tYXAsICZuZWVkbGUpOwogwqDC oMKgIMKgwqDCoCAuLi4KCn0KCkkgd29uZGVyIHRoZSByZWFzb24gZm9yIGRvaW5nIHRoYXQgKHNv cnJ5IGlmIEkndmUgYXNrZWQgdGhpcyBpbiB0aGUgCnByZXZpb3VzIHZlcnNpb24pLgoKSSB0aGlu ayB0aGUgY29ycmVjdCB3YXkgaXMgdG8gdXNlIG1hcCB0aG9zZSBpbiB0aGUgZGV2aWNlIElPVExC IGJlZm9yZSwgCmluc3RlYWQgb2YgdXNpbmcgdGhlIG1pc3MuCgpUaGVuIHdlIGNhbiBoYXZlIGEg dW5pZmllZCBjb2RlIGZvciB2aG9zdC12RFBBIGFuZCB2aG9zdC1rZXJuZWwuCgoKPgo+Pj4gVG8g a25vdyBpZiB0aGlzIGNhbGwgaXMgbmVlZGVkLCB2aG9zdF9zd19saXZlX21pZ3JhdGlvbl9zdGFy dF92cSBhbmQKPj4+IHZob3N0X3N3X2xpdmVfbWlncmF0aW9uX3N0b3AgY29weSB0aGUgdGVzdCBw ZXJmb3JtZWQgaW4KPj4+IHZob3N0X2Rldl9zdGFydC4gVGVzdGluZyBmb3IgdGhlIGFjdHVhbCBi YWNrZW5kIHR5cGUgY291bGQgYmUgY2xlYW5lciwKPj4+IG9yIGNoZWNraW5nIGZvciBub24tTlVM TCB2aG9zdF9mb3JjZV9pb21tdSwgZW5hYmxlX2N1c3RvbV9pb21tdSwgb3IKPj4+IGFub3RoZXIg dmhvc3RPcC4gV2UgY291bGQgZXh0cmFjdCB0aGlzIHRlc3QgaW4gaXRzIG93biBmdW5jdGlvbiB0 b28sCj4+PiBzbyBpdHMgbmFtZSBjb3VsZCBnaXZlIGEgYmV0dGVyIGhpbnQuIEp1c3QgY29weSB0 aGUgdmhvc3RfZGV2X3N0YXJ0Cj4+PiBjaGVjayBhdCB0aGUgbW9tZW50Lgo+Pj4KPj4+IFNpZ25l ZC1vZmYtYnk6IEV1Z2VuaW8gUMOpcmV6IDxlcGVyZXptYUByZWRoYXQuY29tPgo+Pj4gLS0tCj4+ PiAgICBody92aXJ0aW8vdmhvc3Qtc2hhZG93LXZpcnRxdWV1ZS5jIHwgMjA1ICsrKysrKysrKysr KysrKysrKysrKysrKysrKy0tCj4+PiAgICBody92aXJ0aW8vdmhvc3QuYyAgICAgICAgICAgICAg ICAgIHwgMTM0ICsrKysrKysrKysrKysrKysrKy0KPj4+ICAgIDIgZmlsZXMgY2hhbmdlZCwgMzI1 IGluc2VydGlvbnMoKyksIDE0IGRlbGV0aW9ucygtKQo+Pj4KPj4+IGRpZmYgLS1naXQgYS9ody92 aXJ0aW8vdmhvc3Qtc2hhZG93LXZpcnRxdWV1ZS5jIGIvaHcvdmlydGlvL3Zob3N0LXNoYWRvdy12 aXJ0cXVldWUuYwo+Pj4gaW5kZXggZmY1MGYxMjQxMC4uNmQ3NjdmZTI0OCAxMDA2NDQKPj4+IC0t LSBhL2h3L3ZpcnRpby92aG9zdC1zaGFkb3ctdmlydHF1ZXVlLmMKPj4+ICsrKyBiL2h3L3ZpcnRp by92aG9zdC1zaGFkb3ctdmlydHF1ZXVlLmMKPj4+IEBAIC05LDYgKzksNyBAQAo+Pj4KPj4+ICAg ICNpbmNsdWRlICJody92aXJ0aW8vdmhvc3Qtc2hhZG93LXZpcnRxdWV1ZS5oIgo+Pj4gICAgI2lu Y2x1ZGUgImh3L3ZpcnRpby92aG9zdC5oIgo+Pj4gKyNpbmNsdWRlICJody92aXJ0aW8vdmlydGlv LWFjY2Vzcy5oIgo+Pj4KPj4+ICAgICNpbmNsdWRlICJzdGFuZGFyZC1oZWFkZXJzL2xpbnV4L3Zo b3N0X3R5cGVzLmgiCj4+Pgo+Pj4gQEAgLTQ4LDkgKzQ5LDkzIEBAIHR5cGVkZWYgc3RydWN0IFZo b3N0U2hhZG93VmlydHF1ZXVlIHsKPj4+Cj4+PiAgICAgICAgLyogVmlydGlvIGRldmljZSAqLwo+ Pj4gICAgICAgIFZpcnRJT0RldmljZSAqdmRldjsKPj4+ICsKPj4+ICsgICAgLyogTWFwIGZvciBy ZXR1cm5pbmcgZ3Vlc3QncyBkZXNjcmlwdG9ycyAqLwo+Pj4gKyAgICBWaXJ0UXVldWVFbGVtZW50 ICoqcmluZ19pZF9tYXBzOwo+Pj4gKwo+Pj4gKyAgICAvKiBOZXh0IGhlYWQgdG8gZXhwb3NlIHRv IGRldmljZSAqLwo+Pj4gKyAgICB1aW50MTZfdCBhdmFpbF9pZHhfc2hhZG93Owo+Pj4gKwo+Pj4g KyAgICAvKiBOZXh0IGZyZWUgZGVzY3JpcHRvciAqLwo+Pj4gKyAgICB1aW50MTZfdCBmcmVlX2hl YWQ7Cj4+PiArCj4+PiArICAgIC8qIExhc3Qgc2VlbiB1c2VkIGlkeCAqLwo+Pj4gKyAgICB1aW50 MTZfdCBzaGFkb3dfdXNlZF9pZHg7Cj4+PiArCj4+PiArICAgIC8qIE5leHQgaGVhZCB0byBjb25z dW1lIGZyb20gZGV2aWNlICovCj4+PiArICAgIHVpbnQxNl90IHVzZWRfaWR4Owo+Pj4gICAgfSBW aG9zdFNoYWRvd1ZpcnRxdWV1ZTsKPj4+Cj4+PiAtLyogRm9yd2FyZCBndWVzdCBub3RpZmljYXRp b25zICovCj4+PiArc3RhdGljIHZvaWQgdmhvc3RfdnJpbmdfd3JpdGVfZGVzY3MoVmhvc3RTaGFk b3dWaXJ0cXVldWUgKnN2cSwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdmVjLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNpemVfdCBudW0sIGJvb2wgbW9yZV9kZXNjcywgYm9vbCB3cml0ZSkKPj4+ ICt7Cj4+PiArICAgIHVpbnQxNl90IGkgPSBzdnEtPmZyZWVfaGVhZCwgbGFzdCA9IHN2cS0+ZnJl ZV9oZWFkOwo+Pj4gKyAgICB1bnNpZ25lZCBuOwo+Pj4gKyAgICB1aW50MTZfdCBmbGFncyA9IHdy aXRlID8gY3B1X3RvX2xlMTYoVlJJTkdfREVTQ19GX1dSSVRFKSA6IDA7Cj4+PiArICAgIHZyaW5n X2Rlc2NfdCAqZGVzY3MgPSBzdnEtPnZyaW5nLmRlc2M7Cj4+PiArCj4+PiArICAgIGlmIChudW0g PT0gMCkgewo+Pj4gKyAgICAgICAgcmV0dXJuOwo+Pj4gKyAgICB9Cj4+PiArCj4+PiArICAgIGZv ciAobiA9IDA7IG4gPCBudW07IG4rKykgewo+Pj4gKyAgICAgICAgaWYgKG1vcmVfZGVzY3MgfHwg KG4gKyAxIDwgbnVtKSkgewo+Pj4gKyAgICAgICAgICAgIGRlc2NzW2ldLmZsYWdzID0gZmxhZ3Mg fCBjcHVfdG9fbGUxNihWUklOR19ERVNDX0ZfTkVYVCk7Cj4+PiArICAgICAgICB9IGVsc2Ugewo+ Pj4gKyAgICAgICAgICAgIGRlc2NzW2ldLmZsYWdzID0gZmxhZ3M7Cj4+PiArICAgICAgICB9Cj4+ PiArICAgICAgICBkZXNjc1tpXS5hZGRyID0gY3B1X3RvX2xlNjQoKGh3YWRkcilpb3ZlY1tuXS5p b3ZfYmFzZSk7Cj4+PiArICAgICAgICBkZXNjc1tpXS5sZW4gPSBjcHVfdG9fbGUzMihpb3ZlY1tu XS5pb3ZfbGVuKTsKPj4+ICsKPj4+ICsgICAgICAgIGxhc3QgPSBpOwo+Pj4gKyAgICAgICAgaSA9 IGNwdV90b19sZTE2KGRlc2NzW2ldLm5leHQpOwo+Pj4gKyAgICB9Cj4+PiArCj4+PiArICAgIHN2 cS0+ZnJlZV9oZWFkID0gbGUxNl90b19jcHUoZGVzY3NbbGFzdF0ubmV4dCk7Cj4+PiArfQo+Pj4g Kwo+Pj4gK3N0YXRpYyB1bnNpZ25lZCB2aG9zdF9zaGFkb3dfdnFfYWRkX3NwbGl0KFZob3N0U2hh ZG93VmlydHF1ZXVlICpzdnEsCj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgVmlydFF1ZXVlRWxlbWVudCAqZWxlbSkKPj4+ICt7Cj4+PiArICAgIGludCBoZWFk Owo+Pj4gKyAgICB1bnNpZ25lZCBhdmFpbF9pZHg7Cj4+PiArICAgIHZyaW5nX2F2YWlsX3QgKmF2 YWlsID0gc3ZxLT52cmluZy5hdmFpbDsKPj4+ICsKPj4+ICsgICAgaGVhZCA9IHN2cS0+ZnJlZV9o ZWFkOwo+Pj4gKwo+Pj4gKyAgICAvKiBXZSBuZWVkIHNvbWUgZGVzY3JpcHRvcnMgaGVyZSAqLwo+ Pj4gKyAgICBhc3NlcnQoZWxlbS0+b3V0X251bSB8fCBlbGVtLT5pbl9udW0pOwo+Pj4gKwo+Pj4g KyAgICB2aG9zdF92cmluZ193cml0ZV9kZXNjcyhzdnEsIGVsZW0tPm91dF9zZywgZWxlbS0+b3V0 X251bSwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS0+aW5fbnVtID4gMCwg ZmFsc2UpOwo+Pj4gKyAgICB2aG9zdF92cmluZ193cml0ZV9kZXNjcyhzdnEsIGVsZW0tPmluX3Nn LCBlbGVtLT5pbl9udW0sIGZhbHNlLCB0cnVlKTsKPj4+ICsKPj4+ICsgICAgLyoKPj4+ICsgICAg ICogUHV0IGVudHJ5IGluIGF2YWlsYWJsZSBhcnJheSAoYnV0IGRvbid0IHVwZGF0ZSBhdmFpbC0+ aWR4IHVudGlsIHRoZXkKPj4+ICsgICAgICogZG8gc3luYykuCj4+PiArICAgICAqLwo+Pj4gKyAg ICBhdmFpbF9pZHggPSBzdnEtPmF2YWlsX2lkeF9zaGFkb3cgJiAoc3ZxLT52cmluZy5udW0gLSAx KTsKPj4+ICsgICAgYXZhaWwtPnJpbmdbYXZhaWxfaWR4XSA9IGNwdV90b19sZTE2KGhlYWQpOwo+ Pj4gKyAgICBzdnEtPmF2YWlsX2lkeF9zaGFkb3crKzsKPj4+ICsKPj4+ICsgICAgLyogRXhwb3Nl IGRlc2NyaXB0b3JzIHRvIGRldmljZSAqLwo+Pgo+PiBJdCdzIGJldHRlciB0byBkZXNjcmliZSB0 aGUgZGV0YWlsIG9yZGVyLgo+Pgo+PiBFLmcgIlVwZGF0ZSBhdmFpbCBpbmRleCBhZnRlciB0aGUg ZGVzY3JpcHRvciBpcyB3cm90ZSIKPj4KPiBBZ3JlZSwgSSB3aWxsIHJlcGxhY2UgaXQgd2l0aCB5 b3VyIHdvcmRpbmcuCj4KPj4+ICsgICAgc21wX3dtYigpOwo+Pj4gKyAgICBhdmFpbC0+aWR4ID0g Y3B1X3RvX2xlMTYoc3ZxLT5hdmFpbF9pZHhfc2hhZG93KTsKPj4+ICsKPj4+ICsgICAgcmV0dXJu IGhlYWQ7Cj4+PiArCj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyB2b2lkIHZob3N0X3NoYWRvd192 cV9hZGQoVmhvc3RTaGFkb3dWaXJ0cXVldWUgKnN2cSwKPj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFZpcnRRdWV1ZUVsZW1lbnQgKmVsZW0pCj4+PiArewo+Pj4gKyAgICB1bnNp Z25lZCBxZW11X2hlYWQgPSB2aG9zdF9zaGFkb3dfdnFfYWRkX3NwbGl0KHN2cSwgZWxlbSk7Cj4+ PiArCj4+PiArICAgIHN2cS0+cmluZ19pZF9tYXBzW3FlbXVfaGVhZF0gPSBlbGVtOwo+Pj4gK30K Pj4+ICsKPj4+ICsvKiBIYW5kbGUgZ3Vlc3QtPmRldmljZSBub3RpZmljYXRpb25zICovCj4+PiAg ICBzdGF0aWMgdm9pZCB2aG9zdF9oYW5kbGVfZ3Vlc3Rfa2ljayhFdmVudE5vdGlmaWVyICpuKQo+ Pj4gICAgewo+Pj4gICAgICAgIFZob3N0U2hhZG93VmlydHF1ZXVlICpzdnEgPSBjb250YWluZXJf b2YobiwgVmhvc3RTaGFkb3dWaXJ0cXVldWUsCj4+PiBAQCAtNjAsNyArMTQ1LDY3IEBAIHN0YXRp YyB2b2lkIHZob3N0X2hhbmRsZV9ndWVzdF9raWNrKEV2ZW50Tm90aWZpZXIgKm4pCj4+PiAgICAg ICAgICAgIHJldHVybjsKPj4+ICAgICAgICB9Cj4+Pgo+Pj4gLSAgICBldmVudF9ub3RpZmllcl9z ZXQoJnN2cS0+a2lja19ub3RpZmllcik7Cj4+PiArICAgIC8qIE1ha2UgYXZhaWxhYmxlIGFzIG1h bnkgYnVmZmVycyBhcyBwb3NzaWJsZSAqLwo+Pj4gKyAgICBkbyB7Cj4+PiArICAgICAgICBpZiAo dmlydGlvX3F1ZXVlX2dldF9ub3RpZmljYXRpb24oc3ZxLT52cSkpIHsKPj4+ICsgICAgICAgICAg ICAvKiBObyBtb3JlIG5vdGlmaWNhdGlvbnMgdW50aWwgcHJvY2VzcyBhbGwgYXZhaWxhYmxlICov Cj4+PiArICAgICAgICAgICAgdmlydGlvX3F1ZXVlX3NldF9ub3RpZmljYXRpb24oc3ZxLT52cSwg ZmFsc2UpOwo+Pj4gKyAgICAgICAgfQo+Pj4gKwo+Pj4gKyAgICAgICAgd2hpbGUgKHRydWUpIHsK Pj4+ICsgICAgICAgICAgICBWaXJ0UXVldWVFbGVtZW50ICplbGVtID0gdmlydHF1ZXVlX3BvcChz dnEtPnZxLCBzaXplb2YoKmVsZW0pKTsKPj4+ICsgICAgICAgICAgICBpZiAoIWVsZW0pIHsKPj4+ ICsgICAgICAgICAgICAgICAgYnJlYWs7Cj4+PiArICAgICAgICAgICAgfQo+Pj4gKwo+Pj4gKyAg ICAgICAgICAgIHZob3N0X3NoYWRvd192cV9hZGQoc3ZxLCBlbGVtKTsKPj4+ICsgICAgICAgICAg ICBldmVudF9ub3RpZmllcl9zZXQoJnN2cS0+a2lja19ub3RpZmllcik7Cj4+PiArICAgICAgICB9 Cj4+PiArCj4+PiArICAgICAgICB2aXJ0aW9fcXVldWVfc2V0X25vdGlmaWNhdGlvbihzdnEtPnZx LCB0cnVlKTsKPj4+ICsgICAgfSB3aGlsZSAoIXZpcnRpb19xdWV1ZV9lbXB0eShzdnEtPnZxKSk7 Cj4+PiArfQo+Pj4gKwo+Pj4gK3N0YXRpYyBib29sIHZob3N0X3NoYWRvd192cV9tb3JlX3VzZWQo Vmhvc3RTaGFkb3dWaXJ0cXVldWUgKnN2cSkKPj4+ICt7Cj4+PiArICAgIGlmIChzdnEtPnVzZWRf aWR4ICE9IHN2cS0+c2hhZG93X3VzZWRfaWR4KSB7Cj4+PiArICAgICAgICByZXR1cm4gdHJ1ZTsK Pj4+ICsgICAgfQo+Pj4gKwo+Pj4gKyAgICAvKiBHZXQgdXNlZCBpZHggbXVzdCBub3QgYmUgcmVv cmRlcmVkICovCj4+PiArICAgIHNtcF9ybWIoKTsKPj4+ICsgICAgc3ZxLT5zaGFkb3dfdXNlZF9p ZHggPSBjcHVfdG9fbGUxNihzdnEtPnZyaW5nLnVzZWQtPmlkeCk7Cj4+PiArCj4+PiArICAgIHJl dHVybiBzdnEtPnVzZWRfaWR4ICE9IHN2cS0+c2hhZG93X3VzZWRfaWR4Owo+Pj4gK30KPj4+ICsK Pj4+ICtzdGF0aWMgVmlydFF1ZXVlRWxlbWVudCAqdmhvc3Rfc2hhZG93X3ZxX2dldF9idWYoVmhv c3RTaGFkb3dWaXJ0cXVldWUgKnN2cSkKPj4+ICt7Cj4+PiArICAgIHZyaW5nX2Rlc2NfdCAqZGVz Y3MgPSBzdnEtPnZyaW5nLmRlc2M7Cj4+PiArICAgIGNvbnN0IHZyaW5nX3VzZWRfdCAqdXNlZCA9 IHN2cS0+dnJpbmcudXNlZDsKPj4+ICsgICAgdnJpbmdfdXNlZF9lbGVtX3QgdXNlZF9lbGVtOwo+ Pj4gKyAgICB1aW50MTZfdCBsYXN0X3VzZWQ7Cj4+PiArCj4+PiArICAgIGlmICghdmhvc3Rfc2hh ZG93X3ZxX21vcmVfdXNlZChzdnEpKSB7Cj4+PiArICAgICAgICByZXR1cm4gTlVMTDsKPj4+ICsg ICAgfQo+Pj4gKwo+Pj4gKyAgICBsYXN0X3VzZWQgPSBzdnEtPnVzZWRfaWR4ICYgKHN2cS0+dnJp bmcubnVtIC0gMSk7Cj4+PiArICAgIHVzZWRfZWxlbS5pZCA9IGxlMzJfdG9fY3B1KHVzZWQtPnJp bmdbbGFzdF91c2VkXS5pZCk7Cj4+PiArICAgIHVzZWRfZWxlbS5sZW4gPSBsZTMyX3RvX2NwdSh1 c2VkLT5yaW5nW2xhc3RfdXNlZF0ubGVuKTsKPj4+ICsKPj4+ICsgICAgaWYgKHVubGlrZWx5KHVz ZWRfZWxlbS5pZCA+PSBzdnEtPnZyaW5nLm51bSkpIHsKPj4+ICsgICAgICAgIGVycm9yX3JlcG9y dCgiRGV2aWNlICVzIHNheXMgaW5kZXggJXUgaXMgYXZhaWxhYmxlIiwgc3ZxLT52ZGV2LT5uYW1l LAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgIHVzZWRfZWxlbS5pZCk7Cj4+PiArICAgICAgICBy ZXR1cm4gTlVMTDsKPj4+ICsgICAgfQo+Pj4gKwo+Pj4gKyAgICBkZXNjc1t1c2VkX2VsZW0uaWRd Lm5leHQgPSBzdnEtPmZyZWVfaGVhZDsKPj4+ICsgICAgc3ZxLT5mcmVlX2hlYWQgPSB1c2VkX2Vs ZW0uaWQ7Cj4+PiArCj4+PiArICAgIHN2cS0+dXNlZF9pZHgrKzsKPj4+ICsgICAgc3ZxLT5yaW5n X2lkX21hcHNbdXNlZF9lbGVtLmlkXS0+bGVuID0gdXNlZF9lbGVtLmxlbjsKPj4+ICsgICAgcmV0 dXJuIGdfc3RlYWxfcG9pbnRlcigmc3ZxLT5yaW5nX2lkX21hcHNbdXNlZF9lbGVtLmlkXSk7Cj4+ PiAgICB9Cj4+Pgo+Pj4gICAgLyogRm9yd2FyZCB2aG9zdCBub3RpZmljYXRpb25zICovCj4+PiBA QCAtNjksMTcgKzIxNCwzMyBAQCBzdGF0aWMgdm9pZCB2aG9zdF9zaGFkb3dfdnFfaGFuZGxlX2Nh bGxfbm9fdGVzdChFdmVudE5vdGlmaWVyICpuKQo+Pj4gICAgICAgIFZob3N0U2hhZG93VmlydHF1 ZXVlICpzdnEgPSBjb250YWluZXJfb2YobiwgVmhvc3RTaGFkb3dWaXJ0cXVldWUsCj4+PiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX25vdGlmaWVy KTsKPj4+ICAgICAgICBFdmVudE5vdGlmaWVyICptYXNrZWRfbm90aWZpZXI7Cj4+PiArICAgIFZp cnRRdWV1ZSAqdnEgPSBzdnEtPnZxOwo+Pj4KPj4+ICAgICAgICBtYXNrZWRfbm90aWZpZXIgPSBz dnEtPm1hc2tlZF9ub3RpZmllci5uOwo+Pj4KPj4+IC0gICAgaWYgKCFtYXNrZWRfbm90aWZpZXIp IHsKPj4+IC0gICAgICAgIHVuc2lnbmVkIG4gPSB2aXJ0aW9fZ2V0X3F1ZXVlX2luZGV4KHN2cS0+ dnEpOwo+Pj4gLSAgICAgICAgdmlydGlvX3F1ZXVlX2ludmFsaWRhdGVfc2lnbmFsbGVkX3VzZWQo c3ZxLT52ZGV2LCBuKTsKPj4+IC0gICAgICAgIHZpcnRpb19ub3RpZnlfaXJxZmQoc3ZxLT52ZGV2 LCBzdnEtPnZxKTsKPj4+IC0gICAgfSBlbHNlIGlmICghc3ZxLT5tYXNrZWRfbm90aWZpZXIuc2ln bmFsZWQpIHsKPj4+IC0gICAgICAgIHN2cS0+bWFza2VkX25vdGlmaWVyLnNpZ25hbGVkID0gdHJ1 ZTsKPj4+IC0gICAgICAgIGV2ZW50X25vdGlmaWVyX3NldChzdnEtPm1hc2tlZF9ub3RpZmllci5u KTsKPj4+IC0gICAgfQo+Pj4gKyAgICAvKiBNYWtlIGFzIG1hbnkgYnVmZmVycyBhcyBwb3NzaWJs ZSB1c2VkLiAqLwo+Pj4gKyAgICBkbyB7Cj4+PiArICAgICAgICB1bnNpZ25lZCBpID0gMDsKPj4+ ICsKPj4+ICsgICAgICAgIC8qIFRPRE86IFVzZSBWUklOR19BVkFJTF9GX05PX0lOVEVSUlVQVCAq Lwo+Pj4gKyAgICAgICAgd2hpbGUgKHRydWUpIHsKPj4+ICsgICAgICAgICAgICBnX2F1dG9mcmVl IFZpcnRRdWV1ZUVsZW1lbnQgKmVsZW0gPSB2aG9zdF9zaGFkb3dfdnFfZ2V0X2J1ZihzdnEpOwo+ Pj4gKyAgICAgICAgICAgIGlmICghZWxlbSkgewo+Pj4gKyAgICAgICAgICAgICAgICBicmVhazsK Pj4+ICsgICAgICAgICAgICB9Cj4+PiArCj4+PiArICAgICAgICAgICAgYXNzZXJ0KGkgPCBzdnEt PnZyaW5nLm51bSk7Cj4+PiArICAgICAgICAgICAgdmlydHF1ZXVlX2ZpbGwodnEsIGVsZW0sIGVs ZW0tPmxlbiwgaSsrKTsKPj4+ICsgICAgICAgIH0KPj4+ICsKPj4+ICsgICAgICAgIHZpcnRxdWV1 ZV9mbHVzaCh2cSwgaSk7Cj4+PiArICAgICAgICBpZiAoIW1hc2tlZF9ub3RpZmllcikgewo+Pj4g KyAgICAgICAgICAgIHZpcnRpb19ub3RpZnlfaXJxZmQoc3ZxLT52ZGV2LCBzdnEtPnZxKTsKPj4K Pj4gQW55IHJlYXNvbiB0aGF0IHlvdSBkb24ndCB1c2UgdmlydGlvX25vdGlmeSgpIGhlcmU/Cj4+ Cj4gTm8gcmVhc29uIGJ1dCB0byBtYWtlIHN1cmUgZ3Vlc3Rfbm90aWZpZXIgaXMgdXNlZC4gSSdt IG5vdCBzdXJlIGlmCj4gdGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgdGhvdWdoLgoK ClRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdmlydGlvX25vdGlmeSgpIHdpbGwgZ28gdGhyb3VnaCB0 aGUgbWVtb3J5IEFQSSAKd2hpY2ggd2lsbCBmaW5hbGx5IGdvIHRvIGlycWZkIGluIHRoaXMgY2Fz ZS4KCgo+Cj4gSSBjYW4gdGVzdCB0byBzd2l0Y2ggdG8gdmlydGlvX25vdGlmeSwgd2hhdCB3b3Vs ZCBiZSB0aGUgYWR2YW50YWdlIGhlcmU/CgoKUHJvYmFibHkgbm8uCgoKPgo+Pj4gKyAgICAgICAg fSBlbHNlIGlmICghc3ZxLT5tYXNrZWRfbm90aWZpZXIuc2lnbmFsZWQpIHsKPj4+ICsgICAgICAg ICAgICBzdnEtPm1hc2tlZF9ub3RpZmllci5zaWduYWxlZCA9IHRydWU7Cj4+PiArICAgICAgICAg ICAgZXZlbnRfbm90aWZpZXJfc2V0KHN2cS0+bWFza2VkX25vdGlmaWVyLm4pOwo+Pj4gKyAgICAg ICAgfQo+Pgo+PiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgdGhlIGV4dHJhIGNvbXBsZXhpdHkgaWYg eW91IGRvIHNoYWRvdyB2aXJ0cXVldWUgYXQKPiAuPiB2aXJ0aW8gbGV2ZWwuCj4+IElmIHlvdSBk byBldmVyeXRoaW5nIGF0IGUuZyB2aG9zdC12ZHBhLCB5b3UgZG9uJ3QgbmVlZCB0byBjYXJlIGFi b3V0Cj4+IG1hc2tlZF9ub3RpZmVyIGF0IGFsbC4KPj4KPiBDb3JyZWN0IG1lIGlmIEknbSB3cm9u Zywgd2hhdCB5b3UgbWVhbiBpcyB0byB1c2UgdGhlIGJhY2tlbmQKPiB2aG9zdF9zZXRfdnJpbmdf Y2FsbCB0byBzZXQgdGhlIGd1ZXN0IG5vdGlmaWVyIChmcm9tIFNWUSBwb2ludCBvZgo+IHZpZXcp LCBhbmQgdGhlbiBzZXQgaXQgdW5jb25kaXRpb25hbGx5LiBUaGUgZnVuY3Rpb24KPiB2aG9zdF92 aXJ0cXVldWVfbWFzayB3b3VsZCBzZXQgdGhlIG1hc2tlZCBvbmUgYnkgaXRzZWxmLCBubwo+IG1v ZGlmaWNhdGlvbiBpcyBuZWVkZWQgaGVyZS4KCgpTb21ldGhpbmcgbGlrZSB0aGlzLCBmcm9tIHRo ZSBwb2ludCBvZiB2aG9zdCwgaXQgZG9lc24ndCBldmVuIG5lZWQgdG8gCmtub3cgd2hldGhlciBv ciBub3QgdGhlIG5vdGlmaWVyIGlzIG1hc2tlZCBvciBub3QuIEFsbCBpdCBuZWVkcyBpcyB0byAK d3JpdGUgdG8gdGhlIGV2ZW50ZmQgc2V0IHZpYSB2cSBjYWxsLgoKCj4KPiBCYWNrZW5kIHdvdWxk IHN0aWxsIG5lZWQgYSBjb25kaXRpb25hbCBjaGVja2luZyBpZiBTVlEgaXMgZW5hYmxlZCwgc28K PiBpdCBlaXRoZXIgc2VuZHMgY2FsbF9mZCB0byBiYWNrZW5kIG9yIHRvIFNWUS4KCgpZZXMuCgoK PiBUaGUgY2FsbCB0bwo+IHZpcnRxdWV1ZV9maWxsLCB3b3VsZCBzdGlsbCBiZSBuZWVkZWQgaWYg d2UgZG9uJ3Qgd2FudCB0byBkdXBsaWNhdGUKPiBhbGwgdGhlIGRldmljZSB2aXJ0aW8ncyBsb2dp YyBpbiB0aGUgdmhvc3QtdmRwYSBiYWNrZW5kLgoKClllcywgeW91IGNhbiBtYWtlIHRoZSBidWZm ZXIgZm9yd2FyZGluZyBhIGNvbW1vbiBsaWJyYXJ5IHRoZW4gaXQgY291bGQgCmJlIHVzZWQgb3Ro ZXIgdmhvc3QgYmFja2VuZCBpbiB0aGUgZnV0dXJlLgoKVGhlIHBvaW50IGlzIHRvIGF2b2lkIHRv dWNoaW5nIHZob3N0IHByb3RvY29scyB0byByZWR1Y2UgdGhlIGNoYW5nZXNldCAKYW5kIGhhdmUg c29tZXRpbmcgbWluaW1hbCBmb3Igb3VyIHJlcXVpcmVtZW50cyAodmhvc3QtdkRQQSBtYWlubHkp LgoKCj4KPiBBbm90aGVyIHBvc3NpYmlsaXR5IHdvdWxkIGJlIHRvIGp1c3Qgc3RvcmUgZ3Vlc3Rf bm90aWZpZXIgaW4gU1ZRLCBhbmQKPiByZXBsYWNlIGl0IHdpdGggbWFza2VkIG5vdGlmaWVyIGFu ZCBiYWNrLiBJIHRoaW5rIHRoaXMgaXMgbW9yZSBhbGlnbmVkCj4gd2l0aCB3aGF0IHlvdSBoYXZl IGluIG1pbmQsIGJ1dCBpdCBzdGlsbCBuZWVkcyBjaGFuZ2VzIHRvCj4gdmhvc3RfdmlydHF1ZXVl X21hc2suIE5vdGUgdGhhdCB0aGUgYm9vbGVhbiBzdG9yZQo+IG1hc2tlZF9ub3RpZmllci5zaWdu YWxlZCBpcyBqdXN0IGEgKG1heWJlIHByZW1hdHVyZSkgb3B0aW1pemF0aW9uIHRvCj4gc2tpcCB0 aGUgdW5uZWVkZWQgd3JpdGUgc3lzY2FsbCwgYnV0IGl0IGNvdWxkIGJlIG9taXR0ZWQgZm9yIGJy ZXZpdHkuCj4gT3IgbWF5YmUgYSBjbGVhbmVyIHNvbHV0aW9uIGlzIHRvIHVzZSBpb191cmluZyBm b3IgdGhpcyB3cml0ZT8gOikuCgoKTG9va3MgbGlrZSBub3Qgd2hhdCBJIG1lYW50IDopCgpUbyBj bGFyaWZ5LCBpdCB3b3JrcyBsaWtlOgoKMSkgcmVjb3JkIHRoZSB2cSBjYWxsIGZkMSBkdXJpbmcg dmhvc3RfdmRwYV9zZXRfdnJpbmdfY2FsbAoyKSB3aGVuIHN2cSBpcyBub3QgZW5hYmxlZCwgc2V0 IHRoaXMgZmQxIHRvIHZob3N0LVZEUEEgdmlhIApWSE9TVF9TRVRfVlJJTkdfQ0FMTAozKSB3aGVu IHN2cSBpcyBlbmFibGVkLCBpbml0aWFsaXplIGFuZCBzZXQgZmQyIHRvIHZob3N0LXZEUEEsIHBv bGwgYW5kIApoYW5kbGUgZ3Vlc3Qga2ljayB2aWEgZmQxIGFuZCByZWx5IGZkMSB0byBmZDIKClNv IHdlIGRvbid0IG5lZWQgdG8gY2FyZSBtdWNoIGFib3V0IHRoZSBtYXNraW5nLCBpbiB0aGUgc3Zx IGNvZGVzLCB3ZSAKanVzdCBzdGljayB0byB1c2UgdGhlIGZkIHRoYXQgaXMgc2V0IHZpYSByZWNl bnQgdmhvc3RfdmRwYV9zZXRfdnJpbmdfY2FsbCgpLgoKVGhhdCBtZWFucywgaWYgdmlydHF1ZXVl IGlzIG1hc2tlZCwgd2UncmUgdXNpbmcgbWFzZWRfbm90aWZpZXIgYWN0dWFsbHksIApidXQgaXQn cyB0b3RhbGx5IHRyYW5zcGFyZW50IHRvIHVzLgoKU28gdGhlIGlkZWEgaXMgYmVoYXZlIGxpa2Ug YSBub3JtYWwgdmhvc3QtdkRQQSBiYWNrZW5kLCBhbmQgaGlkZSB0aGUgCnNoYWRvd2luZyBmcm9t IHRoZSB2aXJ0aW8gY29kZXMuCgpUaGFua3MKCgo+Cj4gVGhhbmtzIQo+Cj4+IFRoYW5rcwo+PgoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KVmlydHVhbGl6 YXRpb24gbWFpbGluZyBsaXN0ClZpcnR1YWxpemF0aW9uQGxpc3RzLmxpbnV4LWZvdW5kYXRpb24u b3JnCmh0dHBzOi8vbGlzdHMubGludXhmb3VuZGF0aW9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3Zp cnR1YWxpemF0aW9u