<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>33825</bug_id>
          
          <creation_ts>2010-01-18 20:14:52 -0800</creation_ts>
          <short_desc>HTMLInputElement::valueAsDate setter support for type=time.</short_desc>
          <delta_ts>2010-01-20 09:51:06 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>32697</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Kent Tamura">tkent</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>darin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>182115</commentid>
    <comment_count>0</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-01-18 20:14:52 -0800</bug_when>
    <thetext>HTMLInputElement::valueAsDate setter support for type=time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182116</commentid>
    <comment_count>1</comment_count>
      <attachid>46883</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-01-18 20:19:55 -0800</bug_when>
    <thetext>Created attachment 46883
Proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182117</commentid>
    <comment_count>2</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-01-18 20:25:43 -0800</bug_when>
    <thetext>Add Darin to CC because he reviewed the valueAsDate getter part and valueAsDate setter for type=month.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182253</commentid>
    <comment_count>3</comment_count>
      <attachid>46883</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-01-19 08:36:45 -0800</bug_when>
    <thetext>Comment on attachment 46883
Proposed patch

&gt; +var date = new Date();
&gt; +date.setTime(8.65E15); // Date of JavaScript can&apos;t represent this.
&gt; +input.valueAsDate = date;
&gt; +shouldBe(&apos;input.value&apos;, &apos;&quot;&quot;&apos;);

A test like this can be written as follows:

    shouldBe(&apos;var date = new Date(); date.setTime(8.65E15); input.valueAsDate = date; input.value&apos;, &apos;&quot;&quot;&apos;);

Then the test result output is a lot easier to read.

&gt; +input.value = &apos;00:00&apos;;
&gt; +input.valueAsDate = document;
&gt; +shouldBe(&apos;input.value&apos;, &apos;&quot;&quot;&apos;);

&gt; +input.value = &apos;00:00&apos;;
&gt; +input.valueAsDate = null;
&gt; +shouldBe(&apos;input.value&apos;, &apos;&quot;&quot;&apos;);

Similarly:

    shouldBe(&apos;input.value = &quot;00:00&quot;; input.valueAsDate = document; input.value&apos;, &apos;&quot;&quot;&apos;);
    shouldBe(&apos;input.value = &quot;00:00&quot;; input.valueAsDate = null; input.value&apos;, &apos;&quot;&quot;&apos;);

&gt; +    // FIXME: We should specify SecondFormat.

Can you add a test case that demonstrates this is not working?

&gt; +static inline double positiveFmod(double value, double divider)
&gt; +{
&gt; +    double remainder = fmod(value, divider);
&gt; +    return remainder &lt; 0.0 ? remainder + divider : remainder;
&gt; +}

Could just be &quot;0&quot; rather than &quot;0.0&quot;. Normally we do that.

&gt; +    if (msInDay &lt; 0.0 || msInDay &gt; msPerDay)
&gt; +        return false;

Ditto.

Also, I think this should be &gt;= msPerDay, not &gt; msPerDay. Can we make a test case that exercises that code path? Or maybe these should be assertions rather than a return statement. The long caller seems to already guarantee a good value, so I&apos;m not sure why this function needs both a return value and a failure case rather than just an assertion. Or the fmod could just be moved in here.

Note that this expression will not return in the case of an NaN. Because expressions involving NaN return false, it&apos;s best to check things you want to be true rather than things you want to be false when it comes to floating point numbers.

&gt; +    m_millisecond = static_cast&lt;int&gt;(fmod(msInDay, msPerSecond));

Should this be a truncation rather than rounding? Could you make a test case for that?

Otherwise looks OK. r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182831</commentid>
    <comment_count>4</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-01-20 09:32:42 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 46883 [details])
&gt; &gt; +var date = new Date();
&gt; &gt; +date.setTime(8.65E15); // Date of JavaScript can&apos;t represent this.
&gt; &gt; +input.valueAsDate = date;
&gt; &gt; +shouldBe(&apos;input.value&apos;, &apos;&quot;&quot;&apos;);
&gt; 
&gt; A test like this can be written as follows:
&gt; 
&gt;     shouldBe(&apos;var date = new Date(); date.setTime(8.65E15); input.valueAsDate =
&gt; date; input.value&apos;, &apos;&quot;&quot;&apos;);
&gt; 
&gt; Then the test result output is a lot easier to read.

Done.
 It&apos;s great. I had no idea to write multiple expressions there.

&gt; &gt; +    // FIXME: We should specify SecondFormat.
&gt; 
&gt; Can you add a test case that demonstrates this is not working?

Done.

&gt; Could just be &quot;0&quot; rather than &quot;0.0&quot;. Normally we do that.

Done.

&gt; Also, I think this should be &gt;= msPerDay, not &gt; msPerDay. Can we make a test
&gt; case that exercises that code path? Or maybe these should be assertions rather
&gt; than a return statement. The long caller seems to already guarantee a good
&gt; value, so I&apos;m not sure why this function needs both a return value and a
&gt; failure case rather than just an assertion. Or the fmod could just be moved in
&gt; here.

Right.&quot; &gt;= msPerDay&quot; was my intent.
We can enforce the input value is always correct.  So I changed it to ASSERT() and  this function is void now.

&gt; &gt; +    m_millisecond = static_cast&lt;int&gt;(fmod(msInDay, msPerSecond));
&gt; 
&gt; Should this be a truncation rather than rounding? Could you make a test case
&gt; for that?

Good point. Though I don&apos;t think we need rounding with the current code, we might change the time representation to second-based value instead of millisecond-base value as you recommended in another bug.
I added round() to the caller of this function.

Well, the change from the last patch will be the following.  I&apos;ll commit it soon.

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 4dc801e..1898749 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -8,6 +8,9 @@
         Add setter tests to input-valueasdate-time.js, and update the
         expectation.
 
