<?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>94182</bug_id>
          
          <creation_ts>2012-08-15 20:54:39 -0700</creation_ts>
          <short_desc>[chromium] Implement Disambiguation Popup (a.k.a. link preview, on-demand zoom)</short_desc>
          <delta_ts>2012-09-04 12:01:26 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>66687</blocked>
    
    <blocked>91648</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Tien-Ren Chen">trchen</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>aelias</cc>
    
    <cc>allan.jensen</cc>
    
    <cc>dglazkov</cc>
    
    <cc>feldstein</cc>
    
    <cc>fishd</cc>
    
    <cc>jamesr</cc>
    
    <cc>klobag</cc>
    
    <cc>rjkroege</cc>
    
    <cc>tkent+wkapi</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>696696</commentid>
    <comment_count>0</comment_count>
    <who name="Tien-Ren Chen">trchen</who>
    <bug_when>2012-08-15 20:54:39 -0700</bug_when>
    <thetext>[chromium] Implement Link Preview (a.k.a. on-demand zoom)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>696699</commentid>
    <comment_count>1</comment_count>
      <attachid>158702</attachid>
    <who name="Tien-Ren Chen">trchen</who>
    <bug_when>2012-08-15 21:06:10 -0700</bug_when>
    <thetext>Created attachment 158702
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>696702</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-08-15 21:07:28 -0700</bug_when>
    <thetext>Please wait for approval from abarth@webkit.org, dglazkov@chromium.org, fishd@chromium.org, jamesr@chromium.org or tkent@chromium.org before submitting, as this patch contains changes to the Chromium public API. See also https://trac.webkit.org/wiki/ChromiumWebKitAPI.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>696744</commentid>
    <comment_count>3</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-08-15 22:18:13 -0700</bug_when>
    <thetext>*** Bug 79150 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>697307</commentid>
    <comment_count>4</comment_count>
      <attachid>158702</attachid>
    <who name="Alexandre Elias">aelias</who>
    <bug_when>2012-08-16 11:31:01 -0700</bug_when>
    <thetext>Comment on attachment 158702
Patch

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

&gt; Source/WebKit/chromium/features.gypi:84
&gt; +      &apos;ENABLE_LINK_PREVIEW=1&apos;,

As I was saying earlier, before the confusing naming gets embedded into the code, can we rename this to &quot;disambiguation popup&quot;?

&gt; Source/WebKit/chromium/public/WebInputEvent.h:382
&gt; +    bool generatedByLinkPreview;

Here&apos;s a thought.  This value could be replaced by &quot;float errorDistance;&quot;  The browser could send down a value corresponding to basically the size of a finger and it could feed into the scoring function.  When the tap already has been disambiguated, the error can be set to zero.

&gt; Source/WebKit/chromium/src/WebViewImpl.cpp:741
&gt; +        score *= max((padding - (boundingBox.x() - touchPoint.x())) * divPadding, (float)0);

I think this code can be made more compact by using some of the fancier IntRect methods.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>699192</commentid>
    <comment_count>5</comment_count>
      <attachid>158702</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-08-19 21:04:06 -0700</bug_when>
    <thetext>Comment on attachment 158702
Patch

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

This review is mostly questions.  The the main thing I&apos;d like to change is to remove generatedByLinkPreview.  Is there a way around adding that state to WebKit?

&gt;&gt; Source/WebKit/chromium/public/WebInputEvent.h:382
&gt;&gt; +    bool generatedByLinkPreview;
&gt; 
&gt; Here&apos;s a thought.  This value could be replaced by &quot;float errorDistance;&quot;  The browser could send down a value corresponding to basically the size of a finger and it could feed into the scoring function.  When the tap already has been disambiguated, the error can be set to zero.

Is there a way to keep this state in Chromium?  It&apos;s not really a concern of WebKit...  All that might be required is for the RenderView to remember whether it is currently showing a link previous popup.

&gt; Source/WebKit/chromium/public/WebViewClient.h:290
&gt; +    // Return true if the embedder will start a link preview so the input event will be swallowed
&gt; +    virtual bool triggersLinkPreview(const WebRect&amp; windowZoomRect) { return false; }

triggersLinkPreview  -&gt;  shouldCauseLinkDisambiguation ?

What is windowZoomRect?  How can a rect cause link disambiguation?  This is probably fine, it&apos;s just a bit confusing.

&gt; Source/WebKit/chromium/src/WebViewImpl.cpp:710
&gt; +bool isEventNode(Node *node)
&gt; +{
&gt; +    return node &amp;&amp; (node-&gt;supportsFocus()
&gt; +        || node-&gt;hasEventListeners(eventNames().clickEvent)
&gt; +        || node-&gt;hasEventListeners(eventNames().mousedownEvent)
&gt; +        || node-&gt;hasEventListeners(eventNames().mouseupEvent));
&gt; +}

Should this be in WebCore?  It&apos;s not really specific to Chromium and it doesn&apos;t really seem like a concern of the entire WebView.

It&apos;s tempting to implement every feature in WebViewImpl.cpp, but if we did that, WebViewImpl.cpp would grow to be even more huge than it is today.

&gt; Source/WebKit/chromium/src/WebViewImpl.cpp:713
&gt; +IntRect calculateEventNodeBoundingBox(Node* eventNode)

Again, this doesn&apos;t seem specific to Chromium and seems like something that could live in WebCore somewhere.

&gt; Source/WebKit/chromium/src/WebViewImpl.cpp:732
&gt; +float scoreTouchTarget(IntPoint touchPoint, int padding, IntRect boundingBox)

Should this be in a separate file in WebKit/chromium/src ?  We try to avoid putting everything in WebViewImpl.cpp.

&gt; Source/WebKit/chromium/src/WebViewImpl.cpp:772
&gt; +    // Find event handler node in the ancestor chain for each hit test result

I wonder if a bunch of this should be moved into the same file as scoreTouchTarget

&gt; Source/WebKit/chromium/src/WebViewImpl.cpp:778
&gt; +            if (node-&gt;isDocumentNode() || node-&gt;hasTagName(HTMLNames::htmlTag) || node-&gt;hasTagName(HTMLNames::bodyTag))
&gt; +                break;

How does this work for SVG documents?

&gt; Source/WebKit/chromium/src/WebViewImpl.cpp:798
&gt; +    // Only keep good touch targets with score &gt;= max(score)/2, and calculate the zoom rect
&gt; +    int numberOfGoodTargets = 0;
&gt; +    IntRect windowZoomRect = IntRect(touchPoint, IntSize(1, 1));
&gt; +    windowZoomRect.inflate(touchPointPadding);
&gt; +    for (HashMap&lt;Node*, TouchTargetData&gt;::iterator it = touchTargets.begin(); it != touchTargets.end(); ++it) {
&gt; +        if (it-&gt;second.score &lt; bestScore * 0.5)
&gt; +            continue;
&gt; +        numberOfGoodTargets++;
&gt; +        windowZoomRect.unite(it-&gt;second.windowBoundingBox);
&gt; +    }

This too.

&gt; Source/WebKit/chromium/src/WebViewImpl.cpp:800
&gt; +    // TODO: replace touch adjustment code when numberOfGoodTargets == 1?

TODO -&gt; FIXME

&gt; Source/WebKit/chromium/src/WebViewImpl.cpp:804
&gt; +    return m_client &amp;&amp; m_client-&gt;triggersLinkPreview(windowZoomRect);

I see.  So windowZoomRect is something like a bounding box of the touch targets.

