<?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>72171</bug_id>
          
          <creation_ts>2011-11-11 13:19:27 -0800</creation_ts>
          <short_desc>&lt;track&gt;-related events cuechange, enter, and exit should be sorted and filtered before dispatching</short_desc>
          <delta_ts>2012-02-20 07:02:32 -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>Media</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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>76110</dependson>
          <blocked>43668</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Anna Cavender">annacc</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>mihnea</cc>
    
    <cc>vcarbune</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>501033</commentid>
    <comment_count>0</comment_count>
    <who name="Anna Cavender">annacc</who>
    <bug_when>2011-11-11 13:19:27 -0800</bug_when>
    <thetext>See WHATWG spec under 4.8.10.8 Playing the media resource: http://www.whatwg.org/specs/web-apps/current-work/#playing-the-media-resource
 
Specifically, &quot;When the current playback position of a media element changes...&quot;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>505104</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2011-11-17 12:37:45 -0800</bug_when>
    <thetext>&lt;rdar://problem/10464462&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>523559</commentid>
    <comment_count>2</comment_count>
      <attachid>119785</attachid>
    <who name="Victor Carbune">vcarbune</who>
    <bug_when>2011-12-18 16:11:00 -0800</bug_when>
    <thetext>Created attachment 119785
Implemented the specifications from the standard

Initial work, related tests shold be added</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>523570</commentid>
    <comment_count>3</comment_count>
      <attachid>119785</attachid>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2011-12-18 16:35:57 -0800</bug_when>
    <thetext>Comment on attachment 119785
Implemented the specifications from the standard

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

Marking r- for the lack of tests.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:949
&gt; +            return a.second-&gt;track()-&gt;cues()-&gt;getCueIndex(a.second) -
&gt; +                    b.second-&gt;track()-&gt;cues()-&gt;getCueIndex(b.second) &lt; 0;

Nit: I think the line break make this slightly harder to read.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:963
&gt; +    return a-&gt;mediaElement()-&gt;textTracks()-&gt;getTrackIndex(a) -
&gt; +            b-&gt;mediaElement()-&gt;textTracks()-&gt;getTrackIndex(b);

Ditto.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:975
&gt; +    m_currentlyVisibleCues =
&gt; +        m_cueTree.allOverlaps(m_cueTree.createInterval(movieTime, movieTime));

Ditto.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:978
&gt; +
&gt; +    if (m_lastTextTrackUpdate &amp;&amp; !seeking) {

I think it can be extremely helpful to include spec text as comments. This makes it much easier to spot errors in the code logic (and to review).

&gt; Source/WebCore/html/HTMLMediaElement.cpp:990
&gt; +    // TODO(vcarbune): Step 5.

Please add the spec text for Step 5 as a comment. We typically use &quot;FIXME&quot; instead of &quot;TODO&quot; and include a bug number to track the fix.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:992
&gt; +    bool shouldAbord = true;

Typo: I think you want &quot;shouldAbort&quot;.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:995
&gt; +        if (!m_currentlyVisibleCues.contains(previouslyVisibleCues[i])
&gt; +            &amp;&amp; previouslyVisibleCues[i].data()-&gt;isActive()) {

I think the line break makes this slightly more difficult to read.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1013
&gt; +    // TODO(vcarbune): Step 7.

&quot;TODO&quot; -&gt; &quot;FIXME&quot; plus bug number.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>528599</commentid>
    <comment_count>4</comment_count>
      <attachid>120898</attachid>
    <who name="Victor Carbune">vcarbune</who>
    <bug_when>2012-01-02 16:11:50 -0800</bug_when>
    <thetext>Created attachment 120898
Updated code, tests and spec in comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>528830</commentid>
    <comment_count>5</comment_count>
      <attachid>120898</attachid>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2012-01-03 09:49:51 -0800</bug_when>
    <thetext>Comment on attachment 120898
Updated code, tests and spec in comments

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

&gt; Source/WebCore/ChangeLog:30
&gt; +        * html/HTMLMediaElement.h: Added variables to keep
&gt; +        state information required by the text track update algorithm (last time
&gt; +        the algorithm was run, and whether a seeking event has occured)
&gt; +        * html/TextTrackCue.cpp:

Nit: Many people but a blank line between non-associated files to make the changelog easier to read.

&gt; Source/WebCore/ChangeLog:8212
&gt; +&gt;&gt;&gt;&gt;&gt;&gt;&gt; master

Left over from a bad merge?

&gt; Source/WebCore/html/HTMLMediaElement.cpp:966
&gt; +    // 12 - Sort the tasks in events in ascending time order (tasks with earlier
&gt; +    // times first).
&gt; +    if (a.first == b.first) {
&gt; +        int aCueIndex = a.second-&gt;track()-&gt;cues()-&gt;getCueIndex(a.second);
&gt; +        int bCueIndex = b.second-&gt;track()-&gt;cues()-&gt;getCueIndex(b.second);
&gt; +
&gt; +        if (a.second-&gt;track() == b.second-&gt;track()) {
&gt; +            // 12 - Further sort tasks in events that have the same time by the
&gt; +            // relative text track cue order of the text track cues associated
&gt; +            // with these tasks.
&gt; +            return aCueIndex - bCueIndex &lt; 0;
&gt; +        }
&gt; +    }
&gt; +
&gt; +    return a.first - b.first &lt; 0;

Nit: The comments don&apos;t quite follow the code logic. It might make more sense to return early if the times are not the same:

// 12 - Sort the tasks in events in ascending ...
if ((a.first != b.first)
    return a.first - b.first &lt; 0;

// Further sort tasks in events ...
int aCueIndex = a.second-&gt;track()-&gt;cues()-&gt;getCueIndex(a.second);

&gt; Source/WebCore/html/HTMLMediaElement.cpp:984
&gt; +    Vector&lt;CueIntervalTree::IntervalType&gt; affectedCues;
&gt; +    Vector&lt;CueIntervalTree::IntervalType&gt; previouslyVisibleCues;
&gt; +    Vector&lt;CueIntervalTree::IntervalType&gt; missedCues;

Nit: an early return when m_cueTree is empty would prevent a lot of unnecessary setup churn.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:986
&gt; +    // 2 - other cues

Why is the first comment #2?

&gt; Source/WebCore/html/HTMLMediaElement.cpp:990
&gt; +    // 1 - current cues
&gt;      m_currentlyActiveCues = m_cueTree.allOverlaps(m_cueTree.createInterval(movieTime, movieTime));

When I suggested including comments from the spec, I meant to literally include spec text as we have in other parts of this file. Eg:

// 4.8.10.8 Playing the media resource
// 1. Let current cues be a list of cues, initialized to contain all the cues of all the hidden, showing,
// or showing by default text tracks of the media element (not the disabled ones) whose start times are
// less than or equal to the current playback position and whose end times are greater than the current
// playback position.
m_currentlyActiveCues = m_cueTree.allOverlaps(m_cueTree.createInterval(movieTime, movieTime));

etc.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:995
&gt; +    if (m_lastTextTrackUpdate &amp;&amp; !m_seekingBeforeTextTrackUpdate) {
&gt; +        Vector&lt;CueIntervalTree::IntervalType&gt; potentiallySkippedCues =
&gt; +            m_cueTree.allOverlaps(m_cueTree.createInterval(m_lastTextTrackUpdate, movieTime));

Nit: I had to read this several times before I figured out what it did, so I think &quot;m_lastTextTrackUpdate&quot; would be better as &quot;m_lastTextTrackUpdateTime&quot;.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:999
&gt; +            if (potentiallySkippedCues[i].low() &gt; m_lastTextTrackUpdate
&gt; +                &amp;&amp; potentiallySkippedCues[i].high() &lt; movieTime)

Nit: I think the line break makes this much harder to read.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1017
&gt; +    bool activeSetChanged = false;

If any cues were skipped you know that the active set must be updated, so initialize activeSetChanged to missedCues.size() so you won&apos;t check previous and currently visible cues.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1018
&gt; +    for (size_t i = 0; i &lt; previouslyVisibleCues.size() &amp;&amp; !activeSetChanged; ++i) {

Nit: 1) If !activeSetChanged is checked first, you won&apos;t have to check the queue size once it is true. 2) The queue size can&apos;t change in this loop so you should put the size into a local variable instead of fetching it from the queue every time.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1020
&gt; +        if (!m_currentlyActiveCues.contains(previouslyVisibleCues[i])
&gt; +            &amp;&amp; previouslyVisibleCues[i].data()-&gt;isActive())

Nit: I think the line break makes this much harder to read.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1024
&gt; +    for (size_t i = 0; i &lt; m_currentlyActiveCues.size() &amp;&amp; !activeSetChanged; ++i) {

Nit: As above.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1077
&gt; +    // 12 - Sort the events before dispatching.

12. Sort the tasks in events in ascending time order (tasks with earlier times first).

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1088
&gt; +        // 13 - Queue each task in events, in list order (we can already dispatch).
&gt; +        if (eventTasks[i].first == eventTasks[i].second-&gt;startTime())
&gt; +            eventTasks[i].second-&gt;setIsActive(true);
&gt; +        else
&gt; +            eventTasks[i].second-&gt;setIsActive(false);

&quot;Queue each task in events ...&quot; means the events should be fired asynchronously, but TextTrackCue::setIsActive fires the event immediately.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1100
&gt; +    for (size_t i = 0; i &lt; affectedTracks.size(); ++i)
&gt; +        affectedTracks[i]-&gt;fireCueChangeEvent();

&quot;queue a task to fire a simple event&quot; means the event is fired asynchronously, but TextTrack:: fireCueChangeEvent fires the event immediately.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1717
&gt; +    m_seekingBeforeTextTrackUpdate = true;

Nit: This might be clearer if named something like &quot;m_seekedSinceLastTextTrackUpdate&quot;.

&gt; Source/WebCore/html/HTMLMediaElement.h:564
&gt; +    typedef std::pair &lt;double, TextTrackCue*&gt; EventTimeCuePair;

This typedef isn&apos;t used in the header so you should define in the .cpp file where it is used.

&gt; Source/WebCore/html/HTMLMediaElement.h:566
&gt; +    typedef PODIntervalTree &lt;double, TextTrackCue*&gt; CueIntervalTree;

Either this diff is missing something, or this is a re-definition of the CueIntervalTree typedef.

&gt; Source/WebCore/html/HTMLMediaElement.h:568
&gt; -    CueList m_currentlyActiveCues;
&gt; +    Vector&lt;CueIntervalTree::IntervalType&gt; m_currentlyActiveCues;

Is there a reason to not use the CueList type?

&gt; Source/WebCore/html/TextTrackCueList.cpp:51
&gt; +unsigned long TextTrackCueList::getCueIndex(TextTrackCue* cue) const
&gt; +{
&gt; +    for (unsigned long index = 0; index &lt; m_list.size(); ++index) {
&gt; +        if (m_list[index].get() == cue)
&gt; +            return index;
&gt; +    }
&gt; +
&gt; +    return 0;
&gt; +}

Could this use Vector::find? 

Actually, a cue&apos;s index will change *much* less infrequently than this function will be called so I wonder if it would be better to have a cue store its index. You could invalidate a cue&apos;s stored index whenever a new cue is inserted into the list, and have a cue look up the index only when stored index is invalid.

&gt; Source/WebCore/html/track/TextTrackList.cpp:66
&gt; +unsigned TextTrackList::getTrackIndex(TextTrack *textTrack)
&gt; +{
&gt; +    for (unsigned index = 0; index &lt; m_elementTracks.size(); ++index) {
&gt; +        if (m_elementTracks[index].get() == textTrack)
&gt; +            return index;
&gt; +    }
&gt; +
&gt; +    return 0;
&gt; +}

Could this use Vector::find?

&gt; LayoutTests/media/track/track-cues-missed-expected.txt:13
&gt; +Tests that events are triggered for missed (skipped) cues during normal playback.
&gt; +
&gt; +EVENT(canplaythrough)
&gt; +EXPECTED (testTrack.track.cues.length == &apos;3&apos;) OK
&gt; +RUN(video.play())
&gt; +EVENT(enter)
&gt; +EXPECTED ([object TextTrackCue] == &apos;[object TextTrackCue]&apos;) OK
&gt; +EXPECTED (currentCue.id == &apos;3&apos;) OK
&gt; +EVENT(exit)
&gt; +EXPECTED ([object TextTrackCue] == &apos;[object TextTrackCue]&apos;) OK
&gt; +EXPECTED (currentCue.id == &apos;3&apos;) OK
&gt; +EVENT(ended)
&gt; +END OF TEST

I would rather that this check more than one cue because it is possible, if unlikely, that a single cue will not be skipped.

&gt; LayoutTests/media/track/track-cues-missed.html:16
&gt; +            function runTests() {
&gt; +                if (!trackLoaded || !videoCanPlayThrough)

WebKit style is for a function&apos;s opening brace to be on a new line.

&gt; LayoutTests/media/track/track-cues-missed.html:47
&gt; +            waitForEvent(&apos;ended&apos;, function() {
&gt; +                endTest();
&gt; +            });

Nit: Why define a new function to call a single function?  &quot;waitForEvent(&apos;ended&apos;, endTest);&quot;

&gt; LayoutTests/media/track/track-cues-sorted-before-dispatch-expected.txt:9
&gt; +Cue event: enter id: 1 time: 5.1
&gt; +Cue event: enter id: 3 time: 5.1
&gt; +Cue event: enter id: 2 time: 5.1

Shouldn&apos;t these file in ID order because of &quot;Further sort tasks in events that have the same time by the relative text track cue order of the text track cues associated with these tasks&quot;?

&gt; LayoutTests/media/track/track-cues-sorted-before-dispatch.html:17
&gt; +            function runTests() {

As above, the opening brace goes on a new line.

&gt; LayoutTests/media/track/track-cues-sorted-before-dispatch.html:27
&gt; +                for (var i = 0; i &lt; testTrack.track.cues.length; ++i) {
&gt; +                    testTrack.track.cues[i].addEventListener(&apos;enter&apos;, cueEntered);
&gt; +                    testTrack.track.cues[i].addEventListener(&apos;exit&apos;, cueExited);
&gt; +                }

Is there an advantage to registering a listeners on each cue instead of on the &lt;track&gt;?

&gt; LayoutTests/media/track/track-cues-sorted-before-dispatch.html:52
&gt; +            function cueEntered() {
&gt; +                currentCue = event.target;
&gt; +
&gt; +                var eventObj = {};
&gt; +                eventObj.time = currentCue.startTime;
&gt; +                eventObj.type = &quot;enter&quot;;
&gt; +                eventObj.cue = currentCue;
&gt; +
&gt; +                dispatchedEvents.push(eventObj);
&gt; +            }
&gt; +
&gt; +            function cueExited() {
&gt; +                currentCue = event.target;
&gt; +
&gt; +                var eventObj = {};
&gt; +                eventObj.time = currentCue.endTime;
&gt; +                eventObj.type = &quot;exit&quot;;
&gt; +                eventObj.cue = currentCue;
&gt; +
&gt; +                dispatchedEvents.push(eventObj);
&gt; +            }

Nit: These functions are identical except for &quot;eventObj.type = &apos;XXX&apos;&quot;, but you could use &quot;eventObj.type =  event.type&quot; and have a single function.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551604</commentid>
    <comment_count>6</comment_count>
      <attachid>125964</attachid>
    <who name="Victor Carbune">vcarbune</who>
    <bug_when>2012-02-07 17:37:21 -0800</bug_when>
    <thetext>Created attachment 125964
Updated patch for current trunk

Solved issues from the previous review and changed significant parts within the code</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551618</commentid>
    <comment_count>7</comment_count>
    <who name="Victor Carbune">vcarbune</who>
    <bug_when>2012-02-07 17:49:44 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 120898 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=120898&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:30
&gt; &gt; +        * html/HTMLMediaElement.h: Added variables to keep
&gt; &gt; +        state information required by the text track update algorithm (last time
&gt; &gt; +        the algorithm was run, and whether a seeking event has occured)
&gt; &gt; +        * html/TextTrackCue.cpp:
&gt; 
&gt; Nit: Many people but a blank line between non-associated files to make the changelog easier to read.
Done.
&gt; &gt; Source/WebCore/ChangeLog:8212
&gt; &gt; +&gt;&gt;&gt;&gt;&gt;&gt;&gt; master
&gt; 
&gt; Left over from a bad merge?
Sorry for the mistakes of this kind - fixed.

&gt; &gt; Source/WebCore/html/HTMLMediaElement.cpp:966
&gt; &gt; +    // 12 - Sort the tasks in events in ascending time order (tasks with earlier
&gt; &gt; +    // times first).
&gt; &gt; +    if (a.first == b.first) {
&gt; &gt; +        int aCueIndex = a.second-&gt;track()-&gt;cues()-&gt;getCueIndex(a.second);
&gt; &gt; +        int bCueIndex = b.second-&gt;track()-&gt;cues()-&gt;getCueIndex(b.second);
&gt; &gt; +
&gt; &gt; +        if (a.second-&gt;track() == b.second-&gt;track()) {
&gt; &gt; +            // 12 - Further sort tasks in events that have the same time by the
&gt; &gt; +            // relative text track cue order of the text track cues associated
&gt; &gt; +            // with these tasks.
&gt; &gt; +            return aCueIndex - bCueIndex &lt; 0;
&gt; &gt; +        }
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    return a.first - b.first &lt; 0;
&gt; 
&gt; Nit: The comments don&apos;t quite follow the code logic. It might make more sense to return early if the times are not the same:
&gt; 
&gt; // 12 - Sort the tasks in events in ascending ...
&gt; if ((a.first != b.first)
&gt;     return a.first - b.first &lt; 0;
&gt; 
&gt; // Further sort tasks in events ...
&gt; int aCueIndex = a.second-&gt;track()-&gt;cues()-&gt;getCueIndex(a.second);
Done.

&gt; &gt; Source/WebCore/html/HTMLMediaElement.cpp:984
&gt; &gt; +    Vector&lt;CueIntervalTree::IntervalType&gt; affectedCues;
&gt; &gt; +    Vector&lt;CueIntervalTree::IntervalType&gt; previouslyVisibleCues;
&gt; &gt; +    Vector&lt;CueIntervalTree::IntervalType&gt; missedCues;
&gt; 
&gt; Nit: an early return when m_cueTree is empty would prevent a lot of unnecessary setup churn.
I forgot to change this, but will fix it in the iteration.

&gt; &gt; Source/WebCore/html/HTMLMediaElement.cpp:986
&gt; &gt; +    // 2 - other cues
&gt; 
&gt; Why is the first comment #2?
Refactored to have them correctly ordered.
 
&gt; &gt; Source/WebCore/html/HTMLMediaElement.cpp:990
&gt; &gt; +    // 1 - current cues
&gt; &gt;      m_currentlyActiveCues = m_cueTree.allOverlaps(m_cueTree.createInterval(movieTime, movieTime));
&gt; 
&gt; When I suggested including comments from the spec, I meant to literally include spec text as we have in other parts of this file. Eg:
&gt; 
&gt; // 4.8.10.8 Playing the media resource
&gt; // 1. Let current cues be a list of cues, initialized to contain all the cues of all the hidden, showing,
&gt; // or showing by default text tracks of the media element (not the disabled ones) whose start times are
&gt; // less than or equal to the current playback position and whose end times are greater than the current
&gt; // playback position.
&gt; m_currentlyActiveCues = m_cueTree.allOverlaps(m_cueTree.createInterval(movieTime, movieTime));
&gt; 
&gt; etc.
Done 
&gt; &gt; Source/WebCore/html/HTMLMediaElement.cpp:995
&gt; &gt; +    if (m_lastTextTrackUpdate &amp;&amp; !m_seekingBeforeTextTrackUpdate) {
&gt; &gt; +        Vector&lt;CueIntervalTree::IntervalType&gt; potentiallySkippedCues =
&gt; &gt; +            m_cueTree.allOverlaps(m_cueTree.createInterval(m_lastTextTrackUpdate, movieTime));
&gt; 
&gt; Nit: I had to read this several times before I figured out what it did, so I think &quot;m_lastTextTrackUpdate&quot; would be better as &quot;m_lastTextTrackUpdateTime&quot;.
Done.
&gt; &gt; Source/WebCore/html/HTMLMediaElement.cpp:999
&gt; &gt; +            if (potentiallySkippedCues[i].low() &gt; m_lastTextTrackUpdate
&gt; &gt; +                &amp;&amp; potentiallySkippedCues[i].high() &lt; movieTime)
&gt; 
&gt; Nit: I think the line break makes this much harder to read.
Done. 

&gt; &gt; Source/WebCore/html/HTMLMediaElement.cpp:1017
&gt; &gt; +    bool activeSetChanged = false;
&gt; 
&gt; If any cues were skipped you know that the active set must be updated, so initialize activeSetChanged to missedCues.size() so you won&apos;t check previous and currently visible cues.
Done, thanks.

&gt; &gt; Source/WebCore/html/HTMLMediaElement.cpp:1018
&gt; &gt; +    for (size_t i = 0; i &lt; previouslyVisibleCues.size() &amp;&amp; !activeSetChanged; ++i) {
&gt; 
&gt; Nit: 1) If !activeSetChanged is checked first, you won&apos;t have to check the queue size once it is true. 2) The queue size can&apos;t change in this loop so you should put the size into a local variable instead of fetching it from the queue every time.
Done for these lines.

&gt; &gt; Source/WebCore/html/HTMLMediaElement.cpp:1020
&gt; &gt; +        if (!m_currentlyActiveCues.contains(previouslyVisibleCues[i])
&gt; &gt; +            &amp;&amp; previouslyVisibleCues[i].data()-&gt;isActive())
&gt; 
&gt; Nit: I think the line break makes this much harder to read.
&gt; 
&gt; &gt; Source/WebCore/html/HTMLMediaElement.cpp:1024
&gt; &gt; +    for (size_t i = 0; i &lt; m_currentlyActiveCues.size() &amp;&amp; !activeSetChanged; ++i) {
&gt; 
&gt; Nit: As above.
&gt; 
&gt; &gt; Source/WebCore/html/HTMLMediaElement.cpp:1077
&gt; &gt; +    // 12 - Sort the events before dispatching.
&gt; 
&gt; 12. Sort the tasks in events in ascending time order (tasks with earlier times first).
&gt; 
&gt; &gt; Source/WebCore/html/HTMLMediaElement.cpp:1088
&gt; &gt; +        // 13 - Queue each task in events, in list order (we can already dispatch).
&gt; &gt; +        if (eventTasks[i].first == eventTasks[i].second-&gt;startTime())
&gt; &gt; +            eventTasks[i].second-&gt;setIsActive(true);
&gt; &gt; +        else
&gt; &gt; +            eventTasks[i].second-&gt;setIsActive(false);
&gt; 
&gt; &quot;Queue each task in events ...&quot; means the events should be fired asynchronously, but TextTrackCue::setIsActive fires the event immediately.
Fixed using the GenericEventQueue.
 
&gt; &gt; Source/WebCore/html/HTMLMediaElement.cpp:1100
&gt; &gt; +    for (size_t i = 0; i &lt; affectedTracks.size(); ++i)
&gt; &gt; +        affectedTracks[i]-&gt;fireCueChangeEvent();
&gt; 
&gt; &quot;queue a task to fire a simple event&quot; means the event is fired asynchronously, but TextTrack:: fireCueChangeEvent fires the event immediately.
Fixed.

&gt; &gt; Source/WebCore/html/HTMLMediaElement.cpp:1717
&gt; &gt; +    m_seekingBeforeTextTrackUpdate = true;
&gt; 
&gt; Nit: This might be clearer if named something like &quot;m_seekedSinceLastTextTrackUpdate&quot;.
Done.
 
&gt; &gt; Source/WebCore/html/HTMLMediaElement.h:564
&gt; &gt; +    typedef std::pair &lt;double, TextTrackCue*&gt; EventTimeCuePair;
&gt; 
&gt; This typedef isn&apos;t used in the header so you should define in the .cpp file where it is used.
Removed it as it was not bringing any significant value.
 
&gt; &gt; Source/WebCore/html/HTMLMediaElement.h:566
&gt; &gt; +    typedef PODIntervalTree &lt;double, TextTrackCue*&gt; CueIntervalTree;
&gt; 
&gt; Either this diff is missing something, or this is a re-definition of the CueIntervalTree typedef.
Mistake, removed.

&gt; &gt; Source/WebCore/html/HTMLMediaElement.h:568
&gt; &gt; -    CueList m_currentlyActiveCues;
&gt; &gt; +    Vector&lt;CueIntervalTree::IntervalType&gt; m_currentlyActiveCues;
&gt; 
&gt; Is there a reason to not use the CueList type?
No, fixed back.
 
&gt; &gt; Source/WebCore/html/TextTrackCueList.cpp:51
&gt; &gt; +unsigned long TextTrackCueList::getCueIndex(TextTrackCue* cue) const
&gt; &gt; +{
&gt; &gt; +    for (unsigned long index = 0; index &lt; m_list.size(); ++index) {
&gt; &gt; +        if (m_list[index].get() == cue)
&gt; &gt; +            return index;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    return 0;
&gt; &gt; +}
&gt; 
&gt; Could this use Vector::find? 
&gt; 
&gt; Actually, a cue&apos;s index will change *much* less infrequently than this function will be called so I wonder if it would be better to have a cue store its index. You could invalidate a cue&apos;s stored index whenever a new cue is inserted into the list, and have a cue look up the index only when stored index is invalid.
Done.
 
&gt; &gt; Source/WebCore/html/track/TextTrackList.cpp:66
&gt; &gt; +unsigned TextTrackList::getTrackIndex(TextTrack *textTrack)
&gt; &gt; +{
&gt; &gt; +    for (unsigned index = 0; index &lt; m_elementTracks.size(); ++index) {
&gt; &gt; +        if (m_elementTracks[index].get() == textTrack)
&gt; &gt; +            return index;
&gt; &gt; +    }
&gt; &gt; +
&gt; &gt; +    return 0;
&gt; &gt; +}
&gt; 
&gt; Could this use Vector::find?
Done.
 
&gt; &gt; LayoutTests/media/track/track-cues-missed-expected.txt:13
&gt; &gt; +Tests that events are triggered for missed (skipped) cues during normal playback.
&gt; &gt; +
&gt; &gt; +EVENT(canplaythrough)
&gt; &gt; +EXPECTED (testTrack.track.cues.length == &apos;3&apos;) OK
&gt; &gt; +RUN(video.play())
&gt; &gt; +EVENT(enter)
&gt; &gt; +EXPECTED ([object TextTrackCue] == &apos;[object TextTrackCue]&apos;) OK
&gt; &gt; +EXPECTED (currentCue.id == &apos;3&apos;) OK
&gt; &gt; +EVENT(exit)
&gt; &gt; +EXPECTED ([object TextTrackCue] == &apos;[object TextTrackCue]&apos;) OK
&gt; &gt; +EXPECTED (currentCue.id == &apos;3&apos;) OK
&gt; &gt; +EVENT(ended)
&gt; &gt; +END OF TEST
&gt; 
&gt; I would rather that this check more than one cue because it is possible, if unlikely, that a single cue will not be skipped.
Added several more possible missed cues.
 
&gt; &gt; LayoutTests/media/track/track-cues-missed.html:16
&gt; &gt; +            function runTests() {
&gt; &gt; +                if (!trackLoaded || !videoCanPlayThrough)
&gt; 
&gt; WebKit style is for a function&apos;s opening brace to be on a new line.
Sorry, fixed.

&gt; &gt; LayoutTests/media/track/track-cues-missed.html:47
&gt; &gt; +            waitForEvent(&apos;ended&apos;, function() {
&gt; &gt; +                endTest();
&gt; &gt; +            });
&gt; 
&gt; Nit: Why define a new function to call a single function?  &quot;waitForEvent(&apos;ended&apos;, endTest);&quot;
Fixed.

&gt; &gt; LayoutTests/media/track/track-cues-sorted-before-dispatch-expected.txt:9
&gt; &gt; +Cue event: enter id: 1 time: 5.1
&gt; &gt; +Cue event: enter id: 3 time: 5.1
&gt; &gt; +Cue event: enter id: 2 time: 5.1
&gt; 
&gt; Shouldn&apos;t these file in ID order because of &quot;Further sort tasks in events that have the same time by the relative text track cue order of the text track cues associated with these tasks&quot;?
Not quite. This is about &quot;relative text track cue order&quot;, which is directly related to the startTimes and endTimes. In our case, 3 and 2 have the same startTime, but endTime(3) &gt; endTime(2), hence the ordering.

&gt; &gt; LayoutTests/media/track/track-cues-sorted-before-dispatch.html:17
&gt; &gt; +            function runTests() {
&gt; 
&gt; As above, the opening brace goes on a new line.
Fixed.

&gt; &gt; LayoutTests/media/track/track-cues-sorted-before-dispatch.html:27
&gt; &gt; +                for (var i = 0; i &lt; testTrack.track.cues.length; ++i) {
&gt; &gt; +                    testTrack.track.cues[i].addEventListener(&apos;enter&apos;, cueEntered);
&gt; &gt; +                    testTrack.track.cues[i].addEventListener(&apos;exit&apos;, cueExited);
&gt; &gt; +                }
&gt; 
&gt; Is there an advantage to registering a listeners on each cue instead of on the &lt;track&gt;?
I *think* enter / exit events are dispatched only on individual cues? Maybe I mis-read the spec. 

&gt; &gt; LayoutTests/media/track/track-cues-sorted-before-dispatch.html:52
&gt; &gt; +            function cueEntered() {
&gt; &gt; +                currentCue = event.target;
&gt; &gt; +
&gt; &gt; +                var eventObj = {};
&gt; &gt; +                eventObj.time = currentCue.startTime;
&gt; &gt; +                eventObj.type = &quot;enter&quot;;
&gt; &gt; +                eventObj.cue = currentCue;
&gt; &gt; +
&gt; &gt; +                dispatchedEvents.push(eventObj);
&gt; &gt; +            }
&gt; &gt; +
&gt; &gt; +            function cueExited() {
&gt; &gt; +                currentCue = event.target;
&gt; &gt; +
&gt; &gt; +                var eventObj = {};
&gt; &gt; +                eventObj.time = currentCue.endTime;
&gt; &gt; +                eventObj.type = &quot;exit&quot;;
&gt; &gt; +                eventObj.cue = currentCue;
&gt; &gt; +
&gt; &gt; +                dispatchedEvents.push(eventObj);
&gt; &gt; +            }
&gt; 
&gt; Nit: These functions are identical except for &quot;eventObj.type = &apos;XXX&apos;&quot;, but you could use &quot;eventObj.type =  event.type&quot; and have a single function.
Fixed, thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553542</commentid>
    <comment_count>8</comment_count>
      <attachid>125964</attachid>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2012-02-09 15:08:07 -0800</bug_when>
    <thetext>Comment on attachment 125964
Updated patch for current trunk

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

This is close, but I am marking it r- for now because there are enough small things that need to be changed before it lands.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:949
&gt; +    return aTrackIndex - bTrackIndex;

Won&apos;t this return true unless they have the same index? Do you mean &quot;return aTrackIndex - bTrackIndex &lt; 0&quot;?

&gt; Source/WebCore/html/HTMLMediaElement.cpp:960
&gt; +    // Treat the special case when cues belong to different tracks.

More explanation in this comment about why it makes sense to special case would be nice: eg. something like &quot;If the cues are from different tracks, sort by track order instead of cue index.&quot;

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1045
&gt; +        if (!currentCues.contains(previousCues[i]) &amp;&amp; previousCues[i].data()-&gt;isActive()) {
&gt;              activeSetChanged = true;
&gt;          }

WebKit style is not not use braces around a single line condition.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1050
&gt; +    for (size_t i = 0; !activeSetChanged &amp;&amp; i &lt; currentCuesSize; ++i)
&gt; +        if (!currentCues[i].data()-&gt;isActive())
&gt; +            activeSetChanged = true;

On the other hand, this loop should have braces because it contains two lines (even though it is just a single conditional).

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1054
&gt; +    if (!activeSetChanged) {
&gt; +        return;
&gt;      }

Braces are not necessary here either.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1115
&gt; +        if (eventTasks[i].first == eventTasks[i].second-&gt;startTime())
&gt; +            event = Event::create(eventNames().enterEvent, false, false);
&gt; +        else
&gt; +            event = Event::create(eventNames().exitEvent, false, false);

As you know I had to scratch my head for a bit to figure out how this works, so a brief comment here would be helpful.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1131
&gt; +        RefPtr&lt;Event&gt; event =
&gt; +                Event::create(eventNames().cuechangeEvent, false, false);

Nit: I don&apos;t think the line break here helps.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1136
&gt; +        m_asyncEventQueue.enqueueEvent(event.release());
&gt; +    }
&gt; +

What about the &apos;cuechange&apos; event that should be fired synchronously at the &lt;track&gt; element?

&gt; Source/WebCore/html/LoadableTextTrack.cpp:132
&gt; +        ExceptionCode ec = 0;
&gt; +        bool result2 = m_trackElement-&gt;dispatchEvent(Event::create(eventNames().cuechangeEvent, false, false), ec);

I think this should be in &lt;track&gt; event in HTMLMediaElement::updateActiveTextTrackCues

&gt; Source/WebCore/html/TextTrackCue.cpp:96
&gt; +    , m_validCueIndex(false)

Instead of using a separate bool to track the validity of the index, you could define a constant invalid index (eg. -1) instead.

&gt; Source/WebCore/html/TextTrackCue.cpp:332
&gt; +    if (!m_validCueIndex)
&gt; +        m_cueIndex = track()-&gt;cues()-&gt;getCueIndex(this);

&quot;if (m_cueIndex != invalidCueIndex) ...&quot;

&gt; Source/WebCore/html/TextTrackCue.cpp:340
&gt; +    m_validCueIndex = false;

&quot;m_cueIndex = invalidCueIndex;&quot;

&gt; Source/WebCore/html/TextTrackCue.cpp:358
&gt; +    LOG(Media, &quot;TextTrackCue::Dispatching event...&quot;);

I don&apos;t think it makes sense to log from a function that will be called as often as this as it adds so much noise to the log stream. If you think it is useful to have some of the time, why don&apos;t you do something like we do for events in HTMLMediaElement (look for &quot;#ifndef LOG_MEDIA_EVENTS&quot;).

&gt; Source/WebCore/html/TextTrackCue.cpp:364
&gt; +    LOG(Media, &quot;TextTrackCue::Calling superclass dispatch...&quot;);

Ditto.

&gt; Source/WebCore/html/TextTrackCue.cpp:370
&gt; +    LOG(Media, &quot;TextTrackCue::Calling own event dispatch with exceptions...&quot;);

Ditto.

&gt; Source/WebCore/html/track/TextTrackList.cpp:61
&gt; +unsigned TextTrackList::getTrackIndex(TextTrack *textTrack)
&gt; +{
&gt; +    return m_elementTracks.find(textTrack);
&gt; +}

This function will be called frequently, so I think it would be good to use the same approach you use with cues and have the TextTrack cache its index the first time is it accessed.

&gt; LayoutTests/media/track/captions-webvtt/sorted-dispatch.vtt:6
&gt; +00:00:05.100 --&gt; 00:00:05.800 A:start T:20%
&gt; +Bear is Coming!!!!!

Nit: it wouldn&apos;t break my heart if you used something other than &quot;Bear is Coming!!!&quot; text ;-)

&gt; LayoutTests/media/track/track-cues-missed.html:26
&gt; +                    testTrack.track.cues[cueCount].addEventListener(&apos;enter&apos;, cueEnteredOrExited);
&gt; +                    testTrack.track.cues[cueCount].addEventListener(&apos;exit&apos;, cueEnteredOrExited);

Nit: putting &quot;testTrack.track.cues[cueCount]&quot; into a local variable would speed this up slightly.

&gt; LayoutTests/media/track/track-cues-missed.html:38
&gt; +                testExpected(currentCue, testTrack.track.cues.getCueById(cueCount));

Nit: the result logged would be clearer if you quote the first argument, e.g.

    testExpected(&quot;testTrack.track.cues.getCueById(cueCount)&quot;, currentCue)

will produce 

    EXPECTED (testTrack.track.cues.getCueById(cueCount) == &apos;[object TextTrackCue]&apos;) OK

instead of 

    EXPECTED ([object TextTrackCue] == &apos;[object TextTrackCue]&apos;) OK

&gt; LayoutTests/media/track/track-cues-sorted-before-dispatch.html:57
&gt; +                for (var i = 0; i &lt; dispatchedEvents.length; ++i) {
&gt; +                    consoleWrite(&quot;Cue event: &quot; + dispatchedEvents[i].type +
&gt; +                                 &quot; id: &quot; + dispatchedEvents[i].cue.id +
&gt; +                                 &quot; time: &quot; + dispatchedEvents[i].time);
&gt; +                }
&gt; +
&gt; +                endTest();
&gt; +            });

Nit: this is complex and long enough that I think it would be better as a separate function.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555681</commentid>
    <comment_count>9</comment_count>
      <attachid>126850</attachid>
    <who name="Victor Carbune">vcarbune</who>
    <bug_when>2012-02-13 15:39:45 -0800</bug_when>
    <thetext>Created attachment 126850
Updated patch and tests

Fixed the comments mentioned previously and better documented parts in the code</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>555822</commentid>
    <comment_count>10</comment_count>
      <attachid>126850</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-13 18:00:13 -0800</bug_when>
    <thetext>Comment on attachment 126850
Updated patch and tests

Attachment 126850 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/11521027

New failing tests:
media/track/track-cues-sorted-before-dispatch.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>557397</commentid>
    <comment_count>11</comment_count>
      <attachid>126850</attachid>
    <who name="Victor Carbune">vcarbune</who>
    <bug_when>2012-02-15 11:01:10 -0800</bug_when>
    <thetext>Comment on attachment 126850
Updated patch and tests

I&apos;m still looking why exactly this test fails. Seems to be a corner-case situation I&apos;m missing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>557651</commentid>
    <comment_count>12</comment_count>
      <attachid>126850</attachid>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2012-02-15 15:40:08 -0800</bug_when>
    <thetext>Comment on attachment 126850
Updated patch and tests

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

Looks good with the minor suggestions noted, but I won&apos;t mark it cq+ because of the test failure.

&gt; Source/WebCore/ChangeLog:848
&gt; +&gt;&gt;&gt;&gt;&gt;&gt;&gt; master

Is this left over from a bad merge?

&gt; Source/WebCore/ChangeLog:9061
&gt; +&gt;&gt;&gt;&gt;&gt;&gt;&gt; master

Ditto.

&gt; Source/WebCore/html/HTMLMediaElement.cpp:1139
&gt; +            static_cast&lt;LoadableTextTrack*&gt;(affectedTracks[i])-&gt;fireTrackElementCueChangeEvent();

I think it might be better if you left fireCueChangeEvent as a virtual method on the base class and ASSERT in the back class implementation instead. I don&apos;t have a really strong opinion about this, but please consider it.

&gt; Source/WebCore/html/LoadableTextTrack.cpp:126
&gt; +bool LoadableTextTrack::fireTrackElementCueChangeEvent()

Nit: I think the old name made more sense

&gt; Source/WebCore/html/TextTrack.cpp:275
&gt; +    if (m_trackIndex == -1)

I would rather see a named const used here instead of &quot;-1&quot;.

&gt; Source/WebCore/html/TextTrack.cpp:283
&gt; +    m_trackIndex = -1;

Ditto.

&gt; Source/WebCore/html/TextTrackCue.cpp:331
&gt; +    if (m_cueIndex == -1)

Ditto.

&gt; Source/WebCore/html/TextTrackCue.cpp:339
&gt; +    m_cueIndex = -1;

Ditto.

&gt; LayoutTests/ChangeLog:302
&gt; +&gt;&gt;&gt;&gt;&gt;&gt;&gt; master

??

&gt; LayoutTests/ChangeLog:3899
&gt; +&gt;&gt;&gt;&gt;&gt;&gt;&gt; master

??

&gt; LayoutTests/media/track/track-cues-sorted-before-dispatch.html:62
&gt; +            function logEndTest() {

This brace should go on the next line.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>559314</commentid>
    <comment_count>13</comment_count>
      <attachid>127610</attachid>
    <who name="Victor Carbune">vcarbune</who>
    <bug_when>2012-02-17 10:41:09 -0800</bug_when>
    <thetext>Created attachment 127610
Merged with trunk and corrected issues and tests

The previous flaky test should be working now</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>559369</commentid>
    <comment_count>14</comment_count>
      <attachid>127610</attachid>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2012-02-17 11:27:28 -0800</bug_when>
    <thetext>Comment on attachment 127610
Merged with trunk and corrected issues and tests

Thanks Victor!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>560221</commentid>
    <comment_count>15</comment_count>
      <attachid>127610</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-20 07:02:26 -0800</bug_when>
    <thetext>Comment on attachment 127610
Merged with trunk and corrected issues and tests

Clearing flags on attachment: 127610

Committed r108241: &lt;http://trac.webkit.org/changeset/108241&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>560222</commentid>
    <comment_count>16</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-20 07:02:32 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>119785</attachid>
            <date>2011-12-18 16:11:00 -0800</date>
            <delta_ts>2012-01-02 16:11:41 -0800</delta_ts>
            <desc>Implemented the specifications from the standard</desc>
            <filename>bug-72171-20111219021058.patch</filename>
            <type>text/plain</type>
            <size>13417</size>
            <attacher name="Victor Carbune">vcarbune</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAzMTkyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggODYxOTcxMmU5NDU1ZmQw
ZDA3M2RmYTllZDY0ZGRiYjg3NTRkY2I2MS4uMWIwNjg4YTdhNzE4MzFmMzVmNzk2ZmQ1NDZiNTBk
ZGNhNzM0OGI1ZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM0IEBACisyMDExLTEyLTE4ICBWaWN0
b3IgQ2FyYnVuZSAgPHZpY3RvckByb3NlZHUub3JnPgorCisgICAgICAgIFNvbHZlZCBidWcgNzIx
NzEgYnkgYWRkaW5nIHRoZSByZXF1aXJlbWVudHMgZnJvbSB0aGUgc3BlY3MuCisgICAgICAgIFRo
aXMgaXMgYSBwcmVsaW1pbmFyeSB1cGRhdGUgb2YgdGhlIHdvcmsgSSdtIGN1cnJlbnRseSBkb2lu
Zy4gVGVzdHMgd2lsbCBhbHNvIGJlIGFkZGVkLgorCisgICAgICAgIDx0cmFjaz4tcmVsYXRlZCBl
dmVudHMgY3VlY2hhbmdlLCBlbnRlciwgYW5kIGV4aXQgc2hvdWxkIGJlIHNvcnRlZCBhbmQgZmls
dGVyZWQgYmVmb3JlIGRpc3BhdGNoaW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD03MjE3MQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cy4gKE9PUFMhKQorCisgICAgICAgICogaHRtbC9I
VE1MTWVkaWFFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxNZWRpYUVsZW1lbnQ6
OkhUTUxNZWRpYUVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6ZXZlbnRUaW1lQ3VlQ29tcGFy
ZSk6CisgICAgICAgIChXZWJDb3JlOjp0cmFja0luZGV4Q29tcGFyZSk6CisgICAgICAgIChXZWJD
b3JlOjpIVE1MTWVkaWFFbGVtZW50Ojp1cGRhdGVBY3RpdmVUZXh0VHJhY2tDdWVzKToKKyAgICAg
ICAgKFdlYkNvcmU6OkhUTUxNZWRpYUVsZW1lbnQ6OnBsYXliYWNrUHJvZ3Jlc3NUaW1lckZpcmVk
KToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxNZWRpYUVsZW1lbnQ6Om1lZGlhUGxheWVyVGltZUNo
YW5nZWQpOgorICAgICAgICAqIGh0bWwvSFRNTE1lZGlhRWxlbWVudC5oOgorICAgICAgICAqIGh0
bWwvVGV4dFRyYWNrQ3VlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlRleHRUcmFja0N1ZTo6c2V0
SXNBY3RpdmUpOgorICAgICAgICAqIGh0bWwvVGV4dFRyYWNrQ3VlLmg6CisgICAgICAgICogaHRt
bC9UZXh0VHJhY2tDdWVMaXN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlRleHRUcmFja0N1ZUxp
c3Q6OmdldEN1ZUluZGV4KToKKyAgICAgICAgKiBodG1sL1RleHRUcmFja0N1ZUxpc3QuaDoKKyAg
ICAgICAgKiBodG1sL3RyYWNrL1RleHRUcmFja0xpc3QuY3BwOgorICAgICAgICAoVGV4dFRyYWNr
TGlzdDo6Z2V0VHJhY2tJbmRleCk6CisgICAgICAgICogaHRtbC90cmFjay9UZXh0VHJhY2tMaXN0
Lmg6CisgICAgICAgICogcGxhdGZvcm0vTG9nZ2luZy5jcHA6CisKIDIwMTEtMTItMTggIEFudHRp
IEtvaXZpc3RvICA8YW50dGlAYXBwbGUuY29tPgogCiAgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD03Mzk1NApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
aHRtbC9IVE1MTWVkaWFFbGVtZW50LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTE1lZGlh
RWxlbWVudC5jcHAKaW5kZXggNjQ2MmFhYjY3OGI1NzQxYTU3ZGM1ZGU3NTA2OWYyMzFhZGNiNGE3
OS4uNDcyNGU1ZTIwMmFiYmZmMjNhNWVlZWM5OTUzYTkxN2JhODAzOWEyMyAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvaHRtbC9IVE1MTWVkaWFFbGVtZW50LmNwcAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9odG1sL0hUTUxNZWRpYUVsZW1lbnQuY3BwCkBAIC03NCw2ICs3NCw3IEBACiAjaW5jbHVk
ZSA8bGltaXRzPgogI2luY2x1ZGUgPHd0Zi9DdXJyZW50VGltZS5oPgogI2luY2x1ZGUgPHd0Zi9N
YXRoRXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL05vbkNvcHlpbmdTb3J0Lmg+CiAjaW5jbHVkZSA8
d3RmL1VpbnQ4QXJyYXkuaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CiAKQEAgLTIz
Miw2ICsyMzMsNyBAQCBIVE1MTWVkaWFFbGVtZW50OjpIVE1MTWVkaWFFbGVtZW50KGNvbnN0IFF1
YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50KiBkb2N1bQogI2lmIEVOQUJMRShWSURFT19U
UkFDSykKICAgICAsIG1fdHJhY2tzQXJlUmVhZHkodHJ1ZSkKICAgICAsIG1fdGV4dFRyYWNrcygw
KQorICAgICwgbV9sYXN0VGV4dFRyYWNrVXBkYXRlKDApCiAjZW5kaWYKICNpZiBFTkFCTEUoV0VC
X0FVRElPKQogICAgICwgbV9hdWRpb1NvdXJjZU5vZGUoMCkKQEAgLTkzOCwyNSArOTQwLDEyMSBA
QCB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OmxvYWRSZXNvdXJjZShjb25zdCBLVVJMJiBpbml0aWFs
VVJMLCBDb250ZW50VHlwZSYgY29udGVudAogfQogCiAjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQot
dm9pZCBIVE1MTWVkaWFFbGVtZW50Ojp1cGRhdGVBY3RpdmVUZXh0VHJhY2tDdWVzKGZsb2F0IG1v
dmllVGltZSkKK3N0YXRpYyBib29sIGV2ZW50VGltZUN1ZUNvbXBhcmUoY29uc3Qgc3RkOjpwYWly
IDxkb3VibGUsIFRleHRUcmFja0N1ZSo+JiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBzdGQ6OnBhaXIgPGRvdWJsZSwgVGV4dFRyYWNrQ3VlKj4mIGIpCiB7Ci0gICAg
VmVjdG9yPEN1ZUludGVydmFsVHJlZTo6SW50ZXJ2YWxUeXBlPiBwcmV2aW91c2x5VmlzaWJsZUN1
ZXMgPSBtX2N1cnJlbnRseVZpc2libGVDdWVzOworICAgIGlmIChhLmZpcnN0ID09IGIuZmlyc3Qp
IHsKKyAgICAgICAgaWYgKGEuc2Vjb25kLT50cmFjaygpID09IGIuc2Vjb25kLT50cmFjaygpKSB7
CisgICAgICAgICAgICByZXR1cm4gYS5zZWNvbmQtPnRyYWNrKCktPmN1ZXMoKS0+Z2V0Q3VlSW5k
ZXgoYS5zZWNvbmQpIC0KKyAgICAgICAgICAgICAgICAgICAgYi5zZWNvbmQtPnRyYWNrKCktPmN1
ZXMoKS0+Z2V0Q3VlSW5kZXgoYi5zZWNvbmQpIDwgMDsKKyAgICAgICAgfQogCi0gICAgbV9jdXJy
ZW50bHlWaXNpYmxlQ3VlcyA9IG1fY3VlVHJlZS5hbGxPdmVybGFwcyhtX2N1ZVRyZWUuY3JlYXRl
SW50ZXJ2YWwobW92aWVUaW1lLCBtb3ZpZVRpbWUpKTsKLSAgICAKLSAgICAvLyBGSVhNRSg3MjE3
MSk6IEV2ZW50cyBuZWVkIHRvIGJlIHNvcnRlZCBhbmQgZmlsdGVyZWQgYmVmb3JlIGRpc3BhdGNo
aW5nLgorICAgICAgICByZXR1cm4gYS5zZWNvbmQtPnRyYWNrKCktPm1lZGlhRWxlbWVudCgpLT50
ZXh0VHJhY2tzKCktPmdldFRyYWNrSW5kZXgoYS5zZWNvbmQtPnRyYWNrKCkpIC0KKyAgICAgICAg
ICAgICAgICBiLnNlY29uZC0+dHJhY2soKS0+bWVkaWFFbGVtZW50KCktPnRleHRUcmFja3MoKS0+
Z2V0VHJhY2tJbmRleChiLnNlY29uZC0+dHJhY2soKSkgPCAwOworICAgIH0KIAotICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgcHJldmlvdXNseVZpc2libGVDdWVzLnNpemUoKTsgKytpKSB7Ci0g
ICAgICAgIGlmICghbV9jdXJyZW50bHlWaXNpYmxlQ3Vlcy5jb250YWlucyhwcmV2aW91c2x5Vmlz
aWJsZUN1ZXNbaV0pKQotICAgICAgICAgICAgcHJldmlvdXNseVZpc2libGVDdWVzW2ldLmRhdGEo
KS0+c2V0SXNBY3RpdmUoZmFsc2UpOworICAgIHJldHVybiBhLmZpcnN0IC0gYi5maXJzdCA8IDA7
Cit9CisKK3N0YXRpYyBib29sIHRyYWNrSW5kZXhDb21wYXJlKFRleHRUcmFjayogJmEsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0VHJhY2sqICZiKQoreworICAgIHJldHVybiBh
LT5tZWRpYUVsZW1lbnQoKS0+dGV4dFRyYWNrcygpLT5nZXRUcmFja0luZGV4KGEpIC0KKyAgICAg
ICAgICAgIGItPm1lZGlhRWxlbWVudCgpLT50ZXh0VHJhY2tzKCktPmdldFRyYWNrSW5kZXgoYik7
Cit9CisKK3ZvaWQgSFRNTE1lZGlhRWxlbWVudDo6dXBkYXRlQWN0aXZlVGV4dFRyYWNrQ3Vlcyhm
bG9hdCBtb3ZpZVRpbWUsIGJvb2wgc2Vla2luZykKK3sKKyAgICBWZWN0b3I8Q3VlSW50ZXJ2YWxU
cmVlOjpJbnRlcnZhbFR5cGU+IGFmZmVjdGVkQ3VlczsKKyAgICBWZWN0b3I8Q3VlSW50ZXJ2YWxU
cmVlOjpJbnRlcnZhbFR5cGU+IHByZXZpb3VzbHlWaXNpYmxlQ3VlczsKKyAgICBWZWN0b3I8Q3Vl
SW50ZXJ2YWxUcmVlOjpJbnRlcnZhbFR5cGU+IG1pc3NlZEN1ZXM7CisKKyAgICBwcmV2aW91c2x5
VmlzaWJsZUN1ZXMgPSBtX2N1cnJlbnRseVZpc2libGVDdWVzOworCisgICAgbV9jdXJyZW50bHlW
aXNpYmxlQ3VlcyA9CisgICAgICAgIG1fY3VlVHJlZS5hbGxPdmVybGFwcyhtX2N1ZVRyZWUuY3Jl
YXRlSW50ZXJ2YWwobW92aWVUaW1lLCBtb3ZpZVRpbWUpKTsKKworCisgICAgaWYgKG1fbGFzdFRl
eHRUcmFja1VwZGF0ZSAmJiAhc2Vla2luZykgeworICAgICAgICBWZWN0b3I8Q3VlSW50ZXJ2YWxU
cmVlOjpJbnRlcnZhbFR5cGU+IHBvdGVudGlhbGx5U2tpcHBlZEN1ZXMgPQorICAgICAgICAgICAg
bV9jdWVUcmVlLmFsbE92ZXJsYXBzKG1fY3VlVHJlZS5jcmVhdGVJbnRlcnZhbChtX2xhc3RUZXh0
VHJhY2tVcGRhdGUsIG1vdmllVGltZSkpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgcG90ZW50aWFsbHlTa2lwcGVkQ3Vlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYg
KHBvdGVudGlhbGx5U2tpcHBlZEN1ZXNbaV0ubG93KCkgPiBtX2xhc3RUZXh0VHJhY2tVcGRhdGUK
KyAgICAgICAgICAgICAgICAmJiBwb3RlbnRpYWxseVNraXBwZWRDdWVzW2ldLmhpZ2goKSA8IG1v
dmllVGltZSkgeworICAgICAgICAgICAgICAgIG1pc3NlZEN1ZXMuYXBwZW5kKHBvdGVudGlhbGx5
U2tpcHBlZEN1ZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQotICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9jdXJyZW50bHlWaXNpYmxlQ3Vlcy5zaXplKCk7ICsraSkg
ewotICAgICAgICBpZiAoIXByZXZpb3VzbHlWaXNpYmxlQ3Vlcy5jb250YWlucyhtX2N1cnJlbnRs
eVZpc2libGVDdWVzW2ldKSkKLSAgICAgICAgICAgIG1fY3VycmVudGx5VmlzaWJsZUN1ZXNbaV0u
ZGF0YSgpLT5zZXRJc0FjdGl2ZSh0cnVlKTsKKworICAgIC8vIFRPRE8odmNhcmJ1bmUpOiBTdGVw
IDUuCisKKyAgICBib29sIHNob3VsZEFib3JkID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IHByZXZpb3VzbHlWaXNpYmxlQ3Vlcy5zaXplKCkgJiYgc2hvdWxkQWJvcmQ7ICsraSkg
eworICAgICAgICBpZiAoIW1fY3VycmVudGx5VmlzaWJsZUN1ZXMuY29udGFpbnMocHJldmlvdXNs
eVZpc2libGVDdWVzW2ldKQorICAgICAgICAgICAgJiYgcHJldmlvdXNseVZpc2libGVDdWVzW2ld
LmRhdGEoKS0+aXNBY3RpdmUoKSkgeworICAgICAgICAgICAgc2hvdWxkQWJvcmQgPSBmYWxzZTsK
KyAgICAgICAgfQogICAgIH0KLSAgICAKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9j
dXJyZW50bHlWaXNpYmxlQ3Vlcy5zaXplKCkgJiYgc2hvdWxkQWJvcmQ7ICsraSkgeworICAgICAg
ICBpZiAoIW1fY3VycmVudGx5VmlzaWJsZUN1ZXNbaV0uZGF0YSgpLT5pc0FjdGl2ZSgpKQorICAg
ICAgICAgICAgc2hvdWxkQWJvcmQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobWlzc2VkQ3Vl
cy5zaXplKCkpCisgICAgICAgIHNob3VsZEFib3JkID0gZmFsc2U7CisKKyAgICBtX2xhc3RUZXh0
VHJhY2tVcGRhdGUgPSBtb3ZpZVRpbWU7CisKKyAgICBpZiAoc2hvdWxkQWJvcmQpCisgICAgICAg
IHJldHVybjsKKworICAgIC8vIFRPRE8odmNhcmJ1bmUpOiBTdGVwIDcuCiAgICAgLy8gRklYTUUo
NzIxNzMpOiBQYXVzZSB0aGUgbWVkaWEgZWxlbWVudCBmb3IgY3VlcyBnb2luZyBwYXN0IHRoZWly
IGVuZFRpbWUKICAgICAvLyBkdXJpbmcgYSBtb25vdG9uaWMgdGltZSBpbmNyZWFzZS4KKworICAg
IFZlY3RvcjxUZXh0VHJhY2sqPiBhZmZlY3RlZFRyYWNrczsKKyAgICBWZWN0b3I8RXZlbnRUaW1l
Q3VlUGFpcj4gZXZlbnRUYXNrczsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWlzc2Vk
Q3Vlcy5zaXplKCk7ICsraSkgeworICAgICAgICBldmVudFRhc2tzLmFwcGVuZChzdGQ6Om1ha2Vf
cGFpcihtaXNzZWRDdWVzW2ldLmRhdGEoKS0+c3RhcnRUaW1lKCksCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NlZEN1ZXNbaV0uZGF0YSgpKSk7CisKKyAgICAg
ICAgZXZlbnRUYXNrcy5hcHBlbmQoc3RkOjptYWtlX3BhaXIobWlzc2VkQ3Vlc1tpXS5kYXRhKCkt
PmVuZFRpbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlz
c2VkQ3Vlc1tpXS5kYXRhKCkpKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHByZXZpb3VzbHlWaXNpYmxlQ3Vlcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoIW1fY3Vy
cmVudGx5VmlzaWJsZUN1ZXMuY29udGFpbnMocHJldmlvdXNseVZpc2libGVDdWVzW2ldKSkgewor
ICAgICAgICAgICAgZXZlbnRUYXNrcy5hcHBlbmQoc3RkOjptYWtlX3BhaXIocHJldmlvdXNseVZp
c2libGVDdWVzW2ldLmRhdGEoKS0+ZW5kVGltZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNseVZpc2libGVDdWVzW2ldLmRhdGEoKSkpOwor
ICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2N1cnJlbnRs
eVZpc2libGVDdWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghcHJldmlvdXNseVZpc2li
bGVDdWVzLmNvbnRhaW5zKG1fY3VycmVudGx5VmlzaWJsZUN1ZXNbaV0pKSB7CisgICAgICAgICAg
ICBldmVudFRhc2tzLmFwcGVuZChzdGQ6Om1ha2VfcGFpcihtX2N1cnJlbnRseVZpc2libGVDdWVz
W2ldLmRhdGEoKS0+c3RhcnRUaW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtX2N1cnJlbnRseVZpc2libGVDdWVzW2ldLmRhdGEoKSkpOworICAgICAg
ICB9CisgICAgfQorCisgICAgbm9uQ29weWluZ1NvcnQoZXZlbnRUYXNrcy5iZWdpbigpLCBldmVu
dFRhc2tzLmVuZCgpLCBldmVudFRpbWVDdWVDb21wYXJlKTsKKworICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgZXZlbnRUYXNrcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoIWFmZmVjdGVk
VHJhY2tzLmNvbnRhaW5zKGV2ZW50VGFza3NbaV0uc2Vjb25kLT50cmFjaygpKSkKKyAgICAgICAg
ICAgIGFmZmVjdGVkVHJhY2tzLmFwcGVuZChldmVudFRhc2tzW2ldLnNlY29uZC0+dHJhY2soKSk7
CisKKyAgICAgICAgaWYgKGV2ZW50VGFza3NbaV0uZmlyc3QgPT0gZXZlbnRUYXNrc1tpXS5zZWNv
bmQtPnN0YXJ0VGltZSgpKQorICAgICAgICAgICAgZXZlbnRUYXNrc1tpXS5zZWNvbmQtPnNldElz
QWN0aXZlKHRydWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBldmVudFRhc2tzW2ldLnNl
Y29uZC0+c2V0SXNBY3RpdmUoZmFsc2UpOworICAgIH0KKworICAgIG5vbkNvcHlpbmdTb3J0KGFm
ZmVjdGVkVHJhY2tzLmJlZ2luKCksIGFmZmVjdGVkVHJhY2tzLmVuZCgpLCB0cmFja0luZGV4Q29t
cGFyZSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFmZmVjdGVkVHJhY2tzLnNpemUo
KTsgKytpKQorICAgICAgICBhZmZlY3RlZFRyYWNrc1tpXS0+ZmlyZUN1ZUNoYW5nZUV2ZW50KCk7
CiB9CiAKIGJvb2wgSFRNTE1lZGlhRWxlbWVudDo6dGV4dFRyYWNrc0FyZVJlYWR5KCkgY29uc3QK
QEAgLTIxMTEsNyArMjIwOSw3IEBAIHZvaWQgSFRNTE1lZGlhRWxlbWVudDo6cGxheWJhY2tQcm9n
cmVzc1RpbWVyRmlyZWQoVGltZXI8SFRNTE1lZGlhRWxlbWVudD4qKQogICAgIC8vIEZJWE1FOiBk
ZWFsIHdpdGggY3VlIHJhbmdlcyBoZXJlCiAgICAgCiAjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQot
ICAgIHVwZGF0ZUFjdGl2ZVRleHRUcmFja0N1ZXMoY3VycmVudFRpbWUoKSk7CisgICAgdXBkYXRl
QWN0aXZlVGV4dFRyYWNrQ3VlcyhjdXJyZW50VGltZSgpLCBmYWxzZSk7CiAjZW5kaWYKIH0KIApA
QCAtMjY0MCw3ICsyNzM4LDcgQEAgdm9pZCBIVE1MTWVkaWFFbGVtZW50OjptZWRpYVBsYXllclRp
bWVDaGFuZ2VkKE1lZGlhUGxheWVyKikKIAogICAgIHVwZGF0ZVBsYXlTdGF0ZSgpOwogI2lmIEVO
QUJMRShWSURFT19UUkFDSykKLSAgICB1cGRhdGVBY3RpdmVUZXh0VHJhY2tDdWVzKG5vdyk7Cisg
ICAgdXBkYXRlQWN0aXZlVGV4dFRyYWNrQ3Vlcyhub3csIHRydWUpOwogI2VuZGlmCiAgICAgZW5k
UHJvY2Vzc2luZ01lZGlhUGxheWVyQ2FsbGJhY2soKTsKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2h0bWwvSFRNTE1lZGlhRWxlbWVudC5oIGIvU291cmNlL1dlYkNvcmUvaHRtbC9IVE1M
TWVkaWFFbGVtZW50LmgKaW5kZXggN2QzZmFiZGMyOWIxNDgwOTYxZjk2NWNhN2JiOWY1MWYxMjZi
YjhhNC4uZTU3YjZiNDY3MmZiMDIxODZmNDc5MmMyZDA4YzAzZmNjZjBmYzE5MiAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MTWVkaWFFbGVtZW50LmgKKysrIGIvU291cmNlL1dl
YkNvcmUvaHRtbC9IVE1MTWVkaWFFbGVtZW50LmgKQEAgLTM5MCw3ICszOTAsNyBAQCBwcml2YXRl
OgogICAgIHZvaWQgbWVkaWFMb2FkaW5nRmFpbGVkKE1lZGlhUGxheWVyOjpOZXR3b3JrU3RhdGUp
OwogCiAjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQotICAgIHZvaWQgdXBkYXRlQWN0aXZlVGV4dFRy
YWNrQ3VlcyhmbG9hdCk7CisgICAgdm9pZCB1cGRhdGVBY3RpdmVUZXh0VHJhY2tDdWVzKGZsb2F0
LCBib29sKTsKICAgICBib29sIHVzZXJJc0ludGVyZXN0ZWRJblRoaXNMYW5ndWFnZShjb25zdCBT
dHJpbmcmKSBjb25zdDsKICAgICBib29sIHVzZXJJc0ludGVyZXN0ZWRJblRoaXNUcmFjayhIVE1M
VHJhY2tFbGVtZW50KikgY29uc3Q7CiAgICAgSFRNTFRyYWNrRWxlbWVudCogc2hvd2luZ1RyYWNr
V2l0aFNhbWVLaW5kKEhUTUxUcmFja0VsZW1lbnQqKSBjb25zdDsKQEAgLTU1MSwxMCArNTUxLDE0
IEBAIHByaXZhdGU6CiAgICAgYm9vbCBtX3RyYWNrc0FyZVJlYWR5IDogMTsKICAgICBSZWZQdHI8
VGV4dFRyYWNrTGlzdD4gbV90ZXh0VHJhY2tzOwogICAgIFZlY3RvcjxSZWZQdHI8VGV4dFRyYWNr
PiA+IG1fdGV4dFRyYWNrc1doZW5SZXNvdXJjZVNlbGVjdGlvbkJlZ2FuOwotICAgIAorCisgICAg
dHlwZWRlZiBzdGQ6OnBhaXIgPGRvdWJsZSwgVGV4dFRyYWNrQ3VlKj4gRXZlbnRUaW1lQ3VlUGFp
cjsKKwogICAgIHR5cGVkZWYgUE9ESW50ZXJ2YWxUcmVlIDxkb3VibGUsIFRleHRUcmFja0N1ZSo+
IEN1ZUludGVydmFsVHJlZTsKICAgICBDdWVJbnRlcnZhbFRyZWUgbV9jdWVUcmVlOwogICAgIFZl
Y3RvcjxDdWVJbnRlcnZhbFRyZWU6OkludGVydmFsVHlwZT4gbV9jdXJyZW50bHlWaXNpYmxlQ3Vl
czsKKworICAgIGZsb2F0IG1fbGFzdFRleHRUcmFja1VwZGF0ZTsKICNlbmRpZgogCiAjaWYgRU5B
QkxFKFdFQl9BVURJTykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNr
Q3VlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlLmNwcAppbmRleCA1NTUx
OWU1YmQ2NWRiNmNiYzBhYmUzNTkxZDNlYWZhZWQ5YzY3NTFjLi5jMmQyZGYyY2MwMzcwNDM1MTM5
ZGI4MTRjMWI3MmNhZjkzMDEzNzg2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1sL1Rl
eHRUcmFja0N1ZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2tDdWUuY3Bw
CkBAIC0xNTUsOSArMTU1LDYgQEAgdm9pZCBUZXh0VHJhY2tDdWU6OnNldElzQWN0aXZlKGJvb2wg
YWN0aXZlKQogICAgICAgICBkaXNwYXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygp
LmVudGVyRXZlbnQsIGZhbHNlLCBmYWxzZSksIGVjKTsKICAgICBlbHNlCiAgICAgICAgIGRpc3Bh
dGNoRXZlbnQoRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkuZXhpdEV2ZW50LCBmYWxzZSwgZmFs
c2UpLCBlYyk7Ci0KLSAgICBpZiAobV90cmFjaykKLSAgICAgICAgbV90cmFjay0+ZmlyZUN1ZUNo
YW5nZUV2ZW50KCk7CiB9CiAKIHZvaWQgVGV4dFRyYWNrQ3VlOjpwYXJzZVNldHRpbmdzKGNvbnN0
IFN0cmluZyYgaW5wdXQpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFj
a0N1ZS5oIGIvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2tDdWUuaAppbmRleCA5NDgwYWZh
MGFkZjQ5M2IzY2RmOTA1YTU2MTNiMGRhNTU4YWI1OWIwLi40ZTRmZjUzM2QxYTExMDk0N2RlM2Nl
OTY3NGZlM2IzMjFhZGY2ZjdmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRU
cmFja0N1ZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlLmgKQEAgLTYz
LDcgKzYzLDcgQEAgcHVibGljOgogICAgIGRvdWJsZSBzdGFydFRpbWUoKSBjb25zdDsKICAgICBk
b3VibGUgZW5kVGltZSgpIGNvbnN0OwogICAgIGJvb2wgcGF1c2VPbkV4aXQoKSBjb25zdDsKLSAg
ICAKKwogICAgIFN0cmluZyBkaXJlY3Rpb24oKSBjb25zdDsKICAgICBib29sIHNuYXBUb0xpbmVz
KCkgY29uc3QgeyByZXR1cm4gbV9zbmFwVG9MaW5lczsgfQogICAgIGludCBsaW5lUG9zaXRpb24o
KSBjb25zdCB7IHJldHVybiBtX2xpbmVQb3NpdGlvbjsgfQpAQCAtNzcsNyArNzcsNyBAQCBwdWJs
aWM6CiAKICAgICBib29sIGlzQWN0aXZlKCk7CiAgICAgdm9pZCBzZXRJc0FjdGl2ZShib29sKTsK
LSAgICAKKwogICAgIHZpcnR1YWwgY29uc3QgQXRvbWljU3RyaW5nJiBpbnRlcmZhY2VOYW1lKCkg
Y29uc3Q7CiAgICAgdmlydHVhbCBTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBzY3JpcHRFeGVjdXRp
b25Db250ZXh0KCkgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4
dFRyYWNrQ3VlTGlzdC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFja0N1ZUxpc3Qu
Y3BwCmluZGV4IDM0YjcxY2ExYjA1OGFmM2I5ZWNiMmQ4NWYzNjIxNTkyYmRiM2JmZDAuLmU5YWNm
YzAxZDFmOWI5YjhjOGI2MjdmNzM0ZmRmMmMwNWU0ZDhlYmEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlTGlzdC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvaHRt
bC9UZXh0VHJhY2tDdWVMaXN0LmNwcApAQCAtNDAsNiArNDAsMTYgQEAgdW5zaWduZWQgbG9uZyBU
ZXh0VHJhY2tDdWVMaXN0OjpsZW5ndGgoKSBjb25zdAogICAgIHJldHVybiBtX2xpc3Quc2l6ZSgp
OwogfQogCit1bnNpZ25lZCBsb25nIFRleHRUcmFja0N1ZUxpc3Q6OmdldEN1ZUluZGV4KFRleHRU
cmFja0N1ZSogY3VlKSBjb25zdAoreworICAgIGZvciAodW5zaWduZWQgbG9uZyBpbmRleCA9IDA7
IGluZGV4IDwgbV9saXN0LnNpemUoKTsgKytpbmRleCkgeworICAgICAgICBpZiAobV9saXN0W2lu
ZGV4XS5nZXQoKSA9PSBjdWUpCisgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisg
ICAgcmV0dXJuIDA7Cit9CisKIFRleHRUcmFja0N1ZSogVGV4dFRyYWNrQ3VlTGlzdDo6aXRlbSh1
bnNpZ25lZCBpbmRleCkgY29uc3QKIHsKICAgICBpZiAoaW5kZXggPCBtX2xpc3Quc2l6ZSgpKQpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2tDdWVMaXN0LmggYi9Tb3Vy
Y2UvV2ViQ29yZS9odG1sL1RleHRUcmFja0N1ZUxpc3QuaAppbmRleCA3YTdmOTA0MTVhN2ZlYjZm
Y2RkNjVhNDgxZGNjYzAxNjY2OWUyOWU4Li4xZDEyMzM1Yzg4ZjdmMWFmOTdiNDQ1YTg3MDZjMDVk
MzRjNmNmYWFiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFja0N1ZUxp
c3QuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFja0N1ZUxpc3QuaApAQCAtNDUs
NiArNDUsOCBAQCBwdWJsaWM6CiAgICAgflRleHRUcmFja0N1ZUxpc3QoKSB7IH0KIAogICAgIHVu
c2lnbmVkIGxvbmcgbGVuZ3RoKCkgY29uc3Q7CisgICAgdW5zaWduZWQgbG9uZyBnZXRDdWVJbmRl
eChUZXh0VHJhY2tDdWUqKSBjb25zdDsKKwogICAgIFRleHRUcmFja0N1ZSogaXRlbSh1bnNpZ25l
ZCBpbmRleCkgY29uc3Q7CiAgICAgVGV4dFRyYWNrQ3VlKiBnZXRDdWVCeUlkKGNvbnN0IFN0cmlu
ZyYpIGNvbnN0OwogICAgIFRleHRUcmFja0N1ZUxpc3QqIGFjdGl2ZUN1ZXMoKTsKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvdHJhY2svVGV4dFRyYWNrTGlzdC5jcHAgYi9Tb3VyY2Uv
V2ViQ29yZS9odG1sL3RyYWNrL1RleHRUcmFja0xpc3QuY3BwCmluZGV4IDc3ZDk2NzNkNDMxNjQx
YjQ3MWI0YTk2ZDdiYmVhNzFlMmY1NDAyYzguLjgwYzcyNTY4ODE1ZGM0ZjUzMGYyOTFlNmViY2Yy
OGZlOWJiYjYxYTAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvdHJhY2svVGV4dFRy
YWNrTGlzdC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC90cmFjay9UZXh0VHJhY2tMaXN0
LmNwcApAQCAtNTUsNiArNTUsMTYgQEAgdW5zaWduZWQgVGV4dFRyYWNrTGlzdDo6bGVuZ3RoKCkg
Y29uc3QKICAgICByZXR1cm4gbV9hZGRUcmFja1RyYWNrcy5zaXplKCkgKyBtX2VsZW1lbnRUcmFj
a3Muc2l6ZSgpOwogfQogCit1bnNpZ25lZCBUZXh0VHJhY2tMaXN0OjpnZXRUcmFja0luZGV4KFRl
eHRUcmFjayAqdGV4dFRyYWNrKQoreworICAgIGZvciAodW5zaWduZWQgaW5kZXggPSAwOyBpbmRl
eCA8IG1fZWxlbWVudFRyYWNrcy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgaWYgKG1fZWxl
bWVudFRyYWNrc1tpbmRleF0uZ2V0KCkgPT0gdGV4dFRyYWNrKQorICAgICAgICAgICAgcmV0dXJu
IGluZGV4OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCiBUZXh0VHJhY2sqIFRleHRUcmFj
a0xpc3Q6Oml0ZW0odW5zaWduZWQgaW5kZXgpCiB7CiAgICAgLy8gNC44LjEwLjEyLjEgVGV4dCB0
cmFjayBtb2RlbApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC90cmFjay9UZXh0VHJh
Y2tMaXN0LmggYi9Tb3VyY2UvV2ViQ29yZS9odG1sL3RyYWNrL1RleHRUcmFja0xpc3QuaAppbmRl
eCA4OGQ5YWY2MmUwMmIyMjk1NzQ3NTM2NzdlZjIxNTE5MTZiZTY1ZWU3Li5mOGYwNGZmYTk4NTA3
Y2RkMGY2ZDRiNWU4OTg4NzQ3ZTU0ZmE4NTZhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9o
dG1sL3RyYWNrL1RleHRUcmFja0xpc3QuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL3RyYWNr
L1RleHRUcmFja0xpc3QuaApAQCAtNTEsNiArNTEsOCBAQCBwdWJsaWM6CiAgICAgflRleHRUcmFj
a0xpc3QoKTsKIAogICAgIHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0OworICAgIHVuc2lnbmVkIGdl
dFRyYWNrSW5kZXgoVGV4dFRyYWNrKik7CisKICAgICBUZXh0VHJhY2sqIGl0ZW0odW5zaWduZWQg
aW5kZXgpOwogICAgIHZvaWQgYXBwZW5kKFBhc3NSZWZQdHI8VGV4dFRyYWNrPik7CiAgICAgdm9p
ZCByZW1vdmUoVGV4dFRyYWNrKik7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>120898</attachid>
            <date>2012-01-02 16:11:50 -0800</date>
            <delta_ts>2012-02-07 17:37:12 -0800</delta_ts>
            <desc>Updated code, tests and spec in comments</desc>
            <filename>bug-72171-20120103021148.patch</filename>
            <type>text/plain</type>
            <size>26999</size>
            <attacher name="Victor Carbune">vcarbune</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTAzOTA2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMDkzY2ZjNWZlZmUxNWI5
MDFmYzY1MDhlYzkyODRlZjAyNDRhOTg4NC4uN2I2YTUyOTUzYWZiZjM0MDY5YTUwYzUzNzFhYmM0
Y2Y5YzY5NjgzZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ2IEBACisyMDEyLTAxLTAyICBWaWN0
b3IgQ2FyYnVuZSAgPHZpY3RvckByb3NlZHUub3JnPgorCisgICAgICAgIEFkZGVkIGNvZGUgdG8g
c3VwcG9ydCBkaXNwYXRjaGluZyBvZiBtaXNzZWQgY3VlcyBpbiBjYXNlIG9mIG5vcm1hbCBwbGF5
YmFjaworICAgICAgICBhbmQgZXZlbnQgc29ydGluZyBpbiBjYXNlIG9mIHNpbXVsdGFuZW91cyBl
dmVudCB0cmlnZ2VyaW5nLgorCisgICAgICAgIDx0cmFjaz4tcmVsYXRlZCBldmVudHMgY3VlY2hh
bmdlLCBlbnRlciwgYW5kIGV4aXQgc2hvdWxkIGJlIHNvcnRlZCBhbmQgZmlsdGVyZWQgYmVmb3Jl
IGRpc3BhdGNoaW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD03MjE3MQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFRlc3RzOiBtZWRpYS90cmFjay90cmFjay1jdWVzLW1pc3NlZC5odG1sCisgICAgICAgICAg
ICAgICBtZWRpYS90cmFjay90cmFjay1jdWVzLXNvcnRlZC1iZWZvcmUtZGlzcGF0Y2guaHRtbAor
CisgICAgICAgICogaHRtbC9IVE1MTWVkaWFFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkhUTUxNZWRpYUVsZW1lbnQ6OkhUTUxNZWRpYUVsZW1lbnQpOiBBZGRlZCBpbml0aWFsaXphdGlv
biBjb2RlCisgICAgICAgIGZvciBuZXdseSBhZGRlZCBzdGF0ZSB2YXJpYWJsZXMuCisgICAgICAg
IChXZWJDb3JlOjpldmVudFRpbWVDdWVDb21wYXJlKTogU3RhdGljIGJvb2xlYW4gY29tcGFyZSBm
dW5jdGlvbiBiZXR3ZWVuCisgICAgICAgIGV2ZW50cyBhc3NvY2lhdGVkIHdpdGggdGV4dCB0cmFj
ayBjdWVzLgorICAgICAgICAoV2ViQ29yZTo6dHJhY2tJbmRleENvbXBhcmUpOiBTdGF0aWMgYm9v
bGVhbiBjb21wYXJlIGZ1bmN0aW9uIGJldHdlZW4KKyAgICAgICAgdGhlIGluZGV4IG9mIHR3byB0
cmFja3MuCisgICAgICAgIChXZWJDb3JlOjpIVE1MTWVkaWFFbGVtZW50Ojp1cGRhdGVBY3RpdmVU
ZXh0VHJhY2tDdWVzKTogQWRkZWQgY29kZSB0bworICAgICAgICBzb3J0IHRoZSBldmVudHMgYXNz
b2NpYXRlZCB3aXRoIHRleHQgdHJhY2sgY3VlcyBiZWZvcmUgZGlzcGF0Y2hpbmcuCisgICAgICAg
IEVhY2ggc3RlcCBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGlzIGNvbW1lbnRlZCB3aXRoaW4gdGhl
IGNvZGUuCisgICAgICAgIChXZWJDb3JlOjpIVE1MTWVkaWFFbGVtZW50OjpmaW5pc2hTZWVrKTog
QWRkZWQgYSBib29sZWFuIHZhcmlhYmxlIHRoYXQKKyAgICAgICAgaXMgbmVlZGVkIHdpdGhpbiB0
aGUgdGV4dCB0cmFjayB1cGRhdGUgZnVuY3Rpb24sIHRvIGtub3cgd2hldGhlciBhIHNlZWsKKyAg
ICAgICAgZXZlbnQgaGFzIG9jY3VyZWQgYmVmb3JlIG9yIG5vdC4KKyAgICAgICAgKiBodG1sL0hU
TUxNZWRpYUVsZW1lbnQuaDogQWRkZWQgdmFyaWFibGVzIHRvIGtlZXAKKyAgICAgICAgc3RhdGUg
aW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgdGhlIHRleHQgdHJhY2sgdXBkYXRlIGFsZ29yaXRobSAo
bGFzdCB0aW1lCisgICAgICAgIHRoZSBhbGdvcml0aG0gd2FzIHJ1biwgYW5kIHdoZXRoZXIgYSBz
ZWVraW5nIGV2ZW50IGhhcyBvY2N1cmVkKQorICAgICAgICAqIGh0bWwvVGV4dFRyYWNrQ3VlLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OlRleHRUcmFja0N1ZTo6c2V0SXNBY3RpdmUpOiBDdWUgY2hh
bmdlIGV2ZW50IHNob3VsZCBub3QgYmUgZmlyZWQKKyAgICAgICAgaW4gdGhlIHNhbWUgdGltZSB3
aXRoIGVudGVyIC8gZXhpdCBldmVudHMuIEl0IHNob3VsZCBiZSBkaXNwYXRjaGVkIGFmdGVyLAor
ICAgICAgICBpbiByZWxhdGl2ZSBvcmRlciB0byB0aGUgb3RoZXIgY3VlIGNoYW5nZSBldmVudHMu
CisgICAgICAgICogaHRtbC9UZXh0VHJhY2tDdWUuaDoKKyAgICAgICAgKiBodG1sL1RleHRUcmFj
a0N1ZUxpc3QuY3BwOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFRyYWNrQ3VlTGlzdDo6Z2V0Q3Vl
SW5kZXgpOiBSZXRyaWV2ZXMgdGhlIGluZGV4IG9mIGEgZ2l2ZW4gY3VlCisgICAgICAgIHdpdGhp
biB0aGUgVGV4dFRyYWNrQ3VlTGlzdCBpbnN0YW5jZS4KKyAgICAgICAgKiBodG1sL1RleHRUcmFj
a0N1ZUxpc3QuaDoKKyAgICAgICAgKiBodG1sL3RyYWNrL1RleHRUcmFja0xpc3QuY3BwOgorICAg
ICAgICAoVGV4dFRyYWNrTGlzdDo6Z2V0VHJhY2tJbmRleCk6IFJldHJpZXZlcyB0aGUgaW5kZXgg
b2YgYSBnaXZlbiB0cmFjayB3aXRoaW4gdGhlCisgICAgICAgIFRleHRUcmFja0xpc3QgaW5zdGFu
Y2UuCisgICAgICAgICogaHRtbC90cmFjay9UZXh0VHJhY2tMaXN0Lmg6CisKIDIwMTEtMTItMjkg
IENhaW8gTWFyY2VsbyBkZSBPbGl2ZWlyYSBGaWxobyAgPGNhaW8ub2xpdmVpcmFAb3BlbmJvc3Nh
Lm9yZz4KIAogICAgICAgICBVc2UgSGFzaE1hcDxPd25QdHI+IGluIFJlbmRlclNWR1Jlc291cmNl
R3JhZGllbnQKQEAgLTgxNjYsNiArODIwOSw3IEBACiAKICAgICAgICAgKiBodG1sL3BhcnNlci9I
VE1MVHJlZUJ1aWxkZXIuY3BwOgogICAgICAgICAoV2ViQ29yZTo6SFRNTFRyZWVCdWlsZGVyOjpj
YWxsVGhlQWRvcHRpb25BZ2VuY3kpOgorPj4+Pj4+PiBtYXN0ZXIKIAogMjAxMS0xMi0xOCAgQW50
dGkgS29pdmlzdG8gIDxhbnR0aUBhcHBsZS5jb20+CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2h0bWwvSFRNTE1lZGlhRWxlbWVudC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxN
ZWRpYUVsZW1lbnQuY3BwCmluZGV4IGY2Y2I4MjVmNGI1NDZmZDU5MmYxODIwZGNiOGUyZDhiN2Iz
YzRlNWIuLjE0MGQ5N2M2NGFmMzUzZmU5MzY1YjdkZjhiNzE1NmJmYzRkNGQ4MTQgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTE1lZGlhRWxlbWVudC5jcHAKKysrIGIvU291cmNl
L1dlYkNvcmUvaHRtbC9IVE1MTWVkaWFFbGVtZW50LmNwcApAQCAtNzQsNiArNzQsNyBAQAogI2lu
Y2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KICNpbmNsdWRlIDx3
dGYvTWF0aEV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9Ob25Db3B5aW5nU29ydC5oPgogI2luY2x1
ZGUgPHd0Zi9VaW50OEFycmF5Lmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCkBA
IC0yMzIsNiArMjMzLDggQEAgSFRNTE1lZGlhRWxlbWVudDo6SFRNTE1lZGlhRWxlbWVudChjb25z
dCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lLCBEb2N1bWVudCogZG9jdW0KICNpZiBFTkFCTEUoVklE
RU9fVFJBQ0spCiAgICAgLCBtX3RyYWNrc0FyZVJlYWR5KHRydWUpCiAgICAgLCBtX2hhdmVWaXNp
YmxlVGV4dFRyYWNrKGZhbHNlKQorICAgICwgbV9zZWVraW5nQmVmb3JlVGV4dFRyYWNrVXBkYXRl
KGZhbHNlKQorICAgICwgbV9sYXN0VGV4dFRyYWNrVXBkYXRlKDApCiAgICAgLCBtX3RleHRUcmFj
a3MoMCkKICNlbmRpZgogI2lmIEVOQUJMRShXRUJfQVVESU8pCkBAIC05NDMsMzEgKzk0NiwxNTkg
QEAgdm9pZCBIVE1MTWVkaWFFbGVtZW50Ojpsb2FkUmVzb3VyY2UoY29uc3QgS1VSTCYgaW5pdGlh
bFVSTCwgQ29udGVudFR5cGUmIGNvbnRlbnQKIH0KIAogI2lmIEVOQUJMRShWSURFT19UUkFDSykK
K3N0YXRpYyBib29sIGV2ZW50VGltZUN1ZUNvbXBhcmUoY29uc3Qgc3RkOjpwYWlyIDxkb3VibGUs
IFRleHRUcmFja0N1ZSo+JiBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBzdGQ6OnBhaXIgPGRvdWJsZSwgVGV4dFRyYWNrQ3VlKj4mIGIpCit7CisgICAgLy8gMTIgLSBT
b3J0IHRoZSB0YXNrcyBpbiBldmVudHMgaW4gYXNjZW5kaW5nIHRpbWUgb3JkZXIgKHRhc2tzIHdp
dGggZWFybGllcgorICAgIC8vIHRpbWVzIGZpcnN0KS4KKyAgICBpZiAoYS5maXJzdCA9PSBiLmZp
cnN0KSB7CisgICAgICAgIGludCBhQ3VlSW5kZXggPSBhLnNlY29uZC0+dHJhY2soKS0+Y3Vlcygp
LT5nZXRDdWVJbmRleChhLnNlY29uZCk7CisgICAgICAgIGludCBiQ3VlSW5kZXggPSBiLnNlY29u
ZC0+dHJhY2soKS0+Y3VlcygpLT5nZXRDdWVJbmRleChiLnNlY29uZCk7CisKKyAgICAgICAgaWYg
KGEuc2Vjb25kLT50cmFjaygpID09IGIuc2Vjb25kLT50cmFjaygpKSB7CisgICAgICAgICAgICAv
LyAxMiAtIEZ1cnRoZXIgc29ydCB0YXNrcyBpbiBldmVudHMgdGhhdCBoYXZlIHRoZSBzYW1lIHRp
bWUgYnkgdGhlCisgICAgICAgICAgICAvLyByZWxhdGl2ZSB0ZXh0IHRyYWNrIGN1ZSBvcmRlciBv
ZiB0aGUgdGV4dCB0cmFjayBjdWVzIGFzc29jaWF0ZWQKKyAgICAgICAgICAgIC8vIHdpdGggdGhl
c2UgdGFza3MuCisgICAgICAgICAgICByZXR1cm4gYUN1ZUluZGV4IC0gYkN1ZUluZGV4IDwgMDsK
KyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBhLmZpcnN0IC0gYi5maXJzdCA8IDA7Cit9
CisKK3N0YXRpYyBib29sIHRyYWNrSW5kZXhDb21wYXJlKFRleHRUcmFjayogJmEsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBUZXh0VHJhY2sqICZiKQoreworICAgIGludCBhVHJhY2tJ
bmRleCA9IGEtPm1lZGlhRWxlbWVudCgpLT50ZXh0VHJhY2tzKCktPmdldFRyYWNrSW5kZXgoYSk7
CisgICAgaW50IGJUcmFja0luZGV4ID0gYi0+bWVkaWFFbGVtZW50KCktPnRleHRUcmFja3MoKS0+
Z2V0VHJhY2tJbmRleChiKTsKKworICAgIHJldHVybiBhVHJhY2tJbmRleCAtIGJUcmFja0luZGV4
OworfQorCiB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OnVwZGF0ZUFjdGl2ZVRleHRUcmFja0N1ZXMo
ZmxvYXQgbW92aWVUaW1lKQogewotICAgIEN1ZUxpc3QgcHJldmlvdXNseUFjdGl2ZUN1ZXMgPSBt
X2N1cnJlbnRseUFjdGl2ZUN1ZXM7Ci0gICAgYm9vbCBhY3RpdmVTZXRDaGFuZ2VkID0gZmFsc2U7
CisgICAgTE9HKE1lZGlhLCAiSFRNTE1lZGlhRWxlbWVudDo6dXBkYXRlQWN0aXZlVGV4dFRyYWNr
cyIpOwogCisgICAgVmVjdG9yPEN1ZUludGVydmFsVHJlZTo6SW50ZXJ2YWxUeXBlPiBhZmZlY3Rl
ZEN1ZXM7CisgICAgVmVjdG9yPEN1ZUludGVydmFsVHJlZTo6SW50ZXJ2YWxUeXBlPiBwcmV2aW91
c2x5VmlzaWJsZUN1ZXM7CisgICAgVmVjdG9yPEN1ZUludGVydmFsVHJlZTo6SW50ZXJ2YWxUeXBl
PiBtaXNzZWRDdWVzOworCisgICAgLy8gMiAtIG90aGVyIGN1ZXMKKyAgICBwcmV2aW91c2x5Vmlz
aWJsZUN1ZXMgPSBtX2N1cnJlbnRseUFjdGl2ZUN1ZXM7CisKKyAgICAvLyAxIC0gY3VycmVudCBj
dWVzCiAgICAgbV9jdXJyZW50bHlBY3RpdmVDdWVzID0gbV9jdWVUcmVlLmFsbE92ZXJsYXBzKG1f
Y3VlVHJlZS5jcmVhdGVJbnRlcnZhbChtb3ZpZVRpbWUsIG1vdmllVGltZSkpOwotICAgIAotICAg
IC8vIEZJWE1FKDcyMTcxKTogRXZlbnRzIG5lZWQgdG8gYmUgc29ydGVkIGFuZCBmaWx0ZXJlZCBi
ZWZvcmUgZGlzcGF0Y2hpbmcuCiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByZXZpb3Vz
bHlBY3RpdmVDdWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmICghbV9jdXJyZW50bHlBY3Rp
dmVDdWVzLmNvbnRhaW5zKHByZXZpb3VzbHlBY3RpdmVDdWVzW2ldKSkgewotICAgICAgICAgICAg
cHJldmlvdXNseUFjdGl2ZUN1ZXNbaV0uZGF0YSgpLT5zZXRJc0FjdGl2ZShmYWxzZSk7CisgICAg
Ly8gNCAtIERldGVybWluZSBtaXNzZWQgY3VlcywgaWYgcGxheWJhY2sgd2FzIGRvbmUgdGhyb3Vn
aCBub3JtYWwgbW9ub3RvbmljIGluY3JlYXNlLgorICAgIGlmIChtX2xhc3RUZXh0VHJhY2tVcGRh
dGUgJiYgIW1fc2Vla2luZ0JlZm9yZVRleHRUcmFja1VwZGF0ZSkgeworICAgICAgICBWZWN0b3I8
Q3VlSW50ZXJ2YWxUcmVlOjpJbnRlcnZhbFR5cGU+IHBvdGVudGlhbGx5U2tpcHBlZEN1ZXMgPQor
ICAgICAgICAgICAgbV9jdWVUcmVlLmFsbE92ZXJsYXBzKG1fY3VlVHJlZS5jcmVhdGVJbnRlcnZh
bChtX2xhc3RUZXh0VHJhY2tVcGRhdGUsIG1vdmllVGltZSkpOworCisgICAgICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgcG90ZW50aWFsbHlTa2lwcGVkQ3Vlcy5zaXplKCk7ICsraSkKKyAgICAg
ICAgICAgIGlmIChwb3RlbnRpYWxseVNraXBwZWRDdWVzW2ldLmxvdygpID4gbV9sYXN0VGV4dFRy
YWNrVXBkYXRlCisgICAgICAgICAgICAgICAgJiYgcG90ZW50aWFsbHlTa2lwcGVkQ3Vlc1tpXS5o
aWdoKCkgPCBtb3ZpZVRpbWUpCisgICAgICAgICAgICAgICAgbWlzc2VkQ3Vlcy5hcHBlbmQocG90
ZW50aWFsbHlTa2lwcGVkQ3Vlc1tpXSk7CisgICAgfQorCisgICAgbV9zZWVraW5nQmVmb3JlVGV4
dFRyYWNrVXBkYXRlID0gZmFsc2U7CisKKyAgICAvLyAzIC0gVXBkYXRlIHRoZSBsYXN0IHRpbWUg
dGhpcyBhbGdvcml0aG0gd2FzIHJ1bi4KKyAgICBtX2xhc3RUZXh0VHJhY2tVcGRhdGUgPSBtb3Zp
ZVRpbWU7CisKKyAgICAvLyA1IC0gSWYgdGhlIHRpbWUgd2FzIHJlYWNoZWQgdGhyb3VnaCB1c3Vh
bCBtb25vdG9uaWMgaW5jcmVhc2UgZHVyaW5nCisgICAgLy8gbm9ybWFsIHBsYXliYWNrIGFuIG5v
IHRpbWV1cGRhdGUgZXZlbnQgaGFzIGJlZW4gZmlyZWQgaW4gdGhlIGxhc3QgMTUgdG8KKyAgICAv
LyAyNTAgbXMsIHF1ZXVlIGEgdGFzayB0byBmaXJlIGEgc2ltcGxlIGV2ZW50IG5hbWVkIHRpbWV1
cGRhdGUuCisgICAgaWYgKCFtX3NlZWtpbmdCZWZvcmVUZXh0VHJhY2tVcGRhdGUpCisgICAgICAg
IHNjaGVkdWxlVGltZXVwZGF0ZUV2ZW50KGZhbHNlKTsKKworICAgIC8vIDYgLSBJZiBhbGwgb2Yg
dGhlIGN1ZXMgaW4gY3VycmVudCBjdWVzIGhhdmUgdGhlaXIgdGV4dCB0cmFjayBjdWUgYWN0aXZl
CisgICAgLy8gZmxhZyBzZXQsIG5vbmUgb2YgdGhlIGN1ZXMgaW4gb3RoZXIgY3VlcyBoYXZlIHRo
ZWlyIHRleHQgdHJhY2sgY3VlIGFjdGl2ZQorICAgIC8vIGZsYWcgc2V0LCBhbmQgbWlzc2VkIGN1
ZXMgaXMgZW1wdHksIHRoZW4gYWJvcnQgdGhlc2Ugc3RlcHMuCisgICAgYm9vbCBhY3RpdmVTZXRD
aGFuZ2VkID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmV2aW91c2x5Vmlz
aWJsZUN1ZXMuc2l6ZSgpICYmICFhY3RpdmVTZXRDaGFuZ2VkOyArK2kpIHsKKyAgICAgICAgaWYg
KCFtX2N1cnJlbnRseUFjdGl2ZUN1ZXMuY29udGFpbnMocHJldmlvdXNseVZpc2libGVDdWVzW2ld
KQorICAgICAgICAgICAgJiYgcHJldmlvdXNseVZpc2libGVDdWVzW2ldLmRhdGEoKS0+aXNBY3Rp
dmUoKSkKICAgICAgICAgICAgIGFjdGl2ZVNldENoYW5nZWQgPSB0cnVlOwotICAgICAgICB9CiAg
ICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9jdXJyZW50bHlBY3RpdmVDdWVzLnNp
emUoKTsgKytpKSB7Ci0gICAgICAgIGlmICghcHJldmlvdXNseUFjdGl2ZUN1ZXMuY29udGFpbnMo
bV9jdXJyZW50bHlBY3RpdmVDdWVzW2ldKSkgewotICAgICAgICAgICAgbV9jdXJyZW50bHlBY3Rp
dmVDdWVzW2ldLmRhdGEoKS0+c2V0SXNBY3RpdmUodHJ1ZSk7CisKKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IG1fY3VycmVudGx5QWN0aXZlQ3Vlcy5zaXplKCkgJiYgIWFjdGl2ZVNldENoYW5n
ZWQ7ICsraSkgeworICAgICAgICBpZiAoIW1fY3VycmVudGx5QWN0aXZlQ3Vlc1tpXS5kYXRhKCkt
PmlzQWN0aXZlKCkpCiAgICAgICAgICAgICBhY3RpdmVTZXRDaGFuZ2VkID0gdHJ1ZTsKLSAgICAg
ICAgfQogICAgIH0KLSAgICAKLSAgICAvLyBGSVhNRSg3MjE3Myk6IFBhdXNlIHRoZSBtZWRpYSBl
bGVtZW50IGZvciBjdWVzIGdvaW5nIHBhc3QgdGhlaXIgZW5kVGltZQorCisgICAgaWYgKG1pc3Nl
ZEN1ZXMuc2l6ZSgpKQorICAgICAgICBhY3RpdmVTZXRDaGFuZ2VkID0gdHJ1ZTsKKworICAgIGlm
ICghYWN0aXZlU2V0Q2hhbmdlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRklYTUUoNzIx
NzMpOiA3IC0gUGF1c2UgdGhlIG1lZGlhIGVsZW1lbnQgZm9yIGN1ZXMgZ29pbmcgcGFzdCB0aGVp
ciBlbmRUaW1lCiAgICAgLy8gZHVyaW5nIGEgbW9ub3RvbmljIHRpbWUgaW5jcmVhc2UuCiAKKyAg
ICAvLyA4IC0gTGV0IGV2ZW50cyBiZSBhIGxpc3Qgb2YgdGFza3MsIGluaXRpYWxseSBlbXB0eS4g
RWFjaCB0YXNrIGluIHRoaXMKKyAgICAvLyBsaXN0IHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIGEg
dGV4dCB0cmFjaywgYSB0ZXh0IHRyYWNrIGN1ZSwgYW5kIGEgdGltZSwKKyAgICAvLyB3aGljaCBh
cmUgdXNlZCB0byBzb3J0IHRoZSBsaXN0IGJlZm9yZSB0aGUgdGFza3MgYXJlIHF1ZXVlZC4KKyAg
ICBWZWN0b3I8RXZlbnRUaW1lQ3VlUGFpcj4gZXZlbnRUYXNrczsKKworICAgIC8vIDggLSBMZXQg
YWZmZWN0ZWQgdHJhY2tzIGJlIGEgbGlzdCBvZiB0ZXh0IHRyYWNrcywgaW5pdGlhbGx5IGVtcHR5
LgorICAgIFZlY3RvcjxUZXh0VHJhY2sqPiBhZmZlY3RlZFRyYWNrczsKKworICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgbWlzc2VkQ3Vlcy5zaXplKCk7ICsraSkgeworICAgICAgICAvLyA5IC0g
Rm9yIGVhY2ggdGV4dCB0cmFjayBjdWUgaW4gbWlzc2VkIGN1ZXMsIHByZXBhcmUgYW4gZXZlbnQg
bmFtZWQgZW50ZXIKKyAgICAgICAgLy8gZm9yIHRoZSBUZXh0VHJhY2tDdWUgb2JqZWN0IHdpdGgg
dGhlIHRleHQgdHJhY2sgY3VlIHN0YXJ0IHRpbWUuCisgICAgICAgIGV2ZW50VGFza3MuYXBwZW5k
KHN0ZDo6bWFrZV9wYWlyKG1pc3NlZEN1ZXNbaV0uZGF0YSgpLT5zdGFydFRpbWUoKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2VkQ3Vlc1tpXS5kYXRhKCkp
KTsKKworICAgICAgICAvLyAxMCAtIEZvciBlYWNoIHRleHQgdHJhY2sgaW4gbWlzc2VkIGN1ZXMs
IHByZXBhcmUgYW4gZXZlbnQKKyAgICAgICAgLy8gbmFtZWQgZXhpdCBmb3IgdGhlIFRleHRUcmFj
a0N1ZSBvYmplY3Qgd2l0aCB0aGUgdGV4dCB0cmFjayBjdWUgZW5kCisgICAgICAgIC8vIHRpbWUu
CisgICAgICAgIGV2ZW50VGFza3MuYXBwZW5kKHN0ZDo6bWFrZV9wYWlyKG1pc3NlZEN1ZXNbaV0u
ZGF0YSgpLT5lbmRUaW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG1pc3NlZEN1ZXNbaV0uZGF0YSgpKSk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBwcmV2aW91c2x5VmlzaWJsZUN1ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgLy8g
MTAgLSBGb3IgZWFjaCB0ZXh0IHRyYWNrIGN1ZSBpbiBvdGhlciBjdWVzIHRoYXQgaGFzIGl0cyB0
ZXh0CisgICAgICAgIC8vIHRyYWNrIGN1ZSBhY3RpdmUgZmxhZyBzZXQgcHJlcGFyZSBhbiBldmVu
dCBuYW1lZCBleGl0IGZvciB0aGUKKyAgICAgICAgLy8gVGV4dFRyYWNrQ3VlIG9iamVjdCB3aXRo
IHRoZSB0ZXh0IHRyYWNrIGN1ZSBlbmQgdGltZS4KKyAgICAgICAgaWYgKCFtX2N1cnJlbnRseUFj
dGl2ZUN1ZXMuY29udGFpbnMocHJldmlvdXNseVZpc2libGVDdWVzW2ldKSkKKyAgICAgICAgICAg
IGV2ZW50VGFza3MuYXBwZW5kKHN0ZDo6bWFrZV9wYWlyKHByZXZpb3VzbHlWaXNpYmxlQ3Vlc1tp
XS5kYXRhKCktPmVuZFRpbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHByZXZpb3VzbHlWaXNpYmxlQ3Vlc1tpXS5kYXRhKCkpKTsKKyAgICB9CisKKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fY3VycmVudGx5QWN0aXZlQ3Vlcy5zaXplKCk7ICsr
aSkgeworICAgICAgICAvLyAxMSAtIEZvciBlYWNoIHRleHQgdHJhY2sgY3VlIGluIGN1cnJlbnQg
Y3VlcyB0aGF0IGRvZXMgbm90IGhhdmUgaXRzCisgICAgICAgIC8vIHRleHQgdHJhY2sgY3VlIGFj
dGl2ZSBmbGFnIHNldCwgcHJlcGFyZSBhbiBldmVudCBuYW1lZCBlbnRlciBmb3IgdGhlCisgICAg
ICAgIC8vIFRleHRUcmFja0N1ZSBvYmplY3Qgd2l0aCB0aGUgdGV4dCB0cmFjayBjdWUgc3RhcnQg
dGltZS4KKyAgICAgICAgaWYgKCFwcmV2aW91c2x5VmlzaWJsZUN1ZXMuY29udGFpbnMobV9jdXJy
ZW50bHlBY3RpdmVDdWVzW2ldKSkKKyAgICAgICAgICAgIGV2ZW50VGFza3MuYXBwZW5kKHN0ZDo6
bWFrZV9wYWlyKG1fY3VycmVudGx5QWN0aXZlQ3Vlc1tpXS5kYXRhKCktPnN0YXJ0VGltZSgpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50bHlB
Y3RpdmVDdWVzW2ldLmRhdGEoKSkpOworICAgIH0KKworICAgIC8vIDEyIC0gU29ydCB0aGUgZXZl
bnRzIGJlZm9yZSBkaXNwYXRjaGluZy4KKyAgICBub25Db3B5aW5nU29ydChldmVudFRhc2tzLmJl
Z2luKCksIGV2ZW50VGFza3MuZW5kKCksIGV2ZW50VGltZUN1ZUNvbXBhcmUpOworCisgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBldmVudFRhc2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlm
ICghYWZmZWN0ZWRUcmFja3MuY29udGFpbnMoZXZlbnRUYXNrc1tpXS5zZWNvbmQtPnRyYWNrKCkp
KQorICAgICAgICAgICAgYWZmZWN0ZWRUcmFja3MuYXBwZW5kKGV2ZW50VGFza3NbaV0uc2Vjb25k
LT50cmFjaygpKTsKKworICAgICAgICAvLyAxMyAtIFF1ZXVlIGVhY2ggdGFzayBpbiBldmVudHMs
IGluIGxpc3Qgb3JkZXIgKHdlIGNhbiBhbHJlYWR5IGRpc3BhdGNoKS4KKyAgICAgICAgaWYgKGV2
ZW50VGFza3NbaV0uZmlyc3QgPT0gZXZlbnRUYXNrc1tpXS5zZWNvbmQtPnN0YXJ0VGltZSgpKQor
ICAgICAgICAgICAgZXZlbnRUYXNrc1tpXS5zZWNvbmQtPnNldElzQWN0aXZlKHRydWUpOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBldmVudFRhc2tzW2ldLnNlY29uZC0+c2V0SXNBY3RpdmUo
ZmFsc2UpOworICAgIH0KKworICAgIC8vIDE0IC0gU29ydCBhZmZlY3RlZCB0cmFja3MgaW4gdGhl
IHNhbWUgb3JkZXIgYXMgdGhlIHRleHQgdHJhY2tzIGFwcGVhciBpbgorICAgIC8vIHRoZSBtZWRp
YSBlbGVtZW50J3MgbGlzdCBvZiB0ZXh0IHRyYWNrcywgYW5kIHJlbW92ZSBkdXBsaWNhdGVzLgor
ICAgIG5vbkNvcHlpbmdTb3J0KGFmZmVjdGVkVHJhY2tzLmJlZ2luKCksIGFmZmVjdGVkVHJhY2tz
LmVuZCgpLCB0cmFja0luZGV4Q29tcGFyZSk7CisKKyAgICAvLyAxNSAtIEZvciBlYWNoIHRleHQg
dHJhY2sgaW4gYWZmZWN0ZWQgdHJhY2tzLCBpbiB0aGUgbGlzdCBvcmRlciwgcXVldWUgYQorICAg
IC8vIHRhc2sgdG8gZmlyZSBhIHNpbXBsZSBldmVudCBuYW1lZCBjdWVjaGFuZ2UgYXQgdGhlIFRl
eHRUcmFjayBvYmplY3QsIGFuZCwKKyAgICAvLyBpZiB0aGUgdGV4dCB0cmFjayBoYXMgYSBjb3Jy
ZXNwb25kaW5nIHRyYWNrIGVsZW1lbnQsIHRvIHRoZW4gZmlyZSBhCisgICAgLy8gc2ltcGxlIGV2
ZW50IG5hbWVkIGN1ZWNoYW5nZSBhdCB0aGUgdHJhY2sgZWxlbWVudCBhcyB3ZWxsLgorICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgYWZmZWN0ZWRUcmFja3Muc2l6ZSgpOyArK2kpCisgICAgICAg
IGFmZmVjdGVkVHJhY2tzW2ldLT5maXJlQ3VlQ2hhbmdlRXZlbnQoKTsKKwogICAgIGlmIChhY3Rp
dmVTZXRDaGFuZ2VkICYmIGhhc01lZGlhQ29udHJvbHMoKSkKICAgICAgICAgbWVkaWFDb250cm9s
cygpLT51cGRhdGVUZXh0VHJhY2tEaXNwbGF5KCk7CiB9CkBAIC0xNTgyLDYgKzE3MTMsMTAgQEAg
dm9pZCBIVE1MTWVkaWFFbGVtZW50OjpmaW5pc2hTZWVrKCkKIHsKICAgICBMT0coTWVkaWEsICJI
VE1MTWVkaWFFbGVtZW50OjpmaW5pc2hTZWVrIik7CiAKKyNpZiBFTkFCTEUoVklERU9fVFJBQ0sp
CisgICAgbV9zZWVraW5nQmVmb3JlVGV4dFRyYWNrVXBkYXRlID0gdHJ1ZTsKKyNlbmRpZgorCiAg
ICAgLy8gNC44LjEwLjkgU2Vla2luZyBzdGVwIDE0CiAgICAgbV9zZWVraW5nID0gZmFsc2U7CiAK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTE1lZGlhRWxlbWVudC5oIGIvU291
cmNlL1dlYkNvcmUvaHRtbC9IVE1MTWVkaWFFbGVtZW50LmgKaW5kZXggYjZmNjZkYTc4ZWZhMzdk
ZjViYzhjNTRiOTg0YzEzZjEyOWRjM2UxZC4uYzI2NmY4YzFiMDk5YzFmMGY4NzcwZTI0MDQwNGZj
MzE3NjliYWNkZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MTWVkaWFFbGVt
ZW50LmgKKysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MTWVkaWFFbGVtZW50LmgKQEAgLTU1
NSwxMSArNTU1LDE4IEBAIHByaXZhdGU6CiAjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQogICAgIGJv
b2wgbV90cmFja3NBcmVSZWFkeSA6IDE7CiAgICAgYm9vbCBtX2hhdmVWaXNpYmxlVGV4dFRyYWNr
IDogMTsKKyAgICBib29sIG1fc2Vla2luZ0JlZm9yZVRleHRUcmFja1VwZGF0ZSA6IDE7CisgICAg
ZmxvYXQgbV9sYXN0VGV4dFRyYWNrVXBkYXRlOwogCiAgICAgUmVmUHRyPFRleHRUcmFja0xpc3Q+
IG1fdGV4dFRyYWNrczsKICAgICBWZWN0b3I8UmVmUHRyPFRleHRUcmFjaz4gPiBtX3RleHRUcmFj
a3NXaGVuUmVzb3VyY2VTZWxlY3Rpb25CZWdhbjsKKworICAgIHR5cGVkZWYgc3RkOjpwYWlyIDxk
b3VibGUsIFRleHRUcmFja0N1ZSo+IEV2ZW50VGltZUN1ZVBhaXI7CisKKyAgICB0eXBlZGVmIFBP
REludGVydmFsVHJlZSA8ZG91YmxlLCBUZXh0VHJhY2tDdWUqPiBDdWVJbnRlcnZhbFRyZWU7CiAg
ICAgQ3VlSW50ZXJ2YWxUcmVlIG1fY3VlVHJlZTsKLSAgICBDdWVMaXN0IG1fY3VycmVudGx5QWN0
aXZlQ3VlczsKKyAgICBWZWN0b3I8Q3VlSW50ZXJ2YWxUcmVlOjpJbnRlcnZhbFR5cGU+IG1fY3Vy
cmVudGx5QWN0aXZlQ3VlczsKKwogI2VuZGlmCiAKICNpZiBFTkFCTEUoV0VCX0FVRElPKQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2tDdWUuY3BwIGIvU291cmNlL1dl
YkNvcmUvaHRtbC9UZXh0VHJhY2tDdWUuY3BwCmluZGV4IDU1NTE5ZTViZDY1ZGI2Y2JjMGFiZTM1
OTFkM2VhZmFlZDljNjc1MWMuLmMyZDJkZjJjYzAzNzA0MzUxMzlkYjgxNGMxYjcyY2FmOTMwMTM3
ODYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlLmNwcAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFja0N1ZS5jcHAKQEAgLTE1NSw5ICsxNTUsNiBA
QCB2b2lkIFRleHRUcmFja0N1ZTo6c2V0SXNBY3RpdmUoYm9vbCBhY3RpdmUpCiAgICAgICAgIGRp
c3BhdGNoRXZlbnQoRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkuZW50ZXJFdmVudCwgZmFsc2Us
IGZhbHNlKSwgZWMpOwogICAgIGVsc2UKICAgICAgICAgZGlzcGF0Y2hFdmVudChFdmVudDo6Y3Jl
YXRlKGV2ZW50TmFtZXMoKS5leGl0RXZlbnQsIGZhbHNlLCBmYWxzZSksIGVjKTsKLQotICAgIGlm
IChtX3RyYWNrKQotICAgICAgICBtX3RyYWNrLT5maXJlQ3VlQ2hhbmdlRXZlbnQoKTsKIH0KIAog
dm9pZCBUZXh0VHJhY2tDdWU6OnBhcnNlU2V0dGluZ3MoY29uc3QgU3RyaW5nJiBpbnB1dCkKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlLmggYi9Tb3VyY2UvV2Vi
Q29yZS9odG1sL1RleHRUcmFja0N1ZS5oCmluZGV4IDk0ODBhZmEwYWRmNDkzYjNjZGY5MDVhNTYx
M2IwZGE1NThhYjU5YjAuLjRlNGZmNTMzZDFhMTEwOTQ3ZGUzY2U5Njc0ZmUzYjMyMWFkZjZmN2Yg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlLmgKKysrIGIvU291
cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2tDdWUuaApAQCAtNjMsNyArNjMsNyBAQCBwdWJsaWM6
CiAgICAgZG91YmxlIHN0YXJ0VGltZSgpIGNvbnN0OwogICAgIGRvdWJsZSBlbmRUaW1lKCkgY29u
c3Q7CiAgICAgYm9vbCBwYXVzZU9uRXhpdCgpIGNvbnN0OwotICAgIAorCiAgICAgU3RyaW5nIGRp
cmVjdGlvbigpIGNvbnN0OwogICAgIGJvb2wgc25hcFRvTGluZXMoKSBjb25zdCB7IHJldHVybiBt
X3NuYXBUb0xpbmVzOyB9CiAgICAgaW50IGxpbmVQb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1f
bGluZVBvc2l0aW9uOyB9CkBAIC03Nyw3ICs3Nyw3IEBAIHB1YmxpYzoKIAogICAgIGJvb2wgaXNB
Y3RpdmUoKTsKICAgICB2b2lkIHNldElzQWN0aXZlKGJvb2wpOwotICAgIAorCiAgICAgdmlydHVh
bCBjb25zdCBBdG9taWNTdHJpbmcmIGludGVyZmFjZU5hbWUoKSBjb25zdDsKICAgICB2aXJ0dWFs
IFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSBjb25zdDsK
IApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2tDdWVMaXN0LmNwcCBi
L1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlTGlzdC5jcHAKaW5kZXggMzRiNzFjYTFi
MDU4YWYzYjllY2IyZDg1ZjM2MjE1OTJiZGIzYmZkMC4uZTlhY2ZjMDFkMWY5YjliOGM4YjYyN2Y3
MzRmZGYyYzA1ZTRkOGViYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJh
Y2tDdWVMaXN0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFja0N1ZUxpc3Qu
Y3BwCkBAIC00MCw2ICs0MCwxNiBAQCB1bnNpZ25lZCBsb25nIFRleHRUcmFja0N1ZUxpc3Q6Omxl
bmd0aCgpIGNvbnN0CiAgICAgcmV0dXJuIG1fbGlzdC5zaXplKCk7CiB9CiAKK3Vuc2lnbmVkIGxv
bmcgVGV4dFRyYWNrQ3VlTGlzdDo6Z2V0Q3VlSW5kZXgoVGV4dFRyYWNrQ3VlKiBjdWUpIGNvbnN0
Cit7CisgICAgZm9yICh1bnNpZ25lZCBsb25nIGluZGV4ID0gMDsgaW5kZXggPCBtX2xpc3Quc2l6
ZSgpOyArK2luZGV4KSB7CisgICAgICAgIGlmIChtX2xpc3RbaW5kZXhdLmdldCgpID09IGN1ZSkK
KyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwog
VGV4dFRyYWNrQ3VlKiBUZXh0VHJhY2tDdWVMaXN0OjppdGVtKHVuc2lnbmVkIGluZGV4KSBjb25z
dAogewogICAgIGlmIChpbmRleCA8IG1fbGlzdC5zaXplKCkpCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9odG1sL1RleHRUcmFja0N1ZUxpc3QuaCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4
dFRyYWNrQ3VlTGlzdC5oCmluZGV4IDdhN2Y5MDQxNWE3ZmViNmZjZGQ2NWE0ODFkY2NjMDE2NjY5
ZTI5ZTguLjFkMTIzMzVjODhmN2YxYWY5N2I0NDVhODcwNmMwNWQzNGM2Y2ZhYWIgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlTGlzdC5oCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlTGlzdC5oCkBAIC00NSw2ICs0NSw4IEBAIHB1YmxpYzoK
ICAgICB+VGV4dFRyYWNrQ3VlTGlzdCgpIHsgfQogCiAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGgo
KSBjb25zdDsKKyAgICB1bnNpZ25lZCBsb25nIGdldEN1ZUluZGV4KFRleHRUcmFja0N1ZSopIGNv
bnN0OworCiAgICAgVGV4dFRyYWNrQ3VlKiBpdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdDsKICAg
ICBUZXh0VHJhY2tDdWUqIGdldEN1ZUJ5SWQoY29uc3QgU3RyaW5nJikgY29uc3Q7CiAgICAgVGV4
dFRyYWNrQ3VlTGlzdCogYWN0aXZlQ3VlcygpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
aHRtbC90cmFjay9UZXh0VHJhY2tMaXN0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvdHJhY2sv
VGV4dFRyYWNrTGlzdC5jcHAKaW5kZXggNzdkOTY3M2Q0MzE2NDFiNDcxYjRhOTZkN2JiZWE3MWUy
ZjU0MDJjOC4uODBjNzI1Njg4MTVkYzRmNTMwZjI5MWU2ZWJjZjI4ZmU5YmJiNjFhMCAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvaHRtbC90cmFjay9UZXh0VHJhY2tMaXN0LmNwcAorKysgYi9T
b3VyY2UvV2ViQ29yZS9odG1sL3RyYWNrL1RleHRUcmFja0xpc3QuY3BwCkBAIC01NSw2ICs1NSwx
NiBAQCB1bnNpZ25lZCBUZXh0VHJhY2tMaXN0OjpsZW5ndGgoKSBjb25zdAogICAgIHJldHVybiBt
X2FkZFRyYWNrVHJhY2tzLnNpemUoKSArIG1fZWxlbWVudFRyYWNrcy5zaXplKCk7CiB9CiAKK3Vu
c2lnbmVkIFRleHRUcmFja0xpc3Q6OmdldFRyYWNrSW5kZXgoVGV4dFRyYWNrICp0ZXh0VHJhY2sp
Cit7CisgICAgZm9yICh1bnNpZ25lZCBpbmRleCA9IDA7IGluZGV4IDwgbV9lbGVtZW50VHJhY2tz
LnNpemUoKTsgKytpbmRleCkgeworICAgICAgICBpZiAobV9lbGVtZW50VHJhY2tzW2luZGV4XS5n
ZXQoKSA9PSB0ZXh0VHJhY2spCisgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisg
ICAgcmV0dXJuIDA7Cit9CisKIFRleHRUcmFjayogVGV4dFRyYWNrTGlzdDo6aXRlbSh1bnNpZ25l
ZCBpbmRleCkKIHsKICAgICAvLyA0LjguMTAuMTIuMSBUZXh0IHRyYWNrIG1vZGVsCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL3RyYWNrL1RleHRUcmFja0xpc3QuaCBiL1NvdXJjZS9X
ZWJDb3JlL2h0bWwvdHJhY2svVGV4dFRyYWNrTGlzdC5oCmluZGV4IDg4ZDlhZjYyZTAyYjIyOTU3
NDc1MzY3N2VmMjE1MTkxNmJlNjVlZTcuLmY4ZjA0ZmZhOTg1MDdjZGQwZjZkNGI1ZTg5ODg3NDdl
NTRmYTg1NmEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvdHJhY2svVGV4dFRyYWNr
TGlzdC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvdHJhY2svVGV4dFRyYWNrTGlzdC5oCkBA
IC01MSw2ICs1MSw4IEBAIHB1YmxpYzoKICAgICB+VGV4dFRyYWNrTGlzdCgpOwogCiAgICAgdW5z
aWduZWQgbGVuZ3RoKCkgY29uc3Q7CisgICAgdW5zaWduZWQgZ2V0VHJhY2tJbmRleChUZXh0VHJh
Y2sqKTsKKwogICAgIFRleHRUcmFjayogaXRlbSh1bnNpZ25lZCBpbmRleCk7CiAgICAgdm9pZCBh
cHBlbmQoUGFzc1JlZlB0cjxUZXh0VHJhY2s+KTsKICAgICB2b2lkIHJlbW92ZShUZXh0VHJhY2sq
KTsKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5n
ZUxvZwppbmRleCBiMTU3ZTk4MDM5YjUwNTY3Nzg0ZThlNWRiNjczOThkNmE3YzY4NWQ1Li44MTEw
MGIzMjgzYzkyYmNjMmNkMDgyZjVlMWQzNTllOTI4YTVhMTk1IDEwMDY0NAotLS0gYS9MYXlvdXRU
ZXN0cy9DaGFuZ2VMb2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkg
QEAKKzIwMTItMDEtMDIgIFZpY3RvciBDYXJidW5lICA8dmljdG9yQHJvc2VkdS5vcmc+CisKKyAg
ICAgICAgQWRkZWQgdGVzdHMgdG8gZW5zdXJlIGV2ZW50cyBmb3IgbWlzc2VkIGN1ZXMgYXJlIGRp
c3BhdGNoZWQgYW5kIGFsbCB0aGUKKyAgICAgICAgZXZlbnRzIGFyZSBzb3J0ZWQgYWNjb3JkaW5n
IHRvIHRoZWlyIGRpc3BhdGNoIHRpbWUuCisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTcyMTcxCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgKiBtZWRpYS90cmFjay9jYXB0aW9ucy13ZWJ2dHQvbWlzc2VkLWN1
ZXMudnR0OiBBZGRlZC4KKyAgICAgICAgKiBtZWRpYS90cmFjay9jYXB0aW9ucy13ZWJ2dHQvc29y
dGVkLWRpc3BhdGNoLnZ0dDogQWRkZWQuCisgICAgICAgICogbWVkaWEvdHJhY2svdHJhY2stY3Vl
cy1taXNzZWQtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBtZWRpYS90cmFjay90cmFj
ay1jdWVzLW1pc3NlZC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBtZWRpYS90cmFjay90cmFjay1j
dWVzLXNvcnRlZC1iZWZvcmUtZGlzcGF0Y2gtZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAg
KiBtZWRpYS90cmFjay90cmFjay1jdWVzLXNvcnRlZC1iZWZvcmUtZGlzcGF0Y2guaHRtbDogQWRk
ZWQuCisKIDIwMTItMDEtMDIgIEJhbGF6cyBLZWxlbWVuICA8a2JhbGF6c0B3ZWJraXQub3JnPgog
CiAgICAgICAgIFVucmV2aWV3ZWQgUXQtV0syIGdhcmRlbmluZy4KZGlmZiAtLWdpdCBhL0xheW91
dFRlc3RzL21lZGlhL3RyYWNrL2NhcHRpb25zLXdlYnZ0dC9taXNzZWQtY3Vlcy52dHQgYi9MYXlv
dXRUZXN0cy9tZWRpYS90cmFjay9jYXB0aW9ucy13ZWJ2dHQvbWlzc2VkLWN1ZXMudnR0Cm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjRjMmJiNGI1NDkwZTk5YTIwZmNjYzczODU3NjA1YjBkMzYzNjdhODMKLS0tIC9kZXYv
bnVsbAorKysgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay9jYXB0aW9ucy13ZWJ2dHQvbWlzc2Vk
LWN1ZXMudnR0CkBAIC0wLDAgKzEsMTUgQEAKK1dFQlZUVAorRXZlbnRzIHNob3VsZCBiZSB0cmln
Z2VyZWQgZm9yIG1pc3NlZCAoc2tpcHBlZCkgY3VlcyBkdXJpbmcgbm9ybWFsIHBsYXliYWNrLgor
CisxCiswMDowMDowMC4wMDAgLS0+IDAwOjAwOjAxLjUwMCBBOnN0YXJ0IFQ6MjAlCitCZWFyIGlz
IENvbWluZyEhISEhCitBbmQgd2hhdCBraW5kIG9mIGEgYmVhciBpdCBpcyAtIGp1c3QgaGF2ZSBs
b29rLgorCisyCiswMDowMDowMi4wMDAgLS0+IDAwOjAwOjAyLjUwMCBBOnN0YXJ0IFQ6MjAlCitJ
IHNhaWQgQmVhciBpcyBjb21pbmchISEhCisKKzMKKzAwOjAwOjA1Ljk5MiAtLT4gMDA6MDA6MDUu
OTkzIEE6c3RhcnQgVDoyMCUKK0kgc2FpZCBCZWFyIGlzIGNvbWluZyBub3chISEhCmRpZmYgLS1n
aXQgYS9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay9jYXB0aW9ucy13ZWJ2dHQvc29ydGVkLWRpc3Bh
dGNoLnZ0dCBiL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL2NhcHRpb25zLXdlYnZ0dC9zb3J0ZWQt
ZGlzcGF0Y2gudnR0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjQ4ZWNkOGVmYjc1YmU5NWZkY2QxMWEzNmE1NWM4MjA4
ZTJlMGY3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay9jYXB0
aW9ucy13ZWJ2dHQvc29ydGVkLWRpc3BhdGNoLnZ0dApAQCAtMCwwICsxLDMwIEBACitXRUJWVFQK
K0VudGVyIGFuZCBleGl0IGV2ZW50cyBzaG91bGQgYmUgZGlzcGF0Y2hlZCBpbiBhIHNvcnRlZCBv
cmRlciBhY2NvcmRpbmcgdG8gdGhlaXIgdGltZXMuCisKKzEKKzAwOjAwOjA1LjEwMCAtLT4gMDA6
MDA6MDUuODAwIEE6c3RhcnQgVDoyMCUKK0JlYXIgaXMgQ29taW5nISEhISEKKworMgorMDA6MDA6
MDUuMTAwIC0tPiAwMDowMDowNS4xMDEKK01pc3NlZCBjdWUgMQorCiszCiswMDowMDowNS4xMDAg
LS0+IDAwOjAwOjA1LjMwMQorQW5kIHdoYXQga2luZCBvZiBhIGJlYXIgaXQgaXMgLSBqdXN0IGhh
dmUgbG9vay4KKworNAorMDA6MDA6MDUuMTAwIC0tPiAwMDowMDowNS4xMDEKK01pc3NlZCBDdWUg
MgorCis1CiswMDowMDowNS4zMDAgLS0+IDAwOjAwOjA1LjgwMCBBOnN0YXJ0IFQ6MjAlCitJIHNh
aWQgQmVhciBpcyBjb21pbmchISEhCisKKzYKKzAwOjAwOjA1Ljk5MCAtLT4gMDA6MDA6MDUuOTkz
IEE6c3RhcnQgVDoyMCUKK0kgc2FpZCBCZWFyIGlzIGNvbWluZyBub3chISEhCisKKzcKKzAwOjAw
OjA1Ljk5NCAtLT4gMDA6MDA6MDUuOTkzIEE6c3RhcnQgVDoyMCUKK0JlYXIgaXMgYWxyZWFkeSBo
ZXJlCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay90cmFjay1jdWVzLW1pc3Nl
ZC1leHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay90cmFjay1jdWVzLW1pc3Nl
ZC1leHBlY3RlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNTE3NzM5NjEwZmRiYzBjMzg2MDllMjc1ZWRiOGVm
YTVhNzc0MThkYgotLS0gL2Rldi9udWxsCisrKyBiL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3Ry
YWNrLWN1ZXMtbWlzc2VkLWV4cGVjdGVkLnR4dApAQCAtMCwwICsxLDE0IEBACitUZXN0cyB0aGF0
IGV2ZW50cyBhcmUgdHJpZ2dlcmVkIGZvciBtaXNzZWQgKHNraXBwZWQpIGN1ZXMgZHVyaW5nIG5v
cm1hbCBwbGF5YmFjay4KKworRVZFTlQoY2FucGxheXRocm91Z2gpCitFWFBFQ1RFRCAodGVzdFRy
YWNrLnRyYWNrLmN1ZXMubGVuZ3RoID09ICczJykgT0sKK1JVTih2aWRlby5wbGF5KCkpCitFVkVO
VChlbnRlcikKK0VYUEVDVEVEIChbb2JqZWN0IFRleHRUcmFja0N1ZV0gPT0gJ1tvYmplY3QgVGV4
dFRyYWNrQ3VlXScpIE9LCitFWFBFQ1RFRCAoY3VycmVudEN1ZS5pZCA9PSAnMycpIE9LCitFVkVO
VChleGl0KQorRVhQRUNURUQgKFtvYmplY3QgVGV4dFRyYWNrQ3VlXSA9PSAnW29iamVjdCBUZXh0
VHJhY2tDdWVdJykgT0sKK0VYUEVDVEVEIChjdXJyZW50Q3VlLmlkID09ICczJykgT0sKK0VWRU5U
KGVuZGVkKQorRU5EIE9GIFRFU1QKKwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvbWVkaWEvdHJh
Y2svdHJhY2stY3Vlcy1taXNzZWQuaHRtbCBiL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNr
LWN1ZXMtbWlzc2VkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYjk1YjRjYzYyNjRhNTZmYmIzNzM0MjA1NTA0
YzU3Yjk1ZGIxNGJlNQotLS0gL2Rldi9udWxsCisrKyBiL0xheW91dFRlc3RzL21lZGlhL3RyYWNr
L3RyYWNrLWN1ZXMtbWlzc2VkLmh0bWwKQEAgLTAsMCArMSw3NCBAQAorPCFET0NUWVBFIGh0bWw+
Cis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1U
eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+CisKKyAgICAgICAgPHNj
cmlwdCBzcmM9Li4vbWVkaWEtZmlsZS5qcz48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdCBzcmM9
Li4vdmlkZW8tdGVzdC5qcz48L3NjcmlwdD4KKyAgICAgICAgPHNjcmlwdD4KKyAgICAgICAgICAg
IHZhciB2aWRlb0NhblBsYXlUaHJvdWdoID0gZmFsc2U7CisgICAgICAgICAgICB2YXIgdHJhY2tM
b2FkZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgdmFyIGN1cnJlbnRDdWU7CisgICAgICAgICAg
ICB2YXIgdGVzdFRyYWNrOworCisgICAgICAgICAgICBmdW5jdGlvbiBydW5UZXN0cygpIHsKKyAg
ICAgICAgICAgICAgICBpZiAoIXRyYWNrTG9hZGVkIHx8ICF2aWRlb0NhblBsYXlUaHJvdWdoKQor
ICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICB0ZXN0VHJhY2sg
PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVzdFRyYWNrIik7CisgICAgICAgICAgICAgICAg
dGVzdEV4cGVjdGVkKCJ0ZXN0VHJhY2sudHJhY2suY3Vlcy5sZW5ndGgiLCAzKTsKKworICAgICAg
ICAgICAgICAgIHRlc3RUcmFjay50cmFjay5jdWVzWzJdLmFkZEV2ZW50TGlzdGVuZXIoJ2VudGVy
JywgY3VlRW50ZXJlZCk7CisgICAgICAgICAgICAgICAgdGVzdFRyYWNrLnRyYWNrLmN1ZXNbMl0u
YWRkRXZlbnRMaXN0ZW5lcignZXhpdCcsIGN1ZUV4aXRlZCk7CisKKyAgICAgICAgICAgICAgICBy
dW4oInZpZGVvLnBsYXkoKSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmdW5jdGlv
biBjdWVFbnRlcmVkKCkgeworICAgICAgICAgICAgICAgIGNvbnNvbGVXcml0ZSgiRVZFTlQoZW50
ZXIpIik7CisKKyAgICAgICAgICAgICAgICBjdXJyZW50Q3VlID0gZXZlbnQudGFyZ2V0OworICAg
ICAgICAgICAgICAgIHRlc3RFeHBlY3RlZChjdXJyZW50Q3VlLCB0ZXN0VHJhY2sudHJhY2suY3Vl
cy5nZXRDdWVCeUlkKDMpKTsKKyAgICAgICAgICAgICAgICB0ZXN0RXhwZWN0ZWQoImN1cnJlbnRD
dWUuaWQiLCAzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnVuY3Rpb24gY3VlRXhp
dGVkKCkgeworICAgICAgICAgICAgICAgIGNvbnNvbGVXcml0ZSgiRVZFTlQoZXhpdCkiKTsKKwor
ICAgICAgICAgICAgICAgIGN1cnJlbnRDdWUgPSBldmVudC50YXJnZXQ7CisKKyAgICAgICAgICAg
ICAgICB0ZXN0RXhwZWN0ZWQoY3VycmVudEN1ZSwgdGVzdFRyYWNrLnRyYWNrLmN1ZXMuZ2V0Q3Vl
QnlJZCgzKSk7CisgICAgICAgICAgICAgICAgdGVzdEV4cGVjdGVkKCJjdXJyZW50Q3VlLmlkIiwg
Myk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdhaXRGb3JFdmVudCgnZW5kZWQnLCBm
dW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgICBlbmRUZXN0KCk7CisgICAgICAgICAgICB9KTsK
KworICAgICAgICAgICAgd2FpdEZvckV2ZW50KCdjYW5wbGF5dGhyb3VnaCcsIGZ1bmN0aW9uKCkg
eworICAgICAgICAgICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gNS4wMDsKKyAgICAgICAgICAg
ICAgICB2aWRlb0NhblBsYXlUaHJvdWdoID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIHJ1blRl
c3RzKCk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgZnVuY3Rpb24gbG9hZGVkKCkg
eworICAgICAgICAgICAgICAgIHRyYWNrTG9hZGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgICAg
IHJ1blRlc3RzKCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmdW5jdGlvbiBib2R5
TG9hZGVkKCkgeworICAgICAgICAgICAgICAgIGZpbmRNZWRpYUVsZW1lbnQoKTsKKyAgICAgICAg
ICAgICAgICB2aWRlby5zcmMgPSBmaW5kTWVkaWFGaWxlKCJ2aWRlbyIsICIuLi9jb250ZW50L3Rl
c3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgPC9oZWFkPgorICAg
IDxib2R5IG9ubG9hZD0iYm9keUxvYWRlZCgpIj4KKyAgICAgICAgPHA+VGVzdHMgdGhhdCBldmVu
dHMgYXJlIHRyaWdnZXJlZCBmb3IgbWlzc2VkIChza2lwcGVkKSBjdWVzIGR1cmluZyBub3JtYWwg
cGxheWJhY2suPC9wPgorICAgICAgICA8dmlkZW8gY29udHJvbHM+CisgICAgICAgICAgICA8dHJh
Y2sgaWQ9InRlc3RUcmFjayIgc3JjPSJjYXB0aW9ucy13ZWJ2dHQvbWlzc2VkLWN1ZXMudnR0IiBv
bmxvYWQ9ImxvYWRlZCgpIiBkZWZhdWx0PgorICAgICAgICA8L3ZpZGVvPgorICAgIDwvYm9keT4K
KzwvaHRtbD4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMt
c29ydGVkLWJlZm9yZS1kaXNwYXRjaC1leHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy9tZWRpYS90
cmFjay90cmFjay1jdWVzLXNvcnRlZC1iZWZvcmUtZGlzcGF0Y2gtZXhwZWN0ZWQudHh0Cm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLmVmYjk0ZWY1NzQzMDU2OGYwZmQ3MTVjYjhlNzQ1MzhjNmIwNDFlNjIKLS0tIC9kZXYv
bnVsbAorKysgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay90cmFjay1jdWVzLXNvcnRlZC1iZWZv
cmUtZGlzcGF0Y2gtZXhwZWN0ZWQudHh0CkBAIC0wLDAgKzEsMjIgQEAKK1Rlc3RzIHRoYXQgYWxs
IGV2ZW50cyBldmVudHMgYXJlIHRyaWdnZXJlZCBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCitF
VkVOVChjYW5wbGF5dGhyb3VnaCkKK0VYUEVDVEVEICh0ZXN0VHJhY2sudHJhY2suY3Vlcy5sZW5n
dGggPT0gJzcnKSBPSworUlVOKHZpZGVvLnBsYXkoKSkKK0VWRU5UKGVuZGVkKQorQ3VlIGV2ZW50
OiBlbnRlciBpZDogMSB0aW1lOiA1LjEKK0N1ZSBldmVudDogZW50ZXIgaWQ6IDMgdGltZTogNS4x
CitDdWUgZXZlbnQ6IGVudGVyIGlkOiAyIHRpbWU6IDUuMQorQ3VlIGV2ZW50OiBlbnRlciBpZDog
NCB0aW1lOiA1LjEKK0N1ZSBldmVudDogZXhpdCBpZDogMiB0aW1lOiA1LjEwMQorQ3VlIGV2ZW50
OiBleGl0IGlkOiA0IHRpbWU6IDUuMTAxCitDdWUgZXZlbnQ6IGVudGVyIGlkOiA1IHRpbWU6IDUu
MworQ3VlIGV2ZW50OiBleGl0IGlkOiAzIHRpbWU6IDUuMzAxCitDdWUgZXZlbnQ6IGV4aXQgaWQ6
IDEgdGltZTogNS44CitDdWUgZXZlbnQ6IGV4aXQgaWQ6IDUgdGltZTogNS44CitDdWUgZXZlbnQ6
IGVudGVyIGlkOiA2IHRpbWU6IDUuOTkKK0N1ZSBldmVudDogZXhpdCBpZDogNiB0aW1lOiA1Ljk5
MworQ3VlIGV2ZW50OiBleGl0IGlkOiA3IHRpbWU6IDUuOTkzCitDdWUgZXZlbnQ6IGVudGVyIGlk
OiA3IHRpbWU6IDUuOTk0CitFTkQgT0YgVEVTVAorCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9t
ZWRpYS90cmFjay90cmFjay1jdWVzLXNvcnRlZC1iZWZvcmUtZGlzcGF0Y2guaHRtbCBiL0xheW91
dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtc29ydGVkLWJlZm9yZS1kaXNwYXRjaC5odG1s
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLjIzOTA0NzViMGM1MTRmMmI5ZDgxMDFjOGI3YWFlYjYyNmI2NzZiMGMKLS0t
IC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay90cmFjay1jdWVzLXNvcnRl
ZC1iZWZvcmUtZGlzcGF0Y2guaHRtbApAQCAtMCwwICsxLDg5IEBACis8IURPQ1RZUEUgaHRtbD4K
KzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5
cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KKworICAgICAgICA8c2Ny
aXB0IHNyYz0uLi9tZWRpYS1maWxlLmpzPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0IHNyYz0u
Li92aWRlby10ZXN0LmpzPjwvc2NyaXB0PgorICAgICAgICA8c2NyaXB0PgorICAgICAgICAgICAg
dmFyIHZpZGVvQ2FuUGxheVRocm91Z2ggPSBmYWxzZTsKKyAgICAgICAgICAgIHZhciB0cmFja0xv
YWRlZCA9IGZhbHNlOworCisgICAgICAgICAgICB2YXIgY3VycmVudEN1ZTsKKyAgICAgICAgICAg
IHZhciB0ZXN0VHJhY2s7CisKKyAgICAgICAgICAgIHZhciBkaXNwYXRjaGVkRXZlbnRzID0gW107
CisKKyAgICAgICAgICAgIGZ1bmN0aW9uIHJ1blRlc3RzKCkgeworICAgICAgICAgICAgICAgIGlm
ICghdHJhY2tMb2FkZWQgfHwgIXZpZGVvQ2FuUGxheVRocm91Z2gpCisgICAgICAgICAgICAgICAg
ICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgIHRlc3RUcmFjayA9IGRvY3VtZW50LmdldEVs
ZW1lbnRCeUlkKCJ0ZXN0VHJhY2siKTsKKyAgICAgICAgICAgICAgICB0ZXN0RXhwZWN0ZWQoInRl
c3RUcmFjay50cmFjay5jdWVzLmxlbmd0aCIsIDcpOworCisgICAgICAgICAgICAgICAgZm9yICh2
YXIgaSA9IDA7IGkgPCB0ZXN0VHJhY2sudHJhY2suY3Vlcy5sZW5ndGg7ICsraSkgeworICAgICAg
ICAgICAgICAgICAgICB0ZXN0VHJhY2sudHJhY2suY3Vlc1tpXS5hZGRFdmVudExpc3RlbmVyKCdl
bnRlcicsIGN1ZUVudGVyZWQpOworICAgICAgICAgICAgICAgICAgICB0ZXN0VHJhY2sudHJhY2su
Y3Vlc1tpXS5hZGRFdmVudExpc3RlbmVyKCdleGl0JywgY3VlRXhpdGVkKTsKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICBydW4oInZpZGVvLnBsYXkoKSIpOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBmdW5jdGlvbiBjdWVFbnRlcmVkKCkgeworICAgICAgICAgICAg
ICAgIGN1cnJlbnRDdWUgPSBldmVudC50YXJnZXQ7CisKKyAgICAgICAgICAgICAgICB2YXIgZXZl
bnRPYmogPSB7fTsKKyAgICAgICAgICAgICAgICBldmVudE9iai50aW1lID0gY3VycmVudEN1ZS5z
dGFydFRpbWU7CisgICAgICAgICAgICAgICAgZXZlbnRPYmoudHlwZSA9ICJlbnRlciI7CisgICAg
ICAgICAgICAgICAgZXZlbnRPYmouY3VlID0gY3VycmVudEN1ZTsKKworICAgICAgICAgICAgICAg
IGRpc3BhdGNoZWRFdmVudHMucHVzaChldmVudE9iaik7CisgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgIGZ1bmN0aW9uIGN1ZUV4aXRlZCgpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50Q3Vl
ID0gZXZlbnQudGFyZ2V0OworCisgICAgICAgICAgICAgICAgdmFyIGV2ZW50T2JqID0ge307Cisg
ICAgICAgICAgICAgICAgZXZlbnRPYmoudGltZSA9IGN1cnJlbnRDdWUuZW5kVGltZTsKKyAgICAg
ICAgICAgICAgICBldmVudE9iai50eXBlID0gImV4aXQiOworICAgICAgICAgICAgICAgIGV2ZW50
T2JqLmN1ZSA9IGN1cnJlbnRDdWU7CisKKyAgICAgICAgICAgICAgICBkaXNwYXRjaGVkRXZlbnRz
LnB1c2goZXZlbnRPYmopOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3YWl0Rm9yRXZl
bnQoJ2VuZGVkJywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7
IGkgPCBkaXNwYXRjaGVkRXZlbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAg
IGNvbnNvbGVXcml0ZSgiQ3VlIGV2ZW50OiAiICsgZGlzcGF0Y2hlZEV2ZW50c1tpXS50eXBlICsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaWQ6ICIgKyBkaXNwYXRjaGVkRXZl
bnRzW2ldLmN1ZS5pZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRpbWU6
ICIgKyBkaXNwYXRjaGVkRXZlbnRzW2ldLnRpbWUpOworICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgIGVuZFRlc3QoKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICB3
YWl0Rm9yRXZlbnQoJ2NhbnBsYXl0aHJvdWdoJywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAg
ICAgdmlkZW8uY3VycmVudFRpbWUgPSA1LjAwOworICAgICAgICAgICAgICAgIHZpZGVvQ2FuUGxh
eVRocm91Z2ggPSB0cnVlOworCisgICAgICAgICAgICAgICAgcnVuVGVzdHMoKTsKKyAgICAgICAg
ICAgIH0pOworCisgICAgICAgICAgICBmdW5jdGlvbiBsb2FkZWQoKSB7CisgICAgICAgICAgICAg
ICAgdHJhY2tMb2FkZWQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgcnVuVGVzdHMoKTsKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgZnVuY3Rpb24gYm9keUxvYWRlZCgpIHsKKyAgICAg
ICAgICAgICAgICBmaW5kTWVkaWFFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgdmlkZW8uc3Jj
ID0gZmluZE1lZGlhRmlsZSgidmlkZW8iLCAiLi4vY29udGVudC90ZXN0Iik7CisgICAgICAgICAg
ICB9CisgICAgICAgIDwvc2NyaXB0PgorICAgIDwvaGVhZD4KKyAgICA8Ym9keSBvbmxvYWQ9ImJv
ZHlMb2FkZWQoKSI+CisgICAgICAgIDxwPlRlc3RzIHRoYXQgYWxsIGV2ZW50cyBldmVudHMgYXJl
IHRyaWdnZXJlZCBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyLjwvcD4KKyAgICAgICAgPHZpZGVvIGNv
bnRyb2xzPgorICAgICAgICAgICAgPHRyYWNrIGlkPSJ0ZXN0VHJhY2siIHNyYz0iY2FwdGlvbnMt
d2VidnR0L3NvcnRlZC1kaXNwYXRjaC52dHQiIG9ubG9hZD0ibG9hZGVkKCkiIGRlZmF1bHQ+Cisg
ICAgICAgIDwvdmlkZW8+CisgICAgPC9ib2R5PgorPC9odG1sPgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>125964</attachid>
            <date>2012-02-07 17:37:21 -0800</date>
            <delta_ts>2012-02-13 15:39:36 -0800</delta_ts>
            <desc>Updated patch for current trunk</desc>
            <filename>bug-72171-20120208033719.patch</filename>
            <type>text/plain</type>
            <size>39118</size>
            <attacher name="Victor Carbune">vcarbune</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA2OTUwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNWFhMTgwMzg4MzZmMGE0
MmUzMDgyODVhNjNjZjRhOWU4NTdlYTdhNS4uMjQwYmI5ZTY4ZTBkZWRkODYzYTJjYjI1NTk2YjZl
YTZhMmEzNzEwZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDc4IEBACisyMDEyLTAyLTA3ICBWaWN0
b3IgQ2FyYnVuZSAgPHZpY3RvckByb3NlZHUub3JnPgorCisgICAgICAgIEFkZGVkIGNvZGUgdG8g
c3VwcG9ydCBkaXNwYXRjaGluZyBvZiBtaXNzZWQgY3VlcyBpbiBjYXNlIG9mIG5vcm1hbCBwbGF5
YmFjaworICAgICAgICBhbmQgZXZlbnQgc29ydGluZyBpbiBjYXNlIG9mIHNpbXVsdGFuZW91cyBl
dmVudCB0cmlnZ2VyaW5nLgorCisgICAgICAgIDx0cmFjaz4tcmVsYXRlZCBldmVudHMgY3VlY2hh
bmdlLCBlbnRlciwgYW5kIGV4aXQgc2hvdWxkIGJlIHNvcnRlZCBhbmQgZmlsdGVyZWQgYmVmb3Jl
IGRpc3BhdGNoaW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD03MjE3MQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFRlc3RzOiBtZWRpYS90cmFjay90cmFjay1jdWVzLW1pc3NlZC5odG1sCisgICAgICAgICAg
ICAgICBtZWRpYS90cmFjay90cmFjay1jdWVzLXNvcnRlZC1iZWZvcmUtZGlzcGF0Y2guaHRtbAor
CisgICAgICAgICogaHRtbC9IVE1MTWVkaWFFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkhUTUxNZWRpYUVsZW1lbnQ6OkhUTUxNZWRpYUVsZW1lbnQpOiBBZGRlZCBpbml0aWFsaXphdGlv
biBjb2RlCisgICAgICAgIGZvciBuZXdseSBhZGRlZCBzdGF0ZSB2YXJpYWJsZXMuCisgICAgICAg
IChXZWJDb3JlOjp0cmFja0luZGV4Q29tcGFyZSk6IFN0YXRpYyBib29sZWFuIGNvbXBhcmUgZnVu
Y3Rpb24gYmV0d2VlbgorICAgICAgICB0aGUgaW5kZXggb2YgdHdvIHRyYWNrcy4KKyAgICAgICAg
KFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6ZXZlbnRUaW1lQ3VlQ29tcGFyZSk6IFN0YXRp
YyBib29sZWFuIGNvbXBhcmUgZnVuY3Rpb24gYmV0d2VlbgorICAgICAgICBldmVudHMgYXNzb2Np
YXRlZCB3aXRoIHRleHQgdHJhY2sgY3Vlcy4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxNZWRpYUVs
ZW1lbnQ6OnVwZGF0ZUFjdGl2ZVRleHRUcmFja0N1ZXMpOiBBZGRlZCBjb2RlIHRvCisgICAgICAg
IHNvcnQgdGhlIGV2ZW50cyBhc3NvY2lhdGVkIHdpdGggdGV4dCB0cmFjayBjdWVzIGJlZm9yZSBk
aXNwYXRjaGluZy4KKyAgICAgICAgRWFjaCBzdGVwIGZyb20gdGhlIHNwZWNpZmljYXRpb24gaXMg
Y29tbWVudGVkIHdpdGhpbiB0aGUgY29kZS4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxNZWRpYUVs
ZW1lbnQ6OmZpbmlzaFNlZWspOiBBZGRlZCBhIGJvb2xlYW4gdmFyaWFibGUgdGhhdAorICAgICAg
ICBpcyBuZWVkZWQgd2l0aGluIHRoZSB0ZXh0IHRyYWNrIHVwZGF0ZSBmdW5jdGlvbiwgdG8ga25v
dyB3aGV0aGVyIGEgc2VlaworICAgICAgICBldmVudCBoYXMgb2NjdXJlZCBiZWZvcmUgb3Igbm90
LgorICAgICAgICAoV2ViQ29yZTo6SFRNTE1lZGlhRWxlbWVudDo6bWVkaWFQbGF5ZXJUaW1lQ2hh
bmdlZCk6IE1vdmVkIHRoZSB1cGRhdGUKKyAgICAgICAgY2FsbCBmb3IgdGV4dCB0cmFja3MgYXQg
dGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgZW5kLgorICAgICAg
ICAnZW5kZWQnIGV2ZW50cyBmb3IgdmlkZW8gc2hvdWxkIGJlIGRpc3BhdGNoZWQgYWZ0ZXIgdHJh
Y2sgc3BlY2lmaWMgZXZlbnRzLgorICAgICAgICAqIGh0bWwvSFRNTE1lZGlhRWxlbWVudC5oOiBB
ZGRlZCB2YXJpYWJsZXMgdG8ga2VlcAorICAgICAgICBzdGF0ZSBpbmZvcm1hdGlvbiByZXF1aXJl
ZCBieSB0aGUgdGV4dCB0cmFjayB1cGRhdGUgYWxnb3JpdGhtIChsYXN0IHRpbWUKKyAgICAgICAg
dGhlIGFsZ29yaXRobSB3YXMgcnVuLCBhbmQgd2hldGhlciBhIHNlZWtpbmcgZXZlbnQgaGFzIG9j
Y3VyZWQpCisgICAgICAgIChIVE1MTWVkaWFFbGVtZW50KToKKworICAgICAgICAqIGh0bWwvTG9h
ZGFibGVUZXh0VHJhY2suY3BwOiBSZW1vdmVkIHRoZSBzeW5jaHJvbm91cyBmaXJlQ3VlQ2hhbmdl
IG1ldGhvZC4KKyAgICAgICAgKFdlYkNvcmU6OkxvYWRhYmxlVGV4dFRyYWNrOjpkaXNwYXRjaEV2
ZW50KTogQWxsIGRpc3BhdGNoZWQgZXZlbnRzIHNob3VsZAorICAgICAgICBiZSBtYWRlIGFzeW5j
aHJvbm91cyB0aHJvdWdoIHRoZSBHZW5lcmljRXZlbnRRdWV1ZQorICAgICAgICAqIGh0bWwvTG9h
ZGFibGVUZXh0VHJhY2suaDoKKyAgICAgICAgKExvYWRhYmxlVGV4dFRyYWNrKToKKyAgICAgICAg
KiBodG1sL1RleHRUcmFjay5jcHA6IFJlbW92ZWQgZmlyZUN1ZUNoYW5nZSBtZXRob2QuCisgICAg
ICAgICogaHRtbC9UZXh0VHJhY2suaDoKKyAgICAgICAgKFRleHRUcmFjayk6CisKKyAgICAgICAg
KiBodG1sL1RleHRUcmFja0N1ZS5jcHA6IEFkZGVkIGludGVybmFsIHZhcmlhYmxlcyB0byBrZWVw
IHRoZSBjdXJyZW50IGluZGV4CisgICAgICAgIHBvc2l0aW9uIGluIHRoZSB0cmFjayBjdWUgb3Jk
ZXIuIFRoaXMgaXMgaW52YWxpZGF0ZWQgd2hlbiBhbiBlbGVtZW50IGlzCisgICAgICAgIGluc2Vy
dGVkIGJlZm9yZS4KKyAgICAgICAgKFdlYkNvcmU6OlRleHRUcmFja0N1ZTo6VGV4dFRyYWNrQ3Vl
KToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRUcmFja0N1ZTo6Y3VlSW5kZXgpOiBHZXR0ZXIgZm9y
IHRoZSBjdWVJbmRleC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4
dFRyYWNrQ3VlOjppbnZhbGlkYXRlQ3VlSW5kZXgpOiBJbnZhbGlkYXRlcyB0aGUgY3VycmVudGx5
IHN0b3JlZAorICAgICAgICBjdWUgaW5kZXguCisgICAgICAgIChXZWJDb3JlOjpUZXh0VHJhY2tD
dWU6OmRpc3BhdGNoRXZlbnQpOiBFdmVudCBkaXNwYXRjaGluZyBpcyBkb25lIGFzeW5jaHJvbm91
c2x5CisgICAgICAgIG5vdy4gVGhpcyBzaG91bGQgYmUgdGhlIG9ubHkgbWV0aG9kIHVzZWQgZm9y
IGV2ZW50IGRpc3BhdGNoaW5nLgorICAgICAgICAoV2ViQ29yZTo6VGV4dFRyYWNrQ3VlOjpzZXRJ
c0FjdGl2ZSk6IFRoZSBzZXRJc0FjdGl2ZSBtZXRob2Qgbm8gbG9uZ2VyIGRpc3BhdGNoZXMKKyAg
ICAgICAgZXZlbnRzLCBidXQgcmF0aGVyIGp1c3QgY2hhbmdlcyB0aGUgbV9pc0FjdGl2ZSB2YXJp
YWJsZS4KKyAgICAgICAgKiBodG1sL1RleHRUcmFja0N1ZS5oOgorICAgICAgICAoVGV4dFRyYWNr
Q3VlKToKKworICAgICAgICAqIGh0bWwvVGV4dFRyYWNrQ3VlTGlzdC5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpUZXh0VHJhY2tDdWVMaXN0OjpnZXRDdWVJbmRleCk6IFJldHJpZXZlcyB0aGUgY3Vl
IGluZGV4LCBpbiB0aGUgdHJhY2sgY3VlCisgICAgICAgIG9yZGVyLCBvZiBhIGdpdmVuIGN1ZS4K
KyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFRyYWNrQ3VlTGlzdDo6
YWRkKTogTW9kaWZpZWQgdGhlIGFkZCBtZXRob2Qgc3VjaCB0aGF0IGFsbCB0aGUgbmV4dCBjdWUK
KyAgICAgICAgaW5kZXhlcyBhcmUgaW52YWxpZGF0ZWQuCisgICAgICAgIChXZWJDb3JlOjpUZXh0
VHJhY2tDdWVMaXN0OjppbnZhbGlkYXRlQ3VlSW5kZXhlcyk6IEludmFsaWRhdGVzIGFsbCBjdWUg
aW5kZXhlcyBzdGFydGluZworICAgICAgICB3aXRoIGEgc3BlY2lmaWMgcG9zaXRpb24uCisgICAg
ICAgICogaHRtbC9UZXh0VHJhY2tDdWVMaXN0Lmg6CisgICAgICAgIChUZXh0VHJhY2tDdWVMaXN0
KToKKyAgICAgICAgKiBodG1sL3RyYWNrL1RleHRUcmFja0xpc3QuY3BwOgorICAgICAgICAoVGV4
dFRyYWNrTGlzdDo6Z2V0VHJhY2tJbmRleCk6IFJldHJpZXZlcyB0aGUgdHJhY2sgaW5kZXggcG9z
aXRpb24uCisgICAgICAgIChUZXh0VHJhY2tMaXN0OjphcHBlbmQpOgorICAgICAgICAqIGh0bWwv
dHJhY2svVGV4dFRyYWNrTGlzdC5oOgorICAgICAgICAoVGV4dFRyYWNrTGlzdCk6CisKIDIwMTIt
MDItMDcgIFNoZXJpZmYgQm90ICA8d2Via2l0LnJldmlldy5ib3RAZ21haWwuY29tPgogCiAgICAg
ICAgIFVucmV2aWV3ZWQsIHJvbGxpbmcgb3V0IHIxMDY5MzIuCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9odG1sL0hUTUxNZWRpYUVsZW1lbnQuY3BwIGIvU291cmNlL1dlYkNvcmUvaHRtbC9I
VE1MTWVkaWFFbGVtZW50LmNwcAppbmRleCA3ZTY2NDg0MGI5MmY2ZDk5NDhiM2Y4Nzg2NjA1ZDFi
MTE5YjMzMTFiLi4yZTg5NGZhNWQyM2M3MmQ0MTc0M2ViZGRiYzE2NzE0MTBhZjgyOTdlIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxNZWRpYUVsZW1lbnQuY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL2h0bWwvSFRNTE1lZGlhRWxlbWVudC5jcHAKQEAgLTc2LDYgKzc2LDcgQEAK
ICNpbmNsdWRlIDxsaW1pdHM+CiAjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+CiAjaW5jbHVk
ZSA8d3RmL01hdGhFeHRyYXMuaD4KKyNpbmNsdWRlIDx3dGYvTm9uQ29weWluZ1NvcnQuaD4KICNp
bmNsdWRlIDx3dGYvVWludDhBcnJheS5oPgogI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4K
IApAQCAtMjM1LDYgKzIzNiw4IEBAIEhUTUxNZWRpYUVsZW1lbnQ6OkhUTUxNZWRpYUVsZW1lbnQo
Y29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSwgRG9jdW1lbnQqIGRvY3VtCiAjaWYgRU5BQkxF
KFZJREVPX1RSQUNLKQogICAgICwgbV90cmFja3NBcmVSZWFkeSh0cnVlKQogICAgICwgbV9oYXZl
VmlzaWJsZVRleHRUcmFjayhmYWxzZSkKKyAgICAsIG1fc2Vla2VkU2luY2VMYXN0VGV4dFRyYWNr
VXBkYXRlKGZhbHNlKQorICAgICwgbV9sYXN0VGV4dFRyYWNrVXBkYXRlVGltZSgtMSkKICAgICAs
IG1fdGV4dFRyYWNrcygwKQogICAgICwgbV9pZ25vcmVUcmFja0Rpc3BsYXlVcGRhdGUoMCkKICNl
bmRpZgpAQCAtOTM3LDMzICs5NDAsMjEyIEBAIHZvaWQgSFRNTE1lZGlhRWxlbWVudDo6bG9hZFJl
c291cmNlKGNvbnN0IEtVUkwmIGluaXRpYWxVUkwsIENvbnRlbnRUeXBlJiBjb250ZW50CiB9CiAK
ICNpZiBFTkFCTEUoVklERU9fVFJBQ0spCitzdGF0aWMgYm9vbCB0cmFja0luZGV4Q29tcGFyZShU
ZXh0VHJhY2sqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0VHJhY2sqIGIp
Cit7CisgICAgaW50IGFUcmFja0luZGV4ID0gYS0+bWVkaWFFbGVtZW50KCktPnRleHRUcmFja3Mo
KS0+Z2V0VHJhY2tJbmRleChhKTsKKyAgICBpbnQgYlRyYWNrSW5kZXggPSBiLT5tZWRpYUVsZW1l
bnQoKS0+dGV4dFRyYWNrcygpLT5nZXRUcmFja0luZGV4KGIpOworCisgICAgcmV0dXJuIGFUcmFj
a0luZGV4IC0gYlRyYWNrSW5kZXg7Cit9CisKK3N0YXRpYyBib29sIGV2ZW50VGltZUN1ZUNvbXBh
cmUoY29uc3Qgc3RkOjpwYWlyPGRvdWJsZSwgVGV4dFRyYWNrQ3VlKj4mIGEsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6cGFpcjxkb3VibGUsIFRleHRUcmFja0N1
ZSo+JiBiKQoreworICAgIC8vIDEyIC0gU29ydCB0aGUgdGFza3MgaW4gZXZlbnRzIGluIGFzY2Vu
ZGluZyB0aW1lIG9yZGVyICh0YXNrcyB3aXRoIGVhcmxpZXIKKyAgICAvLyB0aW1lcyBmaXJzdCku
CisgICAgaWYgKGEuZmlyc3QgIT0gYi5maXJzdCkKKyAgICAgICAgcmV0dXJuIGEuZmlyc3QgLSBi
LmZpcnN0IDwgMDsKKworICAgIC8vIFRyZWF0IHRoZSBzcGVjaWFsIGNhc2Ugd2hlbiBjdWVzIGJl
bG9uZyB0byBkaWZmZXJlbnQgdHJhY2tzLgorICAgIGlmIChhLnNlY29uZC0+dHJhY2soKSAhPSBi
LnNlY29uZC0+dHJhY2soKSkKKyAgICAgICAgcmV0dXJuIHRyYWNrSW5kZXhDb21wYXJlKGEuc2Vj
b25kLT50cmFjaygpLCBiLnNlY29uZC0+dHJhY2soKSk7CisKKyAgICAvLyAxMiAtIEZ1cnRoZXIg
c29ydCB0YXNrcyBpbiBldmVudHMgdGhhdCBoYXZlIHRoZSBzYW1lIHRpbWUgYnkgdGhlCisgICAg
Ly8gcmVsYXRpdmUgdGV4dCB0cmFjayBjdWUgb3JkZXIgb2YgdGhlIHRleHQgdHJhY2sgY3VlcyBh
c3NvY2lhdGVkCisgICAgLy8gd2l0aCB0aGVzZSB0YXNrcy4KKyAgICByZXR1cm4gYS5zZWNvbmQt
PmN1ZUluZGV4KCkgLSBiLnNlY29uZC0+Y3VlSW5kZXgoKSA8IDA7Cit9CisKKwogdm9pZCBIVE1M
TWVkaWFFbGVtZW50Ojp1cGRhdGVBY3RpdmVUZXh0VHJhY2tDdWVzKGZsb2F0IG1vdmllVGltZSkK
IHsKKyAgICBMT0coTWVkaWEsICJIVE1MTWVkaWFFbGVtZW50Ojp1cGRhdGVBY3RpdmVUZXh0VHJh
Y2tzIik7CisKICAgICBpZiAoaWdub3JlVHJhY2tEaXNwbGF5VXBkYXRlUmVxdWVzdHMoKSkKICAg
ICAgICAgcmV0dXJuOwotICAgIAotICAgIEN1ZUxpc3QgcHJldmlvdXNseUFjdGl2ZUN1ZXMgPSBt
X2N1cnJlbnRseUFjdGl2ZUN1ZXM7Ci0gICAgYm9vbCBhY3RpdmVTZXRDaGFuZ2VkID0gZmFsc2U7
CiAKLSAgICBtX2N1cnJlbnRseUFjdGl2ZUN1ZXMgPSBtX2N1ZVRyZWUuYWxsT3ZlcmxhcHMobV9j
dWVUcmVlLmNyZWF0ZUludGVydmFsKG1vdmllVGltZSwgbW92aWVUaW1lKSk7Ci0gICAgCi0gICAg
Ly8gRklYTUUoNzIxNzEpOiBFdmVudHMgbmVlZCB0byBiZSBzb3J0ZWQgYW5kIGZpbHRlcmVkIGJl
Zm9yZSBkaXNwYXRjaGluZy4KKyAgICAvLyA0LjguMTAuOCBQbGF5aW5nIHRoZSBtZWRpYSByZXNv
dXJjZQogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmV2aW91c2x5QWN0aXZlQ3Vlcy5z
aXplKCk7ICsraSkgewotICAgICAgICBpZiAoIW1fY3VycmVudGx5QWN0aXZlQ3Vlcy5jb250YWlu
cyhwcmV2aW91c2x5QWN0aXZlQ3Vlc1tpXSkpIHsKLSAgICAgICAgICAgIHByZXZpb3VzbHlBY3Rp
dmVDdWVzW2ldLmRhdGEoKS0+c2V0SXNBY3RpdmUoZmFsc2UpOwotICAgICAgICAgICAgYWN0aXZl
U2V0Q2hhbmdlZCA9IHRydWU7CisgICAgLy8gMSAtIExldCBjdXJyZW50IGN1ZXMgYmUgYSBsaXN0
IG9mIGN1ZXMsIGluaXRpYWxpemVkIHRvIGNvbnRhaW4gYWxsIHRoZQorICAgIC8vIGN1ZXMgb2Yg
YWxsIHRoZSBoaWRkZW4sIHNob3dpbmcsIG9yIHNob3dpbmcgYnkgZGVmYXVsdCB0ZXh0IHRyYWNr
cyBvZiB0aGUKKyAgICAvLyBtZWRpYSBlbGVtZW50IChub3QgdGhlIGRpc2FibGVkIG9uZXMpIHdo
b3NlIHN0YXJ0IHRpbWVzIGFyZSBsZXNzIHRoYW4gb3IKKyAgICAvLyBlcXVhbCB0byB0aGUgY3Vy
cmVudCBwbGF5YmFjayBwb3NpdGlvbiBhbmQgd2hvc2UgZW5kIHRpbWVzIGFyZSBncmVhdGVyCisg
ICAgLy8gdGhhbiB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbi4KKyAgICBWZWN0b3I8Q3Vl
SW50ZXJ2YWxUcmVlOjpJbnRlcnZhbFR5cGU+IGN1cnJlbnRDdWVzOworICAgIGN1cnJlbnRDdWVz
ID0gbV9jdWVUcmVlLmFsbE92ZXJsYXBzKG1fY3VlVHJlZS5jcmVhdGVJbnRlcnZhbChtb3ZpZVRp
bWUsIG1vdmllVGltZSkpOworCisgICAgVmVjdG9yPEN1ZUludGVydmFsVHJlZTo6SW50ZXJ2YWxU
eXBlPiBhZmZlY3RlZEN1ZXM7CisgICAgVmVjdG9yPEN1ZUludGVydmFsVHJlZTo6SW50ZXJ2YWxU
eXBlPiBwcmV2aW91c0N1ZXM7CisgICAgVmVjdG9yPEN1ZUludGVydmFsVHJlZTo6SW50ZXJ2YWxU
eXBlPiBtaXNzZWRDdWVzOworCisgICAgLy8gMiAtIExldCBvdGhlciBjdWVzIGJlIGEgbGlzdCBv
ZiBjdWVzLCBpbml0aWFsaXplZCB0byBjb250YWluIGFsbCB0aGUgY3VlcworICAgIC8vIG9mIGhp
ZGRlbiwgc2hvd2luZywgYW5kIHNob3dpbmcgYnkgZGVmYXVsdCB0ZXh0IHRyYWNrcyBvZiB0aGUg
bWVkaWEKKyAgICAvLyBlbGVtZW50IHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIGN1cnJlbnQgY3Vl
cy4KKyAgICBwcmV2aW91c0N1ZXMgPSBtX2N1cnJlbnRseUFjdGl2ZUN1ZXM7CisKKyAgICAvLyAz
IC0gTGV0IGxhc3QgdGltZSBiZSB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBhdCB0aGUg
dGltZSB0aGlzCisgICAgLy8gYWxnb3JpdGhtIHdhcyBsYXN0IHJ1biBmb3IgdGhpcyBtZWRpYSBl
bGVtZW50LCBpZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QKKyAgICAvLyB0aW1lIGl0IGhhcyBydW4u
CisgICAgZmxvYXQgbGFzdFRpbWUgPSBtX2xhc3RUZXh0VHJhY2tVcGRhdGVUaW1lOworCisgICAg
Ly8gNCAtIElmIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGhhcywgc2luY2UgdGhlIGxh
c3QgdGltZSB0aGlzCisgICAgLy8gYWxnb3JpdGhtIHdhcyBydW4sIG9ubHkgY2hhbmdlZCB0aHJv
dWdoIGl0cyB1c3VhbCBtb25vdG9uaWMgaW5jcmVhc2UKKyAgICAvLyBkdXJpbmcgbm9ybWFsIHBs
YXliYWNrLCB0aGVuIGxldCBtaXNzZWQgY3VlcyBiZSB0aGUgbGlzdCBvZiBjdWVzIGluIG90aGVy
CisgICAgLy8gY3VlcyB3aG9zZSBzdGFydCB0aW1lcyBhcmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFs
IHRvIGxhc3QgdGltZSBhbmQgd2hvc2UKKyAgICAvLyBlbmQgdGltZXMgYXJlIGxlc3MgdGhhbiBv
ciBlcXVhbCB0byB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbi4KKyAgICAvLyBPdGhlcndp
c2UsIGxldCBtaXNzZWQgY3VlcyBiZSBhbiBlbXB0eSBsaXN0LgorICAgIGlmIChsYXN0VGltZSA+
PSAwICYmICFtX3NlZWtlZFNpbmNlTGFzdFRleHRUcmFja1VwZGF0ZSkgeworICAgICAgICBWZWN0
b3I8Q3VlSW50ZXJ2YWxUcmVlOjpJbnRlcnZhbFR5cGU+IHBvdGVudGlhbGx5U2tpcHBlZEN1ZXMg
PQorICAgICAgICAgICAgbV9jdWVUcmVlLmFsbE92ZXJsYXBzKG1fY3VlVHJlZS5jcmVhdGVJbnRl
cnZhbChsYXN0VGltZSwgbW92aWVUaW1lKSk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBwb3RlbnRpYWxseVNraXBwZWRDdWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBm
bG9hdCBjdWVTdGFydFRpbWUgPSBwb3RlbnRpYWxseVNraXBwZWRDdWVzW2ldLmxvdygpOworICAg
ICAgICAgICAgZmxvYXQgY3VlRW5kVGltZSA9IHBvdGVudGlhbGx5U2tpcHBlZEN1ZXNbaV0uaGln
aCgpOworCisgICAgICAgICAgICBpZiAoY3VlU3RhcnRUaW1lID4gbGFzdFRpbWUgJiYgY3VlRW5k
VGltZSA8IG1vdmllVGltZSkKKyAgICAgICAgICAgICAgICBtaXNzZWRDdWVzLmFwcGVuZChwb3Rl
bnRpYWxseVNraXBwZWRDdWVzW2ldKTsKICAgICAgICAgfQogICAgIH0KLSAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IG1fY3VycmVudGx5QWN0aXZlQ3Vlcy5zaXplKCk7ICsraSkgewotICAgICAg
ICBpZiAoIXByZXZpb3VzbHlBY3RpdmVDdWVzLmNvbnRhaW5zKG1fY3VycmVudGx5QWN0aXZlQ3Vl
c1tpXSkpIHsKLSAgICAgICAgICAgIG1fY3VycmVudGx5QWN0aXZlQ3Vlc1tpXS5kYXRhKCktPnNl
dElzQWN0aXZlKHRydWUpOworCisgICAgbV9sYXN0VGV4dFRyYWNrVXBkYXRlVGltZSA9IG1vdmll
VGltZTsKKworICAgIC8vIDUgLSBJZiB0aGUgdGltZSB3YXMgcmVhY2hlZCB0aHJvdWdoIHRoZSB1
c3VhbCBtb25vdG9uaWMgaW5jcmVhc2Ugb2YgdGhlCisgICAgLy8gY3VycmVudCBwbGF5YmFjayBw
b3NpdGlvbiBkdXJpbmcgbm9ybWFsIHBsYXliYWNrLCBhbmQgaWYgdGhlIHVzZXIgYWdlbnQKKyAg
ICAvLyBoYXMgbm90IGZpcmVkIGEgdGltZXVwZGF0ZSBldmVudCBhdCB0aGUgZWxlbWVudCBpbiB0
aGUgcGFzdCAxNSB0byAyNTBtcworICAgIC8vIGFuZCBpcyBub3Qgc3RpbGwgcnVubmluZyBldmVu
dCBoYW5kbGVycyBmb3Igc3VjaCBhbiBldmVudCwgdGhlbiB0aGUgdXNlcgorICAgIC8vIGFnZW50
IG11c3QgcXVldWUgYSB0YXNrIHRvIGZpcmUgYSBzaW1wbGUgZXZlbnQgbmFtZWQgdGltZXVwZGF0
ZSBhdCB0aGUKKyAgICAvLyBlbGVtZW50LiAoSW4gdGhlIG90aGVyIGNhc2VzLCBzdWNoIGFzIGV4
cGxpY2l0IHNlZWtzLCByZWxldmFudCBldmVudHMgZ2V0CisgICAgLy8gZmlyZWQgYXMgcGFydCBv
ZiB0aGUgb3ZlcmFsbCBwcm9jZXNzIG9mIGNoYW5naW5nIHRoZSBjdXJyZW50IHBsYXliYWNrCisg
ICAgLy8gcG9zaXRpb24uKQorICAgIGlmICghbV9zZWVrZWRTaW5jZUxhc3RUZXh0VHJhY2tVcGRh
dGUpCisgICAgICAgIHNjaGVkdWxlVGltZXVwZGF0ZUV2ZW50KGZhbHNlKTsKKworICAgIG1fc2Vl
a2VkU2luY2VMYXN0VGV4dFRyYWNrVXBkYXRlID0gZmFsc2U7CisKKyAgICAvLyA2IC0gSWYgYWxs
IG9mIHRoZSBjdWVzIGluIGN1cnJlbnQgY3VlcyBoYXZlIHRoZWlyIHRleHQgdHJhY2sgY3VlIGFj
dGl2ZQorICAgIC8vIGZsYWcgc2V0LCBub25lIG9mIHRoZSBjdWVzIGluIG90aGVyIGN1ZXMgaGF2
ZSB0aGVpciB0ZXh0IHRyYWNrIGN1ZSBhY3RpdmUKKyAgICAvLyBmbGFnIHNldCwgYW5kIG1pc3Nl
ZCBjdWVzIGlzIGVtcHR5LCB0aGVuIGFib3J0IHRoZXNlIHN0ZXBzLgorICAgIGJvb2wgYWN0aXZl
U2V0Q2hhbmdlZCA9IG1pc3NlZEN1ZXMuc2l6ZSgpOworCisgICAgc2l6ZV90IHByZXZpb3VzQ3Vl
c1NpemUgPSBwcmV2aW91c0N1ZXMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyAhYWN0
aXZlU2V0Q2hhbmdlZCAmJiBpIDwgcHJldmlvdXNDdWVzU2l6ZTsgKytpKQorICAgICAgICBpZiAo
IWN1cnJlbnRDdWVzLmNvbnRhaW5zKHByZXZpb3VzQ3Vlc1tpXSkgJiYgcHJldmlvdXNDdWVzW2ld
LmRhdGEoKS0+aXNBY3RpdmUoKSkgewogICAgICAgICAgICAgYWN0aXZlU2V0Q2hhbmdlZCA9IHRy
dWU7CiAgICAgICAgIH0KKworICAgIHNpemVfdCBjdXJyZW50Q3Vlc1NpemUgPSBjdXJyZW50Q3Vl
cy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7ICFhY3RpdmVTZXRDaGFuZ2VkICYmIGkg
PCBjdXJyZW50Q3Vlc1NpemU7ICsraSkKKyAgICAgICAgaWYgKCFjdXJyZW50Q3Vlc1tpXS5kYXRh
KCktPmlzQWN0aXZlKCkpCisgICAgICAgICAgICBhY3RpdmVTZXRDaGFuZ2VkID0gdHJ1ZTsKKwor
ICAgIGlmICghYWN0aXZlU2V0Q2hhbmdlZCkgeworICAgICAgICByZXR1cm47CiAgICAgfQotICAg
IAotICAgIC8vIEZJWE1FKDcyMTczKTogUGF1c2UgdGhlIG1lZGlhIGVsZW1lbnQgZm9yIGN1ZXMg
Z29pbmcgcGFzdCB0aGVpciBlbmRUaW1lCi0gICAgLy8gZHVyaW5nIGEgbW9ub3RvbmljIHRpbWUg
aW5jcmVhc2UuCisKKyAgICAvLyBGSVhNRSg3MjE3Myk6IDcgLSBJZiB0aGUgdGltZSB3YXMgcmVh
Y2hlZCB0aHJvdWdoIHRoZSB1c3VhbCBtb25vdG9uaWMKKyAgICAvLyBpbmNyZWFzZSBvZiB0aGUg
Y3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBkdXJpbmcgbm9ybWFsIHBsYXliYWNrLCBhbmQKKyAg
ICAvLyB0aGVyZSBhcmUgY3VlcyBpbiBvdGhlciBjdWVzIHRoYXQgaGF2ZSB0aGVpciB0ZXh0IHRy
YWNrIGN1ZSBwYXVzZS1vbi1leGl0CisgICAgLy8gZmxhZyBzZXQgYW5kIHRoYXQgZWl0aGVyIGhh
dmUgdGhlaXIgdGV4dCB0cmFjayBjdWUgYWN0aXZlIGZsYWcgc2V0IG9yIGFyZQorICAgIC8vIGFs
c28gaW4gbWlzc2VkIGN1ZXMsIHRoZW4gaW1tZWRpYXRlbHkgcGF1c2UgdGhlIG1lZGlhIGVsZW1l
bnQuCisKKyAgICAvLyA4IC0gTGV0IGV2ZW50cyBiZSBhIGxpc3Qgb2YgdGFza3MsIGluaXRpYWxs
eSBlbXB0eS4gRWFjaCB0YXNrIGluIHRoaXMKKyAgICAvLyBsaXN0IHdpbGwgYmUgYXNzb2NpYXRl
ZCB3aXRoIGEgdGV4dCB0cmFjaywgYSB0ZXh0IHRyYWNrIGN1ZSwgYW5kIGEgdGltZSwKKyAgICAv
LyB3aGljaCBhcmUgdXNlZCB0byBzb3J0IHRoZSBsaXN0IGJlZm9yZSB0aGUgdGFza3MgYXJlIHF1
ZXVlZC4KKyAgICBWZWN0b3I8c3RkOjpwYWlyPGRvdWJsZSwgVGV4dFRyYWNrQ3VlKj4gPiBldmVu
dFRhc2tzOworCisgICAgLy8gOCAtIExldCBhZmZlY3RlZCB0cmFja3MgYmUgYSBsaXN0IG9mIHRl
eHQgdHJhY2tzLCBpbml0aWFsbHkgZW1wdHkuCisgICAgVmVjdG9yPFRleHRUcmFjayo+IGFmZmVj
dGVkVHJhY2tzOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaXNzZWRDdWVzLnNpemUo
KTsgKytpKSB7CisgICAgICAgIC8vIDkgLSBGb3IgZWFjaCB0ZXh0IHRyYWNrIGN1ZSBpbiBtaXNz
ZWQgY3VlcywgcHJlcGFyZSBhbiBldmVudCBuYW1lZCBlbnRlcgorICAgICAgICAvLyBmb3IgdGhl
IFRleHRUcmFja0N1ZSBvYmplY3Qgd2l0aCB0aGUgdGV4dCB0cmFjayBjdWUgc3RhcnQgdGltZS4K
KyAgICAgICAgZXZlbnRUYXNrcy5hcHBlbmQoc3RkOjptYWtlX3BhaXIobWlzc2VkQ3Vlc1tpXS5k
YXRhKCktPnN0YXJ0VGltZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBtaXNzZWRDdWVzW2ldLmRhdGEoKSkpOworCisgICAgICAgIC8vIDEwIC0gRm9yIGVhY2gg
dGV4dCB0cmFjayBpbiBtaXNzZWQgY3VlcywgcHJlcGFyZSBhbiBldmVudAorICAgICAgICAvLyBu
YW1lZCBleGl0IGZvciB0aGUgVGV4dFRyYWNrQ3VlIG9iamVjdCB3aXRoIHRoZSB0ZXh0IHRyYWNr
IGN1ZSBlbmQKKyAgICAgICAgLy8gdGltZS4KKyAgICAgICAgZXZlbnRUYXNrcy5hcHBlbmQoc3Rk
OjptYWtlX3BhaXIobWlzc2VkQ3Vlc1tpXS5kYXRhKCktPmVuZFRpbWUoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2VkQ3Vlc1tpXS5kYXRhKCkpKTsKKyAg
ICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByZXZpb3VzQ3Vlcy5zaXplKCk7ICsr
aSkgeworICAgICAgICAvLyAxMCAtIEZvciBlYWNoIHRleHQgdHJhY2sgY3VlIGluIG90aGVyIGN1
ZXMgdGhhdCBoYXMgaXRzIHRleHQKKyAgICAgICAgLy8gdHJhY2sgY3VlIGFjdGl2ZSBmbGFnIHNl
dCBwcmVwYXJlIGFuIGV2ZW50IG5hbWVkIGV4aXQgZm9yIHRoZQorICAgICAgICAvLyBUZXh0VHJh
Y2tDdWUgb2JqZWN0IHdpdGggdGhlIHRleHQgdHJhY2sgY3VlIGVuZCB0aW1lLgorICAgICAgICBp
ZiAoIWN1cnJlbnRDdWVzLmNvbnRhaW5zKHByZXZpb3VzQ3Vlc1tpXSkpCisgICAgICAgICAgICBl
dmVudFRhc2tzLmFwcGVuZChzdGQ6Om1ha2VfcGFpcihwcmV2aW91c0N1ZXNbaV0uZGF0YSgpLT5l
bmRUaW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBw
cmV2aW91c0N1ZXNbaV0uZGF0YSgpKSk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBjdXJyZW50Q3Vlcy5zaXplKCk7ICsraSkgeworICAgICAgICAvLyAxMSAtIEZvciBlYWNo
IHRleHQgdHJhY2sgY3VlIGluIGN1cnJlbnQgY3VlcyB0aGF0IGRvZXMgbm90IGhhdmUgaXRzCisg
ICAgICAgIC8vIHRleHQgdHJhY2sgY3VlIGFjdGl2ZSBmbGFnIHNldCwgcHJlcGFyZSBhbiBldmVu
dCBuYW1lZCBlbnRlciBmb3IgdGhlCisgICAgICAgIC8vIFRleHRUcmFja0N1ZSBvYmplY3Qgd2l0
aCB0aGUgdGV4dCB0cmFjayBjdWUgc3RhcnQgdGltZS4KKyAgICAgICAgaWYgKCFwcmV2aW91c0N1
ZXMuY29udGFpbnMoY3VycmVudEN1ZXNbaV0pKQorICAgICAgICAgICAgZXZlbnRUYXNrcy5hcHBl
bmQoc3RkOjptYWtlX3BhaXIoY3VycmVudEN1ZXNbaV0uZGF0YSgpLT5zdGFydFRpbWUoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDdWVzW2ld
LmRhdGEoKSkpOworICAgIH0KKworICAgIC8vIDEyIC0gU29ydCB0aGUgdGFza3MgaW4gZXZlbnRz
IGluIGFzY2VuZGluZyB0aW1lIG9yZGVyICh0YXNrcyB3aXRoIGVhcmxpZXIKKyAgICAvLyB0aW1l
cyBmaXJzdCkuCisgICAgbm9uQ29weWluZ1NvcnQoZXZlbnRUYXNrcy5iZWdpbigpLCBldmVudFRh
c2tzLmVuZCgpLCBldmVudFRpbWVDdWVDb21wYXJlKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAw
OyBpIDwgZXZlbnRUYXNrcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoIWFmZmVjdGVkVHJh
Y2tzLmNvbnRhaW5zKGV2ZW50VGFza3NbaV0uc2Vjb25kLT50cmFjaygpKSkKKyAgICAgICAgICAg
IGFmZmVjdGVkVHJhY2tzLmFwcGVuZChldmVudFRhc2tzW2ldLnNlY29uZC0+dHJhY2soKSk7CisK
KyAgICAgICAgLy8gMTMgLSBRdWV1ZSBlYWNoIHRhc2sgaW4gZXZlbnRzLCBpbiBsaXN0IG9yZGVy
LgorICAgICAgICBSZWZQdHI8RXZlbnQ+IGV2ZW50OworCisgICAgICAgIGlmIChldmVudFRhc2tz
W2ldLmZpcnN0ID09IGV2ZW50VGFza3NbaV0uc2Vjb25kLT5zdGFydFRpbWUoKSkKKyAgICAgICAg
ICAgIGV2ZW50ID0gRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkuZW50ZXJFdmVudCwgZmFsc2Us
IGZhbHNlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXZlbnQgPSBFdmVudDo6Y3JlYXRl
KGV2ZW50TmFtZXMoKS5leGl0RXZlbnQsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgZXZlbnQt
PnNldFRhcmdldChldmVudFRhc2tzW2ldLnNlY29uZCk7CisgICAgICAgIG1fYXN5bmNFdmVudFF1
ZXVlLmVucXVldWVFdmVudChldmVudC5yZWxlYXNlKCkpOworICAgIH0KKworICAgIC8vIDE0IC0g
U29ydCBhZmZlY3RlZCB0cmFja3MgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHRleHQgdHJhY2tz
IGFwcGVhciBpbgorICAgIC8vIHRoZSBtZWRpYSBlbGVtZW50J3MgbGlzdCBvZiB0ZXh0IHRyYWNr
cywgYW5kIHJlbW92ZSBkdXBsaWNhdGVzLgorICAgIG5vbkNvcHlpbmdTb3J0KGFmZmVjdGVkVHJh
Y2tzLmJlZ2luKCksIGFmZmVjdGVkVHJhY2tzLmVuZCgpLCB0cmFja0luZGV4Q29tcGFyZSk7CisK
KyAgICAvLyAxNSAtIEZvciBlYWNoIHRleHQgdHJhY2sgaW4gYWZmZWN0ZWQgdHJhY2tzLCBpbiB0
aGUgbGlzdCBvcmRlciwgcXVldWUgYQorICAgIC8vIHRhc2sgdG8gZmlyZSBhIHNpbXBsZSBldmVu
dCBuYW1lZCBjdWVjaGFuZ2UgYXQgdGhlIFRleHRUcmFjayBvYmplY3QsIGFuZCwKKyAgICAvLyBp
ZiB0aGUgdGV4dCB0cmFjayBoYXMgYSBjb3JyZXNwb25kaW5nIHRyYWNrIGVsZW1lbnQsIHRvIHRo
ZW4gZmlyZSBhCisgICAgLy8gc2ltcGxlIGV2ZW50IG5hbWVkIGN1ZWNoYW5nZSBhdCB0aGUgdHJh
Y2sgZWxlbWVudCBhcyB3ZWxsLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWZmZWN0ZWRU
cmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUmVmUHRyPEV2ZW50PiBldmVudCA9CisgICAg
ICAgICAgICAgICAgRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkuY3VlY2hhbmdlRXZlbnQsIGZh
bHNlLCBmYWxzZSk7CisgICAgICAgIGV2ZW50LT5zZXRUYXJnZXQoYWZmZWN0ZWRUcmFja3NbaV0p
OworCisgICAgICAgIG1fYXN5bmNFdmVudFF1ZXVlLmVucXVldWVFdmVudChldmVudC5yZWxlYXNl
KCkpOworICAgIH0KKworICAgIC8vIDE2IC0gU2V0IHRoZSB0ZXh0IHRyYWNrIGN1ZSBhY3RpdmUg
ZmxhZyBvZiBhbGwgdGhlIGN1ZXMgaW4gdGhlIGN1cnJlbnQKKyAgICAvLyBjdWVzLCBhbmQgdW5z
ZXQgdGhlIHRleHQgdHJhY2sgY3VlIGFjdGl2ZSBmbGFnIG9mIGFsbCB0aGUgY3VlcyBpbiB0aGUK
KyAgICAvLyBvdGhlciBjdWVzLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY3VycmVudEN1
ZXMuc2l6ZSgpOyArK2kpCisgICAgICAgIGN1cnJlbnRDdWVzW2ldLmRhdGEoKS0+c2V0SXNBY3Rp
dmUodHJ1ZSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByZXZpb3VzQ3Vlcy5zaXpl
KCk7ICsraSkKKyAgICAgICAgaWYgKCFjdXJyZW50Q3Vlcy5jb250YWlucyhwcmV2aW91c0N1ZXNb
aV0pKQorICAgICAgICAgICAgcHJldmlvdXNDdWVzW2ldLmRhdGEoKS0+c2V0SXNBY3RpdmUoZmFs
c2UpOworCisgICAgLy8gVXBkYXRlIHRoZSBjdXJyZW50IGFjdGl2ZSBjdWVzLgorICAgIG1fY3Vy
cmVudGx5QWN0aXZlQ3VlcyA9IGN1cnJlbnRDdWVzOwogCiAgICAgaWYgKGFjdGl2ZVNldENoYW5n
ZWQgJiYgaGFzTWVkaWFDb250cm9scygpKQogICAgICAgICBtZWRpYUNvbnRyb2xzKCktPnVwZGF0
ZVRleHRUcmFja0Rpc3BsYXkoKTsKQEAgLTE1OTksNiArMTc4MSwxMCBAQCB2b2lkIEhUTUxNZWRp
YUVsZW1lbnQ6OmZpbmlzaFNlZWsoKQogewogICAgIExPRyhNZWRpYSwgIkhUTUxNZWRpYUVsZW1l
bnQ6OmZpbmlzaFNlZWsiKTsKIAorI2lmIEVOQUJMRShWSURFT19UUkFDSykKKyAgICBtX3NlZWtl
ZFNpbmNlTGFzdFRleHRUcmFja1VwZGF0ZSA9IHRydWU7CisjZW5kaWYKKwogICAgIC8vIDQuOC4x
MC45IFNlZWtpbmcgc3RlcCAxNAogICAgIG1fc2Vla2luZyA9IGZhbHNlOwogCkBAIC0yNjgwLDYg
KzI4NjYsMTAgQEAgdm9pZCBIVE1MTWVkaWFFbGVtZW50OjptZWRpYVBsYXllclRpbWVDaGFuZ2Vk
KE1lZGlhUGxheWVyKikKIHsKICAgICBMT0coTWVkaWEsICJIVE1MTWVkaWFFbGVtZW50OjptZWRp
YVBsYXllclRpbWVDaGFuZ2VkIik7CiAKKyNpZiBFTkFCTEUoVklERU9fVFJBQ0spCisgICAgdXBk
YXRlQWN0aXZlVGV4dFRyYWNrQ3VlcyhjdXJyZW50VGltZSgpKTsKKyNlbmRpZgorCiAgICAgYmVn
aW5Qcm9jZXNzaW5nTWVkaWFQbGF5ZXJDYWxsYmFjaygpOwogCiAgICAgaW52YWxpZGF0ZUNhY2hl
ZFRpbWUoKTsKQEAgLTI3MjgsOSArMjkxOCw2IEBAIHZvaWQgSFRNTE1lZGlhRWxlbWVudDo6bWVk
aWFQbGF5ZXJUaW1lQ2hhbmdlZChNZWRpYVBsYXllciopCiAgICAgICAgIG1fc2VudEVuZEV2ZW50
ID0gZmFsc2U7CiAKICAgICB1cGRhdGVQbGF5U3RhdGUoKTsKLSNpZiBFTkFCTEUoVklERU9fVFJB
Q0spCi0gICAgdXBkYXRlQWN0aXZlVGV4dFRyYWNrQ3Vlcyhub3cpOwotI2VuZGlmCiAgICAgZW5k
UHJvY2Vzc2luZ01lZGlhUGxheWVyQ2FsbGJhY2soKTsKIH0KIApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvaHRtbC9IVE1MTWVkaWFFbGVtZW50LmggYi9Tb3VyY2UvV2ViQ29yZS9odG1sL0hU
TUxNZWRpYUVsZW1lbnQuaAppbmRleCA3NmMyNGNiYWI3ZjBmY2M2YzI4ZmE4MjBiMzg3ZDdiYzFh
ZmYwNzgwLi4wMmU2ZmJhYWZmYzY2MjVmMzMxMDU2ZTgyZjZmY2IzMDgyOTFhZmQ2IDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxNZWRpYUVsZW1lbnQuaAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9odG1sL0hUTUxNZWRpYUVsZW1lbnQuaApAQCAtNTk1LDEwICs1OTUsMTQgQEAgcHJp
dmF0ZToKICNpZiBFTkFCTEUoVklERU9fVFJBQ0spCiAgICAgYm9vbCBtX3RyYWNrc0FyZVJlYWR5
IDogMTsKICAgICBib29sIG1faGF2ZVZpc2libGVUZXh0VHJhY2sgOiAxOworICAgIGJvb2wgbV9z
ZWVrZWRTaW5jZUxhc3RUZXh0VHJhY2tVcGRhdGUgOiAxOworICAgIGZsb2F0IG1fbGFzdFRleHRU
cmFja1VwZGF0ZVRpbWU7CiAKICAgICBSZWZQdHI8VGV4dFRyYWNrTGlzdD4gbV90ZXh0VHJhY2tz
OwogICAgIFZlY3RvcjxSZWZQdHI8VGV4dFRyYWNrPiA+IG1fdGV4dFRyYWNrc1doZW5SZXNvdXJj
ZVNlbGVjdGlvbkJlZ2FuOworCiAgICAgQ3VlSW50ZXJ2YWxUcmVlIG1fY3VlVHJlZTsKKwogICAg
IEN1ZUxpc3QgbV9jdXJyZW50bHlBY3RpdmVDdWVzOwogICAgIGludCBtX2lnbm9yZVRyYWNrRGlz
cGxheVVwZGF0ZTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9Mb2Fk
YWJsZVRleHRUcmFjay5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL0xvYWRhYmxlVGV4dFRyYWNr
LmNwcAppbmRleCBiNDhkOGM3Y2IyYmE2NTJlNzgxNTdhNDgwNDkzYWY1YzMzOGFlMTliLi4yMzE3
ODc0MDhjYmU5YmNhZjU2N2FiMmQxMTQ4ZDU5ZmJmMzdjMmRiIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9odG1sL0xvYWRhYmxlVGV4dFRyYWNrLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9o
dG1sL0xvYWRhYmxlVGV4dFRyYWNrLmNwcApAQCAtMTIzLDExICsxMjMsMTggQEAgdm9pZCBMb2Fk
YWJsZVRleHRUcmFjazo6Y3VlTG9hZGluZ0NvbXBsZXRlZChUZXh0VHJhY2tMb2FkZXIqIGxvYWRl
ciwgYm9vbCBsb2FkaW4KICAgICBtX3RyYWNrRWxlbWVudC0+ZGlkQ29tcGxldGVMb2FkKHRoaXMs
IGxvYWRpbmdGYWlsZWQgPyBIVE1MVHJhY2tFbGVtZW50OjpGYWlsdXJlIDogSFRNTFRyYWNrRWxl
bWVudDo6U3VjY2Vzcyk7CiB9CiAKLXZvaWQgTG9hZGFibGVUZXh0VHJhY2s6OmZpcmVDdWVDaGFu
Z2VFdmVudCgpCitib29sIExvYWRhYmxlVGV4dFRyYWNrOjpkaXNwYXRjaEV2ZW50KFBhc3NSZWZQ
dHI8RXZlbnQ+IGV2ZW50KQogewotICAgIFRleHRUcmFjazo6ZmlyZUN1ZUNoYW5nZUV2ZW50KCk7
Ci0gICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgbV90cmFja0VsZW1lbnQtPmRpc3BhdGNo
RXZlbnQoRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkuY3VlY2hhbmdlRXZlbnQsIGZhbHNlLCBm
YWxzZSksIGVjKTsKKyAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBldmVudE5hbWVzKCkuY3VlY2hh
bmdlRXZlbnQpIHsKKyAgICAgICAgYm9vbCByZXN1bHQxID0gVGV4dFRyYWNrOjpkaXNwYXRjaEV2
ZW50KGV2ZW50KTsKKworICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICAgICAgYm9v
bCByZXN1bHQyID0gbV90cmFja0VsZW1lbnQtPmRpc3BhdGNoRXZlbnQoRXZlbnQ6OmNyZWF0ZShl
dmVudE5hbWVzKCkuY3VlY2hhbmdlRXZlbnQsIGZhbHNlLCBmYWxzZSksIGVjKTsKKworICAgICAg
ICByZXR1cm4gcmVzdWx0MSAmJiByZXN1bHQyOworICAgIH0KKworICAgIHJldHVybiBUZXh0VHJh
Y2s6OmRpc3BhdGNoRXZlbnQoZXZlbnQpOwogfQogCiBzaXplX3QgTG9hZGFibGVUZXh0VHJhY2s6
OnRyYWNrRWxlbWVudEluZGV4KCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvTG9h
ZGFibGVUZXh0VHJhY2suaCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvTG9hZGFibGVUZXh0VHJhY2su
aAppbmRleCBiNzAxMjI1MzY4MzIzZGU3Zjg5ZmFlYjEyMzdhNDk4MTlmYTk5ZGY1Li42YTM2NjZk
MmM3ZWZmYmE1MDJlMDZiNjVhNmQ5M2U1NjY4OWI0YjBkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9odG1sL0xvYWRhYmxlVGV4dFRyYWNrLmgKKysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC9M
b2FkYWJsZVRleHRUcmFjay5oCkBAIC03MSw4ICs3MSw4IEBAIHByaXZhdGU6CiAgICAgTG9hZGFi
bGVUZXh0VHJhY2soSFRNTFRyYWNrRWxlbWVudCosIGNvbnN0IFN0cmluZyYga2luZCwgY29uc3Qg
U3RyaW5nJiBsYWJlbCwgY29uc3QgU3RyaW5nJiBsYW5ndWFnZSwgYm9vbCBpc0RlZmF1bHQpOwog
CiAgICAgdm9pZCBsb2FkVGltZXJGaXJlZChUaW1lcjxMb2FkYWJsZVRleHRUcmFjaz4qKTsKLSAg
ICAKLSAgICB2aXJ0dWFsIHZvaWQgZmlyZUN1ZUNoYW5nZUV2ZW50KCk7CisKKyAgICB2aXJ0dWFs
IGJvb2wgZGlzcGF0Y2hFdmVudChQYXNzUmVmUHRyPEV2ZW50Pik7CiAKICAgICBIVE1MVHJhY2tF
bGVtZW50KiBtX3RyYWNrRWxlbWVudDsKICAgICBUaW1lcjxMb2FkYWJsZVRleHRUcmFjaz4gbV9s
b2FkVGltZXI7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFjay5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFjay5jcHAKaW5kZXggYmRmYmFhMjA1NzM2YzZk
MzdlODliODY2YWM4ODliYjFhODUwODNjNS4uNDg0NzRkMzg5ZjFlY2IyZGRiODAyMmEzMjgzYTY0
NWMyNTQ0ZGViZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2suY3Bw
CisrKyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrLmNwcApAQCAtMjQ2LDEyICsyNDYs
NiBAQCB2b2lkIFRleHRUcmFjazo6cmVtb3ZlQ3VlKFRleHRUcmFja0N1ZSogY3VlLCBFeGNlcHRp
b25Db2RlJiBlYykKICAgICAgICAgbV9jbGllbnQtPnRleHRUcmFja1JlbW92ZUN1ZSh0aGlzLCBj
dWUpOwogfQogCi12b2lkIFRleHRUcmFjazo6ZmlyZUN1ZUNoYW5nZUV2ZW50KCkKLXsKLSAgICBF
eGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBkaXNwYXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZl
bnROYW1lcygpLmN1ZWNoYW5nZUV2ZW50LCBmYWxzZSwgZmFsc2UpLCBlYyk7Ci19Ci0gICAgCiB2
b2lkIFRleHRUcmFjazo6Y3VlV2lsbENoYW5nZShUZXh0VHJhY2tDdWUqIGN1ZSkKIHsKICAgICBp
ZiAoIW1fY2xpZW50KQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2su
aCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrLmgKaW5kZXggZjZlY2VjODQ4N2Y5MzFk
MzlkYTU4NjliYTY3YzAwNDdkNDA2OTNjNC4uMTI4NDNjYTAyMDc0MmNkZjQ5ZWM3MzlmYzlhMWE0
MzU0NGE4YzA4NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2suaAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFjay5oCkBAIC0xMDEsOCArMTAxLDcgQEAg
cHVibGljOgogCiAgICAgdm9pZCBjdWVXaWxsQ2hhbmdlKFRleHRUcmFja0N1ZSopOwogICAgIHZv
aWQgY3VlRGlkQ2hhbmdlKFRleHRUcmFja0N1ZSopOwotICAgIAotICAgIHZpcnR1YWwgdm9pZCBm
aXJlQ3VlQ2hhbmdlRXZlbnQoKTsKKwogICAgIERFRklORV9BVFRSSUJVVEVfRVZFTlRfTElTVEVO
RVIoY3VlY2hhbmdlKTsKIAogICAgIGVudW0gVGV4dFRyYWNrVHlwZSB7IFRyYWNrRWxlbWVudCwg
QWRkVHJhY2ssIEluQmFuZCB9OwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0
VHJhY2tDdWUuY3BwIGIvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2tDdWUuY3BwCmluZGV4
IGUxYzAxMjY2ZTc2NmJjNWMwOWIwODk5NmY1OTZiZGM3OGFmOWVlNGIuLjdkMDg3MzMyZDY0ZWI2
ZTU5OGMyMmE5ZjFiNzg0OGU2ODI4MWFjMjEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0
bWwvVGV4dFRyYWNrQ3VlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFja0N1
ZS5jcHAKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlICJFdmVudC5oIgogI2luY2x1ZGUgIkRv
Y3VtZW50RnJhZ21lbnQuaCIKICNpbmNsdWRlICJUZXh0VHJhY2suaCIKKyNpbmNsdWRlICJUZXh0
VHJhY2tDdWVMaXN0LmgiCiAjaW5jbHVkZSAiV2ViVlRUUGFyc2VyLmgiCiAjaW5jbHVkZSA8d3Rm
L3RleHQvU3RyaW5nQnVpbGRlci5oPgogCkBAIC05Miw2ICs5Myw3IEBAIFRleHRUcmFja0N1ZTo6
VGV4dFRyYWNrQ3VlKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQsIGNvbnN0IFN0cmlu
ZyYgaWQsIGRvCiAgICAgLCBtX2lzQWN0aXZlKGZhbHNlKQogICAgICwgbV9wYXVzZU9uRXhpdChw
YXVzZU9uRXhpdCkKICAgICAsIG1fc25hcFRvTGluZXModHJ1ZSkKKyAgICAsIG1fdmFsaWRDdWVJ
bmRleChmYWxzZSkKIHsKICAgICBwYXJzZVNldHRpbmdzKHNldHRpbmdzKTsKIH0KQEAgLTMyNCw2
ICszMjYsMjAgQEAgdm9pZCBUZXh0VHJhY2tDdWU6OnNldFRleHQoY29uc3QgU3RyaW5nJiB0ZXh0
KQogICAgIGN1ZURpZENoYW5nZSgpOwogfQogCitpbnQgVGV4dFRyYWNrQ3VlOjpjdWVJbmRleCgp
Cit7CisgICAgaWYgKCFtX3ZhbGlkQ3VlSW5kZXgpCisgICAgICAgIG1fY3VlSW5kZXggPSB0cmFj
aygpLT5jdWVzKCktPmdldEN1ZUluZGV4KHRoaXMpOworCisgICAgbV92YWxpZEN1ZUluZGV4ID0g
dHJ1ZTsKKyAgICByZXR1cm4gbV9jdWVJbmRleDsKK30KKwordm9pZCBUZXh0VHJhY2tDdWU6Omlu
dmFsaWRhdGVDdWVJbmRleCgpCit7CisgICAgbV92YWxpZEN1ZUluZGV4ID0gZmFsc2U7Cit9CisK
IFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gVGV4dFRyYWNrQ3VlOjpnZXRDdWVBc0hUTUwo
KQogewogICAgIGlmICghbV9kb2N1bWVudEZyYWdtZW50KQpAQCAtMzM3LDYgKzM1MywyNCBAQCB2
b2lkIFRleHRUcmFja0N1ZTo6c2V0Q3VlSFRNTChQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+
IGZyYWdtZW50KQogICAgIG1fZG9jdW1lbnRGcmFnbWVudCA9IGZyYWdtZW50OwogfQogCitib29s
IFRleHRUcmFja0N1ZTo6ZGlzcGF0Y2hFdmVudChQYXNzUmVmUHRyPEV2ZW50PiBldmVudCkKK3sK
KyAgICBMT0coTWVkaWEsICJUZXh0VHJhY2tDdWU6OkRpc3BhdGNoaW5nIGV2ZW50Li4uIik7CisK
KyAgICAvLyBXaGVuIGEgVGV4dFRyYWNrJ3MgbW9kZSBpcyBkaXNhYmxlZDogbm8gY3VlcyBhcmUg
YWN0aXZlLCBubyBldmVudHMgZmlyZWQuCisgICAgaWYgKCF0cmFjaygpIHx8IHRyYWNrKCktPm1v
ZGUoKSA9PSBUZXh0VHJhY2s6OkRJU0FCTEVEKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBMT0coTWVkaWEsICJUZXh0VHJhY2tDdWU6OkNhbGxpbmcgc3VwZXJjbGFzcyBkaXNwYXRjaC4u
LiIpOworICAgIHJldHVybiBFdmVudFRhcmdldDo6ZGlzcGF0Y2hFdmVudChldmVudCk7Cit9CisK
K2Jvb2wgVGV4dFRyYWNrQ3VlOjpkaXNwYXRjaEV2ZW50KFBhc3NSZWZQdHI8RXZlbnQ+IGV2ZW50
LCBFeGNlcHRpb25Db2RlICZlYykKK3sKKyAgICBMT0coTWVkaWEsICJUZXh0VHJhY2tDdWU6OkNh
bGxpbmcgb3duIGV2ZW50IGRpc3BhdGNoIHdpdGggZXhjZXB0aW9ucy4uLiIpOworICAgIHJldHVy
biBFdmVudFRhcmdldDo6ZGlzcGF0Y2hFdmVudChldmVudCwgZWMpOworfQorCiBib29sIFRleHRU
cmFja0N1ZTo6aXNBY3RpdmUoKQogewogICAgIHJldHVybiBtX2lzQWN0aXZlICYmIHRyYWNrKCkg
JiYgdHJhY2soKS0+bW9kZSgpICE9IFRleHRUcmFjazo6RElTQUJMRUQ7CkBAIC0zNDUsMTkgKzM3
OSw2IEBAIGJvb2wgVGV4dFRyYWNrQ3VlOjppc0FjdGl2ZSgpCiB2b2lkIFRleHRUcmFja0N1ZTo6
c2V0SXNBY3RpdmUoYm9vbCBhY3RpdmUpCiB7CiAgICAgbV9pc0FjdGl2ZSA9IGFjdGl2ZTsKLQot
ICAgIC8vIFdoZW4gYSBUZXh0VHJhY2sncyBtb2RlIGlzIGRpc2FibGVkOiBObyBjdWVzIGFyZSBh
Y3RpdmUsIG5vIGV2ZW50cyBhcmUgZmlyZWQgLi4uCi0gICAgaWYgKCF0cmFjaygpIHx8IHRyYWNr
KCktPm1vZGUoKSA9PSBUZXh0VHJhY2s6OkRJU0FCTEVEKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBpZiAoYWN0aXZlKQotICAgICAgICBkaXNwYXRj
aEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLmVudGVyRXZlbnQsIGZhbHNlLCBmYWxz
ZSksIGVjKTsKLSAgICBlbHNlCi0gICAgICAgIGRpc3BhdGNoRXZlbnQoRXZlbnQ6OmNyZWF0ZShl
dmVudE5hbWVzKCkuZXhpdEV2ZW50LCBmYWxzZSwgZmFsc2UpLCBlYyk7Ci0KLSAgICBpZiAobV90
cmFjaykKLSAgICAgICAgbV90cmFjay0+ZmlyZUN1ZUNoYW5nZUV2ZW50KCk7CiB9CiAKIHZvaWQg
VGV4dFRyYWNrQ3VlOjpwYXJzZVNldHRpbmdzKGNvbnN0IFN0cmluZyYgaW5wdXQpCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFja0N1ZS5oIGIvU291cmNlL1dlYkNvcmUv
aHRtbC9UZXh0VHJhY2tDdWUuaAppbmRleCAxNmZhZjYzY2FmYTZmYzBjNTRmMzEwOGYyN2NjZmNj
NDVjMzk4OGM0Li43NTZjYzYyMDhjNjNkZjM3NTI1ZWIyZDMyNWFiOWMzYWRhN2NmNGNmIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFja0N1ZS5oCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlLmgKQEAgLTkyLDEyICs5MiwxOCBAQCBwdWJsaWM6CiAg
ICAgY29uc3QgU3RyaW5nJiB0ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9jb250ZW50OyB9CiAgICAg
dm9pZCBzZXRUZXh0KGNvbnN0IFN0cmluZyYpOwogCisgICAgaW50IGN1ZUluZGV4KCk7CisgICAg
dm9pZCBpbnZhbGlkYXRlQ3VlSW5kZXgoKTsKKwogICAgIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFn
bWVudD4gZ2V0Q3VlQXNIVE1MKCk7CiAgICAgdm9pZCBzZXRDdWVIVE1MKFBhc3NSZWZQdHI8RG9j
dW1lbnRGcmFnbWVudD4pOwogCisgICAgdmlydHVhbCBib29sIGRpc3BhdGNoRXZlbnQoUGFzc1Jl
ZlB0cjxFdmVudD4pOworICAgIGJvb2wgZGlzcGF0Y2hFdmVudChQYXNzUmVmUHRyPEV2ZW50Piwg
RXhjZXB0aW9uQ29kZSYpOworCiAgICAgYm9vbCBpc0FjdGl2ZSgpOwogICAgIHZvaWQgc2V0SXNB
Y3RpdmUoYm9vbCk7Ci0gICAgCisKICAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYgaW50
ZXJmYWNlTmFtZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgU2NyaXB0RXhlY3V0aW9uQ29udGV4dCog
c2NyaXB0RXhlY3V0aW9uQ29udGV4dCgpIGNvbnN0OwogCkBAIC0xMTgsMTAgKzEyNCwxMCBAQCBw
cml2YXRlOgogICAgIHZvaWQgcGFyc2VTZXR0aW5ncyhjb25zdCBTdHJpbmcmKTsKICAgICB2b2lk
IGN1ZVdpbGxDaGFuZ2UoKTsKICAgICB2b2lkIGN1ZURpZENoYW5nZSgpOwotICAgIAorCiAgICAg
dmlydHVhbCB2b2lkIHJlZkV2ZW50VGFyZ2V0KCkgeyByZWYoKTsgfQogICAgIHZpcnR1YWwgdm9p
ZCBkZXJlZkV2ZW50VGFyZ2V0KCkgeyBkZXJlZigpOyB9Ci0gICAgCisKICAgICBTdHJpbmcgbV9p
ZDsKICAgICBkb3VibGUgbV9zdGFydFRpbWU7CiAgICAgZG91YmxlIG1fZW5kVGltZTsKQEAgLTEz
MCw2ICsxMzYsOCBAQCBwcml2YXRlOgogICAgIGludCBtX2xpbmVQb3NpdGlvbjsKICAgICBpbnQg
bV90ZXh0UG9zaXRpb247CiAgICAgaW50IG1fY3VlU2l6ZTsKKyAgICBpbnQgbV9jdWVJbmRleDsK
KwogICAgIEFsaWdubWVudCBtX2N1ZUFsaWdubWVudDsKICAgICBSZWZQdHI8RG9jdW1lbnRGcmFn
bWVudD4gbV9kb2N1bWVudEZyYWdtZW50OwogICAgIFJlZlB0cjxUZXh0VHJhY2s+IG1fdHJhY2s7
CkBAIC0xNDAsNiArMTQ4LDcgQEAgcHJpdmF0ZToKICAgICBib29sIG1faXNBY3RpdmU7CiAgICAg
Ym9vbCBtX3BhdXNlT25FeGl0OwogICAgIGJvb2wgbV9zbmFwVG9MaW5lczsKKyAgICBib29sIG1f
dmFsaWRDdWVJbmRleDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlTGlzdC5jcHAgYi9Tb3VyY2UvV2ViQ29y
ZS9odG1sL1RleHRUcmFja0N1ZUxpc3QuY3BwCmluZGV4IDM0YjcxY2ExYjA1OGFmM2I5ZWNiMmQ4
NWYzNjIxNTkyYmRiM2JmZDAuLjM5MWIyZjY1MWUxYmQzZjgxNTcyZjEyNDFjNTU3MjcyZTMxNzQ5
NDAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlTGlzdC5jcHAK
KysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2tDdWVMaXN0LmNwcApAQCAtNDAsNiAr
NDAsMTEgQEAgdW5zaWduZWQgbG9uZyBUZXh0VHJhY2tDdWVMaXN0OjpsZW5ndGgoKSBjb25zdAog
ICAgIHJldHVybiBtX2xpc3Quc2l6ZSgpOwogfQogCit1bnNpZ25lZCBsb25nIFRleHRUcmFja0N1
ZUxpc3Q6OmdldEN1ZUluZGV4KFRleHRUcmFja0N1ZSogY3VlKSBjb25zdAoreworICAgIHJldHVy
biBtX2xpc3QuZmluZChjdWUpOworfQorCiBUZXh0VHJhY2tDdWUqIFRleHRUcmFja0N1ZUxpc3Q6
Oml0ZW0odW5zaWduZWQgaW5kZXgpIGNvbnN0CiB7CiAgICAgaWYgKGluZGV4IDwgbV9saXN0LnNp
emUoKSkKQEAgLTg4LDYgKzkzLDcgQEAgYm9vbCBUZXh0VHJhY2tDdWVMaXN0OjphZGQoUGFzc1Jl
ZlB0cjxUZXh0VHJhY2tDdWU+IHBycEN1ZSwgc2l6ZV90IHN0YXJ0LCBzaXplX3QKICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgIG1fbGlzdC5pbnNlcnQoc3RhcnQsIGN1ZSk7Cisg
ICAgICAgaW52YWxpZGF0ZUN1ZUluZGV4ZXMoc3RhcnQpOwogICAgICAgIHJldHVybiB0cnVlOwog
ICAgIH0KIApAQCAtMTE5LDYgKzEyNSwxMiBAQCB2b2lkIFRleHRUcmFja0N1ZUxpc3Q6OmNsZWFy
KCkKICAgICBtX2xpc3QuY2xlYXIoKTsKIH0KIAordm9pZCBUZXh0VHJhY2tDdWVMaXN0OjppbnZh
bGlkYXRlQ3VlSW5kZXhlcyhzaXplX3Qgc3RhcnQpCit7CisgICAgZm9yIChzaXplX3QgaSA9IHN0
YXJ0OyBpIDwgbV9saXN0LnNpemUoKTsgKytpKQorICAgICAgICBtX2xpc3RbaV0tPmludmFsaWRh
dGVDdWVJbmRleCgpOworfQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2tDdWVMaXN0LmggYi9Tb3VyY2Uv
V2ViQ29yZS9odG1sL1RleHRUcmFja0N1ZUxpc3QuaAppbmRleCA3YTdmOTA0MTVhN2ZlYjZmY2Rk
NjVhNDgxZGNjYzAxNjY2OWUyOWU4Li45MGIxOWE1YmUyZmMyZDk0YzQyOWFjMDNjOGRmNjI1YmQ2
YjMwNWNiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFja0N1ZUxpc3Qu
aAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFja0N1ZUxpc3QuaApAQCAtNDUsNiAr
NDUsOCBAQCBwdWJsaWM6CiAgICAgflRleHRUcmFja0N1ZUxpc3QoKSB7IH0KIAogICAgIHVuc2ln
bmVkIGxvbmcgbGVuZ3RoKCkgY29uc3Q7CisgICAgdW5zaWduZWQgbG9uZyBnZXRDdWVJbmRleChU
ZXh0VHJhY2tDdWUqKSBjb25zdDsKKwogICAgIFRleHRUcmFja0N1ZSogaXRlbSh1bnNpZ25lZCBp
bmRleCkgY29uc3Q7CiAgICAgVGV4dFRyYWNrQ3VlKiBnZXRDdWVCeUlkKGNvbnN0IFN0cmluZyYp
IGNvbnN0OwogICAgIFRleHRUcmFja0N1ZUxpc3QqIGFjdGl2ZUN1ZXMoKTsKQEAgLTU3LDEwICs1
OSwxMSBAQCBwcml2YXRlOgogICAgIFRleHRUcmFja0N1ZUxpc3QoKTsKICAgICBib29sIGFkZChQ
YXNzUmVmUHRyPFRleHRUcmFja0N1ZT4sIHNpemVfdCwgc2l6ZV90KTsKICAgICB2b2lkIGNsZWFy
KCk7Ci0gICAgCisgICAgdm9pZCBpbnZhbGlkYXRlQ3VlSW5kZXhlcyhzaXplX3QpOworCiAgICAg
VmVjdG9yPFJlZlB0cjxUZXh0VHJhY2tDdWU+ID4gbV9saXN0OwogICAgIFJlZlB0cjxUZXh0VHJh
Y2tDdWVMaXN0PiBtX2FjdGl2ZUN1ZXM7Ci0gICAgCisKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvdHJhY2svVGV4dFRyYWNrTGlz
dC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL3RyYWNrL1RleHRUcmFja0xpc3QuY3BwCmluZGV4
IDc3ZDk2NzNkNDMxNjQxYjQ3MWI0YTk2ZDdiYmVhNzFlMmY1NDAyYzguLjBlMTBmODA1MGQzMDkx
NjBlZDA0NDExZWRmN2JlNzQ3M2IwMTFlOGYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0
bWwvdHJhY2svVGV4dFRyYWNrTGlzdC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC90cmFj
ay9UZXh0VHJhY2tMaXN0LmNwcApAQCAtNTUsNiArNTUsMTEgQEAgdW5zaWduZWQgVGV4dFRyYWNr
TGlzdDo6bGVuZ3RoKCkgY29uc3QKICAgICByZXR1cm4gbV9hZGRUcmFja1RyYWNrcy5zaXplKCkg
KyBtX2VsZW1lbnRUcmFja3Muc2l6ZSgpOwogfQogCit1bnNpZ25lZCBUZXh0VHJhY2tMaXN0Ojpn
ZXRUcmFja0luZGV4KFRleHRUcmFjayAqdGV4dFRyYWNrKQoreworICAgIHJldHVybiBtX2VsZW1l
bnRUcmFja3MuZmluZCh0ZXh0VHJhY2spOworfQorCiBUZXh0VHJhY2sqIFRleHRUcmFja0xpc3Q6
Oml0ZW0odW5zaWduZWQgaW5kZXgpCiB7CiAgICAgLy8gNC44LjEwLjEyLjEgVGV4dCB0cmFjayBt
b2RlbApAQCAtNzcsNyArODIsNyBAQCBUZXh0VHJhY2sqIFRleHRUcmFja0xpc3Q6Oml0ZW0odW5z
aWduZWQgaW5kZXgpCiB2b2lkIFRleHRUcmFja0xpc3Q6OmFwcGVuZChQYXNzUmVmUHRyPFRleHRU
cmFjaz4gcHJwVHJhY2spCiB7CiAgICAgUmVmUHRyPFRleHRUcmFjaz4gdHJhY2sgPSBwcnBUcmFj
azsKLSAgICAKKwogICAgIGlmICh0cmFjay0+dHJhY2tUeXBlKCkgPT0gVGV4dFRyYWNrOjpBZGRU
cmFjaykKICAgICAgICAgbV9hZGRUcmFja1RyYWNrcy5hcHBlbmQodHJhY2spOwogICAgIGVsc2Ug
aWYgKHRyYWNrLT50cmFja1R5cGUoKSA9PSBUZXh0VHJhY2s6OlRyYWNrRWxlbWVudCkgewpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC90cmFjay9UZXh0VHJhY2tMaXN0LmggYi9Tb3Vy
Y2UvV2ViQ29yZS9odG1sL3RyYWNrL1RleHRUcmFja0xpc3QuaAppbmRleCA4OGQ5YWY2MmUwMmIy
Mjk1NzQ3NTM2NzdlZjIxNTE5MTZiZTY1ZWU3Li5mOGYwNGZmYTk4NTA3Y2RkMGY2ZDRiNWU4OTg4
NzQ3ZTU0ZmE4NTZhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1sL3RyYWNrL1RleHRU
cmFja0xpc3QuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL3RyYWNrL1RleHRUcmFja0xpc3Qu
aApAQCAtNTEsNiArNTEsOCBAQCBwdWJsaWM6CiAgICAgflRleHRUcmFja0xpc3QoKTsKIAogICAg
IHVuc2lnbmVkIGxlbmd0aCgpIGNvbnN0OworICAgIHVuc2lnbmVkIGdldFRyYWNrSW5kZXgoVGV4
dFRyYWNrKik7CisKICAgICBUZXh0VHJhY2sqIGl0ZW0odW5zaWduZWQgaW5kZXgpOwogICAgIHZv
aWQgYXBwZW5kKFBhc3NSZWZQdHI8VGV4dFRyYWNrPik7CiAgICAgdm9pZCByZW1vdmUoVGV4dFRy
YWNrKik7CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cgYi9MYXlvdXRUZXN0cy9D
aGFuZ2VMb2cKaW5kZXggZjhjZDg2ZDMwN2UzZmQ1YjE5MDVlYmU0OTlkZTYyMjdkNjE5MjJmOS4u
M2VlYzE1NjA1NGY5NGM1Y2Q3MmI4NDVlNzQyZGM0ZWJkOWJkNDFlOCAxMDA2NDQKLS0tIGEvTGF5
b3V0VGVzdHMvQ2hhbmdlTG9nCisrKyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwpAQCAtMSwzICsx
LDE3IEBACisyMDEyLTAyLTA3ICBWaWN0b3IgQ2FyYnVuZSAgPHZpY3RvckByb3NlZHUub3JnPgor
CisgICAgICAgIDx0cmFjaz4tcmVsYXRlZCBldmVudHMgY3VlY2hhbmdlLCBlbnRlciwgYW5kIGV4
aXQgc2hvdWxkIGJlIHNvcnRlZCBhbmQgZmlsdGVyZWQgYmVmb3JlIGRpc3BhdGNoaW5nCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MjE3MQorCisgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogbWVkaWEvdHJhY2sv
Y2FwdGlvbnMtd2VidnR0L21pc3NlZC1jdWVzLnZ0dDogQWRkZWQuCisgICAgICAgICogbWVkaWEv
dHJhY2svY2FwdGlvbnMtd2VidnR0L3NvcnRlZC1kaXNwYXRjaC52dHQ6IEFkZGVkLgorICAgICAg
ICAqIG1lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtbWlzc2VkLWV4cGVjdGVkLnR4dDogQWRkZWQuCisg
ICAgICAgICogbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1taXNzZWQuaHRtbDogQWRkZWQuCisgICAg
ICAgICogbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1zb3J0ZWQtYmVmb3JlLWRpc3BhdGNoLWV4cGVj
dGVkLnR4dDogQWRkZWQuCisgICAgICAgICogbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1zb3J0ZWQt
YmVmb3JlLWRpc3BhdGNoLmh0bWw6IEFkZGVkLgorCiAyMDEyLTAyLTA3ICBDc2FiYSBPc3p0cm9n
b27DoWMgIDxvc3N5QHdlYmtpdC5vcmc+CiAKICAgICAgICAgW1F0XSBDb3VwbGUgb2YgdGVzdHMg
aGF2ZSBkaWZmZXJlbnQgcmVzdWx0cyBvbiA2NCBiaXQgYW5kL29yIGluIGRlYnVnIG1vZGUgY29t
cGFyZWQgdG8gMzIgYml0IGFuZC9vciByZWxlYXNlIG1vZGUKZGlmZiAtLWdpdCBhL0xheW91dFRl
c3RzL21lZGlhL3RyYWNrL2NhcHRpb25zLXdlYnZ0dC9taXNzZWQtY3Vlcy52dHQgYi9MYXlvdXRU
ZXN0cy9tZWRpYS90cmFjay9jYXB0aW9ucy13ZWJ2dHQvbWlzc2VkLWN1ZXMudnR0Cm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjgxMzdlZjcyZWE3NGNiMjU2OGE5MWE3MTAxNzBmYjAxMDFlNmFkOWUKLS0tIC9kZXYvbnVs
bAorKysgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay9jYXB0aW9ucy13ZWJ2dHQvbWlzc2VkLWN1
ZXMudnR0CkBAIC0wLDAgKzEsMjcgQEAKK1dFQlZUVAorRXZlbnRzIHNob3VsZCBiZSB0cmlnZ2Vy
ZWQgZm9yIG1pc3NlZCAoc2tpcHBlZCkgY3VlcyBkdXJpbmcgbm9ybWFsIHBsYXliYWNrLgorCisx
CiswMDowMDowMC4wMDAgLS0+IDAwOjAwOjAxLjUwMCBBOnN0YXJ0IFQ6MjAlCitCZWFyIGlzIENv
bWluZyEhISEhCitBbmQgd2hhdCBraW5kIG9mIGEgYmVhciBpdCBpcyAtIGp1c3QgaGF2ZSBsb29r
LgorCisyCiswMDowMDowMi4wMDAgLS0+IDAwOjAwOjAyLjUwMCBBOnN0YXJ0IFQ6MjAlCitJIHNh
aWQgQmVhciBpcyBjb21pbmchISEhCisKKzMKKzAwOjAwOjA0LjUwMCAtLT4gMDA6MDA6MDQuNTAx
IEE6c3RhcnQgVDoyMCUKK0kgc2FpZCBCZWFyIGlzIGNvbWluZyBub3chISEhCisKKzQKKzAwOjAw
OjA0LjcwMCAtLT4gMDA6MDA6MDQuNzAxIEE6c3RhcnQgVDoyMCUKK1Rlc3RzIGZvciBhIHNlY29u
ZCBtaXNzZWQgY3VlLgorCis1CiswMDowMDowNC45MDAgLS0+IDAwOjAwOjA0LjkwMSBBOnN0YXJ0
IFQ6MjAlCitNYXliZSBhIHRoaXJkIG1pc3NlZCBjdWUuCisKKzYKKzAwOjAwOjA1Ljk5MiAtLT4g
MDA6MDA6MDUuOTkzIEE6c3RhcnQgVDoyMCUKK0ZvdXJ0aCBtaXNzZWQgY3VlLgpkaWZmIC0tZ2l0
IGEvTGF5b3V0VGVzdHMvbWVkaWEvdHJhY2svY2FwdGlvbnMtd2VidnR0L3NvcnRlZC1kaXNwYXRj
aC52dHQgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay9jYXB0aW9ucy13ZWJ2dHQvc29ydGVkLWRp
c3BhdGNoLnZ0dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40OGVjZDhlZmI3NWJlOTVmZGNkMTFhMzZhNTVjODIwOGUy
ZTBmNzUxCi0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvbWVkaWEvdHJhY2svY2FwdGlv
bnMtd2VidnR0L3NvcnRlZC1kaXNwYXRjaC52dHQKQEAgLTAsMCArMSwzMCBAQAorV0VCVlRUCitF
bnRlciBhbmQgZXhpdCBldmVudHMgc2hvdWxkIGJlIGRpc3BhdGNoZWQgaW4gYSBzb3J0ZWQgb3Jk
ZXIgYWNjb3JkaW5nIHRvIHRoZWlyIHRpbWVzLgorCisxCiswMDowMDowNS4xMDAgLS0+IDAwOjAw
OjA1LjgwMCBBOnN0YXJ0IFQ6MjAlCitCZWFyIGlzIENvbWluZyEhISEhCisKKzIKKzAwOjAwOjA1
LjEwMCAtLT4gMDA6MDA6MDUuMTAxCitNaXNzZWQgY3VlIDEKKworMworMDA6MDA6MDUuMTAwIC0t
PiAwMDowMDowNS4zMDEKK0FuZCB3aGF0IGtpbmQgb2YgYSBiZWFyIGl0IGlzIC0ganVzdCBoYXZl
IGxvb2suCisKKzQKKzAwOjAwOjA1LjEwMCAtLT4gMDA6MDA6MDUuMTAxCitNaXNzZWQgQ3VlIDIK
KworNQorMDA6MDA6MDUuMzAwIC0tPiAwMDowMDowNS44MDAgQTpzdGFydCBUOjIwJQorSSBzYWlk
IEJlYXIgaXMgY29taW5nISEhIQorCis2CiswMDowMDowNS45OTAgLS0+IDAwOjAwOjA1Ljk5MyBB
OnN0YXJ0IFQ6MjAlCitJIHNhaWQgQmVhciBpcyBjb21pbmcgbm93ISEhIQorCis3CiswMDowMDow
NS45OTQgLS0+IDAwOjAwOjA1Ljk5MyBBOnN0YXJ0IFQ6MjAlCitCZWFyIGlzIGFscmVhZHkgaGVy
ZQpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1taXNzZWQt
ZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1taXNzZWQt
ZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjRiNTc1ZDU4ODk2YWFlNjRiNGZiZmFjMmMwYjIzOTFi
ODM2YjdmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay90cmFj
ay1jdWVzLW1pc3NlZC1leHBlY3RlZC50eHQKQEAgLTAsMCArMSwzMiBAQAorVGVzdHMgdGhhdCBl
dmVudHMgYXJlIHRyaWdnZXJlZCBmb3IgbWlzc2VkIChza2lwcGVkKSBjdWVzIGR1cmluZyBub3Jt
YWwgcGxheWJhY2suCisKK0VWRU5UKGNhbnBsYXl0aHJvdWdoKQorRVhQRUNURUQgKHRlc3RUcmFj
ay50cmFjay5jdWVzLmxlbmd0aCA9PSAnNicpIE9LCitSVU4odmlkZW8ucGxheSgpKQorRVZFTlQo
ZW50ZXIpCitFWFBFQ1RFRCAoW29iamVjdCBUZXh0VHJhY2tDdWVdID09ICdbb2JqZWN0IFRleHRU
cmFja0N1ZV0nKSBPSworRVhQRUNURUQgKGN1cnJlbnRDdWUuaWQgPT0gJzMnKSBPSworRVZFTlQo
ZXhpdCkKK0VYUEVDVEVEIChbb2JqZWN0IFRleHRUcmFja0N1ZV0gPT0gJ1tvYmplY3QgVGV4dFRy
YWNrQ3VlXScpIE9LCitFWFBFQ1RFRCAoY3VycmVudEN1ZS5pZCA9PSAnMycpIE9LCitFVkVOVChl
bnRlcikKK0VYUEVDVEVEIChbb2JqZWN0IFRleHRUcmFja0N1ZV0gPT0gJ1tvYmplY3QgVGV4dFRy
YWNrQ3VlXScpIE9LCitFWFBFQ1RFRCAoY3VycmVudEN1ZS5pZCA9PSAnNCcpIE9LCitFVkVOVChl
eGl0KQorRVhQRUNURUQgKFtvYmplY3QgVGV4dFRyYWNrQ3VlXSA9PSAnW29iamVjdCBUZXh0VHJh
Y2tDdWVdJykgT0sKK0VYUEVDVEVEIChjdXJyZW50Q3VlLmlkID09ICc0JykgT0sKK0VWRU5UKGVu
dGVyKQorRVhQRUNURUQgKFtvYmplY3QgVGV4dFRyYWNrQ3VlXSA9PSAnW29iamVjdCBUZXh0VHJh
Y2tDdWVdJykgT0sKK0VYUEVDVEVEIChjdXJyZW50Q3VlLmlkID09ICc1JykgT0sKK0VWRU5UKGV4
aXQpCitFWFBFQ1RFRCAoW29iamVjdCBUZXh0VHJhY2tDdWVdID09ICdbb2JqZWN0IFRleHRUcmFj
a0N1ZV0nKSBPSworRVhQRUNURUQgKGN1cnJlbnRDdWUuaWQgPT0gJzUnKSBPSworRVZFTlQoZW50
ZXIpCitFWFBFQ1RFRCAoW29iamVjdCBUZXh0VHJhY2tDdWVdID09ICdbb2JqZWN0IFRleHRUcmFj
a0N1ZV0nKSBPSworRVhQRUNURUQgKGN1cnJlbnRDdWUuaWQgPT0gJzYnKSBPSworRVZFTlQoZXhp
dCkKK0VYUEVDVEVEIChbb2JqZWN0IFRleHRUcmFja0N1ZV0gPT0gJ1tvYmplY3QgVGV4dFRyYWNr
Q3VlXScpIE9LCitFWFBFQ1RFRCAoY3VycmVudEN1ZS5pZCA9PSAnNicpIE9LCitFVkVOVChlbmRl
ZCkKK0VORCBPRiBURVNUCisKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3Ry
YWNrLWN1ZXMtbWlzc2VkLmh0bWwgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay90cmFjay1jdWVz
LW1pc3NlZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmJmZGQzYzhiNzgyNDgyNTFlNzllYzJmZjZhZmY1YTQ3
NzdkNTBiYWYKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay90cmFj
ay1jdWVzLW1pc3NlZC5odG1sCkBAIC0wLDAgKzEsNzUgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0
bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIg
Y29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorCisgICAgICAgIDxzY3JpcHQg
c3JjPS4uL21lZGlhLWZpbGUuanM+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgc3JjPS4uL3Zp
ZGVvLXRlc3QuanM+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQ+CisgICAgICAgICAgICB2YXIg
dmlkZW9DYW5QbGF5VGhyb3VnaCA9IGZhbHNlOworICAgICAgICAgICAgdmFyIHRyYWNrTG9hZGVk
ID0gZmFsc2U7CisKKyAgICAgICAgICAgIHZhciBjdXJyZW50Q3VlOworICAgICAgICAgICAgdmFy
IGN1ZUNvdW50OworICAgICAgICAgICAgdmFyIHRlc3RUcmFjazsKKworICAgICAgICAgICAgZnVu
Y3Rpb24gcnVuVGVzdHMoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghdHJh
Y2tMb2FkZWQgfHwgIXZpZGVvQ2FuUGxheVRocm91Z2gpCisgICAgICAgICAgICAgICAgICAgIHJl
dHVybjsKKworICAgICAgICAgICAgICAgIHRlc3RUcmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRC
eUlkKCJ0ZXN0VHJhY2siKTsKKyAgICAgICAgICAgICAgICB0ZXN0RXhwZWN0ZWQoInRlc3RUcmFj
ay50cmFjay5jdWVzLmxlbmd0aCIsIDYpOworCisgICAgICAgICAgICAgICAgZm9yIChjdWVDb3Vu
dCA9IDI7IGN1ZUNvdW50IDwgdGVzdFRyYWNrLnRyYWNrLmN1ZXMubGVuZ3RoOyBjdWVDb3VudCsr
KSB7CisgICAgICAgICAgICAgICAgICAgIHRlc3RUcmFjay50cmFjay5jdWVzW2N1ZUNvdW50XS5h
ZGRFdmVudExpc3RlbmVyKCdlbnRlcicsIGN1ZUVudGVyZWRPckV4aXRlZCk7CisgICAgICAgICAg
ICAgICAgICAgIHRlc3RUcmFjay50cmFjay5jdWVzW2N1ZUNvdW50XS5hZGRFdmVudExpc3RlbmVy
KCdleGl0JywgY3VlRW50ZXJlZE9yRXhpdGVkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAg
ICAgICAgICAgICBjdWVDb3VudCA9IDM7CisgICAgICAgICAgICAgICAgcnVuKCJ2aWRlby5wbGF5
KCkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnVuY3Rpb24gY3VlRW50ZXJlZE9y
RXhpdGVkKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zb2xlV3JpdGUoIkVW
RU5UKCIgKyBldmVudC50eXBlICsgIikiKTsKKworICAgICAgICAgICAgICAgIGN1cnJlbnRDdWUg
PSBldmVudC50YXJnZXQ7CisgICAgICAgICAgICAgICAgdGVzdEV4cGVjdGVkKGN1cnJlbnRDdWUs
IHRlc3RUcmFjay50cmFjay5jdWVzLmdldEN1ZUJ5SWQoY3VlQ291bnQpKTsKKyAgICAgICAgICAg
ICAgICB0ZXN0RXhwZWN0ZWQoImN1cnJlbnRDdWUuaWQiLCBjdWVDb3VudCk7CisKKyAgICAgICAg
ICAgICAgICBpZiAoZXZlbnQudHlwZSA9PSAnZXhpdCcpIHsKKyAgICAgICAgICAgICAgICAgICAg
Y3VlQ291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIHdhaXRGb3JFdmVudCgnZW5kZWQnLCBlbmRUZXN0KTsKKworICAgICAgICAgICAgd2FpdEZv
ckV2ZW50KCdjYW5wbGF5dGhyb3VnaCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHZp
ZGVvLmN1cnJlbnRUaW1lID0gNS4wMDsKKyAgICAgICAgICAgICAgICB2aWRlb0NhblBsYXlUaHJv
dWdoID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIHJ1blRlc3RzKCk7CisgICAgICAgICAgICB9
KTsKKworICAgICAgICAgICAgZnVuY3Rpb24gbG9hZGVkKCkKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICB0cmFja0xvYWRlZCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBydW5UZXN0
cygpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgZnVuY3Rpb24gYm9keUxvYWRlZCgp
CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmluZE1lZGlhRWxlbWVudCgpOworICAg
ICAgICAgICAgICAgIHZpZGVvLnNyYyA9IGZpbmRNZWRpYUZpbGUoInZpZGVvIiwgIi4uL2NvbnRl
bnQvdGVzdCIpOworICAgICAgICAgICAgfQorICAgICAgICA8L3NjcmlwdD4KKyAgICA8L2hlYWQ+
CisgICAgPGJvZHkgb25sb2FkPSJib2R5TG9hZGVkKCkiPgorICAgICAgICA8cD5UZXN0cyB0aGF0
IGV2ZW50cyBhcmUgdHJpZ2dlcmVkIGZvciBtaXNzZWQgKHNraXBwZWQpIGN1ZXMgZHVyaW5nIG5v
cm1hbCBwbGF5YmFjay48L3A+CisgICAgICAgIDx2aWRlbyBjb250cm9scz4KKyAgICAgICAgICAg
IDx0cmFjayBpZD0idGVzdFRyYWNrIiBzcmM9ImNhcHRpb25zLXdlYnZ0dC9taXNzZWQtY3Vlcy52
dHQiIG9ubG9hZD0ibG9hZGVkKCkiIGRlZmF1bHQ+CisgICAgICAgIDwvdmlkZW8+CisgICAgPC9i
b2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvbWVkaWEvdHJhY2svdHJhY2st
Y3Vlcy1zb3J0ZWQtYmVmb3JlLWRpc3BhdGNoLWV4cGVjdGVkLnR4dCBiL0xheW91dFRlc3RzL21l
ZGlhL3RyYWNrL3RyYWNrLWN1ZXMtc29ydGVkLWJlZm9yZS1kaXNwYXRjaC1leHBlY3RlZC50eHQK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uZWZiOTRlZjU3NDMwNTY4ZjBmZDcxNWNiOGU3NDUzOGM2YjA0MWU2MgotLS0g
L2Rldi9udWxsCisrKyBiL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtc29ydGVk
LWJlZm9yZS1kaXNwYXRjaC1leHBlY3RlZC50eHQKQEAgLTAsMCArMSwyMiBAQAorVGVzdHMgdGhh
dCBhbGwgZXZlbnRzIGV2ZW50cyBhcmUgdHJpZ2dlcmVkIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIu
CisKK0VWRU5UKGNhbnBsYXl0aHJvdWdoKQorRVhQRUNURUQgKHRlc3RUcmFjay50cmFjay5jdWVz
Lmxlbmd0aCA9PSAnNycpIE9LCitSVU4odmlkZW8ucGxheSgpKQorRVZFTlQoZW5kZWQpCitDdWUg
ZXZlbnQ6IGVudGVyIGlkOiAxIHRpbWU6IDUuMQorQ3VlIGV2ZW50OiBlbnRlciBpZDogMyB0aW1l
OiA1LjEKK0N1ZSBldmVudDogZW50ZXIgaWQ6IDIgdGltZTogNS4xCitDdWUgZXZlbnQ6IGVudGVy
IGlkOiA0IHRpbWU6IDUuMQorQ3VlIGV2ZW50OiBleGl0IGlkOiAyIHRpbWU6IDUuMTAxCitDdWUg
ZXZlbnQ6IGV4aXQgaWQ6IDQgdGltZTogNS4xMDEKK0N1ZSBldmVudDogZW50ZXIgaWQ6IDUgdGlt
ZTogNS4zCitDdWUgZXZlbnQ6IGV4aXQgaWQ6IDMgdGltZTogNS4zMDEKK0N1ZSBldmVudDogZXhp
dCBpZDogMSB0aW1lOiA1LjgKK0N1ZSBldmVudDogZXhpdCBpZDogNSB0aW1lOiA1LjgKK0N1ZSBl
dmVudDogZW50ZXIgaWQ6IDYgdGltZTogNS45OQorQ3VlIGV2ZW50OiBleGl0IGlkOiA2IHRpbWU6
IDUuOTkzCitDdWUgZXZlbnQ6IGV4aXQgaWQ6IDcgdGltZTogNS45OTMKK0N1ZSBldmVudDogZW50
ZXIgaWQ6IDcgdGltZTogNS45OTQKK0VORCBPRiBURVNUCisKZGlmZiAtLWdpdCBhL0xheW91dFRl
c3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtc29ydGVkLWJlZm9yZS1kaXNwYXRjaC5odG1sIGIv
TGF5b3V0VGVzdHMvbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1zb3J0ZWQtYmVmb3JlLWRpc3BhdGNo
Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uYzM4NGM0ZWUxMjc3NTU2MTY4MmNkOTA3MTc3MmJlZmM1NjBjY2Ni
ZAotLS0gL2Rldi9udWxsCisrKyBiL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMt
c29ydGVkLWJlZm9yZS1kaXNwYXRjaC5odG1sCkBAIC0wLDAgKzEsODYgQEAKKzwhRE9DVFlQRSBo
dG1sPgorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRl
bnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorCisgICAgICAg
IDxzY3JpcHQgc3JjPS4uL21lZGlhLWZpbGUuanM+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQg
c3JjPS4uL3ZpZGVvLXRlc3QuanM+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQ+CisgICAgICAg
ICAgICB2YXIgdmlkZW9DYW5QbGF5VGhyb3VnaCA9IGZhbHNlOworICAgICAgICAgICAgdmFyIHRy
YWNrTG9hZGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIHZhciBjdXJyZW50Q3VlOworICAgICAg
ICAgICAgdmFyIHRlc3RUcmFjazsKKworICAgICAgICAgICAgdmFyIGRpc3BhdGNoZWRFdmVudHMg
PSBbXTsKKworICAgICAgICAgICAgZnVuY3Rpb24gcnVuVGVzdHMoKQorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIGlmICghdHJhY2tMb2FkZWQgfHwgIXZpZGVvQ2FuUGxheVRocm91Z2gp
CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgIHRlc3RUcmFj
ayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0VHJhY2siKTsKKyAgICAgICAgICAgICAg
ICB0ZXN0RXhwZWN0ZWQoInRlc3RUcmFjay50cmFjay5jdWVzLmxlbmd0aCIsIDcpOworCisgICAg
ICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXN0VHJhY2sudHJhY2suY3Vlcy5sZW5n
dGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICB0ZXN0VHJhY2sudHJhY2suY3Vlc1tpXS5h
ZGRFdmVudExpc3RlbmVyKCdlbnRlcicsIGN1ZUVudGVyZWRPckV4aXRlZCk7CisgICAgICAgICAg
ICAgICAgICAgIHRlc3RUcmFjay50cmFjay5jdWVzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2V4aXQn
LCBjdWVFbnRlcmVkT3JFeGl0ZWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgIHJ1bigidmlkZW8ucGxheSgpIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZ1
bmN0aW9uIGN1ZUVudGVyZWRPckV4aXRlZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAg
ICAgY3VycmVudEN1ZSA9IGV2ZW50LnRhcmdldDsKKworICAgICAgICAgICAgICAgIHZhciBldmVu
dE9iaiA9IHt9OworCisgICAgICAgICAgICAgICAgZXZlbnRPYmoudGltZSA9IGN1cnJlbnRDdWUu
c3RhcnRUaW1lOworICAgICAgICAgICAgICAgIGlmIChldmVudC50eXBlID09ICdleGl0JykKKyAg
ICAgICAgICAgICAgICAgICAgZXZlbnRPYmoudGltZSA9IGN1cnJlbnRDdWUuZW5kVGltZTsKKwor
ICAgICAgICAgICAgICAgIGV2ZW50T2JqLnR5cGUgPSBldmVudC50eXBlOworICAgICAgICAgICAg
ICAgIGV2ZW50T2JqLmN1ZSA9IGN1cnJlbnRDdWU7CisKKyAgICAgICAgICAgICAgICBkaXNwYXRj
aGVkRXZlbnRzLnB1c2goZXZlbnRPYmopOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3
YWl0Rm9yRXZlbnQoJ2VuZGVkJywgZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgZm9yICh2
YXIgaSA9IDA7IGkgPCBkaXNwYXRjaGVkRXZlbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAg
ICAgICAgICAgIGNvbnNvbGVXcml0ZSgiQ3VlIGV2ZW50OiAiICsgZGlzcGF0Y2hlZEV2ZW50c1tp
XS50eXBlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaWQ6ICIgKyBkaXNw
YXRjaGVkRXZlbnRzW2ldLmN1ZS5pZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAiIHRpbWU6ICIgKyBkaXNwYXRjaGVkRXZlbnRzW2ldLnRpbWUpOworICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgIGVuZFRlc3QoKTsKKyAgICAgICAgICAgIH0pOworCisgICAg
ICAgICAgICB3YWl0Rm9yRXZlbnQoJ2NhbnBsYXl0aHJvdWdoJywgZnVuY3Rpb24oKSB7CisgICAg
ICAgICAgICAgICAgdmlkZW8uY3VycmVudFRpbWUgPSA1LjAwOworICAgICAgICAgICAgICAgIHZp
ZGVvQ2FuUGxheVRocm91Z2ggPSB0cnVlOworCisgICAgICAgICAgICAgICAgcnVuVGVzdHMoKTsK
KyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBmdW5jdGlvbiBsb2FkZWQoKQorICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNrTG9hZGVkID0gdHJ1ZTsKKworICAgICAgICAg
ICAgICAgIHJ1blRlc3RzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZ1bmN0aW9u
IGJvZHlMb2FkZWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbmRNZWRpYUVs
ZW1lbnQoKTsKKyAgICAgICAgICAgICAgICB2aWRlby5zcmMgPSBmaW5kTWVkaWFGaWxlKCJ2aWRl
byIsICIuLi9jb250ZW50L3Rlc3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9zY3JpcHQ+
CisgICAgPC9oZWFkPgorICAgIDxib2R5IG9ubG9hZD0iYm9keUxvYWRlZCgpIj4KKyAgICAgICAg
PHA+VGVzdHMgdGhhdCBhbGwgZXZlbnRzIGV2ZW50cyBhcmUgdHJpZ2dlcmVkIGluIGNocm9ub2xv
Z2ljYWwgb3JkZXIuPC9wPgorICAgICAgICA8dmlkZW8gY29udHJvbHM+CisgICAgICAgICAgICA8
dHJhY2sgaWQ9InRlc3RUcmFjayIgc3JjPSJjYXB0aW9ucy13ZWJ2dHQvc29ydGVkLWRpc3BhdGNo
LnZ0dCIgb25sb2FkPSJsb2FkZWQoKSIgZGVmYXVsdD4KKyAgICAgICAgPC92aWRlbz4KKyAgICA8
L2JvZHk+Cis8L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126850</attachid>
            <date>2012-02-13 15:39:45 -0800</date>
            <delta_ts>2012-02-17 10:40:57 -0800</delta_ts>
            <desc>Updated patch and tests</desc>
            <filename>bug-72171-20120214013943.patch</filename>
            <type>text/plain</type>
            <size>46384</size>
            <attacher name="Victor Carbune">vcarbune</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3NjEzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggY2NhODA3ODg3ZGMyYjg5
NmI3YjI0YTQ2MjQ3NDdjOGI2OGY4ZDU1Yy4uMmFkMGE0MmE2ZTJlMThmNzMzZjAxNDJhMGJkZWFi
ODhiZjgyNTMzZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDgzIEBACisyMDEyLTAyLTEzICBWaWN0
b3IgQ2FyYnVuZSAgPHZpY3RvckByb3NlZHUub3JnPgorCisgICAgICAgIEFkZGVkIGNvZGUgdG8g
c3VwcG9ydCBkaXNwYXRjaGluZyBvZiBtaXNzZWQgY3VlcyBpbiBjYXNlIG9mIG5vcm1hbCBwbGF5
YmFjaworICAgICAgICBhbmQgZXZlbnQgc29ydGluZyBpbiBjYXNlIG9mIHNpbXVsdGFuZW91cyBl
dmVudCB0cmlnZ2VyaW5nLgorCisgICAgICAgIDx0cmFjaz4tcmVsYXRlZCBldmVudHMgY3VlY2hh
bmdlLCBlbnRlciwgYW5kIGV4aXQgc2hvdWxkIGJlIHNvcnRlZCBhbmQgZmlsdGVyZWQgYmVmb3Jl
IGRpc3BhdGNoaW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD03MjE3MQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFRlc3RzOiBtZWRpYS90cmFjay90cmFjay1jdWVzLW1pc3NlZC5odG1sCisgICAgICAgICAg
ICAgICBtZWRpYS90cmFjay90cmFjay1jdWVzLXNvcnRlZC1iZWZvcmUtZGlzcGF0Y2guaHRtbAor
CisgICAgICAgICogaHRtbC9IVE1MTWVkaWFFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkhUTUxNZWRpYUVsZW1lbnQ6OkhUTUxNZWRpYUVsZW1lbnQpOiBBZGRlZCBpbml0aWFsaXphdGlv
biBjb2RlCisgICAgICAgIGZvciBuZXdseSBhZGRlZCBzdGF0ZSB2YXJpYWJsZXMuCisgICAgICAg
IChXZWJDb3JlOjp0cmFja0luZGV4Q29tcGFyZSk6IFN0YXRpYyBib29sZWFuIGNvbXBhcmUgZnVu
Y3Rpb24gYmV0d2VlbgorICAgICAgICB0aGUgaW5kZXggb2YgdHdvIHRyYWNrcy4KKyAgICAgICAg
KFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6ZXZlbnRUaW1lQ3VlQ29tcGFyZSk6IFN0YXRp
YyBib29sZWFuIGNvbXBhcmUgZnVuY3Rpb24gYmV0d2VlbgorICAgICAgICBldmVudHMgYXNzb2Np
YXRlZCB3aXRoIHRleHQgdHJhY2sgY3Vlcy4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxNZWRpYUVs
ZW1lbnQ6OnVwZGF0ZUFjdGl2ZVRleHRUcmFja0N1ZXMpOiBBZGRlZCBjb2RlIHRvCisgICAgICAg
IHNvcnQgdGhlIGV2ZW50cyBhc3NvY2lhdGVkIHdpdGggdGV4dCB0cmFjayBjdWVzIGJlZm9yZSBk
aXNwYXRjaGluZy4KKyAgICAgICAgRWFjaCBzdGVwIGZyb20gdGhlIHNwZWNpZmljYXRpb24gaXMg
Y29tbWVudGVkIHdpdGhpbiB0aGUgY29kZS4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxNZWRpYUVs
ZW1lbnQ6OmZpbmlzaFNlZWspOiBBZGRlZCBhIGJvb2xlYW4gdmFyaWFibGUgdGhhdAorICAgICAg
ICBpcyBuZWVkZWQgd2l0aGluIHRoZSB0ZXh0IHRyYWNrIHVwZGF0ZSBmdW5jdGlvbiwgdG8ga25v
dyB3aGV0aGVyIGEgc2VlaworICAgICAgICBldmVudCBoYXMgb2NjdXJlZCBiZWZvcmUgb3Igbm90
LgorICAgICAgICAoV2ViQ29yZTo6SFRNTE1lZGlhRWxlbWVudDo6bWVkaWFQbGF5ZXJUaW1lQ2hh
bmdlZCk6IE1vdmVkIHRoZSB1cGRhdGUKKyAgICAgICAgY2FsbCBmb3IgdGV4dCB0cmFja3MgYXQg
dGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgZW5kLgorICAgICAg
ICAnZW5kZWQnIGV2ZW50cyBmb3IgdmlkZW8gc2hvdWxkIGJlIGRpc3BhdGNoZWQgYWZ0ZXIgdHJh
Y2sgc3BlY2lmaWMgZXZlbnRzLgorICAgICAgICAqIGh0bWwvSFRNTE1lZGlhRWxlbWVudC5oOiBB
ZGRlZCB2YXJpYWJsZXMgdG8ga2VlcAorICAgICAgICBzdGF0ZSBpbmZvcm1hdGlvbiByZXF1aXJl
ZCBieSB0aGUgdGV4dCB0cmFjayB1cGRhdGUgYWxnb3JpdGhtIChsYXN0IHRpbWUKKyAgICAgICAg
dGhlIGFsZ29yaXRobSB3YXMgcnVuLCBhbmQgd2hldGhlciBhIHNlZWtpbmcgZXZlbnQgaGFzIG9j
Y3VyZWQpCisgICAgICAgIChIVE1MTWVkaWFFbGVtZW50KToKKworICAgICAgICAqIGh0bWwvTG9h
ZGFibGVUZXh0VHJhY2suY3BwOiBSZW1vdmUgdGhlIGdlbmVyYWwgZmlyZUN1ZUNoYW5nZS4KKyAg
ICAgICAgKFdlYkNvcmU6OkxvYWRhYmxlVGV4dFRyYWNrOjpmaXJlVHJhY2tFbGVtZW50Q3VlQ2hh
bmdlRXZlbnQpOiBBZGRlZAorICAgICAgICBzeW5jaHJvbm91cyBjdWUgY2hhbmdlIGV2ZW50IGZv
ciB0aGUgdHJhY2sgZWxlbWVudC4KKyAgICAgICAgKiBodG1sL0xvYWRhYmxlVGV4dFRyYWNrLmg6
CisgICAgICAgIChMb2FkYWJsZVRleHRUcmFjayk6CisgICAgICAgICogaHRtbC9UZXh0VHJhY2su
Y3BwOiBSZW1vdmVkIGZpcmVDdWVDaGFuZ2UgbWV0aG9kLgorICAgICAgICAoV2ViQ29yZTo6VGV4
dFRyYWNrOjpUZXh0VHJhY2spOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFRyYWNrOjp0cmFja0lu
ZGV4KTogQ2FjaGVkIHRoZSB0cmFjayBpbmRleC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAg
ICAoV2ViQ29yZTo6VGV4dFRyYWNrOjppbnZhbGlkYXRlVHJhY2tJbmRleCk6IEludmFsaWRhdGVz
IHRoZSB0cmFjay4gVXNlZAorICAgICAgICB3aGVuIGEgbmV3IHRyYWNrIGlzIGFkZGVkIGluIGEg
VGV4dFRyYWNrTGlzdCBpbnN0YW5jZS4KKyAgICAgICAgKiBodG1sL1RleHRUcmFjay5oOgorICAg
ICAgICAoVGV4dFRyYWNrKToKKyAgICAgICAgKiBodG1sL1RleHRUcmFja0N1ZS5jcHA6IEFkZGVk
IGludGVybmFsIHZhcmlhYmxlcyB0byBrZWVwIHRoZSBjdXJyZW50IGluZGV4CisgICAgICAgIHBv
c2l0aW9uIGluIHRoZSB0cmFjayBjdWUgb3JkZXIuIFRoaXMgaXMgaW52YWxpZGF0ZWQgd2hlbiBh
biBlbGVtZW50IGlzCisgICAgICAgIGluc2VydGVkIGJlZm9yZS4KKyAgICAgICAgKFdlYkNvcmU6
OlRleHRUcmFja0N1ZTo6VGV4dFRyYWNrQ3VlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRUcmFj
a0N1ZTo6Y3VlSW5kZXgpOiBHZXR0ZXIgZm9yIHRoZSBjdWVJbmRleC4KKyAgICAgICAgKFdlYkNv
cmUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFRyYWNrQ3VlOjppbnZhbGlkYXRlQ3VlSW5kZXgp
OiBJbnZhbGlkYXRlcyB0aGUgY3VycmVudGx5IHN0b3JlZAorICAgICAgICBjdWUgaW5kZXguCisg
ICAgICAgIChXZWJDb3JlOjpUZXh0VHJhY2tDdWU6OmRpc3BhdGNoRXZlbnQpOiBFdmVudCBkaXNw
YXRjaGluZyBpcyBkb25lIGFzeW5jaHJvbm91c2x5CisgICAgICAgIG5vdy4gVGhpcyBzaG91bGQg
YmUgdGhlIG9ubHkgbWV0aG9kIHVzZWQgZm9yIGV2ZW50IGRpc3BhdGNoaW5nLgorICAgICAgICAo
V2ViQ29yZTo6VGV4dFRyYWNrQ3VlOjpzZXRJc0FjdGl2ZSk6IFRoZSBzZXRJc0FjdGl2ZSBtZXRo
b2Qgbm8gbG9uZ2VyIGRpc3BhdGNoZXMKKyAgICAgICAgZXZlbnRzLCBidXQgcmF0aGVyIGp1c3Qg
Y2hhbmdlcyB0aGUgbV9pc0FjdGl2ZSB2YXJpYWJsZS4KKyAgICAgICAgKiBodG1sL1RleHRUcmFj
a0N1ZS5oOgorICAgICAgICAoVGV4dFRyYWNrQ3VlKToKKworICAgICAgICAqIGh0bWwvVGV4dFRy
YWNrQ3VlTGlzdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpUZXh0VHJhY2tDdWVMaXN0OjpnZXRD
dWVJbmRleCk6IFJldHJpZXZlcyB0aGUgY3VlIGluZGV4LCBpbiB0aGUgdHJhY2sgY3VlCisgICAg
ICAgIG9yZGVyLCBvZiBhIGdpdmVuIGN1ZS4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAo
V2ViQ29yZTo6VGV4dFRyYWNrQ3VlTGlzdDo6YWRkKTogTW9kaWZpZWQgdGhlIGFkZCBtZXRob2Qg
c3VjaCB0aGF0IGFsbCB0aGUgbmV4dCBjdWUKKyAgICAgICAgaW5kZXhlcyBhcmUgaW52YWxpZGF0
ZWQuCisgICAgICAgIChXZWJDb3JlOjpUZXh0VHJhY2tDdWVMaXN0OjppbnZhbGlkYXRlQ3VlSW5k
ZXhlcyk6IEludmFsaWRhdGVzIGFsbCBjdWUgaW5kZXhlcyBzdGFydGluZworICAgICAgICB3aXRo
IGEgc3BlY2lmaWMgcG9zaXRpb24uCisgICAgICAgICogaHRtbC9UZXh0VHJhY2tDdWVMaXN0Lmg6
CisgICAgICAgIChUZXh0VHJhY2tDdWVMaXN0KToKKyAgICAgICAgKiBodG1sL3RyYWNrL1RleHRU
cmFja0xpc3QuY3BwOgorICAgICAgICAoVGV4dFRyYWNrTGlzdDo6Z2V0VHJhY2tJbmRleCk6IFJl
dHJpZXZlcyB0aGUgdHJhY2sgaW5kZXggcG9zaXRpb24uCisgICAgICAgIChUZXh0VHJhY2tMaXN0
OjphcHBlbmQpOiBBZGRlZCBtZXRob2QgZm9yIGludmFsaWRhdGluZyB0aGUgdGV4dCB0cmFjayBp
bmRleCBpbiBjYXNlIG9mCisgICAgICAgIGNoYW5naW5nIHRoZSBsaXN0IGNvbnRlbnRzLgorICAg
ICAgICAqIGh0bWwvdHJhY2svVGV4dFRyYWNrTGlzdC5oOgorICAgICAgICAoVGV4dFRyYWNrTGlz
dCk6CisKIDIwMTItMDItMTMgIEFiaGlzaGVrIEFyeWEgIDxpbmZlcm5vQGNocm9taXVtLm9yZz4K
IAogICAgICAgICBJbmNvcnJlY3QgY2hpbGRyZW4gcGxhY2VtZW50IGluIG11bHRpLWNvbHVtbiBs
YXlvdXQuCkBAIC03NjUsNiArODQ1LDcgQEAKICAgICAgICAgKFdlYkNvcmU6OkhUTUxDb250ZW50
U2VsZWN0b3I6Omhhc0NhbmRpZGF0ZXMpOgogICAgICAgICAqIHRlc3RpbmcvSW50ZXJuYWxzLmNw
cDoKICAgICAgICAgKFdlYkNvcmU6OkludGVybmFsczo6aW5jbHVkZXJGb3IpOgorPj4+Pj4+PiBt
YXN0ZXIKIAogMjAxMi0wMi0xMyAgTm8nYW0gUm9zZW50aGFsICA8bm9hbS5yb3NlbnRoYWxAbm9r
aWEuY29tPgogCkBAIC04OTc3LDYgKzkwNTgsNyBAQAogICAgICAgICAoV2ViQ29yZTo6Q0NUaHJl
YWRQcm94eTo6c2V0TmVlZHNSZWRyYXcpOgogICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL2NjL0NDVGhyZWFkUHJveHkuaDoKICAgICAgICAgKENDVGhyZWFkUHJveHkpOgorPj4+
Pj4+PiBtYXN0ZXIKIAogMjAxMi0wMi0wNyAgU2hlcmlmZiBCb3QgIDx3ZWJraXQucmV2aWV3LmJv
dEBnbWFpbC5jb20+CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTE1lZGlh
RWxlbWVudC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxNZWRpYUVsZW1lbnQuY3BwCmlu
ZGV4IGU1ZmZjMDg1NjJlYzQyNTkwNDVlMTlhYmIwOWQ0ODVmMjI3NzIyMGIuLjk0MWJjNWIwNmVj
MzBjNTM5ZTdjYjNjNThkZGVkOWUyZDIwMjgxNGMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L2h0bWwvSFRNTE1lZGlhRWxlbWVudC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC9IVE1M
TWVkaWFFbGVtZW50LmNwcApAQCAtNzYsNiArNzYsNyBAQAogI2luY2x1ZGUgPGxpbWl0cz4KICNp
bmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KICNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgor
I2luY2x1ZGUgPHd0Zi9Ob25Db3B5aW5nU29ydC5oPgogI2luY2x1ZGUgPHd0Zi9VaW50OEFycmF5
Lmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCkBAIC0yMzUsNiArMjM2LDggQEAg
SFRNTE1lZGlhRWxlbWVudDo6SFRNTE1lZGlhRWxlbWVudChjb25zdCBRdWFsaWZpZWROYW1lJiB0
YWdOYW1lLCBEb2N1bWVudCogZG9jdW0KICNpZiBFTkFCTEUoVklERU9fVFJBQ0spCiAgICAgLCBt
X3RyYWNrc0FyZVJlYWR5KHRydWUpCiAgICAgLCBtX2hhdmVWaXNpYmxlVGV4dFRyYWNrKGZhbHNl
KQorICAgICwgbV9zZWVrZWRTaW5jZUxhc3RUZXh0VHJhY2tVcGRhdGUoZmFsc2UpCisgICAgLCBt
X2xhc3RUZXh0VHJhY2tVcGRhdGVUaW1lKC0xKQogICAgICwgbV90ZXh0VHJhY2tzKDApCiAgICAg
LCBtX2lnbm9yZVRyYWNrRGlzcGxheVVwZGF0ZSgwKQogI2VuZGlmCkBAIC05MzcsMzMgKzk0MCwy
MTggQEAgdm9pZCBIVE1MTWVkaWFFbGVtZW50Ojpsb2FkUmVzb3VyY2UoY29uc3QgS1VSTCYgaW5p
dGlhbFVSTCwgQ29udGVudFR5cGUmIGNvbnRlbnQKIH0KIAogI2lmIEVOQUJMRShWSURFT19UUkFD
SykKK3N0YXRpYyBib29sIHRyYWNrSW5kZXhDb21wYXJlKFRleHRUcmFjayogYSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFRleHRUcmFjayogYikKK3sKKyAgICByZXR1cm4gYS0+dHJh
Y2tJbmRleCgpIC0gYi0+dHJhY2tJbmRleCgpIDwgMDsKK30KKworc3RhdGljIGJvb2wgZXZlbnRU
aW1lQ3VlQ29tcGFyZShjb25zdCBzdGQ6OnBhaXI8ZG91YmxlLCBUZXh0VHJhY2tDdWUqPiYgYSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPGRvdWJsZSwg
VGV4dFRyYWNrQ3VlKj4mIGIpCit7CisgICAgLy8gMTIgLSBTb3J0IHRoZSB0YXNrcyBpbiBldmVu
dHMgaW4gYXNjZW5kaW5nIHRpbWUgb3JkZXIgKHRhc2tzIHdpdGggZWFybGllcgorICAgIC8vIHRp
bWVzIGZpcnN0KS4KKyAgICBpZiAoYS5maXJzdCAhPSBiLmZpcnN0KQorICAgICAgICByZXR1cm4g
YS5maXJzdCAtIGIuZmlyc3QgPCAwOworCisgICAgLy8gSWYgdGhlIGN1ZXMgYmVsb25nIHRvIGRp
ZmZlcmVudCB0ZXh0IHRyYWNrcywgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvCisgICAgLy8gY29t
cGFyZSB0aGUgdHdvIHRyYWNrcyBieSB0aGUgcmVsYXRpdmUgY3VlIG9yZGVyLCBzbyByZXR1cm4g
dGhlIHJlbGF0aXZlCisgICAgLy8gdHJhY2sgb3JkZXIuCisgICAgaWYgKGEuc2Vjb25kLT50cmFj
aygpICE9IGIuc2Vjb25kLT50cmFjaygpKQorICAgICAgICByZXR1cm4gdHJhY2tJbmRleENvbXBh
cmUoYS5zZWNvbmQtPnRyYWNrKCksIGIuc2Vjb25kLT50cmFjaygpKTsKKworICAgIC8vIDEyIC0g
RnVydGhlciBzb3J0IHRhc2tzIGluIGV2ZW50cyB0aGF0IGhhdmUgdGhlIHNhbWUgdGltZSBieSB0
aGUKKyAgICAvLyByZWxhdGl2ZSB0ZXh0IHRyYWNrIGN1ZSBvcmRlciBvZiB0aGUgdGV4dCB0cmFj
ayBjdWVzIGFzc29jaWF0ZWQKKyAgICAvLyB3aXRoIHRoZXNlIHRhc2tzLgorICAgIHJldHVybiBh
LnNlY29uZC0+Y3VlSW5kZXgoKSAtIGIuc2Vjb25kLT5jdWVJbmRleCgpIDwgMDsKK30KKworCiB2
b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OnVwZGF0ZUFjdGl2ZVRleHRUcmFja0N1ZXMoZmxvYXQgbW92
aWVUaW1lKQogeworICAgIExPRyhNZWRpYSwgIkhUTUxNZWRpYUVsZW1lbnQ6OnVwZGF0ZUFjdGl2
ZVRleHRUcmFja3MiKTsKKwogICAgIGlmIChpZ25vcmVUcmFja0Rpc3BsYXlVcGRhdGVSZXF1ZXN0
cygpKQogICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgQ3VlTGlzdCBwcmV2aW91c2x5QWN0aXZl
Q3VlcyA9IG1fY3VycmVudGx5QWN0aXZlQ3VlczsKLSAgICBib29sIGFjdGl2ZVNldENoYW5nZWQg
PSBmYWxzZTsKIAotICAgIG1fY3VycmVudGx5QWN0aXZlQ3VlcyA9IG1fY3VlVHJlZS5hbGxPdmVy
bGFwcyhtX2N1ZVRyZWUuY3JlYXRlSW50ZXJ2YWwobW92aWVUaW1lLCBtb3ZpZVRpbWUpKTsKLSAg
ICAKLSAgICAvLyBGSVhNRSg3MjE3MSk6IEV2ZW50cyBuZWVkIHRvIGJlIHNvcnRlZCBhbmQgZmls
dGVyZWQgYmVmb3JlIGRpc3BhdGNoaW5nLgorICAgIC8vIDQuOC4xMC44IFBsYXlpbmcgdGhlIG1l
ZGlhIHJlc291cmNlCiAKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByZXZpb3VzbHlBY3Rp
dmVDdWVzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmICghbV9jdXJyZW50bHlBY3RpdmVDdWVz
LmNvbnRhaW5zKHByZXZpb3VzbHlBY3RpdmVDdWVzW2ldKSkgewotICAgICAgICAgICAgcHJldmlv
dXNseUFjdGl2ZUN1ZXNbaV0uZGF0YSgpLT5zZXRJc0FjdGl2ZShmYWxzZSk7Ci0gICAgICAgICAg
ICBhY3RpdmVTZXRDaGFuZ2VkID0gdHJ1ZTsKKyAgICAvLyAxIC0gTGV0IGN1cnJlbnQgY3VlcyBi
ZSBhIGxpc3Qgb2YgY3VlcywgaW5pdGlhbGl6ZWQgdG8gY29udGFpbiBhbGwgdGhlCisgICAgLy8g
Y3VlcyBvZiBhbGwgdGhlIGhpZGRlbiwgc2hvd2luZywgb3Igc2hvd2luZyBieSBkZWZhdWx0IHRl
eHQgdHJhY2tzIG9mIHRoZQorICAgIC8vIG1lZGlhIGVsZW1lbnQgKG5vdCB0aGUgZGlzYWJsZWQg
b25lcykgd2hvc2Ugc3RhcnQgdGltZXMgYXJlIGxlc3MgdGhhbiBvcgorICAgIC8vIGVxdWFsIHRv
IHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGFuZCB3aG9zZSBlbmQgdGltZXMgYXJlIGdy
ZWF0ZXIKKyAgICAvLyB0aGFuIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uLgorICAgIFZl
Y3RvcjxDdWVJbnRlcnZhbFRyZWU6OkludGVydmFsVHlwZT4gY3VycmVudEN1ZXM7CisgICAgY3Vy
cmVudEN1ZXMgPSBtX2N1ZVRyZWUuYWxsT3ZlcmxhcHMobV9jdWVUcmVlLmNyZWF0ZUludGVydmFs
KG1vdmllVGltZSwgbW92aWVUaW1lKSk7CisKKyAgICBWZWN0b3I8Q3VlSW50ZXJ2YWxUcmVlOjpJ
bnRlcnZhbFR5cGU+IGFmZmVjdGVkQ3VlczsKKyAgICBWZWN0b3I8Q3VlSW50ZXJ2YWxUcmVlOjpJ
bnRlcnZhbFR5cGU+IHByZXZpb3VzQ3VlczsKKyAgICBWZWN0b3I8Q3VlSW50ZXJ2YWxUcmVlOjpJ
bnRlcnZhbFR5cGU+IG1pc3NlZEN1ZXM7CisKKyAgICAvLyAyIC0gTGV0IG90aGVyIGN1ZXMgYmUg
YSBsaXN0IG9mIGN1ZXMsIGluaXRpYWxpemVkIHRvIGNvbnRhaW4gYWxsIHRoZSBjdWVzCisgICAg
Ly8gb2YgaGlkZGVuLCBzaG93aW5nLCBhbmQgc2hvd2luZyBieSBkZWZhdWx0IHRleHQgdHJhY2tz
IG9mIHRoZSBtZWRpYQorICAgIC8vIGVsZW1lbnQgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gY3Vy
cmVudCBjdWVzLgorICAgIHByZXZpb3VzQ3VlcyA9IG1fY3VycmVudGx5QWN0aXZlQ3VlczsKKwor
ICAgIC8vIDMgLSBMZXQgbGFzdCB0aW1lIGJlIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9u
IGF0IHRoZSB0aW1lIHRoaXMKKyAgICAvLyBhbGdvcml0aG0gd2FzIGxhc3QgcnVuIGZvciB0aGlz
IG1lZGlhIGVsZW1lbnQsIGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdAorICAgIC8vIHRpbWUgaXQg
aGFzIHJ1bi4KKyAgICBmbG9hdCBsYXN0VGltZSA9IG1fbGFzdFRleHRUcmFja1VwZGF0ZVRpbWU7
CisKKyAgICAvLyA0IC0gSWYgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gaGFzLCBzaW5j
ZSB0aGUgbGFzdCB0aW1lIHRoaXMKKyAgICAvLyBhbGdvcml0aG0gd2FzIHJ1biwgb25seSBjaGFu
Z2VkIHRocm91Z2ggaXRzIHVzdWFsIG1vbm90b25pYyBpbmNyZWFzZQorICAgIC8vIGR1cmluZyBu
b3JtYWwgcGxheWJhY2ssIHRoZW4gbGV0IG1pc3NlZCBjdWVzIGJlIHRoZSBsaXN0IG9mIGN1ZXMg
aW4gb3RoZXIKKyAgICAvLyBjdWVzIHdob3NlIHN0YXJ0IHRpbWVzIGFyZSBncmVhdGVyIHRoYW4g
b3IgZXF1YWwgdG8gbGFzdCB0aW1lIGFuZCB3aG9zZQorICAgIC8vIGVuZCB0aW1lcyBhcmUgbGVz
cyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uLgorICAgIC8v
IE90aGVyd2lzZSwgbGV0IG1pc3NlZCBjdWVzIGJlIGFuIGVtcHR5IGxpc3QuCisgICAgaWYgKGxh
c3RUaW1lID49IDAgJiYgIW1fc2Vla2VkU2luY2VMYXN0VGV4dFRyYWNrVXBkYXRlKSB7CisgICAg
ICAgIFZlY3RvcjxDdWVJbnRlcnZhbFRyZWU6OkludGVydmFsVHlwZT4gcG90ZW50aWFsbHlTa2lw
cGVkQ3VlcyA9CisgICAgICAgICAgICBtX2N1ZVRyZWUuYWxsT3ZlcmxhcHMobV9jdWVUcmVlLmNy
ZWF0ZUludGVydmFsKGxhc3RUaW1lLCBtb3ZpZVRpbWUpKTsKKworICAgICAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHBvdGVudGlhbGx5U2tpcHBlZEN1ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgICAgIGZsb2F0IGN1ZVN0YXJ0VGltZSA9IHBvdGVudGlhbGx5U2tpcHBlZEN1ZXNbaV0ubG93
KCk7CisgICAgICAgICAgICBmbG9hdCBjdWVFbmRUaW1lID0gcG90ZW50aWFsbHlTa2lwcGVkQ3Vl
c1tpXS5oaWdoKCk7CisKKyAgICAgICAgICAgIGlmIChjdWVTdGFydFRpbWUgPiBsYXN0VGltZSAm
JiBjdWVFbmRUaW1lIDwgbW92aWVUaW1lKQorICAgICAgICAgICAgICAgIG1pc3NlZEN1ZXMuYXBw
ZW5kKHBvdGVudGlhbGx5U2tpcHBlZEN1ZXNbaV0pOwogICAgICAgICB9CiAgICAgfQotICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9jdXJyZW50bHlBY3RpdmVDdWVzLnNpemUoKTsgKytpKSB7
Ci0gICAgICAgIGlmICghcHJldmlvdXNseUFjdGl2ZUN1ZXMuY29udGFpbnMobV9jdXJyZW50bHlB
Y3RpdmVDdWVzW2ldKSkgewotICAgICAgICAgICAgbV9jdXJyZW50bHlBY3RpdmVDdWVzW2ldLmRh
dGEoKS0+c2V0SXNBY3RpdmUodHJ1ZSk7CisKKyAgICBtX2xhc3RUZXh0VHJhY2tVcGRhdGVUaW1l
ID0gbW92aWVUaW1lOworCisgICAgLy8gNSAtIElmIHRoZSB0aW1lIHdhcyByZWFjaGVkIHRocm91
Z2ggdGhlIHVzdWFsIG1vbm90b25pYyBpbmNyZWFzZSBvZiB0aGUKKyAgICAvLyBjdXJyZW50IHBs
YXliYWNrIHBvc2l0aW9uIGR1cmluZyBub3JtYWwgcGxheWJhY2ssIGFuZCBpZiB0aGUgdXNlciBh
Z2VudAorICAgIC8vIGhhcyBub3QgZmlyZWQgYSB0aW1ldXBkYXRlIGV2ZW50IGF0IHRoZSBlbGVt
ZW50IGluIHRoZSBwYXN0IDE1IHRvIDI1MG1zCisgICAgLy8gYW5kIGlzIG5vdCBzdGlsbCBydW5u
aW5nIGV2ZW50IGhhbmRsZXJzIGZvciBzdWNoIGFuIGV2ZW50LCB0aGVuIHRoZSB1c2VyCisgICAg
Ly8gYWdlbnQgbXVzdCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhIHNpbXBsZSBldmVudCBuYW1lZCB0
aW1ldXBkYXRlIGF0IHRoZQorICAgIC8vIGVsZW1lbnQuIChJbiB0aGUgb3RoZXIgY2FzZXMsIHN1
Y2ggYXMgZXhwbGljaXQgc2Vla3MsIHJlbGV2YW50IGV2ZW50cyBnZXQKKyAgICAvLyBmaXJlZCBh
cyBwYXJ0IG9mIHRoZSBvdmVyYWxsIHByb2Nlc3Mgb2YgY2hhbmdpbmcgdGhlIGN1cnJlbnQgcGxh
eWJhY2sKKyAgICAvLyBwb3NpdGlvbi4pCisgICAgaWYgKCFtX3NlZWtlZFNpbmNlTGFzdFRleHRU
cmFja1VwZGF0ZSkKKyAgICAgICAgc2NoZWR1bGVUaW1ldXBkYXRlRXZlbnQoZmFsc2UpOworCisg
ICAgbV9zZWVrZWRTaW5jZUxhc3RUZXh0VHJhY2tVcGRhdGUgPSBmYWxzZTsKKworICAgIC8vIDYg
LSBJZiBhbGwgb2YgdGhlIGN1ZXMgaW4gY3VycmVudCBjdWVzIGhhdmUgdGhlaXIgdGV4dCB0cmFj
ayBjdWUgYWN0aXZlCisgICAgLy8gZmxhZyBzZXQsIG5vbmUgb2YgdGhlIGN1ZXMgaW4gb3RoZXIg
Y3VlcyBoYXZlIHRoZWlyIHRleHQgdHJhY2sgY3VlIGFjdGl2ZQorICAgIC8vIGZsYWcgc2V0LCBh
bmQgbWlzc2VkIGN1ZXMgaXMgZW1wdHksIHRoZW4gYWJvcnQgdGhlc2Ugc3RlcHMuCisgICAgYm9v
bCBhY3RpdmVTZXRDaGFuZ2VkID0gbWlzc2VkQ3Vlcy5zaXplKCk7CisKKyAgICBzaXplX3QgcHJl
dmlvdXNDdWVzU2l6ZSA9IHByZXZpb3VzQ3Vlcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9
IDA7ICFhY3RpdmVTZXRDaGFuZ2VkICYmIGkgPCBwcmV2aW91c0N1ZXNTaXplOyArK2kpCisgICAg
ICAgIGlmICghY3VycmVudEN1ZXMuY29udGFpbnMocHJldmlvdXNDdWVzW2ldKSAmJiBwcmV2aW91
c0N1ZXNbaV0uZGF0YSgpLT5pc0FjdGl2ZSgpKQorICAgICAgICAgICAgYWN0aXZlU2V0Q2hhbmdl
ZCA9IHRydWU7CisKKyAgICBzaXplX3QgY3VycmVudEN1ZXNTaXplID0gY3VycmVudEN1ZXMuc2l6
ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyAhYWN0aXZlU2V0Q2hhbmdlZCAmJiBpIDwgY3Vy
cmVudEN1ZXNTaXplOyArK2kpIHsKKyAgICAgICAgaWYgKCFjdXJyZW50Q3Vlc1tpXS5kYXRhKCkt
PmlzQWN0aXZlKCkpCiAgICAgICAgICAgICBhY3RpdmVTZXRDaGFuZ2VkID0gdHJ1ZTsKKyAgICB9
CisKKyAgICBpZiAoIWFjdGl2ZVNldENoYW5nZWQpCisgICAgICAgIHJldHVybjsKKworICAgIC8v
IEZJWE1FKDcyMTczKTogNyAtIElmIHRoZSB0aW1lIHdhcyByZWFjaGVkIHRocm91Z2ggdGhlIHVz
dWFsIG1vbm90b25pYworICAgIC8vIGluY3JlYXNlIG9mIHRoZSBjdXJyZW50IHBsYXliYWNrIHBv
c2l0aW9uIGR1cmluZyBub3JtYWwgcGxheWJhY2ssIGFuZAorICAgIC8vIHRoZXJlIGFyZSBjdWVz
IGluIG90aGVyIGN1ZXMgdGhhdCBoYXZlIHRoZWlyIHRleHQgdHJhY2sgY3VlIHBhdXNlLW9uLWV4
aXQKKyAgICAvLyBmbGFnIHNldCBhbmQgdGhhdCBlaXRoZXIgaGF2ZSB0aGVpciB0ZXh0IHRyYWNr
IGN1ZSBhY3RpdmUgZmxhZyBzZXQgb3IgYXJlCisgICAgLy8gYWxzbyBpbiBtaXNzZWQgY3Vlcywg
dGhlbiBpbW1lZGlhdGVseSBwYXVzZSB0aGUgbWVkaWEgZWxlbWVudC4KKworICAgIC8vIDggLSBM
ZXQgZXZlbnRzIGJlIGEgbGlzdCBvZiB0YXNrcywgaW5pdGlhbGx5IGVtcHR5LiBFYWNoIHRhc2sg
aW4gdGhpcworICAgIC8vIGxpc3Qgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggYSB0ZXh0IHRyYWNr
LCBhIHRleHQgdHJhY2sgY3VlLCBhbmQgYSB0aW1lLAorICAgIC8vIHdoaWNoIGFyZSB1c2VkIHRv
IHNvcnQgdGhlIGxpc3QgYmVmb3JlIHRoZSB0YXNrcyBhcmUgcXVldWVkLgorICAgIFZlY3Rvcjxz
dGQ6OnBhaXI8ZG91YmxlLCBUZXh0VHJhY2tDdWUqPiA+IGV2ZW50VGFza3M7CisKKyAgICAvLyA4
IC0gTGV0IGFmZmVjdGVkIHRyYWNrcyBiZSBhIGxpc3Qgb2YgdGV4dCB0cmFja3MsIGluaXRpYWxs
eSBlbXB0eS4KKyAgICBWZWN0b3I8VGV4dFRyYWNrKj4gYWZmZWN0ZWRUcmFja3M7CisKKyAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IG1pc3NlZEN1ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAg
Ly8gOSAtIEZvciBlYWNoIHRleHQgdHJhY2sgY3VlIGluIG1pc3NlZCBjdWVzLCBwcmVwYXJlIGFu
IGV2ZW50IG5hbWVkIGVudGVyCisgICAgICAgIC8vIGZvciB0aGUgVGV4dFRyYWNrQ3VlIG9iamVj
dCB3aXRoIHRoZSB0ZXh0IHRyYWNrIGN1ZSBzdGFydCB0aW1lLgorICAgICAgICBldmVudFRhc2tz
LmFwcGVuZChzdGQ6Om1ha2VfcGFpcihtaXNzZWRDdWVzW2ldLmRhdGEoKS0+c3RhcnRUaW1lKCks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NlZEN1ZXNbaV0u
ZGF0YSgpKSk7CisKKyAgICAgICAgLy8gMTAgLSBGb3IgZWFjaCB0ZXh0IHRyYWNrIGluIG1pc3Nl
ZCBjdWVzLCBwcmVwYXJlIGFuIGV2ZW50CisgICAgICAgIC8vIG5hbWVkIGV4aXQgZm9yIHRoZSBU
ZXh0VHJhY2tDdWUgb2JqZWN0IHdpdGggdGhlIHRleHQgdHJhY2sgY3VlIGVuZAorICAgICAgICAv
LyB0aW1lLgorICAgICAgICBldmVudFRhc2tzLmFwcGVuZChzdGQ6Om1ha2VfcGFpcihtaXNzZWRD
dWVzW2ldLmRhdGEoKS0+ZW5kVGltZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBtaXNzZWRDdWVzW2ldLmRhdGEoKSkpOworICAgIH0KKworICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgcHJldmlvdXNDdWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgIC8vIDEw
IC0gRm9yIGVhY2ggdGV4dCB0cmFjayBjdWUgaW4gb3RoZXIgY3VlcyB0aGF0IGhhcyBpdHMgdGV4
dAorICAgICAgICAvLyB0cmFjayBjdWUgYWN0aXZlIGZsYWcgc2V0IHByZXBhcmUgYW4gZXZlbnQg
bmFtZWQgZXhpdCBmb3IgdGhlCisgICAgICAgIC8vIFRleHRUcmFja0N1ZSBvYmplY3Qgd2l0aCB0
aGUgdGV4dCB0cmFjayBjdWUgZW5kIHRpbWUuCisgICAgICAgIGlmICghY3VycmVudEN1ZXMuY29u
dGFpbnMocHJldmlvdXNDdWVzW2ldKSkKKyAgICAgICAgICAgIGV2ZW50VGFza3MuYXBwZW5kKHN0
ZDo6bWFrZV9wYWlyKHByZXZpb3VzQ3Vlc1tpXS5kYXRhKCktPmVuZFRpbWUoKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQ3Vlc1tpXS5kYXRh
KCkpKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGN1cnJlbnRDdWVzLnNp
emUoKTsgKytpKSB7CisgICAgICAgIC8vIDExIC0gRm9yIGVhY2ggdGV4dCB0cmFjayBjdWUgaW4g
Y3VycmVudCBjdWVzIHRoYXQgZG9lcyBub3QgaGF2ZSBpdHMKKyAgICAgICAgLy8gdGV4dCB0cmFj
ayBjdWUgYWN0aXZlIGZsYWcgc2V0LCBwcmVwYXJlIGFuIGV2ZW50IG5hbWVkIGVudGVyIGZvciB0
aGUKKyAgICAgICAgLy8gVGV4dFRyYWNrQ3VlIG9iamVjdCB3aXRoIHRoZSB0ZXh0IHRyYWNrIGN1
ZSBzdGFydCB0aW1lLgorICAgICAgICBpZiAoIXByZXZpb3VzQ3Vlcy5jb250YWlucyhjdXJyZW50
Q3Vlc1tpXSkpCisgICAgICAgICAgICBldmVudFRhc2tzLmFwcGVuZChzdGQ6Om1ha2VfcGFpcihj
dXJyZW50Q3Vlc1tpXS5kYXRhKCktPnN0YXJ0VGltZSgpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEN1ZXNbaV0uZGF0YSgpKSk7CisgICAgfQor
CisgICAgLy8gMTIgLSBTb3J0IHRoZSB0YXNrcyBpbiBldmVudHMgaW4gYXNjZW5kaW5nIHRpbWUg
b3JkZXIgKHRhc2tzIHdpdGggZWFybGllcgorICAgIC8vIHRpbWVzIGZpcnN0KS4KKyAgICBub25D
b3B5aW5nU29ydChldmVudFRhc2tzLmJlZ2luKCksIGV2ZW50VGFza3MuZW5kKCksIGV2ZW50VGlt
ZUN1ZUNvbXBhcmUpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBldmVudFRhc2tzLnNp
emUoKTsgKytpKSB7CisgICAgICAgIGlmICghYWZmZWN0ZWRUcmFja3MuY29udGFpbnMoZXZlbnRU
YXNrc1tpXS5zZWNvbmQtPnRyYWNrKCkpKQorICAgICAgICAgICAgYWZmZWN0ZWRUcmFja3MuYXBw
ZW5kKGV2ZW50VGFza3NbaV0uc2Vjb25kLT50cmFjaygpKTsKKworICAgICAgICAvLyAxMyAtIFF1
ZXVlIGVhY2ggdGFzayBpbiBldmVudHMsIGluIGxpc3Qgb3JkZXIuCisgICAgICAgIFJlZlB0cjxF
dmVudD4gZXZlbnQ7CisKKyAgICAgICAgLy8gRWFjaCBldmVudCBpbiBldmVudFRhc2tzIG1heSBi
ZSBlaXRoZXIgYW4gZW50ZXJFdmVudCBvciBhbiBleGl0RXZlbnQsCisgICAgICAgIC8vIGRlcGVu
ZGluZyBvbiB0aGUgdGltZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQuIFRoaXMK
KyAgICAgICAgLy8gY29ycmVjdGx5IGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgdGhlIGV2ZW50LCBz
aW5jZSB0aGUgc3RhcnRUaW1lIGlzCisgICAgICAgIC8vIGFsd2F5cyBsZXNzIHRoYW4gdGhlIGVu
ZFRpbWUuCisgICAgICAgIGlmIChldmVudFRhc2tzW2ldLmZpcnN0ID09IGV2ZW50VGFza3NbaV0u
c2Vjb25kLT5zdGFydFRpbWUoKSkKKyAgICAgICAgICAgIGV2ZW50ID0gRXZlbnQ6OmNyZWF0ZShl
dmVudE5hbWVzKCkuZW50ZXJFdmVudCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgZXZlbnQgPSBFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS5leGl0RXZlbnQsIGZh
bHNlLCBmYWxzZSk7CisKKyAgICAgICAgZXZlbnQtPnNldFRhcmdldChldmVudFRhc2tzW2ldLnNl
Y29uZCk7CisgICAgICAgIG1fYXN5bmNFdmVudFF1ZXVlLmVucXVldWVFdmVudChldmVudC5yZWxl
YXNlKCkpOworICAgIH0KKworICAgIC8vIDE0IC0gU29ydCBhZmZlY3RlZCB0cmFja3MgaW4gdGhl
IHNhbWUgb3JkZXIgYXMgdGhlIHRleHQgdHJhY2tzIGFwcGVhciBpbgorICAgIC8vIHRoZSBtZWRp
YSBlbGVtZW50J3MgbGlzdCBvZiB0ZXh0IHRyYWNrcywgYW5kIHJlbW92ZSBkdXBsaWNhdGVzLgor
ICAgIG5vbkNvcHlpbmdTb3J0KGFmZmVjdGVkVHJhY2tzLmJlZ2luKCksIGFmZmVjdGVkVHJhY2tz
LmVuZCgpLCB0cmFja0luZGV4Q29tcGFyZSk7CisKKyAgICAvLyAxNSAtIEZvciBlYWNoIHRleHQg
dHJhY2sgaW4gYWZmZWN0ZWQgdHJhY2tzLCBpbiB0aGUgbGlzdCBvcmRlciwgcXVldWUgYQorICAg
IC8vIHRhc2sgdG8gZmlyZSBhIHNpbXBsZSBldmVudCBuYW1lZCBjdWVjaGFuZ2UgYXQgdGhlIFRl
eHRUcmFjayBvYmplY3QsIGFuZCwKKyAgICAvLyBpZiB0aGUgdGV4dCB0cmFjayBoYXMgYSBjb3Jy
ZXNwb25kaW5nIHRyYWNrIGVsZW1lbnQsIHRvIHRoZW4gZmlyZSBhCisgICAgLy8gc2ltcGxlIGV2
ZW50IG5hbWVkIGN1ZWNoYW5nZSBhdCB0aGUgdHJhY2sgZWxlbWVudCBhcyB3ZWxsLgorICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgYWZmZWN0ZWRUcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgUmVmUHRyPEV2ZW50PiBldmVudCA9IEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLmN1ZWNo
YW5nZUV2ZW50LCBmYWxzZSwgZmFsc2UpOworICAgICAgICBldmVudC0+c2V0VGFyZ2V0KGFmZmVj
dGVkVHJhY2tzW2ldKTsKKworICAgICAgICBtX2FzeW5jRXZlbnRRdWV1ZS5lbnF1ZXVlRXZlbnQo
ZXZlbnQucmVsZWFzZSgpKTsKKworICAgICAgICAvLyBGaXJlIHN5bmNyb25vdXMgY3VlIGNoYW5n
ZSBldmVudCBmb3IgdHJhY2sgZWxlbWVudHMuCisgICAgICAgIGlmIChhZmZlY3RlZFRyYWNrc1tp
XS0+dHJhY2tUeXBlKCkgPT0gVGV4dFRyYWNrOjpUcmFja0VsZW1lbnQpIHsKKyAgICAgICAgICAg
IHN0YXRpY19jYXN0PExvYWRhYmxlVGV4dFRyYWNrKj4oYWZmZWN0ZWRUcmFja3NbaV0pLT5maXJl
VHJhY2tFbGVtZW50Q3VlQ2hhbmdlRXZlbnQoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKLSAg
ICAvLyBGSVhNRSg3MjE3Myk6IFBhdXNlIHRoZSBtZWRpYSBlbGVtZW50IGZvciBjdWVzIGdvaW5n
IHBhc3QgdGhlaXIgZW5kVGltZQotICAgIC8vIGR1cmluZyBhIG1vbm90b25pYyB0aW1lIGluY3Jl
YXNlLgorCisgICAgLy8gMTYgLSBTZXQgdGhlIHRleHQgdHJhY2sgY3VlIGFjdGl2ZSBmbGFnIG9m
IGFsbCB0aGUgY3VlcyBpbiB0aGUgY3VycmVudAorICAgIC8vIGN1ZXMsIGFuZCB1bnNldCB0aGUg
dGV4dCB0cmFjayBjdWUgYWN0aXZlIGZsYWcgb2YgYWxsIHRoZSBjdWVzIGluIHRoZQorICAgIC8v
IG90aGVyIGN1ZXMuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjdXJyZW50Q3Vlcy5zaXpl
KCk7ICsraSkKKyAgICAgICAgY3VycmVudEN1ZXNbaV0uZGF0YSgpLT5zZXRJc0FjdGl2ZSh0cnVl
KTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJldmlvdXNDdWVzLnNpemUoKTsgKytp
KQorICAgICAgICBpZiAoIWN1cnJlbnRDdWVzLmNvbnRhaW5zKHByZXZpb3VzQ3Vlc1tpXSkpCisg
ICAgICAgICAgICBwcmV2aW91c0N1ZXNbaV0uZGF0YSgpLT5zZXRJc0FjdGl2ZShmYWxzZSk7CisK
KyAgICAvLyBVcGRhdGUgdGhlIGN1cnJlbnQgYWN0aXZlIGN1ZXMuCisgICAgbV9jdXJyZW50bHlB
Y3RpdmVDdWVzID0gY3VycmVudEN1ZXM7CiAKICAgICBpZiAoYWN0aXZlU2V0Q2hhbmdlZCAmJiBo
YXNNZWRpYUNvbnRyb2xzKCkpCiAgICAgICAgIG1lZGlhQ29udHJvbHMoKS0+dXBkYXRlVGV4dFRy
YWNrRGlzcGxheSgpOwpAQCAtMTU5OSw2ICsxNzg3LDEwIEBAIHZvaWQgSFRNTE1lZGlhRWxlbWVu
dDo6ZmluaXNoU2VlaygpCiB7CiAgICAgTE9HKE1lZGlhLCAiSFRNTE1lZGlhRWxlbWVudDo6Zmlu
aXNoU2VlayIpOwogCisjaWYgRU5BQkxFKFZJREVPX1RSQUNLKQorICAgIG1fc2Vla2VkU2luY2VM
YXN0VGV4dFRyYWNrVXBkYXRlID0gdHJ1ZTsKKyNlbmRpZgorCiAgICAgLy8gNC44LjEwLjkgU2Vl
a2luZyBzdGVwIDE0CiAgICAgbV9zZWVraW5nID0gZmFsc2U7CiAKQEAgLTI2ODAsNiArMjg3Miwx
MCBAQCB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6Om1lZGlhUGxheWVyVGltZUNoYW5nZWQoTWVkaWFQ
bGF5ZXIqKQogewogICAgIExPRyhNZWRpYSwgIkhUTUxNZWRpYUVsZW1lbnQ6Om1lZGlhUGxheWVy
VGltZUNoYW5nZWQiKTsKIAorI2lmIEVOQUJMRShWSURFT19UUkFDSykKKyAgICB1cGRhdGVBY3Rp
dmVUZXh0VHJhY2tDdWVzKGN1cnJlbnRUaW1lKCkpOworI2VuZGlmCisKICAgICBiZWdpblByb2Nl
c3NpbmdNZWRpYVBsYXllckNhbGxiYWNrKCk7CiAKICAgICBpbnZhbGlkYXRlQ2FjaGVkVGltZSgp
OwpAQCAtMjcyOCw5ICsyOTI0LDYgQEAgdm9pZCBIVE1MTWVkaWFFbGVtZW50OjptZWRpYVBsYXll
clRpbWVDaGFuZ2VkKE1lZGlhUGxheWVyKikKICAgICAgICAgbV9zZW50RW5kRXZlbnQgPSBmYWxz
ZTsKIAogICAgIHVwZGF0ZVBsYXlTdGF0ZSgpOwotI2lmIEVOQUJMRShWSURFT19UUkFDSykKLSAg
ICB1cGRhdGVBY3RpdmVUZXh0VHJhY2tDdWVzKG5vdyk7Ci0jZW5kaWYKICAgICBlbmRQcm9jZXNz
aW5nTWVkaWFQbGF5ZXJDYWxsYmFjaygpOwogfQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9odG1sL0hUTUxNZWRpYUVsZW1lbnQuaCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTE1lZGlh
RWxlbWVudC5oCmluZGV4IDc2YzI0Y2JhYjdmMGZjYzZjMjhmYTgyMGIzODdkN2JjMWFmZjA3ODAu
LjAyZTZmYmFhZmZjNjYyNWYzMzEwNTZlODJmNmZjYjMwODI5MWFmZDYgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL2h0bWwvSFRNTE1lZGlhRWxlbWVudC5oCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L2h0bWwvSFRNTE1lZGlhRWxlbWVudC5oCkBAIC01OTUsMTAgKzU5NSwxNCBAQCBwcml2YXRlOgog
I2lmIEVOQUJMRShWSURFT19UUkFDSykKICAgICBib29sIG1fdHJhY2tzQXJlUmVhZHkgOiAxOwog
ICAgIGJvb2wgbV9oYXZlVmlzaWJsZVRleHRUcmFjayA6IDE7CisgICAgYm9vbCBtX3NlZWtlZFNp
bmNlTGFzdFRleHRUcmFja1VwZGF0ZSA6IDE7CisgICAgZmxvYXQgbV9sYXN0VGV4dFRyYWNrVXBk
YXRlVGltZTsKIAogICAgIFJlZlB0cjxUZXh0VHJhY2tMaXN0PiBtX3RleHRUcmFja3M7CiAgICAg
VmVjdG9yPFJlZlB0cjxUZXh0VHJhY2s+ID4gbV90ZXh0VHJhY2tzV2hlblJlc291cmNlU2VsZWN0
aW9uQmVnYW47CisKICAgICBDdWVJbnRlcnZhbFRyZWUgbV9jdWVUcmVlOworCiAgICAgQ3VlTGlz
dCBtX2N1cnJlbnRseUFjdGl2ZUN1ZXM7CiAgICAgaW50IG1faWdub3JlVHJhY2tEaXNwbGF5VXBk
YXRlOwogI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL0xvYWRhYmxlVGV4
dFRyYWNrLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvTG9hZGFibGVUZXh0VHJhY2suY3BwCmlu
ZGV4IGI0OGQ4YzdjYjJiYTY1MmU3ODE1N2E0ODA0OTNhZjVjMzM4YWUxOWIuLmNmMTA5MjBiZDE0
MDRlZjNhMWRmMTYyOTJmYmViNmQ5NWNhMGQ4ZjUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L2h0bWwvTG9hZGFibGVUZXh0VHJhY2suY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvTG9h
ZGFibGVUZXh0VHJhY2suY3BwCkBAIC0xMjMsMTEgKzEyMywxMiBAQCB2b2lkIExvYWRhYmxlVGV4
dFRyYWNrOjpjdWVMb2FkaW5nQ29tcGxldGVkKFRleHRUcmFja0xvYWRlciogbG9hZGVyLCBib29s
IGxvYWRpbgogICAgIG1fdHJhY2tFbGVtZW50LT5kaWRDb21wbGV0ZUxvYWQodGhpcywgbG9hZGlu
Z0ZhaWxlZCA/IEhUTUxUcmFja0VsZW1lbnQ6OkZhaWx1cmUgOiBIVE1MVHJhY2tFbGVtZW50OjpT
dWNjZXNzKTsKIH0KIAotdm9pZCBMb2FkYWJsZVRleHRUcmFjazo6ZmlyZUN1ZUNoYW5nZUV2ZW50
KCkKK2Jvb2wgTG9hZGFibGVUZXh0VHJhY2s6OmZpcmVUcmFja0VsZW1lbnRDdWVDaGFuZ2VFdmVu
dCgpCiB7Ci0gICAgVGV4dFRyYWNrOjpmaXJlQ3VlQ2hhbmdlRXZlbnQoKTsKKyAgICBSZWZQdHI8
RXZlbnQ+IGV2ZW50ID0gRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkuY3VlY2hhbmdlRXZlbnQs
IGZhbHNlLCBmYWxzZSk7CiAgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgbV90cmFja0Vs
ZW1lbnQtPmRpc3BhdGNoRXZlbnQoRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkuY3VlY2hhbmdl
RXZlbnQsIGZhbHNlLCBmYWxzZSksIGVjKTsKKworICAgIHJldHVybiBtX3RyYWNrRWxlbWVudC0+
ZGlzcGF0Y2hFdmVudChldmVudCwgZWMpOwogfQogCiBzaXplX3QgTG9hZGFibGVUZXh0VHJhY2s6
OnRyYWNrRWxlbWVudEluZGV4KCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvTG9h
ZGFibGVUZXh0VHJhY2suaCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvTG9hZGFibGVUZXh0VHJhY2su
aAppbmRleCBiNzAxMjI1MzY4MzIzZGU3Zjg5ZmFlYjEyMzdhNDk4MTlmYTk5ZGY1Li5mZTBiZTAz
N2QzZDBmZTYwZDE0ODlkMDdiNjNiNGQ3M2UzMTE1NjQ4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9odG1sL0xvYWRhYmxlVGV4dFRyYWNrLmgKKysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC9M
b2FkYWJsZVRleHRUcmFjay5oCkBAIC01NywxMCArNTcsMTIgQEAgcHVibGljOgogICAgIHZvaWQg
c2NoZWR1bGVMb2FkKGNvbnN0IEtVUkwmKTsKIAogICAgIHZpcnR1YWwgdm9pZCBjbGVhckNsaWVu
dCgpOwotICAgIAorCiAgICAgc2l6ZV90IHRyYWNrRWxlbWVudEluZGV4KCk7CiAgICAgSFRNTFRy
YWNrRWxlbWVudCogdHJhY2tFbGVtZW50KCkgeyByZXR1cm4gbV90cmFja0VsZW1lbnQ7IH0KIAor
ICAgIGJvb2wgZmlyZVRyYWNrRWxlbWVudEN1ZUNoYW5nZUV2ZW50KCk7CisKIHByaXZhdGU6CiAg
ICAgLy8gVGV4dFRyYWNrTG9hZGVyQ2xpZW50CiAgICAgdmlydHVhbCBib29sIHNob3VsZExvYWRD
dWVzKFRleHRUcmFja0xvYWRlciopIHsgcmV0dXJuIHRydWU7IH0KQEAgLTcxLDggKzczLDYgQEAg
cHJpdmF0ZToKICAgICBMb2FkYWJsZVRleHRUcmFjayhIVE1MVHJhY2tFbGVtZW50KiwgY29uc3Qg
U3RyaW5nJiBraW5kLCBjb25zdCBTdHJpbmcmIGxhYmVsLCBjb25zdCBTdHJpbmcmIGxhbmd1YWdl
LCBib29sIGlzRGVmYXVsdCk7CiAKICAgICB2b2lkIGxvYWRUaW1lckZpcmVkKFRpbWVyPExvYWRh
YmxlVGV4dFRyYWNrPiopOwotICAgIAotICAgIHZpcnR1YWwgdm9pZCBmaXJlQ3VlQ2hhbmdlRXZl
bnQoKTsKIAogICAgIEhUTUxUcmFja0VsZW1lbnQqIG1fdHJhY2tFbGVtZW50OwogICAgIFRpbWVy
PExvYWRhYmxlVGV4dFRyYWNrPiBtX2xvYWRUaW1lcjsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL2h0bWwvVGV4dFRyYWNrLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrLmNw
cAppbmRleCBiZGZiYWEyMDU3MzZjNmQzN2U4OWI4NjZhYzg4OWJiMWE4NTA4M2M1Li5iMGFkNGI2
NjAzYmRiOTVlYzJkMTJlNTdhZTA2YzJmYzM4YTQ3NmUzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9odG1sL1RleHRUcmFjay5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJh
Y2suY3BwCkBAIC0zNyw3ICszNyw5IEBACiAKICNpbmNsdWRlICJFdmVudC5oIgogI2luY2x1ZGUg
IkV4Y2VwdGlvbkNvZGUuaCIKKyNpbmNsdWRlICJIVE1MTWVkaWFFbGVtZW50LmgiCiAjaW5jbHVk
ZSAiVGV4dFRyYWNrQ3VlTGlzdC5oIgorI2luY2x1ZGUgIlRleHRUcmFja0xpc3QuaCIKICNpbmNs
dWRlICJUcmFja0Jhc2UuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewpAQCAtODIsNiArODQsNyBA
QCBUZXh0VHJhY2s6OlRleHRUcmFjayhTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBjb250ZXh0LCBU
ZXh0VHJhY2tDbGllbnQqIGNsaWVudCwgYwogICAgICwgbV90cmFja1R5cGUodHlwZSkKICAgICAs
IG1fcmVhZGluZXNzU3RhdGUoTm90TG9hZGVkKQogICAgICwgbV9zaG93aW5nQnlEZWZhdWx0KGZh
bHNlKQorICAgICwgbV90cmFja0luZGV4KC0xKQogewogICAgIHNldEtpbmQoa2luZCk7CiB9CkBA
IC0yNDYsMTIgKzI0OSw2IEBAIHZvaWQgVGV4dFRyYWNrOjpyZW1vdmVDdWUoVGV4dFRyYWNrQ3Vl
KiBjdWUsIEV4Y2VwdGlvbkNvZGUmIGVjKQogICAgICAgICBtX2NsaWVudC0+dGV4dFRyYWNrUmVt
b3ZlQ3VlKHRoaXMsIGN1ZSk7CiB9CiAKLXZvaWQgVGV4dFRyYWNrOjpmaXJlQ3VlQ2hhbmdlRXZl
bnQoKQotewotICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIGRpc3BhdGNoRXZlbnQoRXZl
bnQ6OmNyZWF0ZShldmVudE5hbWVzKCkuY3VlY2hhbmdlRXZlbnQsIGZhbHNlLCBmYWxzZSksIGVj
KTsKLX0KLSAgICAKIHZvaWQgVGV4dFRyYWNrOjpjdWVXaWxsQ2hhbmdlKFRleHRUcmFja0N1ZSog
Y3VlKQogewogICAgIGlmICghbV9jbGllbnQpCkBAIC0yNzEsNiArMjY4LDIxIEBAIHZvaWQgVGV4
dFRyYWNrOjpjdWVEaWRDaGFuZ2UoVGV4dFRyYWNrQ3VlKiBjdWUpCiAgICAgbV9jbGllbnQtPnRl
eHRUcmFja0FkZEN1ZSh0aGlzLCBjdWUpOwogfQogCitpbnQgVGV4dFRyYWNrOjp0cmFja0luZGV4
KCkKK3sKKyAgICBBU1NFUlQobV9tZWRpYUVsZW1lbnQpOworCisgICAgaWYgKG1fdHJhY2tJbmRl
eCA9PSAtMSkKKyAgICAgICAgbV90cmFja0luZGV4ID0gbV9tZWRpYUVsZW1lbnQtPnRleHRUcmFj
a3MoKS0+Z2V0VHJhY2tJbmRleCh0aGlzKTsKKworICAgIHJldHVybiBtX3RyYWNrSW5kZXg7Cit9
CisKK3ZvaWQgVGV4dFRyYWNrOjppbnZhbGlkYXRlVHJhY2tJbmRleCgpCit7CisgICAgbV90cmFj
a0luZGV4ID0gLTE7Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFjay5oIGIvU291cmNlL1dlYkNvcmUv
aHRtbC9UZXh0VHJhY2suaAppbmRleCBmNmVjZWM4NDg3ZjkzMWQzOWRhNTg2OWJhNjdjMDA0N2Q0
MDY5M2M0Li4yNDYwNzRkYjM3MzdkZjI4MTkzZGQ5Y2JmOGNlM2Y4ZWE3NWMxOWQ3IDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFjay5oCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L2h0bWwvVGV4dFRyYWNrLmgKQEAgLTEwMSwxMyArMTAxLDE1IEBAIHB1YmxpYzoKIAogICAgIHZv
aWQgY3VlV2lsbENoYW5nZShUZXh0VHJhY2tDdWUqKTsKICAgICB2b2lkIGN1ZURpZENoYW5nZShU
ZXh0VHJhY2tDdWUqKTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgZmlyZUN1ZUNoYW5nZUV2ZW50
KCk7CisKICAgICBERUZJTkVfQVRUUklCVVRFX0VWRU5UX0xJU1RFTkVSKGN1ZWNoYW5nZSk7CiAK
ICAgICBlbnVtIFRleHRUcmFja1R5cGUgeyBUcmFja0VsZW1lbnQsIEFkZFRyYWNrLCBJbkJhbmQg
fTsKICAgICBUZXh0VHJhY2tUeXBlIHRyYWNrVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHJhY2tU
eXBlOyB9CiAKKyAgICBpbnQgdHJhY2tJbmRleCgpOworICAgIHZvaWQgaW52YWxpZGF0ZVRyYWNr
SW5kZXgoKTsKKwogcHJvdGVjdGVkOgogICAgIFRleHRUcmFjayhTY3JpcHRFeGVjdXRpb25Db250
ZXh0KiwgVGV4dFRyYWNrQ2xpZW50KiwgY29uc3QgU3RyaW5nJiBraW5kLCBjb25zdCBTdHJpbmcm
IGxhYmVsLCBjb25zdCBTdHJpbmcmIGxhbmd1YWdlLCBUZXh0VHJhY2tUeXBlKTsKIApAQCAtMTIz
LDYgKzEyNSw3IEBAIHByaXZhdGU6CiAgICAgVGV4dFRyYWNrVHlwZSBtX3RyYWNrVHlwZTsKICAg
ICBSZWFkaW5lc3NTdGF0ZSBtX3JlYWRpbmVzc1N0YXRlOwogICAgIGJvb2wgbV9zaG93aW5nQnlE
ZWZhdWx0OworICAgIGludCBtX3RyYWNrSW5kZXg7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFja0N1ZS5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFja0N1ZS5jcHAKaW5kZXggZTFjMDEyNjZlNzY2YmM1
YzA5YjA4OTk2ZjU5NmJkYzc4YWY5ZWU0Yi4uOTFkOWQyODQzNzc1ZWRhY2E3OWY2NTFhNDQ2N2Mw
NTM5YzVhOTE4OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2tDdWUu
Y3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlLmNwcApAQCAtMzgsNiAr
MzgsNyBAQAogI2luY2x1ZGUgIkV2ZW50LmgiCiAjaW5jbHVkZSAiRG9jdW1lbnRGcmFnbWVudC5o
IgogI2luY2x1ZGUgIlRleHRUcmFjay5oIgorI2luY2x1ZGUgIlRleHRUcmFja0N1ZUxpc3QuaCIK
ICNpbmNsdWRlICJXZWJWVFRQYXJzZXIuaCIKICNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdCdWls
ZGVyLmg+CiAKQEAgLTg3LDYgKzg4LDcgQEAgVGV4dFRyYWNrQ3VlOjpUZXh0VHJhY2tDdWUoU2Ny
aXB0RXhlY3V0aW9uQ29udGV4dCogY29udGV4dCwgY29uc3QgU3RyaW5nJiBpZCwgZG8KICAgICAs
IG1fbGluZVBvc2l0aW9uKC0xKQogICAgICwgbV90ZXh0UG9zaXRpb24oNTApCiAgICAgLCBtX2N1
ZVNpemUoMTAwKQorICAgICwgbV9jdWVJbmRleCgtMSkKICAgICAsIG1fY3VlQWxpZ25tZW50KE1p
ZGRsZSkKICAgICAsIG1fc2NyaXB0RXhlY3V0aW9uQ29udGV4dChjb250ZXh0KQogICAgICwgbV9p
c0FjdGl2ZShmYWxzZSkKQEAgLTMyNCw2ICszMjYsMTkgQEAgdm9pZCBUZXh0VHJhY2tDdWU6OnNl
dFRleHQoY29uc3QgU3RyaW5nJiB0ZXh0KQogICAgIGN1ZURpZENoYW5nZSgpOwogfQogCitpbnQg
VGV4dFRyYWNrQ3VlOjpjdWVJbmRleCgpCit7CisgICAgaWYgKG1fY3VlSW5kZXggPT0gLTEpCisg
ICAgICAgIG1fY3VlSW5kZXggPSB0cmFjaygpLT5jdWVzKCktPmdldEN1ZUluZGV4KHRoaXMpOwor
CisgICAgcmV0dXJuIG1fY3VlSW5kZXg7Cit9CisKK3ZvaWQgVGV4dFRyYWNrQ3VlOjppbnZhbGlk
YXRlQ3VlSW5kZXgoKQoreworICAgIG1fY3VlSW5kZXggPSAtMTsKK30KKwogUGFzc1JlZlB0cjxE
b2N1bWVudEZyYWdtZW50PiBUZXh0VHJhY2tDdWU6OmdldEN1ZUFzSFRNTCgpCiB7CiAgICAgaWYg
KCFtX2RvY3VtZW50RnJhZ21lbnQpCkBAIC0zMzcsNiArMzUyLDIwIEBAIHZvaWQgVGV4dFRyYWNr
Q3VlOjpzZXRDdWVIVE1MKFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnQpCiAg
ICAgbV9kb2N1bWVudEZyYWdtZW50ID0gZnJhZ21lbnQ7CiB9CiAKK2Jvb2wgVGV4dFRyYWNrQ3Vl
OjpkaXNwYXRjaEV2ZW50KFBhc3NSZWZQdHI8RXZlbnQ+IGV2ZW50KQoreworICAgIC8vIFdoZW4g
YSBUZXh0VHJhY2sncyBtb2RlIGlzIGRpc2FibGVkOiBubyBjdWVzIGFyZSBhY3RpdmUsIG5vIGV2
ZW50cyBmaXJlZC4KKyAgICBpZiAoIXRyYWNrKCkgfHwgdHJhY2soKS0+bW9kZSgpID09IFRleHRU
cmFjazo6RElTQUJMRUQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBFdmVu
dFRhcmdldDo6ZGlzcGF0Y2hFdmVudChldmVudCk7Cit9CisKK2Jvb2wgVGV4dFRyYWNrQ3VlOjpk
aXNwYXRjaEV2ZW50KFBhc3NSZWZQdHI8RXZlbnQ+IGV2ZW50LCBFeGNlcHRpb25Db2RlICZlYykK
K3sKKyAgICByZXR1cm4gRXZlbnRUYXJnZXQ6OmRpc3BhdGNoRXZlbnQoZXZlbnQsIGVjKTsKK30K
KwogYm9vbCBUZXh0VHJhY2tDdWU6OmlzQWN0aXZlKCkKIHsKICAgICByZXR1cm4gbV9pc0FjdGl2
ZSAmJiB0cmFjaygpICYmIHRyYWNrKCktPm1vZGUoKSAhPSBUZXh0VHJhY2s6OkRJU0FCTEVEOwpA
QCAtMzQ1LDE5ICszNzQsNiBAQCBib29sIFRleHRUcmFja0N1ZTo6aXNBY3RpdmUoKQogdm9pZCBU
ZXh0VHJhY2tDdWU6OnNldElzQWN0aXZlKGJvb2wgYWN0aXZlKQogewogICAgIG1faXNBY3RpdmUg
PSBhY3RpdmU7Ci0KLSAgICAvLyBXaGVuIGEgVGV4dFRyYWNrJ3MgbW9kZSBpcyBkaXNhYmxlZDog
Tm8gY3VlcyBhcmUgYWN0aXZlLCBubyBldmVudHMgYXJlIGZpcmVkIC4uLgotICAgIGlmICghdHJh
Y2soKSB8fCB0cmFjaygpLT5tb2RlKCkgPT0gVGV4dFRyYWNrOjpESVNBQkxFRCkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgaWYgKGFjdGl2ZSkKLSAg
ICAgICAgZGlzcGF0Y2hFdmVudChFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS5lbnRlckV2ZW50
LCBmYWxzZSwgZmFsc2UpLCBlYyk7Ci0gICAgZWxzZQotICAgICAgICBkaXNwYXRjaEV2ZW50KEV2
ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLmV4aXRFdmVudCwgZmFsc2UsIGZhbHNlKSwgZWMpOwot
Ci0gICAgaWYgKG1fdHJhY2spCi0gICAgICAgIG1fdHJhY2stPmZpcmVDdWVDaGFuZ2VFdmVudCgp
OwogfQogCiB2b2lkIFRleHRUcmFja0N1ZTo6cGFyc2VTZXR0aW5ncyhjb25zdCBTdHJpbmcmIGlu
cHV0KQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2tDdWUuaCBiL1Nv
dXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlLmgKaW5kZXggMTZmYWY2M2NhZmE2ZmMwYzU0
ZjMxMDhmMjdjY2ZjYzQ1YzM5ODhjNC4uMTM2OTk4NzA5NWI0YzZmNjU5NDBjYTdlNDJhYmExNWM4
YTgzOTVmMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2tDdWUuaAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFja0N1ZS5oCkBAIC05MiwxMiArOTIsMTgg
QEAgcHVibGljOgogICAgIGNvbnN0IFN0cmluZyYgdGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fY29u
dGVudDsgfQogICAgIHZvaWQgc2V0VGV4dChjb25zdCBTdHJpbmcmKTsKIAorICAgIGludCBjdWVJ
bmRleCgpOworICAgIHZvaWQgaW52YWxpZGF0ZUN1ZUluZGV4KCk7CisKICAgICBQYXNzUmVmUHRy
PERvY3VtZW50RnJhZ21lbnQ+IGdldEN1ZUFzSFRNTCgpOwogICAgIHZvaWQgc2V0Q3VlSFRNTChQ
YXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+KTsKIAorICAgIHZpcnR1YWwgYm9vbCBkaXNwYXRj
aEV2ZW50KFBhc3NSZWZQdHI8RXZlbnQ+KTsKKyAgICBib29sIGRpc3BhdGNoRXZlbnQoUGFzc1Jl
ZlB0cjxFdmVudD4sIEV4Y2VwdGlvbkNvZGUmKTsKKwogICAgIGJvb2wgaXNBY3RpdmUoKTsKICAg
ICB2b2lkIHNldElzQWN0aXZlKGJvb2wpOwotICAgIAorCiAgICAgdmlydHVhbCBjb25zdCBBdG9t
aWNTdHJpbmcmIGludGVyZmFjZU5hbWUoKSBjb25zdDsKICAgICB2aXJ0dWFsIFNjcmlwdEV4ZWN1
dGlvbkNvbnRleHQqIHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSBjb25zdDsKIApAQCAtMTE4LDEw
ICsxMjQsMTAgQEAgcHJpdmF0ZToKICAgICB2b2lkIHBhcnNlU2V0dGluZ3MoY29uc3QgU3RyaW5n
Jik7CiAgICAgdm9pZCBjdWVXaWxsQ2hhbmdlKCk7CiAgICAgdm9pZCBjdWVEaWRDaGFuZ2UoKTsK
LSAgICAKKwogICAgIHZpcnR1YWwgdm9pZCByZWZFdmVudFRhcmdldCgpIHsgcmVmKCk7IH0KICAg
ICB2aXJ0dWFsIHZvaWQgZGVyZWZFdmVudFRhcmdldCgpIHsgZGVyZWYoKTsgfQotICAgIAorCiAg
ICAgU3RyaW5nIG1faWQ7CiAgICAgZG91YmxlIG1fc3RhcnRUaW1lOwogICAgIGRvdWJsZSBtX2Vu
ZFRpbWU7CkBAIC0xMzAsNiArMTM2LDggQEAgcHJpdmF0ZToKICAgICBpbnQgbV9saW5lUG9zaXRp
b247CiAgICAgaW50IG1fdGV4dFBvc2l0aW9uOwogICAgIGludCBtX2N1ZVNpemU7CisgICAgaW50
IG1fY3VlSW5kZXg7CisKICAgICBBbGlnbm1lbnQgbV9jdWVBbGlnbm1lbnQ7CiAgICAgUmVmUHRy
PERvY3VtZW50RnJhZ21lbnQ+IG1fZG9jdW1lbnRGcmFnbWVudDsKICAgICBSZWZQdHI8VGV4dFRy
YWNrPiBtX3RyYWNrOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2tD
dWVMaXN0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlTGlzdC5jcHAKaW5k
ZXggMzRiNzFjYTFiMDU4YWYzYjllY2IyZDg1ZjM2MjE1OTJiZGIzYmZkMC4uMzkxYjJmNjUxZTFi
ZDNmODE1NzJmMTI0MWM1NTcyNzJlMzE3NDk0MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
aHRtbC9UZXh0VHJhY2tDdWVMaXN0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRU
cmFja0N1ZUxpc3QuY3BwCkBAIC00MCw2ICs0MCwxMSBAQCB1bnNpZ25lZCBsb25nIFRleHRUcmFj
a0N1ZUxpc3Q6Omxlbmd0aCgpIGNvbnN0CiAgICAgcmV0dXJuIG1fbGlzdC5zaXplKCk7CiB9CiAK
K3Vuc2lnbmVkIGxvbmcgVGV4dFRyYWNrQ3VlTGlzdDo6Z2V0Q3VlSW5kZXgoVGV4dFRyYWNrQ3Vl
KiBjdWUpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbGlzdC5maW5kKGN1ZSk7Cit9CisKIFRleHRU
cmFja0N1ZSogVGV4dFRyYWNrQ3VlTGlzdDo6aXRlbSh1bnNpZ25lZCBpbmRleCkgY29uc3QKIHsK
ICAgICBpZiAoaW5kZXggPCBtX2xpc3Quc2l6ZSgpKQpAQCAtODgsNiArOTMsNyBAQCBib29sIFRl
eHRUcmFja0N1ZUxpc3Q6OmFkZChQYXNzUmVmUHRyPFRleHRUcmFja0N1ZT4gcHJwQ3VlLCBzaXpl
X3Qgc3RhcnQsIHNpemVfdAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgbV9s
aXN0Lmluc2VydChzdGFydCwgY3VlKTsKKyAgICAgICBpbnZhbGlkYXRlQ3VlSW5kZXhlcyhzdGFy
dCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC0xMTksNiArMTI1LDEyIEBAIHZv
aWQgVGV4dFRyYWNrQ3VlTGlzdDo6Y2xlYXIoKQogICAgIG1fbGlzdC5jbGVhcigpOwogfQogCit2
b2lkIFRleHRUcmFja0N1ZUxpc3Q6OmludmFsaWRhdGVDdWVJbmRleGVzKHNpemVfdCBzdGFydCkK
K3sKKyAgICBmb3IgKHNpemVfdCBpID0gc3RhcnQ7IGkgPCBtX2xpc3Quc2l6ZSgpOyArK2kpCisg
ICAgICAgIG1fbGlzdFtpXS0+aW52YWxpZGF0ZUN1ZUluZGV4KCk7Cit9CisKIH0gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL1Rl
eHRUcmFja0N1ZUxpc3QuaCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlTGlzdC5o
CmluZGV4IDdhN2Y5MDQxNWE3ZmViNmZjZGQ2NWE0ODFkY2NjMDE2NjY5ZTI5ZTguLjkwYjE5YTVi
ZTJmYzJkOTRjNDI5YWMwM2M4ZGY2MjViZDZiMzA1Y2IgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL2h0bWwvVGV4dFRyYWNrQ3VlTGlzdC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4
dFRyYWNrQ3VlTGlzdC5oCkBAIC00NSw2ICs0NSw4IEBAIHB1YmxpYzoKICAgICB+VGV4dFRyYWNr
Q3VlTGlzdCgpIHsgfQogCiAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGgoKSBjb25zdDsKKyAgICB1
bnNpZ25lZCBsb25nIGdldEN1ZUluZGV4KFRleHRUcmFja0N1ZSopIGNvbnN0OworCiAgICAgVGV4
dFRyYWNrQ3VlKiBpdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdDsKICAgICBUZXh0VHJhY2tDdWUq
IGdldEN1ZUJ5SWQoY29uc3QgU3RyaW5nJikgY29uc3Q7CiAgICAgVGV4dFRyYWNrQ3VlTGlzdCog
YWN0aXZlQ3VlcygpOwpAQCAtNTcsMTAgKzU5LDExIEBAIHByaXZhdGU6CiAgICAgVGV4dFRyYWNr
Q3VlTGlzdCgpOwogICAgIGJvb2wgYWRkKFBhc3NSZWZQdHI8VGV4dFRyYWNrQ3VlPiwgc2l6ZV90
LCBzaXplX3QpOwogICAgIHZvaWQgY2xlYXIoKTsKLSAgICAKKyAgICB2b2lkIGludmFsaWRhdGVD
dWVJbmRleGVzKHNpemVfdCk7CisKICAgICBWZWN0b3I8UmVmUHRyPFRleHRUcmFja0N1ZT4gPiBt
X2xpc3Q7CiAgICAgUmVmUHRyPFRleHRUcmFja0N1ZUxpc3Q+IG1fYWN0aXZlQ3VlczsKLSAgICAK
KwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvaHRtbC90cmFjay9UZXh0VHJhY2tMaXN0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvdHJh
Y2svVGV4dFRyYWNrTGlzdC5jcHAKaW5kZXggNzdkOTY3M2Q0MzE2NDFiNDcxYjRhOTZkN2JiZWE3
MWUyZjU0MDJjOC4uZWFkMTk1MDcxNjM0NzRlMDU2MGZkMDRlZmVlYjdhNjVmNDhhNWY4MiAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaHRtbC90cmFjay9UZXh0VHJhY2tMaXN0LmNwcAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9odG1sL3RyYWNrL1RleHRUcmFja0xpc3QuY3BwCkBAIC01NSw2ICs1
NSwxOSBAQCB1bnNpZ25lZCBUZXh0VHJhY2tMaXN0OjpsZW5ndGgoKSBjb25zdAogICAgIHJldHVy
biBtX2FkZFRyYWNrVHJhY2tzLnNpemUoKSArIG1fZWxlbWVudFRyYWNrcy5zaXplKCk7CiB9CiAK
K3Vuc2lnbmVkIFRleHRUcmFja0xpc3Q6OmdldFRyYWNrSW5kZXgoVGV4dFRyYWNrICp0ZXh0VHJh
Y2spCit7CisgICAgaWYgKHRleHRUcmFjay0+dHJhY2tUeXBlKCkgPT0gVGV4dFRyYWNrOjpUcmFj
a0VsZW1lbnQpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxMb2FkYWJsZVRleHRUcmFjayo+
KHRleHRUcmFjayktPnRyYWNrRWxlbWVudEluZGV4KCk7CisKKyAgICBpZiAodGV4dFRyYWNrLT50
cmFja1R5cGUoKSA9PSBUZXh0VHJhY2s6OkFkZFRyYWNrKQorICAgICAgICByZXR1cm4gbV9lbGVt
ZW50VHJhY2tzLnNpemUoKSArIG1fYWRkVHJhY2tUcmFja3MuZmluZCh0ZXh0VHJhY2spOworCisg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisKKyAgICByZXR1cm4gLTE7Cit9CisKIFRleHRUcmFj
ayogVGV4dFRyYWNrTGlzdDo6aXRlbSh1bnNpZ25lZCBpbmRleCkKIHsKICAgICAvLyA0LjguMTAu
MTIuMSBUZXh0IHRyYWNrIG1vZGVsCkBAIC03NywxMyArOTAsMjEgQEAgVGV4dFRyYWNrKiBUZXh0
VHJhY2tMaXN0OjppdGVtKHVuc2lnbmVkIGluZGV4KQogdm9pZCBUZXh0VHJhY2tMaXN0OjphcHBl
bmQoUGFzc1JlZlB0cjxUZXh0VHJhY2s+IHBycFRyYWNrKQogewogICAgIFJlZlB0cjxUZXh0VHJh
Y2s+IHRyYWNrID0gcHJwVHJhY2s7Ci0gICAgCisKICAgICBpZiAodHJhY2stPnRyYWNrVHlwZSgp
ID09IFRleHRUcmFjazo6QWRkVHJhY2spCiAgICAgICAgIG1fYWRkVHJhY2tUcmFja3MuYXBwZW5k
KHRyYWNrKTsKICAgICBlbHNlIGlmICh0cmFjay0+dHJhY2tUeXBlKCkgPT0gVGV4dFRyYWNrOjpU
cmFja0VsZW1lbnQpIHsKICAgICAgICAgLy8gSW5zZXJ0IHRyYWNrcyBhZGRlZCBmb3IgPHRyYWNr
PiBlbGVtZW50IGluIHRyZWUgb3JkZXIuCiAgICAgICAgIHNpemVfdCBpbmRleCA9IHN0YXRpY19j
YXN0PExvYWRhYmxlVGV4dFRyYWNrKj4odHJhY2suZ2V0KCkpLT50cmFja0VsZW1lbnRJbmRleCgp
OwogICAgICAgICBtX2VsZW1lbnRUcmFja3MuaW5zZXJ0KGluZGV4LCB0cmFjayk7CisKKyAgICAg
ICAgLy8gSW52YWxpZGF0ZSB0aGUgY2FjaGVkIGluZGV4IGZvciBhbGwgdGhlIGZvbGxvd2luZyB0
cmFja3MuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBpbmRleDsgaSA8IG1fZWxlbWVudFRyYWNr
cy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIG1fZWxlbWVudFRyYWNrc1tpXS0+aW52YWxpZGF0
ZVRyYWNrSW5kZXgoKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fYWRkVHJh
Y2tUcmFja3Muc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBtX2FkZFRyYWNrVHJhY2tzW2ldLT5p
bnZhbGlkYXRlVHJhY2tJbmRleCgpOworCiAgICAgfSBlbHNlCiAgICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL3RyYWNrL1RleHRU
cmFja0xpc3QuaCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvdHJhY2svVGV4dFRyYWNrTGlzdC5oCmlu
ZGV4IDg4ZDlhZjYyZTAyYjIyOTU3NDc1MzY3N2VmMjE1MTkxNmJlNjVlZTcuLmY4ZjA0ZmZhOTg1
MDdjZGQwZjZkNGI1ZTg5ODg3NDdlNTRmYTg1NmEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L2h0bWwvdHJhY2svVGV4dFRyYWNrTGlzdC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvdHJh
Y2svVGV4dFRyYWNrTGlzdC5oCkBAIC01MSw2ICs1MSw4IEBAIHB1YmxpYzoKICAgICB+VGV4dFRy
YWNrTGlzdCgpOwogCiAgICAgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3Q7CisgICAgdW5zaWduZWQg
Z2V0VHJhY2tJbmRleChUZXh0VHJhY2sqKTsKKwogICAgIFRleHRUcmFjayogaXRlbSh1bnNpZ25l
ZCBpbmRleCk7CiAgICAgdm9pZCBhcHBlbmQoUGFzc1JlZlB0cjxUZXh0VHJhY2s+KTsKICAgICB2
b2lkIHJlbW92ZShUZXh0VHJhY2sqKTsKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxv
ZyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwppbmRleCA1ZjY3YzNhMmU5MWM3ODI1NmZjMjdkMTUy
OTVjYTU1YTI0YzhlODc1Li5lYWE4ZjdiZTdjNGY3NzY4ZWY5MWIzYThlMmM0NzYxZTQwODU2Nzdj
IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMjIgQEAKKzIwMTItMDItMTMgIFZpY3RvciBDYXJidW5lICA8dmlj
dG9yQHJvc2VkdS5vcmc+CisKKyAgICAgICAgPHRyYWNrPi1yZWxhdGVkIGV2ZW50cyBjdWVjaGFu
Z2UsIGVudGVyLCBhbmQgZXhpdCBzaG91bGQgYmUgc29ydGVkIGFuZCBmaWx0ZXJlZCBiZWZvcmUg
ZGlzcGF0Y2hpbmcKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTcyMTcxCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgKiBtZWRpYS90cmFjay9jYXB0aW9ucy13ZWJ2dHQvbWlzc2VkLWN1ZXMudnR0OiBBZGRlZC4K
KyAgICAgICAgKiBtZWRpYS90cmFjay9jYXB0aW9ucy13ZWJ2dHQvc29ydGVkLWRpc3BhdGNoLnZ0
dDogQWRkZWQuCisgICAgICAgICogbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1jdWVjaGFuZ2UtZXhw
ZWN0ZWQudHh0OiBUaGlzIHRlc3QgaGFkIHRvIGJlIGNoYW5nZWQgYmVjYXVzZQorICAgICAgICB0
aGUgc3luY2hyb25vdXMgZGlzcGF0Y2ggb2YgdGhlIGV2ZW50cyBhZ2FpbnN0IHRoZSBIVE1MVHJh
Y2tFbGVtZW50IGRvZXNuJ3QgbWVhbiB0aGF0CisgICAgICAgIHRoZSB0ZXh0IHRyYWNrIGFjdHVh
bGx5IGhhcyBhbnkgYWN0aXZlIGN1ZXMgYXQgdGhlIGRpc3BhdGNoIG1vbWVudC4KKyAgICAgICAg
KiBtZWRpYS90cmFjay90cmFjay1jdWVzLWN1ZWNoYW5nZS5odG1sOiBDaGFuZ2VkIHRlc3RzIHN0
cnVjdHVyZSB0byBndWlkZSB0aGUgZW50ZXJpbmcgYW5kCisgICAgICAgIGV4aXQgZXZlbnRzIGFj
Y29yZGluZyB0byB0aGUgYXN5bmNocm9ub3VzIGRpc3BhdGNoIGRvbmUgYnkgVGV4dFRyYWNrLgor
ICAgICAgICAqIG1lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtbWlzc2VkLWV4cGVjdGVkLnR4dDogQWRk
ZWQuCisgICAgICAgICogbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1taXNzZWQuaHRtbDogQWRkZWQu
CisgICAgICAgICogbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1zb3J0ZWQtYmVmb3JlLWRpc3BhdGNo
LWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1z
b3J0ZWQtYmVmb3JlLWRpc3BhdGNoLmh0bWw6IEFkZGVkLgorCiAyMDEyLTAyLTEzICBBYmhpc2hl
ayBBcnlhICA8aW5mZXJub0BjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgSW5jb3JyZWN0IGNoaWxk
cmVuIHBsYWNlbWVudCBpbiBtdWx0aS1jb2x1bW4gbGF5b3V0LiAgICAgICAgCkBAIC0yODAsNiAr
Mjk5LDcgQEAKICAgICAgICAgW1F0XSBVbnJldmlld2VkIGdhcmRlbmluZywgdW5za2lwIG5vdyBw
YXNzaW5nIHRlc3RzLgogCiAgICAgICAgICogcGxhdGZvcm0vcXQvU2tpcHBlZDoKKz4+Pj4+Pj4g
bWFzdGVyCiAKIDIwMTItMDItMTMgIENzYWJhIE9zenRyb2dvbsOhYyAgPG9zc3lAd2Via2l0Lm9y
Zz4KIApAQCAtMzg3Niw2ICszODk2LDcgQEAKICAgICAgICAgVW5yZXZpZXdlZCwgbW9yZSBzdmcg
cmViYXNlbGluZXMgZm9sbG93aW5nIGNoYW5nZSBpbiByMTA2OTE4LgogCiAgICAgICAgICogcGxh
dGZvcm0vY2hyb21pdW0tbGludXgvc3ZnL3RleHQvdGV4dC10ZXh0LTA1LXQtZXhwZWN0ZWQucG5n
OgorPj4+Pj4+PiBtYXN0ZXIKIAogMjAxMi0wMi0wNyAgQ3NhYmEgT3N6dHJvZ29uw6FjICA8b3Nz
eUB3ZWJraXQub3JnPgogCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay9jYXB0
aW9ucy13ZWJ2dHQvbWlzc2VkLWN1ZXMudnR0IGIvTGF5b3V0VGVzdHMvbWVkaWEvdHJhY2svY2Fw
dGlvbnMtd2VidnR0L21pc3NlZC1jdWVzLnZ0dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi44MTM3ZWY3MmVhNzRjYjI1
NjhhOTFhNzEwMTcwZmIwMTAxZTZhZDllCi0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMv
bWVkaWEvdHJhY2svY2FwdGlvbnMtd2VidnR0L21pc3NlZC1jdWVzLnZ0dApAQCAtMCwwICsxLDI3
IEBACitXRUJWVFQKK0V2ZW50cyBzaG91bGQgYmUgdHJpZ2dlcmVkIGZvciBtaXNzZWQgKHNraXBw
ZWQpIGN1ZXMgZHVyaW5nIG5vcm1hbCBwbGF5YmFjay4KKworMQorMDA6MDA6MDAuMDAwIC0tPiAw
MDowMDowMS41MDAgQTpzdGFydCBUOjIwJQorQmVhciBpcyBDb21pbmchISEhIQorQW5kIHdoYXQg
a2luZCBvZiBhIGJlYXIgaXQgaXMgLSBqdXN0IGhhdmUgbG9vay4KKworMgorMDA6MDA6MDIuMDAw
IC0tPiAwMDowMDowMi41MDAgQTpzdGFydCBUOjIwJQorSSBzYWlkIEJlYXIgaXMgY29taW5nISEh
IQorCiszCiswMDowMDowNC41MDAgLS0+IDAwOjAwOjA0LjUwMSBBOnN0YXJ0IFQ6MjAlCitJIHNh
aWQgQmVhciBpcyBjb21pbmcgbm93ISEhIQorCis0CiswMDowMDowNC43MDAgLS0+IDAwOjAwOjA0
LjcwMSBBOnN0YXJ0IFQ6MjAlCitUZXN0cyBmb3IgYSBzZWNvbmQgbWlzc2VkIGN1ZS4KKworNQor
MDA6MDA6MDQuOTAwIC0tPiAwMDowMDowNC45MDEgQTpzdGFydCBUOjIwJQorTWF5YmUgYSB0aGly
ZCBtaXNzZWQgY3VlLgorCis2CiswMDowMDowNS45OTIgLS0+IDAwOjAwOjA1Ljk5MyBBOnN0YXJ0
IFQ6MjAlCitGb3VydGggbWlzc2VkIGN1ZS4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL21lZGlh
L3RyYWNrL2NhcHRpb25zLXdlYnZ0dC9zb3J0ZWQtZGlzcGF0Y2gudnR0IGIvTGF5b3V0VGVzdHMv
bWVkaWEvdHJhY2svY2FwdGlvbnMtd2VidnR0L3NvcnRlZC1kaXNwYXRjaC52dHQKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uNDhlY2Q4ZWZiNzViZTk1ZmRjZDExYTM2YTU1YzgyMDhlMmUwZjc1MQotLS0gL2Rldi9udWxs
CisrKyBiL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL2NhcHRpb25zLXdlYnZ0dC9zb3J0ZWQtZGlz
cGF0Y2gudnR0CkBAIC0wLDAgKzEsMzAgQEAKK1dFQlZUVAorRW50ZXIgYW5kIGV4aXQgZXZlbnRz
IHNob3VsZCBiZSBkaXNwYXRjaGVkIGluIGEgc29ydGVkIG9yZGVyIGFjY29yZGluZyB0byB0aGVp
ciB0aW1lcy4KKworMQorMDA6MDA6MDUuMTAwIC0tPiAwMDowMDowNS44MDAgQTpzdGFydCBUOjIw
JQorQmVhciBpcyBDb21pbmchISEhIQorCisyCiswMDowMDowNS4xMDAgLS0+IDAwOjAwOjA1LjEw
MQorTWlzc2VkIGN1ZSAxCisKKzMKKzAwOjAwOjA1LjEwMCAtLT4gMDA6MDA6MDUuMzAxCitBbmQg
d2hhdCBraW5kIG9mIGEgYmVhciBpdCBpcyAtIGp1c3QgaGF2ZSBsb29rLgorCis0CiswMDowMDow
NS4xMDAgLS0+IDAwOjAwOjA1LjEwMQorTWlzc2VkIEN1ZSAyCisKKzUKKzAwOjAwOjA1LjMwMCAt
LT4gMDA6MDA6MDUuODAwIEE6c3RhcnQgVDoyMCUKK0kgc2FpZCBCZWFyIGlzIGNvbWluZyEhISEK
KworNgorMDA6MDA6MDUuOTkwIC0tPiAwMDowMDowNS45OTMgQTpzdGFydCBUOjIwJQorSSBzYWlk
IEJlYXIgaXMgY29taW5nIG5vdyEhISEKKworNworMDA6MDA6MDUuOTk0IC0tPiAwMDowMDowNS45
OTMgQTpzdGFydCBUOjIwJQorQmVhciBpcyBhbHJlYWR5IGhlcmUKZGlmZiAtLWdpdCBhL0xheW91
dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtY3VlY2hhbmdlLWV4cGVjdGVkLnR4dCBiL0xh
eW91dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtY3VlY2hhbmdlLWV4cGVjdGVkLnR4dApp
bmRleCA0NzQ0ZTE1ZDVlODcwNmY4YzE3YTRiZGM4NjVkNDU2OWZhOGM2NjVhLi4zNzNiNTI1Zjg4
ZjE4ZDFmYTZiYzAzNjNjMTc5OTFjYzQ4YTdkYmI4IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9t
ZWRpYS90cmFjay90cmFjay1jdWVzLWN1ZWNoYW5nZS1leHBlY3RlZC50eHQKKysrIGIvTGF5b3V0
VGVzdHMvbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1jdWVjaGFuZ2UtZXhwZWN0ZWQudHh0CkBAIC00
LDUzICs0LDM1IEBAIEVWRU5UKGNhbnBsYXl0aHJvdWdoKQogRVhQRUNURUQgKHRlc3RUcmFjay50
cmFjay5jdWVzLmxlbmd0aCA9PSAnMycpIE9LCiBSVU4odmlkZW8ucGxheSgpKQogCitFVkVOVChj
dWVjaGFuZ2UpIGZyb20gPHRyYWNrPgogRVZFTlQoY3VlY2hhbmdlKSBmcm9tIFRleHRUcmFjawog
Q3VlIGVudGVyZWQKIEVYUEVDVEVEIChbb2JqZWN0IFRleHRUcmFja0N1ZV0gPT0gJ1tvYmplY3Qg
VGV4dFRyYWNrQ3VlXScpIE9LCiBFWFBFQ1RFRCAoY3VycmVudEN1ZS5pZCA9PSAnMScpIE9LCiAK
IEVWRU5UKGN1ZWNoYW5nZSkgZnJvbSA8dHJhY2s+Ci1DdWUgZW50ZXJlZAotRVhQRUNURUQgKFtv
YmplY3QgVGV4dFRyYWNrQ3VlXSA9PSAnW29iamVjdCBUZXh0VHJhY2tDdWVdJykgT0sKLUVYUEVD
VEVEIChjdXJyZW50Q3VlLmlkID09ICcxJykgT0sKLQogRVZFTlQoY3VlY2hhbmdlKSBmcm9tIFRl
eHRUcmFjawogQ3VlIGV4aXRlZAogCiBFVkVOVChjdWVjaGFuZ2UpIGZyb20gPHRyYWNrPgotQ3Vl
IGV4aXRlZAotCiBFVkVOVChjdWVjaGFuZ2UpIGZyb20gVGV4dFRyYWNrCiBDdWUgZW50ZXJlZAog
RVhQRUNURUQgKFtvYmplY3QgVGV4dFRyYWNrQ3VlXSA9PSAnW29iamVjdCBUZXh0VHJhY2tDdWVd
JykgT0sKIEVYUEVDVEVEIChjdXJyZW50Q3VlLmlkID09ICcyJykgT0sKIAogRVZFTlQoY3VlY2hh
bmdlKSBmcm9tIDx0cmFjaz4KLUN1ZSBlbnRlcmVkCi1FWFBFQ1RFRCAoW29iamVjdCBUZXh0VHJh
Y2tDdWVdID09ICdbb2JqZWN0IFRleHRUcmFja0N1ZV0nKSBPSwotRVhQRUNURUQgKGN1cnJlbnRD
dWUuaWQgPT0gJzInKSBPSwotCiBFVkVOVChjdWVjaGFuZ2UpIGZyb20gVGV4dFRyYWNrCiBDdWUg
ZXhpdGVkCiAKIEVWRU5UKGN1ZWNoYW5nZSkgZnJvbSA8dHJhY2s+Ci1DdWUgZXhpdGVkCi0KIEVW
RU5UKGN1ZWNoYW5nZSkgZnJvbSBUZXh0VHJhY2sKIEN1ZSBlbnRlcmVkCiBFWFBFQ1RFRCAoW29i
amVjdCBUZXh0VHJhY2tDdWVdID09ICdbb2JqZWN0IFRleHRUcmFja0N1ZV0nKSBPSwogRVhQRUNU
RUQgKGN1cnJlbnRDdWUuaWQgPT0gJzMnKSBPSwogCiBFVkVOVChjdWVjaGFuZ2UpIGZyb20gPHRy
YWNrPgotQ3VlIGVudGVyZWQKLUVYUEVDVEVEIChbb2JqZWN0IFRleHRUcmFja0N1ZV0gPT0gJ1tv
YmplY3QgVGV4dFRyYWNrQ3VlXScpIE9LCi1FWFBFQ1RFRCAoY3VycmVudEN1ZS5pZCA9PSAnMycp
IE9LCi0KIEVWRU5UKGN1ZWNoYW5nZSkgZnJvbSBUZXh0VHJhY2sKIEN1ZSBleGl0ZWQKIAotRVZF
TlQoY3VlY2hhbmdlKSBmcm9tIDx0cmFjaz4KLUN1ZSBleGl0ZWQKLQogRU5EIE9GIFRFU1QKIApk
aWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1jdWVjaGFuZ2Uu
aHRtbCBiL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtY3VlY2hhbmdlLmh0bWwK
aW5kZXggOGQ2ZDBmNGRjN2FkNjBlMjlkZmY0M2Y1ZjgxMWQwYWMwNzI0MjFiYi4uNTk4MzY5M2Ux
Mjg3N2ZjODgxOTZlZmEzNWM3M2JjNjdmMmMxNmZiZSAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMv
bWVkaWEvdHJhY2svdHJhY2stY3Vlcy1jdWVjaGFuZ2UuaHRtbAorKysgYi9MYXlvdXRUZXN0cy9t
ZWRpYS90cmFjay90cmFjay1jdWVzLWN1ZWNoYW5nZS5odG1sCkBAIC0zMSwyNSArMzEsMjEgQEAK
ICAgICAgICAgZnVuY3Rpb24gY3VlQ2hhbmdlZEZyb21UcmFja0VsZW1lbnQoKQogICAgICAgICB7
CiAgICAgICAgICAgICBjb25zb2xlV3JpdGUoIkVWRU5UKGN1ZWNoYW5nZSkgZnJvbSAmbHQ7dHJh
Y2smZ3Q7Iik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGN1cnJlbnRDdWVJbmRleCA9IE1h
dGguZmxvb3IoY3VlQ2hhbmdlQ291bnQvMik7Ci0gICAgICAgICAgICBjdXJyZW50Q3VlID0gZXZl
bnQudGFyZ2V0LnRyYWNrLmN1ZXNbY3VycmVudEN1ZUluZGV4XTsKLSAgICAgICAgICAgIGNoZWNr
Q3VlKCk7Ci0KLSAgICAgICAgICAgICsrY3VlQ2hhbmdlQ291bnQ7Ci0gICAgICAgICAgICBpZiAo
Y3VlQ2hhbmdlQ291bnQgPT0gdGVzdFRyYWNrLnRyYWNrLmN1ZXMubGVuZ3RoICogMikKLSAgICAg
ICAgICAgICAgICBlbmRUZXN0KCk7CiAgICAgICAgIH0KIAogICAgICAgICBmdW5jdGlvbiBjdWVD
aGFuZ2VkRnJvbVRleHRUcmFjaygpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnNvbGVXcml0
ZSgiRVZFTlQoY3VlY2hhbmdlKSBmcm9tIFRleHRUcmFjayIpOwotICAgICAgICAgICAgCi0gICAg
ICAgICAgICBjdXJyZW50Q3VlSW5kZXggPSBNYXRoLmZsb29yKGN1ZUNoYW5nZUNvdW50LzIpOwor
CisgICAgICAgICAgICBjdXJyZW50Q3VlSW5kZXggPSBNYXRoLmZsb29yKGN1ZUNoYW5nZUNvdW50
IC8gMik7CiAgICAgICAgICAgICBjdXJyZW50Q3VlID0gZXZlbnQudGFyZ2V0LmN1ZXNbY3VycmVu
dEN1ZUluZGV4XTsKICAgICAgICAgICAgIGNoZWNrQ3VlKCk7CisKKyAgICAgICAgICAgICsrY3Vl
Q2hhbmdlQ291bnQ7CisgICAgICAgICAgICBpZiAoY3VlQ2hhbmdlQ291bnQgPT0gdGVzdFRyYWNr
LnRyYWNrLmN1ZXMubGVuZ3RoICogMikKKyAgICAgICAgICAgICAgICBlbmRUZXN0KCk7CiAgICAg
ICAgIH0KLSAgICAgICAgCisKICAgICAgICAgZnVuY3Rpb24gY2hlY2tDdWUoKQogICAgICAgICB7
CiAgICAgICAgICAgICBpZiAoY3VlQ2hhbmdlQ291bnQgJSAyID09IDApIHsKZGlmZiAtLWdpdCBh
L0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtbWlzc2VkLWV4cGVjdGVkLnR4dCBi
L0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtbWlzc2VkLWV4cGVjdGVkLnR4dApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi5lZTg2ZjY2MTEyMzM0MmIyNzcwYTZmZDJmYmJlYTYxOWJlMjlhZjRhCi0tLSAv
ZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1taXNzZWQt
ZXhwZWN0ZWQudHh0CkBAIC0wLDAgKzEsMzIgQEAKK1Rlc3RzIHRoYXQgZXZlbnRzIGFyZSB0cmln
Z2VyZWQgZm9yIG1pc3NlZCAoc2tpcHBlZCkgY3VlcyBkdXJpbmcgbm9ybWFsIHBsYXliYWNrLgor
CitFVkVOVChjYW5wbGF5dGhyb3VnaCkKK0VYUEVDVEVEICh0ZXN0VHJhY2sudHJhY2suY3Vlcy5s
ZW5ndGggPT0gJzYnKSBPSworUlVOKHZpZGVvLnBsYXkoKSkKK0VWRU5UKGVudGVyKQorRVhQRUNU
RUQgKHRlc3RUcmFjay50cmFjay5jdWVzLmdldEN1ZUJ5SWQoY3VlQ291bnQpID09ICdbb2JqZWN0
IFRleHRUcmFja0N1ZV0nKSBPSworRVhQRUNURUQgKGN1cnJlbnRDdWUuaWQgPT0gJzMnKSBPSwor
RVZFTlQoZXhpdCkKK0VYUEVDVEVEICh0ZXN0VHJhY2sudHJhY2suY3Vlcy5nZXRDdWVCeUlkKGN1
ZUNvdW50KSA9PSAnW29iamVjdCBUZXh0VHJhY2tDdWVdJykgT0sKK0VYUEVDVEVEIChjdXJyZW50
Q3VlLmlkID09ICczJykgT0sKK0VWRU5UKGVudGVyKQorRVhQRUNURUQgKHRlc3RUcmFjay50cmFj
ay5jdWVzLmdldEN1ZUJ5SWQoY3VlQ291bnQpID09ICdbb2JqZWN0IFRleHRUcmFja0N1ZV0nKSBP
SworRVhQRUNURUQgKGN1cnJlbnRDdWUuaWQgPT0gJzQnKSBPSworRVZFTlQoZXhpdCkKK0VYUEVD
VEVEICh0ZXN0VHJhY2sudHJhY2suY3Vlcy5nZXRDdWVCeUlkKGN1ZUNvdW50KSA9PSAnW29iamVj
dCBUZXh0VHJhY2tDdWVdJykgT0sKK0VYUEVDVEVEIChjdXJyZW50Q3VlLmlkID09ICc0JykgT0sK
K0VWRU5UKGVudGVyKQorRVhQRUNURUQgKHRlc3RUcmFjay50cmFjay5jdWVzLmdldEN1ZUJ5SWQo
Y3VlQ291bnQpID09ICdbb2JqZWN0IFRleHRUcmFja0N1ZV0nKSBPSworRVhQRUNURUQgKGN1cnJl
bnRDdWUuaWQgPT0gJzUnKSBPSworRVZFTlQoZXhpdCkKK0VYUEVDVEVEICh0ZXN0VHJhY2sudHJh
Y2suY3Vlcy5nZXRDdWVCeUlkKGN1ZUNvdW50KSA9PSAnW29iamVjdCBUZXh0VHJhY2tDdWVdJykg
T0sKK0VYUEVDVEVEIChjdXJyZW50Q3VlLmlkID09ICc1JykgT0sKK0VWRU5UKGVudGVyKQorRVhQ
RUNURUQgKHRlc3RUcmFjay50cmFjay5jdWVzLmdldEN1ZUJ5SWQoY3VlQ291bnQpID09ICdbb2Jq
ZWN0IFRleHRUcmFja0N1ZV0nKSBPSworRVhQRUNURUQgKGN1cnJlbnRDdWUuaWQgPT0gJzYnKSBP
SworRVZFTlQoZXhpdCkKK0VYUEVDVEVEICh0ZXN0VHJhY2sudHJhY2suY3Vlcy5nZXRDdWVCeUlk
KGN1ZUNvdW50KSA9PSAnW29iamVjdCBUZXh0VHJhY2tDdWVdJykgT0sKK0VYUEVDVEVEIChjdXJy
ZW50Q3VlLmlkID09ICc2JykgT0sKK0VWRU5UKGVuZGVkKQorRU5EIE9GIFRFU1QKKwpkaWZmIC0t
Z2l0IGEvTGF5b3V0VGVzdHMvbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1taXNzZWQuaHRtbCBiL0xh
eW91dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtbWlzc2VkLmh0bWwKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
NzcxMjc1MDk5OWZhZWY3YzBlYTI2MzQ5ZTFhNzYzY2Y3N2FkYmM3YQotLS0gL2Rldi9udWxsCisr
KyBiL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtbWlzc2VkLmh0bWwKQEAgLTAs
MCArMSw3NyBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAg
PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJz
ZXQ9dXRmLTgiIC8+CisKKyAgICAgICAgPHNjcmlwdCBzcmM9Li4vbWVkaWEtZmlsZS5qcz48L3Nj
cmlwdD4KKyAgICAgICAgPHNjcmlwdCBzcmM9Li4vdmlkZW8tdGVzdC5qcz48L3NjcmlwdD4KKyAg
ICAgICAgPHNjcmlwdD4KKyAgICAgICAgICAgIHZhciB2aWRlb0NhblBsYXlUaHJvdWdoID0gZmFs
c2U7CisgICAgICAgICAgICB2YXIgdHJhY2tMb2FkZWQgPSBmYWxzZTsKKworICAgICAgICAgICAg
dmFyIGN1cnJlbnRDdWU7CisgICAgICAgICAgICB2YXIgY3VlQ291bnQ7CisgICAgICAgICAgICB2
YXIgdGVzdFRyYWNrOworCisgICAgICAgICAgICBmdW5jdGlvbiBydW5UZXN0cygpCisgICAgICAg
ICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCF0cmFja0xvYWRlZCB8fCAhdmlkZW9DYW5QbGF5
VGhyb3VnaCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAg
dGVzdFRyYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3RUcmFjayIpOworICAgICAg
ICAgICAgICAgIHRlc3RFeHBlY3RlZCgidGVzdFRyYWNrLnRyYWNrLmN1ZXMubGVuZ3RoIiwgNik7
CisKKyAgICAgICAgICAgICAgICBmb3IgKGN1ZUNvdW50ID0gMjsgY3VlQ291bnQgPCB0ZXN0VHJh
Y2sudHJhY2suY3Vlcy5sZW5ndGg7IGN1ZUNvdW50KyspIHsKKyAgICAgICAgICAgICAgICAgICAg
dmFyIGN1ZSA9IHRlc3RUcmFjay50cmFjay5jdWVzW2N1ZUNvdW50XTsKKworICAgICAgICAgICAg
ICAgICAgICBjdWUuYWRkRXZlbnRMaXN0ZW5lcignZW50ZXInLCBjdWVFbnRlcmVkT3JFeGl0ZWQp
OworICAgICAgICAgICAgICAgICAgICBjdWUuYWRkRXZlbnRMaXN0ZW5lcignZXhpdCcsIGN1ZUVu
dGVyZWRPckV4aXRlZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY3Vl
Q291bnQgPSAzOworICAgICAgICAgICAgICAgIHJ1bigidmlkZW8ucGxheSgpIik7CisgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgIGZ1bmN0aW9uIGN1ZUVudGVyZWRPckV4aXRlZCgpCisgICAg
ICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc29sZVdyaXRlKCJFVkVOVCgiICsgZXZlbnQu
dHlwZSArICIpIik7CisKKyAgICAgICAgICAgICAgICBjdXJyZW50Q3VlID0gZXZlbnQudGFyZ2V0
OworICAgICAgICAgICAgICAgIHRlc3RFeHBlY3RlZCgidGVzdFRyYWNrLnRyYWNrLmN1ZXMuZ2V0
Q3VlQnlJZChjdWVDb3VudCkiLCBjdXJyZW50Q3VlKTsKKyAgICAgICAgICAgICAgICB0ZXN0RXhw
ZWN0ZWQoImN1cnJlbnRDdWUuaWQiLCBjdWVDb3VudCk7CisKKyAgICAgICAgICAgICAgICBpZiAo
ZXZlbnQudHlwZSA9PSAnZXhpdCcpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VlQ291bnQrKzsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdhaXRGb3JF
dmVudCgnZW5kZWQnLCBlbmRUZXN0KTsKKworICAgICAgICAgICAgd2FpdEZvckV2ZW50KCdjYW5w
bGF5dGhyb3VnaCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHZpZGVvLmN1cnJlbnRU
aW1lID0gNS4wMDsKKyAgICAgICAgICAgICAgICB2aWRlb0NhblBsYXlUaHJvdWdoID0gdHJ1ZTsK
KworICAgICAgICAgICAgICAgIHJ1blRlc3RzKCk7CisgICAgICAgICAgICB9KTsKKworICAgICAg
ICAgICAgZnVuY3Rpb24gbG9hZGVkKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0
cmFja0xvYWRlZCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBydW5UZXN0cygpOworICAgICAg
ICAgICAgfTsKKworICAgICAgICAgICAgZnVuY3Rpb24gYm9keUxvYWRlZCgpCisgICAgICAgICAg
ICB7CisgICAgICAgICAgICAgICAgZmluZE1lZGlhRWxlbWVudCgpOworICAgICAgICAgICAgICAg
IHZpZGVvLnNyYyA9IGZpbmRNZWRpYUZpbGUoInZpZGVvIiwgIi4uL2NvbnRlbnQvdGVzdCIpOwor
ICAgICAgICAgICAgfQorICAgICAgICA8L3NjcmlwdD4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHkg
b25sb2FkPSJib2R5TG9hZGVkKCkiPgorICAgICAgICA8cD5UZXN0cyB0aGF0IGV2ZW50cyBhcmUg
dHJpZ2dlcmVkIGZvciBtaXNzZWQgKHNraXBwZWQpIGN1ZXMgZHVyaW5nIG5vcm1hbCBwbGF5YmFj
ay48L3A+CisgICAgICAgIDx2aWRlbyBjb250cm9scz4KKyAgICAgICAgICAgIDx0cmFjayBpZD0i
dGVzdFRyYWNrIiBzcmM9ImNhcHRpb25zLXdlYnZ0dC9taXNzZWQtY3Vlcy52dHQiIG9ubG9hZD0i
bG9hZGVkKCkiIGRlZmF1bHQ+CisgICAgICAgIDwvdmlkZW8+CisgICAgPC9ib2R5PgorPC9odG1s
PgpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1zb3J0ZWQt
YmVmb3JlLWRpc3BhdGNoLWV4cGVjdGVkLnR4dCBiL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3Ry
YWNrLWN1ZXMtc29ydGVkLWJlZm9yZS1kaXNwYXRjaC1leHBlY3RlZC50eHQKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
ZWZiOTRlZjU3NDMwNTY4ZjBmZDcxNWNiOGU3NDUzOGM2YjA0MWU2MgotLS0gL2Rldi9udWxsCisr
KyBiL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtc29ydGVkLWJlZm9yZS1kaXNw
YXRjaC1leHBlY3RlZC50eHQKQEAgLTAsMCArMSwyMiBAQAorVGVzdHMgdGhhdCBhbGwgZXZlbnRz
IGV2ZW50cyBhcmUgdHJpZ2dlcmVkIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisKK0VWRU5UKGNh
bnBsYXl0aHJvdWdoKQorRVhQRUNURUQgKHRlc3RUcmFjay50cmFjay5jdWVzLmxlbmd0aCA9PSAn
NycpIE9LCitSVU4odmlkZW8ucGxheSgpKQorRVZFTlQoZW5kZWQpCitDdWUgZXZlbnQ6IGVudGVy
IGlkOiAxIHRpbWU6IDUuMQorQ3VlIGV2ZW50OiBlbnRlciBpZDogMyB0aW1lOiA1LjEKK0N1ZSBl
dmVudDogZW50ZXIgaWQ6IDIgdGltZTogNS4xCitDdWUgZXZlbnQ6IGVudGVyIGlkOiA0IHRpbWU6
IDUuMQorQ3VlIGV2ZW50OiBleGl0IGlkOiAyIHRpbWU6IDUuMTAxCitDdWUgZXZlbnQ6IGV4aXQg
aWQ6IDQgdGltZTogNS4xMDEKK0N1ZSBldmVudDogZW50ZXIgaWQ6IDUgdGltZTogNS4zCitDdWUg
ZXZlbnQ6IGV4aXQgaWQ6IDMgdGltZTogNS4zMDEKK0N1ZSBldmVudDogZXhpdCBpZDogMSB0aW1l
OiA1LjgKK0N1ZSBldmVudDogZXhpdCBpZDogNSB0aW1lOiA1LjgKK0N1ZSBldmVudDogZW50ZXIg
aWQ6IDYgdGltZTogNS45OQorQ3VlIGV2ZW50OiBleGl0IGlkOiA2IHRpbWU6IDUuOTkzCitDdWUg
ZXZlbnQ6IGV4aXQgaWQ6IDcgdGltZTogNS45OTMKK0N1ZSBldmVudDogZW50ZXIgaWQ6IDcgdGlt
ZTogNS45OTQKK0VORCBPRiBURVNUCisKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL21lZGlhL3Ry
YWNrL3RyYWNrLWN1ZXMtc29ydGVkLWJlZm9yZS1kaXNwYXRjaC5odG1sIGIvTGF5b3V0VGVzdHMv
bWVkaWEvdHJhY2svdHJhY2stY3Vlcy1zb3J0ZWQtYmVmb3JlLWRpc3BhdGNoLmh0bWwKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uODZkOTk2ZGRmYjM5Mzc0MTg3NWFlYzM1ZjU4MDFlNjYxYTZmMWE3NgotLS0gL2Rldi9u
dWxsCisrKyBiL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtc29ydGVkLWJlZm9y
ZS1kaXNwYXRjaC5odG1sCkBAIC0wLDAgKzEsODkgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+
CisgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29u
dGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorCisgICAgICAgIDxzY3JpcHQgc3Jj
PS4uL21lZGlhLWZpbGUuanM+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQgc3JjPS4uL3ZpZGVv
LXRlc3QuanM+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQ+CisgICAgICAgICAgICB2YXIgdmlk
ZW9DYW5QbGF5VGhyb3VnaCA9IGZhbHNlOworICAgICAgICAgICAgdmFyIHRyYWNrTG9hZGVkID0g
ZmFsc2U7CisKKyAgICAgICAgICAgIHZhciBjdXJyZW50Q3VlOworICAgICAgICAgICAgdmFyIHRl
c3RUcmFjazsKKworICAgICAgICAgICAgdmFyIGRpc3BhdGNoZWRFdmVudHMgPSBbXTsKKworICAg
ICAgICAgICAgZnVuY3Rpb24gcnVuVGVzdHMoKQorICAgICAgICAgICAgeworICAgICAgICAgICAg
ICAgIGlmICghdHJhY2tMb2FkZWQgfHwgIXZpZGVvQ2FuUGxheVRocm91Z2gpCisgICAgICAgICAg
ICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgIHRlc3RUcmFjayA9IGRvY3VtZW50
LmdldEVsZW1lbnRCeUlkKCJ0ZXN0VHJhY2siKTsKKyAgICAgICAgICAgICAgICB0ZXN0RXhwZWN0
ZWQoInRlc3RUcmFjay50cmFjay5jdWVzLmxlbmd0aCIsIDcpOworCisgICAgICAgICAgICAgICAg
Zm9yICh2YXIgaSA9IDA7IGkgPCB0ZXN0VHJhY2sudHJhY2suY3Vlcy5sZW5ndGg7ICsraSkgewor
ICAgICAgICAgICAgICAgICAgICB0ZXN0VHJhY2sudHJhY2suY3Vlc1tpXS5hZGRFdmVudExpc3Rl
bmVyKCdlbnRlcicsIGN1ZUVudGVyZWRPckV4aXRlZCk7CisgICAgICAgICAgICAgICAgICAgIHRl
c3RUcmFjay50cmFjay5jdWVzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2V4aXQnLCBjdWVFbnRlcmVk
T3JFeGl0ZWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJ1bigidmlk
ZW8ucGxheSgpIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZ1bmN0aW9uIGN1ZUVu
dGVyZWRPckV4aXRlZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VycmVudEN1
ZSA9IGV2ZW50LnRhcmdldDsKKworICAgICAgICAgICAgICAgIHZhciBldmVudE9iaiA9IHt9Owor
CisgICAgICAgICAgICAgICAgZXZlbnRPYmoudGltZSA9IGN1cnJlbnRDdWUuc3RhcnRUaW1lOwor
ICAgICAgICAgICAgICAgIGlmIChldmVudC50eXBlID09ICdleGl0JykKKyAgICAgICAgICAgICAg
ICAgICAgZXZlbnRPYmoudGltZSA9IGN1cnJlbnRDdWUuZW5kVGltZTsKKworICAgICAgICAgICAg
ICAgIGV2ZW50T2JqLnR5cGUgPSBldmVudC50eXBlOworICAgICAgICAgICAgICAgIGV2ZW50T2Jq
LmN1ZSA9IGN1cnJlbnRDdWU7CisKKyAgICAgICAgICAgICAgICBkaXNwYXRjaGVkRXZlbnRzLnB1
c2goZXZlbnRPYmopOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmdW5jdGlvbiBsb2Fk
ZWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYWNrTG9hZGVkID0gdHJ1ZTsK
KworICAgICAgICAgICAgICAgIHJ1blRlc3RzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIGZ1bmN0aW9uIGJvZHlMb2FkZWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
IGZpbmRNZWRpYUVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICB2aWRlby5zcmMgPSBmaW5kTWVk
aWFGaWxlKCJ2aWRlbyIsICIuLi9jb250ZW50L3Rlc3QiKTsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgZnVuY3Rpb24gbG9nRW5kVGVzdCgpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHZh
ciBpID0gMDsgaSA8IGRpc3BhdGNoZWRFdmVudHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAg
ICAgICAgICAgY29uc29sZVdyaXRlKCJDdWUgZXZlbnQ6ICIgKyBkaXNwYXRjaGVkRXZlbnRzW2ld
LnR5cGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpZDogIiArIGRpc3Bh
dGNoZWRFdmVudHNbaV0uY3VlLmlkICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICIgdGltZTogIiArIGRpc3BhdGNoZWRFdmVudHNbaV0udGltZSk7CisgICAgICAgICAgICAgICAg
fQorCisgICAgICAgICAgICAgICAgZW5kVGVzdCgpOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICB3YWl0Rm9yRXZlbnQoJ2VuZGVkJywgbG9nRW5kVGVzdCk7CisKKyAgICAgICAgICAgIHdh
aXRGb3JFdmVudCgnY2FucGxheXRocm91Z2gnLCBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAg
ICB2aWRlby5jdXJyZW50VGltZSA9IDUuMDA7CisgICAgICAgICAgICAgICAgdmlkZW9DYW5QbGF5
VGhyb3VnaCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBydW5UZXN0cygpOworICAgICAgICAg
ICAgfSk7CisKKyAgICAgICAgPC9zY3JpcHQ+CisgICAgPC9oZWFkPgorICAgIDxib2R5IG9ubG9h
ZD0iYm9keUxvYWRlZCgpIj4KKyAgICAgICAgPHA+VGVzdHMgdGhhdCBhbGwgZXZlbnRzIGV2ZW50
cyBhcmUgdHJpZ2dlcmVkIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIuPC9wPgorICAgICAgICA8dmlk
ZW8gY29udHJvbHM+CisgICAgICAgICAgICA8dHJhY2sgaWQ9InRlc3RUcmFjayIgc3JjPSJjYXB0
aW9ucy13ZWJ2dHQvc29ydGVkLWRpc3BhdGNoLnZ0dCIgb25sb2FkPSJsb2FkZWQoKSIgZGVmYXVs
dD4KKyAgICAgICAgPC92aWRlbz4KKyAgICA8L2JvZHk+Cis8L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>127610</attachid>
            <date>2012-02-17 10:41:09 -0800</date>
            <delta_ts>2012-02-20 07:02:25 -0800</delta_ts>
            <desc>Merged with trunk and corrected issues and tests</desc>
            <filename>bug-72171-20120217204107.patch</filename>
            <type>text/plain</type>
            <size>47061</size>
            <attacher name="Victor Carbune">vcarbune</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4MDg0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggODZjY2UxM2NhODBmYWZj
ZDc3ZDRkZTNlZDVmMTVlMjMzMTU0MGQ3MS4uMDdiYTJiMjFhYTAzMzlmNzhiYjBhZjc1NmI3ZWFk
NGI0ZjBiMmMxNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDg1IEBACisyMDEyLTAyLTE3ICBWaWN0
b3IgQ2FyYnVuZSAgPHZpY3RvckByb3NlZHUub3JnPgorCisgICAgICAgIEFkZGVkIGNvZGUgdG8g
c3VwcG9ydCBkaXNwYXRjaGluZyBvZiBtaXNzZWQgY3VlcyBpbiBjYXNlIG9mIG5vcm1hbCBwbGF5
YmFjaworICAgICAgICBhbmQgZXZlbnQgc29ydGluZyBpbiBjYXNlIG9mIHNpbXVsdGFuZW91cyBl
dmVudCB0cmlnZ2VyaW5nLgorCisgICAgICAgIDx0cmFjaz4tcmVsYXRlZCBldmVudHMgY3VlY2hh
bmdlLCBlbnRlciwgYW5kIGV4aXQgc2hvdWxkIGJlIHNvcnRlZCBhbmQgZmlsdGVyZWQgYmVmb3Jl
IGRpc3BhdGNoaW5nCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD03MjE3MQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFRlc3RzOiBtZWRpYS90cmFjay90cmFjay1jdWVzLW1pc3NlZC5odG1sCisgICAgICAgICAg
ICAgICBtZWRpYS90cmFjay90cmFjay1jdWVzLXNvcnRlZC1iZWZvcmUtZGlzcGF0Y2guaHRtbAor
CisgICAgICAgICogaHRtbC9IVE1MTWVkaWFFbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkhUTUxNZWRpYUVsZW1lbnQ6OkhUTUxNZWRpYUVsZW1lbnQpOiBBZGRlZCBpbml0aWFsaXphdGlv
biBjb2RlCisgICAgICAgIGZvciBuZXdseSBhZGRlZCBzdGF0ZSB2YXJpYWJsZXMuCisgICAgICAg
IChXZWJDb3JlOjp0cmFja0luZGV4Q29tcGFyZSk6IFN0YXRpYyBib29sZWFuIGNvbXBhcmUgZnVu
Y3Rpb24gYmV0d2VlbgorICAgICAgICB0aGUgaW5kZXggb2YgdHdvIHRyYWNrcy4KKyAgICAgICAg
KFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6ZXZlbnRUaW1lQ3VlQ29tcGFyZSk6IFN0YXRp
YyBib29sZWFuIGNvbXBhcmUgZnVuY3Rpb24gYmV0d2VlbgorICAgICAgICBldmVudHMgYXNzb2Np
YXRlZCB3aXRoIHRleHQgdHJhY2sgY3Vlcy4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxNZWRpYUVs
ZW1lbnQ6OnVwZGF0ZUFjdGl2ZVRleHRUcmFja0N1ZXMpOiBBZGRlZCBjb2RlIHRvCisgICAgICAg
IHNvcnQgdGhlIGV2ZW50cyBhc3NvY2lhdGVkIHdpdGggdGV4dCB0cmFjayBjdWVzIGJlZm9yZSBk
aXNwYXRjaGluZy4KKyAgICAgICAgRWFjaCBzdGVwIGZyb20gdGhlIHNwZWNpZmljYXRpb24gaXMg
Y29tbWVudGVkIHdpdGhpbiB0aGUgY29kZS4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxNZWRpYUVs
ZW1lbnQ6OmZpbmlzaFNlZWspOiBBZGRlZCBhIGJvb2xlYW4gdmFyaWFibGUgdGhhdAorICAgICAg
ICBpcyBuZWVkZWQgd2l0aGluIHRoZSB0ZXh0IHRyYWNrIHVwZGF0ZSBmdW5jdGlvbiwgdG8ga25v
dyB3aGV0aGVyIGEgc2VlaworICAgICAgICBldmVudCBoYXMgb2NjdXJlZCBiZWZvcmUgb3Igbm90
LgorICAgICAgICAoV2ViQ29yZTo6SFRNTE1lZGlhRWxlbWVudDo6bWVkaWFQbGF5ZXJUaW1lQ2hh
bmdlZCk6IE1vdmVkIHRoZSB1cGRhdGUKKyAgICAgICAgY2FsbCBmb3IgdGV4dCB0cmFja3MgYXQg
dGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUgZW5kLgorICAgICAg
ICAnZW5kZWQnIGV2ZW50cyBmb3IgdmlkZW8gc2hvdWxkIGJlIGRpc3BhdGNoZWQgYWZ0ZXIgdHJh
Y2sgc3BlY2lmaWMgZXZlbnRzLgorICAgICAgICAqIGh0bWwvSFRNTE1lZGlhRWxlbWVudC5oOiBB
ZGRlZCB2YXJpYWJsZXMgdG8ga2VlcAorICAgICAgICBzdGF0ZSBpbmZvcm1hdGlvbiByZXF1aXJl
ZCBieSB0aGUgdGV4dCB0cmFjayB1cGRhdGUgYWxnb3JpdGhtIChsYXN0IHRpbWUKKyAgICAgICAg
dGhlIGFsZ29yaXRobSB3YXMgcnVuLCBhbmQgd2hldGhlciBhIHNlZWtpbmcgZXZlbnQgaGFzIG9j
Y3VyZWQpCisgICAgICAgIChIVE1MTWVkaWFFbGVtZW50KToKKworICAgICAgICAqIGh0bWwvTG9h
ZGFibGVUZXh0VHJhY2suY3BwOiBSZWZhY3RvcmVkIGZpcmVDdWVDaGFuZ2VFdmVudCBtZXRob2QK
KyAgICAgICAgKFdlYkNvcmU6OkxvYWRhYmxlVGV4dFRyYWNrOjpmaXJlQ3VlQ2hhbmdlRXZlbnQp
OiBUaGUgbWV0aG9kIGRpc3BhdGNoZXMgYQorICAgICAgICBzeW5jaHJvbm91cyBjdWUgY2hhbmdl
IGV2ZW50IGZvciB0aGUgdHJhY2sgZWxlbWVudC4KKyAgICAgICAgKiBodG1sL0xvYWRhYmxlVGV4
dFRyYWNrLmg6CisgICAgICAgIChMb2FkYWJsZVRleHRUcmFjayk6CisgICAgICAgICogaHRtbC9U
ZXh0VHJhY2suY3BwOiBNb2RpZmllZCB0aGUgZmlyZUN1ZUNoYW5nZSBtZXRob2QsIGNhY2hlZCB0
cmFjayBpbmRleC4KKyAgICAgICAgKFdlYkNvcmU6OlRleHRUcmFjazo6VGV4dFRyYWNrKToKKyAg
ICAgICAgKFdlYkNvcmU6OlRleHRUcmFjazo6dHJhY2tJbmRleCk6IENhY2hlZCB0aGUgdHJhY2sg
aW5kZXguCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRUcmFjazo6
aW52YWxpZGF0ZVRyYWNrSW5kZXgpOiBJbnZhbGlkYXRlcyB0aGUgdHJhY2suIFVzZWQKKyAgICAg
ICAgd2hlbiBhIG5ldyB0cmFjayBpcyBhZGRlZCBpbiBhIFRleHRUcmFja0xpc3QgaW5zdGFuY2Uu
CisgICAgICAgICogaHRtbC9UZXh0VHJhY2suaDoKKyAgICAgICAgKFRleHRUcmFjayk6CisgICAg
ICAgIChXZWJDb3JlOjpUZXh0VHJhY2s6OmZpcmVDdWVDaGFuZ2VFdmVudCk6IFRoZSBmaXJlQ3Vl
Q2hhbmdlRXZlbnQgaGFzIGJlZW4gY2hhbmdlZCwKKyAgICAgICAgYXMgZXZlbnRzIG5lZWQgdG8g
YmUgZmlyZWQgYXN5bmNyb25vdXNseS4KKyAgICAgICAgKiBodG1sL1RleHRUcmFja0N1ZS5jcHA6
IEFkZGVkIGludGVybmFsIHZhcmlhYmxlcyB0byBrZWVwIHRoZSBjdXJyZW50IGluZGV4CisgICAg
ICAgIHBvc2l0aW9uIGluIHRoZSB0cmFjayBjdWUgb3JkZXIuIFRoaXMgaXMgaW52YWxpZGF0ZWQg
d2hlbiBhbiBlbGVtZW50IGlzCisgICAgICAgIGluc2VydGVkIGJlZm9yZS4KKyAgICAgICAgKFdl
YkNvcmU6OlRleHRUcmFja0N1ZTo6VGV4dFRyYWNrQ3VlKToKKyAgICAgICAgKFdlYkNvcmU6OlRl
eHRUcmFja0N1ZTo6Y3VlSW5kZXgpOiBHZXR0ZXIgZm9yIHRoZSBjdWVJbmRleC4KKyAgICAgICAg
KFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dFRyYWNrQ3VlOjppbnZhbGlkYXRlQ3Vl
SW5kZXgpOiBJbnZhbGlkYXRlcyB0aGUgY3VycmVudGx5IHN0b3JlZAorICAgICAgICBjdWUgaW5k
ZXguCisgICAgICAgIChXZWJDb3JlOjpUZXh0VHJhY2tDdWU6OmRpc3BhdGNoRXZlbnQpOiBFdmVu
dCBkaXNwYXRjaGluZyBpcyBkb25lIGFzeW5jaHJvbm91c2x5CisgICAgICAgIG5vdy4gVGhpcyBz
aG91bGQgYmUgdGhlIG9ubHkgbWV0aG9kIHVzZWQgZm9yIGV2ZW50IGRpc3BhdGNoaW5nLgorICAg
ICAgICAoV2ViQ29yZTo6VGV4dFRyYWNrQ3VlOjpzZXRJc0FjdGl2ZSk6IFRoZSBzZXRJc0FjdGl2
ZSBtZXRob2Qgbm8gbG9uZ2VyIGRpc3BhdGNoZXMKKyAgICAgICAgZXZlbnRzLCBidXQgcmF0aGVy
IGp1c3QgY2hhbmdlcyB0aGUgbV9pc0FjdGl2ZSB2YXJpYWJsZS4KKyAgICAgICAgKiBodG1sL1Rl
eHRUcmFja0N1ZS5oOgorICAgICAgICAoVGV4dFRyYWNrQ3VlKToKKworICAgICAgICAqIGh0bWwv
VGV4dFRyYWNrQ3VlTGlzdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpUZXh0VHJhY2tDdWVMaXN0
OjpnZXRDdWVJbmRleCk6IFJldHJpZXZlcyB0aGUgY3VlIGluZGV4LCBpbiB0aGUgdHJhY2sgY3Vl
CisgICAgICAgIG9yZGVyLCBvZiBhIGdpdmVuIGN1ZS4KKyAgICAgICAgKFdlYkNvcmUpOgorICAg
ICAgICAoV2ViQ29yZTo6VGV4dFRyYWNrQ3VlTGlzdDo6YWRkKTogTW9kaWZpZWQgdGhlIGFkZCBt
ZXRob2Qgc3VjaCB0aGF0IGFsbCB0aGUgbmV4dCBjdWUKKyAgICAgICAgaW5kZXhlcyBhcmUgaW52
YWxpZGF0ZWQuCisgICAgICAgIChXZWJDb3JlOjpUZXh0VHJhY2tDdWVMaXN0OjppbnZhbGlkYXRl
Q3VlSW5kZXhlcyk6IEludmFsaWRhdGVzIGFsbCBjdWUgaW5kZXhlcyBzdGFydGluZworICAgICAg
ICB3aXRoIGEgc3BlY2lmaWMgcG9zaXRpb24uCisgICAgICAgICogaHRtbC9UZXh0VHJhY2tDdWVM
aXN0Lmg6CisgICAgICAgIChUZXh0VHJhY2tDdWVMaXN0KToKKyAgICAgICAgKiBodG1sL3RyYWNr
L1RleHRUcmFja0xpc3QuY3BwOgorICAgICAgICAoVGV4dFRyYWNrTGlzdDo6Z2V0VHJhY2tJbmRl
eCk6IFJldHJpZXZlcyB0aGUgdHJhY2sgaW5kZXggcG9zaXRpb24uCisgICAgICAgIChUZXh0VHJh
Y2tMaXN0OjphcHBlbmQpOiBBZGRlZCBtZXRob2QgZm9yIGludmFsaWRhdGluZyB0aGUgdGV4dCB0
cmFjayBpbmRleCBpbiBjYXNlIG9mCisgICAgICAgIGNoYW5naW5nIHRoZSBsaXN0IGNvbnRlbnRz
LgorICAgICAgICAqIGh0bWwvdHJhY2svVGV4dFRyYWNrTGlzdC5oOgorICAgICAgICAoVGV4dFRy
YWNrTGlzdCk6CisKIDIwMTItMDItMTcgIFN0ZXBoZW4gQ2hlbm5leSAgPHNjaGVubmV5QGNocm9t
aXVtLm9yZz4KIAogICAgICAgICBDcmFzaCBhdCBXZWJDb3JlOjpTVkdVc2VFbGVtZW50OjpleHBh
bmRTeW1ib2xFbGVtZW50c0luU2hhZG93VHJlZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
aHRtbC9IVE1MTWVkaWFFbGVtZW50LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTE1lZGlh
RWxlbWVudC5jcHAKaW5kZXggY2M2ZjZkNDc5MzEyM2I1YmVlMTY1MWNiNzMzYzhmMzdkYzg3ZTNj
OC4uMTNiMzAzNzM4MGQ3YTMzZWFiYzE0YjE0NzEyMDNhYzVlNGQ5Y2U2YiAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvaHRtbC9IVE1MTWVkaWFFbGVtZW50LmNwcAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9odG1sL0hUTUxNZWRpYUVsZW1lbnQuY3BwCkBAIC03Nyw2ICs3Nyw3IEBACiAjaW5jbHVk
ZSA8bGltaXRzPgogI2luY2x1ZGUgPHd0Zi9DdXJyZW50VGltZS5oPgogI2luY2x1ZGUgPHd0Zi9N
YXRoRXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL05vbkNvcHlpbmdTb3J0Lmg+CiAjaW5jbHVkZSA8
d3RmL1VpbnQ4QXJyYXkuaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CiAKQEAgLTIz
Niw2ICsyMzcsNyBAQCBIVE1MTWVkaWFFbGVtZW50OjpIVE1MTWVkaWFFbGVtZW50KGNvbnN0IFF1
YWxpZmllZE5hbWUmIHRhZ05hbWUsIERvY3VtZW50KiBkb2N1bQogI2lmIEVOQUJMRShWSURFT19U
UkFDSykKICAgICAsIG1fdHJhY2tzQXJlUmVhZHkodHJ1ZSkKICAgICAsIG1faGF2ZVZpc2libGVU
ZXh0VHJhY2soZmFsc2UpCisgICAgLCBtX2xhc3RUZXh0VHJhY2tVcGRhdGVUaW1lKC0xKQogICAg
ICwgbV90ZXh0VHJhY2tzKDApCiAgICAgLCBtX2lnbm9yZVRyYWNrRGlzcGxheVVwZGF0ZSgwKQog
I2VuZGlmCkBAIC05NDEsMzggKzk0MywyMjIgQEAgdm9pZCBIVE1MTWVkaWFFbGVtZW50Ojpsb2Fk
UmVzb3VyY2UoY29uc3QgS1VSTCYgaW5pdGlhbFVSTCwgQ29udGVudFR5cGUmIGNvbnRlbnQKIH0K
IAogI2lmIEVOQUJMRShWSURFT19UUkFDSykKK3N0YXRpYyBib29sIHRyYWNrSW5kZXhDb21wYXJl
KFRleHRUcmFjayogYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRUcmFjayog
YikKK3sKKyAgICByZXR1cm4gYS0+dHJhY2tJbmRleCgpIC0gYi0+dHJhY2tJbmRleCgpIDwgMDsK
K30KKworc3RhdGljIGJvb2wgZXZlbnRUaW1lQ3VlQ29tcGFyZShjb25zdCBzdGQ6OnBhaXI8ZG91
YmxlLCBUZXh0VHJhY2tDdWUqPiYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3Qgc3RkOjpwYWlyPGRvdWJsZSwgVGV4dFRyYWNrQ3VlKj4mIGIpCit7CisgICAgLy8gMTIg
LSBTb3J0IHRoZSB0YXNrcyBpbiBldmVudHMgaW4gYXNjZW5kaW5nIHRpbWUgb3JkZXIgKHRhc2tz
IHdpdGggZWFybGllcgorICAgIC8vIHRpbWVzIGZpcnN0KS4KKyAgICBpZiAoYS5maXJzdCAhPSBi
LmZpcnN0KQorICAgICAgICByZXR1cm4gYS5maXJzdCAtIGIuZmlyc3QgPCAwOworCisgICAgLy8g
SWYgdGhlIGN1ZXMgYmVsb25nIHRvIGRpZmZlcmVudCB0ZXh0IHRyYWNrcywgaXQgZG9lc24ndCBt
YWtlIHNlbnNlIHRvCisgICAgLy8gY29tcGFyZSB0aGUgdHdvIHRyYWNrcyBieSB0aGUgcmVsYXRp
dmUgY3VlIG9yZGVyLCBzbyByZXR1cm4gdGhlIHJlbGF0aXZlCisgICAgLy8gdHJhY2sgb3JkZXIu
CisgICAgaWYgKGEuc2Vjb25kLT50cmFjaygpICE9IGIuc2Vjb25kLT50cmFjaygpKQorICAgICAg
ICByZXR1cm4gdHJhY2tJbmRleENvbXBhcmUoYS5zZWNvbmQtPnRyYWNrKCksIGIuc2Vjb25kLT50
cmFjaygpKTsKKworICAgIC8vIDEyIC0gRnVydGhlciBzb3J0IHRhc2tzIGluIGV2ZW50cyB0aGF0
IGhhdmUgdGhlIHNhbWUgdGltZSBieSB0aGUKKyAgICAvLyByZWxhdGl2ZSB0ZXh0IHRyYWNrIGN1
ZSBvcmRlciBvZiB0aGUgdGV4dCB0cmFjayBjdWVzIGFzc29jaWF0ZWQKKyAgICAvLyB3aXRoIHRo
ZXNlIHRhc2tzLgorICAgIHJldHVybiBhLnNlY29uZC0+Y3VlSW5kZXgoKSAtIGIuc2Vjb25kLT5j
dWVJbmRleCgpIDwgMDsKK30KKworCiB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OnVwZGF0ZUFjdGl2
ZVRleHRUcmFja0N1ZXMoZmxvYXQgbW92aWVUaW1lKQogeworICAgIExPRyhNZWRpYSwgIkhUTUxN
ZWRpYUVsZW1lbnQ6OnVwZGF0ZUFjdGl2ZVRleHRUcmFja3MiKTsKKworICAgIC8vIDQuOC4xMC44
IFBsYXlpbmcgdGhlIG1lZGlhIHJlc291cmNlCisKKyAgICAvLyAgSWYgdGhlIGN1cnJlbnQgcGxh
eWJhY2sgcG9zaXRpb24gY2hhbmdlcyB3aGlsZSB0aGUgc3RlcHMgYXJlIHJ1bm5pbmcsCisgICAg
Ly8gIHRoZW4gdGhlIHVzZXIgYWdlbnQgbXVzdCB3YWl0IGZvciB0aGUgc3RlcHMgdG8gY29tcGxl
dGUsIGFuZCB0aGVuIG11c3QKKyAgICAvLyAgaW1tZWRpYXRlbHkgcmVydW4gdGhlIHN0ZXBzLgog
ICAgIGlmIChpZ25vcmVUcmFja0Rpc3BsYXlVcGRhdGVSZXF1ZXN0cygpKQogICAgICAgICByZXR1
cm47CiAKLSAgICBDdWVMaXN0IHByZXZpb3VzbHlBY3RpdmVDdWVzID0gbV9jdXJyZW50bHlBY3Rp
dmVDdWVzOwotICAgIGJvb2wgYWN0aXZlU2V0Q2hhbmdlZCA9IGZhbHNlOworICAgIC8vIDEgLSBM
ZXQgY3VycmVudCBjdWVzIGJlIGEgbGlzdCBvZiBjdWVzLCBpbml0aWFsaXplZCB0byBjb250YWlu
IGFsbCB0aGUKKyAgICAvLyBjdWVzIG9mIGFsbCB0aGUgaGlkZGVuLCBzaG93aW5nLCBvciBzaG93
aW5nIGJ5IGRlZmF1bHQgdGV4dCB0cmFja3Mgb2YgdGhlCisgICAgLy8gbWVkaWEgZWxlbWVudCAo
bm90IHRoZSBkaXNhYmxlZCBvbmVzKSB3aG9zZSBzdGFydCB0aW1lcyBhcmUgbGVzcyB0aGFuIG9y
CisgICAgLy8gZXF1YWwgdG8gdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gYW5kIHdob3Nl
IGVuZCB0aW1lcyBhcmUgZ3JlYXRlcgorICAgIC8vIHRoYW4gdGhlIGN1cnJlbnQgcGxheWJhY2sg
cG9zaXRpb24uCisgICAgVmVjdG9yPEN1ZUludGVydmFsVHJlZTo6SW50ZXJ2YWxUeXBlPiBjdXJy
ZW50Q3VlczsKKworICAgIC8vIFRoZSB1c2VyIGFnZW50IG11c3Qgc3luY2hyb25vdXNseSB1bnNl
dCBbdGhlIHRleHQgdHJhY2sgY3VlIGFjdGl2ZV0gZmxhZworICAgIC8vIHdoZW5ldmVyIC4uLiB0
aGUgbWVkaWEgZWxlbWVudCdzIHJlYWR5U3RhdGUgaXMgY2hhbmdlZCBiYWNrIHRvIEhBVkVfTk9U
SElORy4KKyAgICBpZiAobV9yZWFkeVN0YXRlICE9IEhBVkVfTk9USElORyAmJiBtX3BsYXllcikK
KyAgICAgICAgY3VycmVudEN1ZXMgPSBtX2N1ZVRyZWUuYWxsT3ZlcmxhcHMobV9jdWVUcmVlLmNy
ZWF0ZUludGVydmFsKG1vdmllVGltZSwgbW92aWVUaW1lKSk7CisKKyAgICBWZWN0b3I8Q3VlSW50
ZXJ2YWxUcmVlOjpJbnRlcnZhbFR5cGU+IGFmZmVjdGVkQ3VlczsKKyAgICBWZWN0b3I8Q3VlSW50
ZXJ2YWxUcmVlOjpJbnRlcnZhbFR5cGU+IHByZXZpb3VzQ3VlczsKKyAgICBWZWN0b3I8Q3VlSW50
ZXJ2YWxUcmVlOjpJbnRlcnZhbFR5cGU+IG1pc3NlZEN1ZXM7CisKKyAgICAvLyAyIC0gTGV0IG90
aGVyIGN1ZXMgYmUgYSBsaXN0IG9mIGN1ZXMsIGluaXRpYWxpemVkIHRvIGNvbnRhaW4gYWxsIHRo
ZSBjdWVzCisgICAgLy8gb2YgaGlkZGVuLCBzaG93aW5nLCBhbmQgc2hvd2luZyBieSBkZWZhdWx0
IHRleHQgdHJhY2tzIG9mIHRoZSBtZWRpYQorICAgIC8vIGVsZW1lbnQgdGhhdCBhcmUgbm90IHBy
ZXNlbnQgaW4gY3VycmVudCBjdWVzLgorICAgIHByZXZpb3VzQ3VlcyA9IG1fY3VycmVudGx5QWN0
aXZlQ3VlczsKKworICAgIC8vIDMgLSBMZXQgbGFzdCB0aW1lIGJlIHRoZSBjdXJyZW50IHBsYXli
YWNrIHBvc2l0aW9uIGF0IHRoZSB0aW1lIHRoaXMKKyAgICAvLyBhbGdvcml0aG0gd2FzIGxhc3Qg
cnVuIGZvciB0aGlzIG1lZGlhIGVsZW1lbnQsIGlmIHRoaXMgaXMgbm90IHRoZSBmaXJzdAorICAg
IC8vIHRpbWUgaXQgaGFzIHJ1bi4KKyAgICBmbG9hdCBsYXN0VGltZSA9IG1fbGFzdFRleHRUcmFj
a1VwZGF0ZVRpbWU7CisKKyAgICAvLyA0IC0gSWYgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRp
b24gaGFzLCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMKKyAgICAvLyBhbGdvcml0aG0gd2FzIHJ1
biwgb25seSBjaGFuZ2VkIHRocm91Z2ggaXRzIHVzdWFsIG1vbm90b25pYyBpbmNyZWFzZQorICAg
IC8vIGR1cmluZyBub3JtYWwgcGxheWJhY2ssIHRoZW4gbGV0IG1pc3NlZCBjdWVzIGJlIHRoZSBs
aXN0IG9mIGN1ZXMgaW4gb3RoZXIKKyAgICAvLyBjdWVzIHdob3NlIHN0YXJ0IHRpbWVzIGFyZSBn
cmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbGFzdCB0aW1lIGFuZCB3aG9zZQorICAgIC8vIGVuZCB0
aW1lcyBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0
aW9uLgorICAgIC8vIE90aGVyd2lzZSwgbGV0IG1pc3NlZCBjdWVzIGJlIGFuIGVtcHR5IGxpc3Qu
CisgICAgaWYgKGxhc3RUaW1lID49IDAgJiYgbV9sYXN0U2Vla1RpbWUgPD0gbGFzdFRpbWUpIHsK
KyAgICAgICAgVmVjdG9yPEN1ZUludGVydmFsVHJlZTo6SW50ZXJ2YWxUeXBlPiBwb3RlbnRpYWxs
eVNraXBwZWRDdWVzID0KKyAgICAgICAgICAgIG1fY3VlVHJlZS5hbGxPdmVybGFwcyhtX2N1ZVRy
ZWUuY3JlYXRlSW50ZXJ2YWwobGFzdFRpbWUsIG1vdmllVGltZSkpOworCisgICAgICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgcG90ZW50aWFsbHlTa2lwcGVkQ3Vlcy5zaXplKCk7ICsraSkgewor
ICAgICAgICAgICAgZmxvYXQgY3VlU3RhcnRUaW1lID0gcG90ZW50aWFsbHlTa2lwcGVkQ3Vlc1tp
XS5sb3coKTsKKyAgICAgICAgICAgIGZsb2F0IGN1ZUVuZFRpbWUgPSBwb3RlbnRpYWxseVNraXBw
ZWRDdWVzW2ldLmhpZ2goKTsKKworICAgICAgICAgICAgaWYgKGN1ZVN0YXJ0VGltZSA+IGxhc3RU
aW1lICYmIGN1ZUVuZFRpbWUgPCBtb3ZpZVRpbWUpCisgICAgICAgICAgICAgICAgbWlzc2VkQ3Vl
cy5hcHBlbmQocG90ZW50aWFsbHlTa2lwcGVkQ3Vlc1tpXSk7CisgICAgICAgIH0KKyAgICB9CiAK
LSAgICAvLyBUaGUgdXNlciBhZ2VudCBtdXN0IHN5bmNocm9ub3VzbHkgdW5zZXQgW3RoZSB0ZXh0
IHRyYWNrIGN1ZSBhY3RpdmVdIGZsYWcgd2hlbmV2ZXIgLi4uIHRoZSBtZWRpYSAKLSAgICAvLyBl
bGVtZW50J3MgcmVhZHlTdGF0ZSBpcyBjaGFuZ2VkIGJhY2sgdG8gSEFWRV9OT1RISU5HLiAKLSAg
ICBpZiAobV9yZWFkeVN0YXRlID09IEhBVkVfTk9USElORyB8fCAhbV9wbGF5ZXIpCi0gICAgICAg
IG1fY3VycmVudGx5QWN0aXZlQ3Vlcy5zaHJpbmsoMCk7Ci0gICAgZWxzZQotICAgICAgICBtX2N1
cnJlbnRseUFjdGl2ZUN1ZXMgPSBtX2N1ZVRyZWUuYWxsT3ZlcmxhcHMobV9jdWVUcmVlLmNyZWF0
ZUludGVydmFsKG1vdmllVGltZSwgbW92aWVUaW1lKSk7Ci0gICAgCi0gICAgLy8gRklYTUUoNzIx
NzEpOiBFdmVudHMgbmVlZCB0byBiZSBzb3J0ZWQgYW5kIGZpbHRlcmVkIGJlZm9yZSBkaXNwYXRj
aGluZy4KKyAgICBtX2xhc3RUZXh0VHJhY2tVcGRhdGVUaW1lID0gbW92aWVUaW1lOworCisgICAg
Ly8gNSAtIElmIHRoZSB0aW1lIHdhcyByZWFjaGVkIHRocm91Z2ggdGhlIHVzdWFsIG1vbm90b25p
YyBpbmNyZWFzZSBvZiB0aGUKKyAgICAvLyBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGR1cmlu
ZyBub3JtYWwgcGxheWJhY2ssIGFuZCBpZiB0aGUgdXNlciBhZ2VudAorICAgIC8vIGhhcyBub3Qg
ZmlyZWQgYSB0aW1ldXBkYXRlIGV2ZW50IGF0IHRoZSBlbGVtZW50IGluIHRoZSBwYXN0IDE1IHRv
IDI1MG1zCisgICAgLy8gYW5kIGlzIG5vdCBzdGlsbCBydW5uaW5nIGV2ZW50IGhhbmRsZXJzIGZv
ciBzdWNoIGFuIGV2ZW50LCB0aGVuIHRoZSB1c2VyCisgICAgLy8gYWdlbnQgbXVzdCBxdWV1ZSBh
IHRhc2sgdG8gZmlyZSBhIHNpbXBsZSBldmVudCBuYW1lZCB0aW1ldXBkYXRlIGF0IHRoZQorICAg
IC8vIGVsZW1lbnQuIChJbiB0aGUgb3RoZXIgY2FzZXMsIHN1Y2ggYXMgZXhwbGljaXQgc2Vla3Ms
IHJlbGV2YW50IGV2ZW50cyBnZXQKKyAgICAvLyBmaXJlZCBhcyBwYXJ0IG9mIHRoZSBvdmVyYWxs
IHByb2Nlc3Mgb2YgY2hhbmdpbmcgdGhlIGN1cnJlbnQgcGxheWJhY2sKKyAgICAvLyBwb3NpdGlv
bi4pCisgICAgaWYgKG1fbGFzdFNlZWtUaW1lIDw9IGxhc3RUaW1lKQorICAgICAgICBzY2hlZHVs
ZVRpbWV1cGRhdGVFdmVudChmYWxzZSk7CisKKyAgICAvLyA2IC0gSWYgYWxsIG9mIHRoZSBjdWVz
IGluIGN1cnJlbnQgY3VlcyBoYXZlIHRoZWlyIHRleHQgdHJhY2sgY3VlIGFjdGl2ZQorICAgIC8v
IGZsYWcgc2V0LCBub25lIG9mIHRoZSBjdWVzIGluIG90aGVyIGN1ZXMgaGF2ZSB0aGVpciB0ZXh0
IHRyYWNrIGN1ZSBhY3RpdmUKKyAgICAvLyBmbGFnIHNldCwgYW5kIG1pc3NlZCBjdWVzIGlzIGVt
cHR5LCB0aGVuIGFib3J0IHRoZXNlIHN0ZXBzLgorICAgIGJvb2wgYWN0aXZlU2V0Q2hhbmdlZCA9
IG1pc3NlZEN1ZXMuc2l6ZSgpOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmV2aW91
c2x5QWN0aXZlQ3Vlcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoIW1fY3VycmVudGx5QWN0
aXZlQ3Vlcy5jb250YWlucyhwcmV2aW91c2x5QWN0aXZlQ3Vlc1tpXSkpIHsKLSAgICAgICAgICAg
IHByZXZpb3VzbHlBY3RpdmVDdWVzW2ldLmRhdGEoKS0+c2V0SXNBY3RpdmUoZmFsc2UpOworICAg
IHNpemVfdCBwcmV2aW91c0N1ZXNTaXplID0gcHJldmlvdXNDdWVzLnNpemUoKTsKKyAgICBmb3Ig
KHNpemVfdCBpID0gMDsgIWFjdGl2ZVNldENoYW5nZWQgJiYgaSA8IHByZXZpb3VzQ3Vlc1NpemU7
ICsraSkKKyAgICAgICAgaWYgKCFjdXJyZW50Q3Vlcy5jb250YWlucyhwcmV2aW91c0N1ZXNbaV0p
ICYmIHByZXZpb3VzQ3Vlc1tpXS5kYXRhKCktPmlzQWN0aXZlKCkpCiAgICAgICAgICAgICBhY3Rp
dmVTZXRDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IG1fY3VycmVudGx5QWN0aXZlQ3Vlcy5zaXplKCk7ICsraSkgewotICAgICAgICBp
ZiAoIXByZXZpb3VzbHlBY3RpdmVDdWVzLmNvbnRhaW5zKG1fY3VycmVudGx5QWN0aXZlQ3Vlc1tp
XSkpIHsKLSAgICAgICAgICAgIG1fY3VycmVudGx5QWN0aXZlQ3Vlc1tpXS5kYXRhKCktPnNldElz
QWN0aXZlKHRydWUpOworCisgICAgc2l6ZV90IGN1cnJlbnRDdWVzU2l6ZSA9IGN1cnJlbnRDdWVz
LnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgIWFjdGl2ZVNldENoYW5nZWQgJiYgaSA8
IGN1cnJlbnRDdWVzU2l6ZTsgKytpKSB7CisgICAgICAgIGlmICghY3VycmVudEN1ZXNbaV0uZGF0
YSgpLT5pc0FjdGl2ZSgpKQogICAgICAgICAgICAgYWN0aXZlU2V0Q2hhbmdlZCA9IHRydWU7Ci0g
ICAgICAgIH0KICAgICB9Ci0gICAgCi0gICAgLy8gRklYTUUoNzIxNzMpOiBQYXVzZSB0aGUgbWVk
aWEgZWxlbWVudCBmb3IgY3VlcyBnb2luZyBwYXN0IHRoZWlyIGVuZFRpbWUKLSAgICAvLyBkdXJp
bmcgYSBtb25vdG9uaWMgdGltZSBpbmNyZWFzZS4KKworICAgIGlmICghYWN0aXZlU2V0Q2hhbmdl
ZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRklYTUUoNzIxNzMpOiA3IC0gSWYgdGhlIHRp
bWUgd2FzIHJlYWNoZWQgdGhyb3VnaCB0aGUgdXN1YWwgbW9ub3RvbmljCisgICAgLy8gaW5jcmVh
c2Ugb2YgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gZHVyaW5nIG5vcm1hbCBwbGF5YmFj
aywgYW5kCisgICAgLy8gdGhlcmUgYXJlIGN1ZXMgaW4gb3RoZXIgY3VlcyB0aGF0IGhhdmUgdGhl
aXIgdGV4dCB0cmFjayBjdWUgcGF1c2Utb24tZXhpdAorICAgIC8vIGZsYWcgc2V0IGFuZCB0aGF0
IGVpdGhlciBoYXZlIHRoZWlyIHRleHQgdHJhY2sgY3VlIGFjdGl2ZSBmbGFnIHNldCBvciBhcmUK
KyAgICAvLyBhbHNvIGluIG1pc3NlZCBjdWVzLCB0aGVuIGltbWVkaWF0ZWx5IHBhdXNlIHRoZSBt
ZWRpYSBlbGVtZW50LgorCisgICAgLy8gOCAtIExldCBldmVudHMgYmUgYSBsaXN0IG9mIHRhc2tz
LCBpbml0aWFsbHkgZW1wdHkuIEVhY2ggdGFzayBpbiB0aGlzCisgICAgLy8gbGlzdCB3aWxsIGJl
IGFzc29jaWF0ZWQgd2l0aCBhIHRleHQgdHJhY2ssIGEgdGV4dCB0cmFjayBjdWUsIGFuZCBhIHRp
bWUsCisgICAgLy8gd2hpY2ggYXJlIHVzZWQgdG8gc29ydCB0aGUgbGlzdCBiZWZvcmUgdGhlIHRh
c2tzIGFyZSBxdWV1ZWQuCisgICAgVmVjdG9yPHN0ZDo6cGFpcjxkb3VibGUsIFRleHRUcmFja0N1
ZSo+ID4gZXZlbnRUYXNrczsKKworICAgIC8vIDggLSBMZXQgYWZmZWN0ZWQgdHJhY2tzIGJlIGEg
bGlzdCBvZiB0ZXh0IHRyYWNrcywgaW5pdGlhbGx5IGVtcHR5LgorICAgIFZlY3RvcjxUZXh0VHJh
Y2sqPiBhZmZlY3RlZFRyYWNrczsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWlzc2Vk
Q3Vlcy5zaXplKCk7ICsraSkgeworICAgICAgICAvLyA5IC0gRm9yIGVhY2ggdGV4dCB0cmFjayBj
dWUgaW4gbWlzc2VkIGN1ZXMsIHByZXBhcmUgYW4gZXZlbnQgbmFtZWQgZW50ZXIKKyAgICAgICAg
Ly8gZm9yIHRoZSBUZXh0VHJhY2tDdWUgb2JqZWN0IHdpdGggdGhlIHRleHQgdHJhY2sgY3VlIHN0
YXJ0IHRpbWUuCisgICAgICAgIGV2ZW50VGFza3MuYXBwZW5kKHN0ZDo6bWFrZV9wYWlyKG1pc3Nl
ZEN1ZXNbaV0uZGF0YSgpLT5zdGFydFRpbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbWlzc2VkQ3Vlc1tpXS5kYXRhKCkpKTsKKworICAgICAgICAvLyAxMCAt
IEZvciBlYWNoIHRleHQgdHJhY2sgaW4gbWlzc2VkIGN1ZXMsIHByZXBhcmUgYW4gZXZlbnQKKyAg
ICAgICAgLy8gbmFtZWQgZXhpdCBmb3IgdGhlIFRleHRUcmFja0N1ZSBvYmplY3Qgd2l0aCB0aGUg
dGV4dCB0cmFjayBjdWUgZW5kCisgICAgICAgIC8vIHRpbWUuCisgICAgICAgIGV2ZW50VGFza3Mu
YXBwZW5kKHN0ZDo6bWFrZV9wYWlyKG1pc3NlZEN1ZXNbaV0uZGF0YSgpLT5lbmRUaW1lKCksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NlZEN1ZXNbaV0uZGF0
YSgpKSk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmV2aW91c0N1ZXMu
c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgLy8gMTAgLSBGb3IgZWFjaCB0ZXh0IHRyYWNrIGN1ZSBp
biBvdGhlciBjdWVzIHRoYXQgaGFzIGl0cyB0ZXh0CisgICAgICAgIC8vIHRyYWNrIGN1ZSBhY3Rp
dmUgZmxhZyBzZXQgcHJlcGFyZSBhbiBldmVudCBuYW1lZCBleGl0IGZvciB0aGUKKyAgICAgICAg
Ly8gVGV4dFRyYWNrQ3VlIG9iamVjdCB3aXRoIHRoZSB0ZXh0IHRyYWNrIGN1ZSBlbmQgdGltZS4K
KyAgICAgICAgaWYgKCFjdXJyZW50Q3Vlcy5jb250YWlucyhwcmV2aW91c0N1ZXNbaV0pKQorICAg
ICAgICAgICAgZXZlbnRUYXNrcy5hcHBlbmQoc3RkOjptYWtlX3BhaXIocHJldmlvdXNDdWVzW2ld
LmRhdGEoKS0+ZW5kVGltZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcHJldmlvdXNDdWVzW2ldLmRhdGEoKSkpOworICAgIH0KKworICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgY3VycmVudEN1ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgLy8gMTEg
LSBGb3IgZWFjaCB0ZXh0IHRyYWNrIGN1ZSBpbiBjdXJyZW50IGN1ZXMgdGhhdCBkb2VzIG5vdCBo
YXZlIGl0cworICAgICAgICAvLyB0ZXh0IHRyYWNrIGN1ZSBhY3RpdmUgZmxhZyBzZXQsIHByZXBh
cmUgYW4gZXZlbnQgbmFtZWQgZW50ZXIgZm9yIHRoZQorICAgICAgICAvLyBUZXh0VHJhY2tDdWUg
b2JqZWN0IHdpdGggdGhlIHRleHQgdHJhY2sgY3VlIHN0YXJ0IHRpbWUuCisgICAgICAgIGlmICgh
cHJldmlvdXNDdWVzLmNvbnRhaW5zKGN1cnJlbnRDdWVzW2ldKSkKKyAgICAgICAgICAgIGV2ZW50
VGFza3MuYXBwZW5kKHN0ZDo6bWFrZV9wYWlyKGN1cnJlbnRDdWVzW2ldLmRhdGEoKS0+c3RhcnRU
aW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJy
ZW50Q3Vlc1tpXS5kYXRhKCkpKTsKKyAgICB9CisKKyAgICAvLyAxMiAtIFNvcnQgdGhlIHRhc2tz
IGluIGV2ZW50cyBpbiBhc2NlbmRpbmcgdGltZSBvcmRlciAodGFza3Mgd2l0aCBlYXJsaWVyCisg
ICAgLy8gdGltZXMgZmlyc3QpLgorICAgIG5vbkNvcHlpbmdTb3J0KGV2ZW50VGFza3MuYmVnaW4o
KSwgZXZlbnRUYXNrcy5lbmQoKSwgZXZlbnRUaW1lQ3VlQ29tcGFyZSk7CisKKyAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IGV2ZW50VGFza3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCFh
ZmZlY3RlZFRyYWNrcy5jb250YWlucyhldmVudFRhc2tzW2ldLnNlY29uZC0+dHJhY2soKSkpCisg
ICAgICAgICAgICBhZmZlY3RlZFRyYWNrcy5hcHBlbmQoZXZlbnRUYXNrc1tpXS5zZWNvbmQtPnRy
YWNrKCkpOworCisgICAgICAgIC8vIDEzIC0gUXVldWUgZWFjaCB0YXNrIGluIGV2ZW50cywgaW4g
bGlzdCBvcmRlci4KKyAgICAgICAgUmVmUHRyPEV2ZW50PiBldmVudDsKKworICAgICAgICAvLyBF
YWNoIGV2ZW50IGluIGV2ZW50VGFza3MgbWF5IGJlIGVpdGhlciBhbiBlbnRlckV2ZW50IG9yIGFu
IGV4aXRFdmVudCwKKyAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHRoZSB0aW1lIHRoYXQgaXMgYXNz
b2NpYXRlZCB3aXRoIHRoZSBldmVudC4gVGhpcworICAgICAgICAvLyBjb3JyZWN0bHkgaWRlbnRp
ZmllcyB0aGUgdHlwZSBvZiB0aGUgZXZlbnQsIHNpbmNlIHRoZSBzdGFydFRpbWUgaXMKKyAgICAg
ICAgLy8gYWx3YXlzIGxlc3MgdGhhbiB0aGUgZW5kVGltZS4KKyAgICAgICAgaWYgKGV2ZW50VGFz
a3NbaV0uZmlyc3QgPT0gZXZlbnRUYXNrc1tpXS5zZWNvbmQtPnN0YXJ0VGltZSgpKQorICAgICAg
ICAgICAgZXZlbnQgPSBFdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS5lbnRlckV2ZW50LCBmYWxz
ZSwgZmFsc2UpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBldmVudCA9IEV2ZW50OjpjcmVh
dGUoZXZlbnROYW1lcygpLmV4aXRFdmVudCwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICBldmVu
dC0+c2V0VGFyZ2V0KGV2ZW50VGFza3NbaV0uc2Vjb25kKTsKKyAgICAgICAgbV9hc3luY0V2ZW50
UXVldWUuZW5xdWV1ZUV2ZW50KGV2ZW50LnJlbGVhc2UoKSk7CisgICAgfQorCisgICAgLy8gMTQg
LSBTb3J0IGFmZmVjdGVkIHRyYWNrcyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgdGV4dCB0cmFj
a3MgYXBwZWFyIGluCisgICAgLy8gdGhlIG1lZGlhIGVsZW1lbnQncyBsaXN0IG9mIHRleHQgdHJh
Y2tzLCBhbmQgcmVtb3ZlIGR1cGxpY2F0ZXMuCisgICAgbm9uQ29weWluZ1NvcnQoYWZmZWN0ZWRU
cmFja3MuYmVnaW4oKSwgYWZmZWN0ZWRUcmFja3MuZW5kKCksIHRyYWNrSW5kZXhDb21wYXJlKTsK
KworICAgIC8vIDE1IC0gRm9yIGVhY2ggdGV4dCB0cmFjayBpbiBhZmZlY3RlZCB0cmFja3MsIGlu
IHRoZSBsaXN0IG9yZGVyLCBxdWV1ZSBhCisgICAgLy8gdGFzayB0byBmaXJlIGEgc2ltcGxlIGV2
ZW50IG5hbWVkIGN1ZWNoYW5nZSBhdCB0aGUgVGV4dFRyYWNrIG9iamVjdCwgYW5kLAorICAgIC8v
IGlmIHRoZSB0ZXh0IHRyYWNrIGhhcyBhIGNvcnJlc3BvbmRpbmcgdHJhY2sgZWxlbWVudCwgdG8g
dGhlbiBmaXJlIGEKKyAgICAvLyBzaW1wbGUgZXZlbnQgbmFtZWQgY3VlY2hhbmdlIGF0IHRoZSB0
cmFjayBlbGVtZW50IGFzIHdlbGwuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhZmZlY3Rl
ZFRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICBSZWZQdHI8RXZlbnQ+IGV2ZW50ID0gRXZl
bnQ6OmNyZWF0ZShldmVudE5hbWVzKCkuY3VlY2hhbmdlRXZlbnQsIGZhbHNlLCBmYWxzZSk7Cisg
ICAgICAgIGV2ZW50LT5zZXRUYXJnZXQoYWZmZWN0ZWRUcmFja3NbaV0pOworCisgICAgICAgIG1f
YXN5bmNFdmVudFF1ZXVlLmVucXVldWVFdmVudChldmVudC5yZWxlYXNlKCkpOworCisgICAgICAg
IC8vIEZpcmUgc3luY3Jvbm91cyBjdWUgY2hhbmdlIGV2ZW50IGZvciB0cmFjayBlbGVtZW50cy4K
KyAgICAgICAgaWYgKGFmZmVjdGVkVHJhY2tzW2ldLT50cmFja1R5cGUoKSA9PSBUZXh0VHJhY2s6
OlRyYWNrRWxlbWVudCkKKyAgICAgICAgICAgIGFmZmVjdGVkVHJhY2tzW2ldLT5maXJlQ3VlQ2hh
bmdlRXZlbnQoKTsKKyAgICB9CisKKyAgICAvLyAxNiAtIFNldCB0aGUgdGV4dCB0cmFjayBjdWUg
YWN0aXZlIGZsYWcgb2YgYWxsIHRoZSBjdWVzIGluIHRoZSBjdXJyZW50CisgICAgLy8gY3Vlcywg
YW5kIHVuc2V0IHRoZSB0ZXh0IHRyYWNrIGN1ZSBhY3RpdmUgZmxhZyBvZiBhbGwgdGhlIGN1ZXMg
aW4gdGhlCisgICAgLy8gb3RoZXIgY3Vlcy4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGN1
cnJlbnRDdWVzLnNpemUoKTsgKytpKQorICAgICAgICBjdXJyZW50Q3Vlc1tpXS5kYXRhKCktPnNl
dElzQWN0aXZlKHRydWUpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmV2aW91c0N1
ZXMuc2l6ZSgpOyArK2kpCisgICAgICAgIGlmICghY3VycmVudEN1ZXMuY29udGFpbnMocHJldmlv
dXNDdWVzW2ldKSkKKyAgICAgICAgICAgIHByZXZpb3VzQ3Vlc1tpXS5kYXRhKCktPnNldElzQWN0
aXZlKGZhbHNlKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudCBhY3RpdmUgY3Vlcy4KKyAg
ICBtX2N1cnJlbnRseUFjdGl2ZUN1ZXMgPSBjdXJyZW50Q3VlczsKIAogICAgIGlmIChhY3RpdmVT
ZXRDaGFuZ2VkICYmIGhhc01lZGlhQ29udHJvbHMoKSkKICAgICAgICAgbWVkaWFDb250cm9scygp
LT51cGRhdGVUZXh0VHJhY2tEaXNwbGF5KCk7CkBAIC0yNzAzLDYgKzI4ODksMTAgQEAgdm9pZCBI
VE1MTWVkaWFFbGVtZW50OjptZWRpYVBsYXllclRpbWVDaGFuZ2VkKE1lZGlhUGxheWVyKikKIHsK
ICAgICBMT0coTWVkaWEsICJIVE1MTWVkaWFFbGVtZW50OjptZWRpYVBsYXllclRpbWVDaGFuZ2Vk
Iik7CiAKKyNpZiBFTkFCTEUoVklERU9fVFJBQ0spCisgICAgdXBkYXRlQWN0aXZlVGV4dFRyYWNr
Q3VlcyhjdXJyZW50VGltZSgpKTsKKyNlbmRpZgorCiAgICAgYmVnaW5Qcm9jZXNzaW5nTWVkaWFQ
bGF5ZXJDYWxsYmFjaygpOwogCiAgICAgaW52YWxpZGF0ZUNhY2hlZFRpbWUoKTsKQEAgLTI3NTEs
OSArMjk0MSw2IEBAIHZvaWQgSFRNTE1lZGlhRWxlbWVudDo6bWVkaWFQbGF5ZXJUaW1lQ2hhbmdl
ZChNZWRpYVBsYXllciopCiAgICAgICAgIG1fc2VudEVuZEV2ZW50ID0gZmFsc2U7CiAKICAgICB1
cGRhdGVQbGF5U3RhdGUoKTsKLSNpZiBFTkFCTEUoVklERU9fVFJBQ0spCi0gICAgdXBkYXRlQWN0
aXZlVGV4dFRyYWNrQ3Vlcyhub3cpOwotI2VuZGlmCiAgICAgZW5kUHJvY2Vzc2luZ01lZGlhUGxh
eWVyQ2FsbGJhY2soKTsKIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9IVE1M
TWVkaWFFbGVtZW50LmggYi9Tb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxNZWRpYUVsZW1lbnQuaApp
bmRleCA3NmMyNGNiYWI3ZjBmY2M2YzI4ZmE4MjBiMzg3ZDdiYzFhZmYwNzgwLi4zMmE0NGNjNGEx
YTljYWEzODkyMjA4YTk0NzJjMjVjNmM2Y2U2ZTc0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9odG1sL0hUTUxNZWRpYUVsZW1lbnQuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxN
ZWRpYUVsZW1lbnQuaApAQCAtNTk1LDEwICs1OTUsMTMgQEAgcHJpdmF0ZToKICNpZiBFTkFCTEUo
VklERU9fVFJBQ0spCiAgICAgYm9vbCBtX3RyYWNrc0FyZVJlYWR5IDogMTsKICAgICBib29sIG1f
aGF2ZVZpc2libGVUZXh0VHJhY2sgOiAxOworICAgIGZsb2F0IG1fbGFzdFRleHRUcmFja1VwZGF0
ZVRpbWU7CiAKICAgICBSZWZQdHI8VGV4dFRyYWNrTGlzdD4gbV90ZXh0VHJhY2tzOwogICAgIFZl
Y3RvcjxSZWZQdHI8VGV4dFRyYWNrPiA+IG1fdGV4dFRyYWNrc1doZW5SZXNvdXJjZVNlbGVjdGlv
bkJlZ2FuOworCiAgICAgQ3VlSW50ZXJ2YWxUcmVlIG1fY3VlVHJlZTsKKwogICAgIEN1ZUxpc3Qg
bV9jdXJyZW50bHlBY3RpdmVDdWVzOwogICAgIGludCBtX2lnbm9yZVRyYWNrRGlzcGxheVVwZGF0
ZTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9Mb2FkYWJsZVRleHRU
cmFjay5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL0xvYWRhYmxlVGV4dFRyYWNrLmNwcAppbmRl
eCBiNDhkOGM3Y2IyYmE2NTJlNzgxNTdhNDgwNDkzYWY1YzMzOGFlMTliLi40MDBiNDJjMmMzZTA1
YjRiMzE1ODFkNTc1NmRiYTY0Zjc1NWFjYmJmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9o
dG1sL0xvYWRhYmxlVGV4dFRyYWNrLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL0xvYWRh
YmxlVGV4dFRyYWNrLmNwcApAQCAtMTI1LDkgKzEyNSwxMCBAQCB2b2lkIExvYWRhYmxlVGV4dFRy
YWNrOjpjdWVMb2FkaW5nQ29tcGxldGVkKFRleHRUcmFja0xvYWRlciogbG9hZGVyLCBib29sIGxv
YWRpbgogCiB2b2lkIExvYWRhYmxlVGV4dFRyYWNrOjpmaXJlQ3VlQ2hhbmdlRXZlbnQoKQogewot
ICAgIFRleHRUcmFjazo6ZmlyZUN1ZUNoYW5nZUV2ZW50KCk7CisgICAgUmVmUHRyPEV2ZW50PiBl
dmVudCA9IEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLmN1ZWNoYW5nZUV2ZW50LCBmYWxzZSwg
ZmFsc2UpOwogICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwotICAgIG1fdHJhY2tFbGVtZW50LT5k
aXNwYXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLmN1ZWNoYW5nZUV2ZW50LCBm
YWxzZSwgZmFsc2UpLCBlYyk7CisKKyAgICBtX3RyYWNrRWxlbWVudC0+ZGlzcGF0Y2hFdmVudChl
dmVudCwgZWMpOwogfQogCiBzaXplX3QgTG9hZGFibGVUZXh0VHJhY2s6OnRyYWNrRWxlbWVudElu
ZGV4KCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvTG9hZGFibGVUZXh0VHJhY2su
aCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvTG9hZGFibGVUZXh0VHJhY2suaAppbmRleCBiNzAxMjI1
MzY4MzIzZGU3Zjg5ZmFlYjEyMzdhNDk4MTlmYTk5ZGY1Li43ODNjZGZhN2Y5ZjhjNTk2MTk0NmEz
M2FjNzBkYjcwOGM2ODlhYWEyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1sL0xvYWRh
YmxlVGV4dFRyYWNrLmgKKysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC9Mb2FkYWJsZVRleHRUcmFj
ay5oCkBAIC01NywxMCArNTcsMTIgQEAgcHVibGljOgogICAgIHZvaWQgc2NoZWR1bGVMb2FkKGNv
bnN0IEtVUkwmKTsKIAogICAgIHZpcnR1YWwgdm9pZCBjbGVhckNsaWVudCgpOwotICAgIAorCiAg
ICAgc2l6ZV90IHRyYWNrRWxlbWVudEluZGV4KCk7CiAgICAgSFRNTFRyYWNrRWxlbWVudCogdHJh
Y2tFbGVtZW50KCkgeyByZXR1cm4gbV90cmFja0VsZW1lbnQ7IH0KIAorICAgIHZpcnR1YWwgdm9p
ZCBmaXJlQ3VlQ2hhbmdlRXZlbnQoKTsKKwogcHJpdmF0ZToKICAgICAvLyBUZXh0VHJhY2tMb2Fk
ZXJDbGllbnQKICAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkTG9hZEN1ZXMoVGV4dFRyYWNrTG9hZGVy
KikgeyByZXR1cm4gdHJ1ZTsgfQpAQCAtNzEsOCArNzMsNiBAQCBwcml2YXRlOgogICAgIExvYWRh
YmxlVGV4dFRyYWNrKEhUTUxUcmFja0VsZW1lbnQqLCBjb25zdCBTdHJpbmcmIGtpbmQsIGNvbnN0
IFN0cmluZyYgbGFiZWwsIGNvbnN0IFN0cmluZyYgbGFuZ3VhZ2UsIGJvb2wgaXNEZWZhdWx0KTsK
IAogICAgIHZvaWQgbG9hZFRpbWVyRmlyZWQoVGltZXI8TG9hZGFibGVUZXh0VHJhY2s+Kik7Ci0g
ICAgCi0gICAgdmlydHVhbCB2b2lkIGZpcmVDdWVDaGFuZ2VFdmVudCgpOwogCiAgICAgSFRNTFRy
YWNrRWxlbWVudCogbV90cmFja0VsZW1lbnQ7CiAgICAgVGltZXI8TG9hZGFibGVUZXh0VHJhY2s+
IG1fbG9hZFRpbWVyOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2su
Y3BwIGIvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2suY3BwCmluZGV4IGVlOGZlZDkxMzMw
OTE2YTY2ODQ5YzdiMzg2MmY3ODZlMmU2YTY1M2YuLjE3NTE3MWZkMzUzZDYyYzUyYTU4OWM3NzI5
YTIwY2UzM2Y1ZTgxNmQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNr
LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFjay5jcHAKQEAgLTM3LDExICsz
NywxNSBAQAogCiAjaW5jbHVkZSAiRXZlbnQuaCIKICNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgi
CisjaW5jbHVkZSAiSFRNTE1lZGlhRWxlbWVudC5oIgogI2luY2x1ZGUgIlRleHRUcmFja0N1ZUxp
c3QuaCIKKyNpbmNsdWRlICJUZXh0VHJhY2tMaXN0LmgiCiAjaW5jbHVkZSAiVHJhY2tCYXNlLmgi
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorc3RhdGljIGNvbnN0IGludCBpbnZhbGlkVHJhY2tJ
bmRleCA9IC0xOworCiBjb25zdCBBdG9taWNTdHJpbmcmIFRleHRUcmFjazo6c3VidGl0bGVzS2V5
d29yZCgpCiB7CiAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBBdG9taWNTdHJpbmcsIHN1
YnRpdGxlcywgKCJzdWJ0aXRsZXMiKSk7CkBAIC04Miw2ICs4Niw3IEBAIFRleHRUcmFjazo6VGV4
dFRyYWNrKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQsIFRleHRUcmFja0NsaWVudCog
Y2xpZW50LCBjCiAgICAgLCBtX3RyYWNrVHlwZSh0eXBlKQogICAgICwgbV9yZWFkaW5lc3NTdGF0
ZShOb3RMb2FkZWQpCiAgICAgLCBtX3Nob3dpbmdCeURlZmF1bHQoZmFsc2UpCisgICAgLCBtX3Ry
YWNrSW5kZXgoaW52YWxpZFRyYWNrSW5kZXgpCiB7CiAgICAgc2V0S2luZChraW5kKTsKIH0KQEAg
LTI0MywxMiArMjQ4LDYgQEAgdm9pZCBUZXh0VHJhY2s6OnJlbW92ZUN1ZShUZXh0VHJhY2tDdWUq
IGN1ZSwgRXhjZXB0aW9uQ29kZSYgZWMpCiAgICAgICAgIG1fY2xpZW50LT50ZXh0VHJhY2tSZW1v
dmVDdWUodGhpcywgY3VlKTsKIH0KIAotdm9pZCBUZXh0VHJhY2s6OmZpcmVDdWVDaGFuZ2VFdmVu
dCgpCi17Ci0gICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgZGlzcGF0Y2hFdmVudChFdmVu
dDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS5jdWVjaGFuZ2VFdmVudCwgZmFsc2UsIGZhbHNlKSwgZWMp
OwotfQotICAgIAogdm9pZCBUZXh0VHJhY2s6OmN1ZVdpbGxDaGFuZ2UoVGV4dFRyYWNrQ3VlKiBj
dWUpCiB7CiAgICAgaWYgKCFtX2NsaWVudCkKQEAgLTI2OCw2ICsyNjcsMjEgQEAgdm9pZCBUZXh0
VHJhY2s6OmN1ZURpZENoYW5nZShUZXh0VHJhY2tDdWUqIGN1ZSkKICAgICBtX2NsaWVudC0+dGV4
dFRyYWNrQWRkQ3VlKHRoaXMsIGN1ZSk7CiB9CiAKK2ludCBUZXh0VHJhY2s6OnRyYWNrSW5kZXgo
KQoreworICAgIEFTU0VSVChtX21lZGlhRWxlbWVudCk7CisKKyAgICBpZiAobV90cmFja0luZGV4
ID09IGludmFsaWRUcmFja0luZGV4KQorICAgICAgICBtX3RyYWNrSW5kZXggPSBtX21lZGlhRWxl
bWVudC0+dGV4dFRyYWNrcygpLT5nZXRUcmFja0luZGV4KHRoaXMpOworCisgICAgcmV0dXJuIG1f
dHJhY2tJbmRleDsKK30KKwordm9pZCBUZXh0VHJhY2s6OmludmFsaWRhdGVUcmFja0luZGV4KCkK
K3sKKyAgICBtX3RyYWNrSW5kZXggPSBpbnZhbGlkVHJhY2tJbmRleDsKK30KKwogVGV4dFRyYWNr
Q3VlTGlzdCogVGV4dFRyYWNrOjplbnN1cmVUZXh0VHJhY2tDdWVMaXN0KCkKIHsKICAgICBpZiAo
IW1fY3VlcykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrLmggYi9T
b3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFjay5oCmluZGV4IGNhNmRiMTFlYzU5NTI1YmNkM2E1
MDE5MDg2ZThlYTEyYTNmNTc3OTcuLjlhOGViOGJiNGFhZTM0NDdkMDhkNjc1ZWE2YWI4MTgyOTRm
OTE2MWIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrLmgKKysrIGIv
U291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2suaApAQCAtNTksNyArNTksNyBAQCBwdWJsaWM6
CiAgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgVGV4dFRyYWNrKGNvbnRleHQsIGNsaWVudCwg
a2luZCwgbGFiZWwsIGxhbmd1YWdlLCBBZGRUcmFjaykpOwogICAgIH0KICAgICB2aXJ0dWFsIH5U
ZXh0VHJhY2soKTsKLSAgICAKKwogICAgIHZvaWQgc2V0TWVkaWFFbGVtZW50KEhUTUxNZWRpYUVs
ZW1lbnQqIGVsZW1lbnQpIHsgbV9tZWRpYUVsZW1lbnQgPSBlbGVtZW50OyB9CiAgICAgSFRNTE1l
ZGlhRWxlbWVudCogbWVkaWFFbGVtZW50KCkgeyByZXR1cm4gbV9tZWRpYUVsZW1lbnQ7IH0KIApA
QCAtOTksMTUgKzk5LDE5IEBAIHB1YmxpYzoKICAgICB2b2lkIGFkZEN1ZShQYXNzUmVmUHRyPFRl
eHRUcmFja0N1ZT4sIEV4Y2VwdGlvbkNvZGUmKTsKICAgICB2b2lkIHJlbW92ZUN1ZShUZXh0VHJh
Y2tDdWUqLCBFeGNlcHRpb25Db2RlJik7CiAKKyAgICB2aXJ0dWFsIHZvaWQgZmlyZUN1ZUNoYW5n
ZUV2ZW50KCkgeyB9OworCiAgICAgdm9pZCBjdWVXaWxsQ2hhbmdlKFRleHRUcmFja0N1ZSopOwog
ICAgIHZvaWQgY3VlRGlkQ2hhbmdlKFRleHRUcmFja0N1ZSopOwotICAgIAotICAgIHZpcnR1YWwg
dm9pZCBmaXJlQ3VlQ2hhbmdlRXZlbnQoKTsKKwogICAgIERFRklORV9BVFRSSUJVVEVfRVZFTlRf
TElTVEVORVIoY3VlY2hhbmdlKTsKIAogICAgIGVudW0gVGV4dFRyYWNrVHlwZSB7IFRyYWNrRWxl
bWVudCwgQWRkVHJhY2ssIEluQmFuZCB9OwogICAgIFRleHRUcmFja1R5cGUgdHJhY2tUeXBlKCkg
Y29uc3QgeyByZXR1cm4gbV90cmFja1R5cGU7IH0KIAorICAgIGludCB0cmFja0luZGV4KCk7Cisg
ICAgdm9pZCBpbnZhbGlkYXRlVHJhY2tJbmRleCgpOworCiBwcm90ZWN0ZWQ6CiAgICAgVGV4dFRy
YWNrKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBUZXh0VHJhY2tDbGllbnQqLCBjb25zdCBTdHJp
bmcmIGtpbmQsIGNvbnN0IFN0cmluZyYgbGFiZWwsIGNvbnN0IFN0cmluZyYgbGFuZ3VhZ2UsIFRl
eHRUcmFja1R5cGUpOwogCkBAIC0xMjQsNiArMTI4LDcgQEAgcHJpdmF0ZToKICAgICBUZXh0VHJh
Y2tUeXBlIG1fdHJhY2tUeXBlOwogICAgIFJlYWRpbmVzc1N0YXRlIG1fcmVhZGluZXNzU3RhdGU7
CiAgICAgYm9vbCBtX3Nob3dpbmdCeURlZmF1bHQ7CisgICAgaW50IG1fdHJhY2tJbmRleDsKIH07
CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2h0
bWwvVGV4dFRyYWNrQ3VlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlLmNw
cAppbmRleCBlMWMwMTI2NmU3NjZiYzVjMDliMDg5OTZmNTk2YmRjNzhhZjllZTRiLi41OWMzZjNl
YTBlMzFlNTE3MmQ4NjI0YTA2OTY5MTkxZWEyZWFmNjhlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9odG1sL1RleHRUcmFja0N1ZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0
VHJhY2tDdWUuY3BwCkBAIC0zOCwxMSArMzgsMTQgQEAKICNpbmNsdWRlICJFdmVudC5oIgogI2lu
Y2x1ZGUgIkRvY3VtZW50RnJhZ21lbnQuaCIKICNpbmNsdWRlICJUZXh0VHJhY2suaCIKKyNpbmNs
dWRlICJUZXh0VHJhY2tDdWVMaXN0LmgiCiAjaW5jbHVkZSAiV2ViVlRUUGFyc2VyLmgiCiAjaW5j
bHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
K3N0YXRpYyBjb25zdCBpbnQgaW52YWxpZEN1ZUluZGV4ID0gLTE7CisKIHN0YXRpYyBjb25zdCBB
dG9taWNTdHJpbmcmIHN0YXJ0S2V5d29yZCgpCiB7CiAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChj
b25zdCBBdG9taWNTdHJpbmcsIHN0YXJ0LCAoInN0YXJ0IikpOwpAQCAtODcsNiArOTAsNyBAQCBU
ZXh0VHJhY2tDdWU6OlRleHRUcmFja0N1ZShTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBjb250ZXh0
LCBjb25zdCBTdHJpbmcmIGlkLCBkbwogICAgICwgbV9saW5lUG9zaXRpb24oLTEpCiAgICAgLCBt
X3RleHRQb3NpdGlvbig1MCkKICAgICAsIG1fY3VlU2l6ZSgxMDApCisgICAgLCBtX2N1ZUluZGV4
KGludmFsaWRDdWVJbmRleCkKICAgICAsIG1fY3VlQWxpZ25tZW50KE1pZGRsZSkKICAgICAsIG1f
c2NyaXB0RXhlY3V0aW9uQ29udGV4dChjb250ZXh0KQogICAgICwgbV9pc0FjdGl2ZShmYWxzZSkK
QEAgLTMyNCw2ICszMjgsMTkgQEAgdm9pZCBUZXh0VHJhY2tDdWU6OnNldFRleHQoY29uc3QgU3Ry
aW5nJiB0ZXh0KQogICAgIGN1ZURpZENoYW5nZSgpOwogfQogCitpbnQgVGV4dFRyYWNrQ3VlOjpj
dWVJbmRleCgpCit7CisgICAgaWYgKG1fY3VlSW5kZXggPT0gaW52YWxpZEN1ZUluZGV4KQorICAg
ICAgICBtX2N1ZUluZGV4ID0gdHJhY2soKS0+Y3VlcygpLT5nZXRDdWVJbmRleCh0aGlzKTsKKwor
ICAgIHJldHVybiBtX2N1ZUluZGV4OworfQorCit2b2lkIFRleHRUcmFja0N1ZTo6aW52YWxpZGF0
ZUN1ZUluZGV4KCkKK3sKKyAgICBtX2N1ZUluZGV4ID0gaW52YWxpZEN1ZUluZGV4OworfQorCiBQ
YXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IFRleHRUcmFja0N1ZTo6Z2V0Q3VlQXNIVE1MKCkK
IHsKICAgICBpZiAoIW1fZG9jdW1lbnRGcmFnbWVudCkKQEAgLTMzNyw2ICszNTQsMjAgQEAgdm9p
ZCBUZXh0VHJhY2tDdWU6OnNldEN1ZUhUTUwoUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBm
cmFnbWVudCkKICAgICBtX2RvY3VtZW50RnJhZ21lbnQgPSBmcmFnbWVudDsKIH0KIAorYm9vbCBU
ZXh0VHJhY2tDdWU6OmRpc3BhdGNoRXZlbnQoUGFzc1JlZlB0cjxFdmVudD4gZXZlbnQpCit7Cisg
ICAgLy8gV2hlbiBhIFRleHRUcmFjaydzIG1vZGUgaXMgZGlzYWJsZWQ6IG5vIGN1ZXMgYXJlIGFj
dGl2ZSwgbm8gZXZlbnRzIGZpcmVkLgorICAgIGlmICghdHJhY2soKSB8fCB0cmFjaygpLT5tb2Rl
KCkgPT0gVGV4dFRyYWNrOjpESVNBQkxFRCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
cmV0dXJuIEV2ZW50VGFyZ2V0OjpkaXNwYXRjaEV2ZW50KGV2ZW50KTsKK30KKworYm9vbCBUZXh0
VHJhY2tDdWU6OmRpc3BhdGNoRXZlbnQoUGFzc1JlZlB0cjxFdmVudD4gZXZlbnQsIEV4Y2VwdGlv
bkNvZGUgJmVjKQoreworICAgIHJldHVybiBFdmVudFRhcmdldDo6ZGlzcGF0Y2hFdmVudChldmVu
dCwgZWMpOworfQorCiBib29sIFRleHRUcmFja0N1ZTo6aXNBY3RpdmUoKQogewogICAgIHJldHVy
biBtX2lzQWN0aXZlICYmIHRyYWNrKCkgJiYgdHJhY2soKS0+bW9kZSgpICE9IFRleHRUcmFjazo6
RElTQUJMRUQ7CkBAIC0zNDUsMTkgKzM3Niw2IEBAIGJvb2wgVGV4dFRyYWNrQ3VlOjppc0FjdGl2
ZSgpCiB2b2lkIFRleHRUcmFja0N1ZTo6c2V0SXNBY3RpdmUoYm9vbCBhY3RpdmUpCiB7CiAgICAg
bV9pc0FjdGl2ZSA9IGFjdGl2ZTsKLQotICAgIC8vIFdoZW4gYSBUZXh0VHJhY2sncyBtb2RlIGlz
IGRpc2FibGVkOiBObyBjdWVzIGFyZSBhY3RpdmUsIG5vIGV2ZW50cyBhcmUgZmlyZWQgLi4uCi0g
ICAgaWYgKCF0cmFjaygpIHx8IHRyYWNrKCktPm1vZGUoKSA9PSBUZXh0VHJhY2s6OkRJU0FCTEVE
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKLSAgICBpZiAo
YWN0aXZlKQotICAgICAgICBkaXNwYXRjaEV2ZW50KEV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygp
LmVudGVyRXZlbnQsIGZhbHNlLCBmYWxzZSksIGVjKTsKLSAgICBlbHNlCi0gICAgICAgIGRpc3Bh
dGNoRXZlbnQoRXZlbnQ6OmNyZWF0ZShldmVudE5hbWVzKCkuZXhpdEV2ZW50LCBmYWxzZSwgZmFs
c2UpLCBlYyk7Ci0KLSAgICBpZiAobV90cmFjaykKLSAgICAgICAgbV90cmFjay0+ZmlyZUN1ZUNo
YW5nZUV2ZW50KCk7CiB9CiAKIHZvaWQgVGV4dFRyYWNrQ3VlOjpwYXJzZVNldHRpbmdzKGNvbnN0
IFN0cmluZyYgaW5wdXQpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRUcmFj
a0N1ZS5oIGIvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2tDdWUuaAppbmRleCAxNmZhZjYz
Y2FmYTZmYzBjNTRmMzEwOGYyN2NjZmNjNDVjMzk4OGM0Li5iM2UwZjMyYTU4MmM3YTFiNDJmMDRl
NmJlNDU1NjhiNzM2MjgzNTFmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRU
cmFja0N1ZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlLmgKQEAgLTUw
LDcgKzUwLDcgQEAgcHVibGljOgogICAgIHsKICAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBU
ZXh0VHJhY2tDdWUoY29udGV4dCwgaWQsIHN0YXJ0LCBlbmQsIGNvbnRlbnQsIHNldHRpbmdzLCBw
YXVzZU9uRXhpdCkpOwogICAgIH0KLSAgICAKKwogICAgIGVudW0gRGlyZWN0aW9uIHsgSG9yaXpv
bnRhbCwgVmVydGljYWxHcm93aW5nTGVmdCwgVmVydGljYWxHcm93aW5nUmlnaHQgfTsKICAgICBl
bnVtIEFsaWdubWVudCB7IFN0YXJ0LCBNaWRkbGUsIEVuZCB9OwogCkBAIC05MiwxMiArOTIsMTgg
QEAgcHVibGljOgogICAgIGNvbnN0IFN0cmluZyYgdGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fY29u
dGVudDsgfQogICAgIHZvaWQgc2V0VGV4dChjb25zdCBTdHJpbmcmKTsKIAorICAgIGludCBjdWVJ
bmRleCgpOworICAgIHZvaWQgaW52YWxpZGF0ZUN1ZUluZGV4KCk7CisKICAgICBQYXNzUmVmUHRy
PERvY3VtZW50RnJhZ21lbnQ+IGdldEN1ZUFzSFRNTCgpOwogICAgIHZvaWQgc2V0Q3VlSFRNTChQ
YXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+KTsKIAorICAgIHZpcnR1YWwgYm9vbCBkaXNwYXRj
aEV2ZW50KFBhc3NSZWZQdHI8RXZlbnQ+KTsKKyAgICBib29sIGRpc3BhdGNoRXZlbnQoUGFzc1Jl
ZlB0cjxFdmVudD4sIEV4Y2VwdGlvbkNvZGUmKTsKKwogICAgIGJvb2wgaXNBY3RpdmUoKTsKICAg
ICB2b2lkIHNldElzQWN0aXZlKGJvb2wpOwotICAgIAorCiAgICAgdmlydHVhbCBjb25zdCBBdG9t
aWNTdHJpbmcmIGludGVyZmFjZU5hbWUoKSBjb25zdDsKICAgICB2aXJ0dWFsIFNjcmlwdEV4ZWN1
dGlvbkNvbnRleHQqIHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQoKSBjb25zdDsKIApAQCAtMTE4LDEw
ICsxMjQsMTAgQEAgcHJpdmF0ZToKICAgICB2b2lkIHBhcnNlU2V0dGluZ3MoY29uc3QgU3RyaW5n
Jik7CiAgICAgdm9pZCBjdWVXaWxsQ2hhbmdlKCk7CiAgICAgdm9pZCBjdWVEaWRDaGFuZ2UoKTsK
LSAgICAKKwogICAgIHZpcnR1YWwgdm9pZCByZWZFdmVudFRhcmdldCgpIHsgcmVmKCk7IH0KICAg
ICB2aXJ0dWFsIHZvaWQgZGVyZWZFdmVudFRhcmdldCgpIHsgZGVyZWYoKTsgfQotICAgIAorCiAg
ICAgU3RyaW5nIG1faWQ7CiAgICAgZG91YmxlIG1fc3RhcnRUaW1lOwogICAgIGRvdWJsZSBtX2Vu
ZFRpbWU7CkBAIC0xMzAsNiArMTM2LDggQEAgcHJpdmF0ZToKICAgICBpbnQgbV9saW5lUG9zaXRp
b247CiAgICAgaW50IG1fdGV4dFBvc2l0aW9uOwogICAgIGludCBtX2N1ZVNpemU7CisgICAgaW50
IG1fY3VlSW5kZXg7CisKICAgICBBbGlnbm1lbnQgbV9jdWVBbGlnbm1lbnQ7CiAgICAgUmVmUHRy
PERvY3VtZW50RnJhZ21lbnQ+IG1fZG9jdW1lbnRGcmFnbWVudDsKICAgICBSZWZQdHI8VGV4dFRy
YWNrPiBtX3RyYWNrOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvaHRtbC9UZXh0VHJhY2tD
dWVMaXN0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlTGlzdC5jcHAKaW5k
ZXggMzRiNzFjYTFiMDU4YWYzYjllY2IyZDg1ZjM2MjE1OTJiZGIzYmZkMC4uMzkxYjJmNjUxZTFi
ZDNmODE1NzJmMTI0MWM1NTcyNzJlMzE3NDk0MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
aHRtbC9UZXh0VHJhY2tDdWVMaXN0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9odG1sL1RleHRU
cmFja0N1ZUxpc3QuY3BwCkBAIC00MCw2ICs0MCwxMSBAQCB1bnNpZ25lZCBsb25nIFRleHRUcmFj
a0N1ZUxpc3Q6Omxlbmd0aCgpIGNvbnN0CiAgICAgcmV0dXJuIG1fbGlzdC5zaXplKCk7CiB9CiAK
K3Vuc2lnbmVkIGxvbmcgVGV4dFRyYWNrQ3VlTGlzdDo6Z2V0Q3VlSW5kZXgoVGV4dFRyYWNrQ3Vl
KiBjdWUpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fbGlzdC5maW5kKGN1ZSk7Cit9CisKIFRleHRU
cmFja0N1ZSogVGV4dFRyYWNrQ3VlTGlzdDo6aXRlbSh1bnNpZ25lZCBpbmRleCkgY29uc3QKIHsK
ICAgICBpZiAoaW5kZXggPCBtX2xpc3Quc2l6ZSgpKQpAQCAtODgsNiArOTMsNyBAQCBib29sIFRl
eHRUcmFja0N1ZUxpc3Q6OmFkZChQYXNzUmVmUHRyPFRleHRUcmFja0N1ZT4gcHJwQ3VlLCBzaXpl
X3Qgc3RhcnQsIHNpemVfdAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgbV9s
aXN0Lmluc2VydChzdGFydCwgY3VlKTsKKyAgICAgICBpbnZhbGlkYXRlQ3VlSW5kZXhlcyhzdGFy
dCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC0xMTksNiArMTI1LDEyIEBAIHZv
aWQgVGV4dFRyYWNrQ3VlTGlzdDo6Y2xlYXIoKQogICAgIG1fbGlzdC5jbGVhcigpOwogfQogCit2
b2lkIFRleHRUcmFja0N1ZUxpc3Q6OmludmFsaWRhdGVDdWVJbmRleGVzKHNpemVfdCBzdGFydCkK
K3sKKyAgICBmb3IgKHNpemVfdCBpID0gc3RhcnQ7IGkgPCBtX2xpc3Quc2l6ZSgpOyArK2kpCisg
ICAgICAgIG1fbGlzdFtpXS0+aW52YWxpZGF0ZUN1ZUluZGV4KCk7Cit9CisKIH0gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL1Rl
eHRUcmFja0N1ZUxpc3QuaCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4dFRyYWNrQ3VlTGlzdC5o
CmluZGV4IDdhN2Y5MDQxNWE3ZmViNmZjZGQ2NWE0ODFkY2NjMDE2NjY5ZTI5ZTguLjkwYjE5YTVi
ZTJmYzJkOTRjNDI5YWMwM2M4ZGY2MjViZDZiMzA1Y2IgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL2h0bWwvVGV4dFRyYWNrQ3VlTGlzdC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvVGV4
dFRyYWNrQ3VlTGlzdC5oCkBAIC00NSw2ICs0NSw4IEBAIHB1YmxpYzoKICAgICB+VGV4dFRyYWNr
Q3VlTGlzdCgpIHsgfQogCiAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGgoKSBjb25zdDsKKyAgICB1
bnNpZ25lZCBsb25nIGdldEN1ZUluZGV4KFRleHRUcmFja0N1ZSopIGNvbnN0OworCiAgICAgVGV4
dFRyYWNrQ3VlKiBpdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdDsKICAgICBUZXh0VHJhY2tDdWUq
IGdldEN1ZUJ5SWQoY29uc3QgU3RyaW5nJikgY29uc3Q7CiAgICAgVGV4dFRyYWNrQ3VlTGlzdCog
YWN0aXZlQ3VlcygpOwpAQCAtNTcsMTAgKzU5LDExIEBAIHByaXZhdGU6CiAgICAgVGV4dFRyYWNr
Q3VlTGlzdCgpOwogICAgIGJvb2wgYWRkKFBhc3NSZWZQdHI8VGV4dFRyYWNrQ3VlPiwgc2l6ZV90
LCBzaXplX3QpOwogICAgIHZvaWQgY2xlYXIoKTsKLSAgICAKKyAgICB2b2lkIGludmFsaWRhdGVD
dWVJbmRleGVzKHNpemVfdCk7CisKICAgICBWZWN0b3I8UmVmUHRyPFRleHRUcmFja0N1ZT4gPiBt
X2xpc3Q7CiAgICAgUmVmUHRyPFRleHRUcmFja0N1ZUxpc3Q+IG1fYWN0aXZlQ3VlczsKLSAgICAK
KwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvaHRtbC90cmFjay9UZXh0VHJhY2tMaXN0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvdHJh
Y2svVGV4dFRyYWNrTGlzdC5jcHAKaW5kZXggNzdkOTY3M2Q0MzE2NDFiNDcxYjRhOTZkN2JiZWE3
MWUyZjU0MDJjOC4uZWFkMTk1MDcxNjM0NzRlMDU2MGZkMDRlZmVlYjdhNjVmNDhhNWY4MiAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvaHRtbC90cmFjay9UZXh0VHJhY2tMaXN0LmNwcAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9odG1sL3RyYWNrL1RleHRUcmFja0xpc3QuY3BwCkBAIC01NSw2ICs1
NSwxOSBAQCB1bnNpZ25lZCBUZXh0VHJhY2tMaXN0OjpsZW5ndGgoKSBjb25zdAogICAgIHJldHVy
biBtX2FkZFRyYWNrVHJhY2tzLnNpemUoKSArIG1fZWxlbWVudFRyYWNrcy5zaXplKCk7CiB9CiAK
K3Vuc2lnbmVkIFRleHRUcmFja0xpc3Q6OmdldFRyYWNrSW5kZXgoVGV4dFRyYWNrICp0ZXh0VHJh
Y2spCit7CisgICAgaWYgKHRleHRUcmFjay0+dHJhY2tUeXBlKCkgPT0gVGV4dFRyYWNrOjpUcmFj
a0VsZW1lbnQpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxMb2FkYWJsZVRleHRUcmFjayo+
KHRleHRUcmFjayktPnRyYWNrRWxlbWVudEluZGV4KCk7CisKKyAgICBpZiAodGV4dFRyYWNrLT50
cmFja1R5cGUoKSA9PSBUZXh0VHJhY2s6OkFkZFRyYWNrKQorICAgICAgICByZXR1cm4gbV9lbGVt
ZW50VHJhY2tzLnNpemUoKSArIG1fYWRkVHJhY2tUcmFja3MuZmluZCh0ZXh0VHJhY2spOworCisg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisKKyAgICByZXR1cm4gLTE7Cit9CisKIFRleHRUcmFj
ayogVGV4dFRyYWNrTGlzdDo6aXRlbSh1bnNpZ25lZCBpbmRleCkKIHsKICAgICAvLyA0LjguMTAu
MTIuMSBUZXh0IHRyYWNrIG1vZGVsCkBAIC03NywxMyArOTAsMjEgQEAgVGV4dFRyYWNrKiBUZXh0
VHJhY2tMaXN0OjppdGVtKHVuc2lnbmVkIGluZGV4KQogdm9pZCBUZXh0VHJhY2tMaXN0OjphcHBl
bmQoUGFzc1JlZlB0cjxUZXh0VHJhY2s+IHBycFRyYWNrKQogewogICAgIFJlZlB0cjxUZXh0VHJh
Y2s+IHRyYWNrID0gcHJwVHJhY2s7Ci0gICAgCisKICAgICBpZiAodHJhY2stPnRyYWNrVHlwZSgp
ID09IFRleHRUcmFjazo6QWRkVHJhY2spCiAgICAgICAgIG1fYWRkVHJhY2tUcmFja3MuYXBwZW5k
KHRyYWNrKTsKICAgICBlbHNlIGlmICh0cmFjay0+dHJhY2tUeXBlKCkgPT0gVGV4dFRyYWNrOjpU
cmFja0VsZW1lbnQpIHsKICAgICAgICAgLy8gSW5zZXJ0IHRyYWNrcyBhZGRlZCBmb3IgPHRyYWNr
PiBlbGVtZW50IGluIHRyZWUgb3JkZXIuCiAgICAgICAgIHNpemVfdCBpbmRleCA9IHN0YXRpY19j
YXN0PExvYWRhYmxlVGV4dFRyYWNrKj4odHJhY2suZ2V0KCkpLT50cmFja0VsZW1lbnRJbmRleCgp
OwogICAgICAgICBtX2VsZW1lbnRUcmFja3MuaW5zZXJ0KGluZGV4LCB0cmFjayk7CisKKyAgICAg
ICAgLy8gSW52YWxpZGF0ZSB0aGUgY2FjaGVkIGluZGV4IGZvciBhbGwgdGhlIGZvbGxvd2luZyB0
cmFja3MuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBpbmRleDsgaSA8IG1fZWxlbWVudFRyYWNr
cy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIG1fZWxlbWVudFRyYWNrc1tpXS0+aW52YWxpZGF0
ZVRyYWNrSW5kZXgoKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fYWRkVHJh
Y2tUcmFja3Muc2l6ZSgpOyArK2kpCisgICAgICAgICAgICBtX2FkZFRyYWNrVHJhY2tzW2ldLT5p
bnZhbGlkYXRlVHJhY2tJbmRleCgpOworCiAgICAgfSBlbHNlCiAgICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9odG1sL3RyYWNrL1RleHRU
cmFja0xpc3QuaCBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvdHJhY2svVGV4dFRyYWNrTGlzdC5oCmlu
ZGV4IDg4ZDlhZjYyZTAyYjIyOTU3NDc1MzY3N2VmMjE1MTkxNmJlNjVlZTcuLmY4ZjA0ZmZhOTg1
MDdjZGQwZjZkNGI1ZTg5ODg3NDdlNTRmYTg1NmEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L2h0bWwvdHJhY2svVGV4dFRyYWNrTGlzdC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2h0bWwvdHJh
Y2svVGV4dFRyYWNrTGlzdC5oCkBAIC01MSw2ICs1MSw4IEBAIHB1YmxpYzoKICAgICB+VGV4dFRy
YWNrTGlzdCgpOwogCiAgICAgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3Q7CisgICAgdW5zaWduZWQg
Z2V0VHJhY2tJbmRleChUZXh0VHJhY2sqKTsKKwogICAgIFRleHRUcmFjayogaXRlbSh1bnNpZ25l
ZCBpbmRleCk7CiAgICAgdm9pZCBhcHBlbmQoUGFzc1JlZlB0cjxUZXh0VHJhY2s+KTsKICAgICB2
b2lkIHJlbW92ZShUZXh0VHJhY2sqKTsKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxv
ZyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwppbmRleCBjYWU3OWZjZTljNGJjMDNkZDY5NGUxYTI0
NTYwM2Y0OTQwYjFjMDM1Li5kNjVmNjYwMDBkODc3ZDU5NTU5MDgyNzNjYmY4MjM5MjhkNmI3MjZk
IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMjIgQEAKKzIwMTItMDItMTcgIFZpY3RvciBDYXJidW5lICA8dmlj
dG9yQHJvc2VkdS5vcmc+CisKKyAgICAgICAgPHRyYWNrPi1yZWxhdGVkIGV2ZW50cyBjdWVjaGFu
Z2UsIGVudGVyLCBhbmQgZXhpdCBzaG91bGQgYmUgc29ydGVkIGFuZCBmaWx0ZXJlZCBiZWZvcmUg
ZGlzcGF0Y2hpbmcKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTcyMTcxCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgKiBtZWRpYS90cmFjay9jYXB0aW9ucy13ZWJ2dHQvbWlzc2VkLWN1ZXMudnR0OiBBZGRlZC4K
KyAgICAgICAgKiBtZWRpYS90cmFjay9jYXB0aW9ucy13ZWJ2dHQvc29ydGVkLWRpc3BhdGNoLnZ0
dDogQWRkZWQuCisgICAgICAgICogbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1jdWVjaGFuZ2UtZXhw
ZWN0ZWQudHh0OiBUaGlzIHRlc3QgaGFkIHRvIGJlIGNoYW5nZWQgYmVjYXVzZQorICAgICAgICB0
aGUgc3luY2hyb25vdXMgZGlzcGF0Y2ggb2YgdGhlIGV2ZW50cyBhZ2FpbnN0IHRoZSBIVE1MVHJh
Y2tFbGVtZW50IGRvZXNuJ3QgbWVhbiB0aGF0CisgICAgICAgIHRoZSB0ZXh0IHRyYWNrIGFjdHVh
bGx5IGhhcyBhbnkgYWN0aXZlIGN1ZXMgYXQgdGhlIGRpc3BhdGNoIG1vbWVudC4KKyAgICAgICAg
KiBtZWRpYS90cmFjay90cmFjay1jdWVzLWN1ZWNoYW5nZS5odG1sOiBDaGFuZ2VkIHRlc3RzIHN0
cnVjdHVyZSB0byBndWlkZSB0aGUgZW50ZXJpbmcgYW5kCisgICAgICAgIGV4aXQgZXZlbnRzIGFj
Y29yZGluZyB0byB0aGUgYXN5bmNocm9ub3VzIGRpc3BhdGNoIGRvbmUgYnkgVGV4dFRyYWNrLgor
ICAgICAgICAqIG1lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtbWlzc2VkLWV4cGVjdGVkLnR4dDogQWRk
ZWQuCisgICAgICAgICogbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1taXNzZWQuaHRtbDogQWRkZWQu
CisgICAgICAgICogbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1zb3J0ZWQtYmVmb3JlLWRpc3BhdGNo
LWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1z
b3J0ZWQtYmVmb3JlLWRpc3BhdGNoLmh0bWw6IEFkZGVkLgorCiAyMDEyLTAyLTE3ICBTdGVwaGVu
IENoZW5uZXkgIDxzY2hlbm5leUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgQ3Jhc2ggYXQgV2Vi
Q29yZTo6U1ZHVXNlRWxlbWVudDo6ZXhwYW5kU3ltYm9sRWxlbWVudHNJblNoYWRvd1RyZWUKZGlm
ZiAtLWdpdCBhL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL2NhcHRpb25zLXdlYnZ0dC9taXNzZWQt
Y3Vlcy52dHQgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay9jYXB0aW9ucy13ZWJ2dHQvbWlzc2Vk
LWN1ZXMudnR0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjUzZGZmMDY1MjZlYjI4N2YzNThjYTEwNWEyZmRlYzAzYTU3
NzNmYWQKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay9jYXB0aW9u
cy13ZWJ2dHQvbWlzc2VkLWN1ZXMudnR0CkBAIC0wLDAgKzEsMjcgQEAKK1dFQlZUVAorRXZlbnRz
IHNob3VsZCBiZSB0cmlnZ2VyZWQgZm9yIG1pc3NlZCAoc2tpcHBlZCkgY3VlcyBkdXJpbmcgbm9y
bWFsIHBsYXliYWNrLgorCisxCiswMDowMDowMC4wMDAgLS0+IDAwOjAwOjAxLjUwMCBBOnN0YXJ0
IFQ6MjAlCitCZWFyIGlzIENvbWluZyEhISEhCitBbmQgd2hhdCBraW5kIG9mIGEgYmVhciBpdCBp
cyAtIGp1c3QgaGF2ZSBsb29rLgorCisyCiswMDowMDowMi4wMDAgLS0+IDAwOjAwOjAyLjUwMCBB
OnN0YXJ0IFQ6MjAlCitJIHNhaWQgQmVhciBpcyBjb21pbmchISEhCisKKzMKKzAwOjAwOjA1LjUw
MCAtLT4gMDA6MDA6MDUuNTAxIEE6c3RhcnQgVDoyMCUKK0kgc2FpZCBCZWFyIGlzIGNvbWluZyBu
b3chISEhCisKKzQKKzAwOjAwOjA1LjcwMCAtLT4gMDA6MDA6MDUuNzAxIEE6c3RhcnQgVDoyMCUK
K1RoaXMgaXMgdGhlIHNlY29uZCBtaXNzZWQgY3VlIGluIHRoZSB0ZXN0LgorCis1CiswMDowMDow
NS44MDAgLS0+IDAwOjAwOjA1LjgwMSBBOnN0YXJ0IFQ6MjAlCitNYXliZSBhIHRoaXJkIG1pc3Nl
ZCBjdWUuCisKKzYKKzAwOjAwOjA1Ljk5MiAtLT4gMDA6MDA6MDUuOTkzIEE6c3RhcnQgVDoyMCUK
K0ZvdXJ0aCBtaXNzZWQgY3VlLgpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvbWVkaWEvdHJhY2sv
Y2FwdGlvbnMtd2VidnR0L3NvcnRlZC1kaXNwYXRjaC52dHQgYi9MYXlvdXRUZXN0cy9tZWRpYS90
cmFjay9jYXB0aW9ucy13ZWJ2dHQvc29ydGVkLWRpc3BhdGNoLnZ0dApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kYjky
NWQ2YWYwZjVmMWI0YzQyYWYzNmI0YTM4MjdhNzIyMjk0YjM2Ci0tLSAvZGV2L251bGwKKysrIGIv
TGF5b3V0VGVzdHMvbWVkaWEvdHJhY2svY2FwdGlvbnMtd2VidnR0L3NvcnRlZC1kaXNwYXRjaC52
dHQKQEAgLTAsMCArMSwzNCBAQAorV0VCVlRUCitFbnRlciBhbmQgZXhpdCBldmVudHMgc2hvdWxk
IGJlIGRpc3BhdGNoZWQgaW4gYSBzb3J0ZWQgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZWlyIHRpbWVz
LgorCiswCiswMDowMDowNC4wMDAgLS0+IDAwOjAwOjA0LjUwMAorTWlzc2VkIGN1ZSB0aGF0IHNo
b3VsZCBub3QgYmUgY29uc2lkZXJlZCBiZWNhdXNlIG9mIHNlZWtpbmcuCisKKzEKKzAwOjAwOjA1
LjEwMCAtLT4gMDA6MDA6MDUuODAwIEE6c3RhcnQgVDoyMCUKK0JlYXIgaXMgQ29taW5nISEhISEK
KworMgorMDA6MDA6MDUuMTAwIC0tPiAwMDowMDowNS4xMDEKK01pc3NlZCBjdWUgMQorCiszCisw
MDowMDowNS4xMDAgLS0+IDAwOjAwOjA1LjMwMQorQW5kIHdoYXQga2luZCBvZiBhIGJlYXIgaXQg
aXMgLSBqdXN0IGhhdmUgbG9vay4KKworNAorMDA6MDA6MDUuMTAwIC0tPiAwMDowMDowNS4xMDEK
K01pc3NlZCBDdWUgMgorCis1CiswMDowMDowNS4zMDAgLS0+IDAwOjAwOjA1LjgwMCBBOnN0YXJ0
IFQ6MjAlCitJIHNhaWQgQmVhciBpcyBjb21pbmchISEhCisKKzYKKzAwOjAwOjA1Ljk5MCAtLT4g
MDA6MDA6MDUuOTkzIEE6c3RhcnQgVDoyMCUKK0kgc2FpZCBCZWFyIGlzIGNvbWluZyBub3chISEh
CisKKzcKKzAwOjAwOjA1Ljk5NCAtLT4gMDA6MDA6MDUuOTk4IEE6c3RhcnQgVDoyMCUKK0JlYXIg
aXMgYWxyZWFkeSBoZXJlCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay90cmFj
ay1jdWVzLWN1ZWNoYW5nZS1leHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay90
cmFjay1jdWVzLWN1ZWNoYW5nZS1leHBlY3RlZC50eHQKaW5kZXggNDc0NGUxNWQ1ZTg3MDZmOGMx
N2E0YmRjODY1ZDQ1NjlmYThjNjY1YS4uMzczYjUyNWY4OGYxOGQxZmE2YmMwMzYzYzE3OTkxY2M0
OGE3ZGJiOCAxMDA2NDQKLS0tIGEvTGF5b3V0VGVzdHMvbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1j
dWVjaGFuZ2UtZXhwZWN0ZWQudHh0CisrKyBiL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNr
LWN1ZXMtY3VlY2hhbmdlLWV4cGVjdGVkLnR4dApAQCAtNCw1MyArNCwzNSBAQCBFVkVOVChjYW5w
bGF5dGhyb3VnaCkKIEVYUEVDVEVEICh0ZXN0VHJhY2sudHJhY2suY3Vlcy5sZW5ndGggPT0gJzMn
KSBPSwogUlVOKHZpZGVvLnBsYXkoKSkKIAorRVZFTlQoY3VlY2hhbmdlKSBmcm9tIDx0cmFjaz4K
IEVWRU5UKGN1ZWNoYW5nZSkgZnJvbSBUZXh0VHJhY2sKIEN1ZSBlbnRlcmVkCiBFWFBFQ1RFRCAo
W29iamVjdCBUZXh0VHJhY2tDdWVdID09ICdbb2JqZWN0IFRleHRUcmFja0N1ZV0nKSBPSwogRVhQ
RUNURUQgKGN1cnJlbnRDdWUuaWQgPT0gJzEnKSBPSwogCiBFVkVOVChjdWVjaGFuZ2UpIGZyb20g
PHRyYWNrPgotQ3VlIGVudGVyZWQKLUVYUEVDVEVEIChbb2JqZWN0IFRleHRUcmFja0N1ZV0gPT0g
J1tvYmplY3QgVGV4dFRyYWNrQ3VlXScpIE9LCi1FWFBFQ1RFRCAoY3VycmVudEN1ZS5pZCA9PSAn
MScpIE9LCi0KIEVWRU5UKGN1ZWNoYW5nZSkgZnJvbSBUZXh0VHJhY2sKIEN1ZSBleGl0ZWQKIAog
RVZFTlQoY3VlY2hhbmdlKSBmcm9tIDx0cmFjaz4KLUN1ZSBleGl0ZWQKLQogRVZFTlQoY3VlY2hh
bmdlKSBmcm9tIFRleHRUcmFjawogQ3VlIGVudGVyZWQKIEVYUEVDVEVEIChbb2JqZWN0IFRleHRU
cmFja0N1ZV0gPT0gJ1tvYmplY3QgVGV4dFRyYWNrQ3VlXScpIE9LCiBFWFBFQ1RFRCAoY3VycmVu
dEN1ZS5pZCA9PSAnMicpIE9LCiAKIEVWRU5UKGN1ZWNoYW5nZSkgZnJvbSA8dHJhY2s+Ci1DdWUg
ZW50ZXJlZAotRVhQRUNURUQgKFtvYmplY3QgVGV4dFRyYWNrQ3VlXSA9PSAnW29iamVjdCBUZXh0
VHJhY2tDdWVdJykgT0sKLUVYUEVDVEVEIChjdXJyZW50Q3VlLmlkID09ICcyJykgT0sKLQogRVZF
TlQoY3VlY2hhbmdlKSBmcm9tIFRleHRUcmFjawogQ3VlIGV4aXRlZAogCiBFVkVOVChjdWVjaGFu
Z2UpIGZyb20gPHRyYWNrPgotQ3VlIGV4aXRlZAotCiBFVkVOVChjdWVjaGFuZ2UpIGZyb20gVGV4
dFRyYWNrCiBDdWUgZW50ZXJlZAogRVhQRUNURUQgKFtvYmplY3QgVGV4dFRyYWNrQ3VlXSA9PSAn
W29iamVjdCBUZXh0VHJhY2tDdWVdJykgT0sKIEVYUEVDVEVEIChjdXJyZW50Q3VlLmlkID09ICcz
JykgT0sKIAogRVZFTlQoY3VlY2hhbmdlKSBmcm9tIDx0cmFjaz4KLUN1ZSBlbnRlcmVkCi1FWFBF
Q1RFRCAoW29iamVjdCBUZXh0VHJhY2tDdWVdID09ICdbb2JqZWN0IFRleHRUcmFja0N1ZV0nKSBP
SwotRVhQRUNURUQgKGN1cnJlbnRDdWUuaWQgPT0gJzMnKSBPSwotCiBFVkVOVChjdWVjaGFuZ2Up
IGZyb20gVGV4dFRyYWNrCiBDdWUgZXhpdGVkCiAKLUVWRU5UKGN1ZWNoYW5nZSkgZnJvbSA8dHJh
Y2s+Ci1DdWUgZXhpdGVkCi0KIEVORCBPRiBURVNUCiAKZGlmZiAtLWdpdCBhL0xheW91dFRlc3Rz
L21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtY3VlY2hhbmdlLmh0bWwgYi9MYXlvdXRUZXN0cy9tZWRp
YS90cmFjay90cmFjay1jdWVzLWN1ZWNoYW5nZS5odG1sCmluZGV4IDhkNmQwZjRkYzdhZDYwZTI5
ZGZmNDNmNWY4MTFkMGFjMDcyNDIxYmIuLjU5ODM2OTNlMTI4NzdmYzg4MTk2ZWZhMzVjNzNiYzY3
ZjJjMTZmYmUgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMt
Y3VlY2hhbmdlLmh0bWwKKysrIGIvTGF5b3V0VGVzdHMvbWVkaWEvdHJhY2svdHJhY2stY3Vlcy1j
dWVjaGFuZ2UuaHRtbApAQCAtMzEsMjUgKzMxLDIxIEBACiAgICAgICAgIGZ1bmN0aW9uIGN1ZUNo
YW5nZWRGcm9tVHJhY2tFbGVtZW50KCkKICAgICAgICAgewogICAgICAgICAgICAgY29uc29sZVdy
aXRlKCJFVkVOVChjdWVjaGFuZ2UpIGZyb20gJmx0O3RyYWNrJmd0OyIpOwotICAgICAgICAgICAg
Ci0gICAgICAgICAgICBjdXJyZW50Q3VlSW5kZXggPSBNYXRoLmZsb29yKGN1ZUNoYW5nZUNvdW50
LzIpOwotICAgICAgICAgICAgY3VycmVudEN1ZSA9IGV2ZW50LnRhcmdldC50cmFjay5jdWVzW2N1
cnJlbnRDdWVJbmRleF07Ci0gICAgICAgICAgICBjaGVja0N1ZSgpOwotCi0gICAgICAgICAgICAr
K2N1ZUNoYW5nZUNvdW50OwotICAgICAgICAgICAgaWYgKGN1ZUNoYW5nZUNvdW50ID09IHRlc3RU
cmFjay50cmFjay5jdWVzLmxlbmd0aCAqIDIpCi0gICAgICAgICAgICAgICAgZW5kVGVzdCgpOwog
ICAgICAgICB9CiAKICAgICAgICAgZnVuY3Rpb24gY3VlQ2hhbmdlZEZyb21UZXh0VHJhY2soKQog
ICAgICAgICB7CiAgICAgICAgICAgICBjb25zb2xlV3JpdGUoIkVWRU5UKGN1ZWNoYW5nZSkgZnJv
bSBUZXh0VHJhY2siKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgY3VycmVudEN1ZUluZGV4
ID0gTWF0aC5mbG9vcihjdWVDaGFuZ2VDb3VudC8yKTsKKworICAgICAgICAgICAgY3VycmVudEN1
ZUluZGV4ID0gTWF0aC5mbG9vcihjdWVDaGFuZ2VDb3VudCAvIDIpOwogICAgICAgICAgICAgY3Vy
cmVudEN1ZSA9IGV2ZW50LnRhcmdldC5jdWVzW2N1cnJlbnRDdWVJbmRleF07CiAgICAgICAgICAg
ICBjaGVja0N1ZSgpOworCisgICAgICAgICAgICArK2N1ZUNoYW5nZUNvdW50OworICAgICAgICAg
ICAgaWYgKGN1ZUNoYW5nZUNvdW50ID09IHRlc3RUcmFjay50cmFjay5jdWVzLmxlbmd0aCAqIDIp
CisgICAgICAgICAgICAgICAgZW5kVGVzdCgpOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAg
ICAgIGZ1bmN0aW9uIGNoZWNrQ3VlKCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGN1ZUNo
YW5nZUNvdW50ICUgMiA9PSAwKSB7CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9tZWRpYS90cmFj
ay90cmFjay1jdWVzLW1pc3NlZC1leHBlY3RlZC50eHQgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFj
ay90cmFjay1jdWVzLW1pc3NlZC1leHBlY3RlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZWU4NmY2NjExMjMz
NDJiMjc3MGE2ZmQyZmJiZWE2MTliZTI5YWY0YQotLS0gL2Rldi9udWxsCisrKyBiL0xheW91dFRl
c3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtbWlzc2VkLWV4cGVjdGVkLnR4dApAQCAtMCwwICsx
LDMyIEBACitUZXN0cyB0aGF0IGV2ZW50cyBhcmUgdHJpZ2dlcmVkIGZvciBtaXNzZWQgKHNraXBw
ZWQpIGN1ZXMgZHVyaW5nIG5vcm1hbCBwbGF5YmFjay4KKworRVZFTlQoY2FucGxheXRocm91Z2gp
CitFWFBFQ1RFRCAodGVzdFRyYWNrLnRyYWNrLmN1ZXMubGVuZ3RoID09ICc2JykgT0sKK1JVTih2
aWRlby5wbGF5KCkpCitFVkVOVChlbnRlcikKK0VYUEVDVEVEICh0ZXN0VHJhY2sudHJhY2suY3Vl
cy5nZXRDdWVCeUlkKGN1ZUNvdW50KSA9PSAnW29iamVjdCBUZXh0VHJhY2tDdWVdJykgT0sKK0VY
UEVDVEVEIChjdXJyZW50Q3VlLmlkID09ICczJykgT0sKK0VWRU5UKGV4aXQpCitFWFBFQ1RFRCAo
dGVzdFRyYWNrLnRyYWNrLmN1ZXMuZ2V0Q3VlQnlJZChjdWVDb3VudCkgPT0gJ1tvYmplY3QgVGV4
dFRyYWNrQ3VlXScpIE9LCitFWFBFQ1RFRCAoY3VycmVudEN1ZS5pZCA9PSAnMycpIE9LCitFVkVO
VChlbnRlcikKK0VYUEVDVEVEICh0ZXN0VHJhY2sudHJhY2suY3Vlcy5nZXRDdWVCeUlkKGN1ZUNv
dW50KSA9PSAnW29iamVjdCBUZXh0VHJhY2tDdWVdJykgT0sKK0VYUEVDVEVEIChjdXJyZW50Q3Vl
LmlkID09ICc0JykgT0sKK0VWRU5UKGV4aXQpCitFWFBFQ1RFRCAodGVzdFRyYWNrLnRyYWNrLmN1
ZXMuZ2V0Q3VlQnlJZChjdWVDb3VudCkgPT0gJ1tvYmplY3QgVGV4dFRyYWNrQ3VlXScpIE9LCitF
WFBFQ1RFRCAoY3VycmVudEN1ZS5pZCA9PSAnNCcpIE9LCitFVkVOVChlbnRlcikKK0VYUEVDVEVE
ICh0ZXN0VHJhY2sudHJhY2suY3Vlcy5nZXRDdWVCeUlkKGN1ZUNvdW50KSA9PSAnW29iamVjdCBU
ZXh0VHJhY2tDdWVdJykgT0sKK0VYUEVDVEVEIChjdXJyZW50Q3VlLmlkID09ICc1JykgT0sKK0VW
RU5UKGV4aXQpCitFWFBFQ1RFRCAodGVzdFRyYWNrLnRyYWNrLmN1ZXMuZ2V0Q3VlQnlJZChjdWVD
b3VudCkgPT0gJ1tvYmplY3QgVGV4dFRyYWNrQ3VlXScpIE9LCitFWFBFQ1RFRCAoY3VycmVudEN1
ZS5pZCA9PSAnNScpIE9LCitFVkVOVChlbnRlcikKK0VYUEVDVEVEICh0ZXN0VHJhY2sudHJhY2su
Y3Vlcy5nZXRDdWVCeUlkKGN1ZUNvdW50KSA9PSAnW29iamVjdCBUZXh0VHJhY2tDdWVdJykgT0sK
K0VYUEVDVEVEIChjdXJyZW50Q3VlLmlkID09ICc2JykgT0sKK0VWRU5UKGV4aXQpCitFWFBFQ1RF
RCAodGVzdFRyYWNrLnRyYWNrLmN1ZXMuZ2V0Q3VlQnlJZChjdWVDb3VudCkgPT0gJ1tvYmplY3Qg
VGV4dFRyYWNrQ3VlXScpIE9LCitFWFBFQ1RFRCAoY3VycmVudEN1ZS5pZCA9PSAnNicpIE9LCitF
VkVOVChlbmRlZCkKK0VORCBPRiBURVNUCisKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL21lZGlh
L3RyYWNrL3RyYWNrLWN1ZXMtbWlzc2VkLmh0bWwgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay90
cmFjay1jdWVzLW1pc3NlZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjc3MTI3NTA5OTlmYWVmN2MwZWEyNjM0
OWUxYTc2M2NmNzdhZGJjN2EKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9tZWRpYS90
cmFjay90cmFjay1jdWVzLW1pc3NlZC5odG1sCkBAIC0wLDAgKzEsNzcgQEAKKzwhRE9DVFlQRSBo
dG1sPgorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRl
bnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgorCisgICAgICAg
IDxzY3JpcHQgc3JjPS4uL21lZGlhLWZpbGUuanM+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQg
c3JjPS4uL3ZpZGVvLXRlc3QuanM+PC9zY3JpcHQ+CisgICAgICAgIDxzY3JpcHQ+CisgICAgICAg
ICAgICB2YXIgdmlkZW9DYW5QbGF5VGhyb3VnaCA9IGZhbHNlOworICAgICAgICAgICAgdmFyIHRy
YWNrTG9hZGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIHZhciBjdXJyZW50Q3VlOworICAgICAg
ICAgICAgdmFyIGN1ZUNvdW50OworICAgICAgICAgICAgdmFyIHRlc3RUcmFjazsKKworICAgICAg
ICAgICAgZnVuY3Rpb24gcnVuVGVzdHMoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
IGlmICghdHJhY2tMb2FkZWQgfHwgIXZpZGVvQ2FuUGxheVRocm91Z2gpCisgICAgICAgICAgICAg
ICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgICAgIHRlc3RUcmFjayA9IGRvY3VtZW50Lmdl
dEVsZW1lbnRCeUlkKCJ0ZXN0VHJhY2siKTsKKyAgICAgICAgICAgICAgICB0ZXN0RXhwZWN0ZWQo
InRlc3RUcmFjay50cmFjay5jdWVzLmxlbmd0aCIsIDYpOworCisgICAgICAgICAgICAgICAgZm9y
IChjdWVDb3VudCA9IDI7IGN1ZUNvdW50IDwgdGVzdFRyYWNrLnRyYWNrLmN1ZXMubGVuZ3RoOyBj
dWVDb3VudCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBjdWUgPSB0ZXN0VHJhY2sudHJh
Y2suY3Vlc1tjdWVDb3VudF07CisKKyAgICAgICAgICAgICAgICAgICAgY3VlLmFkZEV2ZW50TGlz
dGVuZXIoJ2VudGVyJywgY3VlRW50ZXJlZE9yRXhpdGVkKTsKKyAgICAgICAgICAgICAgICAgICAg
Y3VlLmFkZEV2ZW50TGlzdGVuZXIoJ2V4aXQnLCBjdWVFbnRlcmVkT3JFeGl0ZWQpOworICAgICAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGN1ZUNvdW50ID0gMzsKKyAgICAgICAgICAg
ICAgICBydW4oInZpZGVvLnBsYXkoKSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBm
dW5jdGlvbiBjdWVFbnRlcmVkT3JFeGl0ZWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAg
ICAgIGNvbnNvbGVXcml0ZSgiRVZFTlQoIiArIGV2ZW50LnR5cGUgKyAiKSIpOworCisgICAgICAg
ICAgICAgICAgY3VycmVudEN1ZSA9IGV2ZW50LnRhcmdldDsKKyAgICAgICAgICAgICAgICB0ZXN0
RXhwZWN0ZWQoInRlc3RUcmFjay50cmFjay5jdWVzLmdldEN1ZUJ5SWQoY3VlQ291bnQpIiwgY3Vy
cmVudEN1ZSk7CisgICAgICAgICAgICAgICAgdGVzdEV4cGVjdGVkKCJjdXJyZW50Q3VlLmlkIiwg
Y3VlQ291bnQpOworCisgICAgICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT0gJ2V4aXQnKSB7
CisgICAgICAgICAgICAgICAgICAgIGN1ZUNvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICB3YWl0Rm9yRXZlbnQoJ2VuZGVkJywgZW5kVGVzdCk7
CisKKyAgICAgICAgICAgIHdhaXRGb3JFdmVudCgnY2FucGxheXRocm91Z2gnLCBmdW5jdGlvbigp
IHsKKyAgICAgICAgICAgICAgICB2aWRlby5jdXJyZW50VGltZSA9IDUuMDA7CisgICAgICAgICAg
ICAgICAgdmlkZW9DYW5QbGF5VGhyb3VnaCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBydW5U
ZXN0cygpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGZ1bmN0aW9uIGxvYWRlZCgp
CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhY2tMb2FkZWQgPSB0cnVlOworCisg
ICAgICAgICAgICAgICAgcnVuVGVzdHMoKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAg
IGZ1bmN0aW9uIGJvZHlMb2FkZWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZp
bmRNZWRpYUVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICB2aWRlby5zcmMgPSBmaW5kTWVkaWFG
aWxlKCJ2aWRlbyIsICIuLi9jb250ZW50L3Rlc3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
PC9zY3JpcHQ+CisgICAgPC9oZWFkPgorICAgIDxib2R5IG9ubG9hZD0iYm9keUxvYWRlZCgpIj4K
KyAgICAgICAgPHA+VGVzdHMgdGhhdCBldmVudHMgYXJlIHRyaWdnZXJlZCBmb3IgbWlzc2VkIChz
a2lwcGVkKSBjdWVzIGR1cmluZyBub3JtYWwgcGxheWJhY2suPC9wPgorICAgICAgICA8dmlkZW8g
Y29udHJvbHM+CisgICAgICAgICAgICA8dHJhY2sgaWQ9InRlc3RUcmFjayIgc3JjPSJjYXB0aW9u
cy13ZWJ2dHQvbWlzc2VkLWN1ZXMudnR0IiBvbmxvYWQ9ImxvYWRlZCgpIiBkZWZhdWx0PgorICAg
ICAgICA8L3ZpZGVvPgorICAgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL0xheW91dFRl
c3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMtc29ydGVkLWJlZm9yZS1kaXNwYXRjaC1leHBlY3Rl
ZC50eHQgYi9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay90cmFjay1jdWVzLXNvcnRlZC1iZWZvcmUt
ZGlzcGF0Y2gtZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjkwN2M4OGE5NzY2ZjRmNjlhNjUyMjZm
NzhiNGVmYjQ0M2M5MzVhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9tZWRpYS90
cmFjay90cmFjay1jdWVzLXNvcnRlZC1iZWZvcmUtZGlzcGF0Y2gtZXhwZWN0ZWQudHh0CkBAIC0w
LDAgKzEsMjIgQEAKK1Rlc3RzIHRoYXQgYWxsIGV2ZW50cyBldmVudHMgYXJlIHRyaWdnZXJlZCBp
biBjaHJvbm9sb2dpY2FsIG9yZGVyLgorCitFVkVOVChjYW5wbGF5dGhyb3VnaCkKK0VYUEVDVEVE
ICh0ZXN0VHJhY2sudHJhY2suY3Vlcy5sZW5ndGggPT0gJzgnKSBPSworUlVOKHZpZGVvLnBsYXko
KSkKK0VWRU5UKGVuZGVkKQorQ3VlIGV2ZW50OiBlbnRlciBpZDogMSB0aW1lOiA1LjEKK0N1ZSBl
dmVudDogZW50ZXIgaWQ6IDMgdGltZTogNS4xCitDdWUgZXZlbnQ6IGVudGVyIGlkOiAyIHRpbWU6
IDUuMQorQ3VlIGV2ZW50OiBlbnRlciBpZDogNCB0aW1lOiA1LjEKK0N1ZSBldmVudDogZXhpdCBp
ZDogMiB0aW1lOiA1LjEwMQorQ3VlIGV2ZW50OiBleGl0IGlkOiA0IHRpbWU6IDUuMTAxCitDdWUg
ZXZlbnQ6IGVudGVyIGlkOiA1IHRpbWU6IDUuMworQ3VlIGV2ZW50OiBleGl0IGlkOiAzIHRpbWU6
IDUuMzAxCitDdWUgZXZlbnQ6IGV4aXQgaWQ6IDEgdGltZTogNS44CitDdWUgZXZlbnQ6IGV4aXQg
aWQ6IDUgdGltZTogNS44CitDdWUgZXZlbnQ6IGVudGVyIGlkOiA2IHRpbWU6IDUuOTkKK0N1ZSBl
dmVudDogZXhpdCBpZDogNiB0aW1lOiA1Ljk5MworQ3VlIGV2ZW50OiBlbnRlciBpZDogNyB0aW1l
OiA1Ljk5NAorQ3VlIGV2ZW50OiBleGl0IGlkOiA3IHRpbWU6IDUuOTk4CitFTkQgT0YgVEVTVAor
CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9tZWRpYS90cmFjay90cmFjay1jdWVzLXNvcnRlZC1i
ZWZvcmUtZGlzcGF0Y2guaHRtbCBiL0xheW91dFRlc3RzL21lZGlhL3RyYWNrL3RyYWNrLWN1ZXMt
c29ydGVkLWJlZm9yZS1kaXNwYXRjaC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQ2YjBlMDA2ZTkyMTQ4M2I3
NjEwOGI4NjJiMjU2OGMzNzIwNDQ4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9t
ZWRpYS90cmFjay90cmFjay1jdWVzLXNvcnRlZC1iZWZvcmUtZGlzcGF0Y2guaHRtbApAQCAtMCww
ICsxLDg5IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8
bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNl
dD11dGYtOCIgLz4KKworICAgICAgICA8c2NyaXB0IHNyYz0uLi9tZWRpYS1maWxlLmpzPjwvc2Ny
aXB0PgorICAgICAgICA8c2NyaXB0IHNyYz0uLi92aWRlby10ZXN0LmpzPjwvc2NyaXB0PgorICAg
ICAgICA8c2NyaXB0PgorICAgICAgICAgICAgdmFyIHZpZGVvQ2FuUGxheVRocm91Z2ggPSBmYWxz
ZTsKKyAgICAgICAgICAgIHZhciB0cmFja0xvYWRlZCA9IGZhbHNlOworCisgICAgICAgICAgICB2
YXIgY3VycmVudEN1ZTsKKyAgICAgICAgICAgIHZhciB0ZXN0VHJhY2s7CisKKyAgICAgICAgICAg
IHZhciBkaXNwYXRjaGVkRXZlbnRzID0gW107CisKKyAgICAgICAgICAgIGZ1bmN0aW9uIHJ1blRl
c3RzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIXRyYWNrTG9hZGVkIHx8
ICF2aWRlb0NhblBsYXlUaHJvdWdoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAg
ICAgICAgICAgICAgICB0ZXN0VHJhY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVzdFRy
YWNrIik7CisgICAgICAgICAgICAgICAgdGVzdEV4cGVjdGVkKCJ0ZXN0VHJhY2sudHJhY2suY3Vl
cy5sZW5ndGgiLCA4KTsKKworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVz
dFRyYWNrLnRyYWNrLmN1ZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVz
dFRyYWNrLnRyYWNrLmN1ZXNbaV0uYWRkRXZlbnRMaXN0ZW5lcignZW50ZXInLCBjdWVFbnRlcmVk
T3JFeGl0ZWQpOworICAgICAgICAgICAgICAgICAgICB0ZXN0VHJhY2sudHJhY2suY3Vlc1tpXS5h
ZGRFdmVudExpc3RlbmVyKCdleGl0JywgY3VlRW50ZXJlZE9yRXhpdGVkKTsKKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICBydW4oInZpZGVvLnBsYXkoKSIpOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICBmdW5jdGlvbiBjdWVFbnRlcmVkT3JFeGl0ZWQoZXZlbnQpCisg
ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VycmVudEN1ZSA9IGV2ZW50LnRhcmdldDsK
KworICAgICAgICAgICAgICAgIHZhciBldmVudE9iaiA9IHt9OworCisgICAgICAgICAgICAgICAg
ZXZlbnRPYmoudGltZSA9IGN1cnJlbnRDdWUuc3RhcnRUaW1lOworICAgICAgICAgICAgICAgIGlm
IChldmVudC50eXBlID09ICdleGl0JykKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRPYmoudGlt
ZSA9IGN1cnJlbnRDdWUuZW5kVGltZTsKKworICAgICAgICAgICAgICAgIGV2ZW50T2JqLnR5cGUg
PSBldmVudC50eXBlOworICAgICAgICAgICAgICAgIGV2ZW50T2JqLmN1ZSA9IGN1cnJlbnRDdWU7
CisKKyAgICAgICAgICAgICAgICBkaXNwYXRjaGVkRXZlbnRzLnB1c2goZXZlbnRPYmopOworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICBmdW5jdGlvbiBsb2FkZWQoKQorICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgIHRyYWNrTG9hZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBy
dW5UZXN0cygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmdW5jdGlvbiBib2R5TG9h
ZGVkKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaW5kTWVkaWFFbGVtZW50KCk7
CisgICAgICAgICAgICAgICAgdmlkZW8uc3JjID0gZmluZE1lZGlhRmlsZSgidmlkZW8iLCAiLi4v
Y29udGVudC90ZXN0Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZ1bmN0aW9uIGxv
Z0VuZFRlc3QoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAw
OyBpIDwgZGlzcGF0Y2hlZEV2ZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAg
ICBjb25zb2xlV3JpdGUoIkN1ZSBldmVudDogIiArIGRpc3BhdGNoZWRFdmVudHNbaV0udHlwZSAr
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlkOiAiICsgZGlzcGF0Y2hlZEV2
ZW50c1tpXS5jdWUuaWQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0aW1l
OiAiICsgZGlzcGF0Y2hlZEV2ZW50c1tpXS50aW1lKTsKKyAgICAgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgICAgICBlbmRUZXN0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdh
aXRGb3JFdmVudCgnZW5kZWQnLCBsb2dFbmRUZXN0KTsKKworICAgICAgICAgICAgd2FpdEZvckV2
ZW50KCdjYW5wbGF5dGhyb3VnaCcsIGZ1bmN0aW9uKCkgeworICAgICAgICAgICAgICAgIHZpZGVv
LmN1cnJlbnRUaW1lID0gNS4wMDsKKyAgICAgICAgICAgICAgICB2aWRlb0NhblBsYXlUaHJvdWdo
ID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgIHJ1blRlc3RzKCk7CisgICAgICAgICAgICB9KTsK
KworICAgICAgICA8L3NjcmlwdD4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHkgb25sb2FkPSJib2R5
TG9hZGVkKCkiPgorICAgICAgICA8cD5UZXN0cyB0aGF0IGFsbCBldmVudHMgZXZlbnRzIGFyZSB0
cmlnZ2VyZWQgaW4gY2hyb25vbG9naWNhbCBvcmRlci48L3A+CisgICAgICAgIDx2aWRlbyBjb250
cm9scz4KKyAgICAgICAgICAgIDx0cmFjayBpZD0idGVzdFRyYWNrIiBzcmM9ImNhcHRpb25zLXdl
YnZ0dC9zb3J0ZWQtZGlzcGF0Y2gudnR0IiBvbmxvYWQ9ImxvYWRlZCgpIiBkZWZhdWx0PgorICAg
ICAgICA8L3ZpZGVvPgorICAgIDwvYm9keT4KKzwvaHRtbD4K
</data>

          </attachment>
      

    </bug>

</bugzilla>