<?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>118383</bug_id>
          
          <creation_ts>2013-07-04 01:32:50 -0700</creation_ts>
          <short_desc>Add initial implementation of ThreadSafeCoordinatedSurface, ThreadedCompositor, and ViewportController</short_desc>
          <delta_ts>2014-12-15 02:39:15 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>117227</blocked>
    
    <blocked>118265</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Gwang Yoon Hwang">yoon</reporter>
          <assigned_to name="Gwang Yoon Hwang">yoon</assigned_to>
          <cc>calvaris</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
    
    <cc>jaepark</cc>
    
    <cc>luiz</cc>
    
    <cc>mrobinson</cc>
    
    <cc>noam</cc>
    
    <cc>sergio</cc>
    
    <cc>svillar</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>906088</commentid>
    <comment_count>0</comment_count>
    <who name="Gwang Yoon Hwang">yoon</who>
    <bug_when>2013-07-04 01:32:50 -0700</bug_when>
    <thetext>Threaded Compositor is a variant of Coordinated Graphics implementation.
    Basic structure of the implementaion is simliar, thus, Threaded
    Compositor reuses lots of classes from Coordinated Graphics. However,
    instead of compositing on UI Process, Threaded Compositor performs
    compositing on a separate thread of Web Process.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>906141</commentid>
    <comment_count>1</comment_count>
      <attachid>206077</attachid>
    <who name="Gwang Yoon Hwang">yoon</who>
    <bug_when>2013-07-04 05:02:16 -0700</bug_when>
    <thetext>Created attachment 206077
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>909557</commentid>
    <comment_count>2</comment_count>
      <attachid>206077</attachid>
    <who name="Noam Rosenthal">noam</who>
    <bug_when>2013-07-17 19:15:20 -0700</bug_when>
    <thetext>Comment on attachment 206077
Patch

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

&gt; Source/WebCore/ChangeLog:29
&gt; +        PageViewportController
&gt; +        This class is responsible to handling requests from WebCore (eg. content
&gt; +        size changes, viewport attributes changes and scroll position requests).

This is a huge change.
I would start by dealing with the compositor itself rather than having a copy of PVC in WebCore.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1053379</commentid>
    <comment_count>3</comment_count>
      <attachid>242811</attachid>
    <who name="Gwang Yoon Hwang">yoon</who>
    <bug_when>2014-12-08 08:11:14 -0800</bug_when>
    <thetext>Created attachment 242811
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1053385</commentid>
    <comment_count>4</comment_count>
      <attachid>242811</attachid>
    <who name="Anders Carlsson">andersca</who>
    <bug_when>2014-12-08 08:38:02 -0800</bug_when>
    <thetext>Comment on attachment 242811
Patch

Why is this something you want to do? On both OS X and iOS, the trend is going towards doing UI side compositing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1053416</commentid>
    <comment_count>5</comment_count>
    <who name="Gwang Yoon Hwang">yoon</who>
    <bug_when>2014-12-08 09:58:48 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; Comment on attachment 242811 [details]
&gt; Patch
&gt; 
&gt; Why is this something you want to do? On both OS X and iOS, the trend is
&gt; going towards doing UI side compositing.

There are 2 main reasons.

1. Mobile GPUs are quite unstable
 Unlike Apple&apos;s hardware, GPU drivers for embedded linux can be easily crashed unexpectedly. So we want to keep UI Process safely from OpenGL, we can recover Web Process from UI Process when we meet unexpected crashes from GPU drivers.

2. We need compositing thread even we decided to composite contents in the UI Process.
 For the responsive, we should avoid calling OpenGL calls in the main-thread of UI Process. We can provide additional thread in the UI Process side for compositing even we finally decide to composite in the UI Process using this implementation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1053731</commentid>
    <comment_count>6</comment_count>
      <attachid>242811</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2014-12-09 03:20:36 -0800</bug_when>
    <thetext>Comment on attachment 242811
Patch

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

Looks good, couple small issues.

&gt; Source/WebKit2/ChangeLog:4
&gt; +        [ThreadedCompositor] Implements an initial version of the Threaded Compositor.
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=118383

I updated the bug title to be more descriptive, so the patch should be updated as well.

&gt; Source/WebKit2/ChangeLog:50
&gt; +        (WebKit::CompositingRunLoop::CompositingRunLoop):
&gt; +        (WebKit::CompositingRunLoop::callOnCompositingRunLoop):
&gt; +        (WebKit::CompositingRunLoop::setUpdateTimer):
&gt; +        (WebKit::CompositingRunLoop::stopUpdateTimer):
&gt; +        (WebKit::CompositingRunLoop::runLoop):
&gt; +        (WebKit::CompositingRunLoop::updateTimerFired):
&gt; +        (WebKit::ThreadedCompositor::create):
&gt; +        (WebKit::ThreadedCompositor::ThreadedCompositor):
&gt; +        (WebKit::ThreadedCompositor::~ThreadedCompositor):
&gt; +        (WebKit::ThreadedCompositor::setNeedsDisplay):
&gt; +        (WebKit::ThreadedCompositor::setNativeSurfaceHandleForCompositing):

You can omit the blank ones and just leave the one for the file itself.

&gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadSafeCoordinatedSurface.cpp:35
&gt; +#if USE(TEXTURE_MAPPER)
&gt; +#include &lt;WebCore/TextureMapperGL.h&gt;
&gt; +#endif

Doesn&apos;t COORDINATED_GRAPHICS rely on texture mapper anyway? Perhaps this could just be moved to the main block without the #ifdef?

&gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadSafeCoordinatedSurface.cpp:86
&gt; +#if USE(TEXTURE_MAPPER)

Same question here as above.

&gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp:67
&gt; +    void setUpdateTimer(double interval = 0.0f)

0.0f should just be a 0 without since that converts properly.

&gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp:256
&gt; +    m_scene-&gt;paintToCurrentGLContext(viewportTransform, 1.0, clipRect, Color::white, false, scrollPostion);

1.0 can just be 1 here.

&gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ViewportController.cpp:1
&gt; +/*

So this should probably move to the parent directory, but just have a different name. Perhaps SimpleViewportController or DesktopViewportController, since it isn&apos;t really related to threaded compositing, but the fact that this is targeting a simpler type of screen.

&gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ViewportController.cpp:2
&gt; + * Copyright (C) 2014 Igalia S.L.

Should this retain the copyright from the original ViewportController.h?

&gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ViewportController.cpp:77
&gt; +    m_allowsUserScaling = !!m_rawAttributes.userScalable;

I don&apos;t believe the double !! is necessary.

&gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ViewportController.cpp:79
&gt; +

I don&apos;t think you need these parenthesis, right?

&gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ViewportController.cpp:132
&gt; +    FloatRect bounds;
&gt; +    bounds.setWidth(std::max(0.f, m_contentsSize.width() - floorf(m_viewportSize.width() / scale)));
&gt; +    bounds.setHeight(std::max(0.f, m_contentsSize.height() - floorf(m_viewportSize.height() / scale)));

This can just be FloatRect bounds(std::max(0.f, m_contentsSize.width() - floorf(m_viewportSize.width() / scale)), ...)

You don&apos;t need to use .f on the floating point number.

&gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ViewportController.cpp:136
&gt; +    FloatPoint position;
&gt; +    position.setX(clampTo(framePosition.x(), bounds.x(), bounds.width()));
&gt; +    position.setY(clampTo(framePosition.y(), bounds.y(), bounds.height()));

This can just be FloatPoint position(clampTo(framePosition.x(), bounds.x(), bounds.width()), clampTo(framePosition.y(), bounds.y(), bounds.height()));</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1053754</commentid>
    <comment_count>7</comment_count>
    <who name="Gwang Yoon Hwang">yoon</who>
    <bug_when>2014-12-09 05:36:49 -0800</bug_when>
    <thetext>(In reply to comment #6)

&gt; &gt; Source/WebKit2/ChangeLog:4
&gt; &gt; +        [ThreadedCompositor] Implements an initial version of the Threaded Compositor.
&gt; &gt; +        https://bugs.webkit.org/show_bug.cgi?id=118383
&gt; 
&gt; I updated the bug title to be more descriptive, so the patch should be
&gt; updated as well.

Good suggestion.
I&apos;ll modify the patch for that.

&gt; &gt; Source/WebKit2/ChangeLog:50
&gt; &gt; +        (WebKit::CompositingRunLoop::CompositingRunLoop):
&gt; &gt; +        (WebKit::CompositingRunLoop::callOnCompositingRunLoop):
&gt; &gt; +        (WebKit::CompositingRunLoop::setUpdateTimer):
&gt; &gt; +        (WebKit::CompositingRunLoop::stopUpdateTimer):
&gt; &gt; +        (WebKit::CompositingRunLoop::runLoop):
&gt; &gt; +        (WebKit::CompositingRunLoop::updateTimerFired):
&gt; &gt; +        (WebKit::ThreadedCompositor::create):
&gt; &gt; +        (WebKit::ThreadedCompositor::ThreadedCompositor):
&gt; &gt; +        (WebKit::ThreadedCompositor::~ThreadedCompositor):
&gt; &gt; +        (WebKit::ThreadedCompositor::setNeedsDisplay):
&gt; &gt; +        (WebKit::ThreadedCompositor::setNativeSurfaceHandleForCompositing):
&gt; 
&gt; You can omit the blank ones and just leave the one for the file itself.

Ditto.

&gt; &gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadSafeCoordinatedSurface.cpp:35
&gt; &gt; +#if USE(TEXTURE_MAPPER)
&gt; &gt; +#include &lt;WebCore/TextureMapperGL.h&gt;
&gt; &gt; +#endif
&gt; 
&gt; Doesn&apos;t COORDINATED_GRAPHICS rely on texture mapper anyway? Perhaps this
&gt; could just be moved to the main block without the #ifdef?

I think it is good point also. I&apos;ll remove these from my patch set,
but also we need to clean up COORDINATED_GRAPHICS, TEXTURE_MAPPER, and TILED_BACKING_STORE stuff globally. 

Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp:67
&gt; &gt; +    void setUpdateTimer(double interval = 0.0f)
&gt; 
&gt; 0.0f should just be a 0 without since that converts properly.

Good, fixed.
 
&gt; &gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ThreadedCompositor.cpp:256
&gt; &gt; +    m_scene-&gt;paintToCurrentGLContext(viewportTransform, 1.0, clipRect, Color::white, false, scrollPostion);
&gt; 
&gt; 1.0 can just be 1 here.

Ditto.
 
&gt; &gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ViewportController.cpp:1
&gt; &gt; +/*
&gt; 
&gt; So this should probably move to the parent directory, but just have a
&gt; different name. Perhaps SimpleViewportController or
&gt; DesktopViewportController, since it isn&apos;t really related to threaded
&gt; compositing, but the fact that this is targeting a simpler type of screen.

I agree about it. I prefer SimpleViewportController because it can handle fixed layout also.

&gt; &gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ViewportController.cpp:2
&gt; &gt; + * Copyright (C) 2014 Igalia S.L.
&gt; 
&gt; Should this retain the copyright from the original ViewportController.h?

I omitted original PageViewportController&apos;s copyright. I&apos;ll update license for SimpleViewportController.
 
&gt; &gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ViewportController.cpp:77
&gt; &gt; +    m_allowsUserScaling = !!m_rawAttributes.userScalable;
&gt; 
&gt; I don&apos;t believe the double !! is necessary.
&gt; 

Ah. old legacy code. I&apos;ll remove &quot;!!&quot; .

&gt; &gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ViewportController.cpp:79
&gt; &gt; +
&gt; 
&gt; I don&apos;t think you need these parenthesis, right?
&gt; 

Yes, I don&apos;t need it.

&gt; &gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ViewportController.cpp:132
&gt; &gt; +    FloatRect bounds;
&gt; &gt; +    bounds.setWidth(std::max(0.f, m_contentsSize.width() - floorf(m_viewportSize.width() / scale)));
&gt; &gt; +    bounds.setHeight(std::max(0.f, m_contentsSize.height() - floorf(m_viewportSize.height() / scale)));
&gt; 
&gt; This can just be FloatRect bounds(std::max(0.f, m_contentsSize.width() -
&gt; floorf(m_viewportSize.width() / scale)), ...)
&gt; 
&gt; You don&apos;t need to use .f on the floating point number.
&gt; 

If we do not use .f in this place, deduction failure will be happen at std::max.
It will try std::max(int, float) 

&gt; &gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ViewportController.cpp:136
&gt; &gt; +    FloatPoint position;
&gt; &gt; +    position.setX(clampTo(framePosition.x(), bounds.x(), bounds.width()));
&gt; &gt; +    position.setY(clampTo(framePosition.y(), bounds.y(), bounds.height()));
&gt; 
&gt; This can just be FloatPoint position(clampTo(framePosition.x(), bounds.x(),
&gt; bounds.width()), clampTo(framePosition.y(), bounds.y(), bounds.height()));

I think merging these in to the single statement reduces readability. I&apos;ll make more simplified statement for these.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1053762</commentid>
    <comment_count>8</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2014-12-09 05:49:57 -0800</bug_when>
    <thetext>(In reply to comment #7)

&gt; &gt; &gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ViewportController.cpp:136
&gt; &gt; &gt; +    FloatPoint position;
&gt; &gt; &gt; +    position.setX(clampTo(framePosition.x(), bounds.x(), bounds.width()));
&gt; &gt; &gt; +    position.setY(clampTo(framePosition.y(), bounds.y(), bounds.height()));
&gt; &gt; 
&gt; &gt; This can just be FloatPoint position(clampTo(framePosition.x(), bounds.x(),
&gt; &gt; bounds.width()), clampTo(framePosition.y(), bounds.y(), bounds.height()));
&gt; 
&gt; I think merging these in to the single statement reduces readability. I&apos;ll
&gt; make more simplified statement for these.

One option for improved readability is to split it over multiple lines like this:

FloatPoint position(
    clampTo(framePosition.x(), bounds.x(), bounds.width()),
    clampTo(framePosition.y(), bounds.y(), bounds.height()));

That way you avoid the slight overhead of method calls.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1053767</commentid>
    <comment_count>9</comment_count>
      <attachid>242915</attachid>
    <who name="Gwang Yoon Hwang">yoon</who>
    <bug_when>2014-12-09 06:17:43 -0800</bug_when>
    <thetext>Created attachment 242915
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1054093</commentid>
    <comment_count>10</comment_count>
    <who name="Sergio Villar Senin">svillar</who>
    <bug_when>2014-12-10 02:08:22 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; &gt; &gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ViewportController.cpp:132
&gt; &gt; &gt; +    FloatRect bounds;
&gt; &gt; &gt; +    bounds.setWidth(std::max(0.f, m_contentsSize.width() - floorf(m_viewportSize.width() / scale)));
&gt; &gt; &gt; +    bounds.setHeight(std::max(0.f, m_contentsSize.height() - floorf(m_viewportSize.height() / scale)));
&gt; &gt; 
&gt; &gt; This can just be FloatRect bounds(std::max(0.f, m_contentsSize.width() -
&gt; &gt; floorf(m_viewportSize.width() / scale)), ...)
&gt; &gt; 
&gt; &gt; You don&apos;t need to use .f on the floating point number.
&gt; &gt; 
&gt; 
&gt; If we do not use .f in this place, deduction failure will be happen at
&gt; std::max.
&gt; It will try std::max(int, float) 
&gt; 

Not really, std::max is templated so you could do something like std::max&lt;float&gt;().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1054096</commentid>
    <comment_count>11</comment_count>
    <who name="Gwang Yoon Hwang">yoon</who>
    <bug_when>2014-12-10 02:27:48 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #7)
&gt; &gt; &gt; &gt; Source/WebKit2/Shared/CoordinatedGraphics/threadedcompositor/ViewportController.cpp:132
&gt; &gt; &gt; &gt; +    FloatRect bounds;
&gt; &gt; &gt; &gt; +    bounds.setWidth(std::max(0.f, m_contentsSize.width() - floorf(m_viewportSize.width() / scale)));
&gt; &gt; &gt; &gt; +    bounds.setHeight(std::max(0.f, m_contentsSize.height() - floorf(m_viewportSize.height() / scale)));
&gt; &gt; &gt; 
&gt; &gt; &gt; This can just be FloatRect bounds(std::max(0.f, m_contentsSize.width() -
&gt; &gt; &gt; floorf(m_viewportSize.width() / scale)), ...)
&gt; &gt; &gt; 
&gt; &gt; &gt; You don&apos;t need to use .f on the floating point number.
&gt; &gt; &gt; 
&gt; &gt; 
&gt; &gt; If we do not use .f in this place, deduction failure will be happen at
&gt; &gt; std::max.
&gt; &gt; It will try std::max(int, float) 
&gt; &gt; 
&gt; 
&gt; Not really, std::max is templated so you could do something like
&gt; std::max&lt;float&gt;().

That&apos;s why I said the deduction failure.

std::max is templated somewhat like below:
template&lt; class T &gt; 
const T&amp; max( const T&amp; a, const T&amp; b );

So the compiler cannot decide whether the T is int or float in this case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1055576</commentid>
    <comment_count>12</comment_count>
      <attachid>242915</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2014-12-15 01:13:36 -0800</bug_when>
    <thetext>Comment on attachment 242915
Patch

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

&gt; Source/WebKit2/Shared/CoordinatedGraphics/SimpleViewportController.cpp:125
&gt; +    return FloatSize(m_viewportSize.width() / m_pageScaleFactor, m_viewportSize.height() / m_pageScaleFactor);

Could you do FloatSize(m_viewportSize).scale(1.0 / m_pageScaleFactor); here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1055590</commentid>
    <comment_count>13</comment_count>
      <attachid>242915</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2014-12-15 02:39:11 -0800</bug_when>
    <thetext>Comment on attachment 242915
Patch

Clearing flags on attachment: 242915

Committed r177276: &lt;http://trac.webkit.org/changeset/177276&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1055591</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2014-12-15 02:39:15 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>206077</attachid>
            <date>2013-07-04 05:02:16 -0700</date>
            <delta_ts>2014-12-08 08:10:55 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-118383-20130704210004.patch</filename>
            <type>text/plain</type>
            <size>44371</size>
            <attacher name="Gwang Yoon Hwang">yoon</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTUyMzk2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZTJmNjk0ZDYyM2NjYzg1
YmFkNDQ3ZGQ2ODFhYWFhNDJjOWQ4YjdjYi4uNzA5M2EzNGM4OWUwNjU0MWMxMGIyMTRlMTkyMzYx
Mjk4ZjMzNmYxZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDExMCBAQAorMjAxMy0wNy0wNCAgR3dh
bmcgWW9vbiBId2FuZyAgPHJ5dW1pZWxAY29tcGFueTEwMC5uZXQ+CisKKyAgICAgICAgW1RocmVh
ZGVkIENvbXBvc2l0b3JdIEltcGxlbWVudHMgYW4gaW5pdGlhbCB2ZXJzaW9uIG9mIHRoZSBUaHJl
YWRlZCBDb21wb3NpdG9yLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MTE4MzgzCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisK
KyAgICAgICAgSW1wbGVtZW50cyBhbiBpbml0aWFsIHZlcnNpb24gb2YgdGhlIFRocmVhZGVkIENv
bXBvc2l0b3IuCisKKyAgICAgICAgVGhyZWFkZWQgQ29tcG9zaXRvciBpcyBhIHZhcmlhbnQgb2Yg
Q29vcmRpbmF0ZWQgR3JhcGhpY3MgaW1wbGVtZW50YXRpb24uCisgICAgICAgIEJhc2ljIHN0cnVj
dHVyZSBvZiB0aGUgaW1wbGVtZW50YWlvbiBpcyBzaW1saWFyLCB0aHVzLCBUaHJlYWRlZAorICAg
ICAgICBDb21wb3NpdG9yIHJldXNlcyBsb3RzIG9mIGNsYXNzZXMgZnJvbSBDb29yZGluYXRlZCBH
cmFwaGljcy4gSG93ZXZlciwKKyAgICAgICAgaW5zdGVhZCBvZiBjb21wb3NpdGluZyBvbiBVSSBQ
cm9jZXNzLCBUaHJlYWRlZCBDb21wb3NpdG9yIHBlcmZvcm1zCisgICAgICAgIGNvbXBvc2l0aW5n
IG9uIGEgc2VwYXJhdGUgdGhyZWFkIG9mIFdlYiBQcm9jZXNzLgorCisgICAgICAgIEluIHRoaXMg
aW5pdGlhbCBpbXBsZW1lbnRhdGlvbiwgd2UgYWRkcyBiYXNpYyBjbGFzc2VzIGZvciBUaHJlYWRl
ZAorICAgICAgICBDb21wb3NpdG9yLgorCisgICAgICAgIFRocmVhZGVkQ29vcmRpbmF0ZWRDb21w
b3NpdG9yCisgICAgICAgIEl0IGlzIHRoZSBjbGFzcyB0aGF0IHRha2VzIHRoZSByZXNwb25zaWJp
bGl0eSBvZiBtYW5hZ2luZyBzY2hlZHVsaW5nIGFuZAorICAgICAgICBjb21tYW5kaW5nIHRoZSBj
b21wb3NpdGluZyB0aHJlYWQuCisKKyAgICAgICAgQ29vcmRpbmF0ZWRDb21wb3NpdGluZ1RocmVh
ZAorICAgICAgICBJdCBpcyB0aGUgY2xhc3MgdGhhdCByZXByZXNlbnRzIGFjdHVhbCB0aHJlYWQg
YW5kIHJ1bmxvb3AgZm9yCisgICAgICAgIGNvbXBvc2l0aW5nCisKKyAgICAgICAgUGFnZVZpZXdw
b3J0Q29udHJvbGxlcgorICAgICAgICBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIHRvIGhhbmRs
aW5nIHJlcXVlc3RzIGZyb20gV2ViQ29yZSAoZWcuIGNvbnRlbnQKKyAgICAgICAgc2l6ZSBjaGFu
Z2VzLCB2aWV3cG9ydCBhdHRyaWJ1dGVzIGNoYW5nZXMgYW5kIHNjcm9sbCBwb3NpdGlvbiByZXF1
ZXN0cykuCisKKyAgICAgICAgTm8gbmV3IHRlc3QsIGJlY2F1c2UgaXQgaXMgaW4gZXhwZXJpbWVu
dGFsIHN0YWdlLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL2Nvb3JkaW5h
dGVkL0Nvb3JkaW5hdGVkR3JhcGhpY3NTY2VuZS5oOgorICAgICAgICAgICAgT25seSBpbmNsdWRl
IEdyYXBoaWNzU3VyZmFjZS5oIGlmIGl0J3MgbmVlZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL3RleG1hcC90aHJlYWRlZGNvbXBvc2l0b3IvQ29vcmRpbmF0ZWRDb21wb3NpdGluZ1Ro
cmVhZC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Q29vcmRpbmF0ZWRDb21wb3NpdGlu
Z1RocmVhZDo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkNvb3JkaW5hdGVkQ29tcG9zaXRp
bmdUaHJlYWQ6OkNvb3JkaW5hdGVkQ29tcG9zaXRpbmdUaHJlYWQpOgorICAgICAgICAoV2ViQ29y
ZTo6Q29vcmRpbmF0ZWRDb21wb3NpdGluZ1RocmVhZDo6fkNvb3JkaW5hdGVkQ29tcG9zaXRpbmdU
aHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6Q29vcmRpbmF0ZWRDb21wb3NpdGluZ1RocmVhZDo6
c2V0TmVlZHNEaXNwbGF5KToKKyAgICAgICAgKFdlYkNvcmU6OkNvb3JkaW5hdGVkQ29tcG9zaXRp
bmdUaHJlYWQ6OnNldE5hdGl2ZVN1cmZhY2VIYW5kbGVGb3JDb21wb3NpdGluZyk6CisgICAgICAg
IChXZWJDb3JlOjpDb29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkOjplbnN1cmVHTENvbnRleHQp
OgorICAgICAgICAoV2ViQ29yZTo6Q29vcmRpbmF0ZWRDb21wb3NpdGluZ1RocmVhZDo6Z2xDb250
ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkNvb3JkaW5hdGVkQ29tcG9zaXRpbmdUaHJlYWQ6OnVw
ZGF0ZVRpbWVyRmlyZWQpOgorICAgICAgICAoV2ViQ29yZTo6Q29vcmRpbmF0ZWRDb21wb3NpdGlu
Z1RocmVhZDo6c2NoZWR1bGVEaXNwbGF5SWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6Q29v
cmRpbmF0ZWRDb21wb3NpdGluZ1RocmVhZDo6c2V0Vmlld3BvcnRQb3NpdGlvbkFuZFNjYWxlKToK
KyAgICAgICAgKFdlYkNvcmU6OkNvb3JkaW5hdGVkQ29tcG9zaXRpbmdUaHJlYWQ6OnVwZGF0ZVZp
ZXdwb3J0UG9zaXRpb25BbmRTY2FsZSk6CisgICAgICAgIChXZWJDb3JlOjpDb29yZGluYXRlZENv
bXBvc2l0aW5nVGhyZWFkOjpyZW5kZXJMYXllclRyZWUpOgorICAgICAgICAoV2ViQ29yZTo6Q29v
cmRpbmF0ZWRDb21wb3NpdGluZ1RocmVhZDo6dGhyZWFkQ2FsbGJhY2spOgorICAgICAgICAoV2Vi
Q29yZTo6Q29vcmRpbmF0ZWRDb21wb3NpdGluZ1RocmVhZDo6cnVuTG9vcCk6CisgICAgICAgIChX
ZWJDb3JlOjpDb29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkOjpjcmVhdGVDb21wb3NpdGluZ1Ro
cmVhZCk6CisgICAgICAgIChXZWJDb3JlOjpDb29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkOjp0
ZXJtaW5hdGVDb21wb3NpdGluZ1RocmVhZCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
dGV4bWFwL3RocmVhZGVkY29tcG9zaXRvci9Db29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkLmg6
IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC90aHJlYWRlZGNvbXBv
c2l0b3IvUGFnZVZpZXdwb3J0Q29udHJvbGxlci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6UGFnZVZpZXdwb3J0Q29udHJvbGxlcjo6Y3JlYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlBh
Z2VWaWV3cG9ydENvbnRyb2xsZXI6OlBhZ2VWaWV3cG9ydENvbnRyb2xsZXIpOgorICAgICAgICAo
V2ViQ29yZTo6UGFnZVZpZXdwb3J0Q29udHJvbGxlcjo6ZGlkQ2hhbmdlVmlld3BvcnRTaXplKToK
KyAgICAgICAgKFdlYkNvcmU6OlBhZ2VWaWV3cG9ydENvbnRyb2xsZXI6OmRpZENoYW5nZUNvbnRl
bnRzU2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlVmlld3BvcnRDb250cm9sbGVyOjpkaWRD
aGFuZ2VWaWV3cG9ydEF0dHJpYnV0ZSk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlVmlld3BvcnRD
b250cm9sbGVyOjpzY3JvbGxCeSk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlVmlld3BvcnRDb250
cm9sbGVyOjpzY3JvbGxUbyk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlVmlld3BvcnRDb250cm9s
bGVyOjpkaWRSZW5kZXJGcmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlVmlld3BvcnRDb250
cm9sbGVyOjpkaWRDaGFuZ2VDb250ZW50c1Zpc2liaWxpdHkpOgorICAgICAgICAoV2ViQ29yZTo6
UGFnZVZpZXdwb3J0Q29udHJvbGxlcjo6c3luY1Zpc2libGVDb250ZW50cyk6CisgICAgICAgIChX
ZWJDb3JlOjpQYWdlVmlld3BvcnRDb250cm9sbGVyOjp2aXNpYmxlQ29udGVudHNTaXplKToKKyAg
ICAgICAgKFdlYkNvcmU6OlBhZ2VWaWV3cG9ydENvbnRyb2xsZXI6OmJvdW5kQ29udGVudHNQb3Np
dGlvbkF0U2NhbGUpOgorICAgICAgICAoV2ViQ29yZTo6UGFnZVZpZXdwb3J0Q29udHJvbGxlcjo6
Ym91bmRDb250ZW50c1Bvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OmZ1enp5Q29tcGFyZSk6
CisgICAgICAgIChXZWJDb3JlOjpQYWdlVmlld3BvcnRDb250cm9sbGVyOjp1cGRhdGVNaW5pbXVt
U2NhbGVUb0ZpdCk6CisgICAgICAgIChXZWJDb3JlOjpQYWdlVmlld3BvcnRDb250cm9sbGVyOjpp
bm5lckJvdW5kZWRWaWV3cG9ydFNjYWxlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy90
ZXhtYXAvdGhyZWFkZWRjb21wb3NpdG9yL1BhZ2VWaWV3cG9ydENvbnRyb2xsZXIuaDogQWRkZWQu
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL3RocmVhZGVkY29tcG9zaXRvci9U
aHJlYWRlZENvb3JkaW5hdGVkQ29tcG9zaXRvci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6VGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OmNyZWF0ZSk6CisgICAgICAgIChXZWJD
b3JlOjpUaHJlYWRlZENvb3JkaW5hdGVkQ29tcG9zaXRvcjo6VGhyZWFkZWRDb29yZGluYXRlZENv
bXBvc2l0b3IpOgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0
b3I6On5UaHJlYWRlZENvb3JkaW5hdGVkQ29tcG9zaXRvcik6CisgICAgICAgIChXZWJDb3JlOjpU
aHJlYWRlZENvb3JkaW5hdGVkQ29tcG9zaXRvcjo6Y3JlYXRlQ29vcmRpbmF0ZWRTdXJmYWNlKToK
KyAgICAgICAgKFdlYkNvcmU6OlRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yOjpzZXRMYXll
ckZsdXNoU2NoZWR1bGluZ0VuYWJsZWQpOgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFkZWRDb29y
ZGluYXRlZENvbXBvc2l0b3I6OnNjaGVkdWxlTGF5ZXJGbHVzaCk6CisgICAgICAgIChXZWJDb3Jl
OjpUaHJlYWRlZENvb3JkaW5hdGVkQ29tcG9zaXRvcjo6bGF5ZXJGbHVzaFRpbWVyRmlyZWQpOgor
ICAgICAgICAoV2ViQ29yZTo6VGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OnZpZXdwb3J0
U2l6ZUNoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFkZWRDb29yZGluYXRlZENvbXBv
c2l0b3I6OnZpZXdwb3J0QXR0cmlidXRlQ2hhbmdlZCk6CisgICAgICAgIChXZWJDb3JlOjpUaHJl
YWRlZENvb3JkaW5hdGVkQ29tcG9zaXRvcjo6ZGV2aWNlT3JQYWdlU2NhbGVGYWN0b3JDaGFuZ2Vk
KToKKyAgICAgICAgKFdlYkNvcmU6OlRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yOjpzZXRT
aG91bGROb3RpZnlBZnRlck5leHRTY2hlZHVsZWRMYXllckZsdXNoKToKKyAgICAgICAgKFdlYkNv
cmU6OlRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yOjpzZXRSb290Q29tcG9zaXRpbmdMYXll
cik6CisgICAgICAgIChXZWJDb3JlOjpUaHJlYWRlZENvb3JkaW5hdGVkQ29tcG9zaXRvcjo6c2Ny
b2xsVG8pOgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6
OnNjcm9sbEJ5KToKKyAgICAgICAgKFdlYkNvcmU6OlRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3Np
dG9yOjpzZXRWaXNpYmxlQ29udGVudHNSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OlRocmVhZGVk
Q29vcmRpbmF0ZWRDb21wb3NpdG9yOjpyZW5kZXJOZXh0RnJhbWUpOgorICAgICAgICAoV2ViQ29y
ZTo6VGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OnVwZGF0ZVZpZXdwb3J0KToKKyAgICAg
ICAgKFdlYkNvcmU6OlRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yOjpwdXJnZUJhY2tpbmdT
dG9yZXMpOgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6
OmNvbW1pdFNjcm9sbE9mZnNldCk6CisgICAgICAgIChXZWJDb3JlOjpUaHJlYWRlZENvb3JkaW5h
dGVkQ29tcG9zaXRvcjo6c2NoZWR1bGVBbmltYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6VGhy
ZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OnNldE5hdGl2ZVN1cmZhY2VIYW5kbGVGb3JDb21w
b3NpdGluZyk6CisgICAgICAgIChXZWJDb3JlOjpUaHJlYWRlZENvb3JkaW5hdGVkQ29tcG9zaXRv
cjo6Y2FuY2VsUGVuZGluZ0xheWVyRmx1c2gpOgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFkZWRD
b29yZGluYXRlZENvbXBvc2l0b3I6OnBlcmZvcm1TY2hlZHVsZWRMYXllckZsdXNoKToKKyAgICAg
ICAgKFdlYkNvcmU6OlRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yOjpub3RpZnlGbHVzaFJl
cXVpcmVkKToKKyAgICAgICAgKFdlYkNvcmU6OlRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9y
Ojpjb21taXRTY2VuZVN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlRocmVhZGVkQ29vcmRpbmF0
ZWRDb21wb3NpdG9yOjpwYWludExheWVyQ29udGVudHMpOgorICAgICAgICAoV2ViQ29yZTo6VGhy
ZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OmNvbnRlbnRzU2l6ZUNoYW5nZWQpOgorICAgICAg
ICAoV2ViQ29yZTo6VGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OmRpc3BhdGNoVXBkYXRl
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvdGhyZWFkZWRjb21wb3NpdG9y
L1RocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29y
ZTo6VGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OnBhdXNlUmVuZGVyaW5nKToKKyAgICAg
ICAgKFdlYkNvcmU6OlRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yOjpyZXN1bWVSZW5kZXJp
bmcpOgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OnNj
cm9sbFBvc2l0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlRocmVhZGVkQ29vcmRpbmF0ZWRDb21w
b3NpdG9yOjpzY2FsZUZhY3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpUaHJlYWRlZENvb3JkaW5h
dGVkQ29tcG9zaXRvcjo6Z3JhcGhpY3NMYXllckZhY3RvcnkpOgorICAgICAgICAoV2ViQ29yZTo6
VGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OnJvb3RMYXllcik6CisKIDIwMTMtMDctMDQg
IE1hcmlvIFNhbmNoZXogUHJhZGEgIDxtYXJpby5wcmFkYUBzYW1zdW5nLmNvbT4KIAogICAgICAg
ICBbQVRLXSBEbyBub3QgZXhwb3NlICdcbicgZm9yIHdyYXBwZWQgbGluZXMgd2l0aCBBVEtfVEVY
VF9CT1VOREFSWV9DSEFSCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy90ZXhtYXAvY29vcmRpbmF0ZWQvQ29vcmRpbmF0ZWRHcmFwaGljc1NjZW5lLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvY29vcmRpbmF0ZWQvQ29vcmRpbmF0
ZWRHcmFwaGljc1NjZW5lLmgKaW5kZXggN2ZhOTJhZDg3NTc0M2UzNjJiMTBkMGFiNWE3NWRmYTQx
MTlmYjY4MS4uMDQxMWNkOTU0ZmU3Yjc5Zjg0ZDk1Yjk1MWUyMThkM2YzMGJhY2Y2ZiAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL2Nvb3JkaW5hdGVk
L0Nvb3JkaW5hdGVkR3JhcGhpY3NTY2VuZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3RleG1hcC9jb29yZGluYXRlZC9Db29yZGluYXRlZEdyYXBoaWNzU2NlbmUuaApA
QCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1ZGUg
IkdyYXBoaWNzTGF5ZXIuaCIKICNpbmNsdWRlICJHcmFwaGljc0xheWVyQW5pbWF0aW9uLmgiCi0j
aW5jbHVkZSAiR3JhcGhpY3NTdXJmYWNlLmgiCiAjaW5jbHVkZSAiSW50UmVjdC5oIgogI2luY2x1
ZGUgIkludFNpemUuaCIKICNpbmNsdWRlICJSdW5Mb29wLmgiCkBAIC00Miw2ICs0MSw3IEBACiAj
aW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgogCiAjaWYgVVNFKEdSQVBISUNTX1NVUkZBQ0UpCisjaW5j
bHVkZSAiR3JhcGhpY3NTdXJmYWNlLmgiCiAjaW5jbHVkZSAiVGV4dHVyZU1hcHBlclN1cmZhY2VC
YWNraW5nU3RvcmUuaCIKICNlbmRpZgogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy90ZXhtYXAvdGhyZWFkZWRjb21wb3NpdG9yL0Nvb3JkaW5hdGVkQ29tcG9z
aXRpbmdUaHJlYWQuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFw
L3RocmVhZGVkY29tcG9zaXRvci9Db29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi41M2ZhNjY4NDhmM2ZmNDA0ZWM5ZmJmYjQyZDllZjVhN2U1Y2VjMTg3Ci0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL3RocmVh
ZGVkY29tcG9zaXRvci9Db29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkLmNwcApAQCAtMCwwICsx
LDIwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBDb21wYW55IDEwMCwgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBV
U0UoQ09PUkRJTkFURURfR1JBUEhJQ1NfVEhSRUFERUQpCisKKyNpbmNsdWRlICJDb29yZGluYXRl
ZENvbXBvc2l0aW5nVGhyZWFkLmgiCisKKyNpbmNsdWRlICJDb29yZGluYXRlZEdyYXBoaWNzU2Nl
bmUuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgPHd0Zi9D
dXJyZW50VGltZS5oPgorCisjaWYgVVNFKE9QRU5HTF9FU18yKQorI2luY2x1ZGUgPEdMRVMyL2ds
Mi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxHTC9nbC5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworUGFzc093blB0cjxDb29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkPiBDb29yZGlu
YXRlZENvbXBvc2l0aW5nVGhyZWFkOjpjcmVhdGUoUGFzc1JlZlB0cjxDb29yZGluYXRlZEdyYXBo
aWNzU2NlbmU+IHNjZW5lKQoreworICAgIHJldHVybiBhZG9wdFB0cihuZXcgQ29vcmRpbmF0ZWRD
b21wb3NpdGluZ1RocmVhZChzY2VuZSkpOworfQorCitDb29yZGluYXRlZENvbXBvc2l0aW5nVGhy
ZWFkOjpDb29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkKFBhc3NSZWZQdHI8Q29vcmRpbmF0ZWRH
cmFwaGljc1NjZW5lPiBzY2VuZSkKKyAgICA6IG1fc2NlbmUoc2NlbmUpCisgICAgLCBtX3RocmVh
ZElkZW50aWZpZXIoMCkKKyAgICAsIG1faXNBY3RpdmUodHJ1ZSkKKyAgICAsIG1fcnVuTG9vcCgw
KQoreworICAgIGNyZWF0ZUNvbXBvc2l0aW5nVGhyZWFkKCk7Cit9CisKK0Nvb3JkaW5hdGVkQ29t
cG9zaXRpbmdUaHJlYWQ6On5Db29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkKCkKK3sKKyAgICB0
ZXJtaW5hdGVDb21wb3NpdGluZ1RocmVhZCgpOworfQorCit2b2lkIENvb3JkaW5hdGVkQ29tcG9z
aXRpbmdUaHJlYWQ6OnNldE5lZWRzRGlzcGxheSgpCit7CisgICAgbV9ydW5Mb29wLT5kaXNwYXRj
aChiaW5kKCZDb29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkOjpzY2hlZHVsZURpc3BsYXlJZk5l
ZWRlZCwgdGhpcywgMC4wZikpOworfQorCit2b2lkIENvb3JkaW5hdGVkQ29tcG9zaXRpbmdUaHJl
YWQ6OnNldE5hdGl2ZVN1cmZhY2VIYW5kbGVGb3JDb21wb3NpdGluZyh1aW50NjRfdCBoYW5kbGUp
Cit7CisgICAgbV9uYXRpdmVTdXJmYWNlSGFuZGxlID0gaGFuZGxlOworICAgIG1fc2NlbmUtPnNl
dEFjdGl2ZSh0cnVlKTsKK30KKworYm9vbCBDb29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkOjpl
bnN1cmVHTENvbnRleHQoKQoreworICAgIGlmICghZ2xDb250ZXh0KCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGdsQ29udGV4dCgpLT5tYWtlQ29udGV4dEN1cnJlbnQoKTsKKyAgICAv
LyBUaGUgd2luZG93IHNpemUgbWF5IGJlIG91dCBvZiBzeW5jIHdpdGggdGhlIHBhZ2Ugc2l6ZSBh
dCB0aGlzIHBvaW50LCBhbmQgZ2V0dGluZworICAgIC8vIHRoZSB2aWV3cG9ydCBwYXJhbWV0ZXJz
IGluY29ycmVjdCwgbWVhbnMgdGhhdCB0aGUgY29udGVudCB3aWxsIGJlIG1pc3BsYWNlZC4gVGh1
cworICAgIC8vIHdlIHNldCB0aGUgdmlld3BvcnQgcGFyYW1ldGVycyBkaXJlY3RseSBmcm9tIHRo
ZSB3aW5kb3cgc2l6ZS4KKyAgICBJbnRTaXplIGNvbnRleHRTaXplID0gZ2xDb250ZXh0KCktPmRl
ZmF1bHRGcmFtZUJ1ZmZlclNpemUoKTsKKyAgICBpZiAobV92aWV3cG9ydFNpemUgIT0gY29udGV4
dFNpemUpIHsKKyAgICAgICAgZ2xWaWV3cG9ydCgwLCAwLCBjb250ZXh0U2l6ZS53aWR0aCgpLCBj
b250ZXh0U2l6ZS5oZWlnaHQoKSk7CisgICAgICAgIG1fdmlld3BvcnRTaXplID0gY29udGV4dFNp
emU7CisgICAgfQorCisgICAgLy8gRklYTUUgOiBiZWxvdyBjYWxscyBtdXN0IGJlIHJlbW92ZWQg
YnkgaW50cm9kdWNpbmcgdmlld3BvcnQgYW5kIHZpZXdwb3J0IGNvbnRyb2xsZXIuCisgICAgLy8g
ICAgICAgICBOb24tY29tcG9zaXRlZCBjb250ZW50cyBsYXllciB3aWxsIGJlIHJlbmRlcmVkIGFm
dGVyIGltcGxlbWVudCB2aWV3cG9ydCB0aGluZ3MuCisgICAgZ2xDbGVhckNvbG9yKDEsIDEsIDEs
IDApOworICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworR0xDb250ZXh0KiBDb29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkOjpnbENvbnRl
eHQoKQoreworICAgIGlmIChtX2NvbnRleHQpCisgICAgICAgIHJldHVybiBtX2NvbnRleHQuZ2V0
KCk7CisKKyAgICBpZiAoIW1fbmF0aXZlU3VyZmFjZUhhbmRsZSkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBtX2NvbnRleHQgPSBHTENvbnRleHQ6OmNyZWF0ZUNvbnRleHRGb3JXaW5kb3cobV9u
YXRpdmVTdXJmYWNlSGFuZGxlLCBHTENvbnRleHQ6OnNoYXJpbmdDb250ZXh0KCkpOworICAgIHJl
dHVybiBtX2NvbnRleHQuZ2V0KCk7Cit9CisKK3ZvaWQgQ29vcmRpbmF0ZWRDb21wb3NpdGluZ1Ro
cmVhZDo6dXBkYXRlVGltZXJGaXJlZCgpCit7CisgICAgcmVuZGVyTGF5ZXJUcmVlKCk7Cit9CisK
K3ZvaWQgQ29vcmRpbmF0ZWRDb21wb3NpdGluZ1RocmVhZDo6c2NoZWR1bGVEaXNwbGF5SWZOZWVk
ZWQoZG91YmxlIGludGVydmFsKQoreworICAgIEFTU0VSVCghaXNNYWluVGhyZWFkKCkpOworCisg
ICAgaWYgKG1fdXBkYXRlVGltZXItPmlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IG1fdXBkYXRlVGltZXItPnN0YXJ0T25lU2hvdChpbnRlcnZhbCk7Cit9CisKK3ZvaWQgQ29vcmRp
bmF0ZWRDb21wb3NpdGluZ1RocmVhZDo6c2V0Vmlld3BvcnRQb3NpdGlvbkFuZFNjYWxlKGNvbnN0
IEZsb2F0UG9pbnQmIHBvc2l0aW9uLCBmbG9hdCBzY2FsZSkKK3sKKyAgICBtX3J1bkxvb3AtPmRp
c3BhdGNoKGJpbmQoJkNvb3JkaW5hdGVkQ29tcG9zaXRpbmdUaHJlYWQ6OnVwZGF0ZVZpZXdwb3J0
UG9zaXRpb25BbmRTY2FsZSwgdGhpcywgcG9zaXRpb24sIHNjYWxlKSk7Cit9CisKK3ZvaWQgQ29v
cmRpbmF0ZWRDb21wb3NpdGluZ1RocmVhZDo6dXBkYXRlVmlld3BvcnRQb3NpdGlvbkFuZFNjYWxl
KGNvbnN0IEZsb2F0UG9pbnQmIHBvc2l0aW9uLCBmbG9hdCBzY2FsZSkKK3sKKyAgICBBU1NFUlQo
IWlzTWFpblRocmVhZCgpKTsKKyAgICBtX3ZpZXdwb3J0VHJhbnNmb3JtLm1ha2VJZGVudGl0eSgp
OworICAgIG1fdmlld3BvcnRUcmFuc2Zvcm0udHJhbnNsYXRlKC1wb3NpdGlvbi54KCksIC1wb3Np
dGlvbi55KCkpOworICAgIG1fdmlld3BvcnRUcmFuc2Zvcm0uc2NhbGUoc2NhbGUpOworICAgIHNj
aGVkdWxlRGlzcGxheUlmTmVlZGVkKCk7Cit9CisKK3ZvaWQgQ29vcmRpbmF0ZWRDb21wb3NpdGlu
Z1RocmVhZDo6cmVuZGVyTGF5ZXJUcmVlKCkKK3sKKyAgICBpZiAoIW1fc2NlbmUpCisgICAgICAg
IHJldHVybjsKKworICAgIGlmICghZW5zdXJlR0xDb250ZXh0KCkpCisgICAgICAgIHJldHVybjsK
KworICAgIGRvdWJsZSBzdGFydFRpbWVUb1JlbmRlciA9IFdURjo6Y3VycmVudFRpbWUoKTsKKwor
ICAgIEZsb2F0UmVjdCBjbGlwUmVjdCgwLCAwLCBtX3ZpZXdwb3J0U2l6ZS53aWR0aCgpLCBtX3Zp
ZXdwb3J0U2l6ZS5oZWlnaHQoKSk7CisKKyAgICBtX3NjZW5lLT5wYWludFRvQ3VycmVudEdMQ29u
dGV4dChtX3ZpZXdwb3J0VHJhbnNmb3JtLCAxLjAsIGNsaXBSZWN0LCAwKTsKKworICAgIGdsQ29u
dGV4dCgpLT5zd2FwQnVmZmVycygpOworfQorCit2b2lkIENvb3JkaW5hdGVkQ29tcG9zaXRpbmdU
aHJlYWQ6OnRocmVhZENhbGxiYWNrKHZvaWQqIGNvbXBvc2l0aW5nVGhyZWFkKQoreworICAgIHN0
YXRpY19jYXN0PENvb3JkaW5hdGVkQ29tcG9zaXRpbmdUaHJlYWQqPihjb21wb3NpdGluZ1RocmVh
ZCktPnJ1bkxvb3AoKTsKK30KKwordm9pZCBDb29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkOjpy
dW5Mb29wKCkKK3sKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX2luaXRpYWxp
emVSdW5Mb29wQ29uZGl0aW9uTXV0ZXgpOworCisgICAgICAgIG1fcnVuTG9vcCA9IFJ1bkxvb3A6
OmN1cnJlbnQoKTsKKyAgICAgICAgbV91cGRhdGVUaW1lciA9IGFkb3B0UHRyPFJ1bkxvb3A6OlRp
bWVyPENvb3JkaW5hdGVkQ29tcG9zaXRpbmdUaHJlYWQ+ID4obmV3IFJ1bkxvb3A6OlRpbWVyPENv
b3JkaW5hdGVkQ29tcG9zaXRpbmdUaHJlYWQ+KG1fcnVuTG9vcCwgdGhpcywgJkNvb3JkaW5hdGVk
Q29tcG9zaXRpbmdUaHJlYWQ6OnVwZGF0ZVRpbWVyRmlyZWQpKTsKKworICAgICAgICBtX2luaXRp
YWxpemVSdW5Mb29wQ29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0KKyAgICBSZWZQdHI8Q29vcmRp
bmF0ZWRHcmFwaGljc1NjZW5lPiBzY2VuZSA9IG1fc2NlbmU7CisKKyAgICBtX3J1bkxvb3AtPnJ1
bigpOworCisgICAgc2NlbmUtPnB1cmdlR0xSZXNvdXJjZXMoKTsKKworICAgIHsKKyAgICAgICAg
TXV0ZXhMb2NrZXIgbG9ja2VyKG1fdGVybWluYXRlUnVuTG9vcENvbmRpdGlvbk11dGV4KTsKKyAg
ICAgICAgaWYgKG1fdXBkYXRlVGltZXItPmlzQWN0aXZlKCkpCisgICAgICAgICAgICBtX3VwZGF0
ZVRpbWVyLT5zdG9wKCk7CisgICAgICAgIG1fdGVybWluYXRlUnVuTG9vcENvbmRpdGlvbi5zaWdu
YWwoKTsKKyAgICB9CisKKyAgICBkZXRhY2hUaHJlYWQobV90aHJlYWRJZGVudGlmaWVyKTsKK30K
Kwordm9pZCBDb29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkOjpjcmVhdGVDb21wb3NpdGluZ1Ro
cmVhZCgpCit7CisgICAgaWYgKG1fdGhyZWFkSWRlbnRpZmllcikKKyAgICAgICAgcmV0dXJuOwor
CisgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1faW5pdGlhbGl6ZVJ1bkxvb3BDb25kaXRpb25NdXRl
eCk7CisgICAgbV90aHJlYWRJZGVudGlmaWVyID0gY3JlYXRlVGhyZWFkKHRocmVhZENhbGxiYWNr
LCB0aGlzLCAiV2ViS2l0OiBDb29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkIik7CisKKyAgICBt
X2luaXRpYWxpemVSdW5Mb29wQ29uZGl0aW9uLndhaXQobV9pbml0aWFsaXplUnVuTG9vcENvbmRp
dGlvbk11dGV4KTsKK30KKwordm9pZCBDb29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkOjp0ZXJt
aW5hdGVDb21wb3NpdGluZ1RocmVhZCgpCit7CisgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1fdGVy
bWluYXRlUnVuTG9vcENvbmRpdGlvbk11dGV4KTsKKworICAgIG1fcnVuTG9vcC0+c3RvcCgpOwor
CisgICAgbV90ZXJtaW5hdGVSdW5Mb29wQ29uZGl0aW9uLndhaXQobV90ZXJtaW5hdGVSdW5Mb29w
Q29uZGl0aW9uTXV0ZXgpOworfQorCit9CisjZW5kaWYgLy8gVVNFKENPT1JESU5BVEVEX0dSQVBI
SUNTX1RIUkVBREVEKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvdGV4bWFwL3RocmVhZGVkY29tcG9zaXRvci9Db29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFk
LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvdGhyZWFkZWRjb21w
b3NpdG9yL0Nvb3JkaW5hdGVkQ29tcG9zaXRpbmdUaHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41MjYxY2Vi
NzJlYjI0MmNiZDAzOWQ0YTU2OGFkNmIzOTFlMTVmMmE5Ci0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL3RocmVhZGVkY29tcG9zaXRvci9D
b29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTMgQ29tcGFueSAxMDAsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2lmbmRlZiBDb29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkX2gKKyNkZWZp
bmUgQ29vcmRpbmF0ZWRDb21wb3NpdGluZ1RocmVhZF9oCisKKyNpZiBVU0UoQ09PUkRJTkFURURf
R1JBUEhJQ1NfVEhSRUFERUQpCisKKyNpbmNsdWRlICJHTENvbnRleHQuaCIKKyNpbmNsdWRlICJJ
bnRTaXplLmgiCisjaW5jbHVkZSAiUGFnZVZpZXdwb3J0Q29udHJvbGxlci5oIgorI2luY2x1ZGUg
IlJ1bkxvb3AuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUg
PHd0Zi9GYXN0QWxsb2NCYXNlLmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5j
bHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVk
ZSA8d3RmL1RocmVhZGluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIENvb3Jk
aW5hdGVkR3JhcGhpY3NTY2VuZTsKKworY2xhc3MgQ29vcmRpbmF0ZWRDb21wb3NpdGluZ1RocmVh
ZCA6IHB1YmxpYyBQYWdlVmlld3BvcnRDb250cm9sbGVyOjpDbGllbnQgeworICAgIFdURl9NQUtF
X05PTkNPUFlBQkxFKENvb3JkaW5hdGVkQ29tcG9zaXRpbmdUaHJlYWQpOworICAgIFdURl9NQUtF
X0ZBU1RfQUxMT0NBVEVEOworcHVibGljOgorICAgIHN0YXRpYyBQYXNzT3duUHRyPENvb3JkaW5h
dGVkQ29tcG9zaXRpbmdUaHJlYWQ+IGNyZWF0ZShQYXNzUmVmUHRyPENvb3JkaW5hdGVkR3JhcGhp
Y3NTY2VuZT4pOworCisgICAgdmlydHVhbCB+Q29vcmRpbmF0ZWRDb21wb3NpdGluZ1RocmVhZCgp
OworCisgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzRGlzcGxheSgpIE9WRVJSSURFOworICAgIHZp
cnR1YWwgdm9pZCBzZXRWaWV3cG9ydFBvc2l0aW9uQW5kU2NhbGUoY29uc3QgV2ViQ29yZTo6Rmxv
YXRQb2ludCYsIGZsb2F0KSBPVkVSUklERTsKKworICAgIHZvaWQgc2V0TmF0aXZlU3VyZmFjZUhh
bmRsZUZvckNvbXBvc2l0aW5nKHVpbnQ2NF90KTsKKworcHJpdmF0ZToKKyAgICBleHBsaWNpdCBD
b29yZGluYXRlZENvbXBvc2l0aW5nVGhyZWFkKFBhc3NSZWZQdHI8Q29vcmRpbmF0ZWRHcmFwaGlj
c1NjZW5lPik7CisKKyAgICB2b2lkIHVwZGF0ZVZpZXdwb3J0UG9zaXRpb25BbmRTY2FsZShjb25z
dCBXZWJDb3JlOjpGbG9hdFBvaW50JiwgZmxvYXQpOworCisgICAgdm9pZCByZW5kZXJMYXllclRy
ZWUoKTsKKworICAgIHZvaWQgY3JlYXRlQ29tcG9zaXRpbmdUaHJlYWQoKTsKKyAgICB2b2lkIHRl
cm1pbmF0ZUNvbXBvc2l0aW5nVGhyZWFkKCk7CisgICAgdm9pZCBydW5Mb29wKCk7CisgICAgc3Rh
dGljIHZvaWQgdGhyZWFkQ2FsbGJhY2sodm9pZCogY29tcG9zaXRpbmdUaHJlYWQpOworCisgICAg
dm9pZCB1cGRhdGVUaW1lckZpcmVkKCk7CisgICAgdm9pZCBzY2hlZHVsZURpc3BsYXlJZk5lZWRl
ZChkb3VibGUgaW50ZXJ2YWwgPSAwLjBmKTsKKworICAgIGJvb2wgZW5zdXJlR0xDb250ZXh0KCk7
CisgICAgR0xDb250ZXh0KiBnbENvbnRleHQoKTsKKworICAgIFJlZlB0cjxDb29yZGluYXRlZEdy
YXBoaWNzU2NlbmU+IG1fc2NlbmU7CisgICAgT3duUHRyPEdMQ29udGV4dD4gbV9jb250ZXh0Owor
CisgICAgSW50U2l6ZSBtX3ZpZXdwb3J0U2l6ZTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBt
X3ZpZXdwb3J0VHJhbnNmb3JtOworICAgIHVpbnQ2NF90IG1fbmF0aXZlU3VyZmFjZUhhbmRsZTsK
KworICAgIFRocmVhZElkZW50aWZpZXIgbV90aHJlYWRJZGVudGlmaWVyOworICAgIFRocmVhZENv
bmRpdGlvbiBtX2luaXRpYWxpemVSdW5Mb29wQ29uZGl0aW9uOworICAgIE11dGV4IG1faW5pdGlh
bGl6ZVJ1bkxvb3BDb25kaXRpb25NdXRleDsKKyAgICBUaHJlYWRDb25kaXRpb24gbV90ZXJtaW5h
dGVSdW5Mb29wQ29uZGl0aW9uOworICAgIE11dGV4IG1fdGVybWluYXRlUnVuTG9vcENvbmRpdGlv
bk11dGV4OworCisgICAgTXV0ZXggbV93YWtlVXBNdXRleDsKKyAgICBUaHJlYWRDb25kaXRpb24g
bV93YWtlVXBDb25kaXRpb247CisgICAgYm9vbCBtX2lzQWN0aXZlOworCisgICAgUnVuTG9vcCog
bV9ydW5Mb29wOworICAgIE93blB0cjxSdW5Mb29wOjpUaW1lcjxDb29yZGluYXRlZENvbXBvc2l0
aW5nVGhyZWFkPiA+IG1fdXBkYXRlVGltZXI7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CisKKyNlbmRpZgorCisjZW5kaWYgLy8gQ29vcmRpbmF0ZWRDb21wb3NpdGluZ1RocmVhZF9oCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvdGhyZWFk
ZWRjb21wb3NpdG9yL1BhZ2VWaWV3cG9ydENvbnRyb2xsZXIuY3BwIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL3RocmVhZGVkY29tcG9zaXRvci9QYWdlVmlld3BvcnRD
b250cm9sbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wNmYxMzA0MDYxY2Y5YzI5Yjg4ZGZjYWI1YWNiY2Qy
ZGIwZDA3ZGJhCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvdGV4bWFwL3RocmVhZGVkY29tcG9zaXRvci9QYWdlVmlld3BvcnRDb250cm9sbGVyLmNw
cApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSwgMjAxMiBOb2tp
YSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqIENvcHlyaWdodCAo
QykgMjAxMSBCZW5qYW1pbiBQb3VsYWluIDxiZW5qYW1pbkB3ZWJraXQub3JnPgorICogQ29weXJp
Z2h0IChDKSAyMDEzIENvbXBhbnkgMTAwLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMg
cHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKworI2lmIFVTRShDT09SRElOQVRFRF9HUkFQSElDU19USFJFQURFRCkK
KyNpbmNsdWRlICJQYWdlVmlld3BvcnRDb250cm9sbGVyLmgiCisKKyNpbmNsdWRlICJUaHJlYWRl
ZENvb3JkaW5hdGVkQ29tcG9zaXRvci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Bhc3NP
d25QdHI8UGFnZVZpZXdwb3J0Q29udHJvbGxlcj4gUGFnZVZpZXdwb3J0Q29udHJvbGxlcjo6Y3Jl
YXRlKFRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yKiBjb21wb3NpdG9yLCBDbGllbnQqIGNs
aWVudCkKK3sKKyAgICByZXR1cm4gYWRvcHRQdHIobmV3IFBhZ2VWaWV3cG9ydENvbnRyb2xsZXIo
Y29tcG9zaXRvciwgY2xpZW50KSk7Cit9CisKK1BhZ2VWaWV3cG9ydENvbnRyb2xsZXI6OlBhZ2VW
aWV3cG9ydENvbnRyb2xsZXIoVGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3IqIGNvbXBvc2l0
b3IsIENsaWVudCogY2xpZW50KQorICAgIDogbV9jb21wb3NpdG9yKGNvbXBvc2l0b3IpCisgICAg
LCBtX2NsaWVudChjbGllbnQpCisgICAgLCBtX2NvbnRlbnRzUG9zaXRpb24oRmxvYXRQb2ludCgp
KQorICAgICwgbV9jb250ZW50c1NpemUoRmxvYXRTaXplKCkpCisgICAgLCBtX3ZpZXdwb3J0U2l6
ZShGbG9hdFNpemUoKSkKKyAgICAsIG1fcGFnZVNjYWxlRmFjdG9yKDEuMCkKKyAgICAsIG1fYWxs
b3dzVXNlclNjYWxpbmcoZmFsc2UpCisgICAgLCBtX21pbmltdW1TY2FsZVRvRml0KDEpCisgICAg
LCBtX2luaXRpYWxseUZpdFRvVmlld3BvcnQodHJ1ZSkKK3sKKyAgICAvLyBJbml0aWFsaXppbmcg
Vmlld3BvcnQgUmF3IEF0dHJpYnV0ZXMgdG8gYXZvaWQgcmFuZG9tIG5lZ2F0aXZlIG9yIGluZmlu
aXR5IHNjYWxlIGZhY3RvcnMKKyAgICAvLyBpZiB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIGJl
dHdlZW4gdGhlIGZpcnN0IGxheW91dCBhbmQgc2V0dGluZyB0aGUgdmlld3BvcnQgYXR0cmlidXRl
cyBmb3IgdGhlIGZpcnN0IHRpbWUuCisgICAgbV9yYXdBdHRyaWJ1dGVzLm1pbmltdW1TY2FsZSA9
IDE7CisgICAgbV9yYXdBdHRyaWJ1dGVzLm1heGltdW1TY2FsZSA9IDE7CisgICAgbV9yYXdBdHRy
aWJ1dGVzLnVzZXJTY2FsYWJsZSA9IG1fYWxsb3dzVXNlclNjYWxpbmc7CisKKyAgICAvLyBUaGUg
aW5pdGlhbCBzY2FsZSBtaWdodCBiZSBpbXBsaWNpdCBhbmQgc2V0IHRvIC0xLCBpbiB0aGlzIGNh
c2Ugd2UgaGF2ZSB0byBpbmZlciBpdAorICAgIC8vIHVzaW5nIHRoZSB2aWV3cG9ydCBzaXplIGFu
ZCB0aGUgZmluYWwgbGF5b3V0IHNpemUuCisgICAgLy8gVG8gYmUgYWJsZSB0byBhc3NlcnQgZm9y
IHZhbGlkIHNjYWxlIHdlIGluaXRpYWxpemUgaXQgdG8gLTEuCisgICAgbV9yYXdBdHRyaWJ1dGVz
LmluaXRpYWxTY2FsZSA9IC0xOworfQorCit2b2lkIFBhZ2VWaWV3cG9ydENvbnRyb2xsZXI6OmRp
ZENoYW5nZVZpZXdwb3J0U2l6ZShjb25zdCBGbG9hdFNpemUmIG5ld1NpemUpCit7CisgICAgaWYg
KG5ld1NpemUuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3ZpZXdwb3J0U2l6
ZSA9IG5ld1NpemU7CisgICAgdXBkYXRlTWluaW11bVNjYWxlVG9GaXQoKTsKKyAgICBzeW5jVmlz
aWJsZUNvbnRlbnRzKCk7Cit9CisKK3ZvaWQgUGFnZVZpZXdwb3J0Q29udHJvbGxlcjo6ZGlkQ2hh
bmdlQ29udGVudHNTaXplKGNvbnN0IEludFNpemUmIG5ld1NpemUpCit7CisgICAgbV9jb250ZW50
c1NpemUgPSBuZXdTaXplOworCisgICAgdXBkYXRlTWluaW11bVNjYWxlVG9GaXQoKTsKKworICAg
IGlmIChtX2luaXRpYWxseUZpdFRvVmlld3BvcnQpIHsKKyAgICAgICAgLy8gUmVzdHJpY3Qgc2Nh
bGUgZmFjdG9ycyB0byBtX21pbmltdW1TY2FsZVRvRml0LgorICAgICAgICBBU1NFUlQobV9taW5p
bXVtU2NhbGVUb0ZpdCA+IDApOworICAgICAgICBtX3Jhd0F0dHJpYnV0ZXMuaW5pdGlhbFNjYWxl
ID0gbV9taW5pbXVtU2NhbGVUb0ZpdDsKKyAgICAgICAgcmVzdHJpY3RTY2FsZUZhY3RvclRvSW5p
dGlhbFNjYWxlSWZOb3RVc2VyU2NhbGFibGUobV9yYXdBdHRyaWJ1dGVzKTsKKyAgICB9CisKKyAg
ICBzeW5jVmlzaWJsZUNvbnRlbnRzKCk7Cit9CisKK3ZvaWQgUGFnZVZpZXdwb3J0Q29udHJvbGxl
cjo6ZGlkQ2hhbmdlVmlld3BvcnRBdHRyaWJ1dGUoY29uc3QgVmlld3BvcnRBdHRyaWJ1dGVzJiBu
ZXdBdHRyaWJ1dGVzKQoreworICAgIGlmIChuZXdBdHRyaWJ1dGVzLmxheW91dFNpemUuaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Jhd0F0dHJpYnV0ZXMgPSBuZXdBdHRyaWJ1
dGVzOworICAgIG1fYWxsb3dzVXNlclNjYWxpbmcgPSAhIW1fcmF3QXR0cmlidXRlcy51c2VyU2Nh
bGFibGU7CisgICAgbV9pbml0aWFsbHlGaXRUb1ZpZXdwb3J0ID0gKG1fcmF3QXR0cmlidXRlcy5p
bml0aWFsU2NhbGUgPCAwKTsKKworICAgIGlmICghbV9pbml0aWFsbHlGaXRUb1ZpZXdwb3J0KQor
ICAgICAgICByZXN0cmljdFNjYWxlRmFjdG9yVG9Jbml0aWFsU2NhbGVJZk5vdFVzZXJTY2FsYWJs
ZShtX3Jhd0F0dHJpYnV0ZXMpOworCisgICAgdXBkYXRlTWluaW11bVNjYWxlVG9GaXQoKTsKKwor
ICAgIG1fY2xpZW50LT5zZXROZWVkc0Rpc3BsYXkoKTsKK30KKwordm9pZCBQYWdlVmlld3BvcnRD
b250cm9sbGVyOjpzY3JvbGxCeShjb25zdCBJbnRTaXplJiBzY3JvbGxPZmZzZXQpCit7CisgICAg
bV9jb250ZW50c1Bvc2l0aW9uLm1vdmUoc2Nyb2xsT2Zmc2V0KTsKKyAgICBzeW5jVmlzaWJsZUNv
bnRlbnRzKCk7Cit9CisKK3ZvaWQgUGFnZVZpZXdwb3J0Q29udHJvbGxlcjo6c2Nyb2xsVG8oY29u
c3QgSW50UG9pbnQmIHBvc2l0aW9uKQoreworICAgIG1fY29udGVudHNQb3NpdGlvbiA9IHBvc2l0
aW9uOworICAgIHN5bmNWaXNpYmxlQ29udGVudHMoKTsKK30KKwordm9pZCBQYWdlVmlld3BvcnRD
b250cm9sbGVyOjpkaWRSZW5kZXJGcmFtZShjb25zdCBJbnRTaXplJiBjb250ZW50c1NpemUsIGNv
bnN0IEludFJlY3QmIGNvdmVyZWRSZWN0KQoreworICAgIGRpZENoYW5nZUNvbnRlbnRzVmlzaWJp
bGl0eShtX2NvbnRlbnRzUG9zaXRpb24sIG1fcGFnZVNjYWxlRmFjdG9yKTsKK30KKwordm9pZCBQ
YWdlVmlld3BvcnRDb250cm9sbGVyOjpkaWRDaGFuZ2VDb250ZW50c1Zpc2liaWxpdHkoY29uc3Qg
RmxvYXRQb2ludCYgcG9zaXRpb24sIGZsb2F0IHNjYWxlKQoreworICAgIG1fY29udGVudHNQb3Np
dGlvbiA9IHBvc2l0aW9uOworICAgIG1fcGFnZVNjYWxlRmFjdG9yID0gc2NhbGU7CisgICAgc3lu
Y1Zpc2libGVDb250ZW50cygpOworfQorCit2b2lkIFBhZ2VWaWV3cG9ydENvbnRyb2xsZXI6OnN5
bmNWaXNpYmxlQ29udGVudHMoKQoreworICAgIGlmIChtX3ZpZXdwb3J0U2l6ZS5pc0VtcHR5KCkg
fHwgbV9jb250ZW50c1NpemUuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBGbG9h
dFJlY3QgdmlzaWJsZUNvbnRlbnRzUmVjdChib3VuZENvbnRlbnRzUG9zaXRpb24obV9jb250ZW50
c1Bvc2l0aW9uKSwgdmlzaWJsZUNvbnRlbnRzU2l6ZSgpKTsKKyAgICB2aXNpYmxlQ29udGVudHNS
ZWN0LmludGVyc2VjdChGbG9hdFJlY3QoRmxvYXRQb2ludDo6emVybygpLCBtX2NvbnRlbnRzU2l6
ZSkpOworCisgICAgbV9jb21wb3NpdG9yLT5zZXRWaXNpYmxlQ29udGVudHNSZWN0KHZpc2libGVD
b250ZW50c1JlY3QsIEZsb2F0UG9pbnQ6Onplcm8oKSwgbV9wYWdlU2NhbGVGYWN0b3IpOworICAg
IG1fY2xpZW50LT5zZXRWaWV3cG9ydFBvc2l0aW9uQW5kU2NhbGUodmlzaWJsZUNvbnRlbnRzUmVj
dC5sb2NhdGlvbigpLCBtX3BhZ2VTY2FsZUZhY3Rvcik7Cit9CisKK0Zsb2F0U2l6ZSBQYWdlVmll
d3BvcnRDb250cm9sbGVyOjp2aXNpYmxlQ29udGVudHNTaXplKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gRmxvYXRTaXplKG1fdmlld3BvcnRTaXplLndpZHRoKCkgLyBtX3BhZ2VTY2FsZUZhY3Rvciwg
bV92aWV3cG9ydFNpemUuaGVpZ2h0KCkgLyBtX3BhZ2VTY2FsZUZhY3Rvcik7Cit9CisKK0Zsb2F0
UG9pbnQgUGFnZVZpZXdwb3J0Q29udHJvbGxlcjo6Ym91bmRDb250ZW50c1Bvc2l0aW9uQXRTY2Fs
ZShjb25zdCBGbG9hdFBvaW50JiBmcmFtZVBvc2l0aW9uLCBmbG9hdCBzY2FsZSkKK3sKKyAgICAv
LyBXZSBuZWVkIHRvIGZsb29yIHRoZSB2aWV3cG9ydCBoZXJlIGFzIHRvIGFsbG93IGFsaWduaW5n
IHRoZSBjb250ZW50IGluIGRldmljZSB1bml0cy4gSWYgbm90LAorICAgIC8vIGl0IG1pZ2h0IG5v
dCBiZSBwb3NzaWJsZSB0byBzY3JvbGwgdGhlIGxhc3QgcGl4ZWwgYW5kIHRoYXQgYWZmZWN0cyBm
aXhlZCBwb3NpdGlvbiBlbGVtZW50cy4KKyAgICBGbG9hdFJlY3QgYm91bmRzOworICAgIGJvdW5k
cy5zZXRXaWR0aChzdGQ6Om1heCgwLmYsIG1fY29udGVudHNTaXplLndpZHRoKCkgLSBmbG9vcmYo
bV92aWV3cG9ydFNpemUud2lkdGgoKSAvIHNjYWxlKSkpOworICAgIGJvdW5kcy5zZXRIZWlnaHQo
c3RkOjptYXgoMC5mLCBtX2NvbnRlbnRzU2l6ZS5oZWlnaHQoKSAtIGZsb29yZihtX3ZpZXdwb3J0
U2l6ZS5oZWlnaHQoKSAvIHNjYWxlKSkpOworCisgICAgRmxvYXRQb2ludCBwb3NpdGlvbjsKKyAg
ICBwb3NpdGlvbi5zZXRYKGNsYW1wVG8oZnJhbWVQb3NpdGlvbi54KCksIGJvdW5kcy54KCksIGJv
dW5kcy53aWR0aCgpKSk7CisgICAgcG9zaXRpb24uc2V0WShjbGFtcFRvKGZyYW1lUG9zaXRpb24u
eSgpLCBib3VuZHMueSgpLCBib3VuZHMuaGVpZ2h0KCkpKTsKKworICAgIHJldHVybiBwb3NpdGlv
bjsKK30KKworRmxvYXRQb2ludCBQYWdlVmlld3BvcnRDb250cm9sbGVyOjpib3VuZENvbnRlbnRz
UG9zaXRpb24oY29uc3QgRmxvYXRQb2ludCYgZnJhbWVQb3NpdGlvbikKK3sKKyAgICByZXR1cm4g
Ym91bmRDb250ZW50c1Bvc2l0aW9uQXRTY2FsZShmcmFtZVBvc2l0aW9uLCBtX3BhZ2VTY2FsZUZh
Y3Rvcik7Cit9CisKK2Jvb2wgZnV6enlDb21wYXJlKGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IGVw
c2lsb24pCit7CisgICAgcmV0dXJuIHN0ZDo6YWJzKGEgLSBiKSA8IGVwc2lsb247Cit9CisKK2Jv
b2wgUGFnZVZpZXdwb3J0Q29udHJvbGxlcjo6dXBkYXRlTWluaW11bVNjYWxlVG9GaXQoKQorewor
ICAgIGlmIChtX3ZpZXdwb3J0U2l6ZS5pc0VtcHR5KCkgfHwgbV9jb250ZW50c1NpemUuaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBib29sIGN1cnJlbnRseVNjYWxlZFRv
Rml0ID0gZnV6enlDb21wYXJlKG1fcGFnZVNjYWxlRmFjdG9yLCBtX21pbmltdW1TY2FsZVRvRml0
LCAwLjAwMDEpOworCisgICAgZmxvYXQgbWluaW11bVNjYWxlID0gY29tcHV0ZU1pbmltdW1TY2Fs
ZUZhY3RvckZvckNvbnRlbnRDb250YWluZWQobV9yYXdBdHRyaWJ1dGVzLCByb3VuZGVkSW50U2l6
ZShtX3ZpZXdwb3J0U2l6ZSksIHJvdW5kZWRJbnRTaXplKG1fY29udGVudHNTaXplKSk7CisKKyAg
ICBpZiAobWluaW11bVNjYWxlIDw9IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlm
ICghZnV6enlDb21wYXJlKG1pbmltdW1TY2FsZSwgbV9taW5pbXVtU2NhbGVUb0ZpdCwgMC4wMDAx
KSkgeworICAgICAgICBtX21pbmltdW1TY2FsZVRvRml0ID0gbWluaW11bVNjYWxlOworCisgICAg
ICAgIGlmIChjdXJyZW50bHlTY2FsZWRUb0ZpdCkKKyAgICAgICAgICAgIG1fcGFnZVNjYWxlRmFj
dG9yID0gbV9taW5pbXVtU2NhbGVUb0ZpdDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAv
LyBFbnN1cmUgdGhlIGVmZmVjdGl2ZSBzY2FsZSBzdGF5cyB3aXRoaW4gYm91bmRzLgorICAgICAg
ICAgICAgZmxvYXQgYm91bmRlZFNjYWxlID0gaW5uZXJCb3VuZGVkVmlld3BvcnRTY2FsZShtX3Bh
Z2VTY2FsZUZhY3Rvcik7CisgICAgICAgICAgICBpZiAoIWZ1enp5Q29tcGFyZShib3VuZGVkU2Nh
bGUsIG1fcGFnZVNjYWxlRmFjdG9yLCAwLjAwMDEpKQorICAgICAgICAgICAgICAgIG1fcGFnZVNj
YWxlRmFjdG9yID0gYm91bmRlZFNjYWxlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworZmxvYXQgUGFnZVZpZXdwb3J0Q29u
dHJvbGxlcjo6aW5uZXJCb3VuZGVkVmlld3BvcnRTY2FsZShmbG9hdCB2aWV3cG9ydFNjYWxlKSBj
b25zdAoreworICAgIHJldHVybiBjbGFtcFRvKHZpZXdwb3J0U2NhbGUsIG1fbWluaW11bVNjYWxl
VG9GaXQsIG1fcmF3QXR0cmlidXRlcy5tYXhpbXVtU2NhbGUpOworfQorCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQ09PUkRJTkFURURfR1JBUEhJQ1NfVEhSRUFERUQp
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvdGhy
ZWFkZWRjb21wb3NpdG9yL1BhZ2VWaWV3cG9ydENvbnRyb2xsZXIuaCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC90aHJlYWRlZGNvbXBvc2l0b3IvUGFnZVZpZXdwb3J0
Q29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjA5YTc1OWQ3NjUwNTAzOTFkZjRkYmE5NzgzNTVmNjk3
Njg5ODNiZDQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy90ZXhtYXAvdGhyZWFkZWRjb21wb3NpdG9yL1BhZ2VWaWV3cG9ydENvbnRyb2xsZXIuaApA
QCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIE5va2lhIENv
cnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICogQ29weXJpZ2h0IChDKSAy
MDExIEJlbmphbWluIFBvdWxhaW4gPGJlbmphbWluQHdlYmtpdC5vcmc+CisgKiBDb3B5cmlnaHQg
KEMpIDIwMTMgQ29tcGFueSAxMDAsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9n
cmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo
IEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBQ
YWdlVmlld3BvcnRDb250cm9sbGVyX2gKKyNkZWZpbmUgUGFnZVZpZXdwb3J0Q29udHJvbGxlcl9o
CisKKyNpZiBVU0UoQ09PUkRJTkFURURfR1JBUEhJQ1NfVEhSRUFERUQpCisKKyNpbmNsdWRlICJG
bG9hdFBvaW50LmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiRmxvYXRTaXpl
LmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIkludFNpemUuaCIKKyNpbmNsdWRl
ICJWaWV3cG9ydEFyZ3VtZW50cy5oIgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgVGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I7
CisKK2NsYXNzIFBhZ2VWaWV3cG9ydENvbnRyb2xsZXIgeworICAgIFdURl9NQUtFX05PTkNPUFlB
QkxFKFBhZ2VWaWV3cG9ydENvbnRyb2xsZXIpOworcHVibGljOgorICAgIGNsYXNzIENsaWVudCB7
CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0Vmlld3BvcnRQb3NpdGlvbkFu
ZFNjYWxlKGNvbnN0IEZsb2F0UG9pbnQmLCBmbG9hdCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZv
aWQgc2V0TmVlZHNEaXNwbGF5KCkgPSAwOworICAgIH07CisKKyAgICBzdGF0aWMgUGFzc093blB0
cjxQYWdlVmlld3BvcnRDb250cm9sbGVyPiBjcmVhdGUoVGhyZWFkZWRDb29yZGluYXRlZENvbXBv
c2l0b3IqLCBDbGllbnQqKTsKKworICAgIEZsb2F0U2l6ZSB2aXNpYmxlQ29udGVudHNTaXplKCkg
Y29uc3Q7CisKKyAgICAvLyBGcm9tIFdlYkNvcmUKKyAgICB2b2lkIGRpZENoYW5nZVZpZXdwb3J0
U2l6ZShjb25zdCBGbG9hdFNpemUmKTsKKyAgICB2b2lkIGRpZENoYW5nZUNvbnRlbnRzU2l6ZShj
b25zdCBJbnRTaXplJik7CisgICAgdm9pZCBkaWRDaGFuZ2VWaWV3cG9ydEF0dHJpYnV0ZShjb25z
dCBWaWV3cG9ydEF0dHJpYnV0ZXMmKTsKKworICAgIHZvaWQgc2Nyb2xsQnkoY29uc3QgSW50U2l6
ZSYpOworICAgIHZvaWQgc2Nyb2xsVG8oY29uc3QgSW50UG9pbnQmKTsKKworICAgIHZvaWQgZGlk
UmVuZGVyRnJhbWUoY29uc3QgSW50U2l6ZSYgY29udGVudHNTaXplLCBjb25zdCBJbnRSZWN0JiBj
b3ZlcmVkUmVjdCk7CisKK3ByaXZhdGU6CisgICAgUGFnZVZpZXdwb3J0Q29udHJvbGxlcihUaHJl
YWRlZENvb3JkaW5hdGVkQ29tcG9zaXRvciosIENsaWVudCopOworCisgICAgdm9pZCBkaWRDaGFu
Z2VDb250ZW50c1Zpc2liaWxpdHkoY29uc3QgRmxvYXRQb2ludCYgcG9zaXRpb24sIGZsb2F0IHNj
YWxlKTsKKyAgICB2b2lkIHN5bmNWaXNpYmxlQ29udGVudHMoKTsKKworICAgIHZvaWQgYXBwbHlT
Y2FsZUFmdGVyUmVuZGVyaW5nQ29udGVudHMoZmxvYXQgc2NhbGUpOworICAgIHZvaWQgYXBwbHlQ
b3NpdGlvbkFmdGVyUmVuZGVyaW5nQ29udGVudHMoY29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludCYg
cG9zKTsKKworICAgIEZsb2F0UG9pbnQgYm91bmRDb250ZW50c1Bvc2l0aW9uKGNvbnN0IEZsb2F0
UG9pbnQmKTsKKyAgICBGbG9hdFBvaW50IGJvdW5kQ29udGVudHNQb3NpdGlvbkF0U2NhbGUoY29u
c3QgRmxvYXRQb2ludCYsIGZsb2F0IHNjYWxlKTsKKworICAgIGJvb2wgdXBkYXRlTWluaW11bVNj
YWxlVG9GaXQoKTsKKyAgICBmbG9hdCBpbm5lckJvdW5kZWRWaWV3cG9ydFNjYWxlKGZsb2F0KSBj
b25zdDsKKworICAgIFRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yKiBtX2NvbXBvc2l0b3I7
CisgICAgQ2xpZW50KiBtX2NsaWVudDsKKworICAgIEZsb2F0UG9pbnQgbV9jb250ZW50c1Bvc2l0
aW9uOworICAgIEZsb2F0U2l6ZSBtX2NvbnRlbnRzU2l6ZTsKKyAgICBGbG9hdFNpemUgbV92aWV3
cG9ydFNpemU7CisgICAgZmxvYXQgbV9wYWdlU2NhbGVGYWN0b3I7CisKKyAgICBib29sIG1fYWxs
b3dzVXNlclNjYWxpbmc7CisgICAgZmxvYXQgbV9taW5pbXVtU2NhbGVUb0ZpdDsKKyAgICBib29s
IG1faW5pdGlhbGx5Rml0VG9WaWV3cG9ydDsKKworICAgIFZpZXdwb3J0QXR0cmlidXRlcyBtX3Jh
d0F0dHJpYnV0ZXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBV
U0UoQ09PUkRJTkFURURfR1JBUEhJQ1NfVEhSRUFERUQpCisKKyNlbmRpZiAvLyBQYWdlVmlld3Bv
cnRDb250cm9sbGVyX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3RleG1hcC90aHJlYWRlZGNvbXBvc2l0b3IvVGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0
b3IuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvdGV4bWFwL3RocmVhZGVk
Y29tcG9zaXRvci9UaHJlYWRlZENvb3JkaW5hdGVkQ29tcG9zaXRvci5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
MDBmYTE0ODI1MzhmY2U4ZDIzNmJiOGI4NjJjYTE3YTAwMWVkZDg1ZQotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC90aHJlYWRlZGNvbXBv
c2l0b3IvVGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3IuY3BwCkBAIC0wLDAgKzEsMjUwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIENvbXBhbnkgMTAwLCBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
KyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisg
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShDT09S
RElOQVRFRF9HUkFQSElDU19USFJFQURFRCkKKyNpbmNsdWRlICJUaHJlYWRlZENvb3JkaW5hdGVk
Q29tcG9zaXRvci5oIgorCisjaW5jbHVkZSAiQ29vcmRpbmF0ZWRHcmFwaGljc0xheWVyLmgiCisj
aW5jbHVkZSAiQ29vcmRpbmF0ZWRHcmFwaGljc1N0YXRlLmgiCisjaW5jbHVkZSAiRnJhbWUuaCIK
KyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNp
bmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiVGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFjZS5o
IgorI2luY2x1ZGUgPHd0Zi9DdXJyZW50VGltZS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K1Bhc3NPd25QdHI8VGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I+IFRocmVhZGVkQ29vcmRp
bmF0ZWRDb21wb3NpdG9yOjpjcmVhdGUoUGFnZSogcGFnZSwgQ2xpZW50KiBjbGllbnQsIGNvbnN0
IEludFNpemUmIGluaXRTaXplKQoreworICAgIHJldHVybiBhZG9wdFB0cihuZXcgVGhyZWFkZWRD
b29yZGluYXRlZENvbXBvc2l0b3IocGFnZSwgY2xpZW50LCBpbml0U2l6ZSkpOworfQorCitUaHJl
YWRlZENvb3JkaW5hdGVkQ29tcG9zaXRvcjo6VGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3Io
UGFnZSogcGFnZSwgQ2xpZW50KiBjbGllbnQsIGNvbnN0IEludFNpemUmIGluaXRTaXplKQorICAg
IDogbV9wYWdlKHBhZ2UpCisgICAgLCBtX2NsaWVudChjbGllbnQpCisgICAgLCBtX25vdGlmeUFm
dGVyU2NoZWR1bGVkTGF5ZXJGbHVzaChmYWxzZSkKKyAgICAsIG1faXNWYWxpZCh0cnVlKQorICAg
ICwgbV9pc1N1c3BlbmRlZChmYWxzZSkKKyAgICAsIG1faXNXYWl0aW5nRm9yUmVuZGVyZXIodHJ1
ZSkKKyAgICAsIG1fbGF5ZXJGbHVzaFRpbWVyKFJ1bkxvb3A6Om1haW4oKSwgdGhpcywgJlRocmVh
ZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yOjpsYXllckZsdXNoVGltZXJGaXJlZCkKKyAgICAsIG1f
bGF5ZXJGbHVzaFNjaGVkdWxpbmdFbmFibGVkKHRydWUpCit7CisgICAgbV9jb29yZGluYXRvciA9
IENvbXBvc2l0aW5nQ29vcmRpbmF0b3I6OmNyZWF0ZShtX3BhZ2UsIHRoaXMpOworICAgIG1fc2Nl
bmUgPSBhZG9wdFJlZihuZXcgQ29vcmRpbmF0ZWRHcmFwaGljc1NjZW5lKHRoaXMpKTsKKyAgICBt
X2NvbXBvc2l0aW5nVGhyZWFkID0gQ29vcmRpbmF0ZWRDb21wb3NpdGluZ1RocmVhZDo6Y3JlYXRl
KG1fc2NlbmUpOworICAgIG1fdmlld3BvcnRDb250cm9sbGVyID0gUGFnZVZpZXdwb3J0Q29udHJv
bGxlcjo6Y3JlYXRlKHRoaXMsIG1fY29tcG9zaXRpbmdUaHJlYWQuZ2V0KCkpOworCisgICAgbV9j
b29yZGluYXRvci0+Y3JlYXRlUm9vdExheWVyKGluaXRTaXplKTsKKworICAgIENvb3JkaW5hdGVk
U3VyZmFjZTo6c2V0RmFjdG9yeShjcmVhdGVDb29yZGluYXRlZFN1cmZhY2UpOworCisgICAgc2No
ZWR1bGVMYXllckZsdXNoKCk7Cit9CisKK1RocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yOjp+
VGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3IoKQoreworCit9CisKK1Bhc3NSZWZQdHI8Q29v
cmRpbmF0ZWRTdXJmYWNlPiBUaHJlYWRlZENvb3JkaW5hdGVkQ29tcG9zaXRvcjo6Y3JlYXRlQ29v
cmRpbmF0ZWRTdXJmYWNlKGNvbnN0IEludFNpemUmIHNpemUsIENvb3JkaW5hdGVkU3VyZmFjZTo6
RmxhZ3MgZmxhZ3MpCit7CisgICAgcmV0dXJuIFRocmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2U6
OmNyZWF0ZShzaXplLCBmbGFncyk7Cit9CisKK3ZvaWQgVGhyZWFkZWRDb29yZGluYXRlZENvbXBv
c2l0b3I6OnNldExheWVyRmx1c2hTY2hlZHVsaW5nRW5hYmxlZChib29sIGxheWVyRmx1c2hpbmdF
bmFibGVkKQoreworICAgIGlmIChtX2xheWVyRmx1c2hTY2hlZHVsaW5nRW5hYmxlZCA9PSBsYXll
ckZsdXNoaW5nRW5hYmxlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9sYXllckZsdXNoU2No
ZWR1bGluZ0VuYWJsZWQgPSBsYXllckZsdXNoaW5nRW5hYmxlZDsKKworICAgIGlmIChtX2xheWVy
Rmx1c2hTY2hlZHVsaW5nRW5hYmxlZCkgeworICAgICAgICBzY2hlZHVsZUxheWVyRmx1c2goKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNhbmNlbFBlbmRpbmdMYXllckZsdXNoKCk7
Cit9CisKK3ZvaWQgVGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OnNjaGVkdWxlTGF5ZXJG
bHVzaCgpCit7CisgICAgaWYgKCFtX2xheWVyRmx1c2hTY2hlZHVsaW5nRW5hYmxlZCkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgaWYgKCFtX2xheWVyRmx1c2hUaW1lci5pc0FjdGl2ZSgpKQorICAg
ICAgICBtX2xheWVyRmx1c2hUaW1lci5zdGFydE9uZVNob3QoMCk7Cit9CisKK3ZvaWQgVGhyZWFk
ZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OmxheWVyRmx1c2hUaW1lckZpcmVkKCkKK3sKKyAgICBw
ZXJmb3JtU2NoZWR1bGVkTGF5ZXJGbHVzaCgpOworfQorCit2b2lkIFRocmVhZGVkQ29vcmRpbmF0
ZWRDb21wb3NpdG9yOjp2aWV3cG9ydFNpemVDaGFuZ2VkKGNvbnN0IEludFNpemUmIG5ld1NpemUp
Cit7CisgICAgbV92aWV3cG9ydENvbnRyb2xsZXItPmRpZENoYW5nZVZpZXdwb3J0U2l6ZShuZXdT
aXplKTsKK30KKwordm9pZCBUaHJlYWRlZENvb3JkaW5hdGVkQ29tcG9zaXRvcjo6dmlld3BvcnRB
dHRyaWJ1dGVDaGFuZ2VkKGNvbnN0IFZpZXdwb3J0QXR0cmlidXRlcyYgYXR0cikKK3sKKyAgICBt
X3ZpZXdwb3J0Q29udHJvbGxlci0+ZGlkQ2hhbmdlVmlld3BvcnRBdHRyaWJ1dGUoYXR0cik7Cit9
CisKK3ZvaWQgVGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OmRldmljZU9yUGFnZVNjYWxl
RmFjdG9yQ2hhbmdlZCgpCit7CisgICAgbV9jb29yZGluYXRvci0+ZGV2aWNlT3JQYWdlU2NhbGVG
YWN0b3JDaGFuZ2VkKCk7Cit9CisKK3ZvaWQgVGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6
OnNldFNob3VsZE5vdGlmeUFmdGVyTmV4dFNjaGVkdWxlZExheWVyRmx1c2goYm9vbCBub3RpZnlB
ZnRlclNjaGVkdWxlZExheWVyRmx1c2gpCit7CisgICAgbV9ub3RpZnlBZnRlclNjaGVkdWxlZExh
eWVyRmx1c2ggPSBub3RpZnlBZnRlclNjaGVkdWxlZExheWVyRmx1c2g7Cit9CisKK3ZvaWQgVGhy
ZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OnNldFJvb3RDb21wb3NpdGluZ0xheWVyKEdyYXBo
aWNzTGF5ZXIqIGdyYXBoaWNzTGF5ZXIpCit7CisgICAgbV9jb29yZGluYXRvci0+c2V0Um9vdENv
bXBvc2l0aW5nTGF5ZXIoZ3JhcGhpY3NMYXllcik7Cit9CisKK3ZvaWQgVGhyZWFkZWRDb29yZGlu
YXRlZENvbXBvc2l0b3I6OnNjcm9sbFRvKGNvbnN0IEludFBvaW50JiBwb3NpdGlvbikKK3sKKyAg
ICBtX3ZpZXdwb3J0Q29udHJvbGxlci0+c2Nyb2xsVG8ocG9zaXRpb24pOworICAgIHNjaGVkdWxl
TGF5ZXJGbHVzaCgpOworfQorCit2b2lkIFRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yOjpz
Y3JvbGxCeShjb25zdCBJbnRTaXplJiBkZWx0YSkKK3sKKyAgICBtX3ZpZXdwb3J0Q29udHJvbGxl
ci0+c2Nyb2xsQnkoZGVsdGEpOworICAgIHNjaGVkdWxlTGF5ZXJGbHVzaCgpOworfQorCit2b2lk
IFRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yOjpzZXRWaXNpYmxlQ29udGVudHNSZWN0KGNv
bnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgRmxvYXRQb2ludCYgdHJhamVjdG9yeVZlY3Rvciwg
ZmxvYXQgc2NhbGUpCit7CisgICAgZGlzcGF0Y2hVcGRhdGUoYmluZCgmQ29vcmRpbmF0ZWRHcmFw
aGljc1NjZW5lOjpzZXRTY3JvbGxQb3NpdGlvbiwgbV9zY2VuZS5nZXQoKSwgcmVjdC5sb2NhdGlv
bigpKSk7CisgICAgbV9jb29yZGluYXRvci0+c2V0VmlzaWJsZUNvbnRlbnRzUmVjdChyZWN0LCB0
cmFqZWN0b3J5VmVjdG9yKTsKKyAgICBpZiAobV9sYXN0U2Nyb2xsUG9zaXRpb24gIT0gcm91bmRl
ZEludFBvaW50KHJlY3QubG9jYXRpb24oKSkpIHsKKyAgICAgICAgbV9sYXN0U2Nyb2xsUG9zaXRp
b24gPSByb3VuZGVkSW50UG9pbnQocmVjdC5sb2NhdGlvbigpKTsKKyAgICAgICAgbV9wYWdlLT5t
YWluRnJhbWUoKS0+dmlldygpLT5ub3RpZnlTY3JvbGxQb3NpdGlvbkNoYW5nZWQobV9sYXN0U2Ny
b2xsUG9zaXRpb24pOworICAgIH0KKworICAgIGlmIChtX2xhc3RTY2FsZUZhY3RvciAhPSBzY2Fs
ZSkgeworICAgICAgICBtX2xhc3RTY2FsZUZhY3RvciA9IHNjYWxlOworICAgICAgICBtX2NsaWVu
dC0+ZGlkU2NhbGVGYWN0b3JDaGFuZ2VkKG1fbGFzdFNjYWxlRmFjdG9yLCBtX2xhc3RTY3JvbGxQ
b3NpdGlvbik7CisgICAgfQorCisgICAgc2NoZWR1bGVMYXllckZsdXNoKCk7Cit9CisKK3ZvaWQg
VGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OnJlbmRlck5leHRGcmFtZSgpCit7CisgICAg
bV9pc1dhaXRpbmdGb3JSZW5kZXJlciA9IGZhbHNlOworICAgIG1fY29vcmRpbmF0b3ItPnJlbmRl
ck5leHRGcmFtZSgpOworICAgIHNjaGVkdWxlTGF5ZXJGbHVzaCgpOworfQorCit2b2lkIFRocmVh
ZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yOjp1cGRhdGVWaWV3cG9ydCgpCit7CisgICAgbV9jb21w
b3NpdGluZ1RocmVhZC0+c2V0TmVlZHNEaXNwbGF5KCk7Cit9CisKK3ZvaWQgVGhyZWFkZWRDb29y
ZGluYXRlZENvbXBvc2l0b3I6OnB1cmdlQmFja2luZ1N0b3JlcygpCit7CisgICAgbV9jb29yZGlu
YXRvci0+cHVyZ2VCYWNraW5nU3RvcmVzKCk7Cit9CisKK3ZvaWQgVGhyZWFkZWRDb29yZGluYXRl
ZENvbXBvc2l0b3I6OmNvbW1pdFNjcm9sbE9mZnNldCh1aW50MzJfdCBsYXllcklELCBjb25zdCBJ
bnRTaXplJiBvZmZzZXQpCit7CisgICAgbV9jb29yZGluYXRvci0+Y29tbWl0U2Nyb2xsT2Zmc2V0
KGxheWVySUQsIG9mZnNldCk7Cit9CisKKyNpZiBFTkFCTEUoUkVRVUVTVF9BTklNQVRJT05fRlJB
TUUpCit2b2lkIFRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yOjpzY2hlZHVsZUFuaW1hdGlv
bigpCit7CisgICAgaWYgKG1faXNXYWl0aW5nRm9yUmVuZGVyZXIpCisgICAgICAgIHJldHVybjsK
KworICAgIGlmIChtX2xheWVyRmx1c2hUaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX2xheWVyRmx1c2hUaW1lci5zdGFydE9uZVNob3QobV9jb29yZGluYXRvci0+bmV4
dEFuaW1hdGlvblNlcnZpY2VUaW1lKCkpOworICAgIHNjaGVkdWxlTGF5ZXJGbHVzaCgpOworfQor
I2VuZGlmCisKK3ZvaWQgVGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OnNldE5hdGl2ZVN1
cmZhY2VIYW5kbGVGb3JDb21wb3NpdGluZyh1aW50NjRfdCBoYW5kbGUpCit7CisgICAgbV9jb21w
b3NpdGluZ1RocmVhZC0+c2V0TmF0aXZlU3VyZmFjZUhhbmRsZUZvckNvbXBvc2l0aW5nKGhhbmRs
ZSk7Cit9CisKK3ZvaWQgVGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OmNhbmNlbFBlbmRp
bmdMYXllckZsdXNoKCkKK3sKKyAgICBtX2xheWVyRmx1c2hUaW1lci5zdG9wKCk7Cit9CisKK3Zv
aWQgVGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3I6OnBlcmZvcm1TY2hlZHVsZWRMYXllckZs
dXNoKCkKK3sKKyAgICBpZiAobV9pc1N1c3BlbmRlZCB8fCBtX2lzV2FpdGluZ0ZvclJlbmRlcmVy
KQorICAgICAgICByZXR1cm47CisKKyAgICBtX2Nvb3JkaW5hdG9yLT5zeW5jRGlzcGxheVN0YXRl
KCk7CisKKyAgICBpZiAoIW1faXNWYWxpZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9jb29y
ZGluYXRvci0+Zmx1c2hQZW5kaW5nTGF5ZXJDaGFuZ2VzKCk7Cit9CisKK3ZvaWQgVGhyZWFkZWRD
b29yZGluYXRlZENvbXBvc2l0b3I6Om5vdGlmeUZsdXNoUmVxdWlyZWQoKQoreworICAgIHNjaGVk
dWxlTGF5ZXJGbHVzaCgpOworfQorCit2b2lkIFRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9y
Ojpjb21taXRTY2VuZVN0YXRlKENvb3JkaW5hdGVkR3JhcGhpY3NTdGF0ZSYgc3RhdGUpCit7Cisg
ICAgbV9pc1dhaXRpbmdGb3JSZW5kZXJlciA9IHRydWU7CisgICAgZGlzcGF0Y2hVcGRhdGUoYmlu
ZCgmQ29vcmRpbmF0ZWRHcmFwaGljc1NjZW5lOjpjb21taXRTY2VuZVN0YXRlLCBtX3NjZW5lLmdl
dCgpLCBzdGF0ZSkpOworICAgIHVwZGF0ZVZpZXdwb3J0KCk7Cit9CisKK3ZvaWQgVGhyZWFkZWRD
b29yZGluYXRlZENvbXBvc2l0b3I6OnBhaW50TGF5ZXJDb250ZW50cyhjb25zdCBHcmFwaGljc0xh
eWVyKiwgR3JhcGhpY3NDb250ZXh0JiBncmFwaGljc0NvbnRleHQsIGNvbnN0IEludFJlY3QmIGNs
aXBSZWN0KQoreworfQorCit2b2lkIFRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yOjpjb250
ZW50c1NpemVDaGFuZ2VkKGNvbnN0IEludFNpemUmIHNpemUpCit7CisgICAgbV9jb29yZGluYXRv
ci0+c2l6ZURpZENoYW5nZShzaXplKTsKKyAgICBtX3ZpZXdwb3J0Q29udHJvbGxlci0+ZGlkQ2hh
bmdlQ29udGVudHNTaXplKHNpemUpOworfQorCit2b2lkIFRocmVhZGVkQ29vcmRpbmF0ZWRDb21w
b3NpdG9yOjpkaXNwYXRjaFVwZGF0ZShjb25zdCBGdW5jdGlvbjx2b2lkKCk+JiBmdW5jdGlvbikK
K3sKKyAgICBtX3NjZW5lLT5hcHBlbmRVcGRhdGUoZnVuY3Rpb24pOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQ09PUkRJTkFURURfR1JBUEhJQ1NfVEhSRUFE
RUQpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAv
dGhyZWFkZWRjb21wb3NpdG9yL1RocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yLmggYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90ZXhtYXAvdGhyZWFkZWRjb21wb3NpdG9yL1Ro
cmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYWQzMzQ1YTIzOGM1MDVj
OGZjNDc4Y2M4Yzc0MTA4MDBlOWMyNmUzNgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3RleG1hcC90aHJlYWRlZGNvbXBvc2l0b3IvVGhyZWFkZWRD
b29yZGluYXRlZENvbXBvc2l0b3IuaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMyBDb21wYW55IDEwMCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRT
IENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgor
ICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkK
KyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaWZuZGVmIFRocmVhZGVkQ29vcmRpbmF0ZWRDb21wb3NpdG9yX2gKKyNkZWZpbmUgVGhy
ZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3JfaAorCisjaWYgVVNFKENPT1JESU5BVEVEX0dSQVBI
SUNTX1RIUkVBREVEKQorCisjaW5jbHVkZSAiQ29tcG9zaXRpbmdDb29yZGluYXRvci5oIgorI2lu
Y2x1ZGUgIkNvb3JkaW5hdGVkQ29tcG9zaXRpbmdUaHJlYWQuaCIKKyNpbmNsdWRlICJDb29yZGlu
YXRlZEdyYXBoaWNzU2NlbmUuaCIKKyNpbmNsdWRlICJGbG9hdFBvaW50LmgiCisjaW5jbHVkZSAi
RmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIkludFNpemUuaCIK
KyNpbmNsdWRlICJSdW5Mb29wLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlIDx3dGYv
T3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQ29vcmRpbmF0ZWRTdXJm
YWNlOworY2xhc3MgQ29vcmRpbmF0ZWRHcmFwaGljc0xheWVyU3RhdGU7CitjbGFzcyBDb29yZGlu
YXRlZEdyYXBoaWNzU3RhdGU7CitjbGFzcyBHcmFwaGljc0NvbnRleHQ7CitjbGFzcyBHcmFwaGlj
c0xheWVyOworY2xhc3MgR3JhcGhpY3NMYXllckZhY3Rvcnk7CisKK2NsYXNzIFRocmVhZGVkQ29v
cmRpbmF0ZWRDb21wb3NpdG9yIDogcHVibGljIENvbXBvc2l0aW5nQ29vcmRpbmF0b3I6OkNsaWVu
dCwgcHVibGljIENvb3JkaW5hdGVkR3JhcGhpY3NTY2VuZUNsaWVudCB7CisgICAgV1RGX01BS0Vf
Tk9OQ09QWUFCTEUoVGhyZWFkZWRDb29yZGluYXRlZENvbXBvc2l0b3IpOyBXVEZfTUFLRV9GQVNU
X0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBjbGFzcyBDbGllbnQgeworICAgIHB1YmxpYzoKKyAg
ICAgICAgdmlydHVhbCB2b2lkIGRpZFNjYWxlRmFjdG9yQ2hhbmdlZChmbG9hdCBzY2FsZSwgY29u
c3QgSW50UG9pbnQmIG9yaWdpbikgPSAwOworICAgIH07CisKKyAgICB2aXJ0dWFsIH5UaHJlYWRl
ZENvb3JkaW5hdGVkQ29tcG9zaXRvcigpOworCisgICAgc3RhdGljIFBhc3NPd25QdHI8VGhyZWFk
ZWRDb29yZGluYXRlZENvbXBvc2l0b3I+IGNyZWF0ZShQYWdlKiwgQ2xpZW50KiwgY29uc3QgSW50
U2l6ZSYpOworCisgICAgdm9pZCBzZXRMYXllckZsdXNoU2NoZWR1bGluZ0VuYWJsZWQoYm9vbCk7
CisgICAgdm9pZCBzY2hlZHVsZUxheWVyRmx1c2goKTsKKyAgICB2b2lkIHNldFNob3VsZE5vdGlm
eUFmdGVyTmV4dFNjaGVkdWxlZExheWVyRmx1c2goYm9vbCk7CisgICAgdm9pZCBzZXRSb290Q29t
cG9zaXRpbmdMYXllcihHcmFwaGljc0xheWVyKik7CisKKyAgICB2b2lkIHNjcm9sbFRvKGNvbnN0
IEludFBvaW50Jik7CisgICAgdm9pZCBzY3JvbGxCeShjb25zdCBJbnRTaXplJik7CisKKyAgICB2
b2lkIHBhdXNlUmVuZGVyaW5nKCkgeyBtX2lzU3VzcGVuZGVkID0gdHJ1ZTsgfQorICAgIHZvaWQg
cmVzdW1lUmVuZGVyaW5nKCkgeyBtX2lzU3VzcGVuZGVkID0gZmFsc2U7IHNjaGVkdWxlTGF5ZXJG
bHVzaCgpOyB9CisKKyAgICB2b2lkIHZpZXdwb3J0U2l6ZUNoYW5nZWQoY29uc3QgSW50U2l6ZSYp
OworICAgIHZvaWQgY29udGVudHNTaXplQ2hhbmdlZChjb25zdCBJbnRTaXplJik7CisgICAgdm9p
ZCB2aWV3cG9ydEF0dHJpYnV0ZUNoYW5nZWQoY29uc3QgVmlld3BvcnRBdHRyaWJ1dGVzJik7Cisg
ICAgdm9pZCBkZXZpY2VPclBhZ2VTY2FsZUZhY3RvckNoYW5nZWQoKTsKKworICAgIHZvaWQgc2V0
VmlzaWJsZUNvbnRlbnRzUmVjdChjb25zdCBGbG9hdFJlY3QmLCBjb25zdCBGbG9hdFBvaW50Jiwg
ZmxvYXQpOworI2lmIEVOQUJMRShSRVFVRVNUX0FOSU1BVElPTl9GUkFNRSkKKyAgICB2b2lkIHNj
aGVkdWxlQW5pbWF0aW9uKCk7CisjZW5kaWYKKworICAgIEludFBvaW50IHNjcm9sbFBvc2l0aW9u
KCkgY29uc3QgeyByZXR1cm4gbV9sYXN0U2Nyb2xsUG9zaXRpb247IH0KKyAgICBmbG9hdCBzY2Fs
ZUZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1fbGFzdFNjYWxlRmFjdG9yOyB9CisKKyAgICBHcmFw
aGljc0xheWVyRmFjdG9yeSogZ3JhcGhpY3NMYXllckZhY3RvcnkoKSBjb25zdCB7IHJldHVybiBt
X2Nvb3JkaW5hdG9yLmdldCgpOyB9CisgICAgdm9pZCBzZXROYXRpdmVTdXJmYWNlSGFuZGxlRm9y
Q29tcG9zaXRpbmcodWludDY0X3QpOworCisgICAgc3RhdGljIFBhc3NSZWZQdHI8Q29vcmRpbmF0
ZWRTdXJmYWNlPiBjcmVhdGVDb29yZGluYXRlZFN1cmZhY2UoY29uc3QgSW50U2l6ZSYsIENvb3Jk
aW5hdGVkU3VyZmFjZTo6RmxhZ3MpOworCitwcml2YXRlOgorICAgIFRocmVhZGVkQ29vcmRpbmF0
ZWRDb21wb3NpdG9yKFBhZ2UqLCBDbGllbnQqLCBjb25zdCBJbnRTaXplJik7CisKKyAgICB2b2lk
IGNhbmNlbFBlbmRpbmdMYXllckZsdXNoKCk7CisgICAgdm9pZCBwZXJmb3JtU2NoZWR1bGVkTGF5
ZXJGbHVzaCgpOworCisgICAgR3JhcGhpY3NMYXllciogcm9vdExheWVyKCkgeyByZXR1cm4gbV9j
b29yZGluYXRvci0+cm9vdExheWVyKCk7IH0KKworICAgIHZvaWQgbGF5ZXJGbHVzaFRpbWVyRmly
ZWQoKTsKKworICAgIHZvaWQgZGlzcGF0Y2hVcGRhdGUoY29uc3QgRnVuY3Rpb248dm9pZCgpPiYp
OworCisgICAgLy8gQ29vcmRpbmF0ZWRHcmFwaGljc1NjZW5lQ2xpZW50CisgICAgdmlydHVhbCB2
b2lkIHB1cmdlQmFja2luZ1N0b3JlcygpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCByZW5k
ZXJOZXh0RnJhbWUoKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlVmlld3BvcnQo
KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgY29tbWl0U2Nyb2xsT2Zmc2V0KHVpbnQzMl90
IGxheWVySUQsIGNvbnN0IEludFNpemUmIG9mZnNldCkgT1ZFUlJJREU7CisKKyAgICAvLyBDb21w
b3NpdGluZ0Nvb3JkaW5hdG9yOjpDbGllbnQKKyAgICB2aXJ0dWFsIHZvaWQgZGlkRmx1c2hSb290
TGF5ZXIoKSBPVkVSUklERSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgd2lsbFN5bmNMYXllclN0YXRl
KENvb3JkaW5hdGVkR3JhcGhpY3NMYXllclN0YXRlJikgT1ZFUlJJREUgeyB9CisgICAgdmlydHVh
bCB2b2lkIG5vdGlmeUZsdXNoUmVxdWlyZWQoKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQg
Y29tbWl0U2NlbmVTdGF0ZShDb29yZGluYXRlZEdyYXBoaWNzU3RhdGUmKSBPVkVSUklERTsKKyAg
ICB2aXJ0dWFsIHZvaWQgcGFpbnRMYXllckNvbnRlbnRzKGNvbnN0IEdyYXBoaWNzTGF5ZXIqLCBH
cmFwaGljc0NvbnRleHQmLCBjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCkgT1ZFUlJJREU7CisKKyAg
ICBQYWdlKiBtX3BhZ2U7CisgICAgQ2xpZW50KiBtX2NsaWVudDsKKworICAgIE93blB0cjxDb21w
b3NpdGluZ0Nvb3JkaW5hdG9yPiBtX2Nvb3JkaW5hdG9yOworICAgIE93blB0cjxDb29yZGluYXRl
ZENvbXBvc2l0aW5nVGhyZWFkPiBtX2NvbXBvc2l0aW5nVGhyZWFkOworICAgIE93blB0cjxQYWdl
Vmlld3BvcnRDb250cm9sbGVyPiBtX3ZpZXdwb3J0Q29udHJvbGxlcjsKKyAgICBSZWZQdHI8Q29v
cmRpbmF0ZWRHcmFwaGljc1NjZW5lPiBtX3NjZW5lOworCisgICAgYm9vbCBtX25vdGlmeUFmdGVy
U2NoZWR1bGVkTGF5ZXJGbHVzaDsKKyAgICBib29sIG1faXNWYWxpZDsKKyAgICBib29sIG1faXNT
dXNwZW5kZWQ7CisgICAgYm9vbCBtX2lzV2FpdGluZ0ZvclJlbmRlcmVyOworCisgICAgZmxvYXQg
bV9sYXN0U2NhbGVGYWN0b3I7CisgICAgSW50UG9pbnQgbV9sYXN0U2Nyb2xsUG9zaXRpb247CisK
KyAgICBSdW5Mb29wOjpUaW1lcjxUaHJlYWRlZENvb3JkaW5hdGVkQ29tcG9zaXRvcj4gbV9sYXll
ckZsdXNoVGltZXI7CisgICAgYm9vbCBtX2xheWVyRmx1c2hTY2hlZHVsaW5nRW5hYmxlZDsKK307
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCisKKyNlbmRpZiAvLyBUaHJlYWRl
ZENvb3JkaW5hdGVkQ29tcG9zaXRvcl9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>242811</attachid>
            <date>2014-12-08 08:11:14 -0800</date>
            <delta_ts>2014-12-09 06:17:35 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-118383-20141208171150.patch</filename>
            <type>text/plain</type>
            <size>39105</size>
            <attacher name="Gwang Yoon Hwang">yoon</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTc2OTQ2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKaW5kZXggNDQyOWEzZWQzYTE0MWMy
YmJkNDNkYTY2YjAzOTYzM2U0ZjNiMzk0OS4uYzliOTNiN2U4NjNjMDM4NmUwMjQ0MTc1ZDEzOGU1
MjYyZGQ0Yzk4NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJLaXQyL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDk5IEBACiAyMDE0LTEyLTA3ICBHd2Fu
ZyBZb29uIEh3YW5nICA8eW9vbkBpZ2FsaWEuY29tPgogCisgICAgICAgIFtUaHJlYWRlZENvbXBv
c2l0b3JdIEltcGxlbWVudHMgYW4gaW5pdGlhbCB2ZXJzaW9uIG9mIHRoZSBUaHJlYWRlZCBDb21w
b3NpdG9yLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MTE4MzgzCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
SW1wbGVtZW50cyBhbiBpbml0aWFsIHZlcnNpb24gb2YgdGhlIFRocmVhZGVkIENvbXBvc2l0b3Iu
CisKKyAgICAgICAgVGhyZWFkZWQgQ29tcG9zaXRvciBpcyBhIHZhcmlhbnQgb2YgQ29vcmRpbmF0
ZWQgR3JhcGhpY3MgaW1wbGVtZW50YXRpb24uCisgICAgICAgIEJhc2ljIHN0cnVjdHVyZSBvZiB0
aGUgaW1wbGVtZW50YWlvbiBpcyBzaW1saWFyLCB0aHVzLCBUaHJlYWRlZAorICAgICAgICBDb21w
b3NpdG9yIHJldXNlcyBsb3RzIG9mIGNsYXNzZXMgZnJvbSBDb29yZGluYXRlZCBHcmFwaGljcy4g
SG93ZXZlciwKKyAgICAgICAgaW5zdGVhZCBvZiBjb21wb3NpdGluZyBvbiBVSSBQcm9jZXNzLCBU
aHJlYWRlZCBDb21wb3NpdG9yIHBlcmZvcm1zCisgICAgICAgIGNvbXBvc2l0aW5nIG9uIGEgZGVk
aWNhdGUgdGhyZWFkIG9mIFdlYiBQcm9jZXNzLgorCisgICAgICAgIE5vIG5ldyB0ZXN0LCBiZWNh
dXNlIGl0IGlzIGluIGV4cGVyaW1lbnRhbCBzdGFnZS4KKworICAgICAgICAqIFNoYXJlZC9Db29y
ZGluYXRlZEdyYXBoaWNzL0Nvb3JkaW5hdGVkR3JhcGhpY3NTY2VuZS5jcHA6CisgICAgICAgIChX
ZWJLaXQ6OkNvb3JkaW5hdGVkR3JhcGhpY3NTY2VuZTo6Q29vcmRpbmF0ZWRHcmFwaGljc1NjZW5l
KToKKyAgICAgICAgUmVtb3ZlZCBhIGFzc2VydGlvbiBub3QgdG8gZm9yY2UgaXRzIGNyZWF0aW9u
IGluIHRoZSBtYWluIHRocmVhZC4gSW4KKyAgICAgICAgdGhlIFRocmVhZGVkIENvbXBvc2l0b3Is
IGl0IGNhbiBiZSBjcmVhdGVkIGluIHRoZSBkZWRpY2F0ZWQgdGhyZWFkLgorCisgICAgICAgICog
U2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3MvdGhyZWFkZWRjb21wb3NpdG9yL1RocmVhZFNhZmVD
b29yZGluYXRlZFN1cmZhY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgSW1wbGVtZW50cyBhIHN1cmZh
Y2UgdXNpbmcgSW1hZ2VCdWZmZXIgYXMgYSBiYWNrZW5kIHRvIHVzZSBpbiB0aGUgV2ViCisgICAg
ICAgIFByb2Nlc3MuCisKKyAgICAgICAgKFdlYktpdDo6VGhyZWFkU2FmZUNvb3JkaW5hdGVkU3Vy
ZmFjZTo6Y3JlYXRlKToKKyAgICAgICAgKFdlYktpdDo6VGhyZWFkU2FmZUNvb3JkaW5hdGVkU3Vy
ZmFjZTo6VGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFjZSk6CisgICAgICAgIChXZWJLaXQ6OlRo
cmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2U6On5UaHJlYWRTYWZlQ29vcmRpbmF0ZWRTdXJmYWNl
KToKKyAgICAgICAgKFdlYktpdDo6VGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFjZTo6cGFpbnRU
b1N1cmZhY2UpOgorICAgICAgICAoV2ViS2l0OjpUaHJlYWRTYWZlQ29vcmRpbmF0ZWRTdXJmYWNl
OjpiZWdpblBhaW50KToKKyAgICAgICAgKFdlYktpdDo6VGhyZWFkU2FmZUNvb3JkaW5hdGVkU3Vy
ZmFjZTo6ZW5kUGFpbnQpOgorICAgICAgICAoV2ViS2l0OjpUaHJlYWRTYWZlQ29vcmRpbmF0ZWRT
dXJmYWNlOjpjb3B5VG9UZXh0dXJlKToKKyAgICAgICAgKiBTaGFyZWQvQ29vcmRpbmF0ZWRHcmFw
aGljcy90aHJlYWRlZGNvbXBvc2l0b3IvVGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFjZS5oOiBB
ZGRlZC4KKyAgICAgICAgKiBTaGFyZWQvQ29vcmRpbmF0ZWRHcmFwaGljcy90aHJlYWRlZGNvbXBv
c2l0b3IvVGhyZWFkZWRDb21wb3NpdG9yLmNwcDogQWRkZWQuCisgICAgICAgIEltcGxlbWVudHMg
YSBjb21wb3NpdG9yIHdoaWNoIHJ1bnMgb24gdGhlIGNyZWF0ZWQgdGhyZWFkLiBJdCBvd25zCisg
ICAgICAgIFZpZXdwb3J0Q29udHJvbGxlciBhbmQgQ29vcmRpbmF0ZWRHcmFwaGljc1NjZW5lIHRv
IHJlbmRlciBzY2VuZSBvbiB0aGUKKyAgICAgICAgYWN0dWFsIHN1cmZhY2UuCisKKyAgICAgICAg
KFdlYktpdDo6Q29tcG9zaXRpbmdSdW5Mb29wOjpDb21wb3NpdGluZ1J1bkxvb3ApOgorICAgICAg
ICAoV2ViS2l0OjpDb21wb3NpdGluZ1J1bkxvb3A6OmNhbGxPbkNvbXBvc2l0aW5nUnVuTG9vcCk6
CisgICAgICAgIChXZWJLaXQ6OkNvbXBvc2l0aW5nUnVuTG9vcDo6c2V0VXBkYXRlVGltZXIpOgor
ICAgICAgICAoV2ViS2l0OjpDb21wb3NpdGluZ1J1bkxvb3A6OnN0b3BVcGRhdGVUaW1lcik6Cisg
ICAgICAgIChXZWJLaXQ6OkNvbXBvc2l0aW5nUnVuTG9vcDo6cnVuTG9vcCk6CisgICAgICAgIChX
ZWJLaXQ6OkNvbXBvc2l0aW5nUnVuTG9vcDo6dXBkYXRlVGltZXJGaXJlZCk6CisgICAgICAgIChX
ZWJLaXQ6OlRocmVhZGVkQ29tcG9zaXRvcjo6Y3JlYXRlKToKKyAgICAgICAgKFdlYktpdDo6VGhy
ZWFkZWRDb21wb3NpdG9yOjpUaHJlYWRlZENvbXBvc2l0b3IpOgorICAgICAgICAoV2ViS2l0OjpU
aHJlYWRlZENvbXBvc2l0b3I6On5UaHJlYWRlZENvbXBvc2l0b3IpOgorICAgICAgICAoV2ViS2l0
OjpUaHJlYWRlZENvbXBvc2l0b3I6OnNldE5lZWRzRGlzcGxheSk6CisgICAgICAgIChXZWJLaXQ6
OlRocmVhZGVkQ29tcG9zaXRvcjo6c2V0TmF0aXZlU3VyZmFjZUhhbmRsZUZvckNvbXBvc2l0aW5n
KToKKyAgICAgICAgKFdlYktpdDo6VGhyZWFkZWRDb21wb3NpdG9yOjpkaWRDaGFuZ2VWaWV3cG9y
dFNpemUpOgorICAgICAgICAoV2ViS2l0OjpUaHJlYWRlZENvbXBvc2l0b3I6OmRpZENoYW5nZVZp
ZXdwb3J0QXR0cmlidXRlKToKKyAgICAgICAgKFdlYktpdDo6VGhyZWFkZWRDb21wb3NpdG9yOjpk
aWRDaGFuZ2VDb250ZW50c1NpemUpOgorICAgICAgICAoV2ViS2l0OjpUaHJlYWRlZENvbXBvc2l0
b3I6OnNjcm9sbFRvKToKKyAgICAgICAgKFdlYktpdDo6VGhyZWFkZWRDb21wb3NpdG9yOjpzY3Jv
bGxCeSk6CisgICAgICAgIChXZWJLaXQ6OlRocmVhZGVkQ29tcG9zaXRvcjo6cHVyZ2VCYWNraW5n
U3RvcmVzKToKKyAgICAgICAgKFdlYktpdDo6VGhyZWFkZWRDb21wb3NpdG9yOjpyZW5kZXJOZXh0
RnJhbWUpOgorICAgICAgICAoV2ViS2l0OjpUaHJlYWRlZENvbXBvc2l0b3I6OnVwZGF0ZVZpZXdw
b3J0KToKKyAgICAgICAgKFdlYktpdDo6VGhyZWFkZWRDb21wb3NpdG9yOjpjb21taXRTY3JvbGxP
ZmZzZXQpOgorICAgICAgICAoV2ViS2l0OjpUaHJlYWRlZENvbXBvc2l0b3I6OmVuc3VyZUdMQ29u
dGV4dCk6CisgICAgICAgIChXZWJLaXQ6OlRocmVhZGVkQ29tcG9zaXRvcjo6Z2xDb250ZXh0KToK
KyAgICAgICAgKFdlYktpdDo6VGhyZWFkZWRDb21wb3NpdG9yOjpzY2hlZHVsZURpc3BsYXlJZk5l
ZWRlZCk6CisgICAgICAgIChXZWJLaXQ6OlRocmVhZGVkQ29tcG9zaXRvcjo6ZGlkQ2hhbmdlVmlz
aWJsZVJlY3QpOgorICAgICAgICAoV2ViS2l0OjpUaHJlYWRlZENvbXBvc2l0b3I6OnJlbmRlckxh
eWVyVHJlZSk6CisgICAgICAgIChXZWJLaXQ6OlRocmVhZGVkQ29tcG9zaXRvcjo6dXBkYXRlU2Nl
bmVTdGF0ZSk6CisgICAgICAgIChXZWJLaXQ6OlRocmVhZGVkQ29tcG9zaXRvcjo6Y2FsbE9uQ29t
cG9zaXRpbmdUaHJlYWQpOgorICAgICAgICAoV2ViS2l0OjpUaHJlYWRlZENvbXBvc2l0b3I6OmNv
bXBvc2l0aW5nVGhyZWFkRW50cnkpOgorICAgICAgICAoV2ViS2l0OjpUaHJlYWRlZENvbXBvc2l0
b3I6OmNyZWF0ZUNvbXBvc2l0aW5nVGhyZWFkKToKKyAgICAgICAgKFdlYktpdDo6VGhyZWFkZWRD
b21wb3NpdG9yOjpydW5Db21wb3NpdGluZ1RocmVhZCk6CisgICAgICAgIChXZWJLaXQ6OlRocmVh
ZGVkQ29tcG9zaXRvcjo6dGVybWluYXRlQ29tcG9zaXRpbmdUaHJlYWQpOgorICAgICAgICAqIFNo
YXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9UaHJlYWRlZENvbXBv
c2l0b3IuaDogQWRkZWQuCisgICAgICAgIChXZWJLaXQ6OlRocmVhZGVkQ29tcG9zaXRvcjo6dmll
d3BvcnRDb250cm9sbGVyKToKKyAgICAgICAgKiBTaGFyZWQvQ29vcmRpbmF0ZWRHcmFwaGljcy90
aHJlYWRlZGNvbXBvc2l0b3IvVmlld3BvcnRDb250cm9sbGVyLmNwcDogQWRkZWQuCisgICAgICAg
IFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgdG8gaGFuZGxlIHNjYWxlIGZhY3RvciBhbmQgc2Ny
b2xsaW5nIHBvc2l0aW9uCisgICAgICAgIGluIHRoZSBjb21wb3NpdGluZyB0aHJlYWQuCisKKyAg
ICAgICAgKFdlYktpdDo6Vmlld3BvcnRDb250cm9sbGVyOjpWaWV3cG9ydENvbnRyb2xsZXIpOgor
ICAgICAgICAoV2ViS2l0OjpWaWV3cG9ydENvbnRyb2xsZXI6OmRpZENoYW5nZVZpZXdwb3J0U2l6
ZSk6CisgICAgICAgIChXZWJLaXQ6OlZpZXdwb3J0Q29udHJvbGxlcjo6ZGlkQ2hhbmdlQ29udGVu
dHNTaXplKToKKyAgICAgICAgKFdlYktpdDo6Vmlld3BvcnRDb250cm9sbGVyOjpkaWRDaGFuZ2VW
aWV3cG9ydEF0dHJpYnV0ZSk6CisgICAgICAgIChXZWJLaXQ6OlZpZXdwb3J0Q29udHJvbGxlcjo6
c2Nyb2xsQnkpOgorICAgICAgICAoV2ViS2l0OjpWaWV3cG9ydENvbnRyb2xsZXI6OnNjcm9sbFRv
KToKKyAgICAgICAgKFdlYktpdDo6Vmlld3BvcnRDb250cm9sbGVyOjpzeW5jVmlzaWJsZUNvbnRl
bnRzKToKKyAgICAgICAgKFdlYktpdDo6Vmlld3BvcnRDb250cm9sbGVyOjp2aXNpYmxlQ29udGVu
dHNSZWN0KToKKyAgICAgICAgKFdlYktpdDo6Vmlld3BvcnRDb250cm9sbGVyOjp2aXNpYmxlQ29u
dGVudHNTaXplKToKKyAgICAgICAgKFdlYktpdDo6Vmlld3BvcnRDb250cm9sbGVyOjpib3VuZENv
bnRlbnRzUG9zaXRpb25BdFNjYWxlKToKKyAgICAgICAgKFdlYktpdDo6Vmlld3BvcnRDb250cm9s
bGVyOjpib3VuZENvbnRlbnRzUG9zaXRpb24pOgorICAgICAgICAoV2ViS2l0OjpmdXp6eUNvbXBh
cmUpOgorICAgICAgICAoV2ViS2l0OjpWaWV3cG9ydENvbnRyb2xsZXI6OnVwZGF0ZU1pbmltdW1T
Y2FsZVRvRml0KToKKyAgICAgICAgKFdlYktpdDo6Vmlld3BvcnRDb250cm9sbGVyOjppbm5lckJv
dW5kZWRWaWV3cG9ydFNjYWxlKToKKyAgICAgICAgKFdlYktpdDo6Vmlld3BvcnRDb250cm9sbGVy
OjpyZXNldFZpZXdwb3J0VG9EZWZhdWx0U3RhdGUpOgorICAgICAgICAqIFNoYXJlZC9Db29yZGlu
YXRlZEdyYXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9WaWV3cG9ydENvbnRyb2xsZXIuaDogQWRk
ZWQuCisgICAgICAgIChXZWJLaXQ6OlZpZXdwb3J0Q29udHJvbGxlcjo6cGFnZVNjYWxlRmFjdG9y
KToKKworMjAxNC0xMi0wNyAgR3dhbmcgWW9vbiBId2FuZyAgPHlvb25AaWdhbGlhLmNvbT4KKwog
ICAgICAgICBbR1RLXSBMZXQgRHJhd2luZ0FyZWEgbWFuYWdlcyBzZXRBY2NlbGVyYXRlZENvbXBv
c2l0aW5nV2luZG93SWQKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTExNzIzMAogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQvQ29vcmRp
bmF0ZWRHcmFwaGljcy9Db29yZGluYXRlZEdyYXBoaWNzU2NlbmUuY3BwIGIvU291cmNlL1dlYktp
dDIvU2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3MvQ29vcmRpbmF0ZWRHcmFwaGljc1NjZW5lLmNw
cAppbmRleCAzOTllZjY4OTE3M2IxYTgwMmM5ZjdiZjQ4MmMxODQ4Y2VhNDhiNWM5Li45NDczZDQ2
NDhkNTM4MDI1OTYzMDI5NzVhMjEyN2I3YmFlNDYzYjExIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
S2l0Mi9TaGFyZWQvQ29vcmRpbmF0ZWRHcmFwaGljcy9Db29yZGluYXRlZEdyYXBoaWNzU2NlbmUu
Y3BwCisrKyBiL1NvdXJjZS9XZWJLaXQyL1NoYXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL0Nvb3Jk
aW5hdGVkR3JhcGhpY3NTY2VuZS5jcHAKQEAgLTU0LDcgKzU0LDYgQEAgQ29vcmRpbmF0ZWRHcmFw
aGljc1NjZW5lOjpDb29yZGluYXRlZEdyYXBoaWNzU2NlbmUoQ29vcmRpbmF0ZWRHcmFwaGljc1Nj
ZW5lQ2xpZW4KICAgICAsIG1fcm9vdExheWVySUQoSW52YWxpZENvb3JkaW5hdGVkTGF5ZXJJRCkK
ICAgICAsIG1fdmlld0JhY2tncm91bmRDb2xvcihDb2xvcjo6d2hpdGUpCiB7Ci0gICAgQVNTRVJU
KGlzTWFpblRocmVhZCgpKTsKIH0KIAogQ29vcmRpbmF0ZWRHcmFwaGljc1NjZW5lOjp+Q29vcmRp
bmF0ZWRHcmFwaGljc1NjZW5lKCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1NoYXJlZC9D
b29yZGluYXRlZEdyYXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9UaHJlYWRTYWZlQ29vcmRpbmF0
ZWRTdXJmYWNlLmNwcCBiL1NvdXJjZS9XZWJLaXQyL1NoYXJlZC9Db29yZGluYXRlZEdyYXBoaWNz
L3RocmVhZGVkY29tcG9zaXRvci9UaHJlYWRTYWZlQ29vcmRpbmF0ZWRTdXJmYWNlLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi40OTcwY2Y5ZGM1ZjY0MzhkMDhmZWI2OWFmZTU5ZGRmNDA2MWQ2NGZiCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYktpdDIvU2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3MvdGhy
ZWFkZWRjb21wb3NpdG9yL1RocmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2UuY3BwCkBAIC0wLDAg
KzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSWdhbGlhIFMuTC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisg
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKENPT1JESU5BVEVEX0dSQVBISUNTKQor
I2luY2x1ZGUgIlRocmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2UuaCIKKworI2luY2x1ZGUgPHd0
Zi9TdGRMaWJFeHRyYXMuaD4KKworI2lmIFVTRShURVhUVVJFX01BUFBFUikKKyNpbmNsdWRlIDxX
ZWJDb3JlL1RleHR1cmVNYXBwZXJHTC5oPgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJD
b3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworUGFzc1JlZlB0cjxUaHJlYWRTYWZlQ29vcmRp
bmF0ZWRTdXJmYWNlPiBUaHJlYWRTYWZlQ29vcmRpbmF0ZWRTdXJmYWNlOjpjcmVhdGUoY29uc3Qg
SW50U2l6ZSYgc2l6ZSwgQ29vcmRpbmF0ZWRTdXJmYWNlOjpGbGFncyBmbGFncykKK3sKKyAgICBy
ZXR1cm4gYWRvcHRSZWYobmV3IFRocmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2Uoc2l6ZSwgZmxh
Z3MsIEltYWdlQnVmZmVyOjpjcmVhdGUoc2l6ZSkpKTsKK30KKworUGFzc1JlZlB0cjxUaHJlYWRT
YWZlQ29vcmRpbmF0ZWRTdXJmYWNlPiBUaHJlYWRTYWZlQ29vcmRpbmF0ZWRTdXJmYWNlOjpjcmVh
dGUoY29uc3QgSW50U2l6ZSYgc2l6ZSwgQ29vcmRpbmF0ZWRTdXJmYWNlOjpGbGFncyBmbGFncywg
c3RkOjp1bmlxdWVfcHRyPEltYWdlQnVmZmVyPiBidWZmZXIpCit7CisgICAgcmV0dXJuIGFkb3B0
UmVmKG5ldyBUaHJlYWRTYWZlQ29vcmRpbmF0ZWRTdXJmYWNlKHNpemUsIGZsYWdzLCBXVEY6Om1v
dmUoYnVmZmVyKSkpOworfQorCitUaHJlYWRTYWZlQ29vcmRpbmF0ZWRTdXJmYWNlOjpUaHJlYWRT
YWZlQ29vcmRpbmF0ZWRTdXJmYWNlKGNvbnN0IEludFNpemUmIHNpemUsIENvb3JkaW5hdGVkU3Vy
ZmFjZTo6RmxhZ3MgZmxhZ3MsIHN0ZDo6dW5pcXVlX3B0cjxJbWFnZUJ1ZmZlcj4gYnVmZmVyKQor
ICAgIDogQ29vcmRpbmF0ZWRTdXJmYWNlKHNpemUsIGZsYWdzKQorICAgICwgbV9pbWFnZUJ1ZmZl
cihXVEY6Om1vdmUoYnVmZmVyKSkKK3sKK30KKworVGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFj
ZTo6flRocmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2UoKQoreworfQorCit2b2lkIFRocmVhZFNh
ZmVDb29yZGluYXRlZFN1cmZhY2U6OnBhaW50VG9TdXJmYWNlKGNvbnN0IEludFJlY3QmIHJlY3Qs
IENvb3JkaW5hdGVkU3VyZmFjZTo6Q2xpZW50KiBjbGllbnQpCit7CisgICAgQVNTRVJUKGNsaWVu
dCk7CisKKyAgICBHcmFwaGljc0NvbnRleHQqIGNvbnRleHQgPSBiZWdpblBhaW50KHJlY3QpOwor
ICAgIGNsaWVudC0+cGFpbnRUb1N1cmZhY2VDb250ZXh0KGNvbnRleHQpOworICAgIGVuZFBhaW50
KCk7Cit9CisKK0dyYXBoaWNzQ29udGV4dCogVGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFjZTo6
YmVnaW5QYWludChjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIEFTU0VSVChtX2ltYWdlQnVm
ZmVyKTsKKyAgICBHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCA9IG1faW1hZ2VCdWZm
ZXItPmNvbnRleHQoKTsKKyAgICBncmFwaGljc0NvbnRleHQtPnNhdmUoKTsKKyAgICBncmFwaGlj
c0NvbnRleHQtPmNsaXAocmVjdCk7CisgICAgZ3JhcGhpY3NDb250ZXh0LT50cmFuc2xhdGUocmVj
dC54KCksIHJlY3QueSgpKTsKKyAgICByZXR1cm4gZ3JhcGhpY3NDb250ZXh0OworfQorCit2b2lk
IFRocmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2U6OmVuZFBhaW50KCkKK3sKKyAgICBBU1NFUlQo
bV9pbWFnZUJ1ZmZlcik7CisgICAgbV9pbWFnZUJ1ZmZlci0+Y29udGV4dCgpLT5yZXN0b3JlKCk7
Cit9CisKKyNpZiBVU0UoVEVYVFVSRV9NQVBQRVIpCit2b2lkIFRocmVhZFNhZmVDb29yZGluYXRl
ZFN1cmZhY2U6OmNvcHlUb1RleHR1cmUoUGFzc1JlZlB0cjxCaXRtYXBUZXh0dXJlPiBwYXNzVGV4
dHVyZSwgY29uc3QgSW50UmVjdCYgdGFyZ2V0LCBjb25zdCBJbnRQb2ludCYgc291cmNlT2Zmc2V0
KQoreworICAgIFJlZlB0cjxCaXRtYXBUZXh0dXJlPiB0ZXh0dXJlKHBhc3NUZXh0dXJlKTsKKwor
ICAgIEFTU0VSVChtX2ltYWdlQnVmZmVyKTsKKyAgICBSZWZQdHI8SW1hZ2U+IGltYWdlID0gbV9p
bWFnZUJ1ZmZlci0+Y29weUltYWdlKERvbnRDb3B5QmFja2luZ1N0b3JlKTsKKyAgICB0ZXh0dXJl
LT51cGRhdGVDb250ZW50cyhpbWFnZS5nZXQoKSwgdGFyZ2V0LCBzb3VyY2VPZmZzZXQsIEJpdG1h
cFRleHR1cmU6OlVwZGF0ZUNhbk1vZGlmeU9yaWdpbmFsSW1hZ2VEYXRhKTsKK30KKyNlbmRpZiAv
LyBVU0UoVEVYVFVSRV9NQVBQRVIpCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlm
IC8vIFVTRShDT09SRElOQVRFRF9HUkFQSElDUykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQy
L1NoYXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9UaHJlYWRTYWZl
Q29vcmRpbmF0ZWRTdXJmYWNlLmggYi9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQvQ29vcmRpbmF0ZWRH
cmFwaGljcy90aHJlYWRlZGNvbXBvc2l0b3IvVGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFjZS5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmVjMmM3M2ZlOTVlYzAzNDliMzM3ZmUwYzJkYzJhY2IyYzJjNWEwYjIKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQvQ29vcmRpbmF0ZWRHcmFwaGlj
cy90aHJlYWRlZGNvbXBvc2l0b3IvVGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFjZS5oCkBAIC0w
LDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSWdhbGlhIFMuTC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2lmbmRlZiBUaHJlYWRTYWZlQ29vcmRpbmF0ZWRTdXJmYWNlX2gKKyNkZWZpbmUgVGhy
ZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFjZV9oCisKKyNpZiBVU0UoQ09PUkRJTkFURURfR1JBUEhJ
Q1MpCisjaW5jbHVkZSA8V2ViQ29yZS9Db29yZGluYXRlZFN1cmZhY2UuaD4KKyNpbmNsdWRlIDxX
ZWJDb3JlL0ltYWdlQnVmZmVyLmg+CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBUaHJl
YWRTYWZlQ29vcmRpbmF0ZWRTdXJmYWNlIDogcHVibGljIFdlYkNvcmU6OkNvb3JkaW5hdGVkU3Vy
ZmFjZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+VGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFj
ZSgpOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IFRocmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2Ug
YW5kIGFsbG9jYXRlIGVpdGhlciBhIEdyYXBoaWNzU3VyZmFjZSBvciBhIEltYWdlQnVmZmVyIGFz
IGJhY2tpbmcuCisgICAgc3RhdGljIFBhc3NSZWZQdHI8VGhyZWFkU2FmZUNvb3JkaW5hdGVkU3Vy
ZmFjZT4gY3JlYXRlKGNvbnN0IFdlYkNvcmU6OkludFNpemUmLCBXZWJDb3JlOjpDb29yZGluYXRl
ZFN1cmZhY2U6OkZsYWdzKTsKKworICAgIHZpcnR1YWwgdm9pZCBwYWludFRvU3VyZmFjZShjb25z
dCBXZWJDb3JlOjpJbnRSZWN0JiwgV2ViQ29yZTo6Q29vcmRpbmF0ZWRTdXJmYWNlOjpDbGllbnQq
KSBvdmVycmlkZTsKKworI2lmIFVTRShURVhUVVJFX01BUFBFUikKKyAgICB2aXJ0dWFsIHZvaWQg
Y29weVRvVGV4dHVyZShQYXNzUmVmUHRyPFdlYkNvcmU6OkJpdG1hcFRleHR1cmU+LCBjb25zdCBX
ZWJDb3JlOjpJbnRSZWN0JiB0YXJnZXQsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBzb3VyY2VP
ZmZzZXQpIG92ZXJyaWRlOworI2VuZGlmCisKK3ByaXZhdGU6CisgICAgVGhyZWFkU2FmZUNvb3Jk
aW5hdGVkU3VyZmFjZShjb25zdCBXZWJDb3JlOjpJbnRTaXplJiwgV2ViQ29yZTo6Q29vcmRpbmF0
ZWRTdXJmYWNlOjpGbGFncywgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OkltYWdlQnVmZmVyPik7
CisKKyAgICBXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQqIGJlZ2luUGFpbnQoY29uc3QgV2ViQ29y
ZTo6SW50UmVjdCYpOworICAgIHZvaWQgZW5kUGFpbnQoKTsKKworICAgIC8vIENyZWF0ZSBhIFRo
cmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2UgcmVmZXJlbmNpbmcgYW4gZXhpc2l0aW5nIEltYWdl
QnVmZmVyCisgICAgc3RhdGljIFBhc3NSZWZQdHI8VGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFj
ZT4gY3JlYXRlKGNvbnN0IFdlYkNvcmU6OkludFNpemUmLCBXZWJDb3JlOjpDb29yZGluYXRlZFN1
cmZhY2U6OkZsYWdzLCBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6SW1hZ2VCdWZmZXI+KTsKKwor
ICAgIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpJbWFnZUJ1ZmZlcj4gbV9pbWFnZUJ1ZmZlcjsK
K307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYgLy8gVVNFKENPT1JESU5BVEVE
X0dSQVBISUNTKQorCisjZW5kaWYgLy8gVGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFjZV9oCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQvQ29vcmRpbmF0ZWRHcmFwaGljcy90aHJl
YWRlZGNvbXBvc2l0b3IvVGhyZWFkZWRDb21wb3NpdG9yLmNwcCBiL1NvdXJjZS9XZWJLaXQyL1No
YXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9UaHJlYWRlZENvbXBv
c2l0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjJiMjAyNDU1ZDQ5OTY5MzA2MGQ5OGUwYmIzZTE3YjU5ZGRh
MjczNzAKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQvQ29vcmRpbmF0
ZWRHcmFwaGljcy90aHJlYWRlZGNvbXBvc2l0b3IvVGhyZWFkZWRDb21wb3NpdG9yLmNwcApAQCAt
MCwwICsxLDMyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBJZ2FsaWEgUy5MLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQg
SVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0UoQ09PUkRJTkFURURfR1JBUEhJ
Q1NfVEhSRUFERUQpCisjaW5jbHVkZSAiVGhyZWFkZWRDb21wb3NpdG9yLmgiCisKKyNpbmNsdWRl
IDxXZWJDb3JlL1RyYW5zZm9ybWF0aW9uTWF0cml4Lmg+CisjaW5jbHVkZSA8d3RmL0N1cnJlbnRU
aW1lLmg+CisjaW5jbHVkZSA8d3RmL1J1bkxvb3AuaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0
cmFzLmg+CisKKyNpZiBVU0UoT1BFTkdMX0VTXzIpCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+Cisj
ZWxzZQorI2luY2x1ZGUgPEdML2dsLmg+CisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIFdlYkNv
cmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBDb21wb3NpdGluZ1J1bkxvb3Agewor
ICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKENvbXBvc2l0aW5nUnVuTG9vcCk7CisgICAgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgQ29tcG9zaXRpbmdSdW5Mb29wKHN0ZDo6
ZnVuY3Rpb248dm9pZCgpPiB1cGRhdGVGdW5jdGlvbikKKyAgICAgICAgOiBtX3J1bkxvb3AoUnVu
TG9vcDo6Y3VycmVudCgpKQorICAgICAgICAsIG1fdXBkYXRlVGltZXIobV9ydW5Mb29wLCB0aGlz
LCAmQ29tcG9zaXRpbmdSdW5Mb29wOjp1cGRhdGVUaW1lckZpcmVkKQorICAgICAgICAsIG1fdXBk
YXRlRnVuY3Rpb24oV1RGOjptb3ZlKHVwZGF0ZUZ1bmN0aW9uKSkKKyAgICB7CisgICAgfQorCisg
ICAgdm9pZCBjYWxsT25Db21wb3NpdGluZ1J1bkxvb3Aoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGZ1
bmN0aW9uKQorICAgIHsKKyAgICAgICAgaWYgKCZtX3J1bkxvb3AgPT0gJlJ1bkxvb3A6OmN1cnJl
bnQoKSkgeworICAgICAgICAgICAgZnVuY3Rpb24oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorCisgICAgICAgIG1fcnVuTG9vcC5kaXNwYXRjaChXVEY6Om1vdmUoZnVuY3Rpb24p
KTsKKyAgICB9CisKKyAgICB2b2lkIHNldFVwZGF0ZVRpbWVyKGRvdWJsZSBpbnRlcnZhbCA9IDAu
MGYpCisgICAgeworICAgICAgICBpZiAobV91cGRhdGVUaW1lci5pc0FjdGl2ZSgpKQorICAgICAg
ICAgICAgcmV0dXJuOworCisgICAgICAgIG1fdXBkYXRlVGltZXIuc3RhcnRPbmVTaG90KGludGVy
dmFsKTsKKyAgICB9CisKKyAgICB2b2lkIHN0b3BVcGRhdGVUaW1lcigpCisgICAgeworICAgICAg
ICBpZiAobV91cGRhdGVUaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICAgICAgbV91cGRhdGVUaW1l
ci5zdG9wKCk7CisgICAgfQorCisgICAgUnVuTG9vcCYgcnVuTG9vcCgpCisgICAgeworICAgICAg
ICByZXR1cm4gbV9ydW5Mb29wOworICAgIH0KKworcHJpdmF0ZToKKworICAgIHZvaWQgdXBkYXRl
VGltZXJGaXJlZCgpCisgICAgeworICAgICAgICBtX3VwZGF0ZUZ1bmN0aW9uKCk7CisgICAgfQor
CisgICAgUnVuTG9vcCYgbV9ydW5Mb29wOworICAgIFJ1bkxvb3A6OlRpbWVyPENvbXBvc2l0aW5n
UnVuTG9vcD4gbV91cGRhdGVUaW1lcjsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gbV91cGRh
dGVGdW5jdGlvbjsKK307CisKK1Bhc3NSZWZQdHI8VGhyZWFkZWRDb21wb3NpdG9yPiBUaHJlYWRl
ZENvbXBvc2l0b3I6OmNyZWF0ZShDbGllbnQqIGNsaWVudCkKK3sKKyAgICByZXR1cm4gYWRvcHRS
ZWYobmV3IFRocmVhZGVkQ29tcG9zaXRvcihjbGllbnQpKTsKK30KKworVGhyZWFkZWRDb21wb3Np
dG9yOjpUaHJlYWRlZENvbXBvc2l0b3IoQ2xpZW50KiBjbGllbnQpCisgICAgOiBtX2NsaWVudChj
bGllbnQpCisgICAgLCBtX3NjZW5lKGFkb3B0UmVmKG5ldyBDb29yZGluYXRlZEdyYXBoaWNzU2Nl
bmUodGhpcykpKQorICAgICwgbV92aWV3cG9ydENvbnRyb2xsZXIoc3RkOjptYWtlX3VuaXF1ZTxW
aWV3cG9ydENvbnRyb2xsZXI+KHRoaXMpKQorICAgICwgbV90aHJlYWRJZGVudGlmaWVyKDApCit7
CisgICAgY3JlYXRlQ29tcG9zaXRpbmdUaHJlYWQoKTsKK30KKworVGhyZWFkZWRDb21wb3NpdG9y
Ojp+VGhyZWFkZWRDb21wb3NpdG9yKCkKK3sKKyAgICB0ZXJtaW5hdGVDb21wb3NpdGluZ1RocmVh
ZCgpOworfQorCit2b2lkIFRocmVhZGVkQ29tcG9zaXRvcjo6c2V0TmVlZHNEaXNwbGF5KCkKK3sK
KyAgICBSZWZQdHI8VGhyZWFkZWRDb21wb3NpdG9yPiBwcm90ZWN0b3IodGhpcyk7CisgICAgY2Fs
bE9uQ29tcG9zaXRpbmdUaHJlYWQoWz1dIHsKKyAgICAgICAgcHJvdGVjdG9yLT5zY2hlZHVsZURp
c3BsYXlJZk5lZWRlZCgpOworICAgIH0pOworfQorCit2b2lkIFRocmVhZGVkQ29tcG9zaXRvcjo6
c2V0TmF0aXZlU3VyZmFjZUhhbmRsZUZvckNvbXBvc2l0aW5nKHVpbnQ2NF90IGhhbmRsZSkKK3sK
KyAgICBSZWZQdHI8VGhyZWFkZWRDb21wb3NpdG9yPiBwcm90ZWN0b3IodGhpcyk7CisgICAgY2Fs
bE9uQ29tcG9zaXRpbmdUaHJlYWQoWz1dIHsKKyAgICAgICAgcHJvdGVjdG9yLT5tX25hdGl2ZVN1
cmZhY2VIYW5kbGUgPSBoYW5kbGU7CisgICAgICAgIHByb3RlY3Rvci0+bV9zY2VuZS0+c2V0QWN0
aXZlKHRydWUpOworICAgIH0pOworfQorCisKK3ZvaWQgVGhyZWFkZWRDb21wb3NpdG9yOjpkaWRD
aGFuZ2VWaWV3cG9ydFNpemUoY29uc3QgSW50U2l6ZSYgbmV3U2l6ZSkKK3sKKyAgICBSZWZQdHI8
VGhyZWFkZWRDb21wb3NpdG9yPiBwcm90ZWN0b3IodGhpcyk7CisgICAgY2FsbE9uQ29tcG9zaXRp
bmdUaHJlYWQoWz1dIHsKKyAgICAgICAgcHJvdGVjdG9yLT52aWV3cG9ydENvbnRyb2xsZXIoKS0+
ZGlkQ2hhbmdlVmlld3BvcnRTaXplKG5ld1NpemUpOworICAgIH0pOworfQorCit2b2lkIFRocmVh
ZGVkQ29tcG9zaXRvcjo6ZGlkQ2hhbmdlVmlld3BvcnRBdHRyaWJ1dGUoY29uc3QgVmlld3BvcnRB
dHRyaWJ1dGVzJiBhdHRyKQoreworICAgIFJlZlB0cjxUaHJlYWRlZENvbXBvc2l0b3I+IHByb3Rl
Y3Rvcih0aGlzKTsKKyAgICBjYWxsT25Db21wb3NpdGluZ1RocmVhZChbPV0geworICAgICAgICBw
cm90ZWN0b3ItPnZpZXdwb3J0Q29udHJvbGxlcigpLT5kaWRDaGFuZ2VWaWV3cG9ydEF0dHJpYnV0
ZShhdHRyKTsKKyAgICB9KTsKK30KKwordm9pZCBUaHJlYWRlZENvbXBvc2l0b3I6OmRpZENoYW5n
ZUNvbnRlbnRzU2l6ZShjb25zdCBJbnRTaXplJiBzaXplKQoreworICAgIFJlZlB0cjxUaHJlYWRl
ZENvbXBvc2l0b3I+IHByb3RlY3Rvcih0aGlzKTsKKyAgICBjYWxsT25Db21wb3NpdGluZ1RocmVh
ZChbPV0geworICAgICAgICBwcm90ZWN0b3ItPnZpZXdwb3J0Q29udHJvbGxlcigpLT5kaWRDaGFu
Z2VDb250ZW50c1NpemUoc2l6ZSk7CisgICAgfSk7Cit9CisKK3ZvaWQgVGhyZWFkZWRDb21wb3Np
dG9yOjpzY3JvbGxUbyhjb25zdCBJbnRQb2ludCYgcG9zaXRpb24pCit7CisgICAgUmVmUHRyPFRo
cmVhZGVkQ29tcG9zaXRvcj4gcHJvdGVjdG9yKHRoaXMpOworICAgIGNhbGxPbkNvbXBvc2l0aW5n
VGhyZWFkKFs9XSB7CisgICAgICAgIHByb3RlY3Rvci0+dmlld3BvcnRDb250cm9sbGVyKCktPnNj
cm9sbFRvKHBvc2l0aW9uKTsKKyAgICB9KTsKK30KKwordm9pZCBUaHJlYWRlZENvbXBvc2l0b3I6
OnNjcm9sbEJ5KGNvbnN0IEludFNpemUmIGRlbHRhKQoreworICAgIFJlZlB0cjxUaHJlYWRlZENv
bXBvc2l0b3I+IHByb3RlY3Rvcih0aGlzKTsKKyAgICBjYWxsT25Db21wb3NpdGluZ1RocmVhZChb
PV0geworICAgICAgICBwcm90ZWN0b3ItPnZpZXdwb3J0Q29udHJvbGxlcigpLT5zY3JvbGxCeShk
ZWx0YSk7CisgICAgfSk7Cit9CisKK3ZvaWQgVGhyZWFkZWRDb21wb3NpdG9yOjpwdXJnZUJhY2tp
bmdTdG9yZXMoKQoreworICAgIG1fY2xpZW50LT5wdXJnZUJhY2tpbmdTdG9yZXMoKTsKK30KKwor
dm9pZCBUaHJlYWRlZENvbXBvc2l0b3I6OnJlbmRlck5leHRGcmFtZSgpCit7CisgICAgbV9jbGll
bnQtPnJlbmRlck5leHRGcmFtZSgpOworfQorCit2b2lkIFRocmVhZGVkQ29tcG9zaXRvcjo6dXBk
YXRlVmlld3BvcnQoKQoreworICAgIHNldE5lZWRzRGlzcGxheSgpOworfQorCit2b2lkIFRocmVh
ZGVkQ29tcG9zaXRvcjo6Y29tbWl0U2Nyb2xsT2Zmc2V0KHVpbnQzMl90IGxheWVySUQsIGNvbnN0
IEludFNpemUmIG9mZnNldCkKK3sKKyAgICBtX2NsaWVudC0+Y29tbWl0U2Nyb2xsT2Zmc2V0KGxh
eWVySUQsIG9mZnNldCk7Cit9CisKK2Jvb2wgVGhyZWFkZWRDb21wb3NpdG9yOjplbnN1cmVHTENv
bnRleHQoKQoreworICAgIGlmICghZ2xDb250ZXh0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIGdsQ29udGV4dCgpLT5tYWtlQ29udGV4dEN1cnJlbnQoKTsKKyAgICAvLyBUaGUgd2lu
ZG93IHNpemUgbWF5IGJlIG91dCBvZiBzeW5jIHdpdGggdGhlIHBhZ2Ugc2l6ZSBhdCB0aGlzIHBv
aW50LCBhbmQgZ2V0dGluZworICAgIC8vIHRoZSB2aWV3cG9ydCBwYXJhbWV0ZXJzIGluY29ycmVj
dCwgbWVhbnMgdGhhdCB0aGUgY29udGVudCB3aWxsIGJlIG1pc3BsYWNlZC4gVGh1cworICAgIC8v
IHdlIHNldCB0aGUgdmlld3BvcnQgcGFyYW1ldGVycyBkaXJlY3RseSBmcm9tIHRoZSB3aW5kb3cg
c2l6ZS4KKyAgICBJbnRTaXplIGNvbnRleHRTaXplID0gZ2xDb250ZXh0KCktPmRlZmF1bHRGcmFt
ZUJ1ZmZlclNpemUoKTsKKyAgICBpZiAobV92aWV3cG9ydFNpemUgIT0gY29udGV4dFNpemUpIHsK
KyAgICAgICAgZ2xWaWV3cG9ydCgwLCAwLCBjb250ZXh0U2l6ZS53aWR0aCgpLCBjb250ZXh0U2l6
ZS5oZWlnaHQoKSk7CisgICAgICAgIG1fdmlld3BvcnRTaXplID0gY29udGV4dFNpemU7CisgICAg
fQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK0dMQ29udGV4dCogVGhyZWFkZWRDb21wb3NpdG9y
OjpnbENvbnRleHQoKQoreworICAgIGlmIChtX2NvbnRleHQpCisgICAgICAgIHJldHVybiBtX2Nv
bnRleHQuZ2V0KCk7CisKKyAgICBpZiAoIW1fbmF0aXZlU3VyZmFjZUhhbmRsZSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICBtX2NvbnRleHQgPSBHTENvbnRleHQ6OmNyZWF0ZUNvbnRleHRGb3JX
aW5kb3cobV9uYXRpdmVTdXJmYWNlSGFuZGxlLCBHTENvbnRleHQ6OnNoYXJpbmdDb250ZXh0KCkp
OworICAgIHJldHVybiBtX2NvbnRleHQuZ2V0KCk7Cit9CisKK3ZvaWQgVGhyZWFkZWRDb21wb3Np
dG9yOjpzY2hlZHVsZURpc3BsYXlJZk5lZWRlZChkb3VibGUgaW50ZXJ2YWwpCit7CisgICAgbV9j
b21wb3NpdGluZ1J1bkxvb3AtPnNldFVwZGF0ZVRpbWVyKGludGVydmFsKTsKK30KKwordm9pZCBU
aHJlYWRlZENvbXBvc2l0b3I6OmRpZENoYW5nZVZpc2libGVSZWN0KCkKK3sKKyAgICBGbG9hdFJl
Y3QgdmlzaWJsZVJlY3QgPSB2aWV3cG9ydENvbnRyb2xsZXIoKS0+dmlzaWJsZUNvbnRlbnRzUmVj
dCgpOworICAgIGZsb2F0IHNjYWxlID0gdmlld3BvcnRDb250cm9sbGVyKCktPnBhZ2VTY2FsZUZh
Y3RvcigpOworICAgIGNhbGxPbk1haW5UaHJlYWQoWz1dIHsKKyAgICAgICAgbV9jbGllbnQtPnNl
dFZpc2libGVDb250ZW50c1JlY3QodmlzaWJsZVJlY3QsIEZsb2F0UG9pbnQ6Onplcm8oKSwgc2Nh
bGUpOworICAgIH0pOworCisgICAgc2V0TmVlZHNEaXNwbGF5KCk7Cit9CisKK3ZvaWQgVGhyZWFk
ZWRDb21wb3NpdG9yOjpyZW5kZXJMYXllclRyZWUoKQoreworICAgIGlmICghbV9zY2VuZSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaWYgKCFlbnN1cmVHTENvbnRleHQoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgRmxvYXRSZWN0IGNsaXBSZWN0KDAsIDAsIG1fdmlld3BvcnRTaXplLndpZHRo
KCksIG1fdmlld3BvcnRTaXplLmhlaWdodCgpKTsKKworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4
IHZpZXdwb3J0VHJhbnNmb3JtOworICAgIEZsb2F0UG9pbnQgc2Nyb2xsUG9zdGlvbiA9IHZpZXdw
b3J0Q29udHJvbGxlcigpLT52aXNpYmxlQ29udGVudHNSZWN0KCkubG9jYXRpb24oKTsKKyAgICB2
aWV3cG9ydFRyYW5zZm9ybS5zY2FsZSh2aWV3cG9ydENvbnRyb2xsZXIoKS0+cGFnZVNjYWxlRmFj
dG9yKCkpOworICAgIHZpZXdwb3J0VHJhbnNmb3JtLnRyYW5zbGF0ZSgtc2Nyb2xsUG9zdGlvbi54
KCksIC1zY3JvbGxQb3N0aW9uLnkoKSk7CisKKyAgICBtX3NjZW5lLT5wYWludFRvQ3VycmVudEdM
Q29udGV4dCh2aWV3cG9ydFRyYW5zZm9ybSwgMS4wLCBjbGlwUmVjdCwgQ29sb3I6OndoaXRlLCBm
YWxzZSwgc2Nyb2xsUG9zdGlvbik7CisKKyAgICBnbENvbnRleHQoKS0+c3dhcEJ1ZmZlcnMoKTsK
K30KKwordm9pZCBUaHJlYWRlZENvbXBvc2l0b3I6OnVwZGF0ZVNjZW5lU3RhdGUoY29uc3QgQ29v
cmRpbmF0ZWRHcmFwaGljc1N0YXRlJiBzdGF0ZSkKK3sKKyAgICBtX3NjZW5lLT5hcHBlbmRVcGRh
dGUoYmluZCgmQ29vcmRpbmF0ZWRHcmFwaGljc1NjZW5lOjpjb21taXRTY2VuZVN0YXRlLCBtX3Nj
ZW5lLmdldCgpLCBzdGF0ZSkpOworICAgIHNldE5lZWRzRGlzcGxheSgpOworfQorCit2b2lkIFRo
cmVhZGVkQ29tcG9zaXRvcjo6Y2FsbE9uQ29tcG9zaXRpbmdUaHJlYWQoc3RkOjpmdW5jdGlvbjx2
b2lkKCk+IGZ1bmN0aW9uKQoreworICAgIG1fY29tcG9zaXRpbmdSdW5Mb29wLT5jYWxsT25Db21w
b3NpdGluZ1J1bkxvb3AoV1RGOjptb3ZlKGZ1bmN0aW9uKSk7Cit9CisKK3ZvaWQgVGhyZWFkZWRD
b21wb3NpdG9yOjpjb21wb3NpdGluZ1RocmVhZEVudHJ5KHZvaWQqIGNvb3JkaW5hdGVkQ29tcG9z
aXRvcikKK3sKKyAgICBzdGF0aWNfY2FzdDxUaHJlYWRlZENvbXBvc2l0b3IqPihjb29yZGluYXRl
ZENvbXBvc2l0b3IpLT5ydW5Db21wb3NpdGluZ1RocmVhZCgpOworfQorCit2b2lkIFRocmVhZGVk
Q29tcG9zaXRvcjo6Y3JlYXRlQ29tcG9zaXRpbmdUaHJlYWQoKQoreworICAgIGlmIChtX3RocmVh
ZElkZW50aWZpZXIpCisgICAgICAgIHJldHVybjsKKworICAgIE11dGV4TG9ja2VyIGxvY2tlciht
X2luaXRpYWxpemVSdW5Mb29wQ29uZGl0aW9uTXV0ZXgpOworICAgIG1fdGhyZWFkSWRlbnRpZmll
ciA9IGNyZWF0ZVRocmVhZChjb21wb3NpdGluZ1RocmVhZEVudHJ5LCB0aGlzLCAiV2ViQ29yZTog
VGhyZWFkZWRDb21wb3NpdG9yIik7CisKKyAgICBtX2luaXRpYWxpemVSdW5Mb29wQ29uZGl0aW9u
LndhaXQobV9pbml0aWFsaXplUnVuTG9vcENvbmRpdGlvbk11dGV4KTsKK30KKwordm9pZCBUaHJl
YWRlZENvbXBvc2l0b3I6OnJ1bkNvbXBvc2l0aW5nVGhyZWFkKCkKK3sKKyAgICB7CisgICAgICAg
IE11dGV4TG9ja2VyIGxvY2tlcihtX2luaXRpYWxpemVSdW5Mb29wQ29uZGl0aW9uTXV0ZXgpOwor
CisgICAgICAgIG1fY29tcG9zaXRpbmdSdW5Mb29wID0gc3RkOjptYWtlX3VuaXF1ZTxDb21wb3Np
dGluZ1J1bkxvb3A+KFsmXSB7CisgICAgICAgICAgICByZW5kZXJMYXllclRyZWUoKTsKKyAgICAg
ICAgfSk7CisKKyAgICAgICAgbV9pbml0aWFsaXplUnVuTG9vcENvbmRpdGlvbi5zaWduYWwoKTsK
KyAgICB9CisKKyAgICBtX2NvbXBvc2l0aW5nUnVuTG9vcC0+cnVuTG9vcCgpLnJ1bigpOworCisg
ICAgbV9jb21wb3NpdGluZ1J1bkxvb3AtPnN0b3BVcGRhdGVUaW1lcigpOworICAgIG1fc2NlbmUt
PnB1cmdlR0xSZXNvdXJjZXMoKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja2Vy
KG1fdGVybWluYXRlUnVuTG9vcENvbmRpdGlvbk11dGV4KTsKKyAgICAgICAgbV9jb21wb3NpdGlu
Z1J1bkxvb3AgPSBudWxscHRyOworICAgICAgICBtX2NvbnRleHQuY2xlYXIoKTsKKyAgICAgICAg
bV90ZXJtaW5hdGVSdW5Mb29wQ29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0KKworICAgIGRldGFj
aFRocmVhZChtX3RocmVhZElkZW50aWZpZXIpOworfQorCit2b2lkIFRocmVhZGVkQ29tcG9zaXRv
cjo6dGVybWluYXRlQ29tcG9zaXRpbmdUaHJlYWQoKQoreworICAgIE11dGV4TG9ja2VyIGxvY2tl
cihtX3Rlcm1pbmF0ZVJ1bkxvb3BDb25kaXRpb25NdXRleCk7CisKKyAgICBtX3NjZW5lLT5kZXRh
Y2goKTsKKyAgICBtX2NvbXBvc2l0aW5nUnVuTG9vcC0+cnVuTG9vcCgpLnN0b3AoKTsKKworICAg
IG1fdGVybWluYXRlUnVuTG9vcENvbmRpdGlvbi53YWl0KG1fdGVybWluYXRlUnVuTG9vcENvbmRp
dGlvbk11dGV4KTsKK30KKworfQorI2VuZGlmIC8vIFVTRShDT09SRElOQVRFRF9HUkFQSElDU19U
SFJFQURFRCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1NoYXJlZC9Db29yZGluYXRlZEdy
YXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9UaHJlYWRlZENvbXBvc2l0b3IuaCBiL1NvdXJjZS9X
ZWJLaXQyL1NoYXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9UaHJl
YWRlZENvbXBvc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kOTJkODhmZDk2ZDUzM2U4OTRjNWM3N2JkMTgx
ZTE1Nzc0M2JjMWQyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdDIvU2hhcmVkL0Nv
b3JkaW5hdGVkR3JhcGhpY3MvdGhyZWFkZWRjb21wb3NpdG9yL1RocmVhZGVkQ29tcG9zaXRvci5o
CkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IElnYWxpYSBTLkwu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpZm5kZWYgVGhyZWFkZWRDb21wb3NpdG9yX2gKKyNkZWZpbmUgVGhyZWFk
ZWRDb21wb3NpdG9yX2gKKworI2lmIFVTRShDT09SRElOQVRFRF9HUkFQSElDU19USFJFQURFRCkK
KworI2luY2x1ZGUgIkNvb3JkaW5hdGVkR3JhcGhpY3NTY2VuZS5oIgorI2luY2x1ZGUgIlZpZXdw
b3J0Q29udHJvbGxlci5oIgorI2luY2x1ZGUgPFdlYkNvcmUvR0xDb250ZXh0Lmg+CisjaW5jbHVk
ZSA8V2ViQ29yZS9JbnRTaXplLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9UcmFuc2Zvcm1hdGlvbk1h
dHJpeC5oPgorI2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9jLmg+CisjaW5jbHVkZSA8d3RmL05vbmNv
cHlhYmxlLmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZFNhZmVSZWZDb3VudGVkLmg+CisjaW5jbHVk
ZSA8d3RmL1RocmVhZGluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBDb29yZGlu
YXRlZEdyYXBoaWNzU3RhdGU7Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworY2xhc3MgQ29vcmRp
bmF0ZWRHcmFwaGljc1NjZW5lOworY2xhc3MgQ29vcmRpbmF0ZWRHcmFwaGljc1NjZW5lQ2xpZW50
OworCitjbGFzcyBDb21wb3NpdGluZ1J1bkxvb3A7CisKK2NsYXNzIFRocmVhZGVkQ29tcG9zaXRv
ciA6IHB1YmxpYyBWaWV3cG9ydENvbnRyb2xsZXI6OkNsaWVudCwgcHVibGljIENvb3JkaW5hdGVk
R3JhcGhpY3NTY2VuZUNsaWVudCwgcHVibGljIFRocmVhZFNhZmVSZWZDb3VudGVkPFRocmVhZGVk
Q29tcG9zaXRvcj4geworICAgIFdURl9NQUtFX05PTkNPUFlBQkxFKFRocmVhZGVkQ29tcG9zaXRv
cik7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgY2xhc3MgQ2xp
ZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRWaXNpYmxlQ29udGVu
dHNSZWN0KGNvbnN0IFdlYkNvcmU6OkZsb2F0UmVjdCYsIGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9p
bnQmLCBmbG9hdCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcHVyZ2VCYWNraW5nU3RvcmVz
KCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVyTmV4dEZyYW1lKCkgPSAwOworICAg
ICAgICB2aXJ0dWFsIHZvaWQgY29tbWl0U2Nyb2xsT2Zmc2V0KHVpbnQzMl90IGxheWVySUQsIGNv
bnN0IFdlYkNvcmU6OkludFNpemUmIG9mZnNldCkgPSAwOworICAgIH07CisKKyAgICBzdGF0aWMg
UGFzc1JlZlB0cjxUaHJlYWRlZENvbXBvc2l0b3I+IGNyZWF0ZShDbGllbnQqKTsKKyAgICB2aXJ0
dWFsIH5UaHJlYWRlZENvbXBvc2l0b3IoKTsKKworICAgIHZvaWQgc2V0TmVlZHNEaXNwbGF5KCk7
CisKKyAgICB2b2lkIHNldE5hdGl2ZVN1cmZhY2VIYW5kbGVGb3JDb21wb3NpdGluZyh1aW50NjRf
dCk7CisKKyAgICB2b2lkIHVwZGF0ZVNjZW5lU3RhdGUoY29uc3QgV2ViQ29yZTo6Q29vcmRpbmF0
ZWRHcmFwaGljc1N0YXRlJik7CisKKyAgICB2b2lkIGRpZENoYW5nZVZpZXdwb3J0U2l6ZShjb25z
dCBXZWJDb3JlOjpJbnRTaXplJik7CisgICAgdm9pZCBkaWRDaGFuZ2VWaWV3cG9ydEF0dHJpYnV0
ZShjb25zdCBXZWJDb3JlOjpWaWV3cG9ydEF0dHJpYnV0ZXMmKTsKKyAgICB2b2lkIGRpZENoYW5n
ZUNvbnRlbnRzU2l6ZShjb25zdCBXZWJDb3JlOjpJbnRTaXplJik7CisgICAgdm9pZCBzY3JvbGxU
byhjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYpOworICAgIHZvaWQgc2Nyb2xsQnkoY29uc3QgV2Vi
Q29yZTo6SW50U2l6ZSYpOworCitwcml2YXRlOgorICAgIFRocmVhZGVkQ29tcG9zaXRvcihDbGll
bnQqKTsKKworICAgIC8vIENvb3JkaW5hdGVkR3JhcGhpY3NTY2VuZUNsaWVudAorICAgIHZpcnR1
YWwgdm9pZCBwdXJnZUJhY2tpbmdTdG9yZXMoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQg
cmVuZGVyTmV4dEZyYW1lKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVZpZXdw
b3J0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGNvbW1pdFNjcm9sbE9mZnNldCh1aW50
MzJfdCBsYXllcklELCBjb25zdCBXZWJDb3JlOjpJbnRTaXplJiBvZmZzZXQpIG92ZXJyaWRlOwor
CisgICAgdm9pZCByZW5kZXJMYXllclRyZWUoKTsKKyAgICB2b2lkIHNjaGVkdWxlRGlzcGxheUlm
TmVlZGVkKGRvdWJsZSBpbnRlcnZhbCA9IDAuMGYpOworICAgIHZpcnR1YWwgdm9pZCBkaWRDaGFu
Z2VWaXNpYmxlUmVjdCgpIG92ZXJyaWRlOworCisgICAgYm9vbCBlbnN1cmVHTENvbnRleHQoKTsK
KyAgICBXZWJDb3JlOjpHTENvbnRleHQqIGdsQ29udGV4dCgpOworICAgIFZpZXdwb3J0Q29udHJv
bGxlciogdmlld3BvcnRDb250cm9sbGVyKCkgeyByZXR1cm4gbV92aWV3cG9ydENvbnRyb2xsZXIu
Z2V0KCk7IH0KKworICAgIHZvaWQgY2FsbE9uQ29tcG9zaXRpbmdUaHJlYWQoc3RkOjpmdW5jdGlv
bjx2b2lkKCk+KTsKKyAgICB2b2lkIGNyZWF0ZUNvbXBvc2l0aW5nVGhyZWFkKCk7CisgICAgdm9p
ZCBydW5Db21wb3NpdGluZ1RocmVhZCgpOworICAgIHZvaWQgdGVybWluYXRlQ29tcG9zaXRpbmdU
aHJlYWQoKTsKKyAgICBzdGF0aWMgdm9pZCBjb21wb3NpdGluZ1RocmVhZEVudHJ5KHZvaWQqKTsK
KworICAgIENsaWVudCogbV9jbGllbnQ7CisgICAgUmVmUHRyPENvb3JkaW5hdGVkR3JhcGhpY3NT
Y2VuZT4gbV9zY2VuZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Vmlld3BvcnRDb250cm9sbGVyPiBt
X3ZpZXdwb3J0Q29udHJvbGxlcjsKKworICAgIE93blB0cjxXZWJDb3JlOjpHTENvbnRleHQ+IG1f
Y29udGV4dDsKKworICAgIFdlYkNvcmU6OkludFNpemUgbV92aWV3cG9ydFNpemU7CisgICAgdWlu
dDY0X3QgbV9uYXRpdmVTdXJmYWNlSGFuZGxlOworCisgICAgc3RkOjp1bmlxdWVfcHRyPENvbXBv
c2l0aW5nUnVuTG9vcD4gbV9jb21wb3NpdGluZ1J1bkxvb3A7CisKKyAgICBUaHJlYWRJZGVudGlm
aWVyIG1fdGhyZWFkSWRlbnRpZmllcjsKKyAgICBUaHJlYWRDb25kaXRpb24gbV9pbml0aWFsaXpl
UnVuTG9vcENvbmRpdGlvbjsKKyAgICBNdXRleCBtX2luaXRpYWxpemVSdW5Mb29wQ29uZGl0aW9u
TXV0ZXg7CisgICAgVGhyZWFkQ29uZGl0aW9uIG1fdGVybWluYXRlUnVuTG9vcENvbmRpdGlvbjsK
KyAgICBNdXRleCBtX3Rlcm1pbmF0ZVJ1bkxvb3BDb25kaXRpb25NdXRleDsKK307CisKK30gLy8g
bmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYKKworI2VuZGlmIC8vIFRocmVhZGVkQ29tcG9zaXRv
cl9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQvQ29vcmRpbmF0ZWRHcmFwaGlj
cy90aHJlYWRlZGNvbXBvc2l0b3IvVmlld3BvcnRDb250cm9sbGVyLmNwcCBiL1NvdXJjZS9XZWJL
aXQyL1NoYXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9WaWV3cG9y
dENvbnRyb2xsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjA1NmRjNTYwNzYyYWY4ZGI4NzFiMzI0MjcwODZl
NDllNTA0OWU1N2IKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQvQ29v
cmRpbmF0ZWRHcmFwaGljcy90aHJlYWRlZGNvbXBvc2l0b3IvVmlld3BvcnRDb250cm9sbGVyLmNw
cApAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBJZ2FsaWEgUy5M
LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHBy
b2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK
KyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh
cnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0
aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUg
dG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0
cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0UoQ09PUkRJTkFURURfR1JBUEhJQ1NfVEhS
RUFERUQpCisjaW5jbHVkZSAiVmlld3BvcnRDb250cm9sbGVyLmgiCisKK3VzaW5nIG5hbWVzcGFj
ZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKworVmlld3BvcnRDb250cm9sbGVyOjpW
aWV3cG9ydENvbnRyb2xsZXIoQ2xpZW50KiBjbGllbnQpCisgICAgOiBtX2NsaWVudChjbGllbnQp
CisgICAgLCBtX2NvbnRlbnRzUG9zaXRpb24oRmxvYXRQb2ludCgpKQorICAgICwgbV9jb250ZW50
c1NpemUoRmxvYXRTaXplKCkpCisgICAgLCBtX3ZpZXdwb3J0U2l6ZShGbG9hdFNpemUoKSkKKyAg
ICAsIG1fYWxsb3dzVXNlclNjYWxpbmcoZmFsc2UpCisgICAgLCBtX2luaXRpYWxseUZpdFRvVmll
d3BvcnQodHJ1ZSkKKyAgICAsIG1faGFzVmlld3BvcnRBdHRyaWJ1dGUoZmFsc2UpCit7CisgICAg
cmVzZXRWaWV3cG9ydFRvRGVmYXVsdFN0YXRlKCk7Cit9CisKK3ZvaWQgVmlld3BvcnRDb250cm9s
bGVyOjpkaWRDaGFuZ2VWaWV3cG9ydFNpemUoY29uc3QgRmxvYXRTaXplJiBuZXdTaXplKQorewor
ICAgIGlmIChuZXdTaXplLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV92aWV3
cG9ydFNpemUgPSBuZXdTaXplOworICAgIHVwZGF0ZU1pbmltdW1TY2FsZVRvRml0KCk7CisgICAg
c3luY1Zpc2libGVDb250ZW50cygpOworfQorCit2b2lkIFZpZXdwb3J0Q29udHJvbGxlcjo6ZGlk
Q2hhbmdlQ29udGVudHNTaXplKGNvbnN0IEludFNpemUmIG5ld1NpemUpCit7CisgICAgbV9jb250
ZW50c1NpemUgPSBuZXdTaXplOworCisgICAgdXBkYXRlTWluaW11bVNjYWxlVG9GaXQoKTsKKwor
ICAgIGlmIChtX2luaXRpYWxseUZpdFRvVmlld3BvcnQpIHsKKyAgICAgICAgLy8gUmVzdHJpY3Qg
c2NhbGUgZmFjdG9ycyB0byBtX21pbmltdW1TY2FsZVRvRml0LgorICAgICAgICBBU1NFUlQobV9t
aW5pbXVtU2NhbGVUb0ZpdCA+IDApOworICAgICAgICBtX3Jhd0F0dHJpYnV0ZXMuaW5pdGlhbFNj
YWxlID0gbV9taW5pbXVtU2NhbGVUb0ZpdDsKKyAgICAgICAgcmVzdHJpY3RTY2FsZUZhY3RvclRv
SW5pdGlhbFNjYWxlSWZOb3RVc2VyU2NhbGFibGUobV9yYXdBdHRyaWJ1dGVzKTsKKyAgICB9CisK
KyAgICBzeW5jVmlzaWJsZUNvbnRlbnRzKCk7Cit9CisKK3ZvaWQgVmlld3BvcnRDb250cm9sbGVy
OjpkaWRDaGFuZ2VWaWV3cG9ydEF0dHJpYnV0ZShjb25zdCBWaWV3cG9ydEF0dHJpYnV0ZXMmIG5l
d0F0dHJpYnV0ZXMpCit7CisgICAgaWYgKG5ld0F0dHJpYnV0ZXMubGF5b3V0U2l6ZS5pc0VtcHR5
KCkpIHsKKyAgICAgICAgcmVzZXRWaWV3cG9ydFRvRGVmYXVsdFN0YXRlKCk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBtX2hhc1ZpZXdwb3J0QXR0cmlidXRlID0gdHJ1ZTsKKworICAg
IG1fcmF3QXR0cmlidXRlcyA9IG5ld0F0dHJpYnV0ZXM7CisgICAgbV9hbGxvd3NVc2VyU2NhbGlu
ZyA9ICEhbV9yYXdBdHRyaWJ1dGVzLnVzZXJTY2FsYWJsZTsKKyAgICBtX2luaXRpYWxseUZpdFRv
Vmlld3BvcnQgPSAobV9yYXdBdHRyaWJ1dGVzLmluaXRpYWxTY2FsZSA8IDApOworCisgICAgaWYg
KCFtX2luaXRpYWxseUZpdFRvVmlld3BvcnQpCisgICAgICAgIHJlc3RyaWN0U2NhbGVGYWN0b3JU
b0luaXRpYWxTY2FsZUlmTm90VXNlclNjYWxhYmxlKG1fcmF3QXR0cmlidXRlcyk7CisKKyAgICB1
cGRhdGVNaW5pbXVtU2NhbGVUb0ZpdCgpOworCisgICAgc3luY1Zpc2libGVDb250ZW50cygpOwor
fQorCit2b2lkIFZpZXdwb3J0Q29udHJvbGxlcjo6c2Nyb2xsQnkoY29uc3QgSW50U2l6ZSYgc2Ny
b2xsT2Zmc2V0KQoreworICAgIG1fY29udGVudHNQb3NpdGlvbi5tb3ZlKHNjcm9sbE9mZnNldCk7
CisgICAgbV9jb250ZW50c1Bvc2l0aW9uID0gYm91bmRDb250ZW50c1Bvc2l0aW9uKG1fY29udGVu
dHNQb3NpdGlvbik7CisKKyAgICBzeW5jVmlzaWJsZUNvbnRlbnRzKCk7Cit9CisKK3ZvaWQgVmll
d3BvcnRDb250cm9sbGVyOjpzY3JvbGxUbyhjb25zdCBJbnRQb2ludCYgcG9zaXRpb24pCit7Cisg
ICAgaWYgKG1fY29udGVudHNQb3NpdGlvbiA9PSBib3VuZENvbnRlbnRzUG9zaXRpb24ocG9zaXRp
b24pKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2NvbnRlbnRzUG9zaXRpb24gPSBib3VuZENv
bnRlbnRzUG9zaXRpb24ocG9zaXRpb24pOworICAgIHN5bmNWaXNpYmxlQ29udGVudHMoKTsKK30K
Kwordm9pZCBWaWV3cG9ydENvbnRyb2xsZXI6OnN5bmNWaXNpYmxlQ29udGVudHMoKQoreworICAg
IGlmIChtX3ZpZXdwb3J0U2l6ZS5pc0VtcHR5KCkgfHwgbV9jb250ZW50c1NpemUuaXNFbXB0eSgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBtX2NsaWVudC0+ZGlkQ2hhbmdlVmlzaWJsZVJlY3Qo
KTsKK30KKworRmxvYXRSZWN0IFZpZXdwb3J0Q29udHJvbGxlcjo6dmlzaWJsZUNvbnRlbnRzUmVj
dCgpIGNvbnN0Cit7CisgICAgRmxvYXRSZWN0IHZpc2libGVDb250ZW50c1JlY3QoYm91bmRDb250
ZW50c1Bvc2l0aW9uKG1fY29udGVudHNQb3NpdGlvbiksIHZpc2libGVDb250ZW50c1NpemUoKSk7
CisgICAgdmlzaWJsZUNvbnRlbnRzUmVjdC5pbnRlcnNlY3QoRmxvYXRSZWN0KEZsb2F0UG9pbnQ6
Onplcm8oKSwgbV9jb250ZW50c1NpemUpKTsKKworICAgIHJldHVybiB2aXNpYmxlQ29udGVudHNS
ZWN0OworfQorCitGbG9hdFNpemUgVmlld3BvcnRDb250cm9sbGVyOjp2aXNpYmxlQ29udGVudHNT
aXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gRmxvYXRTaXplKG1fdmlld3BvcnRTaXplLndpZHRo
KCkgLyBtX3BhZ2VTY2FsZUZhY3RvciwgbV92aWV3cG9ydFNpemUuaGVpZ2h0KCkgLyBtX3BhZ2VT
Y2FsZUZhY3Rvcik7Cit9CisKK0Zsb2F0UG9pbnQgVmlld3BvcnRDb250cm9sbGVyOjpib3VuZENv
bnRlbnRzUG9zaXRpb25BdFNjYWxlKGNvbnN0IEZsb2F0UG9pbnQmIGZyYW1lUG9zaXRpb24sIGZs
b2F0IHNjYWxlKSBjb25zdAoreworICAgIC8vIFdlIG5lZWQgdG8gZmxvb3IgdGhlIHZpZXdwb3J0
IGhlcmUgYXMgdG8gYWxsb3cgYWxpZ25pbmcgdGhlIGNvbnRlbnQgaW4gZGV2aWNlIHVuaXRzLiBJ
ZiBub3QsCisgICAgLy8gaXQgbWlnaHQgbm90IGJlIHBvc3NpYmxlIHRvIHNjcm9sbCB0aGUgbGFz
dCBwaXhlbCBhbmQgdGhhdCBhZmZlY3RzIGZpeGVkIHBvc2l0aW9uIGVsZW1lbnRzLgorICAgIEZs
b2F0UmVjdCBib3VuZHM7CisgICAgYm91bmRzLnNldFdpZHRoKHN0ZDo6bWF4KDAuZiwgbV9jb250
ZW50c1NpemUud2lkdGgoKSAtIGZsb29yZihtX3ZpZXdwb3J0U2l6ZS53aWR0aCgpIC8gc2NhbGUp
KSk7CisgICAgYm91bmRzLnNldEhlaWdodChzdGQ6Om1heCgwLmYsIG1fY29udGVudHNTaXplLmhl
aWdodCgpIC0gZmxvb3JmKG1fdmlld3BvcnRTaXplLmhlaWdodCgpIC8gc2NhbGUpKSk7CisKKyAg
ICBGbG9hdFBvaW50IHBvc2l0aW9uOworICAgIHBvc2l0aW9uLnNldFgoY2xhbXBUbyhmcmFtZVBv
c2l0aW9uLngoKSwgYm91bmRzLngoKSwgYm91bmRzLndpZHRoKCkpKTsKKyAgICBwb3NpdGlvbi5z
ZXRZKGNsYW1wVG8oZnJhbWVQb3NpdGlvbi55KCksIGJvdW5kcy55KCksIGJvdW5kcy5oZWlnaHQo
KSkpOworCisgICAgcmV0dXJuIHBvc2l0aW9uOworfQorCitGbG9hdFBvaW50IFZpZXdwb3J0Q29u
dHJvbGxlcjo6Ym91bmRDb250ZW50c1Bvc2l0aW9uKGNvbnN0IEZsb2F0UG9pbnQmIGZyYW1lUG9z
aXRpb24pIGNvbnN0Cit7CisgICAgcmV0dXJuIGJvdW5kQ29udGVudHNQb3NpdGlvbkF0U2NhbGUo
ZnJhbWVQb3NpdGlvbiwgbV9wYWdlU2NhbGVGYWN0b3IpOworfQorCitib29sIGZ1enp5Q29tcGFy
ZShmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBlcHNpbG9uKQoreworICAgIHJldHVybiBzdGQ6OmFi
cyhhIC0gYikgPCBlcHNpbG9uOworfQorCitib29sIFZpZXdwb3J0Q29udHJvbGxlcjo6dXBkYXRl
TWluaW11bVNjYWxlVG9GaXQoKQoreworICAgIGlmIChtX3ZpZXdwb3J0U2l6ZS5pc0VtcHR5KCkg
fHwgbV9jb250ZW50c1NpemUuaXNFbXB0eSgpIHx8ICFtX2hhc1ZpZXdwb3J0QXR0cmlidXRlKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBib29sIGN1cnJlbnRseVNjYWxlZFRvRml0ID0g
ZnV6enlDb21wYXJlKG1fcGFnZVNjYWxlRmFjdG9yLCBtX21pbmltdW1TY2FsZVRvRml0LCAwLjAw
MDEpOworCisgICAgZmxvYXQgbWluaW11bVNjYWxlID0gY29tcHV0ZU1pbmltdW1TY2FsZUZhY3Rv
ckZvckNvbnRlbnRDb250YWluZWQobV9yYXdBdHRyaWJ1dGVzLCByb3VuZGVkSW50U2l6ZShtX3Zp
ZXdwb3J0U2l6ZSksIHJvdW5kZWRJbnRTaXplKG1fY29udGVudHNTaXplKSk7CisKKyAgICBpZiAo
bWluaW11bVNjYWxlIDw9IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghZnV6
enlDb21wYXJlKG1pbmltdW1TY2FsZSwgbV9taW5pbXVtU2NhbGVUb0ZpdCwgMC4wMDAxKSkgewor
ICAgICAgICBtX21pbmltdW1TY2FsZVRvRml0ID0gbWluaW11bVNjYWxlOworCisgICAgICAgIGlm
IChjdXJyZW50bHlTY2FsZWRUb0ZpdCkKKyAgICAgICAgICAgIG1fcGFnZVNjYWxlRmFjdG9yID0g
bV9taW5pbXVtU2NhbGVUb0ZpdDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBFbnN1
cmUgdGhlIGVmZmVjdGl2ZSBzY2FsZSBzdGF5cyB3aXRoaW4gYm91bmRzLgorICAgICAgICAgICAg
ZmxvYXQgYm91bmRlZFNjYWxlID0gaW5uZXJCb3VuZGVkVmlld3BvcnRTY2FsZShtX3BhZ2VTY2Fs
ZUZhY3Rvcik7CisgICAgICAgICAgICBpZiAoIWZ1enp5Q29tcGFyZShib3VuZGVkU2NhbGUsIG1f
cGFnZVNjYWxlRmFjdG9yLCAwLjAwMDEpKQorICAgICAgICAgICAgICAgIG1fcGFnZVNjYWxlRmFj
dG9yID0gYm91bmRlZFNjYWxlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworZmxvYXQgVmlld3BvcnRDb250cm9sbGVyOjpp
bm5lckJvdW5kZWRWaWV3cG9ydFNjYWxlKGZsb2F0IHZpZXdwb3J0U2NhbGUpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGNsYW1wVG8odmlld3BvcnRTY2FsZSwgbV9taW5pbXVtU2NhbGVUb0ZpdCwgbV9y
YXdBdHRyaWJ1dGVzLm1heGltdW1TY2FsZSk7Cit9CisKK3ZvaWQgVmlld3BvcnRDb250cm9sbGVy
OjpyZXNldFZpZXdwb3J0VG9EZWZhdWx0U3RhdGUoKQoreworICAgIG1faGFzVmlld3BvcnRBdHRy
aWJ1dGUgPSBmYWxzZTsKKyAgICBtX3BhZ2VTY2FsZUZhY3RvciA9IDE7CisgICAgbV9taW5pbXVt
U2NhbGVUb0ZpdCA9IDE7CisKKyAgICAvLyBJbml0aWFsaXppbmcgVmlld3BvcnQgUmF3IEF0dHJp
YnV0ZXMgdG8gYXZvaWQgcmFuZG9tIG5lZ2F0aXZlIG9yIGluZmluaXR5IHNjYWxlIGZhY3RvcnMK
KyAgICAvLyBpZiB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIGJldHdlZW4gdGhlIGZpcnN0IGxh
eW91dCBhbmQgc2V0dGluZyB0aGUgdmlld3BvcnQgYXR0cmlidXRlcyBmb3IgdGhlIGZpcnN0IHRp
bWUuCisgICAgbV9yYXdBdHRyaWJ1dGVzLm1pbmltdW1TY2FsZSA9IDE7CisgICAgbV9yYXdBdHRy
aWJ1dGVzLm1heGltdW1TY2FsZSA9IDE7CisgICAgbV9yYXdBdHRyaWJ1dGVzLnVzZXJTY2FsYWJs
ZSA9IG1fYWxsb3dzVXNlclNjYWxpbmc7CisKKyAgICAvLyBUaGUgaW5pdGlhbCBzY2FsZSBtaWdo
dCBiZSBpbXBsaWNpdCBhbmQgc2V0IHRvIC0xLCBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBpbmZl
ciBpdAorICAgIC8vIHVzaW5nIHRoZSB2aWV3cG9ydCBzaXplIGFuZCB0aGUgZmluYWwgbGF5b3V0
IHNpemUuCisgICAgLy8gVG8gYmUgYWJsZSB0byBhc3NlcnQgZm9yIHZhbGlkIHNjYWxlIHdlIGlu
aXRpYWxpemUgaXQgdG8gLTEuCisgICAgbV9yYXdBdHRyaWJ1dGVzLmluaXRpYWxTY2FsZSA9IC0x
OworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQ09PUkRJTkFU
RURfR1JBUEhJQ1NfVEhSRUFERUQpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQv
Q29vcmRpbmF0ZWRHcmFwaGljcy90aHJlYWRlZGNvbXBvc2l0b3IvVmlld3BvcnRDb250cm9sbGVy
LmggYi9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQvQ29vcmRpbmF0ZWRHcmFwaGljcy90aHJlYWRlZGNv
bXBvc2l0b3IvVmlld3BvcnRDb250cm9sbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYTdhYmYxNmNmMmVjMDZi
NjAzNzI0OTgwNWJlZjZhNjM1YTIxNDY5NwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJL
aXQyL1NoYXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9WaWV3cG9y
dENvbnRyb2xsZXIuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0
IElnYWxpYSBTLkwuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
KiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwg
VVNBLgorICovCisKKyNpZm5kZWYgVmlld3BvcnRDb250cm9sbGVyX2gKKyNkZWZpbmUgVmlld3Bv
cnRDb250cm9sbGVyX2gKKworI2lmIFVTRShDT09SRElOQVRFRF9HUkFQSElDU19USFJFQURFRCkK
KworI2luY2x1ZGUgPFdlYkNvcmUvRmxvYXRQb2ludC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRmxv
YXRSZWN0Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9GbG9hdFNpemUuaD4KKyNpbmNsdWRlIDxXZWJD
b3JlL0ludFJlY3QuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0ludFNpemUuaD4KKyNpbmNsdWRlIDxX
ZWJDb3JlL1ZpZXdwb3J0QXJndW1lbnRzLmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+
CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBWaWV3cG9ydENvbnRyb2xsZXIgeworICAg
IFdURl9NQUtFX05PTkNPUFlBQkxFKFZpZXdwb3J0Q29udHJvbGxlcik7CitwdWJsaWM6CisgICAg
Y2xhc3MgQ2xpZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgdm9pZCBkaWRDaGFu
Z2VWaXNpYmxlUmVjdCgpID0gMDsKKyAgICB9OworCisgICAgZXhwbGljaXQgVmlld3BvcnRDb250
cm9sbGVyKENsaWVudCopOworCisgICAgLy8gRnJvbSBXZWJDb3JlCisgICAgdm9pZCBkaWRDaGFu
Z2VWaWV3cG9ydFNpemUoY29uc3QgV2ViQ29yZTo6RmxvYXRTaXplJik7CisgICAgdm9pZCBkaWRD
aGFuZ2VDb250ZW50c1NpemUoY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYpOworICAgIHZvaWQgZGlk
Q2hhbmdlVmlld3BvcnRBdHRyaWJ1dGUoY29uc3QgV2ViQ29yZTo6Vmlld3BvcnRBdHRyaWJ1dGVz
Jik7CisKKyAgICB2b2lkIHNjcm9sbEJ5KGNvbnN0IFdlYkNvcmU6OkludFNpemUmKTsKKyAgICB2
b2lkIHNjcm9sbFRvKGNvbnN0IFdlYkNvcmU6OkludFBvaW50Jik7CisKKyAgICBXZWJDb3JlOjpG
bG9hdFJlY3QgdmlzaWJsZUNvbnRlbnRzUmVjdCgpIGNvbnN0OworICAgIGZsb2F0IHBhZ2VTY2Fs
ZUZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1fcGFnZVNjYWxlRmFjdG9yOyB9CisKK3ByaXZhdGU6
CisKKyAgICBXZWJDb3JlOjpGbG9hdFNpemUgdmlzaWJsZUNvbnRlbnRzU2l6ZSgpIGNvbnN0Owor
CisgICAgdm9pZCBzeW5jVmlzaWJsZUNvbnRlbnRzKCk7CisKKyAgICB2b2lkIGFwcGx5U2NhbGVB
ZnRlclJlbmRlcmluZ0NvbnRlbnRzKGZsb2F0IHNjYWxlKTsKKyAgICB2b2lkIGFwcGx5UG9zaXRp
b25BZnRlclJlbmRlcmluZ0NvbnRlbnRzKGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQmIHBvcyk7
CisKKyAgICBXZWJDb3JlOjpGbG9hdFBvaW50IGJvdW5kQ29udGVudHNQb3NpdGlvbihjb25zdCBX
ZWJDb3JlOjpGbG9hdFBvaW50JikgY29uc3Q7CisgICAgV2ViQ29yZTo6RmxvYXRQb2ludCBib3Vu
ZENvbnRlbnRzUG9zaXRpb25BdFNjYWxlKGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQmLCBmbG9h
dCBzY2FsZSkgY29uc3Q7CisKKyAgICBib29sIHVwZGF0ZU1pbmltdW1TY2FsZVRvRml0KCk7Cisg
ICAgZmxvYXQgaW5uZXJCb3VuZGVkVmlld3BvcnRTY2FsZShmbG9hdCkgY29uc3Q7CisKKyAgICB2
b2lkIHJlc2V0Vmlld3BvcnRUb0RlZmF1bHRTdGF0ZSgpOworCisgICAgQ2xpZW50KiBtX2NsaWVu
dDsKKworICAgIFdlYkNvcmU6OkZsb2F0UG9pbnQgbV9jb250ZW50c1Bvc2l0aW9uOworICAgIFdl
YkNvcmU6OkZsb2F0U2l6ZSBtX2NvbnRlbnRzU2l6ZTsKKyAgICBXZWJDb3JlOjpGbG9hdFNpemUg
bV92aWV3cG9ydFNpemU7CisgICAgZmxvYXQgbV9wYWdlU2NhbGVGYWN0b3I7CisKKyAgICBib29s
IG1fYWxsb3dzVXNlclNjYWxpbmc7CisgICAgZmxvYXQgbV9taW5pbXVtU2NhbGVUb0ZpdDsKKyAg
ICBib29sIG1faW5pdGlhbGx5Rml0VG9WaWV3cG9ydDsKKworICAgIGJvb2wgbV9oYXNWaWV3cG9y
dEF0dHJpYnV0ZTsKKyAgICBXZWJDb3JlOjpWaWV3cG9ydEF0dHJpYnV0ZXMgbV9yYXdBdHRyaWJ1
dGVzOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKENPT1JE
SU5BVEVEX0dSQVBISUNTX1RIUkVBREVEKQorCisjZW5kaWYgLy8gVmlld3BvcnRDb250cm9sbGVy
X2gK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>242915</attachid>
            <date>2014-12-09 06:17:43 -0800</date>
            <delta_ts>2014-12-15 02:39:11 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-118383-20141209151822.patch</filename>
            <type>text/plain</type>
            <size>35830</size>
            <attacher name="Gwang Yoon Hwang">yoon</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTc3MDE0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0Mi9DaGFuZ2VMb2cKaW5kZXggM2I0ZTc5OWI0NzQ5MGYz
MzEwYzU4NDJmMzA1NjJhYWY1MmM5YTQ3OS4uNzhhNWRmMjQ2MDA5NTQzZjExNmZiOTBlMzZjMmMx
M2I0NzRlY2Q3YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJLaXQyL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQxIEBACisyMDE0LTEyLTA3ICBHd2Fu
ZyBZb29uIEh3YW5nICA8eW9vbkBpZ2FsaWEuY29tPgorCisgICAgICAgIEFkZCBpbml0aWFsIGlt
cGxlbWVudGF0aW9uIG9mIFRocmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2UsIFRocmVhZGVkQ29t
cG9zaXRvciwgYW5kIFNpbXBsZVZpZXdwb3J0Q29udHJvbGxlcgorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE4MzgzCisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgSW1wbGVtZW50cyBhbiBpbml0aWFsIHZlcnNp
b24gb2YgdGhlIFRocmVhZGVkIENvbXBvc2l0b3IuCisKKyAgICAgICAgVGhyZWFkZWQgQ29tcG9z
aXRvciBpcyBhIHZhcmlhbnQgb2YgQ29vcmRpbmF0ZWQgR3JhcGhpY3MgaW1wbGVtZW50YXRpb24u
CisgICAgICAgIEJhc2ljIHN0cnVjdHVyZSBvZiB0aGUgaW1wbGVtZW50YWlvbiBpcyBzaW1saWFy
LCB0aHVzLCBUaHJlYWRlZAorICAgICAgICBDb21wb3NpdG9yIHJldXNlcyBsb3RzIG9mIGNsYXNz
ZXMgZnJvbSBDb29yZGluYXRlZCBHcmFwaGljcy4gSG93ZXZlciwKKyAgICAgICAgaW5zdGVhZCBv
ZiBjb21wb3NpdGluZyBvbiBVSSBQcm9jZXNzLCBUaHJlYWRlZCBDb21wb3NpdG9yIHBlcmZvcm1z
CisgICAgICAgIGNvbXBvc2l0aW5nIG9uIGEgZGVkaWNhdGUgdGhyZWFkIG9mIFdlYiBQcm9jZXNz
LgorCisgICAgICAgIE5vIG5ldyB0ZXN0LCBiZWNhdXNlIGl0IGlzIGluIGV4cGVyaW1lbnRhbCBz
dGFnZS4KKworICAgICAgICAqIFNoYXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL0Nvb3JkaW5hdGVk
R3JhcGhpY3NTY2VuZS5jcHA6CisgICAgICAgIChXZWJLaXQ6OkNvb3JkaW5hdGVkR3JhcGhpY3NT
Y2VuZTo6Q29vcmRpbmF0ZWRHcmFwaGljc1NjZW5lKToKKyAgICAgICAgUmVtb3ZlZCBhIGFzc2Vy
dGlvbiBub3QgdG8gZm9yY2UgaXRzIGNyZWF0aW9uIGluIHRoZSBtYWluIHRocmVhZC4gSW4KKyAg
ICAgICAgdGhlIFRocmVhZGVkIENvbXBvc2l0b3IsIGl0IGNhbiBiZSBjcmVhdGVkIGluIHRoZSBk
ZWRpY2F0ZWQgdGhyZWFkLgorCisgICAgICAgICogU2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3Mv
dGhyZWFkZWRjb21wb3NpdG9yL1RocmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2UuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKiBTaGFyZWQvQ29vcmRpbmF0ZWRHcmFwaGljcy90aHJlYWRlZGNvbXBvc2l0
b3IvVGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFjZS5oOiBBZGRlZC4KKyAgICAgICAgSW1wbGVt
ZW50cyBhIHN1cmZhY2UgdXNpbmcgSW1hZ2VCdWZmZXIgYXMgYSBiYWNrZW5kIHRvIHVzZSBpbiB0
aGUgV2ViCisgICAgICAgIFByb2Nlc3MuCisKKyAgICAgICAgKiBTaGFyZWQvQ29vcmRpbmF0ZWRH
cmFwaGljcy90aHJlYWRlZGNvbXBvc2l0b3IvVGhyZWFkZWRDb21wb3NpdG9yLmg6IEFkZGVkLgor
ICAgICAgICAqIFNoYXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9U
aHJlYWRlZENvbXBvc2l0b3IuY3BwOiBBZGRlZC4KKyAgICAgICAgSW1wbGVtZW50cyBhIGNvbXBv
c2l0b3Igd2hpY2ggcnVucyBvbiB0aGUgY3JlYXRlZCB0aHJlYWQuIEl0IG93bnMKKyAgICAgICAg
U2ltcGxlVmlld3BvcnRDb250cm9sbGVyIGFuZCBDb29yZGluYXRlZEdyYXBoaWNzU2NlbmUgdG8g
cmVuZGVyIHNjZW5lIG9uIHRoZQorICAgICAgICBhY3R1YWwgc3VyZmFjZS4KKworICAgICAgICAq
IFNoYXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL1NpbXBsZVZpZXdwb3J0Q29udHJvbGxlci5jcHA6
IEFkZGVkLgorICAgICAgICAqIFNoYXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL1NpbXBsZVZpZXdw
b3J0Q29udHJvbGxlci5oOiBBZGRlZC4KKyAgICAgICAgVGhpcyBjbGFzcyBpcyByZXNwb25zaWJs
ZSB0byBoYW5kbGUgc2NhbGUgZmFjdG9yIGFuZCBzY3JvbGxpbmcgcG9zaXRpb24KKyAgICAgICAg
d2l0aCBhIHNpbXBsaWZlZCBsb2dpYyBpbiB0aGUgY29tcG9zaXRpbmcgdGhyZWFkLgorCiAyMDE0
LTEyLTA5ICBKZXJlbXkgSm9uZXMgIDxqZXJlbXlqQGFwcGxlLmNvbT4KIAogICAgICAgICBFbmFi
bGUgYWN0aXZhdGluZyBvcHRpbWl6ZWQgZnVsbHNjcmVlbiBtb2RlIGZyb20gc3RhbmRhcmQgZnVs
c2NyZWVuIG1vZGUuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQvQ29vcmRpbmF0
ZWRHcmFwaGljcy9Db29yZGluYXRlZEdyYXBoaWNzU2NlbmUuY3BwIGIvU291cmNlL1dlYktpdDIv
U2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3MvQ29vcmRpbmF0ZWRHcmFwaGljc1NjZW5lLmNwcApp
bmRleCAzOTllZjY4OTE3M2IxYTgwMmM5ZjdiZjQ4MmMxODQ4Y2VhNDhiNWM5Li45NDczZDQ2NDhk
NTM4MDI1OTYzMDI5NzVhMjEyN2I3YmFlNDYzYjExIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
Mi9TaGFyZWQvQ29vcmRpbmF0ZWRHcmFwaGljcy9Db29yZGluYXRlZEdyYXBoaWNzU2NlbmUuY3Bw
CisrKyBiL1NvdXJjZS9XZWJLaXQyL1NoYXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL0Nvb3JkaW5h
dGVkR3JhcGhpY3NTY2VuZS5jcHAKQEAgLTU0LDcgKzU0LDYgQEAgQ29vcmRpbmF0ZWRHcmFwaGlj
c1NjZW5lOjpDb29yZGluYXRlZEdyYXBoaWNzU2NlbmUoQ29vcmRpbmF0ZWRHcmFwaGljc1NjZW5l
Q2xpZW4KICAgICAsIG1fcm9vdExheWVySUQoSW52YWxpZENvb3JkaW5hdGVkTGF5ZXJJRCkKICAg
ICAsIG1fdmlld0JhY2tncm91bmRDb2xvcihDb2xvcjo6d2hpdGUpCiB7Ci0gICAgQVNTRVJUKGlz
TWFpblRocmVhZCgpKTsKIH0KIAogQ29vcmRpbmF0ZWRHcmFwaGljc1NjZW5lOjp+Q29vcmRpbmF0
ZWRHcmFwaGljc1NjZW5lKCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1NoYXJlZC9Db29y
ZGluYXRlZEdyYXBoaWNzL1NpbXBsZVZpZXdwb3J0Q29udHJvbGxlci5jcHAgYi9Tb3VyY2UvV2Vi
S2l0Mi9TaGFyZWQvQ29vcmRpbmF0ZWRHcmFwaGljcy9TaW1wbGVWaWV3cG9ydENvbnRyb2xsZXIu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjExYjU1YmVmN2JlZTk3YTk4NGY0N2E3NjZmMmVmODM2ZWRhNmU3MTAK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQvQ29vcmRpbmF0ZWRHcmFw
aGljcy9TaW1wbGVWaWV3cG9ydENvbnRyb2xsZXIuY3BwCkBAIC0wLDAgKzEsMjAxIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMg
c3Vic2lkaWFyeSgtaWVzKQorICogQ29weXJpZ2h0IChDKSAyMDExIEJlbmphbWluIFBvdWxhaW4g
PGJlbmphbWluQHdlYmtpdC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSWdhbGlhIFMuTC4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9n
cmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGgg
dGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRv
CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJl
ZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKENPT1JESU5BVEVEX0dSQVBISUNTX1RIUkVB
REVEKQorI2luY2x1ZGUgIlNpbXBsZVZpZXdwb3J0Q29udHJvbGxlci5oIgorCit1c2luZyBuYW1l
c3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK1NpbXBsZVZpZXdwb3J0Q29u
dHJvbGxlcjo6U2ltcGxlVmlld3BvcnRDb250cm9sbGVyKENsaWVudCogY2xpZW50KQorICAgIDog
bV9jbGllbnQoY2xpZW50KQorICAgICwgbV9jb250ZW50c1Bvc2l0aW9uKEZsb2F0UG9pbnQoKSkK
KyAgICAsIG1fY29udGVudHNTaXplKEZsb2F0U2l6ZSgpKQorICAgICwgbV92aWV3cG9ydFNpemUo
RmxvYXRTaXplKCkpCisgICAgLCBtX2FsbG93c1VzZXJTY2FsaW5nKGZhbHNlKQorICAgICwgbV9p
bml0aWFsbHlGaXRUb1ZpZXdwb3J0KHRydWUpCisgICAgLCBtX2hhc1ZpZXdwb3J0QXR0cmlidXRl
KGZhbHNlKQoreworICAgIHJlc2V0Vmlld3BvcnRUb0RlZmF1bHRTdGF0ZSgpOworfQorCit2b2lk
IFNpbXBsZVZpZXdwb3J0Q29udHJvbGxlcjo6ZGlkQ2hhbmdlVmlld3BvcnRTaXplKGNvbnN0IEZs
b2F0U2l6ZSYgbmV3U2l6ZSkKK3sKKyAgICBpZiAobmV3U2l6ZS5pc0VtcHR5KCkpCisgICAgICAg
IHJldHVybjsKKworICAgIG1fdmlld3BvcnRTaXplID0gbmV3U2l6ZTsKKyAgICB1cGRhdGVNaW5p
bXVtU2NhbGVUb0ZpdCgpOworICAgIHN5bmNWaXNpYmxlQ29udGVudHMoKTsKK30KKwordm9pZCBT
aW1wbGVWaWV3cG9ydENvbnRyb2xsZXI6OmRpZENoYW5nZUNvbnRlbnRzU2l6ZShjb25zdCBJbnRT
aXplJiBuZXdTaXplKQoreworICAgIG1fY29udGVudHNTaXplID0gbmV3U2l6ZTsKKworICAgIHVw
ZGF0ZU1pbmltdW1TY2FsZVRvRml0KCk7CisKKyAgICBpZiAobV9pbml0aWFsbHlGaXRUb1ZpZXdw
b3J0KSB7CisgICAgICAgIC8vIFJlc3RyaWN0IHNjYWxlIGZhY3RvcnMgdG8gbV9taW5pbXVtU2Nh
bGVUb0ZpdC4KKyAgICAgICAgQVNTRVJUKG1fbWluaW11bVNjYWxlVG9GaXQgPiAwKTsKKyAgICAg
ICAgbV9yYXdBdHRyaWJ1dGVzLmluaXRpYWxTY2FsZSA9IG1fbWluaW11bVNjYWxlVG9GaXQ7Cisg
ICAgICAgIHJlc3RyaWN0U2NhbGVGYWN0b3JUb0luaXRpYWxTY2FsZUlmTm90VXNlclNjYWxhYmxl
KG1fcmF3QXR0cmlidXRlcyk7CisgICAgfQorCisgICAgc3luY1Zpc2libGVDb250ZW50cygpOwor
fQorCit2b2lkIFNpbXBsZVZpZXdwb3J0Q29udHJvbGxlcjo6ZGlkQ2hhbmdlVmlld3BvcnRBdHRy
aWJ1dGUoY29uc3QgVmlld3BvcnRBdHRyaWJ1dGVzJiBuZXdBdHRyaWJ1dGVzKQoreworICAgIGlm
IChuZXdBdHRyaWJ1dGVzLmxheW91dFNpemUuaXNFbXB0eSgpKSB7CisgICAgICAgIHJlc2V0Vmll
d3BvcnRUb0RlZmF1bHRTdGF0ZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9o
YXNWaWV3cG9ydEF0dHJpYnV0ZSA9IHRydWU7CisKKyAgICBtX3Jhd0F0dHJpYnV0ZXMgPSBuZXdB
dHRyaWJ1dGVzOworICAgIG1fYWxsb3dzVXNlclNjYWxpbmcgPSBtX3Jhd0F0dHJpYnV0ZXMudXNl
clNjYWxhYmxlOworICAgIG1faW5pdGlhbGx5Rml0VG9WaWV3cG9ydCA9IG1fcmF3QXR0cmlidXRl
cy5pbml0aWFsU2NhbGUgPCAwOworCisgICAgaWYgKCFtX2luaXRpYWxseUZpdFRvVmlld3BvcnQp
CisgICAgICAgIHJlc3RyaWN0U2NhbGVGYWN0b3JUb0luaXRpYWxTY2FsZUlmTm90VXNlclNjYWxh
YmxlKG1fcmF3QXR0cmlidXRlcyk7CisKKyAgICB1cGRhdGVNaW5pbXVtU2NhbGVUb0ZpdCgpOwor
CisgICAgc3luY1Zpc2libGVDb250ZW50cygpOworfQorCit2b2lkIFNpbXBsZVZpZXdwb3J0Q29u
dHJvbGxlcjo6c2Nyb2xsQnkoY29uc3QgSW50U2l6ZSYgc2Nyb2xsT2Zmc2V0KQoreworICAgIG1f
Y29udGVudHNQb3NpdGlvbi5tb3ZlKHNjcm9sbE9mZnNldCk7CisgICAgbV9jb250ZW50c1Bvc2l0
aW9uID0gYm91bmRDb250ZW50c1Bvc2l0aW9uKG1fY29udGVudHNQb3NpdGlvbik7CisKKyAgICBz
eW5jVmlzaWJsZUNvbnRlbnRzKCk7Cit9CisKK3ZvaWQgU2ltcGxlVmlld3BvcnRDb250cm9sbGVy
OjpzY3JvbGxUbyhjb25zdCBJbnRQb2ludCYgcG9zaXRpb24pCit7CisgICAgaWYgKG1fY29udGVu
dHNQb3NpdGlvbiA9PSBib3VuZENvbnRlbnRzUG9zaXRpb24ocG9zaXRpb24pKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBtX2NvbnRlbnRzUG9zaXRpb24gPSBib3VuZENvbnRlbnRzUG9zaXRpb24o
cG9zaXRpb24pOworICAgIHN5bmNWaXNpYmxlQ29udGVudHMoKTsKK30KKwordm9pZCBTaW1wbGVW
aWV3cG9ydENvbnRyb2xsZXI6OnN5bmNWaXNpYmxlQ29udGVudHMoKQoreworICAgIGlmIChtX3Zp
ZXdwb3J0U2l6ZS5pc0VtcHR5KCkgfHwgbV9jb250ZW50c1NpemUuaXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBtX2NsaWVudC0+ZGlkQ2hhbmdlVmlzaWJsZVJlY3QoKTsKK30KKwor
RmxvYXRSZWN0IFNpbXBsZVZpZXdwb3J0Q29udHJvbGxlcjo6dmlzaWJsZUNvbnRlbnRzUmVjdCgp
IGNvbnN0Cit7CisgICAgRmxvYXRSZWN0IHZpc2libGVDb250ZW50c1JlY3QoYm91bmRDb250ZW50
c1Bvc2l0aW9uKG1fY29udGVudHNQb3NpdGlvbiksIHZpc2libGVDb250ZW50c1NpemUoKSk7Cisg
ICAgdmlzaWJsZUNvbnRlbnRzUmVjdC5pbnRlcnNlY3QoRmxvYXRSZWN0KEZsb2F0UG9pbnQ6Onpl
cm8oKSwgbV9jb250ZW50c1NpemUpKTsKKworICAgIHJldHVybiB2aXNpYmxlQ29udGVudHNSZWN0
OworfQorCitGbG9hdFNpemUgU2ltcGxlVmlld3BvcnRDb250cm9sbGVyOjp2aXNpYmxlQ29udGVu
dHNTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gRmxvYXRTaXplKG1fdmlld3BvcnRTaXplLndp
ZHRoKCkgLyBtX3BhZ2VTY2FsZUZhY3RvciwgbV92aWV3cG9ydFNpemUuaGVpZ2h0KCkgLyBtX3Bh
Z2VTY2FsZUZhY3Rvcik7Cit9CisKK0Zsb2F0UG9pbnQgU2ltcGxlVmlld3BvcnRDb250cm9sbGVy
Ojpib3VuZENvbnRlbnRzUG9zaXRpb25BdFNjYWxlKGNvbnN0IEZsb2F0UG9pbnQmIGZyYW1lUG9z
aXRpb24sIGZsb2F0IHNjYWxlKSBjb25zdAoreworICAgIC8vIFdlIG5lZWQgdG8gZmxvb3IgdGhl
IHZpZXdwb3J0IGhlcmUgYXMgdG8gYWxsb3cgYWxpZ25pbmcgdGhlIGNvbnRlbnQgaW4gZGV2aWNl
IHVuaXRzLiBJZiBub3QsCisgICAgLy8gaXQgbWlnaHQgbm90IGJlIHBvc3NpYmxlIHRvIHNjcm9s
bCB0aGUgbGFzdCBwaXhlbCBhbmQgdGhhdCBhZmZlY3RzIGZpeGVkIHBvc2l0aW9uIGVsZW1lbnRz
LgorICAgIHJldHVybiBGbG9hdFBvaW50KAorICAgICAgICBjbGFtcFRvKGZyYW1lUG9zaXRpb24u
eCgpLCAuMGYsIHN0ZDo6bWF4KC4wZiwgbV9jb250ZW50c1NpemUud2lkdGgoKSAtIGZsb29yZiht
X3ZpZXdwb3J0U2l6ZS53aWR0aCgpIC8gc2NhbGUpKSksCisgICAgICAgIGNsYW1wVG8oZnJhbWVQ
b3NpdGlvbi55KCksIC4wZiwgc3RkOjptYXgoLjBmLCBtX2NvbnRlbnRzU2l6ZS5oZWlnaHQoKSAt
IGZsb29yZihtX3ZpZXdwb3J0U2l6ZS5oZWlnaHQoKSAvIHNjYWxlKSkpKTsKK30KKworRmxvYXRQ
b2ludCBTaW1wbGVWaWV3cG9ydENvbnRyb2xsZXI6OmJvdW5kQ29udGVudHNQb3NpdGlvbihjb25z
dCBGbG9hdFBvaW50JiBmcmFtZVBvc2l0aW9uKSBjb25zdAoreworICAgIHJldHVybiBib3VuZENv
bnRlbnRzUG9zaXRpb25BdFNjYWxlKGZyYW1lUG9zaXRpb24sIG1fcGFnZVNjYWxlRmFjdG9yKTsK
K30KKworYm9vbCBmdXp6eUNvbXBhcmUoZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgZXBzaWxvbikK
K3sKKyAgICByZXR1cm4gc3RkOjphYnMoYSAtIGIpIDwgZXBzaWxvbjsKK30KKworYm9vbCBTaW1w
bGVWaWV3cG9ydENvbnRyb2xsZXI6OnVwZGF0ZU1pbmltdW1TY2FsZVRvRml0KCkKK3sKKyAgICBp
ZiAobV92aWV3cG9ydFNpemUuaXNFbXB0eSgpIHx8IG1fY29udGVudHNTaXplLmlzRW1wdHkoKSB8
fCAhbV9oYXNWaWV3cG9ydEF0dHJpYnV0ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Ym9vbCBjdXJyZW50bHlTY2FsZWRUb0ZpdCA9IGZ1enp5Q29tcGFyZShtX3BhZ2VTY2FsZUZhY3Rv
ciwgbV9taW5pbXVtU2NhbGVUb0ZpdCwgMC4wMDAxKTsKKworICAgIGZsb2F0IG1pbmltdW1TY2Fs
ZSA9IGNvbXB1dGVNaW5pbXVtU2NhbGVGYWN0b3JGb3JDb250ZW50Q29udGFpbmVkKG1fcmF3QXR0
cmlidXRlcywgcm91bmRlZEludFNpemUobV92aWV3cG9ydFNpemUpLCByb3VuZGVkSW50U2l6ZSht
X2NvbnRlbnRzU2l6ZSkpOworCisgICAgaWYgKG1pbmltdW1TY2FsZSA8PSAwKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIWZ1enp5Q29tcGFyZShtaW5pbXVtU2NhbGUsIG1fbWlu
aW11bVNjYWxlVG9GaXQsIDAuMDAwMSkpIHsKKyAgICAgICAgbV9taW5pbXVtU2NhbGVUb0ZpdCA9
IG1pbmltdW1TY2FsZTsKKworICAgICAgICBpZiAoY3VycmVudGx5U2NhbGVkVG9GaXQpCisgICAg
ICAgICAgICBtX3BhZ2VTY2FsZUZhY3RvciA9IG1fbWluaW11bVNjYWxlVG9GaXQ7CisgICAgICAg
IGVsc2UgeworICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBlZmZlY3RpdmUgc2NhbGUgc3RheXMg
d2l0aGluIGJvdW5kcy4KKyAgICAgICAgICAgIGZsb2F0IGJvdW5kZWRTY2FsZSA9IGlubmVyQm91
bmRlZFZpZXdwb3J0U2NhbGUobV9wYWdlU2NhbGVGYWN0b3IpOworICAgICAgICAgICAgaWYgKCFm
dXp6eUNvbXBhcmUoYm91bmRlZFNjYWxlLCBtX3BhZ2VTY2FsZUZhY3RvciwgMC4wMDAxKSkKKyAg
ICAgICAgICAgICAgICBtX3BhZ2VTY2FsZUZhY3RvciA9IGJvdW5kZWRTY2FsZTsKKyAgICAgICAg
fQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K2Zsb2F0IFNpbXBsZVZpZXdwb3J0Q29udHJvbGxlcjo6aW5uZXJCb3VuZGVkVmlld3BvcnRTY2Fs
ZShmbG9hdCB2aWV3cG9ydFNjYWxlKSBjb25zdAoreworICAgIHJldHVybiBjbGFtcFRvKHZpZXdw
b3J0U2NhbGUsIG1fbWluaW11bVNjYWxlVG9GaXQsIG1fcmF3QXR0cmlidXRlcy5tYXhpbXVtU2Nh
bGUpOworfQorCit2b2lkIFNpbXBsZVZpZXdwb3J0Q29udHJvbGxlcjo6cmVzZXRWaWV3cG9ydFRv
RGVmYXVsdFN0YXRlKCkKK3sKKyAgICBtX2hhc1ZpZXdwb3J0QXR0cmlidXRlID0gZmFsc2U7Cisg
ICAgbV9wYWdlU2NhbGVGYWN0b3IgPSAxOworICAgIG1fbWluaW11bVNjYWxlVG9GaXQgPSAxOwor
CisgICAgLy8gSW5pdGlhbGl6aW5nIFZpZXdwb3J0IFJhdyBBdHRyaWJ1dGVzIHRvIGF2b2lkIHJh
bmRvbSBuZWdhdGl2ZSBvciBpbmZpbml0eSBzY2FsZSBmYWN0b3JzCisgICAgLy8gaWYgdGhlcmUg
aXMgYSByYWNlIGNvbmRpdGlvbiBiZXR3ZWVuIHRoZSBmaXJzdCBsYXlvdXQgYW5kIHNldHRpbmcg
dGhlIHZpZXdwb3J0IGF0dHJpYnV0ZXMgZm9yIHRoZSBmaXJzdCB0aW1lLgorICAgIG1fcmF3QXR0
cmlidXRlcy5taW5pbXVtU2NhbGUgPSAxOworICAgIG1fcmF3QXR0cmlidXRlcy5tYXhpbXVtU2Nh
bGUgPSAxOworICAgIG1fcmF3QXR0cmlidXRlcy51c2VyU2NhbGFibGUgPSBtX2FsbG93c1VzZXJT
Y2FsaW5nOworCisgICAgLy8gVGhlIGluaXRpYWwgc2NhbGUgbWlnaHQgYmUgaW1wbGljaXQgYW5k
IHNldCB0byAtMSwgaW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gaW5mZXIgaXQKKyAgICAvLyB1c2lu
ZyB0aGUgdmlld3BvcnQgc2l6ZSBhbmQgdGhlIGZpbmFsIGxheW91dCBzaXplLgorICAgIC8vIFRv
IGJlIGFibGUgdG8gYXNzZXJ0IGZvciB2YWxpZCBzY2FsZSB3ZSBpbml0aWFsaXplIGl0IHRvIC0x
LgorICAgIG1fcmF3QXR0cmlidXRlcy5pbml0aWFsU2NhbGUgPSAtMTsKK30KKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKENPT1JESU5BVEVEX0dSQVBISUNTX1RIUkVB
REVEKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvU2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhp
Y3MvU2ltcGxlVmlld3BvcnRDb250cm9sbGVyLmggYi9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQvQ29v
cmRpbmF0ZWRHcmFwaGljcy9TaW1wbGVWaWV3cG9ydENvbnRyb2xsZXIuaApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5j
MmVkNDlmOWRlMTMxNmU5YjQxZjRlYjIyNWViNzA0YjZkYjEyNDY0Ci0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYktpdDIvU2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3MvU2ltcGxlVmlld3Bv
cnRDb250cm9sbGVyLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MSwgMjAxMiBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAq
IENvcHlyaWdodCAoQykgMjAxMSBCZW5qYW1pbiBQb3VsYWluIDxiZW5qYW1pbkB3ZWJraXQub3Jn
PgorICogQ29weXJpZ2h0IChDKSAyMDE0IElnYWxpYSBTLkwuCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgU2ltcGxlVmlld3Bv
cnRDb250cm9sbGVyX2gKKyNkZWZpbmUgU2ltcGxlVmlld3BvcnRDb250cm9sbGVyX2gKKworI2lm
IFVTRShDT09SRElOQVRFRF9HUkFQSElDU19USFJFQURFRCkKKworI2luY2x1ZGUgPFdlYkNvcmUv
RmxvYXRQb2ludC5oPgorI2luY2x1ZGUgPFdlYkNvcmUvRmxvYXRSZWN0Lmg+CisjaW5jbHVkZSA8
V2ViQ29yZS9GbG9hdFNpemUuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL0ludFJlY3QuaD4KKyNpbmNs
dWRlIDxXZWJDb3JlL0ludFNpemUuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1ZpZXdwb3J0QXJndW1l
bnRzLmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisKK25hbWVzcGFjZSBXZWJLaXQg
eworCitjbGFzcyBTaW1wbGVWaWV3cG9ydENvbnRyb2xsZXIgeworICAgIFdURl9NQUtFX05PTkNP
UFlBQkxFKFNpbXBsZVZpZXdwb3J0Q29udHJvbGxlcik7CitwdWJsaWM6CisgICAgY2xhc3MgQ2xp
ZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgdm9pZCBkaWRDaGFuZ2VWaXNpYmxl
UmVjdCgpID0gMDsKKyAgICB9OworCisgICAgZXhwbGljaXQgU2ltcGxlVmlld3BvcnRDb250cm9s
bGVyKENsaWVudCopOworCisgICAgdm9pZCBkaWRDaGFuZ2VWaWV3cG9ydFNpemUoY29uc3QgV2Vi
Q29yZTo6RmxvYXRTaXplJik7CisgICAgdm9pZCBkaWRDaGFuZ2VDb250ZW50c1NpemUoY29uc3Qg
V2ViQ29yZTo6SW50U2l6ZSYpOworICAgIHZvaWQgZGlkQ2hhbmdlVmlld3BvcnRBdHRyaWJ1dGUo
Y29uc3QgV2ViQ29yZTo6Vmlld3BvcnRBdHRyaWJ1dGVzJik7CisKKyAgICB2b2lkIHNjcm9sbEJ5
KGNvbnN0IFdlYkNvcmU6OkludFNpemUmKTsKKyAgICB2b2lkIHNjcm9sbFRvKGNvbnN0IFdlYkNv
cmU6OkludFBvaW50Jik7CisKKyAgICBXZWJDb3JlOjpGbG9hdFJlY3QgdmlzaWJsZUNvbnRlbnRz
UmVjdCgpIGNvbnN0OworICAgIGZsb2F0IHBhZ2VTY2FsZUZhY3RvcigpIGNvbnN0IHsgcmV0dXJu
IG1fcGFnZVNjYWxlRmFjdG9yOyB9CisKK3ByaXZhdGU6CisKKyAgICBXZWJDb3JlOjpGbG9hdFNp
emUgdmlzaWJsZUNvbnRlbnRzU2l6ZSgpIGNvbnN0OworCisgICAgdm9pZCBzeW5jVmlzaWJsZUNv
bnRlbnRzKCk7CisKKyAgICB2b2lkIGFwcGx5U2NhbGVBZnRlclJlbmRlcmluZ0NvbnRlbnRzKGZs
b2F0IHNjYWxlKTsKKyAgICB2b2lkIGFwcGx5UG9zaXRpb25BZnRlclJlbmRlcmluZ0NvbnRlbnRz
KGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQmIHBvcyk7CisKKyAgICBXZWJDb3JlOjpGbG9hdFBv
aW50IGJvdW5kQ29udGVudHNQb3NpdGlvbihjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50JikgY29u
c3Q7CisgICAgV2ViQ29yZTo6RmxvYXRQb2ludCBib3VuZENvbnRlbnRzUG9zaXRpb25BdFNjYWxl
KGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQmLCBmbG9hdCBzY2FsZSkgY29uc3Q7CisKKyAgICBi
b29sIHVwZGF0ZU1pbmltdW1TY2FsZVRvRml0KCk7CisgICAgZmxvYXQgaW5uZXJCb3VuZGVkVmll
d3BvcnRTY2FsZShmbG9hdCkgY29uc3Q7CisKKyAgICB2b2lkIHJlc2V0Vmlld3BvcnRUb0RlZmF1
bHRTdGF0ZSgpOworCisgICAgQ2xpZW50KiBtX2NsaWVudDsKKworICAgIFdlYkNvcmU6OkZsb2F0
UG9pbnQgbV9jb250ZW50c1Bvc2l0aW9uOworICAgIFdlYkNvcmU6OkZsb2F0U2l6ZSBtX2NvbnRl
bnRzU2l6ZTsKKyAgICBXZWJDb3JlOjpGbG9hdFNpemUgbV92aWV3cG9ydFNpemU7CisgICAgZmxv
YXQgbV9wYWdlU2NhbGVGYWN0b3I7CisKKyAgICBib29sIG1fYWxsb3dzVXNlclNjYWxpbmc7Cisg
ICAgZmxvYXQgbV9taW5pbXVtU2NhbGVUb0ZpdDsKKyAgICBib29sIG1faW5pdGlhbGx5Rml0VG9W
aWV3cG9ydDsKKworICAgIGJvb2wgbV9oYXNWaWV3cG9ydEF0dHJpYnV0ZTsKKyAgICBXZWJDb3Jl
OjpWaWV3cG9ydEF0dHJpYnV0ZXMgbV9yYXdBdHRyaWJ1dGVzOworfTsKKworfSAvLyBuYW1lc3Bh
Y2UgV2ViS2l0CisKKyNlbmRpZiAvLyBVU0UoQ09PUkRJTkFURURfR1JBUEhJQ1NfVEhSRUFERUQp
CisKKyNlbmRpZiAvLyBTaW1wbGVWaWV3cG9ydENvbnRyb2xsZXJfaApkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYktpdDIvU2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3MvdGhyZWFkZWRjb21wb3NpdG9y
L1RocmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2UuY3BwIGIvU291cmNlL1dlYktpdDIvU2hhcmVk
L0Nvb3JkaW5hdGVkR3JhcGhpY3MvdGhyZWFkZWRjb21wb3NpdG9yL1RocmVhZFNhZmVDb29yZGlu
YXRlZFN1cmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmM3MDM0Njc5YTliYWY0MmIxMmExNmI2MmVjMjM1
Y2ZmYTQwOWM3MGEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQvQ29v
cmRpbmF0ZWRHcmFwaGljcy90aHJlYWRlZGNvbXBvc2l0b3IvVGhyZWFkU2FmZUNvb3JkaW5hdGVk
U3VyZmFjZS5jcHAKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBJ
Z2FsaWEgUy5MLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
CisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgor
ICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0UoQ09P
UkRJTkFURURfR1JBUEhJQ1MpCisjaW5jbHVkZSAiVGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFj
ZS5oIgorCisjaW5jbHVkZSA8V2ViQ29yZS9UZXh0dXJlTWFwcGVyR0wuaD4KKyNpbmNsdWRlIDx3
dGYvU3RkTGliRXh0cmFzLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3Bh
Y2UgV2ViS2l0IHsKKworUGFzc1JlZlB0cjxUaHJlYWRTYWZlQ29vcmRpbmF0ZWRTdXJmYWNlPiBU
aHJlYWRTYWZlQ29vcmRpbmF0ZWRTdXJmYWNlOjpjcmVhdGUoY29uc3QgSW50U2l6ZSYgc2l6ZSwg
Q29vcmRpbmF0ZWRTdXJmYWNlOjpGbGFncyBmbGFncykKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYo
bmV3IFRocmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2Uoc2l6ZSwgZmxhZ3MsIEltYWdlQnVmZmVy
OjpjcmVhdGUoc2l6ZSkpKTsKK30KKworUGFzc1JlZlB0cjxUaHJlYWRTYWZlQ29vcmRpbmF0ZWRT
dXJmYWNlPiBUaHJlYWRTYWZlQ29vcmRpbmF0ZWRTdXJmYWNlOjpjcmVhdGUoY29uc3QgSW50U2l6
ZSYgc2l6ZSwgQ29vcmRpbmF0ZWRTdXJmYWNlOjpGbGFncyBmbGFncywgc3RkOjp1bmlxdWVfcHRy
PEltYWdlQnVmZmVyPiBidWZmZXIpCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBUaHJlYWRT
YWZlQ29vcmRpbmF0ZWRTdXJmYWNlKHNpemUsIGZsYWdzLCBXVEY6Om1vdmUoYnVmZmVyKSkpOwor
fQorCitUaHJlYWRTYWZlQ29vcmRpbmF0ZWRTdXJmYWNlOjpUaHJlYWRTYWZlQ29vcmRpbmF0ZWRT
dXJmYWNlKGNvbnN0IEludFNpemUmIHNpemUsIENvb3JkaW5hdGVkU3VyZmFjZTo6RmxhZ3MgZmxh
Z3MsIHN0ZDo6dW5pcXVlX3B0cjxJbWFnZUJ1ZmZlcj4gYnVmZmVyKQorICAgIDogQ29vcmRpbmF0
ZWRTdXJmYWNlKHNpemUsIGZsYWdzKQorICAgICwgbV9pbWFnZUJ1ZmZlcihXVEY6Om1vdmUoYnVm
ZmVyKSkKK3sKK30KKworVGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFjZTo6flRocmVhZFNhZmVD
b29yZGluYXRlZFN1cmZhY2UoKQoreworfQorCit2b2lkIFRocmVhZFNhZmVDb29yZGluYXRlZFN1
cmZhY2U6OnBhaW50VG9TdXJmYWNlKGNvbnN0IEludFJlY3QmIHJlY3QsIENvb3JkaW5hdGVkU3Vy
ZmFjZTo6Q2xpZW50KiBjbGllbnQpCit7CisgICAgQVNTRVJUKGNsaWVudCk7CisKKyAgICBHcmFw
aGljc0NvbnRleHQqIGNvbnRleHQgPSBiZWdpblBhaW50KHJlY3QpOworICAgIGNsaWVudC0+cGFp
bnRUb1N1cmZhY2VDb250ZXh0KGNvbnRleHQpOworICAgIGVuZFBhaW50KCk7Cit9CisKK0dyYXBo
aWNzQ29udGV4dCogVGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFjZTo6YmVnaW5QYWludChjb25z
dCBJbnRSZWN0JiByZWN0KQoreworICAgIEFTU0VSVChtX2ltYWdlQnVmZmVyKTsKKyAgICBHcmFw
aGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCA9IG1faW1hZ2VCdWZmZXItPmNvbnRleHQoKTsK
KyAgICBncmFwaGljc0NvbnRleHQtPnNhdmUoKTsKKyAgICBncmFwaGljc0NvbnRleHQtPmNsaXAo
cmVjdCk7CisgICAgZ3JhcGhpY3NDb250ZXh0LT50cmFuc2xhdGUocmVjdC54KCksIHJlY3QueSgp
KTsKKyAgICByZXR1cm4gZ3JhcGhpY3NDb250ZXh0OworfQorCit2b2lkIFRocmVhZFNhZmVDb29y
ZGluYXRlZFN1cmZhY2U6OmVuZFBhaW50KCkKK3sKKyAgICBBU1NFUlQobV9pbWFnZUJ1ZmZlcik7
CisgICAgbV9pbWFnZUJ1ZmZlci0+Y29udGV4dCgpLT5yZXN0b3JlKCk7Cit9CisKK3ZvaWQgVGhy
ZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFjZTo6Y29weVRvVGV4dHVyZShQYXNzUmVmUHRyPEJpdG1h
cFRleHR1cmU+IHBhc3NUZXh0dXJlLCBjb25zdCBJbnRSZWN0JiB0YXJnZXQsIGNvbnN0IEludFBv
aW50JiBzb3VyY2VPZmZzZXQpCit7CisgICAgUmVmUHRyPEJpdG1hcFRleHR1cmU+IHRleHR1cmUo
cGFzc1RleHR1cmUpOworCisgICAgQVNTRVJUKG1faW1hZ2VCdWZmZXIpOworICAgIFJlZlB0cjxJ
bWFnZT4gaW1hZ2UgPSBtX2ltYWdlQnVmZmVyLT5jb3B5SW1hZ2UoRG9udENvcHlCYWNraW5nU3Rv
cmUpOworICAgIHRleHR1cmUtPnVwZGF0ZUNvbnRlbnRzKGltYWdlLmdldCgpLCB0YXJnZXQsIHNv
dXJjZU9mZnNldCwgQml0bWFwVGV4dHVyZTo6VXBkYXRlQ2FuTW9kaWZ5T3JpZ2luYWxJbWFnZURh
dGEpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQ09PUkRJ
TkFURURfR1JBUEhJQ1MpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9TaGFyZWQvQ29vcmRp
bmF0ZWRHcmFwaGljcy90aHJlYWRlZGNvbXBvc2l0b3IvVGhyZWFkU2FmZUNvb3JkaW5hdGVkU3Vy
ZmFjZS5oIGIvU291cmNlL1dlYktpdDIvU2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3MvdGhyZWFk
ZWRjb21wb3NpdG9yL1RocmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2UuaApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43
ZTMyNzdmYjQ1NTIxMDEzMDliNmQ2YTZhMmJlYThmYmNmNmFlNzc5Ci0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYktpdDIvU2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3MvdGhyZWFkZWRjb21w
b3NpdG9yL1RocmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2UuaApAQCAtMCwwICsxLDYxIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE0IElnYWxpYSBTLkwuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JT
IGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05U
UklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYg
VGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFjZV9oCisjZGVmaW5lIFRocmVhZFNhZmVDb29yZGlu
YXRlZFN1cmZhY2VfaAorCisjaWYgVVNFKENPT1JESU5BVEVEX0dSQVBISUNTKQorI2luY2x1ZGUg
PFdlYkNvcmUvQ29vcmRpbmF0ZWRTdXJmYWNlLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9JbWFnZUJ1
ZmZlci5oPgorCituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgVGhyZWFkU2FmZUNvb3JkaW5h
dGVkU3VyZmFjZSA6IHB1YmxpYyBXZWJDb3JlOjpDb29yZGluYXRlZFN1cmZhY2UgeworcHVibGlj
OgorICAgIHZpcnR1YWwgflRocmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2UoKTsKKworICAgIC8v
IENyZWF0ZSBhIG5ldyBUaHJlYWRTYWZlQ29vcmRpbmF0ZWRTdXJmYWNlIGFuZCBhbGxvY2F0ZSBl
aXRoZXIgYSBHcmFwaGljc1N1cmZhY2Ugb3IgYSBJbWFnZUJ1ZmZlciBhcyBiYWNraW5nLgorICAg
IHN0YXRpYyBQYXNzUmVmUHRyPFRocmVhZFNhZmVDb29yZGluYXRlZFN1cmZhY2U+IGNyZWF0ZShj
b25zdCBXZWJDb3JlOjpJbnRTaXplJiwgV2ViQ29yZTo6Q29vcmRpbmF0ZWRTdXJmYWNlOjpGbGFn
cyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnRUb1N1cmZhY2UoY29uc3QgV2ViQ29yZTo6SW50
UmVjdCYsIFdlYkNvcmU6OkNvb3JkaW5hdGVkU3VyZmFjZTo6Q2xpZW50Kikgb3ZlcnJpZGU7Cisg
ICAgdmlydHVhbCB2b2lkIGNvcHlUb1RleHR1cmUoUGFzc1JlZlB0cjxXZWJDb3JlOjpCaXRtYXBU
ZXh0dXJlPiwgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgdGFyZ2V0LCBjb25zdCBXZWJDb3JlOjpJ
bnRQb2ludCYgc291cmNlT2Zmc2V0KSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBUaHJlYWRT
YWZlQ29vcmRpbmF0ZWRTdXJmYWNlKGNvbnN0IFdlYkNvcmU6OkludFNpemUmLCBXZWJDb3JlOjpD
b29yZGluYXRlZFN1cmZhY2U6OkZsYWdzLCBzdGQ6OnVuaXF1ZV9wdHI8V2ViQ29yZTo6SW1hZ2VC
dWZmZXI+KTsKKworICAgIFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCogYmVnaW5QYWludChjb25z
dCBXZWJDb3JlOjpJbnRSZWN0Jik7CisgICAgdm9pZCBlbmRQYWludCgpOworCisgICAgLy8gQ3Jl
YXRlIGEgVGhyZWFkU2FmZUNvb3JkaW5hdGVkU3VyZmFjZSByZWZlcmVuY2luZyBhbiBleGlzaXRp
bmcgSW1hZ2VCdWZmZXIKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxUaHJlYWRTYWZlQ29vcmRpbmF0
ZWRTdXJmYWNlPiBjcmVhdGUoY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYsIFdlYkNvcmU6OkNvb3Jk
aW5hdGVkU3VyZmFjZTo6RmxhZ3MsIHN0ZDo6dW5pcXVlX3B0cjxXZWJDb3JlOjpJbWFnZUJ1ZmZl
cj4pOworCisgICAgc3RkOjp1bmlxdWVfcHRyPFdlYkNvcmU6OkltYWdlQnVmZmVyPiBtX2ltYWdl
QnVmZmVyOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKKyNlbmRpZiAvLyBVU0UoQ09P
UkRJTkFURURfR1JBUEhJQ1MpCisKKyNlbmRpZiAvLyBUaHJlYWRTYWZlQ29vcmRpbmF0ZWRTdXJm
YWNlX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1NoYXJlZC9Db29yZGluYXRlZEdyYXBo
aWNzL3RocmVhZGVkY29tcG9zaXRvci9UaHJlYWRlZENvbXBvc2l0b3IuY3BwIGIvU291cmNlL1dl
YktpdDIvU2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3MvdGhyZWFkZWRjb21wb3NpdG9yL1RocmVh
ZGVkQ29tcG9zaXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMjgwMmYwZGNhYzBhMTgzMDExYmZlZTEwOGE3
N2JjMmNhOWM1MTBlMAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQyL1NoYXJlZC9D
b29yZGluYXRlZEdyYXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9UaHJlYWRlZENvbXBvc2l0b3Iu
Y3BwCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IElnYWxpYSBT
LkwuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShDT09SRElOQVRF
RF9HUkFQSElDU19USFJFQURFRCkKKyNpbmNsdWRlICJUaHJlYWRlZENvbXBvc2l0b3IuaCIKKwor
I2luY2x1ZGUgPFdlYkNvcmUvVHJhbnNmb3JtYXRpb25NYXRyaXguaD4KKyNpbmNsdWRlIDx3dGYv
Q3VycmVudFRpbWUuaD4KKyNpbmNsdWRlIDx3dGYvUnVuTG9vcC5oPgorI2luY2x1ZGUgPHd0Zi9T
dGRMaWJFeHRyYXMuaD4KKworI2lmIFVTRShPUEVOR0xfRVNfMikKKyNpbmNsdWRlIDxHTEVTMi9n
bDIuaD4KKyNlbHNlCisjaW5jbHVkZSA8R0wvZ2wuaD4KKyNlbmRpZgorCit1c2luZyBuYW1lc3Bh
Y2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIENvbXBvc2l0aW5nUnVu
TG9vcCB7CisgICAgV1RGX01BS0VfTk9OQ09QWUFCTEUoQ29tcG9zaXRpbmdSdW5Mb29wKTsKKyAg
ICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBDb21wb3NpdGluZ1J1bkxv
b3Aoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHVwZGF0ZUZ1bmN0aW9uKQorICAgICAgICA6IG1fcnVu
TG9vcChSdW5Mb29wOjpjdXJyZW50KCkpCisgICAgICAgICwgbV91cGRhdGVUaW1lcihtX3J1bkxv
b3AsIHRoaXMsICZDb21wb3NpdGluZ1J1bkxvb3A6OnVwZGF0ZVRpbWVyRmlyZWQpCisgICAgICAg
ICwgbV91cGRhdGVGdW5jdGlvbihXVEY6Om1vdmUodXBkYXRlRnVuY3Rpb24pKQorICAgIHsKKyAg
ICB9CisKKyAgICB2b2lkIGNhbGxPbkNvbXBvc2l0aW5nUnVuTG9vcChzdGQ6OmZ1bmN0aW9uPHZv
aWQoKT4gZnVuY3Rpb24pCisgICAgeworICAgICAgICBpZiAoJm1fcnVuTG9vcCA9PSAmUnVuTG9v
cDo6Y3VycmVudCgpKSB7CisgICAgICAgICAgICBmdW5jdGlvbigpOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CisKKyAgICAgICAgbV9ydW5Mb29wLmRpc3BhdGNoKFdURjo6bW92ZShm
dW5jdGlvbikpOworICAgIH0KKworICAgIHZvaWQgc2V0VXBkYXRlVGltZXIoZG91YmxlIGludGVy
dmFsID0gMCkKKyAgICB7CisgICAgICAgIGlmIChtX3VwZGF0ZVRpbWVyLmlzQWN0aXZlKCkpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgbV91cGRhdGVUaW1lci5zdGFydE9uZVNob3Qo
aW50ZXJ2YWwpOworICAgIH0KKworICAgIHZvaWQgc3RvcFVwZGF0ZVRpbWVyKCkKKyAgICB7Cisg
ICAgICAgIGlmIChtX3VwZGF0ZVRpbWVyLmlzQWN0aXZlKCkpCisgICAgICAgICAgICBtX3VwZGF0
ZVRpbWVyLnN0b3AoKTsKKyAgICB9CisKKyAgICBSdW5Mb29wJiBydW5Mb29wKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBtX3J1bkxvb3A7CisgICAgfQorCitwcml2YXRlOgorCisgICAgdm9pZCB1
cGRhdGVUaW1lckZpcmVkKCkKKyAgICB7CisgICAgICAgIG1fdXBkYXRlRnVuY3Rpb24oKTsKKyAg
ICB9CisKKyAgICBSdW5Mb29wJiBtX3J1bkxvb3A7CisgICAgUnVuTG9vcDo6VGltZXI8Q29tcG9z
aXRpbmdSdW5Mb29wPiBtX3VwZGF0ZVRpbWVyOworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBt
X3VwZGF0ZUZ1bmN0aW9uOworfTsKKworUGFzc1JlZlB0cjxUaHJlYWRlZENvbXBvc2l0b3I+IFRo
cmVhZGVkQ29tcG9zaXRvcjo6Y3JlYXRlKENsaWVudCogY2xpZW50KQoreworICAgIHJldHVybiBh
ZG9wdFJlZihuZXcgVGhyZWFkZWRDb21wb3NpdG9yKGNsaWVudCkpOworfQorCitUaHJlYWRlZENv
bXBvc2l0b3I6OlRocmVhZGVkQ29tcG9zaXRvcihDbGllbnQqIGNsaWVudCkKKyAgICA6IG1fY2xp
ZW50KGNsaWVudCkKKyAgICAsIG1fc2NlbmUoYWRvcHRSZWYobmV3IENvb3JkaW5hdGVkR3JhcGhp
Y3NTY2VuZSh0aGlzKSkpCisgICAgLCBtX3ZpZXdwb3J0Q29udHJvbGxlcihzdGQ6Om1ha2VfdW5p
cXVlPFNpbXBsZVZpZXdwb3J0Q29udHJvbGxlcj4odGhpcykpCisgICAgLCBtX3RocmVhZElkZW50
aWZpZXIoMCkKK3sKKyAgICBjcmVhdGVDb21wb3NpdGluZ1RocmVhZCgpOworfQorCitUaHJlYWRl
ZENvbXBvc2l0b3I6On5UaHJlYWRlZENvbXBvc2l0b3IoKQoreworICAgIHRlcm1pbmF0ZUNvbXBv
c2l0aW5nVGhyZWFkKCk7Cit9CisKK3ZvaWQgVGhyZWFkZWRDb21wb3NpdG9yOjpzZXROZWVkc0Rp
c3BsYXkoKQoreworICAgIFJlZlB0cjxUaHJlYWRlZENvbXBvc2l0b3I+IHByb3RlY3Rvcih0aGlz
KTsKKyAgICBjYWxsT25Db21wb3NpdGluZ1RocmVhZChbPV0geworICAgICAgICBwcm90ZWN0b3It
PnNjaGVkdWxlRGlzcGxheUlmTmVlZGVkKCk7CisgICAgfSk7Cit9CisKK3ZvaWQgVGhyZWFkZWRD
b21wb3NpdG9yOjpzZXROYXRpdmVTdXJmYWNlSGFuZGxlRm9yQ29tcG9zaXRpbmcodWludDY0X3Qg
aGFuZGxlKQoreworICAgIFJlZlB0cjxUaHJlYWRlZENvbXBvc2l0b3I+IHByb3RlY3Rvcih0aGlz
KTsKKyAgICBjYWxsT25Db21wb3NpdGluZ1RocmVhZChbPV0geworICAgICAgICBwcm90ZWN0b3It
Pm1fbmF0aXZlU3VyZmFjZUhhbmRsZSA9IGhhbmRsZTsKKyAgICAgICAgcHJvdGVjdG9yLT5tX3Nj
ZW5lLT5zZXRBY3RpdmUodHJ1ZSk7CisgICAgfSk7Cit9CisKKwordm9pZCBUaHJlYWRlZENvbXBv
c2l0b3I6OmRpZENoYW5nZVZpZXdwb3J0U2l6ZShjb25zdCBJbnRTaXplJiBuZXdTaXplKQorewor
ICAgIFJlZlB0cjxUaHJlYWRlZENvbXBvc2l0b3I+IHByb3RlY3Rvcih0aGlzKTsKKyAgICBjYWxs
T25Db21wb3NpdGluZ1RocmVhZChbPV0geworICAgICAgICBwcm90ZWN0b3ItPnZpZXdwb3J0Q29u
dHJvbGxlcigpLT5kaWRDaGFuZ2VWaWV3cG9ydFNpemUobmV3U2l6ZSk7CisgICAgfSk7Cit9CisK
K3ZvaWQgVGhyZWFkZWRDb21wb3NpdG9yOjpkaWRDaGFuZ2VWaWV3cG9ydEF0dHJpYnV0ZShjb25z
dCBWaWV3cG9ydEF0dHJpYnV0ZXMmIGF0dHIpCit7CisgICAgUmVmUHRyPFRocmVhZGVkQ29tcG9z
aXRvcj4gcHJvdGVjdG9yKHRoaXMpOworICAgIGNhbGxPbkNvbXBvc2l0aW5nVGhyZWFkKFs9XSB7
CisgICAgICAgIHByb3RlY3Rvci0+dmlld3BvcnRDb250cm9sbGVyKCktPmRpZENoYW5nZVZpZXdw
b3J0QXR0cmlidXRlKGF0dHIpOworICAgIH0pOworfQorCit2b2lkIFRocmVhZGVkQ29tcG9zaXRv
cjo6ZGlkQ2hhbmdlQ29udGVudHNTaXplKGNvbnN0IEludFNpemUmIHNpemUpCit7CisgICAgUmVm
UHRyPFRocmVhZGVkQ29tcG9zaXRvcj4gcHJvdGVjdG9yKHRoaXMpOworICAgIGNhbGxPbkNvbXBv
c2l0aW5nVGhyZWFkKFs9XSB7CisgICAgICAgIHByb3RlY3Rvci0+dmlld3BvcnRDb250cm9sbGVy
KCktPmRpZENoYW5nZUNvbnRlbnRzU2l6ZShzaXplKTsKKyAgICB9KTsKK30KKwordm9pZCBUaHJl
YWRlZENvbXBvc2l0b3I6OnNjcm9sbFRvKGNvbnN0IEludFBvaW50JiBwb3NpdGlvbikKK3sKKyAg
ICBSZWZQdHI8VGhyZWFkZWRDb21wb3NpdG9yPiBwcm90ZWN0b3IodGhpcyk7CisgICAgY2FsbE9u
Q29tcG9zaXRpbmdUaHJlYWQoWz1dIHsKKyAgICAgICAgcHJvdGVjdG9yLT52aWV3cG9ydENvbnRy
b2xsZXIoKS0+c2Nyb2xsVG8ocG9zaXRpb24pOworICAgIH0pOworfQorCit2b2lkIFRocmVhZGVk
Q29tcG9zaXRvcjo6c2Nyb2xsQnkoY29uc3QgSW50U2l6ZSYgZGVsdGEpCit7CisgICAgUmVmUHRy
PFRocmVhZGVkQ29tcG9zaXRvcj4gcHJvdGVjdG9yKHRoaXMpOworICAgIGNhbGxPbkNvbXBvc2l0
aW5nVGhyZWFkKFs9XSB7CisgICAgICAgIHByb3RlY3Rvci0+dmlld3BvcnRDb250cm9sbGVyKCkt
PnNjcm9sbEJ5KGRlbHRhKTsKKyAgICB9KTsKK30KKwordm9pZCBUaHJlYWRlZENvbXBvc2l0b3I6
OnB1cmdlQmFja2luZ1N0b3JlcygpCit7CisgICAgbV9jbGllbnQtPnB1cmdlQmFja2luZ1N0b3Jl
cygpOworfQorCit2b2lkIFRocmVhZGVkQ29tcG9zaXRvcjo6cmVuZGVyTmV4dEZyYW1lKCkKK3sK
KyAgICBtX2NsaWVudC0+cmVuZGVyTmV4dEZyYW1lKCk7Cit9CisKK3ZvaWQgVGhyZWFkZWRDb21w
b3NpdG9yOjp1cGRhdGVWaWV3cG9ydCgpCit7CisgICAgc2V0TmVlZHNEaXNwbGF5KCk7Cit9CisK
K3ZvaWQgVGhyZWFkZWRDb21wb3NpdG9yOjpjb21taXRTY3JvbGxPZmZzZXQodWludDMyX3QgbGF5
ZXJJRCwgY29uc3QgSW50U2l6ZSYgb2Zmc2V0KQoreworICAgIG1fY2xpZW50LT5jb21taXRTY3Jv
bGxPZmZzZXQobGF5ZXJJRCwgb2Zmc2V0KTsKK30KKworYm9vbCBUaHJlYWRlZENvbXBvc2l0b3I6
OmVuc3VyZUdMQ29udGV4dCgpCit7CisgICAgaWYgKCFnbENvbnRleHQoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgZ2xDb250ZXh0KCktPm1ha2VDb250ZXh0Q3VycmVudCgpOworICAg
IC8vIFRoZSB3aW5kb3cgc2l6ZSBtYXkgYmUgb3V0IG9mIHN5bmMgd2l0aCB0aGUgcGFnZSBzaXpl
IGF0IHRoaXMgcG9pbnQsIGFuZCBnZXR0aW5nCisgICAgLy8gdGhlIHZpZXdwb3J0IHBhcmFtZXRl
cnMgaW5jb3JyZWN0LCBtZWFucyB0aGF0IHRoZSBjb250ZW50IHdpbGwgYmUgbWlzcGxhY2VkLiBU
aHVzCisgICAgLy8gd2Ugc2V0IHRoZSB2aWV3cG9ydCBwYXJhbWV0ZXJzIGRpcmVjdGx5IGZyb20g
dGhlIHdpbmRvdyBzaXplLgorICAgIEludFNpemUgY29udGV4dFNpemUgPSBnbENvbnRleHQoKS0+
ZGVmYXVsdEZyYW1lQnVmZmVyU2l6ZSgpOworICAgIGlmIChtX3ZpZXdwb3J0U2l6ZSAhPSBjb250
ZXh0U2l6ZSkgeworICAgICAgICBnbFZpZXdwb3J0KDAsIDAsIGNvbnRleHRTaXplLndpZHRoKCks
IGNvbnRleHRTaXplLmhlaWdodCgpKTsKKyAgICAgICAgbV92aWV3cG9ydFNpemUgPSBjb250ZXh0
U2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworR0xDb250ZXh0KiBUaHJlYWRl
ZENvbXBvc2l0b3I6OmdsQ29udGV4dCgpCit7CisgICAgaWYgKG1fY29udGV4dCkKKyAgICAgICAg
cmV0dXJuIG1fY29udGV4dC5nZXQoKTsKKworICAgIGlmICghbV9uYXRpdmVTdXJmYWNlSGFuZGxl
KQorICAgICAgICByZXR1cm4gMDsKKworICAgIG1fY29udGV4dCA9IEdMQ29udGV4dDo6Y3JlYXRl
Q29udGV4dEZvcldpbmRvdyhtX25hdGl2ZVN1cmZhY2VIYW5kbGUsIEdMQ29udGV4dDo6c2hhcmlu
Z0NvbnRleHQoKSk7CisgICAgcmV0dXJuIG1fY29udGV4dC5nZXQoKTsKK30KKwordm9pZCBUaHJl
YWRlZENvbXBvc2l0b3I6OnNjaGVkdWxlRGlzcGxheUlmTmVlZGVkKGRvdWJsZSBpbnRlcnZhbCkK
K3sKKyAgICBtX2NvbXBvc2l0aW5nUnVuTG9vcC0+c2V0VXBkYXRlVGltZXIoaW50ZXJ2YWwpOwor
fQorCit2b2lkIFRocmVhZGVkQ29tcG9zaXRvcjo6ZGlkQ2hhbmdlVmlzaWJsZVJlY3QoKQorewor
ICAgIEZsb2F0UmVjdCB2aXNpYmxlUmVjdCA9IHZpZXdwb3J0Q29udHJvbGxlcigpLT52aXNpYmxl
Q29udGVudHNSZWN0KCk7CisgICAgZmxvYXQgc2NhbGUgPSB2aWV3cG9ydENvbnRyb2xsZXIoKS0+
cGFnZVNjYWxlRmFjdG9yKCk7CisgICAgY2FsbE9uTWFpblRocmVhZChbPV0geworICAgICAgICBt
X2NsaWVudC0+c2V0VmlzaWJsZUNvbnRlbnRzUmVjdCh2aXNpYmxlUmVjdCwgRmxvYXRQb2ludDo6
emVybygpLCBzY2FsZSk7CisgICAgfSk7CisKKyAgICBzZXROZWVkc0Rpc3BsYXkoKTsKK30KKwor
dm9pZCBUaHJlYWRlZENvbXBvc2l0b3I6OnJlbmRlckxheWVyVHJlZSgpCit7CisgICAgaWYgKCFt
X3NjZW5lKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWVuc3VyZUdMQ29udGV4dCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBGbG9hdFJlY3QgY2xpcFJlY3QoMCwgMCwgbV92aWV3cG9y
dFNpemUud2lkdGgoKSwgbV92aWV3cG9ydFNpemUuaGVpZ2h0KCkpOworCisgICAgVHJhbnNmb3Jt
YXRpb25NYXRyaXggdmlld3BvcnRUcmFuc2Zvcm07CisgICAgRmxvYXRQb2ludCBzY3JvbGxQb3N0
aW9uID0gdmlld3BvcnRDb250cm9sbGVyKCktPnZpc2libGVDb250ZW50c1JlY3QoKS5sb2NhdGlv
bigpOworICAgIHZpZXdwb3J0VHJhbnNmb3JtLnNjYWxlKHZpZXdwb3J0Q29udHJvbGxlcigpLT5w
YWdlU2NhbGVGYWN0b3IoKSk7CisgICAgdmlld3BvcnRUcmFuc2Zvcm0udHJhbnNsYXRlKC1zY3Jv
bGxQb3N0aW9uLngoKSwgLXNjcm9sbFBvc3Rpb24ueSgpKTsKKworICAgIG1fc2NlbmUtPnBhaW50
VG9DdXJyZW50R0xDb250ZXh0KHZpZXdwb3J0VHJhbnNmb3JtLCAxLCBjbGlwUmVjdCwgQ29sb3I6
OndoaXRlLCBmYWxzZSwgc2Nyb2xsUG9zdGlvbik7CisKKyAgICBnbENvbnRleHQoKS0+c3dhcEJ1
ZmZlcnMoKTsKK30KKwordm9pZCBUaHJlYWRlZENvbXBvc2l0b3I6OnVwZGF0ZVNjZW5lU3RhdGUo
Y29uc3QgQ29vcmRpbmF0ZWRHcmFwaGljc1N0YXRlJiBzdGF0ZSkKK3sKKyAgICBtX3NjZW5lLT5h
cHBlbmRVcGRhdGUoYmluZCgmQ29vcmRpbmF0ZWRHcmFwaGljc1NjZW5lOjpjb21taXRTY2VuZVN0
YXRlLCBtX3NjZW5lLmdldCgpLCBzdGF0ZSkpOworICAgIHNldE5lZWRzRGlzcGxheSgpOworfQor
Cit2b2lkIFRocmVhZGVkQ29tcG9zaXRvcjo6Y2FsbE9uQ29tcG9zaXRpbmdUaHJlYWQoc3RkOjpm
dW5jdGlvbjx2b2lkKCk+IGZ1bmN0aW9uKQoreworICAgIG1fY29tcG9zaXRpbmdSdW5Mb29wLT5j
YWxsT25Db21wb3NpdGluZ1J1bkxvb3AoV1RGOjptb3ZlKGZ1bmN0aW9uKSk7Cit9CisKK3ZvaWQg
VGhyZWFkZWRDb21wb3NpdG9yOjpjb21wb3NpdGluZ1RocmVhZEVudHJ5KHZvaWQqIGNvb3JkaW5h
dGVkQ29tcG9zaXRvcikKK3sKKyAgICBzdGF0aWNfY2FzdDxUaHJlYWRlZENvbXBvc2l0b3IqPihj
b29yZGluYXRlZENvbXBvc2l0b3IpLT5ydW5Db21wb3NpdGluZ1RocmVhZCgpOworfQorCit2b2lk
IFRocmVhZGVkQ29tcG9zaXRvcjo6Y3JlYXRlQ29tcG9zaXRpbmdUaHJlYWQoKQoreworICAgIGlm
IChtX3RocmVhZElkZW50aWZpZXIpCisgICAgICAgIHJldHVybjsKKworICAgIE11dGV4TG9ja2Vy
IGxvY2tlcihtX2luaXRpYWxpemVSdW5Mb29wQ29uZGl0aW9uTXV0ZXgpOworICAgIG1fdGhyZWFk
SWRlbnRpZmllciA9IGNyZWF0ZVRocmVhZChjb21wb3NpdGluZ1RocmVhZEVudHJ5LCB0aGlzLCAi
V2ViQ29yZTogVGhyZWFkZWRDb21wb3NpdG9yIik7CisKKyAgICBtX2luaXRpYWxpemVSdW5Mb29w
Q29uZGl0aW9uLndhaXQobV9pbml0aWFsaXplUnVuTG9vcENvbmRpdGlvbk11dGV4KTsKK30KKwor
dm9pZCBUaHJlYWRlZENvbXBvc2l0b3I6OnJ1bkNvbXBvc2l0aW5nVGhyZWFkKCkKK3sKKyAgICB7
CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX2luaXRpYWxpemVSdW5Mb29wQ29uZGl0aW9u
TXV0ZXgpOworCisgICAgICAgIG1fY29tcG9zaXRpbmdSdW5Mb29wID0gc3RkOjptYWtlX3VuaXF1
ZTxDb21wb3NpdGluZ1J1bkxvb3A+KFsmXSB7CisgICAgICAgICAgICByZW5kZXJMYXllclRyZWUo
KTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgbV9pbml0aWFsaXplUnVuTG9vcENvbmRpdGlvbi5z
aWduYWwoKTsKKyAgICB9CisKKyAgICBtX2NvbXBvc2l0aW5nUnVuTG9vcC0+cnVuTG9vcCgpLnJ1
bigpOworCisgICAgbV9jb21wb3NpdGluZ1J1bkxvb3AtPnN0b3BVcGRhdGVUaW1lcigpOworICAg
IG1fc2NlbmUtPnB1cmdlR0xSZXNvdXJjZXMoKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXhMb2Nr
ZXIgbG9ja2VyKG1fdGVybWluYXRlUnVuTG9vcENvbmRpdGlvbk11dGV4KTsKKyAgICAgICAgbV9j
b21wb3NpdGluZ1J1bkxvb3AgPSBudWxscHRyOworICAgICAgICBtX2NvbnRleHQuY2xlYXIoKTsK
KyAgICAgICAgbV90ZXJtaW5hdGVSdW5Mb29wQ29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0KKwor
ICAgIGRldGFjaFRocmVhZChtX3RocmVhZElkZW50aWZpZXIpOworfQorCit2b2lkIFRocmVhZGVk
Q29tcG9zaXRvcjo6dGVybWluYXRlQ29tcG9zaXRpbmdUaHJlYWQoKQoreworICAgIE11dGV4TG9j
a2VyIGxvY2tlcihtX3Rlcm1pbmF0ZVJ1bkxvb3BDb25kaXRpb25NdXRleCk7CisKKyAgICBtX3Nj
ZW5lLT5kZXRhY2goKTsKKyAgICBtX2NvbXBvc2l0aW5nUnVuTG9vcC0+cnVuTG9vcCgpLnN0b3Ao
KTsKKworICAgIG1fdGVybWluYXRlUnVuTG9vcENvbmRpdGlvbi53YWl0KG1fdGVybWluYXRlUnVu
TG9vcENvbmRpdGlvbk11dGV4KTsKK30KKworfQorI2VuZGlmIC8vIFVTRShDT09SRElOQVRFRF9H
UkFQSElDU19USFJFQURFRCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1NoYXJlZC9Db29y
ZGluYXRlZEdyYXBoaWNzL3RocmVhZGVkY29tcG9zaXRvci9UaHJlYWRlZENvbXBvc2l0b3IuaCBi
L1NvdXJjZS9XZWJLaXQyL1NoYXJlZC9Db29yZGluYXRlZEdyYXBoaWNzL3RocmVhZGVkY29tcG9z
aXRvci9UaHJlYWRlZENvbXBvc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hZDBjY2ZkOWY4OGMzNDJkMGI4
ZThlY2Q3MDZmMmFkYjExZDg0OTViCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdDIv
U2hhcmVkL0Nvb3JkaW5hdGVkR3JhcGhpY3MvdGhyZWFkZWRjb21wb3NpdG9yL1RocmVhZGVkQ29t
cG9zaXRvci5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEln
YWxpYSBTLkwuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IK
KyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisg
KiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVGhyZWFkZWRDb21wb3NpdG9yX2gKKyNkZWZp
bmUgVGhyZWFkZWRDb21wb3NpdG9yX2gKKworI2lmIFVTRShDT09SRElOQVRFRF9HUkFQSElDU19U
SFJFQURFRCkKKworI2luY2x1ZGUgIkNvb3JkaW5hdGVkR3JhcGhpY3NTY2VuZS5oIgorI2luY2x1
ZGUgIlNpbXBsZVZpZXdwb3J0Q29udHJvbGxlci5oIgorI2luY2x1ZGUgPFdlYkNvcmUvR0xDb250
ZXh0Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9JbnRTaXplLmg+CisjaW5jbHVkZSA8V2ViQ29yZS9U
cmFuc2Zvcm1hdGlvbk1hdHJpeC5oPgorI2luY2x1ZGUgPHd0Zi9GYXN0TWFsbG9jLmg+CisjaW5j
bHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZFNhZmVSZWZDb3Vu
dGVkLmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CitjbGFzcyBDb29yZGluYXRlZEdyYXBoaWNzU3RhdGU7Cit9CisKK25hbWVzcGFjZSBXZWJLaXQg
eworY2xhc3MgQ29vcmRpbmF0ZWRHcmFwaGljc1NjZW5lOworY2xhc3MgQ29vcmRpbmF0ZWRHcmFw
aGljc1NjZW5lQ2xpZW50OworCitjbGFzcyBDb21wb3NpdGluZ1J1bkxvb3A7CisKK2NsYXNzIFRo
cmVhZGVkQ29tcG9zaXRvciA6IHB1YmxpYyBTaW1wbGVWaWV3cG9ydENvbnRyb2xsZXI6OkNsaWVu
dCwgcHVibGljIENvb3JkaW5hdGVkR3JhcGhpY3NTY2VuZUNsaWVudCwgcHVibGljIFRocmVhZFNh
ZmVSZWZDb3VudGVkPFRocmVhZGVkQ29tcG9zaXRvcj4geworICAgIFdURl9NQUtFX05PTkNPUFlB
QkxFKFRocmVhZGVkQ29tcG9zaXRvcik7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Citw
dWJsaWM6CisgICAgY2xhc3MgQ2xpZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwg
dm9pZCBzZXRWaXNpYmxlQ29udGVudHNSZWN0KGNvbnN0IFdlYkNvcmU6OkZsb2F0UmVjdCYsIGNv
bnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQmLCBmbG9hdCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZv
aWQgcHVyZ2VCYWNraW5nU3RvcmVzKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVuZGVy
TmV4dEZyYW1lKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgY29tbWl0U2Nyb2xsT2Zmc2V0
KHVpbnQzMl90IGxheWVySUQsIGNvbnN0IFdlYkNvcmU6OkludFNpemUmIG9mZnNldCkgPSAwOwor
ICAgIH07CisKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxUaHJlYWRlZENvbXBvc2l0b3I+IGNyZWF0
ZShDbGllbnQqKTsKKyAgICB2aXJ0dWFsIH5UaHJlYWRlZENvbXBvc2l0b3IoKTsKKworICAgIHZv
aWQgc2V0TmVlZHNEaXNwbGF5KCk7CisKKyAgICB2b2lkIHNldE5hdGl2ZVN1cmZhY2VIYW5kbGVG
b3JDb21wb3NpdGluZyh1aW50NjRfdCk7CisKKyAgICB2b2lkIHVwZGF0ZVNjZW5lU3RhdGUoY29u
c3QgV2ViQ29yZTo6Q29vcmRpbmF0ZWRHcmFwaGljc1N0YXRlJik7CisKKyAgICB2b2lkIGRpZENo
YW5nZVZpZXdwb3J0U2l6ZShjb25zdCBXZWJDb3JlOjpJbnRTaXplJik7CisgICAgdm9pZCBkaWRD
aGFuZ2VWaWV3cG9ydEF0dHJpYnV0ZShjb25zdCBXZWJDb3JlOjpWaWV3cG9ydEF0dHJpYnV0ZXMm
KTsKKyAgICB2b2lkIGRpZENoYW5nZUNvbnRlbnRzU2l6ZShjb25zdCBXZWJDb3JlOjpJbnRTaXpl
Jik7CisgICAgdm9pZCBzY3JvbGxUbyhjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYpOworICAgIHZv
aWQgc2Nyb2xsQnkoY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYpOworCitwcml2YXRlOgorICAgIFRo
cmVhZGVkQ29tcG9zaXRvcihDbGllbnQqKTsKKworICAgIC8vIENvb3JkaW5hdGVkR3JhcGhpY3NT
Y2VuZUNsaWVudAorICAgIHZpcnR1YWwgdm9pZCBwdXJnZUJhY2tpbmdTdG9yZXMoKSBvdmVycmlk
ZTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVuZGVyTmV4dEZyYW1lKCkgb3ZlcnJpZGU7CisgICAgdmly
dHVhbCB2b2lkIHVwZGF0ZVZpZXdwb3J0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGNv
bW1pdFNjcm9sbE9mZnNldCh1aW50MzJfdCBsYXllcklELCBjb25zdCBXZWJDb3JlOjpJbnRTaXpl
JiBvZmZzZXQpIG92ZXJyaWRlOworCisgICAgdm9pZCByZW5kZXJMYXllclRyZWUoKTsKKyAgICB2
b2lkIHNjaGVkdWxlRGlzcGxheUlmTmVlZGVkKGRvdWJsZSBpbnRlcnZhbCA9IDApOworICAgIHZp
cnR1YWwgdm9pZCBkaWRDaGFuZ2VWaXNpYmxlUmVjdCgpIG92ZXJyaWRlOworCisgICAgYm9vbCBl
bnN1cmVHTENvbnRleHQoKTsKKyAgICBXZWJDb3JlOjpHTENvbnRleHQqIGdsQ29udGV4dCgpOwor
ICAgIFNpbXBsZVZpZXdwb3J0Q29udHJvbGxlciogdmlld3BvcnRDb250cm9sbGVyKCkgeyByZXR1
cm4gbV92aWV3cG9ydENvbnRyb2xsZXIuZ2V0KCk7IH0KKworICAgIHZvaWQgY2FsbE9uQ29tcG9z
aXRpbmdUaHJlYWQoc3RkOjpmdW5jdGlvbjx2b2lkKCk+KTsKKyAgICB2b2lkIGNyZWF0ZUNvbXBv
c2l0aW5nVGhyZWFkKCk7CisgICAgdm9pZCBydW5Db21wb3NpdGluZ1RocmVhZCgpOworICAgIHZv
aWQgdGVybWluYXRlQ29tcG9zaXRpbmdUaHJlYWQoKTsKKyAgICBzdGF0aWMgdm9pZCBjb21wb3Np
dGluZ1RocmVhZEVudHJ5KHZvaWQqKTsKKworICAgIENsaWVudCogbV9jbGllbnQ7CisgICAgUmVm
UHRyPENvb3JkaW5hdGVkR3JhcGhpY3NTY2VuZT4gbV9zY2VuZTsKKyAgICBzdGQ6OnVuaXF1ZV9w
dHI8U2ltcGxlVmlld3BvcnRDb250cm9sbGVyPiBtX3ZpZXdwb3J0Q29udHJvbGxlcjsKKworICAg
IE93blB0cjxXZWJDb3JlOjpHTENvbnRleHQ+IG1fY29udGV4dDsKKworICAgIFdlYkNvcmU6Oklu
dFNpemUgbV92aWV3cG9ydFNpemU7CisgICAgdWludDY0X3QgbV9uYXRpdmVTdXJmYWNlSGFuZGxl
OworCisgICAgc3RkOjp1bmlxdWVfcHRyPENvbXBvc2l0aW5nUnVuTG9vcD4gbV9jb21wb3NpdGlu
Z1J1bkxvb3A7CisKKyAgICBUaHJlYWRJZGVudGlmaWVyIG1fdGhyZWFkSWRlbnRpZmllcjsKKyAg
ICBUaHJlYWRDb25kaXRpb24gbV9pbml0aWFsaXplUnVuTG9vcENvbmRpdGlvbjsKKyAgICBNdXRl
eCBtX2luaXRpYWxpemVSdW5Mb29wQ29uZGl0aW9uTXV0ZXg7CisgICAgVGhyZWFkQ29uZGl0aW9u
IG1fdGVybWluYXRlUnVuTG9vcENvbmRpdGlvbjsKKyAgICBNdXRleCBtX3Rlcm1pbmF0ZVJ1bkxv
b3BDb25kaXRpb25NdXRleDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYK
KworI2VuZGlmIC8vIFRocmVhZGVkQ29tcG9zaXRvcl9oCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>