+        Note: the expectation file contains some FAIL lines. They are
+        intentional because they test a unimplemented feature.
+
         * fast/forms/input-valueasdate-time-expected.txt:
         * fast/forms/script-tests/input-valueasdate-time.js:
 
diff --git a/LayoutTests/fast/forms/input-valueasdate-time-expected.txt b/LayoutTests/fast/forms/input-valueasdate-time-expected.txt
index b93fe2f..9d02aaf 100644
--- a/LayoutTests/fast/forms/input-valueasdate-time-expected.txt
+++ b/LayoutTests/fast/forms/input-valueasdate-time-expected.txt
@@ -17,10 +17,13 @@ PASS setValueAsDateAndGetValue(24, 0, 0, 0) is &quot;00:00&quot;
 PASS setValueAsDateAndGetValue(48, 0, 13, 0) is &quot;00:00:13&quot;
 PASS setValueAsDateAndGetValue(-23, -59, -59, 0) is &quot;00:00:01&quot;
 Invalid Date:
-PASS input.value is &quot;&quot;
+PASS var date = new Date(); date.setTime(8.65E15); input.valueAsDate = date; input.value is &quot;&quot;
 Invalid objects:
-PASS input.value is &quot;&quot;
-PASS input.value is &quot;&quot;
+PASS input.value = &quot;00:00&quot;; input.valueAsDate = document; input.value is &quot;&quot;
+PASS input.value = &quot;00:00&quot;; input.valueAsDate = null; input.value is &quot;&quot;
+Step attribute value and string representation:
+FAIL input.step = &quot;1&quot;; setValueAsDateAndGetValue(0, 0, 0, 0) should be 00:00:00. Was 00:00.
+FAIL input.step = &quot;0.001&quot;; setValueAsDateAndGetValue(0, 0, 0, 0) should be 00:00:00.000. Was 00:00.
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/LayoutTests/fast/forms/script-tests/input-valueasdate-time.js b/LayoutTests/fast/forms/script-tests/input-valueasdate-time.js
index e08b3f4..583b3a0 100644
--- a/LayoutTests/fast/forms/script-tests/input-valueasdate-time.js
+++ b/LayoutTests/fast/forms/script-tests/input-valueasdate-time.js
@@ -31,17 +31,16 @@ shouldBe(&apos;setValueAsDateAndGetValue(48, 0, 13, 0)&apos;, &apos;&quot;00:00:13&quot;&apos;);
 shouldBe(&apos;setValueAsDateAndGetValue(-23, -59, -59, 0)&apos;, &apos;&quot;00:00:01&quot;&apos;);
 
 debug(&apos;Invalid Date:&apos;);
-var date = new Date();
-date.setTime(8.65E15); // Date of JavaScript can&apos;t represent this.
-input.valueAsDate = date;
-shouldBe(&apos;input.value&apos;, &apos;&quot;&quot;&apos;);
-
+// Date of JavaScript can&apos;t represent 8.65E15.
+shouldBe(&apos;var date = new Date(); date.setTime(8.65E15); input.valueAsDate = date; input.value&apos;, &apos;&quot;&quot;&apos;);
 debug(&apos;Invalid objects:&apos;);
-input.value = &apos;00:00&apos;;
-input.valueAsDate = document;
-shouldBe(&apos;input.value&apos;, &apos;&quot;&quot;&apos;);
-input.value = &apos;00:00&apos;;
-input.valueAsDate = null;
-shouldBe(&apos;input.value&apos;, &apos;&quot;&quot;&apos;);
+shouldBe(&apos;input.value = &quot;00:00&quot;; input.valueAsDate = document; input.value&apos;, &apos;&quot;&quot;&apos;);
+shouldBe(&apos;input.value = &quot;00:00&quot;; input.valueAsDate = null; input.value&apos;, &apos;&quot;&quot;&apos;);
+
+debug(&apos;Step attribute value and string representation:&apos;);
+// If the step attribute value is 1 second and the second part is 0, we should show the second part.
+shouldBe(&apos;input.step = &quot;1&quot;; setValueAsDateAndGetValue(0, 0, 0, 0)&apos;, &apos;&quot;00:00:00&quot;&apos;);
+// If the step attribute value is 0.001 second and the millisecond part is 0, we should show the millisecond part.
+shouldBe(&apos;input.step = &quot;0.001&quot;; setValueAsDateAndGetValue(0, 0, 0, 0)&apos;, &apos;&quot;00:00:00.000&quot;&apos;);
 
 var successfullyParsed = true;
