From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ramalingam C Subject: Re: [RFC PATCH 3/6] drm/i915: Add HDCP framework + base implementation Date: Fri, 1 Dec 2017 12:53:31 +0530 Message-ID: References: <20171130030907.26848-1-seanpaul@chromium.org> <20171130030907.26848-4-seanpaul@chromium.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20171130030907.26848-4-seanpaul@chromium.org> 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: Sean Paul , dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org Cc: David Airlie , linux-kernel@vger.kernel.org, Rodrigo Vivi List-Id: intel-gfx@lists.freedesktop.org U2VhbiwKCklNSE8sIGl0IHdpbGwgZ29vZCBpZiB3ZSBjYW4gaGF2ZSBhbGwgZ2VuZXJpYyBoZGNw MS40IGF1dGhlbnRpY2F0aW9uIApmbG93IGluIGRybSBoZWxwZXJzIGFuZCBhbGwgaW50ZXJlc3Rl ZCBkaXNwbGF5IGRyaXZlcnMgdG8gdXNlIHRoZW0uCgpUaGlzIERlc2lnbiB3aWxsIG1ha2UgdGhl IGV4dGVuZGluZyBvZiBoZGNwIGVhc3kgZm9yIG90aGVyIGRpc3BsYXkgCmRyaXZlcnMgYmFzZWQg b24gRFJNLgoKV2UgY2FuIGhhdmUgdGhlIHJlcXVpcmVkIGRybV9oZGNwX3NoaW0gdHlwZSBvZiBp bXBsZW1lbnRhdGlvbiBhdCBkcm0gCnN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGNhbGxlZCBmb3Ig cGxhdGZvcm0gc3BlY2lmaWMgb3BlcmF0aW9ucyAobGlrZSAKcHJlcGFyZSBhbiwgc2VuZCBha3N2 LCBwcm9ncmFtIGJrc3YvcmVwZWF0ZXIvcjAgYW5kIHZlcmlmeSBzaGExIGV0Yyk/CgoKT24gVGh1 cnNkYXkgMzAgTm92ZW1iZXIgMjAxNyAwODozOCBBTSwgU2VhbiBQYXVsIHdyb3RlOgo+IFRoaXMg cGF0Y2ggYWRkcyB0aGUgZnJhbWV3b3JrIHJlcXVpcmVkIHRvIGFkZCBIRENQIHN1cHBvcnQgdG8g aW50ZWwKPiBjb25uZWN0b3JzLiBJdCBpbXBsZW1lbnRzIEFrc3YgbG9hZGluZyBmcm9tIGZ1c2Us IGFuZCBwYXJ0cyAxLzIvMwo+IG9mIHRoZSBIRENQIGF1dGhlbnRpY2F0aW9uIHNjaGVtZS4KPgo+ IE5vdGUgdGhhdCB3aXRob3V0IHNoaW0gaW1wbGVtZW50YXRpb25zLCB0aGlzIGRvZXMgbm90IGFj dHVhbGx5IGltcGxlbWVudAo+IEhEQ1AuIFRoYXQgd2lsbCBjb21lIGluIHN1YnNlcXVlbnQgcGF0 Y2hlcy4KPgo+IFNpZ25lZC1vZmYtYnk6IFNlYW4gUGF1bCA8c2VhbnBhdWxAY2hyb21pdW0ub3Jn Pgo+IC0tLQo+ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgICAgICAgfCAgIDEgKwo+ ICAgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaCAgICAgfCAgODMgKysrKysKPiAgIGRy aXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2F0b21pYy5jIHwgIDI2ICstCj4gICBkcml2ZXJzL2dw dS9kcm0vaTkxNS9pbnRlbF9kZGkuYyAgICB8ICAxNCArCj4gICBkcml2ZXJzL2dwdS9kcm0vaTkx NS9pbnRlbF9kcnYuaCAgICB8ICA1MyArKysKPiAgIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVs X2hkY3AuYyAgIHwgNjM2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ICAg NiBmaWxlcyBjaGFuZ2VkLCA4MTEgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKPiAgIGNy ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9oZGNwLmMKPgo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L01ha2VmaWxlCj4gaW5kZXggNmMzYjA0ODFlZjgyLi4xZTc0NTUwOGU0MzcgMTAwNjQ0 Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKPiArKysgYi9kcml2ZXJzL2dw dS9kcm0vaTkxNS9NYWtlZmlsZQo+IEBAIC04Nyw2ICs4Nyw3IEBAIGk5MTUteSArPSBpbnRlbF9h dWRpby5vIFwKPiAgIAkgIGludGVsX2ZiYy5vIFwKPiAgIAkgIGludGVsX2ZpZm9fdW5kZXJydW4u byBcCj4gICAJICBpbnRlbF9mcm9udGJ1ZmZlci5vIFwKPiArCSAgaW50ZWxfaGRjcC5vIFwKPiAg IAkgIGludGVsX2hvdHBsdWcubyBcCj4gICAJICBpbnRlbF9tb2Rlcy5vIFwKPiAgIAkgIGludGVs X292ZXJsYXkubyBcCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVn LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCj4gaW5kZXggNjhhNThjY2U2YWIx Li40MzEyODAzMDE3MWQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9y ZWcuaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKPiBAQCAtNzk5MSw2 ICs3OTkxLDcgQEAgZW51bSB7Cj4gICAjZGVmaW5lICAgICBHRU45X01FTV9MQVRFTkNZX0xFVkVM XzFfNV9TSElGVAk4Cj4gICAjZGVmaW5lICAgICBHRU45X01FTV9MQVRFTkNZX0xFVkVMXzJfNl9T SElGVAkxNgo+ICAgI2RlZmluZSAgICAgR0VOOV9NRU1fTEFURU5DWV9MRVZFTF8zXzdfU0hJRlQJ MjQKPiArI2RlZmluZSAgIFNLTF9QQ09ERV9MT0FEX0hEQ1BfS0VZUwkJMHg1Cj4gICAjZGVmaW5l ICAgU0tMX1BDT0RFX0NEQ0xLX0NPTlRST0wJCTB4Nwo+ICAgI2RlZmluZSAgICAgU0tMX0NEQ0xL X1BSRVBBUkVfRk9SX0NIQU5HRQkweDMKPiAgICNkZWZpbmUgICAgIFNLTF9DRENMS19SRUFEWV9G T1JfQ0hBTkdFCQkweDEKPiBAQCAtODI4NSw2ICs4Mjg2LDg4IEBAIGVudW0gc2tsX3Bvd2VyX2dh dGUgewo+ICAgI2RlZmluZSAgU0tMX1BXX1RPX1BHKHB3KQkJCSgocHcpIC0gU0tMX0RJU1BfUFdf MSArIFNLTF9QRzEpCj4gICAjZGVmaW5lICBTS0xfRlVTRV9QR19ESVNUX1NUQVRVUyhwZykJCSgx IDw8ICgyNyAtIChwZykpKQo+ICAgCj4gKwo+ICsvKiBIRENQIEtleSBSZWdpc3RlcnMgKi8KPiAr I2RlZmluZSBTS0xfSERDUF9LRVlfQ09ORgkJX01NSU8oMHg2NmMwMCkKPiArI2RlZmluZQkgU0tM X0hEQ1BfQUtTVl9TRU5EX1RSSUdHRVIJQklUKDMxKQo+ICsjZGVmaW5lICBTS0xfSERDUF9DTEVB Ul9LRVlTX1RSSUdHRVIJQklUKDMwKQo+ICsjZGVmaW5lIFNLTF9IRENQX0tFWV9TVEFUVVMJCV9N TUlPKDB4NjZjMDQpCj4gKyNkZWZpbmUgIFNLTF9IRENQX0ZVU0VfSU5fUFJPR1JFU1MJQklUKDcp Cj4gKyNkZWZpbmUgIFNLTF9IRENQX0ZVU0VfRVJST1IJCUJJVCg2KQo+ICsjZGVmaW5lICBTS0xf SERDUF9GVVNFX0RPTkUJCUJJVCg1KQo+ICsjZGVmaW5lICBTS0xfSERDUF9LRVlfTE9BRF9TVEFU VVMJQklUKDEpCj4gKyNkZWZpbmUgIFNLTF9IRENQX0tFWV9MT0FEX0RPTkUJCUJJVCgwKQo+ICsj ZGVmaW5lIFNLTF9IRENQX0FLU1ZfTE8JCV9NTUlPKDB4NjZjMTApCj4gKyNkZWZpbmUgU0tMX0hE Q1BfQUtTVl9ISQkJX01NSU8oMHg2NmMxNCkKPiArCj4gKy8qIEhEQ1AgUmVwZWF0ZXIgUmVnaXN0 ZXJzICovCj4gKyNkZWZpbmUgU0tMX0hEQ1BfUkVQX0NUTAkJX01NSU8oMHg2NmQwMCkKPiArI2Rl ZmluZSAgU0tMX0hEQ1BfRERJQl9SRVBfUFJFU0VOVAlCSVQoMzApCj4gKyNkZWZpbmUgIFNLTF9I RENQX0RESUFfUkVQX1BSRVNFTlQJQklUKDI5KQo+ICsjZGVmaW5lICBTS0xfSERDUF9ERElDX1JF UF9QUkVTRU5UCUJJVCgyOCkKPiArI2RlZmluZSAgU0tMX0hEQ1BfRERJRF9SRVBfUFJFU0VOVAlC SVQoMjcpCj4gKyNkZWZpbmUgIFNLTF9IRENQX0RESUZfUkVQX1BSRVNFTlQJQklUKDI2KQo+ICsj ZGVmaW5lICBTS0xfSERDUF9ERElFX1JFUF9QUkVTRU5UCUJJVCgyNSkKPiArI2RlZmluZSAgU0tM X0hEQ1BfRERJQl9TSEExX00wCQkoMSA8PCAyMCkKPiArI2RlZmluZSAgU0tMX0hEQ1BfRERJQV9T SEExX00wCQkoMiA8PCAyMCkKPiArI2RlZmluZSAgU0tMX0hEQ1BfRERJQ19TSEExX00wCQkoMyA8 PCAyMCkKPiArI2RlZmluZSAgU0tMX0hEQ1BfRERJRF9TSEExX00wCQkoNCA8PCAyMCkKPiArI2Rl ZmluZSAgU0tMX0hEQ1BfRERJRl9TSEExX00wCQkoNSA8PCAyMCkKPiArI2RlZmluZSAgU0tMX0hE Q1BfRERJRV9TSEExX00wCQkoNiA8PCAyMCkgLy8gQnNwZWMgc2F5cyA1Pwo+ICsjZGVmaW5lICBT S0xfSERDUF9TSEExX0JVU1kJCUJJVCgxNikKPiArI2RlZmluZSAgU0tMX0hEQ1BfU0hBMV9SRUFE WQkJQklUKDE3KQo+ICsjZGVmaW5lICBTS0xfSERDUF9TSEExX0NPTVBMRVRFCQlCSVQoMTgpCj4g KyNkZWZpbmUgIFNLTF9IRENQX1NIQTFfVl9NQVRDSAkJQklUKDE5KQo+ICsjZGVmaW5lICBTS0xf SERDUF9TSEExX1RFWFRfMzIJCSgxIDw8IDEpCj4gKyNkZWZpbmUgIFNLTF9IRENQX1NIQTFfQ09N UExFVEVfSEFTSAkoMiA8PCAxKQo+ICsjZGVmaW5lICBTS0xfSERDUF9TSEExX1RFWFRfMjQJCSg0 IDw8IDEpCj4gKyNkZWZpbmUgIFNLTF9IRENQX1NIQTFfVEVYVF8xNgkJKDUgPDwgMSkKPiArI2Rl ZmluZSAgU0tMX0hEQ1BfU0hBMV9URVhUXzgJCSg2IDw8IDEpCj4gKyNkZWZpbmUgIFNLTF9IRENQ X1NIQTFfVEVYVF8wCQkoNyA8PCAxKQo+ICsjZGVmaW5lIFNLTF9IRENQX1NIQV9WX1BSSU1FX0gw CQlfTU1JTygweDY2ZDA0KQo+ICsjZGVmaW5lIFNLTF9IRENQX1NIQV9WX1BSSU1FX0gxCQlfTU1J TygweDY2ZDA4KQo+ICsjZGVmaW5lIFNLTF9IRENQX1NIQV9WX1BSSU1FX0gyCQlfTU1JTygweDY2 ZDBDKQo+ICsjZGVmaW5lIFNLTF9IRENQX1NIQV9WX1BSSU1FX0gzCQlfTU1JTygweDY2ZDEwKQo+ ICsjZGVmaW5lIFNLTF9IRENQX1NIQV9WX1BSSU1FX0g0CQlfTU1JTygweDY2ZDE0KQo+ICsjZGVm aW5lIFNLTF9IRENQX1NIQV9WX1BSSU1FKGgpCQlfTU1JTygoMHg2NmQwNCArIGggKiA0KSkKPiAr I2RlZmluZSBTS0xfSERDUF9TSEFfVEVYVAkJX01NSU8oMHg2NmQxOCkKPiArCj4gKy8qIEhEQ1Ag QXV0aCBSZWdpc3RlcnMgKi8KPiArI2RlZmluZSBfU0tMX1BPUlRBX0hEQ1BfQVVUSEVOQwkJMHg2 NjgwMAo+ICsjZGVmaW5lIF9TS0xfUE9SVEJfSERDUF9BVVRIRU5DCQkweDY2NTAwCj4gKyNkZWZp bmUgX1NLTF9QT1JUQ19IRENQX0FVVEhFTkMJCTB4NjY2MDAKPiArI2RlZmluZSBfU0tMX1BPUlRE X0hEQ1BfQVVUSEVOQwkJMHg2NjcwMAo+ICsjZGVmaW5lIF9TS0xfUE9SVEVfSERDUF9BVVRIRU5D CQkweDY2QTAwCj4gKyNkZWZpbmUgX1NLTF9QT1JURl9IRENQX0FVVEhFTkMJCTB4NjY5MDAKPiAr I2RlZmluZSBfU0tMX1BPUlRfSERDUF9BVVRIRU5DKHBvcnQsIHgpCV9NTUlPKF9QSUNLKHBvcnQs IFwKPiArCQkJCQkgIF9TS0xfUE9SVEFfSERDUF9BVVRIRU5DLCBcCj4gKwkJCQkJICBfU0tMX1BP UlRCX0hEQ1BfQVVUSEVOQywgXAo+ICsJCQkJCSAgX1NLTF9QT1JUQ19IRENQX0FVVEhFTkMsIFwK PiArCQkJCQkgIF9TS0xfUE9SVERfSERDUF9BVVRIRU5DLCBcCj4gKwkJCQkJICBfU0tMX1BPUlRF X0hEQ1BfQVVUSEVOQywgXAo+ICsJCQkJCSAgX1NLTF9QT1JURl9IRENQX0FVVEhFTkMpICsgeCkK PiArI2RlZmluZSBTS0xfUE9SVF9IRENQX0NPTkYocG9ydCkJX1NLTF9QT1JUX0hEQ1BfQVVUSEVO Qyhwb3J0LCAweDApCj4gKyNkZWZpbmUgIFNLTF9IRENQX0NPTkZfQ0FQVFVSRV9BTglCSVQoMCkK PiArI2RlZmluZSAgU0tMX0hEQ1BfQ09ORl9BVVRIX0FORF9FTkMJKEJJVCgxKSB8IEJJVCgwKSkK PiArI2RlZmluZSBTS0xfUE9SVF9IRENQX0FOSU5JVChwb3J0KQlfU0tMX1BPUlRfSERDUF9BVVRI RU5DKHBvcnQsIDB4NCkKPiArI2RlZmluZSBTS0xfUE9SVF9IRENQX0FOTE8ocG9ydCkJX1NLTF9Q T1JUX0hEQ1BfQVVUSEVOQyhwb3J0LCAweDgpCj4gKyNkZWZpbmUgU0tMX1BPUlRfSERDUF9BTkhJ KHBvcnQpCV9TS0xfUE9SVF9IRENQX0FVVEhFTkMocG9ydCwgMHhDKQo+ICsjZGVmaW5lIFNLTF9Q T1JUX0hEQ1BfQktTVkxPKHBvcnQpCV9TS0xfUE9SVF9IRENQX0FVVEhFTkMocG9ydCwgMHgxMCkK PiArI2RlZmluZSBTS0xfUE9SVF9IRENQX0JLU1ZISShwb3J0KQlfU0tMX1BPUlRfSERDUF9BVVRI RU5DKHBvcnQsIDB4MTQpCj4gKyNkZWZpbmUgU0tMX1BPUlRfSERDUF9SUFJJTUUocG9ydCkJX1NL TF9QT1JUX0hEQ1BfQVVUSEVOQyhwb3J0LCAweDE4KQo+ICsjZGVmaW5lIFNLTF9QT1JUX0hEQ1Bf U1RBVFVTKHBvcnQpCV9TS0xfUE9SVF9IRENQX0FVVEhFTkMocG9ydCwgMHgxQykKPiArI2RlZmlu ZSAgU0tMX0hEQ1BfU1RBVFVTX1NUUkVBTV9BX0VOQwlCSVQoMzEpCj4gKyNkZWZpbmUgIFNLTF9I RENQX1NUQVRVU19TVFJFQU1fQl9FTkMJQklUKDMwKQo+ICsjZGVmaW5lICBTS0xfSERDUF9TVEFU VVNfU1RSRUFNX0NfRU5DCUJJVCgyOSkKPiArI2RlZmluZSAgU0tMX0hEQ1BfU1RBVFVTX1NUUkVB TV9EX0VOQwlCSVQoMjgpCj4gKyNkZWZpbmUgIFNLTF9IRENQX1NUQVRVU19BVVRICQlCSVQoMjEp Cj4gKyNkZWZpbmUgIFNLTF9IRENQX1NUQVRVU19FTkMJCUJJVCgyMCkKPiArI2RlZmluZSAgU0tM X0hEQ1BfU1RBVFVTX1JJX01BVENICUJJVCgxOSkKPiArI2RlZmluZSAgU0tMX0hEQ1BfU1RBVFVT X1IwX1JFQURZCUJJVCgxOCkKPiArI2RlZmluZSAgU0tMX0hEQ1BfU1RBVFVTX0FOX1JFQURZCUJJ VCgxNykKPiArI2RlZmluZSAgU0tMX0hEQ1BfU1RBVFVTX0NJUEhFUgkJQklUKDE2KQo+ICsjZGVm aW5lICBTS0xfSERDUF9TVEFUVVNfRlJBTUVfQ05UKHgpCSgoeCA+PiA4KSAmIDB4ZmYpCj4gKwo+ ICAgLyogUGVyLXBpcGUgRERJIEZ1bmN0aW9uIENvbnRyb2wgKi8KPiAgICNkZWZpbmUgX1RSQU5T X0RESV9GVU5DX0NUTF9BCQkweDYwNDAwCj4gICAjZGVmaW5lIF9UUkFOU19ERElfRlVOQ19DVExf QgkJMHg2MTQwMAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9hdG9t aWMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2F0b21pYy5jCj4gaW5kZXggMzZkNGU2 MzVlNGNlLi5kZGYwODIyN2Q5Y2IgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfYXRvbWljLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9hdG9taWMu Ywo+IEBAIC0xMDksMTIgKzEwOSwzNCBAQCBpbnQgaW50ZWxfZGlnaXRhbF9jb25uZWN0b3JfYXRv bWljX2NoZWNrKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uLAo+ICAgCXN0cnVjdCBpbnRlbF9k aWdpdGFsX2Nvbm5lY3Rvcl9zdGF0ZSAqb2xkX2Nvbm5fc3RhdGUgPQo+ICAgCQl0b19pbnRlbF9k aWdpdGFsX2Nvbm5lY3Rvcl9zdGF0ZShvbGRfc3RhdGUpOwo+ICAgCXN0cnVjdCBkcm1fY3J0Y19z dGF0ZSAqY3J0Y19zdGF0ZTsKPiAtCj4gLQlpZiAoIW5ld19zdGF0ZS0+Y3J0YykKPiArCXVpbnQ2 NF90IG9sZF9jcCA9IG9sZF9jb25uX3N0YXRlLT5iYXNlLmNvbnRlbnRfcHJvdGVjdGlvbjsKPiAr CXVpbnQ2NF90IG5ld19jcCA9IG5ld19zdGF0ZS0+Y29udGVudF9wcm90ZWN0aW9uOwo+ICsKPiAr CWlmICghbmV3X3N0YXRlLT5jcnRjKSB7Cj4gKwkJLyoKPiArCQkgKiBJZiB0aGUgY29ubmVjdG9y IGlzIGJlaW5nIGRpc2FibGVkIHdpdGggQ1AgZW5hYmxlZCwgbWFyayBpdAo+ICsJCSAqIGRlc2ly ZWQgc28gaXQncyByZS1lbmFibGVkIHdoZW4gdGhlIGNvbm5lY3RvciBpcyBicm91Z2h0IGJhY2sK PiArCQkgKi8KPiArCQlpZiAob2xkX2NwID09IERSTV9NT0RFX0NPTlRFTlRfUFJPVEVDVElPTl9F TkFCTEVEKQo+ICsJCQluZXdfc3RhdGUtPmNvbnRlbnRfcHJvdGVjdGlvbiA9Cj4gKwkJCQlEUk1f TU9ERV9DT05URU5UX1BST1RFQ1RJT05fREVTSVJFRDsKPiAgIAkJcmV0dXJuIDA7Cj4gKwl9Cj4g ICAKPiAgIAljcnRjX3N0YXRlID0gZHJtX2F0b21pY19nZXRfbmV3X2NydGNfc3RhdGUobmV3X3N0 YXRlLT5zdGF0ZSwgbmV3X3N0YXRlLT5jcnRjKTsKPiAgIAo+ICsJaWYgKG5ld19jcCAhPSBvbGRf Y3ApIHsKPiArCQkvKiBPbmx5IGRyaXZlcnMgY2FuIHNldCBjb250ZW50IHByb3RlY3Rpb24gZW5h YmxlZCAqLwo+ICsJCWlmIChuZXdfY3AgPT0gRFJNX01PREVfQ09OVEVOVF9QUk9URUNUSU9OX0VO QUJMRUQpCj4gKwkJCW5ld19zdGF0ZS0+Y29udGVudF9wcm90ZWN0aW9uID0KPiArCQkJCURSTV9N T0RFX0NPTlRFTlRfUFJPVEVDVElPTl9ERVNJUkVEOwo+ICsKPiArCQkvKiBJbnZvbHZlIHRoZSBl bmNvZGVyL2Nvbm5lY3RvciB0byBlbmFibGUvZGlzYWJsZSBDUCAqLwo+ICsJCWlmIChuZXdfY3Ag PT0gRFJNX01PREVfQ09OVEVOVF9QUk9URUNUSU9OX09GRiB8fAo+ICsJCSAgICBvbGRfY3AgPT0g RFJNX01PREVfQ09OVEVOVF9QUk9URUNUSU9OX09GRikKPiArCQkJY3J0Y19zdGF0ZS0+bW9kZV9j aGFuZ2VkID0gdHJ1ZTsKCldlIG5lZWQgbm90IHBlcmZvcm0gdGhlIG1vZGUgc2V0IGZvciBoZGNw IGVuYWJsZS9kaXNhYmxlLgpBdXRoZW50aWNhdGlvbiBhbmQgZW5jcnlwdGlvbiBjYW4gYmUgc3Rh cnRlZCBvbiBhY3RpdmUgcG9ydC4KCj4gKwl9Cj4gKwo+ICAgCS8qCj4gICAJICogVGhlc2UgcHJv cGVydGllcyBhcmUgaGFuZGxlZCBieSBmYXN0c2V0LCBhbmQgbWlnaHQgbm90IGVuZAo+ICAgCSAq IHVwIGluIGEgbW9kZXNldC4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50 ZWxfZGRpLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kZGkuYwo+IGluZGV4IDkzM2Mx OGZkNDI1OC4uMGU2OTMzN2Y0MTBkIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2ludGVsX2RkaS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGRpLmMKPiBA QCAtMjQzMiwxMCArMjQzMiwxNyBAQCBzdGF0aWMgdm9pZCBpbnRlbF9lbmFibGVfZGRpKHN0cnVj dCBpbnRlbF9lbmNvZGVyICplbmNvZGVyLAo+ICAgCQkJICAgICBjb25zdCBzdHJ1Y3QgaW50ZWxf Y3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZSwKPiAgIAkJCSAgICAgY29uc3Qgc3RydWN0IGRybV9jb25u ZWN0b3Jfc3RhdGUgKmNvbm5fc3RhdGUpCj4gICB7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAq Y29ubmVjdG9yID0gY29ubl9zdGF0ZS0+Y29ubmVjdG9yOwo+ICsJc3RydWN0IGludGVsX2Nvbm5l Y3RvciAqaW50ZWxfY29ubmVjdG9yID0gdG9faW50ZWxfY29ubmVjdG9yKGNvbm5lY3Rvcik7Cj4g Kwo+ICAgCWlmIChpbnRlbF9jcnRjX2hhc190eXBlKGNydGNfc3RhdGUsIElOVEVMX09VVFBVVF9I RE1JKSkKPiAgIAkJaW50ZWxfZW5hYmxlX2RkaV9oZG1pKGVuY29kZXIsIGNydGNfc3RhdGUsIGNv bm5fc3RhdGUpOwo+ICAgCWVsc2UKPiAgIAkJaW50ZWxfZW5hYmxlX2RkaV9kcChlbmNvZGVyLCBj cnRjX3N0YXRlLCBjb25uX3N0YXRlKTsKPiArCj4gKwlpZiAoY29ubl9zdGF0ZS0+Y29udGVudF9w cm90ZWN0aW9uID09Cj4gKwkJCURSTV9NT0RFX0NPTlRFTlRfUFJPVEVDVElPTl9ERVNJUkVEKQo+ ICsJCWludGVsX2hkY3BfZW5hYmxlKGludGVsX2Nvbm5lY3Rvcik7Cj4gICB9Cj4gICAKPiAgIHN0 YXRpYyB2b2lkIGludGVsX2Rpc2FibGVfZGRpX2RwKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNv ZGVyLAo+IEBAIC0yNDY4LDEwICsyNDc1LDE3IEBAIHN0YXRpYyB2b2lkIGludGVsX2Rpc2FibGVf ZGRpKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyLAo+ICAgCQkJICAgICAgY29uc3Qgc3Ry dWN0IGludGVsX2NydGNfc3RhdGUgKm9sZF9jcnRjX3N0YXRlLAo+ICAgCQkJICAgICAgY29uc3Qg c3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKm9sZF9jb25uX3N0YXRlKQo+ICAgewo+ICsJc3Ry dWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IG9sZF9jb25uX3N0YXRlLT5jb25uZWN0b3I7 Cj4gKwlzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICppbnRlbF9jb25uZWN0b3IgPSB0b19pbnRlbF9j b25uZWN0b3IoY29ubmVjdG9yKTsKPiArCj4gICAJaWYgKGludGVsX2NydGNfaGFzX3R5cGUob2xk X2NydGNfc3RhdGUsIElOVEVMX09VVFBVVF9IRE1JKSkKPiAgIAkJaW50ZWxfZGlzYWJsZV9kZGlf aGRtaShlbmNvZGVyLCBvbGRfY3J0Y19zdGF0ZSwgb2xkX2Nvbm5fc3RhdGUpOwo+ICAgCWVsc2UK PiAgIAkJaW50ZWxfZGlzYWJsZV9kZGlfZHAoZW5jb2Rlciwgb2xkX2NydGNfc3RhdGUsIG9sZF9j b25uX3N0YXRlKTsKPiArCj4gKwlpZiAob2xkX2Nvbm5fc3RhdGUtPmNvbnRlbnRfcHJvdGVjdGlv biAhPQo+ICsJCQlEUk1fTU9ERV9DT05URU5UX1BST1RFQ1RJT05fT0ZGKQo+ICsJCWludGVsX2hk Y3BfZGlzYWJsZShpbnRlbF9jb25uZWN0b3IpOwpXZSBtaWdodCB3YW50IHRvIGRpc2FibGUgdGhl IGhkY3AgYmVmb3JlIGRpc2FibGluZyB0aGUgRERJLiBBY3R1YWxseSB3ZSAKY291bGQgdHJpZ2dl ciBoZGNwIGRpc2FibGUgYXQgY29ubmVjdG9yIHN0YXRlIGNoYW5nZShkdWUgdG8gaG90LXVucGx1 ZykgCmFsc28uCgpUaGFua3MsCi0tUmFtCj4gICB9Cj4gICAKPiAgIHN0YXRpYyB2b2lkIGJ4dF9k ZGlfcHJlX3BsbF9lbmFibGUoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIsCj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvaW50ZWxfZHJ2LmgKPiBpbmRleCA0N2QwMjJkNDg3MTguLjg5MjQwMDQ1NzViOCAxMDA2 NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaAo+ICsrKyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oCj4gQEAgLTI5OSw2ICsyOTksNDkgQEAgc3RydWN0 IGludGVsX3BhbmVsIHsKPiAgIAl9IGJhY2tsaWdodDsKPiAgIH07Cj4gICAKPiArc3RydWN0IGlu dGVsX2hkY3Bfc2hpbSB7Cj4gKwkvKiBPdXRwdXRzIHRoZSB0cmFuc21pdHRlcidzIEFuIGFuZCBB a3N2IHZhbHVlcyB0byB0aGUgcmVjZWl2ZXIuICovCj4gKwlpbnQgKCp3cml0ZV9hbl9ha3N2KShz dHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICppbnRlbF9kaWdfcG9ydCwgdTggKmFuKTsKPiArCj4g KwkvKiBSZWFkcyB0aGUgcmVjZWl2ZXIncyBrZXkgc2VsZWN0aW9uIHZlY3RvciAqLwo+ICsJaW50 ICgqcmVhZF9ia3N2KShzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICppbnRlbF9kaWdfcG9ydCwg dTggKmJrc3YpOwo+ICsKPiArCS8qCj4gKwkgKiBSZWFkcyBCSU5GTyBmcm9tIERQIHJlY2VpdmVy cyBhbmQgQlNUQVRVUyBmcm9tIEhETUkgcmVjZWl2ZXJzLiBUaGUKPiArCSAqIGRlZmluaXRpb25z IGFyZSB0aGUgc2FtZSBpbiB0aGUgcmVzcGVjdGl2ZSBzcGVjcywgYnV0IHRoZSBuYW1lcyBhcmUK PiArCSAqIGRpZmZlcmVudC4gQ2FsbCBpdCBCU1RBVFVTIHNpbmNlIHRoYXQncyB0aGUgbmFtZSB0 aGUgSERNSSBzcGVjCj4gKwkgKiB1c2VzIGFuZCBpdCB3YXMgdGhlcmUgZmlyc3QuCj4gKwkgKi8K PiArCWludCAoKnJlYWRfYnN0YXR1cykoc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqaW50ZWxf ZGlnX3BvcnQsCj4gKwkJCSAgICB1OCAqYnN0YXR1cyk7Cj4gKwo+ICsJLyogRGV0ZXJtaW5lcyB3 aGV0aGVyIGEgcmVwZWF0ZXIgaXMgcHJlc2VudCBkb3duc3RyZWFtICovCj4gKwlpbnQgKCpyZXBl YXRlcl9wcmVzZW50KShzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICppbnRlbF9kaWdfcG9ydCwK PiArCQkJCWJvb2wgKnJlcGVhdGVyX3ByZXNlbnQpOwo+ICsKPiArCS8qIFJlYWRzIHRoZSByZWNl aXZlcidzIFJpJyB2YWx1ZSAqLwo+ICsJaW50ICgqcmVhZF9yaV9wcmltZSkoc3RydWN0IGludGVs X2RpZ2l0YWxfcG9ydCAqaW50ZWxfZGlnX3BvcnQsIHU4ICpyaSk7Cj4gKwo+ICsJLyogRGV0ZXJt aW5lcyBpZiB0aGUgcmVjZWl2ZXIncyBLU1YgRklGTyBpcyByZWFkeSBmb3IgY29uc3VtcHRpb24g Ki8KPiArCWludCAoKnJlYWRfa3N2X3JlYWR5KShzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICpp bnRlbF9kaWdfcG9ydCwKPiArCQkJICAgICAgYm9vbCAqa3N2X3JlYWR5KTsKPiArCj4gKwkvKiBS ZWFkcyB0aGUga3N2IGZpZm8gZm9yIG51bV9kb3duc3RyZWFtIGRldmljZXMgKi8KPiArCWludCAo KnJlYWRfa3N2X2ZpZm8pKHN0cnVjdCBpbnRlbF9kaWdpdGFsX3BvcnQgKmludGVsX2RpZ19wb3J0 LAo+ICsJCQkgICAgIGludCBudW1fZG93bnN0cmVhbSwgdTggKmtzdl9maWZvKTsKPiArCj4gKwkv KiBSZWFkcyBhIDMyLWJpdCBwYXJ0IG9mIFYnIGZyb20gdGhlIHJlY2VpdmVyICovCj4gKwlpbnQg KCpyZWFkX3ZfcHJpbWVfcGFydCkoc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqaW50ZWxfZGln X3BvcnQsCj4gKwkJCQkgaW50IGksIHUzMiAqcGFydCk7Cj4gKwo+ICsJLyogRW5hYmxlcyBIRENQ IHNpZ25hbGxpbmcgb24gdGhlIHBvcnQgKi8KPiArCWludCAoKnRvZ2dsZV9zaWduYWxsaW5nKShz dHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICppbnRlbF9kaWdfcG9ydCwKPiArCQkJCSBib29sIGVu YWJsZSk7Cj4gKwo+ICsJLyogRW5zdXJlcyB0aGUgbGluayBpcyBzdGlsbCBwcm90ZWN0ZWQgKi8K PiArCWJvb2wgKCpjaGVja19saW5rKShzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICppbnRlbF9k aWdfcG9ydCk7Cj4gK307Cj4gKwo+ICAgc3RydWN0IGludGVsX2Nvbm5lY3RvciB7Cj4gICAJc3Ry dWN0IGRybV9jb25uZWN0b3IgYmFzZTsKPiAgIAkvKgo+IEBAIC0zMzAsNiArMzczLDkgQEAgc3Ry dWN0IGludGVsX2Nvbm5lY3RvciB7Cj4gICAKPiAgIAkvKiBXb3JrIHN0cnVjdCB0byBzY2hlZHVs ZSBhIHVldmVudCBvbiBsaW5rIHRyYWluIGZhaWx1cmUgKi8KPiAgIAlzdHJ1Y3Qgd29ya19zdHJ1 Y3QgbW9kZXNldF9yZXRyeV93b3JrOwo+ICsKPiArCWNvbnN0IHN0cnVjdCBpbnRlbF9oZGNwX3No aW0gKmhkY3Bfc2hpbTsKPiArCXN0cnVjdCBkZWxheWVkX3dvcmsgaGRjcF93b3JrOwo+ICAgfTsK PiAgIAo+ICAgc3RydWN0IGludGVsX2RpZ2l0YWxfY29ubmVjdG9yX3N0YXRlIHsKPiBAQCAtMTI5 NSw2ICsxMzQxLDggQEAgdm9pZCBpbnRlbF9kZGlfc2V0X3ZjX3BheWxvYWRfYWxsb2MoY29uc3Qg c3RydWN0IGludGVsX2NydGNfc3RhdGUgKmNydGNfc3RhdGUsCj4gICAJCQkJICAgIGJvb2wgc3Rh dGUpOwo+ICAgdTMyIGJ4dF9zaWduYWxfbGV2ZWxzKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAp Owo+ICAgdWludDMyX3QgZGRpX3NpZ25hbF9sZXZlbHMoc3RydWN0IGludGVsX2RwICppbnRlbF9k cCk7Cj4gK2ludCBpbnRlbF9kZGlfZW5hYmxlX2hkY3Bfc2lnbmFsbGluZyhzdHJ1Y3QgaW50ZWxf ZW5jb2RlciAqaW50ZWxfZW5jb2Rlcik7Cj4gK2ludCBpbnRlbF9kZGlfZGlzYWJsZV9oZGNwX3Np Z25hbGxpbmcoc3RydWN0IGludGVsX2VuY29kZXIgKmludGVsX2VuY29kZXIpOwo+ICAgdTggaW50 ZWxfZGRpX2RwX3ZvbHRhZ2VfbWF4KHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKTsKPiAg IAo+ICAgdW5zaWduZWQgaW50IGludGVsX2ZiX2FsaWduX2hlaWdodChjb25zdCBzdHJ1Y3QgZHJt X2ZyYW1lYnVmZmVyICpmYiwKPiBAQCAtMTc0Niw2ICsxNzk0LDExIEBAIHN0YXRpYyBpbmxpbmUg dm9pZCBpbnRlbF9iYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGludGVsX2Nvbm5l Y3RvciAqY29uCj4gICB9Cj4gICAjZW5kaWYgLyogQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJ Q0UgKi8KPiAgIAo+ICsvKiBpbnRlbF9oZGNwLmMgKi8KPiAraW50IGludGVsX2hkY3BfZW5hYmxl KHN0cnVjdCBpbnRlbF9jb25uZWN0b3IgKmNvbm5lY3Rvcik7Cj4gK2ludCBpbnRlbF9oZGNwX2Rp c2FibGUoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKPiAraW50IGludGVsX2hk Y3BfY2hlY2tfbGluayhzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpOwo+ICt2b2lk IGludGVsX2hkY3Bfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwo+ICAgCj4gICAvKiBp bnRlbF9wc3IuYyAqLwo+ICAgdm9pZCBpbnRlbF9wc3JfZW5hYmxlKHN0cnVjdCBpbnRlbF9kcCAq aW50ZWxfZHAsCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkY3Au YyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2hkY3AuYwo+IG5ldyBmaWxlIG1vZGUgMTAw NjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi5hMmE1NzVlZDY1N2UKPiAtLS0gL2Rldi9udWxsCj4g KysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfaGRjcC5jCj4gQEAgLTAsMCArMSw2MzYg QEAKPiArLyoKPiArICogQ29weXJpZ2h0IChDKSAyMDE3IEdvb2dsZSwgSW5jLgo+ICsgKgo+ICsg KiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljCj4gKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhl IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCj4gKyAqIG1heSBiZSBjb3BpZWQsIGRpc3Ry aWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCj4gKyAqCj4gKyAqIFRoaXMg cHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs LAo+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll ZCB3YXJyYW50eSBvZgo+ICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCj4gKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGZvciBtb3JlIGRldGFpbHMuCj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgPGRybS9kcm1QLmg+Cj4g KyNpbmNsdWRlIDxkcm0vZHJtX2hkY3AuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgo+ICsj aW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Cj4gKwo+ICsjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCj4g KyNpbmNsdWRlICJpOTE1X3JlZy5oIgo+ICsKPiArI2RlZmluZSBLRVlfTE9BRF9UUklFUwk1Cj4g Kwo+ICtzdGF0aWMgaW50IGludGVsX2hkY3BfcG9sbF9rc3ZfZmlmbyhzdHJ1Y3QgaW50ZWxfZGln aXRhbF9wb3J0ICppbnRlbF9kaWdfcG9ydCwKPiArCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW50ZWxf aGRjcF9zaGltICpzaGltKQo+ICt7Cj4gKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVz ICsgbXNlY3NfdG9famlmZmllc190aW1lb3V0KDUwMCk7Cj4gKwlpbnQgcmV0Owo+ICsJYm9vbCBr c3ZfcmVhZHk7Cj4gKwo+ICsJd2hpbGUgKHRydWUpIHsKPiArCQlyZXQgPSBzaGltLT5yZWFkX2tz dl9yZWFkeShpbnRlbF9kaWdfcG9ydCwgJmtzdl9yZWFkeSk7Cj4gKwkJaWYgKHJldCkKPiArCQkJ cmV0dXJuIHJldDsKPiArCQlpZiAoa3N2X3JlYWR5KQo+ICsJCQlicmVhazsKPiArCQlpZiAodGlt ZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKPiArCQkJcmV0dXJuIC1FVElNRURPVVQ7Cj4gKwkJ bXNsZWVwKDEwMCk7Cj4gKwl9Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQg aW50ZWxfaGRjcF9jbGVhcl9rZXlzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikK PiArewo+ICsJSTkxNV9XUklURShTS0xfSERDUF9LRVlfQ09ORiwgU0tMX0hEQ1BfQ0xFQVJfS0VZ U19UUklHR0VSKTsKPiArCUk5MTVfV1JJVEUoU0tMX0hEQ1BfS0VZX1NUQVRVUywKPiArCQkgICBT S0xfSERDUF9LRVlfTE9BRF9ET05FIHwgU0tMX0hEQ1BfS0VZX0xPQURfU1RBVFVTIHwKPiArCQkg ICBTS0xfSERDUF9GVVNFX0lOX1BST0dSRVNTIHwgU0tMX0hEQ1BfRlVTRV9FUlJPUiB8Cj4gKwkJ ICAgU0tMX0hEQ1BfRlVTRV9ET05FKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBpbnRlbF9oZGNw X2xvYWRfa2V5cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCj4gK3sKPiArCXVu c2lnbmVkIGxvbmcgdGltZW91dDsKPiArCWludCByZXQ7Cj4gKwl1MzIgdmFsOwo+ICsKPiArCS8v IEluaXRpYXRlIGxvYWRpbmcgdGhlIEhEQ1Aga2V5IGZyb20gZnVzZXMKPiArCW11dGV4X2xvY2so JmRldl9wcml2LT5wY3VfbG9jayk7Cj4gKwlyZXQgPSBzYW5keWJyaWRnZV9wY29kZV93cml0ZShk ZXZfcHJpdiwgU0tMX1BDT0RFX0xPQURfSERDUF9LRVlTLCAxKTsKPiArCW11dGV4X3VubG9jaygm ZGV2X3ByaXYtPnBjdV9sb2NrKTsKPiArCWlmIChyZXQpIHsKPiArCQlEUk1fRVJST1IoIkZhaWxl ZCB0byBpbml0aWF0ZSBIRENQIGtleSBsb2FkICglZClcbiIsIHJldCk7Cj4gKwkJcmV0dXJuIHJl dDsKPiArCX0KPiArCj4gKwkvLyBXYWl0IGZvciB0aGUga2V5cyB0byBsb2FkICg1MDB1cykKPiAr CXRpbWVvdXQgPSBqaWZmaWVzICsgbnNlY3NfdG9famlmZmllc190aW1lb3V0KDUwMCAqIDEwMDAp Owo+ICsJd2hpbGUgKHRydWUpIHsKPiArCQl2YWwgPSBJOTE1X1JFQUQoU0tMX0hEQ1BfS0VZX1NU QVRVUyk7Cj4gKwkJaWYgKHZhbCAmIFNLTF9IRENQX0tFWV9MT0FEX0RPTkUpCj4gKwkJCWJyZWFr Owo+ICsJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQo+ICsJCQlyZXR1cm4gLUVU SU1FRE9VVDsKPiArCQl1c2xlZXBfcmFuZ2UoNTAsIDEwMCk7Cj4gKwl9Cj4gKwlpZiAoISh2YWwg JiBTS0xfSERDUF9LRVlfTE9BRF9TVEFUVVMpKQo+ICsJCXJldHVybiAtRU5YSU87Cj4gKwo+ICsJ Ly8gU2VuZCBBa3N2IG92ZXIgdG8gUENIIGRpc3BsYXkgZm9yIHVzZSBpbiBhdXRoZW50aWNhdGlv bgo+ICsJSTkxNV9XUklURShTS0xfSERDUF9LRVlfQ09ORiwgU0tMX0hEQ1BfQUtTVl9TRU5EX1RS SUdHRVIpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICsvKiBSZXR1cm5zIHVwZGF0ZWQg U0hBLTEgaW5kZXggKi8KPiArc3RhdGljIGludCBpbnRlbF93cml0ZV9zaGFfdGV4dChzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiBzaGFfdGV4dCkKPiArewo+ICsJSTkxNV9X UklURShTS0xfSERDUF9TSEFfVEVYVCwgc2hhX3RleHQpOwo+ICsJaWYgKHdhaXRfZm9yKEk5MTVf UkVBRChTS0xfSERDUF9SRVBfQ1RMKSAmIFNLTF9IRENQX1NIQTFfUkVBRFksIDEpKSB7Cj4gKwkJ RFJNX0VSUk9SKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgU0hBMSByZWFkeVxuIik7Cj4gKwkJcmV0 dXJuIC1FVElNRURPVVQ7Cj4gKwl9Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljCj4g K3UzMiBpbnRlbF9oZGNwX2dldF9yZXBlYXRlcl9jdGwoc3RydWN0IGludGVsX2RpZ2l0YWxfcG9y dCAqaW50ZWxfZGlnX3BvcnQpCj4gK3sKPiArCWVudW0gcG9ydCBwb3J0ID0gaW50ZWxfZGlnX3Bv cnQtPnBvcnQ7Cj4gKwlzd2l0Y2gocG9ydCkgewo+ICsJY2FzZSBQT1JUX0E6Cj4gKwkJcmV0dXJu IFNLTF9IRENQX0RESUFfUkVQX1BSRVNFTlQgfCBTS0xfSERDUF9ERElBX1NIQTFfTTA7Cj4gKwlj YXNlIFBPUlRfQjoKPiArCQlyZXR1cm4gU0tMX0hEQ1BfRERJQl9SRVBfUFJFU0VOVCB8IFNLTF9I RENQX0RESUJfU0hBMV9NMDsKPiArCWNhc2UgUE9SVF9DOgo+ICsJCXJldHVybiBTS0xfSERDUF9E RElDX1JFUF9QUkVTRU5UIHwgU0tMX0hEQ1BfRERJQ19TSEExX00wOwo+ICsJY2FzZSBQT1JUX0Q6 Cj4gKwkJcmV0dXJuIFNLTF9IRENQX0RESURfUkVQX1BSRVNFTlQgfCBTS0xfSERDUF9ERElEX1NI QTFfTTA7Cj4gKwljYXNlIFBPUlRfRToKPiArCQlyZXR1cm4gU0tMX0hEQ1BfRERJRV9SRVBfUFJF U0VOVCB8IFNLTF9IRENQX0RESUVfU0hBMV9NMDsKPiArCWRlZmF1bHQ6Cj4gKwkJYnJlYWs7Cj4g Kwl9Cj4gKwlEUk1fRVJST1IoIlVua25vd24gcG9ydCAlZFxuIiwgcG9ydCk7Cj4gKwlyZXR1cm4g LUVJTlZBTDsKPiArfQo+ICsKPiArLyogSW1wbGVtZW50cyBQYXJ0IDIgb2YgdGhlIEhEQ1AgYXV0 aG9yaXphdGlvbiBwcm9jZWR1cmUgKi8KPiArc3RhdGljCj4gK2ludCBpbnRlbF9oZGNwX2F1dGhf ZG93bnN0cmVhbShzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICppbnRlbF9kaWdfcG9ydCwKPiAr CQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlbF9oZGNwX3NoaW0gKnNoaW0pCj4gK3sKPiArCXN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdjsKPiArCXUzMiB2cHJpbWUsIHNoYV90ZXh0 LCBzaGFfbGVmdG92ZXJzLCByZXBfY3RsOwo+ICsJdTggYnN0YXR1c1syXSwgbnVtX2Rvd25zdHJl YW0sICprc3ZfZmlmbzsKPiArCWludCByZXQsIGksIGosIHNoYV9pZHg7Cj4gKwo+ICsJZGV2X3By aXYgPSBpbnRlbF9kaWdfcG9ydC0+YmFzZS5iYXNlLmRldi0+ZGV2X3ByaXZhdGU7Cj4gKwo+ICsJ cmV0ID0gc2hpbS0+cmVhZF9ic3RhdHVzKGludGVsX2RpZ19wb3J0LCBic3RhdHVzKTsKPiArCWlm IChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwkvKiBJZiB0aGVyZSBhcmUgbm8gZG93bnN0 cmVhbSBkZXZpY2VzLCB3ZSdyZSBhbGwgZG9uZS4gKi8KPiArCW51bV9kb3duc3RyZWFtID0gRFJN X0hEQ1BfTlVNX0RPV05TVFJFQU0oYnN0YXR1c1swXSk7Cj4gKwlpZiAobnVtX2Rvd25zdHJlYW0g PT0gMCkgewo+ICsJCURSTV9JTkZPKCJIRENQIGlzIGVuYWJsZWQgKG5vIGRvd25zdHJlYW0gZGV2 aWNlcylcbiIpOwo+ICsJCXJldHVybiAwOwo+ICsJfQo+ICsKPiArCS8vIFBvbGwgZm9yIGtzdiBs aXN0IHJlYWR5IChzcGVjIHNheXMgbWF4IHRpbWUgYWxsb3dlZCBpcyA1cykKPiArCXJldCA9IGlu dGVsX2hkY3BfcG9sbF9rc3ZfZmlmbyhpbnRlbF9kaWdfcG9ydCwgc2hpbSk7Cj4gKwlpZiAocmV0 KSB7Cj4gKwkJRFJNX0VSUk9SKCJLU1YgbGlzdCBmYWlsZWQgdG8gYmVjb21lIHJlYWR5ICglZClc biIsIHJldCk7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlrc3ZfZmlmbyA9IGt6YWxs b2MobnVtX2Rvd25zdHJlYW0gKiBEUk1fSERDUF9LU1ZfTEVOLCBHRlBfS0VSTkVMKTsKPiArCWlm ICgha3N2X2ZpZm8pCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJcmV0ID0gc2hpbS0+cmVh ZF9rc3ZfZmlmbyhpbnRlbF9kaWdfcG9ydCwgbnVtX2Rvd25zdHJlYW0sIGtzdl9maWZvKTsKPiAr CWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwkvLyBQcm9jZXNzIFYnIHZhbHVlcyBm cm9tIHRoZSByZWNlaXZlcgo+ICsJZm9yIChpID0gMDsgaSA8IERSTV9IRENQX1ZfUFJJTUVfTlVN X1BBUlRTOyBpKyspIHsKPiArCQlyZXQgPSBzaGltLT5yZWFkX3ZfcHJpbWVfcGFydChpbnRlbF9k aWdfcG9ydCwgaSwgJnZwcmltZSk7Cj4gKwkJaWYgKHJldCkKPiArCQkJcmV0dXJuIHJldDsKPiAr CQlJOTE1X1dSSVRFKFNLTF9IRENQX1NIQV9WX1BSSU1FKGkpLCB2cHJpbWUpOwo+ICsJfQo+ICsK PiArCS8qCj4gKwkgKiBXZSBuZWVkIHRvIHdyaXRlIHRoZSBjb25jYXRlbmF0aW9uIG9mIGFsbCBk ZXZpY2UgS1NWcywgQklORk8gKERQKSB8fAo+ICsJICogQlNUQVRVUyAoSERNSSksIGFuZCBNMCAo d2hpY2ggaXMgYWRkZWQgdmlhIEhEQ1BfUkVQX0NUTCkuIFRoaXMgYnl0ZQo+ICsJICogc3RyZWFt IGlzIHdyaXR0ZW4gdmlhIHRoZSBIRENQX1NIQV9URVhUIHJlZ2lzdGVyIGluIDMyLWJpdAo+ICsJ ICogaW5jcmVtZW50cy4gRXZlcnkgNjQgYnl0ZXMsIHdlIG5lZWQgdG8gd3JpdGUgSERDUF9SRVBf Q1RMIGFnYWluLiBUaGlzCj4gKwkgKiBpbmRleCB3aWxsIGtlZXAgdHJhY2sgb2Ygb3VyIHByb2dy ZXNzIHRocm91Z2ggdGhlIDY0IGJ5dGVzIGFzIHdlbGwgYXMKPiArCSAqIGhlbHBpbmcgdXMgd29y ayB0aGUgNDAtYml0IEtTVnMgdGhyb3VnaCBvdXIgMzItYml0IHJlZ2lzdGVyLgo+ICsJICoKPiAr CSAqIE5PVEU6IGRhdGEgcGFzc2VkIHZpYSBIRENQX1NIQV9URVhUIHNob3VsZCBiZSBiaWctZW5k aWFuCj4gKwkgKi8KPiArCXNoYV9pZHggPSAwOwo+ICsJc2hhX3RleHQgPSAwOwo+ICsJc2hhX2xl ZnRvdmVycyA9IDA7Cj4gKwlyZXBfY3RsID0gaW50ZWxfaGRjcF9nZXRfcmVwZWF0ZXJfY3RsKGlu dGVsX2RpZ19wb3J0KTsKPiArCUk5MTVfV1JJVEUoU0tMX0hEQ1BfUkVQX0NUTCwgcmVwX2N0bCB8 IFNLTF9IRENQX1NIQTFfVEVYVF8zMik7Cj4gKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Rvd25zdHJl YW07IGkrKykgewo+ICsJCXVuc2lnbmVkIHNoYV9lbXB0eTsKPiArCQl1OCAqa3N2ID0gJmtzdl9m aWZvW2kgKiBEUk1fSERDUF9LU1ZfTEVOXTsKPiArCj4gKwkJLy8gRmlsbCB1cCB0aGUgZW1wdHkg c2xvdHMgaW4gc2hhX3RleHQgYW5kIHdyaXRlIGl0IG91dAo+ICsJCXNoYV9lbXB0eSA9IHNpemVv ZihzaGFfdGV4dCkgLSBzaGFfbGVmdG92ZXJzOwo+ICsJCWZvciAoaiA9IDA7IGogPCBzaGFfZW1w dHk7IGorKykKPiArCQkJc2hhX3RleHQgfD0ga3N2W2pdIDw8ICgoc2l6ZW9mKHNoYV90ZXh0KSAt IGogLSAxKSAqIDgpOwo+ICsKPiArCQlyZXQgPSBpbnRlbF93cml0ZV9zaGFfdGV4dChkZXZfcHJp diwgc2hhX3RleHQpOwo+ICsJCWlmIChyZXQgPCAwKQo+ICsJCQlyZXR1cm4gcmV0Owo+ICsKPiAr CQkvLyBQcm9ncmFtbWluZyBndWlkZSB3cml0ZXMgdGhpcyBldmVyeSA2NCBieXRlcwo+ICsJCXNo YV9pZHggKz0gc2l6ZW9mKHNoYV90ZXh0KTsKPiArCQlpZiAoIShzaGFfaWR4ICUgNjQpKQo+ICsJ CQlJOTE1X1dSSVRFKFNLTF9IRENQX1JFUF9DVEwsCj4gKwkJCQkgICByZXBfY3RsIHwgU0tMX0hE Q1BfU0hBMV9URVhUXzMyKTsKPiArCj4gKwkJLy8gU3RvcmUgdGhlIGxlZnRvdmVyIGJ5dGVzIGZy b20gdGhlIGtzdiBpbiBzaGFfdGV4dAo+ICsJCXNoYV9sZWZ0b3ZlcnMgPSBEUk1fSERDUF9LU1Zf TEVOIC0gc2hhX2VtcHR5Owo+ICsJCXNoYV90ZXh0ID0gMDsKPiArCQlmb3IgKGogPSAwOyBqIDwg c2hhX2xlZnRvdmVyczsgaisrKQo+ICsJCQlzaGFfdGV4dCB8PSBrc3Zbc2hhX2VtcHR5ICsgal0g PDwKPiArCQkJCQkoKHNpemVvZihzaGFfdGV4dCkgLSBqIC0gMSkgKiA4KTsKPiArCj4gKwkJLyoK PiArCQkgKiBJZiB3ZSBzdGlsbCBoYXZlIHJvb20gaW4gc2hhX3RleHQgZm9yIG1vcmUgZGF0YSwg Y29udGludWUuCj4gKwkJICogT3RoZXJ3aXNlLCB3cml0ZSBpdCBvdXQgaW1tZWRpYXRlbHkuCj4g KwkJICovCj4gKwkJaWYgKHNpemVvZihzaGFfdGV4dCkgPiBzaGFfbGVmdG92ZXJzKQo+ICsJCQlj b250aW51ZTsKPiArCj4gKwkJcmV0ID0gaW50ZWxfd3JpdGVfc2hhX3RleHQoZGV2X3ByaXYsIHNo YV90ZXh0KTsKPiArCQlpZiAocmV0IDwgMCkKPiArCQkJcmV0dXJuIHJldDsKPiArCQlzaGFfbGVm dG92ZXJzID0gMDsKPiArCQlzaGFfdGV4dCA9IDA7Cj4gKwkJc2hhX2lkeCArPSBzaXplb2Yoc2hh X3RleHQpOwo+ICsJfQo+ICsKPiArCS8qCj4gKwkgKiBXZSBuZWVkIHRvIHdyaXRlIEJJTkZPL0JT VEFUVVMsIGFuZCBNMCBub3cuIERlcGVuZGluZyBvbiBob3cgbWFueQo+ICsJICogYnl0ZXMgYXJl IGxlZnRvdmVyIGZyb20gdGhlIGxhc3Qga3N2LCB3ZSBtaWdodCBiZSBhYmxlIHRvIGZpdCB0aGVt Cj4gKwkgKiBhbGwgaW4gc2hhX3RleHQgKGZpcnN0IDIgY2FzZXMpLCBvciB3ZSBtaWdodCBuZWVk IHRvIHNwbGl0IHRoZW0gdXAKPiArCSAqIGludG8gMiB3cml0ZXMgKGxhc3QgMiBjYXNlcykuCj4g KwkgKi8KPiArCWlmIChzaGFfbGVmdG92ZXJzID09IDApIHsKPiArCQkvLyBXcml0ZSAxNiBiaXRz IG9mIHRleHQsIDE2IGJpdHMgb2YgTTAKPiArCQlJOTE1X1dSSVRFKFNLTF9IRENQX1JFUF9DVEws IHJlcF9jdGwgfCBTS0xfSERDUF9TSEExX1RFWFRfMTYpOwo+ICsJCXJldCA9IGludGVsX3dyaXRl X3NoYV90ZXh0KGRldl9wcml2LAo+ICsJCQkJCSAgIGJzdGF0dXNbMF0gPDwgOCB8IGJzdGF0dXNb MV0pOwo+ICsJCWlmIChyZXQgPCAwKQo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCXNoYV9pZHggKz0g c2l6ZW9mKHNoYV90ZXh0KTsKPiArCj4gKwkJLy8gV3JpdGUgMzIgYml0cyBvZiBNMAo+ICsJCUk5 MTVfV1JJVEUoU0tMX0hEQ1BfUkVQX0NUTCwgcmVwX2N0bCB8IFNLTF9IRENQX1NIQTFfVEVYVF8w KTsKPiArCQlyZXQgPSBpbnRlbF93cml0ZV9zaGFfdGV4dChkZXZfcHJpdiwgMCk7Cj4gKwkJaWYg KHJldCA8IDApCj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJc2hhX2lkeCArPSBzaXplb2Yoc2hhX3Rl eHQpOwo+ICsKPiArCQkvLyBXcml0ZSAxNiBiaXRzIG9mIE0wCj4gKwkJSTkxNV9XUklURShTS0xf SERDUF9SRVBfQ1RMLCByZXBfY3RsIHwgU0tMX0hEQ1BfU0hBMV9URVhUXzE2KTsKPiArCQlyZXQg PSBpbnRlbF93cml0ZV9zaGFfdGV4dChkZXZfcHJpdiwgMCk7Cj4gKwkJaWYgKHJldCA8IDApCj4g KwkJCXJldHVybiByZXQ7Cj4gKwkJc2hhX2lkeCArPSBzaXplb2Yoc2hhX3RleHQpOwo+ICsKPiAr CX0gZWxzZSBpZiAoc2hhX2xlZnRvdmVycyA9PSAxKSB7Cj4gKwkJLy8gV3JpdGUgMjQgYml0cyBv ZiB0ZXh0LCA4IGJpdHMgb2YgTTAKPiArCQlJOTE1X1dSSVRFKFNLTF9IRENQX1JFUF9DVEwsIHJl cF9jdGwgfCBTS0xfSERDUF9TSEExX1RFWFRfMjQpOwo+ICsJCXNoYV90ZXh0IHw9IGJzdGF0dXNb MF0gPDwgMTYgfCBic3RhdHVzWzFdIDw8IDg7Cj4gKwkJLy8gT25seSAyNC1iaXRzIG9mIGRhdGEs IG11c3QgYmUgaW4gdGhlIExTQgo+ICsJCXNoYV90ZXh0ID0gKHNoYV90ZXh0ICYgMHhmZmZmZmYw MCkgPj4gODsKPiArCQlyZXQgPSBpbnRlbF93cml0ZV9zaGFfdGV4dChkZXZfcHJpdiwgc2hhX3Rl eHQpOwo+ICsJCWlmIChyZXQgPCAwKQo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCXNoYV9pZHggKz0g c2l6ZW9mKHNoYV90ZXh0KTsKPiArCj4gKwkJLy8gV3JpdGUgMzIgYml0cyBvZiBNMAo+ICsJCUk5 MTVfV1JJVEUoU0tMX0hEQ1BfUkVQX0NUTCwgcmVwX2N0bCB8IFNLTF9IRENQX1NIQTFfVEVYVF8w KTsKPiArCQlyZXQgPSBpbnRlbF93cml0ZV9zaGFfdGV4dChkZXZfcHJpdiwgMCk7Cj4gKwkJaWYg KHJldCA8IDApCj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJc2hhX2lkeCArPSBzaXplb2Yoc2hhX3Rl eHQpOwo+ICsKPiArCQkvLyBXcml0ZSAyNCBiaXRzIG9mIE0wCj4gKwkJSTkxNV9XUklURShTS0xf SERDUF9SRVBfQ1RMLCByZXBfY3RsIHwgU0tMX0hEQ1BfU0hBMV9URVhUXzgpOwo+ICsJCXJldCA9 IGludGVsX3dyaXRlX3NoYV90ZXh0KGRldl9wcml2LCAwKTsKPiArCQlpZiAocmV0IDwgMCkKPiAr CQkJcmV0dXJuIHJldDsKPiArCQlzaGFfaWR4ICs9IHNpemVvZihzaGFfdGV4dCk7Cj4gKwo+ICsJ fSBlbHNlIGlmIChzaGFfbGVmdG92ZXJzID09IDIpIHsKPiArCQkvLyBXcml0ZSAzMiBiaXRzIG9m IHRleHQKPiArCQlJOTE1X1dSSVRFKFNLTF9IRENQX1JFUF9DVEwsIHJlcF9jdGwgfCBTS0xfSERD UF9TSEExX1RFWFRfMzIpOwo+ICsJCXNoYV90ZXh0IHw9IGJzdGF0dXNbMF0gPDwgMjQgfCBic3Rh dHVzWzFdIDw8IDE2Owo+ICsJCXJldCA9IGludGVsX3dyaXRlX3NoYV90ZXh0KGRldl9wcml2LCBz aGFfdGV4dCk7Cj4gKwkJaWYgKHJldCA8IDApCj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJc2hhX2lk eCArPSBzaXplb2Yoc2hhX3RleHQpOwo+ICsKPiArCQkvLyBXcml0ZSA2NCBiaXRzIG9mIE0wCj4g KwkJSTkxNV9XUklURShTS0xfSERDUF9SRVBfQ1RMLCByZXBfY3RsIHwgU0tMX0hEQ1BfU0hBMV9U RVhUXzApOwo+ICsJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKPiArCQkJcmV0ID0gaW50ZWxf d3JpdGVfc2hhX3RleHQoZGV2X3ByaXYsIDApOwo+ICsJCQlpZiAocmV0IDwgMCkKPiArCQkJCXJl dHVybiByZXQ7Cj4gKwkJCXNoYV9pZHggKz0gc2l6ZW9mKHNoYV90ZXh0KTsKPiArCQl9Cj4gKwl9 IGVsc2UgaWYgKHNoYV9sZWZ0b3ZlcnMgPT0gMykgewo+ICsJCS8vIFdyaXRlIDMyIGJpdHMgb2Yg dGV4dAo+ICsJCUk5MTVfV1JJVEUoU0tMX0hEQ1BfUkVQX0NUTCwgcmVwX2N0bCB8IFNLTF9IRENQ X1NIQTFfVEVYVF8zMik7Cj4gKwkJc2hhX3RleHQgfD0gYnN0YXR1c1swXSA8PCAyNDsKPiArCQly ZXQgPSBpbnRlbF93cml0ZV9zaGFfdGV4dChkZXZfcHJpdiwgc2hhX3RleHQpOwo+ICsJCWlmIChy ZXQgPCAwKQo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCXNoYV9pZHggKz0gc2l6ZW9mKHNoYV90ZXh0 KTsKPiArCj4gKwkJLy8gV3JpdGUgOCBiaXRzIG9mIHRleHQsIDI0IGJpdHMgb2YgTTAKPiArCQlJ OTE1X1dSSVRFKFNLTF9IRENQX1JFUF9DVEwsIHJlcF9jdGwgfCBTS0xfSERDUF9TSEExX1RFWFRf OCk7Cj4gKwkJcmV0ID0gaW50ZWxfd3JpdGVfc2hhX3RleHQoZGV2X3ByaXYsIGJzdGF0dXNbMV0p Owo+ICsJCWlmIChyZXQgPCAwKQo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCXNoYV9pZHggKz0gc2l6 ZW9mKHNoYV90ZXh0KTsKPiArCj4gKwkJLy8gV3JpdGUgMzIgYml0cyBvZiBNMAo+ICsJCUk5MTVf V1JJVEUoU0tMX0hEQ1BfUkVQX0NUTCwgcmVwX2N0bCB8IFNLTF9IRENQX1NIQTFfVEVYVF8wKTsK PiArCQlyZXQgPSBpbnRlbF93cml0ZV9zaGFfdGV4dChkZXZfcHJpdiwgMCk7Cj4gKwkJaWYgKHJl dCA8IDApCj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJc2hhX2lkeCArPSBzaXplb2Yoc2hhX3RleHQp Owo+ICsKPiArCQkvLyBXcml0ZSA4IGJpdHMgb2YgTTAKPiArCQlJOTE1X1dSSVRFKFNLTF9IRENQ X1JFUF9DVEwsIHJlcF9jdGwgfCBTS0xfSERDUF9TSEExX1RFWFRfMjQpOwo+ICsJCXJldCA9IGlu dGVsX3dyaXRlX3NoYV90ZXh0KGRldl9wcml2LCAwKTsKPiArCQlpZiAocmV0IDwgMCkKPiArCQkJ cmV0dXJuIHJldDsKPiArCQlzaGFfaWR4ICs9IHNpemVvZihzaGFfdGV4dCk7Cj4gKwl9IGVsc2Ug ewo+ICsJCURSTV9FUlJPUigiSW52YWxpZCBudW1iZXIgb2YgbGVmdG92ZXJzICVkXG4iLCBzaGFf bGVmdG92ZXJzKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlJOTE1X1dSSVRF KFNLTF9IRENQX1JFUF9DVEwsIHJlcF9jdGwgfCBTS0xfSERDUF9TSEExX1RFWFRfMzIpOwo+ICsJ Ly8gRmlsbCB1cCB0byA2NCAtIDQgYnl0ZXMgd2l0aCB6ZXJvcyAobGVhdmUgdGhlIGxhc3Qgd3Jp dGUgZm9yIGxlbmd0aCkKPiArCXdoaWxlICgoc2hhX2lkeCAlIDY0KSA8ICg2NCAtIHNpemVvZihz aGFfdGV4dCkpKSB7Cj4gKwkJcmV0ID0gaW50ZWxfd3JpdGVfc2hhX3RleHQoZGV2X3ByaXYsIDAp Owo+ICsJCWlmIChyZXQgPCAwKQo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCXNoYV9pZHggKz0gc2l6 ZW9mKHNoYV90ZXh0KTsKPiArCX0KPiArCj4gKwkvKgo+ICsJICogTGFzdCB3cml0ZSBnZXRzIHRo ZSBsZW5ndGggb2YgdGhlIGNvbmNhdGVuYXRpb24gaW4gYml0cy4gVGhhdCBpczoKPiArCSAqICAt IDUgYnl0ZXMgcGVyIGRldmljZQo+ICsJICogIC0gMTAgYnl0ZXMgZm9yIEJJTkZPL0JTVEFUVVMo MiksIE0wKDgpCj4gKwkgKi8KPiArCXNoYV90ZXh0ID0gKG51bV9kb3duc3RyZWFtICogNSArIDEw KSAqIDg7Cj4gKwlyZXQgPSBpbnRlbF93cml0ZV9zaGFfdGV4dChkZXZfcHJpdiwgc2hhX3RleHQp Owo+ICsJaWYgKHJldCA8IDApCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwkvLyBGaW5hbGx5LCB0 ZWxsIHRoZSBIVyB3ZSdyZSBkb25lIHdpdGggdGhlIGhhc2ggYW5kIHdhaXQgZm9yIGl0IHRvIEFD Swo+ICsJSTkxNV9XUklURShTS0xfSERDUF9SRVBfQ1RMLCByZXBfY3RsIHwgU0tMX0hEQ1BfU0hB MV9DT01QTEVURV9IQVNIKTsKPiArCWlmICh3YWl0X2ZvcihJOTE1X1JFQUQoU0tMX0hEQ1BfUkVQ X0NUTCkgJiBTS0xfSERDUF9TSEExX0NPTVBMRVRFLCAxKSkgewo+ICsJCURSTV9FUlJPUigiVGlt ZWQgb3V0IHdhaXRpbmcgZm9yIFNIQTEgY29tcGxldGVcbiIpOwo+ICsJCXJldHVybiAtRVRJTUVE T1VUOwo+ICsJfQo+ICsJaWYgKCEoSTkxNV9SRUFEKFNLTF9IRENQX1JFUF9DVEwpICYgU0tMX0hE Q1BfU0hBMV9WX01BVENIKSkgewo+ICsJCURSTV9FUlJPUigiU0hBLTEgbWlzbWF0Y2gsIEhEQ1Ag ZmFpbGVkXG4iKTsKPiArCQlyZXR1cm4gLUVOWElPOwo+ICsJfQo+ICsKPiArCURSTV9JTkZPKCJI RENQIGlzIGVuYWJsZWQgKCVkIGRvd25zdHJlYW0gZGV2aWNlcylcbiIsIG51bV9kb3duc3RyZWFt KTsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICsvKiBJbXBsZW1lbnRzIFBhcnQgMSBvZiB0aGUg SERDUCBhdXRob3JpemF0aW9uIHByb2NlZHVyZSAqLwo+ICtzdGF0aWMgaW50IGludGVsX2hkY3Bf YXV0aChzdHJ1Y3QgaW50ZWxfZGlnaXRhbF9wb3J0ICppbnRlbF9kaWdfcG9ydCwKPiArCQkJICAg Y29uc3Qgc3RydWN0IGludGVsX2hkY3Bfc2hpbSAqc2hpbSkKPiArewo+ICsJc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2Owo+ICsJZW51bSBwb3J0IHBvcnQ7Cj4gKwl1bnNpZ25lZCBs b25nIHIwX3ByaW1lX2dlbl9zdGFydDsKPiArCWludCByZXQsIGk7Cj4gKwl1bmlvbiB7Cj4gKwkJ dTMyIHJlZ1syXTsKPiArCQl1OCBzaGltW0RSTV9IRENQX0FOX0xFTl07Cj4gKwl9IGFuOwo+ICsJ dW5pb24gewo+ICsJCXUzMiByZWdbMl07Cj4gKwkJdTggc2hpbVtEUk1fSERDUF9LU1ZfTEVOXTsK PiArCX0gYmtzdjsKPiArCXVuaW9uIHsKPiArCQl1MzIgcmVnOwo+ICsJCXU4IHNoaW1bRFJNX0hE Q1BfUklfTEVOXTsKPiArCX0gcmk7Cj4gKwlib29sIHJlcGVhdGVyX3ByZXNlbnQ7Cj4gKwo+ICsJ ZGV2X3ByaXYgPSBpbnRlbF9kaWdfcG9ydC0+YmFzZS5iYXNlLmRldi0+ZGV2X3ByaXZhdGU7Cj4g Kwo+ICsJcG9ydCA9IGludGVsX2RpZ19wb3J0LT5wb3J0Owo+ICsKPiArCS8vIEluaXRpYWxpemUg QW4gd2l0aCAyIHJhbmRvbSB2YWx1ZXMgYW5kIGFjcXVpcmUgaXQKPiArCWZvciAoaSA9IDA7IGkg PCAyOyBpKyspCj4gKwkJSTkxNV9XUklURShTS0xfUE9SVF9IRENQX0FOSU5JVChwb3J0KSwgZ2V0 X3JhbmRvbV9sb25nKCkpOwo+ICsJSTkxNV9XUklURShTS0xfUE9SVF9IRENQX0NPTkYocG9ydCks IFNLTF9IRENQX0NPTkZfQ0FQVFVSRV9BTik7Cj4gKwo+ICsJLy8gV2FpdCBmb3IgQW4gdG8gYmUg YWNxdWlyZWQKPiArCWlmICh3YWl0X2ZvcihJOTE1X1JFQUQoU0tMX1BPUlRfSERDUF9TVEFUVVMo cG9ydCkpICYKPiArCQkgICAgIFNLTF9IRENQX1NUQVRVU19BTl9SRUFEWSwgMSkpIHsKPiArCQlE Uk1fRVJST1IoIlRpbWVkIG91dCB3YWl0aW5nIGZvciBBblxuIik7Cj4gKwkJcmV0dXJuIC1FVElN RURPVVQ7Cj4gKwl9Cj4gKwo+ICsJYW4ucmVnWzBdID0gSTkxNV9SRUFEKFNLTF9QT1JUX0hEQ1Bf QU5MTyhwb3J0KSk7Cj4gKwlhbi5yZWdbMV0gPSBJOTE1X1JFQUQoU0tMX1BPUlRfSERDUF9BTkhJ KHBvcnQpKTsKPiArCXJldCA9IHNoaW0tPndyaXRlX2FuX2Frc3YoaW50ZWxfZGlnX3BvcnQsIGFu LnNoaW0pOwo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCXIwX3ByaW1lX2dl bl9zdGFydCA9IGppZmZpZXM7Cj4gKwo+ICsJbWVtc2V0KCZia3N2LCAwLCBzaXplb2YoYmtzdikp Owo+ICsJcmV0ID0gc2hpbS0+cmVhZF9ia3N2KGludGVsX2RpZ19wb3J0LCBia3N2LnNoaW0pOwo+ ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ICsKPiArCUk5MTVfV1JJVEUoU0tMX1BPUlRf SERDUF9CS1NWTE8ocG9ydCksIGJrc3YucmVnWzBdKTsKPiArCUk5MTVfV1JJVEUoU0tMX1BPUlRf SERDUF9CS1NWSEkocG9ydCksIGJrc3YucmVnWzFdKTsKPiArCj4gKwlyZXQgPSBzaGltLT5yZXBl YXRlcl9wcmVzZW50KGludGVsX2RpZ19wb3J0LCAmcmVwZWF0ZXJfcHJlc2VudCk7Cj4gKwlpZiAo cmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwlpZiAocmVwZWF0ZXJfcHJlc2VudCkKPiArCQlJOTE1 X1dSSVRFKFNLTF9IRENQX1JFUF9DVEwsCj4gKwkJCSAgIGludGVsX2hkY3BfZ2V0X3JlcGVhdGVy X2N0bChpbnRlbF9kaWdfcG9ydCkpOwo+ICsKPiArCXJldCA9IHNoaW0tPnRvZ2dsZV9zaWduYWxs aW5nKGludGVsX2RpZ19wb3J0LCB0cnVlKTsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsK PiArCj4gKwlJOTE1X1dSSVRFKFNLTF9QT1JUX0hEQ1BfQ09ORihwb3J0KSwgU0tMX0hEQ1BfQ09O Rl9BVVRIX0FORF9FTkMpOwo+ICsKPiArCS8vIFdhaXQgZm9yIFIwIHJlYWR5Cj4gKwlpZiAod2Fp dF9mb3IoSTkxNV9SRUFEKFNLTF9QT1JUX0hEQ1BfU1RBVFVTKHBvcnQpKSAmCj4gKwkJICAgICAo U0tMX0hEQ1BfU1RBVFVTX1IwX1JFQURZIHwgU0tMX0hEQ1BfU1RBVFVTX0VOQyksIDEpKSB7Cj4g KwkJRFJNX0VSUk9SKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgUjAgcmVhZHlcbiIpOwo+ICsJCXJl dHVybiAtRVRJTUVET1VUOwo+ICsJfQo+ICsKPiArCS8qCj4gKwkgKiBXYWl0IGZvciBSMCcgdG8g YmVjb21lIGF2YWlsYWJsZSwgdGhlIHNwZWMgc2F5cyAxMDBtcyBmcm9tIEFrc3YKPiArCSAqIHdy aXRlLiBPbiBEUCwgdGhlcmUncyBhbiBSMF9SRUFEWSBiaXQgYXZhaWxhYmxlIGJ1dCBubyBzdWNo IGJpdAo+ICsJICogZXhpc3RzIG9uIEhETUkuIFNpbmNlIHRoZSB1cHBlci1ib3VuZCBpcyB0aGUg c2FtZSwgd2UnbGwganVzdCBkbwo+ICsJICogdGhlIHN0dXBpZCB0aGluZyBpbnN0ZWFkIG9mIHBv bGxpbmcgb24gb25lIGFuZCBub3QgdGhlIG90aGVyLgo+ICsJICovCj4gKwl3YWl0X3JlbWFpbmlu Z19tc19mcm9tX2ppZmZpZXMocjBfcHJpbWVfZ2VuX3N0YXJ0LCAxMDApOwo+ICsKPiArCXJpLnJl ZyA9IDA7Cj4gKwlyZXQgPSBzaGltLT5yZWFkX3JpX3ByaW1lKGludGVsX2RpZ19wb3J0LCByaS5z aGltKTsKPiArCWlmIChyZXQpCj4gKwkJcmV0dXJuIHJldDsKPiArCUk5MTVfV1JJVEUoU0tMX1BP UlRfSERDUF9SUFJJTUUocG9ydCksIHJpLnJlZyk7Cj4gKwo+ICsJLy8gV2FpdCBmb3IgUmkgcHJp bWUgbWF0Y2gKPiArCWlmICh3YWl0X2ZvcihJOTE1X1JFQUQoU0tMX1BPUlRfSERDUF9TVEFUVVMo cG9ydCkpICYKPiArCQkgICAgIChTS0xfSERDUF9TVEFUVVNfUklfTUFUQ0ggfCBTS0xfSERDUF9T VEFUVVNfRU5DKSwgMSkpIHsKPiArCQlEUk1fRVJST1IoIlRpbWVkIG91dCB3YWl0aW5nIGZvciBS aSBwcmltZSBtYXRjaCAoJXgpXG4iLAo+ICsJCQkgIEk5MTVfUkVBRChTS0xfUE9SVF9IRENQX1NU QVRVUyhwb3J0KSkpOwo+ICsJCXJldHVybiAtRVRJTUVET1VUOwo+ICsJfQo+ICsKPiArCS8vIFdh aXQgZm9yIGVuY3J5cHRpb24gY29uZmlybWF0aW9uCj4gKwlpZiAod2FpdF9mb3IoSTkxNV9SRUFE KFNLTF9QT1JUX0hEQ1BfU1RBVFVTKHBvcnQpKSAmCj4gKwkJICAgICAgU0tMX0hEQ1BfU1RBVFVT X0VOQywgMjApKSB7Cj4gKwkJRFJNX0VSUk9SKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgZW5jcnlw dGlvblxuIik7Cj4gKwkJcmV0dXJuIC1FVElNRURPVVQ7Cj4gKwl9Cj4gKwo+ICsJLyoKPiArCSAq IFhYWDogSWYgd2UgaGF2ZSBNU1QtY29ubmVjdGVkIGRldmljZXMsIHdlIG5lZWQgdG8gZW5hYmxl IGVuY3J5cHRpb24KPiArCSAqIG9uIHRob3NlIGFzIHdlbGwuCj4gKwkgKi8KPiArCj4gKwlyZXR1 cm4gaW50ZWxfaGRjcF9hdXRoX2Rvd25zdHJlYW0oaW50ZWxfZGlnX3BvcnQsIHNoaW0pOwo+ICt9 Cj4gKwo+ICtzdGF0aWMKPiArc3RydWN0IGludGVsX2RpZ2l0YWxfcG9ydCAqY29ubl90b19kaWdf cG9ydChzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpCj4gK3sKPiArCXJldHVybiBl bmNfdG9fZGlnX3BvcnQoJmludGVsX2F0dGFjaGVkX2VuY29kZXIoJmNvbm5lY3Rvci0+YmFzZSkt PmJhc2UpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IF9pbnRlbF9oZGNwX2Rpc2FibGUoc3RydWN0 IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqZGV2X3ByaXYgPSBjb25uZWN0b3ItPmJhc2UuZGV2LT5kZXZfcHJpdmF0ZTsKPiArCXN0 cnVjdCBpbnRlbF9kaWdpdGFsX3BvcnQgKmludGVsX2RpZ19wb3J0ID0gY29ubl90b19kaWdfcG9y dChjb25uZWN0b3IpOwo+ICsJZW51bSBwb3J0IHBvcnQgPSBpbnRlbF9kaWdfcG9ydC0+cG9ydDsK PiArCWludCByZXQ7Cj4gKwo+ICsJSTkxNV9XUklURShTS0xfUE9SVF9IRENQX0NPTkYocG9ydCks IDApOwo+ICsJaWYgKHdhaXRfZm9yKEk5MTVfUkVBRChTS0xfUE9SVF9IRENQX1NUQVRVUyhwb3J0 KSkgPT0gMCwgMjApKSB7Cj4gKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gZGlzYWJsZSBIRENQLCB0 aW1lb3V0IGNsZWFyaW5nIHN0YXR1c1xuIik7Cj4gKwkJcmV0dXJuIC1FVElNRURPVVQ7Cj4gKwl9 Cj4gKwo+ICsJaW50ZWxfaGRjcF9jbGVhcl9rZXlzKGRldl9wcml2KTsKPiArCj4gKwlyZXQgPSBj b25uZWN0b3ItPmhkY3Bfc2hpbS0+dG9nZ2xlX3NpZ25hbGxpbmcoaW50ZWxfZGlnX3BvcnQsIGZh bHNlKTsKPiArCWlmIChyZXQpIHsKPiArCQlEUk1fRVJST1IoIkZhaWxlZCB0byBkaXNhYmxlIEhE Q1Agc2lnbmFsbGluZ1xuIik7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlEUk1fSU5G TygiSERDUCBpcyBkaXNhYmxlZFxuIik7Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGlj IGludCBfaW50ZWxfaGRjcF9lbmFibGUoc3RydWN0IGludGVsX2Nvbm5lY3RvciAqY29ubmVjdG9y KQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBjb25uZWN0b3It PmJhc2UuZGV2LT5kZXZfcHJpdmF0ZTsKPiArCWludCBpLCByZXQ7Cj4gKwo+ICsJaWYgKCEoSTkx NV9SRUFEKFNLTF9GVVNFX1NUQVRVUykgJiBTS0xfRlVTRV9QR19ESVNUX1NUQVRVUygxKSkpIHsK PiArCQlEUk1fRVJST1IoIlBHMSBpcyBkaXNhYmxlZCwgY2Fubm90IGxvYWQga2V5c1xuIik7Cj4g KwkJcmV0dXJuIC1FTlhJTzsKPiArCX0KPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgS0VZX0xPQURf VFJJRVM7IGkrKykgewo+ICsJCXJldCA9IGludGVsX2hkY3BfbG9hZF9rZXlzKGRldl9wcml2KTsK PiArCQlpZiAoIXJldCkKPiArCQkJYnJlYWs7Cj4gKwkJaW50ZWxfaGRjcF9jbGVhcl9rZXlzKGRl dl9wcml2KTsKPiArCX0KPiArCWlmIChyZXQpIHsKPiArCQlEUk1fRVJST1IoIkNvdWxkIG5vdCBs b2FkIEhEQ1Aga2V5cywgKCVkKVxuIiwgcmV0KTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsK PiArCXJldCA9IGludGVsX2hkY3BfYXV0aChjb25uX3RvX2RpZ19wb3J0KGNvbm5lY3RvciksCj4g KwkJCSAgICAgIGNvbm5lY3Rvci0+aGRjcF9zaGltKTsKPiArCWlmIChyZXQpIHsKPiArCQlEUk1f RVJST1IoIkZhaWxlZCB0byBhdXRoZW50aWNhdGUgSERDUCAoJWQpXG4iLCByZXQpOwo+ICsJCXJl dHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3ZvaWQgaW50ZWxf aGRjcF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKPiArewo+ICsJc3RydWN0IGludGVs X2Nvbm5lY3RvciAqY29ubmVjdG9yID0gY29udGFpbmVyX29mKHRvX2RlbGF5ZWRfd29yayh3b3Jr KSwKPiArCQkJCQkJCSBzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yLAo+ICsJCQkJCQkgICAgICAgICBo ZGNwX3dvcmspOwo+ICsJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+YmFzZS5k ZXY7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCWRybV9tb2Rlc2V0X2xvY2soJmRldi0+bW9kZV9jb25m aWcuY29ubmVjdGlvbl9tdXRleCwgTlVMTCk7Cj4gKwo+ICsJcmV0ID0gaW50ZWxfaGRjcF9jaGVj a19saW5rKGNvbm5lY3Rvcik7Cj4gKwlpZiAoIXJldCkKPiArCQlzY2hlZHVsZV9kZWxheWVkX3dv cmsoJmNvbm5lY3Rvci0+aGRjcF93b3JrLAo+ICsJCQkJICAgICAgRFJNX0hEQ1BfQ0hFQ0tfUEVS SU9EX01TKTsKPiArCj4gKwlkcm1fbW9kZXNldF91bmxvY2soJmRldi0+bW9kZV9jb25maWcuY29u bmVjdGlvbl9tdXRleCk7Cj4gK30KPiArCj4gK2ludCBpbnRlbF9oZGNwX2VuYWJsZShzdHJ1Y3Qg aW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpCj4gK3sKPiArCXN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdiA9IGNvbm5lY3Rvci0+YmFzZS5kZXYtPmRldl9wcml2YXRlOwo+ICsJc3Ry dWN0IGRybV9kZXZpY2UgKmRldiA9ICZkZXZfcHJpdi0+ZHJtOwo+ICsJc3RydWN0IGRybV9jb25u ZWN0b3Jfc3RhdGUgKnN0YXRlID0gY29ubmVjdG9yLT5iYXNlLnN0YXRlOwo+ICsJaW50IHJldDsK PiArCj4gKwlXQVJOX09OKCFkcm1fbW9kZXNldF9pc19sb2NrZWQoJmRldi0+bW9kZV9jb25maWcu Y29ubmVjdGlvbl9tdXRleCkpOwo+ICsKPiArCWlmICghY29ubmVjdG9yLT5oZGNwX3NoaW0pCj4g KwkJcmV0dXJuIC1FTk9FTlQ7Cj4gKwo+ICsJcmV0ID0gX2ludGVsX2hkY3BfZW5hYmxlKGNvbm5l Y3Rvcik7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJc3RhdGUtPmNvbnRl bnRfcHJvdGVjdGlvbiA9IERSTV9NT0RFX0NPTlRFTlRfUFJPVEVDVElPTl9FTkFCTEVEOwo+ICsK PiArCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY29ubmVjdG9yLT5oZGNwX3dvcmssIERSTV9IRENQ X0NIRUNLX1BFUklPRF9NUyk7Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiAraW50IGludGVsX2hk Y3BfZGlzYWJsZShzdHJ1Y3QgaW50ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpCj4gK3sKPiArCXN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGNvbm5lY3Rvci0+YmFzZS5kZXYtPmRl dl9wcml2YXRlOwo+ICsJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9ICZkZXZfcHJpdi0+ZHJtOwo+ ICsKPiArCVdBUk5fT04oIWRybV9tb2Rlc2V0X2lzX2xvY2tlZCgmZGV2LT5tb2RlX2NvbmZpZy5j b25uZWN0aW9uX211dGV4KSk7Cj4gKwo+ICsJaWYgKCFjb25uZWN0b3ItPmhkY3Bfc2hpbSkKPiAr CQlyZXR1cm4gLUVOT0VOVDsKPiArCj4gKwljYW5jZWxfZGVsYXllZF93b3JrKCZjb25uZWN0b3It PmhkY3Bfd29yayk7Cj4gKwo+ICsJcmV0dXJuIF9pbnRlbF9oZGNwX2Rpc2FibGUoY29ubmVjdG9y KTsKPiArfQo+ICsKPiArLyogSW1wbGVtZW50cyBQYXJ0IDMgb2YgdGhlIEhEQ1AgYXV0aG9yaXph dGlvbiBwcm9jZWR1cmUgKi8KPiAraW50IGludGVsX2hkY3BfY2hlY2tfbGluayhzdHJ1Y3QgaW50 ZWxfY29ubmVjdG9yICpjb25uZWN0b3IpCj4gK3sKPiArCXN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdiA9IGNvbm5lY3Rvci0+YmFzZS5kZXYtPmRldl9wcml2YXRlOwo+ICsJc3RydWN0 IGRybV9kZXZpY2UgKmRldiA9ICZkZXZfcHJpdi0+ZHJtOwo+ICsJc3RydWN0IGRybV9jb25uZWN0 b3Jfc3RhdGUgKnN0YXRlID0gY29ubmVjdG9yLT5iYXNlLnN0YXRlOwo+ICsJc3RydWN0IGludGVs X2RpZ2l0YWxfcG9ydCAqaW50ZWxfZGlnX3BvcnQgPSBjb25uX3RvX2RpZ19wb3J0KGNvbm5lY3Rv cik7Cj4gKwllbnVtIHBvcnQgcG9ydCA9IGludGVsX2RpZ19wb3J0LT5wb3J0Owo+ICsJaW50IHJl dDsKPiArCj4gKwlXQVJOX09OKCFkcm1fbW9kZXNldF9pc19sb2NrZWQoJmRldi0+bW9kZV9jb25m aWcuY29ubmVjdGlvbl9tdXRleCkpOwo+ICsKPiArCWlmIChzdGF0ZS0+Y29udGVudF9wcm90ZWN0 aW9uICE9IERSTV9NT0RFX0NPTlRFTlRfUFJPVEVDVElPTl9FTkFCTEVEKQo+ICsJCXJldHVybiAw Owo+ICsKPiArCWlmICghY29ubmVjdG9yLT5oZGNwX3NoaW0pCj4gKwkJcmV0dXJuIC1FTk9FTlQ7 Cj4gKwo+ICsJaWYgKCEoSTkxNV9SRUFEKFNLTF9QT1JUX0hEQ1BfU1RBVFVTKHBvcnQpKSAmIFNL TF9IRENQX1NUQVRVU19FTkMpKSB7Cj4gKwkJRFJNX0VSUk9SKCJIRENQIGNoZWNrIGZhaWxlZDog bGluayBpcyBub3QgZW5jcnlwdGVkLCAleFxuIiwKPiArCQkJICAgSTkxNV9SRUFEKFNLTF9QT1JU X0hEQ1BfU1RBVFVTKHBvcnQpKSk7Cj4gKwkJcmV0ID0gLUVOWElPOwo+ICsJCWdvdG8gZmFpbDsK PiArCX0KPiArCj4gKwlpZiAoY29ubmVjdG9yLT5oZGNwX3NoaW0tPmNoZWNrX2xpbmsoaW50ZWxf ZGlnX3BvcnQpKQo+ICsJCXJldHVybiAwOwo+ICsKPiArCURSTV9JTkZPKCJIRENQIGxpbmsgZmFp bGVkLCByZXRyeWluZyBhdXRoZW50aWNhdGlvblxuIik7Cj4gKwo+ICsJcmV0ID0gX2ludGVsX2hk Y3BfZGlzYWJsZShjb25uZWN0b3IpOwo+ICsJaWYgKHJldCkgewo+ICsJCURSTV9FUlJPUigiRmFp bGVkIHRvIGRpc2FibGUgaGRjcCAoJWQpXG4iLCByZXQpOwo+ICsJCWdvdG8gZmFpbDsKPiArCX0K PiArCj4gKwlyZXQgPSBfaW50ZWxfaGRjcF9lbmFibGUoY29ubmVjdG9yKTsKPiArCWlmIChyZXQp IHsKPiArCQlEUk1fRVJST1IoIkZhaWxlZCB0byBlbmFibGUgaGRjcCAoJWQpXG4iLCByZXQpOwo+ ICsJCWdvdG8gZmFpbDsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArCj4gK2ZhaWw6Cj4gKwlz dGF0ZS0+Y29udGVudF9wcm90ZWN0aW9uID0gRFJNX01PREVfQ09OVEVOVF9QUk9URUNUSU9OX0RF U0lSRUQ7Cj4gKwlyZXR1cm4gcmV0Owo+ICt9CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0 cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9s aXN0aW5mby9pbnRlbC1nZngK