From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from conssluserg-03.nifty.com (conssluserg-03.nifty.com [210.131.2.82]) by sourceware.org (Postfix) with ESMTPS id 793A13858414 for ; Mon, 6 Sep 2021 11:16:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 793A13858414 Authentication-Results: sourceware.org; dmarc=fail (p=none dis=none) header.from=nifty.ne.jp Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=nifty.ne.jp Received: from Express5800-S70 (z221123.dynamic.ppp.asahi-net.or.jp [110.4.221.123]) (authenticated) by conssluserg-03.nifty.com with ESMTP id 186BGgbi020955 for ; Mon, 6 Sep 2021 20:16:42 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conssluserg-03.nifty.com 186BGgbi020955 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.ne.jp; s=dec2015msa; t=1630927002; bh=D22skBzLAskAXh0uVAaqd41jYy+FF0TpDKNHRFzR6SI=; h=Date:From:To:Subject:In-Reply-To:References:From; b=1BbWl8zCV6Tm8tdrSigl+kuA6FOSodiSL15DuVy6IjiuG65tvUQPrTONHxuZejXs8 qz5q3Ev2pxBgMI+ghZbkf15IyCP5DXPD29Jpz1HRsWkDMRlnm99RDyUhe/TZZ57MXG 2bRFE+qbSomMCHmoptIIQwFxg3Pw3UKdIbIyutM5a0Sqb+I1gtFs6nAyKbBQ2OoKeb PEz4CN9Bk8JHrlHwmo7jjk5fh0XzSBE5RlGz1LLWNm4pgiJDh8yuYLriIh6TIQaVD9 RX6dhgjiHpqS6thnXcJWJjlLhNXKiDb92iDgDHil8grpEk+OwTbfXeoLu1kDW5al5x S3Hp/Z+YuEWfw== X-Nifty-SrcIP: [110.4.221.123] Date: Mon, 6 Sep 2021 20:16:43 +0900 From: Takashi Yano To: cygwin-developers@cygwin.com Subject: Re: cygrunsrv + sshd + rsync = 20 times too slow -- throttled? Message-Id: <20210906201643.2e84c0d3a7ac7c8878548408@nifty.ne.jp> In-Reply-To: References: <20210903212205.acc2fc68cc4ffce9c1db3dd9@nifty.ne.jp> <20210904210258.342eb795ac53f1d5352ea512@nifty.ne.jp> <20210904213713.8760e7ba3a4d68fbb78d677e@nifty.ne.jp> <51cb0cef-c3fd-1320-c2dd-a868bf1ffaae@cornell.edu> <20210905081523.0db04d9402abf87635066eb7@nifty.ne.jp> <20210905224059.cfdc8f23d3eeaa1ea16ecf2e@nifty.ne.jp> <20210905225037.c625ee0bcd479181848763f8@nifty.ne.jp> <20210906050950.56b397be7c5eb3da848691e9@nifty.ne.jp> X-Mailer: Sylpheed 3.7.0 (GTK+ 2.24.30; i686-pc-mingw32) Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Multipart=_Mon__6_Sep_2021_20_16_43_+0900_HVfX7ROzJY404.CR" X-Spam-Status: No, score=-5.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: cygwin-developers@cygwin.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Cygwin core component developers mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 06 Sep 2021 11:17:01 -0000 This is a multi-part message in MIME format. --Multipart=_Mon__6_Sep_2021_20_16_43_+0900_HVfX7ROzJY404.CR Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Hi Corinna, On Mon, 6 Sep 2021 10:13:10 +0200 Corinna Vinschen wrote: > On Sep 6 05:09, Takashi Yano wrote: > > On Sun, 5 Sep 2021 14:47:26 -0400 > > Ken Brown wrote: > > > On 9/5/2021 9:50 AM, Takashi Yano wrote: > > > > On Sun, 5 Sep 2021 22:40:59 +0900 > > > > Takashi Yano wrote: > > > >> On Sun, 5 Sep 2021 08:15:23 +0900 > > > >> Takashi Yano wrote: > > > >>> On Sat, 4 Sep 2021 10:04:12 -0400 > > > >>> Ken Brown wrote: > > > >>>> On 9/4/2021 8:37 AM, Takashi Yano wrote: > > > >>>>> On Sat, 4 Sep 2021 21:02:58 +0900 > > > >>>>> Takashi Yano wrote: > > > >>>>>> On Fri, 3 Sep 2021 09:27:37 -0400 > > > >>>>>> Ken Brown wrote: > > > >>>>>>> On 9/3/2021 8:22 AM, Takashi Yano wrote: > > > >>>>>>>> POSIX says: > > > >>>>>>>> The value returned may be less than nbyte if the number of bytes left > > > >>>>>>>> in the file is less than nbyte, if the read() request was interrupted > > > >>>>>>>> by a signal, or if the file is a pipe or FIFO or special file and has > > > >>>>>>>> ~~~ > > > >>>>>>>> fewer than nbyte bytes immediately available for reading. > > > >>>>>>>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > > >>>>>>>> > > > >>>>>>>> https://pubs.opengroup.org/onlinepubs/009604599/functions/read.html > > > >>>>>>>> > > > >>>>>>>> If it is turned over, read() should read all data immediately available, > > > >>>>>>>> I think. > > > >>>>>>> [...] > > > >>>>>> Corinna Vinschen wrote: > > > >>>>>>> We can't keep the mutex while waiting on the pending read, and there > > > >>>>>>> could be more than one pending read running at the time. if so, > > > >>>>>>> chances are extremly high, that the data written to the buffer gets > > > >>>>>>> split like this: > > > >>>>>>> [...] > > > >>>>> Takashi Yano wrote: > > > >>>>>> Why can't we keep the mutex while waiting on the pending read? > > > >>>>>> If we can keep the mutex, the issue above mentioned does not > > > >>>>>> happen, right? > > [...] > > @@ -239,43 +237,51 @@ fhandler_pipe::raw_read (void *ptr, size_t& len) > > return; > > } > > > > - do > > + DWORD timeout = is_nonblocking () ? 0 : INFINITE; > > + if (WAIT_TIMEOUT == WaitForSingleObject (read_mtx, timeout)) > > My code was originally not supposed to serialise the readers. The > mutex block should be short lived and only create an atomic block > for the two calls NtQueryInformationFile and NtReadFile. > > If you have multiple readers, all but one of them will hang in this > WFSO. They will block here without a chance to kill or Ctrl-C them > and thread cancellation won't work. > > To fix that you have to use cygwait and handle signals and thread > cancellation the same way as in the below code following the NtReadFile. OK. Thanks for the advice. Then what about the patch attached? > > /* If the pipe is empty, don't request more bytes than half the > > - pipe buffer size. Every pending read lowers WriteQuotaAvailable > > - on the write side and thus affects select's ability to return > > - more or less reliable info whether a write succeeds or not. > > - > > - Let the size of the request depend on the number of readers > > - at the time. */ > > + pipe buffer size. Pending read lowers WriteQuotaAvailable on > > + the write side and thus affects select's ability to return > > + more or less reliable info whether a write succeeds or not. */ > > + ULONG chunk = max_atomic_write / 2; > > status = NtQueryInformationFile (get_handle (), &io, > > &fpli, sizeof (fpli), > > FilePipeLocalInformation); > > - if (NT_SUCCESS (status) && fpli.ReadDataAvailable == 0) > > If the readers are serialized anyway, why fetch only half the remaining > buffer size? In that case fetching fpli.InboundQuota - 1 is as good > as fetching just the half of it, isn't it? It sounds reasonable. Adopted in the attached patch. -- Takashi Yano --Multipart=_Mon__6_Sep_2021_20_16_43_+0900_HVfX7ROzJY404.CR Content-Type: application/octet-stream; name="0001-Cygwin-pipe-Stop-counting-reader-and-read-all-availa.patch" Content-Disposition: attachment; filename="0001-Cygwin-pipe-Stop-counting-reader-and-read-all-availa.patch" Content-Transfer-Encoding: base64 RnJvbSAwYmIyZWE5ZTU1MmY4Y2I3ODhjMDk3NTE5MTc0MTQ1Y2QzNjhiNDViIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBUYWthc2hpIFlhbm8gPHRha2FzaGkueWFub0BuaWZ0eS5uZS5q cD4KRGF0ZTogTW9uLCA2IFNlcCAyMDIxIDIwOjEyOjE2ICswOTAwClN1YmplY3Q6IFtQQVRDSF0g Q3lnd2luOiBwaXBlOiBTdG9wIGNvdW50aW5nIHJlYWRlciBhbmQgcmVhZCBhbGwgYXZhaWxhYmxl CiBkYXRhLgoKLSBCeSBndWFyZGluZyByZWFkIHdpdGggcmVhZF9tdHgsIG5vIG1vcmUgdGhhbiBv bmUgUmVhZEZpbGUgY2FuCiAgYmUgY2FsbGVkIHNpbXVsdGFuZW91c2x5LiBTbyBjb3V0aW5nIHJl YWQgaGFuZGxlcyBpcyBubyBsb25nZXIKICBuZWNlc3NhcnkuCi0gTWFrZSByYXdfcmVhZCBjb2Rl IGFzIHNpbWlsYXIgYXMgcG9zc2libGUgdG8gcmF3X3dyaXRlIGNvZGUuCi0tLQogd2luc3VwL2N5 Z3dpbi9maGFuZGxlcl9waXBlLmNjIHwgMTAwICsrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0t LS0tLQogMSBmaWxlIGNoYW5nZWQsIDYwIGluc2VydGlvbnMoKyksIDQwIGRlbGV0aW9ucygtKQoK ZGlmZiAtLWdpdCBhL3dpbnN1cC9jeWd3aW4vZmhhbmRsZXJfcGlwZS5jYyBiL3dpbnN1cC9jeWd3 aW4vZmhhbmRsZXJfcGlwZS5jYwppbmRleCA2ODk3NGViODAuLmZlMGJmMGNhMiAxMDA2NDQKLS0t IGEvd2luc3VwL2N5Z3dpbi9maGFuZGxlcl9waXBlLmNjCisrKyBiL3dpbnN1cC9jeWd3aW4vZmhh bmRsZXJfcGlwZS5jYwpAQCAtMjIxLDEyICsyMjEsMTAgQEAgZmhhbmRsZXJfcGlwZTo6Z2V0X3By b2NfZmRfbmFtZSAoY2hhciAqYnVmKQogdm9pZCBfX3JlZzMKIGZoYW5kbGVyX3BpcGU6OnJhd19y ZWFkICh2b2lkICpwdHIsIHNpemVfdCYgbGVuKQogewotICBOVFNUQVRVUyBzdGF0dXM7CisgIHNp emVfdCBuYnl0ZXMgPSAwOworICBOVFNUQVRVUyBzdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKICAg SU9fU1RBVFVTX0JMT0NLIGlvOwogICBIQU5ETEUgZXZ0ID0gTlVMTDsKLSAgRFdPUkQgd2FpdHJl dCA9IFdBSVRfT0JKRUNUXzA7Ci0gIGJvb2wga2VlcF9sb29waW5nID0gZmFsc2U7Ci0gIHNpemVf dCBvcmlnX2xlbiA9IGxlbjsKIAogICBpZiAoIWxlbikKICAgICByZXR1cm47CkBAIC0yMzksNDMg KzIzNyw1OSBAQCBmaGFuZGxlcl9waXBlOjpyYXdfcmVhZCAodm9pZCAqcHRyLCBzaXplX3QmIGxl bikKICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgZG8KKyAgRFdPUkQgdGltZW91dCA9IGlzX25v bmJsb2NraW5nICgpID8gMCA6IElORklOSVRFOworICBEV09SRCB3YWl0cmV0ID0gY3lnd2FpdCAo cmVhZF9tdHgsIHRpbWVvdXQpOworICBzd2l0Y2ggKHdhaXRyZXQpCiAgICAgewotICAgICAgbGVu ID0gb3JpZ19sZW47Ci0gICAgICBrZWVwX2xvb3BpbmcgPSBmYWxzZTsKKyAgICBjYXNlIFdBSVRf T0JKRUNUXzA6CisgICAgICBicmVhazsKKyAgICBjYXNlIFdBSVRfVElNRU9VVDoKKyAgICAgIHNl dF9lcnJubyAoRUFHQUlOKTsKKyAgICAgIGxlbiA9IChzaXplX3QpIC0xOworICAgICAgcmV0dXJu OworICAgIGRlZmF1bHQ6CisgICAgICBzZXRfZXJybm8gKEVJTlRSKTsKKyAgICAgIGxlbiA9IChz aXplX3QpIC0xOworICAgICAgcmV0dXJuOworICAgIH0KKyAgd2hpbGUgKG5ieXRlcyA8IGxlbikK KyAgICB7CisgICAgICBVTE9OR19QVFIgbmJ5dGVzX25vdyA9IDA7CisgICAgICBzaXplX3QgbGVm dCA9IGxlbiAtIG5ieXRlczsKKyAgICAgIFVMT05HIGxlbjEgPSAoVUxPTkcpIGxlZnQ7CisgICAg ICB3YWl0cmV0ID0gV0FJVF9PQkpFQ1RfMDsKKwogICAgICAgaWYgKGV2dCkKIAlSZXNldEV2ZW50 IChldnQpOwogICAgICAgaWYgKCFpc19ub25ibG9ja2luZyAoKSkKIAl7CiAJICBGSUxFX1BJUEVf TE9DQUxfSU5GT1JNQVRJT04gZnBsaTsKLQkgIFVMT05HIHJlYWRlcl9jb3VudDsKLQkgIFVMT05H IG1heF9sZW4gPSA2NDsKLQotCSAgV2FpdEZvclNpbmdsZU9iamVjdCAocmVhZF9tdHgsIElORklO SVRFKTsKIAotCSAgLyogSWYgdGhlIHBpcGUgaXMgZW1wdHksIGRvbid0IHJlcXVlc3QgbW9yZSBi eXRlcyB0aGFuIGhhbGYgdGhlCi0JICAgICBwaXBlIGJ1ZmZlciBzaXplLiAgRXZlcnkgcGVuZGlu ZyByZWFkIGxvd2VycyBXcml0ZVF1b3RhQXZhaWxhYmxlCi0JICAgICBvbiB0aGUgd3JpdGUgc2lk ZSBhbmQgdGh1cyBhZmZlY3RzIHNlbGVjdCdzIGFiaWxpdHkgdG8gcmV0dXJuCi0JICAgICBtb3Jl IG9yIGxlc3MgcmVsaWFibGUgaW5mbyB3aGV0aGVyIGEgd3JpdGUgc3VjY2VlZHMgb3Igbm90Lgot Ci0JICAgICBMZXQgdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QgZGVwZW5kIG9uIHRoZSBudW1iZXIg b2YgcmVhZGVycwotCSAgICAgYXQgdGhlIHRpbWUuICovCisJICAvKiBJZiB0aGUgcGlwZSBpcyBl bXB0eSwgZG9uJ3QgcmVxdWVzdCBtb3JlIGJ5dGVzIHRoYW4gcGlwZQorCSAgICAgYnVmZmVyIHNp emUgLSAxLiBQZW5kaW5nIHJlYWQgbG93ZXJzIFdyaXRlUXVvdGFBdmFpbGFibGUgb24KKwkgICAg IHRoZSB3cml0ZSBzaWRlIGFuZCB0aHVzIGFmZmVjdHMgc2VsZWN0J3MgYWJpbGl0eSB0byByZXR1 cm4KKwkgICAgIG1vcmUgb3IgbGVzcyByZWxpYWJsZSBpbmZvIHdoZXRoZXIgYSB3cml0ZSBzdWNj ZWVkcyBvciBub3QuICovCisJICBVTE9ORyBjaHVuayA9IG1heF9hdG9taWNfd3JpdGUgLSAxOwog CSAgc3RhdHVzID0gTnRRdWVyeUluZm9ybWF0aW9uRmlsZSAoZ2V0X2hhbmRsZSAoKSwgJmlvLAog CQkJCQkgICAmZnBsaSwgc2l6ZW9mIChmcGxpKSwKIAkJCQkJICAgRmlsZVBpcGVMb2NhbEluZm9y bWF0aW9uKTsKLQkgIGlmIChOVF9TVUNDRVNTIChzdGF0dXMpICYmIGZwbGkuUmVhZERhdGFBdmFp bGFibGUgPT0gMCkKKwkgIGlmIChOVF9TVUNDRVNTIChzdGF0dXMpKQogCSAgICB7Ci0JICAgICAg cmVhZGVyX2NvdW50ID0gZ2V0X29ial9oYW5kbGVfY291bnQgKGdldF9oYW5kbGUgKCkpOwotCSAg ICAgIGlmIChyZWFkZXJfY291bnQgPCAxMCkKLQkJbWF4X2xlbiA9IGZwbGkuSW5ib3VuZFF1b3Rh IC8gKDIgKiByZWFkZXJfY291bnQpOwotCSAgICAgIGlmIChsZW4gPiBtYXhfbGVuKQotCQlsZW4g PSBtYXhfbGVuOworCSAgICAgIGlmIChmcGxpLlJlYWREYXRhQXZhaWxhYmxlID4gMCkKKwkJY2h1 bmsgPSBsZWZ0OworCSAgICAgIGVsc2UgaWYgKG5ieXRlcyAhPSAwKQorCQlicmVhazsKKwkgICAg ICBlbHNlCisJCWNodW5rID0gZnBsaS5JbmJvdW5kUXVvdGEgLSAxOwogCSAgICB9CisJICBlbHNl IGlmIChuYnl0ZXMgIT0gMCkKKwkgICAgYnJlYWs7CisKKwkgIGlmIChsZW4xID4gY2h1bmspCisJ ICAgIGxlbjEgPSBjaHVuazsKIAl9CiAgICAgICBzdGF0dXMgPSBOdFJlYWRGaWxlIChnZXRfaGFu ZGxlICgpLCBldnQsIE5VTEwsIE5VTEwsICZpbywgcHRyLAotCQkJICAgbGVuLCBOVUxMLCBOVUxM KTsKLSAgICAgIGlmICghaXNfbm9uYmxvY2tpbmcgKCkpCi0JUmVsZWFzZU11dGV4IChyZWFkX210 eCk7CisJCQkgICBsZW4xLCBOVUxMLCBOVUxMKTsKICAgICAgIGlmIChldnQgJiYgc3RhdHVzID09 IFNUQVRVU19QRU5ESU5HKQogCXsKIAkgIHdhaXRyZXQgPSBjeWd3YWl0IChldnQpOwpAQCAtMjky LDEzICszMDYsMTMgQEAgZmhhbmRsZXJfcGlwZTo6cmF3X3JlYWQgKHZvaWQgKnB0ciwgc2l6ZV90 JiBsZW4pCiAJICAgIHNldF9lcnJubyAoRUJBREYpOwogCSAgZWxzZQogCSAgICBfX3NldGVycm5v ICgpOwotCSAgbGVuID0gKHNpemVfdCkgLTE7CisJICBuYnl0ZXMgPSAoc2l6ZV90KSAtMTsKIAl9 CiAgICAgICBlbHNlIGlmIChOVF9TVUNDRVNTIChzdGF0dXMpKQogCXsKLQkgIGxlbiA9IGlvLklu Zm9ybWF0aW9uOwotCSAgaWYgKGxlbiA9PSAwKQotCSAgICBrZWVwX2xvb3BpbmcgPSB0cnVlOwor CSAgbmJ5dGVzX25vdyA9IGlvLkluZm9ybWF0aW9uOworCSAgcHRyID0gKChjaGFyICopIHB0cikg KyBuYnl0ZXNfbm93OworCSAgbmJ5dGVzICs9IG5ieXRlc19ub3c7CiAJfQogICAgICAgZWxzZQog CXsKQEAgLTMwOCw0MCArMzIyLDQ2IEBAIGZoYW5kbGVyX3BpcGU6OnJhd19yZWFkICh2b2lkICpw dHIsIHNpemVfdCYgbGVuKQogCSAgICBjYXNlIFNUQVRVU19FTkRfT0ZfRklMRToKIAkgICAgY2Fz ZSBTVEFUVVNfUElQRV9CUk9LRU46CiAJICAgICAgLyogVGhpcyBpcyByZWFsbHkgRU9GLiAgKi8K LQkgICAgICBsZW4gPSAwOwogCSAgICAgIGJyZWFrOwogCSAgICBjYXNlIFNUQVRVU19NT1JFX0VO VFJJRVM6CiAJICAgIGNhc2UgU1RBVFVTX0JVRkZFUl9PVkVSRkxPVzoKIAkgICAgICAvKiBgaW8u SW5mb3JtYXRpb24nIGlzIHN1cHBvc2VkbHkgdmFsaWQuICAqLwotCSAgICAgIGxlbiA9IGlvLklu Zm9ybWF0aW9uOwotCSAgICAgIGlmIChsZW4gPT0gMCkKLQkJa2VlcF9sb29waW5nID0gdHJ1ZTsK KwkgICAgICBuYnl0ZXNfbm93ID0gaW8uSW5mb3JtYXRpb247CisJICAgICAgcHRyID0gKChjaGFy ICopIHB0cikgKyBuYnl0ZXNfbm93OworCSAgICAgIG5ieXRlcyArPSBuYnl0ZXNfbm93OwogCSAg ICAgIGJyZWFrOwogCSAgICBjYXNlIFNUQVRVU19QSVBFX0xJU1RFTklORzoKIAkgICAgY2FzZSBT VEFUVVNfUElQRV9FTVBUWToKKwkgICAgICBpZiAobmJ5dGVzICE9IDApCisJCWJyZWFrOwogCSAg ICAgIGlmIChpc19ub25ibG9ja2luZyAoKSkKIAkJewogCQkgIHNldF9lcnJubyAoRUFHQUlOKTsK LQkJICBsZW4gPSAoc2l6ZV90KSAtMTsKKwkJICBuYnl0ZXMgPSAoc2l6ZV90KSAtMTsKIAkJICBi cmVhazsKIAkJfQogCSAgICAgIGZhbGx0aHJvdWdoOwogCSAgICBkZWZhdWx0OgogCSAgICAgIF9f c2V0ZXJybm9fZnJvbV9udF9zdGF0dXMgKHN0YXR1cyk7Ci0JICAgICAgbGVuID0gKHNpemVfdCkg LTE7CisJICAgICAgbmJ5dGVzID0gKHNpemVfdCkgLTE7CiAJICAgICAgYnJlYWs7CiAJICAgIH0K IAl9Ci0gICAgfSB3aGlsZSAoa2VlcF9sb29waW5nKTsKKworICAgICAgaWYgKG5ieXRlc19ub3cg PT0gMCkKKwlicmVhazsKKyAgICB9CisgIFJlbGVhc2VNdXRleCAocmVhZF9tdHgpOwogICBpZiAo ZXZ0KQogICAgIENsb3NlSGFuZGxlIChldnQpOwotICBpZiAoc3RhdHVzID09IFNUQVRVU19USFJF QURfU0lHTkFMRUQpCisgIGlmIChzdGF0dXMgPT0gU1RBVFVTX1RIUkVBRF9TSUdOQUxFRCAmJiBu Ynl0ZXMgPT0gMCkKICAgICB7CiAgICAgICBzZXRfZXJybm8gKEVJTlRSKTsKLSAgICAgIGxlbiA9 IChzaXplX3QpIC0xOworICAgICAgbmJ5dGVzID0gKHNpemVfdCkgLTE7CiAgICAgfQogICBlbHNl IGlmIChzdGF0dXMgPT0gU1RBVFVTX1RIUkVBRF9DQU5DRUxFRCkKICAgICBwdGhyZWFkOjpzdGF0 aWNfY2FuY2VsX3NlbGYgKCk7CisgIGxlbiA9IG5ieXRlczsKIH0KIAogc3NpemVfdCBfX3JlZzMK LS0gCjIuMzMuMAoK --Multipart=_Mon__6_Sep_2021_20_16_43_+0900_HVfX7ROzJY404.CR--