diff --git a/WebCore/html/ISODateTime.cpp b/WebCore/html/ISODateTime.cpp
index d266fd2..6fbc64a 100644
--- a/WebCore/html/ISODateTime.cpp
+++ b/WebCore/html/ISODateTime.cpp
@@ -453,20 +453,18 @@ bool ISODateTime::parseDateTime(const UChar* src, unsigned length, unsigned star
 static inline double positiveFmod(double value, double divider)
 {
     double remainder = fmod(value, divider);
-    return remainder &lt; 0.0 ? remainder + divider : remainder;
+    return remainder &lt; 0 ? remainder + divider : remainder;
 }
 
-bool ISODateTime::setMillisecondsSinceMidnightInternal(double msInDay)
+void ISODateTime::setMillisecondsSinceMidnightInternal(double msInDay)
 {
-    if (msInDay &lt; 0.0 || msInDay &gt; msPerDay)
-        return false;
+    ASSERT(msInDay &gt;= 0 &amp;&amp; msInDay &lt; msPerDay);
     m_millisecond = static_cast&lt;int&gt;(fmod(msInDay, msPerSecond));
     double value = floor(msInDay / msPerSecond);
     m_second = static_cast&lt;int&gt;(fmod(value, secondsPerMinute));
     value = floor(value / secondsPerMinute);
     m_minute = static_cast&lt;int&gt;(fmod(value, minutesPerHour));
     m_hour = static_cast&lt;int&gt;(value / minutesPerHour);
-    return true;
 }
 
 bool ISODateTime::setMillisecondsSinceEpochForDateInternal(double ms)
@@ -495,9 +493,7 @@ bool ISODateTime::setMillisecondsSinceMidnight(double ms)
 {
     if (!isfinite(ms))
         return false;
-    double msInDay = positiveFmod(ms, msPerDay);
-    if (!setMillisecondsSinceMidnightInternal(msInDay))
-        return false;
+    setMillisecondsSinceMidnightInternal(positiveFmod(round(ms), msPerDay));
     m_type = Time;
     return true;
 }
diff --git a/WebCore/html/ISODateTime.h b/WebCore/html/ISODateTime.h
index 15e56b2..f0dc25f 100644
--- a/WebCore/html/ISODateTime.h
+++ b/WebCore/html/ISODateTime.h
@@ -131,7 +131,7 @@ private:
     double millisecondsSinceEpochForTime() const;
     // Helpers for setMillisecondsSinceEpochFor*().
     bool setMillisecondsSinceEpochForDateInternal(double ms);
-    bool setMillisecondsSinceMidnightInternal(double ms);
+    void setMillisecondsSinceMidnightInternal(double ms);
     // Helper for toString().
     String toStringForTime(SecondFormat) const;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>182841</commentid>
    <comment_count>5</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-01-20 09:51:06 -0800</bug_when>
    <thetext>Landed as r53551.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>46883</attachid>
            <date>2010-01-18 20:19:55 -0800</date>
            <delta_ts>2010-01-19 08:36:44 -0800</delta_ts>
            <desc>Proposed patch</desc>
            <filename>bug-33825-20100119131953.patch</filename>
            <type>text/plain</type>
            <size>11115</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCA2YzgxMDNlLi5jM2M4YmQ1IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTAtMDEt
MTggIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEhUTUxJbnB1dEVsZW1lbnQ6OnZhbHVlQXNE
YXRlIHNldHRlciBzdXBwb3J0IGZvciB0eXBlPXRpbWUuCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMzgyNQorCisgICAgICAgIEFkZCBzZXR0ZXIgdGVz
dHMgdG8gaW5wdXQtdmFsdWVhc2RhdGUtdGltZS5qcywgYW5kIHVwZGF0ZSB0aGUKKyAgICAgICAg
ZXhwZWN0YXRpb24uCisKKyAgICAgICAgKiBmYXN0L2Zvcm1zL2lucHV0LXZhbHVlYXNkYXRlLXRp
bWUtZXhwZWN0ZWQudHh0OgorICAgICAgICAqIGZhc3QvZm9ybXMvc2NyaXB0LXRlc3RzL2lucHV0
LXZhbHVlYXNkYXRlLXRpbWUuanM6CisKIDIwMTAtMDEtMTggIERhbiBCZXJuc3RlaW4gIDxtaXR6
QGFwcGxlLmNvbT4KIAogICAgICAgICBSdWJiZXItc3RhbXBlZCBieSBTYW0gV2VpbmlnLgpkaWZm
IC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC9mb3Jtcy9pbnB1dC12YWx1ZWFzZGF0ZS10aW1lLWV4
cGVjdGVkLnR4dCBiL0xheW91dFRlc3RzL2Zhc3QvZm9ybXMvaW5wdXQtdmFsdWVhc2RhdGUtdGlt
ZS1leHBlY3RlZC50eHQKaW5kZXggMTg5ZThjYS4uYjkzZmUyZiAxMDA2NDQKLS0tIGEvTGF5b3V0
VGVzdHMvZmFzdC9mb3Jtcy9pbnB1dC12YWx1ZWFzZGF0ZS10aW1lLWV4cGVjdGVkLnR4dAorKysg
Yi9MYXlvdXRUZXN0cy9mYXN0L2Zvcm1zL2lucHV0LXZhbHVlYXNkYXRlLXRpbWUtZXhwZWN0ZWQu
dHh0CkBAIC03LDYgKzcsMjAgQEAgUEFTUyB2YWx1ZUFzRGF0ZUZvcigiIikgaXMgbnVsbAogUEFT
UyB2YWx1ZUFzRGF0ZUZvcigiMDA6MDA6MDAuMDAwIikuZ2V0VGltZSgpIGlzIERhdGUuVVRDKDE5
NzAsIDAsIDEsIDAsIDAsIDAsIDApCiBQQVNTIHZhbHVlQXNEYXRlRm9yKCIwNDozNSIpLmdldFRp
bWUoKSBpcyBEYXRlLlVUQygxOTcwLCAwLCAxLCA0LCAzNSwgMCwgMCkKIFBBU1MgdmFsdWVBc0Rh
dGVGb3IoIjIzOjU5OjU5Ljk5OSIpLmdldFRpbWUoKSBpcyBEYXRlLlVUQygxOTcwLCAwLCAxLCAy
MywgNTksIDU5LCA5OTkpCitQQVNTIHNldFZhbHVlQXNEYXRlQW5kR2V0VmFsdWUoMCwgMCwgMCwg
MCkgaXMgIjAwOjAwIgorUEFTUyBzZXRWYWx1ZUFzRGF0ZUFuZEdldFZhbHVlKDAsIDAsIDEsIDAp
IGlzICIwMDowMDowMSIKK1BBU1Mgc2V0VmFsdWVBc0RhdGVBbmRHZXRWYWx1ZSgwLCAwLCAwLCAy
KSBpcyAiMDA6MDA6MDAuMDAyIgorUEFTUyBzZXRWYWx1ZUFzRGF0ZUFuZEdldFZhbHVlKDExLCA1
OSwgNTksIDk5OSkgaXMgIjExOjU5OjU5Ljk5OSIKK1BBU1Mgc2V0VmFsdWVBc0RhdGVBbmRHZXRW
YWx1ZSgxMiwgMCwgMCwgMCkgaXMgIjEyOjAwIgorUEFTUyBzZXRWYWx1ZUFzRGF0ZUFuZEdldFZh
bHVlKDIzLCA1OSwgNTksIDk5OSkgaXMgIjIzOjU5OjU5Ljk5OSIKK1BBU1Mgc2V0VmFsdWVBc0Rh
dGVBbmRHZXRWYWx1ZSgyNCwgMCwgMCwgMCkgaXMgIjAwOjAwIgorUEFTUyBzZXRWYWx1ZUFzRGF0
ZUFuZEdldFZhbHVlKDQ4LCAwLCAxMywgMCkgaXMgIjAwOjAwOjEzIgorUEFTUyBzZXRWYWx1ZUFz
RGF0ZUFuZEdldFZhbHVlKC0yMywgLTU5LCAtNTksIDApIGlzICIwMDowMDowMSIKK0ludmFsaWQg
RGF0ZToKK1BBU1MgaW5wdXQudmFsdWUgaXMgIiIKK0ludmFsaWQgb2JqZWN0czoKK1BBU1MgaW5w
dXQudmFsdWUgaXMgIiIKK1BBU1MgaW5wdXQudmFsdWUgaXMgIiIKIFBBU1Mgc3VjY2Vzc2Z1bGx5
UGFyc2VkIGlzIHRydWUKIAogVEVTVCBDT01QTEVURQpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMv
ZmFzdC9mb3Jtcy9zY3JpcHQtdGVzdHMvaW5wdXQtdmFsdWVhc2RhdGUtdGltZS5qcyBiL0xheW91
dFRlc3RzL2Zhc3QvZm9ybXMvc2NyaXB0LXRlc3RzL2lucHV0LXZhbHVlYXNkYXRlLXRpbWUuanMK
aW5kZXggNTkxNDRjYi4uZTA4YjNmNCAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvZmFzdC9mb3Jt
cy9zY3JpcHQtdGVzdHMvaW5wdXQtdmFsdWVhc2RhdGUtdGltZS5qcworKysgYi9MYXlvdXRUZXN0
cy9mYXN0L2Zvcm1zL3NjcmlwdC10ZXN0cy9pbnB1dC12YWx1ZWFzZGF0ZS10aW1lLmpzCkBAIC04
LDkgKzgsNDAgQEAgZnVuY3Rpb24gdmFsdWVBc0RhdGVGb3Ioc3RyaW5nVmFsdWUpIHsKICAgICBy
ZXR1cm4gaW5wdXQudmFsdWVBc0RhdGU7CiB9CiAKK2Z1bmN0aW9uIHNldFZhbHVlQXNEYXRlQW5k
R2V0VmFsdWUoaG91ciwgbWludXRlLCBzZWNvbmQsIG1zKSB7CisgICAgdmFyIGRhdGUgPSBuZXcg
RGF0ZSgpOworICAgIGRhdGUuc2V0VGltZSgoKGhvdXIgKiA2MCArIG1pbnV0ZSkgKiA2MCArIHNl
Y29uZCkgKiAxMDAwICsgbXMpOworICAgIGlucHV0LnZhbHVlQXNEYXRlID0gZGF0ZTsKKyAgICBy
ZXR1cm4gaW5wdXQudmFsdWU7Cit9CisKIHNob3VsZEJlKCd2YWx1ZUFzRGF0ZUZvcigiIiknLCAn
bnVsbCcpOwogc2hvdWxkQmUoJ3ZhbHVlQXNEYXRlRm9yKCIwMDowMDowMC4wMDAiKS5nZXRUaW1l
KCknLCAnRGF0ZS5VVEMoMTk3MCwgMCwgMSwgMCwgMCwgMCwgMCknKTsKIHNob3VsZEJlKCd2YWx1
ZUFzRGF0ZUZvcigiMDQ6MzUiKS5nZXRUaW1lKCknLCAnRGF0ZS5VVEMoMTk3MCwgMCwgMSwgNCwg
MzUsIDAsIDApJyk7CiBzaG91bGRCZSgndmFsdWVBc0RhdGVGb3IoIjIzOjU5OjU5Ljk5OSIpLmdl
dFRpbWUoKScsICdEYXRlLlVUQygxOTcwLCAwLCAxLCAyMywgNTksIDU5LCA5OTkpJyk7CiAKK3No
b3VsZEJlKCdzZXRWYWx1ZUFzRGF0ZUFuZEdldFZhbHVlKDAsIDAsIDAsIDApJywgJyIwMDowMCIn
KTsKK3Nob3VsZEJlKCdzZXRWYWx1ZUFzRGF0ZUFuZEdldFZhbHVlKDAsIDAsIDEsIDApJywgJyIw
MDowMDowMSInKTsKK3Nob3VsZEJlKCdzZXRWYWx1ZUFzRGF0ZUFuZEdldFZhbHVlKDAsIDAsIDAs
IDIpJywgJyIwMDowMDowMC4wMDIiJyk7CitzaG91bGRCZSgnc2V0VmFsdWVBc0RhdGVBbmRHZXRW
YWx1ZSgxMSwgNTksIDU5LCA5OTkpJywgJyIxMTo1OTo1OS45OTkiJyk7CitzaG91bGRCZSgnc2V0
VmFsdWVBc0RhdGVBbmRHZXRWYWx1ZSgxMiwgMCwgMCwgMCknLCAnIjEyOjAwIicpOworc2hvdWxk
QmUoJ3NldFZhbHVlQXNEYXRlQW5kR2V0VmFsdWUoMjMsIDU5LCA1OSwgOTk5KScsICciMjM6NTk6
NTkuOTk5IicpOworc2hvdWxkQmUoJ3NldFZhbHVlQXNEYXRlQW5kR2V0VmFsdWUoMjQsIDAsIDAs
IDApJywgJyIwMDowMCInKTsKK3Nob3VsZEJlKCdzZXRWYWx1ZUFzRGF0ZUFuZEdldFZhbHVlKDQ4
LCAwLCAxMywgMCknLCAnIjAwOjAwOjEzIicpOworc2hvdWxkQmUoJ3NldFZhbHVlQXNEYXRlQW5k
R2V0VmFsdWUoLTIzLCAtNTksIC01OSwgMCknLCAnIjAwOjAwOjAxIicpOworCitkZWJ1ZygnSW52
YWxpZCBEYXRlOicpOwordmFyIGRhdGUgPSBuZXcgRGF0ZSgpOworZGF0ZS5zZXRUaW1lKDguNjVF
MTUpOyAvLyBEYXRlIG9mIEphdmFTY3JpcHQgY2FuJ3QgcmVwcmVzZW50IHRoaXMuCitpbnB1dC52
YWx1ZUFzRGF0ZSA9IGRhdGU7CitzaG91bGRCZSgnaW5wdXQudmFsdWUnLCAnIiInKTsKKworZGVi
dWcoJ0ludmFsaWQgb2JqZWN0czonKTsKK2lucHV0LnZhbHVlID0gJzAwOjAwJzsKK2lucHV0LnZh
bHVlQXNEYXRlID0gZG9jdW1lbnQ7CitzaG91bGRCZSgnaW5wdXQudmFsdWUnLCAnIiInKTsKK2lu
cHV0LnZhbHVlID0gJzAwOjAwJzsKK2lucHV0LnZhbHVlQXNEYXRlID0gbnVsbDsKK3Nob3VsZEJl
KCdpbnB1dC52YWx1ZScsICciIicpOworCiB2YXIgc3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1ZTsK
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YTdhYmJjOC4uMzAyY2NmZiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyNyBAQAorMjAxMC0wMS0xOCAgS2VudCBUYW11cmEg
IDx0a2VudEBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgSFRNTElucHV0RWxlbWVudDo6dmFsdWVBc0RhdGUgc2V0dGVyIHN1cHBv
cnQgZm9yIHR5cGU9dGltZS4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTMzODI1CisKKyAgICAgICAgSW50cm9kdWNlIElTT0RhdGVUaW1lOjpzZXRNaWxs
aXNlY29uZHNTaW5jZU1pZG5pZ2h0KCkgYW5kIGFkZCBhCisgICAgICAgIFNlY29uZEZvcm1hdCBw
YXJhbWV0ZXIgdG8gSVNPRGF0ZVRpbWU6OnRvU3RyaW5nKCkuIFRoZSBtYWluIGNvZGUKKyAgICAg
ICAgbG9naWMgZm9yIHR5cGU9dGltZSBpcyBpbXBsZW1lbnRlZCBpbgorICAgICAgICBzZXRNaWxs
aXNlY29uZHNTaW5jZU1pZG5pZ2h0SW50ZXJuYWwoKSBhbmQgdG9TdHJpbmdGb3JUaW1lKCkKKyAg
ICAgICAgYmVjYXVzZSB0aGUgbG9naWMgaXMgZ29pbmcgdG8gYmUgdXNlZCBmb3Igb3RoZXIgdHlw
ZXMuCisKKyAgICAgICAgKiBodG1sL0hUTUxJbnB1dEVsZW1lbnQuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6SFRNTElucHV0RWxlbWVudDo6c2V0VmFsdWVBc0RhdGUpOgorICAgICAgICAqIGh0bWwv
SVNPRGF0ZVRpbWUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6cG9zaXRpdmVGbW9kKToKKyAgICAg
ICAgKFdlYkNvcmU6OklTT0RhdGVUaW1lOjpzZXRNaWxsaXNlY29uZHNTaW5jZU1pZG5pZ2h0SW50
ZXJuYWwpOgorICAgICAgICAoV2ViQ29yZTo6SVNPRGF0ZVRpbWU6OnNldE1pbGxpc2Vjb25kc1Np
bmNlTWlkbmlnaHQpOgorICAgICAgICAoV2ViQ29yZTo6SVNPRGF0ZVRpbWU6OnRvU3RyaW5nRm9y
VGltZSk6CisgICAgICAgIChXZWJDb3JlOjpJU09EYXRlVGltZTo6dG9TdHJpbmcpOgorICAgICAg
ICAqIGh0bWwvSVNPRGF0ZVRpbWUuaDoKKyAgICAgICAgKFdlYkNvcmU6OklTT0RhdGVUaW1lOjop
OgorCiAyMDEwLTAxLTE4ICBEYW4gQmVybnN0ZWluICA8bWl0ekBhcHBsZS5jb20+CiAKICAgICAg
ICAgUnViYmVyLXN0YW1wZWQgYnkgU2FtIFdlaW5pZy4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvaHRt
bC9IVE1MSW5wdXRFbGVtZW50LmNwcCBiL1dlYkNvcmUvaHRtbC9IVE1MSW5wdXRFbGVtZW50LmNw
cAppbmRleCA1NzA3OWI0Li5kNDIwZTUzIDEwMDY0NAotLS0gYS9XZWJDb3JlL2h0bWwvSFRNTElu
cHV0RWxlbWVudC5jcHAKKysrIGIvV2ViQ29yZS9odG1sL0hUTUxJbnB1dEVsZW1lbnQuY3BwCkBA
IC0xNDAxLDYgKzE0MDEsOSBAQCB2b2lkIEhUTUxJbnB1dEVsZW1lbnQ6OnNldFZhbHVlQXNEYXRl
KGRvdWJsZSB2YWx1ZSwgRXhjZXB0aW9uQ29kZSYgZWMpCiAgICAgY2FzZSBNT05USDoKICAgICAg
ICAgc3VjY2VzcyA9IGRhdGVUaW1lLnNldE1pbGxpc2Vjb25kc1NpbmNlRXBvY2hGb3JNb250aCh2
YWx1ZSk7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElNRToKKyAgICAgICAgc3VjY2VzcyA9
IGRhdGVUaW1lLnNldE1pbGxpc2Vjb25kc1NpbmNlTWlkbmlnaHQodmFsdWUpOworICAgICAgICBi
cmVhazsKICAgICAvLyBGSVhNRTogaW1wbGVtZW50YXRpb25zIGZvciBvdGhlciBzdXBwb3J0ZWQg
dHlwZXMuCiAgICAgZGVmYXVsdDoKICAgICAgICAgZWMgPSBJTlZBTElEX1NUQVRFX0VSUjsKQEAg
LTE0MTAsNiArMTQxMyw5IEBAIHZvaWQgSFRNTElucHV0RWxlbWVudDo6c2V0VmFsdWVBc0RhdGUo
ZG91YmxlIHZhbHVlLCBFeGNlcHRpb25Db2RlJiBlYykKICAgICAgICAgc2V0VmFsdWUoU3RyaW5n
KCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQorICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgc3Bl
Y2lmeSBTZWNvbmRGb3JtYXQuCisgICAgLy8gZS5nLiBJZiB0aGUgc3RlcCB2YWx1ZSBpcyA2MCwg
dXNlIFNlY29uZEZvcm1hdDo6Tm9uZS4KKyAgICAvLyAgICAgIElmIHRoZSBzdGVwIHZhbHVlIGlz
IDEsIHVzZSBTZWNvbmRGb3JtYXQ6OlNlY29uZC4KICAgICBzZXRWYWx1ZShkYXRlVGltZS50b1N0
cmluZygpKTsKIH0KIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9odG1sL0lTT0RhdGVUaW1lLmNwcCBi
L1dlYkNvcmUvaHRtbC9JU09EYXRlVGltZS5jcHAKaW5kZXggYWRjYzE4OS4uZDI2NmZkMiAxMDA2
NDQKLS0tIGEvV2ViQ29yZS9odG1sL0lTT0RhdGVUaW1lLmNwcAorKysgYi9XZWJDb3JlL2h0bWwv
SVNPRGF0ZVRpbWUuY3BwCkBAIC00NTAsNiArNDUwLDI1IEBAIGJvb2wgSVNPRGF0ZVRpbWU6OnBh
cnNlRGF0ZVRpbWUoY29uc3QgVUNoYXIqIHNyYywgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBz
dGFyCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBpbmxpbmUgZG91YmxlIHBvc2l0aXZl
Rm1vZChkb3VibGUgdmFsdWUsIGRvdWJsZSBkaXZpZGVyKQoreworICAgIGRvdWJsZSByZW1haW5k
ZXIgPSBmbW9kKHZhbHVlLCBkaXZpZGVyKTsKKyAgICByZXR1cm4gcmVtYWluZGVyIDwgMC4wID8g
cmVtYWluZGVyICsgZGl2aWRlciA6IHJlbWFpbmRlcjsKK30KKworYm9vbCBJU09EYXRlVGltZTo6
c2V0TWlsbGlzZWNvbmRzU2luY2VNaWRuaWdodEludGVybmFsKGRvdWJsZSBtc0luRGF5KQorewor
ICAgIGlmIChtc0luRGF5IDwgMC4wIHx8IG1zSW5EYXkgPiBtc1BlckRheSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIG1fbWlsbGlzZWNvbmQgPSBzdGF0aWNfY2FzdDxpbnQ+KGZtb2QobXNJ
bkRheSwgbXNQZXJTZWNvbmQpKTsKKyAgICBkb3VibGUgdmFsdWUgPSBmbG9vcihtc0luRGF5IC8g
bXNQZXJTZWNvbmQpOworICAgIG1fc2Vjb25kID0gc3RhdGljX2Nhc3Q8aW50PihmbW9kKHZhbHVl
LCBzZWNvbmRzUGVyTWludXRlKSk7CisgICAgdmFsdWUgPSBmbG9vcih2YWx1ZSAvIHNlY29uZHNQ
ZXJNaW51dGUpOworICAgIG1fbWludXRlID0gc3RhdGljX2Nhc3Q8aW50PihmbW9kKHZhbHVlLCBt
aW51dGVzUGVySG91cikpOworICAgIG1faG91ciA9IHN0YXRpY19jYXN0PGludD4odmFsdWUgLyBt
aW51dGVzUGVySG91cik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIGJvb2wgSVNPRGF0ZVRpbWU6
OnNldE1pbGxpc2Vjb25kc1NpbmNlRXBvY2hGb3JEYXRlSW50ZXJuYWwoZG91YmxlIG1zKQogewog
ICAgIG1feWVhciA9IG1zVG9ZZWFyKG1zKTsKQEAgLTQ3Miw2ICs0OTEsMTcgQEAgYm9vbCBJU09E
YXRlVGltZTo6c2V0TWlsbGlzZWNvbmRzU2luY2VFcG9jaEZvck1vbnRoKGRvdWJsZSBtcykKICAg
ICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBJU09EYXRlVGltZTo6c2V0TWlsbGlzZWNvbmRzU2lu
Y2VNaWRuaWdodChkb3VibGUgbXMpCit7CisgICAgaWYgKCFpc2Zpbml0ZShtcykpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICBkb3VibGUgbXNJbkRheSA9IHBvc2l0aXZlRm1vZChtcywgbXNQ
ZXJEYXkpOworICAgIGlmICghc2V0TWlsbGlzZWNvbmRzU2luY2VNaWRuaWdodEludGVybmFsKG1z
SW5EYXkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbV90eXBlID0gVGltZTsKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKwogZG91YmxlIElTT0RhdGVUaW1lOjptaWxsaXNlY29uZHNTaW5jZUVw
b2NoRm9yVGltZSgpIGNvbnN0CiB7CiAgICAgQVNTRVJUKG1fdHlwZSA9PSBUaW1lIHx8IG1fdHlw
ZSA9PSBEYXRlVGltZSk7CkBAIC01MDUsMTEgKzUzNSwzNSBAQCBkb3VibGUgSVNPRGF0ZVRpbWU6
Om1pbGxpc2Vjb25kc1NpbmNlRXBvY2goKSBjb25zdAogICAgIHJldHVybiBpbnZhbGlkTWlsbGlz
ZWNvbmRzKCk7CiB9CiAKLVN0cmluZyBJU09EYXRlVGltZTo6dG9TdHJpbmcoKSBjb25zdAorU3Ry
aW5nIElTT0RhdGVUaW1lOjp0b1N0cmluZ0ZvclRpbWUoU2Vjb25kRm9ybWF0IGZvcm1hdCkgY29u
c3QKK3sKKyAgICBBU1NFUlQobV90eXBlID09IERhdGVUaW1lIHx8IG1fdHlwZSA9PSBEYXRlVGlt
ZUxvY2FsIHx8IG1fdHlwZSA9PSBUaW1lKTsKKyAgICBTZWNvbmRGb3JtYXQgZWZmZWN0aXZlRm9y
bWF0ID0gZm9ybWF0OworICAgIGlmIChtX21pbGxpc2Vjb25kKQorICAgICAgICBlZmZlY3RpdmVG
b3JtYXQgPSBNaWxsaXNlY29uZDsKKyAgICBlbHNlIGlmIChmb3JtYXQgPT0gTm9uZSAmJiBtX3Nl
Y29uZCkKKyAgICAgICAgZWZmZWN0aXZlRm9ybWF0ID0gU2Vjb25kOworCisgICAgc3dpdGNoIChl
ZmZlY3RpdmVGb3JtYXQpIHsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICAgICAgLy8gRmFsbGJhY2sgdG8gTm9uZS4KKyAgICBjYXNlIE5vbmU6CisgICAg
ICAgIHJldHVybiBTdHJpbmc6OmZvcm1hdCgiJTAyZDolMDJkIiwgbV9ob3VyLCBtX21pbnV0ZSk7
CisgICAgY2FzZSBTZWNvbmQ6CisgICAgICAgIHJldHVybiBTdHJpbmc6OmZvcm1hdCgiJTAyZDol
MDJkOiUwMmQiLCBtX2hvdXIsIG1fbWludXRlLCBtX3NlY29uZCk7CisgICAgY2FzZSBNaWxsaXNl
Y29uZDoKKyAgICAgICAgcmV0dXJuIFN0cmluZzo6Zm9ybWF0KCIlMDJkOiUwMmQ6JTAyZC4lMDNk
IiwgbV9ob3VyLCBtX21pbnV0ZSwgbV9zZWNvbmQsIG1fbWlsbGlzZWNvbmQpOworICAgIH0KK30K
KworU3RyaW5nIElTT0RhdGVUaW1lOjp0b1N0cmluZyhTZWNvbmRGb3JtYXQgZm9ybWF0KSBjb25z
dAogewogICAgIHN3aXRjaCAobV90eXBlKSB7CiAgICAgY2FzZSBNb250aDoKICAgICAgICAgcmV0
dXJuIFN0cmluZzo6Zm9ybWF0KCIlMDRkLSUwMmQiLCBtX3llYXIsIG1fbW9udGggKyAxKTsKKyAg
ICBjYXNlIFRpbWU6CisgICAgICAgIHJldHVybiB0b1N0cmluZ0ZvclRpbWUoZm9ybWF0KTsKIAog
ICAgIC8vIEZJWE1FOiBpbXBsZW1lbnRhdGlvbnMgZm9yIG90aGVyIHR5cGVzLgogICAgIGRlZmF1
bHQ6CmRpZmYgLS1naXQgYS9XZWJDb3JlL2h0bWwvSVNPRGF0ZVRpbWUuaCBiL1dlYkNvcmUvaHRt
bC9JU09EYXRlVGltZS5oCmluZGV4IGFlZTIwYTAuLjE1ZTU2YjIgMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvaHRtbC9JU09EYXRlVGltZS5oCisrKyBiL1dlYkNvcmUvaHRtbC9JU09EYXRlVGltZS5oCkBA
IC02OCw4ICs2OCwxNSBAQCBwdWJsaWM6CiAgICAgaW50IGZ1bGxZZWFyKCkgY29uc3QgeyByZXR1
cm4gbV95ZWFyOyB9CiAgICAgaW50IHdlZWsoKSBjb25zdCB7IHJldHVybiBtX3dlZWs7IH0KIAor
ICAgIGVudW0gU2Vjb25kRm9ybWF0IHsKKyAgICAgICAgTm9uZSwgLy8gU3VwcHJlc3MgdGhlIHNl
Y29uZCBwYXJ0IGFuZCB0aGUgbWlsbGlzZWNvbmQgcGFydCBpZiB0aGV5IGFyZSAwLgorICAgICAg
ICBTZWNvbmQsIC8vIEFsd2F5cyBzaG93IHRoZSBzZWNvbmQgcGFydCwgYW5kIHN1cHByZXNzIHRo
ZSBtaWxsaXNlY29uZCBwYXJ0IGlmIGl0IGlzIDAuCisgICAgICAgIE1pbGxpc2Vjb25kIC8vIEFs
d2F5cyBzaG93IHRoZSBzZWNvbmQgcGFydCBhbmQgdGhlIG1pbGxpc2Vjb25kIHBhcnQuCisgICAg
fTsKKwogICAgIC8vIFJldHVybnMgYW4gSVNPIDg2MDEgcmVwcmVzZW50YXRpb24gZm9yIHRoaXMg
aW5zdGFuY2UuCi0gICAgU3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisgICAgLy8gVGhlIGZvcm1h
dCBhcmd1bWVudCBpcyB2YWxpZCBmb3IgRGF0ZVRpbWUsIERhdGVUaW1lTG9jYWwsIGFuZCBUaW1l
IHR5cGVzLgorICAgIFN0cmluZyB0b1N0cmluZyhTZWNvbmRGb3JtYXQgZm9ybWF0ID0gTm9uZSkg
Y29uc3Q7CiAKICAgICAvLyBUaGUgZm9sbG93aW5nIHNpeCBmdW5jdGlvbnMgcGFyc2UgdGhlIGlu
cHV0ICdzcmMnIHdob3NlIGxlbmd0aCBpcwogICAgIC8vICdsZW5ndGgnLCBhbmQgdXBkYXRlcyBz
b21lIGZpZWxkcyBvZiB0aGlzIGluc3RhbmNlLiBUaGUgcGFyc2luZyBzdGFydHMgYXQKQEAgLTk5
LDEwICsxMDYsMTMgQEAgcHVibGljOgogICAgIC8vIElTT0RhdGVUaW1lIHR5cGUuIFRoZSBmdW5j
dGlvbiByZXR1cm5zIHRydWUgaWYgaXQgc3VjY2VlZHMsIGFuZAogICAgIC8vIGZhbHNlIGlmIGl0
IGZhaWxzLgogCi0gICAgLy8gRm9yIE1vbnRoIHR5cGUuICBVcGRhdGVzIG1feWVhciBhbmQgbV9t
b250aC4KKyAgICAvLyBGb3IgTW9udGggdHlwZS4gVXBkYXRlcyBtX3llYXIgYW5kIG1fbW9udGgu
CiAgICAgYm9vbCBzZXRNaWxsaXNlY29uZHNTaW5jZUVwb2NoRm9yTW9udGgoZG91YmxlIG1zKTsK
ICAgICAvLyBGSVhNRTogQWRkIHNldE1pbGxpc2Vjb25kc1NpbmNlRXBvY2hGb3IqKCkgZm9yIG90
aGVyIHR5cGVzLgogCisgICAgLy8gRm9yIFRpbWUgdHlwZS4gVXBkYXRlcyBtX2hvdXIsIG1fbWlu
dXRlLCBtX3NlY29uZCBhbmQgbV9taWxsaXNlY29uZC4KKyAgICBib29sIHNldE1pbGxpc2Vjb25k
c1NpbmNlTWlkbmlnaHQoZG91YmxlIG1zKTsKKwogICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBv
ZiBtaWxsaXNlY29uZHMgZnJvbSAxOTcwLTAxLTAxIDAwOjAwOjAwIFVUQy4KICAgICAvLyBGb3Ig
YW4gSVNPRGF0ZVRpbWUgaW5pdGlhbGl6ZWQgd2l0aCBwYXJzZURhdGVUaW1lTG9jYWwoKSwKICAg
ICAvLyBtaWxsaXNlY29uZHNTaW5jZUVwb2NoKCkgcmV0dXJucyBhIHZhbHVlIGZvciBVVEMgdGlt
ZXpvbmUuCkBAIC0xMTksOCArMTI5LDExIEBAIHByaXZhdGU6CiAgICAgYm9vbCBwYXJzZVRpbWVa
b25lKGNvbnN0IFVDaGFyKiBzcmMsIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWduZWQgc3RhcnQsIHVu
c2lnbmVkJiBlbmQpOwogICAgIC8vIEhlbHBlciBmb3IgbWlsbGlzZWNvbmRzU2luY2VFcG9jaCgp
LgogICAgIGRvdWJsZSBtaWxsaXNlY29uZHNTaW5jZUVwb2NoRm9yVGltZSgpIGNvbnN0OwotICAg
IC8vIEhlbHBlciBmb3Igc2V0TWlsbGlzZWNvbmRzU2luY2VFcG9jaEZvciooKS4KKyAgICAvLyBI
ZWxwZXJzIGZvciBzZXRNaWxsaXNlY29uZHNTaW5jZUVwb2NoRm9yKigpLgogICAgIGJvb2wgc2V0
TWlsbGlzZWNvbmRzU2luY2VFcG9jaEZvckRhdGVJbnRlcm5hbChkb3VibGUgbXMpOworICAgIGJv
b2wgc2V0TWlsbGlzZWNvbmRzU2luY2VNaWRuaWdodEludGVybmFsKGRvdWJsZSBtcyk7CisgICAg
Ly8gSGVscGVyIGZvciB0b1N0cmluZygpLgorICAgIFN0cmluZyB0b1N0cmluZ0ZvclRpbWUoU2Vj
b25kRm9ybWF0KSBjb25zdDsKIAogICAgIC8vIG1fd2Vla0RheSB2YWx1ZXMKICAgICBlbnVtIHsK
</data>
<flag name="review"
          id="29221"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>