From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3B95F10EE1D for ; Fri, 21 Apr 2023 13:52:41 +0000 (UTC) Message-ID: Date: Fri, 21 Apr 2023 15:52:35 +0200 MIME-Version: 1.0 Content-Language: en-US To: =?UTF-8?Q?Zbigniew_Kempczy=c5=84ski?= , igt-dev@lists.freedesktop.org References: <20230421055457.13035-1-zbigniew.kempczynski@intel.com> <20230421055457.13035-8-zbigniew.kempczynski@intel.com> From: "Manszewski, Christoph" In-Reply-To: <20230421055457.13035-8-zbigniew.kempczynski@intel.com> Content-Type: text/plain; charset="utf-8"; format="flowed" Content-Transfer-Encoding: base64 Subject: Re: [igt-dev] [PATCH i-g-t v4 07/10] tests/xe_intel_bb: Check if intel-bb Xe support correctness List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" List-ID: SGkgWmJpZ25pZXcsCgpPbiAyMS4wNC4yMDIzIDA3OjU0LCBaYmlnbmlldyBLZW1wY3p5xYRza2kg d3JvdGU6Cj4gQXMgd2UncmUgcmV1c2luZyBpbnRlbC1iYiBmb3IgWGUgd2UgbmVlZCB0byBjaGVj ayBpdCBiZWhhdmVzIGNvcnJlY3RseQo+IGZvciBidWZmZXIgaGFuZGxpbmcgYW5kIHN1Ym1pc3Np b24uCj4gCj4gU2lnbmVkLW9mZi1ieTogWmJpZ25pZXcgS2VtcGN6ecWEc2tpIDx6Ymlnbmlldy5r ZW1wY3p5bnNraUBpbnRlbC5jb20+Cj4gLS0tCj4gICB0ZXN0cy9tZXNvbi5idWlsZCAgICAgIHwg ICAgMSArCj4gICB0ZXN0cy94ZS94ZV9pbnRlbF9iYi5jIHwgMTE4MiArKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrCj4gICAyIGZpbGVzIGNoYW5nZWQsIDExODMgaW5zZXJ0 aW9ucygrKQo+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IHRlc3RzL3hlL3hlX2ludGVsX2JiLmMKPiAK PiBkaWZmIC0tZ2l0IGEvdGVzdHMvbWVzb24uYnVpbGQgYi90ZXN0cy9tZXNvbi5idWlsZAo+IGlu ZGV4IDkwNzJjZmFkYzYuLjVjN2FmZmFkODggMTAwNjQ0Cj4gLS0tIGEvdGVzdHMvbWVzb24uYnVp bGQKPiArKysgYi90ZXN0cy9tZXNvbi5idWlsZAo+IEBAIC0yNTUsNiArMjU1LDcgQEAgeGVfcHJv Z3MgPSBbCj4gICAJJ3hlX2V4ZWNfdGhyZWFkcycsCj4gICAJJ3hlX2d1Y19wYycsCj4gICAJJ3hl X2h1Y19jb3B5JywKPiArCSd4ZV9pbnRlbF9iYicsCj4gICAJJ3hlX21tYXAnLAo+ICAgCSd4ZV9t bWlvJywKPiAgIAkneGVfbW9kdWxlX2xvYWQnLAo+IGRpZmYgLS1naXQgYS90ZXN0cy94ZS94ZV9p bnRlbF9iYi5jIGIvdGVzdHMveGUveGVfaW50ZWxfYmIuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0 Cj4gaW5kZXggMDAwMDAwMDAwMC4uZTRkMTJjMTA3MAo+IC0tLSAvZGV2L251bGwKPiArKysgYi90 ZXN0cy94ZS94ZV9pbnRlbF9iYi5jCj4gQEAgLTAsMCArMSwxMTgyIEBACj4gKy8vIFNQRFgtTGlj ZW5zZS1JZGVudGlmaWVyOiBNSVQKPiArLyoKPiArICogQ29weXJpZ2h0IMKpIDIwMjMgSW50ZWwg Q29ycG9yYXRpb24KPiArICovCj4gKwo+ICsjaW5jbHVkZSA8Y2Fpcm8uaD4KPiArI2luY2x1ZGUg PGVycm5vLmg+Cj4gKyNpbmNsdWRlIDxmY250bC5oPgo+ICsjaW5jbHVkZSA8Z2xpYi5oPgo+ICsj aW5jbHVkZSA8aW50dHlwZXMuaD4KPiArI2luY2x1ZGUgPHN0ZGlvLmg+Cj4gKyNpbmNsdWRlIDxz dGRsaWIuaD4KPiArI2luY2x1ZGUgPHN0cmluZy5oPgo+ICsjaW5jbHVkZSA8c3lzL2lvY3RsLmg+ Cj4gKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgo+ICsjaW5jbHVkZSA8dW5pc3RkLmg+Cj4gKyNpbmNs dWRlIDx6bGliLmg+Cj4gKwo+ICsjaW5jbHVkZSAiaWd0LmgiCj4gKyNpbmNsdWRlICJpZ3RfY3Jj LmgiCj4gKyNpbmNsdWRlICJpbnRlbF9idWZvcHMuaCIKPiArI2luY2x1ZGUgInhlL3hlX2lvY3Rs LmgiCj4gKyNpbmNsdWRlICJ4ZS94ZV9xdWVyeS5oIgo+ICsKPiArLyoqCj4gKyAqIFRFU1Q6IEJh c2ljIHRlc3RzIGZvciBpbnRlbC1iYiB4ZSBmdW5jdGlvbmFsaXR5Cj4gKyAqIENhdGVnb3J5OiBT b2Z0d2FyZSBidWlsZGluZyBibG9jawo+ICsgKiBTdWItY2F0ZWdvcnk6IHhlCj4gKyAqIFRlc3Qg Y2F0ZWdvcnk6IGZ1bmN0aW9uYWxpdHkgdGVzdAo+ICsgKi8KPiArCj4gKyNkZWZpbmUgUEFHRV9T SVpFIDQwOTYKPiArCj4gKyNkZWZpbmUgV0lEVEgJNjQKPiArI2RlZmluZSBIRUlHSFQJNjQKPiAr I2RlZmluZSBTVFJJREUJKFdJRFRIICogNCkKPiArI2RlZmluZSBTSVpFCShIRUlHSFQgKiBTVFJJ REUpCj4gKwo+ICsjZGVmaW5lIENPTE9SXzAwCTB4MDAKPiArI2RlZmluZSBDT0xPUl8zMwkweDMz Cj4gKyNkZWZpbmUgQ09MT1JfNzcJMHg3Nwo+ICsjZGVmaW5lIENPTE9SX0NDCTB4Y2MKPiArCj4g K0lHVF9URVNUX0RFU0NSSVBUSU9OKCJ4ZV9pbnRlbF9iYiBBUEkgY2hlY2suIik7Cj4gKwo+ICtz dGF0aWMgYm9vbCBkZWJ1Z19iYjsKPiArc3RhdGljIGJvb2wgd3JpdGVfcG5nOwo+ICtzdGF0aWMg Ym9vbCBidWZfaW5mbzsKPiArc3RhdGljIGJvb2wgcHJpbnRfYmFzZTY0Owo+ICsKPiArc3RhdGlj IHZvaWQgKmFsbG9jX2FsaWduZWQodWludDY0X3Qgc2l6ZSkKPiArewo+ICsJdm9pZCAqcDsKPiAr Cj4gKwlpZ3RfYXNzZXJ0X2VxKHBvc2l4X21lbWFsaWduKCZwLCAxNiwgc2l6ZSksIDApOwo+ICsK PiArCXJldHVybiBwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBmaWxsX2J1ZihzdHJ1Y3QgaW50 ZWxfYnVmICpidWYsIHVpbnQ4X3QgY29sb3IpCj4gK3sKPiArCXVpbnQ4X3QgKnB0cjsKPiArCWlu dCB4ZSA9IGJ1Zl9vcHNfZ2V0X2ZkKGJ1Zi0+Ym9wcyk7Cj4gKwlpbnQgaTsKPiArCj4gKwlwdHIg PSB4ZV9ib19tYXAoeGUsIGJ1Zi0+aGFuZGxlLCBidWYtPnN1cmZhY2VbMF0uc2l6ZSk7Cj4gKwo+ ICsJZm9yIChpID0gMDsgaSA8IGJ1Zi0+c3VyZmFjZVswXS5zaXplOyBpKyspCj4gKwkJcHRyW2ld ID0gY29sb3I7Cj4gKwo+ICsJbXVubWFwKHB0ciwgYnVmLT5zdXJmYWNlWzBdLnNpemUpOwo+ICt9 Cj4gKwo+ICtzdGF0aWMgdm9pZCBjaGVja19idWYoc3RydWN0IGludGVsX2J1ZiAqYnVmLCB1aW50 OF90IGNvbG9yKQo+ICt7Cj4gKwl1aW50OF90ICpwdHI7Cj4gKwlpbnQgeGUgPSBidWZfb3BzX2dl dF9mZChidWYtPmJvcHMpOwo+ICsJaW50IGk7Cj4gKwo+ICsJcHRyID0geGVfYm9fbWFwKHhlLCBi dWYtPmhhbmRsZSwgYnVmLT5zdXJmYWNlWzBdLnNpemUpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkg PCBidWYtPnN1cmZhY2VbMF0uc2l6ZTsgaSsrKQo+ICsJCWlndF9hc3NlcnQocHRyW2ldID09IGNv bG9yKTsKPiArCj4gKwltdW5tYXAocHRyLCBidWYtPnN1cmZhY2VbMF0uc2l6ZSk7Cj4gK30KPiAr Cj4gK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfYnVmICoKPiArY3JlYXRlX2J1ZihzdHJ1Y3QgYnVmX29w cyAqYm9wcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCB1aW50OF90IGNvbG9yKQo+ICt7Cj4gKwlz dHJ1Y3QgaW50ZWxfYnVmICpidWY7Cj4gKwo+ICsJYnVmID0gY2FsbG9jKDEsIHNpemVvZigqYnVm KSk7Cj4gKwlpZ3RfYXNzZXJ0KGJ1Zik7Cj4gKwo+ICsJaW50ZWxfYnVmX2luaXQoYm9wcywgYnVm LCB3aWR0aC80LCBoZWlnaHQsIDMyLCAwLCBJOTE1X1RJTElOR19OT05FLCAwKTsKPiArCWZpbGxf YnVmKGJ1ZiwgY29sb3IpOwo+ICsKPiArCXJldHVybiBidWY7Cj4gK30KPiArCj4gK3N0YXRpYyB2 b2lkIHByaW50X2J1ZihzdHJ1Y3QgaW50ZWxfYnVmICpidWYsIGNvbnN0IGNoYXIgKm5hbWUpCj4g K3sKPiArCXVpbnQ4X3QgKnB0cjsKPiArCWludCB4ZSA9IGJ1Zl9vcHNfZ2V0X2ZkKGJ1Zi0+Ym9w cyk7Cj4gKwo+ICsJcHRyID0geGVfYm9fbWFwKHhlLCBidWYtPmhhbmRsZSwgYnVmLT5zdXJmYWNl WzBdLnNpemUpOwo+ICsKPiArCWlndF9kZWJ1ZygiWyVzXSBCdWYgaGFuZGxlOiAlZCwgc2l6ZTog JSIgUFJJdTY0Cj4gKwkJICAiLCB2OiAweCUwMngsIHByZXN1bWVkX2FkZHI6ICVwXG4iLAo+ICsJ CSAgbmFtZSwgYnVmLT5oYW5kbGUsIGJ1Zi0+c3VyZmFjZVswXS5zaXplLCBwdHJbMF0sCj4gKwkJ ICBmcm9tX3VzZXJfcG9pbnRlcihidWYtPmFkZHIub2Zmc2V0KSk7Cj4gKwltdW5tYXAocHRyLCBi dWYtPnN1cmZhY2VbMF0uc2l6ZSk7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBTVUJURVNUOiByZXNl dC1iYgo+ICsgKiBEZXNjcmlwdGlvbjogY2hlY2sgYmIgcmVzZXQKPiArICogUnVuIHR5cGU6IEZV TEwKPiArICogVE9ETzogY2hhbmdlIGBgJ1J1biB0eXBlJyA9PSBGVUxMYGAgdG8gYSBiZXR0ZXIg Y2F0ZWdvcnkKPiArICovCj4gK3N0YXRpYyB2b2lkIHJlc2V0X2JiKHN0cnVjdCBidWZfb3BzICpi b3BzKQo+ICt7Cj4gKwlpbnQgeGUgPSBidWZfb3BzX2dldF9mZChib3BzKTsKPiArCXN0cnVjdCBp bnRlbF9iYiAqaWJiOwo+ICsKPiArCWliYiA9IGludGVsX2JiX2NyZWF0ZSh4ZSwgUEFHRV9TSVpF KTsKPiArCWludGVsX2JiX3Jlc2V0KGliYiwgZmFsc2UpOwo+ICsJaW50ZWxfYmJfZGVzdHJveShp YmIpOwo+ICt9Cj4gKwo+ICsvKioKPiArICogU1VCVEVTVDogcHVyZ2UtYmIKPiArICogRGVzY3Jp cHRpb246IGNoZWNrIGJiIHJlc2V0ID09IGZ1bGwgKHB1cmdlKQo+ICsgKiBSdW4gdHlwZTogRlVM TAo+ICsgKiBUT0RPOiBjaGFuZ2UgYGAnUnVuIHR5cGUnID09IEZVTExgYCB0byBhIGJldHRlciBj YXRlZ29yeQo+ICsgKi8KPiArc3RhdGljIHZvaWQgcHVyZ2VfYmIoc3RydWN0IGJ1Zl9vcHMgKmJv cHMpCj4gK3sKPiArCWludCB4ZSA9IGJ1Zl9vcHNfZ2V0X2ZkKGJvcHMpOwo+ICsJc3RydWN0IGlu dGVsX2J1ZiAqYnVmOwo+ICsJc3RydWN0IGludGVsX2JiICppYmI7Cj4gKwl1aW50NjRfdCBvZmZz ZXQwLCBvZmZzZXQxOwo+ICsKPiArCWJ1ZiA9IGludGVsX2J1Zl9jcmVhdGUoYm9wcywgNTEyLCA1 MTIsIDMyLCAwLCBJOTE1X1RJTElOR19OT05FLAo+ICsJCQkgICAgICAgSTkxNV9DT01QUkVTU0lP Tl9OT05FKTsKPiArCWliYiA9IGludGVsX2JiX2NyZWF0ZSh4ZSwgNDA5Nik7Cj4gKwlpbnRlbF9i Yl9zZXRfZGVidWcoaWJiLCB0cnVlKTsKPiArCj4gKwlpbnRlbF9iYl9hZGRfaW50ZWxfYnVmKGli YiwgYnVmLCBmYWxzZSk7Cj4gKwlvZmZzZXQwID0gYnVmLT5hZGRyLm9mZnNldDsKPiArCj4gKwlp bnRlbF9iYl9yZXNldChpYmIsIHRydWUpOwo+ICsJYnVmLT5hZGRyLm9mZnNldCA9IElOVEVMX0JV Rl9JTlZBTElEX0FERFJFU1M7Cj4gKwo+ICsJaW50ZWxfYmJfYWRkX2ludGVsX2J1ZihpYmIsIGJ1 ZiwgZmFsc2UpOwo+ICsJb2Zmc2V0MSA9IGJ1Zi0+YWRkci5vZmZzZXQ7Cj4gKwo+ICsJaWd0X2Fz c2VydChvZmZzZXQwID09IG9mZnNldDEpOwo+ICsKPiArCWludGVsX2J1Zl9kZXN0cm95KGJ1Zik7 Cj4gKwlpbnRlbF9iYl9kZXN0cm95KGliYik7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBTVUJURVNU OiBzaW1wbGUtJXMKPiArICogRGVzY3JpcHRpb246IFJ1biBzaW1wbGUgYmIgeGUgJWFyZ1sxXSB0 ZXN0Cj4gKyAqIFJ1biB0eXBlOiBCQVQKPiArICoKPiArICogYXJnWzFdOgo+ICsgKgo+ICsgKiBA YmI6ICAgICBiYgo+ICsgKiBAYmItY3R4OiBiYi1jdHgKPiArICovCj4gK3N0YXRpYyB2b2lkIHNp bXBsZV9iYihzdHJ1Y3QgYnVmX29wcyAqYm9wcywgYm9vbCBuZXdfY29udGV4dCkKPiArewo+ICsJ aW50IHhlID0gYnVmX29wc19nZXRfZmQoYm9wcyk7Cj4gKwlzdHJ1Y3QgaW50ZWxfYmIgKmliYjsK PiArCXVpbnQzMl90IGN0eCA9IDA7Cj4gKwo+ICsJaWJiID0gaW50ZWxfYmJfY3JlYXRlX3dpdGhf YWxsb2NhdG9yKHhlLCBjdHgsIE5VTEwsIFBBR0VfU0laRSwKPiArCQkJCQkgICAgIElOVEVMX0FM TE9DQVRPUl9TSU1QTEUpOwo+ICsJaWYgKGRlYnVnX2JiKQo+ICsJCWludGVsX2JiX3NldF9kZWJ1 ZyhpYmIsIHRydWUpOwo+ICsKPiArCWludGVsX2JiX291dChpYmIsIE1JX0JBVENIX0JVRkZFUl9F TkQpOwo+ICsJaW50ZWxfYmJfcHRyX2FsaWduKGliYiwgOCk7Cj4gKwo+ICsJaW50ZWxfYmJfZXhl YyhpYmIsIGludGVsX2JiX29mZnNldChpYmIpLAo+ICsJCSAgICAgIEk5MTVfRVhFQ19ERUZBVUxU IHwgSTkxNV9FWEVDX05PX1JFTE9DLCB0cnVlKTsKPiArCj4gKwkvKiBDaGVjayB3ZSdyZSBzYWZl IHdpdGggcmVzZXQgYW5kIG5vIGRvdWJsZS1mcmVlIHdpbGwgb2NjdXIgKi8KPiArCWludGVsX2Ji X3Jlc2V0KGliYiwgdHJ1ZSk7Cj4gKwlpbnRlbF9iYl9yZXNldChpYmIsIGZhbHNlKTsKPiArCWlu dGVsX2JiX3Jlc2V0KGliYiwgdHJ1ZSk7Cj4gKwo+ICsJaWYgKG5ld19jb250ZXh0KSB7Cj4gKwkJ Y3R4ID0geGVfdm1fY3JlYXRlKHhlLCBEUk1fWEVfVk1fQ1JFQVRFX0FTWU5DX0JJTkRfT1BTLCAw KTsKPiArCQlpbnRlbF9iYl9kZXN0cm95KGliYik7Cj4gKwkJaWJiID0gaW50ZWxfYmJfY3JlYXRl X3dpdGhfY29udGV4dCh4ZSwgY3R4LCBOVUxMLCBQQUdFX1NJWkUpOwo+ICsJCWludGVsX2JiX291 dChpYmIsIE1JX0JBVENIX0JVRkZFUl9FTkQpOwo+ICsJCWludGVsX2JiX3B0cl9hbGlnbihpYmIs IDgpOwo+ICsJCWludGVsX2JiX2V4ZWMoaWJiLCBpbnRlbF9iYl9vZmZzZXQoaWJiKSwKPiArCQkJ ICAgICAgSTkxNV9FWEVDX0RFRkFVTFQgfCBJOTE1X0VYRUNfTk9fUkVMT0MsCj4gKwkJCSAgICAg IHRydWUpOwo+ICsJCXhlX3ZtX2Rlc3Ryb3koeGUsIGN0eCk7Cj4gKwl9Cj4gKwo+ICsJaW50ZWxf YmJfZGVzdHJveShpYmIpOwo+ICt9Cj4gKwo+ICsvKioKPiArICogU1VCVEVTVDogYmItd2l0aC1h bGxvY2F0b3IKPiArICogRGVzY3JpcHRpb246IGNoZWNrIGJiIHdpdGggcGFzc2VkIGFsbG9jYXRv cgo+ICsgKiBSdW4gdHlwZTogRlVMTAo+ICsgKiBUT0RPOiBjaGFuZ2UgYGAnUnVuIHR5cGUnID09 IEZVTExgYCB0byBhIGJldHRlciBjYXRlZ29yeQo+ICsgKi8KPiArc3RhdGljIHZvaWQgYmJfd2l0 aF9hbGxvY2F0b3Ioc3RydWN0IGJ1Zl9vcHMgKmJvcHMpCj4gK3sKPiArCWludCB4ZSA9IGJ1Zl9v cHNfZ2V0X2ZkKGJvcHMpOwo+ICsJc3RydWN0IGludGVsX2JiICppYmI7Cj4gKwlzdHJ1Y3QgaW50 ZWxfYnVmICpzcmMsICpkc3Q7Cj4gKwl1aW50MzJfdCBjdHggPSAwOwo+ICsKPiArCWliYiA9IGlu dGVsX2JiX2NyZWF0ZV93aXRoX2FsbG9jYXRvcih4ZSwgY3R4LCBOVUxMLCBQQUdFX1NJWkUsCj4g KwkJCQkJICAgICBJTlRFTF9BTExPQ0FUT1JfU0lNUExFKTsKPiArCWlmIChkZWJ1Z19iYikKPiAr CQlpbnRlbF9iYl9zZXRfZGVidWcoaWJiLCB0cnVlKTsKPiArCj4gKwlzcmMgPSBpbnRlbF9idWZf Y3JlYXRlKGJvcHMsIDQwOTYvMzIsIDMyLCA4LCAwLCBJOTE1X1RJTElOR19OT05FLAo+ICsJCQkg ICAgICAgSTkxNV9DT01QUkVTU0lPTl9OT05FKTsKPiArCWRzdCA9IGludGVsX2J1Zl9jcmVhdGUo Ym9wcywgNDA5Ni8zMiwgMzIsIDgsIDAsIEk5MTVfVElMSU5HX05PTkUsCj4gKwkJCSAgICAgICBJ OTE1X0NPTVBSRVNTSU9OX05PTkUpOwo+ICsKPiArCWludGVsX2JiX2FkZF9pbnRlbF9idWYoaWJi LCBzcmMsIGZhbHNlKTsKPiArCWludGVsX2JiX2FkZF9pbnRlbF9idWYoaWJiLCBkc3QsIHRydWUp Owo+ICsJaW50ZWxfYmJfY29weV9pbnRlbF9idWYoaWJiLCBkc3QsIHNyYywgNDA5Nik7Cj4gKwlp bnRlbF9iYl9yZW1vdmVfaW50ZWxfYnVmKGliYiwgc3JjKTsKPiArCWludGVsX2JiX3JlbW92ZV9p bnRlbF9idWYoaWJiLCBkc3QpOwo+ICsKPiArCWludGVsX2J1Zl9kZXN0cm95KHNyYyk7Cj4gKwlp bnRlbF9idWZfZGVzdHJveShkc3QpOwo+ICsJaW50ZWxfYmJfZGVzdHJveShpYmIpOwo+ICt9Cj4g Kwo+ICsvKioKPiArICogU1VCVEVTVDogbG90LW9mLWJ1ZmZlcnMKPiArICogRGVzY3JpcHRpb246 IGNoZWNrIHJ1bm5pbmcgYmIgd2l0aCBtYW55IGJ1ZmZlcnMKPiArICogUnVuIHR5cGU6IEZVTEwK PiArICogVE9ETzogY2hhbmdlIGBgJ1J1biB0eXBlJyA9PSBGVUxMYGAgdG8gYSBiZXR0ZXIgY2F0 ZWdvcnkKPiArICovCj4gKyNkZWZpbmUgTlVNX0JVRlMgNTAwCj4gK3N0YXRpYyB2b2lkIGxvdF9v Zl9idWZmZXJzKHN0cnVjdCBidWZfb3BzICpib3BzKQo+ICt7Cj4gKwlpbnQgeGUgPSBidWZfb3Bz X2dldF9mZChib3BzKTsKPiArCXN0cnVjdCBpbnRlbF9iYiAqaWJiOwo+ICsJc3RydWN0IGludGVs X2J1ZiAqYnVmW05VTV9CVUZTXTsKPiArCWludCBpOwo+ICsKPiArCWliYiA9IGludGVsX2JiX2Ny ZWF0ZSh4ZSwgUEFHRV9TSVpFKTsKPiArCWlmIChkZWJ1Z19iYikKPiArCQlpbnRlbF9iYl9zZXRf ZGVidWcoaWJiLCB0cnVlKTsKPiArCj4gKwlpbnRlbF9iYl9vdXQoaWJiLCBNSV9CQVRDSF9CVUZG RVJfRU5EKTsKPiArCWludGVsX2JiX3B0cl9hbGlnbihpYmIsIDgpOwo+ICsKPiArCWZvciAoaSA9 IDA7IGkgPCBOVU1fQlVGUzsgaSsrKSB7Cj4gKwkJYnVmW2ldID0gaW50ZWxfYnVmX2NyZWF0ZShi b3BzLCA0MDk2LCAxLCA4LCAwLCBJOTE1X1RJTElOR19OT05FLAo+ICsJCQkJCSAgSTkxNV9DT01Q UkVTU0lPTl9OT05FKTsKPiArCQlpZiAoaSAlIDIpCj4gKwkJCWludGVsX2JiX2FkZF9pbnRlbF9i dWYoaWJiLCBidWZbaV0sIGZhbHNlKTsKPiArCQllbHNlCj4gKwkJCWludGVsX2JiX2FkZF9pbnRl bF9idWZfd2l0aF9hbGlnbm1lbnQoaWJiLCBidWZbaV0sCj4gKwkJCQkJCQkgICAgICAweDQwMDAs IGZhbHNlKTsKPiArCX0KPiArCj4gKwlpbnRlbF9iYl9leGVjKGliYiwgaW50ZWxfYmJfb2Zmc2V0 KGliYiksCj4gKwkJICAgICAgSTkxNV9FWEVDX0RFRkFVTFQgfCBJOTE1X0VYRUNfTk9fUkVMT0Ms IHRydWUpOwo+ICsJaW50ZWxfYmJfcmVzZXQoaWJiLCBmYWxzZSk7Cj4gKwo+ICsJZm9yIChpID0g MDsgaSA8IE5VTV9CVUZTOyBpKyspCj4gKwkJaW50ZWxfYnVmX2Rlc3Ryb3koYnVmW2ldKTsKPiAr Cj4gKwlpbnRlbF9iYl9kZXN0cm95KGliYik7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBTVUJURVNU OiBhZGQtcmVtb3ZlLW9iamVjdHMKPiArICogRGVzY3JpcHRpb246IGNoZWNrIGJiIG9iamVjdCBt YW5pcHVsYXRpb24gKGFkZCArIHJlbW92ZSkKPiArICogUnVuIHR5cGU6IEZVTEwKPiArICogVE9E TzogY2hhbmdlIGBgJ1J1biB0eXBlJyA9PSBGVUxMYGAgdG8gYSBiZXR0ZXIgY2F0ZWdvcnkKPiAr ICovCj4gK3N0YXRpYyB2b2lkIGFkZF9yZW1vdmVfb2JqZWN0cyhzdHJ1Y3QgYnVmX29wcyAqYm9w cykKPiArewo+ICsJaW50IHhlID0gYnVmX29wc19nZXRfZmQoYm9wcyk7Cj4gKwlzdHJ1Y3QgaW50 ZWxfYmIgKmliYjsKPiArCXN0cnVjdCBpbnRlbF9idWYgKnNyYywgKm1pZCwgKmRzdDsKPiArCXVp bnQzMl90IG9mZnNldDsKPiArCWNvbnN0IHVpbnQzMl90IHdpZHRoID0gNTEyOwo+ICsJY29uc3Qg dWludDMyX3QgaGVpZ2h0ID0gNTEyOwo+ICsKPiArCWliYiA9IGludGVsX2JiX2NyZWF0ZSh4ZSwg UEFHRV9TSVpFKTsKPiArCWlmIChkZWJ1Z19iYikKPiArCQlpbnRlbF9iYl9zZXRfZGVidWcoaWJi LCB0cnVlKTsKPiArCj4gKwlzcmMgPSBpbnRlbF9idWZfY3JlYXRlKGJvcHMsIHdpZHRoLCBoZWln aHQsIDMyLCAwLAo+ICsJCQkgICAgICAgSTkxNV9USUxJTkdfTk9ORSwgSTkxNV9DT01QUkVTU0lP Tl9OT05FKTsKPiArCW1pZCA9IGludGVsX2J1Zl9jcmVhdGUoYm9wcywgd2lkdGgsIGhlaWdodCwg MzIsIDAsCj4gKwkJCSAgICAgICBJOTE1X1RJTElOR19OT05FLCBJOTE1X0NPTVBSRVNTSU9OX05P TkUpOwo+ICsJZHN0ID0gaW50ZWxfYnVmX2NyZWF0ZShib3BzLCB3aWR0aCwgaGVpZ2h0LCAzMiwg MCwKPiArCQkJICAgICAgIEk5MTVfVElMSU5HX05PTkUsIEk5MTVfQ09NUFJFU1NJT05fTk9ORSk7 Cj4gKwo+ICsJaW50ZWxfYmJfYWRkX2ludGVsX2J1ZihpYmIsIHNyYywgZmFsc2UpOwo+ICsJaW50 ZWxfYmJfYWRkX2ludGVsX2J1ZihpYmIsIG1pZCwgdHJ1ZSk7Cj4gKwlpbnRlbF9iYl9yZW1vdmVf aW50ZWxfYnVmKGliYiwgbWlkKTsKPiArCWludGVsX2JiX3JlbW92ZV9pbnRlbF9idWYoaWJiLCBt aWQpOwo+ICsJaW50ZWxfYmJfcmVtb3ZlX2ludGVsX2J1ZihpYmIsIG1pZCk7Cj4gKwlpbnRlbF9i Yl9hZGRfaW50ZWxfYnVmKGliYiwgZHN0LCB0cnVlKTsKPiArCj4gKwlvZmZzZXQgPSBpbnRlbF9i Yl9lbWl0X2JiZShpYmIpOwo+ICsJaW50ZWxfYmJfZXhlYyhpYmIsIG9mZnNldCwKPiArCQkgICAg ICBJOTE1X0VYRUNfREVGQVVMVCB8IEk5MTVfRVhFQ19OT19SRUxPQywgdHJ1ZSk7Cj4gKwlpbnRl bF9iYl9yZXNldChpYmIsIGZhbHNlKTsKPiArCj4gKwlpbnRlbF9idWZfZGVzdHJveShzcmMpOwo+ ICsJaW50ZWxfYnVmX2Rlc3Ryb3kobWlkKTsKPiArCWludGVsX2J1Zl9kZXN0cm95KGRzdCk7Cj4g KwlpbnRlbF9iYl9kZXN0cm95KGliYik7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBTVUJURVNUOiBk ZXN0cm95LWJiCj4gKyAqIERlc2NyaXB0aW9uOiBjaGVjayBiYiBkZXN0cm95L2NyZWF0ZQo+ICsg KiBSdW4gdHlwZTogRlVMTAo+ICsgKiBUT0RPOiBjaGFuZ2UgYGAnUnVuIHR5cGUnID09IEZVTExg YCB0byBhIGJldHRlciBjYXRlZ29yeQo+ICsgKi8KPiArc3RhdGljIHZvaWQgZGVzdHJveV9iYihz dHJ1Y3QgYnVmX29wcyAqYm9wcykKPiArewo+ICsJaW50IHhlID0gYnVmX29wc19nZXRfZmQoYm9w cyk7Cj4gKwlzdHJ1Y3QgaW50ZWxfYmIgKmliYjsKPiArCXN0cnVjdCBpbnRlbF9idWYgKnNyYywg Km1pZCwgKmRzdDsKPiArCXVpbnQzMl90IG9mZnNldDsKPiArCWNvbnN0IHVpbnQzMl90IHdpZHRo ID0gNTEyOwo+ICsJY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gNTEyOwo+ICsKPiArCWliYiA9IGlu dGVsX2JiX2NyZWF0ZSh4ZSwgUEFHRV9TSVpFKTsKPiArCWlmIChkZWJ1Z19iYikKPiArCQlpbnRl bF9iYl9zZXRfZGVidWcoaWJiLCB0cnVlKTsKPiArCj4gKwlzcmMgPSBpbnRlbF9idWZfY3JlYXRl KGJvcHMsIHdpZHRoLCBoZWlnaHQsIDMyLCAwLAo+ICsJCQkgICAgICAgSTkxNV9USUxJTkdfTk9O RSwgSTkxNV9DT01QUkVTU0lPTl9OT05FKTsKPiArCW1pZCA9IGludGVsX2J1Zl9jcmVhdGUoYm9w cywgd2lkdGgsIGhlaWdodCwgMzIsIDAsCj4gKwkJCSAgICAgICBJOTE1X1RJTElOR19OT05FLCBJ OTE1X0NPTVBSRVNTSU9OX05PTkUpOwo+ICsJZHN0ID0gaW50ZWxfYnVmX2NyZWF0ZShib3BzLCB3 aWR0aCwgaGVpZ2h0LCAzMiwgMCwKPiArCQkJICAgICAgIEk5MTVfVElMSU5HX05PTkUsIEk5MTVf Q09NUFJFU1NJT05fTk9ORSk7Cj4gKwo+ICsJaW50ZWxfYmJfYWRkX2ludGVsX2J1ZihpYmIsIHNy YywgZmFsc2UpOwo+ICsJaW50ZWxfYmJfYWRkX2ludGVsX2J1ZihpYmIsIG1pZCwgdHJ1ZSk7Cj4g KwlpbnRlbF9iYl9hZGRfaW50ZWxfYnVmKGliYiwgZHN0LCB0cnVlKTsKPiArCj4gKwlvZmZzZXQg PSBpbnRlbF9iYl9lbWl0X2JiZShpYmIpOwo+ICsJaW50ZWxfYmJfZXhlYyhpYmIsIG9mZnNldCwK PiArCQkgICAgICBJOTE1X0VYRUNfREVGQVVMVCB8IEk5MTVfRVhFQ19OT19SRUxPQywgdHJ1ZSk7 Cj4gKwlpbnRlbF9iYl9yZXNldChpYmIsIGZhbHNlKTsKPiArCj4gKwkvKiBDaGVjayBkZXN0cm95 IHdpbGwgZGV0YWNoIGludGVsX2J1ZnMgKi8KPiArCWludGVsX2JiX2Rlc3Ryb3koaWJiKTsKPiAr CWlndF9hc3NlcnQoc3JjLT5hZGRyLm9mZnNldCA9PSBJTlRFTF9CVUZfSU5WQUxJRF9BRERSRVNT KTsKPiArCWlndF9hc3NlcnQoc3JjLT5pYmIgPT0gTlVMTCk7Cj4gKwlpZ3RfYXNzZXJ0KG1pZC0+ YWRkci5vZmZzZXQgPT0gSU5URUxfQlVGX0lOVkFMSURfQUREUkVTUyk7Cj4gKwlpZ3RfYXNzZXJ0 KG1pZC0+aWJiID09IE5VTEwpOwo+ICsJaWd0X2Fzc2VydChkc3QtPmFkZHIub2Zmc2V0ID09IElO VEVMX0JVRl9JTlZBTElEX0FERFJFU1MpOwo+ICsJaWd0X2Fzc2VydChkc3QtPmliYiA9PSBOVUxM KTsKPiArCj4gKwlpYmIgPSBpbnRlbF9iYl9jcmVhdGUoeGUsIFBBR0VfU0laRSk7Cj4gKwlpZiAo ZGVidWdfYmIpCj4gKwkJaW50ZWxfYmJfc2V0X2RlYnVnKGliYiwgdHJ1ZSk7Cj4gKwo+ICsJaW50 ZWxfYmJfYWRkX2ludGVsX2J1ZihpYmIsIHNyYywgZmFsc2UpOwo+ICsJb2Zmc2V0ID0gaW50ZWxf YmJfZW1pdF9iYmUoaWJiKTsKPiArCWludGVsX2JiX2V4ZWMoaWJiLCBvZmZzZXQsCj4gKwkJICAg ICAgSTkxNV9FWEVDX0RFRkFVTFQgfCBJOTE1X0VYRUNfTk9fUkVMT0MsIHRydWUpOwo+ICsJaW50 ZWxfYmJfcmVzZXQoaWJiLCBmYWxzZSk7Cj4gKwo+ICsJaW50ZWxfYmJfZGVzdHJveShpYmIpOwo+ ICsJaW50ZWxfYnVmX2Rlc3Ryb3koc3JjKTsKPiArCWludGVsX2J1Zl9kZXN0cm95KG1pZCk7Cj4g KwlpbnRlbF9idWZfZGVzdHJveShkc3QpOwo+ICt9Cj4gKwo+ICsvKioKPiArICogU1VCVEVTVDog Y3JlYXRlLWluLXJlZ2lvbgo+ICsgKiBEZXNjcmlwdGlvbjogY2hlY2sgc2l6ZSB2YWxpZGF0aW9u IG9uIGF2YWlsYWJsZSByZWdpb25zCj4gKyAqIFJ1biB0eXBlOiBGVUxMCj4gKyAqIFRPRE86IGNo YW5nZSBgYCdSdW4gdHlwZScgPT0gRlVMTGBgIHRvIGEgYmV0dGVyIGNhdGVnb3J5Cj4gKyAqLwo+ ICtzdGF0aWMgdm9pZCBjcmVhdGVfaW5fcmVnaW9uKHN0cnVjdCBidWZfb3BzICpib3BzLCB1aW50 NjRfdCByZWdpb24pCj4gK3sKPiArCWludCB4ZSA9IGJ1Zl9vcHNfZ2V0X2ZkKGJvcHMpOwo+ICsJ c3RydWN0IGludGVsX2JiICppYmI7Cj4gKwlzdHJ1Y3QgaW50ZWxfYnVmIGJ1ZiA9IHt9Owo+ICsJ dWludDMyX3QgaGFuZGxlLCBvZmZzZXQ7Cj4gKwl1aW50NjRfdCBzaXplOwo+ICsJaW50IHdpZHRo ID0gNjQ7Cj4gKwlpbnQgaGVpZ2h0ID0gNjQ7Cj4gKwo+ICsJaWJiID0gaW50ZWxfYmJfY3JlYXRl KHhlLCBQQUdFX1NJWkUpOwo+ICsJaWYgKGRlYnVnX2JiKQo+ICsJCWludGVsX2JiX3NldF9kZWJ1 ZyhpYmIsIHRydWUpOwo+ICsKPiArCXNpemUgPSB4ZV9taW5fcGFnZV9zaXplKHhlLCBzeXN0ZW1f bWVtb3J5KHhlKSk7Cj4gKwloYW5kbGUgPSB4ZV9ib19jcmVhdGVfZmxhZ3MoeGUsIDAsIHNpemUs IHN5c3RlbV9tZW1vcnkoeGUpKTsKPiArCWludGVsX2J1Zl9pbml0X2Z1bGwoYm9wcywgaGFuZGxl LCAmYnVmLAo+ICsJCQkgICAgd2lkdGgvNCwgaGVpZ2h0LCAzMiwgMCwKPiArCQkJICAgIEk5MTVf VElMSU5HX05PTkUsIDAsCj4gKwkJCSAgICBzaXplLCByZWdpb24pOwo+ICsJaW50ZWxfYnVmX3Nl dF9vd25lcnNoaXAoJmJ1ZiwgdHJ1ZSk7Cj4gKwo+ICsJaW50ZWxfYmJfYWRkX2ludGVsX2J1Zihp YmIsICZidWYsIGZhbHNlKTsKPiArCW9mZnNldCA9IGludGVsX2JiX2VtaXRfYmJlKGliYik7Cj4g KwlpbnRlbF9iYl9leGVjKGliYiwgb2Zmc2V0LAo+ICsJCSAgICAgIEk5MTVfRVhFQ19ERUZBVUxU IHwgSTkxNV9FWEVDX05PX1JFTE9DLCB0cnVlKTsKPiArCWludGVsX2JiX3Jlc2V0KGliYiwgZmFs c2UpOwo+ICsKPiArCWludGVsX2J1Zl9jbG9zZShib3BzLCAmYnVmKTsKPiArCWludGVsX2JiX2Rl c3Ryb3koaWJiKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgX19lbWl0X2JsaXQoc3RydWN0IGlu dGVsX2JiICppYmIsCj4gKwkJCSBzdHJ1Y3QgaW50ZWxfYnVmICpzcmMsIHN0cnVjdCBpbnRlbF9i dWYgKmRzdCkKPiArewo+ICsJaW50ZWxfYmJfZW1pdF9ibHRfY29weShpYmIsCj4gKwkJCSAgICAg ICBzcmMsIDAsIDAsIHNyYy0+c3VyZmFjZVswXS5zdHJpZGUsCj4gKwkJCSAgICAgICBkc3QsIDAs IDAsIGRzdC0+c3VyZmFjZVswXS5zdHJpZGUsCj4gKwkJCSAgICAgICBpbnRlbF9idWZfd2lkdGgo ZHN0KSwKPiArCQkJICAgICAgIGludGVsX2J1Zl9oZWlnaHQoZHN0KSwKPiArCQkJICAgICAgIGRz dC0+YnBwKTsKPiArfQo+ICsKPiArLyoqCj4gKyAqIFNVQlRFU1Q6IGJsaXQtJXMKPiArICogRGVz Y3JpcHRpb246IFJ1biBibGl0IG9uICVhcmdbMV0gYWxsb2NhdG9yCj4gKyAqIFJ1biB0eXBlOiBC QVQKPiArICoKPiArICogYXJnWzFdOgo+ICsgKgo+ICsgKiBAc2ltcGxlOgkJCQlzaW1wbGUKPiAr ICogQHJlbG9jOgkJCQlyZWxvYwo+ICsgKi8KPiArc3RhdGljIHZvaWQgYmxpdChzdHJ1Y3QgYnVm X29wcyAqYm9wcywgdWludDhfdCBhbGxvY2F0b3JfdHlwZSkKPiArewo+ICsJaW50IHhlID0gYnVm X29wc19nZXRfZmQoYm9wcyk7Cj4gKwlzdHJ1Y3QgaW50ZWxfYmIgKmliYjsKPiArCXN0cnVjdCBp bnRlbF9idWYgKnNyYywgKmRzdDsKPiArCXVpbnQ2NF90IHBvZmZfc3JjLCBwb2ZmX2RzdDsKPiAr CXVpbnQ2NF90IGZsYWdzID0gMDsKPiArCj4gKwlpYmIgPSBpbnRlbF9iYl9jcmVhdGVfd2l0aF9h bGxvY2F0b3IoeGUsIDAsIE5VTEwsIFBBR0VfU0laRSwKPiArCQkJCQkgICAgIGFsbG9jYXRvcl90 eXBlKTsKPiArCWZsYWdzIHw9IEk5MTVfRVhFQ19OT19SRUxPQzsKPiArCj4gKwlzcmMgPSBjcmVh dGVfYnVmKGJvcHMsIFdJRFRILCBIRUlHSFQsIENPTE9SX0NDKTsKPiArCWRzdCA9IGNyZWF0ZV9i dWYoYm9wcywgV0lEVEgsIEhFSUdIVCwgQ09MT1JfMDApOwo+ICsKPiArCWlmIChidWZfaW5mbykg ewo+ICsJCXByaW50X2J1ZihzcmMsICJzcmMiKTsKPiArCQlwcmludF9idWYoZHN0LCAiZHN0Iik7 Cj4gKwl9Cj4gKwo+ICsJaWYgKGRlYnVnX2JiKQo+ICsJCWludGVsX2JiX3NldF9kZWJ1ZyhpYmIs IHRydWUpOwo+ICsKPiArCV9fZW1pdF9ibGl0KGliYiwgc3JjLCBkc3QpOwo+ICsJaW50ZWxfYmJf ZW1pdF9iYmUoaWJiKTsKPiArCWludGVsX2JiX2ZsdXNoX2JsaXQoaWJiKTsKPiArCWludGVsX2Ji X3N5bmMoaWJiKTsKPiArCWludGVsX2JiX3Jlc2V0KGliYiwgZmFsc2UpOwo+ICsJY2hlY2tfYnVm KGRzdCwgQ09MT1JfQ0MpOwo+ICsKPiArCXBvZmZfc3JjID0gaW50ZWxfYmJfZ2V0X29iamVjdF9v ZmZzZXQoaWJiLCBzcmMtPmhhbmRsZSk7Cj4gKwlwb2ZmX2RzdCA9IGludGVsX2JiX2dldF9vYmpl Y3Rfb2Zmc2V0KGliYiwgZHN0LT5oYW5kbGUpOwo+ICsKPiArCS8qIEFkZCBidWZmZXJzIGFnYWlu ICovCj4gKwlpbnRlbF9iYl9hZGRfaW50ZWxfYnVmKGliYiwgc3JjLCBmYWxzZSk7Cj4gKwlpbnRl bF9iYl9hZGRfaW50ZWxfYnVmKGliYiwgZHN0LCB0cnVlKTsKPiArCj4gKwlpZ3RfYXNzZXJ0X2Yo cG9mZl9zcmMgPT0gc3JjLT5hZGRyLm9mZnNldCwKPiArCQkgICAgICJwcmV2IHNyYyBhZGRyOiAl IiBQUkl4NjQgIiA8PiBzcmMgYWRkciAlIiBQUkl4NjQgIlxuIiwKPiArCQkgICAgIHBvZmZfc3Jj LCBzcmMtPmFkZHIub2Zmc2V0KTsKPiArCWlndF9hc3NlcnRfZihwb2ZmX2RzdCA9PSBkc3QtPmFk ZHIub2Zmc2V0LAo+ICsJCSAgICAgInByZXYgZHN0IGFkZHI6ICUiIFBSSXg2NCAiIDw+IGRzdCBh ZGRyICUiIFBSSXg2NCAiXG4iLAo+ICsJCSAgICAgcG9mZl9kc3QsIGRzdC0+YWRkci5vZmZzZXQp Owo+ICsKPiArCWZpbGxfYnVmKHNyYywgQ09MT1JfNzcpOwo+ICsJZmlsbF9idWYoZHN0LCBDT0xP Ul8wMCk7Cj4gKwo+ICsJX19lbWl0X2JsaXQoaWJiLCBzcmMsIGRzdCk7Cj4gKwlpbnRlbF9iYl9l bWl0X2JiZShpYmIpOwo+ICsJaW50ZWxfYmJfZXhlYyhpYmIsIGludGVsX2JiX29mZnNldChpYmIp LAo+ICsJCSAgICAgIEk5MTVfRVhFQ19ERUZBVUxUIHwgSTkxNV9FWEVDX05PX1JFTE9DLCB0cnVl KTsKPiArCWludGVsX2JiX3Jlc2V0KGliYiwgZmFsc2UpOwo+ICsJY2hlY2tfYnVmKGRzdCwgQ09M T1JfNzcpOwo+ICsKPiArCWludGVsX2JiX2VtaXRfYmJlKGliYik7Cj4gKwlpbnRlbF9iYl9leGVj KGliYiwgaW50ZWxfYmJfb2Zmc2V0KGliYiksCj4gKwkJICAgICAgSTkxNV9FWEVDX0RFRkFVTFQg fCBJOTE1X0VYRUNfTk9fUkVMT0MsIHRydWUpOwo+ICsJaW50ZWxfYmJfcmVzZXQoaWJiLCBmYWxz ZSk7Cj4gKwljaGVja19idWYoZHN0LCBDT0xPUl83Nyk7Cj4gKwo+ICsJaW50ZWxfYnVmX2Rlc3Ry b3koc3JjKTsKPiArCWludGVsX2J1Zl9kZXN0cm95KGRzdCk7Cj4gKwlpbnRlbF9iYl9kZXN0cm95 KGliYik7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHNjcmF0Y2hfYnVmX2luaXQoc3RydWN0IGJ1 Zl9vcHMgKmJvcHMsCj4gKwkJCSAgICAgc3RydWN0IGludGVsX2J1ZiAqYnVmLAo+ICsJCQkgICAg IGludCB3aWR0aCwgaW50IGhlaWdodCwKPiArCQkJICAgICB1aW50MzJfdCByZXFfdGlsaW5nLAo+ ICsJCQkgICAgIGVudW0gaTkxNV9jb21wcmVzc2lvbiBjb21wcmVzc2lvbikKPiArewo+ICsJaW50 IGJwcCA9IDMyOwo+ICsKPiArCWludGVsX2J1Zl9pbml0KGJvcHMsIGJ1Ziwgd2lkdGgsIGhlaWdo dCwgYnBwLCAwLAo+ICsJCSAgICAgICByZXFfdGlsaW5nLCBjb21wcmVzc2lvbik7Cj4gKwo+ICsJ aWd0X2Fzc2VydChpbnRlbF9idWZfd2lkdGgoYnVmKSA9PSB3aWR0aCk7Cj4gKwlpZ3RfYXNzZXJ0 KGludGVsX2J1Zl9oZWlnaHQoYnVmKSA9PSBoZWlnaHQpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9p ZCBzY3JhdGNoX2J1Zl9kcmF3X3BhdHRlcm4oc3RydWN0IGJ1Zl9vcHMgKmJvcHMsCj4gKwkJCQkg ICAgIHN0cnVjdCBpbnRlbF9idWYgKmJ1ZiwKPiArCQkJCSAgICAgaW50IHgsIGludCB5LCBpbnQg dywgaW50IGgsCj4gKwkJCQkgICAgIGludCBjeCwgaW50IGN5LCBpbnQgY3csIGludCBjaCwKPiAr CQkJCSAgICAgYm9vbCB1c2VfYWx0ZXJuYXRlX2NvbG9ycykKPiArewo+ICsJY2Fpcm9fc3VyZmFj ZV90ICpzdXJmYWNlOwo+ICsJY2Fpcm9fcGF0dGVybl90ICpwYXQ7Cj4gKwljYWlyb190ICpjcjsK PiArCXZvaWQgKmxpbmVhcjsKPiArCj4gKwlsaW5lYXIgPSBhbGxvY19hbGlnbmVkKGJ1Zi0+c3Vy ZmFjZVswXS5zaXplKTsKPiArCj4gKwlzdXJmYWNlID0gY2Fpcm9faW1hZ2Vfc3VyZmFjZV9jcmVh dGVfZm9yX2RhdGEobGluZWFyLAo+ICsJCQkJCQkgICAgICBDQUlST19GT1JNQVRfUkdCMjQsCj4g KwkJCQkJCSAgICAgIGludGVsX2J1Zl93aWR0aChidWYpLAo+ICsJCQkJCQkgICAgICBpbnRlbF9i dWZfaGVpZ2h0KGJ1ZiksCj4gKwkJCQkJCSAgICAgIGJ1Zi0+c3VyZmFjZVswXS5zdHJpZGUpOwo+ ICsKPiArCWNyID0gY2Fpcm9fY3JlYXRlKHN1cmZhY2UpOwo+ICsKPiArCWNhaXJvX3JlY3Rhbmds ZShjciwgY3gsIGN5LCBjdywgY2gpOwo+ICsJY2Fpcm9fY2xpcChjcik7Cj4gKwo+ICsJcGF0ID0g Y2Fpcm9fcGF0dGVybl9jcmVhdGVfbWVzaCgpOwo+ICsJY2Fpcm9fbWVzaF9wYXR0ZXJuX2JlZ2lu X3BhdGNoKHBhdCk7Cj4gKwljYWlyb19tZXNoX3BhdHRlcm5fbW92ZV90byhwYXQsIHgsICAgeSk7 Cj4gKwljYWlyb19tZXNoX3BhdHRlcm5fbGluZV90byhwYXQsIHgrdywgeSk7Cj4gKwljYWlyb19t ZXNoX3BhdHRlcm5fbGluZV90byhwYXQsIHgrdywgeStoKTsKPiArCWNhaXJvX21lc2hfcGF0dGVy bl9saW5lX3RvKHBhdCwgeCwgICB5K2gpOwo+ICsJaWYgKHVzZV9hbHRlcm5hdGVfY29sb3JzKSB7 Cj4gKwkJY2Fpcm9fbWVzaF9wYXR0ZXJuX3NldF9jb3JuZXJfY29sb3JfcmdiKHBhdCwgMCwgMC4w LCAxLjAsIDEuMCk7Cj4gKwkJY2Fpcm9fbWVzaF9wYXR0ZXJuX3NldF9jb3JuZXJfY29sb3Jfcmdi KHBhdCwgMSwgMS4wLCAwLjAsIDEuMCk7Cj4gKwkJY2Fpcm9fbWVzaF9wYXR0ZXJuX3NldF9jb3Ju ZXJfY29sb3JfcmdiKHBhdCwgMiwgMS4wLCAxLjAsIDAuMCk7Cj4gKwkJY2Fpcm9fbWVzaF9wYXR0 ZXJuX3NldF9jb3JuZXJfY29sb3JfcmdiKHBhdCwgMywgMC4wLCAwLjAsIDAuMCk7Cj4gKwl9IGVs c2Ugewo+ICsJCWNhaXJvX21lc2hfcGF0dGVybl9zZXRfY29ybmVyX2NvbG9yX3JnYihwYXQsIDAs IDEuMCwgMC4wLCAwLjApOwo+ICsJCWNhaXJvX21lc2hfcGF0dGVybl9zZXRfY29ybmVyX2NvbG9y X3JnYihwYXQsIDEsIDAuMCwgMS4wLCAwLjApOwo+ICsJCWNhaXJvX21lc2hfcGF0dGVybl9zZXRf Y29ybmVyX2NvbG9yX3JnYihwYXQsIDIsIDAuMCwgMC4wLCAxLjApOwo+ICsJCWNhaXJvX21lc2hf cGF0dGVybl9zZXRfY29ybmVyX2NvbG9yX3JnYihwYXQsIDMsIDEuMCwgMS4wLCAxLjApOwo+ICsJ fQo+ICsJY2Fpcm9fbWVzaF9wYXR0ZXJuX2VuZF9wYXRjaChwYXQpOwo+ICsKPiArCWNhaXJvX3Jl Y3RhbmdsZShjciwgeCwgeSwgdywgaCk7Cj4gKwljYWlyb19zZXRfc291cmNlKGNyLCBwYXQpOwo+ ICsJY2Fpcm9fZmlsbChjcik7Cj4gKwljYWlyb19wYXR0ZXJuX2Rlc3Ryb3kocGF0KTsKPiArCj4g KwljYWlyb19kZXN0cm95KGNyKTsKPiArCj4gKwljYWlyb19zdXJmYWNlX2Rlc3Ryb3koc3VyZmFj ZSk7Cj4gKwo+ICsJbGluZWFyX3RvX2ludGVsX2J1Zihib3BzLCBidWYsIGxpbmVhcik7Cj4gKwo+ ICsJZnJlZShsaW5lYXIpOwo+ICt9Cj4gKwo+ICsjZGVmaW5lIEdST1VQX1NJWkUgNDA5Ngo+ICtz dGF0aWMgaW50IGNvbXBhcmVfZGV0YWlsKGNvbnN0IHVpbnQzMl90ICpwdHIxLCB1aW50MzJfdCAq cHRyMiwKPiArCQkJICB1aW50MzJfdCBzaXplKQo+ICt7Cj4gKwlpbnQgaSwgb2sgPSAwLCBmYWls ID0gMDsKPiArCWludCBncm91cHMgPSBzaXplIC8gR1JPVVBfU0laRTsKPiArCWludCAqaGlzdCA9 IGNhbGxvYyhHUk9VUF9TSVpFLCBncm91cHMpOwo+ICsKPiArCWlndF9kZWJ1Zygic2l6ZTogJWQs IGdyb3VwX3NpemU6ICVkLCBncm91cHM6ICVkXG4iLAo+ICsJCSAgc2l6ZSwgR1JPVVBfU0laRSwg Z3JvdXBzKTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZSAvIHNpemVvZih1aW50MzJfdCk7 IGkrKykgewo+ICsJCWlmIChwdHIxW2ldID09IHB0cjJbaV0pIHsKPiArCQkJb2srKzsKPiArCQl9 IGVsc2Ugewo+ICsJCQlmYWlsKys7Cj4gKwkJCWhpc3RbaSAqIHNpemVvZih1aW50MzJfdCkgLyBH Uk9VUF9TSVpFXSsrOwo+ICsJCX0KPiArCX0KPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgZ3JvdXBz OyBpKyspIHsKPiArCQlpZiAoaGlzdFtpXSkKPiArCQkJaWd0X2RlYnVnKCJbZ3JvdXAgJTR4XTog JWRcbiIsIGksIGhpc3RbaV0pOwo+ICsJfQoKTml0OiByZWR1bmRhbnQgYnJhY2VzCgoKPiArCWZy ZWUoaGlzdCk7Cj4gKwo+ICsJaWd0X2RlYnVnKCJvazogJWQsIGZhaWw6ICVkXG4iLCBvaywgZmFp bCk7Cj4gKwo+ICsJcmV0dXJuIGZhaWw7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgY29tcGFyZV9i dWZzKHN0cnVjdCBpbnRlbF9idWYgKmJ1ZjEsIHN0cnVjdCBpbnRlbF9idWYgKmJ1ZjIsCj4gKwkJ CSBib29sIGRldGFpbF9jb21wYXJlKQo+ICt7Cj4gKwl2b2lkICpwdHIxLCAqcHRyMjsKPiArCWlu dCBmZDEsIGZkMiwgcmV0Owo+ICsKPiArCWlndF9hc3NlcnQoYnVmMS0+c3VyZmFjZVswXS5zaXpl ID09IGJ1ZjItPnN1cmZhY2VbMF0uc2l6ZSk7Cj4gKwo+ICsJZmQxID0gYnVmX29wc19nZXRfZmQo YnVmMS0+Ym9wcyk7Cj4gKwlmZDIgPSBidWZfb3BzX2dldF9mZChidWYyLT5ib3BzKTsKPiArCj4g KwlwdHIxID0geGVfYm9fbWFwKGZkMSwgYnVmMS0+aGFuZGxlLCBidWYxLT5zdXJmYWNlWzBdLnNp emUpOwo+ICsJcHRyMiA9IHhlX2JvX21hcChmZDIsIGJ1ZjItPmhhbmRsZSwgYnVmMi0+c3VyZmFj ZVswXS5zaXplKTsKPiArCXJldCA9IG1lbWNtcChwdHIxLCBwdHIyLCBidWYxLT5zdXJmYWNlWzBd LnNpemUpOwo+ICsJaWYgKGRldGFpbF9jb21wYXJlKQo+ICsJCXJldCA9IGNvbXBhcmVfZGV0YWls KHB0cjEsIHB0cjIsIGJ1ZjEtPnN1cmZhY2VbMF0uc2l6ZSk7Cj4gKwo+ICsJbXVubWFwKHB0cjEs IGJ1ZjEtPnN1cmZhY2VbMF0uc2l6ZSk7Cj4gKwltdW5tYXAocHRyMiwgYnVmMi0+c3VyZmFjZVsw XS5zaXplKTsKPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICsjZGVmaW5lIExJTkVMRU4g NzZ1bAo+ICtzdGF0aWMgaW50IGR1bXBfYmFzZTY0KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBp bnRlbF9idWYgKmJ1ZikKPiArewo+ICsJdm9pZCAqcHRyOwo+ICsJaW50IGZkLCByZXQ7Cj4gKwl1 TG9uZ2Ygb3V0c2l6ZSA9IGJ1Zi0+c3VyZmFjZVswXS5zaXplICogMyAvIDI7Cj4gKwlCeXRlZiAq ZGVzdGJ1ZiA9IG1hbGxvYyhvdXRzaXplKTsKPiArCWdjaGFyICpzdHIsICpwb3M7Cj4gKwo+ICsJ ZmQgPSBidWZfb3BzX2dldF9mZChidWYtPmJvcHMpOwo+ICsKPiArCXB0ciA9IGdlbV9tbWFwX19k ZXZpY2VfY29oZXJlbnQoZmQsIGJ1Zi0+aGFuZGxlLCAwLAo+ICsJCQkJCWJ1Zi0+c3VyZmFjZVsw XS5zaXplLCBQUk9UX1JFQUQpOwo+ICsKPiArCXJldCA9IGNvbXByZXNzMihkZXN0YnVmLCAmb3V0 c2l6ZSwgcHRyLCBidWYtPnN1cmZhY2VbMF0uc2l6ZSwKPiArCQkJWl9CRVNUX0NPTVBSRVNTSU9O KTsKPiArCWlmIChyZXQgIT0gWl9PSykgewo+ICsJCWlndF93YXJuKCJlcnJvciBjb21wcmVzc2lu ZywgcmV0OiAlZFxuIiwgcmV0KTsKPiArCX0gZWxzZSB7Cj4gKwkJaWd0X2luZm8oImNvbXByZXNz ZWQgJSIgUFJJdTY0ICIgLT4gJWx1XG4iLAo+ICsJCQkgYnVmLT5zdXJmYWNlWzBdLnNpemUsIG91 dHNpemUpOwo+ICsKPiArCQlpZ3RfaW5mbygiLS0tICVzIC0tLVxuIiwgbmFtZSk7Cj4gKwkJcG9z ID0gc3RyID0gZ19iYXNlNjRfZW5jb2RlKGRlc3RidWYsIG91dHNpemUpOwo+ICsJCW91dHNpemUg PSBzdHJsZW4oc3RyKTsKPiArCQl3aGlsZSAocG9zKSB7Cj4gKwkJCWNoYXIgbGluZVtMSU5FTEVO ICsgMV07Cj4gKwkJCWludCB0b19jb3B5ID0gbWluKExJTkVMRU4sIG91dHNpemUpOwo+ICsKPiAr CQkJbWVtY3B5KGxpbmUsIHBvcywgdG9fY29weSk7Cj4gKwkJCWxpbmVbdG9fY29weV0gPSAwOwo+ ICsJCQlpZ3RfaW5mbygiJXNcbiIsIGxpbmUpOwo+ICsJCQlwb3MgKz0gTElORUxFTjsKPiArCQkJ b3V0c2l6ZSAtPSB0b19jb3B5Owo+ICsKPiArCQkJaWYgKG91dHNpemUgPT0gMCkKPiArCQkJCWJy ZWFrOwo+ICsJCX0KPiArCQlmcmVlKHN0cik7Cj4gKwl9Cj4gKwo+ICsJbXVubWFwKHB0ciwgYnVm LT5zdXJmYWNlWzBdLnNpemUpOwo+ICsJZnJlZShkZXN0YnVmKTsKPiArCj4gKwlyZXR1cm4gcmV0 Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IF9fZG9faW50ZWxfYmJfYmxpdChzdHJ1Y3QgYnVmX29w cyAqYm9wcywgdWludDMyX3QgdGlsaW5nKQo+ICt7Cj4gKwlzdHJ1Y3QgaW50ZWxfYmIgKmliYjsK PiArCWNvbnN0IGludCB3aWR0aCA9IDEwMjQ7Cj4gKwljb25zdCBpbnQgaGVpZ2h0ID0gMTAyNDsK PiArCXN0cnVjdCBpbnRlbF9idWYgc3JjLCBkc3QsIGZpbmFsOwo+ICsJY2hhciBuYW1lWzEyOF07 Cj4gKwlpbnQgeGUgPSBidWZfb3BzX2dldF9mZChib3BzKSwgZmFpbHM7Cj4gKwo+ICsJaWJiID0g aW50ZWxfYmJfY3JlYXRlKHhlLCBQQUdFX1NJWkUpOwo+ICsJaWYgKGRlYnVnX2JiKQo+ICsJCWlu dGVsX2JiX3NldF9kZWJ1ZyhpYmIsIHRydWUpOwo+ICsKPiArCXNjcmF0Y2hfYnVmX2luaXQoYm9w cywgJnNyYywgd2lkdGgsIGhlaWdodCwgSTkxNV9USUxJTkdfTk9ORSwKPiArCQkJIEk5MTVfQ09N UFJFU1NJT05fTk9ORSk7Cj4gKwlzY3JhdGNoX2J1Zl9pbml0KGJvcHMsICZkc3QsIHdpZHRoLCBo ZWlnaHQsIHRpbGluZywKPiArCQkJIEk5MTVfQ09NUFJFU1NJT05fTk9ORSk7Cj4gKwlzY3JhdGNo X2J1Zl9pbml0KGJvcHMsICZmaW5hbCwgd2lkdGgsIGhlaWdodCwgSTkxNV9USUxJTkdfTk9ORSwK PiArCQkJIEk5MTVfQ09NUFJFU1NJT05fTk9ORSk7Cj4gKwo+ICsJaWYgKGJ1Zl9pbmZvKSB7Cj4g KwkJaW50ZWxfYnVmX3ByaW50KCZzcmMpOwo+ICsJCWludGVsX2J1Zl9wcmludCgmZHN0KTsKPiAr CX0KPiArCj4gKwlzY3JhdGNoX2J1Zl9kcmF3X3BhdHRlcm4oYm9wcywgJnNyYywKPiArCQkJCSAw LCAwLCB3aWR0aCwgaGVpZ2h0LAo+ICsJCQkJIDAsIDAsIHdpZHRoLCBoZWlnaHQsIDApOwo+ICsK PiArCWludGVsX2JiX2JsdF9jb3B5KGliYiwKPiArCQkJICAmc3JjLCAwLCAwLCBzcmMuc3VyZmFj ZVswXS5zdHJpZGUsCj4gKwkJCSAgJmRzdCwgMCwgMCwgZHN0LnN1cmZhY2VbMF0uc3RyaWRlLAo+ ICsJCQkgIGludGVsX2J1Zl93aWR0aCgmZHN0KSwKPiArCQkJICBpbnRlbF9idWZfaGVpZ2h0KCZk c3QpLAo+ICsJCQkgIGRzdC5icHApOwo+ICsKPiArCWludGVsX2JiX2JsdF9jb3B5KGliYiwKPiAr CQkJICAmZHN0LCAwLCAwLCBkc3Quc3VyZmFjZVswXS5zdHJpZGUsCj4gKwkJCSAgJmZpbmFsLCAw LCAwLCBmaW5hbC5zdXJmYWNlWzBdLnN0cmlkZSwKPiArCQkJICBpbnRlbF9idWZfd2lkdGgoJmRz dCksCj4gKwkJCSAgaW50ZWxfYnVmX2hlaWdodCgmZHN0KSwKPiArCQkJICBkc3QuYnBwKTsKPiAr Cj4gKwlpZ3RfYXNzZXJ0KGludGVsX2JiX3N5bmMoaWJiKSA9PSAwKTsKPiArCWludGVsX2JiX2Rl c3Ryb3koaWJiKTsKPiArCj4gKwlpZiAod3JpdGVfcG5nKSB7Cj4gKwkJc25wcmludGYobmFtZSwg c2l6ZW9mKG5hbWUpIC0gMSwKPiArCQkJICJiYl9ibGl0X2RzdF90aWxpbmdfJWQucG5nIiwgdGls aW5nKTsKPiArCQlpbnRlbF9idWZfd3JpdGVfdG9fcG5nKCZzcmMsICJiYl9ibGl0X3NyY190aWxp bmdfbm9uZS5wbmciKTsKPiArCQlpbnRlbF9idWZfd3JpdGVfdG9fcG5nKCZkc3QsIG5hbWUpOwo+ ICsJCWludGVsX2J1Zl93cml0ZV90b19wbmcoJmZpbmFsLCAiYmJfYmxpdF9maW5hbF90aWxpbmdf bm9uZS5wbmciKTsKPiArCX0KPiArCj4gKwkvKiBXZSdsbCBmYWlsIG9uIHNyYyA8LT4gZmluYWwg Y29tcGFyZSBzbyBqdXN0IHdhcm4gKi8KPiArCWlmICh0aWxpbmcgPT0gSTkxNV9USUxJTkdfTk9O RSkgewo+ICsJCWlmIChjb21wYXJlX2J1ZnMoJnNyYywgJmRzdCwgZmFsc2UpID4gMCkKPiArCQkJ aWd0X3dhcm4oIm5vbmUtPm5vbmUgYmxpdCBmYWlsZWQhIik7Cj4gKwl9IGVsc2Ugewo+ICsJCWlm IChjb21wYXJlX2J1ZnMoJnNyYywgJmRzdCwgZmFsc2UpID09IDApCj4gKwkJCWlndF93YXJuKCJu b25lLT50aWxlZCBibGl0IGZhaWxlZCEiKTsKPiArCX0KCk1heWJlOgoKCWlmICh0aWxpbmcgPT0g STkxNV9USUxJTkdfTk9ORSAmJiBjb21wYXJlX2J1ZnMoJnNyYywgJmRzdCwgZmFsc2UpID4gMCkK CQlpZ3Rfd2Fybigibm9uZS0+bm9uZSBibGl0IGZhaWxlZCEiKTsKCWVsc2UgaWYgKGNvbXBhcmVf YnVmcygmc3JjLCAmZHN0LCBmYWxzZSkgPT0gMCkKCQlpZ3Rfd2Fybigibm9uZS0+dGlsZWQgYmxp dCBmYWlsZWQhIik7CgoKPiArCj4gKwlmYWlscyA9IGNvbXBhcmVfYnVmcygmc3JjLCAmZmluYWws IHRydWUpOwo+ICsKPiArCWludGVsX2J1Zl9jbG9zZShib3BzLCAmc3JjKTsKPiArCWludGVsX2J1 Zl9jbG9zZShib3BzLCAmZHN0KTsKPiArCWludGVsX2J1Zl9jbG9zZShib3BzLCAmZmluYWwpOwo+ ICsKPiArCXJldHVybiBmYWlsczsKPiArfQo+ICsKPiArLyoqCj4gKyAqIFNVQlRFU1Q6IGludGVs LWJiLWJsaXQtJXMKPiArICogRGVzY3JpcHRpb246IFJ1biBzaW1wbGUgYmIgeGUgJWFyZ1sxXSB0 ZXN0Cj4gKyAqIFJ1biB0eXBlOiBCQVQKPiArICoKPiArICogYXJnWzFdOgo+ICsgKgo+ICsgKiBA bm9uZToJCQkJbm9uZQo+ICsgKiBAeDoJCQkJCXgKPiArICogQHk6CQkJCQl5Cj4gKyAqLwoKSG1t IG5vdCBzdXJlIEkgdW5kZXJzdGFuZCB0aG9zZSBkb2NzIG9uIHRoZSBtdWx0aS10ZXN0IGZ1bmN0 aW9ucy4gRWl0aGVyIApJIGFtIG1pc3Npbmcgc29tZXRoaW5nIG9yIHRoZXkgZG9uJ3QgdGVsbCBt dWNoLgoKCj4gK3N0YXRpYyB2b2lkIGRvX2ludGVsX2JiX2JsaXQoc3RydWN0IGJ1Zl9vcHMgKmJv cHMsIGludCBsb29wcywgdWludDMyX3QgdGlsaW5nKQo+ICt7Cj4gKwlpbnQgaSwgZmFpbHMgPSAw LCB4ZSA9IGJ1Zl9vcHNfZ2V0X2ZkKGJvcHMpOwo+ICsKPiArCS8qIFdlJ2xsIGZpeCBpdCBmb3Ig Z2VuMi8zIGxhdGVyLiAqLwo+ICsJaWd0X3JlcXVpcmUoaW50ZWxfZ2VuKGludGVsX2dldF9kcm1f ZGV2aWQoeGUpKSA+IDMpOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBsb29wczsgaSsrKQo+ICsJ CWZhaWxzICs9IF9fZG9faW50ZWxfYmJfYmxpdChib3BzLCB0aWxpbmcpOwo+ICsKPiArCWlndF9h c3NlcnRfZihmYWlscyA9PSAwLCAiaW50ZWwtYmItYmxpdCAodGlsaW5nOiAlZCkgZmFpbHM6ICVk XG4iLAo+ICsJCSAgICAgdGlsaW5nLCBmYWlscyk7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBTVUJU RVNUOiBvZmZzZXQtY29udHJvbAo+ICsgKiBEZXNjcmlwdGlvbjogY2hlY2sgb2Zmc2V0IGlzIGtl cHQgb24gZGVmYXVsdCBzaW1wbGUgYWxsb2NhdG9yCj4gKyAqIFJ1biB0eXBlOiBGVUxMCj4gKyAq IFRPRE86IGNoYW5nZSBgYCdSdW4gdHlwZScgPT0gRlVMTGBgIHRvIGEgYmV0dGVyIGNhdGVnb3J5 Cj4gKyAqLwo+ICtzdGF0aWMgdm9pZCBvZmZzZXRfY29udHJvbChzdHJ1Y3QgYnVmX29wcyAqYm9w cykKPiArewo+ICsJaW50IHhlID0gYnVmX29wc19nZXRfZmQoYm9wcyk7Cj4gKwlzdHJ1Y3QgaW50 ZWxfYmIgKmliYjsKPiArCXN0cnVjdCBpbnRlbF9idWYgKnNyYywgKmRzdDEsICpkc3QyLCAqZHN0 MzsKPiArCXVpbnQ2NF90IHBvZmZfc3JjLCBwb2ZmX2RzdDEsIHBvZmZfZHN0MjsKPiArCj4gKwlp YmIgPSBpbnRlbF9iYl9jcmVhdGUoeGUsIFBBR0VfU0laRSk7Cj4gKwlpZiAoZGVidWdfYmIpCj4g KwkJaW50ZWxfYmJfc2V0X2RlYnVnKGliYiwgdHJ1ZSk7Cj4gKwo+ICsJc3JjID0gY3JlYXRlX2J1 Zihib3BzLCBXSURUSCwgSEVJR0hULCBDT0xPUl9DQyk7Cj4gKwlkc3QxID0gY3JlYXRlX2J1Zihi b3BzLCBXSURUSCwgSEVJR0hULCBDT0xPUl8wMCk7Cj4gKwlkc3QyID0gY3JlYXRlX2J1Zihib3Bz LCBXSURUSCwgSEVJR0hULCBDT0xPUl83Nyk7Cj4gKwo+ICsJaW50ZWxfYmJfYWRkX29iamVjdChp YmIsIHNyYy0+aGFuZGxlLCBpbnRlbF9idWZfYm9fc2l6ZShzcmMpLAo+ICsJCQkgICAgc3JjLT5h ZGRyLm9mZnNldCwgMCwgZmFsc2UpOwo+ICsJaW50ZWxfYmJfYWRkX29iamVjdChpYmIsIGRzdDEt PmhhbmRsZSwgaW50ZWxfYnVmX2JvX3NpemUoZHN0MSksCj4gKwkJCSAgICBkc3QxLT5hZGRyLm9m ZnNldCwgMCwgdHJ1ZSk7Cj4gKwlpbnRlbF9iYl9hZGRfb2JqZWN0KGliYiwgZHN0Mi0+aGFuZGxl LCBpbnRlbF9idWZfYm9fc2l6ZShkc3QyKSwKPiArCQkJICAgIGRzdDItPmFkZHIub2Zmc2V0LCAw LCB0cnVlKTsKPiArCj4gKwlpbnRlbF9iYl9vdXQoaWJiLCBNSV9CQVRDSF9CVUZGRVJfRU5EKTsK PiArCWludGVsX2JiX3B0cl9hbGlnbihpYmIsIDgpOwo+ICsKPiArCWludGVsX2JiX2V4ZWMoaWJi LCBpbnRlbF9iYl9vZmZzZXQoaWJiKSwKPiArCQkgICAgICBJOTE1X0VYRUNfREVGQVVMVCB8IEk5 MTVfRVhFQ19OT19SRUxPQywgZmFsc2UpOwo+ICsKPiArCWlmIChidWZfaW5mbykgewo+ICsJCXBy aW50X2J1ZihzcmMsICJzcmMgIik7Cj4gKwkJcHJpbnRfYnVmKGRzdDEsICJkc3QxIik7Cj4gKwkJ cHJpbnRfYnVmKGRzdDIsICJkc3QyIik7Cj4gKwl9Cj4gKwo+ICsJcG9mZl9zcmMgPSBzcmMtPmFk ZHIub2Zmc2V0Owo+ICsJcG9mZl9kc3QxID0gZHN0MS0+YWRkci5vZmZzZXQ7Cj4gKwlwb2ZmX2Rz dDIgPSBkc3QyLT5hZGRyLm9mZnNldDsKPiArCWludGVsX2JiX3Jlc2V0KGliYiwgdHJ1ZSk7Cj4g Kwo+ICsJZHN0MyA9IGNyZWF0ZV9idWYoYm9wcywgV0lEVEgsIEhFSUdIVCwgQ09MT1JfMzMpOwo+ ICsJaW50ZWxfYmJfYWRkX29iamVjdChpYmIsIGRzdDMtPmhhbmRsZSwgaW50ZWxfYnVmX2JvX3Np emUoZHN0MyksCj4gKwkJCSAgICBkc3QzLT5hZGRyLm9mZnNldCwgMCwgdHJ1ZSk7Cj4gKwlpbnRl bF9iYl9hZGRfb2JqZWN0KGliYiwgc3JjLT5oYW5kbGUsIGludGVsX2J1Zl9ib19zaXplKHNyYyks Cj4gKwkJCSAgICBzcmMtPmFkZHIub2Zmc2V0LCAwLCBmYWxzZSk7Cj4gKwlpbnRlbF9iYl9hZGRf b2JqZWN0KGliYiwgZHN0MS0+aGFuZGxlLCBpbnRlbF9idWZfYm9fc2l6ZShkc3QxKSwKPiArCQkJ ICAgIGRzdDEtPmFkZHIub2Zmc2V0LCAwLCB0cnVlKTsKPiArCWludGVsX2JiX2FkZF9vYmplY3Qo aWJiLCBkc3QyLT5oYW5kbGUsIGludGVsX2J1Zl9ib19zaXplKGRzdDIpLAo+ICsJCQkgICAgZHN0 Mi0+YWRkci5vZmZzZXQsIDAsIHRydWUpOwo+ICsKPiArCWludGVsX2JiX291dChpYmIsIE1JX0JB VENIX0JVRkZFUl9FTkQpOwo+ICsJaW50ZWxfYmJfcHRyX2FsaWduKGliYiwgOCk7Cj4gKwo+ICsJ aW50ZWxfYmJfZXhlYyhpYmIsIGludGVsX2JiX29mZnNldChpYmIpLAo+ICsJCSAgICAgIEk5MTVf RVhFQ19ERUZBVUxUIHwgSTkxNV9FWEVDX05PX1JFTE9DLCBmYWxzZSk7Cj4gKwlpbnRlbF9iYl9z eW5jKGliYik7Cj4gKwlpbnRlbF9iYl9yZXNldChpYmIsIHRydWUpOwo+ICsKPiArCWlndF9hc3Nl cnQocG9mZl9zcmMgPT0gc3JjLT5hZGRyLm9mZnNldCk7Cj4gKwlpZ3RfYXNzZXJ0KHBvZmZfZHN0 MSA9PSBkc3QxLT5hZGRyLm9mZnNldCk7Cj4gKwlpZ3RfYXNzZXJ0KHBvZmZfZHN0MiA9PSBkc3Qy LT5hZGRyLm9mZnNldCk7Cj4gKwo+ICsJaWYgKGJ1Zl9pbmZvKSB7Cj4gKwkJcHJpbnRfYnVmKHNy YywgInNyYyAiKTsKPiArCQlwcmludF9idWYoZHN0MSwgImRzdDEiKTsKPiArCQlwcmludF9idWYo ZHN0MiwgImRzdDIiKTsKPiArCX0KPiArCj4gKwlpbnRlbF9idWZfZGVzdHJveShzcmMpOwo+ICsJ aW50ZWxfYnVmX2Rlc3Ryb3koZHN0MSk7Cj4gKwlpbnRlbF9idWZfZGVzdHJveShkc3QyKTsKPiAr CWludGVsX2J1Zl9kZXN0cm95KGRzdDMpOwo+ICsJaW50ZWxfYmJfZGVzdHJveShpYmIpOwo+ICt9 Cj4gKwo+ICsvKgo+ICsgKiBJZGVhIG9mIHRoZSB0ZXN0IGlzIHRvIHZlcmlmeSBkZWx0YSBpcyBw cm9wZXJseSBhZGRlZCB0byBhZGRyZXNzCj4gKyAqIHdoZW4gZW1pdF9yZWxvYygpIGlzIGNhbGxl ZC4KPiArICovCj4gKwo+ICsvKioKPiArICogU1VCVEVTVDogZGVsdGEtY2hlY2sKPiArICogRGVz Y3JpcHRpb246IGNoZWNrIGRlbHRhIGlzIGhvbm91cmVkIGluIGludGVsLWJiIHBpcGVsaW5lcwo+ ICsgKiBSdW4gdHlwZTogRlVMTAo+ICsgKiBUT0RPOiBjaGFuZ2UgYGAnUnVuIHR5cGUnID09IEZV TExgYCB0byBhIGJldHRlciBjYXRlZ29yeQo+ICsgKi8KPiArI2RlZmluZSBERUxUQV9CVUZGRVJT IDMKPiArc3RhdGljIHZvaWQgZGVsdGFfY2hlY2soc3RydWN0IGJ1Zl9vcHMgKmJvcHMpCj4gK3sK PiArCWNvbnN0IHVpbnQzMl90IGV4cGVjdGVkID0gMHgxMjM0YWJjZDsKPiArCWludCB4ZSA9IGJ1 Zl9vcHNfZ2V0X2ZkKGJvcHMpOwo+ICsJdWludDMyX3QgKnB0ciwgaGksIGxvLCB2YWw7Cj4gKwlz dHJ1Y3QgaW50ZWxfYnVmICpidWY7Cj4gKwlzdHJ1Y3QgaW50ZWxfYmIgKmliYjsKPiArCXVpbnQ2 NF90IG9mZnNldDsKPiArCXVpbnQ2NF90IG9ial9zaXplID0geGVfZ2V0X2RlZmF1bHRfYWxpZ25t ZW50KHhlKSArIDB4MjAwMDsKPiArCXVpbnQ2NF90IG9ial9vZmZzZXQgPSAoMVVMTCA8PCAzMikg LSB4ZV9nZXRfZGVmYXVsdF9hbGlnbm1lbnQoeGUpOwo+ICsJdWludDY0X3QgZGVsdGEgPSB4ZV9n ZXRfZGVmYXVsdF9hbGlnbm1lbnQoeGUpICsgMHgxMDAwOwo+ICsKPiArCWliYiA9IGludGVsX2Ji X2NyZWF0ZV93aXRoX2FsbG9jYXRvcih4ZSwgMCwgTlVMTCwgUEFHRV9TSVpFLAo+ICsJCQkJCSAg ICAgSU5URUxfQUxMT0NBVE9SX1NJTVBMRSk7Cj4gKwlpZiAoZGVidWdfYmIpCj4gKwkJaW50ZWxf YmJfc2V0X2RlYnVnKGliYiwgdHJ1ZSk7Cj4gKwo+ICsJYnVmID0gY3JlYXRlX2J1Zihib3BzLCBv Ympfc2l6ZSwgMHgxLCBDT0xPUl9DQyk7Cj4gKwlidWYtPmFkZHIub2Zmc2V0ID0gb2JqX29mZnNl dDsKPiArCWludGVsX2JiX2FkZF9vYmplY3QoaWJiLCBidWYtPmhhbmRsZSwgaW50ZWxfYnVmX2Jv X3NpemUoYnVmKSwKPiArCQkJICAgIGJ1Zi0+YWRkci5vZmZzZXQsIDAsIGZhbHNlKTsKPiArCj4g KwlpbnRlbF9iYl9vdXQoaWJiLCBNSV9TVE9SRV9EV09SRF9JTU1fR0VONCk7Cj4gKwlpbnRlbF9i Yl9lbWl0X3JlbG9jKGliYiwgYnVmLT5oYW5kbGUsCj4gKwkJCSAgICBJOTE1X0dFTV9ET01BSU5f UkVOREVSLAo+ICsJCQkgICAgSTkxNV9HRU1fRE9NQUlOX1JFTkRFUiwKPiArCQkJICAgIGRlbHRh LCBidWYtPmFkZHIub2Zmc2V0KTsKPiArCWludGVsX2JiX291dChpYmIsIGV4cGVjdGVkKTsKPiAr Cj4gKwlpbnRlbF9iYl9vdXQoaWJiLCBNSV9CQVRDSF9CVUZGRVJfRU5EKTsKPiArCWludGVsX2Ji X3B0cl9hbGlnbihpYmIsIDgpOwo+ICsKPiArCWludGVsX2JiX2V4ZWMoaWJiLCBpbnRlbF9iYl9v ZmZzZXQoaWJiKSwgSTkxNV9FWEVDX0RFRkFVTFQsIGZhbHNlKTsKPiArCWludGVsX2JiX3N5bmMo aWJiKTsKPiArCj4gKwkvKiBCdWZmZXIgc2hvdWxkIGJlIEAgb2JqX29mZnNldCAqLwo+ICsJb2Zm c2V0ID0gaW50ZWxfYmJfZ2V0X29iamVjdF9vZmZzZXQoaWJiLCBidWYtPmhhbmRsZSk7Cj4gKwlp Z3RfYXNzZXJ0X2VxX3U2NChvZmZzZXQsIG9ial9vZmZzZXQpOwo+ICsKPiArCXB0ciA9IHhlX2Jv X21hcCh4ZSwgaWJiLT5oYW5kbGUsIGliYi0+c2l6ZSk7Cj4gKwlsbyA9IHB0clsxXTsKPiArCWhp ID0gcHRyWzJdOwo+ICsJZ2VtX211bm1hcChwdHIsIGliYi0+c2l6ZSk7Cj4gKwo+ICsJcHRyID0g eGVfYm9fbWFwKHhlLCBidWYtPmhhbmRsZSwgaW50ZWxfYnVmX3NpemUoYnVmKSk7Cj4gKwl2YWwg PSBwdHJbZGVsdGEgLyBzaXplb2YodWludDMyX3QpXTsKPiArCWdlbV9tdW5tYXAocHRyLCBpbnRl bF9idWZfc2l6ZShidWYpKTsKPiArCj4gKwlpbnRlbF9idWZfZGVzdHJveShidWYpOwo+ICsJaW50 ZWxfYmJfZGVzdHJveShpYmIpOwo+ICsKPiArCS8qIEFzc2VydCBhZnRlciBhbGwgcmVzb3VyY2Vz IGFyZSBmcmVlZCAqLwo+ICsJaWd0X2Fzc2VydF9mKGxvID09IDB4MTAwMCAmJiBoaSA9PSAweDEs Cj4gKwkJICAgICAiaW50ZWwtYmIgZG9lc24ndCBwcm9wZXJseSBoYW5kbGUgZGVsdGEgaW4gZW1p dCByZWxvY2F0aW9uXG4iKTsKPiArCWlndF9hc3NlcnRfZih2YWwgPT0gZXhwZWN0ZWQsCj4gKwkJ ICAgICAiQWRkcmVzcyBkb2Vzbid0IGNvbnRhaW4gZXhwZWN0ZWQgWyV4XSB2YWx1ZSBbJXhdXG4i LAo+ICsJCSAgICAgZXhwZWN0ZWQsIHZhbCk7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBTVUJURVNU OiBmdWxsLWJhdGNoCj4gKyAqIERlc2NyaXB0aW9uOiBjaGVjayBiYiB0b3RhbGx5IGZpbGxlZCBp cyBleGVjdXRpbmcgY29ycmVjdAo+ICsgKiBSdW4gdHlwZTogRlVMTAo+ICsgKiBUT0RPOiBjaGFu Z2UgYGAnUnVuIHR5cGUnID09IEZVTExgYCB0byBhIGJldHRlciBjYXRlZ29yeQo+ICsgKi8KPiAr c3RhdGljIHZvaWQgZnVsbF9iYXRjaChzdHJ1Y3QgYnVmX29wcyAqYm9wcykKPiArewo+ICsJaW50 IHhlID0gYnVmX29wc19nZXRfZmQoYm9wcyk7Cj4gKwlzdHJ1Y3QgaW50ZWxfYmIgKmliYjsKPiAr CWludCBpOwo+ICsKPiArCWliYiA9IGludGVsX2JiX2NyZWF0ZSh4ZSwgUEFHRV9TSVpFKTsKPiAr CWlmIChkZWJ1Z19iYikKPiArCQlpbnRlbF9iYl9zZXRfZGVidWcoaWJiLCB0cnVlKTsKPiArCj4g Kwlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpFIC8gc2l6ZW9mKHVpbnQzMl90KSAtIDE7IGkrKykK PiArCQlpbnRlbF9iYl9vdXQoaWJiLCAwKTsKPiArCWludGVsX2JiX2VtaXRfYmJlKGliYik7Cj4g Kwo+ICsJaWd0X2Fzc2VydChpbnRlbF9iYl9vZmZzZXQoaWJiKSA9PSBQQUdFX1NJWkUpOwo+ICsJ aW50ZWxfYmJfZXhlYyhpYmIsIGludGVsX2JiX29mZnNldChpYmIpLAo+ICsJCSAgICAgIEk5MTVf RVhFQ19ERUZBVUxUIHwgSTkxNV9FWEVDX05PX1JFTE9DLCB0cnVlKTsKPiArCWludGVsX2JiX3Jl c2V0KGliYiwgZmFsc2UpOwo+ICsKPiArCWludGVsX2JiX2Rlc3Ryb3koaWJiKTsKPiArfQo+ICsK PiArLyoqCj4gKyAqIFNVQlRFU1Q6IHJlbmRlcgo+ICsgKiBEZXNjcmlwdGlvbjogY2hlY2sgaW50 ZWwtYmIgcmVuZGVyIHBpcGVsaW5lCj4gKyAqIFJ1biB0eXBlOiBGVUxMCj4gKyAqIFRPRE86IGNo YW5nZSBgYCdSdW4gdHlwZScgPT0gRlVMTGBgIHRvIGEgYmV0dGVyIGNhdGVnb3J5Cj4gKyAqLwo+ ICtzdGF0aWMgaW50IHJlbmRlcihzdHJ1Y3QgYnVmX29wcyAqYm9wcywgdWludDMyX3QgdGlsaW5n LAo+ICsJCSAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkKPiArewo+ICsJc3RydWN0 IGludGVsX2JiICppYmI7Cj4gKwlzdHJ1Y3QgaW50ZWxfYnVmIHNyYywgZHN0LCBmaW5hbDsKPiAr CWludCB4ZSA9IGJ1Zl9vcHNfZ2V0X2ZkKGJvcHMpOwo+ICsJdWludDMyX3QgZmFpbHMgPSAwOwo+ ICsJY2hhciBuYW1lWzEyOF07Cj4gKwl1aW50MzJfdCBkZXZpZCA9IGludGVsX2dldF9kcm1fZGV2 aWQoeGUpOwo+ICsJaWd0X3JlbmRlcl9jb3B5ZnVuY190IHJlbmRlcl9jb3B5ID0gTlVMTDsKPiAr Cj4gKwlpZ3RfZGVidWcoIiVzKCkgZ2VuOiAlZFxuIiwgX19mdW5jX18sIGludGVsX2dlbihkZXZp ZCkpOwo+ICsKPiArCWliYiA9IGludGVsX2JiX2NyZWF0ZSh4ZSwgUEFHRV9TSVpFKTsKPiArCj4g KwlpZiAoZGVidWdfYmIpCj4gKwkJaW50ZWxfYmJfc2V0X2RlYnVnKGliYiwgdHJ1ZSk7Cj4gKwo+ ICsJaWYgKHByaW50X2Jhc2U2NCkKPiArCQlpbnRlbF9iYl9zZXRfZHVtcF9iYXNlNjQoaWJiLCB0 cnVlKTsKPiArCj4gKwlzY3JhdGNoX2J1Zl9pbml0KGJvcHMsICZzcmMsIHdpZHRoLCBoZWlnaHQs IEk5MTVfVElMSU5HX05PTkUsCj4gKwkJCSBJOTE1X0NPTVBSRVNTSU9OX05PTkUpOwo+ICsJc2Ny YXRjaF9idWZfaW5pdChib3BzLCAmZHN0LCB3aWR0aCwgaGVpZ2h0LCB0aWxpbmcsCj4gKwkJCSBJ OTE1X0NPTVBSRVNTSU9OX05PTkUpOwo+ICsJc2NyYXRjaF9idWZfaW5pdChib3BzLCAmZmluYWws IHdpZHRoLCBoZWlnaHQsIEk5MTVfVElMSU5HX05PTkUsCj4gKwkJCSBJOTE1X0NPTVBSRVNTSU9O X05PTkUpOwo+ICsKPiArCXNjcmF0Y2hfYnVmX2RyYXdfcGF0dGVybihib3BzLCAmc3JjLAo+ICsJ CQkJIDAsIDAsIHdpZHRoLCBoZWlnaHQsCj4gKwkJCQkgMCwgMCwgd2lkdGgsIGhlaWdodCwgMCk7 Cj4gKwo+ICsJcmVuZGVyX2NvcHkgPSBpZ3RfZ2V0X3JlbmRlcl9jb3B5ZnVuYyhkZXZpZCk7Cj4g KwlpZ3RfYXNzZXJ0KHJlbmRlcl9jb3B5KTsKPiArCj4gKwlyZW5kZXJfY29weShpYmIsCj4gKwkJ ICAgICZzcmMsCj4gKwkJICAgIDAsIDAsIHdpZHRoLCBoZWlnaHQsCj4gKwkJICAgICZkc3QsCj4g KwkJICAgIDAsIDApOwo+ICsKPiArCXJlbmRlcl9jb3B5KGliYiwKPiArCQkgICAgJmRzdCwKPiAr CQkgICAgMCwgMCwgd2lkdGgsIGhlaWdodCwKPiArCQkgICAgJmZpbmFsLAo+ICsJCSAgICAwLCAw KTsKPiArCj4gKwlpbnRlbF9iYl9zeW5jKGliYik7Cj4gKwlpbnRlbF9iYl9kZXN0cm95KGliYik7 Cj4gKwo+ICsJaWYgKHdyaXRlX3BuZykgewo+ICsJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1l KSAtIDEsCj4gKwkJCSAicmVuZGVyX2RzdF90aWxpbmdfJWQucG5nIiwgdGlsaW5nKTsKPiArCQlp bnRlbF9idWZfd3JpdGVfdG9fcG5nKCZzcmMsICJyZW5kZXJfc3JjX3RpbGluZ19ub25lLnBuZyIp Owo+ICsJCWludGVsX2J1Zl93cml0ZV90b19wbmcoJmRzdCwgbmFtZSk7Cj4gKwkJaW50ZWxfYnVm X3dyaXRlX3RvX3BuZygmZmluYWwsICJyZW5kZXJfZmluYWxfdGlsaW5nX25vbmUucG5nIik7Cj4g Kwl9Cj4gKwo+ICsJLyogV2UnbGwgZmFpbCBvbiBzcmMgPC0+IGZpbmFsIGNvbXBhcmUgc28ganVz dCB3YXJuICovCj4gKwlpZiAodGlsaW5nID09IEk5MTVfVElMSU5HX05PTkUpIHsKPiArCQlpZiAo Y29tcGFyZV9idWZzKCZzcmMsICZkc3QsIGZhbHNlKSA+IDApCj4gKwkJCWlndF93YXJuKCIlczog bm9uZS0+bm9uZSBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7Cj4gKwl9IGVsc2Ugewo+ICsJCWlmIChj b21wYXJlX2J1ZnMoJnNyYywgJmRzdCwgZmFsc2UpID09IDApCj4gKwkJCWlndF93YXJuKCIlczog bm9uZS0+dGlsZWQgZmFpbGVkIVxuIiwgX19mdW5jX18pOwo+ICsJfQoKTGlrZSBmb3IgYmxpdCwg Y2FuIGJlIGNvbXBhY3RlZCwgbm90IGluc2lzdGluZyB0aG91Z2guCgoKPiArCj4gKwlmYWlscyA9 IGNvbXBhcmVfYnVmcygmc3JjLCAmZmluYWwsIHRydWUpOwo+ICsKPiArCWlmIChmYWlscyAmJiBw cmludF9iYXNlNjQpIHsKPiArCQlkdW1wX2Jhc2U2NCgic3JjIiwgJnNyYyk7Cj4gKwkJZHVtcF9i YXNlNjQoImRzdCIsICZkc3QpOwo+ICsJCWR1bXBfYmFzZTY0KCJmaW5hbCIsICZmaW5hbCk7Cj4g Kwl9Cj4gKwo+ICsJaW50ZWxfYnVmX2Nsb3NlKGJvcHMsICZzcmMpOwo+ICsJaW50ZWxfYnVmX2Ns b3NlKGJvcHMsICZkc3QpOwo+ICsJaW50ZWxfYnVmX2Nsb3NlKGJvcHMsICZmaW5hbCk7Cj4gKwo+ ICsJaWd0X2Fzc2VydF9mKGZhaWxzID09IDAsICIlczogKHRpbGluZzogJWQpIGZhaWxzOiAlZFxu IiwKPiArCQkgICAgIF9fZnVuY19fLCB0aWxpbmcsIGZhaWxzKTsKPiArCj4gKwlyZXR1cm4gZmFp bHM7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgb3B0X2hhbmRsZXIoaW50IG9wdCwgaW50IG9wdF9p bmRleCwgdm9pZCAqZGF0YSkKPiArewo+ICsJc3dpdGNoIChvcHQpIHsKPiArCWNhc2UgJ2QnOgo+ ICsJCWRlYnVnX2JiID0gdHJ1ZTsKPiArCQlicmVhazsKPiArCWNhc2UgJ3AnOgo+ICsJCXdyaXRl X3BuZyA9IHRydWU7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlICdpJzoKPiArCQlidWZfaW5mbyA9IHRy dWU7Cj4gKwkJYnJlYWs7Cj4gKwljYXNlICdiJzoKPiArCQlwcmludF9iYXNlNjQgPSB0cnVlOwo+ ICsJCWJyZWFrOwo+ICsJZGVmYXVsdDoKPiArCQlyZXR1cm4gSUdUX09QVF9IQU5ETEVSX0VSUk9S Owo+ICsJfQo+ICsKPiArCXJldHVybiBJR1RfT1BUX0hBTkRMRVJfU1VDQ0VTUzsKPiArfQo+ICsK PiArY29uc3QgY2hhciAqaGVscF9zdHIgPQo+ICsJIiAgLWRcdERlYnVnIGJiXG4iCj4gKwkiICAt cFx0V3JpdGUgc3VyZmFjZXMgdG8gcG5nXG4iCj4gKwkiICAtaVx0UHJpbnQgYnVmZmVyIGluZm9c biIKPiArCSIgIC1iXHREdW1wIHRvIGJhc2U2NCAoYmIgYW5kIGltYWdlcylcbiIKPiArCSIgIC1j IG5cdENhbGN1bGF0ZSBjcmMgdXAgdG8gKDEgPDwgbilcbiIKCidjJyBzZWVtcyB0byBiZSBtaXNz aW5nIGluIG9wdF9oYW5kbGVyIGFib3ZlLCBhbmQgaW4gb3B0IGxpc3QgYmVsb3cuCgoKPiArCTsK PiArCj4gK2lndF9tYWluX2FyZ3MoImRwaWIiLCBOVUxMLCBoZWxwX3N0ciwgb3B0X2hhbmRsZXIs IE5VTEwpCj4gK3sKPiArCWludCB4ZSwgaTsKPiArCXN0cnVjdCBidWZfb3BzICpib3BzOwo+ICsJ dWludDMyX3Qgd2lkdGg7Cj4gKwo+ICsJc3RydWN0IHRlc3Qgewo+ICsJCXVpbnQzMl90IHRpbGlu ZzsKPiArCQljb25zdCBjaGFyICp0aWxpbmdfbmFtZTsKPiArCX0gdGVzdHNbXSA9IHsKPiArCQl7 IEk5MTVfVElMSU5HX05PTkUsICJub25lIiB9LAo+ICsJCXsgSTkxNV9USUxJTkdfWCwgIngiIH0s Cj4gKwkJeyBJOTE1X1RJTElOR19ZLCAieSIgfSwKPiArCX07Cj4gKwo+ICsJaWd0X2ZpeHR1cmUg ewo+ICsJCXhlID0gZHJtX29wZW5fZHJpdmVyKERSSVZFUl9YRSk7Cj4gKwkJYm9wcyA9IGJ1Zl9v cHNfY3JlYXRlKHhlKTsKPiArCQl4ZV9kZXZpY2VfZ2V0KHhlKTsKPiArCX0KPiArCj4gKwlpZ3Rf ZGVzY3JpYmUoIkVuc3VyZSByZXNldCBpcyBwb3NzaWJsZSBvbiBmcmVzaCBiYiIpOwo+ICsJaWd0 X3N1YnRlc3QoInJlc2V0LWJiIikKPiArCQlyZXNldF9iYihib3BzKTsKPiArCj4gKwlpZ3Rfc3Vi dGVzdF9mKCJwdXJnZS1iYiIpCj4gKwkJcHVyZ2VfYmIoYm9wcyk7Cj4gKwo+ICsJaWd0X3N1YnRl c3QoInNpbXBsZS1iYiIpCj4gKwkJc2ltcGxlX2JiKGJvcHMsIGZhbHNlKTsKPiArCj4gKwlpZ3Rf c3VidGVzdCgic2ltcGxlLWJiLWN0eCIpCj4gKwkJc2ltcGxlX2JiKGJvcHMsIHRydWUpOwo+ICsK PiArCWlndF9zdWJ0ZXN0KCJiYi13aXRoLWFsbG9jYXRvciIpCj4gKwkJYmJfd2l0aF9hbGxvY2F0 b3IoYm9wcyk7Cj4gKwo+ICsJaWd0X3N1YnRlc3QoImxvdC1vZi1idWZmZXJzIikKPiArCQlsb3Rf b2ZfYnVmZmVycyhib3BzKTsKPiArCj4gKwlpZ3Rfc3VidGVzdCgiYWRkLXJlbW92ZS1vYmplY3Rz IikKPiArCQlhZGRfcmVtb3ZlX29iamVjdHMoYm9wcyk7Cj4gKwo+ICsJaWd0X3N1YnRlc3QoImRl c3Ryb3ktYmIiKQo+ICsJCWRlc3Ryb3lfYmIoYm9wcyk7Cj4gKwo+ICsJaWd0X3N1YnRlc3Rfd2l0 aF9keW5hbWljKCJjcmVhdGUtaW4tcmVnaW9uIikgewo+ICsJCXVpbnQ2NF90IG1lbXJlZyA9IGFs bF9tZW1vcnlfcmVnaW9ucyh4ZSksIHJlZ2lvbjsKPiArCj4gKwkJeGVfZm9yX2VhY2hfbWVtX3Jl Z2lvbihmZCwgbWVtcmVnLCByZWdpb24pCj4gKwkJCWlndF9keW5hbWljX2YoInJlZ2lvbi0lcyIs IHhlX3JlZ2lvbl9uYW1lKHJlZ2lvbikpCj4gKwkJCQljcmVhdGVfaW5fcmVnaW9uKGJvcHMsIHJl Z2lvbik7Cj4gKwl9Cj4gKwo+ICsJaWd0X3N1YnRlc3QoImJsaXQtc2ltcGxlIikKPiArCQlibGl0 KGJvcHMsIElOVEVMX0FMTE9DQVRPUl9TSU1QTEUpOwo+ICsKPiArCWlndF9zdWJ0ZXN0KCJibGl0 LXJlbG9jIikKPiArCQlibGl0KGJvcHMsIElOVEVMX0FMTE9DQVRPUl9SRUxPQyk7Cj4gKwo+ICsJ aWd0X3N1YnRlc3QoImludGVsLWJiLWJsaXQtbm9uZSIpCj4gKwkJZG9faW50ZWxfYmJfYmxpdChi b3BzLCAzLCBJOTE1X1RJTElOR19OT05FKTsKPiArCj4gKwlpZ3Rfc3VidGVzdCgiaW50ZWwtYmIt YmxpdC14IikKPiArCQlkb19pbnRlbF9iYl9ibGl0KGJvcHMsIDMsIEk5MTVfVElMSU5HX1gpOwo+ ICsKPiArCWlndF9zdWJ0ZXN0KCJpbnRlbC1iYi1ibGl0LXkiKSB7Cj4gKwkJaWd0X3JlcXVpcmUo aW50ZWxfZ2VuKGludGVsX2dldF9kcm1fZGV2aWQoeGUpKSA+PSA2KTsKPiArCQlkb19pbnRlbF9i Yl9ibGl0KGJvcHMsIDMsIEk5MTVfVElMSU5HX1kpOwo+ICsJfQo+ICsKPiArCWlndF9zdWJ0ZXN0 KCJvZmZzZXQtY29udHJvbCIpCj4gKwkJb2Zmc2V0X2NvbnRyb2woYm9wcyk7Cj4gKwo+ICsJaWd0 X3N1YnRlc3QoImRlbHRhLWNoZWNrIikKPiArCQlkZWx0YV9jaGVjayhib3BzKTsKPiArCj4gKwlp Z3Rfc3VidGVzdCgiZnVsbC1iYXRjaCIpCj4gKwkJZnVsbF9iYXRjaChib3BzKTsKPiArCj4gKwlp Z3Rfc3VidGVzdF93aXRoX2R5bmFtaWMoInJlbmRlciIpIHsKPiArCQlmb3IgKGkgPSAwOyBpIDwg QVJSQVlfU0laRSh0ZXN0cyk7IGkrKykgewo+ICsJCQljb25zdCBzdHJ1Y3QgdGVzdCAqdCA9ICZ0 ZXN0c1tpXTsKPiArCj4gKwkJCWZvciAod2lkdGggPSA1MTI7IHdpZHRoIDw9IDEwMjQ7IHdpZHRo ICs9IDUxMikgewo+ICsJCQkJaWd0X2R5bmFtaWNfZigicmVuZGVyLSVzLSV1IiwgdC0+dGlsaW5n X25hbWUsIHdpZHRoKSB7Cj4gKwkJCQkJcmVuZGVyKGJvcHMsIHQtPnRpbGluZywgd2lkdGgsIHdp ZHRoKTsKPiArCQkJCX0KPiArCQkJfQoKTml0OiByZWR1bmRhbnQgYnJhY2VzIGluIGlndF9keW5h bWljX2YgYW5kIG5lc3RlZCBmb3IuCgoKVGhlIG9ubHkgdGhpbmcgdGhhdCBoaW50cyBzb21ldGhp bmcgbWF5IGJlIG1pc3NpbmcsIGlzIHRoZSBjcmMgb3B0LgpPdGhlciB0aGFuIHRoYXQgLSBsZ3Rt LgoKUmV2aWV3ZWQtYnk6IENocmlzdG9waCBNYW5zemV3c2tpIDxjaHJpc3RvcGgubWFuc3pld3Nr aUBpbnRlbC5jb20+CgpDaHJpc3RvcGgKCgo+ICsJCX0KPiArCX0KPiArCj4gKwlpZ3RfZml4dHVy ZSB7Cj4gKwkJeGVfZGV2aWNlX3B1dCh4ZSk7Cj4gKwkJYnVmX29wc19kZXN0cm95KGJvcHMpOwo+ ICsJCWNsb3NlKHhlKTsKPiArCX0KPiArfQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KSW50ZWwgVGVjaG5vbG9neSBQ b2xhbmQgc3AuIHogby5vLgp1bC4gU2xvd2Fja2llZ28gMTczIHwgODAtMjk4IEdkYW5zayB8IFNh ZCBSZWpvbm93eSBHZGFuc2sgUG9sbm9jIHwgVklJIFd5ZHppYWwgR29zcG9kYXJjenkgS3Jham93 ZWdvIFJlamVzdHJ1IFNhZG93ZWdvIC0gS1JTIDEwMTg4MiB8IE5JUCA5NTctMDctNTItMzE2IHwg S2FwaXRhbCB6YWtsYWRvd3kgMjAwLjAwMCBQTE4uClNwb2xrYSBvc3dpYWRjemEsIHplIHBvc2lh ZGEgc3RhdHVzIGR1emVnbyBwcnplZHNpZWJpb3JjeSB3IHJvenVtaWVuaXUgdXN0YXd5IHogZG5p YSA4IG1hcmNhIDIwMTMgci4gbyBwcnplY2l3ZHppYWxhbml1IG5hZG1pZXJueW0gb3Bvem5pZW5p b20gdyB0cmFuc2FrY2phY2ggaGFuZGxvd3ljaC4KClRhIHdpYWRvbW9zYyB3cmF6IHogemFsYWN6 bmlrYW1pIGplc3QgcHJ6ZXpuYWN6b25hIGRsYSBva3Jlc2xvbmVnbyBhZHJlc2F0YSBpIG1vemUg emF3aWVyYWMgaW5mb3JtYWNqZSBwb3VmbmUuIFcgcmF6aWUgcHJ6eXBhZGtvd2VnbyBvdHJ6eW1h bmlhIHRlaiB3aWFkb21vc2NpLCBwcm9zaW15IG8gcG93aWFkb21pZW5pZSBuYWRhd2N5IG9yYXog dHJ3YWxlIGplaiB1c3VuaWVjaWU7IGpha2lla29sd2llayBwcnplZ2xhZGFuaWUgbHViIHJvenBv d3N6ZWNobmlhbmllIGplc3QgemFicm9uaW9uZS4KVGhpcyBlLW1haWwgYW5kIGFueSBhdHRhY2ht ZW50cyBtYXkgY29udGFpbiBjb25maWRlbnRpYWwgbWF0ZXJpYWwgZm9yIHRoZSBzb2xlIHVzZSBv ZiB0aGUgaW50ZW5kZWQgcmVjaXBpZW50KHMpLiBJZiB5b3UgYXJlIG5vdCB0aGUgaW50ZW5kZWQg cmVjaXBpZW50LCBwbGVhc2UgY29udGFjdCB0aGUgc2VuZGVyIGFuZCBkZWxldGUgYWxsIGNvcGll czsgYW55IHJldmlldyBvciBkaXN0cmlidXRpb24gYnkgb3RoZXJzIGlzIHN0cmljdGx5IHByb2hp Yml0ZWQuCg==