From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from xry111.site (xry111.site [89.208.246.23]) by sourceware.org (Postfix) with ESMTPS id BD76A3858D32 for ; Thu, 13 Apr 2023 05:52:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BD76A3858D32 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=xry111.site Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=xry111.site DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=xry111.site; s=default; t=1681365121; bh=rQEUQxd0daCKGrMmJo5L2A34OYXTiduEx6eYop8b0ZY=; h=Subject:From:To:Cc:Date:In-Reply-To:References:From; b=DEdkXIAPUBO8U4A+2k6JuFE4+MNZSKu/m0E0ET/WZ+14IUsVaeLWymvk8u/sAaY8q 4KX6t+4HkEXbfmAB7fVho4zMfLR95mspQnwVC7TAjkiu4rspHniTQ5qj7zEtQRZAv6 WQAf8Mn89mCOW6hCU0f8ipMb4fsWcgUuF62AGrtU= Received: from [IPv6:240e:358:11e6:cb00:dc73:854d:832e:5] (unknown [IPv6:240e:358:11e6:cb00:dc73:854d:832e:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature ECDSA (P-384) server-digest SHA384) (Client did not present a certificate) (Authenticated sender: xry111@xry111.site) by xry111.site (Postfix) with ESMTPSA id B71A765C4C; Thu, 13 Apr 2023 01:51:57 -0400 (EDT) Message-ID: Subject: Re: [PATCH v6 1/1] memalign: Support scanning for aligned chunks. From: Xi Ruoyao To: DJ Delorie Cc: libc-alpha@sourceware.org Date: Thu, 13 Apr 2023 13:51:50 +0800 In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.48.0 MIME-Version: 1.0 X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00,BODY_8BITS,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,LIKELY_SPAM_FROM,SPF_HELO_PASS,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: T24gV2VkLCAyMDIzLTA0LTEyIGF0IDIxOjUyIC0wNDAwLCBESiBEZWxvcmllIHdyb3RlOgo+IFhp IFJ1b3lhbyA8eHJ5MTExQHhyeTExMS5zaXRlPiB3cml0ZXM6Cj4gPiBUaGVuIHdlIHRlc3QgYXJf cHRyICE9IE5VTEwgaW4gdGhlIGlmIHN0YXRlbWVudC4KPiAKPiBJIGhhdmVuJ3QgcmVwcm9kdWNl IHRoZSB0Y2FjaGUgZmFpbCAoaXQgbWlnaHQgYmUgdW5yZWxhdGVkKSBidXQgdGhpcwo+IHNob3Vs ZCBmaXggdGhlIGFyX3B0ciBjYXNlIChtb3N0IG9mIHRoZSBtYWxsb2MuYyBwYXRjaCBqdXN0IGlu ZGVudHMgYQo+IGJ1bmNoIG9mIGNvZGUsIHRvIG1ha2UgaXQgY29uZGl0aW9uYWwpLsKgIFdlIGRv bid0IHdhbnQgdG8ganVzdCBmYWlsIG9uCj4gYXJfcHRyPT1OVUxMIGJlY2F1c2UgdGhhdCBwcmV2 ZW50cyB1cyBmcm9tIGNhbGxpbmcgc3lzbWFsbG9jKCkgdG8gZ2V0Cj4gbW9yZSBwbGFpbiBoZWFw Lgo+IAo+IEZyb20gMjUwZTMxZmYxNWQ5MmQyMGU2YzY2Njg5ZTM0YmFlYWI4ZGFhMDM0ZCBNb24g U2VwIDE3IDAwOjAwOjAwIDIwMDEKPiBGcm9tOiBESiBEZWxvcmllIDxkakByZWRoYXQuY29tPgo+ IERhdGU6IE1vbiwgMyBBcHIgMjAyMyAxNzozMzowMyAtMDQwMAo+IFN1YmplY3Q6IG1hbGxvYzog c2V0IE5PTl9NQUlOX0FSRU5BIGZsYWcgZm9yIHJlY2xhaW1lZCBtZW1hbGlnbiBjaHVuawo+IChC Wgo+IMKgIzMwMTAxKQoKV29ya3MgZm9yIG1lLgoKPiBCYXNlZCBvbiB0aGVzZSBjb21tZW50cyBp biBtYWxsb2MuYzoKPiAKPiDCoMKgIHNpemUgZmllbGQgaXMgb3InZWQgd2l0aCBOT05fTUFJTl9B UkVOQSBpZiB0aGUgY2h1bmsgd2FzIG9idGFpbmVkCj4gwqDCoCBmcm9tIGEgbm9uLW1haW4gYXJl bmEuwqAgVGhpcyBpcyBvbmx5IHNldCBpbW1lZGlhdGVseSBiZWZvcmUgaGFuZGluZwo+IMKgwqAg dGhlIGNodW5rIHRvIHRoZSB1c2VyLCBpZiBuZWNlc3NhcnkuCj4gCj4gwqDCoCBUaGUgTk9OX01B SU5fQVJFTkEgZmxhZyBpcyBuZXZlciBzZXQgZm9yIHVuc29ydGVkIGNodW5rcywgc28gaXQKPiDC oMKgIGRvZXMgbm90IGhhdmUgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50IGluIHNpemUgY29tcGFy aXNvbnMuCj4gCj4gV2hlbiB3ZSBwdWxsIGEgY2h1bmsgb2ZmIHRoZSB1bnNvcnRlZCBsaXN0IChv ciBhbnkgbGlzdCkgd2UgbmVlZCB0bwo+IG1ha2Ugc3VyZSB0aGF0IGZsYWcgaXMgc2V0IHByb3Bl cmx5IGJlZm9yZSByZXR1cm5pbmcgdGhlIGNodW5rLgo+IAo+IFVzZSB0aGUgcm91bmRlZC11cCBz aXplIGZvciBjaHVua19va19mb3JfbWVtYWxpZ24oKQo+IAo+IERvIG5vdCBzY2FuIHRoZSBhcmVu YSBmb3IgcmV1c2FibGUgY2h1bmtzIGlmIHRoZXJlJ3Mgbm8gYXJlbmEuCj4gCj4gZGlmZiAtLWdp dCBhL21hbGxvYy9NYWtlZmlsZSBiL21hbGxvYy9NYWtlZmlsZQo+IGluZGV4IGY0OTY3NTg0NWUu LmU2NjI0N2VkMDEgMTAwNjQ0Cj4gLS0tIGEvbWFsbG9jL01ha2VmaWxlCj4gKysrIGIvbWFsbG9j L01ha2VmaWxlCj4gQEAgLTQzLDcgKzQzLDggQEAgdGVzdHMgOj0gbWFsbG9jYnVnIHRzdC1tYWxs b2MgdHN0LXZhbGxvYyB0c3QtY2FsbG9jCj4gdHN0LW9ic3RhY2sgXAo+IMKgwqDCoMKgwqDCoMKg wqAgdHN0LXRjZnJlZTEgdHN0LXRjZnJlZTIgdHN0LXRjZnJlZTMgXAo+IMKgwqDCoMKgwqDCoMKg wqAgdHN0LXNhZmUtbGlua2luZyBcCj4gwqDCoMKgwqDCoMKgwqDCoCB0c3QtbWFsbG9jYWxpZ24x IFwKPiAtwqDCoMKgwqDCoMKgwqAgdHN0LW1lbWFsaWduLTIKPiArwqDCoMKgwqDCoMKgwqAgdHN0 LW1lbWFsaWduLTIgXAo+ICvCoMKgwqDCoMKgwqDCoCB0c3QtbWVtYWxpZ24tMwo+IMKgCj4gwqB0 ZXN0cy1zdGF0aWMgOj0gXAo+IMKgwqDCoMKgwqDCoMKgwqAgdHN0LWludGVycG9zZS1zdGF0aWMt bm90aHJlYWQgXAo+IEBAIC03MSw3ICs3Miw3IEBAIHRlc3Qtc3JjcyA9IHRzdC1tdHJhY2UKPiDC oCMgd2l0aCBNQUxMT0NfQ0hFQ0tfPTMgYmVjYXVzZSB0aGV5IGV4cGVjdCBhIHNwZWNpZmljIGZh aWx1cmUuCj4gwqB0ZXN0cy1leGNsdWRlLW1hbGxvYy1jaGVjayA9IHRzdC1tYWxsb2MtY2hlY2sg dHN0LW1hbGxvYy11c2FibGUgXAo+IMKgwqDCoMKgwqDCoMKgwqB0c3QtbXhmYXN0IHRzdC1zYWZl LWxpbmtpbmcgXAo+IC3CoMKgwqDCoMKgwqDCoHRzdC1jb21wYXRob29rcy1vZmYgdHN0LWNvbXBh dGhvb2tzLW9uIHRzdC1tZW1hbGlnbi0yCj4gK8KgwqDCoMKgwqDCoMKgdHN0LWNvbXBhdGhvb2tz LW9mZiB0c3QtY29tcGF0aG9va3Mtb24gdHN0LW1lbWFsaWduLTIgdHN0LQo+IG1lbWFsaWduLTMK PiDCoAo+IMKgIyBSdW4gYWxsIHRlc3RzIHdpdGggTUFMTE9DX0NIRUNLXz0zCj4gwqB0ZXN0cy1t YWxsb2MtY2hlY2sgPSAkKGZpbHRlci1vdXQgJCh0ZXN0cy1leGNsdWRlLW1hbGxvYy1jaGVjaykg XAo+IGRpZmYgLS1naXQgYS9tYWxsb2MvbWFsbG9jLmMgYi9tYWxsb2MvbWFsbG9jLmMKPiBpbmRl eCAwMzE1YWM1ZDE2Li43YWZjMDJhNzU5IDEwMDY0NAo+IC0tLSBhL21hbGxvYy9tYWxsb2MuYwo+ ICsrKyBiL21hbGxvYy9tYWxsb2MuYwo+IEBAIC01MDQ4LDk1ICs1MDQ4LDk4IEBAIF9pbnRfbWVt YWxpZ24gKG1zdGF0ZSBhdiwgc2l6ZV90IGFsaWdubWVudCwKPiBzaXplX3QgYnl0ZXMpCj4gwqDC oMKgwqDCoCBhbmQgdW5saWtlbHkgdG8gbWVldCBvdXIgYWxpZ25tZW50IHJlcXVpcmVtZW50cy7C oCBXZSBoYXZlIG5vdAo+IGRvbmUKPiDCoMKgwqDCoMKgIGFueSBleHBlcmltZW50YXRpb24gd2l0 aCBzZWFyY2hpbmcgZm9yIGFsaWduZWQgZmFzdGJpbnMuwqAgKi8KPiDCoAo+IC3CoCBpbnQgZmly c3RfYmluX2luZGV4Owo+IC3CoCBpbnQgZmlyc3RfbGFyZ2ViaW5faW5kZXg7Cj4gLcKgIGludCBs YXN0X2Jpbl9pbmRleDsKPiArwqAgaWYgKGF2ICE9IE5VTEwpCj4gK8KgwqDCoCB7Cj4gK8KgwqDC oMKgwqAgaW50IGZpcnN0X2Jpbl9pbmRleDsKPiArwqDCoMKgwqDCoCBpbnQgZmlyc3RfbGFyZ2Vi aW5faW5kZXg7Cj4gK8KgwqDCoMKgwqAgaW50IGxhc3RfYmluX2luZGV4Owo+IMKgCj4gLcKgIGlm IChpbl9zbWFsbGJpbl9yYW5nZSAobmIpKQo+IC3CoMKgwqAgZmlyc3RfYmluX2luZGV4ID0gc21h bGxiaW5faW5kZXggKG5iKTsKPiAtwqAgZWxzZQo+IC3CoMKgwqAgZmlyc3RfYmluX2luZGV4ID0g bGFyZ2ViaW5faW5kZXggKG5iKTsKPiArwqDCoMKgwqDCoCBpZiAoaW5fc21hbGxiaW5fcmFuZ2Ug KG5iKSkKPiArwqDCoMKgwqDCoMKgwqBmaXJzdF9iaW5faW5kZXggPSBzbWFsbGJpbl9pbmRleCAo bmIpOwo+ICvCoMKgwqDCoMKgIGVsc2UKPiArwqDCoMKgwqDCoMKgwqBmaXJzdF9iaW5faW5kZXgg PSBsYXJnZWJpbl9pbmRleCAobmIpOwo+IMKgCj4gLcKgIGlmIChpbl9zbWFsbGJpbl9yYW5nZSAo bmIgKiAyKSkKPiAtwqDCoMKgIGxhc3RfYmluX2luZGV4ID0gc21hbGxiaW5faW5kZXggKG5iICog Mik7Cj4gLcKgIGVsc2UKPiAtwqDCoMKgIGxhc3RfYmluX2luZGV4ID0gbGFyZ2ViaW5faW5kZXgg KG5iICogMik7Cj4gK8KgwqDCoMKgwqAgaWYgKGluX3NtYWxsYmluX3JhbmdlIChuYiAqIDIpKQo+ ICvCoMKgwqDCoMKgwqDCoGxhc3RfYmluX2luZGV4ID0gc21hbGxiaW5faW5kZXggKG5iICogMik7 Cj4gK8KgwqDCoMKgwqAgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoGxhc3RfYmluX2luZGV4ID0gbGFy Z2ViaW5faW5kZXggKG5iICogMik7Cj4gwqAKPiAtwqAgZmlyc3RfbGFyZ2ViaW5faW5kZXggPSBs YXJnZWJpbl9pbmRleCAoTUlOX0xBUkdFX1NJWkUpOwo+ICvCoMKgwqDCoMKgIGZpcnN0X2xhcmdl YmluX2luZGV4ID0gbGFyZ2ViaW5faW5kZXggKE1JTl9MQVJHRV9TSVpFKTsKPiDCoAo+IC3CoCBp bnQgdmljdGltX2luZGV4O8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIGl0cyBi aW4gaW5kZXggKi8KPiArwqDCoMKgwqDCoCBpbnQgdmljdGltX2luZGV4O8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIC8qIGl0cyBiaW4gaW5kZXggKi8KPiDCoAo+IC3CoCBmb3IgKHZp Y3RpbV9pbmRleCA9IGZpcnN0X2Jpbl9pbmRleDsKPiAtwqDCoMKgwqDCoMKgIHZpY3RpbV9pbmRl eCA8IGxhc3RfYmluX2luZGV4Owo+IC3CoMKgwqDCoMKgwqAgdmljdGltX2luZGV4ICsrKQo+IC3C oMKgwqAgewo+IC3CoMKgwqDCoMKgIHZpY3RpbSA9IE5VTEw7Cj4gK8KgwqDCoMKgwqAgZm9yICh2 aWN0aW1faW5kZXggPSBmaXJzdF9iaW5faW5kZXg7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoCB2aWN0 aW1faW5kZXggPCBsYXN0X2Jpbl9pbmRleDsKPiArwqDCoMKgwqDCoMKgwqDCoMKgIHZpY3RpbV9p bmRleCArKykKPiArwqDCoMKgwqDCoMKgwqB7Cj4gK8KgwqDCoMKgwqDCoMKgwqAgdmljdGltID0g TlVMTDsKPiDCoAo+IC3CoMKgwqDCoMKgIGlmICh2aWN0aW1faW5kZXggPCBmaXJzdF9sYXJnZWJp bl9pbmRleCkKPiAtwqDCoMKgIHsKPiAtwqDCoMKgwqDCoCAvKiBDaGVjayBzbWFsbCBiaW5zLsKg IFNtYWxsIGJpbiBjaHVua3MgYXJlIGRvdWJseS1saW5rZWQKPiBkZXNwaXRlCj4gLcKgwqDCoMKg wqDCoMKgIGJlaW5nIHRoZSBzYW1lIHNpemUuwqAgKi8KPiArwqDCoMKgwqDCoMKgwqDCoCBpZiAo dmljdGltX2luZGV4IDwgZmlyc3RfbGFyZ2ViaW5faW5kZXgpCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIENoZWNrIHNtYWxsIGJpbnMuwqAg U21hbGwgYmluIGNodW5rcyBhcmUgZG91Ymx5LWxpbmtlZAo+IGRlc3BpdGUKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJlaW5nIHRoZSBzYW1lIHNpemUuwqAgKi8KPiDCoAo+IC3C oMKgwqDCoMKgIG1jaHVua3B0ciBmd2Q7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgLyogbWlzYyB0ZW1wIGZvciBsaW5raW5nICovCj4gLcKgwqDCoMKgwqAgbWNodW5rcHRy IGJjazvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBtaXNjIHRlbXAg Zm9yIGxpbmtpbmcgKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1jaHVua3B0ciBmd2Q7 wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyogbWlzYyB0ZW1wIGZvcgo+ IGxpbmtpbmcgKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1jaHVua3B0ciBiY2s7wqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyogbWlzYyB0ZW1wIGZvcgo+IGxp bmtpbmcgKi8KPiDCoAo+IC3CoMKgwqDCoMKgIGJjayA9IGJpbl9hdCAoYXYsIHZpY3RpbV9pbmRl eCk7Cj4gLcKgwqDCoMKgwqAgZndkID0gYmNrLT5mZDsKPiAtwqDCoMKgwqDCoCB3aGlsZSAoZndk ICE9IGJjaykKPiAtwqDCoMKgwqDCoMKgwqB7Cj4gLcKgwqDCoMKgwqDCoMKgwqAgaWYgKGNodW5r X29rX2Zvcl9tZW1hbGlnbiAoZndkLCBhbGlnbm1lbnQsIGJ5dGVzKSA+IDApCj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgIHsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZpY3RpbSA9IGZ3ZDsK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJjayA9IGJpbl9hdCAoYXYsIHZpY3RpbV9pbmRl eCk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmd2QgPSBiY2stPmZkOwo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgd2hpbGUgKGZ3ZCAhPSBiY2spCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKGNo dW5rX29rX2Zvcl9tZW1hbGlnbiAoZndkLCBhbGlnbm1lbnQsIG5iKSA+IDApCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgdmljdGltID0gZndkOwo+IMKgCj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCAvKiBVbmxpbmsgaXQgKi8KPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZpY3Rp bS0+ZmQtPmJrID0gdmljdGltLT5iazsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZpY3Rp bS0+YmstPmZkID0gdmljdGltLT5mZDsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFr Owo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIFVubGluayBp dCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZpY3RpbS0+ ZmQtPmJrID0gdmljdGltLT5iazsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB2aWN0aW0tPmJrLT5mZCA9IHZpY3RpbS0+ZmQ7Cj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCB9Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBm d2QgPSBmd2QtPmZkOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB9Cj4gwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB9Cj4gK8KgwqDCoMKgwqDCoMKgwqAgZWxzZQo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoCB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBDaGVjayBsYXJnZSBi aW5zLsKgICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBtY2h1bmtwdHIgZndkO8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIG1pc2MgdGVtcCBmb3IKPiBsaW5r aW5nICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBtY2h1bmtwdHIgYmNrO8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIC8qIG1pc2MgdGVtcCBmb3IKPiBsaW5raW5n ICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBtY2h1bmtwdHIgYmVzdCA9IE5VTEw7Cj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplX3QgYmVzdF9zaXplID0gMDsKPiDCoAo+IC3C oMKgwqDCoMKgwqDCoMKgIGZ3ZCA9IGZ3ZC0+ZmQ7Cj4gLcKgwqDCoMKgwqDCoMKgfQo+IC3CoMKg wqAgfQo+IC3CoCBlbHNlCj4gLcKgwqDCoCB7Cj4gLcKgwqDCoMKgwqAgLyogQ2hlY2sgbGFyZ2Ug Ymlucy7CoCAqLwo+IC3CoMKgwqDCoMKgIG1jaHVua3B0ciBmd2Q7wqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgLyogbWlzYyB0ZW1wIGZvciBsaW5raW5nICovCj4gLcKgwqDC oMKgwqAgbWNodW5rcHRyIGJjazvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAvKiBtaXNjIHRlbXAgZm9yIGxpbmtpbmcgKi8KPiAtwqDCoMKgwqDCoCBtY2h1bmtwdHIgYmVz dCA9IE5VTEw7Cj4gLcKgwqDCoMKgwqAgc2l6ZV90IGJlc3Rfc2l6ZSA9IDA7Cj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBiY2sgPSBiaW5fYXQgKGF2LCB2aWN0aW1faW5kZXgpOwo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgZndkID0gYmNrLT5mZDsKPiDCoAo+IC3CoMKgwqDCoMKgIGJj ayA9IGJpbl9hdCAoYXYsIHZpY3RpbV9pbmRleCk7Cj4gLcKgwqDCoMKgwqAgZndkID0gYmNrLT5m ZDsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHdoaWxlIChmd2QgIT0gYmNrKQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGludCBleHRyYTsKPiDCoAo+IC3CoMKgwqDCoMKgIHdoaWxlIChmd2QgIT0gYmNrKQo+ IC3CoMKgwqDCoMKgwqDCoHsKPiAtwqDCoMKgwqDCoMKgwqDCoCBpbnQgZXh0cmE7Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChjaHVua3NpemUgKGZ3ZCkgPCBuYikKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBleHRyYSA9IGNodW5rX29rX2Zvcl9tZW1hbGlnbiAoZndk LCBhbGlnbm1lbnQsIG5iKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYg KGV4dHJhID4gMAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICYm IChleHRyYSA8PSBiZXN0X3NpemUgfHwgYmVzdCA9PSBOVUxMKSkKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBiZXN0ID0gZndkOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGJlc3Rfc2l6ZSA9IGV4dHJhOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgfQo+IMKgCj4gLcKgwqDCoMKgwqDCoMKgwqAgaWYgKGNodW5rc2l6ZSAoZndk KSA8IG5iKQo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4gLcKgwqDCoMKgwqDC oMKgwqAgZXh0cmEgPSBjaHVua19va19mb3JfbWVtYWxpZ24gKGZ3ZCwgYWxpZ25tZW50LCBieXRl cyk7Cj4gLcKgwqDCoMKgwqDCoMKgwqAgaWYgKGV4dHJhID4gMAo+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgJiYgKGV4dHJhIDw9IGJlc3Rfc2l6ZSB8fCBiZXN0ID09IE5VTEwpKQo+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoCB7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBiZXN0ID0gZndk Owo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYmVzdF9zaXplID0gZXh0cmE7Cj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgIH0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZndk ID0gZndkLT5mZDsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgdmljdGltID0gYmVzdDsKPiDCoAo+IC3CoMKgwqDCoMKgwqDCoMKg IGZ3ZCA9IGZ3ZC0+ZmQ7Cj4gLcKgwqDCoMKgwqDCoMKgfQo+IC3CoMKgwqDCoMKgIHZpY3RpbSA9 IGJlc3Q7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAodmljdGltICE9IE5VTEwpCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgdW5saW5rX2NodW5rIChhdiwgdmljdGltKTsKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oH0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQo+IMKgCj4gLcKgwqDCoMKgwqAgaWYgKHZpY3Rp bSAhPSBOVUxMKQo+IC3CoMKgwqDCoMKgwqDCoHsKPiAtwqDCoMKgwqDCoMKgwqDCoCB1bmxpbmtf Y2h1bmsgKGF2LCB2aWN0aW0pOwo+IC3CoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+ICvCoMKgwqDC oMKgwqDCoMKgIGlmICh2aWN0aW0gIT0gTlVMTCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJl YWs7Cj4gwqDCoMKgwqDCoMKgwqDCoH0KPiDCoMKgwqDCoCB9Cj4gwqAKPiAtwqDCoMKgwqDCoCBp ZiAodmljdGltICE9IE5VTEwpCj4gLcKgwqDCoMKgwqDCoMKgYnJlYWs7Cj4gLcKgwqDCoCB9Cj4g LQo+IMKgwqAgLyogU3RyYXRlZ3k6IGZpbmQgYSBzcG90IHdpdGhpbiB0aGF0IGNodW5rIHRoYXQg bWVldHMgdGhlIGFsaWdubWVudAo+IMKgwqDCoMKgwqAgcmVxdWVzdCwgYW5kIHRoZW4gcG9zc2li bHkgZnJlZSB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2UuCj4gwqDCoMKgwqDCoCBUaGlz IHN0cmF0ZWd5IGlzIGluY3JlZGlibHkgY29zdGx5IGFuZCBjYW4gbGVhZCB0byBleHRlcm5hbAo+ IEBAIC01MTQ3LDYgKzUxNTAsOCBAQCBfaW50X21lbWFsaWduIChtc3RhdGUgYXYsIHNpemVfdCBh bGlnbm1lbnQsCj4gc2l6ZV90IGJ5dGVzKQo+IMKgwqDCoMKgwqDCoCBwID0gdmljdGltOwo+IMKg wqDCoMKgwqDCoCBtID0gY2h1bmsybWVtIChwKTsKPiDCoMKgwqDCoMKgwqAgc2V0X2ludXNlIChw KTsKPiArwqDCoMKgwqDCoCBpZiAoYXYgIT0gJm1haW5fYXJlbmEpCj4gK8KgwqDCoMKgwqDCoMKg c2V0X25vbl9tYWluX2FyZW5hIChwKTsKPiDCoMKgwqDCoCB9Cj4gwqDCoCBlbHNlCj4gwqDCoMKg wqAgewo+IGRpZmYgLS1naXQgYS9tYWxsb2MvdHN0LW1lbWFsaWduLTIuYyBiL21hbGxvYy90c3Qt bWVtYWxpZ24tMi5jCj4gaW5kZXggNDk5NjU3OGU5Zi4uZjIyOTI4M2RiZiAxMDA2NDQKPiAtLS0g YS9tYWxsb2MvdHN0LW1lbWFsaWduLTIuYwo+ICsrKyBiL21hbGxvYy90c3QtbWVtYWxpZ24tMi5j Cj4gQEAgLTMzLDkgKzMzLDEwIEBAIHR5cGVkZWYgc3RydWN0IFRlc3RDYXNlIHsKPiDCoH0gVGVz dENhc2U7Cj4gwqAKPiDCoHN0YXRpYyBUZXN0Q2FzZSB0Y2FjaGVfYWxsb2NzW10gPSB7Cj4gLcKg IHsgMjQsIDgsIE5VTEwsIE5VTEwgfSwKPiAtwqAgeyAyNCwgMTYsIE5VTEwsIE5VTEwgfSwKPiAt wqAgeyAxMjgsIDMyLCBOVUxMLCBOVUxMIH0KPiArwqAgeyAyNCwgMzIsIE5VTEwsIE5VTEwgfSwK PiArwqAgeyAyNCwgNjQsIE5VTEwsIE5VTEwgfSwKPiArwqAgeyAxMjgsIDEyOCwgTlVMTCwgTlVM TCB9LAo+ICvCoCB7IDUwMCwgMTI4LCBOVUxMLCBOVUxMIH0KPiDCoH07Cj4gwqAjZGVmaW5lIFRO IGFycmF5X2xlbmd0aCAodGNhY2hlX2FsbG9jcykKPiDCoAo+IEBAIC03MCwxMSArNzEsMTUgQEAg ZG9fdGVzdCAodm9pZCkKPiDCoAo+IMKgwqAgZm9yIChpID0gMDsgaSA8IFROOyArKyBpKQo+IMKg wqDCoMKgIHsKPiArwqDCoMKgwqDCoCBzaXplX3Qgc3oyOwo+ICsKPiDCoMKgwqDCoMKgwqAgdGNh Y2hlX2FsbG9jc1tpXS5wdHIxID0gbWVtYWxpZ24gKHRjYWNoZV9hbGxvY3NbaV0uYWxpZ25tZW50 LAo+IHRjYWNoZV9hbGxvY3NbaV0uc2l6ZSk7Cj4gwqDCoMKgwqDCoMKgIENIRUNLICh0Y2FjaGVf YWxsb2NzW2ldLnB0cjEsIHRjYWNoZV9hbGxvY3NbaV0uYWxpZ25tZW50KTsKPiArwqDCoMKgwqDC oCBzejIgPSBtYWxsb2NfdXNhYmxlX3NpemUgKHRjYWNoZV9hbGxvY3NbaV0ucHRyMSk7Cj4gwqDC oMKgwqDCoMKgIGZyZWUgKHRjYWNoZV9hbGxvY3NbaV0ucHRyMSk7Cj4gKwo+IMKgwqDCoMKgwqDC oCAvKiBUaGlzIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgY2h1bmsgYXMgd2FzIGp1c3QgZnJlZSdk LsKgICovCj4gLcKgwqDCoMKgwqAgdGNhY2hlX2FsbG9jc1tpXS5wdHIyID0gbWVtYWxpZ24gKHRj YWNoZV9hbGxvY3NbaV0uYWxpZ25tZW50LAo+IHRjYWNoZV9hbGxvY3NbaV0uc2l6ZSk7Cj4gK8Kg wqDCoMKgwqAgdGNhY2hlX2FsbG9jc1tpXS5wdHIyID0gbWVtYWxpZ24gKHRjYWNoZV9hbGxvY3Nb aV0uYWxpZ25tZW50LAo+IHN6Mik7Cj4gwqDCoMKgwqDCoMKgIENIRUNLICh0Y2FjaGVfYWxsb2Nz W2ldLnB0cjIsIHRjYWNoZV9hbGxvY3NbaV0uYWxpZ25tZW50KTsKPiDCoMKgwqDCoMKgwqAgZnJl ZSAodGNhY2hlX2FsbG9jc1tpXS5wdHIyKTsKPiDCoAo+IGRpZmYgLS1naXQgYS9tYWxsb2MvdHN0 LW1lbWFsaWduLTMuYyBiL21hbGxvYy90c3QtbWVtYWxpZ24tMy5jCj4gbmV3IGZpbGUgbW9kZSAx MDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwLi5hYjkwZDZjYTliCj4gLS0tIC9kZXYvbnVsbAo+ICsr KyBiL21hbGxvYy90c3QtbWVtYWxpZ24tMy5jCj4gQEAgLTAsMCArMSwxNzMgQEAKPiArLyogVGVz dCBmb3IgbWVtYWxpZ24gY2h1bmsgcmV1c2UuCj4gK8KgwqAgQ29weXJpZ2h0IChDKSAyMDIyIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgo+ICvCoMKgIFRoaXMgZmlsZSBpcyBwYXJ0IG9m IHRoZSBHTlUgQyBMaWJyYXJ5Lgo+ICsKPiArwqDCoCBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVl IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKPiArwqDCoCBtb2RpZnkg aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCj4gK8Kg wqAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg ZWl0aGVyCj4gK8KgwqAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCj4gKwo+ICvCoMKgIFRoZSBHTlUgQyBMaWJyYXJ5IGlz IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQo+IHVzZWZ1bCwKPiArwqDC oCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy YW50eSBvZgo+ICvCoMKgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRS7CoCBTZWUgdGhlIEdOVQo+ICvCoMKgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4gKwo+ICvCoMKgIFlvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKPiArwqDCoCBMaWNl bnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgc2VlCj4gK8KgwqAgPGh0 dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi7CoCAqLwo+ICsKPiArI2luY2x1ZGUgPGVycm5v Lmg+Cj4gKyNpbmNsdWRlIDxtYWxsb2MuaD4KPiArI2luY2x1ZGUgPHN0ZGlvLmg+Cj4gKyNpbmNs dWRlIDxwdGhyZWFkLmg+Cj4gKyNpbmNsdWRlIDxzdHJpbmcuaD4KPiArI2luY2x1ZGUgPHVuaXN0 ZC5oPgo+ICsjaW5jbHVkZSA8YXJyYXlfbGVuZ3RoLmg+Cj4gKyNpbmNsdWRlIDxsaWJjLXBvaW50 ZXItYXJpdGguaD4KPiArI2luY2x1ZGUgPHN1cHBvcnQvY2hlY2suaD4KPiArI2luY2x1ZGUgPHN1 cHBvcnQveHRocmVhZC5oPgo+ICsKPiArCj4gK3R5cGVkZWYgc3RydWN0IFRlc3RDYXNlIHsKPiAr wqAgc2l6ZV90IHNpemU7Cj4gK8KgIHNpemVfdCBhbGlnbm1lbnQ7Cj4gK8KgIHZvaWQgKnB0cjE7 Cj4gK8KgIHZvaWQgKnB0cjI7Cj4gK30gVGVzdENhc2U7Cj4gKwo+ICtzdGF0aWMgVGVzdENhc2Ug dGNhY2hlX2FsbG9jc1tdID0gewo+ICvCoCB7IDI0LCAzMiwgTlVMTCwgTlVMTCB9LAo+ICvCoCB7 IDI0LCA2NCwgTlVMTCwgTlVMTCB9LAo+ICvCoCB7IDEyOCwgMTI4LCBOVUxMLCBOVUxMIH0sCj4g K8KgIHsgNTAwLCAxMjgsIE5VTEwsIE5VTEwgfQo+ICt9Owo+ICsjZGVmaW5lIFROIGFycmF5X2xl bmd0aCAodGNhY2hlX2FsbG9jcykKPiArCj4gK3N0YXRpYyBUZXN0Q2FzZSBsYXJnZV9hbGxvY3Nb XSA9IHsKPiArwqAgeyAyMzQ1MCwgNjQsIE5VTEwsIE5VTEwgfSwKPiArwqAgeyAyMzQ1MCwgNjQs IE5VTEwsIE5VTEwgfSwKPiArwqAgeyAyMzU1MCwgNjQsIE5VTEwsIE5VTEwgfSwKPiArwqAgeyAy MzU1MCwgNjQsIE5VTEwsIE5VTEwgfSwKPiArwqAgeyAyMzY1MCwgNjQsIE5VTEwsIE5VTEwgfSwK PiArwqAgeyAyMzY1MCwgNjQsIE5VTEwsIE5VTEwgfSwKPiArwqAgeyAzMzY1MCwgNjQsIE5VTEws IE5VTEwgfSwKPiArwqAgeyAzMzY1MCwgNjQsIE5VTEwsIE5VTEwgfQo+ICt9Owo+ICsjZGVmaW5l IExOIGFycmF5X2xlbmd0aCAobGFyZ2VfYWxsb2NzKQo+ICsKPiArdm9pZCAqcDsKPiArCj4gKy8q IFNhbml0eSBjaGVja3MsIGFuY2lsbGFyeSB0byB0aGUgYWN0dWFsIHRlc3QuwqAgKi8KPiArI2Rl ZmluZSBDSEVDSyhwLGEpIFwKPiArwqAgaWYgKHAgPT0gTlVMTCB8fCAhUFRSX0lTX0FMSUdORUQg KHAsIGEpKSBcCj4gK8KgwqDCoCBGQUlMX0VYSVQxICgiTlVMTCBvciBtaXNhbGlnbmVkIG1lbW9y eSBkZXRlY3RlZC5cbiIpOwo+ICsKPiArc3RhdGljIHZvaWQgKgo+ICttZW1fdGVzdCAodm9pZCAq Y2xvc3VyZSkKPiArewo+ICvCoCBpbnQgaTsKPiArwqAgaW50IGo7Cj4gK8KgIGludCBjb3VudDsK PiArwqAgdm9pZCAqcHRyWzEwXTsKPiArwqAgdm9pZCAqcDsKPiArCj4gK8KgIC8qIFRDYWNoZSB0 ZXN0LsKgICovCj4gK8KgIGZvciAoaSA9IDA7IGkgPCBUTjsgKysgaSkKPiArwqDCoMKgIHsKPiAr wqDCoMKgwqDCoCBzaXplX3Qgc3oyOwo+ICsKPiArwqDCoMKgwqDCoCB0Y2FjaGVfYWxsb2NzW2ld LnB0cjEgPSBtZW1hbGlnbiAodGNhY2hlX2FsbG9jc1tpXS5hbGlnbm1lbnQsCj4gdGNhY2hlX2Fs bG9jc1tpXS5zaXplKTsKPiArwqDCoMKgwqDCoCBDSEVDSyAodGNhY2hlX2FsbG9jc1tpXS5wdHIx LCB0Y2FjaGVfYWxsb2NzW2ldLmFsaWdubWVudCk7Cj4gK8KgwqDCoMKgwqAgc3oyID0gbWFsbG9j X3VzYWJsZV9zaXplICh0Y2FjaGVfYWxsb2NzW2ldLnB0cjEpOwo+ICvCoMKgwqDCoMKgIGZyZWUg KHRjYWNoZV9hbGxvY3NbaV0ucHRyMSk7Cj4gKwo+ICvCoMKgwqDCoMKgIC8qIFRoaXMgc2hvdWxk IHJldHVybiB0aGUgc2FtZSBjaHVuayBhcyB3YXMganVzdCBmcmVlJ2QuwqAgKi8KPiArwqDCoMKg wqDCoCB0Y2FjaGVfYWxsb2NzW2ldLnB0cjIgPSBtZW1hbGlnbiAodGNhY2hlX2FsbG9jc1tpXS5h bGlnbm1lbnQsCj4gc3oyKTsKPiArwqDCoMKgwqDCoCBDSEVDSyAodGNhY2hlX2FsbG9jc1tpXS5w dHIyLCB0Y2FjaGVfYWxsb2NzW2ldLmFsaWdubWVudCk7Cj4gK8KgwqDCoMKgwqAgZnJlZSAodGNh Y2hlX2FsbG9jc1tpXS5wdHIyKTsKPiArCj4gK8KgwqDCoMKgwqAgVEVTVF9WRVJJRlkgKHRjYWNo ZV9hbGxvY3NbaV0ucHRyMSA9PSB0Y2FjaGVfYWxsb2NzW2ldLnB0cjIpOwo+ICvCoMKgwqAgfQo+ ICsKPiArwqAgLyogVGVzdCBmb3Igbm9uLWhlYWQgdGNhY2hlIGhpdHMuwqAgKi8KPiArwqAgZm9y IChpID0gMDsgaSA8IGFycmF5X2xlbmd0aCAocHRyKTsgKysgaSkKPiArwqDCoMKgIHsKPiArwqDC oMKgwqDCoCBpZiAoaSA9PSA0KQo+ICvCoMKgwqDCoMKgwqDCoHsKPiArwqDCoMKgwqDCoMKgwqDC oCBwdHJbaV0gPSBtZW1hbGlnbiAoNjQsIDI1Nik7Cj4gK8KgwqDCoMKgwqDCoMKgwqAgQ0hFQ0sg KHB0cltpXSwgNjQpOwo+ICvCoMKgwqDCoMKgwqDCoH0KPiArwqDCoMKgwqDCoCBlbHNlCj4gK8Kg wqDCoMKgwqDCoMKgewo+ICvCoMKgwqDCoMKgwqDCoMKgIHB0cltpXSA9IG1hbGxvYyAoMjU2KTsK PiArwqDCoMKgwqDCoMKgwqDCoCBDSEVDSyAocHRyW2ldLCA0KTsKPiArwqDCoMKgwqDCoMKgwqB9 Cj4gK8KgwqDCoCB9Cj4gK8KgIGZvciAoaSA9IDA7IGkgPCBhcnJheV9sZW5ndGggKHB0cik7ICsr IGkpCj4gK8KgwqDCoCBmcmVlIChwdHJbaV0pOwo+ICsKPiArwqAgcCA9IG1lbWFsaWduICg2NCwg MjU2KTsKPiArwqAgQ0hFQ0sgKHAsIDY0KTsKPiArCj4gK8KgIGNvdW50ID0gMDsKPiArwqAgZm9y IChpID0gMDsgaSA8IDEwOyArKyBpKQo+ICvCoMKgwqAgaWYgKHB0cltpXSA9PSBwKQo+ICvCoMKg wqDCoMKgICsrIGNvdW50Owo+ICvCoCBmcmVlIChwKTsKPiArwqAgVEVTVF9WRVJJRlkgKGNvdW50 ID4gMCk7Cj4gKwo+ICvCoCAvKiBMYXJnZSBiaW5zIHRlc3QuwqAgKi8KPiArCj4gK8KgIGZvciAo aSA9IDA7IGkgPCBMTjsgKysgaSkKPiArwqDCoMKgIHsKPiArwqDCoMKgwqDCoCBsYXJnZV9hbGxv Y3NbaV0ucHRyMSA9IG1lbWFsaWduIChsYXJnZV9hbGxvY3NbaV0uYWxpZ25tZW50LAo+IGxhcmdl X2FsbG9jc1tpXS5zaXplKTsKPiArwqDCoMKgwqDCoCBDSEVDSyAobGFyZ2VfYWxsb2NzW2ldLnB0 cjEsIGxhcmdlX2FsbG9jc1tpXS5hbGlnbm1lbnQpOwo+ICvCoMKgwqDCoMKgIC8qIEtlZXAgY2h1 bmtzIGZyb20gY29tYmluaW5nIGJ5IGZyYWdtZW50aW5nIHRoZSBoZWFwLsKgICovCj4gK8KgwqDC oMKgwqAgcCA9IG1hbGxvYyAoNTEyKTsKPiArwqDCoMKgwqDCoCBDSEVDSyAocCwgNCk7Cj4gK8Kg wqDCoCB9Cj4gKwo+ICvCoCBmb3IgKGkgPSAwOyBpIDwgTE47ICsrIGkpCj4gK8KgwqDCoCBmcmVl IChsYXJnZV9hbGxvY3NbaV0ucHRyMSk7Cj4gKwo+ICvCoCAvKiBGb3JjZSB0aGUgdW5zb3J0ZWQg YmlucyB0byBiZSBzY2FubmVkIGFuZCBtb3ZlZCB0byBzbWFsbC9sYXJnZQo+ICvCoMKgwqDCoCBi aW5zLsKgICovCj4gK8KgIHAgPSBtYWxsb2MgKDYwMDAwKTsKPiArCj4gK8KgIGZvciAoaSA9IDA7 IGkgPCBMTjsgKysgaSkKPiArwqDCoMKgIHsKPiArwqDCoMKgwqDCoCBsYXJnZV9hbGxvY3NbaV0u cHRyMiA9IG1lbWFsaWduIChsYXJnZV9hbGxvY3NbaV0uYWxpZ25tZW50LAo+IGxhcmdlX2FsbG9j c1tpXS5zaXplKTsKPiArwqDCoMKgwqDCoCBDSEVDSyAobGFyZ2VfYWxsb2NzW2ldLnB0cjIsIGxh cmdlX2FsbG9jc1tpXS5hbGlnbm1lbnQpOwo+ICvCoMKgwqAgfQo+ICsKPiArwqAgY291bnQgPSAw Owo+ICvCoCBmb3IgKGkgPSAwOyBpIDwgTE47ICsrIGkpCj4gK8KgwqDCoCB7Cj4gK8KgwqDCoMKg wqAgaW50IG9rID0gMDsKPiArwqDCoMKgwqDCoCBmb3IgKGogPSAwOyBqIDwgTE47ICsrIGopCj4g K8KgwqDCoMKgwqDCoMKgaWYgKGxhcmdlX2FsbG9jc1tpXS5wdHIxID09IGxhcmdlX2FsbG9jc1tq XS5wdHIyKQo+ICvCoMKgwqDCoMKgwqDCoMKgIG9rID0gMTsKPiArwqDCoMKgwqDCoCBpZiAob2sg PT0gMSkKPiArwqDCoMKgwqDCoMKgwqBjb3VudCArKzsKPiArwqDCoMKgIH0KPiArCj4gK8KgIC8q IFRoZSBhbGxvY2F0aW9uIGFsZ29yaXRobSBpcyBjb21wbGljYXRlZCBvdXRzaWRlIG9mIHRoZSBt ZW1hbGlnbgo+ICvCoMKgwqDCoCBsb2dpYywgc28ganVzdCBtYWtlIHN1cmUgaXQncyB3b3JraW5n IGZvciBtb3N0IG9mIHRoZQo+ICvCoMKgwqDCoCBhbGxvY2F0aW9ucy7CoCBUaGlzIGF2b2lkcyBw b3NzaWJsZSBib3VuZGFyeSBjb25kaXRpb25zIHdpdGgKPiArwqDCoMKgwqAgZW1wdHkvZnVsbCBo ZWFwcy7CoCAqLwo+ICvCoCBURVNUX1ZFUklGWSAoY291bnQgPiBMTiAvIDIpOwo+ICsKPiArwqAg cmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQKPiArZG9fdGVzdCAodm9pZCkKPiArewo+ ICvCoCBwdGhyZWFkX3QgcDsKPiArCj4gK8KgIHAgPSB4cHRocmVhZF9jcmVhdGUgKE5VTEwsIG1l bV90ZXN0LCBOVUxMKTsKPiArwqAgeHB0aHJlYWRfam9pbiAocCk7Cj4gK8KgIHJldHVybiAwOwo+ ICt9Cj4gKwo+ICsjaW5jbHVkZSA8c3VwcG9ydC90ZXN0LWRyaXZlci5jPgo+IAoKLS0gClhpIFJ1 b3lhbyA8eHJ5MTExQHhyeTExMS5zaXRlPgpTY2hvb2wgb2YgQWVyb3NwYWNlIFNjaWVuY2UgYW5k IFRlY2hub2xvZ3ksIFhpZGlhbiBVbml2ZXJzaXR5Cg==