From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-2.8 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL autolearn=ham autolearn_force=no version=3.4.4 Received: from second.openwall.net (second.openwall.net [193.110.157.125]) by inbox.vuxu.org (Postfix) with SMTP id 1F0CB20CE5 for ; Wed, 27 Mar 2024 01:38:21 +0100 (CET) Received: (qmail 7525 invoked by uid 550); 27 Mar 2024 00:33:32 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 7490 invoked from network); 27 Mar 2024 00:33:32 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pm.me; s=protonmail3; t=1711499887; x=1711759087; bh=8G/d2h1bL7oUyZE9gAeR2vrkSFqddyfdLQ3zoufd/hk=; h=Date:To:From:Subject:Message-ID:In-Reply-To:References: Feedback-ID:From:To:Cc:Date:Subject:Reply-To:Feedback-ID: Message-ID:BIMI-Selector; b=WBXFOrHPtWGUske3iD0CGiK6KGgKYTkaXk1PSwgjYYq8mxuWISV873WxDWhWcOg3z FFK+S/qn2kW2pA5kP/0BvXlLBsy/+KDvpGqrCOCepNgKZEsNX57NbHlg+RQAOgXF6v 7fkQ6/ohWOkoNPHdDPDH/R5MmL6IyjV1KH0VwKkKDwmaYXbGTxsm0+Jtp+xK/oFKTk pjpvgZT2/sbtFmIJQ1Z4ETFC1fXV4WaezROVQ1XF6/tAcK1HNj4aNNrufApMCKXFy9 MYILNAHWfj89iGJiL/3PGEQAE/oZcctrYkZdVbLmBJu213FH8E0Lpvd/fppbjs3nQV CI7p100ZntnQg== Date: Wed, 27 Mar 2024 00:38:04 +0000 To: musl@lists.openwall.com From: Alexander Weps Message-ID: In-Reply-To: References: <20240325122113.GB4163@brightrain.aerifal.cx> Feedback-ID: 20507743:user:proton MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_lADXoySr2WoMwPHCTeBDN2Gs6JHMaEnMkFt1Ghrows" Subject: Re: [musl] Broken mktime calculations when crossing DST boundary This is a multi-part message in MIME format. --b1_lADXoySr2WoMwPHCTeBDN2Gs6JHMaEnMkFt1Ghrows Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Attaching whole: Minutes of the 27th July 2023 Teleconference Austin-1332 Page 1 of 1 Submitted by Andrew Josey, The Open Group. 28th July 2023 Also go through: https://www.austingroupbugs.net/view.php?id=3D1614 Seems most of what We talk here was already addressed. AW On Wednesday, March 27th, 2024 at 01:14, Alexander Weps w= rote: > See below. > > AW > > > > > On Tuesday, March 26th, 2024 at 22:59, Thorsten Glaser tg@mirbsd.de wrote= : > > > Alexander Weps dixit: > > > > > > Not at all, glibc=E2=80=99s mktime just throws the towel with > > > > EOVERFLOW saying that the requested time does not exist. > > > > > > How is this not compliant with POSIX? > > > > POSIX indicates that this is valid only if the date is not > > representable in time_t, and it has different handling for > > dates that fall into gaps, see the other mails from me, as > > well as below. > > > I think you confuse two things here: > > 1. mktime returning -1 > 2. mktime setting errno to EOVERFLOW > > The 2. maybe debatable in obscure circles, but that's entirely unrelated. > > But mktime can return -1 if and when it deems that struct tm cannot be re= presented in epoch seconds. > > That is entirely compliant with POSIX and I would need to see some hard e= vidence for it not being the case. > > From Issue 7: > > > RETURN VALUE > > > > The mktime() function shall return the specified time since the Epoch e= ncoded as a value of type time_t. If the time since the Epoch cannot be rep= resented, the function shall return the value (time_t)-1 [CX] [Option Start= ] and set errno to indicate the error. [Option End] > > > > ERRORS > > > > The mktime() function shall fail if: > > > > [EOVERFLOW] > > [CX] [Option Start] The result cannot be represented. [Option End] > > > > First and foremost mktime may fail and when it fails it returns -1. > > Issue 6: If the time since the Epoch cannot be represented, the function = shall return the value (time_t)-1 and may set errno to indicate the error. > Isuse 7: If the time since the Epoch cannot be represented, the function = shall return the value (time_t)-1 and set errno to indicate the error. > > Only errno offered is EOVERFLOW. > So I interpret it that since Issue 7, the correct behavior is to set errn= o to EOVERFLOW. > > Also from: > Minutes of the 27th July 2023 Teleconference Austin-1332 Page 1 of 1 > Submitted by Andrew Josey, The Open Group. 28th July 2023 > > > Bug 1614: XSH 3/mktime does not specify EINVAL and should Accepted as M= arked > > https://austingroupbugs.net/view.php?id=3D1614 > > > > An interpretation is required. > > > > Interpretation response: > > The standard clearly states that when an unsuccessful call to > > mktime() returns (time_t)-1 it sets errno to [EOVERFLOW], and > > conforming implementations must conform to this. > > > > Rationale: > > > > The RETURN VALUE section on the mktime() page states: > > If the time since the Epoch cannot be represented, the function > > shall return the value (time_t)-1 [CX]and set errno to indicate > > the error[/CX]. > > > > This requires that errno is set to indicate "the error", and the > > beginning of the sentence states the nature of the error condition > > to which "the error" refers: the time since the Epoch (i.e. the > > integer value to be returned) cannot be represented. The ERRORS > > section requires that the error number [EOVERFLOW] is used for this > > condition. > > > > Thus the standard requires that errno is set to [EOVERFLOW] when > > an unsuccessful call to mktime() returns (time_t)-1 and an > > implementation that sets it to [EINVAL] does not conform. > > > > The mktime() function does not have any way to indicate to the > > caller that an error other than [EOVERFLOW] occurred. > > > > This is perfectly valid behavior, that is both expected and can be > > > handled in code easily. > > > > No, it=E2=80=99s a bug in glibc. > > > > > I have to ask, but have you actually used mktime from the application= end? > > > > Of course. > > > > > I am not sure what you mean by correct. Struct tm is neither correct > > > nor incorrect. It can be in three states: > > > 1) Set by user. > > > 2) Normalized by mktime. > > > 3) Not fully normalized by mktime. > > > > Huh? No. > > > Then explain what is incorrect struct tm. > > > > If I get -1, I know the struct tm does not represent valid time_t and= I > > > handle it and move on. > > > > Define =E2=80=9Cmove on=E2=80=9D. With POSIX=E2=80=99 mktime interface,= if you get -1 and > > EOVERFLOW, then moving further into the same direction will never > > give you not -1 again, because -1 is what you get when your tm_year > > was too far out of the representation (e.g. 2039 on a system with > > a 32-bit time_t). > > > Not true as shown above. > > > EOVERFLOW means that the time cannot be represented in time_t, not > > that the time cannot be represented in struct tm. And for these > > gaps, the time_t values are consecutive (1325239199/1325239200). > > > No, return value -1 means that the time cannot represented as epoch secon= ds (for any number of reasons). > > Required errno is Issue 7 change that should be used to indicate type of = error, but only EOVERFLOW is listed. > > > > This is perfect example (TZ=3DPacific/Apia): > > > > > > before: 2011-12-31 00:00:00 +14 0 > > > after1: 2011-12-31 00:00:00 +14 1325239200 > > > after1: 2011-12-30 00:00:00 +14 -1 > > > > No, this cannot give -1 per POSIX. > > > Not true as shown above. > > > > Musl instead of giving sane results starts running in the circle at s= ome point: > > > after2: 2011-12-29 00:00:00 -10 1325152800 > > > after3: 2011-12-29 00:00:00 -10 1325152800 > > > > That=E2=80=99s because it does this correctly. > > > > > Doesn't work, this will not give the same time next day, this fails o= n > > > STD/DST changes. > > > > > > Because same time next day is not always 86400 apart. > > > > I know. But the basic assumption that there even is such a > > thing as =E2=80=9Csame time next day=E2=80=9D made by you is invalid. P= OSIX > > listed several examples (29=E1=B5=97=CA=B0 February next year as well a= s > > gaps in timezone offsets). > > > > One thing you can do is to add 86400, localtime(), then check > > that at least tm_mday, tm_hour and tm_min (Issue 8d4, line > > 48052) are what you expect, and handle cases where they aren=E2=80= =99t > > manually. But having added 86400, you have two starting points > > from which to manually approach this (the original value and > > the newer value). (Perhaps a location could even skip more than > > 24 hours in a discontinuity.) > > > > bye, > > //mirabilos > > -- > > =E2=80=9CHaving a smoking section in a restaurant is like having > > a peeing section in a swimming pool.=E2=80=9D > > -- Edward Burr --b1_lADXoySr2WoMwPHCTeBDN2Gs6JHMaEnMkFt1Ghrows Content-Type: text/plain; name=austin_1332.txt Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=austin_1332.txt TWludXRlcyBvZiB0aGUgMjd0aCBKdWx5IDIwMjMgVGVsZWNvbmZlcmVuY2UgICAgQXVzdGluLTEz MzIgUGFnZSAxIG9mIDEKU3VibWl0dGVkIGJ5IEFuZHJldyBKb3NleSwgVGhlIE9wZW4gR3JvdXAu ICAgICAgICAgMjh0aCBKdWx5IDIwMjMKCkF0dGVuZGVlczoKICAgIEFuZHJldyBKb3NleSwgVGhl IE9wZW4gR3JvdXAgCiAgICBEb24gQ3JhZ3VuLCAgSUVFRSBQQVNDIE9SCiAgICBNYXJrIFppZWdh c3QsIFNId2FyZSBTeXN0ZW1zIERldi4KICAgIEdlb2ZmIENsYXJlLCBUaGUgT3BlbiBHcm91cAog ICAgRXJpYyBBY2tlcm1hbm4sIEhQSSwgVW5pdmVyc2l0eSBvZiBQb3RzZGFtCiAgICBFcmljIEJs YWtlLCBSZWQgSGF0LCBUaGUgT3BlbiBHcm91cCBPUgoKQXBvbG9naWVzCiAgICBOaWNrIFN0b3Vn aHRvbiwgTG9naXRlY2gvVVNFTklYLCBJU08vSUVDIEpUQyAxL1NDIDIyIE9SIAogICAgVG9tIFRo b21wc29uLCBJRUVFCgoqIEdlbmVyYWwgbmV3cwoKVGhlIG1lZXRpbmcgb24gSnVseSAzMSB3aWxs IGJlIGEgd2ViZXguClRoZSBtZWV0aW5nIGxvZ2lzdGljcyBmb3IgQXVndXN0IDNyZCBhcmUgdW5k ZWNpZGVkIGFzIHRvIHdoZXRoZXIgaXQKaXMgYSB6b29tIG9yIHdlYmV4IG1lZXRpbmcuIFdlIHdp bGwgY2hlY2sgd2l0aCBOaWNrIG9uIE1vbmRheS4KCkFuZHJldyBub3RlZCB0aGF0IGRyYWZ0IHBs YW5uaW5nIGlzIHN0aWxsIHRvIGJlIGRvbmUuIApJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBjdXRv ZmYgZm9yIHRoZSBuZXh0IGRyYWZ0IHdpbGwgYmUgZGV0ZXJtaW5lZApieSB0aGUgY2xvc2luZyBk YXRlIGZvciBvcGVuIGludGVycHJldGF0aW9ucy4KCiogQ3VycmVudCBCdXNpbmVzcwoKTm90ZSBm b3IgaXNzdWUgcmVzb2x1dGlvbiBhbGwgaXRlbXMgYXJlIHRhZ2dlZCBmb3IgSXNzdWUgOCB1bmxl c3MKbm90ZWQgb3RoZXJ3aXNlIG9yIGRpc3Bvc2l0aW9uIGlzIHJlamVjdCBvciBkdXBsaWNhdGUu CgoKQnVnIDE3NjY6IGNhdGdldHM6IHF1b3RhdGlvbiBpbiAiQ2hhbmdlIEhpc3RvcnkiIGxhY2tz IGNsb3NpbmcgcXVvdGVzIEFjY2VwdGVkCmh0dHBzOi8vYXVzdGluZ3JvdXBidWdzLm5ldC92aWV3 LnBocD9pZD0xNzY2CgpUaGlzIGl0ZW0gaXMgdGFnZ2VkIGZvciBUQzMtMjAwOC4KCkJ1ZyAxNzY5 OiBDWCBzaGFkaW5nIG5lZWRlZCBmb3IgZnB1dHdjKCkgRUlMU0VRIGVycm9yIGluZGljYXRvciBy ZXF1aXJlbWVudCBBY2NlcHRlZApodHRwczovL2F1c3Rpbmdyb3VwYnVncy5uZXQvdmlldy5waHA/ aWQ9MTc2OQoKCkJ1ZyAxNjE0OiBYU0ggMy9ta3RpbWUgZG9lcyBub3Qgc3BlY2lmeSBFSU5WQUwg YW5kIHNob3VsZCAgQWNjZXB0ZWQgYXMgTWFya2VkCmh0dHBzOi8vYXVzdGluZ3JvdXBidWdzLm5l dC92aWV3LnBocD9pZD0xNjE0CgpBbiBpbnRlcnByZXRhdGlvbiBpcyByZXF1aXJlZC4KCkludGVy cHJldGF0aW9uIHJlc3BvbnNlOgpUaGUgc3RhbmRhcmQgY2xlYXJseSBzdGF0ZXMgdGhhdCB3aGVu IGFuIHVuc3VjY2Vzc2Z1bCBjYWxsIHRvCm1rdGltZSgpIHJldHVybnMgKHRpbWVfdCktMSBpdCBz ZXRzIGVycm5vIHRvIFtFT1ZFUkZMT1ddLCBhbmQKY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbnMg bXVzdCBjb25mb3JtIHRvIHRoaXMuCgpSYXRpb25hbGU6CgpUaGUgUkVUVVJOIFZBTFVFIHNlY3Rp b24gb24gdGhlIG1rdGltZSgpIHBhZ2Ugc3RhdGVzOgogICAgSWYgdGhlIHRpbWUgc2luY2UgdGhl IEVwb2NoIGNhbm5vdCBiZSByZXByZXNlbnRlZCwgdGhlIGZ1bmN0aW9uCiAgICBzaGFsbCByZXR1 cm4gdGhlIHZhbHVlICh0aW1lX3QpLTEgW0NYXWFuZCBzZXQgZXJybm8gdG8gaW5kaWNhdGUKICAg IHRoZSBlcnJvclsvQ1hdLgoKVGhpcyByZXF1aXJlcyB0aGF0IGVycm5vIGlzIHNldCB0byBpbmRp Y2F0ZSAidGhlIGVycm9yIiwgYW5kIHRoZQpiZWdpbm5pbmcgb2YgdGhlIHNlbnRlbmNlIHN0YXRl cyB0aGUgbmF0dXJlIG9mIHRoZSBlcnJvciBjb25kaXRpb24KdG8gd2hpY2ggInRoZSBlcnJvciIg cmVmZXJzOiB0aGUgdGltZSBzaW5jZSB0aGUgRXBvY2ggKGkuZS4gdGhlCmludGVnZXIgdmFsdWUg dG8gYmUgcmV0dXJuZWQpIGNhbm5vdCBiZSByZXByZXNlbnRlZC4gVGhlIEVSUk9SUwpzZWN0aW9u IHJlcXVpcmVzIHRoYXQgdGhlIGVycm9yIG51bWJlciBbRU9WRVJGTE9XXSBpcyB1c2VkIGZvciB0 aGlzCmNvbmRpdGlvbi4KClRodXMgdGhlIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgZXJybm8gaXMg c2V0IHRvIFtFT1ZFUkZMT1ddIHdoZW4KYW4gdW5zdWNjZXNzZnVsIGNhbGwgdG8gbWt0aW1lKCkg cmV0dXJucyAodGltZV90KS0xIGFuZCBhbgppbXBsZW1lbnRhdGlvbiB0aGF0IHNldHMgaXQgdG8g W0VJTlZBTF0gZG9lcyBub3QgY29uZm9ybS4KClRoZSBta3RpbWUoKSBmdW5jdGlvbiBkb2VzIG5v dCBoYXZlIGFueSB3YXkgdG8gaW5kaWNhdGUgdG8gdGhlCmNhbGxlciB0aGF0IGFuIGVycm9yIG90 aGVyIHRoYW4gW0VPVkVSRkxPV10gb2NjdXJyZWQuCgpOb3RlcyB0byB0aGUgRWRpdG9yIChub3Qg cGFydCBvZiB0aGlzIGludGVycHJldGF0aW9uKToKT24gcGFnZSA0MjUgbGluZSAxNDQ1MSBzZWN0 aW9uIDx0aW1lLmg+LCBhZnRlciBhcHBseWluZyBidWcgMTI1MyBjaGFuZ2U6CiAgICBUaGUgdmFs dWUgb2YgdG1faXNkc3Qgc2hhbGwgYmUgcG9zaXRpdmUgaWYgRGF5bGlnaHQgU2F2aW5nIFRpbWUK ICAgIGlzIGluIGVmZmVjdCwgMCBpZiBEYXlsaWdodCBTYXZpbmcgVGltZSBpcyBub3QgaW4gZWZm ZWN0LCBhbmQKICAgIG5lZ2F0aXZlIGlmIHRoZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxl Lgp0bzoKICAgIFdoZW4gdG1faXNkc3QgaXMgc2V0IGJ5IGFuIGludGVyZmFjZSBkZWZpbmVkIGlu IHRoaXMgc3RhbmRhcmQsCiAgICBpdHMgdmFsdWUgc2hhbGwgYmUgcG9zaXRpdmUgaWYgRGF5bGln aHQgU2F2aW5nIFRpbWUgKERTVCkgaXMKICAgIGluIGVmZmVjdCBhbmQgMCBpZiBEU1QgaXMgbm90 IGluIGVmZmVjdC4gW0NYXUl0IHNoYWxsIG5vdCBiZQogICAgc2V0IHRvIGEgbmVnYXRpdmUgdmFs dWUgYnkgYW55IGludGVyZmFjZSBkZWZpbmVkIGluIHRoaXMgc3RhbmRhcmQuCiAgICBXaGVuIHRt X2lzZHN0IGlzIHBhc3NlZCB0byB0aGUgbWt0aW1lKCkgZnVuY3Rpb24sIGl0IHNwZWNpZmllcwog ICAgaG93IG1rdGltZSgpIGlzIHRvIGhhbmRsZSBEU1Qgd2hlbiBjYWxjdWxhdGluZyB0aGUgdGlt ZSBzaW5jZQogICAgdGhlIEVwb2NoIHZhbHVlOyBzZWUgW3hyZWYgdG8gbWt0aW1lKCldLlsvQ1hd CgpPbiBwYWdlIDEzMzEgbGluZSA0NDMxMCBzZWN0aW9uIG1rdGltZSgpLCBkZWxldGU6CiAgICBB IHBvc2l0aXZlIG9yIDAgdmFsdWUgZm9yIHRtX2lzZHN0IHNoYWxsIGNhdXNlIG1rdGltZSgpIHRv CiAgICBwcmVzdW1lIGluaXRpYWxseSB0aGF0IERheWxpZ2h0IFNhdmluZ3MgVGltZSwgcmVzcGVj dGl2ZWx5LCBpcwogICAgb3IgaXMgbm90IGluIGVmZmVjdCBmb3IgdGhlIHNwZWNpZmllZCB0aW1l LiBBIG5lZ2F0aXZlIHZhbHVlCiAgICBmb3IgdG1faXNkc3Qgc2hhbGwgY2F1c2UgbWt0aW1lKCkg dG8gYXR0ZW1wdCB0byBkZXRlcm1pbmUgd2hldGhlcgogICAgRGF5bGlnaHQgU2F2aW5ncyBUaW1l IGlzIGluIGVmZmVjdCBmb3IgdGhlIHNwZWNpZmllZCB0aW1lLgoKT24gcGFnZSAxMzMxIGxpbmUg NDQzMTcgc2VjdGlvbiBta3RpbWUoKSwgY2hhbmdlOgogICAgY29ycmVjdGVkIGZvciB0aW1lem9u ZSBhbmQgYW55IHNlYXNvbmFsIHRpbWUgYWRqdXN0bWVudHMKdG86CiAgICBjb3JyZWN0ZWQgZm9y IHRoZSBvZmZzZXQgb2YgdGhlIHRpbWV6b25lJ3Mgc3RhbmRhcmQgdGltZSBmcm9tCiAgICBDb29y ZGluYXRlZCBVbml2ZXJzYWwgVGltZSBhbmQgZnVydGhlciBjb3JyZWN0ZWQgKGlmIGFwcGxpY2Fi bGUtLXNlZQogICAgYmVsb3cpIGZvciBEYXlsaWdodCBTYXZpbmcgVGltZQoKQWZ0ZXIgcGFnZSAx MzMxIGxpbmUgNDQzMjEgc2VjdGlvbiBta3RpbWUoKSwgYWRkIHRoZXNlIG5ldyBwYXJhZ3JhcGhz OgogICAgW0NYXUlmIHRoZSB0aW1lem9uZSBpcyBvbmUgdGhhdCBpbmNsdWRlcyBEYXlsaWdodCBT YXZpbmcgVGltZQogICAgKERTVCkgYWRqdXN0bWVudHMsIHRoZSB2YWx1ZSBvZiB0bV9pc2RzdCBp biB0aGUgdG0gc3RydWN0dXJlCiAgICBjb250cm9scyB3aGV0aGVyIG9yIG5vdCBta3RpbWUoKSBh ZGp1c3RzIHRoZSBjYWxjdWxhdGVkIHNlY29uZHMKICAgIHNpbmNlIHRoZSBFcG9jaCB2YWx1ZSBi eSB0aGUgRFNUIG9mZnNldCAoYWZ0ZXIgaXQgaGFzIG1hZGUgdGhlCiAgICB0aW1lem9uZSBhZGp1 c3RtZW50KSwgYXMgZm9sbG93czoKCglJZiB0bV9pc2RzdCBpcyB6ZXJvLCBta3RpbWUoKSBzaGFs bCBub3QgZnVydGhlciBhZGp1c3QgdGhlCglzZWNvbmRzIHNpbmNlIHRoZSBFcG9jaCBieSB0aGUg RFNUIG9mZnNldC4KCglJZiB0bV9pc2RzdCBpcyBwb3NpdGl2ZSwgbWt0aW1lKCkgc2hhbGwgZnVy dGhlciBhZGp1c3QgdGhlCglzZWNvbmRzIHNpbmNlIHRoZSBFcG9jaCBieSB0aGUgRFNUIG9mZnNl dC4KCglJZiB0bV9pc2RzdCBpcyBuZWdhdGl2ZSwgbWt0aW1lKCkgc2hhbGwgYXR0ZW1wdCB0byBk ZXRlcm1pbmUKCXdoZXRoZXIgRFNUIGlzIGluIGVmZmVjdCBmb3IgdGhlIHNwZWNpZmllZCB0aW1l OyBpZiBpdAoJZGV0ZXJtaW5lcyB0aGF0IERTVCBpcyBpbiBlZmZlY3QgaXQgc2hhbGwgcHJvZHVj ZSB0aGUgc2FtZQoJcmVzdWx0IGFzIGFuIGVxdWl2YWxlbnQgY2FsbCB3aXRoIGEgcG9zaXRpdmUg dG1faXNkc3QgdmFsdWUsCglvdGhlcndpc2UgaXQgc2hhbGwgcHJvZHVjZSB0aGUgc2FtZSByZXN1 bHQgYXMgYW4gZXF1aXZhbGVudAoJY2FsbCB3aXRoIGEgdG1faXNkc3QgdmFsdWUgb2YgemVyby4g SWYgdGhlIGJyb2tlbi1kb3duIHRpbWUKCXNwZWNpZmllcyBhIHRpbWUgdGhhdCBpcyBlaXRoZXIg c2tpcHBlZCBvdmVyIG9yIHJlcGVhdGVkCgl3aGVuIGEgdHJhbnNpdGlvbiB0byBvciBmcm9tIERT VCBvY2N1cnMsIGl0IGlzIHVuc3BlY2lmaWVkCgl3aGV0aGVyIG1rdGltZSgpIHByb2R1Y2VzIHRo ZSBzYW1lIHJlc3VsdCBhcyBhbiBlcXVpdmFsZW50CgljYWxsIHdpdGggYSBwb3NpdGl2ZSB0bV9p c2RzdCB2YWx1ZSBvciBhcyBhbiBlcXVpdmFsZW50CgljYWxsIHdpdGggYSB0bV9pc2RzdCB2YWx1 ZSBvZiB6ZXJvLgoKICAgIElmIHRoZSBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzcGVjaWZpZXMg YSBnZW9ncmFwaGljYWwgdGltZXpvbmUKICAgIGZvciB3aGljaCB0aGUgaW1wbGVtZW50YXRpb24n cyB0aW1lem9uZSBkYXRhYmFzZSBpbmNsdWRlcwogICAgaGlzdG9yaWNhbCBvciBmdXR1cmUgY2hh bmdlcyB0byB0aGUgb2Zmc2V0IGZyb20gQ29vcmRpbmF0ZWQKICAgIFVuaXZlcnNhbCBUaW1lIG9m IHRoZSB0aW1lem9uZSdzIHN0YW5kYXJkIHRpbWUsIGFuZCB0aGUgYnJva2VuLWRvd24KICAgIHRp bWUgY29ycmVzcG9uZHMgdG8gYSB0aW1lIHRoYXQgd2FzIChvciB3aWxsIGJlKSBza2lwcGVkIG92 ZXIKICAgIG9yIHJlcGVhdGVkIGR1ZSB0byB0aGUgb2NjdXJyZW5jZSBvZiBzdWNoIGEgY2hhbmdl LCBta3RpbWUoKQogICAgc2hhbGwgY2FsY3VsYXRlIHRoZSB0aW1lIHNpbmNlIHRoZSBFcG9jaCB2 YWx1ZSB1c2luZyBlaXRoZXIgdGhlCiAgICBvZmZzZXQgaW4gZWZmZWN0IGJlZm9yZSB0aGUgY2hh bmdlIG9yIHRoZSBvZmZzZXQgaW4gZWZmZWN0IGFmdGVyCiAgICB0aGUgY2hhbmdlLlsvQ1hdCgpP biBwYWdlIDEzMzEgbGluZSA0NDMyMyBzZWN0aW9uIG1rdGltZSgpLCBhZnRlciBhcHBseWluZyBi dWcgMTYxMyBjaGFuZ2U6CiAgICB3aXRoIHRoZSBzcGVjaWZpZWQgdGltZSBzaW5jZSB0aGUgRXBv Y2ggYXMgaXRzIGFyZ3VtZW50CnRvOgogICAgd2l0aCB0aGUgY2FsY3VsYXRlZCB0aW1lIHNpbmNl IHRoZSBFcG9jaCBhcyBpdHMgYXJndW1lbnQKCk9uIHBhZ2UgMTMzMSBsaW5lIDQ0MzI3IHNlY3Rp b24gbWt0aW1lKCksIGNoYW5nZToKICAgIFRoZSBta3RpbWUoKSBmdW5jdGlvbiBzaGFsbCByZXR1 cm4gdGhlIHNwZWNpZmllZCB0aW1lIHNpbmNlIHRoZQogICAgRXBvY2ggZW5jb2RlZCBhcyBhIHZh bHVlIG9mIHR5cGUgdGltZV90LiBJZiB0aGUgdGltZSBzaW5jZSB0aGUKICAgIEVwb2NoIGNhbm5v dCBiZSByZXByZXNlbnRlZCwgdGhlIGZ1bmN0aW9uIHNoYWxsIHJldHVybiB0aGUgdmFsdWUKICAg ICh0aW1lX3QpLTEgW0NYXWFuZCBzZXQgZXJybm8gdG8gaW5kaWNhdGUgdGhlIGVycm9yWy9DWF0u CnRvOgogICAgVGhlIG1rdGltZSgpIGZ1bmN0aW9uIHNoYWxsIHJldHVybiB0aGUgY2FsY3VsYXRl ZCB0aW1lIHNpbmNlCiAgICB0aGUgRXBvY2ggZW5jb2RlZCBhcyBhIHZhbHVlIG9mIHR5cGUgdGlt ZV90LiBJZiB0aGUgdGltZSBzaW5jZQogICAgdGhlIEVwb2NoIGNhbm5vdCBiZSByZXByZXNlbnRl ZCBhcyBhIHRpbWVfdCBbQ1hdb3IgdGhlIHZhbHVlCiAgICB0byBiZSByZXR1cm5lZCBpbiB0aGUg dG1feWVhciBtZW1iZXIgb2YgdGhlIHN0cnVjdHVyZSBwb2ludGVkCiAgICB0byBieSB0aW1lcHRy IGNhbm5vdCBiZSByZXByZXNlbnRlZCBhcyBhbiBpbnRbL0NYXSwgdGhlIGZ1bmN0aW9uCiAgICBz aGFsbCByZXR1cm4gdGhlIHZhbHVlICh0aW1lX3QpLTEgW0NYXWFuZCBzZXQgZXJybm8gdG8gW0VP VkVSRkxPV10sCiAgICBhbmQgc2hhbGwgbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIHRtX3dk YXkgY29tcG9uZW50IG9mIHRoZQogICAgc3RydWN0dXJlLlsvQ1hdCgogICAgW0NYXVNpbmNlICh0 aW1lX3QpLTEgaXMgYSB2YWxpZCByZXR1cm4gdmFsdWUgZm9yIGEgc3VjY2Vzc2Z1bAogICAgY2Fs bCB0byBta3RpbWUoKSwgYW4gYXBwbGljYXRpb24gd2lzaGluZyB0byBjaGVjayBmb3IgZXJyb3IK ICAgIHNpdHVhdGlvbnMgc2hvdWxkIHNldCB0bV93ZGF5IHRvIGEgdmFsdWUgbGVzcyB0aGFuIDAg b3IgZ3JlYXRlcgogICAgdGhhbiA2IGJlZm9yZSBjYWxsaW5nIG1rdGltZSgpLiBPbiByZXR1cm4s IGlmIHRtX3dkYXkgaGFzIG5vdAogICAgY2hhbmdlZCBhbiBlcnJvciBoYXMgb2NjdXJyZWQuWy9D WF0KCk9uIHBhZ2UgMTMzMiBsaW5lIDQ0MzQ4IHNlY3Rpb24gbWt0aW1lKCksIGNoYW5nZToKICAg IGlmIChta3RpbWUoJnRpbWVfc3RyKSA9PSAtMSkKdG86CiAgICB0aW1lX3N0ci50bV93ZGF5ID0g LTE7CiAgICBpZiAobWt0aW1lKCZ0aW1lX3N0cikgPT0gKHRpbWVfdCktMSAmJiB0aW1lX3N0ci50 bV93ZGF5ID09IC0xKQoKT24gcGFnZSAxMzMyIGxpbmUgNDQzNTkgc2VjdGlvbiBta3RpbWUoKSwg Y2hhbmdlIFJBVElPTkFMRSBmcm9tICJOb25lIiB0bzoKICAgIEluIG9yZGVyIHRvIGFsbG93IGFw cGxpY2F0aW9ucyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgc3VjY2Vzc2Z1bAogICAgcmV0dXJu IG9mICh0aW1lX3QpLTEgYW5kIGFuIFtFT1ZFUkZMT1ddIGVycm9yLCBta3RpbWUoKSBpcwogICAg cmVxdWlyZWQgbm90IHRvIGNoYW5nZSB0bV93ZGF5IG9uIGVycm9yLiBUaGlzIG1lY2hhbmlzbSBp cyB1c2VkCiAgICByYXRoZXIgdGhhbiB0aGUgY29udmVudGlvbiB1c2VkIGZvciBvdGhlciBmdW5j dGlvbnMgd2hlcmVieSB0aGUKICAgIGFwcGxpY2F0aW9uIHNldHMgZXJybm8gdG8gemVybyBiZWZv cmUgdGhlIGNhbGwgYW5kIHRoZSBjYWxsCiAgICBkb2VzIG5vdCBjaGFuZ2UgZXJybm8gb24gZXJy b3IgYmVjYXVzZSB0aGUgSVNPIEMgc3RhbmRhcmQgZG9lcwogICAgbm90IHJlcXVpcmUgbWt0aW1l KCkgdG8gc2V0IGVycm5vIG9uIGVycm9yLiBUaGUgbmV4dCByZXZpc2lvbgogICAgb2YgdGhlIElT TyBDIHN0YW5kYXJkIGlzIGV4cGVjdGVkIHRvIHJlcXVpcmUgdGhhdCBta3RpbWUoKSBkb2VzCiAg ICBub3QgY2hhbmdlIHRtX3dkYXkgd2hlbiByZXR1cm5pbmcgKHRpbWVfdCktMSB0byBpbmRpY2F0 ZSBhbgogICAgZXJyb3IsIGFuZCB0aGF0IHRoaXMgcmV0dXJuIGNvbnZlbnRpb24gaXMgdXNlZCBi b3RoIGZvciB0aGUKICAgIGNhc2Ugd2hlcmUgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGJ5IHRo ZSBmdW5jdGlvbiBjYW5ub3QgYmUKICAgIHJlcHJlc2VudGVkIGFzIGEgdGltZV90IGFuZCB0aGUg Y2FzZSB3aGVyZSB0aGUgdmFsdWUgdG8gYmUKICAgIHJldHVybmVkIGluIHRoZSB0bV95ZWFyIG1l bWJlciBvZiB0aGUgdG0gc3RydWN0dXJlIGNhbm5vdCBiZQogICAgcmVwcmVzZW50ZWQgYXMgYW4g aW50LgoKICAgIFRoZSBERVNDUklQVElPTiBzZWN0aW9uIHNheXMgdGhhdCBta3RpbWUoKSBjb252 ZXJ0cyB0aGUgc3BlY2lmaWVkCiAgICBicm9rZW4tZG93biB0aW1lIGludG8gYSB0aW1lIHNpbmNl IHRoZSBFcG9jaCB2YWx1ZS4gVGhlIHVzZSBvZgogICAgdGhlIGluZGVmaW5pdGUgYXJ0aWNsZSBo ZXJlIGlzIG5lY2Vzc2FyeSBiZWNhdXNlLCB3aGVuIHRtX2lzZHN0CiAgICBpcyBuZWdhdGl2ZSBh bmQgdGhlIHRpbWV6b25lIGhhcyBEYXlsaWdodCBTYXZpbmcgVGltZSB0cmFuc2l0aW9ucywKICAg IHRoZXJlIGlzIG5vdCBhIG9uZS10by1vbmUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBicm9rZW4t ZG93bgogICAgdGltZXMgYW5kIHRpbWUgc2luY2UgdGhlIEVwb2NoIHZhbHVlcy4KCiAgICBUaGUg ZGVzY3JpcHRpb24gb2YgaG93IHRoZSB2YWx1ZSBvZiB0bV9pc2RzdCBhZmZlY3RzIHRoZSBiZWhh dmlvcgogICAgb2YgbWt0aW1lKCkgaXMgc2hhZGVkIENYIGJlY2F1c2UgdGhlIHJlcXVpcmVtZW50 cyBpbiB0aGUgSVNPIEMKICAgIHN0YW5kYXJkIGFyZSB1bmNsZWFyLiBUaGUgbmV4dCByZXZpc2lv biBvZiB0aGUgSVNPIEMgc3RhbmRhcmQKICAgIGlzIGV4cGVjdGVkIHRvIHN0YXRlIHRoZSByZXF1 aXJlbWVudHMgdXNpbmcgd29yZGluZyBlcXVpdmFsZW50CiAgICB0byB0aGUgd29yZGluZyBpbiB0 aGlzIHN0YW5kYXJkLgoKQnVnIDE2NDc6IHByaW50ZigiJWxjIiwgKHdpbnRfdCkwKSBjYW4ndCBv dXRwdXQgTlVMIGJ5dGUgQWNjZXB0ZWQgYXMgTWFya2VkCmh0dHBzOi8vYXVzdGluZ3JvdXBidWdz Lm5ldC92aWV3LnBocD9pZD0xNjQ3CgpOb3cgdGhlIEMgY29tbWl0dGVlIGhhcyByZXNwb25kZWQg dG8gb3VyIGZlZWRiYWNrLCB3ZSBjYW4gYXBwcm92ZQp0aGUgcHJvcG9zZWQgaW50ZXJwcmV0YXRp b24uIChjbG9zZWQgYWZ0ZXIgbWVldGluZykKCgpCdWcgMTc2ODogY2F0Z2V0czogaW5jb21wbGV0 ZSBwYXJhZ3JhcGggaW4gIkNoYW5nZSBIaXN0b3J5IiBBY2NlcHRlZCBhcyBNYXJrZWQKaHR0cHM6 Ly9hdXN0aW5ncm91cGJ1Z3MubmV0L3ZpZXcucGhwP2lkPTE3NjgKClRoaXMgaXRlbSBpcyB0YWdn ZWQgZm9yIFRDMy0yMDA4CgpUaGUgdGV4dCBvZiBBdXN0aW4gR3JvdXAgSW50ZXJwcmV0YXRpb24g MTAwMy4xLTIwMDEgIzE0OCBjYW4gYmUgZm91bmQgaGVyZToKCmh0dHBzOi8vY29sbGFib3JhdGlv bi5vcGVuZ3JvdXAub3JnL2F1c3Rpbi9pbnRlcnBzL2RvY3VtZW50cy8xNDUzOS9BSS0xNDgudHh0 IFteXQoKSXQgZG9lc24ndCBjb250YWluIGFueSBjaGFuZ2VzIHRvIGNhdGdldHMoKS4KCldlIGNv bnNpZGVyZWQgd2hldGhlciB0aGVyZSBtaWdodCBiZSBhIHR5cG8gaW4gdGhlIDE0OCBudW1iZXIs IGJ1dCB3ZQpoYXZlIGJlZW4gdW5hYmxlIHRvIGZpbmQgYW55IG90aGVyIGludGVycHJldGF0aW9u IChiZXNpZGVzICMwNDQKdGhhdCBpcyBhbHJlYWR5IGxpc3RlZCkgYWZmZWN0aW5nIGNhdGdldHMo KSwgYW5kIGFzIGZhciBhcyBpdCBjYW4KYmUgc2VlbiwgYWxsIG9mIHRoZSBjaGFuZ2VzIHRvIGNh dGdldHMoKSBiZXR3ZWVuIElzc3VlIDYgYW5kIElzc3VlIDcKYXJlIGRlc2NyaWJlZCBpbiB0aGUg b3RoZXIgQ2hhbmdlIEhpc3RvcnkgZW50cmllcy4KClRoZSBvdGhlciBwb3NzaWJpbGl0eSBpcyB0 aGF0IHRoaXMgZW50cnkgc2hvdWxkIGhhdmUgYmVlbiBvbiBhCmRpZmZlcmVudCBwYWdlLCBidXQg YWxsIG9mIHRoZSBmdW5jdGlvbnMgYWZmZWN0ZWQgYnkgIzE0OCBoYXZlIGEKQ2hhbmdlIEhpc3Rv cnkgZW50cnkgZm9yIGl0LgoKQWxsIHdlIGNhbiBkbyBhdCB0aGlzIHBvaW50IGlzIHRyZWF0IHRo aXMgbGluZSBhcyBzcHVyaW91cyBhbmQgZGVsZXRlIGl0LgoKCkJ1ZyAxNzcwOiBUeXBvIHJlIGlz d2JsYW5rX2wgQWNjZXB0ZWQKaHR0cHM6Ly9hdXN0aW5ncm91cGJ1Z3MubmV0L3ZpZXcucGhwP2lk PTE3NzAgCgpUaGlzIGl0ZW0gaXMgdGFnZ2VkIGZvciBUQzMtMjAwOAoKQnVnIDE3Njc6IHNlZDog Y2xhcmlmeSBiZWhhdmlvciBvZiBjIChjaGFuZ2UpIGNvbW1hbmQgQWNjZXB0ZWQKaHR0cHM6Ly9h dXN0aW5ncm91cGJ1Z3MubmV0L3ZpZXcucGhwP2lkPTE3NjcKCkJ1ZyAxNzQ3OiBtYWlseDogZG9j dW1lbnQgYWxpYXMgZXhwYW5zaW9uIHByZXZlbnRpb24gQWNjZXB0ZWQKaHR0cHM6Ly9hdXN0aW5n cm91cGJ1Z3MubmV0L3ZpZXcucGhwP2lkPTE3NDcKCkJ1ZyAxNzQ2OiBmdXNlciBvdXRwdXQgZm9y bWF0IGNsYXJpZmljYXRpb24KaHR0cHM6Ly9hdXN0aW5ncm91cGJ1Z3MubmV0L3ZpZXcucGhwP2lk PTE3NDYKClRoaXMgaXRlbSBpcyB0YWdnZWQgZm9yIFRDMy0yMDA4CgpBbiBpbnRlcnByZXRhdGlv biBpcyByZXF1aXJlZC4KCkludGVycHJldGF0aW9uIHJlc3BvbnNlOgpUaGUgc3RhbmRhcmQgc3Rh dGVzIHRoYXQgdGhlIHByb2Nlc3MgSUQgaXMgd3JpdHRlbiB1c2luZyB0aGUgZm9ybWF0CiIlZCIs IGFuZCBjb25mb3JtaW5nIGltcGxlbWVudGF0aW9ucyBtdXN0IGNvbmZvcm0gdG8gdGhpcy4gSG93 ZXZlciwKY29uY2VybnMgaGF2ZSBiZWVuIHJhaXNlZCBhYm91dCB0aGlzIHdoaWNoIGFyZSBiZWlu ZyByZWZlcnJlZCB0bwp0aGUgc3BvbnNvci4KClJhdGlvbmFsZToKRm9ybWF0ICIlZCIgYWxsb3dz LCBidXQgZG9lcyBub3QgcmVxdWlyZSBhIHNwYWNlIG9yIHRhYiBiZWZvcmUgdGhlCnByb2Nlc3Mg SUQuIFRoZSBzdGFuZGFyZCBzaG91bGQgcmVxdWlyZSBzZXBhcmF0aW9uIGJldHdlZW4gcHJvY2Vz cwpJRHMgaW4gb3JkZXIgZm9yIHRoZSBvdXRwdXQgdG8gYmUgdXNhYmxlLgoKTm90ZXMgdG8gdGhl IEVkaXRvciAobm90IHBhcnQgb2YgdGhpcyBpbnRlcnByZXRhdGlvbik6CgpNYWtlIHRoZSBjaGFu Z2VzIGluIGJ1Z25vdGU6NjM0MQoKQnVnIDE3NDU6IHRzb3J0IGlucHV0IGFuZCBvdXRwdXQgZm9y bWF0IGNsYXJpZmljYXRpb25zIEFjY2VwdGVkIGFzIE1hcmtlZApodHRwczovL2F1c3Rpbmdyb3Vw YnVncy5uZXQvdmlldy5waHA/aWQ9MTc0NQoKVGhpcyBpdGVtIGlzIHRhZ2dlZCBmb3IgVEMzLTIw MDguCkFuIGludGVycHJldGF0aW9uIGlzIHJlcXVpcmVkLgoKSW50ZXJwcmV0YXRpb24gcmVzcG9u c2U6ClRoZSBzdGFuZGFyZCBpcyB1bmNsZWFyIG9uIHRoaXMgaXNzdWUsIGFuZCBubyBjb25mb3Jt YW5jZSBkaXN0aW5jdGlvbgpjYW4gYmUgbWFkZSBiZXR3ZWVuIGFsdGVybmF0aXZlIGltcGxlbWVu dGF0aW9ucyBiYXNlZCBvbiB0aGlzLiBUaGlzCmlzIGJlaW5nIHJlZmVycmVkIHRvIHRoZSBzcG9u c29yLgoKUmF0aW9uYWxlOgpOb25lLgoKTm90ZXMgdG8gdGhlIEVkaXRvciAobm90IHBhcnQgb2Yg dGhpcyBpbnRlcnByZXRhdGlvbik6Ck1ha2UgdGhlIGNoYW5nZXMgaW4gdGhlIERlc2lyZWQgQWN0 aW9uLgoKV2Ugd2lsbCBjb250aW51ZSBuZXh0IHRpbWUgb246CgpCdWcgMTczMjogY3AgYW5kIG12 IEVYSVQgU1RBVFVTIGRvZXMgbm90IGFjY291bnQgZm9yIC1pCmh0dHBzOi8vYXVzdGluZ3JvdXBi dWdzLm5ldC92aWV3LnBocD9pZD0xNzMyCgpOZXh0IFN0ZXBzCi0tLS0tLS0tLS0KVGhlIG5leHQg Y2FsbCBpcyBvbjoKCiAgIE1vbiAyMDIzLTA3LTMxIChXZWJleCBtZWV0aW5nIC0gZ2VuZXJhbCBi dWdzL2JhbGxvdCByZXNvbHV0aW9uKQogICBUaHUgMjAyMy0wOC0wMyAoVEJEIFpvb20gb3IgV2Vi ZXggbWVldGluZyAtIGdlbmVyYWwgYnVncy9iYWxsb3QgcmVzb2x1dGlvbikKClRoZSBjYWxscyBh cmUgZm9yIDkwIG1pbnV0ZXMKCkNhbGxzIGFyZSBhbmNob3JlZCBvbiBVUyB0aW1lLiAoOGFtIFBh Y2lmaWMpCgpQbGVhc2UgY2hlY2sgdGhlIGNhbGVuZGFyIGludml0ZXMgZm9yIGRpYWwgaW4gZGV0 YWlscy4KCkFwb2xvZ2llcyBpbiBhZHZhbmNlOgogICAgVG9tIFRob21wc29uIDIwMjMtMDctMzEK ICAgIEFuZHJldyBKb3NleSAyMDIzLTA4LTA3LCAyMDIzLTA4LTEwCgoKQnVncyBhcmUgYXQ6Cmh0 dHBzOi8vYXVzdGluZ3JvdXBidWdzLm5ldAoKQW4gZXRoZXJwYWQgaXMgdXN1YWxseSB1cCBmb3Ig dGhlIG1lZXRpbmcsIHdpdGggYSBVUkwgdXNpbmcgdGhlIGRhdGUgZm9ybWF0IGFzIGJlbG93OgoK aHR0cHM6Ly9wb3NpeC5yaGFuc2VuLm9yZy9wLzIweHgtbW0tZGQKCihGb3Igd3JpdGUgYWNjZXNz IHRoaXMgdXNlcyBUaGUgT3BlbiBHcm91cCBzaW5nbGUgc2lnbiBvbiwKZm9yIHRob3NlIGluZGl2 aWR1YWxzIHdpdGggZ2l0bGFiLm9wZW5ncm91cC5vcmcgYWNjb3VudHMuClBsZWFzZSBjb250YWN0 IEFuZHJldyBpZiB5b3UgbmVlZCB0byBiZSBzZXR1cCkK --b1_lADXoySr2WoMwPHCTeBDN2Gs6JHMaEnMkFt1Ghrows--