From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: Re: [PATCH] drm/i915/selftests: Teach requests to use all available engines Date: Thu, 17 Oct 2019 17:54:55 +0100 Message-ID: <81b792c0-7996-e7ab-dc4c-dff67a4e30f7@linux.intel.com> References: <20191016125236.17960-1-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id 266106E486 for ; Thu, 17 Oct 2019 16:55:03 +0000 (UTC) In-Reply-To: <20191016125236.17960-1-chris@chris-wilson.co.uk> 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: Chris Wilson , intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org Ck9uIDE2LzEwLzIwMTkgMTM6NTIsIENocmlzIFdpbHNvbiB3cm90ZToKPiBUaGUgcmVxdWVzdCBz ZWxmdGVzdHMgc3RyYWRkbGUgdGhlIGJvdW5kYXJ5IGJldHdlZW4gY2hlY2tpbmcgdGhlIGRyaXZl cgo+IGFuZCB0aGUgaGFyZHdhcmUuIFRoZXkgYXJlIHN1YmplY3QgdG8gdGhlIHF1aXJrcyBvZiB0 aGUgdW5kZXJseWluZyBIVywKPiBidXQgb3BlcmF0ZSBvbiB0b3Agb2YgdGhlIGJhY2tlbmQgYWJz dHJhY3Rpb25zLiBUaGUgdGVzdHMgZm9jdXMgb24gdGhlCj4gc2NoZWR1bGVyIGVsZW1lbnRzIGFu ZCBzbyBzaG91bGQgY2hlY2sgZm9yIGludGVyYWN0aW9ucyBvZiB0aGUgc2NoZWR1bGVyCj4gYWNy b3NzIGFsbCBleHBvc2VkIGVuZ2luZXMuCj4gCj4gU2lnbmVkLW9mZi1ieTogQ2hyaXMgV2lsc29u IDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+Cj4gQ2M6IFR2cnRrbyBVcnN1bGluIDx0dnJ0a28u dXJzdWxpbkBpbnRlbC5jb20+Cj4gLS0tCj4gICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVz dHMvaTkxNV9yZXF1ZXN0LmMgfCAyNzYgKysrKysrKysrKystLS0tLS0tCj4gICAxIGZpbGUgY2hh bmdlZCwgMTcwIGluc2VydGlvbnMoKyksIDEwNiBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfcmVxdWVzdC5jIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfcmVxdWVzdC5jCj4gaW5kZXggMDg5N2E3YjA0 OTQ0Li5iOTVhMGU4NDMxYWIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2Vs ZnRlc3RzL2k5MTVfcmVxdWVzdC5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRl c3RzL2k5MTVfcmVxdWVzdC5jCj4gQEAgLTM3LDYgKzM3LDE4IEBACj4gICAjaW5jbHVkZSAibW9j a19kcm0uaCIKPiAgICNpbmNsdWRlICJtb2NrX2dlbV9kZXZpY2UuaCIKPiAgIAo+ICtzdGF0aWMg dW5zaWduZWQgaW50IG51bV91YWJpX2VuZ2luZXMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5 MTUpCj4gK3sKPiArCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZTsKPiArCXVuc2lnbmVk IGludCBjb3VudDsKPiArCj4gKwljb3VudCA9IDA7Cj4gKwlmb3JfZWFjaF91YWJpX2VuZ2luZShl bmdpbmUsIGk5MTUpCj4gKwkJY291bnQrKzsKPiArCj4gKwlyZXR1cm4gY291bnQ7Cj4gK30KPiAr Cj4gICBzdGF0aWMgaW50IGlndF9hZGRfcmVxdWVzdCh2b2lkICphcmcpCj4gICB7Cj4gICAJc3Ry dWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBhcmc7Cj4gQEAgLTUxMSwxNSArNTIzLDE1IEBA IHN0YXRpYyBpbnQgbGl2ZV9ub3BfcmVxdWVzdCh2b2lkICphcmcpCj4gICAJc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmk5MTUgPSBhcmc7Cj4gICAJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5n aW5lOwo+ICAgCXN0cnVjdCBpZ3RfbGl2ZV90ZXN0IHQ7Cj4gLQl1bnNpZ25lZCBpbnQgaWQ7Cj4g ICAJaW50IGVyciA9IC1FTk9ERVY7Cj4gICAKPiAtCS8qIFN1Ym1pdCB2YXJpb3VzIHNpemVkIGJh dGNoZXMgb2YgZW1wdHkgcmVxdWVzdHMsIHRvIGVhY2ggZW5naW5lCj4gKwkvKgo+ICsJICogU3Vi bWl0IHZhcmlvdXMgc2l6ZWQgYmF0Y2hlcyBvZiBlbXB0eSByZXF1ZXN0cywgdG8gZWFjaCBlbmdp bmUKPiAgIAkgKiAoaW5kaXZpZHVhbGx5KSwgYW5kIHdhaXQgZm9yIHRoZSBiYXRjaCB0byBjb21w bGV0ZS4gV2UgY2FuIGNoZWNrCj4gICAJICogdGhlIG92ZXJoZWFkIG9mIHN1Ym1pdHRpbmcgcmVx dWVzdHMgdG8gdGhlIGhhcmR3YXJlLgo+ICAgCSAqLwo+ICAgCj4gLQlmb3JfZWFjaF9lbmdpbmUo ZW5naW5lLCBpOTE1LCBpZCkgewo+ICsJZm9yX2VhY2hfdWFiaV9lbmdpbmUoZW5naW5lLCBpOTE1 KSB7Cj4gICAJCXVuc2lnbmVkIGxvbmcgbiwgcHJpbWU7Cj4gICAJCUlHVF9USU1FT1VUKGVuZF90 aW1lKTsKPiAgIAkJa3RpbWVfdCB0aW1lc1syXSA9IHt9Owo+IEBAIC01MzksNyArNTUxLDggQEAg c3RhdGljIGludCBsaXZlX25vcF9yZXF1ZXN0KHZvaWQgKmFyZykKPiAgIAkJCQlpZiAoSVNfRVJS KHJlcXVlc3QpKQo+ICAgCQkJCQlyZXR1cm4gUFRSX0VSUihyZXF1ZXN0KTsKPiAgIAo+IC0JCQkJ LyogVGhpcyBzcGFjZSBpcyBsZWZ0IGludGVudGlvbmFsbHkgYmxhbmsuCj4gKwkJCQkvKgo+ICsJ CQkJICogVGhpcyBzcGFjZSBpcyBsZWZ0IGludGVudGlvbmFsbHkgYmxhbmsuCj4gICAJCQkJICoK PiAgIAkJCQkgKiBXZSBkbyBub3QgYWN0dWFsbHkgd2FudCB0byBwZXJmb3JtIGFueQo+ICAgCQkJ CSAqIGFjdGlvbiB3aXRoIHRoaXMgcmVxdWVzdCwgd2UganVzdCB3YW50Cj4gQEAgLTY1NywxMCAr NjcwLDEwIEBAIHN0YXRpYyBpbnQgbGl2ZV9lbXB0eV9yZXF1ZXN0KHZvaWQgKmFyZykKPiAgIAlz dHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmU7Cj4gICAJc3RydWN0IGlndF9saXZlX3Rlc3Qg dDsKPiAgIAlzdHJ1Y3QgaTkxNV92bWEgKmJhdGNoOwo+IC0JdW5zaWduZWQgaW50IGlkOwo+ICAg CWludCBlcnIgPSAwOwo+ICAgCj4gLQkvKiBTdWJtaXQgdmFyaW91cyBzaXplZCBiYXRjaGVzIG9m IGVtcHR5IHJlcXVlc3RzLCB0byBlYWNoIGVuZ2luZQo+ICsJLyoKPiArCSAqIFN1Ym1pdCB2YXJp b3VzIHNpemVkIGJhdGNoZXMgb2YgZW1wdHkgcmVxdWVzdHMsIHRvIGVhY2ggZW5naW5lCj4gICAJ ICogKGluZGl2aWR1YWxseSksIGFuZCB3YWl0IGZvciB0aGUgYmF0Y2ggdG8gY29tcGxldGUuIFdl IGNhbiBjaGVjawo+ICAgCSAqIHRoZSBvdmVyaGVhZCBvZiBzdWJtaXR0aW5nIHJlcXVlc3RzIHRv IHRoZSBoYXJkd2FyZS4KPiAgIAkgKi8KPiBAQCAtNjY5LDcgKzY4Miw3IEBAIHN0YXRpYyBpbnQg bGl2ZV9lbXB0eV9yZXF1ZXN0KHZvaWQgKmFyZykKPiAgIAlpZiAoSVNfRVJSKGJhdGNoKSkKPiAg IAkJcmV0dXJuIFBUUl9FUlIoYmF0Y2gpOwo+ICAgCj4gLQlmb3JfZWFjaF9lbmdpbmUoZW5naW5l LCBpOTE1LCBpZCkgewo+ICsJZm9yX2VhY2hfdWFiaV9lbmdpbmUoZW5naW5lLCBpOTE1KSB7Cj4g ICAJCUlHVF9USU1FT1VUKGVuZF90aW1lKTsKPiAgIAkJc3RydWN0IGk5MTVfcmVxdWVzdCAqcmVx dWVzdDsKPiAgIAkJdW5zaWduZWQgbG9uZyBuLCBwcmltZTsKPiBAQCAtODAxLDYzICs4MTQsNzMg QEAgc3RhdGljIGludCByZWN1cnNpdmVfYmF0Y2hfcmVzb2x2ZShzdHJ1Y3QgaTkxNV92bWEgKmJh dGNoKQo+ICAgc3RhdGljIGludCBsaXZlX2FsbF9lbmdpbmVzKHZvaWQgKmFyZykKPiAgIHsKPiAg IAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsKPiArCWNvbnN0IHVuc2lnbmVk IGludCBuZW5naW5lcyA9IG51bV91YWJpX2VuZ2luZXMoaTkxNSk7Cj4gICAJc3RydWN0IGludGVs X2VuZ2luZV9jcyAqZW5naW5lOwo+IC0Jc3RydWN0IGk5MTVfcmVxdWVzdCAqcmVxdWVzdFtJOTE1 X05VTV9FTkdJTkVTXTsKPiArCXN0cnVjdCBpOTE1X3JlcXVlc3QgKipyZXF1ZXN0Owo+ICAgCXN0 cnVjdCBpZ3RfbGl2ZV90ZXN0IHQ7Cj4gICAJc3RydWN0IGk5MTVfdm1hICpiYXRjaDsKPiAtCXVu c2lnbmVkIGludCBpZDsKPiArCXVuc2lnbmVkIGludCBpZHg7Cj4gICAJaW50IGVycjsKPiAgIAo+ IC0JLyogQ2hlY2sgd2UgY2FuIHN1Ym1pdCByZXF1ZXN0cyB0byBhbGwgZW5naW5lcyBzaW11bHRh bmVvdXNseS4gV2UKPiArCS8qCj4gKwkgKiBDaGVjayB3ZSBjYW4gc3VibWl0IHJlcXVlc3RzIHRv IGFsbCBlbmdpbmVzIHNpbXVsdGFuZW91c2x5LiBXZQo+ICAgCSAqIHNlbmQgYSByZWN1cnNpdmUg YmF0Y2ggdG8gZWFjaCBlbmdpbmUgLSBjaGVja2luZyB0aGF0IHdlIGRvbid0Cj4gICAJICogYmxv Y2sgZG9pbmcgc28sIGFuZCB0aGF0IHRoZXkgZG9uJ3QgY29tcGxldGUgdG9vIHNvb24uCj4gICAJ ICovCj4gICAKPiArCXJlcXVlc3QgPSBrbWFsbG9jX2FycmF5KG5lbmdpbmVzLCBzaXplb2YoKnJl cXVlc3QpLCBHRlBfS0VSTkVMKTsKCl9fR0ZQX1pFUk8gYXMgbGl2ZV9zZXF1ZW50aWFsIGZvciBl cnJvciB1bndpbmQgdG8gd29yaywgSSB0aGluay4KCj4gKwlpZiAoIXJlcXVlc3QpCj4gKwkJcmV0 dXJuIC1FTk9NRU07Cj4gKwo+ICAgCWVyciA9IGlndF9saXZlX3Rlc3RfYmVnaW4oJnQsIGk5MTUs IF9fZnVuY19fLCAiIik7Cj4gICAJaWYgKGVycikKPiAtCQlyZXR1cm4gZXJyOwo+ICsJCWdvdG8g b3V0X2ZyZWU7Cj4gICAKPiAgIAliYXRjaCA9IHJlY3Vyc2l2ZV9iYXRjaChpOTE1KTsKPiAgIAlp ZiAoSVNfRVJSKGJhdGNoKSkgewo+ICAgCQllcnIgPSBQVFJfRVJSKGJhdGNoKTsKPiAgIAkJcHJf ZXJyKCIlczogVW5hYmxlIHRvIGNyZWF0ZSBiYXRjaCwgZXJyPSVkXG4iLCBfX2Z1bmNfXywgZXJy KTsKPiAtCQlyZXR1cm4gZXJyOwo+ICsJCWdvdG8gb3V0X2ZyZWU7Cj4gICAJfQo+ICAgCj4gLQlm b3JfZWFjaF9lbmdpbmUoZW5naW5lLCBpOTE1LCBpZCkgewo+IC0JCXJlcXVlc3RbaWRdID0gaTkx NV9yZXF1ZXN0X2NyZWF0ZShlbmdpbmUtPmtlcm5lbF9jb250ZXh0KTsKPiAtCQlpZiAoSVNfRVJS KHJlcXVlc3RbaWRdKSkgewo+IC0JCQllcnIgPSBQVFJfRVJSKHJlcXVlc3RbaWRdKTsKPiArCWlk eCA9IDA7Cj4gKwlmb3JfZWFjaF91YWJpX2VuZ2luZShlbmdpbmUsIGk5MTUpIHsKPiArCQlyZXF1 ZXN0W2lkeF0gPSBpOTE1X3JlcXVlc3RfY3JlYXRlKGVuZ2luZS0+a2VybmVsX2NvbnRleHQpOwo+ ICsJCWlmIChJU19FUlIocmVxdWVzdFtpZHhdKSkgewo+ICsJCQllcnIgPSBQVFJfRVJSKHJlcXVl c3RbaWR4XSk7Cj4gICAJCQlwcl9lcnIoIiVzOiBSZXF1ZXN0IGFsbG9jYXRpb24gZmFpbGVkIHdp dGggZXJyPSVkXG4iLAo+ICAgCQkJICAgICAgIF9fZnVuY19fLCBlcnIpOwo+ICAgCQkJZ290byBv dXRfcmVxdWVzdDsKPiAgIAkJfQo+ICAgCj4gLQkJZXJyID0gZW5naW5lLT5lbWl0X2JiX3N0YXJ0 KHJlcXVlc3RbaWRdLAo+ICsJCWVyciA9IGVuZ2luZS0+ZW1pdF9iYl9zdGFydChyZXF1ZXN0W2lk eF0sCj4gICAJCQkJCSAgICBiYXRjaC0+bm9kZS5zdGFydCwKPiAgIAkJCQkJICAgIGJhdGNoLT5u b2RlLnNpemUsCj4gICAJCQkJCSAgICAwKTsKPiAgIAkJR0VNX0JVR19PTihlcnIpOwo+IC0JCXJl cXVlc3RbaWRdLT5iYXRjaCA9IGJhdGNoOwo+ICsJCXJlcXVlc3RbaWR4XS0+YmF0Y2ggPSBiYXRj aDsKPiAgIAo+ICAgCQlpOTE1X3ZtYV9sb2NrKGJhdGNoKTsKPiAtCQllcnIgPSBpOTE1X3JlcXVl c3RfYXdhaXRfb2JqZWN0KHJlcXVlc3RbaWRdLCBiYXRjaC0+b2JqLCAwKTsKPiArCQllcnIgPSBp OTE1X3JlcXVlc3RfYXdhaXRfb2JqZWN0KHJlcXVlc3RbaWR4XSwgYmF0Y2gtPm9iaiwgMCk7Cj4g ICAJCWlmIChlcnIgPT0gMCkKPiAtCQkJZXJyID0gaTkxNV92bWFfbW92ZV90b19hY3RpdmUoYmF0 Y2gsIHJlcXVlc3RbaWRdLCAwKTsKPiArCQkJZXJyID0gaTkxNV92bWFfbW92ZV90b19hY3RpdmUo YmF0Y2gsIHJlcXVlc3RbaWR4XSwgMCk7Cj4gICAJCWk5MTVfdm1hX3VubG9jayhiYXRjaCk7Cj4g ICAJCUdFTV9CVUdfT04oZXJyKTsKPiAgIAo+IC0JCWk5MTVfcmVxdWVzdF9nZXQocmVxdWVzdFtp ZF0pOwo+IC0JCWk5MTVfcmVxdWVzdF9hZGQocmVxdWVzdFtpZF0pOwo+ICsJCWk5MTVfcmVxdWVz dF9nZXQocmVxdWVzdFtpZHhdKTsKPiArCQlpOTE1X3JlcXVlc3RfYWRkKHJlcXVlc3RbaWR4XSk7 Cj4gKwkJaWR4Kys7Cj4gICAJfQo+ICAgCj4gLQlmb3JfZWFjaF9lbmdpbmUoZW5naW5lLCBpOTE1 LCBpZCkgewo+IC0JCWlmIChpOTE1X3JlcXVlc3RfY29tcGxldGVkKHJlcXVlc3RbaWRdKSkgewo+ ICsJaWR4ID0gMDsKPiArCWZvcl9lYWNoX3VhYmlfZW5naW5lKGVuZ2luZSwgaTkxNSkgewo+ICsJ CWlmIChpOTE1X3JlcXVlc3RfY29tcGxldGVkKHJlcXVlc3RbaWR4XSkpIHsKPiAgIAkJCXByX2Vy cigiJXMoJXMpOiByZXF1ZXN0IGNvbXBsZXRlZCB0b28gZWFybHkhXG4iLAo+ICAgCQkJICAgICAg IF9fZnVuY19fLCBlbmdpbmUtPm5hbWUpOwo+ICAgCQkJZXJyID0gLUVJTlZBTDsKPiAgIAkJCWdv dG8gb3V0X3JlcXVlc3Q7Cj4gICAJCX0KPiArCQlpZHgrKzsKPiAgIAl9Cj4gICAKPiAgIAllcnIg PSByZWN1cnNpdmVfYmF0Y2hfcmVzb2x2ZShiYXRjaCk7Cj4gQEAgLTg2NiwxMCArODg5LDExIEBA IHN0YXRpYyBpbnQgbGl2ZV9hbGxfZW5naW5lcyh2b2lkICphcmcpCj4gICAJCWdvdG8gb3V0X3Jl cXVlc3Q7Cj4gICAJfQo+ICAgCj4gLQlmb3JfZWFjaF9lbmdpbmUoZW5naW5lLCBpOTE1LCBpZCkg ewo+ICsJaWR4ID0gMDsKPiArCWZvcl9lYWNoX3VhYmlfZW5naW5lKGVuZ2luZSwgaTkxNSkgewo+ ICAgCQlsb25nIHRpbWVvdXQ7Cj4gICAKPiAtCQl0aW1lb3V0ID0gaTkxNV9yZXF1ZXN0X3dhaXQo cmVxdWVzdFtpZF0sIDAsCj4gKwkJdGltZW91dCA9IGk5MTVfcmVxdWVzdF93YWl0KHJlcXVlc3Rb aWR4XSwgMCwKPiAgIAkJCQkJICAgIE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKPiAgIAkJaWYgKHRp bWVvdXQgPCAwKSB7Cj4gICAJCQllcnIgPSB0aW1lb3V0Owo+IEBAIC04NzgsNDMgKzkwMiw1NyBA QCBzdGF0aWMgaW50IGxpdmVfYWxsX2VuZ2luZXModm9pZCAqYXJnKQo+ICAgCQkJZ290byBvdXRf cmVxdWVzdDsKPiAgIAkJfQo+ICAgCj4gLQkJR0VNX0JVR19PTighaTkxNV9yZXF1ZXN0X2NvbXBs ZXRlZChyZXF1ZXN0W2lkXSkpOwo+IC0JCWk5MTVfcmVxdWVzdF9wdXQocmVxdWVzdFtpZF0pOwo+ IC0JCXJlcXVlc3RbaWRdID0gTlVMTDsKPiArCQlHRU1fQlVHX09OKCFpOTE1X3JlcXVlc3RfY29t cGxldGVkKHJlcXVlc3RbaWR4XSkpOwo+ICsJCWk5MTVfcmVxdWVzdF9wdXQocmVxdWVzdFtpZHhd KTsKPiArCQlyZXF1ZXN0W2lkeF0gPSBOVUxMOwo+ICsJCWlkeCsrOwo+ICAgCX0KPiAgIAo+ICAg CWVyciA9IGlndF9saXZlX3Rlc3RfZW5kKCZ0KTsKPiAgIAo+ICAgb3V0X3JlcXVlc3Q6Cj4gLQlm b3JfZWFjaF9lbmdpbmUoZW5naW5lLCBpOTE1LCBpZCkKPiAtCQlpZiAocmVxdWVzdFtpZF0pCj4g LQkJCWk5MTVfcmVxdWVzdF9wdXQocmVxdWVzdFtpZF0pOwo+ICsJaWR4ID0gMDsKPiArCWZvcl9l YWNoX3VhYmlfZW5naW5lKGVuZ2luZSwgaTkxNSkgewo+ICsJCWlmIChyZXF1ZXN0W2lkeF0pCj4g KwkJCWk5MTVfcmVxdWVzdF9wdXQocmVxdWVzdFtpZHhdKTsKPiArCQlpZHgrKzsKPiArCX0KPiAg IAlpOTE1X3ZtYV91bnBpbihiYXRjaCk7Cj4gICAJaTkxNV92bWFfcHV0KGJhdGNoKTsKPiArb3V0 X2ZyZWU6Cj4gKwlrZnJlZShyZXF1ZXN0KTsKPiAgIAlyZXR1cm4gZXJyOwo+ICAgfQo+ICAgCj4g ICBzdGF0aWMgaW50IGxpdmVfc2VxdWVudGlhbF9lbmdpbmVzKHZvaWQgKmFyZykKPiAgIHsKPiAg IAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsKPiAtCXN0cnVjdCBpOTE1X3Jl cXVlc3QgKnJlcXVlc3RbSTkxNV9OVU1fRU5HSU5FU10gPSB7fTsKPiArCWNvbnN0IHVuc2lnbmVk IGludCBuZW5naW5lcyA9IG51bV91YWJpX2VuZ2luZXMoaTkxNSk7Cj4gKwlzdHJ1Y3QgaTkxNV9y ZXF1ZXN0ICoqcmVxdWVzdDsKPiAgIAlzdHJ1Y3QgaTkxNV9yZXF1ZXN0ICpwcmV2ID0gTlVMTDsK PiAgIAlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmU7Cj4gICAJc3RydWN0IGlndF9saXZl X3Rlc3QgdDsKPiAtCXVuc2lnbmVkIGludCBpZDsKPiArCXVuc2lnbmVkIGludCBpZHg7Cj4gICAJ aW50IGVycjsKPiAgIAo+IC0JLyogQ2hlY2sgd2UgY2FuIHN1Ym1pdCByZXF1ZXN0cyB0byBhbGwg ZW5naW5lcyBzZXF1ZW50aWFsbHksIHN1Y2gKPiArCS8qCj4gKwkgKiBDaGVjayB3ZSBjYW4gc3Vi bWl0IHJlcXVlc3RzIHRvIGFsbCBlbmdpbmVzIHNlcXVlbnRpYWxseSwgc3VjaAo+ICAgCSAqIHRo YXQgZWFjaCBzdWNjZXNzaXZlIHJlcXVlc3Qgd2FpdHMgZm9yIHRoZSBlYXJsaWVyIG9uZXMuIFRo aXMKPiAgIAkgKiB0ZXN0cyB0aGF0IHdlIGRvbid0IGV4ZWN1dGUgcmVxdWVzdHMgb3V0IG9mIG9y ZGVyLCBldmVuIHRob3VnaAo+ICAgCSAqIHRoZXkgYXJlIHJ1bm5pbmcgb24gaW5kZXBlbmRlbnQg ZW5naW5lcy4KPiAgIAkgKi8KPiAgIAo+ICsJcmVxdWVzdCA9IGttYWxsb2NfYXJyYXkobmVuZ2lu ZXMsIHNpemVvZigqcmVxdWVzdCksCj4gKwkJCQlHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7Cj4g KwlpZiAoIXJlcXVlc3QpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICAgCWVyciA9IGlndF9s aXZlX3Rlc3RfYmVnaW4oJnQsIGk5MTUsIF9fZnVuY19fLCAiIik7Cj4gICAJaWYgKGVycikKPiAt CQlyZXR1cm4gZXJyOwo+ICsJCWdvdG8gb3V0X2ZyZWU7Cj4gICAKPiAtCWZvcl9lYWNoX2VuZ2lu ZShlbmdpbmUsIGk5MTUsIGlkKSB7Cj4gKwlpZHggPSAwOwo+ICsJZm9yX2VhY2hfdWFiaV9lbmdp bmUoZW5naW5lLCBpOTE1KSB7Cj4gICAJCXN0cnVjdCBpOTE1X3ZtYSAqYmF0Y2g7Cj4gICAKPiAg IAkJYmF0Y2ggPSByZWN1cnNpdmVfYmF0Y2goaTkxNSk7Cj4gQEAgLTkyMiw2NiArOTYwLDY5IEBA IHN0YXRpYyBpbnQgbGl2ZV9zZXF1ZW50aWFsX2VuZ2luZXModm9pZCAqYXJnKQo+ICAgCQkJZXJy ID0gUFRSX0VSUihiYXRjaCk7Cj4gICAJCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gY3JlYXRlIGJh dGNoIGZvciAlcywgZXJyPSVkXG4iLAo+ICAgCQkJICAgICAgIF9fZnVuY19fLCBlbmdpbmUtPm5h bWUsIGVycik7Cj4gLQkJCXJldHVybiBlcnI7Cj4gKwkJCWdvdG8gb3V0X2ZyZWU7Cj4gICAJCX0K PiAgIAo+IC0JCXJlcXVlc3RbaWRdID0gaTkxNV9yZXF1ZXN0X2NyZWF0ZShlbmdpbmUtPmtlcm5l bF9jb250ZXh0KTsKPiAtCQlpZiAoSVNfRVJSKHJlcXVlc3RbaWRdKSkgewo+IC0JCQllcnIgPSBQ VFJfRVJSKHJlcXVlc3RbaWRdKTsKPiArCQlyZXF1ZXN0W2lkeF0gPSBpOTE1X3JlcXVlc3RfY3Jl YXRlKGVuZ2luZS0+a2VybmVsX2NvbnRleHQpOwo+ICsJCWlmIChJU19FUlIocmVxdWVzdFtpZHhd KSkgewo+ICsJCQllcnIgPSBQVFJfRVJSKHJlcXVlc3RbaWR4XSk7Cj4gICAJCQlwcl9lcnIoIiVz OiBSZXF1ZXN0IGFsbG9jYXRpb24gZmFpbGVkIGZvciAlcyB3aXRoIGVycj0lZFxuIiwKPiAgIAkJ CSAgICAgICBfX2Z1bmNfXywgZW5naW5lLT5uYW1lLCBlcnIpOwo+ICAgCQkJZ290byBvdXRfcmVx dWVzdDsKPiAgIAkJfQo+ICAgCj4gICAJCWlmIChwcmV2KSB7Cj4gLQkJCWVyciA9IGk5MTVfcmVx dWVzdF9hd2FpdF9kbWFfZmVuY2UocmVxdWVzdFtpZF0sCj4gKwkJCWVyciA9IGk5MTVfcmVxdWVz dF9hd2FpdF9kbWFfZmVuY2UocmVxdWVzdFtpZHhdLAo+ICAgCQkJCQkJCSAgICZwcmV2LT5mZW5j ZSk7Cj4gICAJCQlpZiAoZXJyKSB7Cj4gLQkJCQlpOTE1X3JlcXVlc3RfYWRkKHJlcXVlc3RbaWRd KTsKPiArCQkJCWk5MTVfcmVxdWVzdF9hZGQocmVxdWVzdFtpZHhdKTsKPiAgIAkJCQlwcl9lcnIo IiVzOiBSZXF1ZXN0IGF3YWl0IGZhaWxlZCBmb3IgJXMgd2l0aCBlcnI9JWRcbiIsCj4gICAJCQkJ ICAgICAgIF9fZnVuY19fLCBlbmdpbmUtPm5hbWUsIGVycik7Cj4gICAJCQkJZ290byBvdXRfcmVx dWVzdDsKPiAgIAkJCX0KPiAgIAkJfQo+ICAgCj4gLQkJZXJyID0gZW5naW5lLT5lbWl0X2JiX3N0 YXJ0KHJlcXVlc3RbaWRdLAo+ICsJCWVyciA9IGVuZ2luZS0+ZW1pdF9iYl9zdGFydChyZXF1ZXN0 W2lkeF0sCj4gICAJCQkJCSAgICBiYXRjaC0+bm9kZS5zdGFydCwKPiAgIAkJCQkJICAgIGJhdGNo LT5ub2RlLnNpemUsCj4gICAJCQkJCSAgICAwKTsKPiAgIAkJR0VNX0JVR19PTihlcnIpOwo+IC0J CXJlcXVlc3RbaWRdLT5iYXRjaCA9IGJhdGNoOwo+ICsJCXJlcXVlc3RbaWR4XS0+YmF0Y2ggPSBi YXRjaDsKPiAgIAo+ICAgCQlpOTE1X3ZtYV9sb2NrKGJhdGNoKTsKPiAtCQllcnIgPSBpOTE1X3Jl cXVlc3RfYXdhaXRfb2JqZWN0KHJlcXVlc3RbaWRdLCBiYXRjaC0+b2JqLCBmYWxzZSk7Cj4gKwkJ ZXJyID0gaTkxNV9yZXF1ZXN0X2F3YWl0X29iamVjdChyZXF1ZXN0W2lkeF0sCj4gKwkJCQkJCWJh dGNoLT5vYmosIGZhbHNlKTsKPiAgIAkJaWYgKGVyciA9PSAwKQo+IC0JCQllcnIgPSBpOTE1X3Zt YV9tb3ZlX3RvX2FjdGl2ZShiYXRjaCwgcmVxdWVzdFtpZF0sIDApOwo+ICsJCQllcnIgPSBpOTE1 X3ZtYV9tb3ZlX3RvX2FjdGl2ZShiYXRjaCwgcmVxdWVzdFtpZHhdLCAwKTsKPiAgIAkJaTkxNV92 bWFfdW5sb2NrKGJhdGNoKTsKPiAgIAkJR0VNX0JVR19PTihlcnIpOwo+ICAgCj4gLQkJaTkxNV9y ZXF1ZXN0X2dldChyZXF1ZXN0W2lkXSk7Cj4gLQkJaTkxNV9yZXF1ZXN0X2FkZChyZXF1ZXN0W2lk XSk7Cj4gKwkJaTkxNV9yZXF1ZXN0X2dldChyZXF1ZXN0W2lkeF0pOwo+ICsJCWk5MTVfcmVxdWVz dF9hZGQocmVxdWVzdFtpZHhdKTsKPiAgIAo+IC0JCXByZXYgPSByZXF1ZXN0W2lkXTsKPiArCQlw cmV2ID0gcmVxdWVzdFtpZHhdOwo+ICsJCWlkeCsrOwo+ICAgCX0KPiAgIAo+IC0JZm9yX2VhY2hf ZW5naW5lKGVuZ2luZSwgaTkxNSwgaWQpIHsKPiArCWlkeCA9IDA7Cj4gKwlmb3JfZWFjaF91YWJp X2VuZ2luZShlbmdpbmUsIGk5MTUpIHsKPiAgIAkJbG9uZyB0aW1lb3V0Owo+ICAgCj4gLQkJaWYg KGk5MTVfcmVxdWVzdF9jb21wbGV0ZWQocmVxdWVzdFtpZF0pKSB7Cj4gKwkJaWYgKGk5MTVfcmVx dWVzdF9jb21wbGV0ZWQocmVxdWVzdFtpZHhdKSkgewo+ICAgCQkJcHJfZXJyKCIlcyglcyk6IHJl cXVlc3QgY29tcGxldGVkIHRvbyBlYXJseSFcbiIsCj4gICAJCQkgICAgICAgX19mdW5jX18sIGVu Z2luZS0+bmFtZSk7Cj4gICAJCQllcnIgPSAtRUlOVkFMOwo+ICAgCQkJZ290byBvdXRfcmVxdWVz dDsKPiAgIAkJfQo+ICAgCj4gLQkJZXJyID0gcmVjdXJzaXZlX2JhdGNoX3Jlc29sdmUocmVxdWVz dFtpZF0tPmJhdGNoKTsKPiArCQllcnIgPSByZWN1cnNpdmVfYmF0Y2hfcmVzb2x2ZShyZXF1ZXN0 W2lkeF0tPmJhdGNoKTsKPiAgIAkJaWYgKGVycikgewo+ICAgCQkJcHJfZXJyKCIlczogZmFpbGVk IHRvIHJlc29sdmUgYmF0Y2gsIGVycj0lZFxuIiwKPiAgIAkJCSAgICAgICBfX2Z1bmNfXywgZXJy KTsKPiAgIAkJCWdvdG8gb3V0X3JlcXVlc3Q7Cj4gICAJCX0KPiAgIAo+IC0JCXRpbWVvdXQgPSBp OTE1X3JlcXVlc3Rfd2FpdChyZXF1ZXN0W2lkXSwgMCwKPiArCQl0aW1lb3V0ID0gaTkxNV9yZXF1 ZXN0X3dhaXQocmVxdWVzdFtpZHhdLCAwLAo+ICAgCQkJCQkgICAgTUFYX1NDSEVEVUxFX1RJTUVP VVQpOwo+ICAgCQlpZiAodGltZW91dCA8IDApIHsKPiAgIAkJCWVyciA9IHRpbWVvdXQ7Cj4gQEAg LTk5MCwzMCArMTAzMSwzNSBAQCBzdGF0aWMgaW50IGxpdmVfc2VxdWVudGlhbF9lbmdpbmVzKHZv aWQgKmFyZykKPiAgIAkJCWdvdG8gb3V0X3JlcXVlc3Q7Cj4gICAJCX0KPiAgIAo+IC0JCUdFTV9C VUdfT04oIWk5MTVfcmVxdWVzdF9jb21wbGV0ZWQocmVxdWVzdFtpZF0pKTsKPiArCQlHRU1fQlVH X09OKCFpOTE1X3JlcXVlc3RfY29tcGxldGVkKHJlcXVlc3RbaWR4XSkpOwo+ICsJCWlkeCsrOwo+ ICAgCX0KPiAgIAo+ICAgCWVyciA9IGlndF9saXZlX3Rlc3RfZW5kKCZ0KTsKPiAgIAo+ICAgb3V0 X3JlcXVlc3Q6Cj4gLQlmb3JfZWFjaF9lbmdpbmUoZW5naW5lLCBpOTE1LCBpZCkgewo+ICsJaWR4 ID0gMDsKPiArCWZvcl9lYWNoX3VhYmlfZW5naW5lKGVuZ2luZSwgaTkxNSkgewo+ICAgCQl1MzIg KmNtZDsKPiAgIAo+IC0JCWlmICghcmVxdWVzdFtpZF0pCj4gKwkJaWYgKCFyZXF1ZXN0W2lkeF0p Cj4gICAJCQlicmVhazsKPiAgIAo+IC0JCWNtZCA9IGk5MTVfZ2VtX29iamVjdF9waW5fbWFwKHJl cXVlc3RbaWRdLT5iYXRjaC0+b2JqLAo+ICsJCWNtZCA9IGk5MTVfZ2VtX29iamVjdF9waW5fbWFw KHJlcXVlc3RbaWR4XS0+YmF0Y2gtPm9iaiwKPiAgIAkJCQkJICAgICAgSTkxNV9NQVBfV0MpOwo+ ICAgCQlpZiAoIUlTX0VSUihjbWQpKSB7Cj4gICAJCQkqY21kID0gTUlfQkFUQ0hfQlVGRkVSX0VO RDsKPiAgIAkJCWludGVsX2d0X2NoaXBzZXRfZmx1c2goZW5naW5lLT5ndCk7Cj4gICAKPiAtCQkJ aTkxNV9nZW1fb2JqZWN0X3VucGluX21hcChyZXF1ZXN0W2lkXS0+YmF0Y2gtPm9iaik7Cj4gKwkJ CWk5MTVfZ2VtX29iamVjdF91bnBpbl9tYXAocmVxdWVzdFtpZHhdLT5iYXRjaC0+b2JqKTsKPiAg IAkJfQo+ICAgCj4gLQkJaTkxNV92bWFfcHV0KHJlcXVlc3RbaWRdLT5iYXRjaCk7Cj4gLQkJaTkx NV9yZXF1ZXN0X3B1dChyZXF1ZXN0W2lkXSk7Cj4gKwkJaTkxNV92bWFfcHV0KHJlcXVlc3RbaWR4 XS0+YmF0Y2gpOwo+ICsJCWk5MTVfcmVxdWVzdF9wdXQocmVxdWVzdFtpZHhdKTsKPiArCQlpZHgr KzsKPiAgIAl9Cj4gK291dF9mcmVlOgo+ICsJa2ZyZWUocmVxdWVzdCk7Cj4gICAJcmV0dXJuIGVy cjsKPiAgIH0KPiAgIAo+IEBAIC0xMDc5LDkgKzExMjUsMTAgQEAgc3RhdGljIGludCBsaXZlX3Bh cmFsbGVsX2VuZ2luZXModm9pZCAqYXJnKQo+ICAgCQlfX2xpdmVfcGFyYWxsZWxfZW5naW5lTiwK PiAgIAkJTlVMTCwKPiAgIAl9Owo+ICsJY29uc3QgdW5zaWduZWQgaW50IG5lbmdpbmVzID0gbnVt X3VhYmlfZW5naW5lcyhpOTE1KTsKPiAgIAlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmU7 Cj4gLQllbnVtIGludGVsX2VuZ2luZV9pZCBpZDsKPiAgIAlpbnQgKCogY29uc3QgKmZuKSh2b2lk ICphcmcpOwo+ICsJc3RydWN0IHRhc2tfc3RydWN0ICoqdHNrOwo+ICAgCWludCBlcnIgPSAwOwo+ ICAgCj4gICAJLyoKPiBAQCAtMTA4OSw0MiArMTEzNiw0OSBAQCBzdGF0aWMgaW50IGxpdmVfcGFy YWxsZWxfZW5naW5lcyh2b2lkICphcmcpCj4gICAJICogdGVzdHMgdGhhdCB3ZSBsb2FkIHVwIHRo ZSBzeXN0ZW0gbWF4aW1hbGx5Lgo+ICAgCSAqLwo+ICAgCj4gKwl0c2sgPSBrbWFsbG9jX2FycmF5 KG5lbmdpbmVzLCBzaXplb2YoKnRzayksIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKPiArCWlm ICghdHNrKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiAgIAlmb3IgKGZuID0gZnVuYzsgIWVy ciAmJiAqZm47IGZuKyspIHsKPiAtCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRza1tJOTE1X05VTV9F TkdJTkVTXSA9IHt9Owo+ICAgCQlzdHJ1Y3QgaWd0X2xpdmVfdGVzdCB0Owo+ICsJCXVuc2lnbmVk IGludCBpZHg7Cj4gICAKPiAgIAkJZXJyID0gaWd0X2xpdmVfdGVzdF9iZWdpbigmdCwgaTkxNSwg X19mdW5jX18sICIiKTsKPiAgIAkJaWYgKGVycikKPiAgIAkJCWJyZWFrOwo+ICAgCj4gLQkJZm9y X2VhY2hfZW5naW5lKGVuZ2luZSwgaTkxNSwgaWQpIHsKPiAtCQkJdHNrW2lkXSA9IGt0aHJlYWRf cnVuKCpmbiwgZW5naW5lLAo+ICsJCWlkeCA9IDA7Cj4gKwkJZm9yX2VhY2hfdWFiaV9lbmdpbmUo ZW5naW5lLCBpOTE1KSB7Cj4gKwkJCXRza1tpZHhdID0ga3RocmVhZF9ydW4oKmZuLCBlbmdpbmUs Cj4gICAJCQkJCSAgICAgICJpZ3QvcGFyYWxsZWw6JXMiLAo+ICAgCQkJCQkgICAgICBlbmdpbmUt Pm5hbWUpOwo+IC0JCQlpZiAoSVNfRVJSKHRza1tpZF0pKSB7Cj4gLQkJCQllcnIgPSBQVFJfRVJS KHRza1tpZF0pOwo+ICsJCQlpZiAoSVNfRVJSKHRza1tpZHhdKSkgewo+ICsJCQkJZXJyID0gUFRS X0VSUih0c2tbaWR4XSk7Cj4gICAJCQkJYnJlYWs7Cj4gICAJCQl9Cj4gLQkJCWdldF90YXNrX3N0 cnVjdCh0c2tbaWRdKTsKPiArCQkJZ2V0X3Rhc2tfc3RydWN0KHRza1tpZHgrK10pOwo+ICAgCQl9 Cj4gICAKPiAtCQlmb3JfZWFjaF9lbmdpbmUoZW5naW5lLCBpOTE1LCBpZCkgewo+ICsJCWlkeCA9 IDA7Cj4gKwkJZm9yX2VhY2hfdWFiaV9lbmdpbmUoZW5naW5lLCBpOTE1KSB7Cj4gICAJCQlpbnQg c3RhdHVzOwo+ICAgCj4gLQkJCWlmIChJU19FUlJfT1JfTlVMTCh0c2tbaWRdKSkKPiAtCQkJCWNv bnRpbnVlOwo+ICsJCQlpZiAoSVNfRVJSKHRza1tpZHhdKSkKPiArCQkJCWJyZWFrOwo+ICAgCj4g LQkJCXN0YXR1cyA9IGt0aHJlYWRfc3RvcCh0c2tbaWRdKTsKPiArCQkJc3RhdHVzID0ga3RocmVh ZF9zdG9wKHRza1tpZHhdKTsKPiAgIAkJCWlmIChzdGF0dXMgJiYgIWVycikKPiAgIAkJCQllcnIg PSBzdGF0dXM7Cj4gICAKPiAtCQkJcHV0X3Rhc2tfc3RydWN0KHRza1tpZF0pOwo+ICsJCQlwdXRf dGFza19zdHJ1Y3QodHNrW2lkeCsrXSk7Cj4gICAJCX0KPiAgIAo+ICAgCQlpZiAoaWd0X2xpdmVf dGVzdF9lbmQoJnQpKQo+ICAgCQkJZXJyID0gLUVJTzsKPiAgIAl9Cj4gICAKPiArCWtmcmVlKHRz ayk7Cj4gICAJcmV0dXJuIGVycjsKPiAgIH0KPiAgIAo+IEBAIC0xMTY4LDE2ICsxMjIyLDE2IEBA IG1heF9iYXRjaGVzKHN0cnVjdCBpOTE1X2dlbV9jb250ZXh0ICpjdHgsIHN0cnVjdCBpbnRlbF9l bmdpbmVfY3MgKmVuZ2luZSkKPiAgIHN0YXRpYyBpbnQgbGl2ZV9icmVhZGNydW1ic19zbW9rZXRl c3Qodm9pZCAqYXJnKQo+ICAgewo+ICAgCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0g YXJnOwo+IC0Jc3RydWN0IHNtb2tldGVzdCB0W0k5MTVfTlVNX0VOR0lORVNdOwo+IC0JdW5zaWdu ZWQgaW50IG5jcHVzID0gbnVtX29ubGluZV9jcHVzKCk7Cj4gKwljb25zdCB1bnNpZ25lZCBpbnQg bmVuZ2luZXMgPSBudW1fdWFiaV9lbmdpbmVzKGk5MTUpOwo+ICsJY29uc3QgdW5zaWduZWQgaW50 IG5jcHVzID0gbnVtX29ubGluZV9jcHVzKCk7Cj4gICAJdW5zaWduZWQgbG9uZyBudW1fd2FpdHMs IG51bV9mZW5jZXM7Cj4gICAJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lOwo+ICAgCXN0 cnVjdCB0YXNrX3N0cnVjdCAqKnRocmVhZHM7Cj4gICAJc3RydWN0IGlndF9saXZlX3Rlc3QgbGl2 ZTsKPiAtCWVudW0gaW50ZWxfZW5naW5lX2lkIGlkOwo+ICAgCWludGVsX3dha2VyZWZfdCB3YWtl cmVmOwo+ICAgCXN0cnVjdCBkcm1fZmlsZSAqZmlsZTsKPiAtCXVuc2lnbmVkIGludCBuOwo+ICsJ c3RydWN0IHNtb2tldGVzdCAqc21va2U7Cj4gKwl1bnNpZ25lZCBpbnQgbiwgaWR4Owo+ICAgCWlu dCByZXQgPSAwOwo+ICAgCj4gICAJLyoKPiBAQCAtMTE5NiwyOCArMTI1MCwzMSBAQCBzdGF0aWMg aW50IGxpdmVfYnJlYWRjcnVtYnNfc21va2V0ZXN0KHZvaWQgKmFyZykKPiAgIAkJZ290byBvdXRf cnBtOwo+ICAgCX0KPiAgIAo+IC0JdGhyZWFkcyA9IGtjYWxsb2MobmNwdXMgKiBJOTE1X05VTV9F TkdJTkVTLAo+IC0JCQkgIHNpemVvZigqdGhyZWFkcyksCj4gLQkJCSAgR0ZQX0tFUk5FTCk7Cj4g LQlpZiAoIXRocmVhZHMpIHsKPiArCXNtb2tlID0ga2NhbGxvYyhuZW5naW5lcywgc2l6ZW9mKCpz bW9rZSksIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFzbW9rZSkgewo+ICAgCQlyZXQgPSAtRU5PTUVN Owo+ICAgCQlnb3RvIG91dF9maWxlOwo+ICAgCX0KPiAgIAo+IC0JbWVtc2V0KCZ0WzBdLCAwLCBz aXplb2YodFswXSkpOwo+IC0JdFswXS5yZXF1ZXN0X2FsbG9jID0gX19saXZlX3JlcXVlc3RfYWxs b2M7Cj4gLQl0WzBdLm5jb250ZXh0cyA9IDY0Owo+IC0JdFswXS5jb250ZXh0cyA9IGttYWxsb2Nf YXJyYXkodFswXS5uY29udGV4dHMsCj4gLQkJCQkgICAgICBzaXplb2YoKnRbMF0uY29udGV4dHMp LAo+IC0JCQkJICAgICAgR0ZQX0tFUk5FTCk7Cj4gLQlpZiAoIXRbMF0uY29udGV4dHMpIHsKPiAr CXRocmVhZHMgPSBrY2FsbG9jKG5jcHVzICogbmVuZ2luZXMsIHNpemVvZigqdGhyZWFkcyksIEdG UF9LRVJORUwpOwo+ICsJaWYgKCF0aHJlYWRzKSB7Cj4gKwkJcmV0ID0gLUVOT01FTTsKPiArCQln b3RvIG91dF9zbW9rZTsKPiArCX0KPiArCj4gKwlzbW9rZVswXS5yZXF1ZXN0X2FsbG9jID0gX19s aXZlX3JlcXVlc3RfYWxsb2M7Cj4gKwlzbW9rZVswXS5uY29udGV4dHMgPSA2NDsKPiArCXNtb2tl WzBdLmNvbnRleHRzID0ga21hbGxvY19hcnJheShzbW9rZVswXS5uY29udGV4dHMsCj4gKwkJCQkJ ICBzaXplb2YoKnNtb2tlWzBdLmNvbnRleHRzKSwKPiArCQkJCQkgIEdGUF9LRVJORUwpOwo+ICsJ aWYgKCFzbW9rZVswXS5jb250ZXh0cykgewo+ICAgCQlyZXQgPSAtRU5PTUVNOwo+ICAgCQlnb3Rv IG91dF90aHJlYWRzOwo+ICAgCX0KPiAgIAo+IC0JZm9yIChuID0gMDsgbiA8IHRbMF0ubmNvbnRl eHRzOyBuKyspIHsKPiAtCQl0WzBdLmNvbnRleHRzW25dID0gbGl2ZV9jb250ZXh0KGk5MTUsIGZp bGUpOwo+IC0JCWlmICghdFswXS5jb250ZXh0c1tuXSkgewo+ICsJZm9yIChuID0gMDsgbiA8IHNt b2tlWzBdLm5jb250ZXh0czsgbisrKSB7Cj4gKwkJc21va2VbMF0uY29udGV4dHNbbl0gPSBsaXZl X2NvbnRleHQoaTkxNSwgZmlsZSk7Cj4gKwkJaWYgKCFzbW9rZVswXS5jb250ZXh0c1tuXSkgewo+ ICAgCQkJcmV0ID0gLUVOT01FTTsKPiAgIAkJCWdvdG8gb3V0X2NvbnRleHRzOwo+ICAgCQl9Cj4g QEAgLTEyMjcsNDIgKzEyODQsNDYgQEAgc3RhdGljIGludCBsaXZlX2JyZWFkY3J1bWJzX3Ntb2tl dGVzdCh2b2lkICphcmcpCj4gICAJaWYgKHJldCkKPiAgIAkJZ290byBvdXRfY29udGV4dHM7Cj4g ICAKPiAtCWZvcl9lYWNoX2VuZ2luZShlbmdpbmUsIGk5MTUsIGlkKSB7Cj4gLQkJdFtpZF0gPSB0 WzBdOwo+IC0JCXRbaWRdLmVuZ2luZSA9IGVuZ2luZTsKPiAtCQl0W2lkXS5tYXhfYmF0Y2ggPSBt YXhfYmF0Y2hlcyh0WzBdLmNvbnRleHRzWzBdLCBlbmdpbmUpOwo+IC0JCWlmICh0W2lkXS5tYXhf YmF0Y2ggPCAwKSB7Cj4gLQkJCXJldCA9IHRbaWRdLm1heF9iYXRjaDsKPiArCWlkeCA9IDA7Cj4g Kwlmb3JfZWFjaF91YWJpX2VuZ2luZShlbmdpbmUsIGk5MTUpIHsKPiArCQlzbW9rZVtpZHhdID0g c21va2VbMF07Cj4gKwkJc21va2VbaWR4XS5lbmdpbmUgPSBlbmdpbmU7Cj4gKwkJc21va2VbaWR4 XS5tYXhfYmF0Y2ggPSBtYXhfYmF0Y2hlcyhzbW9rZVswXS5jb250ZXh0c1swXSwgZW5naW5lKTsK PiArCQlpZiAoc21va2VbaWR4XS5tYXhfYmF0Y2ggPCAwKSB7Cj4gKwkJCXJldCA9IHNtb2tlW2lk eF0ubWF4X2JhdGNoOwo+ICAgCQkJZ290byBvdXRfZmx1c2g7Cj4gICAJCX0KPiAgIAkJLyogT25l IHJpbmcgaW50ZXJsZWF2ZWQgYmV0d2VlbiByZXF1ZXN0cyBmcm9tIGFsbCBjcHVzICovCj4gLQkJ dFtpZF0ubWF4X2JhdGNoIC89IG51bV9vbmxpbmVfY3B1cygpICsgMTsKPiArCQlzbW9rZVtpZHhd Lm1heF9iYXRjaCAvPSBudW1fb25saW5lX2NwdXMoKSArIDE7Cj4gICAJCXByX2RlYnVnKCJMaW1p dGluZyBiYXRjaGVzIHRvICVkIHJlcXVlc3RzIG9uICVzXG4iLAo+IC0JCQkgdFtpZF0ubWF4X2Jh dGNoLCBlbmdpbmUtPm5hbWUpOwo+ICsJCQkgc21va2VbaWR4XS5tYXhfYmF0Y2gsIGVuZ2luZS0+ bmFtZSk7Cj4gICAKPiAgIAkJZm9yIChuID0gMDsgbiA8IG5jcHVzOyBuKyspIHsKPiAgIAkJCXN0 cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwo+ICAgCj4gICAJCQl0c2sgPSBrdGhyZWFkX3J1bihfX2ln dF9icmVhZGNydW1ic19zbW9rZXRlc3QsCj4gLQkJCQkJICAmdFtpZF0sICJpZ3QvJWQuJWQiLCBp ZCwgbik7Cj4gKwkJCQkJICAmc21va2VbaWR4XSwgImlndC8lZC4lZCIsIGlkeCwgbik7Cj4gICAJ CQlpZiAoSVNfRVJSKHRzaykpIHsKPiAgIAkJCQlyZXQgPSBQVFJfRVJSKHRzayk7Cj4gICAJCQkJ Z290byBvdXRfZmx1c2g7Cj4gICAJCQl9Cj4gICAKPiAgIAkJCWdldF90YXNrX3N0cnVjdCh0c2sp Owo+IC0JCQl0aHJlYWRzW2lkICogbmNwdXMgKyBuXSA9IHRzazsKPiArCQkJdGhyZWFkc1tpZHgg KiBuY3B1cyArIG5dID0gdHNrOwo+ICAgCQl9Cj4gKwo+ICsJCWlkeCsrOwo+ICAgCX0KPiAgIAo+ ICAgCW1zbGVlcChqaWZmaWVzX3RvX21zZWNzKGk5MTVfc2VsZnRlc3QudGltZW91dF9qaWZmaWVz KSk7Cj4gICAKPiAgIG91dF9mbHVzaDoKPiArCWlkeCA9IDA7Cj4gICAJbnVtX3dhaXRzID0gMDsK PiAgIAludW1fZmVuY2VzID0gMDsKPiAtCWZvcl9lYWNoX2VuZ2luZShlbmdpbmUsIGk5MTUsIGlk KSB7Cj4gKwlmb3JfZWFjaF91YWJpX2VuZ2luZShlbmdpbmUsIGk5MTUpIHsKPiAgIAkJZm9yIChu ID0gMDsgbiA8IG5jcHVzOyBuKyspIHsKPiAtCQkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSB0 aHJlYWRzW2lkICogbmNwdXMgKyBuXTsKPiArCQkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSB0 aHJlYWRzW2lkeCAqIG5jcHVzICsgbl07Cj4gICAJCQlpbnQgZXJyOwo+ICAgCj4gICAJCQlpZiAo IXRzaykKPiBAQCAtMTI3NSwxNyArMTMzNiwyMCBAQCBzdGF0aWMgaW50IGxpdmVfYnJlYWRjcnVt YnNfc21va2V0ZXN0KHZvaWQgKmFyZykKPiAgIAkJCXB1dF90YXNrX3N0cnVjdCh0c2spOwo+ICAg CQl9Cj4gICAKPiAtCQludW1fd2FpdHMgKz0gYXRvbWljX2xvbmdfcmVhZCgmdFtpZF0ubnVtX3dh aXRzKTsKPiAtCQludW1fZmVuY2VzICs9IGF0b21pY19sb25nX3JlYWQoJnRbaWRdLm51bV9mZW5j ZXMpOwo+ICsJCW51bV93YWl0cyArPSBhdG9taWNfbG9uZ19yZWFkKCZzbW9rZVtpZHhdLm51bV93 YWl0cyk7Cj4gKwkJbnVtX2ZlbmNlcyArPSBhdG9taWNfbG9uZ19yZWFkKCZzbW9rZVtpZHhdLm51 bV9mZW5jZXMpOwo+ICsJCWlkeCsrOwo+ICAgCX0KPiAgIAlwcl9pbmZvKCJDb21wbGV0ZWQgJWx1 IHdhaXRzIGZvciAlbHUgZmVuY2VzIGFjcm9zcyAlZCBlbmdpbmVzIGFuZCAlZCBjcHVzXG4iLAo+ ICAgCQludW1fd2FpdHMsIG51bV9mZW5jZXMsIFJVTlRJTUVfSU5GTyhpOTE1KS0+bnVtX2VuZ2lu ZXMsIG5jcHVzKTsKPiAgIAo+ICAgCXJldCA9IGlndF9saXZlX3Rlc3RfZW5kKCZsaXZlKSA/OiBy ZXQ7Cj4gICBvdXRfY29udGV4dHM6Cj4gLQlrZnJlZSh0WzBdLmNvbnRleHRzKTsKPiArCWtmcmVl KHNtb2tlWzBdLmNvbnRleHRzKTsKPiAgIG91dF90aHJlYWRzOgo+ICAgCWtmcmVlKHRocmVhZHMp Owo+ICtvdXRfc21va2U6Cj4gKwlrZnJlZShzbW9rZSk7Cj4gICBvdXRfZmlsZToKPiAgIAltb2Nr X2ZpbGVfZnJlZShpOTE1LCBmaWxlKTsKPiAgIG91dF9ycG06Cj4gCgpSZXN0IGxvb2tzIGZpbmUu CgpSZXZpZXdlZC1ieTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4K CldpbGwgd2UgZW5kIHVwIHdpdGggYSBmb3JfZWFjaF91YWJpX2VuZ2luZV9pZHggaXRlcmF0b3I/ IEFuZCBzdG9yaW5nIHRoZSAKbnVtX3VhYmlfZW5naW5lcyBpbiBzb21ld2hlcmU/CgpSZWdhcmRz LAoKVHZydGtvCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpo dHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeA==