<?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>66664</bug_id>
          
          <creation_ts>2011-08-22 06:13:47 -0700</creation_ts>
          <short_desc>[Qt][WK2] Add the animations on the ViewportInteractionEngine</short_desc>
          <delta_ts>2011-11-01 02:53:49 -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>WebKit2</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>Qt, QtTriaged</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>70236</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Benjamin Poulain">benjamin</reporter>
          <assigned_to name="Andras Becsi">abecsi</assigned_to>
          <cc>abecsi</cc>
    
    <cc>dinu.jacob</cc>
    
    <cc>hausmann</cc>
    
    <cc>jturcotte</cc>
    
    <cc>kenneth</cc>
    
    <cc>mtutunik</cc>
    
    <cc>ossy</cc>
    
    <cc>ostap73</cc>
    
    <cc>pierre.rossi</cc>
    
    <cc>vestbo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>454554</commentid>
    <comment_count>0</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2011-08-22 06:13:47 -0700</bug_when>
    <thetext>The ViewportInteractionEngine is supposed to animated the content back into the viewport. Currently it just jumps back to position.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>455613</commentid>
    <comment_count>1</comment_count>
      <attachid>104891</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2011-08-23 12:39:51 -0700</bug_when>
    <thetext>Created attachment 104891
Patch

Here is the current patch.
It should work ok-ish but I had no time to clean it and I am going home.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>455728</commentid>
    <comment_count>2</comment_count>
      <attachid>104891</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2011-08-23 15:05:03 -0700</bug_when>
    <thetext>Comment on attachment 104891
Patch

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

&gt; Source/WebKit2/UIProcess/qt/ViewportInteractionEngine.cpp:208
&gt; +void ViewportInteractionEngine::emitContentGeometryChangedWithCurrentGeometry()

current viewport geometry? That name is a big mouthful :-)

Anyway, you are using this in two places only and it might be more clear to actually just have the code there. Then noone will be in doubt about the coord system.

&gt; Source/WebKit2/UIProcess/qt/ViewportInteractionEngine.cpp:282
&gt; -void ViewportInteractionEngine::animateContentPositionIntoBoundariesIfNeeded()
&gt; +void ViewportInteractionEngine::animateContentIntoBoundariesIfNeeded()

So they had to be joined after all?

&gt; Source/WebKit2/UIProcess/qt/ViewportInteractionEngine.cpp:289
&gt; +    const qreal boundedScale = qBound(m_constraints.minimumScale, currentScale, m_constraints.maximumScale);

Can&apos;t you copy our innerBound and outerBound methods from the N9 browser? We are bound to use these in more places and we are going to allow zooming a bit further out than the min scale for instance and then showing a bouncing back animation.

&gt; Source/WebKit2/UIProcess/qt/ViewportInteractionEngine.cpp:299
&gt; +        // Revert the change in order to animated both the scale and position.

Something wrong with the English here. I guess you mean &apos;animate&apos;

&gt; Source/WebKit2/UIProcess/qt/ViewportInteractionEngine.cpp:338
&gt; +        // Already commit final visible rect so new tiles can already be rendered.

two already&apos;s in there. // Commit the final visible rect already now, so that new tiles can be rendered immediately  ??</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>455863</commentid>
    <comment_count>3</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2011-08-23 17:26:35 -0700</bug_when>
    <thetext>Uh, that was not for review Kenneth, the patch is unfinished, check the comment :-D
Feel free to take over.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>456013</commentid>
    <comment_count>4</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2011-08-24 01:44:07 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Uh, that was not for review Kenneth, the patch is unfinished, check the comment :-D
&gt; Feel free to take over.

If you are not going to finish it, I can work on it next week.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>473047</commentid>
    <comment_count>5</comment_count>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2011-09-26 04:04:54 -0700</bug_when>
    <thetext>I&apos;ll finish this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>474000</commentid>
    <comment_count>6</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2011-09-27 09:45:51 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; I&apos;ll finish this.

Great :-) I&apos;ll try to review and give comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>474960</commentid>
    <comment_count>7</comment_count>
    <who name="Misha">mtutunik</who>
    <bug_when>2011-09-28 13:29:04 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (In reply to comment #5)
&gt; &gt; I&apos;ll finish this.
&gt; 
&gt; Great :-) I&apos;ll try to review and give comments.

Why do we need two animations?
Brining the page into boundaries after pan (flick) should be done by kinetic (physics) engine (which we hopefully will bring in). So the only case when we need to animateContentIntoBoundariesIfNeeded() is when we &quot;overzoom&quot;. In this case we need to change scale and pos at the same time, so we can use one property animation. Am I missing something?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475004</commentid>
    <comment_count>8</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2011-09-28 14:10:29 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; Brining the page into boundaries after pan (flick) should be done by kinetic (physics) engine (which we hopefully will bring in). So the only case when we need to animateContentIntoBoundariesIfNeeded() is when we &quot;overzoom&quot;. In this case we need to change scale and pos at the same time, so we can use one property animation. Am I missing something?

In the end, ViewportInteractionEngine will be the so called &quot;physics engine&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475062</commentid>
    <comment_count>9</comment_count>
    <who name="Misha">mtutunik</who>
    <bug_when>2011-09-28 16:06:37 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #7)
&gt; &gt; Brining the page into boundaries after pan (flick) should be done by kinetic (physics) engine (which we hopefully will bring in). So the only case when we need to animateContentIntoBoundariesIfNeeded() is when we &quot;overzoom&quot;. In this case we need to change scale and pos at the same time, so we can use one property animation. Am I missing something?
&gt; 
&gt; In the end, ViewportInteractionEngine will be the so called &quot;physics engine&quot;.

Does it mean that we going to have physics implementation in ViewportInteractionEngine or just call some Qt API (which one?) to do kinetic.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475066</commentid>
    <comment_count>10</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2011-09-28 16:15:21 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; &gt; In the end, ViewportInteractionEngine will be the so called &quot;physics engine&quot;.
&gt; 
&gt; Does it mean that we going to have physics implementation in ViewportInteractionEngine or just call some Qt API (which one?) to do kinetic.

At first, the ViewportInteractionEngine should mimic the behavior of QML kinetic scrolling.

This particular bug is probably not the best place to discuss the design of Qt/QtWebKit&apos;s kinetic implementation. The mailing list is probably a better choice.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475449</commentid>
    <comment_count>11</comment_count>
      <attachid>109166</attachid>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2011-09-29 09:16:35 -0700</bug_when>
    <thetext>Created attachment 109166
proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475450</commentid>
    <comment_count>12</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-09-29 09:19:50 -0700</bug_when>
    <thetext>Attachment 109166 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebKit2/ChangeLog&apos;, u&apos;Source/WebKit...&quot; exit_code: 1

Source/WebKit2/UIProcess/qt/ViewportInteractionEngine.h:29:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit2/UIProcess/qt/ViewportInteractionEngine.h:30:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 2 in 6 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475481</commentid>
    <comment_count>13</comment_count>
      <attachid>109166</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2011-09-29 09:56:49 -0700</bug_when>
    <thetext>Comment on attachment 109166
proposed patch

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

&gt; Source/WebKit2/UIProcess/qt/QtPanGestureRecognizer.cpp:40
&gt; +bool QtPanGestureRecognizer::recognize(const QTouchEvent* event, double timestamp)

is double what is normally used for timestamps in WebKit?

&gt; Source/WebKit2/UIProcess/qt/ViewportInteractionEngine.cpp:33
&gt; +static const int panThrowAnimationThreshold = shortDuration;

Throw?

&gt; Source/WebKit2/UIProcess/qt/ViewportInteractionEngine.cpp:53
&gt; +static inline const QPointF adjustPositionIntoBoundaries(const QSGItem* viewport, const QRectF&amp; requestedGeometry)
&gt; +{

I don&apos;t like the way this is done. I would like instead that you calculate the target scale and content point that should be in the center position of the viewport. This is what we are doing in Grob, and it handles more cases, such that you zoom out and move the content up (or down) a lot, and the visible point in the content seen in the center of the viewport will zoom back into the center of the viewport if possible. The code in grob is also a lot easier to understand. This code is really hard to understand</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475588</commentid>
    <comment_count>14</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2011-09-29 12:12:39 -0700</bug_when>
    <thetext>Andras, can we look at this together next week? Kenneth just explained to me the idea of animating between points instead of animating the geometries. We should try to re-use some code from Grob here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475777</commentid>
    <comment_count>15</comment_count>
    <who name="Misha">mtutunik</who>
    <bug_when>2011-09-29 17:42:40 -0700</bug_when>
    <thetext>How about ViewportInteractionEngine having property - &quot;viewableRect&quot; which represent viewport rect in content coord and we animate this property.

The animation is done by animateScaleToHotspot(const QPointF&amp; viewportHotSpot, const qreal destScale) which is invoked from animateContentScaleIntoBoundariesIfNeeded() with viewport center and new scale passed as args. The same function can be re-used for &quot;double tap zoom&quot;.
I think it&apos;s prety much the same as Kenneth suggested in his comment and what was done in the past.

I&apos;m attaching the patch to illustrate (not for review).
 
Also, I think we don&apos;t need animateContentPositionIntoBoundariesIfNeeded() at all. This functionality should be done by the same code that does kinetic and overshoot (and which we currently missing :) ). Does anybody working on this?

Comments?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475780</commentid>
    <comment_count>16</comment_count>
      <attachid>109228</attachid>
    <who name="Misha">mtutunik</who>
    <bug_when>2011-09-29 17:44:24 -0700</bug_when>
    <thetext>Created attachment 109228
zoom animation patch (not for review)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475994</commentid>
    <comment_count>17</comment_count>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2011-09-30 02:44:00 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; Also, I think we don&apos;t need animateContentPositionIntoBoundariesIfNeeded() at all. This functionality should be done by the same code that does kinetic and overshoot (and which we currently missing :) ). Does anybody working on this?
&gt; 

My patch tries to mimic a kinetic movement although the naming, I realize, is somewhat misleading (startPanThrowAnimation). But it does not overshoot there is a rubberband-like animation only if the user tries to pan further when the content is already at the edge. I just reuse the position animation and corresponding position correction (based on requested geometry) in scaling.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>475999</commentid>
    <comment_count>18</comment_count>
      <attachid>109166</attachid>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2011-09-30 02:58:57 -0700</bug_when>
    <thetext>Comment on attachment 109166
proposed patch

(In reply to comment #14)
&gt; Andras, can we look at this together next week? Kenneth just explained to me the idea of animating between points instead of animating the geometries. We should try to re-use some code from Grob here.

Sure. I just uploaded the patch to get feedback. Although git diff made the patch hard to understand, I agree.

I basically use the geometry for position correction so the kinetic &quot;pan throw animation&quot;, which&apos;s intensity is proportional with scale and gesture trajectory does not overshoot. This position correction needs the geometry, which is &quot;dirty&quot; when a zoom animation is ongoing, so I pass the requested geometry basically for position correction.
But using the content position in the center of the viewport for animations should be a more practical approach, if I understand Kenneth&apos;s idea correctly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>476088</commentid>
    <comment_count>19</comment_count>
    <who name="Misha">mtutunik</who>
    <bug_when>2011-09-30 07:49:14 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; (In reply to comment #15)
&gt; &gt; Also, I think we don&apos;t need animateContentPositionIntoBoundariesIfNeeded() at all. This functionality should be done by the same code that does kinetic and overshoot (and which we currently missing :) ). Does anybody working on this?
&gt; &gt; 
&gt; 
&gt; My patch tries to mimic a kinetic movement although the naming, I realize, is somewhat misleading (startPanThrowAnimation). But it does not overshoot there is a rubberband-like animation only if the user tries to pan further when the content is already at the edge. I just reuse the position animation and corresponding position correction (based on requested geometry) in scaling.


Right, but your code does it only when user pan the page. It wouldn&apos;t work if user made a flick, would it? My point was that what is done in animateContentPositionIntoBoundariesIfNeeded() or in your startPanThrowAnimation() should be handled in the same code that handles the flick. Something like QScroller does.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>476098</commentid>
    <comment_count>20</comment_count>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2011-09-30 08:25:06 -0700</bug_when>
    <thetext>(In reply to comment #19)
&gt; (In reply to comment #17)
&gt; &gt; (In reply to comment #15)
&gt; &gt; &gt; Also, I think we don&apos;t need animateContentPositionIntoBoundariesIfNeeded() at all. This functionality should be done by the same code that does kinetic and overshoot (and which we currently missing :) ). Does anybody working on this?
&gt; &gt; &gt; 
&gt; &gt; 
&gt; &gt; My patch tries to mimic a kinetic movement although the naming, I realize, is somewhat misleading (startPanThrowAnimation). But it does not overshoot there is a rubberband-like animation only if the user tries to pan further when the content is already at the edge. I just reuse the position animation and corresponding position correction (based on requested geometry) in scaling.
&gt; 
&gt; 
&gt; Right, but your code does it only when user pan the page. It wouldn&apos;t work if user made a flick, would it? My point was that what is done in animateContentPositionIntoBoundariesIfNeeded() or in your startPanThrowAnimation() should be handled in the same code that handles the flick. Something like QScroller does.

It should work for a flick gesture too because for the ViewportInteractionEngine a flick is just a fast pan gesture so you get a long trajectory and you scroll fast through the page. So it is already handled by the same code but I might misunderstood your point.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>476366</commentid>
    <comment_count>21</comment_count>
    <who name="Misha">mtutunik</who>
    <bug_when>2011-09-30 16:01:11 -0700</bug_when>
    <thetext>(In reply to comment #20)
&gt; (In reply to comment #19)
&gt; &gt; (In reply to comment #17)
&gt; &gt; &gt; (In reply to comment #15)
&gt; &gt; &gt; &gt; Also, I think we don&apos;t need animateContentPositionIntoBoundariesIfNeeded() at all. This functionality should be done by the same code that does kinetic and overshoot (and which we currently missing :) ). Does anybody working on this?
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; My patch tries to mimic a kinetic movement although the naming, I realize, is somewhat misleading (startPanThrowAnimation). But it does not overshoot there is a rubberband-like animation only if the user tries to pan further when the content is already at the edge. I just reuse the position animation and corresponding position correction (based on requested geometry) in scaling.
&gt; &gt; 
&gt; &gt; 
&gt; &gt; Right, but your code does it only when user pan the page. It wouldn&apos;t work if user made a flick, would it? My point was that what is done in animateContentPositionIntoBoundariesIfNeeded() or in your startPanThrowAnimation() should be handled in the same code that handles the flick. Something like QScroller does.
&gt; 
&gt; It should work for a flick gesture too because for the ViewportInteractionEngine a flick is just a fast pan gesture so you get a long trajectory and you scroll fast through the page. So it is already handled by the same code but I might misunderstood your point.


Yes I see. At first I missed that it will do flick as well.
But would it be better to use some standard platform component to do kinetics?
We already have QScroller and QSGFlickable and now going to have third implementation? QSGFlickable doesn&apos;t have public API but QScroller does, although it has to be re-factored for Qt5.
Any thoughts/comments on this? I&apos;m asking it here because it might affect the way this patch is done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>476994</commentid>
    <comment_count>22</comment_count>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2011-10-03 08:42:36 -0700</bug_when>
    <thetext>(In reply to comment #21)
&gt; But would it be better to use some standard platform component to do kinetics?
&gt; We already have QScroller and QSGFlickable and now going to have third implementation? QSGFlickable doesn&apos;t have public API but QScroller does, although it has to be re-factored for Qt5.
&gt; Any thoughts/comments on this? I&apos;m asking it here because it might affect the way this patch is done.

The ViewportInteractionEngine is supposed to handle the animations either by means of predefined constrains or by some Qt / platform kinetics functionality. Since the mentioned functionality is not complete in Qt5 yet the plan is to use constrains for animations to clarify and incorporate the needed functionality into the underlying infrastructure.
Later on if the functionality is fully present in Qt5 / the underlying platform we can switch to that. But this is way out of scope for this particular bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489290</commentid>
    <comment_count>23</comment_count>
      <attachid>112177</attachid>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2011-10-24 06:00:58 -0700</bug_when>
    <thetext>Created attachment 112177
proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489303</commentid>
    <comment_count>24</comment_count>
      <attachid>112177</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2011-10-24 06:45:50 -0700</bug_when>
    <thetext>Comment on attachment 112177
proposed patch

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

&gt; Source/WebKit2/ChangeLog:9
&gt; +        QScroller also handles flick gestures and animates overshoot.

Not just overshoot?

&gt; Source/WebKit2/ChangeLog:10
&gt; +        If a pinch gesture ends the scale animation scales the content into boundaries

Missing comma here, which makes this hard to read.

If a pinch gesture ends, the scale animated will scale and reposition the content such that it is within valid boundaries. The content is by default animated such that the content position as seen in the center of the visible viewport stays in the center, if that does not mean that the content would be out of valid bounds.

&gt; Source/WebKit2/ChangeLog:14
&gt; +        Also simplify the ViewportUpdateGuard by having an integer counter instead of
&gt; +        the boolean to defer the update requests.

This patch also simplifies the View... by using reference counting instead of a boolean for defering update requests.

&gt; Source/WebKit2/UIProcess/qt/QtPanGestureRecognizer.cpp:40
&gt; +bool QtPanGestureRecognizer::recognize(const QTouchEvent* event, qint64 timestampMS)

Source/WebCore/dom/DOMTimeStamp.h

36 typedef unsigned long long DOMTimeStamp;
37 
38 inline DOMTimeStamp convertSecondsToDOMTimeStamp(double seconds)
39 {
40     return static_cast&lt;DOMTimeStamp&gt;(seconds * 1000.0);
41 }
42 
43 inline double convertDOMTimeStampToSeconds(DOMTimeStamp milliseconds)
44 {
45     return milliseconds / 1000.0;
46 }


DOMTimeStamp eventTimeMillis ?

&gt; Source/WebKit2/UIProcess/qt/QtPinchGestureRecognizer.cpp:99
&gt; +                m_viewportInteractionEngine-&gt;pinchGestureStarted(computeTouchCenter(point1, point2));

I dislike the name of that method (I know it is not yours)

computePinchCenter(finger1, finger2)?

&gt; Source/WebKit2/UIProcess/qt/QtTouchWebPageProxy.cpp:63
&gt; +        qint64 timestampMS = static_cast&lt;qint64&gt;(event.timestamp() * 1000);
&gt; +        m_panGestureRecognizer.recognize(event.nativeEvent(), timestampMS);

Here you could use the methods from DOMTimeStamp

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:29
&gt; +#include &lt;QScrollEvent&gt;
&gt; +#include &lt;QScrollPrepareEvent&gt;
&gt; +#include &lt;QScrollerProperties&gt;

Is that sorted correctly?

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:34
&gt; +static const int kScaleAnimationDuration = 400;

Millis?

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:51
&gt; +        ++viewportInteractionEngine-&gt;m_pendingUpdates;

I would add a () for clarity

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:-70
&gt; -        if (!wasUpdatingContent) {
&gt; -            if (previousPosition != viewportInteractionEngine-&gt;m_content-&gt;pos()
&gt; -                    || previousSize.width() != viewportInteractionEngine-&gt;m_content-&gt;width()
&gt; -                    || previousSize.height() != viewportInteractionEngine-&gt;m_content-&gt;height()
&gt; -                    || previousScale != viewportInteractionEngine-&gt;m_content-&gt;scale())
&gt; -                emit viewportInteractionEngine-&gt;viewportUpdateRequested();

Are we emitting now when nothing might have changed? I think it would make sense to have this as a separate change

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:56
&gt; +        --viewportInteractionEngine-&gt;m_pendingUpdates;

same here

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:58
&gt; +            emit viewportInteractionEngine-&gt;viewportTrajectoryVectorChanged(QPointF());

I think this line needs a comment

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:59
&gt; +            // We must notify the change so the client can rely on us for all change of geometry.

changes*

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:90
&gt; +void QtViewportInteractionEngine::updateVisibleRect(QVariant visibleRectVariant)

The type already makes it clear that it is a variant

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:92
&gt; +    ViewportUpdateGuard guard(this);

Add a newline after this, so make its purpose more clear

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:94
&gt; +    qreal scale = m_viewport-&gt;width() / visibleRect.width();

currentScale?

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:96
&gt; +    m_content-&gt;setScale(scale);
&gt; +    m_content-&gt;setPos(-visibleRect.topLeft() * scale);

Maybe add a 

inline void scaleInPoint(QSGItem*, qreal scale, QPointF inPoint).

On the other hand you could do as we are doing in Grob:

1053 QPointF WebViewport::positionAtTarget(const QPointF&amp; unscaledPosition, const QPointF&amp; viewportHotspot, qreal atAbsoluteScale, bool keepWithinBounds)
1054 {
1055     QPointF position = (unscaledPosition * atAbsoluteScale) - viewportHotspot;
1056 
1057     if (!keepWithinBounds)
1058         return position;
1059 
1060     QRectF visibleArea = visibleRect();
1061     QSizeF validSize = (viewportItem()-&gt;size() * (atAbsoluteScale / zoomScale())) - visibleArea.size();
1062 
1063     qreal x = qBound(visibleArea.x(), position.x(), validSize.width());
1064     qreal y = qBound(visibleArea.y(), position.y(), validSize.height());
1065 
1066     return QPointF(x, y);
1067 }

This does everything you need. It scaled a position into a hotspot given a scale. And it considers the bounds if needed (disregarded when pinch zooming)

Use it like this:


QPointF viewportHotspot = visibleCenter();
QPointF position = positionAtTarget(contentsPointInCenter, viewportHotspot, targetScale);

setPos(position);
setScale(targetScale);

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:108
&gt; +    case QAbstractAnimation::Running:
&gt; +        emit viewportTrajectoryVectorChanged(QPointF());
&gt; +        m_pinchViewportUpdateDeferrer = adoptPtr(new ViewportUpdateGuard(this));
&gt; +        break;

I guess this is a bit confusing

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:120
&gt; +        const QRectF contentRect = contentRectInViewportCoordinate(m_content, m_viewport);

coordinate*s*

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:124
&gt; +        // QScroller scrolls the content (the viewport moves in the direction of the input).
&gt; +        // To get a panning behaviour (eg. moving the content in the direction of the input)
&gt; +        // the coordinates need to be inverted and we need to set a position range for the inverted positions.

This can be simplified

// As we want to push the contents and not actually scroll it, we need to invert the positions here.

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:125
&gt; +        const QPointF contentPositionRangeTopLeft(qMin&lt;qreal&gt;(0, (contentRect.width() - viewportRect.width()) / 2), 0);

This is a bit difficult to understand

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:127
&gt; +        const QSizeF contentPositionRangeSize(qMax&lt;qreal&gt;(0, contentRect.width() - viewportRect.width())
&gt; +                                              , qMax&lt;qreal&gt;(0, contentRect.height() - viewportRect.height()));

I would write these out

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:136
&gt; +        QScrollEvent* scrollEvent = static_cast&lt;QScrollEvent *&gt;(event);

* placement!

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:139
&gt; +            ViewportUpdateGuard guard(this);

newline after the guard

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:161
&gt; +void QtViewportInteractionEngine::animateContentIntoBoundariesIfNeeded(int animationDuration)

Why do we need teh animationDuration argument. It is not something we want to change

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:168
&gt; +    contentScale = qBound(m_constraints.minimumScale, contentScale, m_constraints.maximumScale);

Please add the innerBoundedScale(...) and outerBoundedScale methods from grob for this. It is a lot more clear

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:189
&gt; +    QRectF viewportRect = m_viewport-&gt;boundingRect();
&gt; +    QPointF centerOfInterest = viewportRect.center();
&gt; +    QSizeF contentSize = m_content-&gt;boundingRect().size();
&gt; +    QPointF centerOnContent = m_content-&gt;mapFromItem(m_viewport, centerOfInterest);
&gt; +    QRectF scaledViewportRect(centerOnContent - centerOfInterest / contentScale, viewportRect.size() / contentScale);
&gt; +
&gt; +    if (scaledViewportRect.right() &gt; contentSize.width())
&gt; +        scaledViewportRect.moveLeft(contentSize.width() - scaledViewportRect.width());
&gt; +    if (scaledViewportRect.bottom() &gt; contentSize.height())
&gt; +        scaledViewportRect.moveTop(contentSize.height() - scaledViewportRect.height());
&gt; +
&gt; +    if (scaledViewportRect.width() &gt; contentSize.width())
&gt; +        scaledViewportRect.moveLeft((contentSize.width() - scaledViewportRect.width()) / 2);
&gt; +    else if (scaledViewportRect.x() &lt; 0)
&gt; +        scaledViewportRect.moveLeft(0);
&gt; +
&gt; +    if (scaledViewportRect.height() &gt; contentSize.height())
&gt; +        scaledViewportRect.moveTop(0);
&gt; +    else if (scaledViewportRect.y() &lt; 0)
&gt; +        scaledViewportRect.moveTop(0);

This must be possible to simplify. Look how smple it is in Grob:

 603     QPointF viewportHotspot = visibleCenter();
 604     QPointF pos = (viewportHotspot + position()) / currentScale;
 605 
 606     QPointF minOffset = viewportHotspot / boundedCurrentScale;
 607     QSizeF contentsSize = viewportItem()-&gt;boundingRect().size() / currentScale;
 608     QPointF maxOffset = QPointF(contentsSize.width(), contentsSize.height()) - minOffset;
 609     QPointF boundedPos;
 610     boundedPos.setX(qBound(minOffset.x(), pos.x(), maxOffset.x()));
 611     boundedPos.setY(qBound(minOffset.y(), pos.y(), maxOffset.y()));
 612 
 613     // Bounce back and center contents point in viewport center.
 614     if ((boundedCurrentScale != currentScale) || (boundedPos != pos)) {

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:191
&gt; +    QRectF currentViewportRectOnContent = m_viewport-&gt;mapRectToItem(m_content, viewportRect);

I don&apos;t get the variable name

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:198
&gt; +        m_scaleAnimation-&gt;setEasingCurve(QEasingCurve::OutCubic);

Shouldn&apos;t we use the one from the QScrollerProperties?

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:298
&gt; +    const QPointF movementOffset = pinchCenterInViewportCoordinate - m_lastPinchCenterInViewportCoordinate;

moveOffset. But isn&apos;t it more like the diffPosition

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:301
&gt; +    QPointF newPosition(m_content-&gt;pos() + movementOffset - scaleOffset);

use targetAtPosition

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h:118
&gt; +    QPointF m_lastPinchCenterInViewportCoordinate;

coordinate*s*</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489989</commentid>
    <comment_count>25</comment_count>
      <attachid>112327</attachid>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2011-10-25 06:11:29 -0700</bug_when>
    <thetext>Created attachment 112327
proposed patch addressing review comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489997</commentid>
    <comment_count>26</comment_count>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2011-10-25 06:28:47 -0700</bug_when>
    <thetext>(In reply to comment #24)
&gt; &gt; Source/WebKit2/ChangeLog:9
&gt; &gt; +        QScroller also handles flick gestures and animates overshoot.
&gt; 
&gt; Not just overshoot?

Also flick. Overshoot is at the edges of the boundaries.

ChangeLog issues fixed.

&gt; &gt; Source/WebKit2/UIProcess/qt/QtPanGestureRecognizer.cpp:40
&gt; &gt; +bool QtPanGestureRecognizer::recognize(const QTouchEvent* event, qint64 timestampMS)
&gt; 
&gt; Source/WebCore/dom/DOMTimeStamp.h

&gt; 
&gt; DOMTimeStamp eventTimeMillis ?
&gt; 
I do not see the point in converting to DOMTimeStamp and then back to milliseconds when we can convert it to milliseconds directly. This simplifies the code in the ViewportInteractionEngine.

&gt; &gt; Source/WebKit2/UIProcess/qt/QtPinchGestureRecognizer.cpp:99
&gt; &gt; +                m_viewportInteractionEngine-&gt;pinchGestureStarted(computeTouchCenter(point1, point2));
&gt; 
&gt; I dislike the name of that method (I know it is not yours)
&gt; computePinchCenter(finger1, finger2)?
This could be renamed in a follow-up.

&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:29
&gt; &gt; +#include &lt;QScrollEvent&gt;
&gt; &gt; +#include &lt;QScrollPrepareEvent&gt;
&gt; &gt; +#include &lt;QScrollerProperties&gt;
&gt; 
&gt; Is that sorted correctly?
Yes, it is.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:34
&gt; &gt; +static const int kScaleAnimationDuration = 400;
&gt; 
&gt; Millis?

Renamed to kScaleAnimationDurationMS.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:51
&gt; &gt; +        ++viewportInteractionEngine-&gt;m_pendingUpdates;
&gt; 
&gt; I would add a () for clarity
Done.

&gt; Are we emitting now when nothing might have changed? I think it would make sense to have this as a separate change
&gt; 
Reverted this part of the change.

&gt; I think this line needs a comment
Fixed.

&gt; The type already makes it clear that it is a variant
Fixed.

&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:96
&gt; &gt; +    m_content-&gt;setScale(scale);
&gt; &gt; +    m_content-&gt;setPos(-visibleRect.topLeft() * scale);
&gt; 
&gt; Maybe add a 
&gt; 
&gt; inline void scaleInPoint(QSGItem*, qreal scale, QPointF inPoint).
This kind of scaling is not used elsewhere, the codepath is used for the animation only, so having an inline function here seems to be pointless.
I added a comment, though, describing the process.

&gt; This can be simplified
&gt; 
&gt; // As we want to push the contents and not actually scroll it, we need to invert the positions here.
Done.

&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:125
&gt; &gt; +        const QPointF contentPositionRangeTopLeft(qMin&lt;qreal&gt;(0, (contentRect.width() - viewportRect.width()) / 2), 0);
&gt; 
&gt; This is a bit difficult to understand
&gt; 
&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:127
&gt; &gt; +        const QSizeF contentPositionRangeSize(qMax&lt;qreal&gt;(0, contentRect.width() - viewportRect.width())
&gt; &gt; +                                              , qMax&lt;qreal&gt;(0, contentRect.height() - viewportRect.height()));
&gt; 
&gt; I would write these out
Wrote them out.

&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:161
&gt; &gt; +void QtViewportInteractionEngine::animateContentIntoBoundariesIfNeeded(int animationDuration)
&gt; 
&gt; Why do we need teh animationDuration argument. It is not something we want to change
Was used for deciding whether to animate or apply the change immediately, changed to use the m_userInteractionFlags to decide this.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:168
&gt; &gt; +    contentScale = qBound(m_constraints.minimumScale, contentScale, m_constraints.maximumScale);
&gt; 
&gt; Please add the innerBoundedScale(...) and outerBoundedScale methods from grob for this. It is a lot more clear
Done.

&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:189
&gt; &gt; +    QRectF viewportRect = m_viewport-&gt;boundingRect();
&gt; &gt; +    QPointF centerOfInterest = viewportRect.center();
&gt; &gt; +    QSizeF contentSize = m_content-&gt;boundingRect().size();
&gt; &gt; +    QPointF centerOnContent = m_content-&gt;mapFromItem(m_viewport, centerOfInterest);
&gt; &gt; +    QRectF scaledViewportRect(centerOnContent - centerOfInterest / contentScale, viewportRect.size() / contentScale);
&gt; &gt; +
&gt; &gt; +    if (scaledViewportRect.right() &gt; contentSize.width())
&gt; &gt; +        scaledViewportRect.moveLeft(contentSize.width() - scaledViewportRect.width());
&gt; &gt; +    if (scaledViewportRect.bottom() &gt; contentSize.height())
&gt; &gt; +        scaledViewportRect.moveTop(contentSize.height() - scaledViewportRect.height());
&gt; &gt; +
&gt; &gt; +    if (scaledViewportRect.width() &gt; contentSize.width())
&gt; &gt; +        scaledViewportRect.moveLeft((contentSize.width() - scaledViewportRect.width()) / 2);
&gt; &gt; +    else if (scaledViewportRect.x() &lt; 0)
&gt; &gt; +        scaledViewportRect.moveLeft(0);
&gt; &gt; +
&gt; &gt; +    if (scaledViewportRect.height() &gt; contentSize.height())
&gt; &gt; +        scaledViewportRect.moveTop(0);
&gt; &gt; +    else if (scaledViewportRect.y() &lt; 0)
&gt; &gt; +        scaledViewportRect.moveTop(0);
&gt; 
&gt; This must be possible to simplify. Look how smple it is in Grob:
&gt; 
Simplified. Now QScroller and the animation uses the same function to calculate the boundaries (calculateBoundariesForScale).

&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:198
&gt; &gt; +        m_scaleAnimation-&gt;setEasingCurve(QEasingCurve::OutCubic);
&gt; 
&gt; Shouldn&apos;t we use the one from the QScrollerProperties?
The curve from QScrollerProperties is used by QSCroller for the kinetic deceleration after a flick gesture and not for the bounce-back (overshoot) at the edges, so we need a different curve here.
 
&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:298
&gt; &gt; +    const QPointF movementOffset = pinchCenterInViewportCoordinate - m_lastPinchCenterInViewportCoordinate;
&gt; 

&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:301
&gt; &gt; +    QPointF newPosition(m_content-&gt;pos() + movementOffset - scaleOffset);
&gt; 
&gt; use targetAtPosition
Simplified.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490017</commentid>
    <comment_count>27</comment_count>
      <attachid>112327</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2011-10-25 06:58:24 -0700</bug_when>
    <thetext>Comment on attachment 112327
proposed patch addressing review comments

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

&gt; Source/WebKit2/UIProcess/qt/QtPanGestureRecognizer.cpp:40
&gt; +bool QtPanGestureRecognizer::recognize(const QTouchEvent* event, qint64 timestampMS)

I still prefer the name eventTimestampMillis

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:34
&gt; +static const int kScaleAnimationDurationMS = 400;

Lets use Millis like the rest of webcore

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:52
&gt; +static inline qreal outerBoundedScale(QtViewportInteractionEngine::Constraints constraints, qreal scale)

Why not make it a member and remove the constraisn

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:57
&gt; +        return bindToScaleLimits(qBound(hardMin, scale, hardMax));

Are you sure these should be bounded

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:205
&gt; +    const QPointF contentPositionRangeTopLeft(qMin&lt;qreal&gt;(0, (horizontalOffset) / 2), 0);

(horizontalOffset) ? not really needing () :-)

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:224
&gt; +    QSizeF contentSize = m_content-&gt;boundingRect().size();

only used one place... no need for this

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:228
&gt; +    QPointF minOffset = positionBoundaries.topLeft();
&gt; +    QPointF maxOffset = positionBoundaries.bottomRight();

Better put these close to where they are being used

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:231
&gt; +    QPointF viewportHotspotOnContent = m_content-&gt;mapFromItem(m_viewport, viewportHotspot);
&gt; +    QPointF position = viewportHotspotOnContent - viewportHotspot / boundedScale;

I would just join these two

&gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h:94
&gt; +    QScroller* scroller() { return QScroller::scroller(this); }

ieck... that is a create method :/</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490021</commentid>
    <comment_count>28</comment_count>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2011-10-25 07:03:05 -0700</bug_when>
    <thetext>
&gt; &gt; DOMTimeStamp eventTimeMillis ?

it is a better variable name

&gt; I do not see the point in converting to DOMTimeStamp and then back to milliseconds when we can convert it to milliseconds directly. This simplifies the code in the ViewportInteractionEngine.

Clean API and it is uint64_t is a unsigned long long, plus you can use the nice conversion methods.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490043</commentid>
    <comment_count>29</comment_count>
      <attachid>112338</attachid>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2011-10-25 08:18:34 -0700</bug_when>
    <thetext>Created attachment 112338
proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490046</commentid>
    <comment_count>30</comment_count>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2011-10-25 08:21:44 -0700</bug_when>
    <thetext>(In reply to comment #27)
&gt; &gt; Source/WebKit2/UIProcess/qt/QtPanGestureRecognizer.cpp:40
&gt; &gt; +bool QtPanGestureRecognizer::recognize(const QTouchEvent* event, qint64 timestampMS)
&gt; 
&gt; I still prefer the name eventTimestampMillis
Renamed.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:34
&gt; &gt; +static const int kScaleAnimationDurationMS = 400;
&gt; 
&gt; Lets use Millis like the rest of webcore
Ditto.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:52
&gt; &gt; +static inline qreal outerBoundedScale(QtViewportInteractionEngine::Constraints constraints, qreal scale)
&gt; 
&gt; Why not make it a member and remove the constraisn
Done.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:57
&gt; &gt; +        return bindToScaleLimits(qBound(hardMin, scale, hardMax));
&gt; 
&gt; Are you sure these should be bounded
Yes. This is how it is done in grob, too.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:205
&gt; &gt; +    const QPointF contentPositionRangeTopLeft(qMin&lt;qreal&gt;(0, (horizontalOffset) / 2), 0);
&gt; 
&gt; (horizontalOffset) ? not really needing () :-)
&gt; 
&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:224
&gt; &gt; +    QSizeF contentSize = m_content-&gt;boundingRect().size();
&gt; 
&gt; only used one place... no need for this
Done.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:228
&gt; &gt; +    QPointF minOffset = positionBoundaries.topLeft();
&gt; &gt; +    QPointF maxOffset = positionBoundaries.bottomRight();
&gt; 
&gt; Better put these close to where they are being used
Done.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.cpp:231
&gt; &gt; +    QPointF viewportHotspotOnContent = m_content-&gt;mapFromItem(m_viewport, viewportHotspot);
&gt; &gt; +    QPointF position = viewportHotspotOnContent - viewportHotspot / boundedScale;
&gt; 
&gt; I would just join these two
Done.

&gt; 
&gt; &gt; Source/WebKit2/UIProcess/qt/QtViewportInteractionEngine.h:94
&gt; &gt; +    QScroller* scroller() { return QScroller::scroller(this); }
&gt; 
&gt; ieck... that is a create method :/
Added a comment that explains that the function creates a singleton.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490060</commentid>
    <comment_count>31</comment_count>
      <attachid>112338</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2011-10-25 09:03:34 -0700</bug_when>
    <thetext>Comment on attachment 112338
proposed patch

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

Great work!

Even if we later decide to not use QScroller, most of this code is reusable, so r=me

&gt; Source/WebKit2/UIProcess/qt/QtPinchGestureRecognizer.cpp:99
&gt; +                m_viewportInteractionEngine-&gt;pinchGestureStarted(computeTouchCenter(point1, point2));

I would like a follow up on this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490706</commentid>
    <comment_count>32</comment_count>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2011-10-26 02:48:42 -0700</bug_when>
    <thetext>Committed r98460: &lt;http://trac.webkit.org/changeset/98460&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490707</commentid>
    <comment_count>33</comment_count>
      <attachid>112338</attachid>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2011-10-26 02:49:23 -0700</bug_when>
    <thetext>Comment on attachment 112338
proposed patch

Clearing flags.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490778</commentid>
    <comment_count>34</comment_count>
    <who name="Csaba Osztrogonác">ossy</who>
    <bug_when>2011-10-26 06:12:25 -0700</bug_when>
    <thetext>Reopen, because it broke API tests:
- before your patch: 68 passed, 4 failed, 1 skipped
- after your patch: 46 passed, 5 failed, 0 skipped

Could you fix it or should we roll out or API test failing doesn&apos;t matter?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490782</commentid>
    <comment_count>35</comment_count>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2011-10-26 06:20:37 -0700</bug_when>
    <thetext>(In reply to comment #34)
&gt; Reopen, because it broke API tests:
&gt; - before your patch: 68 passed, 4 failed, 1 skipped
&gt; - after your patch: 46 passed, 5 failed, 0 skipped
&gt; 
&gt; Could you fix it or should we roll out or API test failing doesn&apos;t matter?

I&apos;m going to look into this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>493822</commentid>
    <comment_count>36</comment_count>
    <who name="Andras Becsi">abecsi</who>
    <bug_when>2011-11-01 02:53:49 -0700</bug_when>
    <thetext>Crashing API tests fixed in http://trac.webkit.org/changeset/98858.
Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>104891</attachid>
            <date>2011-08-23 12:39:51 -0700</date>
            <delta_ts>2011-09-29 09:16:35 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>66664.patch</filename>
            <type>text/plain</type>
            <size>16999</size>
            <attacher name="Benjamin Poulain">benjamin</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvcXRvdWNod2VicGFn
ZS5jcHAgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3F0b3VjaHdlYnBhZ2UuY3Bw
CmluZGV4IDYzYTk4MzAuLjg2MzRhY2YgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9BUEkvcXQvcXRvdWNod2VicGFnZS5jcHAKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0FQSS9xdC9xdG91Y2h3ZWJwYWdlLmNwcApAQCAtMTQ5LDE0ICsxNDksOSBAQCBRVG91Y2hX
ZWJQYWdlUHJpdmF0ZTo6UVRvdWNoV2ViUGFnZVByaXZhdGUoUVRvdWNoV2ViUGFnZSogdmlldykK
IHsKIH0KIAotdm9pZCBRVG91Y2hXZWJQYWdlUHJpdmF0ZTo6X3FfY29tbWl0U2NhbGVDaGFuZ2Uo
KQordm9pZCBRVG91Y2hXZWJQYWdlUHJpdmF0ZTo6X3FfY29tbWl0U2NhbGVDaGFuZ2UocXJlYWwg
Y29tbWl0dGVkU2NhbGUpCiB7Ci0gICAgY29tbWl0U2NhbGVDaGFuZ2UoKTsKLX0KLQotdm9pZCBR
VG91Y2hXZWJQYWdlUHJpdmF0ZTo6Y29tbWl0U2NhbGVDaGFuZ2UoKQotewotICAgIHBhZ2UtPnNl
dENvbnRlbnRzU2NhbGUocS0+c2NhbGUoKSk7CisgICAgcGFnZS0+c2V0Q29udGVudHNTY2FsZShj
b21taXR0ZWRTY2FsZSk7CiB9CiAKIHZvaWQgUVRvdWNoV2ViUGFnZVByaXZhdGU6OnNldFBhZ2Uo
UVRvdWNoV2ViUGFnZVByb3h5KiBwYWdlKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL0FQSS9xdC9xdG91Y2h3ZWJwYWdlLmggYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mv
QVBJL3F0L3F0b3VjaHdlYnBhZ2UuaAppbmRleCBlZmEwM2Q0Li40MzZiZjBlIDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3F0b3VjaHdlYnBhZ2UuaAorKysgYi9T
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3F0b3VjaHdlYnBhZ2UuaApAQCAtNzgsNyAr
NzgsNyBAQCBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB2b2lkIGdlb21ldHJ5Q2hhbmdlZChjb25z
dCBRUmVjdEYmLCBjb25zdCBRUmVjdEYmKTsKIAogcHJpdmF0ZToKLSAgICBRX1BSSVZBVEVfU0xP
VChkLCB2b2lkIF9xX2NvbW1pdFNjYWxlQ2hhbmdlKCkpOworICAgIFFfUFJJVkFURV9TTE9UKGQs
IHZvaWQgX3FfY29tbWl0U2NhbGVDaGFuZ2UocXJlYWwpKTsKIAogICAgIFFUb3VjaFdlYlBhZ2VQ
cml2YXRlKiBkOwogICAgIGZyaWVuZCBjbGFzcyBRVG91Y2hXZWJWaWV3UHJpdmF0ZTsKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvcXRvdWNod2VicGFnZV9wLmgg
Yi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3F0b3VjaHdlYnBhZ2VfcC5oCmluZGV4
IGVkMTdiMGMuLjE5MjNhYjIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9B
UEkvcXQvcXRvdWNod2VicGFnZV9wLmgKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQ
SS9xdC9xdG91Y2h3ZWJwYWdlX3AuaApAQCAtMzksNyArMzksNyBAQCBwdWJsaWM6CiAgICAgdm9p
ZCBzZXRQYWdlKFFUb3VjaFdlYlBhZ2VQcm94eSopOwogCiAgICAgdm9pZCBzZXRWaWV3cG9ydFJl
Y3QoY29uc3QgUVJlY3RGJik7Ci0gICAgdm9pZCBfcV9jb21taXRTY2FsZUNoYW5nZSgpOworICAg
IHZvaWQgX3FfY29tbWl0U2NhbGVDaGFuZ2UocXJlYWwpOwogICAgIHZvaWQgY29tbWl0U2NhbGVD
aGFuZ2UoKTsKIAogICAgIFFUb3VjaFdlYlBhZ2UqIGNvbnN0IHE7CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3F0b3VjaHdlYnZpZXcuY3BwIGIvU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL0FQSS9xdC9xdG91Y2h3ZWJ2aWV3LmNwcAppbmRleCBlOTVkYWJiLi5j
OWViMWZmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3F0b3Vj
aHdlYnZpZXcuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvcXRvdWNo
d2Vidmlldy5jcHAKQEAgLTM5LDggKzM5LDggQEAgUVRvdWNoV2ViVmlld1ByaXZhdGU6OlFUb3Vj
aFdlYlZpZXdQcml2YXRlKFFUb3VjaFdlYlZpZXcqIHEpCiAgICAgUVRvdWNoV2ViUGFnZVByaXZh
dGUqIGNvbnN0IHBhZ2VWaWV3UHJpdmF0ZSA9IHBhZ2VWaWV3LmRhdGEoKS0+ZDsKICAgICBwYWdl
Vmlld1ByaXZhdGUtPnNldFBhZ2UoJnBhZ2UpOwogCi0gICAgUU9iamVjdDo6Y29ubmVjdCgmaW50
ZXJhY3Rpb25FbmdpbmUsIFNJR05BTCh2aWV3cG9ydFVwZGF0ZVJlcXVlc3RlZCgpKSwgcSwgU0xP
VChfcV92aWV3cG9ydFJlY3RVcGRhdGVkKCkpKTsKLSAgICBRT2JqZWN0Ojpjb25uZWN0KCZpbnRl
cmFjdGlvbkVuZ2luZSwgU0lHTkFMKGNvbW1pdFNjYWxlQ2hhbmdlKCkpLCBwYWdlVmlldy5kYXRh
KCksIFNMT1QoX3FfY29tbWl0U2NhbGVDaGFuZ2UoKSkpOworICAgIFFPYmplY3Q6OmNvbm5lY3Qo
JmludGVyYWN0aW9uRW5naW5lLCBTSUdOQUwodmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQoY29uc3Qg
UVJlY3RGJikpLCBxLCBTTE9UKF9xX3ZpZXdwb3J0UmVjdFVwZGF0ZWQoY29uc3QgUVJlY3RGJikp
KTsKKyAgICBRT2JqZWN0Ojpjb25uZWN0KCZpbnRlcmFjdGlvbkVuZ2luZSwgU0lHTkFMKGNvbW1p
dFNjYWxlQ2hhbmdlKHFyZWFsKSksIHBhZ2VWaWV3LmRhdGEoKSwgU0xPVChfcV9jb21taXRTY2Fs
ZUNoYW5nZShxcmVhbCkpKTsKIH0KIAogdm9pZCBRVG91Y2hXZWJWaWV3UHJpdmF0ZTo6bG9hZERp
ZENvbW1pdCgpCkBAIC00OCwxMSArNDgsMTAgQEAgdm9pZCBRVG91Y2hXZWJWaWV3UHJpdmF0ZTo6
bG9hZERpZENvbW1pdCgpCiAgICAgaW50ZXJhY3Rpb25FbmdpbmUucmVzZXQoKTsKIH0KIAotdm9p
ZCBRVG91Y2hXZWJWaWV3UHJpdmF0ZTo6X3Ffdmlld3BvcnRSZWN0VXBkYXRlZCgpCit2b2lkIFFU
b3VjaFdlYlZpZXdQcml2YXRlOjpfcV92aWV3cG9ydFJlY3RVcGRhdGVkKGNvbnN0IFFSZWN0RiYg
cmVjdCkKIHsKICAgICBRVG91Y2hXZWJQYWdlUHJpdmF0ZSogY29uc3QgcGFnZVZpZXdQcml2YXRl
ID0gcGFnZVZpZXcuZGF0YSgpLT5kOwotICAgIGNvbnN0IFFSZWN0RiB2aWV3cG9ydFJlY3RJblBh
Z2VWaWV3Q29vcmRpbmF0ZSA9IHEtPm1hcFJlY3RUb0l0ZW0ocGFnZVZpZXcuZGF0YSgpLCBxLT5i
b3VuZGluZ1JlY3QoKSk7Ci0gICAgcGFnZVZpZXdQcml2YXRlLT5zZXRWaWV3cG9ydFJlY3Qodmll
d3BvcnRSZWN0SW5QYWdlVmlld0Nvb3JkaW5hdGUpOworICAgIHBhZ2VWaWV3UHJpdmF0ZS0+c2V0
Vmlld3BvcnRSZWN0KHJlY3QpOwogfQogCiB2b2lkIFFUb3VjaFdlYlZpZXdQcml2YXRlOjp1cGRh
dGVWaWV3cG9ydENvbnN0cmFpbnRzKCkKQEAgLTEwNyw3ICsxMDYsOCBAQCB2b2lkIFFUb3VjaFdl
YlZpZXc6Omdlb21ldHJ5Q2hhbmdlZChjb25zdCBRUmVjdEYmIG5ld0dlb21ldHJ5LCBjb25zdCBR
UmVjdEYmIG9sZAogICAgIFFTR0l0ZW06Omdlb21ldHJ5Q2hhbmdlZChuZXdHZW9tZXRyeSwgb2xk
R2VvbWV0cnkpOwogICAgIGlmIChuZXdHZW9tZXRyeS5zaXplKCkgIT0gb2xkR2VvbWV0cnkuc2l6
ZSgpKSB7CiAgICAgICAgIGQtPnVwZGF0ZVZpZXdwb3J0Q29uc3RyYWludHMoKTsKLSAgICAgICAg
ZC0+X3Ffdmlld3BvcnRSZWN0VXBkYXRlZCgpOworICAgICAgICBjb25zdCBRUmVjdEYgdmlld3Bv
cnRSZWN0SW5QYWdlVmlld0Nvb3JkaW5hdGUgPSBtYXBSZWN0VG9JdGVtKGQtPnBhZ2VWaWV3LmRh
dGEoKSwgYm91bmRpbmdSZWN0KCkpOworICAgICAgICBkLT5fcV92aWV3cG9ydFJlY3RVcGRhdGVk
KHZpZXdwb3J0UmVjdEluUGFnZVZpZXdDb29yZGluYXRlKTsKICAgICB9CiB9CiAKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvcXRvdWNod2Vidmlldy5oIGIvU291
cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9xdC9xdG91Y2h3ZWJ2aWV3LmgKaW5kZXggNzA2MDAy
NS4uODFhOWMzNSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9xdC9x
dG91Y2h3ZWJ2aWV3LmgKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9xdC9xdG91
Y2h3ZWJ2aWV3LmgKQEAgLTQ3LDcgKzQ3LDcgQEAgcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgdm9p
ZCBnZW9tZXRyeUNoYW5nZWQoY29uc3QgUVJlY3RGJiwgY29uc3QgUVJlY3RGJik7CiAKIHByaXZh
dGU6Ci0gICAgUV9QUklWQVRFX1NMT1QoZCwgdm9pZCBfcV92aWV3cG9ydFJlY3RVcGRhdGVkKCkp
OworICAgIFFfUFJJVkFURV9TTE9UKGQsIHZvaWQgX3Ffdmlld3BvcnRSZWN0VXBkYXRlZChjb25z
dCBRUmVjdEYmKSk7CiAKICAgICBmcmllbmQgY2xhc3MgV2ViS2l0OjpUb3VjaFZpZXdJbnRlcmZh
Y2U7CiAgICAgUVRvdWNoV2ViVmlld1ByaXZhdGUgKmQ7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3F0b3VjaHdlYnZpZXdfcC5oIGIvU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL0FQSS9xdC9xdG91Y2h3ZWJ2aWV3X3AuaAppbmRleCA3MjAxZDlmLi5lOTVmNzhl
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3F0b3VjaHdlYnZp
ZXdfcC5oCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvcXRvdWNod2Vidmll
d19wLmgKQEAgLTM1LDcgKzM1LDcgQEAgcHVibGljOgogICAgIFFUb3VjaFdlYlZpZXdQcml2YXRl
KFFUb3VjaFdlYlZpZXcqIHEpOwogCiAgICAgdm9pZCBsb2FkRGlkQ29tbWl0KCk7Ci0gICAgdm9p
ZCBfcV92aWV3cG9ydFJlY3RVcGRhdGVkKCk7CisgICAgdm9pZCBfcV92aWV3cG9ydFJlY3RVcGRh
dGVkKGNvbnN0IFFSZWN0RiYpOwogICAgIHZvaWQgdXBkYXRlVmlld3BvcnRDb25zdHJhaW50cygp
OwogCiAgICAgdm9pZCBzZXRWaWV3cG9ydEFyZ3VtZW50cyhjb25zdCBXZWJDb3JlOjpWaWV3cG9y
dEFyZ3VtZW50cyYgYXJncyk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mv
cXQvVmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS5jcHAgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvcXQvVmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS5jcHAKaW5kZXggZjQxMTUxNC4uNjAxZjQ5
OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1ZpZXdwb3J0SW50ZXJh
Y3Rpb25FbmdpbmUuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9WaWV3cG9y
dEludGVyYWN0aW9uRW5naW5lLmNwcApAQCAtMjUsNiArMjUsMjMgQEAKIAogbmFtZXNwYWNlIFdl
YktpdCB7CiAKK2NvbnN0IGludCBhbmltYXRpb25EdXJhdGlvbiA9IDQwMDsKKworZW51bSBQb3Np
dGlvbkFuaW1hdGlvbkluZGV4IHsKKyAgICBYUG9zaXRpb25BbmltYXRpb24gPSAwLAorICAgIFlQ
b3NpdGlvbkFuaW1hdGlvbiA9IDEKK307CisKK3N0YXRpYyBpbmxpbmUgUVByb3BlcnR5QW5pbWF0
aW9uKiBnZXRYUG9zaXRpb25BbmltYXRpb24oY29uc3QgUVBhcmFsbGVsQW5pbWF0aW9uR3JvdXAm
IGFuaW1hdGlvbkdyb3VwKQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxRUHJvcGVydHlBbmlt
YXRpb24qPihhbmltYXRpb25Hcm91cC5hbmltYXRpb25BdChYUG9zaXRpb25BbmltYXRpb24pKTsK
K30KKworc3RhdGljIGlubGluZSBRUHJvcGVydHlBbmltYXRpb24qIGdldFlQb3NpdGlvbkFuaW1h
dGlvbihjb25zdCBRUGFyYWxsZWxBbmltYXRpb25Hcm91cCYgYW5pbWF0aW9uR3JvdXApCit7Cisg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PFFQcm9wZXJ0eUFuaW1hdGlvbio+KGFuaW1hdGlvbkdyb3Vw
LmFuaW1hdGlvbkF0KFlQb3NpdGlvbkFuaW1hdGlvbikpOworfQorCiBzdGF0aWMgaW5saW5lIFFS
ZWN0RiB2aXNpYmxlUmVjdEluQ29udGVudENvb3JkaW5hdGUoY29uc3QgUVNHSXRlbSogY29udGVu
dCwgY29uc3QgUVNHSXRlbSogdmlld3BvcnQpCiB7CiAgICAgY29uc3QgUVJlY3RGIHZpZXdwb3J0
SW5Db250ZW50Q29vcmRpbmF0ZSA9IGNvbnRlbnQtPm1hcFJlY3RGcm9tSXRlbSh2aWV3cG9ydCwg
dmlld3BvcnQtPmJvdW5kaW5nUmVjdCgpKTsKQEAgLTQxLDQ4ICs1OCw0NSBAQCBzdGF0aWMgaW5s
aW5lIFFSZWN0RiBjb250ZW50UmVjdEluVmlld3BvcnRDb29yZGluYXRlKGNvbnN0IFFTR0l0ZW0q
IGNvbnRlbnQsIGNvbgogLy8gU2luY2Ugd2UgbWFuYWdlIHRob3NlIGRpZmZlcmVudGx5LCB3ZSBk
byBub3Qgd2FudCB0byByZXNwb25kCiAvLyB0byB0aGVtIHdoZW4gd2UgYXJlIHRoZSBvbmUgY2hh
bmdpbmcgdGhlIGNvbnRlbnQuCiAvLwotLy8gVGhlIGd1YXJkIG1ha2Ugc3VyZSB0aGUgc2lnbmFs
IHZpZXdwb3J0VXBkYXRlUmVxdWVzdGVkKCkgaXMgc2VudCBpZiBuZWNlc3NhcnkuCi0vLwogLy8g
VGhlIHB1YmxpYyBtZXRob2RzIHNob3VsZCBjcmVhdGUgdGhlIGd1YXJkIGlmIHRoZXkgbWlnaHQg
dXBkYXRlIGNvbnRlbnQuCiBjbGFzcyBWaWV3cG9ydFVwZGF0ZUd1YXJkIHsKIHB1YmxpYzoKICAg
ICBWaWV3cG9ydFVwZGF0ZUd1YXJkKFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUqIHZpZXdwb3J0
SW50ZXJhY3Rpb25FbmdpbmUpCiAgICAgICAgIDogdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZSh2
aWV3cG9ydEludGVyYWN0aW9uRW5naW5lKQogICAgICAgICAsIHdhc1VwZGF0aW5nQ29udGVudCh2
aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLT5tX2lzVXBkYXRpbmdDb250ZW50KQotICAgICAgICAs
IHByZXZpb3VzUG9zaXRpb24odmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+bV9jb250ZW50LT5w
b3MoKSkKLSAgICAgICAgLCBwcmV2aW91c1NpemUodmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+
bV9jb250ZW50LT53aWR0aCgpLCB2aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLT5tX2NvbnRlbnQt
PmhlaWdodCgpKQotICAgICAgICAsIHByZXZpb3VzU2NhbGUodmlld3BvcnRJbnRlcmFjdGlvbkVu
Z2luZS0+bV9jb250ZW50LT5zY2FsZSgpKQogICAgIHsKICAgICAgICAgdmlld3BvcnRJbnRlcmFj
dGlvbkVuZ2luZS0+bV9pc1VwZGF0aW5nQ29udGVudCA9IHRydWU7CiAgICAgfQogCiAgICAgflZp
ZXdwb3J0VXBkYXRlR3VhcmQoKQogICAgIHsKLSAgICAgICAgaWYgKCF3YXNVcGRhdGluZ0NvbnRl
bnQpIHsKLSAgICAgICAgICAgIGlmIChwcmV2aW91c1Bvc2l0aW9uICE9IHZpZXdwb3J0SW50ZXJh
Y3Rpb25FbmdpbmUtPm1fY29udGVudC0+cG9zKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgcHJl
dmlvdXNTaXplLndpZHRoKCkgIT0gdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+bV9jb250ZW50
LT53aWR0aCgpCi0gICAgICAgICAgICAgICAgICAgIHx8IHByZXZpb3VzU2l6ZS5oZWlnaHQoKSAh
PSB2aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLT5tX2NvbnRlbnQtPmhlaWdodCgpCi0gICAgICAg
ICAgICAgICAgICAgIHx8IHByZXZpb3VzU2NhbGUgIT0gdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2lu
ZS0+bV9jb250ZW50LT5zY2FsZSgpKQotICAgICAgICAgICAgICAgIGVtaXQgdmlld3BvcnRJbnRl
cmFjdGlvbkVuZ2luZS0+dmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQoKTsKLSAgICAgICAgfQogICAg
ICAgICB2aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLT5tX2lzVXBkYXRpbmdDb250ZW50ID0gd2Fz
VXBkYXRpbmdDb250ZW50OwogICAgIH0KIAogcHJpdmF0ZToKICAgICBWaWV3cG9ydEludGVyYWN0
aW9uRW5naW5lKiBjb25zdCB2aWV3cG9ydEludGVyYWN0aW9uRW5naW5lOwotICAgIGNvbnN0IGJv
b2wgd2FzVXBkYXRpbmdDb250ZW50OwotICAgIGNvbnN0IFFQb2ludEYgcHJldmlvdXNQb3NpdGlv
bjsKLSAgICBjb25zdCBRU2l6ZUYgcHJldmlvdXNTaXplOwotICAgIGNvbnN0IHFyZWFsIHByZXZp
b3VzU2NhbGU7CisgICAgYm9vbCB3YXNVcGRhdGluZ0NvbnRlbnQ7CiB9OwogCiBWaWV3cG9ydElu
dGVyYWN0aW9uRW5naW5lOjpWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lKGNvbnN0IFFTR0l0ZW0q
IHZpZXdwb3J0LCBRU0dJdGVtKiBjb250ZW50KQogICAgIDogbV92aWV3cG9ydCh2aWV3cG9ydCkK
ICAgICAsIG1fY29udGVudChjb250ZW50KQogICAgICwgbV9pc1VwZGF0aW5nQ29udGVudChmYWxz
ZSkKKyAgICAsIG1fc2NhbGVBbmltYXRpb24obV9jb250ZW50LCAic2NhbGUiLCB0aGlzKQorICAg
ICwgbV9wb3NpdGlvbkFuaW1hdGlvbih0aGlzKQogICAgICwgbV9waW5jaFN0YXJ0U2NhbGUoMS5m
KQogewogICAgIHJlc2V0KCk7CisKKyAgICBtX3NjYWxlQW5pbWF0aW9uLnNldER1cmF0aW9uKGFu
aW1hdGlvbkR1cmF0aW9uKTsKKworICAgIFFQcm9wZXJ0eUFuaW1hdGlvbiogY29uc3QgeEFuaW1h
dGlvbiA9IG5ldyBRUHJvcGVydHlBbmltYXRpb24obV9jb250ZW50LCAieCIsIHRoaXMpOworICAg
IG1fcG9zaXRpb25BbmltYXRpb24uaW5zZXJ0QW5pbWF0aW9uKFhQb3NpdGlvbkFuaW1hdGlvbiwg
eEFuaW1hdGlvbik7CisgICAgeEFuaW1hdGlvbi0+c2V0RHVyYXRpb24oYW5pbWF0aW9uRHVyYXRp
b24pOworICAgIFFQcm9wZXJ0eUFuaW1hdGlvbiogY29uc3QgeUFuaW1hdGlvbiA9IG5ldyBRUHJv
cGVydHlBbmltYXRpb24obV9jb250ZW50LCAieSIsIHRoaXMpOworICAgIG1fcG9zaXRpb25Bbmlt
YXRpb24uaW5zZXJ0QW5pbWF0aW9uKFlQb3NpdGlvbkFuaW1hdGlvbiwgeUFuaW1hdGlvbik7Cisg
ICAgeUFuaW1hdGlvbi0+c2V0RHVyYXRpb24oYW5pbWF0aW9uRHVyYXRpb24pOworCiAgICAgY29u
bmVjdChtX2NvbnRlbnQsIFNJR05BTCh4Q2hhbmdlZCgpKSwgdGhpcywgU0xPVChjb250ZW50R2Vv
bWV0cnlDaGFuZ2VkKCkpLCBRdDo6RGlyZWN0Q29ubmVjdGlvbik7CiAgICAgY29ubmVjdChtX2Nv
bnRlbnQsIFNJR05BTCh5Q2hhbmdlZCgpKSwgdGhpcywgU0xPVChjb250ZW50R2VvbWV0cnlDaGFu
Z2VkKCkpLCBRdDo6RGlyZWN0Q29ubmVjdGlvbik7CiAgICAgY29ubmVjdChtX2NvbnRlbnQsIFNJ
R05BTCh3aWR0aENoYW5nZWQoKSksIHRoaXMsIFNMT1QoY29udGVudEdlb21ldHJ5Q2hhbmdlZCgp
KSwgUXQ6OkRpcmVjdENvbm5lY3Rpb24pOwpAQCAtMTE3LDE1ICsxMzEsMTYgQEAgdm9pZCBWaWV3
cG9ydEludGVyYWN0aW9uRW5naW5lOjpzZXRDb25zdHJhaW50cyhjb25zdCBDb25zdHJhaW50cyYg
Y29uc3RyYWludHMpCiAgICAgICAgIG1fY29uc3RyYWludHMgPSBjb25zdHJhaW50czsKICAgICAg
ICAgdXBkYXRlQ29udGVudElmTmVlZGVkKCk7CiAgICAgfQotICAgIGlmIChtX2NvbnRlbnQtPnNj
YWxlKCkgIT0gcHJldmlvdXNTY2FsZSkKLSAgICAgICAgZW1pdCBjb21taXRTY2FsZUNoYW5nZSgp
OworICAgIGNvbnN0IHFyZWFsIG5ld1NjYWxlID0gbV9jb250ZW50LT5zY2FsZSgpOworICAgIGlm
IChuZXdTY2FsZSAhPSBwcmV2aW91c1NjYWxlKQorICAgICAgICBlbWl0IGNvbW1pdFNjYWxlQ2hh
bmdlKG5ld1NjYWxlKTsKIH0KIAogdm9pZCBWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpwYW5H
ZXN0dXJlU3RhcnRlZCgpCiB7CiAgICAgLy8gRklYTUU6IHN1c3BlbmQgdGhlIFdlYiBlbmdpbmUg
KHN0b3AgYW5pbWF0ZWQgR0lGLCBldGMpLgotICAgIC8vIEZJWE1FOiBpbml0aWFsaXplIHBoeXNp
Y3MgZm9yIHBhbm5pbmcgKHN0b3AgYW5pbWF0aW9uLCBldGMpLgogICAgIG1fdXNlckludGVyYWN0
aW9uRmxhZ3MgfD0gVXNlckhhc01vdmVkQ29udGVudDsKKyAgICBzdG9wQW5pbWF0aW9ucygpOwog
fQogCiB2b2lkIFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBhbkdlc3R1cmVSZXF1ZXN0VXBk
YXRlKHFyZWFsIGRlbHRhWCwgcXJlYWwgZGVsdGFZKQpAQCAtMTU2LDYgKzE3MSw3IEBAIHZvaWQg
Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6cGluY2hHZXN0dXJlU3RhcnRlZCgpCiAgICAgaWYg
KCFtX2NvbnN0cmFpbnRzLmlzVXNlclNjYWxhYmxlKQogICAgICAgICByZXR1cm47CiAKKyAgICBz
dG9wQW5pbWF0aW9ucygpOwogICAgIG1fdXNlckludGVyYWN0aW9uRmxhZ3MgfD0gVXNlckhhc1Nj
YWxlZENvbnRlbnQ7CiAgICAgbV91c2VySW50ZXJhY3Rpb25GbGFncyB8PSBVc2VySGFzTW92ZWRD
b250ZW50OwogICAgIG1fcGluY2hTdGFydFNjYWxlID0gbV9jb250ZW50LT5zY2FsZSgpOwpAQCAt
MTg3LDggKzIwMywxMiBAQCB2b2lkIFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2Vz
dHVyZUVuZGVkKCkKICAgICAgICAgLy8gRklYTUU6IHJlc3VtZSB0aGUgZW5naW5lIGFmdGVyIHRo
ZSBhbmltYXRpb24uCiAgICAgICAgIGFuaW1hdGVDb250ZW50SW50b0JvdW5kYXJpZXNJZk5lZWRl
ZCgpOwogICAgIH0KLSAgICBpZiAobV9waW5jaFN0YXJ0U2NhbGUgIT0gbV9jb250ZW50LT5zY2Fs
ZSgpKQotICAgICAgICBlbWl0IGNvbW1pdFNjYWxlQ2hhbmdlKCk7Cit9CisKK3ZvaWQgVmlld3Bv
cnRJbnRlcmFjdGlvbkVuZ2luZTo6ZW1pdENvbnRlbnRHZW9tZXRyeUNoYW5nZWRXaXRoQ3VycmVu
dEdlb21ldHJ5KCkKK3sKKyAgICBjb25zdCBRUmVjdEYgdmlld3BvcnRSZWN0SW5QYWdlVmlld0Nv
b3JkaW5hdGUgPSBtX3ZpZXdwb3J0LT5tYXBSZWN0VG9JdGVtKG1fY29udGVudCwgbV92aWV3cG9y
dC0+Ym91bmRpbmdSZWN0KCkpOworICAgIGVtaXQgdmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQodmll
d3BvcnRSZWN0SW5QYWdlVmlld0Nvb3JkaW5hdGUpOwogfQogCiB2b2lkIFZpZXdwb3J0SW50ZXJh
Y3Rpb25FbmdpbmU6OmNvbnRlbnRHZW9tZXRyeUNoYW5nZWQoKQpAQCAtMTk2LDExICsyMTYsMTQg
QEAgdm9pZCBWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpjb250ZW50R2VvbWV0cnlDaGFuZ2Vk
KCkKICAgICBpZiAobV9pc1VwZGF0aW5nQ29udGVudCkKICAgICAgICAgcmV0dXJuOwogCisgICAg
aWYgKG1fcG9zaXRpb25BbmltYXRpb24uc3RhdGUoKSA9PSBRQWJzdHJhY3RBbmltYXRpb246OlJ1
bm5pbmcpCisgICAgICAgIHJldHVybjsKKwogICAgIFZpZXdwb3J0VXBkYXRlR3VhcmQgZ3VhcmQo
dGhpcyk7CiAgICAgdXBkYXRlQ29udGVudElmTmVlZGVkKCk7CiAKICAgICAvLyBXZSBtdXN0IG5v
dGlmeSB0aGUgY2hhbmdlIHNvIHRoZSBjbGllbnQgY2FuIHJlbHkgb24gdXMgZm9yIGFsbCBjaGFu
Z2Ugb2YgR2VvbWV0cnkuCi0gICAgZW1pdCB2aWV3cG9ydFVwZGF0ZVJlcXVlc3RlZCgpOworICAg
IGVtaXRDb250ZW50R2VvbWV0cnlDaGFuZ2VkV2l0aEN1cnJlbnRHZW9tZXRyeSgpOwogfQogCiB2
b2lkIFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OmNvbnRlbnRTY2FsZUNoYW5nZWQoKQpAQCAt
MjA4LDEyICsyMzEsMTQgQEAgdm9pZCBWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpjb250ZW50
U2NhbGVDaGFuZ2VkKCkKICAgICBpZiAobV9pc1VwZGF0aW5nQ29udGVudCkKICAgICAgICAgcmV0
dXJuOwogCisgICAgaWYgKG1fc2NhbGVBbmltYXRpb24uc3RhdGUoKSA9PSBRQWJzdHJhY3RBbmlt
YXRpb246OlJ1bm5pbmcpCisgICAgICAgIHJldHVybjsKKwogICAgIFZpZXdwb3J0VXBkYXRlR3Vh
cmQgZ3VhcmQodGhpcyk7CiAgICAgdXBkYXRlQ29udGVudElmTmVlZGVkKCk7CiAKICAgICAvLyBX
ZSBtdXN0IG5vdGlmeSB0aGUgY2hhbmdlIHNvIHRoZSBjbGllbnQgY2FuIHJlbHkgb24gdXMgZm9y
IGFsbCBjaGFuZ2Ugb2YgR2VvbWV0cnkuCi0gICAgZW1pdCB2aWV3cG9ydFVwZGF0ZVJlcXVlc3Rl
ZCgpOwotICAgIGVtaXQgY29tbWl0U2NhbGVDaGFuZ2UoKTsKKyAgICBlbWl0Q29udGVudEdlb21l
dHJ5Q2hhbmdlZFdpdGhDdXJyZW50R2VvbWV0cnkoKTsKIH0KIAogdm9pZCBWaWV3cG9ydEludGVy
YWN0aW9uRW5naW5lOjp1cGRhdGVDb250ZW50SWZOZWVkZWQoKQpAQCAtMjQ4LDE1ICsyNzMsMzkg
QEAgdm9pZCBWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjp1cGRhdGVDb250ZW50UG9zaXRpb25J
Zk5lZWRlZCgpCiAgICAgLy8gRklYTUU6IGlmIHRoZSBpdGVtIGNhbm5vdCBiZSBmdWxseSBpbiB2
aWV3cG9ydCwgYW5kIGlzIG5vdCBjb3ZlcmluZyB0aGUgdmlld3BvcnQsIHB1c2ggaXQgYmFjayBp
biB2aWV3CiB9CiAKLXZvaWQgVmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6YW5pbWF0ZUNvbnRl
bnRJbnRvQm91bmRhcmllc0lmTmVlZGVkKCkKK3ZvaWQgVmlld3BvcnRJbnRlcmFjdGlvbkVuZ2lu
ZTo6c3RvcEFuaW1hdGlvbnMoKQogewotICAgIGFuaW1hdGVDb250ZW50U2NhbGVJbnRvQm91bmRh
cmllc0lmTmVlZGVkKCk7Ci0gICAgYW5pbWF0ZUNvbnRlbnRQb3NpdGlvbkludG9Cb3VuZGFyaWVz
SWZOZWVkZWQoKTsKKyAgICBtX3Bvc2l0aW9uQW5pbWF0aW9uLnN0b3AoKTsKKyAgICBtX3NjYWxl
QW5pbWF0aW9uLnN0b3AoKTsKIH0KIAotdm9pZCBWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjph
bmltYXRlQ29udGVudFBvc2l0aW9uSW50b0JvdW5kYXJpZXNJZk5lZWRlZCgpCit2b2lkIFZpZXdw
b3J0SW50ZXJhY3Rpb25FbmdpbmU6OmFuaW1hdGVDb250ZW50SW50b0JvdW5kYXJpZXNJZk5lZWRl
ZCgpCiB7Ci0gICAgY29uc3QgUVJlY3RGIGNvbnRlbnRHZW9tZXRyeSA9IG1fdmlld3BvcnQtPm1h
cFJlY3RGcm9tSXRlbShtX2NvbnRlbnQsIG1fY29udGVudC0+Ym91bmRpbmdSZWN0KCkpOworICAg
IFFSZWN0RiBjb250ZW50R2VvbWV0cnkgPSBtX3ZpZXdwb3J0LT5tYXBSZWN0RnJvbUl0ZW0obV9j
b250ZW50LCBtX2NvbnRlbnQtPmJvdW5kaW5nUmVjdCgpKTsKKworICAgIGNvbnN0IHFyZWFsIGN1
cnJlbnRTY2FsZSA9IG1fY29udGVudC0+c2NhbGUoKTsKKyAgICBjb25zdCBRUG9pbnRGIG9yaWdp
bmFsUG9zaXRpb24gPSBtX2NvbnRlbnQtPnBvcygpOworCisgICAgY29uc3QgcXJlYWwgYm91bmRl
ZFNjYWxlID0gcUJvdW5kKG1fY29uc3RyYWludHMubWluaW11bVNjYWxlLCBjdXJyZW50U2NhbGUs
IG1fY29uc3RyYWludHMubWF4aW11bVNjYWxlKTsKKyAgICBlbWl0IGNvbW1pdFNjYWxlQ2hhbmdl
KGJvdW5kZWRTY2FsZSk7CisgICAgaWYgKGN1cnJlbnRTY2FsZSAhPSBib3VuZGVkU2NhbGUpIHsK
KyAgICAgICAgLy8gU2NhbGUgdGhlIGNvbnRlbnQgdG8gdGhlIGZpbmFsIGlkZWFsIHBvc2l0aW9u
LgorICAgICAgICBjb25zdCBRUG9pbnRGIGNlbnRlck9mSW50ZXJlc3QgPSB2aXNpYmxlUmVjdElu
Q29udGVudENvb3JkaW5hdGUobV9jb250ZW50LCBtX3ZpZXdwb3J0KS5jZW50ZXIoKTsKKyAgICAg
ICAgc2NhbGVDb250ZW50KGNlbnRlck9mSW50ZXJlc3QsIGJvdW5kZWRTY2FsZSk7CisKKyAgICAg
ICAgLy8gR2V0IHRoYXQgZmluYWwgc2NhbGVkIGdlb21ldHJ5LgorICAgICAgICBjb250ZW50R2Vv
bWV0cnkgPSBtX3ZpZXdwb3J0LT5tYXBSZWN0RnJvbUl0ZW0obV9jb250ZW50LCBtX2NvbnRlbnQt
PmJvdW5kaW5nUmVjdCgpKTsKKworICAgICAgICAvLyBSZXZlcnQgdGhlIGNoYW5nZSBpbiBvcmRl
ciB0byBhbmltYXRlZCBib3RoIHRoZSBzY2FsZSBhbmQgcG9zaXRpb24uCisgICAgICAgIG1fY29u
dGVudC0+c2V0U2NhbGUoY3VycmVudFNjYWxlKTsKKyAgICAgICAgbV9jb250ZW50LT5zZXRYKG9y
aWdpbmFsUG9zaXRpb24ueCgpKTsKKyAgICAgICAgbV9jb250ZW50LT5zZXRZKG9yaWdpbmFsUG9z
aXRpb24ueSgpKTsKKworICAgICAgICAvLyBBbmltYXRlIHRoZSBzY2FsZSB0byB0aGUgY29tcHV0
ZWQgdGFyZ2V0LgorICAgICAgICBtX3NjYWxlQW5pbWF0aW9uLnNldEVuZFZhbHVlKGJvdW5kZWRT
Y2FsZSk7CisgICAgICAgIG1fc2NhbGVBbmltYXRpb24uc3RhcnQoKTsKKyAgICB9CisKICAgICBR
UG9pbnRGIG5ld1BvcyA9IGNvbnRlbnRHZW9tZXRyeS50b3BMZWZ0KCk7CiAKICAgICAvLyBIb3Jp
em9udGFsIGNvcnJlY3Rpb24uCkBAIC0yNzksMTkgKzMyOCwyNCBAQCB2b2lkIFZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmU6OmFuaW1hdGVDb250ZW50UG9zaXRpb25JbnRvQm91bmRhcmllc0lmTmVl
ZGVkKCkKICAgICAgICAgICAgIG5ld1Bvcy5zZXRZKG5ld1Bvcy55KCkgKyBib3R0b21TaWRlR2Fw
KTsKICAgICB9CiAKLSAgICBpZiAobmV3UG9zICE9IG1fY29udGVudC0+cG9zKCkpCi0gICAgICAg
IC8vIEZJWE1FOiBEbyB5b3Uga25vdyB3aGF0IEFOSU1BVEUgbWVhbnM/Ci0gICAgICAgIG1fY29u
dGVudC0+c2V0UG9zKG5ld1Bvcyk7Ci19CisgICAgaWYgKG5ld1BvcyAhPSBvcmlnaW5hbFBvc2l0
aW9uKSB7CisgICAgICAgIGdldFhQb3NpdGlvbkFuaW1hdGlvbihtX3Bvc2l0aW9uQW5pbWF0aW9u
KS0+c2V0RW5kVmFsdWUobmV3UG9zLngoKSk7CisgICAgICAgIGdldFlQb3NpdGlvbkFuaW1hdGlv
bihtX3Bvc2l0aW9uQW5pbWF0aW9uKS0+c2V0RW5kVmFsdWUobmV3UG9zLnkoKSk7CisgICAgICAg
IG1fcG9zaXRpb25BbmltYXRpb24uc3RhcnQoKTsKKyAgICB9CiAKLXZvaWQgVmlld3BvcnRJbnRl
cmFjdGlvbkVuZ2luZTo6YW5pbWF0ZUNvbnRlbnRTY2FsZUludG9Cb3VuZGFyaWVzSWZOZWVkZWQo
KQotewotICAgIGNvbnN0IHFyZWFsIGN1cnJlbnRTY2FsZSA9IG1fY29udGVudC0+c2NhbGUoKTsK
LSAgICBjb25zdCBxcmVhbCBib3VuZGVkU2NhbGUgPSBxQm91bmQobV9jb25zdHJhaW50cy5taW5p
bXVtU2NhbGUsIGN1cnJlbnRTY2FsZSwgbV9jb25zdHJhaW50cy5tYXhpbXVtU2NhbGUpOwotICAg
IGlmIChjdXJyZW50U2NhbGUgIT0gYm91bmRlZFNjYWxlKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBE
byB5b3Uga25vdyB3aGF0IEFOSU1BVEUgbWVhbnM/Ci0gICAgICAgIGNvbnN0IFFQb2ludEYgY2Vu
dGVyT2ZJbnRlcmVzdCA9IHZpc2libGVSZWN0SW5Db250ZW50Q29vcmRpbmF0ZShtX2NvbnRlbnQs
IG1fdmlld3BvcnQpLmNlbnRlcigpOwotICAgICAgICBzY2FsZUNvbnRlbnQoY2VudGVyT2ZJbnRl
cmVzdCwgYm91bmRlZFNjYWxlKTsKKyAgICBpZiAobmV3UG9zICE9IG9yaWdpbmFsUG9zaXRpb24g
fHwgYm91bmRlZFNjYWxlICE9IGN1cnJlbnRTY2FsZSkgeworICAgICAgICAvLyBBbHJlYWR5IGNv
bW1pdCBmaW5hbCB2aXNpYmxlIHJlY3Qgc28gbmV3IHRpbGVzIGNhbiBhbHJlYWR5IGJlIHJlbmRl
cmVkLgorICAgICAgICBtX2NvbnRlbnQtPnNldFNjYWxlKGJvdW5kZWRTY2FsZSk7CisgICAgICAg
IG1fY29udGVudC0+c2V0WChuZXdQb3MueCgpKTsKKyAgICAgICAgbV9jb250ZW50LT5zZXRZKG5l
d1Bvcy55KCkpOworCisgICAgICAgIGNvbnN0IFFSZWN0RiB2aWV3cG9ydFJlY3RJblBhZ2VWaWV3
Q29vcmRpbmF0ZSA9IG1fdmlld3BvcnQtPm1hcFJlY3RUb0l0ZW0obV9jb250ZW50LCBtX3ZpZXdw
b3J0LT5ib3VuZGluZ1JlY3QoKSk7CisgICAgICAgIGVtaXQgdmlld3BvcnRVcGRhdGVSZXF1ZXN0
ZWQodmlld3BvcnRSZWN0SW5QYWdlVmlld0Nvb3JkaW5hdGUpOworCisgICAgICAgIG1fY29udGVu
dC0+c2V0U2NhbGUoY3VycmVudFNjYWxlKTsKKyAgICAgICAgbV9jb250ZW50LT5zZXRYKG9yaWdp
bmFsUG9zaXRpb24ueCgpKTsKKyAgICAgICAgbV9jb250ZW50LT5zZXRZKG9yaWdpbmFsUG9zaXRp
b24ueSgpKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9xdC9WaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmggYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvcXQvVmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS5oCmluZGV4IDJmODJiOGUuLmVjNzVjNGQg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9WaWV3cG9ydEludGVyYWN0
aW9uRW5naW5lLmgKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1ZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmUuaApAQCAtMjMsNiArMjMsOCBAQAogCiAjaW5jbHVkZSAicXdlYmtpdGds
b2JhbC5oIgogI2luY2x1ZGUgPFF0Q29yZS9RT2JqZWN0PgorI2luY2x1ZGUgPFF0Q29yZS9RUHJv
cGVydHlBbmltYXRpb24+CisjaW5jbHVkZSA8UXRDb3JlL1FQYXJhbGxlbEFuaW1hdGlvbkdyb3Vw
PgogCiBRVF9CRUdJTl9OQU1FU1BBQ0UKIGNsYXNzIFFQb2ludEY7CkBAIC02NCw5ICs2Niw5IEBA
IHB1YmxpYzoKICAgICB2b2lkIHBpbmNoR2VzdHVyZUVuZGVkKCk7CiAKIFFfU0lHTkFMUzoKLSAg
ICB2b2lkIHZpZXdwb3J0VXBkYXRlUmVxdWVzdGVkKCk7CisgICAgdm9pZCB2aWV3cG9ydFVwZGF0
ZVJlcXVlc3RlZChjb25zdCBRUmVjdEYmIG5ld1Zpc2libGVSZWN0KTsKIAotICAgIHZvaWQgY29t
bWl0U2NhbGVDaGFuZ2UoKTsKKyAgICB2b2lkIGNvbW1pdFNjYWxlQ2hhbmdlKHFyZWFsKTsKIAog
cHJpdmF0ZSBRX1NMT1RTOgogICAgIC8vIFJlc3BvbmQgdG8gY2hhbmdlcyBvZiBjb250ZW50IHRo
YXQgYXJlIG5vdCBkcml2ZW4gYnkgdXMsIGxpa2UgdGhlIHBhZ2UgcmVzaXppbmcgaXRzZWxmLgpA
QCAtNzQsMTMgKzc2LDE0IEBAIHByaXZhdGUgUV9TTE9UUzoKICAgICB2b2lkIGNvbnRlbnRTY2Fs
ZUNoYW5nZWQoKTsKIAogcHJpdmF0ZToKKyAgICB2b2lkIGVtaXRDb250ZW50R2VvbWV0cnlDaGFu
Z2VkV2l0aEN1cnJlbnRHZW9tZXRyeSgpOworCiAgICAgdm9pZCB1cGRhdGVDb250ZW50SWZOZWVk
ZWQoKTsKICAgICB2b2lkIHVwZGF0ZUNvbnRlbnRTY2FsZUlmTmVlZGVkKCk7CiAgICAgdm9pZCB1
cGRhdGVDb250ZW50UG9zaXRpb25JZk5lZWRlZCgpOwogCisgICAgdm9pZCBzdG9wQW5pbWF0aW9u
cygpOwogICAgIHZvaWQgYW5pbWF0ZUNvbnRlbnRJbnRvQm91bmRhcmllc0lmTmVlZGVkKCk7Ci0g
ICAgdm9pZCBhbmltYXRlQ29udGVudFBvc2l0aW9uSW50b0JvdW5kYXJpZXNJZk5lZWRlZCgpOwot
ICAgIHZvaWQgYW5pbWF0ZUNvbnRlbnRTY2FsZUludG9Cb3VuZGFyaWVzSWZOZWVkZWQoKTsKIAog
ICAgIHZvaWQgc2NhbGVDb250ZW50KGNvbnN0IFFQb2ludEYmIGNlbnRlckluQ29udGVudENvb3Jk
aW5hdGUsIHFyZWFsIHNjYWxlKTsKIApAQCAtOTksNiArMTAyLDkgQEAgcHJpdmF0ZToKICAgICBR
X0RFQ0xBUkVfRkxBR1MoVXNlckludGVyYWN0aW9uRmxhZ3MsIFVzZXJJbnRlcmFjdGlvbkZsYWcp
OwogICAgIFVzZXJJbnRlcmFjdGlvbkZsYWdzIG1fdXNlckludGVyYWN0aW9uRmxhZ3M7CiAKKyAg
ICBRUHJvcGVydHlBbmltYXRpb24gbV9zY2FsZUFuaW1hdGlvbjsKKyAgICBRUGFyYWxsZWxBbmlt
YXRpb25Hcm91cCBtX3Bvc2l0aW9uQW5pbWF0aW9uOworCiAgICAgcXJlYWwgbV9waW5jaFN0YXJ0
U2NhbGU7CiB9OwogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>109166</attachid>
            <date>2011-09-29 09:16:35 -0700</date>
            <delta_ts>2011-09-30 02:58:57 -0700</delta_ts>
            <desc>proposed patch</desc>
            <filename>touch_animations.patch</filename>
            <type>text/plain</type>
            <size>26390</size>
            <attacher name="Andras Becsi">abecsi</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQyL0No
YW5nZUxvZwppbmRleCAyNTViOTEzLi43ZGE5YjdjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
Mi9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDMg
QEAKKzIwMTEtMDktMjkgIEFuZHJhcyBCZWNzaSAgPGFuZHJhcy5iZWNzaUBub2tpYS5jb20+CisK
KyAgICAgICAgW1F0XVtXSzJdIEFkZCB0aGUgYW5pbWF0aW9ucyBvbiB0aGUgVmlld3BvcnRJbnRl
cmFjdGlvbkVuZ2luZQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9NjY2NjQKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICAqIFVJUHJvY2Vzcy9xdC9RdFBhbkdlc3R1cmVSZWNvZ25pemVyLmNwcDoKKyAgICAgICAg
KFdlYktpdDo6UXRQYW5HZXN0dXJlUmVjb2duaXplcjo6cmVjb2duaXplKToKKyAgICAgICAgKiBV
SVByb2Nlc3MvcXQvUXRQYW5HZXN0dXJlUmVjb2duaXplci5oOgorICAgICAgICAqIFVJUHJvY2Vz
cy9xdC9WaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmNwcDoKKyAgICAgICAgKFdlYktpdDo6YWRq
dXN0UG9zaXRpb25JbnRvQm91bmRhcmllcyk6CisgICAgICAgIChXZWJLaXQ6OlZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmU6OlRyYWplY3RvcnlIaXN0b3J5OjpjYWxjdWxhdGVUaHJvd1RyYWplY3Rv
cnkpOgorICAgICAgICAoV2ViS2l0OjpWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpWaWV3cG9y
dEludGVyYWN0aW9uRW5naW5lKToKKyAgICAgICAgKFdlYktpdDo6Vmlld3BvcnRJbnRlcmFjdGlv
bkVuZ2luZTo6cmVzZXQpOgorICAgICAgICAoV2ViS2l0OjpWaWV3cG9ydEludGVyYWN0aW9uRW5n
aW5lOjpzZXRDb25zdHJhaW50cyk6CisgICAgICAgIChXZWJLaXQ6OlZpZXdwb3J0SW50ZXJhY3Rp
b25FbmdpbmU6OnBhbkdlc3R1cmVTdGFydGVkKToKKyAgICAgICAgKFdlYktpdDo6Vmlld3BvcnRJ
bnRlcmFjdGlvbkVuZ2luZTo6cGFuR2VzdHVyZVJlcXVlc3RVcGRhdGUpOgorICAgICAgICAoV2Vi
S2l0OjpWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpwYW5HZXN0dXJlQ2FuY2VsbGVkKToKKyAg
ICAgICAgKFdlYktpdDo6Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6cGFuR2VzdHVyZUVuZGVk
KToKKyAgICAgICAgKFdlYktpdDo6Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6cGluY2hHZXN0
dXJlU3RhcnRlZCk6CisgICAgICAgIChXZWJLaXQ6OlZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6
OnBpbmNoR2VzdHVyZVJlcXVlc3RVcGRhdGUpOgorICAgICAgICAoV2ViS2l0OjpWaWV3cG9ydElu
dGVyYWN0aW9uRW5naW5lOjpwaW5jaEdlc3R1cmVFbmRlZCk6CisgICAgICAgIChXZWJLaXQ6OlZp
ZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OmNvbnRlbnRWaWV3cG9ydENoYW5nZWQpOgorICAgICAg
ICAoV2ViS2l0OjpWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjphbmltYXRpb25GaW5pc2hlZCk6
CisgICAgICAgIChXZWJLaXQ6OlZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnVwZGF0ZUNvbnRl
bnRQb3NpdGlvbklmTmVlZGVkKToKKyAgICAgICAgKFdlYktpdDo6Vmlld3BvcnRJbnRlcmFjdGlv
bkVuZ2luZTo6YW5pbWF0ZUNvbnRlbnRUb0JvdW5kZWRHZW9tZXRyeUlmTmVlZGVkKToKKyAgICAg
ICAgKFdlYktpdDo6Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6eEFuaW1hdGlvbik6CisgICAg
ICAgIChXZWJLaXQ6OlZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnlBbmltYXRpb24pOgorICAg
ICAgICAoV2ViS2l0OjpWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpzdG9wQW5pbWF0aW9ucyk6
CisgICAgICAgIChXZWJLaXQ6OlZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnN0YXJ0UGFuVGhy
b3dBbmltYXRpb24pOgorICAgICAgICAoV2ViS2l0OjpWaWV3cG9ydEludGVyYWN0aW9uRW5naW5l
OjphbmltYXRlQ29udGVudFNjYWxlSW50b0JvdW5kYXJpZXNJZk5lZWRlZCk6CisgICAgICAgICog
VUlQcm9jZXNzL3F0L1ZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUuaDoKKyAgICAgICAgKFdlYktp
dDo6Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6VHJhamVjdG9yeUhpc3Rvcnk6OlRyYWplY3Rv
cnlIaXN0b3J5KToKKyAgICAgICAgKFdlYktpdDo6Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6
VHJhamVjdG9yeUhpc3Rvcnk6OmFkZCk6CisgICAgICAgIChXZWJLaXQ6OlZpZXdwb3J0SW50ZXJh
Y3Rpb25FbmdpbmU6OlRyYWplY3RvcnlIaXN0b3J5OjpsYXN0KToKKyAgICAgICAgKFdlYktpdDo6
Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6VHJhamVjdG9yeUhpc3Rvcnk6OnJlc2V0KToKKyAg
ICAgICAgKiBVSVByb2Nlc3MvcXQvcXRvdWNod2VicGFnZXByb3h5LmNwcDoKKyAgICAgICAgKFFU
b3VjaFdlYlBhZ2VQcm94eTo6ZG9uZVdpdGhUb3VjaEV2ZW50KToKKwogMjAxMS0wOS0yOSAgQ2Fy
bG9zIEdhcmNpYSBDYW1wb3MgIDxjZ2FyY2lhQGlnYWxpYS5jb20+CiAKICAgICAgICAgW0dUS10g
Rm9yY2Ugc2luZ2xlIGhlYWRlciBpbmNsdWRlIGluIFdlYktpdDIgR1RLKyBBUEkKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFBhbkdlc3R1cmVSZWNvZ25pemVyLmNw
cCBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFBhbkdlc3R1cmVSZWNvZ25pemVyLmNw
cAppbmRleCAxZmJkOGNjLi5mYzFjNjdhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvcXQvUXRQYW5HZXN0dXJlUmVjb2duaXplci5jcHAKKysrIGIvU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL3F0L1F0UGFuR2VzdHVyZVJlY29nbml6ZXIuY3BwCkBAIC0zNyw3ICszNyw3IEBA
IFF0UGFuR2VzdHVyZVJlY29nbml6ZXI6OlF0UGFuR2VzdHVyZVJlY29nbml6ZXIoVmlld3BvcnRJ
bnRlcmFjdGlvbkVuZ2luZSogaW50ZXJhCiAgICAgcmVzZXQoKTsKIH0KIAotYm9vbCBRdFBhbkdl
c3R1cmVSZWNvZ25pemVyOjpyZWNvZ25pemUoY29uc3QgUVRvdWNoRXZlbnQqIGV2ZW50KQorYm9v
bCBRdFBhbkdlc3R1cmVSZWNvZ25pemVyOjpyZWNvZ25pemUoY29uc3QgUVRvdWNoRXZlbnQqIGV2
ZW50LCBkb3VibGUgdGltZXN0YW1wKQogewogICAgIC8vIFBhbiBnZXN0dXJlIGFsd2F5cyBzdGFy
dHMgb24gVG91Y2hCZWdpbiB1bmxlc3MgdGhlIGVuZ2luZSBpcyBzdXNwZW5kZWQuCiAgICAgaWYg
KG1fc3RhdGUgPT0gTm9HZXN0dXJlICYmIGV2ZW50LT50eXBlKCkgIT0gUUV2ZW50OjpUb3VjaEJl
Z2luKQpAQCAtNTgsNiArNTgsNyBAQCBib29sIFF0UGFuR2VzdHVyZVJlY29nbml6ZXI6OnJlY29n
bml6ZShjb25zdCBRVG91Y2hFdmVudCogZXZlbnQpCiAgICAgICAgIEFTU0VSVChtX3N0YXRlID09
IE5vR2VzdHVyZSk7CiAgICAgICAgIG1fc3RhdGUgPSBHZXN0dXJlUmVjb2duaXRpb25TdGFydGVk
OwogICAgICAgICBtX2ZpcnN0UG9zaXRpb24gPSB0b3VjaFBvaW50LnNjcmVlblBvcygpOworICAg
ICAgICBtX3ZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPnN0b3BBbmltYXRpb25zKCk7CiAgICAg
ICAgIHJldHVybiBmYWxzZTsKICAgICBjYXNlIFFFdmVudDo6VG91Y2hVcGRhdGU6IHsKICAgICAg
ICAgQVNTRVJUKG1fc3RhdGUgIT0gTm9HZXN0dXJlKTsKQEAgLTc1LDcgKzc2LDcgQEAgYm9vbCBR
dFBhbkdlc3R1cmVSZWNvZ25pemVyOjpyZWNvZ25pemUoY29uc3QgUVRvdWNoRXZlbnQqIGV2ZW50
KQogICAgICAgICBBU1NFUlQobV9zdGF0ZSA9PSBHZXN0dXJlUmVjb2duaXplZCk7CiAgICAgICAg
IC8vIE9mZnNldCBzZW50IHRvIHRoZSB2aWV3cyBtdXN0IGJlIGluIHBhZ2UgdmlldyBjb29yZGlu
YXRlIHNwYWNlLgogICAgICAgICBRUG9pbnRGIG9mZnNldFNpbmNlTGFzdEV2ZW50KHRvdWNoUG9p
bnQucG9zKCkgLSB0b3VjaFBvaW50Lmxhc3RQb3MoKSk7Ci0gICAgICAgIG1fdmlld3BvcnRJbnRl
cmFjdGlvbkVuZ2luZS0+cGFuR2VzdHVyZVJlcXVlc3RVcGRhdGUob2Zmc2V0U2luY2VMYXN0RXZl
bnQueCgpLCBvZmZzZXRTaW5jZUxhc3RFdmVudC55KCkpOworICAgICAgICBtX3ZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmUtPnBhbkdlc3R1cmVSZXF1ZXN0VXBkYXRlKG9mZnNldFNpbmNlTGFzdEV2
ZW50LngoKSwgb2Zmc2V0U2luY2VMYXN0RXZlbnQueSgpLCB0aW1lc3RhbXApOwogICAgICAgICBy
ZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgY2FzZSBRRXZlbnQ6OlRvdWNoRW5kOgpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1F0UGFuR2VzdHVyZVJlY29nbml6ZXIuaCBi
L1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFBhbkdlc3R1cmVSZWNvZ25pemVyLmgKaW5k
ZXggNzRiYjc5Zi4uMjNlZjJjOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L3F0L1F0UGFuR2VzdHVyZVJlY29nbml6ZXIuaAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvcXQvUXRQYW5HZXN0dXJlUmVjb2duaXplci5oCkBAIC00Miw3ICs0Miw3IEBAIGNvbnN0IHFy
ZWFsIHBhbm5pbmdJbml0aWFsVHJpZ2dlckRpc3RhbmNlVGhyZXNob2xkID0gNS47CiBjbGFzcyBR
dFBhbkdlc3R1cmVSZWNvZ25pemVyIDogcHJpdmF0ZSBRdEdlc3R1cmVSZWNvZ25pemVyIHsKIHB1
YmxpYzoKICAgICBRdFBhbkdlc3R1cmVSZWNvZ25pemVyKFZpZXdwb3J0SW50ZXJhY3Rpb25Fbmdp
bmUqKTsKLSAgICBib29sIHJlY29nbml6ZShjb25zdCBRVG91Y2hFdmVudCopOworICAgIGJvb2wg
cmVjb2duaXplKGNvbnN0IFFUb3VjaEV2ZW50KiwgZG91YmxlIHRpbWVzdGFtcCk7CiAgICAgdm9p
ZCByZXNldCgpOwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL3F0L1ZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUuY3BwIGIvU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL3F0L1ZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUuY3BwCmluZGV4IGFjY2IxNDguLjli
OWRjMmYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9WaWV3cG9ydElu
dGVyYWN0aW9uRW5naW5lLmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvVmll
d3BvcnRJbnRlcmFjdGlvbkVuZ2luZS5jcHAKQEAgLTI0LDkgKzI0LDE5IEBACiAjaW5jbHVkZSAi
UGFzc093blB0ci5oIgogI2luY2x1ZGUgPFFQb2ludEY+CiAjaW5jbHVkZSA8UXREZWNsYXJhdGl2
ZS9xc2dpdGVtLmg+CisjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+CiAKIG5hbWVzcGFjZSBX
ZWJLaXQgewogCitzdGF0aWMgY29uc3QgaW50IHNob3J0RHVyYXRpb24gPSAyNTA7CitzdGF0aWMg
Y29uc3QgaW50IG1lZGl1bUR1cmF0aW9uID0gNTAwOworc3RhdGljIGNvbnN0IGludCBwYW5UaHJv
d0FuaW1hdGlvblRocmVzaG9sZCA9IHNob3J0RHVyYXRpb247CisKK2VudW0gUG9zaXRpb25Bbmlt
YXRpb25Hcm91cEluZGV4IHsKKyAgICBYQW5pbWF0aW9uSW5kZXggPSAwLAorICAgIFlBbmltYXRp
b25JbmRleCA9IDEKK307CisKIHN0YXRpYyBpbmxpbmUgUVJlY3RGIHZpc2libGVSZWN0SW5Db250
ZW50Q29vcmRpbmF0ZShjb25zdCBRU0dJdGVtKiBjb250ZW50LCBjb25zdCBRU0dJdGVtKiB2aWV3
cG9ydCkKIHsKICAgICBjb25zdCBRUmVjdEYgdmlld3BvcnRJbkNvbnRlbnRDb29yZGluYXRlID0g
Y29udGVudC0+bWFwUmVjdEZyb21JdGVtKHZpZXdwb3J0LCB2aWV3cG9ydC0+Ym91bmRpbmdSZWN0
KCkpOwpAQCAtMzksNTkgKzQ5LDY3IEBAIHN0YXRpYyBpbmxpbmUgUVJlY3RGIGNvbnRlbnRSZWN0
SW5WaWV3cG9ydENvb3JkaW5hdGUoY29uc3QgUVNHSXRlbSogY29udGVudCwgY29uCiAgICAgcmV0
dXJuIHZpZXdwb3J0LT5tYXBSZWN0RnJvbUl0ZW0oY29udGVudCwgY29udGVudC0+Ym91bmRpbmdS
ZWN0KCkpOwogfQogCi0vLyBVcGRhdGluZyBjb250ZW50IHByb3BlcnRpZXMgY2F1c2UgdGhlIG5v
dGlmeSBzaWduYWxzIHRvIGJlIHNlbnQgYnkgdGhlIGNvbnRlbnQgaXRlbSBpdHNlbGYuCi0vLyBT
aW5jZSB3ZSBtYW5hZ2UgdGhvc2UgZGlmZmVyZW50bHksIHdlIGRvIG5vdCB3YW50IHRvIHJlc3Bv
bmQKLS8vIHRvIHRoZW0gd2hlbiB3ZSBhcmUgdGhlIG9uZSBjaGFuZ2luZyB0aGUgY29udGVudC4K
LS8vCi0vLyBUaGUgZ3VhcmQgbWFrZSBzdXJlIHRoZSBzaWduYWwgdmlld3BvcnRVcGRhdGVSZXF1
ZXN0ZWQoKSBpcyBzZW50IGlmIG5lY2Vzc2FyeS4KLS8vIFdoZW4gbXVsdGlwbGUgZ3VhcmRzIGFy
ZSBhbGl2ZSwgdGhlaXIgbGlmZXRpbWUgbXVzdCBiZSBwZXJmZWN0bHkgaW1icmljYXRlZCAoZS5n
LiBpZiB1c2VkIG91c2lkZSBzdGFjayBmcmFtZXMpLgotLy8gV2UgcmVseSBvbiB0aGUgZmlyc3Qg
b25lIHRvIHRyaWdnZXIgdGhlIHVwZGF0ZSBhdCB0aGUgZW5kIHNpbmNlIGl0IG9ubHkgdXNlcyBv
bmUgYm9vbCBpbnRlcm5hbGx5LgotLy8KLS8vIFRoZSBwdWJsaWMgbWV0aG9kcyBzaG91bGQgY3Jl
YXRlIHRoZSBndWFyZCBpZiB0aGV5IG1pZ2h0IHVwZGF0ZSBjb250ZW50LgotY2xhc3MgVmlld3Bv
cnRVcGRhdGVHdWFyZCB7Ci1wdWJsaWM6Ci0gICAgVmlld3BvcnRVcGRhdGVHdWFyZChWaWV3cG9y
dEludGVyYWN0aW9uRW5naW5lKiB2aWV3cG9ydEludGVyYWN0aW9uRW5naW5lKQotICAgICAgICA6
IHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUodmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZSkKLSAg
ICAgICAgLCB3YXNVcGRhdGluZ0NvbnRlbnQodmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+bV9p
c1VwZGF0aW5nQ29udGVudCkKLSAgICAgICAgLCBwcmV2aW91c1Bvc2l0aW9uKHZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmUtPm1fY29udGVudC0+cG9zKCkpCi0gICAgICAgICwgcHJldmlvdXNTaXpl
KHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1fY29udGVudC0+d2lkdGgoKSwgdmlld3BvcnRJ
bnRlcmFjdGlvbkVuZ2luZS0+bV9jb250ZW50LT5oZWlnaHQoKSkKLSAgICAgICAgLCBwcmV2aW91
c1NjYWxlKHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1fY29udGVudC0+c2NhbGUoKSkKLSAg
ICB7Ci0gICAgICAgIHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1faXNVcGRhdGluZ0NvbnRl
bnQgPSB0cnVlOworc3RhdGljIGlubGluZSBjb25zdCBRUG9pbnRGIGFkanVzdFBvc2l0aW9uSW50
b0JvdW5kYXJpZXMoY29uc3QgUVNHSXRlbSogdmlld3BvcnQsIGNvbnN0IFFSZWN0RiYgcmVxdWVz
dGVkR2VvbWV0cnkpCit7CisgICAgUVBvaW50RiBwb3MgPSByZXF1ZXN0ZWRHZW9tZXRyeS50b3BM
ZWZ0KCk7CisKKyAgICAvLyBIb3Jpem9udGFsIGNvcnJlY3Rpb24uCisgICAgaWYgKHJlcXVlc3Rl
ZEdlb21ldHJ5LndpZHRoKCkgPCB2aWV3cG9ydC0+d2lkdGgoKSkKKyAgICAgICAgcG9zLnNldFgo
KHZpZXdwb3J0LT53aWR0aCgpIC0gcmVxdWVzdGVkR2VvbWV0cnkud2lkdGgoKSkgLyAyKTsKKyAg
ICBlbHNlIHsKKyAgICAgICAgcG9zLnNldFgocU1pbigwLiwgcG9zLngoKSkpOworICAgICAgICBj
b25zdCBxcmVhbCByaWdodFNpZGVHYXAgPSB2aWV3cG9ydC0+Ym91bmRpbmdSZWN0KCkucmlnaHQo
KSAtIHJlcXVlc3RlZEdlb21ldHJ5LnJpZ2h0KCk7CisgICAgICAgIGlmIChyaWdodFNpZGVHYXAg
PiAwLikKKyAgICAgICAgICAgIHBvcy5zZXRYKHBvcy54KCkgKyByaWdodFNpZGVHYXApOwogICAg
IH0KIAotICAgIH5WaWV3cG9ydFVwZGF0ZUd1YXJkKCkKLSAgICB7Ci0gICAgICAgIGlmICghd2Fz
VXBkYXRpbmdDb250ZW50KSB7Ci0gICAgICAgICAgICBpZiAocHJldmlvdXNQb3NpdGlvbiAhPSB2
aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLT5tX2NvbnRlbnQtPnBvcygpCi0gICAgICAgICAgICAg
ICAgICAgIHx8IHByZXZpb3VzU2l6ZS53aWR0aCgpICE9IHZpZXdwb3J0SW50ZXJhY3Rpb25Fbmdp
bmUtPm1fY29udGVudC0+d2lkdGgoKQotICAgICAgICAgICAgICAgICAgICB8fCBwcmV2aW91c1Np
emUuaGVpZ2h0KCkgIT0gdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+bV9jb250ZW50LT5oZWln
aHQoKQotICAgICAgICAgICAgICAgICAgICB8fCBwcmV2aW91c1NjYWxlICE9IHZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmUtPm1fY29udGVudC0+c2NhbGUoKSkKLSAgICAgICAgICAgICAgICBlbWl0
IHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPnZpZXdwb3J0VXBkYXRlUmVxdWVzdGVkKCk7Ci0g
ICAgICAgIH0KLSAgICAgICAgdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+bV9pc1VwZGF0aW5n
Q29udGVudCA9IHdhc1VwZGF0aW5nQ29udGVudDsKKyAgICAvLyBWZXJ0aWNhbCBjb3JyZWN0aW9u
LgorICAgIGlmIChyZXF1ZXN0ZWRHZW9tZXRyeS5oZWlnaHQoKSA8IHZpZXdwb3J0LT5oZWlnaHQo
KSkKKyAgICAgICAgcG9zLnNldFkoMCk7CisgICAgZWxzZSB7CisgICAgICAgIHBvcy5zZXRZKHFN
aW4oMC4sIHBvcy55KCkpKTsKKyAgICAgICAgY29uc3QgcXJlYWwgYm90dG9tU2lkZUdhcCA9IHZp
ZXdwb3J0LT5ib3VuZGluZ1JlY3QoKS5ib3R0b20oKSAtIHJlcXVlc3RlZEdlb21ldHJ5LmJvdHRv
bSgpOworICAgICAgICBpZiAoYm90dG9tU2lkZUdhcCA+IDAuKQorICAgICAgICAgICAgcG9zLnNl
dFkocG9zLnkoKSArIGJvdHRvbVNpZGVHYXApOwogICAgIH0KIAotcHJpdmF0ZToKLSAgICBWaWV3
cG9ydEludGVyYWN0aW9uRW5naW5lKiBjb25zdCB2aWV3cG9ydEludGVyYWN0aW9uRW5naW5lOwot
ICAgIGNvbnN0IGJvb2wgd2FzVXBkYXRpbmdDb250ZW50OwotICAgIGNvbnN0IFFQb2ludEYgcHJl
dmlvdXNQb3NpdGlvbjsKLSAgICBjb25zdCBRU2l6ZUYgcHJldmlvdXNTaXplOwotICAgIGNvbnN0
IHFyZWFsIHByZXZpb3VzU2NhbGU7Ci19OworICAgIHJldHVybiBwb3M7Cit9CisKK1FQb2ludEYg
Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6VHJhamVjdG9yeUhpc3Rvcnk6OmNhbGN1bGF0ZVRo
cm93VHJhamVjdG9yeSgpCit7CisgICAgUVBvaW50RiB0cmFqZWN0b3J5OworCisgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgdHJhamVjdG9yeSArPSBtX3RpbWVz
dGFtcGVkVmVjdG9yc1tpXS5zZWNvbmQ7CisgICAgICAgIG1fdGltZXN0YW1wZWRWZWN0b3JzW2ld
ID0gcU1ha2VQYWlyKDAuLCBRUG9pbnRGKCkpOworICAgIH0KKworICAgIHJldHVybiB0cmFqZWN0
b3J5OworfQogCiBWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpWaWV3cG9ydEludGVyYWN0aW9u
RW5naW5lKGNvbnN0IFFTR0l0ZW0qIHZpZXdwb3J0LCBRU0dJdGVtKiBjb250ZW50KQogICAgIDog
bV92aWV3cG9ydCh2aWV3cG9ydCkKICAgICAsIG1fY29udGVudChjb250ZW50KQotICAgICwgbV9p
c1VwZGF0aW5nQ29udGVudChmYWxzZSkKKyAgICAsIG1fc2NhbGVBbmltYXRpb24obV9jb250ZW50
LCAic2NhbGUiLCB0aGlzKQorICAgICwgbV9wb3NpdGlvbkFuaW1hdGlvbih0aGlzKQorICAgICwg
bV9ob3Jpem9udGFsUGFubmluZ0Rpc2FibGVkKHRydWUpCiAgICAgLCBtX3BpbmNoU3RhcnRTY2Fs
ZSgxLmYpCiB7CisKKyAgICBRUHJvcGVydHlBbmltYXRpb24qIGNvbnN0IHhQb3NpdGlvbkFuaW1h
dGlvbiA9IG5ldyBRUHJvcGVydHlBbmltYXRpb24obV9jb250ZW50LCAieCIsIHRoaXMpOworICAg
IFFQcm9wZXJ0eUFuaW1hdGlvbiogY29uc3QgeVBvc2l0aW9uQW5pbWF0aW9uID0gbmV3IFFQcm9w
ZXJ0eUFuaW1hdGlvbihtX2NvbnRlbnQsICJ5IiwgdGhpcyk7CisgICAgbV9wb3NpdGlvbkFuaW1h
dGlvbi5pbnNlcnRBbmltYXRpb24oWEFuaW1hdGlvbkluZGV4LCB4UG9zaXRpb25BbmltYXRpb24p
OworICAgIG1fcG9zaXRpb25BbmltYXRpb24uaW5zZXJ0QW5pbWF0aW9uKFlBbmltYXRpb25JbmRl
eCwgeVBvc2l0aW9uQW5pbWF0aW9uKTsKKwogICAgIHJlc2V0KCk7Ci0gICAgY29ubmVjdChtX2Nv
bnRlbnQsIFNJR05BTCh4Q2hhbmdlZCgpKSwgdGhpcywgU0xPVChjb250ZW50Vmlld3BvcnRDaGFu
Z2VkKCkpLCBRdDo6RGlyZWN0Q29ubmVjdGlvbik7Ci0gICAgY29ubmVjdChtX2NvbnRlbnQsIFNJ
R05BTCh5Q2hhbmdlZCgpKSwgdGhpcywgU0xPVChjb250ZW50Vmlld3BvcnRDaGFuZ2VkKCkpLCBR
dDo6RGlyZWN0Q29ubmVjdGlvbik7CisKICAgICBjb25uZWN0KG1fY29udGVudCwgU0lHTkFMKHdp
ZHRoQ2hhbmdlZCgpKSwgdGhpcywgU0xPVChjb250ZW50Vmlld3BvcnRDaGFuZ2VkKCkpLCBRdDo6
RGlyZWN0Q29ubmVjdGlvbik7CiAgICAgY29ubmVjdChtX2NvbnRlbnQsIFNJR05BTChoZWlnaHRD
aGFuZ2VkKCkpLCB0aGlzLCBTTE9UKGNvbnRlbnRWaWV3cG9ydENoYW5nZWQoKSksIFF0OjpEaXJl
Y3RDb25uZWN0aW9uKTsKLSAgICBjb25uZWN0KG1fY29udGVudCwgU0lHTkFMKHNjYWxlQ2hhbmdl
ZCgpKSwgdGhpcywgU0xPVChjb250ZW50Vmlld3BvcnRDaGFuZ2VkKCkpLCBRdDo6RGlyZWN0Q29u
bmVjdGlvbik7CisgICAgY29ubmVjdChtX3ZpZXdwb3J0LCBTSUdOQUwod2lkdGhDaGFuZ2VkKCkp
LCB0aGlzLCBTTE9UKGNvbnRlbnRWaWV3cG9ydENoYW5nZWQoKSksIFF0OjpEaXJlY3RDb25uZWN0
aW9uKTsKKyAgICBjb25uZWN0KG1fdmlld3BvcnQsIFNJR05BTChoZWlnaHRDaGFuZ2VkKCkpLCB0
aGlzLCBTTE9UKGNvbnRlbnRWaWV3cG9ydENoYW5nZWQoKSksIFF0OjpEaXJlY3RDb25uZWN0aW9u
KTsKKyAgICBjb25uZWN0KCZtX3NjYWxlQW5pbWF0aW9uLCBTSUdOQUwoZmluaXNoZWQoKSksIHRo
aXMsIFNMT1QoYW5pbWF0aW9uRmluaXNoZWQoKSksIFF0OjpEaXJlY3RDb25uZWN0aW9uKTsKKyAg
ICBjb25uZWN0KCZtX3Bvc2l0aW9uQW5pbWF0aW9uLCBTSUdOQUwoZmluaXNoZWQoKSksIHRoaXMs
IFNMT1QoYW5pbWF0aW9uRmluaXNoZWQoKSksIFF0OjpEaXJlY3RDb25uZWN0aW9uKTsKIH0KIAog
Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6flZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUoKQpA
QCAtMTAwLDkgKzExOCwxMyBAQCBWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjp+Vmlld3BvcnRJ
bnRlcmFjdGlvbkVuZ2luZSgpCiAKIHZvaWQgVmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6cmVz
ZXQoKQogewotICAgIFZpZXdwb3J0VXBkYXRlR3VhcmQgZ3VhcmQodGhpcyk7CisgICAgY29udGVu
dFZpZXdwb3J0Q2hhbmdlZCgpOwogICAgIG1fdXNlckludGVyYWN0aW9uRmxhZ3MgPSBVc2VySGFz
Tm90SW50ZXJhY3RlZFdpdGhDb250ZW50OwogICAgIHNldENvbnN0cmFpbnRzKENvbnN0cmFpbnRz
KCkpOworICAgIHN0b3BBbmltYXRpb25zKCk7CisgICAgeEFuaW1hdGlvbigpLnNldEVhc2luZ0N1
cnZlKFFFYXNpbmdDdXJ2ZTo6T3V0Q3ViaWMpOworICAgIHlBbmltYXRpb24oKS5zZXRFYXNpbmdD
dXJ2ZShRRWFzaW5nQ3VydmU6Ok91dEN1YmljKTsKKyAgICBtX3NjYWxlQW5pbWF0aW9uLnNldEVh
c2luZ0N1cnZlKFFFYXNpbmdDdXJ2ZTo6T3V0Q3ViaWMpOwogfQogCiB2b2lkIFZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmU6OnNldENvbnN0cmFpbnRzKGNvbnN0IENvbnN0cmFpbnRzJiBjb25zdHJh
aW50cykKQEAgLTExOSw3ICsxNDEsNiBAQCB2b2lkIFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6
OnNldENvbnN0cmFpbnRzKGNvbnN0IENvbnN0cmFpbnRzJiBjb25zdHJhaW50cykKICAgICAvLyAt
YW5pbWF0ZSB0aGUgcGFnZSBiYWNrIGluIHZpZXdwb3J0IGlmIG5lY2Vzc2FyeSAoaWYgdGhlIHBh
Z2UgaXMgZnVsbHkgaW4KICAgICAvLyAgdmlld3BvcnQsIGl0IGRvZXMgbm90IHBhbiBob3Jpem9u
dGFsbHkgYW55bW9yZSkuCiAKLSAgICBWaWV3cG9ydFVwZGF0ZUd1YXJkIGd1YXJkKHRoaXMpOwog
ICAgIG1fY29uc3RyYWludHMgPSBjb25zdHJhaW50czsKICAgICB1cGRhdGVDb250ZW50SWZOZWVk
ZWQoKTsKIH0KQEAgLTEyNywzNCArMTQ4LDMzIEBAIHZvaWQgVmlld3BvcnRJbnRlcmFjdGlvbkVu
Z2luZTo6c2V0Q29uc3RyYWludHMoY29uc3QgQ29uc3RyYWludHMmIGNvbnN0cmFpbnRzKQogdm9p
ZCBWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpwYW5HZXN0dXJlU3RhcnRlZCgpCiB7CiAgICAg
Ly8gRklYTUU6IHN1c3BlbmQgdGhlIFdlYiBlbmdpbmUgKHN0b3AgYW5pbWF0ZWQgR0lGLCBldGMp
LgotICAgIC8vIEZJWE1FOiBpbml0aWFsaXplIHBoeXNpY3MgZm9yIHBhbm5pbmcgKHN0b3AgYW5p
bWF0aW9uLCBldGMpLgogICAgIG1fdXNlckludGVyYWN0aW9uRmxhZ3MgfD0gVXNlckhhc01vdmVk
Q29udGVudDsKKyAgICBzdG9wQW5pbWF0aW9ucygpOwogfQogCi12b2lkIFZpZXdwb3J0SW50ZXJh
Y3Rpb25FbmdpbmU6OnBhbkdlc3R1cmVSZXF1ZXN0VXBkYXRlKHFyZWFsIGRlbHRhWCwgcXJlYWwg
ZGVsdGFZKQordm9pZCBWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpwYW5HZXN0dXJlUmVxdWVz
dFVwZGF0ZShxcmVhbCBkZWx0YVgsIHFyZWFsIGRlbHRhWSwgZG91YmxlIHRpbWVzdGFtcCkKIHsK
LSAgICBWaWV3cG9ydFVwZGF0ZUd1YXJkIGd1YXJkKHRoaXMpOworICAgIG1fcG9zaXRpb25Bbmlt
YXRpb24uc3RvcCgpOwogCiAgICAgUVBvaW50RiBpdGVtUG9zaXRpb25Jbkl0ZW1Db29yZHMgPSBt
X2NvbnRlbnQtPm1hcEZyb21JdGVtKG1fY29udGVudC0+cGFyZW50SXRlbSgpLCBtX2NvbnRlbnQt
PnBvcygpKTsKLSAgICBRUG9pbnRGIGRlc3RJblZpZXdwb3J0Q29vcmRzID0gbV92aWV3cG9ydC0+
bWFwRnJvbUl0ZW0obV9jb250ZW50LCBpdGVtUG9zaXRpb25Jbkl0ZW1Db29yZHMgKyBRUG9pbnRG
KGRlbHRhWCwgZGVsdGFZKSk7CisgICAgUVBvaW50RiB0cmFqZWN0b3J5ID0gUVBvaW50RigobV9o
b3Jpem9udGFsUGFubmluZ0Rpc2FibGVkKSA/IDAgOiAtZGVsdGFYLCAtZGVsdGFZKTsKKyAgICBt
X2hpc3RvcnkuYWRkKHRpbWVzdGFtcCwgdHJhamVjdG9yeSk7CisgICAgUVBvaW50RiBkZXN0SW5W
aWV3cG9ydENvb3JkcyA9IG1fdmlld3BvcnQtPm1hcEZyb21JdGVtKG1fY29udGVudCwgaXRlbVBv
c2l0aW9uSW5JdGVtQ29vcmRzIC0gdHJhamVjdG9yeSk7CiAKICAgICBtX2NvbnRlbnQtPnNldFBv
cyhkZXN0SW5WaWV3cG9ydENvb3Jkcyk7CisKICAgICAvLyBUaGlzIG11c3QgYmUgZW1pdHRlZCBi
ZWZvcmUgdmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQgc28gdGhhdCB0aGUgd2ViIHByb2Nlc3Mga25v
d3Mgd2hlcmUgdG8gbG9vayBmb3IgdGlsZXMuCi0gICAgZW1pdCB2aWV3cG9ydFRyYWplY3RvcnlW
ZWN0b3JDaGFuZ2VkKFFQb2ludEYoLWRlbHRhWCwgLWRlbHRhWSkpOworICAgIGVtaXQgdmlld3Bv
cnRUcmFqZWN0b3J5VmVjdG9yQ2hhbmdlZCh0cmFqZWN0b3J5KTsKIH0KIAogdm9pZCBWaWV3cG9y
dEludGVyYWN0aW9uRW5naW5lOjpwYW5HZXN0dXJlQ2FuY2VsbGVkKCkKIHsKLSAgICBWaWV3cG9y
dFVwZGF0ZUd1YXJkIGd1YXJkKHRoaXMpOwotICAgIC8vIEZJWE1FOiByZXNldCBwaHlzaWNzLgog
ICAgIHBhbkdlc3R1cmVFbmRlZCgpOwogfQogCiB2b2lkIFZpZXdwb3J0SW50ZXJhY3Rpb25Fbmdp
bmU6OnBhbkdlc3R1cmVFbmRlZCgpCiB7Ci0gICAgVmlld3BvcnRVcGRhdGVHdWFyZCBndWFyZCh0
aGlzKTsKLSAgICBhbmltYXRlQ29udGVudEludG9Cb3VuZGFyaWVzSWZOZWVkZWQoKTsKLSAgICAv
LyBGSVhNRTogZW1pdCB2aWV3cG9ydFRyYWplY3RvcnlWZWN0b3JDaGFuZ2VkKFFQb2ludEYoKSkg
d2hlbiB0aGUgcGFuIHRocm93IGFuaW1hdGlvbiBlbmRzIGFuZCB0aGUgcGFnZSBzdG9wcyBtb3Zp
bmcuCisgICAgc3RhcnRQYW5UaHJvd0FuaW1hdGlvbigpOwogfQogCiB2b2lkIFZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2VzdHVyZVN0YXJ0ZWQoKQpAQCAtMTYyLDcgKzE4Miw3IEBA
IHZvaWQgVmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6cGluY2hHZXN0dXJlU3RhcnRlZCgpCiAg
ICAgaWYgKCFtX2NvbnN0cmFpbnRzLmlzVXNlclNjYWxhYmxlKQogICAgICAgICByZXR1cm47CiAK
LSAgICBtX3BpbmNoVmlld3BvcnRVcGRhdGVEZWZlcnJlciA9IGFkb3B0UHRyKG5ldyBWaWV3cG9y
dFVwZGF0ZUd1YXJkKHRoaXMpKTsKKyAgICBtX3NjYWxlQW5pbWF0aW9uLnN0b3AoKTsKIAogICAg
IG1fdXNlckludGVyYWN0aW9uRmxhZ3MgfD0gVXNlckhhc1NjYWxlZENvbnRlbnQ7CiAgICAgbV91
c2VySW50ZXJhY3Rpb25GbGFncyB8PSBVc2VySGFzTW92ZWRDb250ZW50OwpAQCAtMTc3LDE1ICsx
OTcsOSBAQCB2b2lkIFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2VzdHVyZVJlcXVl
c3RVcGRhdGUoY29uc3QgUVBvaW50RiYgcGluY2hDZQogICAgIGlmICghbV9jb25zdHJhaW50cy5p
c1VzZXJTY2FsYWJsZSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgVmlld3BvcnRVcGRhdGVHdWFy
ZCBndWFyZCh0aGlzKTsKLQotICAgIC8vICBDaGFuZ2VzIG9mIHRoZSBjZW50ZXIgcG9zaXRpb24g
c2hvdWxkIG1vdmUgdGhlIHBhZ2UgZXZlbiBpZiB0aGUgem9vbSBmYWN0b3IKLSAgICAvLyAgZG9l
cyBub3QgY2hhbmdlLiBCb3RoIHRoZSB6b29tIGFuZCB0aGUgcGFubmluZyBzaG91bGQgYmUgaGFu
ZGxlZCB0aHJvdWdoIHRoZSBwaHlzaWNzIGVuZ2luZS4KKyAgICAvLyAgRklYTUU6IENoYW5nZXMg
b2YgdGhlIGNlbnRlciBwb3NpdGlvbiBzaG91bGQgbW92ZSB0aGUgcGFnZSBldmVuIGlmIHRoZSB6
b29tIGZhY3RvciBkb2VzIG5vdCBjaGFuZ2UuCiAgICAgY29uc3QgcXJlYWwgc2NhbGUgPSBtX3Bp
bmNoU3RhcnRTY2FsZSAqIHRvdGFsU2NhbGVGYWN0b3I7Ci0gICAgUVBvaW50RiBvbGRQaW5jaENl
bnRlck9uUGFyZW50ID0gbV9jb250ZW50LT5tYXBUb0l0ZW0obV9jb250ZW50LT5wYXJlbnRJdGVt
KCksIHBpbmNoQ2VudGVySW5Db250ZW50Q29vcmRpbmF0ZSk7Ci0gICAgbV9jb250ZW50LT5zZXRT
Y2FsZShzY2FsZSk7Ci0gICAgUVBvaW50RiBuZXdQaW5jaENlbnRlck9uUGFyZW50ID0gbV9jb250
ZW50LT5tYXBUb0l0ZW0obV9jb250ZW50LT5wYXJlbnRJdGVtKCksIHBpbmNoQ2VudGVySW5Db250
ZW50Q29vcmRpbmF0ZSk7Ci0gICAgbV9jb250ZW50LT5zZXRQb3MobV9jb250ZW50LT5wb3MoKSAt
IChuZXdQaW5jaENlbnRlck9uUGFyZW50IC0gb2xkUGluY2hDZW50ZXJPblBhcmVudCkpOworICAg
IHNjYWxlQ29udGVudChwaW5jaENlbnRlckluQ29udGVudENvb3JkaW5hdGUsIHNjYWxlKTsKIH0K
IAogdm9pZCBWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpwaW5jaEdlc3R1cmVFbmRlZCgpCkBA
IC0xOTMsMjYgKzIwNywzMCBAQCB2b2lkIFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBpbmNo
R2VzdHVyZUVuZGVkKCkKICAgICBpZiAoIW1fY29uc3RyYWludHMuaXNVc2VyU2NhbGFibGUpCiAg
ICAgICAgIHJldHVybjsKIAotICAgIHsKLSAgICAgICAgVmlld3BvcnRVcGRhdGVHdWFyZCBndWFy
ZCh0aGlzKTsKLSAgICAgICAgLy8gRklYTUU6IHJlc3VtZSB0aGUgZW5naW5lIGFmdGVyIHRoZSBh
bmltYXRpb24uCi0gICAgICAgIGFuaW1hdGVDb250ZW50SW50b0JvdW5kYXJpZXNJZk5lZWRlZCgp
OwotICAgIH0KLSAgICBtX3BpbmNoVmlld3BvcnRVcGRhdGVEZWZlcnJlci5jbGVhcigpOworICAg
IGFuaW1hdGVDb250ZW50U2NhbGVJbnRvQm91bmRhcmllc0lmTmVlZGVkKCk7CiB9CiAKIHZvaWQg
Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6Y29udGVudFZpZXdwb3J0Q2hhbmdlZCgpCiB7Ci0g
ICAgaWYgKG1faXNVcGRhdGluZ0NvbnRlbnQpCi0gICAgICAgIHJldHVybjsKLQotICAgIFZpZXdw
b3J0VXBkYXRlR3VhcmQgZ3VhcmQodGhpcyk7CiAgICAgdXBkYXRlQ29udGVudElmTmVlZGVkKCk7
CiAKKyAgICBtX2hvcml6b250YWxQYW5uaW5nRGlzYWJsZWQgPSBjb250ZW50UmVjdEluVmlld3Bv
cnRDb29yZGluYXRlKG1fY29udGVudCwgbV92aWV3cG9ydCkud2lkdGgoKSA8IG1fdmlld3BvcnQt
PndpZHRoKCk7CisgICAgZW1pdCB2aWV3cG9ydFRyYWplY3RvcnlWZWN0b3JDaGFuZ2VkKFFQb2lu
dEYoKSk7CisKICAgICAvLyBXZSBtdXN0IG5vdGlmeSB0aGUgY2hhbmdlIHNvIHRoZSBjbGllbnQg
Y2FuIHJlbHkgb24gdXMgZm9yIGFsbCBjaGFuZ2Ugb2YgR2VvbWV0cnkuCiAgICAgZW1pdCB2aWV3
cG9ydFVwZGF0ZVJlcXVlc3RlZCgpOwogfQogCit2b2lkIFZpZXdwb3J0SW50ZXJhY3Rpb25Fbmdp
bmU6OmFuaW1hdGlvbkZpbmlzaGVkKCkKK3sKKyAgICBlbWl0IHZpZXdwb3J0VHJhamVjdG9yeVZl
Y3RvckNoYW5nZWQoUVBvaW50RigpKTsKKworICAgIGlmIChtX3NjYWxlQW5pbWF0aW9uLnN0YXRl
KCkgPT0gUUFic3RyYWN0QW5pbWF0aW9uOjpSdW5uaW5nKQorICAgICAgICByZXR1cm47CisKKyAg
ICBhbmltYXRlQ29udGVudFRvQm91bmRlZEdlb21ldHJ5SWZOZWVkZWQoY29udGVudFJlY3RJblZp
ZXdwb3J0Q29vcmRpbmF0ZShtX2NvbnRlbnQsIG1fdmlld3BvcnQpLCBzaG9ydER1cmF0aW9uKTsK
K30KKwogdm9pZCBWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjp1cGRhdGVDb250ZW50SWZOZWVk
ZWQoKQogewogICAgIHVwZGF0ZUNvbnRlbnRTY2FsZUlmTmVlZGVkKCk7CkBAIC0yNDEsNTUgKzI1
OSwxMDIgQEAgdm9pZCBWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjp1cGRhdGVDb250ZW50UG9z
aXRpb25JZk5lZWRlZCgpCiAgICAgICAgIG1fY29udGVudC0+c2V0WSgwKTsKICAgICB9CiAKLSAg
ICAvLyBGSVhNRTogaWYgdGhlIGl0ZW0gY2FuIGJlIGZ1bGx5IGluIHRoZSB2aWV3cG9ydCBhbmQg
aXMgb3ZlciBhIHNpZGUsIHB1c2ggaXQgYmFjayBpbiB2aWV3Ci0gICAgLy8gRklYTUU6IGlmIHRo
ZSBpdGVtIGNhbm5vdCBiZSBmdWxseSBpbiB2aWV3cG9ydCwgYW5kIGlzIG5vdCBjb3ZlcmluZyB0
aGUgdmlld3BvcnQsIHB1c2ggaXQgYmFjayBpbiB2aWV3CisgICAgY29uc3QgUVJlY3RGIGNvbnRl
bnRHZW9tZXRyeSA9IGNvbnRlbnRSZWN0SW5WaWV3cG9ydENvb3JkaW5hdGUobV9jb250ZW50LCBt
X3ZpZXdwb3J0KTsKKyAgICBtX2NvbnRlbnQtPnNldFBvcyhhZGp1c3RQb3NpdGlvbkludG9Cb3Vu
ZGFyaWVzKG1fdmlld3BvcnQsIGNvbnRlbnRHZW9tZXRyeSkpOwogfQogCi12b2lkIFZpZXdwb3J0
SW50ZXJhY3Rpb25FbmdpbmU6OmFuaW1hdGVDb250ZW50SW50b0JvdW5kYXJpZXNJZk5lZWRlZCgp
Cit2b2lkIFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OmFuaW1hdGVDb250ZW50VG9Cb3VuZGVk
R2VvbWV0cnlJZk5lZWRlZChjb25zdCBRUmVjdEYmIGNvbnRlbnRHZW9tZXRyeSwgaW50IGR1cmF0
aW9uID0gc2hvcnREdXJhdGlvbikKIHsKLSAgICBhbmltYXRlQ29udGVudFNjYWxlSW50b0JvdW5k
YXJpZXNJZk5lZWRlZCgpOwotICAgIGFuaW1hdGVDb250ZW50UG9zaXRpb25JbnRvQm91bmRhcmll
c0lmTmVlZGVkKCk7CisgICAgbV9wb3NpdGlvbkFuaW1hdGlvbi5zdG9wKCk7CisgICAgUVBvaW50
RiBuZXdQb3MgPSBhZGp1c3RQb3NpdGlvbkludG9Cb3VuZGFyaWVzKG1fdmlld3BvcnQsIGNvbnRl
bnRHZW9tZXRyeSk7CisKKyAgICBpZiAobmV3UG9zICE9IG1fY29udGVudC0+cG9zKCkpIHsKKyAg
ICAgICAgeEFuaW1hdGlvbigpLnNldER1cmF0aW9uKGR1cmF0aW9uKTsKKyAgICAgICAgeEFuaW1h
dGlvbigpLnNldEVuZFZhbHVlKG5ld1Bvcy54KCkpOworICAgICAgICB5QW5pbWF0aW9uKCkuc2V0
RHVyYXRpb24oZHVyYXRpb24pOworICAgICAgICB5QW5pbWF0aW9uKCkuc2V0RW5kVmFsdWUobmV3
UG9zLnkoKSk7CisKKyAgICAgICAgUVBvaW50RiB0cmFqZWN0b3J5ID0gbV9jb250ZW50LT5wb3Mo
KSAtIG5ld1BvczsKKworICAgICAgICAvLyBOb3RpZnkgdGhlIHdlYiBwcm9jZXNzIHNvIGl0IGtu
b3dzIHdoZXJlIHRvIGxvb2sgZm9yIHRpbGVzCisgICAgICAgIGVtaXQgdmlld3BvcnRUcmFqZWN0
b3J5VmVjdG9yQ2hhbmdlZCh0cmFqZWN0b3J5KTsKKworICAgICAgICBtX3Bvc2l0aW9uQW5pbWF0
aW9uLnN0YXJ0KCk7CisgICAgfSBlbHNlCisgICAgICAgIGNvbnRlbnRWaWV3cG9ydENoYW5nZWQo
KTsKIH0KIAotdm9pZCBWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjphbmltYXRlQ29udGVudFBv
c2l0aW9uSW50b0JvdW5kYXJpZXNJZk5lZWRlZCgpCitpbmxpbmUgUVByb3BlcnR5QW5pbWF0aW9u
JiBWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjp4QW5pbWF0aW9uKCkKIHsKLSAgICBjb25zdCBR
UmVjdEYgY29udGVudEdlb21ldHJ5ID0gbV92aWV3cG9ydC0+bWFwUmVjdEZyb21JdGVtKG1fY29u
dGVudCwgbV9jb250ZW50LT5ib3VuZGluZ1JlY3QoKSk7Ci0gICAgUVBvaW50RiBuZXdQb3MgPSBj
b250ZW50R2VvbWV0cnkudG9wTGVmdCgpOworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8UVByb3Bl
cnR5QW5pbWF0aW9uKj4obV9wb3NpdGlvbkFuaW1hdGlvbi5hbmltYXRpb25BdChYQW5pbWF0aW9u
SW5kZXgpKTsKK30KIAotICAgIC8vIEhvcml6b250YWwgY29ycmVjdGlvbi4KLSAgICBpZiAoY29u
dGVudEdlb21ldHJ5LndpZHRoKCkgPCBtX3ZpZXdwb3J0LT53aWR0aCgpKQotICAgICAgICBuZXdQ
b3Muc2V0WCgobV92aWV3cG9ydC0+d2lkdGgoKSAtIGNvbnRlbnRHZW9tZXRyeS53aWR0aCgpKSAv
IDIpOwotICAgIGVsc2UgewotICAgICAgICBuZXdQb3Muc2V0WChxTWluKDAuLCBuZXdQb3MueCgp
KSk7Ci0gICAgICAgIGNvbnN0IHFyZWFsIHJpZ2h0U2lkZUdhcCA9IG1fdmlld3BvcnQtPmJvdW5k
aW5nUmVjdCgpLnJpZ2h0KCkgLSBjb250ZW50R2VvbWV0cnkucmlnaHQoKTsKLSAgICAgICAgaWYg
KHJpZ2h0U2lkZUdhcCA+IDAuKQotICAgICAgICAgICAgbmV3UG9zLnNldFgobmV3UG9zLngoKSAr
IHJpZ2h0U2lkZUdhcCk7Ci0gICAgfQoraW5saW5lIFFQcm9wZXJ0eUFuaW1hdGlvbiYgVmlld3Bv
cnRJbnRlcmFjdGlvbkVuZ2luZTo6eUFuaW1hdGlvbigpCit7CisgICAgcmV0dXJuICpzdGF0aWNf
Y2FzdDxRUHJvcGVydHlBbmltYXRpb24qPihtX3Bvc2l0aW9uQW5pbWF0aW9uLmFuaW1hdGlvbkF0
KFlBbmltYXRpb25JbmRleCkpOworfQogCi0gICAgLy8gVmVydGljYWwgY29ycmVjdGlvbi4KLSAg
ICBpZiAoY29udGVudEdlb21ldHJ5LmhlaWdodCgpIDwgbV92aWV3cG9ydC0+aGVpZ2h0KCkpCi0g
ICAgICAgIG5ld1Bvcy5zZXRZKDApOwotICAgIGVsc2UgewotICAgICAgICBuZXdQb3Muc2V0WShx
TWluKDAuLCBuZXdQb3MueSgpKSk7Ci0gICAgICAgIGNvbnN0IHFyZWFsIGJvdHRvbVNpZGVHYXAg
PSBtX3ZpZXdwb3J0LT5ib3VuZGluZ1JlY3QoKS5ib3R0b20oKSAtIGNvbnRlbnRHZW9tZXRyeS5i
b3R0b20oKTsKLSAgICAgICAgaWYgKGJvdHRvbVNpZGVHYXAgPiAwLikKLSAgICAgICAgICAgIG5l
d1Bvcy5zZXRZKG5ld1Bvcy55KCkgKyBib3R0b21TaWRlR2FwKTsKK3ZvaWQgVmlld3BvcnRJbnRl
cmFjdGlvbkVuZ2luZTo6c3RvcEFuaW1hdGlvbnMoKQoreworICAgIG1fcG9zaXRpb25BbmltYXRp
b24uc3RvcCgpOworICAgIG1fc2NhbGVBbmltYXRpb24uc3RvcCgpOworICAgIG1faGlzdG9yeS5y
ZXNldCgpOworfQorCit2b2lkIFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnN0YXJ0UGFuVGhy
b3dBbmltYXRpb24oKQoreworICAgIGlmIChtX3NjYWxlQW5pbWF0aW9uLnN0YXRlKCkgPT0gUUFi
c3RyYWN0QW5pbWF0aW9uOjpSdW5uaW5nKQorICAgICAgICByZXR1cm47CisKKworICAgIGRvdWJs
ZSBzZWNvbmRzU2luY2VMYXN0RXZlbnQgPSBXVEY6OmN1cnJlbnRUaW1lKCkgLSBtX2hpc3Rvcnku
bGFzdCgpLmZpcnN0OworCisgICAgaWYgKHN0YXRpY19jYXN0PGludD4oc2Vjb25kc1NpbmNlTGFz
dEV2ZW50ICogMTAwMCkgPiBwYW5UaHJvd0FuaW1hdGlvblRocmVzaG9sZCkgeworICAgICAgICBh
bmltYXRlQ29udGVudFRvQm91bmRlZEdlb21ldHJ5SWZOZWVkZWQoY29udGVudFJlY3RJblZpZXdw
b3J0Q29vcmRpbmF0ZShtX2NvbnRlbnQsIG1fdmlld3BvcnQpKTsKKyAgICAgICAgcmV0dXJuOwog
ICAgIH0KIAotICAgIGlmIChuZXdQb3MgIT0gbV9jb250ZW50LT5wb3MoKSkKLSAgICAgICAgLy8g
RklYTUU6IERvIHlvdSBrbm93IHdoYXQgQU5JTUFURSBtZWFucz8KLSAgICAgICAgbV9jb250ZW50
LT5zZXRQb3MobmV3UG9zKTsKKyAgICBkb3VibGUgbW9kaWZpZXIgPSAobV9jb250ZW50LT5zY2Fs
ZSgpID4gMS4pID8gc3FydChwb3cobV9oaXN0b3J5Lmxhc3QoKS5zZWNvbmQueCgpLCAyKSArIHBv
dyhtX2hpc3RvcnkubGFzdCgpLnNlY29uZC55KCksIDIpKSA6IG1fY29udGVudC0+c2NhbGUoKTsK
KyAgICBRUG9pbnRGIHRyYWplY3RvcnkgPSBtX2hpc3RvcnkuY2FsY3VsYXRlVGhyb3dUcmFqZWN0
b3J5KCkgKiBtb2RpZmllcjsKKworICAgIGlmIChtX2hvcml6b250YWxQYW5uaW5nRGlzYWJsZWQp
CisgICAgICAgIHRyYWplY3Rvcnkuc2V0WCgwKTsKKworICAgIG1fcG9zaXRpb25BbmltYXRpb24u
c3RvcCgpOworICAgIG1fc2NhbGVBbmltYXRpb24uc3RvcCgpOworCisgICAgUVJlY3RGIHJlcXVl
c3RlZEdlb21ldHJ5ID0gY29udGVudFJlY3RJblZpZXdwb3J0Q29vcmRpbmF0ZShtX2NvbnRlbnQs
IG1fdmlld3BvcnQpOworICAgIHJlcXVlc3RlZEdlb21ldHJ5Lm1vdmVUbyhyZXF1ZXN0ZWRHZW9t
ZXRyeS50b3BMZWZ0KCkgLSB0cmFqZWN0b3J5KTsKKworICAgIGFuaW1hdGVDb250ZW50VG9Cb3Vu
ZGVkR2VvbWV0cnlJZk5lZWRlZChyZXF1ZXN0ZWRHZW9tZXRyeSwgbWVkaXVtRHVyYXRpb24pOwog
fQogCiB2b2lkIFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OmFuaW1hdGVDb250ZW50U2NhbGVJ
bnRvQm91bmRhcmllc0lmTmVlZGVkKCkKIHsKKyAgICBtX3NjYWxlQW5pbWF0aW9uLnN0b3AoKTsK
KyAgICBtX3NjYWxlQW5pbWF0aW9uLnNldER1cmF0aW9uKHNob3J0RHVyYXRpb24pOworCiAgICAg
Y29uc3QgcXJlYWwgY3VycmVudFNjYWxlID0gbV9jb250ZW50LT5zY2FsZSgpOwogICAgIGNvbnN0
IHFyZWFsIGJvdW5kZWRTY2FsZSA9IHFCb3VuZChtX2NvbnN0cmFpbnRzLm1pbmltdW1TY2FsZSwg
Y3VycmVudFNjYWxlLCBtX2NvbnN0cmFpbnRzLm1heGltdW1TY2FsZSk7CisgICAgY29uc3QgUVBv
aW50RiBvcmlnaW5hbFBvc2l0aW9uID0gbV9jb250ZW50LT5wb3MoKTsKKwogICAgIGlmIChjdXJy
ZW50U2NhbGUgIT0gYm91bmRlZFNjYWxlKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBEbyB5b3Uga25v
dyB3aGF0IEFOSU1BVEUgbWVhbnM/CisgICAgICAgIG1fc2NhbGVBbmltYXRpb24uc2V0RW5kVmFs
dWUoYm91bmRlZFNjYWxlKTsKKyAgICAgICAgbV91c2VySW50ZXJhY3Rpb25GbGFncyB8PSBVc2Vy
SGFzU2NhbGVkQ29udGVudDsKKworICAgICAgICAvLyBTY2FsZSB0aGUgY29udGVudCB0byBnZXQg
dGhlIHNjYWxlZCBnZW9tZXRyeS4KICAgICAgICAgY29uc3QgUVBvaW50RiBjZW50ZXJPZkludGVy
ZXN0ID0gdmlzaWJsZVJlY3RJbkNvbnRlbnRDb29yZGluYXRlKG1fY29udGVudCwgbV92aWV3cG9y
dCkuY2VudGVyKCk7CiAgICAgICAgIHNjYWxlQ29udGVudChjZW50ZXJPZkludGVyZXN0LCBib3Vu
ZGVkU2NhbGUpOwotICAgIH0KKyAgICAgICAgY29uc3QgUVJlY3RGIHNjYWxlZEdlb21ldHJ5ID0g
Y29udGVudFJlY3RJblZpZXdwb3J0Q29vcmRpbmF0ZShtX2NvbnRlbnQsIG1fdmlld3BvcnQpOwor
CisgICAgICAgIC8vIFJldmVydCB0aGUgY2hhbmdlIHRvIGFuaW1hdGUgc2NhbGUgYW5kIHBvc2l0
aW9uIHRvZ2V0aGVyCisgICAgICAgIG1fY29udGVudC0+c2V0U2NhbGUoY3VycmVudFNjYWxlKTsK
KyAgICAgICAgbV9jb250ZW50LT5zZXRQb3Mob3JpZ2luYWxQb3NpdGlvbik7CisKKyAgICAgICAg
YW5pbWF0ZUNvbnRlbnRUb0JvdW5kZWRHZW9tZXRyeUlmTmVlZGVkKHNjYWxlZEdlb21ldHJ5KTsK
KyAgICAgICAgbV9zY2FsZUFuaW1hdGlvbi5zdGFydCgpOworICAgIH0gZWxzZQorICAgICAgICBj
b250ZW50Vmlld3BvcnRDaGFuZ2VkKCk7CiB9CiAKIHZvaWQgVmlld3BvcnRJbnRlcmFjdGlvbkVu
Z2luZTo6c2NhbGVDb250ZW50KGNvbnN0IFFQb2ludEYmIGNlbnRlckluQ29udGVudENvb3JkaW5h
dGUsIHFyZWFsIHNjYWxlKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0
L1ZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUuaCBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9x
dC9WaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmgKaW5kZXggNTQ0MDg3ZS4uYzlmYTM3MCAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1ZpZXdwb3J0SW50ZXJhY3Rpb25F
bmdpbmUuaAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvVmlld3BvcnRJbnRlcmFj
dGlvbkVuZ2luZS5oCkBAIC0yNCwxNiArMjQsMTggQEAKICNpbmNsdWRlICJPd25QdHIuaCIKICNp
bmNsdWRlICJxd2Via2l0Z2xvYmFsLmgiCiAjaW5jbHVkZSA8UXRDb3JlL1FPYmplY3Q+CisjaW5j
bHVkZSA8UXRDb3JlL1FQb2ludEY+CisjaW5jbHVkZSA8UXRDb3JlL1FWZWN0b3I+CisjaW5jbHVk
ZSA8UXRDb3JlL1FQcm9wZXJ0eUFuaW1hdGlvbj4KKyNpbmNsdWRlIDxRdENvcmUvUVBhcmFsbGVs
QW5pbWF0aW9uR3JvdXA+CisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KIAogUVRfQkVHSU5f
TkFNRVNQQUNFCi1jbGFzcyBRUG9pbnRGOwogY2xhc3MgUVNHSXRlbTsKIFFUX0VORF9OQU1FU1BB
Q0UKIAogbmFtZXNwYWNlIFdlYktpdCB7CiAKLWNsYXNzIFZpZXdwb3J0VXBkYXRlR3VhcmQ7Ci0K
IGNsYXNzIFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUgOiBwdWJsaWMgUU9iamVjdCB7CiAgICAg
UV9PQkpFQ1QKIApAQCAtNTksMTMgKzYxLDE0IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldENvbnN0
cmFpbnRzKGNvbnN0IENvbnN0cmFpbnRzJik7CiAKICAgICB2b2lkIHBhbkdlc3R1cmVTdGFydGVk
KCk7Ci0gICAgdm9pZCBwYW5HZXN0dXJlUmVxdWVzdFVwZGF0ZShxcmVhbCBkZWx0YVgsIHFyZWFs
IGRlbHRhWSk7CisgICAgdm9pZCBwYW5HZXN0dXJlUmVxdWVzdFVwZGF0ZShxcmVhbCBkZWx0YVgs
IHFyZWFsIGRlbHRhWSwgZG91YmxlIHRpbWVzdGFtcCk7CiAgICAgdm9pZCBwYW5HZXN0dXJlQ2Fu
Y2VsbGVkKCk7CiAgICAgdm9pZCBwYW5HZXN0dXJlRW5kZWQoKTsKIAogICAgIHZvaWQgcGluY2hH
ZXN0dXJlU3RhcnRlZCgpOwogICAgIHZvaWQgcGluY2hHZXN0dXJlUmVxdWVzdFVwZGF0ZShjb25z
dCBRUG9pbnRGJiBwaW5jaENlbnRlckluQ29udGVudENvb3JkaW5hdGUsIHFyZWFsIHRvdGFsU2Nh
bGVGYWN0b3IpOwogICAgIHZvaWQgcGluY2hHZXN0dXJlRW5kZWQoKTsKKyAgICB2b2lkIHN0b3BB
bmltYXRpb25zKCk7CiAKIFFfU0lHTkFMUzoKICAgICB2b2lkIHZpZXdwb3J0VXBkYXRlUmVxdWVz
dGVkKCk7CkBAIC03NCwzNCArNzcsNzYgQEAgUV9TSUdOQUxTOgogcHJpdmF0ZSBRX1NMT1RTOgog
ICAgIC8vIFJlc3BvbmQgdG8gY2hhbmdlcyBvZiBjb250ZW50IHRoYXQgYXJlIG5vdCBkcml2ZW4g
YnkgdXMsIGxpa2UgdGhlIHBhZ2UgcmVzaXppbmcgaXRzZWxmLgogICAgIHZvaWQgY29udGVudFZp
ZXdwb3J0Q2hhbmdlZCgpOworICAgIHZvaWQgYW5pbWF0aW9uRmluaXNoZWQoKTsKIAogcHJpdmF0
ZToKICAgICB2b2lkIHVwZGF0ZUNvbnRlbnRJZk5lZWRlZCgpOwogICAgIHZvaWQgdXBkYXRlQ29u
dGVudFNjYWxlSWZOZWVkZWQoKTsKICAgICB2b2lkIHVwZGF0ZUNvbnRlbnRQb3NpdGlvbklmTmVl
ZGVkKCk7CiAKLSAgICB2b2lkIGFuaW1hdGVDb250ZW50SW50b0JvdW5kYXJpZXNJZk5lZWRlZCgp
OwotICAgIHZvaWQgYW5pbWF0ZUNvbnRlbnRQb3NpdGlvbkludG9Cb3VuZGFyaWVzSWZOZWVkZWQo
KTsKICAgICB2b2lkIGFuaW1hdGVDb250ZW50U2NhbGVJbnRvQm91bmRhcmllc0lmTmVlZGVkKCk7
CisgICAgdm9pZCBhbmltYXRlQ29udGVudFRvQm91bmRlZEdlb21ldHJ5SWZOZWVkZWQoY29uc3Qg
UVJlY3RGJiBjb250ZW50R2VvbWV0cnksIGludCBkdXJhdGlvbik7CiAKLSAgICB2b2lkIHNjYWxl
Q29udGVudChjb25zdCBRUG9pbnRGJiBjZW50ZXJJbkNvbnRlbnRDb29yZGluYXRlLCBxcmVhbCBz
Y2FsZSk7CisgICAgUVByb3BlcnR5QW5pbWF0aW9uJiB4QW5pbWF0aW9uKCk7CisgICAgUVByb3Bl
cnR5QW5pbWF0aW9uJiB5QW5pbWF0aW9uKCk7CisgICAgdm9pZCBzdGFydFBhblRocm93QW5pbWF0
aW9uKCk7CiAKLSAgICBmcmllbmQgY2xhc3MgVmlld3BvcnRVcGRhdGVHdWFyZDsKKyAgICB2b2lk
IHNjYWxlQ29udGVudChjb25zdCBRUG9pbnRGJiBjZW50ZXJJbkNvbnRlbnRDb29yZGluYXRlLCBx
cmVhbCBzY2FsZSk7CiAKICAgICBjb25zdCBRU0dJdGVtKiBjb25zdCBtX3ZpZXdwb3J0OwogICAg
IFFTR0l0ZW0qIGNvbnN0IG1fY29udGVudDsKIAogICAgIENvbnN0cmFpbnRzIG1fY29uc3RyYWlu
dHM7Ci0gICAgYm9vbCBtX2lzVXBkYXRpbmdDb250ZW50OwotICAgIE93blB0cjxWaWV3cG9ydFVw
ZGF0ZUd1YXJkPiBtX3BpbmNoVmlld3BvcnRVcGRhdGVEZWZlcnJlcjsKKwogICAgIGVudW0gVXNl
ckludGVyYWN0aW9uRmxhZyB7CiAgICAgICAgIFVzZXJIYXNOb3RJbnRlcmFjdGVkV2l0aENvbnRl
bnQgPSAwLAogICAgICAgICBVc2VySGFzTW92ZWRDb250ZW50ID0gMSwKICAgICAgICAgVXNlckhh
c1NjYWxlZENvbnRlbnQgPSAyCiAgICAgfTsKKwogICAgIFFfREVDTEFSRV9GTEFHUyhVc2VySW50
ZXJhY3Rpb25GbGFncywgVXNlckludGVyYWN0aW9uRmxhZyk7CiAgICAgVXNlckludGVyYWN0aW9u
RmxhZ3MgbV91c2VySW50ZXJhY3Rpb25GbGFnczsKIAorICAgIHN0cnVjdCBUcmFqZWN0b3J5SGlz
dG9yeSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qgc2l6ZSA9IDI7CisKKyAgICAgICAg
VHJhamVjdG9yeUhpc3RvcnkoKQorICAgICAgICAgICAgOiBtX3RpbWVzdGFtcGVkVmVjdG9ycyhz
aXplKQorICAgICAgICAgICAgLCBtX3BvaW50ZXIoMCkKKyAgICAgICAgeworICAgICAgICAgICAg
cmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRkKGRvdWJsZSB0aW1lc3RhbXAs
IGNvbnN0IFFQb2ludEYmIHZlY3RvcikKKyAgICAgICAgeworICAgICAgICAgICAgbV90aW1lc3Rh
bXBlZFZlY3RvcnNbbV9wb2ludGVyKytdID0gcU1ha2VQYWlyKHRpbWVzdGFtcCwgdmVjdG9yKTsK
KyAgICAgICAgICAgIG1fcG9pbnRlciAlPSBzaXplOworICAgICAgICB9CisKKyAgICAgICAgY29u
c3QgUVBhaXI8ZG91YmxlLCBRUG9pbnRGPiYgbGFzdCgpIGNvbnN0CisgICAgICAgIHsKKyAgICAg
ICAgICAgIHJldHVybiBtX3RpbWVzdGFtcGVkVmVjdG9yc1soc2l6ZSArIG1fcG9pbnRlciAtIDEp
ICUgc2l6ZV07CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlc2V0KCkKKyAgICAgICAgewor
ICAgICAgICAgICAgbV9wb2ludGVyID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgc2l6ZTsgKytpKQorICAgICAgICAgICAgICAgIG1fdGltZXN0YW1wZWRWZWN0b3JzW2ldID0g
cU1ha2VQYWlyKDAuLCBRUG9pbnRGKCkpOworICAgICAgICB9CisKKyAgICAgICAgUVBvaW50RiBj
YWxjdWxhdGVUaHJvd1RyYWplY3RvcnkoKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFFWZWN0
b3I8UVBhaXI8ZG91YmxlLCBRUG9pbnRGPiA+IG1fdGltZXN0YW1wZWRWZWN0b3JzOworICAgICAg
ICBpbnQgbV9wb2ludGVyOworICAgIH07CisKKyAgICBUcmFqZWN0b3J5SGlzdG9yeSBtX2hpc3Rv
cnk7CisgICAgUVByb3BlcnR5QW5pbWF0aW9uIG1fc2NhbGVBbmltYXRpb247CisgICAgUVBhcmFs
bGVsQW5pbWF0aW9uR3JvdXAgbV9wb3NpdGlvbkFuaW1hdGlvbjsKKyAgICBib29sIG1faG9yaXpv
bnRhbFBhbm5pbmdEaXNhYmxlZDsKKwogICAgIHFyZWFsIG1fcGluY2hTdGFydFNjYWxlOwogfTsK
IApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L3F0b3VjaHdlYnBhZ2Vw
cm94eS5jcHAgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvcXRvdWNod2VicGFnZXByb3h5
LmNwcAppbmRleCBjMjkyMWFmLi44NjYwM2U0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvcXQvcXRvdWNod2VicGFnZXByb3h5LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvcXQvcXRvdWNod2VicGFnZXByb3h5LmNwcApAQCAtNTgsNyArNTgsNyBAQCB2b2lk
IFFUb3VjaFdlYlBhZ2VQcm94eTo6ZG9uZVdpdGhUb3VjaEV2ZW50KGNvbnN0IE5hdGl2ZVdlYlRv
dWNoRXZlbnQmIGV2ZW50LCBibwogICAgICAgICBtX3Bhbkdlc3R1cmVSZWNvZ25pemVyLnJlc2V0
KCk7CiAgICAgICAgIG1fcGluY2hHZXN0dXJlUmVjb2duaXplci5yZXNldCgpOwogICAgIH0gZWxz
ZSB7Ci0gICAgICAgIG1fcGFuR2VzdHVyZVJlY29nbml6ZXIucmVjb2duaXplKGV2ZW50Lm5hdGl2
ZUV2ZW50KCkpOworICAgICAgICBtX3Bhbkdlc3R1cmVSZWNvZ25pemVyLnJlY29nbml6ZShldmVu
dC5uYXRpdmVFdmVudCgpLCBldmVudC50aW1lc3RhbXAoKSk7CiAgICAgICAgIG1fcGluY2hHZXN0
dXJlUmVjb2duaXplci5yZWNvZ25pemUoZXZlbnQubmF0aXZlRXZlbnQoKSk7CiAgICAgfQogfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>109228</attachid>
            <date>2011-09-29 17:44:24 -0700</date>
            <delta_ts>2011-10-24 06:00:58 -0700</delta_ts>
            <desc>zoom animation patch (not for review)</desc>
            <filename>zoomAnimation.diff</filename>
            <type>text/plain</type>
            <size>12458</size>
            <attacher name="Misha">mtutunik</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvcXRvdWNod2Vidmll
dy5jcHAgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3F0b3VjaHdlYnZpZXcuY3Bw
CmluZGV4IGViYjYyMDkuLmQ2ZWVlNjIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9BUEkvcXQvcXRvdWNod2Vidmlldy5jcHAKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0FQSS9xdC9xdG91Y2h3ZWJ2aWV3LmNwcApAQCAtMzIsNiArMzIsOCBAQAogI2luY2x1ZGUg
IldlYlByZWZlcmVuY2VzLmgiCiAjaW5jbHVkZSAiV0tQYWdlR3JvdXAuaCIKIAorI2luY2x1ZGUg
PFFEZWJ1Zz4KKwogdXNpbmcgbmFtZXNwYWNlIFdlYktpdDsKIAogUVRvdWNoV2ViVmlld1ByaXZh
dGU6OlFUb3VjaFdlYlZpZXdQcml2YXRlKFFUb3VjaFdlYlZpZXcqIHEsIFFUb3VjaFdlYlZpZXc6
OlZpZXdUeXBlIHR5cGUsIHVpbnQ2NF90IHBhZ2VHcm91cElEKQpAQCAtNTIsNiArNTQsNyBAQCB2
b2lkIFFUb3VjaFdlYlZpZXdQcml2YXRlOjppbml0KCkKIAogICAgIFFPYmplY3Q6OmNvbm5lY3Qo
JmludGVyYWN0aW9uRW5naW5lLCBTSUdOQUwodmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQoKSksIHEs
IFNMT1QoX3Ffdmlld3BvcnRVcGRhdGVkKCkpKTsKICAgICBRT2JqZWN0Ojpjb25uZWN0KCZpbnRl
cmFjdGlvbkVuZ2luZSwgU0lHTkFMKHZpZXdwb3J0VHJhamVjdG9yeVZlY3RvckNoYW5nZWQoY29u
c3QgUVBvaW50RiYpKSwgcSwgU0xPVChfcV92aWV3cG9ydFRyYWplY3RvcnlWZWN0b3JDaGFuZ2Vk
KGNvbnN0IFFQb2ludEYmKSkpOworICAgIFFPYmplY3Q6OmNvbm5lY3QoJmludGVyYWN0aW9uRW5n
aW5lLCBTSUdOQUwoY29udGVudFVwZGF0ZXNFbmFibGVkKGJvb2wpKSwgcSwgU0xPVChfcV9jb250
ZW50VXBkYXRlc0VuYWJsZWQoYm9vbCkpKTsKIAogICAgIGlmICh0eXBlID09IFFUb3VjaFdlYlZp
ZXc6OldlYkJyb3dzZXIpIHsKIApAQCAtMTAwLDYgKzEwMywxNiBAQCB2b2lkIFFUb3VjaFdlYlZp
ZXdQcml2YXRlOjpfcV92aWV3cG9ydFRyYWplY3RvcnlWZWN0b3JDaGFuZ2VkKGNvbnN0IFFQb2lu
dEYmIHRyYQogICAgIHBhZ2Uuc2V0VmlzaWJsZUNvbnRlbnRSZWN0VHJhamVjdG9yeVZlY3Rvcih0
cmFqZWN0b3J5VmVjdG9yKTsKIH0KIAordm9pZCBRVG91Y2hXZWJWaWV3UHJpdmF0ZTo6X3FfY29u
dGVudFVwZGF0ZXNFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCkKKyAg
ICAgICAgcURlYnVnKCkgPDwgIlFUb3VjaFdlYlZpZXdQcml2YXRlOjpfcV9jb250ZW50VXBkYXRl
c0VuYWJsZWQ6IHNob3VsZCBlbmFibGUgdGlsZXMgaGVyZS4uLiI7CisgICAgICAgIC8vcGFnZS5k
cmF3aW5nQXJlYSgpLT5yZXN1bWVQYWludGluZygpOworICAgIGVsc2UKKyAgICAgICAgcURlYnVn
KCkgPDwgIlFUb3VjaFdlYlZpZXdQcml2YXRlOjpfcV9jb250ZW50VXBkYXRlc0VuYWJsZWQ6IHNo
b3VsZCBkaXNhYmxlIHRpbGVzIGhlcmUuLi4iOworICAgICAgICAvL3BhZ2UuZHJhd2luZ0FyZWEo
KS0+c3VzcGVuZFBhaW50aW5nKCk7Cit9CisKIHZvaWQgUVRvdWNoV2ViVmlld1ByaXZhdGU6OnVw
ZGF0ZVZpZXdwb3J0Q29uc3RyYWludHMoKQogewogICAgIFFTaXplIGF2YWlsYWJsZVNpemUgPSBx
LT5ib3VuZGluZ1JlY3QoKS5zaXplKCkudG9TaXplKCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3F0b3VjaHdlYnZpZXcuaCBiL1NvdXJjZS9XZWJLaXQyL1VJ
UHJvY2Vzcy9BUEkvcXQvcXRvdWNod2Vidmlldy5oCmluZGV4IGIxNmVjNzIuLmNjM2Q5MTIgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvcXRvdWNod2Vidmlldy5o
CisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvcXRvdWNod2Vidmlldy5oCkBA
IC02MSw2ICs2MSw3IEBAIHByb3RlY3RlZDoKIHByaXZhdGU6CiAgICAgUV9QUklWQVRFX1NMT1Qo
ZCwgdm9pZCBfcV92aWV3cG9ydFVwZGF0ZWQoKSk7CiAgICAgUV9QUklWQVRFX1NMT1QoZCwgdm9p
ZCBfcV92aWV3cG9ydFRyYWplY3RvcnlWZWN0b3JDaGFuZ2VkKGNvbnN0IFFQb2ludEYmKSk7Cisg
ICAgUV9QUklWQVRFX1NMT1QoZCwgdm9pZCBfcV9jb250ZW50VXBkYXRlc0VuYWJsZWQoYm9vbCkp
OwogCiAgICAgZnJpZW5kIGNsYXNzIFdlYktpdDo6VG91Y2hWaWV3SW50ZXJmYWNlOwogICAgIFFU
b3VjaFdlYlZpZXdQcml2YXRlICpkOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9j
ZXNzL0FQSS9xdC9xdG91Y2h3ZWJ2aWV3X3AuaCBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9B
UEkvcXQvcXRvdWNod2Vidmlld19wLmgKaW5kZXggY2IxNTYzNi4uNDJiMjI1NiAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9xdC9xdG91Y2h3ZWJ2aWV3X3AuaAorKysg
Yi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3F0b3VjaHdlYnZpZXdfcC5oCkBAIC0z
OSw2ICszOSw3IEBAIHB1YmxpYzoKICAgICB2b2lkIGxvYWREaWRDb21taXQoKTsKICAgICB2b2lk
IF9xX3ZpZXdwb3J0VXBkYXRlZCgpOwogICAgIHZvaWQgX3Ffdmlld3BvcnRUcmFqZWN0b3J5VmVj
dG9yQ2hhbmdlZChjb25zdCBRUG9pbnRGJik7CisgICAgdm9pZCBfcV9jb250ZW50VXBkYXRlc0Vu
YWJsZWQoYm9vbCBlbmFibGVkKTsKICAgICB2b2lkIHVwZGF0ZVZpZXdwb3J0Q29uc3RyYWludHMo
KTsKIAogICAgIHVpbnQ2NF90IHBhZ2VHcm91cChRVG91Y2hXZWJWaWV3OjpWaWV3VHlwZSk7CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvVmlld3BvcnRJbnRlcmFjdGlv
bkVuZ2luZS5jcHAgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvVmlld3BvcnRJbnRlcmFj
dGlvbkVuZ2luZS5jcHAKaW5kZXggYWNjYjE0OC4uY2FiMTM4MyAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL3F0L1ZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUuY3BwCisrKyBi
L1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9WaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmNw
cApAQCAtMzksNiArMzksMTIgQEAgc3RhdGljIGlubGluZSBRUmVjdEYgY29udGVudFJlY3RJblZp
ZXdwb3J0Q29vcmRpbmF0ZShjb25zdCBRU0dJdGVtKiBjb250ZW50LCBjb24KICAgICByZXR1cm4g
dmlld3BvcnQtPm1hcFJlY3RGcm9tSXRlbShjb250ZW50LCBjb250ZW50LT5ib3VuZGluZ1JlY3Qo
KSk7CiB9CiAKKworc3RhdGljIGlubGluZSBRUG9pbnRGIHZpZXdwb3J0UG9pbnRJbkNvbnRlbnRD
b29yZGluYXRlKGNvbnN0IFFTR0l0ZW0qIGNvbnRlbnQsIGNvbnN0IFFTR0l0ZW0qIHZpZXdwb3J0
LCBjb25zdCBRUG9pbnRGJiBwb3MpCit7CisgICAgcmV0dXJuIGNvbnRlbnQtPm1hcEZyb21JdGVt
KHZpZXdwb3J0LCBwb3MpOworfQorCiAvLyBVcGRhdGluZyBjb250ZW50IHByb3BlcnRpZXMgY2F1
c2UgdGhlIG5vdGlmeSBzaWduYWxzIHRvIGJlIHNlbnQgYnkgdGhlIGNvbnRlbnQgaXRlbSBpdHNl
bGYuCiAvLyBTaW5jZSB3ZSBtYW5hZ2UgdGhvc2UgZGlmZmVyZW50bHksIHdlIGRvIG5vdCB3YW50
IHRvIHJlc3BvbmQKIC8vIHRvIHRoZW0gd2hlbiB3ZSBhcmUgdGhlIG9uZSBjaGFuZ2luZyB0aGUg
Y29udGVudC4KQEAgLTUzLDMxICs1OSwxOCBAQCBwdWJsaWM6CiAgICAgVmlld3BvcnRVcGRhdGVH
dWFyZChWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lKiB2aWV3cG9ydEludGVyYWN0aW9uRW5naW5l
KQogICAgICAgICA6IHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUodmlld3BvcnRJbnRlcmFjdGlv
bkVuZ2luZSkKICAgICAgICAgLCB3YXNVcGRhdGluZ0NvbnRlbnQodmlld3BvcnRJbnRlcmFjdGlv
bkVuZ2luZS0+bV9pc1VwZGF0aW5nQ29udGVudCkKLSAgICAgICAgLCBwcmV2aW91c1Bvc2l0aW9u
KHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1fY29udGVudC0+cG9zKCkpCi0gICAgICAgICwg
cHJldmlvdXNTaXplKHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1fY29udGVudC0+d2lkdGgo
KSwgdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+bV9jb250ZW50LT5oZWlnaHQoKSkKLSAgICAg
ICAgLCBwcmV2aW91c1NjYWxlKHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1fY29udGVudC0+
c2NhbGUoKSkKICAgICB7CiAgICAgICAgIHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1faXNV
cGRhdGluZ0NvbnRlbnQgPSB0cnVlOwogICAgIH0KIAogICAgIH5WaWV3cG9ydFVwZGF0ZUd1YXJk
KCkKICAgICB7Ci0gICAgICAgIGlmICghd2FzVXBkYXRpbmdDb250ZW50KSB7Ci0gICAgICAgICAg
ICBpZiAocHJldmlvdXNQb3NpdGlvbiAhPSB2aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLT5tX2Nv
bnRlbnQtPnBvcygpCi0gICAgICAgICAgICAgICAgICAgIHx8IHByZXZpb3VzU2l6ZS53aWR0aCgp
ICE9IHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1fY29udGVudC0+d2lkdGgoKQotICAgICAg
ICAgICAgICAgICAgICB8fCBwcmV2aW91c1NpemUuaGVpZ2h0KCkgIT0gdmlld3BvcnRJbnRlcmFj
dGlvbkVuZ2luZS0+bV9jb250ZW50LT5oZWlnaHQoKQotICAgICAgICAgICAgICAgICAgICB8fCBw
cmV2aW91c1NjYWxlICE9IHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1fY29udGVudC0+c2Nh
bGUoKSkKLSAgICAgICAgICAgICAgICBlbWl0IHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPnZp
ZXdwb3J0VXBkYXRlUmVxdWVzdGVkKCk7Ci0gICAgICAgIH0KICAgICAgICAgdmlld3BvcnRJbnRl
cmFjdGlvbkVuZ2luZS0+bV9pc1VwZGF0aW5nQ29udGVudCA9IHdhc1VwZGF0aW5nQ29udGVudDsK
ICAgICB9CiAKIHByaXZhdGU6CiAgICAgVmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZSogY29uc3Qg
dmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTsKICAgICBjb25zdCBib29sIHdhc1VwZGF0aW5nQ29u
dGVudDsKLSAgICBjb25zdCBRUG9pbnRGIHByZXZpb3VzUG9zaXRpb247Ci0gICAgY29uc3QgUVNp
emVGIHByZXZpb3VzU2l6ZTsKLSAgICBjb25zdCBxcmVhbCBwcmV2aW91c1NjYWxlOwogfTsKIAog
Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZShjb25z
dCBRU0dJdGVtKiB2aWV3cG9ydCwgUVNHSXRlbSogY29udGVudCkKQEAgLTg1LDYgKzc4LDcgQEAg
Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZShjb25z
dCBRU0dJdGVtKiB2aWV3cG9ydCwgUVMKICAgICAsIG1fY29udGVudChjb250ZW50KQogICAgICwg
bV9pc1VwZGF0aW5nQ29udGVudChmYWxzZSkKICAgICAsIG1fcGluY2hTdGFydFNjYWxlKDEuZikK
KyAgICAsIG1fc2NhbGVBbmltYXRpb24odGhpcywgInZpZXdhYmxlUmVjdCIpCiB7CiAgICAgcmVz
ZXQoKTsKICAgICBjb25uZWN0KG1fY29udGVudCwgU0lHTkFMKHhDaGFuZ2VkKCkpLCB0aGlzLCBT
TE9UKGNvbnRlbnRWaWV3cG9ydENoYW5nZWQoKSksIFF0OjpEaXJlY3RDb25uZWN0aW9uKTsKQEAg
LTkyLDEwICs4NiwxNSBAQCBWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpWaWV3cG9ydEludGVy
YWN0aW9uRW5naW5lKGNvbnN0IFFTR0l0ZW0qIHZpZXdwb3J0LCBRUwogICAgIGNvbm5lY3QobV9j
b250ZW50LCBTSUdOQUwod2lkdGhDaGFuZ2VkKCkpLCB0aGlzLCBTTE9UKGNvbnRlbnRWaWV3cG9y
dENoYW5nZWQoKSksIFF0OjpEaXJlY3RDb25uZWN0aW9uKTsKICAgICBjb25uZWN0KG1fY29udGVu
dCwgU0lHTkFMKGhlaWdodENoYW5nZWQoKSksIHRoaXMsIFNMT1QoY29udGVudFZpZXdwb3J0Q2hh
bmdlZCgpKSwgUXQ6OkRpcmVjdENvbm5lY3Rpb24pOwogICAgIGNvbm5lY3QobV9jb250ZW50LCBT
SUdOQUwoc2NhbGVDaGFuZ2VkKCkpLCB0aGlzLCBTTE9UKGNvbnRlbnRWaWV3cG9ydENoYW5nZWQo
KSksIFF0OjpEaXJlY3RDb25uZWN0aW9uKTsKKworICAgIGNvbm5lY3QoJm1fc2NhbGVBbmltYXRp
b24sIFNJR05BTChzdGF0ZUNoYW5nZWQoUUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSwgUUFic3Ry
YWN0QW5pbWF0aW9uOjpTdGF0ZSkpLAorICAgICAgICAgICAgdGhpcywgU0xPVChzY2FsZUFuaW1h
dGlvblN0YXRlQ2hhbmdlZChRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlLCBRQWJzdHJhY3RBbmlt
YXRpb246OlN0YXRlKSkpOworCiB9CiAKIFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6On5WaWV3
cG9ydEludGVyYWN0aW9uRW5naW5lKCkKIHsKKwogfQogCiB2b2lkIFZpZXdwb3J0SW50ZXJhY3Rp
b25FbmdpbmU6OnJlc2V0KCkKQEAgLTEyMSw2ICsxMjAsMTAgQEAgdm9pZCBWaWV3cG9ydEludGVy
YWN0aW9uRW5naW5lOjpzZXRDb25zdHJhaW50cyhjb25zdCBDb25zdHJhaW50cyYgY29uc3RyYWlu
dHMpCiAKICAgICBWaWV3cG9ydFVwZGF0ZUd1YXJkIGd1YXJkKHRoaXMpOwogICAgIG1fY29uc3Ry
YWludHMgPSBjb25zdHJhaW50czsKKworICAgIC8vUkVNT1ZFIE1FIQorICAgIG1fY29uc3RyYWlu
dHMubWF4aW11bVNjYWxlID0gMi4wOworCiAgICAgdXBkYXRlQ29udGVudElmTmVlZGVkKCk7CiB9
CiAKQEAgLTE5Niw3ICsxOTksNyBAQCB2b2lkIFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBp
bmNoR2VzdHVyZUVuZGVkKCkKICAgICB7CiAgICAgICAgIFZpZXdwb3J0VXBkYXRlR3VhcmQgZ3Vh
cmQodGhpcyk7CiAgICAgICAgIC8vIEZJWE1FOiByZXN1bWUgdGhlIGVuZ2luZSBhZnRlciB0aGUg
YW5pbWF0aW9uLgotICAgICAgICBhbmltYXRlQ29udGVudEludG9Cb3VuZGFyaWVzSWZOZWVkZWQo
KTsKKyAgICAgICAgYW5pbWF0ZUNvbnRlbnRTY2FsZUludG9Cb3VuZGFyaWVzSWZOZWVkZWQoKTsK
ICAgICB9CiAgICAgbV9waW5jaFZpZXdwb3J0VXBkYXRlRGVmZXJyZXIuY2xlYXIoKTsKIH0KQEAg
LTI4Nyw4ICsyOTAsOCBAQCB2b2lkIFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OmFuaW1hdGVD
b250ZW50U2NhbGVJbnRvQm91bmRhcmllc0lmTmVlZGVkKCkKICAgICBjb25zdCBxcmVhbCBib3Vu
ZGVkU2NhbGUgPSBxQm91bmQobV9jb25zdHJhaW50cy5taW5pbXVtU2NhbGUsIGN1cnJlbnRTY2Fs
ZSwgbV9jb25zdHJhaW50cy5tYXhpbXVtU2NhbGUpOwogICAgIGlmIChjdXJyZW50U2NhbGUgIT0g
Ym91bmRlZFNjYWxlKSB7CiAgICAgICAgIC8vIEZJWE1FOiBEbyB5b3Uga25vdyB3aGF0IEFOSU1B
VEUgbWVhbnM/Ci0gICAgICAgIGNvbnN0IFFQb2ludEYgY2VudGVyT2ZJbnRlcmVzdCA9IHZpc2li
bGVSZWN0SW5Db250ZW50Q29vcmRpbmF0ZShtX2NvbnRlbnQsIG1fdmlld3BvcnQpLmNlbnRlcigp
OwotICAgICAgICBzY2FsZUNvbnRlbnQoY2VudGVyT2ZJbnRlcmVzdCwgYm91bmRlZFNjYWxlKTsK
KyAgICAgICAgY29uc3QgUVBvaW50RiB2aWV3cG9ydENlbnRlciA9IG1fdmlld3BvcnQtPmJvdW5k
aW5nUmVjdCgpLmNlbnRlcigpOworICAgICAgICBhbmltYXRlU2NhbGVUb0hvdHNwb3Qodmlld3Bv
cnRDZW50ZXIsIGJvdW5kZWRTY2FsZSk7CiAgICAgfQogfQogCkBAIC0zMDAsNiArMzAzLDc3IEBA
IHZvaWQgVmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6c2NhbGVDb250ZW50KGNvbnN0IFFQb2lu
dEYmIGNlbnRlckluQ29udGVudENvb3JkCiAgICAgbV9jb250ZW50LT5zZXRQb3MobV9jb250ZW50
LT5wb3MoKSAtIChuZXdQaW5jaENlbnRlck9uUGFyZW50IC0gb2xkUGluY2hDZW50ZXJPblBhcmVu
dCkpOwogfQogCitRUmVjdEYgVmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6dmlld3BvcnRSZWN0
SW5Db250ZW50Q29vcmQoY29uc3QgUVBvaW50RiYgdmlld3BvcnRIb3RTcG90LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IHFyZWFsIGRlc3RTY2FsZSkKK3sKKyAgICBjb25zdCBxcmVhbCBib3VuZGVkU2NhbGUgPSBxQm91
bmQobV9jb25zdHJhaW50cy5taW5pbXVtU2NhbGUsIGRlc3RTY2FsZSwgbV9jb25zdHJhaW50cy5t
YXhpbXVtU2NhbGUpOworICAgIFFTaXplRiB2cFNpemUgPSBtX3ZpZXdwb3J0LT5ib3VuZGluZ1Jl
Y3QoKS5zaXplKCk7CisgICAgUVNpemVGIHNjYWxlZFZwU2l6ZSh2cFNpemUud2lkdGgoKSAvIGJv
dW5kZWRTY2FsZSwgdnBTaXplLmhlaWdodCgpIC8gYm91bmRlZFNjYWxlKTsKKyAgICBRUG9pbnRG
IGNvbnRlbnRIb3RTcG90ID0gdmlld3BvcnRQb2ludEluQ29udGVudENvb3JkaW5hdGUobV9jb250
ZW50LCBtX3ZpZXdwb3J0LCB2aWV3cG9ydEhvdFNwb3QpOworICAgIFFQb2ludEYgc2NhbGVkSG90
U3BvdCA9IHZpZXdwb3J0SG90U3BvdCAvIGJvdW5kZWRTY2FsZTsKKyAgICBRUmVjdEYgZGVzdFZp
ZXdSZWN0KGNvbnRlbnRIb3RTcG90IC0gc2NhbGVkSG90U3BvdCwgc2NhbGVkVnBTaXplKTsKKyAg
ICByZXR1cm4gZGVzdFZpZXdSZWN0OworfQorCisKK1FSZWN0RiBWaWV3cG9ydEludGVyYWN0aW9u
RW5naW5lOjp2YWxpZGF0ZVZpZXdwb3J0UmVjdChjb25zdCBRUmVjdEYmIHJlY3QpCit7CisgICAg
UVJlY3RGIHJldChyZWN0KTsKKyAgICBRU2l6ZUYgIGNvbnRTaXplID0gbV9jb250ZW50LT5ib3Vu
ZGluZ1JlY3QoKS5zaXplKCk7CisKKyAgICBpZihyZXQucmlnaHQoKSA+IGNvbnRTaXplLndpZHRo
KCkpCisgICAgICAgIHJldC5tb3ZlTGVmdChjb250U2l6ZS53aWR0aCgpIC0gcmV0LndpZHRoKCkp
OworICAgIGlmKHJldC5ib3R0b20oKSA+IGNvbnRTaXplLmhlaWdodCgpKQorICAgICAgICByZXQu
bW92ZVRvcChjb250U2l6ZS5oZWlnaHQoKSAtIHJldC5oZWlnaHQoKSk7CisgICAgaWYocmV0Lngo
KSA8IDApIHJldC5tb3ZlTGVmdCgwKTsKKyAgICBpZihyZXQueSgpIDwgMCkgcmV0Lm1vdmVUb3Ao
MCk7CisgICAgaWYocmV0LndpZHRoKCkgPiBjb250U2l6ZS53aWR0aCgpKQorICAgICAgICByZXQu
bW92ZUxlZnQoMCk7CisgICAgaWYocmV0LmhlaWdodCgpID4gY29udFNpemUuaGVpZ2h0KCkpCisg
ICAgICAgIHJldC5tb3ZlVG9wKDApOworCisgICAgcmV0dXJuIHJldDsKK30KKworCitRUmVjdEYg
Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6dmlld2FibGVSZWN0KCkKK3sKKyAgICByZXR1cm4g
bV92aWV3cG9ydC0+bWFwUmVjdFRvSXRlbShtX2NvbnRlbnQsIFFSZWN0RihRUG9pbnRGKDAsIDAp
LCBtX3ZpZXdwb3J0LT5ib3VuZGluZ1JlY3QoKS5zaXplKCkpKTsKK30KKwordm9pZCBWaWV3cG9y
dEludGVyYWN0aW9uRW5naW5lOjpzZXRWaWV3YWJsZVJlY3QoY29uc3QgUVJlY3RGJiByZWN0KQor
eworICAgIFZpZXdwb3J0VXBkYXRlR3VhcmQgZ3VhcmQodGhpcyk7CisgICAgcXJlYWwgbmV3U2Nh
bGUgPSBtX3ZpZXdwb3J0LT5ib3VuZGluZ1JlY3QoKS5zaXplKCkud2lkdGgoKSAvIHJlY3Qud2lk
dGgoKTsKKyAgICBtX2NvbnRlbnQtPnNldFNjYWxlKG5ld1NjYWxlKTsKKyAgICBtX2NvbnRlbnQt
PnNldFBvcygtcmVjdC50b3BMZWZ0KCkgKiBuZXdTY2FsZSk7Cit9CisKK3ZvaWQgVmlld3BvcnRJ
bnRlcmFjdGlvbkVuZ2luZTo6c2NhbGVBbmltYXRpb25TdGF0ZUNoYW5nZWQoUUFic3RyYWN0QW5p
bWF0aW9uOjpTdGF0ZSBuZXdTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgUUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSkKK3sK
KyAgICBzd2l0Y2ggKG5ld1N0YXRlKSB7CisgICAgY2FzZSBRQWJzdHJhY3RBbmltYXRpb246OlN0
b3BwZWQ6CisgICAgICAgIGVtaXQgY29udGVudFVwZGF0ZXNFbmFibGVkKHRydWUpOworICAgICAg
ICBicmVhazsKKyAgICBjYXNlIFFBYnN0cmFjdEFuaW1hdGlvbjo6UnVubmluZzoKKyAgICAgICAg
ZW1pdCBjb250ZW50VXBkYXRlc0VuYWJsZWQoZmFsc2UpOworICAgICAgICBicmVhazsKKyAgICBk
ZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKK30KKwordm9pZCBWaWV3cG9ydEludGVy
YWN0aW9uRW5naW5lOjphbmltYXRlU2NhbGVUb0hvdHNwb3QoY29uc3QgUVBvaW50RiYgdmlld3Bv
cnRIb3RTcG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgcXJlYWwgZGVzdFNjYWxlKQoreworICAgIFFSZWN0RiBkZXN0Vmlld1Jl
Y3QgPSB2aWV3cG9ydFJlY3RJbkNvbnRlbnRDb29yZCh2aWV3cG9ydEhvdFNwb3QsIGRlc3RTY2Fs
ZSk7CisgICAgUVJlY3RGIHRhcmdldFJlY3QgPSB2YWxpZGF0ZVZpZXdwb3J0UmVjdChkZXN0Vmll
d1JlY3QpOworICAgIG1fc2NhbGVBbmltYXRpb24uc2V0RW5kVmFsdWUodGFyZ2V0UmVjdCk7Cisg
ICAgbV9zY2FsZUFuaW1hdGlvbi5zdGFydCgpOworfQorCiAjaW5jbHVkZSAibW9jX1ZpZXdwb3J0
SW50ZXJhY3Rpb25FbmdpbmUuY3BwIgogCiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvcXQvVmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS5oIGIvU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL3F0L1ZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUuaAppbmRleCA1NDQwODdlLi42
NGJiY2JiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvVmlld3BvcnRJ
bnRlcmFjdGlvbkVuZ2luZS5oCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9WaWV3
cG9ydEludGVyYWN0aW9uRW5naW5lLmgKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJPd25Q
dHIuaCIKICNpbmNsdWRlICJxd2Via2l0Z2xvYmFsLmgiCiAjaW5jbHVkZSA8UXRDb3JlL1FPYmpl
Y3Q+CisjaW5jbHVkZSA8UXRDb3JlL1FQcm9wZXJ0eUFuaW1hdGlvbj4KIAogUVRfQkVHSU5fTkFN
RVNQQUNFCiBjbGFzcyBRUG9pbnRGOwpAQCAtMzcsNiArMzgsOCBAQCBjbGFzcyBWaWV3cG9ydFVw
ZGF0ZUd1YXJkOwogY2xhc3MgVmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZSA6IHB1YmxpYyBRT2Jq
ZWN0IHsKICAgICBRX09CSkVDVAogCisgICAgUV9QUk9QRVJUWShRUmVjdEYgdmlld2FibGVSZWN0
IFJFQUQgdmlld2FibGVSZWN0IFdSSVRFIHNldFZpZXdhYmxlUmVjdCkKKwogcHVibGljOgogICAg
IFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUoY29uc3QgUVNHSXRlbSosIFFTR0l0ZW0qKTsKICAg
ICB+Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZSgpOwpAQCAtNzAsMTAgKzczLDEzIEBAIHB1Ymxp
YzoKIFFfU0lHTkFMUzoKICAgICB2b2lkIHZpZXdwb3J0VXBkYXRlUmVxdWVzdGVkKCk7CiAgICAg
dm9pZCB2aWV3cG9ydFRyYWplY3RvcnlWZWN0b3JDaGFuZ2VkKGNvbnN0IFFQb2ludEYmKTsKKyAg
ICB2b2lkIGNvbnRlbnRVcGRhdGVzRW5hYmxlZChib29sKTsKIAogcHJpdmF0ZSBRX1NMT1RTOgog
ICAgIC8vIFJlc3BvbmQgdG8gY2hhbmdlcyBvZiBjb250ZW50IHRoYXQgYXJlIG5vdCBkcml2ZW4g
YnkgdXMsIGxpa2UgdGhlIHBhZ2UgcmVzaXppbmcgaXRzZWxmLgogICAgIHZvaWQgY29udGVudFZp
ZXdwb3J0Q2hhbmdlZCgpOworICAgIHZvaWQgc2NhbGVBbmltYXRpb25TdGF0ZUNoYW5nZWQoUUFi
c3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSBuZXdTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIFFBYnN0cmFjdEFuaW1hdGlvbjo6U3RhdGUpOwogCiBwcml2YXRlOgogICAg
IHZvaWQgdXBkYXRlQ29udGVudElmTmVlZGVkKCk7CkBAIC04Niw2ICs5MiwxNCBAQCBwcml2YXRl
OgogCiAgICAgdm9pZCBzY2FsZUNvbnRlbnQoY29uc3QgUVBvaW50RiYgY2VudGVySW5Db250ZW50
Q29vcmRpbmF0ZSwgcXJlYWwgc2NhbGUpOwogCisgICAgUVJlY3RGIHZpZXdwb3J0UmVjdEluQ29u
dGVudENvb3JkKGNvbnN0IFFQb2ludEYmIHZpZXdwb3J0SG90U3BvdCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXJlYWwgZGVzdFNjYWxlKTsKKyAgICBRUmVj
dEYgdmFsaWRhdGVWaWV3cG9ydFJlY3QoY29uc3QgUVJlY3RGJiByZWN0KTsKKyAgICBRUmVjdEYg
dmlld2FibGVSZWN0KCk7CisgICAgdm9pZCBzZXRWaWV3YWJsZVJlY3QoY29uc3QgUVJlY3RGJiBy
ZWN0KTsKKyAgICB2b2lkIGFuaW1hdGVTY2FsZVRvSG90c3BvdChjb25zdCBRUG9pbnRGJiB2aWV3
cG9ydEhvdFNwb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXJlYWwg
ZGVzdFNjYWxlKTsKKwogICAgIGZyaWVuZCBjbGFzcyBWaWV3cG9ydFVwZGF0ZUd1YXJkOwogCiAg
ICAgY29uc3QgUVNHSXRlbSogY29uc3QgbV92aWV3cG9ydDsKQEAgLTEwMyw2ICsxMTcsNyBAQCBw
cml2YXRlOgogICAgIFVzZXJJbnRlcmFjdGlvbkZsYWdzIG1fdXNlckludGVyYWN0aW9uRmxhZ3M7
CiAKICAgICBxcmVhbCBtX3BpbmNoU3RhcnRTY2FsZTsKKyAgICBRUHJvcGVydHlBbmltYXRpb24g
bV9zY2FsZUFuaW1hdGlvbjsKIH07CiAKIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVmll
d3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6Q29uc3RyYWludHMmIGEsIGNvbnN0IFZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmU6OkNvbnN0cmFpbnRzJiBiKQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112177</attachid>
            <date>2011-10-24 06:00:58 -0700</date>
            <delta_ts>2011-10-25 06:11:29 -0700</delta_ts>
            <desc>proposed patch</desc>
            <filename>0001-BUG66664-Qt-WK2-Add-the-animations-on-the-ViewportIn.patch</filename>
            <type>text/plain</type>
            <size>31744</size>
            <attacher name="Andras Becsi">abecsi</attacher>
            
              <data encoding="base64">RnJvbSBiMjFmMmE1OTBlNDY2MTAyNjRlOTJmODIyNDk3NzE4YTU4YzFhMzcwIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyYXMgQmVjc2kgPGFuZHJhcy5iZWNzaUBub2tpYS5jb20+
CkRhdGU6IE1vbiwgMjQgT2N0IDIwMTEgMTQ6NTQ6MTMgKzAyMDAKU3ViamVjdDogW1BBVENIXSBb
QlVHNjY2NjRdW1F0XVtXSzJdIEFkZCB0aGUgYW5pbWF0aW9ucyBvbiB0aGUKIFZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmUKCi0tLQogU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfCAgIDQ2ICsrKwogLi4uL1VJUHJvY2Vzcy9xdC9RdFBhbkdlc3R1cmVS
ZWNvZ25pemVyLmNwcCAgICAgICAgfCAgIDExICstCiAuLi4vV2ViS2l0Mi9VSVByb2Nlc3MvcXQv
UXRQYW5HZXN0dXJlUmVjb2duaXplci5oICB8ICAgIDIgKy0KIC4uLi9VSVByb2Nlc3MvcXQvUXRQ
aW5jaEdlc3R1cmVSZWNvZ25pemVyLmNwcCAgICAgIHwgICAgMiArLQogLi4uL1dlYktpdDIvVUlQ
cm9jZXNzL3F0L1F0VG91Y2hXZWJQYWdlUHJveHkuY3BwICAgfCAgICA0ICstCiAuLi4vVUlQcm9j
ZXNzL3F0L1F0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS5jcHAgICB8ICAzMjQgKysrKysrKysr
KystLS0tLS0tLS0KIC4uLi9VSVByb2Nlc3MvcXQvUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5l
LmggICAgIHwgICA0MCArKy0KIDcgZmlsZXMgY2hhbmdlZCwgMjU2IGluc2VydGlvbnMoKyksIDE3
MyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cgYi9T
b3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKaW5kZXggMWEwZTZhOS4uZTBhZWYwOCAxMDA2NDQKLS0t
IGEvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxv
ZwpAQCAtMSwzICsxLDQ5IEBACisyMDExLTEwLTI0ICBBbmRyYXMgQmVjc2kgIDxhbmRyYXMuYmVj
c2lAbm9raWEuY29tPgorCisgICAgICAgIFtRdF1bV0syXSBBZGQgdGhlIGFuaW1hdGlvbnMgb24g
dGhlIFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTY2NjY0CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgSW50cm9kdWNlIGEgUVNjcm9sbGVyIGJhc2VkIHBhbm5pbmcg
YW5kIGEgUVZhcmlhbnRBbmltYXRpb24gYmFzZWQgc2NhbGUgYW5pbWF0aW9uLgorICAgICAgICBR
U2Nyb2xsZXIgYWxzbyBoYW5kbGVzIGZsaWNrIGdlc3R1cmVzIGFuZCBhbmltYXRlcyBvdmVyc2hv
b3QuCisgICAgICAgIElmIGEgcGluY2ggZ2VzdHVyZSBlbmRzIHRoZSBzY2FsZSBhbmltYXRpb24g
c2NhbGVzIHRoZSBjb250ZW50IGludG8gYm91bmRhcmllcworICAgICAgICBieSBhbmltYXRpbmcg
Ym90aCB0aGUgY29udGVudCBwb3NpdGlvbiB3aGljaCBzaG91bGQgYmUgaW4gdGhlIGNlbnRlciBv
ZiB0aGUgdmlld3BvcnQKKyAgICAgICAgYW5kIHRoZSBzY2FsZSB0b2dldGhlci4KKyAgICAgICAg
QWxzbyBzaW1wbGlmeSB0aGUgVmlld3BvcnRVcGRhdGVHdWFyZCBieSBoYXZpbmcgYW4gaW50ZWdl
ciBjb3VudGVyIGluc3RlYWQgb2YKKyAgICAgICAgdGhlIGJvb2xlYW4gdG8gZGVmZXIgdGhlIHVw
ZGF0ZSByZXF1ZXN0cy4KKworICAgICAgICAqIFVJUHJvY2Vzcy9xdC9RdFBhbkdlc3R1cmVSZWNv
Z25pemVyLmNwcDoKKyAgICAgICAgKFdlYktpdDo6UXRQYW5HZXN0dXJlUmVjb2duaXplcjo6cmVj
b2duaXplKToKKyAgICAgICAgKiBVSVByb2Nlc3MvcXQvUXRQYW5HZXN0dXJlUmVjb2duaXplci5o
OgorICAgICAgICAqIFVJUHJvY2Vzcy9xdC9RdFBpbmNoR2VzdHVyZVJlY29nbml6ZXIuY3BwOgor
ICAgICAgICAoV2ViS2l0OjpRdFBpbmNoR2VzdHVyZVJlY29nbml6ZXI6OnJlY29nbml6ZSk6Cisg
ICAgICAgICogVUlQcm9jZXNzL3F0L1F0VG91Y2hXZWJQYWdlUHJveHkuY3BwOgorICAgICAgICAo
UXRUb3VjaFdlYlBhZ2VQcm94eTo6ZG9uZVdpdGhUb3VjaEV2ZW50KToKKyAgICAgICAgKiBVSVBy
b2Nlc3MvcXQvUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmNwcDoKKyAgICAgICAgKFdlYktp
dDo6Vmlld3BvcnRVcGRhdGVHdWFyZDo6Vmlld3BvcnRVcGRhdGVHdWFyZCk6CisgICAgICAgIChX
ZWJLaXQ6OlZpZXdwb3J0VXBkYXRlR3VhcmQ6On5WaWV3cG9ydFVwZGF0ZUd1YXJkKToKKyAgICAg
ICAgKFdlYktpdDo6UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpRdFZpZXdwb3J0SW50ZXJh
Y3Rpb25FbmdpbmUpOgorICAgICAgICAoV2ViS2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25Fbmdp
bmU6OnNjYWxlQW5pbWF0aW9uU3RhdGVDaGFuZ2VkKToKKyAgICAgICAgKFdlYktpdDo6UXRWaWV3
cG9ydEludGVyYWN0aW9uRW5naW5lOjp1cGRhdGVWaXNpYmxlUmVjdCk6CisgICAgICAgIChXZWJL
aXQ6OlF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6ZXZlbnQpOgorICAgICAgICAoV2ViS2l0
OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnN0b3BBbmltYXRpb25zKToKKyAgICAgICAg
KFdlYktpdDo6UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjphbmltYXRlQ29udGVudEludG9C
b3VuZGFyaWVzSWZOZWVkZWQpOgorICAgICAgICAoV2ViS2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rp
b25FbmdpbmU6OnJlc2V0KToKKyAgICAgICAgKFdlYktpdDo6UXRWaWV3cG9ydEludGVyYWN0aW9u
RW5naW5lOjpzZXRDb25zdHJhaW50cyk6CisgICAgICAgIChXZWJLaXQ6OlF0Vmlld3BvcnRJbnRl
cmFjdGlvbkVuZ2luZTo6cGFuR2VzdHVyZVN0YXJ0ZWQpOgorICAgICAgICAoV2ViS2l0OjpRdFZp
ZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBhbkdlc3R1cmVSZXF1ZXN0VXBkYXRlKToKKyAgICAg
ICAgKFdlYktpdDo6UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpwYW5HZXN0dXJlQ2FuY2Vs
bGVkKToKKyAgICAgICAgKFdlYktpdDo6UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpwYW5H
ZXN0dXJlRW5kZWQpOgorICAgICAgICAoV2ViS2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25Fbmdp
bmU6OnBpbmNoR2VzdHVyZVN0YXJ0ZWQpOgorICAgICAgICAoV2ViS2l0OjpRdFZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2VzdHVyZVJlcXVlc3RVcGRhdGUpOgorICAgICAgICAoV2Vi
S2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2VzdHVyZUVuZGVkKToKKyAg
ICAgICAgKFdlYktpdDo6UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpjb250ZW50Vmlld3Bv
cnRDaGFuZ2VkKToKKyAgICAgICAgKiBVSVByb2Nlc3MvcXQvUXRWaWV3cG9ydEludGVyYWN0aW9u
RW5naW5lLmg6CisgICAgICAgIChXZWJLaXQ6OlF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6
c2Nyb2xsZXIpOgorICAgICAgICAoV2ViS2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6
OlNjYWxlQW5pbWF0aW9uOjpTY2FsZUFuaW1hdGlvbik6CisgICAgICAgIChXZWJLaXQ6OlF0Vmll
d3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6U2NhbGVBbmltYXRpb246OnVwZGF0ZUN1cnJlbnRWYWx1
ZSk6CisKIDIwMTEtMTAtMjQgIFplbm8gQWxiaXNzZXIgIDx6ZW5vLmFsYmlzc2VyQG5va2lhLmNv
bT4KIAogICAgICAgICBbUXRdW1dLMl0gV2ViVmlldyBkb2VzIG5vdCBnZXQgZm9jdXMgd2hlbiBi
ZWluZyBjbGlja2VkIC8gdG91Y2hlZCBpbiBNaW5pQnJvd3Nlci4KZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFBhbkdlc3R1cmVSZWNvZ25pemVyLmNwcCBiL1NvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFBhbkdlc3R1cmVSZWNvZ25pemVyLmNwcAppbmRleCA0
ZThiMWZjLi5kYjI4ZGVlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQv
UXRQYW5HZXN0dXJlUmVjb2duaXplci5jcHAKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L3F0L1F0UGFuR2VzdHVyZVJlY29nbml6ZXIuY3BwCkBAIC0zNyw3ICszNyw3IEBAIFF0UGFuR2Vz
dHVyZVJlY29nbml6ZXI6OlF0UGFuR2VzdHVyZVJlY29nbml6ZXIoUXRWaWV3cG9ydEludGVyYWN0
aW9uRW5naW5lKiBpbnRlCiAgICAgcmVzZXQoKTsKIH0KIAotYm9vbCBRdFBhbkdlc3R1cmVSZWNv
Z25pemVyOjpyZWNvZ25pemUoY29uc3QgUVRvdWNoRXZlbnQqIGV2ZW50KQorYm9vbCBRdFBhbkdl
c3R1cmVSZWNvZ25pemVyOjpyZWNvZ25pemUoY29uc3QgUVRvdWNoRXZlbnQqIGV2ZW50LCBxaW50
NjQgdGltZXN0YW1wTVMpCiB7CiAgICAgLy8gUGFuIGdlc3R1cmUgYWx3YXlzIHN0YXJ0cyBvbiBU
b3VjaEJlZ2luIHVubGVzcyB0aGUgZW5naW5lIGlzIHN1c3BlbmRlZC4KICAgICBpZiAobV9zdGF0
ZSA9PSBOb0dlc3R1cmUgJiYgZXZlbnQtPnR5cGUoKSAhPSBRRXZlbnQ6OlRvdWNoQmVnaW4pCkBA
IC01OCw2ICs1OCw3IEBAIGJvb2wgUXRQYW5HZXN0dXJlUmVjb2duaXplcjo6cmVjb2duaXplKGNv
bnN0IFFUb3VjaEV2ZW50KiBldmVudCkKICAgICAgICAgQVNTRVJUKG1fc3RhdGUgPT0gTm9HZXN0
dXJlKTsKICAgICAgICAgbV9zdGF0ZSA9IEdlc3R1cmVSZWNvZ25pdGlvblN0YXJ0ZWQ7CiAgICAg
ICAgIG1fZmlyc3RQb3NpdGlvbiA9IHRvdWNoUG9pbnQuc2NyZWVuUG9zKCk7CisgICAgICAgIG1f
dmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+c3RvcEFuaW1hdGlvbnMoKTsKICAgICAgICAgcmV0
dXJuIGZhbHNlOwogICAgIGNhc2UgUUV2ZW50OjpUb3VjaFVwZGF0ZTogewogICAgICAgICBBU1NF
UlQobV9zdGF0ZSAhPSBOb0dlc3R1cmUpOwpAQCAtNjksMTggKzcwLDE2IEBAIGJvb2wgUXRQYW5H
ZXN0dXJlUmVjb2duaXplcjo6cmVjb2duaXplKGNvbnN0IFFUb3VjaEV2ZW50KiBldmVudCkKICAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgICAgIG1fc3RhdGUgPSBHZXN0
dXJlUmVjb2duaXplZDsKLSAgICAgICAgICAgIG1fdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+
cGFuR2VzdHVyZVN0YXJ0ZWQoKTsKKyAgICAgICAgICAgIG1fdmlld3BvcnRJbnRlcmFjdGlvbkVu
Z2luZS0+cGFuR2VzdHVyZVN0YXJ0ZWQodG91Y2hQb2ludC5wb3MoKSwgdGltZXN0YW1wTVMpOwog
ICAgICAgICB9CiAKICAgICAgICAgQVNTRVJUKG1fc3RhdGUgPT0gR2VzdHVyZVJlY29nbml6ZWQp
OwotICAgICAgICAvLyBPZmZzZXQgc2VudCB0byB0aGUgdmlld3MgbXVzdCBiZSBpbiBwYWdlIHZp
ZXcgY29vcmRpbmF0ZSBzcGFjZS4KLSAgICAgICAgUVBvaW50RiBvZmZzZXRTaW5jZUxhc3RFdmVu
dCh0b3VjaFBvaW50LnBvcygpIC0gdG91Y2hQb2ludC5sYXN0UG9zKCkpOwotICAgICAgICBtX3Zp
ZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPnBhbkdlc3R1cmVSZXF1ZXN0VXBkYXRlKG9mZnNldFNp
bmNlTGFzdEV2ZW50LngoKSwgb2Zmc2V0U2luY2VMYXN0RXZlbnQueSgpKTsKKyAgICAgICAgbV92
aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLT5wYW5HZXN0dXJlUmVxdWVzdFVwZGF0ZSh0b3VjaFBv
aW50LnBvcygpLCB0aW1lc3RhbXBNUyk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAg
ICBjYXNlIFFFdmVudDo6VG91Y2hFbmQ6CiAgICAgICAgIGlmIChtX3N0YXRlID09IEdlc3R1cmVS
ZWNvZ25pemVkKSB7Ci0gICAgICAgICAgICBtX3ZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPnBh
bkdlc3R1cmVFbmRlZCgpOworICAgICAgICAgICAgbV92aWV3cG9ydEludGVyYWN0aW9uRW5naW5l
LT5wYW5HZXN0dXJlRW5kZWQodG91Y2hQb2ludC5wb3MoKSwgdGltZXN0YW1wTVMpOwogICAgICAg
ICAgICAgcmVzZXQoKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRQYW5HZXN0dXJlUmVjb2duaXpl
ci5oIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1F0UGFuR2VzdHVyZVJlY29nbml6ZXIu
aAppbmRleCBmMTQ0NjJlLi5lYTRhOGY0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvcXQvUXRQYW5HZXN0dXJlUmVjb2duaXplci5oCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJ
UHJvY2Vzcy9xdC9RdFBhbkdlc3R1cmVSZWNvZ25pemVyLmgKQEAgLTQyLDcgKzQyLDcgQEAgY29u
c3QgcXJlYWwgcGFubmluZ0luaXRpYWxUcmlnZ2VyRGlzdGFuY2VUaHJlc2hvbGQgPSA1LjsKIGNs
YXNzIFF0UGFuR2VzdHVyZVJlY29nbml6ZXIgOiBwcml2YXRlIFF0R2VzdHVyZVJlY29nbml6ZXIg
ewogcHVibGljOgogICAgIFF0UGFuR2VzdHVyZVJlY29nbml6ZXIoUXRWaWV3cG9ydEludGVyYWN0
aW9uRW5naW5lKik7Ci0gICAgYm9vbCByZWNvZ25pemUoY29uc3QgUVRvdWNoRXZlbnQqKTsKKyAg
ICBib29sIHJlY29nbml6ZShjb25zdCBRVG91Y2hFdmVudCosIHFpbnQ2NCB0aW1lc3RhbXBNUyk7
CiAgICAgdm9pZCByZXNldCgpOwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL3F0L1F0UGluY2hHZXN0dXJlUmVjb2duaXplci5jcHAgYi9Tb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvcXQvUXRQaW5jaEdlc3R1cmVSZWNvZ25pemVyLmNwcAppbmRleCBmMzlk
ZmFhLi42M2E5ZGI1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRQ
aW5jaEdlc3R1cmVSZWNvZ25pemVyLmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mv
cXQvUXRQaW5jaEdlc3R1cmVSZWNvZ25pemVyLmNwcApAQCAtOTYsNyArOTYsNyBAQCBib29sIFF0
UGluY2hHZXN0dXJlUmVjb2duaXplcjo6cmVjb2duaXplKGNvbnN0IFFUb3VjaEV2ZW50KiBldmVu
dCkKICAgICAgICAgICAgICAgICBpZiAocGluY2hEaXN0YW5jZSA8IHBpbmNoSW5pdGlhbFRyaWdn
ZXJEaXN0YW5jZVRocmVzaG9sZCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwog
ICAgICAgICAgICAgICAgIG1fc3RhdGUgPSBHZXN0dXJlUmVjb2duaXplZDsKLSAgICAgICAgICAg
ICAgICBtX3ZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPnBpbmNoR2VzdHVyZVN0YXJ0ZWQoKTsK
KyAgICAgICAgICAgICAgICBtX3ZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPnBpbmNoR2VzdHVy
ZVN0YXJ0ZWQoY29tcHV0ZVRvdWNoQ2VudGVyKHBvaW50MSwgcG9pbnQyKSk7CiAKICAgICAgICAg
ICAgICAgICAvLyBXZSByZXNldCB0aGUgaW5pdGlhbCBwb3NpdGlvbiB0byB0aGUgcHJldmlvdXMg
cG9zaXRpb24gaW4gb3JkZXIgdG8gYXZvaWQgdGhlIGp1bXAgY2F1c2VkCiAgICAgICAgICAgICAg
ICAgLy8gYnkgc2tpcHBpbmcgYWxsIHRoZSBldmVudHMgYmV0d2VlbiB0aGUgYmVnaW5uaW5nIGFu
ZCB3aGVuIHRoZSB0aHJlc2hvbGQgaXMgaGl0LgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL3F0L1F0VG91Y2hXZWJQYWdlUHJveHkuY3BwIGIvU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL3F0L1F0VG91Y2hXZWJQYWdlUHJveHkuY3BwCmluZGV4IDE1MTQ1MzguLmE1NDFhM2Ig
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFRvdWNoV2ViUGFnZVBy
b3h5LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRUb3VjaFdlYlBhZ2VQ
cm94eS5jcHAKQEAgLTU4LDcgKzU4LDkgQEAgdm9pZCBRdFRvdWNoV2ViUGFnZVByb3h5Ojpkb25l
V2l0aFRvdWNoRXZlbnQoY29uc3QgTmF0aXZlV2ViVG91Y2hFdmVudCYgZXZlbnQsIGIKICAgICAg
ICAgbV9wYW5HZXN0dXJlUmVjb2duaXplci5yZXNldCgpOwogICAgICAgICBtX3BpbmNoR2VzdHVy
ZVJlY29nbml6ZXIucmVzZXQoKTsKICAgICB9IGVsc2UgewotICAgICAgICBtX3Bhbkdlc3R1cmVS
ZWNvZ25pemVyLnJlY29nbml6ZShldmVudC5uYXRpdmVFdmVudCgpKTsKKyAgICAgICAgLy8gQ29u
dmVydCB0aGUgZXZlbnQgdGltZXN0YW1wIGZyb20gc2Vjb25kIHRvIG1pbGxpc2Vjb25kLgorICAg
ICAgICBxaW50NjQgdGltZXN0YW1wTVMgPSBzdGF0aWNfY2FzdDxxaW50NjQ+KGV2ZW50LnRpbWVz
dGFtcCgpICogMTAwMCk7CisgICAgICAgIG1fcGFuR2VzdHVyZVJlY29nbml6ZXIucmVjb2duaXpl
KGV2ZW50Lm5hdGl2ZUV2ZW50KCksIHRpbWVzdGFtcE1TKTsKICAgICAgICAgbV9waW5jaEdlc3R1
cmVSZWNvZ25pemVyLnJlY29nbml6ZShldmVudC5uYXRpdmVFdmVudCgpKTsKICAgICB9CiB9CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRWaWV3cG9ydEludGVyYWN0
aW9uRW5naW5lLmNwcCBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmUuY3BwCmluZGV4IGQ0MWI2M2YuLmVkODJkMDEgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUuY3Bw
CisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFZpZXdwb3J0SW50ZXJhY3Rpb25F
bmdpbmUuY3BwCkBAIC0xLDQgKzEsNSBAQAogLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBOb2tp
YSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKICAqIENvcHlyaWdodCAo
QykgMjAxMSBCZW5qYW1pbiBQb3VsYWluIDxiZW5qYW1pbkB3ZWJraXQub3JnPgogICoKICAqIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKQEAgLTIzLDE2ICsyNCwxNCBAQAogCiAjaW5jbHVkZSAiUGFzc093blB0ci5oIgogI2luY2x1
ZGUgPFFQb2ludEY+CisjaW5jbHVkZSA8UVNjcm9sbEV2ZW50PgorI2luY2x1ZGUgPFFTY3JvbGxQ
cmVwYXJlRXZlbnQ+CisjaW5jbHVkZSA8UVNjcm9sbGVyUHJvcGVydGllcz4KICNpbmNsdWRlIDxR
dERlY2xhcmF0aXZlL3FzZ2l0ZW0uaD4KIAogbmFtZXNwYWNlIFdlYktpdCB7CiAKLXN0YXRpYyBp
bmxpbmUgUVJlY3RGIHZpc2libGVSZWN0SW5Db250ZW50Q29vcmRpbmF0ZShjb25zdCBRU0dJdGVt
KiBjb250ZW50LCBjb25zdCBRU0dJdGVtKiB2aWV3cG9ydCkKLXsKLSAgICBjb25zdCBRUmVjdEYg
dmlld3BvcnRJbkNvbnRlbnRDb29yZGluYXRlID0gY29udGVudC0+bWFwUmVjdEZyb21JdGVtKHZp
ZXdwb3J0LCB2aWV3cG9ydC0+Ym91bmRpbmdSZWN0KCkpOwotICAgIGNvbnN0IFFSZWN0RiB2aXNp
YmxlQXJlYSA9IGNvbnRlbnQtPmJvdW5kaW5nUmVjdCgpLmludGVyc2VjdGVkKHZpZXdwb3J0SW5D
b250ZW50Q29vcmRpbmF0ZSk7Ci0gICAgcmV0dXJuIHZpc2libGVBcmVhOwotfQorc3RhdGljIGNv
bnN0IGludCBrU2NhbGVBbmltYXRpb25EdXJhdGlvbiA9IDQwMDsKIAogc3RhdGljIGlubGluZSBR
UmVjdEYgY29udGVudFJlY3RJblZpZXdwb3J0Q29vcmRpbmF0ZShjb25zdCBRU0dJdGVtKiBjb250
ZW50LCBjb25zdCBRU0dJdGVtKiB2aWV3cG9ydCkKIHsKQEAgLTQzLDQ3ICs0MiwzNCBAQCBzdGF0
aWMgaW5saW5lIFFSZWN0RiBjb250ZW50UmVjdEluVmlld3BvcnRDb29yZGluYXRlKGNvbnN0IFFT
R0l0ZW0qIGNvbnRlbnQsIGNvbgogLy8gU2luY2Ugd2UgbWFuYWdlIHRob3NlIGRpZmZlcmVudGx5
LCB3ZSBkbyBub3Qgd2FudCB0byByZXNwb25kCiAvLyB0byB0aGVtIHdoZW4gd2UgYXJlIHRoZSBv
bmUgY2hhbmdpbmcgdGhlIGNvbnRlbnQuCiAvLwotLy8gVGhlIGd1YXJkIG1ha2Ugc3VyZSB0aGUg
c2lnbmFsIHZpZXdwb3J0VXBkYXRlUmVxdWVzdGVkKCkgaXMgc2VudCBpZiBuZWNlc3NhcnkuCi0v
LyBXaGVuIG11bHRpcGxlIGd1YXJkcyBhcmUgYWxpdmUsIHRoZWlyIGxpZmV0aW1lIG11c3QgYmUg
cGVyZmVjdGx5IGltYnJpY2F0ZWQgKGUuZy4gaWYgdXNlZCBvdXNpZGUgc3RhY2sgZnJhbWVzKS4K
LS8vIFdlIHJlbHkgb24gdGhlIGZpcnN0IG9uZSB0byB0cmlnZ2VyIHRoZSB1cGRhdGUgYXQgdGhl
IGVuZCBzaW5jZSBpdCBvbmx5IHVzZXMgb25lIGJvb2wgaW50ZXJuYWxseS4KLS8vCiAvLyBUaGUg
cHVibGljIG1ldGhvZHMgc2hvdWxkIGNyZWF0ZSB0aGUgZ3VhcmQgaWYgdGhleSBtaWdodCB1cGRh
dGUgY29udGVudC4KIGNsYXNzIFZpZXdwb3J0VXBkYXRlR3VhcmQgewogcHVibGljOgogICAgIFZp
ZXdwb3J0VXBkYXRlR3VhcmQoUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lKiB2aWV3cG9ydElu
dGVyYWN0aW9uRW5naW5lKQogICAgICAgICA6IHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUodmll
d3BvcnRJbnRlcmFjdGlvbkVuZ2luZSkKLSAgICAgICAgLCB3YXNVcGRhdGluZ0NvbnRlbnQodmll
d3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+bV9pc1VwZGF0aW5nQ29udGVudCkKLSAgICAgICAgLCBw
cmV2aW91c1Bvc2l0aW9uKHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1fY29udGVudC0+cG9z
KCkpCi0gICAgICAgICwgcHJldmlvdXNTaXplKHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1f
Y29udGVudC0+d2lkdGgoKSwgdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+bV9jb250ZW50LT5o
ZWlnaHQoKSkKLSAgICAgICAgLCBwcmV2aW91c1NjYWxlKHZpZXdwb3J0SW50ZXJhY3Rpb25Fbmdp
bmUtPm1fY29udGVudC0+c2NhbGUoKSkKICAgICB7Ci0gICAgICAgIHZpZXdwb3J0SW50ZXJhY3Rp
b25FbmdpbmUtPm1faXNVcGRhdGluZ0NvbnRlbnQgPSB0cnVlOworICAgICAgICArK3ZpZXdwb3J0
SW50ZXJhY3Rpb25FbmdpbmUtPm1fcGVuZGluZ1VwZGF0ZXM7CiAgICAgfQogCiAgICAgflZpZXdw
b3J0VXBkYXRlR3VhcmQoKQogICAgIHsKLSAgICAgICAgaWYgKCF3YXNVcGRhdGluZ0NvbnRlbnQp
IHsKLSAgICAgICAgICAgIGlmIChwcmV2aW91c1Bvc2l0aW9uICE9IHZpZXdwb3J0SW50ZXJhY3Rp
b25FbmdpbmUtPm1fY29udGVudC0+cG9zKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgcHJldmlv
dXNTaXplLndpZHRoKCkgIT0gdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+bV9jb250ZW50LT53
aWR0aCgpCi0gICAgICAgICAgICAgICAgICAgIHx8IHByZXZpb3VzU2l6ZS5oZWlnaHQoKSAhPSB2
aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLT5tX2NvbnRlbnQtPmhlaWdodCgpCi0gICAgICAgICAg
ICAgICAgICAgIHx8IHByZXZpb3VzU2NhbGUgIT0gdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+
bV9jb250ZW50LT5zY2FsZSgpKQotICAgICAgICAgICAgICAgIGVtaXQgdmlld3BvcnRJbnRlcmFj
dGlvbkVuZ2luZS0+dmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQoKTsKKyAgICAgICAgLS12aWV3cG9y
dEludGVyYWN0aW9uRW5naW5lLT5tX3BlbmRpbmdVcGRhdGVzOworICAgICAgICBpZiAoIXZpZXdw
b3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1fcGVuZGluZ1VwZGF0ZXMpIHsKKyAgICAgICAgICAgIGVt
aXQgdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+dmlld3BvcnRUcmFqZWN0b3J5VmVjdG9yQ2hh
bmdlZChRUG9pbnRGKCkpOworICAgICAgICAgICAgLy8gV2UgbXVzdCBub3RpZnkgdGhlIGNoYW5n
ZSBzbyB0aGUgY2xpZW50IGNhbiByZWx5IG9uIHVzIGZvciBhbGwgY2hhbmdlIG9mIGdlb21ldHJ5
LgorICAgICAgICAgICAgZW1pdCB2aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLT52aWV3cG9ydFVw
ZGF0ZVJlcXVlc3RlZCgpOwogICAgICAgICB9Ci0gICAgICAgIHZpZXdwb3J0SW50ZXJhY3Rpb25F
bmdpbmUtPm1faXNVcGRhdGluZ0NvbnRlbnQgPSB3YXNVcGRhdGluZ0NvbnRlbnQ7CiAgICAgfQog
CiBwcml2YXRlOgogICAgIFF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZSogY29uc3Qgdmlld3Bv
cnRJbnRlcmFjdGlvbkVuZ2luZTsKLSAgICBjb25zdCBib29sIHdhc1VwZGF0aW5nQ29udGVudDsK
LSAgICBjb25zdCBRUG9pbnRGIHByZXZpb3VzUG9zaXRpb247Ci0gICAgY29uc3QgUVNpemVGIHBy
ZXZpb3VzU2l6ZTsKLSAgICBjb25zdCBxcmVhbCBwcmV2aW91c1NjYWxlOwogfTsKIAogUXRWaWV3
cG9ydEludGVyYWN0aW9uRW5naW5lOjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUoY29uc3Qg
UVNHSXRlbSogdmlld3BvcnQsIFFTR0l0ZW0qIGNvbnRlbnQpCiAgICAgOiBtX3ZpZXdwb3J0KHZp
ZXdwb3J0KQogICAgICwgbV9jb250ZW50KGNvbnRlbnQpCi0gICAgLCBtX2lzVXBkYXRpbmdDb250
ZW50KGZhbHNlKQorICAgICwgbV9wZW5kaW5nVXBkYXRlcygwKQorICAgICwgbV9zY2FsZUFuaW1h
dGlvbihuZXcgU2NhbGVBbmltYXRpb24odGhpcykpCiAgICAgLCBtX3BpbmNoU3RhcnRTY2FsZSgx
LmYpCiB7CiAgICAgcmVzZXQoKTsKQEAgLTkyLDE1ICs3OCwxNTEgQEAgUXRWaWV3cG9ydEludGVy
YWN0aW9uRW5naW5lOjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUoY29uc3QgUVNHSXRlbSog
dmlld3BvcnQKICAgICBjb25uZWN0KG1fY29udGVudCwgU0lHTkFMKHdpZHRoQ2hhbmdlZCgpKSwg
dGhpcywgU0xPVChjb250ZW50Vmlld3BvcnRDaGFuZ2VkKCkpLCBRdDo6RGlyZWN0Q29ubmVjdGlv
bik7CiAgICAgY29ubmVjdChtX2NvbnRlbnQsIFNJR05BTChoZWlnaHRDaGFuZ2VkKCkpLCB0aGlz
LCBTTE9UKGNvbnRlbnRWaWV3cG9ydENoYW5nZWQoKSksIFF0OjpEaXJlY3RDb25uZWN0aW9uKTsK
ICAgICBjb25uZWN0KG1fY29udGVudCwgU0lHTkFMKHNjYWxlQ2hhbmdlZCgpKSwgdGhpcywgU0xP
VChjb250ZW50Vmlld3BvcnRDaGFuZ2VkKCkpLCBRdDo6RGlyZWN0Q29ubmVjdGlvbik7CisgICAg
Y29ubmVjdChtX3NjYWxlQW5pbWF0aW9uLCBTSUdOQUwodmFsdWVDaGFuZ2VkKFFWYXJpYW50KSks
IFNMT1QodXBkYXRlVmlzaWJsZVJlY3QoUVZhcmlhbnQpKSwgUXQ6OkRpcmVjdENvbm5lY3Rpb24p
OworICAgIGNvbm5lY3QobV9zY2FsZUFuaW1hdGlvbiwgU0lHTkFMKHN0YXRlQ2hhbmdlZChRQWJz
dHJhY3RBbmltYXRpb246OlN0YXRlLCBRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlKSkKKyAgICAg
ICAgICAgICwgU0xPVChzY2FsZUFuaW1hdGlvblN0YXRlQ2hhbmdlZChRQWJzdHJhY3RBbmltYXRp
b246OlN0YXRlLCBRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlKSksIFF0OjpEaXJlY3RDb25uZWN0
aW9uKTsKIH0KIAogUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjp+UXRWaWV3cG9ydEludGVy
YWN0aW9uRW5naW5lKCkKIHsKIH0KIAordm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6
OnVwZGF0ZVZpc2libGVSZWN0KFFWYXJpYW50IHZpc2libGVSZWN0VmFyaWFudCkKK3sKKyAgICBW
aWV3cG9ydFVwZGF0ZUd1YXJkIGd1YXJkKHRoaXMpOworICAgIFFSZWN0RiB2aXNpYmxlUmVjdCA9
IHZpc2libGVSZWN0VmFyaWFudC50b1JlY3RGKCk7CisgICAgcXJlYWwgc2NhbGUgPSBtX3ZpZXdw
b3J0LT53aWR0aCgpIC8gdmlzaWJsZVJlY3Qud2lkdGgoKTsKKyAgICBtX2NvbnRlbnQtPnNldFNj
YWxlKHNjYWxlKTsKKyAgICBtX2NvbnRlbnQtPnNldFBvcygtdmlzaWJsZVJlY3QudG9wTGVmdCgp
ICogc2NhbGUpOworfQorCit2b2lkIFF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6c2NhbGVB
bmltYXRpb25TdGF0ZUNoYW5nZWQoUUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSBuZXdTdGF0ZSwg
UUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSAvKm9sZFN0YXRlKi8pCit7CisgICAgc3dpdGNoIChu
ZXdTdGF0ZSkgeworICAgIGNhc2UgUUFic3RyYWN0QW5pbWF0aW9uOjpTdG9wcGVkOgorICAgICAg
ICBtX3BpbmNoVmlld3BvcnRVcGRhdGVEZWZlcnJlci5jbGVhcigpOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIFFBYnN0cmFjdEFuaW1hdGlvbjo6UnVubmluZzoKKyAgICAgICAgZW1pdCB2aWV3
cG9ydFRyYWplY3RvcnlWZWN0b3JDaGFuZ2VkKFFQb2ludEYoKSk7CisgICAgICAgIG1fcGluY2hW
aWV3cG9ydFVwZGF0ZURlZmVycmVyID0gYWRvcHRQdHIobmV3IFZpZXdwb3J0VXBkYXRlR3VhcmQo
dGhpcykpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAg
ICB9Cit9CisKK2Jvb2wgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpldmVudChRRXZlbnQq
IGV2ZW50KQoreworICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUoKSkgeworICAgIGNhc2UgUUV2ZW50
OjpTY3JvbGxQcmVwYXJlOiB7CisgICAgICAgIFFTY3JvbGxQcmVwYXJlRXZlbnQqIHByZXBhcmVF
dmVudCA9IHN0YXRpY19jYXN0PFFTY3JvbGxQcmVwYXJlRXZlbnQqPihldmVudCk7CisgICAgICAg
IGNvbnN0IFFSZWN0RiB2aWV3cG9ydFJlY3QgPSBtX3ZpZXdwb3J0LT5ib3VuZGluZ1JlY3QoKTsK
KyAgICAgICAgY29uc3QgUVJlY3RGIGNvbnRlbnRSZWN0ID0gY29udGVudFJlY3RJblZpZXdwb3J0
Q29vcmRpbmF0ZShtX2NvbnRlbnQsIG1fdmlld3BvcnQpOworCisgICAgICAgIC8vIFFTY3JvbGxl
ciBzY3JvbGxzIHRoZSBjb250ZW50ICh0aGUgdmlld3BvcnQgbW92ZXMgaW4gdGhlIGRpcmVjdGlv
biBvZiB0aGUgaW5wdXQpLgorICAgICAgICAvLyBUbyBnZXQgYSBwYW5uaW5nIGJlaGF2aW91ciAo
ZWcuIG1vdmluZyB0aGUgY29udGVudCBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBpbnB1dCkKKyAg
ICAgICAgLy8gdGhlIGNvb3JkaW5hdGVzIG5lZWQgdG8gYmUgaW52ZXJ0ZWQgYW5kIHdlIG5lZWQg
dG8gc2V0IGEgcG9zaXRpb24gcmFuZ2UgZm9yIHRoZSBpbnZlcnRlZCBwb3NpdGlvbnMuCisgICAg
ICAgIGNvbnN0IFFQb2ludEYgY29udGVudFBvc2l0aW9uUmFuZ2VUb3BMZWZ0KHFNaW48cXJlYWw+
KDAsIChjb250ZW50UmVjdC53aWR0aCgpIC0gdmlld3BvcnRSZWN0LndpZHRoKCkpIC8gMiksIDAp
OworICAgICAgICBjb25zdCBRU2l6ZUYgY29udGVudFBvc2l0aW9uUmFuZ2VTaXplKHFNYXg8cXJl
YWw+KDAsIGNvbnRlbnRSZWN0LndpZHRoKCkgLSB2aWV3cG9ydFJlY3Qud2lkdGgoKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHFNYXg8cXJlYWw+KDAs
IGNvbnRlbnRSZWN0LmhlaWdodCgpIC0gdmlld3BvcnRSZWN0LmhlaWdodCgpKSk7CisKKyAgICAg
ICAgcHJlcGFyZUV2ZW50LT5zZXRDb250ZW50UG9zUmFuZ2UoUVJlY3RGKGNvbnRlbnRQb3NpdGlv
blJhbmdlVG9wTGVmdCwgY29udGVudFBvc2l0aW9uUmFuZ2VTaXplKSk7CisgICAgICAgIHByZXBh
cmVFdmVudC0+c2V0Vmlld3BvcnRTaXplKHZpZXdwb3J0UmVjdC5zaXplKCkpOworICAgICAgICBw
cmVwYXJlRXZlbnQtPnNldENvbnRlbnRQb3MoLWNvbnRlbnRSZWN0LnRvcExlZnQoKSk7CisgICAg
ICAgIHByZXBhcmVFdmVudC0+YWNjZXB0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KyAgICBjYXNlIFFFdmVudDo6U2Nyb2xsOiB7CisgICAgICAgIFFTY3JvbGxFdmVudCogc2Nyb2xs
RXZlbnQgPSBzdGF0aWNfY2FzdDxRU2Nyb2xsRXZlbnQgKj4oZXZlbnQpOworICAgICAgICBRUG9p
bnRGIG5ld1BvcyA9IC1zY3JvbGxFdmVudC0+Y29udGVudFBvcygpIC0gc2Nyb2xsRXZlbnQtPm92
ZXJzaG9vdERpc3RhbmNlKCk7CisgICAgICAgIGlmIChtX2NvbnRlbnQtPnBvcygpICE9IG5ld1Bv
cykgeworICAgICAgICAgICAgVmlld3BvcnRVcGRhdGVHdWFyZCBndWFyZCh0aGlzKTsKKyAgICAg
ICAgICAgIFFQb2ludEYgY3VycmVudFBvc0luQ29udGVudENvb3JkaW5hdGUgPSBtX2NvbnRlbnQt
Pm1hcFRvSXRlbShtX2NvbnRlbnQtPnBhcmVudEl0ZW0oKSwgbV9jb250ZW50LT5wb3MoKSk7Cisg
ICAgICAgICAgICBRUG9pbnRGIG5ld1Bvc0luQ29udGVudENvb3JkaW5hdGUgPSBtX2NvbnRlbnQt
Pm1hcFRvSXRlbShtX2NvbnRlbnQtPnBhcmVudEl0ZW0oKSwgbmV3UG9zKTsKKworICAgICAgICAg
ICAgLy8gVGhpcyBtdXN0IGJlIGVtaXR0ZWQgYmVmb3JlIHZpZXdwb3J0VXBkYXRlUmVxdWVzdGVk
IHNvIHRoYXQgdGhlIHdlYiBwcm9jZXNzIGtub3dzIHdoZXJlIHRvIGxvb2sgZm9yIHRpbGVzLgor
ICAgICAgICAgICAgZW1pdCB2aWV3cG9ydFRyYWplY3RvcnlWZWN0b3JDaGFuZ2VkKGN1cnJlbnRQ
b3NJbkNvbnRlbnRDb29yZGluYXRlIC0gbmV3UG9zSW5Db250ZW50Q29vcmRpbmF0ZSk7CisgICAg
ICAgICAgICBtX2NvbnRlbnQtPnNldFBvcyhuZXdQb3MpOworICAgICAgICB9CisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cisg
ICAgcmV0dXJuIFFPYmplY3Q6OmV2ZW50KGV2ZW50KTsKK30KKwordm9pZCBRdFZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmU6OnN0b3BBbmltYXRpb25zKCkKK3sKKyAgICBtX3NjYWxlQW5pbWF0aW9u
LT5zdG9wKCk7CisgICAgc2Nyb2xsZXIoKS0+c3RvcCgpOworfQorCit2b2lkIFF0Vmlld3BvcnRJ
bnRlcmFjdGlvbkVuZ2luZTo6YW5pbWF0ZUNvbnRlbnRJbnRvQm91bmRhcmllc0lmTmVlZGVkKGlu
dCBhbmltYXRpb25EdXJhdGlvbikKK3sKKyAgICBtX3NjYWxlQW5pbWF0aW9uLT5zdG9wKCk7Cisg
ICAgcXJlYWwgY29udGVudFNjYWxlID0gbV9jb250ZW50LT5zY2FsZSgpOworICAgIGlmICghKG1f
dXNlckludGVyYWN0aW9uRmxhZ3MgJiBVc2VySGFzU2NhbGVkQ29udGVudCkpCisgICAgICAgIGNv
bnRlbnRTY2FsZSA9IG1fY29uc3RyYWludHMuaW5pdGlhbFNjYWxlOworCisgICAgY29udGVudFNj
YWxlID0gcUJvdW5kKG1fY29uc3RyYWludHMubWluaW11bVNjYWxlLCBjb250ZW50U2NhbGUsIG1f
Y29uc3RyYWludHMubWF4aW11bVNjYWxlKTsKKworICAgIFFSZWN0RiB2aWV3cG9ydFJlY3QgPSBt
X3ZpZXdwb3J0LT5ib3VuZGluZ1JlY3QoKTsKKyAgICBRUG9pbnRGIGNlbnRlck9mSW50ZXJlc3Qg
PSB2aWV3cG9ydFJlY3QuY2VudGVyKCk7CisgICAgUVNpemVGIGNvbnRlbnRTaXplID0gbV9jb250
ZW50LT5ib3VuZGluZ1JlY3QoKS5zaXplKCk7CisgICAgUVBvaW50RiBjZW50ZXJPbkNvbnRlbnQg
PSBtX2NvbnRlbnQtPm1hcEZyb21JdGVtKG1fdmlld3BvcnQsIGNlbnRlck9mSW50ZXJlc3QpOwor
ICAgIFFSZWN0RiBzY2FsZWRWaWV3cG9ydFJlY3QoY2VudGVyT25Db250ZW50IC0gY2VudGVyT2ZJ
bnRlcmVzdCAvIGNvbnRlbnRTY2FsZSwgdmlld3BvcnRSZWN0LnNpemUoKSAvIGNvbnRlbnRTY2Fs
ZSk7CisKKyAgICBpZiAoc2NhbGVkVmlld3BvcnRSZWN0LnJpZ2h0KCkgPiBjb250ZW50U2l6ZS53
aWR0aCgpKQorICAgICAgICBzY2FsZWRWaWV3cG9ydFJlY3QubW92ZUxlZnQoY29udGVudFNpemUu
d2lkdGgoKSAtIHNjYWxlZFZpZXdwb3J0UmVjdC53aWR0aCgpKTsKKyAgICBpZiAoc2NhbGVkVmll
d3BvcnRSZWN0LmJvdHRvbSgpID4gY29udGVudFNpemUuaGVpZ2h0KCkpCisgICAgICAgIHNjYWxl
ZFZpZXdwb3J0UmVjdC5tb3ZlVG9wKGNvbnRlbnRTaXplLmhlaWdodCgpIC0gc2NhbGVkVmlld3Bv
cnRSZWN0LmhlaWdodCgpKTsKKworICAgIGlmIChzY2FsZWRWaWV3cG9ydFJlY3Qud2lkdGgoKSA+
IGNvbnRlbnRTaXplLndpZHRoKCkpCisgICAgICAgIHNjYWxlZFZpZXdwb3J0UmVjdC5tb3ZlTGVm
dCgoY29udGVudFNpemUud2lkdGgoKSAtIHNjYWxlZFZpZXdwb3J0UmVjdC53aWR0aCgpKSAvIDIp
OworICAgIGVsc2UgaWYgKHNjYWxlZFZpZXdwb3J0UmVjdC54KCkgPCAwKQorICAgICAgICBzY2Fs
ZWRWaWV3cG9ydFJlY3QubW92ZUxlZnQoMCk7CisKKyAgICBpZiAoc2NhbGVkVmlld3BvcnRSZWN0
LmhlaWdodCgpID4gY29udGVudFNpemUuaGVpZ2h0KCkpCisgICAgICAgIHNjYWxlZFZpZXdwb3J0
UmVjdC5tb3ZlVG9wKDApOworICAgIGVsc2UgaWYgKHNjYWxlZFZpZXdwb3J0UmVjdC55KCkgPCAw
KQorICAgICAgICBzY2FsZWRWaWV3cG9ydFJlY3QubW92ZVRvcCgwKTsKKworICAgIFFSZWN0RiBj
dXJyZW50Vmlld3BvcnRSZWN0T25Db250ZW50ID0gbV92aWV3cG9ydC0+bWFwUmVjdFRvSXRlbSht
X2NvbnRlbnQsIHZpZXdwb3J0UmVjdCk7CisKKyAgICBpZiAoc2NhbGVkVmlld3BvcnRSZWN0ID09
IGN1cnJlbnRWaWV3cG9ydFJlY3RPbkNvbnRlbnQpCisgICAgICAgIHJldHVybjsKKworICAgIGlm
IChhbmltYXRpb25EdXJhdGlvbikgeworICAgICAgICBtX3NjYWxlQW5pbWF0aW9uLT5zZXREdXJh
dGlvbihhbmltYXRpb25EdXJhdGlvbik7CisgICAgICAgIG1fc2NhbGVBbmltYXRpb24tPnNldEVh
c2luZ0N1cnZlKFFFYXNpbmdDdXJ2ZTo6T3V0Q3ViaWMpOworICAgICAgICBtX3NjYWxlQW5pbWF0
aW9uLT5zZXRTdGFydFZhbHVlKGN1cnJlbnRWaWV3cG9ydFJlY3RPbkNvbnRlbnQpOworICAgICAg
ICBtX3NjYWxlQW5pbWF0aW9uLT5zZXRFbmRWYWx1ZShzY2FsZWRWaWV3cG9ydFJlY3QpOworICAg
ICAgICBtX3NjYWxlQW5pbWF0aW9uLT5zdGFydCgpOworICAgIH0gZWxzZQorICAgICAgICB1cGRh
dGVWaXNpYmxlUmVjdChzY2FsZWRWaWV3cG9ydFJlY3QpOworfQorCiB2b2lkIFF0Vmlld3BvcnRJ
bnRlcmFjdGlvbkVuZ2luZTo6cmVzZXQoKQogewogICAgIFZpZXdwb3J0VXBkYXRlR3VhcmQgZ3Vh
cmQodGhpcyk7CisgICAgc3RvcEFuaW1hdGlvbnMoKTsKKworICAgIFFTY3JvbGxlclByb3BlcnRp
ZXMgcHJvcGVydGllcyA9IHNjcm9sbGVyKCktPnNjcm9sbGVyUHJvcGVydGllcygpOworCisgICAg
Ly8gVGhlIFF0UGFuR2VzdHVyZVJlY29nbml6ZXIgaXMgcmVzcG9uc2libGUgZm9yIHJlY29nbml6
aW5nIHRoZSBnZXN0dXJlCisgICAgLy8gdGh1cyB3ZSBuZWVkIHRvIGRpc2FibGUgdGhlIGRyYWcg
c3RhcnQgZGlzdGFuY2UuCisgICAgcHJvcGVydGllcy5zZXRTY3JvbGxNZXRyaWMoUVNjcm9sbGVy
UHJvcGVydGllczo6RHJhZ1N0YXJ0RGlzdGFuY2UsIDAuMCk7CisKKyAgICAvLyBTZXQgc29tZSBk
ZWZhdWx0IFFTY3JvbGxlciBjb25zdHJhaW5zIHRvIG1pbWljIHRoZSBwaHlzaWNzIGVuZ2luZSBv
ZiB0aGUgTjkgYnJvd3Nlci4KKyAgICBwcm9wZXJ0aWVzLnNldFNjcm9sbE1ldHJpYyhRU2Nyb2xs
ZXJQcm9wZXJ0aWVzOjpBeGlzTG9ja1RocmVzaG9sZCwgMC42Nik7CisgICAgcHJvcGVydGllcy5z
ZXRTY3JvbGxNZXRyaWMoUVNjcm9sbGVyUHJvcGVydGllczo6RGVjZWxlcmF0aW9uRmFjdG9yLCAw
LjI1KTsKKyAgICBwcm9wZXJ0aWVzLnNldFNjcm9sbE1ldHJpYyhRU2Nyb2xsZXJQcm9wZXJ0aWVz
OjpNYXhpbXVtVmVsb2NpdHksIDAuMik7CisgICAgcHJvcGVydGllcy5zZXRTY3JvbGxNZXRyaWMo
UVNjcm9sbGVyUHJvcGVydGllczo6T3ZlcnNob290RHJhZ1Jlc2lzdGFuY2VGYWN0b3IsIDAuMzMp
OworICAgIHByb3BlcnRpZXMuc2V0U2Nyb2xsTWV0cmljKFFTY3JvbGxlclByb3BlcnRpZXM6Ok92
ZXJzaG9vdFNjcm9sbERpc3RhbmNlRmFjdG9yLCAwLjMzKTsKKworICAgIHNjcm9sbGVyKCktPnNl
dFNjcm9sbGVyUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKwogICAgIG1fdXNlckludGVyYWN0aW9u
RmxhZ3MgPSBVc2VySGFzTm90SW50ZXJhY3RlZFdpdGhDb250ZW50OwogICAgIHNldENvbnN0cmFp
bnRzKENvbnN0cmFpbnRzKCkpOwogfQpAQCAtMTEwLDU5ICsyMzIsNDUgQEAgdm9pZCBRdFZpZXdw
b3J0SW50ZXJhY3Rpb25FbmdpbmU6OnNldENvbnN0cmFpbnRzKGNvbnN0IENvbnN0cmFpbnRzJiBj
b25zdHJhaW50cykKICAgICBpZiAobV9jb25zdHJhaW50cyA9PSBjb25zdHJhaW50cykKICAgICAg
ICAgcmV0dXJuOwogCi0gICAgLy8gRklYTUU6IGlmIGEgcGluY2ggZ2VzdHVyZSBpcyBvbmdvaW5n
LCB3ZSBoYXZlIHRvOgotICAgIC8vIC1jYW5jZWwgdGhlIGdlc3R1cmUgaWYgaXNVc2VyU2NhbGFi
bGUgYmVjb21lcyB0cnVlCi0gICAgLy8gLXVwZGF0ZSB0aGUgcGFnZSBvbiB0aGUgZmx5IHdpdGhv
dXQgbW9kaWZ5aW5nIGl0cyBwb3NpdGlvbgotCi0gICAgLy8gRklYTUU6IGlmIGEgcGFuIGdlc3R1
cmUgaXMgb25nb2luZywgd2UgaGF2ZSB0bwotICAgIC8vIC11cGRhdGUgdGhlIHBhZ2Ugd2l0aG91
dCBjaGFuZ2luZyB0aGUgcG9zaXRpb24KLSAgICAvLyAtYW5pbWF0ZSB0aGUgcGFnZSBiYWNrIGlu
IHZpZXdwb3J0IGlmIG5lY2Vzc2FyeSAoaWYgdGhlIHBhZ2UgaXMgZnVsbHkgaW4KLSAgICAvLyAg
dmlld3BvcnQsIGl0IGRvZXMgbm90IHBhbiBob3Jpem9udGFsbHkgYW55bW9yZSkuCisgICAgc3Rv
cEFuaW1hdGlvbnMoKTsKIAogICAgIFZpZXdwb3J0VXBkYXRlR3VhcmQgZ3VhcmQodGhpcyk7CiAg
ICAgbV9jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzOwotICAgIHVwZGF0ZUNvbnRlbnRJZk5lZWRl
ZCgpOworICAgIGFuaW1hdGVDb250ZW50SW50b0JvdW5kYXJpZXNJZk5lZWRlZCgpOwogfQogCi12
b2lkIFF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6cGFuR2VzdHVyZVN0YXJ0ZWQoKQordm9p
ZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBhbkdlc3R1cmVTdGFydGVkKGNvbnN0IFFQ
b2ludEYmIHRvdWNoUG9pbnQsIHFpbnQ2NCB0aW1lc3RhbXBNUykKIHsKICAgICAvLyBGSVhNRTog
c3VzcGVuZCB0aGUgV2ViIGVuZ2luZSAoc3RvcCBhbmltYXRlZCBHSUYsIGV0YykuCi0gICAgLy8g
RklYTUU6IGluaXRpYWxpemUgcGh5c2ljcyBmb3IgcGFubmluZyAoc3RvcCBhbmltYXRpb24sIGV0
YykuCiAgICAgbV91c2VySW50ZXJhY3Rpb25GbGFncyB8PSBVc2VySGFzTW92ZWRDb250ZW50Owor
ICAgIHNjcm9sbGVyKCktPmhhbmRsZUlucHV0KFFTY3JvbGxlcjo6SW5wdXRQcmVzcywgbV92aWV3
cG9ydC0+bWFwRnJvbUl0ZW0obV9jb250ZW50LCB0b3VjaFBvaW50KSwgdGltZXN0YW1wTVMpOwog
fQogCi12b2lkIFF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6cGFuR2VzdHVyZVJlcXVlc3RV
cGRhdGUocXJlYWwgZGVsdGFYLCBxcmVhbCBkZWx0YVkpCit2b2lkIFF0Vmlld3BvcnRJbnRlcmFj
dGlvbkVuZ2luZTo6cGFuR2VzdHVyZVJlcXVlc3RVcGRhdGUoY29uc3QgUVBvaW50RiYgdG91Y2hQ
b2ludCwgcWludDY0IHRpbWVzdGFtcE1TKQogewogICAgIFZpZXdwb3J0VXBkYXRlR3VhcmQgZ3Vh
cmQodGhpcyk7Ci0KLSAgICBRUG9pbnRGIGl0ZW1Qb3NpdGlvbkluSXRlbUNvb3JkcyA9IG1fY29u
dGVudC0+bWFwRnJvbUl0ZW0obV9jb250ZW50LT5wYXJlbnRJdGVtKCksIG1fY29udGVudC0+cG9z
KCkpOwotICAgIFFQb2ludEYgZGVzdEluVmlld3BvcnRDb29yZHMgPSBtX3ZpZXdwb3J0LT5tYXBG
cm9tSXRlbShtX2NvbnRlbnQsIGl0ZW1Qb3NpdGlvbkluSXRlbUNvb3JkcyArIFFQb2ludEYoZGVs
dGFYLCBkZWx0YVkpKTsKLQotICAgIG1fY29udGVudC0+c2V0UG9zKGRlc3RJblZpZXdwb3J0Q29v
cmRzKTsKLSAgICAvLyBUaGlzIG11c3QgYmUgZW1pdHRlZCBiZWZvcmUgdmlld3BvcnRVcGRhdGVS
ZXF1ZXN0ZWQgc28gdGhhdCB0aGUgd2ViIHByb2Nlc3Mga25vd3Mgd2hlcmUgdG8gbG9vayBmb3Ig
dGlsZXMuCi0gICAgZW1pdCB2aWV3cG9ydFRyYWplY3RvcnlWZWN0b3JDaGFuZ2VkKFFQb2ludEYo
LWRlbHRhWCwgLWRlbHRhWSkpOworICAgIHNjcm9sbGVyKCktPmhhbmRsZUlucHV0KFFTY3JvbGxl
cjo6SW5wdXRNb3ZlLCBtX3ZpZXdwb3J0LT5tYXBGcm9tSXRlbShtX2NvbnRlbnQsIHRvdWNoUG9p
bnQpLCB0aW1lc3RhbXBNUyk7CiB9CiAKIHZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5l
OjpwYW5HZXN0dXJlQ2FuY2VsbGVkKCkKIHsKICAgICBWaWV3cG9ydFVwZGF0ZUd1YXJkIGd1YXJk
KHRoaXMpOwotICAgIC8vIEZJWE1FOiByZXNldCBwaHlzaWNzLgotICAgIHBhbkdlc3R1cmVFbmRl
ZCgpOworICAgIHN0b3BBbmltYXRpb25zKCk7CiB9CiAKLXZvaWQgUXRWaWV3cG9ydEludGVyYWN0
aW9uRW5naW5lOjpwYW5HZXN0dXJlRW5kZWQoKQordm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25F
bmdpbmU6OnBhbkdlc3R1cmVFbmRlZChjb25zdCBRUG9pbnRGJiB0b3VjaFBvaW50LCBxaW50NjQg
dGltZXN0YW1wTVMpCiB7CiAgICAgVmlld3BvcnRVcGRhdGVHdWFyZCBndWFyZCh0aGlzKTsKLSAg
ICBhbmltYXRlQ29udGVudEludG9Cb3VuZGFyaWVzSWZOZWVkZWQoKTsKLSAgICAvLyBGSVhNRTog
ZW1pdCB2aWV3cG9ydFRyYWplY3RvcnlWZWN0b3JDaGFuZ2VkKFFQb2ludEYoKSkgd2hlbiB0aGUg
cGFuIHRocm93IGFuaW1hdGlvbiBlbmRzIGFuZCB0aGUgcGFnZSBzdG9wcyBtb3ZpbmcuCisgICAg
c2Nyb2xsZXIoKS0+aGFuZGxlSW5wdXQoUVNjcm9sbGVyOjpJbnB1dFJlbGVhc2UsIG1fdmlld3Bv
cnQtPm1hcEZyb21JdGVtKG1fY29udGVudCwgdG91Y2hQb2ludCksIHRpbWVzdGFtcE1TKTsKIH0K
IAotdm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2VzdHVyZVN0YXJ0ZWQo
KQordm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2VzdHVyZVN0YXJ0ZWQo
Y29uc3QgUVBvaW50RiYgcGluY2hDZW50ZXJJbkNvbnRlbnRDb29yZGluYXRlKQogewogICAgIGlm
ICghbV9jb25zdHJhaW50cy5pc1VzZXJTY2FsYWJsZSkKICAgICAgICAgcmV0dXJuOwogCiAgICAg
bV9waW5jaFZpZXdwb3J0VXBkYXRlRGVmZXJyZXIgPSBhZG9wdFB0cihuZXcgVmlld3BvcnRVcGRh
dGVHdWFyZCh0aGlzKSk7CisgICAgbV9sYXN0UGluY2hDZW50ZXJJblZpZXdwb3J0Q29vcmRpbmF0
ZSA9IG1fdmlld3BvcnQtPm1hcEZyb21JdGVtKG1fY29udGVudCwgcGluY2hDZW50ZXJJbkNvbnRl
bnRDb29yZGluYXRlKTsKIAogICAgIG1fdXNlckludGVyYWN0aW9uRmxhZ3MgfD0gVXNlckhhc1Nj
YWxlZENvbnRlbnQ7CiAgICAgbV91c2VySW50ZXJhY3Rpb25GbGFncyB8PSBVc2VySGFzTW92ZWRD
b250ZW50OwpAQCAtMTgwLDEyICsyODgsMTkgQEAgdm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25F
bmdpbmU6OnBpbmNoR2VzdHVyZVJlcXVlc3RVcGRhdGUoY29uc3QgUVBvaW50RiYgcGluY2gKICAg
ICBWaWV3cG9ydFVwZGF0ZUd1YXJkIGd1YXJkKHRoaXMpOwogCiAgICAgLy8gIENoYW5nZXMgb2Yg
dGhlIGNlbnRlciBwb3NpdGlvbiBzaG91bGQgbW92ZSB0aGUgcGFnZSBldmVuIGlmIHRoZSB6b29t
IGZhY3RvcgotICAgIC8vICBkb2VzIG5vdCBjaGFuZ2UuIEJvdGggdGhlIHpvb20gYW5kIHRoZSBw
YW5uaW5nIHNob3VsZCBiZSBoYW5kbGVkIHRocm91Z2ggdGhlIHBoeXNpY3MgZW5naW5lLgorICAg
IC8vICBkb2VzIG5vdCBjaGFuZ2UuCiAgICAgY29uc3QgcXJlYWwgc2NhbGUgPSBtX3BpbmNoU3Rh
cnRTY2FsZSAqIHRvdGFsU2NhbGVGYWN0b3I7CisgICAgUVBvaW50RiBwaW5jaENlbnRlckluVmll
d3BvcnRDb29yZGluYXRlID0gbV92aWV3cG9ydC0+bWFwRnJvbUl0ZW0obV9jb250ZW50LCBwaW5j
aENlbnRlckluQ29udGVudENvb3JkaW5hdGUpOwogICAgIFFQb2ludEYgb2xkUGluY2hDZW50ZXJP
blBhcmVudCA9IG1fY29udGVudC0+bWFwVG9JdGVtKG1fY29udGVudC0+cGFyZW50SXRlbSgpLCBw
aW5jaENlbnRlckluQ29udGVudENvb3JkaW5hdGUpOwogICAgIG1fY29udGVudC0+c2V0U2NhbGUo
c2NhbGUpOwogICAgIFFQb2ludEYgbmV3UGluY2hDZW50ZXJPblBhcmVudCA9IG1fY29udGVudC0+
bWFwVG9JdGVtKG1fY29udGVudC0+cGFyZW50SXRlbSgpLCBwaW5jaENlbnRlckluQ29udGVudENv
b3JkaW5hdGUpOwotICAgIG1fY29udGVudC0+c2V0UG9zKG1fY29udGVudC0+cG9zKCkgLSAobmV3
UGluY2hDZW50ZXJPblBhcmVudCAtIG9sZFBpbmNoQ2VudGVyT25QYXJlbnQpKTsKKyAgICBjb25z
dCBRUG9pbnRGIHNjYWxlT2Zmc2V0ID0gbmV3UGluY2hDZW50ZXJPblBhcmVudCAtIG9sZFBpbmNo
Q2VudGVyT25QYXJlbnQ7CisgICAgY29uc3QgUVBvaW50RiBtb3ZlbWVudE9mZnNldCA9IHBpbmNo
Q2VudGVySW5WaWV3cG9ydENvb3JkaW5hdGUgLSBtX2xhc3RQaW5jaENlbnRlckluVmlld3BvcnRD
b29yZGluYXRlOworICAgIG1fbGFzdFBpbmNoQ2VudGVySW5WaWV3cG9ydENvb3JkaW5hdGUgPSBw
aW5jaENlbnRlckluVmlld3BvcnRDb29yZGluYXRlOworCisgICAgUVBvaW50RiBuZXdQb3NpdGlv
bihtX2NvbnRlbnQtPnBvcygpICsgbW92ZW1lbnRPZmZzZXQgLSBzY2FsZU9mZnNldCk7CisKKyAg
ICBtX2NvbnRlbnQtPnNldFBvcyhuZXdQb3NpdGlvbik7CiB9CiAKIHZvaWQgUXRWaWV3cG9ydElu
dGVyYWN0aW9uRW5naW5lOjpwaW5jaEdlc3R1cmVFbmRlZCgpCkBAIC0xOTMsMTExICszMDgsMTgg
QEAgdm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2VzdHVyZUVuZGVkKCkK
ICAgICBpZiAoIW1fY29uc3RyYWludHMuaXNVc2VyU2NhbGFibGUpCiAgICAgICAgIHJldHVybjsK
IAotICAgIHsKLSAgICAgICAgVmlld3BvcnRVcGRhdGVHdWFyZCBndWFyZCh0aGlzKTsKLSAgICAg
ICAgLy8gRklYTUU6IHJlc3VtZSB0aGUgZW5naW5lIGFmdGVyIHRoZSBhbmltYXRpb24uCi0gICAg
ICAgIGFuaW1hdGVDb250ZW50SW50b0JvdW5kYXJpZXNJZk5lZWRlZCgpOwotICAgIH0KICAgICBt
X3BpbmNoVmlld3BvcnRVcGRhdGVEZWZlcnJlci5jbGVhcigpOworICAgIC8vIEZJWE1FOiByZXN1
bWUgdGhlIGVuZ2luZSBhZnRlciB0aGUgYW5pbWF0aW9uLgorICAgIGFuaW1hdGVDb250ZW50SW50
b0JvdW5kYXJpZXNJZk5lZWRlZChrU2NhbGVBbmltYXRpb25EdXJhdGlvbik7CiB9CiAKIHZvaWQg
UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpjb250ZW50Vmlld3BvcnRDaGFuZ2VkKCkKIHsK
LSAgICBpZiAobV9pc1VwZGF0aW5nQ29udGVudCkKKyAgICBpZiAobV9wZW5kaW5nVXBkYXRlcykK
ICAgICAgICAgcmV0dXJuOwogCiAgICAgVmlld3BvcnRVcGRhdGVHdWFyZCBndWFyZCh0aGlzKTsK
LSAgICB1cGRhdGVDb250ZW50SWZOZWVkZWQoKTsKLQotICAgIC8vIFdlIG11c3Qgbm90aWZ5IHRo
ZSBjaGFuZ2Ugc28gdGhlIGNsaWVudCBjYW4gcmVseSBvbiB1cyBmb3IgYWxsIGNoYW5nZSBvZiBH
ZW9tZXRyeS4KLSAgICBlbWl0IHZpZXdwb3J0VXBkYXRlUmVxdWVzdGVkKCk7Ci19Ci0KLXZvaWQg
UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjp1cGRhdGVDb250ZW50SWZOZWVkZWQoKQotewot
ICAgIHVwZGF0ZUNvbnRlbnRTY2FsZUlmTmVlZGVkKCk7Ci0gICAgdXBkYXRlQ29udGVudFBvc2l0
aW9uSWZOZWVkZWQoKTsKLX0KLQotdm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnVw
ZGF0ZUNvbnRlbnRTY2FsZUlmTmVlZGVkKCkKLXsKLSAgICBjb25zdCBxcmVhbCBjdXJyZW50Q29u
dGVudFNjYWxlID0gbV9jb250ZW50LT5zY2FsZSgpOwotICAgIHFyZWFsIGNvbnRlbnRTY2FsZSA9
IG1fY29udGVudC0+c2NhbGUoKTsKLSAgICBpZiAoIShtX3VzZXJJbnRlcmFjdGlvbkZsYWdzICYg
VXNlckhhc1NjYWxlZENvbnRlbnQpKQotICAgICAgICBjb250ZW50U2NhbGUgPSBtX2NvbnN0cmFp
bnRzLmluaXRpYWxTY2FsZTsKLQotICAgIGNvbnRlbnRTY2FsZSA9IHFCb3VuZChtX2NvbnN0cmFp
bnRzLm1pbmltdW1TY2FsZSwgY29udGVudFNjYWxlLCBtX2NvbnN0cmFpbnRzLm1heGltdW1TY2Fs
ZSk7Ci0KLSAgICBpZiAoY29udGVudFNjYWxlICE9IGN1cnJlbnRDb250ZW50U2NhbGUpIHsKLSAg
ICAgICAgY29uc3QgUVBvaW50RiBjZW50ZXJPZkludGVyZXN0ID0gdmlzaWJsZVJlY3RJbkNvbnRl
bnRDb29yZGluYXRlKG1fY29udGVudCwgbV92aWV3cG9ydCkuY2VudGVyKCk7Ci0gICAgICAgIHNj
YWxlQ29udGVudChjZW50ZXJPZkludGVyZXN0LCBjb250ZW50U2NhbGUpOwotICAgIH0KLX0KLQot
dm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnVwZGF0ZUNvbnRlbnRQb3NpdGlvbklm
TmVlZGVkKCkKLXsKLSAgICBpZiAoIShtX3VzZXJJbnRlcmFjdGlvbkZsYWdzICYgVXNlckhhc01v
dmVkQ29udGVudCkpIHsKLSAgICAgICAgbV9jb250ZW50LT5zZXRYKChtX3ZpZXdwb3J0LT53aWR0
aCgpIC0gY29udGVudFJlY3RJblZpZXdwb3J0Q29vcmRpbmF0ZShtX2NvbnRlbnQsIG1fdmlld3Bv
cnQpLndpZHRoKCkpIC8gMik7Ci0gICAgICAgIG1fY29udGVudC0+c2V0WSgwKTsKLSAgICB9Ci0K
LSAgICAvLyBGSVhNRTogaWYgdGhlIGl0ZW0gY2FuIGJlIGZ1bGx5IGluIHRoZSB2aWV3cG9ydCBh
bmQgaXMgb3ZlciBhIHNpZGUsIHB1c2ggaXQgYmFjayBpbiB2aWV3Ci0gICAgLy8gRklYTUU6IGlm
IHRoZSBpdGVtIGNhbm5vdCBiZSBmdWxseSBpbiB2aWV3cG9ydCwgYW5kIGlzIG5vdCBjb3Zlcmlu
ZyB0aGUgdmlld3BvcnQsIHB1c2ggaXQgYmFjayBpbiB2aWV3Ci19Ci0KLXZvaWQgUXRWaWV3cG9y
dEludGVyYWN0aW9uRW5naW5lOjphbmltYXRlQ29udGVudEludG9Cb3VuZGFyaWVzSWZOZWVkZWQo
KQotewotICAgIGFuaW1hdGVDb250ZW50U2NhbGVJbnRvQm91bmRhcmllc0lmTmVlZGVkKCk7Ci0g
ICAgYW5pbWF0ZUNvbnRlbnRQb3NpdGlvbkludG9Cb3VuZGFyaWVzSWZOZWVkZWQoKTsKLX0KLQot
dm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OmFuaW1hdGVDb250ZW50UG9zaXRpb25J
bnRvQm91bmRhcmllc0lmTmVlZGVkKCkKLXsKLSAgICBjb25zdCBRUmVjdEYgY29udGVudEdlb21l
dHJ5ID0gbV92aWV3cG9ydC0+bWFwUmVjdEZyb21JdGVtKG1fY29udGVudCwgbV9jb250ZW50LT5i
b3VuZGluZ1JlY3QoKSk7Ci0gICAgUVBvaW50RiBuZXdQb3MgPSBjb250ZW50R2VvbWV0cnkudG9w
TGVmdCgpOwotCi0gICAgLy8gSG9yaXpvbnRhbCBjb3JyZWN0aW9uLgotICAgIGlmIChjb250ZW50
R2VvbWV0cnkud2lkdGgoKSA8IG1fdmlld3BvcnQtPndpZHRoKCkpCi0gICAgICAgIG5ld1Bvcy5z
ZXRYKChtX3ZpZXdwb3J0LT53aWR0aCgpIC0gY29udGVudEdlb21ldHJ5LndpZHRoKCkpIC8gMik7
Ci0gICAgZWxzZSB7Ci0gICAgICAgIG5ld1Bvcy5zZXRYKHFNaW48cXJlYWw+KDAuLCBuZXdQb3Mu
eCgpKSk7Ci0gICAgICAgIGNvbnN0IHFyZWFsIHJpZ2h0U2lkZUdhcCA9IG1fdmlld3BvcnQtPmJv
dW5kaW5nUmVjdCgpLnJpZ2h0KCkgLSBjb250ZW50R2VvbWV0cnkucmlnaHQoKTsKLSAgICAgICAg
aWYgKHJpZ2h0U2lkZUdhcCA+IDAuKQotICAgICAgICAgICAgbmV3UG9zLnNldFgobmV3UG9zLngo
KSArIHJpZ2h0U2lkZUdhcCk7Ci0gICAgfQotCi0gICAgLy8gVmVydGljYWwgY29ycmVjdGlvbi4K
LSAgICBpZiAoY29udGVudEdlb21ldHJ5LmhlaWdodCgpIDwgbV92aWV3cG9ydC0+aGVpZ2h0KCkp
Ci0gICAgICAgIG5ld1Bvcy5zZXRZKDApOwotICAgIGVsc2UgewotICAgICAgICBuZXdQb3Muc2V0
WShxTWluPHFyZWFsPigwLiwgbmV3UG9zLnkoKSkpOwotICAgICAgICBjb25zdCBxcmVhbCBib3R0
b21TaWRlR2FwID0gbV92aWV3cG9ydC0+Ym91bmRpbmdSZWN0KCkuYm90dG9tKCkgLSBjb250ZW50
R2VvbWV0cnkuYm90dG9tKCk7Ci0gICAgICAgIGlmIChib3R0b21TaWRlR2FwID4gMC4pCi0gICAg
ICAgICAgICBuZXdQb3Muc2V0WShuZXdQb3MueSgpICsgYm90dG9tU2lkZUdhcCk7Ci0gICAgfQot
Ci0gICAgaWYgKG5ld1BvcyAhPSBtX2NvbnRlbnQtPnBvcygpKQotICAgICAgICAvLyBGSVhNRTog
RG8geW91IGtub3cgd2hhdCBBTklNQVRFIG1lYW5zPwotICAgICAgICBtX2NvbnRlbnQtPnNldFBv
cyhuZXdQb3MpOwotfQotCi12b2lkIFF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6YW5pbWF0
ZUNvbnRlbnRTY2FsZUludG9Cb3VuZGFyaWVzSWZOZWVkZWQoKQotewotICAgIGNvbnN0IHFyZWFs
IGN1cnJlbnRTY2FsZSA9IG1fY29udGVudC0+c2NhbGUoKTsKLSAgICBjb25zdCBxcmVhbCBib3Vu
ZGVkU2NhbGUgPSBxQm91bmQobV9jb25zdHJhaW50cy5taW5pbXVtU2NhbGUsIGN1cnJlbnRTY2Fs
ZSwgbV9jb25zdHJhaW50cy5tYXhpbXVtU2NhbGUpOwotICAgIGlmIChjdXJyZW50U2NhbGUgIT0g
Ym91bmRlZFNjYWxlKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBEbyB5b3Uga25vdyB3aGF0IEFOSU1B
VEUgbWVhbnM/Ci0gICAgICAgIGNvbnN0IFFQb2ludEYgY2VudGVyT2ZJbnRlcmVzdCA9IHZpc2li
bGVSZWN0SW5Db250ZW50Q29vcmRpbmF0ZShtX2NvbnRlbnQsIG1fdmlld3BvcnQpLmNlbnRlcigp
OwotICAgICAgICBzY2FsZUNvbnRlbnQoY2VudGVyT2ZJbnRlcmVzdCwgYm91bmRlZFNjYWxlKTsK
LSAgICB9Ci19Ci0KLXZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpzY2FsZUNvbnRl
bnQoY29uc3QgUVBvaW50RiYgY2VudGVySW5Db250ZW50Q29vcmRpbmF0ZSwgcXJlYWwgc2NhbGUp
Ci17Ci0gICAgUVBvaW50RiBvbGRQaW5jaENlbnRlck9uUGFyZW50ID0gbV9jb250ZW50LT5tYXBU
b0l0ZW0obV9jb250ZW50LT5wYXJlbnRJdGVtKCksIGNlbnRlckluQ29udGVudENvb3JkaW5hdGUp
OwotICAgIG1fY29udGVudC0+c2V0U2NhbGUoc2NhbGUpOwotICAgIFFQb2ludEYgbmV3UGluY2hD
ZW50ZXJPblBhcmVudCA9IG1fY29udGVudC0+bWFwVG9JdGVtKG1fY29udGVudC0+cGFyZW50SXRl
bSgpLCBjZW50ZXJJbkNvbnRlbnRDb29yZGluYXRlKTsKLSAgICBtX2NvbnRlbnQtPnNldFBvcyht
X2NvbnRlbnQtPnBvcygpIC0gKG5ld1BpbmNoQ2VudGVyT25QYXJlbnQgLSBvbGRQaW5jaENlbnRl
ck9uUGFyZW50KSk7CisgICAgYW5pbWF0ZUNvbnRlbnRJbnRvQm91bmRhcmllc0lmTmVlZGVkKCk7
CiB9CiAKICNpbmNsdWRlICJtb2NfUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmNwcCIKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFZpZXdwb3J0SW50ZXJhY3Rp
b25FbmdpbmUuaCBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFZpZXdwb3J0SW50ZXJh
Y3Rpb25FbmdpbmUuaAppbmRleCA5MjAyOTMyLi44N2VjNGYxIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmgKKysrIGIv
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1F0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS5o
CkBAIC0xLDQgKzEsNSBAQAogLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBOb2tpYSBDb3Jwb3Jh
dGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKICAqIENvcHlyaWdodCAoQykgMjAxMSBC
ZW5qYW1pbiBQb3VsYWluIDxiZW5qYW1pbkB3ZWJraXQub3JnPgogICoKICAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTIy
LDggKzIzLDExIEBACiAjZGVmaW5lIFF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZV9oCiAKICNp
bmNsdWRlICJPd25QdHIuaCIKKyNpbmNsdWRlIDxRU2Nyb2xsZXI+CiAjaW5jbHVkZSAicXdlYmtp
dGdsb2JhbC5oIgogI2luY2x1ZGUgPFF0Q29yZS9RT2JqZWN0PgorI2luY2x1ZGUgPFF0Q29yZS9R
VmFyaWFudD4KKyNpbmNsdWRlIDxRdENvcmUvUVZhcmlhbnRBbmltYXRpb24+CiAKIFFUX0JFR0lO
X05BTUVTUEFDRQogY2xhc3MgUVBvaW50RjsKQEAgLTU1LDE3ICs1OSwyMCBAQCBwdWJsaWM6CiAg
ICAgICAgIGJvb2wgaXNVc2VyU2NhbGFibGU7CiAgICAgfTsKIAorICAgIGJvb2wgZXZlbnQoUUV2
ZW50Kik7CisKICAgICB2b2lkIHJlc2V0KCk7CiAgICAgdm9pZCBzZXRDb25zdHJhaW50cyhjb25z
dCBDb25zdHJhaW50cyYpOwogCi0gICAgdm9pZCBwYW5HZXN0dXJlU3RhcnRlZCgpOwotICAgIHZv
aWQgcGFuR2VzdHVyZVJlcXVlc3RVcGRhdGUocXJlYWwgZGVsdGFYLCBxcmVhbCBkZWx0YVkpOwor
ICAgIHZvaWQgcGFuR2VzdHVyZVN0YXJ0ZWQoY29uc3QgUVBvaW50RiYgdG91Y2hQb2ludCwgcWlu
dDY0IHRpbWVzdGFtcE1TKTsKKyAgICB2b2lkIHBhbkdlc3R1cmVSZXF1ZXN0VXBkYXRlKGNvbnN0
IFFQb2ludEYmIHRvdWNoUG9pbnQsIHFpbnQ2NCB0aW1lc3RhbXBNUyk7CiAgICAgdm9pZCBwYW5H
ZXN0dXJlQ2FuY2VsbGVkKCk7Ci0gICAgdm9pZCBwYW5HZXN0dXJlRW5kZWQoKTsKKyAgICB2b2lk
IHBhbkdlc3R1cmVFbmRlZChjb25zdCBRUG9pbnRGJiB0b3VjaFBvaW50LCBxaW50NjQgdGltZXN0
YW1wTVMpOwogCi0gICAgdm9pZCBwaW5jaEdlc3R1cmVTdGFydGVkKCk7CisgICAgdm9pZCBwaW5j
aEdlc3R1cmVTdGFydGVkKGNvbnN0IFFQb2ludEYmIHBpbmNoQ2VudGVySW5Db250ZW50Q29vcmRp
bmF0ZSk7CiAgICAgdm9pZCBwaW5jaEdlc3R1cmVSZXF1ZXN0VXBkYXRlKGNvbnN0IFFQb2ludEYm
IHBpbmNoQ2VudGVySW5Db250ZW50Q29vcmRpbmF0ZSwgcXJlYWwgdG90YWxTY2FsZUZhY3Rvcik7
CiAgICAgdm9pZCBwaW5jaEdlc3R1cmVFbmRlZCgpOworICAgIHZvaWQgc3RvcEFuaW1hdGlvbnMo
KTsKIAogUV9TSUdOQUxTOgogICAgIHZvaWQgdmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQoKTsKQEAg
LTc0LDE3ICs4MSwxMyBAQCBRX1NJR05BTFM6CiBwcml2YXRlIFFfU0xPVFM6CiAgICAgLy8gUmVz
cG9uZCB0byBjaGFuZ2VzIG9mIGNvbnRlbnQgdGhhdCBhcmUgbm90IGRyaXZlbiBieSB1cywgbGlr
ZSB0aGUgcGFnZSByZXNpemluZyBpdHNlbGYuCiAgICAgdm9pZCBjb250ZW50Vmlld3BvcnRDaGFu
Z2VkKCk7CisgICAgdm9pZCB1cGRhdGVWaXNpYmxlUmVjdChRVmFyaWFudCB2aXNpYmxlUmVjdFZh
cmlhbnQpOworICAgIHZvaWQgc2NhbGVBbmltYXRpb25TdGF0ZUNoYW5nZWQoUUFic3RyYWN0QW5p
bWF0aW9uOjpTdGF0ZSwgUUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSk7CiAKIHByaXZhdGU6Ci0g
ICAgdm9pZCB1cGRhdGVDb250ZW50SWZOZWVkZWQoKTsKLSAgICB2b2lkIHVwZGF0ZUNvbnRlbnRT
Y2FsZUlmTmVlZGVkKCk7Ci0gICAgdm9pZCB1cGRhdGVDb250ZW50UG9zaXRpb25JZk5lZWRlZCgp
OwotCi0gICAgdm9pZCBhbmltYXRlQ29udGVudEludG9Cb3VuZGFyaWVzSWZOZWVkZWQoKTsKLSAg
ICB2b2lkIGFuaW1hdGVDb250ZW50UG9zaXRpb25JbnRvQm91bmRhcmllc0lmTmVlZGVkKCk7Ci0g
ICAgdm9pZCBhbmltYXRlQ29udGVudFNjYWxlSW50b0JvdW5kYXJpZXNJZk5lZWRlZCgpOworICAg
IHZvaWQgYW5pbWF0ZUNvbnRlbnRJbnRvQm91bmRhcmllc0lmTmVlZGVkKGludCBhbmltYXRpb25E
dXJhdGlvbiA9IDApOwogCi0gICAgdm9pZCBzY2FsZUNvbnRlbnQoY29uc3QgUVBvaW50RiYgY2Vu
dGVySW5Db250ZW50Q29vcmRpbmF0ZSwgcXJlYWwgc2NhbGUpOworICAgIFFTY3JvbGxlciogc2Ny
b2xsZXIoKSB7IHJldHVybiBRU2Nyb2xsZXI6OnNjcm9sbGVyKHRoaXMpOyB9CiAKICAgICBmcmll
bmQgY2xhc3MgVmlld3BvcnRVcGRhdGVHdWFyZDsKIApAQCAtOTIsNyArOTUsNyBAQCBwcml2YXRl
OgogICAgIFFTR0l0ZW0qIGNvbnN0IG1fY29udGVudDsKIAogICAgIENvbnN0cmFpbnRzIG1fY29u
c3RyYWludHM7Ci0gICAgYm9vbCBtX2lzVXBkYXRpbmdDb250ZW50OworICAgIGludCBtX3BlbmRp
bmdVcGRhdGVzOwogICAgIE93blB0cjxWaWV3cG9ydFVwZGF0ZUd1YXJkPiBtX3BpbmNoVmlld3Bv
cnRVcGRhdGVEZWZlcnJlcjsKICAgICBlbnVtIFVzZXJJbnRlcmFjdGlvbkZsYWcgewogICAgICAg
ICBVc2VySGFzTm90SW50ZXJhY3RlZFdpdGhDb250ZW50ID0gMCwKQEAgLTEwMiw2ICsxMDUsMTcg
QEAgcHJpdmF0ZToKICAgICBRX0RFQ0xBUkVfRkxBR1MoVXNlckludGVyYWN0aW9uRmxhZ3MsIFVz
ZXJJbnRlcmFjdGlvbkZsYWcpOwogICAgIFVzZXJJbnRlcmFjdGlvbkZsYWdzIG1fdXNlckludGVy
YWN0aW9uRmxhZ3M7CiAKKyAgICBjbGFzcyBTY2FsZUFuaW1hdGlvbiA6IHB1YmxpYyBRVmFyaWFu
dEFuaW1hdGlvbiB7CisgICAgcHVibGljOgorICAgICAgICBTY2FsZUFuaW1hdGlvbihRT2JqZWN0
KiBwYXJlbnQgPSAwKQorICAgICAgICAgICAgOiBRVmFyaWFudEFuaW1hdGlvbihwYXJlbnQpCisg
ICAgICAgIHsgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDdXJyZW50VmFsdWUoY29u
c3QgUVZhcmlhbnQmKSB7IH0KKyAgICB9OworCisgICAgU2NhbGVBbmltYXRpb24qIG1fc2NhbGVB
bmltYXRpb247CisgICAgUVBvaW50RiBtX2xhc3RQaW5jaENlbnRlckluVmlld3BvcnRDb29yZGlu
YXRlOwogICAgIHFyZWFsIG1fcGluY2hTdGFydFNjYWxlOwogfTsKIAotLSAKMS43LjcKCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112327</attachid>
            <date>2011-10-25 06:11:29 -0700</date>
            <delta_ts>2011-10-25 08:18:34 -0700</delta_ts>
            <desc>proposed patch addressing review comments</desc>
            <filename>0001-BUG66664-Qt-WK2-Add-the-animations-on-the.patch</filename>
            <type>text/plain</type>
            <size>33224</size>
            <attacher name="Andras Becsi">abecsi</attacher>
            
              <data encoding="base64">RnJvbSA2MjVhZWU2ZmM2MGRkMzgxYjQ4NjUxYTA0ZDA3NjFmNzQ4MTZlOGFkIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyYXMgQmVjc2kgPGFuZHJhcy5iZWNzaUBub2tpYS5jb20+
CkRhdGU6IFR1ZSwgMjUgT2N0IDIwMTEgMTU6MDc6MTUgKzAyMDAKU3ViamVjdDogW1BBVENIXSBb
QlVHNjY2NjRdW1F0XVtXSzJdIEFkZCB0aGUgYW5pbWF0aW9ucyBvbiB0aGUKCi0tLQogU291cmNl
L1dlYktpdDIvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDUxICsrKwog
Li4uL1VJUHJvY2Vzcy9xdC9RdFBhbkdlc3R1cmVSZWNvZ25pemVyLmNwcCAgICAgICAgfCAgIDEx
ICstCiAuLi4vV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRQYW5HZXN0dXJlUmVjb2duaXplci5oICB8
ICAgIDIgKy0KIC4uLi9VSVByb2Nlc3MvcXQvUXRQaW5jaEdlc3R1cmVSZWNvZ25pemVyLmNwcCAg
ICAgIHwgICAgMiArLQogLi4uL1dlYktpdDIvVUlQcm9jZXNzL3F0L1F0VG91Y2hXZWJQYWdlUHJv
eHkuY3BwICAgfCAgICA0ICstCiAuLi4vVUlQcm9jZXNzL3F0L1F0Vmlld3BvcnRJbnRlcmFjdGlv
bkVuZ2luZS5jcHAgICB8ICAzNDMgKysrKysrKysrKysrLS0tLS0tLS0KIC4uLi9VSVByb2Nlc3Mv
cXQvUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmggICAgIHwgICA0MCArKy0KIDcgZmlsZXMg
Y2hhbmdlZCwgMzAwIGluc2VydGlvbnMoKyksIDE1MyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKaW5k
ZXggMDg1MTA2OC4uYmI3NTU3MyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9n
CisrKyBiL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwpAQCAtMSwzICsxLDU0IEBACisyMDExLTEw
LTI1ICBBbmRyYXMgQmVjc2kgIDxhbmRyYXMuYmVjc2lAbm9raWEuY29tPgorCisgICAgICAgIFtR
dF1bV0syXSBBZGQgdGhlIGFuaW1hdGlvbnMgb24gdGhlIFZpZXdwb3J0SW50ZXJhY3Rpb25Fbmdp
bmUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTY2NjY0
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW50cm9k
dWNlIGEgUVNjcm9sbGVyIGJhc2VkIHBhbm5pbmcgYW5kIGEgUVZhcmlhbnRBbmltYXRpb24gYmFz
ZWQgc2NhbGUgYW5pbWF0aW9uLgorICAgICAgICBRU2Nyb2xsZXIgYWxzbyBoYW5kbGVzIGZsaWNr
IGdlc3R1cmVzIGFuZCBhbmltYXRlcyBvdmVyc2hvb3QuCisgICAgICAgIElmIGEgcGluY2ggZ2Vz
dHVyZSBlbmRzLCB0aGUgc2NhbGUgYW5pbWF0aW9uIHdpbGwgc2NhbGUgYW5kIHJlcG9zaXRpb24g
dGhlIGNvbnRlbnQKKyAgICAgICAgc3VjaCB0aGF0IGl0IGlzIHdpdGhpbiB2YWxpZCBib3VuZGFy
aWVzLiBUaGUgY29udGVudCBpcyBieSBkZWZhdWx0IGFuaW1hdGVkIHN1Y2gKKyAgICAgICAgdGhh
dCB0aGUgY29udGVudCBwb3NpdGlvbiBhcyBzZWVuIGluIHRoZSBjZW50ZXIgb2YgdGhlIHZpc2li
bGUgdmlld3BvcnQgc3RheXMKKyAgICAgICAgaW4gdGhlIGNlbnRlciwgdW5sZXNzIHRoZSBjb250
ZW50IHdvdWxkIGJlIG91dCBvZiB2YWxpZCBib3VuZHMuCisgICAgICAgIFRoZSBwYXRjaCBhbHNv
IHNpbXBsaWZpZXMgdGhlIFZpZXdwb3J0VXBkYXRlR3VhcmQgYnkgdXNpbmcgcmVmZXJlbmNlIGNv
dW50aW5nCisgICAgICAgIGluc3RlYWQgb2YgYSBib29sZWFuIGZvciBkZWZlcmluZyB1cGRhdGUg
cmVxdWVzdHMuCisKKyAgICAgICAgKiBVSVByb2Nlc3MvcXQvUXRQYW5HZXN0dXJlUmVjb2duaXpl
ci5jcHA6CisgICAgICAgIChXZWJLaXQ6OlF0UGFuR2VzdHVyZVJlY29nbml6ZXI6OnJlY29nbml6
ZSk6CisgICAgICAgICogVUlQcm9jZXNzL3F0L1F0UGFuR2VzdHVyZVJlY29nbml6ZXIuaDoKKyAg
ICAgICAgKiBVSVByb2Nlc3MvcXQvUXRQaW5jaEdlc3R1cmVSZWNvZ25pemVyLmNwcDoKKyAgICAg
ICAgKFdlYktpdDo6UXRQaW5jaEdlc3R1cmVSZWNvZ25pemVyOjpyZWNvZ25pemUpOgorICAgICAg
ICAqIFVJUHJvY2Vzcy9xdC9RdFRvdWNoV2ViUGFnZVByb3h5LmNwcDoKKyAgICAgICAgKFF0VG91
Y2hXZWJQYWdlUHJveHk6OmRvbmVXaXRoVG91Y2hFdmVudCk6CisgICAgICAgICogVUlQcm9jZXNz
L3F0L1F0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS5jcHA6CisgICAgICAgIChXZWJLaXQ6OmJp
bmRUb1NjYWxlTGltaXRzKToKKyAgICAgICAgKFdlYktpdDo6aW5uZXJCb3VuZGVkU2NhbGUpOgor
ICAgICAgICAoV2ViS2l0OjpvdXRlckJvdW5kZWRTY2FsZSk6CisgICAgICAgIChXZWJLaXQ6OlZp
ZXdwb3J0VXBkYXRlR3VhcmQ6OlZpZXdwb3J0VXBkYXRlR3VhcmQpOgorICAgICAgICAoV2ViS2l0
OjpWaWV3cG9ydFVwZGF0ZUd1YXJkOjp+Vmlld3BvcnRVcGRhdGVHdWFyZCk6CisgICAgICAgIChX
ZWJLaXQ6OlF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6UXRWaWV3cG9ydEludGVyYWN0aW9u
RW5naW5lKToKKyAgICAgICAgKFdlYktpdDo6UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjp1
cGRhdGVWaXNpYmxlUmVjdCk6CisgICAgICAgIChXZWJLaXQ6OlF0Vmlld3BvcnRJbnRlcmFjdGlv
bkVuZ2luZTo6c2NhbGVBbmltYXRpb25TdGF0ZUNoYW5nZWQpOgorICAgICAgICAoV2ViS2l0OjpR
dFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OmV2ZW50KToKKyAgICAgICAgKFdlYktpdDo6UXRW
aWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpzdG9wQW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJL
aXQ6OlF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6Y2FsY3VsYXRlQm91bmRhcmllc0ZvclNj
YWxlKToKKyAgICAgICAgKFdlYktpdDo6UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjphbmlt
YXRlQ29udGVudEludG9Cb3VuZGFyaWVzSWZOZWVkZWQpOgorICAgICAgICAoV2ViS2l0OjpRdFZp
ZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnJlc2V0KToKKyAgICAgICAgKFdlYktpdDo6UXRWaWV3
cG9ydEludGVyYWN0aW9uRW5naW5lOjpzZXRDb25zdHJhaW50cyk6CisgICAgICAgIChXZWJLaXQ6
OlF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6cGFuR2VzdHVyZVN0YXJ0ZWQpOgorICAgICAg
ICAoV2ViS2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBhbkdlc3R1cmVSZXF1ZXN0
VXBkYXRlKToKKyAgICAgICAgKFdlYktpdDo6UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpw
YW5HZXN0dXJlQ2FuY2VsbGVkKToKKyAgICAgICAgKFdlYktpdDo6UXRWaWV3cG9ydEludGVyYWN0
aW9uRW5naW5lOjpwYW5HZXN0dXJlRW5kZWQpOgorICAgICAgICAoV2ViS2l0OjpRdFZpZXdwb3J0
SW50ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2VzdHVyZVN0YXJ0ZWQpOgorICAgICAgICAoV2ViS2l0
OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2VzdHVyZVJlcXVlc3RVcGRhdGUp
OgorICAgICAgICAoV2ViS2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2Vz
dHVyZUVuZGVkKToKKyAgICAgICAgKFdlYktpdDo6UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5l
Ojpjb250ZW50Vmlld3BvcnRDaGFuZ2VkKToKKyAgICAgICAgKiBVSVByb2Nlc3MvcXQvUXRWaWV3
cG9ydEludGVyYWN0aW9uRW5naW5lLmg6CisgICAgICAgIChXZWJLaXQ6OlF0Vmlld3BvcnRJbnRl
cmFjdGlvbkVuZ2luZTo6c2Nyb2xsZXIpOgorICAgICAgICAoV2ViS2l0OjpRdFZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmU6OlNjYWxlQW5pbWF0aW9uOjpTY2FsZUFuaW1hdGlvbik6CisgICAgICAg
IChXZWJLaXQ6OlF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6U2NhbGVBbmltYXRpb246OnVw
ZGF0ZUN1cnJlbnRWYWx1ZSk6CisKIDIwMTEtMTAtMjUgIFphbGFuIEJ1anRhcyAgPHpidWp0YXNA
Z21haWwuY29tPgogCiAgICAgICAgIFtRdF1bV0syXSBSZW1vdmUgcmVkdW5kYW50IHNldFBhZ2VJ
c1Zpc2libGUoKSBBUEkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9R
dFBhbkdlc3R1cmVSZWNvZ25pemVyLmNwcCBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9R
dFBhbkdlc3R1cmVSZWNvZ25pemVyLmNwcAppbmRleCA0ZThiMWZjLi5kYjI4ZGVlIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRQYW5HZXN0dXJlUmVjb2duaXplci5j
cHAKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1F0UGFuR2VzdHVyZVJlY29nbml6
ZXIuY3BwCkBAIC0zNyw3ICszNyw3IEBAIFF0UGFuR2VzdHVyZVJlY29nbml6ZXI6OlF0UGFuR2Vz
dHVyZVJlY29nbml6ZXIoUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lKiBpbnRlCiAgICAgcmVz
ZXQoKTsKIH0KIAotYm9vbCBRdFBhbkdlc3R1cmVSZWNvZ25pemVyOjpyZWNvZ25pemUoY29uc3Qg
UVRvdWNoRXZlbnQqIGV2ZW50KQorYm9vbCBRdFBhbkdlc3R1cmVSZWNvZ25pemVyOjpyZWNvZ25p
emUoY29uc3QgUVRvdWNoRXZlbnQqIGV2ZW50LCBxaW50NjQgdGltZXN0YW1wTVMpCiB7CiAgICAg
Ly8gUGFuIGdlc3R1cmUgYWx3YXlzIHN0YXJ0cyBvbiBUb3VjaEJlZ2luIHVubGVzcyB0aGUgZW5n
aW5lIGlzIHN1c3BlbmRlZC4KICAgICBpZiAobV9zdGF0ZSA9PSBOb0dlc3R1cmUgJiYgZXZlbnQt
PnR5cGUoKSAhPSBRRXZlbnQ6OlRvdWNoQmVnaW4pCkBAIC01OCw2ICs1OCw3IEBAIGJvb2wgUXRQ
YW5HZXN0dXJlUmVjb2duaXplcjo6cmVjb2duaXplKGNvbnN0IFFUb3VjaEV2ZW50KiBldmVudCkK
ICAgICAgICAgQVNTRVJUKG1fc3RhdGUgPT0gTm9HZXN0dXJlKTsKICAgICAgICAgbV9zdGF0ZSA9
IEdlc3R1cmVSZWNvZ25pdGlvblN0YXJ0ZWQ7CiAgICAgICAgIG1fZmlyc3RQb3NpdGlvbiA9IHRv
dWNoUG9pbnQuc2NyZWVuUG9zKCk7CisgICAgICAgIG1fdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2lu
ZS0+c3RvcEFuaW1hdGlvbnMoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGNhc2UgUUV2
ZW50OjpUb3VjaFVwZGF0ZTogewogICAgICAgICBBU1NFUlQobV9zdGF0ZSAhPSBOb0dlc3R1cmUp
OwpAQCAtNjksMTggKzcwLDE2IEBAIGJvb2wgUXRQYW5HZXN0dXJlUmVjb2duaXplcjo6cmVjb2du
aXplKGNvbnN0IFFUb3VjaEV2ZW50KiBldmVudCkKICAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CiAKICAgICAgICAgICAgIG1fc3RhdGUgPSBHZXN0dXJlUmVjb2duaXplZDsKLSAgICAgICAg
ICAgIG1fdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+cGFuR2VzdHVyZVN0YXJ0ZWQoKTsKKyAg
ICAgICAgICAgIG1fdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+cGFuR2VzdHVyZVN0YXJ0ZWQo
dG91Y2hQb2ludC5wb3MoKSwgdGltZXN0YW1wTVMpOwogICAgICAgICB9CiAKICAgICAgICAgQVNT
RVJUKG1fc3RhdGUgPT0gR2VzdHVyZVJlY29nbml6ZWQpOwotICAgICAgICAvLyBPZmZzZXQgc2Vu
dCB0byB0aGUgdmlld3MgbXVzdCBiZSBpbiBwYWdlIHZpZXcgY29vcmRpbmF0ZSBzcGFjZS4KLSAg
ICAgICAgUVBvaW50RiBvZmZzZXRTaW5jZUxhc3RFdmVudCh0b3VjaFBvaW50LnBvcygpIC0gdG91
Y2hQb2ludC5sYXN0UG9zKCkpOwotICAgICAgICBtX3ZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUt
PnBhbkdlc3R1cmVSZXF1ZXN0VXBkYXRlKG9mZnNldFNpbmNlTGFzdEV2ZW50LngoKSwgb2Zmc2V0
U2luY2VMYXN0RXZlbnQueSgpKTsKKyAgICAgICAgbV92aWV3cG9ydEludGVyYWN0aW9uRW5naW5l
LT5wYW5HZXN0dXJlUmVxdWVzdFVwZGF0ZSh0b3VjaFBvaW50LnBvcygpLCB0aW1lc3RhbXBNUyk7
CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBjYXNlIFFFdmVudDo6VG91Y2hFbmQ6
CiAgICAgICAgIGlmIChtX3N0YXRlID09IEdlc3R1cmVSZWNvZ25pemVkKSB7Ci0gICAgICAgICAg
ICBtX3ZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPnBhbkdlc3R1cmVFbmRlZCgpOworICAgICAg
ICAgICAgbV92aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLT5wYW5HZXN0dXJlRW5kZWQodG91Y2hQ
b2ludC5wb3MoKSwgdGltZXN0YW1wTVMpOwogICAgICAgICAgICAgcmVzZXQoKTsKICAgICAgICAg
ICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvcXQvUXRQYW5HZXN0dXJlUmVjb2duaXplci5oIGIvU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL3F0L1F0UGFuR2VzdHVyZVJlY29nbml6ZXIuaAppbmRleCBmMTQ0NjJlLi5lYTRhOGY0
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRQYW5HZXN0dXJlUmVj
b2duaXplci5oCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFBhbkdlc3R1cmVS
ZWNvZ25pemVyLmgKQEAgLTQyLDcgKzQyLDcgQEAgY29uc3QgcXJlYWwgcGFubmluZ0luaXRpYWxU
cmlnZ2VyRGlzdGFuY2VUaHJlc2hvbGQgPSA1LjsKIGNsYXNzIFF0UGFuR2VzdHVyZVJlY29nbml6
ZXIgOiBwcml2YXRlIFF0R2VzdHVyZVJlY29nbml6ZXIgewogcHVibGljOgogICAgIFF0UGFuR2Vz
dHVyZVJlY29nbml6ZXIoUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lKik7Ci0gICAgYm9vbCBy
ZWNvZ25pemUoY29uc3QgUVRvdWNoRXZlbnQqKTsKKyAgICBib29sIHJlY29nbml6ZShjb25zdCBR
VG91Y2hFdmVudCosIHFpbnQ2NCB0aW1lc3RhbXBNUyk7CiAgICAgdm9pZCByZXNldCgpOwogCiBw
cml2YXRlOgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1F0UGluY2hH
ZXN0dXJlUmVjb2duaXplci5jcHAgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRQaW5j
aEdlc3R1cmVSZWNvZ25pemVyLmNwcAppbmRleCBmMzlkZmFhLi42M2E5ZGI1IDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRQaW5jaEdlc3R1cmVSZWNvZ25pemVyLmNw
cAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRQaW5jaEdlc3R1cmVSZWNvZ25p
emVyLmNwcApAQCAtOTYsNyArOTYsNyBAQCBib29sIFF0UGluY2hHZXN0dXJlUmVjb2duaXplcjo6
cmVjb2duaXplKGNvbnN0IFFUb3VjaEV2ZW50KiBldmVudCkKICAgICAgICAgICAgICAgICBpZiAo
cGluY2hEaXN0YW5jZSA8IHBpbmNoSW5pdGlhbFRyaWdnZXJEaXN0YW5jZVRocmVzaG9sZCkKICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIG1fc3RhdGUg
PSBHZXN0dXJlUmVjb2duaXplZDsKLSAgICAgICAgICAgICAgICBtX3ZpZXdwb3J0SW50ZXJhY3Rp
b25FbmdpbmUtPnBpbmNoR2VzdHVyZVN0YXJ0ZWQoKTsKKyAgICAgICAgICAgICAgICBtX3ZpZXdw
b3J0SW50ZXJhY3Rpb25FbmdpbmUtPnBpbmNoR2VzdHVyZVN0YXJ0ZWQoY29tcHV0ZVRvdWNoQ2Vu
dGVyKHBvaW50MSwgcG9pbnQyKSk7CiAKICAgICAgICAgICAgICAgICAvLyBXZSByZXNldCB0aGUg
aW5pdGlhbCBwb3NpdGlvbiB0byB0aGUgcHJldmlvdXMgcG9zaXRpb24gaW4gb3JkZXIgdG8gYXZv
aWQgdGhlIGp1bXAgY2F1c2VkCiAgICAgICAgICAgICAgICAgLy8gYnkgc2tpcHBpbmcgYWxsIHRo
ZSBldmVudHMgYmV0d2VlbiB0aGUgYmVnaW5uaW5nIGFuZCB3aGVuIHRoZSB0aHJlc2hvbGQgaXMg
aGl0LgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1F0VG91Y2hXZWJQ
YWdlUHJveHkuY3BwIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1F0VG91Y2hXZWJQYWdl
UHJveHkuY3BwCmluZGV4IDE1MTQ1MzguLmE1NDFhM2IgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9xdC9RdFRvdWNoV2ViUGFnZVByb3h5LmNwcAorKysgYi9Tb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvcXQvUXRUb3VjaFdlYlBhZ2VQcm94eS5jcHAKQEAgLTU4LDcgKzU4LDkg
QEAgdm9pZCBRdFRvdWNoV2ViUGFnZVByb3h5Ojpkb25lV2l0aFRvdWNoRXZlbnQoY29uc3QgTmF0
aXZlV2ViVG91Y2hFdmVudCYgZXZlbnQsIGIKICAgICAgICAgbV9wYW5HZXN0dXJlUmVjb2duaXpl
ci5yZXNldCgpOwogICAgICAgICBtX3BpbmNoR2VzdHVyZVJlY29nbml6ZXIucmVzZXQoKTsKICAg
ICB9IGVsc2UgewotICAgICAgICBtX3Bhbkdlc3R1cmVSZWNvZ25pemVyLnJlY29nbml6ZShldmVu
dC5uYXRpdmVFdmVudCgpKTsKKyAgICAgICAgLy8gQ29udmVydCB0aGUgZXZlbnQgdGltZXN0YW1w
IGZyb20gc2Vjb25kIHRvIG1pbGxpc2Vjb25kLgorICAgICAgICBxaW50NjQgdGltZXN0YW1wTVMg
PSBzdGF0aWNfY2FzdDxxaW50NjQ+KGV2ZW50LnRpbWVzdGFtcCgpICogMTAwMCk7CisgICAgICAg
IG1fcGFuR2VzdHVyZVJlY29nbml6ZXIucmVjb2duaXplKGV2ZW50Lm5hdGl2ZUV2ZW50KCksIHRp
bWVzdGFtcE1TKTsKICAgICAgICAgbV9waW5jaEdlc3R1cmVSZWNvZ25pemVyLnJlY29nbml6ZShl
dmVudC5uYXRpdmVFdmVudCgpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0
Mi9VSVByb2Nlc3MvcXQvUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmNwcCBiL1NvdXJjZS9X
ZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUuY3BwCmluZGV4
IGQ0MWI2M2YuLmVmZGQ0ZDkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9x
dC9RdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJ
UHJvY2Vzcy9xdC9RdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUuY3BwCkBAIC0xLDQgKzEsNSBA
QAogLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRz
IHN1YnNpZGlhcnkoLWllcykKICAqIENvcHlyaWdodCAoQykgMjAxMSBCZW5qYW1pbiBQb3VsYWlu
IDxiZW5qYW1pbkB3ZWJraXQub3JnPgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTIzLDU4ICsyNCw3OSBAQAog
CiAjaW5jbHVkZSAiUGFzc093blB0ci5oIgogI2luY2x1ZGUgPFFQb2ludEY+CisjaW5jbHVkZSA8
UVNjcm9sbEV2ZW50PgorI2luY2x1ZGUgPFFTY3JvbGxQcmVwYXJlRXZlbnQ+CisjaW5jbHVkZSA8
UVNjcm9sbGVyUHJvcGVydGllcz4KICNpbmNsdWRlIDxRdERlY2xhcmF0aXZlL3FzZ2l0ZW0uaD4K
IAogbmFtZXNwYWNlIFdlYktpdCB7CiAKLXN0YXRpYyBpbmxpbmUgUVJlY3RGIHZpc2libGVSZWN0
SW5Db250ZW50Q29vcmRpbmF0ZShjb25zdCBRU0dJdGVtKiBjb250ZW50LCBjb25zdCBRU0dJdGVt
KiB2aWV3cG9ydCkKLXsKLSAgICBjb25zdCBRUmVjdEYgdmlld3BvcnRJbkNvbnRlbnRDb29yZGlu
YXRlID0gY29udGVudC0+bWFwUmVjdEZyb21JdGVtKHZpZXdwb3J0LCB2aWV3cG9ydC0+Ym91bmRp
bmdSZWN0KCkpOwotICAgIGNvbnN0IFFSZWN0RiB2aXNpYmxlQXJlYSA9IGNvbnRlbnQtPmJvdW5k
aW5nUmVjdCgpLmludGVyc2VjdGVkKHZpZXdwb3J0SW5Db250ZW50Q29vcmRpbmF0ZSk7Ci0gICAg
cmV0dXJuIHZpc2libGVBcmVhOwotfQorc3RhdGljIGNvbnN0IGludCBrU2NhbGVBbmltYXRpb25E
dXJhdGlvbk1TID0gNDAwOwogCiBzdGF0aWMgaW5saW5lIFFSZWN0RiBjb250ZW50UmVjdEluVmll
d3BvcnRDb29yZGluYXRlKGNvbnN0IFFTR0l0ZW0qIGNvbnRlbnQsIGNvbnN0IFFTR0l0ZW0qIHZp
ZXdwb3J0KQogewogICAgIHJldHVybiB2aWV3cG9ydC0+bWFwUmVjdEZyb21JdGVtKGNvbnRlbnQs
IGNvbnRlbnQtPmJvdW5kaW5nUmVjdCgpKTsKIH0KIAorc3RhdGljIGlubGluZSBxcmVhbCBiaW5k
VG9TY2FsZUxpbWl0cyhxcmVhbCBzY2FsZSkKK3sKKyAgICAvLyBCb3VuZGVkIGJ5IFswLjEsIDEw
LjBdIGxpa2UgdGhlIHZpZXdwb3J0IG1ldGEgY29kZSBpbiBXZWJDb3JlLgorICAgIHJldHVybiBx
Qm91bmQocXJlYWwoMC4xKSwgc2NhbGUsIHFyZWFsKDEwLjApKTsKK30KKworc3RhdGljIGlubGlu
ZSBxcmVhbCBpbm5lckJvdW5kZWRTY2FsZShRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OkNv
bnN0cmFpbnRzIGNvbnN0cmFpbnRzLCBxcmVhbCBzY2FsZSkKK3sKKyAgICByZXR1cm4gcUJvdW5k
KGNvbnN0cmFpbnRzLm1pbmltdW1TY2FsZSwgc2NhbGUsIGNvbnN0cmFpbnRzLm1heGltdW1TY2Fs
ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgcXJlYWwgb3V0ZXJCb3VuZGVkU2NhbGUoUXRWaWV3cG9y
dEludGVyYWN0aW9uRW5naW5lOjpDb25zdHJhaW50cyBjb25zdHJhaW50cywgcXJlYWwgc2NhbGUp
Cit7CisgICAgaWYgKGNvbnN0cmFpbnRzLmlzVXNlclNjYWxhYmxlKSB7CisgICAgICAgIHFyZWFs
IGhhcmRNaW4gPSBxcmVhbCgwLjUpICogY29uc3RyYWludHMubWluaW11bVNjYWxlOworICAgICAg
ICBxcmVhbCBoYXJkTWF4ID0gcXJlYWwoMi4wKSAqIGNvbnN0cmFpbnRzLm1heGltdW1TY2FsZTsK
KyAgICAgICAgcmV0dXJuIGJpbmRUb1NjYWxlTGltaXRzKHFCb3VuZChoYXJkTWluLCBzY2FsZSwg
aGFyZE1heCkpOworICAgIH0KKyAgICByZXR1cm4gaW5uZXJCb3VuZGVkU2NhbGUoY29uc3RyYWlu
dHMsIHNjYWxlKTsKK30KKwogLy8gVXBkYXRpbmcgY29udGVudCBwcm9wZXJ0aWVzIGNhdXNlIHRo
ZSBub3RpZnkgc2lnbmFscyB0byBiZSBzZW50IGJ5IHRoZSBjb250ZW50IGl0ZW0gaXRzZWxmLgog
Ly8gU2luY2Ugd2UgbWFuYWdlIHRob3NlIGRpZmZlcmVudGx5LCB3ZSBkbyBub3Qgd2FudCB0byBy
ZXNwb25kCiAvLyB0byB0aGVtIHdoZW4gd2UgYXJlIHRoZSBvbmUgY2hhbmdpbmcgdGhlIGNvbnRl
bnQuCiAvLwotLy8gVGhlIGd1YXJkIG1ha2Ugc3VyZSB0aGUgc2lnbmFsIHZpZXdwb3J0VXBkYXRl
UmVxdWVzdGVkKCkgaXMgc2VudCBpZiBuZWNlc3NhcnkuCisvLyBUaGUgZ3VhcmQgbWFrZXMgc3Vy
ZSB0aGF0IHRoZSBzaWduYWwgdmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQoKSBpcyBzZW50IGlmIG5l
Y2Vzc2FyeS4KIC8vIFdoZW4gbXVsdGlwbGUgZ3VhcmRzIGFyZSBhbGl2ZSwgdGhlaXIgbGlmZXRp
bWUgbXVzdCBiZSBwZXJmZWN0bHkgaW1icmljYXRlZCAoZS5nLiBpZiB1c2VkIG91c2lkZSBzdGFj
ayBmcmFtZXMpLgotLy8gV2UgcmVseSBvbiB0aGUgZmlyc3Qgb25lIHRvIHRyaWdnZXIgdGhlIHVw
ZGF0ZSBhdCB0aGUgZW5kIHNpbmNlIGl0IG9ubHkgdXNlcyBvbmUgYm9vbCBpbnRlcm5hbGx5Lgor
Ly8gV2UgcmVseSBvbiB0aGUgZmlyc3Qgb25lIHRvIHRyaWdnZXIgdGhlIHVwZGF0ZSBhdCB0aGUg
ZW5kLgogLy8KIC8vIFRoZSBwdWJsaWMgbWV0aG9kcyBzaG91bGQgY3JlYXRlIHRoZSBndWFyZCBp
ZiB0aGV5IG1pZ2h0IHVwZGF0ZSBjb250ZW50LgogY2xhc3MgVmlld3BvcnRVcGRhdGVHdWFyZCB7
CiBwdWJsaWM6CiAgICAgVmlld3BvcnRVcGRhdGVHdWFyZChRdFZpZXdwb3J0SW50ZXJhY3Rpb25F
bmdpbmUqIHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUpCiAgICAgICAgIDogdmlld3BvcnRJbnRl
cmFjdGlvbkVuZ2luZSh2aWV3cG9ydEludGVyYWN0aW9uRW5naW5lKQotICAgICAgICAsIHdhc1Vw
ZGF0aW5nQ29udGVudCh2aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLT5tX2lzVXBkYXRpbmdDb250
ZW50KQogICAgICAgICAsIHByZXZpb3VzUG9zaXRpb24odmlld3BvcnRJbnRlcmFjdGlvbkVuZ2lu
ZS0+bV9jb250ZW50LT5wb3MoKSkKICAgICAgICAgLCBwcmV2aW91c1NpemUodmlld3BvcnRJbnRl
cmFjdGlvbkVuZ2luZS0+bV9jb250ZW50LT53aWR0aCgpLCB2aWV3cG9ydEludGVyYWN0aW9uRW5n
aW5lLT5tX2NvbnRlbnQtPmhlaWdodCgpKQogICAgICAgICAsIHByZXZpb3VzU2NhbGUodmlld3Bv
cnRJbnRlcmFjdGlvbkVuZ2luZS0+bV9jb250ZW50LT5zY2FsZSgpKQorCiAgICAgewotICAgICAg
ICB2aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLT5tX2lzVXBkYXRpbmdDb250ZW50ID0gdHJ1ZTsK
KyAgICAgICAgKysodmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+bV9wZW5kaW5nVXBkYXRlcyk7
CiAgICAgfQogCiAgICAgflZpZXdwb3J0VXBkYXRlR3VhcmQoKQogICAgIHsKLSAgICAgICAgaWYg
KCF3YXNVcGRhdGluZ0NvbnRlbnQpIHsKKyAgICAgICAgLS0odmlld3BvcnRJbnRlcmFjdGlvbkVu
Z2luZS0+bV9wZW5kaW5nVXBkYXRlcyk7CisgICAgICAgIGlmICghdmlld3BvcnRJbnRlcmFjdGlv
bkVuZ2luZS0+bV9wZW5kaW5nVXBkYXRlcykgeworICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHRp
bGluZyBsb29rLWFoZWFkIHZlY3RvciBzbyB0aGF0IHRpbGVzIGFsbCBhcm91bmQgdGhlIHZpZXdw
b3J0IHdpbGwgYmUgcmVxdWVzdGVkLgorICAgICAgICAgICAgZW1pdCB2aWV3cG9ydEludGVyYWN0
aW9uRW5naW5lLT52aWV3cG9ydFRyYWplY3RvcnlWZWN0b3JDaGFuZ2VkKFFQb2ludEYoKSk7CiAg
ICAgICAgICAgICBpZiAocHJldmlvdXNQb3NpdGlvbiAhPSB2aWV3cG9ydEludGVyYWN0aW9uRW5n
aW5lLT5tX2NvbnRlbnQtPnBvcygpCiAgICAgICAgICAgICAgICAgICAgIHx8IHByZXZpb3VzU2l6
ZS53aWR0aCgpICE9IHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1fY29udGVudC0+d2lkdGgo
KQogICAgICAgICAgICAgICAgICAgICB8fCBwcmV2aW91c1NpemUuaGVpZ2h0KCkgIT0gdmlld3Bv
cnRJbnRlcmFjdGlvbkVuZ2luZS0+bV9jb250ZW50LT5oZWlnaHQoKQogICAgICAgICAgICAgICAg
ICAgICB8fCBwcmV2aW91c1NjYWxlICE9IHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1fY29u
dGVudC0+c2NhbGUoKSkKKyAgICAgICAgICAgICAgICAvLyBXZSBtdXN0IG5vdGlmeSB0aGUgY2hh
bmdlIHNvIHRoZSBjbGllbnQgY2FuIHJlbHkgb24gdXMgZm9yIGFsbCBjaGFuZ2VzIG9mIGdlb21l
dHJ5LgogICAgICAgICAgICAgICAgIGVtaXQgdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+dmll
d3BvcnRVcGRhdGVSZXF1ZXN0ZWQoKTsKICAgICAgICAgfQotICAgICAgICB2aWV3cG9ydEludGVy
YWN0aW9uRW5naW5lLT5tX2lzVXBkYXRpbmdDb250ZW50ID0gd2FzVXBkYXRpbmdDb250ZW50Owog
ICAgIH0KIAogcHJpdmF0ZToKICAgICBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUqIGNvbnN0
IHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU7Ci0gICAgY29uc3QgYm9vbCB3YXNVcGRhdGluZ0Nv
bnRlbnQ7CiAgICAgY29uc3QgUVBvaW50RiBwcmV2aW91c1Bvc2l0aW9uOwogICAgIGNvbnN0IFFT
aXplRiBwcmV2aW91c1NpemU7CiAgICAgY29uc3QgcXJlYWwgcHJldmlvdXNTY2FsZTsKQEAgLTgz
LDcgKzEwNSw4IEBAIHByaXZhdGU6CiBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OlF0Vmll
d3BvcnRJbnRlcmFjdGlvbkVuZ2luZShjb25zdCBRU0dJdGVtKiB2aWV3cG9ydCwgUVNHSXRlbSog
Y29udGVudCkKICAgICA6IG1fdmlld3BvcnQodmlld3BvcnQpCiAgICAgLCBtX2NvbnRlbnQoY29u
dGVudCkKLSAgICAsIG1faXNVcGRhdGluZ0NvbnRlbnQoZmFsc2UpCisgICAgLCBtX3BlbmRpbmdV
cGRhdGVzKDApCisgICAgLCBtX3NjYWxlQW5pbWF0aW9uKG5ldyBTY2FsZUFuaW1hdGlvbih0aGlz
KSkKICAgICAsIG1fcGluY2hTdGFydFNjYWxlKDEuZikKIHsKICAgICByZXNldCgpOwpAQCAtOTIs
MTUgKzExNSwxNjEgQEAgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpRdFZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmUoY29uc3QgUVNHSXRlbSogdmlld3BvcnQKICAgICBjb25uZWN0KG1fY29u
dGVudCwgU0lHTkFMKHdpZHRoQ2hhbmdlZCgpKSwgdGhpcywgU0xPVChjb250ZW50Vmlld3BvcnRD
aGFuZ2VkKCkpLCBRdDo6RGlyZWN0Q29ubmVjdGlvbik7CiAgICAgY29ubmVjdChtX2NvbnRlbnQs
IFNJR05BTChoZWlnaHRDaGFuZ2VkKCkpLCB0aGlzLCBTTE9UKGNvbnRlbnRWaWV3cG9ydENoYW5n
ZWQoKSksIFF0OjpEaXJlY3RDb25uZWN0aW9uKTsKICAgICBjb25uZWN0KG1fY29udGVudCwgU0lH
TkFMKHNjYWxlQ2hhbmdlZCgpKSwgdGhpcywgU0xPVChjb250ZW50Vmlld3BvcnRDaGFuZ2VkKCkp
LCBRdDo6RGlyZWN0Q29ubmVjdGlvbik7CisgICAgY29ubmVjdChtX3NjYWxlQW5pbWF0aW9uLCBT
SUdOQUwodmFsdWVDaGFuZ2VkKFFWYXJpYW50KSksIFNMT1QodXBkYXRlVmlzaWJsZVJlY3QoUVZh
cmlhbnQpKSwgUXQ6OkRpcmVjdENvbm5lY3Rpb24pOworICAgIGNvbm5lY3QobV9zY2FsZUFuaW1h
dGlvbiwgU0lHTkFMKHN0YXRlQ2hhbmdlZChRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlLCBRQWJz
dHJhY3RBbmltYXRpb246OlN0YXRlKSkKKyAgICAgICAgICAgICwgU0xPVChzY2FsZUFuaW1hdGlv
blN0YXRlQ2hhbmdlZChRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlLCBRQWJzdHJhY3RBbmltYXRp
b246OlN0YXRlKSksIFF0OjpEaXJlY3RDb25uZWN0aW9uKTsKIH0KIAogUXRWaWV3cG9ydEludGVy
YWN0aW9uRW5naW5lOjp+UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lKCkKIHsKIH0KIAordm9p
ZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnVwZGF0ZVZpc2libGVSZWN0KFFWYXJpYW50
IHJlY3QpCit7CisgICAgVmlld3BvcnRVcGRhdGVHdWFyZCBndWFyZCh0aGlzKTsKKworICAgIFFS
ZWN0RiB2aXNpYmxlUmVjdCA9IHJlY3QudG9SZWN0RigpOworICAgIHFyZWFsIGN1cnJlbnRTY2Fs
ZSA9IG1fdmlld3BvcnQtPndpZHRoKCkgLyB2aXNpYmxlUmVjdC53aWR0aCgpOworCisgICAgbV9j
b250ZW50LT5zZXRTY2FsZShjdXJyZW50U2NhbGUpOworCisgICAgLy8gV2UgbmVlZCB0byBhbmlt
YXRlIHRoZSBjb250ZW50IGJ1dCB0aGUgcG9zaXRpb24gcmVwcmVzZW50cyB0aGUgdmlld3BvcnQg
aGVuY2Ugd2UgbmVlZCB0byBpbnZlcnQgdGhlIHBvc2l0aW9uIGhlcmUuCisgICAgLy8gVG8gYW5p
bWF0ZSB0aGUgcG9zaXRpb24gdG9nZXRoZXIgd2l0aCB0aGUgc2NhbGUgd2UgbXVsdGlwbHkgdGhl
IHBvc2l0aW9uIHdpdGggdGhlIGN1cnJlbnQgc2NhbGU7CisgICAgbV9jb250ZW50LT5zZXRQb3Mo
LXZpc2libGVSZWN0LnRvcExlZnQoKSAqIGN1cnJlbnRTY2FsZSk7Cit9CisKK3ZvaWQgUXRWaWV3
cG9ydEludGVyYWN0aW9uRW5naW5lOjpzY2FsZUFuaW1hdGlvblN0YXRlQ2hhbmdlZChRQWJzdHJh
Y3RBbmltYXRpb246OlN0YXRlIG5ld1N0YXRlLCBRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlIC8q
b2xkU3RhdGUqLykKK3sKKyAgICBzd2l0Y2ggKG5ld1N0YXRlKSB7CisgICAgY2FzZSBRQWJzdHJh
Y3RBbmltYXRpb246OlJ1bm5pbmc6CisgICAgICAgIG1fcGluY2hWaWV3cG9ydFVwZGF0ZURlZmVy
cmVyID0gYWRvcHRQdHIobmV3IFZpZXdwb3J0VXBkYXRlR3VhcmQodGhpcykpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIFFBYnN0cmFjdEFuaW1hdGlvbjo6U3RvcHBlZDoKKyAgICAgICAgbV9w
aW5jaFZpZXdwb3J0VXBkYXRlRGVmZXJyZXIuY2xlYXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAg
ZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitib29sIFF0Vmlld3BvcnRJbnRl
cmFjdGlvbkVuZ2luZTo6ZXZlbnQoUUV2ZW50KiBldmVudCkKK3sKKyAgICBzd2l0Y2ggKGV2ZW50
LT50eXBlKCkpIHsKKyAgICBjYXNlIFFFdmVudDo6U2Nyb2xsUHJlcGFyZTogeworICAgICAgICBR
U2Nyb2xsUHJlcGFyZUV2ZW50KiBwcmVwYXJlRXZlbnQgPSBzdGF0aWNfY2FzdDxRU2Nyb2xsUHJl
cGFyZUV2ZW50Kj4oZXZlbnQpOworICAgICAgICBjb25zdCBRUmVjdEYgdmlld3BvcnRSZWN0ID0g
bV92aWV3cG9ydC0+Ym91bmRpbmdSZWN0KCk7CisgICAgICAgIGNvbnN0IFFSZWN0RiBjb250ZW50
UmVjdCA9IGNvbnRlbnRSZWN0SW5WaWV3cG9ydENvb3JkaW5hdGUobV9jb250ZW50LCBtX3ZpZXdw
b3J0KTsKKyAgICAgICAgY29uc3QgUVJlY3RGIGNvbnRlbnRQb3NpdGlvblJhbmdlID0gY2FsY3Vs
YXRlQm91bmRhcmllc0ZvclNjYWxlKGNvbnRlbnRSZWN0LnNpemUoKSwgdmlld3BvcnRSZWN0LnNp
emUoKSwgMSk7CisgICAgICAgIHByZXBhcmVFdmVudC0+c2V0Q29udGVudFBvc1JhbmdlKGNvbnRl
bnRQb3NpdGlvblJhbmdlKTsKKyAgICAgICAgcHJlcGFyZUV2ZW50LT5zZXRWaWV3cG9ydFNpemUo
dmlld3BvcnRSZWN0LnNpemUoKSk7CisKKyAgICAgICAgLy8gQXMgd2Ugd2FudCB0byBwdXNoIHRo
ZSBjb250ZW50cyBhbmQgbm90IGFjdHVhbGx5IHNjcm9sbCBpdCwgd2UgbmVlZCB0byBpbnZlcnQg
dGhlIHBvc2l0aW9ucyBoZXJlLgorICAgICAgICBwcmVwYXJlRXZlbnQtPnNldENvbnRlbnRQb3Mo
LWNvbnRlbnRSZWN0LnRvcExlZnQoKSk7CisgICAgICAgIHByZXBhcmVFdmVudC0+YWNjZXB0KCk7
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIFFFdmVudDo6U2Nyb2xsOiB7
CisgICAgICAgIFFTY3JvbGxFdmVudCogc2Nyb2xsRXZlbnQgPSBzdGF0aWNfY2FzdDxRU2Nyb2xs
RXZlbnQqPihldmVudCk7CisgICAgICAgIFFQb2ludEYgbmV3UG9zID0gLXNjcm9sbEV2ZW50LT5j
b250ZW50UG9zKCkgLSBzY3JvbGxFdmVudC0+b3ZlcnNob290RGlzdGFuY2UoKTsKKyAgICAgICAg
aWYgKG1fY29udGVudC0+cG9zKCkgIT0gbmV3UG9zKSB7CisgICAgICAgICAgICBWaWV3cG9ydFVw
ZGF0ZUd1YXJkIGd1YXJkKHRoaXMpOworCisgICAgICAgICAgICBRUG9pbnRGIGN1cnJlbnRQb3NJ
bkNvbnRlbnRDb29yZGluYXRlcyA9IG1fY29udGVudC0+bWFwVG9JdGVtKG1fY29udGVudC0+cGFy
ZW50SXRlbSgpLCBtX2NvbnRlbnQtPnBvcygpKTsKKyAgICAgICAgICAgIFFQb2ludEYgbmV3UG9z
SW5Db250ZW50Q29vcmRpbmF0ZXMgPSBtX2NvbnRlbnQtPm1hcFRvSXRlbShtX2NvbnRlbnQtPnBh
cmVudEl0ZW0oKSwgbmV3UG9zKTsKKworICAgICAgICAgICAgLy8gVGhpcyBtdXN0IGJlIGVtaXR0
ZWQgYmVmb3JlIHZpZXdwb3J0VXBkYXRlUmVxdWVzdGVkIHNvIHRoYXQgdGhlIHdlYiBwcm9jZXNz
IGtub3dzIHdoZXJlIHRvIGxvb2sgZm9yIHRpbGVzLgorICAgICAgICAgICAgZW1pdCB2aWV3cG9y
dFRyYWplY3RvcnlWZWN0b3JDaGFuZ2VkKGN1cnJlbnRQb3NJbkNvbnRlbnRDb29yZGluYXRlcy0g
bmV3UG9zSW5Db250ZW50Q29vcmRpbmF0ZXMpOworICAgICAgICAgICAgbV9jb250ZW50LT5zZXRQ
b3MobmV3UG9zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAg
ZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBRT2JqZWN0OjpldmVu
dChldmVudCk7Cit9CisKK3ZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpzdG9wQW5p
bWF0aW9ucygpCit7CisgICAgbV9zY2FsZUFuaW1hdGlvbi0+c3RvcCgpOworICAgIHNjcm9sbGVy
KCktPnN0b3AoKTsKK30KKworY29uc3QgUVJlY3RGIFF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2lu
ZTo6Y2FsY3VsYXRlQm91bmRhcmllc0ZvclNjYWxlKGNvbnN0IFFTaXplRiBjb250ZW50U2l6ZSwg
Y29uc3QgUVNpemVGIHZpZXdwb3J0U2l6ZSwgcXJlYWwgc2NhbGUpCit7CisgICAgY29uc3QgUVNp
emVGIHNjYWxlZFZpZXdwb3J0U2l6ZSA9IHZpZXdwb3J0U2l6ZSAvIHNjYWxlOworCisgICAgY29u
c3QgcXJlYWwgaG9yaXpvbnRhbE9mZnNldCA9IGNvbnRlbnRTaXplLndpZHRoKCkgLSBzY2FsZWRW
aWV3cG9ydFNpemUud2lkdGgoKTsKKyAgICBjb25zdCBxcmVhbCB2ZXJ0aWNhbE9mZnNldCA9IGNv
bnRlbnRTaXplLmhlaWdodCgpIC0gc2NhbGVkVmlld3BvcnRTaXplLmhlaWdodCgpOworCisgICAg
Y29uc3QgUVBvaW50RiBjb250ZW50UG9zaXRpb25SYW5nZVRvcExlZnQocU1pbjxxcmVhbD4oMCwg
KGhvcml6b250YWxPZmZzZXQpIC8gMiksIDApOworICAgIGNvbnN0IHFyZWFsIGNvbnRlbnRQb3Np
dGlvblJhbmdlV2lkdGggPSBxTWF4PHFyZWFsPigwLCBob3Jpem9udGFsT2Zmc2V0KTsKKyAgICBj
b25zdCBxcmVhbCBjb250ZW50UG9zaXRpb25SYW5nZUhlaWdodCA9IHFNYXg8cXJlYWw+KDAsIHZl
cnRpY2FsT2Zmc2V0KTsKKworICAgIHJldHVybiBRUmVjdEYoY29udGVudFBvc2l0aW9uUmFuZ2VU
b3BMZWZ0LCBRU2l6ZUYoY29udGVudFBvc2l0aW9uUmFuZ2VXaWR0aCwgY29udGVudFBvc2l0aW9u
UmFuZ2VIZWlnaHQpKTsKK30KKwordm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OmFu
aW1hdGVDb250ZW50SW50b0JvdW5kYXJpZXNJZk5lZWRlZCgpCit7CisgICAgbV9zY2FsZUFuaW1h
dGlvbi0+c3RvcCgpOworCisgICAgcXJlYWwgY3VycmVudFNjYWxlID0gbV9jb250ZW50LT5zY2Fs
ZSgpOworICAgIGJvb2wgdXNlckhhc1NjYWxlZENvbnRlbnQgPSBtX3VzZXJJbnRlcmFjdGlvbkZs
YWdzICYgVXNlckhhc1NjYWxlZENvbnRlbnQ7CisKKyAgICBpZiAoIXVzZXJIYXNTY2FsZWRDb250
ZW50KQorICAgICAgICBjdXJyZW50U2NhbGUgPSBtX2NvbnN0cmFpbnRzLmluaXRpYWxTY2FsZTsK
KworICAgIHFyZWFsIGJvdW5kZWRTY2FsZSA9IGlubmVyQm91bmRlZFNjYWxlKG1fY29uc3RyYWlu
dHMsIGN1cnJlbnRTY2FsZSk7CisKKyAgICBRU2l6ZUYgY29udGVudFNpemUgPSBtX2NvbnRlbnQt
PmJvdW5kaW5nUmVjdCgpLnNpemUoKTsKKyAgICBRUmVjdEYgdmlld3BvcnRSZWN0ID0gbV92aWV3
cG9ydC0+Ym91bmRpbmdSZWN0KCk7CisgICAgUVJlY3RGIHBvc2l0aW9uQm91bmRhcmllcyA9IGNh
bGN1bGF0ZUJvdW5kYXJpZXNGb3JTY2FsZShjb250ZW50U2l6ZSwgdmlld3BvcnRSZWN0LnNpemUo
KSwgYm91bmRlZFNjYWxlKTsKKyAgICBRUG9pbnRGIG1pbk9mZnNldCA9IHBvc2l0aW9uQm91bmRh
cmllcy50b3BMZWZ0KCk7CisgICAgUVBvaW50RiBtYXhPZmZzZXQgPSBwb3NpdGlvbkJvdW5kYXJp
ZXMuYm90dG9tUmlnaHQoKTsKKyAgICBRUG9pbnRGIHZpZXdwb3J0SG90c3BvdCA9IHZpZXdwb3J0
UmVjdC5jZW50ZXIoKTsKKyAgICBRUG9pbnRGIHZpZXdwb3J0SG90c3BvdE9uQ29udGVudCA9IG1f
Y29udGVudC0+bWFwRnJvbUl0ZW0obV92aWV3cG9ydCwgdmlld3BvcnRIb3RzcG90KTsKKyAgICBR
UG9pbnRGIHBvc2l0aW9uID0gdmlld3BvcnRIb3RzcG90T25Db250ZW50IC0gdmlld3BvcnRIb3Rz
cG90IC8gYm91bmRlZFNjYWxlOworICAgIFFQb2ludEYgYm91bmRlZFBvc2l0aW9uOworICAgIGJv
dW5kZWRQb3NpdGlvbi5zZXRYKHFCb3VuZChtaW5PZmZzZXQueCgpLCBwb3NpdGlvbi54KCksIG1h
eE9mZnNldC54KCkpKTsKKyAgICBib3VuZGVkUG9zaXRpb24uc2V0WShxQm91bmQobWluT2Zmc2V0
LnkoKSwgcG9zaXRpb24ueSgpLCBtYXhPZmZzZXQueSgpKSk7CisKKyAgICBRUmVjdEYgc2NhbGVk
UmVjdChib3VuZGVkUG9zaXRpb24sIHZpZXdwb3J0UmVjdC5zaXplKCkgLyBib3VuZGVkU2NhbGUp
OworICAgIFFSZWN0RiBjdXJyZW50UmVjdCA9IG1fdmlld3BvcnQtPm1hcFJlY3RUb0l0ZW0obV9j
b250ZW50LCB2aWV3cG9ydFJlY3QpOworCisgICAgaWYgKHNjYWxlZFJlY3QgPT0gY3VycmVudFJl
Y3QpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICh1c2VySGFzU2NhbGVkQ29udGVudCkgewor
ICAgICAgICBtX3NjYWxlQW5pbWF0aW9uLT5zZXREdXJhdGlvbihrU2NhbGVBbmltYXRpb25EdXJh
dGlvbk1TKTsKKyAgICAgICAgbV9zY2FsZUFuaW1hdGlvbi0+c2V0RWFzaW5nQ3VydmUoUUVhc2lu
Z0N1cnZlOjpPdXRDdWJpYyk7CisgICAgICAgIG1fc2NhbGVBbmltYXRpb24tPnNldFN0YXJ0VmFs
dWUoY3VycmVudFJlY3QpOworICAgICAgICBtX3NjYWxlQW5pbWF0aW9uLT5zZXRFbmRWYWx1ZShz
Y2FsZWRSZWN0KTsKKyAgICAgICAgbV9zY2FsZUFuaW1hdGlvbi0+c3RhcnQoKTsKKyAgICB9IGVs
c2UKKyAgICAgICAgdXBkYXRlVmlzaWJsZVJlY3Qoc2NhbGVkUmVjdCk7Cit9CisKIHZvaWQgUXRW
aWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpyZXNldCgpCiB7CiAgICAgVmlld3BvcnRVcGRhdGVH
dWFyZCBndWFyZCh0aGlzKTsKKworICAgIHN0b3BBbmltYXRpb25zKCk7CisKKyAgICBRU2Nyb2xs
ZXJQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBzY3JvbGxlcigpLT5zY3JvbGxlclByb3BlcnRpZXMo
KTsKKworICAgIC8vIFRoZSBRdFBhbkdlc3R1cmVSZWNvZ25pemVyIGlzIHJlc3BvbnNpYmxlIGZv
ciByZWNvZ25pemluZyB0aGUgZ2VzdHVyZQorICAgIC8vIHRodXMgd2UgbmVlZCB0byBkaXNhYmxl
IHRoZSBkcmFnIHN0YXJ0IGRpc3RhbmNlLgorICAgIHByb3BlcnRpZXMuc2V0U2Nyb2xsTWV0cmlj
KFFTY3JvbGxlclByb3BlcnRpZXM6OkRyYWdTdGFydERpc3RhbmNlLCAwLjApOworCisgICAgLy8g
U2V0IHNvbWUgZGVmYXVsdCBRU2Nyb2xsZXIgY29uc3RyYWlucyB0byBtaW1pYyB0aGUgcGh5c2lj
cyBlbmdpbmUgb2YgdGhlIE45IGJyb3dzZXIuCisgICAgcHJvcGVydGllcy5zZXRTY3JvbGxNZXRy
aWMoUVNjcm9sbGVyUHJvcGVydGllczo6QXhpc0xvY2tUaHJlc2hvbGQsIDAuNjYpOworICAgIHBy
b3BlcnRpZXMuc2V0U2Nyb2xsTWV0cmljKFFTY3JvbGxlclByb3BlcnRpZXM6OkRlY2VsZXJhdGlv
bkZhY3RvciwgMC4yMCk7CisgICAgcHJvcGVydGllcy5zZXRTY3JvbGxNZXRyaWMoUVNjcm9sbGVy
UHJvcGVydGllczo6TWF4aW11bVZlbG9jaXR5LCAwLjIpOworICAgIHByb3BlcnRpZXMuc2V0U2Ny
b2xsTWV0cmljKFFTY3JvbGxlclByb3BlcnRpZXM6Ok92ZXJzaG9vdERyYWdSZXNpc3RhbmNlRmFj
dG9yLCAwLjMzKTsKKyAgICBwcm9wZXJ0aWVzLnNldFNjcm9sbE1ldHJpYyhRU2Nyb2xsZXJQcm9w
ZXJ0aWVzOjpPdmVyc2hvb3RTY3JvbGxEaXN0YW5jZUZhY3RvciwgMC4zMyk7CisKKyAgICBzY3Jv
bGxlcigpLT5zZXRTY3JvbGxlclByb3BlcnRpZXMocHJvcGVydGllcyk7CisKICAgICBtX3VzZXJJ
bnRlcmFjdGlvbkZsYWdzID0gVXNlckhhc05vdEludGVyYWN0ZWRXaXRoQ29udGVudDsKICAgICBz
ZXRDb25zdHJhaW50cyhDb25zdHJhaW50cygpKTsKIH0KQEAgLTExMCw2MCArMjc5LDQ1IEBAIHZv
aWQgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpzZXRDb25zdHJhaW50cyhjb25zdCBDb25z
dHJhaW50cyYgY29uc3RyYWludHMpCiAgICAgaWYgKG1fY29uc3RyYWludHMgPT0gY29uc3RyYWlu
dHMpCiAgICAgICAgIHJldHVybjsKIAotICAgIC8vIEZJWE1FOiBpZiBhIHBpbmNoIGdlc3R1cmUg
aXMgb25nb2luZywgd2UgaGF2ZSB0bzoKLSAgICAvLyAtY2FuY2VsIHRoZSBnZXN0dXJlIGlmIGlz
VXNlclNjYWxhYmxlIGJlY29tZXMgdHJ1ZQotICAgIC8vIC11cGRhdGUgdGhlIHBhZ2Ugb24gdGhl
IGZseSB3aXRob3V0IG1vZGlmeWluZyBpdHMgcG9zaXRpb24KLQotICAgIC8vIEZJWE1FOiBpZiBh
IHBhbiBnZXN0dXJlIGlzIG9uZ29pbmcsIHdlIGhhdmUgdG8KLSAgICAvLyAtdXBkYXRlIHRoZSBw
YWdlIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHBvc2l0aW9uCi0gICAgLy8gLWFuaW1hdGUgdGhlIHBh
Z2UgYmFjayBpbiB2aWV3cG9ydCBpZiBuZWNlc3NhcnkgKGlmIHRoZSBwYWdlIGlzIGZ1bGx5IGlu
Ci0gICAgLy8gIHZpZXdwb3J0LCBpdCBkb2VzIG5vdCBwYW4gaG9yaXpvbnRhbGx5IGFueW1vcmUp
LgorICAgIHN0b3BBbmltYXRpb25zKCk7CiAKICAgICBWaWV3cG9ydFVwZGF0ZUd1YXJkIGd1YXJk
KHRoaXMpOwogICAgIG1fY29uc3RyYWludHMgPSBjb25zdHJhaW50czsKLSAgICB1cGRhdGVDb250
ZW50SWZOZWVkZWQoKTsKKyAgICBhbmltYXRlQ29udGVudEludG9Cb3VuZGFyaWVzSWZOZWVkZWQo
KTsKIH0KIAotdm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBhbkdlc3R1cmVTdGFy
dGVkKCkKK3ZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpwYW5HZXN0dXJlU3RhcnRl
ZChjb25zdCBRUG9pbnRGJiB0b3VjaFBvaW50LCBxaW50NjQgdGltZXN0YW1wTVMpCiB7CiAgICAg
Ly8gRklYTUU6IHN1c3BlbmQgdGhlIFdlYiBlbmdpbmUgKHN0b3AgYW5pbWF0ZWQgR0lGLCBldGMp
LgotICAgIC8vIEZJWE1FOiBpbml0aWFsaXplIHBoeXNpY3MgZm9yIHBhbm5pbmcgKHN0b3AgYW5p
bWF0aW9uLCBldGMpLgogICAgIG1fdXNlckludGVyYWN0aW9uRmxhZ3MgfD0gVXNlckhhc01vdmVk
Q29udGVudDsKKyAgICBzY3JvbGxlcigpLT5oYW5kbGVJbnB1dChRU2Nyb2xsZXI6OklucHV0UHJl
c3MsIG1fdmlld3BvcnQtPm1hcEZyb21JdGVtKG1fY29udGVudCwgdG91Y2hQb2ludCksIHRpbWVz
dGFtcE1TKTsKIH0KIAotdm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBhbkdlc3R1
cmVSZXF1ZXN0VXBkYXRlKHFyZWFsIGRlbHRhWCwgcXJlYWwgZGVsdGFZKQordm9pZCBRdFZpZXdw
b3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBhbkdlc3R1cmVSZXF1ZXN0VXBkYXRlKGNvbnN0IFFQb2lu
dEYmIHRvdWNoUG9pbnQsIHFpbnQ2NCB0aW1lc3RhbXBNUykKIHsKICAgICBWaWV3cG9ydFVwZGF0
ZUd1YXJkIGd1YXJkKHRoaXMpOwotCi0gICAgUVBvaW50RiBpdGVtUG9zaXRpb25Jbkl0ZW1Db29y
ZHMgPSBtX2NvbnRlbnQtPm1hcEZyb21JdGVtKG1fY29udGVudC0+cGFyZW50SXRlbSgpLCBtX2Nv
bnRlbnQtPnBvcygpKTsKLSAgICBRUG9pbnRGIGRlc3RJblZpZXdwb3J0Q29vcmRzID0gbV92aWV3
cG9ydC0+bWFwRnJvbUl0ZW0obV9jb250ZW50LCBpdGVtUG9zaXRpb25Jbkl0ZW1Db29yZHMgKyBR
UG9pbnRGKGRlbHRhWCwgZGVsdGFZKSk7Ci0KLSAgICBtX2NvbnRlbnQtPnNldFBvcyhkZXN0SW5W
aWV3cG9ydENvb3Jkcyk7Ci0gICAgLy8gVGhpcyBtdXN0IGJlIGVtaXR0ZWQgYmVmb3JlIHZpZXdw
b3J0VXBkYXRlUmVxdWVzdGVkIHNvIHRoYXQgdGhlIHdlYiBwcm9jZXNzIGtub3dzIHdoZXJlIHRv
IGxvb2sgZm9yIHRpbGVzLgotICAgIGVtaXQgdmlld3BvcnRUcmFqZWN0b3J5VmVjdG9yQ2hhbmdl
ZChRUG9pbnRGKC1kZWx0YVgsIC1kZWx0YVkpKTsKKyAgICBzY3JvbGxlcigpLT5oYW5kbGVJbnB1
dChRU2Nyb2xsZXI6OklucHV0TW92ZSwgbV92aWV3cG9ydC0+bWFwRnJvbUl0ZW0obV9jb250ZW50
LCB0b3VjaFBvaW50KSwgdGltZXN0YW1wTVMpOwogfQogCiB2b2lkIFF0Vmlld3BvcnRJbnRlcmFj
dGlvbkVuZ2luZTo6cGFuR2VzdHVyZUNhbmNlbGxlZCgpCiB7CiAgICAgVmlld3BvcnRVcGRhdGVH
dWFyZCBndWFyZCh0aGlzKTsKLSAgICAvLyBGSVhNRTogcmVzZXQgcGh5c2ljcy4KLSAgICBwYW5H
ZXN0dXJlRW5kZWQoKTsKKyAgICBzdG9wQW5pbWF0aW9ucygpOwogfQogCi12b2lkIFF0Vmlld3Bv
cnRJbnRlcmFjdGlvbkVuZ2luZTo6cGFuR2VzdHVyZUVuZGVkKCkKK3ZvaWQgUXRWaWV3cG9ydElu
dGVyYWN0aW9uRW5naW5lOjpwYW5HZXN0dXJlRW5kZWQoY29uc3QgUVBvaW50RiYgdG91Y2hQb2lu
dCwgcWludDY0IHRpbWVzdGFtcE1TKQogewogICAgIFZpZXdwb3J0VXBkYXRlR3VhcmQgZ3VhcmQo
dGhpcyk7Ci0gICAgYW5pbWF0ZUNvbnRlbnRJbnRvQm91bmRhcmllc0lmTmVlZGVkKCk7Ci0gICAg
Ly8gRklYTUU6IGVtaXQgdmlld3BvcnRUcmFqZWN0b3J5VmVjdG9yQ2hhbmdlZChRUG9pbnRGKCkp
IHdoZW4gdGhlIHBhbiB0aHJvdyBhbmltYXRpb24gZW5kcyBhbmQgdGhlIHBhZ2Ugc3RvcHMgbW92
aW5nLgorICAgIHNjcm9sbGVyKCktPmhhbmRsZUlucHV0KFFTY3JvbGxlcjo6SW5wdXRSZWxlYXNl
LCBtX3ZpZXdwb3J0LT5tYXBGcm9tSXRlbShtX2NvbnRlbnQsIHRvdWNoUG9pbnQpLCB0aW1lc3Rh
bXBNUyk7CiB9CiAKLXZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpwaW5jaEdlc3R1
cmVTdGFydGVkKCkKK3ZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpwaW5jaEdlc3R1
cmVTdGFydGVkKGNvbnN0IFFQb2ludEYmIHBpbmNoQ2VudGVySW5Db250ZW50Q29vcmRpbmF0ZSkK
IHsKICAgICBpZiAoIW1fY29uc3RyYWludHMuaXNVc2VyU2NhbGFibGUpCiAgICAgICAgIHJldHVy
bjsKIAogICAgIG1fcGluY2hWaWV3cG9ydFVwZGF0ZURlZmVycmVyID0gYWRvcHRQdHIobmV3IFZp
ZXdwb3J0VXBkYXRlR3VhcmQodGhpcykpOwotCisgICAgbV9sYXN0UGluY2hDZW50ZXJJblZpZXdw
b3J0Q29vcmRpbmF0ZXMgPSBtX2NvbnRlbnQtPm1hcFRvSXRlbShtX2NvbnRlbnQtPnBhcmVudEl0
ZW0oKSwgcGluY2hDZW50ZXJJbkNvbnRlbnRDb29yZGluYXRlKTsKICAgICBtX3VzZXJJbnRlcmFj
dGlvbkZsYWdzIHw9IFVzZXJIYXNTY2FsZWRDb250ZW50OwogICAgIG1fdXNlckludGVyYWN0aW9u
RmxhZ3MgfD0gVXNlckhhc01vdmVkQ29udGVudDsKICAgICBtX3BpbmNoU3RhcnRTY2FsZSA9IG1f
Y29udGVudC0+c2NhbGUoKTsKQEAgLTE4MCwxMiArMzM0LDE5IEBAIHZvaWQgUXRWaWV3cG9ydElu
dGVyYWN0aW9uRW5naW5lOjpwaW5jaEdlc3R1cmVSZXF1ZXN0VXBkYXRlKGNvbnN0IFFQb2ludEYm
IHBpbmNoCiAgICAgVmlld3BvcnRVcGRhdGVHdWFyZCBndWFyZCh0aGlzKTsKIAogICAgIC8vICBD
aGFuZ2VzIG9mIHRoZSBjZW50ZXIgcG9zaXRpb24gc2hvdWxkIG1vdmUgdGhlIHBhZ2UgZXZlbiBp
ZiB0aGUgem9vbSBmYWN0b3IKLSAgICAvLyAgZG9lcyBub3QgY2hhbmdlLiBCb3RoIHRoZSB6b29t
IGFuZCB0aGUgcGFubmluZyBzaG91bGQgYmUgaGFuZGxlZCB0aHJvdWdoIHRoZSBwaHlzaWNzIGVu
Z2luZS4KKyAgICAvLyAgZG9lcyBub3QgY2hhbmdlLgogICAgIGNvbnN0IHFyZWFsIHNjYWxlID0g
bV9waW5jaFN0YXJ0U2NhbGUgKiB0b3RhbFNjYWxlRmFjdG9yOwotICAgIFFQb2ludEYgb2xkUGlu
Y2hDZW50ZXJPblBhcmVudCA9IG1fY29udGVudC0+bWFwVG9JdGVtKG1fY29udGVudC0+cGFyZW50
SXRlbSgpLCBwaW5jaENlbnRlckluQ29udGVudENvb3JkaW5hdGUpOwotICAgIG1fY29udGVudC0+
c2V0U2NhbGUoc2NhbGUpOwotICAgIFFQb2ludEYgbmV3UGluY2hDZW50ZXJPblBhcmVudCA9IG1f
Y29udGVudC0+bWFwVG9JdGVtKG1fY29udGVudC0+cGFyZW50SXRlbSgpLCBwaW5jaENlbnRlcklu
Q29udGVudENvb3JkaW5hdGUpOwotICAgIG1fY29udGVudC0+c2V0UG9zKG1fY29udGVudC0+cG9z
KCkgLSAobmV3UGluY2hDZW50ZXJPblBhcmVudCAtIG9sZFBpbmNoQ2VudGVyT25QYXJlbnQpKTsK
KworICAgIC8vIEFsbG93IHpvb21pbmcgb3V0IGJleW9uZCBtaW1pbXVtIHNjYWxlIG9uIHBhZ2Vz
IHRoYXQgZG8gbm90IGV4cGxpY2l0bHkgZGlzYWxsb3cgaXQuCisgICAgY29uc3QgcXJlYWwgYm91
bmRlZFNjYWxlID0gb3V0ZXJCb3VuZGVkU2NhbGUobV9jb25zdHJhaW50cywgc2NhbGUpOworCisg
ICAgUVBvaW50RiBwaW5jaENlbnRlckluVmlld3BvcnRDb29yZGluYXRlcyA9IG1fdmlld3BvcnQt
Pm1hcEZyb21JdGVtKG1fY29udGVudCwgcGluY2hDZW50ZXJJbkNvbnRlbnRDb29yZGluYXRlKTsK
KworICAgIHNjYWxlQ29udGVudChwaW5jaENlbnRlckluQ29udGVudENvb3JkaW5hdGUsIGJvdW5k
ZWRTY2FsZSk7CisKKyAgICBjb25zdCBRUG9pbnRGIHBvc2l0aW9uRGlmZiA9IHBpbmNoQ2VudGVy
SW5WaWV3cG9ydENvb3JkaW5hdGVzIC0gbV9sYXN0UGluY2hDZW50ZXJJblZpZXdwb3J0Q29vcmRp
bmF0ZXM7CisgICAgbV9sYXN0UGluY2hDZW50ZXJJblZpZXdwb3J0Q29vcmRpbmF0ZXMgPSBwaW5j
aENlbnRlckluVmlld3BvcnRDb29yZGluYXRlczsKKyAgICBtX2NvbnRlbnQtPnNldFBvcyhtX2Nv
bnRlbnQtPnBvcygpICsgcG9zaXRpb25EaWZmKTsKIH0KIAogdm9pZCBRdFZpZXdwb3J0SW50ZXJh
Y3Rpb25FbmdpbmU6OnBpbmNoR2VzdHVyZUVuZGVkKCkKQEAgLTE5MywxMDMgKzM1NCwxOSBAQCB2
b2lkIFF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6cGluY2hHZXN0dXJlRW5kZWQoKQogICAg
IGlmICghbV9jb25zdHJhaW50cy5pc1VzZXJTY2FsYWJsZSkKICAgICAgICAgcmV0dXJuOwogCi0g
ICAgewotICAgICAgICBWaWV3cG9ydFVwZGF0ZUd1YXJkIGd1YXJkKHRoaXMpOwotICAgICAgICAv
LyBGSVhNRTogcmVzdW1lIHRoZSBlbmdpbmUgYWZ0ZXIgdGhlIGFuaW1hdGlvbi4KLSAgICAgICAg
YW5pbWF0ZUNvbnRlbnRJbnRvQm91bmRhcmllc0lmTmVlZGVkKCk7Ci0gICAgfQogICAgIG1fcGlu
Y2hWaWV3cG9ydFVwZGF0ZURlZmVycmVyLmNsZWFyKCk7CisgICAgLy8gRklYTUU6IHJlc3VtZSB0
aGUgZW5naW5lIGFmdGVyIHRoZSBhbmltYXRpb24uCisgICAgYW5pbWF0ZUNvbnRlbnRJbnRvQm91
bmRhcmllc0lmTmVlZGVkKCk7CiB9CiAKIHZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5l
Ojpjb250ZW50Vmlld3BvcnRDaGFuZ2VkKCkKIHsKLSAgICBpZiAobV9pc1VwZGF0aW5nQ29udGVu
dCkKKyAgICBpZiAobV9wZW5kaW5nVXBkYXRlcykKICAgICAgICAgcmV0dXJuOwogCiAgICAgVmll
d3BvcnRVcGRhdGVHdWFyZCBndWFyZCh0aGlzKTsKLSAgICB1cGRhdGVDb250ZW50SWZOZWVkZWQo
KTsKLQotICAgIC8vIFdlIG11c3Qgbm90aWZ5IHRoZSBjaGFuZ2Ugc28gdGhlIGNsaWVudCBjYW4g
cmVseSBvbiB1cyBmb3IgYWxsIGNoYW5nZSBvZiBHZW9tZXRyeS4KLSAgICBlbWl0IHZpZXdwb3J0
VXBkYXRlUmVxdWVzdGVkKCk7Ci19Ci0KLXZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5l
Ojp1cGRhdGVDb250ZW50SWZOZWVkZWQoKQotewotICAgIHVwZGF0ZUNvbnRlbnRTY2FsZUlmTmVl
ZGVkKCk7Ci0gICAgdXBkYXRlQ29udGVudFBvc2l0aW9uSWZOZWVkZWQoKTsKLX0KIAotdm9pZCBR
dFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnVwZGF0ZUNvbnRlbnRTY2FsZUlmTmVlZGVkKCkK
LXsKLSAgICBjb25zdCBxcmVhbCBjdXJyZW50Q29udGVudFNjYWxlID0gbV9jb250ZW50LT5zY2Fs
ZSgpOwotICAgIHFyZWFsIGNvbnRlbnRTY2FsZSA9IG1fY29udGVudC0+c2NhbGUoKTsKLSAgICBp
ZiAoIShtX3VzZXJJbnRlcmFjdGlvbkZsYWdzICYgVXNlckhhc1NjYWxlZENvbnRlbnQpKQotICAg
ICAgICBjb250ZW50U2NhbGUgPSBtX2NvbnN0cmFpbnRzLmluaXRpYWxTY2FsZTsKLQotICAgIGNv
bnRlbnRTY2FsZSA9IHFCb3VuZChtX2NvbnN0cmFpbnRzLm1pbmltdW1TY2FsZSwgY29udGVudFNj
YWxlLCBtX2NvbnN0cmFpbnRzLm1heGltdW1TY2FsZSk7Ci0KLSAgICBpZiAoY29udGVudFNjYWxl
ICE9IGN1cnJlbnRDb250ZW50U2NhbGUpIHsKLSAgICAgICAgY29uc3QgUVBvaW50RiBjZW50ZXJP
ZkludGVyZXN0ID0gdmlzaWJsZVJlY3RJbkNvbnRlbnRDb29yZGluYXRlKG1fY29udGVudCwgbV92
aWV3cG9ydCkuY2VudGVyKCk7Ci0gICAgICAgIHNjYWxlQ29udGVudChjZW50ZXJPZkludGVyZXN0
LCBjb250ZW50U2NhbGUpOwotICAgIH0KLX0KLQotdm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25F
bmdpbmU6OnVwZGF0ZUNvbnRlbnRQb3NpdGlvbklmTmVlZGVkKCkKLXsKLSAgICBpZiAoIShtX3Vz
ZXJJbnRlcmFjdGlvbkZsYWdzICYgVXNlckhhc01vdmVkQ29udGVudCkpIHsKLSAgICAgICAgbV9j
b250ZW50LT5zZXRYKChtX3ZpZXdwb3J0LT53aWR0aCgpIC0gY29udGVudFJlY3RJblZpZXdwb3J0
Q29vcmRpbmF0ZShtX2NvbnRlbnQsIG1fdmlld3BvcnQpLndpZHRoKCkpIC8gMik7Ci0gICAgICAg
IG1fY29udGVudC0+c2V0WSgwKTsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogaWYgdGhlIGl0ZW0g
Y2FuIGJlIGZ1bGx5IGluIHRoZSB2aWV3cG9ydCBhbmQgaXMgb3ZlciBhIHNpZGUsIHB1c2ggaXQg
YmFjayBpbiB2aWV3Ci0gICAgLy8gRklYTUU6IGlmIHRoZSBpdGVtIGNhbm5vdCBiZSBmdWxseSBp
biB2aWV3cG9ydCwgYW5kIGlzIG5vdCBjb3ZlcmluZyB0aGUgdmlld3BvcnQsIHB1c2ggaXQgYmFj
ayBpbiB2aWV3Ci19Ci0KLXZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjphbmltYXRl
Q29udGVudEludG9Cb3VuZGFyaWVzSWZOZWVkZWQoKQotewotICAgIGFuaW1hdGVDb250ZW50U2Nh
bGVJbnRvQm91bmRhcmllc0lmTmVlZGVkKCk7Ci0gICAgYW5pbWF0ZUNvbnRlbnRQb3NpdGlvbklu
dG9Cb3VuZGFyaWVzSWZOZWVkZWQoKTsKLX0KLQotdm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25F
bmdpbmU6OmFuaW1hdGVDb250ZW50UG9zaXRpb25JbnRvQm91bmRhcmllc0lmTmVlZGVkKCkKLXsK
LSAgICBjb25zdCBRUmVjdEYgY29udGVudEdlb21ldHJ5ID0gbV92aWV3cG9ydC0+bWFwUmVjdEZy
b21JdGVtKG1fY29udGVudCwgbV9jb250ZW50LT5ib3VuZGluZ1JlY3QoKSk7Ci0gICAgUVBvaW50
RiBuZXdQb3MgPSBjb250ZW50R2VvbWV0cnkudG9wTGVmdCgpOwotCi0gICAgLy8gSG9yaXpvbnRh
bCBjb3JyZWN0aW9uLgotICAgIGlmIChjb250ZW50R2VvbWV0cnkud2lkdGgoKSA8IG1fdmlld3Bv
cnQtPndpZHRoKCkpCi0gICAgICAgIG5ld1Bvcy5zZXRYKChtX3ZpZXdwb3J0LT53aWR0aCgpIC0g
Y29udGVudEdlb21ldHJ5LndpZHRoKCkpIC8gMik7Ci0gICAgZWxzZSB7Ci0gICAgICAgIG5ld1Bv
cy5zZXRYKHFNaW48cXJlYWw+KDAuLCBuZXdQb3MueCgpKSk7Ci0gICAgICAgIGNvbnN0IHFyZWFs
IHJpZ2h0U2lkZUdhcCA9IG1fdmlld3BvcnQtPmJvdW5kaW5nUmVjdCgpLnJpZ2h0KCkgLSBjb250
ZW50R2VvbWV0cnkucmlnaHQoKTsKLSAgICAgICAgaWYgKHJpZ2h0U2lkZUdhcCA+IDAuKQotICAg
ICAgICAgICAgbmV3UG9zLnNldFgobmV3UG9zLngoKSArIHJpZ2h0U2lkZUdhcCk7Ci0gICAgfQot
Ci0gICAgLy8gVmVydGljYWwgY29ycmVjdGlvbi4KLSAgICBpZiAoY29udGVudEdlb21ldHJ5Lmhl
aWdodCgpIDwgbV92aWV3cG9ydC0+aGVpZ2h0KCkpCi0gICAgICAgIG5ld1Bvcy5zZXRZKDApOwot
ICAgIGVsc2UgewotICAgICAgICBuZXdQb3Muc2V0WShxTWluPHFyZWFsPigwLiwgbmV3UG9zLnko
KSkpOwotICAgICAgICBjb25zdCBxcmVhbCBib3R0b21TaWRlR2FwID0gbV92aWV3cG9ydC0+Ym91
bmRpbmdSZWN0KCkuYm90dG9tKCkgLSBjb250ZW50R2VvbWV0cnkuYm90dG9tKCk7Ci0gICAgICAg
IGlmIChib3R0b21TaWRlR2FwID4gMC4pCi0gICAgICAgICAgICBuZXdQb3Muc2V0WShuZXdQb3Mu
eSgpICsgYm90dG9tU2lkZUdhcCk7Ci0gICAgfQotCi0gICAgaWYgKG5ld1BvcyAhPSBtX2NvbnRl
bnQtPnBvcygpKQotICAgICAgICAvLyBGSVhNRTogRG8geW91IGtub3cgd2hhdCBBTklNQVRFIG1l
YW5zPwotICAgICAgICBtX2NvbnRlbnQtPnNldFBvcyhuZXdQb3MpOwotfQotCi12b2lkIFF0Vmll
d3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6YW5pbWF0ZUNvbnRlbnRTY2FsZUludG9Cb3VuZGFyaWVz
SWZOZWVkZWQoKQotewotICAgIGNvbnN0IHFyZWFsIGN1cnJlbnRTY2FsZSA9IG1fY29udGVudC0+
c2NhbGUoKTsKLSAgICBjb25zdCBxcmVhbCBib3VuZGVkU2NhbGUgPSBxQm91bmQobV9jb25zdHJh
aW50cy5taW5pbXVtU2NhbGUsIGN1cnJlbnRTY2FsZSwgbV9jb25zdHJhaW50cy5tYXhpbXVtU2Nh
bGUpOwotICAgIGlmIChjdXJyZW50U2NhbGUgIT0gYm91bmRlZFNjYWxlKSB7Ci0gICAgICAgIC8v
IEZJWE1FOiBEbyB5b3Uga25vdyB3aGF0IEFOSU1BVEUgbWVhbnM/Ci0gICAgICAgIGNvbnN0IFFQ
b2ludEYgY2VudGVyT2ZJbnRlcmVzdCA9IHZpc2libGVSZWN0SW5Db250ZW50Q29vcmRpbmF0ZSht
X2NvbnRlbnQsIG1fdmlld3BvcnQpLmNlbnRlcigpOwotICAgICAgICBzY2FsZUNvbnRlbnQoY2Vu
dGVyT2ZJbnRlcmVzdCwgYm91bmRlZFNjYWxlKTsKLSAgICB9CisgICAgYW5pbWF0ZUNvbnRlbnRJ
bnRvQm91bmRhcmllc0lmTmVlZGVkKCk7CiB9CiAKIHZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9u
RW5naW5lOjpzY2FsZUNvbnRlbnQoY29uc3QgUVBvaW50RiYgY2VudGVySW5Db250ZW50Q29vcmRp
bmF0ZSwgcXJlYWwgc2NhbGUpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3Mv
cXQvUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmggYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvcXQvUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmgKaW5kZXggOTIwMjkzMi4uOTk1OTAz
MSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1F0Vmlld3BvcnRJbnRl
cmFjdGlvbkVuZ2luZS5oCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFZpZXdw
b3J0SW50ZXJhY3Rpb25FbmdpbmUuaApAQCAtMSw0ICsxLDUgQEAKIC8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCiAg
KiBDb3B5cmlnaHQgKEMpIDIwMTEgQmVuamFtaW4gUG91bGFpbiA8YmVuamFtaW5Ad2Via2l0Lm9y
Zz4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCkBAIC0yMiw4ICsyMywxMSBAQAogI2RlZmluZSBRdFZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmVfaAogCiAjaW5jbHVkZSAiT3duUHRyLmgiCisjaW5jbHVkZSA8UVNjcm9s
bGVyPgogI2luY2x1ZGUgInF3ZWJraXRnbG9iYWwuaCIKICNpbmNsdWRlIDxRdENvcmUvUU9iamVj
dD4KKyNpbmNsdWRlIDxRdENvcmUvUVZhcmlhbnQ+CisjaW5jbHVkZSA8UXRDb3JlL1FWYXJpYW50
QW5pbWF0aW9uPgogCiBRVF9CRUdJTl9OQU1FU1BBQ0UKIGNsYXNzIFFQb2ludEY7CkBAIC00MSw2
ICs0NSw3IEBAIHB1YmxpYzoKICAgICBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUoY29uc3Qg
UVNHSXRlbSosIFFTR0l0ZW0qKTsKICAgICB+UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lKCk7
CiAKKwogICAgIHN0cnVjdCBDb25zdHJhaW50cyB7CiAgICAgICAgIENvbnN0cmFpbnRzKCkKICAg
ICAgICAgICAgIDogaW5pdGlhbFNjYWxlKDEuMCkKQEAgLTU1LDE3ICs2MCwyMCBAQCBwdWJsaWM6
CiAgICAgICAgIGJvb2wgaXNVc2VyU2NhbGFibGU7CiAgICAgfTsKIAorICAgIGJvb2wgZXZlbnQo
UUV2ZW50Kik7CisKICAgICB2b2lkIHJlc2V0KCk7CiAgICAgdm9pZCBzZXRDb25zdHJhaW50cyhj
b25zdCBDb25zdHJhaW50cyYpOwogCi0gICAgdm9pZCBwYW5HZXN0dXJlU3RhcnRlZCgpOwotICAg
IHZvaWQgcGFuR2VzdHVyZVJlcXVlc3RVcGRhdGUocXJlYWwgZGVsdGFYLCBxcmVhbCBkZWx0YVkp
OworICAgIHZvaWQgcGFuR2VzdHVyZVN0YXJ0ZWQoY29uc3QgUVBvaW50RiYgdG91Y2hQb2ludCwg
cWludDY0IHRpbWVzdGFtcE1TKTsKKyAgICB2b2lkIHBhbkdlc3R1cmVSZXF1ZXN0VXBkYXRlKGNv
bnN0IFFQb2ludEYmIHRvdWNoUG9pbnQsIHFpbnQ2NCB0aW1lc3RhbXBNUyk7CiAgICAgdm9pZCBw
YW5HZXN0dXJlQ2FuY2VsbGVkKCk7Ci0gICAgdm9pZCBwYW5HZXN0dXJlRW5kZWQoKTsKKyAgICB2
b2lkIHBhbkdlc3R1cmVFbmRlZChjb25zdCBRUG9pbnRGJiB0b3VjaFBvaW50LCBxaW50NjQgdGlt
ZXN0YW1wTVMpOwogCi0gICAgdm9pZCBwaW5jaEdlc3R1cmVTdGFydGVkKCk7CisgICAgdm9pZCBw
aW5jaEdlc3R1cmVTdGFydGVkKGNvbnN0IFFQb2ludEYmIHBpbmNoQ2VudGVySW5Db250ZW50Q29v
cmRpbmF0ZSk7CiAgICAgdm9pZCBwaW5jaEdlc3R1cmVSZXF1ZXN0VXBkYXRlKGNvbnN0IFFQb2lu
dEYmIHBpbmNoQ2VudGVySW5Db250ZW50Q29vcmRpbmF0ZSwgcXJlYWwgdG90YWxTY2FsZUZhY3Rv
cik7CiAgICAgdm9pZCBwaW5jaEdlc3R1cmVFbmRlZCgpOworICAgIHZvaWQgc3RvcEFuaW1hdGlv
bnMoKTsKIAogUV9TSUdOQUxTOgogICAgIHZvaWQgdmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQoKTsK
QEAgLTc0LDI1ICs4MiwyNCBAQCBRX1NJR05BTFM6CiBwcml2YXRlIFFfU0xPVFM6CiAgICAgLy8g
UmVzcG9uZCB0byBjaGFuZ2VzIG9mIGNvbnRlbnQgdGhhdCBhcmUgbm90IGRyaXZlbiBieSB1cywg
bGlrZSB0aGUgcGFnZSByZXNpemluZyBpdHNlbGYuCiAgICAgdm9pZCBjb250ZW50Vmlld3BvcnRD
aGFuZ2VkKCk7CisgICAgdm9pZCB1cGRhdGVWaXNpYmxlUmVjdChRVmFyaWFudCB2aXNpYmxlUmVj
dFZhcmlhbnQpOworICAgIHZvaWQgc2NhbGVBbmltYXRpb25TdGF0ZUNoYW5nZWQoUUFic3RyYWN0
QW5pbWF0aW9uOjpTdGF0ZSwgUUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSk7CiAKIHByaXZhdGU6
Ci0gICAgdm9pZCB1cGRhdGVDb250ZW50SWZOZWVkZWQoKTsKLSAgICB2b2lkIHVwZGF0ZUNvbnRl
bnRTY2FsZUlmTmVlZGVkKCk7Ci0gICAgdm9pZCB1cGRhdGVDb250ZW50UG9zaXRpb25JZk5lZWRl
ZCgpOwotCisgICAgY29uc3QgUVJlY3RGIGNhbGN1bGF0ZUJvdW5kYXJpZXNGb3JTY2FsZShjb25z
dCBRU2l6ZUYgY29udGVudFNpemUsIGNvbnN0IFFTaXplRiB2aWV3cG9ydFNpemUsIHFyZWFsIHNj
YWxlKTsKICAgICB2b2lkIGFuaW1hdGVDb250ZW50SW50b0JvdW5kYXJpZXNJZk5lZWRlZCgpOwot
ICAgIHZvaWQgYW5pbWF0ZUNvbnRlbnRQb3NpdGlvbkludG9Cb3VuZGFyaWVzSWZOZWVkZWQoKTsK
LSAgICB2b2lkIGFuaW1hdGVDb250ZW50U2NhbGVJbnRvQm91bmRhcmllc0lmTmVlZGVkKCk7CiAK
ICAgICB2b2lkIHNjYWxlQ29udGVudChjb25zdCBRUG9pbnRGJiBjZW50ZXJJbkNvbnRlbnRDb29y
ZGluYXRlLCBxcmVhbCBzY2FsZSk7CiAKKyAgICBRU2Nyb2xsZXIqIHNjcm9sbGVyKCkgeyByZXR1
cm4gUVNjcm9sbGVyOjpzY3JvbGxlcih0aGlzKTsgfQorCiAgICAgZnJpZW5kIGNsYXNzIFZpZXdw
b3J0VXBkYXRlR3VhcmQ7CiAKICAgICBjb25zdCBRU0dJdGVtKiBjb25zdCBtX3ZpZXdwb3J0Owog
ICAgIFFTR0l0ZW0qIGNvbnN0IG1fY29udGVudDsKIAogICAgIENvbnN0cmFpbnRzIG1fY29uc3Ry
YWludHM7Ci0gICAgYm9vbCBtX2lzVXBkYXRpbmdDb250ZW50OworICAgIGludCBtX3BlbmRpbmdV
cGRhdGVzOwogICAgIE93blB0cjxWaWV3cG9ydFVwZGF0ZUd1YXJkPiBtX3BpbmNoVmlld3BvcnRV
cGRhdGVEZWZlcnJlcjsKICAgICBlbnVtIFVzZXJJbnRlcmFjdGlvbkZsYWcgewogICAgICAgICBV
c2VySGFzTm90SW50ZXJhY3RlZFdpdGhDb250ZW50ID0gMCwKQEAgLTEwMiw2ICsxMDksMTcgQEAg
cHJpdmF0ZToKICAgICBRX0RFQ0xBUkVfRkxBR1MoVXNlckludGVyYWN0aW9uRmxhZ3MsIFVzZXJJ
bnRlcmFjdGlvbkZsYWcpOwogICAgIFVzZXJJbnRlcmFjdGlvbkZsYWdzIG1fdXNlckludGVyYWN0
aW9uRmxhZ3M7CiAKKyAgICBjbGFzcyBTY2FsZUFuaW1hdGlvbiA6IHB1YmxpYyBRVmFyaWFudEFu
aW1hdGlvbiB7CisgICAgcHVibGljOgorICAgICAgICBTY2FsZUFuaW1hdGlvbihRT2JqZWN0KiBw
YXJlbnQgPSAwKQorICAgICAgICAgICAgOiBRVmFyaWFudEFuaW1hdGlvbihwYXJlbnQpCisgICAg
ICAgIHsgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDdXJyZW50VmFsdWUoY29uc3Qg
UVZhcmlhbnQmKSB7IH0KKyAgICB9OworCisgICAgU2NhbGVBbmltYXRpb24qIG1fc2NhbGVBbmlt
YXRpb247CisgICAgUVBvaW50RiBtX2xhc3RQaW5jaENlbnRlckluVmlld3BvcnRDb29yZGluYXRl
czsKICAgICBxcmVhbCBtX3BpbmNoU3RhcnRTY2FsZTsKIH07CiAKLS0gCjEuNy43Cgo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112338</attachid>
            <date>2011-10-25 08:18:34 -0700</date>
            <delta_ts>2011-10-26 02:49:23 -0700</delta_ts>
            <desc>proposed patch</desc>
            <filename>0001-Qt-WK2-Add-the-animations-on-the-ViewportInteraction.patch</filename>
            <type>text/plain</type>
            <size>33451</size>
            <attacher name="Andras Becsi">abecsi</attacher>
            
              <data encoding="base64">RnJvbSA5MmZkYzNmM2U0ODdjMjIzM2I0OWVmYWM2MjUyZDNlY2EwMzZlODAwIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyYXMgQmVjc2kgPGFuZHJhcy5iZWNzaUBub2tpYS5jb20+
CkRhdGU6IFR1ZSwgMjUgT2N0IDIwMTEgMTc6MDk6MjAgKzAyMDAKU3ViamVjdDogW1BBVENIXSBb
UXRdW1dLMl0gQWRkIHRoZSBhbmltYXRpb25zIG9uIHRoZQogVmlld3BvcnRJbnRlcmFjdGlvbkVu
Z2luZQoKLS0tCiBTb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cgICAgICAgICAgICAgICAgICAgICAg
ICAgICB8ICAgNTEgKysrCiAuLi4vVUlQcm9jZXNzL3F0L1F0UGFuR2VzdHVyZVJlY29nbml6ZXIu
Y3BwICAgICAgICB8ICAgMTEgKy0KIC4uLi9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFBhbkdlc3R1
cmVSZWNvZ25pemVyLmggIHwgICAgMiArLQogLi4uL1VJUHJvY2Vzcy9xdC9RdFBpbmNoR2VzdHVy
ZVJlY29nbml6ZXIuY3BwICAgICAgfCAgICAyICstCiAuLi4vV2ViS2l0Mi9VSVByb2Nlc3MvcXQv
UXRUb3VjaFdlYlBhZ2VQcm94eS5jcHAgICB8ICAgIDQgKy0KIC4uLi9VSVByb2Nlc3MvcXQvUXRW
aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmNwcCAgIHwgIDM0MSArKysrKysrKysrKystLS0tLS0t
LQogLi4uL1VJUHJvY2Vzcy9xdC9RdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUuaCAgICAgfCAg
IDQzICsrLQogNyBmaWxlcyBjaGFuZ2VkLCAzMDEgaW5zZXJ0aW9ucygrKSwgMTUzIGRlbGV0aW9u
cygtKQoKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJL
aXQyL0NoYW5nZUxvZwppbmRleCAzMjYwYjEwLi5kNzM1YzU0IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0Mi9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCkBAIC0xLDMg
KzEsNTQgQEAKKzIwMTEtMTAtMjUgIEFuZHJhcyBCZWNzaSAgPGFuZHJhcy5iZWNzaUBub2tpYS5j
b20+CisKKyAgICAgICAgW1F0XVtXSzJdIEFkZCB0aGUgYW5pbWF0aW9ucyBvbiB0aGUgVmlld3Bv
cnRJbnRlcmFjdGlvbkVuZ2luZQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NjY2NjQKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBJbnRyb2R1Y2UgYSBRU2Nyb2xsZXIgYmFzZWQgcGFubmluZyBhbmQgYSBRVmFy
aWFudEFuaW1hdGlvbiBiYXNlZCBzY2FsZSBhbmltYXRpb24uCisgICAgICAgIFFTY3JvbGxlciBh
bHNvIGhhbmRsZXMgZmxpY2sgZ2VzdHVyZXMgYW5kIGFuaW1hdGVzIG92ZXJzaG9vdC4KKyAgICAg
ICAgSWYgYSBwaW5jaCBnZXN0dXJlIGVuZHMsIHRoZSBzY2FsZSBhbmltYXRpb24gd2lsbCBzY2Fs
ZSBhbmQgcmVwb3NpdGlvbiB0aGUgY29udGVudAorICAgICAgICBzdWNoIHRoYXQgaXQgaXMgd2l0
aGluIHZhbGlkIGJvdW5kYXJpZXMuIFRoZSBjb250ZW50IGlzIGJ5IGRlZmF1bHQgYW5pbWF0ZWQg
c3VjaAorICAgICAgICB0aGF0IHRoZSBjb250ZW50IHBvc2l0aW9uIGFzIHNlZW4gaW4gdGhlIGNl
bnRlciBvZiB0aGUgdmlzaWJsZSB2aWV3cG9ydCBzdGF5cworICAgICAgICBpbiB0aGUgY2VudGVy
LCB1bmxlc3MgdGhlIGNvbnRlbnQgd291bGQgYmUgb3V0IG9mIHZhbGlkIGJvdW5kcy4KKyAgICAg
ICAgVGhlIHBhdGNoIGFsc28gc2ltcGxpZmllcyB0aGUgVmlld3BvcnRVcGRhdGVHdWFyZCBieSB1
c2luZyByZWZlcmVuY2UgY291bnRpbmcKKyAgICAgICAgaW5zdGVhZCBvZiBhIGJvb2xlYW4gZm9y
IGRlZmVyaW5nIHVwZGF0ZSByZXF1ZXN0cy4KKworICAgICAgICAqIFVJUHJvY2Vzcy9xdC9RdFBh
bkdlc3R1cmVSZWNvZ25pemVyLmNwcDoKKyAgICAgICAgKFdlYktpdDo6UXRQYW5HZXN0dXJlUmVj
b2duaXplcjo6cmVjb2duaXplKToKKyAgICAgICAgKiBVSVByb2Nlc3MvcXQvUXRQYW5HZXN0dXJl
UmVjb2duaXplci5oOgorICAgICAgICAqIFVJUHJvY2Vzcy9xdC9RdFBpbmNoR2VzdHVyZVJlY29n
bml6ZXIuY3BwOgorICAgICAgICAoV2ViS2l0OjpRdFBpbmNoR2VzdHVyZVJlY29nbml6ZXI6OnJl
Y29nbml6ZSk6CisgICAgICAgICogVUlQcm9jZXNzL3F0L1F0VG91Y2hXZWJQYWdlUHJveHkuY3Bw
OgorICAgICAgICAoUXRUb3VjaFdlYlBhZ2VQcm94eTo6ZG9uZVdpdGhUb3VjaEV2ZW50KToKKyAg
ICAgICAgKiBVSVByb2Nlc3MvcXQvUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmNwcDoKKyAg
ICAgICAgKFdlYktpdDo6YmluZFRvU2NhbGVMaW1pdHMpOgorICAgICAgICAoV2ViS2l0OjpWaWV3
cG9ydFVwZGF0ZUd1YXJkOjpWaWV3cG9ydFVwZGF0ZUd1YXJkKToKKyAgICAgICAgKFdlYktpdDo6
Vmlld3BvcnRVcGRhdGVHdWFyZDo6flZpZXdwb3J0VXBkYXRlR3VhcmQpOgorICAgICAgICAoV2Vi
S2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OlF0Vmlld3BvcnRJbnRlcmFjdGlvbkVu
Z2luZSk6CisgICAgICAgIChXZWJLaXQ6OlF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6aW5u
ZXJCb3VuZGVkU2NhbGUpOgorICAgICAgICAoV2ViS2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25F
bmdpbmU6Om91dGVyQm91bmRlZFNjYWxlKToKKyAgICAgICAgKFdlYktpdDo6UXRWaWV3cG9ydElu
dGVyYWN0aW9uRW5naW5lOjp1cGRhdGVWaXNpYmxlUmVjdCk6CisgICAgICAgIChXZWJLaXQ6OlF0
Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6c2NhbGVBbmltYXRpb25TdGF0ZUNoYW5nZWQpOgor
ICAgICAgICAoV2ViS2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OmV2ZW50KToKKyAg
ICAgICAgKFdlYktpdDo6UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpzdG9wQW5pbWF0aW9u
cyk6CisgICAgICAgIChXZWJLaXQ6OlF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6Y2FsY3Vs
YXRlQm91bmRhcmllc0ZvclNjYWxlKToKKyAgICAgICAgKFdlYktpdDo6UXRWaWV3cG9ydEludGVy
YWN0aW9uRW5naW5lOjphbmltYXRlQ29udGVudEludG9Cb3VuZGFyaWVzSWZOZWVkZWQpOgorICAg
ICAgICAoV2ViS2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnJlc2V0KToKKyAgICAg
ICAgKFdlYktpdDo6UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpzZXRDb25zdHJhaW50cyk6
CisgICAgICAgIChXZWJLaXQ6OlF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6cGFuR2VzdHVy
ZVN0YXJ0ZWQpOgorICAgICAgICAoV2ViS2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6
OnBhbkdlc3R1cmVSZXF1ZXN0VXBkYXRlKToKKyAgICAgICAgKFdlYktpdDo6UXRWaWV3cG9ydElu
dGVyYWN0aW9uRW5naW5lOjpwYW5HZXN0dXJlQ2FuY2VsbGVkKToKKyAgICAgICAgKFdlYktpdDo6
UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpwYW5HZXN0dXJlRW5kZWQpOgorICAgICAgICAo
V2ViS2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2VzdHVyZVN0YXJ0ZWQp
OgorICAgICAgICAoV2ViS2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2Vz
dHVyZVJlcXVlc3RVcGRhdGUpOgorICAgICAgICAoV2ViS2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rp
b25FbmdpbmU6OnBpbmNoR2VzdHVyZUVuZGVkKToKKyAgICAgICAgKFdlYktpdDo6UXRWaWV3cG9y
dEludGVyYWN0aW9uRW5naW5lOjpjb250ZW50Vmlld3BvcnRDaGFuZ2VkKToKKyAgICAgICAgKiBV
SVByb2Nlc3MvcXQvUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmg6CisgICAgICAgIChXZWJL
aXQ6OlF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6c2Nyb2xsZXIpOgorICAgICAgICAoV2Vi
S2l0OjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OlNjYWxlQW5pbWF0aW9uOjpTY2FsZUFu
aW1hdGlvbik6CisgICAgICAgIChXZWJLaXQ6OlF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6
U2NhbGVBbmltYXRpb246OnVwZGF0ZUN1cnJlbnRWYWx1ZSk6CisKIDIwMTEtMTAtMjUgIFplbm8g
QWxiaXNzZXIgIDx6ZW5vLmFsYmlzc2VyQG5va2lhLmNvbT4KIAogICAgICAgICBbUXRdW1dLMl0g
UURlc2t0b3BXZWJWaWV3IGFuZCBRVG91Y2hXZWJWaWV3IHNob3VsZCBiZSBkZWNsYXJlZCBpbiB0
aGUgbWV0YSB0eXBlIHN5c3RlbS4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9xdC9RdFBhbkdlc3R1cmVSZWNvZ25pemVyLmNwcCBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9xdC9RdFBhbkdlc3R1cmVSZWNvZ25pemVyLmNwcAppbmRleCA0ZThiMWZjLi5lZjJiYjY3IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRQYW5HZXN0dXJlUmVjb2du
aXplci5jcHAKKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1F0UGFuR2VzdHVyZVJl
Y29nbml6ZXIuY3BwCkBAIC0zNyw3ICszNyw3IEBAIFF0UGFuR2VzdHVyZVJlY29nbml6ZXI6OlF0
UGFuR2VzdHVyZVJlY29nbml6ZXIoUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lKiBpbnRlCiAg
ICAgcmVzZXQoKTsKIH0KIAotYm9vbCBRdFBhbkdlc3R1cmVSZWNvZ25pemVyOjpyZWNvZ25pemUo
Y29uc3QgUVRvdWNoRXZlbnQqIGV2ZW50KQorYm9vbCBRdFBhbkdlc3R1cmVSZWNvZ25pemVyOjpy
ZWNvZ25pemUoY29uc3QgUVRvdWNoRXZlbnQqIGV2ZW50LCBxaW50NjQgZXZlbnRUaW1lc3RhbXBN
aWxsaXMpCiB7CiAgICAgLy8gUGFuIGdlc3R1cmUgYWx3YXlzIHN0YXJ0cyBvbiBUb3VjaEJlZ2lu
IHVubGVzcyB0aGUgZW5naW5lIGlzIHN1c3BlbmRlZC4KICAgICBpZiAobV9zdGF0ZSA9PSBOb0dl
c3R1cmUgJiYgZXZlbnQtPnR5cGUoKSAhPSBRRXZlbnQ6OlRvdWNoQmVnaW4pCkBAIC01OCw2ICs1
OCw3IEBAIGJvb2wgUXRQYW5HZXN0dXJlUmVjb2duaXplcjo6cmVjb2duaXplKGNvbnN0IFFUb3Vj
aEV2ZW50KiBldmVudCkKICAgICAgICAgQVNTRVJUKG1fc3RhdGUgPT0gTm9HZXN0dXJlKTsKICAg
ICAgICAgbV9zdGF0ZSA9IEdlc3R1cmVSZWNvZ25pdGlvblN0YXJ0ZWQ7CiAgICAgICAgIG1fZmly
c3RQb3NpdGlvbiA9IHRvdWNoUG9pbnQuc2NyZWVuUG9zKCk7CisgICAgICAgIG1fdmlld3BvcnRJ
bnRlcmFjdGlvbkVuZ2luZS0+c3RvcEFuaW1hdGlvbnMoKTsKICAgICAgICAgcmV0dXJuIGZhbHNl
OwogICAgIGNhc2UgUUV2ZW50OjpUb3VjaFVwZGF0ZTogewogICAgICAgICBBU1NFUlQobV9zdGF0
ZSAhPSBOb0dlc3R1cmUpOwpAQCAtNjksMTggKzcwLDE2IEBAIGJvb2wgUXRQYW5HZXN0dXJlUmVj
b2duaXplcjo6cmVjb2duaXplKGNvbnN0IFFUb3VjaEV2ZW50KiBldmVudCkKICAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgICAgIG1fc3RhdGUgPSBHZXN0dXJlUmVjb2du
aXplZDsKLSAgICAgICAgICAgIG1fdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+cGFuR2VzdHVy
ZVN0YXJ0ZWQoKTsKKyAgICAgICAgICAgIG1fdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+cGFu
R2VzdHVyZVN0YXJ0ZWQodG91Y2hQb2ludC5wb3MoKSwgZXZlbnRUaW1lc3RhbXBNaWxsaXMpOwog
ICAgICAgICB9CiAKICAgICAgICAgQVNTRVJUKG1fc3RhdGUgPT0gR2VzdHVyZVJlY29nbml6ZWQp
OwotICAgICAgICAvLyBPZmZzZXQgc2VudCB0byB0aGUgdmlld3MgbXVzdCBiZSBpbiBwYWdlIHZp
ZXcgY29vcmRpbmF0ZSBzcGFjZS4KLSAgICAgICAgUVBvaW50RiBvZmZzZXRTaW5jZUxhc3RFdmVu
dCh0b3VjaFBvaW50LnBvcygpIC0gdG91Y2hQb2ludC5sYXN0UG9zKCkpOwotICAgICAgICBtX3Zp
ZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPnBhbkdlc3R1cmVSZXF1ZXN0VXBkYXRlKG9mZnNldFNp
bmNlTGFzdEV2ZW50LngoKSwgb2Zmc2V0U2luY2VMYXN0RXZlbnQueSgpKTsKKyAgICAgICAgbV92
aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLT5wYW5HZXN0dXJlUmVxdWVzdFVwZGF0ZSh0b3VjaFBv
aW50LnBvcygpLCBldmVudFRpbWVzdGFtcE1pbGxpcyk7CiAgICAgICAgIHJldHVybiB0cnVlOwog
ICAgIH0KICAgICBjYXNlIFFFdmVudDo6VG91Y2hFbmQ6CiAgICAgICAgIGlmIChtX3N0YXRlID09
IEdlc3R1cmVSZWNvZ25pemVkKSB7Ci0gICAgICAgICAgICBtX3ZpZXdwb3J0SW50ZXJhY3Rpb25F
bmdpbmUtPnBhbkdlc3R1cmVFbmRlZCgpOworICAgICAgICAgICAgbV92aWV3cG9ydEludGVyYWN0
aW9uRW5naW5lLT5wYW5HZXN0dXJlRW5kZWQodG91Y2hQb2ludC5wb3MoKSwgZXZlbnRUaW1lc3Rh
bXBNaWxsaXMpOwogICAgICAgICAgICAgcmVzZXQoKTsKICAgICAgICAgICAgIHJldHVybiB0cnVl
OwogICAgICAgICB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRQ
YW5HZXN0dXJlUmVjb2duaXplci5oIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1F0UGFu
R2VzdHVyZVJlY29nbml6ZXIuaAppbmRleCBmMTQ0NjJlLi4yZjI3NTM3IDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRQYW5HZXN0dXJlUmVjb2duaXplci5oCisrKyBi
L1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFBhbkdlc3R1cmVSZWNvZ25pemVyLmgKQEAg
LTQyLDcgKzQyLDcgQEAgY29uc3QgcXJlYWwgcGFubmluZ0luaXRpYWxUcmlnZ2VyRGlzdGFuY2VU
aHJlc2hvbGQgPSA1LjsKIGNsYXNzIFF0UGFuR2VzdHVyZVJlY29nbml6ZXIgOiBwcml2YXRlIFF0
R2VzdHVyZVJlY29nbml6ZXIgewogcHVibGljOgogICAgIFF0UGFuR2VzdHVyZVJlY29nbml6ZXIo
UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lKik7Ci0gICAgYm9vbCByZWNvZ25pemUoY29uc3Qg
UVRvdWNoRXZlbnQqKTsKKyAgICBib29sIHJlY29nbml6ZShjb25zdCBRVG91Y2hFdmVudCosIHFp
bnQ2NCBldmVudFRpbWVzdGFtcE1pbGxpcyk7CiAgICAgdm9pZCByZXNldCgpOwogCiBwcml2YXRl
OgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1F0UGluY2hHZXN0dXJl
UmVjb2duaXplci5jcHAgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRQaW5jaEdlc3R1
cmVSZWNvZ25pemVyLmNwcAppbmRleCBmMzlkZmFhLi42M2E5ZGI1IDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRQaW5jaEdlc3R1cmVSZWNvZ25pemVyLmNwcAorKysg
Yi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRQaW5jaEdlc3R1cmVSZWNvZ25pemVyLmNw
cApAQCAtOTYsNyArOTYsNyBAQCBib29sIFF0UGluY2hHZXN0dXJlUmVjb2duaXplcjo6cmVjb2du
aXplKGNvbnN0IFFUb3VjaEV2ZW50KiBldmVudCkKICAgICAgICAgICAgICAgICBpZiAocGluY2hE
aXN0YW5jZSA8IHBpbmNoSW5pdGlhbFRyaWdnZXJEaXN0YW5jZVRocmVzaG9sZCkKICAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIG1fc3RhdGUgPSBHZXN0
dXJlUmVjb2duaXplZDsKLSAgICAgICAgICAgICAgICBtX3ZpZXdwb3J0SW50ZXJhY3Rpb25Fbmdp
bmUtPnBpbmNoR2VzdHVyZVN0YXJ0ZWQoKTsKKyAgICAgICAgICAgICAgICBtX3ZpZXdwb3J0SW50
ZXJhY3Rpb25FbmdpbmUtPnBpbmNoR2VzdHVyZVN0YXJ0ZWQoY29tcHV0ZVRvdWNoQ2VudGVyKHBv
aW50MSwgcG9pbnQyKSk7CiAKICAgICAgICAgICAgICAgICAvLyBXZSByZXNldCB0aGUgaW5pdGlh
bCBwb3NpdGlvbiB0byB0aGUgcHJldmlvdXMgcG9zaXRpb24gaW4gb3JkZXIgdG8gYXZvaWQgdGhl
IGp1bXAgY2F1c2VkCiAgICAgICAgICAgICAgICAgLy8gYnkgc2tpcHBpbmcgYWxsIHRoZSBldmVu
dHMgYmV0d2VlbiB0aGUgYmVnaW5uaW5nIGFuZCB3aGVuIHRoZSB0aHJlc2hvbGQgaXMgaGl0Lgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1F0VG91Y2hXZWJQYWdlUHJv
eHkuY3BwIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0L1F0VG91Y2hXZWJQYWdlUHJveHku
Y3BwCmluZGV4IDE1MTQ1MzguLmU2ZGNlODUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJ
UHJvY2Vzcy9xdC9RdFRvdWNoV2ViUGFnZVByb3h5LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvcXQvUXRUb3VjaFdlYlBhZ2VQcm94eS5jcHAKQEAgLTU4LDcgKzU4LDkgQEAgdm9p
ZCBRdFRvdWNoV2ViUGFnZVByb3h5Ojpkb25lV2l0aFRvdWNoRXZlbnQoY29uc3QgTmF0aXZlV2Vi
VG91Y2hFdmVudCYgZXZlbnQsIGIKICAgICAgICAgbV9wYW5HZXN0dXJlUmVjb2duaXplci5yZXNl
dCgpOwogICAgICAgICBtX3BpbmNoR2VzdHVyZVJlY29nbml6ZXIucmVzZXQoKTsKICAgICB9IGVs
c2UgewotICAgICAgICBtX3Bhbkdlc3R1cmVSZWNvZ25pemVyLnJlY29nbml6ZShldmVudC5uYXRp
dmVFdmVudCgpKTsKKyAgICAgICAgLy8gQ29udmVydCB0aGUgZXZlbnQgdGltZXN0YW1wIGZyb20g
c2Vjb25kIHRvIG1pbGxpc2Vjb25kLgorICAgICAgICBxaW50NjQgZXZlbnRUaW1lc3RhbXBNaWxs
aXMgPSBzdGF0aWNfY2FzdDxxaW50NjQ+KGV2ZW50LnRpbWVzdGFtcCgpICogMTAwMCk7CisgICAg
ICAgIG1fcGFuR2VzdHVyZVJlY29nbml6ZXIucmVjb2duaXplKGV2ZW50Lm5hdGl2ZUV2ZW50KCks
IGV2ZW50VGltZXN0YW1wTWlsbGlzKTsKICAgICAgICAgbV9waW5jaEdlc3R1cmVSZWNvZ25pemVy
LnJlY29nbml6ZShldmVudC5uYXRpdmVFdmVudCgpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmNw
cCBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFZpZXdwb3J0SW50ZXJhY3Rpb25Fbmdp
bmUuY3BwCmluZGV4IGQ0MWI2M2YuLjBhNmMzZmUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9xdC9RdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUuY3BwCisrKyBiL1NvdXJj
ZS9XZWJLaXQyL1VJUHJvY2Vzcy9xdC9RdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUuY3BwCkBA
IC0xLDQgKzEsNSBAQAogLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBOb2tpYSBDb3Jwb3JhdGlv
biBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKICAqIENvcHlyaWdodCAoQykgMjAxMSBCZW5q
YW1pbiBQb3VsYWluIDxiZW5qYW1pbkB3ZWJraXQub3JnPgogICoKICAqIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTIzLDU4
ICsyNCw2NCBAQAogCiAjaW5jbHVkZSAiUGFzc093blB0ci5oIgogI2luY2x1ZGUgPFFQb2ludEY+
CisjaW5jbHVkZSA8UVNjcm9sbEV2ZW50PgorI2luY2x1ZGUgPFFTY3JvbGxQcmVwYXJlRXZlbnQ+
CisjaW5jbHVkZSA8UVNjcm9sbGVyUHJvcGVydGllcz4KICNpbmNsdWRlIDxRdERlY2xhcmF0aXZl
L3FzZ2l0ZW0uaD4KIAogbmFtZXNwYWNlIFdlYktpdCB7CiAKLXN0YXRpYyBpbmxpbmUgUVJlY3RG
IHZpc2libGVSZWN0SW5Db250ZW50Q29vcmRpbmF0ZShjb25zdCBRU0dJdGVtKiBjb250ZW50LCBj
b25zdCBRU0dJdGVtKiB2aWV3cG9ydCkKLXsKLSAgICBjb25zdCBRUmVjdEYgdmlld3BvcnRJbkNv
bnRlbnRDb29yZGluYXRlID0gY29udGVudC0+bWFwUmVjdEZyb21JdGVtKHZpZXdwb3J0LCB2aWV3
cG9ydC0+Ym91bmRpbmdSZWN0KCkpOwotICAgIGNvbnN0IFFSZWN0RiB2aXNpYmxlQXJlYSA9IGNv
bnRlbnQtPmJvdW5kaW5nUmVjdCgpLmludGVyc2VjdGVkKHZpZXdwb3J0SW5Db250ZW50Q29vcmRp
bmF0ZSk7Ci0gICAgcmV0dXJuIHZpc2libGVBcmVhOwotfQorc3RhdGljIGNvbnN0IGludCBrU2Nh
bGVBbmltYXRpb25EdXJhdGlvbk1pbGxpcyA9IDQwMDsKIAogc3RhdGljIGlubGluZSBRUmVjdEYg
Y29udGVudFJlY3RJblZpZXdwb3J0Q29vcmRpbmF0ZShjb25zdCBRU0dJdGVtKiBjb250ZW50LCBj
b25zdCBRU0dJdGVtKiB2aWV3cG9ydCkKIHsKICAgICByZXR1cm4gdmlld3BvcnQtPm1hcFJlY3RG
cm9tSXRlbShjb250ZW50LCBjb250ZW50LT5ib3VuZGluZ1JlY3QoKSk7CiB9CiAKK3N0YXRpYyBp
bmxpbmUgcXJlYWwgYmluZFRvU2NhbGVMaW1pdHMocXJlYWwgc2NhbGUpCit7CisgICAgLy8gQm91
bmRlZCBieSBbMC4xLCAxMC4wXSBsaWtlIHRoZSB2aWV3cG9ydCBtZXRhIGNvZGUgaW4gV2ViQ29y
ZS4KKyAgICByZXR1cm4gcUJvdW5kKHFyZWFsKDAuMSksIHNjYWxlLCBxcmVhbCgxMC4wKSk7Cit9
CisKIC8vIFVwZGF0aW5nIGNvbnRlbnQgcHJvcGVydGllcyBjYXVzZSB0aGUgbm90aWZ5IHNpZ25h
bHMgdG8gYmUgc2VudCBieSB0aGUgY29udGVudCBpdGVtIGl0c2VsZi4KIC8vIFNpbmNlIHdlIG1h
bmFnZSB0aG9zZSBkaWZmZXJlbnRseSwgd2UgZG8gbm90IHdhbnQgdG8gcmVzcG9uZAogLy8gdG8g
dGhlbSB3aGVuIHdlIGFyZSB0aGUgb25lIGNoYW5naW5nIHRoZSBjb250ZW50LgogLy8KLS8vIFRo
ZSBndWFyZCBtYWtlIHN1cmUgdGhlIHNpZ25hbCB2aWV3cG9ydFVwZGF0ZVJlcXVlc3RlZCgpIGlz
IHNlbnQgaWYgbmVjZXNzYXJ5LgorLy8gVGhlIGd1YXJkIG1ha2VzIHN1cmUgdGhhdCB0aGUgc2ln
bmFsIHZpZXdwb3J0VXBkYXRlUmVxdWVzdGVkKCkgaXMgc2VudCBpZiBuZWNlc3NhcnkuCiAvLyBX
aGVuIG11bHRpcGxlIGd1YXJkcyBhcmUgYWxpdmUsIHRoZWlyIGxpZmV0aW1lIG11c3QgYmUgcGVy
ZmVjdGx5IGltYnJpY2F0ZWQgKGUuZy4gaWYgdXNlZCBvdXNpZGUgc3RhY2sgZnJhbWVzKS4KLS8v
IFdlIHJlbHkgb24gdGhlIGZpcnN0IG9uZSB0byB0cmlnZ2VyIHRoZSB1cGRhdGUgYXQgdGhlIGVu
ZCBzaW5jZSBpdCBvbmx5IHVzZXMgb25lIGJvb2wgaW50ZXJuYWxseS4KKy8vIFdlIHJlbHkgb24g
dGhlIGZpcnN0IG9uZSB0byB0cmlnZ2VyIHRoZSB1cGRhdGUgYXQgdGhlIGVuZC4KIC8vCiAvLyBU
aGUgcHVibGljIG1ldGhvZHMgc2hvdWxkIGNyZWF0ZSB0aGUgZ3VhcmQgaWYgdGhleSBtaWdodCB1
cGRhdGUgY29udGVudC4KIGNsYXNzIFZpZXdwb3J0VXBkYXRlR3VhcmQgewogcHVibGljOgogICAg
IFZpZXdwb3J0VXBkYXRlR3VhcmQoUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lKiB2aWV3cG9y
dEludGVyYWN0aW9uRW5naW5lKQogICAgICAgICA6IHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUo
dmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZSkKLSAgICAgICAgLCB3YXNVcGRhdGluZ0NvbnRlbnQo
dmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+bV9pc1VwZGF0aW5nQ29udGVudCkKICAgICAgICAg
LCBwcmV2aW91c1Bvc2l0aW9uKHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1fY29udGVudC0+
cG9zKCkpCiAgICAgICAgICwgcHJldmlvdXNTaXplKHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUt
Pm1fY29udGVudC0+d2lkdGgoKSwgdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+bV9jb250ZW50
LT5oZWlnaHQoKSkKICAgICAgICAgLCBwcmV2aW91c1NjYWxlKHZpZXdwb3J0SW50ZXJhY3Rpb25F
bmdpbmUtPm1fY29udGVudC0+c2NhbGUoKSkKKwogICAgIHsKLSAgICAgICAgdmlld3BvcnRJbnRl
cmFjdGlvbkVuZ2luZS0+bV9pc1VwZGF0aW5nQ29udGVudCA9IHRydWU7CisgICAgICAgICsrKHZp
ZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1fcGVuZGluZ1VwZGF0ZXMpOwogICAgIH0KIAogICAg
IH5WaWV3cG9ydFVwZGF0ZUd1YXJkKCkKICAgICB7Ci0gICAgICAgIGlmICghd2FzVXBkYXRpbmdD
b250ZW50KSB7CisgICAgICAgIC0tKHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1fcGVuZGlu
Z1VwZGF0ZXMpOworICAgICAgICBpZiAoIXZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPm1fcGVu
ZGluZ1VwZGF0ZXMpIHsKKyAgICAgICAgICAgIC8vIFJlc2V0IHRoZSB0aWxpbmcgbG9vay1haGVh
ZCB2ZWN0b3Igc28gdGhhdCB0aWxlcyBhbGwgYXJvdW5kIHRoZSB2aWV3cG9ydCB3aWxsIGJlIHJl
cXVlc3RlZC4KKyAgICAgICAgICAgIGVtaXQgdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+dmll
d3BvcnRUcmFqZWN0b3J5VmVjdG9yQ2hhbmdlZChRUG9pbnRGKCkpOwogICAgICAgICAgICAgaWYg
KHByZXZpb3VzUG9zaXRpb24gIT0gdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+bV9jb250ZW50
LT5wb3MoKQogICAgICAgICAgICAgICAgICAgICB8fCBwcmV2aW91c1NpemUud2lkdGgoKSAhPSB2
aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLT5tX2NvbnRlbnQtPndpZHRoKCkKICAgICAgICAgICAg
ICAgICAgICAgfHwgcHJldmlvdXNTaXplLmhlaWdodCgpICE9IHZpZXdwb3J0SW50ZXJhY3Rpb25F
bmdpbmUtPm1fY29udGVudC0+aGVpZ2h0KCkKICAgICAgICAgICAgICAgICAgICAgfHwgcHJldmlv
dXNTY2FsZSAhPSB2aWV3cG9ydEludGVyYWN0aW9uRW5naW5lLT5tX2NvbnRlbnQtPnNjYWxlKCkp
CisgICAgICAgICAgICAgICAgLy8gV2UgbXVzdCBub3RpZnkgdGhlIGNoYW5nZSBzbyB0aGUgY2xp
ZW50IGNhbiByZWx5IG9uIHVzIGZvciBhbGwgY2hhbmdlcyBvZiBnZW9tZXRyeS4KICAgICAgICAg
ICAgICAgICBlbWl0IHZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUtPnZpZXdwb3J0VXBkYXRlUmVx
dWVzdGVkKCk7CiAgICAgICAgIH0KLSAgICAgICAgdmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS0+
bV9pc1VwZGF0aW5nQ29udGVudCA9IHdhc1VwZGF0aW5nQ29udGVudDsKICAgICB9CiAKIHByaXZh
dGU6CiAgICAgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lKiBjb25zdCB2aWV3cG9ydEludGVy
YWN0aW9uRW5naW5lOwotICAgIGNvbnN0IGJvb2wgd2FzVXBkYXRpbmdDb250ZW50OwogICAgIGNv
bnN0IFFQb2ludEYgcHJldmlvdXNQb3NpdGlvbjsKICAgICBjb25zdCBRU2l6ZUYgcHJldmlvdXNT
aXplOwogICAgIGNvbnN0IHFyZWFsIHByZXZpb3VzU2NhbGU7CkBAIC04Myw3ICs5MCw4IEBAIHBy
aXZhdGU6CiBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OlF0Vmlld3BvcnRJbnRlcmFjdGlv
bkVuZ2luZShjb25zdCBRU0dJdGVtKiB2aWV3cG9ydCwgUVNHSXRlbSogY29udGVudCkKICAgICA6
IG1fdmlld3BvcnQodmlld3BvcnQpCiAgICAgLCBtX2NvbnRlbnQoY29udGVudCkKLSAgICAsIG1f
aXNVcGRhdGluZ0NvbnRlbnQoZmFsc2UpCisgICAgLCBtX3BlbmRpbmdVcGRhdGVzKDApCisgICAg
LCBtX3NjYWxlQW5pbWF0aW9uKG5ldyBTY2FsZUFuaW1hdGlvbih0aGlzKSkKICAgICAsIG1fcGlu
Y2hTdGFydFNjYWxlKDEuZikKIHsKICAgICByZXNldCgpOwpAQCAtOTIsMTUgKzEwMCwxNzQgQEAg
UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUo
Y29uc3QgUVNHSXRlbSogdmlld3BvcnQKICAgICBjb25uZWN0KG1fY29udGVudCwgU0lHTkFMKHdp
ZHRoQ2hhbmdlZCgpKSwgdGhpcywgU0xPVChjb250ZW50Vmlld3BvcnRDaGFuZ2VkKCkpLCBRdDo6
RGlyZWN0Q29ubmVjdGlvbik7CiAgICAgY29ubmVjdChtX2NvbnRlbnQsIFNJR05BTChoZWlnaHRD
aGFuZ2VkKCkpLCB0aGlzLCBTTE9UKGNvbnRlbnRWaWV3cG9ydENoYW5nZWQoKSksIFF0OjpEaXJl
Y3RDb25uZWN0aW9uKTsKICAgICBjb25uZWN0KG1fY29udGVudCwgU0lHTkFMKHNjYWxlQ2hhbmdl
ZCgpKSwgdGhpcywgU0xPVChjb250ZW50Vmlld3BvcnRDaGFuZ2VkKCkpLCBRdDo6RGlyZWN0Q29u
bmVjdGlvbik7CisgICAgY29ubmVjdChtX3NjYWxlQW5pbWF0aW9uLCBTSUdOQUwodmFsdWVDaGFu
Z2VkKFFWYXJpYW50KSksIFNMT1QodXBkYXRlVmlzaWJsZVJlY3QoUVZhcmlhbnQpKSwgUXQ6OkRp
cmVjdENvbm5lY3Rpb24pOworICAgIGNvbm5lY3QobV9zY2FsZUFuaW1hdGlvbiwgU0lHTkFMKHN0
YXRlQ2hhbmdlZChRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlLCBRQWJzdHJhY3RBbmltYXRpb246
OlN0YXRlKSkKKyAgICAgICAgICAgICwgU0xPVChzY2FsZUFuaW1hdGlvblN0YXRlQ2hhbmdlZChR
QWJzdHJhY3RBbmltYXRpb246OlN0YXRlLCBRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlKSksIFF0
OjpEaXJlY3RDb25uZWN0aW9uKTsKIH0KIAogUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjp+
UXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lKCkKIHsKIH0KIAorcXJlYWwgUXRWaWV3cG9ydElu
dGVyYWN0aW9uRW5naW5lOjppbm5lckJvdW5kZWRTY2FsZShxcmVhbCBzY2FsZSkKK3sKKyAgICBy
ZXR1cm4gcUJvdW5kKG1fY29uc3RyYWludHMubWluaW11bVNjYWxlLCBzY2FsZSwgbV9jb25zdHJh
aW50cy5tYXhpbXVtU2NhbGUpOworfQorCitxcmVhbCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25Fbmdp
bmU6Om91dGVyQm91bmRlZFNjYWxlKHFyZWFsIHNjYWxlKQoreworICAgIGlmIChtX2NvbnN0cmFp
bnRzLmlzVXNlclNjYWxhYmxlKSB7CisgICAgICAgIHFyZWFsIGhhcmRNaW4gPSBxcmVhbCgwLjUp
ICogbV9jb25zdHJhaW50cy5taW5pbXVtU2NhbGU7CisgICAgICAgIHFyZWFsIGhhcmRNYXggPSBx
cmVhbCgyLjApICogbV9jb25zdHJhaW50cy5tYXhpbXVtU2NhbGU7CisgICAgICAgIHJldHVybiBi
aW5kVG9TY2FsZUxpbWl0cyhxQm91bmQoaGFyZE1pbiwgc2NhbGUsIGhhcmRNYXgpKTsKKyAgICB9
CisgICAgcmV0dXJuIGlubmVyQm91bmRlZFNjYWxlKHNjYWxlKTsKK30KKwordm9pZCBRdFZpZXdw
b3J0SW50ZXJhY3Rpb25FbmdpbmU6OnVwZGF0ZVZpc2libGVSZWN0KFFWYXJpYW50IHJlY3QpCit7
CisgICAgVmlld3BvcnRVcGRhdGVHdWFyZCBndWFyZCh0aGlzKTsKKworICAgIFFSZWN0RiB2aXNp
YmxlUmVjdCA9IHJlY3QudG9SZWN0RigpOworICAgIHFyZWFsIGN1cnJlbnRTY2FsZSA9IG1fdmll
d3BvcnQtPndpZHRoKCkgLyB2aXNpYmxlUmVjdC53aWR0aCgpOworCisgICAgbV9jb250ZW50LT5z
ZXRTY2FsZShjdXJyZW50U2NhbGUpOworCisgICAgLy8gV2UgbmVlZCB0byBhbmltYXRlIHRoZSBj
b250ZW50IGJ1dCB0aGUgcG9zaXRpb24gcmVwcmVzZW50cyB0aGUgdmlld3BvcnQgaGVuY2Ugd2Ug
bmVlZCB0byBpbnZlcnQgdGhlIHBvc2l0aW9uIGhlcmUuCisgICAgLy8gVG8gYW5pbWF0ZSB0aGUg
cG9zaXRpb24gdG9nZXRoZXIgd2l0aCB0aGUgc2NhbGUgd2UgbXVsdGlwbHkgdGhlIHBvc2l0aW9u
IHdpdGggdGhlIGN1cnJlbnQgc2NhbGU7CisgICAgbV9jb250ZW50LT5zZXRQb3MoLXZpc2libGVS
ZWN0LnRvcExlZnQoKSAqIGN1cnJlbnRTY2FsZSk7Cit9CisKK3ZvaWQgUXRWaWV3cG9ydEludGVy
YWN0aW9uRW5naW5lOjpzY2FsZUFuaW1hdGlvblN0YXRlQ2hhbmdlZChRQWJzdHJhY3RBbmltYXRp
b246OlN0YXRlIG5ld1N0YXRlLCBRQWJzdHJhY3RBbmltYXRpb246OlN0YXRlIC8qb2xkU3RhdGUq
LykKK3sKKyAgICBzd2l0Y2ggKG5ld1N0YXRlKSB7CisgICAgY2FzZSBRQWJzdHJhY3RBbmltYXRp
b246OlJ1bm5pbmc6CisgICAgICAgIG1fcGluY2hWaWV3cG9ydFVwZGF0ZURlZmVycmVyID0gYWRv
cHRQdHIobmV3IFZpZXdwb3J0VXBkYXRlR3VhcmQodGhpcykpOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIFFBYnN0cmFjdEFuaW1hdGlvbjo6U3RvcHBlZDoKKyAgICAgICAgbV9waW5jaFZpZXdw
b3J0VXBkYXRlRGVmZXJyZXIuY2xlYXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoK
KyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitib29sIFF0Vmlld3BvcnRJbnRlcmFjdGlvbkVu
Z2luZTo6ZXZlbnQoUUV2ZW50KiBldmVudCkKK3sKKyAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKCkp
IHsKKyAgICBjYXNlIFFFdmVudDo6U2Nyb2xsUHJlcGFyZTogeworICAgICAgICBRU2Nyb2xsUHJl
cGFyZUV2ZW50KiBwcmVwYXJlRXZlbnQgPSBzdGF0aWNfY2FzdDxRU2Nyb2xsUHJlcGFyZUV2ZW50
Kj4oZXZlbnQpOworICAgICAgICBjb25zdCBRUmVjdEYgdmlld3BvcnRSZWN0ID0gbV92aWV3cG9y
dC0+Ym91bmRpbmdSZWN0KCk7CisgICAgICAgIGNvbnN0IFFSZWN0RiBjb250ZW50UmVjdCA9IGNv
bnRlbnRSZWN0SW5WaWV3cG9ydENvb3JkaW5hdGUobV9jb250ZW50LCBtX3ZpZXdwb3J0KTsKKyAg
ICAgICAgY29uc3QgUVJlY3RGIGNvbnRlbnRQb3NpdGlvblJhbmdlID0gY2FsY3VsYXRlQm91bmRh
cmllc0ZvclNjYWxlKGNvbnRlbnRSZWN0LnNpemUoKSwgdmlld3BvcnRSZWN0LnNpemUoKSwgMSk7
CisgICAgICAgIHByZXBhcmVFdmVudC0+c2V0Q29udGVudFBvc1JhbmdlKGNvbnRlbnRQb3NpdGlv
blJhbmdlKTsKKyAgICAgICAgcHJlcGFyZUV2ZW50LT5zZXRWaWV3cG9ydFNpemUodmlld3BvcnRS
ZWN0LnNpemUoKSk7CisKKyAgICAgICAgLy8gQXMgd2Ugd2FudCB0byBwdXNoIHRoZSBjb250ZW50
cyBhbmQgbm90IGFjdHVhbGx5IHNjcm9sbCBpdCwgd2UgbmVlZCB0byBpbnZlcnQgdGhlIHBvc2l0
aW9ucyBoZXJlLgorICAgICAgICBwcmVwYXJlRXZlbnQtPnNldENvbnRlbnRQb3MoLWNvbnRlbnRS
ZWN0LnRvcExlZnQoKSk7CisgICAgICAgIHByZXBhcmVFdmVudC0+YWNjZXB0KCk7CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIFFFdmVudDo6U2Nyb2xsOiB7CisgICAgICAg
IFFTY3JvbGxFdmVudCogc2Nyb2xsRXZlbnQgPSBzdGF0aWNfY2FzdDxRU2Nyb2xsRXZlbnQqPihl
dmVudCk7CisgICAgICAgIFFQb2ludEYgbmV3UG9zID0gLXNjcm9sbEV2ZW50LT5jb250ZW50UG9z
KCkgLSBzY3JvbGxFdmVudC0+b3ZlcnNob290RGlzdGFuY2UoKTsKKyAgICAgICAgaWYgKG1fY29u
dGVudC0+cG9zKCkgIT0gbmV3UG9zKSB7CisgICAgICAgICAgICBWaWV3cG9ydFVwZGF0ZUd1YXJk
IGd1YXJkKHRoaXMpOworCisgICAgICAgICAgICBRUG9pbnRGIGN1cnJlbnRQb3NJbkNvbnRlbnRD
b29yZGluYXRlcyA9IG1fY29udGVudC0+bWFwVG9JdGVtKG1fY29udGVudC0+cGFyZW50SXRlbSgp
LCBtX2NvbnRlbnQtPnBvcygpKTsKKyAgICAgICAgICAgIFFQb2ludEYgbmV3UG9zSW5Db250ZW50
Q29vcmRpbmF0ZXMgPSBtX2NvbnRlbnQtPm1hcFRvSXRlbShtX2NvbnRlbnQtPnBhcmVudEl0ZW0o
KSwgbmV3UG9zKTsKKworICAgICAgICAgICAgLy8gVGhpcyBtdXN0IGJlIGVtaXR0ZWQgYmVmb3Jl
IHZpZXdwb3J0VXBkYXRlUmVxdWVzdGVkIHNvIHRoYXQgdGhlIHdlYiBwcm9jZXNzIGtub3dzIHdo
ZXJlIHRvIGxvb2sgZm9yIHRpbGVzLgorICAgICAgICAgICAgZW1pdCB2aWV3cG9ydFRyYWplY3Rv
cnlWZWN0b3JDaGFuZ2VkKGN1cnJlbnRQb3NJbkNvbnRlbnRDb29yZGluYXRlcy0gbmV3UG9zSW5D
b250ZW50Q29vcmRpbmF0ZXMpOworICAgICAgICAgICAgbV9jb250ZW50LT5zZXRQb3MobmV3UG9z
KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZGVmYXVsdDoK
KyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBRT2JqZWN0OjpldmVudChldmVudCk7
Cit9CisKK3ZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpzdG9wQW5pbWF0aW9ucygp
Cit7CisgICAgbV9zY2FsZUFuaW1hdGlvbi0+c3RvcCgpOworICAgIHNjcm9sbGVyKCktPnN0b3Ao
KTsKK30KKworY29uc3QgUVJlY3RGIFF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6Y2FsY3Vs
YXRlQm91bmRhcmllc0ZvclNjYWxlKGNvbnN0IFFTaXplRiBjb250ZW50U2l6ZSwgY29uc3QgUVNp
emVGIHZpZXdwb3J0U2l6ZSwgcXJlYWwgc2NhbGUpCit7CisgICAgY29uc3QgUVNpemVGIHNjYWxl
ZFZpZXdwb3J0U2l6ZSA9IHZpZXdwb3J0U2l6ZSAvIHNjYWxlOworCisgICAgY29uc3QgcXJlYWwg
aG9yaXpvbnRhbE9mZnNldCA9IGNvbnRlbnRTaXplLndpZHRoKCkgLSBzY2FsZWRWaWV3cG9ydFNp
emUud2lkdGgoKTsKKyAgICBjb25zdCBxcmVhbCB2ZXJ0aWNhbE9mZnNldCA9IGNvbnRlbnRTaXpl
LmhlaWdodCgpIC0gc2NhbGVkVmlld3BvcnRTaXplLmhlaWdodCgpOworCisgICAgY29uc3QgUVBv
aW50RiBjb250ZW50UG9zaXRpb25SYW5nZVRvcExlZnQocU1pbjxxcmVhbD4oMCwgaG9yaXpvbnRh
bE9mZnNldCAvIDIpLCAwKTsKKyAgICBjb25zdCBxcmVhbCBjb250ZW50UG9zaXRpb25SYW5nZVdp
ZHRoID0gcU1heDxxcmVhbD4oMCwgaG9yaXpvbnRhbE9mZnNldCk7CisgICAgY29uc3QgcXJlYWwg
Y29udGVudFBvc2l0aW9uUmFuZ2VIZWlnaHQgPSBxTWF4PHFyZWFsPigwLCB2ZXJ0aWNhbE9mZnNl
dCk7CisKKyAgICByZXR1cm4gUVJlY3RGKGNvbnRlbnRQb3NpdGlvblJhbmdlVG9wTGVmdCwgUVNp
emVGKGNvbnRlbnRQb3NpdGlvblJhbmdlV2lkdGgsIGNvbnRlbnRQb3NpdGlvblJhbmdlSGVpZ2h0
KSk7Cit9CisKK3ZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjphbmltYXRlQ29udGVu
dEludG9Cb3VuZGFyaWVzSWZOZWVkZWQoKQoreworICAgIG1fc2NhbGVBbmltYXRpb24tPnN0b3Ao
KTsKKworICAgIHFyZWFsIGN1cnJlbnRTY2FsZSA9IG1fY29udGVudC0+c2NhbGUoKTsKKyAgICBi
b29sIHVzZXJIYXNTY2FsZWRDb250ZW50ID0gbV91c2VySW50ZXJhY3Rpb25GbGFncyAmIFVzZXJI
YXNTY2FsZWRDb250ZW50OworCisgICAgaWYgKCF1c2VySGFzU2NhbGVkQ29udGVudCkKKyAgICAg
ICAgY3VycmVudFNjYWxlID0gbV9jb25zdHJhaW50cy5pbml0aWFsU2NhbGU7CisKKyAgICBxcmVh
bCBib3VuZGVkU2NhbGUgPSBpbm5lckJvdW5kZWRTY2FsZShjdXJyZW50U2NhbGUpOworCisgICAg
UVJlY3RGIHZpZXdwb3J0UmVjdCA9IG1fdmlld3BvcnQtPmJvdW5kaW5nUmVjdCgpOworICAgIFFQ
b2ludEYgdmlld3BvcnRIb3RzcG90ID0gdmlld3BvcnRSZWN0LmNlbnRlcigpOworICAgIFFQb2lu
dEYgcG9zaXRpb24gPSBtX2NvbnRlbnQtPm1hcEZyb21JdGVtKG1fdmlld3BvcnQsIHZpZXdwb3J0
SG90c3BvdCkgLSB2aWV3cG9ydEhvdHNwb3QgLyBib3VuZGVkU2NhbGU7CisgICAgUVJlY3RGIHBv
c2l0aW9uQm91bmRhcmllcyA9IGNhbGN1bGF0ZUJvdW5kYXJpZXNGb3JTY2FsZShtX2NvbnRlbnQt
PmJvdW5kaW5nUmVjdCgpLnNpemUoKSwgdmlld3BvcnRSZWN0LnNpemUoKSwgYm91bmRlZFNjYWxl
KTsKKyAgICBRUG9pbnRGIG1pbk9mZnNldCA9IHBvc2l0aW9uQm91bmRhcmllcy50b3BMZWZ0KCk7
CisgICAgUVBvaW50RiBtYXhPZmZzZXQgPSBwb3NpdGlvbkJvdW5kYXJpZXMuYm90dG9tUmlnaHQo
KTsKKyAgICBRUG9pbnRGIGJvdW5kZWRQb3NpdGlvbjsKKyAgICBib3VuZGVkUG9zaXRpb24uc2V0
WChxQm91bmQobWluT2Zmc2V0LngoKSwgcG9zaXRpb24ueCgpLCBtYXhPZmZzZXQueCgpKSk7Cisg
ICAgYm91bmRlZFBvc2l0aW9uLnNldFkocUJvdW5kKG1pbk9mZnNldC55KCksIHBvc2l0aW9uLnko
KSwgbWF4T2Zmc2V0LnkoKSkpOworCisgICAgUVJlY3RGIHNjYWxlZFJlY3QoYm91bmRlZFBvc2l0
aW9uLCB2aWV3cG9ydFJlY3Quc2l6ZSgpIC8gYm91bmRlZFNjYWxlKTsKKyAgICBRUmVjdEYgY3Vy
cmVudFJlY3QgPSBtX3ZpZXdwb3J0LT5tYXBSZWN0VG9JdGVtKG1fY29udGVudCwgdmlld3BvcnRS
ZWN0KTsKKworICAgIGlmIChzY2FsZWRSZWN0ID09IGN1cnJlbnRSZWN0KQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAodXNlckhhc1NjYWxlZENvbnRlbnQpIHsKKyAgICAgICAgbV9zY2FsZUFu
aW1hdGlvbi0+c2V0RHVyYXRpb24oa1NjYWxlQW5pbWF0aW9uRHVyYXRpb25NaWxsaXMpOworICAg
ICAgICBtX3NjYWxlQW5pbWF0aW9uLT5zZXRFYXNpbmdDdXJ2ZShRRWFzaW5nQ3VydmU6Ok91dEN1
YmljKTsKKyAgICAgICAgbV9zY2FsZUFuaW1hdGlvbi0+c2V0U3RhcnRWYWx1ZShjdXJyZW50UmVj
dCk7CisgICAgICAgIG1fc2NhbGVBbmltYXRpb24tPnNldEVuZFZhbHVlKHNjYWxlZFJlY3QpOwor
ICAgICAgICBtX3NjYWxlQW5pbWF0aW9uLT5zdGFydCgpOworICAgIH0gZWxzZQorICAgICAgICB1
cGRhdGVWaXNpYmxlUmVjdChzY2FsZWRSZWN0KTsKK30KKwogdm9pZCBRdFZpZXdwb3J0SW50ZXJh
Y3Rpb25FbmdpbmU6OnJlc2V0KCkKIHsKICAgICBWaWV3cG9ydFVwZGF0ZUd1YXJkIGd1YXJkKHRo
aXMpOworCisgICAgc3RvcEFuaW1hdGlvbnMoKTsKKworICAgIFFTY3JvbGxlclByb3BlcnRpZXMg
cHJvcGVydGllcyA9IHNjcm9sbGVyKCktPnNjcm9sbGVyUHJvcGVydGllcygpOworCisgICAgLy8g
VGhlIFF0UGFuR2VzdHVyZVJlY29nbml6ZXIgaXMgcmVzcG9uc2libGUgZm9yIHJlY29nbml6aW5n
IHRoZSBnZXN0dXJlCisgICAgLy8gdGh1cyB3ZSBuZWVkIHRvIGRpc2FibGUgdGhlIGRyYWcgc3Rh
cnQgZGlzdGFuY2UuCisgICAgcHJvcGVydGllcy5zZXRTY3JvbGxNZXRyaWMoUVNjcm9sbGVyUHJv
cGVydGllczo6RHJhZ1N0YXJ0RGlzdGFuY2UsIDAuMCk7CisKKyAgICAvLyBTZXQgc29tZSBkZWZh
dWx0IFFTY3JvbGxlciBjb25zdHJhaW5zIHRvIG1pbWljIHRoZSBwaHlzaWNzIGVuZ2luZSBvZiB0
aGUgTjkgYnJvd3Nlci4KKyAgICBwcm9wZXJ0aWVzLnNldFNjcm9sbE1ldHJpYyhRU2Nyb2xsZXJQ
cm9wZXJ0aWVzOjpBeGlzTG9ja1RocmVzaG9sZCwgMC42Nik7CisgICAgcHJvcGVydGllcy5zZXRT
Y3JvbGxNZXRyaWMoUVNjcm9sbGVyUHJvcGVydGllczo6RGVjZWxlcmF0aW9uRmFjdG9yLCAwLjIw
KTsKKyAgICBwcm9wZXJ0aWVzLnNldFNjcm9sbE1ldHJpYyhRU2Nyb2xsZXJQcm9wZXJ0aWVzOjpN
YXhpbXVtVmVsb2NpdHksIDAuMik7CisgICAgcHJvcGVydGllcy5zZXRTY3JvbGxNZXRyaWMoUVNj
cm9sbGVyUHJvcGVydGllczo6T3ZlcnNob290RHJhZ1Jlc2lzdGFuY2VGYWN0b3IsIDAuMzMpOwor
ICAgIHByb3BlcnRpZXMuc2V0U2Nyb2xsTWV0cmljKFFTY3JvbGxlclByb3BlcnRpZXM6Ok92ZXJz
aG9vdFNjcm9sbERpc3RhbmNlRmFjdG9yLCAwLjMzKTsKKworICAgIHNjcm9sbGVyKCktPnNldFNj
cm9sbGVyUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKwogICAgIG1fdXNlckludGVyYWN0aW9uRmxh
Z3MgPSBVc2VySGFzTm90SW50ZXJhY3RlZFdpdGhDb250ZW50OwogICAgIHNldENvbnN0cmFpbnRz
KENvbnN0cmFpbnRzKCkpOwogfQpAQCAtMTEwLDYwICsyNzcsNDUgQEAgdm9pZCBRdFZpZXdwb3J0
SW50ZXJhY3Rpb25FbmdpbmU6OnNldENvbnN0cmFpbnRzKGNvbnN0IENvbnN0cmFpbnRzJiBjb25z
dHJhaW50cykKICAgICBpZiAobV9jb25zdHJhaW50cyA9PSBjb25zdHJhaW50cykKICAgICAgICAg
cmV0dXJuOwogCi0gICAgLy8gRklYTUU6IGlmIGEgcGluY2ggZ2VzdHVyZSBpcyBvbmdvaW5nLCB3
ZSBoYXZlIHRvOgotICAgIC8vIC1jYW5jZWwgdGhlIGdlc3R1cmUgaWYgaXNVc2VyU2NhbGFibGUg
YmVjb21lcyB0cnVlCi0gICAgLy8gLXVwZGF0ZSB0aGUgcGFnZSBvbiB0aGUgZmx5IHdpdGhvdXQg
bW9kaWZ5aW5nIGl0cyBwb3NpdGlvbgotCi0gICAgLy8gRklYTUU6IGlmIGEgcGFuIGdlc3R1cmUg
aXMgb25nb2luZywgd2UgaGF2ZSB0bwotICAgIC8vIC11cGRhdGUgdGhlIHBhZ2Ugd2l0aG91dCBj
aGFuZ2luZyB0aGUgcG9zaXRpb24KLSAgICAvLyAtYW5pbWF0ZSB0aGUgcGFnZSBiYWNrIGluIHZp
ZXdwb3J0IGlmIG5lY2Vzc2FyeSAoaWYgdGhlIHBhZ2UgaXMgZnVsbHkgaW4KLSAgICAvLyAgdmll
d3BvcnQsIGl0IGRvZXMgbm90IHBhbiBob3Jpem9udGFsbHkgYW55bW9yZSkuCisgICAgc3RvcEFu
aW1hdGlvbnMoKTsKIAogICAgIFZpZXdwb3J0VXBkYXRlR3VhcmQgZ3VhcmQodGhpcyk7CiAgICAg
bV9jb25zdHJhaW50cyA9IGNvbnN0cmFpbnRzOwotICAgIHVwZGF0ZUNvbnRlbnRJZk5lZWRlZCgp
OworICAgIGFuaW1hdGVDb250ZW50SW50b0JvdW5kYXJpZXNJZk5lZWRlZCgpOwogfQogCi12b2lk
IFF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6cGFuR2VzdHVyZVN0YXJ0ZWQoKQordm9pZCBR
dFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBhbkdlc3R1cmVTdGFydGVkKGNvbnN0IFFQb2lu
dEYmIHRvdWNoUG9pbnQsIHFpbnQ2NCBldmVudFRpbWVzdGFtcE1pbGxpcykKIHsKICAgICAvLyBG
SVhNRTogc3VzcGVuZCB0aGUgV2ViIGVuZ2luZSAoc3RvcCBhbmltYXRlZCBHSUYsIGV0YykuCi0g
ICAgLy8gRklYTUU6IGluaXRpYWxpemUgcGh5c2ljcyBmb3IgcGFubmluZyAoc3RvcCBhbmltYXRp
b24sIGV0YykuCiAgICAgbV91c2VySW50ZXJhY3Rpb25GbGFncyB8PSBVc2VySGFzTW92ZWRDb250
ZW50OworICAgIHNjcm9sbGVyKCktPmhhbmRsZUlucHV0KFFTY3JvbGxlcjo6SW5wdXRQcmVzcywg
bV92aWV3cG9ydC0+bWFwRnJvbUl0ZW0obV9jb250ZW50LCB0b3VjaFBvaW50KSwgZXZlbnRUaW1l
c3RhbXBNaWxsaXMpOwogfQogCi12b2lkIFF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6cGFu
R2VzdHVyZVJlcXVlc3RVcGRhdGUocXJlYWwgZGVsdGFYLCBxcmVhbCBkZWx0YVkpCit2b2lkIFF0
Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6cGFuR2VzdHVyZVJlcXVlc3RVcGRhdGUoY29uc3Qg
UVBvaW50RiYgdG91Y2hQb2ludCwgcWludDY0IGV2ZW50VGltZXN0YW1wTWlsbGlzKQogewogICAg
IFZpZXdwb3J0VXBkYXRlR3VhcmQgZ3VhcmQodGhpcyk7Ci0KLSAgICBRUG9pbnRGIGl0ZW1Qb3Np
dGlvbkluSXRlbUNvb3JkcyA9IG1fY29udGVudC0+bWFwRnJvbUl0ZW0obV9jb250ZW50LT5wYXJl
bnRJdGVtKCksIG1fY29udGVudC0+cG9zKCkpOwotICAgIFFQb2ludEYgZGVzdEluVmlld3BvcnRD
b29yZHMgPSBtX3ZpZXdwb3J0LT5tYXBGcm9tSXRlbShtX2NvbnRlbnQsIGl0ZW1Qb3NpdGlvbklu
SXRlbUNvb3JkcyArIFFQb2ludEYoZGVsdGFYLCBkZWx0YVkpKTsKLQotICAgIG1fY29udGVudC0+
c2V0UG9zKGRlc3RJblZpZXdwb3J0Q29vcmRzKTsKLSAgICAvLyBUaGlzIG11c3QgYmUgZW1pdHRl
ZCBiZWZvcmUgdmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQgc28gdGhhdCB0aGUgd2ViIHByb2Nlc3Mg
a25vd3Mgd2hlcmUgdG8gbG9vayBmb3IgdGlsZXMuCi0gICAgZW1pdCB2aWV3cG9ydFRyYWplY3Rv
cnlWZWN0b3JDaGFuZ2VkKFFQb2ludEYoLWRlbHRhWCwgLWRlbHRhWSkpOworICAgIHNjcm9sbGVy
KCktPmhhbmRsZUlucHV0KFFTY3JvbGxlcjo6SW5wdXRNb3ZlLCBtX3ZpZXdwb3J0LT5tYXBGcm9t
SXRlbShtX2NvbnRlbnQsIHRvdWNoUG9pbnQpLCBldmVudFRpbWVzdGFtcE1pbGxpcyk7CiB9CiAK
IHZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpwYW5HZXN0dXJlQ2FuY2VsbGVkKCkK
IHsKICAgICBWaWV3cG9ydFVwZGF0ZUd1YXJkIGd1YXJkKHRoaXMpOwotICAgIC8vIEZJWE1FOiBy
ZXNldCBwaHlzaWNzLgotICAgIHBhbkdlc3R1cmVFbmRlZCgpOworICAgIHN0b3BBbmltYXRpb25z
KCk7CiB9CiAKLXZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpwYW5HZXN0dXJlRW5k
ZWQoKQordm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBhbkdlc3R1cmVFbmRlZChj
b25zdCBRUG9pbnRGJiB0b3VjaFBvaW50LCBxaW50NjQgZXZlbnRUaW1lc3RhbXBNaWxsaXMpCiB7
CiAgICAgVmlld3BvcnRVcGRhdGVHdWFyZCBndWFyZCh0aGlzKTsKLSAgICBhbmltYXRlQ29udGVu
dEludG9Cb3VuZGFyaWVzSWZOZWVkZWQoKTsKLSAgICAvLyBGSVhNRTogZW1pdCB2aWV3cG9ydFRy
YWplY3RvcnlWZWN0b3JDaGFuZ2VkKFFQb2ludEYoKSkgd2hlbiB0aGUgcGFuIHRocm93IGFuaW1h
dGlvbiBlbmRzIGFuZCB0aGUgcGFnZSBzdG9wcyBtb3ZpbmcuCisgICAgc2Nyb2xsZXIoKS0+aGFu
ZGxlSW5wdXQoUVNjcm9sbGVyOjpJbnB1dFJlbGVhc2UsIG1fdmlld3BvcnQtPm1hcEZyb21JdGVt
KG1fY29udGVudCwgdG91Y2hQb2ludCksIGV2ZW50VGltZXN0YW1wTWlsbGlzKTsKIH0KIAotdm9p
ZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2VzdHVyZVN0YXJ0ZWQoKQordm9p
ZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2VzdHVyZVN0YXJ0ZWQoY29uc3Qg
UVBvaW50RiYgcGluY2hDZW50ZXJJbkNvbnRlbnRDb29yZGluYXRlKQogewogICAgIGlmICghbV9j
b25zdHJhaW50cy5pc1VzZXJTY2FsYWJsZSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgbV9waW5j
aFZpZXdwb3J0VXBkYXRlRGVmZXJyZXIgPSBhZG9wdFB0cihuZXcgVmlld3BvcnRVcGRhdGVHdWFy
ZCh0aGlzKSk7Ci0KKyAgICBtX2xhc3RQaW5jaENlbnRlckluVmlld3BvcnRDb29yZGluYXRlcyA9
IG1fdmlld3BvcnQtPm1hcEZyb21JdGVtKG1fY29udGVudCwgcGluY2hDZW50ZXJJbkNvbnRlbnRD
b29yZGluYXRlKTsKICAgICBtX3VzZXJJbnRlcmFjdGlvbkZsYWdzIHw9IFVzZXJIYXNTY2FsZWRD
b250ZW50OwogICAgIG1fdXNlckludGVyYWN0aW9uRmxhZ3MgfD0gVXNlckhhc01vdmVkQ29udGVu
dDsKICAgICBtX3BpbmNoU3RhcnRTY2FsZSA9IG1fY29udGVudC0+c2NhbGUoKTsKQEAgLTE4MCwx
MiArMzMyLDE5IEBAIHZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lOjpwaW5jaEdlc3R1
cmVSZXF1ZXN0VXBkYXRlKGNvbnN0IFFQb2ludEYmIHBpbmNoCiAgICAgVmlld3BvcnRVcGRhdGVH
dWFyZCBndWFyZCh0aGlzKTsKIAogICAgIC8vICBDaGFuZ2VzIG9mIHRoZSBjZW50ZXIgcG9zaXRp
b24gc2hvdWxkIG1vdmUgdGhlIHBhZ2UgZXZlbiBpZiB0aGUgem9vbSBmYWN0b3IKLSAgICAvLyAg
ZG9lcyBub3QgY2hhbmdlLiBCb3RoIHRoZSB6b29tIGFuZCB0aGUgcGFubmluZyBzaG91bGQgYmUg
aGFuZGxlZCB0aHJvdWdoIHRoZSBwaHlzaWNzIGVuZ2luZS4KKyAgICAvLyAgZG9lcyBub3QgY2hh
bmdlLgogICAgIGNvbnN0IHFyZWFsIHNjYWxlID0gbV9waW5jaFN0YXJ0U2NhbGUgKiB0b3RhbFNj
YWxlRmFjdG9yOwotICAgIFFQb2ludEYgb2xkUGluY2hDZW50ZXJPblBhcmVudCA9IG1fY29udGVu
dC0+bWFwVG9JdGVtKG1fY29udGVudC0+cGFyZW50SXRlbSgpLCBwaW5jaENlbnRlckluQ29udGVu
dENvb3JkaW5hdGUpOwotICAgIG1fY29udGVudC0+c2V0U2NhbGUoc2NhbGUpOwotICAgIFFQb2lu
dEYgbmV3UGluY2hDZW50ZXJPblBhcmVudCA9IG1fY29udGVudC0+bWFwVG9JdGVtKG1fY29udGVu
dC0+cGFyZW50SXRlbSgpLCBwaW5jaENlbnRlckluQ29udGVudENvb3JkaW5hdGUpOwotICAgIG1f
Y29udGVudC0+c2V0UG9zKG1fY29udGVudC0+cG9zKCkgLSAobmV3UGluY2hDZW50ZXJPblBhcmVu
dCAtIG9sZFBpbmNoQ2VudGVyT25QYXJlbnQpKTsKKworICAgIC8vIEFsbG93IHpvb21pbmcgb3V0
IGJleW9uZCBtaW1pbXVtIHNjYWxlIG9uIHBhZ2VzIHRoYXQgZG8gbm90IGV4cGxpY2l0bHkgZGlz
YWxsb3cgaXQuCisgICAgY29uc3QgcXJlYWwgYm91bmRlZFNjYWxlID0gb3V0ZXJCb3VuZGVkU2Nh
bGUoc2NhbGUpOworCisgICAgUVBvaW50RiBwaW5jaENlbnRlckluVmlld3BvcnRDb29yZGluYXRl
cyA9IG1fdmlld3BvcnQtPm1hcEZyb21JdGVtKG1fY29udGVudCwgcGluY2hDZW50ZXJJbkNvbnRl
bnRDb29yZGluYXRlKTsKKworICAgIHNjYWxlQ29udGVudChwaW5jaENlbnRlckluQ29udGVudENv
b3JkaW5hdGUsIGJvdW5kZWRTY2FsZSk7CisKKyAgICBjb25zdCBRUG9pbnRGIHBvc2l0aW9uRGlm
ZiA9IHBpbmNoQ2VudGVySW5WaWV3cG9ydENvb3JkaW5hdGVzIC0gbV9sYXN0UGluY2hDZW50ZXJJ
blZpZXdwb3J0Q29vcmRpbmF0ZXM7CisgICAgbV9sYXN0UGluY2hDZW50ZXJJblZpZXdwb3J0Q29v
cmRpbmF0ZXMgPSBwaW5jaENlbnRlckluVmlld3BvcnRDb29yZGluYXRlczsKKyAgICBtX2NvbnRl
bnQtPnNldFBvcyhtX2NvbnRlbnQtPnBvcygpICsgcG9zaXRpb25EaWZmKTsKIH0KIAogdm9pZCBR
dFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnBpbmNoR2VzdHVyZUVuZGVkKCkKQEAgLTE5Mywx
MDMgKzM1MiwxOSBAQCB2b2lkIFF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6cGluY2hHZXN0
dXJlRW5kZWQoKQogICAgIGlmICghbV9jb25zdHJhaW50cy5pc1VzZXJTY2FsYWJsZSkKICAgICAg
ICAgcmV0dXJuOwogCi0gICAgewotICAgICAgICBWaWV3cG9ydFVwZGF0ZUd1YXJkIGd1YXJkKHRo
aXMpOwotICAgICAgICAvLyBGSVhNRTogcmVzdW1lIHRoZSBlbmdpbmUgYWZ0ZXIgdGhlIGFuaW1h
dGlvbi4KLSAgICAgICAgYW5pbWF0ZUNvbnRlbnRJbnRvQm91bmRhcmllc0lmTmVlZGVkKCk7Ci0g
ICAgfQogICAgIG1fcGluY2hWaWV3cG9ydFVwZGF0ZURlZmVycmVyLmNsZWFyKCk7CisgICAgLy8g
RklYTUU6IHJlc3VtZSB0aGUgZW5naW5lIGFmdGVyIHRoZSBhbmltYXRpb24uCisgICAgYW5pbWF0
ZUNvbnRlbnRJbnRvQm91bmRhcmllc0lmTmVlZGVkKCk7CiB9CiAKIHZvaWQgUXRWaWV3cG9ydElu
dGVyYWN0aW9uRW5naW5lOjpjb250ZW50Vmlld3BvcnRDaGFuZ2VkKCkKIHsKLSAgICBpZiAobV9p
c1VwZGF0aW5nQ29udGVudCkKKyAgICBpZiAobV9wZW5kaW5nVXBkYXRlcykKICAgICAgICAgcmV0
dXJuOwogCiAgICAgVmlld3BvcnRVcGRhdGVHdWFyZCBndWFyZCh0aGlzKTsKLSAgICB1cGRhdGVD
b250ZW50SWZOZWVkZWQoKTsKLQotICAgIC8vIFdlIG11c3Qgbm90aWZ5IHRoZSBjaGFuZ2Ugc28g
dGhlIGNsaWVudCBjYW4gcmVseSBvbiB1cyBmb3IgYWxsIGNoYW5nZSBvZiBHZW9tZXRyeS4KLSAg
ICBlbWl0IHZpZXdwb3J0VXBkYXRlUmVxdWVzdGVkKCk7Ci19Ci0KLXZvaWQgUXRWaWV3cG9ydElu
dGVyYWN0aW9uRW5naW5lOjp1cGRhdGVDb250ZW50SWZOZWVkZWQoKQotewotICAgIHVwZGF0ZUNv
bnRlbnRTY2FsZUlmTmVlZGVkKCk7Ci0gICAgdXBkYXRlQ29udGVudFBvc2l0aW9uSWZOZWVkZWQo
KTsKLX0KIAotdm9pZCBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmU6OnVwZGF0ZUNvbnRlbnRT
Y2FsZUlmTmVlZGVkKCkKLXsKLSAgICBjb25zdCBxcmVhbCBjdXJyZW50Q29udGVudFNjYWxlID0g
bV9jb250ZW50LT5zY2FsZSgpOwotICAgIHFyZWFsIGNvbnRlbnRTY2FsZSA9IG1fY29udGVudC0+
c2NhbGUoKTsKLSAgICBpZiAoIShtX3VzZXJJbnRlcmFjdGlvbkZsYWdzICYgVXNlckhhc1NjYWxl
ZENvbnRlbnQpKQotICAgICAgICBjb250ZW50U2NhbGUgPSBtX2NvbnN0cmFpbnRzLmluaXRpYWxT
Y2FsZTsKLQotICAgIGNvbnRlbnRTY2FsZSA9IHFCb3VuZChtX2NvbnN0cmFpbnRzLm1pbmltdW1T
Y2FsZSwgY29udGVudFNjYWxlLCBtX2NvbnN0cmFpbnRzLm1heGltdW1TY2FsZSk7Ci0KLSAgICBp
ZiAoY29udGVudFNjYWxlICE9IGN1cnJlbnRDb250ZW50U2NhbGUpIHsKLSAgICAgICAgY29uc3Qg
UVBvaW50RiBjZW50ZXJPZkludGVyZXN0ID0gdmlzaWJsZVJlY3RJbkNvbnRlbnRDb29yZGluYXRl
KG1fY29udGVudCwgbV92aWV3cG9ydCkuY2VudGVyKCk7Ci0gICAgICAgIHNjYWxlQ29udGVudChj
ZW50ZXJPZkludGVyZXN0LCBjb250ZW50U2NhbGUpOwotICAgIH0KLX0KLQotdm9pZCBRdFZpZXdw
b3J0SW50ZXJhY3Rpb25FbmdpbmU6OnVwZGF0ZUNvbnRlbnRQb3NpdGlvbklmTmVlZGVkKCkKLXsK
LSAgICBpZiAoIShtX3VzZXJJbnRlcmFjdGlvbkZsYWdzICYgVXNlckhhc01vdmVkQ29udGVudCkp
IHsKLSAgICAgICAgbV9jb250ZW50LT5zZXRYKChtX3ZpZXdwb3J0LT53aWR0aCgpIC0gY29udGVu
dFJlY3RJblZpZXdwb3J0Q29vcmRpbmF0ZShtX2NvbnRlbnQsIG1fdmlld3BvcnQpLndpZHRoKCkp
IC8gMik7Ci0gICAgICAgIG1fY29udGVudC0+c2V0WSgwKTsKLSAgICB9Ci0KLSAgICAvLyBGSVhN
RTogaWYgdGhlIGl0ZW0gY2FuIGJlIGZ1bGx5IGluIHRoZSB2aWV3cG9ydCBhbmQgaXMgb3ZlciBh
IHNpZGUsIHB1c2ggaXQgYmFjayBpbiB2aWV3Ci0gICAgLy8gRklYTUU6IGlmIHRoZSBpdGVtIGNh
bm5vdCBiZSBmdWxseSBpbiB2aWV3cG9ydCwgYW5kIGlzIG5vdCBjb3ZlcmluZyB0aGUgdmlld3Bv
cnQsIHB1c2ggaXQgYmFjayBpbiB2aWV3Ci19Ci0KLXZvaWQgUXRWaWV3cG9ydEludGVyYWN0aW9u
RW5naW5lOjphbmltYXRlQ29udGVudEludG9Cb3VuZGFyaWVzSWZOZWVkZWQoKQotewotICAgIGFu
aW1hdGVDb250ZW50U2NhbGVJbnRvQm91bmRhcmllc0lmTmVlZGVkKCk7Ci0gICAgYW5pbWF0ZUNv
bnRlbnRQb3NpdGlvbkludG9Cb3VuZGFyaWVzSWZOZWVkZWQoKTsKLX0KLQotdm9pZCBRdFZpZXdw
b3J0SW50ZXJhY3Rpb25FbmdpbmU6OmFuaW1hdGVDb250ZW50UG9zaXRpb25JbnRvQm91bmRhcmll
c0lmTmVlZGVkKCkKLXsKLSAgICBjb25zdCBRUmVjdEYgY29udGVudEdlb21ldHJ5ID0gbV92aWV3
cG9ydC0+bWFwUmVjdEZyb21JdGVtKG1fY29udGVudCwgbV9jb250ZW50LT5ib3VuZGluZ1JlY3Qo
KSk7Ci0gICAgUVBvaW50RiBuZXdQb3MgPSBjb250ZW50R2VvbWV0cnkudG9wTGVmdCgpOwotCi0g
ICAgLy8gSG9yaXpvbnRhbCBjb3JyZWN0aW9uLgotICAgIGlmIChjb250ZW50R2VvbWV0cnkud2lk
dGgoKSA8IG1fdmlld3BvcnQtPndpZHRoKCkpCi0gICAgICAgIG5ld1Bvcy5zZXRYKChtX3ZpZXdw
b3J0LT53aWR0aCgpIC0gY29udGVudEdlb21ldHJ5LndpZHRoKCkpIC8gMik7Ci0gICAgZWxzZSB7
Ci0gICAgICAgIG5ld1Bvcy5zZXRYKHFNaW48cXJlYWw+KDAuLCBuZXdQb3MueCgpKSk7Ci0gICAg
ICAgIGNvbnN0IHFyZWFsIHJpZ2h0U2lkZUdhcCA9IG1fdmlld3BvcnQtPmJvdW5kaW5nUmVjdCgp
LnJpZ2h0KCkgLSBjb250ZW50R2VvbWV0cnkucmlnaHQoKTsKLSAgICAgICAgaWYgKHJpZ2h0U2lk
ZUdhcCA+IDAuKQotICAgICAgICAgICAgbmV3UG9zLnNldFgobmV3UG9zLngoKSArIHJpZ2h0U2lk
ZUdhcCk7Ci0gICAgfQotCi0gICAgLy8gVmVydGljYWwgY29ycmVjdGlvbi4KLSAgICBpZiAoY29u
dGVudEdlb21ldHJ5LmhlaWdodCgpIDwgbV92aWV3cG9ydC0+aGVpZ2h0KCkpCi0gICAgICAgIG5l
d1Bvcy5zZXRZKDApOwotICAgIGVsc2UgewotICAgICAgICBuZXdQb3Muc2V0WShxTWluPHFyZWFs
PigwLiwgbmV3UG9zLnkoKSkpOwotICAgICAgICBjb25zdCBxcmVhbCBib3R0b21TaWRlR2FwID0g
bV92aWV3cG9ydC0+Ym91bmRpbmdSZWN0KCkuYm90dG9tKCkgLSBjb250ZW50R2VvbWV0cnkuYm90
dG9tKCk7Ci0gICAgICAgIGlmIChib3R0b21TaWRlR2FwID4gMC4pCi0gICAgICAgICAgICBuZXdQ
b3Muc2V0WShuZXdQb3MueSgpICsgYm90dG9tU2lkZUdhcCk7Ci0gICAgfQotCi0gICAgaWYgKG5l
d1BvcyAhPSBtX2NvbnRlbnQtPnBvcygpKQotICAgICAgICAvLyBGSVhNRTogRG8geW91IGtub3cg
d2hhdCBBTklNQVRFIG1lYW5zPwotICAgICAgICBtX2NvbnRlbnQtPnNldFBvcyhuZXdQb3MpOwot
fQotCi12b2lkIFF0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZTo6YW5pbWF0ZUNvbnRlbnRTY2Fs
ZUludG9Cb3VuZGFyaWVzSWZOZWVkZWQoKQotewotICAgIGNvbnN0IHFyZWFsIGN1cnJlbnRTY2Fs
ZSA9IG1fY29udGVudC0+c2NhbGUoKTsKLSAgICBjb25zdCBxcmVhbCBib3VuZGVkU2NhbGUgPSBx
Qm91bmQobV9jb25zdHJhaW50cy5taW5pbXVtU2NhbGUsIGN1cnJlbnRTY2FsZSwgbV9jb25zdHJh
aW50cy5tYXhpbXVtU2NhbGUpOwotICAgIGlmIChjdXJyZW50U2NhbGUgIT0gYm91bmRlZFNjYWxl
KSB7Ci0gICAgICAgIC8vIEZJWE1FOiBEbyB5b3Uga25vdyB3aGF0IEFOSU1BVEUgbWVhbnM/Ci0g
ICAgICAgIGNvbnN0IFFQb2ludEYgY2VudGVyT2ZJbnRlcmVzdCA9IHZpc2libGVSZWN0SW5Db250
ZW50Q29vcmRpbmF0ZShtX2NvbnRlbnQsIG1fdmlld3BvcnQpLmNlbnRlcigpOwotICAgICAgICBz
Y2FsZUNvbnRlbnQoY2VudGVyT2ZJbnRlcmVzdCwgYm91bmRlZFNjYWxlKTsKLSAgICB9CisgICAg
YW5pbWF0ZUNvbnRlbnRJbnRvQm91bmRhcmllc0lmTmVlZGVkKCk7CiB9CiAKIHZvaWQgUXRWaWV3
cG9ydEludGVyYWN0aW9uRW5naW5lOjpzY2FsZUNvbnRlbnQoY29uc3QgUVBvaW50RiYgY2VudGVy
SW5Db250ZW50Q29vcmRpbmF0ZSwgcXJlYWwgc2NhbGUpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvcXQvUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmggYi9Tb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvcXQvUXRWaWV3cG9ydEludGVyYWN0aW9uRW5naW5lLmgKaW5kZXgg
OTIwMjkzMi4uOTA2NDI2ZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL3F0
L1F0Vmlld3BvcnRJbnRlcmFjdGlvbkVuZ2luZS5oCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9xdC9RdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmUuaApAQCAtMSw0ICsxLDUgQEAKIC8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJz
aWRpYXJ5KC1pZXMpCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQmVuamFtaW4gUG91bGFpbiA8YmVu
amFtaW5Ad2Via2l0Lm9yZz4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yMiw4ICsyMywxMSBAQAogI2RlZmlu
ZSBRdFZpZXdwb3J0SW50ZXJhY3Rpb25FbmdpbmVfaAogCiAjaW5jbHVkZSAiT3duUHRyLmgiCisj
aW5jbHVkZSA8UVNjcm9sbGVyPgogI2luY2x1ZGUgInF3ZWJraXRnbG9iYWwuaCIKICNpbmNsdWRl
IDxRdENvcmUvUU9iamVjdD4KKyNpbmNsdWRlIDxRdENvcmUvUVZhcmlhbnQ+CisjaW5jbHVkZSA8
UXRDb3JlL1FWYXJpYW50QW5pbWF0aW9uPgogCiBRVF9CRUdJTl9OQU1FU1BBQ0UKIGNsYXNzIFFQ
b2ludEY7CkBAIC00MSw2ICs0NSw3IEBAIHB1YmxpYzoKICAgICBRdFZpZXdwb3J0SW50ZXJhY3Rp
b25FbmdpbmUoY29uc3QgUVNHSXRlbSosIFFTR0l0ZW0qKTsKICAgICB+UXRWaWV3cG9ydEludGVy
YWN0aW9uRW5naW5lKCk7CiAKKwogICAgIHN0cnVjdCBDb25zdHJhaW50cyB7CiAgICAgICAgIENv
bnN0cmFpbnRzKCkKICAgICAgICAgICAgIDogaW5pdGlhbFNjYWxlKDEuMCkKQEAgLTU1LDE3ICs2
MCwyMCBAQCBwdWJsaWM6CiAgICAgICAgIGJvb2wgaXNVc2VyU2NhbGFibGU7CiAgICAgfTsKIAor
ICAgIGJvb2wgZXZlbnQoUUV2ZW50Kik7CisKICAgICB2b2lkIHJlc2V0KCk7CiAgICAgdm9pZCBz
ZXRDb25zdHJhaW50cyhjb25zdCBDb25zdHJhaW50cyYpOwogCi0gICAgdm9pZCBwYW5HZXN0dXJl
U3RhcnRlZCgpOwotICAgIHZvaWQgcGFuR2VzdHVyZVJlcXVlc3RVcGRhdGUocXJlYWwgZGVsdGFY
LCBxcmVhbCBkZWx0YVkpOworICAgIHZvaWQgcGFuR2VzdHVyZVN0YXJ0ZWQoY29uc3QgUVBvaW50
RiYgdG91Y2hQb2ludCwgcWludDY0IGV2ZW50VGltZXN0YW1wTWlsbGlzKTsKKyAgICB2b2lkIHBh
bkdlc3R1cmVSZXF1ZXN0VXBkYXRlKGNvbnN0IFFQb2ludEYmIHRvdWNoUG9pbnQsIHFpbnQ2NCBl
dmVudFRpbWVzdGFtcE1pbGxpcyk7CiAgICAgdm9pZCBwYW5HZXN0dXJlQ2FuY2VsbGVkKCk7Ci0g
ICAgdm9pZCBwYW5HZXN0dXJlRW5kZWQoKTsKKyAgICB2b2lkIHBhbkdlc3R1cmVFbmRlZChjb25z
dCBRUG9pbnRGJiB0b3VjaFBvaW50LCBxaW50NjQgZXZlbnRUaW1lc3RhbXBNaWxsaXMpOwogCi0g
ICAgdm9pZCBwaW5jaEdlc3R1cmVTdGFydGVkKCk7CisgICAgdm9pZCBwaW5jaEdlc3R1cmVTdGFy
dGVkKGNvbnN0IFFQb2ludEYmIHBpbmNoQ2VudGVySW5Db250ZW50Q29vcmRpbmF0ZSk7CiAgICAg
dm9pZCBwaW5jaEdlc3R1cmVSZXF1ZXN0VXBkYXRlKGNvbnN0IFFQb2ludEYmIHBpbmNoQ2VudGVy
SW5Db250ZW50Q29vcmRpbmF0ZSwgcXJlYWwgdG90YWxTY2FsZUZhY3Rvcik7CiAgICAgdm9pZCBw
aW5jaEdlc3R1cmVFbmRlZCgpOworICAgIHZvaWQgc3RvcEFuaW1hdGlvbnMoKTsKIAogUV9TSUdO
QUxTOgogICAgIHZvaWQgdmlld3BvcnRVcGRhdGVSZXF1ZXN0ZWQoKTsKQEAgLTc0LDI1ICs4Miwy
NyBAQCBRX1NJR05BTFM6CiBwcml2YXRlIFFfU0xPVFM6CiAgICAgLy8gUmVzcG9uZCB0byBjaGFu
Z2VzIG9mIGNvbnRlbnQgdGhhdCBhcmUgbm90IGRyaXZlbiBieSB1cywgbGlrZSB0aGUgcGFnZSBy
ZXNpemluZyBpdHNlbGYuCiAgICAgdm9pZCBjb250ZW50Vmlld3BvcnRDaGFuZ2VkKCk7CisgICAg
dm9pZCB1cGRhdGVWaXNpYmxlUmVjdChRVmFyaWFudCB2aXNpYmxlUmVjdFZhcmlhbnQpOworICAg
IHZvaWQgc2NhbGVBbmltYXRpb25TdGF0ZUNoYW5nZWQoUUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0
ZSwgUUFic3RyYWN0QW5pbWF0aW9uOjpTdGF0ZSk7CiAKIHByaXZhdGU6Ci0gICAgdm9pZCB1cGRh
dGVDb250ZW50SWZOZWVkZWQoKTsKLSAgICB2b2lkIHVwZGF0ZUNvbnRlbnRTY2FsZUlmTmVlZGVk
KCk7Ci0gICAgdm9pZCB1cGRhdGVDb250ZW50UG9zaXRpb25JZk5lZWRlZCgpOwotCisgICAgcXJl
YWwgaW5uZXJCb3VuZGVkU2NhbGUocXJlYWwgc2NhbGUpOworICAgIHFyZWFsIG91dGVyQm91bmRl
ZFNjYWxlKHFyZWFsIHNjYWxlKTsKKyAgICBjb25zdCBRUmVjdEYgY2FsY3VsYXRlQm91bmRhcmll
c0ZvclNjYWxlKGNvbnN0IFFTaXplRiBjb250ZW50U2l6ZSwgY29uc3QgUVNpemVGIHZpZXdwb3J0
U2l6ZSwgcXJlYWwgc2NhbGUpOwogICAgIHZvaWQgYW5pbWF0ZUNvbnRlbnRJbnRvQm91bmRhcmll
c0lmTmVlZGVkKCk7Ci0gICAgdm9pZCBhbmltYXRlQ29udGVudFBvc2l0aW9uSW50b0JvdW5kYXJp
ZXNJZk5lZWRlZCgpOwotICAgIHZvaWQgYW5pbWF0ZUNvbnRlbnRTY2FsZUludG9Cb3VuZGFyaWVz
SWZOZWVkZWQoKTsKIAogICAgIHZvaWQgc2NhbGVDb250ZW50KGNvbnN0IFFQb2ludEYmIGNlbnRl
ckluQ29udGVudENvb3JkaW5hdGUsIHFyZWFsIHNjYWxlKTsKIAorICAgIC8vIEFzIGxvbmcgYXMg
dGhlIG9iamVjdCBleGlzdHMgdGhpcyBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIHNh
bWUgUVNjcm9sbGVyIGluc3RhbmNlLgorICAgIFFTY3JvbGxlciogc2Nyb2xsZXIoKSB7IHJldHVy
biBRU2Nyb2xsZXI6OnNjcm9sbGVyKHRoaXMpOyB9CisKICAgICBmcmllbmQgY2xhc3MgVmlld3Bv
cnRVcGRhdGVHdWFyZDsKIAogICAgIGNvbnN0IFFTR0l0ZW0qIGNvbnN0IG1fdmlld3BvcnQ7CiAg
ICAgUVNHSXRlbSogY29uc3QgbV9jb250ZW50OwogCiAgICAgQ29uc3RyYWludHMgbV9jb25zdHJh
aW50czsKLSAgICBib29sIG1faXNVcGRhdGluZ0NvbnRlbnQ7CisgICAgaW50IG1fcGVuZGluZ1Vw
ZGF0ZXM7CiAgICAgT3duUHRyPFZpZXdwb3J0VXBkYXRlR3VhcmQ+IG1fcGluY2hWaWV3cG9ydFVw
ZGF0ZURlZmVycmVyOwogICAgIGVudW0gVXNlckludGVyYWN0aW9uRmxhZyB7CiAgICAgICAgIFVz
ZXJIYXNOb3RJbnRlcmFjdGVkV2l0aENvbnRlbnQgPSAwLApAQCAtMTAyLDYgKzExMiwxNyBAQCBw
cml2YXRlOgogICAgIFFfREVDTEFSRV9GTEFHUyhVc2VySW50ZXJhY3Rpb25GbGFncywgVXNlcklu
dGVyYWN0aW9uRmxhZyk7CiAgICAgVXNlckludGVyYWN0aW9uRmxhZ3MgbV91c2VySW50ZXJhY3Rp
b25GbGFnczsKIAorICAgIGNsYXNzIFNjYWxlQW5pbWF0aW9uIDogcHVibGljIFFWYXJpYW50QW5p
bWF0aW9uIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFNjYWxlQW5pbWF0aW9uKFFPYmplY3QqIHBh
cmVudCA9IDApCisgICAgICAgICAgICA6IFFWYXJpYW50QW5pbWF0aW9uKHBhcmVudCkKKyAgICAg
ICAgeyB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZUN1cnJlbnRWYWx1ZShjb25zdCBR
VmFyaWFudCYpIHsgfQorICAgIH07CisKKyAgICBTY2FsZUFuaW1hdGlvbiogbV9zY2FsZUFuaW1h
dGlvbjsKKyAgICBRUG9pbnRGIG1fbGFzdFBpbmNoQ2VudGVySW5WaWV3cG9ydENvb3JkaW5hdGVz
OwogICAgIHFyZWFsIG1fcGluY2hTdGFydFNjYWxlOwogfTsKIAotLSAKMS43LjcKCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>