&gt; Source/WebKit/chromium/src/WebViewImpl.cpp:833
&gt; +        if (!event.generatedByLinkPreview) {

Maybe the Chromium side can use its own version of this state to answer triggersLinkPreview or another client call made here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>699666</commentid>
    <comment_count>6</comment_count>
    <who name="Alexandre Elias">aelias</who>
    <bug_when>2012-08-20 10:44:45 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; This review is mostly questions.  The the main thing I&apos;d like to change is to remove generatedByLinkPreview.  Is there a way around adding that state to WebKit?
&gt; 
&gt; &gt;&gt; Source/WebKit/chromium/public/WebInputEvent.h:382
&gt; &gt;&gt; +    bool generatedByLinkPreview;
&gt; &gt; 
&gt; &gt; Here&apos;s a thought.  This value could be replaced by &quot;float errorDistance;&quot;  The browser could send down a value corresponding to basically the size of a finger and it could feed into the scoring function.  When the tap already has been disambiguated, the error can be set to zero.
&gt; 
&gt; Is there a way to keep this state in Chromium?  It&apos;s not really a concern of WebKit...  All that might be required is for the RenderView to remember whether it is currently showing a link previous popup.

We don&apos;t want the renderer to make assumptions about what the browser is doing.  The browser could dismiss the popup for complex reasons.  And it would also be messy to add more criss-crossing ViewMsgs to keep the renderer in sync with whatever the browser is doing.

The &quot;errorDistance&quot; actually is a logical property of an input event -- conceptually, there is a zone of precision you can expect for a given input event, whether due to hardware or finger imprecision.   So I think we should add the value -- it&apos;s natural enough that I have the feeling we&apos;ll even find different uses for it in the future..</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>699775</commentid>
    <comment_count>7</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-08-20 12:11:01 -0700</bug_when>
    <thetext>&gt; The &quot;errorDistance&quot; actually is a logical property of an input event

Ok, that makes some amount of sense.  It sounds similar to radiusX and radiusY on WebTouchPoint.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>700019</commentid>
    <comment_count>8</comment_count>
    <who name="Tien-Ren Chen">trchen</who>
    <bug_when>2012-08-20 15:02:18 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 158702 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=158702&amp;action=review
&gt; 
&gt; This review is mostly questions.  The the main thing I&apos;d like to change is to remove generatedByLinkPreview.  Is there a way around adding that state to WebKit?
&gt; 
&gt; &gt;&gt; Source/WebKit/chromium/public/WebInputEvent.h:382
&gt; &gt;&gt; +    bool generatedByLinkPreview;
&gt; &gt; 
&gt; &gt; Here&apos;s a thought.  This value could be replaced by &quot;float errorDistance;&quot;  The browser could send down a value corresponding to basically the size of a finger and it could feed into the scoring function.  When the tap already has been disambiguated, the error can be set to zero.
&gt; 
&gt; Is there a way to keep this state in Chromium?  It&apos;s not really a concern of WebKit...  All that might be required is for the RenderView to remember whether it is currently showing a link previous popup.

After all I think we don&apos;t have to add another flag. I think we can reuse WebGestureEvent.boundingBox which stands for the touch point radius for the single tap events. For an artificial tap we can set that to a zero-sized rect.

&gt; &gt; Source/WebKit/chromium/public/WebViewClient.h:290
&gt; &gt; +    // Return true if the embedder will start a link preview so the input event will be swallowed
&gt; &gt; +    virtual bool triggersLinkPreview(const WebRect&amp; windowZoomRect) { return false; }
&gt; 
&gt; triggersLinkPreview  -&gt;  shouldCauseLinkDisambiguation ?

I think maybe handleLinkDisambiguation would be better.

&gt; What is windowZoomRect?  How can a rect cause link disambiguation?  This is probably fine, it&apos;s just a bit confusing.

It is the bounding box of the touch target candidates, in window coordinate.

&gt; &gt; Source/WebKit/chromium/src/WebViewImpl.cpp:710
&gt; &gt; +bool isEventNode(Node *node)
&gt; &gt; +{
&gt; &gt; +    return node &amp;&amp; (node-&gt;supportsFocus()
&gt; &gt; +        || node-&gt;hasEventListeners(eventNames().clickEvent)
&gt; &gt; +        || node-&gt;hasEventListeners(eventNames().mousedownEvent)
&gt; &gt; +        || node-&gt;hasEventListeners(eventNames().mouseupEvent));
&gt; &gt; +}
&gt; 
&gt; Should this be in WebCore?  It&apos;s not really specific to Chromium and it doesn&apos;t really seem like a concern of the entire WebView.
&gt; 
&gt; It&apos;s tempting to implement every feature in WebViewImpl.cpp, but if we did that, WebViewImpl.cpp would grow to be even more huge than it is today.
&gt; 
&gt; &gt; Source/WebKit/chromium/src/WebViewImpl.cpp:713
&gt; &gt; +IntRect calculateEventNodeBoundingBox(Node* eventNode)
&gt; 
&gt; Again, this doesn&apos;t seem specific to Chromium and seems like something that could live in WebCore somewhere.
&gt; 
&gt; &gt; Source/WebKit/chromium/src/WebViewImpl.cpp:732
&gt; &gt; +float scoreTouchTarget(IntPoint touchPoint, int padding, IntRect boundingBox)
&gt; 
&gt; Should this be in a separate file in WebKit/chromium/src ?  We try to avoid putting everything in WebViewImpl.cpp.
&gt; 
&gt; &gt; Source/WebKit/chromium/src/WebViewImpl.cpp:772
&gt; &gt; +    // Find event handler node in the ancestor chain for each hit test result
&gt; 
&gt; I wonder if a bunch of this should be moved into the same file as scoreTouchTarget

I think moving all these to WebCore/page/chromium/ may be a good idea.

&gt; &gt; Source/WebKit/chromium/src/WebViewImpl.cpp:778
&gt; &gt; +            if (node-&gt;isDocumentNode() || node-&gt;hasTagName(HTMLNames::htmlTag) || node-&gt;hasTagName(HTMLNames::bodyTag))
&gt; &gt; +                break;
&gt; 
&gt; How does this work for SVG documents?

This is a non-exhaustive list of elements we don&apos;t want to zoom to. We added those tags because we&apos;ve seen a few dumb pages that adds event handlers on the page body and disambiguation popups become annoying. So far we haven&apos;t seen many dumb SVG documents but we might have to tune it if we get reports from QA.

&gt; &gt; Source/WebKit/chromium/src/WebViewImpl.cpp:798
&gt; &gt; +    // Only keep good touch targets with score &gt;= max(score)/2, and calculate the zoom rect
&gt; &gt; +    int numberOfGoodTargets = 0;
&gt; &gt; +    IntRect windowZoomRect = IntRect(touchPoint, IntSize(1, 1));
&gt; &gt; +    windowZoomRect.inflate(touchPointPadding);
&gt; &gt; +    for (HashMap&lt;Node*, TouchTargetData&gt;::iterator it = touchTargets.begin(); it != touchTargets.end(); ++it) {
&gt; &gt; +        if (it-&gt;second.score &lt; bestScore * 0.5)
&gt; &gt; +            continue;
&gt; &gt; +        numberOfGoodTargets++;
&gt; &gt; +        windowZoomRect.unite(it-&gt;second.windowBoundingBox);
&gt; &gt; +    }
&gt; 
&gt; This too.
&gt; 
&gt; &gt; Source/WebKit/chromium/src/WebViewImpl.cpp:800
&gt; &gt; +    // TODO: replace touch adjustment code when numberOfGoodTargets == 1?
&gt; 
&gt; TODO -&gt; FIXME

Done</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>706166</commentid>
    <comment_count>9</comment_count>
      <attachid>160927</attachid>
    <who name="Tien-Ren Chen">trchen</who>
    <bug_when>2012-08-28 01:18:54 -0700</bug_when>
    <thetext>Created attachment 160927
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>706170</commentid>
    <comment_count>10</comment_count>
      <attachid>160927</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-08-28 01:26:36 -0700</bug_when>
    <thetext>Comment on attachment 160927
Patch

Attachment 160927 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/13665080</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>706354</commentid>
    <comment_count>11</comment_count>
      <attachid>160927</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-08-28 08:10:04 -0700</bug_when>
    <thetext>Comment on attachment 160927
Patch

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

&gt; Source/WebCore/page/TouchDisambiguation.cpp:46
&gt; +namespace {

Generally, WebKit prefers to use file-level static functions rather than anonymous namespaces.

&gt; Source/WebCore/page/TouchDisambiguation.cpp:54
&gt; +bool isEventNode(Node *node)
&gt; +{
&gt; +    return node &amp;&amp; (node-&gt;supportsFocus()
&gt; +        || node-&gt;hasEventListeners(eventNames().clickEvent)
&gt; +        || node-&gt;hasEventListeners(eventNames().mousedownEvent)
&gt; +        || node-&gt;hasEventListeners(eventNames().mouseupEvent));
&gt; +}

This looks like it should be a member function on Node.  See also the discussion in https://bugs.webkit.org/show_bug.cgi?id=94727#c6

It sounds like there&apos;s already a willRespondToMouseClickEvents.  Should we use that instead?  If not, we should move this code near that code.

&gt; Source/WebCore/page/TouchDisambiguation.cpp:56
&gt; +// Calculate the union of the bounding boxes of all descendant nodes that propagates events up.

This comment just explains what the code does, not why it does it.  We should remove it.

&gt; Source/WebCore/page/TouchDisambiguation.cpp:57
&gt; +IntRect calculateEventNodeBoundingBox(Node* eventNode)

The word &quot;calculate&quot; doesn&apos;t really add anything to the name of this function.  Perhaps &quot;boundingBoxForDescendantsThatRespondToMouseEvents&quot; ?  That might be a bit long...  boundingBoxForEventNodes ?

&gt; Source/WebCore/page/TouchDisambiguation.cpp:60
&gt; +    if (!eventNode-&gt;document() || !eventNode-&gt;document()-&gt;view())
&gt; +        return IntRect();

eventNode-&gt;document() can only be 0 for DocumentType nodes.  It seems unlikely eventNode can ever be a DocumentType node (i.e. &lt;!DOCTYPE html&gt;).  We should remove the 0 check.

&gt; Source/WebCore/page/TouchDisambiguation.cpp:65
&gt; +        // skip the whole sub-tree if the node doesn&apos;t propagate events

Please use proper sentence punctuation, including initial capital letters and trailing periods.

&gt; Source/WebCore/page/TouchDisambiguation.cpp:78
&gt; +    float divPadding = (float)1 / padding;

What does &quot;divPadding&quot; mean?

&gt; Source/WebCore/page/TouchDisambiguation.cpp:82
&gt; +    if (boundingBox.isEmpty())
&gt; +        return 0;

Perhaps this should be the first statement in the function.

&gt; Source/WebCore/page/TouchDisambiguation.cpp:98
&gt; +void listGoodTouchTargets(Vector&lt;IntRect&gt;&amp; goodTargets, const IntRect&amp; touchBox, Frame* mainFrame, float pageScaleFactor)

Typically we place the out parameters at the end of the parameter list.

&gt; Source/WebCore/page/TouchDisambiguation.cpp:102
&gt; +    int touchPointPadding = (max(touchBox.width(), touchBox.height()) + 1) / 2;

Why do we add 1?

&gt; Source/WebCore/page/TouchDisambiguation.cpp:104
&gt; +    //         We have to pre-apply page scale factor here.

You&apos;ve got an extra space before the &quot;we&quot;.

&gt; Source/WebCore/page/TouchDisambiguation.cpp:105
&gt; +    int padding = touchPointPadding / pageScaleFactor;

Should touchPointPadding be a float so we don&apos;t lose precision?

&gt; Source/WebCore/page/TouchDisambiguation.cpp:113
&gt; +    // Find event handler node in the ancestor chain for each hit test result

This comment just says what the code does, not why.  We should remove it.

&gt; Source/WebCore/page/TouchDisambiguation.cpp:130
&gt; +    // Only keep good touch targets with score &gt;= max(score)/2, and calculate the zoom rect

ditto

&gt; Source/WebCore/page/TouchDisambiguation.cpp:132
&gt; +        if (it-&gt;second.score &lt; bestScore * 0.5)

I might add a comment explaining why this is a good heuristic.

&gt; Source/WebCore/page/TouchDisambiguation.h:41
&gt; +void listGoodTouchTargets(Vector&lt;IntRect&gt;&amp; goodTargets, const IntRect&amp; touchBox, Frame* mainFrame, float pageScaleFactor);

list -&gt; find</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>706360</commentid>
    <comment_count>12</comment_count>
      <attachid>160927</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-08-28 08:13:11 -0700</bug_when>
    <thetext>Comment on attachment 160927
Patch

This patch looks pretty good.  The comments above are all just minor nit picks.  Let&apos;s iterate on the patch once more and then we&apos;ll likely be ready to land it.  Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>706366</commentid>
    <comment_count>13</comment_count>
      <attachid>160927</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-08-28 08:19:24 -0700</bug_when>
    <thetext>Comment on attachment 160927
Patch

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

&gt; Source/WebKit/chromium/ChangeLog:16
&gt; +        FIXME: add tests

I should mention that you can probably test this patch by adding a unit test in WebFrameTests.cpp (in Source/WebKit/chromium/tests).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>706765</commentid>
    <comment_count>14</comment_count>
    <who name="Tien-Ren Chen">trchen</who>
    <bug_when>2012-08-28 14:58:29 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; (From update of attachment 160927 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=160927&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:46
&gt; &gt; +namespace {
&gt; 
&gt; Generally, WebKit prefers to use file-level static functions rather than anonymous namespaces.

Okay, but I&apos;ll need an anonymous namespace for struct TouchTargetData anyway. Do we still prefer static function in this case?

&gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:54
&gt; &gt; +bool isEventNode(Node *node)
&gt; &gt; +{
&gt; &gt; +    return node &amp;&amp; (node-&gt;supportsFocus()
&gt; &gt; +        || node-&gt;hasEventListeners(eventNames().clickEvent)
&gt; &gt; +        || node-&gt;hasEventListeners(eventNames().mousedownEvent)
&gt; &gt; +        || node-&gt;hasEventListeners(eventNames().mouseupEvent));
&gt; &gt; +}
&gt; 
&gt; This looks like it should be a member function on Node.  See also the discussion in https://bugs.webkit.org/show_bug.cgi?id=94727#c6
&gt; 
&gt; It sounds like there&apos;s already a willRespondToMouseClickEvents.  Should we use that instead?  If not, we should move this code near that code.

Looks interesting. There is some subtle difference but generally it catches everything we want to catch. I think we can try that first.

&gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:56
&gt; &gt; +// Calculate the union of the bounding boxes of all descendant nodes that propagates events up.
&gt; 
&gt; This comment just explains what the code does, not why it does it.  We should remove it.

Done

&gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:57
&gt; &gt; +IntRect calculateEventNodeBoundingBox(Node* eventNode)
&gt; 
&gt; The word &quot;calculate&quot; doesn&apos;t really add anything to the name of this function.  Perhaps &quot;boundingBoxForDescendantsThatRespondToMouseEvents&quot; ?  That might be a bit long...  boundingBoxForEventNodes ?

Done

&gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:60
&gt; &gt; +    if (!eventNode-&gt;document() || !eventNode-&gt;document()-&gt;view())
&gt; &gt; +        return IntRect();
&gt; 
&gt; eventNode-&gt;document() can only be 0 for DocumentType nodes.  It seems unlikely eventNode can ever be a DocumentType node (i.e. &lt;!DOCTYPE html&gt;).  We should remove the 0 check.

Done

&gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:65
&gt; &gt; +        // skip the whole sub-tree if the node doesn&apos;t propagate events
&gt; 
&gt; Please use proper sentence punctuation, including initial capital letters and trailing periods.

Done

&gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:78
&gt; &gt; +    float divPadding = (float)1 / padding;
&gt; 
&gt; What does &quot;divPadding&quot; mean?

Cached reciprocal for DIVision ... Yea div can be confused with &lt;div&gt;, let me change this.

&gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:82
&gt; &gt; +    if (boundingBox.isEmpty())
&gt; &gt; +        return 0;
&gt; 
&gt; Perhaps this should be the first statement in the function.

Done

&gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:98
&gt; &gt; +void listGoodTouchTargets(Vector&lt;IntRect&gt;&amp; goodTargets, const IntRect&amp; touchBox, Frame* mainFrame, float pageScaleFactor)
&gt; 
&gt; Typically we place the out parameters at the end of the parameter list.

Done

&gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:102
&gt; &gt; +    int touchPointPadding = (max(touchBox.width(), touchBox.height()) + 1) / 2;
&gt; 
&gt; Why do we add 1?

Rounds up

&gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:104
&gt; &gt; +    //         We have to pre-apply page scale factor here.
&gt; 
&gt; You&apos;ve got an extra space before the &quot;we&quot;.

Done

&gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:105
&gt; &gt; +    int padding = touchPointPadding / pageScaleFactor;
&gt; 
&gt; Should touchPointPadding be a float so we don&apos;t lose precision?

I think it&apos;s ok. The semantics is more like padding=pixelSnapped(touchPointPadding.scale(1/pageScaleFactor)) as in transformation. We do need to make it round up though.

&gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:113
&gt; &gt; +    // Find event handler node in the ancestor chain for each hit test result
&gt; 
&gt; This comment just says what the code does, not why.  We should remove it.

Done

&gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:130
&gt; &gt; +    // Only keep good touch targets with score &gt;= max(score)/2, and calculate the zoom rect
&gt; 
&gt; ditto

Done

&gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:132
&gt; &gt; +        if (it-&gt;second.score &lt; bestScore * 0.5)
&gt; 
&gt; I might add a comment explaining why this is a good heuristic.

Done

&gt; &gt; Source/WebCore/page/TouchDisambiguation.h:41
&gt; &gt; +void listGoodTouchTargets(Vector&lt;IntRect&gt;&amp; goodTargets, const IntRect&amp; touchBox, Frame* mainFrame, float pageScaleFactor);
&gt; 
&gt; list -&gt; find

Done</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>706804</commentid>
    <comment_count>15</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-08-28 15:49:29 -0700</bug_when>
    <thetext>&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=160927&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/page/TouchDisambiguation.cpp:46
&gt; &gt; &gt; +namespace {
&gt; &gt; 
&gt; &gt; Generally, WebKit prefers to use file-level static functions rather than anonymous namespaces.
&gt; 
&gt; Okay, but I&apos;ll need an anonymous namespace for struct TouchTargetData anyway. Do we still prefer static function in this case?

We can also just leak the symbol for TouchTargetData.  It&apos;s not a big deal either way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>706807</commentid>
    <comment_count>16</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-08-28 15:51:07 -0700</bug_when>
    <thetext>*** Bug 92043 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>707041</commentid>
    <comment_count>17</comment_count>
      <attachid>161122</attachid>
    <who name="Tien-Ren Chen">trchen</who>
    <bug_when>2012-08-28 20:29:00 -0700</bug_when>
    <thetext>Created attachment 161122
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>707042</commentid>
    <comment_count>18</comment_count>
      <attachid>161122</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-08-28 20:33:58 -0700</bug_when>
    <thetext>Comment on attachment 161122
Patch

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

Thanks!

&gt; Source/WebCore/page/TouchDisambiguation.cpp:32
&gt; +

We usually skip this blank line.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>707043</commentid>
    <comment_count>19</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-08-28 20:34:33 -0700</bug_when>
    <thetext>Looks like you&apos;ve got a merge conflict in WebViewImpl.cpp.  Otherwise, this looks ready to land.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>707904</commentid>
    <comment_count>20</comment_count>
      <attachid>161322</attachid>
    <who name="Tien-Ren Chen">trchen</who>
    <bug_when>2012-08-29 14:55:33 -0700</bug_when>
    <thetext>Created attachment 161322
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>707905</commentid>
    <comment_count>21</comment_count>
    <who name="Tien-Ren Chen">trchen</who>
    <bug_when>2012-08-29 14:56:02 -0700</bug_when>
    <thetext>(In reply to comment #20)
&gt; Created an attachment (id=161322) [details]
&gt; Patch

Nothing changed. Rebase only.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>708271</commentid>
    <comment_count>22</comment_count>
      <attachid>161322</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-08-29 21:08:15 -0700</bug_when>
    <thetext>Comment on attachment 161322
Patch

Clearing flags on attachment: 161322

Committed r127095: &lt;http://trac.webkit.org/changeset/127095&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>708272</commentid>
    <comment_count>23</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-08-29 21:08:21 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>710908</commentid>
    <comment_count>24</comment_count>
    <who name="Allan Sandfeld Jensen">allan.jensen</who>
    <bug_when>2012-09-04 02:19:57 -0700</bug_when>
    <thetext>I think this should be merged with the code in page/TouchAdjustment.cpp. The main difference seems to be the result is a number of &quot;good&quot; targets instead of a single one?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>711241</commentid>
    <comment_count>25</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-09-04 11:02:01 -0700</bug_when>
    <thetext>(In reply to comment #24)
&gt; I think this should be merged with the code in page/TouchAdjustment.cpp. The main difference seems to be the result is a number of &quot;good&quot; targets instead of a single one?

Would you be willing to file a new bug to this effect and CC trchen and myself?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>711258</commentid>
    <comment_count>26</comment_count>
    <who name="Tien-Ren Chen">trchen</who>
    <bug_when>2012-09-04 11:15:40 -0700</bug_when>
    <thetext>(In reply to comment #24)
&gt; I think this should be merged with the code in page/TouchAdjustment.cpp. The main difference seems to be the result is a number of &quot;good&quot; targets instead of a single one?

Yes I&apos;m also aware of the similarity of these two classes.

My priority was to upstream whatever we have to make things work, but in the long term I&apos;m happy to try to unify them.

Also, I&apos;m not certain but there may be some weird patent issue. Let me CC klobag@ to make sure there will be no potential troubles.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>711320</commentid>
    <comment_count>27</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-09-04 12:01:26 -0700</bug_when>
    <thetext>&gt; My priority was to upstream whatever we have to make things work, but in the long term I&apos;m happy to try to unify them.

It&apos;s important that we don&apos;t make a mess while upstreaming this code.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>158702</attachid>
            <date>2012-08-15 21:06:10 -0700</date>
            <delta_ts>2012-08-28 01:18:50 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-94182-20120815210536.patch</filename>
            <type>text/plain</type>
            <size>17665</size>
            <attacher name="Tien-Ren Chen">trchen</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTI1NDQ4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCmluZGV4
IDEzY2U1ZjE3ZWNjY2IwNDBjMWJjMDA5OGIzODdmNzVkZjc4NWU1NjYuLmY2MWEzNGZhNjYyNGJh
MGYzY2MwOTJmNzRmMmRjMzcwZWIxZTk5MjcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCkBA
IC0xLDMgKzEsNDEgQEAKKzIwMTItMDgtMTUgIFRpZW4tUmVuIENoZW4gIDx0cmNoZW5AY2hyb21p
dW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0gSW1wbGVtZW50IExpbmsgUHJldmlldyAoYS5r
LmEuIG9uLWRlbWFuZCB6b29tKQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9OTQxODIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBJbiB0aGlzIG5ldyBpbXBsZW1lbnRhdGlvbiwgd2UgYWRkIGEgbmV3IFdlYlZp
ZXdDbGllbnQ6OnRyaWdnZXJzTGlua1ByZXZpZXcgZGVsZWdhdGUuCisgICAgICAgIEEgbGluayBw
cmV2aWV3IHdpbGwgYmUgaW5pdGlhdGVkIGJ5IHRoZSBnZXN0dXJlIGV2ZW50IGhhbmRsZXIKKyAg
ICAgICAgaW4gV2ViVmlld0ltcGwgaWYgYW4gYW1iaWd1b3VzIHRhcCBpcyBkZXRlY3RlZCwgYW5k
CisgICAgICAgIG1fY2xpZW50LT50cmlnZ2Vyc0xpbmtQcmV2aWV3IHdpbGwgYmUgY2FsbGVkLCBz
byB0aGUgZW1iZWRkZXIgY2FuCisgICAgICAgIGRlY2lkZSB3aGV0aGVyIHRvIHN3YWxsb3cgdGhl
IHRvdWNoIGV2ZW50IGFuZCBzaG93IHRoZSBvbi1kZW1hbmQgem9vbS4KKworICAgICAgICBUaGlz
IHBhdGNoIGFsc28gcmVtb3ZlcyB0aGUgb2xkIHN0dWJzIHVzZWQgYnkgcHJldmlvdXMgQW5kcm9p
ZCBpbXBsZW1lbnRhdGlvbi4KKworICAgICAgICBGSVhNRTogYWRkIHRlc3RzCisKKyAgICAgICAg
KiBXZWJLaXQuZ3lwOgorICAgICAgICAqIGZlYXR1cmVzLmd5cGk6CisgICAgICAgICogcHVibGlj
L1dlYklucHV0RXZlbnQuaDoKKyAgICAgICAgKFdlYkdlc3R1cmVFdmVudCk6CisgICAgICAgIChX
ZWJLaXQ6OldlYkdlc3R1cmVFdmVudDo6V2ViR2VzdHVyZUV2ZW50KToKKyAgICAgICAgKiBwdWJs
aWMvV2ViVG91Y2hDYW5kaWRhdGVzSW5mby5oOiBSZW1vdmVkLgorICAgICAgICAqIHB1YmxpYy9X
ZWJWaWV3Lmg6CisgICAgICAgIChXZWJLaXQpOgorICAgICAgICAqIHB1YmxpYy9XZWJWaWV3Q2xp
ZW50Lmg6CisgICAgICAgIChXZWJLaXQpOgorICAgICAgICAoV2ViVmlld0NsaWVudCk6CisgICAg
ICAgIChXZWJLaXQ6OldlYlZpZXdDbGllbnQ6OnRyaWdnZXJzTGlua1ByZXZpZXcpOgorICAgICAg
ICAqIHNyYy9XZWJJbnB1dEV2ZW50LmNwcDoKKyAgICAgICAgKFNhbWVTaXplQXNXZWJHZXN0dXJl
RXZlbnQpOgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5jcHA6CisgICAgICAgIChXZWJLaXQp
OgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6aGFuZGxlR2VzdHVyZUV2ZW50V2l0aExp
bmtQcmV2aWV3KToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0ltcGw6OmhhbmRsZUdlc3R1cmVF
dmVudCk6CisgICAgICAgICogc3JjL1dlYlZpZXdJbXBsLmg6CisgICAgICAgIChXZWJWaWV3SW1w
bCk6CisKIDIwMTItMDgtMTMgIExlYW5kcm8gR3JhY2lhIEdpbCAgPGxlYW5kcm9ncmFjaWFAY2hy
b21pdW0ub3JnPgogCiAgICAgICAgIFtDaHJvbWl1bV0gRml4IG5pdHMgaW4gdGhlIGZpbmQtaW4t
cGFnZSBtYXRjaCByZWN0cyBBUEkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0v
V2ViS2l0Lmd5cCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAppbmRleCBlMjdj
YTI5YTViZTMyZmNjZjRhNGI5ZTUyNjJkM2Q5Y2UxOWE3NjY2Li4zZTc0MTI2MDhhY2JkYTMyNDNh
Njc4ZjIyMWY5NWE3ODkwNmU3OWZkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVt
L1dlYktpdC5neXAKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwCkBAIC0y
NzMsNyArMjczLDYgQEAKICAgICAgICAgICAgICAgICAncHVibGljL1dlYlRleHRJbnB1dFR5cGUu
aCcsCiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJUZXh0UnVuLmgnLAogICAgICAgICAgICAg
ICAgICdwdWJsaWMvV2ViVGltZVJhbmdlLmgnLAotICAgICAgICAgICAgICAgICdwdWJsaWMvV2Vi
VG91Y2hDYW5kaWRhdGVzSW5mby5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYlVSTExv
YWRlck9wdGlvbnMuaCcsCiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJVc2VyTWVkaWFDbGll
bnQuaCcsCiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJVc2VyTWVkaWFSZXF1ZXN0LmgnLApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9mZWF0dXJlcy5neXBpIGIvU291cmNl
L1dlYktpdC9jaHJvbWl1bS9mZWF0dXJlcy5neXBpCmluZGV4IDhkYzdlMmY2ZjY1MjhjZmFmYTU0
NDJmMGYxZTkxZmU2ZjQwYTBmY2QuLmI1YjVmOGYyMDU0MWZmZmQ4OWFlZGYzZmM2NDVhYzM0YTY2
YjJiOWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vZmVhdHVyZXMuZ3lwaQor
KysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL2ZlYXR1cmVzLmd5cGkKQEAgLTgxLDYgKzgxLDcg
QEAKICAgICAgICdFTkFCTEVfTEVHQUNZX1dFQktJVF9CTE9CX0JVSUxERVI9MScsCiAgICAgICAn
RU5BQkxFX0xJTktfUFJFRkVUQ0g9MScsCiAgICAgICAnRU5BQkxFX0xJTktfUFJFUkVOREVSPTEn
LAorICAgICAgJ0VOQUJMRV9MSU5LX1BSRVZJRVc9MScsCiAgICAgICAnRU5BQkxFX01FRElBX1NP
VVJDRT0xJywKICAgICAgICdFTkFCTEVfTUVESUFfU1RBVElTVElDUz0xJywKICAgICAgICdFTkFC
TEVfTUVURVJfRUxFTUVOVD0xJywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0v
cHVibGljL1dlYklucHV0RXZlbnQuaCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dl
YklucHV0RXZlbnQuaAppbmRleCAwOTA0OGNkZWQ3YzE0NDY5NDUzNjQzNDI5NmY3YWQ2OWRlOGU3
YjM3Li42MDE3YzU3ODljMDkwMjE3YWMwZWNmZGNhYWQyOTE3ZmE5NjBmNGU5IDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJJbnB1dEV2ZW50LmgKKysrIGIvU291
cmNlL1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViSW5wdXRFdmVudC5oCkBAIC0zNzksNiArMzc5
LDggQEAgcHVibGljOgogICAgIGZsb2F0IGRlbHRhWTsKICAgICBXZWJSZWN0IGJvdW5kaW5nQm94
OwogCisgICAgYm9vbCBnZW5lcmF0ZWRCeUxpbmtQcmV2aWV3OworCiAgICAgV2ViR2VzdHVyZUV2
ZW50KHVuc2lnbmVkIHNpemVQYXJhbSA9IHNpemVvZihXZWJHZXN0dXJlRXZlbnQpKQogICAgICAg
ICA6IFdlYklucHV0RXZlbnQoc2l6ZVBhcmFtKQogICAgICAgICAsIHgoMCkKQEAgLTM4Nyw2ICsz
ODksNyBAQCBwdWJsaWM6CiAgICAgICAgICwgZ2xvYmFsWSgwKQogICAgICAgICAsIGRlbHRhWCgw
LjBmKQogICAgICAgICAsIGRlbHRhWSgwLjBmKQorICAgICAgICAsIGdlbmVyYXRlZEJ5TGlua1By
ZXZpZXcoZmFsc2UpCiAgICAgewogICAgIH0KIH07CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0
L2Nocm9taXVtL3B1YmxpYy9XZWJUb3VjaENhbmRpZGF0ZXNJbmZvLmggYi9Tb3VyY2UvV2ViS2l0
L2Nocm9taXVtL3B1YmxpYy9XZWJUb3VjaENhbmRpZGF0ZXNJbmZvLmgKZGVsZXRlZCBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDY1ZDQwMjRhMmRjM2FiZTdlODRhYWUwZmY3ZjY4MzZjZjQ3YjRiZDQu
LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dl
YktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViVG91Y2hDYW5kaWRhdGVzSW5mby5oCisrKyAvZGV2L251
bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0g
KiBhcmUgbWV0OgotICoKLSAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBB
TkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwot
ICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgV2ViVG91Y2hDYW5kaWRhdGVzSW5m
b19oCi0jZGVmaW5lIFdlYlRvdWNoQ2FuZGlkYXRlc0luZm9faAotCi0jaW5jbHVkZSAicGxhdGZv
cm0vV2ViUmVjdC5oIgotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotc3RydWN0IFdlYlRvdWNoQ2Fu
ZGlkYXRlc0luZm8gewotICAgIC8vIFRoZSBudW1iZXIgb2YgcG9zc2libGUgdG91Y2ggcmVjZWl2
ZXJzIGZyb20gdGhlIGxhc3QgdG91Y2guCi0gICAgaW50IG51bWJlck9mQ2FuZGlkYXRlczsKLQot
ICAgIC8vIFRoZSBib3VuZHMgb2YgdGhlIHBvc3NpYmxlIHRvdWNoIGNhbmRpZGF0ZXMuIFRoaXMg
d2lsbCBlbmNsb3NlIHRoZQotICAgIC8vIHJlY3RzIG9mIGFueSBwb3NzaWJsZSB0b3VjaCBjYW5k
aWRhdGVzIGZvciBhIHByZXNzLgotICAgIFdlYlJlY3QgdW5pdGVkQm91bmRzOwotCi0gICAgLy8g
VGhlIHNtYWxsZXN0IGRpbWVuc2lvbiAoZWl0aGVyIHdpZHRoIG9yIGhlaWdodCkgb2YgYW55IG9m
IHRoZQotICAgIC8vIGF2YWlsYWJsZSB0b3VjaCB0YXJnZXRzLgotICAgIGludCBzbWFsbGVzdERp
bWVuc2lvbjsKLQotICAgIFdlYlRvdWNoQ2FuZGlkYXRlc0luZm8oKQotICAgICAgICA6IG51bWJl
ck9mQ2FuZGlkYXRlcygwKQotICAgICAgICAsIHNtYWxsZXN0RGltZW5zaW9uKDApCi0gICAgewot
ICAgIH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFdlYktpdAotCi0jZW5kaWYKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYlZpZXcuaCBiL1NvdXJjZS9XZWJLaXQv
Y2hyb21pdW0vcHVibGljL1dlYlZpZXcuaAppbmRleCBlOGY3OTFmYTZkODJiMzgxMzM2Y2U0MGQ3
ZTk1NmE0MDM0NmQ2OThkLi5kMzk1NTJjZDc5MmY4YzVlYzVhZmUxNmNjYzZhMGVlMzIzMTI4Mzg1
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJWaWV3LmgKKysr
IGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViVmlldy5oCkBAIC02NCw3ICs2NCw2
IEBAIHN0cnVjdCBXZWJGbG9hdFF1YWQ7CiBzdHJ1Y3QgV2ViTWVkaWFQbGF5ZXJBY3Rpb247CiBz
dHJ1Y3QgV2ViUGx1Z2luQWN0aW9uOwogc3RydWN0IFdlYlBvaW50Owotc3RydWN0IFdlYlRvdWNo
Q2FuZGlkYXRlc0luZm87CiAKIGNsYXNzIFdlYlZpZXcgOiBwdWJsaWMgV2ViV2lkZ2V0IHsKIHB1
YmxpYzoKQEAgLTQ2NywyMCArNDY2LDYgQEAgcHVibGljOgogCiAgICAgdmlydHVhbCBXZWJWaWV3
QmVuY2htYXJrU3VwcG9ydCogYmVuY2htYXJrU3VwcG9ydCgpIHsgcmV0dXJuIDA7IH0KIAotCi0g
ICAgLy8gVG91Y2ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gUmV0dXJucyBhIGxpc3Qgb2YgbGF5b3V0IGJv
dW5kaW5nIGJveGVzIG9mIHRoZSBldmVudCB0YXJnZXQgbm9kZSB0b3VjaGVkIGJ5Ci0gICAgLy8g
dGhlIGlucHV0IHBvaW50IHdpdGggdGhlIHBhZGRpbmcuIElmIG5vIHRhcmdldCBub2RlIGlzIGZv
dW5kLCBhbiBlbXB0eQotICAgIC8vIGxpc3QgaXMgcmV0dXJuZWQuIElmIHRoZSBub2RlIGlzIG9m
IGFuIGlubGluZSB0eXBlLCBlYWNoIGxpbmUgYm94IGlzIHJldHVybmVkCi0gICAgLy8gc2VwYXJh
dGVseS4gT3RoZXJ3aXNlLCBvbmUgYm91bmRpbmcgYm94IGlzIHJldHVybmVkLiBBbHNvIHJldHVy
bnMgaW5mb3JtYXRpb24KLSAgICAvLyBhYm91dCB0aGUgZm91bmQgY2FuZGlkYXRlcyBhbmQgdGhl
aXIgZGltZW5zaW9uLCBhbmQgdGhlIGhpZ2hsaWdodCBjb2xvciB0byB1c2UuCi0gICAgdmlydHVh
bCBXZWJWZWN0b3I8V2ViRmxvYXRRdWFkPiBnZXRUb3VjaEhpZ2hsaWdodFF1YWRzKGNvbnN0IFdl
YlBvaW50JiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaW50IHBhZGRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlRvdWNoQ2FuZGlkYXRlc0luZm8mIG91dFRv
dWNoSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgV2ViQ29sb3ImIG91dFRhcEhpZ2hsaWdodENvbG9yKSA9IDA7Ci0KLQogICAg
IC8vIFZpc2liaWxpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIC8vIFNldHMgdGhlIHZpc2liaWxpdHkgb2YgdGhlIFdl
YlZpZXcuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJWaWV3
Q2xpZW50LmggYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJWaWV3Q2xpZW50LmgK
aW5kZXggNzI2Y2M2NDgyZmI2ODdhYjAwYmEwZGM2ODZiMDhmZjI3YTIwYWFiYy4uZWZkZDEyOGFk
Y2RkNjVhZWUyZWJkNGFiY2Y2YjVjMTQ1NjQ2OWE3NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktp
dC9jaHJvbWl1bS9wdWJsaWMvV2ViVmlld0NsaWVudC5oCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vcHVibGljL1dlYlZpZXdDbGllbnQuaApAQCAtNzEsNiArNzEsNyBAQCBjbGFzcyBXZWJL
ZXlib2FyZEV2ZW50OwogY2xhc3MgV2ViTm9kZTsKIGNsYXNzIFdlYk5vdGlmaWNhdGlvblByZXNl
bnRlcjsKIGNsYXNzIFdlYlJhbmdlOworY2xhc3MgV2ViUmVjdDsKIGNsYXNzIFdlYlNwZWVjaElu
cHV0Q29udHJvbGxlcjsKIGNsYXNzIFdlYlNwZWVjaElucHV0TGlzdGVuZXI7CiBjbGFzcyBXZWJT
cGVlY2hSZWNvZ25pemVyOwpAQCAtMjg1LDYgKzI4Niw5IEBAIHB1YmxpYzoKICAgICAvLyB1bmxl
c3MgdGhlIHZpZXcgZGlkIG5vdCBuZWVkIGEgbGF5b3V0LgogICAgIHZpcnR1YWwgdm9pZCBkaWRV
cGRhdGVMYXlvdXQoKSB7IH0KIAorICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBlbWJlZGRlciB3
aWxsIHN0YXJ0IGEgbGluayBwcmV2aWV3IHNvIHRoZSBpbnB1dCBldmVudCB3aWxsIGJlIHN3YWxs
b3dlZAorICAgIHZpcnR1YWwgYm9vbCB0cmlnZ2Vyc0xpbmtQcmV2aWV3KGNvbnN0IFdlYlJlY3Qm
IHdpbmRvd1pvb21SZWN0KSB7IHJldHVybiBmYWxzZTsgfQorCiAgICAgLy8gU2Vzc2lvbiBoaXN0
b3J5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
CiAKICAgICAvLyBUZWxscyB0aGUgZW1iZWRkZXIgdG8gbmF2aWdhdGUgYmFjayBvciBmb3J3YXJk
IGluIHNlc3Npb24gaGlzdG9yeSBieQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1
bS9zcmMvV2ViSW5wdXRFdmVudC5jcHAgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJJ
bnB1dEV2ZW50LmNwcAppbmRleCA2NmEwNDgwYjRkNGFkYWMzMTdiYTMxMjlhN2YwMmNkM2E1ZmNi
NDY4Li4xYzYzMTI0NTQ3YTU0YjEyZTRhY2FlYzU3MGFiOWJlYzVkNmQ0NDgyIDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJJbnB1dEV2ZW50LmNwcAorKysgYi9Tb3Vy
Y2UvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJJbnB1dEV2ZW50LmNwcApAQCAtNjAsNyArNjAsNyBA
QCBzdHJ1Y3QgU2FtZVNpemVBc1dlYk1vdXNlV2hlZWxFdmVudCA6IHB1YmxpYyBTYW1lU2l6ZUFz
V2ViTW91c2VFdmVudCB7CiB9OwogCiBzdHJ1Y3QgU2FtZVNpemVBc1dlYkdlc3R1cmVFdmVudCA6
IHB1YmxpYyBTYW1lU2l6ZUFzV2ViSW5wdXRFdmVudCB7Ci0gICAgaW50IGdlc3R1cmVEYXRhWzEw
XTsKKyAgICBpbnQgZ2VzdHVyZURhdGFbMTFdOwogfTsKIAogc3RydWN0IFNhbWVTaXplQXNXZWJU
b3VjaEV2ZW50IDogcHVibGljIFNhbWVTaXplQXNXZWJJbnB1dEV2ZW50IHsKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcCBiL1NvdXJjZS9XZWJL
aXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAppbmRleCAwZjY0NTNmOWZiOTU2MDNmMmFm
MTZiMmVlMTM2ZjBhYjcxNTJhYThmLi5jNWUwMGY3YjY3OTYxNGVhNDNkYmEzZjUxMGI1OTc2ODU3
OGYyNmNmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1w
bC5jcHAKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuY3BwCkBA
IC0xNDMsNyArMTQzLDYgQEAKICNpbmNsdWRlICJXZWJSdW50aW1lRmVhdHVyZXMuaCIKICNpbmNs
dWRlICJXZWJTZXR0aW5nc0ltcGwuaCIKICNpbmNsdWRlICJXZWJUZXh0SW5wdXRJbmZvLmgiCi0j
aW5jbHVkZSAiV2ViVG91Y2hDYW5kaWRhdGVzSW5mby5oIgogI2luY2x1ZGUgIldlYlZpZXdDbGll
bnQuaCIKICNpbmNsdWRlICJXaGVlbEV2ZW50LmgiCiAjaW5jbHVkZSAicGFpbnRpbmcvR3JhcGhp
Y3NDb250ZXh0QnVpbGRlci5oIgpAQCAtNjk4LDYgKzY5NywxMTQgQEAgdm9pZCBXZWJWaWV3SW1w
bDo6c2Nyb2xsQnkoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIGRlbHRhKQogfQogCiAjaWYgRU5B
QkxFKEdFU1RVUkVfRVZFTlRTKQorI2lmIEVOQUJMRShMSU5LX1BSRVZJRVcpCisKK25hbWVzcGFj
ZSB7CisKK2Jvb2wgaXNFdmVudE5vZGUoTm9kZSAqbm9kZSkKK3sKKyAgICByZXR1cm4gbm9kZSAm
JiAobm9kZS0+c3VwcG9ydHNGb2N1cygpCisgICAgICAgIHx8IG5vZGUtPmhhc0V2ZW50TGlzdGVu
ZXJzKGV2ZW50TmFtZXMoKS5jbGlja0V2ZW50KQorICAgICAgICB8fCBub2RlLT5oYXNFdmVudExp
c3RlbmVycyhldmVudE5hbWVzKCkubW91c2Vkb3duRXZlbnQpCisgICAgICAgIHx8IG5vZGUtPmhh
c0V2ZW50TGlzdGVuZXJzKGV2ZW50TmFtZXMoKS5tb3VzZXVwRXZlbnQpKTsKK30KKworLy8gQ2Fs
Y3VsYXRlIHRoZSB1bmlvbiBvZiB0aGUgYm91bmRpbmcgYm94ZXMgb2YgYWxsIGRlc2NlbmRhbnQg
bm9kZXMgdGhhdCBwcm9wYWdhdGVzIGV2ZW50cyB1cC4KK0ludFJlY3QgY2FsY3VsYXRlRXZlbnRO
b2RlQm91bmRpbmdCb3goTm9kZSogZXZlbnROb2RlKQoreworICAgIGlmICghZXZlbnROb2RlLT5k
b2N1bWVudCgpIHx8ICFldmVudE5vZGUtPmRvY3VtZW50KCktPnZpZXcoKSkKKyAgICAgICAgcmV0
dXJuIEludFJlY3QoKTsKKworICAgIEludFJlY3QgcmVzdWx0OworICAgIE5vZGUqIG5vZGUgPSBl
dmVudE5vZGU7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgLy8gc2tpcCB0aGUgd2hvbGUg
c3ViLXRyZWUgaWYgdGhlIG5vZGUgZG9lc24ndCBwcm9wYWdhdGUgZXZlbnRzCisgICAgICAgIGlm
IChub2RlICE9IGV2ZW50Tm9kZSAmJiBpc0V2ZW50Tm9kZShub2RlKSkgeworICAgICAgICAgICAg
bm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dFNpYmxpbmcoZXZlbnROb2RlKTsKKyAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC51bml0ZShwaXhlbFNuYXBwZWRJ
bnRSZWN0KG5vZGUtPmdldFJlY3QoKSkpOworICAgICAgICBub2RlID0gbm9kZS0+dHJhdmVyc2VO
ZXh0Tm9kZShldmVudE5vZGUpOworICAgIH0KKyAgICByZXR1cm4gZXZlbnROb2RlLT5kb2N1bWVu
dCgpLT52aWV3KCktPmNvbnRlbnRzVG9XaW5kb3cocmVzdWx0KTsKK30KKworZmxvYXQgc2NvcmVU
b3VjaFRhcmdldChJbnRQb2ludCB0b3VjaFBvaW50LCBpbnQgcGFkZGluZywgSW50UmVjdCBib3Vu
ZGluZ0JveCkKK3sKKyAgICBmbG9hdCBkaXZQYWRkaW5nID0gKGZsb2F0KTEgLyBwYWRkaW5nOwor
ICAgIGZsb2F0IHNjb3JlID0gMTsKKworICAgIGlmIChib3VuZGluZ0JveC5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHRvdWNoUG9pbnQueCgpIDwgYm91bmRpbmdCb3gu
eCgpKQorICAgICAgICBzY29yZSAqPSBtYXgoKHBhZGRpbmcgLSAoYm91bmRpbmdCb3gueCgpIC0g
dG91Y2hQb2ludC54KCkpKSAqIGRpdlBhZGRpbmcsIChmbG9hdCkwKTsKKyAgICBpZiAodG91Y2hQ
b2ludC55KCkgPCBib3VuZGluZ0JveC55KCkpCisgICAgICAgIHNjb3JlICo9IG1heCgocGFkZGlu
ZyAtIChib3VuZGluZ0JveC55KCkgLSB0b3VjaFBvaW50LnkoKSkpICogZGl2UGFkZGluZywgKGZs
b2F0KTApOworICAgIGlmICh0b3VjaFBvaW50LngoKSA+IGJvdW5kaW5nQm94Lm1heFgoKSkKKyAg
ICAgICAgc2NvcmUgKj0gbWF4KChwYWRkaW5nIC0gKHRvdWNoUG9pbnQueCgpIC0gYm91bmRpbmdC
b3gubWF4WCgpKSkgKiBkaXZQYWRkaW5nLCAoZmxvYXQpMCk7CisgICAgaWYgKHRvdWNoUG9pbnQu
eSgpID4gYm91bmRpbmdCb3gubWF4WSgpKQorICAgICAgICBzY29yZSAqPSBtYXgoKHBhZGRpbmcg
LSAodG91Y2hQb2ludC55KCkgLSBib3VuZGluZ0JveC5tYXhZKCkpKSAqIGRpdlBhZGRpbmcsIChm
bG9hdCkwKTsKKworICAgIHJldHVybiBzY29yZTsKK30KKworc3RydWN0IFRvdWNoVGFyZ2V0RGF0
YSB7CisgICAgSW50UmVjdCB3aW5kb3dCb3VuZGluZ0JveDsKKyAgICBmbG9hdCBzY29yZTsKK307
CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworYm9vbCBXZWJWaWV3SW1wbDo6aGFuZGxlR2Vz
dHVyZUV2ZW50V2l0aExpbmtQcmV2aWV3KGNvbnN0IFdlYkdlc3R1cmVFdmVudCYgZXZlbnQpCit7
CisgICAgc3RhdGljIGNvbnN0IGludCB0b3VjaFBvaW50UGFkZGluZyA9IDE2OworICAgIC8vIEZJ
WE1FOiBSZWN0LWJhc2VkIGhpdCB0ZXN0IGRvZXNuJ3QgdHJhbnNmb3JtIHRoZSB0b3VjaCBwb2lu
dCBzaXplLgorICAgIC8vICAgICAgICAgV2UgaGF2ZSB0byBwcmUtYXBwbHkgcGFnZSBzY2FsZSBm
YWN0b3IgaGVyZS4KKyAgICBpbnQgcGFkZGluZyA9IHRvdWNoUG9pbnRQYWRkaW5nIC8gcGFnZVNj
YWxlRmFjdG9yKCk7CisKKyAgICBJbnRQb2ludCB0b3VjaFBvaW50ID0gSW50UG9pbnQoZXZlbnQu
eCwgZXZlbnQueSk7CisgICAgSW50UG9pbnQgY29udGVudHNQb2ludCA9IG1haW5GcmFtZUltcGwo
KS0+ZnJhbWVWaWV3KCktPndpbmRvd1RvQ29udGVudHModG91Y2hQb2ludCk7CisKKyAgICBIaXRU
ZXN0UmVzdWx0IHJlc3VsdCA9IG1haW5GcmFtZUltcGwoKS0+ZnJhbWUoKS0+ZXZlbnRIYW5kbGVy
KCktPmhpdFRlc3RSZXN1bHRBdFBvaW50KGNvbnRlbnRzUG9pbnQsIGZhbHNlLCBmYWxzZSwgRG9u
dEhpdFRlc3RTY3JvbGxiYXJzLCBIaXRUZXN0UmVxdWVzdDo6QWN0aXZlIHwgSGl0VGVzdFJlcXVl
c3Q6OlJlYWRPbmx5LCBJbnRTaXplKHBhZGRpbmcsIHBhZGRpbmcpKTsKKyAgICBjb25zdCBMaXN0
SGFzaFNldDxSZWZQdHI8Tm9kZT4gPiYgaGl0UmVzdWx0cyA9IHJlc3VsdC5yZWN0QmFzZWRUZXN0
UmVzdWx0KCk7CisKKyAgICAvLyBGaW5kIGV2ZW50IGhhbmRsZXIgbm9kZSBpbiB0aGUgYW5jZXN0
b3IgY2hhaW4gZm9yIGVhY2ggaGl0IHRlc3QgcmVzdWx0CisgICAgSGFzaE1hcDxOb2RlKiwgVG91
Y2hUYXJnZXREYXRhPiB0b3VjaFRhcmdldHM7CisgICAgZmxvYXQgYmVzdFNjb3JlID0gMDsKKyAg
ICBmb3IgKExpc3RIYXNoU2V0PFJlZlB0cjxOb2RlPiA+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGhp
dFJlc3VsdHMuYmVnaW4oKTsgaXQgIT0gaGl0UmVzdWx0cy5lbmQoKTsgKytpdCkgeworICAgICAg
ICBmb3IgKE5vZGUqIG5vZGUgPSBpdC0+Z2V0KCk7IG5vZGU7IG5vZGUgPSBub2RlLT5wYXJlbnRO
b2RlKCkpIHsKKyAgICAgICAgICAgIGlmIChub2RlLT5pc0RvY3VtZW50Tm9kZSgpIHx8IG5vZGUt
Pmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpodG1sVGFnKSB8fCBub2RlLT5oYXNUYWdOYW1lKEhUTUxO
YW1lczo6Ym9keVRhZykpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAo
aXNFdmVudE5vZGUobm9kZSkpIHsKKyAgICAgICAgICAgICAgICBUb3VjaFRhcmdldERhdGEmIHRh
cmdldERhdGEgPSB0b3VjaFRhcmdldHMuYWRkKG5vZGUsIFRvdWNoVGFyZ2V0RGF0YSgpKS5pdGVy
YXRvci0+c2Vjb25kOworICAgICAgICAgICAgICAgIHRhcmdldERhdGEud2luZG93Qm91bmRpbmdC
b3ggPSBjYWxjdWxhdGVFdmVudE5vZGVCb3VuZGluZ0JveChub2RlKTsKKyAgICAgICAgICAgICAg
ICB0YXJnZXREYXRhLnNjb3JlID0gc2NvcmVUb3VjaFRhcmdldCh0b3VjaFBvaW50LCB0b3VjaFBv
aW50UGFkZGluZywgdGFyZ2V0RGF0YS53aW5kb3dCb3VuZGluZ0JveCk7CisgICAgICAgICAgICAg
ICAgYmVzdFNjb3JlID0gbWF4KGJlc3RTY29yZSwgdGFyZ2V0RGF0YS5zY29yZSk7CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAv
LyBPbmx5IGtlZXAgZ29vZCB0b3VjaCB0YXJnZXRzIHdpdGggc2NvcmUgPj0gbWF4KHNjb3JlKS8y
LCBhbmQgY2FsY3VsYXRlIHRoZSB6b29tIHJlY3QKKyAgICBpbnQgbnVtYmVyT2ZHb29kVGFyZ2V0
cyA9IDA7CisgICAgSW50UmVjdCB3aW5kb3dab29tUmVjdCA9IEludFJlY3QodG91Y2hQb2ludCwg
SW50U2l6ZSgxLCAxKSk7CisgICAgd2luZG93Wm9vbVJlY3QuaW5mbGF0ZSh0b3VjaFBvaW50UGFk
ZGluZyk7CisgICAgZm9yIChIYXNoTWFwPE5vZGUqLCBUb3VjaFRhcmdldERhdGE+OjppdGVyYXRv
ciBpdCA9IHRvdWNoVGFyZ2V0cy5iZWdpbigpOyBpdCAhPSB0b3VjaFRhcmdldHMuZW5kKCk7ICsr
aXQpIHsKKyAgICAgICAgaWYgKGl0LT5zZWNvbmQuc2NvcmUgPCBiZXN0U2NvcmUgKiAwLjUpCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgbnVtYmVyT2ZHb29kVGFyZ2V0cysrOworICAg
ICAgICB3aW5kb3dab29tUmVjdC51bml0ZShpdC0+c2Vjb25kLndpbmRvd0JvdW5kaW5nQm94KTsK
KyAgICB9CisKKyAgICAvLyBUT0RPOiByZXBsYWNlIHRvdWNoIGFkanVzdG1lbnQgY29kZSB3aGVu
IG51bWJlck9mR29vZFRhcmdldHMgPT0gMT8KKyAgICBpZiAobnVtYmVyT2ZHb29kVGFyZ2V0cyA8
IDIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBtX2NsaWVudCAmJiBtX2Ns
aWVudC0+dHJpZ2dlcnNMaW5rUHJldmlldyh3aW5kb3dab29tUmVjdCk7Cit9CisjZW5kaWYKKwog
Ym9vbCBXZWJWaWV3SW1wbDo6aGFuZGxlR2VzdHVyZUV2ZW50KGNvbnN0IFdlYkdlc3R1cmVFdmVu
dCYgZXZlbnQpCiB7CiAgICAgc3dpdGNoIChldmVudC50eXBlKSB7CkBAIC03MTcsMTIgKzgyNCwy
MSBAQCBib29sIFdlYlZpZXdJbXBsOjpoYW5kbGVHZXN0dXJlRXZlbnQoY29uc3QgV2ViR2VzdHVy
ZUV2ZW50JiBldmVudCkKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgY2Fz
ZSBXZWJJbnB1dEV2ZW50OjpHZXN0dXJlVGFwOiB7Ci0gICAgICAgIFBsYXRmb3JtR2VzdHVyZUV2
ZW50QnVpbGRlciBwbGF0Zm9ybUV2ZW50KG1haW5GcmFtZUltcGwoKS0+ZnJhbWVWaWV3KCksIGV2
ZW50KTsKICAgICAgICAgUmVmUHRyPFdlYkNvcmU6OlBvcHVwQ29udGFpbmVyPiBzZWxlY3RQb3B1
cDsKICAgICAgICAgc2VsZWN0UG9wdXAgPSBtX3NlbGVjdFBvcHVwOwogICAgICAgICBoaWRlU2Vs
ZWN0UG9wdXAoKTsKICAgICAgICAgQVNTRVJUKCFtX3NlbGVjdFBvcHVwKTsKKworI2lmIEVOQUJM
RShMSU5LX1BSRVZJRVcpCisgICAgICAgIGlmICghZXZlbnQuZ2VuZXJhdGVkQnlMaW5rUHJldmll
dykgeworICAgICAgICAgICAgaWYgKGhhbmRsZUdlc3R1cmVFdmVudFdpdGhMaW5rUHJldmlldyhl
dmVudCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyNlbmRpZgor
CisgICAgICAgIFBsYXRmb3JtR2VzdHVyZUV2ZW50QnVpbGRlciBwbGF0Zm9ybUV2ZW50KG1haW5G
cmFtZUltcGwoKS0+ZnJhbWVWaWV3KCksIGV2ZW50KTsKICAgICAgICAgYm9vbCBnZXN0dXJlSGFu
ZGxlZCA9IG1haW5GcmFtZUltcGwoKS0+ZnJhbWUoKS0+ZXZlbnRIYW5kbGVyKCktPmhhbmRsZUdl
c3R1cmVFdmVudChwbGF0Zm9ybUV2ZW50KTsKKwogICAgICAgICBpZiAobV9zZWxlY3RQb3B1cCAm
JiBtX3NlbGVjdFBvcHVwID09IHNlbGVjdFBvcHVwKSB7CiAgICAgICAgICAgICAvLyBUaGF0IHRh
cCB0cmlnZ2VyZWQgYSBzZWxlY3QgcG9wdXAgd2hpY2ggaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB0
aGF0CiAgICAgICAgICAgICAvLyB3YXMgc2hvd2luZyBiZWZvcmUgdGhlIHRhcC4gSXQgbWVhbnMg
dGhlIHVzZXIgdGFwcGVkIHRoZSBzZWxlY3QKQEAgLTczMCw2ICs4NDYsNyBAQCBib29sIFdlYlZp
ZXdJbXBsOjpoYW5kbGVHZXN0dXJlRXZlbnQoY29uc3QgV2ViR2VzdHVyZUV2ZW50JiBldmVudCkK
ICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IHJlb3BlbmVkIHRoZSBzZWxlY3QgcG9wdXAuIEl0
IG5lZWRzIHRvIGJlIGNsb3NlZC4KICAgICAgICAgICAgIGhpZGVTZWxlY3RQb3B1cCgpOwogICAg
ICAgICB9CisKICAgICAgICAgcmV0dXJuIGdlc3R1cmVIYW5kbGVkOwogICAgIH0KICAgICBjYXNl
IFdlYklucHV0RXZlbnQ6Okdlc3R1cmVUd29GaW5nZXJUYXA6CkBAIC04MDIsMTcgKzkxOSw2IEBA
IFdlYlZpZXdCZW5jaG1hcmtTdXBwb3J0KiBXZWJWaWV3SW1wbDo6YmVuY2htYXJrU3VwcG9ydCgp
CiAgICAgcmV0dXJuICZtX2JlbmNobWFya1N1cHBvcnQ7CiB9CiAKLVdlYlZlY3RvcjxXZWJGbG9h
dFF1YWQ+IFdlYlZpZXdJbXBsOjpnZXRUb3VjaEhpZ2hsaWdodFF1YWRzKGNvbnN0IFdlYlBvaW50
JiBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGludCBwYWRkaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViVG91Y2hDYW5kaWRhdGVzSW5mbyYgb3V0
VG91Y2hJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgV2ViQ29sb3ImIG91dFRhcEhpZ2hsaWdodENvbG9yKQotewotICAgIC8v
IEZJWE1FOiBVcHN0cmVhbSB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGNocm9taXVtLWFuZHJvaWQg
YnJhbmNoLgotICAgIG5vdEltcGxlbWVudGVkKCk7Ci0KLSAgICByZXR1cm4gV2ViVmVjdG9yPFdl
YkZsb2F0UXVhZD4oKTsKLX0KLQogYm9vbCBXZWJWaWV3SW1wbDo6aGFuZGxlS2V5RXZlbnQoY29u
c3QgV2ViS2V5Ym9hcmRFdmVudCYgZXZlbnQpCiB7CiAgICAgQVNTRVJUKChldmVudC50eXBlID09
IFdlYklucHV0RXZlbnQ6OlJhd0tleURvd24pCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2No
cm9taXVtL3NyYy9XZWJWaWV3SW1wbC5oIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvV2Vi
Vmlld0ltcGwuaAppbmRleCAzOTc4MzY4MGZhMTk4OTg4NmM0NjBiMTNkNDBkZDE0MDQxYTJhNDJi
Li5jNzZhZmEwYmFkMGUwMmVjNjA1OTI1NjgyNWY1MWY0ZmE3NDE1YjJkIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5oCisrKyBiL1NvdXJjZS9XZWJL
aXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmgKQEAgLTMwMiwxMSArMzAyLDYgQEAgcHVibGlj
OgogICAgIHZpcnR1YWwgdm9pZCB0cmFuc2ZlckFjdGl2ZVdoZWVsRmxpbmdBbmltYXRpb24oY29u
c3QgV2ViQWN0aXZlV2hlZWxGbGluZ1BhcmFtZXRlcnMmKTsKICAgICB2aXJ0dWFsIFdlYlZpZXdC
ZW5jaG1hcmtTdXBwb3J0KiBiZW5jaG1hcmtTdXBwb3J0KCk7CiAKLSAgICB2aXJ0dWFsIFdlYlZl
Y3RvcjxXZWJGbG9hdFF1YWQ+IGdldFRvdWNoSGlnaGxpZ2h0UXVhZHMoY29uc3QgV2ViUG9pbnQm
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBpbnQgcGFkZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgV2ViVG91Y2hDYW5kaWRhdGVzSW5mbyYgb3V0VG91Y2hJbmZv
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBXZWJDb2xvciYgb3V0VGFwSGlnaGxpZ2h0Q29sb3IpOwotCiAgICAgLy8gV2ViTGF5ZXJU
cmVlVmlld0NsaWVudAogICAgIHZpcnR1YWwgdm9pZCB3aWxsQmVnaW5GcmFtZSgpOwogICAgIHZp
cnR1YWwgdm9pZCBkaWRCZWdpbkZyYW1lKCk7CkBAIC02NjEsNiArNjU2LDggQEAgcHJpdmF0ZToK
ICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlS2V5RXZlbnQoY29uc3QgV2ViS2V5Ym9hcmRFdmVudCYp
IE9WRVJSSURFOwogICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVDaGFyRXZlbnQoY29uc3QgV2ViS2V5
Ym9hcmRFdmVudCYpIE9WRVJSSURFOwogCisgICAgYm9vbCBoYW5kbGVHZXN0dXJlRXZlbnRXaXRo
TGlua1ByZXZpZXcoY29uc3QgV2ViR2VzdHVyZUV2ZW50Jik7CisKICAgICBXZWJTZXR0aW5nc0lt
cGwqIHNldHRpbmdzSW1wbCgpOwogCiAgICAgV2ViVmlld0NsaWVudCogbV9jbGllbnQ7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>160927</attachid>
            <date>2012-08-28 01:18:54 -0700</date>
            <delta_ts>2012-08-28 20:28:56 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-94182-20120828011845.patch</filename>
            <type>text/plain</type>
            <size>13902</size>
            <attacher name="Tien-Ren Chen">trchen</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTI2Njc4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCmluZGV4
IDgyMjI2ODMzZGE3MmIzMjZhODk0MWRkZDdlNjlhMDExOWNmNWM4ZjAuLmFjNWMwZGE2ZDJlOGI2
ZThmZWZmNWIxNmY2MGJiMDFjNTYxNGZmNjMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCkBA
IC0xLDMgKzEsNDEgQEAKKzIwMTItMDgtMjQgIFRpZW4tUmVuIENoZW4gIDx0cmNoZW5AY2hyb21p
dW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0gSW1wbGVtZW50IGRpc2FtYmlndWF0aW9uIHBv
cHVwIChhLmsuYS4gTGluayBQcmV2aWV3KQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9OTQxODIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBJbiB0aGlzIG5ldyBpbXBsZW1lbnRhdGlvbiwgd2UgYWRkIGEgbmV3
IFdlYlZpZXdDbGllbnQ6OnRyaWdnZXJzRGlzYW1iaWd1YXRpb25Qb3B1cCBkZWxlZ2F0ZS4KKyAg
ICAgICAgVGhlIGRpc2FtYmlndWF0aW9uIHNlcXVlbmNlIHdpbGwgYmUgaW5pdGlhdGVkIGJ5IHRo
ZSBnZXN0dXJlIGV2ZW50IGhhbmRsZXIKKyAgICAgICAgaW4gV2ViVmlld0ltcGwgaWYgYW4gYW1i
aWd1b3VzIHRhcCBpcyBkZXRlY3RlZCwgYW5kIHRoZW4KKyAgICAgICAgbV9jbGllbnQtPnRyaWdn
ZXJzRGlzYW1iaWd1YXRpb25Qb3B1cCB3aWxsIGJlIGNhbGxlZCwgc28gdGhlIGVtYmVkZGVyIGNh
bgorICAgICAgICBkZWNpZGUgd2hldGhlciB0byBzd2FsbG93IHRoZSB0b3VjaCBldmVudCBhbmQg
c2hvdyBhIHBvcHVwLgorCisgICAgICAgIFRoaXMgcGF0Y2ggYWxzbyByZW1vdmVzIHRoZSBvbGQg
c3R1YnMgdXNlZCBieSBwcmV2aW91cyBBbmRyb2lkIGltcGxlbWVudGF0aW9uLgorCisgICAgICAg
IEZJWE1FOiBhZGQgdGVzdHMKKworICAgICAgICAqIFdlYktpdC5neXA6CisgICAgICAgICogZmVh
dHVyZXMuZ3lwaToKKyAgICAgICAgKiBwdWJsaWMvV2ViSW5wdXRFdmVudC5oOgorICAgICAgICAo
V2ViR2VzdHVyZUV2ZW50KToKKyAgICAgICAgKFdlYktpdDo6V2ViR2VzdHVyZUV2ZW50OjpXZWJH
ZXN0dXJlRXZlbnQpOgorICAgICAgICAqIHB1YmxpYy9XZWJUb3VjaENhbmRpZGF0ZXNJbmZvLmg6
IFJlbW92ZWQuCisgICAgICAgICogcHVibGljL1dlYlZpZXcuaDoKKyAgICAgICAgKFdlYktpdCk6
CisgICAgICAgICogcHVibGljL1dlYlZpZXdDbGllbnQuaDoKKyAgICAgICAgKFdlYktpdCk6Cisg
ICAgICAgIChXZWJWaWV3Q2xpZW50KToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0NsaWVudDo6
dHJpZ2dlcnNMaW5rUHJldmlldyk6CisgICAgICAgICogc3JjL1dlYklucHV0RXZlbnQuY3BwOgor
ICAgICAgICAoU2FtZVNpemVBc1dlYkdlc3R1cmVFdmVudCk6CisgICAgICAgICogc3JjL1dlYlZp
ZXdJbXBsLmNwcDoKKyAgICAgICAgKFdlYktpdCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdJ
bXBsOjpoYW5kbGVHZXN0dXJlRXZlbnRXaXRoTGlua1ByZXZpZXcpOgorICAgICAgICAoV2ViS2l0
OjpXZWJWaWV3SW1wbDo6aGFuZGxlR2VzdHVyZUV2ZW50KToKKyAgICAgICAgKiBzcmMvV2ViVmll
d0ltcGwuaDoKKyAgICAgICAgKFdlYlZpZXdJbXBsKToKKwogMjAxMi0wOC0yNCAgRG9taW5pYyBN
YXp6b25pICA8ZG1henpvbmlAZ29vZ2xlLmNvbT4KIAogICAgICAgICBDaHJvbWl1bTogV2ViQWNj
ZXNzaWJpbGl0eU9iamVjdCBzaG91bGQgZXhwb3NlIHVwZGF0ZUJhY2tpbmdTdG9yZQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpIGIvU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS5neXBpCmluZGV4IDAyMmFhODE1NzQzZTFhMTEzNzkyNzhhNDNhNDYzYWNmYzlmNTA2YmUuLmZl
MmU5NzZjYmE2MTFlNmYyN2I3ZmZjZTUzNjBlYmE2YmEwY2MwZDUgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkK
QEAgLTMxNjMsNiArMzE2Myw4IEBACiAgICAgICAgICAgICAncGFnZS9TdXNwZW5kYWJsZVRpbWVy
LmgnLAogICAgICAgICAgICAgJ3BhZ2UvVG91Y2hBZGp1c3RtZW50LmNwcCcsCiAgICAgICAgICAg
ICAncGFnZS9Ub3VjaEFkanVzdG1lbnQuaCcsCisgICAgICAgICAgICAncGFnZS9Ub3VjaERpc2Ft
YmlndWF0aW9uLmNwcCcsCisgICAgICAgICAgICAncGFnZS9Ub3VjaERpc2FtYmlndWF0aW9uLmgn
LAogICAgICAgICAgICAgJ3BhZ2UvVXNlckNvbnRlbnRVUkxQYXR0ZXJuLmNwcCcsCiAgICAgICAg
ICAgICAncGFnZS9XZWJLaXRBbmltYXRpb24uY3BwJywKICAgICAgICAgICAgICdwYWdlL1dlYktp
dEFuaW1hdGlvbi5oJywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BhZ2UvVG91Y2hEaXNh
bWJpZ3VhdGlvbi5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wYWdlL1RvdWNoRGlzYW1iaWd1YXRpb24u
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLmJlYjFhMmE2Yzg4NDliOGFiNmExN2QzZTg3OWYzZWFlYjBlMzMyYTQK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wYWdlL1RvdWNoRGlzYW1iaWd1YXRp
b24uY3BwCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAq
IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAi
VG91Y2hEaXNhbWJpZ3VhdGlvbi5oIgorCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRl
ICJGcmFtZS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5o
IgorI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK3Vz
aW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworbmFtZXNwYWNlIHsK
KworYm9vbCBpc0V2ZW50Tm9kZShOb2RlICpub2RlKQoreworICAgIHJldHVybiBub2RlICYmIChu
b2RlLT5zdXBwb3J0c0ZvY3VzKCkKKyAgICAgICAgfHwgbm9kZS0+aGFzRXZlbnRMaXN0ZW5lcnMo
ZXZlbnROYW1lcygpLmNsaWNrRXZlbnQpCisgICAgICAgIHx8IG5vZGUtPmhhc0V2ZW50TGlzdGVu
ZXJzKGV2ZW50TmFtZXMoKS5tb3VzZWRvd25FdmVudCkKKyAgICAgICAgfHwgbm9kZS0+aGFzRXZl
bnRMaXN0ZW5lcnMoZXZlbnROYW1lcygpLm1vdXNldXBFdmVudCkpOworfQorCisvLyBDYWxjdWxh
dGUgdGhlIHVuaW9uIG9mIHRoZSBib3VuZGluZyBib3hlcyBvZiBhbGwgZGVzY2VuZGFudCBub2Rl
cyB0aGF0IHByb3BhZ2F0ZXMgZXZlbnRzIHVwLgorSW50UmVjdCBjYWxjdWxhdGVFdmVudE5vZGVC
b3VuZGluZ0JveChOb2RlKiBldmVudE5vZGUpCit7CisgICAgaWYgKCFldmVudE5vZGUtPmRvY3Vt
ZW50KCkgfHwgIWV2ZW50Tm9kZS0+ZG9jdW1lbnQoKS0+dmlldygpKQorICAgICAgICByZXR1cm4g
SW50UmVjdCgpOworCisgICAgSW50UmVjdCByZXN1bHQ7CisgICAgTm9kZSogbm9kZSA9IGV2ZW50
Tm9kZTsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICAvLyBza2lwIHRoZSB3aG9sZSBzdWIt
dHJlZSBpZiB0aGUgbm9kZSBkb2Vzbid0IHByb3BhZ2F0ZSBldmVudHMKKyAgICAgICAgaWYgKG5v
ZGUgIT0gZXZlbnROb2RlICYmIGlzRXZlbnROb2RlKG5vZGUpKSB7CisgICAgICAgICAgICBub2Rl
ID0gbm9kZS0+dHJhdmVyc2VOZXh0U2libGluZyhldmVudE5vZGUpOworICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LnVuaXRlKHBpeGVsU25hcHBlZEludFJl
Y3Qobm9kZS0+Z2V0UmVjdCgpKSk7CisgICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHRO
b2RlKGV2ZW50Tm9kZSk7CisgICAgfQorICAgIHJldHVybiBldmVudE5vZGUtPmRvY3VtZW50KCkt
PnZpZXcoKS0+Y29udGVudHNUb1dpbmRvdyhyZXN1bHQpOworfQorCitmbG9hdCBzY29yZVRvdWNo
VGFyZ2V0KEludFBvaW50IHRvdWNoUG9pbnQsIGludCBwYWRkaW5nLCBJbnRSZWN0IGJvdW5kaW5n
Qm94KQoreworICAgIGZsb2F0IGRpdlBhZGRpbmcgPSAoZmxvYXQpMSAvIHBhZGRpbmc7CisgICAg
ZmxvYXQgc2NvcmUgPSAxOworCisgICAgaWYgKGJvdW5kaW5nQm94LmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBJbnRTaXplIGRpc3RhbmNlID0gYm91bmRpbmdCb3guZGlmZmVy
ZW5jZVRvUG9pbnQodG91Y2hQb2ludCk7CisgICAgc2NvcmUgKj0gbWF4KChwYWRkaW5nIC0gYWJz
KGRpc3RhbmNlLndpZHRoKCkpKSAqIGRpdlBhZGRpbmcsIDAuZik7CisgICAgc2NvcmUgKj0gbWF4
KChwYWRkaW5nIC0gYWJzKGRpc3RhbmNlLmhlaWdodCgpKSkgKiBkaXZQYWRkaW5nLCAwLmYpOwor
CisgICAgcmV0dXJuIHNjb3JlOworfQorCitzdHJ1Y3QgVG91Y2hUYXJnZXREYXRhIHsKKyAgICBJ
bnRSZWN0IHdpbmRvd0JvdW5kaW5nQm94OworICAgIGZsb2F0IHNjb3JlOworfTsKKworfSAvLyB1
bm5hbWVkIG5hbWVzcGFjZQorCit2b2lkIGxpc3RHb29kVG91Y2hUYXJnZXRzKFZlY3RvcjxJbnRS
ZWN0PiYgZ29vZFRhcmdldHMsIGNvbnN0IEludFJlY3QmIHRvdWNoQm94LCBGcmFtZSogbWFpbkZy
YW1lLCBmbG9hdCBwYWdlU2NhbGVGYWN0b3IpCit7CisgICAgZ29vZFRhcmdldHMuY2xlYXIoKTsK
KworICAgIGludCB0b3VjaFBvaW50UGFkZGluZyA9IChtYXgodG91Y2hCb3gud2lkdGgoKSwgdG91
Y2hCb3guaGVpZ2h0KCkpICsgMSkgLyAyOworICAgIC8vIEZJWE1FOiBSZWN0LWJhc2VkIGhpdCB0
ZXN0IGRvZXNuJ3QgdHJhbnNmb3JtIHRoZSB0b3VjaCBwb2ludCBzaXplLgorICAgIC8vICAgICAg
ICAgV2UgaGF2ZSB0byBwcmUtYXBwbHkgcGFnZSBzY2FsZSBmYWN0b3IgaGVyZS4KKyAgICBpbnQg
cGFkZGluZyA9IHRvdWNoUG9pbnRQYWRkaW5nIC8gcGFnZVNjYWxlRmFjdG9yOworCisgICAgSW50
UG9pbnQgdG91Y2hQb2ludCA9IHRvdWNoQm94LmNlbnRlcigpOworICAgIEludFBvaW50IGNvbnRl
bnRzUG9pbnQgPSBtYWluRnJhbWUtPnZpZXcoKS0+d2luZG93VG9Db250ZW50cyh0b3VjaFBvaW50
KTsKKworICAgIEhpdFRlc3RSZXN1bHQgcmVzdWx0ID0gbWFpbkZyYW1lLT5ldmVudEhhbmRsZXIo
KS0+aGl0VGVzdFJlc3VsdEF0UG9pbnQoY29udGVudHNQb2ludCwgZmFsc2UsIGZhbHNlLCBEb250
SGl0VGVzdFNjcm9sbGJhcnMsIEhpdFRlc3RSZXF1ZXN0OjpBY3RpdmUgfCBIaXRUZXN0UmVxdWVz
dDo6UmVhZE9ubHksIEludFNpemUocGFkZGluZywgcGFkZGluZykpOworICAgIGNvbnN0IExpc3RI
YXNoU2V0PFJlZlB0cjxOb2RlPiA+JiBoaXRSZXN1bHRzID0gcmVzdWx0LnJlY3RCYXNlZFRlc3RS
ZXN1bHQoKTsKKworICAgIC8vIEZpbmQgZXZlbnQgaGFuZGxlciBub2RlIGluIHRoZSBhbmNlc3Rv
ciBjaGFpbiBmb3IgZWFjaCBoaXQgdGVzdCByZXN1bHQKKyAgICBIYXNoTWFwPE5vZGUqLCBUb3Vj
aFRhcmdldERhdGE+IHRvdWNoVGFyZ2V0czsKKyAgICBmbG9hdCBiZXN0U2NvcmUgPSAwOworICAg
IGZvciAoTGlzdEhhc2hTZXQ8UmVmUHRyPE5vZGU+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gaGl0
UmVzdWx0cy5iZWdpbigpOyBpdCAhPSBoaXRSZXN1bHRzLmVuZCgpOyArK2l0KSB7CisgICAgICAg
IGZvciAoTm9kZSogbm9kZSA9IGl0LT5nZXQoKTsgbm9kZTsgbm9kZSA9IG5vZGUtPnBhcmVudE5v
ZGUoKSkgeworICAgICAgICAgICAgaWYgKG5vZGUtPmlzRG9jdW1lbnROb2RlKCkgfHwgbm9kZS0+
aGFzVGFnTmFtZShIVE1MTmFtZXM6Omh0bWxUYWcpIHx8IG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5h
bWVzOjpib2R5VGFnKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChp
c0V2ZW50Tm9kZShub2RlKSkgeworICAgICAgICAgICAgICAgIFRvdWNoVGFyZ2V0RGF0YSYgdGFy
Z2V0RGF0YSA9IHRvdWNoVGFyZ2V0cy5hZGQobm9kZSwgVG91Y2hUYXJnZXREYXRhKCkpLml0ZXJh
dG9yLT5zZWNvbmQ7CisgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YS53aW5kb3dCb3VuZGluZ0Jv
eCA9IGNhbGN1bGF0ZUV2ZW50Tm9kZUJvdW5kaW5nQm94KG5vZGUpOworICAgICAgICAgICAgICAg
IHRhcmdldERhdGEuc2NvcmUgPSBzY29yZVRvdWNoVGFyZ2V0KHRvdWNoUG9pbnQsIHRvdWNoUG9p
bnRQYWRkaW5nLCB0YXJnZXREYXRhLndpbmRvd0JvdW5kaW5nQm94KTsKKyAgICAgICAgICAgICAg
ICBiZXN0U2NvcmUgPSBtYXgoYmVzdFNjb3JlLCB0YXJnZXREYXRhLnNjb3JlKTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8v
IE9ubHkga2VlcCBnb29kIHRvdWNoIHRhcmdldHMgd2l0aCBzY29yZSA+PSBtYXgoc2NvcmUpLzIs
IGFuZCBjYWxjdWxhdGUgdGhlIHpvb20gcmVjdAorICAgIGZvciAoSGFzaE1hcDxOb2RlKiwgVG91
Y2hUYXJnZXREYXRhPjo6aXRlcmF0b3IgaXQgPSB0b3VjaFRhcmdldHMuYmVnaW4oKTsgaXQgIT0g
dG91Y2hUYXJnZXRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChpdC0+c2Vjb25kLnNjb3Jl
IDwgYmVzdFNjb3JlICogMC41KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGdvb2RU
YXJnZXRzLmFwcGVuZChpdC0+c2Vjb25kLndpbmRvd0JvdW5kaW5nQm94KTsKKyAgICB9Cit9CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BhZ2Uv
VG91Y2hEaXNhbWJpZ3VhdGlvbi5oIGIvU291cmNlL1dlYkNvcmUvcGFnZS9Ub3VjaERpc2FtYmln
dWF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uNzg3YzJhYWJjYTUzOTFiM2E1OTg1YThhMjhmZWQwYzY0MDk3
NWI0MAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BhZ2UvVG91Y2hEaXNhbWJp
Z3VhdGlvbi5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICog
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQor
ICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVp
dGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29u
dHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJp
dmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVu
IHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFRvdWNoRGlzYW1iaWd1YXRpb25faAor
I2RlZmluZSBUb3VjaERpc2FtYmlndWF0aW9uX2gKKworI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4K
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBGcmFtZTsKK2NsYXNzIEludFJlY3Q7CisK
K3ZvaWQgbGlzdEdvb2RUb3VjaFRhcmdldHMoVmVjdG9yPEludFJlY3Q+JiBnb29kVGFyZ2V0cywg
Y29uc3QgSW50UmVjdCYgdG91Y2hCb3gsIEZyYW1lKiBtYWluRnJhbWUsIGZsb2F0IHBhZ2VTY2Fs
ZUZhY3Rvcik7CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJWaWV3Q2xpZW50LmggYi9Tb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJWaWV3Q2xpZW50LmgKaW5kZXggOTA0ZDRhMmQyMTY3
ZTQ3MTYyODU5ODY2YTUyNDg0ZjRmZGI1ZWExZC4uMDU4NzU1Y2U2MTc0ZGY5NDE3Y2ZlZTJhMDYy
ZjJhZjM4MDgwMTcyMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9wdWJsaWMv
V2ViVmlld0NsaWVudC5oCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYlZp
ZXdDbGllbnQuaApAQCAtNjIsNiArNjIsNyBAQCBjbGFzcyBXZWJGaWxlQ2hvb3NlckNvbXBsZXRp
b247CiBjbGFzcyBXZWJGcmFtZTsKIGNsYXNzIFdlYkdlb2xvY2F0aW9uQ2xpZW50OwogY2xhc3Mg
V2ViR2VvbG9jYXRpb25TZXJ2aWNlOworY2xhc3MgV2ViR2VzdHVyZUV2ZW50OwogY2xhc3MgV2Vi
SGVscGVyUGx1Z2luOwogY2xhc3MgV2ViSGl0VGVzdFJlc3VsdDsKIGNsYXNzIFdlYkljb25Mb2Fk
aW5nQ29tcGxldGlvbjsKQEAgLTcxLDYgKzcyLDcgQEAgY2xhc3MgV2ViS2V5Ym9hcmRFdmVudDsK
IGNsYXNzIFdlYk5vZGU7CiBjbGFzcyBXZWJOb3RpZmljYXRpb25QcmVzZW50ZXI7CiBjbGFzcyBX
ZWJSYW5nZTsKK2NsYXNzIFdlYlJlY3Q7CiBjbGFzcyBXZWJTcGVlY2hJbnB1dENvbnRyb2xsZXI7
CiBjbGFzcyBXZWJTcGVlY2hJbnB1dExpc3RlbmVyOwogY2xhc3MgV2ViU3BlZWNoUmVjb2duaXpl
cjsKQEAgLTI4NSw2ICsyODcsOSBAQCBwdWJsaWM6CiAgICAgLy8gdW5sZXNzIHRoZSB2aWV3IGRp
ZCBub3QgbmVlZCBhIGxheW91dC4KICAgICB2aXJ0dWFsIHZvaWQgZGlkVXBkYXRlTGF5b3V0KCkg
eyB9CiAKKyAgICAvLyBSZXR1cm4gdHJ1ZSB0byBzd2FsbG93IHRoZSBpbnB1dCBldmVudCBpZiB0
aGUgZW1iZWRkZXIgd2lsbCBzdGFydCBhIGRpc2FtYmlndWF0aW9uIHBvcHVwCisgICAgdmlydHVh
bCBib29sIGhhbmRsZURpc2FtYmlndWF0aW9uUG9wdXAoY29uc3QgV2ViR2VzdHVyZUV2ZW50Jiwg
Y29uc3QgV2ViVmVjdG9yPFdlYlJlY3Q+JiB0YXJnZXRSZWN0cykgeyByZXR1cm4gZmFsc2U7IH0K
KwogICAgIC8vIFNlc3Npb24gaGlzdG9yeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgLy8gVGVsbHMgdGhlIGVtYmVkZGVyIHRvIG5h
dmlnYXRlIGJhY2sgb3IgZm9yd2FyZCBpbiBzZXNzaW9uIGhpc3RvcnkgYnkKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcCBiL1NvdXJjZS9XZWJL
aXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBsLmNwcAppbmRleCBhOThhYmQzYTVjOGIwYWQzYzA5
NGJmNDI3NWE5MmJhMmVmNWE3ZWZkLi5iYzdjMmVkMmZmZWY4YjQ0MTQ0ZWU3YzZlYWIzYTBhZTU0
ZjE3NTY4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1w
bC5jcHAKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuY3BwCkBA
IC0xNjksNiArMTY5LDcgQEAKIAogI2lmIEVOQUJMRShHRVNUVVJFX0VWRU5UUykKICNpbmNsdWRl
ICJQbGF0Zm9ybUdlc3R1cmVFdmVudC5oIgorI2luY2x1ZGUgIlRvdWNoRGlzYW1iaWd1YXRpb24u
aCIKICNlbmRpZgogCiAjaWYgT1MoV0lORE9XUykKQEAgLTcwMiwxMiArNzAzLDIzIEBAIGJvb2wg
V2ViVmlld0ltcGw6OmhhbmRsZUdlc3R1cmVFdmVudChjb25zdCBXZWJHZXN0dXJlRXZlbnQmIGV2
ZW50KQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBjYXNlIFdlYklucHV0
RXZlbnQ6Okdlc3R1cmVUYXA6IHsKLSAgICAgICAgUGxhdGZvcm1HZXN0dXJlRXZlbnRCdWlsZGVy
IHBsYXRmb3JtRXZlbnQobWFpbkZyYW1lSW1wbCgpLT5mcmFtZVZpZXcoKSwgZXZlbnQpOwogICAg
ICAgICBSZWZQdHI8V2ViQ29yZTo6UG9wdXBDb250YWluZXI+IHNlbGVjdFBvcHVwOwogICAgICAg
ICBzZWxlY3RQb3B1cCA9IG1fc2VsZWN0UG9wdXA7CiAgICAgICAgIGhpZGVTZWxlY3RQb3B1cCgp
OwogICAgICAgICBBU1NFUlQoIW1fc2VsZWN0UG9wdXApOworCisgICAgICAgIGlmICghZXZlbnQu
Ym91bmRpbmdCb3guaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBWZWN0b3I8SW50UmVjdD4gZ29v
ZFRhcmdldHM7CisgICAgICAgICAgICBsaXN0R29vZFRvdWNoVGFyZ2V0cyhnb29kVGFyZ2V0cywg
ZXZlbnQuYm91bmRpbmdCb3gsIG1haW5GcmFtZUltcGwoKS0+ZnJhbWUoKSwgcGFnZVNjYWxlRmFj
dG9yKCkpOworICAgICAgICAgICAgLy8gRklYTUU6IHJlcGxhY2UgdG91Y2ggYWRqdXN0bWVudCBj
b2RlIHdoZW4gbnVtYmVyT2ZHb29kVGFyZ2V0cyA9PSAxPworICAgICAgICAgICAgLy8gU2luZ2xl
IGNhbmRpZGF0ZSBjYXNlIGlzIGN1cnJlbnRseSBoYW5kbGVkIGJ5OiBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODUxMDEKKyAgICAgICAgICAgIGlmIChnb29kVGFyZ2V0
cy5zaXplKCkgPj0gMiAmJiBtX2NsaWVudCAmJiBtX2NsaWVudC0+aGFuZGxlRGlzYW1iaWd1YXRp
b25Qb3B1cChldmVudCwgZ29vZFRhcmdldHMpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICB9CisKKyAgICAgICAgUGxhdGZvcm1HZXN0dXJlRXZlbnRCdWlsZGVyIHBsYXRm
b3JtRXZlbnQobWFpbkZyYW1lSW1wbCgpLT5mcmFtZVZpZXcoKSwgZXZlbnQpOwogICAgICAgICBi
b29sIGdlc3R1cmVIYW5kbGVkID0gbWFpbkZyYW1lSW1wbCgpLT5mcmFtZSgpLT5ldmVudEhhbmRs
ZXIoKS0+aGFuZGxlR2VzdHVyZUV2ZW50KHBsYXRmb3JtRXZlbnQpOworCiAgICAgICAgIGlmICht
X3NlbGVjdFBvcHVwICYmIG1fc2VsZWN0UG9wdXAgPT0gc2VsZWN0UG9wdXApIHsKICAgICAgICAg
ICAgIC8vIFRoYXQgdGFwIHRyaWdnZXJlZCBhIHNlbGVjdCBwb3B1cCB3aGljaCBpcyB0aGUgc2Ft
ZSBhcyB0aGUgb25lIHRoYXQKICAgICAgICAgICAgIC8vIHdhcyBzaG93aW5nIGJlZm9yZSB0aGUg
dGFwLiBJdCBtZWFucyB0aGUgdXNlciB0YXBwZWQgdGhlIHNlbGVjdApAQCAtNzE1LDYgKzcyNyw3
IEBAIGJvb2wgV2ViVmlld0ltcGw6OmhhbmRsZUdlc3R1cmVFdmVudChjb25zdCBXZWJHZXN0dXJl
RXZlbnQmIGV2ZW50KQogICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmVvcGVuZWQgdGhlIHNl
bGVjdCBwb3B1cC4gSXQgbmVlZHMgdG8gYmUgY2xvc2VkLgogICAgICAgICAgICAgaGlkZVNlbGVj
dFBvcHVwKCk7CiAgICAgICAgIH0KKwogICAgICAgICByZXR1cm4gZ2VzdHVyZUhhbmRsZWQ7CiAg
ICAgfQogICAgIGNhc2UgV2ViSW5wdXRFdmVudDo6R2VzdHVyZVR3b0ZpbmdlclRhcDoK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>161122</attachid>
            <date>2012-08-28 20:29:00 -0700</date>
            <delta_ts>2012-08-29 14:55:29 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-94182-20120828202851.patch</filename>
            <type>text/plain</type>
            <size>17367</size>
            <attacher name="Tien-Ren Chen">trchen</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTI2Njc4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCmluZGV4
IDgyMjI2ODMzZGE3MmIzMjZhODk0MWRkZDdlNjlhMDExOWNmNWM4ZjAuLjkzYmVjNzM4ZmFlODlm
NjgwZTVlNGY3ZWIzY2E2ZjhlYzJiYTNiNzYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCkBA
IC0xLDMgKzEsMzkgQEAKKzIwMTItMDgtMjQgIFRpZW4tUmVuIENoZW4gIDx0cmNoZW5AY2hyb21p
dW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0gSW1wbGVtZW50IGRpc2FtYmlndWF0aW9uIHBv
cHVwIChhLmsuYS4gTGluayBQcmV2aWV3KQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9OTQxODIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBJbiB0aGlzIG5ldyBpbXBsZW1lbnRhdGlvbiwgd2UgYWRkIGEgbmV3
IFdlYlZpZXdDbGllbnQ6OmhhbmRsZURpc2FtYmlndWF0aW9uUG9wdXAgZGVsZWdhdGUuCisgICAg
ICAgIFRoZSBkaXNhbWJpZ3VhdGlvbiBzZXF1ZW5jZSB3aWxsIGJlIGluaXRpYXRlZCBieSB0aGUg
Z2VzdHVyZSBldmVudCBoYW5kbGVyCisgICAgICAgIGluIFdlYlZpZXdJbXBsIGlmIGFuIGFtYmln
dW91cyB0YXAgaXMgZGV0ZWN0ZWQsIHRoZW4KKyAgICAgICAgbV9jbGllbnQtPmhhbmRsZURpc2Ft
YmlndWF0aW9uUG9wdXAgd2lsbCBiZSBjYWxsZWQsIHNvIHRoZSBlbWJlZGRlciBjYW4KKyAgICAg
ICAgZGVjaWRlIHdoZXRoZXIgdG8gc3dhbGxvdyB0aGUgdG91Y2ggZXZlbnQgYW5kIHNob3cgYSBw
b3B1cC4KKworICAgICAgICBOZXcgdGVzdDogV2ViRnJhbWVUZXN0LkRpc2FtYmlndWF0aW9uUG9w
dXBUZXN0CisKKyAgICAgICAgKiBXZWJLaXQuZ3lwOgorICAgICAgICAqIGZlYXR1cmVzLmd5cGk6
CisgICAgICAgICogcHVibGljL1dlYklucHV0RXZlbnQuaDoKKyAgICAgICAgKFdlYkdlc3R1cmVF
dmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYkdlc3R1cmVFdmVudDo6V2ViR2VzdHVyZUV2ZW50
KToKKyAgICAgICAgKiBwdWJsaWMvV2ViVG91Y2hDYW5kaWRhdGVzSW5mby5oOiBSZW1vdmVkLgor
ICAgICAgICAqIHB1YmxpYy9XZWJWaWV3Lmg6CisgICAgICAgIChXZWJLaXQpOgorICAgICAgICAq
IHB1YmxpYy9XZWJWaWV3Q2xpZW50Lmg6CisgICAgICAgIChXZWJLaXQpOgorICAgICAgICAoV2Vi
Vmlld0NsaWVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdDbGllbnQ6OnRyaWdnZXJzTGlu
a1ByZXZpZXcpOgorICAgICAgICAqIHNyYy9XZWJJbnB1dEV2ZW50LmNwcDoKKyAgICAgICAgKFNh
bWVTaXplQXNXZWJHZXN0dXJlRXZlbnQpOgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5jcHA6
CisgICAgICAgIChXZWJLaXQpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6aGFuZGxl
R2VzdHVyZUV2ZW50V2l0aExpbmtQcmV2aWV3KToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0lt
cGw6OmhhbmRsZUdlc3R1cmVFdmVudCk6CisgICAgICAgICogc3JjL1dlYlZpZXdJbXBsLmg6Cisg
ICAgICAgIChXZWJWaWV3SW1wbCk6CisKIDIwMTItMDgtMjQgIERvbWluaWMgTWF6em9uaSAgPGRt
YXp6b25pQGdvb2dsZS5jb20+CiAKICAgICAgICAgQ2hyb21pdW06IFdlYkFjY2Vzc2liaWxpdHlP
YmplY3Qgc2hvdWxkIGV4cG9zZSB1cGRhdGVCYWNraW5nU3RvcmUKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRl
eCAwMjJhYTgxNTc0M2UxYTExMzc5Mjc4YTQzYTQ2M2FjZmM5ZjUwNmJlLi5mZTJlOTc2Y2JhNjEx
ZTZmMjdiN2ZmY2U1MzYwZWJhNmJhMGNjMGQ1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9X
ZWJDb3JlLmd5cGkKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCkBAIC0zMTYzLDYg
KzMxNjMsOCBAQAogICAgICAgICAgICAgJ3BhZ2UvU3VzcGVuZGFibGVUaW1lci5oJywKICAgICAg
ICAgICAgICdwYWdlL1RvdWNoQWRqdXN0bWVudC5jcHAnLAogICAgICAgICAgICAgJ3BhZ2UvVG91
Y2hBZGp1c3RtZW50LmgnLAorICAgICAgICAgICAgJ3BhZ2UvVG91Y2hEaXNhbWJpZ3VhdGlvbi5j
cHAnLAorICAgICAgICAgICAgJ3BhZ2UvVG91Y2hEaXNhbWJpZ3VhdGlvbi5oJywKICAgICAgICAg
ICAgICdwYWdlL1VzZXJDb250ZW50VVJMUGF0dGVybi5jcHAnLAogICAgICAgICAgICAgJ3BhZ2Uv
V2ViS2l0QW5pbWF0aW9uLmNwcCcsCiAgICAgICAgICAgICAncGFnZS9XZWJLaXRBbmltYXRpb24u
aCcsCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wYWdlL1RvdWNoRGlzYW1iaWd1YXRpb24u
Y3BwIGIvU291cmNlL1dlYkNvcmUvcGFnZS9Ub3VjaERpc2FtYmlndWF0aW9uLmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi41ZWZlM2RiNDkxNDA1ZTczNjFkNzZiNzdlZmIxMWVhNzM0MDZmMTdlCi0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGFnZS9Ub3VjaERpc2FtYmlndWF0aW9uLmNwcApAQCAt
MCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICog
bWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1l
IG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5
IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICog
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAq
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIlRvdWNoRGlzYW1i
aWd1YXRpb24uaCIKKworI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRWxlbWVudC5o
IgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAi
SFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgorI2luY2x1ZGUgPGFsZ29y
aXRobT4KKyNpbmNsdWRlIDxjbWF0aD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitzdGF0aWMgSW50UmVjdCBib3VuZGluZ0JveEZvckV2ZW50Tm9kZXMo
Tm9kZSogZXZlbnROb2RlKQoreworICAgIGlmICghZXZlbnROb2RlLT5kb2N1bWVudCgpLT52aWV3
KCkpCisgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CisKKyAgICBJbnRSZWN0IHJlc3VsdDsKKyAg
ICBOb2RlKiBub2RlID0gZXZlbnROb2RlOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIC8v
IFNraXAgdGhlIHdob2xlIHN1Yi10cmVlIGlmIHRoZSBub2RlIGRvZXNuJ3QgcHJvcGFnYXRlIGV2
ZW50cy4KKyAgICAgICAgaWYgKG5vZGUgIT0gZXZlbnROb2RlICYmIG5vZGUtPndpbGxSZXNwb25k
VG9Nb3VzZUNsaWNrRXZlbnRzKCkpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJz
ZU5leHRTaWJsaW5nKGV2ZW50Tm9kZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
fQorICAgICAgICByZXN1bHQudW5pdGUocGl4ZWxTbmFwcGVkSW50UmVjdChub2RlLT5nZXRSZWN0
KCkpKTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoZXZlbnROb2RlKTsK
KyAgICB9CisgICAgcmV0dXJuIGV2ZW50Tm9kZS0+ZG9jdW1lbnQoKS0+dmlldygpLT5jb250ZW50
c1RvV2luZG93KHJlc3VsdCk7Cit9CisKK3N0YXRpYyBmbG9hdCBzY29yZVRvdWNoVGFyZ2V0KElu
dFBvaW50IHRvdWNoUG9pbnQsIGludCBwYWRkaW5nLCBJbnRSZWN0IGJvdW5kaW5nQm94KQorewor
ICAgIGlmIChib3VuZGluZ0JveC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAg
ZmxvYXQgcmVjaXByb2NhbFBhZGRpbmcgPSAxLmYgLyBwYWRkaW5nOworICAgIGZsb2F0IHNjb3Jl
ID0gMTsKKworICAgIEludFNpemUgZGlzdGFuY2UgPSBib3VuZGluZ0JveC5kaWZmZXJlbmNlVG9Q
b2ludCh0b3VjaFBvaW50KTsKKyAgICBzY29yZSAqPSBtYXgoKHBhZGRpbmcgLSBhYnMoZGlzdGFu
Y2Uud2lkdGgoKSkpICogcmVjaXByb2NhbFBhZGRpbmcsIDAuZik7CisgICAgc2NvcmUgKj0gbWF4
KChwYWRkaW5nIC0gYWJzKGRpc3RhbmNlLmhlaWdodCgpKSkgKiByZWNpcHJvY2FsUGFkZGluZywg
MC5mKTsKKworICAgIHJldHVybiBzY29yZTsKK30KKworc3RydWN0IFRvdWNoVGFyZ2V0RGF0YSB7
CisgICAgSW50UmVjdCB3aW5kb3dCb3VuZGluZ0JveDsKKyAgICBmbG9hdCBzY29yZTsKK307CisK
K3ZvaWQgZmluZEdvb2RUb3VjaFRhcmdldHMoY29uc3QgSW50UmVjdCYgdG91Y2hCb3gsIEZyYW1l
KiBtYWluRnJhbWUsIGZsb2F0IHBhZ2VTY2FsZUZhY3RvciwgVmVjdG9yPEludFJlY3Q+JiBnb29k
VGFyZ2V0cykKK3sKKyAgICBnb29kVGFyZ2V0cy5jbGVhcigpOworCisgICAgaW50IHRvdWNoUG9p
bnRQYWRkaW5nID0gY2VpbChtYXgodG91Y2hCb3gud2lkdGgoKSwgdG91Y2hCb3guaGVpZ2h0KCkp
ICogMC41KTsKKyAgICAvLyBGSVhNRTogUmVjdC1iYXNlZCBoaXQgdGVzdCBkb2Vzbid0IHRyYW5z
Zm9ybSB0aGUgdG91Y2ggcG9pbnQgc2l6ZS4KKyAgICAvLyAgICAgICAgV2UgaGF2ZSB0byBwcmUt
YXBwbHkgcGFnZSBzY2FsZSBmYWN0b3IgaGVyZS4KKyAgICBpbnQgcGFkZGluZyA9IGNlaWwodG91
Y2hQb2ludFBhZGRpbmcgLyBwYWdlU2NhbGVGYWN0b3IpOworCisgICAgSW50UG9pbnQgdG91Y2hQ
b2ludCA9IHRvdWNoQm94LmNlbnRlcigpOworICAgIEludFBvaW50IGNvbnRlbnRzUG9pbnQgPSBt
YWluRnJhbWUtPnZpZXcoKS0+d2luZG93VG9Db250ZW50cyh0b3VjaFBvaW50KTsKKworICAgIEhp
dFRlc3RSZXN1bHQgcmVzdWx0ID0gbWFpbkZyYW1lLT5ldmVudEhhbmRsZXIoKS0+aGl0VGVzdFJl
c3VsdEF0UG9pbnQoY29udGVudHNQb2ludCwgZmFsc2UsIGZhbHNlLCBEb250SGl0VGVzdFNjcm9s
bGJhcnMsIEhpdFRlc3RSZXF1ZXN0OjpBY3RpdmUgfCBIaXRUZXN0UmVxdWVzdDo6UmVhZE9ubHks
IEludFNpemUocGFkZGluZywgcGFkZGluZykpOworICAgIGNvbnN0IExpc3RIYXNoU2V0PFJlZlB0
cjxOb2RlPiA+JiBoaXRSZXN1bHRzID0gcmVzdWx0LnJlY3RCYXNlZFRlc3RSZXN1bHQoKTsKKwor
ICAgIEhhc2hNYXA8Tm9kZSosIFRvdWNoVGFyZ2V0RGF0YT4gdG91Y2hUYXJnZXRzOworICAgIGZs
b2F0IGJlc3RTY29yZSA9IDA7CisgICAgZm9yIChMaXN0SGFzaFNldDxSZWZQdHI8Tm9kZT4gPjo6
Y29uc3RfaXRlcmF0b3IgaXQgPSBoaXRSZXN1bHRzLmJlZ2luKCk7IGl0ICE9IGhpdFJlc3VsdHMu
ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgZm9yIChOb2RlKiBub2RlID0gaXQtPmdldCgpOyBub2Rl
OyBub2RlID0gbm9kZS0+cGFyZW50Tm9kZSgpKSB7CisgICAgICAgICAgICBpZiAobm9kZS0+aXNE
b2N1bWVudE5vZGUoKSB8fCBub2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aHRtbFRhZykgfHwg
bm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmJvZHlUYWcpKQorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgaWYgKG5vZGUtPndpbGxSZXNwb25kVG9Nb3VzZUNsaWNrRXZlbnRz
KCkpIHsKKyAgICAgICAgICAgICAgICBUb3VjaFRhcmdldERhdGEmIHRhcmdldERhdGEgPSB0b3Vj
aFRhcmdldHMuYWRkKG5vZGUsIFRvdWNoVGFyZ2V0RGF0YSgpKS5pdGVyYXRvci0+c2Vjb25kOwor
ICAgICAgICAgICAgICAgIHRhcmdldERhdGEud2luZG93Qm91bmRpbmdCb3ggPSBib3VuZGluZ0Jv
eEZvckV2ZW50Tm9kZXMobm9kZSk7CisgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YS5zY29yZSA9
IHNjb3JlVG91Y2hUYXJnZXQodG91Y2hQb2ludCwgdG91Y2hQb2ludFBhZGRpbmcsIHRhcmdldERh
dGEud2luZG93Qm91bmRpbmdCb3gpOworICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IG1heChi
ZXN0U2NvcmUsIHRhcmdldERhdGEuc2NvcmUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChIYXNoTWFwPE5vZGUqLCBU
b3VjaFRhcmdldERhdGE+OjppdGVyYXRvciBpdCA9IHRvdWNoVGFyZ2V0cy5iZWdpbigpOyBpdCAh
PSB0b3VjaFRhcmdldHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgLy8gQ3VycmVudGx5IHRoZSBz
Y29yaW5nIGZ1bmN0aW9uIHVzZXMgdGhlIG92ZXJsYXAgYXJlYSB3aXRoIHRoZSBmYXQgcG9pbnQg
YXMgdGhlIHNjb3JlLgorICAgICAgICAvLyBXZSBpZ25vcmUgdGhlIGNhbmRpZGF0ZXMgdGhhdCBo
YXMgbGVzcyB0aGFuIDEvMiBvdmVybGFwICh3ZSBjb25zaWRlciBub3QgcmVhbGx5IGFtYmlndW91
cyBlbm91Z2gpIHRoYW4gdGhlIGJlc3QgY2FuZGlkYXRlIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBwb3B1
cHMuCisgICAgICAgIGlmIChpdC0+c2Vjb25kLnNjb3JlIDwgYmVzdFNjb3JlICogMC41KQorICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgIGdvb2RUYXJnZXRzLmFwcGVuZChpdC0+c2Vjb25k
LndpbmRvd0JvdW5kaW5nQm94KTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BhZ2UvVG91Y2hEaXNhbWJpZ3VhdGlvbi5oIGIv
U291cmNlL1dlYkNvcmUvcGFnZS9Ub3VjaERpc2FtYmlndWF0aW9uLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNWFm
ZWI2YjViM2RmNDFmMmU1Zjk5OGUwNGMwOGU4NzZmYmY4NGYxZAotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BhZ2UvVG91Y2hEaXNhbWJpZ3VhdGlvbi5oCkBAIC0wLDAgKzEsNDUg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4g
dGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUg
SW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdh
cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAq
IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaWZuZGVmIFRvdWNoRGlzYW1iaWd1YXRpb25faAorI2RlZmluZSBUb3VjaERpc2FtYmlndWF0
aW9uX2gKKworI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitjbGFzcyBGcmFtZTsKK2NsYXNzIEludFJlY3Q7CisKK3ZvaWQgZmluZEdvb2RUb3VjaFRhcmdl
dHMoY29uc3QgSW50UmVjdCYgdG91Y2hCb3gsIEZyYW1lKiBtYWluRnJhbWUsIGZsb2F0IHBhZ2VT
Y2FsZUZhY3RvciwgVmVjdG9yPEludFJlY3Q+JiBnb29kVGFyZ2V0cyk7CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVt
L3B1YmxpYy9XZWJWaWV3Q2xpZW50LmggYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9X
ZWJWaWV3Q2xpZW50LmgKaW5kZXggOTA0ZDRhMmQyMTY3ZTQ3MTYyODU5ODY2YTUyNDg0ZjRmZGI1
ZWExZC4uMDU4NzU1Y2U2MTc0ZGY5NDE3Y2ZlZTJhMDYyZjJhZjM4MDgwMTcyMCAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViVmlld0NsaWVudC5oCisrKyBiL1Nv
dXJjZS9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYlZpZXdDbGllbnQuaApAQCAtNjIsNiArNjIs
NyBAQCBjbGFzcyBXZWJGaWxlQ2hvb3NlckNvbXBsZXRpb247CiBjbGFzcyBXZWJGcmFtZTsKIGNs
YXNzIFdlYkdlb2xvY2F0aW9uQ2xpZW50OwogY2xhc3MgV2ViR2VvbG9jYXRpb25TZXJ2aWNlOwor
Y2xhc3MgV2ViR2VzdHVyZUV2ZW50OwogY2xhc3MgV2ViSGVscGVyUGx1Z2luOwogY2xhc3MgV2Vi
SGl0VGVzdFJlc3VsdDsKIGNsYXNzIFdlYkljb25Mb2FkaW5nQ29tcGxldGlvbjsKQEAgLTcxLDYg
KzcyLDcgQEAgY2xhc3MgV2ViS2V5Ym9hcmRFdmVudDsKIGNsYXNzIFdlYk5vZGU7CiBjbGFzcyBX
ZWJOb3RpZmljYXRpb25QcmVzZW50ZXI7CiBjbGFzcyBXZWJSYW5nZTsKK2NsYXNzIFdlYlJlY3Q7
CiBjbGFzcyBXZWJTcGVlY2hJbnB1dENvbnRyb2xsZXI7CiBjbGFzcyBXZWJTcGVlY2hJbnB1dExp
c3RlbmVyOwogY2xhc3MgV2ViU3BlZWNoUmVjb2duaXplcjsKQEAgLTI4NSw2ICsyODcsOSBAQCBw
dWJsaWM6CiAgICAgLy8gdW5sZXNzIHRoZSB2aWV3IGRpZCBub3QgbmVlZCBhIGxheW91dC4KICAg
ICB2aXJ0dWFsIHZvaWQgZGlkVXBkYXRlTGF5b3V0KCkgeyB9CiAKKyAgICAvLyBSZXR1cm4gdHJ1
ZSB0byBzd2FsbG93IHRoZSBpbnB1dCBldmVudCBpZiB0aGUgZW1iZWRkZXIgd2lsbCBzdGFydCBh
IGRpc2FtYmlndWF0aW9uIHBvcHVwCisgICAgdmlydHVhbCBib29sIGhhbmRsZURpc2FtYmlndWF0
aW9uUG9wdXAoY29uc3QgV2ViR2VzdHVyZUV2ZW50JiwgY29uc3QgV2ViVmVjdG9yPFdlYlJlY3Q+
JiB0YXJnZXRSZWN0cykgeyByZXR1cm4gZmFsc2U7IH0KKwogICAgIC8vIFNlc3Npb24gaGlzdG9y
eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog
CiAgICAgLy8gVGVsbHMgdGhlIGVtYmVkZGVyIHRvIG5hdmlnYXRlIGJhY2sgb3IgZm9yd2FyZCBp
biBzZXNzaW9uIGhpc3RvcnkgYnkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0v
c3JjL1dlYlZpZXdJbXBsLmNwcCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJ
bXBsLmNwcAppbmRleCBhOThhYmQzYTVjOGIwYWQzYzA5NGJmNDI3NWE5MmJhMmVmNWE3ZWZkLi4w
NGVkMzNhMzhjMTdhMGRhYjk1NDUyOGFmYTc2Y2FmNjJhMmMzZmU3IDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAKKysrIGIvU291cmNlL1dlYktp
dC9jaHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuY3BwCkBAIC0xNjksNiArMTY5LDcgQEAKIAogI2lm
IEVOQUJMRShHRVNUVVJFX0VWRU5UUykKICNpbmNsdWRlICJQbGF0Zm9ybUdlc3R1cmVFdmVudC5o
IgorI2luY2x1ZGUgIlRvdWNoRGlzYW1iaWd1YXRpb24uaCIKICNlbmRpZgogCiAjaWYgT1MoV0lO
RE9XUykKQEAgLTcwMiwxMiArNzAzLDIzIEBAIGJvb2wgV2ViVmlld0ltcGw6OmhhbmRsZUdlc3R1
cmVFdmVudChjb25zdCBXZWJHZXN0dXJlRXZlbnQmIGV2ZW50KQogICAgICAgICB9CiAgICAgICAg
IHJldHVybiBmYWxzZTsKICAgICBjYXNlIFdlYklucHV0RXZlbnQ6Okdlc3R1cmVUYXA6IHsKLSAg
ICAgICAgUGxhdGZvcm1HZXN0dXJlRXZlbnRCdWlsZGVyIHBsYXRmb3JtRXZlbnQobWFpbkZyYW1l
SW1wbCgpLT5mcmFtZVZpZXcoKSwgZXZlbnQpOwogICAgICAgICBSZWZQdHI8V2ViQ29yZTo6UG9w
dXBDb250YWluZXI+IHNlbGVjdFBvcHVwOwogICAgICAgICBzZWxlY3RQb3B1cCA9IG1fc2VsZWN0
UG9wdXA7CiAgICAgICAgIGhpZGVTZWxlY3RQb3B1cCgpOwogICAgICAgICBBU1NFUlQoIW1fc2Vs
ZWN0UG9wdXApOworCisgICAgICAgIGlmICghZXZlbnQuYm91bmRpbmdCb3guaXNFbXB0eSgpKSB7
CisgICAgICAgICAgICBWZWN0b3I8SW50UmVjdD4gZ29vZFRhcmdldHM7CisgICAgICAgICAgICBm
aW5kR29vZFRvdWNoVGFyZ2V0cyhldmVudC5ib3VuZGluZ0JveCwgbWFpbkZyYW1lSW1wbCgpLT5m
cmFtZSgpLCBwYWdlU2NhbGVGYWN0b3IoKSwgZ29vZFRhcmdldHMpOworICAgICAgICAgICAgLy8g
RklYTUU6IHJlcGxhY2UgdG91Y2ggYWRqdXN0bWVudCBjb2RlIHdoZW4gbnVtYmVyT2ZHb29kVGFy
Z2V0cyA9PSAxPworICAgICAgICAgICAgLy8gU2luZ2xlIGNhbmRpZGF0ZSBjYXNlIGlzIGN1cnJl
bnRseSBoYW5kbGVkIGJ5OiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
ODUxMDEKKyAgICAgICAgICAgIGlmIChnb29kVGFyZ2V0cy5zaXplKCkgPj0gMiAmJiBtX2NsaWVu
dCAmJiBtX2NsaWVudC0+aGFuZGxlRGlzYW1iaWd1YXRpb25Qb3B1cChldmVudCwgZ29vZFRhcmdl
dHMpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAg
UGxhdGZvcm1HZXN0dXJlRXZlbnRCdWlsZGVyIHBsYXRmb3JtRXZlbnQobWFpbkZyYW1lSW1wbCgp
LT5mcmFtZVZpZXcoKSwgZXZlbnQpOwogICAgICAgICBib29sIGdlc3R1cmVIYW5kbGVkID0gbWFp
bkZyYW1lSW1wbCgpLT5mcmFtZSgpLT5ldmVudEhhbmRsZXIoKS0+aGFuZGxlR2VzdHVyZUV2ZW50
KHBsYXRmb3JtRXZlbnQpOworCiAgICAgICAgIGlmIChtX3NlbGVjdFBvcHVwICYmIG1fc2VsZWN0
UG9wdXAgPT0gc2VsZWN0UG9wdXApIHsKICAgICAgICAgICAgIC8vIFRoYXQgdGFwIHRyaWdnZXJl
ZCBhIHNlbGVjdCBwb3B1cCB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHRoYXQKICAgICAg
ICAgICAgIC8vIHdhcyBzaG93aW5nIGJlZm9yZSB0aGUgdGFwLiBJdCBtZWFucyB0aGUgdXNlciB0
YXBwZWQgdGhlIHNlbGVjdApAQCAtNzE1LDYgKzcyNyw3IEBAIGJvb2wgV2ViVmlld0ltcGw6Omhh
bmRsZUdlc3R1cmVFdmVudChjb25zdCBXZWJHZXN0dXJlRXZlbnQmIGV2ZW50KQogICAgICAgICAg
ICAgLy8gaW1tZWRpYXRlbHkgcmVvcGVuZWQgdGhlIHNlbGVjdCBwb3B1cC4gSXQgbmVlZHMgdG8g
YmUgY2xvc2VkLgogICAgICAgICAgICAgaGlkZVNlbGVjdFBvcHVwKCk7CiAgICAgICAgIH0KKwog
ICAgICAgICByZXR1cm4gZ2VzdHVyZUhhbmRsZWQ7CiAgICAgfQogICAgIGNhc2UgV2ViSW5wdXRF
dmVudDo6R2VzdHVyZVR3b0ZpbmdlclRhcDoKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vdGVzdHMvV2ViRnJhbWVUZXN0LmNwcCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVz
dHMvV2ViRnJhbWVUZXN0LmNwcAppbmRleCAwM2MyMDFlMTY3ODg3OWY1YjE5NDk0YzZiNWVhNWY5
MTY4ODNlNGM5Li40ZWZkYzdiZWRiYTEwMzRlZGUyMjY5OTI1MTc2OWY2ZjJjZWMzMjk3IDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL1dlYkZyYW1lVGVzdC5jcHAKKysr
IGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9XZWJGcmFtZVRlc3QuY3BwCkBAIC0xMDc4
LDQgKzEwNzgsNzIgQEAgVEVTVF9GKFdlYkZyYW1lVGVzdCwgU2VsZWN0UmFuZ2UpCiAgICAgd2Vi
Vmlldy0+Y2xvc2UoKTsKIH0KIAorY2xhc3MgRGlzYW1iaWd1YXRpb25Qb3B1cFRlc3RXZWJWaWV3
Q2xpZW50IDogcHVibGljIFdlYlZpZXdDbGllbnQgeworcHVibGljOgorICAgIHZpcnR1YWwgYm9v
bCBoYW5kbGVEaXNhbWJpZ3VhdGlvblBvcHVwKGNvbnN0IFdlYkdlc3R1cmVFdmVudCYsIGNvbnN0
IFdlYlZlY3RvcjxXZWJSZWN0PiYgdGFyZ2V0UmVjdHMpIE9WRVJSSURFCisgICAgeworICAgICAg
ICBFWFBFQ1RfR0UodGFyZ2V0UmVjdHMuc2l6ZSgpLCAydSk7CisgICAgICAgIG1fdHJpZ2dlcmVk
ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCB0cmlnZ2Vy
ZWQoKSBjb25zdCB7IHJldHVybiBtX3RyaWdnZXJlZDsgfQorICAgIHZvaWQgcmVzZXRUcmlnZ2Vy
ZWQoKSB7IG1fdHJpZ2dlcmVkID0gZmFsc2U7IH0KKyAgICBib29sIG1fdHJpZ2dlcmVkOworfTsK
Kworc3RhdGljIFdlYkdlc3R1cmVFdmVudCBmYXRUYXAoaW50IHgsIGludCB5KQoreworICAgIFdl
Ykdlc3R1cmVFdmVudCBldmVudDsKKyAgICBldmVudC50eXBlID0gV2ViSW5wdXRFdmVudDo6R2Vz
dHVyZVRhcDsKKyAgICBldmVudC54ID0geDsKKyAgICBldmVudC55ID0geTsKKyAgICBldmVudC5i
b3VuZGluZ0JveCA9IFdlYkNvcmU6OkludFJlY3QoeCAtIDI1LCB5IC0gMjUsIDUwLCA1MCk7Cisg
ICAgcmV0dXJuIGV2ZW50OworfQorCitURVNUX0YoV2ViRnJhbWVUZXN0LCBEaXNhbWJpZ3VhdGlv
blBvcHVwVGVzdCkKK3sKKyAgICByZWdpc3Rlck1vY2tlZEh0dHBVUkxMb2FkKCJkaXNhbWJpZ3Vh
dGlvbl9wb3B1cC5odG1sIik7CisKKyAgICBEaXNhbWJpZ3VhdGlvblBvcHVwVGVzdFdlYlZpZXdD
bGllbnQgY2xpZW50OworCisgICAgLy8gTWFrZSBzdXJlIHdlIGluaXRpYWxpemUgdG8gbWluaW11
bSBzY2FsZSwgZXZlbiBpZiB0aGUgd2luZG93IHNpemUKKyAgICAvLyBvbmx5IGJlY29tZXMgYXZh
aWxhYmxlIGFmdGVyIHRoZSBsb2FkIGJlZ2lucy4KKyAgICBXZWJWaWV3SW1wbCogd2ViVmlld0lt
cGwgPSBzdGF0aWNfY2FzdDxXZWJWaWV3SW1wbCo+KEZyYW1lVGVzdEhlbHBlcnM6OmNyZWF0ZVdl
YlZpZXdBbmRMb2FkKG1fYmFzZVVSTCArICJkaXNhbWJpZ3VhdGlvbl9wb3B1cC5odG1sIiwgdHJ1
ZSwgMCwgJmNsaWVudCkpOworICAgIHdlYlZpZXdJbXBsLT5yZXNpemUoV2ViU2l6ZSgxMDAwLCAx
MDAwKSk7CisgICAgd2ViVmlld0ltcGwtPmxheW91dCgpOworCisgICAgY2xpZW50LnJlc2V0VHJp
Z2dlcmVkKCk7CisgICAgd2ViVmlld0ltcGwtPmhhbmRsZUlucHV0RXZlbnQoZmF0VGFwKDAsIDAp
KTsKKyAgICBFWFBFQ1RfRkFMU0UoY2xpZW50LnRyaWdnZXJlZCgpKTsKKworICAgIGNsaWVudC5y
ZXNldFRyaWdnZXJlZCgpOworICAgIHdlYlZpZXdJbXBsLT5oYW5kbGVJbnB1dEV2ZW50KGZhdFRh
cCgyMDAsIDExNSkpOworICAgIEVYUEVDVF9GQUxTRShjbGllbnQudHJpZ2dlcmVkKCkpOworCisg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gNDY7IGkrKykgeworICAgICAgICBjbGllbnQucmVzZXRU
cmlnZ2VyZWQoKTsKKyAgICAgICAgd2ViVmlld0ltcGwtPmhhbmRsZUlucHV0RXZlbnQoZmF0VGFw
KDEyMCwgMjMwICsgaSAqIDUpKTsKKworICAgICAgICBpbnQgaiA9IGkgJSAxMDsKKyAgICAgICAg
aWYgKGogPj0gNyAmJiBqIDw9IDkpCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShjbGllbnQudHJp
Z2dlcmVkKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoY2xpZW50
LnRyaWdnZXJlZCgpKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8PSA0NjsgaSsr
KSB7CisgICAgICAgIGNsaWVudC5yZXNldFRyaWdnZXJlZCgpOworICAgICAgICB3ZWJWaWV3SW1w
bC0+aGFuZGxlSW5wdXRFdmVudChmYXRUYXAoMTAgKyBpICogNSwgNTkwKSk7CisKKyAgICAgICAg
aW50IGogPSBpICUgMTA7CisgICAgICAgIGlmIChqID49IDcgJiYgaiA8PSA5KQorICAgICAgICAg
ICAgRVhQRUNUX1RSVUUoY2xpZW50LnRyaWdnZXJlZCgpKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgRVhQRUNUX0ZBTFNFKGNsaWVudC50cmlnZ2VyZWQoKSk7CisgICAgfQorCit9CisKIH0g
Ly8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL2Rh
dGEvZGlzYW1iaWd1YXRpb25fcG9wdXAuaHRtbCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVz
dHMvZGF0YS9kaXNhbWJpZ3VhdGlvbl9wb3B1cC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmIxYWYyODVjZTYx
ZjAxN2MyMmMyODA5Y2I4Y2UxYjE5NGFlNzFlNmIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL3Rlc3RzL2RhdGEvZGlzYW1iaWd1YXRpb25fcG9wdXAuaHRtbApAQCAt
MCwwICsxLDMwIEBACis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPkRpc2FtYmlndWF0aW9uIFBvcHVw
IFRlc3Q8L3RpdGxlPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKy5ob3Jpem9udGFsLWxpbmsg
eworICAgIGRpc3BsYXk6YmxvY2s7CisgICAgd2lkdGg6MjAwcHg7CisgICAgaGVpZ2h0OjMwcHg7
CisgICAgbWFyZ2luOjIwcHg7CisgICAgYmFja2dyb3VuZC1jb2xvcjojY2NjY2ZmOworfQorLnZl
cnRpY2FsLWxpbmsgeworICAgIGRpc3BsYXk6aW5saW5lLWJsb2NrOworICAgIHdpZHRoOjMwcHg7
CisgICAgaGVpZ2h0OjIwMHB4OworICAgIG1hcmdpbjoxMHB4OworICAgIGJhY2tncm91bmQtY29s
b3I6I2NjY2NmZjsKK30KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keSBzdHlsZT0ibWFyZ2luOjBw
eDsiPgorPGEgaHJlZj0iIyIgY2xhc3M9Imhvcml6b250YWwtbGluayIgc3R5bGU9Im1hcmdpbjox
MDBweCI+TGluazwvYT4KKzxhIGhyZWY9IiMiIGNsYXNzPSJob3Jpem9udGFsLWxpbmsiPkxpbmsg
MTwvYT4KKzxhIGhyZWY9IiMiIGNsYXNzPSJob3Jpem9udGFsLWxpbmsiPkxpbmsgMjwvYT4KKzxh
IGhyZWY9IiMiIGNsYXNzPSJob3Jpem9udGFsLWxpbmsiPkxpbmsgMzwvYT4KKzxhIGhyZWY9IiMi
IGNsYXNzPSJob3Jpem9udGFsLWxpbmsiPkxpbmsgNDwvYT4KKzxhIGhyZWY9IiMiIGNsYXNzPSJo
b3Jpem9udGFsLWxpbmsiPkxpbmsgNTwvYT4KKzxhIGhyZWY9IiMiIGNsYXNzPSJ2ZXJ0aWNhbC1s
aW5rIj5MaW5rIDE8L2E+PGEgaHJlZj0iIyIgY2xhc3M9InZlcnRpY2FsLWxpbmsiPkxpbmsgMjwv
YT48YSBocmVmPSIjIiBjbGFzcz0idmVydGljYWwtbGluayI+TGluayAzPC9hPjxhIGhyZWY9IiMi
IGNsYXNzPSJ2ZXJ0aWNhbC1saW5rIj5MaW5rIDQ8L2E+PGEgaHJlZj0iIyIgY2xhc3M9InZlcnRp
Y2FsLWxpbmsiPkxpbmsgNTwvYT4KKzwvYm9keT4KKzwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>161322</attachid>
            <date>2012-08-29 14:55:33 -0700</date>
            <delta_ts>2012-08-29 21:08:15 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-94182-20120829145523.patch</filename>
            <type>text/plain</type>
            <size>17394</size>
            <attacher name="Tien-Ren Chen">trchen</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTI3MDUxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCmluZGV4
IGZiMmE2NDU5NWJlYzQwMmMxOTEzMzc2YWQ1OWMxYjZhZmFkMDJkZTcuLjA1ODVlODUzNTQ2Mjhh
OWE0MWRkYWJlZTkyOTFmYjRhOWQzOGU5ODggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCkBA
IC0xLDMgKzEsMzkgQEAKKzIwMTItMDgtMjQgIFRpZW4tUmVuIENoZW4gIDx0cmNoZW5AY2hyb21p
dW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0gSW1wbGVtZW50IGRpc2FtYmlndWF0aW9uIHBv
cHVwIChhLmsuYS4gTGluayBQcmV2aWV3KQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9OTQxODIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBJbiB0aGlzIG5ldyBpbXBsZW1lbnRhdGlvbiwgd2UgYWRkIGEgbmV3
IFdlYlZpZXdDbGllbnQ6OmhhbmRsZURpc2FtYmlndWF0aW9uUG9wdXAgZGVsZWdhdGUuCisgICAg
ICAgIFRoZSBkaXNhbWJpZ3VhdGlvbiBzZXF1ZW5jZSB3aWxsIGJlIGluaXRpYXRlZCBieSB0aGUg
Z2VzdHVyZSBldmVudCBoYW5kbGVyCisgICAgICAgIGluIFdlYlZpZXdJbXBsIGlmIGFuIGFtYmln
dW91cyB0YXAgaXMgZGV0ZWN0ZWQsIHRoZW4KKyAgICAgICAgbV9jbGllbnQtPmhhbmRsZURpc2Ft
YmlndWF0aW9uUG9wdXAgd2lsbCBiZSBjYWxsZWQsIHNvIHRoZSBlbWJlZGRlciBjYW4KKyAgICAg
ICAgZGVjaWRlIHdoZXRoZXIgdG8gc3dhbGxvdyB0aGUgdG91Y2ggZXZlbnQgYW5kIHNob3cgYSBw
b3B1cC4KKworICAgICAgICBOZXcgdGVzdDogV2ViRnJhbWVUZXN0LkRpc2FtYmlndWF0aW9uUG9w
dXBUZXN0CisKKyAgICAgICAgKiBXZWJLaXQuZ3lwOgorICAgICAgICAqIGZlYXR1cmVzLmd5cGk6
CisgICAgICAgICogcHVibGljL1dlYklucHV0RXZlbnQuaDoKKyAgICAgICAgKFdlYkdlc3R1cmVF
dmVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYkdlc3R1cmVFdmVudDo6V2ViR2VzdHVyZUV2ZW50
KToKKyAgICAgICAgKiBwdWJsaWMvV2ViVG91Y2hDYW5kaWRhdGVzSW5mby5oOiBSZW1vdmVkLgor
ICAgICAgICAqIHB1YmxpYy9XZWJWaWV3Lmg6CisgICAgICAgIChXZWJLaXQpOgorICAgICAgICAq
IHB1YmxpYy9XZWJWaWV3Q2xpZW50Lmg6CisgICAgICAgIChXZWJLaXQpOgorICAgICAgICAoV2Vi
Vmlld0NsaWVudCk6CisgICAgICAgIChXZWJLaXQ6OldlYlZpZXdDbGllbnQ6OnRyaWdnZXJzTGlu
a1ByZXZpZXcpOgorICAgICAgICAqIHNyYy9XZWJJbnB1dEV2ZW50LmNwcDoKKyAgICAgICAgKFNh
bWVTaXplQXNXZWJHZXN0dXJlRXZlbnQpOgorICAgICAgICAqIHNyYy9XZWJWaWV3SW1wbC5jcHA6
CisgICAgICAgIChXZWJLaXQpOgorICAgICAgICAoV2ViS2l0OjpXZWJWaWV3SW1wbDo6aGFuZGxl
R2VzdHVyZUV2ZW50V2l0aExpbmtQcmV2aWV3KToKKyAgICAgICAgKFdlYktpdDo6V2ViVmlld0lt
cGw6OmhhbmRsZUdlc3R1cmVFdmVudCk6CisgICAgICAgICogc3JjL1dlYlZpZXdJbXBsLmg6Cisg
ICAgICAgIChXZWJWaWV3SW1wbCk6CisKIDIwMTItMDgtMjkgIFcuIEphbWVzIE1hY0xlYW4gIDx3
am1hY2xlYW5AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFtjaHJvbWl1bV0gTGluayBoaWdobGln
aHQgc2hvdWxkIGNsZWFyIG9uIHBhZ2UgbmF2aWdhdGlvbi4KZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL1dlYkNvcmUuZ3lwaSBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCA5
NDZhN2EwYWE4OTc0YTUzZDMwYjY3NDQyNWQ1OTcyNjFkMzE1MDMzLi44NjFmMTMyMGM2MDVmNWJl
OWE1MTRkNjJhM2NiYTEyOTg2NWEyZGNlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLmd5cGkKKysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCkBAIC0zMTYzLDYgKzMx
NjMsOCBAQAogICAgICAgICAgICAgJ3BhZ2UvU3VzcGVuZGFibGVUaW1lci5oJywKICAgICAgICAg
ICAgICdwYWdlL1RvdWNoQWRqdXN0bWVudC5jcHAnLAogICAgICAgICAgICAgJ3BhZ2UvVG91Y2hB
ZGp1c3RtZW50LmgnLAorICAgICAgICAgICAgJ3BhZ2UvVG91Y2hEaXNhbWJpZ3VhdGlvbi5jcHAn
LAorICAgICAgICAgICAgJ3BhZ2UvVG91Y2hEaXNhbWJpZ3VhdGlvbi5oJywKICAgICAgICAgICAg
ICdwYWdlL1VzZXJDb250ZW50VVJMUGF0dGVybi5jcHAnLAogICAgICAgICAgICAgJ3BhZ2UvV2Vi
S2l0QW5pbWF0aW9uLmNwcCcsCiAgICAgICAgICAgICAncGFnZS9XZWJLaXRBbmltYXRpb24uaCcs
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wYWdlL1RvdWNoRGlzYW1iaWd1YXRpb24uY3Bw
IGIvU291cmNlL1dlYkNvcmUvcGFnZS9Ub3VjaERpc2FtYmlndWF0aW9uLmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li41ZWZlM2RiNDkxNDA1ZTczNjFkNzZiNzdlZmIxMWVhNzM0MDZmMTdlCi0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYkNvcmUvcGFnZS9Ub3VjaERpc2FtYmlndWF0aW9uLmNwcApAQCAtMCww
ICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0
OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
CisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9m
IEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBB
TkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlS
SUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIlRvdWNoRGlzYW1iaWd1
YXRpb24uaCIKKworI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgor
I2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiSFRN
TE5hbWVzLmgiCisjaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgorI2luY2x1ZGUgPGFsZ29yaXRo
bT4KKyNpbmNsdWRlIDxjbWF0aD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitzdGF0aWMgSW50UmVjdCBib3VuZGluZ0JveEZvckV2ZW50Tm9kZXMoTm9k
ZSogZXZlbnROb2RlKQoreworICAgIGlmICghZXZlbnROb2RlLT5kb2N1bWVudCgpLT52aWV3KCkp
CisgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CisKKyAgICBJbnRSZWN0IHJlc3VsdDsKKyAgICBO
b2RlKiBub2RlID0gZXZlbnROb2RlOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIC8vIFNr
aXAgdGhlIHdob2xlIHN1Yi10cmVlIGlmIHRoZSBub2RlIGRvZXNuJ3QgcHJvcGFnYXRlIGV2ZW50
cy4KKyAgICAgICAgaWYgKG5vZGUgIT0gZXZlbnROb2RlICYmIG5vZGUtPndpbGxSZXNwb25kVG9N
b3VzZUNsaWNrRXZlbnRzKCkpIHsKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT50cmF2ZXJzZU5l
eHRTaWJsaW5nKGV2ZW50Tm9kZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQor
ICAgICAgICByZXN1bHQudW5pdGUocGl4ZWxTbmFwcGVkSW50UmVjdChub2RlLT5nZXRSZWN0KCkp
KTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoZXZlbnROb2RlKTsKKyAg
ICB9CisgICAgcmV0dXJuIGV2ZW50Tm9kZS0+ZG9jdW1lbnQoKS0+dmlldygpLT5jb250ZW50c1Rv
V2luZG93KHJlc3VsdCk7Cit9CisKK3N0YXRpYyBmbG9hdCBzY29yZVRvdWNoVGFyZ2V0KEludFBv
aW50IHRvdWNoUG9pbnQsIGludCBwYWRkaW5nLCBJbnRSZWN0IGJvdW5kaW5nQm94KQoreworICAg
IGlmIChib3VuZGluZ0JveC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgZmxv
YXQgcmVjaXByb2NhbFBhZGRpbmcgPSAxLmYgLyBwYWRkaW5nOworICAgIGZsb2F0IHNjb3JlID0g
MTsKKworICAgIEludFNpemUgZGlzdGFuY2UgPSBib3VuZGluZ0JveC5kaWZmZXJlbmNlVG9Qb2lu
dCh0b3VjaFBvaW50KTsKKyAgICBzY29yZSAqPSBtYXgoKHBhZGRpbmcgLSBhYnMoZGlzdGFuY2Uu
d2lkdGgoKSkpICogcmVjaXByb2NhbFBhZGRpbmcsIDAuZik7CisgICAgc2NvcmUgKj0gbWF4KChw
YWRkaW5nIC0gYWJzKGRpc3RhbmNlLmhlaWdodCgpKSkgKiByZWNpcHJvY2FsUGFkZGluZywgMC5m
KTsKKworICAgIHJldHVybiBzY29yZTsKK30KKworc3RydWN0IFRvdWNoVGFyZ2V0RGF0YSB7Cisg
ICAgSW50UmVjdCB3aW5kb3dCb3VuZGluZ0JveDsKKyAgICBmbG9hdCBzY29yZTsKK307CisKK3Zv
aWQgZmluZEdvb2RUb3VjaFRhcmdldHMoY29uc3QgSW50UmVjdCYgdG91Y2hCb3gsIEZyYW1lKiBt
YWluRnJhbWUsIGZsb2F0IHBhZ2VTY2FsZUZhY3RvciwgVmVjdG9yPEludFJlY3Q+JiBnb29kVGFy
Z2V0cykKK3sKKyAgICBnb29kVGFyZ2V0cy5jbGVhcigpOworCisgICAgaW50IHRvdWNoUG9pbnRQ
YWRkaW5nID0gY2VpbChtYXgodG91Y2hCb3gud2lkdGgoKSwgdG91Y2hCb3guaGVpZ2h0KCkpICog
MC41KTsKKyAgICAvLyBGSVhNRTogUmVjdC1iYXNlZCBoaXQgdGVzdCBkb2Vzbid0IHRyYW5zZm9y
bSB0aGUgdG91Y2ggcG9pbnQgc2l6ZS4KKyAgICAvLyAgICAgICAgV2UgaGF2ZSB0byBwcmUtYXBw
bHkgcGFnZSBzY2FsZSBmYWN0b3IgaGVyZS4KKyAgICBpbnQgcGFkZGluZyA9IGNlaWwodG91Y2hQ
b2ludFBhZGRpbmcgLyBwYWdlU2NhbGVGYWN0b3IpOworCisgICAgSW50UG9pbnQgdG91Y2hQb2lu
dCA9IHRvdWNoQm94LmNlbnRlcigpOworICAgIEludFBvaW50IGNvbnRlbnRzUG9pbnQgPSBtYWlu
RnJhbWUtPnZpZXcoKS0+d2luZG93VG9Db250ZW50cyh0b3VjaFBvaW50KTsKKworICAgIEhpdFRl
c3RSZXN1bHQgcmVzdWx0ID0gbWFpbkZyYW1lLT5ldmVudEhhbmRsZXIoKS0+aGl0VGVzdFJlc3Vs
dEF0UG9pbnQoY29udGVudHNQb2ludCwgZmFsc2UsIGZhbHNlLCBEb250SGl0VGVzdFNjcm9sbGJh
cnMsIEhpdFRlc3RSZXF1ZXN0OjpBY3RpdmUgfCBIaXRUZXN0UmVxdWVzdDo6UmVhZE9ubHksIElu
dFNpemUocGFkZGluZywgcGFkZGluZykpOworICAgIGNvbnN0IExpc3RIYXNoU2V0PFJlZlB0cjxO
b2RlPiA+JiBoaXRSZXN1bHRzID0gcmVzdWx0LnJlY3RCYXNlZFRlc3RSZXN1bHQoKTsKKworICAg
IEhhc2hNYXA8Tm9kZSosIFRvdWNoVGFyZ2V0RGF0YT4gdG91Y2hUYXJnZXRzOworICAgIGZsb2F0
IGJlc3RTY29yZSA9IDA7CisgICAgZm9yIChMaXN0SGFzaFNldDxSZWZQdHI8Tm9kZT4gPjo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBoaXRSZXN1bHRzLmJlZ2luKCk7IGl0ICE9IGhpdFJlc3VsdHMuZW5k
KCk7ICsraXQpIHsKKyAgICAgICAgZm9yIChOb2RlKiBub2RlID0gaXQtPmdldCgpOyBub2RlOyBu
b2RlID0gbm9kZS0+cGFyZW50Tm9kZSgpKSB7CisgICAgICAgICAgICBpZiAobm9kZS0+aXNEb2N1
bWVudE5vZGUoKSB8fCBub2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aHRtbFRhZykgfHwgbm9k
ZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmJvZHlUYWcpKQorICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgaWYgKG5vZGUtPndpbGxSZXNwb25kVG9Nb3VzZUNsaWNrRXZlbnRzKCkp
IHsKKyAgICAgICAgICAgICAgICBUb3VjaFRhcmdldERhdGEmIHRhcmdldERhdGEgPSB0b3VjaFRh
cmdldHMuYWRkKG5vZGUsIFRvdWNoVGFyZ2V0RGF0YSgpKS5pdGVyYXRvci0+c2Vjb25kOworICAg
ICAgICAgICAgICAgIHRhcmdldERhdGEud2luZG93Qm91bmRpbmdCb3ggPSBib3VuZGluZ0JveEZv
ckV2ZW50Tm9kZXMobm9kZSk7CisgICAgICAgICAgICAgICAgdGFyZ2V0RGF0YS5zY29yZSA9IHNj
b3JlVG91Y2hUYXJnZXQodG91Y2hQb2ludCwgdG91Y2hQb2ludFBhZGRpbmcsIHRhcmdldERhdGEu
d2luZG93Qm91bmRpbmdCb3gpOworICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IG1heChiZXN0
U2NvcmUsIHRhcmdldERhdGEuc2NvcmUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChIYXNoTWFwPE5vZGUqLCBUb3Vj
aFRhcmdldERhdGE+OjppdGVyYXRvciBpdCA9IHRvdWNoVGFyZ2V0cy5iZWdpbigpOyBpdCAhPSB0
b3VjaFRhcmdldHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgLy8gQ3VycmVudGx5IHRoZSBzY29y
aW5nIGZ1bmN0aW9uIHVzZXMgdGhlIG92ZXJsYXAgYXJlYSB3aXRoIHRoZSBmYXQgcG9pbnQgYXMg
dGhlIHNjb3JlLgorICAgICAgICAvLyBXZSBpZ25vcmUgdGhlIGNhbmRpZGF0ZXMgdGhhdCBoYXMg
bGVzcyB0aGFuIDEvMiBvdmVybGFwICh3ZSBjb25zaWRlciBub3QgcmVhbGx5IGFtYmlndW91cyBl
bm91Z2gpIHRoYW4gdGhlIGJlc3QgY2FuZGlkYXRlIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBwb3B1cHMu
CisgICAgICAgIGlmIChpdC0+c2Vjb25kLnNjb3JlIDwgYmVzdFNjb3JlICogMC41KQorICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgIGdvb2RUYXJnZXRzLmFwcGVuZChpdC0+c2Vjb25kLndp
bmRvd0JvdW5kaW5nQm94KTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BhZ2UvVG91Y2hEaXNhbWJpZ3VhdGlvbi5oIGIvU291
cmNlL1dlYkNvcmUvcGFnZS9Ub3VjaERpc2FtYmlndWF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNWFmZWI2
YjViM2RmNDFmMmU1Zjk5OGUwNGMwOGU4NzZmYmY4NGYxZAotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL3BhZ2UvVG91Y2hEaXNhbWJpZ3VhdGlvbi5oCkBAIC0wLDAgKzEsNDUgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhl
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQor
ICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5j
LiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
VE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
KyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aWZuZGVmIFRvdWNoRGlzYW1iaWd1YXRpb25faAorI2RlZmluZSBUb3VjaERpc2FtYmlndWF0aW9u
X2gKKworI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitj
bGFzcyBGcmFtZTsKK2NsYXNzIEludFJlY3Q7CisKK3ZvaWQgZmluZEdvb2RUb3VjaFRhcmdldHMo
Y29uc3QgSW50UmVjdCYgdG91Y2hCb3gsIEZyYW1lKiBtYWluRnJhbWUsIGZsb2F0IHBhZ2VTY2Fs
ZUZhY3RvciwgVmVjdG9yPEludFJlY3Q+JiBnb29kVGFyZ2V0cyk7CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3B1
YmxpYy9XZWJWaWV3Q2xpZW50LmggYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3B1YmxpYy9XZWJW
aWV3Q2xpZW50LmgKaW5kZXggOTA0ZDRhMmQyMTY3ZTQ3MTYyODU5ODY2YTUyNDg0ZjRmZGI1ZWEx
ZC4uMDU4NzU1Y2U2MTc0ZGY5NDE3Y2ZlZTJhMDYyZjJhZjM4MDgwMTcyMCAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYktpdC9jaHJvbWl1bS9wdWJsaWMvV2ViVmlld0NsaWVudC5oCisrKyBiL1NvdXJj
ZS9XZWJLaXQvY2hyb21pdW0vcHVibGljL1dlYlZpZXdDbGllbnQuaApAQCAtNjIsNiArNjIsNyBA
QCBjbGFzcyBXZWJGaWxlQ2hvb3NlckNvbXBsZXRpb247CiBjbGFzcyBXZWJGcmFtZTsKIGNsYXNz
IFdlYkdlb2xvY2F0aW9uQ2xpZW50OwogY2xhc3MgV2ViR2VvbG9jYXRpb25TZXJ2aWNlOworY2xh
c3MgV2ViR2VzdHVyZUV2ZW50OwogY2xhc3MgV2ViSGVscGVyUGx1Z2luOwogY2xhc3MgV2ViSGl0
VGVzdFJlc3VsdDsKIGNsYXNzIFdlYkljb25Mb2FkaW5nQ29tcGxldGlvbjsKQEAgLTcxLDYgKzcy
LDcgQEAgY2xhc3MgV2ViS2V5Ym9hcmRFdmVudDsKIGNsYXNzIFdlYk5vZGU7CiBjbGFzcyBXZWJO
b3RpZmljYXRpb25QcmVzZW50ZXI7CiBjbGFzcyBXZWJSYW5nZTsKK2NsYXNzIFdlYlJlY3Q7CiBj
bGFzcyBXZWJTcGVlY2hJbnB1dENvbnRyb2xsZXI7CiBjbGFzcyBXZWJTcGVlY2hJbnB1dExpc3Rl
bmVyOwogY2xhc3MgV2ViU3BlZWNoUmVjb2duaXplcjsKQEAgLTI4NSw2ICsyODcsOSBAQCBwdWJs
aWM6CiAgICAgLy8gdW5sZXNzIHRoZSB2aWV3IGRpZCBub3QgbmVlZCBhIGxheW91dC4KICAgICB2
aXJ0dWFsIHZvaWQgZGlkVXBkYXRlTGF5b3V0KCkgeyB9CiAKKyAgICAvLyBSZXR1cm4gdHJ1ZSB0
byBzd2FsbG93IHRoZSBpbnB1dCBldmVudCBpZiB0aGUgZW1iZWRkZXIgd2lsbCBzdGFydCBhIGRp
c2FtYmlndWF0aW9uIHBvcHVwCisgICAgdmlydHVhbCBib29sIGhhbmRsZURpc2FtYmlndWF0aW9u
UG9wdXAoY29uc3QgV2ViR2VzdHVyZUV2ZW50JiwgY29uc3QgV2ViVmVjdG9yPFdlYlJlY3Q+JiB0
YXJnZXRSZWN0cykgeyByZXR1cm4gZmFsc2U7IH0KKwogICAgIC8vIFNlc3Npb24gaGlzdG9yeSAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAg
ICAgLy8gVGVsbHMgdGhlIGVtYmVkZGVyIHRvIG5hdmlnYXRlIGJhY2sgb3IgZm9yd2FyZCBpbiBz
ZXNzaW9uIGhpc3RvcnkgYnkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3Jj
L1dlYlZpZXdJbXBsLmNwcCBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL1dlYlZpZXdJbXBs
LmNwcAppbmRleCBlODY4YzY5YmEyYzQ0YzIyYWEzZTIwZDYyN2JkYWZjMmIyZmZlOWU3Li43MDFj
MTZlYzFkOTkyNzI4ODg3MzcwMzQ4MGI5MzJlODliN2E1YTQ3IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL3NyYy9XZWJWaWV3SW1wbC5jcHAKKysrIGIvU291cmNlL1dlYktpdC9j
aHJvbWl1bS9zcmMvV2ViVmlld0ltcGwuY3BwCkBAIC0xNjksNiArMTY5LDcgQEAKIAogI2lmIEVO
QUJMRShHRVNUVVJFX0VWRU5UUykKICNpbmNsdWRlICJQbGF0Zm9ybUdlc3R1cmVFdmVudC5oIgor
I2luY2x1ZGUgIlRvdWNoRGlzYW1iaWd1YXRpb24uaCIKICNlbmRpZgogCiAjaWYgT1MoV0lORE9X
UykKQEAgLTcwNywxMiArNzA4LDIzIEBAIGJvb2wgV2ViVmlld0ltcGw6OmhhbmRsZUdlc3R1cmVF
dmVudChjb25zdCBXZWJHZXN0dXJlRXZlbnQmIGV2ZW50KQogICAgICAgICBpZiAoZGV0ZWN0Q29u
dGVudE9uVG91Y2goV2ViUG9pbnQoZXZlbnQueCwgZXZlbnQueSksIGV2ZW50LnR5cGUpKQogICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICAgICAgUGxhdGZvcm1HZXN0dXJlRXZlbnRCdWls
ZGVyIHBsYXRmb3JtRXZlbnQobWFpbkZyYW1lSW1wbCgpLT5mcmFtZVZpZXcoKSwgZXZlbnQpOwog
ICAgICAgICBSZWZQdHI8V2ViQ29yZTo6UG9wdXBDb250YWluZXI+IHNlbGVjdFBvcHVwOwogICAg
ICAgICBzZWxlY3RQb3B1cCA9IG1fc2VsZWN0UG9wdXA7CiAgICAgICAgIGhpZGVTZWxlY3RQb3B1
cCgpOwogICAgICAgICBBU1NFUlQoIW1fc2VsZWN0UG9wdXApOworCisgICAgICAgIGlmICghZXZl
bnQuYm91bmRpbmdCb3guaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBWZWN0b3I8SW50UmVjdD4g
Z29vZFRhcmdldHM7CisgICAgICAgICAgICBmaW5kR29vZFRvdWNoVGFyZ2V0cyhldmVudC5ib3Vu
ZGluZ0JveCwgbWFpbkZyYW1lSW1wbCgpLT5mcmFtZSgpLCBwYWdlU2NhbGVGYWN0b3IoKSwgZ29v
ZFRhcmdldHMpOworICAgICAgICAgICAgLy8gRklYTUU6IHJlcGxhY2UgdG91Y2ggYWRqdXN0bWVu
dCBjb2RlIHdoZW4gbnVtYmVyT2ZHb29kVGFyZ2V0cyA9PSAxPworICAgICAgICAgICAgLy8gU2lu
Z2xlIGNhbmRpZGF0ZSBjYXNlIGlzIGN1cnJlbnRseSBoYW5kbGVkIGJ5OiBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODUxMDEKKyAgICAgICAgICAgIGlmIChnb29kVGFy
Z2V0cy5zaXplKCkgPj0gMiAmJiBtX2NsaWVudCAmJiBtX2NsaWVudC0+aGFuZGxlRGlzYW1iaWd1
YXRpb25Qb3B1cChldmVudCwgZ29vZFRhcmdldHMpKQorICAgICAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICB9CisKKyAgICAgICAgUGxhdGZvcm1HZXN0dXJlRXZlbnRCdWlsZGVyIHBs
YXRmb3JtRXZlbnQobWFpbkZyYW1lSW1wbCgpLT5mcmFtZVZpZXcoKSwgZXZlbnQpOwogICAgICAg
ICBib29sIGdlc3R1cmVIYW5kbGVkID0gbWFpbkZyYW1lSW1wbCgpLT5mcmFtZSgpLT5ldmVudEhh
bmRsZXIoKS0+aGFuZGxlR2VzdHVyZUV2ZW50KHBsYXRmb3JtRXZlbnQpOworCiAgICAgICAgIGlm
IChtX3NlbGVjdFBvcHVwICYmIG1fc2VsZWN0UG9wdXAgPT0gc2VsZWN0UG9wdXApIHsKICAgICAg
ICAgICAgIC8vIFRoYXQgdGFwIHRyaWdnZXJlZCBhIHNlbGVjdCBwb3B1cCB3aGljaCBpcyB0aGUg
c2FtZSBhcyB0aGUgb25lIHRoYXQKICAgICAgICAgICAgIC8vIHdhcyBzaG93aW5nIGJlZm9yZSB0
aGUgdGFwLiBJdCBtZWFucyB0aGUgdXNlciB0YXBwZWQgdGhlIHNlbGVjdApAQCAtNzIwLDYgKzcz
Miw3IEBAIGJvb2wgV2ViVmlld0ltcGw6OmhhbmRsZUdlc3R1cmVFdmVudChjb25zdCBXZWJHZXN0
dXJlRXZlbnQmIGV2ZW50KQogICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgcmVvcGVuZWQgdGhl
IHNlbGVjdCBwb3B1cC4gSXQgbmVlZHMgdG8gYmUgY2xvc2VkLgogICAgICAgICAgICAgaGlkZVNl
bGVjdFBvcHVwKCk7CiAgICAgICAgIH0KKwogICAgICAgICByZXR1cm4gZ2VzdHVyZUhhbmRsZWQ7
CiAgICAgfQogICAgIGNhc2UgV2ViSW5wdXRFdmVudDo6R2VzdHVyZVR3b0ZpbmdlclRhcDoKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvV2ViRnJhbWVUZXN0LmNwcCBi
L1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvV2ViRnJhbWVUZXN0LmNwcAppbmRleCAwM2My
MDFlMTY3ODg3OWY1YjE5NDk0YzZiNWVhNWY5MTY4ODNlNGM5Li40ZWZkYzdiZWRiYTEwMzRlZGUy
MjY5OTI1MTc2OWY2ZjJjZWMzMjk3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVt
L3Rlc3RzL1dlYkZyYW1lVGVzdC5jcHAKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0
cy9XZWJGcmFtZVRlc3QuY3BwCkBAIC0xMDc4LDQgKzEwNzgsNzIgQEAgVEVTVF9GKFdlYkZyYW1l
VGVzdCwgU2VsZWN0UmFuZ2UpCiAgICAgd2ViVmlldy0+Y2xvc2UoKTsKIH0KIAorY2xhc3MgRGlz
YW1iaWd1YXRpb25Qb3B1cFRlc3RXZWJWaWV3Q2xpZW50IDogcHVibGljIFdlYlZpZXdDbGllbnQg
eworcHVibGljOgorICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVEaXNhbWJpZ3VhdGlvblBvcHVwKGNv
bnN0IFdlYkdlc3R1cmVFdmVudCYsIGNvbnN0IFdlYlZlY3RvcjxXZWJSZWN0PiYgdGFyZ2V0UmVj
dHMpIE9WRVJSSURFCisgICAgeworICAgICAgICBFWFBFQ1RfR0UodGFyZ2V0UmVjdHMuc2l6ZSgp
LCAydSk7CisgICAgICAgIG1fdHJpZ2dlcmVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorCisgICAgYm9vbCB0cmlnZ2VyZWQoKSBjb25zdCB7IHJldHVybiBtX3RyaWdnZXJl
ZDsgfQorICAgIHZvaWQgcmVzZXRUcmlnZ2VyZWQoKSB7IG1fdHJpZ2dlcmVkID0gZmFsc2U7IH0K
KyAgICBib29sIG1fdHJpZ2dlcmVkOworfTsKKworc3RhdGljIFdlYkdlc3R1cmVFdmVudCBmYXRU
YXAoaW50IHgsIGludCB5KQoreworICAgIFdlYkdlc3R1cmVFdmVudCBldmVudDsKKyAgICBldmVu
dC50eXBlID0gV2ViSW5wdXRFdmVudDo6R2VzdHVyZVRhcDsKKyAgICBldmVudC54ID0geDsKKyAg
ICBldmVudC55ID0geTsKKyAgICBldmVudC5ib3VuZGluZ0JveCA9IFdlYkNvcmU6OkludFJlY3Qo
eCAtIDI1LCB5IC0gMjUsIDUwLCA1MCk7CisgICAgcmV0dXJuIGV2ZW50OworfQorCitURVNUX0Yo
V2ViRnJhbWVUZXN0LCBEaXNhbWJpZ3VhdGlvblBvcHVwVGVzdCkKK3sKKyAgICByZWdpc3Rlck1v
Y2tlZEh0dHBVUkxMb2FkKCJkaXNhbWJpZ3VhdGlvbl9wb3B1cC5odG1sIik7CisKKyAgICBEaXNh
bWJpZ3VhdGlvblBvcHVwVGVzdFdlYlZpZXdDbGllbnQgY2xpZW50OworCisgICAgLy8gTWFrZSBz
dXJlIHdlIGluaXRpYWxpemUgdG8gbWluaW11bSBzY2FsZSwgZXZlbiBpZiB0aGUgd2luZG93IHNp
emUKKyAgICAvLyBvbmx5IGJlY29tZXMgYXZhaWxhYmxlIGFmdGVyIHRoZSBsb2FkIGJlZ2lucy4K
KyAgICBXZWJWaWV3SW1wbCogd2ViVmlld0ltcGwgPSBzdGF0aWNfY2FzdDxXZWJWaWV3SW1wbCo+
KEZyYW1lVGVzdEhlbHBlcnM6OmNyZWF0ZVdlYlZpZXdBbmRMb2FkKG1fYmFzZVVSTCArICJkaXNh
bWJpZ3VhdGlvbl9wb3B1cC5odG1sIiwgdHJ1ZSwgMCwgJmNsaWVudCkpOworICAgIHdlYlZpZXdJ
bXBsLT5yZXNpemUoV2ViU2l6ZSgxMDAwLCAxMDAwKSk7CisgICAgd2ViVmlld0ltcGwtPmxheW91
dCgpOworCisgICAgY2xpZW50LnJlc2V0VHJpZ2dlcmVkKCk7CisgICAgd2ViVmlld0ltcGwtPmhh
bmRsZUlucHV0RXZlbnQoZmF0VGFwKDAsIDApKTsKKyAgICBFWFBFQ1RfRkFMU0UoY2xpZW50LnRy
aWdnZXJlZCgpKTsKKworICAgIGNsaWVudC5yZXNldFRyaWdnZXJlZCgpOworICAgIHdlYlZpZXdJ
bXBsLT5oYW5kbGVJbnB1dEV2ZW50KGZhdFRhcCgyMDAsIDExNSkpOworICAgIEVYUEVDVF9GQUxT
RShjbGllbnQudHJpZ2dlcmVkKCkpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gNDY7IGkr
KykgeworICAgICAgICBjbGllbnQucmVzZXRUcmlnZ2VyZWQoKTsKKyAgICAgICAgd2ViVmlld0lt
cGwtPmhhbmRsZUlucHV0RXZlbnQoZmF0VGFwKDEyMCwgMjMwICsgaSAqIDUpKTsKKworICAgICAg
ICBpbnQgaiA9IGkgJSAxMDsKKyAgICAgICAgaWYgKGogPj0gNyAmJiBqIDw9IDkpCisgICAgICAg
ICAgICBFWFBFQ1RfVFJVRShjbGllbnQudHJpZ2dlcmVkKCkpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBFWFBFQ1RfRkFMU0UoY2xpZW50LnRyaWdnZXJlZCgpKTsKKyAgICB9CisKKyAgICBm
b3IgKGludCBpID0gMDsgaSA8PSA0NjsgaSsrKSB7CisgICAgICAgIGNsaWVudC5yZXNldFRyaWdn
ZXJlZCgpOworICAgICAgICB3ZWJWaWV3SW1wbC0+aGFuZGxlSW5wdXRFdmVudChmYXRUYXAoMTAg
KyBpICogNSwgNTkwKSk7CisKKyAgICAgICAgaW50IGogPSBpICUgMTA7CisgICAgICAgIGlmIChq
ID49IDcgJiYgaiA8PSA5KQorICAgICAgICAgICAgRVhQRUNUX1RSVUUoY2xpZW50LnRyaWdnZXJl
ZCgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKGNsaWVudC50cmln
Z2VyZWQoKSk7CisgICAgfQorCit9CisKIH0gLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL2RhdGEvZGlzYW1iaWd1YXRpb25fcG9wdXAuaHRtbCBi
L1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvZGF0YS9kaXNhbWJpZ3VhdGlvbl9wb3B1cC5o
dG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLmIxYWYyODVjZTYxZjAxN2MyMmMyODA5Y2I4Y2UxYjE5NGFlNzFlNmIK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL2RhdGEvZGlz
YW1iaWd1YXRpb25fcG9wdXAuaHRtbApAQCAtMCwwICsxLDMwIEBACis8aHRtbD4KKzxoZWFkPgor
PHRpdGxlPkRpc2FtYmlndWF0aW9uIFBvcHVwIFRlc3Q8L3RpdGxlPgorPHN0eWxlIHR5cGU9InRl
eHQvY3NzIj4KKy5ob3Jpem9udGFsLWxpbmsgeworICAgIGRpc3BsYXk6YmxvY2s7CisgICAgd2lk
dGg6MjAwcHg7CisgICAgaGVpZ2h0OjMwcHg7CisgICAgbWFyZ2luOjIwcHg7CisgICAgYmFja2dy
b3VuZC1jb2xvcjojY2NjY2ZmOworfQorLnZlcnRpY2FsLWxpbmsgeworICAgIGRpc3BsYXk6aW5s
aW5lLWJsb2NrOworICAgIHdpZHRoOjMwcHg7CisgICAgaGVpZ2h0OjIwMHB4OworICAgIG1hcmdp
bjoxMHB4OworICAgIGJhY2tncm91bmQtY29sb3I6I2NjY2NmZjsKK30KKzwvc3R5bGU+Cis8L2hl
YWQ+Cis8Ym9keSBzdHlsZT0ibWFyZ2luOjBweDsiPgorPGEgaHJlZj0iIyIgY2xhc3M9Imhvcml6
b250YWwtbGluayIgc3R5bGU9Im1hcmdpbjoxMDBweCI+TGluazwvYT4KKzxhIGhyZWY9IiMiIGNs
YXNzPSJob3Jpem9udGFsLWxpbmsiPkxpbmsgMTwvYT4KKzxhIGhyZWY9IiMiIGNsYXNzPSJob3Jp
em9udGFsLWxpbmsiPkxpbmsgMjwvYT4KKzxhIGhyZWY9IiMiIGNsYXNzPSJob3Jpem9udGFsLWxp
bmsiPkxpbmsgMzwvYT4KKzxhIGhyZWY9IiMiIGNsYXNzPSJob3Jpem9udGFsLWxpbmsiPkxpbmsg
NDwvYT4KKzxhIGhyZWY9IiMiIGNsYXNzPSJob3Jpem9udGFsLWxpbmsiPkxpbmsgNTwvYT4KKzxh
IGhyZWY9IiMiIGNsYXNzPSJ2ZXJ0aWNhbC1saW5rIj5MaW5rIDE8L2E+PGEgaHJlZj0iIyIgY2xh
c3M9InZlcnRpY2FsLWxpbmsiPkxpbmsgMjwvYT48YSBocmVmPSIjIiBjbGFzcz0idmVydGljYWwt
bGluayI+TGluayAzPC9hPjxhIGhyZWY9IiMiIGNsYXNzPSJ2ZXJ0aWNhbC1saW5rIj5MaW5rIDQ8
L2E+PGEgaHJlZj0iIyIgY2xhc3M9InZlcnRpY2FsLWxpbmsiPkxpbmsgNTwvYT4KKzwvYm9keT4K
KzwvaHRtbD4K
</data>

          </attachment>
      

    </bug>

</bugzilla>