From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mika Kahola Subject: Re: [PATCH i-g-t] tests/kms_concurrent: Concurrent and interruptible subtests for atomic Date: Thu, 09 Mar 2017 11:31:37 +0200 Message-ID: <1489051897.31999.12.camel@intel.com> References: <1487856391-6821-1-git-send-email-mika.kahola@intel.com> <49211a70-bd20-f49f-7f41-48183827e715@linux.intel.com> Reply-To: mika.kahola@intel.com Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9C81A6EB8B for ; Thu, 9 Mar 2017 09:34:52 +0000 (UTC) In-Reply-To: <49211a70-bd20-f49f-7f41-48183827e715@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Maarten Lankhorst , intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org T24gV2VkLCAyMDE3LTAzLTA4IGF0IDE1OjAwICswMTAwLCBNYWFydGVuIExhbmtob3JzdCB3cm90 ZToKPiBPcCAyMy0wMi0xNyBvbSAxNDoyNiBzY2hyZWVmIE1pa2EgS2Fob2xhOgo+ID4gCj4gPiBU aGlzIHRlc3QgY2FzZSBpbnRyb2R1Y2VzIGNvbmN1cnJlbnRseSBydW5uaW5nIHRlc3QgY2FzZXMg Zm9yCj4gPiBhdG9taWMKPiA+IG1vZGVzZXR0aW5nLgo+ID4gCj4gPiBUaGUgZmlyc3QgdGVzdCBv ciB0aHJlYWQgZHJhd3MgYmx1ZSBiYWNrcm91bmQgd2l0aCBibGFjayBob2xlcyBvbgo+ID4gaXQu Cj4gPiBUaGVzZSBob2xlcyBhcmUgY292ZXJlZCBieSByZWN0YW5ndWxhciwgYmx1ZSBwbGFuZXMg dGhhdCBhcmUgcGxhY2VkCj4gPiByYW5kb21seSBsaWtlIGluIHRlc3QgY2FzZSAna21zX3BsYW5l X211bHRpcGxlJy4KPiA+IAo+ID4gVGhlIHNlY29uZCB0aHJlYWQgY2hhbmdlcyByZXNvbHV0aW9u IGZyb20gaGlnaGVyIHRvIGxvd2VyIG9uZSBhbmQKPiA+IGJhY2suCj4gPiBUaGUgZGVsYXkgYmV0 d2VlbiByZXNvbHV0aW9uIGNoYW5nZXMgaXMgcmFuZG9tbHkgc2VsZWN0ZWQgYmV0d2Vlbgo+ID4g MjAgYW5kCj4gPiA1MCBtaWxsaXNlY29uZHMuCj4gPiAKPiA+IFRoZSB0ZXN0IHJ1bnMgYnkgZGVm YXVsdCAzMiBpdGVyYXRpb25zIHRvIGluY3JlYXNlIHRoZSBjb3ZlcmFnZS4KPiA+IAo+ID4gU2ln bmVkLW9mZi1ieTogTWlrYSBLYWhvbGEgPG1pa2Eua2Fob2xhQGludGVsLmNvbT4KPiA+IC0tLQo+ ID4gwqB0ZXN0cy9NYWtlZmlsZS5zb3VyY2VzIHzCoMKgwqAxICsKPiA+IMKgdGVzdHMva21zX2Nv bmN1cnJlbnQuYyB8IDYzOAo+ID4gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKwo+ID4gwqAyIGZpbGVzIGNoYW5nZWQsIDYzOSBpbnNlcnRpb25zKCspCj4g PiDCoGNyZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0cy9rbXNfY29uY3VycmVudC5jCj4gPiAKPiA+IGRp ZmYgLS1naXQgYS90ZXN0cy9NYWtlZmlsZS5zb3VyY2VzIGIvdGVzdHMvTWFrZWZpbGUuc291cmNl cwo+ID4gaW5kZXggNmUwN2Q5My4uNDBkNzQ0NiAxMDA2NDQKPiA+IC0tLSBhL3Rlc3RzL01ha2Vm aWxlLnNvdXJjZXMKPiA+ICsrKyBiL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMKPiA+IEBAIC0xMTQs NiArMTE0LDcgQEAgVEVTVFNfcHJvZ3NfTSA9IFwKPiA+IMKgCWttc19wbGFuZSBcCj4gPiDCoAlr bXNfcGxhbmVfbXVsdGlwbGUgXAo+ID4gwqAJa21zX3BsYW5lX2xvd3JlcyBcCj4gPiArCWttc19j b25jdXJyZW50IFwKPiA+IMKgCWttc19wcm9wZXJ0aWVzIFwKPiA+IMKgCWttc19wc3Jfc2lua19j cmMgXAo+ID4gwqAJa21zX3JlbmRlciBcCj4gPiBkaWZmIC0tZ2l0IGEvdGVzdHMva21zX2NvbmN1 cnJlbnQuYyBiL3Rlc3RzL2ttc19jb25jdXJyZW50LmMKPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0 Cj4gPiBpbmRleCAwMDAwMDAwLi5iOTk5ZGJlCj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi90 ZXN0cy9rbXNfY29uY3VycmVudC5jCj4gPiBAQCAtMCwwICsxLDYzOSBAQAo+ID4gKy8qCj4gPiAr ICogQ29weXJpZ2h0IMKpIDIwMTYgSW50ZWwgQ29ycG9yYXRpb24KPiA+ICsgKgo+ID4gKyAqIFBl cm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29u Cj4gPiBvYnRhaW5pbmcgYQo+ID4gKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2Np YXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiA+ICJTb2Z0d2FyZSIpLAo+ID4gKyAqIHRv IGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRo b3V0Cj4gPiBsaW1pdGF0aW9uCj4gPiArICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlm eSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsCj4gPiBzdWJsaWNlbnNlLAo+ID4gKyAqIGFu ZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0 bwo+ID4gd2hvbSB0aGUKPiA+ICsgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1 YmplY3QgdG8gdGhlIGZvbGxvd2luZwo+ID4gY29uZGl0aW9uczoKPiA+ICsgKgo+ID4gKyAqIFRo ZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCj4gPiAo aW5jbHVkaW5nIHRoZSBuZXh0Cj4gPiArICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBp biBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCj4gPiBwb3J0aW9ucyBvZiB0aGUKPiA+ICsgKiBT b2Z0d2FyZS4KPiA+ICsgKgo+ID4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMi LCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+ID4gRVhQUkVTUyBPUgo+ID4gKyAqIElN UExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKPiA+ IE1FUkNIQU5UQUJJTElUWSwKPiA+ICsgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T RSBBTkQgTk9OSU5GUklOR0VNRU5ULsKgwqBJTiBOTwo+ID4gRVZFTlQgU0hBTEwKPiA+ICsgKiBU SEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwK PiA+IERBTUFHRVMgT1IgT1RIRVIKPiA+ICsgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNU SU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKPiA+IEFSSVNJTkcKPiA+ICsgKiBG Uk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNF IE9SCj4gPiBPVEhFUiBERUFMSU5HUwo+ID4gKyAqIElOIFRIRSBTT0ZUV0FSRS4KPiA+ICsgKgo+ ID4gKyAqLwo+ID4gKwo+ID4gKyNpbmNsdWRlICJpZ3QuaCIKPiA+ICsjaW5jbHVkZSAiZHJtdGVz dC5oIgo+ID4gKyNpbmNsdWRlIDxlcnJuby5oPgo+ID4gKyNpbmNsdWRlIDxzdGRib29sLmg+Cj4g PiArI2luY2x1ZGUgPHN0ZGlvLmg+Cj4gPiArI2luY2x1ZGUgPHN0cmluZy5oPgo+ID4gKyNpbmNs dWRlIDx0aW1lLmg+Cj4gPiArI2luY2x1ZGUgPHB0aHJlYWQuaD4KPiA+ICsKPiA+ICtJR1RfVEVT VF9ERVNDUklQVElPTigiVGVzdCBhdG9taWMgbW9kZSBzZXR0aW5nIGNvbmN1cnJlbnRseSB3aXRo Cj4gPiBtdWx0aXBsZSBwbGFuZXMgYW5kIHNjcmVlbiByZXNvbHV0aW9uIik7Cj4gPiArCj4gPiAr I2RlZmluZSBTSVpFX1BMQU5FwqDCoMKgwqDCoMKgMjU2Cj4gPiArI2RlZmluZSBTSVpFX0NVUlNP UsKgwqDCoMKgwqAxMjgKPiA+ICsjZGVmaW5lIExPT1BfRk9SRVZFUsKgwqDCoMKgwqAtMQo+ID4g Kwo+ID4gK3R5cGVkZWYgc3RydWN0IHsKPiA+ICsJZmxvYXQgcmVkOwo+ID4gKwlmbG9hdCBncmVl bjsKPiA+ICsJZmxvYXQgYmx1ZTsKPiA+ICt9IGNvbG9yX3Q7Cj4gPiArCj4gPiArdHlwZWRlZiBz dHJ1Y3Qgewo+ID4gKwlpbnQgZHJtX2ZkOwo+ID4gKwl1aW50MzJfdCBjcnRjX2lkOwo+ID4gKwl1 aW50MzJfdCBjb25uZWN0b3JfaWQ7Cj4gPiArCWlndF9kaXNwbGF5X3QgZGlzcGxheTsKPiA+ICsJ aWd0X291dHB1dF90ICpvdXRwdXQ7Cj4gPiArCWludCBwaXBlOwo+ID4gKwlpZ3RfcGxhbmVfdCAq KnBsYW5lOwo+ID4gKwlzdHJ1Y3QgaWd0X2ZiICpmYjsKPiA+ICt9IGRhdGFfdDsKPiA+ICsKPiA+ ICt0eXBlZGVmIHN0cnVjdCB7Cj4gPiArCWRhdGFfdCAqZGF0YTsKPiA+ICsJaWd0X2NyY190IHJl ZmVyZW5jZV9jcmM7Cj4gPiArfSB0ZXN0X3Bvc2l0aW9uX3Q7Cj4gPiArCj4gPiArLyogQ29tbWFu ZCBsaW5lIHBhcmFtZXRlcnMuICovCj4gPiArc3RydWN0IHsKPiA+ICsJaW50IGl0ZXJhdGlvbnM7 Cj4gPiArCWJvb2wgdXNlcl9zZWVkOwo+ID4gKwlpbnQgc2VlZDsKPiA+ICsJYm9vbCBydW47Cj4g PiArfSBvcHQgPSB7Cj4gPiArCS5pdGVyYXRpb25zID0gMzIsCj4gPiArCS51c2VyX3NlZWQgPSBm YWxzZSwKPiA+ICsJLnNlZWQgPSAxLAo+ID4gKwkucnVuID0gdHJ1ZSwKPiA+ICt9Owo+ID4gKwo+ ID4gKy8qCj4gPiArICogQ29tbW9uIGNvZGUgYWNyb3NzIGFsbCB0ZXN0cywgYWN0aW5nIG9uIGRh dGFfdAo+ID4gKyAqLwo+ID4gK3N0YXRpYyB2b2lkIHRlc3RfaW5pdChkYXRhX3QgKmRhdGEsIGlu dCBuX3BsYW5lcykKPiA+ICt7Cj4gPiArCWRhdGEtPnBsYW5lID0gY2FsbG9jKG5fcGxhbmVzLCBz aXplb2YoZGF0YS0+cGxhbmUpKTsKPiA+ICsJaWd0X2Fzc2VydF9mKGRhdGEtPnBsYW5lICE9IE5V TEwsICJGYWlsZWQgdG8gYWxsb2NhdGUKPiA+IG1lbW9yeSBmb3IgcGxhbmVzXG4iKTsKPiA+ICsK PiA+ICsJZGF0YS0+ZmIgPSBjYWxsb2Mobl9wbGFuZXMsIHNpemVvZihzdHJ1Y3QgaWd0X2ZiKSk7 Cj4gPiArCWlndF9hc3NlcnRfZihkYXRhLT5mYiAhPSBOVUxMLCAiRmFpbGVkIHRvIGFsbG9jYXRl IG1lbW9yeQo+ID4gZm9yIEZCc1xuIik7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIHRl c3RfZmluaShkYXRhX3QgKmRhdGEsIGlndF9vdXRwdXRfdCAqb3V0cHV0LCBpbnQKPiA+IG5fcGxh bmVzKQo+ID4gK3sKPiA+ICsJaW50IGk7Cj4gPiArCj4gPiArCWZvciAoaSA9IDA7IGkgPCBuX3Bs YW5lczsgaSsrKSB7Cj4gPiArCQlpZ3RfcGxhbmVfdCAqcGxhbmUgPSBkYXRhLT5wbGFuZVtpXTsK PiA+ICsKPiA+ICsJCWlmICghcGxhbmUpCj4gPiArCQkJY29udGludWU7Cj4gPiArCQlpZiAocGxh bmUtPnR5cGUgPT0gRFJNX1BMQU5FX1RZUEVfUFJJTUFSWSkKPiA+ICsJCQljb250aW51ZTsKPiA+ ICsJCWlndF9wbGFuZV9zZXRfZmIocGxhbmUsIE5VTEwpOwo+ID4gKwkJZGF0YS0+cGxhbmVbaV0g PSBOVUxMOwo+ID4gKwl9Cj4gPiArCj4gPiArCS8qIHJlc2V0IHRoZSBjb25zdHJhaW50IG9uIHRo ZSBwaXBlICovCj4gPiArCWlndF9vdXRwdXRfc2V0X3BpcGUob3V0cHV0LCBQSVBFX0FOWSk7Cj4g PiArCj4gPiArCWZyZWUoZGF0YS0+cGxhbmUpOwo+ID4gKwlkYXRhLT5wbGFuZSA9IE5VTEw7Cj4g PiArCWZyZWUoZGF0YS0+ZmIpOwo+ID4gKwlkYXRhLT5mYiA9IE5VTEw7Cj4gPiArfQo+ID4gKwo+ ID4gK3N0YXRpYyBpbnQKPiA+ICtkaXNwbGF5X2NvbW1pdF9tb2RlKGRhdGFfdCAqZGF0YSwgaWd0 X2NyY190ICpjcmMpCj4gPiArewo+ID4gKwljaGFyIGJ1ZlsyNTZdOwo+ID4gKwlzdHJ1Y3QgZHJt X2V2ZW50ICplID0gKHZvaWQgKilidWY7Cj4gPiArCWludCBuLCByZXQ7Cj4gPiArCWludCBmbGFn cyA9IERSTV9NT0RFX1BBR0VfRkxJUF9FVkVOVCB8Cj4gPiBEUk1fTU9ERV9BVE9NSUNfQUxMT1df TU9ERVNFVCB8IERSTV9NT0RFX0FUT01JQ19OT05CTE9DSzsKPiA+ICsKPiA+ICsJcmV0ID0gaWd0 X2Rpc3BsYXlfdHJ5X2NvbW1pdF9hdG9taWMoJmRhdGEtPmRpc3BsYXksCj4gPiArCQkJCQnCoMKg wqDCoGZsYWdzLAo+ID4gKwkJCQkJwqDCoMKgwqBOVUxMKTsKPiA+ICsJaWd0X3NraXBfb24ocmV0 ICE9IDApOwo+ID4gKwo+ID4gKwlpZ3Rfc2V0X3RpbWVvdXQoMSwgIlN0dWNrIG9uIHBhZ2UgZmxp cCIpOwo+ID4gKwlyZXQgPSByZWFkKGRhdGEtPmRpc3BsYXkuZHJtX2ZkLCBidWYsIHNpemVvZihi dWYpKTsKPiA+ICsJaWd0X2Fzc2VydChyZXQgPj0gMCk7Cj4gPiArCj4gPiArCWlndF9hc3NlcnRf ZXEoZS0+dHlwZSwgRFJNX0VWRU5UX0ZMSVBfQ09NUExFVEUpOwo+ID4gKwlpZ3RfcmVzZXRfdGlt ZW91dCgpOwo+ID4gKwo+ID4gKwlyZXR1cm4gbjsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZv aWQKPiA+ICt0ZXN0X2dyYWJfY3JjKGRhdGFfdCAqZGF0YSwgY29sb3JfdCAqY29sb3IsIGlndF9j cmNfdCAqY3JjIC8qIG91dAo+ID4gKi8pCj4gPiArewo+ID4gKwlkcm1Nb2RlTW9kZUluZm8gKm1v ZGU7Cj4gPiArCWlndF9wbGFuZV90ICpwcmltYXJ5Owo+ID4gKwlpbnQgcmV0Owo+ID4gKwo+ID4g KwlpZ3Rfb3V0cHV0X3NldF9waXBlKGRhdGEtPm91dHB1dCwgZGF0YS0+cGlwZSk7Cj4gPiArCj4g PiArCXByaW1hcnkgPSBpZ3Rfb3V0cHV0X2dldF9wbGFuZV90eXBlKGRhdGEtPm91dHB1dCwKPiA+ IERSTV9QTEFORV9UWVBFX1BSSU1BUlkpOwo+ID4gKwlkYXRhLT5wbGFuZVtwcmltYXJ5LT5pbmRl eF0gPSBwcmltYXJ5Owo+ID4gKwo+ID4gKwltb2RlID0gaWd0X291dHB1dF9nZXRfbW9kZShkYXRh LT5vdXRwdXQpOwo+ID4gKwo+ID4gKwlpZ3RfY3JlYXRlX2NvbG9yX2ZiKGRhdGEtPmRybV9mZCwg bW9kZS0+aGRpc3BsYXksIG1vZGUtCj4gPiA+dmRpc3BsYXksCj4gPiArCQkJwqDCoMKgwqBEUk1f Rk9STUFUX1hSR0I4ODg4LAo+ID4gKwkJCcKgwqDCoMKgTE9DQUxfSTkxNV9GT1JNQVRfTU9EX1hf VElMRUQsCj4gPiArCQkJwqDCoMKgwqBjb2xvci0+cmVkLCBjb2xvci0+Z3JlZW4sIGNvbG9yLT5i bHVlLAo+ID4gKwkJCcKgwqDCoMKgJmRhdGEtPmZiW3ByaW1hcnktPmluZGV4XSk7Cj4gPiArCj4g PiArCWlndF9wbGFuZV9zZXRfZmIoZGF0YS0+cGxhbmVbcHJpbWFyeS0+aW5kZXhdLCAmZGF0YS0K PiA+ID5mYltwcmltYXJ5LT5pbmRleF0pOwo+ID4gKwo+ID4gKwlyZXQgPSBpZ3RfZGlzcGxheV90 cnlfY29tbWl0MigmZGF0YS0+ZGlzcGxheSwKPiA+IENPTU1JVF9BVE9NSUMpOwo+ID4gKwlpZ3Rf c2tpcF9vbihyZXQgIT0gMCk7Cj4gPiArfQo+ID4gKwo+ID4gKy8qCj4gPiArICogTXVsdGlwbGUg cGxhbmUgcG9zaXRpb24gdGVzdC4KPiA+ICsgKsKgwqDCoC0gV2Ugc3RhcnQgYnkgZ3JhYmJpbmcg YSByZWZlcmVuY2UgQ1JDIG9mIGEgZnVsbCBibHVlIGZiCj4gPiBiZWluZyBzY2FubmVkCj4gPiAr ICrCoMKgwqDCoMKgb3V0IG9uIHRoZSBwcmltYXJ5IHBsYW5lCj4gPiArICrCoMKgwqAtIFRoZW4g d2Ugc2Nhbm5vdXQgbnVtYmVyIG9mIHBsYW5lczoKPiA+ICsgKsKgwqDCoMKgwqDCoCogdGhlIHBy aW1hcnkgcGxhbmUgdXNlcyBhIGJsdWUgZmIgd2l0aCBhIGJsYWNrIHJlY3RhbmdsZQo+ID4gaG9s ZQo+ID4gKyAqwqDCoMKgwqDCoMKgKiBwbGFuZXMsIG9uIHRvcCBvZiB0aGUgcHJpbWFyeSBwbGFu ZSwgd2l0aCBhIGJsdWUgZmIgdGhhdAo+ID4gaXMgc2V0LXVwCj4gPiArICrCoMKgwqDCoMKgwqDC oMKgdG8gY292ZXIgdGhlIGJsYWNrIHJlY3RhbmdsZXMgb2YgdGhlIHByaW1hcnkgcGxhbmUgZmIK PiA+ICsgKsKgwqDCoMKgwqBUaGUgcmVzdWx0aW5nIENSQyBzaG91bGQgYmUgaWRlbnRpY2FsIHRv IHRoZSByZWZlcmVuY2UgQ1JDCj4gPiArICovCj4gPiArCj4gPiArc3RhdGljIHZvaWQKPiA+ICtj cmVhdGVfZmJfZm9yX21vZGVfcG9zaXRpb24oZGF0YV90ICpkYXRhLCBkcm1Nb2RlTW9kZUluZm8g Km1vZGUsCj4gPiArCQkJwqDCoMKgwqBjb2xvcl90ICpjb2xvciwgaW50ICpyZWN0X3gsIGludAo+ ID4gKnJlY3RfeSwKPiA+ICsJCQnCoMKgwqDCoGludCAqcmVjdF93LCBpbnQgKnJlY3RfaCwgdWlu dDY0X3QKPiA+IHRpbGluZywKPiA+ICsJCQnCoMKgwqDCoGludCBtYXhfcGxhbmVzKQo+ID4gK3sK PiA+ICsJdW5zaWduZWQgaW50IGZiX2lkOwo+ID4gKwljYWlyb190ICpjcjsKPiA+ICsJaWd0X3Bs YW5lX3QgKnByaW1hcnk7Cj4gPiArCj4gPiArCXByaW1hcnkgPSBpZ3Rfb3V0cHV0X2dldF9wbGFu ZV90eXBlKGRhdGEtPm91dHB1dCwKPiA+IERSTV9QTEFORV9UWVBFX1BSSU1BUlkpOwo+ID4gKwo+ ID4gKwlmYl9pZCA9IGlndF9jcmVhdGVfZmIoZGF0YS0+ZHJtX2ZkLAo+ID4gKwkJCcKgwqDCoMKg wqDCoG1vZGUtPmhkaXNwbGF5LCBtb2RlLT52ZGlzcGxheSwKPiA+ICsJCQnCoMKgwqDCoMKgwqBE Uk1fRk9STUFUX1hSR0I4ODg4LAo+ID4gKwkJCcKgwqDCoMKgwqDCoHRpbGluZywKPiA+ICsJCQnC oMKgwqDCoMKgwqAmZGF0YS0+ZmJbcHJpbWFyeS0+aW5kZXhdKTsKPiA+ICsJaWd0X2Fzc2VydChm Yl9pZCk7Cj4gPiArCj4gPiArCWNyID0gaWd0X2dldF9jYWlyb19jdHgoZGF0YS0+ZHJtX2ZkLCAm ZGF0YS0+ZmJbcHJpbWFyeS0KPiA+ID5pbmRleF0pOwo+ID4gKwlpZ3RfcGFpbnRfY29sb3IoY3Is IHJlY3RfeFswXSwgcmVjdF95WzBdLAo+ID4gKwkJCW1vZGUtPmhkaXNwbGF5LCBtb2RlLT52ZGlz cGxheSwKPiA+ICsJCQljb2xvci0+cmVkLCBjb2xvci0+Z3JlZW4sIGNvbG9yLT5ibHVlKTsKPiA+ ICsKPiA+ICsJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhfcGxhbmVzOyBpKyspIHsKPiA+ICsJCWlm IChkYXRhLT5wbGFuZVtpXS0+dHlwZSA9PQo+ID4gRFJNX1BMQU5FX1RZUEVfUFJJTUFSWSkKPiA+ ICsJCQljb250aW51ZTsKPiA+ICsJCWlndF9wYWludF9jb2xvcihjciwgcmVjdF94W2ldLCByZWN0 X3lbaV0sCj4gPiArCQkJCXJlY3Rfd1tpXSwgcmVjdF9oW2ldLCAwLjAsIDAuMCwKPiA+IDAuMCk7 Cj4gPiArCX0KPiA+ICsKPiA+ICsJaWd0X2Fzc2VydChjYWlyb19zdGF0dXMoY3IpID09IDApOwo+ ID4gKwljYWlyb19kZXN0cm95KGNyKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQKPiA+ ICtwcmVwYXJlX3BsYW5lcyhkYXRhX3QgKmRhdGEsIGNvbG9yX3QgKmNvbG9yLCBpbnQgbWF4X3Bs YW5lcykKPiA+ICt7Cj4gPiArCWRybU1vZGVNb2RlSW5mbyAqbW9kZTsKPiA+ICsJaWd0X3BpcGVf dCAqcGlwZTsKPiA+ICsJaWd0X3BsYW5lX3QgKnByaW1hcnk7Cj4gPiArCWludCAqeDsKPiA+ICsJ aW50ICp5Owo+ID4gKwlpbnQgKnNpemU7Cj4gPiArCWludCBpOwo+ID4gKwo+ID4gKwlpZ3Rfb3V0 cHV0X3NldF9waXBlKGRhdGEtPm91dHB1dCwgZGF0YS0+cGlwZSk7Cj4gPiArCXByaW1hcnkgPSBp Z3Rfb3V0cHV0X2dldF9wbGFuZV90eXBlKGRhdGEtPm91dHB1dCwKPiA+IERSTV9QTEFORV9UWVBF X1BSSU1BUlkpOwo+ID4gKwlwaXBlID0gcHJpbWFyeS0+cGlwZTsKPiA+ICsKPiA+ICsJeCA9IG1h bGxvYyhwaXBlLT5uX3BsYW5lcyAqIHNpemVvZigqeCkpOwo+ID4gKwlpZ3RfYXNzZXJ0X2YoeCwg IkZhaWxlZCB0byBhbGxvY2F0ZSAlbGQgYnl0ZXMgZm9yIHZhcmlhYmxlCj4gPiB4XG4iLCAobG9u ZyBpbnQpIChwaXBlLT5uX3BsYW5lcyAqIHNpemVvZigqeCkpKTsKPiA+ICsJeSA9IG1hbGxvYyhw aXBlLT5uX3BsYW5lcyAqIHNpemVvZigqeSkpOwo+ID4gKwlpZ3RfYXNzZXJ0X2YoeSwgIkZhaWxl ZCB0byBhbGxvY2F0ZSAlbGQgYnl0ZXMgZm9yIHZhcmlhYmxlCj4gPiB5XG4iLCAobG9uZyBpbnQp IChwaXBlLT5uX3BsYW5lcyAqIHNpemVvZigqeSkpKTsKPiA+ICsJc2l6ZSA9IG1hbGxvYyhwaXBl LT5uX3BsYW5lcyAqIHNpemVvZigqc2l6ZSkpOwo+ID4gKwlpZ3RfYXNzZXJ0X2Yoc2l6ZSwgIkZh aWxlZCB0byBhbGxvY2F0ZSAlbGQgYnl0ZXMgZm9yCj4gPiB2YXJpYWJsZSBzaXplXG4iLCAobG9u ZyBpbnQpIChwaXBlLT5uX3BsYW5lcyAqIHNpemVvZigqc2l6ZSkpKTsKPiA+ICsKPiA+ICsJbW9k ZSA9IGlndF9vdXRwdXRfZ2V0X21vZGUoZGF0YS0+b3V0cHV0KTsKPiA+ICsKPiA+ICsJLyogcGxh bmVzIHdpdGggcmFuZG9tIHBvc2l0aW9ucyAqLwo+ID4gKwl4W3ByaW1hcnktPmluZGV4XSA9IDA7 Cj4gPiArCXlbcHJpbWFyeS0+aW5kZXhdID0gMDsKPiA+ICsJZm9yIChpID0gMDsgaSA8IG1heF9w bGFuZXM7IGkrKykgewo+ID4gKwkJaWd0X3BsYW5lX3QgKnBsYW5lID0gaWd0X291dHB1dF9nZXRf cGxhbmUoZGF0YS0KPiA+ID5vdXRwdXQsIGkpOwo+ID4gKwo+ID4gKwkJaWYgKHBsYW5lLT50eXBl ID09IERSTV9QTEFORV9UWVBFX1BSSU1BUlkpCj4gPiArCQkJY29udGludWU7Cj4gPiArCQllbHNl IGlmIChwbGFuZS0+dHlwZSA9PSBEUk1fUExBTkVfVFlQRV9DVVJTT1IpCj4gPiArCQkJc2l6ZVtp XSA9IFNJWkVfQ1VSU09SOwo+ID4gKwkJZWxzZQo+ID4gKwkJCXNpemVbaV0gPSBTSVpFX1BMQU5F Owo+ID4gKwo+ID4gKwkJeFtpXSA9IHJhbmQoKSAlIChtb2RlLT5oZGlzcGxheSAtIHNpemVbaV0p Owo+ID4gKwkJeVtpXSA9IHJhbmQoKSAlIChtb2RlLT52ZGlzcGxheSAtIHNpemVbaV0pOwo+ID4g Kwo+ID4gKwkJZGF0YS0+cGxhbmVbaV0gPSBwbGFuZTsKPiA+ICsKPiA+ICsJCWlndF9jcmVhdGVf Y29sb3JfZmIoZGF0YS0+ZHJtX2ZkLAo+ID4gKwkJCQnCoMKgwqDCoHNpemVbaV0sIHNpemVbaV0s Cj4gPiArCQkJCcKgwqDCoMKgZGF0YS0+cGxhbmVbaV0tPnR5cGUgPT0KPiA+IERSTV9QTEFORV9U WVBFX0NVUlNPUiA/IERSTV9GT1JNQVRfQVJHQjg4ODggOiBEUk1fRk9STUFUX1hSR0I4ODg4LAo+ ID4gKwkJCQnCoMKgwqDCoGRhdGEtPnBsYW5lW2ldLT50eXBlID09Cj4gPiBEUk1fUExBTkVfVFlQ RV9DVVJTT1IgPyBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FIDoKPiA+IExPQ0FMX0k5MTVfRk9S TUFUX01PRF9YX1RJTEVELAo+ID4gKwkJCQnCoMKgwqDCoGNvbG9yLT5yZWQsIGNvbG9yLT5ncmVl biwKPiA+IGNvbG9yLT5ibHVlLAo+ID4gKwkJCQnCoMKgwqDCoCZkYXRhLT5mYltpXSk7Cj4gPiAr Cj4gPiArCQlpZ3RfcGxhbmVfc2V0X3Bvc2l0aW9uKGRhdGEtPnBsYW5lW2ldLCB4W2ldLAo+ID4g eVtpXSk7Cj4gPiArCQlpZ3RfcGxhbmVfc2V0X2ZiKGRhdGEtPnBsYW5lW2ldLCAmZGF0YS0+ZmJb aV0pOwo+ID4gKwl9Cj4gPiArCj4gPiArCS8qIHByaW1hcnkgcGxhbmUgKi8KPiA+ICsJZGF0YS0+ cGxhbmVbcHJpbWFyeS0+aW5kZXhdID0gcHJpbWFyeTsKPiA+ICsJY3JlYXRlX2ZiX2Zvcl9tb2Rl X3Bvc2l0aW9uKGRhdGEsIG1vZGUsIGNvbG9yLCB4LCB5LCBzaXplLAo+ID4gc2l6ZSwKPiA+ICsJ CQkJwqDCoMKgwqBMT0NBTF9JOTE1X0ZPUk1BVF9NT0RfWF9USUxFRCwKPiA+IG1heF9wbGFuZXMp Owo+ID4gKwlpZ3RfcGxhbmVfc2V0X2ZiKGRhdGEtPnBsYW5lW3ByaW1hcnktPmluZGV4XSwgJmRh dGEtCj4gPiA+ZmJbcHJpbWFyeS0+aW5kZXhdKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZv aWQgKgo+ID4gK3Rlc3RfcGxhbmVfcG9zaXRpb25fd2l0aF9vdXRwdXQodm9pZCAqYXJncykKPiA+ ICt7Cj4gPiArCWRhdGFfdCAqZGF0YSA9IChkYXRhX3QgKilhcmdzOwo+ID4gKwlpZ3RfY3JjX3Qg KmNyYzsKPiA+ICsJY29sb3JfdCBibHVlwqDCoD0geyAwLjBmLCAwLjBmLCAxLjBmIH07Cj4gPiAr CWludCBpOwo+ID4gKwlpbnQgaXRlcmF0aW9ucyA9IG9wdC5pdGVyYXRpb25zIDwgMSA/IDEgOiBv cHQuaXRlcmF0aW9uczsKPiA+ICsJYm9vbCBsb29wX2ZvcmV2ZXI7Cj4gPiArCWNoYXIgaW5mb1sy NTZdOwo+ID4gKwlpbnQgbWF4X3BsYW5lcyA9IGRhdGEtPmRpc3BsYXkucGlwZXNbZGF0YS0+cGlw ZV0ubl9wbGFuZXM7Cj4gPiArCj4gPiArCWlmIChvcHQuaXRlcmF0aW9ucyA9PSBMT09QX0ZPUkVW RVIpIHsKPiA+ICsJCWxvb3BfZm9yZXZlciA9IHRydWU7Cj4gPiArCQlzcHJpbnRmKGluZm8sICJm b3JldmVyIik7Cj4gPiArCX0gZWxzZSB7Cj4gPiArCQlsb29wX2ZvcmV2ZXIgPSBmYWxzZTsKPiA+ ICsJCXNwcmludGYoaW5mbywgImZvciAlZCAlcyIsCj4gPiArCQkJaXRlcmF0aW9ucywgaXRlcmF0 aW9ucyA+IDEgPyAiaXRlcmF0aW9ucyIKPiA+IDogIml0ZXJhdGlvbiIpOwo+ID4gKwl9Cj4gPiAr Cj4gPiArCWlndF9pbmZvKCJUZXN0aW5nIGNvbm5lY3RvciAlcyB1c2luZyBwaXBlICVzIHdpdGgg JWQKPiA+IHBsYW5lcyAlcyB3aXRoIHNlZWQgJWRcbiIsCj4gPiArCQnCoGlndF9vdXRwdXRfbmFt ZShkYXRhLT5vdXRwdXQpLAo+ID4ga21zdGVzdF9waXBlX25hbWUoZGF0YS0+cGlwZSksIG1heF9w bGFuZXMsCj4gPiArCQnCoGluZm8sIG9wdC5zZWVkKTsKPiA+ICsKPiA+ICsJaSA9IDA7Cj4gPiAr CXdoaWxlIChpIDwgaXRlcmF0aW9ucyB8fCBsb29wX2ZvcmV2ZXIpIHsKPiA+ICsJCXByZXBhcmVf cGxhbmVzKGRhdGEsICZibHVlLCBtYXhfcGxhbmVzKTsKPiA+ICsKPiA+ICsJCWRpc3BsYXlfY29t bWl0X21vZGUoZGF0YSwgY3JjKTsKPiA+ICsKPiA+ICsJCWkrKzsKPiA+ICsJfQo+ID4gKwo+ID4g KwlvcHQucnVuID0gZmFsc2U7Cj4gPiArCj4gPiArCXJldHVybiBOVUxMOwo+ID4gK30KPiA+ICsK PiA+ICtzdGF0aWMgZHJtTW9kZUNvbm5lY3RvciAqCj4gPiArZ2V0X2Nvbm5lY3Rvcl9jb25uZWN0 ZWQoaW50IGRybV9mZCkKPiA+ICt7Cj4gPiArCWRybU1vZGVSZXMgKnJlc291cmNlcyA9IGRybU1v ZGVHZXRSZXNvdXJjZXMoZHJtX2ZkKTsKPiA+ICsJZHJtTW9kZUNvbm5lY3RvciAqY29ubmVjdG9y Owo+ID4gKwlpbnQgaTsKPiA+ICsKPiA+ICsJZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy0+Y291 bnRfY29ubmVjdG9yczsgaSsrKSB7Cj4gPiArCQljb25uZWN0b3IgPSBkcm1Nb2RlR2V0Q29ubmVj dG9yKGRybV9mZCwKPiA+ICsJCQkJCQlyZXNvdXJjZXMtCj4gPiA+Y29ubmVjdG9yc1tpXSk7Cj4g PiArCj4gPiArCQlpZiAoY29ubmVjdG9yLT5jb25uZWN0aW9uID09IERSTV9NT0RFX0NPTk5FQ1RF RCkKPiA+ICsJCQlicmVhazsKPiA+ICsKPiA+ICsJCWRybU1vZGVGcmVlQ29ubmVjdG9yKGNvbm5l Y3Rvcik7Cj4gPiArCQljb25uZWN0b3IgPSBOVUxMOwo+ID4gKwl9Cj4gPiArCj4gPiArCWRybU1v ZGVGcmVlUmVzb3VyY2VzKHJlc291cmNlcyk7Cj4gPiArCj4gPiArCXJldHVybiBjb25uZWN0b3I7 Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbnQgZ2V0X2NydGNfZm9yX2VuY29kZXIoZHJtTW9k ZVJlcyAqcmVzb3VyY2VzLAo+ID4gKwkJCQlkcm1Nb2RlRW5jb2RlciAqZW5jb2RlcikKPiA+ICt7 Cj4gPiArCWludCBtYXNrLCBpZDsKPiA+ICsJaW50IGk7Cj4gPiArCWJvb2wgZm91bmQ7Cj4gPiAr Cj4gPiArCWZvciAoaSA9IDA7IGkgPCByZXNvdXJjZXMtPmNvdW50X2NydGNzOyBpKyspIHsKPiA+ ICsJCW1hc2sgPSAxIDw8IGk7Cj4gPiArCQlpZCA9IHJlc291cmNlcy0+Y3J0Y3NbaV07Cj4gPiAr Cj4gPiArCQlmb3VuZCA9IGVuY29kZXItPnBvc3NpYmxlX2NydGNzICYgbWFzazsKPiA+ICsJCWlm IChmb3VuZCkKPiA+ICsJCQlicmVhazsKPiA+ICsJfQo+ID4gKwo+ID4gKwlpZiAoIWZvdW5kKQo+ ID4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPiArCj4gPiArCXJldHVybiBpZDsKPiA+ICt9Cj4gPiAr Cj4gPiArc3RhdGljIGludCBnZXRfY3J0Y19mb3JfY29ubmVjdG9yKGludCBkcm1fZmQsIGRybU1v ZGVSZXMKPiA+ICpyZXNvdXJjZXMsCj4gPiArCQkJCcKgwqBkcm1Nb2RlQ29ubmVjdG9yICpjb25u ZWN0b3IpCj4gPiArewo+ID4gKwlkcm1Nb2RlRW5jb2RlciAqZW5jb2RlcjsKPiA+ICsJaW50IGVu Y29kZXJfaWQ7Cj4gPiArCWludCBjcnRjX2lkOwo+ID4gKwlpbnQgaTsKPiA+ICsKPiA+ICsJZm9y IChpID0gMDsgaSA8IGNvbm5lY3Rvci0+Y291bnRfZW5jb2RlcnM7IGkrKykgewo+ID4gKwkJZW5j b2Rlcl9pZCA9IGNvbm5lY3Rvci0+ZW5jb2RlcnNbaV07Cj4gPiArCQllbmNvZGVyID0gZHJtTW9k ZUdldEVuY29kZXIoZHJtX2ZkLCBlbmNvZGVyX2lkKTsKPiA+ICsKPiA+ICsJCWlmIChlbmNvZGVy KSB7Cj4gPiArCQkJY3J0Y19pZCA9IGdldF9jcnRjX2Zvcl9lbmNvZGVyKHJlc291cmNlcywKPiA+ IGVuY29kZXIpOwo+ID4gKwo+ID4gKwkJCWRybU1vZGVGcmVlRW5jb2RlcihlbmNvZGVyKTsKPiA+ ICsKPiA+ICsJCQlpZiAoY3J0Y19pZCAhPSAwKQo+ID4gKwkJCQlicmVhazsKPiA+ICsJCX0KPiA+ ICsJfQo+ID4gKwo+ID4gKwlpZiAoY3J0Y19pZCA9PSAwKQo+ID4gKwkJcmV0dXJuIC1FSU5WQUw7 Cj4gPiArCj4gPiArCXJldHVybiBjcnRjX2lkOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50 IGdldF9jcnRjKGludCBkcm1fZmQpCj4gPiArewo+ID4gKwlkcm1Nb2RlUmVzICpyZXNvdXJjZXM7 Cj4gPiArCWRybU1vZGVDb25uZWN0b3IgKmNvbm5lY3RvcjsKPiA+ICsJZHJtTW9kZUVuY29kZXIg KmVuY29kZXI7Cj4gPiArCWludCBpLCBpZDsKPiA+ICsKPiA+ICsJcmVzb3VyY2VzID0gZHJtTW9k ZUdldFJlc291cmNlcyhkcm1fZmQpOwo+ID4gKwljb25uZWN0b3IgPSBnZXRfY29ubmVjdG9yX2Nv bm5lY3RlZChkcm1fZmQpOwo+ID4gKwo+ID4gKwlmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VzLT5j b3VudF9lbmNvZGVyczsgaSsrKSB7Cj4gPiArCQllbmNvZGVyID0gZHJtTW9kZUdldEVuY29kZXIo ZHJtX2ZkLCByZXNvdXJjZXMtCj4gPiA+ZW5jb2RlcnNbaV0pOwo+ID4gKwo+ID4gKwkJaWYgKGVu Y29kZXItPmVuY29kZXJfaWQgPT0gY29ubmVjdG9yLT5lbmNvZGVyX2lkKQo+ID4gKwkJCWJyZWFr Owo+ID4gKwo+ID4gKwkJZHJtTW9kZUZyZWVFbmNvZGVyKGVuY29kZXIpOwo+ID4gKwkJZW5jb2Rl ciA9IE5VTEw7Cj4gPiArCX0KPiA+ICsKPiA+ICsJaWYgKGVuY29kZXIpCj4gPiArCQlyZXR1cm4g ZW5jb2Rlci0+Y3J0Y19pZDsKPiA+ICsKPiA+ICsJaWQgPSBnZXRfY3J0Y19mb3JfY29ubmVjdG9y KGRybV9mZCwgcmVzb3VyY2VzLCBjb25uZWN0b3IpOwo+ID4gKwlpZ3RfYXNzZXJ0KGlkICE9IDAp Owo+ID4gKwo+ID4gKwlyZXR1cm4gaWQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBkcm1Nb2Rl TW9kZUluZm8gKgo+ID4gK2dldF9sb3dyZXNfbW9kZShkYXRhX3QgKmRhdGEsIGRybU1vZGVNb2Rl SW5mbyAqbW9kZV9kZWZhdWx0KQo+ID4gK3sKPiA+ICsJZHJtTW9kZVJlcyAqcmVzb3VyY2VzID0g ZHJtTW9kZUdldFJlc291cmNlcyhkYXRhLT5kcm1fZmQpOwo+ID4gKwlkcm1Nb2RlTW9kZUluZm8g c3RkXzEwMjRfbW9kZSA9IHsKPiA+ICsJCS5jbG9jayA9IDY1MDAwLAo+ID4gKwkJLmhkaXNwbGF5 ID0gMTAyNCwKPiA+ICsJCS5oc3luY19zdGFydCA9IDEwNDgsCj4gPiArCQkuaHN5bmNfZW5kID0g MTE4NCwKPiA+ICsJCS5odG90YWwgPSAxMzQ0LAo+ID4gKwkJLmhza2V3ID0gMCwKPiA+ICsJCS52 ZGlzcGxheSA9IDc2OCwKPiA+ICsJCS52c3luY19zdGFydCA9IDc3MSwKPiA+ICsJCS52c3luY19l bmQgPSA3NzcsCj4gPiArCQkudnRvdGFsID0gODA2LAo+ID4gKwkJLnZzY2FuID0gMCwKPiA+ICsJ CS52cmVmcmVzaCA9IDYwLAo+ID4gKwkJLmZsYWdzID0gMHhBLAo+ID4gKwkJLnR5cGUgPSAweDQw LAo+ID4gKwkJLm5hbWUgPSAiQ3VzdG9tIDEwMjR4NzY4IiwKPiA+ICsJfTsKPiA+ICsJZHJtTW9k ZU1vZGVJbmZvICptb2RlOwo+ID4gKwlkcm1Nb2RlQ29ubmVjdG9yICpjb25uZWN0b3I7Cj4gPiAr CWJvb2wgZm91bmQ7Cj4gPiArCWludCBsaW1pdCA9IG1vZGVfZGVmYXVsdC0+dmRpc3BsYXktU0la RV9QTEFORTsKPiA+ICsJaW50IGksIGo7Cj4gPiArCj4gPiArCWlmICghcmVzb3VyY2VzKSB7Cj4g PiArCQlpZ3Rfd2FybigiZHJtTW9kZUdldFJlc291cmNlcyBmYWlsZWQ6ICVzXG4iLAo+ID4gc3Ry ZXJyb3IoZXJybm8pKTsKPiA+ICsJCXJldHVybiBtb2RlOwo+ID4gKwl9Cj4gPiArCj4gPiArCWZv dW5kID0gZmFsc2U7Cj4gPiArCWZvciAoaSA9IDA7IGkgPCByZXNvdXJjZXMtPmNvdW50X2Nvbm5l Y3RvcnM7IGkrKykgewo+ID4gKwo+ID4gKwkJY29ubmVjdG9yID0gZHJtTW9kZUdldENvbm5lY3Rv ckN1cnJlbnQoZGF0YS0KPiA+ID5kcm1fZmQsCj4gPiArCQkJCQkJwqDCoMKgwqDCoMKgwqByZXNv dXJjZXMtCj4gPiA+Y29ubmVjdG9yc1tpXSk7Cj4gPiArCj4gPiArCQlpZiAoIWNvbm5lY3Rvcikg ewo+ID4gKwkJCWlndF93YXJuKCJjb3VsZCBub3QgZ2V0IGNvbm5lY3RvciAlaToKPiA+ICVzXG4i LAo+ID4gKwkJCQnCoHJlc291cmNlcy0+Y29ubmVjdG9yc1tpXSwKPiA+IHN0cmVycm9yKGVycm5v KSk7Cj4gPiArCQkJY29udGludWU7Cj4gPiArCQl9Cj4gPiArCj4gPiArCQlpZiAoIWNvbm5lY3Rv ci0+Y291bnRfbW9kZXMpCj4gPiArCQkJY29udGludWU7Cj4gPiArCj4gPiArCQlmb3IgKGogPSAw OyBqIDwgY29ubmVjdG9yLT5jb3VudF9tb2RlczsgaisrKSB7Cj4gPiArCQkJbW9kZSA9ICZjb25u ZWN0b3ItPm1vZGVzW2pdOwo+ID4gKwo+ID4gKwkJCWlmIChtb2RlLT52ZGlzcGxheSA8IGxpbWl0 KSB7Cj4gPiArCQkJCWZvdW5kID0gdHJ1ZTsKPiA+ICsJCQkJYnJlYWs7Cj4gPiArCQkJfQo+ID4g KwkJfQo+ID4gKwo+ID4gKwkJZHJtTW9kZUZyZWVDb25uZWN0b3IoY29ubmVjdG9yKTsKPiA+ICsJ fQo+ID4gKwo+ID4gKwlkcm1Nb2RlRnJlZVJlc291cmNlcyhyZXNvdXJjZXMpOwo+ID4gKwo+ID4g KwlpZiAoIWZvdW5kKQo+ID4gKwkJbW9kZSA9ICZzdGRfMTAyNF9tb2RlOwo+ID4gKwo+ID4gKwly ZXR1cm4gbW9kZTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgKgo+ID4gK3Rlc3RfcmVz b2x1dGlvbl93aXRoX291dHB1dCh2b2lkICphcmdzKQo+ID4gK3sKPiA+ICsJZGF0YV90ICpkYXRh ID0gKGRhdGFfdCAqKWFyZ3M7Cj4gPiArCWRybU1vZGVNb2RlSW5mbyAqbW9kZV9oaSwgKm1vZGVf bG87Cj4gPiArCWludCByZXQ7Cj4gPiArCWludCBtaW4gPSAyMDsKPiA+ICsJaW50IG1heCA9IDUw Owo+ID4gKwlpbnQgdDsKPiA+ICsKPiA+ICsJaWd0X2luZm8oIlRlc3RpbmcgcmVzb2x1dGlvbiB3 aXRoIGNvbm5lY3RvciAlcyB1c2luZyBwaXBlCj4gPiAlcyB3aXRoIHNlZWQgJWRcbiIsCj4gPiAr CQnCoGlndF9vdXRwdXRfbmFtZShkYXRhLT5vdXRwdXQpLAo+ID4ga21zdGVzdF9waXBlX25hbWUo ZGF0YS0+cGlwZSksIG9wdC5zZWVkKTsKPiA+ICsKPiA+ICsJbW9kZV9oaSA9IGlndF9vdXRwdXRf Z2V0X21vZGUoZGF0YS0+b3V0cHV0KTsKPiA+ICsJbW9kZV9sbyA9IGdldF9sb3dyZXNfbW9kZShk YXRhLCBtb2RlX2hpKTsKPiA+ICsKPiA+ICsJd2hpbGUgKG9wdC5ydW4pIHsKPiA+ICsJCS8qIHN3 aXRjaCB0byBsb3dlciByZXNvbHV0aW9uICovCj4gPiArCQlyZXQgPSBkcm1Nb2RlU2V0Q3J0Yyhk YXRhLT5kcm1fZmQsIGRhdGEtPmNydGNfaWQsCj4gPiBkYXRhLT5mYi0+ZmJfaWQsIDAsIDAsCj4g PiArCQkJCcKgwqDCoMKgwqAmZGF0YS0+Y29ubmVjdG9yX2lkLCAxLAo+ID4gbW9kZV9sbyk7Cj4g PiArCQlpZ3RfYXNzZXJ0X2VxKHJldCwgMCk7Cj4gPiArCj4gPiArCQkvKiByYW5kb20gdGltZW91 dCBpbiBtcyAqLwo+ID4gKwkJdCA9IChyYW5kKCkgJSAobWF4ICsgMSAtIG1pbikpICsgbWluOwo+ ID4gKwkJdXNsZWVwKHQgKiAxMDAwKTsKPiA+ICsKPiA+ICsJCS8qIHN3aXRjaCBiYWNrIHRvIGhp Z2hlciByZXNvbHV0aW9uICovCj4gPiArCQlyZXQgPSBkcm1Nb2RlU2V0Q3J0YyhkYXRhLT5kcm1f ZmQsIGRhdGEtPmNydGNfaWQsCj4gPiBkYXRhLT5mYi0+ZmJfaWQsIDAsIDAsCj4gPiArCQkJCcKg wqDCoMKgwqAmZGF0YS0+Y29ubmVjdG9yX2lkLCAxLAo+ID4gbW9kZV9oaSk7Cj4gPiArCQlpZ3Rf YXNzZXJ0X2VxKHJldCwgMCk7Cj4gPiArCX0KPiA+ICsKPiA+ICsJcmV0dXJuIE5VTEw7Cj4gPiAr fQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkCj4gPiArcnVuX3Rlc3QoZGF0YV90ICpkYXRhLCBlbnVt IHBpcGUgcGlwZSkKPiA+ICt7Cj4gPiArCXB0aHJlYWRfdCBwbGFuZV90aHJlYWQ7Cj4gPiArCXB0 aHJlYWRfdCByZXNfdGhyZWFkOwo+ID4gKwl2b2lkICpwbGFuZV9yZXQsICpyZXNfcmV0Owo+ID4g Kwljb2xvcl90IGJsdWXCoMKgPSB7IDAuMGYsIDAuMGYsIDEuMGYgfTsKPiA+ICsJdGVzdF9wb3Np dGlvbl90IHRlc3QgPSB7IC5kYXRhID0gZGF0YSB9Owo+ID4gKwlpbnQgY29ubmVjdGVkX291dHM7 Cj4gPiArCWludCBtYXhfcGxhbmVzID0gZGF0YS0+ZGlzcGxheS5waXBlc1tkYXRhLT5waXBlXS5u X3BsYW5lczsKPiA+ICsKPiA+ICsJaWYgKCFvcHQudXNlcl9zZWVkKQo+ID4gKwkJb3B0LnNlZWQg PSB0aW1lKE5VTEwpOwo+ID4gKwo+ID4gKwljb25uZWN0ZWRfb3V0cyA9IDA7Cj4gPiArCWZvcl9l YWNoX3ZhbGlkX291dHB1dF9vbl9waXBlKCZkYXRhLT5kaXNwbGF5LCBwaXBlLCBkYXRhLQo+ID4g Pm91dHB1dCkgewo+ID4gKwkJZGF0YS0+cGlwZSA9IHBpcGU7Cj4gPiArCj4gPiArCQlkYXRhLT5j b25uZWN0b3JfaWQgPSBnZXRfY29ubmVjdG9yX2Nvbm5lY3RlZChkYXRhLQo+ID4gPmRybV9mZCkt PmNvbm5lY3Rvcl9pZDsKPiA+ICsJCWlndF9hc3NlcnQoZGF0YS0+Y29ubmVjdG9yX2lkICE9IC1F SU5WQUwpOwo+ID4gKwo+ID4gKwkJZGF0YS0+Y3J0Y19pZCA9IGdldF9jcnRjKGRhdGEtPmRybV9m ZCk7Cj4gPiArCQlpZ3RfYXNzZXJ0KGRhdGEtPmNydGNfaWQgIT0gLUVJTlZBTCk7Cj4gPiArCj4g PiArCQl0ZXN0X2luaXQoZGF0YSwgbWF4X3BsYW5lcyk7Cj4gPiArCj4gPiArCQl0ZXN0X2dyYWJf Y3JjKGRhdGEsICZibHVlLCAmdGVzdC5yZWZlcmVuY2VfY3JjKTsKPiA+ICsKPiA+ICsJCWlmIChw dGhyZWFkX2NyZWF0ZSgmcGxhbmVfdGhyZWFkLCBOVUxMLAo+ID4gdGVzdF9wbGFuZV9wb3NpdGlv bl93aXRoX291dHB1dCwgZGF0YSkpCj4gPiArCQkJaWd0X2Fzc2VydChmYWxzZSk7Cj4gPiArCj4g PiArCQlpZiAocHRocmVhZF9jcmVhdGUoJnJlc190aHJlYWQsIE5VTEwsCj4gPiB0ZXN0X3Jlc29s dXRpb25fd2l0aF9vdXRwdXQsIGRhdGEpKQo+ID4gKwkJCWlndF9hc3NlcnQoZmFsc2UpOwo+ID4g Kwo+ID4gKwkJaWYgKHB0aHJlYWRfam9pbihwbGFuZV90aHJlYWQsICh2b2lkCj4gPiAqKikmcGxh bmVfcmV0KSkKPiA+ICsJCQlpZ3RfYXNzZXJ0KGZhbHNlKTsKPiA+ICsKPiA+ICsJCWlmIChwdGhy ZWFkX2pvaW4ocmVzX3RocmVhZCwgKHZvaWQgKiopJnJlc19yZXQpKQo+ID4gKwkJCWlndF9hc3Nl cnQoZmFsc2UpOwo+IE1heWJlIHVzZSBpZ3RfZm9yayArIGlndF93YWl0Y2hpbGRyZW4/IFRoYXQg d2F5IHlvdSBjYW4ga2VlcCB1c2luZwo+IHRoZSBpZ3RfZGlzcGxheSBjYWxscyBldmVyeXdoZXJl IHdpdGhvdXQgaGF2aW5nIHRvIHdvcnJ5IGFib3V0Cj4gY2xvYmJlcmluZyBkYXRhLT5kaXNwbGF5 Lgo+IEl0IHdvdWxkIGNsZWFuIHVwIHRoZSBjb2RlIGEgbG90LCBidXQgbWlnaHQgYmUgc2xpZ2h0 bHkgbW9yZSB0cmlja3ksCj4geW91IG5lZWQgdG8gdXBkYXRlIHRoZSBtb2RlX2Jsb2IgYWZ0ZXIg aWd0X3dhaXRjaGlsZHJlbigpLCBwcm9iYWJseQo+IGp1c3QgdW5zZXQgaXQuIEl0J3MgYSBzbWFs bCBsZWFrLCBhbmQgY2xlYW5lZCB1cCBvbiBwcm9jZXNzIGV4aXQuClRoaXMgaXMganVzdCBhbm90 aGVyIHdheSB0byBpbXBsZW1lbnQgdGhpcy4gSSBkbyBhZ3JlZSB0aGF0IHRoaXMgaXMKbW9yZSBp Z3Qgd2F5IG9mIGRvaW5nIHRoaXMuIEknbGwgc3dpdGNoIHRvIHVzZSBpZ3Qgc3R5bGUuCgpUaGFu a3MgZm9yIHRoZSByZXZpZXchCgo+ID4gCj4gPiArCj4gPiArCQl0ZXN0X2ZpbmkoZGF0YSwgZGF0 YS0+b3V0cHV0LCBtYXhfcGxhbmVzKTsKPiA+ICsKPiA+ICsJCWNvbm5lY3RlZF9vdXRzKys7Cj4g PiArCX0KPiA+ICsKPiA+ICsJaWd0X3NraXBfb24oY29ubmVjdGVkX291dHMgPT0gMCk7Cj4gPiAr fQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkCj4gPiArcnVuX3Rlc3RzX2Zvcl9waXBlKGRhdGFfdCAq ZGF0YSwgZW51bSBwaXBlIHBpcGUpCj4gPiArewo+ID4gKwlpZ3Rfb3V0cHV0X3QgKm91dHB1dDsK PiA+ICsKPiA+ICsJaWd0X2ZpeHR1cmUgewo+ID4gKwkJaW50IHZhbGlkX3Rlc3RzID0gMDsKPiA+ ICsKPiA+ICsJCWlndF9za2lwX29uKHBpcGUgPj0gZGF0YS0+ZGlzcGxheS5uX3BpcGVzKTsKPiA+ ICsKPiA+ICsJCWZvcl9lYWNoX3ZhbGlkX291dHB1dF9vbl9waXBlKCZkYXRhLT5kaXNwbGF5LAo+ ID4gcGlwZSwgb3V0cHV0KQo+ID4gKwkJCXZhbGlkX3Rlc3RzKys7Cj4gPiArCj4gPiArCQlpZ3Rf cmVxdWlyZV9mKHZhbGlkX3Rlc3RzLCAibm8gdmFsaWQKPiA+IGNydGMvY29ubmVjdG9yIGNvbWJp bmF0aW9ucyBmb3VuZFxuIik7Cj4gPiArCQlpZ3RfcmVxdWlyZShkYXRhLT5kaXNwbGF5LnBpcGVz W3BpcGVdLm5fcGxhbmVzID4KPiA+IDApOwo+ID4gKwkJaWd0X3JlcXVpcmUoZGF0YS0+ZGlzcGxh eS5pc19hdG9taWMpOwo+ID4gKwl9Cj4gPiArCj4gPiArCWlndF9zdWJ0ZXN0X2YoInBpcGUtJXMt YmFzaWMiLCBrbXN0ZXN0X3BpcGVfbmFtZShwaXBlKSkKPiA+ICsJCWZvcl9lYWNoX3ZhbGlkX291 dHB1dF9vbl9waXBlKCZkYXRhLT5kaXNwbGF5LAo+ID4gcGlwZSwgb3V0cHV0KQo+ID4gKwkJCXJ1 bl90ZXN0KGRhdGEsIHBpcGUpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG9wdF9oYW5k bGVyKGludCBvcHRpb24sIGludCBvcHRpb25faW5kZXgsIHZvaWQgKmlucHV0KQo+ID4gK3sKPiA+ ICsJc3dpdGNoIChvcHRpb24pIHsKPiA+ICsJY2FzZSAnaSc6Cj4gPiArCQlvcHQuaXRlcmF0aW9u cyA9IHN0cnRvbChvcHRhcmcsIE5VTEwsIDApOwo+ID4gKwo+ID4gKwkJaWYgKG9wdC5pdGVyYXRp b25zIDwgTE9PUF9GT1JFVkVSIHx8Cj4gPiBvcHQuaXRlcmF0aW9ucyA9PSAwKSB7Cj4gPiArCQkJ aWd0X2luZm8oImluY29ycmVjdCBudW1iZXIgb2YKPiA+IGl0ZXJhdGlvbnNcbiIpOwo+ID4gKwkJ CWlndF9hc3NlcnQoZmFsc2UpOwo+ID4gKwkJfQo+ID4gKwo+ID4gKwkJYnJlYWs7Cj4gPiArCWNh c2UgJ3MnOgo+ID4gKwkJb3B0LnVzZXJfc2VlZCA9IHRydWU7Cj4gPiArCQlvcHQuc2VlZCA9IHN0 cnRvbChvcHRhcmcsIE5VTEwsIDApOwo+ID4gKwkJYnJlYWs7Cj4gPiArCWRlZmF1bHQ6Cj4gPiAr CQlpZ3RfYXNzZXJ0KGZhbHNlKTsKPiA+ICsJfQo+ID4gKwo+ID4gKwlyZXR1cm4gMDsKPiA+ICt9 Cj4gPiArCj4gPiArY29uc3QgY2hhciAqaGVscF9zdHIgPQo+ID4gKwkiwqDCoC0taXRlcmF0aW9u cyBOdW1iZXIgb2YgaXRlcmF0aW9ucyBmb3IgdGVzdCBjb3ZlcmFnZS4gLTEKPiA+IGxvb3AgZm9y ZXZlciwgZGVmYXVsdCA2NCBpdGVyYXRpb25zXG4iCj4gPiArCSLCoMKgLS1zZWVkwqDCoMKgwqDC oMKgwqBTZWVkIGZvciByYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuIjsKPiA+ICsKPiA+ICtzdGF0 aWMgZGF0YV90IGRhdGE7Cj4gPiArCj4gPiAraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3Zb XSkKPiA+ICt7Cj4gPiArCXN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7Cj4gPiArCQl7 ICJpdGVyYXRpb25zIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdpJ30sCj4gPiArCQl7ICJz ZWVkIizCoMKgwqDCoHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAncyd9LAo+ID4gKwkJeyAwLCAw LCAwLCAwIH0KPiA+ICsJfTsKPiA+ICsKPiA+ICsJaWd0X3N1YnRlc3RfaW5pdF9wYXJzZV9vcHRz KCZhcmdjLCBhcmd2LCAiIiwgbG9uZ19vcHRpb25zLAo+ID4gaGVscF9zdHIsCj4gPiArCQkJCcKg wqDCoMKgb3B0X2hhbmRsZXIsIE5VTEwpOwo+ID4gKwo+ID4gKwlpZ3Rfc2tpcF9vbl9zaW11bGF0 aW9uKCk7Cj4gPiArCj4gPiArCWlndF9maXh0dXJlIHsKPiA+ICsJCWRhdGEuZHJtX2ZkID0KPiA+ IGRybV9vcGVuX2RyaXZlcl9tYXN0ZXIoRFJJVkVSX0lOVEVMKTsKPiA+ICsJCWttc3Rlc3Rfc2V0 X3Z0X2dyYXBoaWNzX21vZGUoKTsKPiA+ICsJCWlndF9kaXNwbGF5X2luaXQoJmRhdGEuZGlzcGxh eSwgZGF0YS5kcm1fZmQpOwo+ID4gKwkJaWd0X3JlcXVpcmUoZGF0YS5kaXNwbGF5Lm5fcGlwZXMg PiAwKTsKPiA+ICsJfQo+ID4gKwo+ID4gKwlmb3IgKGludCBwaXBlID0gMDsgcGlwZSA8IEk5MTVf TUFYX1BJUEVTOyBwaXBlKyspIHsKPiA+ICsJCWlndF9zdWJ0ZXN0X2dyb3VwCj4gPiArCQkJcnVu X3Rlc3RzX2Zvcl9waXBlKCZkYXRhLCBwaXBlKTsKPiA+ICsJfQo+ID4gKwo+ID4gKwlpZ3RfZml4 dHVyZSB7Cj4gPiArCQlpZ3RfZGlzcGxheV9maW5pKCZkYXRhLmRpc3BsYXkpOwo+ID4gKwl9Cj4g PiArCj4gPiArCWlndF9leGl0KCk7Cj4gPiArfQo+IAotLSAKTWlrYSBLYWhvbGEgLSBJbnRlbCBP VEMKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVs LWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczov L2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=