<?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>78035</bug_id>
          
          <creation_ts>2012-02-07 13:57:00 -0800</creation_ts>
          <short_desc>exponentialRampToValue doesn&apos;t use starting value</short_desc>
          <delta_ts>2012-02-22 18:19:14 -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>Web Audio</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</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>77666</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Raymond Toy">rtoy</reporter>
          <assigned_to name="Raymond Toy">rtoy</assigned_to>
          <cc>crogers</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>551348</commentid>
    <comment_count>0</comment_count>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-07 13:57:00 -0800</bug_when>
    <thetext>exponentialRampToValue currently does:


   float numSampleFrames = deltaTime * sampleRate;
   float multiplier = powf(value2 / value1, 1 / numSampleFrames);
   for (; writeIndex &lt; fillToFrame; ++writeIndex) {
       values[writeIndex] = value;
       value *= multiplier;
       currentTime += sampleFrameTimeIncr;
   }

Note that value has no relationship to value1 or value2, so the ramp never actually starts at the correct value and if it reaches value2, it is coincidental.

I think that before the loop we need to do something like

value = value1 * pow(multiplier, AudioUtilities::timeToSampleFrame(currentTime - time1, sampleRate)

to set the correct starting value.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551398</commentid>
    <comment_count>1</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2012-02-07 14:34:01 -0800</bug_when>
    <thetext>(In reply to comment #0)
&gt; exponentialRampToValue currently does:
&gt; 
&gt; 
&gt;    float numSampleFrames = deltaTime * sampleRate;
&gt;    float multiplier = powf(value2 / value1, 1 / numSampleFrames);
&gt;    for (; writeIndex &lt; fillToFrame; ++writeIndex) {
&gt;        values[writeIndex] = value;
&gt;        value *= multiplier;
&gt;        currentTime += sampleFrameTimeIncr;
&gt;    }
&gt; 
&gt; Note that value has no relationship to value1 or value2, so the ramp never actually starts at the correct value and if it reaches value2, it is coincidental.
&gt; 
&gt; I think that before the loop we need to do something like
&gt; 
&gt; value = value1 * pow(multiplier, AudioUtilities::timeToSampleFrame(currentTime - time1, sampleRate)
&gt; 
&gt; to set the correct starting value.

Are you also finding that your layout test is failing because of this, even if you call setValueAtTime() first before exponentialRampToValue()?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551401</commentid>
    <comment_count>2</comment_count>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-07 14:36:45 -0800</bug_when>
    <thetext>(In reply to comment #1)
&gt; (In reply to comment #0)
&gt; &gt; exponentialRampToValue currently does:
&gt; &gt; 
&gt; &gt; 
&gt; &gt;    float numSampleFrames = deltaTime * sampleRate;
&gt; &gt;    float multiplier = powf(value2 / value1, 1 / numSampleFrames);
&gt; &gt;    for (; writeIndex &lt; fillToFrame; ++writeIndex) {
&gt; &gt;        values[writeIndex] = value;
&gt; &gt;        value *= multiplier;
&gt; &gt;        currentTime += sampleFrameTimeIncr;
&gt; &gt;    }
&gt; &gt; 
&gt; &gt; Note that value has no relationship to value1 or value2, so the ramp never actually starts at the correct value and if it reaches value2, it is coincidental.
&gt; &gt; 
&gt; &gt; I think that before the loop we need to do something like
&gt; &gt; 
&gt; &gt; value = value1 * pow(multiplier, AudioUtilities::timeToSampleFrame(currentTime - time1, sampleRate)
&gt; &gt; 
&gt; &gt; to set the correct starting value.
&gt; 
&gt; Are you also finding that your layout test is failing because of this, even if you call setValueAtTime() first before exponentialRampToValue()?

Yes, I always call setValueAtTime for time n before calling exponentialRampToValue at time n + 1.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551410</commentid>
    <comment_count>3</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2012-02-07 14:44:58 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (In reply to comment #1)
&gt; &gt; (In reply to comment #0)
&gt; &gt; &gt; exponentialRampToValue currently does:
&gt; &gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt;    float numSampleFrames = deltaTime * sampleRate;
&gt; &gt; &gt;    float multiplier = powf(value2 / value1, 1 / numSampleFrames);
&gt; &gt; &gt;    for (; writeIndex &lt; fillToFrame; ++writeIndex) {
&gt; &gt; &gt;        values[writeIndex] = value;
&gt; &gt; &gt;        value *= multiplier;
&gt; &gt; &gt;        currentTime += sampleFrameTimeIncr;
&gt; &gt; &gt;    }
&gt; &gt; &gt; 
&gt; &gt; &gt; Note that value has no relationship to value1 or value2, so the ramp never actually starts at the correct value and if it reaches value2, it is coincidental.
&gt; &gt; &gt; 
&gt; &gt; &gt; I think that before the loop we need to do something like
&gt; &gt; &gt; 
&gt; &gt; &gt; value = value1 * pow(multiplier, AudioUtilities::timeToSampleFrame(currentTime - time1, sampleRate)
&gt; &gt; &gt; 
&gt; &gt; &gt; to set the correct starting value.
&gt; &gt; 
&gt; &gt; Are you also finding that your layout test is failing because of this, even if you call setValueAtTime() first before exponentialRampToValue()?
&gt; 
&gt; Yes, I always call setValueAtTime for time n before calling exponentialRampToValue at time n + 1.

Ok, that makes sense.  Something like your proposed fix seems right.  I would suggest making the fix in this bug and adding the layout test here too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552512</commentid>
    <comment_count>4</comment_count>
      <attachid>126158</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-08 14:50:47 -0800</bug_when>
    <thetext>Created attachment 126158
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553638</commentid>
    <comment_count>5</comment_count>
      <attachid>126158</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2012-02-09 17:27:24 -0800</bug_when>
    <thetext>Comment on attachment 126158
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=126158&amp;action=review

&gt; Source/WebCore/webaudio/AudioParamTimeline.cpp:247
&gt; +                // the same as multiplier^(currentTime-time1), but

nit: spacing for math operators

actually looking at this equation more closely -- what you mean to say (I think) is that it&apos;s the same as multiplier ^ AudioUtilities::timeToSampleFrame(currentTime - time1)
WebKit style: can we get line wrapping on these comments to be more consistent  with the rest of this file (eg. line 242) and with WebKit style in general which doesn&apos;t favor such short line wrapping.

&gt; LayoutTests/webaudio/audioparam-exponential.html:1
&gt; +&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;

audioparam-exponential seems a little terse.  How about &quot;audioparam-exponentialRampToValueAtTime&quot;

I&apos;ve noticed some of the canvas2D layout tests use this style of naming (camel-casing) and seems good here too:
(for example:  &quot;linearGradient-infinite-values.html&quot;)

&gt; LayoutTests/webaudio/audioparam-exponential.html:14
&gt; +      description(&quot;Test AudioParam exponentialRampToValueAtTime functionality.&quot;);

how about:

&quot;Test AudioParam exponentialRampToValueAtTime()&quot;

&gt; LayoutTests/webaudio/audioparam-exponential.html:16
&gt; +      // Play a long square wave out through a gain block, and call

let&apos;s be specific: &quot;gain block&quot; -&gt; &quot;AudioGainNode&quot;

nit: it&apos;s not really a square wave (which is a periodic signal with duty cycle with +1 portion and symmetric -1 portion)
Let&apos;s just call it a DC-offset of value 1 (or some more concise version of that)

&gt; LayoutTests/webaudio/audioparam-exponential.html:17
&gt; +      // setValueAtTime at regular intervals to set the starting gain.

setValueAtTime -&gt; setValueAtTime()

How about re-wording this line:
// setValueAtTime() and exponentialRampToValueAtTime() to establish the start and end points for an exponential ramp.

&gt; LayoutTests/webaudio/audioparam-exponential.html:19
&gt; +      // the rendered signal to see if the value of the square wave

Let&apos;s be *very* specific and use precise (but as concise as possible) language about what this test does.

&quot;We generate an exponential ramp&quot;  &lt;---- a &quot;different&quot; exponential ramp each time??  are they different starting and ending values?
And if so, how.

&gt; LayoutTests/webaudio/audioparam-exponential.html:31
&gt; +      // gain.

style nit: strange to wrap a line just for one word

Try to keep comments a bit longer than you are -- it&apos;s WebKit style and also is a matter of consistency with the rest of this file (lines 45, etc.)

&gt; LayoutTests/webaudio/audioparam-exponential.html:36
&gt; +      var gainStep = startingGain / (2 * numberOfTests);

can we choose a more descriptive name for this variable such as &quot;startEndGainChange&quot;

&gt; LayoutTests/webaudio/audioparam-exponential.html:38
&gt; +      var squareBuffer;

constantBuffer - or dcBuffer

&gt; LayoutTests/webaudio/audioparam-exponential.html:70
&gt; +          // 2*gainStep.  However, the exponential ramp target gain is

nit: 2 * gainStep

for naming symmetry can we avoid the use of the word &quot;target&quot; and instead use &quot;end&quot; (as compared with &quot;start&quot;)
Here and everywhere in the patch

&gt; LayoutTests/webaudio/audioparam-exponential.html:92
&gt; +                                      function(g, startTime, endTime) {

Not sure I understand why we need &quot;startTime&quot; if we&apos;re not using it here --- is it an abstraction useful for testing other curves other than the exponential one?

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:33
&gt; +function exponentialRampSignal(startTime, endTime, startValue, endValue, sampleRate)

Can we use the &quot;create&quot; naming convention that we use in &quot;createSquareBuffer&quot; above?
For example, call the function &quot;createExponentialRampArray()&quot;

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:34
&gt; +{

Let&apos;s be consistent with use of braces --- I see you have the brace at the end-of-line on 17, 50, etc.

Actually, WebKit style is to have braces on the following line (for functions) but let&apos;s be consistent everywhere

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:52
&gt; +    var expected = expectedFunction(startTime, endTime, gainInfo.gainStart, gainInfo.gainTarget, sampleRate);

See comments below about doAutomation() and compareSignals().

&quot;gainInfo.gainStart, gainInfo.gainTarget&quot; seems like it would be a great deal clearer as &quot;valueInfo.startValue, valueInfo.endValue&quot;

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:107
&gt; +function compareSignals(testName, maxError, renderedData, expectedFunction, timeGainInfo, breakThreshold) {

See my comment about doAutomation() below.  Please lets remove the term &quot;gain&quot; and use &quot;value&quot; instead.  How about &quot;timeValueInfo&quot; since all the AudioParam methods deal in the concepts of time and value.

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:139
&gt; +// Run all the automation tests.

In the doAutomation() function I think it would be a lot more clear if we avoid talking about &quot;gain&quot; and instead use the term &quot;value&quot;
This function doesn&apos;t need to know anything at all about gain (it&apos;s only the caller of this function that knows that) and furthermore
all the AudioParam methods that we&apos;re testing talk about things in terms of &quot;value&quot;
Can you have a run through the comments and variable names for this function.

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:141
&gt; +// gainUpdate - How much to change the gain at beginning of each time

This is pretty confusing -- can we call it gainUpdateFunction since it&apos;s a function -- not clear from this comment

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:172
&gt; +        // target gain.

nit: unnecessary line wrapping</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554202</commentid>
    <comment_count>6</comment_count>
      <attachid>126536</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-10 10:47:42 -0800</bug_when>
    <thetext>Created attachment 126536
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554210</commentid>
    <comment_count>7</comment_count>
      <attachid>126158</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-10 10:53:52 -0800</bug_when>
    <thetext>Comment on attachment 126158
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=126158&amp;action=review

&gt;&gt; Source/WebCore/webaudio/AudioParamTimeline.cpp:247
&gt;&gt; +                // the same as multiplier^(currentTime-time1), but
&gt; 
&gt; nit: spacing for math operators
&gt; 
&gt; actually looking at this equation more closely -- what you mean to say (I think) is that it&apos;s the same as multiplier ^ AudioUtilities::timeToSampleFrame(currentTime - time1)
&gt; WebKit style: can we get line wrapping on these comments to be more consistent  with the rest of this file (eg. line 242) and with WebKit style in general which doesn&apos;t favor such short line wrapping.

Fixed.  Longer line wrapping added.

&gt;&gt; LayoutTests/webaudio/audioparam-exponential.html:1
&gt;&gt; +&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;&gt;
&gt; 
&gt; audioparam-exponential seems a little terse.  How about &quot;audioparam-exponentialRampToValueAtTime&quot;
&gt; 
&gt; I&apos;ve noticed some of the canvas2D layout tests use this style of naming (camel-casing) and seems good here too:
&gt; (for example:  &quot;linearGradient-infinite-values.html&quot;)

Renamed as suggested.

&gt;&gt; LayoutTests/webaudio/audioparam-exponential.html:14
&gt;&gt; +      description(&quot;Test AudioParam exponentialRampToValueAtTime functionality.&quot;);
&gt; 
&gt; how about:
&gt; 
&gt; &quot;Test AudioParam exponentialRampToValueAtTime()&quot;

Done.

&gt;&gt; LayoutTests/webaudio/audioparam-exponential.html:16
&gt;&gt; +      // Play a long square wave out through a gain block, and call
&gt; 
&gt; let&apos;s be specific: &quot;gain block&quot; -&gt; &quot;AudioGainNode&quot;
&gt; 
&gt; nit: it&apos;s not really a square wave (which is a periodic signal with duty cycle with +1 portion and symmetric -1 portion)
&gt; Let&apos;s just call it a DC-offset of value 1 (or some more concise version of that)

Done.

&gt;&gt; LayoutTests/webaudio/audioparam-exponential.html:17
&gt;&gt; +      // setValueAtTime at regular intervals to set the starting gain.
&gt; 
&gt; setValueAtTime -&gt; setValueAtTime()
&gt; 
&gt; How about re-wording this line:
&gt; // setValueAtTime() and exponentialRampToValueAtTime() to establish the start and end points for an exponential ramp.

Rephrased.  I hope this is better.

&gt;&gt; LayoutTests/webaudio/audioparam-exponential.html:19
&gt;&gt; +      // the rendered signal to see if the value of the square wave
&gt; 
&gt; Let&apos;s be *very* specific and use precise (but as concise as possible) language about what this test does.
&gt; 
&gt; &quot;We generate an exponential ramp&quot;  &lt;---- a &quot;different&quot; exponential ramp each time??  are they different starting and ending values?
&gt; And if so, how.

Let me know if the new test is specific, precise, and concise.

&gt;&gt; LayoutTests/webaudio/audioparam-exponential.html:31
&gt;&gt; +      // gain.
&gt; 
&gt; style nit: strange to wrap a line just for one word
&gt; 
&gt; Try to keep comments a bit longer than you are -- it&apos;s WebKit style and also is a matter of consistency with the rest of this file (lines 45, etc.)

Done.

&gt;&gt; LayoutTests/webaudio/audioparam-exponential.html:36
&gt;&gt; +      var gainStep = startingGain / (2 * numberOfTests);
&gt; 
&gt; can we choose a more descriptive name for this variable such as &quot;startEndGainChange&quot;

Done.  Renamed everything containing &quot;gain&quot; to &quot;value&quot; as appropriate.

&gt;&gt; LayoutTests/webaudio/audioparam-exponential.html:38
&gt;&gt; +      var squareBuffer;
&gt; 
&gt; constantBuffer - or dcBuffer

Renamed to constantBuffer.

&gt;&gt; LayoutTests/webaudio/audioparam-exponential.html:70
&gt;&gt; +          // 2*gainStep.  However, the exponential ramp target gain is
&gt; 
&gt; nit: 2 * gainStep
&gt; 
&gt; for naming symmetry can we avoid the use of the word &quot;target&quot; and instead use &quot;end&quot; (as compared with &quot;start&quot;)
&gt; Here and everywhere in the patch

Done.

&gt;&gt; LayoutTests/webaudio/audioparam-exponential.html:92
&gt;&gt; +                                      function(g, startTime, endTime) {
&gt; 
&gt; Not sure I understand why we need &quot;startTime&quot; if we&apos;re not using it here --- is it an abstraction useful for testing other curves other than the exponential one?

Yes, this is an abstraction.  Originally the start time was not included, but for setTargetValueAtTime, the start time is needed.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:33
&gt;&gt; +function exponentialRampSignal(startTime, endTime, startValue, endValue, sampleRate)
&gt; 
&gt; Can we use the &quot;create&quot; naming convention that we use in &quot;createSquareBuffer&quot; above?
&gt; For example, call the function &quot;createExponentialRampArray()&quot;

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:34
&gt;&gt; +{
&gt; 
&gt; Let&apos;s be consistent with use of braces --- I see you have the brace at the end-of-line on 17, 50, etc.
&gt; 
&gt; Actually, WebKit style is to have braces on the following line (for functions) but let&apos;s be consistent everywhere

Fixed.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:52
&gt;&gt; +    var expected = expectedFunction(startTime, endTime, gainInfo.gainStart, gainInfo.gainTarget, sampleRate);
&gt; 
&gt; See comments below about doAutomation() and compareSignals().
&gt; 
&gt; &quot;gainInfo.gainStart, gainInfo.gainTarget&quot; seems like it would be a great deal clearer as &quot;valueInfo.startValue, valueInfo.endValue&quot;

Done.  &quot;gain&quot; renamed to &quot;value&quot; everywhere appropriate.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:107
&gt;&gt; +function compareSignals(testName, maxError, renderedData, expectedFunction, timeGainInfo, breakThreshold) {
&gt; 
&gt; See my comment about doAutomation() below.  Please lets remove the term &quot;gain&quot; and use &quot;value&quot; instead.  How about &quot;timeValueInfo&quot; since all the AudioParam methods deal in the concepts of time and value.

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:139
&gt;&gt; +// Run all the automation tests.
&gt; 
&gt; In the doAutomation() function I think it would be a lot more clear if we avoid talking about &quot;gain&quot; and instead use the term &quot;value&quot;
&gt; This function doesn&apos;t need to know anything at all about gain (it&apos;s only the caller of this function that knows that) and furthermore
&gt; all the AudioParam methods that we&apos;re testing talk about things in terms of &quot;value&quot;
&gt; Can you have a run through the comments and variable names for this function.

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:141
&gt;&gt; +// gainUpdate - How much to change the gain at beginning of each time
&gt; 
&gt; This is pretty confusing -- can we call it gainUpdateFunction since it&apos;s a function -- not clear from this comment

Changed to valueUpdateFunction.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:172
&gt;&gt; +        // target gain.
&gt; 
&gt; nit: unnecessary line wrapping

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>561269</commentid>
    <comment_count>8</comment_count>
      <attachid>126536</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2012-02-21 15:19:01 -0800</bug_when>
    <thetext>Comment on attachment 126536
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=126536&amp;action=review

&gt; Source/WebCore/webaudio/AudioParamTimeline.cpp:246
&gt; +                // Set the starting value of the exponential. This is the same as multiplier ^

&quot;exponential&quot; -&gt; &quot;exponential ramp&quot;

&gt; Source/WebCore/webaudio/AudioParamTimeline.cpp:247
&gt; +                // AudioUtilities::timeToSampleFrame(currentTime - time1, sampleRate), but appears

&quot;but appears to be&quot; -&gt; &quot;but is&quot;

&gt; LayoutTests/webaudio/audioparam-exponentialRampToValueAtTime-expected.txt:6
&gt; +PASS All 100 tests passed with absolute error below 0.000675

Probably best not to explicitly say &quot;below 0.000675&quot;, but instead say &quot;within an acceptable tolerance.&quot;

&gt; LayoutTests/webaudio/audioparam-exponentialRampToValueAtTime.html:24
&gt; +      var maxAllowedError = 6.75e-4;

Can&apos;t we just push this threshold into the .js file?

&gt; LayoutTests/webaudio/audioparam-exponentialRampToValueAtTime.html:31
&gt; +      var startingValue = 100;

See comment below about using &quot;initialValue&quot; instead of &quot;startingValue&quot;

&gt; LayoutTests/webaudio/audioparam-exponentialRampToValueAtTime.html:35
&gt; +      var startEndValueChange = startingValue / (2 * numberOfTests);

&quot;Each exponential ramp&quot; -&gt; &quot;The value of each exponential ramp&quot;
&quot;increase or decrease&quot; -&gt; &quot;change&quot;

There are several places where we&apos;re dividing or multiplying by 2.  Here, line 44 and line  68, 77
This is pretty confusing to me just trying to follow the code from start to finish.

Is there any way we can avoid this and make it simpler?

&gt; LayoutTests/webaudio/audioparam-exponentialRampToValueAtTime.html:89
&gt; +                                      function(value, startTime, endTime) {

Please add short comment describing that we ignore the &quot;startTime&quot; because exponentialRampToValueAtTime() uses the start time from the setValueAtTime() call above.

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:29
&gt; +// Create a exponential ramp starting at |startValue| and ending at |endValue|.  The ramp starts at

nit: &quot;a exponential&quot; -&gt; &quot;an exponential&quot;

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:70
&gt; +// expected start of the time interval. There is a discontinuity if the difference between

location -&gt; locations
discontinuity -&gt; discontinuities
&quot;with our expected start of the time interval&quot; -&gt; &quot;with the times which define the time intervals&quot;

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:72
&gt; +function verifyDiscontinuities(data, startTime, threshold)

How about using &quot;values&quot; instead of &quot;data&quot; -- seems a little more friendly

startTime -&gt; times

&quot;start&quot; isn&apos;t really helpful here because the time value represents the end of one interval and the start of the next, thus &quot;start&quot; has no special meaning or preference as compared with &quot;end&quot;.

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:89
&gt; +        var expected = timeToSampleFrame(startTime[k + 1], sampleRate);

expected -&gt; expectedSampleFrame

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:110
&gt; +// maxError - maximum allowed difference between the rendered data and the expected data

Can&apos;t we just have this be an internal threshold shared among all the different tests?

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:143
&gt; +        testPassed(&quot;All &quot; + n + &quot; tests passed with absolute error below &quot; + maxError);

See comment above (in the expected.txt file)

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:155
&gt; +// startingValue - The starting value.

This naming is a bit confusing, since each time interval has the notion of &quot;start&quot; and &quot;end&quot; times and values.
So, I would suggest calling it &quot;initialValue&quot; instead, since it sets the very initial value for all of the intervals...

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:157
&gt; +// valueUpdateFunction - How much to change the value at beginning of each time interval.

It appears from the code that this is the amount to change at the *end* of each time interval and not the *beginning*.  Please fix here and anywhere else (if any)

Also, since it seems to happen at the end of the loop, it would probably make sense to change the order of the parameters and make this the very last parameter.

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:159
&gt; +// endValueStepFunction - How much the target value differs from the value at the start of the

I&apos;m not very fond of the name &quot;step function&quot;, since this has connotations in mathematics (think &quot;unit step function&quot;).
So, how about calling it &quot;endValueDeltaFunction&quot;

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:165
&gt; +// the value approaches the target.

I&apos;d rather not use the word &quot;target&quot; since it has very specific meaning in relation to setTargetValueAtTime().
Because of this and also because it&apos;s more consistent, let&apos;s use &quot;end&quot; instead, here and everywhere else

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:169
&gt; +function doAutomation(startingValue, valueUpdateFunction, endValueStepFunction, setValueFunction, automationFunction)

startingValue -&gt; initialValue

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:171
&gt; +    var startTimeInfo = [0];

startTimeInfo -&gt; timeInfo

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:173
&gt; +    var value = startingValue;

startingValue -&gt; initialValue

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:177
&gt; +        var timeEnd = (k + 1) * timeInterval;

timeStart -&gt; startTime
timeEnd -&gt; endTime

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:188
&gt; +        valueInfo.push({ startValue: value, endValue : endValue});

nit: extra space

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:193
&gt; +    return { startTime : startTimeInfo, value : valueInfo };

We&apos;re dealing with arrays of times and values (not a single value)
startTime -&gt; times
value -&gt; values

here and everywhere it&apos;s used</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562015</commentid>
    <comment_count>9</comment_count>
      <attachid>128225</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-22 08:56:29 -0800</bug_when>
    <thetext>Created attachment 128225
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562024</commentid>
    <comment_count>10</comment_count>
      <attachid>126536</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-22 09:05:55 -0800</bug_when>
    <thetext>Comment on attachment 126536
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=126536&amp;action=review

&gt;&gt; Source/WebCore/webaudio/AudioParamTimeline.cpp:246
&gt;&gt; +                // Set the starting value of the exponential. This is the same as multiplier ^
&gt; 
&gt; &quot;exponential&quot; -&gt; &quot;exponential ramp&quot;

Done.

&gt;&gt; Source/WebCore/webaudio/AudioParamTimeline.cpp:247
&gt;&gt; +                // AudioUtilities::timeToSampleFrame(currentTime - time1, sampleRate), but appears
&gt; 
&gt; &quot;but appears to be&quot; -&gt; &quot;but is&quot;

Done.

&gt;&gt; LayoutTests/webaudio/audioparam-exponentialRampToValueAtTime-expected.txt:6
&gt;&gt; +PASS All 100 tests passed with absolute error below 0.000675
&gt; 
&gt; Probably best not to explicitly say &quot;below 0.000675&quot;, but instead say &quot;within an acceptable tolerance.&quot;

Done.  But &quot;acceptable tolerance&quot; is so vague.

&gt;&gt; LayoutTests/webaudio/audioparam-exponentialRampToValueAtTime.html:24
&gt;&gt; +      var maxAllowedError = 6.75e-4;
&gt; 
&gt; Can&apos;t we just push this threshold into the .js file?

It&apos;s not clear that we can use exactly the same value for all tests.  In addition, the correct threshold for the setValueCurve test is 0 because the reference is stored in a Float32Array, so the rendered output should be exactly equal to the reference.

&gt;&gt; LayoutTests/webaudio/audioparam-exponentialRampToValueAtTime.html:35
&gt;&gt; +      var startEndValueChange = startingValue / (2 * numberOfTests);
&gt; 
&gt; &quot;Each exponential ramp&quot; -&gt; &quot;The value of each exponential ramp&quot;
&gt; &quot;increase or decrease&quot; -&gt; &quot;change&quot;
&gt; 
&gt; There are several places where we&apos;re dividing or multiplying by 2.  Here, line 44 and line  68, 77
&gt; This is pretty confusing to me just trying to follow the code from start to finish.
&gt; 
&gt; Is there any way we can avoid this and make it simpler?

Comments changed.

This has been rewritten a bit, adding a few functions with comments.  I hope this is clearer.

&gt;&gt; LayoutTests/webaudio/audioparam-exponentialRampToValueAtTime.html:89
&gt;&gt; +                                      function(value, startTime, endTime) {
&gt; 
&gt; Please add short comment describing that we ignore the &quot;startTime&quot; because exponentialRampToValueAtTime() uses the start time from the setValueAtTime() call above.

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:29
&gt;&gt; +// Create a exponential ramp starting at |startValue| and ending at |endValue|.  The ramp starts at
&gt; 
&gt; nit: &quot;a exponential&quot; -&gt; &quot;an exponential&quot;

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:70
&gt;&gt; +// expected start of the time interval. There is a discontinuity if the difference between
&gt; 
&gt; location -&gt; locations
&gt; discontinuity -&gt; discontinuities
&gt; &quot;with our expected start of the time interval&quot; -&gt; &quot;with the times which define the time intervals&quot;

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:72
&gt;&gt; +function verifyDiscontinuities(data, startTime, threshold)
&gt; 
&gt; How about using &quot;values&quot; instead of &quot;data&quot; -- seems a little more friendly
&gt; 
&gt; startTime -&gt; times
&gt; 
&gt; &quot;start&quot; isn&apos;t really helpful here because the time value represents the end of one interval and the start of the next, thus &quot;start&quot; has no special meaning or preference as compared with &quot;end&quot;.

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:89
&gt;&gt; +        var expected = timeToSampleFrame(startTime[k + 1], sampleRate);
&gt; 
&gt; expected -&gt; expectedSampleFrame

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:110
&gt;&gt; +// maxError - maximum allowed difference between the rendered data and the expected data
&gt; 
&gt; Can&apos;t we just have this be an internal threshold shared among all the different tests?

It&apos;s not clear that all the (upcoming) tests can use the same threshold.  Or we end up with a worst case threshold that is much larger than needed.  In particular, the setValueCurve threshold should actually be 0 because the curve should be exactly what we set it to.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:143
&gt;&gt; +        testPassed(&quot;All &quot; + n + &quot; tests passed with absolute error below &quot; + maxError);
&gt; 
&gt; See comment above (in the expected.txt file)

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:155
&gt;&gt; +// startingValue - The starting value.
&gt; 
&gt; This naming is a bit confusing, since each time interval has the notion of &quot;start&quot; and &quot;end&quot; times and values.
&gt; So, I would suggest calling it &quot;initialValue&quot; instead, since it sets the very initial value for all of the intervals...

Renamed.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:157
&gt;&gt; +// valueUpdateFunction - How much to change the value at beginning of each time interval.
&gt; 
&gt; It appears from the code that this is the amount to change at the *end* of each time interval and not the *beginning*.  Please fix here and anywhere else (if any)
&gt; 
&gt; Also, since it seems to happen at the end of the loop, it would probably make sense to change the order of the parameters and make this the very last parameter.

Clarified comment, and reordered parameters.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:159
&gt;&gt; +// endValueStepFunction - How much the target value differs from the value at the start of the
&gt; 
&gt; I&apos;m not very fond of the name &quot;step function&quot;, since this has connotations in mathematics (think &quot;unit step function&quot;).
&gt; So, how about calling it &quot;endValueDeltaFunction&quot;

Renamed.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:165
&gt;&gt; +// the value approaches the target.
&gt; 
&gt; I&apos;d rather not use the word &quot;target&quot; since it has very specific meaning in relation to setTargetValueAtTime().
&gt; Because of this and also because it&apos;s more consistent, let&apos;s use &quot;end&quot; instead, here and everywhere else

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:169
&gt;&gt; +function doAutomation(startingValue, valueUpdateFunction, endValueStepFunction, setValueFunction, automationFunction)
&gt; 
&gt; startingValue -&gt; initialValue

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:177
&gt;&gt; +        var timeEnd = (k + 1) * timeInterval;
&gt; 
&gt; timeStart -&gt; startTime
&gt; timeEnd -&gt; endTime

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:188
&gt;&gt; +        valueInfo.push({ startValue: value, endValue : endValue});
&gt; 
&gt; nit: extra space

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:193
&gt;&gt; +    return { startTime : startTimeInfo, value : valueInfo };
&gt; 
&gt; We&apos;re dealing with arrays of times and values (not a single value)
&gt; startTime -&gt; times
&gt; value -&gt; values
&gt; 
&gt; here and everywhere it&apos;s used

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562458</commentid>
    <comment_count>11</comment_count>
      <attachid>128225</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2012-02-22 15:32:05 -0800</bug_when>
    <thetext>Comment on attachment 128225
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=128225&amp;action=review

&gt; LayoutTests/webaudio/audioparam-exponentialRampToValueAtTime.html:4
&gt; +    &lt;script src=&quot;resources/audio-testing.js&quot;&gt;&lt;/script&gt;

I just noticed that indentation is 2 spaces here and other places in this file.  I see that other layout tests in the webaudio directory also have this issue,
so it&apos;s probably more efficient to fix all of these at once in another patch...

&gt; LayoutTests/webaudio/audioparam-exponentialRampToValueAtTime.html:28
&gt; +      var timeGainInfo;

timeGainInfo -&gt; timeValueInfo

&gt; LayoutTests/webaudio/audioparam-exponentialRampToValueAtTime.html:107
&gt; +          gainNode = context.createGainNode();

It would be great to have a short comment here describing that:

// We use an AudioGainNode here simply as a convenient way to test the AudioParam automation, since it&apos;s easy to pass a constant value through the node,
// automate the .gain attribute and observe the resulting values.

I know we have a comment on line 16, but I think this could be a point of confusion and is worth making clear

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:66
&gt; +    return { maxError : maxError, index : maxErrorIndex };

nit: spacing

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:124
&gt; +    var startTime = timeValueInfo.times;

startTime -&gt; times

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:125
&gt; +    var gains = timeValueInfo.values;

gains -&gt; values

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:134
&gt; +            testFailed(&quot;Incorrect gain for test &quot; + k + &quot;. Max error = &quot; + result.maxError + &quot; at offset &quot; + (result.index + timeToSampleFrame(startTime[k], sampleRate)));

gain -&gt; value

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:157
&gt; +// valueUpdateFunction - The starting value at time interval k is adjusted by valueUpdateFunction(k) to give the new starting value at time interval k + 1.

The comment for valueUpdateFunction is out-of-order compared with the param order in the function itself

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:183
&gt; +        // Specify the target value, and how we should approach the target value.

target -&gt; end

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:186
&gt; +        // Keep track of the start times, and the start and target values for each time interval.

target -&gt; end

&gt; LayoutTests/webaudio/resources/audioparam-testing.js:193
&gt; +    return { times : timeInfo, values : valueInfo };

nit: extra spaces</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562483</commentid>
    <comment_count>12</comment_count>
      <attachid>128309</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-22 15:53:48 -0800</bug_when>
    <thetext>Created attachment 128309
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562487</commentid>
    <comment_count>13</comment_count>
      <attachid>128312</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-22 15:57:40 -0800</bug_when>
    <thetext>Created attachment 128312
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562489</commentid>
    <comment_count>14</comment_count>
      <attachid>128314</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-22 16:00:25 -0800</bug_when>
    <thetext>Created attachment 128314
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562501</commentid>
    <comment_count>15</comment_count>
      <attachid>128225</attachid>
    <who name="Raymond Toy">rtoy</who>
    <bug_when>2012-02-22 16:05:36 -0800</bug_when>
    <thetext>Comment on attachment 128225
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=128225&amp;action=review

&gt;&gt; LayoutTests/webaudio/audioparam-exponentialRampToValueAtTime.html:4
&gt;&gt; +    &lt;script src=&quot;resources/audio-testing.js&quot;&gt;&lt;/script&gt;
&gt; 
&gt; I just noticed that indentation is 2 spaces here and other places in this file.  I see that other layout tests in the webaudio directory also have this issue,
&gt; so it&apos;s probably more efficient to fix all of these at once in another patch...

You mean the indentation of the html tags?  Ok. I&apos;ll fix these in another patch (by removing the html tag indentation as done in other files.)

&gt;&gt; LayoutTests/webaudio/audioparam-exponentialRampToValueAtTime.html:28
&gt;&gt; +      var timeGainInfo;
&gt; 
&gt; timeGainInfo -&gt; timeValueInfo

Done.

&gt;&gt; LayoutTests/webaudio/audioparam-exponentialRampToValueAtTime.html:107
&gt;&gt; +          gainNode = context.createGainNode();
&gt; 
&gt; It would be great to have a short comment here describing that:
&gt; 
&gt; // We use an AudioGainNode here simply as a convenient way to test the AudioParam automation, since it&apos;s easy to pass a constant value through the node,
&gt; // automate the .gain attribute and observe the resulting values.
&gt; 
&gt; I know we have a comment on line 16, but I think this could be a point of confusion and is worth making clear

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:66
&gt;&gt; +    return { maxError : maxError, index : maxErrorIndex };
&gt; 
&gt; nit: spacing

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:124
&gt;&gt; +    var startTime = timeValueInfo.times;
&gt; 
&gt; startTime -&gt; times

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:125
&gt;&gt; +    var gains = timeValueInfo.values;
&gt; 
&gt; gains -&gt; values

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:134
&gt;&gt; +            testFailed(&quot;Incorrect gain for test &quot; + k + &quot;. Max error = &quot; + result.maxError + &quot; at offset &quot; + (result.index + timeToSampleFrame(startTime[k], sampleRate)));
&gt; 
&gt; gain -&gt; value

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:157
&gt;&gt; +// valueUpdateFunction - The starting value at time interval k is adjusted by valueUpdateFunction(k) to give the new starting value at time interval k + 1.
&gt; 
&gt; The comment for valueUpdateFunction is out-of-order compared with the param order in the function itself

Reordered to match.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:183
&gt;&gt; +        // Specify the target value, and how we should approach the target value.
&gt; 
&gt; target -&gt; end

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:186
&gt;&gt; +        // Keep track of the start times, and the start and target values for each time interval.
&gt; 
&gt; target -&gt; end

Done.

&gt;&gt; LayoutTests/webaudio/resources/audioparam-testing.js:193
&gt;&gt; +    return { times : timeInfo, values : valueInfo };
&gt; 
&gt; nit: extra spaces

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562530</commentid>
    <comment_count>16</comment_count>
      <attachid>128314</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2012-02-22 16:29:03 -0800</bug_when>
    <thetext>Comment on attachment 128314
Patch

Looks good - thanks for the test!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562664</commentid>
    <comment_count>17</comment_count>
      <attachid>128314</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-22 18:19:09 -0800</bug_when>
    <thetext>Comment on attachment 128314
Patch

Clearing flags on attachment: 128314

Committed r108592: &lt;http://trac.webkit.org/changeset/108592&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562665</commentid>
    <comment_count>18</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-22 18:19:14 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126158</attachid>
            <date>2012-02-08 14:50:47 -0800</date>
            <delta_ts>2012-02-10 10:53:52 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78035-20120208145046.patch</filename>
            <type>text/plain</type>
            <size>14868</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA2ODg5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZjg1MTUxZWQyNDRkMDY3
M2JhZjI4Nzg0NDhkYWQ3ZmZiZTg5ZDA2Yi4uOTQ3NGY1YmJlZTU1OTcyMTAwOWQ2OGEzODVlMWRm
MzdkYTI4ZThlYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE2IEBACisyMDEyLTAyLTA4ICBSYXlt
b25kIFRveSAgPHJ0b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBleHBvbmVudGlhbFJhbXBUb1Zh
bHVlIGRvZXNuJ3QgdXNlIHN0YXJ0aW5nIHZhbHVlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD03ODAzNQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIFRlc3Q6IHdlYmF1ZGlvL2F1ZGlvcGFyYW0tZXhwb25lbnRp
YWwuaHRtbAorCisgICAgICAgICogd2ViYXVkaW8vQXVkaW9QYXJhbVRpbWVsaW5lLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFyYW1UaW1lbGluZTo6dmFsdWVzRm9yVGltZVJhbmdlSW1w
bCk6IFNldAorICAgICAgICBzdGFydGluZyB2YWx1ZSBmb3IgZXhwb25lbnRpYWwgcmFtcC4KKwog
MjAxMi0wMi0wNiAgS2VudGFybyBIYXJhICA8aGFyYWtlbkBjaHJvbWl1bS5vcmc+CiAKICAgICAg
ICAgVW5yZXZpZXdlZCwgcm9sbGluZyBvdXQgcjEwNjg4My4KZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvUGFyYW1UaW1lbGluZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS93
ZWJhdWRpby9BdWRpb1BhcmFtVGltZWxpbmUuY3BwCmluZGV4IGVmZjFlYTc5YjAxMGM5Y2QwYjQz
ZmU1MjI4Zjg3NjAyZTFhYTdiMDEuLjM1YWVhYzc2ZjYzNWVmOGY4NmYzYjU1OGYwNTAxMjhmZDMz
ODhiYTkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvUGFyYW1UaW1l
bGluZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvd2ViYXVkaW8vQXVkaW9QYXJhbVRpbWVsaW5l
LmNwcApAQCAtMjQyLDYgKzI0MiwxNCBAQCBmbG9hdCBBdWRpb1BhcmFtVGltZWxpbmU6OnZhbHVl
c0ZvclRpbWVSYW5nZUltcGwoZmxvYXQgc3RhcnRUaW1lLAogICAgICAgICAgICAgICAgIC8vIFRo
ZSB2YWx1ZSBnb2VzIGV4cG9uZW50aWFsbHkgZnJvbSB2YWx1ZTEgdG8gdmFsdWUyIGluIGEgZHVy
YXRpb24gb2YgZGVsdGFUaW1lIHNlY29uZHMgKGNvcnJlc3BvbmRpbmcgdG8gbnVtU2FtcGxlRnJh
bWVzKS4KICAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBwZXItc2FtcGxlIG11bHRpcGxp
ZXIuCiAgICAgICAgICAgICAgICAgZmxvYXQgbXVsdGlwbGllciA9IHBvd2YodmFsdWUyIC8gdmFs
dWUxLCAxIC8gbnVtU2FtcGxlRnJhbWVzKTsKKworICAgICAgICAgICAgICAgIC8vIFNldCB0aGUg
c3RhcnRpbmcgdmFsdWUgb2YgdGhlIGV4cG9uZW50aWFsLiBUaGlzIGlzCisgICAgICAgICAgICAg
ICAgLy8gdGhlIHNhbWUgYXMgbXVsdGlwbGllcl4oY3VycmVudFRpbWUtdGltZTEpLCBidXQKKyAg
ICAgICAgICAgICAgICAvLyBhcHBlYXJzIHRvIGJlIG1vcmUgYWNjdXJhdGUsIGVzcGVjaWFsbHkg
aWYKKyAgICAgICAgICAgICAgICAvLyBtdWx0aXBsaWVyIGlzIGNsb3NlIHRvIDEuCisgICAgICAg
ICAgICAgICAgdmFsdWUgPSB2YWx1ZTEgKiBwb3dmKHZhbHVlMiAvIHZhbHVlMSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9VdGlsaXRpZXM6OnRpbWVUb1NhbXBs
ZUZyYW1lKGN1cnJlbnRUaW1lIC0gdGltZTEsIHNhbXBsZVJhdGUpIC8gbnVtU2FtcGxlRnJhbWVz
KTsKKwogICAgICAgICAgICAgICAgIGZvciAoOyB3cml0ZUluZGV4IDwgZmlsbFRvRnJhbWU7ICsr
d3JpdGVJbmRleCkgewogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbd3JpdGVJbmRleF0gPSB2
YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKj0gbXVsdGlwbGllcjsKZGlmZiAtLWdp
dCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwppbmRleCA4
MzRkOGIwOWZkMmE2NTM3ZDZmZGNlODllZTkzYjRhZDhkZGYzNGIwLi5jZDBmMDM0MDhkNWRmOTg3
NmYwOTAxZTljNjJhZjUwOTc1NGY0NDkxIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjAgQEAKKzIwMTItMDIt
MDggIFJheW1vbmQgVG95ICA8cnRveUBnb29nbGUuY29tPgorCisgICAgICAgIGV4cG9uZW50aWFs
UmFtcFRvVmFsdWUgZG9lc24ndCB1c2Ugc3RhcnRpbmcgdmFsdWUKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc4MDM1CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiB3ZWJhdWRpby9hdWRpb3BhcmFtLWV4cG9u
ZW50aWFsLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogd2ViYXVkaW8vYXVkaW9wYXJh
bS1leHBvbmVudGlhbC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiB3ZWJhdWRpby9yZXNvdXJjZXMv
YXVkaW9wYXJhbS10ZXN0aW5nLmpzOiBBZGRlZC4KKyAgICAgICAgKGNyZWF0ZVNxdWFyZUJ1ZmZl
cik6CisgICAgICAgIChleHBvbmVudGlhbFJhbXBTaWduYWwpOgorICAgICAgICAoY29tcGFyZVBh
cnRpYWxTaWduYWxzKToKKyAgICAgICAgKHZlcmlmeURpc2NvbnRpbnVpdGllcyk6CisgICAgICAg
IChjb21wYXJlU2lnbmFscyk6CisgICAgICAgIChkb0F1dG9tYXRpb24pOgorCiAyMDEyLTAyLTA2
ICBEYXZpZCBHcm9nYW4gIDxkZ3JvZ2FuQGNocm9taXVtLm9yZz4KIAogICAgICAgICBQb3J0IHNv
bWUgaW5kZXhlZGRiIGxheW91dCB0ZXN0cyB0byB3b3JrZXJzLgpkaWZmIC0tZ2l0IGEvTGF5b3V0
VGVzdHMvd2ViYXVkaW8vYXVkaW9wYXJhbS1leHBvbmVudGlhbC1leHBlY3RlZC50eHQgYi9MYXlv
dXRUZXN0cy93ZWJhdWRpby9hdWRpb3BhcmFtLWV4cG9uZW50aWFsLWV4cGVjdGVkLnR4dApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi41ODBhOWY0OWRlNmFlODEzY2I4NDAyOTFlNzBlNjE2NTUzYTJiMmYzCi0tLSAvZGV2
L251bGwKKysrIGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vYXVkaW9wYXJhbS1leHBvbmVudGlhbC1l
eHBlY3RlZC50eHQKQEAgLTAsMCArMSwxMSBAQAorVGVzdCBBdWRpb1BhcmFtIGV4cG9uZW50aWFs
UmFtcFRvVmFsdWVBdFRpbWUgZnVuY3Rpb25hbGl0eS4KKworT24gc3VjY2VzcywgeW91IHdpbGwg
c2VlIGEgc2VyaWVzIG9mICJQQVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExF
VEUiLgorCitQQVNTIEFsbCAxMDAgdGVzdHMgc3RhcnRlZCBhbmQgZW5kZWQgYXQgdGhlIGNvcnJl
Y3QgdGltZS4KK1BBU1MgQWxsIDEwMCB0ZXN0cyBwYXNzZWQgd2l0aCBhYnNvbHV0ZSBlcnJvciBi
ZWxvdyAwLjAwMDY3NQorUEFTUyBBdWRpb1BhcmFtIGV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRp
bWUgdGVzdCBwYXNzZWQuCitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCisKK1RFU1Qg
Q09NUExFVEUKKwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvd2ViYXVkaW8vYXVkaW9wYXJhbS1l
eHBvbmVudGlhbC5odG1sIGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vYXVkaW9wYXJhbS1leHBvbmVu
dGlhbC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjM5N2JmZjBjODA0MjFhNmEzNTlhM2ZlYWIwYTU0ODU3Njkx
ODdiZTIKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy93ZWJhdWRpby9hdWRpb3BhcmFt
LWV4cG9uZW50aWFsLmh0bWwKQEAgLTAsMCArMSwxMDkgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJ
QyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+CisgIDxo
ZWFkPgorICAgIDxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvYXVkaW8tdGVzdGluZy5qcyI+PC9zY3Jp
cHQ+CisgICAgPHNjcmlwdCBzcmM9InJlc291cmNlcy9hdWRpb3BhcmFtLXRlc3RpbmcuanMiPjwv
c2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9mYXN0L2pzL3Jlc291cmNlcy9qcy10ZXN0LXBy
ZS5qcyI+PC9zY3JpcHQ+CisgIDwvaGVhZD4KKworICA8Ym9keT4KKyAgICA8ZGl2IGlkPSJkZXNj
cmlwdGlvbiI+PC9kaXY+CisgICAgPGRpdiBpZD0iY29uc29sZSI+PC9kaXY+CisKKyAgICA8c2Ny
aXB0PgorICAgICAgZGVzY3JpcHRpb24oIlRlc3QgQXVkaW9QYXJhbSBleHBvbmVudGlhbFJhbXBU
b1ZhbHVlQXRUaW1lIGZ1bmN0aW9uYWxpdHkuIik7CisKKyAgICAgIC8vIFBsYXkgYSBsb25nIHNx
dWFyZSB3YXZlIG91dCB0aHJvdWdoIGEgZ2FpbiBibG9jaywgYW5kIGNhbGwKKyAgICAgIC8vIHNl
dFZhbHVlQXRUaW1lIGF0IHJlZ3VsYXIgaW50ZXJ2YWxzIHRvIHNldCB0aGUgc3RhcnRpbmcgZ2Fp
bi4KKyAgICAgIC8vIFdlIGdlbmVyYXRlIGFuIGV4cG9uZW50aWFsIHJhbXAgZm9yIGVhY2ggaW50
ZXJ2YWwuIExvb2sgYXQKKyAgICAgIC8vIHRoZSByZW5kZXJlZCBzaWduYWwgdG8gc2VlIGlmIHRo
ZSB2YWx1ZSBvZiB0aGUgc3F1YXJlIHdhdmUKKyAgICAgIC8vIG1hdGNoZXMgdGhlIGV4cGVjdGVk
IGdhaW4uCisKKyAgICAgIC8vIE1heCBhbGxvd2VkIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVu
ZGVyZWQgZGF0YSBhbmQgdGhlCisgICAgICAvLyBleHBlY3RlZCByZXN1bHQuCisgICAgICB2YXIg
bWF4QWxsb3dlZEVycm9yID0gNi43NWUtNDsKKworICAgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQg
dGhlIHN0YXJ0aW5nIHRpbWVzIGFuZCBzdGFydGluZyBhbmQgZW5kaW5nCisgICAgICAvLyBnYWlu
IGZvciBlYWNoIHRpbWUgaW50ZXJ2YWwuCisgICAgICB2YXIgdGltZUdhaW5JbmZvOworCisgICAg
ICAvLyBUaGUgZ2FpbiBibG9jayBzdGFydHMgd2l0aCB0aGlzIHZhbHVlIGluc3RlYWQgb2YgdGhl
IGRlZmF1bHQKKyAgICAgIC8vIGdhaW4uCisgICAgICB2YXIgc3RhcnRpbmdHYWluID0gMTAwOwor
CisgICAgICAvLyBFYWNoIHJhbXAgd2lsbCBkZWNyZWFzZSBieSB0aGlzIG11Y2ggZnJvbSB0aGUK
KyAgICAgIC8vIHN0YXJ0IHRvIHRoZSBlbmQgb2YgdGhlIHRpbWUgaW50ZXJ2YWwuCisgICAgICB2
YXIgZ2FpblN0ZXAgPSBzdGFydGluZ0dhaW4gLyAoMiAqIG51bWJlck9mVGVzdHMpOworCisgICAg
ICB2YXIgc3F1YXJlQnVmZmVyOworICAgICAgdmFyIGJ1ZmZlclNvdXJjZTsKKworICAgICAgZnVu
Y3Rpb24gY2hlY2tSZXN1bHQoZXZlbnQpIHsKKyAgICAgICAgICB2YXIgYnVmZmVyID0gZXZlbnQu
cmVuZGVyZWRCdWZmZXI7CisgICAgICAgICAgcmVuZGVyZWREYXRhID0gYnVmZmVyLmdldENoYW5u
ZWxEYXRhKDApOworCisgICAgICAgICAgY29tcGFyZVNpZ25hbHMoImV4cG9uZW50aWFsUmFtcFRv
VmFsdWVBdFRpbWUiLCBtYXhBbGxvd2VkRXJyb3IsIHJlbmRlcmVkRGF0YSwgZXhwb25lbnRpYWxS
YW1wU2lnbmFsLCB0aW1lR2FpbkluZm8sIGdhaW5TdGVwIC8gMik7CisKKyAgICAgICAgICBmaW5p
c2hKU1Rlc3QoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZnVuY3Rpb24gcnVuVGVzdCgpIHsK
KyAgICAgICAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAgICAgICAg
ICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKyAgICAgICAgICAgICAgbGF5
b3V0VGVzdENvbnRyb2xsZXIud2FpdFVudGlsRG9uZSgpOworICAgICAgICAgIH0KKworICAgICAg
ICAgIHdpbmRvdy5qc1Rlc3RJc0FzeW5jID0gdHJ1ZTsKKworICAgICAgICAgIC8vIENyZWF0ZSBv
ZmZsaW5lIGF1ZGlvIGNvbnRleHQuCisgICAgICAgICAgY29udGV4dCA9IG5ldyB3ZWJraXRBdWRp
b0NvbnRleHQoMiwgcmVuZGVyTGVuZ3RoLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICBzcXVhcmVC
dWZmZXIgPSBjcmVhdGVTcXVhcmVCdWZmZXIoY29udGV4dCwgcmVuZGVyTGVuZ3RoLCBzYW1wbGVS
YXRlKTsKKworICAgICAgICAgIHZhciBnYWluTm9kZSA9IGNvbnRleHQuY3JlYXRlR2Fpbk5vZGUo
KTsKKworICAgICAgICAgIGJ1ZmZlclNvdXJjZSA9IGNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNl
KCk7CisgICAgICAgICAgYnVmZmVyU291cmNlLmJ1ZmZlciA9IHNxdWFyZUJ1ZmZlcjsKKyAgICAg
ICAgICBidWZmZXJTb3VyY2UuY29ubmVjdChnYWluTm9kZSk7CisgICAgICAgICAgZ2Fpbk5vZGUu
Y29ubmVjdChjb250ZXh0LmRlc3RpbmF0aW9uKTsKKworICAgICAgICAgIC8vIEF0IGVhY2ggdGlt
ZSBpbnRlcnZhbCwgd2UgZGVjcmVhc2UgdGhlIGdhaW4gYnkKKyAgICAgICAgICAvLyAyKmdhaW5T
dGVwLiAgSG93ZXZlciwgdGhlIGV4cG9uZW50aWFsIHJhbXAgdGFyZ2V0IGdhaW4gaXMKKyAgICAg
ICAgICAvLyB0aGUgZ2FpbiArLy0gZ2FpblN0ZXAuICAoV2UgYWx0ZXJuYXRlbHkgc3BlY2lmeSB0
aGUKKyAgICAgICAgICAvLyB0YXJnZXQgdG8gYmUgZ3JlYXRlciBvciBzbWFsbGVyIHRoYW4gdGhl
IHN0YXJ0aW5nIGdhaW4sCisgICAgICAgICAgLy8gdG8gdGVzdCB0aGUgcmFtcCBnb2luZyB1cCBh
bmQgZG93bi4pCisgICAgICAgICAgLy8KKyAgICAgICAgICAvLyBCeSBkb2luZyBpdCB0aGlzIHdh
eSwgd2UgZ2V0IGEgZGlzY29udGludWl0eSBhdCBlYWNoIHRpbWUKKyAgICAgICAgICAvLyBpbnRl
cnZhbCB3aGljaCB3ZSBjYW4gdXNlIHRvIHRlc3QgaWYgdGhlIHJhbXAgc3RhcnRlZCBhbmQKKyAg
ICAgICAgICAvLyBlbmRlZCBhdCB0aGUgY29ycmVjdCB0aW1lLgorICAgICAgICAgIHRpbWVHYWlu
SW5mbyA9IGRvQXV0b21hdGlvbihzdGFydGluZ0dhaW4sCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybiAtMiAqIGdhaW5TdGVwOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBmdW5jdGlvbihrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpZiAoayAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gLWdhaW5TdGVwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gZ2FpblN0ZXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0s
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGcsIHRpbWUp
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5Ob2RlLmdh
aW4uc2V0VmFsdWVBdFRpbWUoZywgdGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0
aW9uKGcsIHN0YXJ0VGltZSwgZW5kVGltZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZ2Fpbk5vZGUuZ2Fpbi5leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1l
KGcsIGVuZFRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwor
CisgICAgICAgICAgYnVmZmVyU291cmNlLm5vdGVPbigwKTsKKyAgICAgIAorICAgICAgICAgIGNv
bnRleHQub25jb21wbGV0ZSA9IGNoZWNrUmVzdWx0OworICAgICAgICAgIGNvbnRleHQuc3RhcnRS
ZW5kZXJpbmcoKTsKKyAgICAgIH0KKworICAgICAgcnVuVGVzdCgpOworICAgICAgc3VjY2Vzc2Z1
bGx5UGFyc2VkID0gdHJ1ZTsKKyAgICAgIAorICAgIDwvc2NyaXB0PgorCisgICAgPHNjcmlwdCBz
cmM9Ii4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+CisgIDwv
Ym9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL3dlYmF1ZGlvL3Jlc291cmNl
cy9hdWRpb3BhcmFtLXRlc3RpbmcuanMgYi9MYXlvdXRUZXN0cy93ZWJhdWRpby9yZXNvdXJjZXMv
YXVkaW9wYXJhbS10ZXN0aW5nLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjdlNDJjNDA2YWVjZjM3MjY1NTJiNTNi
OWUwZjEwNmFhMjY4ZDUyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy93ZWJhdWRp
by9yZXNvdXJjZXMvYXVkaW9wYXJhbS10ZXN0aW5nLmpzCkBAIC0wLDAgKzEsMTg0IEBACit2YXIg
c2FtcGxlUmF0ZSA9IDQ0MTAwOworCisvLyBOdW1iZXIgb2YgZ2FpbiB0ZXN0cyB0byBydW4uCit2
YXIgbnVtYmVyT2ZUZXN0cyA9IDEwMDsKKworLy8gVGltZSBpbnRlcnZhbCBiZXR3ZWVuIGdhaW4g
Y2hhbmdlcy4gIEl0IGlzIGJlc3QgaWYgMSAvCisvLyBudW1iZXJPZlRlc3RzIGlzIG5vdCBjbG9z
ZSB0byB0aW1lSW50ZXJ2YWwuCit2YXIgdGltZUludGVydmFsID0gLjAzOworCisvLyBNYWtlIHN1
cmUgd2UgcmVuZGVyIGxvbmcgZW5vdWdoIHRvIGNhcHR1cmUgYWxsIG9mIG91ciB0ZXN0IGRhdGEu
Cit2YXIgcmVuZGVyVGltZSA9IChudW1iZXJPZlRlc3RzICsgMSkgKiB0aW1lSW50ZXJ2YWw7Cit2
YXIgcmVuZGVyTGVuZ3RoID0gdGltZVRvU2FtcGxlRnJhbWUocmVuZGVyVGltZSwgc2FtcGxlUmF0
ZSk7CisKK3ZhciBjb250ZXh0OworCisvLyBDcmVhdGUgYSBidWZmZXIgb2YgYWxsIG9uZXMuCitm
dW5jdGlvbiBjcmVhdGVTcXVhcmVCdWZmZXIoY29udGV4dCwgbGVuZ3RoKSB7CisgICAgdmFyIGJ1
ZmZlciA9IGNvbnRleHQuY3JlYXRlQnVmZmVyKDEsIGxlbmd0aCwgY29udGV4dC5zYW1wbGVSYXRl
KTsKKyAgICB2YXIgbiA9IGJ1ZmZlci5sZW5ndGg7CisgICAgdmFyIGRhdGEgPSBidWZmZXIuZ2V0
Q2hhbm5lbERhdGEoMCk7CisKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IG47ICsraykgeworICAg
ICAgICBkYXRhW2tdID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmZmVyOworfQorCisvLyBD
cmVhdGUgYSBleHBvbmVudGlhbCByYW1wIHN0YXJ0aW5nIGF0IHxzdGFydFZhbHVlfCBhbmQgZW5k
aW5nIGF0CisvLyB8ZW5kVmFsdWV8LiAgVGhlIHJhbXAgc3RhcnRzIGF0IHRpbWUgfHN0YXJ0VGlt
ZXwgYW5kIGVuZHMgYXQKKy8vIHxlbmRUaW1lfC4gIChUaGUgc3RhcnQgYW5kIGVuZCB0aW1lcyBh
cmUgb25seSB1c2VkIHRvIGNvbXB1dGUgaG93CisvLyBtYW55IHNhbXBsZXMgdG8gcmV0dXJuLikK
K2Z1bmN0aW9uIGV4cG9uZW50aWFsUmFtcFNpZ25hbChzdGFydFRpbWUsIGVuZFRpbWUsIHN0YXJ0
VmFsdWUsIGVuZFZhbHVlLCBzYW1wbGVSYXRlKQoreworICAgIHZhciBzdGFydEZyYW1lID0gdGlt
ZVRvU2FtcGxlRnJhbWUoc3RhcnRUaW1lLCBzYW1wbGVSYXRlKTsKKyAgICB2YXIgZW5kRnJhbWUg
PSB0aW1lVG9TYW1wbGVGcmFtZShlbmRUaW1lLCBzYW1wbGVSYXRlKTsKKyAgICB2YXIgbGVuZ3Ro
ID0gZW5kRnJhbWUgLSBzdGFydEZyYW1lOworICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobGVu
Z3RoKTsKKworICAgIHZhciBtdWx0aXBsaWVyID0gTWF0aC5wb3coZW5kVmFsdWUgLyBzdGFydFZh
bHVlLCAxIC8gbGVuZ3RoKTsKKyAgICAKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IGxlbmd0aDsg
KytrKSB7CisgICAgICAgIGJ1ZmZlcltrXSA9IHN0YXJ0VmFsdWUgKiBNYXRoLnBvdyhtdWx0aXBs
aWVyLCBrKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmZmVyOworfQorCisvLyBDb21wYXJlIGEg
c2VjdGlvbiBvZiB0aGUgcmVuZGVyZWQgZGF0YSBhZ2FpbnN0IG91ciBleHBlY3RlZCBzaWduYWwu
CitmdW5jdGlvbiBjb21wYXJlUGFydGlhbFNpZ25hbHMocmVuZGVyZWQsIGV4cGVjdGVkRnVuY3Rp
b24sIHN0YXJ0VGltZSwgZW5kVGltZSwgZ2FpbkluZm8sIHNhbXBsZVJhdGUpIHsKKyAgICB2YXIg
c3RhcnRTYW1wbGUgPSB0aW1lVG9TYW1wbGVGcmFtZShzdGFydFRpbWUsIHNhbXBsZVJhdGUpOwor
ICAgIHZhciBleHBlY3RlZCA9IGV4cGVjdGVkRnVuY3Rpb24oc3RhcnRUaW1lLCBlbmRUaW1lLCBn
YWluSW5mby5nYWluU3RhcnQsIGdhaW5JbmZvLmdhaW5UYXJnZXQsIHNhbXBsZVJhdGUpOworCisg
ICAgdmFyIG4gPSBleHBlY3RlZC5sZW5ndGg7CisgICAgdmFyIG1heEVycm9yID0gLTE7CisgICAg
dmFyIG1heEVycm9ySW5kZXggPSAtMTsKKyAgICAKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IG47
ICsraykgeworICAgICAgICB2YXIgZXJyb3IgPSBNYXRoLmFicyhyZW5kZXJlZFtzdGFydFNhbXBs
ZSArIGtdIC0gZXhwZWN0ZWRba10pOworICAgICAgICBpZiAoZXJyb3IgPiBtYXhFcnJvcikgewor
ICAgICAgICAgICAgbWF4RXJyb3IgPSBlcnJvcjsKKyAgICAgICAgICAgIG1heEVycm9ySW5kZXgg
PSBrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHsgbWF4RXJyb3IgOiBtYXhFcnJv
ciwgaW5kZXggOiBtYXhFcnJvckluZGV4IH07Cit9CisKKy8vIEZpbmQgdGhlIGRpc2NvbnRpbnVp
dGllcyBpbiB0aGUgZGF0YSBhbmQgY29tcGFyZSB0aGUgbG9jYXRpb24gb2YKKy8vIHRoZSBkaXNj
b250aW51aXR5IHdpdGggb3VyIGV4cGVjdGVkIHN0YXJ0IG9mIHRoZSB0aW1lCisvLyBpbnRlcnZh
bC4gVGhlcmUgaXMgYSBkaXNjb250aW51aXR5IGlmIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKy8v
IHN1Y2Nlc3NpdmUgc2FtcGxlcyBleGNlZWRzIHRoZSB0aHJlc2hvbGQuCitmdW5jdGlvbiB2ZXJp
ZnlEaXNjb250aW51aXRpZXMoZGF0YSwgc3RhcnRUaW1lLCB0aHJlc2hvbGQpIHsKKyAgICB2YXIg
biA9IGRhdGEubGVuZ3RoOworICAgIHZhciBzdWNjZXNzID0gdHJ1ZTsKKyAgICB2YXIgYmFkTG9j
YXRpb25zID0gMDsKKyAgICB2YXIgYnJlYWtzID0gW107CisKKyAgICAvLyBGaW5kIGRpc2NvbnRp
bnVpdGllcy4KKyAgICBmb3IgKHZhciBrID0gMTsgayA8IG47ICsraykgeworICAgICAgICBpZiAo
TWF0aC5hYnMoZGF0YVtrXSAtIGRhdGFbayAtIDFdKSA+IHRocmVzaG9sZCkgeworICAgICAgICAg
ICAgYnJlYWtzLnB1c2goayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb21wYXJlIHRo
ZSBsb2NhdGlvbiBvZiBlYWNoIGRpc2NvbnRpbnVpdHkgd2l0aCB0aGUgZW5kIHRpbWUgb2YKKyAg
ICAvLyBlYWNoIGludGVydmFsLiAoVGhlcmUgaXMgbm8gZGlzY29udGludWl0eSBhdCB0aGUgc3Rh
cnQgb2YgdGhlCisgICAgLy8gc2lnbmFsLikKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IGJyZWFr
cy5sZW5ndGg7ICsraykgeworICAgICAgICB2YXIgZXhwZWN0ZWQgPSB0aW1lVG9TYW1wbGVGcmFt
ZShzdGFydFRpbWVbayArIDFdLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgaWYgKGJyZWFrc1trXSAh
PSBleHBlY3RlZCkgeworICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAg
KytiYWRMb2NhdGlvbnM7CisgICAgICAgICAgICB0ZXN0RmFpbGVkKCJFeHBlY3RlZCBkaXNjb250
aW51aXR5IGF0ICIgKyBleHBlY3RlZCArICIgYnV0IGdvdCAiICsgYnJlYWtzW2tdKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIGlmIChiYWRMb2NhdGlvbnMpIHsKKyAgICAgICAgdGVzdEZhaWxl
ZChiYWRMb2NhdGlvbnMgKyAiIGRpc2NvbnRpbnVpdGllcyBhdCBpbmNvcnJlY3QgbG9jYXRpb25z
Iik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVzdFBhc3NlZCgiQWxsICIgKyAoYnJlYWtzLmxl
bmd0aCArIDEpICsgIiB0ZXN0cyBzdGFydGVkIGFuZCBlbmRlZCBhdCB0aGUgY29ycmVjdCB0aW1l
LiIpOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworZnVuY3Rpb24gY29t
cGFyZVNpZ25hbHModGVzdE5hbWUsIG1heEVycm9yLCByZW5kZXJlZERhdGEsIGV4cGVjdGVkRnVu
Y3Rpb24sIHRpbWVHYWluSW5mbywgYnJlYWtUaHJlc2hvbGQpIHsKKyAgICB2YXIgc3VjY2VzcyA9
IHRydWU7CisgICAgdmFyIGZhaWxlZFRlc3RDb3VudCA9IDA7CisgICAgdmFyIHN0YXJ0VGltZSA9
IHRpbWVHYWluSW5mby5zdGFydFRpbWU7CisgICAgdmFyIGdhaW5zID0gdGltZUdhaW5JbmZvLmdh
aW5WYWx1ZTsKKyAgICB2YXIgbiA9IGdhaW5zLmxlbmd0aDsKKworICAgIHN1Y2Nlc3MgPSB2ZXJp
ZnlEaXNjb250aW51aXRpZXMocmVuZGVyZWREYXRhLCBzdGFydFRpbWUsIGJyZWFrVGhyZXNob2xk
KTsKKworICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbjsgKytrKSB7CisgICAgICAgIHZhciByZXN1
bHQgPSBjb21wYXJlUGFydGlhbFNpZ25hbHMocmVuZGVyZWREYXRhLCBleHBlY3RlZEZ1bmN0aW9u
LCBzdGFydFRpbWVba10sIHN0YXJ0VGltZVtrICsgMV0sIGdhaW5zW2tdLCBzYW1wbGVSYXRlKTsK
KworICAgICAgICBpZiAocmVzdWx0Lm1heEVycm9yID4gbWF4RXJyb3IpIHsKKyAgICAgICAgICAg
IHRlc3RGYWlsZWQoIkluY29ycmVjdCBnYWluIGZvciB0ZXN0ICIgKyBrICsgIi4gTWF4IGVycm9y
ID0gIiArIHJlc3VsdC5tYXhFcnJvciArICIgYXQgb2Zmc2V0ICIgKyAocmVzdWx0LmluZGV4ICsg
dGltZVRvU2FtcGxlRnJhbWUoc3RhcnRUaW1lW2tdLCBzYW1wbGVSYXRlKSkpOworICAgICAgICAg
ICAgKytmYWlsZWRUZXN0Q291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZmFpbGVk
VGVzdENvdW50KSB7CisgICAgICAgIHRlc3RGYWlsZWQoZmFpbGVkVGVzdENvdW50ICsgIiB0ZXN0
cyBmYWlsZWQgb3V0IG9mICIgKyBuKTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgIH0g
ZWxzZSB7CisgICAgICAgIHRlc3RQYXNzZWQoIkFsbCAiICsgbiArICIgdGVzdHMgcGFzc2VkIHdp
dGggYWJzb2x1dGUgZXJyb3IgYmVsb3cgIiArIG1heEVycm9yKTsKKyAgICB9CisgICAgICAKKyAg
ICBpZiAoc3VjY2VzcykgeworICAgICAgICB0ZXN0UGFzc2VkKCJBdWRpb1BhcmFtICIgKyB0ZXN0
TmFtZSArICIgdGVzdCBwYXNzZWQuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVzdEZhaWxl
ZCgiQXVkaW9QYXJhbSAiICsgdGVzdE5hbWUgKyAiIHRlc3QgZmFpbGVkLiIpOworICAgIH0KK30K
KworLy8gUnVuIGFsbCB0aGUgYXV0b21hdGlvbiB0ZXN0cy4KKy8vCisvLyBnYWluVXBkYXRlIC0g
SG93IG11Y2ggdG8gY2hhbmdlIHRoZSBnYWluIGF0IGJlZ2lubmluZyBvZiBlYWNoIHRpbWUKKy8v
IGludGVydmFsLgorLy8KKy8vIGdhaW5UYXJnZXRTdGVwIC0gSG93IG11Y2ggdGhlIHRhcmdldCBn
YWluIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUKKy8vIGdhaW4gYXQgdGhlIHN0YXJ0IG9mIHRoZSBp
bnRlcnZhbC4KKy8vCisvLyBzZXRWYWx1ZUZ1bmN0aW9uIC0gZnVuY3Rpb24gdGhhdCBzZXRzIHRo
ZSBzcGVjaWZpZWQgZ2FpbiBhdCB0aGUKKy8vIHN0YXJ0IG9mIGEgdGltZSBpbnRlcnZhbC4KKy8v
CisvLyBhdXRvbWF0aW9uRnVuY3Rpb24gLSBmdW5jdGlvbiB0aGF0IHNldHMgdGhlIHRhcmdldCBn
YWluIHZhbHVlIGZvcgorLy8gdGhlIHRpbWUgaW50ZXJ2YWwuICBJdCBzcGVjaWZpZXMgaG93IHRo
ZSBnYWluIGFwcHJvYWNoZXMgdGhlCisvLyB0YXJnZXQuCisvLworLy8gQW4gb2JqZWN0IGlzIHJl
dHVybmVkIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2Ygc3RhcnQgdGltZXMgZm9yIGVhY2gKKy8vIHRp
bWUgaW50ZXJ2YWwsIGFuZCBhbiBhcnJheSBnaXZpbmcgdGhlIHN0YXJ0IGFuZCB0YXJnZXQgZ2Fp
bnMgZm9yCisvLyB0aGUgaW50ZXJ2YWwuCitmdW5jdGlvbiBkb0F1dG9tYXRpb24oc3RhcnRpbmdH
YWluLCBnYWluVXBkYXRlLCBnYWluVGFyZ2V0U3RlcCwgc2V0VmFsdWVGdW5jdGlvbiwgYXV0b21h
dGlvbkZ1bmN0aW9uKQoreworICAgIHZhciBzdGFydFRpbWVJbmZvID0gWzBdOworICAgIHZhciBn
YWluVmFsdWVJbmZvID0gW107CisgICAgdmFyIGdhaW4gPSBzdGFydGluZ0dhaW47CisgICAgCisg
ICAgZm9yICh2YXIgayA9IDA7IGsgPCBudW1iZXJPZlRlc3RzOyArK2spIHsKKyAgICAgICAgdmFy
IHRpbWVTdGFydCA9IGsgKiB0aW1lSW50ZXJ2YWw7CisgICAgICAgIHZhciB0aW1lRW5kID0gKGsg
KyAxKSAqIHRpbWVJbnRlcnZhbDsKKyAgICAgICAgdmFyIGdhaW5UYXJnZXQgPSBnYWluICsgZ2Fp
blRhcmdldFN0ZXAoayk7CisKKyAgICAgICAgLy8gU2V0IHRoZSBnYWluIGF0IHRoZSBzdGFydCBv
ZiB0aGUgdGltZSBpbnRlcnZhbC4KKyAgICAgICAgc2V0VmFsdWVGdW5jdGlvbihnYWluLCB0aW1l
U3RhcnQpOworCisgICAgICAgIC8vIFNwZWNpZnkgdGhlIHRhcmdldCBnYWluLCBhbmQgaG93IHdl
IHNob3VsZCBhcHByb2FjaCB0aGUKKyAgICAgICAgLy8gdGFyZ2V0IGdhaW4uCisgICAgICAgIGF1
dG9tYXRpb25GdW5jdGlvbihnYWluVGFyZ2V0LCB0aW1lU3RhcnQsIHRpbWVFbmQpOworCisgICAg
ICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIHN0YXJ0IHRpbWVzLCBhbmQgdGhlIHN0YXJ0IGFuZCB0
YXJnZXQKKyAgICAgICAgLy8gZ2FpbnMgZm9yIGVhY2ggdGltZSBpbnRlcnZhbC4KKyAgICAgICAg
c3RhcnRUaW1lSW5mby5wdXNoKHRpbWVFbmQpOworICAgICAgICBnYWluVmFsdWVJbmZvLnB1c2go
eyBnYWluU3RhcnQ6IGdhaW4sIGdhaW5UYXJnZXQgOiBnYWluVGFyZ2V0fSk7CisKKyAgICAgICAg
Z2FpbiArPSBnYWluVXBkYXRlKGspOworICAgIH0KKworICAgIHJldHVybiB7IHN0YXJ0VGltZSA6
IHN0YXJ0VGltZUluZm8sIGdhaW5WYWx1ZSA6IGdhaW5WYWx1ZUluZm8gfTsKK30K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126536</attachid>
            <date>2012-02-10 10:47:42 -0800</date>
            <delta_ts>2012-02-22 09:05:55 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78035-20120210104741.patch</filename>
            <type>text/plain</type>
            <size>15989</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3Mzg2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMmFhYTc0NjUyNmI0M2Y5
NWQ3YmMxMWE0ZWM2MGM0NmM3ODc2OTE5Ny4uMjE5YmJhOTdiNDk4ZmZiM2NlNjA2NGMyNTc2Mjc3
OTYxNzM4OGQwNSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE2IEBACisyMDEyLTAyLTA4ICBSYXlt
b25kIFRveSAgPHJ0b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBleHBvbmVudGlhbFJhbXBUb1Zh
bHVlIGRvZXNuJ3QgdXNlIHN0YXJ0aW5nIHZhbHVlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD03ODAzNQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIFRlc3Q6IHdlYmF1ZGlvL2F1ZGlvcGFyYW0tZXhwb25lbnRp
YWwuaHRtbAorCisgICAgICAgICogd2ViYXVkaW8vQXVkaW9QYXJhbVRpbWVsaW5lLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFyYW1UaW1lbGluZTo6dmFsdWVzRm9yVGltZVJhbmdlSW1w
bCk6IFNldAorICAgICAgICBzdGFydGluZyB2YWx1ZSBmb3IgZXhwb25lbnRpYWwgcmFtcC4KKwog
MjAxMi0wMi0xMCAgVnNldm9sb2QgVmxhc292ICA8dnNldmlrQGNocm9taXVtLm9yZz4KIAogICAg
ICAgICBXZWIgSW5zcGVjdG9yOiBGaWxlU2VsZWN0b3Igc2hvdWxkIG5vdCBkZXBlbmQgb24gRGVi
dWdnZXJQcmVzZW50YXRpb25Nb2RlbC4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3dlYmF1
ZGlvL0F1ZGlvUGFyYW1UaW1lbGluZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS93ZWJhdWRpby9BdWRp
b1BhcmFtVGltZWxpbmUuY3BwCmluZGV4IGVmZjFlYTc5YjAxMGM5Y2QwYjQzZmU1MjI4Zjg3NjAy
ZTFhYTdiMDEuLmQ0YzJiNWQxYzA0NDNmZmE0NWNjOGE5ODZkMGI2ZjcwMWFjMzg4MzMgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvUGFyYW1UaW1lbGluZS5jcHAKKysr
IGIvU291cmNlL1dlYkNvcmUvd2ViYXVkaW8vQXVkaW9QYXJhbVRpbWVsaW5lLmNwcApAQCAtMjQy
LDYgKzI0MiwxMyBAQCBmbG9hdCBBdWRpb1BhcmFtVGltZWxpbmU6OnZhbHVlc0ZvclRpbWVSYW5n
ZUltcGwoZmxvYXQgc3RhcnRUaW1lLAogICAgICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBnb2Vz
IGV4cG9uZW50aWFsbHkgZnJvbSB2YWx1ZTEgdG8gdmFsdWUyIGluIGEgZHVyYXRpb24gb2YgZGVs
dGFUaW1lIHNlY29uZHMgKGNvcnJlc3BvbmRpbmcgdG8gbnVtU2FtcGxlRnJhbWVzKS4KICAgICAg
ICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBwZXItc2FtcGxlIG11bHRpcGxpZXIuCiAgICAgICAg
ICAgICAgICAgZmxvYXQgbXVsdGlwbGllciA9IHBvd2YodmFsdWUyIC8gdmFsdWUxLCAxIC8gbnVt
U2FtcGxlRnJhbWVzKTsKKworICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgc3RhcnRpbmcgdmFs
dWUgb2YgdGhlIGV4cG9uZW50aWFsLiBUaGlzIGlzIHRoZSBzYW1lIGFzIG11bHRpcGxpZXIgXgor
ICAgICAgICAgICAgICAgIC8vIEF1ZGlvVXRpbGl0aWVzOjp0aW1lVG9TYW1wbGVGcmFtZShjdXJy
ZW50VGltZSAtIHRpbWUxLCBzYW1wbGVSYXRlKSwgYnV0IGFwcGVhcnMKKyAgICAgICAgICAgICAg
ICAvLyB0byBiZSBtb3JlIGFjY3VyYXRlLCBlc3BlY2lhbGx5IGlmIG11bHRpcGxpZXIgaXMgY2xv
c2UgdG8gMS4KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlMSAqIHBvd2YodmFsdWUyIC8g
dmFsdWUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1V0aWxp
dGllczo6dGltZVRvU2FtcGxlRnJhbWUoY3VycmVudFRpbWUgLSB0aW1lMSwgc2FtcGxlUmF0ZSkg
LyBudW1TYW1wbGVGcmFtZXMpOworCiAgICAgICAgICAgICAgICAgZm9yICg7IHdyaXRlSW5kZXgg
PCBmaWxsVG9GcmFtZTsgKyt3cml0ZUluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgIHZhbHVl
c1t3cml0ZUluZGV4XSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICB2YWx1ZSAqPSBtdWx0
aXBsaWVyOwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nIGIvTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nCmluZGV4IDM0MWY4ZWUxYzJmODVlZGRkYmNhMmRjOWRkNjVhZjU5NTViMDU2MjIu
Ljg4MDg0ZTI3Mjc5YWFlMzAwYmMyNjcwMmZmNTk1YWY2ZDQzNWZkYzkgMTAwNjQ0Ci0tLSBhL0xh
eW91dFRlc3RzL0NoYW5nZUxvZworKysgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKQEAgLTEsMyAr
MSwyMCBAQAorMjAxMi0wMi0wOCAgUmF5bW9uZCBUb3kgIDxydG95QGdvb2dsZS5jb20+CisKKyAg
ICAgICAgZXhwb25lbnRpYWxSYW1wVG9WYWx1ZSBkb2Vzbid0IHVzZSBzdGFydGluZyB2YWx1ZQor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgwMzUKKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIHdlYmF1ZGlv
L2F1ZGlvcGFyYW0tZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZS1leHBlY3RlZC50eHQ6IEFk
ZGVkLgorICAgICAgICAqIHdlYmF1ZGlvL2F1ZGlvcGFyYW0tZXhwb25lbnRpYWxSYW1wVG9WYWx1
ZUF0VGltZS5odG1sOiBBZGRlZC4KKyAgICAgICAgKiB3ZWJhdWRpby9yZXNvdXJjZXMvYXVkaW9w
YXJhbS10ZXN0aW5nLmpzOiBBZGRlZC4KKyAgICAgICAgKGNyZWF0ZUNvbnN0YW50QnVmZmVyKToK
KyAgICAgICAgKGNyZWF0ZUV4cG9uZW50aWFsUmFtcEFycmF5KToKKyAgICAgICAgKGNvbXBhcmVQ
YXJ0aWFsU2lnbmFscyk6CisgICAgICAgICh2ZXJpZnlEaXNjb250aW51aXRpZXMpOgorICAgICAg
ICAoY29tcGFyZVNpZ25hbHMpOgorICAgICAgICAoZG9BdXRvbWF0aW9uKToKKwogMjAxMi0wMi0x
MCAgQW5kcmV5IEtvc3lha292ICA8Y2FzZXFAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFVucmV2
aWV3ZWQgdGVzdCBmaXggZm9sbG93aW5nIHIxMDczNzMuCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0
cy93ZWJhdWRpby9hdWRpb3BhcmFtLWV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUtZXhwZWN0
ZWQudHh0IGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vYXVkaW9wYXJhbS1leHBvbmVudGlhbFJhbXBU
b1ZhbHVlQXRUaW1lLWV4cGVjdGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40NzY2MTdlY2JjZDg0ZDQ2NDli
OGE1YzE5ZmRhNzgwN2QwYjlkOGFhCi0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvd2Vi
YXVkaW8vYXVkaW9wYXJhbS1leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lLWV4cGVjdGVkLnR4
dApAQCAtMCwwICsxLDExIEBACitUZXN0IEF1ZGlvUGFyYW0gZXhwb25lbnRpYWxSYW1wVG9WYWx1
ZUF0VGltZSgpIGZ1bmN0aW9uYWxpdHkuCisKK09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNl
cmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKwor
UEFTUyBBbGwgMTAwIHRlc3RzIHN0YXJ0ZWQgYW5kIGVuZGVkIGF0IHRoZSBjb3JyZWN0IHRpbWUu
CitQQVNTIEFsbCAxMDAgdGVzdHMgcGFzc2VkIHdpdGggYWJzb2x1dGUgZXJyb3IgYmVsb3cgMC4w
MDA2NzUKK1BBU1MgQXVkaW9QYXJhbSBleHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKCkgdGVz
dCBwYXNzZWQuCitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCisKK1RFU1QgQ09NUExF
VEUKKwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvd2ViYXVkaW8vYXVkaW9wYXJhbS1leHBvbmVu
dGlhbFJhbXBUb1ZhbHVlQXRUaW1lLmh0bWwgYi9MYXlvdXRUZXN0cy93ZWJhdWRpby9hdWRpb3Bh
cmFtLWV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44NDZiMWVk
NDZlNjAwM2Y2MDIzY2MxN2RhNmY5MGJkMmI4NTVhZWMwCi0tLSAvZGV2L251bGwKKysrIGIvTGF5
b3V0VGVzdHMvd2ViYXVkaW8vYXVkaW9wYXJhbS1leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1l
Lmh0bWwKQEAgLTAsMCArMSwxMDYgQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9E
VEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+CisgIDxoZWFkPgorICAgIDxz
Y3JpcHQgc3JjPSJyZXNvdXJjZXMvYXVkaW8tdGVzdGluZy5qcyI+PC9zY3JpcHQ+CisgICAgPHNj
cmlwdCBzcmM9InJlc291cmNlcy9hdWRpb3BhcmFtLXRlc3RpbmcuanMiPjwvc2NyaXB0PgorICAg
IDxzY3JpcHQgc3JjPSIuLi9mYXN0L2pzL3Jlc291cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3Jp
cHQ+CisgIDwvaGVhZD4KKworICA8Ym9keT4KKyAgICA8ZGl2IGlkPSJkZXNjcmlwdGlvbiI+PC9k
aXY+CisgICAgPGRpdiBpZD0iY29uc29sZSI+PC9kaXY+CisKKyAgICA8c2NyaXB0PgorICAgICAg
ZGVzY3JpcHRpb24oIlRlc3QgQXVkaW9QYXJhbSBleHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1l
KCkgZnVuY3Rpb25hbGl0eS4iKTsKKworICAgICAgLy8gUGxheSBhIGxvbmcgREMgc2lnbmFsIG91
dCB0aHJvdWdoIGFuIEF1ZGlvR2Fpbk5vZGUsIGFuZCBjYWxsIHNldFZhbHVlQXRUaW1lKCkgYW5k
CisgICAgICAvLyBleHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKCkgYXQgcmVndWxhciBpbnRl
cnZhbHMgdG8gc2V0IHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIHZhbHVlcworICAgICAgLy8gZm9y
IGFuIGV4cG9uZW50aWFsIHJhbXAuICBFYWNoIHRpbWUgaW50ZXJ2YWwgaGFzIGEgcmFtcCB3aXRo
IGEgZGlmZmVyZW50IHN0YXJ0aW5nIGFuZAorICAgICAgLy8gZW5kaW5nIHZhbHVlIHNvIHRoYXQg
dGhlcmUgaXMgYSBkaXNjb250aW51aXR5IGF0IGVhY2ggdGltZSBpbnRlcnZhbCBib3VuZGFyeS4g
IFRoZQorICAgICAgLy8gZGlzY29udGludWl0eSBpcyBmb3IgdGVzdGluZyB0aW1pbmcuICBBbHNv
LCB3ZSBhbHRlcm5hdGUgYmV0d2VlbiBhbiBpbmNyZWFzaW5nIGFuZAorICAgICAgLy8gZGVjcmVh
c2luZyByYW1wIGZvciBlYWNoIGludGVydmFsLgorCisgICAgICAvLyBNYXggYWxsb3dlZCBkaWZm
ZXJlbmNlIGJldHdlZW4gdGhlIHJlbmRlcmVkIGRhdGEgYW5kIHRoZSBleHBlY3RlZCByZXN1bHQu
CisgICAgICB2YXIgbWF4QWxsb3dlZEVycm9yID0gNi43NWUtNDsKKworICAgICAgLy8gSW5mb3Jt
YXRpb24gYWJvdXQgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgdGltZXMgYW5kIHN0YXJ0aW5nIGFu
ZCBlbmRpbmcgdmFsdWVzIGZvciBlYWNoCisgICAgICAvLyB0aW1lIGludGVydmFsLgorICAgICAg
dmFyIHRpbWVHYWluSW5mbzsKKworICAgICAgLy8gVGhlIEF1ZGlvR2Fpbk5vZGUgc3RhcnRzIHdp
dGggdGhpcyB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAgdmFyIHN0
YXJ0aW5nVmFsdWUgPSAxMDA7CisKKyAgICAgIC8vIEVhY2ggZXhwb25lbnRpYWwgcmFtcCB3aWxs
IGluY3JlYXNlIG9yIGRlY3JlYXNlIGJ5IHRoaXMgbXVjaCBmcm9tIHRoZSBzdGFydCB0byB0aGUg
ZW5kIG9mCisgICAgICAvLyB0aGUgdGltZSBpbnRlcnZhbC4KKyAgICAgIHZhciBzdGFydEVuZFZh
bHVlQ2hhbmdlID0gc3RhcnRpbmdWYWx1ZSAvICgyICogbnVtYmVyT2ZUZXN0cyk7CisKKyAgICAg
IHZhciBjb25zdGFudEJ1ZmZlcjsKKyAgICAgIHZhciBidWZmZXJTb3VyY2U7CisKKyAgICAgIGZ1
bmN0aW9uIGNoZWNrUmVzdWx0KGV2ZW50KSB7CisgICAgICAgICAgdmFyIGJ1ZmZlciA9IGV2ZW50
LnJlbmRlcmVkQnVmZmVyOworICAgICAgICAgIHJlbmRlcmVkRGF0YSA9IGJ1ZmZlci5nZXRDaGFu
bmVsRGF0YSgwKTsKKworICAgICAgICAgIGNvbXBhcmVTaWduYWxzKCJleHBvbmVudGlhbFJhbXBU
b1ZhbHVlQXRUaW1lKCkiLCBtYXhBbGxvd2VkRXJyb3IsIHJlbmRlcmVkRGF0YSwgY3JlYXRlRXhw
b25lbnRpYWxSYW1wQXJyYXksIHRpbWVHYWluSW5mbywgc3RhcnRFbmRWYWx1ZUNoYW5nZSAvIDIp
OworCisgICAgICAgICAgZmluaXNoSlNUZXN0KCk7CisgICAgICB9CisgICAgICAKKyAgICAgIGZ1
bmN0aW9uIHJ1blRlc3QoKSB7CisgICAgICAgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJv
bGxlcikgeworICAgICAgICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7
CisgICAgICAgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKKyAg
ICAgICAgICB9CisKKyAgICAgICAgICB3aW5kb3cuanNUZXN0SXNBc3luYyA9IHRydWU7CisKKyAg
ICAgICAgICAvLyBDcmVhdGUgb2ZmbGluZSBhdWRpbyBjb250ZXh0LgorICAgICAgICAgIGNvbnRl
eHQgPSBuZXcgd2Via2l0QXVkaW9Db250ZXh0KDIsIHJlbmRlckxlbmd0aCwgc2FtcGxlUmF0ZSk7
CisgICAgICAgICAgY29uc3RhbnRCdWZmZXIgPSBjcmVhdGVDb25zdGFudEJ1ZmZlcihjb250ZXh0
LCAxLCByZW5kZXJMZW5ndGgpOworCisgICAgICAgICAgdmFyIGdhaW5Ob2RlID0gY29udGV4dC5j
cmVhdGVHYWluTm9kZSgpOworCisgICAgICAgICAgYnVmZmVyU291cmNlID0gY29udGV4dC5jcmVh
dGVCdWZmZXJTb3VyY2UoKTsKKyAgICAgICAgICBidWZmZXJTb3VyY2UuYnVmZmVyID0gY29uc3Rh
bnRCdWZmZXI7CisgICAgICAgICAgYnVmZmVyU291cmNlLmNvbm5lY3QoZ2Fpbk5vZGUpOworICAg
ICAgICAgIGdhaW5Ob2RlLmNvbm5lY3QoY29udGV4dC5kZXN0aW5hdGlvbik7CisKKyAgICAgICAg
ICAvLyBBdCBlYWNoIHRpbWUgaW50ZXJ2YWwsIHdlIGRlY3JlYXNlIHRoZSB2YWx1ZSBieSAyICog
c3RhcnRFbmRWYWx1ZUNoYW5nZS4gIEhvd2V2ZXIsIHRoZQorICAgICAgICAgIC8vIGV4cG9uZW50
aWFsIHJhbXAgZW5kIHZhbHVlIGlzIHRoZSB2YWx1ZSArLy0gc3RhcnRFbmRWYWx1ZUNoYW5nZS4g
IChXZSBhbHRlcm5hdGVseSBzcGVjaWZ5CisgICAgICAgICAgLy8gdGhlIGVuZCB2YWx1ZSB0byBi
ZSBncmVhdGVyIG9yIHNtYWxsZXIgdGhhbiB0aGUgc3RhcnRpbmcgdmFsdWUsIHRvIHRlc3QgdGhl
IHJhbXAgZ29pbmcKKyAgICAgICAgICAvLyB1cCBhbmQgZG93bi4pCisgICAgICAgICAgLy8KKyAg
ICAgICAgICAvLyBCeSBkb2luZyBpdCB0aGlzIHdheSwgd2UgZ2V0IGEgZGlzY29udGludWl0eSBh
dCBlYWNoIHRpbWUgaW50ZXJ2YWwgd2hpY2ggd2UgY2FuIHVzZSB0bworICAgICAgICAgIC8vIHRl
c3QgaWYgdGhlIHJhbXAgc3RhcnRlZCBhbmQgZW5kZWQgYXQgdGhlIGNvcnJlY3QgdGltZS4KKyAg
ICAgICAgICB0aW1lR2FpbkluZm8gPSBkb0F1dG9tYXRpb24oc3RhcnRpbmdWYWx1ZSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oaykgeworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0yICogc3RhcnRFbmRWYWx1
ZUNoYW5nZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oaykgeworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGsgJiAxKSB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1zdGFydEVuZFZhbHVl
Q2hhbmdlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g
c3RhcnRFbmRWYWx1ZUNoYW5nZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24odmFsdWUsIHRpbWUpIHsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5Ob2RlLmdhaW4u
c2V0VmFsdWVBdFRpbWUodmFsdWUsIHRpbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5j
dGlvbih2YWx1ZSwgc3RhcnRUaW1lLCBlbmRUaW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBnYWluTm9kZS5nYWluLmV4cG9uZW50aWFsUmFtcFRvVmFsdWVB
dFRpbWUodmFsdWUsIGVuZFRpbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIH0pOworCisgICAgICAgICAgYnVmZmVyU291cmNlLm5vdGVPbigwKTsKKyAgICAgIAorICAg
ICAgICAgIGNvbnRleHQub25jb21wbGV0ZSA9IGNoZWNrUmVzdWx0OworICAgICAgICAgIGNvbnRl
eHQuc3RhcnRSZW5kZXJpbmcoKTsKKyAgICAgIH0KKworICAgICAgcnVuVGVzdCgpOworICAgICAg
c3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1ZTsKKyAgICAgIAorICAgIDwvc2NyaXB0PgorCisgICAg
PHNjcmlwdCBzcmM9Ii4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3Jp
cHQ+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL3dlYmF1ZGlv
L3Jlc291cmNlcy9hdWRpb3BhcmFtLXRlc3RpbmcuanMgYi9MYXlvdXRUZXN0cy93ZWJhdWRpby9y
ZXNvdXJjZXMvYXVkaW9wYXJhbS10ZXN0aW5nLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjMxMzQ0Mzc4YTk3Njdj
OWIwMjcwOGJkMTU3ZDc2ODQzYjA1MjM0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0
cy93ZWJhdWRpby9yZXNvdXJjZXMvYXVkaW9wYXJhbS10ZXN0aW5nLmpzCkBAIC0wLDAgKzEsMTk0
IEBACit2YXIgc2FtcGxlUmF0ZSA9IDQ0MTAwOworCisvLyBOdW1iZXIgb2YgdGVzdHMgdG8gcnVu
LgordmFyIG51bWJlck9mVGVzdHMgPSAxMDA7CisKKy8vIFRpbWUgaW50ZXJ2YWwgYmV0d2VlbiB2
YWx1ZSBjaGFuZ2VzLiAgSXQgaXMgYmVzdCBpZiAxIC8gbnVtYmVyT2ZUZXN0cyBpcyBub3QgY2xv
c2UgdG8KKy8vIHRpbWVJbnRlcnZhbC4KK3ZhciB0aW1lSW50ZXJ2YWwgPSAuMDM7CisKKy8vIE1h
a2Ugc3VyZSB3ZSByZW5kZXIgbG9uZyBlbm91Z2ggdG8gY2FwdHVyZSBhbGwgb2Ygb3VyIHRlc3Qg
ZGF0YS4KK3ZhciByZW5kZXJUaW1lID0gKG51bWJlck9mVGVzdHMgKyAxKSAqIHRpbWVJbnRlcnZh
bDsKK3ZhciByZW5kZXJMZW5ndGggPSB0aW1lVG9TYW1wbGVGcmFtZShyZW5kZXJUaW1lLCBzYW1w
bGVSYXRlKTsKKwordmFyIGNvbnRleHQ7CisKKy8vIENyZWF0ZSBhIGJ1ZmZlciBjb250YWluaW5n
IHRoZSBzYW1lIGNvbnN0YW50IHZhbHVlLgorZnVuY3Rpb24gY3JlYXRlQ29uc3RhbnRCdWZmZXIo
Y29udGV4dCwgY29uc3RhbnQsIGxlbmd0aCkgeworICAgIHZhciBidWZmZXIgPSBjb250ZXh0LmNy
ZWF0ZUJ1ZmZlcigxLCBsZW5ndGgsIGNvbnRleHQuc2FtcGxlUmF0ZSk7CisgICAgdmFyIG4gPSBi
dWZmZXIubGVuZ3RoOworICAgIHZhciBkYXRhID0gYnVmZmVyLmdldENoYW5uZWxEYXRhKDApOwor
CisgICAgZm9yICh2YXIgayA9IDA7IGsgPCBuOyArK2spIHsKKyAgICAgICAgZGF0YVtrXSA9IGNv
bnN0YW50OworICAgIH0KKworICAgIHJldHVybiBidWZmZXI7Cit9CisKKy8vIENyZWF0ZSBhIGV4
cG9uZW50aWFsIHJhbXAgc3RhcnRpbmcgYXQgfHN0YXJ0VmFsdWV8IGFuZCBlbmRpbmcgYXQgfGVu
ZFZhbHVlfC4gIFRoZSByYW1wIHN0YXJ0cyBhdAorLy8gdGltZSB8c3RhcnRUaW1lfCBhbmQgZW5k
cyBhdCB8ZW5kVGltZXwuICAoVGhlIHN0YXJ0IGFuZCBlbmQgdGltZXMgYXJlIG9ubHkgdXNlZCB0
byBjb21wdXRlIGhvdworLy8gbWFueSBzYW1wbGVzIHRvIHJldHVybi4pCitmdW5jdGlvbiBjcmVh
dGVFeHBvbmVudGlhbFJhbXBBcnJheShzdGFydFRpbWUsIGVuZFRpbWUsIHN0YXJ0VmFsdWUsIGVu
ZFZhbHVlLCBzYW1wbGVSYXRlKQoreworICAgIHZhciBzdGFydEZyYW1lID0gdGltZVRvU2FtcGxl
RnJhbWUoc3RhcnRUaW1lLCBzYW1wbGVSYXRlKTsKKyAgICB2YXIgZW5kRnJhbWUgPSB0aW1lVG9T
YW1wbGVGcmFtZShlbmRUaW1lLCBzYW1wbGVSYXRlKTsKKyAgICB2YXIgbGVuZ3RoID0gZW5kRnJh
bWUgLSBzdGFydEZyYW1lOworICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXkobGVuZ3RoKTsKKwor
ICAgIHZhciBtdWx0aXBsaWVyID0gTWF0aC5wb3coZW5kVmFsdWUgLyBzdGFydFZhbHVlLCAxIC8g
bGVuZ3RoKTsKKyAgICAKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IGxlbmd0aDsgKytrKSB7Cisg
ICAgICAgIGJ1ZmZlcltrXSA9IHN0YXJ0VmFsdWUgKiBNYXRoLnBvdyhtdWx0aXBsaWVyLCBrKTsK
KyAgICB9CisKKyAgICByZXR1cm4gYnVmZmVyOworfQorCisvLyBDb21wYXJlIGEgc2VjdGlvbiBv
ZiB0aGUgcmVuZGVyZWQgZGF0YSBhZ2FpbnN0IG91ciBleHBlY3RlZCBzaWduYWwuCitmdW5jdGlv
biBjb21wYXJlUGFydGlhbFNpZ25hbHMocmVuZGVyZWQsIGV4cGVjdGVkRnVuY3Rpb24sIHN0YXJ0
VGltZSwgZW5kVGltZSwgdmFsdWVJbmZvLCBzYW1wbGVSYXRlKQoreworICAgIHZhciBzdGFydFNh
bXBsZSA9IHRpbWVUb1NhbXBsZUZyYW1lKHN0YXJ0VGltZSwgc2FtcGxlUmF0ZSk7CisgICAgdmFy
IGV4cGVjdGVkID0gZXhwZWN0ZWRGdW5jdGlvbihzdGFydFRpbWUsIGVuZFRpbWUsIHZhbHVlSW5m
by5zdGFydFZhbHVlLCB2YWx1ZUluZm8uZW5kVmFsdWUsIHNhbXBsZVJhdGUpOworCisgICAgdmFy
IG4gPSBleHBlY3RlZC5sZW5ndGg7CisgICAgdmFyIG1heEVycm9yID0gLTE7CisgICAgdmFyIG1h
eEVycm9ySW5kZXggPSAtMTsKKyAgICAKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IG47ICsraykg
eworICAgICAgICB2YXIgZXJyb3IgPSBNYXRoLmFicyhyZW5kZXJlZFtzdGFydFNhbXBsZSArIGtd
IC0gZXhwZWN0ZWRba10pOworICAgICAgICBpZiAoZXJyb3IgPiBtYXhFcnJvcikgeworICAgICAg
ICAgICAgbWF4RXJyb3IgPSBlcnJvcjsKKyAgICAgICAgICAgIG1heEVycm9ySW5kZXggPSBrOwor
ICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHsgbWF4RXJyb3IgOiBtYXhFcnJvciwgaW5k
ZXggOiBtYXhFcnJvckluZGV4IH07Cit9CisKKy8vIEZpbmQgdGhlIGRpc2NvbnRpbnVpdGllcyBp
biB0aGUgZGF0YSBhbmQgY29tcGFyZSB0aGUgbG9jYXRpb24gb2YgdGhlIGRpc2NvbnRpbnVpdHkg
d2l0aCBvdXIKKy8vIGV4cGVjdGVkIHN0YXJ0IG9mIHRoZSB0aW1lIGludGVydmFsLiBUaGVyZSBp
cyBhIGRpc2NvbnRpbnVpdHkgaWYgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorLy8gc3VjY2Vzc2l2
ZSBzYW1wbGVzIGV4Y2VlZHMgdGhlIHRocmVzaG9sZC4KK2Z1bmN0aW9uIHZlcmlmeURpc2NvbnRp
bnVpdGllcyhkYXRhLCBzdGFydFRpbWUsIHRocmVzaG9sZCkKK3sKKyAgICB2YXIgbiA9IGRhdGEu
bGVuZ3RoOworICAgIHZhciBzdWNjZXNzID0gdHJ1ZTsKKyAgICB2YXIgYmFkTG9jYXRpb25zID0g
MDsKKyAgICB2YXIgYnJlYWtzID0gW107CisKKyAgICAvLyBGaW5kIGRpc2NvbnRpbnVpdGllcy4K
KyAgICBmb3IgKHZhciBrID0gMTsgayA8IG47ICsraykgeworICAgICAgICBpZiAoTWF0aC5hYnMo
ZGF0YVtrXSAtIGRhdGFbayAtIDFdKSA+IHRocmVzaG9sZCkgeworICAgICAgICAgICAgYnJlYWtz
LnB1c2goayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb21wYXJlIHRoZSBsb2NhdGlv
biBvZiBlYWNoIGRpc2NvbnRpbnVpdHkgd2l0aCB0aGUgZW5kIHRpbWUgb2YgZWFjaCBpbnRlcnZh
bC4gKFRoZXJlIGlzIG5vCisgICAgLy8gZGlzY29udGludWl0eSBhdCB0aGUgc3RhcnQgb2YgdGhl
IHNpZ25hbC4pCisgICAgZm9yICh2YXIgayA9IDA7IGsgPCBicmVha3MubGVuZ3RoOyArK2spIHsK
KyAgICAgICAgdmFyIGV4cGVjdGVkID0gdGltZVRvU2FtcGxlRnJhbWUoc3RhcnRUaW1lW2sgKyAx
XSwgc2FtcGxlUmF0ZSk7CisgICAgICAgIGlmIChicmVha3Nba10gIT0gZXhwZWN0ZWQpIHsKKyAg
ICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICsrYmFkTG9jYXRpb25zOwor
ICAgICAgICAgICAgdGVzdEZhaWxlZCgiRXhwZWN0ZWQgZGlzY29udGludWl0eSBhdCAiICsgZXhw
ZWN0ZWQgKyAiIGJ1dCBnb3QgIiArIGJyZWFrc1trXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICBpZiAoYmFkTG9jYXRpb25zKSB7CisgICAgICAgIHRlc3RGYWlsZWQoYmFkTG9jYXRpb25zICsg
IiBkaXNjb250aW51aXRpZXMgYXQgaW5jb3JyZWN0IGxvY2F0aW9ucyIpOworICAgIH0gZWxzZSB7
CisgICAgICAgIHRlc3RQYXNzZWQoIkFsbCAiICsgKGJyZWFrcy5sZW5ndGggKyAxKSArICIgdGVz
dHMgc3RhcnRlZCBhbmQgZW5kZWQgYXQgdGhlIGNvcnJlY3QgdGltZS4iKTsKKyAgICB9CisgICAg
CisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8vIENvbXBhcmUgdGhlIHJlbmRlcmVkIGRhdGEg
d2l0aCB0aGUgZXhwZWN0ZWQgZGF0YS4KKy8vCisvLyB0ZXN0TmFtZSAtIHN0cmluZyBkZXNjcmli
aW5nIHRoZSB0ZXN0CisvLworLy8gbWF4RXJyb3IgLSBtYXhpbXVtIGFsbG93ZWQgZGlmZmVyZW5j
ZSBiZXR3ZWVuIHRoZSByZW5kZXJlZCBkYXRhIGFuZCB0aGUgZXhwZWN0ZWQgZGF0YQorLy8KKy8v
IHJlbmRlcmVyZERhdGEgLSBhcnJheSBjb250YWluaW5nIHRoZSByZW5kZXJlZCAoYWN0dWFsKSBk
YXRhCisvLworLy8gZXhwZWN0ZWRGdW5jdGlvbiAtIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIGV4
cGVjdGVkIGRhdGEKKy8vCisvLyB0aW1lVmFsdWVJbmZvIC0gYXJyYXkgY29udGFpbmluZyBpbmZv
cm1hdGlvbiBhYm91dCB0aGUgc3RhcnQgYW5kIGVuZCB0aW1lcyBhbmQgdGhlIHN0YXJ0IGFuZCBl
bmQKKy8vIHZhbHVlcyBvZiBlYWNoIGludGVydmFsLgorLy8KKy8vIGJyZWFrVGhyZXNob2xkIC0g
dGhyZXNob2xkIHRvIHVzZSBmb3IgZGV0ZXJtaW5pbmcgZGlzY29udGludWl0aWVzLgorZnVuY3Rp
b24gY29tcGFyZVNpZ25hbHModGVzdE5hbWUsIG1heEVycm9yLCByZW5kZXJlZERhdGEsIGV4cGVj
dGVkRnVuY3Rpb24sIHRpbWVWYWx1ZUluZm8sIGJyZWFrVGhyZXNob2xkKQoreworICAgIHZhciBz
dWNjZXNzID0gdHJ1ZTsKKyAgICB2YXIgZmFpbGVkVGVzdENvdW50ID0gMDsKKyAgICB2YXIgc3Rh
cnRUaW1lID0gdGltZVZhbHVlSW5mby5zdGFydFRpbWU7CisgICAgdmFyIGdhaW5zID0gdGltZVZh
bHVlSW5mby52YWx1ZTsKKyAgICB2YXIgbiA9IGdhaW5zLmxlbmd0aDsKKworICAgIHN1Y2Nlc3Mg
PSB2ZXJpZnlEaXNjb250aW51aXRpZXMocmVuZGVyZWREYXRhLCBzdGFydFRpbWUsIGJyZWFrVGhy
ZXNob2xkKTsKKworICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbjsgKytrKSB7CisgICAgICAgIHZh
ciByZXN1bHQgPSBjb21wYXJlUGFydGlhbFNpZ25hbHMocmVuZGVyZWREYXRhLCBleHBlY3RlZEZ1
bmN0aW9uLCBzdGFydFRpbWVba10sIHN0YXJ0VGltZVtrICsgMV0sIGdhaW5zW2tdLCBzYW1wbGVS
YXRlKTsKKworICAgICAgICBpZiAocmVzdWx0Lm1heEVycm9yID4gbWF4RXJyb3IpIHsKKyAgICAg
ICAgICAgIHRlc3RGYWlsZWQoIkluY29ycmVjdCBnYWluIGZvciB0ZXN0ICIgKyBrICsgIi4gTWF4
IGVycm9yID0gIiArIHJlc3VsdC5tYXhFcnJvciArICIgYXQgb2Zmc2V0ICIgKyAocmVzdWx0Lmlu
ZGV4ICsgdGltZVRvU2FtcGxlRnJhbWUoc3RhcnRUaW1lW2tdLCBzYW1wbGVSYXRlKSkpOworICAg
ICAgICAgICAgKytmYWlsZWRUZXN0Q291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAo
ZmFpbGVkVGVzdENvdW50KSB7CisgICAgICAgIHRlc3RGYWlsZWQoZmFpbGVkVGVzdENvdW50ICsg
IiB0ZXN0cyBmYWlsZWQgb3V0IG9mICIgKyBuKTsKKyAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIHRlc3RQYXNzZWQoIkFsbCAiICsgbiArICIgdGVzdHMgcGFz
c2VkIHdpdGggYWJzb2x1dGUgZXJyb3IgYmVsb3cgIiArIG1heEVycm9yKTsKKyAgICB9CisgICAg
ICAKKyAgICBpZiAoc3VjY2VzcykgeworICAgICAgICB0ZXN0UGFzc2VkKCJBdWRpb1BhcmFtICIg
KyB0ZXN0TmFtZSArICIgdGVzdCBwYXNzZWQuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVz
dEZhaWxlZCgiQXVkaW9QYXJhbSAiICsgdGVzdE5hbWUgKyAiIHRlc3QgZmFpbGVkLiIpOworICAg
IH0KK30KKworLy8gUnVuIGFsbCB0aGUgYXV0b21hdGlvbiB0ZXN0cy4KKy8vCisvLyBzdGFydGlu
Z1ZhbHVlIC0gVGhlIHN0YXJ0aW5nIHZhbHVlLgorLy8KKy8vIHZhbHVlVXBkYXRlRnVuY3Rpb24g
LSBIb3cgbXVjaCB0byBjaGFuZ2UgdGhlIHZhbHVlIGF0IGJlZ2lubmluZyBvZiBlYWNoIHRpbWUg
aW50ZXJ2YWwuCisvLworLy8gZW5kVmFsdWVTdGVwRnVuY3Rpb24gLSBIb3cgbXVjaCB0aGUgdGFy
Z2V0IHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgdmFsdWUgYXQgdGhlIHN0YXJ0IG9mIHRoZQorLy8g
aW50ZXJ2YWwuCisvLworLy8gc2V0VmFsdWVGdW5jdGlvbiAtIGZ1bmN0aW9uIHRoYXQgc2V0cyB0
aGUgc3BlY2lmaWVkIHZhbHVlIGF0IHRoZSBzdGFydCBvZiBhIHRpbWUgaW50ZXJ2YWwuCisvLwor
Ly8gYXV0b21hdGlvbkZ1bmN0aW9uIC0gZnVuY3Rpb24gdGhhdCBzZXRzIHRoZSB0YXJnZXQgdmFs
dWUgZm9yIHRoZSB0aW1lIGludGVydmFsLiAgSXQgc3BlY2lmaWVzIGhvdworLy8gdGhlIHZhbHVl
IGFwcHJvYWNoZXMgdGhlIHRhcmdldC4KKy8vCisvLyBBbiBvYmplY3QgaXMgcmV0dXJuZWQgY29u
dGFpbmluZyBhbiBhcnJheSBvZiBzdGFydCB0aW1lcyBmb3IgZWFjaCB0aW1lIGludGVydmFsLCBh
bmQgYW4gYXJyYXkKKy8vIGdpdmluZyB0aGUgc3RhcnQgYW5kIHRhcmdldCB2YWx1ZXMgZm9yIHRo
ZSBpbnRlcnZhbC4KK2Z1bmN0aW9uIGRvQXV0b21hdGlvbihzdGFydGluZ1ZhbHVlLCB2YWx1ZVVw
ZGF0ZUZ1bmN0aW9uLCBlbmRWYWx1ZVN0ZXBGdW5jdGlvbiwgc2V0VmFsdWVGdW5jdGlvbiwgYXV0
b21hdGlvbkZ1bmN0aW9uKQoreworICAgIHZhciBzdGFydFRpbWVJbmZvID0gWzBdOworICAgIHZh
ciB2YWx1ZUluZm8gPSBbXTsKKyAgICB2YXIgdmFsdWUgPSBzdGFydGluZ1ZhbHVlOworICAgIAor
ICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbnVtYmVyT2ZUZXN0czsgKytrKSB7CisgICAgICAgIHZh
ciB0aW1lU3RhcnQgPSBrICogdGltZUludGVydmFsOworICAgICAgICB2YXIgdGltZUVuZCA9IChr
ICsgMSkgKiB0aW1lSW50ZXJ2YWw7CisgICAgICAgIHZhciBlbmRWYWx1ZSA9IHZhbHVlICsgZW5k
VmFsdWVTdGVwRnVuY3Rpb24oayk7CisKKyAgICAgICAgLy8gU2V0IHRoZSB2YWx1ZSBhdCB0aGUg
c3RhcnQgb2YgdGhlIHRpbWUgaW50ZXJ2YWwuCisgICAgICAgIHNldFZhbHVlRnVuY3Rpb24odmFs
dWUsIHRpbWVTdGFydCk7CisKKyAgICAgICAgLy8gU3BlY2lmeSB0aGUgdGFyZ2V0IHZhbHVlLCBh
bmQgaG93IHdlIHNob3VsZCBhcHByb2FjaCB0aGUgdGFyZ2V0IHZhbHVlLgorICAgICAgICBhdXRv
bWF0aW9uRnVuY3Rpb24oZW5kVmFsdWUsIHRpbWVTdGFydCwgdGltZUVuZCk7CisKKyAgICAgICAg
Ly8gS2VlcCB0cmFjayBvZiB0aGUgc3RhcnQgdGltZXMsIGFuZCB0aGUgc3RhcnQgYW5kIHRhcmdl
dCB2YWx1ZXMgZm9yIGVhY2ggdGltZSBpbnRlcnZhbC4KKyAgICAgICAgc3RhcnRUaW1lSW5mby5w
dXNoKHRpbWVFbmQpOworICAgICAgICB2YWx1ZUluZm8ucHVzaCh7IHN0YXJ0VmFsdWU6IHZhbHVl
LCBlbmRWYWx1ZSA6IGVuZFZhbHVlfSk7CisKKyAgICAgICAgdmFsdWUgKz0gdmFsdWVVcGRhdGVG
dW5jdGlvbihrKTsKKyAgICB9CisKKyAgICByZXR1cm4geyBzdGFydFRpbWUgOiBzdGFydFRpbWVJ
bmZvLCB2YWx1ZSA6IHZhbHVlSW5mbyB9OworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128225</attachid>
            <date>2012-02-22 08:56:29 -0800</date>
            <delta_ts>2012-02-22 16:05:36 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78035-20120222085628.patch</filename>
            <type>text/plain</type>
            <size>17191</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4MzI4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZGZmODgwNGM3YjBhMTdh
ZDJmYmZlZmY5MjY2MWY0MzI0ZTA1ZjMxMi4uNDI2NjhkOTE1NTE4NDAxNDNlOGQwNTMyNmQ4MmUz
ZDVmODA4OTZkNyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE2IEBACisyMDEyLTAyLTA4ICBSYXlt
b25kIFRveSAgPHJ0b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBleHBvbmVudGlhbFJhbXBUb1Zh
bHVlIGRvZXNuJ3QgdXNlIHN0YXJ0aW5nIHZhbHVlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD03ODAzNQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIFRlc3Q6IHdlYmF1ZGlvL2F1ZGlvcGFyYW0tZXhwb25lbnRp
YWxSYW1wVG9WYWx1ZUF0VGltZS5odG1sCisKKyAgICAgICAgKiB3ZWJhdWRpby9BdWRpb1BhcmFt
VGltZWxpbmUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYXJhbVRpbWVsaW5lOjp2YWx1
ZXNGb3JUaW1lUmFuZ2VJbXBsKTogU2V0CisgICAgICAgIHN0YXJ0aW5nIHZhbHVlIGZvciBleHBv
bmVudGlhbCByYW1wLgorCiAyMDEyLTAyLTE3ICBQaGlsaXBwZSBOb3JtYW5kICA8cG5vcm1hbmRA
aWdhbGlhLmNvbT4KIAogICAgICAgICBbR1N0cmVhbWVyXSBtZWRpYS9XM0MgZmFpbHVyZXMKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvUGFyYW1UaW1lbGluZS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS93ZWJhdWRpby9BdWRpb1BhcmFtVGltZWxpbmUuY3BwCmluZGV4IGVm
ZjFlYTc5YjAxMGM5Y2QwYjQzZmU1MjI4Zjg3NjAyZTFhYTdiMDEuLmNkOGY1MzY3NjJhNGNlMGMw
MzAzNTMzOTY5MThmZDYxYzViNWM0MjQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3dlYmF1
ZGlvL0F1ZGlvUGFyYW1UaW1lbGluZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvd2ViYXVkaW8v
QXVkaW9QYXJhbVRpbWVsaW5lLmNwcApAQCAtMjQyLDYgKzI0MiwxMyBAQCBmbG9hdCBBdWRpb1Bh
cmFtVGltZWxpbmU6OnZhbHVlc0ZvclRpbWVSYW5nZUltcGwoZmxvYXQgc3RhcnRUaW1lLAogICAg
ICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBnb2VzIGV4cG9uZW50aWFsbHkgZnJvbSB2YWx1ZTEg
dG8gdmFsdWUyIGluIGEgZHVyYXRpb24gb2YgZGVsdGFUaW1lIHNlY29uZHMgKGNvcnJlc3BvbmRp
bmcgdG8gbnVtU2FtcGxlRnJhbWVzKS4KICAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBw
ZXItc2FtcGxlIG11bHRpcGxpZXIuCiAgICAgICAgICAgICAgICAgZmxvYXQgbXVsdGlwbGllciA9
IHBvd2YodmFsdWUyIC8gdmFsdWUxLCAxIC8gbnVtU2FtcGxlRnJhbWVzKTsKKworICAgICAgICAg
ICAgICAgIC8vIFNldCB0aGUgc3RhcnRpbmcgdmFsdWUgb2YgdGhlIGV4cG9uZW50aWFsIHJhbXAu
IFRoaXMgaXMgdGhlIHNhbWUgYXMgbXVsdGlwbGllciBeCisgICAgICAgICAgICAgICAgLy8gQXVk
aW9VdGlsaXRpZXM6OnRpbWVUb1NhbXBsZUZyYW1lKGN1cnJlbnRUaW1lIC0gdGltZTEsIHNhbXBs
ZVJhdGUpLCBidXQgaXMgbW9yZQorICAgICAgICAgICAgICAgIC8vIGFjY3VyYXRlLCBlc3BlY2lh
bGx5IGlmIG11bHRpcGxpZXIgaXMgY2xvc2UgdG8gMS4KKyAgICAgICAgICAgICAgICB2YWx1ZSA9
IHZhbHVlMSAqIHBvd2YodmFsdWUyIC8gdmFsdWUxLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBBdWRpb1V0aWxpdGllczo6dGltZVRvU2FtcGxlRnJhbWUoY3VycmVudFRp
bWUgLSB0aW1lMSwgc2FtcGxlUmF0ZSkgLyBudW1TYW1wbGVGcmFtZXMpOworCiAgICAgICAgICAg
ICAgICAgZm9yICg7IHdyaXRlSW5kZXggPCBmaWxsVG9GcmFtZTsgKyt3cml0ZUluZGV4KSB7CiAg
ICAgICAgICAgICAgICAgICAgIHZhbHVlc1t3cml0ZUluZGV4XSA9IHZhbHVlOwogICAgICAgICAg
ICAgICAgICAgICB2YWx1ZSAqPSBtdWx0aXBsaWVyOwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCmluZGV4IGQ2NmYzMjY1MWY5MzY5NTBl
M2FlNTAyZTBkZDk0YzRmODQwNDI1MWEuLmVlZTRmOWVjZjZmYWM1MDg2MDEyMTdmZDRlMDg4ODY1
ODc4NjEzN2QgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL0NoYW5nZUxvZworKysgYi9MYXlvdXRU
ZXN0cy9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyMCBAQAorMjAxMi0wMi0wOCAgUmF5bW9uZCBUb3kg
IDxydG95QGdvb2dsZS5jb20+CisKKyAgICAgICAgZXhwb25lbnRpYWxSYW1wVG9WYWx1ZSBkb2Vz
bid0IHVzZSBzdGFydGluZyB2YWx1ZQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NzgwMzUKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICAqIHdlYmF1ZGlvL2F1ZGlvcGFyYW0tZXhwb25lbnRpYWxSYW1wVG9WYWx1
ZUF0VGltZS1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIHdlYmF1ZGlvL2F1ZGlvcGFy
YW0tZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZS5odG1sOiBBZGRlZC4KKyAgICAgICAgKiB3
ZWJhdWRpby9yZXNvdXJjZXMvYXVkaW9wYXJhbS10ZXN0aW5nLmpzOiBBZGRlZC4KKyAgICAgICAg
KGNyZWF0ZUNvbnN0YW50QnVmZmVyKToKKyAgICAgICAgKGNyZWF0ZUV4cG9uZW50aWFsUmFtcEFy
cmF5KToKKyAgICAgICAgKGNvbXBhcmVQYXJ0aWFsU2lnbmFscyk6CisgICAgICAgICh2ZXJpZnlE
aXNjb250aW51aXRpZXMpOgorICAgICAgICAoY29tcGFyZVNpZ25hbHMpOgorICAgICAgICAoZG9B
dXRvbWF0aW9uKToKKwogMjAxMi0wMi0xNyAgUGhpbGlwcGUgTm9ybWFuZCAgPHBub3JtYW5kQGln
YWxpYS5jb20+CiAKICAgICAgICAgW0dTdHJlYW1lcl0gbWVkaWEvVzNDIGZhaWx1cmVzCmRpZmYg
LS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhdWRpby9hdWRpb3BhcmFtLWV4cG9uZW50aWFsUmFtcFRv
VmFsdWVBdFRpbWUtZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vYXVkaW9wYXJh
bS1leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lLWV4cGVjdGVkLnR4dApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42
YzFmZDlkMjkyMWJjZDI0YTc5MjA0MGFmY2E3MTZlZGM2NTU3NmM4Ci0tLSAvZGV2L251bGwKKysr
IGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vYXVkaW9wYXJhbS1leHBvbmVudGlhbFJhbXBUb1ZhbHVl
QXRUaW1lLWV4cGVjdGVkLnR4dApAQCAtMCwwICsxLDExIEBACitUZXN0IEF1ZGlvUGFyYW0gZXhw
b25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSgpIGZ1bmN0aW9uYWxpdHkuCisKK09uIHN1Y2Nlc3Ms
IHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJU
RVNUIENPTVBMRVRFIi4KKworUEFTUyBBbGwgMTAwIHRlc3RzIHN0YXJ0ZWQgYW5kIGVuZGVkIGF0
IHRoZSBjb3JyZWN0IHRpbWUuCitQQVNTIEFsbCAxMDAgdGVzdHMgcGFzc2VkIHdpdGhpbiBhbiBh
Y2NlcHRhYmxlIHRvbGVyYW5jZS4KK1BBU1MgQXVkaW9QYXJhbSBleHBvbmVudGlhbFJhbXBUb1Zh
bHVlQXRUaW1lKCkgdGVzdCBwYXNzZWQuCitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVl
CisKK1RFU1QgQ09NUExFVEUKKwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvd2ViYXVkaW8vYXVk
aW9wYXJhbS1leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lLmh0bWwgYi9MYXlvdXRUZXN0cy93
ZWJhdWRpby9hdWRpb3BhcmFtLWV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUuaHRtbApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi5jM2I2YWIyODQ5MThiMjVjMDljNmQyNTQ2ZGU1YjJmODY2OGU2YjJlCi0tLSAvZGV2
L251bGwKKysrIGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vYXVkaW9wYXJhbS1leHBvbmVudGlhbFJh
bXBUb1ZhbHVlQXRUaW1lLmh0bWwKQEAgLTAsMCArMSwxNDAgQEAKKzwhRE9DVFlQRSBIVE1MIFBV
QkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgorPGh0bWw+Cisg
IDxoZWFkPgorICAgIDxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvYXVkaW8tdGVzdGluZy5qcyI+PC9z
Y3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9InJlc291cmNlcy9hdWRpb3BhcmFtLXRlc3RpbmcuanMi
Pjwvc2NyaXB0PgorICAgIDxzY3JpcHQgc3JjPSIuLi9mYXN0L2pzL3Jlc291cmNlcy9qcy10ZXN0
LXByZS5qcyI+PC9zY3JpcHQ+CisgIDwvaGVhZD4KKworICA8Ym9keT4KKyAgICA8ZGl2IGlkPSJk
ZXNjcmlwdGlvbiI+PC9kaXY+CisgICAgPGRpdiBpZD0iY29uc29sZSI+PC9kaXY+CisKKyAgICA8
c2NyaXB0PgorICAgICAgZGVzY3JpcHRpb24oIlRlc3QgQXVkaW9QYXJhbSBleHBvbmVudGlhbFJh
bXBUb1ZhbHVlQXRUaW1lKCkgZnVuY3Rpb25hbGl0eS4iKTsKKworICAgICAgLy8gUGxheSBhIGxv
bmcgREMgc2lnbmFsIG91dCB0aHJvdWdoIGFuIEF1ZGlvR2Fpbk5vZGUsIGFuZCBjYWxsIHNldFZh
bHVlQXRUaW1lKCkgYW5kCisgICAgICAvLyBleHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lKCkg
YXQgcmVndWxhciBpbnRlcnZhbHMgdG8gc2V0IHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIHZhbHVl
cworICAgICAgLy8gZm9yIGFuIGV4cG9uZW50aWFsIHJhbXAuICBFYWNoIHRpbWUgaW50ZXJ2YWwg
aGFzIGEgcmFtcCB3aXRoIGEgZGlmZmVyZW50IHN0YXJ0aW5nIGFuZAorICAgICAgLy8gZW5kaW5n
IHZhbHVlIHNvIHRoYXQgdGhlcmUgaXMgYSBkaXNjb250aW51aXR5IGF0IGVhY2ggdGltZSBpbnRl
cnZhbCBib3VuZGFyeS4gIFRoZQorICAgICAgLy8gZGlzY29udGludWl0eSBpcyBmb3IgdGVzdGlu
ZyB0aW1pbmcuICBBbHNvLCB3ZSBhbHRlcm5hdGUgYmV0d2VlbiBhbiBpbmNyZWFzaW5nIGFuZAor
ICAgICAgLy8gZGVjcmVhc2luZyByYW1wIGZvciBlYWNoIGludGVydmFsLgorCisgICAgICAvLyBN
YXggYWxsb3dlZCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbmRlcmVkIGRhdGEgYW5kIHRoZSBl
eHBlY3RlZCByZXN1bHQuCisgICAgICB2YXIgbWF4QWxsb3dlZEVycm9yID0gNi43NWUtNDsKKwor
ICAgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgdGltZXMg
YW5kIHN0YXJ0aW5nIGFuZCBlbmRpbmcgdmFsdWVzIGZvciBlYWNoCisgICAgICAvLyB0aW1lIGlu
dGVydmFsLgorICAgICAgdmFyIHRpbWVHYWluSW5mbzsKKworICAgICAgLy8gVGhlIEF1ZGlvR2Fp
bk5vZGUgc3RhcnRzIHdpdGggdGhpcyB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHZhbHVl
LgorICAgICAgdmFyIGluaXRpYWxWYWx1ZSA9IDEwMDsKKworICAgICAgLy8gVGhlIGRpZmZlcmVu
Y2UgYmV0d2VlbiBzdGFydGluZyB2YWx1ZXMgYmV0d2VlbiBlYWNoIHRpbWUgaW50ZXJ2YWwuCisg
ICAgICB2YXIgc3RhcnRpbmdWYWx1ZURlbHRhID0gaW5pdGlhbFZhbHVlIC8gbnVtYmVyT2ZUZXN0
czsKKyAgICAgIAorICAgICAgLy8gRWFjaCBleHBvbmVudGlhbCByYW1wIHdpbGwgaW5jcmVhc2Ug
b3IgZGVjcmVhc2UgYnkgdGhpcyBtdWNoIGZyb20gdGhlIHN0YXJ0IHRvIHRoZSBlbmQgb2YKKyAg
ICAgIC8vIHRoZSB0aW1lIGludGVydmFsLiAgV2UgY2hvb3NlIGhhbGYgb2Ygc3RhcnRpbmdWYWx1
ZURlbHRhIHNvIHRoYXQgdGhlIGVuZGluZyB2YWx1ZSBvZiB0aGUKKyAgICAgIC8vIHJhbXAgd2ls
bCBiZSBkaXN0aW5jdCBmcm9tIHRoZSBzdGFydGluZyB2YWx1ZSBvZiB0aGUgcmFtcCBmb3IgbmV4
dCB0aW1lIGludGVydmFsLiAgVGhpcworICAgICAgLy8gYWxsb3dzIHVzIHRvIGRldGVjdCB3aGVy
ZSB0aGUgcmFtcCBiZWdpbnMgYW5kIGVuZHMuCisgICAgICB2YXIgc3RhcnRFbmRWYWx1ZUNoYW5n
ZSA9IHN0YXJ0aW5nVmFsdWVEZWx0YSAvIDI7CisKKyAgICAgIC8vIFRocmVzaG9sZCB0byB1c2Ug
Zm9yIGRldGVjdGluZyBkaXNjb250aW51aXRpZXMgdGhhdCBzaG91bGQgYXBwZWFyIGF0IGVhY2gg
dGltZSBpbnRlcnZhbC4KKyAgICAgIHZhciBkaXNjb250aW51aXR5VGhyZXNob2xkID0gc3RhcnRF
bmRWYWx1ZUNoYW5nZSAvIDI7CisKKyAgICAgIHZhciBnYWluTm9kZTsKKyAgICAgIAorICAgICAg
dmFyIGNvbnN0YW50QnVmZmVyOworICAgICAgdmFyIGJ1ZmZlclNvdXJjZTsKKworICAgICAgLy8g
UmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN0YXJ0aW5nIHZhbHVlIGFuZCB0aGUg
ZW5kaW5nIHZhbHVlIGZvciB0aW1lIGludGVydmFsCisgICAgICAvLyB8dGltZUludGVydmFsSW5k
ZXh8LiAgV2UgYWx0ZXJuYXRlIGJldHdlZW4gYW4gZW5kIHZhbHVlIHRoYXQgaXMgYWJvdmUgb3Ig
YmVsb3cgdGhlIHN0YXJ0aW5nCisgICAgICAvLyB2YWx1ZS4KKyAgICAgIGZ1bmN0aW9uIGVuZFZh
bHVlRGVsdGEodGltZUludGVydmFsSW5kZXgpCisgICAgICB7CisgICAgICAgICAgaWYgKHRpbWVJ
bnRlcnZhbEluZGV4ICYgMSkgeworICAgICAgICAgICAgICByZXR1cm4gLXN0YXJ0RW5kVmFsdWVD
aGFuZ2U7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0RW5k
VmFsdWVDaGFuZ2U7CisgICAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBTZXQgdGhlIGdh
aW4gbm9kZSB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgdGlt
ZS4KKyAgICAgIGZ1bmN0aW9uIHNldFZhbHVlKHZhbHVlLCB0aW1lKQorICAgICAgeworICAgICAg
ICAgIGdhaW5Ob2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUodmFsdWUsIHRpbWUpOworICAgICAgfQor
CisgICAgICAvLyBHZW5lcmF0ZSBhbiBleHBvbmVudGlhbCByYW1wIGVuZGluZyBhdCB0aW1lIHxl
bmRUaW1lfCB3aXRoIGFuIGVuZGluZyB2YWx1ZSBvZiB8dmFsdWV8LgorICAgICAgZnVuY3Rpb24g
Z2VuZXJhdGVSYW1wKHZhbHVlLCBzdGFydFRpbWUsIGVuZFRpbWUpCisgICAgICB7CisgICAgICAg
ICAgLy8gfHN0YXJ0VGltZXwgaXMgaWdub3JlZCBiZWNhdXNlIHRoZSBleHBvbmVudGlhbCByYW1w
CisgICAgICAgICAgLy8gdXNlcyB0aGUgdmFsdWUgZnJvbSB0aGUgc2V0VmFsdWVBdFRpbWUoKSBj
YWxsIGFib3ZlLgorICAgICAgICAgIGdhaW5Ob2RlLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1
ZUF0VGltZSh2YWx1ZSwgZW5kVGltZSkKKyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gUmV0dXJu
IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN0YXJ0aW5nIHZhbHVlIGF0IHx0aW1lSW50ZXJ2
YWxJbmRleHwgYW5kIHRoZSBzdGFydGluZworICAgICAgLy8gdmFsdWUgYXQgdGhlIG5leHQgdGlt
ZSBpbnRlcnZhbC4gIFNpbmNlIHdlIHN0YXJ0ZWQgYXQgYSBsYXJnZSBpbml0aWFsIHZhbHVlLCB3
ZSBkZWNyZWFzZQorICAgICAgLy8gdGhlIHZhbHVlIGF0IGVhY2ggdGltZSBpbnRlcnZhbC4KKyAg
ICAgIGZ1bmN0aW9uIHZhbHVlVXBkYXRlKHRpbWVJbnRlcnZhbEluZGV4KQorICAgICAgeworICAg
ICAgICAgIHJldHVybiAtc3RhcnRpbmdWYWx1ZURlbHRhOworICAgICAgfQorCisgICAgICBmdW5j
dGlvbiBjaGVja1Jlc3VsdChldmVudCkKKyAgICAgIHsKKyAgICAgICAgICB2YXIgYnVmZmVyID0g
ZXZlbnQucmVuZGVyZWRCdWZmZXI7CisgICAgICAgICAgcmVuZGVyZWREYXRhID0gYnVmZmVyLmdl
dENoYW5uZWxEYXRhKDApOworCisgICAgICAgICAgY29tcGFyZVNpZ25hbHMoImV4cG9uZW50aWFs
UmFtcFRvVmFsdWVBdFRpbWUoKSIsIG1heEFsbG93ZWRFcnJvciwgcmVuZGVyZWREYXRhLCBjcmVh
dGVFeHBvbmVudGlhbFJhbXBBcnJheSwgdGltZUdhaW5JbmZvLCBkaXNjb250aW51aXR5VGhyZXNo
b2xkKTsKKworICAgICAgICAgIGZpbmlzaEpTVGVzdCgpOworICAgICAgfQorICAgICAgCisgICAg
ICBmdW5jdGlvbiBydW5UZXN0KCkKKyAgICAgIHsKKyAgICAgICAgICBpZiAod2luZG93LmxheW91
dFRlc3RDb250cm9sbGVyKSB7CisgICAgICAgICAgICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1
bXBBc1RleHQoKTsKKyAgICAgICAgICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIud2FpdFVudGls
RG9uZSgpOworICAgICAgICAgIH0KKworICAgICAgICAgIHdpbmRvdy5qc1Rlc3RJc0FzeW5jID0g
dHJ1ZTsKKworICAgICAgICAgIC8vIENyZWF0ZSBvZmZsaW5lIGF1ZGlvIGNvbnRleHQuCisgICAg
ICAgICAgY29udGV4dCA9IG5ldyB3ZWJraXRBdWRpb0NvbnRleHQoMiwgcmVuZGVyTGVuZ3RoLCBz
YW1wbGVSYXRlKTsKKyAgICAgICAgICBjb25zdGFudEJ1ZmZlciA9IGNyZWF0ZUNvbnN0YW50QnVm
ZmVyKGNvbnRleHQsIDEsIHJlbmRlckxlbmd0aCk7CisKKyAgICAgICAgICBnYWluTm9kZSA9IGNv
bnRleHQuY3JlYXRlR2Fpbk5vZGUoKTsKKworICAgICAgICAgIGJ1ZmZlclNvdXJjZSA9IGNvbnRl
eHQuY3JlYXRlQnVmZmVyU291cmNlKCk7CisgICAgICAgICAgYnVmZmVyU291cmNlLmJ1ZmZlciA9
IGNvbnN0YW50QnVmZmVyOworICAgICAgICAgIGJ1ZmZlclNvdXJjZS5jb25uZWN0KGdhaW5Ob2Rl
KTsKKyAgICAgICAgICBnYWluTm9kZS5jb25uZWN0KGNvbnRleHQuZGVzdGluYXRpb24pOworCisg
ICAgICAgICAgLy8gQXQgZWFjaCB0aW1lIGludGVydmFsLCB3ZSBhZGp1c3QgdGhlIHZhbHVlIGJ5
IHN0YXJ0aW5nVmFsdWVEZWx0YS4gIEhvd2V2ZXIsIHRoZQorICAgICAgICAgIC8vIGV4cG9uZW50
aWFsIHJhbXAgZW5kIHZhbHVlIGlzIHRoZSB2YWx1ZSArLy0gc3RhcnRFbmRWYWx1ZUNoYW5nZS4g
IChXZSBhbHRlcm5hdGVseQorICAgICAgICAgIC8vIHNwZWNpZnkgdGhlIGVuZCB2YWx1ZSB0byBi
ZSBncmVhdGVyIG9yIHNtYWxsZXIgdGhhbiB0aGUgc3RhcnRpbmcgdmFsdWUsIHRvIHRlc3QgdGhl
CisgICAgICAgICAgLy8gcmFtcCBnb2luZyB1cCBhbmQgZG93bi4pCisgICAgICAgICAgLy8KKyAg
ICAgICAgICAvLyBCeSBkb2luZyBpdCB0aGlzIHdheSwgd2UgZ2V0IGEgZGlzY29udGludWl0eSBh
dCBlYWNoIHRpbWUgaW50ZXJ2YWwgd2hpY2ggd2UgY2FuIHVzZSB0bworICAgICAgICAgIC8vIHRl
c3QgaWYgdGhlIHJhbXAgc3RhcnRlZCBhbmQgZW5kZWQgYXQgdGhlIGNvcnJlY3QgdGltZS4KKyAg
ICAgICAgICB0aW1lR2FpbkluZm8gPSBkb0F1dG9tYXRpb24oaW5pdGlhbFZhbHVlLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRWYWx1ZURlbHRhLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVSYW1wLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICB2YWx1ZVVwZGF0ZSk7CisKKyAgICAgICAgICBidWZmZXJTb3VyY2Uu
bm90ZU9uKDApOworICAgICAgCisgICAgICAgICAgY29udGV4dC5vbmNvbXBsZXRlID0gY2hlY2tS
ZXN1bHQ7CisgICAgICAgICAgY29udGV4dC5zdGFydFJlbmRlcmluZygpOworICAgICAgfQorCisg
ICAgICBydW5UZXN0KCk7CisgICAgICBzdWNjZXNzZnVsbHlQYXJzZWQgPSB0cnVlOworICAgICAg
CisgICAgPC9zY3JpcHQ+CisKKyAgICA8c2NyaXB0IHNyYz0iLi4vZmFzdC9qcy9yZXNvdXJjZXMv
anMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0
IGEvTGF5b3V0VGVzdHMvd2ViYXVkaW8vcmVzb3VyY2VzL2F1ZGlvcGFyYW0tdGVzdGluZy5qcyBi
L0xheW91dFRlc3RzL3dlYmF1ZGlvL3Jlc291cmNlcy9hdWRpb3BhcmFtLXRlc3RpbmcuanMKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uMDliOGIzMDJhOTk5OWVjZWM4NzYzZGIwNTYzYzI2NDJmNTU0MTcyNQotLS0gL2Rl
di9udWxsCisrKyBiL0xheW91dFRlc3RzL3dlYmF1ZGlvL3Jlc291cmNlcy9hdWRpb3BhcmFtLXRl
c3RpbmcuanMKQEAgLTAsMCArMSwxOTQgQEAKK3ZhciBzYW1wbGVSYXRlID0gNDQxMDA7CisKKy8v
IE51bWJlciBvZiB0ZXN0cyB0byBydW4uCit2YXIgbnVtYmVyT2ZUZXN0cyA9IDEwMDsKKworLy8g
VGltZSBpbnRlcnZhbCBiZXR3ZWVuIHZhbHVlIGNoYW5nZXMuICBJdCBpcyBiZXN0IGlmIDEgLyBu
dW1iZXJPZlRlc3RzIGlzIG5vdCBjbG9zZSB0bworLy8gdGltZUludGVydmFsLgordmFyIHRpbWVJ
bnRlcnZhbCA9IC4wMzsKKworLy8gTWFrZSBzdXJlIHdlIHJlbmRlciBsb25nIGVub3VnaCB0byBj
YXB0dXJlIGFsbCBvZiBvdXIgdGVzdCBkYXRhLgordmFyIHJlbmRlclRpbWUgPSAobnVtYmVyT2ZU
ZXN0cyArIDEpICogdGltZUludGVydmFsOwordmFyIHJlbmRlckxlbmd0aCA9IHRpbWVUb1NhbXBs
ZUZyYW1lKHJlbmRlclRpbWUsIHNhbXBsZVJhdGUpOworCit2YXIgY29udGV4dDsKKworLy8gQ3Jl
YXRlIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHNhbWUgY29uc3RhbnQgdmFsdWUuCitmdW5jdGlv
biBjcmVhdGVDb25zdGFudEJ1ZmZlcihjb250ZXh0LCBjb25zdGFudCwgbGVuZ3RoKSB7CisgICAg
dmFyIGJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlQnVmZmVyKDEsIGxlbmd0aCwgY29udGV4dC5zYW1w
bGVSYXRlKTsKKyAgICB2YXIgbiA9IGJ1ZmZlci5sZW5ndGg7CisgICAgdmFyIGRhdGEgPSBidWZm
ZXIuZ2V0Q2hhbm5lbERhdGEoMCk7CisKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IG47ICsraykg
eworICAgICAgICBkYXRhW2tdID0gY29uc3RhbnQ7CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZmZl
cjsKK30KKworLy8gQ3JlYXRlIGFuIGV4cG9uZW50aWFsIHJhbXAgc3RhcnRpbmcgYXQgfHN0YXJ0
VmFsdWV8IGFuZCBlbmRpbmcgYXQgfGVuZFZhbHVlfC4gIFRoZSByYW1wIHN0YXJ0cyBhdAorLy8g
dGltZSB8c3RhcnRUaW1lfCBhbmQgZW5kcyBhdCB8ZW5kVGltZXwuICAoVGhlIHN0YXJ0IGFuZCBl
bmQgdGltZXMgYXJlIG9ubHkgdXNlZCB0byBjb21wdXRlIGhvdworLy8gbWFueSBzYW1wbGVzIHRv
IHJldHVybi4pCitmdW5jdGlvbiBjcmVhdGVFeHBvbmVudGlhbFJhbXBBcnJheShzdGFydFRpbWUs
IGVuZFRpbWUsIHN0YXJ0VmFsdWUsIGVuZFZhbHVlLCBzYW1wbGVSYXRlKQoreworICAgIHZhciBz
dGFydEZyYW1lID0gdGltZVRvU2FtcGxlRnJhbWUoc3RhcnRUaW1lLCBzYW1wbGVSYXRlKTsKKyAg
ICB2YXIgZW5kRnJhbWUgPSB0aW1lVG9TYW1wbGVGcmFtZShlbmRUaW1lLCBzYW1wbGVSYXRlKTsK
KyAgICB2YXIgbGVuZ3RoID0gZW5kRnJhbWUgLSBzdGFydEZyYW1lOworICAgIHZhciBidWZmZXIg
PSBuZXcgQXJyYXkobGVuZ3RoKTsKKworICAgIHZhciBtdWx0aXBsaWVyID0gTWF0aC5wb3coZW5k
VmFsdWUgLyBzdGFydFZhbHVlLCAxIC8gbGVuZ3RoKTsKKyAgICAKKyAgICBmb3IgKHZhciBrID0g
MDsgayA8IGxlbmd0aDsgKytrKSB7CisgICAgICAgIGJ1ZmZlcltrXSA9IHN0YXJ0VmFsdWUgKiBN
YXRoLnBvdyhtdWx0aXBsaWVyLCBrKTsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmZmVyOworfQor
CisvLyBDb21wYXJlIGEgc2VjdGlvbiBvZiB0aGUgcmVuZGVyZWQgZGF0YSBhZ2FpbnN0IG91ciBl
eHBlY3RlZCBzaWduYWwuCitmdW5jdGlvbiBjb21wYXJlUGFydGlhbFNpZ25hbHMocmVuZGVyZWQs
IGV4cGVjdGVkRnVuY3Rpb24sIHN0YXJ0VGltZSwgZW5kVGltZSwgdmFsdWVJbmZvLCBzYW1wbGVS
YXRlKQoreworICAgIHZhciBzdGFydFNhbXBsZSA9IHRpbWVUb1NhbXBsZUZyYW1lKHN0YXJ0VGlt
ZSwgc2FtcGxlUmF0ZSk7CisgICAgdmFyIGV4cGVjdGVkID0gZXhwZWN0ZWRGdW5jdGlvbihzdGFy
dFRpbWUsIGVuZFRpbWUsIHZhbHVlSW5mby5zdGFydFZhbHVlLCB2YWx1ZUluZm8uZW5kVmFsdWUs
IHNhbXBsZVJhdGUpOworCisgICAgdmFyIG4gPSBleHBlY3RlZC5sZW5ndGg7CisgICAgdmFyIG1h
eEVycm9yID0gLTE7CisgICAgdmFyIG1heEVycm9ySW5kZXggPSAtMTsKKyAgICAKKyAgICBmb3Ig
KHZhciBrID0gMDsgayA8IG47ICsraykgeworICAgICAgICB2YXIgZXJyb3IgPSBNYXRoLmFicyhy
ZW5kZXJlZFtzdGFydFNhbXBsZSArIGtdIC0gZXhwZWN0ZWRba10pOworICAgICAgICBpZiAoZXJy
b3IgPiBtYXhFcnJvcikgeworICAgICAgICAgICAgbWF4RXJyb3IgPSBlcnJvcjsKKyAgICAgICAg
ICAgIG1heEVycm9ySW5kZXggPSBrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHsg
bWF4RXJyb3IgOiBtYXhFcnJvciwgaW5kZXggOiBtYXhFcnJvckluZGV4IH07Cit9CisKKy8vIEZp
bmQgdGhlIGRpc2NvbnRpbnVpdGllcyBpbiB0aGUgZGF0YSBhbmQgY29tcGFyZSB0aGUgbG9jYXRp
b25zIG9mIHRoZSBkaXNjb250aW51aXRpZXMgd2l0aCB0aGUKKy8vIHRpbWVzIHRoYXQgZGVmaW5l
IHRoZSB0aW1lIGludGVydmFscy4gVGhlcmUgaXMgYSBkaXNjb250aW51aXR5IGlmIHRoZSBkaWZm
ZXJlbmNlIGJldHdlZW4KKy8vIHN1Y2Nlc3NpdmUgc2FtcGxlcyBleGNlZWRzIHRoZSB0aHJlc2hv
bGQuCitmdW5jdGlvbiB2ZXJpZnlEaXNjb250aW51aXRpZXModmFsdWVzLCB0aW1lcywgdGhyZXNo
b2xkKQoreworICAgIHZhciBuID0gdmFsdWVzLmxlbmd0aDsKKyAgICB2YXIgc3VjY2VzcyA9IHRy
dWU7CisgICAgdmFyIGJhZExvY2F0aW9ucyA9IDA7CisgICAgdmFyIGJyZWFrcyA9IFtdOworCisg
ICAgLy8gRmluZCBkaXNjb250aW51aXRpZXMuCisgICAgZm9yICh2YXIgayA9IDE7IGsgPCBuOyAr
K2spIHsKKyAgICAgICAgaWYgKE1hdGguYWJzKHZhbHVlc1trXSAtIHZhbHVlc1trIC0gMV0pID4g
dGhyZXNob2xkKSB7CisgICAgICAgICAgICBicmVha3MucHVzaChrKTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIC8vIENvbXBhcmUgdGhlIGxvY2F0aW9uIG9mIGVhY2ggZGlzY29udGludWl0eSB3
aXRoIHRoZSBlbmQgdGltZSBvZiBlYWNoIGludGVydmFsLiAoVGhlcmUgaXMgbm8KKyAgICAvLyBk
aXNjb250aW51aXR5IGF0IHRoZSBzdGFydCBvZiB0aGUgc2lnbmFsLikKKyAgICBmb3IgKHZhciBr
ID0gMDsgayA8IGJyZWFrcy5sZW5ndGg7ICsraykgeworICAgICAgICB2YXIgZXhwZWN0ZWRTYW1w
bGVGcmFtZSA9IHRpbWVUb1NhbXBsZUZyYW1lKHRpbWVzW2sgKyAxXSwgc2FtcGxlUmF0ZSk7Cisg
ICAgICAgIGlmIChicmVha3Nba10gIT0gZXhwZWN0ZWRTYW1wbGVGcmFtZSkgeworICAgICAgICAg
ICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgKytiYWRMb2NhdGlvbnM7CisgICAgICAg
ICAgICB0ZXN0RmFpbGVkKCJFeHBlY3RlZCBkaXNjb250aW51aXR5IGF0ICIgKyBleHBlY3RlZFNh
bXBsZUZyYW1lICsgIiBidXQgZ290ICIgKyBicmVha3Nba10pOworICAgICAgICB9CisgICAgfQor
CisgICAgaWYgKGJhZExvY2F0aW9ucykgeworICAgICAgICB0ZXN0RmFpbGVkKGJhZExvY2F0aW9u
cyArICIgZGlzY29udGludWl0aWVzIGF0IGluY29ycmVjdCBsb2NhdGlvbnMiKTsKKyAgICB9IGVs
c2UgeworICAgICAgICB0ZXN0UGFzc2VkKCJBbGwgIiArIChicmVha3MubGVuZ3RoICsgMSkgKyAi
IHRlc3RzIHN0YXJ0ZWQgYW5kIGVuZGVkIGF0IHRoZSBjb3JyZWN0IHRpbWUuIik7CisgICAgfQor
ICAgIAorICAgIHJldHVybiBzdWNjZXNzOworfQorCisvLyBDb21wYXJlIHRoZSByZW5kZXJlZCBk
YXRhIHdpdGggdGhlIGV4cGVjdGVkIGRhdGEuCisvLworLy8gdGVzdE5hbWUgLSBzdHJpbmcgZGVz
Y3JpYmluZyB0aGUgdGVzdAorLy8KKy8vIG1heEVycm9yIC0gbWF4aW11bSBhbGxvd2VkIGRpZmZl
cmVuY2UgYmV0d2VlbiB0aGUgcmVuZGVyZWQgZGF0YSBhbmQgdGhlIGV4cGVjdGVkIGRhdGEKKy8v
CisvLyByZW5kZXJlcmREYXRhIC0gYXJyYXkgY29udGFpbmluZyB0aGUgcmVuZGVyZWQgKGFjdHVh
bCkgZGF0YQorLy8KKy8vIGV4cGVjdGVkRnVuY3Rpb24gLSBmdW5jdGlvbiB0byBjb21wdXRlIHRo
ZSBleHBlY3RlZCBkYXRhCisvLworLy8gdGltZVZhbHVlSW5mbyAtIGFycmF5IGNvbnRhaW5pbmcg
aW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXJ0IGFuZCBlbmQgdGltZXMgYW5kIHRoZSBzdGFydCBh
bmQgZW5kCisvLyB2YWx1ZXMgb2YgZWFjaCBpbnRlcnZhbC4KKy8vCisvLyBicmVha1RocmVzaG9s
ZCAtIHRocmVzaG9sZCB0byB1c2UgZm9yIGRldGVybWluaW5nIGRpc2NvbnRpbnVpdGllcy4KK2Z1
bmN0aW9uIGNvbXBhcmVTaWduYWxzKHRlc3ROYW1lLCBtYXhFcnJvciwgcmVuZGVyZWREYXRhLCBl
eHBlY3RlZEZ1bmN0aW9uLCB0aW1lVmFsdWVJbmZvLCBicmVha1RocmVzaG9sZCkKK3sKKyAgICB2
YXIgc3VjY2VzcyA9IHRydWU7CisgICAgdmFyIGZhaWxlZFRlc3RDb3VudCA9IDA7CisgICAgdmFy
IHN0YXJ0VGltZSA9IHRpbWVWYWx1ZUluZm8udGltZXM7CisgICAgdmFyIGdhaW5zID0gdGltZVZh
bHVlSW5mby52YWx1ZXM7CisgICAgdmFyIG4gPSBnYWlucy5sZW5ndGg7CisKKyAgICBzdWNjZXNz
ID0gdmVyaWZ5RGlzY29udGludWl0aWVzKHJlbmRlcmVkRGF0YSwgc3RhcnRUaW1lLCBicmVha1Ro
cmVzaG9sZCk7CisKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IG47ICsraykgeworICAgICAgICB2
YXIgcmVzdWx0ID0gY29tcGFyZVBhcnRpYWxTaWduYWxzKHJlbmRlcmVkRGF0YSwgZXhwZWN0ZWRG
dW5jdGlvbiwgc3RhcnRUaW1lW2tdLCBzdGFydFRpbWVbayArIDFdLCBnYWluc1trXSwgc2FtcGxl
UmF0ZSk7CisKKyAgICAgICAgaWYgKHJlc3VsdC5tYXhFcnJvciA+IG1heEVycm9yKSB7CisgICAg
ICAgICAgICB0ZXN0RmFpbGVkKCJJbmNvcnJlY3QgZ2FpbiBmb3IgdGVzdCAiICsgayArICIuIE1h
eCBlcnJvciA9ICIgKyByZXN1bHQubWF4RXJyb3IgKyAiIGF0IG9mZnNldCAiICsgKHJlc3VsdC5p
bmRleCArIHRpbWVUb1NhbXBsZUZyYW1lKHN0YXJ0VGltZVtrXSwgc2FtcGxlUmF0ZSkpKTsKKyAg
ICAgICAgICAgICsrZmFpbGVkVGVzdENvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgaWYg
KGZhaWxlZFRlc3RDb3VudCkgeworICAgICAgICB0ZXN0RmFpbGVkKGZhaWxlZFRlc3RDb3VudCAr
ICIgdGVzdHMgZmFpbGVkIG91dCBvZiAiICsgbik7CisgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsK
KyAgICB9IGVsc2UgeworICAgICAgICB0ZXN0UGFzc2VkKCJBbGwgIiArIG4gKyAiIHRlc3RzIHBh
c3NlZCB3aXRoaW4gYW4gYWNjZXB0YWJsZSB0b2xlcmFuY2UuIik7CisgICAgfQorICAgICAgCisg
ICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgdGVzdFBhc3NlZCgiQXVkaW9QYXJhbSAiICsgdGVz
dE5hbWUgKyAiIHRlc3QgcGFzc2VkLiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRlc3RGYWls
ZWQoIkF1ZGlvUGFyYW0gIiArIHRlc3ROYW1lICsgIiB0ZXN0IGZhaWxlZC4iKTsKKyAgICB9Cit9
CisKKy8vIFJ1biBhbGwgdGhlIGF1dG9tYXRpb24gdGVzdHMuCisvLworLy8gaW5pdGlhbFZhbHVl
IC0gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGZpcnN0IHRpbWUgaW50ZXJ2YWwuCisvLworLy8g
dmFsdWVVcGRhdGVGdW5jdGlvbiAtIFRoZSBzdGFydGluZyB2YWx1ZSBhdCB0aW1lIGludGVydmFs
IGsgaXMgYWRqdXN0ZWQgYnkgdmFsdWVVcGRhdGVGdW5jdGlvbihrKSB0byBnaXZlIHRoZSBuZXcg
c3RhcnRpbmcgdmFsdWUgYXQgdGltZSBpbnRlcnZhbCBrICsgMS4KKy8vCisvLyBlbmRWYWx1ZURl
bHRhRnVuY3Rpb24gLSBIb3cgbXVjaCB0aGUgZW5kIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgdmFs
dWUgYXQgdGhlIHN0YXJ0IG9mIHRoZQorLy8gaW50ZXJ2YWwuCisvLworLy8gc2V0VmFsdWVGdW5j
dGlvbiAtIGZ1bmN0aW9uIHRoYXQgc2V0cyB0aGUgc3BlY2lmaWVkIHZhbHVlIGF0IHRoZSBzdGFy
dCBvZiBhIHRpbWUgaW50ZXJ2YWwuCisvLworLy8gYXV0b21hdGlvbkZ1bmN0aW9uIC0gZnVuY3Rp
b24gdGhhdCBzZXRzIHRoZSBlbmQgdmFsdWUgZm9yIHRoZSB0aW1lIGludGVydmFsLiAgSXQgc3Bl
Y2lmaWVzIGhvdworLy8gdGhlIHZhbHVlIGFwcHJvYWNoZXMgdGhlIGVuZCB2YWx1ZS4KKy8vCisv
LyBBbiBvYmplY3QgaXMgcmV0dXJuZWQgY29udGFpbmluZyBhbiBhcnJheSBvZiBzdGFydCB0aW1l
cyBmb3IgZWFjaCB0aW1lIGludGVydmFsLCBhbmQgYW4gYXJyYXkKKy8vIGdpdmluZyB0aGUgc3Rh
cnQgYW5kIGVuZCB2YWx1ZXMgZm9yIHRoZSBpbnRlcnZhbC4KK2Z1bmN0aW9uIGRvQXV0b21hdGlv
bihpbml0aWFsVmFsdWUsIGVuZFZhbHVlRGVsdGFGdW5jdGlvbiwgc2V0VmFsdWVGdW5jdGlvbiwg
YXV0b21hdGlvbkZ1bmN0aW9uLCB2YWx1ZVVwZGF0ZUZ1bmN0aW9uKQoreworICAgIHZhciB0aW1l
SW5mbyA9IFswXTsKKyAgICB2YXIgdmFsdWVJbmZvID0gW107CisgICAgdmFyIHZhbHVlID0gaW5p
dGlhbFZhbHVlOworICAgIAorICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbnVtYmVyT2ZUZXN0czsg
KytrKSB7CisgICAgICAgIHZhciBzdGFydFRpbWUgPSBrICogdGltZUludGVydmFsOworICAgICAg
ICB2YXIgZW5kVGltZSA9IChrICsgMSkgKiB0aW1lSW50ZXJ2YWw7CisgICAgICAgIHZhciBlbmRW
YWx1ZSA9IHZhbHVlICsgZW5kVmFsdWVEZWx0YUZ1bmN0aW9uKGspOworCisgICAgICAgIC8vIFNl
dCB0aGUgdmFsdWUgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0aW1lIGludGVydmFsLgorICAgICAgICBz
ZXRWYWx1ZUZ1bmN0aW9uKHZhbHVlLCBzdGFydFRpbWUpOworCisgICAgICAgIC8vIFNwZWNpZnkg
dGhlIHRhcmdldCB2YWx1ZSwgYW5kIGhvdyB3ZSBzaG91bGQgYXBwcm9hY2ggdGhlIHRhcmdldCB2
YWx1ZS4KKyAgICAgICAgYXV0b21hdGlvbkZ1bmN0aW9uKGVuZFZhbHVlLCBzdGFydFRpbWUsIGVu
ZFRpbWUpOworCisgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIHN0YXJ0IHRpbWVzLCBhbmQg
dGhlIHN0YXJ0IGFuZCB0YXJnZXQgdmFsdWVzIGZvciBlYWNoIHRpbWUgaW50ZXJ2YWwuCisgICAg
ICAgIHRpbWVJbmZvLnB1c2goZW5kVGltZSk7CisgICAgICAgIHZhbHVlSW5mby5wdXNoKHtzdGFy
dFZhbHVlOiB2YWx1ZSwgZW5kVmFsdWUgOiBlbmRWYWx1ZX0pOworCisgICAgICAgIHZhbHVlICs9
IHZhbHVlVXBkYXRlRnVuY3Rpb24oayk7CisgICAgfQorCisgICAgcmV0dXJuIHsgdGltZXMgOiB0
aW1lSW5mbywgdmFsdWVzIDogdmFsdWVJbmZvIH07Cit9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128309</attachid>
            <date>2012-02-22 15:53:48 -0800</date>
            <delta_ts>2012-02-22 15:57:37 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78035-20120222155347.patch</filename>
            <type>text/plain</type>
            <size>17523</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4NDgyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNTEyMjlhZTVkMGEzMThm
YWQ4NGNhYTM3ZTI4MzYyYjE4MjA5YTdhNS4uNzFmYzUwZjk2NWJiYjdiYzNhNjc1OGFhYzY4OTFm
MmM3NWE4MTU1MiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE2IEBACisyMDEyLTAyLTA4ICBSYXlt
b25kIFRveSAgPHJ0b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBleHBvbmVudGlhbFJhbXBUb1Zh
bHVlIGRvZXNuJ3QgdXNlIHN0YXJ0aW5nIHZhbHVlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD03ODAzNQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIFRlc3Q6IHdlYmF1ZGlvL2F1ZGlvcGFyYW0tZXhwb25lbnRp
YWxSYW1wVG9WYWx1ZUF0VGltZS5odG1sCisKKyAgICAgICAgKiB3ZWJhdWRpby9BdWRpb1BhcmFt
VGltZWxpbmUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYXJhbVRpbWVsaW5lOjp2YWx1
ZXNGb3JUaW1lUmFuZ2VJbXBsKTogU2V0CisgICAgICAgIHN0YXJ0aW5nIHZhbHVlIGZvciBleHBv
bmVudGlhbCByYW1wLgorCiAyMDEyLTAyLTIyICBTaGlueWEgS2F3YW5ha2EgIDxzaGlueWFrQGNo
cm9taXVtLm9yZz4KIAogICAgICAgICBmaXJzdFJlbmRlcmVyT2YoKSBzaG91bGQgYWxzbyByZXR1
cm4gYSBmYWxsYmFjayBlbGVtZW50IHJlbmRlcmVyIGluIE5vZGVSZW5kZXJpbmdDb250ZXh0Lgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvd2ViYXVkaW8vQXVkaW9QYXJhbVRpbWVsaW5lLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvUGFyYW1UaW1lbGluZS5jcHAKaW5kZXgg
ZWZmMWVhNzliMDEwYzljZDBiNDNmZTUyMjhmODc2MDJlMWFhN2IwMS4uY2Q4ZjUzNjc2MmE0Y2Uw
YzAzMDM1MzM5NjkxOGZkNjFjNWI1YzQyNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvd2Vi
YXVkaW8vQXVkaW9QYXJhbVRpbWVsaW5lLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS93ZWJhdWRp
by9BdWRpb1BhcmFtVGltZWxpbmUuY3BwCkBAIC0yNDIsNiArMjQyLDEzIEBAIGZsb2F0IEF1ZGlv
UGFyYW1UaW1lbGluZTo6dmFsdWVzRm9yVGltZVJhbmdlSW1wbChmbG9hdCBzdGFydFRpbWUsCiAg
ICAgICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGdvZXMgZXhwb25lbnRpYWxseSBmcm9tIHZhbHVl
MSB0byB2YWx1ZTIgaW4gYSBkdXJhdGlvbiBvZiBkZWx0YVRpbWUgc2Vjb25kcyAoY29ycmVzcG9u
ZGluZyB0byBudW1TYW1wbGVGcmFtZXMpLgogICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhl
IHBlci1zYW1wbGUgbXVsdGlwbGllci4KICAgICAgICAgICAgICAgICBmbG9hdCBtdWx0aXBsaWVy
ID0gcG93Zih2YWx1ZTIgLyB2YWx1ZTEsIDEgLyBudW1TYW1wbGVGcmFtZXMpOworCisgICAgICAg
ICAgICAgICAgLy8gU2V0IHRoZSBzdGFydGluZyB2YWx1ZSBvZiB0aGUgZXhwb25lbnRpYWwgcmFt
cC4gVGhpcyBpcyB0aGUgc2FtZSBhcyBtdWx0aXBsaWVyIF4KKyAgICAgICAgICAgICAgICAvLyBB
dWRpb1V0aWxpdGllczo6dGltZVRvU2FtcGxlRnJhbWUoY3VycmVudFRpbWUgLSB0aW1lMSwgc2Ft
cGxlUmF0ZSksIGJ1dCBpcyBtb3JlCisgICAgICAgICAgICAgICAgLy8gYWNjdXJhdGUsIGVzcGVj
aWFsbHkgaWYgbXVsdGlwbGllciBpcyBjbG9zZSB0byAxLgorICAgICAgICAgICAgICAgIHZhbHVl
ID0gdmFsdWUxICogcG93Zih2YWx1ZTIgLyB2YWx1ZTEsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEF1ZGlvVXRpbGl0aWVzOjp0aW1lVG9TYW1wbGVGcmFtZShjdXJyZW50
VGltZSAtIHRpbWUxLCBzYW1wbGVSYXRlKSAvIG51bVNhbXBsZUZyYW1lcyk7CisKICAgICAgICAg
ICAgICAgICBmb3IgKDsgd3JpdGVJbmRleCA8IGZpbGxUb0ZyYW1lOyArK3dyaXRlSW5kZXgpIHsK
ICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW3dyaXRlSW5kZXhdID0gdmFsdWU7CiAgICAgICAg
ICAgICAgICAgICAgIHZhbHVlICo9IG11bHRpcGxpZXI7CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0
cy9DaGFuZ2VMb2cgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKaW5kZXggODc4OWNhZGRjMzMwNWQ2
YThlZTI4ZmRmYTk1MjQ0OTA1ZjhkNjlmMi4uODY5YmY3YTA0ZTFiZTVkZjVhMDFlMjQ4YjQyZmZl
NzcyNjcyZWYyNCAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCisrKyBiL0xheW91
dFRlc3RzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIwIEBACisyMDEyLTAyLTA4ICBSYXltb25kIFRv
eSAgPHJ0b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBleHBvbmVudGlhbFJhbXBUb1ZhbHVlIGRv
ZXNuJ3QgdXNlIHN0YXJ0aW5nIHZhbHVlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD03ODAzNQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgICogd2ViYXVkaW8vYXVkaW9wYXJhbS1leHBvbmVudGlhbFJhbXBUb1Zh
bHVlQXRUaW1lLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogd2ViYXVkaW8vYXVkaW9w
YXJhbS1leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lLmh0bWw6IEFkZGVkLgorICAgICAgICAq
IHdlYmF1ZGlvL3Jlc291cmNlcy9hdWRpb3BhcmFtLXRlc3RpbmcuanM6IEFkZGVkLgorICAgICAg
ICAoY3JlYXRlQ29uc3RhbnRCdWZmZXIpOgorICAgICAgICAoY3JlYXRlRXhwb25lbnRpYWxSYW1w
QXJyYXkpOgorICAgICAgICAoY29tcGFyZVBhcnRpYWxTaWduYWxzKToKKyAgICAgICAgKHZlcmlm
eURpc2NvbnRpbnVpdGllcyk6CisgICAgICAgIChjb21wYXJlU2lnbmFscyk6CisgICAgICAgIChk
b0F1dG9tYXRpb24pOgorCiAyMDEyLTAyLTIyICBZdXRhIEtpdGFtdXJhICA8eXV0YWtAY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIFtDaHJvbWl1bV0gVW5yZXZpZXdlZCwgcmVndWxhciBtYWludGVu
YW5jZSBvZiB0ZXN0IGV4cGVjdGF0aW9ucy4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL3dlYmF1
ZGlvL2F1ZGlvcGFyYW0tZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZS1leHBlY3RlZC50eHQg
Yi9MYXlvdXRUZXN0cy93ZWJhdWRpby9hdWRpb3BhcmFtLWV4cG9uZW50aWFsUmFtcFRvVmFsdWVB
dFRpbWUtZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjZjMWZkOWQyOTIxYmNkMjRhNzkyMDQwYWZj
YTcxNmVkYzY1NTc2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy93ZWJhdWRpby9h
dWRpb3BhcmFtLWV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUtZXhwZWN0ZWQudHh0CkBAIC0w
LDAgKzEsMTEgQEAKK1Rlc3QgQXVkaW9QYXJhbSBleHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1l
KCkgZnVuY3Rpb25hbGl0eS4KKworT24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9m
ICJQQVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgorCitQQVNTIEFs
bCAxMDAgdGVzdHMgc3RhcnRlZCBhbmQgZW5kZWQgYXQgdGhlIGNvcnJlY3QgdGltZS4KK1BBU1Mg
QWxsIDEwMCB0ZXN0cyBwYXNzZWQgd2l0aGluIGFuIGFjY2VwdGFibGUgdG9sZXJhbmNlLgorUEFT
UyBBdWRpb1BhcmFtIGV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoKSB0ZXN0IHBhc3NlZC4K
K1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCmRpZmYg
LS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhdWRpby9hdWRpb3BhcmFtLWV4cG9uZW50aWFsUmFtcFRv
VmFsdWVBdFRpbWUuaHRtbCBiL0xheW91dFRlc3RzL3dlYmF1ZGlvL2F1ZGlvcGFyYW0tZXhwb25l
bnRpYWxSYW1wVG9WYWx1ZUF0VGltZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjNlNjJmODQyMzY2MThiNDEx
ZGEyNTM3OTVmYWM5OWE5NGQ5NzBkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy93
ZWJhdWRpby9hdWRpb3BhcmFtLWV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUuaHRtbApAQCAt
MCwwICsxLDE0NCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQu
MDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHNjcmlwdCBzcmM9
InJlc291cmNlcy9hdWRpby10ZXN0aW5nLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0i
cmVzb3VyY2VzL2F1ZGlvcGFyYW0tdGVzdGluZy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBz
cmM9Ii4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKyAgPC9o
ZWFkPgorCisgIDxib2R5PgorICAgIDxkaXYgaWQ9ImRlc2NyaXB0aW9uIj48L2Rpdj4KKyAgICA8
ZGl2IGlkPSJjb25zb2xlIj48L2Rpdj4KKworICAgIDxzY3JpcHQ+CisgICAgICBkZXNjcmlwdGlv
bigiVGVzdCBBdWRpb1BhcmFtIGV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoKSBmdW5jdGlv
bmFsaXR5LiIpOworCisgICAgICAvLyBQbGF5IGEgbG9uZyBEQyBzaWduYWwgb3V0IHRocm91Z2gg
YW4gQXVkaW9HYWluTm9kZSwgYW5kIGNhbGwgc2V0VmFsdWVBdFRpbWUoKSBhbmQKKyAgICAgIC8v
IGV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoKSBhdCByZWd1bGFyIGludGVydmFscyB0byBz
ZXQgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgdmFsdWVzCisgICAgICAvLyBmb3IgYW4gZXhwb25l
bnRpYWwgcmFtcC4gIEVhY2ggdGltZSBpbnRlcnZhbCBoYXMgYSByYW1wIHdpdGggYSBkaWZmZXJl
bnQgc3RhcnRpbmcgYW5kCisgICAgICAvLyBlbmRpbmcgdmFsdWUgc28gdGhhdCB0aGVyZSBpcyBh
IGRpc2NvbnRpbnVpdHkgYXQgZWFjaCB0aW1lIGludGVydmFsIGJvdW5kYXJ5LiAgVGhlCisgICAg
ICAvLyBkaXNjb250aW51aXR5IGlzIGZvciB0ZXN0aW5nIHRpbWluZy4gIEFsc28sIHdlIGFsdGVy
bmF0ZSBiZXR3ZWVuIGFuIGluY3JlYXNpbmcgYW5kCisgICAgICAvLyBkZWNyZWFzaW5nIHJhbXAg
Zm9yIGVhY2ggaW50ZXJ2YWwuCisKKyAgICAgIC8vIE1heCBhbGxvd2VkIGRpZmZlcmVuY2UgYmV0
d2VlbiB0aGUgcmVuZGVyZWQgZGF0YSBhbmQgdGhlIGV4cGVjdGVkIHJlc3VsdC4KKyAgICAgIHZh
ciBtYXhBbGxvd2VkRXJyb3IgPSA2Ljc1ZS00OworCisgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91
dCB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyB0aW1lcyBhbmQgc3RhcnRpbmcgYW5kIGVuZGluZyB2
YWx1ZXMgZm9yIGVhY2gKKyAgICAgIC8vIHRpbWUgaW50ZXJ2YWwuCisgICAgICB2YXIgdGltZVZh
bHVlSW5mbzsKKworICAgICAgLy8gVGhlIEF1ZGlvR2Fpbk5vZGUgc3RhcnRzIHdpdGggdGhpcyB2
YWx1ZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAgdmFyIGluaXRpYWxWYWx1
ZSA9IDEwMDsKKworICAgICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydGluZyB2YWx1
ZXMgYmV0d2VlbiBlYWNoIHRpbWUgaW50ZXJ2YWwuCisgICAgICB2YXIgc3RhcnRpbmdWYWx1ZURl
bHRhID0gaW5pdGlhbFZhbHVlIC8gbnVtYmVyT2ZUZXN0czsKKyAgICAgIAorICAgICAgLy8gRWFj
aCBleHBvbmVudGlhbCByYW1wIHdpbGwgaW5jcmVhc2Ugb3IgZGVjcmVhc2UgYnkgdGhpcyBtdWNo
IGZyb20gdGhlIHN0YXJ0IHRvIHRoZSBlbmQgb2YKKyAgICAgIC8vIHRoZSB0aW1lIGludGVydmFs
LiAgV2UgY2hvb3NlIGhhbGYgb2Ygc3RhcnRpbmdWYWx1ZURlbHRhIHNvIHRoYXQgdGhlIGVuZGlu
ZyB2YWx1ZSBvZiB0aGUKKyAgICAgIC8vIHJhbXAgd2lsbCBiZSBkaXN0aW5jdCBmcm9tIHRoZSBz
dGFydGluZyB2YWx1ZSBvZiB0aGUgcmFtcCBmb3IgbmV4dCB0aW1lIGludGVydmFsLiAgVGhpcwor
ICAgICAgLy8gYWxsb3dzIHVzIHRvIGRldGVjdCB3aGVyZSB0aGUgcmFtcCBiZWdpbnMgYW5kIGVu
ZHMuCisgICAgICB2YXIgc3RhcnRFbmRWYWx1ZUNoYW5nZSA9IHN0YXJ0aW5nVmFsdWVEZWx0YSAv
IDI7CisKKyAgICAgIC8vIFRocmVzaG9sZCB0byB1c2UgZm9yIGRldGVjdGluZyBkaXNjb250aW51
aXRpZXMgdGhhdCBzaG91bGQgYXBwZWFyIGF0IGVhY2ggdGltZSBpbnRlcnZhbC4KKyAgICAgIHZh
ciBkaXNjb250aW51aXR5VGhyZXNob2xkID0gc3RhcnRFbmRWYWx1ZUNoYW5nZSAvIDI7CisKKyAg
ICAgIHZhciBnYWluTm9kZTsKKyAgICAgIAorICAgICAgdmFyIGNvbnN0YW50QnVmZmVyOworICAg
ICAgdmFyIGJ1ZmZlclNvdXJjZTsKKworICAgICAgLy8gUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJl
dHdlZW4gdGhlIHN0YXJ0aW5nIHZhbHVlIGFuZCB0aGUgZW5kaW5nIHZhbHVlIGZvciB0aW1lIGlu
dGVydmFsCisgICAgICAvLyB8dGltZUludGVydmFsSW5kZXh8LiAgV2UgYWx0ZXJuYXRlIGJldHdl
ZW4gYW4gZW5kIHZhbHVlIHRoYXQgaXMgYWJvdmUgb3IgYmVsb3cgdGhlIHN0YXJ0aW5nCisgICAg
ICAvLyB2YWx1ZS4KKyAgICAgIGZ1bmN0aW9uIGVuZFZhbHVlRGVsdGEodGltZUludGVydmFsSW5k
ZXgpCisgICAgICB7CisgICAgICAgICAgaWYgKHRpbWVJbnRlcnZhbEluZGV4ICYgMSkgeworICAg
ICAgICAgICAgICByZXR1cm4gLXN0YXJ0RW5kVmFsdWVDaGFuZ2U7CisgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0RW5kVmFsdWVDaGFuZ2U7CisgICAgICAgICAg
fQorICAgICAgfQorCisgICAgICAvLyBTZXQgdGhlIGdhaW4gbm9kZSB2YWx1ZSB0byB0aGUgc3Bl
Y2lmaWVkIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgdGltZS4KKyAgICAgIGZ1bmN0aW9uIHNldFZh
bHVlKHZhbHVlLCB0aW1lKQorICAgICAgeworICAgICAgICAgIGdhaW5Ob2RlLmdhaW4uc2V0VmFs
dWVBdFRpbWUodmFsdWUsIHRpbWUpOworICAgICAgfQorCisgICAgICAvLyBHZW5lcmF0ZSBhbiBl
eHBvbmVudGlhbCByYW1wIGVuZGluZyBhdCB0aW1lIHxlbmRUaW1lfCB3aXRoIGFuIGVuZGluZyB2
YWx1ZSBvZiB8dmFsdWV8LgorICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVSYW1wKHZhbHVlLCBzdGFy
dFRpbWUsIGVuZFRpbWUpCisgICAgICB7CisgICAgICAgICAgLy8gfHN0YXJ0VGltZXwgaXMgaWdu
b3JlZCBiZWNhdXNlIHRoZSBleHBvbmVudGlhbCByYW1wCisgICAgICAgICAgLy8gdXNlcyB0aGUg
dmFsdWUgZnJvbSB0aGUgc2V0VmFsdWVBdFRpbWUoKSBjYWxsIGFib3ZlLgorICAgICAgICAgIGdh
aW5Ob2RlLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2YWx1ZSwgZW5kVGltZSkK
KyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4g
dGhlIHN0YXJ0aW5nIHZhbHVlIGF0IHx0aW1lSW50ZXJ2YWxJbmRleHwgYW5kIHRoZSBzdGFydGlu
ZworICAgICAgLy8gdmFsdWUgYXQgdGhlIG5leHQgdGltZSBpbnRlcnZhbC4gIFNpbmNlIHdlIHN0
YXJ0ZWQgYXQgYSBsYXJnZSBpbml0aWFsIHZhbHVlLCB3ZSBkZWNyZWFzZQorICAgICAgLy8gdGhl
IHZhbHVlIGF0IGVhY2ggdGltZSBpbnRlcnZhbC4KKyAgICAgIGZ1bmN0aW9uIHZhbHVlVXBkYXRl
KHRpbWVJbnRlcnZhbEluZGV4KQorICAgICAgeworICAgICAgICAgIHJldHVybiAtc3RhcnRpbmdW
YWx1ZURlbHRhOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBjaGVja1Jlc3VsdChldmVudCkK
KyAgICAgIHsKKyAgICAgICAgICB2YXIgYnVmZmVyID0gZXZlbnQucmVuZGVyZWRCdWZmZXI7Cisg
ICAgICAgICAgcmVuZGVyZWREYXRhID0gYnVmZmVyLmdldENoYW5uZWxEYXRhKDApOworCisgICAg
ICAgICAgY29tcGFyZVNpZ25hbHMoImV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoKSIsIG1h
eEFsbG93ZWRFcnJvciwgcmVuZGVyZWREYXRhLCBjcmVhdGVFeHBvbmVudGlhbFJhbXBBcnJheSwg
dGltZVZhbHVlSW5mbywgZGlzY29udGludWl0eVRocmVzaG9sZCk7CisKKyAgICAgICAgICBmaW5p
c2hKU1Rlc3QoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZnVuY3Rpb24gcnVuVGVzdCgpCisg
ICAgICB7CisgICAgICAgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAg
ICAgICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgICAg
ICAgIGxheW91dFRlc3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKKyAgICAgICAgICB9CisK
KyAgICAgICAgICB3aW5kb3cuanNUZXN0SXNBc3luYyA9IHRydWU7CisKKyAgICAgICAgICAvLyBD
cmVhdGUgb2ZmbGluZSBhdWRpbyBjb250ZXh0LgorICAgICAgICAgIGNvbnRleHQgPSBuZXcgd2Vi
a2l0QXVkaW9Db250ZXh0KDIsIHJlbmRlckxlbmd0aCwgc2FtcGxlUmF0ZSk7CisgICAgICAgICAg
Y29uc3RhbnRCdWZmZXIgPSBjcmVhdGVDb25zdGFudEJ1ZmZlcihjb250ZXh0LCAxLCByZW5kZXJM
ZW5ndGgpOworCisgICAgICAgICAgLy8gV2UgdXNlIGFuIEF1ZGlvR2Fpbk5vZGUgaGVyZSBzaW1w
bHkgYXMgYSBjb252ZW5pZW50IHdheSB0byB0ZXN0IHRoZSBBdWRpb1BhcmFtCisgICAgICAgICAg
Ly8gYXV0b21hdGlvbiwgc2luY2UgaXQncyBlYXN5IHRvIHBhc3MgYSBjb25zdGFudCB2YWx1ZSB0
aHJvdWdoIHRoZSBub2RlLCBhdXRvbWF0ZSB0aGUKKyAgICAgICAgICAvLyAuZ2FpbiBhdHRyaWJ1
dGUgYW5kIG9ic2VydmUgdGhlIHJlc3VsdGluZyB2YWx1ZXMuCisKKyAgICAgICAgICBnYWluTm9k
ZSA9IGNvbnRleHQuY3JlYXRlR2Fpbk5vZGUoKTsKKworICAgICAgICAgIGJ1ZmZlclNvdXJjZSA9
IGNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7CisgICAgICAgICAgYnVmZmVyU291cmNlLmJ1
ZmZlciA9IGNvbnN0YW50QnVmZmVyOworICAgICAgICAgIGJ1ZmZlclNvdXJjZS5jb25uZWN0KGdh
aW5Ob2RlKTsKKyAgICAgICAgICBnYWluTm9kZS5jb25uZWN0KGNvbnRleHQuZGVzdGluYXRpb24p
OworCisgICAgICAgICAgLy8gQXQgZWFjaCB0aW1lIGludGVydmFsLCB3ZSBhZGp1c3QgdGhlIHZh
bHVlIGJ5IHN0YXJ0aW5nVmFsdWVEZWx0YS4gIEhvd2V2ZXIsIHRoZQorICAgICAgICAgIC8vIGV4
cG9uZW50aWFsIHJhbXAgZW5kIHZhbHVlIGlzIHRoZSB2YWx1ZSArLy0gc3RhcnRFbmRWYWx1ZUNo
YW5nZS4gIChXZSBhbHRlcm5hdGVseQorICAgICAgICAgIC8vIHNwZWNpZnkgdGhlIGVuZCB2YWx1
ZSB0byBiZSBncmVhdGVyIG9yIHNtYWxsZXIgdGhhbiB0aGUgc3RhcnRpbmcgdmFsdWUsIHRvIHRl
c3QgdGhlCisgICAgICAgICAgLy8gcmFtcCBnb2luZyB1cCBhbmQgZG93bi4pCisgICAgICAgICAg
Ly8KKyAgICAgICAgICAvLyBCeSBkb2luZyBpdCB0aGlzIHdheSwgd2UgZ2V0IGEgZGlzY29udGlu
dWl0eSBhdCBlYWNoIHRpbWUgaW50ZXJ2YWwgd2hpY2ggd2UgY2FuIHVzZSB0bworICAgICAgICAg
IC8vIHRlc3QgaWYgdGhlIHJhbXAgc3RhcnRlZCBhbmQgZW5kZWQgYXQgdGhlIGNvcnJlY3QgdGlt
ZS4KKyAgICAgICAgICB0aW1lVmFsdWVJbmZvID0gZG9BdXRvbWF0aW9uKGluaXRpYWxWYWx1ZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFZhbHVlRGVsdGEsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlUmFtcCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVXBkYXRlKTsKKworICAgICAgICAgIGJ1
ZmZlclNvdXJjZS5ub3RlT24oMCk7CisgICAgICAKKyAgICAgICAgICBjb250ZXh0Lm9uY29tcGxl
dGUgPSBjaGVja1Jlc3VsdDsKKyAgICAgICAgICBjb250ZXh0LnN0YXJ0UmVuZGVyaW5nKCk7Cisg
ICAgICB9CisKKyAgICAgIHJ1blRlc3QoKTsKKyAgICAgIHN1Y2Nlc3NmdWxseVBhcnNlZCA9IHRy
dWU7CisgICAgICAKKyAgICA8L3NjcmlwdD4KKworICAgIDxzY3JpcHQgc3JjPSIuLi9mYXN0L2pz
L3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorICA8L2JvZHk+Cis8L2h0bWw+
CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhdWRpby9yZXNvdXJjZXMvYXVkaW9wYXJhbS10
ZXN0aW5nLmpzIGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vcmVzb3VyY2VzL2F1ZGlvcGFyYW0tdGVz
dGluZy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi4zZjhlMWRkYTlkODRiZDljZTY5ODU3MGMzMGVhZDhjODRmMGI5
Yzk0Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vcmVzb3VyY2VzL2F1
ZGlvcGFyYW0tdGVzdGluZy5qcwpAQCAtMCwwICsxLDE5NCBAQAordmFyIHNhbXBsZVJhdGUgPSA0
NDEwMDsKKworLy8gTnVtYmVyIG9mIHRlc3RzIHRvIHJ1bi4KK3ZhciBudW1iZXJPZlRlc3RzID0g
MTAwOworCisvLyBUaW1lIGludGVydmFsIGJldHdlZW4gdmFsdWUgY2hhbmdlcy4gIEl0IGlzIGJl
c3QgaWYgMSAvIG51bWJlck9mVGVzdHMgaXMgbm90IGNsb3NlIHRvCisvLyB0aW1lSW50ZXJ2YWwu
Cit2YXIgdGltZUludGVydmFsID0gLjAzOworCisvLyBNYWtlIHN1cmUgd2UgcmVuZGVyIGxvbmcg
ZW5vdWdoIHRvIGNhcHR1cmUgYWxsIG9mIG91ciB0ZXN0IGRhdGEuCit2YXIgcmVuZGVyVGltZSA9
IChudW1iZXJPZlRlc3RzICsgMSkgKiB0aW1lSW50ZXJ2YWw7Cit2YXIgcmVuZGVyTGVuZ3RoID0g
dGltZVRvU2FtcGxlRnJhbWUocmVuZGVyVGltZSwgc2FtcGxlUmF0ZSk7CisKK3ZhciBjb250ZXh0
OworCisvLyBDcmVhdGUgYSBidWZmZXIgY29udGFpbmluZyB0aGUgc2FtZSBjb25zdGFudCB2YWx1
ZS4KK2Z1bmN0aW9uIGNyZWF0ZUNvbnN0YW50QnVmZmVyKGNvbnRleHQsIGNvbnN0YW50LCBsZW5n
dGgpIHsKKyAgICB2YXIgYnVmZmVyID0gY29udGV4dC5jcmVhdGVCdWZmZXIoMSwgbGVuZ3RoLCBj
b250ZXh0LnNhbXBsZVJhdGUpOworICAgIHZhciBuID0gYnVmZmVyLmxlbmd0aDsKKyAgICB2YXIg
ZGF0YSA9IGJ1ZmZlci5nZXRDaGFubmVsRGF0YSgwKTsKKworICAgIGZvciAodmFyIGsgPSAwOyBr
IDwgbjsgKytrKSB7CisgICAgICAgIGRhdGFba10gPSBjb25zdGFudDsKKyAgICB9CisKKyAgICBy
ZXR1cm4gYnVmZmVyOworfQorCisvLyBDcmVhdGUgYW4gZXhwb25lbnRpYWwgcmFtcCBzdGFydGlu
ZyBhdCB8c3RhcnRWYWx1ZXwgYW5kIGVuZGluZyBhdCB8ZW5kVmFsdWV8LiAgVGhlIHJhbXAgc3Rh
cnRzIGF0CisvLyB0aW1lIHxzdGFydFRpbWV8IGFuZCBlbmRzIGF0IHxlbmRUaW1lfC4gIChUaGUg
c3RhcnQgYW5kIGVuZCB0aW1lcyBhcmUgb25seSB1c2VkIHRvIGNvbXB1dGUgaG93CisvLyBtYW55
IHNhbXBsZXMgdG8gcmV0dXJuLikKK2Z1bmN0aW9uIGNyZWF0ZUV4cG9uZW50aWFsUmFtcEFycmF5
KHN0YXJ0VGltZSwgZW5kVGltZSwgc3RhcnRWYWx1ZSwgZW5kVmFsdWUsIHNhbXBsZVJhdGUpCit7
CisgICAgdmFyIHN0YXJ0RnJhbWUgPSB0aW1lVG9TYW1wbGVGcmFtZShzdGFydFRpbWUsIHNhbXBs
ZVJhdGUpOworICAgIHZhciBlbmRGcmFtZSA9IHRpbWVUb1NhbXBsZUZyYW1lKGVuZFRpbWUsIHNh
bXBsZVJhdGUpOworICAgIHZhciBsZW5ndGggPSBlbmRGcmFtZSAtIHN0YXJ0RnJhbWU7CisgICAg
dmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsZW5ndGgpOworCisgICAgdmFyIG11bHRpcGxpZXIgPSBN
YXRoLnBvdyhlbmRWYWx1ZSAvIHN0YXJ0VmFsdWUsIDEgLyBsZW5ndGgpOworICAgIAorICAgIGZv
ciAodmFyIGsgPSAwOyBrIDwgbGVuZ3RoOyArK2spIHsKKyAgICAgICAgYnVmZmVyW2tdID0gc3Rh
cnRWYWx1ZSAqIE1hdGgucG93KG11bHRpcGxpZXIsIGspOworICAgIH0KKworICAgIHJldHVybiBi
dWZmZXI7Cit9CisKKy8vIENvbXBhcmUgYSBzZWN0aW9uIG9mIHRoZSByZW5kZXJlZCBkYXRhIGFn
YWluc3Qgb3VyIGV4cGVjdGVkIHNpZ25hbC4KK2Z1bmN0aW9uIGNvbXBhcmVQYXJ0aWFsU2lnbmFs
cyhyZW5kZXJlZCwgZXhwZWN0ZWRGdW5jdGlvbiwgc3RhcnRUaW1lLCBlbmRUaW1lLCB2YWx1ZUlu
Zm8sIHNhbXBsZVJhdGUpCit7CisgICAgdmFyIHN0YXJ0U2FtcGxlID0gdGltZVRvU2FtcGxlRnJh
bWUoc3RhcnRUaW1lLCBzYW1wbGVSYXRlKTsKKyAgICB2YXIgZXhwZWN0ZWQgPSBleHBlY3RlZEZ1
bmN0aW9uKHN0YXJ0VGltZSwgZW5kVGltZSwgdmFsdWVJbmZvLnN0YXJ0VmFsdWUsIHZhbHVlSW5m
by5lbmRWYWx1ZSwgc2FtcGxlUmF0ZSk7CisKKyAgICB2YXIgbiA9IGV4cGVjdGVkLmxlbmd0aDsK
KyAgICB2YXIgbWF4RXJyb3IgPSAtMTsKKyAgICB2YXIgbWF4RXJyb3JJbmRleCA9IC0xOworICAg
IAorICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbjsgKytrKSB7CisgICAgICAgIHZhciBlcnJvciA9
IE1hdGguYWJzKHJlbmRlcmVkW3N0YXJ0U2FtcGxlICsga10gLSBleHBlY3RlZFtrXSk7CisgICAg
ICAgIGlmIChlcnJvciA+IG1heEVycm9yKSB7CisgICAgICAgICAgICBtYXhFcnJvciA9IGVycm9y
OworICAgICAgICAgICAgbWF4RXJyb3JJbmRleCA9IGs7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4ge21heEVycm9yIDogbWF4RXJyb3IsIGluZGV4IDogbWF4RXJyb3JJbmRleH07Cit9
CisKKy8vIEZpbmQgdGhlIGRpc2NvbnRpbnVpdGllcyBpbiB0aGUgZGF0YSBhbmQgY29tcGFyZSB0
aGUgbG9jYXRpb25zIG9mIHRoZSBkaXNjb250aW51aXRpZXMgd2l0aCB0aGUKKy8vIHRpbWVzIHRo
YXQgZGVmaW5lIHRoZSB0aW1lIGludGVydmFscy4gVGhlcmUgaXMgYSBkaXNjb250aW51aXR5IGlm
IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKy8vIHN1Y2Nlc3NpdmUgc2FtcGxlcyBleGNlZWRzIHRo
ZSB0aHJlc2hvbGQuCitmdW5jdGlvbiB2ZXJpZnlEaXNjb250aW51aXRpZXModmFsdWVzLCB0aW1l
cywgdGhyZXNob2xkKQoreworICAgIHZhciBuID0gdmFsdWVzLmxlbmd0aDsKKyAgICB2YXIgc3Vj
Y2VzcyA9IHRydWU7CisgICAgdmFyIGJhZExvY2F0aW9ucyA9IDA7CisgICAgdmFyIGJyZWFrcyA9
IFtdOworCisgICAgLy8gRmluZCBkaXNjb250aW51aXRpZXMuCisgICAgZm9yICh2YXIgayA9IDE7
IGsgPCBuOyArK2spIHsKKyAgICAgICAgaWYgKE1hdGguYWJzKHZhbHVlc1trXSAtIHZhbHVlc1tr
IC0gMV0pID4gdGhyZXNob2xkKSB7CisgICAgICAgICAgICBicmVha3MucHVzaChrKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIC8vIENvbXBhcmUgdGhlIGxvY2F0aW9uIG9mIGVhY2ggZGlzY29u
dGludWl0eSB3aXRoIHRoZSBlbmQgdGltZSBvZiBlYWNoIGludGVydmFsLiAoVGhlcmUgaXMgbm8K
KyAgICAvLyBkaXNjb250aW51aXR5IGF0IHRoZSBzdGFydCBvZiB0aGUgc2lnbmFsLikKKyAgICBm
b3IgKHZhciBrID0gMDsgayA8IGJyZWFrcy5sZW5ndGg7ICsraykgeworICAgICAgICB2YXIgZXhw
ZWN0ZWRTYW1wbGVGcmFtZSA9IHRpbWVUb1NhbXBsZUZyYW1lKHRpbWVzW2sgKyAxXSwgc2FtcGxl
UmF0ZSk7CisgICAgICAgIGlmIChicmVha3Nba10gIT0gZXhwZWN0ZWRTYW1wbGVGcmFtZSkgewor
ICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgKytiYWRMb2NhdGlvbnM7
CisgICAgICAgICAgICB0ZXN0RmFpbGVkKCJFeHBlY3RlZCBkaXNjb250aW51aXR5IGF0ICIgKyBl
eHBlY3RlZFNhbXBsZUZyYW1lICsgIiBidXQgZ290ICIgKyBicmVha3Nba10pOworICAgICAgICB9
CisgICAgfQorCisgICAgaWYgKGJhZExvY2F0aW9ucykgeworICAgICAgICB0ZXN0RmFpbGVkKGJh
ZExvY2F0aW9ucyArICIgZGlzY29udGludWl0aWVzIGF0IGluY29ycmVjdCBsb2NhdGlvbnMiKTsK
KyAgICB9IGVsc2UgeworICAgICAgICB0ZXN0UGFzc2VkKCJBbGwgIiArIChicmVha3MubGVuZ3Ro
ICsgMSkgKyAiIHRlc3RzIHN0YXJ0ZWQgYW5kIGVuZGVkIGF0IHRoZSBjb3JyZWN0IHRpbWUuIik7
CisgICAgfQorICAgIAorICAgIHJldHVybiBzdWNjZXNzOworfQorCisvLyBDb21wYXJlIHRoZSBy
ZW5kZXJlZCBkYXRhIHdpdGggdGhlIGV4cGVjdGVkIGRhdGEuCisvLworLy8gdGVzdE5hbWUgLSBz
dHJpbmcgZGVzY3JpYmluZyB0aGUgdGVzdAorLy8KKy8vIG1heEVycm9yIC0gbWF4aW11bSBhbGxv
d2VkIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVuZGVyZWQgZGF0YSBhbmQgdGhlIGV4cGVjdGVk
IGRhdGEKKy8vCisvLyByZW5kZXJlcmREYXRhIC0gYXJyYXkgY29udGFpbmluZyB0aGUgcmVuZGVy
ZWQgKGFjdHVhbCkgZGF0YQorLy8KKy8vIGV4cGVjdGVkRnVuY3Rpb24gLSBmdW5jdGlvbiB0byBj
b21wdXRlIHRoZSBleHBlY3RlZCBkYXRhCisvLworLy8gdGltZVZhbHVlSW5mbyAtIGFycmF5IGNv
bnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXJ0IGFuZCBlbmQgdGltZXMgYW5kIHRo
ZSBzdGFydCBhbmQgZW5kCisvLyB2YWx1ZXMgb2YgZWFjaCBpbnRlcnZhbC4KKy8vCisvLyBicmVh
a1RocmVzaG9sZCAtIHRocmVzaG9sZCB0byB1c2UgZm9yIGRldGVybWluaW5nIGRpc2NvbnRpbnVp
dGllcy4KK2Z1bmN0aW9uIGNvbXBhcmVTaWduYWxzKHRlc3ROYW1lLCBtYXhFcnJvciwgcmVuZGVy
ZWREYXRhLCBleHBlY3RlZEZ1bmN0aW9uLCB0aW1lVmFsdWVJbmZvLCBicmVha1RocmVzaG9sZCkK
K3sKKyAgICB2YXIgc3VjY2VzcyA9IHRydWU7CisgICAgdmFyIGZhaWxlZFRlc3RDb3VudCA9IDA7
CisgICAgdmFyIHRpbWVzID0gdGltZVZhbHVlSW5mby50aW1lczsKKyAgICB2YXIgdmFsdWVzID0g
dGltZVZhbHVlSW5mby52YWx1ZXM7CisgICAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoOworCisgICAg
c3VjY2VzcyA9IHZlcmlmeURpc2NvbnRpbnVpdGllcyhyZW5kZXJlZERhdGEsIHRpbWVzLCBicmVh
a1RocmVzaG9sZCk7CisKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IG47ICsraykgeworICAgICAg
ICB2YXIgcmVzdWx0ID0gY29tcGFyZVBhcnRpYWxTaWduYWxzKHJlbmRlcmVkRGF0YSwgZXhwZWN0
ZWRGdW5jdGlvbiwgdGltZXNba10sIHRpbWVzW2sgKyAxXSwgdmFsdWVzW2tdLCBzYW1wbGVSYXRl
KTsKKworICAgICAgICBpZiAocmVzdWx0Lm1heEVycm9yID4gbWF4RXJyb3IpIHsKKyAgICAgICAg
ICAgIHRlc3RGYWlsZWQoIkluY29ycmVjdCBnYWluIGZvciB0ZXN0ICIgKyBrICsgIi4gTWF4IGVy
cm9yID0gIiArIHJlc3VsdC5tYXhFcnJvciArICIgYXQgb2Zmc2V0ICIgKyAocmVzdWx0LmluZGV4
ICsgdGltZVRvU2FtcGxlRnJhbWUodGltZXNba10sIHNhbXBsZVJhdGUpKSk7CisgICAgICAgICAg
ICArK2ZhaWxlZFRlc3RDb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmYWlsZWRU
ZXN0Q291bnQpIHsKKyAgICAgICAgdGVzdEZhaWxlZChmYWlsZWRUZXN0Q291bnQgKyAiIHRlc3Rz
IGZhaWxlZCBvdXQgb2YgIiArIG4pOworICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgdGVzdFBhc3NlZCgiQWxsICIgKyBuICsgIiB0ZXN0cyBwYXNzZWQgd2l0
aGluIGFuIGFjY2VwdGFibGUgdG9sZXJhbmNlLiIpOworICAgIH0KKyAgICAgIAorICAgIGlmIChz
dWNjZXNzKSB7CisgICAgICAgIHRlc3RQYXNzZWQoIkF1ZGlvUGFyYW0gIiArIHRlc3ROYW1lICsg
IiB0ZXN0IHBhc3NlZC4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXN0RmFpbGVkKCJBdWRp
b1BhcmFtICIgKyB0ZXN0TmFtZSArICIgdGVzdCBmYWlsZWQuIik7CisgICAgfQorfQorCisvLyBS
dW4gYWxsIHRoZSBhdXRvbWF0aW9uIHRlc3RzLgorLy8KKy8vIGluaXRpYWxWYWx1ZSAtIFRoZSBp
bml0aWFsIHZhbHVlIG9mIHRoZSBmaXJzdCB0aW1lIGludGVydmFsLgorLy8KKy8vIHZhbHVlVXBk
YXRlRnVuY3Rpb24gLSBUaGUgc3RhcnRpbmcgdmFsdWUgYXQgdGltZSBpbnRlcnZhbCBrIGlzIGFk
anVzdGVkIGJ5IHZhbHVlVXBkYXRlRnVuY3Rpb24oaykgdG8gZ2l2ZSB0aGUgbmV3IHN0YXJ0aW5n
IHZhbHVlIGF0IHRpbWUgaW50ZXJ2YWwgayArIDEuCisvLworLy8gZW5kVmFsdWVEZWx0YUZ1bmN0
aW9uIC0gSG93IG11Y2ggdGhlIGVuZCB2YWx1ZSBkaWZmZXJzIGZyb20gdGhlIHZhbHVlIGF0IHRo
ZSBzdGFydCBvZiB0aGUKKy8vIGludGVydmFsLgorLy8KKy8vIHNldFZhbHVlRnVuY3Rpb24gLSBm
dW5jdGlvbiB0aGF0IHNldHMgdGhlIHNwZWNpZmllZCB2YWx1ZSBhdCB0aGUgc3RhcnQgb2YgYSB0
aW1lIGludGVydmFsLgorLy8KKy8vIGF1dG9tYXRpb25GdW5jdGlvbiAtIGZ1bmN0aW9uIHRoYXQg
c2V0cyB0aGUgZW5kIHZhbHVlIGZvciB0aGUgdGltZSBpbnRlcnZhbC4gIEl0IHNwZWNpZmllcyBo
b3cKKy8vIHRoZSB2YWx1ZSBhcHByb2FjaGVzIHRoZSBlbmQgdmFsdWUuCisvLworLy8gQW4gb2Jq
ZWN0IGlzIHJldHVybmVkIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2Ygc3RhcnQgdGltZXMgZm9yIGVh
Y2ggdGltZSBpbnRlcnZhbCwgYW5kIGFuIGFycmF5CisvLyBnaXZpbmcgdGhlIHN0YXJ0IGFuZCBl
bmQgdmFsdWVzIGZvciB0aGUgaW50ZXJ2YWwuCitmdW5jdGlvbiBkb0F1dG9tYXRpb24oaW5pdGlh
bFZhbHVlLCBlbmRWYWx1ZURlbHRhRnVuY3Rpb24sIHNldFZhbHVlRnVuY3Rpb24sIGF1dG9tYXRp
b25GdW5jdGlvbiwgdmFsdWVVcGRhdGVGdW5jdGlvbikKK3sKKyAgICB2YXIgdGltZUluZm8gPSBb
MF07CisgICAgdmFyIHZhbHVlSW5mbyA9IFtdOworICAgIHZhciB2YWx1ZSA9IGluaXRpYWxWYWx1
ZTsKKyAgICAKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IG51bWJlck9mVGVzdHM7ICsraykgewor
ICAgICAgICB2YXIgc3RhcnRUaW1lID0gayAqIHRpbWVJbnRlcnZhbDsKKyAgICAgICAgdmFyIGVu
ZFRpbWUgPSAoayArIDEpICogdGltZUludGVydmFsOworICAgICAgICB2YXIgZW5kVmFsdWUgPSB2
YWx1ZSArIGVuZFZhbHVlRGVsdGFGdW5jdGlvbihrKTsKKworICAgICAgICAvLyBTZXQgdGhlIHZh
bHVlIGF0IHRoZSBzdGFydCBvZiB0aGUgdGltZSBpbnRlcnZhbC4KKyAgICAgICAgc2V0VmFsdWVG
dW5jdGlvbih2YWx1ZSwgc3RhcnRUaW1lKTsKKworICAgICAgICAvLyBTcGVjaWZ5IHRoZSB0YXJn
ZXQgdmFsdWUsIGFuZCBob3cgd2Ugc2hvdWxkIGFwcHJvYWNoIHRoZSB0YXJnZXQgdmFsdWUuCisg
ICAgICAgIGF1dG9tYXRpb25GdW5jdGlvbihlbmRWYWx1ZSwgc3RhcnRUaW1lLCBlbmRUaW1lKTsK
KworICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBzdGFydCB0aW1lcywgYW5kIHRoZSBzdGFy
dCBhbmQgdGFyZ2V0IHZhbHVlcyBmb3IgZWFjaCB0aW1lIGludGVydmFsLgorICAgICAgICB0aW1l
SW5mby5wdXNoKGVuZFRpbWUpOworICAgICAgICB2YWx1ZUluZm8ucHVzaCh7c3RhcnRWYWx1ZTog
dmFsdWUsIGVuZFZhbHVlIDogZW5kVmFsdWV9KTsKKworICAgICAgICB2YWx1ZSArPSB2YWx1ZVVw
ZGF0ZUZ1bmN0aW9uKGspOworICAgIH0KKworICAgIHJldHVybiB7dGltZXMgOiB0aW1lSW5mbywg
dmFsdWVzIDogdmFsdWVJbmZvfTsKK30K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128312</attachid>
            <date>2012-02-22 15:57:40 -0800</date>
            <delta_ts>2012-02-22 16:00:19 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78035-20120222155739.patch</filename>
            <type>text/plain</type>
            <size>17523</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4NDgyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNTEyMjlhZTVkMGEzMThm
YWQ4NGNhYTM3ZTI4MzYyYjE4MjA5YTdhNS4uNzFmYzUwZjk2NWJiYjdiYzNhNjc1OGFhYzY4OTFm
MmM3NWE4MTU1MiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE2IEBACisyMDEyLTAyLTA4ICBSYXlt
b25kIFRveSAgPHJ0b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBleHBvbmVudGlhbFJhbXBUb1Zh
bHVlIGRvZXNuJ3QgdXNlIHN0YXJ0aW5nIHZhbHVlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD03ODAzNQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIFRlc3Q6IHdlYmF1ZGlvL2F1ZGlvcGFyYW0tZXhwb25lbnRp
YWxSYW1wVG9WYWx1ZUF0VGltZS5odG1sCisKKyAgICAgICAgKiB3ZWJhdWRpby9BdWRpb1BhcmFt
VGltZWxpbmUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYXJhbVRpbWVsaW5lOjp2YWx1
ZXNGb3JUaW1lUmFuZ2VJbXBsKTogU2V0CisgICAgICAgIHN0YXJ0aW5nIHZhbHVlIGZvciBleHBv
bmVudGlhbCByYW1wLgorCiAyMDEyLTAyLTIyICBTaGlueWEgS2F3YW5ha2EgIDxzaGlueWFrQGNo
cm9taXVtLm9yZz4KIAogICAgICAgICBmaXJzdFJlbmRlcmVyT2YoKSBzaG91bGQgYWxzbyByZXR1
cm4gYSBmYWxsYmFjayBlbGVtZW50IHJlbmRlcmVyIGluIE5vZGVSZW5kZXJpbmdDb250ZXh0Lgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvd2ViYXVkaW8vQXVkaW9QYXJhbVRpbWVsaW5lLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvUGFyYW1UaW1lbGluZS5jcHAKaW5kZXgg
ZWZmMWVhNzliMDEwYzljZDBiNDNmZTUyMjhmODc2MDJlMWFhN2IwMS4uY2Q4ZjUzNjc2MmE0Y2Uw
YzAzMDM1MzM5NjkxOGZkNjFjNWI1YzQyNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvd2Vi
YXVkaW8vQXVkaW9QYXJhbVRpbWVsaW5lLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS93ZWJhdWRp
by9BdWRpb1BhcmFtVGltZWxpbmUuY3BwCkBAIC0yNDIsNiArMjQyLDEzIEBAIGZsb2F0IEF1ZGlv
UGFyYW1UaW1lbGluZTo6dmFsdWVzRm9yVGltZVJhbmdlSW1wbChmbG9hdCBzdGFydFRpbWUsCiAg
ICAgICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGdvZXMgZXhwb25lbnRpYWxseSBmcm9tIHZhbHVl
MSB0byB2YWx1ZTIgaW4gYSBkdXJhdGlvbiBvZiBkZWx0YVRpbWUgc2Vjb25kcyAoY29ycmVzcG9u
ZGluZyB0byBudW1TYW1wbGVGcmFtZXMpLgogICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhl
IHBlci1zYW1wbGUgbXVsdGlwbGllci4KICAgICAgICAgICAgICAgICBmbG9hdCBtdWx0aXBsaWVy
ID0gcG93Zih2YWx1ZTIgLyB2YWx1ZTEsIDEgLyBudW1TYW1wbGVGcmFtZXMpOworCisgICAgICAg
ICAgICAgICAgLy8gU2V0IHRoZSBzdGFydGluZyB2YWx1ZSBvZiB0aGUgZXhwb25lbnRpYWwgcmFt
cC4gVGhpcyBpcyB0aGUgc2FtZSBhcyBtdWx0aXBsaWVyIF4KKyAgICAgICAgICAgICAgICAvLyBB
dWRpb1V0aWxpdGllczo6dGltZVRvU2FtcGxlRnJhbWUoY3VycmVudFRpbWUgLSB0aW1lMSwgc2Ft
cGxlUmF0ZSksIGJ1dCBpcyBtb3JlCisgICAgICAgICAgICAgICAgLy8gYWNjdXJhdGUsIGVzcGVj
aWFsbHkgaWYgbXVsdGlwbGllciBpcyBjbG9zZSB0byAxLgorICAgICAgICAgICAgICAgIHZhbHVl
ID0gdmFsdWUxICogcG93Zih2YWx1ZTIgLyB2YWx1ZTEsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEF1ZGlvVXRpbGl0aWVzOjp0aW1lVG9TYW1wbGVGcmFtZShjdXJyZW50
VGltZSAtIHRpbWUxLCBzYW1wbGVSYXRlKSAvIG51bVNhbXBsZUZyYW1lcyk7CisKICAgICAgICAg
ICAgICAgICBmb3IgKDsgd3JpdGVJbmRleCA8IGZpbGxUb0ZyYW1lOyArK3dyaXRlSW5kZXgpIHsK
ICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW3dyaXRlSW5kZXhdID0gdmFsdWU7CiAgICAgICAg
ICAgICAgICAgICAgIHZhbHVlICo9IG11bHRpcGxpZXI7CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0
cy9DaGFuZ2VMb2cgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKaW5kZXggODc4OWNhZGRjMzMwNWQ2
YThlZTI4ZmRmYTk1MjQ0OTA1ZjhkNjlmMi4uODY5YmY3YTA0ZTFiZTVkZjVhMDFlMjQ4YjQyZmZl
NzcyNjcyZWYyNCAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCisrKyBiL0xheW91
dFRlc3RzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIwIEBACisyMDEyLTAyLTA4ICBSYXltb25kIFRv
eSAgPHJ0b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBleHBvbmVudGlhbFJhbXBUb1ZhbHVlIGRv
ZXNuJ3QgdXNlIHN0YXJ0aW5nIHZhbHVlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD03ODAzNQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgICogd2ViYXVkaW8vYXVkaW9wYXJhbS1leHBvbmVudGlhbFJhbXBUb1Zh
bHVlQXRUaW1lLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogd2ViYXVkaW8vYXVkaW9w
YXJhbS1leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lLmh0bWw6IEFkZGVkLgorICAgICAgICAq
IHdlYmF1ZGlvL3Jlc291cmNlcy9hdWRpb3BhcmFtLXRlc3RpbmcuanM6IEFkZGVkLgorICAgICAg
ICAoY3JlYXRlQ29uc3RhbnRCdWZmZXIpOgorICAgICAgICAoY3JlYXRlRXhwb25lbnRpYWxSYW1w
QXJyYXkpOgorICAgICAgICAoY29tcGFyZVBhcnRpYWxTaWduYWxzKToKKyAgICAgICAgKHZlcmlm
eURpc2NvbnRpbnVpdGllcyk6CisgICAgICAgIChjb21wYXJlU2lnbmFscyk6CisgICAgICAgIChk
b0F1dG9tYXRpb24pOgorCiAyMDEyLTAyLTIyICBZdXRhIEtpdGFtdXJhICA8eXV0YWtAY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIFtDaHJvbWl1bV0gVW5yZXZpZXdlZCwgcmVndWxhciBtYWludGVu
YW5jZSBvZiB0ZXN0IGV4cGVjdGF0aW9ucy4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL3dlYmF1
ZGlvL2F1ZGlvcGFyYW0tZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZS1leHBlY3RlZC50eHQg
Yi9MYXlvdXRUZXN0cy93ZWJhdWRpby9hdWRpb3BhcmFtLWV4cG9uZW50aWFsUmFtcFRvVmFsdWVB
dFRpbWUtZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjZjMWZkOWQyOTIxYmNkMjRhNzkyMDQwYWZj
YTcxNmVkYzY1NTc2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy93ZWJhdWRpby9h
dWRpb3BhcmFtLWV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUtZXhwZWN0ZWQudHh0CkBAIC0w
LDAgKzEsMTEgQEAKK1Rlc3QgQXVkaW9QYXJhbSBleHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1l
KCkgZnVuY3Rpb25hbGl0eS4KKworT24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9m
ICJQQVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgorCitQQVNTIEFs
bCAxMDAgdGVzdHMgc3RhcnRlZCBhbmQgZW5kZWQgYXQgdGhlIGNvcnJlY3QgdGltZS4KK1BBU1Mg
QWxsIDEwMCB0ZXN0cyBwYXNzZWQgd2l0aGluIGFuIGFjY2VwdGFibGUgdG9sZXJhbmNlLgorUEFT
UyBBdWRpb1BhcmFtIGV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoKSB0ZXN0IHBhc3NlZC4K
K1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCmRpZmYg
LS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhdWRpby9hdWRpb3BhcmFtLWV4cG9uZW50aWFsUmFtcFRv
VmFsdWVBdFRpbWUuaHRtbCBiL0xheW91dFRlc3RzL3dlYmF1ZGlvL2F1ZGlvcGFyYW0tZXhwb25l
bnRpYWxSYW1wVG9WYWx1ZUF0VGltZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjNlNjJmODQyMzY2MThiNDEx
ZGEyNTM3OTVmYWM5OWE5NGQ5NzBkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy93
ZWJhdWRpby9hdWRpb3BhcmFtLWV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUuaHRtbApAQCAt
MCwwICsxLDE0NCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQu
MDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHNjcmlwdCBzcmM9
InJlc291cmNlcy9hdWRpby10ZXN0aW5nLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0i
cmVzb3VyY2VzL2F1ZGlvcGFyYW0tdGVzdGluZy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBz
cmM9Ii4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKyAgPC9o
ZWFkPgorCisgIDxib2R5PgorICAgIDxkaXYgaWQ9ImRlc2NyaXB0aW9uIj48L2Rpdj4KKyAgICA8
ZGl2IGlkPSJjb25zb2xlIj48L2Rpdj4KKworICAgIDxzY3JpcHQ+CisgICAgICBkZXNjcmlwdGlv
bigiVGVzdCBBdWRpb1BhcmFtIGV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoKSBmdW5jdGlv
bmFsaXR5LiIpOworCisgICAgICAvLyBQbGF5IGEgbG9uZyBEQyBzaWduYWwgb3V0IHRocm91Z2gg
YW4gQXVkaW9HYWluTm9kZSwgYW5kIGNhbGwgc2V0VmFsdWVBdFRpbWUoKSBhbmQKKyAgICAgIC8v
IGV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoKSBhdCByZWd1bGFyIGludGVydmFscyB0byBz
ZXQgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgdmFsdWVzCisgICAgICAvLyBmb3IgYW4gZXhwb25l
bnRpYWwgcmFtcC4gIEVhY2ggdGltZSBpbnRlcnZhbCBoYXMgYSByYW1wIHdpdGggYSBkaWZmZXJl
bnQgc3RhcnRpbmcgYW5kCisgICAgICAvLyBlbmRpbmcgdmFsdWUgc28gdGhhdCB0aGVyZSBpcyBh
IGRpc2NvbnRpbnVpdHkgYXQgZWFjaCB0aW1lIGludGVydmFsIGJvdW5kYXJ5LiAgVGhlCisgICAg
ICAvLyBkaXNjb250aW51aXR5IGlzIGZvciB0ZXN0aW5nIHRpbWluZy4gIEFsc28sIHdlIGFsdGVy
bmF0ZSBiZXR3ZWVuIGFuIGluY3JlYXNpbmcgYW5kCisgICAgICAvLyBkZWNyZWFzaW5nIHJhbXAg
Zm9yIGVhY2ggaW50ZXJ2YWwuCisKKyAgICAgIC8vIE1heCBhbGxvd2VkIGRpZmZlcmVuY2UgYmV0
d2VlbiB0aGUgcmVuZGVyZWQgZGF0YSBhbmQgdGhlIGV4cGVjdGVkIHJlc3VsdC4KKyAgICAgIHZh
ciBtYXhBbGxvd2VkRXJyb3IgPSA2Ljc1ZS00OworCisgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91
dCB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyB0aW1lcyBhbmQgc3RhcnRpbmcgYW5kIGVuZGluZyB2
YWx1ZXMgZm9yIGVhY2gKKyAgICAgIC8vIHRpbWUgaW50ZXJ2YWwuCisgICAgICB2YXIgdGltZVZh
bHVlSW5mbzsKKworICAgICAgLy8gVGhlIEF1ZGlvR2Fpbk5vZGUgc3RhcnRzIHdpdGggdGhpcyB2
YWx1ZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAgdmFyIGluaXRpYWxWYWx1
ZSA9IDEwMDsKKworICAgICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydGluZyB2YWx1
ZXMgYmV0d2VlbiBlYWNoIHRpbWUgaW50ZXJ2YWwuCisgICAgICB2YXIgc3RhcnRpbmdWYWx1ZURl
bHRhID0gaW5pdGlhbFZhbHVlIC8gbnVtYmVyT2ZUZXN0czsKKyAgICAgIAorICAgICAgLy8gRWFj
aCBleHBvbmVudGlhbCByYW1wIHdpbGwgaW5jcmVhc2Ugb3IgZGVjcmVhc2UgYnkgdGhpcyBtdWNo
IGZyb20gdGhlIHN0YXJ0IHRvIHRoZSBlbmQgb2YKKyAgICAgIC8vIHRoZSB0aW1lIGludGVydmFs
LiAgV2UgY2hvb3NlIGhhbGYgb2Ygc3RhcnRpbmdWYWx1ZURlbHRhIHNvIHRoYXQgdGhlIGVuZGlu
ZyB2YWx1ZSBvZiB0aGUKKyAgICAgIC8vIHJhbXAgd2lsbCBiZSBkaXN0aW5jdCBmcm9tIHRoZSBz
dGFydGluZyB2YWx1ZSBvZiB0aGUgcmFtcCBmb3IgbmV4dCB0aW1lIGludGVydmFsLiAgVGhpcwor
ICAgICAgLy8gYWxsb3dzIHVzIHRvIGRldGVjdCB3aGVyZSB0aGUgcmFtcCBiZWdpbnMgYW5kIGVu
ZHMuCisgICAgICB2YXIgc3RhcnRFbmRWYWx1ZUNoYW5nZSA9IHN0YXJ0aW5nVmFsdWVEZWx0YSAv
IDI7CisKKyAgICAgIC8vIFRocmVzaG9sZCB0byB1c2UgZm9yIGRldGVjdGluZyBkaXNjb250aW51
aXRpZXMgdGhhdCBzaG91bGQgYXBwZWFyIGF0IGVhY2ggdGltZSBpbnRlcnZhbC4KKyAgICAgIHZh
ciBkaXNjb250aW51aXR5VGhyZXNob2xkID0gc3RhcnRFbmRWYWx1ZUNoYW5nZSAvIDI7CisKKyAg
ICAgIHZhciBnYWluTm9kZTsKKyAgICAgIAorICAgICAgdmFyIGNvbnN0YW50QnVmZmVyOworICAg
ICAgdmFyIGJ1ZmZlclNvdXJjZTsKKworICAgICAgLy8gUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJl
dHdlZW4gdGhlIHN0YXJ0aW5nIHZhbHVlIGFuZCB0aGUgZW5kaW5nIHZhbHVlIGZvciB0aW1lIGlu
dGVydmFsCisgICAgICAvLyB8dGltZUludGVydmFsSW5kZXh8LiAgV2UgYWx0ZXJuYXRlIGJldHdl
ZW4gYW4gZW5kIHZhbHVlIHRoYXQgaXMgYWJvdmUgb3IgYmVsb3cgdGhlIHN0YXJ0aW5nCisgICAg
ICAvLyB2YWx1ZS4KKyAgICAgIGZ1bmN0aW9uIGVuZFZhbHVlRGVsdGEodGltZUludGVydmFsSW5k
ZXgpCisgICAgICB7CisgICAgICAgICAgaWYgKHRpbWVJbnRlcnZhbEluZGV4ICYgMSkgeworICAg
ICAgICAgICAgICByZXR1cm4gLXN0YXJ0RW5kVmFsdWVDaGFuZ2U7CisgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0RW5kVmFsdWVDaGFuZ2U7CisgICAgICAgICAg
fQorICAgICAgfQorCisgICAgICAvLyBTZXQgdGhlIGdhaW4gbm9kZSB2YWx1ZSB0byB0aGUgc3Bl
Y2lmaWVkIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgdGltZS4KKyAgICAgIGZ1bmN0aW9uIHNldFZh
bHVlKHZhbHVlLCB0aW1lKQorICAgICAgeworICAgICAgICAgIGdhaW5Ob2RlLmdhaW4uc2V0VmFs
dWVBdFRpbWUodmFsdWUsIHRpbWUpOworICAgICAgfQorCisgICAgICAvLyBHZW5lcmF0ZSBhbiBl
eHBvbmVudGlhbCByYW1wIGVuZGluZyBhdCB0aW1lIHxlbmRUaW1lfCB3aXRoIGFuIGVuZGluZyB2
YWx1ZSBvZiB8dmFsdWV8LgorICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVSYW1wKHZhbHVlLCBzdGFy
dFRpbWUsIGVuZFRpbWUpCisgICAgICB7CisgICAgICAgICAgLy8gfHN0YXJ0VGltZXwgaXMgaWdu
b3JlZCBiZWNhdXNlIHRoZSBleHBvbmVudGlhbCByYW1wCisgICAgICAgICAgLy8gdXNlcyB0aGUg
dmFsdWUgZnJvbSB0aGUgc2V0VmFsdWVBdFRpbWUoKSBjYWxsIGFib3ZlLgorICAgICAgICAgIGdh
aW5Ob2RlLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2YWx1ZSwgZW5kVGltZSkK
KyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4g
dGhlIHN0YXJ0aW5nIHZhbHVlIGF0IHx0aW1lSW50ZXJ2YWxJbmRleHwgYW5kIHRoZSBzdGFydGlu
ZworICAgICAgLy8gdmFsdWUgYXQgdGhlIG5leHQgdGltZSBpbnRlcnZhbC4gIFNpbmNlIHdlIHN0
YXJ0ZWQgYXQgYSBsYXJnZSBpbml0aWFsIHZhbHVlLCB3ZSBkZWNyZWFzZQorICAgICAgLy8gdGhl
IHZhbHVlIGF0IGVhY2ggdGltZSBpbnRlcnZhbC4KKyAgICAgIGZ1bmN0aW9uIHZhbHVlVXBkYXRl
KHRpbWVJbnRlcnZhbEluZGV4KQorICAgICAgeworICAgICAgICAgIHJldHVybiAtc3RhcnRpbmdW
YWx1ZURlbHRhOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBjaGVja1Jlc3VsdChldmVudCkK
KyAgICAgIHsKKyAgICAgICAgICB2YXIgYnVmZmVyID0gZXZlbnQucmVuZGVyZWRCdWZmZXI7Cisg
ICAgICAgICAgcmVuZGVyZWREYXRhID0gYnVmZmVyLmdldENoYW5uZWxEYXRhKDApOworCisgICAg
ICAgICAgY29tcGFyZVNpZ25hbHMoImV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoKSIsIG1h
eEFsbG93ZWRFcnJvciwgcmVuZGVyZWREYXRhLCBjcmVhdGVFeHBvbmVudGlhbFJhbXBBcnJheSwg
dGltZVZhbHVlSW5mbywgZGlzY29udGludWl0eVRocmVzaG9sZCk7CisKKyAgICAgICAgICBmaW5p
c2hKU1Rlc3QoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZnVuY3Rpb24gcnVuVGVzdCgpCisg
ICAgICB7CisgICAgICAgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAg
ICAgICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgICAg
ICAgIGxheW91dFRlc3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKKyAgICAgICAgICB9CisK
KyAgICAgICAgICB3aW5kb3cuanNUZXN0SXNBc3luYyA9IHRydWU7CisKKyAgICAgICAgICAvLyBD
cmVhdGUgb2ZmbGluZSBhdWRpbyBjb250ZXh0LgorICAgICAgICAgIGNvbnRleHQgPSBuZXcgd2Vi
a2l0QXVkaW9Db250ZXh0KDIsIHJlbmRlckxlbmd0aCwgc2FtcGxlUmF0ZSk7CisgICAgICAgICAg
Y29uc3RhbnRCdWZmZXIgPSBjcmVhdGVDb25zdGFudEJ1ZmZlcihjb250ZXh0LCAxLCByZW5kZXJM
ZW5ndGgpOworCisgICAgICAgICAgLy8gV2UgdXNlIGFuIEF1ZGlvR2Fpbk5vZGUgaGVyZSBzaW1w
bHkgYXMgYSBjb252ZW5pZW50IHdheSB0byB0ZXN0IHRoZSBBdWRpb1BhcmFtCisgICAgICAgICAg
Ly8gYXV0b21hdGlvbiwgc2luY2UgaXQncyBlYXN5IHRvIHBhc3MgYSBjb25zdGFudCB2YWx1ZSB0
aHJvdWdoIHRoZSBub2RlLCBhdXRvbWF0ZSB0aGUKKyAgICAgICAgICAvLyAuZ2FpbiBhdHRyaWJ1
dGUgYW5kIG9ic2VydmUgdGhlIHJlc3VsdGluZyB2YWx1ZXMuCisKKyAgICAgICAgICBnYWluTm9k
ZSA9IGNvbnRleHQuY3JlYXRlR2Fpbk5vZGUoKTsKKworICAgICAgICAgIGJ1ZmZlclNvdXJjZSA9
IGNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7CisgICAgICAgICAgYnVmZmVyU291cmNlLmJ1
ZmZlciA9IGNvbnN0YW50QnVmZmVyOworICAgICAgICAgIGJ1ZmZlclNvdXJjZS5jb25uZWN0KGdh
aW5Ob2RlKTsKKyAgICAgICAgICBnYWluTm9kZS5jb25uZWN0KGNvbnRleHQuZGVzdGluYXRpb24p
OworCisgICAgICAgICAgLy8gQXQgZWFjaCB0aW1lIGludGVydmFsLCB3ZSBhZGp1c3QgdGhlIHZh
bHVlIGJ5IHN0YXJ0aW5nVmFsdWVEZWx0YS4gIEhvd2V2ZXIsIHRoZQorICAgICAgICAgIC8vIGV4
cG9uZW50aWFsIHJhbXAgZW5kIHZhbHVlIGlzIHRoZSB2YWx1ZSArLy0gc3RhcnRFbmRWYWx1ZUNo
YW5nZS4gIChXZSBhbHRlcm5hdGVseQorICAgICAgICAgIC8vIHNwZWNpZnkgdGhlIGVuZCB2YWx1
ZSB0byBiZSBncmVhdGVyIG9yIHNtYWxsZXIgdGhhbiB0aGUgc3RhcnRpbmcgdmFsdWUsIHRvIHRl
c3QgdGhlCisgICAgICAgICAgLy8gcmFtcCBnb2luZyB1cCBhbmQgZG93bi4pCisgICAgICAgICAg
Ly8KKyAgICAgICAgICAvLyBCeSBkb2luZyBpdCB0aGlzIHdheSwgd2UgZ2V0IGEgZGlzY29udGlu
dWl0eSBhdCBlYWNoIHRpbWUgaW50ZXJ2YWwgd2hpY2ggd2UgY2FuIHVzZSB0bworICAgICAgICAg
IC8vIHRlc3QgaWYgdGhlIHJhbXAgc3RhcnRlZCBhbmQgZW5kZWQgYXQgdGhlIGNvcnJlY3QgdGlt
ZS4KKyAgICAgICAgICB0aW1lVmFsdWVJbmZvID0gZG9BdXRvbWF0aW9uKGluaXRpYWxWYWx1ZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFZhbHVlRGVsdGEsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlUmFtcCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVXBkYXRlKTsKKworICAgICAgICAgIGJ1
ZmZlclNvdXJjZS5ub3RlT24oMCk7CisgICAgICAKKyAgICAgICAgICBjb250ZXh0Lm9uY29tcGxl
dGUgPSBjaGVja1Jlc3VsdDsKKyAgICAgICAgICBjb250ZXh0LnN0YXJ0UmVuZGVyaW5nKCk7Cisg
ICAgICB9CisKKyAgICAgIHJ1blRlc3QoKTsKKyAgICAgIHN1Y2Nlc3NmdWxseVBhcnNlZCA9IHRy
dWU7CisgICAgICAKKyAgICA8L3NjcmlwdD4KKworICAgIDxzY3JpcHQgc3JjPSIuLi9mYXN0L2pz
L3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorICA8L2JvZHk+Cis8L2h0bWw+
CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhdWRpby9yZXNvdXJjZXMvYXVkaW9wYXJhbS10
ZXN0aW5nLmpzIGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vcmVzb3VyY2VzL2F1ZGlvcGFyYW0tdGVz
dGluZy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5iYjczYjVmMWI0YWQ3NGIxOTE5MjZiZGM2M2JlMTUwZDg2NmYy
ZDhhCi0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vcmVzb3VyY2VzL2F1
ZGlvcGFyYW0tdGVzdGluZy5qcwpAQCAtMCwwICsxLDE5NCBAQAordmFyIHNhbXBsZVJhdGUgPSA0
NDEwMDsKKworLy8gTnVtYmVyIG9mIHRlc3RzIHRvIHJ1bi4KK3ZhciBudW1iZXJPZlRlc3RzID0g
MTAwOworCisvLyBUaW1lIGludGVydmFsIGJldHdlZW4gdmFsdWUgY2hhbmdlcy4gIEl0IGlzIGJl
c3QgaWYgMSAvIG51bWJlck9mVGVzdHMgaXMgbm90IGNsb3NlIHRvCisvLyB0aW1lSW50ZXJ2YWwu
Cit2YXIgdGltZUludGVydmFsID0gLjAzOworCisvLyBNYWtlIHN1cmUgd2UgcmVuZGVyIGxvbmcg
ZW5vdWdoIHRvIGNhcHR1cmUgYWxsIG9mIG91ciB0ZXN0IGRhdGEuCit2YXIgcmVuZGVyVGltZSA9
IChudW1iZXJPZlRlc3RzICsgMSkgKiB0aW1lSW50ZXJ2YWw7Cit2YXIgcmVuZGVyTGVuZ3RoID0g
dGltZVRvU2FtcGxlRnJhbWUocmVuZGVyVGltZSwgc2FtcGxlUmF0ZSk7CisKK3ZhciBjb250ZXh0
OworCisvLyBDcmVhdGUgYSBidWZmZXIgY29udGFpbmluZyB0aGUgc2FtZSBjb25zdGFudCB2YWx1
ZS4KK2Z1bmN0aW9uIGNyZWF0ZUNvbnN0YW50QnVmZmVyKGNvbnRleHQsIGNvbnN0YW50LCBsZW5n
dGgpIHsKKyAgICB2YXIgYnVmZmVyID0gY29udGV4dC5jcmVhdGVCdWZmZXIoMSwgbGVuZ3RoLCBj
b250ZXh0LnNhbXBsZVJhdGUpOworICAgIHZhciBuID0gYnVmZmVyLmxlbmd0aDsKKyAgICB2YXIg
ZGF0YSA9IGJ1ZmZlci5nZXRDaGFubmVsRGF0YSgwKTsKKworICAgIGZvciAodmFyIGsgPSAwOyBr
IDwgbjsgKytrKSB7CisgICAgICAgIGRhdGFba10gPSBjb25zdGFudDsKKyAgICB9CisKKyAgICBy
ZXR1cm4gYnVmZmVyOworfQorCisvLyBDcmVhdGUgYW4gZXhwb25lbnRpYWwgcmFtcCBzdGFydGlu
ZyBhdCB8c3RhcnRWYWx1ZXwgYW5kIGVuZGluZyBhdCB8ZW5kVmFsdWV8LiAgVGhlIHJhbXAgc3Rh
cnRzIGF0CisvLyB0aW1lIHxzdGFydFRpbWV8IGFuZCBlbmRzIGF0IHxlbmRUaW1lfC4gIChUaGUg
c3RhcnQgYW5kIGVuZCB0aW1lcyBhcmUgb25seSB1c2VkIHRvIGNvbXB1dGUgaG93CisvLyBtYW55
IHNhbXBsZXMgdG8gcmV0dXJuLikKK2Z1bmN0aW9uIGNyZWF0ZUV4cG9uZW50aWFsUmFtcEFycmF5
KHN0YXJ0VGltZSwgZW5kVGltZSwgc3RhcnRWYWx1ZSwgZW5kVmFsdWUsIHNhbXBsZVJhdGUpCit7
CisgICAgdmFyIHN0YXJ0RnJhbWUgPSB0aW1lVG9TYW1wbGVGcmFtZShzdGFydFRpbWUsIHNhbXBs
ZVJhdGUpOworICAgIHZhciBlbmRGcmFtZSA9IHRpbWVUb1NhbXBsZUZyYW1lKGVuZFRpbWUsIHNh
bXBsZVJhdGUpOworICAgIHZhciBsZW5ndGggPSBlbmRGcmFtZSAtIHN0YXJ0RnJhbWU7CisgICAg
dmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsZW5ndGgpOworCisgICAgdmFyIG11bHRpcGxpZXIgPSBN
YXRoLnBvdyhlbmRWYWx1ZSAvIHN0YXJ0VmFsdWUsIDEgLyBsZW5ndGgpOworICAgIAorICAgIGZv
ciAodmFyIGsgPSAwOyBrIDwgbGVuZ3RoOyArK2spIHsKKyAgICAgICAgYnVmZmVyW2tdID0gc3Rh
cnRWYWx1ZSAqIE1hdGgucG93KG11bHRpcGxpZXIsIGspOworICAgIH0KKworICAgIHJldHVybiBi
dWZmZXI7Cit9CisKKy8vIENvbXBhcmUgYSBzZWN0aW9uIG9mIHRoZSByZW5kZXJlZCBkYXRhIGFn
YWluc3Qgb3VyIGV4cGVjdGVkIHNpZ25hbC4KK2Z1bmN0aW9uIGNvbXBhcmVQYXJ0aWFsU2lnbmFs
cyhyZW5kZXJlZCwgZXhwZWN0ZWRGdW5jdGlvbiwgc3RhcnRUaW1lLCBlbmRUaW1lLCB2YWx1ZUlu
Zm8sIHNhbXBsZVJhdGUpCit7CisgICAgdmFyIHN0YXJ0U2FtcGxlID0gdGltZVRvU2FtcGxlRnJh
bWUoc3RhcnRUaW1lLCBzYW1wbGVSYXRlKTsKKyAgICB2YXIgZXhwZWN0ZWQgPSBleHBlY3RlZEZ1
bmN0aW9uKHN0YXJ0VGltZSwgZW5kVGltZSwgdmFsdWVJbmZvLnN0YXJ0VmFsdWUsIHZhbHVlSW5m
by5lbmRWYWx1ZSwgc2FtcGxlUmF0ZSk7CisKKyAgICB2YXIgbiA9IGV4cGVjdGVkLmxlbmd0aDsK
KyAgICB2YXIgbWF4RXJyb3IgPSAtMTsKKyAgICB2YXIgbWF4RXJyb3JJbmRleCA9IC0xOworICAg
IAorICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbjsgKytrKSB7CisgICAgICAgIHZhciBlcnJvciA9
IE1hdGguYWJzKHJlbmRlcmVkW3N0YXJ0U2FtcGxlICsga10gLSBleHBlY3RlZFtrXSk7CisgICAg
ICAgIGlmIChlcnJvciA+IG1heEVycm9yKSB7CisgICAgICAgICAgICBtYXhFcnJvciA9IGVycm9y
OworICAgICAgICAgICAgbWF4RXJyb3JJbmRleCA9IGs7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4ge21heEVycm9yIDogbWF4RXJyb3IsIGluZGV4IDogbWF4RXJyb3JJbmRleH07Cit9
CisKKy8vIEZpbmQgdGhlIGRpc2NvbnRpbnVpdGllcyBpbiB0aGUgZGF0YSBhbmQgY29tcGFyZSB0
aGUgbG9jYXRpb25zIG9mIHRoZSBkaXNjb250aW51aXRpZXMgd2l0aCB0aGUKKy8vIHRpbWVzIHRo
YXQgZGVmaW5lIHRoZSB0aW1lIGludGVydmFscy4gVGhlcmUgaXMgYSBkaXNjb250aW51aXR5IGlm
IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKy8vIHN1Y2Nlc3NpdmUgc2FtcGxlcyBleGNlZWRzIHRo
ZSB0aHJlc2hvbGQuCitmdW5jdGlvbiB2ZXJpZnlEaXNjb250aW51aXRpZXModmFsdWVzLCB0aW1l
cywgdGhyZXNob2xkKQoreworICAgIHZhciBuID0gdmFsdWVzLmxlbmd0aDsKKyAgICB2YXIgc3Vj
Y2VzcyA9IHRydWU7CisgICAgdmFyIGJhZExvY2F0aW9ucyA9IDA7CisgICAgdmFyIGJyZWFrcyA9
IFtdOworCisgICAgLy8gRmluZCBkaXNjb250aW51aXRpZXMuCisgICAgZm9yICh2YXIgayA9IDE7
IGsgPCBuOyArK2spIHsKKyAgICAgICAgaWYgKE1hdGguYWJzKHZhbHVlc1trXSAtIHZhbHVlc1tr
IC0gMV0pID4gdGhyZXNob2xkKSB7CisgICAgICAgICAgICBicmVha3MucHVzaChrKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIC8vIENvbXBhcmUgdGhlIGxvY2F0aW9uIG9mIGVhY2ggZGlzY29u
dGludWl0eSB3aXRoIHRoZSBlbmQgdGltZSBvZiBlYWNoIGludGVydmFsLiAoVGhlcmUgaXMgbm8K
KyAgICAvLyBkaXNjb250aW51aXR5IGF0IHRoZSBzdGFydCBvZiB0aGUgc2lnbmFsLikKKyAgICBm
b3IgKHZhciBrID0gMDsgayA8IGJyZWFrcy5sZW5ndGg7ICsraykgeworICAgICAgICB2YXIgZXhw
ZWN0ZWRTYW1wbGVGcmFtZSA9IHRpbWVUb1NhbXBsZUZyYW1lKHRpbWVzW2sgKyAxXSwgc2FtcGxl
UmF0ZSk7CisgICAgICAgIGlmIChicmVha3Nba10gIT0gZXhwZWN0ZWRTYW1wbGVGcmFtZSkgewor
ICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgKytiYWRMb2NhdGlvbnM7
CisgICAgICAgICAgICB0ZXN0RmFpbGVkKCJFeHBlY3RlZCBkaXNjb250aW51aXR5IGF0ICIgKyBl
eHBlY3RlZFNhbXBsZUZyYW1lICsgIiBidXQgZ290ICIgKyBicmVha3Nba10pOworICAgICAgICB9
CisgICAgfQorCisgICAgaWYgKGJhZExvY2F0aW9ucykgeworICAgICAgICB0ZXN0RmFpbGVkKGJh
ZExvY2F0aW9ucyArICIgZGlzY29udGludWl0aWVzIGF0IGluY29ycmVjdCBsb2NhdGlvbnMiKTsK
KyAgICB9IGVsc2UgeworICAgICAgICB0ZXN0UGFzc2VkKCJBbGwgIiArIChicmVha3MubGVuZ3Ro
ICsgMSkgKyAiIHRlc3RzIHN0YXJ0ZWQgYW5kIGVuZGVkIGF0IHRoZSBjb3JyZWN0IHRpbWUuIik7
CisgICAgfQorICAgIAorICAgIHJldHVybiBzdWNjZXNzOworfQorCisvLyBDb21wYXJlIHRoZSBy
ZW5kZXJlZCBkYXRhIHdpdGggdGhlIGV4cGVjdGVkIGRhdGEuCisvLworLy8gdGVzdE5hbWUgLSBz
dHJpbmcgZGVzY3JpYmluZyB0aGUgdGVzdAorLy8KKy8vIG1heEVycm9yIC0gbWF4aW11bSBhbGxv
d2VkIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVuZGVyZWQgZGF0YSBhbmQgdGhlIGV4cGVjdGVk
IGRhdGEKKy8vCisvLyByZW5kZXJlcmREYXRhIC0gYXJyYXkgY29udGFpbmluZyB0aGUgcmVuZGVy
ZWQgKGFjdHVhbCkgZGF0YQorLy8KKy8vIGV4cGVjdGVkRnVuY3Rpb24gLSBmdW5jdGlvbiB0byBj
b21wdXRlIHRoZSBleHBlY3RlZCBkYXRhCisvLworLy8gdGltZVZhbHVlSW5mbyAtIGFycmF5IGNv
bnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXJ0IGFuZCBlbmQgdGltZXMgYW5kIHRo
ZSBzdGFydCBhbmQgZW5kCisvLyB2YWx1ZXMgb2YgZWFjaCBpbnRlcnZhbC4KKy8vCisvLyBicmVh
a1RocmVzaG9sZCAtIHRocmVzaG9sZCB0byB1c2UgZm9yIGRldGVybWluaW5nIGRpc2NvbnRpbnVp
dGllcy4KK2Z1bmN0aW9uIGNvbXBhcmVTaWduYWxzKHRlc3ROYW1lLCBtYXhFcnJvciwgcmVuZGVy
ZWREYXRhLCBleHBlY3RlZEZ1bmN0aW9uLCB0aW1lVmFsdWVJbmZvLCBicmVha1RocmVzaG9sZCkK
K3sKKyAgICB2YXIgc3VjY2VzcyA9IHRydWU7CisgICAgdmFyIGZhaWxlZFRlc3RDb3VudCA9IDA7
CisgICAgdmFyIHRpbWVzID0gdGltZVZhbHVlSW5mby50aW1lczsKKyAgICB2YXIgdmFsdWVzID0g
dGltZVZhbHVlSW5mby52YWx1ZXM7CisgICAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoOworCisgICAg
c3VjY2VzcyA9IHZlcmlmeURpc2NvbnRpbnVpdGllcyhyZW5kZXJlZERhdGEsIHRpbWVzLCBicmVh
a1RocmVzaG9sZCk7CisKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IG47ICsraykgeworICAgICAg
ICB2YXIgcmVzdWx0ID0gY29tcGFyZVBhcnRpYWxTaWduYWxzKHJlbmRlcmVkRGF0YSwgZXhwZWN0
ZWRGdW5jdGlvbiwgdGltZXNba10sIHRpbWVzW2sgKyAxXSwgdmFsdWVzW2tdLCBzYW1wbGVSYXRl
KTsKKworICAgICAgICBpZiAocmVzdWx0Lm1heEVycm9yID4gbWF4RXJyb3IpIHsKKyAgICAgICAg
ICAgIHRlc3RGYWlsZWQoIkluY29ycmVjdCBnYWluIGZvciB0ZXN0ICIgKyBrICsgIi4gTWF4IGVy
cm9yID0gIiArIHJlc3VsdC5tYXhFcnJvciArICIgYXQgb2Zmc2V0ICIgKyAocmVzdWx0LmluZGV4
ICsgdGltZVRvU2FtcGxlRnJhbWUodGltZXNba10sIHNhbXBsZVJhdGUpKSk7CisgICAgICAgICAg
ICArK2ZhaWxlZFRlc3RDb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmYWlsZWRU
ZXN0Q291bnQpIHsKKyAgICAgICAgdGVzdEZhaWxlZChmYWlsZWRUZXN0Q291bnQgKyAiIHRlc3Rz
IGZhaWxlZCBvdXQgb2YgIiArIG4pOworICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgdGVzdFBhc3NlZCgiQWxsICIgKyBuICsgIiB0ZXN0cyBwYXNzZWQgd2l0
aGluIGFuIGFjY2VwdGFibGUgdG9sZXJhbmNlLiIpOworICAgIH0KKyAgICAgIAorICAgIGlmIChz
dWNjZXNzKSB7CisgICAgICAgIHRlc3RQYXNzZWQoIkF1ZGlvUGFyYW0gIiArIHRlc3ROYW1lICsg
IiB0ZXN0IHBhc3NlZC4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXN0RmFpbGVkKCJBdWRp
b1BhcmFtICIgKyB0ZXN0TmFtZSArICIgdGVzdCBmYWlsZWQuIik7CisgICAgfQorfQorCisvLyBS
dW4gYWxsIHRoZSBhdXRvbWF0aW9uIHRlc3RzLgorLy8KKy8vIGluaXRpYWxWYWx1ZSAtIFRoZSBp
bml0aWFsIHZhbHVlIG9mIHRoZSBmaXJzdCB0aW1lIGludGVydmFsLgorLy8KKy8vIGVuZFZhbHVl
RGVsdGFGdW5jdGlvbiAtIEhvdyBtdWNoIHRoZSBlbmQgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSB2
YWx1ZSBhdCB0aGUgc3RhcnQgb2YgdGhlCisvLyBpbnRlcnZhbC4KKy8vCisvLyBzZXRWYWx1ZUZ1
bmN0aW9uIC0gZnVuY3Rpb24gdGhhdCBzZXRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgYXQgdGhlIHN0
YXJ0IG9mIGEgdGltZSBpbnRlcnZhbC4KKy8vCisvLyBhdXRvbWF0aW9uRnVuY3Rpb24gLSBmdW5j
dGlvbiB0aGF0IHNldHMgdGhlIGVuZCB2YWx1ZSBmb3IgdGhlIHRpbWUgaW50ZXJ2YWwuICBJdCBz
cGVjaWZpZXMgaG93CisvLyB0aGUgdmFsdWUgYXBwcm9hY2hlcyB0aGUgZW5kIHZhbHVlLgorLy8K
Ky8vIHZhbHVlVXBkYXRlRnVuY3Rpb24gLSBUaGUgc3RhcnRpbmcgdmFsdWUgYXQgdGltZSBpbnRl
cnZhbCBrIGlzIGFkanVzdGVkIGJ5IHZhbHVlVXBkYXRlRnVuY3Rpb24oaykgdG8gZ2l2ZSB0aGUg
bmV3IHN0YXJ0aW5nIHZhbHVlIGF0IHRpbWUgaW50ZXJ2YWwgayArIDEuCisvLworLy8gQW4gb2Jq
ZWN0IGlzIHJldHVybmVkIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2Ygc3RhcnQgdGltZXMgZm9yIGVh
Y2ggdGltZSBpbnRlcnZhbCwgYW5kIGFuIGFycmF5CisvLyBnaXZpbmcgdGhlIHN0YXJ0IGFuZCBl
bmQgdmFsdWVzIGZvciB0aGUgaW50ZXJ2YWwuCitmdW5jdGlvbiBkb0F1dG9tYXRpb24oaW5pdGlh
bFZhbHVlLCBlbmRWYWx1ZURlbHRhRnVuY3Rpb24sIHNldFZhbHVlRnVuY3Rpb24sIGF1dG9tYXRp
b25GdW5jdGlvbiwgdmFsdWVVcGRhdGVGdW5jdGlvbikKK3sKKyAgICB2YXIgdGltZUluZm8gPSBb
MF07CisgICAgdmFyIHZhbHVlSW5mbyA9IFtdOworICAgIHZhciB2YWx1ZSA9IGluaXRpYWxWYWx1
ZTsKKyAgICAKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IG51bWJlck9mVGVzdHM7ICsraykgewor
ICAgICAgICB2YXIgc3RhcnRUaW1lID0gayAqIHRpbWVJbnRlcnZhbDsKKyAgICAgICAgdmFyIGVu
ZFRpbWUgPSAoayArIDEpICogdGltZUludGVydmFsOworICAgICAgICB2YXIgZW5kVmFsdWUgPSB2
YWx1ZSArIGVuZFZhbHVlRGVsdGFGdW5jdGlvbihrKTsKKworICAgICAgICAvLyBTZXQgdGhlIHZh
bHVlIGF0IHRoZSBzdGFydCBvZiB0aGUgdGltZSBpbnRlcnZhbC4KKyAgICAgICAgc2V0VmFsdWVG
dW5jdGlvbih2YWx1ZSwgc3RhcnRUaW1lKTsKKworICAgICAgICAvLyBTcGVjaWZ5IHRoZSB0YXJn
ZXQgdmFsdWUsIGFuZCBob3cgd2Ugc2hvdWxkIGFwcHJvYWNoIHRoZSB0YXJnZXQgdmFsdWUuCisg
ICAgICAgIGF1dG9tYXRpb25GdW5jdGlvbihlbmRWYWx1ZSwgc3RhcnRUaW1lLCBlbmRUaW1lKTsK
KworICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBzdGFydCB0aW1lcywgYW5kIHRoZSBzdGFy
dCBhbmQgdGFyZ2V0IHZhbHVlcyBmb3IgZWFjaCB0aW1lIGludGVydmFsLgorICAgICAgICB0aW1l
SW5mby5wdXNoKGVuZFRpbWUpOworICAgICAgICB2YWx1ZUluZm8ucHVzaCh7c3RhcnRWYWx1ZTog
dmFsdWUsIGVuZFZhbHVlIDogZW5kVmFsdWV9KTsKKworICAgICAgICB2YWx1ZSArPSB2YWx1ZVVw
ZGF0ZUZ1bmN0aW9uKGspOworICAgIH0KKworICAgIHJldHVybiB7dGltZXMgOiB0aW1lSW5mbywg
dmFsdWVzIDogdmFsdWVJbmZvfTsKK30K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128314</attachid>
            <date>2012-02-22 16:00:25 -0800</date>
            <delta_ts>2012-02-22 18:19:09 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78035-20120222160024.patch</filename>
            <type>text/plain</type>
            <size>17520</size>
            <attacher name="Raymond Toy">rtoy</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4NDgyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNTEyMjlhZTVkMGEzMThm
YWQ4NGNhYTM3ZTI4MzYyYjE4MjA5YTdhNS4uNzFmYzUwZjk2NWJiYjdiYzNhNjc1OGFhYzY4OTFm
MmM3NWE4MTU1MiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE2IEBACisyMDEyLTAyLTA4ICBSYXlt
b25kIFRveSAgPHJ0b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBleHBvbmVudGlhbFJhbXBUb1Zh
bHVlIGRvZXNuJ3QgdXNlIHN0YXJ0aW5nIHZhbHVlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD03ODAzNQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIFRlc3Q6IHdlYmF1ZGlvL2F1ZGlvcGFyYW0tZXhwb25lbnRp
YWxSYW1wVG9WYWx1ZUF0VGltZS5odG1sCisKKyAgICAgICAgKiB3ZWJhdWRpby9BdWRpb1BhcmFt
VGltZWxpbmUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9QYXJhbVRpbWVsaW5lOjp2YWx1
ZXNGb3JUaW1lUmFuZ2VJbXBsKTogU2V0CisgICAgICAgIHN0YXJ0aW5nIHZhbHVlIGZvciBleHBv
bmVudGlhbCByYW1wLgorCiAyMDEyLTAyLTIyICBTaGlueWEgS2F3YW5ha2EgIDxzaGlueWFrQGNo
cm9taXVtLm9yZz4KIAogICAgICAgICBmaXJzdFJlbmRlcmVyT2YoKSBzaG91bGQgYWxzbyByZXR1
cm4gYSBmYWxsYmFjayBlbGVtZW50IHJlbmRlcmVyIGluIE5vZGVSZW5kZXJpbmdDb250ZXh0Lgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvd2ViYXVkaW8vQXVkaW9QYXJhbVRpbWVsaW5lLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3dlYmF1ZGlvL0F1ZGlvUGFyYW1UaW1lbGluZS5jcHAKaW5kZXgg
ZWZmMWVhNzliMDEwYzljZDBiNDNmZTUyMjhmODc2MDJlMWFhN2IwMS4uY2Q4ZjUzNjc2MmE0Y2Uw
YzAzMDM1MzM5NjkxOGZkNjFjNWI1YzQyNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvd2Vi
YXVkaW8vQXVkaW9QYXJhbVRpbWVsaW5lLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS93ZWJhdWRp
by9BdWRpb1BhcmFtVGltZWxpbmUuY3BwCkBAIC0yNDIsNiArMjQyLDEzIEBAIGZsb2F0IEF1ZGlv
UGFyYW1UaW1lbGluZTo6dmFsdWVzRm9yVGltZVJhbmdlSW1wbChmbG9hdCBzdGFydFRpbWUsCiAg
ICAgICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGdvZXMgZXhwb25lbnRpYWxseSBmcm9tIHZhbHVl
MSB0byB2YWx1ZTIgaW4gYSBkdXJhdGlvbiBvZiBkZWx0YVRpbWUgc2Vjb25kcyAoY29ycmVzcG9u
ZGluZyB0byBudW1TYW1wbGVGcmFtZXMpLgogICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgdGhl
IHBlci1zYW1wbGUgbXVsdGlwbGllci4KICAgICAgICAgICAgICAgICBmbG9hdCBtdWx0aXBsaWVy
ID0gcG93Zih2YWx1ZTIgLyB2YWx1ZTEsIDEgLyBudW1TYW1wbGVGcmFtZXMpOworCisgICAgICAg
ICAgICAgICAgLy8gU2V0IHRoZSBzdGFydGluZyB2YWx1ZSBvZiB0aGUgZXhwb25lbnRpYWwgcmFt
cC4gVGhpcyBpcyB0aGUgc2FtZSBhcyBtdWx0aXBsaWVyIF4KKyAgICAgICAgICAgICAgICAvLyBB
dWRpb1V0aWxpdGllczo6dGltZVRvU2FtcGxlRnJhbWUoY3VycmVudFRpbWUgLSB0aW1lMSwgc2Ft
cGxlUmF0ZSksIGJ1dCBpcyBtb3JlCisgICAgICAgICAgICAgICAgLy8gYWNjdXJhdGUsIGVzcGVj
aWFsbHkgaWYgbXVsdGlwbGllciBpcyBjbG9zZSB0byAxLgorICAgICAgICAgICAgICAgIHZhbHVl
ID0gdmFsdWUxICogcG93Zih2YWx1ZTIgLyB2YWx1ZTEsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEF1ZGlvVXRpbGl0aWVzOjp0aW1lVG9TYW1wbGVGcmFtZShjdXJyZW50
VGltZSAtIHRpbWUxLCBzYW1wbGVSYXRlKSAvIG51bVNhbXBsZUZyYW1lcyk7CisKICAgICAgICAg
ICAgICAgICBmb3IgKDsgd3JpdGVJbmRleCA8IGZpbGxUb0ZyYW1lOyArK3dyaXRlSW5kZXgpIHsK
ICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW3dyaXRlSW5kZXhdID0gdmFsdWU7CiAgICAgICAg
ICAgICAgICAgICAgIHZhbHVlICo9IG11bHRpcGxpZXI7CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0
cy9DaGFuZ2VMb2cgYi9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKaW5kZXggODc4OWNhZGRjMzMwNWQ2
YThlZTI4ZmRmYTk1MjQ0OTA1ZjhkNjlmMi4uODY5YmY3YTA0ZTFiZTVkZjVhMDFlMjQ4YjQyZmZl
NzcyNjcyZWYyNCAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCisrKyBiL0xheW91
dFRlc3RzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDIwIEBACisyMDEyLTAyLTA4ICBSYXltb25kIFRv
eSAgPHJ0b3lAZ29vZ2xlLmNvbT4KKworICAgICAgICBleHBvbmVudGlhbFJhbXBUb1ZhbHVlIGRv
ZXNuJ3QgdXNlIHN0YXJ0aW5nIHZhbHVlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD03ODAzNQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgICogd2ViYXVkaW8vYXVkaW9wYXJhbS1leHBvbmVudGlhbFJhbXBUb1Zh
bHVlQXRUaW1lLWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogd2ViYXVkaW8vYXVkaW9w
YXJhbS1leHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1lLmh0bWw6IEFkZGVkLgorICAgICAgICAq
IHdlYmF1ZGlvL3Jlc291cmNlcy9hdWRpb3BhcmFtLXRlc3RpbmcuanM6IEFkZGVkLgorICAgICAg
ICAoY3JlYXRlQ29uc3RhbnRCdWZmZXIpOgorICAgICAgICAoY3JlYXRlRXhwb25lbnRpYWxSYW1w
QXJyYXkpOgorICAgICAgICAoY29tcGFyZVBhcnRpYWxTaWduYWxzKToKKyAgICAgICAgKHZlcmlm
eURpc2NvbnRpbnVpdGllcyk6CisgICAgICAgIChjb21wYXJlU2lnbmFscyk6CisgICAgICAgIChk
b0F1dG9tYXRpb24pOgorCiAyMDEyLTAyLTIyICBZdXRhIEtpdGFtdXJhICA8eXV0YWtAY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIFtDaHJvbWl1bV0gVW5yZXZpZXdlZCwgcmVndWxhciBtYWludGVu
YW5jZSBvZiB0ZXN0IGV4cGVjdGF0aW9ucy4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL3dlYmF1
ZGlvL2F1ZGlvcGFyYW0tZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZS1leHBlY3RlZC50eHQg
Yi9MYXlvdXRUZXN0cy93ZWJhdWRpby9hdWRpb3BhcmFtLWV4cG9uZW50aWFsUmFtcFRvVmFsdWVB
dFRpbWUtZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjZjMWZkOWQyOTIxYmNkMjRhNzkyMDQwYWZj
YTcxNmVkYzY1NTc2YzgKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy93ZWJhdWRpby9h
dWRpb3BhcmFtLWV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUtZXhwZWN0ZWQudHh0CkBAIC0w
LDAgKzEsMTEgQEAKK1Rlc3QgQXVkaW9QYXJhbSBleHBvbmVudGlhbFJhbXBUb1ZhbHVlQXRUaW1l
KCkgZnVuY3Rpb25hbGl0eS4KKworT24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9m
ICJQQVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgorCitQQVNTIEFs
bCAxMDAgdGVzdHMgc3RhcnRlZCBhbmQgZW5kZWQgYXQgdGhlIGNvcnJlY3QgdGltZS4KK1BBU1Mg
QWxsIDEwMCB0ZXN0cyBwYXNzZWQgd2l0aGluIGFuIGFjY2VwdGFibGUgdG9sZXJhbmNlLgorUEFT
UyBBdWRpb1BhcmFtIGV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoKSB0ZXN0IHBhc3NlZC4K
K1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCmRpZmYg
LS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhdWRpby9hdWRpb3BhcmFtLWV4cG9uZW50aWFsUmFtcFRv
VmFsdWVBdFRpbWUuaHRtbCBiL0xheW91dFRlc3RzL3dlYmF1ZGlvL2F1ZGlvcGFyYW0tZXhwb25l
bnRpYWxSYW1wVG9WYWx1ZUF0VGltZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjNlNjJmODQyMzY2MThiNDEx
ZGEyNTM3OTVmYWM5OWE5NGQ5NzBkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy93
ZWJhdWRpby9hdWRpb3BhcmFtLWV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUuaHRtbApAQCAt
MCwwICsxLDE0NCBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQu
MDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKyAgPGhlYWQ+CisgICAgPHNjcmlwdCBzcmM9
InJlc291cmNlcy9hdWRpby10ZXN0aW5nLmpzIj48L3NjcmlwdD4KKyAgICA8c2NyaXB0IHNyYz0i
cmVzb3VyY2VzL2F1ZGlvcGFyYW0tdGVzdGluZy5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBz
cmM9Ii4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKyAgPC9o
ZWFkPgorCisgIDxib2R5PgorICAgIDxkaXYgaWQ9ImRlc2NyaXB0aW9uIj48L2Rpdj4KKyAgICA8
ZGl2IGlkPSJjb25zb2xlIj48L2Rpdj4KKworICAgIDxzY3JpcHQ+CisgICAgICBkZXNjcmlwdGlv
bigiVGVzdCBBdWRpb1BhcmFtIGV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoKSBmdW5jdGlv
bmFsaXR5LiIpOworCisgICAgICAvLyBQbGF5IGEgbG9uZyBEQyBzaWduYWwgb3V0IHRocm91Z2gg
YW4gQXVkaW9HYWluTm9kZSwgYW5kIGNhbGwgc2V0VmFsdWVBdFRpbWUoKSBhbmQKKyAgICAgIC8v
IGV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoKSBhdCByZWd1bGFyIGludGVydmFscyB0byBz
ZXQgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgdmFsdWVzCisgICAgICAvLyBmb3IgYW4gZXhwb25l
bnRpYWwgcmFtcC4gIEVhY2ggdGltZSBpbnRlcnZhbCBoYXMgYSByYW1wIHdpdGggYSBkaWZmZXJl
bnQgc3RhcnRpbmcgYW5kCisgICAgICAvLyBlbmRpbmcgdmFsdWUgc28gdGhhdCB0aGVyZSBpcyBh
IGRpc2NvbnRpbnVpdHkgYXQgZWFjaCB0aW1lIGludGVydmFsIGJvdW5kYXJ5LiAgVGhlCisgICAg
ICAvLyBkaXNjb250aW51aXR5IGlzIGZvciB0ZXN0aW5nIHRpbWluZy4gIEFsc28sIHdlIGFsdGVy
bmF0ZSBiZXR3ZWVuIGFuIGluY3JlYXNpbmcgYW5kCisgICAgICAvLyBkZWNyZWFzaW5nIHJhbXAg
Zm9yIGVhY2ggaW50ZXJ2YWwuCisKKyAgICAgIC8vIE1heCBhbGxvd2VkIGRpZmZlcmVuY2UgYmV0
d2VlbiB0aGUgcmVuZGVyZWQgZGF0YSBhbmQgdGhlIGV4cGVjdGVkIHJlc3VsdC4KKyAgICAgIHZh
ciBtYXhBbGxvd2VkRXJyb3IgPSA2Ljc1ZS00OworCisgICAgICAvLyBJbmZvcm1hdGlvbiBhYm91
dCB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyB0aW1lcyBhbmQgc3RhcnRpbmcgYW5kIGVuZGluZyB2
YWx1ZXMgZm9yIGVhY2gKKyAgICAgIC8vIHRpbWUgaW50ZXJ2YWwuCisgICAgICB2YXIgdGltZVZh
bHVlSW5mbzsKKworICAgICAgLy8gVGhlIEF1ZGlvR2Fpbk5vZGUgc3RhcnRzIHdpdGggdGhpcyB2
YWx1ZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAgdmFyIGluaXRpYWxWYWx1
ZSA9IDEwMDsKKworICAgICAgLy8gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydGluZyB2YWx1
ZXMgYmV0d2VlbiBlYWNoIHRpbWUgaW50ZXJ2YWwuCisgICAgICB2YXIgc3RhcnRpbmdWYWx1ZURl
bHRhID0gaW5pdGlhbFZhbHVlIC8gbnVtYmVyT2ZUZXN0czsKKyAgICAgIAorICAgICAgLy8gRWFj
aCBleHBvbmVudGlhbCByYW1wIHdpbGwgaW5jcmVhc2Ugb3IgZGVjcmVhc2UgYnkgdGhpcyBtdWNo
IGZyb20gdGhlIHN0YXJ0IHRvIHRoZSBlbmQgb2YKKyAgICAgIC8vIHRoZSB0aW1lIGludGVydmFs
LiAgV2UgY2hvb3NlIGhhbGYgb2Ygc3RhcnRpbmdWYWx1ZURlbHRhIHNvIHRoYXQgdGhlIGVuZGlu
ZyB2YWx1ZSBvZiB0aGUKKyAgICAgIC8vIHJhbXAgd2lsbCBiZSBkaXN0aW5jdCBmcm9tIHRoZSBz
dGFydGluZyB2YWx1ZSBvZiB0aGUgcmFtcCBmb3IgbmV4dCB0aW1lIGludGVydmFsLiAgVGhpcwor
ICAgICAgLy8gYWxsb3dzIHVzIHRvIGRldGVjdCB3aGVyZSB0aGUgcmFtcCBiZWdpbnMgYW5kIGVu
ZHMuCisgICAgICB2YXIgc3RhcnRFbmRWYWx1ZUNoYW5nZSA9IHN0YXJ0aW5nVmFsdWVEZWx0YSAv
IDI7CisKKyAgICAgIC8vIFRocmVzaG9sZCB0byB1c2UgZm9yIGRldGVjdGluZyBkaXNjb250aW51
aXRpZXMgdGhhdCBzaG91bGQgYXBwZWFyIGF0IGVhY2ggdGltZSBpbnRlcnZhbC4KKyAgICAgIHZh
ciBkaXNjb250aW51aXR5VGhyZXNob2xkID0gc3RhcnRFbmRWYWx1ZUNoYW5nZSAvIDI7CisKKyAg
ICAgIHZhciBnYWluTm9kZTsKKyAgICAgIAorICAgICAgdmFyIGNvbnN0YW50QnVmZmVyOworICAg
ICAgdmFyIGJ1ZmZlclNvdXJjZTsKKworICAgICAgLy8gUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJl
dHdlZW4gdGhlIHN0YXJ0aW5nIHZhbHVlIGFuZCB0aGUgZW5kaW5nIHZhbHVlIGZvciB0aW1lIGlu
dGVydmFsCisgICAgICAvLyB8dGltZUludGVydmFsSW5kZXh8LiAgV2UgYWx0ZXJuYXRlIGJldHdl
ZW4gYW4gZW5kIHZhbHVlIHRoYXQgaXMgYWJvdmUgb3IgYmVsb3cgdGhlIHN0YXJ0aW5nCisgICAg
ICAvLyB2YWx1ZS4KKyAgICAgIGZ1bmN0aW9uIGVuZFZhbHVlRGVsdGEodGltZUludGVydmFsSW5k
ZXgpCisgICAgICB7CisgICAgICAgICAgaWYgKHRpbWVJbnRlcnZhbEluZGV4ICYgMSkgeworICAg
ICAgICAgICAgICByZXR1cm4gLXN0YXJ0RW5kVmFsdWVDaGFuZ2U7CisgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0RW5kVmFsdWVDaGFuZ2U7CisgICAgICAgICAg
fQorICAgICAgfQorCisgICAgICAvLyBTZXQgdGhlIGdhaW4gbm9kZSB2YWx1ZSB0byB0aGUgc3Bl
Y2lmaWVkIHZhbHVlIGF0IHRoZSBzcGVjaWZpZWQgdGltZS4KKyAgICAgIGZ1bmN0aW9uIHNldFZh
bHVlKHZhbHVlLCB0aW1lKQorICAgICAgeworICAgICAgICAgIGdhaW5Ob2RlLmdhaW4uc2V0VmFs
dWVBdFRpbWUodmFsdWUsIHRpbWUpOworICAgICAgfQorCisgICAgICAvLyBHZW5lcmF0ZSBhbiBl
eHBvbmVudGlhbCByYW1wIGVuZGluZyBhdCB0aW1lIHxlbmRUaW1lfCB3aXRoIGFuIGVuZGluZyB2
YWx1ZSBvZiB8dmFsdWV8LgorICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVSYW1wKHZhbHVlLCBzdGFy
dFRpbWUsIGVuZFRpbWUpCisgICAgICB7CisgICAgICAgICAgLy8gfHN0YXJ0VGltZXwgaXMgaWdu
b3JlZCBiZWNhdXNlIHRoZSBleHBvbmVudGlhbCByYW1wCisgICAgICAgICAgLy8gdXNlcyB0aGUg
dmFsdWUgZnJvbSB0aGUgc2V0VmFsdWVBdFRpbWUoKSBjYWxsIGFib3ZlLgorICAgICAgICAgIGdh
aW5Ob2RlLmdhaW4uZXhwb25lbnRpYWxSYW1wVG9WYWx1ZUF0VGltZSh2YWx1ZSwgZW5kVGltZSkK
KyAgICAgIH0KKyAgICAgIAorICAgICAgLy8gUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4g
dGhlIHN0YXJ0aW5nIHZhbHVlIGF0IHx0aW1lSW50ZXJ2YWxJbmRleHwgYW5kIHRoZSBzdGFydGlu
ZworICAgICAgLy8gdmFsdWUgYXQgdGhlIG5leHQgdGltZSBpbnRlcnZhbC4gIFNpbmNlIHdlIHN0
YXJ0ZWQgYXQgYSBsYXJnZSBpbml0aWFsIHZhbHVlLCB3ZSBkZWNyZWFzZQorICAgICAgLy8gdGhl
IHZhbHVlIGF0IGVhY2ggdGltZSBpbnRlcnZhbC4KKyAgICAgIGZ1bmN0aW9uIHZhbHVlVXBkYXRl
KHRpbWVJbnRlcnZhbEluZGV4KQorICAgICAgeworICAgICAgICAgIHJldHVybiAtc3RhcnRpbmdW
YWx1ZURlbHRhOworICAgICAgfQorCisgICAgICBmdW5jdGlvbiBjaGVja1Jlc3VsdChldmVudCkK
KyAgICAgIHsKKyAgICAgICAgICB2YXIgYnVmZmVyID0gZXZlbnQucmVuZGVyZWRCdWZmZXI7Cisg
ICAgICAgICAgcmVuZGVyZWREYXRhID0gYnVmZmVyLmdldENoYW5uZWxEYXRhKDApOworCisgICAg
ICAgICAgY29tcGFyZVNpZ25hbHMoImV4cG9uZW50aWFsUmFtcFRvVmFsdWVBdFRpbWUoKSIsIG1h
eEFsbG93ZWRFcnJvciwgcmVuZGVyZWREYXRhLCBjcmVhdGVFeHBvbmVudGlhbFJhbXBBcnJheSwg
dGltZVZhbHVlSW5mbywgZGlzY29udGludWl0eVRocmVzaG9sZCk7CisKKyAgICAgICAgICBmaW5p
c2hKU1Rlc3QoKTsKKyAgICAgIH0KKyAgICAgIAorICAgICAgZnVuY3Rpb24gcnVuVGVzdCgpCisg
ICAgICB7CisgICAgICAgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAg
ICAgICAgICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgICAgICAg
ICAgIGxheW91dFRlc3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKKyAgICAgICAgICB9CisK
KyAgICAgICAgICB3aW5kb3cuanNUZXN0SXNBc3luYyA9IHRydWU7CisKKyAgICAgICAgICAvLyBD
cmVhdGUgb2ZmbGluZSBhdWRpbyBjb250ZXh0LgorICAgICAgICAgIGNvbnRleHQgPSBuZXcgd2Vi
a2l0QXVkaW9Db250ZXh0KDIsIHJlbmRlckxlbmd0aCwgc2FtcGxlUmF0ZSk7CisgICAgICAgICAg
Y29uc3RhbnRCdWZmZXIgPSBjcmVhdGVDb25zdGFudEJ1ZmZlcihjb250ZXh0LCAxLCByZW5kZXJM
ZW5ndGgpOworCisgICAgICAgICAgLy8gV2UgdXNlIGFuIEF1ZGlvR2Fpbk5vZGUgaGVyZSBzaW1w
bHkgYXMgYSBjb252ZW5pZW50IHdheSB0byB0ZXN0IHRoZSBBdWRpb1BhcmFtCisgICAgICAgICAg
Ly8gYXV0b21hdGlvbiwgc2luY2UgaXQncyBlYXN5IHRvIHBhc3MgYSBjb25zdGFudCB2YWx1ZSB0
aHJvdWdoIHRoZSBub2RlLCBhdXRvbWF0ZSB0aGUKKyAgICAgICAgICAvLyAuZ2FpbiBhdHRyaWJ1
dGUgYW5kIG9ic2VydmUgdGhlIHJlc3VsdGluZyB2YWx1ZXMuCisKKyAgICAgICAgICBnYWluTm9k
ZSA9IGNvbnRleHQuY3JlYXRlR2Fpbk5vZGUoKTsKKworICAgICAgICAgIGJ1ZmZlclNvdXJjZSA9
IGNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7CisgICAgICAgICAgYnVmZmVyU291cmNlLmJ1
ZmZlciA9IGNvbnN0YW50QnVmZmVyOworICAgICAgICAgIGJ1ZmZlclNvdXJjZS5jb25uZWN0KGdh
aW5Ob2RlKTsKKyAgICAgICAgICBnYWluTm9kZS5jb25uZWN0KGNvbnRleHQuZGVzdGluYXRpb24p
OworCisgICAgICAgICAgLy8gQXQgZWFjaCB0aW1lIGludGVydmFsLCB3ZSBhZGp1c3QgdGhlIHZh
bHVlIGJ5IHN0YXJ0aW5nVmFsdWVEZWx0YS4gIEhvd2V2ZXIsIHRoZQorICAgICAgICAgIC8vIGV4
cG9uZW50aWFsIHJhbXAgZW5kIHZhbHVlIGlzIHRoZSB2YWx1ZSArLy0gc3RhcnRFbmRWYWx1ZUNo
YW5nZS4gIChXZSBhbHRlcm5hdGVseQorICAgICAgICAgIC8vIHNwZWNpZnkgdGhlIGVuZCB2YWx1
ZSB0byBiZSBncmVhdGVyIG9yIHNtYWxsZXIgdGhhbiB0aGUgc3RhcnRpbmcgdmFsdWUsIHRvIHRl
c3QgdGhlCisgICAgICAgICAgLy8gcmFtcCBnb2luZyB1cCBhbmQgZG93bi4pCisgICAgICAgICAg
Ly8KKyAgICAgICAgICAvLyBCeSBkb2luZyBpdCB0aGlzIHdheSwgd2UgZ2V0IGEgZGlzY29udGlu
dWl0eSBhdCBlYWNoIHRpbWUgaW50ZXJ2YWwgd2hpY2ggd2UgY2FuIHVzZSB0bworICAgICAgICAg
IC8vIHRlc3QgaWYgdGhlIHJhbXAgc3RhcnRlZCBhbmQgZW5kZWQgYXQgdGhlIGNvcnJlY3QgdGlt
ZS4KKyAgICAgICAgICB0aW1lVmFsdWVJbmZvID0gZG9BdXRvbWF0aW9uKGluaXRpYWxWYWx1ZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFZhbHVlRGVsdGEsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlUmFtcCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVXBkYXRlKTsKKworICAgICAgICAgIGJ1
ZmZlclNvdXJjZS5ub3RlT24oMCk7CisgICAgICAKKyAgICAgICAgICBjb250ZXh0Lm9uY29tcGxl
dGUgPSBjaGVja1Jlc3VsdDsKKyAgICAgICAgICBjb250ZXh0LnN0YXJ0UmVuZGVyaW5nKCk7Cisg
ICAgICB9CisKKyAgICAgIHJ1blRlc3QoKTsKKyAgICAgIHN1Y2Nlc3NmdWxseVBhcnNlZCA9IHRy
dWU7CisgICAgICAKKyAgICA8L3NjcmlwdD4KKworICAgIDxzY3JpcHQgc3JjPSIuLi9mYXN0L2pz
L3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorICA8L2JvZHk+Cis8L2h0bWw+
CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy93ZWJhdWRpby9yZXNvdXJjZXMvYXVkaW9wYXJhbS10
ZXN0aW5nLmpzIGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vcmVzb3VyY2VzL2F1ZGlvcGFyYW0tdGVz
dGluZy5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5jY2EzNGM5NmQwYjE4MzlmMjBkYWNlZjU5N2JiMGFlNmNlNmU4
MTE0Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvd2ViYXVkaW8vcmVzb3VyY2VzL2F1
ZGlvcGFyYW0tdGVzdGluZy5qcwpAQCAtMCwwICsxLDE5NCBAQAordmFyIHNhbXBsZVJhdGUgPSA0
NDEwMDsKKworLy8gTnVtYmVyIG9mIHRlc3RzIHRvIHJ1bi4KK3ZhciBudW1iZXJPZlRlc3RzID0g
MTAwOworCisvLyBUaW1lIGludGVydmFsIGJldHdlZW4gdmFsdWUgY2hhbmdlcy4gIEl0IGlzIGJl
c3QgaWYgMSAvIG51bWJlck9mVGVzdHMgaXMgbm90IGNsb3NlIHRvCisvLyB0aW1lSW50ZXJ2YWwu
Cit2YXIgdGltZUludGVydmFsID0gLjAzOworCisvLyBNYWtlIHN1cmUgd2UgcmVuZGVyIGxvbmcg
ZW5vdWdoIHRvIGNhcHR1cmUgYWxsIG9mIG91ciB0ZXN0IGRhdGEuCit2YXIgcmVuZGVyVGltZSA9
IChudW1iZXJPZlRlc3RzICsgMSkgKiB0aW1lSW50ZXJ2YWw7Cit2YXIgcmVuZGVyTGVuZ3RoID0g
dGltZVRvU2FtcGxlRnJhbWUocmVuZGVyVGltZSwgc2FtcGxlUmF0ZSk7CisKK3ZhciBjb250ZXh0
OworCisvLyBDcmVhdGUgYSBidWZmZXIgY29udGFpbmluZyB0aGUgc2FtZSBjb25zdGFudCB2YWx1
ZS4KK2Z1bmN0aW9uIGNyZWF0ZUNvbnN0YW50QnVmZmVyKGNvbnRleHQsIGNvbnN0YW50LCBsZW5n
dGgpIHsKKyAgICB2YXIgYnVmZmVyID0gY29udGV4dC5jcmVhdGVCdWZmZXIoMSwgbGVuZ3RoLCBj
b250ZXh0LnNhbXBsZVJhdGUpOworICAgIHZhciBuID0gYnVmZmVyLmxlbmd0aDsKKyAgICB2YXIg
ZGF0YSA9IGJ1ZmZlci5nZXRDaGFubmVsRGF0YSgwKTsKKworICAgIGZvciAodmFyIGsgPSAwOyBr
IDwgbjsgKytrKSB7CisgICAgICAgIGRhdGFba10gPSBjb25zdGFudDsKKyAgICB9CisKKyAgICBy
ZXR1cm4gYnVmZmVyOworfQorCisvLyBDcmVhdGUgYW4gZXhwb25lbnRpYWwgcmFtcCBzdGFydGlu
ZyBhdCB8c3RhcnRWYWx1ZXwgYW5kIGVuZGluZyBhdCB8ZW5kVmFsdWV8LiAgVGhlIHJhbXAgc3Rh
cnRzIGF0CisvLyB0aW1lIHxzdGFydFRpbWV8IGFuZCBlbmRzIGF0IHxlbmRUaW1lfC4gIChUaGUg
c3RhcnQgYW5kIGVuZCB0aW1lcyBhcmUgb25seSB1c2VkIHRvIGNvbXB1dGUgaG93CisvLyBtYW55
IHNhbXBsZXMgdG8gcmV0dXJuLikKK2Z1bmN0aW9uIGNyZWF0ZUV4cG9uZW50aWFsUmFtcEFycmF5
KHN0YXJ0VGltZSwgZW5kVGltZSwgc3RhcnRWYWx1ZSwgZW5kVmFsdWUsIHNhbXBsZVJhdGUpCit7
CisgICAgdmFyIHN0YXJ0RnJhbWUgPSB0aW1lVG9TYW1wbGVGcmFtZShzdGFydFRpbWUsIHNhbXBs
ZVJhdGUpOworICAgIHZhciBlbmRGcmFtZSA9IHRpbWVUb1NhbXBsZUZyYW1lKGVuZFRpbWUsIHNh
bXBsZVJhdGUpOworICAgIHZhciBsZW5ndGggPSBlbmRGcmFtZSAtIHN0YXJ0RnJhbWU7CisgICAg
dmFyIGJ1ZmZlciA9IG5ldyBBcnJheShsZW5ndGgpOworCisgICAgdmFyIG11bHRpcGxpZXIgPSBN
YXRoLnBvdyhlbmRWYWx1ZSAvIHN0YXJ0VmFsdWUsIDEgLyBsZW5ndGgpOworICAgIAorICAgIGZv
ciAodmFyIGsgPSAwOyBrIDwgbGVuZ3RoOyArK2spIHsKKyAgICAgICAgYnVmZmVyW2tdID0gc3Rh
cnRWYWx1ZSAqIE1hdGgucG93KG11bHRpcGxpZXIsIGspOworICAgIH0KKworICAgIHJldHVybiBi
dWZmZXI7Cit9CisKKy8vIENvbXBhcmUgYSBzZWN0aW9uIG9mIHRoZSByZW5kZXJlZCBkYXRhIGFn
YWluc3Qgb3VyIGV4cGVjdGVkIHNpZ25hbC4KK2Z1bmN0aW9uIGNvbXBhcmVQYXJ0aWFsU2lnbmFs
cyhyZW5kZXJlZCwgZXhwZWN0ZWRGdW5jdGlvbiwgc3RhcnRUaW1lLCBlbmRUaW1lLCB2YWx1ZUlu
Zm8sIHNhbXBsZVJhdGUpCit7CisgICAgdmFyIHN0YXJ0U2FtcGxlID0gdGltZVRvU2FtcGxlRnJh
bWUoc3RhcnRUaW1lLCBzYW1wbGVSYXRlKTsKKyAgICB2YXIgZXhwZWN0ZWQgPSBleHBlY3RlZEZ1
bmN0aW9uKHN0YXJ0VGltZSwgZW5kVGltZSwgdmFsdWVJbmZvLnN0YXJ0VmFsdWUsIHZhbHVlSW5m
by5lbmRWYWx1ZSwgc2FtcGxlUmF0ZSk7CisKKyAgICB2YXIgbiA9IGV4cGVjdGVkLmxlbmd0aDsK
KyAgICB2YXIgbWF4RXJyb3IgPSAtMTsKKyAgICB2YXIgbWF4RXJyb3JJbmRleCA9IC0xOworICAg
IAorICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbjsgKytrKSB7CisgICAgICAgIHZhciBlcnJvciA9
IE1hdGguYWJzKHJlbmRlcmVkW3N0YXJ0U2FtcGxlICsga10gLSBleHBlY3RlZFtrXSk7CisgICAg
ICAgIGlmIChlcnJvciA+IG1heEVycm9yKSB7CisgICAgICAgICAgICBtYXhFcnJvciA9IGVycm9y
OworICAgICAgICAgICAgbWF4RXJyb3JJbmRleCA9IGs7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4ge21heEVycm9yIDogbWF4RXJyb3IsIGluZGV4IDogbWF4RXJyb3JJbmRleH07Cit9
CisKKy8vIEZpbmQgdGhlIGRpc2NvbnRpbnVpdGllcyBpbiB0aGUgZGF0YSBhbmQgY29tcGFyZSB0
aGUgbG9jYXRpb25zIG9mIHRoZSBkaXNjb250aW51aXRpZXMgd2l0aCB0aGUKKy8vIHRpbWVzIHRo
YXQgZGVmaW5lIHRoZSB0aW1lIGludGVydmFscy4gVGhlcmUgaXMgYSBkaXNjb250aW51aXR5IGlm
IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKy8vIHN1Y2Nlc3NpdmUgc2FtcGxlcyBleGNlZWRzIHRo
ZSB0aHJlc2hvbGQuCitmdW5jdGlvbiB2ZXJpZnlEaXNjb250aW51aXRpZXModmFsdWVzLCB0aW1l
cywgdGhyZXNob2xkKQoreworICAgIHZhciBuID0gdmFsdWVzLmxlbmd0aDsKKyAgICB2YXIgc3Vj
Y2VzcyA9IHRydWU7CisgICAgdmFyIGJhZExvY2F0aW9ucyA9IDA7CisgICAgdmFyIGJyZWFrcyA9
IFtdOworCisgICAgLy8gRmluZCBkaXNjb250aW51aXRpZXMuCisgICAgZm9yICh2YXIgayA9IDE7
IGsgPCBuOyArK2spIHsKKyAgICAgICAgaWYgKE1hdGguYWJzKHZhbHVlc1trXSAtIHZhbHVlc1tr
IC0gMV0pID4gdGhyZXNob2xkKSB7CisgICAgICAgICAgICBicmVha3MucHVzaChrKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIC8vIENvbXBhcmUgdGhlIGxvY2F0aW9uIG9mIGVhY2ggZGlzY29u
dGludWl0eSB3aXRoIHRoZSBlbmQgdGltZSBvZiBlYWNoIGludGVydmFsLiAoVGhlcmUgaXMgbm8K
KyAgICAvLyBkaXNjb250aW51aXR5IGF0IHRoZSBzdGFydCBvZiB0aGUgc2lnbmFsLikKKyAgICBm
b3IgKHZhciBrID0gMDsgayA8IGJyZWFrcy5sZW5ndGg7ICsraykgeworICAgICAgICB2YXIgZXhw
ZWN0ZWRTYW1wbGVGcmFtZSA9IHRpbWVUb1NhbXBsZUZyYW1lKHRpbWVzW2sgKyAxXSwgc2FtcGxl
UmF0ZSk7CisgICAgICAgIGlmIChicmVha3Nba10gIT0gZXhwZWN0ZWRTYW1wbGVGcmFtZSkgewor
ICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgKytiYWRMb2NhdGlvbnM7
CisgICAgICAgICAgICB0ZXN0RmFpbGVkKCJFeHBlY3RlZCBkaXNjb250aW51aXR5IGF0ICIgKyBl
eHBlY3RlZFNhbXBsZUZyYW1lICsgIiBidXQgZ290ICIgKyBicmVha3Nba10pOworICAgICAgICB9
CisgICAgfQorCisgICAgaWYgKGJhZExvY2F0aW9ucykgeworICAgICAgICB0ZXN0RmFpbGVkKGJh
ZExvY2F0aW9ucyArICIgZGlzY29udGludWl0aWVzIGF0IGluY29ycmVjdCBsb2NhdGlvbnMiKTsK
KyAgICB9IGVsc2UgeworICAgICAgICB0ZXN0UGFzc2VkKCJBbGwgIiArIChicmVha3MubGVuZ3Ro
ICsgMSkgKyAiIHRlc3RzIHN0YXJ0ZWQgYW5kIGVuZGVkIGF0IHRoZSBjb3JyZWN0IHRpbWUuIik7
CisgICAgfQorICAgIAorICAgIHJldHVybiBzdWNjZXNzOworfQorCisvLyBDb21wYXJlIHRoZSBy
ZW5kZXJlZCBkYXRhIHdpdGggdGhlIGV4cGVjdGVkIGRhdGEuCisvLworLy8gdGVzdE5hbWUgLSBz
dHJpbmcgZGVzY3JpYmluZyB0aGUgdGVzdAorLy8KKy8vIG1heEVycm9yIC0gbWF4aW11bSBhbGxv
d2VkIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVuZGVyZWQgZGF0YSBhbmQgdGhlIGV4cGVjdGVk
IGRhdGEKKy8vCisvLyByZW5kZXJlcmREYXRhIC0gYXJyYXkgY29udGFpbmluZyB0aGUgcmVuZGVy
ZWQgKGFjdHVhbCkgZGF0YQorLy8KKy8vIGV4cGVjdGVkRnVuY3Rpb24gLSBmdW5jdGlvbiB0byBj
b21wdXRlIHRoZSBleHBlY3RlZCBkYXRhCisvLworLy8gdGltZVZhbHVlSW5mbyAtIGFycmF5IGNv
bnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXJ0IGFuZCBlbmQgdGltZXMgYW5kIHRo
ZSBzdGFydCBhbmQgZW5kCisvLyB2YWx1ZXMgb2YgZWFjaCBpbnRlcnZhbC4KKy8vCisvLyBicmVh
a1RocmVzaG9sZCAtIHRocmVzaG9sZCB0byB1c2UgZm9yIGRldGVybWluaW5nIGRpc2NvbnRpbnVp
dGllcy4KK2Z1bmN0aW9uIGNvbXBhcmVTaWduYWxzKHRlc3ROYW1lLCBtYXhFcnJvciwgcmVuZGVy
ZWREYXRhLCBleHBlY3RlZEZ1bmN0aW9uLCB0aW1lVmFsdWVJbmZvLCBicmVha1RocmVzaG9sZCkK
K3sKKyAgICB2YXIgc3VjY2VzcyA9IHRydWU7CisgICAgdmFyIGZhaWxlZFRlc3RDb3VudCA9IDA7
CisgICAgdmFyIHRpbWVzID0gdGltZVZhbHVlSW5mby50aW1lczsKKyAgICB2YXIgdmFsdWVzID0g
dGltZVZhbHVlSW5mby52YWx1ZXM7CisgICAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoOworCisgICAg
c3VjY2VzcyA9IHZlcmlmeURpc2NvbnRpbnVpdGllcyhyZW5kZXJlZERhdGEsIHRpbWVzLCBicmVh
a1RocmVzaG9sZCk7CisKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IG47ICsraykgeworICAgICAg
ICB2YXIgcmVzdWx0ID0gY29tcGFyZVBhcnRpYWxTaWduYWxzKHJlbmRlcmVkRGF0YSwgZXhwZWN0
ZWRGdW5jdGlvbiwgdGltZXNba10sIHRpbWVzW2sgKyAxXSwgdmFsdWVzW2tdLCBzYW1wbGVSYXRl
KTsKKworICAgICAgICBpZiAocmVzdWx0Lm1heEVycm9yID4gbWF4RXJyb3IpIHsKKyAgICAgICAg
ICAgIHRlc3RGYWlsZWQoIkluY29ycmVjdCBnYWluIGZvciB0ZXN0ICIgKyBrICsgIi4gTWF4IGVy
cm9yID0gIiArIHJlc3VsdC5tYXhFcnJvciArICIgYXQgb2Zmc2V0ICIgKyAocmVzdWx0LmluZGV4
ICsgdGltZVRvU2FtcGxlRnJhbWUodGltZXNba10sIHNhbXBsZVJhdGUpKSk7CisgICAgICAgICAg
ICArK2ZhaWxlZFRlc3RDb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmYWlsZWRU
ZXN0Q291bnQpIHsKKyAgICAgICAgdGVzdEZhaWxlZChmYWlsZWRUZXN0Q291bnQgKyAiIHRlc3Rz
IGZhaWxlZCBvdXQgb2YgIiArIG4pOworICAgICAgICBzdWNjZXNzID0gZmFsc2U7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgdGVzdFBhc3NlZCgiQWxsICIgKyBuICsgIiB0ZXN0cyBwYXNzZWQgd2l0
aGluIGFuIGFjY2VwdGFibGUgdG9sZXJhbmNlLiIpOworICAgIH0KKyAgICAgIAorICAgIGlmIChz
dWNjZXNzKSB7CisgICAgICAgIHRlc3RQYXNzZWQoIkF1ZGlvUGFyYW0gIiArIHRlc3ROYW1lICsg
IiB0ZXN0IHBhc3NlZC4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXN0RmFpbGVkKCJBdWRp
b1BhcmFtICIgKyB0ZXN0TmFtZSArICIgdGVzdCBmYWlsZWQuIik7CisgICAgfQorfQorCisvLyBS
dW4gYWxsIHRoZSBhdXRvbWF0aW9uIHRlc3RzLgorLy8KKy8vIGluaXRpYWxWYWx1ZSAtIFRoZSBp
bml0aWFsIHZhbHVlIG9mIHRoZSBmaXJzdCB0aW1lIGludGVydmFsLgorLy8KKy8vIGVuZFZhbHVl
RGVsdGFGdW5jdGlvbiAtIEhvdyBtdWNoIHRoZSBlbmQgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSB2
YWx1ZSBhdCB0aGUgc3RhcnQgb2YgdGhlCisvLyBpbnRlcnZhbC4KKy8vCisvLyBzZXRWYWx1ZUZ1
bmN0aW9uIC0gZnVuY3Rpb24gdGhhdCBzZXRzIHRoZSBzcGVjaWZpZWQgdmFsdWUgYXQgdGhlIHN0
YXJ0IG9mIGEgdGltZSBpbnRlcnZhbC4KKy8vCisvLyBhdXRvbWF0aW9uRnVuY3Rpb24gLSBmdW5j
dGlvbiB0aGF0IHNldHMgdGhlIGVuZCB2YWx1ZSBmb3IgdGhlIHRpbWUgaW50ZXJ2YWwuICBJdCBz
cGVjaWZpZXMgaG93CisvLyB0aGUgdmFsdWUgYXBwcm9hY2hlcyB0aGUgZW5kIHZhbHVlLgorLy8K
Ky8vIHZhbHVlVXBkYXRlRnVuY3Rpb24gLSBUaGUgc3RhcnRpbmcgdmFsdWUgYXQgdGltZSBpbnRl
cnZhbCBrIGlzIGFkanVzdGVkIGJ5IHZhbHVlVXBkYXRlRnVuY3Rpb24oaykgdG8gZ2l2ZSB0aGUg
bmV3IHN0YXJ0aW5nIHZhbHVlIGF0IHRpbWUgaW50ZXJ2YWwgayArIDEuCisvLworLy8gQW4gb2Jq
ZWN0IGlzIHJldHVybmVkIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2Ygc3RhcnQgdGltZXMgZm9yIGVh
Y2ggdGltZSBpbnRlcnZhbCwgYW5kIGFuIGFycmF5CisvLyBnaXZpbmcgdGhlIHN0YXJ0IGFuZCBl
bmQgdmFsdWVzIGZvciB0aGUgaW50ZXJ2YWwuCitmdW5jdGlvbiBkb0F1dG9tYXRpb24oaW5pdGlh
bFZhbHVlLCBlbmRWYWx1ZURlbHRhRnVuY3Rpb24sIHNldFZhbHVlRnVuY3Rpb24sIGF1dG9tYXRp
b25GdW5jdGlvbiwgdmFsdWVVcGRhdGVGdW5jdGlvbikKK3sKKyAgICB2YXIgdGltZUluZm8gPSBb
MF07CisgICAgdmFyIHZhbHVlSW5mbyA9IFtdOworICAgIHZhciB2YWx1ZSA9IGluaXRpYWxWYWx1
ZTsKKyAgICAKKyAgICBmb3IgKHZhciBrID0gMDsgayA8IG51bWJlck9mVGVzdHM7ICsraykgewor
ICAgICAgICB2YXIgc3RhcnRUaW1lID0gayAqIHRpbWVJbnRlcnZhbDsKKyAgICAgICAgdmFyIGVu
ZFRpbWUgPSAoayArIDEpICogdGltZUludGVydmFsOworICAgICAgICB2YXIgZW5kVmFsdWUgPSB2
YWx1ZSArIGVuZFZhbHVlRGVsdGFGdW5jdGlvbihrKTsKKworICAgICAgICAvLyBTZXQgdGhlIHZh
bHVlIGF0IHRoZSBzdGFydCBvZiB0aGUgdGltZSBpbnRlcnZhbC4KKyAgICAgICAgc2V0VmFsdWVG
dW5jdGlvbih2YWx1ZSwgc3RhcnRUaW1lKTsKKworICAgICAgICAvLyBTcGVjaWZ5IHRoZSB0YXJn
ZXQgdmFsdWUsIGFuZCBob3cgd2Ugc2hvdWxkIGFwcHJvYWNoIHRoZSB0YXJnZXQgdmFsdWUuCisg
ICAgICAgIGF1dG9tYXRpb25GdW5jdGlvbihlbmRWYWx1ZSwgc3RhcnRUaW1lLCBlbmRUaW1lKTsK
KworICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBzdGFydCB0aW1lcywgYW5kIHRoZSBzdGFy
dCBhbmQgZW5kIHZhbHVlcyBmb3IgZWFjaCB0aW1lIGludGVydmFsLgorICAgICAgICB0aW1lSW5m
by5wdXNoKGVuZFRpbWUpOworICAgICAgICB2YWx1ZUluZm8ucHVzaCh7c3RhcnRWYWx1ZTogdmFs
dWUsIGVuZFZhbHVlIDogZW5kVmFsdWV9KTsKKworICAgICAgICB2YWx1ZSArPSB2YWx1ZVVwZGF0
ZUZ1bmN0aW9uKGspOworICAgIH0KKworICAgIHJldHVybiB7dGltZXMgOiB0aW1lSW5mbywgdmFs
dWVzIDogdmFsdWVJbmZvfTsKK30K
</data>

          </attachment>
      

    </bug>

</bugzilla>