From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniele Ceraolo Spurio Subject: Re: [PATCH 3/4] drm/i915/guc: kill doorbell code and selftests Date: Mon, 18 Nov 2019 14:20:03 -0800 Message-ID: <1d42604f-7b54-f362-73d4-f0d5de781990@intel.com> References: <20191106222550.20752-1-daniele.ceraolospurio@intel.com> <20191106222550.20752-4-daniele.ceraolospurio@intel.com> <9f8e7012-c165-364e-ea26-57aae203a77c@Intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4DB186E0FC for ; Mon, 18 Nov 2019 22:20:11 +0000 (UTC) In-Reply-To: <9f8e7012-c165-364e-ea26-57aae203a77c@Intel.com> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: John Harrison , intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org CgpPbiAxMS8xNC8xOSAzOjU2IFBNLCBKb2huIEhhcnJpc29uIHdyb3RlOgo+IE9uIDExLzYvMjAx OSAxNDoyNSwgRGFuaWVsZSBDZXJhb2xvIFNwdXJpbyB3cm90ZToKPj4gSW5zdGVhZCBvZiByZWx5 aW5nIG9uIHRoZSB3b3JrcXVldWUsIHRoZSB1cGNvbWluZyByZXdvcmtlZCBHdUMKPj4gc3VibWlz c2lvbiBmbG93IHdpbGwgb2ZmZXIgdGhlIGhvc3QgZHJpdmVyIGluZGlwZW5kZW50IGNvbnRyb2wg b3Zlcgo+IGluZGVwZW5kZW50Cj4gCj4+IHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIGVhY2ggY29u dGV4dCBzdWJtaXR0ZWQgdG8gR3VDLiBBcyBwYXJ0IG9mIHRoaXMsCj4+IHRoZSBkb29yYmVsbCB1 c2FnZSBtb2RlbCBoYXMgYmVlbiByZXdvcmtlZCwgd2l0aCBlYWNoIGRvb3JiZWxsIGJlaW5nCj4+ IHBhaXJlZCB0byBhIHNpbmdsZSBscmMgYW5kIGEgZG9vcmJlbGwgcmluZyByZXByZXNlbnRpbmcg bmV3IHdvcmsKPj4gYXZhaWxhYmxlIGZvciB0aGF0IHNwZWNpZmljIGNvbnRleHQuIFRoaXMgbWVj aGFuaXNtLCBob3dldmVyLCBsaW1pdHMKPj4gdGhlIG51bWJlciBvZiBjb250ZXh0cyB0aGF0IGNh biBiZSByZWdpc3RlcmVkIHdpdGggR3VDIHRvIHRoZSBudW1iZXIgb2YKPj4gZG9vcmJlbGxzLCB3 aGljaCBpcyBhbiB1bmRlc2lyZWQgbGltaXRhdGlvbi4gTHVja2lseSwgR3VDIHdpbGwgYWxzbwo+ IE5vdCBleGFjdGx5ICdsdWNraWx5Jy4gTW9yZSBhIGNhc2Ugb2YsIHdlIHNhaWQgdGhlIGRvb3Ji ZWxscyB3b24ndCB3b3JrIAo+IGZvciBsaW51eCBzbyBjYW4gd2UgaGF2ZSBhIEgyRyBpbnN0ZWFk IGFuZCB0aGV5IGxpc3RlbmVkLgo+IAoKZml4ZWQKCj4+IHByb3ZpZGUgYSBIMkcgdGhhdCB3aWxs IGFsbG93IHRoZSBob3N0IHRvIG5vdGlmeSB0aGUgR3VDIG9mIHdvcmsKPj4gYXZhaWxhYmxlIGZv ciBhIHNwZWNpZmllZCBscmMsIHNvIHdlIGNhbiB1c2UgdGhhdCBtZWNoYW5pc20gaW5zdGVhZCBv Zgo+PiByZWx5aW5nIG9uIHRoZSBkb29yYmVsbHMuIFdlIGNhbiB0aGVyZWZvcmUgZHJvcCB0aGUg ZG9vcmJlbGwgY29kZSB3ZQo+PiBjdXJyZW50bHkgaGF2ZSwgYWxzbyBnaXZlbiB0aGUgZmFjdCB0 aGF0IGluIHRoZSB1bmxpa2VseSBjYXNlIHdlJ2Qgd2FudAo+PiB0byBzd2l0Y2ggYmFjayB0byB1 c2luZyBkb29yYmVsbHMgd2UnZCBoYXZlIHRvIGhlYXZpbHkgcmV3b3JrIGl0Lgo+PiBUaGUgd29y a3F1ZXVlIHdpbGwgc3RpbGwgaGF2ZSBhIHVzZSBpbiB0aGUgbmV3IGludGVyZmFjZSB0byBwYXNz IHNwZWNpYWwKPj4gY29tbWFuZHMsIHNvIHRoYXQgY29kZSBoYXMgYmVlbiByZXRhaW5lZCBmb3Ig bm93Lgo+Pgo+PiBXaXRoIHRoZSBkb29yYmVsbHMgZ29uZSBhbmQgdGhlIEd1QyBjbGllbnQgYmVj b21pbmcgZXZlbiBzaW1wbGVyLCB0aGUKPj4gZXhpc3RpbmcgR3VDIHNlbGZ0ZXN0cyBkb24ndCBn aXZlIHVzIGFueSBtZWFuaW5nZnVsIGNvdmVyYWdlIHNvIHdlIGNhbgo+PiByZW1vdmUgdGhlbSBh cyB3ZWxsLiBTb21lIHNlbGZ0ZXN0cyBtaWdodCBjb21lIHdpdGggdGhlIG5ldyBjb2RlLCBidXQK Pj4gdGhleSB3aWxsIGxvb2sgZGlmZmVyZW50IGZyb20gd2hhdCB3ZSBoYXZlIG5vdyBzbyBpZiBk b2Vzbid0IHNlZW0gd29ydGgKPj4gaXQgdG8ga2VlcCB0aGUgZmlsZSBhcm91bmQgaW4gdGhlIG1l YW50aW1lLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBEYW5pZWxlIENlcmFvbG8gU3B1cmlvIDxkYW5p ZWxlLmNlcmFvbG9zcHVyaW9AaW50ZWwuY29tPgo+PiBDYzogTWljaGFsIFdhamRlY3prbyA8bWlj aGFsLndhamRlY3prb0BpbnRlbC5jb20+Cj4+IENjOiBKb2huIEhhcnJpc29uIDxKb2huLkMuSGFy cmlzb25ASW50ZWwuY29tPgo+PiBDYzogTWF0dGhldyBCcm9zdCA8bWF0dGhldy5icm9zdEBpbnRl bC5jb20+Cj4+IC0tLQo+PiDCoCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9ndWMu aMKgwqDCoMKgwqDCoMKgIHzCoMKgIDggKy0KPj4gwqAgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qv dWMvaW50ZWxfZ3VjX2Z3aWYuaMKgwqAgfMKgwqAgMiArLQo+PiDCoCAuLi4vZ3B1L2RybS9pOTE1 L2d0L3VjL2ludGVsX2d1Y19zdWJtaXNzaW9uLmMgfCAzNzMgKystLS0tLS0tLS0tLS0tLS0tCj4+ IMKgIC4uLi9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX3N1Ym1pc3Npb24uaCB8wqDCoCA5 ICstCj4+IMKgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL2ludGVsX3VjLmPCoMKgwqDCoMKg wqDCoMKgIHzCoMKgIDcgKy0KPj4gwqAgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvc2VsZnRl c3RfZ3VjLmPCoMKgwqDCoCB8IDI5OSAtLS0tLS0tLS0tLS0tLQo+PiDCoCBkcml2ZXJzL2dwdS9k cm0vaTkxNS9pOTE1X2RlYnVnZnMuY8KgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoCAxMSArLQo+PiDC oCAuLi4vZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaMKgIHzCoMKgIDEg LQo+PiDCoCA4IGZpbGVzIGNoYW5nZWQsIDQyIGluc2VydGlvbnMoKyksIDY2OCBkZWxldGlvbnMo LSkKPj4gwqAgZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL3Nl bGZ0ZXN0X2d1Yy5jCj4+Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91 Yy9pbnRlbF9ndWMuaCAKPj4gYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9ndWMu aAo+PiBpbmRleCBiZjQzOGY4MjBjMzUuLmIyZDE3NjZlNjg5YSAxMDA2NDQKPj4gLS0tIGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjLmgKPj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjLmgKPj4gQEAgLTIwLDggKzIwLDggQEAgc3RydWN0IF9f Z3VjX2Fkc19ibG9iOwo+PiDCoCAvKgo+PiDCoMKgICogVG9wIGxldmVsIHN0cnVjdHVyZSBvZiBH dUMuIEl0IGhhbmRsZXMgZmlybXdhcmUgbG9hZGluZyBhbmQgCj4+IG1hbmFnZXMgY2xpZW50Cj4+ IC0gKiBwb29sIGFuZCBkb29yYmVsbHMuIGludGVsX2d1YyBvd25zIGEgaW50ZWxfZ3VjX2NsaWVu dCB0byByZXBsYWNlIAo+PiB0aGUgbGVnYWN5Cj4+IC0gKiBFeGVjTGlzdCBzdWJtaXNzaW9uLgo+ PiArICogcG9vbC4gaW50ZWxfZ3VjIG93bnMgYSBpbnRlbF9ndWNfY2xpZW50IHRvIHJlcGxhY2Ug dGhlIGxlZ2FjeSAKPj4gRXhlY0xpc3QKPj4gKyAqIHN1Ym1pc3Npb24uCj4+IMKgwqAgKi8KPj4g wqAgc3RydWN0IGludGVsX2d1YyB7Cj4+IMKgwqDCoMKgwqAgc3RydWN0IGludGVsX3VjX2Z3IGZ3 Owo+PiBAQCAtNTAsMTAgKzUwLDYgQEAgc3RydWN0IGludGVsX2d1YyB7Cj4+IMKgwqDCoMKgwqAg c3RydWN0IGludGVsX2d1Y19jbGllbnQgKmV4ZWNidWZfY2xpZW50Owo+PiAtwqDCoMKgIERFQ0xB UkVfQklUTUFQKGRvb3JiZWxsX2JpdG1hcCwgR1VDX05VTV9ET09SQkVMTFMpOwo+PiAtwqDCoMKg IC8qIEN5Y2xpYyBjb3VudGVyIG1vZCBwYWdlc2l6ZcKgwqDCoCAqLwo+PiAtwqDCoMKgIHUzMiBk Yl9jYWNoZWxpbmU7Cj4+IC0KPj4gwqDCoMKgwqDCoCAvKiBDb250cm9sIHBhcmFtcyBmb3IgZncg aW5pdGlhbGl6YXRpb24gKi8KPj4gwqDCoMKgwqDCoCB1MzIgcGFyYW1zW0dVQ19DVExfTUFYX0RX T1JEU107Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9n dWNfZndpZi5oIAo+PiBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL2ludGVsX2d1Y19md2lm LmgKPj4gaW5kZXggYTI2YTg1ZDUwMjA5Li4xZThlNGFmN2Q5Y2EgMTAwNjQ0Cj4+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL2ludGVsX2d1Y19md2lmLmgKPj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX2Z3aWYuaAo+PiBAQCAtMzEsNyArMzEsNyBA QAo+PiDCoCAjZGVmaW5lIEdVQ19ET09SQkVMTF9JTlZBTElEwqDCoMKgwqDCoMKgwqAgMjU2Cj4+ IC0jZGVmaW5lIEdVQ19EQl9TSVpFwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoUEFHRV9TSVpFKQo+ PiArI2RlZmluZSBHVUNfUERfU0laRcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKFBBR0VfU0laRSkK Pj4gwqAgI2RlZmluZSBHVUNfV1FfU0laRcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKFBBR0VfU0la RSAqIDIpCj4+IMKgIC8qIFdvcmsgcXVldWUgaXRlbSBoZWFkZXIgZGVmaW5pdGlvbnMgKi8KPj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL2ludGVsX2d1Y19zdWJtaXNz aW9uLmMgCj4+IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX3N1Ym1pc3Np b24uYwo+PiBpbmRleCA2YWMyMTNkZGJmYTMuLjAwODhjMzQxNzY0MSAxMDA2NDQKPj4gLS0tIGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX3N1Ym1pc3Npb24uYwo+PiArKysg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9ndWNfc3VibWlzc2lvbi5jCj4+IEBA IC0zMCw4ICszMCw4IEBACj4+IMKgwqAgKiBHdUMgY2xpZW50Ogo+PiDCoMKgICogQSBpbnRlbF9n dWNfY2xpZW50IHJlZmVycyB0byBhIHN1Ym1pc3Npb24gcGF0aCB0aHJvdWdoIEd1Qy4gCj4+IEN1 cnJlbnRseSwgdGhlcmUKPj4gwqDCoCAqIGlzIG9ubHkgb25lIGNsaWVudCwgd2hpY2ggaXMgY2hh cmdlZCB3aXRoIGFsbCBzdWJtaXNzaW9ucyB0byB0aGUgCj4+IEd1Qy4gVGhpcwo+PiAtICogc3Ry dWN0IGlzIHRoZSBvd25lciBvZiBhIGRvb3JiZWxsLCBhIHByb2Nlc3MgZGVzY3JpcHRvciBhbmQg YSAKPj4gd29ya3F1ZXVlIChhbGwKPj4gLSAqIG9mIHRoZW0gaW5zaWRlIGEgc2luZ2xlIGdlbSBv YmplY3QgdGhhdCBjb250YWlucyBhbGwgcmVxdWlyZWQgCj4+IHBhZ2VzIGZvciB0aGVzZQo+PiAr ICogc3RydWN0IGlzIHRoZSBvd25lciBvZiBhIHByb2Nlc3MgZGVzY3JpcHRvciBhbmQgYSB3b3Jr cXVldWUgKGJvdGggCj4+IG9mIHRoZW0KPj4gKyAqIGluc2lkZSBhIHNpbmdsZSBnZW0gb2JqZWN0 IHRoYXQgY29udGFpbnMgYWxsIHJlcXVpcmVkIHBhZ2VzIGZvciB0aGVzZQo+PiDCoMKgICogZWxl bWVudHMpLgo+PiDCoMKgICoKPj4gwqDCoCAqIEd1QyBzdGFnZSBkZXNjcmlwdG9yOgo+PiBAQCAt MzksMTMgKzM5LDEzIEBACj4+IMKgwqAgKiBkZXNjcmlwdG9ycywgYW5kIHNoYXJlcyB0aGVtIHdp dGggdGhlIEd1Qy4KPj4gwqDCoCAqIEN1cnJlbnRseSwgdGhlcmUgZXhpc3RzIGEgMToxIG1hcHBp bmcgYmV0d2VlbiBhIGludGVsX2d1Y19jbGllbnQgCj4+IGFuZCBhCj4+IMKgwqAgKiBndWNfc3Rh Z2VfZGVzYyAodmlhIHRoZSBjbGllbnQncyBzdGFnZV9pZCksIHNvIGVmZmVjdGl2ZWx5IG9ubHkg b25lCj4+IC0gKiBnZXRzIHVzZWQuIFRoaXMgc3RhZ2UgZGVzY3JpcHRvciBsZXRzIHRoZSBHdUMg a25vdyBhYm91dCB0aGUgCj4+IGRvb3JiZWxsLAo+PiAtICogd29ya3F1ZXVlIGFuZCBwcm9jZXNz IGRlc2NyaXB0b3IuIFRoZW9yZXRpY2FsbHksIGl0IGFsc28gbGV0cyB0aGUgR3VDCj4+IC0gKiBr bm93IGFib3V0IG91ciBIVyBjb250ZXh0cyAoY29udGV4dCBJRCwgZXRjLi4uKSwgYnV0IHdlIGFj dHVhbGx5Cj4+IC0gKiBlbXBsb3kgYSBraW5kIG9mIHN1Ym1pc3Npb24gd2hlcmUgdGhlIEd1QyB1 c2VzIHRoZSBMUkNBIHNlbnQgdmlhIAo+PiB0aGUgd29yawo+PiAtICogaXRlbSBpbnN0ZWFkICh0 aGUgc2luZ2xlIGd1Y19zdGFnZV9kZXNjIGFzc29jaWF0ZWQgdG8gZXhlY2J1ZiBjbGllbnQKPj4g LSAqIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZWZhdWx0IGtlcm5lbCBjb250ZXh0 IG9ubHksIGJ1dCAKPj4gdGhpcyBpcwo+PiAtICogZXNzZW50aWFsbHkgdW51c2VkKS4gVGhpcyBp cyBjYWxsZWQgYSAicHJveHkiIHN1Ym1pc3Npb24uCj4+ICsgKiBnZXRzIHVzZWQuIFRoaXMgc3Rh Z2UgZGVzY3JpcHRvciBsZXRzIHRoZSBHdUMga25vdyBhYm91dCB0aGUgCj4+IHdvcmtxdWV1ZSBh bmQKPj4gKyAqIHByb2Nlc3MgZGVzY3JpcHRvci4gVGhlb3JldGljYWxseSwgaXQgYWxzbyBsZXRz IHRoZSBHdUMga25vdyBhYm91dCAKPj4gb3VyIEhXCj4+ICsgKiBjb250ZXh0cyAoY29udGV4dCBJ RCwgZXRjLi4uKSwgYnV0IHdlIGFjdHVhbGx5IGVtcGxveSBhIGtpbmQgb2YgCj4+IHN1Ym1pc3Np b24KPj4gKyAqIHdoZXJlIHRoZSBHdUMgdXNlcyB0aGUgTFJDQSBzZW50IHZpYSB0aGUgd29yayBp dGVtIGluc3RlYWQgKHRoZSAKPj4gc2luZ2xlCj4+ICsgKiBndWNfc3RhZ2VfZGVzYyBhc3NvY2lh dGVkIHRvIGV4ZWNidWYgY2xpZW50IGNvbnRhaW5zIGluZm9ybWF0aW9uIAo+PiBhYm91dCB0aGUK Pj4gKyAqIGRlZmF1bHQga2VybmVsIGNvbnRleHQgb25seSwgYnV0IHRoaXMgaXMgZXNzZW50aWFs bHkgdW51c2VkKS4gVGhpcyAKPj4gaXMgY2FsbGVkCj4+ICsgKiBhICJwcm94eSIgc3VibWlzc2lv bi4KPj4gwqDCoCAqCj4+IMKgwqAgKiBUaGUgU2NyYXRjaCByZWdpc3RlcnM6Cj4+IMKgwqAgKiBU aGVyZSBhcmUgMTYgTU1JTy1iYXNlZCByZWdpc3RlcnMgc3RhcnQgZnJvbSAweEMxODAuIFRoZSBr ZXJuZWwgCj4+IGRyaXZlciB3cml0ZXMKPj4gQEAgLTU2LDEwICs1Niw2IEBACj4+IMKgwqAgKiB0 aGVuIHByb2NlZWRzLgo+PiDCoMKgICogU2VlIGludGVsX2d1Y19zZW5kKCkKPj4gwqDCoCAqCj4+ IC0gKiBEb29yYmVsbHM6Cj4+IC0gKiBEb29yYmVsbHMgYXJlIGludGVycnVwdHMgdG8gdUtlcm5l bC4gQSBkb29yYmVsbCBpcyBhIHNpbmdsZSBjYWNoZSAKPj4gbGluZSAoUVcpCj4+IC0gKiBtYXBw ZWQgaW50byBwcm9jZXNzIHNwYWNlLgo+PiAtICoKPj4gwqDCoCAqIFdvcmsgSXRlbXM6Cj4+IMKg wqAgKiBUaGVyZSBhcmUgc2V2ZXJhbCB0eXBlcyBvZiB3b3JrIGl0ZW1zIHRoYXQgdGhlIGhvc3Qg bWF5IHBsYWNlIGludG8gYQo+PiDCoMKgICogd29ya3F1ZXVlLCBlYWNoIHdpdGggaXRzIG93biBy ZXF1aXJlbWVudHMgYW5kIGxpbWl0YXRpb25zLiAKPj4gQ3VycmVudGx5IG9ubHkKPj4gQEAgLTgx LDc4ICs3Nyw2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19oaWdoX3ByaW9yaXR5KHN0cnVjdCAK Pj4gaW50ZWxfZ3VjX2NsaWVudCAqY2xpZW50KQo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgY2xpZW50 LT5wcmlvcml0eSA9PSBHVUNfQ0xJRU5UX1BSSU9SSVRZX0hJR0gpOwo+PiDCoCB9Cj4+IC1zdGF0 aWMgaW50IHJlc2VydmVfZG9vcmJlbGwoc3RydWN0IGludGVsX2d1Y19jbGllbnQgKmNsaWVudCkK Pj4gLXsKPj4gLcKgwqDCoCB1bnNpZ25lZCBsb25nIG9mZnNldDsKPj4gLcKgwqDCoCB1bnNpZ25l ZCBsb25nIGVuZDsKPj4gLcKgwqDCoCB1MTYgaWQ7Cj4+IC0KPj4gLcKgwqDCoCBHRU1fQlVHX09O KGNsaWVudC0+ZG9vcmJlbGxfaWQgIT0gR1VDX0RPT1JCRUxMX0lOVkFMSUQpOwo+PiAtCj4+IC3C oMKgwqAgLyoKPj4gLcKgwqDCoMKgICogVGhlIGJpdG1hcCB0cmFja3Mgd2hpY2ggZG9vcmJlbGwg cmVnaXN0ZXJzIGFyZSBjdXJyZW50bHkgaW4gdXNlLgo+PiAtwqDCoMKgwqAgKiBJdCBpcyBzcGxp dCBpbnRvIHR3byBoYWx2ZXM7IHRoZSBmaXJzdCBoYWxmIGlzIHVzZWQgZm9yIG5vcm1hbAo+PiAt wqDCoMKgwqAgKiBwcmlvcml0eSBjb250ZXh0cywgdGhlIHNlY29uZCBoYWxmIGZvciBoaWdoLXBy aW9yaXR5IG9uZXMuCj4+IC3CoMKgwqDCoCAqLwo+PiAtwqDCoMKgIG9mZnNldCA9IDA7Cj4+IC3C oMKgwqAgZW5kID0gR1VDX05VTV9ET09SQkVMTFMgLyAyOwo+PiAtwqDCoMKgIGlmIChpc19oaWdo X3ByaW9yaXR5KGNsaWVudCkpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIG9mZnNldCA9IGVuZDsKPj4g LcKgwqDCoMKgwqDCoMKgIGVuZCArPSBvZmZzZXQ7Cj4+IC3CoMKgwqAgfQo+PiAtCj4+IC3CoMKg wqAgaWQgPSBmaW5kX25leHRfemVyb19iaXQoY2xpZW50LT5ndWMtPmRvb3JiZWxsX2JpdG1hcCwg ZW5kLCBvZmZzZXQpOwo+PiAtwqDCoMKgIGlmIChpZCA9PSBlbmQpCj4+IC3CoMKgwqDCoMKgwqDC oCByZXR1cm4gLUVOT1NQQzsKPj4gLQo+PiAtwqDCoMKgIF9fc2V0X2JpdChpZCwgY2xpZW50LT5n dWMtPmRvb3JiZWxsX2JpdG1hcCk7Cj4+IC3CoMKgwqAgY2xpZW50LT5kb29yYmVsbF9pZCA9IGlk Owo+PiAtwqDCoMKgIERSTV9ERUJVR19EUklWRVIoImNsaWVudCAldSAoaGlnaCBwcmlvPSVzKSBy ZXNlcnZlZCBkb29yYmVsbDogJWRcbiIsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2xp ZW50LT5zdGFnZV9pZCwgeWVzbm8oaXNfaGlnaF9wcmlvcml0eShjbGllbnQpKSwKPj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBpZCk7Cj4+IC3CoMKgwqAgcmV0dXJuIDA7Cj4+IC19Cj4+IC0K Pj4gLXN0YXRpYyBib29sIGhhc19kb29yYmVsbChzdHJ1Y3QgaW50ZWxfZ3VjX2NsaWVudCAqY2xp ZW50KQo+PiAtewo+PiAtwqDCoMKgIGlmIChjbGllbnQtPmRvb3JiZWxsX2lkID09IEdVQ19ET09S QkVMTF9JTlZBTElEKQo+PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGZhbHNlOwo+PiAtCj4+IC3C oMKgwqAgcmV0dXJuIHRlc3RfYml0KGNsaWVudC0+ZG9vcmJlbGxfaWQsIGNsaWVudC0+Z3VjLT5k b29yYmVsbF9iaXRtYXApOwo+PiAtfQo+PiAtCj4+IC1zdGF0aWMgdm9pZCB1bnJlc2VydmVfZG9v cmJlbGwoc3RydWN0IGludGVsX2d1Y19jbGllbnQgKmNsaWVudCkKPj4gLXsKPj4gLcKgwqDCoCBH RU1fQlVHX09OKCFoYXNfZG9vcmJlbGwoY2xpZW50KSk7Cj4+IC0KPj4gLcKgwqDCoCBfX2NsZWFy X2JpdChjbGllbnQtPmRvb3JiZWxsX2lkLCBjbGllbnQtPmd1Yy0+ZG9vcmJlbGxfYml0bWFwKTsK Pj4gLcKgwqDCoCBjbGllbnQtPmRvb3JiZWxsX2lkID0gR1VDX0RPT1JCRUxMX0lOVkFMSUQ7Cj4+ IC19Cj4+IC0KPj4gLS8qCj4+IC0gKiBUZWxsIHRoZSBHdUMgdG8gYWxsb2NhdGUgb3IgZGVhbGxv Y2F0ZSBhIHNwZWNpZmljIGRvb3JiZWxsCj4+IC0gKi8KPj4gLQo+PiAtc3RhdGljIGludCBfX2d1 Y19hbGxvY2F0ZV9kb29yYmVsbChzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsIHUzMiBzdGFnZV9pZCkK Pj4gLXsKPj4gLcKgwqDCoCB1MzIgYWN0aW9uW10gPSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCBJTlRF TF9HVUNfQUNUSU9OX0FMTE9DQVRFX0RPT1JCRUxMLAo+PiAtwqDCoMKgwqDCoMKgwqAgc3RhZ2Vf aWQKPj4gLcKgwqDCoCB9Owo+PiAtCj4+IC3CoMKgwqAgcmV0dXJuIGludGVsX2d1Y19zZW5kKGd1 YywgYWN0aW9uLCBBUlJBWV9TSVpFKGFjdGlvbikpOwo+PiAtfQo+PiAtCj4+IC1zdGF0aWMgaW50 IF9fZ3VjX2RlYWxsb2NhdGVfZG9vcmJlbGwoc3RydWN0IGludGVsX2d1YyAqZ3VjLCB1MzIgCj4+ IHN0YWdlX2lkKQo+PiAtewo+PiAtwqDCoMKgIHUzMiBhY3Rpb25bXSA9IHsKPj4gLcKgwqDCoMKg wqDCoMKgIElOVEVMX0dVQ19BQ1RJT05fREVBTExPQ0FURV9ET09SQkVMTCwKPj4gLcKgwqDCoMKg wqDCoMKgIHN0YWdlX2lkCj4+IC3CoMKgwqAgfTsKPj4gLQo+PiAtwqDCoMKgIHJldHVybiBpbnRl bF9ndWNfc2VuZChndWMsIGFjdGlvbiwgQVJSQVlfU0laRShhY3Rpb24pKTsKPj4gLX0KPj4gLQo+ PiDCoCBzdGF0aWMgc3RydWN0IGd1Y19zdGFnZV9kZXNjICpfX2dldF9zdGFnZV9kZXNjKHN0cnVj dCAKPj4gaW50ZWxfZ3VjX2NsaWVudCAqY2xpZW50KQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAgc3Ry dWN0IGd1Y19zdGFnZV9kZXNjICpiYXNlID0gY2xpZW50LT5ndWMtPnN0YWdlX2Rlc2NfcG9vbF92 YWRkcjsKPj4gQEAgLTE2MCwxMTggKzg0LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgZ3VjX3N0YWdlX2Rl c2MgCj4+ICpfX2dldF9zdGFnZV9kZXNjKHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQp Cj4+IMKgwqDCoMKgwqAgcmV0dXJuICZiYXNlW2NsaWVudC0+c3RhZ2VfaWRdOwo+PiDCoCB9Cj4+ IC0vKgo+PiAtICogSW5pdGlhbGlzZSwgdXBkYXRlLCBvciBjbGVhciBkb29yYmVsbCBkYXRhIHNo YXJlZCB3aXRoIHRoZSBHdUMKPj4gLSAqCj4+IC0gKiBUaGVzZSBmdW5jdGlvbnMgbW9kaWZ5IHNo YXJlZCBkYXRhIGFuZCBzbyBuZWVkIGFjY2VzcyB0byB0aGUgbWFwcGVkCj4+IC0gKiBjbGllbnQg b2JqZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBwYWdlIGJlaW5nIHVzZWQgZm9yIHRoZSBkb29yYmVs bAo+PiAtICovCj4+IC0KPj4gLXN0YXRpYyB2b2lkIF9fdXBkYXRlX2Rvb3JiZWxsX2Rlc2Moc3Ry dWN0IGludGVsX2d1Y19jbGllbnQgKmNsaWVudCwgCj4+IHUxNiBuZXdfaWQpCj4+IC17Cj4+IC3C oMKgwqAgc3RydWN0IGd1Y19zdGFnZV9kZXNjICpkZXNjOwo+PiAtCj4+IC3CoMKgwqAgLyogVXBk YXRlIHRoZSBHdUMncyBpZGVhIG9mIHRoZSBkb29yYmVsbCBJRCAqLwo+PiAtwqDCoMKgIGRlc2Mg PSBfX2dldF9zdGFnZV9kZXNjKGNsaWVudCk7Cj4+IC3CoMKgwqAgZGVzYy0+ZGJfaWQgPSBuZXdf aWQ7Cj4+IC19Cj4+IC0KPj4gLXN0YXRpYyBzdHJ1Y3QgZ3VjX2Rvb3JiZWxsX2luZm8gKl9fZ2V0 X2Rvb3JiZWxsKHN0cnVjdCAKPj4gaW50ZWxfZ3VjX2NsaWVudCAqY2xpZW50KQo+PiAtewo+PiAt wqDCoMKgIHJldHVybiBjbGllbnQtPnZhZGRyICsgY2xpZW50LT5kb29yYmVsbF9vZmZzZXQ7Cj4+ IC19Cj4+IC0KPj4gLXN0YXRpYyBib29sIF9fZG9vcmJlbGxfdmFsaWQoc3RydWN0IGludGVsX2d1 YyAqZ3VjLCB1MTYgZGJfaWQpCj4+IC17Cj4+IC3CoMKgwqAgc3RydWN0IGludGVsX3VuY29yZSAq dW5jb3JlID0gZ3VjX3RvX2d0KGd1YyktPnVuY29yZTsKPj4gLQo+PiAtwqDCoMKgIEdFTV9CVUdf T04oZGJfaWQgPj0gR1VDX05VTV9ET09SQkVMTFMpOwo+PiAtwqDCoMKgIHJldHVybiBpbnRlbF91 bmNvcmVfcmVhZCh1bmNvcmUsIEdFTjhfRFJCUkVHTChkYl9pZCkpICYgCj4+IEdFTjhfRFJCX1ZB TElEOwo+PiAtfQo+PiAtCj4+IC1zdGF0aWMgdm9pZCBfX2luaXRfZG9vcmJlbGwoc3RydWN0IGlu dGVsX2d1Y19jbGllbnQgKmNsaWVudCkKPj4gLXsKPj4gLcKgwqDCoCBzdHJ1Y3QgZ3VjX2Rvb3Ji ZWxsX2luZm8gKmRvb3JiZWxsOwo+PiAtCj4+IC3CoMKgwqAgZG9vcmJlbGwgPSBfX2dldF9kb29y YmVsbChjbGllbnQpOwo+PiAtwqDCoMKgIGRvb3JiZWxsLT5kYl9zdGF0dXMgPSBHVUNfRE9PUkJF TExfRU5BQkxFRDsKPj4gLcKgwqDCoCBkb29yYmVsbC0+Y29va2llID0gMDsKPj4gLX0KPj4gLQo+ PiAtc3RhdGljIHZvaWQgX19maW5pX2Rvb3JiZWxsKHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpj bGllbnQpCj4+IC17Cj4+IC3CoMKgwqAgc3RydWN0IGd1Y19kb29yYmVsbF9pbmZvICpkb29yYmVs bDsKPj4gLcKgwqDCoCB1MTYgZGJfaWQgPSBjbGllbnQtPmRvb3JiZWxsX2lkOwo+PiAtCj4+IC3C oMKgwqAgZG9vcmJlbGwgPSBfX2dldF9kb29yYmVsbChjbGllbnQpOwo+PiAtwqDCoMKgIGRvb3Ji ZWxsLT5kYl9zdGF0dXMgPSBHVUNfRE9PUkJFTExfRElTQUJMRUQ7Cj4+IC0KPj4gLcKgwqDCoCAv KiBEb29yYmVsbCByZWxlYXNlIGZsb3cgcmVxdWlyZXMgdGhhdCB3ZSB3YWl0IGZvciBHRU44X0RS Ql9WQUxJRCAKPj4gYml0Cj4+IC3CoMKgwqDCoCAqIHRvIGdvIHRvIHplcm8gYWZ0ZXIgdXBkYXRp bmcgZGJfc3RhdHVzIGJlZm9yZSB3ZSBjYWxsIHRoZSBHdUMgdG8KPj4gLcKgwqDCoMKgICogcmVs ZWFzZSB0aGUgZG9vcmJlbGwKPj4gLcKgwqDCoMKgICovCj4+IC3CoMKgwqAgaWYgKHdhaXRfZm9y X3VzKCFfX2Rvb3JiZWxsX3ZhbGlkKGNsaWVudC0+Z3VjLCBkYl9pZCksIDEwKSkKPj4gLcKgwqDC oMKgwqDCoMKgIFdBUk5fT05DRSh0cnVlLCAiRG9vcmJlbGwgbmV2ZXIgYmVjYW1lIGludmFsaWQg YWZ0ZXIgCj4+IGRpc2FibGVcbiIpOwo+PiAtfQo+PiAtCj4+IC1zdGF0aWMgaW50IGNyZWF0ZV9k b29yYmVsbChzdHJ1Y3QgaW50ZWxfZ3VjX2NsaWVudCAqY2xpZW50KQo+PiAtewo+PiAtwqDCoMKg IGludCByZXQ7Cj4+IC0KPj4gLcKgwqDCoCBpZiAoV0FSTl9PTighaGFzX2Rvb3JiZWxsKGNsaWVu dCkpKQo+PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9ERVY7IC8qIGludGVybmFsIHNldHVw IGVycm9yLCBzaG91bGQgbmV2ZXIgaGFwcGVuICovCj4+IC0KPj4gLcKgwqDCoCBfX3VwZGF0ZV9k b29yYmVsbF9kZXNjKGNsaWVudCwgY2xpZW50LT5kb29yYmVsbF9pZCk7Cj4+IC3CoMKgwqAgX19p bml0X2Rvb3JiZWxsKGNsaWVudCk7Cj4+IC0KPj4gLcKgwqDCoCByZXQgPSBfX2d1Y19hbGxvY2F0 ZV9kb29yYmVsbChjbGllbnQtPmd1YywgY2xpZW50LT5zdGFnZV9pZCk7Cj4+IC3CoMKgwqAgaWYg KHJldCkgewo+PiAtwqDCoMKgwqDCoMKgwqAgX19maW5pX2Rvb3JiZWxsKGNsaWVudCk7Cj4+IC3C oMKgwqDCoMKgwqDCoCBfX3VwZGF0ZV9kb29yYmVsbF9kZXNjKGNsaWVudCwgR1VDX0RPT1JCRUxM X0lOVkFMSUQpOwo+PiAtwqDCoMKgwqDCoMKgwqAgRFJNX0RFQlVHX0RSSVZFUigiQ291bGRuJ3Qg Y3JlYXRlIGNsaWVudCAldSBkb29yYmVsbDogJWRcbiIsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBjbGllbnQtPnN0YWdlX2lkLCByZXQpOwo+PiAtwqDCoMKgwqDCoMKgwqAg cmV0dXJuIHJldDsKPj4gLcKgwqDCoCB9Cj4+IC0KPj4gLcKgwqDCoCByZXR1cm4gMDsKPj4gLX0K Pj4gLQo+PiAtc3RhdGljIGludCBkZXN0cm95X2Rvb3JiZWxsKHN0cnVjdCBpbnRlbF9ndWNfY2xp ZW50ICpjbGllbnQpCj4+IC17Cj4+IC3CoMKgwqAgaW50IHJldDsKPj4gLQo+PiAtwqDCoMKgIEdF TV9CVUdfT04oIWhhc19kb29yYmVsbChjbGllbnQpKTsKPj4gLQo+PiAtwqDCoMKgIF9fZmluaV9k b29yYmVsbChjbGllbnQpOwo+PiAtwqDCoMKgIHJldCA9IF9fZ3VjX2RlYWxsb2NhdGVfZG9vcmJl bGwoY2xpZW50LT5ndWMsIGNsaWVudC0+c3RhZ2VfaWQpOwo+PiAtwqDCoMKgIGlmIChyZXQpCj4+ IC3CoMKgwqDCoMKgwqDCoCBEUk1fRVJST1IoIkNvdWxkbid0IGRlc3Ryb3kgY2xpZW50ICV1IGRv b3JiZWxsOiAlZFxuIiwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNsaWVudC0+c3Rh Z2VfaWQsIHJldCk7Cj4+IC0KPj4gLcKgwqDCoCBfX3VwZGF0ZV9kb29yYmVsbF9kZXNjKGNsaWVu dCwgR1VDX0RPT1JCRUxMX0lOVkFMSUQpOwo+PiAtCj4+IC3CoMKgwqAgcmV0dXJuIHJldDsKPj4g LX0KPj4gLQo+PiAtc3RhdGljIHVuc2lnbmVkIGxvbmcgX19zZWxlY3RfY2FjaGVsaW5lKHN0cnVj dCBpbnRlbF9ndWMgKmd1YykKPj4gLXsKPj4gLcKgwqDCoCB1bnNpZ25lZCBsb25nIG9mZnNldDsK Pj4gLQo+PiAtwqDCoMKgIC8qIERvb3JiZWxsIHVzZXMgYSBzaW5nbGUgY2FjaGUgbGluZSB3aXRo aW4gYSBwYWdlICovCj4+IC3CoMKgwqAgb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoZ3VjLT5kYl9j YWNoZWxpbmUpOwo+PiAtCj4+IC3CoMKgwqAgLyogTW92aW5nIHRvIG5leHQgY2FjaGUgbGluZSB0 byByZWR1Y2UgY29udGVudGlvbiAqLwo+PiAtwqDCoMKgIGd1Yy0+ZGJfY2FjaGVsaW5lICs9IGNh Y2hlX2xpbmVfc2l6ZSgpOwo+PiAtCj4+IC3CoMKgwqAgRFJNX0RFQlVHX0RSSVZFUigicmVzZXJ2 ZWQgY2FjaGVsaW5lIDB4JWx4LCBuZXh0IDB4JXgsIGxpbmVzaXplIAo+PiAldVxuIiwKPj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBvZmZzZXQsIGd1Yy0+ZGJfY2FjaGVsaW5lLCBjYWNoZV9s aW5lX3NpemUoKSk7Cj4+IC3CoMKgwqAgcmV0dXJuIG9mZnNldDsKPj4gLX0KPj4gLQo+PiDCoCBz dGF0aWMgaW5saW5lIHN0cnVjdCBndWNfcHJvY2Vzc19kZXNjICoKPj4gwqAgX19nZXRfcHJvY2Vz c19kZXNjKHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQpCj4+IMKgIHsKPj4gLcKgwqDC oCByZXR1cm4gY2xpZW50LT52YWRkciArIGNsaWVudC0+cHJvY19kZXNjX29mZnNldDsKPj4gK8Kg wqDCoCByZXR1cm4gY2xpZW50LT52YWRkcjsKPj4gwqAgfQo+PiDCoCAvKgo+PiBAQCAtMzMyLDgg KzE0OCw4IEBAIHN0YXRpYyB2b2lkIGd1Y19zdGFnZV9kZXNjX3Bvb2xfZGVzdHJveShzdHJ1Y3Qg Cj4+IGludGVsX2d1YyAqZ3VjKQo+PiDCoMKgICogSW5pdGlhbGlzZS9jbGVhciB0aGUgc3RhZ2Ug ZGVzY3JpcHRvciBzaGFyZWQgd2l0aCB0aGUgR3VDIGZpcm13YXJlLgo+PiDCoMKgICoKPj4gwqDC oCAqIFRoaXMgZGVzY3JpcHRvciB0ZWxscyB0aGUgR3VDIHdoZXJlIChpbiBHR1RUIHNwYWNlKSB0 byBmaW5kIHRoZSAKPj4gaW1wb3J0YW50Cj4+IC0gKiBkYXRhIHN0cnVjdHVyZXMgcmVsYXRpbmcg dG8gdGhpcyBjbGllbnQgKGRvb3JiZWxsLCBwcm9jZXNzIAo+PiBkZXNjcmlwdG9yLAo+PiAtICog d3JpdGUgcXVldWUsIGV0YykuCj4+ICsgKiBkYXRhIHN0cnVjdHVyZXMgcmVsYXRpbmcgdG8gdGhp cyBjbGllbnQgKHByb2Nlc3MgZGVzY3JpcHRvciwgd3JpdGUgCj4+IHF1ZXVlLAo+PiArICogZXRj KS4KPj4gwqDCoCAqLwo+PiDCoCBzdGF0aWMgdm9pZCBndWNfc3RhZ2VfZGVzY19pbml0KHN0cnVj dCBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQpCj4+IMKgIHsKPj4gQEAgLTM1MCwxOSArMTY2LDE0 IEBAIHN0YXRpYyB2b2lkIGd1Y19zdGFnZV9kZXNjX2luaXQoc3RydWN0IAo+PiBpbnRlbF9ndWNf Y2xpZW50ICpjbGllbnQpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBkZXNjLT5hdHRyaWJ1dGUgfD0g R1VDX1NUQUdFX0RFU0NfQVRUUl9QUkVFTVBUOwo+PiDCoMKgwqDCoMKgIGRlc2MtPnN0YWdlX2lk ID0gY2xpZW50LT5zdGFnZV9pZDsKPj4gwqDCoMKgwqDCoCBkZXNjLT5wcmlvcml0eSA9IGNsaWVu dC0+cHJpb3JpdHk7Cj4+IC3CoMKgwqAgZGVzYy0+ZGJfaWQgPSBjbGllbnQtPmRvb3JiZWxsX2lk Owo+PiDCoMKgwqDCoMKgIC8qCj4+IC3CoMKgwqDCoCAqIFRoZSBkb29yYmVsbCwgcHJvY2VzcyBk ZXNjcmlwdG9yLCBhbmQgd29ya3F1ZXVlIGFyZSBhbGwgcGFydHMKPj4gLcKgwqDCoMKgICogb2Yg dGhlIGNsaWVudCBvYmplY3QsIHdoaWNoIHRoZSBHdUMgd2lsbCByZWZlcmVuY2UgdmlhIHRoZSBH R1RUCj4+ICvCoMKgwqDCoCAqIFRoZSBwcm9jZXNzIGRlc2NyaXB0b3IgYW5kIHdvcmtxdWV1ZSBh cmUgYWxsIHBhcnRzIG9mIHRoZSBjbGllbnQKPj4gK8KgwqDCoMKgICogb2JqZWN0LCB3aGljaCB0 aGUgR3VDIHdpbGwgcmVmZXJlbmNlIHZpYSB0aGUgR0dUVAo+PiDCoMKgwqDCoMKgwqAgKi8KPj4g wqDCoMKgwqDCoCBnZnhfYWRkciA9IGludGVsX2d1Y19nZ3R0X29mZnNldChndWMsIGNsaWVudC0+ dm1hKTsKPj4gLcKgwqDCoCBkZXNjLT5kYl90cmlnZ2VyX3BoeSA9IHNnX2RtYV9hZGRyZXNzKGNs aWVudC0+dm1hLT5wYWdlcy0+c2dsKSArCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgY2xpZW50LT5kb29yYmVsbF9vZmZzZXQ7Cj4+IC3CoMKgwqAgZGVzYy0+ZGJfdHJpZ2dlcl9j cHUgPSBwdHJfdG9fdTY0KF9fZ2V0X2Rvb3JiZWxsKGNsaWVudCkpOwo+PiAtwqDCoMKgIGRlc2Mt PmRiX3RyaWdnZXJfdWsgPSBnZnhfYWRkciArIGNsaWVudC0+ZG9vcmJlbGxfb2Zmc2V0Owo+PiAt wqDCoMKgIGRlc2MtPnByb2Nlc3NfZGVzYyA9IGdmeF9hZGRyICsgY2xpZW50LT5wcm9jX2Rlc2Nf b2Zmc2V0Owo+PiAtwqDCoMKgIGRlc2MtPndxX2FkZHIgPSBnZnhfYWRkciArIEdVQ19EQl9TSVpF Owo+PiArwqDCoMKgIGRlc2MtPnByb2Nlc3NfZGVzYyA9IGdmeF9hZGRyOwo+PiArwqDCoMKgIGRl c2MtPndxX2FkZHIgPSBnZnhfYWRkciArIEdVQ19QRF9TSVpFOwo+PiDCoMKgwqDCoMKgIGRlc2Mt PndxX3NpemUgPSBHVUNfV1FfU0laRTsKPj4gwqDCoMKgwqDCoCBkZXNjLT5kZXNjX3ByaXZhdGUg PSBwdHJfdG9fdTY0KGNsaWVudCk7Cj4+IEBAIC00MDgsNDggKzIxOSwyMyBAQCBzdGF0aWMgdm9p ZCBndWNfd3FfaXRlbV9hcHBlbmQoc3RydWN0IAo+PiBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQs Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEdVQ19XUV9TSVpFKSA8 IHdxaV9zaXplKTsKPj4gwqDCoMKgwqDCoCBHRU1fQlVHX09OKHdxX29mZiAmICh3cWlfc2l6ZSAt IDEpKTsKPj4gLcKgwqDCoCAvKiBXUSBzdGFydHMgZnJvbSB0aGUgcGFnZSBhZnRlciBkb29yYmVs bCAvIHByb2Nlc3NfZGVzYyAqLwo+PiAtwqDCoMKgIHdxaSA9IGNsaWVudC0+dmFkZHIgKyB3cV9v ZmYgKyBHVUNfREJfU0laRTsKPj4gLQo+PiAtwqDCoMKgIGlmIChJOTE1X1NFTEZURVNUX09OTFko Y2xpZW50LT51c2Vfbm9wX3dxaSkpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIHdxaS0+aGVhZGVyID0g V1FfVFlQRV9OT09QIHwgKHdxaV9sZW4gPDwgV1FfTEVOX1NISUZUKTsKPj4gLcKgwqDCoCB9IGVs c2Ugewo+PiAtwqDCoMKgwqDCoMKgwqAgLyogTm93IGZpbGwgaW4gdGhlIDQtd29yZCB3b3JrIHF1 ZXVlIGl0ZW0gKi8KPj4gLcKgwqDCoMKgwqDCoMKgIHdxaS0+aGVhZGVyID0gV1FfVFlQRV9JTk9S REVSIHwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHdxaV9sZW4gPDwg V1FfTEVOX1NISUZUKSB8Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh0 YXJnZXRfZW5naW5lIDw8IFdRX1RBUkdFVF9TSElGVCkgfAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBXUV9OT19XQ0ZMVVNIX1dBSVQ7Cj4+IC3CoMKgwqDCoMKgwqDCoCB3 cWktPmNvbnRleHRfZGVzYyA9IGNvbnRleHRfZGVzYzsKPj4gLcKgwqDCoMKgwqDCoMKgIHdxaS0+ c3VibWl0X2VsZW1lbnRfaW5mbyA9IHJpbmdfdGFpbCA8PCBXUV9SSU5HX1RBSUxfU0hJRlQ7Cj4+ IC3CoMKgwqDCoMKgwqDCoCBHRU1fQlVHX09OKHJpbmdfdGFpbCA+IFdRX1JJTkdfVEFJTF9NQVgp Owo+PiAtwqDCoMKgwqDCoMKgwqAgd3FpLT5mZW5jZV9pZCA9IGZlbmNlX2lkOwo+PiAtwqDCoMKg IH0KPj4gK8KgwqDCoCAvKiBXUSBzdGFydHMgZnJvbSB0aGUgcGFnZSBhZnRlciBwcm9jZXNzX2Rl c2MgKi8KPj4gK8KgwqDCoCB3cWkgPSBjbGllbnQtPnZhZGRyICsgd3Ffb2ZmICsgR1VDX1BEX1NJ WkU7Cj4+ICsKPj4gK8KgwqDCoCAvKiBOb3cgZmlsbCBpbiB0aGUgNC13b3JkIHdvcmsgcXVldWUg aXRlbSAqLwo+PiArwqDCoMKgIHdxaS0+aGVhZGVyID0gV1FfVFlQRV9JTk9SREVSIHwKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh3cWlfbGVuIDw8IFdRX0xFTl9TSElGVCkgfAo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHRhcmdldF9lbmdpbmUgPDwgV1FfVEFSR0VUX1NI SUZUKSB8Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBXUV9OT19XQ0ZMVVNIX1dBSVQ7 Cj4+ICvCoMKgwqAgd3FpLT5jb250ZXh0X2Rlc2MgPSBjb250ZXh0X2Rlc2M7Cj4+ICvCoMKgwqAg d3FpLT5zdWJtaXRfZWxlbWVudF9pbmZvID0gcmluZ190YWlsIDw8IFdRX1JJTkdfVEFJTF9TSElG VDsKPj4gK8KgwqDCoCBHRU1fQlVHX09OKHJpbmdfdGFpbCA+IFdRX1JJTkdfVEFJTF9NQVgpOwo+ PiArwqDCoMKgIHdxaS0+ZmVuY2VfaWQgPSBmZW5jZV9pZDsKPj4gwqDCoMKgwqDCoCAvKiBNYWtl IHRoZSB1cGRhdGUgdmlzaWJsZSB0byBHdUMgKi8KPj4gwqDCoMKgwqDCoCBXUklURV9PTkNFKGRl c2MtPnRhaWwsICh3cV9vZmYgKyB3cWlfc2l6ZSkgJiAoR1VDX1dRX1NJWkUgLSAxKSk7Cj4+IMKg IH0KPj4gLXN0YXRpYyB2b2lkIGd1Y19yaW5nX2Rvb3JiZWxsKHN0cnVjdCBpbnRlbF9ndWNfY2xp ZW50ICpjbGllbnQpCj4+IC17Cj4+IC3CoMKgwqAgc3RydWN0IGd1Y19kb29yYmVsbF9pbmZvICpk YjsKPj4gLcKgwqDCoCB1MzIgY29va2llOwo+PiAtCj4+IC3CoMKgwqAgbG9ja2RlcF9hc3NlcnRf aGVsZCgmY2xpZW50LT53cV9sb2NrKTsKPj4gLQo+PiAtwqDCoMKgIC8qIHBvaW50ZXIgb2YgY3Vy cmVudCBkb29yYmVsbCBjYWNoZWxpbmUgKi8KPj4gLcKgwqDCoCBkYiA9IF9fZ2V0X2Rvb3JiZWxs KGNsaWVudCk7Cj4+IC0KPj4gLcKgwqDCoCAvKgo+PiAtwqDCoMKgwqAgKiBXZSdyZSBub3QgZXhw ZWN0aW5nIHRoZSBkb29yYmVsbCBjb29raWUgdG8gY2hhbmdlIGJlaGluZCBvdXIgCj4+IGJhY2ss Cj4+IC3CoMKgwqDCoCAqIHdlIGFsc28gbmVlZCB0byB0cmVhdCAwIGFzIGEgcmVzZXJ2ZWQgdmFs dWUuCj4+IC3CoMKgwqDCoCAqLwo+PiAtwqDCoMKgIGNvb2tpZSA9IFJFQURfT05DRShkYi0+Y29v a2llKTsKPj4gLcKgwqDCoCBXQVJOX09OX09OQ0UoeGNoZygmZGItPmNvb2tpZSwgY29va2llICsg MSA/OiBjb29raWUgKyAyKSAhPSBjb29raWUpOwo+PiAtCj4+IC3CoMKgwqAgLyogWFhYOiBkb29y YmVsbCB3YXMgbG9zdCBhbmQgbmVlZCB0byBhY3F1aXJlIGl0IGFnYWluICovCj4+IC3CoMKgwqAg R0VNX0JVR19PTihkYi0+ZGJfc3RhdHVzICE9IEdVQ19ET09SQkVMTF9FTkFCTEVEKTsKPj4gLX0K Pj4gLQo+PiDCoCBzdGF0aWMgdm9pZCBndWNfYWRkX3JlcXVlc3Qoc3RydWN0IGludGVsX2d1YyAq Z3VjLCBzdHJ1Y3QgCj4+IGk5MTVfcmVxdWVzdCAqcnEpCj4+IMKgIHsKPj4gwqDCoMKgwqDCoCBz dHJ1Y3QgaW50ZWxfZ3VjX2NsaWVudCAqY2xpZW50ID0gZ3VjLT5leGVjYnVmX2NsaWVudDsKPj4g QEAgLTQ1OSw3ICsyNDUsNiBAQCBzdGF0aWMgdm9pZCBndWNfYWRkX3JlcXVlc3Qoc3RydWN0IGlu dGVsX2d1YyAqZ3VjLCAKPj4gc3RydWN0IGk5MTVfcmVxdWVzdCAqcnEpCj4+IMKgwqDCoMKgwqAg Z3VjX3dxX2l0ZW1fYXBwZW5kKGNsaWVudCwgZW5naW5lLT5ndWNfaWQsIGN0eF9kZXNjLAo+PiDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByaW5nX3RhaWwsIHJxLT5mZW5jZS5zZXFu byk7Cj4+IC3CoMKgwqAgZ3VjX3JpbmdfZG9vcmJlbGwoY2xpZW50KTsKPj4gwqAgfQo+PiDCoCAv Kgo+PiBAQCAtNzQ0LDM2ICs1MjksNiBAQCBzdGF0aWMgdm9pZCBndWNfcmVzZXRfZmluaXNoKHN0 cnVjdCAKPj4gaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCj4+IMKgwqAgKiBwYXRoIG9mIGd1Y19z dWJtaXQoKSBhYm92ZS4KPj4gwqDCoCAqLwo+PiAtLyogQ2hlY2sgdGhhdCBhIGRvb3JiZWxsIHJl Z2lzdGVyIGlzIGluIHRoZSBleHBlY3RlZCBzdGF0ZSAqLwo+PiAtc3RhdGljIGJvb2wgZG9vcmJl bGxfb2soc3RydWN0IGludGVsX2d1YyAqZ3VjLCB1MTYgZGJfaWQpCj4+IC17Cj4+IC3CoMKgwqAg Ym9vbCB2YWxpZDsKPj4gLQo+PiAtwqDCoMKgIEdFTV9CVUdfT04oZGJfaWQgPj0gR1VDX05VTV9E T09SQkVMTFMpOwo+PiAtCj4+IC3CoMKgwqAgdmFsaWQgPSBfX2Rvb3JiZWxsX3ZhbGlkKGd1Yywg ZGJfaWQpOwo+PiAtCj4+IC3CoMKgwqAgaWYgKHRlc3RfYml0KGRiX2lkLCBndWMtPmRvb3JiZWxs X2JpdG1hcCkgPT0gdmFsaWQpCj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gdHJ1ZTsKPj4gLQo+ PiAtwqDCoMKgIERSTV9ERUJVR19EUklWRVIoIkRvb3JiZWxsICV1IGhhcyB1bmV4cGVjdGVkIHN0 YXRlOiB2YWxpZD0lc1xuIiwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkYl9pZCwgeWVz bm8odmFsaWQpKTsKPj4gLQo+PiAtwqDCoMKgIHJldHVybiBmYWxzZTsKPj4gLX0KPj4gLQo+PiAt c3RhdGljIGJvb2wgZ3VjX3ZlcmlmeV9kb29yYmVsbHMoc3RydWN0IGludGVsX2d1YyAqZ3VjKQo+ PiAtewo+PiAtwqDCoMKgIGJvb2wgZG9vcmJlbGxzX29rID0gdHJ1ZTsKPj4gLcKgwqDCoCB1MTYg ZGJfaWQ7Cj4+IC0KPj4gLcKgwqDCoCBmb3IgKGRiX2lkID0gMDsgZGJfaWQgPCBHVUNfTlVNX0RP T1JCRUxMUzsgKytkYl9pZCkKPj4gLcKgwqDCoMKgwqDCoMKgIGlmICghZG9vcmJlbGxfb2soZ3Vj LCBkYl9pZCkpCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRvb3JiZWxsc19vayA9IGZhbHNl Owo+PiAtCj4+IC3CoMKgwqAgcmV0dXJuIGRvb3JiZWxsc19vazsKPj4gLX0KPj4gLQo+PiDCoCAv KioKPj4gwqDCoCAqIGd1Y19jbGllbnRfYWxsb2MoKSAtIEFsbG9jYXRlIGFuIGludGVsX2d1Y19j bGllbnQKPj4gwqDCoCAqIEBndWM6wqDCoMKgIHRoZSBpbnRlbF9ndWMgc3RydWN0dXJlCj4+IEBA IC03OTgsNyArNTUzLDYgQEAgZ3VjX2NsaWVudF9hbGxvYyhzdHJ1Y3QgaW50ZWxfZ3VjICpndWMs IHUzMiBwcmlvcml0eSkKPj4gwqDCoMKgwqDCoCBjbGllbnQtPmd1YyA9IGd1YzsKPj4gwqDCoMKg wqDCoCBjbGllbnQtPnByaW9yaXR5ID0gcHJpb3JpdHk7Cj4+IC3CoMKgwqAgY2xpZW50LT5kb29y YmVsbF9pZCA9IEdVQ19ET09SQkVMTF9JTlZBTElEOwo+PiDCoMKgwqDCoMKgIHNwaW5fbG9ja19p bml0KCZjbGllbnQtPndxX2xvY2spOwo+PiDCoMKgwqDCoMKgIHJldCA9IGlkYV9zaW1wbGVfZ2V0 KCZndWMtPnN0YWdlX2lkcywgMCwgR1VDX01BWF9TVEFHRV9ERVNDUklQVE9SUywKPj4gQEAgLTgw OSw3ICs1NjMsNyBAQCBndWNfY2xpZW50X2FsbG9jKHN0cnVjdCBpbnRlbF9ndWMgKmd1YywgdTMy IHByaW9yaXR5KQo+PiDCoMKgwqDCoMKgIGNsaWVudC0+c3RhZ2VfaWQgPSByZXQ7Cj4+IMKgwqDC oMKgwqAgLyogVGhlIGZpcnN0IHBhZ2UgaXMgZG9vcmJlbGwvcHJvY19kZXNjLiBUd28gZm9sbG93 ZWQgcGFnZXMgYXJlIAo+PiB3cS4gKi8KPiBOZWVkIHRvIHVwZGF0ZSB0aGlzIGNvbW1lbnQgYXMg d2VsbC4KPiAKCmFjawoKPj4gLcKgwqDCoCB2bWEgPSBpbnRlbF9ndWNfYWxsb2NhdGVfdm1hKGd1 YywgR1VDX0RCX1NJWkUgKyBHVUNfV1FfU0laRSk7Cj4+ICvCoMKgwqAgdm1hID0gaW50ZWxfZ3Vj X2FsbG9jYXRlX3ZtYShndWMsIEdVQ19QRF9TSVpFICsgR1VDX1dRX1NJWkUpOwo+PiDCoMKgwqDC oMKgIGlmIChJU19FUlIodm1hKSkgewo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gUFRSX0VS Uih2bWEpOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBlcnJfaWQ7Cj4+IEBAIC04MjUsMzEg KzU3OSwxMSBAQCBndWNfY2xpZW50X2FsbG9jKHN0cnVjdCBpbnRlbF9ndWMgKmd1YywgdTMyIAo+ PiBwcmlvcml0eSkKPj4gwqDCoMKgwqDCoCB9Cj4+IMKgwqDCoMKgwqAgY2xpZW50LT52YWRkciA9 IHZhZGRyOwo+PiAtwqDCoMKgIHJldCA9IHJlc2VydmVfZG9vcmJlbGwoY2xpZW50KTsKPj4gLcKg wqDCoCBpZiAocmV0KQo+PiAtwqDCoMKgwqDCoMKgwqAgZ290byBlcnJfdmFkZHI7Cj4+IC0KPj4g LcKgwqDCoCBjbGllbnQtPmRvb3JiZWxsX29mZnNldCA9IF9fc2VsZWN0X2NhY2hlbGluZShndWMp Owo+PiAtCj4+IC3CoMKgwqAgLyoKPj4gLcKgwqDCoMKgICogU2luY2UgdGhlIGRvb3JiZWxsIG9u bHkgcmVxdWlyZXMgYSBzaW5nbGUgY2FjaGVsaW5lLCB3ZSBjYW4gc2F2ZQo+PiAtwqDCoMKgwqAg KiBzcGFjZSBieSBwdXR0aW5nIHRoZSBhcHBsaWNhdGlvbiBwcm9jZXNzIGRlc2NyaXB0b3IgaW4g dGhlIHNhbWUKPj4gLcKgwqDCoMKgICogcGFnZS4gVXNlIHRoZSBoYWxmIG9mIHRoZSBwYWdlIHRo YXQgZG9lc24ndCBpbmNsdWRlIHRoZSBkb29yYmVsbC4KPj4gLcKgwqDCoMKgICovCj4+IC3CoMKg wqAgaWYgKGNsaWVudC0+ZG9vcmJlbGxfb2Zmc2V0ID49IChHVUNfREJfU0laRSAvIDIpKQo+PiAt wqDCoMKgwqDCoMKgwqAgY2xpZW50LT5wcm9jX2Rlc2Nfb2Zmc2V0ID0gMDsKPj4gLcKgwqDCoCBl bHNlCj4+IC3CoMKgwqDCoMKgwqDCoCBjbGllbnQtPnByb2NfZGVzY19vZmZzZXQgPSAoR1VDX0RC X1NJWkUgLyAyKTsKPj4gLQo+PiDCoMKgwqDCoMKgIERSTV9ERUJVR19EUklWRVIoIm5ldyBwcmlv cml0eSAldSBjbGllbnQgJXA6IHN0YWdlX2lkICV1XG4iLAo+PiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHByaW9yaXR5LCBjbGllbnQsIGNsaWVudC0+c3RhZ2VfaWQpOwo+PiAtwqDCoMKg IERSTV9ERUJVR19EUklWRVIoImRvb3JiZWxsIGlkICV1LCBjYWNoZWxpbmUgb2Zmc2V0IDB4JWx4 XG4iLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNsaWVudC0+ZG9vcmJlbGxfaWQsIGNs aWVudC0+ZG9vcmJlbGxfb2Zmc2V0KTsKPj4gwqDCoMKgwqDCoCByZXR1cm4gY2xpZW50Owo+PiAt ZXJyX3ZhZGRyOgo+PiAtwqDCoMKgIGk5MTVfZ2VtX29iamVjdF91bnBpbl9tYXAoY2xpZW50LT52 bWEtPm9iaik7Cj4+IMKgIGVycl92bWE6Cj4+IMKgwqDCoMKgwqAgaTkxNV92bWFfdW5waW5fYW5k X3JlbGVhc2UoJmNsaWVudC0+dm1hLCAwKTsKPj4gwqAgZXJyX2lkOgo+PiBAQCAtODYxLDcgKzU5 NSw2IEBAIGd1Y19jbGllbnRfYWxsb2Moc3RydWN0IGludGVsX2d1YyAqZ3VjLCB1MzIgcHJpb3Jp dHkpCj4+IMKgIHN0YXRpYyB2b2lkIGd1Y19jbGllbnRfZnJlZShzdHJ1Y3QgaW50ZWxfZ3VjX2Ns aWVudCAqY2xpZW50KQo+PiDCoCB7Cj4+IC3CoMKgwqAgdW5yZXNlcnZlX2Rvb3JiZWxsKGNsaWVu dCk7Cj4+IMKgwqDCoMKgwqAgaTkxNV92bWFfdW5waW5fYW5kX3JlbGVhc2UoJmNsaWVudC0+dm1h LCBJOTE1X1ZNQV9SRUxFQVNFX01BUCk7Cj4+IMKgwqDCoMKgwqAgaWRhX3NpbXBsZV9yZW1vdmUo JmNsaWVudC0+Z3VjLT5zdGFnZV9pZHMsIGNsaWVudC0+c3RhZ2VfaWQpOwo+PiDCoMKgwqDCoMKg IGtmcmVlKGNsaWVudCk7Cj4+IEBAIC04OTIsNDQgKzYyNSwyMSBAQCBzdGF0aWMgdm9pZCBndWNf Y2xpZW50c19kZXN0cm95KHN0cnVjdCBpbnRlbF9ndWMgCj4+ICpndWMpCj4+IMKgwqDCoMKgwqDC oMKgwqDCoCBndWNfY2xpZW50X2ZyZWUoY2xpZW50KTsKPj4gwqAgfQo+PiAtc3RhdGljIGludCBf X2d1Y19jbGllbnRfZW5hYmxlKHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQpCj4+ICtz dGF0aWMgdm9pZCBfX2d1Y19jbGllbnRfZW5hYmxlKHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpj bGllbnQpCj4+IMKgIHsKPj4gLcKgwqDCoCBpbnQgcmV0Owo+PiAtCj4+IMKgwqDCoMKgwqAgZ3Vj X3Byb2NfZGVzY19pbml0KGNsaWVudCk7Cj4+IMKgwqDCoMKgwqAgZ3VjX3N0YWdlX2Rlc2NfaW5p dChjbGllbnQpOwo+PiAtCj4+IC3CoMKgwqAgcmV0ID0gY3JlYXRlX2Rvb3JiZWxsKGNsaWVudCk7 Cj4+IC3CoMKgwqAgaWYgKHJldCkKPj4gLcKgwqDCoMKgwqDCoMKgIGdvdG8gZmFpbDsKPj4gLQo+ PiAtwqDCoMKgIHJldHVybiAwOwo+PiAtCj4+IC1mYWlsOgo+PiAtwqDCoMKgIGd1Y19zdGFnZV9k ZXNjX2ZpbmkoY2xpZW50KTsKPj4gLcKgwqDCoCBndWNfcHJvY19kZXNjX2ZpbmkoY2xpZW50KTsK Pj4gLcKgwqDCoCByZXR1cm4gcmV0Owo+PiDCoCB9Cj4+IMKgIHN0YXRpYyB2b2lkIF9fZ3VjX2Ns aWVudF9kaXNhYmxlKHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQpCj4+IMKgIHsKPj4g LcKgwqDCoCAvKgo+PiAtwqDCoMKgwqAgKiBCeSB0aGUgdGltZSB3ZSdyZSBoZXJlLCBHdUMgbWF5 IGhhdmUgYWxyZWFkeSBiZWVuIHJlc2V0LiBpZiAKPj4gdGhhdCBpcwo+PiAtwqDCoMKgwqAgKiB0 aGUgY2FzZSwgaW5zdGVhZCBvZiB0cnlpbmcgKGluIHZhaW4pIHRvIGNvbW11bmljYXRlIHdpdGgg aXQsIAo+PiBsZXQncwo+PiAtwqDCoMKgwqAgKiBqdXN0IGNsZWFudXAgdGhlIGRvb3JiZWxsIEhX IGFuZCBvdXIgaW50ZXJuYWwgc3RhdGUuCj4+IC3CoMKgwqDCoCAqLwo+IFRoaXMgY29tbWVudCBz aG91bGQgYmUga2VwdCwgb25seSBkcm9wcGluZyB0aGUgJ2Rvb3JlbGwgSFcgYW5kJyBwaHJhc2U/ Cj4gCgpJJ3ZlIHVwZGF0ZWQgdG8gbGVhdmUgYSBub3RlIHRoYXQgR3VDIG1pZ2h0J3ZlIGFscmVh ZHkgYmVlbiByZXNldC4KCj4+IC3CoMKgwqAgaWYgKGludGVsX2d1Y19pc19ydW5uaW5nKGNsaWVu dC0+Z3VjKSkKPj4gLcKgwqDCoMKgwqDCoMKgIGRlc3Ryb3lfZG9vcmJlbGwoY2xpZW50KTsKPj4g LcKgwqDCoCBlbHNlCj4+IC3CoMKgwqDCoMKgwqDCoCBfX2ZpbmlfZG9vcmJlbGwoY2xpZW50KTsK Pj4gLQo+PiDCoMKgwqDCoMKgIGd1Y19zdGFnZV9kZXNjX2ZpbmkoY2xpZW50KTsKPj4gwqDCoMKg wqDCoCBndWNfcHJvY19kZXNjX2ZpbmkoY2xpZW50KTsKPj4gwqAgfQo+PiAtc3RhdGljIGludCBn dWNfY2xpZW50c19lbmFibGUoc3RydWN0IGludGVsX2d1YyAqZ3VjKQo+PiArc3RhdGljIHZvaWQg Z3VjX2NsaWVudHNfZW5hYmxlKHN0cnVjdCBpbnRlbF9ndWMgKmd1YykKPj4gwqAgewo+PiAtwqDC oMKgIHJldHVybiBfX2d1Y19jbGllbnRfZW5hYmxlKGd1Yy0+ZXhlY2J1Zl9jbGllbnQpOwo+PiAr wqDCoMKgIF9fZ3VjX2NsaWVudF9lbmFibGUoZ3VjLT5leGVjYnVmX2NsaWVudCk7Cj4+IMKgIH0K PiBUaGlzIHNlZW1zIGxpa2UgYSBwcmV0dHkgcG9pbnRsZXNzIHdyYXBwZXIuIEknbSBndWVzc2lu ZyB0aGVyZSB3YXMgYSAKPiBtdXRleCBsb2NrIG9yIHNvbWV0aGluZyBpbiBoZXJlIG9yaWdpbmFs bHk/IE1heWJlIHRpbWUgdG8gZHJvcCB0aGUgJ19fJyAKPiB2ZXJzaW9uIGFuZCBqdXN0IG1vdmUg dGhlIGFjdHVhbCB3b3JrIGludG8gdGhpcyBmdW5jdGlvbj8KPiAKClRoaXMgZ29lcyBhd2F5IGlu IHRoZSBuZXh0IHBhdGNoLCB0b2dldGhlciB3aXRoIHRoZSByZXN0IG9mIHRoZSBjbGllbnQgCnN0 dWZmLgoKRGFuaWVsZQoKPiBPdGhlcndpc2UsIGxvb2tzIGdvb2QgdG8gbWUuIFNvIHdpdGggc29t ZSBjb3JyZWN0ZWQgY29tbWVudHM6Cj4gUmV2aWV3ZWQtYnk6IEpvaG4gSGFycmlzb24gPEpvaG4u Qy5IYXJyaXNvbkBJbnRlbC5jb20+Cj4gCj4+IMKgIHN0YXRpYyB2b2lkIGd1Y19jbGllbnRzX2Rp c2FibGUoc3RydWN0IGludGVsX2d1YyAqZ3VjKQo+PiBAQCAtOTU4LDcgKzY2OCw2IEBAIGludCBp bnRlbF9ndWNfc3VibWlzc2lvbl9pbml0KHN0cnVjdCBpbnRlbF9ndWMgKmd1YykKPj4gwqDCoMKg wqDCoMKgICovCj4+IMKgwqDCoMKgwqAgR0VNX0JVR19PTighZ3VjLT5zdGFnZV9kZXNjX3Bvb2wp Owo+PiAtwqDCoMKgIFdBUk5fT04oIWd1Y192ZXJpZnlfZG9vcmJlbGxzKGd1YykpOwo+PiDCoMKg wqDCoMKgIHJldCA9IGd1Y19jbGllbnRzX2NyZWF0ZShndWMpOwo+PiDCoMKgwqDCoMKgIGlmIChy ZXQpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIGVycl9wb29sOwo+PiBAQCAtOTczLDcgKzY4 Miw2IEBAIGludCBpbnRlbF9ndWNfc3VibWlzc2lvbl9pbml0KHN0cnVjdCBpbnRlbF9ndWMgKmd1 YykKPj4gwqAgdm9pZCBpbnRlbF9ndWNfc3VibWlzc2lvbl9maW5pKHN0cnVjdCBpbnRlbF9ndWMg Kmd1YykKPj4gwqAgewo+PiDCoMKgwqDCoMKgIGd1Y19jbGllbnRzX2Rlc3Ryb3koZ3VjKTsKPj4g LcKgwqDCoCBXQVJOX09OKCFndWNfdmVyaWZ5X2Rvb3JiZWxscyhndWMpKTsKPj4gwqDCoMKgwqDC oCBpZiAoZ3VjLT5zdGFnZV9kZXNjX3Bvb2wpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBndWNfc3Rh Z2VfZGVzY19wb29sX2Rlc3Ryb3koZ3VjKTsKPj4gQEAgLTEwODksMTYgKzc5NywxMSBAQCBzdGF0 aWMgdm9pZCBndWNfc2V0X2RlZmF1bHRfc3VibWlzc2lvbihzdHJ1Y3QgCj4+IGludGVsX2VuZ2lu ZV9jcyAqZW5naW5lKQo+PiDCoMKgwqDCoMKgIEdFTV9CVUdfT04oZW5naW5lLT5pcnFfZW5hYmxl IHx8IGVuZ2luZS0+aXJxX2Rpc2FibGUpOwo+PiDCoCB9Cj4+IC1pbnQgaW50ZWxfZ3VjX3N1Ym1p c3Npb25fZW5hYmxlKHN0cnVjdCBpbnRlbF9ndWMgKmd1YykKPj4gK3ZvaWQgaW50ZWxfZ3VjX3N1 Ym1pc3Npb25fZW5hYmxlKHN0cnVjdCBpbnRlbF9ndWMgKmd1YykKPj4gwqAgewo+PiDCoMKgwqDC oMKgIHN0cnVjdCBpbnRlbF9ndCAqZ3QgPSBndWNfdG9fZ3QoZ3VjKTsKPj4gwqDCoMKgwqDCoCBz dHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmU7Cj4+IMKgwqDCoMKgwqAgZW51bSBpbnRlbF9l bmdpbmVfaWQgaWQ7Cj4+IC3CoMKgwqAgaW50IGVycjsKPj4gLQo+PiAtwqDCoMKgIGVyciA9IGk5 MTVfaW5qZWN0X3Byb2JlX2Vycm9yKGd0LT5pOTE1LCAtRU5YSU8pOwo+PiAtwqDCoMKgIGlmIChl cnIpCj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gZXJyOwo+PiDCoMKgwqDCoMKgIC8qCj4+IMKg wqDCoMKgwqDCoCAqIFdlJ3JlIHVzaW5nIEd1QyB3b3JrIGl0ZW1zIGZvciBzdWJtaXR0aW5nIHdv cmsgdGhyb3VnaCBHdUMuIAo+PiBTaW5jZQo+PiBAQCAtMTExNSw5ICs4MTgsNyBAQCBpbnQgaW50 ZWxfZ3VjX3N1Ym1pc3Npb25fZW5hYmxlKHN0cnVjdCBpbnRlbF9ndWMgCj4+ICpndWMpCj4+IMKg wqDCoMKgwqAgR0VNX0JVR19PTighZ3VjLT5leGVjYnVmX2NsaWVudCk7Cj4+IC3CoMKgwqAgZXJy ID0gZ3VjX2NsaWVudHNfZW5hYmxlKGd1Yyk7Cj4+IC3CoMKgwqAgaWYgKGVycikKPj4gLcKgwqDC oMKgwqDCoMKgIHJldHVybiBlcnI7Cj4+ICvCoMKgwqAgZ3VjX2NsaWVudHNfZW5hYmxlKGd1Yyk7 Cj4+IMKgwqDCoMKgwqAgLyogVGFrZSBvdmVyIGZyb20gbWFudWFsIGNvbnRyb2wgb2YgRUxTUCAo ZXhlY2xpc3RzKSAqLwo+PiDCoMKgwqDCoMKgIGd1Y19pbnRlcnJ1cHRzX2NhcHR1cmUoZ3QpOwo+ PiBAQCAtMTEyNiw4ICs4MjcsNiBAQCBpbnQgaW50ZWxfZ3VjX3N1Ym1pc3Npb25fZW5hYmxlKHN0 cnVjdCBpbnRlbF9ndWMgCj4+ICpndWMpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBlbmdpbmUtPnNl dF9kZWZhdWx0X3N1Ym1pc3Npb24gPSBndWNfc2V0X2RlZmF1bHRfc3VibWlzc2lvbjsKPj4gwqDC oMKgwqDCoMKgwqDCoMKgIGVuZ2luZS0+c2V0X2RlZmF1bHRfc3VibWlzc2lvbihlbmdpbmUpOwo+ PiDCoMKgwqDCoMKgIH0KPj4gLQo+PiAtwqDCoMKgIHJldHVybiAwOwo+PiDCoCB9Cj4+IMKgIHZv aWQgaW50ZWxfZ3VjX3N1Ym1pc3Npb25fZGlzYWJsZShzdHJ1Y3QgaW50ZWxfZ3VjICpndWMpCj4+ IEBAIC0xMTU1LDcgKzg1NCwzIEBAIHZvaWQgaW50ZWxfZ3VjX3N1Ym1pc3Npb25faW5pdF9lYXJs eShzdHJ1Y3QgCj4+IGludGVsX2d1YyAqZ3VjKQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAgZ3VjLT5z dWJtaXNzaW9uX3N1cHBvcnRlZCA9IF9fZ3VjX3N1Ym1pc3Npb25fc3VwcG9ydChndWMpOwo+PiDC oCB9Cj4+IC0KPj4gLSNpZiBJU19FTkFCTEVEKENPTkZJR19EUk1fSTkxNV9TRUxGVEVTVCkKPj4g LSNpbmNsdWRlICJzZWxmdGVzdF9ndWMuYyIKPj4gLSNlbmRpZgo+PiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX3N1Ym1pc3Npb24uaCAKPj4gYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9ndWNfc3VibWlzc2lvbi5oCj4+IGluZGV4IDU0 ZDcxNjgyODM1Mi4uZTJkZWI0ZTZmNDJhIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0v aTkxNS9ndC91Yy9pbnRlbF9ndWNfc3VibWlzc2lvbi5oCj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2d0L3VjL2ludGVsX2d1Y19zdWJtaXNzaW9uLmgKPj4gQEAgLTQ0LDIxICs0NCwxNCBA QCBzdHJ1Y3QgaW50ZWxfZ3VjX2NsaWVudCB7Cj4+IMKgwqDCoMKgwqAgLyogYml0bWFwIG9mICho b3N0KSBlbmdpbmUgaWRzICovCj4+IMKgwqDCoMKgwqAgdTMyIHByaW9yaXR5Owo+PiDCoMKgwqDC oMKgIHUzMiBzdGFnZV9pZDsKPj4gLcKgwqDCoCB1MzIgcHJvY19kZXNjX29mZnNldDsKPj4gLQo+ PiAtwqDCoMKgIHUxNiBkb29yYmVsbF9pZDsKPj4gLcKgwqDCoCB1bnNpZ25lZCBsb25nIGRvb3Ji ZWxsX29mZnNldDsKPj4gwqDCoMKgwqDCoCAvKiBQcm90ZWN0cyBHdUMgY2xpZW50J3MgV1EgYWNj ZXNzICovCj4+IMKgwqDCoMKgwqAgc3BpbmxvY2tfdCB3cV9sb2NrOwo+PiAtCj4+IC3CoMKgwqAg LyogRm9yIHRlc3RpbmcgcHVycG9zZXMsIHVzZSBub3AgV1EgaXRlbXMgaW5zdGVhZCBvZiByZWFs IG9uZXMgKi8KPj4gLcKgwqDCoCBJOTE1X1NFTEZURVNUX0RFQ0xBUkUoYm9vbCB1c2Vfbm9wX3dx aSk7Cj4+IMKgIH07Cj4+IMKgIHZvaWQgaW50ZWxfZ3VjX3N1Ym1pc3Npb25faW5pdF9lYXJseShz dHJ1Y3QgaW50ZWxfZ3VjICpndWMpOwo+PiDCoCBpbnQgaW50ZWxfZ3VjX3N1Ym1pc3Npb25faW5p dChzdHJ1Y3QgaW50ZWxfZ3VjICpndWMpOwo+PiAtaW50IGludGVsX2d1Y19zdWJtaXNzaW9uX2Vu YWJsZShzdHJ1Y3QgaW50ZWxfZ3VjICpndWMpOwo+PiArdm9pZCBpbnRlbF9ndWNfc3VibWlzc2lv bl9lbmFibGUoc3RydWN0IGludGVsX2d1YyAqZ3VjKTsKPj4gwqAgdm9pZCBpbnRlbF9ndWNfc3Vi bWlzc2lvbl9kaXNhYmxlKHN0cnVjdCBpbnRlbF9ndWMgKmd1Yyk7Cj4+IMKgIHZvaWQgaW50ZWxf Z3VjX3N1Ym1pc3Npb25fZmluaShzdHJ1Y3QgaW50ZWxfZ3VjICpndWMpOwo+PiDCoCBpbnQgaW50 ZWxfZ3VjX3ByZWVtcHRfd29ya19jcmVhdGUoc3RydWN0IGludGVsX2d1YyAqZ3VjKTsKPj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL2ludGVsX3VjLmMgCj4+IGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfdWMuYwo+PiBpbmRleCA2MjliMTkzNzdhMjku LmM2NTE5MDY2YTBmNiAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMv aW50ZWxfdWMuYwo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF91Yy5j Cj4+IEBAIC00ODYsMTEgKzQ4Niw4IEBAIGludCBpbnRlbF91Y19pbml0X2h3KHN0cnVjdCBpbnRl bF91YyAqdWMpCj4+IMKgwqDCoMKgwqAgaWYgKHJldCkKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGdv dG8gZXJyX2NvbW11bmljYXRpb247Cj4+IC3CoMKgwqAgaWYgKGludGVsX3VjX3N1cHBvcnRzX2d1 Y19zdWJtaXNzaW9uKHVjKSkgewo+PiAtwqDCoMKgwqDCoMKgwqAgcmV0ID0gaW50ZWxfZ3VjX3N1 Ym1pc3Npb25fZW5hYmxlKGd1Yyk7Cj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAocmV0KQo+PiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIGVycl9jb21tdW5pY2F0aW9uOwo+PiAtwqDCoMKgIH0K Pj4gK8KgwqDCoCBpZiAoaW50ZWxfdWNfc3VwcG9ydHNfZ3VjX3N1Ym1pc3Npb24odWMpKQo+PiAr wqDCoMKgwqDCoMKgwqAgaW50ZWxfZ3VjX3N1Ym1pc3Npb25fZW5hYmxlKGd1Yyk7Cj4+IMKgwqDC oMKgwqAgZGV2X2luZm8oaTkxNS0+ZHJtLmRldiwgIiVzIGZpcm13YXJlICVzIHZlcnNpb24gJXUu JXUgJXM6JXNcbiIsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludGVsX3VjX2Z3X3R5cGVfcmVw cihJTlRFTF9VQ19GV19UWVBFX0dVQyksIGd1Yy0+ZncucGF0aCwKPj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL3NlbGZ0ZXN0X2d1Yy5jIAo+PiBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2d0L3VjL3NlbGZ0ZXN0X2d1Yy5jCj4+IGRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0 NAo+PiBpbmRleCBkOGE4MDM4OGJkMzEuLjAwMDAwMDAwMDAwMAo+PiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9ndC91Yy9zZWxmdGVzdF9ndWMuYwo+PiArKysgL2Rldi9udWxsCj4+IEBAIC0x LDI5OSArMCwwIEBACj4+IC0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCj4+IC0vKgo+ PiAtICogQ29weXJpZ2h0IMKpIDIwMTcgSW50ZWwgQ29ycG9yYXRpb24KPj4gLSAqLwo+PiAtCj4+ IC0jaW5jbHVkZSAiaTkxNV9zZWxmdGVzdC5oIgo+PiAtI2luY2x1ZGUgImdlbS9pOTE1X2dlbV9w bS5oIgo+PiAtCj4+IC0vKiBtYXggZG9vcmJlbGwgbnVtYmVyICsgbmVnYXRpdmUgdGVzdCBmb3Ig ZWFjaCBjbGllbnQgdHlwZSAqLwo+PiAtI2RlZmluZSBBVFRFTVBUUyAoR1VDX05VTV9ET09SQkVM TFMgKyBHVUNfQ0xJRU5UX1BSSU9SSVRZX05VTSkKPj4gLQo+PiAtc3RhdGljIHN0cnVjdCBpbnRl bF9ndWNfY2xpZW50ICpjbGllbnRzW0FUVEVNUFRTXTsKPj4gLQo+PiAtc3RhdGljIGJvb2wgYXZh aWxhYmxlX2RicyhzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsIHUzMiBwcmlvcml0eSkKPj4gLXsKPj4g LcKgwqDCoCB1bnNpZ25lZCBsb25nIG9mZnNldDsKPj4gLcKgwqDCoCB1bnNpZ25lZCBsb25nIGVu ZDsKPj4gLcKgwqDCoCB1MTYgaWQ7Cj4+IC0KPj4gLcKgwqDCoCAvKiBmaXJzdCBoYWxmIGlzIHVz ZWQgZm9yIG5vcm1hbCBwcmlvcml0eSwgc2Vjb25kIGhhbGYgZm9yIGhpZ2ggKi8KPj4gLcKgwqDC oCBvZmZzZXQgPSAwOwo+PiAtwqDCoMKgIGVuZCA9IEdVQ19OVU1fRE9PUkJFTExTIC8gMjsKPj4g LcKgwqDCoCBpZiAocHJpb3JpdHkgPD0gR1VDX0NMSUVOVF9QUklPUklUWV9ISUdIKSB7Cj4+IC3C oMKgwqDCoMKgwqDCoCBvZmZzZXQgPSBlbmQ7Cj4+IC3CoMKgwqDCoMKgwqDCoCBlbmQgKz0gb2Zm c2V0Owo+PiAtwqDCoMKgIH0KPj4gLQo+PiAtwqDCoMKgIGlkID0gZmluZF9uZXh0X3plcm9fYml0 KGd1Yy0+ZG9vcmJlbGxfYml0bWFwLCBlbmQsIG9mZnNldCk7Cj4+IC3CoMKgwqAgaWYgKGlkIDwg ZW5kKQo+PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHRydWU7Cj4+IC0KPj4gLcKgwqDCoCByZXR1 cm4gZmFsc2U7Cj4+IC19Cj4+IC0KPj4gLXN0YXRpYyBpbnQgY2hlY2tfYWxsX2Rvb3JiZWxscyhz dHJ1Y3QgaW50ZWxfZ3VjICpndWMpCj4+IC17Cj4+IC3CoMKgwqAgdTE2IGRiX2lkOwo+PiAtCj4+ IC3CoMKgwqAgcHJfaW5mb19vbmNlKCJNYXggbnVtYmVyIG9mIGRvb3JiZWxsczogJWQiLCBHVUNf TlVNX0RPT1JCRUxMUyk7Cj4+IC3CoMKgwqAgZm9yIChkYl9pZCA9IDA7IGRiX2lkIDwgR1VDX05V TV9ET09SQkVMTFM7ICsrZGJfaWQpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIGlmICghZG9vcmJlbGxf b2soZ3VjLCBkYl9pZCkpIHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJkb29y YmVsbCAlZCwgbm90IG9rXG4iLCBkYl9pZCk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJl dHVybiAtRUlPOwo+PiAtwqDCoMKgwqDCoMKgwqAgfQo+PiAtwqDCoMKgIH0KPj4gLQo+PiAtwqDC oMKgIHJldHVybiAwOwo+PiAtfQo+PiAtCj4+IC1zdGF0aWMgaW50IHJpbmdfZG9vcmJlbGxfbm9w KHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQpCj4+IC17Cj4+IC3CoMKgwqAgc3RydWN0 IGd1Y19wcm9jZXNzX2Rlc2MgKmRlc2MgPSBfX2dldF9wcm9jZXNzX2Rlc2MoY2xpZW50KTsKPj4g LcKgwqDCoCBpbnQgZXJyOwo+PiAtCj4+IC3CoMKgwqAgY2xpZW50LT51c2Vfbm9wX3dxaSA9IHRy dWU7Cj4+IC0KPj4gLcKgwqDCoCBzcGluX2xvY2tfaXJxKCZjbGllbnQtPndxX2xvY2spOwo+PiAt Cj4+IC3CoMKgwqAgZ3VjX3dxX2l0ZW1fYXBwZW5kKGNsaWVudCwgMCwgMCwgMCwgMCk7Cj4+IC3C oMKgwqAgZ3VjX3JpbmdfZG9vcmJlbGwoY2xpZW50KTsKPj4gLQo+PiAtwqDCoMKgIHNwaW5fdW5s b2NrX2lycSgmY2xpZW50LT53cV9sb2NrKTsKPj4gLQo+PiAtwqDCoMKgIGNsaWVudC0+dXNlX25v cF93cWkgPSBmYWxzZTsKPj4gLQo+PiAtwqDCoMKgIC8qIGlmIHRoZXJlIGFyZSBubyBpc3N1ZXMg R3VDIHdpbGwgdXBkYXRlIHRoZSBXUSBoZWFkIGFuZCBrZWVwIHRoZQo+PiAtwqDCoMKgwqAgKiBX USBpbiBhY3RpdmUgc3RhdHVzCj4+IC3CoMKgwqDCoCAqLwo+PiAtwqDCoMKgIGVyciA9IHdhaXRf Zm9yKFJFQURfT05DRShkZXNjLT5oZWFkKSA9PSBSRUFEX09OQ0UoZGVzYy0+dGFpbCksIDEwKTsK Pj4gLcKgwqDCoCBpZiAoZXJyKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCBwcl9lcnIoImRvb3JiZWxs ICV1IHJpbmcgZmFpbGVkIVxuIiwgY2xpZW50LT5kb29yYmVsbF9pZCk7Cj4+IC3CoMKgwqDCoMKg wqDCoCByZXR1cm4gLUVJTzsKPj4gLcKgwqDCoCB9Cj4+IC0KPj4gLcKgwqDCoCBpZiAoZGVzYy0+ d3Ffc3RhdHVzICE9IFdRX1NUQVRVU19BQ1RJVkUpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIHByX2Vy cigiZG9vcmJlbGwgJXUgcmluZyBwdXQgV1EgaW4gYmFkIHN0YXRlICgldSkhXG4iLAo+PiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjbGllbnQtPmRvb3JiZWxsX2lkLCBkZXNjLT53cV9z dGF0dXMpOwo+PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU87Cj4+IC3CoMKgwqAgfQo+PiAt Cj4+IC3CoMKgwqAgcmV0dXJuIDA7Cj4+IC19Cj4+IC0KPj4gLS8qCj4+IC0gKiBCYXNpYyBjbGll bnQgc2FuaXR5IGNoZWNrLCBoYW5keSB0byB2YWxpZGF0ZSBjcmVhdGVfY2xpZW50cy4KPj4gLSAq Lwo+PiAtc3RhdGljIGludCB2YWxpZGF0ZV9jbGllbnQoc3RydWN0IGludGVsX2d1Y19jbGllbnQg KmNsaWVudCwgaW50IAo+PiBjbGllbnRfcHJpb3JpdHkpCj4+IC17Cj4+IC3CoMKgwqAgaWYgKGNs aWVudC0+cHJpb3JpdHkgIT0gY2xpZW50X3ByaW9yaXR5IHx8Cj4+IC3CoMKgwqDCoMKgwqDCoCBj bGllbnQtPmRvb3JiZWxsX2lkID09IEdVQ19ET09SQkVMTF9JTlZBTElEKQo+PiAtwqDCoMKgwqDC oMKgwqAgcmV0dXJuIC1FSU5WQUw7Cj4+IC3CoMKgwqAgZWxzZQo+PiAtwqDCoMKgwqDCoMKgwqAg cmV0dXJuIDA7Cj4+IC19Cj4+IC0KPj4gLXN0YXRpYyBib29sIGNsaWVudF9kb29yYmVsbF9pbl9z eW5jKHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQpCj4+IC17Cj4+IC3CoMKgwqAgcmV0 dXJuICFjbGllbnQgfHwgZG9vcmJlbGxfb2soY2xpZW50LT5ndWMsIGNsaWVudC0+ZG9vcmJlbGxf aWQpOwo+PiAtfQo+PiAtCj4+IC0vKgo+PiAtICogQ2hlY2sgdGhhdCB3ZSdyZSBhYmxlIHRvIHN5 bmNocm9uaXplIGd1Y19jbGllbnRzIHdpdGggdGhlaXIgZG9vcmJlbGxzCj4+IC0gKgo+PiAtICog V2UncmUgY3JlYXRpbmcgY2xpZW50cyBhbmQgcmVzZXJ2aW5nIGRvb3JiZWxscyBvbmNlLCBhdCBt b2R1bGUgCj4+IGxvYWQuIER1cmluZwo+PiAtICogbW9kdWxlIGxpZmV0aW1lLCBHdUMsIGRvb3Ji ZWxsIEhXLCBhbmQgaTkxNSBzdGF0ZSBtYXkgZ28gb3V0IG9mIAo+PiBzeW5jIGR1ZSB0bwo+PiAt ICogR3VDIGJlaW5nIHJlc2V0LiBJbiBvdGhlciB3b3JkcyAtIEd1QyBjbGllbnRzIGFyZSBzdGls bCBhcm91bmQsIAo+PiBidXQgdGhlCj4+IC0gKiBzdGF0dXMgb2YgdGhlaXIgZG9vcmJlbGxzIG1h eSBiZSBpbmNvcnJlY3QuIFRoaXMgaXMgdGhlIHJlYXNvbiBiZWhpbmQKPj4gLSAqIHZhbGlkYXRp bmcgdGhhdCB0aGUgZG9vcmJlbGxzIHN0YXR1cyBleHBlY3RlZCBieSB0aGUgZHJpdmVyIAo+PiBt YXRjaGVzIHdoYXQgdGhlCj4+IC0gKiBHdUMvSFcgaGF2ZS4KPj4gLSAqLwo+PiAtc3RhdGljIGlu dCBpZ3RfZ3VjX2NsaWVudHModm9pZCAqYXJnKQo+PiAtewo+PiAtwqDCoMKgIHN0cnVjdCBpbnRl bF9ndCAqZ3QgPSBhcmc7Cj4+IC3CoMKgwqAgc3RydWN0IGludGVsX2d1YyAqZ3VjID0gJmd0LT51 Yy5ndWM7Cj4+IC3CoMKgwqAgaW50ZWxfd2FrZXJlZl90IHdha2VyZWY7Cj4+IC3CoMKgwqAgaW50 IGVyciA9IDA7Cj4+IC0KPj4gLcKgwqDCoCBHRU1fQlVHX09OKCFIQVNfR1RfVUMoZ3QtPmk5MTUp KTsKPj4gLcKgwqDCoCB3YWtlcmVmID0gaW50ZWxfcnVudGltZV9wbV9nZXQoZ3QtPnVuY29yZS0+ cnBtKTsKPj4gLQo+PiAtwqDCoMKgIGVyciA9IGNoZWNrX2FsbF9kb29yYmVsbHMoZ3VjKTsKPj4g LcKgwqDCoCBpZiAoZXJyKQo+PiAtwqDCoMKgwqDCoMKgwqAgZ290byB1bmxvY2s7Cj4+IC0KPj4g LcKgwqDCoCAvKgo+PiAtwqDCoMKgwqAgKiBHZXQgcmlkIG9mIGNsaWVudHMgY3JlYXRlZCBkdXJp bmcgZHJpdmVyIGxvYWQgYmVjYXVzZSB0aGUgdGVzdCAKPj4gd2lsbAo+PiAtwqDCoMKgwqAgKiBy ZWNyZWF0ZSB0aGVtLgo+PiAtwqDCoMKgwqAgKi8KPj4gLcKgwqDCoCBndWNfY2xpZW50c19kaXNh YmxlKGd1Yyk7Cj4+IC3CoMKgwqAgZ3VjX2NsaWVudHNfZGVzdHJveShndWMpOwo+PiAtwqDCoMKg IGlmIChndWMtPmV4ZWNidWZfY2xpZW50KSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCBwcl9lcnIoImd1 Y19jbGllbnRzX2Rlc3Ryb3kgbGllZCFcbiIpOwo+PiAtwqDCoMKgwqDCoMKgwqAgZXJyID0gLUVJ TlZBTDsKPj4gLcKgwqDCoMKgwqDCoMKgIGdvdG8gdW5sb2NrOwo+PiAtwqDCoMKgIH0KPj4gLQo+ PiAtwqDCoMKgIGVyciA9IGd1Y19jbGllbnRzX2NyZWF0ZShndWMpOwo+PiAtwqDCoMKgIGlmIChl cnIpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIHByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnRz XG4iKTsKPj4gLcKgwqDCoMKgwqDCoMKgIGdvdG8gdW5sb2NrOwo+PiAtwqDCoMKgIH0KPj4gLcKg wqDCoCBHRU1fQlVHX09OKCFndWMtPmV4ZWNidWZfY2xpZW50KTsKPj4gLQo+PiAtwqDCoMKgIGVy ciA9IHZhbGlkYXRlX2NsaWVudChndWMtPmV4ZWNidWZfY2xpZW50LAo+PiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBHVUNfQ0xJRU5UX1BSSU9SSVRZX0tNRF9OT1JNQUwpOwo+ PiAtwqDCoMKgIGlmIChlcnIpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIHByX2VycigiZXhlY2J1ZyBj bGllbnQgdmFsaWRhdGlvbiBmYWlsZWRcbiIpOwo+PiAtwqDCoMKgwqDCoMKgwqAgZ290byBvdXQ7 Cj4+IC3CoMKgwqAgfQo+PiAtCj4+IC3CoMKgwqAgLyogdGhlIGNsaWVudCBzaG91bGQgbm93IGhh dmUgcmVzZXJ2ZWQgYSBkb29yYmVsbCAqLwo+PiAtwqDCoMKgIGlmICghaGFzX2Rvb3JiZWxsKGd1 Yy0+ZXhlY2J1Zl9jbGllbnQpKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCBwcl9lcnIoImd1Y19jbGll bnRzX2NyZWF0ZSBkaWRuJ3QgcmVzZXJ2ZSBkb29yYmVsbHNcbiIpOwo+PiAtwqDCoMKgwqDCoMKg wqAgZXJyID0gLUVJTlZBTDsKPj4gLcKgwqDCoMKgwqDCoMKgIGdvdG8gb3V0Owo+PiAtwqDCoMKg IH0KPj4gLQo+PiAtwqDCoMKgIC8qIE5vdyBlbmFibGUgdGhlIGNsaWVudHMgKi8KPj4gLcKgwqDC oCBndWNfY2xpZW50c19lbmFibGUoZ3VjKTsKPj4gLQo+PiAtwqDCoMKgIC8qIGVhY2ggY2xpZW50 IHNob3VsZCBub3cgaGF2ZSByZWNlaXZlZCBhIGRvb3JiZWxsICovCj4+IC3CoMKgwqAgaWYgKCFj bGllbnRfZG9vcmJlbGxfaW5fc3luYyhndWMtPmV4ZWNidWZfY2xpZW50KSkgewo+PiAtwqDCoMKg wqDCoMKgwqAgcHJfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZG9vcmJlbGxzXG4iKTsK Pj4gLcKgwqDCoMKgwqDCoMKgIGVyciA9IC1FSU5WQUw7Cj4+IC3CoMKgwqDCoMKgwqDCoCBnb3Rv IG91dDsKPj4gLcKgwqDCoCB9Cj4+IC0KPj4gLcKgwqDCoCAvKgo+PiAtwqDCoMKgwqAgKiBCYXNp YyB0ZXN0IC0gYW4gYXR0ZW1wdCB0byByZWFsbG9jYXRlIGEgdmFsaWQgZG9vcmJlbGwgdG8gdGhl Cj4+IC3CoMKgwqDCoCAqIGNsaWVudCBpdCBpcyBjdXJyZW50bHkgYXNzaWduZWQgc2hvdWxkIG5v dCBjYXVzZSBhIGZhaWx1cmUuCj4+IC3CoMKgwqDCoCAqLwo+PiAtwqDCoMKgIGVyciA9IGNyZWF0 ZV9kb29yYmVsbChndWMtPmV4ZWNidWZfY2xpZW50KTsKPj4gLQo+PiAtb3V0Ogo+PiAtwqDCoMKg IC8qCj4+IC3CoMKgwqDCoCAqIExlYXZlIGNsZWFuIHN0YXRlIGZvciBvdGhlciB0ZXN0LCBwbHVz IHRoZSBkcml2ZXIgYWx3YXlzIAo+PiBkZXN0cm95IHRoZQo+PiAtwqDCoMKgwqAgKiBjbGllbnRz IGR1cmluZyB1bmxvYWQuCj4+IC3CoMKgwqDCoCAqLwo+PiAtwqDCoMKgIGd1Y19jbGllbnRzX2Rp c2FibGUoZ3VjKTsKPj4gLcKgwqDCoCBndWNfY2xpZW50c19kZXN0cm95KGd1Yyk7Cj4+IC3CoMKg wqAgZ3VjX2NsaWVudHNfY3JlYXRlKGd1Yyk7Cj4+IC3CoMKgwqAgZ3VjX2NsaWVudHNfZW5hYmxl KGd1Yyk7Cj4+IC11bmxvY2s6Cj4+IC3CoMKgwqAgaW50ZWxfcnVudGltZV9wbV9wdXQoZ3QtPnVu Y29yZS0+cnBtLCB3YWtlcmVmKTsKPj4gLcKgwqDCoCByZXR1cm4gZXJyOwo+PiAtfQo+PiAtCj4+ IC0vKgo+PiAtICogQ3JlYXRlIGFzIG1hbnkgY2xpZW50cyBhcyBudW1iZXIgb2YgZG9vcmJlbGxz LiBOb3RlIHRoYXQgdGhlcmUncyAKPj4gYWxyZWFkeQo+PiAtICogY2xpZW50KHMpL2Rvb3JiZWxs KHMpIGNyZWF0ZWQgZHVyaW5nIGRyaXZlciBsb2FkLCBidXQgdGhpcyB0ZXN0IAo+PiBjcmVhdGVz Cj4+IC0gKiBpdHMgb3duIGFuZCBkbyBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgZXhpc3Rpbmcgb25l cy4KPj4gLSAqLwo+PiAtc3RhdGljIGludCBpZ3RfZ3VjX2Rvb3JiZWxscyh2b2lkICphcmcpCj4+ IC17Cj4+IC3CoMKgwqAgc3RydWN0IGludGVsX2d0ICpndCA9IGFyZzsKPj4gLcKgwqDCoCBzdHJ1 Y3QgaW50ZWxfZ3VjICpndWMgPSAmZ3QtPnVjLmd1YzsKPj4gLcKgwqDCoCBpbnRlbF93YWtlcmVm X3Qgd2FrZXJlZjsKPj4gLcKgwqDCoCBpbnQgaSwgZXJyID0gMDsKPj4gLcKgwqDCoCB1MTYgZGJf aWQ7Cj4+IC0KPj4gLcKgwqDCoCBHRU1fQlVHX09OKCFIQVNfR1RfVUMoZ3QtPmk5MTUpKTsKPj4g LcKgwqDCoCB3YWtlcmVmID0gaW50ZWxfcnVudGltZV9wbV9nZXQoZ3QtPnVuY29yZS0+cnBtKTsK Pj4gLQo+PiAtwqDCoMKgIGVyciA9IGNoZWNrX2FsbF9kb29yYmVsbHMoZ3VjKTsKPj4gLcKgwqDC oCBpZiAoZXJyKQo+PiAtwqDCoMKgwqDCoMKgwqAgZ290byB1bmxvY2s7Cj4+IC0KPj4gLcKgwqDC oCBmb3IgKGkgPSAwOyBpIDwgQVRURU1QVFM7IGkrKykgewo+PiAtwqDCoMKgwqDCoMKgwqAgY2xp ZW50c1tpXSA9IGd1Y19jbGllbnRfYWxsb2MoZ3VjLCBpICUgR1VDX0NMSUVOVF9QUklPUklUWV9O VU0pOwo+PiAtCj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAoIWNsaWVudHNbaV0pIHsKPj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJbJWRdIE5vIGd1YyBjbGllbnRcbiIsIGkpOwo+PiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlcnIgPSAtRUlOVkFMOwo+PiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBnb3RvIG91dDsKPj4gLcKgwqDCoMKgwqDCoMKgIH0KPj4gLQo+PiAtwqDCoMKgwqDC oMKgwqAgaWYgKElTX0VSUihjbGllbnRzW2ldKSkgewo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBpZiAoUFRSX0VSUihjbGllbnRzW2ldKSAhPSAtRU5PU1BDKSB7Cj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJbJWRdIHVuZXhwZWN0ZWQgZXJyb3JcbiIsIGkpOwo+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVyciA9IFBUUl9FUlIoY2xpZW50c1tp XSk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBvdXQ7Cj4+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gLQo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAo YXZhaWxhYmxlX2RicyhndWMsIGkgJSBHVUNfQ0xJRU5UX1BSSU9SSVRZX05VTSkpIHsKPj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcl9lcnIoIlslZF0gbm9uLWRiIHJlbGF0ZWQg YWxsb2MgZmFpbFxuIiwgaSk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXJy ID0gLUVJTlZBTDsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG91dDsK Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+PiAtCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIC8qIGV4cGVjdGVkLCByYW4gb3V0IG9mIGRicyBmb3IgdGhpcyBjbGllbnQgdHlwZSAqLwo+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPj4gLcKgwqDCoMKgwqDCoMKgIH0K Pj4gLQo+PiAtwqDCoMKgwqDCoMKgwqAgLyoKPj4gLcKgwqDCoMKgwqDCoMKgwqAgKiBUaGUgY2hl Y2sgYmVsb3cgaXMgb25seSB2YWxpZCBiZWNhdXNlIHdlIGtlZXAgYSBkb29yYmVsbAo+PiAtwqDC oMKgwqDCoMKgwqDCoCAqIGFzc2lnbmVkIGR1cmluZyB0aGUgd2hvbGUgbGlmZSBvZiB0aGUgY2xp ZW50Lgo+PiAtwqDCoMKgwqDCoMKgwqDCoCAqLwo+PiAtwqDCoMKgwqDCoMKgwqAgaWYgKGNsaWVu dHNbaV0tPnN0YWdlX2lkID49IEdVQ19OVU1fRE9PUkJFTExTKSB7Cj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHByX2VycigiWyVkXSBtb3JlIGNsaWVudHMgdGhhbiBkb29yYmVsbHMgKCVkID49 ICVkKVxuIiwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpLCBjbGll bnRzW2ldLT5zdGFnZV9pZCwgR1VDX05VTV9ET09SQkVMTFMpOwo+PiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBlcnIgPSAtRUlOVkFMOwo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG91 dDsKPj4gLcKgwqDCoMKgwqDCoMKgIH0KPj4gLQo+PiAtwqDCoMKgwqDCoMKgwqAgZXJyID0gdmFs aWRhdGVfY2xpZW50KGNsaWVudHNbaV0sIGkgJSBHVUNfQ0xJRU5UX1BSSU9SSVRZX05VTSk7Cj4+ IC3CoMKgwqDCoMKgwqDCoCBpZiAoZXJyKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBy X2VycigiWyVkXSBjbGllbnRfYWxsb2Mgc2FuaXR5IGNoZWNrIGZhaWxlZCFcbiIsIGkpOwo+PiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlcnIgPSAtRUlOVkFMOwo+PiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBnb3RvIG91dDsKPj4gLcKgwqDCoMKgwqDCoMKgIH0KPj4gLQo+PiAtwqDCoMKgwqDC oMKgwqAgZGJfaWQgPSBjbGllbnRzW2ldLT5kb29yYmVsbF9pZDsKPj4gLQo+PiAtwqDCoMKgwqDC oMKgwqAgZXJyID0gX19ndWNfY2xpZW50X2VuYWJsZShjbGllbnRzW2ldKTsKPj4gLcKgwqDCoMKg wqDCoMKgIGlmIChlcnIpIHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJbJWRd IEZhaWxlZCB0byBjcmVhdGUgYSBkb29yYmVsbFxuIiwgaSk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGdvdG8gb3V0Owo+PiAtwqDCoMKgwqDCoMKgwqAgfQo+PiAtCj4+IC3CoMKgwqDCoMKg wqDCoCAvKiBkb29yYmVsbCBpZCBzaG91bGRuJ3QgY2hhbmdlLCB3ZSBhcmUgaG9sZGluZyB0aGUg bXV0ZXggKi8KPj4gLcKgwqDCoMKgwqDCoMKgIGlmIChkYl9pZCAhPSBjbGllbnRzW2ldLT5kb29y YmVsbF9pZCkgewo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcl9lcnIoIlslZF0gZG9vcmJl bGwgaWQgY2hhbmdlZCAoJWQgIT0gJWQpXG4iLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGksIGRiX2lkLCBjbGllbnRzW2ldLT5kb29yYmVsbF9pZCk7Cj4+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGVyciA9IC1FSU5WQUw7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGdvdG8gb3V0Owo+PiAtwqDCoMKgwqDCoMKgwqAgfQo+PiAtCj4+IC3CoMKgwqDCoMKgwqDC oCBlcnIgPSBjaGVja19hbGxfZG9vcmJlbGxzKGd1Yyk7Cj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAo ZXJyKQo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG91dDsKPj4gLQo+PiAtwqDCoMKg wqDCoMKgwqAgZXJyID0gcmluZ19kb29yYmVsbF9ub3AoY2xpZW50c1tpXSk7Cj4+IC3CoMKgwqDC oMKgwqDCoCBpZiAoZXJyKQo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG91dDsKPj4g LcKgwqDCoCB9Cj4+IC0KPj4gLW91dDoKPj4gLcKgwqDCoCBmb3IgKGkgPSAwOyBpIDwgQVRURU1Q VFM7IGkrKykKPj4gLcKgwqDCoMKgwqDCoMKgIGlmICghSVNfRVJSX09SX05VTEwoY2xpZW50c1tp XSkpIHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgX19ndWNfY2xpZW50X2Rpc2FibGUoY2xp ZW50c1tpXSk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGd1Y19jbGllbnRfZnJlZShjbGll bnRzW2ldKTsKPj4gLcKgwqDCoMKgwqDCoMKgIH0KPj4gLXVubG9jazoKPj4gLcKgwqDCoCBpbnRl bF9ydW50aW1lX3BtX3B1dChndC0+dW5jb3JlLT5ycG0sIHdha2VyZWYpOwo+PiAtwqDCoMKgIHJl dHVybiBlcnI7Cj4+IC19Cj4+IC0KPj4gLWludCBpbnRlbF9ndWNfbGl2ZV9zZWxmdGVzdChzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKPj4gLXsKPj4gLcKgwqDCoCBzdGF0aWMgY29uc3Qg c3RydWN0IGk5MTVfc3VidGVzdCB0ZXN0c1tdID0gewo+PiAtwqDCoMKgwqDCoMKgwqAgU1VCVEVT VChpZ3RfZ3VjX2NsaWVudHMpLAo+PiAtwqDCoMKgwqDCoMKgwqAgU1VCVEVTVChpZ3RfZ3VjX2Rv b3JiZWxscyksCj4+IC3CoMKgwqAgfTsKPj4gLQo+PiAtwqDCoMKgIGlmICghVVNFU19HVUNfU1VC TUlTU0lPTihpOTE1KSkKPj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+PiAtCj4+IC3CoMKg wqAgcmV0dXJuIGludGVsX2d0X2xpdmVfc3VidGVzdHModGVzdHMsICZpOTE1LT5ndCk7Cj4+IC19 Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYyAKPj4g Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwo+PiBpbmRleCBjYWI2MzI3OTFm NzMuLjVkNTk3NGU3ZjNlZCAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkx NV9kZWJ1Z2ZzLmMKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMK Pj4gQEAgLTE4MTUsMTcgKzE4MTUsMTAgQEAgc3RhdGljIGludCBpOTE1X2d1Y19pbmZvKHN0cnVj dCBzZXFfZmlsZSAqbSwgCj4+IHZvaWQgKmRhdGEpCj4+IMKgwqDCoMKgwqAgR0VNX0JVR19PTigh Z3VjLT5leGVjYnVmX2NsaWVudCk7Cj4+IC3CoMKgwqAgc2VxX3ByaW50ZihtLCAiXG5Eb29yYmVs bCBtYXA6XG4iKTsKPj4gLcKgwqDCoCBzZXFfcHJpbnRmKG0sICJcdCUqcGJcbiIsIEdVQ19OVU1f RE9PUkJFTExTLCBndWMtPmRvb3JiZWxsX2JpdG1hcCk7Cj4+IC3CoMKgwqAgc2VxX3ByaW50Ziht LCAiRG9vcmJlbGwgbmV4dCBjYWNoZWxpbmU6IDB4JXhcbiIsIGd1Yy0+ZGJfY2FjaGVsaW5lKTsK Pj4gLQo+PiDCoMKgwqDCoMKgIHNlcV9wcmludGYobSwgIlxuR3VDIGV4ZWNidWYgY2xpZW50IEAg JXA6XG4iLCBjbGllbnQpOwo+PiAtwqDCoMKgIHNlcV9wcmludGYobSwgIlx0UHJpb3JpdHkgJWQs IEd1QyBzdGFnZSBpbmRleDogJXUsIFBEIG9mZnNldCAKPj4gMHgleFxuIiwKPj4gK8KgwqDCoCBz ZXFfcHJpbnRmKG0sICJcdFByaW9yaXR5ICVkLCBHdUMgc3RhZ2UgaW5kZXg6ICV1XG4iLAo+PiDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2xpZW50LT5wcmlvcml0eSwKPj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgIGNsaWVudC0+c3RhZ2VfaWQsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoCBjbGll bnQtPnByb2NfZGVzY19vZmZzZXQpOwo+PiAtwqDCoMKgIHNlcV9wcmludGYobSwgIlx0RG9vcmJl bGwgaWQgJWQsIG9mZnNldDogMHglbHhcbiIsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoCBjbGll bnQtPmRvb3JiZWxsX2lkLCBjbGllbnQtPmRvb3JiZWxsX29mZnNldCk7Cj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoCBjbGllbnQtPnN0YWdlX2lkKTsKPj4gwqDCoMKgwqDCoCAvKiBBZGQgbW9yZSBh cyByZXF1aXJlZCAuLi4gKi8KPj4gwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRlc3RzLmggCj4+ IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaAo+ PiBpbmRleCA0YjNjYWM3M2UyOTEuLmZiMDNmOGE5MGNhYyAxMDA2NDQKPj4gLS0tIGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaAo+PiArKysgYi9k cml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0cy5oCj4+IEBA IC0zNiw1ICszNiw0IEBAIHNlbGZ0ZXN0KHJlc2V0LCBpbnRlbF9yZXNldF9saXZlX3NlbGZ0ZXN0 cykKPj4gwqAgc2VsZnRlc3QobWVtb3J5X3JlZ2lvbiwgaW50ZWxfbWVtb3J5X3JlZ2lvbl9saXZl X3NlbGZ0ZXN0cykKPj4gwqAgc2VsZnRlc3QoaGFuZ2NoZWNrLCBpbnRlbF9oYW5nY2hlY2tfbGl2 ZV9zZWxmdGVzdHMpCj4+IMKgIHNlbGZ0ZXN0KGV4ZWNsaXN0cywgaW50ZWxfZXhlY2xpc3RzX2xp dmVfc2VsZnRlc3RzKQo+PiAtc2VsZnRlc3QoZ3VjLCBpbnRlbF9ndWNfbGl2ZV9zZWxmdGVzdCkK Pj4gwqAgc2VsZnRlc3QocGVyZiwgaTkxNV9wZXJmX2xpdmVfc2VsZnRlc3RzKQo+IApfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGlu ZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZng= 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=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,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 E5FF7C432C0 for ; Mon, 18 Nov 2019 22:20:12 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 C2436222DF for ; Mon, 18 Nov 2019 22:20:12 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C2436222DF Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5735A6E0FC; Mon, 18 Nov 2019 22:20:12 +0000 (UTC) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4DB186E0FC for ; Mon, 18 Nov 2019 22:20:11 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 18 Nov 2019 14:20:10 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.68,321,1569308400"; d="scan'208";a="204208455" Received: from dceraolo-linux.fm.intel.com (HELO [10.1.27.145]) ([10.1.27.145]) by fmsmga008.fm.intel.com with ESMTP; 18 Nov 2019 14:20:10 -0800 To: John Harrison , intel-gfx@lists.freedesktop.org References: <20191106222550.20752-1-daniele.ceraolospurio@intel.com> <20191106222550.20752-4-daniele.ceraolospurio@intel.com> <9f8e7012-c165-364e-ea26-57aae203a77c@Intel.com> From: Daniele Ceraolo Spurio Message-ID: <1d42604f-7b54-f362-73d4-f0d5de781990@intel.com> Date: Mon, 18 Nov 2019 14:20:03 -0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <9f8e7012-c165-364e-ea26-57aae203a77c@Intel.com> Content-Language: en-US Subject: Re: [Intel-gfx] [PATCH 3/4] drm/i915/guc: kill doorbell code and selftests X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development 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: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" Message-ID: <20191118222003.SNpchzVvB8qDQXd2xv359t60YdK6OwHI0GhuFhgwy5k@z> CgpPbiAxMS8xNC8xOSAzOjU2IFBNLCBKb2huIEhhcnJpc29uIHdyb3RlOgo+IE9uIDExLzYvMjAx OSAxNDoyNSwgRGFuaWVsZSBDZXJhb2xvIFNwdXJpbyB3cm90ZToKPj4gSW5zdGVhZCBvZiByZWx5 aW5nIG9uIHRoZSB3b3JrcXVldWUsIHRoZSB1cGNvbWluZyByZXdvcmtlZCBHdUMKPj4gc3VibWlz c2lvbiBmbG93IHdpbGwgb2ZmZXIgdGhlIGhvc3QgZHJpdmVyIGluZGlwZW5kZW50IGNvbnRyb2wg b3Zlcgo+IGluZGVwZW5kZW50Cj4gCj4+IHRoZSBleGVjdXRpb24gc3RhdHVzIG9mIGVhY2ggY29u dGV4dCBzdWJtaXR0ZWQgdG8gR3VDLiBBcyBwYXJ0IG9mIHRoaXMsCj4+IHRoZSBkb29yYmVsbCB1 c2FnZSBtb2RlbCBoYXMgYmVlbiByZXdvcmtlZCwgd2l0aCBlYWNoIGRvb3JiZWxsIGJlaW5nCj4+ IHBhaXJlZCB0byBhIHNpbmdsZSBscmMgYW5kIGEgZG9vcmJlbGwgcmluZyByZXByZXNlbnRpbmcg bmV3IHdvcmsKPj4gYXZhaWxhYmxlIGZvciB0aGF0IHNwZWNpZmljIGNvbnRleHQuIFRoaXMgbWVj aGFuaXNtLCBob3dldmVyLCBsaW1pdHMKPj4gdGhlIG51bWJlciBvZiBjb250ZXh0cyB0aGF0IGNh biBiZSByZWdpc3RlcmVkIHdpdGggR3VDIHRvIHRoZSBudW1iZXIgb2YKPj4gZG9vcmJlbGxzLCB3 aGljaCBpcyBhbiB1bmRlc2lyZWQgbGltaXRhdGlvbi4gTHVja2lseSwgR3VDIHdpbGwgYWxzbwo+ IE5vdCBleGFjdGx5ICdsdWNraWx5Jy4gTW9yZSBhIGNhc2Ugb2YsIHdlIHNhaWQgdGhlIGRvb3Ji ZWxscyB3b24ndCB3b3JrIAo+IGZvciBsaW51eCBzbyBjYW4gd2UgaGF2ZSBhIEgyRyBpbnN0ZWFk IGFuZCB0aGV5IGxpc3RlbmVkLgo+IAoKZml4ZWQKCj4+IHByb3ZpZGUgYSBIMkcgdGhhdCB3aWxs IGFsbG93IHRoZSBob3N0IHRvIG5vdGlmeSB0aGUgR3VDIG9mIHdvcmsKPj4gYXZhaWxhYmxlIGZv ciBhIHNwZWNpZmllZCBscmMsIHNvIHdlIGNhbiB1c2UgdGhhdCBtZWNoYW5pc20gaW5zdGVhZCBv Zgo+PiByZWx5aW5nIG9uIHRoZSBkb29yYmVsbHMuIFdlIGNhbiB0aGVyZWZvcmUgZHJvcCB0aGUg ZG9vcmJlbGwgY29kZSB3ZQo+PiBjdXJyZW50bHkgaGF2ZSwgYWxzbyBnaXZlbiB0aGUgZmFjdCB0 aGF0IGluIHRoZSB1bmxpa2VseSBjYXNlIHdlJ2Qgd2FudAo+PiB0byBzd2l0Y2ggYmFjayB0byB1 c2luZyBkb29yYmVsbHMgd2UnZCBoYXZlIHRvIGhlYXZpbHkgcmV3b3JrIGl0Lgo+PiBUaGUgd29y a3F1ZXVlIHdpbGwgc3RpbGwgaGF2ZSBhIHVzZSBpbiB0aGUgbmV3IGludGVyZmFjZSB0byBwYXNz IHNwZWNpYWwKPj4gY29tbWFuZHMsIHNvIHRoYXQgY29kZSBoYXMgYmVlbiByZXRhaW5lZCBmb3Ig bm93Lgo+Pgo+PiBXaXRoIHRoZSBkb29yYmVsbHMgZ29uZSBhbmQgdGhlIEd1QyBjbGllbnQgYmVj b21pbmcgZXZlbiBzaW1wbGVyLCB0aGUKPj4gZXhpc3RpbmcgR3VDIHNlbGZ0ZXN0cyBkb24ndCBn aXZlIHVzIGFueSBtZWFuaW5nZnVsIGNvdmVyYWdlIHNvIHdlIGNhbgo+PiByZW1vdmUgdGhlbSBh cyB3ZWxsLiBTb21lIHNlbGZ0ZXN0cyBtaWdodCBjb21lIHdpdGggdGhlIG5ldyBjb2RlLCBidXQK Pj4gdGhleSB3aWxsIGxvb2sgZGlmZmVyZW50IGZyb20gd2hhdCB3ZSBoYXZlIG5vdyBzbyBpZiBk b2Vzbid0IHNlZW0gd29ydGgKPj4gaXQgdG8ga2VlcCB0aGUgZmlsZSBhcm91bmQgaW4gdGhlIG1l YW50aW1lLgo+Pgo+PiBTaWduZWQtb2ZmLWJ5OiBEYW5pZWxlIENlcmFvbG8gU3B1cmlvIDxkYW5p ZWxlLmNlcmFvbG9zcHVyaW9AaW50ZWwuY29tPgo+PiBDYzogTWljaGFsIFdhamRlY3prbyA8bWlj aGFsLndhamRlY3prb0BpbnRlbC5jb20+Cj4+IENjOiBKb2huIEhhcnJpc29uIDxKb2huLkMuSGFy cmlzb25ASW50ZWwuY29tPgo+PiBDYzogTWF0dGhldyBCcm9zdCA8bWF0dGhldy5icm9zdEBpbnRl bC5jb20+Cj4+IC0tLQo+PiDCoCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9ndWMu aMKgwqDCoMKgwqDCoMKgIHzCoMKgIDggKy0KPj4gwqAgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qv dWMvaW50ZWxfZ3VjX2Z3aWYuaMKgwqAgfMKgwqAgMiArLQo+PiDCoCAuLi4vZ3B1L2RybS9pOTE1 L2d0L3VjL2ludGVsX2d1Y19zdWJtaXNzaW9uLmMgfCAzNzMgKystLS0tLS0tLS0tLS0tLS0tCj4+ IMKgIC4uLi9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX3N1Ym1pc3Npb24uaCB8wqDCoCA5 ICstCj4+IMKgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL2ludGVsX3VjLmPCoMKgwqDCoMKg wqDCoMKgIHzCoMKgIDcgKy0KPj4gwqAgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvc2VsZnRl c3RfZ3VjLmPCoMKgwqDCoCB8IDI5OSAtLS0tLS0tLS0tLS0tLQo+PiDCoCBkcml2ZXJzL2dwdS9k cm0vaTkxNS9pOTE1X2RlYnVnZnMuY8KgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoCAxMSArLQo+PiDC oCAuLi4vZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaMKgIHzCoMKgIDEg LQo+PiDCoCA4IGZpbGVzIGNoYW5nZWQsIDQyIGluc2VydGlvbnMoKyksIDY2OCBkZWxldGlvbnMo LSkKPj4gwqAgZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL3Nl bGZ0ZXN0X2d1Yy5jCj4+Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91 Yy9pbnRlbF9ndWMuaCAKPj4gYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9ndWMu aAo+PiBpbmRleCBiZjQzOGY4MjBjMzUuLmIyZDE3NjZlNjg5YSAxMDA2NDQKPj4gLS0tIGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjLmgKPj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjLmgKPj4gQEAgLTIwLDggKzIwLDggQEAgc3RydWN0IF9f Z3VjX2Fkc19ibG9iOwo+PiDCoCAvKgo+PiDCoMKgICogVG9wIGxldmVsIHN0cnVjdHVyZSBvZiBH dUMuIEl0IGhhbmRsZXMgZmlybXdhcmUgbG9hZGluZyBhbmQgCj4+IG1hbmFnZXMgY2xpZW50Cj4+ IC0gKiBwb29sIGFuZCBkb29yYmVsbHMuIGludGVsX2d1YyBvd25zIGEgaW50ZWxfZ3VjX2NsaWVu dCB0byByZXBsYWNlIAo+PiB0aGUgbGVnYWN5Cj4+IC0gKiBFeGVjTGlzdCBzdWJtaXNzaW9uLgo+ PiArICogcG9vbC4gaW50ZWxfZ3VjIG93bnMgYSBpbnRlbF9ndWNfY2xpZW50IHRvIHJlcGxhY2Ug dGhlIGxlZ2FjeSAKPj4gRXhlY0xpc3QKPj4gKyAqIHN1Ym1pc3Npb24uCj4+IMKgwqAgKi8KPj4g wqAgc3RydWN0IGludGVsX2d1YyB7Cj4+IMKgwqDCoMKgwqAgc3RydWN0IGludGVsX3VjX2Z3IGZ3 Owo+PiBAQCAtNTAsMTAgKzUwLDYgQEAgc3RydWN0IGludGVsX2d1YyB7Cj4+IMKgwqDCoMKgwqAg c3RydWN0IGludGVsX2d1Y19jbGllbnQgKmV4ZWNidWZfY2xpZW50Owo+PiAtwqDCoMKgIERFQ0xB UkVfQklUTUFQKGRvb3JiZWxsX2JpdG1hcCwgR1VDX05VTV9ET09SQkVMTFMpOwo+PiAtwqDCoMKg IC8qIEN5Y2xpYyBjb3VudGVyIG1vZCBwYWdlc2l6ZcKgwqDCoCAqLwo+PiAtwqDCoMKgIHUzMiBk Yl9jYWNoZWxpbmU7Cj4+IC0KPj4gwqDCoMKgwqDCoCAvKiBDb250cm9sIHBhcmFtcyBmb3IgZncg aW5pdGlhbGl6YXRpb24gKi8KPj4gwqDCoMKgwqDCoCB1MzIgcGFyYW1zW0dVQ19DVExfTUFYX0RX T1JEU107Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9n dWNfZndpZi5oIAo+PiBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL2ludGVsX2d1Y19md2lm LmgKPj4gaW5kZXggYTI2YTg1ZDUwMjA5Li4xZThlNGFmN2Q5Y2EgMTAwNjQ0Cj4+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL2ludGVsX2d1Y19md2lmLmgKPj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX2Z3aWYuaAo+PiBAQCAtMzEsNyArMzEsNyBA QAo+PiDCoCAjZGVmaW5lIEdVQ19ET09SQkVMTF9JTlZBTElEwqDCoMKgwqDCoMKgwqAgMjU2Cj4+ IC0jZGVmaW5lIEdVQ19EQl9TSVpFwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoUEFHRV9TSVpFKQo+ PiArI2RlZmluZSBHVUNfUERfU0laRcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKFBBR0VfU0laRSkK Pj4gwqAgI2RlZmluZSBHVUNfV1FfU0laRcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKFBBR0VfU0la RSAqIDIpCj4+IMKgIC8qIFdvcmsgcXVldWUgaXRlbSBoZWFkZXIgZGVmaW5pdGlvbnMgKi8KPj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL2ludGVsX2d1Y19zdWJtaXNz aW9uLmMgCj4+IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX3N1Ym1pc3Np b24uYwo+PiBpbmRleCA2YWMyMTNkZGJmYTMuLjAwODhjMzQxNzY0MSAxMDA2NDQKPj4gLS0tIGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX3N1Ym1pc3Npb24uYwo+PiArKysg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9ndWNfc3VibWlzc2lvbi5jCj4+IEBA IC0zMCw4ICszMCw4IEBACj4+IMKgwqAgKiBHdUMgY2xpZW50Ogo+PiDCoMKgICogQSBpbnRlbF9n dWNfY2xpZW50IHJlZmVycyB0byBhIHN1Ym1pc3Npb24gcGF0aCB0aHJvdWdoIEd1Qy4gCj4+IEN1 cnJlbnRseSwgdGhlcmUKPj4gwqDCoCAqIGlzIG9ubHkgb25lIGNsaWVudCwgd2hpY2ggaXMgY2hh cmdlZCB3aXRoIGFsbCBzdWJtaXNzaW9ucyB0byB0aGUgCj4+IEd1Qy4gVGhpcwo+PiAtICogc3Ry dWN0IGlzIHRoZSBvd25lciBvZiBhIGRvb3JiZWxsLCBhIHByb2Nlc3MgZGVzY3JpcHRvciBhbmQg YSAKPj4gd29ya3F1ZXVlIChhbGwKPj4gLSAqIG9mIHRoZW0gaW5zaWRlIGEgc2luZ2xlIGdlbSBv YmplY3QgdGhhdCBjb250YWlucyBhbGwgcmVxdWlyZWQgCj4+IHBhZ2VzIGZvciB0aGVzZQo+PiAr ICogc3RydWN0IGlzIHRoZSBvd25lciBvZiBhIHByb2Nlc3MgZGVzY3JpcHRvciBhbmQgYSB3b3Jr cXVldWUgKGJvdGggCj4+IG9mIHRoZW0KPj4gKyAqIGluc2lkZSBhIHNpbmdsZSBnZW0gb2JqZWN0 IHRoYXQgY29udGFpbnMgYWxsIHJlcXVpcmVkIHBhZ2VzIGZvciB0aGVzZQo+PiDCoMKgICogZWxl bWVudHMpLgo+PiDCoMKgICoKPj4gwqDCoCAqIEd1QyBzdGFnZSBkZXNjcmlwdG9yOgo+PiBAQCAt MzksMTMgKzM5LDEzIEBACj4+IMKgwqAgKiBkZXNjcmlwdG9ycywgYW5kIHNoYXJlcyB0aGVtIHdp dGggdGhlIEd1Qy4KPj4gwqDCoCAqIEN1cnJlbnRseSwgdGhlcmUgZXhpc3RzIGEgMToxIG1hcHBp bmcgYmV0d2VlbiBhIGludGVsX2d1Y19jbGllbnQgCj4+IGFuZCBhCj4+IMKgwqAgKiBndWNfc3Rh Z2VfZGVzYyAodmlhIHRoZSBjbGllbnQncyBzdGFnZV9pZCksIHNvIGVmZmVjdGl2ZWx5IG9ubHkg b25lCj4+IC0gKiBnZXRzIHVzZWQuIFRoaXMgc3RhZ2UgZGVzY3JpcHRvciBsZXRzIHRoZSBHdUMg a25vdyBhYm91dCB0aGUgCj4+IGRvb3JiZWxsLAo+PiAtICogd29ya3F1ZXVlIGFuZCBwcm9jZXNz IGRlc2NyaXB0b3IuIFRoZW9yZXRpY2FsbHksIGl0IGFsc28gbGV0cyB0aGUgR3VDCj4+IC0gKiBr bm93IGFib3V0IG91ciBIVyBjb250ZXh0cyAoY29udGV4dCBJRCwgZXRjLi4uKSwgYnV0IHdlIGFj dHVhbGx5Cj4+IC0gKiBlbXBsb3kgYSBraW5kIG9mIHN1Ym1pc3Npb24gd2hlcmUgdGhlIEd1QyB1 c2VzIHRoZSBMUkNBIHNlbnQgdmlhIAo+PiB0aGUgd29yawo+PiAtICogaXRlbSBpbnN0ZWFkICh0 aGUgc2luZ2xlIGd1Y19zdGFnZV9kZXNjIGFzc29jaWF0ZWQgdG8gZXhlY2J1ZiBjbGllbnQKPj4g LSAqIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZWZhdWx0IGtlcm5lbCBjb250ZXh0 IG9ubHksIGJ1dCAKPj4gdGhpcyBpcwo+PiAtICogZXNzZW50aWFsbHkgdW51c2VkKS4gVGhpcyBp cyBjYWxsZWQgYSAicHJveHkiIHN1Ym1pc3Npb24uCj4+ICsgKiBnZXRzIHVzZWQuIFRoaXMgc3Rh Z2UgZGVzY3JpcHRvciBsZXRzIHRoZSBHdUMga25vdyBhYm91dCB0aGUgCj4+IHdvcmtxdWV1ZSBh bmQKPj4gKyAqIHByb2Nlc3MgZGVzY3JpcHRvci4gVGhlb3JldGljYWxseSwgaXQgYWxzbyBsZXRz IHRoZSBHdUMga25vdyBhYm91dCAKPj4gb3VyIEhXCj4+ICsgKiBjb250ZXh0cyAoY29udGV4dCBJ RCwgZXRjLi4uKSwgYnV0IHdlIGFjdHVhbGx5IGVtcGxveSBhIGtpbmQgb2YgCj4+IHN1Ym1pc3Np b24KPj4gKyAqIHdoZXJlIHRoZSBHdUMgdXNlcyB0aGUgTFJDQSBzZW50IHZpYSB0aGUgd29yayBp dGVtIGluc3RlYWQgKHRoZSAKPj4gc2luZ2xlCj4+ICsgKiBndWNfc3RhZ2VfZGVzYyBhc3NvY2lh dGVkIHRvIGV4ZWNidWYgY2xpZW50IGNvbnRhaW5zIGluZm9ybWF0aW9uIAo+PiBhYm91dCB0aGUK Pj4gKyAqIGRlZmF1bHQga2VybmVsIGNvbnRleHQgb25seSwgYnV0IHRoaXMgaXMgZXNzZW50aWFs bHkgdW51c2VkKS4gVGhpcyAKPj4gaXMgY2FsbGVkCj4+ICsgKiBhICJwcm94eSIgc3VibWlzc2lv bi4KPj4gwqDCoCAqCj4+IMKgwqAgKiBUaGUgU2NyYXRjaCByZWdpc3RlcnM6Cj4+IMKgwqAgKiBU aGVyZSBhcmUgMTYgTU1JTy1iYXNlZCByZWdpc3RlcnMgc3RhcnQgZnJvbSAweEMxODAuIFRoZSBr ZXJuZWwgCj4+IGRyaXZlciB3cml0ZXMKPj4gQEAgLTU2LDEwICs1Niw2IEBACj4+IMKgwqAgKiB0 aGVuIHByb2NlZWRzLgo+PiDCoMKgICogU2VlIGludGVsX2d1Y19zZW5kKCkKPj4gwqDCoCAqCj4+ IC0gKiBEb29yYmVsbHM6Cj4+IC0gKiBEb29yYmVsbHMgYXJlIGludGVycnVwdHMgdG8gdUtlcm5l bC4gQSBkb29yYmVsbCBpcyBhIHNpbmdsZSBjYWNoZSAKPj4gbGluZSAoUVcpCj4+IC0gKiBtYXBw ZWQgaW50byBwcm9jZXNzIHNwYWNlLgo+PiAtICoKPj4gwqDCoCAqIFdvcmsgSXRlbXM6Cj4+IMKg wqAgKiBUaGVyZSBhcmUgc2V2ZXJhbCB0eXBlcyBvZiB3b3JrIGl0ZW1zIHRoYXQgdGhlIGhvc3Qg bWF5IHBsYWNlIGludG8gYQo+PiDCoMKgICogd29ya3F1ZXVlLCBlYWNoIHdpdGggaXRzIG93biBy ZXF1aXJlbWVudHMgYW5kIGxpbWl0YXRpb25zLiAKPj4gQ3VycmVudGx5IG9ubHkKPj4gQEAgLTgx LDc4ICs3Nyw2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19oaWdoX3ByaW9yaXR5KHN0cnVjdCAK Pj4gaW50ZWxfZ3VjX2NsaWVudCAqY2xpZW50KQo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgY2xpZW50 LT5wcmlvcml0eSA9PSBHVUNfQ0xJRU5UX1BSSU9SSVRZX0hJR0gpOwo+PiDCoCB9Cj4+IC1zdGF0 aWMgaW50IHJlc2VydmVfZG9vcmJlbGwoc3RydWN0IGludGVsX2d1Y19jbGllbnQgKmNsaWVudCkK Pj4gLXsKPj4gLcKgwqDCoCB1bnNpZ25lZCBsb25nIG9mZnNldDsKPj4gLcKgwqDCoCB1bnNpZ25l ZCBsb25nIGVuZDsKPj4gLcKgwqDCoCB1MTYgaWQ7Cj4+IC0KPj4gLcKgwqDCoCBHRU1fQlVHX09O KGNsaWVudC0+ZG9vcmJlbGxfaWQgIT0gR1VDX0RPT1JCRUxMX0lOVkFMSUQpOwo+PiAtCj4+IC3C oMKgwqAgLyoKPj4gLcKgwqDCoMKgICogVGhlIGJpdG1hcCB0cmFja3Mgd2hpY2ggZG9vcmJlbGwg cmVnaXN0ZXJzIGFyZSBjdXJyZW50bHkgaW4gdXNlLgo+PiAtwqDCoMKgwqAgKiBJdCBpcyBzcGxp dCBpbnRvIHR3byBoYWx2ZXM7IHRoZSBmaXJzdCBoYWxmIGlzIHVzZWQgZm9yIG5vcm1hbAo+PiAt wqDCoMKgwqAgKiBwcmlvcml0eSBjb250ZXh0cywgdGhlIHNlY29uZCBoYWxmIGZvciBoaWdoLXBy aW9yaXR5IG9uZXMuCj4+IC3CoMKgwqDCoCAqLwo+PiAtwqDCoMKgIG9mZnNldCA9IDA7Cj4+IC3C oMKgwqAgZW5kID0gR1VDX05VTV9ET09SQkVMTFMgLyAyOwo+PiAtwqDCoMKgIGlmIChpc19oaWdo X3ByaW9yaXR5KGNsaWVudCkpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIG9mZnNldCA9IGVuZDsKPj4g LcKgwqDCoMKgwqDCoMKgIGVuZCArPSBvZmZzZXQ7Cj4+IC3CoMKgwqAgfQo+PiAtCj4+IC3CoMKg wqAgaWQgPSBmaW5kX25leHRfemVyb19iaXQoY2xpZW50LT5ndWMtPmRvb3JiZWxsX2JpdG1hcCwg ZW5kLCBvZmZzZXQpOwo+PiAtwqDCoMKgIGlmIChpZCA9PSBlbmQpCj4+IC3CoMKgwqDCoMKgwqDC oCByZXR1cm4gLUVOT1NQQzsKPj4gLQo+PiAtwqDCoMKgIF9fc2V0X2JpdChpZCwgY2xpZW50LT5n dWMtPmRvb3JiZWxsX2JpdG1hcCk7Cj4+IC3CoMKgwqAgY2xpZW50LT5kb29yYmVsbF9pZCA9IGlk Owo+PiAtwqDCoMKgIERSTV9ERUJVR19EUklWRVIoImNsaWVudCAldSAoaGlnaCBwcmlvPSVzKSBy ZXNlcnZlZCBkb29yYmVsbDogJWRcbiIsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2xp ZW50LT5zdGFnZV9pZCwgeWVzbm8oaXNfaGlnaF9wcmlvcml0eShjbGllbnQpKSwKPj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBpZCk7Cj4+IC3CoMKgwqAgcmV0dXJuIDA7Cj4+IC19Cj4+IC0K Pj4gLXN0YXRpYyBib29sIGhhc19kb29yYmVsbChzdHJ1Y3QgaW50ZWxfZ3VjX2NsaWVudCAqY2xp ZW50KQo+PiAtewo+PiAtwqDCoMKgIGlmIChjbGllbnQtPmRvb3JiZWxsX2lkID09IEdVQ19ET09S QkVMTF9JTlZBTElEKQo+PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGZhbHNlOwo+PiAtCj4+IC3C oMKgwqAgcmV0dXJuIHRlc3RfYml0KGNsaWVudC0+ZG9vcmJlbGxfaWQsIGNsaWVudC0+Z3VjLT5k b29yYmVsbF9iaXRtYXApOwo+PiAtfQo+PiAtCj4+IC1zdGF0aWMgdm9pZCB1bnJlc2VydmVfZG9v cmJlbGwoc3RydWN0IGludGVsX2d1Y19jbGllbnQgKmNsaWVudCkKPj4gLXsKPj4gLcKgwqDCoCBH RU1fQlVHX09OKCFoYXNfZG9vcmJlbGwoY2xpZW50KSk7Cj4+IC0KPj4gLcKgwqDCoCBfX2NsZWFy X2JpdChjbGllbnQtPmRvb3JiZWxsX2lkLCBjbGllbnQtPmd1Yy0+ZG9vcmJlbGxfYml0bWFwKTsK Pj4gLcKgwqDCoCBjbGllbnQtPmRvb3JiZWxsX2lkID0gR1VDX0RPT1JCRUxMX0lOVkFMSUQ7Cj4+ IC19Cj4+IC0KPj4gLS8qCj4+IC0gKiBUZWxsIHRoZSBHdUMgdG8gYWxsb2NhdGUgb3IgZGVhbGxv Y2F0ZSBhIHNwZWNpZmljIGRvb3JiZWxsCj4+IC0gKi8KPj4gLQo+PiAtc3RhdGljIGludCBfX2d1 Y19hbGxvY2F0ZV9kb29yYmVsbChzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsIHUzMiBzdGFnZV9pZCkK Pj4gLXsKPj4gLcKgwqDCoCB1MzIgYWN0aW9uW10gPSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCBJTlRF TF9HVUNfQUNUSU9OX0FMTE9DQVRFX0RPT1JCRUxMLAo+PiAtwqDCoMKgwqDCoMKgwqAgc3RhZ2Vf aWQKPj4gLcKgwqDCoCB9Owo+PiAtCj4+IC3CoMKgwqAgcmV0dXJuIGludGVsX2d1Y19zZW5kKGd1 YywgYWN0aW9uLCBBUlJBWV9TSVpFKGFjdGlvbikpOwo+PiAtfQo+PiAtCj4+IC1zdGF0aWMgaW50 IF9fZ3VjX2RlYWxsb2NhdGVfZG9vcmJlbGwoc3RydWN0IGludGVsX2d1YyAqZ3VjLCB1MzIgCj4+ IHN0YWdlX2lkKQo+PiAtewo+PiAtwqDCoMKgIHUzMiBhY3Rpb25bXSA9IHsKPj4gLcKgwqDCoMKg wqDCoMKgIElOVEVMX0dVQ19BQ1RJT05fREVBTExPQ0FURV9ET09SQkVMTCwKPj4gLcKgwqDCoMKg wqDCoMKgIHN0YWdlX2lkCj4+IC3CoMKgwqAgfTsKPj4gLQo+PiAtwqDCoMKgIHJldHVybiBpbnRl bF9ndWNfc2VuZChndWMsIGFjdGlvbiwgQVJSQVlfU0laRShhY3Rpb24pKTsKPj4gLX0KPj4gLQo+ PiDCoCBzdGF0aWMgc3RydWN0IGd1Y19zdGFnZV9kZXNjICpfX2dldF9zdGFnZV9kZXNjKHN0cnVj dCAKPj4gaW50ZWxfZ3VjX2NsaWVudCAqY2xpZW50KQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAgc3Ry dWN0IGd1Y19zdGFnZV9kZXNjICpiYXNlID0gY2xpZW50LT5ndWMtPnN0YWdlX2Rlc2NfcG9vbF92 YWRkcjsKPj4gQEAgLTE2MCwxMTggKzg0LDEwIEBAIHN0YXRpYyBzdHJ1Y3QgZ3VjX3N0YWdlX2Rl c2MgCj4+ICpfX2dldF9zdGFnZV9kZXNjKHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQp Cj4+IMKgwqDCoMKgwqAgcmV0dXJuICZiYXNlW2NsaWVudC0+c3RhZ2VfaWRdOwo+PiDCoCB9Cj4+ IC0vKgo+PiAtICogSW5pdGlhbGlzZSwgdXBkYXRlLCBvciBjbGVhciBkb29yYmVsbCBkYXRhIHNo YXJlZCB3aXRoIHRoZSBHdUMKPj4gLSAqCj4+IC0gKiBUaGVzZSBmdW5jdGlvbnMgbW9kaWZ5IHNo YXJlZCBkYXRhIGFuZCBzbyBuZWVkIGFjY2VzcyB0byB0aGUgbWFwcGVkCj4+IC0gKiBjbGllbnQg b2JqZWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBwYWdlIGJlaW5nIHVzZWQgZm9yIHRoZSBkb29yYmVs bAo+PiAtICovCj4+IC0KPj4gLXN0YXRpYyB2b2lkIF9fdXBkYXRlX2Rvb3JiZWxsX2Rlc2Moc3Ry dWN0IGludGVsX2d1Y19jbGllbnQgKmNsaWVudCwgCj4+IHUxNiBuZXdfaWQpCj4+IC17Cj4+IC3C oMKgwqAgc3RydWN0IGd1Y19zdGFnZV9kZXNjICpkZXNjOwo+PiAtCj4+IC3CoMKgwqAgLyogVXBk YXRlIHRoZSBHdUMncyBpZGVhIG9mIHRoZSBkb29yYmVsbCBJRCAqLwo+PiAtwqDCoMKgIGRlc2Mg PSBfX2dldF9zdGFnZV9kZXNjKGNsaWVudCk7Cj4+IC3CoMKgwqAgZGVzYy0+ZGJfaWQgPSBuZXdf aWQ7Cj4+IC19Cj4+IC0KPj4gLXN0YXRpYyBzdHJ1Y3QgZ3VjX2Rvb3JiZWxsX2luZm8gKl9fZ2V0 X2Rvb3JiZWxsKHN0cnVjdCAKPj4gaW50ZWxfZ3VjX2NsaWVudCAqY2xpZW50KQo+PiAtewo+PiAt wqDCoMKgIHJldHVybiBjbGllbnQtPnZhZGRyICsgY2xpZW50LT5kb29yYmVsbF9vZmZzZXQ7Cj4+ IC19Cj4+IC0KPj4gLXN0YXRpYyBib29sIF9fZG9vcmJlbGxfdmFsaWQoc3RydWN0IGludGVsX2d1 YyAqZ3VjLCB1MTYgZGJfaWQpCj4+IC17Cj4+IC3CoMKgwqAgc3RydWN0IGludGVsX3VuY29yZSAq dW5jb3JlID0gZ3VjX3RvX2d0KGd1YyktPnVuY29yZTsKPj4gLQo+PiAtwqDCoMKgIEdFTV9CVUdf T04oZGJfaWQgPj0gR1VDX05VTV9ET09SQkVMTFMpOwo+PiAtwqDCoMKgIHJldHVybiBpbnRlbF91 bmNvcmVfcmVhZCh1bmNvcmUsIEdFTjhfRFJCUkVHTChkYl9pZCkpICYgCj4+IEdFTjhfRFJCX1ZB TElEOwo+PiAtfQo+PiAtCj4+IC1zdGF0aWMgdm9pZCBfX2luaXRfZG9vcmJlbGwoc3RydWN0IGlu dGVsX2d1Y19jbGllbnQgKmNsaWVudCkKPj4gLXsKPj4gLcKgwqDCoCBzdHJ1Y3QgZ3VjX2Rvb3Ji ZWxsX2luZm8gKmRvb3JiZWxsOwo+PiAtCj4+IC3CoMKgwqAgZG9vcmJlbGwgPSBfX2dldF9kb29y YmVsbChjbGllbnQpOwo+PiAtwqDCoMKgIGRvb3JiZWxsLT5kYl9zdGF0dXMgPSBHVUNfRE9PUkJF TExfRU5BQkxFRDsKPj4gLcKgwqDCoCBkb29yYmVsbC0+Y29va2llID0gMDsKPj4gLX0KPj4gLQo+ PiAtc3RhdGljIHZvaWQgX19maW5pX2Rvb3JiZWxsKHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpj bGllbnQpCj4+IC17Cj4+IC3CoMKgwqAgc3RydWN0IGd1Y19kb29yYmVsbF9pbmZvICpkb29yYmVs bDsKPj4gLcKgwqDCoCB1MTYgZGJfaWQgPSBjbGllbnQtPmRvb3JiZWxsX2lkOwo+PiAtCj4+IC3C oMKgwqAgZG9vcmJlbGwgPSBfX2dldF9kb29yYmVsbChjbGllbnQpOwo+PiAtwqDCoMKgIGRvb3Ji ZWxsLT5kYl9zdGF0dXMgPSBHVUNfRE9PUkJFTExfRElTQUJMRUQ7Cj4+IC0KPj4gLcKgwqDCoCAv KiBEb29yYmVsbCByZWxlYXNlIGZsb3cgcmVxdWlyZXMgdGhhdCB3ZSB3YWl0IGZvciBHRU44X0RS Ql9WQUxJRCAKPj4gYml0Cj4+IC3CoMKgwqDCoCAqIHRvIGdvIHRvIHplcm8gYWZ0ZXIgdXBkYXRp bmcgZGJfc3RhdHVzIGJlZm9yZSB3ZSBjYWxsIHRoZSBHdUMgdG8KPj4gLcKgwqDCoMKgICogcmVs ZWFzZSB0aGUgZG9vcmJlbGwKPj4gLcKgwqDCoMKgICovCj4+IC3CoMKgwqAgaWYgKHdhaXRfZm9y X3VzKCFfX2Rvb3JiZWxsX3ZhbGlkKGNsaWVudC0+Z3VjLCBkYl9pZCksIDEwKSkKPj4gLcKgwqDC oMKgwqDCoMKgIFdBUk5fT05DRSh0cnVlLCAiRG9vcmJlbGwgbmV2ZXIgYmVjYW1lIGludmFsaWQg YWZ0ZXIgCj4+IGRpc2FibGVcbiIpOwo+PiAtfQo+PiAtCj4+IC1zdGF0aWMgaW50IGNyZWF0ZV9k b29yYmVsbChzdHJ1Y3QgaW50ZWxfZ3VjX2NsaWVudCAqY2xpZW50KQo+PiAtewo+PiAtwqDCoMKg IGludCByZXQ7Cj4+IC0KPj4gLcKgwqDCoCBpZiAoV0FSTl9PTighaGFzX2Rvb3JiZWxsKGNsaWVu dCkpKQo+PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9ERVY7IC8qIGludGVybmFsIHNldHVw IGVycm9yLCBzaG91bGQgbmV2ZXIgaGFwcGVuICovCj4+IC0KPj4gLcKgwqDCoCBfX3VwZGF0ZV9k b29yYmVsbF9kZXNjKGNsaWVudCwgY2xpZW50LT5kb29yYmVsbF9pZCk7Cj4+IC3CoMKgwqAgX19p bml0X2Rvb3JiZWxsKGNsaWVudCk7Cj4+IC0KPj4gLcKgwqDCoCByZXQgPSBfX2d1Y19hbGxvY2F0 ZV9kb29yYmVsbChjbGllbnQtPmd1YywgY2xpZW50LT5zdGFnZV9pZCk7Cj4+IC3CoMKgwqAgaWYg KHJldCkgewo+PiAtwqDCoMKgwqDCoMKgwqAgX19maW5pX2Rvb3JiZWxsKGNsaWVudCk7Cj4+IC3C oMKgwqDCoMKgwqDCoCBfX3VwZGF0ZV9kb29yYmVsbF9kZXNjKGNsaWVudCwgR1VDX0RPT1JCRUxM X0lOVkFMSUQpOwo+PiAtwqDCoMKgwqDCoMKgwqAgRFJNX0RFQlVHX0RSSVZFUigiQ291bGRuJ3Qg Y3JlYXRlIGNsaWVudCAldSBkb29yYmVsbDogJWRcbiIsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBjbGllbnQtPnN0YWdlX2lkLCByZXQpOwo+PiAtwqDCoMKgwqDCoMKgwqAg cmV0dXJuIHJldDsKPj4gLcKgwqDCoCB9Cj4+IC0KPj4gLcKgwqDCoCByZXR1cm4gMDsKPj4gLX0K Pj4gLQo+PiAtc3RhdGljIGludCBkZXN0cm95X2Rvb3JiZWxsKHN0cnVjdCBpbnRlbF9ndWNfY2xp ZW50ICpjbGllbnQpCj4+IC17Cj4+IC3CoMKgwqAgaW50IHJldDsKPj4gLQo+PiAtwqDCoMKgIEdF TV9CVUdfT04oIWhhc19kb29yYmVsbChjbGllbnQpKTsKPj4gLQo+PiAtwqDCoMKgIF9fZmluaV9k b29yYmVsbChjbGllbnQpOwo+PiAtwqDCoMKgIHJldCA9IF9fZ3VjX2RlYWxsb2NhdGVfZG9vcmJl bGwoY2xpZW50LT5ndWMsIGNsaWVudC0+c3RhZ2VfaWQpOwo+PiAtwqDCoMKgIGlmIChyZXQpCj4+ IC3CoMKgwqDCoMKgwqDCoCBEUk1fRVJST1IoIkNvdWxkbid0IGRlc3Ryb3kgY2xpZW50ICV1IGRv b3JiZWxsOiAlZFxuIiwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNsaWVudC0+c3Rh Z2VfaWQsIHJldCk7Cj4+IC0KPj4gLcKgwqDCoCBfX3VwZGF0ZV9kb29yYmVsbF9kZXNjKGNsaWVu dCwgR1VDX0RPT1JCRUxMX0lOVkFMSUQpOwo+PiAtCj4+IC3CoMKgwqAgcmV0dXJuIHJldDsKPj4g LX0KPj4gLQo+PiAtc3RhdGljIHVuc2lnbmVkIGxvbmcgX19zZWxlY3RfY2FjaGVsaW5lKHN0cnVj dCBpbnRlbF9ndWMgKmd1YykKPj4gLXsKPj4gLcKgwqDCoCB1bnNpZ25lZCBsb25nIG9mZnNldDsK Pj4gLQo+PiAtwqDCoMKgIC8qIERvb3JiZWxsIHVzZXMgYSBzaW5nbGUgY2FjaGUgbGluZSB3aXRo aW4gYSBwYWdlICovCj4+IC3CoMKgwqAgb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2UoZ3VjLT5kYl9j YWNoZWxpbmUpOwo+PiAtCj4+IC3CoMKgwqAgLyogTW92aW5nIHRvIG5leHQgY2FjaGUgbGluZSB0 byByZWR1Y2UgY29udGVudGlvbiAqLwo+PiAtwqDCoMKgIGd1Yy0+ZGJfY2FjaGVsaW5lICs9IGNh Y2hlX2xpbmVfc2l6ZSgpOwo+PiAtCj4+IC3CoMKgwqAgRFJNX0RFQlVHX0RSSVZFUigicmVzZXJ2 ZWQgY2FjaGVsaW5lIDB4JWx4LCBuZXh0IDB4JXgsIGxpbmVzaXplIAo+PiAldVxuIiwKPj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBvZmZzZXQsIGd1Yy0+ZGJfY2FjaGVsaW5lLCBjYWNoZV9s aW5lX3NpemUoKSk7Cj4+IC3CoMKgwqAgcmV0dXJuIG9mZnNldDsKPj4gLX0KPj4gLQo+PiDCoCBz dGF0aWMgaW5saW5lIHN0cnVjdCBndWNfcHJvY2Vzc19kZXNjICoKPj4gwqAgX19nZXRfcHJvY2Vz c19kZXNjKHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQpCj4+IMKgIHsKPj4gLcKgwqDC oCByZXR1cm4gY2xpZW50LT52YWRkciArIGNsaWVudC0+cHJvY19kZXNjX29mZnNldDsKPj4gK8Kg wqDCoCByZXR1cm4gY2xpZW50LT52YWRkcjsKPj4gwqAgfQo+PiDCoCAvKgo+PiBAQCAtMzMyLDgg KzE0OCw4IEBAIHN0YXRpYyB2b2lkIGd1Y19zdGFnZV9kZXNjX3Bvb2xfZGVzdHJveShzdHJ1Y3Qg Cj4+IGludGVsX2d1YyAqZ3VjKQo+PiDCoMKgICogSW5pdGlhbGlzZS9jbGVhciB0aGUgc3RhZ2Ug ZGVzY3JpcHRvciBzaGFyZWQgd2l0aCB0aGUgR3VDIGZpcm13YXJlLgo+PiDCoMKgICoKPj4gwqDC oCAqIFRoaXMgZGVzY3JpcHRvciB0ZWxscyB0aGUgR3VDIHdoZXJlIChpbiBHR1RUIHNwYWNlKSB0 byBmaW5kIHRoZSAKPj4gaW1wb3J0YW50Cj4+IC0gKiBkYXRhIHN0cnVjdHVyZXMgcmVsYXRpbmcg dG8gdGhpcyBjbGllbnQgKGRvb3JiZWxsLCBwcm9jZXNzIAo+PiBkZXNjcmlwdG9yLAo+PiAtICog d3JpdGUgcXVldWUsIGV0YykuCj4+ICsgKiBkYXRhIHN0cnVjdHVyZXMgcmVsYXRpbmcgdG8gdGhp cyBjbGllbnQgKHByb2Nlc3MgZGVzY3JpcHRvciwgd3JpdGUgCj4+IHF1ZXVlLAo+PiArICogZXRj KS4KPj4gwqDCoCAqLwo+PiDCoCBzdGF0aWMgdm9pZCBndWNfc3RhZ2VfZGVzY19pbml0KHN0cnVj dCBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQpCj4+IMKgIHsKPj4gQEAgLTM1MCwxOSArMTY2LDE0 IEBAIHN0YXRpYyB2b2lkIGd1Y19zdGFnZV9kZXNjX2luaXQoc3RydWN0IAo+PiBpbnRlbF9ndWNf Y2xpZW50ICpjbGllbnQpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBkZXNjLT5hdHRyaWJ1dGUgfD0g R1VDX1NUQUdFX0RFU0NfQVRUUl9QUkVFTVBUOwo+PiDCoMKgwqDCoMKgIGRlc2MtPnN0YWdlX2lk ID0gY2xpZW50LT5zdGFnZV9pZDsKPj4gwqDCoMKgwqDCoCBkZXNjLT5wcmlvcml0eSA9IGNsaWVu dC0+cHJpb3JpdHk7Cj4+IC3CoMKgwqAgZGVzYy0+ZGJfaWQgPSBjbGllbnQtPmRvb3JiZWxsX2lk Owo+PiDCoMKgwqDCoMKgIC8qCj4+IC3CoMKgwqDCoCAqIFRoZSBkb29yYmVsbCwgcHJvY2VzcyBk ZXNjcmlwdG9yLCBhbmQgd29ya3F1ZXVlIGFyZSBhbGwgcGFydHMKPj4gLcKgwqDCoMKgICogb2Yg dGhlIGNsaWVudCBvYmplY3QsIHdoaWNoIHRoZSBHdUMgd2lsbCByZWZlcmVuY2UgdmlhIHRoZSBH R1RUCj4+ICvCoMKgwqDCoCAqIFRoZSBwcm9jZXNzIGRlc2NyaXB0b3IgYW5kIHdvcmtxdWV1ZSBh cmUgYWxsIHBhcnRzIG9mIHRoZSBjbGllbnQKPj4gK8KgwqDCoMKgICogb2JqZWN0LCB3aGljaCB0 aGUgR3VDIHdpbGwgcmVmZXJlbmNlIHZpYSB0aGUgR0dUVAo+PiDCoMKgwqDCoMKgwqAgKi8KPj4g wqDCoMKgwqDCoCBnZnhfYWRkciA9IGludGVsX2d1Y19nZ3R0X29mZnNldChndWMsIGNsaWVudC0+ dm1hKTsKPj4gLcKgwqDCoCBkZXNjLT5kYl90cmlnZ2VyX3BoeSA9IHNnX2RtYV9hZGRyZXNzKGNs aWVudC0+dm1hLT5wYWdlcy0+c2dsKSArCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgY2xpZW50LT5kb29yYmVsbF9vZmZzZXQ7Cj4+IC3CoMKgwqAgZGVzYy0+ZGJfdHJpZ2dlcl9j cHUgPSBwdHJfdG9fdTY0KF9fZ2V0X2Rvb3JiZWxsKGNsaWVudCkpOwo+PiAtwqDCoMKgIGRlc2Mt PmRiX3RyaWdnZXJfdWsgPSBnZnhfYWRkciArIGNsaWVudC0+ZG9vcmJlbGxfb2Zmc2V0Owo+PiAt wqDCoMKgIGRlc2MtPnByb2Nlc3NfZGVzYyA9IGdmeF9hZGRyICsgY2xpZW50LT5wcm9jX2Rlc2Nf b2Zmc2V0Owo+PiAtwqDCoMKgIGRlc2MtPndxX2FkZHIgPSBnZnhfYWRkciArIEdVQ19EQl9TSVpF Owo+PiArwqDCoMKgIGRlc2MtPnByb2Nlc3NfZGVzYyA9IGdmeF9hZGRyOwo+PiArwqDCoMKgIGRl c2MtPndxX2FkZHIgPSBnZnhfYWRkciArIEdVQ19QRF9TSVpFOwo+PiDCoMKgwqDCoMKgIGRlc2Mt PndxX3NpemUgPSBHVUNfV1FfU0laRTsKPj4gwqDCoMKgwqDCoCBkZXNjLT5kZXNjX3ByaXZhdGUg PSBwdHJfdG9fdTY0KGNsaWVudCk7Cj4+IEBAIC00MDgsNDggKzIxOSwyMyBAQCBzdGF0aWMgdm9p ZCBndWNfd3FfaXRlbV9hcHBlbmQoc3RydWN0IAo+PiBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQs Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEdVQ19XUV9TSVpFKSA8 IHdxaV9zaXplKTsKPj4gwqDCoMKgwqDCoCBHRU1fQlVHX09OKHdxX29mZiAmICh3cWlfc2l6ZSAt IDEpKTsKPj4gLcKgwqDCoCAvKiBXUSBzdGFydHMgZnJvbSB0aGUgcGFnZSBhZnRlciBkb29yYmVs bCAvIHByb2Nlc3NfZGVzYyAqLwo+PiAtwqDCoMKgIHdxaSA9IGNsaWVudC0+dmFkZHIgKyB3cV9v ZmYgKyBHVUNfREJfU0laRTsKPj4gLQo+PiAtwqDCoMKgIGlmIChJOTE1X1NFTEZURVNUX09OTFko Y2xpZW50LT51c2Vfbm9wX3dxaSkpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIHdxaS0+aGVhZGVyID0g V1FfVFlQRV9OT09QIHwgKHdxaV9sZW4gPDwgV1FfTEVOX1NISUZUKTsKPj4gLcKgwqDCoCB9IGVs c2Ugewo+PiAtwqDCoMKgwqDCoMKgwqAgLyogTm93IGZpbGwgaW4gdGhlIDQtd29yZCB3b3JrIHF1 ZXVlIGl0ZW0gKi8KPj4gLcKgwqDCoMKgwqDCoMKgIHdxaS0+aGVhZGVyID0gV1FfVFlQRV9JTk9S REVSIHwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHdxaV9sZW4gPDwg V1FfTEVOX1NISUZUKSB8Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh0 YXJnZXRfZW5naW5lIDw8IFdRX1RBUkdFVF9TSElGVCkgfAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBXUV9OT19XQ0ZMVVNIX1dBSVQ7Cj4+IC3CoMKgwqDCoMKgwqDCoCB3 cWktPmNvbnRleHRfZGVzYyA9IGNvbnRleHRfZGVzYzsKPj4gLcKgwqDCoMKgwqDCoMKgIHdxaS0+ c3VibWl0X2VsZW1lbnRfaW5mbyA9IHJpbmdfdGFpbCA8PCBXUV9SSU5HX1RBSUxfU0hJRlQ7Cj4+ IC3CoMKgwqDCoMKgwqDCoCBHRU1fQlVHX09OKHJpbmdfdGFpbCA+IFdRX1JJTkdfVEFJTF9NQVgp Owo+PiAtwqDCoMKgwqDCoMKgwqAgd3FpLT5mZW5jZV9pZCA9IGZlbmNlX2lkOwo+PiAtwqDCoMKg IH0KPj4gK8KgwqDCoCAvKiBXUSBzdGFydHMgZnJvbSB0aGUgcGFnZSBhZnRlciBwcm9jZXNzX2Rl c2MgKi8KPj4gK8KgwqDCoCB3cWkgPSBjbGllbnQtPnZhZGRyICsgd3Ffb2ZmICsgR1VDX1BEX1NJ WkU7Cj4+ICsKPj4gK8KgwqDCoCAvKiBOb3cgZmlsbCBpbiB0aGUgNC13b3JkIHdvcmsgcXVldWUg aXRlbSAqLwo+PiArwqDCoMKgIHdxaS0+aGVhZGVyID0gV1FfVFlQRV9JTk9SREVSIHwKPj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh3cWlfbGVuIDw8IFdRX0xFTl9TSElGVCkgfAo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKHRhcmdldF9lbmdpbmUgPDwgV1FfVEFSR0VUX1NI SUZUKSB8Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBXUV9OT19XQ0ZMVVNIX1dBSVQ7 Cj4+ICvCoMKgwqAgd3FpLT5jb250ZXh0X2Rlc2MgPSBjb250ZXh0X2Rlc2M7Cj4+ICvCoMKgwqAg d3FpLT5zdWJtaXRfZWxlbWVudF9pbmZvID0gcmluZ190YWlsIDw8IFdRX1JJTkdfVEFJTF9TSElG VDsKPj4gK8KgwqDCoCBHRU1fQlVHX09OKHJpbmdfdGFpbCA+IFdRX1JJTkdfVEFJTF9NQVgpOwo+ PiArwqDCoMKgIHdxaS0+ZmVuY2VfaWQgPSBmZW5jZV9pZDsKPj4gwqDCoMKgwqDCoCAvKiBNYWtl IHRoZSB1cGRhdGUgdmlzaWJsZSB0byBHdUMgKi8KPj4gwqDCoMKgwqDCoCBXUklURV9PTkNFKGRl c2MtPnRhaWwsICh3cV9vZmYgKyB3cWlfc2l6ZSkgJiAoR1VDX1dRX1NJWkUgLSAxKSk7Cj4+IMKg IH0KPj4gLXN0YXRpYyB2b2lkIGd1Y19yaW5nX2Rvb3JiZWxsKHN0cnVjdCBpbnRlbF9ndWNfY2xp ZW50ICpjbGllbnQpCj4+IC17Cj4+IC3CoMKgwqAgc3RydWN0IGd1Y19kb29yYmVsbF9pbmZvICpk YjsKPj4gLcKgwqDCoCB1MzIgY29va2llOwo+PiAtCj4+IC3CoMKgwqAgbG9ja2RlcF9hc3NlcnRf aGVsZCgmY2xpZW50LT53cV9sb2NrKTsKPj4gLQo+PiAtwqDCoMKgIC8qIHBvaW50ZXIgb2YgY3Vy cmVudCBkb29yYmVsbCBjYWNoZWxpbmUgKi8KPj4gLcKgwqDCoCBkYiA9IF9fZ2V0X2Rvb3JiZWxs KGNsaWVudCk7Cj4+IC0KPj4gLcKgwqDCoCAvKgo+PiAtwqDCoMKgwqAgKiBXZSdyZSBub3QgZXhw ZWN0aW5nIHRoZSBkb29yYmVsbCBjb29raWUgdG8gY2hhbmdlIGJlaGluZCBvdXIgCj4+IGJhY2ss Cj4+IC3CoMKgwqDCoCAqIHdlIGFsc28gbmVlZCB0byB0cmVhdCAwIGFzIGEgcmVzZXJ2ZWQgdmFs dWUuCj4+IC3CoMKgwqDCoCAqLwo+PiAtwqDCoMKgIGNvb2tpZSA9IFJFQURfT05DRShkYi0+Y29v a2llKTsKPj4gLcKgwqDCoCBXQVJOX09OX09OQ0UoeGNoZygmZGItPmNvb2tpZSwgY29va2llICsg MSA/OiBjb29raWUgKyAyKSAhPSBjb29raWUpOwo+PiAtCj4+IC3CoMKgwqAgLyogWFhYOiBkb29y YmVsbCB3YXMgbG9zdCBhbmQgbmVlZCB0byBhY3F1aXJlIGl0IGFnYWluICovCj4+IC3CoMKgwqAg R0VNX0JVR19PTihkYi0+ZGJfc3RhdHVzICE9IEdVQ19ET09SQkVMTF9FTkFCTEVEKTsKPj4gLX0K Pj4gLQo+PiDCoCBzdGF0aWMgdm9pZCBndWNfYWRkX3JlcXVlc3Qoc3RydWN0IGludGVsX2d1YyAq Z3VjLCBzdHJ1Y3QgCj4+IGk5MTVfcmVxdWVzdCAqcnEpCj4+IMKgIHsKPj4gwqDCoMKgwqDCoCBz dHJ1Y3QgaW50ZWxfZ3VjX2NsaWVudCAqY2xpZW50ID0gZ3VjLT5leGVjYnVmX2NsaWVudDsKPj4g QEAgLTQ1OSw3ICsyNDUsNiBAQCBzdGF0aWMgdm9pZCBndWNfYWRkX3JlcXVlc3Qoc3RydWN0IGlu dGVsX2d1YyAqZ3VjLCAKPj4gc3RydWN0IGk5MTVfcmVxdWVzdCAqcnEpCj4+IMKgwqDCoMKgwqAg Z3VjX3dxX2l0ZW1fYXBwZW5kKGNsaWVudCwgZW5naW5lLT5ndWNfaWQsIGN0eF9kZXNjLAo+PiDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByaW5nX3RhaWwsIHJxLT5mZW5jZS5zZXFu byk7Cj4+IC3CoMKgwqAgZ3VjX3JpbmdfZG9vcmJlbGwoY2xpZW50KTsKPj4gwqAgfQo+PiDCoCAv Kgo+PiBAQCAtNzQ0LDM2ICs1MjksNiBAQCBzdGF0aWMgdm9pZCBndWNfcmVzZXRfZmluaXNoKHN0 cnVjdCAKPj4gaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCj4+IMKgwqAgKiBwYXRoIG9mIGd1Y19z dWJtaXQoKSBhYm92ZS4KPj4gwqDCoCAqLwo+PiAtLyogQ2hlY2sgdGhhdCBhIGRvb3JiZWxsIHJl Z2lzdGVyIGlzIGluIHRoZSBleHBlY3RlZCBzdGF0ZSAqLwo+PiAtc3RhdGljIGJvb2wgZG9vcmJl bGxfb2soc3RydWN0IGludGVsX2d1YyAqZ3VjLCB1MTYgZGJfaWQpCj4+IC17Cj4+IC3CoMKgwqAg Ym9vbCB2YWxpZDsKPj4gLQo+PiAtwqDCoMKgIEdFTV9CVUdfT04oZGJfaWQgPj0gR1VDX05VTV9E T09SQkVMTFMpOwo+PiAtCj4+IC3CoMKgwqAgdmFsaWQgPSBfX2Rvb3JiZWxsX3ZhbGlkKGd1Yywg ZGJfaWQpOwo+PiAtCj4+IC3CoMKgwqAgaWYgKHRlc3RfYml0KGRiX2lkLCBndWMtPmRvb3JiZWxs X2JpdG1hcCkgPT0gdmFsaWQpCj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gdHJ1ZTsKPj4gLQo+ PiAtwqDCoMKgIERSTV9ERUJVR19EUklWRVIoIkRvb3JiZWxsICV1IGhhcyB1bmV4cGVjdGVkIHN0 YXRlOiB2YWxpZD0lc1xuIiwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBkYl9pZCwgeWVz bm8odmFsaWQpKTsKPj4gLQo+PiAtwqDCoMKgIHJldHVybiBmYWxzZTsKPj4gLX0KPj4gLQo+PiAt c3RhdGljIGJvb2wgZ3VjX3ZlcmlmeV9kb29yYmVsbHMoc3RydWN0IGludGVsX2d1YyAqZ3VjKQo+ PiAtewo+PiAtwqDCoMKgIGJvb2wgZG9vcmJlbGxzX29rID0gdHJ1ZTsKPj4gLcKgwqDCoCB1MTYg ZGJfaWQ7Cj4+IC0KPj4gLcKgwqDCoCBmb3IgKGRiX2lkID0gMDsgZGJfaWQgPCBHVUNfTlVNX0RP T1JCRUxMUzsgKytkYl9pZCkKPj4gLcKgwqDCoMKgwqDCoMKgIGlmICghZG9vcmJlbGxfb2soZ3Vj LCBkYl9pZCkpCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRvb3JiZWxsc19vayA9IGZhbHNl Owo+PiAtCj4+IC3CoMKgwqAgcmV0dXJuIGRvb3JiZWxsc19vazsKPj4gLX0KPj4gLQo+PiDCoCAv KioKPj4gwqDCoCAqIGd1Y19jbGllbnRfYWxsb2MoKSAtIEFsbG9jYXRlIGFuIGludGVsX2d1Y19j bGllbnQKPj4gwqDCoCAqIEBndWM6wqDCoMKgIHRoZSBpbnRlbF9ndWMgc3RydWN0dXJlCj4+IEBA IC03OTgsNyArNTUzLDYgQEAgZ3VjX2NsaWVudF9hbGxvYyhzdHJ1Y3QgaW50ZWxfZ3VjICpndWMs IHUzMiBwcmlvcml0eSkKPj4gwqDCoMKgwqDCoCBjbGllbnQtPmd1YyA9IGd1YzsKPj4gwqDCoMKg wqDCoCBjbGllbnQtPnByaW9yaXR5ID0gcHJpb3JpdHk7Cj4+IC3CoMKgwqAgY2xpZW50LT5kb29y YmVsbF9pZCA9IEdVQ19ET09SQkVMTF9JTlZBTElEOwo+PiDCoMKgwqDCoMKgIHNwaW5fbG9ja19p bml0KCZjbGllbnQtPndxX2xvY2spOwo+PiDCoMKgwqDCoMKgIHJldCA9IGlkYV9zaW1wbGVfZ2V0 KCZndWMtPnN0YWdlX2lkcywgMCwgR1VDX01BWF9TVEFHRV9ERVNDUklQVE9SUywKPj4gQEAgLTgw OSw3ICs1NjMsNyBAQCBndWNfY2xpZW50X2FsbG9jKHN0cnVjdCBpbnRlbF9ndWMgKmd1YywgdTMy IHByaW9yaXR5KQo+PiDCoMKgwqDCoMKgIGNsaWVudC0+c3RhZ2VfaWQgPSByZXQ7Cj4+IMKgwqDC oMKgwqAgLyogVGhlIGZpcnN0IHBhZ2UgaXMgZG9vcmJlbGwvcHJvY19kZXNjLiBUd28gZm9sbG93 ZWQgcGFnZXMgYXJlIAo+PiB3cS4gKi8KPiBOZWVkIHRvIHVwZGF0ZSB0aGlzIGNvbW1lbnQgYXMg d2VsbC4KPiAKCmFjawoKPj4gLcKgwqDCoCB2bWEgPSBpbnRlbF9ndWNfYWxsb2NhdGVfdm1hKGd1 YywgR1VDX0RCX1NJWkUgKyBHVUNfV1FfU0laRSk7Cj4+ICvCoMKgwqAgdm1hID0gaW50ZWxfZ3Vj X2FsbG9jYXRlX3ZtYShndWMsIEdVQ19QRF9TSVpFICsgR1VDX1dRX1NJWkUpOwo+PiDCoMKgwqDC oMKgIGlmIChJU19FUlIodm1hKSkgewo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gUFRSX0VS Uih2bWEpOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBlcnJfaWQ7Cj4+IEBAIC04MjUsMzEg KzU3OSwxMSBAQCBndWNfY2xpZW50X2FsbG9jKHN0cnVjdCBpbnRlbF9ndWMgKmd1YywgdTMyIAo+ PiBwcmlvcml0eSkKPj4gwqDCoMKgwqDCoCB9Cj4+IMKgwqDCoMKgwqAgY2xpZW50LT52YWRkciA9 IHZhZGRyOwo+PiAtwqDCoMKgIHJldCA9IHJlc2VydmVfZG9vcmJlbGwoY2xpZW50KTsKPj4gLcKg wqDCoCBpZiAocmV0KQo+PiAtwqDCoMKgwqDCoMKgwqAgZ290byBlcnJfdmFkZHI7Cj4+IC0KPj4g LcKgwqDCoCBjbGllbnQtPmRvb3JiZWxsX29mZnNldCA9IF9fc2VsZWN0X2NhY2hlbGluZShndWMp Owo+PiAtCj4+IC3CoMKgwqAgLyoKPj4gLcKgwqDCoMKgICogU2luY2UgdGhlIGRvb3JiZWxsIG9u bHkgcmVxdWlyZXMgYSBzaW5nbGUgY2FjaGVsaW5lLCB3ZSBjYW4gc2F2ZQo+PiAtwqDCoMKgwqAg KiBzcGFjZSBieSBwdXR0aW5nIHRoZSBhcHBsaWNhdGlvbiBwcm9jZXNzIGRlc2NyaXB0b3IgaW4g dGhlIHNhbWUKPj4gLcKgwqDCoMKgICogcGFnZS4gVXNlIHRoZSBoYWxmIG9mIHRoZSBwYWdlIHRo YXQgZG9lc24ndCBpbmNsdWRlIHRoZSBkb29yYmVsbC4KPj4gLcKgwqDCoMKgICovCj4+IC3CoMKg wqAgaWYgKGNsaWVudC0+ZG9vcmJlbGxfb2Zmc2V0ID49IChHVUNfREJfU0laRSAvIDIpKQo+PiAt wqDCoMKgwqDCoMKgwqAgY2xpZW50LT5wcm9jX2Rlc2Nfb2Zmc2V0ID0gMDsKPj4gLcKgwqDCoCBl bHNlCj4+IC3CoMKgwqDCoMKgwqDCoCBjbGllbnQtPnByb2NfZGVzY19vZmZzZXQgPSAoR1VDX0RC X1NJWkUgLyAyKTsKPj4gLQo+PiDCoMKgwqDCoMKgIERSTV9ERUJVR19EUklWRVIoIm5ldyBwcmlv cml0eSAldSBjbGllbnQgJXA6IHN0YWdlX2lkICV1XG4iLAo+PiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHByaW9yaXR5LCBjbGllbnQsIGNsaWVudC0+c3RhZ2VfaWQpOwo+PiAtwqDCoMKg IERSTV9ERUJVR19EUklWRVIoImRvb3JiZWxsIGlkICV1LCBjYWNoZWxpbmUgb2Zmc2V0IDB4JWx4 XG4iLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNsaWVudC0+ZG9vcmJlbGxfaWQsIGNs aWVudC0+ZG9vcmJlbGxfb2Zmc2V0KTsKPj4gwqDCoMKgwqDCoCByZXR1cm4gY2xpZW50Owo+PiAt ZXJyX3ZhZGRyOgo+PiAtwqDCoMKgIGk5MTVfZ2VtX29iamVjdF91bnBpbl9tYXAoY2xpZW50LT52 bWEtPm9iaik7Cj4+IMKgIGVycl92bWE6Cj4+IMKgwqDCoMKgwqAgaTkxNV92bWFfdW5waW5fYW5k X3JlbGVhc2UoJmNsaWVudC0+dm1hLCAwKTsKPj4gwqAgZXJyX2lkOgo+PiBAQCAtODYxLDcgKzU5 NSw2IEBAIGd1Y19jbGllbnRfYWxsb2Moc3RydWN0IGludGVsX2d1YyAqZ3VjLCB1MzIgcHJpb3Jp dHkpCj4+IMKgIHN0YXRpYyB2b2lkIGd1Y19jbGllbnRfZnJlZShzdHJ1Y3QgaW50ZWxfZ3VjX2Ns aWVudCAqY2xpZW50KQo+PiDCoCB7Cj4+IC3CoMKgwqAgdW5yZXNlcnZlX2Rvb3JiZWxsKGNsaWVu dCk7Cj4+IMKgwqDCoMKgwqAgaTkxNV92bWFfdW5waW5fYW5kX3JlbGVhc2UoJmNsaWVudC0+dm1h LCBJOTE1X1ZNQV9SRUxFQVNFX01BUCk7Cj4+IMKgwqDCoMKgwqAgaWRhX3NpbXBsZV9yZW1vdmUo JmNsaWVudC0+Z3VjLT5zdGFnZV9pZHMsIGNsaWVudC0+c3RhZ2VfaWQpOwo+PiDCoMKgwqDCoMKg IGtmcmVlKGNsaWVudCk7Cj4+IEBAIC04OTIsNDQgKzYyNSwyMSBAQCBzdGF0aWMgdm9pZCBndWNf Y2xpZW50c19kZXN0cm95KHN0cnVjdCBpbnRlbF9ndWMgCj4+ICpndWMpCj4+IMKgwqDCoMKgwqDC oMKgwqDCoCBndWNfY2xpZW50X2ZyZWUoY2xpZW50KTsKPj4gwqAgfQo+PiAtc3RhdGljIGludCBf X2d1Y19jbGllbnRfZW5hYmxlKHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQpCj4+ICtz dGF0aWMgdm9pZCBfX2d1Y19jbGllbnRfZW5hYmxlKHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpj bGllbnQpCj4+IMKgIHsKPj4gLcKgwqDCoCBpbnQgcmV0Owo+PiAtCj4+IMKgwqDCoMKgwqAgZ3Vj X3Byb2NfZGVzY19pbml0KGNsaWVudCk7Cj4+IMKgwqDCoMKgwqAgZ3VjX3N0YWdlX2Rlc2NfaW5p dChjbGllbnQpOwo+PiAtCj4+IC3CoMKgwqAgcmV0ID0gY3JlYXRlX2Rvb3JiZWxsKGNsaWVudCk7 Cj4+IC3CoMKgwqAgaWYgKHJldCkKPj4gLcKgwqDCoMKgwqDCoMKgIGdvdG8gZmFpbDsKPj4gLQo+ PiAtwqDCoMKgIHJldHVybiAwOwo+PiAtCj4+IC1mYWlsOgo+PiAtwqDCoMKgIGd1Y19zdGFnZV9k ZXNjX2ZpbmkoY2xpZW50KTsKPj4gLcKgwqDCoCBndWNfcHJvY19kZXNjX2ZpbmkoY2xpZW50KTsK Pj4gLcKgwqDCoCByZXR1cm4gcmV0Owo+PiDCoCB9Cj4+IMKgIHN0YXRpYyB2b2lkIF9fZ3VjX2Ns aWVudF9kaXNhYmxlKHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQpCj4+IMKgIHsKPj4g LcKgwqDCoCAvKgo+PiAtwqDCoMKgwqAgKiBCeSB0aGUgdGltZSB3ZSdyZSBoZXJlLCBHdUMgbWF5 IGhhdmUgYWxyZWFkeSBiZWVuIHJlc2V0LiBpZiAKPj4gdGhhdCBpcwo+PiAtwqDCoMKgwqAgKiB0 aGUgY2FzZSwgaW5zdGVhZCBvZiB0cnlpbmcgKGluIHZhaW4pIHRvIGNvbW11bmljYXRlIHdpdGgg aXQsIAo+PiBsZXQncwo+PiAtwqDCoMKgwqAgKiBqdXN0IGNsZWFudXAgdGhlIGRvb3JiZWxsIEhX IGFuZCBvdXIgaW50ZXJuYWwgc3RhdGUuCj4+IC3CoMKgwqDCoCAqLwo+IFRoaXMgY29tbWVudCBz aG91bGQgYmUga2VwdCwgb25seSBkcm9wcGluZyB0aGUgJ2Rvb3JlbGwgSFcgYW5kJyBwaHJhc2U/ Cj4gCgpJJ3ZlIHVwZGF0ZWQgdG8gbGVhdmUgYSBub3RlIHRoYXQgR3VDIG1pZ2h0J3ZlIGFscmVh ZHkgYmVlbiByZXNldC4KCj4+IC3CoMKgwqAgaWYgKGludGVsX2d1Y19pc19ydW5uaW5nKGNsaWVu dC0+Z3VjKSkKPj4gLcKgwqDCoMKgwqDCoMKgIGRlc3Ryb3lfZG9vcmJlbGwoY2xpZW50KTsKPj4g LcKgwqDCoCBlbHNlCj4+IC3CoMKgwqDCoMKgwqDCoCBfX2ZpbmlfZG9vcmJlbGwoY2xpZW50KTsK Pj4gLQo+PiDCoMKgwqDCoMKgIGd1Y19zdGFnZV9kZXNjX2ZpbmkoY2xpZW50KTsKPj4gwqDCoMKg wqDCoCBndWNfcHJvY19kZXNjX2ZpbmkoY2xpZW50KTsKPj4gwqAgfQo+PiAtc3RhdGljIGludCBn dWNfY2xpZW50c19lbmFibGUoc3RydWN0IGludGVsX2d1YyAqZ3VjKQo+PiArc3RhdGljIHZvaWQg Z3VjX2NsaWVudHNfZW5hYmxlKHN0cnVjdCBpbnRlbF9ndWMgKmd1YykKPj4gwqAgewo+PiAtwqDC oMKgIHJldHVybiBfX2d1Y19jbGllbnRfZW5hYmxlKGd1Yy0+ZXhlY2J1Zl9jbGllbnQpOwo+PiAr wqDCoMKgIF9fZ3VjX2NsaWVudF9lbmFibGUoZ3VjLT5leGVjYnVmX2NsaWVudCk7Cj4+IMKgIH0K PiBUaGlzIHNlZW1zIGxpa2UgYSBwcmV0dHkgcG9pbnRsZXNzIHdyYXBwZXIuIEknbSBndWVzc2lu ZyB0aGVyZSB3YXMgYSAKPiBtdXRleCBsb2NrIG9yIHNvbWV0aGluZyBpbiBoZXJlIG9yaWdpbmFs bHk/IE1heWJlIHRpbWUgdG8gZHJvcCB0aGUgJ19fJyAKPiB2ZXJzaW9uIGFuZCBqdXN0IG1vdmUg dGhlIGFjdHVhbCB3b3JrIGludG8gdGhpcyBmdW5jdGlvbj8KPiAKClRoaXMgZ29lcyBhd2F5IGlu IHRoZSBuZXh0IHBhdGNoLCB0b2dldGhlciB3aXRoIHRoZSByZXN0IG9mIHRoZSBjbGllbnQgCnN0 dWZmLgoKRGFuaWVsZQoKPiBPdGhlcndpc2UsIGxvb2tzIGdvb2QgdG8gbWUuIFNvIHdpdGggc29t ZSBjb3JyZWN0ZWQgY29tbWVudHM6Cj4gUmV2aWV3ZWQtYnk6IEpvaG4gSGFycmlzb24gPEpvaG4u Qy5IYXJyaXNvbkBJbnRlbC5jb20+Cj4gCj4+IMKgIHN0YXRpYyB2b2lkIGd1Y19jbGllbnRzX2Rp c2FibGUoc3RydWN0IGludGVsX2d1YyAqZ3VjKQo+PiBAQCAtOTU4LDcgKzY2OCw2IEBAIGludCBp bnRlbF9ndWNfc3VibWlzc2lvbl9pbml0KHN0cnVjdCBpbnRlbF9ndWMgKmd1YykKPj4gwqDCoMKg wqDCoMKgICovCj4+IMKgwqDCoMKgwqAgR0VNX0JVR19PTighZ3VjLT5zdGFnZV9kZXNjX3Bvb2wp Owo+PiAtwqDCoMKgIFdBUk5fT04oIWd1Y192ZXJpZnlfZG9vcmJlbGxzKGd1YykpOwo+PiDCoMKg wqDCoMKgIHJldCA9IGd1Y19jbGllbnRzX2NyZWF0ZShndWMpOwo+PiDCoMKgwqDCoMKgIGlmIChy ZXQpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIGVycl9wb29sOwo+PiBAQCAtOTczLDcgKzY4 Miw2IEBAIGludCBpbnRlbF9ndWNfc3VibWlzc2lvbl9pbml0KHN0cnVjdCBpbnRlbF9ndWMgKmd1 YykKPj4gwqAgdm9pZCBpbnRlbF9ndWNfc3VibWlzc2lvbl9maW5pKHN0cnVjdCBpbnRlbF9ndWMg Kmd1YykKPj4gwqAgewo+PiDCoMKgwqDCoMKgIGd1Y19jbGllbnRzX2Rlc3Ryb3koZ3VjKTsKPj4g LcKgwqDCoCBXQVJOX09OKCFndWNfdmVyaWZ5X2Rvb3JiZWxscyhndWMpKTsKPj4gwqDCoMKgwqDC oCBpZiAoZ3VjLT5zdGFnZV9kZXNjX3Bvb2wpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBndWNfc3Rh Z2VfZGVzY19wb29sX2Rlc3Ryb3koZ3VjKTsKPj4gQEAgLTEwODksMTYgKzc5NywxMSBAQCBzdGF0 aWMgdm9pZCBndWNfc2V0X2RlZmF1bHRfc3VibWlzc2lvbihzdHJ1Y3QgCj4+IGludGVsX2VuZ2lu ZV9jcyAqZW5naW5lKQo+PiDCoMKgwqDCoMKgIEdFTV9CVUdfT04oZW5naW5lLT5pcnFfZW5hYmxl IHx8IGVuZ2luZS0+aXJxX2Rpc2FibGUpOwo+PiDCoCB9Cj4+IC1pbnQgaW50ZWxfZ3VjX3N1Ym1p c3Npb25fZW5hYmxlKHN0cnVjdCBpbnRlbF9ndWMgKmd1YykKPj4gK3ZvaWQgaW50ZWxfZ3VjX3N1 Ym1pc3Npb25fZW5hYmxlKHN0cnVjdCBpbnRlbF9ndWMgKmd1YykKPj4gwqAgewo+PiDCoMKgwqDC oMKgIHN0cnVjdCBpbnRlbF9ndCAqZ3QgPSBndWNfdG9fZ3QoZ3VjKTsKPj4gwqDCoMKgwqDCoCBz dHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmU7Cj4+IMKgwqDCoMKgwqAgZW51bSBpbnRlbF9l bmdpbmVfaWQgaWQ7Cj4+IC3CoMKgwqAgaW50IGVycjsKPj4gLQo+PiAtwqDCoMKgIGVyciA9IGk5 MTVfaW5qZWN0X3Byb2JlX2Vycm9yKGd0LT5pOTE1LCAtRU5YSU8pOwo+PiAtwqDCoMKgIGlmIChl cnIpCj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gZXJyOwo+PiDCoMKgwqDCoMKgIC8qCj4+IMKg wqDCoMKgwqDCoCAqIFdlJ3JlIHVzaW5nIEd1QyB3b3JrIGl0ZW1zIGZvciBzdWJtaXR0aW5nIHdv cmsgdGhyb3VnaCBHdUMuIAo+PiBTaW5jZQo+PiBAQCAtMTExNSw5ICs4MTgsNyBAQCBpbnQgaW50 ZWxfZ3VjX3N1Ym1pc3Npb25fZW5hYmxlKHN0cnVjdCBpbnRlbF9ndWMgCj4+ICpndWMpCj4+IMKg wqDCoMKgwqAgR0VNX0JVR19PTighZ3VjLT5leGVjYnVmX2NsaWVudCk7Cj4+IC3CoMKgwqAgZXJy ID0gZ3VjX2NsaWVudHNfZW5hYmxlKGd1Yyk7Cj4+IC3CoMKgwqAgaWYgKGVycikKPj4gLcKgwqDC oMKgwqDCoMKgIHJldHVybiBlcnI7Cj4+ICvCoMKgwqAgZ3VjX2NsaWVudHNfZW5hYmxlKGd1Yyk7 Cj4+IMKgwqDCoMKgwqAgLyogVGFrZSBvdmVyIGZyb20gbWFudWFsIGNvbnRyb2wgb2YgRUxTUCAo ZXhlY2xpc3RzKSAqLwo+PiDCoMKgwqDCoMKgIGd1Y19pbnRlcnJ1cHRzX2NhcHR1cmUoZ3QpOwo+ PiBAQCAtMTEyNiw4ICs4MjcsNiBAQCBpbnQgaW50ZWxfZ3VjX3N1Ym1pc3Npb25fZW5hYmxlKHN0 cnVjdCBpbnRlbF9ndWMgCj4+ICpndWMpCj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBlbmdpbmUtPnNl dF9kZWZhdWx0X3N1Ym1pc3Npb24gPSBndWNfc2V0X2RlZmF1bHRfc3VibWlzc2lvbjsKPj4gwqDC oMKgwqDCoMKgwqDCoMKgIGVuZ2luZS0+c2V0X2RlZmF1bHRfc3VibWlzc2lvbihlbmdpbmUpOwo+ PiDCoMKgwqDCoMKgIH0KPj4gLQo+PiAtwqDCoMKgIHJldHVybiAwOwo+PiDCoCB9Cj4+IMKgIHZv aWQgaW50ZWxfZ3VjX3N1Ym1pc3Npb25fZGlzYWJsZShzdHJ1Y3QgaW50ZWxfZ3VjICpndWMpCj4+ IEBAIC0xMTU1LDcgKzg1NCwzIEBAIHZvaWQgaW50ZWxfZ3VjX3N1Ym1pc3Npb25faW5pdF9lYXJs eShzdHJ1Y3QgCj4+IGludGVsX2d1YyAqZ3VjKQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAgZ3VjLT5z dWJtaXNzaW9uX3N1cHBvcnRlZCA9IF9fZ3VjX3N1Ym1pc3Npb25fc3VwcG9ydChndWMpOwo+PiDC oCB9Cj4+IC0KPj4gLSNpZiBJU19FTkFCTEVEKENPTkZJR19EUk1fSTkxNV9TRUxGVEVTVCkKPj4g LSNpbmNsdWRlICJzZWxmdGVzdF9ndWMuYyIKPj4gLSNlbmRpZgo+PiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfZ3VjX3N1Ym1pc3Npb24uaCAKPj4gYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF9ndWNfc3VibWlzc2lvbi5oCj4+IGluZGV4IDU0 ZDcxNjgyODM1Mi4uZTJkZWI0ZTZmNDJhIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0v aTkxNS9ndC91Yy9pbnRlbF9ndWNfc3VibWlzc2lvbi5oCj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2d0L3VjL2ludGVsX2d1Y19zdWJtaXNzaW9uLmgKPj4gQEAgLTQ0LDIxICs0NCwxNCBA QCBzdHJ1Y3QgaW50ZWxfZ3VjX2NsaWVudCB7Cj4+IMKgwqDCoMKgwqAgLyogYml0bWFwIG9mICho b3N0KSBlbmdpbmUgaWRzICovCj4+IMKgwqDCoMKgwqAgdTMyIHByaW9yaXR5Owo+PiDCoMKgwqDC oMKgIHUzMiBzdGFnZV9pZDsKPj4gLcKgwqDCoCB1MzIgcHJvY19kZXNjX29mZnNldDsKPj4gLQo+ PiAtwqDCoMKgIHUxNiBkb29yYmVsbF9pZDsKPj4gLcKgwqDCoCB1bnNpZ25lZCBsb25nIGRvb3Ji ZWxsX29mZnNldDsKPj4gwqDCoMKgwqDCoCAvKiBQcm90ZWN0cyBHdUMgY2xpZW50J3MgV1EgYWNj ZXNzICovCj4+IMKgwqDCoMKgwqAgc3BpbmxvY2tfdCB3cV9sb2NrOwo+PiAtCj4+IC3CoMKgwqAg LyogRm9yIHRlc3RpbmcgcHVycG9zZXMsIHVzZSBub3AgV1EgaXRlbXMgaW5zdGVhZCBvZiByZWFs IG9uZXMgKi8KPj4gLcKgwqDCoCBJOTE1X1NFTEZURVNUX0RFQ0xBUkUoYm9vbCB1c2Vfbm9wX3dx aSk7Cj4+IMKgIH07Cj4+IMKgIHZvaWQgaW50ZWxfZ3VjX3N1Ym1pc3Npb25faW5pdF9lYXJseShz dHJ1Y3QgaW50ZWxfZ3VjICpndWMpOwo+PiDCoCBpbnQgaW50ZWxfZ3VjX3N1Ym1pc3Npb25faW5p dChzdHJ1Y3QgaW50ZWxfZ3VjICpndWMpOwo+PiAtaW50IGludGVsX2d1Y19zdWJtaXNzaW9uX2Vu YWJsZShzdHJ1Y3QgaW50ZWxfZ3VjICpndWMpOwo+PiArdm9pZCBpbnRlbF9ndWNfc3VibWlzc2lv bl9lbmFibGUoc3RydWN0IGludGVsX2d1YyAqZ3VjKTsKPj4gwqAgdm9pZCBpbnRlbF9ndWNfc3Vi bWlzc2lvbl9kaXNhYmxlKHN0cnVjdCBpbnRlbF9ndWMgKmd1Yyk7Cj4+IMKgIHZvaWQgaW50ZWxf Z3VjX3N1Ym1pc3Npb25fZmluaShzdHJ1Y3QgaW50ZWxfZ3VjICpndWMpOwo+PiDCoCBpbnQgaW50 ZWxfZ3VjX3ByZWVtcHRfd29ya19jcmVhdGUoc3RydWN0IGludGVsX2d1YyAqZ3VjKTsKPj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL2ludGVsX3VjLmMgCj4+IGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMvaW50ZWxfdWMuYwo+PiBpbmRleCA2MjliMTkzNzdhMjku LmM2NTE5MDY2YTBmNiAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvdWMv aW50ZWxfdWMuYwo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC91Yy9pbnRlbF91Yy5j Cj4+IEBAIC00ODYsMTEgKzQ4Niw4IEBAIGludCBpbnRlbF91Y19pbml0X2h3KHN0cnVjdCBpbnRl bF91YyAqdWMpCj4+IMKgwqDCoMKgwqAgaWYgKHJldCkKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGdv dG8gZXJyX2NvbW11bmljYXRpb247Cj4+IC3CoMKgwqAgaWYgKGludGVsX3VjX3N1cHBvcnRzX2d1 Y19zdWJtaXNzaW9uKHVjKSkgewo+PiAtwqDCoMKgwqDCoMKgwqAgcmV0ID0gaW50ZWxfZ3VjX3N1 Ym1pc3Npb25fZW5hYmxlKGd1Yyk7Cj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAocmV0KQo+PiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIGVycl9jb21tdW5pY2F0aW9uOwo+PiAtwqDCoMKgIH0K Pj4gK8KgwqDCoCBpZiAoaW50ZWxfdWNfc3VwcG9ydHNfZ3VjX3N1Ym1pc3Npb24odWMpKQo+PiAr wqDCoMKgwqDCoMKgwqAgaW50ZWxfZ3VjX3N1Ym1pc3Npb25fZW5hYmxlKGd1Yyk7Cj4+IMKgwqDC oMKgwqAgZGV2X2luZm8oaTkxNS0+ZHJtLmRldiwgIiVzIGZpcm13YXJlICVzIHZlcnNpb24gJXUu JXUgJXM6JXNcbiIsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgIGludGVsX3VjX2Z3X3R5cGVfcmVw cihJTlRFTF9VQ19GV19UWVBFX0dVQyksIGd1Yy0+ZncucGF0aCwKPj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2d0L3VjL3NlbGZ0ZXN0X2d1Yy5jIAo+PiBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2d0L3VjL3NlbGZ0ZXN0X2d1Yy5jCj4+IGRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0 NAo+PiBpbmRleCBkOGE4MDM4OGJkMzEuLjAwMDAwMDAwMDAwMAo+PiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9ndC91Yy9zZWxmdGVzdF9ndWMuYwo+PiArKysgL2Rldi9udWxsCj4+IEBAIC0x LDI5OSArMCwwIEBACj4+IC0vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCj4+IC0vKgo+ PiAtICogQ29weXJpZ2h0IMKpIDIwMTcgSW50ZWwgQ29ycG9yYXRpb24KPj4gLSAqLwo+PiAtCj4+ IC0jaW5jbHVkZSAiaTkxNV9zZWxmdGVzdC5oIgo+PiAtI2luY2x1ZGUgImdlbS9pOTE1X2dlbV9w bS5oIgo+PiAtCj4+IC0vKiBtYXggZG9vcmJlbGwgbnVtYmVyICsgbmVnYXRpdmUgdGVzdCBmb3Ig ZWFjaCBjbGllbnQgdHlwZSAqLwo+PiAtI2RlZmluZSBBVFRFTVBUUyAoR1VDX05VTV9ET09SQkVM TFMgKyBHVUNfQ0xJRU5UX1BSSU9SSVRZX05VTSkKPj4gLQo+PiAtc3RhdGljIHN0cnVjdCBpbnRl bF9ndWNfY2xpZW50ICpjbGllbnRzW0FUVEVNUFRTXTsKPj4gLQo+PiAtc3RhdGljIGJvb2wgYXZh aWxhYmxlX2RicyhzdHJ1Y3QgaW50ZWxfZ3VjICpndWMsIHUzMiBwcmlvcml0eSkKPj4gLXsKPj4g LcKgwqDCoCB1bnNpZ25lZCBsb25nIG9mZnNldDsKPj4gLcKgwqDCoCB1bnNpZ25lZCBsb25nIGVu ZDsKPj4gLcKgwqDCoCB1MTYgaWQ7Cj4+IC0KPj4gLcKgwqDCoCAvKiBmaXJzdCBoYWxmIGlzIHVz ZWQgZm9yIG5vcm1hbCBwcmlvcml0eSwgc2Vjb25kIGhhbGYgZm9yIGhpZ2ggKi8KPj4gLcKgwqDC oCBvZmZzZXQgPSAwOwo+PiAtwqDCoMKgIGVuZCA9IEdVQ19OVU1fRE9PUkJFTExTIC8gMjsKPj4g LcKgwqDCoCBpZiAocHJpb3JpdHkgPD0gR1VDX0NMSUVOVF9QUklPUklUWV9ISUdIKSB7Cj4+IC3C oMKgwqDCoMKgwqDCoCBvZmZzZXQgPSBlbmQ7Cj4+IC3CoMKgwqDCoMKgwqDCoCBlbmQgKz0gb2Zm c2V0Owo+PiAtwqDCoMKgIH0KPj4gLQo+PiAtwqDCoMKgIGlkID0gZmluZF9uZXh0X3plcm9fYml0 KGd1Yy0+ZG9vcmJlbGxfYml0bWFwLCBlbmQsIG9mZnNldCk7Cj4+IC3CoMKgwqAgaWYgKGlkIDwg ZW5kKQo+PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHRydWU7Cj4+IC0KPj4gLcKgwqDCoCByZXR1 cm4gZmFsc2U7Cj4+IC19Cj4+IC0KPj4gLXN0YXRpYyBpbnQgY2hlY2tfYWxsX2Rvb3JiZWxscyhz dHJ1Y3QgaW50ZWxfZ3VjICpndWMpCj4+IC17Cj4+IC3CoMKgwqAgdTE2IGRiX2lkOwo+PiAtCj4+ IC3CoMKgwqAgcHJfaW5mb19vbmNlKCJNYXggbnVtYmVyIG9mIGRvb3JiZWxsczogJWQiLCBHVUNf TlVNX0RPT1JCRUxMUyk7Cj4+IC3CoMKgwqAgZm9yIChkYl9pZCA9IDA7IGRiX2lkIDwgR1VDX05V TV9ET09SQkVMTFM7ICsrZGJfaWQpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIGlmICghZG9vcmJlbGxf b2soZ3VjLCBkYl9pZCkpIHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJkb29y YmVsbCAlZCwgbm90IG9rXG4iLCBkYl9pZCk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJl dHVybiAtRUlPOwo+PiAtwqDCoMKgwqDCoMKgwqAgfQo+PiAtwqDCoMKgIH0KPj4gLQo+PiAtwqDC oMKgIHJldHVybiAwOwo+PiAtfQo+PiAtCj4+IC1zdGF0aWMgaW50IHJpbmdfZG9vcmJlbGxfbm9w KHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQpCj4+IC17Cj4+IC3CoMKgwqAgc3RydWN0 IGd1Y19wcm9jZXNzX2Rlc2MgKmRlc2MgPSBfX2dldF9wcm9jZXNzX2Rlc2MoY2xpZW50KTsKPj4g LcKgwqDCoCBpbnQgZXJyOwo+PiAtCj4+IC3CoMKgwqAgY2xpZW50LT51c2Vfbm9wX3dxaSA9IHRy dWU7Cj4+IC0KPj4gLcKgwqDCoCBzcGluX2xvY2tfaXJxKCZjbGllbnQtPndxX2xvY2spOwo+PiAt Cj4+IC3CoMKgwqAgZ3VjX3dxX2l0ZW1fYXBwZW5kKGNsaWVudCwgMCwgMCwgMCwgMCk7Cj4+IC3C oMKgwqAgZ3VjX3JpbmdfZG9vcmJlbGwoY2xpZW50KTsKPj4gLQo+PiAtwqDCoMKgIHNwaW5fdW5s b2NrX2lycSgmY2xpZW50LT53cV9sb2NrKTsKPj4gLQo+PiAtwqDCoMKgIGNsaWVudC0+dXNlX25v cF93cWkgPSBmYWxzZTsKPj4gLQo+PiAtwqDCoMKgIC8qIGlmIHRoZXJlIGFyZSBubyBpc3N1ZXMg R3VDIHdpbGwgdXBkYXRlIHRoZSBXUSBoZWFkIGFuZCBrZWVwIHRoZQo+PiAtwqDCoMKgwqAgKiBX USBpbiBhY3RpdmUgc3RhdHVzCj4+IC3CoMKgwqDCoCAqLwo+PiAtwqDCoMKgIGVyciA9IHdhaXRf Zm9yKFJFQURfT05DRShkZXNjLT5oZWFkKSA9PSBSRUFEX09OQ0UoZGVzYy0+dGFpbCksIDEwKTsK Pj4gLcKgwqDCoCBpZiAoZXJyKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCBwcl9lcnIoImRvb3JiZWxs ICV1IHJpbmcgZmFpbGVkIVxuIiwgY2xpZW50LT5kb29yYmVsbF9pZCk7Cj4+IC3CoMKgwqDCoMKg wqDCoCByZXR1cm4gLUVJTzsKPj4gLcKgwqDCoCB9Cj4+IC0KPj4gLcKgwqDCoCBpZiAoZGVzYy0+ d3Ffc3RhdHVzICE9IFdRX1NUQVRVU19BQ1RJVkUpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIHByX2Vy cigiZG9vcmJlbGwgJXUgcmluZyBwdXQgV1EgaW4gYmFkIHN0YXRlICgldSkhXG4iLAo+PiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjbGllbnQtPmRvb3JiZWxsX2lkLCBkZXNjLT53cV9z dGF0dXMpOwo+PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU87Cj4+IC3CoMKgwqAgfQo+PiAt Cj4+IC3CoMKgwqAgcmV0dXJuIDA7Cj4+IC19Cj4+IC0KPj4gLS8qCj4+IC0gKiBCYXNpYyBjbGll bnQgc2FuaXR5IGNoZWNrLCBoYW5keSB0byB2YWxpZGF0ZSBjcmVhdGVfY2xpZW50cy4KPj4gLSAq Lwo+PiAtc3RhdGljIGludCB2YWxpZGF0ZV9jbGllbnQoc3RydWN0IGludGVsX2d1Y19jbGllbnQg KmNsaWVudCwgaW50IAo+PiBjbGllbnRfcHJpb3JpdHkpCj4+IC17Cj4+IC3CoMKgwqAgaWYgKGNs aWVudC0+cHJpb3JpdHkgIT0gY2xpZW50X3ByaW9yaXR5IHx8Cj4+IC3CoMKgwqDCoMKgwqDCoCBj bGllbnQtPmRvb3JiZWxsX2lkID09IEdVQ19ET09SQkVMTF9JTlZBTElEKQo+PiAtwqDCoMKgwqDC oMKgwqAgcmV0dXJuIC1FSU5WQUw7Cj4+IC3CoMKgwqAgZWxzZQo+PiAtwqDCoMKgwqDCoMKgwqAg cmV0dXJuIDA7Cj4+IC19Cj4+IC0KPj4gLXN0YXRpYyBib29sIGNsaWVudF9kb29yYmVsbF9pbl9z eW5jKHN0cnVjdCBpbnRlbF9ndWNfY2xpZW50ICpjbGllbnQpCj4+IC17Cj4+IC3CoMKgwqAgcmV0 dXJuICFjbGllbnQgfHwgZG9vcmJlbGxfb2soY2xpZW50LT5ndWMsIGNsaWVudC0+ZG9vcmJlbGxf aWQpOwo+PiAtfQo+PiAtCj4+IC0vKgo+PiAtICogQ2hlY2sgdGhhdCB3ZSdyZSBhYmxlIHRvIHN5 bmNocm9uaXplIGd1Y19jbGllbnRzIHdpdGggdGhlaXIgZG9vcmJlbGxzCj4+IC0gKgo+PiAtICog V2UncmUgY3JlYXRpbmcgY2xpZW50cyBhbmQgcmVzZXJ2aW5nIGRvb3JiZWxscyBvbmNlLCBhdCBt b2R1bGUgCj4+IGxvYWQuIER1cmluZwo+PiAtICogbW9kdWxlIGxpZmV0aW1lLCBHdUMsIGRvb3Ji ZWxsIEhXLCBhbmQgaTkxNSBzdGF0ZSBtYXkgZ28gb3V0IG9mIAo+PiBzeW5jIGR1ZSB0bwo+PiAt ICogR3VDIGJlaW5nIHJlc2V0LiBJbiBvdGhlciB3b3JkcyAtIEd1QyBjbGllbnRzIGFyZSBzdGls bCBhcm91bmQsIAo+PiBidXQgdGhlCj4+IC0gKiBzdGF0dXMgb2YgdGhlaXIgZG9vcmJlbGxzIG1h eSBiZSBpbmNvcnJlY3QuIFRoaXMgaXMgdGhlIHJlYXNvbiBiZWhpbmQKPj4gLSAqIHZhbGlkYXRp bmcgdGhhdCB0aGUgZG9vcmJlbGxzIHN0YXR1cyBleHBlY3RlZCBieSB0aGUgZHJpdmVyIAo+PiBt YXRjaGVzIHdoYXQgdGhlCj4+IC0gKiBHdUMvSFcgaGF2ZS4KPj4gLSAqLwo+PiAtc3RhdGljIGlu dCBpZ3RfZ3VjX2NsaWVudHModm9pZCAqYXJnKQo+PiAtewo+PiAtwqDCoMKgIHN0cnVjdCBpbnRl bF9ndCAqZ3QgPSBhcmc7Cj4+IC3CoMKgwqAgc3RydWN0IGludGVsX2d1YyAqZ3VjID0gJmd0LT51 Yy5ndWM7Cj4+IC3CoMKgwqAgaW50ZWxfd2FrZXJlZl90IHdha2VyZWY7Cj4+IC3CoMKgwqAgaW50 IGVyciA9IDA7Cj4+IC0KPj4gLcKgwqDCoCBHRU1fQlVHX09OKCFIQVNfR1RfVUMoZ3QtPmk5MTUp KTsKPj4gLcKgwqDCoCB3YWtlcmVmID0gaW50ZWxfcnVudGltZV9wbV9nZXQoZ3QtPnVuY29yZS0+ cnBtKTsKPj4gLQo+PiAtwqDCoMKgIGVyciA9IGNoZWNrX2FsbF9kb29yYmVsbHMoZ3VjKTsKPj4g LcKgwqDCoCBpZiAoZXJyKQo+PiAtwqDCoMKgwqDCoMKgwqAgZ290byB1bmxvY2s7Cj4+IC0KPj4g LcKgwqDCoCAvKgo+PiAtwqDCoMKgwqAgKiBHZXQgcmlkIG9mIGNsaWVudHMgY3JlYXRlZCBkdXJp bmcgZHJpdmVyIGxvYWQgYmVjYXVzZSB0aGUgdGVzdCAKPj4gd2lsbAo+PiAtwqDCoMKgwqAgKiBy ZWNyZWF0ZSB0aGVtLgo+PiAtwqDCoMKgwqAgKi8KPj4gLcKgwqDCoCBndWNfY2xpZW50c19kaXNh YmxlKGd1Yyk7Cj4+IC3CoMKgwqAgZ3VjX2NsaWVudHNfZGVzdHJveShndWMpOwo+PiAtwqDCoMKg IGlmIChndWMtPmV4ZWNidWZfY2xpZW50KSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCBwcl9lcnIoImd1 Y19jbGllbnRzX2Rlc3Ryb3kgbGllZCFcbiIpOwo+PiAtwqDCoMKgwqDCoMKgwqAgZXJyID0gLUVJ TlZBTDsKPj4gLcKgwqDCoMKgwqDCoMKgIGdvdG8gdW5sb2NrOwo+PiAtwqDCoMKgIH0KPj4gLQo+ PiAtwqDCoMKgIGVyciA9IGd1Y19jbGllbnRzX2NyZWF0ZShndWMpOwo+PiAtwqDCoMKgIGlmIChl cnIpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIHByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnRz XG4iKTsKPj4gLcKgwqDCoMKgwqDCoMKgIGdvdG8gdW5sb2NrOwo+PiAtwqDCoMKgIH0KPj4gLcKg wqDCoCBHRU1fQlVHX09OKCFndWMtPmV4ZWNidWZfY2xpZW50KTsKPj4gLQo+PiAtwqDCoMKgIGVy ciA9IHZhbGlkYXRlX2NsaWVudChndWMtPmV4ZWNidWZfY2xpZW50LAo+PiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBHVUNfQ0xJRU5UX1BSSU9SSVRZX0tNRF9OT1JNQUwpOwo+ PiAtwqDCoMKgIGlmIChlcnIpIHsKPj4gLcKgwqDCoMKgwqDCoMKgIHByX2VycigiZXhlY2J1ZyBj bGllbnQgdmFsaWRhdGlvbiBmYWlsZWRcbiIpOwo+PiAtwqDCoMKgwqDCoMKgwqAgZ290byBvdXQ7 Cj4+IC3CoMKgwqAgfQo+PiAtCj4+IC3CoMKgwqAgLyogdGhlIGNsaWVudCBzaG91bGQgbm93IGhh dmUgcmVzZXJ2ZWQgYSBkb29yYmVsbCAqLwo+PiAtwqDCoMKgIGlmICghaGFzX2Rvb3JiZWxsKGd1 Yy0+ZXhlY2J1Zl9jbGllbnQpKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoCBwcl9lcnIoImd1Y19jbGll bnRzX2NyZWF0ZSBkaWRuJ3QgcmVzZXJ2ZSBkb29yYmVsbHNcbiIpOwo+PiAtwqDCoMKgwqDCoMKg wqAgZXJyID0gLUVJTlZBTDsKPj4gLcKgwqDCoMKgwqDCoMKgIGdvdG8gb3V0Owo+PiAtwqDCoMKg IH0KPj4gLQo+PiAtwqDCoMKgIC8qIE5vdyBlbmFibGUgdGhlIGNsaWVudHMgKi8KPj4gLcKgwqDC oCBndWNfY2xpZW50c19lbmFibGUoZ3VjKTsKPj4gLQo+PiAtwqDCoMKgIC8qIGVhY2ggY2xpZW50 IHNob3VsZCBub3cgaGF2ZSByZWNlaXZlZCBhIGRvb3JiZWxsICovCj4+IC3CoMKgwqAgaWYgKCFj bGllbnRfZG9vcmJlbGxfaW5fc3luYyhndWMtPmV4ZWNidWZfY2xpZW50KSkgewo+PiAtwqDCoMKg wqDCoMKgwqAgcHJfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZG9vcmJlbGxzXG4iKTsK Pj4gLcKgwqDCoMKgwqDCoMKgIGVyciA9IC1FSU5WQUw7Cj4+IC3CoMKgwqDCoMKgwqDCoCBnb3Rv IG91dDsKPj4gLcKgwqDCoCB9Cj4+IC0KPj4gLcKgwqDCoCAvKgo+PiAtwqDCoMKgwqAgKiBCYXNp YyB0ZXN0IC0gYW4gYXR0ZW1wdCB0byByZWFsbG9jYXRlIGEgdmFsaWQgZG9vcmJlbGwgdG8gdGhl Cj4+IC3CoMKgwqDCoCAqIGNsaWVudCBpdCBpcyBjdXJyZW50bHkgYXNzaWduZWQgc2hvdWxkIG5v dCBjYXVzZSBhIGZhaWx1cmUuCj4+IC3CoMKgwqDCoCAqLwo+PiAtwqDCoMKgIGVyciA9IGNyZWF0 ZV9kb29yYmVsbChndWMtPmV4ZWNidWZfY2xpZW50KTsKPj4gLQo+PiAtb3V0Ogo+PiAtwqDCoMKg IC8qCj4+IC3CoMKgwqDCoCAqIExlYXZlIGNsZWFuIHN0YXRlIGZvciBvdGhlciB0ZXN0LCBwbHVz IHRoZSBkcml2ZXIgYWx3YXlzIAo+PiBkZXN0cm95IHRoZQo+PiAtwqDCoMKgwqAgKiBjbGllbnRz IGR1cmluZyB1bmxvYWQuCj4+IC3CoMKgwqDCoCAqLwo+PiAtwqDCoMKgIGd1Y19jbGllbnRzX2Rp c2FibGUoZ3VjKTsKPj4gLcKgwqDCoCBndWNfY2xpZW50c19kZXN0cm95KGd1Yyk7Cj4+IC3CoMKg wqAgZ3VjX2NsaWVudHNfY3JlYXRlKGd1Yyk7Cj4+IC3CoMKgwqAgZ3VjX2NsaWVudHNfZW5hYmxl KGd1Yyk7Cj4+IC11bmxvY2s6Cj4+IC3CoMKgwqAgaW50ZWxfcnVudGltZV9wbV9wdXQoZ3QtPnVu Y29yZS0+cnBtLCB3YWtlcmVmKTsKPj4gLcKgwqDCoCByZXR1cm4gZXJyOwo+PiAtfQo+PiAtCj4+ IC0vKgo+PiAtICogQ3JlYXRlIGFzIG1hbnkgY2xpZW50cyBhcyBudW1iZXIgb2YgZG9vcmJlbGxz LiBOb3RlIHRoYXQgdGhlcmUncyAKPj4gYWxyZWFkeQo+PiAtICogY2xpZW50KHMpL2Rvb3JiZWxs KHMpIGNyZWF0ZWQgZHVyaW5nIGRyaXZlciBsb2FkLCBidXQgdGhpcyB0ZXN0IAo+PiBjcmVhdGVz Cj4+IC0gKiBpdHMgb3duIGFuZCBkbyBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgZXhpc3Rpbmcgb25l cy4KPj4gLSAqLwo+PiAtc3RhdGljIGludCBpZ3RfZ3VjX2Rvb3JiZWxscyh2b2lkICphcmcpCj4+ IC17Cj4+IC3CoMKgwqAgc3RydWN0IGludGVsX2d0ICpndCA9IGFyZzsKPj4gLcKgwqDCoCBzdHJ1 Y3QgaW50ZWxfZ3VjICpndWMgPSAmZ3QtPnVjLmd1YzsKPj4gLcKgwqDCoCBpbnRlbF93YWtlcmVm X3Qgd2FrZXJlZjsKPj4gLcKgwqDCoCBpbnQgaSwgZXJyID0gMDsKPj4gLcKgwqDCoCB1MTYgZGJf aWQ7Cj4+IC0KPj4gLcKgwqDCoCBHRU1fQlVHX09OKCFIQVNfR1RfVUMoZ3QtPmk5MTUpKTsKPj4g LcKgwqDCoCB3YWtlcmVmID0gaW50ZWxfcnVudGltZV9wbV9nZXQoZ3QtPnVuY29yZS0+cnBtKTsK Pj4gLQo+PiAtwqDCoMKgIGVyciA9IGNoZWNrX2FsbF9kb29yYmVsbHMoZ3VjKTsKPj4gLcKgwqDC oCBpZiAoZXJyKQo+PiAtwqDCoMKgwqDCoMKgwqAgZ290byB1bmxvY2s7Cj4+IC0KPj4gLcKgwqDC oCBmb3IgKGkgPSAwOyBpIDwgQVRURU1QVFM7IGkrKykgewo+PiAtwqDCoMKgwqDCoMKgwqAgY2xp ZW50c1tpXSA9IGd1Y19jbGllbnRfYWxsb2MoZ3VjLCBpICUgR1VDX0NMSUVOVF9QUklPUklUWV9O VU0pOwo+PiAtCj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAoIWNsaWVudHNbaV0pIHsKPj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJbJWRdIE5vIGd1YyBjbGllbnRcbiIsIGkpOwo+PiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlcnIgPSAtRUlOVkFMOwo+PiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBnb3RvIG91dDsKPj4gLcKgwqDCoMKgwqDCoMKgIH0KPj4gLQo+PiAtwqDCoMKgwqDC oMKgwqAgaWYgKElTX0VSUihjbGllbnRzW2ldKSkgewo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBpZiAoUFRSX0VSUihjbGllbnRzW2ldKSAhPSAtRU5PU1BDKSB7Cj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJbJWRdIHVuZXhwZWN0ZWQgZXJyb3JcbiIsIGkpOwo+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVyciA9IFBUUl9FUlIoY2xpZW50c1tp XSk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBvdXQ7Cj4+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgIH0KPj4gLQo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAo YXZhaWxhYmxlX2RicyhndWMsIGkgJSBHVUNfQ0xJRU5UX1BSSU9SSVRZX05VTSkpIHsKPj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcl9lcnIoIlslZF0gbm9uLWRiIHJlbGF0ZWQg YWxsb2MgZmFpbFxuIiwgaSk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZXJy ID0gLUVJTlZBTDsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG91dDsK Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+PiAtCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIC8qIGV4cGVjdGVkLCByYW4gb3V0IG9mIGRicyBmb3IgdGhpcyBjbGllbnQgdHlwZSAqLwo+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjb250aW51ZTsKPj4gLcKgwqDCoMKgwqDCoMKgIH0K Pj4gLQo+PiAtwqDCoMKgwqDCoMKgwqAgLyoKPj4gLcKgwqDCoMKgwqDCoMKgwqAgKiBUaGUgY2hl Y2sgYmVsb3cgaXMgb25seSB2YWxpZCBiZWNhdXNlIHdlIGtlZXAgYSBkb29yYmVsbAo+PiAtwqDC oMKgwqDCoMKgwqDCoCAqIGFzc2lnbmVkIGR1cmluZyB0aGUgd2hvbGUgbGlmZSBvZiB0aGUgY2xp ZW50Lgo+PiAtwqDCoMKgwqDCoMKgwqDCoCAqLwo+PiAtwqDCoMKgwqDCoMKgwqAgaWYgKGNsaWVu dHNbaV0tPnN0YWdlX2lkID49IEdVQ19OVU1fRE9PUkJFTExTKSB7Cj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHByX2VycigiWyVkXSBtb3JlIGNsaWVudHMgdGhhbiBkb29yYmVsbHMgKCVkID49 ICVkKVxuIiwKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpLCBjbGll bnRzW2ldLT5zdGFnZV9pZCwgR1VDX05VTV9ET09SQkVMTFMpOwo+PiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBlcnIgPSAtRUlOVkFMOwo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG91 dDsKPj4gLcKgwqDCoMKgwqDCoMKgIH0KPj4gLQo+PiAtwqDCoMKgwqDCoMKgwqAgZXJyID0gdmFs aWRhdGVfY2xpZW50KGNsaWVudHNbaV0sIGkgJSBHVUNfQ0xJRU5UX1BSSU9SSVRZX05VTSk7Cj4+ IC3CoMKgwqDCoMKgwqDCoCBpZiAoZXJyKSB7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHBy X2VycigiWyVkXSBjbGllbnRfYWxsb2Mgc2FuaXR5IGNoZWNrIGZhaWxlZCFcbiIsIGkpOwo+PiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBlcnIgPSAtRUlOVkFMOwo+PiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBnb3RvIG91dDsKPj4gLcKgwqDCoMKgwqDCoMKgIH0KPj4gLQo+PiAtwqDCoMKgwqDC oMKgwqAgZGJfaWQgPSBjbGllbnRzW2ldLT5kb29yYmVsbF9pZDsKPj4gLQo+PiAtwqDCoMKgwqDC oMKgwqAgZXJyID0gX19ndWNfY2xpZW50X2VuYWJsZShjbGllbnRzW2ldKTsKPj4gLcKgwqDCoMKg wqDCoMKgIGlmIChlcnIpIHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJbJWRd IEZhaWxlZCB0byBjcmVhdGUgYSBkb29yYmVsbFxuIiwgaSk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGdvdG8gb3V0Owo+PiAtwqDCoMKgwqDCoMKgwqAgfQo+PiAtCj4+IC3CoMKgwqDCoMKg wqDCoCAvKiBkb29yYmVsbCBpZCBzaG91bGRuJ3QgY2hhbmdlLCB3ZSBhcmUgaG9sZGluZyB0aGUg bXV0ZXggKi8KPj4gLcKgwqDCoMKgwqDCoMKgIGlmIChkYl9pZCAhPSBjbGllbnRzW2ldLT5kb29y YmVsbF9pZCkgewo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcl9lcnIoIlslZF0gZG9vcmJl bGwgaWQgY2hhbmdlZCAoJWQgIT0gJWQpXG4iLAo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGksIGRiX2lkLCBjbGllbnRzW2ldLT5kb29yYmVsbF9pZCk7Cj4+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGVyciA9IC1FSU5WQUw7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGdvdG8gb3V0Owo+PiAtwqDCoMKgwqDCoMKgwqAgfQo+PiAtCj4+IC3CoMKgwqDCoMKgwqDC oCBlcnIgPSBjaGVja19hbGxfZG9vcmJlbGxzKGd1Yyk7Cj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAo ZXJyKQo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG91dDsKPj4gLQo+PiAtwqDCoMKg wqDCoMKgwqAgZXJyID0gcmluZ19kb29yYmVsbF9ub3AoY2xpZW50c1tpXSk7Cj4+IC3CoMKgwqDC oMKgwqDCoCBpZiAoZXJyKQo+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG91dDsKPj4g LcKgwqDCoCB9Cj4+IC0KPj4gLW91dDoKPj4gLcKgwqDCoCBmb3IgKGkgPSAwOyBpIDwgQVRURU1Q VFM7IGkrKykKPj4gLcKgwqDCoMKgwqDCoMKgIGlmICghSVNfRVJSX09SX05VTEwoY2xpZW50c1tp XSkpIHsKPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgX19ndWNfY2xpZW50X2Rpc2FibGUoY2xp ZW50c1tpXSk7Cj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGd1Y19jbGllbnRfZnJlZShjbGll bnRzW2ldKTsKPj4gLcKgwqDCoMKgwqDCoMKgIH0KPj4gLXVubG9jazoKPj4gLcKgwqDCoCBpbnRl bF9ydW50aW1lX3BtX3B1dChndC0+dW5jb3JlLT5ycG0sIHdha2VyZWYpOwo+PiAtwqDCoMKgIHJl dHVybiBlcnI7Cj4+IC19Cj4+IC0KPj4gLWludCBpbnRlbF9ndWNfbGl2ZV9zZWxmdGVzdChzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKPj4gLXsKPj4gLcKgwqDCoCBzdGF0aWMgY29uc3Qg c3RydWN0IGk5MTVfc3VidGVzdCB0ZXN0c1tdID0gewo+PiAtwqDCoMKgwqDCoMKgwqAgU1VCVEVT VChpZ3RfZ3VjX2NsaWVudHMpLAo+PiAtwqDCoMKgwqDCoMKgwqAgU1VCVEVTVChpZ3RfZ3VjX2Rv b3JiZWxscyksCj4+IC3CoMKgwqAgfTsKPj4gLQo+PiAtwqDCoMKgIGlmICghVVNFU19HVUNfU1VC TUlTU0lPTihpOTE1KSkKPj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+PiAtCj4+IC3CoMKg wqAgcmV0dXJuIGludGVsX2d0X2xpdmVfc3VidGVzdHModGVzdHMsICZpOTE1LT5ndCk7Cj4+IC19 Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYyAKPj4g Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwo+PiBpbmRleCBjYWI2MzI3OTFm NzMuLjVkNTk3NGU3ZjNlZCAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkx NV9kZWJ1Z2ZzLmMKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMK Pj4gQEAgLTE4MTUsMTcgKzE4MTUsMTAgQEAgc3RhdGljIGludCBpOTE1X2d1Y19pbmZvKHN0cnVj dCBzZXFfZmlsZSAqbSwgCj4+IHZvaWQgKmRhdGEpCj4+IMKgwqDCoMKgwqAgR0VNX0JVR19PTigh Z3VjLT5leGVjYnVmX2NsaWVudCk7Cj4+IC3CoMKgwqAgc2VxX3ByaW50ZihtLCAiXG5Eb29yYmVs bCBtYXA6XG4iKTsKPj4gLcKgwqDCoCBzZXFfcHJpbnRmKG0sICJcdCUqcGJcbiIsIEdVQ19OVU1f RE9PUkJFTExTLCBndWMtPmRvb3JiZWxsX2JpdG1hcCk7Cj4+IC3CoMKgwqAgc2VxX3ByaW50Ziht LCAiRG9vcmJlbGwgbmV4dCBjYWNoZWxpbmU6IDB4JXhcbiIsIGd1Yy0+ZGJfY2FjaGVsaW5lKTsK Pj4gLQo+PiDCoMKgwqDCoMKgIHNlcV9wcmludGYobSwgIlxuR3VDIGV4ZWNidWYgY2xpZW50IEAg JXA6XG4iLCBjbGllbnQpOwo+PiAtwqDCoMKgIHNlcV9wcmludGYobSwgIlx0UHJpb3JpdHkgJWQs IEd1QyBzdGFnZSBpbmRleDogJXUsIFBEIG9mZnNldCAKPj4gMHgleFxuIiwKPj4gK8KgwqDCoCBz ZXFfcHJpbnRmKG0sICJcdFByaW9yaXR5ICVkLCBHdUMgc3RhZ2UgaW5kZXg6ICV1XG4iLAo+PiDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2xpZW50LT5wcmlvcml0eSwKPj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgIGNsaWVudC0+c3RhZ2VfaWQsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoCBjbGll bnQtPnByb2NfZGVzY19vZmZzZXQpOwo+PiAtwqDCoMKgIHNlcV9wcmludGYobSwgIlx0RG9vcmJl bGwgaWQgJWQsIG9mZnNldDogMHglbHhcbiIsCj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoCBjbGll bnQtPmRvb3JiZWxsX2lkLCBjbGllbnQtPmRvb3JiZWxsX29mZnNldCk7Cj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoCBjbGllbnQtPnN0YWdlX2lkKTsKPj4gwqDCoMKgwqDCoCAvKiBBZGQgbW9yZSBh cyByZXF1aXJlZCAuLi4gKi8KPj4gwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRlc3RzLmggCj4+ IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaAo+ PiBpbmRleCA0YjNjYWM3M2UyOTEuLmZiMDNmOGE5MGNhYyAxMDA2NDQKPj4gLS0tIGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaAo+PiArKysgYi9k cml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0cy5oCj4+IEBA IC0zNiw1ICszNiw0IEBAIHNlbGZ0ZXN0KHJlc2V0LCBpbnRlbF9yZXNldF9saXZlX3NlbGZ0ZXN0 cykKPj4gwqAgc2VsZnRlc3QobWVtb3J5X3JlZ2lvbiwgaW50ZWxfbWVtb3J5X3JlZ2lvbl9saXZl X3NlbGZ0ZXN0cykKPj4gwqAgc2VsZnRlc3QoaGFuZ2NoZWNrLCBpbnRlbF9oYW5nY2hlY2tfbGl2 ZV9zZWxmdGVzdHMpCj4+IMKgIHNlbGZ0ZXN0KGV4ZWNsaXN0cywgaW50ZWxfZXhlY2xpc3RzX2xp dmVfc2VsZnRlc3RzKQo+PiAtc2VsZnRlc3QoZ3VjLCBpbnRlbF9ndWNfbGl2ZV9zZWxmdGVzdCkK Pj4gwqAgc2VsZnRlc3QocGVyZiwgaTkxNV9wZXJmX2xpdmVfc2VsZnRlc3RzKQo+IApfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGlu ZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZng=