From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lyude Paul Subject: Re: [RFC i-g-t 4/4] Add support for hotplug testing with the Chamelium Date: Mon, 14 Nov 2016 11:46:01 -0500 Message-ID: <1479141961.26438.0.camel@redhat.com> References: <1478563516-23568-1-git-send-email-lyude@redhat.com> <1478563516-23568-5-git-send-email-lyude@redhat.com> <20161114070558.xi65rcaljt4lehvz@phenom.ffwll.local> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by gabe.freedesktop.org (Postfix) with ESMTPS id 000346E426 for ; Mon, 14 Nov 2016 16:46:03 +0000 (UTC) In-Reply-To: <20161114070558.xi65rcaljt4lehvz@phenom.ffwll.local> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Daniel Vetter Cc: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org V2VsbCBJJ20gZGVmaW5pdGVseSBpbiBhZ3JlZW1lbnQgd2l0aCB0aGUgaWRlYSBvZiB1c2luZyBj b25maWcgZmlsZXMKZm9yIHRoaXMuIFdvdWxkIGJlIGEgbG90IG1vcmUgcmVsaWFibGUgdGhlbiB0 aGVzZSB0cmlja3MuIFdpbGwgcmVzcGluCndpdGggdGhpcyBhZGRlZAoKT24gTW9uLCAyMDE2LTEx LTE0IGF0IDA4OjA1ICswMTAwLCBEYW5pZWwgVmV0dGVyIHdyb3RlOgo+IE9uIE1vbiwgTm92IDA3 LCAyMDE2IGF0IDA3OjA1OjE2UE0gLTA1MDAsIEx5dWRlIHdyb3RlOgo+ID4gCj4gPiBGb3IgdGhl IHB1cnBvc2Ugb2YgdGVzdGluZyB0aGluZ3Mgc3VjaCBhcyBob3RwbHVnZ2luZyBhbmQgYmFkCj4g PiBtb25pdG9ycywKPiA+IHRoZSBDaHJvbWVPUyB0ZWFtIGVuZGVkIHVwIGRlc2lnbmluZyBhIG5l YXQgbGl0dGxlIGRldmljZSBrbm93biBhcwo+ID4gdGhlCj4gPiBDaGFtZWxpdW0uIE1vcmUgaW5m b3JtYXRpb24gb24gdGhpcyBjYW4gYmUgZm91bmQgaGVyZToKPiA+IAo+ID4gCWh0dHBzOi8vd3d3 LmNocm9taXVtLm9yZy9jaHJvbWl1bS1vcy90ZXN0aW5nL2NoYW1lbGl1bQo+ID4gCj4gPiBUaGlz IGFkZHMgc3VwcG9ydCBmb3IgYSBjb3VwbGUgb2YgdGhpbmdzIHRvIGludGVsLWdwdS10b29sczoK PiA+IMKgLSBpZ3QgbGlicmFyeSBmdW5jdGlvbnMgZm9yIGNvbm5lY3RpbmcgdG8gdWRldiBhbmQg bW9uaXRvcmluZyBpdAo+ID4gZm9yCj4gPiDCoMKgwqBob3RwbHVnIGV2ZW50cywgbG9vc2VseSBi YXNlZCBvZmYgb2YgdGhlIHVuZmluaXNoZWQgaG90cGx1Z2dpbmcKPiA+IMKgwqDCoGltcGxlbWVu dGF0aW9uIGluIHRlc3RkaXNwbGF5Cj4gPiDCoC0gTGlicmFyeSBmdW5jdGlvbnMgZm9yIGNvbnRy b2xsaW5nIHRoZSBjaGFtZWxpdW0gaW4gdGVzdHMgdXNpbmcKPiA+IMKgwqDCoHhtbHJwYy4gQSBj b3VwbGUgb2YgUlBDIGNhbGxzIHdlcmUgb21taXR0ZWQgaGVyZSwgbWFpbmx5IGJlY2F1c2UKPiA+ IHRoZXkKPiA+IMKgwqDCoGRpZG4ndCBzZWVtIHZlcnkgdXNlZnVsIGZvciBvdXIgbmVlZHMgb3Ig YmVjYXVzZSB0aGV5J3JlIGp1c3QKPiA+IHBsYWluCj4gPiDCoMKgwqBicm9rZW4KPiA+IMKgLSBB IHNldCBvZiBiYXNpYyB0ZXN0cyB1c2luZyB0aGUgY2hhbWVsaXVtLgo+ID4gCj4gPiBCZWNhdXNl IHRoZXJlJ3Mgbm8gc3VyZWZpcmUgd2F5IHRoYXQgSSBrbm93IG9mIHdoZXJlIHdlIGNhbiBtYXAK PiA+IHdoaWNoCj4gPiBjaGFtZWxpdW0gcG9ydCBiZWxvbmdzIHRvIHdoaWNoIHBvcnQgb24gdGhl IHN5c3RlbSBiZWluZyB0ZXN0ZWQgKHdlCj4gPiBjb3VsZCBqdXN0IHVzZSBob3RwbHVnZ2luZywg YnV0IHRoZW4gd2UnZCBiZSByZWx5aW5nIG9uIHNvbWV0aGluZwo+ID4gdGhhdAo+ID4gbWlnaHQg YmUgYnJva2VuIG9uIHRoZSBtYWNoaW5lIGFuZCBwb3RlbnRpYWxseSBnaXZlIGZhbHNlIHBvc2l0 aXZlcwo+ID4gZm9yCj4gPiBjZXJ0YWluIHRlc3RzKSwgbW9zdCBvZiB0aGUgY2hhbWVsaXVtIHRl c3RzIHdpbGwgZmlndXJlIG91dCB3aGV0aGVyCj4gPiBvcgo+ID4gbm90IGEgY29ubmVjdGlvbiBo YXBwZW5lZCBieSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIGNvbm5lY3RvcnMKPiA+IG1hdGNoaW5n Cj4gPiB0aGUgc3RhdHVzIHdlJ3JlIGxvb2tpbmcgZm9yIGJlZm9yZSBob3RwbHVnZ2luZyB3aXRo IHRoZSBjaGFtZWxpdW0sCj4gPiB2cy4KPiA+IGFmdGVyIGhvdHBsdWdnaW5nIGl0Lgo+ID4gCj4g PiBUZXN0cyB3aGljaCByZXF1aXJlIHRoYXQgd2Uga25vdyB3aGljaCBwb3J0IGJlbG9uZ3MgdG8g YSBjZXJ0YWluCj4gPiBwb3J0Cj4gPiAoc3VjaCBhcyBvbmVzIHdoZXJlIHdlIGFjdHVhbGx5IHBl cmZvcm0gYSBtb2Rlc2V0KSB3aWxsIHVucGx1ZyBhbGwKPiA+IG9mCj4gPiB0aGUgY2hhbWVsaXVt IHBvcnRzLCBwbHVnIHRoZSBkZXNpcmVkIHBvcnQsIHRoZW4gdXNlIHRoZSBmaXJzdCBEUk0KPiA+ IGNvbm5lY3RvciB3aXRoIHRoZSBkZXNpcmVkIGNvbm5lY3RvciB0eXBlIHRoYXQncyBtYXJrZWQg YXMKPiA+IGNvbm5lY3RlZC4gSW4KPiA+IG9yZGVyIHRvIGVuc3VyZSB3ZSBkb24ndCBlbmQgdXAg dXNpbmcgdGhlIHdyb25nIGNvbm5lY3RvciwgdGhlc2UKPiA+IHRlc3RzCj4gPiB3aWxsIHNraXAg aWYgdGhleSBmaW5kIGFueSBjb25uZWN0b3JzIHdpdGggdGhlIGRlc2lyZWQgdHlwZSBtYXJrZWQK PiA+IGFzCj4gPiBjb25uZWN0ZWQgYmVmb3JlIHBlcmZvcm1pbmcgdGhlIGhvdHBsdWcgb24gdGhl IGNoYW1lbGl1bS4KPiA+IAo+ID4gUnVubmluZyB0aGVzZSB0ZXN0cyByZXF1aXJlcyAob2YgY291 cnNlKSBhIHdvcmtpbmcgQ2hhbWVsaXVtLCBhbG9uZwo+ID4gd2l0aAo+ID4gdGhlIFJQQyBVUkwg Zm9yIHRoZSBjaGFtZWxpdW0gYmVpbmcgc3BlY2lmaWVkIGluIHRoZSBlbnZpcm9ubWVudAo+ID4g dmFyaWFibGUgQ0hBTUVMSVVNX0hPU1QuIElmIG5vIFVSTCBpcyBzcGVjaWZpZWQsIHRoZSB0ZXN0 cyB3aWxsCj4gPiBqdXN0Cj4gPiBza2lwIG9uIHRoZWlyIG93bi4gQXMgd2VsbCwgdGVzdHMgZm9y IGNvbm5lY3RvcnMgd2hpY2ggYXJlIG5vdAo+ID4gYWN0dWFsbHkKPiA+IHByZXNlbnQgb24gdGhl IHN5c3RlbSBvciB0aGUgY2hhbWVsaXVtIHdpbGwgc2tpcCBvbiB0aGVpciBvd24gYXMKPiA+IHdl bGwuCj4gPiAKPiA+IFNpZ25lZC1vZmYtYnk6IEx5dWRlIDxseXVkZUByZWRoYXQuY29tPgo+ID4g LS0tCj4gPiDCoGNvbmZpZ3VyZS5hY8KgwqDCoMKgwqDCoMKgwqDCoMKgwqB8wqDCoDEzICsKPiA+ IMKgbGliL01ha2VmaWxlLmFtwqDCoMKgwqDCoMKgwqDCoHzCoMKgMTAgKy0KPiA+IMKgbGliL2ln dC5owqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHzCoMKgwqAxICsKPiA+IMKgbGliL2lndF9j aGFtZWxpdW0uY8KgwqDCoMKgfCA2MjgKPiA+ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysKPiA+IMKgbGliL2lndF9jaGFtZWxpdW0uaMKgwqDCoMKgfMKg wqA3NyArKysrKysKPiAKPiBTaW5jZSB5b3UgdHlwZWQgdGhlc2UgbmljZSBndGtkb2NzLCBwbGVh c2UgYWxzbyBhZGQgaXQgdG8gdGhlIC54bWwgaW4KPiBkb2NzLyBhbmQgbWFrZSBzdXJlIGl0IGxv b2tzIGFsbCBnb29kICguL2F1dG9nZW4uc2ggLS1lbmFibGUtZ3RrLQo+IGRvY3MpLgo+IAo+IFdy dCB0aGUgYXBpIGl0c2VsZiBJIHRoaW5rIGFsbCB3ZSBuZWVkIGlzIGFncmVlbWVudCBmcm9tIFRv bWV1IHRoYXQKPiB0aGlzCj4gaXMgdGhlIHJpZ2h0IHRoaW5nIGZvciBoaXMgY2hhbWVsaXVtIHVz ZS1jYXNlcywgdG9vLiBBbmQgVG9tZXUgaGFzCj4gY29tbWl0Cj4gcmlnaHRzLCBzbyBjYW4gcHVz aCB0aGlzIHN0dWZmIGZvciB5b3UuCj4gLURhbmllbAo+IAo+IAo+ID4gCj4gPiDCoGxpYi9pZ3Rf a21zLmPCoMKgwqDCoMKgwqDCoMKgwqDCoHwgMTA3ICsrKysrKysrKwo+ID4gwqBsaWIvaWd0X2tt cy5owqDCoMKgwqDCoMKgwqDCoMKgwqB8wqDCoDEzICstCj4gPiDCoHNjcmlwdHMvcnVuLXRlc3Rz LnNowqDCoMKgfMKgwqDCoDQgKy0KPiA+IMKgdGVzdHMvTWFrZWZpbGUuYW3CoMKgwqDCoMKgwqB8 wqDCoMKgNSArLQo+ID4gwqB0ZXN0cy9NYWtlZmlsZS5zb3VyY2VzIHzCoMKgwqAxICsKPiA+IMKg dGVzdHMvY2hhbWVsaXVtLmPCoMKgwqDCoMKgwqB8IDU0OQo+ID4gKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrCj4gPiDCoDExIGZpbGVzIGNoYW5nZWQsIDE0MDMgaW5z ZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKPiA+IMKgY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9p Z3RfY2hhbWVsaXVtLmMKPiA+IMKgY3JlYXRlIG1vZGUgMTAwNjQ0IGxpYi9pZ3RfY2hhbWVsaXVt LmgKPiA+IMKgY3JlYXRlIG1vZGUgMTAwNjQ0IHRlc3RzL2NoYW1lbGl1bS5jCj4gPiAKPiA+IGRp ZmYgLS1naXQgYS9jb25maWd1cmUuYWMgYi9jb25maWd1cmUuYWMKPiA+IGluZGV4IDczNWNmZDUu Ljg4MTEzYjIgMTAwNjQ0Cj4gPiAtLS0gYS9jb25maWd1cmUuYWMKPiA+ICsrKyBiL2NvbmZpZ3Vy ZS5hYwo+ID4gQEAgLTI1OSw2ICsyNTksMTggQEAgaWYgdGVzdCAieCR3aXRoX2xpYnVud2luZCIg PSB4eWVzOyB0aGVuCj4gPiDCoAkJCcKgwqBBQ19NU0dfRVJST1IoW2xpYnVud2luZCBub3QgZm91 bmQuIFVzZQo+ID4gLS13aXRob3V0LWxpYnVud2luZCB0byBkaXNhYmxlIGxpYnVud2luZCBzdXBw b3J0Ll0pKQo+ID4gwqBmaQo+ID4gwqAKPiA+ICsjIGVuYWJsZSBzdXBwb3J0IGZvciB1c2luZyB0 aGUgY2hhbWVsaXVtCj4gPiArQUNfQVJHX0VOQUJMRShjaGFtZWxpdW0sCj4gPiArCcKgwqDCoMKg wqDCoEFTX0hFTFBfU1RSSU5HKFstLXdpdGhvdXQtY2hhbWVsaXVtXSwKPiA+ICsJCQnCoMKgwqDC oMKgW0J1aWxkIHRlc3RzIHdpdGhvdXQgY2hhbWVsaXVtCj4gPiBzdXBwb3J0XSksCj4gPiArCcKg wqDCoMKgwqDCoFtdLCBbd2l0aF9jaGFtZWxpdW09eWVzXSkKPiA+ICsKPiA+ICtBTV9DT05ESVRJ T05BTChIQVZFX0NIQU1FTElVTSwgW3Rlc3QgIngkd2l0aF9jaGFtZWxpdW0iID0geHllc10pCj4g PiAraWYgdGVzdCAieCR3aXRoX2NoYW1lbGl1bSIgPSB4eWVzOyB0aGVuCj4gPiArCUFDX0RFRklO RShIQVZFX0NIQU1FTElVTSwgMSwgW2NoYW1lbGl1bSBzdXBvcnRdKQo+ID4gKwlQS0dfQ0hFQ0tf TU9EVUxFUyhYTUxSUEMsIHhtbHJwY19jbGllbnQpCj4gPiArZmkKPiA+ICsKPiA+IMKgIyBlbmFi bGUgZGVidWcgc3ltYm9scwo+ID4gwqBBQ19BUkdfRU5BQkxFKGRlYnVnLAo+ID4gwqAJwqDCoMKg wqDCoMKgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1kZWJ1Z10sCj4gPiBAQCAtMzU2LDYgKzM2 OCw3IEBAIGVjaG8gIsKgwqDCoMKgwqDCoMKgQXNzZW1ibGVywqDCoMKgwqDCoMKgwqDCoMKgwqA6 Cj4gPiAke2VuYWJsZV9hc3NlbWJsZXJ9Igo+ID4gwqBlY2hvICLCoMKgwqDCoMKgwqDCoERlYnVn Z2VywqDCoMKgwqDCoMKgwqDCoMKgwqDCoDogJHtlbmFibGVfZGVidWdnZXJ9Igo+ID4gwqBlY2hv ICLCoMKgwqDCoMKgwqDCoE92ZXJsYXnCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA6IFg6ICR7ZW5h YmxlX292ZXJsYXlfeGxpYn0sIFh2Ogo+ID4gJHtlbmFibGVfb3ZlcmxheV94dmxpYn0iCj4gPiDC oGVjaG8gIsKgwqDCoMKgwqDCoMKgeDg2LXNwZWNpZmljIHRvb2xzIDogJHtidWlsZF94ODZ9Igo+ ID4gK2VjaG8gIsKgwqDCoMKgwqDCoMKgQ2hhbWVsaXVtIHN1cHBvcnTCoMKgOiAke3dpdGhfY2hh bWVsaXVtfSIKPiA+IMKgZWNobyAiIgo+ID4gwqBlY2hvICIg4oCiIEFQSS1Eb2N1bWVudGF0aW9u wqDCoMKgwqDCoMKgOiAke2VuYWJsZV9ndGtfZG9jfSIKPiA+IMKgZWNobyAiIOKAoiBGYWlsIG9u IHdhcm5pbmdzwqDCoMKgwqDCoMKgwqA6ICR7ZW5hYmxlX3dlcnJvcn0iCj4gPiBkaWZmIC0tZ2l0 IGEvbGliL01ha2VmaWxlLmFtIGIvbGliL01ha2VmaWxlLmFtCj4gPiBpbmRleCA0YzA4OTNkLi5h ZWFjNDNhIDEwMDY0NAo+ID4gLS0tIGEvbGliL01ha2VmaWxlLmFtCj4gPiArKysgYi9saWIvTWFr ZWZpbGUuYW0KPiA+IEBAIC0yMiw4ICsyMiwxNCBAQCBpZiAhSEFWRV9MSUJEUk1fSU5URUwKPiA+ IMKgwqDCoMKgwqDCoMKgwqDCoHN0dWJzL2RybS9pbnRlbF9idWZtZ3IuaAo+ID4gwqBlbmRpZgo+ ID4gwqAKPiA+ICtpZiBIQVZFX0NIQU1FTElVTQo+ID4gK8KgwqDCoMKgbGliaW50ZWxfdG9vbHNf bGFfU09VUkNFUyArPQlcCj4gPiArCWlndF9jaGFtZWxpdW0uYwkJCVwKPiA+ICsJaWd0X2NoYW1l bGl1bS5oCj4gPiArZW5kaWYKPiA+ICsKPiA+IMKgQU1fQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2Rp cikKPiA+IC1BTV9DRkxBR1MgPSAkKENXQVJORkxBR1MpICQoRFJNX0NGTEFHUykgJChQQ0lBQ0NF U1NfQ0ZMQUdTKQo+ID4gJChMSUJVTldJTkRfQ0ZMQUdTKSAkKERFQlVHX0NGTEFHUykgXAo+ID4g K0FNX0NGTEFHUyA9ICQoQ1dBUk5GTEFHUykgJChEUk1fQ0ZMQUdTKSAkKFBDSUFDQ0VTU19DRkxB R1MpCj4gPiAkKExJQlVOV0lORF9DRkxBR1MpICQoREVCVUdfQ0ZMQUdTKSAkKFhNTFJQQ19DRkxB R1MpICQoVURFVl9DRkxBR1MpCj4gPiBcCj4gPiDCoAnCoMKgwqDCoC1ESUdUX1NSQ0RJUj1cIiIk KGFic190b3Bfc3JjZGlyKS90ZXN0cyJcIiBcCj4gPiDCoAnCoMKgwqDCoC1ESUdUX0RBVEFESVI9 XCIiJChwa2dkYXRhZGlyKSJcIiBcCj4gPiDCoAnCoMKgwqDCoC1ESUdUX0xPR19ET01BSU49XCIi JChzdWJzdCBfLC0sJCopIlwiIFwKPiA+IEBAIC0zOCw1ICs0NCw3IEBAIGxpYmludGVsX3Rvb2xz X2xhX0xJQkFERCA9IFwKPiA+IMKgCSQoTElCVURFVl9MSUJTKSBcCj4gPiDCoAkkKExJQlVOV0lO RF9MSUJTKSBcCj4gPiDCoAkkKFRJTUVSX0xJQlMpIFwKPiA+ICsJJChYTUxSUENfTElCUykgXAo+ ID4gKwkkKFVERVZfTElCUykgXAo+ID4gwqAJLWxtCj4gPiDCoAo+ID4gZGlmZiAtLWdpdCBhL2xp Yi9pZ3QuaCBiL2xpYi9pZ3QuaAo+ID4gaW5kZXggZDc1MWYyNC4uMGVhMDNlNCAxMDA2NDQKPiA+ IC0tLSBhL2xpYi9pZ3QuaAo+ID4gKysrIGIvbGliL2lndC5oCj4gPiBAQCAtMzAsNiArMzAsNyBA QAo+ID4gwqAjaW5jbHVkZSAiaWd0X2F1eC5oIgo+ID4gwqAjaW5jbHVkZSAiaWd0X2NvcmUuaCIK PiA+IMKgI2luY2x1ZGUgImlndF9jb3JlLmgiCj4gPiArI2luY2x1ZGUgImlndF9jaGFtZWxpdW0u aCIKPiA+IMKgI2luY2x1ZGUgImlndF9kZWJ1Z2ZzLmgiCj4gPiDCoCNpbmNsdWRlICJpZ3RfZHJh dy5oIgo+ID4gwqAjaW5jbHVkZSAiaWd0X2ZiLmgiCj4gPiBkaWZmIC0tZ2l0IGEvbGliL2lndF9j aGFtZWxpdW0uYyBiL2xpYi9pZ3RfY2hhbWVsaXVtLmMKPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0 Cj4gPiBpbmRleCAwMDAwMDAwLi5hMjgxZWY2Cj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi9s aWIvaWd0X2NoYW1lbGl1bS5jCj4gPiBAQCAtMCwwICsxLDYyOCBAQAo+ID4gKy8qCj4gPiArICog Q29weXJpZ2h0IMKpIDIwMTYgUmVkIEhhdCBJbmMuCj4gPiArICoKPiA+ICsgKiBQZXJtaXNzaW9u IGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgo+ID4gb2J0 YWluaW5nIGEKPiA+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9j dW1lbnRhdGlvbiBmaWxlcyAodGhlCj4gPiAiU29mdHdhcmUiKSwKPiA+ICsgKiB0byBkZWFsIGlu IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dAo+ID4g bGltaXRhdGlvbgo+ID4gKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdl LCBwdWJsaXNoLCBkaXN0cmlidXRlLAo+ID4gc3VibGljZW5zZSwKPiA+ICsgKiBhbmQvb3Igc2Vs bCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8KPiA+IHdo b20gdGhlCj4gPiArICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRv IHRoZSBmb2xsb3dpbmcKPiA+IGNvbmRpdGlvbnM6Cj4gPiArICoKPiA+ICsgKiBUaGUgYWJvdmUg Y29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQo+ID4gKGluY2x1ZGlu ZyB0aGUgbmV4dAo+ID4gKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNv cGllcyBvciBzdWJzdGFudGlhbAo+ID4gcG9ydGlvbnMgb2YgdGhlCj4gPiArICogU29mdHdhcmUu Cj4gPiArICoKPiA+ICsgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9V VCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKPiA+IEVYUFJFU1MgT1IKPiA+ICsgKiBJTVBMSUVELCBJ TkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gPiBNRVJDSEFO VEFCSUxJVFksCj4gPiArICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5P TklORlJJTkdFTUVOVC7CoMKgSU4gTk8KPiA+IEVWRU5UIFNIQUxMCj4gPiArICogVEhFIEFVVEhP UlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCj4gPiBEQU1B R0VTIE9SIE9USEVSCj4gPiArICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBD T05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCj4gPiBBUklTSU5HCj4gPiArICogRlJPTSwgT1VU IE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgo+ID4g T1RIRVIgREVBTElOR1MKPiA+ICsgKiBJTiBUSEUgU09GVFdBUkUuCj4gPiArICoKPiA+ICsgKiBB dXRob3JzOgo+ID4gKyAqwqDCoEx5dWRlIFBhdWwgPGx5dWRlQHJlZGhhdC5jb20+Cj4gPiArICov Cj4gPiArCj4gPiArI2luY2x1ZGUgImNvbmZpZy5oIgo+ID4gKwo+ID4gKyNpbmNsdWRlIDxzdHJp bmcuaD4KPiA+ICsjaW5jbHVkZSA8ZXJybm8uaD4KPiA+ICsjaW5jbHVkZSA8eG1scnBjLWMvYmFz ZS5oPgo+ID4gKyNpbmNsdWRlIDx4bWxycGMtYy9jbGllbnQuaD4KPiA+ICsKPiA+ICsjaW5jbHVk ZSAiaWd0LmgiCj4gPiArCj4gPiArI2RlZmluZSBjaGVja19ycGMoKSBcCj4gPiArCWlndF9hc3Nl cnRfZighZW52LmZhdWx0X29jY3VycmVkLCAiQ2hhbWVsaXVtIFJQQyBjYWxsCj4gPiBmYWlsZWQ6 ICVzXG4iLCBcCj4gPiArCQnCoMKgwqDCoMKgZW52LmZhdWx0X3N0cmluZyk7Cj4gPiArCj4gPiAr LyoqCj4gPiArICogY2hhbWVsaXVtX3BvcnRzOgo+ID4gKyAqCj4gPiArICogQ29udGFpbnMgaW5m b3JtYXRpb24gb24gYWxsIG9mIHRoZSBwb3J0cyB0aGF0IGFyZSBwaHlzaWNhbGx5Cj4gPiBjb25u ZWN0ZWQgZnJvbQo+ID4gKyAqIHRoZSBjaGFtZWxpdW0gdG8gdGhlIHN5c3RlbS4gVGhpcyBpbmZv cm1hdGlvbiBpcyBpbml0aWFsaXplZAo+ID4gd2hlbgo+ID4gKyAqICNjaGFtZWxpdW1faW5pdCBp cyBjYWxsZWQuCj4gPiArICovCj4gPiArc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpjaGFtZWxpdW1f cG9ydHM7Cj4gPiArCj4gPiArLyoqCj4gPiArICogY2hhbWVsaXVtX3BvcnRfY291bnQ6Cj4gPiAr ICoKPiA+ICsgKiBIb3cgbWFueSBwb3J0cyBhcmUgcGh5c2ljYWxseSBjb25uZWN0ZWQgZnJvbSB0 aGUgY2hhbWVsaXVtIHRvCj4gPiB0aGUgc3lzdGVtLgo+ID4gKyAqLwo+ID4gK2ludCBjaGFtZWxp dW1fcG9ydF9jb3VudDsKPiA+ICsKPiA+ICtzdGF0aWMgY29uc3QgY2hhciAqY2hhbWVsaXVtX3Vy bDsKPiA+ICtzdGF0aWMgeG1scnBjX2VudiBlbnY7Cj4gPiArCj4gPiArc3RydWN0IGNoYW1lbGl1 bV9lZGlkIHsKPiA+ICsJaW50IGlkOwo+ID4gKwlzdHJ1Y3QgaWd0X2xpc3QgbGluazsKPiA+ICt9 Owo+ID4gK3N0cnVjdCBjaGFtZWxpdW1fZWRpZCAqYWxsb2NhdGVkX2VkaWRzOwo+ID4gKwo+ID4g Ky8qKgo+ID4gKyAqIGNoYW1lbGl1bV9wbHVnOgo+ID4gKyAqIEBpZDogVGhlIElEIG9mIHRoZSBw b3J0IG9uIHRoZSBjaGFtZWxpdW0gdG8gcGx1ZyBpbgo+ID4gKyAqCj4gPiArICogU2ltdWxhdGUg YSBkaXNwbGF5IGNvbm5lY3RvciBiZWluZyBwbHVnZ2VkIGludG8gdGhlIHN5c3RlbQo+ID4gdXNp bmcgdGhlCj4gPiArICogY2hhbWVsaXVtLgo+ID4gKyAqLwo+ID4gK3ZvaWQgY2hhbWVsaXVtX3Bs dWcoaW50IGlkKQo+ID4gK3sKPiA+ICsJeG1scnBjX3ZhbHVlICpyZXM7Cj4gPiArCj4gPiArCWln dF9kZWJ1ZygiUGx1Z2dpbmcgcG9ydCAlZFxuIiwgaWQpOwo+ID4gKwlyZXMgPSB4bWxycGNfY2xp ZW50X2NhbGwoJmVudiwgY2hhbWVsaXVtX3VybCwgIlBsdWciLAo+ID4gIihpKSIsIGlkKTsKPiA+ ICsJY2hlY2tfcnBjKCk7Cj4gPiArCj4gPiArCXhtbHJwY19ERUNSRUYocmVzKTsKPiA+ICt9Cj4g PiArCj4gPiArLyoqCj4gPiArICogY2hhbWVsaXVtX3VucGx1ZzoKPiA+ICsgKiBAaWQ6IFRoZSBJ RCBvZiB0aGUgcG9ydCBvbiB0aGUgY2hhbWVsaXVtIHRvIHVucGx1Zwo+ID4gKyAqCj4gPiArICog U2ltdWxhdGUgYSBkaXNwbGF5IGNvbm5lY3RvciBiZWluZyB1bnBsdWdnZWQgZnJvbSB0aGUgc3lz dGVtCj4gPiB1c2luZyB0aGUKPiA+ICsgKiBjaGFtZWxpdW0uCj4gPiArICovCj4gPiArdm9pZCBj aGFtZWxpdW1fdW5wbHVnKGludCBpZCkKPiA+ICt7Cj4gPiArCXhtbHJwY192YWx1ZSAqcmVzOwo+ ID4gKwo+ID4gKwlpZ3RfZGVidWcoIlVucGx1Z2dpbmcgcG9ydCAlZFxuIiwgaWQpOwo+ID4gKwly ZXMgPSB4bWxycGNfY2xpZW50X2NhbGwoJmVudiwgY2hhbWVsaXVtX3VybCwgIlVucGx1ZyIsCj4g PiAiKGkpIiwgaWQpOwo+ID4gKwljaGVja19ycGMoKTsKPiA+ICsKPiA+ICsJeG1scnBjX0RFQ1JF RihyZXMpOwo+ID4gK30KPiA+ICsKPiA+ICsvKioKPiA+ICsgKiBjaGFtZWxpdW1faXNfcGx1Z2dl ZDoKPiA+ICsgKiBAaWQ6IFRoZSBJRCBvZiB0aGUgcG9ydCBvbiB0aGUgY2hhbWVsaXVtIHRvIGNo ZWNrIHRoZSBzdGF0dXMgb2YKPiA+ICsgKgo+ID4gKyAqIENoZWNrIHdoZXRoZXIgb3Igbm90IHRo ZSBnaXZlbiBwb3J0IGhhcyBiZWVuIHBsdWdnZWQgaW50byB0aGUKPiA+IHN5c3RlbSB1c2luZwo+ ID4gKyAqICNjaGFtZWxpdW1fcGx1Zy4KPiA+ICsgKgo+ID4gKyAqIFJldHVybnM6IFRydWUgaWYg dGhlIGNvbm5lY3RvciBpcyBzZXQgdG8gcGx1Z2dlZCBpbiwgZmFsc2UKPiA+IG90aGVyd2lzZS4K PiA+ICsgKi8KPiA+ICtib29sIGNoYW1lbGl1bV9pc19wbHVnZ2VkKGludCBpZCkKPiA+ICt7Cj4g PiArCXhtbHJwY192YWx1ZSAqcmVzOwo+ID4gKwl4bWxycGNfYm9vbCBpc19wbHVnZ2VkOwo+ID4g Kwo+ID4gKwlyZXMgPSB4bWxycGNfY2xpZW50X2NhbGwoJmVudiwgY2hhbWVsaXVtX3VybCwgIklz UGx1Z2dlZCIsCj4gPiAiKGkpIiwgaWQpOwo+ID4gKwljaGVja19ycGMoKTsKPiA+ICsKPiA+ICsJ eG1scnBjX3JlYWRfYm9vbCgmZW52LCByZXMsICZpc19wbHVnZ2VkKTsKPiA+ICsJeG1scnBjX0RF Q1JFRihyZXMpOwo+ID4gKwo+ID4gKwlyZXR1cm4gaXNfcGx1Z2dlZDsKPiA+ICt9Cj4gPiArCj4g PiArLyoqCj4gPiArICogY2hhbWVsaXVtX3BvcnRfd2FpdF92aWRlb19pbnB1dF9zdGFibGU6Cj4g PiArICogQGlkOiBUaGUgSUQgb2YgdGhlIHBvcnQgb24gdGhlIGNoYW1lbGl1bSB0byBjaGVjayB0 aGUgc3RhdHVzIG9mCj4gPiArICogQHRpbWVvdXRfc2VjczogSG93IGxvbmcgdG8gd2FpdCBmb3Ig YSB2aWRlbyBzaWduYWwgdG8gYXBwZWFyCj4gPiBiZWZvcmUgdGltaW5nCj4gPiArICogb3V0Cj4g PiArICoKPiA+ICsgKiBXYWl0cyBmb3IgYSB2aWRlbyBzaWduYWwgdG8gYXBwZWFyIG9uIHRoZSBn aXZlbiBwb3J0LiBUaGlzIGlzCj4gPiB1c2VmdWwgZm9yCj4gPiArICogY2hlY2tpbmcgd2hldGhl ciBvciBub3Qgd2UndmUgc2V0dXAgYSBtb25pdG9yIGNvcnJlY3RseS4KPiA+ICsgKgo+ID4gKyAq IFJldHVybnM6IFRydWUgaWYgYSB2aWRlbyBzaWduYWwgd2FzIGRldGVjdGVkLCBmYWxzZSBpZiB3 ZSB0aW1lZAo+ID4gb3V0Cj4gPiArICovCj4gPiArYm9vbCBjaGFtZWxpdW1fcG9ydF93YWl0X3Zp ZGVvX2lucHV0X3N0YWJsZShpbnQgaWQsIGludAo+ID4gdGltZW91dF9zZWNzKQo+ID4gK3sKPiA+ ICsJeG1scnBjX3ZhbHVlICpyZXM7Cj4gPiArCXhtbHJwY19ib29sIGlzX29uOwo+ID4gKwo+ID4g KwlpZ3RfZGVidWcoIldhaXRpbmcgZm9yIHZpZGVvIGlucHV0IHRvIHN0YWJhbGl6ZSBvbiBwb3J0 Cj4gPiAlZFxuIiwgaWQpOwo+ID4gKwo+ID4gKwlyZXMgPSB4bWxycGNfY2xpZW50X2NhbGwoJmVu diwgY2hhbWVsaXVtX3VybCwKPiA+ICJXYWl0VmlkZW9JbnB1dFN0YWJsZSIsCj4gPiArCQkJCcKg IihpaSkiLCBpZCwgdGltZW91dF9zZWNzKTsKPiA+ICsJY2hlY2tfcnBjKCk7Cj4gPiArCj4gPiAr CXhtbHJwY19yZWFkX2Jvb2woJmVudiwgcmVzLCAmaXNfb24pOwo+ID4gKwl4bWxycGNfREVDUkVG KHJlcyk7Cj4gPiArCj4gPiArCXJldHVybiBpc19vbjsKPiA+ICt9Cj4gPiArCj4gPiArLyoqCj4g PiArICogY2hhbWVsaXVtX2ZpcmVfaHBkX3B1bHNlczoKPiA+ICsgKiBAaWQ6IFRoZSBJRCBvZiB0 aGUgcG9ydCB0byBmaXJlIGhvdHBsdWcgcHVsc2VzIG9uCj4gPiArICogQHdpZHRoX21zZWM6IEhv dyBsb25nIGVhY2ggcHVsc2Ugc2hvdWxkIGxhc3QKPiA+ICsgKiBAY291bnQ6IFRoZSBudW1iZXIg b2YgcHVsc2VzIHRvIHNlbmQKPiA+ICsgKgo+ID4gKyAqIEEgY29udmllbmVuY2UgZnVuY3Rpb24g Zm9yIHNlbmRpbmcgbXVsdGlwbGUgaG90cGx1ZyBwdWxzZXMgdG8KPiA+IHRoZSBzeXN0ZW0uCj4g PiArICogVGhlIHB1bHNlcyBzdGFydCBhdCBsb3cgKGUuZy4gY29ubmVjdG9yIGlzIGRpc2Nvbm5l Y3RlZCksIGFuZAo+ID4gdGhlbiBhbHRlcm5hdGUKPiA+ICsgKiBmcm9tIGhpZ2ggKGUuZy4gY29u bmVjdG9yIGlzIHBsdWdnZWQgaW4pIHRvIGxvdy4gVGhpcyBpcyB0aGUKPiA+IGVxdWl2YWxlbnQg b2YKPiA+ICsgKiByZXBlYXRlZGx5IGNhbGxpbmcgI2NoYW1lbGl1bV9wbHVnIGFuZCAjY2hhbWVs aXVtX3VucGx1ZywKPiA+IHdhaXRpbmcKPiA+ICsgKiBAd2lkdGhfbXNlYyBiZXR3ZWVuIGVhY2gg Y2FsbC4KPiA+ICsgKgo+ID4gKyAqIElmIEBjb3VudCBpcyBldmVuLCB0aGUgbGFzdCBwdWxzZSBz ZW50IHdpbGwgYmUgaGlnaCwgYW5kIGlmCj4gPiBpdCdzIG9kZCB0aGVuIGl0Cj4gPiArICogd2ls bCBiZSBsb3cuIFJlc2V0dGluZyB0aGUgSFBEIGxpbmUgYmFjayB0byBpdCdzIHByZXZpb3VzCj4g PiBzdGF0ZSwgaWYgZGVzaXJlZCwKPiA+ICsgKiBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhl IGNhbGxlci4KPiA+ICsgKi8KPiA+ICt2b2lkIGNoYW1lbGl1bV9maXJlX2hwZF9wdWxzZXMoaW50 IHBvcnQsIGludCB3aWR0aF9tc2VjLCBpbnQKPiA+IGNvdW50KQo+ID4gK3sKPiA+ICsJeG1scnBj X3ZhbHVlICpwdWxzZV93aWR0aHMgPSB4bWxycGNfYXJyYXlfbmV3KCZlbnYpLAo+ID4gKwkJwqDC oMKgwqDCoCp3aWR0aCA9IHhtbHJwY19pbnRfbmV3KCZlbnYsIHdpZHRoX21zZWMpLAo+ID4gKnJl czsKPiA+ICsJaW50IGk7Cj4gPiArCj4gPiArCWlndF9kZWJ1ZygiRmlyaW5nICVkIEhQRCBwdWxz ZXMgd2l0aCB3aWR0aCBvZiAlZCBtc2VjIG9uCj4gPiBwb3J0ICVkXG4iLAo+ID4gKwkJwqDCoGNv dW50LCB3aWR0aF9tc2VjLCBwb3J0KTsKPiA+ICsKPiA+ICsJZm9yIChpID0gMDsgaSA8IGNvdW50 OyBpKyspCj4gPiArCQl4bWxycGNfYXJyYXlfYXBwZW5kX2l0ZW0oJmVudiwgcHVsc2Vfd2lkdGhz LAo+ID4gd2lkdGgpOwo+ID4gKwo+ID4gKwlyZXMgPSB4bWxycGNfY2xpZW50X2NhbGwoJmVudiwg Y2hhbWVsaXVtX3VybCwKPiA+ICJGaXJlTWl4ZWRIcGRQdWxzZXMiLAo+ID4gKwkJCQnCoCIoaUEp IiwgcG9ydCwgcHVsc2Vfd2lkdGhzKTsKPiA+ICsJY2hlY2tfcnBjKCk7Cj4gPiArCj4gPiArCXht bHJwY19ERUNSRUYocmVzKTsKPiA+ICsJeG1scnBjX0RFQ1JFRih3aWR0aCk7Cj4gPiArCXhtbHJw Y19ERUNSRUYocHVsc2Vfd2lkdGhzKTsKPiA+ICt9Cj4gPiArCj4gPiArLyoqCj4gPiArICogY2hh bWVsaXVtX2ZpcmVfbWl4ZWRfaHBkX3B1bHNlczoKPiA+ICsgKiBAaWQ6IFRoZSBJRCBvZiB0aGUg cG9ydCB0byBmaXJlIGhvdHBsdWcgcHVsc2VzIG9uCj4gPiArICogQC4uLjogVGhlIGxlbmd0aCBv ZiBlYWNoIHB1bHNlIGluIG1pbGxpc2Vjb25kcywgdGVybWluYXRlZCB3aXRoCj4gPiBhICUwCj4g PiArICoKPiA+ICsgKiBEb2VzIHRoZSBzYW1lIHRoaW5nIGFzICNjaGFtZWxpdW1fZmlyZV9ocGRf cHVsc2VzLCBidXQgYWxsb3dzCj4gPiB0aGUgY2FsbGVyIHRvCj4gPiArICogc3BlY2lmeSB0aGUg bGVuZ3RoIG9mIGVhY2ggaW5kaXZpZHVhbCBwdWxzZS4KPiA+ICsgKi8KPiA+ICt2b2lkIGNoYW1l bGl1bV9maXJlX21peGVkX2hwZF9wdWxzZXMoaW50IGlkLCAuLi4pCj4gPiArewo+ID4gKwl2YV9s aXN0IGFyZ3M7Cj4gPiArCXhtbHJwY192YWx1ZSAqcHVsc2Vfd2lkdGhzID0geG1scnBjX2FycmF5 X25ldygmZW52KSwKPiA+ICp3aWR0aCwgKnJlczsKPiA+ICsJaW50IGFyZzsKPiA+ICsKPiA+ICsJ aWd0X2RlYnVnKCJGaXJpbmcgbWl4ZWQgSFBEIHB1bHNlcyBvbiBwb3J0ICVkXG4iLCBpZCk7Cj4g PiArCj4gPiArCXZhX3N0YXJ0KGFyZ3MsIGlkKTsKPiA+ICsJZm9yIChhcmcgPSB2YV9hcmcoYXJn cywgaW50KTsgYXJnOyBhcmcgPSB2YV9hcmcoYXJncywKPiA+IGludCkpIHsKPiA+ICsJCXdpZHRo ID0geG1scnBjX2ludF9uZXcoJmVudiwgYXJnKTsKPiA+ICsJCXhtbHJwY19hcnJheV9hcHBlbmRf aXRlbSgmZW52LCBwdWxzZV93aWR0aHMsCj4gPiB3aWR0aCk7Cj4gPiArCQl4bWxycGNfREVDUkVG KHdpZHRoKTsKPiA+ICsJfQo+ID4gKwl2YV9lbmQoYXJncyk7Cj4gPiArCj4gPiArCXJlcyA9IHht bHJwY19jbGllbnRfY2FsbCgmZW52LCBjaGFtZWxpdW1fdXJsLAo+ID4gIkZpcmVNaXhlZEhwZFB1 bHNlcyIsCj4gPiArCQkJCcKgIihpQSkiLCBpZCwgcHVsc2Vfd2lkdGhzKTsKPiA+ICsJY2hlY2tf cnBjKCk7Cj4gPiArCXhtbHJwY19ERUNSRUYocmVzKTsKPiA+ICsKPiA+ICsJeG1scnBjX0RFQ1JF RihwdWxzZV93aWR0aHMpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBhc3luY19ycGNf aGFuZGxlcihjb25zdCBjaGFyICpzZXJ2ZXJfdXJsLCBjb25zdCBjaGFyCj4gPiAqbWV0aG9kX25h bWUsCj4gPiArCQkJwqDCoMKgwqDCoMKgeG1scnBjX3ZhbHVlICpwYXJhbV9hcnJheSwgdm9pZAo+ ID4gKnVzZXJfZGF0YSwKPiA+ICsJCQnCoMKgwqDCoMKgwqB4bWxycGNfZW52ICpmYXVsdCwgeG1s cnBjX3ZhbHVlCj4gPiAqcmVzdWx0KQo+ID4gK3sKPiA+ICsJLyogV2UgZG9uJ3QgY2FyZSBhYm91 dCB0aGUgcmVzcG9uc2VzICovCj4gPiArfQo+ID4gKwo+ID4gKy8qKgo+ID4gKyAqIGNoYW1lbGl1 bV9hc3luY19ocGRfcHVsc2Vfc3RhcnQ6Cj4gPiArICogQGlkOiBUaGUgSUQgb2YgdGhlIHBvcnQg dG8gZmlyZSBhIGhvdHBsdWcgcHVsc2Ugb24KPiA+ICsgKiBAaGlnaDogV2hldGhlciB0byBmaXJl IGEgaGlnaCBwdWxzZSAoZS5nLiBzaW11bGF0ZSBhIGNvbm5lY3QpLAo+ID4gb3IgYSBsb3cKPiA+ ICsgKiBwdWxzZSAoZS5nLiBzaW11bGF0ZSBhIGRpc2Nvbm5lY3QpCj4gPiArICogQGRlbGF5X3Nl Y3M6IEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHNlbmRpbmcgdGhlIEhQRCBwdWxzZS4KPiA+ICsg Kgo+ID4gKyAqIEluc3RydWN0cyB0aGUgY2hhbWVsaXVtIHRvIHNlbmQgYW4gaHBkIHB1bHNlIGFm dGVyIEBkZWxheV9zZWNzCj4gPiBzZWNvbmRzIGhhdmUKPiA+ICsgKiBwYXNzZWQsIHdpdGhvdXQg d2FpdGluZyBmb3IgdGhlIGNoYW1lbGl1bSB0byBmaW5pc2guIFRoaXMgaXMKPiA+IHVzZWZ1bCBm b3IKPiA+ICsgKiB0ZXN0aW5nIHRoaW5ncyBzdWNoIGFzIGhwZCBhZnRlciBhIHN1c3BlbmQvcmVz dW1lIGN5Y2xlLCBzaW5jZQo+ID4gd2UgY2FuJ3QgdGVsbAo+ID4gKyAqIHRoZSBjaGFtZWxpdW0g dG8gc2VuZCBhIGhvdHBsdWcgYXQgdGhlIHNhbWUgdGltZSB0aGF0IG91cgo+ID4gc3lzdGVtIGlz Cj4gPiArICogc3VzcGVuZGVkLgo+ID4gKyAqCj4gPiArICogSXQgaXMgcmVxdWlyZWQgdGhhdCB0 aGUgdXNlciBldmVudHVhbGx5IGNhbGwKPiA+ICsgKiAjY2hhbWVsaXVtX2FzeW5jX2hwZF9wdWxz ZV9maW5pc2gsIHRvIGNsZWFuIHVwIHRoZSBsZWZ0b3Zlcgo+ID4gWE1MLVJQQwo+ID4gKyAqIHJl c3BvbnNlcyBmcm9tIHRoZSBjaGFtZWxpdW0uCj4gPiArICovCj4gPiArdm9pZCBjaGFtZWxpdW1f YXN5bmNfaHBkX3B1bHNlX3N0YXJ0KGludCBpZCwgYm9vbCBoaWdoLCBpbnQKPiA+IGRlbGF5X3Nl Y3MpCj4gPiArewo+ID4gKwl4bWxycGNfdmFsdWUgKnB1bHNlX3dpZHRocyA9IHhtbHJwY19hcnJh eV9uZXcoJmVudiksCj4gPiAqd2lkdGg7Cj4gPiArCj4gPiArCS8qIFRPRE86IEFjdHVhbGx5IGlt cGxlbWVudCBzb21ldGhpbmcgaW4gdGhlIGNoYW1lbGVvbgo+ID4gc2VydmVyIHRvIGFsbG93Cj4g PiArCcKgKiBmb3IgZGVsYXllZCBhY3Rpb25zIHN1Y2ggYXMgaG90cGx1Z3MuIFRoaXMgd291bGQg d29yayBhCj4gPiBiaXQgYmV0dGVyCj4gPiArCcKgKiBhbmQgYWxsb3cgdXMgdG8gdGVzdCBzdXNw ZW5kL3Jlc3VtZSBvbiBwb3J0cyB3aXRob3V0Cj4gPiBocGQgbGlrZSBWR0EKPiA+ICsJwqAqLwo+ ID4gKwo+ID4gKwlpZ3RfZGVidWcoIlNlbmRpbmcgSFBEIHB1bHNlICglcykgb24gcG9ydCAlZCB3 aXRoICVkCj4gPiBzZWNvbmQgZGVsYXlcbiIsCj4gPiArCQnCoMKgaGlnaCA/ICJoaWdoLT5sb3ci IDogImxvdy0+aGlnaCIsIGlkLAo+ID4gZGVsYXlfc2Vjcyk7Cj4gPiArCj4gPiArCS8qIElmIHdl J3JlIHN0YXJ0aW5nIGF0IGhpZ2gsIG1ha2UgdGhlIGZpcnN0IHB1bHNlIHdpZHRoIDAKPiA+IHNv IHdlIGtlZXAKPiA+ICsJwqAqIHRoZSBwb3J0IGNvbm5lY3RlZCAqLwo+ID4gKwlpZiAoaGlnaCkg ewo+ID4gKwkJd2lkdGggPSB4bWxycGNfaW50X25ldygmZW52LCAwKTsKPiA+ICsJCXhtbHJwY19h cnJheV9hcHBlbmRfaXRlbSgmZW52LCBwdWxzZV93aWR0aHMsCj4gPiB3aWR0aCk7Cj4gPiArCQl4 bWxycGNfREVDUkVGKHdpZHRoKTsKPiA+ICsJfQo+ID4gKwo+ID4gKwl3aWR0aCA9IHhtbHJwY19p bnRfbmV3KCZlbnYsIGRlbGF5X3NlY3MgKiAxMDAwKTsKPiA+ICsJeG1scnBjX2FycmF5X2FwcGVu ZF9pdGVtKCZlbnYsIHB1bHNlX3dpZHRocywgd2lkdGgpOwo+ID4gKwl4bWxycGNfREVDUkVGKHdp ZHRoKTsKPiA+ICsKPiA+ICsJeG1scnBjX2NsaWVudF9jYWxsX2FzeW5jaChjaGFtZWxpdW1fdXJs LAo+ID4gIkZpcmVNaXhlZEhwZFB1bHNlcyIsCj4gPiArCQkJCcKgwqBhc3luY19ycGNfaGFuZGxl ciwgTlVMTCwgIihpQSkiLAo+ID4gKwkJCQnCoMKgaWQsIHB1bHNlX3dpZHRocyk7Cj4gPiArCXht bHJwY19ERUNSRUYocHVsc2Vfd2lkdGhzKTsKPiA+ICt9Cj4gPiArCj4gPiArLyoqCj4gPiArICog Y2hhbWVsaXVtX2FzeW5jX2hwZF9wdWxzZV9maW5pc2g6Cj4gPiArICoKPiA+ICsgKiBXYWl0cyBm b3IgYW55IGFzeW5jaHJvbm91cyBSUEMgc3RhcnRlZCBieQo+ID4gI2NoYW1lbGl1bV9hc3luY19o cGRfcHVsc2Vfc3RhcnQKPiA+ICsgKiB0byBjb21wbGV0ZSwgYW5kIHRoZW4gY2xlYW5zIHVwIGFu eSBsZWZ0b3ZlciByZXNwb25zZXMgZnJvbSB0aGUKPiA+IGNoYW1lbGl1bS4KPiA+ICsgKiBJZiBh bGwgb2YgdGhlIFJQQyBjYWxscyBoYXZlIGFscmVhZHkgY29tcGxldGVkLCB0aGlzIGZ1bmN0aW9u Cj4gPiByZXR1cm5zCj4gPiArICogaW1tZWRpYXRlbHkuCj4gPiArICovCj4gPiArdm9pZCBjaGFt ZWxpdW1fYXN5bmNfaHBkX3B1bHNlX2ZpbmlzaCh2b2lkKQo+ID4gK3sKPiA+ICsJeG1scnBjX2Ns aWVudF9ldmVudF9sb29wX2ZpbmlzaF9hc3luY2goKTsKPiA+ICt9Cj4gPiArCj4gPiArLyoqCj4g PiArICogY2hhbWVsaXVtX25ld19lZGlkOgo+ID4gKyAqIEBlZGlkOiBUaGUgZWRpZCBibG9iIHRv IHVwbG9hZCB0byB0aGUgY2hhbWVsaXVtCj4gPiArICoKPiA+ICsgKiBVcGxvYWRzIGFuZCByZWdp c3RlcnMgYSBuZXcgRURJRCB3aXRoIHRoZSBjaGFtZWxpdW0uIFRoZSBFRElECj4gPiB3aWxsIGJl Cj4gPiArICogZGVzdHJveWVkIGF1dG9tYXRpY2FsbHkgd2hlbiAjY2hhbWVsaXVtX2RlaW5pdCBp cyBjYWxsZWQuCj4gPiArICoKPiA+ICsgKiBSZXR1cm5zOiBUaGUgSUQgb2YgdGhlIEVESUQgdXBs b2FkZWQgdG8gdGhlIGNoYW1lbGl1bS4KPiA+ICsgKi8KPiA+ICtpbnQgY2hhbWVsaXVtX25ld19l ZGlkKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVkaWQpCj4gPiArewo+ID4gKwl4bWxycGNfdmFsdWUg KnJlczsKPiA+ICsJc3RydWN0IGNoYW1lbGl1bV9lZGlkICphbGxvY2F0ZWRfZWRpZDsKPiA+ICsJ aW50IGVkaWRfaWQ7Cj4gPiArCj4gPiArCXJlcyA9IHhtbHJwY19jbGllbnRfY2FsbCgmZW52LCBj aGFtZWxpdW1fdXJsLAo+ID4gIkNyZWF0ZUVkaWQiLAo+ID4gKwkJCQnCoCIoNikiLCBlZGlkLCBF RElEX0xFTkdUSCk7Cj4gPiArCWNoZWNrX3JwYygpOwo+ID4gKwo+ID4gKwl4bWxycGNfcmVhZF9p bnQoJmVudiwgcmVzLCAmZWRpZF9pZCk7Cj4gPiArCXhtbHJwY19ERUNSRUYocmVzKTsKPiA+ICsK PiA+ICsJYWxsb2NhdGVkX2VkaWQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGFtZWxpdW1fZWRp ZCkpOwo+ID4gKwlpZ3RfYXNzZXJ0KGFsbG9jYXRlZF9lZGlkKTsKPiA+ICsKPiA+ICsJYWxsb2Nh dGVkX2VkaWQtPmlkID0gZWRpZF9pZDsKPiA+ICsJaWYgKGFsbG9jYXRlZF9lZGlkcykgewo+ID4g KwkJaWd0X2xpc3RfaW5zZXJ0KCZhbGxvY2F0ZWRfZWRpZHMtPmxpbmssCj4gPiAmYWxsb2NhdGVk X2VkaWQtPmxpbmspOwo+ID4gKwl9IGVsc2Ugewo+ID4gKwkJaWd0X2xpc3RfaW5pdCgmYWxsb2Nh dGVkX2VkaWQtPmxpbmspOwo+ID4gKwkJYWxsb2NhdGVkX2VkaWRzID0gYWxsb2NhdGVkX2VkaWQ7 Cj4gPiArCX0KPiA+ICsKPiA+ICsJcmV0dXJuIGVkaWRfaWQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0 YXRpYyB2b2lkIGNoYW1lbGl1bV9kZXN0cm95X2VkaWQoaW50IGVkaWRfaWQpCj4gPiArewo+ID4g Kwl4bWxycGNfdmFsdWUgKnJlczsKPiA+ICsKPiA+ICsJcmVzID0geG1scnBjX2NsaWVudF9jYWxs KCZlbnYsIGNoYW1lbGl1bV91cmwsCj4gPiAiRGVzdHJveUVkaWQiLAo+ID4gKwkJCQnCoCIoaSki LCBlZGlkX2lkKTsKPiA+ICsJY2hlY2tfcnBjKCk7Cj4gPiArCj4gPiArCXhtbHJwY19ERUNSRUYo cmVzKTsKPiA+ICt9Cj4gPiArCj4gPiArLyoqCj4gPiArICogY2hhbWVsaXVtX3BvcnRfc2V0X2Vk aWQ6Cj4gPiArICogQGlkOiBUaGUgSUQgb2YgdGhlIHBvcnQgdG8gc2V0IHRoZSBFRElEIG9uCj4g PiArICogQGVkaWRfaWQ6IFRoZSBJRCBvZiBhbiBFRElEIG9uIHRoZSBjaGFtZWxpdW0gY3JlYXRl ZCB3aXRoCj4gPiArICogI2NoYW1lbGl1bV9uZXdfZWRpZCwgb3IgMCB0byBkaXNhYmxlIHRoZSBF RElEIG9uIHRoZSBwb3J0Cj4gPiArICoKPiA+ICsgKiBTZXRzIGEgcG9ydCBvbiB0aGUgY2hhbWVs aXVtIHRvIHVzZSB0aGUgc3BlY2lmaWVkIEVESUQuIFRoaXMKPiA+IGRvZXMgbm90IGZpcmUgYQo+ ID4gKyAqIGhvdHBsdWcgcHVsc2Ugb24gaXQncyBvd24sIGFuZCBtZXJlbHkgY2hhbmdlcyB3aGF0 IEVESUQgdGhlCj4gPiBjaGFtZWxpdW0gcG9ydAo+ID4gKyAqIHdpbGwgcmVwb3J0IHRvIHVzIHRo ZSBuZXh0IHRpbWUgd2UgcHJvYmUgaXQuIFVzZXJzIHdpbGwgbmVlZCB0bwo+ID4gcmVwcm9iZSB0 aGUKPiA+ICsgKiBjb25uZWN0b3JzIHRoZW1zZWx2ZXMgaWYgdGhleSB3YW50IHRvIHNlZSB0aGUg RURJRCByZXBvcnRlZCBieQo+ID4gdGhlIHBvcnQKPiA+ICsgKiBjaGFuZ2UuCj4gPiArICovCj4g PiArdm9pZCBjaGFtZWxpdW1fcG9ydF9zZXRfZWRpZChpbnQgaWQsIGludCBlZGlkX2lkKQo+ID4g K3sKPiA+ICsJeG1scnBjX3ZhbHVlICpyZXM7Cj4gPiArCj4gPiArCXJlcyA9IHhtbHJwY19jbGll bnRfY2FsbCgmZW52LCBjaGFtZWxpdW1fdXJsLCAiQXBwbHlFZGlkIiwKPiA+ICsJCQkJwqAiKGlp KSIsIGlkLCBlZGlkX2lkKTsKPiA+ICsJY2hlY2tfcnBjKCk7Cj4gPiArCj4gPiArCXhtbHJwY19E RUNSRUYocmVzKTsKPiA+ICt9Cj4gPiArCj4gPiArLyoqCj4gPiArICogY2hhbWVsaXVtX3BvcnRf c2V0X2RkY19zdGF0ZToKPiA+ICsgKiBAaWQ6IFRoZSBJRCBvZiB0aGUgcG9ydCB3aG9zZSBEREMg YnVzIHdlIHdhbnQgdG8gbW9kaWZ5Cj4gPiArICogQGVuYWJsZWQ6IFdoZXRoZXIgb3Igbm90IHRv IGVuYWJsZSB0aGUgRERDIGJ1cwo+ID4gKyAqCj4gPiArICogVGhpcyBkaXNhYmxlcyB0aGUgRERD IGJ1cyAoZS5nLiB0aGUgaTJjIGxpbmUgb24gdGhlIGNvbm5lY3Rvcgo+ID4gdGhhdCBnaXZlcyB1 cwo+ID4gKyAqIGFuIEVESUQpIG9mIHRoZSBzcGVjaWZpZWQgcG9ydCBvbiB0aGUgY2hhbWVsaXVt LiBUaGlzIGlzIHVzZWZ1bAo+ID4gZm9yIHRlc3RpbmcKPiA+ICsgKiBiZWhhdmlvciBvbiBsZWdh Y3kgY29ubmVjdG9ycyBzdWNoIGFzIFZHQSwgd2hlcmUgdGhlIHByZXNlbmNlCj4gPiBvZiBhIERE QyBidXMKPiA+ICsgKiBpcyBub3QgYWx3YXlzIGd1YXJhbnRlZWQuCj4gPiArICovCj4gPiArdm9p ZCBjaGFtZWxpdW1fcG9ydF9zZXRfZGRjX3N0YXRlKGludCBwb3J0LCBib29sIGVuYWJsZWQpCj4g PiArewo+ID4gKwl4bWxycGNfdmFsdWUgKnJlczsKPiA+ICsKPiA+ICsJaWd0X2RlYnVnKCIlc2Fi bGluZyBEREMgYnVzIG9uIHBvcnQgJWRcbiIsCj4gPiArCQnCoMKgZW5hYmxlZCA/ICJFbiIgOiAi RGlzIiwgcG9ydCk7Cj4gPiArCj4gPiArCXJlcyA9IHhtbHJwY19jbGllbnRfY2FsbCgmZW52LCBj aGFtZWxpdW1fdXJsLAo+ID4gIlNldERkY1N0YXRlIiwKPiA+ICsJCQkJwqAiKGliKSIsIHBvcnQs IGVuYWJsZWQpOwo+ID4gKwljaGVja19ycGMoKTsKPiA+ICsKPiA+ICsJeG1scnBjX0RFQ1JFRihy ZXMpOwo+ID4gK30KPiA+ICsKPiA+ICsvKioKPiA+ICsgKiBjaGFtZWxpdW1fcG9ydF9nZXRfZGRj X3N0YXRlOgo+ID4gKyAqIEBpZDogVGhlIElEIG9mIHRoZSBwb3J0IHdob3NlIEREQyBidXMgd2Ug d2FudCB0byBjaGVjayB0aGUKPiA+IHN0YXR1cyBvZgo+ID4gKyAqCj4gPiArICogQ2hlY2sgd2hl dGhlciBvciBub3QgdGhlIEREQyBidXMgb24gdGhlIHNwZWNpZmllZCBjaGFtZWxpdW0KPiA+IHBv cnQgaXMgZW5hYmxlZAo+ID4gKyAqIG9yIG5vdC4KPiA+ICsgKgo+ID4gKyAqIFJldHVybnM6IFRy dWUgaWYgdGhlIEREQyBidXMgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgo+ID4gKyAqLwo+ ID4gK2Jvb2wgY2hhbWVsaXVtX3BvcnRfZ2V0X2RkY19zdGF0ZShpbnQgaWQpCj4gPiArewo+ID4g Kwl4bWxycGNfdmFsdWUgKnJlczsKPiA+ICsJeG1scnBjX2Jvb2wgZW5hYmxlZDsKPiA+ICsKPiA+ ICsJcmVzID0geG1scnBjX2NsaWVudF9jYWxsKCZlbnYsIGNoYW1lbGl1bV91cmwsCj4gPiAiSXNE ZGNFbmFibGVkIiwKPiA+ICsJCQkJwqAiKGkpIiwgaWQpOwo+ID4gKwljaGVja19ycGMoKTsKPiA+ ICsKPiA+ICsJeG1scnBjX3JlYWRfYm9vbCgmZW52LCByZXMsICZlbmFibGVkKTsKPiA+ICsKPiA+ ICsJeG1scnBjX0RFQ1JFRihyZXMpOwo+ID4gKwlyZXR1cm4gZW5hYmxlZDsKPiA+ICt9Cj4gPiAr Cj4gPiArLyoqCj4gPiArICogY2hhbWVsaXVtX3BvcnRfZ2V0X3Jlc29sdXRpb246Cj4gPiArICog QGlkOiBUaGUgSUQgb2YgdGhlIHBvcnQgd2hvc2UgZGlzcGxheSByZXNvbHV0aW9uIHdlIHdhbnQg dG8KPiA+IGNoZWNrCj4gPiArICogQHg6IFdoZXJlIHRvIHN0b3JlIHRoZSBob3Jpem9udGFsIHJl c29sdXRpb24gb2YgdGhlIHBvcnQKPiA+ICsgKiBAeTogV2hlcmUgdG8gc3RvcmUgdGhlIHZlcmlj YWwgcmVzb2x1dGlvbiBvZiB0aGUgcG9ydAo+ID4gKyAqCj4gPiArICogQ2hlY2sgdGhlIGN1cnJl bnQgcmVwb3J0ZWQgZGlzcGxheSByZXNvbHV0aW9uIG9mIHRoZSBzcGVjaWZpZWQKPiA+IHBvcnQg b24gdGhlCj4gPiArICogY2hhbWVsaXVtLiBUaGlzIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGJ5 IHRoZSBjaGFtZWxpdW0KPiA+IGl0c2VsZiwgbm90IERSTS4KPiA+ICsgKiBVc2VmdWwgZm9yIHZl cmlmeWluZyB0aGF0IHdlIHJlYWxseSBhcmUgc2Nhbm5pbmcgb3V0IGF0IHRoZQo+ID4gcmVzb2x1 dGlvbiB3ZQo+ID4gKyAqIHRoaW5rIHdlIGFyZS4KPiA+ICsgKi8KPiA+ICt2b2lkIGNoYW1lbGl1 bV9wb3J0X2dldF9yZXNvbHV0aW9uKGludCBpZCwgaW50ICp4LCBpbnQgKnkpCj4gPiArewo+ID4g Kwl4bWxycGNfdmFsdWUgKnJlcywgKnJlc194LCAqcmVzX3k7Cj4gPiArCj4gPiArCXJlcyA9IHht bHJwY19jbGllbnRfY2FsbCgmZW52LCBjaGFtZWxpdW1fdXJsLAo+ID4gIkRldGVjdFJlc29sdXRp b24iLAo+ID4gKwkJCQnCoCIoaSkiLCBpZCk7Cj4gPiArCWNoZWNrX3JwYygpOwo+ID4gKwo+ID4g Kwl4bWxycGNfYXJyYXlfcmVhZF9pdGVtKCZlbnYsIHJlcywgMCwgJnJlc194KTsKPiA+ICsJeG1s cnBjX2FycmF5X3JlYWRfaXRlbSgmZW52LCByZXMsIDEsICZyZXNfeSk7Cj4gPiArCXhtbHJwY19y ZWFkX2ludCgmZW52LCByZXNfeCwgeCk7Cj4gPiArCXhtbHJwY19yZWFkX2ludCgmZW52LCByZXNf eSwgeSk7Cj4gPiArCj4gPiArCXhtbHJwY19ERUNSRUYocmVzX3gpOwo+ID4gKwl4bWxycGNfREVD UkVGKHJlc195KTsKPiA+ICsJeG1scnBjX0RFQ1JFRihyZXMpOwo+ID4gK30KPiA+ICsKPiA+ICsv KioKPiA+ICsgKiBjaGFtZWxpdW1fZ2V0X2NyY19mb3JfYXJlYToKPiA+ICsgKiBAaWQ6IFRoZSBJ RCBvZiB0aGUgcG9ydCBmcm9tIHdoaWNoIHdlIHdhbnQgdG8gcmV0cmlldmUgdGhlIENSQwo+ID4g KyAqIEB4OiBUaGUgWCBjb29yZGluYXRlIG9uIHRoZSBlbXVsYXRlZCBkaXNwbGF5IHRvIHN0YXJ0 Cj4gPiBjYWxjdWxhdGluZyB0aGUgQ1JDCj4gPiArICogZnJvbQo+ID4gKyAqIEB5OiBUaGUgWSBj b29yZGluYXRlIG9uIHRoZSBlbXVsYXRlZCBkaXNwbGF5IHRvIHN0YXJ0Cj4gPiBjYWxjdWxhdGlu ZyB0aGUgQ1JDCj4gPiArICogZnJvbQo+ID4gKyAqIEB3OiBUaGUgd2lkdGggb2YgdGhlIGFyZWEg dG8gZmV0Y2ggdGhlIENSQyBmcm9tCj4gPiArICogQGg6IFRoZSBoZWlnaHQgb2YgdGhlIGFyZWEg dG8gZmV0Y2ggdGhlIENSQyBmcm9tCj4gPiArICoKPiA+ICsgKiBSZWFkcyBiYWNrIHRoZSBwaXhl bCBDUkMgZm9yIGFuIGFyZWEgb24gdGhlIHNwZWNpZmllZCBjaGFtZWxpdW0KPiA+IHBvcnQuIFRo aXMKPiA+ICsgKiBpcyB0aGUgc2FtZSBhcyB1c2luZyB0aGUgQ1JDIHJlYWRiYWNrIGZyb20gYSBH UFUsIHRoZSBtYWluCj4gPiBkaWZmZXJlbmNlIGJlaW5nCj4gPiArICogdGhlIGRhdGEgaXMgcHJv dmlkZWQgYnkgdGhlIGNoYW1lbGl1bSBhbmQgYWxzbyBhbGxvd3MgdXMgdG8KPiA+IHNwZWNpZnkg YSByZWdpb24KPiA+ICsgKiBvZiB0aGUgc2NyZWVuIHRvIHVzZSBhcyBvcHBvc2VkIHRvIHRoZSBl bnRpcmUgdGhpbmcuCj4gPiArICoKPiA+ICsgKiBSZXR1cm5zOiBUaGUgQ1JDIHJlYWQgYmFjayBm cm9tIHRoZSBjaGFtZWxpdW0KPiA+ICsgKi8KPiA+ICt1bnNpZ25lZCBpbnQgY2hhbWVsaXVtX2dl dF9jcmNfZm9yX2FyZWEoaW50IGlkLCBpbnQgeCwgaW50IHksIGludAo+ID4gdywgaW50IGgpCj4g PiArewo+ID4gKwl4bWxycGNfdmFsdWUgKnJlczsKPiA+ICsJdW5zaWduZWQgaW50IGNyYzsKPiA+ ICsKPiA+ICsJcmVzID0geG1scnBjX2NsaWVudF9jYWxsKCZlbnYsIGNoYW1lbGl1bV91cmwsCj4g PiAiQ29tcHV0ZVBpeGVsQ2hlY2tzdW0iLAo+ID4gKwkJCQnCoCIoaWlpaWkpIiwgaWQsIHgsIHks IHcsIGgpOwo+ID4gKwljaGVja19ycGMoKTsKPiA+ICsKPiA+ICsJeG1scnBjX3JlYWRfaW50KCZl bnYsIHJlcywgKGludCopKCZjcmMpKTsKPiA+ICsKPiA+ICsJeG1scnBjX0RFQ1JFRihyZXMpOwo+ ID4gKwlyZXR1cm4gY3JjOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdW5zaWduZWQgaW50IGNo YW1lbGl1bV9nZXRfcG9ydF90eXBlKGludCBwb3J0KQo+ID4gK3sKPiA+ICsJeG1scnBjX3ZhbHVl ICpyZXM7Cj4gPiArCWNvbnN0IGNoYXIgKnBvcnRfdHlwZV9zdHI7Cj4gPiArCXVuc2lnbmVkIGlu dCBwb3J0X3R5cGU7Cj4gPiArCj4gPiArCXJlcyA9IHhtbHJwY19jbGllbnRfY2FsbCgmZW52LCBj aGFtZWxpdW1fdXJsLAo+ID4gIkdldENvbm5lY3RvclR5cGUiLAo+ID4gKwkJCQnCoCIoaSkiLCBw b3J0KTsKPiA+ICsJY2hlY2tfcnBjKCk7Cj4gPiArCj4gPiArCXhtbHJwY19yZWFkX3N0cmluZygm ZW52LCByZXMsICZwb3J0X3R5cGVfc3RyKTsKPiA+ICsJaWd0X2RlYnVnKCJQb3J0ICVkIGlzIG9m IHR5cGUgJyVzJ1xuIiwgcG9ydCwKPiA+IHBvcnRfdHlwZV9zdHIpOwo+ID4gKwo+ID4gKwlpZiAo c3RyY21wKHBvcnRfdHlwZV9zdHIsICJEUCIpID09IDApCj4gPiArCQlwb3J0X3R5cGUgPSBEUk1f TU9ERV9DT05ORUNUT1JfRGlzcGxheVBvcnQ7Cj4gPiArCWVsc2UgaWYgKHN0cmNtcChwb3J0X3R5 cGVfc3RyLCAiSERNSSIpID09IDApCj4gPiArCQlwb3J0X3R5cGUgPSBEUk1fTU9ERV9DT05ORUNU T1JfSERNSUE7Cj4gPiArCWVsc2UgaWYgKHN0cmNtcChwb3J0X3R5cGVfc3RyLCAiVkdBIikgPT0g MCkKPiA+ICsJCXBvcnRfdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9WR0E7Cj4gPiArCWVsc2UK PiA+ICsJCXBvcnRfdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duOwo+ID4gKwo+ID4g KwlmcmVlKCh2b2lkKilwb3J0X3R5cGVfc3RyKTsKPiA+ICsJeG1scnBjX0RFQ1JFRihyZXMpOwo+ ID4gKwo+ID4gKwlyZXR1cm4gcG9ydF90eXBlOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9p ZCBjaGFtZWxpdW1fcHJvYmVfcG9ydHModm9pZCkKPiA+ICt7Cj4gPiArCXhtbHJwY192YWx1ZSAq cmVzLCAqcG9ydF92YWw7Cj4gPiArCXN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydDsKPiA+ICsJ dW5zaWduZWQgaW50IHBvcnRfdHlwZTsKPiA+ICsJaW50IGlkLCBpLCBsZW47Cj4gPiArCj4gPiAr CS8qIEZpZ3VyZSBvdXQgd2hhdCBwb3J0cyBhcmUgY29ubmVjdGVkLCBhbG9uZyB3aXRoIHRoZWly Cj4gPiB0eXBlcyAqLwo+ID4gKwlyZXMgPSB4bWxycGNfY2xpZW50X2NhbGwoJmVudiwgY2hhbWVs aXVtX3VybCwKPiA+ICJQcm9iZUlucHV0cyIsICIoKSIpOwo+ID4gKwljaGVja19ycGMoKTsKPiA+ ICsKPiA+ICsJbGVuID0geG1scnBjX2FycmF5X3NpemUoJmVudiwgcmVzKTsKPiA+ICsJY2hhbWVs aXVtX3BvcnRzID0gY2FsbG9jKHNpemVvZihzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQpLAo+ID4gbGVu KTsKPiA+ICsKPiA+ICsJaWd0X2Fzc2VydChjaGFtZWxpdW1fcG9ydHMpOwo+ID4gKwo+ID4gKwlm b3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKPiA+ICsJCXhtbHJwY19hcnJheV9yZWFkX2l0ZW0o JmVudiwgcmVzLCBpLCAmcG9ydF92YWwpOwo+ID4gKwkJeG1scnBjX3JlYWRfaW50KCZlbnYsIHBv cnRfdmFsLCAmaWQpOwo+ID4gKwkJeG1scnBjX0RFQ1JFRihwb3J0X3ZhbCk7Cj4gPiArCj4gPiAr CQlwb3J0X3R5cGUgPSBjaGFtZWxpdW1fZ2V0X3BvcnRfdHlwZShpZCk7Cj4gPiArCQlpZiAocG9y dF90eXBlID09IERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duKQo+ID4gKwkJCWNvbnRpbnVlOwo+ ID4gKwo+ID4gKwkJcG9ydCA9ICZjaGFtZWxpdW1fcG9ydHNbY2hhbWVsaXVtX3BvcnRfY291bnRd Owo+ID4gKwkJcG9ydC0+aWQgPSBpZDsKPiA+ICsJCXBvcnQtPnR5cGUgPSBwb3J0X3R5cGU7Cj4g PiArCQlwb3J0LT5vcmlnaW5hbF9wbHVnZ2VkID0gY2hhbWVsaXVtX2lzX3BsdWdnZWQoaWQpOwo+ ID4gKwkJY2hhbWVsaXVtX3BvcnRfY291bnQrKzsKPiA+ICsJfQo+ID4gKwo+ID4gKwljaGFtZWxp dW1fcG9ydHMgPSByZWFsbG9jKGNoYW1lbGl1bV9wb3J0cywKPiA+ICsJCQkJwqDCoHNpemVvZihz dHJ1Y3QgY2hhbWVsaXVtX3BvcnQpICoKPiA+ICsJCQkJwqDCoGNoYW1lbGl1bV9wb3J0X2NvdW50 KTsKPiA+ICsJaWd0X2Fzc2VydChjaGFtZWxpdW1fcG9ydHMpOwo+ID4gKwo+ID4gKwl4bWxycGNf REVDUkVGKHJlcyk7Cj4gPiArfQo+ID4gKwo+ID4gKy8qKgo+ID4gKyAqIGNoYW1lbGl1bV9yZXNl dDoKPiA+ICsgKgo+ID4gKyAqIFJlc2V0cyB0aGUgY2hhbWVsaXVtJ3MgSU8gYm9hcmQuIEFzIHdl bGwsIHRoaXMgYWxzbyBoYXMgdGhlCj4gPiBlZmZlY3Qgb2YKPiA+ICsgKiBjYXVzaW5nIGFsbCBv ZiB0aGUgY2hhbWVsaXVtIHBvcnRzIHRvIGdldCBzZXQgdG8gdW5wbHVnZ2VkCj4gPiArICovCj4g PiArdm9pZCBjaGFtZWxpdW1fcmVzZXQodm9pZCkKPiA+ICt7Cj4gPiArCXhtbHJwY192YWx1ZSAq cmVzOwo+ID4gKwo+ID4gKwlpZ3RfZGVidWcoIlJlc2V0dGluZyB0aGUgY2hhbWVsaXVtXG4iKTsK PiA+ICsKPiA+ICsJcmVzID0geG1scnBjX2NsaWVudF9jYWxsKCZlbnYsIGNoYW1lbGl1bV91cmws ICJSZXNldCIsCj4gPiAiKCkiKTsKPiA+ICsJY2hlY2tfcnBjKCk7Cj4gPiArCj4gPiArCXhtbHJw Y19ERUNSRUYocmVzKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgY2hhbWVsaXVtX2V4 aXRfaGFuZGxlcihpbnQgc2lnKQo+ID4gK3sKPiA+ICsJY2hhbWVsaXVtX2RlaW5pdCgpOwo+ID4g K30KPiA+ICsKPiA+ICsvKioKPiA+ICsgKiBjaGFtZWxpdW1faW5pdDoKPiA+ICsgKgo+ID4gKyAq IFNldHMgdXAgYSBjb25uZWN0aW9uIHdpdGggYSBjaGFtZWxpdW0sIHVzaW5nIHRoZSB1cmwgcHJv dmlkZWQKPiA+IGluIHRoZQo+ID4gKyAqIENIQU1FTElVTV9IT1NUIGVudmlvcm5tZW50IHZhcmlh YmxlLiBUaGlzIG11c3QgYmUgY2FsbGVkIGZpcnN0Cj4gPiBiZWZvcmUgdHJ5aW5nCj4gPiArICog dG8gdXNlIHRoZSBjaGFtZWxpdW0uIFdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgbm8gbG9uZ2VyIG5l ZWRlZCwKPiA+IHRoZSB1c2VyCj4gPiArICogc2hvdWxkIGNhbGwgI2NoYW1lbGl1bV9kZWluaXQg dG8gZnJlZSB0aGUgcmVzb3VyY2VzIHVzZWQgYnkgdGhlCj4gPiBjb25uZWN0aW9uLgo+ID4gKyAq Cj4gPiArICogSWYgd2UgZmFpbCB0byBlc3RhYmxpc2ggYSBjb25uZWN0aW9uIHdpdGggdGhlIGNo YW1lbGl1bSwgd2UKPiA+IGZhaWwgdGhlIGN1cnJlbnQKPiA+ICsgKiB0ZXN0Lgo+ID4gKyAqLwo+ ID4gK3ZvaWQgY2hhbWVsaXVtX2luaXQodm9pZCkKPiA+ICt7Cj4gPiArCWNoYW1lbGl1bV91cmwg PSBnZXRlbnYoIkNIQU1FTElVTV9IT1NUIik7Cj4gPiArCWlndF9hc3NlcnQoY2hhbWVsaXVtX3Vy bCAhPSBOVUxMKTsKPiA+ICsKPiA+ICsJeG1scnBjX2Vudl9pbml0KCZlbnYpOwo+ID4gKwo+ID4g Kwl4bWxycGNfY2xpZW50X2luaXQyKCZlbnYsIFhNTFJQQ19DTElFTlRfTk9fRkxBR1MsIFBBQ0tB R0UsCj4gPiArCQkJwqDCoMKgwqBQQUNLQUdFX1ZFUlNJT04sIE5VTEwsIDApOwo+ID4gKwlpZ3Rf ZmFpbF9vbl9mKGVudi5mYXVsdF9vY2N1cnJlZCwKPiA+ICsJCcKgwqDCoMKgwqDCoCJGYWlsZWQg dG8gaW5pdCB4bWxycGM6ICVzXG4iLAo+ID4gKwkJwqDCoMKgwqDCoMKgZW52LmZhdWx0X3N0cmlu Zyk7Cj4gPiArCj4gPiArCWNoYW1lbGl1bV9wcm9iZV9wb3J0cygpOwo+ID4gKwljaGFtZWxpdW1f cmVzZXQoKTsKPiA+ICsKPiA+ICsJaWd0X2luc3RhbGxfZXhpdF9oYW5kbGVyKGNoYW1lbGl1bV9l eGl0X2hhbmRsZXIpOwo+ID4gK30KPiA+ICsKPiA+ICsvKioKPiA+ICsgKiBjaGFtZWxpdW1fZGVp bml0Ogo+ID4gKyAqCj4gPiArICogRnJlZXMgdGhlIHJlc291cmNlcyB1c2VkIGJ5IGEgY29ubmVj dGlvbiB0byB0aGUgY2hhbWVsaXVtIHRoYXQKPiA+IHdhcyBzZXQgdXAKPiA+ICsgKiB3aXRoICNj aGFtZWxpdW1faW5pdC4gQXMgd2VsbCwgdGhpcyBmdW5jdGlvbiByZXN0b3JlcyB0aGUgc3RhdGUK PiA+IG9mIHRoZQo+ID4gKyAqIGNoYW1lbGl1bSBsaWtlIGl0IHdhcyBiZWZvcmUgY2FsbGluZyAj Y2hhbWVsaXVtX2luaXQuIFRoaXMKPiA+IGZ1bmN0aW9uIGlzIGFsc28KPiA+ICsgKiBjYWxsZWQg YXMgYW4gZXhpdCBoYW5kbGVyLCBzbyB1c2VycyBvbmx5IG5lZWQgdG8gY2FsbCBtYW51YWxseQo+ ID4gaWYgdGhleSBkb24ndAo+ID4gKyAqIHdhbnQgdGhlIGNoYW1lbGl1bSBpbnRlcmZlcmluZyB3 aXRoIG90aGVyIHRlc3RzIGluIHRoZSBzYW1lCj4gPiBmaWxlLgo+ID4gKyAqLwo+ID4gK3ZvaWQg Y2hhbWVsaXVtX2RlaW5pdCh2b2lkKQo+ID4gK3sKPiA+ICsJaW50IGk7Cj4gPiArCXN0cnVjdCBj aGFtZWxpdW1fZWRpZCAqcG9zLCAqdG1wOwo+ID4gKwo+ID4gKwlpZiAoIWNoYW1lbGl1bV91cmwp Cj4gPiArCQlyZXR1cm47Cj4gPiArCj4gPiArCS8qIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHN0YXRl IG9mIGFsbCBvZiB0aGUgY2hhbWVsaXVtCj4gPiBwb3J0cyAqLwo+ID4gKwlpZ3RfZGVidWcoIlJl c3RvcmluZyBvcmlnaW5hbCBzdGF0ZSBvZiBjaGFtZWxpdW1cbiIpOwo+ID4gKwljaGFtZWxpdW1f cmVzZXQoKTsKPiA+ICsJZm9yIChpID0gMDsgaSA8IGNoYW1lbGl1bV9wb3J0X2NvdW50OyBpKysp IHsKPiA+ICsJCWlmIChjaGFtZWxpdW1fcG9ydHNbaV0ub3JpZ2luYWxfcGx1Z2dlZCkKPiA+ICsJ CQljaGFtZWxpdW1fcGx1ZyhjaGFtZWxpdW1fcG9ydHNbaV0uaWQpOwo+ID4gKwl9Cj4gPiArCj4g PiArCS8qIERlc3Ryb3kgYW55IEVESURzIHdlIGNyZWF0ZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0 IGxlYWsKPiA+IHRoZW0gKi8KPiA+ICsJaWd0X2xpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwg JmFsbG9jYXRlZF9lZGlkcy0+bGluaywKPiA+IGxpbmspIHsKPiA+ICsJCWNoYW1lbGl1bV9kZXN0 cm95X2VkaWQocG9zLT5pZCk7Cj4gPiArCQlmcmVlKHBvcyk7Cj4gPiArCX0KPiA+ICsKPiA+ICsJ eG1scnBjX2NsaWVudF9jbGVhbnVwKCk7Cj4gPiArCXhtbHJwY19lbnZfY2xlYW4oJmVudik7Cj4g PiArCj4gPiArCWZyZWUoY2hhbWVsaXVtX3BvcnRzKTsKPiA+ICsJYWxsb2NhdGVkX2VkaWRzID0g TlVMTDsKPiA+ICsJY2hhbWVsaXVtX3VybCA9IE5VTEw7Cj4gPiArCWNoYW1lbGl1bV9wb3J0cyA9 IE5VTEw7Cj4gPiArCWNoYW1lbGl1bV9wb3J0X2NvdW50ID0gMDsKPiA+ICt9Cj4gPiArCj4gPiBk aWZmIC0tZ2l0IGEvbGliL2lndF9jaGFtZWxpdW0uaCBiL2xpYi9pZ3RfY2hhbWVsaXVtLmgKPiA+ IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwLi45MDA2MTVjCj4gPiAtLS0g L2Rldi9udWxsCj4gPiArKysgYi9saWIvaWd0X2NoYW1lbGl1bS5oCj4gPiBAQCAtMCwwICsxLDc3 IEBACj4gPiArLyoKPiA+ICsgKiBDb3B5cmlnaHQgwqkgMjAxNiBSZWQgSGF0IEluYy4KPiA+ICsg Kgo+ID4gKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0 byBhbnkgcGVyc29uCj4gPiBvYnRhaW5pbmcgYQo+ID4gKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2Fy ZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKPiA+ICJTb2Z0d2FyZSIp LAo+ID4gKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGlu Y2x1ZGluZyB3aXRob3V0Cj4gPiBsaW1pdGF0aW9uCj4gPiArICogdGhlIHJpZ2h0cyB0byB1c2Us IGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsCj4gPiBzdWJsaWNlbnNl LAo+ID4gKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJt aXQgcGVyc29ucyB0bwo+ID4gd2hvbSB0aGUKPiA+ICsgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQg dG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZwo+ID4gY29uZGl0aW9uczoKPiA+ICsg Kgo+ID4gKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24g bm90aWNlCj4gPiAoaW5jbHVkaW5nIHRoZSBuZXh0Cj4gPiArICogcGFyYWdyYXBoKSBzaGFsbCBi ZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCj4gPiBwb3J0aW9ucyBvZiB0 aGUKPiA+ICsgKiBTb2Z0d2FyZS4KPiA+ICsgKgo+ID4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9W SURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAo+ID4gRVhQUkVTUyBP Ugo+ID4gKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJB TlRJRVMgT0YKPiA+IE1FUkNIQU5UQUJJTElUWSwKPiA+ICsgKiBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULsKgwqBJTiBOTwo+ID4gRVZFTlQgU0hB TEwKPiA+ICsgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9S IEFOWSBDTEFJTSwKPiA+IERBTUFHRVMgT1IgT1RIRVIKPiA+ICsgKiBMSUFCSUxJVFksIFdIRVRI RVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKPiA+IEFSSVNJ TkcKPiA+ICsgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FS RSBPUiBUSEUgVVNFIE9SCj4gPiBPVEhFUiBERUFMSU5HUwo+ID4gKyAqIElOIFRIRSBTT0ZUV0FS RS4KPiA+ICsgKgo+ID4gKyAqIEF1dGhvcnM6IEx5dWRlIFBhdWwgPGx5dWRlQHJlZGhhdC5jb20+ Cj4gPiArICovCj4gPiArCj4gPiArI2lmbmRlZiBJR1RfQ0hBTUVMSVVNX0gKPiA+ICsjZGVmaW5l IElHVF9DSEFNRUxJVU1fSAo+ID4gKwo+ID4gKyNpbmNsdWRlICJjb25maWcuaCIKPiA+ICsjaW5j bHVkZSAiaWd0LmgiCj4gPiArI2luY2x1ZGUgPHN0ZGJvb2wuaD4KPiA+ICsKPiA+ICsvKioKPiA+ ICsgKiBjaGFtZWxpdW1fcG9ydDoKPiA+ICsgKiBAdHlwZTogVGhlIERSTSBjb25uZWN0b3IgdHlw ZSBvZiB0aGUgY2hhbWVsaXVtIHBvcnQKPiA+ICsgKiBAaWQ6IFRoZSBJRCBvZiB0aGUgY2hhbWVs aXVtIHBvcnQKPiA+ICsgKi8KPiA+ICtzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgewo+ID4gKwl1bnNp Z25lZCBpbnQgdHlwZTsKPiA+ICsJaW50IGlkOwo+ID4gKwo+ID4gKwkvKiBGb3IgcmVzdG9yaW5n IHRoZSBvcmlnaW5hbCBwb3J0IHN0YXRlIGFmdGVyIGZpbmlzaGluZwo+ID4gdGVzdHMgKi8KPiA+ ICsJYm9vbCBvcmlnaW5hbF9wbHVnZ2VkOwo+ID4gK307Cj4gPiArCj4gPiArZXh0ZXJuIGludCBj aGFtZWxpdW1fcG9ydF9jb3VudDsKPiA+ICtleHRlcm4gc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpj aGFtZWxpdW1fcG9ydHM7Cj4gPiArCj4gPiArLyoqCj4gPiArICogaWd0X3JlcXVpcmVfY2hhbWVs aXVtOgo+ID4gKyAqCj4gPiArICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoZSBlbnZpcm9ubWVu dCB2YXJpYWJsZSBDSEFNRUxJVU1fSE9TVAo+ID4gaXMgbm9uLW51bGwsCj4gPiArICogb3RoZXJ3 aXNlIHNraXBzIHRoZSBjdXJyZW50IHRlc3QuCj4gPiArICovCj4gPiArI2RlZmluZSBpZ3RfcmVx dWlyZV9jaGFtZWxpdW0oKSBcCj4gPiArCWlndF9yZXF1aXJlKGdldGVudigiQ0hBTUVMSVVNX0hP U1QiKSAhPSBOVUxMKTsKPiA+ICsKPiA+ICt2b2lkIGNoYW1lbGl1bV9pbml0KHZvaWQpOwo+ID4g K3ZvaWQgY2hhbWVsaXVtX2RlaW5pdCh2b2lkKTsKPiA+ICt2b2lkIGNoYW1lbGl1bV9yZXNldCh2 b2lkKTsKPiA+ICsKPiA+ICt2b2lkIGNoYW1lbGl1bV9wbHVnKGludCBpZCk7Cj4gPiArdm9pZCBj aGFtZWxpdW1fdW5wbHVnKGludCBpZCk7Cj4gPiArYm9vbCBjaGFtZWxpdW1faXNfcGx1Z2dlZChp bnQgaWQpOwo+ID4gK2Jvb2wgY2hhbWVsaXVtX3BvcnRfd2FpdF92aWRlb19pbnB1dF9zdGFibGUo aW50IGlkLCBpbnQKPiA+IHRpbWVvdXRfc2Vjcyk7Cj4gPiArdm9pZCBjaGFtZWxpdW1fZmlyZV9t aXhlZF9ocGRfcHVsc2VzKGludCBpZCwgLi4uKTsKPiA+ICt2b2lkIGNoYW1lbGl1bV9maXJlX2hw ZF9wdWxzZXMoaW50IGlkLCBpbnQgd2lkdGgsIGludCBjb3VudCk7Cj4gPiArdm9pZCBjaGFtZWxp dW1fYXN5bmNfaHBkX3B1bHNlX3N0YXJ0KGludCBpZCwgYm9vbCBoaWdoLCBpbnQKPiA+IGRlbGF5 X3NlY3MpOwo+ID4gK3ZvaWQgY2hhbWVsaXVtX2FzeW5jX2hwZF9wdWxzZV9maW5pc2godm9pZCk7 Cj4gPiAraW50IGNoYW1lbGl1bV9uZXdfZWRpZChjb25zdCB1bnNpZ25lZCBjaGFyICplZGlkKTsK PiA+ICt2b2lkIGNoYW1lbGl1bV9wb3J0X3NldF9lZGlkKGludCBpZCwgaW50IGVkaWRfaWQpOwo+ ID4gK2Jvb2wgY2hhbWVsaXVtX3BvcnRfZ2V0X2RkY19zdGF0ZShpbnQgaWQpOwo+ID4gK3ZvaWQg Y2hhbWVsaXVtX3BvcnRfc2V0X2RkY19zdGF0ZShpbnQgaWQsIGJvb2wgZW5hYmxlZCk7Cj4gPiAr dm9pZCBjaGFtZWxpdW1fcG9ydF9nZXRfcmVzb2x1dGlvbihpbnQgaWQsIGludCAqeCwgaW50ICp5 KTsKPiA+ICt1bnNpZ25lZCBpbnQgY2hhbWVsaXVtX2dldF9jcmNfZm9yX2FyZWEoaW50IGlkLCBp bnQgeCwgaW50IHksIGludAo+ID4gdywgaW50IGgpOwo+ID4gKwo+ID4gKyNlbmRpZiAvKiBJR1Rf Q0hBTUVMSVVNX0ggKi8KPiA+IGRpZmYgLS1naXQgYS9saWIvaWd0X2ttcy5jIGIvbGliL2lndF9r bXMuYwo+ID4gaW5kZXggOTg5NzA0ZS4uNzc2OGQ3YiAxMDA2NDQKPiA+IC0tLSBhL2xpYi9pZ3Rf a21zLmMKPiA+ICsrKyBiL2xpYi9pZ3Rfa21zLmMKPiA+IEBAIC00MCw2ICs0MCwxMCBAQAo+ID4g wqAjZW5kaWYKPiA+IMKgI2luY2x1ZGUgPGVycm5vLmg+Cj4gPiDCoCNpbmNsdWRlIDx0aW1lLmg+ Cj4gPiArI2lmZGVmIEhBVkVfQ0hBTUVMSVVNCj4gPiArI2luY2x1ZGUgPGxpYnVkZXYuaD4KPiA+ ICsjaW5jbHVkZSA8cG9sbC5oPgo+ID4gKyNlbmRpZgo+ID4gwqAKPiA+IMKgI2luY2x1ZGUgPGk5 MTVfZHJtLmg+Cj4gPiDCoAo+ID4gQEAgLTI3NjAsNiArMjc2NCwxMDkgQEAgdm9pZCBpZ3RfcmVz ZXRfY29ubmVjdG9ycyh2b2lkKQo+ID4gwqAJCQnCoMKgwqDCoMKgwqAiZGV0ZWN0Iik7Cj4gPiDC oH0KPiA+IMKgCj4gPiArI2lmZGVmIEhBVkVfQ0hBTUVMSVVNCj4gPiArc3RhdGljIHN0cnVjdCB1 ZGV2X21vbml0b3IgKmhvdHBsdWdfbW9uOwo+ID4gKwo+ID4gKy8qKgo+ID4gKyAqIGlndF93YXRj aF9ob3RwbHVnOgo+ID4gKyAqCj4gPiArICogQmVnaW4gbW9uaXRvcmluZyB1ZGV2IGZvciBob3Rw bHVnIGV2ZW50cy4KPiA+ICsgKi8KPiA+ICt2b2lkIGlndF93YXRjaF9ob3RwbHVnKHZvaWQpCj4g PiArewo+ID4gKwlzdHJ1Y3QgdWRldiAqdWRldjsKPiA+ICsJaW50IHJldCwgZmxhZ3MsIGZkOwo+ ID4gKwo+ID4gKwlpZiAoaG90cGx1Z19tb24pCj4gPiArCQlpZ3RfY2xlYW51cF9ob3RwbHVnKCk7 Cj4gPiArCj4gPiArCXVkZXYgPSB1ZGV2X25ldygpOwo+ID4gKwlpZ3RfYXNzZXJ0KHVkZXYgIT0g TlVMTCk7Cj4gPiArCj4gPiArCWhvdHBsdWdfbW9uID0gdWRldl9tb25pdG9yX25ld19mcm9tX25l dGxpbmsodWRldiwgInVkZXYiKTsKPiA+ICsJaWd0X2Fzc2VydChob3RwbHVnX21vbiAhPSBOVUxM KTsKPiA+ICsKPiA+ICsJcmV0ID0KPiA+IHVkZXZfbW9uaXRvcl9maWx0ZXJfYWRkX21hdGNoX3N1 YnN5c3RlbV9kZXZ0eXBlKGhvdHBsdWdfbW9uLAo+ID4gKwkJCQkJCQnCoMKgwqDCoMKgwqAiZHJt Cj4gPiAiLAo+ID4gKwkJCQkJCQnCoMKgwqDCoMKgwqAiZHJtCj4gPiBfbWlub3IiKTsKPiA+ICsJ aWd0X2Fzc2VydF9lcShyZXQsIDApOwo+ID4gKwlyZXQgPSB1ZGV2X21vbml0b3JfZmlsdGVyX3Vw ZGF0ZShob3RwbHVnX21vbik7Cj4gPiArCWlndF9hc3NlcnRfZXEocmV0LCAwKTsKPiA+ICsJcmV0 ID0gdWRldl9tb25pdG9yX2VuYWJsZV9yZWNlaXZpbmcoaG90cGx1Z19tb24pOwo+ID4gKwlpZ3Rf YXNzZXJ0X2VxKHJldCwgMCk7Cj4gPiArCj4gPiArCS8qIFNldCB0aGUgZmQgZm9yIHVkZXYgYXMg bm9uIGJsb2NraW5nICovCj4gPiArCWZkID0gdWRldl9tb25pdG9yX2dldF9mZChob3RwbHVnX21v bik7Cj4gPiArCWZsYWdzID0gZmNudGwoZmQsIEZfR0VURkwsIDApOwo+ID4gKwlpZ3RfYXNzZXJ0 KGZsYWdzKTsKPiA+ICsKPiA+ICsJZmxhZ3MgfD0gT19OT05CTE9DSzsKPiA+ICsJaWd0X2Fzc2Vy dF9uZXEoZmNudGwoZmQsIEZfU0VURkwsIGZsYWdzKSwgLTEpOwo+ID4gK30KPiA+ICsKPiA+ICsv KioKPiA+ICsgKiBpZ3RfaG90cGx1Z19kZXRlY3RlZDoKPiA+ICsgKiBAdGltZW91dF9zZWNzOiBI b3cgbG9uZyB0byB3YWl0IGZvciBhIGhvdHBsdWcgZXZlbnQgdG8gb2NjdXIuCj4gPiArICoKPiA+ ICsgKiBBc3NlcnQgdGhhdCBhIGhvdHBsdWcgZXZlbnQgd2FzIHJlY2VpdmVkIHNpbmNlIHdlIGxh c3QgY2hlY2tlZAo+ID4gdGhlIG1vbml0b3IuCj4gPiArICovCj4gPiArYm9vbCBpZ3RfaG90cGx1 Z19kZXRlY3RlZChpbnQgdGltZW91dF9zZWNzKQo+ID4gK3sKPiA+ICsJc3RydWN0IHVkZXZfZGV2 aWNlICpkZXY7Cj4gPiArCWNvbnN0IGNoYXIgKmhvdHBsdWdfdmFsOwo+ID4gKwlzdHJ1Y3QgcG9s bGZkIGZkID0gewo+ID4gKwkJLmZkID0gdWRldl9tb25pdG9yX2dldF9mZChob3RwbHVnX21vbiks Cj4gPiArCQkuZXZlbnRzID0gUE9MTElOCj4gPiArCX07Cj4gPiArCWJvb2wgaG90cGx1Z19yZWNl aXZlZCA9IGZhbHNlOwo+ID4gKwo+ID4gKwkvKiBHbyB0aHJvdWdoIGFsbCBvZiB0aGUgZXZlbnRz IHBlbmRpbmcgb24gdGhlIHVkZXYKPiA+IG1vbml0b3IuIE9uY2Ugd2UKPiA+ICsJwqAqIHJlY2Vp dmUgYSBob3RwbHVnLCB3ZSBjb250aW51ZSBnb2luZyB0aHJvdWdoIHRoZSByZXN0Cj4gPiBvZiB0 aGUgZXZlbnRzCj4gPiArCcKgKiBzbyB0aGF0IHJlZHVuZGFudCBob3RwbHVnIGV2ZW50cyBkb24n dCBjaGFuZ2UgdGhlCj4gPiByZXN1bHRzIG9mIGZ1dHVyZQo+ID4gKwnCoCogY2hlY2tzCj4gPiAr CcKgKi8KPiA+ICsJd2hpbGUgKCFob3RwbHVnX3JlY2VpdmVkICYmIHBvbGwoJmZkLCAxLCB0aW1l b3V0X3NlY3MgKgo+ID4gMTAwMCkpIHsKPiA+ICsJCWRldiA9IHVkZXZfbW9uaXRvcl9yZWNlaXZl X2RldmljZShob3RwbHVnX21vbik7Cj4gPiArCj4gPiArCQlob3RwbHVnX3ZhbCA9IHVkZXZfZGV2 aWNlX2dldF9wcm9wZXJ0eV92YWx1ZShkZXYsCj4gPiAiSE9UUExVRyIpOwo+ID4gKwkJaWYgKGhv dHBsdWdfdmFsICYmIGF0b2koaG90cGx1Z192YWwpID09IDEpCj4gPiArCQkJaG90cGx1Z19yZWNl aXZlZCA9IHRydWU7Cj4gPiArCj4gPiArCQl1ZGV2X2RldmljZV91bnJlZihkZXYpOwo+ID4gKwl9 Cj4gPiArCj4gPiArCXJldHVybiBob3RwbHVnX3JlY2VpdmVkOwo+ID4gK30KPiA+ICsKPiA+ICsv KioKPiA+ICsgKiBpZ3RfZmx1c2hfaG90cGx1Z3M6Cj4gPiArICogQG1vbjogQSB1ZGV2IG1vbml0 b3IgY3JlYXRlZCBieSAjaWd0X3dhdGNoX2hvdHBsdWcKPiA+ICsgKgo+ID4gKyAqIEdldCByaWQg b2YgYW55IHBlbmRpbmcgaG90cGx1ZyBldmVudHMgd2FpdGluZyBvbiB0aGUgdWRldgo+ID4gbW9u aXRvcgo+ID4gKyAqLwo+ID4gK3ZvaWQgaWd0X2ZsdXNoX2hvdHBsdWdzKHZvaWQpCj4gPiArewo+ ID4gKwlzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldjsKPiA+ICsKPiA+ICsJd2hpbGUgKChkZXYgPSB1 ZGV2X21vbml0b3JfcmVjZWl2ZV9kZXZpY2UoaG90cGx1Z19tb24pKSkKPiA+ICsJCXVkZXZfZGV2 aWNlX3VucmVmKGRldik7Cj4gPiArfQo+ID4gKwo+ID4gKy8qKgo+ID4gKyAqIGlndF9jbGVhbnVw X2hvdHBsdWc6Cj4gPiArICoKPiA+ICsgKiBDbGVhbnVwIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVk IGJ5ICNpZ3Rfd2F0Y2hfaG90cGx1Zwo+ID4gKyAqLwo+ID4gK3ZvaWQgaWd0X2NsZWFudXBfaG90 cGx1Zyh2b2lkKQo+ID4gK3sKPiA+ICsJc3RydWN0IHVkZXYgKnVkZXYgPSB1ZGV2X21vbml0b3Jf Z2V0X3VkZXYoaG90cGx1Z19tb24pOwo+ID4gKwo+ID4gKwl1ZGV2X21vbml0b3JfdW5yZWYoaG90 cGx1Z19tb24pOwo+ID4gKwlob3RwbHVnX21vbiA9IE5VTEw7Cj4gPiArCXVkZXZfdW5yZWYodWRl dik7Cj4gPiArfQo+ID4gKyNlbmRpZgo+ID4gKwo+ID4gwqAvKioKPiA+IMKgICoga21zdGVzdF9n ZXRfdmJsX2ZsYWc6Cj4gPiDCoCAqIEBwaXBlX2lkOiBQaXBlIHRvIGNvbnZlcnQgdG8gZmxhZyBy ZXByZXNlbnRhdGlvbi4KPiA+IGRpZmYgLS1naXQgYS9saWIvaWd0X2ttcy5oIGIvbGliL2lndF9r bXMuaAo+ID4gaW5kZXggNjQyMmFkYy4uZDBiNjdlMCAxMDA2NDQKPiA+IC0tLSBhL2xpYi9pZ3Rf a21zLmgKPiA+ICsrKyBiL2xpYi9pZ3Rfa21zLmgKPiA+IEBAIC0zMSw2ICszMSw5IEBACj4gPiDC oCNpbmNsdWRlIDxzdGRib29sLmg+Cj4gPiDCoCNpbmNsdWRlIDxzdGRpbnQuaD4KPiA+IMKgI2lu Y2x1ZGUgPHN0ZGRlZi5oPgo+ID4gKyNpZmRlZiBIQVZFX0NIQU1FTElVTQo+ID4gKyNpbmNsdWRl IDxsaWJ1ZGV2Lmg+Cj4gPiArI2VuZGlmCj4gPiDCoAo+ID4gwqAjaW5jbHVkZSA8eGY4NmRybU1v ZGUuaD4KPiA+IMKgCj4gPiBAQCAtMzMzLDYgKzMzNiw3IEBAIGlndF9wbGFuZV90ICppZ3Rfb3V0 cHV0X2dldF9wbGFuZShpZ3Rfb3V0cHV0X3QKPiA+ICpvdXRwdXQsIGVudW0gaWd0X3BsYW5lIHBs YW5lKTsKPiA+IMKgYm9vbCBpZ3RfcGlwZV9nZXRfcHJvcGVydHkoaWd0X3BpcGVfdCAqcGlwZSwg Y29uc3QgY2hhciAqbmFtZSwKPiA+IMKgCQkJwqDCoMKgdWludDMyX3QgKnByb3BfaWQsIHVpbnQ2 NF90ICp2YWx1ZSwKPiA+IMKgCQkJwqDCoMKgZHJtTW9kZVByb3BlcnR5UHRyICpwcm9wKTsKPiA+ ICt2b2lkIGlndF9vdXRwdXRfZ2V0X2VkaWQoaWd0X291dHB1dF90ICpvdXRwdXQsIHVuc2lnbmVk IGNoYXIKPiA+ICplZGlkX291dCk7Cj4gPiDCoAo+ID4gwqBzdGF0aWMgaW5saW5lIGJvb2wgaWd0 X3BsYW5lX3N1cHBvcnRzX3JvdGF0aW9uKGlndF9wbGFuZV90ICpwbGFuZSkKPiA+IMKgewo+ID4g QEAgLTQ3OCw2ICs0ODIsMTMgQEAgdWludDMyX3Qga21zdGVzdF9nZXRfdmJsX2ZsYWcodWludDMy X3QKPiA+IHBpcGVfaWQpOwo+ID4gwqAjZGVmaW5lIEVESURfTEVOR1RIIDEyOAo+ID4gwqBjb25z dCB1bnNpZ25lZCBjaGFyKiBpZ3Rfa21zX2dldF9iYXNlX2VkaWQodm9pZCk7Cj4gPiDCoGNvbnN0 IHVuc2lnbmVkIGNoYXIqIGlndF9rbXNfZ2V0X2FsdF9lZGlkKHZvaWQpOwo+ID4gLQo+ID4gK2Jv b2wgaWd0X2NvbXBhcmVfb3V0cHV0X2VkaWQoaWd0X291dHB1dF90ICpvdXRwdXQsIGNvbnN0IHVu c2lnbmVkCj4gPiBjaGFyICplZGlkKTsKPiA+ICsKPiA+ICsjaWZkZWYgSEFWRV9DSEFNRUxJVU0K PiA+ICt2b2lkIGlndF93YXRjaF9ob3RwbHVnKHZvaWQpOwo+ID4gK2Jvb2wgaWd0X2hvdHBsdWdf ZGV0ZWN0ZWQoaW50IHRpbWVvdXRfc2Vjcyk7Cj4gPiArdm9pZCBpZ3RfZmx1c2hfaG90cGx1Z3Mo dm9pZCk7Cj4gPiArdm9pZCBpZ3RfY2xlYW51cF9ob3RwbHVnKHZvaWQpOwo+ID4gKyNlbmRpZgo+ ID4gwqAKPiA+IMKgI2VuZGlmIC8qIF9fSUdUX0tNU19IX18gKi8KPiA+IGRpZmYgLS1naXQgYS9z Y3JpcHRzL3J1bi10ZXN0cy5zaCBiL3NjcmlwdHMvcnVuLXRlc3RzLnNoCj4gPiBpbmRleCA5N2Jh OWU1Li42NTM5YmY5IDEwMDc1NQo+ID4gLS0tIGEvc2NyaXB0cy9ydW4tdGVzdHMuc2gKPiA+ICsr KyBiL3NjcmlwdHMvcnVuLXRlc3RzLnNoCj4gPiBAQCAtMTIyLDEwICsxMjIsMTAgQEAgaWYgWyAh IC14ICIkUElHTElUIiBdOyB0aGVuCj4gPiDCoGZpCj4gPiDCoAo+ID4gwqBpZiBbICJ4JFJFU1VN RSIgIT0gIngiIF07IHRoZW4KPiA+IC0Jc3VkbyBJR1RfVEVTVF9ST09UPSIkSUdUX1RFU1RfUk9P VCIgIiRQSUdMSVQiIHJlc3VtZQo+ID4gIiRSRVNVTFRTIiAkTk9SRVRSWQo+ID4gKwlzdWRvIElH VF9URVNUX1JPT1Q9IiRJR1RfVEVTVF9ST09UIgo+ID4gQ0hBTUVMSVVNX0hPU1Q9IiRDSEFNRUxJ VU1fSE9TVCIgIiRQSUdMSVQiIHJlc3VtZSAiJFJFU1VMVFMiCj4gPiAkTk9SRVRSWQo+ID4gwqBl bHNlCj4gPiDCoAlta2RpciAtcCAiJFJFU1VMVFMiCj4gPiAtCXN1ZG8gSUdUX1RFU1RfUk9PVD0i JElHVF9URVNUX1JPT1QiICIkUElHTElUIiBydW4gaWd0IC1vCj4gPiAiJFJFU1VMVFMiIC1zICRW RVJCT1NFICRFWENMVURFICRGSUxURVIKPiA+ICsJc3VkbyBJR1RfVEVTVF9ST09UPSIkSUdUX1RF U1RfUk9PVCIKPiA+IENIQU1FTElVTV9IT1NUPSIkQ0hBTUVMSVVNX0hPU1QiICIkUElHTElUIiBy dW4gaWd0IC1vICIkUkVTVUxUUyIgLXMKPiA+ICRWRVJCT1NFICRFWENMVURFICRGSUxURVIKPiA+ IMKgZmkKPiA+IMKgCj4gPiDCoGlmIFsgIiRTVU1NQVJZIiA9PSAiaHRtbCIgXTsgdGhlbgo+ID4g ZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLmFtIGIvdGVzdHMvTWFrZWZpbGUuYW0KPiA+IGlu ZGV4IGE0MDgxMjYuLjA2YThlNmIgMTAwNjQ0Cj4gPiAtLS0gYS90ZXN0cy9NYWtlZmlsZS5hbQo+ ID4gKysrIGIvdGVzdHMvTWFrZWZpbGUuYW0KPiA+IEBAIC02Myw3ICs2Myw3IEBAIEFNX0NGTEFH UyA9ICQoRFJNX0NGTEFHUykgJChDV0FSTkZMQUdTKSAtV25vLQo+ID4gdW51c2VkLXJlc3VsdCAk KERFQlVHX0NGTEFHUylcCj4gPiDCoAkkKExJQlVOV0lORF9DRkxBR1MpICQoV0VSUk9SX0NGTEFH UykgXAo+ID4gwqAJJChOVUxMKQo+ID4gwqAKPiA+IC1MREFERCA9IC4uL2xpYi9saWJpbnRlbF90 b29scy5sYSAkKEdMSUJfTElCUykKPiA+ICtMREFERCA9IC4uL2xpYi9saWJpbnRlbF90b29scy5s YSAkKEdMSUJfTElCUykgJChYTUxSUENfTElCUykKPiA+IMKgCj4gPiDCoEFNX0NGTEFHUyArPSAk KENBSVJPX0NGTEFHUykgJChMSUJVREVWX0NGTEFHUykgJChHTElCX0NGTEFHUykKPiA+IMKgQU1f TERGTEFHUyA9IC1XbCwtLWFzLW5lZWRlZAo+ID4gQEAgLTExOSw1ICsxMTksOCBAQCB2YzRfd2Fp dF9ib19DRkxBR1MgPSAkKEFNX0NGTEFHUykKPiA+ICQoRFJNX1ZDNF9DRkxBR1MpCj4gPiDCoHZj NF93YWl0X2JvX0xEQUREID0gJChMREFERCkgJChEUk1fVkM0X0xJQlMpCj4gPiDCoHZjNF93YWl0 X3NlcW5vX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKERSTV9WQzRfQ0ZMQUdTKQo+ID4gwqB2YzRf d2FpdF9zZXFub19MREFERCA9ICQoTERBREQpICQoRFJNX1ZDNF9MSUJTKQo+ID4gKwo+ID4gK2No YW1lbGl1bV9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChYTUxSUENfQ0ZMQUdTKSAkKFVERVZfQ0ZM QUdTKQo+ID4gK2NoYW1lbGl1bV9MREFERCA9ICQoTERBREQpICQoWE1MUlBDX0xJQlMpICQoVURF Vl9MSUJTKQo+ID4gwqBlbmRpZgo+ID4gwqAKPiA+IGRpZmYgLS1naXQgYS90ZXN0cy9NYWtlZmls ZS5zb3VyY2VzIGIvdGVzdHMvTWFrZWZpbGUuc291cmNlcwo+ID4gaW5kZXggNmQwODFjMy4uM2Uw MTg1MiAxMDA2NDQKPiA+IC0tLSBhL3Rlc3RzL01ha2VmaWxlLnNvdXJjZXMKPiA+ICsrKyBiL3Rl c3RzL01ha2VmaWxlLnNvdXJjZXMKPiA+IEBAIC0xMzEsNiArMTMxLDcgQEAgVEVTVFNfcHJvZ3Nf TSA9IFwKPiA+IMKgCXRlbXBsYXRlIFwKPiA+IMKgCXZnZW1fYmFzaWMgXAo+ID4gwqAJdmdlbV9z bG93IFwKPiA+ICsJY2hhbWVsaXVtIFwKPiA+IMKgCSQoTlVMTCkKPiA+IMKgCj4gPiDCoFRFU1RT X3Byb2dzX1hNID0gXAo+ID4gZGlmZiAtLWdpdCBhL3Rlc3RzL2NoYW1lbGl1bS5jIGIvdGVzdHMv Y2hhbWVsaXVtLmMKPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwLi43 NjljZmRjCj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi90ZXN0cy9jaGFtZWxpdW0uYwo+ID4g QEAgLTAsMCArMSw1NDkgQEAKPiA+ICsvKgo+ID4gKyAqIENvcHlyaWdodCDCqSAyMDE2IFJlZCBI YXQgSW5jLgo+ID4gKyAqCj4gPiArICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJl ZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KPiA+IG9idGFpbmluZyBhCj4gPiArICogY29weSBv ZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQo+ ID4gIlNvZnR3YXJlIiksCj4gPiArICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCBy ZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQKPiA+IGxpbWl0YXRpb24KPiA+ICsgKiB0aGUg cmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwK PiA+IHN1YmxpY2Vuc2UsCj4gPiArICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2Fy ZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvCj4gPiB3aG9tIHRoZQo+ID4gKyAqIFNvZnR3YXJl IGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCj4gPiBjb25k aXRpb25zOgo+ID4gKyAqCj4gPiArICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRo aXMgcGVybWlzc2lvbiBub3RpY2UKPiA+IChpbmNsdWRpbmcgdGhlIG5leHQKPiA+ICsgKiBwYXJh Z3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwKPiA+ IHBvcnRpb25zIG9mIHRoZQo+ID4gKyAqIFNvZnR3YXJlLgo+ID4gKyAqCj4gPiArICogVEhFIFNP RlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQs Cj4gPiBFWFBSRVNTIE9SCj4gPiArICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRF RCBUTyBUSEUgV0FSUkFOVElFUyBPRgo+ID4gTUVSQ0hBTlRBQklMSVRZLAo+ID4gKyAqIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuwqDCoElOIE5P Cj4gPiBFVkVOVCBTSEFMTAo+ID4gKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJT IEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAo+ID4gREFNQUdFUyBPUiBPVEhFUgo+ID4gKyAqIExJ QUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJX SVNFLAo+ID4gQVJJU0lORwo+ID4gKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJ VEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKPiA+IE9USEVSIERFQUxJTkdTCj4gPiArICog SU4gVEhFIFNPRlRXQVJFLgo+ID4gKyAqCj4gPiArICogQXV0aG9yczoKPiA+ICsgKsKgwqDCoMKg THl1ZGUgUGF1bCA8bHl1ZGVAcmVkaGF0LmNvbT4KPiA+ICsgKi8KPiA+ICsKPiA+ICsjaW5jbHVk ZSAiY29uZmlnLmgiCj4gPiArI2luY2x1ZGUgImlndC5oIgo+ID4gKwo+ID4gKyNpbmNsdWRlIDxm Y250bC5oPgo+ID4gKyNpbmNsdWRlIDxzdHJpbmcuaD4KPiA+ICsKPiA+ICtzdHJ1Y3QgY29ubmVj dG9yX2luZm8gewo+ID4gKwlpbnQgaWQ7Cj4gPiArCXVuc2lnbmVkIGludCB0eXBlOwo+ID4gK307 Cj4gPiArCj4gPiArdHlwZWRlZiBzdHJ1Y3Qgewo+ID4gKwlpbnQgZHJtX2ZkOwo+ID4gKwlzdHJ1 Y3QgY29ubmVjdG9yX2luZm8gKmNvbm5lY3RvcnM7Cj4gPiArCWludCBjb25uZWN0b3JfY291bnQ7 Cj4gPiArfSBkYXRhX3Q7Cj4gPiArCj4gPiArI2RlZmluZSBIT1RQTFVHX1RJTUVPVVQgMzAgLyog c2Vjb25kcyAqLwo+ID4gKwo+ID4gKy8qCj4gPiArICogU2luY2Ugd2UgY2FuJ3QgZ2V0IGFuIGV4 YWN0IG1hcHBpbmcgb2Ygd2hpY2ggY2hhbWVsaXVtIHBvcnRzCj4gPiBhcmUgY29ubmVjdGVkCj4g PiArICogdG8gZWFjaCBvZiB0aGUgRFVUJ3MgcG9ydHMsIHdlIGhhdmUgdG8gZmlndXJlIG91dCB3 aGV0aGVyIG9yCj4gPiBub3QgdGhlIHN0YXR1cwo+ID4gKyAqIG9mIGEgcG9ydCBvbiB0aGUgY2hh bWVsaXVtIGhhcyBjaGFuZ2VkIGJ5IGNvdW50aW5nIHRoZSBudW1iZXIKPiA+IG9mIGNvbm5lY3Rv cnMKPiA+ICsgKiB3aXRoIHRoZSBjb25uZWN0b3IgdHlwZSBhbmQgc3RhdHVzIHdlIHdhbnQsIGFu ZCB0aGVuIGNvbXBhcmluZwo+ID4gdGhlIHZhbHVlcwo+ID4gKyAqIGZyb20gYmVmb3JlIGhvdHBs dWdnaW5nIGFuZCBhZnRlcgo+ID4gKyAqLwo+ID4gK3N0YXRpYyB2b2lkCj4gPiArcmVwcm9iZV9j b25uZWN0b3JzKGRhdGFfdCAqZGF0YSwgdW5zaWduZWQgaW50IHR5cGUpCj4gPiArewo+ID4gKwlk cm1Nb2RlQ29ubmVjdG9yICpjb25uZWN0b3I7Cj4gPiArCWludCBpOwo+ID4gKwo+ID4gKwlpZ3Rf ZGVidWcoIlJlcHJvYmluZyAlcyBjb25uZWN0b3JzLi4uXG4iLAo+ID4gKwkJwqDCoGttc3Rlc3Rf Y29ubmVjdG9yX3R5cGVfc3RyKHR5cGUpKTsKPiA+ICsKPiA+ICsJZm9yIChpID0gMDsgaSA8IGRh dGEtPmNvbm5lY3Rvcl9jb3VudDsgaSsrKSB7Cj4gPiArCQlpZiAoZGF0YS0+Y29ubmVjdG9yc1tp XS50eXBlICE9IHR5cGUpCj4gPiArCQkJY29udGludWU7Cj4gPiArCj4gPiArCQljb25uZWN0b3Ig PSBkcm1Nb2RlR2V0Q29ubmVjdG9yKGRhdGEtPmRybV9mZCwKPiA+ICsJCQkJCQlkYXRhLQo+ID4g PmNvbm5lY3RvcnNbaV0uaWQpOwo+ID4gKwkJaWd0X2Fzc2VydChjb25uZWN0b3IpOwo+ID4gKwo+ ID4gKwkJZHJtTW9kZUZyZWVDb25uZWN0b3IoY29ubmVjdG9yKTsKPiA+ICsJfQo+ID4gK30KPiA+ ICsKPiA+ICtzdGF0aWMgdm9pZAo+ID4gK3Jlc2V0X2NoYW1lbGl1bV9zdGF0ZShkYXRhX3QgKmRh dGEpCj4gPiArewo+ID4gKwljaGFtZWxpdW1fcmVzZXQoKTsKPiA+ICsJcmVwcm9iZV9jb25uZWN0 b3JzKGRhdGEsIERSTV9NT0RFX0NPTk5FQ1RPUl9EaXNwbGF5UG9ydCk7Cj4gPiArCXJlcHJvYmVf Y29ubmVjdG9ycyhkYXRhLCBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUEpOwo+ID4gKwlyZXByb2Jl X2Nvbm5lY3RvcnMoZGF0YSwgRFJNX01PREVfQ09OTkVDVE9SX1ZHQSk7Cj4gPiArfQo+ID4gKwo+ ID4gK3N0YXRpYyBpbnQKPiA+ICtjb25uZWN0b3Jfc3RhdHVzX2NvdW50KGRhdGFfdCAqZGF0YSwg dW5zaWduZWQgaW50IHR5cGUsIHVuc2lnbmVkCj4gPiBpbnQgc3RhdHVzKQo+ID4gK3sKPiA+ICsJ c3RydWN0IGNvbm5lY3Rvcl9pbmZvICppbmZvOwo+ID4gKwlkcm1Nb2RlQ29ubmVjdG9yICpjb25u ZWN0b3I7Cj4gPiArCWludCBjb3VudCA9IDA7Cj4gPiArCj4gPiArCWZvciAoaW50IGkgPSAwOyBp IDwgZGF0YS0+Y29ubmVjdG9yX2NvdW50OyBpKyspIHsKPiA+ICsJCWluZm8gPSAmZGF0YS0+Y29u bmVjdG9yc1tpXTsKPiA+ICsJCWlmIChpbmZvLT50eXBlICE9IHR5cGUpCj4gPiArCQkJY29udGlu dWU7Cj4gPiArCj4gPiArCQljb25uZWN0b3IgPSBkcm1Nb2RlR2V0Q29ubmVjdG9yQ3VycmVudChk YXRhLQo+ID4gPmRybV9mZCwgaW5mby0+aWQpOwo+ID4gKwkJaWd0X2Fzc2VydChjb25uZWN0b3Ip Owo+ID4gKwo+ID4gKwkJaWYgKGNvbm5lY3Rvci0+Y29ubmVjdGlvbiA9PSBzdGF0dXMpCj4gPiAr CQkJY291bnQrKzsKPiA+ICsKPiA+ICsJCWRybU1vZGVGcmVlQ29ubmVjdG9yKGNvbm5lY3Rvcik7 Cj4gPiArCX0KPiA+ICsKPiA+ICsJcmV0dXJuIGNvdW50Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0 aWMgdm9pZAo+ID4gK3JlcXVpcmVfY29ubmVjdG9yX3ByZXNlbnQoZGF0YV90ICpkYXRhLCB1bnNp Z25lZCBpbnQgdHlwZSkKPiA+ICt7Cj4gPiArCWludCBpOwo+ID4gKwlib29sIGZvdW5kID0gZmFs c2U7Cj4gPiArCj4gPiArCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5jb25uZWN0b3JfY291bnQgJiYg IWZvdW5kOyBpKyspIHsKPiA+ICsJCWlmIChkYXRhLT5jb25uZWN0b3JzW2ldLnR5cGUgPT0gdHlw ZSkKPiA+ICsJCQlmb3VuZCA9IHRydWU7Cj4gPiArCX0KPiA+ICsKPiA+ICsJaWd0X3JlcXVpcmVf Zihmb3VuZCwgIk5vIHBvcnQgb2YgdHlwZSAlcyB3YXMgZm91bmQgb24gdGhlCj4gPiBzeXN0ZW1c biIsCj4gPiArCQnCoMKgwqDCoMKgwqBrbXN0ZXN0X2Nvbm5lY3Rvcl90eXBlX3N0cih0eXBlKSk7 Cj4gPiArCj4gPiArCWZvciAoaSA9IDAsIGZvdW5kID0gZmFsc2U7IGkgPCBjaGFtZWxpdW1fcG9y dF9jb3VudCAmJgo+ID4gIWZvdW5kOyBpKyspIHsKPiA+ICsJCWlmIChjaGFtZWxpdW1fcG9ydHNb aV0udHlwZSA9PSB0eXBlKQo+ID4gKwkJCWZvdW5kID0gdHJ1ZTsKPiA+ICsJfQo+ID4gKwo+ID4g KwlpZ3RfcmVxdWlyZV9mKGZvdW5kLCAiTm8gY29ubmVjdGVkIHBvcnQgb2YgdHlwZSAlcyB3YXMK PiA+IGZvdW5kIG9uIHRoZSBjaGFtZWxpdW1cbiIsCj4gPiArCQnCoMKgwqDCoMKgwqBrbXN0ZXN0 X2Nvbm5lY3Rvcl90eXBlX3N0cih0eXBlKSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBkcm1N b2RlQ29ubmVjdG9yICoKPiA+ICtmaW5kX2Nvbm5lY3RlZChkYXRhX3QgKmRhdGEsIHVuc2lnbmVk IGludCB0eXBlKQo+ID4gK3sKPiA+ICsJZHJtTW9kZUNvbm5lY3RvciAqY29ubmVjdG9yOwo+ID4g KwlpbnQgaTsKPiA+ICsKPiA+ICsJZm9yIChpID0gMDsgaSA8IGRhdGEtPmNvbm5lY3Rvcl9jb3Vu dDsgaSsrKSB7Cj4gPiArCQlpZiAoZGF0YS0+Y29ubmVjdG9yc1tpXS50eXBlICE9IHR5cGUpCj4g PiArCQkJY29udGludWU7Cj4gPiArCj4gPiArCQljb25uZWN0b3IgPSBkcm1Nb2RlR2V0Q29ubmVj dG9yKGRhdGEtPmRybV9mZCwKPiA+ICsJCQkJCQlkYXRhLQo+ID4gPmNvbm5lY3RvcnNbaV0uaWQp Owo+ID4gKwkJaWd0X2Fzc2VydChjb25uZWN0b3IpOwo+ID4gKwo+ID4gKwkJaWYgKGNvbm5lY3Rv ci0+Y29ubmVjdGlvbiA9PSBEUk1fTU9ERV9DT05ORUNURUQpCj4gPiArCQkJcmV0dXJuIGNvbm5l Y3RvcjsKPiA+ICsKPiA+ICsJCWRybU1vZGVGcmVlQ29ubmVjdG9yKGNvbm5lY3Rvcik7Cj4gPiAr CX0KPiA+ICsKPiA+ICsJcmV0dXJuIE5VTEw7Cj4gPiArfQo+ID4gKwo+ID4gKy8qCj4gPiArICog U2tpcHMgdGhlIHRlc3QgaWYgd2UgZmluZCBhbnkgY29ubmVjdG9ycyB3aXRoIGEgbWF0Y2hpbmcg dHlwZQo+ID4gY29ubmVjdGVkLgo+ID4gKyAqIFRoaXMgaXMgbmVjZXNzYXJ5IHdoZW4gd2UgbmVl ZCB0byBpZGVudGlmeSB3aGljaCBwb3J0IG9uIHRoZQo+ID4gbWFjaGluZSBpcwo+ID4gKyAqIGNv bm5lY3RlZCB0byB3aGljaCBwb3J0IG9uIHRoZSBjaGFtZWxpdW0sIHNpbmNlIGFueSBvdGhlciBw b3J0cwo+ID4gdGhhdCBhcmUKPiA+ICsgKiBjb25uZWN0ZWQgdG8gb3RoZXIgZGlzcGxheXMgY291 bGQgY2F1c2UgdXMgdG8gY2hvb3NlIHRoZSB3cm9uZwo+ID4gcG9ydC4KPiA+ICsgKgo+ID4gKyAq IFRoaXMgYWxzbyBoYXMgdGhlIGVmZmVjdCBvZiByZXByb2JpbmcgYWxsIG9mIHRoZSBjb25uZWN0 ZWQKPiA+IHBvcnRzLgo+ID4gKyAqLwo+ID4gK3N0YXRpYyB2b2lkCj4gPiArc2tpcF9vbl9hbnlf Y29ubmVjdGVkKGRhdGFfdCAqZGF0YSwgdW5zaWduZWQgaW50IHR5cGUpCj4gPiArewo+ID4gKwlk cm1Nb2RlQ29ubmVjdG9yICpjb25uZWN0b3I7Cj4gPiArCj4gPiArCWNvbm5lY3RvciA9IGZpbmRf Y29ubmVjdGVkKGRhdGEsIHR5cGUpOwo+ID4gKwlpZiAoY29ubmVjdG9yKQo+ID4gKwkJZHJtTW9k ZUZyZWVDb25uZWN0b3IoY29ubmVjdG9yKTsKPiA+ICsKPiA+ICsJaWd0X3NraXBfb24oY29ubmVj dG9yKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQKPiA+ICt0ZXN0X2Jhc2ljX2hvdHBs dWcoZGF0YV90ICpkYXRhLCBzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQpCj4gPiArewo+ID4g KwlpbnQgYmVmb3JlLCBhZnRlcjsKPiA+ICsJaW50IGk7Cj4gPiArCj4gPiArCXJlc2V0X2NoYW1l bGl1bV9zdGF0ZShkYXRhKTsKPiA+ICsJaWd0X3dhdGNoX2hvdHBsdWcoKTsKPiA+ICsKPiA+ICsJ Zm9yIChpID0gMDsgaSA8IDE1OyBpKyspIHsKPiA+ICsJCWlndF9mbHVzaF9ob3RwbHVncygpOwo+ ID4gKwo+ID4gKwkJLyogQ2hlY2sgaWYgd2UgZ2V0IGEgc3lzZnMgaG90cGx1ZyBldmVudCAqLwo+ ID4gKwkJYmVmb3JlID0gY29ubmVjdG9yX3N0YXR1c19jb3VudChkYXRhLCBwb3J0LT50eXBlLAo+ ID4gKwkJCQkJCURSTV9NT0RFX0NPTk5FQ1RFRAo+ID4gKTsKPiA+ICsJCWNoYW1lbGl1bV9wbHVn KHBvcnQtPmlkKTsKPiA+ICsJCWlndF9hc3NlcnQoaWd0X2hvdHBsdWdfZGV0ZWN0ZWQoSE9UUExV R19USU1FT1VUKSk7Cj4gPiArCj4gPiArCQkvKiBOb3cgd2Ugc2hvdWxkIGhhdmUgb25lIGFkZGl0 aW9uYWwgcG9ydAo+ID4gY29ubmVjdGVkICovCj4gPiArCQlyZXByb2JlX2Nvbm5lY3RvcnMoZGF0 YSwgcG9ydC0+dHlwZSk7Cj4gPiArCQlhZnRlciA9IGNvbm5lY3Rvcl9zdGF0dXNfY291bnQoZGF0 YSwgcG9ydC0+dHlwZSwKPiA+ICsJCQkJCcKgwqDCoMKgwqDCoMKgRFJNX01PREVfQ09OTkVDVEVE KQo+ID4gOwo+ID4gKwkJaWd0X2Fzc2VydF9sdChiZWZvcmUsIGFmdGVyKTsKPiA+ICsKPiA+ICsJ CWlndF9mbHVzaF9ob3RwbHVncygpOwo+ID4gKwo+ID4gKwkJLyogTm93IGNoZWNrIGlmIHdlIGdl dCBhIGhvdHBsdWcgZnJvbQo+ID4gZGlzY29ubmVjdGlvbiAqLwo+ID4gKwkJYmVmb3JlID0gY29u bmVjdG9yX3N0YXR1c19jb3VudChkYXRhLCBwb3J0LT50eXBlLAo+ID4gKwkJCQkJCURSTV9NT0RF X0RJU0NPTk5FQwo+ID4gVEVEKTsKPiA+ICsJCWNoYW1lbGl1bV91bnBsdWcocG9ydC0+aWQpOwo+ ID4gKwkJaWd0X2Fzc2VydChpZ3RfaG90cGx1Z19kZXRlY3RlZChIT1RQTFVHX1RJTUVPVVQpKTsK PiA+ICsKPiA+ICsJCS8qIEFuZCBtYWtlIHN1cmUgd2Ugbm93IGhhdmUgb25lIG1vcmUgZGlzY29u bmVjdGVkCj4gPiBwb3J0ICovCj4gPiArCQlyZXByb2JlX2Nvbm5lY3RvcnMoZGF0YSwgcG9ydC0+ dHlwZSk7Cj4gPiArCQlhZnRlciA9IGNvbm5lY3Rvcl9zdGF0dXNfY291bnQoZGF0YSwgcG9ydC0+ dHlwZSwKPiA+ICsJCQkJCcKgwqDCoMKgwqDCoMKgRFJNX01PREVfRElTQ09OTkVDVAo+ID4gRUQp Owo+ID4gKwkJaWd0X2Fzc2VydF9sdChiZWZvcmUsIGFmdGVyKTsKPiA+ICsKPiA+ICsJCS8qIFNs ZWVwIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSBjYXVzZSBhbiBocGQKPiA+IHN0b3JtICovCj4g PiArCQlzbGVlcCgxKTsKPiA+ICsJfQo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZAo+ID4g K3Rlc3RfZWRpZF9yZWFkKGRhdGFfdCAqZGF0YSwgc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0 LAo+ID4gKwnCoMKgwqDCoMKgwqDCoGludCBlZGlkX2lkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpl ZGlkKQo+ID4gK3sKPiA+ICsJZHJtTW9kZUNvbm5lY3RvciAqY29ubmVjdG9yOwo+ID4gKwlkcm1N b2RlT2JqZWN0UHJvcGVydGllcyAqcHJvcHM7Cj4gPiArCWRybU1vZGVQcm9wZXJ0eUJsb2JQdHIg ZWRpZF9ibG9iID0gTlVMTDsKPiA+ICsJYm9vbCBlZGlkX2ZvdW5kID0gZmFsc2U7Cj4gPiArCWlu dCBpOwo+ID4gKwo+ID4gKwlyZXNldF9jaGFtZWxpdW1fc3RhdGUoZGF0YSk7Cj4gPiArCXNraXBf b25fYW55X2Nvbm5lY3RlZChkYXRhLCBwb3J0LT50eXBlKTsKPiA+ICsKPiA+ICsJY2hhbWVsaXVt X3BvcnRfc2V0X2VkaWQocG9ydC0+aWQsIGVkaWRfaWQpOwo+ID4gKwljaGFtZWxpdW1fcGx1Zyhw b3J0LT5pZCk7Cj4gPiArCXNsZWVwKDEpOwo+ID4gKwlpZ3RfYXNzZXJ0KGNvbm5lY3RvciA9IGZp bmRfY29ubmVjdGVkKGRhdGEsIHBvcnQtPnR5cGUpKTsKPiA+ICsKPiA+ICsJcHJvcHMgPSBkcm1N b2RlT2JqZWN0R2V0UHJvcGVydGllcyhkYXRhLT5kcm1fZmQsCj4gPiArCQkJCQnCoMKgwqBjb25u ZWN0b3ItCj4gPiA+Y29ubmVjdG9yX2lkLAo+ID4gKwkJCQkJwqDCoMKgRFJNX01PREVfT0JKRUNU X0NPTk5FQ1QKPiA+IE9SKTsKPiA+ICsJaWd0X2Fzc2VydChwcm9wcyk7Cj4gPiArCj4gPiArCS8q IEdldCB0aGUgZWRpZCAqLwo+ID4gKwlmb3IgKGkgPSAwOyBpIDwgcHJvcHMtPmNvdW50X3Byb3Bz ICYmICFlZGlkX2Jsb2I7IGkrKykgewo+ID4gKwkJZHJtTW9kZVByb3BlcnR5UHRyIHByb3AgPQo+ ID4gKwkJCWRybU1vZGVHZXRQcm9wZXJ0eShkYXRhLT5kcm1fZmQsCj4gPiArCQkJCQnCoMKgwqBw cm9wcy0+cHJvcHNbaV0pOwo+ID4gKwo+ID4gKwkJaWd0X2Fzc2VydChwcm9wKTsKPiA+ICsKPiA+ ICsJCWlmIChzdHJjbXAocHJvcC0+bmFtZSwgIkVESUQiKSA9PSAwKSB7Cj4gPiArCQkJZWRpZF9i bG9iID0gZHJtTW9kZUdldFByb3BlcnR5QmxvYigKPiA+ICsJCQnCoMKgwqDCoGRhdGEtPmRybV9m ZCwgcHJvcHMtPnByb3BfdmFsdWVzW2ldKTsKPiA+ICsJCX0KPiA+ICsKPiA+ICsJCWRybU1vZGVG cmVlUHJvcGVydHkocHJvcCk7Cj4gPiArCX0KPiA+ICsKPiA+ICsJLyogQW5kIG1ha2Ugc3VyZSBp dCBtYXRjaGVzIHRvIHdoYXQgd2UgZXhwZWN0ZWQgKi8KPiA+ICsJZWRpZF9mb3VuZCA9IG1lbWNt cChlZGlkLCBlZGlkX2Jsb2ItPmRhdGEsIEVESURfTEVOR1RIKSA9PQo+ID4gMDsKPiA+ICsKPiA+ ICsJZHJtTW9kZUZyZWVQcm9wZXJ0eUJsb2IoZWRpZF9ibG9iKTsKPiA+ICsJZHJtTW9kZUZyZWVP YmplY3RQcm9wZXJ0aWVzKHByb3BzKTsKPiA+ICsJZHJtTW9kZUZyZWVDb25uZWN0b3IoY29ubmVj dG9yKTsKPiA+ICsKPiA+ICsJaWd0X2Fzc2VydChlZGlkX2ZvdW5kKTsKPiA+ICt9Cj4gPiArCj4g PiArc3RhdGljIHZvaWQKPiA+ICt0ZXN0X3N1c3BlbmRfcmVzdW1lX2hwZChkYXRhX3QgKmRhdGEs IHN0cnVjdCBjaGFtZWxpdW1fcG9ydCAqcG9ydCwKPiA+ICsJCQllbnVtIGlndF9zdXNwZW5kX3N0 YXRlIHN0YXRlLAo+ID4gKwkJCWVudW0gaWd0X3N1c3BlbmRfdGVzdCB0ZXN0KQo+ID4gK3sKPiA+ ICsJaW50IGJlZm9yZSwgYWZ0ZXI7Cj4gPiArCWludCBkZWxheSA9IDc7Cj4gPiArCj4gPiArCWln dF9za2lwX3dpdGhvdXRfc3VzcGVuZF9zdXBwb3J0KHN0YXRlLCB0ZXN0KTsKPiA+ICsJcmVzZXRf Y2hhbWVsaXVtX3N0YXRlKGRhdGEpOwo+ID4gKwlpZ3Rfd2F0Y2hfaG90cGx1ZygpOwo+ID4gKwo+ ID4gKwlpZ3Rfc2V0X2F1dG9yZXN1bWVfZGVsYXkoMTUpOwo+ID4gKwo+ID4gKwkvKiBNYWtlIHN1 cmUgd2Ugbm90aWNlIG5ldyBjb25uZWN0b3JzIGFmdGVyIHJlc3VtaW5nICovCj4gPiArCWJlZm9y ZSA9IGNvbm5lY3Rvcl9zdGF0dXNfY291bnQoZGF0YSwgcG9ydC0+dHlwZSwKPiA+IERSTV9NT0RF X0NPTk5FQ1RFRCk7Cj4gPiArCXNsZWVwKDEpOwo+ID4gKwlpZ3RfZmx1c2hfaG90cGx1Z3MoKTsK PiA+ICsKPiA+ICsJY2hhbWVsaXVtX2FzeW5jX2hwZF9wdWxzZV9zdGFydChwb3J0LT5pZCwgZmFs c2UsIGRlbGF5KTsKPiA+ICsJaWd0X3N5c3RlbV9zdXNwZW5kX2F1dG9yZXN1bWUoc3RhdGUsIHRl c3QpOwo+ID4gKwljaGFtZWxpdW1fYXN5bmNfaHBkX3B1bHNlX2ZpbmlzaCgpOwo+ID4gKwo+ID4g KwlpZ3RfYXNzZXJ0KGlndF9ob3RwbHVnX2RldGVjdGVkKEhPVFBMVUdfVElNRU9VVCkpOwo+ID4g Kwo+ID4gKwlyZXByb2JlX2Nvbm5lY3RvcnMoZGF0YSwgcG9ydC0+dHlwZSk7Cj4gPiArCWFmdGVy ID0gY29ubmVjdG9yX3N0YXR1c19jb3VudChkYXRhLCBwb3J0LT50eXBlLAo+ID4gRFJNX01PREVf Q09OTkVDVEVEKTsKPiA+ICsJaWd0X2Fzc2VydF9sdChiZWZvcmUsIGFmdGVyKTsKPiA+ICsKPiA+ ICsJaWd0X2ZsdXNoX2hvdHBsdWdzKCk7Cj4gPiArCj4gPiArCS8qIE5vdyBtYWtlIHN1cmUgd2Ug bm90aWNlIGRpc2Nvbm5lY3RlZCBjb25uZWN0b3JzIGFmdGVyCj4gPiByZXN1bWluZyAqLwo+ID4g KwliZWZvcmUgPSBjb25uZWN0b3Jfc3RhdHVzX2NvdW50KGRhdGEsIHBvcnQtPnR5cGUsCj4gPiBE Uk1fTU9ERV9ESVNDT05ORUNURUQpOwo+ID4gKwo+ID4gKwljaGFtZWxpdW1fYXN5bmNfaHBkX3B1 bHNlX3N0YXJ0KHBvcnQtPmlkLCB0cnVlLCBkZWxheSk7Cj4gPiArCWlndF9zeXN0ZW1fc3VzcGVu ZF9hdXRvcmVzdW1lKHN0YXRlLCB0ZXN0KTsKPiA+ICsJY2hhbWVsaXVtX2FzeW5jX2hwZF9wdWxz ZV9maW5pc2goKTsKPiA+ICsKPiA+ICsJaWd0X2Fzc2VydChpZ3RfaG90cGx1Z19kZXRlY3RlZChI T1RQTFVHX1RJTUVPVVQpKTsKPiA+ICsKPiA+ICsJcmVwcm9iZV9jb25uZWN0b3JzKGRhdGEsIHBv cnQtPnR5cGUpOwo+ID4gKwlhZnRlciA9IGNvbm5lY3Rvcl9zdGF0dXNfY291bnQoZGF0YSwgcG9y dC0+dHlwZSwKPiA+IERSTV9NT0RFX0RJU0NPTk5FQ1RFRCk7Cj4gPiArCWlndF9hc3NlcnRfbHQo YmVmb3JlLCBhZnRlcik7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkCj4gPiArdGVzdF9z dXNwZW5kX3Jlc3VtZV9lZGlkX2NoYW5nZShkYXRhX3QgKmRhdGEsIHN0cnVjdAo+ID4gY2hhbWVs aXVtX3BvcnQgKnBvcnQsCj4gPiArCQkJCWVudW0gaWd0X3N1c3BlbmRfc3RhdGUgc3RhdGUsCj4g PiArCQkJCWVudW0gaWd0X3N1c3BlbmRfdGVzdCB0ZXN0LAo+ID4gKwkJCQlpbnQgZWRpZF9pZCwK PiA+ICsJCQkJaW50IGFsdF9lZGlkX2lkKQo+ID4gK3sKPiA+ICsJaWd0X3NraXBfd2l0aG91dF9z dXNwZW5kX3N1cHBvcnQoc3RhdGUsIHRlc3QpOwo+ID4gKwlyZXNldF9jaGFtZWxpdW1fc3RhdGUo ZGF0YSk7Cj4gPiArCWlndF93YXRjaF9ob3RwbHVnKCk7Cj4gPiArCj4gPiArCS8qIEZpcnN0IHBs dWcgaW4gdGhlIHBvcnQgKi8KPiA+ICsJY2hhbWVsaXVtX3BvcnRfc2V0X2VkaWQocG9ydC0+aWQs IGVkaWRfaWQpOwo+ID4gKwljaGFtZWxpdW1fcGx1Zyhwb3J0LT5pZCk7Cj4gPiArCj4gPiArCXJl cHJvYmVfY29ubmVjdG9ycyhkYXRhLCBwb3J0LT50eXBlKTsKPiA+ICsJc2xlZXAoMSk7Cj4gPiAr CWlndF9mbHVzaF9ob3RwbHVncygpOwo+ID4gKwo+ID4gKwkvKgo+ID4gKwnCoCogQ2hhbmdlIHRo ZSBlZGlkIGJlZm9yZSB3ZSBzdXNwZW5kLiBPbiByZXN1bWUsIHRoZQo+ID4gbWFjaGluZSBzaG91 bGQKPiA+ICsJwqAqIG5vdGljZSB0aGUgRURJRCBjaGFuZ2UgYW5kIGZpcmUgYSBob3RwbHVnIGV2 ZW50Lgo+ID4gKwnCoCovCj4gPiArCWNoYW1lbGl1bV9wb3J0X3NldF9lZGlkKHBvcnQtPmlkLCBh bHRfZWRpZF9pZCk7Cj4gPiArCj4gPiArCWlndF9zeXN0ZW1fc3VzcGVuZF9hdXRvcmVzdW1lKHN0 YXRlLCB0ZXN0KTsKPiA+ICsJaWd0X2Fzc2VydChpZ3RfaG90cGx1Z19kZXRlY3RlZChIT1RQTFVH X1RJTUVPVVQpKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQKPiA+ICt0ZXN0X2Rpc3Bs YXkoZGF0YV90ICpkYXRhLCBzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQgKnBvcnQpCj4gPiArewo+ID4g KwlpZ3RfZGlzcGxheV90IGRpc3BsYXk7Cj4gPiArCWlndF9vdXRwdXRfdCAqb3V0cHV0Owo+ID4g KwlpZ3RfcGxhbmVfdCAqcHJpbWFyeTsKPiA+ICsJc3RydWN0IGlndF9mYiBmYjsKPiA+ICsJZHJt TW9kZVJlcyAqcmVzOwo+ID4gKwlkcm1Nb2RlTW9kZUluZm8gKm1vZGU7Cj4gPiArCWludCBjb25u ZWN0b3JfZm91bmQgPSBmYWxzZSwgZmJfaWQ7Cj4gPiArCj4gPiArCWNoYW1lbGl1bV9wbHVnKHBv cnQtPmlkKTsKPiA+ICsJaWd0X2Fzc2VydChyZXMgPSBkcm1Nb2RlR2V0UmVzb3VyY2VzKGRhdGEt PmRybV9mZCkpOwo+ID4gKwlrbXN0ZXN0X3Vuc2V0X2FsbF9jcnRjcyhkYXRhLT5kcm1fZmQsIHJl cyk7Cj4gPiArCj4gPiArCWlndF9kaXNwbGF5X2luaXQoJmRpc3BsYXksIGRhdGEtPmRybV9mZCk7 Cj4gPiArCj4gPiArCS8qIEZpbmQgdGhlIGFjdGl2ZSBjb25uZWN0b3IgKi8KPiA+ICsJZm9yX2Vh Y2hfY29ubmVjdGVkX291dHB1dCgmZGlzcGxheSwgb3V0cHV0KSB7Cj4gPiArCQlkcm1Nb2RlQ29u bmVjdG9yICpjb25uZWN0b3IgPSBvdXRwdXQtCj4gPiA+Y29uZmlnLmNvbm5lY3RvcjsKPiA+ICsK PiA+ICsJCWlmIChjb25uZWN0b3IgJiYgY29ubmVjdG9yLT5jb25uZWN0b3JfdHlwZSA9PQo+ID4g cG9ydC0+dHlwZSAmJgo+ID4gKwkJwqDCoMKgwqBjb25uZWN0b3ItPmNvbm5lY3Rpb24gPT0gRFJN X01PREVfQ09OTkVDVEVEKSB7Cj4gPiArCQkJY29ubmVjdG9yX2ZvdW5kID0gdHJ1ZTsKPiA+ICsJ CQlicmVhazsKPiA+ICsJCX0KPiA+ICsJfQo+ID4gKwlpZ3RfYXNzZXJ0KGNvbm5lY3Rvcl9mb3Vu ZCk7Cj4gPiArCj4gPiArCS8qIFNldHVwIHRoZSBkaXNwbGF5ICovCj4gPiArCWlndF9vdXRwdXRf c2V0X3BpcGUob3V0cHV0LCBQSVBFX0EpOwo+ID4gKwltb2RlID0gaWd0X291dHB1dF9nZXRfbW9k ZShvdXRwdXQpOwo+ID4gKwlwcmltYXJ5ID0gaWd0X291dHB1dF9nZXRfcGxhbmUob3V0cHV0LCBJ R1RfUExBTkVfUFJJTUFSWSk7Cj4gPiArCWlndF9hc3NlcnQocHJpbWFyeSk7Cj4gPiArCj4gPiAr CWZiX2lkID0gaWd0X2NyZWF0ZV9wYXR0ZXJuX2ZiKGRhdGEtPmRybV9mZCwKPiA+ICsJCQkJwqDC oMKgwqDCoMKgbW9kZS0+aGRpc3BsYXksCj4gPiArCQkJCcKgwqDCoMKgwqDCoG1vZGUtPnZkaXNw bGF5LAo+ID4gKwkJCQnCoMKgwqDCoMKgwqBEUk1fRk9STUFUX1hSR0I4ODg4LAo+ID4gKwkJCQnC oMKgwqDCoMKgwqBMT0NBTF9EUk1fRk9STUFUX01PRF9OT05FLAo+ID4gKwkJCQnCoMKgwqDCoMKg wqAmZmIpOwo+ID4gKwlpZ3RfYXNzZXJ0KGZiX2lkID4gMCk7Cj4gPiArCWlndF9wbGFuZV9zZXRf ZmIocHJpbWFyeSwgJmZiKTsKPiA+ICsKPiA+ICsJaWd0X2Rpc3BsYXlfY29tbWl0KCZkaXNwbGF5 KTsKPiA+ICsKPiA+ICsJaWd0X2Fzc2VydChjaGFtZWxpdW1fcG9ydF93YWl0X3ZpZGVvX2lucHV0 X3N0YWJsZShwb3J0LQo+ID4gPmlkLAo+ID4gKwkJCQkJCQnCoMKgSE9UUExVR18KPiA+IFRJTUVP VVQpKTsKPiA+ICsKPiA+ICsJZHJtTW9kZUZyZWVSZXNvdXJjZXMocmVzKTsKPiA+ICsJaWd0X2Rp c3BsYXlfZmluaSgmZGlzcGxheSk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkCj4gPiAr dGVzdF9ocGRfd2l0aG91dF9kZGMoZGF0YV90ICpkYXRhLCBzdHJ1Y3QgY2hhbWVsaXVtX3BvcnQg KnBvcnQpCj4gPiArewo+ID4gKwlyZXNldF9jaGFtZWxpdW1fc3RhdGUoZGF0YSk7Cj4gPiArCWln dF93YXRjaF9ob3RwbHVnKCk7Cj4gPiArCj4gPiArCS8qIERpc2FibGUgdGhlIEREQyBvbiB0aGUg Y29ubmVjdG9yIGFuZCBtYWtlIHN1cmUgd2Ugc3RpbGwKPiA+IGdldCBhCj4gPiArCcKgKiBob3Rw bHVnCj4gPiArCcKgKi8KPiA+ICsJY2hhbWVsaXVtX3BvcnRfc2V0X2RkY19zdGF0ZShwb3J0LT5p ZCwgZmFsc2UpOwo+ID4gKwljaGFtZWxpdW1fcGx1Zyhwb3J0LT5pZCk7Cj4gPiArCj4gPiArCWln dF9hc3NlcnQoaWd0X2hvdHBsdWdfZGV0ZWN0ZWQoSE9UUExVR19USU1FT1VUKSk7Cj4gPiArfQo+ ID4gKwo+ID4gK3N0YXRpYyB2b2lkCj4gPiArY2FjaGVfY29ubmVjdG9yX2luZm8oZGF0YV90ICpk YXRhKQo+ID4gK3sKPiA+ICsJZHJtTW9kZVJlcyAqcmVzID0gZHJtTW9kZUdldFJlc291cmNlcyhk YXRhLT5kcm1fZmQpOwo+ID4gKwlkcm1Nb2RlQ29ubmVjdG9yICpjb25uZWN0b3I7Cj4gPiArCWlu dCBpOwo+ID4gKwo+ID4gKwlpZ3RfYXNzZXJ0KHJlcyk7Cj4gPiArCj4gPiArCWRhdGEtPmNvbm5l Y3Rvcl9jb3VudCA9IHJlcy0+Y291bnRfY29ubmVjdG9yczsKPiA+ICsJZGF0YS0+Y29ubmVjdG9y cyA9IGNhbGxvYyhzaXplb2Yoc3RydWN0IGNvbm5lY3Rvcl9pbmZvKSwKPiA+ICsJCQkJwqDCoHJl cy0+Y291bnRfY29ubmVjdG9ycyk7Cj4gPiArCWlndF9hc3NlcnQoZGF0YS0+Y29ubmVjdG9ycyk7 Cj4gPiArCj4gPiArCWZvciAoaSA9IDA7IGkgPCByZXMtPmNvdW50X2Nvbm5lY3RvcnM7IGkrKykg ewo+ID4gKwkJY29ubmVjdG9yID0gZHJtTW9kZUdldENvbm5lY3RvckN1cnJlbnQoZGF0YS0KPiA+ ID5kcm1fZmQsCj4gPiArCQkJCQkJwqDCoMKgwqDCoMKgwqByZXMtCj4gPiA+Y29ubmVjdG9yc1tp XSk7Cj4gPiArCQlpZ3RfYXNzZXJ0KGNvbm5lY3Rvcik7Cj4gPiArCj4gPiArCQlkYXRhLT5jb25u ZWN0b3JzW2ldLmlkID0gY29ubmVjdG9yLT5jb25uZWN0b3JfaWQ7Cj4gPiArCQlkYXRhLT5jb25u ZWN0b3JzW2ldLnR5cGUgPSBjb25uZWN0b3ItCj4gPiA+Y29ubmVjdG9yX3R5cGU7Cj4gPiArCj4g PiArCQlkcm1Nb2RlRnJlZUNvbm5lY3Rvcihjb25uZWN0b3IpOwo+ID4gKwl9Cj4gPiArCj4gPiAr CWRybU1vZGVGcmVlUmVzb3VyY2VzKHJlcyk7Cj4gPiArfQo+ID4gKwo+ID4gKyNkZWZpbmUgZm9y X2VhY2hfcG9ydChwLCBwb3J0KcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwK PiA+ICsJZm9yIChwID0gMCwgcG9ydCA9ICZjaGFtZWxpdW1fcG9ydHNbcF07IFwKPiA+ICsJwqDC oMKgwqDCoHAgPCBjaGFtZWxpdW1fcG9ydF9jb3VudDvCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiA+ ICsJwqDCoMKgwqDCoHArKywgcG9ydCA9ICZjaGFtZWxpdW1fcG9ydHNbcF0pwqDCoMKgXAo+ID4g Kwo+ID4gKyNkZWZpbmUgY29ubmVjdG9yX3N1YnRlc3QobmFtZV9fLCB0eXBlX18pIFwKPiA+ICsJ aWd0X3N1YnRlc3QobmFtZV9fKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiA+ICsJ CWZvcl9lYWNoX3BvcnQocCwgcG9ydCnCoMKgwqDCoFwKPiA+ICsJCQlpZiAocG9ydC0+dHlwZSA9 PSBEUk1fTU9ERV9DT05ORUNUT1JfICMjCj4gPiB0eXBlX18pCj4gPiArCj4gPiArI2RlZmluZSBk ZWZpbmVfY29tbW9uX2Nvbm5lY3Rvcl90ZXN0cyh0eXBlX3N0cl9fLAo+ID4gdHlwZV9fKcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiA+ICsJY29ubmVjdG9yX3N1 YnRlc3QodHlwZV9zdHJfXyAiLWhwZCIsCj4gPiB0eXBlX18pwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiA+ICsJCXRlc3RfYmFzaWNfaG90cGx1 ZygmZGF0YSwKPiA+IHBvcnQpO8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAKPiA+IMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoFwKPiA+ICsJY29ubmVjdG9yX3N1YnRlc3QodHlwZV9zdHJfXyAi LWVkaWQtcmVhZCIsIHR5cGVfXykKPiA+IHvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBcCj4gPiArCQl0ZXN0X2VkaWRfcmVhZCgmZGF0YSwgcG9ydCwKPiA+IGVkaWRfaWQswqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiA+ICsJ CQnCoMKgwqDCoMKgwqDCoGlndF9rbXNfZ2V0X2Jhc2VfZWRpZCgpKTvCoMKgwqDCoMKgwqDCoMKg wqDCoAo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ID4gKwkJdGVzdF9lZGlkX3JlYWQo JmRhdGEsIHBvcnQsCj4gPiBhbHRfZWRpZF9pZCzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoFwKPiA+ICsJCQnCoMKgwqDCoMKgwqDCoGlndF9rbXNfZ2V0X2FsdF9l ZGlkKCkpO8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oFwKPiA+ICsJfcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoAo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoAo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ID4gKwljb25uZWN0b3Jfc3Vi dGVzdCh0eXBlX3N0cl9fICItaHBkLWFmdGVyLXN1c3BlbmQiLAo+ID4gdHlwZV9fKcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoFwKPiA+ICsJCXRlc3Rfc3VzcGVuZF9yZXN1bWVfaHBkKCZkYXRhLAo+ ID4gcG9ydCzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgXAo+ID4gKwkJCQkJU1VTUEVORF9TVEFURV9NRU0swqDCoMKgwqDCoMKgwqDCoAo+ID4gwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ID4gKwkJCQkJU1VTUEVORF9URVNUX05PTkUpO8KgwqDC oMKgwqDCoMKgCj4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4gPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgCj4gPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4gPiArCWNvbm5lY3Rvcl9zdWJ0 ZXN0KHR5cGVfc3RyX18gIi1ocGQtYWZ0ZXItaGliZXJuYXRlIiwKPiA+IHR5cGVfXynCoMKgwqDC oMKgwqDCoMKgwqDCoFwKPiA+ICsJCXRlc3Rfc3VzcGVuZF9yZXN1bWVfaHBkKCZkYXRhLAo+ID4g cG9ydCzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg XAo+ID4gKwkJCQkJU1VTUEVORF9TVEFURV9ESVNLLMKgwqDCoMKgwqDCoMKgCj4gPiDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBcCj4gPiArCQkJCQlTVVNQRU5EX1RFU1RfREVWSUNFUyk7wqDCoMKg wqAKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAK PiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiA+ICsJY29ubmVjdG9yX3N1YnRlc3QodHlw ZV9zdHJfXyAiLWVkaWQtY2hhbmdlLWR1cmluZy0KPiA+IHN1c3BlbmQiLCB0eXBlX18pwqDCoMKg XAo+ID4gKwkJdGVzdF9zdXNwZW5kX3Jlc3VtZV9lZGlkX2NoYW5nZSgmZGF0YSwKPiA+IHBvcnQs wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ID4gKwkJCQkJCVNVU1BFTkRf U1RBVEVfTUVNLAo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ID4gKwkJCQkJCVNVU1BF TkRfVEVTVF9OT05FLAo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ID4gKwkJCQkJCWVk aWRfaWQsCj4gPiBhbHRfZWRpZF9pZCk7wqDCoMKgwqDCoMKgwqDCoFwKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiA+ICsJY29ubmVjdG9yX3N1 YnRlc3QodHlwZV9zdHJfXyAiLWVkaWQtY2hhbmdlLWR1cmluZy0KPiA+IGhpYmVybmF0ZSIsIHR5 cGVfXykgXAo+ID4gKwkJdGVzdF9zdXNwZW5kX3Jlc3VtZV9lZGlkX2NoYW5nZSgmZGF0YSwKPiA+ IHBvcnQswqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ID4gKwkJCQkJCVNV U1BFTkRfU1RBVEVfRElTSwo+ID4gLMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4gPiArCQkJCQkJ U1VTUEVORF9URVNUX0RFVklDCj4gPiBFUyzCoMKgwqDCoMKgwqDCoMKgwqBcCj4gPiArCQkJCQkJ ZWRpZF9pZCwKPiA+IGFsdF9lZGlkX2lkKTvCoMKgwqDCoMKgwqDCoMKgXAo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoAo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ID4gKwljb25uZWN0b3Jf c3VidGVzdCh0eXBlX3N0cl9fICItZGlzcGxheSIsCj4gPiB0eXBlX18pwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4gPiArCQl0ZXN0X2Rpc3BsYXkoJmRhdGEs IHBvcnQpOwo+ID4gKwo+ID4gK3N0YXRpYyBkYXRhX3QgZGF0YTsKPiA+ICsKPiA+ICtpZ3RfbWFp bgo+ID4gK3sKPiA+ICsJc3RydWN0IGNoYW1lbGl1bV9wb3J0ICpwb3J0Owo+ID4gKwlpbnQgZWRp ZF9pZCwgYWx0X2VkaWRfaWQsIHA7Cj4gPiArCj4gPiArCWlndF9maXh0dXJlIHsKPiA+ICsJCWln dF9yZXF1aXJlX2NoYW1lbGl1bSgpOwo+ID4gKwkJaWd0X3NraXBfb25fc2ltdWxhdGlvbigpOwo+ ID4gKwo+ID4gKwkJY2hhbWVsaXVtX2luaXQoKTsKPiA+ICsKPiA+ICsJCWVkaWRfaWQgPQo+ID4g Y2hhbWVsaXVtX25ld19lZGlkKGlndF9rbXNfZ2V0X2Jhc2VfZWRpZCgpKTsKPiA+ICsJCWFsdF9l ZGlkX2lkID0KPiA+IGNoYW1lbGl1bV9uZXdfZWRpZChpZ3Rfa21zX2dldF9hbHRfZWRpZCgpKTsK PiA+ICsKPiA+ICsJCWRhdGEuZHJtX2ZkID0KPiA+IGRybV9vcGVuX2RyaXZlcl9tYXN0ZXIoRFJJ VkVSX0lOVEVMKTsKPiA+ICsJCWNhY2hlX2Nvbm5lY3Rvcl9pbmZvKCZkYXRhKTsKPiA+ICsKPiA+ ICsJCS8qIFNvIGZiY29uIGRvZXNuJ3QgdHJ5IHRvIHJlcHJvYmUgdGhpbmdzIGl0c2VsZgo+ID4g Ki8KPiA+ICsJCWttc3Rlc3Rfc2V0X3Z0X2dyYXBoaWNzX21vZGUoKTsKPiA+ICsJfQo+ID4gKwo+ ID4gKwlpZ3Rfc3VidGVzdF9ncm91cCB7Cj4gPiArCQlpZ3RfZml4dHVyZSB7Cj4gPiArCQkJcmVx dWlyZV9jb25uZWN0b3JfcHJlc2VudCgKPiA+ICsJCQnCoMKgwqDCoCZkYXRhLAo+ID4gRFJNX01P REVfQ09OTkVDVE9SX0Rpc3BsYXlQb3J0KTsKPiA+ICsJCX0KPiA+ICsKPiA+ICsJCWRlZmluZV9j b21tb25fY29ubmVjdG9yX3Rlc3RzKCJkcCIsIERpc3BsYXlQb3J0KTsKPiA+ICsJfQo+ID4gKwo+ ID4gKwlpZ3Rfc3VidGVzdF9ncm91cCB7Cj4gPiArCQlpZ3RfZml4dHVyZSB7Cj4gPiArCQkJcmVx dWlyZV9jb25uZWN0b3JfcHJlc2VudCgKPiA+ICsJCQnCoMKgwqDCoCZkYXRhLCBEUk1fTU9ERV9D T05ORUNUT1JfSERNSUEpOwo+ID4gKwkJfQo+ID4gKwo+ID4gKwkJZGVmaW5lX2NvbW1vbl9jb25u ZWN0b3JfdGVzdHMoImhkbWkiLCBIRE1JQSk7Cj4gPiArCX0KPiA+ICsKPiA+ICsJaWd0X3N1YnRl c3RfZ3JvdXAgewo+ID4gKwkJaWd0X2ZpeHR1cmUgewo+ID4gKwkJCXJlcXVpcmVfY29ubmVjdG9y X3ByZXNlbnQoCj4gPiArCQkJwqDCoMKgwqAmZGF0YSwgRFJNX01PREVfQ09OTkVDVE9SX1ZHQSk7 Cj4gPiArCQl9Cj4gPiArCj4gPiArCQljb25uZWN0b3Jfc3VidGVzdCgidmdhLWhwZCIsIFZHQSkK PiA+ICsJCQl0ZXN0X2Jhc2ljX2hvdHBsdWcoJmRhdGEsIHBvcnQpOwo+ID4gKwo+ID4gKwkJY29u bmVjdG9yX3N1YnRlc3QoInZnYS1lZGlkLXJlYWQiLCBWR0EpIHsKPiA+ICsJCQl0ZXN0X2VkaWRf cmVhZCgmZGF0YSwgcG9ydCwgZWRpZF9pZCwKPiA+ICsJCQkJwqDCoMKgwqDCoMKgwqBpZ3Rfa21z X2dldF9iYXNlX2VkaWQoKSk7Cj4gPiArCQkJdGVzdF9lZGlkX3JlYWQoJmRhdGEsIHBvcnQsIGFs dF9lZGlkX2lkLAo+ID4gKwkJCQnCoMKgwqDCoMKgwqDCoGlndF9rbXNfZ2V0X2FsdF9lZGlkKCkp Owo+ID4gKwkJfQo+ID4gKwo+ID4gKwkJLyogRklYTUU6IFJpZ2h0IG5vdyB0aGVyZSBpc24ndCBh IHdheSB0byBkbyBhbnkKPiA+IHNvcnQgb2YgZGVsYXllZAo+ID4gKwkJwqAqIHBzdWVkby1ob3Rw bHVnIHdpdGggVkdBLCBzbyB0ZXN0aW5nIGRldGVjdGlvbgo+ID4gYWZ0ZXIgYQo+ID4gKwkJwqAq IHN1c3BlbmQvcmVzdW1lIGN5Y2xlIGlzbid0IHBvc3NpYmxlIHlldAo+ID4gKwkJwqAqLwo+ID4g Kwo+ID4gKwkJY29ubmVjdG9yX3N1YnRlc3QoInZnYS1ocGQtd2l0aG91dC1kZGMiLCBWR0EpCj4g PiArCQkJdGVzdF9ocGRfd2l0aG91dF9kZGMoJmRhdGEsIHBvcnQpOwo+ID4gKwo+ID4gKwkJY29u bmVjdG9yX3N1YnRlc3QoInZnYS1kaXNwbGF5IiwgVkdBKQo+ID4gKwkJCXRlc3RfZGlzcGxheSgm ZGF0YSwgcG9ydCk7Cj4gPiArCX0KPiA+ICt9Cj4gPiAtLcKgCj4gPiAyLjcuNAo+ID4gCj4gPiBf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+ID4gSW50ZWwt Z2Z4IG1haWxpbmcgbGlzdAo+ID4gSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+ID4g aHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK PiAKLS0gCkNoZWVycywKCUx5dWRlCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVk ZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2ludGVsLWdmeAo=