From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH v4 4/8] drm/i915: Overcome display engine stride limits via GTT remapping Date: Wed, 30 Jan 2019 22:55:44 +0100 Message-ID: <20190130215544.GQ3271@phenom.ffwll.local> References: <20190118152720.24643-5-ville.syrjala@linux.intel.com> <20190124185849.25908-1-ville.syrjala@linux.intel.com> <20190130190121.GK3271@phenom.ffwll.local> <20190130205904.GQ20097@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-ed1-x544.google.com (mail-ed1-x544.google.com [IPv6:2a00:1450:4864:20::544]) by gabe.freedesktop.org (Postfix) with ESMTPS id ABFA66EBCF for ; Wed, 30 Jan 2019 21:55:49 +0000 (UTC) Received: by mail-ed1-x544.google.com with SMTP id y20so912471edw.9 for ; Wed, 30 Jan 2019 13:55:49 -0800 (PST) Content-Disposition: inline In-Reply-To: <20190130205904.GQ20097@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Cc: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org T24gV2VkLCBKYW4gMzAsIDIwMTkgYXQgMTA6NTk6MDRQTSArMDIwMCwgVmlsbGUgU3lyasOkbMOk IHdyb3RlOgo+IE9uIFdlZCwgSmFuIDMwLCAyMDE5IGF0IDA4OjAxOjIxUE0gKzAxMDAsIERhbmll bCBWZXR0ZXIgd3JvdGU6Cj4gPiBPbiBUaHUsIEphbiAyNCwgMjAxOSBhdCAwODo1ODo0OVBNICsw MjAwLCBWaWxsZSBTeXJqYWxhIHdyb3RlOgo+ID4gPiBGcm9tOiBWaWxsZSBTeXJqw6Rsw6QgPHZp bGxlLnN5cmphbGFAbGludXguaW50ZWwuY29tPgo+ID4gPiAKPiA+ID4gVGhlIGRpc3BsYXkgZW5n aW5lIHN0cmlkZSBsaW1pdHMgYXJlIGdldHRpbmcgaW4gb3VyIHdheS4gT24gU0tMKwo+ID4gPiB3 ZSBhcmUgbGltaXRlZCB0byA4ayBwaXhlbHMsIHdoaWNoIGlzIGVhc2lseSBleGNlZWRlZCB3aXRo IHRocmVlCj4gPiA+IDRrIGRpc3BsYXlzLiBUbyBvdmVyY29tZSB0aGlzIGxpbWl0YXRpb24gd2Ug Y2FuIHJlbWFwIHRoZSBwYWdlcwo+ID4gPiBpbiB0aGUgR1RUIHRvIHByb3ZpZGUgdGhlIGRpc3Bs YXkgZW5naW5lIHdpdGggYSB2aWV3IG9mIG1lbW9yeQo+ID4gPiB3aXRoIGEgc21hbGxlciBzdHJp ZGUuCj4gPiA+IAo+ID4gPiBUaGUgY29kZSBpcyBtb3N0bHkgYWxyZWFkeSB0aGVyZSBhcyBXZSBh bHJlYWR5IHBsYXkgdHJpY2tzIHdpdGgKPiA+ID4gdGhlIHBsYW5lIHN1cmZhY2UgYWRkcmVzcyBh bmQgeC95IG9mZnNldHMuCj4gPiA+IAo+ID4gPiBBIGZldyBjYXZlYXRzIGFwcGx5Ogo+ID4gPiAq IGxpbmVhciBidWZmZXJzIG5lZWQgdGhlIGZiIHN0cmlkZSB0byBiZSBwYWdlIGFsaWduZWQsIGFz Cj4gPiA+ICAgb3RoZXJ3aXNlIHRoZSByZW1hcHBlZCBsaW5lcyB3b3VsZG4ndCBzdGFydCBhdCB0 aGUgc2FtZQo+ID4gPiAgIHNwb3QKPiA+ID4gKiBjb21wcmVzc2VkIGJ1ZmZlcnMgY2FuJ3QgYmUg cmVtYXBwZWQgZHVlIHRvIHRoZSBuZXcKPiA+ID4gICBjY3MgaGFzaCBtb2RlIGNhdXNpbmcgdGhl IHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgcGFnZXMKPiA+ID4gICB0byBhZmZlY3QgdGhlIGludGVy cHJldGF0aW9uIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEuIElJUkMKPiA+ID4gICB0aGUgb2xkIGhh c2ggd2FzIGxpbWl0ZWQgdG8gdGhlIGxvdyAxMiBiaXRzIHNvIGlmIHdlIHdlcmUKPiA+ID4gICB1 c2luZyB0aGF0IG1vZGUgd2UgY291bGQgcmVtYXAuIEFzIGl0IHN0YW5kcyB3ZSBqdXN0IHJlZnVz ZQo+ID4gPiAgIHRvIHJlbWFwcCB3aXRoIGNvbXByZXNzZWQgZmJzLgo+ID4gPiAqIG5vIHJlbWFw cGluZyBnZW4yLzMgYXMgd2UnZCBuZWVkIGEgZmVuY2UgZm9yIHRoZSByZW1hcHBlZAo+ID4gPiAg IHZtYSwgd2hpY2ggd2UgY3VycmVudGx5IGRvbid0IGhhdmUuIE5lZWQgdG8gZGVhbCB3aXRoIHRo ZQo+ID4gPiAgIGZlbmNlIFBPVCByZXF1aXJlbWVudHMsIGFuZCBkbyBzb21ldGhpbmcgYWJvdXQg dGhlIGdlbjIKPiA+ID4gICBndHQgcGFnZSBzaXplIHZzIHRpbGUgc2l6ZSBkaWZmZXJlbmNlCj4g PiA+IAo+ID4gPiB2MjogUmViYXNlIGR1ZSB0byBpc19jY3NfbW9kaWZpZXIoKQo+ID4gPiAgICAg Rml4IHVwIHRoZSBza2wrIHN0cmlkZV9tdWx0IG1lc3MKPiA+ID4gICAgIG1lbXNldCgpIHRoZSBn dHRfdmlldyBiZWNhdXNlIG90aGVyd2lzZSB3ZSBjb3VsZCBsZWF2ZQo+ID4gPiAgICAganVuayBp biBwbGFuZVsxXSB3aGVuIGdvaW5nIGZyb20gMiBwbGFuZSB0byAxIHBsYW5lIGZvcm1hdAo+ID4g PiB2MzogaW50ZWxfY2hlY2tfcGxhbmVfc3RyaWRlKCkgd2FzIHNwbGl0IG91dAo+ID4gPiB2NDog RHJvcCB0aGUgYWxpZ25lZCB2aWV3cG9ydCBzdHVmZiwgaXQgd2FzIG1lYW50IGZvciBjY3Mgd2hp Y2gKPiA+ID4gICAgIGNhbid0IGJlIHJlbWFwcGVkIGFueXdheQo+ID4gPiB2NTogSW50cm9kdWNl IGludGVsX3BsYW5lX2Nhbl9yZW1hcCgpCj4gPiA+ICAgICBSZW9yZGVyIHRoZSBjb2RlIHNvIHRo YXQgcGxhbmVfc3RhdGUtPnZpZXcgZ2V0cyBmaWxsZWQKPiA+ID4gICAgIGV2ZW4gZm9yIGludmlz aWJsZSBwbGFuZXMsIG90aGVyd2lzZSB3ZSdkIGtlZXAgdXNpbmcKPiA+ID4gICAgIHN0YWxlIHZh bHVlcyBhbmQgY291bGQgZXhwbG9kZSBkdXJpbmcgcmVtYXBwaW5nLiBUaGUgbmV3Cj4gPiA+ICAg ICBsb2dpYyBuZXZlciByZW1hcHMgaW52aXNpYmxlIHBsYW5lcyBzaW5jZSB3ZSBkb24ndCBoYXZl Cj4gPiA+ICAgICBhIHZpZXdwb3J0LCBhbmQgaW5zdGVhZCBwaW5zIHRoZSBmdWxsIGZiIGluc3Rl YWQKPiA+ID4gCj4gPiA+IFNpZ25lZC1vZmYtYnk6IFZpbGxlIFN5cmrDpGzDpCA8dmlsbGUuc3ly amFsYUBsaW51eC5pbnRlbC5jb20+Cj4gPiA+IC0tLQo+ID4gPiAgZHJpdmVycy9ncHUvZHJtL2k5 MTUvaW50ZWxfZGlzcGxheS5jIHwgMzkzICsrKysrKysrKysrKysrKysrKysrKy0tLS0tLQo+ID4g PiAgZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmggICAgIHwgICAxICsKPiA+ID4gIGRy aXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nwcml0ZS5jICB8ICAzNCArKy0KPiA+ID4gIDMgZmls ZXMgY2hhbmdlZCwgMzM0IGluc2VydGlvbnMoKyksIDk0IGRlbGV0aW9ucygtKQo+ID4gPiAKPiA+ ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwo+ID4gPiBpbmRleCAxN2M3ZWRlZTk1 ODQuLjM3MTNiNmYxNzk2ZSAxMDA2NDQKPiA+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfZGlzcGxheS5jCj4gPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rp c3BsYXkuYwo+ID4gPiBAQCAtMTg2NSw3ICsxODY1LDcgQEAgaW50ZWxfdGlsZV93aWR0aF9ieXRl cyhjb25zdCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiwgaW50IGNvbG9yX3BsYW5lKQo+ID4g PiAgCj4gPiA+ICAJc3dpdGNoIChmYi0+bW9kaWZpZXIpIHsKPiA+ID4gIAljYXNlIERSTV9GT1JN QVRfTU9EX0xJTkVBUjoKPiA+ID4gLQkJcmV0dXJuIGNwcDsKPiA+ID4gKwkJcmV0dXJuIGludGVs X3RpbGVfc2l6ZShkZXZfcHJpdik7Cj4gPiA+ICAJY2FzZSBJOTE1X0ZPUk1BVF9NT0RfWF9USUxF RDoKPiA+ID4gIAkJaWYgKElTX0dFTihkZXZfcHJpdiwgMikpCj4gPiA+ICAJCQlyZXR1cm4gMTI4 Owo+ID4gPiBAQCAtMTkwOCwxMSArMTkwOCw4IEBAIGludGVsX3RpbGVfd2lkdGhfYnl0ZXMoY29u c3Qgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsIGludCBjb2xvcl9wbGFuZSkKPiA+ID4gIHN0 YXRpYyB1bnNpZ25lZCBpbnQKPiA+ID4gIGludGVsX3RpbGVfaGVpZ2h0KGNvbnN0IHN0cnVjdCBk cm1fZnJhbWVidWZmZXIgKmZiLCBpbnQgY29sb3JfcGxhbmUpCj4gPiA+ICB7Cj4gPiA+IC0JaWYg KGZiLT5tb2RpZmllciA9PSBEUk1fRk9STUFUX01PRF9MSU5FQVIpCj4gPiA+IC0JCXJldHVybiAx Owo+ID4gPiAtCWVsc2UKPiA+ID4gLQkJcmV0dXJuIGludGVsX3RpbGVfc2l6ZSh0b19pOTE1KGZi LT5kZXYpKSAvCj4gPiA+IC0JCQlpbnRlbF90aWxlX3dpZHRoX2J5dGVzKGZiLCBjb2xvcl9wbGFu ZSk7Cj4gPiA+ICsJcmV0dXJuIGludGVsX3RpbGVfc2l6ZSh0b19pOTE1KGZiLT5kZXYpKSAvCj4g PiA+ICsJCWludGVsX3RpbGVfd2lkdGhfYnl0ZXMoZmIsIGNvbG9yX3BsYW5lKTsKPiA+ID4gIH0K PiA+ID4gIAo+ID4gPiAgLyogUmV0dXJuIHRoZSB0aWxlIGRpbWVuc2lvbnMgaW4gcGl4ZWwgdW5p dHMgKi8KPiA+ID4gQEAgLTIxNzAsMTYgKzIxNjcsOCBAQCB2b2lkIGludGVsX2FkZF9mYl9vZmZz ZXRzKGludCAqeCwgaW50ICp5LAo+ID4gPiAgCQkJICBpbnQgY29sb3JfcGxhbmUpCj4gPiA+ICAK PiA+ID4gIHsKPiA+ID4gLQljb25zdCBzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVsX2Zi ID0gdG9faW50ZWxfZnJhbWVidWZmZXIoc3RhdGUtPmJhc2UuZmIpOwo+ID4gPiAtCXVuc2lnbmVk IGludCByb3RhdGlvbiA9IHN0YXRlLT5iYXNlLnJvdGF0aW9uOwo+ID4gPiAtCj4gPiA+IC0JaWYg KGRybV9yb3RhdGlvbl85MF9vcl8yNzAocm90YXRpb24pKSB7Cj4gPiA+IC0JCSp4ICs9IGludGVs X2ZiLT5yb3RhdGVkW2NvbG9yX3BsYW5lXS54Owo+ID4gPiAtCQkqeSArPSBpbnRlbF9mYi0+cm90 YXRlZFtjb2xvcl9wbGFuZV0ueTsKPiA+ID4gLQl9IGVsc2Ugewo+ID4gPiAtCQkqeCArPSBpbnRl bF9mYi0+bm9ybWFsW2NvbG9yX3BsYW5lXS54Owo+ID4gPiAtCQkqeSArPSBpbnRlbF9mYi0+bm9y bWFsW2NvbG9yX3BsYW5lXS55Owo+ID4gPiAtCX0KPiA+ID4gKwkqeCArPSBzdGF0ZS0+Y29sb3Jf cGxhbmVbY29sb3JfcGxhbmVdLng7Cj4gPiA+ICsJKnkgKz0gc3RhdGUtPmNvbG9yX3BsYW5lW2Nv bG9yX3BsYW5lXS55Owo+ID4gPiAgfQo+ID4gPiAgCj4gPiA+ICBzdGF0aWMgdTMyIGludGVsX2Fk anVzdF90aWxlX29mZnNldChpbnQgKngsIGludCAqeSwKPiA+ID4gQEAgLTI0NTksNiArMjQ0OCwx MTkgQEAgYm9vbCBpc19jY3NfbW9kaWZpZXIodTY0IG1vZGlmaWVyKQo+ID4gPiAgCSAgICAgICBt b2RpZmllciA9PSBJOTE1X0ZPUk1BVF9NT0RfWWZfVElMRURfQ0NTOwo+ID4gPiAgfQo+ID4gPiAg Cj4gPiA+ICtzdGF0aWMKPiA+ID4gK3UzMiBpbnRlbF9wbGFuZV9mYl9tYXhfc3RyaWRlKHN0cnVj dCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKPiA+ID4gKwkJCSAgICAgIHUzMiBwaXhlbF9m b3JtYXQsIHU2NCBtb2RpZmllcikKPiA+ID4gK3sKPiA+ID4gKwlzdHJ1Y3QgaW50ZWxfY3J0YyAq Y3J0YzsKPiA+ID4gKwlzdHJ1Y3QgaW50ZWxfcGxhbmUgKnBsYW5lOwo+ID4gPiArCj4gPiA+ICsJ LyoKPiA+ID4gKwkgKiBXZSBhc3N1bWUgdGhlIHByaW1hcnkgcGxhbmUgZm9yIHBpcGUgQSBoYXMK PiA+ID4gKwkgKiB0aGUgaGlnaGVzdCBzdHJpZGUgbGltaXRzIG9mIHRoZW0gYWxsLgo+ID4gPiAr CSAqLwo+ID4gPiArCWNydGMgPSBpbnRlbF9nZXRfY3J0Y19mb3JfcGlwZShkZXZfcHJpdiwgUElQ RV9BKTsKPiA+ID4gKwlwbGFuZSA9IHRvX2ludGVsX3BsYW5lKGNydGMtPmJhc2UucHJpbWFyeSk7 Cj4gPiA+ICsKPiA+ID4gKwlyZXR1cm4gcGxhbmUtPm1heF9zdHJpZGUocGxhbmUsIHBpeGVsX2Zv cm1hdCwgbW9kaWZpZXIsCj4gPiA+ICsJCQkJIERSTV9NT0RFX1JPVEFURV8wKTsKPiA+ID4gK30K PiA+ID4gKwo+ID4gPiArc3RhdGljCj4gPiA+ICt1MzIgaW50ZWxfZmJfbWF4X3N0cmlkZShzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCj4gPiA+ICsJCQl1MzIgcGl4ZWxfZm9ybWF0 LCB1NjQgbW9kaWZpZXIpCj4gPiA+ICt7Cj4gPiA+ICsJcmV0dXJuIGludGVsX3BsYW5lX2ZiX21h eF9zdHJpZGUoZGV2X3ByaXYsIHBpeGVsX2Zvcm1hdCwgbW9kaWZpZXIpOwo+ID4gPiArfQo+ID4g PiArCj4gPiA+ICtzdGF0aWMgdTMyCj4gPiA+ICtpbnRlbF9mYl9zdHJpZGVfYWxpZ25tZW50KGNv bnN0IHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLCBpbnQgY29sb3JfcGxhbmUpCj4gPiA+ICt7 Cj4gPiA+ICsJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShmYi0+ ZGV2KTsKPiA+ID4gKwo+ID4gPiArCWlmIChmYi0+bW9kaWZpZXIgPT0gRFJNX0ZPUk1BVF9NT0Rf TElORUFSKSB7Cj4gPiA+ICsJCXUzMiBtYXhfc3RyaWRlID0gaW50ZWxfcGxhbmVfZmJfbWF4X3N0 cmlkZShkZXZfcHJpdiwKPiA+ID4gKwkJCQkJCQkgICBmYi0+Zm9ybWF0LT5mb3JtYXQsCj4gPiA+ ICsJCQkJCQkJICAgZmItPm1vZGlmaWVyKTsKPiA+ID4gKwo+ID4gPiArCQkvKgo+ID4gPiArCQkg KiBUbyBtYWtlIHJlbWFwcGluZyB3aXRoIGxpbmVhciBnZW5lcmFsbHkgZmVhc2libGUKPiA+ID4g KwkJICogd2UgbmVlZCB0aGUgc3RyaWRlIHRvIGJlIHBhZ2UgYWxpZ25lZC4KPiA+ID4gKwkJICov Cj4gPiA+ICsJCWlmIChmYi0+cGl0Y2hlc1tjb2xvcl9wbGFuZV0gPiBtYXhfc3RyaWRlKQo+ID4g PiArCQkJcmV0dXJuIGludGVsX3RpbGVfc2l6ZShkZXZfcHJpdik7Cj4gPiA+ICsJCWVsc2UKPiA+ ID4gKwkJCXJldHVybiA2NDsKPiA+ID4gKwl9IGVsc2Ugewo+ID4gPiArCQlyZXR1cm4gaW50ZWxf dGlsZV93aWR0aF9ieXRlcyhmYiwgY29sb3JfcGxhbmUpOwo+ID4gPiArCX0KPiA+ID4gK30KPiA+ ID4gKwo+ID4gPiArYm9vbCBpbnRlbF9wbGFuZV9jYW5fcmVtYXAoY29uc3Qgc3RydWN0IGludGVs X3BsYW5lX3N0YXRlICpwbGFuZV9zdGF0ZSkKPiA+ID4gK3sKPiA+ID4gKwlzdHJ1Y3QgaW50ZWxf cGxhbmUgKnBsYW5lID0gdG9faW50ZWxfcGxhbmUocGxhbmVfc3RhdGUtPmJhc2UucGxhbmUpOwo+ ID4gPiArCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUocGxhbmUt PmJhc2UuZGV2KTsKPiA+ID4gKwljb25zdCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9IHBs YW5lX3N0YXRlLT5iYXNlLmZiOwo+ID4gPiArCWludCBpOwo+ID4gPiArCj4gPiA+ICsJLyogV2Ug ZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggcmVtYXBwaW5nIHdpdGggY3Vyc29ycyAqLwo+ID4gPiAr CWlmIChwbGFuZS0+aWQgPT0gUExBTkVfQ1VSU09SKQo+ID4gPiArCQlyZXR1cm4gZmFsc2U7Cj4g PiAKPiA+IFRoZXkgc2hvdWxkIGJlIGNhdWdodCBpbiB0aGUgc3RyaWRlIGNoZWNrIGJlbG93IGFu eXdheSAuLi4gd2h5IHNwZWNpYWwKPiA+IGNhc2U/Cj4gCj4gSSBndWVzcyB3ZSBjb3VsZCBqdXN0 IGRyb3AgdGhpcy4gSG1tLCB5ZWFoIGV2ZW4gaTg0NS9pODY1IHdpdGgKPiB0aGVpciBtYXggY3Vy c29yIHN0cmlkZSBvZiAyayBzaG91bGQgZ2V0IHJlamVjdGVkIGxhdGVyLgo+IAo+ID4gCj4gPiA+ ICsKPiA+ID4gKwkvKgo+ID4gPiArCSAqIFRoZSBkc3BsYXkgZW5naW5lIGxpbWl0cyBhbHJlYWR5 IG1hdGNoIHRoZSByZW5kZXIKPiA+ID4gKwkgKiBlbmdpbmUgbGltaXRzLCBzbyBub3QgbXVjaCBw b2ludCBpbiByZW1hcHBpbmcuCj4gPiA+ICsJICogV291bGQgYWxzbyBuZWVkIHRvIGRlYWwgd2l0 aCB0aGUgZmVuY2UgUE9UIGFsaWdubWVudAo+ID4gPiArCSAqIGFuZCBnZW4yIDJLaUIgR1RUIHRp bGUgc2l6ZS4KPiA+ID4gKwkgKi8KPiA+ID4gKwlpZiAoSU5URUxfR0VOKGRldl9wcml2KSA8IDQp Cj4gPiA+ICsJCXJldHVybiBmYWxzZTsKPiA+ID4gKwo+ID4gPiArCS8qCj4gPiA+ICsJICogVGhl IG5ldyBDQ1MgaGFzaCBtb2RlIGlzbid0IGNvbXBhdGlibGUgd2l0aCByZW1hcHBpbmcgYXMKPiA+ ID4gKwkgKiB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBwYWdlcyBhZmZlY3RzIHRoZSBjb21w cmVzc2VkIGRhdGEuCj4gPiA+ICsJICovCj4gPiA+ICsJaWYgKGlzX2Njc19tb2RpZmllcihmYi0+ bW9kaWZpZXIpKQo+ID4gPiArCQlyZXR1cm4gZmFsc2U7Cj4gPiA+ICsKPiA+ID4gKwkvKiBMaW5l YXIgbmVlZHMgYSBwYWdlIGFsaWduZWQgc3RyaWRlIGZvciByZW1hcHBpbmcgKi8KPiA+ID4gKwlp ZiAoZmItPm1vZGlmaWVyID09IERSTV9GT1JNQVRfTU9EX0xJTkVBUikgewo+ID4gCj4gPiBOb3Qg c3VyZSB3aGV0aGVyIGNyYW1taW5nIGxpbmVhciBmb3JtYXRzIGludG8gdGhlIHNhbWUgbWFjaGVu aXJ5IGlzIHJlYWxseQo+ID4gY2xldmVyIGluIGEgZ29vZCB3YXkgb3IgYmFkIHdheSAoYmVjYXVz ZSB0b28gdHJpY2t5KS4gSSBndWVzcyBpdCB3b3JrcywKPiA+IGFuZCB0aGlzIGlzIG5vdCBzb21l dGhpbmcgdGhhdCdzIHdlbGwgZXhwbGFpbmcgaW4gc29tZSBjb21tZW50cyBzcHJpbmtsZWQKPiA+ IGFsbCBvdmVyLgo+ID4gCj4gPiAqc2hydWcqCj4gPiAKPiA+ID4gKwkJdW5zaWduZWQgaW50IGFs aWdubWVudCA9IGludGVsX3RpbGVfc2l6ZShkZXZfcHJpdikgLSAxOwo+ID4gPiArCj4gPiA+ICsJ CWZvciAoaSA9IDA7IGkgPCBmYi0+Zm9ybWF0LT5udW1fcGxhbmVzOyBpKyspIHsKPiA+ID4gKwkJ CWlmIChmYi0+cGl0Y2hlc1tpXSAmIGFsaWdubWVudCkKPiA+ID4gKwkJCQlyZXR1cm4gZmFsc2U7 Cj4gPiA+ICsJCX0KPiA+ID4gKwl9Cj4gPiA+ICsKPiA+ID4gKwlyZXR1cm4gdHJ1ZTsKPiA+ID4g K30KPiA+ID4gKwo+ID4gPiArc3RhdGljIGJvb2wgaW50ZWxfcGxhbmVfbmVlZHNfcmVtYXAoY29u c3Qgc3RydWN0IGludGVsX3BsYW5lX3N0YXRlICpwbGFuZV9zdGF0ZSkKPiA+ID4gK3sKPiA+ID4g KwlzdHJ1Y3QgaW50ZWxfcGxhbmUgKnBsYW5lID0gdG9faW50ZWxfcGxhbmUocGxhbmVfc3RhdGUt PmJhc2UucGxhbmUpOwo+ID4gPiArCWNvbnN0IHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiID0g cGxhbmVfc3RhdGUtPmJhc2UuZmI7Cj4gPiA+ICsJdW5zaWduZWQgaW50IHJvdGF0aW9uID0gcGxh bmVfc3RhdGUtPmJhc2Uucm90YXRpb247Cj4gPiA+ICsJdTMyIHN0cmlkZSwgbWF4X3N0cmlkZTsK PiA+ID4gKwo+ID4gPiArCS8qCj4gPiA+ICsJICogTm8gcmVtYXBwaW5nIGZvciBpbnZpc2libGUg cGxhbmVzIHNpbmNlIHdlIGRvbid0IGhhdmUKPiA+ID4gKwkgKiBhbiBhY3R1YWwgc291cmNlIHZp ZXdwb3J0IHRvIHJlbWFwLgo+ID4gPiArCSAqLwo+ID4gPiArCWlmICghcGxhbmVfc3RhdGUtPmJh c2UudmlzaWJsZSkKPiA+ID4gKwkJcmV0dXJuIGZhbHNlOwo+ID4gPiArCj4gPiA+ICsJaWYgKCFp bnRlbF9wbGFuZV9jYW5fcmVtYXAocGxhbmVfc3RhdGUpKQo+ID4gPiArCQlyZXR1cm4gZmFsc2U7 Cj4gPiA+ICsKPiA+ID4gKwkvKiBGSVhNRSBvdGhlciBjb2xvciBwbGFuZXM/ICovCj4gPiAKPiA+ IFNob3VsZCBiZSBzaW1wbGUgdG8gZml4IGlmIHdlIGRvIGEgc2ltaWxhciBsb29wIGxpa2UgaW4g Y2FuX3JlbWFwIGFib3ZlLgo+ID4gSnVzdCB0cnVlIGlmIGFueSBvZiB0aGVtIGFyZSBiaWdnZXIg dGhhbiBtYXggc3RyaWRlLgo+IAo+IFRoYXQncyBhc3N1bWluZyB0aGUgbWF4IHN0cmlkZSBmb3Ig ZWFjaCBwbGFuZSBpcyB0aGUgc2FtZS4gV2hpY2gKPiBpdCBtaWdodCBub3QgYmUuIElJUkMgdGhl IHNrbCsgZG9jcyBkaWRuJ3QgcmVhbGx5IHNheSB3aGF0IHRoZSBtYXgKPiBhdXggc3RyaWRlIGlz LgoKVWdoLiBJbiB0aGF0IGNhc2UgcHJvYmFibHkgYmV0dGVyIHRvIG1ha2UgdGhhdCBjbGVhciBp biB0aGUgY29tbWVudCwgZS5nLgoKCS8qIEZJWE1FOiBhdXggcGxhbmUgbGltaXRzIG9uIGdlbjkr IGFyZSB1bmNsZWFyIGluIEJzcGVjLCBmb3Igbm93CgkgKiBubyBjaGVja2luZy4gKi8KCk90b2gg dGhlcmUncyBubyByZWFzb25hYmxlIHNjZW5hcmlvIHdoZXJlIHRoZXkncmUgd2lkZXIsIHNvIG1p Z2h0IHN0aWxsIGJlCmJldHRlciB0byBhdCBsZWFzdCBjaGVjayBmb3IgdGhhdC4KCj4gPiA+ICsJ c3RyaWRlID0gaW50ZWxfZmJfcGl0Y2goZmIsIDAsIHJvdGF0aW9uKTsKPiA+ID4gKwltYXhfc3Ry aWRlID0gcGxhbmUtPm1heF9zdHJpZGUocGxhbmUsIGZiLT5mb3JtYXQtPmZvcm1hdCwKPiA+ID4g KwkJCQkgICAgICAgZmItPm1vZGlmaWVyLCByb3RhdGlvbik7Cj4gPiA+ICsKPiA+ID4gKwlyZXR1 cm4gc3RyaWRlID4gbWF4X3N0cmlkZTsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiAgc3RhdGljIGlu dAo+ID4gPiAgaW50ZWxfZmlsbF9mYl9pbmZvKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdiwKPiA+ID4gIAkJICAgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCj4gPiA+IEBAIC0y NjI0LDYgKzI3MjYsMTcyIEBAIGludGVsX2ZpbGxfZmJfaW5mbyhzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqZGV2X3ByaXYsCj4gPiA+ICAJcmV0dXJuIDA7Cj4gPiA+ICB9Cj4gPiA+ICAKPiA+ID4g K3N0YXRpYyB2b2lkCj4gPiA+ICtpbnRlbF9wbGFuZV9yZW1hcF9ndHQoc3RydWN0IGludGVsX3Bs YW5lX3N0YXRlICpwbGFuZV9zdGF0ZSkKPiA+ID4gK3sKPiA+ID4gKwlzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYgPQo+ID4gPiArCQl0b19pOTE1KHBsYW5lX3N0YXRlLT5iYXNlLnBs YW5lLT5kZXYpOwo+ID4gPiArCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiID0gcGxhbmVfc3Rh dGUtPmJhc2UuZmI7Cj4gPiA+ICsJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9 IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGZiKTsKPiA+ID4gKwlzdHJ1Y3QgaW50ZWxfcm90YXRpb25f aW5mbyAqaW5mbyA9ICZwbGFuZV9zdGF0ZS0+dmlldy5yb3RhdGVkOwo+ID4gPiArCXVuc2lnbmVk IGludCByb3RhdGlvbiA9IHBsYW5lX3N0YXRlLT5iYXNlLnJvdGF0aW9uOwo+ID4gPiArCWludCBp LCBudW1fcGxhbmVzID0gZmItPmZvcm1hdC0+bnVtX3BsYW5lczsKPiA+ID4gKwl1bnNpZ25lZCBp bnQgdGlsZV9zaXplID0gaW50ZWxfdGlsZV9zaXplKGRldl9wcml2KTsKPiA+ID4gKwl1bnNpZ25l ZCBpbnQgc3JjX3gsIHNyY195Owo+ID4gPiArCXVuc2lnbmVkIGludCBzcmNfdywgc3JjX2g7Cj4g PiA+ICsJdTMyIGd0dF9vZmZzZXQgPSAwOwo+ID4gPiArCj4gPiA+ICsJbWVtc2V0KCZwbGFuZV9z dGF0ZS0+dmlldywgMCwgc2l6ZW9mKHBsYW5lX3N0YXRlLT52aWV3KSk7Cj4gPiA+ICsJcGxhbmVf c3RhdGUtPnZpZXcudHlwZSA9IGRybV9yb3RhdGlvbl85MF9vcl8yNzAocm90YXRpb24pID8KPiA+ ID4gKwkJSTkxNV9HR1RUX1ZJRVdfUk9UQVRFRCA6IEk5MTVfR0dUVF9WSUVXX1JFTUFQUEVEOwo+ ID4gPiArCj4gPiA+ICsJc3JjX3ggPSBwbGFuZV9zdGF0ZS0+YmFzZS5zcmMueDEgPj4gMTY7Cj4g PiA+ICsJc3JjX3kgPSBwbGFuZV9zdGF0ZS0+YmFzZS5zcmMueTEgPj4gMTY7Cj4gPiA+ICsJc3Jj X3cgPSBkcm1fcmVjdF93aWR0aCgmcGxhbmVfc3RhdGUtPmJhc2Uuc3JjKSA+PiAxNjsKPiA+ID4g KwlzcmNfaCA9IGRybV9yZWN0X2hlaWdodCgmcGxhbmVfc3RhdGUtPmJhc2Uuc3JjKSA+PiAxNjsK PiA+ID4gKwo+ID4gPiArCVdBUk5fT04oaXNfY2NzX21vZGlmaWVyKGZiLT5tb2RpZmllcikpOwo+ ID4gPiArCj4gPiA+ICsJLyogTWFrZSBzcmMgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHZp ZXdwb3J0ICovCj4gPiA+ICsJZHJtX3JlY3RfdHJhbnNsYXRlKCZwbGFuZV9zdGF0ZS0+YmFzZS5z cmMsCj4gPiA+ICsJCQkgICAtKHNyY194IDw8IDE2KSwgLShzcmNfeSA8PCAxNikpOwo+ID4gPiAr Cj4gPiA+ICsJLyogUm90YXRlIHNyYyBjb29yZGluYXRlcyB0byBtYXRjaCByb3RhdGVkIEdUVCB2 aWV3ICovCj4gPiA+ICsJaWYgKGRybV9yb3RhdGlvbl85MF9vcl8yNzAocm90YXRpb24pKQo+ID4g PiArCQlkcm1fcmVjdF9yb3RhdGUoJnBsYW5lX3N0YXRlLT5iYXNlLnNyYywKPiA+ID4gKwkJCQlz cmNfdyA8PCAxNiwgc3JjX2ggPDwgMTYsCj4gPiA+ICsJCQkJRFJNX01PREVfUk9UQVRFXzI3MCk7 Cj4gPiA+ICsKPiA+ID4gKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BsYW5lczsgaSsrKSB7Cj4gPiA+ ICsJCXVuc2lnbmVkIGludCBoc3ViID0gaSA/IGZiLT5mb3JtYXQtPmhzdWIgOiAxOwo+ID4gPiAr CQl1bnNpZ25lZCBpbnQgdnN1YiA9IGkgPyBmYi0+Zm9ybWF0LT52c3ViIDogMTsKPiA+ID4gKwkJ dW5zaWduZWQgaW50IGNwcCA9IGZiLT5mb3JtYXQtPmNwcFtpXTsKPiA+ID4gKwkJdW5zaWduZWQg aW50IHRpbGVfd2lkdGgsIHRpbGVfaGVpZ2h0Owo+ID4gPiArCQl1bnNpZ25lZCBpbnQgd2lkdGgs IGhlaWdodDsKPiA+ID4gKwkJdW5zaWduZWQgaW50IHBpdGNoX3RpbGVzOwo+ID4gPiArCQl1bnNp Z25lZCBpbnQgeCwgeTsKPiA+ID4gKwkJdTMyIG9mZnNldDsKPiA+ID4gKwo+ID4gPiArCQlpbnRl bF90aWxlX2RpbXMoZmIsIGksICZ0aWxlX3dpZHRoLCAmdGlsZV9oZWlnaHQpOwo+ID4gPiArCj4g PiA+ICsJCXggPSBzcmNfeCAvIGhzdWI7Cj4gPiA+ICsJCXkgPSBzcmNfeSAvIHZzdWI7Cj4gPiA+ ICsJCXdpZHRoID0gc3JjX3cgLyBoc3ViOwo+ID4gPiArCQloZWlnaHQgPSBzcmNfaCAvIHZzdWI7 Cj4gPiA+ICsKPiA+ID4gKwkJLyoKPiA+ID4gKwkJICogRmlyc3QgcGl4ZWwgb2YgdGhlIHNyYyB2 aWV3cG9ydCBmcm9tIHRoZQo+ID4gPiArCQkgKiBzdGFydCBvZiB0aGUgbm9ybWFsIGd0dCBtYXBw aW5nLgo+ID4gPiArCQkgKi8KPiA+ID4gKwkJeCArPSBpbnRlbF9mYi0+bm9ybWFsW2ldLng7Cj4g PiA+ICsJCXkgKz0gaW50ZWxfZmItPm5vcm1hbFtpXS55Owo+ID4gPiArCj4gPiA+ICsJCW9mZnNl dCA9IGludGVsX2NvbXB1dGVfYWxpZ25lZF9vZmZzZXQoZGV2X3ByaXYsICZ4LCAmeSwKPiA+ID4g KwkJCQkJCSAgICAgIGZiLCBpLCBmYi0+cGl0Y2hlc1tpXSwKPiA+ID4gKwkJCQkJCSAgICAgIERS TV9NT0RFX1JPVEFURV8wLCB0aWxlX3NpemUpOwo+ID4gPiArCQlvZmZzZXQgLz0gdGlsZV9zaXpl Owo+ID4gPiArCj4gPiA+ICsJCWluZm8tPnBsYW5lW2ldLm9mZnNldCA9IG9mZnNldDsKPiA+ID4g KwkJaW5mby0+cGxhbmVbaV0uc3RyaWRlID0gRElWX1JPVU5EX1VQKGZiLT5waXRjaGVzW2ldLAo+ ID4gPiArCQkJCQkJICAgICB0aWxlX3dpZHRoICogY3BwKTsKPiA+ID4gKwkJaW5mby0+cGxhbmVb aV0ud2lkdGggPSBESVZfUk9VTkRfVVAoeCArIHdpZHRoLCB0aWxlX3dpZHRoKTsKPiA+ID4gKwkJ aW5mby0+cGxhbmVbaV0uaGVpZ2h0ID0gRElWX1JPVU5EX1VQKHkgKyBoZWlnaHQsIHRpbGVfaGVp Z2h0KTsKPiA+ID4gKwo+ID4gPiArCQlpZiAoZHJtX3JvdGF0aW9uXzkwX29yXzI3MChyb3RhdGlv bikpIHsKPiA+ID4gKwkJCXN0cnVjdCBkcm1fcmVjdCByOwo+ID4gPiArCj4gPiA+ICsJCQkvKiBy b3RhdGUgdGhlIHgveSBvZmZzZXRzIHRvIG1hdGNoIHRoZSBHVFQgdmlldyAqLwo+ID4gPiArCQkJ ci54MSA9IHg7Cj4gPiA+ICsJCQlyLnkxID0geTsKPiA+ID4gKwkJCXIueDIgPSB4ICsgd2lkdGg7 Cj4gPiA+ICsJCQlyLnkyID0geSArIGhlaWdodDsKPiA+ID4gKwkJCWRybV9yZWN0X3JvdGF0ZSgm ciwKPiA+ID4gKwkJCQkJaW5mby0+cGxhbmVbaV0ud2lkdGggKiB0aWxlX3dpZHRoLAo+ID4gPiAr CQkJCQlpbmZvLT5wbGFuZVtpXS5oZWlnaHQgKiB0aWxlX2hlaWdodCwKPiA+ID4gKwkJCQkJRFJN X01PREVfUk9UQVRFXzI3MCk7Cj4gPiA+ICsJCQl4ID0gci54MTsKPiA+ID4gKwkJCXkgPSByLnkx Owo+ID4gPiArCj4gPiA+ICsJCQlwaXRjaF90aWxlcyA9IGluZm8tPnBsYW5lW2ldLmhlaWdodDsK PiA+ID4gKwkJCXBsYW5lX3N0YXRlLT5jb2xvcl9wbGFuZVtpXS5zdHJpZGUgPSBwaXRjaF90aWxl cyAqIHRpbGVfaGVpZ2h0Owo+ID4gPiArCj4gPiA+ICsJCQkvKiByb3RhdGUgdGhlIHRpbGUgZGlt ZW5zaW9ucyB0byBtYXRjaCB0aGUgR1RUIHZpZXcgKi8KPiA+ID4gKwkJCXN3YXAodGlsZV93aWR0 aCwgdGlsZV9oZWlnaHQpOwo+ID4gPiArCQl9IGVsc2Ugewo+ID4gPiArCQkJcGl0Y2hfdGlsZXMg PSBpbmZvLT5wbGFuZVtpXS53aWR0aDsKPiA+ID4gKwkJCXBsYW5lX3N0YXRlLT5jb2xvcl9wbGFu ZVtpXS5zdHJpZGUgPSBwaXRjaF90aWxlcyAqIHRpbGVfd2lkdGggKiBjcHA7Cj4gPiA+ICsJCX0K PiA+ID4gKwo+ID4gPiArCQkvKgo+ID4gPiArCQkgKiBXZSBvbmx5IGtlZXAgdGhlIHgveSBvZmZz ZXRzLCBzbyBwdXNoIGFsbCBvZiB0aGUKPiA+ID4gKwkJICogZ3R0IG9mZnNldCBpbnRvIHRoZSB4 L3kgb2Zmc2V0cy4KPiA+ID4gKwkJICovCj4gPiA+ICsJCWludGVsX2FkanVzdF90aWxlX29mZnNl dCgmeCwgJnksCj4gPiA+ICsJCQkJCSB0aWxlX3dpZHRoLCB0aWxlX2hlaWdodCwKPiA+ID4gKwkJ CQkJIHRpbGVfc2l6ZSwgcGl0Y2hfdGlsZXMsCj4gPiA+ICsJCQkJCSBndHRfb2Zmc2V0ICogdGls ZV9zaXplLCAwKTsKPiA+ID4gKwo+ID4gPiArCQlndHRfb2Zmc2V0ICs9IGluZm8tPnBsYW5lW2ld LndpZHRoICogaW5mby0+cGxhbmVbaV0uaGVpZ2h0Owo+ID4gPiArCj4gPiA+ICsJCXBsYW5lX3N0 YXRlLT5jb2xvcl9wbGFuZVtpXS5vZmZzZXQgPSAwOwo+ID4gPiArCQlwbGFuZV9zdGF0ZS0+Y29s b3JfcGxhbmVbaV0ueCA9IHg7Cj4gPiA+ICsJCXBsYW5lX3N0YXRlLT5jb2xvcl9wbGFuZVtpXS55 ID0geTsKPiA+ID4gKwl9Cj4gPiA+ICt9Cj4gPiAKPiA+IFZhbGlkYXRpbmcgdGhpcyBmcmVha3Mg bWUgb3V0LiBLZWVwaW5nIGl0IHdvcmtpbmcgZnJlYWtzIG1lIG91dCBldmVuIG1vcmUsCj4gPiB0 aGVyZSdzIHByZXR0eSBtdWNoIGEgZ3VhcmFudGVlIHRoYXQgd2UgZG9uJ3QuCj4gPiAKPiA+IEFs c28sIEknbSBub3Qgc3VyZSBDSSBleGVyY2lzZXMgdGhpcyBtdWNoIGV2ZW4gd2l0aCB5b3VyIGhh Y2tzLiBNb3N0IG9mCj4gPiBvdXIga21zIHRlc3RzIHVzZSBzaW5nbGUtY3J0YyBidWZmZXJzLCBz byBubyBtYXNzaXZlIG92ZXJhbGxvY2F0aW9uLCBzbyBubwo+ID4gcmVhbCBuZWVkIGZvciB2aWV3 cy4gVGhlIHNlbGZ0ZXN0cyBhcmUgZ29vZCwgYnV0IHRoZXkgZG9uJ3QgY292ZXIgdGhlCj4gPiBt YXNzaXZlIHBpbGUgb2YgcGl4ZWwvY29vcmRpbmF0aW9uIGZyb2JiaW5nIGFib3ZlLgo+ID4gCj4g PiBJIHRoaW5rIG9ubHkgdGhpbmcgdGhhdCBjYW4gdmFsaWRhdGUgdGhpcyBpczoKPiA+IC0gYSBw aWxlIG9mIGlndHMgdGhhdCBtYWtlIHN1cmUgd2Ugb3ZlcmFsbG9jYXRlIHBsZW50aWZ1bCwgd2hp bGUgc3RpbGwKPiA+ICAgZXhlcmNpc2luZyBhbGwgdGhlIG1ham9yIGZiIGxheW91dHMgKHJvdGF0 ZWQsIGFsbCB0aGUgZGlmZmVyZW50IGNwcCwKPiA+ICAgdGlsaW5nIGZvcm1hdHMsIGFuZCB0aHJv dyBpbiBhIGNjcyBmb3IgbG9scyB0byBtYWtlIHN1cmUgbm90aGluZyBibG93cwo+ID4gICB1cCku Cj4gPiAtIGtlcm5lbCBwYXRjaCB0byBwcmVmZXIgcmVtbWFwZWQgb3ZlciBub3JtYWwuIERvbid0 IG1vdmUgeW91ciBidWZmZXJzCj4gPiAgIGFyb3VuZCB0b28gbXVjaCB0aG91Z2ggOi0pCj4gPiAK PiA+IE5vdyB0aGUgc2Vjb25kIHBhcnQgaXNuJ3QgcmVhbGx5IGEgcmVhbCB3b3JsZCB0aGluZywg c2luY2UgZXZlbiB3aXRoCj4gPiB5LXRpbGVkIHRoYXQgbWVhbnMgcmVtYXBwaW5nIHRoZSB2aWV3 IGV2ZXJ5IDMyIHBpeGVscyAob24gYXZlcmFnZSwgd29yc2UKPiA+IGlmIHlvdXIgZWRnZXMgYXJl bid0IGFsaWduZWQgdG8gMzIgcGl4ZWxzLCB0aGVuIGl0J3MgdHdpY2UgYXMgbXVjaCkuCj4gPiAK PiA+IFNvIEkgdGhpbmsgdGhlIG9ubHkgdGhpbmcgdGhhdCB3b3JrcyBmb3IgdmFsaWRhdGluZyB0 aGlzIGJlYXN0IGlzIGEgcGlsZQo+ID4gb2YgbmV3IGlndHMgdGhhdCBhbGxvY2F0ZSBkdW1iJnRp bGVkIGJ1ZmZlcnMgYXQgdGhlIHNpemUgbGltaXQsIGFuZCBkbyBhbGwKPiA+IHRoZSByb3RhdGlv bnMvc2NhbGluZy9tb3ZpbmcgdGVzdHMgd2UgYWxyZWFkeSBoYXZlLgo+ID4gCj4gPiBZZXMgdGhp cyBpcyBwYWluZnVsLgo+IAo+IE9uZSB0ZXN0IHRoYXQgSSBkaWQgd3JpdGUgd2FzIGttc19iaWdf ZmIsIHdoaWNoIGFsbG9jYXRlcyBhIGh1Z2UgZmIgYW5kCj4gcGFucyBhcm91bmQgaXQgd2l0aCBh bGwgcm90YXRpb25zIGFuZCBtb2RpZmllcnMuIEJ1dCB0aGUgdmVyc2lvbiBJCj4gcG9zdGVkIHdh cyBwcmV0dHkgb2xkIGFuZCBJIG5lZWQgdG8gbG9vayBpbnRvIGNsZWFuaW5nIHVwIGFueSBsYXRl cgo+IGNoYW5nZXMgSSBoYWQuIFRoZSBvdGhlciBhbm5veWluZyB0aGluZyBpcyB0aGF0IGdlbmVy YXRpbmcgdGhhdCBodWdlCj4gZmIgaXMgcHJldHR5IHNsb3cuIFNob3VsZCBtYXliZSBsb29rIGlu dG8gbWluaW1pemluZyB0aGUgc3R1ZmYgd2UgcmVuZGVyCj4gdG8gaXQgdG8gc3BlZWQgaXQgdXAu CgoxNioxNiBpcyBqdXN0IDFHQiwgdGhhdCBzaG91bGQgc3RpbGwgYmUgb2sgdG8gY2xmbHVzaCBh bmQgYWxsIHRoYXQuIEFzCmxvbmcgYXMgd2UgZG9uJ3QgdXNlIHBpeG1hbiB0byByZW5kZXIgdG8g aXQuCgpXaGF0IEkgaGFkIGluIG1pbmQgaXMganVzdCBrbXNfcm90YXRpb24sIGJ1dCBhZGRlZCBi aWdfZmIgc3VidGVzdHMgZm9yIGF0CmxlYXN0IHNvbWUgb2YgdGhlbSwgd2l0aCB0aGUgb25seSBk aWZmZXJlbmNlIHRoYXQgd2UgYWxsb2NhdGUgYSBodWdlIGZiLgpCdXQgc3RpbGwgcmVuZGVyIG9u bHkgaW50byB0aGUgZmFpcmx5IHRpbnkgdmlzaWJsZSBwb3J0aW9uLiBJaXJjIHdlIGV2ZW4KaGF2 ZSBhIGZldyBvZiB0aG9zZSAiYmlnZ2VyIHRoYW4gbmVjZXNzYXJ5IGZiIiB0ZXN0cyBpbiBrbXNf cm90YXRpb24sIHRvCm1ha2Ugc3VyZSB0aGUgcmVtYXBwaW5nIGlzbid0IGJyb2tlbiBpbiB0aGVz ZSBjb3JuZXItY2FzZXMuCgpTaW5jZSByZW1hcHBlZCB2aWV3L2ZiIGlzIGV4YWN0bHkgdGhlIHNh bWUgcHJvYmxlbSBhcyByb3RhdGVkLCBleGNlcHQgbm90CnJvdGF0ZWQsIEkgdGhpbmsgcmV1c2lu ZyB0aGF0IHRlc3QgYXMgbXVjaCBhcyBwb3NzaWJsZSBzaW1wbGlmaWVzIHRoZQpyZXZpZXdpbmcu CgpBbm90aGVyIHRoaW5nOiBJZiB3ZSBkbyB0aGUgZHVtYl9jcmVhdGUgY2hhbmdlIEkgcmVjb21t ZW5kIHRoZW4gaXQgc2hvdWxkCkp1c3QgV29yazogTU9ESUZJRVJfTk9ORSBpcyBhbGxvY2F0ZWQg dGhyb3VnaCBkdW1iLCBzbyBzaG91bGQgcGljayB1cCB0aGUKc3RyaWRlIHJlc3RyaWN0aW9ucyBh dXRvbWF0aWNhbGx5LCBhbmQgb3RoZXIgbW9kaWZpZXJzIHdvcmsgYXV0b21hdGljYWxseQpiZWNh dXNlIHRpbGVzLiBJIHRoaW5rIHRoYXQgc2hvdWxkIGJlIHRoZSBxdWlja2VzdCB3YXkgdG8gZ2V0 IGdvb2QgZW5vdWdoCnRlc3QgY292ZXJhZ2Ugd2l0aG91dCBoYXZpbmcgdG8gcmV2aWV3IGFuIGVu dGlyZSBuZXcgaWd0LgoKT25seSBnYXAgd291bGQgYmUgYSB0ZXN0IGZvciBkdW1iX2NyZWF0ZSB0 byBjaGVjayBpdCBkb2VzIHRoZSByaWdodCB0aGluZywKYnV0IEknbSBvayB3aXRoIHNocnVnZ2lu ZyB0aGF0IG9uZSBvZmYuCi1EYW5pZWwKCj4gCj4gPiAKPiA+ID4gKwo+ID4gPiArc3RhdGljIGlu dAo+ID4gPiAraW50ZWxfcGxhbmVfY29tcHV0ZV9ndHQoc3RydWN0IGludGVsX3BsYW5lX3N0YXRl ICpwbGFuZV9zdGF0ZSkKPiA+ID4gK3sKPiA+ID4gKwljb25zdCBzdHJ1Y3QgaW50ZWxfZnJhbWVi dWZmZXIgKmZiID0KPiA+ID4gKwkJdG9faW50ZWxfZnJhbWVidWZmZXIocGxhbmVfc3RhdGUtPmJh c2UuZmIpOwo+ID4gPiArCXVuc2lnbmVkIGludCByb3RhdGlvbiA9IHBsYW5lX3N0YXRlLT5iYXNl LnJvdGF0aW9uOwo+ID4gPiArCWludCBpLCBudW1fcGxhbmVzOwo+ID4gPiArCWludCByZXQ7Cj4g PiA+ICsKPiA+ID4gKwlpZiAoIWZiKQo+ID4gPiArCQlyZXR1cm4gMDsKPiA+ID4gKwo+ID4gPiAr CW51bV9wbGFuZXMgPSBmYi0+YmFzZS5mb3JtYXQtPm51bV9wbGFuZXM7Cj4gPiA+ICsKPiA+ID4g KwlpZiAoaW50ZWxfcGxhbmVfbmVlZHNfcmVtYXAocGxhbmVfc3RhdGUpKSB7Cj4gPiA+ICsJCWlu dGVsX3BsYW5lX3JlbWFwX2d0dChwbGFuZV9zdGF0ZSk7Cj4gPiA+ICsKPiA+ID4gKwkJLyogUmVt YXBwaW5nIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhpcyBhbHdheXMgKi8KPiA+ID4gKwkJcmV0ID0g aW50ZWxfcGxhbmVfY2hlY2tfc3RyaWRlKHBsYW5lX3N0YXRlKTsKPiA+ID4gKwkJaWYgKFdBUk5f T04ocmV0KSkKPiA+ID4gKwkJCXJldHVybiByZXQ7Cj4gPiA+ICsKPiA+ID4gKwkJcmV0dXJuIDA7 Cj4gPiA+ICsJfQo+ID4gPiArCj4gPiA+ICsJaW50ZWxfZmlsbF9mYl9nZ3R0X3ZpZXcoJnBsYW5l X3N0YXRlLT52aWV3LCAmZmItPmJhc2UsIHJvdGF0aW9uKTsKPiA+ID4gKwo+ID4gPiArCWZvciAo aSA9IDA7IGkgPCBudW1fcGxhbmVzOyBpKyspIHsKPiA+ID4gKwkJcGxhbmVfc3RhdGUtPmNvbG9y X3BsYW5lW2ldLnN0cmlkZSA9IGludGVsX2ZiX3BpdGNoKCZmYi0+YmFzZSwgaSwgcm90YXRpb24p Owo+ID4gPiArCQlwbGFuZV9zdGF0ZS0+Y29sb3JfcGxhbmVbaV0ub2Zmc2V0ID0gMDsKPiA+ID4g Kwo+ID4gPiArCQlpZiAoZHJtX3JvdGF0aW9uXzkwX29yXzI3MChyb3RhdGlvbikpIHsKPiA+ID4g KwkJCXBsYW5lX3N0YXRlLT5jb2xvcl9wbGFuZVtpXS54ID0gZmItPnJvdGF0ZWRbaV0ueDsKPiA+ ID4gKwkJCXBsYW5lX3N0YXRlLT5jb2xvcl9wbGFuZVtpXS55ID0gZmItPnJvdGF0ZWRbaV0ueTsK PiA+ID4gKwkJfSBlbHNlIHsKPiA+ID4gKwkJCXBsYW5lX3N0YXRlLT5jb2xvcl9wbGFuZVtpXS54 ID0gZmItPm5vcm1hbFtpXS54Owo+ID4gPiArCQkJcGxhbmVfc3RhdGUtPmNvbG9yX3BsYW5lW2ld LnkgPSBmYi0+bm9ybWFsW2ldLnk7Cj4gPiA+ICsJCX0KPiA+ID4gKwl9Cj4gPiA+ICsKPiA+ID4g KwkvKiBSb3RhdGUgc3JjIGNvb3JkaW5hdGVzIHRvIG1hdGNoIHJvdGF0ZWQgR1RUIHZpZXcgKi8K PiA+ID4gKwlpZiAoZHJtX3JvdGF0aW9uXzkwX29yXzI3MChyb3RhdGlvbikpCj4gPiA+ICsJCWRy bV9yZWN0X3JvdGF0ZSgmcGxhbmVfc3RhdGUtPmJhc2Uuc3JjLAo+ID4gPiArCQkJCWZiLT5iYXNl LndpZHRoIDw8IDE2LCBmYi0+YmFzZS5oZWlnaHQgPDwgMTYsCj4gPiA+ICsJCQkJRFJNX01PREVf Uk9UQVRFXzI3MCk7Cj4gPiA+ICsKPiA+ID4gKwlyZXQgPSBpbnRlbF9wbGFuZV9jaGVja19zdHJp ZGUocGxhbmVfc3RhdGUpOwo+ID4gPiArCWlmIChyZXQpCj4gPiA+ICsJCXJldHVybiByZXQ7Cj4g PiA+ICsKPiA+ID4gKwlyZXR1cm4gMDsKPiA+ID4gK30KPiA+IAo+ID4gU3BsaXR0aW5nIHRoZSBy ZWZhY3RvcmluZyBmcm9tIHRoZSBhY3R1YWwgZmVhdHVyZSBhZGRpbmcgd291bGQgYmUgbmljZS4K PiAKPiBBeWUuIFRoaXMgcGF0Y2ggZGlkIGVuZCB1cCBhY2N1bXVsYXRpbmcgYSBiaXQgdG9vIG1h bnkgY2hhbmdlcy4KPiAKPiA+IAo+ID4gPiArCj4gPiA+ICBzdGF0aWMgaW50IGk5eHhfZm9ybWF0 X3RvX2ZvdXJjYyhpbnQgZm9ybWF0KQo+ID4gPiAgewo+ID4gPiAgCXN3aXRjaCAoZm9ybWF0KSB7 Cj4gPiA+IEBAIC0zMTI3LDI2ICszMzk1LDE1IEBAIHN0YXRpYyBpbnQgc2tsX2NoZWNrX2Njc19h dXhfc3VyZmFjZShzdHJ1Y3QgaW50ZWxfcGxhbmVfc3RhdGUgKnBsYW5lX3N0YXRlKQo+ID4gPiAg aW50IHNrbF9jaGVja19wbGFuZV9zdXJmYWNlKHN0cnVjdCBpbnRlbF9wbGFuZV9zdGF0ZSAqcGxh bmVfc3RhdGUpCj4gPiA+ICB7Cj4gPiA+ICAJY29uc3Qgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAq ZmIgPSBwbGFuZV9zdGF0ZS0+YmFzZS5mYjsKPiA+ID4gLQl1bnNpZ25lZCBpbnQgcm90YXRpb24g PSBwbGFuZV9zdGF0ZS0+YmFzZS5yb3RhdGlvbjsKPiA+ID4gIAlpbnQgcmV0Owo+ID4gPiAgCj4g PiA+IC0JaW50ZWxfZmlsbF9mYl9nZ3R0X3ZpZXcoJnBsYW5lX3N0YXRlLT52aWV3LCBmYiwgcm90 YXRpb24pOwo+ID4gPiAtCXBsYW5lX3N0YXRlLT5jb2xvcl9wbGFuZVswXS5zdHJpZGUgPSBpbnRl bF9mYl9waXRjaChmYiwgMCwgcm90YXRpb24pOwo+ID4gPiAtCXBsYW5lX3N0YXRlLT5jb2xvcl9w bGFuZVsxXS5zdHJpZGUgPSBpbnRlbF9mYl9waXRjaChmYiwgMSwgcm90YXRpb24pOwo+ID4gPiAt Cj4gPiA+IC0JcmV0ID0gaW50ZWxfcGxhbmVfY2hlY2tfc3RyaWRlKHBsYW5lX3N0YXRlKTsKPiA+ ID4gKwlyZXQgPSBpbnRlbF9wbGFuZV9jb21wdXRlX2d0dChwbGFuZV9zdGF0ZSk7Cj4gPiA+ICAJ aWYgKHJldCkKPiA+ID4gIAkJcmV0dXJuIHJldDsKPiA+ID4gIAo+ID4gPiAgCWlmICghcGxhbmVf c3RhdGUtPmJhc2UudmlzaWJsZSkKPiA+ID4gIAkJcmV0dXJuIDA7Cj4gPiA+ICAKPiA+ID4gLQkv KiBSb3RhdGUgc3JjIGNvb3JkaW5hdGVzIHRvIG1hdGNoIHJvdGF0ZWQgR1RUIHZpZXcgKi8KPiA+ ID4gLQlpZiAoZHJtX3JvdGF0aW9uXzkwX29yXzI3MChyb3RhdGlvbikpCj4gPiA+IC0JCWRybV9y ZWN0X3JvdGF0ZSgmcGxhbmVfc3RhdGUtPmJhc2Uuc3JjLAo+ID4gPiAtCQkJCWZiLT53aWR0aCA8 PCAxNiwgZmItPmhlaWdodCA8PCAxNiwKPiA+ID4gLQkJCQlEUk1fTU9ERV9ST1RBVEVfMjcwKTsK PiA+ID4gLQo+ID4gPiAgCS8qCj4gPiA+ICAJICogSGFuZGxlIHRoZSBBVVggc3VyZmFjZSBmaXJz dCBzaW5jZQo+ID4gPiAgCSAqIHRoZSBtYWluIHN1cmZhY2Ugc2V0dXAgZGVwZW5kcyBvbiBpdC4K PiA+ID4gQEAgLTMyNjUsMjAgKzM1MjIsMjAgQEAgaW50IGk5eHhfY2hlY2tfcGxhbmVfc3VyZmFj ZShzdHJ1Y3QgaW50ZWxfcGxhbmVfc3RhdGUgKnBsYW5lX3N0YXRlKQo+ID4gPiAgewo+ID4gPiAg CXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9Cj4gPiA+ICAJCXRvX2k5MTUocGxh bmVfc3RhdGUtPmJhc2UucGxhbmUtPmRldik7Cj4gPiA+IC0JY29uc3Qgc3RydWN0IGRybV9mcmFt ZWJ1ZmZlciAqZmIgPSBwbGFuZV9zdGF0ZS0+YmFzZS5mYjsKPiA+ID4gLQl1bnNpZ25lZCBpbnQg cm90YXRpb24gPSBwbGFuZV9zdGF0ZS0+YmFzZS5yb3RhdGlvbjsKPiA+ID4gLQlpbnQgc3JjX3gg PSBwbGFuZV9zdGF0ZS0+YmFzZS5zcmMueDEgPj4gMTY7Cj4gPiA+IC0JaW50IHNyY195ID0gcGxh bmVfc3RhdGUtPmJhc2Uuc3JjLnkxID4+IDE2Owo+ID4gPiArCWludCBzcmNfeCwgc3JjX3k7Cj4g PiA+ICAJdTMyIG9mZnNldDsKPiA+ID4gIAlpbnQgcmV0Owo+ID4gPiAgCj4gPiA+IC0JaW50ZWxf ZmlsbF9mYl9nZ3R0X3ZpZXcoJnBsYW5lX3N0YXRlLT52aWV3LCBmYiwgcm90YXRpb24pOwo+ID4g PiAtCXBsYW5lX3N0YXRlLT5jb2xvcl9wbGFuZVswXS5zdHJpZGUgPSBpbnRlbF9mYl9waXRjaChm YiwgMCwgcm90YXRpb24pOwo+ID4gPiAtCj4gPiA+IC0JcmV0ID0gaW50ZWxfcGxhbmVfY2hlY2tf c3RyaWRlKHBsYW5lX3N0YXRlKTsKPiA+ID4gKwlyZXQgPSBpbnRlbF9wbGFuZV9jb21wdXRlX2d0 dChwbGFuZV9zdGF0ZSk7Cj4gPiA+ICAJaWYgKHJldCkKPiA+ID4gIAkJcmV0dXJuIHJldDsKPiA+ ID4gIAo+ID4gPiArCWlmICghcGxhbmVfc3RhdGUtPmJhc2UudmlzaWJsZSkKPiA+ID4gKwkJcmV0 dXJuIDA7Cj4gPiA+ICsKPiA+ID4gKwlzcmNfeCA9IHBsYW5lX3N0YXRlLT5iYXNlLnNyYy54MSA+ PiAxNjsKPiA+ID4gKwlzcmNfeSA9IHBsYW5lX3N0YXRlLT5iYXNlLnNyYy55MSA+PiAxNjsKPiA+ ID4gKwo+ID4gPiAgCWludGVsX2FkZF9mYl9vZmZzZXRzKCZzcmNfeCwgJnNyY195LCBwbGFuZV9z dGF0ZSwgMCk7Cj4gPiA+ICAKPiA+ID4gIAlpZiAoSU5URUxfR0VOKGRldl9wcml2KSA+PSA0KQo+ ID4gPiBAQCAtMzI4OSw2ICszNTQ2LDcgQEAgaW50IGk5eHhfY2hlY2tfcGxhbmVfc3VyZmFjZShz dHJ1Y3QgaW50ZWxfcGxhbmVfc3RhdGUgKnBsYW5lX3N0YXRlKQo+ID4gPiAgCj4gPiA+ICAJLyog SFNXL0JEVyBkbyB0aGlzIGF1dG9tYWdpY2FsbHkgaW4gaGFyZHdhcmUgKi8KPiA+ID4gIAlpZiAo IUlTX0hBU1dFTEwoZGV2X3ByaXYpICYmICFJU19CUk9BRFdFTEwoZGV2X3ByaXYpKSB7Cj4gPiA+ ICsJCXVuc2lnbmVkIGludCByb3RhdGlvbiA9IHBsYW5lX3N0YXRlLT5iYXNlLnJvdGF0aW9uOwo+ ID4gPiAgCQlpbnQgc3JjX3cgPSBkcm1fcmVjdF93aWR0aCgmcGxhbmVfc3RhdGUtPmJhc2Uuc3Jj KSA+PiAxNjsKPiA+ID4gIAkJaW50IHNyY19oID0gZHJtX3JlY3RfaGVpZ2h0KCZwbGFuZV9zdGF0 ZS0+YmFzZS5zcmMpID4+IDE2Owo+ID4gPiAgCj4gPiA+IEBAIC0zMzI1LDYgKzM1ODMsMTAgQEAg aTl4eF9wbGFuZV9jaGVjayhzdHJ1Y3QgaW50ZWxfY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZSwKPiA+ ID4gIAlpZiAocmV0KQo+ID4gPiAgCQlyZXR1cm4gcmV0Owo+ID4gPiAgCj4gPiA+ICsJcmV0ID0g aTl4eF9jaGVja19wbGFuZV9zdXJmYWNlKHBsYW5lX3N0YXRlKTsKPiA+ID4gKwlpZiAocmV0KQo+ ID4gPiArCQlyZXR1cm4gcmV0Owo+ID4gPiArCj4gPiA+ICAJaWYgKCFwbGFuZV9zdGF0ZS0+YmFz ZS52aXNpYmxlKQo+ID4gPiAgCQlyZXR1cm4gMDsKPiA+ID4gIAo+ID4gPiBAQCAtMzMzMiwxMCAr MzU5NCw2IEBAIGk5eHhfcGxhbmVfY2hlY2soc3RydWN0IGludGVsX2NydGNfc3RhdGUgKmNydGNf c3RhdGUsCj4gPiA+ICAJaWYgKHJldCkKPiA+ID4gIAkJcmV0dXJuIHJldDsKPiA+ID4gIAo+ID4g PiAtCXJldCA9IGk5eHhfY2hlY2tfcGxhbmVfc3VyZmFjZShwbGFuZV9zdGF0ZSk7Cj4gPiA+IC0J aWYgKHJldCkKPiA+ID4gLQkJcmV0dXJuIHJldDsKPiA+ID4gLQo+ID4gPiAgCXBsYW5lX3N0YXRl LT5jdGwgPSBpOXh4X3BsYW5lX2N0bChjcnRjX3N0YXRlLCBwbGFuZV9zdGF0ZSk7Cj4gPiA+ICAK PiA+ID4gIAlyZXR1cm4gMDsKPiA+ID4gQEAgLTM0NTksMTUgKzM3MTcsNiBAQCBzdGF0aWMgYm9v bCBpOXh4X3BsYW5lX2dldF9od19zdGF0ZShzdHJ1Y3QgaW50ZWxfcGxhbmUgKnBsYW5lLAo+ID4g PiAgCXJldHVybiByZXQ7Cj4gPiA+ICB9Cj4gPiA+ICAKPiA+ID4gLXN0YXRpYyB1MzIKPiA+ID4g LWludGVsX2ZiX3N0cmlkZV9hbGlnbm1lbnQoY29uc3Qgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAq ZmIsIGludCBjb2xvcl9wbGFuZSkKPiA+ID4gLXsKPiA+ID4gLQlpZiAoZmItPm1vZGlmaWVyID09 IERSTV9GT1JNQVRfTU9EX0xJTkVBUikKPiA+ID4gLQkJcmV0dXJuIDY0Owo+ID4gPiAtCWVsc2UK PiA+ID4gLQkJcmV0dXJuIGludGVsX3RpbGVfd2lkdGhfYnl0ZXMoZmIsIGNvbG9yX3BsYW5lKTsK PiA+ID4gLX0KPiA+ID4gLQo+ID4gPiAgc3RhdGljIHZvaWQgc2tsX2RldGFjaF9zY2FsZXIoc3Ry dWN0IGludGVsX2NydGMgKmludGVsX2NydGMsIGludCBpZCkKPiA+ID4gIHsKPiA+ID4gIAlzdHJ1 Y3QgZHJtX2RldmljZSAqZGV2ID0gaW50ZWxfY3J0Yy0+YmFzZS5kZXY7Cj4gPiA+IEBAIC05ODMw LDE5ICsxMDA3OSwxNyBAQCBzdGF0aWMgYm9vbCBpbnRlbF9jdXJzb3Jfc2l6ZV9vayhjb25zdCBz dHJ1Y3QgaW50ZWxfcGxhbmVfc3RhdGUgKnBsYW5lX3N0YXRlKQo+ID4gPiAgCj4gPiA+ICBzdGF0 aWMgaW50IGludGVsX2N1cnNvcl9jaGVja19zdXJmYWNlKHN0cnVjdCBpbnRlbF9wbGFuZV9zdGF0 ZSAqcGxhbmVfc3RhdGUpCj4gPiA+ICB7Cj4gPiA+IC0JY29uc3Qgc3RydWN0IGRybV9mcmFtZWJ1 ZmZlciAqZmIgPSBwbGFuZV9zdGF0ZS0+YmFzZS5mYjsKPiA+ID4gLQl1bnNpZ25lZCBpbnQgcm90 YXRpb24gPSBwbGFuZV9zdGF0ZS0+YmFzZS5yb3RhdGlvbjsKPiA+ID4gIAlpbnQgc3JjX3gsIHNy Y195Owo+ID4gPiAgCXUzMiBvZmZzZXQ7Cj4gPiA+ICAJaW50IHJldDsKPiA+ID4gIAo+ID4gPiAt CWludGVsX2ZpbGxfZmJfZ2d0dF92aWV3KCZwbGFuZV9zdGF0ZS0+dmlldywgZmIsIHJvdGF0aW9u KTsKPiA+ID4gLQlwbGFuZV9zdGF0ZS0+Y29sb3JfcGxhbmVbMF0uc3RyaWRlID0gaW50ZWxfZmJf cGl0Y2goZmIsIDAsIHJvdGF0aW9uKTsKPiA+ID4gLQo+ID4gPiAtCXJldCA9IGludGVsX3BsYW5l X2NoZWNrX3N0cmlkZShwbGFuZV9zdGF0ZSk7Cj4gPiA+ICsJcmV0ID0gaW50ZWxfcGxhbmVfY29t cHV0ZV9ndHQocGxhbmVfc3RhdGUpOwo+ID4gPiAgCWlmIChyZXQpCj4gPiA+ICAJCXJldHVybiBy ZXQ7Cj4gPiA+ICAKPiA+ID4gKwlpZiAoIXBsYW5lX3N0YXRlLT5iYXNlLnZpc2libGUpCj4gPiA+ ICsJCXJldHVybiAwOwo+ID4gPiArCj4gPiA+ICAJc3JjX3ggPSBwbGFuZV9zdGF0ZS0+YmFzZS5z cmNfeCA+PiAxNjsKPiA+ID4gIAlzcmNfeSA9IHBsYW5lX3N0YXRlLT5iYXNlLnNyY195ID4+IDE2 Owo+ID4gPiAgCj4gPiA+IEBAIC05ODc5LDYgKzEwMTI2LDEwIEBAIHN0YXRpYyBpbnQgaW50ZWxf Y2hlY2tfY3Vyc29yKHN0cnVjdCBpbnRlbF9jcnRjX3N0YXRlICpjcnRjX3N0YXRlLAo+ID4gPiAg CWlmIChyZXQpCj4gPiA+ICAJCXJldHVybiByZXQ7Cj4gPiA+ICAKPiA+ID4gKwlyZXQgPSBpbnRl bF9jdXJzb3JfY2hlY2tfc3VyZmFjZShwbGFuZV9zdGF0ZSk7Cj4gPiA+ICsJaWYgKHJldCkKPiA+ ID4gKwkJcmV0dXJuIHJldDsKPiA+ID4gKwo+ID4gPiAgCWlmICghcGxhbmVfc3RhdGUtPmJhc2Uu dmlzaWJsZSkKPiA+ID4gIAkJcmV0dXJuIDA7Cj4gPiA+ICAKPiA+ID4gQEAgLTk4ODYsMTAgKzEw MTM3LDYgQEAgc3RhdGljIGludCBpbnRlbF9jaGVja19jdXJzb3Ioc3RydWN0IGludGVsX2NydGNf c3RhdGUgKmNydGNfc3RhdGUsCj4gPiA+ICAJaWYgKHJldCkKPiA+ID4gIAkJcmV0dXJuIHJldDsK PiA+ID4gIAo+ID4gPiAtCXJldCA9IGludGVsX2N1cnNvcl9jaGVja19zdXJmYWNlKHBsYW5lX3N0 YXRlKTsKPiA+ID4gLQlpZiAocmV0KQo+ID4gPiAtCQlyZXR1cm4gcmV0Owo+ID4gPiAtCj4gPiA+ ICAJcmV0dXJuIDA7Cj4gPiA+ICB9Cj4gPiA+ICAKPiA+ID4gQEAgLTE0NTkxLDMxICsxNDgzOCwx MyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9mcmFtZWJ1ZmZlcl9mdW5jcyBpbnRlbF9mYl9m dW5jcyA9IHsKPiA+ID4gIAkuZGlydHkgPSBpbnRlbF91c2VyX2ZyYW1lYnVmZmVyX2RpcnR5LAo+ ID4gPiAgfTsKPiA+ID4gIAo+ID4gPiAtc3RhdGljCj4gPiA+IC11MzIgaW50ZWxfZmJfcGl0Y2hf bGltaXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAo+ID4gPiAtCQkJIHUzMiBw aXhlbF9mb3JtYXQsIHU2NCBmYl9tb2RpZmllcikKPiA+ID4gLXsKPiA+ID4gLQlzdHJ1Y3QgaW50 ZWxfY3J0YyAqY3J0YzsKPiA+ID4gLQlzdHJ1Y3QgaW50ZWxfcGxhbmUgKnBsYW5lOwo+ID4gPiAt Cj4gPiA+IC0JLyoKPiA+ID4gLQkgKiBXZSBhc3N1bWUgdGhlIHByaW1hcnkgcGxhbmUgZm9yIHBp cGUgQSBoYXMKPiA+ID4gLQkgKiB0aGUgaGlnaGVzdCBzdHJpZGUgbGltaXRzIG9mIHRoZW0gYWxs Lgo+ID4gPiAtCSAqLwo+ID4gPiAtCWNydGMgPSBpbnRlbF9nZXRfY3J0Y19mb3JfcGlwZShkZXZf cHJpdiwgUElQRV9BKTsKPiA+ID4gLQlwbGFuZSA9IHRvX2ludGVsX3BsYW5lKGNydGMtPmJhc2Uu cHJpbWFyeSk7Cj4gPiA+IC0KPiA+ID4gLQlyZXR1cm4gcGxhbmUtPm1heF9zdHJpZGUocGxhbmUs IHBpeGVsX2Zvcm1hdCwgZmJfbW9kaWZpZXIsCj4gPiA+IC0JCQkJIERSTV9NT0RFX1JPVEFURV8w KTsKPiA+ID4gLX0KPiA+ID4gLQo+ID4gPiAgc3RhdGljIGludCBpbnRlbF9mcmFtZWJ1ZmZlcl9p bml0KHN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmIsCj4gPiA+ICAJCQkJICBzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAo+ID4gPiAgCQkJCSAgc3RydWN0IGRybV9tb2Rl X2ZiX2NtZDIgKm1vZGVfY21kKQo+ID4gPiAgewo+ID4gPiAgCXN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUob2JqLT5iYXNlLmRldik7Cj4gPiA+ICAJc3RydWN0IGRy bV9mcmFtZWJ1ZmZlciAqZmIgPSAmaW50ZWxfZmItPmJhc2U7Cj4gPiA+IC0JdTMyIHBpdGNoX2xp bWl0Owo+ID4gPiArCXUzMiBtYXhfc3RyaWRlOwo+ID4gPiAgCXVuc2lnbmVkIGludCB0aWxpbmcs IHN0cmlkZTsKPiA+ID4gIAlpbnQgcmV0ID0gLUVJTlZBTDsKPiA+ID4gIAlpbnQgaTsKPiA+ID4g QEAgLTE0NjY3LDEzICsxNDg5NiwxMyBAQCBzdGF0aWMgaW50IGludGVsX2ZyYW1lYnVmZmVyX2lu aXQoc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiwKPiA+ID4gIAkJZ290byBlcnI7 Cj4gPiA+ICAJfQo+ID4gPiAgCj4gPiA+IC0JcGl0Y2hfbGltaXQgPSBpbnRlbF9mYl9waXRjaF9s aW1pdChkZXZfcHJpdiwgbW9kZV9jbWQtPnBpeGVsX2Zvcm1hdCwKPiA+ID4gLQkJCQkJICAgbW9k ZV9jbWQtPm1vZGlmaWVyWzBdKTsKPiA+ID4gLQlpZiAobW9kZV9jbWQtPnBpdGNoZXNbMF0gPiBw aXRjaF9saW1pdCkgewo+ID4gPiArCW1heF9zdHJpZGUgPSBpbnRlbF9mYl9tYXhfc3RyaWRlKGRl dl9wcml2LCBtb2RlX2NtZC0+cGl4ZWxfZm9ybWF0LAo+ID4gPiArCQkJCQkgbW9kZV9jbWQtPm1v ZGlmaWVyWzBdKTsKPiA+ID4gKwlpZiAobW9kZV9jbWQtPnBpdGNoZXNbMF0gPiBtYXhfc3RyaWRl KSB7Cj4gPiA+ICAJCURSTV9ERUJVR19LTVMoIiVzIHBpdGNoICgldSkgbXVzdCBiZSBhdCBtb3N0 ICVkXG4iLAo+ID4gPiAgCQkJICAgICAgbW9kZV9jbWQtPm1vZGlmaWVyWzBdICE9IERSTV9GT1JN QVRfTU9EX0xJTkVBUiA/Cj4gPiA+ICAJCQkgICAgICAidGlsZWQiIDogImxpbmVhciIsCj4gPiA+ IC0JCQkgICAgICBtb2RlX2NtZC0+cGl0Y2hlc1swXSwgcGl0Y2hfbGltaXQpOwo+ID4gPiArCQkJ ICAgICAgbW9kZV9jbWQtPnBpdGNoZXNbMF0sIG1heF9zdHJpZGUpOwo+ID4gPiAgCQlnb3RvIGVy cjsKPiA+ID4gIAl9Cj4gPiA+ICAKPiA+IAo+ID4gV2UgbmVlZCBhbiBpbnRlbF9mcmFtZWJ1ZmZl cnxwbGFuZS5jLiBBbmQgYSBtZXRyaWMgcGlsZSBvZiBvdGhlciBleHRyYWN0ZWQKPiA+IGZpbGVz LCBwcm9iYWJseSBhbHNvIHBlciBtYWpvciBwbGF0Zm9ybXMgYW5kIHN0dWZmIGxpa2UgdGhhdCA6 LS8KPiAKPiBZZWFoLCBJJ3ZlIGJlZW4gdGhpbmtpbmcgYWJvdXQgc2tsX3VuaXZlcnNhbF9wbGFu ZS5jICsgaTl4eF9wbGFuZS5jICsKPiBtYXliZSBpbnRlbF9wbGFuZS5jIGZvciBnZW5lcmljIHN0 dWZmIGZvciBhIHdoaWxlIG5vdy4gQWxzbyBtYXliZQo+IGludGVsX2N1cnNvci5jLiBCdXQgSSd2 ZSBiZWVuIHB1dHRpbmcgaXQgb2ZmIHRvIGF2b2lkIHJlYmFzZSBwYWluLgo+IEJ1dCBJIHRoaW5r IHdlJ3JlIHByb2JhYmx5IGluIGEgZ29vZCBlbm91Z2ggc3RhdGUgbm93IHRoYXQgaXQgc2hvdWxk Cj4gYmUgZmluZSB0byB0YWtlIHRoZSBwbHVuZ2UuCj4gCj4gPiAKPiA+ID4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfZHJ2LmgKPiA+ID4gaW5kZXggODEzNjI2MzIyZmEzLi4wZWU3M2Y5ZGVhN2MgMTAwNjQ0 Cj4gPiA+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCj4gPiA+ICsrKyBi L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCj4gPiA+IEBAIC0xNTg2LDYgKzE1ODYs NyBAQCB2b2lkIGludGVsX2R1bXBfY2RjbGtfc3RhdGUoY29uc3Qgc3RydWN0IGludGVsX2NkY2xr X3N0YXRlICpjZGNsa19zdGF0ZSwKPiA+ID4gIAkJCSAgICBjb25zdCBjaGFyICpjb250ZXh0KTsK PiA+ID4gIAo+ID4gPiAgLyogaW50ZWxfZGlzcGxheS5jICovCj4gPiA+ICtib29sIGludGVsX3Bs YW5lX2Nhbl9yZW1hcChjb25zdCBzdHJ1Y3QgaW50ZWxfcGxhbmVfc3RhdGUgKnBsYW5lX3N0YXRl KTsKPiA+ID4gIHZvaWQgaTgzMF9lbmFibGVfcGlwZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYsIGVudW0gcGlwZSBwaXBlKTsKPiA+ID4gIHZvaWQgaTgzMF9kaXNhYmxlX3BpcGUo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBlbnVtIHBpcGUgcGlwZSk7Cj4gPiA+ ICBlbnVtIHBpcGUgaW50ZWxfY3J0Y19wY2hfdHJhbnNjb2RlcihzdHJ1Y3QgaW50ZWxfY3J0YyAq Y3J0Yyk7Cj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zcHJp dGUuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nwcml0ZS5jCj4gPiA+IGluZGV4IGIw MmQzZDk4MDllMy4uNTE3NzQ3ZDA4OTYyIDEwMDY0NAo+ID4gPiAtLS0gYS9kcml2ZXJzL2dwdS9k cm0vaTkxNS9pbnRlbF9zcHJpdGUuYwo+ID4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p bnRlbF9zcHJpdGUuYwo+ID4gPiBAQCAtMjM3LDYgKzIzNywxNiBAQCBpbnQgaW50ZWxfcGxhbmVf Y2hlY2tfc3RyaWRlKGNvbnN0IHN0cnVjdCBpbnRlbF9wbGFuZV9zdGF0ZSAqcGxhbmVfc3RhdGUp Cj4gPiA+ICAJdW5zaWduZWQgaW50IHJvdGF0aW9uID0gcGxhbmVfc3RhdGUtPmJhc2Uucm90YXRp b247Cj4gPiA+ICAJdTMyIHN0cmlkZSwgbWF4X3N0cmlkZTsKPiA+ID4gIAo+ID4gPiArCS8qCj4g PiA+ICsJICogV2UgaWdub3JlIHN0cmlkZSBmb3IgYWxsIGludmlzaWJsZSBwbGFuZXMgdGhhdAo+ ID4gPiArCSAqIGNhbiBiZSByZW1hcHBlZC4gT3RoZXJ3aXNlIHdlIGNvdWxkIGVuZCB1cAo+ID4g PiArCSAqIHdpdGggYSBmYWxzZSBwb3NpdGl2ZSB3aGVuIHRoZSByZW1hcHBpbmcgZGlkbid0Cj4g PiA+ICsJICoga2ljayBpbiBkdWUgdGhlIHBsYW5lIGJlaW5nIGludmlzaWJsZS4KPiA+ID4gKwkg Ki8KPiA+ID4gKwlpZiAoaW50ZWxfcGxhbmVfY2FuX3JlbWFwKHBsYW5lX3N0YXRlKSAmJgo+ID4g PiArCSAgICAhcGxhbmVfc3RhdGUtPmJhc2UudmlzaWJsZSkKPiA+ID4gKwkJcmV0dXJuIDA7Cj4g PiA+ICsKPiA+ID4gIAkvKiBGSVhNRSBvdGhlciBjb2xvciBwbGFuZXM/ICovCj4gPiA+ICAJc3Ry aWRlID0gcGxhbmVfc3RhdGUtPmNvbG9yX3BsYW5lWzBdLnN0cmlkZTsKPiA+ID4gIAltYXhfc3Ry aWRlID0gcGxhbmUtPm1heF9zdHJpZGUocGxhbmUsIGZiLT5mb3JtYXQtPmZvcm1hdCwKPiA+ID4g QEAgLTEzNDEsNiArMTM1MSwxMCBAQCBnNHhfc3ByaXRlX2NoZWNrKHN0cnVjdCBpbnRlbF9jcnRj X3N0YXRlICpjcnRjX3N0YXRlLAo+ID4gPiAgCWlmIChyZXQpCj4gPiA+ICAJCXJldHVybiByZXQ7 Cj4gPiA+ICAKPiA+ID4gKwlyZXQgPSBpOXh4X2NoZWNrX3BsYW5lX3N1cmZhY2UocGxhbmVfc3Rh dGUpOwo+ID4gPiArCWlmIChyZXQpCj4gPiA+ICsJCXJldHVybiByZXQ7Cj4gPiA+ICsKPiA+ID4g IAlpZiAoIXBsYW5lX3N0YXRlLT5iYXNlLnZpc2libGUpCj4gPiA+ICAJCXJldHVybiAwOwo+ID4g PiAgCj4gPiA+IEBAIC0xMzUyLDEwICsxMzY2LDYgQEAgZzR4X3Nwcml0ZV9jaGVjayhzdHJ1Y3Qg aW50ZWxfY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZSwKPiA+ID4gIAlpZiAocmV0KQo+ID4gPiAgCQly ZXR1cm4gcmV0Owo+ID4gPiAgCj4gPiA+IC0JcmV0ID0gaTl4eF9jaGVja19wbGFuZV9zdXJmYWNl KHBsYW5lX3N0YXRlKTsKPiA+ID4gLQlpZiAocmV0KQo+ID4gPiAtCQlyZXR1cm4gcmV0Owo+ID4g PiAtCj4gPiA+ICAJaWYgKElOVEVMX0dFTihkZXZfcHJpdikgPj0gNykKPiA+ID4gIAkJcGxhbmVf c3RhdGUtPmN0bCA9IGl2Yl9zcHJpdGVfY3RsKGNydGNfc3RhdGUsIHBsYW5lX3N0YXRlKTsKPiA+ ID4gIAllbHNlCj4gPiA+IEBAIC0xMzk5LDYgKzE0MDksMTAgQEAgdmx2X3Nwcml0ZV9jaGVjayhz dHJ1Y3QgaW50ZWxfY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZSwKPiA+ID4gIAlpZiAocmV0KQo+ID4g PiAgCQlyZXR1cm4gcmV0Owo+ID4gPiAgCj4gPiA+ICsJcmV0ID0gaTl4eF9jaGVja19wbGFuZV9z dXJmYWNlKHBsYW5lX3N0YXRlKTsKPiA+ID4gKwlpZiAocmV0KQo+ID4gPiArCQlyZXR1cm4gcmV0 Owo+ID4gPiArCj4gPiA+ICAJaWYgKCFwbGFuZV9zdGF0ZS0+YmFzZS52aXNpYmxlKQo+ID4gPiAg CQlyZXR1cm4gMDsKPiA+ID4gIAo+ID4gPiBAQCAtMTQwNiwxMCArMTQyMCw2IEBAIHZsdl9zcHJp dGVfY2hlY2soc3RydWN0IGludGVsX2NydGNfc3RhdGUgKmNydGNfc3RhdGUsCj4gPiA+ICAJaWYg KHJldCkKPiA+ID4gIAkJcmV0dXJuIHJldDsKPiA+ID4gIAo+ID4gPiAtCXJldCA9IGk5eHhfY2hl Y2tfcGxhbmVfc3VyZmFjZShwbGFuZV9zdGF0ZSk7Cj4gPiA+IC0JaWYgKHJldCkKPiA+ID4gLQkJ cmV0dXJuIHJldDsKPiA+ID4gLQo+ID4gPiAgCXBsYW5lX3N0YXRlLT5jdGwgPSB2bHZfc3ByaXRl X2N0bChjcnRjX3N0YXRlLCBwbGFuZV9zdGF0ZSk7Cj4gPiA+ICAKPiA+ID4gIAlyZXR1cm4gMDsK PiA+ID4gQEAgLTE1NTYsNiArMTU2NiwxMCBAQCBzdGF0aWMgaW50IHNrbF9wbGFuZV9jaGVjayhz dHJ1Y3QgaW50ZWxfY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZSwKPiA+ID4gIAlpZiAocmV0KQo+ID4g PiAgCQlyZXR1cm4gcmV0Owo+ID4gPiAgCj4gPiA+ICsJcmV0ID0gc2tsX2NoZWNrX3BsYW5lX3N1 cmZhY2UocGxhbmVfc3RhdGUpOwo+ID4gPiArCWlmIChyZXQpCj4gPiA+ICsJCXJldHVybiByZXQ7 Cj4gPiA+ICsKPiA+ID4gIAlpZiAoIXBsYW5lX3N0YXRlLT5iYXNlLnZpc2libGUpCj4gPiA+ICAJ CXJldHVybiAwOwo+ID4gPiAgCj4gPiA+IEBAIC0xNTcxLDEwICsxNTg1LDYgQEAgc3RhdGljIGlu dCBza2xfcGxhbmVfY2hlY2soc3RydWN0IGludGVsX2NydGNfc3RhdGUgKmNydGNfc3RhdGUsCj4g PiA+ICAJaWYgKHJldCkKPiA+ID4gIAkJcmV0dXJuIHJldDsKPiA+ID4gIAo+ID4gPiAtCXJldCA9 IHNrbF9jaGVja19wbGFuZV9zdXJmYWNlKHBsYW5lX3N0YXRlKTsKPiA+ID4gLQlpZiAocmV0KQo+ ID4gPiAtCQlyZXR1cm4gcmV0Owo+ID4gPiAtCj4gPiA+ICAJLyogSFcgb25seSBoYXMgOCBiaXRz IHBpeGVsIHByZWNpc2lvbiwgZGlzYWJsZSBwbGFuZSBpZiBpbnZpc2libGUgKi8KPiA+ID4gIAlp ZiAoIShwbGFuZV9zdGF0ZS0+YmFzZS5hbHBoYSA+PiA4KSkKPiA+ID4gIAkJcGxhbmVfc3RhdGUt PmJhc2UudmlzaWJsZSA9IGZhbHNlOwo+ID4gCj4gPiBDb2RlIGxvb2tzIGdvb2QsIGJ1dCB0aGUg dGVzdGluZyBmcmVha3MgbWUgb3V0LiBOZWVkcyBsb3RzIG9mIGlndCwgSSdkIHNheQo+ID4gYXQg bGVhc3Qgc2ltaWxhciBhbW91bnRzIHRvIHdoYXQgd2UndmUgYWxsIGFkZGVkIGZvciB0aGUgb3Jp Z2luYWwKPiA+IGttc19yb3RhdGlvbiB0ZXN0cy4KPiA+IC1EYW5pZWwKPiA+IC0tIAo+ID4gRGFu aWVsIFZldHRlcgo+ID4gU29mdHdhcmUgRW5naW5lZXIsIEludGVsIENvcnBvcmF0aW9uCj4gPiBo dHRwOi8vYmxvZy5mZndsbC5jaAo+IAo+IC0tIAo+IFZpbGxlIFN5cmrDpGzDpAo+IEludGVsCgot LSAKRGFuaWVsIFZldHRlcgpTb2Z0d2FyZSBFbmdpbmVlciwgSW50ZWwgQ29ycG9yYXRpb24KaHR0 cDovL2Jsb2cuZmZ3bGwuY2gKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0 b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50 ZWwtZ2Z4Cg==