From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57350) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dNQEh-0004fR-DH for qemu-devel@nongnu.org; Tue, 20 Jun 2017 16:58:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dNQEe-0007kO-A6 for qemu-devel@nongnu.org; Tue, 20 Jun 2017 16:58:55 -0400 Received: from userp1040.oracle.com ([156.151.31.81]:18339) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dNQEd-0007jN-Py for qemu-devel@nongnu.org; Tue, 20 Jun 2017 16:58:52 -0400 Message-ID: <1497992323.16004.1.camel@oracle.com> From: Knut Omang Date: Tue, 20 Jun 2017 22:58:43 +0200 In-Reply-To: <20170616144157.GH25765@redhat.com> References: <8705c71efd97770eb26432da4d72ead13d83a49e.1497458933.git-series.knut.omang@oracle.com> <20170616144157.GH25765@redhat.com> Content-Type: text/plain; charset="UTF-8" Mime-Version: 1.0 Content-Transfer-Encoding: base64 Subject: Re: [Qemu-devel] [PATCH v3 1/2] tests: Add test-listen - a stress test for QEMU socket listen List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "Daniel P. Berrange" Cc: Gerd Hoffmann , Paolo Bonzini , qemu-devel@nongnu.org T24gRnJpLCAyMDE3LTA2LTE2IGF0IDE1OjQxICswMTAwLCBEYW5pZWwgUC4gQmVycmFuZ2Ugd3Jv dGU6Cj4gT24gV2VkLCBKdW4gMTQsIDIwMTcgYXQgMDY6NTM6NTFQTSArMDIwMCwgS251dCBPbWFu ZyB3cm90ZToKPiA+IFRoZXJlJ3MgYSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gYmV0d2VlbiBt dWx0aXBsZSBiaW5kKCkncwo+ID4gYXR0ZW1wdGluZyB0byBiaW5kIHRvIHRoZSBzYW1lIHBvcnQs IHdoaWNoIG9jY2FzaW9uYWxseQo+ID4gYWxsb3dzIG1vcmUgdGhhbiBvbmUgYmluZCB0byBzdWNj ZWVkIGFnYWluc3QgdGhlIHNhbWUgcG9ydC4KPiA+wqAKPiA+IFdoZW4gYSBzdWJzZXF1ZW50IGxp c3RlbigpIGNhbGwgaXMgbWFkZSB3aXRoIHRoZSBzYW1lIHNvY2tldAo+ID4gb25seSBvbmUgd2ls bCBzdWNjZWVkLgo+ID7CoAo+ID4gVGhlIGN1cnJlbnQgUUVNVSBjb2RlIGRvZXMgaG93ZXZlciBu b3QgdGFrZSB0aGlzIHNpdHVhdGlvbiBpbnRvIGFjY291bnQKPiA+IGFuZCB0aGUgbGlzdGVuIHdp bGwgY2F1c2UgdGhlIGNvZGUgdG8gYnJlYWsgb3V0IGFuZCBmYWlsIGV2ZW4KPiA+IHdoZW4gdGhl cmUgYXJlIGFjdHVhbGx5IGF2YWlsYWJsZSBwb3J0cyB0byB1c2UuCj4gPsKgCj4gPiBUaGlzIHRl c3QgZXhwb3NlcyB0d28gc3VidGVzdHM6Cj4gPsKgCj4gPiAvc29ja2V0L2xpc3Rlbi1zZXJpYWwK PiA+IC9zb2NrZXQvbGlzdGVuLWNvbXBldGUKPiA+wqAKPiA+IFRoZSAiY29tcGV0ZSIgc3VidGVz dCBjcmVhdGVzIGEgbnVtYmVyIG9mIHRocmVhZHMgYW5kIGhhdmUgdGhlbSBhbGwgdHJ5aW5nIHRv IGJpbmQKPiA+IHRvIHRoZSBzYW1lIHBvcnQgd2l0aCBhIGxhcmdlIGVub3VnaCBvZmZzZXQgaW5w dXQgdG8KPiA+IGFsbG93IGFsbCB0aHJlYWRzIHRvIGdldCBpdCdzIG93biBwb3J0Lgo+ID4gVGhl ICJzZXJpYWwiIHN1YnRlc3QganVzdCBkb2VzIHRoZSBzYW1lLCBleGNlcHQgaW4gc2VyaWVzIGlu IGEKPiA+IHNpbmdsZSB0aHJlYWQuCj4gPsKgCj4gPiBUaGUgc2VyaWFsIHZlcnNpb24gcGFzc2Vz LCBwcm9iYWJseSBpbiBtb3N0IHZlcnNpb25zIG9mIFFFTVUuCj4gPsKgCj4gPiBUaGUgcGFyYWxs ZWwgdmVyc2lvbiBleHBvc2VzIHRoZSBwcm9ibGVtIGluIGEgcmVsYXRpdmVseSByZWxpYWJsZSB3 YXksCj4gPiBlZy4gaXQgZmFpbHMgYSBtYWpvcml0eSBvZiB0aW1lcywgYnV0IG5vdCB3aXRoIGEg MTAwJSByYXRlLCBvY2Nhc2lvbmFsCj4gPiBwYXNzZXMgY2FuIGJlIHNlZW4uIE5ldmVydGhlbGVz cyB0aGlzIGlzIHF1aXRlIGdvb2QgZ2l2ZW4gdGhhdAo+ID4gdGhlIGJ1ZyB3YXMgdHJpY2t5IHRv IHJlcHJvZHVjZSBhbmQgaGFzIGJlZW4gbGVmdCB1bmRldGVjdGVkIGZvcgo+ID4gYSB3aGlsZS4K PiA+wqAKPiA+IFRoZSBwcm9ibGVtIHNlZW1zIHRvIGJlIHByZXNlbnQgaW4gYWxsIHZlcnNpb25z IG9mIFFFTVUuCj4gPsKgCj4gPiBUaGUgb3JpZ2luYWwgZmFpbHVyZSBzY2VuYXJpbyBvY2N1cnJl ZCB3aXRoIFZOQyBwb3J0IGFsbG9jYXRpb24KPiA+IGluIGEgdHJhZGl0aW9uYWwgWGVuIGJhc2Vk IGJ1aWxkLCBpbiBkaWZmZXJlbnQgY29kZQo+ID4gYnV0IHdpdGggc2ltaWxhciBmdW5jdGlvbmFs aXR5Lgo+ID7CoAo+ID4gUmVwb3J0ZWQtYnk6IEJoYXZlc2ggRGF2ZGEgPGJoYXZlc2guZGF2ZGFA b3JhY2xlLmNvbT4KPiA+IFNpZ25lZC1vZmYtYnk6IEtudXQgT21hbmcgPGtudXQub21hbmdAb3Jh Y2xlLmNvbT4KPiA+IFJldmlld2VkLWJ5OiBZdXZhbCBTaGFpYSA8eXV2YWwuc2hhaWFAb3JhY2xl LmNvbT4KPiA+IFJldmlld2VkLWJ5OiBCaGF2ZXNoIERhdmRhIDxiaGF2ZXNoLmRhdmRhQG9yYWNs ZS5jb20+Cj4gPiBSZXZpZXdlZC1ieTogR2lyaXNoIE1vb2RhbGJhaWwgPGdpcmlzaC5tb29kYWxi YWlsQG9yYWNsZS5jb20+Cj4gPiAtLS0KPiA+wqDCoHRlc3RzL01ha2VmaWxlLmluY2x1ZGUgfMKg wqDCoDIgKy0KPiA+wqDCoHRlc3RzL3Rlc3QtbGlzdGVuLmPCoMKgwqDCoHwgMTQxICsrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KPiA+wqDCoDIgZmlsZXMgY2hhbmdl ZCwgMTQzIGluc2VydGlvbnMoKykKPiA+wqDCoGNyZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0cy90ZXN0 LWxpc3Rlbi5jCj4gPsKgCj4gPiBkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuaW5jbHVkZSBi L3Rlc3RzL01ha2VmaWxlLmluY2x1ZGUKPiA+IGluZGV4IDcxODBmZTQuLjIyYmI5N2UgMTAwNjQ0 Cj4gPiAtLS0gYS90ZXN0cy9NYWtlZmlsZS5pbmNsdWRlCj4gPiArKysgYi90ZXN0cy9NYWtlZmls ZS5pbmNsdWRlCj4gPiBAQCAtMTI3LDYgKzEyNyw3IEBAIGNoZWNrLXVuaXQteSArPSB0ZXN0cy90 ZXN0LWJ1ZmZlcmlzemVybyQoRVhFU1VGKQo+ID7CoMKgZ2Nvdi1maWxlcy1jaGVjay1idWZmZXJp c3plcm8teSA9IHV0aWwvYnVmZmVyaXN6ZXJvLmMKPiA+wqDCoGNoZWNrLXVuaXQteSArPSB0ZXN0 cy90ZXN0LXV1aWQkKEVYRVNVRikKPiA+wqDCoGNoZWNrLXVuaXQteSArPSB0ZXN0cy9wdGltZXIt dGVzdCQoRVhFU1VGKQo+ID4gKyNjaGVjay11bml0LXkgKz0gdGVzdHMvdGVzdC1saXN0ZW4kKEVY RVNVRikKPiAKPiBEaWQgeW91IHJlYWxseSBtZWFuIHRvIGxlYXZlIHRoaXMgY29tbWVudGVkIG91 dCA/CgpZZXMsIGl0IGlzIGVuYWJsZWQgYnkgdGhlIG5leHQgY29tbWl0IHdpdGggdGhlIGZpeCAt IG90aGVyd2lzZSBpdCB3b3VsZApmYWlsICdtYWtlIGNoZWNrJy4gSnVzdCB3YW50ZWQgdG8gbWFr ZSBpdCBjb252ZW5pZW50CmZvciB5b3UgcmVwcm9kdWNlIHRoZSBpc3N1ZSAoSSBhcHByZWNpYXRl IHRoYXQgbXlzZWxmLi4gOi0pICkKCj4gPiBkaWZmIC0tZ2l0IGEvdGVzdHMvdGVzdC1saXN0ZW4u YyBiL3Rlc3RzL3Rlc3QtbGlzdGVuLmMKPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRl eCAwMDAwMDAwLi40NWZlOWE4Cj4gPiAtLS0gL2Rldi9udWxsCj4gPiArKysgYi90ZXN0cy90ZXN0 LWxpc3Rlbi5jCj4gPiBAQCAtMCwwICsxLDE0MSBAQAo+ID4gKy8qCj4gPiArICogVGVzdCBwYXJh bGxlbCBwb3J0IGxpc3RlbiBjb25maWd1cmF0aW9uIHdpdGgKPiA+ICsgKiBkeW5hbWljIHBvcnQg YWxsb2NhdGlvbgo+ID4gKyAqLwo+IAo+IFNob3VsZCBzdGljayBhIHN0YW5kYXJkIGxpY2Vuc2Ug aGVhZGVyIG9uIHRoaXMgbmV3IGZpbGUKCk9oIC0ganVzdCBmb3Jnb3QgaXQsIHdpbGwgYWRkLCB0 aGFua3MuLgo+IAo+ID4gKwo+ID4gKyNpbmNsdWRlICJxZW11L29zZGVwLmgiCj4gPiArI2luY2x1 ZGUgImxpYnF0ZXN0LmgiCj4gPiArI2luY2x1ZGUgInFlbXUtY29tbW9uLmgiCj4gPiArI2luY2x1 ZGUgInFlbXUvdGhyZWFkLmgiCj4gPiArI2luY2x1ZGUgInFlbXUvc29ja2V0cy5oIgo+ID4gKyNp bmNsdWRlICJxYXBpL2Vycm9yLmgiCj4gPiArCj4gPiArI2RlZmluZSBOQU1FX0xFTiAxMDI0Cj4g PiArI2RlZmluZSBQT1JUX0xFTiAxNgo+ID4gKwo+ID4gK3N0cnVjdCB0aHJfaW5mbyB7Cj4gPiAr wqDCoMKgwqBRZW11VGhyZWFkIHRocmVhZDsKPiA+ICvCoMKgwqDCoGludCB0b19wb3J0Owo+ID4g K8KgwqDCoMKgaW50IGdvdF9wb3J0Owo+ID4gK8KgwqDCoMKgaW50IGVubzsKPiA+ICvCoMKgwqDC oGludCBmZDsKPiA+ICvCoMKgwqDCoGNvbnN0IGNoYXIgKmVycnN0cjsKPiA+ICt9Owo+ID4gKwo+ ID4gK3N0YXRpYyBjaGFyIGhvc3RuYW1lW05BTUVfTEVOICsgMV07Cj4gPiArc3RhdGljIGNoYXIg cG9ydFtQT1JUX0xFTiArIDFdOwo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkICpsaXN0ZW5lcl90aHJl YWQodm9pZCAqYXJnKQo+ID4gK3sKPiA+ICvCoMKgwqDCoHN0cnVjdCB0aHJfaW5mbyAqdGhyID0g KHN0cnVjdCB0aHJfaW5mbyAqKWFyZzsKPiA+ICvCoMKgwqDCoFNvY2tldEFkZHJlc3MgYWRkciA9 IHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgLnR5cGUgPSBTT0NLRVRfQUREUkVTU19UWVBFX0lORVQs Cj4gPiArwqDCoMKgwqDCoMKgwqDCoC51ID0gewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oC5pbmV0ID0gewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLmhvc3QgPSBo b3N0bmFtZSwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5wb3J0ID0gcG9y dCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5pcHY0ID0gdHJ1ZSwKPiAK PiAuaXB2NCBpcyBpZ25vcmVkIHVubGVzcyB5b3Ugc2V0wqDCoC5oYXNfaXB2NCB0b28uCgpJIHNl ZS4uCgo+IEknZCBpbmNsaW5lZCB0byBhbGxvdyBpcHY2IHRvbyB0aG91Z2gsIHNpbmNlIHRoYXQn cyBub3JtYWwKPiB1c2FnZSBzY2VuYXJpbyBvdXQgb2YgdGhlIGJveC4KPiAKPiBPciByZXBlYXQg dGhlIHRlc3QgbXVsdGlwbGUgdGltZXMsIHdpdGggaXB2NCBvbmx5LCBpcHY2Cj4gb25seSBhbmQg aXB2NC9pcHY2IGF1dG9tYXRpYy4KCkdvb2QgaWRlYSwgd2lsbCBsb29rIGF0IG1ha2luZyBzZXBh cmF0ZSBzdWJ0ZXN0cy4KCj4gCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAu aGFzX3RvID0gdHJ1ZSwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC50byA9 IHRoci0+dG9fcG9ydCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9LAo+ID4gK8KgwqDC oMKgwqDCoMKgwqB9LAo+ID4gK8KgwqDCoMKgfTsKPiA+ICvCoMKgwqDCoEVycm9yICplcnIgPSBO VUxMOwo+ID4gK8KgwqDCoMKgaW50IGZkOwo+ID4gKwo+ID4gK8KgwqDCoMKgZmQgPSBzb2NrZXRf bGlzdGVuKCZhZGRyLCAmZXJyKTsKPiA+ICvCoMKgwqDCoGlmIChmZCA8IDApIHsKPiA+ICvCoMKg wqDCoMKgwqDCoMKgdGhyLT5lbm8gPSBlcnJubzsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgdGhyLT5l cnJzdHIgPSBlcnJvcl9nZXRfcHJldHR5KGVycik7Cj4gPiArwqDCoMKgwqB9IGVsc2Ugewo+ID4g K8KgwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qgc29ja2FkZHJfaW4gYTsKPiA+ICvCoMKgwqDCoMKgwqDC oMKgc29ja2xlbl90IGFfbGVuID0gc2l6ZW9mKGEpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqBnX2Fz c2VydF9jbXBpbnQoZ2V0c29ja25hbWUoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYSwgJmFfbGVu KSwgPT0sIDApOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqB0aHItPmdvdF9wb3J0ID0gbnRvaHMoYS5z aW5fcG9ydCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoHRoci0+ZmQgPSBmZDsKPiA+ICvCoMKgwqDC oH0KPiA+ICvCoMKgwqDCoHJldHVybiBhcmc7Cj4gPiArfQo+ID4gKwo+ID4gKwo+ID4gK3N0YXRp YyB2b2lkIGxpc3Rlbl9jb21wZXRlX250aHIoYm9vbCB0aHJlYWRlZCwgaW50IG50aHJlYWRzLAo+ ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBpbnQgc3RhcnRfcG9ydCwgaW50IG1heF9vZmZzZXQpCj4gPiArewo+ID4gK8Kg wqDCoMKgaW50IGk7Cj4gPiArwqDCoMKgwqBpbnQgZmFpbGVkX2xpc3RlbnMgPSAwOwo+ID4gK8Kg wqDCoMKgc2l6ZV90IGFsbG9jX3N6ID0gc2l6ZW9mKHN0cnVjdCB0aHJfaW5mbykgKiBudGhyZWFk czsKPiA+ICvCoMKgwqDCoHN0cnVjdCB0aHJfaW5mbyAqdGhyID0gZ19tYWxsb2MoYWxsb2Nfc3op Owo+IAo+IFRoZXNlIHR3byBsaW5lcyBhcmUgcmVpbnZlbnRpbmcgZ19uZXcgLSBqdXN0IGRvCgpX aWxsIGRvIQoKPiDCoCBzdHJ1Y3QgdGhyX2luZm8gKnRociA9IGdfbmV3MChzdHJ1Y3QgdGhyX2lu Zm8sIG50aHJlYWRzKTsKPiAKPiA+ICvCoMKgwqDCoGludCB1c2VkW21heF9vZmZzZXQgKyAxXTsK PiA+ICvCoMKgwqDCoG1lbXNldCh1c2VkLCAwLCBzaXplb2YodXNlZCkpOwo+ID4gK8KgwqDCoMKg Z19hc3NlcnRfbm9ubnVsbCh0aHIpOwo+IAo+IEl0IGlzIGFscmVhZHkgZ3VhcmFudGVlZCBub24t bnVsbCBieSBnX25ldwo+IAo+ID4gK8KgwqDCoMKgZ19hc3NlcnRfY21waW50KGdldGhvc3RuYW1l KGhvc3RuYW1lLCBOQU1FX0xFTiksID09ICwgMCk7Cj4gPiArwqDCoMKgwqBzbnByaW50Zihwb3J0 LCBQT1JUX0xFTiwgIiVkIiwgc3RhcnRfcG9ydCk7Cj4gCj4gSnVzdCB1c2UgImxvY2FsaG9zdCIg aW5zdGVhZCBvZiB0aGUgcHVibGljIGhvc3RuYW1lCgpXaWxsIGRvLAoKPiBBbHNvLCBzdG9yaW5n IGRhdGEgaW4gZ2xvYmFsIHZhcmlhYmxlcyBpcyBnb2luZyB0byBmYWlsIGlmCj4gdGhlIHRlc3Qg aGFybmVzcyBydW5zIGJvdGggdGVzdHMgaW4gcGFyYWxsZWwuIEJldHRlciB0bwo+IHBhc3MgdGhl IHJlcXVpcmVkIGRhdGEgaW50byB0aGUgdGhyZWFkIG1haW4gbWV0aG9kIHZpYQo+IHRoZSB0aHJf aW5mbyBzdHJ1Y3QuCgpPayAtIHdpbGwgZml4LgoKPiAKPiA+ICvCoMKgwqDCoG1lbXNldCh0aHIs IDAsIGFsbG9jX3N6KTsKPiAKPiBnX25ldzAgd2lsbCBzZXQgaXQgdG8gemVyb3MKClRoYW5rcywg d2lsbCBmaXguCj4gCj4gPiArCj4gPiArwqDCoMKgwqBmb3IgKGkgPSAwOyBpIDwgbnRocmVhZHM7 IGkrKykgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqB0aHJbaV0udG9fcG9ydCA9IHN0YXJ0X3BvcnQg KyBtYXhfb2Zmc2V0Owo+ID4gK8KgwqDCoMKgwqDCoMKgwqBpZiAodGhyZWFkZWQpIHsKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBxZW11X3RocmVhZF9jcmVhdGUoJnRocltpXS50aHJlYWQs ICJsaXN0ZW5lciIsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsaXN0ZW5lcl90aHJlYWQsICZ0aHJbaV0sCj4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBRRU1VX1RIUkVBRF9KT0lOQUJMRSk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoH0gZWxzZSB7Cj4g PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbGlzdGVuZXJfdGhyZWFkKCZ0aHJbaV0pOwo+ID4g K8KgwqDCoMKgwqDCoMKgwqB9Cj4gPiArwqDCoMKgwqB9Cj4gPiArCj4gPiArwqDCoMKgwqBpZiAo dGhyZWFkZWQpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgZm9yIChpID0gMDsgaSA8IG50aHJlYWRz OyBpKyspIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBxZW11X3RocmVhZF9qb2luKCZ0 aHJbaV0udGhyZWFkKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgfQo+ID4gK8KgwqDCoMKgfQo+ID4g K8KgwqDCoMKgZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgaWYgKHRocltpXS5nb3RfcG9ydCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGNsb3Nlc29ja2V0KHRocltpXS5mZCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoH0KPiA+ICvCoMKg wqDCoH0KPiA+ICsKPiA+ICvCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBudGhyZWFkczsgaSsrKSB7 Cj4gPiArwqDCoMKgwqDCoMKgwqDCoGlmICh0aHJbaV0uZW5vICE9IDApIHsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBjb25zdCBjaGFyICptOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHByaW50ZigiKiogRmFpbGVkIHRvIGFzc2lnbiBhIHBvcnQgdG8gdGhyZWFkICVkIChlcnJu byA9ICVkKVxuIiwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGks IHRocltpXS5lbm8pOwo+IAo+IEknZCBzdWdnZXN0wqDCoGdfcHJpbnRlcnIoKSBpbnN0ZWFkIHNv IGl0IGdldHMgdG8gc3RkZXJyIHdpdGhvdXQgYnVmZmVyaW5nCgpXaWxsIGRvCgo+IAo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIFRoaXMgaXMgd2hhdCB3ZSBhcmUgaW50ZXJlc3RlZCBp biBjYXB0dXJpbmcgLQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgKiBjYXRjaCBhbmQg cmVwb3J0IGRldGFpbHMgaWYgc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuczoKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCovCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbSA9 IHN0cnN0cih0aHJbaV0uZXJyc3RyLCAiRmFpbGVkIHRvIGxpc3RlbiBvbiBzb2NrZXQiKTsKPiA+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAobSAhPSBOVUxMKSB7Cj4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBnX2Fzc2VydF9jbXBzdHIodGhyW2ldLmVycnN0ciwgPT0s Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCJGYWlsZWQgdG8g bGlzdGVuIG9uIHNvY2tldDogQWRkcmVzcyBhbHJlYWR5IGluIHVzZSIpOwo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoH0KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmYWlsZWRfbGlz dGVucysrOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqB9IGVsc2Ugewo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGludCBhc3NpZ25lZF9wb3J0ID0gdGhyW2ldLmdvdF9wb3J0Owo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGdfYXNzZXJ0X2NtcGludChhc3NpZ25lZF9wb3J0LCA8PSAsIHRo cltpXS50b19wb3J0KTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBnX2Fzc2VydF9jbXBp bnQodXNlZFthc3NpZ25lZF9wb3J0IC0gc3RhcnRfcG9ydF0sID09ICwgMCk7Cj4gPiArwqDCoMKg wqDCoMKgwqDCoH0KPiA+ICvCoMKgwqDCoH0KPiA+ICvCoMKgwqDCoGdfYXNzZXJ0X2NtcGludChm YWlsZWRfbGlzdGVucywgPT0sIDApOwo+ID4gK8KgwqDCoMKgZnJlZSh0aHIpOwo+IAo+IE5lZWRz IHRvIGJlIGdfZnJlZSwgbm90IGZyZWUKCk9oIC0geWVzLCB3aWxsIGZpeC4KPiAKPiA+ICt9Cj4g PiArCj4gPiArCj4gPiArc3RhdGljIHZvaWQgbGlzdGVuX2NvbXBldGUodm9pZCkKPiA+ICt7Cj4g PiArwqDCoMKgwqBsaXN0ZW5fY29tcGV0ZV9udGhyKHRydWUsIDIwMCwgNTkyMCwgMzAwKTsKPiA+ ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgbGlzdGVuX3NlcmlhbCh2b2lkKQo+ID4gK3sKPiA+ ICvCoMKgwqDCoGxpc3Rlbl9jb21wZXRlX250aHIoZmFsc2UsIDIwMCwgNjMwMCwgMzAwKTsKPiA+ ICt9Cj4gPiArCj4gPiArCj4gPiAraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQo+ID4g K3sKPiA+ICvCoMKgwqDCoGdfdGVzdF9pbml0KCZhcmdjLCAmYXJndiwgTlVMTCk7Cj4gPiArCj4g PiArwqDCoMKgwqBnX3Rlc3RfYWRkX2Z1bmMoIi9zb2NrZXQvbGlzdGVuLXNlcmlhbCIsIGxpc3Rl bl9zZXJpYWwpOwo+ID4gK8KgwqDCoMKgZ190ZXN0X2FkZF9mdW5jKCIvc29ja2V0L2xpc3Rlbi1j b21wZXRlIiwgbGlzdGVuX2NvbXBldGUpOwo+IAo+IE5vdCBhbGwgb3VyIENJIHN5c3RlbXMgaGF2 ZSBuZXR3b3JrIGFjY2Vzcy4gWW91J2xsIHdhbnQgdG9kbyBhIGNoZWNrIGZvcgo+IGFjY2VzcyBm aXJzdCwgYW5kIGV4aXQgaWYgbm90IGF2YWlsYWJsZS4gU2VlIGNoZWNrX3Byb3RvY29sX3N1cHBv cnQoKSBpbgo+IHRlc3QtaW8tY2hhbm5lbC1zb2NrZXQuYyBmb3IgZXhhbXBsZS4KCldpbGwgZG/C oAotIG1heWJlIHRoZXNlIGZ1bmN0aW9ucyBjb3VsZCBiZSBtYWRlIHBhcnQgb2YgdGhlIHRlc3Qg ZnJhbWV3b3JrIHRvIGF2b2lkCmR1cGxpY2F0aW9uPwoKPiAKPiA+ICsKPiA+ICvCoMKgwqDCoHJl dHVybiBnX3Rlc3RfcnVuKCk7Cj4gPiArfQo+ID4gLS3CoAo+ID4gZ2l0LXNlcmllcyAwLjkuMQo+ IAo+IFJlZ2FyZHMsCj4gRGFuaWVsCgpUaGFua3MsCktudXQ=