<?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>74380</bug_id>
          
          <creation_ts>2011-12-12 19:53:42 -0800</creation_ts>
          <short_desc>[BlackBerry] Upstream BlackBerry API web page related files</short_desc>
          <delta_ts>2012-02-28 11:19:01 -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>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>73144</blocked>
    
    <blocked>79256</blocked>
    
    <blocked>79814</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Jacky Jiang">jkjiang</reporter>
          <assigned_to name="Jacky Jiang">jkjiang</assigned_to>
          <cc>dbates</cc>
    
    <cc>jrogers</cc>
    
    <cc>manyoso</cc>
    
    <cc>rwlbuis</cc>
    
    <cc>staikos</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>zimmermann</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>519825</commentid>
    <comment_count>0</comment_count>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2011-12-12 19:53:42 -0800</bug_when>
    <thetext>Upstream BlackBerry API web page related files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>558730</commentid>
    <comment_count>1</comment_count>
      <attachid>127479</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2012-02-16 17:18:21 -0800</bug_when>
    <thetext>Created attachment 127479
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>559652</commentid>
    <comment_count>2</comment_count>
      <attachid>127479</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-02-17 16:48:36 -0800</bug_when>
    <thetext>Comment on attachment 127479
Patch

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

I did a bit of this long file. I think we have maybe enough for another round. I am concerned about introducing deadcode.

Lets ask George, Eli and Yong if we can just delete the old link-to-link code (i pointed it out somewhere below).

Also I would like to suggest the following: having webpage:xxx() and the associated webpageprivate::xxx() method code to each other. Move some public WebPage methods up in the file, etc.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:263
&gt; +WebPagePrivate::WebPagePrivate(WebPage* webPage, WebPageClient* client, const Platform::IntRect&amp; rect)

lets make this ctor receive a WebCore::IntRect (so no prefix) instead of Platform::IntRect

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:296
&gt; +    , m_inPageSearchManager(new InPageSearchManager(this))

this leaks

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:368
&gt; +#if ENABLE_DRT
&gt; +    delete m_dumpRenderTree;
&gt; +    m_dumpRenderTree = 0;
&gt; +#endif
&gt; +
&gt; +}

extra line

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:462
&gt; +    m_page-&gt;settings()-&gt;setDelegateSelectionPaint(true);
&gt; +
&gt; +}

extra line

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:752
&gt; +            setScrollPosition(IntPoint(0, 0));

nit: intpoint::zero() here

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:917
&gt; +    // Should only be invoked when text reflow is enabled

nit: dot at the end

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:1232
&gt; +    if (!m_mainFrame-&gt;contentRenderer())
&gt; +        return IntSize();
&gt; +    return IntSize(m_mainFrame-&gt;contentRenderer()-&gt;rightAbsoluteVisibleOverflow(), m_mainFrame-&gt;contentRenderer()-&gt;bottomAbsoluteVisibleOverflow());

nit: add an empty line here for consistency

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:1342
&gt; +#if !OS(QNX)
&gt; +    else {
&gt; +        // On handset, if a web page would fit in landscape mode use mobile.
&gt; +        int maxMobileWidth = Platform::Graphics::Screen::landscapeWidth();
&gt; +
&gt; +        if (contentsSize().width() &gt; maxMobileWidth
&gt; +        || absoluteVisibleOverflowSize().width() &gt; maxMobileWidth)
&gt; +            needsLayout = setViewMode(Desktop);
&gt; +        else
&gt; +            needsLayout = setViewMode(Mobile);
&gt; +    }
&gt; +#else
&gt; +    else
&gt; +        needsLayout = setViewMode(Desktop);
&gt; +#endif

please ask arvid, adam or eli if we really want to stick with this !QNX block.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:1641
&gt; +    return mapToTransformed(IntRect(IntPoint(0, 0), size)).size();

intpoint:zero()

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:1646
&gt; +    return mapFromTransformed(IntRect(IntPoint(0, 0), size)).size();

ditto

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:1657
&gt; +    rect.intersect(IntRect(IntPoint(0, 0), transformedContentsSize()));

ditto

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:1732
&gt; +    // FIXME: Temp solution. We&apos;ll get back to this.

yeah?

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:1758
&gt; +Platform::NetworkStreamFactory* WebPagePrivate::networkStreamFactory()
&gt; +{
&gt; +    return m_client-&gt;networkStreamFactory();
&gt; +}
&gt; +
&gt; +

double lines

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:1938
&gt; +                    WTF::String url = stripLeadingAndTrailingHTMLSpaces(imageElement-&gt;getAttribute(HTMLNames::srcAttr).string());

remove the WTF:: prefix

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:1942
&gt; +            WTF::String alt = imageElement-&gt;altText();

ditto

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:2318
&gt; +class ComplicatedDistance {
&gt; +public:
&gt; +
&gt; +    enum DistanceType {
&gt; +        DistanceNone,
&gt; +        DistanceApart,
&gt; +        DistanceIntersected,
&gt; +        DistanceOverlapped,
&gt; +    };
&gt; +
&gt; +    DistanceType m_type;
&gt; +    int m_dist;
&gt; +
&gt; +    ComplicatedDistance() : m_type(DistanceNone), m_dist(0) { }
&gt; +
&gt; +    void calcDistance(int baseStart, int baseEnd, int targetStart, int targetEnd)
&gt; +    {
&gt; +        m_dist = targetEnd &lt;= baseStart ? targetEnd - baseStart - 1
&gt; +            : targetStart &gt;= baseEnd ? targetStart - baseEnd + 1
&gt; +            : 0;
&gt; +        if (m_dist) {
&gt; +            m_type = DistanceApart;
&gt; +            return;
&gt; +        }
&gt; +
&gt; +        m_dist = targetStart == baseStart
&gt; +                ? 0
&gt; +                : targetStart &lt; baseStart
&gt; +                ? targetEnd &gt;= baseEnd ? 0 : baseStart - targetEnd
&gt; +                : targetEnd &lt;= baseEnd ? 0 : baseEnd - targetStart;
&gt; +        if (m_dist) {
&gt; +            m_type = DistanceIntersected;
&gt; +            return;
&gt; +        }
&gt; +
&gt; +        m_dist = targetStart - baseStart + targetEnd - baseEnd;
&gt; +        m_type = DistanceOverlapped;
&gt; +    }
&gt; +
&gt; +    bool isPositive() const { return m_dist &gt;= 0; }
&gt; +    bool isNegative() const { return m_dist &lt;= 0; }
&gt; +
&gt; +    bool operator&lt;(const ComplicatedDistance&amp; o) const
&gt; +    {
&gt; +        return m_type != o.m_type
&gt; +            ? m_type &gt; o.m_type
&gt; +            : m_type == DistanceIntersected
&gt; +            ? abs(m_dist) &gt; abs(o.m_dist)
&gt; +            : abs(m_dist) &lt; abs(o.m_dist);
&gt; +    }
&gt; +    bool operator==(const ComplicatedDistance&amp; o) const
&gt; +    {
&gt; +        return m_type == o.m_type &amp;&amp; m_dist == o.m_dist;
&gt; +    }
&gt; +};
&gt; +
&gt; +static inline bool checkDirection(Platform::ScrollDirection dir, const ComplicatedDistance&amp; delta, Platform::ScrollDirection negDir, Platform::ScrollDirection posDir)
&gt; +{
&gt; +    return dir == negDir ? delta.isNegative() : dir == posDir ? delta.isPositive() : false;
&gt; +}
&gt; +
&gt; +static inline bool areNodesPerpendicularlyNavigatable(Platform::ScrollDirection dir, const IntRect&amp; baseRect, const IntRect&amp; targetRect)
&gt; +{
&gt; +    ComplicatedDistance distX, distY;
&gt; +    distX.calcDistance(baseRect.x(), baseRect.maxX(), targetRect.x(), targetRect.maxX());
&gt; +    distY.calcDistance(baseRect.y(), baseRect.maxY(), targetRect.y(), targetRect.maxY());
&gt; +
&gt; +    return distY &lt; distX ? dir == Platform::ScrollUp || dir == Platform::ScrollDown
&gt; +        : dir == Platform::ScrollLeft || dir == Platform::ScrollRight;
&gt; +}
&gt; +
&gt; +struct NodeDistance {
&gt; +    ComplicatedDistance m_dist;
&gt; +    ComplicatedDistance m_perpendicularDist;
&gt; +    IntRect m_rect;
&gt; +
&gt; +    bool isCloser(const NodeDistance&amp; o, Platform::ScrollDirection dir) const
&gt; +    {
&gt; +        return m_dist.m_type == o.m_dist.m_type
&gt; +            ? (m_dist == o.m_dist ? m_perpendicularDist &lt; o.m_perpendicularDist
&gt; +                : m_dist &lt; o.m_dist ? m_perpendicularDist.m_type &gt;= o.m_perpendicularDist.m_type
&gt; +                || !areNodesPerpendicularlyNavigatable(dir, o.m_rect, m_rect)
&gt; +                : m_perpendicularDist.m_type &gt; o.m_perpendicularDist.m_type
&gt; +                &amp;&amp; areNodesPerpendicularlyNavigatable(dir, m_rect, o.m_rect))
&gt; +            : m_dist.m_type &gt; o.m_dist.m_type;
&gt; +    }
&gt; +};
&gt; +
&gt; +static inline bool tellDistance(Platform::ScrollDirection dir, const IntRect&amp; baseRect, NodeDistance&amp; nodeDist)
&gt; +{
&gt; +    ComplicatedDistance distX, distY;
&gt; +    distX.calcDistance(baseRect.x(), baseRect.maxX(), nodeDist.m_rect.x(), nodeDist.m_rect.maxX());
&gt; +    distY.calcDistance(baseRect.y(), baseRect.maxY(), nodeDist.m_rect.y(), nodeDist.m_rect.maxY());
&gt; +
&gt; +    bool horizontal = distY &lt; distX;
&gt; +    if (horizontal ? checkDirection(dir, distX, Platform::ScrollLeft, Platform::ScrollRight) : checkDirection(dir, distY, Platform::ScrollUp, Platform::ScrollDown)) {
&gt; +        nodeDist.m_dist = horizontal ? distX : distY;
&gt; +        nodeDist.m_perpendicularDist = horizontal ? distY : distX;
&gt; +        return true;
&gt; +    }
&gt; +    return false;
&gt; +}

this is unused link-to-link code.

lets clean this up.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:2479
&gt; +bool WebPagePrivate::moveToNextField(Platform::ScrollDirection dir, int desiredScrollAmount)
&gt; +{
&gt; +    Frame* frame = focusedOrMainFrame();
&gt; +    if (!frame)
&gt; +        return false;
&gt; +
&gt; +    return moveToNextField(frame, dir, desiredScrollAmount);
&gt; +}
&gt; +
&gt; +bool WebPagePrivate::moveToNextField(Frame* frame, Platform::ScrollDirection dir, int desiredScrollAmount)
&gt; +{
&gt; +    Document* doc = frame-&gt;document();
&gt; +    FrameView* view = frame-&gt;view();
&gt; +    if (!doc || !view || view-&gt;needsLayout())
&gt; +        return false;
&gt; +
&gt; +    // The layout needs to be up-to-date to determine if a node is focusable.
&gt; +    doc-&gt;updateLayoutIgnorePendingStylesheets();
&gt; +
&gt; +    Node* origFocusedNode = doc-&gt;focusedNode();
&gt; +
&gt; +    Node* startNode = m_page-&gt;focusController()-&gt;findFocusableNode(FocusDirectionForward, doc, origFocusedNode, 0);
&gt; +
&gt; +    // Last node? get back to beginning.
&gt; +    if (!startNode &amp;&amp; origFocusedNode)
&gt; +        startNode = m_page-&gt;focusController()-&gt;findFocusableNode(FocusDirectionForward, doc, 0, 0);
&gt; +
&gt; +    if (!startNode || startNode == origFocusedNode)
&gt; +        return false;
&gt; +
&gt; +    Node* origRadioGroup = origFocusedNode
&gt; +        &amp;&amp; ((origFocusedNode-&gt;hasTagName(HTMLNames::inputTag)
&gt; +        &amp;&amp; static_cast&lt;HTMLInputElement*&gt;(origFocusedNode)-&gt;isRadioButton()))
&gt; +        ? origFocusedNode-&gt;parentNode() : 0;
&gt; +
&gt; +    IntRect visibleRect = IntRect(IntPoint(), actualVisibleSize());
&gt; +    // Constrain the rect if this is a subframe.
&gt; +    if (view-&gt;parent())
&gt; +        visibleRect.intersect(getRecursiveVisibleWindowRect(view));
&gt; +
&gt; +    IntRect baseRect;
&gt; +    if (origRadioGroup)
&gt; +        baseRect = getNodeWindowRect(origRadioGroup);
&gt; +    else if (origFocusedNode)
&gt; +        baseRect = getNodeWindowRect(origFocusedNode);
&gt; +    else {
&gt; +        baseRect = visibleRect;
&gt; +        switch (dir) {
&gt; +        case Platform::ScrollLeft:
&gt; +            baseRect.setX(baseRect.maxX());
&gt; +        case Platform::ScrollRight:
&gt; +            baseRect.setWidth(0);
&gt; +            break;
&gt; +        case Platform::ScrollUp:
&gt; +            baseRect.setY(baseRect.maxY());
&gt; +        case Platform::ScrollDown:
&gt; +            baseRect.setHeight(0);
&gt; +            break;
&gt; +        }
&gt; +    }
&gt; +
&gt; +    Node* bestChoice = 0;
&gt; +    NodeDistance bestChoiceDistance;
&gt; +    Node* lastCandidate = 0;
&gt; +    IntRect bestChoiceRect = baseRect;
&gt; +    Node* cur = startNode;
&gt; +
&gt; +    do {
&gt; +        if (cur-&gt;isFocusable()) {
&gt; +            Node* curRadioGroup = (cur-&gt;hasTagName(HTMLNames::inputTag)
&gt; +                &amp;&amp; static_cast&lt;HTMLInputElement*&gt;(cur)-&gt;isRadioButton())
&gt; +                ? cur-&gt;parentNode() : 0;
&gt; +            if (!curRadioGroup || static_cast&lt;HTMLInputElement*&gt;(cur)-&gt;checked()) {
&gt; +                IntRect nodeRect = curRadioGroup ? getNodeWindowRect(curRadioGroup) : getNodeWindowRect(cur);
&gt; +                // Note, if for some reason the nodeRect is 0x0, intersects will not match. This shouldn&apos;t be a
&gt; +                // problem as we don&apos;t want to focus on a non-visible node.
&gt; +                if (visibleRect.intersects(nodeRect)) {
&gt; +                    NodeDistance nodeDistance;
&gt; +                    nodeDistance.m_rect = nodeRect;
&gt; +                    if (tellDistance(dir, baseRect, nodeDistance)) {
&gt; +                        if (!bestChoice
&gt; +                            || nodeDistance.isCloser(bestChoiceDistance, dir)) {
&gt; +                            bestChoice = cur;
&gt; +                            bestChoiceDistance = nodeDistance;
&gt; +                            bestChoiceRect = nodeRect;
&gt; +                        }
&gt; +                    } else
&gt; +                        lastCandidate = cur;
&gt; +                }
&gt; +            }
&gt; +        }
&gt; +
&gt; +        cur = m_page-&gt;focusController()-&gt;findFocusableNode(FocusDirectionForward, doc, cur, 0);
&gt; +
&gt; +        // Last node? go back
&gt; +        if (!cur &amp;&amp; origFocusedNode)
&gt; +            cur = m_page-&gt;focusController()-&gt;findFocusableNode(FocusDirectionForward, doc, 0, 0);
&gt; +    } while (cur &amp;&amp; cur != origFocusedNode &amp;&amp; cur != startNode);
&gt; +
&gt; +    if (!bestChoice &amp;&amp; !origFocusedNode) {
&gt; +        // In the case that previously no node is on focus.
&gt; +        bestChoice = lastCandidate;
&gt; +    }
&gt; +
&gt; +    if (bestChoice) {
&gt; +        // FIXME: Temporarily disable automatical scrolling for HTML email.
&gt; +#if 0
&gt; +        if (Document* nodeDoc = bestChoice-&gt;document()) {
&gt; +            if (FrameView* nodeView = nodeDoc-&gt;view())
&gt; +                nodeView-&gt;scrollRectIntoViewRecursively(bestChoice-&gt;getRect());
&gt; +        }
&gt; +#endif
&gt; +
&gt; +        if (bestChoice-&gt;isElementNode())
&gt; +            static_cast&lt;Element*&gt;(bestChoice)-&gt;focus(true);
&gt; +        else
&gt; +            m_page-&gt;focusController()-&gt;setFocusedNode(bestChoice, bestChoice-&gt;document()-&gt;frame());
&gt; +
&gt; +        // Trigger a repaint of the node rect as it frequently isn&apos;t updated due to JavaScript being
&gt; +        // disabled. See RIM Bug #1242.
&gt; +        m_backingStore-&gt;d-&gt;repaint(bestChoiceRect, true /* contentChanged */, false /* immediate */);
&gt; +
&gt; +        return true;
&gt; +    }
&gt; +
&gt; +    if (Frame* parent = frame-&gt;tree()-&gt;parent()) {
&gt; +        if (moveToNextField(parent, dir, desiredScrollAmount))
&gt; +            return true;
&gt; +    }
&gt; +
&gt; +    return false;
&gt; +}

Same here.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:2546
&gt; +static inline int distanceBetweenPoints(IntPoint p1, IntPoint p2)
&gt; +{
&gt; +    // Change int to double, because (dy * dy) can cause int overflow in reality, e.g, (-46709 * -46709).
&gt; +    double dx = static_cast&lt;double&gt;(p1.x() - p2.x());
&gt; +    double dy = static_cast&lt;double&gt;(p1.y() - p2.y());
&gt; +    return sqrt((dx * dx) + (dy * dy));
&gt; +}

same here.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:2888
&gt; +            renderer-&gt;style()-&gt;isLeftToRightDirection() ? setScrollPosition(topLeftPoint) : setScrollPosition(IntPoint(reflowedRect.x() + reflowedRect.width() - actualVisibleSize().width(), topLeftPoint.y()));

this is a long line.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:2921
&gt; +WebPage::WebPage(WebPageClient* client, const WebString&amp; pageGroupName, const Platform::IntRect&amp; rect)
&gt; +{
&gt; +    globalInitialize();
&gt; +    d = new WebPagePrivate(this, client, rect);
&gt; +    d-&gt;init(pageGroupName);
&gt; +}

lets move this code up in the file.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:2938
&gt; +
&gt; +void WebPage::destroy()
&gt; +{
&gt; +    // TODO: need to verify if this call needs to be made before calling
&gt; +    // WebPage::destroyWebPageCompositor()
&gt; +    d-&gt;m_backingStore-&gt;d-&gt;suspendScreenAndBackingStoreUpdates();
&gt; +

ditto

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:2971
&gt; +WebPage::~WebPage()
&gt; +{
&gt; +    delete d;
&gt; +    d = 0;
&gt; +}
&gt; +
&gt; +WebPageClient* WebPage::client() const
&gt; +{
&gt; +    return d-&gt;m_client;
&gt; +}

ditto

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:3175
&gt; +void WebPage::setCaretHighlightStyle(Platform::CaretHighlightStyle style)
&gt; +{
&gt; +}

lets be sure it is not dead code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>559857</commentid>
    <comment_count>3</comment_count>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-02-18 19:46:29 -0800</bug_when>
    <thetext>lets also fix this:

/Devel/webkit/Source/WebKit/blackberry/Api/WebPage.cpp: In member function &apos;bool BlackBerry::WebKit::WebPage::touchEvent(const BlackBerry::Platform::TouchEvent&amp;)&apos;:

/Devel/webkit/Source/WebKit/blackberry/Api/WebPage.cpp:3778:12: warning: enumeration value &apos;TouchCancel&apos; not handled in switch [-Wswitch]

/Devel/webkit/Source/WebKit/blackberry/Api/WebPage.cpp:3790:45: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

/Devel/RIM/webkit/Source/WebKit/blackberry/Api/WebPage.cpp:3791:16: warning: enumeration value &apos;TouchStationary&apos; not handled in switch [-Wswitch]</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>560359</commentid>
    <comment_count>4</comment_count>
      <attachid>127479</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-20 14:25:03 -0800</bug_when>
    <thetext>Comment on attachment 127479
Patch

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

Partial review 3000 - 5000

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:3237
&gt; +    FloatSize currentPPI = Platform::Graphics::Screen::pixelsPerInch(-1);

What is -1 here?

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:3340
&gt; +        m_backingStore-&gt;d-&gt;orientationChanged(); // Updates tile geometry and creates visible tile buffer

Lacks period.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:3539
&gt; +        IntRect viewportRect = IntRect(IntPoint(0, 0), transformedActualVisibleSize);

IntPoint::zero

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:3541
&gt; +            = enclosingIntRect(rotationMatrix.inverse().mapRect(FloatRect(viewportRect)));

Can be one line I think.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:3708
&gt; +    d-&gt;showVirtualKeyboard(visible);

what if we just do d-&gt;m_client-&gt;inputSetNavigationMode(visible); here? That way we can remove showVirtualKeyboard...

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:3804
&gt; +

No need for empty line.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:3869
&gt; +bool WebPagePrivate::dispatchTouchEventToFullScreenPlugin(PluginView* plugin, const Platform::TouchEvent&amp; event)

Should be closer to dispatchMouseEventToFullScreenPlugin.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4059
&gt; +        Node* ownerNode = static_cast&lt;Node*&gt;(frame-&gt;ownerElement());

Is the static_cast needed? An Element is a Node too.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4237
&gt; +void WebPage::spellCheckingEnabled(bool enabled)

setSpellcheckingEnabled?

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4306
&gt; +            d-&gt;mapFromTransformed(startPoint);

How about:
bool invalidPoint = IntPoint(startPoint) == DOMSupport::InvalidPoint;
IntPoint start = invalidPoint ? DOMSupport::InvalidPoint : d-&gt;mapFromTransformed(startPoint);

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4310
&gt; +            d-&gt;mapFromTransformed(endPoint);

Ditto.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4396
&gt; +    if (!frame-&gt;view())

Can be combined with if above.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4425
&gt; +    if (!box-&gt;hasOverflowClip())

Ditto.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4461
&gt; +void pushBackInRegionScrollable(std::vector&lt;Platform::ScrollViewBase&gt;&amp; vector, InRegionScrollableArea scroller, WebPagePrivate* webPage)

static?

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4512
&gt; +        // propagate scroll to its parent scrollable.

Comment can be on two lines.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4539
&gt; +    // IF the minimum font size is ginormous, we may still want the scroll position to be 0,0

Lacks period.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4545
&gt; +    // Should only be invoked when text reflow is enabled

Ditto.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4574
&gt; +void WebPagePrivate::toggleTextReflowIfTextReflowEnabledOnlyForBlockZoom(bool shouldEnableTextReflow)

Seriously? What about toggleTextReflowIfEnabledForBlockZoomOnly?

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4594
&gt; +    double newScale = 0.0;

Can be just 0.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4819
&gt; +    double scale = 1.0;

Just 1 is ok here I think.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4856
&gt; +

Why empty line?

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4878
&gt; +    return d-&gt;m_inPageSearchManager-&gt;findNextString(WTF::String::fromUTF8(text), forward);

WTF:: not needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>561039</commentid>
    <comment_count>5</comment_count>
      <attachid>127479</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-21 11:01:55 -0800</bug_when>
    <thetext>Comment on attachment 127479
Patch

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

Lines 5001-EOF

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5092
&gt; +    BlackBerry::WebKit::clearDatabase(d-&gt;m_page-&gt;groupName());

BlackBerry::WebKit prefixes can be removed.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5172
&gt; +    if (nodeImpl) {

Can do if (Node* nodeImpl = node.impl()) { here

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5182
&gt; +    if (nodeImpl) {

Ditto.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5184
&gt; +        if (style)

Ditto.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5191
&gt; +WTF::String WebPagePrivate::findPatternStringForUrl(const KURL&amp; url) const

WTF prefix not needed.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5202
&gt; +    return WTF::String();

Ditto.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5220
&gt; +}

Do we need this?

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5295
&gt; +        MediaPlayerPrivate::notifyAppActivatedEvent(false);

Could combine to MediaPlayerPrivate::notifyAppActivatedEvent(activationState == ActivationActive)

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5328
&gt; +    for (; it != last; ++it)

These three lines are repeated a lot. How about making a macro for it so it only uses one line?

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5333
&gt; +{

Should done be marked as unused? Or maybe remove it.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5391
&gt; +}

Do we really need enablePasswordEcho/disablePasswordEcho? Clients can just use settings.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5592
&gt; +        const IntRect windowRect = IntRect(IntPoint(0, 0), viewportSize());

IntPoint::zero

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5914
&gt; +    if (doc)

Can combine above two lines.

&gt; Source/WebKit/blackberry/Api/WebPage_p.h:36
&gt; +#include &lt;wtf/OwnPtr.h&gt;

Are all these includes needed? For instance WebPage is both included and declared as forward class reference.

&gt; Source/WebKit/blackberry/Api/WebPage_p.h:60
&gt; +class TransformationMatrix;

This can be cleaned up a lot, for instance SurfaceOpenVG is not used at all.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>561271</commentid>
    <comment_count>6</comment_count>
      <attachid>127479</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2012-02-21 15:21:03 -0800</bug_when>
    <thetext>Comment on attachment 127479
Patch

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

&gt;&gt; Source/WebKit/blackberry/Api/WebPage.cpp:3237
&gt;&gt; +    FloatSize currentPPI = Platform::Graphics::Screen::pixelsPerInch(-1);
&gt; 
&gt; What is -1 here?

It means we don&apos;t pass the actual angle, just get the current orientation which is used to calculate the current PPI.

&gt;&gt; Source/WebKit/blackberry/Api/WebPage.cpp:3708
&gt;&gt; +    d-&gt;showVirtualKeyboard(visible);
&gt; 
&gt; what if we just do d-&gt;m_client-&gt;inputSetNavigationMode(visible); here? That way we can remove showVirtualKeyboard...

Don&apos;t think so, as we are using showVirtualKeyboard() in PluginViewPrivate::showKeyboard(bool value) as a virtual function.

&gt;&gt; Source/WebKit/blackberry/Api/WebPage.cpp:3869
&gt;&gt; +bool WebPagePrivate::dispatchTouchEventToFullScreenPlugin(PluginView* plugin, const Platform::TouchEvent&amp; event)
&gt; 
&gt; Should be closer to dispatchMouseEventToFullScreenPlugin.

This is close to the above caller WebPage::touchEvent(const Platform::TouchEvent&amp; event).  Do we really need to move it to the place close to dispatchMouseEventToFullScreenPlugin?

&gt;&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4237
&gt;&gt; +void WebPage::spellCheckingEnabled(bool enabled)
&gt; 
&gt; setSpellcheckingEnabled?

Tend to agree.

&gt;&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4461
&gt;&gt; +void pushBackInRegionScrollable(std::vector&lt;Platform::ScrollViewBase&gt;&amp; vector, InRegionScrollableArea scroller, WebPagePrivate* webPage)
&gt; 
&gt; static?

Will add static.

&gt;&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4574
&gt;&gt; +void WebPagePrivate::toggleTextReflowIfTextReflowEnabledOnlyForBlockZoom(bool shouldEnableTextReflow)
&gt; 
&gt; Seriously? What about toggleTextReflowIfEnabledForBlockZoomOnly?

Will change.

&gt;&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5092
&gt;&gt; +    BlackBerry::WebKit::clearDatabase(d-&gt;m_page-&gt;groupName());
&gt; 
&gt; BlackBerry::WebKit prefixes can be removed.

As matter of fact, removing  BlackBerry::WebKit before clearLocalStorage() can cause compiling error, as the compiler always choose WebPage::clearLocalStorage() instead of the one with a parameter.

&gt;&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5220
&gt;&gt; +}
&gt; 
&gt; Do we need this?

Don&apos;t think we need, will kill it.

&gt;&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5391
&gt;&gt; +}
&gt; 
&gt; Do we really need enablePasswordEcho/disablePasswordEcho? Clients can just use settings.

Seems still need them, introduced in PR#108802.

&gt;&gt; Source/WebKit/blackberry/Api/WebPage_p.h:36
&gt;&gt; +#include &lt;wtf/OwnPtr.h&gt;
&gt; 
&gt; Are all these includes needed? For instance WebPage is both included and declared as forward class reference.

Will clean up more.

&gt;&gt; Source/WebKit/blackberry/Api/WebPage_p.h:60
&gt;&gt; +class TransformationMatrix;
&gt; 
&gt; This can be cleaned up a lot, for instance SurfaceOpenVG is not used at all.

Will clean up more.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>561306</commentid>
    <comment_count>7</comment_count>
      <attachid>127479</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2012-02-21 15:54:34 -0800</bug_when>
    <thetext>Comment on attachment 127479
Patch

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

&gt;&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5328
&gt;&gt; +    for (; it != last; ++it)
&gt; 
&gt; These three lines are repeated a lot. How about making a macro for it so it only uses one line?

Not sure about this, may be we can do it in a follow up patch if there is any better ideas.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562018</commentid>
    <comment_count>8</comment_count>
      <attachid>128226</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2012-02-22 09:02:49 -0800</bug_when>
    <thetext>Created attachment 128226
Patch

Update the fixes based on Antonio and Rob&apos;s comments except the one that associate WebPage and WebPagePrivate methods which would be done in another patch. The local diff of the fixes is here webkit/1dcf848d6d</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562037</commentid>
    <comment_count>9</comment_count>
      <attachid>128226</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-02-22 09:20:06 -0800</bug_when>
    <thetext>Comment on attachment 128226
Patch

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

&gt; Source/WebKit/blackberry/Api/WebPage_p.h:68
&gt; +typedef HashMap&lt;const WebCore::Frame*, BackingStoreClient*&gt; BackingStoreClientForFrameMap;

I think we could move it to within the class, close to where it is used?

&gt; Source/WebKit/blackberry/Api/WebPage_p.h:209
&gt; +    int reflowWidth() const
&gt; +    {
&gt; +        // Note: to make this reflow width transform invariant just use
&gt; +        // transformedActualVisibleSize() here instead!
&gt; +        return actualVisibleSize().width();
&gt; +    }

move it to .cpp file or make it one-liner like the others above it for consistency

&gt; Source/WebKit/blackberry/Api/WebPage_p.h:299
&gt; +    bool didLayoutExceedMaximumIterations() const
&gt; +    {
&gt; +        // ZoomToFitOnLoad can lead to a large recursion depth in FrameView::layout() as we attempt
&gt; +        // to determine the zoom scale factor so as to have the content of the page fit within the
&gt; +        // area of the frame. From observation, we can bail out after a recursion depth of 10 and
&gt; +        // still have reasonable results.
&gt; +        return m_nestedLayoutFinishedCount &gt; 10;

ditto

&gt; Source/WebKit/blackberry/Api/WebPage_p.h:303
&gt; +    }
&gt; +
&gt; +
&gt; +    void clearFocusNode();

too many blank lines

&gt; Source/WebKit/blackberry/Api/WebPage_p.h:483
&gt; +    double m_lastUserEventTimestamp; // Used to detect user scrolling.

I am sure it is not needed anymore, lets clean it up later.

&gt; Source/WebKit/blackberry/Api/WebPage_p.h:518
&gt; +    bool m_updateDelegatedOverlaysDispatched;
&gt; +
&gt; +};

lets drop this extra new line</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562214</commentid>
    <comment_count>10</comment_count>
      <attachid>128258</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2012-02-22 12:01:02 -0800</bug_when>
    <thetext>Created attachment 128258
Patch

Updated the patch based on Antonio&apos;s comments except the m_lastUserEventTimestamp.  Also replaced plugin views for loop with FOR_EACH_PLUGINVIEW macro.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562323</commentid>
    <comment_count>11</comment_count>
      <attachid>128258</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-22 13:25:15 -0800</bug_when>
    <thetext>Comment on attachment 128258
Patch

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

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:160
&gt; +{

better hide s_visibleWebPages inside this function with DEFINE_STATIC_LOCAL.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:168
&gt; +static double maximumBlockZoomScale = 3.0; // This scale can be clamped by the maximumScale set for the page.

Can use just 3.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:172
&gt; +const double delayedZoomInterval = 0.0;

Can use just 0.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:421
&gt; +    m_page-&gt;setCustomHTMLTokenizerTimeDelay(0.300);

Can use just 0.3

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:969
&gt; +    const IntRect viewportRect = IntRect(IntPoint(0, 0), transformedViewportSize());

Inpoint::zero

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:2197
&gt; +        return IntRect(IntPoint(0, 0), view-&gt;contentsSize());

IntPoint::zero

&gt; Source/WebKit/blackberry/Api/WebPage_p.h:192
&gt; +    double currentScale() const;

Really seems like an inline candidate!

&gt; Source/WebKit/blackberry/Api/WebPage_p.h:196
&gt; +    double minimumScale() const;

We could inline methods like this, would make WebPage.cpp smaller.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562325</commentid>
    <comment_count>12</comment_count>
      <attachid>128258</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-02-22 13:26:26 -0800</bug_when>
    <thetext>Comment on attachment 128258
Patch

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

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:2314
&gt; +Node* WebPagePrivate::bestChildNodeForClickRect(Node* parentNode, const IntRect&amp; clickRect)

make it a local static.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:2323
&gt; +    while (node) {

for (; node; node = node-&gt;nextSibling()) {

    if (!clickRect.intersecsts(rect))
         continue;

    align the block below accordingly
}

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:2498
&gt; +        if (frame) {

early return here (using &apos;continue&apos;)

align the block below it accordingly

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:2533
&gt; +    if (!tnode-&gt;hasTagName(HTMLNames::imgTag) &amp;&amp; !tnode-&gt;hasTagName(HTMLNames::inputTag) &amp;&amp; !tnode-&gt;hasTagName(HTMLNames::textareaTag))

wrap it with { }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562461</commentid>
    <comment_count>13</comment_count>
      <attachid>128304</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2012-02-22 15:32:44 -0800</bug_when>
    <thetext>Created attachment 128304
Patch

Updated the patch based on Rob and Antonio&apos;s comments. Leave the name changing of spellCheckingEnabled in another patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>562708</commentid>
    <comment_count>14</comment_count>
      <attachid>128304</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-02-22 19:28:39 -0800</bug_when>
    <thetext>Comment on attachment 128304
Patch

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

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:3354
&gt; +    IntSize size(width, height);
&gt; +    if (size == d-&gt;m_defaultLayoutSize)
&gt; +        return;
&gt; +
&gt; +    d-&gt;setDefaultLayoutSize(size);
&gt; +    bool needsLayout = d-&gt;setViewMode(d-&gt;viewMode());
&gt; +    if (needsLayout) {
&gt; +        d-&gt;setNeedsLayout();
&gt; +        if (!d-&gt;isLoading())
&gt; +            d-&gt;requestLayoutIfNeeded();
&gt; +    }

this should go within WebPagePrivate::setDefaultLayoutSize, since it mainly only access d&apos;s stuff

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:3381
&gt; +    int clickCount = (d-&gt;m_selectionHandler-&gt;isSelectionActive() || mouseEvent.type() != Platform::MouseEvent::MouseMove) ? 1 : 0;

unneeded ()

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:3405
&gt; +                                      false, false, false, false);

these are a bunch of false&apos;s. What are them about? please add /**/ comments.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:3505
&gt; +    EventHandler* eventHandler = m_mainFrame-&gt;eventHandler();
&gt; +
&gt; +    return eventHandler-&gt;handleWheelEvent(wheelEvent);

unneeded eventHandler var.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4138
&gt; +// FIXME: Fix it upstream!

FIXME: Fix RenderBox::canBeScrolledAndHasScrollableArea method instead.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4361
&gt; +    // Uncomment this to return in order to see the blocks being selected.
&gt; +//    d-&gt;m_client-&gt;zoomChanged(isMinZoomed(), isMaxZoomed(), isAtInitialZoom(), currentZoomLevel());
&gt; +//    return true;

it is already under a debug macro, so does it still need to be commented out code? What does this do if we leave it uncomment?

...or at least align it properly! :-)

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4469
&gt; +        if (oldScale == d-&gt;minimumScale() || (distanceBetweenPoints(roundTransformedPoint(d-&gt;mapToTransformed(d-&gt;scrollPosition())), roundTransformedPoint(d-&gt;m_finalBlockPoint)) &lt; minimumDisplacement &amp;&amp; abs(newScale - oldScale) / oldScale &lt; 0.10)) {

0.1 looks so magic here.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4636
&gt; +void WebPage::pauseInDebugger()
&gt; +
&gt; +{

blank line here

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4695
&gt; +    if (!d-&gt;m_mainFrame)
&gt; +        return 0;
&gt; +    JSC::Bindings::RootObject *root = d-&gt;m_mainFrame-&gt;script()-&gt;bindingRootObject();

add a new line here

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4698
&gt; +    if (!root)
&gt; +        return 0;
&gt; +    JSC::ExecState *exec = root-&gt;globalObject()-&gt;globalExec();

ditto

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4714
&gt; +#if ENABLE(WEBDOM)
&gt; +WebDOMDocument WebPage::document() const
&gt; +{
&gt; +    if (!d-&gt;m_mainFrame)
&gt; +        return WebDOMDocument();
&gt; +    return WebDOMDocument(d-&gt;m_mainFrame-&gt;document());
&gt; +}
&gt; +#endif

lets group this one together with the other WEBDOM block below.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4762
&gt; +void WebPage::clearHistory()
&gt; +{
&gt; +    // Don&apos;t clear the back-forward list as we might like to keep it.
&gt; +}
&gt; +

:?

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4952
&gt; +    HashSet&lt;PluginView*&gt;::const_iterator it = d-&gt;m_pluginViews.begin();
&gt; +    HashSet&lt;PluginView*&gt;::const_iterator last = d-&gt;m_pluginViews.end();
&gt; +
&gt; +#if ENABLE(VIDEO)
&gt; +    MediaPlayerPrivate::notifyAppActivatedEvent(activationState == ActivationActive);
&gt; +#endif
&gt; +
&gt; +    for (; it != last; ++it) {

FOR_EACH_PLUGINVIEW here too?

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4964
&gt; +            ASSERT(0);

ASSERT_NOT_REACHED()

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5053
&gt; +Frame* WebPage::mainFrame() const
&gt; +{
&gt; +    return d-&gt;m_mainFrame;
&gt; +}

I do not think this should be a public API.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5462
&gt; +// MARK: WebSettingsDelegate.

lets remove this comment.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5468
&gt; +void WebPagePrivate::didChangeSettings(WebSettings* webSettings)
&gt; +{
&gt; +    Settings* coreSettings = m_page-&gt;settings();
&gt; +    m_page-&gt;setGroupName(webSettings-&gt;pageGroupName());
&gt; +    coreSettings-&gt;setXSSAuditorEnabled(webSettings-&gt;xssAuditorEnabled());

I wish we could move this whole method out of here in a follow up.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5555
&gt; +    static IntSize size;
&gt; +
&gt; +    if (size.isEmpty())

drop blank line

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:5566
&gt; +    if (Document* doc = d-&gt;m_page-&gt;focusController()-&gt;focusedOrMainFrame()-&gt;document())
&gt; +        return doc-&gt;queryCommandValue(query);
&gt; +    return &quot;&quot;;

add a new line here

&gt; Source/WebKit/blackberry/Api/WebPage.h:222
&gt; +#if defined(ENABLE_WEBDOM) &amp;&amp; ENABLE_WEBDOM
&gt; +    WebDOMDocument document() const;
&gt; +#endif

move it down together with the other WEBDOM stuff.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563292</commentid>
    <comment_count>15</comment_count>
      <attachid>128516</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2012-02-23 11:25:56 -0800</bug_when>
    <thetext>Created attachment 128516
Patch

Updated the patch based on Antonio&apos;s comments. WebPage::mainFrame() related clean up will be done in a follow up patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563337</commentid>
    <comment_count>16</comment_count>
      <attachid>128516</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-02-23 12:00:25 -0800</bug_when>
    <thetext>Comment on attachment 128516
Patch

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

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4156
&gt; +    ASSERT(layer);
&gt; +
&gt; +    if (layer-&gt;parent())

follow up: remove blank line

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4207
&gt; +    RenderLayer* layer = renderer-&gt;enclosingLayer();
&gt; +
&gt; +    do {

ditto.

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4233
&gt; +        }
&gt; +
&gt; +    } while (layer = parentLayer(layer));

ditto

&gt; Source/WebKit/blackberry/Api/WebPage.cpp:4541
&gt; +Platform::IntRect WebPage::focusNodeRect()
&gt; +{
&gt; +    return d-&gt;focusNodeRect();
&gt; +}

lets also move it to Private in a followup</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563844</commentid>
    <comment_count>17</comment_count>
      <attachid>128516</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-23 19:40:43 -0800</bug_when>
    <thetext>Comment on attachment 128516
Patch

Clearing flags on attachment: 128516

Committed r108718: &lt;http://trac.webkit.org/changeset/108718&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>563845</commentid>
    <comment_count>18</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-23 19:40:50 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>565964</commentid>
    <comment_count>19</comment_count>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2012-02-27 14:07:09 -0800</bug_when>
    <thetext>Clean up more in a follow up patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>565982</commentid>
    <comment_count>20</comment_count>
      <attachid>129099</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2012-02-27 14:28:43 -0800</bug_when>
    <thetext>Created attachment 129099
Patch

A follow patch. Libwebview patch is here libwebview/68b25bd6f0b4ea3c43fb79a4d02137a7a14b8cc7</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566187</commentid>
    <comment_count>21</comment_count>
      <attachid>129099</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-27 17:34:34 -0800</bug_when>
    <thetext>Comment on attachment 129099
Patch

Clearing flags on attachment: 129099

Committed r109051: &lt;http://trac.webkit.org/changeset/109051&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>566188</commentid>
    <comment_count>22</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-27 17:34:41 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>127479</attachid>
            <date>2012-02-16 17:18:21 -0800</date>
            <delta_ts>2012-02-22 09:02:44 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74380-20120216201759.patch</filename>
            <type>text/plain</type>
            <size>256753</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4MDAzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Js
YWNrYmVycnkvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0NoYW5nZUxvZwpp
bmRleCBkOTg3MTcwMTQzMWJiNDExNjkwMjQ4NjI3OTJlYTA1NDU0MDFiYTQwLi5kMmFmMjBmZjQ5
OWFjNjk0ZmQwNjNiMjViNThmYWVmYmNmOWQ4MzMwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
L2JsYWNrYmVycnkvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9DaGFu
Z2VMb2cKQEAgLTEsMyArMSwxNiBAQAorMjAxMi0wMi0xNiAgSmFja3kgSmlhbmcgIDx6aGFqaWFu
Z0ByaW0uY29tPgorCisgICAgICAgIFtCbGFja0JlcnJ5XVVwc3RyZWFtIEJsYWNrQmVycnkgQVBJ
IHdlYiBwYWdlIHJlbGF0ZWQgZmlsZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTc0MzgwCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgSW5pdGlhbCB1cHN0cmVhbSwgbm8gbmV3IHRlc3RzLgorCisgICAgICAg
ICogQXBpL1dlYlBhZ2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBBcGkvV2ViUGFnZS5oOiBBZGRl
ZC4KKyAgICAgICAgKiBBcGkvV2ViUGFnZV9wLmg6IEFkZGVkLgorCiAyMDEyLTAyLTE2ICBBbnRv
bmlvIEdvbWVzICA8YWdvbWVzQHJpbS5jb20+CiAKICAgICAgICAgW0JsYWNrQmVycnldIEltcGxl
bWVudGVkIGEgd2F5IHRvIGRlZmVyIGNsaWVudCBuYXZpZ2F0aW9uIGNoYW5nZSBjbGllbnQgbm90
aWZpY2F0aW9ucwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9XZWJQ
YWdlLmNwcCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvV2ViUGFnZS5jcHAKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uZTE1M2VhNTFlNDEzZWFkOGNjMTYxYWM2YzkyYjA1MTU5ODA5MDZkOAotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvV2ViUGFnZS5jcHAKQEAgLTAs
MCArMSw1OTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEy
IFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2Vu
ZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJh
cnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEz
MDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXZWJQYWdlLmgi
CisKKyNpbmNsdWRlICJBcHBsaWNhdGlvbkNhY2hlU3RvcmFnZS5oIgorI2luY2x1ZGUgIkJhY2tG
b3J3YXJkQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkJhY2tGb3J3YXJkTGlzdEltcGwuaCIKKyNp
bmNsdWRlICJCYWNraW5nU3RvcmVDbGllbnQuaCIKKyNpbmNsdWRlICJCYWNraW5nU3RvcmVDb21w
b3NpdGluZ1N1cmZhY2UuaCIKKyNpbmNsdWRlICJCYWNraW5nU3RvcmVfcC5oIgorI2luY2x1ZGUg
IkNTdHJpbmcuaCIKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2luY2x1ZGUgIkNocm9tZS5o
IgorI2luY2x1ZGUgIkNocm9tZUNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJDb250ZXh0
TWVudUNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJDb29raWVNYW5hZ2VyLmgiCisjaW5j
bHVkZSAiRE9NU3VwcG9ydC5oIgorI2luY2x1ZGUgIkRhdGFiYXNlLmgiCisjaW5jbHVkZSAiRGF0
YWJhc2VTeW5jLmgiCisjaW5jbHVkZSAiRGF0YWJhc2VUcmFja2VyLmgiCisjaW5jbHVkZSAiRGV2
aWNlTW90aW9uQ2xpZW50QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIkRldmljZU9yaWVudGF0aW9u
Q2xpZW50QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIkRyYWdDbGllbnRCbGFja0JlcnJ5LmgiCisv
LyBGSVhNRTogV2Ugc2hvdWxkIGJlIHVzaW5nIER1bXBSZW5kZXJUcmVlQ2xpZW50LCBidXQgSSdt
IG5vdCBzdXJlIHdoZXJlIHdlIHNob3VsZAorLy8gY3JlYXRlIHRoZSBEUlRfQkIgb2JqZWN0LiBT
ZWUgUFIgIzEyMDM1NS4KKyNpZiBFTkFCTEVfRFJUCisjaW5jbHVkZSAiRHVtcFJlbmRlclRyZWVC
bGFja0JlcnJ5LmgiCisjZW5kaWYKKyNpbmNsdWRlICJFZGl0b3JDbGllbnRCbGFja0JlcnJ5Lmgi
CisjaW5jbHVkZSAiRm9jdXNDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiRnJhbWVMb2FkZXJDbGll
bnRCbGFja0JlcnJ5LmgiCisjaWYgRU5BQkxFKENMSUVOVF9CQVNFRF9HRU9MT0NBVElPTikKKyNp
ZiBFTkFCTEVfRFJUCisjaW5jbHVkZSAiR2VvbG9jYXRpb25DbGllbnRNb2NrLmgiCisjZW5kaWYK
KyNpbmNsdWRlICJHZW9sb2NhdGlvbkNvbnRyb2xsZXJDbGllbnRCbGFja0JlcnJ5LmgiCisjZW5k
aWYKKyNpbmNsdWRlICJHcm91cFNldHRpbmdzLmgiCisjaW5jbHVkZSAiSFRNTEFyZWFFbGVtZW50
LmgiCisjaW5jbHVkZSAiSFRNTEZyYW1lT3duZXJFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTElt
YWdlRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKKyNpbmNsdWRlICJI
VE1MTmFtZXMuaCIKKyNpbmNsdWRlICJIVE1MUGFyc2VySWRpb21zLmgiCisjaW5jbHVkZSAiSFRU
UFBhcnNlcnMuaCIKKyNpbmNsdWRlICJIaXN0b3J5SXRlbS5oIgorI2luY2x1ZGUgIkljb25EYXRh
YmFzZUNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJJblBhZ2VTZWFyY2hNYW5hZ2VyLmgi
CisjaW5jbHVkZSAiSW5SZWdpb25TY3JvbGxhYmxlQXJlYS5oIgorI2luY2x1ZGUgIklucHV0SGFu
ZGxlci5oIgorI2luY2x1ZGUgIkluc3BlY3RvckJhY2tlbmREaXNwYXRjaGVyLmgiCisjaW5jbHVk
ZSAiSW5zcGVjdG9yQ2xpZW50QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIkluc3BlY3RvckNvbnRy
b2xsZXIuaCIKKyNpbmNsdWRlICJKYXZhU2NyaXB0RGVidWdnZXJCbGFja0JlcnJ5LmgiCisjaW5j
bHVkZSAiTGF5ZXJXZWJLaXRUaHJlYWQuaCIKKyNpbmNsdWRlICJOZXR3b3JrTWFuYWdlci5oIgor
I2luY2x1ZGUgIk5vZGVSZW5kZXJTdHlsZS5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRl
ICJQYWdlQ2FjaGUuaCIKKyNpbmNsdWRlICJQYWdlR3JvdXAuaCIKKyNpbmNsdWRlICJQbGF0Zm9y
bVRvdWNoRXZlbnQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVdoZWVsRXZlbnQuaCIKKyNpbmNsdWRl
ICJQbHVnaW5EYXRhYmFzZS5oIgorI2luY2x1ZGUgIlBsdWdpblZpZXcuaCIKKyNpbmNsdWRlICJS
ZW5kZXJUZXh0LmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWVCbGFja0JlcnJ5LmgiCisjaW5jbHVk
ZSAiUmVuZGVyVHJlZUFzVGV4dC5oIgorI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKKyNpbmNsdWRl
ICJSZW5kZXJXaWRnZXQuaCIKKyNpbmNsdWRlICJTY3JpcHRTb3VyY2VDb2RlLmgiCisjaW5jbHVk
ZSAiU2NyaXB0VmFsdWUuaCIKKyNpbmNsdWRlICJTY3JvbGxUeXBlcy5oIgorI2luY2x1ZGUgIlNl
bGVjdGlvbkhhbmRsZXIuaCIKKyNpbmNsdWRlICJTZXR0aW5ncy5oIgorI2luY2x1ZGUgIlN0b3Jh
Z2UuaCIKKyNpbmNsdWRlICJTdG9yYWdlTmFtZXNwYWNlLmgiCisjaW5jbHVkZSAiU3VyZmFjZVBv
b2wuaCIKKyNpbmNsdWRlICJUZXh0LmgiCisjaW5jbHVkZSAiVGhyZWFkQ2hlY2suaCIKKyNpbmNs
dWRlICJUb3VjaEV2ZW50SGFuZGxlci5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4
LmgiCisjaW5jbHVkZSAiVmlzaWJsZVBvc2l0aW9uLmgiCisjaWYgRU5BQkxFKFdFQkRPTSkKKyNp
bmNsdWRlICJXZWJET01Eb2N1bWVudC5oIgorI2VuZGlmCisjaW5jbHVkZSAiV2ViUGFnZUNsaWVu
dC5oIgorI2luY2x1ZGUgIldlYlNvY2tldC5oIgorI2luY2x1ZGUgIm5wYXBpLmgiCisjaW5jbHVk
ZSAicnVudGltZV9yb290LmgiCisKKyNpZiBFTkFCTEUoVklERU8pCisjaW5jbHVkZSAiSFRNTE1l
ZGlhRWxlbWVudC5oIgorI2luY2x1ZGUgIk1lZGlhUGxheWVyLmgiCisjaW5jbHVkZSAiTWVkaWFQ
bGF5ZXJQcml2YXRlQmxhY2tCZXJyeS5oIgorI2VuZGlmCisKKyNpZiBVU0UoU0tJQSkKKyNpbmNs
dWRlICJQbGF0Zm9ybUNvbnRleHRTa2lhLmgiCisjZW5kaWYKKworI2lmIFVTRShBQ0NFTEVSQVRF
RF9DT01QT1NJVElORykKKyNpbmNsdWRlICJGcmFtZUxheWVycy5oIgorI2luY2x1ZGUgIldlYlBh
Z2VDb21wb3NpdG9yLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUV4
ZWN1dGFibGVNZXNzYWdlLmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtSVRQb2xpY3ku
aD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1LZXlib2FyZEV2ZW50Lmg+CisjaW5jbHVk
ZSA8QmxhY2tCZXJyeVBsYXRmb3JtTWVzc2FnZUNsaWVudC5oPgorI2luY2x1ZGUgPEJsYWNrQmVy
cnlQbGF0Zm9ybU1vdXNlRXZlbnQuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1TY3Jl
ZW4uaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1TZXR0aW5ncy5oPgorI2luY2x1ZGUg
PEphdmFTY3JpcHRDb3JlL0FQSUNhc3QuaD4KKyNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9KU0Nv
bnRleHRSZWYuaD4KKyNpbmNsdWRlIDxTaGFyZWRQb2ludGVyLmg+CisjaW5jbHVkZSA8c3lzL2tl
eWNvZGVzLmg+CisjaW5jbHVkZSA8dW5pY29kZS91c3RyaW5nLmg+IC8vIHBsYXRmb3JtIElDVQor
CisjaWZuZGVmIFVTRVJfUFJPQ0VTU0VTCisjaW5jbHVkZSA8bWVtYWxsb2MuaD4KKyNlbmRpZgor
CisjaWYgRU5BQkxFKFNLSUFfR1BVX0NBTlZBUykKKyNpbmNsdWRlICJCbGFja0JlcnJ5UGxhdGZv
cm1HcmFwaGljcy5oIgorI2luY2x1ZGUgIkdyQ29udGV4dC5oIgorI2VuZGlmCisKKyNkZWZpbmUg
REVCVUdfQkxPQ0tfWk9PTSAwCisjZGVmaW5lIERFQlVHX1RPVUNIX0VWRU5UUyAwCisjZGVmaW5l
IERFQlVHX1dFQlBBR0VfTE9BRCAwCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7Cit1c2luZyBuYW1l
c3BhY2UgV2ViQ29yZTsKKwordHlwZWRlZiBjb25zdCB1bnNpZ25lZCBzaG9ydCogQ1VTaG9ydFB0
cjsKKworbmFtZXNwYWNlIEJsYWNrQmVycnkgeworbmFtZXNwYWNlIFdlYktpdCB7CisKK1ZlY3Rv
cjxXZWJQYWdlKj4qIFdlYlBhZ2VQcml2YXRlOjpzX3Zpc2libGVXZWJQYWdlcyA9IDA7IC8vIElu
aXRpYWxseSwgbm8gd2ViIHBhZ2UgaXMgdmlzaWJsZS4KKworc3RhdGljIFZlY3RvcjxXZWJQYWdl
Kj4qIHZpc2libGVXZWJQYWdlcygpCit7CisgICAgaWYgKCFXZWJQYWdlUHJpdmF0ZTo6c192aXNp
YmxlV2ViUGFnZXMpCisgICAgICAgIFdlYlBhZ2VQcml2YXRlOjpzX3Zpc2libGVXZWJQYWdlcyA9
IG5ldyBWZWN0b3I8V2ViUGFnZSo+OworICAgIHJldHVybiBXZWJQYWdlUHJpdmF0ZTo6c192aXNp
YmxlV2ViUGFnZXM7Cit9CisKK2NvbnN0IHVuc2lnbmVkIGJsb2NrWm9vbU1hcmdpbiA9IDM7IC8v
IEFkZCAzIHBpeGVsIG1hcmdpbiBvbiBlYWNoIHNpZGUuCitzdGF0aWMgaW50IGJsb2NrQ2xpY2tS
YWRpdXMgPSAwOworc3RhdGljIGRvdWJsZSBtYXhpbXVtQmxvY2tab29tU2NhbGUgPSAzLjA7IC8v
IFRoaXMgc2NhbGUgY2FuIGJlIGNsYW1wZWQgYnkgdGhlIG1heGltdW1TY2FsZSBzZXQgZm9yIHRo
ZSBwYWdlLgorCitjb25zdCBkb3VibGUgbWFudWFsU2Nyb2xsSW50ZXJ2YWwgPSAwLjE7IC8vIFRo
ZSB0aW1lIGludGVydmFsIGR1cmluZyB3aGljaCB3ZSBhc3NvY2lhdGUgdXNlciBhY3Rpb24gd2l0
aCBzY3JvbGxpbmcuCisKK2NvbnN0IGRvdWJsZSBkZWxheWVkWm9vbUludGVydmFsID0gMC4wOwor
Citjb25zdCBJbnRTaXplIG1pbmltdW1MYXlvdXRTaXplKDEwLCAxMCk7IC8vIE5lZWRzIHRvIGJl
IGEgc21hbGwgc2l6ZSwgZ3JlYXRlciB0aGFuIDAsIHRoYXQgd2UgY2FuIGdyb3cgdGhlIGxheW91
dCBmcm9tLgorY29uc3QgSW50U2l6ZSBtYXhpbXVtTGF5b3V0U2l6ZSgxMDAwMCwgMTAwMDApOyAv
LyBVc2VkIHdpdGggdmlld3BvcnQgbWV0YSB0YWcsIGJ1dCB3ZSBjYW4gc3RpbGwgZ3JvdyBmcm9t
IHRoaXMgb2YgY291cnNlLgorCitjb25zdCBkb3VibGUgbWluaW11bUV4cGFuZGluZ1JhdGlvID0g
MC4xNTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHBhcnNlIGEgVVJMIGFuZCBmaWxsIGluIG1p
c3NpbmcgcGFydHMuCitzdGF0aWMgS1VSTCBwYXJzZVVybChjb25zdCBXVEY6OlN0cmluZyYgdXJs
KQoreworICAgIFdURjo6U3RyaW5nIHVybFN0cmluZyh1cmwpOworICAgIEtVUkwga3VybCA9IEtV
UkwoS1VSTCgpLCB1cmxTdHJpbmcpOworICAgIGlmIChrdXJsLnByb3RvY29sKCkuaXNFbXB0eSgp
KSB7CisgICAgICAgIHVybFN0cmluZy5pbnNlcnQoImh0dHA6Ly8iLCAwKTsKKyAgICAgICAga3Vy
bCA9IEtVUkwoS1VSTCgpLCB1cmxTdHJpbmcpOworICAgIH0KKworICAgIHJldHVybiBrdXJsOwor
fQorCisvLyBIZWxwZXIgZnVuY3Rpb25zIHRvIGNvbnZlcnQgdG8gYW5kIGZyb20gV2ViQ29yZSB0
eXBlcy4KK3N0YXRpYyBpbmxpbmUgTW91c2VFdmVudFR5cGUgdG9XZWJDb3JlTW91c2VFdmVudFR5
cGUoY29uc3QgUGxhdGZvcm06Ok1vdXNlRXZlbnQ6OlR5cGUgdHlwZSkKK3sKKyAgICBzd2l0Y2gg
KHR5cGUpIHsKKyAgICBjYXNlIFBsYXRmb3JtOjpNb3VzZUV2ZW50OjpNb3VzZUJ1dHRvbkRvd246
CisgICAgICAgIHJldHVybiBNb3VzZUV2ZW50UHJlc3NlZDsKKyAgICBjYXNlIFBsYXRmb3JtOjpN
b3VzZUV2ZW50OjpNb3VzZUJ1dHRvblVwOgorICAgICAgICByZXR1cm4gTW91c2VFdmVudFJlbGVh
c2VkOworICAgIGNhc2UgUGxhdGZvcm06Ok1vdXNlRXZlbnQ6Ok1vdXNlTW92ZToKKyAgICBkZWZh
dWx0OgorICAgICAgICByZXR1cm4gTW91c2VFdmVudE1vdmVkOworICAgIH0KK30KKworc3RhdGlj
IGlubGluZSBSZXNvdXJjZVJlcXVlc3RDYWNoZVBvbGljeSB0b1dlYkNvcmVDYWNoZVBvbGljeShQ
bGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkNhY2hlUG9saWN5IHBvbGljeSkKK3sKKyAgICBzd2l0
Y2ggKHBvbGljeSkgeworICAgIGNhc2UgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpVc2VQcm90
b2NvbENhY2hlUG9saWN5OgorICAgICAgICByZXR1cm4gVXNlUHJvdG9jb2xDYWNoZVBvbGljeTsK
KyAgICBjYXNlIFBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6UmVsb2FkSWdub3JpbmdDYWNoZURh
dGE6CisgICAgICAgIHJldHVybiBSZWxvYWRJZ25vcmluZ0NhY2hlRGF0YTsKKyAgICBjYXNlIFBs
YXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6UmV0dXJuQ2FjaGVEYXRhRWxzZUxvYWQ6CisgICAgICAg
IHJldHVybiBSZXR1cm5DYWNoZURhdGFFbHNlTG9hZDsKKyAgICBjYXNlIFBsYXRmb3JtOjpOZXR3
b3JrUmVxdWVzdDo6UmV0dXJuQ2FjaGVEYXRhRG9udExvYWQ6CisgICAgICAgIHJldHVybiBSZXR1
cm5DYWNoZURhdGFEb250TG9hZDsKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIFVzZVByb3RvY29sQ2FjaGVQb2xpY3k7CisgICAgfQor
fQorCisjaWYgRU5BQkxFKEVWRU5UX01PREVfTUVUQVRBR1MpCitzdGF0aWMgaW5saW5lIFBsYXRm
b3JtOjpDdXJzb3JFdmVudE1vZGUgdG9QbGF0Zm9ybUN1cnNvckV2ZW50TW9kZShDdXJzb3JFdmVu
dE1vZGUgbW9kZSkKK3sKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIFByb2Nlc3NlZEN1
cnNvckV2ZW50czoKKyAgICAgICAgcmV0dXJuIFBsYXRmb3JtOjpQcm9jZXNzZWRDdXJzb3JFdmVu
dHM7CisgICAgY2FzZSBOYXRpdmVDdXJzb3JFdmVudHM6CisgICAgICAgIHJldHVybiBQbGF0Zm9y
bTo6TmF0aXZlQ3Vyc29yRXZlbnRzOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gUGxhdGZvcm06OlByb2Nlc3NlZEN1cnNvckV2ZW50
czsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgUGxhdGZvcm06OlRvdWNoRXZlbnRNb2RlIHRv
UGxhdGZvcm1Ub3VjaEV2ZW50TW9kZShUb3VjaEV2ZW50TW9kZSBtb2RlKQoreworICAgIHN3aXRj
aCAobW9kZSkgeworICAgIGNhc2UgUHJvY2Vzc2VkVG91Y2hFdmVudHM6CisgICAgICAgIHJldHVy
biBQbGF0Zm9ybTo6UHJvY2Vzc2VkVG91Y2hFdmVudHM7CisgICAgY2FzZSBOYXRpdmVUb3VjaEV2
ZW50czoKKyAgICAgICAgcmV0dXJuIFBsYXRmb3JtOjpOYXRpdmVUb3VjaEV2ZW50czsKKyAgICBj
YXNlIFB1cmVUb3VjaEV2ZW50c1dpdGhNb3VzZUNvbnZlcnNpb246CisgICAgICAgIHJldHVybiBQ
bGF0Zm9ybTo6UHVyZVRvdWNoRXZlbnRzV2l0aE1vdXNlQ29udmVyc2lvbjsKKyAgICBkZWZhdWx0
OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIFBsYXRmb3Jt
OjpQcm9jZXNzZWRUb3VjaEV2ZW50czsKKyAgICB9Cit9CisjZW5kaWYKKworc3RhdGljIGlubGlu
ZSBIaXN0b3J5SXRlbSogaGlzdG9yeUl0ZW1Gcm9tQmFja0ZvcndhcmRJZChXZWJQYWdlOjpCYWNr
Rm9yd2FyZElkIGlkKQoreworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEhpc3RvcnlJdGVt
Kj4oaWQpOworfQorCitzdGF0aWMgaW5saW5lIFdlYlBhZ2U6OkJhY2tGb3J3YXJkSWQgYmFja0Zv
cndhcmRJZEZyb21IaXN0b3J5SXRlbShIaXN0b3J5SXRlbSogaXRlbSkKK3sKKyAgICByZXR1cm4g
cmVpbnRlcnByZXRfY2FzdDxXZWJQYWdlOjpCYWNrRm9yd2FyZElkPihpdGVtKTsKK30KKworV2Vi
UGFnZVByaXZhdGU6OldlYlBhZ2VQcml2YXRlKFdlYlBhZ2UqIHdlYlBhZ2UsIFdlYlBhZ2VDbGll
bnQqIGNsaWVudCwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QpCisgICAgOiBtX3dlYlBh
Z2Uod2ViUGFnZSkKKyAgICAsIG1fY2xpZW50KGNsaWVudCkKKyAgICAsIG1fcGFnZSgwKSAvLyBJ
bml0aWFsaXplZCBieSBpbml0LgorICAgICwgbV9tYWluRnJhbWUoMCkgLy8gSW5pdGlhbGl6ZWQg
YnkgaW5pdC4KKyAgICAsIG1fY3VycmVudENvbnRleHROb2RlKDApCisgICAgLCBtX3dlYlNldHRp
bmdzKDApIC8vIEluaXRpYWxpemVkIGJ5IGluaXQuCisgICAgLCBtX3Zpc2libGUoZmFsc2UpCisg
ICAgLCBtX3Nob3VsZFJlc2V0VGlsZXNXaGVuU2hvd24oZmFsc2UpCisgICAgLCBtX3VzZXJTY2Fs
YWJsZSh0cnVlKQorICAgICwgbV91c2VyUGVyZm9ybWVkTWFudWFsWm9vbShmYWxzZSkKKyAgICAs
IG1fdXNlclBlcmZvcm1lZE1hbnVhbFNjcm9sbChmYWxzZSkKKyAgICAsIG1fY29udGVudHNTaXpl
Q2hhbmdlZChmYWxzZSkKKyAgICAsIG1fb3ZlcmZsb3dFeGNlZWRzQ29udGVudHNTaXplKGZhbHNl
KQorICAgICwgbV9yZXNldFZpcnR1YWxWaWV3cG9ydE9uQ29tbWl0dGVkKHRydWUpCisgICAgLCBt
X3Nob3VsZFVzZUZpeGVkRGVza3RvcE1vZGUoZmFsc2UpCisgICAgLCBtX25lZWRUb3VjaEV2ZW50
cyhmYWxzZSkKKyAgICAsIG1fcHJldmVudElkbGVEaW1taW5nQ291bnQoMCkKKyNpZiBFTkFCTEUo
VE9VQ0hfRVZFTlRTKQorICAgICwgbV9wcmV2ZW50RGVmYXVsdE9uVG91Y2hTdGFydChmYWxzZSkK
KyNlbmRpZgorICAgICwgbV9uZXN0ZWRMYXlvdXRGaW5pc2hlZENvdW50KDApCisgICAgLCBtX2Fj
dHVhbFZpc2libGVXaWR0aChyZWN0LndpZHRoKCkpCisgICAgLCBtX2FjdHVhbFZpc2libGVIZWln
aHQocmVjdC5oZWlnaHQoKSkKKyAgICAsIG1fdmlydHVhbFZpZXdwb3J0V2lkdGgoMCkKKyAgICAs
IG1fdmlydHVhbFZpZXdwb3J0SGVpZ2h0KDApCisgICAgLCBtX2RlZmF1bHRMYXlvdXRTaXplKG1p
bmltdW1MYXlvdXRTaXplKQorICAgICwgbV9kaWRSZXN0b3JlRnJvbVBhZ2VDYWNoZShmYWxzZSkK
KyAgICAsIG1fdmlld01vZGUoV2ViUGFnZVByaXZhdGU6OkRlc2t0b3ApIC8vIERlZmF1bHQgdG8g
RGVza3RvcCBtb2RlIGZvciBQQi4KKyAgICAsIG1fbG9hZFN0YXRlKFdlYlBhZ2VQcml2YXRlOjpO
b25lKQorICAgICwgbV90cmFuc2Zvcm1hdGlvbk1hdHJpeChuZXcgVHJhbnNmb3JtYXRpb25NYXRy
aXgoKSkKKyAgICAsIG1fYmFja2luZ1N0b3JlKDApIC8vIEluaXRpYWxpemVkIGJ5IGluaXQuCisg
ICAgLCBtX2JhY2tpbmdTdG9yZUNsaWVudCgwKSAvLyBJbml0aWFsaXplZCBieSBpbml0LgorICAg
ICwgbV9pblBhZ2VTZWFyY2hNYW5hZ2VyKG5ldyBJblBhZ2VTZWFyY2hNYW5hZ2VyKHRoaXMpKQor
ICAgICwgbV9pbnB1dEhhbmRsZXIobmV3IElucHV0SGFuZGxlcih0aGlzKSkKKyAgICAsIG1fc2Vs
ZWN0aW9uSGFuZGxlcihuZXcgU2VsZWN0aW9uSGFuZGxlcih0aGlzKSkKKyAgICAsIG1fdG91Y2hF
dmVudEhhbmRsZXIobmV3IFRvdWNoRXZlbnRIYW5kbGVyKHRoaXMpKQorI2lmIEVOQUJMRShFVkVO
VF9NT0RFX01FVEFUQUdTKQorICAgICwgbV9jdXJzb3JFdmVudE1vZGUoUHJvY2Vzc2VkQ3Vyc29y
RXZlbnRzKQorICAgICwgbV90b3VjaEV2ZW50TW9kZShQcm9jZXNzZWRUb3VjaEV2ZW50cykKKyNl
bmRpZgorICAgICwgbV9jdXJyZW50Q3Vyc29yKFBsYXRmb3JtOjpDdXJzb3JOb25lKQorICAgICwg
bV9kdW1wUmVuZGVyVHJlZSgwKSAvLyBMYXp5IGluaXRpYWxpemF0aW9uLgorICAgICwgbV9pbml0
aWFsU2NhbGUoLTEuMCkKKyAgICAsIG1fbWluaW11bVNjYWxlKC0xLjApCisgICAgLCBtX21heGlt
dW1TY2FsZSgtMS4wKQorICAgICwgbV9ibG9ja1pvb21GaW5hbFNjYWxlKDEuMCkKKyAgICAsIG1f
YW5jaG9ySW5Ob2RlUmVjdFJhdGlvKC0xLCAtMSkKKyAgICAsIG1fY3VycmVudEJsb2NrWm9vbU5v
ZGUoMCkKKyAgICAsIG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZSgwKQorICAgICwgbV9z
aG91bGRSZWZsb3dCbG9jayhmYWxzZSkKKyAgICAsIG1fZGVsYXllZFpvb21UaW1lcihhZG9wdFB0
cihuZXcgVGltZXI8V2ViUGFnZVByaXZhdGU+KHRoaXMsICZXZWJQYWdlUHJpdmF0ZTo6em9vbUFi
b3V0UG9pbnRUaW1lckZpcmVkKSkpCisgICAgLCBtX2xhc3RVc2VyRXZlbnRUaW1lc3RhbXAoMC4w
KQorICAgICwgbV9wbHVnaW5Nb3VzZUJ1dHRvblByZXNzZWQoZmFsc2UpCisgICAgLCBtX3BsdWdp
bk1heU9wZW5OZXdUYWIoZmFsc2UpCisgICAgLCBtX2dlb2xvY2F0aW9uQ2xpZW50KDApCisgICAg
LCBtX2luUmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2RlKDApCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorICAgICwgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmdBY3RpdmUoZmFsc2Up
CisgICAgLCBtX3Jvb3RMYXllckNvbW1pdFRpbWVyKGFkb3B0UHRyKG5ldyBUaW1lcjxXZWJQYWdl
UHJpdmF0ZT4odGhpcywgJldlYlBhZ2VQcml2YXRlOjpyb290TGF5ZXJDb21taXRUaW1lckZpcmVk
KSkpCisgICAgLCBtX25lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oZmFsc2UpCisg
ICAgLCBtX25lZWRzQ29tbWl0KGZhbHNlKQorICAgICwgbV9zdXNwZW5kUm9vdExheWVyQ29tbWl0
KGZhbHNlKQorI2VuZGlmCisgICAgLCBtX3BlbmRpbmdPcmllbnRhdGlvbigtMSkKKyAgICAsIG1f
ZnVsbHNjcmVlblZpZGVvTm9kZSgwKQorICAgICwgbV9oYXNJblJlZ2lvblNjcm9sbGFibGVBcmVh
cyhmYWxzZSkKKyAgICAsIG1fdXBkYXRlRGVsZWdhdGVkT3ZlcmxheXNEaXNwYXRjaGVkKGZhbHNl
KQoreworfQorCitXZWJQYWdlUHJpdmF0ZTo6fldlYlBhZ2VQcml2YXRlKCkKK3sKKyAgICAvLyBI
YW5kIHRoZSBiYWNraW5nc3RvcmUgYmFjayB0byBhbm90aGVyIG93bmVyIGlmIG5lY2Vzc2FyeS4K
KyAgICBtX3dlYlBhZ2UtPnNldFZpc2libGUoZmFsc2UpOworICAgIGlmIChCYWNraW5nU3RvcmVQ
cml2YXRlOjpjdXJyZW50QmFja2luZ1N0b3JlT3duZXIoKSA9PSBtX3dlYlBhZ2UpCisgICAgICAg
IEJhY2tpbmdTdG9yZVByaXZhdGU6OnNldEN1cnJlbnRCYWNraW5nU3RvcmVPd25lcigwKTsKKwor
ICAgIGRlbGV0ZSBtX3dlYlNldHRpbmdzOworICAgIG1fd2ViU2V0dGluZ3MgPSAwOworCisgICAg
ZGVsZXRlIG1fYmFja2luZ1N0b3JlQ2xpZW50OworICAgIG1fYmFja2luZ1N0b3JlQ2xpZW50ID0g
MDsKKyAgICBtX2JhY2tpbmdTdG9yZSA9IDA7CisKKyAgICBkZWxldGUgbV9wYWdlOworICAgIG1f
cGFnZSA9IDA7CisKKyAgICBkZWxldGUgbV90cmFuc2Zvcm1hdGlvbk1hdHJpeDsKKyAgICBtX3Ry
YW5zZm9ybWF0aW9uTWF0cml4ID0gMDsKKworICAgIGRlbGV0ZSBtX3NlbGVjdGlvbkhhbmRsZXI7
CisgICAgbV9zZWxlY3Rpb25IYW5kbGVyID0gMDsKKworICAgIGRlbGV0ZSBtX2lucHV0SGFuZGxl
cjsKKyAgICBtX2lucHV0SGFuZGxlciA9IDA7CisKKyAgICBkZWxldGUgbV90b3VjaEV2ZW50SGFu
ZGxlcjsKKyAgICBtX3RvdWNoRXZlbnRIYW5kbGVyID0gMDsKKworI2lmIEVOQUJMRV9EUlQKKyAg
ICBkZWxldGUgbV9kdW1wUmVuZGVyVHJlZTsKKyAgICBtX2R1bXBSZW5kZXJUcmVlID0gMDsKKyNl
bmRpZgorCit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmluaXQoY29uc3QgV2ViU3RyaW5nJiBw
YWdlR3JvdXBOYW1lKQoreworICAgIENocm9tZUNsaWVudEJsYWNrQmVycnkqIGNocm9tZUNsaWVu
dCA9IG5ldyBDaHJvbWVDbGllbnRCbGFja0JlcnJ5KHRoaXMpOworICAgIENvbnRleHRNZW51Q2xp
ZW50QmxhY2tCZXJyeSogY29udGV4dE1lbnVDbGllbnQgPSAwOworI2lmIEVOQUJMRShDT05URVhU
X01FTlVTKQorICAgIGNvbnRleHRNZW51Q2xpZW50ID0gbmV3IENvbnRleHRNZW51Q2xpZW50Qmxh
Y2tCZXJyeSgpOworI2VuZGlmCisgICAgRWRpdG9yQ2xpZW50QmxhY2tCZXJyeSogZWRpdG9yQ2xp
ZW50ID0gbmV3IEVkaXRvckNsaWVudEJsYWNrQmVycnkodGhpcyk7CisgICAgRHJhZ0NsaWVudEJs
YWNrQmVycnkqIGRyYWdDbGllbnQgPSAwOworI2lmIEVOQUJMRShEUkFHX1NVUFBPUlQpCisgICAg
ZHJhZ0NsaWVudCA9IG5ldyBEcmFnQ2xpZW50QmxhY2tCZXJyeSgpOworI2VuZGlmCisgICAgSW5z
cGVjdG9yQ2xpZW50QmxhY2tCZXJyeSogaW5zcGVjdG9yQ2xpZW50ID0gMDsKKyNpZiBFTkFCTEUo
SU5TUEVDVE9SKQorICAgIGluc3BlY3RvckNsaWVudCA9IG5ldyBJbnNwZWN0b3JDbGllbnRCbGFj
a0JlcnJ5KHRoaXMpOworI2VuZGlmCisKKyAgICBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkq
IGZyYW1lTG9hZGVyQ2xpZW50ID0gbmV3IEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeSgpOwor
CisgICAgUGFnZTo6UGFnZUNsaWVudHMgcGFnZUNsaWVudHM7CisgICAgcGFnZUNsaWVudHMuY2hy
b21lQ2xpZW50ID0gY2hyb21lQ2xpZW50OworICAgIHBhZ2VDbGllbnRzLmNvbnRleHRNZW51Q2xp
ZW50ID0gY29udGV4dE1lbnVDbGllbnQ7CisgICAgcGFnZUNsaWVudHMuZWRpdG9yQ2xpZW50ID0g
ZWRpdG9yQ2xpZW50OworICAgIHBhZ2VDbGllbnRzLmRyYWdDbGllbnQgPSBkcmFnQ2xpZW50Owor
ICAgIHBhZ2VDbGllbnRzLmluc3BlY3RvckNsaWVudCA9IGluc3BlY3RvckNsaWVudDsKKworI2lm
IEVOQUJMRShDTElFTlRfQkFTRURfR0VPTE9DQVRJT04pCisgICAgLy8gTm90ZSB0aGUgb2JqZWN0
IHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gdGhlIHBhZ2UgaXMgZGVzdHJveWVkLgorI2lmIEVOQUJM
RV9EUlQKKyAgICBpZiAoZ2V0ZW52KCJkcnRSdW4iKSkKKyAgICAgICAgcGFnZUNsaWVudHMuZ2Vv
bG9jYXRpb25DbGllbnQgPSBuZXcgR2VvbG9jYXRpb25DbGllbnRNb2NrKCk7CisgICAgZWxzZQor
I2VuZGlmCisgICAgICAgIHBhZ2VDbGllbnRzLmdlb2xvY2F0aW9uQ2xpZW50ID0gbV9nZW9sb2Nh
dGlvbkNsaWVudCA9IG5ldyBHZW9sb2NhdGlvbkNvbnRyb2xsZXJDbGllbnRCbGFja0JlcnJ5KHRo
aXMpOworI2Vsc2UKKyAgICBwYWdlQ2xpZW50cy5nZW9sb2NhdGlvbkNsaWVudCA9IG1fZ2VvbG9j
YXRpb25DbGllbnQ7CisjZW5kaWYKKworICAgIHBhZ2VDbGllbnRzLmRldmljZU1vdGlvbkNsaWVu
dCA9IG5ldyBEZXZpY2VNb3Rpb25DbGllbnRCbGFja0JlcnJ5KHRoaXMpOworICAgIHBhZ2VDbGll
bnRzLmRldmljZU9yaWVudGF0aW9uQ2xpZW50ID0gbmV3IERldmljZU9yaWVudGF0aW9uQ2xpZW50
QmxhY2tCZXJyeSh0aGlzKTsKKyAgICBtX3BhZ2UgPSBuZXcgUGFnZShwYWdlQ2xpZW50cyk7CisK
KyNpZiBFTkFCTEUoQ0xJRU5UX0JBU0VEX0dFT0xPQ0FUSU9OKSAmJiBFTkFCTEVfRFJUCisgICAg
Ly8gSW4gY2FzZSBydW5uaW5nIGluIER1bXBSZW5kZXJUcmVlIG1vZGUgc2V0IHRoZSBjb250cm9s
bGVyIHRvIG1vY2sgcHJvdmlkZXIuCisgICAgaWYgKGdldGVudigiZHJ0UnVuIikpCisgICAgICAg
IHN0YXRpY19jYXN0PEdlb2xvY2F0aW9uQ2xpZW50TW9jayo+KHBhZ2VDbGllbnRzLmdlb2xvY2F0
aW9uQ2xpZW50KS0+c2V0Q29udHJvbGxlcihtX3BhZ2UtPmdlb2xvY2F0aW9uQ29udHJvbGxlcigp
KTsKKyNlbmRpZgorCisgICAgbV9wYWdlLT5zZXRDdXN0b21IVE1MVG9rZW5pemVyQ2h1bmtTaXpl
KDI1Nik7CisgICAgbV9wYWdlLT5zZXRDdXN0b21IVE1MVG9rZW5pemVyVGltZURlbGF5KDAuMzAw
KTsKKworICAgIG1fd2ViU2V0dGluZ3MgPSBXZWJTZXR0aW5nczo6Y3JlYXRlRnJvbVN0YW5kYXJk
U2V0dGluZ3MoKTsKKworICAgIC8vIEZJWE1FOiBXZSBleHBsaWNpdGx5IGNhbGwgc2V0RGVsZWdh
dGUoKSBpbnN0ZWFkIG9mIHBhc3Npbmcgb3Vyc2VsZiBpbiBjcmVhdGVGcm9tU3RhbmRhcmRTZXR0
aW5ncygpCisgICAgLy8gc28gdGhhdCB3ZSBvbmx5IGdldCBvbmUgZGlkQ2hhbmdlU2V0dGluZ3Mo
KSBjYWxsYmFjayB3aGVuIHdlIHNldCB0aGUgcGFnZSBncm91cCBuYW1lLiBUaGlzIGNhdXNlcyB1
cworICAgIC8vIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBXZWJTZXR0aW5ncyBzaW5jZSBzb21lIFdl
YlNldHRpbmdzIG1ldGhvZCBtYWtlIHVzZSBvZiB0aGUgcGFnZSBncm91cCBuYW1lLgorICAgIC8v
IEluc3RlYWQsIHdlIHNob3VsZG4ndCBiZSBzdG9yaW5nIHRoZSBwYWdlIGdyb3VwIG5hbWUgaW4g
V2ViU2V0dGluZ3MuCisgICAgbV93ZWJTZXR0aW5ncy0+c2V0RGVsZWdhdGUodGhpcyk7CisgICAg
bV93ZWJTZXR0aW5ncy0+c2V0UGFnZUdyb3VwTmFtZShwYWdlR3JvdXBOYW1lKTsKKworICAgIFJl
ZlB0cjxGcmFtZT4gbmV3RnJhbWUgPSBGcmFtZTo6Y3JlYXRlKG1fcGFnZSwgLyogSFRNTEZyYW1l
T3duZXJFbGVtZW50KiAqLyAwLCBmcmFtZUxvYWRlckNsaWVudCk7CisKKyAgICBtX21haW5GcmFt
ZSA9IG5ld0ZyYW1lLmdldCgpOworICAgIGZyYW1lTG9hZGVyQ2xpZW50LT5zZXRGcmFtZShtX21h
aW5GcmFtZSwgdGhpcyk7CisgICAgbV9tYWluRnJhbWUtPmluaXQoKTsKKworI2lmIEVOQUJMRShX
RUJHTCkKKyAgICBQbGF0Zm9ybTo6U2V0dGluZ3MqIHNldHRpbmdzID0gUGxhdGZvcm06OlNldHRp
bmdzOjpnZXQoKTsKKyAgICBtX3BhZ2UtPnNldHRpbmdzKCktPnNldFdlYkdMRW5hYmxlZChzZXR0
aW5ncyAmJiBzZXR0aW5ncy0+aXNXZWJHTFN1cHBvcnRlZCgpKTsKKyNlbmRpZgorI2lmIEVOQUJM
RShTS0lBX0dQVV9DQU5WQVMpCisgICAgbV9wYWdlLT5zZXR0aW5ncygpLT5zZXRDYW52YXNVc2Vz
QWNjZWxlcmF0ZWREcmF3aW5nKHRydWUpOworICAgIG1fcGFnZS0+c2V0dGluZ3MoKS0+c2V0QWNj
ZWxlcmF0ZWQyZENhbnZhc0VuYWJsZWQodHJ1ZSk7CisjZW5kaWYKKyNpZiBFTkFCTEUoVklFV1BP
UlRfUkVGTE9XKQorICAgIG1fcGFnZS0+c2V0dGluZ3MoKS0+c2V0VGV4dFJlZmxvd0VuYWJsZWQo
bV93ZWJTZXR0aW5ncy0+dGV4dFJlZmxvd01vZGUoKSA9PSBXZWJTZXR0aW5nczo6VGV4dFJlZmxv
d0VuYWJsZWQpOworI2VuZGlmCisKKyAgICBtX3BhZ2UtPnNldHRpbmdzKCktPnNldFVzZUhpeGll
NzZXZWJTb2NrZXRQcm90b2NvbChmYWxzZSk7CisgICAgbV9wYWdlLT5zZXR0aW5ncygpLT5zZXRJ
bnRlcmFjdGl2ZUZvcm1WYWxpZGF0aW9uRW5hYmxlZCh0cnVlKTsKKyAgICBtX3BhZ2UtPnNldHRp
bmdzKCktPnNldEFsbG93VW5pdmVyc2FsQWNjZXNzRnJvbUZpbGVVUkxzKGZhbHNlKTsKKworICAg
IG1fYmFja2luZ1N0b3JlQ2xpZW50ID0gQmFja2luZ1N0b3JlQ2xpZW50OjpjcmVhdGUobV9tYWlu
RnJhbWUsIC8qIHBhcmVudCBmcmFtZSAqLyAwLCBtX3dlYlBhZ2UpOworICAgIC8vIFRoZSBkaXJl
Y3QgYWNjZXNzIHRvIEJhY2tpbmdTdG9yZSBpcyBsZWZ0IGhlcmUgZm9yIGNvbnZlbmllbmNlIHNp
bmNlIGl0CisgICAgLy8gaXMgb3duZWQgYnkgQmFja2luZ1N0b3JlQ2xpZW50IGFuZCB0aGVuIGRl
bGV0ZWQgYnkgaXRzIGRlc3RydWN0b3IuCisgICAgbV9iYWNraW5nU3RvcmUgPSBtX2JhY2tpbmdT
dG9yZUNsaWVudC0+YmFja2luZ1N0b3JlKCk7CisKKyAgICBtX3BhZ2UtPnNldHRpbmdzKCktPnNl
dFNwYXRpYWxOYXZpZ2F0aW9uRW5hYmxlZChtX3dlYlNldHRpbmdzLT5pc1NwYXRpYWxOYXZpZ2F0
aW9uRW5hYmxlZCgpKTsKKyAgICBibG9ja0NsaWNrUmFkaXVzID0gaW50KHJvdW5kZigwLjM1ICog
UGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OnBpeGVsc1BlckluY2goMCkud2lkdGgoKSkpOyAv
LyBUaGUgY2xpY2tlZCByZWN0YW5nbGUgYXJlYSBzaG91bGQgYmUgYSBmaXhlZCB1bml0IG9mIG1l
YXN1cmVtZW50LgorCisgICAgbV9wYWdlLT5zZXR0aW5ncygpLT5zZXREZWxlZ2F0ZVNlbGVjdGlv
blBhaW50KHRydWUpOworCit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmxvYWQoY29uc3QgY2hh
ciogdXJsLCBjb25zdCBjaGFyKiBuZXR3b3JrVG9rZW4sIGNvbnN0IGNoYXIqIG1ldGhvZCwgUGxh
dGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpDYWNoZVBvbGljeSBjYWNoZVBvbGljeSwgY29uc3QgY2hh
ciogZGF0YSwgc2l6ZV90IGRhdGFMZW5ndGgsIGNvbnN0IGNoYXIqIGNvbnN0KiBoZWFkZXJzLCBz
aXplX3QgaGVhZGVyc0xlbmd0aCwgYm9vbCBpc0luaXRpYWwsIGJvb2wgbXVzdEhhbmRsZUludGVy
bmFsbHksIGJvb2wgZm9yY2VEb3dubG9hZCwgY29uc3QgY2hhciogb3ZlcnJpZGVDb250ZW50VHlw
ZSkKK3sKKyAgICBzdG9wQ3VycmVudExvYWQoKTsKKworICAgIFdURjo6U3RyaW5nIHVybFN0cmlu
Zyh1cmwpOworICAgIGlmICh1cmxTdHJpbmcuc3RhcnRzV2l0aCgidnM6IiwgZmFsc2UpKSB7Cisg
ICAgICAgIHVybFN0cmluZyA9IHVybFN0cmluZy5zdWJzdHJpbmcoMyk7CisgICAgICAgIG1fbWFp
bkZyYW1lLT5zZXRJblZpZXdTb3VyY2VNb2RlKHRydWUpOworICAgIH0gZWxzZQorICAgICAgICBt
X21haW5GcmFtZS0+c2V0SW5WaWV3U291cmNlTW9kZShmYWxzZSk7CisKKyAgICBLVVJMIGt1cmwg
PSBwYXJzZVVybCh1cmxTdHJpbmcpOworICAgIGlmIChwcm90b2NvbElzKGt1cmwsICJqYXZhc2Ny
aXB0IikpIHsKKyAgICAgICAgLy8gTmV2ZXIgcnVuIGphdmFzY3JpcHQgd2hpbGUgbG9hZGluZyBp
cyBkZWZlcnJlZC4KKyAgICAgICAgaWYgKG1fcGFnZS0+ZGVmZXJzTG9hZGluZygpKSB7CisgICAg
ICAgICAgICBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkqIGZyYW1lTG9hZGVyQ2xpZW50ID0g
c3RhdGljX2Nhc3Q8RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Kj4obV9tYWluRnJhbWUtPmxv
YWRlcigpLT5jbGllbnQoKSk7CisgICAgICAgICAgICBmcmFtZUxvYWRlckNsaWVudC0+c2V0RGVm
ZXJyZWRNYW51YWxTY3JpcHQoa3VybCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbV9t
YWluRnJhbWUtPnNjcmlwdCgpLT5leGVjdXRlSWZKYXZhU2NyaXB0VVJMKGt1cmwsIERvTm90UmVw
bGFjZURvY3VtZW50SWZKYXZhU2NyaXB0VVJMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIGlmIChpc0luaXRpYWwpCisgICAgICAgIE5ldHdvcmtNYW5hZ2VyOjppbnN0YW5jZSgpLT5z
ZXRJbml0aWFsVVJMKGt1cmwpOworCisgICAgUmVzb3VyY2VSZXF1ZXN0IHJlcXVlc3Qoa3VybCwg
IiIgLyogcmVmZXJyZXIgKi8pOworICAgIHJlcXVlc3Quc2V0VG9rZW4obmV0d29ya1Rva2VuKTsK
KyAgICBpZiAoaXNJbml0aWFsIHx8IG11c3RIYW5kbGVJbnRlcm5hbGx5KQorICAgICAgICByZXF1
ZXN0LnNldE11c3RIYW5kbGVJbnRlcm5hbGx5KHRydWUpOworICAgIHJlcXVlc3Quc2V0SFRUUE1l
dGhvZChtZXRob2QpOworICAgIHJlcXVlc3Quc2V0Q2FjaGVQb2xpY3kodG9XZWJDb3JlQ2FjaGVQ
b2xpY3koY2FjaGVQb2xpY3kpKTsKKyAgICBpZiAob3ZlcnJpZGVDb250ZW50VHlwZSkKKyAgICAg
ICAgcmVxdWVzdC5zZXRPdmVycmlkZUNvbnRlbnRUeXBlKG92ZXJyaWRlQ29udGVudFR5cGUpOwor
CisgICAgaWYgKGRhdGEpCisgICAgICAgIHJlcXVlc3Quc2V0SFRUUEJvZHkoRm9ybURhdGE6OmNy
ZWF0ZShkYXRhLCBkYXRhTGVuZ3RoKSk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICsg
MSA8IGhlYWRlcnNMZW5ndGg7IGkgKz0gMikKKyAgICAgICAgcmVxdWVzdC5hZGRIVFRQSGVhZGVy
RmllbGQoaGVhZGVyc1tpXSwgaGVhZGVyc1tpICsgMV0pOworCisgICAgaWYgKGZvcmNlRG93bmxv
YWQpCisgICAgICAgIHJlcXVlc3Quc2V0Rm9yY2VEb3dubG9hZCh0cnVlKTsKKworICAgIG1fbWFp
bkZyYW1lLT5sb2FkZXIoKS0+bG9hZChyZXF1ZXN0LCAiIiAvKiBuYW1lICovLCBmYWxzZSk7Cit9
CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmxvYWRTdHJpbmcoY29uc3QgY2hhciogc3RyaW5nLCBj
b25zdCBjaGFyKiBiYXNlVVJMLCBjb25zdCBjaGFyKiBjb250ZW50VHlwZSwgY29uc3QgY2hhciog
ZmFpbGluZ1VSTCkKK3sKKyAgICBLVVJMIGt1cmwgPSBwYXJzZVVybChiYXNlVVJMKTsKKyAgICBS
ZXNvdXJjZVJlcXVlc3QgcmVxdWVzdChrdXJsKTsKKyAgICBXVEY6OlJlZlB0cjxTaGFyZWRCdWZm
ZXI+IGJ1ZmZlcgorICAgICAgICA9IFNoYXJlZEJ1ZmZlcjo6Y3JlYXRlKHN0cmluZywgc3RybGVu
KHN0cmluZykpOworICAgIFN1YnN0aXR1dGVEYXRhIHN1YnN0aXR1dGVEYXRhKGJ1ZmZlciwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0TUlNRVR5cGVGcm9tTWVkaWFU
eXBlKGNvbnRlbnRUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRy
YWN0Q2hhcnNldEZyb21NZWRpYVR5cGUoY29udGVudFR5cGUpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGZhaWxpbmdVUkwgPyBwYXJzZVVybChmYWlsaW5nVVJMKSA6IEtVUkwo
KSk7CisgICAgbV9tYWluRnJhbWUtPmxvYWRlcigpLT5sb2FkKHJlcXVlc3QsIHN1YnN0aXR1dGVE
YXRhLCBmYWxzZSk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmV4ZWN1dGVKYXZhU2NyaXB0
KGNvbnN0IGNoYXIqIHNjcmlwdCwgSmF2YVNjcmlwdERhdGFUeXBlJiByZXR1cm5UeXBlLCBXZWJT
dHJpbmcmIHJldHVyblZhbHVlKQoreworICAgIFNjcmlwdFZhbHVlIHJlc3VsdCA9IG1fbWFpbkZy
YW1lLT5zY3JpcHQoKS0+ZXhlY3V0ZVNjcmlwdChXVEY6OlN0cmluZzo6ZnJvbVVURjgoc2NyaXB0
KSwgZmFsc2UpOworICAgIEpTQzo6SlNWYWx1ZSB2YWx1ZSA9IHJlc3VsdC5qc1ZhbHVlKCk7Cisg
ICAgaWYgKCF2YWx1ZSkgeworICAgICAgICByZXR1cm5UeXBlID0gSlNFeGNlcHRpb247CisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBKU0M6OkV4ZWNTdGF0ZSogZXhlYyA9IG1f
bWFpbkZyYW1lLT5zY3JpcHQoKS0+Z2xvYmFsT2JqZWN0KG1haW5UaHJlYWROb3JtYWxXb3JsZCgp
KS0+Z2xvYmFsRXhlYygpOworICAgIEpTR2xvYmFsQ29udGV4dFJlZiBjb250ZXh0ID0gdG9HbG9i
YWxSZWYoZXhlYyk7CisKKyAgICBKU1R5cGUgdHlwZSA9IEpTVmFsdWVHZXRUeXBlKGNvbnRleHQs
IHRvUmVmKGV4ZWMsIHZhbHVlKSk7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIGtK
U1R5cGVOdWxsOgorICAgICAgICByZXR1cm5UeXBlID0gSlNOdWxsOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIGtKU1R5cGVCb29sZWFuOgorICAgICAgICByZXR1cm5UeXBlID0gSlNCb29sZWFu
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIGtKU1R5cGVOdW1iZXI6CisgICAgICAgIHJldHVy
blR5cGUgPSBKU051bWJlcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrSlNUeXBlU3RyaW5n
OgorICAgICAgICByZXR1cm5UeXBlID0gSlNTdHJpbmc7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2Uga0pTVHlwZU9iamVjdDoKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTT2JqZWN0OworICAgICAg
ICBicmVhazsKKyAgICBjYXNlIGtKU1R5cGVVbmRlZmluZWQ6CisgICAgZGVmYXVsdDoKKyAgICAg
ICAgcmV0dXJuVHlwZSA9IEpTVW5kZWZpbmVkOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAg
ICBpZiAocmV0dXJuVHlwZSA9PSBKU0Jvb2xlYW4gfHwgcmV0dXJuVHlwZSA9PSBKU051bWJlciB8
fCByZXR1cm5UeXBlID09IEpTU3RyaW5nIHx8IHJldHVyblR5cGUgPT0gSlNPYmplY3QpIHsKKyAg
ICAgICAgV1RGOjpTdHJpbmcgc3RyID0gcmVzdWx0LnRvU3RyaW5nKGV4ZWMpOworICAgICAgICBy
ZXR1cm5WYWx1ZSA9IFdlYlN0cmluZyhzdHIuaW1wbCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6ZXhlY3V0ZUphdmFTY3JpcHRJbklzb2xh
dGVkV29ybGQoY29uc3QgU2NyaXB0U291cmNlQ29kZSYgc291cmNlQ29kZSwgSmF2YVNjcmlwdERh
dGFUeXBlJiByZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKQoreworICAgIGlmICgh
bV9pc29sYXRlZFdvcmxkKQorICAgICAgICBtX2lzb2xhdGVkV29ybGQgPSBtX21haW5GcmFtZS0+
c2NyaXB0KCktPmNyZWF0ZVdvcmxkKCk7CisKKyAgICAvLyBVc2UgZXZhbHVhdGVJbldvcmxkIHRv
IGF2b2lkIGNhbkV4ZWN1dGVTY3JpcHRzIGNoZWNrLgorICAgIFNjcmlwdFZhbHVlIHJlc3VsdCA9
IG1fbWFpbkZyYW1lLT5zY3JpcHQoKS0+ZXZhbHVhdGVJbldvcmxkKHNvdXJjZUNvZGUsIG1faXNv
bGF0ZWRXb3JsZC5nZXQoKSk7CisgICAgSlNDOjpKU1ZhbHVlIHZhbHVlID0gcmVzdWx0LmpzVmFs
dWUoKTsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIHJldHVyblR5cGUgPSBKU0V4Y2VwdGlv
bjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEpTQzo6RXhlY1N0YXRlKiBl
eGVjID0gbV9tYWluRnJhbWUtPnNjcmlwdCgpLT5nbG9iYWxPYmplY3QobV9pc29sYXRlZFdvcmxk
LmdldCgpKS0+Z2xvYmFsRXhlYygpOworICAgIEpTR2xvYmFsQ29udGV4dFJlZiBjb250ZXh0ID0g
dG9HbG9iYWxSZWYoZXhlYyk7CisKKyAgICBKU1R5cGUgdHlwZSA9IEpTVmFsdWVHZXRUeXBlKGNv
bnRleHQsIHRvUmVmKGV4ZWMsIHZhbHVlKSk7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBj
YXNlIGtKU1R5cGVOdWxsOgorICAgICAgICByZXR1cm5UeXBlID0gSlNOdWxsOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIGtKU1R5cGVCb29sZWFuOgorICAgICAgICByZXR1cm5UeXBlID0gSlNC
b29sZWFuOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGtKU1R5cGVOdW1iZXI6CisgICAgICAg
IHJldHVyblR5cGUgPSBKU051bWJlcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrSlNUeXBl
U3RyaW5nOgorICAgICAgICByZXR1cm5UeXBlID0gSlNTdHJpbmc7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2Uga0pTVHlwZU9iamVjdDoKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTT2JqZWN0Owor
ICAgICAgICBicmVhazsKKyAgICBjYXNlIGtKU1R5cGVVbmRlZmluZWQ6CisgICAgZGVmYXVsdDoK
KyAgICAgICAgcmV0dXJuVHlwZSA9IEpTVW5kZWZpbmVkOworICAgICAgICBicmVhazsKKyAgICB9
CisKKyAgICBpZiAocmV0dXJuVHlwZSA9PSBKU0Jvb2xlYW4gfHwgcmV0dXJuVHlwZSA9PSBKU051
bWJlciB8fCByZXR1cm5UeXBlID09IEpTU3RyaW5nIHx8IHJldHVyblR5cGUgPT0gSlNPYmplY3Qp
IHsKKyAgICAgICAgV1RGOjpTdHJpbmcgc3RyID0gcmVzdWx0LnRvU3RyaW5nKGV4ZWMpOworICAg
ICAgICByZXR1cm5WYWx1ZSA9IFdlYlN0cmluZyhzdHIuaW1wbCgpKTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c3RvcEN1cnJlbnRMb2FkKCkK
K3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBjb250YWluIGFsbCBjb21tb24gY29kZSB0
cmlnZ2VyZWQgYnkgV2ViUGFnZTo6bG9hZAorICAgIC8vICh3aGljaCBzdG9wcyBhbnkgbG9hZCBp
biBwcm9ncmVzcyBiZWZvcmUgc3RhcnRpbmcgdGhlIG5ldyBsb2FkKSBhbmQKKyAgICAvLyBXZWJQ
YWdlOjpzdG9wbG9hZGluZyAodGhlIGVudHJ5IHBvaW50IGZvciB0aGUgY2xpZW50IHRvIHN0b3Ag
dGhlIGxvYWQKKyAgICAvLyBleHBsaWNpdGx5KS4gSWYgaXQgc2hvdWxkIG9ubHkgYmUgZG9uZSB3
aGlsZSBzdG9wcGluZyB0aGUgbG9hZAorICAgIC8vIGV4cGxpY2l0bHksIGl0IGdvZXMgaW4gV2Vi
UGFnZTo6c3RvcExvYWRpbmcsIG5vdCBoZXJlLgorICAgIG1fbWFpbkZyYW1lLT5sb2FkZXIoKS0+
c3RvcEFsbExvYWRlcnMoKTsKKworICAgIC8vIENhbmNlbCBhbnkgZGVmZXJyZWQgc2NyaXB0IHRo
YXQgaGFzbid0IGJlZW4gcHJvY2Vzc2VkIHlldC4KKyAgICBGcmFtZUxvYWRlckNsaWVudEJsYWNr
QmVycnkqIGZyYW1lTG9hZGVyQ2xpZW50ID0gc3RhdGljX2Nhc3Q8RnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5Kj4obV9tYWluRnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKSk7CisgICAgZnJhbWVM
b2FkZXJDbGllbnQtPnNldERlZmVycmVkTWFudWFsU2NyaXB0KEtVUkwoKSk7Cit9CisKK3N0YXRp
YyB2b2lkIGNsb3NlVVJMUmVjdXJzaXZlbHkoRnJhbWUqIGZyYW1lKQoreworICAgIC8vIERvIG5v
dCBjcmVhdGUgbW9yZSBmcmFtZSBwbGVhc2UuCisgICAgRnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5KiBmcmFtZUxvYWRlckNsaWVudCA9IHN0YXRpY19jYXN0PEZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeSo+KGZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50KCkpOworICAgIGZyYW1lTG9hZGVyQ2xp
ZW50LT5zdXBwcmVzc0NoaWxkRnJhbWVDcmVhdGlvbigpOworCisgICAgZnJhbWUtPmxvYWRlcigp
LT5jbG9zZVVSTCgpOworCisgICAgVmVjdG9yPFJlZlB0cjxGcmFtZT4sIDEwPiBjaGlsZEZyYW1l
czsKKworICAgIGZvciAoUmVmUHRyPEZyYW1lPiBjaGlsZEZyYW1lID0gZnJhbWUtPnRyZWUoKS0+
Zmlyc3RDaGlsZCgpOyBjaGlsZEZyYW1lOyBjaGlsZEZyYW1lID0gY2hpbGRGcmFtZS0+dHJlZSgp
LT5uZXh0U2libGluZygpKQorICAgICAgICBjaGlsZEZyYW1lcy5hcHBlbmQoY2hpbGRGcmFtZSk7
CisKKyAgICB1bnNpZ25lZCBzaXplID0gY2hpbGRGcmFtZXMuc2l6ZSgpOworICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIGNsb3NlVVJMUmVjdXJzaXZlbHko
Y2hpbGRGcmFtZXNbaV0uZ2V0KCkpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpwcmVwYXJl
VG9EZXN0cm95KCkKK3sKKyAgICAvLyBCZWZvcmUgdGhlIGNsaWVudCBzdGFydHMgdGVhcmluZyBp
dHNlbGYgZG93biwgZGlzcGF0Y2ggdGhlIHVubG9hZCBldmVudAorICAgIC8vIHNvIGl0IGNhbiB0
YWtlIGVmZmVjdCB3aGlsZSBhbGwgdGhlIGNsaWVudCdzIHN0YXRlIChlLmcuIHNjcm9sbCBwb3Np
dGlvbikKKyAgICAvLyBpcyBzdGlsbCBwcmVzZW50LgorICAgIGNsb3NlVVJMUmVjdXJzaXZlbHko
bV9tYWluRnJhbWUpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXRMb2FkU3RhdGUoTG9h
ZFN0YXRlIHN0YXRlKQoreworICAgIGlmIChtX2xvYWRTdGF0ZSA9PSBzdGF0ZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgYm9vbCBpc0ZpcnN0TG9hZCA9IG1fbG9hZFN0YXRlID09IE5vbmU7CisK
KyAgICAvLyBTZWUgUklNIEJ1ZyAjMTA2OC4KKyAgICBpZiAoc3RhdGUgPT0gRmluaXNoZWQgJiYg
bV9tYWluRnJhbWUgJiYgbV9tYWluRnJhbWUtPmRvY3VtZW50KCkpCisgICAgICAgIG1fbWFpbkZy
YW1lLT5kb2N1bWVudCgpLT51cGRhdGVTdHlsZUlmTmVlZGVkKCk7CisKKyAgICBtX2xvYWRTdGF0
ZSA9IHN0YXRlOworCisjaWYgREVCVUdfV0VCUEFHRV9MT0FECisgICAgUGxhdGZvcm06OmxvZyhQ
bGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiV2ViUGFnZVByaXZhdGU6OnNldExvYWRTdGF0ZSAlZCIs
IHN0YXRlKTsKKyNlbmRpZgorCisgICAgc3dpdGNoIChtX2xvYWRTdGF0ZSkgeworICAgIGNhc2Ug
UHJvdmlzaW9uYWw6CisgICAgICAgIGlmIChpc0ZpcnN0TG9hZCkgeworICAgICAgICAgICAgLy8g
UGFpbnRzIHRoZSB2aXNpYmxlIGJhY2tpbmdzdG9yZSBhcyB3aGl0ZSB0byBwcmV2ZW50IGluaXRp
YWwgY2hlY2tlcmJvYXJkIG9uCisgICAgICAgICAgICAvLyB0aGUgZmlyc3QgYmxpdC4KKyAgICAg
ICAgICAgIGlmIChtX2JhY2tpbmdTdG9yZS0+ZC0+cmVuZGVyVmlzaWJsZUNvbnRlbnRzKCkgJiYg
IW1fYmFja2luZ1N0b3JlLT5kLT5pc1N1c3BlbmRlZCgpICYmICFtX2JhY2tpbmdTdG9yZS0+ZC0+
c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAgICAgICAgICAgICAgICBtX2JhY2tp
bmdTdG9yZS0+ZC0+YmxpdFZpc2libGVDb250ZW50cygpOworICAgICAgICB9CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgQ29tbWl0dGVkOgorICAgICAgICB7CisgICAgICAgICAgICB1bnNjaGVk
dWxlWm9vbUFib3V0UG9pbnQoKTsKKworI2lmIEVOQUJMRShTS0lBX0dQVV9DQU5WQVMpCisgICAg
ICAgICAgICBpZiAobV9wYWdlLT5zZXR0aW5ncygpLT5jYW52YXNVc2VzQWNjZWxlcmF0ZWREcmF3
aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGcmVlIEdQVSByZXNvdXJjZXMgYXMgd2UncmUg
b24gYSBuZXcgcGFnZS4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgaGVscCB1cyB0byBm
cmVlIG1lbW9yeSBwcmVzc3VyZS4KKyAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6R3JhcGhpY3M6
Om1ha2VTaGFyZWRSZXNvdXJjZUNvbnRleHRDdXJyZW50KFBsYXRmb3JtOjpHcmFwaGljczo6R0xF
UzIpOworICAgICAgICAgICAgICAgIEdyQ29udGV4dCogZ3JDb250ZXh0ID0gUGxhdGZvcm06Okdy
YXBoaWNzOjpnZXRHckNvbnRleHQoKTsKKyAgICAgICAgICAgICAgICBnckNvbnRleHQtPmZyZWVH
cHVSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisjaWYgVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQorICAgICAgICAgICAgLy8gRklYTUU6IGNvbXBvc2l0b3IgbWF5IG9u
bHkgYmUgdG91Y2hlZCBvbiB0aGUgY29tcG9zaXRpbmcgdGhyZWFkLgorICAgICAgICAgICAgLy8g
SG93ZXZlciwgaXQncyBjcmVhdGVkL2Rlc3Ryb3llZCBieSBhIHN5bmMgY29tbWFuZCBzbyB0aGlz
IGlzIGhhcm1sZXNzLgorICAgICAgICAgICAgaWYgKG1fY29tcG9zaXRvcikgeworICAgICAgICAg
ICAgICAgIG1fY29tcG9zaXRvci0+c2V0TGF5b3V0UmVjdEZvckNvbXBvc2l0aW5nKEludFJlY3Qo
KSk7CisgICAgICAgICAgICAgICAgbV9jb21wb3NpdG9yLT5zZXRDb250ZW50c1NpemVGb3JDb21w
b3NpdGluZyhJbnRTaXplKCkpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBt
X3ByZXZpb3VzQ29udGVudHNTaXplID0gSW50U2l6ZSgpOworICAgICAgICAgICAgbV9iYWNraW5n
U3RvcmUtPmQtPnJlc2V0UmVuZGVyUXVldWUoKTsKKyAgICAgICAgICAgIG1fYmFja2luZ1N0b3Jl
LT5kLT5yZXNldFRpbGVzKHRydWUgLyogcmVzZXRCYWNrZ3JvdW5kICovKTsKKyAgICAgICAgICAg
IG1fYmFja2luZ1N0b3JlLT5kLT5zZXRTY3JvbGxpbmdPclpvb21pbmcoZmFsc2UsIGZhbHNlIC8q
IHNob3VsZEJsaXQgKi8pOworICAgICAgICAgICAgbV91c2VyUGVyZm9ybWVkTWFudWFsWm9vbSA9
IGZhbHNlOworICAgICAgICAgICAgbV91c2VyUGVyZm9ybWVkTWFudWFsU2Nyb2xsID0gZmFsc2U7
CisgICAgICAgICAgICBtX3Nob3VsZFVzZUZpeGVkRGVza3RvcE1vZGUgPSBmYWxzZTsKKyAgICAg
ICAgICAgIGlmIChtX3Jlc2V0VmlydHVhbFZpZXdwb3J0T25Db21taXR0ZWQpIHsgLy8gRm9yIERS
VC4KKyAgICAgICAgICAgICAgICBtX3ZpcnR1YWxWaWV3cG9ydFdpZHRoID0gMDsKKyAgICAgICAg
ICAgICAgICBtX3ZpcnR1YWxWaWV3cG9ydEhlaWdodCA9IDA7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBpZiAobV93ZWJTZXR0aW5ncy0+dmlld3BvcnRXaWR0aCgpID4gMCkgeworICAgICAg
ICAgICAgICAgIG1fdmlydHVhbFZpZXdwb3J0V2lkdGggPSBtX3dlYlNldHRpbmdzLT52aWV3cG9y
dFdpZHRoKCk7CisgICAgICAgICAgICAgICAgbV92aXJ0dWFsVmlld3BvcnRIZWlnaHQgPSBtX2Rl
ZmF1bHRMYXlvdXRTaXplLmhlaWdodCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8g
Q2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IHByb2Nlc3MgdGhlIG1ldGEgdmlld3BvcnQgdGFnLCB0
aGlzIG9ubHkgaGFwcGVucyBvbiBoaXN0b3J5IG5hdmlnYXRpb24KKyAgICAgICAgICAgIGlmICgh
bV9kaWRSZXN0b3JlRnJvbVBhZ2VDYWNoZSkgeworICAgICAgICAgICAgICAgIG1fdmlld3BvcnRB
cmd1bWVudHMgPSBWaWV3cG9ydEFyZ3VtZW50cygpOworICAgICAgICAgICAgICAgIG1fdXNlclNj
YWxhYmxlID0gbV93ZWJTZXR0aW5ncy0+aXNVc2VyU2NhbGFibGUoKTsKKyAgICAgICAgICAgICAg
ICByZXNldFNjYWxlcygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBJ
bnRTaXplIHZpcnR1YWxWaWV3cG9ydCA9IHJlY29tcHV0ZVZpcnR1YWxWaWV3cG9ydEZyb21WaWV3
cG9ydEFyZ3VtZW50cygpOworICAgICAgICAgICAgICAgIG1fd2ViUGFnZS0+c2V0VmlydHVhbFZp
ZXdwb3J0U2l6ZSh2aXJ0dWFsVmlld3BvcnQud2lkdGgoKSwgdmlydHVhbFZpZXdwb3J0LmhlaWdo
dCgpKTsKKyAgICAgICAgICAgIH0KKworI2lmIEVOQUJMRShFVkVOVF9NT0RFX01FVEFUQUdTKQor
ICAgICAgICAgICAgZGlkUmVjZWl2ZUN1cnNvckV2ZW50TW9kZShQcm9jZXNzZWRDdXJzb3JFdmVu
dHMpOworICAgICAgICAgICAgZGlkUmVjZWl2ZVRvdWNoRXZlbnRNb2RlKFByb2Nlc3NlZFRvdWNo
RXZlbnRzKTsKKyNlbmRpZgorCisgICAgICAgICAgICAvLyBJZiBpdCdzIGEgb3V0bW9zdCBTVkcg
ZG9jdW1lbnQsIHdlIHVzZSBGaXhlZERlc2t0b3AgbW9kZSwgb3RoZXJ3aXNlCisgICAgICAgICAg
ICAvLyB3ZSBkZWZhdWx0IHRvIE1vYmlsZSBtb2RlLiBGb3IgZXhhbXBsZSwgdXNpbmcgRml4ZWRE
ZXNrdG9wIG1vZGUgdG8KKyAgICAgICAgICAgIC8vIHJlbmRlciBodHRwOi8vd3d3LmNyb2N6aWxs
YS5jb20vYml0c19hbmRfcGllY2VzL3N2Zy9zYW1wbGVzL3RpZ2VyL3RpZ2VyLnN2ZworICAgICAg
ICAgICAgLy8gaXMgdXNlci1leHBlcmllbmNlIGZyaWVuZGx5LgorICAgICAgICAgICAgaWYgKG1f
cGFnZS0+bWFpbkZyYW1lKCktPmRvY3VtZW50KCktPmlzU1ZHRG9jdW1lbnQoKSkgeworICAgICAg
ICAgICAgICAgIHNldFNob3VsZFVzZUZpeGVkRGVza3RvcE1vZGUodHJ1ZSk7CisgICAgICAgICAg
ICAgICAgc2V0Vmlld01vZGUoRml4ZWREZXNrdG9wKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAg
ICAgICAgICAgICAgIHNldFZpZXdNb2RlKE1vYmlsZSk7CisKKyAgICAgICAgICAgIC8vIFJlc2V0
IGJsb2NrIHpvb20gYW5kIHJlZmxvdy4KKyAgICAgICAgICAgIHJlc2V0QmxvY2tab29tKCk7Cisj
aWYgRU5BQkxFKFZJRVdQT1JUX1JFRkxPVykKKyAgICAgICAgICAgIHRvZ2dsZVRleHRSZWZsb3dJ
ZlRleHRSZWZsb3dFbmFibGVkT25seUZvckJsb2NrWm9vbSgpOworI2VuZGlmCisKKyAgICAgICAg
ICAgIC8vIFNldCB0aGUgc2Nyb2xsIHRvIG9yaWdpbiBoZXJlIGFuZCBub3RpZnkgdGhlIGNsaWVu
dCBzaW5jZSB3ZSdsbCBiZQorICAgICAgICAgICAgLy8gem9vbWluZyBiZWxvdyB3aXRob3V0IGFu
eSByZWFsIGNvbnRlbnRzIHlldCB0aHVzIHRoZSBjb250ZW50cyBzaXplCisgICAgICAgICAgICAv
LyB3ZSByZXBvcnQgdG8gdGhlIGNsaWVudCBjb3VsZCBtYWtlIG91ciBjdXJyZW50IHNjcm9sbCBw
b3NpdGlvbiBpbnZhbGlkLgorICAgICAgICAgICAgc2V0U2Nyb2xsUG9zaXRpb24oSW50UG9pbnQo
MCwgMCkpOworICAgICAgICAgICAgbm90aWZ5VHJhbnNmb3JtZWRTY3JvbGxDaGFuZ2VkKCk7CisK
KyAgICAgICAgICAgIC8vIFBhaW50cyB0aGUgdmlzaWJsZSBiYWNraW5nc3RvcmUgYXMgd2hpdGUu
IE5vdGUgaXQgaXMgaW1wb3J0YW50IHdlIGRvCisgICAgICAgICAgICAvLyB0aGlzIHN0cmljdGx5
IGFmdGVyIHJlLXNldHRpbmcgdGhlIHNjcm9sbCBwb3NpdGlvbiB0byBvcmlnaW4gYW5kIHJlc2V0
dGluZworICAgICAgICAgICAgLy8gdGhlIHNjYWxlcyBvdGhlcndpc2UgdGhlIHZpc2libGUgY29u
dGVudHMgY2FsY3VsYXRpb24gaXMgd3JvbmcgYW5kIHdlCisgICAgICAgICAgICAvLyBjYW4gZW5k
IHVwIGJsaXR0aW5nIGFydGlmYWN0cyBpbnN0ZWFkLiBTZWU6IFJJTSBCdWcgIzQwMS4KKyAgICAg
ICAgICAgIGlmIChtX2JhY2tpbmdTdG9yZS0+ZC0+cmVuZGVyVmlzaWJsZUNvbnRlbnRzKCkgJiYg
IW1fYmFja2luZ1N0b3JlLT5kLT5pc1N1c3BlbmRlZCgpICYmICFtX2JhY2tpbmdTdG9yZS0+ZC0+
c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAgICAgICAgICAgICAgICBtX2JhY2tp
bmdTdG9yZS0+ZC0+YmxpdFZpc2libGVDb250ZW50cygpOworCisgICAgICAgICAgICB6b29tVG9J
bml0aWFsU2NhbGVPbkxvYWQoKTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIGN1cnNvciBzdGF0
dXMuCisgICAgICAgICAgICB1cGRhdGVDdXJzb3IoKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKyAgICAgICAgICAgIC8vIERvbid0IHJlbmRlciBjb21wb3NpdGluZyBjb250
ZW50cyBmcm9tIHByZXZpb3VzIHBhZ2UuCisgICAgICAgICAgICByZXNldENvbXBvc2l0aW5nU3Vy
ZmFjZSgpOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2Ug
RmluaXNoZWQ6CisgICAgY2FzZSBGYWlsZWQ6CisgICAgICAgIC8vIE5vdGlmeSBjbGllbnQgb2Yg
dGhlIGluaXRpYWwgem9vbSBjaGFuZ2UuCisgICAgICAgIG1fY2xpZW50LT56b29tQ2hhbmdlZCht
X3dlYlBhZ2UtPmlzTWluWm9vbWVkKCksIG1fd2ViUGFnZS0+aXNNYXhab29tZWQoKSwgIXNob3Vs
ZFpvb21PbkVzY2FwZSgpLCBjdXJyZW50U2NhbGUoKSk7CisgICAgICAgIG1fYmFja2luZ1N0b3Jl
LT5kLT51cGRhdGVUaWxlcyh0cnVlIC8qIHVwZGF0ZVZpc2libGUgKi8sIGZhbHNlIC8qIGltbWVk
aWF0ZSAqLyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOwor
ICAgIH0KK30KKworZG91YmxlIFdlYlBhZ2VQcml2YXRlOjpjbGFtcGVkU2NhbGUoZG91YmxlIHNj
YWxlKSBjb25zdAoreworICAgIGlmIChzY2FsZSA8IG1pbmltdW1TY2FsZSgpKQorICAgICAgICBy
ZXR1cm4gbWluaW11bVNjYWxlKCk7CisgICAgaWYgKHNjYWxlID4gbWF4aW11bVNjYWxlKCkpCisg
ICAgICAgIHJldHVybiBtYXhpbXVtU2NhbGUoKTsKKyAgICByZXR1cm4gc2NhbGU7Cit9CisKK2Jv
b2wgV2ViUGFnZVByaXZhdGU6OnNob3VsZFpvb21BYm91dFBvaW50KGRvdWJsZSBzY2FsZSwgY29u
c3QgRmxvYXRQb2ludCYsIGJvb2wgZW5mb3JjZVNjYWxlQ2xhbXBpbmcsIGRvdWJsZSogY2xhbXBl
ZFNjYWxlKQoreworICAgIGlmICghbV9tYWluRnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgaWYgKGVuZm9yY2VTY2FsZUNsYW1waW5nKQorICAgICAgICBzY2FsZSA9
IHRoaXMtPmNsYW1wZWRTY2FsZShzY2FsZSk7CisKKyAgICBBU1NFUlQoY2xhbXBlZFNjYWxlKTsK
KyAgICAqY2xhbXBlZFNjYWxlID0gc2NhbGU7CisKKyAgICBpZiAoY3VycmVudFNjYWxlKCkgPT0g
c2NhbGUpIHsKKyAgICAgICAgLy8gTWFrZSBzdXJlIGJhY2tpbmdzdG9yZSB1cGRhdGVzIHJlc3Vt
ZSBmcm9tIHBpbmNoIHpvb20gaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGZpbmFsIHpvb20gbGV2ZWwg
ZG9lc24ndCBjaGFuZ2UuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXN1bWVTY3JlZW5B
bmRCYWNraW5nU3RvcmVVcGRhdGVzKEJhY2tpbmdTdG9yZTo6Tm9uZSk7CisgICAgICAgIG1fY2xp
ZW50LT56b29tQ2hhbmdlZChtX3dlYlBhZ2UtPmlzTWluWm9vbWVkKCksIG1fd2ViUGFnZS0+aXNN
YXhab29tZWQoKSwgIXNob3VsZFpvb21PbkVzY2FwZSgpLCBjdXJyZW50U2NhbGUoKSk7CisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBX
ZWJQYWdlUHJpdmF0ZTo6em9vbUFib3V0UG9pbnQoZG91YmxlIHVuY2xhbXBlZFNjYWxlLCBjb25z
dCBGbG9hdFBvaW50JiBhbmNob3IsIGJvb2wgZW5mb3JjZVNjYWxlQ2xhbXBpbmcsIGJvb2wgZm9y
Y2VSZW5kZXJpbmcsIGJvb2wgaXNSZXN0b3Jpbmdab29tTGV2ZWwpCit7CisgICAgaWYgKCFpc1Jl
c3RvcmluZ1pvb21MZXZlbCkgeworICAgICAgICAvLyBDbGVhciBhbnkgZXhpc3RpbmcgYmxvY2sg
em9vbS4gIChJZiB3ZSBhcmUgcmVzdG9yaW5nIGEgc2F2ZWQgem9vbSBsZXZlbCBvbiBwYWdlIGxv
YWQsCisgICAgICAgIC8vIHRoZXJlIGlzIGd1YXJhbnRlZWQgdG8gYmUgbm8gZXhpc3RpbmcgYmxv
Y2sgem9vbSBhbmQgd2UgZG9uJ3Qgd2FudCB0byBjbGVhciBtX3Nob3VsZFJlZmxvd0Jsb2NrLikK
KyAgICAgICAgcmVzZXRCbG9ja1pvb20oKTsKKyAgICB9CisKKyAgICAvLyBUaGUgcmVmbG93IGFu
ZCBibG9jayB6b29tIHN0dWZmIGhlcmUgbmVlZHMgdG8gaGFwcGVuIHJlZ2FyZGxlc3Mgb2YKKyAg
ICAvLyB3aGV0aGVyIHdlIHNob3VsZFpvb21BYm91dFBvaW50LgorI2lmIEVOQUJMRShWSUVXUE9S
VF9SRUZMT1cpCisgICAgdG9nZ2xlVGV4dFJlZmxvd0lmVGV4dFJlZmxvd0VuYWJsZWRPbmx5Rm9y
QmxvY2tab29tKG1fc2hvdWxkUmVmbG93QmxvY2spOworICAgIGlmIChtX3BhZ2UtPnNldHRpbmdz
KCktPmlzVGV4dFJlZmxvd0VuYWJsZWQoKSAmJiBtX21haW5GcmFtZS0+dmlldygpKQorICAgICAg
ICBzZXROZWVkc0xheW91dCgpOworI2VuZGlmCisKKyAgICBkb3VibGUgc2NhbGU7CisgICAgaWYg
KCFzaG91bGRab29tQWJvdXRQb2ludCh1bmNsYW1wZWRTY2FsZSwgYW5jaG9yLCBlbmZvcmNlU2Nh
bGVDbGFtcGluZywgJnNjYWxlKSkgeworICAgICAgICBpZiAobV93ZWJQYWdlLT5zZXR0aW5ncygp
LT50ZXh0UmVmbG93TW9kZSgpID09IFdlYlNldHRpbmdzOjpUZXh0UmVmbG93RW5hYmxlZCkgewor
ICAgICAgICAgICAgbV9jdXJyZW50UGluY2hab29tTm9kZSA9IDA7CisgICAgICAgICAgICBtX2Fu
Y2hvckluTm9kZVJlY3RSYXRpbyA9IEZsb2F0UG9pbnQoLTEsIC0xKTsKKyAgICAgICAgfQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHpvb207
CisgICAgem9vbS5zY2FsZShzY2FsZSk7CisKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICBp
ZiAobG9hZFN0YXRlKCkgPCBGaW5pc2hlZCkKKyAgICAgICAgUGxhdGZvcm06OmxvZyhQbGF0Zm9y
bTo6TG9nTGV2ZWxJbmZvLCAiV2ViUGFnZVByaXZhdGU6Onpvb21BYm91dFBvaW50IHNjYWxlICVm
IGFuY2hvciAoJWYsICVmKSIsIHNjYWxlLCBhbmNob3IueCgpLCBhbmNob3IueSgpKTsKKyNlbmRp
ZgorCisgICAgLy8gT3VyIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIGluIGZsb2F0LgorICAgIEZs
b2F0UG9pbnQgc2Nyb2xsUG9zaXRpb24gPSB0aGlzLT5zY3JvbGxQb3NpdGlvbigpOworCisgICAg
Ly8gQW5jaG9yIG9mZnNldCBmcm9tIHNjcm9sbCBwb3NpdGlvbiBpbiBmbG9hdC4KKyAgICBGbG9h
dFBvaW50IGFuY2hvck9mZnNldChhbmNob3IueCgpIC0gc2Nyb2xsUG9zaXRpb24ueCgpLCBhbmNo
b3IueSgpIC0gc2Nyb2xsUG9zaXRpb24ueSgpKTsKKworICAgIC8vIFRoZSBob3Jpem9udGFsIHNj
YWxpbmcgZmFjdG9yIGFuZCB2ZXJ0aWNhbCBzY2FsaW5nIGZhY3RvciBzaG91bGQgYmUgZXF1YWwK
KyAgICAvLyB0byBwcmVzZXJ2ZSBhc3BlY3QgcmF0aW8gb2YgY29udGVudC4KKyAgICBBU1NFUlQo
bV90cmFuc2Zvcm1hdGlvbk1hdHJpeC0+bTExKCkgPT0gbV90cmFuc2Zvcm1hdGlvbk1hdHJpeC0+
bTIyKCkpOworCisgICAgLy8gTmVlZCB0byBpbnZlcnQgdGhlIHByZXZpb3VzIHRyYW5zZm9ybSB0
byBhbmNob3IgdGhlIHZpZXdwb3J0LgorICAgIGRvdWJsZSBpbnZlcnNlU2NhbGUgPSBzY2FsZSAv
IG1fdHJhbnNmb3JtYXRpb25NYXRyaXgtPm0xMSgpOworCisgICAgLy8gQWN0dWFsIHpvb20uCisg
ICAgKm1fdHJhbnNmb3JtYXRpb25NYXRyaXggPSB6b29tOworCisgICAgLy8gU3VzcGVuZCBhbGwg
c2NyZWVuIHVwZGF0ZXMgdG8gdGhlIGJhY2tpbmdzdG9yZS4KKyAgICBtX2JhY2tpbmdTdG9yZS0+
ZC0+c3VzcGVuZFNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoKTsKKworICAgIHVwZGF0ZVZp
ZXdwb3J0U2l6ZSgpOworCisgICAgSW50UG9pbnQgbmV3U2Nyb2xsUG9zaXRpb24oSW50UG9pbnQo
bWF4KDAsIHN0YXRpY19jYXN0PGludD4ocm91bmRmKGFuY2hvci54KCkgLSBhbmNob3JPZmZzZXQu
eCgpIC8gaW52ZXJzZVNjYWxlKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG1heCgwLCBzdGF0aWNfY2FzdDxpbnQ+KHJvdW5kZihhbmNob3IueSgpIC0gYW5jaG9y
T2Zmc2V0LnkoKSAvIGludmVyc2VTY2FsZSkpKSkpOworCisgICAgaWYgKG1fd2ViUGFnZS0+c2V0
dGluZ3MoKS0+dGV4dFJlZmxvd01vZGUoKSA9PSBXZWJTZXR0aW5nczo6VGV4dFJlZmxvd0VuYWJs
ZWQpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgZm9yIGVtYWlsIHdoaWNoIGhhcyByZWZs
b3cgYWx3YXlzIHR1cm5lZCBvbi4KKyAgICAgICAgbV9tYWluRnJhbWUtPnZpZXcoKS0+c2V0TmVl
ZHNMYXlvdXQoKTsKKyAgICAgICAgcmVxdWVzdExheW91dElmTmVlZGVkKCk7CisgICAgICAgIGlm
IChtX2N1cnJlbnRQaW5jaFpvb21Ob2RlKQorICAgICAgICAgICAgbmV3U2Nyb2xsUG9zaXRpb24g
PSBjYWxjdWxhdGVSZWZsb3dlZFNjcm9sbFBvc2l0aW9uKGFuY2hvck9mZnNldCwgc2NhbGUgPT0g
bWluaW11bVNjYWxlKCkgPyAxIDogaW52ZXJzZVNjYWxlKTsKKyAgICAgICAgIG1fY3VycmVudFBp
bmNoWm9vbU5vZGUgPSAwOworICAgICAgICAgbV9hbmNob3JJbk5vZGVSZWN0UmF0aW8gPSBGbG9h
dFBvaW50KC0xLCAtMSk7CisgICAgfQorCisgICAgc2V0U2Nyb2xsUG9zaXRpb24obmV3U2Nyb2xs
UG9zaXRpb24pOworCisgICAgbm90aWZ5VHJhbnNmb3JtQ2hhbmdlZCgpOworCisgICAgYm9vbCBp
c0xvYWRpbmcgPSB0aGlzLT5pc0xvYWRpbmcoKTsKKworICAgIC8vIFdlIG5lZWQgdG8gaW52YWxp
ZGF0ZSBhbGwgdGlsZXMgYm90aCB2aXNpYmxlIGFuZCBub24tdmlzaWJsZSBpZiB3ZSdyZSBsb2Fk
aW5nLgorICAgIG1fYmFja2luZ1N0b3JlLT5kLT51cGRhdGVUaWxlcyhpc0xvYWRpbmcgLyogdXBk
YXRlVmlzaWJsZSAqLywgZmFsc2UgLyogaW1tZWRpYXRlICovKTsKKworICAgIG1fY2xpZW50LT5y
ZXNldEJpdG1hcFpvb21TY2FsZShtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tMTEoKSk7CisKKyAg
ICBib29sIHNob3VsZFJlbmRlciA9ICFpc0xvYWRpbmcgfHwgbV91c2VyUGVyZm9ybWVkTWFudWFs
Wm9vbSB8fCBmb3JjZVJlbmRlcmluZzsKKyAgICBib29sIHNob3VsZENsZWFyVmlzaWJsZVpvb20g
PSBpc0xvYWRpbmcgJiYgc2hvdWxkUmVuZGVyOworCisgICAgaWYgKHNob3VsZENsZWFyVmlzaWJs
ZVpvb20pIHsKKyAgICAgICAgLy8gSWYgd2UgYXJlIGxvYWRpbmcgYW5kIHJlbmRlcmluZyB0aGVu
IHdlIG5lZWQgdG8gY2xlYXIgdGhlIHJlbmRlciBxdWV1ZSdzCisgICAgICAgIC8vIHZpc2libGUg
em9vbSBqb2JzIGFzIHRoZXkgd2lsbCBiZSBpcnJlbGV2YW50IHdpdGggdGhlIHJlbmRlciBiZWxv
dy4KKyAgICAgICAgbV9iYWNraW5nU3RvcmUtPmQtPmNsZWFyVmlzaWJsZVpvb20oKTsKKyAgICB9
CisKKyAgICAvLyBDbGVhciB3aW5kb3cgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBhcnRpZmFj
dHMuCisgICAgaWYgKHNob3VsZFJlbmRlcikgeworICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+
Y2xlYXJXaW5kb3coKTsKKyAgICAgICAgLy8gUmVzdW1lIGFsbCBzY3JlZW4gdXBkYXRlcyB0byB0
aGUgYmFja2luZ3N0b3JlIGFuZCByZW5kZXIrYmxpdCB2aXNpYmxlIGNvbnRlbnRzIHRvIHNjcmVl
bi4KKyAgICAgICAgbV9iYWNraW5nU3RvcmUtPmQtPnJlc3VtZVNjcmVlbkFuZEJhY2tpbmdTdG9y
ZVVwZGF0ZXMoQmFja2luZ1N0b3JlOjpSZW5kZXJBbmRCbGl0KTsKKyAgICB9IGVsc2UgeworICAg
ICAgICAvLyBSZXN1bWUgYWxsIHNjcmVlbiB1cGRhdGVzIHRvIHRoZSBiYWNraW5nc3RvcmUgYnV0
IGRvIG5vdCBibGl0IHRvIHRoZSBzY3JlZW4gYmVjYXVzZSB3ZSBub3QgcmVuZGVyaW5nLgorICAg
ICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRl
cyhCYWNraW5nU3RvcmU6Ok5vbmUpOworICAgIH0KKworICAgIG1fY2xpZW50LT56b29tQ2hhbmdl
ZChtX3dlYlBhZ2UtPmlzTWluWm9vbWVkKCksIG1fd2ViUGFnZS0+aXNNYXhab29tZWQoKSwgIXNo
b3VsZFpvb21PbkVzY2FwZSgpLCBjdXJyZW50U2NhbGUoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworSW50UG9pbnQgV2ViUGFnZVByaXZhdGU6OmNhbGN1bGF0ZVJlZmxvd2VkU2Nyb2xsUG9z
aXRpb24oY29uc3QgRmxvYXRQb2ludCYgYW5jaG9yT2Zmc2V0LCBkb3VibGUgaW52ZXJzZVNjYWxl
KQoreworICAgIC8vIFNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiB0ZXh0IHJlZmxvdyBpcyBl
bmFibGVkCisgICAgQVNTRVJUKG1fd2ViUGFnZS0+c2V0dGluZ3MoKS0+dGV4dFJlZmxvd01vZGUo
KSA9PSBXZWJTZXR0aW5nczo6VGV4dFJlZmxvd0VuYWJsZWQpOworCisgICAgaW50IG9mZnNldFkg
PSAwOworICAgIGludCBvZmZzZXRYID0gMDsKKworICAgIEludFJlY3Qgbm9kZVJlY3QgPSByZWN0
Rm9yTm9kZShtX2N1cnJlbnRQaW5jaFpvb21Ob2RlLmdldCgpKTsKKworICAgIGlmIChtX2N1cnJl
bnRQaW5jaFpvb21Ob2RlLT5yZW5kZXJlcigpICYmIG1fYW5jaG9ySW5Ob2RlUmVjdFJhdGlvLnko
KSA+PSAwKSB7CisgICAgICAgIG9mZnNldFkgPSBub2RlUmVjdC5oZWlnaHQoKSAqIG1fYW5jaG9y
SW5Ob2RlUmVjdFJhdGlvLnkoKTsKKyAgICAgICAgaWYgKG1fY3VycmVudFBpbmNoWm9vbU5vZGUt
PnJlbmRlcmVyKCktPmlzSW1hZ2UoKSAmJiBtX2FuY2hvckluTm9kZVJlY3RSYXRpby54KCkgPiAw
KQorICAgICAgICAgICAgb2Zmc2V0WCA9IG5vZGVSZWN0LndpZHRoKCkgKiBtX2FuY2hvckluTm9k
ZVJlY3RSYXRpby54KCkgLSBhbmNob3JPZmZzZXQueCgpIC8gaW52ZXJzZVNjYWxlOworICAgIH0K
KworICAgIEludFJlY3QgcmVmbG93ZWRSZWN0ID0gYWRqdXN0UmVjdE9mZnNldEZvckZyYW1lT2Zm
c2V0KG5vZGVSZWN0LCBtX2N1cnJlbnRQaW5jaFpvb21Ob2RlLmdldCgpKTsKKworICAgIHJldHVy
biBJbnRQb2ludChtYXgoMCwgc3RhdGljX2Nhc3Q8aW50Pihyb3VuZGYocmVmbG93ZWRSZWN0Lngo
KSArIG9mZnNldFgpKSksCisgICAgICAgICAgICAgICAgICAgIG1heCgwLCBzdGF0aWNfY2FzdDxp
bnQ+KHJvdW5kZihyZWZsb3dlZFJlY3QueSgpICsgb2Zmc2V0WSAtIGFuY2hvck9mZnNldC55KCkg
LyBpbnZlcnNlU2NhbGUpKSkpOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpzY2hlZHVsZVpv
b21BYm91dFBvaW50KGRvdWJsZSB1bmNsYW1wZWRTY2FsZSwgY29uc3QgRmxvYXRQb2ludCYgYW5j
aG9yLCBib29sIGVuZm9yY2VTY2FsZUNsYW1waW5nLCBib29sIGZvcmNlUmVuZGVyaW5nKQorewor
ICAgIGRvdWJsZSBzY2FsZTsKKyAgICBpZiAoIXNob3VsZFpvb21BYm91dFBvaW50KHVuY2xhbXBl
ZFNjYWxlLCBhbmNob3IsIGVuZm9yY2VTY2FsZUNsYW1waW5nLCAmc2NhbGUpKSB7CisgICAgICAg
IC8vIFdlIGNvdWxkIGJlIGJhY2sgdG8gdGhlIHJpZ2h0IHpvb20gbGV2ZWwgYmVmb3JlIHRoZSB0
aW1lciBoYXMKKyAgICAgICAgLy8gdGltZWQgb3V0LCBiZWNhdXNlIG9mIHdpZ2dsaW5nIGJhY2sg
YW5kIGZvcnRoLiBTdG9wIHRoZSB0aW1lci4KKyAgICAgICAgdW5zY2hlZHVsZVpvb21BYm91dFBv
aW50KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBGb3Igc29tZSBy
ZWFzb24sIHRoZSBiaXRtYXAgem9vbSB3YW50cyBhbiBhbmNob3IgaW4gYmFja2luZ3N0b3JlIGNv
b3JkaW5hdGVzIQorICAgIC8vIHRoaXMgaXMgZGlmZmVyZW50IGZyb20gem9vbUFib3V0UG9pbnQs
IHdoaWNoIHdhbnRzIGNvbnRlbnQgY29vcmRpbmF0ZXMuCisgICAgLy8gU2VlIFJJTSBCdWcgIzY0
MS4KKworICAgIEZsb2F0UG9pbnQgdHJhbnNmb3JtZWRBbmNob3IgPSBtYXBUb1RyYW5zZm9ybWVk
RmxvYXRQb2ludChhbmNob3IpOworICAgIEZsb2F0UG9pbnQgdHJhbnNmb3JtZWRTY3JvbGxQb3Np
dGlvbiA9IG1hcFRvVHJhbnNmb3JtZWRGbG9hdFBvaW50KHNjcm9sbFBvc2l0aW9uKCkpOworCisg
ICAgLy8gUHJvaGliaXQgYmFja2luZ3N0b3JlIGZyb20gdXBkYXRpbmcgdGhlIHdpbmRvdyBvdmVy
dG9wIG9mIHRoZSBiaXRtYXAuCisgICAgbV9iYWNraW5nU3RvcmUtPmQtPnN1c3BlbmRTY3JlZW5B
bmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7CisKKyAgICAvLyBOZWVkIHRvIGludmVydCB0aGUgcHJl
dmlvdXMgdHJhbnNmb3JtIHRvIGFuY2hvciB0aGUgdmlld3BvcnQuCisgICAgZG91YmxlIHpvb21G
cmFjdGlvbiA9IHNjYWxlIC8gdHJhbnNmb3JtYXRpb25NYXRyaXgoKS0+bTExKCk7CisKKyAgICAv
LyBBbmNob3Igb2Zmc2V0IGZyb20gc2Nyb2xsIHBvc2l0aW9uIGluIGZsb2F0LgorICAgIEZsb2F0
UG9pbnQgYW5jaG9yT2Zmc2V0KHRyYW5zZm9ybWVkQW5jaG9yLngoKSAtIHRyYW5zZm9ybWVkU2Ny
b2xsUG9zaXRpb24ueCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVk
QW5jaG9yLnkoKSAtIHRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24ueSgpKTsKKworICAgIEludFBv
aW50IHNyY1BvaW50KAorICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHJvdW5kZih0cmFuc2Zvcm1l
ZEFuY2hvci54KCkgLSBhbmNob3JPZmZzZXQueCgpIC8gem9vbUZyYWN0aW9uKSksCisgICAgICAg
IHN0YXRpY19jYXN0PGludD4ocm91bmRmKHRyYW5zZm9ybWVkQW5jaG9yLnkoKSAtIGFuY2hvck9m
ZnNldC55KCkgLyB6b29tRnJhY3Rpb24pKSk7CisKKyAgICBjb25zdCBJbnRSZWN0IHZpZXdwb3J0
UmVjdCA9IEludFJlY3QoSW50UG9pbnQoMCwgMCksIHRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCkp
OworICAgIGNvbnN0IEludFJlY3QgZHN0UmVjdCA9IHZpZXdwb3J0UmVjdDsKKworICAgIC8vIFRo
aXMgaXMgdGhlIHJlY3QgdG8gcGFzcyBhcyB0aGUgYWN0dWFsIHNvdXJjZSByZWN0IGluIHRoZSBi
YWNraW5nc3RvcmUKKyAgICAvLyBmb3IgdGhlIHRyYW5zZm9ybSBnaXZlbiBieSB6b29tLgorICAg
IEludFJlY3Qgc3JjUmVjdChzcmNQb2ludC54KCksCisgICAgICAgICAgICAgICAgICAgIHNyY1Bv
aW50LnkoKSwKKyAgICAgICAgICAgICAgICAgICAgdmlld3BvcnRSZWN0LndpZHRoKCkgLyB6b29t
RnJhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0UmVjdC5oZWlnaHQoKSAvIHpv
b21GcmFjdGlvbik7CisgICAgbV9iYWNraW5nU3RvcmUtPmQtPmJsaXRDb250ZW50cyhkc3RSZWN0
LCBzcmNSZWN0KTsKKworICAgIG1fZGVsYXllZFpvb21Bcmd1bWVudHMuc2NhbGUgPSBzY2FsZTsK
KyAgICBtX2RlbGF5ZWRab29tQXJndW1lbnRzLmFuY2hvciA9IGFuY2hvcjsKKyAgICBtX2RlbGF5
ZWRab29tQXJndW1lbnRzLmVuZm9yY2VTY2FsZUNsYW1waW5nID0gZW5mb3JjZVNjYWxlQ2xhbXBp
bmc7CisgICAgbV9kZWxheWVkWm9vbUFyZ3VtZW50cy5mb3JjZVJlbmRlcmluZyA9IGZvcmNlUmVu
ZGVyaW5nOworICAgIG1fZGVsYXllZFpvb21UaW1lci0+c3RhcnRPbmVTaG90KGRlbGF5ZWRab29t
SW50ZXJ2YWwpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6
OnVuc2NoZWR1bGVab29tQWJvdXRQb2ludCgpCit7CisgICAgaWYgKG1fZGVsYXllZFpvb21UaW1l
ci0+aXNBY3RpdmUoKSkKKyAgICAgICAgbV9iYWNraW5nU3RvcmUtPmQtPnJlc3VtZVNjcmVlbkFu
ZEJhY2tpbmdTdG9yZVVwZGF0ZXMoQmFja2luZ1N0b3JlOjpOb25lKTsKKworICAgIG1fZGVsYXll
ZFpvb21UaW1lci0+c3RvcCgpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjp6b29tQWJvdXRQ
b2ludFRpbWVyRmlyZWQoVGltZXI8V2ViUGFnZVByaXZhdGU+KikKK3sKKyAgICB6b29tQWJvdXRQ
b2ludChtX2RlbGF5ZWRab29tQXJndW1lbnRzLnNjYWxlLCBtX2RlbGF5ZWRab29tQXJndW1lbnRz
LmFuY2hvciwgbV9kZWxheWVkWm9vbUFyZ3VtZW50cy5lbmZvcmNlU2NhbGVDbGFtcGluZywgbV9k
ZWxheWVkWm9vbUFyZ3VtZW50cy5mb3JjZVJlbmRlcmluZyk7Cit9CisKK3ZvaWQgV2ViUGFnZVBy
aXZhdGU6OnNldE5lZWRzTGF5b3V0KCkKK3sKKyAgICBGcmFtZVZpZXcqIHZpZXcgPSBtX21haW5G
cmFtZS0+dmlldygpOworICAgIEFTU0VSVCh2aWV3KTsKKyAgICB2aWV3LT5zZXROZWVkc0xheW91
dCgpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpyZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKSBj
b25zdAoreworICAgIEZyYW1lVmlldyogdmlldyA9IG1fbWFpbkZyYW1lLT52aWV3KCk7CisgICAg
QVNTRVJUKHZpZXcpOworICAgIHZpZXctPnVwZGF0ZUxheW91dEFuZFN0eWxlSWZOZWVkZWRSZWN1
cnNpdmUoKTsKKyAgICBBU1NFUlQoIXZpZXctPm5lZWRzTGF5b3V0KCkpOworfQorCitJbnRQb2lu
dCBXZWJQYWdlUHJpdmF0ZTo6c2Nyb2xsUG9zaXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBt
X2JhY2tpbmdTdG9yZUNsaWVudC0+c2Nyb2xsUG9zaXRpb24oKTsKK30KKworSW50UG9pbnQgV2Vi
UGFnZVByaXZhdGU6Om1heGltdW1TY3JvbGxQb3NpdGlvbigpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1fYmFja2luZ1N0b3JlQ2xpZW50LT5tYXhpbXVtU2Nyb2xsUG9zaXRpb24oKTsKK30KKwordm9p
ZCBXZWJQYWdlUHJpdmF0ZTo6c2V0U2Nyb2xsUG9zaXRpb24oY29uc3QgSW50UG9pbnQmIHBvcykK
K3sKKyAgICBtX2JhY2tpbmdTdG9yZUNsaWVudC0+c2V0U2Nyb2xsUG9zaXRpb24ocG9zKTsKK30K
KworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6c2hvdWxkU2VuZFJlc2l6ZUV2ZW50KCkKK3sKKyAgICBp
ZiAoIW1fbWFpbkZyYW1lLT5kb2N1bWVudCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAvLyBQUiM5Njg2NSA6IFByb3ZpZGUgYW4gb3B0aW9uIHRvIGFsd2F5cyBzZW5kIHJlc2l6ZSBl
dmVudHMsIHJlZ2FyZGxlc3Mgb2YgdGhlIGxvYWRpbmcKKyAgICAvLyAgICAgICAgICAgIHN0YXR1
cy4gVGhlIHNjZW5hcmlvIGZvciB0aGlzIGFyZSBTYXBwaGlyZSBhcHBsaWNhdGlvbnMgd2hpY2gg
dGVuZCB0bworICAgIC8vICAgICAgICAgICAgbWFpbnRhaW4gYW4gb3BlbiBHRVQgcmVxdWVzdCB0
byB0aGUgc2VydmVyLiBUaGlzIG9wZW4gR0VUIHJlc3VsdHMgaW4KKyAgICAvLyAgICAgICAgICAg
IHdlYmtpdCB0aGlua2luZyB0aGF0IGNvbnRlbnQgaXMgc3RpbGwgYXJyaXZpbmcgd2hlbiBhdCB0
aGUgYXBwbGljYXRpb24KKyAgICAvLyAgICAgICAgICAgIGxldmVsIGl0IGlzIGNvbnNpZGVyZWQg
ZnVsbHkgbG9hZGVkLgorICAgIC8vCisgICAgLy8gICAgICAgICAgICBOT1RFOiBDYXJlIG11c3Qg
YmUgZXhlcmNpc2VkIGluIHRoZSB1c2Ugb2YgdGhpcyBvcHRpb24sIGFzIGl0IGJ5cGFzc2VzCisg
ICAgLy8gICAgICAgICAgICAgICAgICB0aGUgc2FuaXR5IHByb3ZpZGVkIGluICdpc0xvYWRpbmdJ
bkFQSVNlbnNlKCknIGJlbG93LgorICAgIC8vCisgICAgc3RhdGljIGNvbnN0IGJvb2wgdW5yZXN0
cmljdGVkUmVzaXplRXZlbnRzID0gUGxhdGZvcm06OlNldHRpbmdzOjpnZXQoKS0+dW5yZXN0cmlj
dGVkUmVzaXplRXZlbnRzKCk7CisgICAgaWYgKHVucmVzdHJpY3RlZFJlc2l6ZUV2ZW50cykKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBEb24ndCBzZW5kIHRoZSByZXNpemUgZXZlbnQg
aWYgdGhlIGRvY3VtZW50IGlzIGxvYWRpbmcuIFNvbWUgcGFnZXMgYXV0b21hdGljYWxseSByZWxv
YWQKKyAgICAvLyB3aGVuIHRoZSB3aW5kb3cgaXMgcmVzaXplZDsgU2FmYXJpIG9uIGlQaG9uZSBv
ZnRlbiByZXNpemVzIHRoZSB3aW5kb3cgd2hpbGUgc2V0dGluZyB1cCBpdHMKKyAgICAvLyB2aWV3
cG9ydC4gVGhpcyBvYnZpb3VzbHkgY2FuIGNhdXNlIHByb2JsZW1zLgorICAgIERvY3VtZW50TG9h
ZGVyKiBkb2N1bWVudExvYWRlciA9IG1fbWFpbkZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2Fk
ZXIoKTsKKyAgICBpZiAoZG9jdW1lbnRMb2FkZXIgJiYgZG9jdW1lbnRMb2FkZXItPmlzTG9hZGlu
Z0luQVBJU2Vuc2UoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7
Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OndpbGxEZWZlckxvYWRpbmcoKQoreworICAgIG1f
Y2xpZW50LT53aWxsRGVmZXJMb2FkaW5nKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmRp
ZFJlc3VtZUxvYWRpbmcoKQoreworICAgIG1fY2xpZW50LT5kaWRSZXN1bWVMb2FkaW5nKCk7Cit9
CisKK2Jvb2wgV2ViUGFnZTo6c2Nyb2xsQnkoY29uc3QgUGxhdGZvcm06OkludFNpemUmIGRlbHRh
LCBib29sIHNjcm9sbE1haW5GcmFtZSkKK3sKKyAgICBkLT5tX2JhY2tpbmdTdG9yZUNsaWVudC0+
c2V0SXNDbGllbnRHZW5lcmF0ZWRTY3JvbGwodHJ1ZSk7CisgICAgYm9vbCBiID0gZC0+c2Nyb2xs
QnkoZGVsdGEud2lkdGgoKSwgZGVsdGEuaGVpZ2h0KCksIHNjcm9sbE1haW5GcmFtZSk7CisgICAg
ZC0+bV9iYWNraW5nU3RvcmVDbGllbnQtPnNldElzQ2xpZW50R2VuZXJhdGVkU2Nyb2xsKGZhbHNl
KTsKKyAgICByZXR1cm4gYjsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6c2Nyb2xsQnkoaW50
IGRlbHRhWCwgaW50IGRlbHRhWSwgYm9vbCBzY3JvbGxNYWluRnJhbWUpCit7CisgICAgSW50U2l6
ZSBkZWx0YShkZWx0YVgsIGRlbHRhWSk7CisgICAgaWYgKCFzY3JvbGxNYWluRnJhbWUpIHsKKyAg
ICAgICAgLy8gV2UgbmVlZCB0byB3b3JrIGFyb3VuZCB0aGUgZmFjdCB0aGF0IDo6bWFwe1RvLEZy
b219VHJhbnNmb3JtZWQgZG8gbm90CisgICAgICAgIC8vIHdvcmsgd2VsbCB3aXRoIG5lZ2F0aXZl
IHZhbHVlcywgbGlrZSBhIG5lZ2F0aXZlIHdpZHRoIG9yIGhlaWdodCBvZiBhbiBJbnRTaXplLgor
ICAgICAgICBJbnRTaXplIGNvcGllZERlbHRhKEludFNpemUoYWJzKGRlbHRhLndpZHRoKCkpLCBh
YnMoZGVsdGEuaGVpZ2h0KCkpKSk7CisgICAgICAgIEludFNpemUgdW50cmFuc2Zvcm1lZENvcGll
ZERlbHRhID0gbWFwRnJvbVRyYW5zZm9ybWVkKGNvcGllZERlbHRhKTsKKyAgICAgICAgZGVsdGEg
PSBJbnRTaXplKAorICAgICAgICAgICAgZGVsdGEud2lkdGgoKSA8IDAgPyAtdW50cmFuc2Zvcm1l
ZENvcGllZERlbHRhLndpZHRoKCkgOiB1bnRyYW5zZm9ybWVkQ29waWVkRGVsdGEud2lkdGgoKSwK
KyAgICAgICAgICAgIGRlbHRhLmhlaWdodCgpIDwgMCA/IC11bnRyYW5zZm9ybWVkQ29waWVkRGVs
dGEuaGVpZ2h0KCk6IHVudHJhbnNmb3JtZWRDb3BpZWREZWx0YS5oZWlnaHQoKSk7CisKKyAgICAg
ICAgaWYgKG1faW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGUpIHsKKyAgICAgICAgICAgIGlmIChz
Y3JvbGxOb2RlUmVjdXJzaXZlbHkobV9pblJlZ2lvblNjcm9sbFN0YXJ0aW5nTm9kZS5nZXQoKSwg
ZGVsdGEpKSB7CisgICAgICAgICAgICAgICAgbV9zZWxlY3Rpb25IYW5kbGVyLT5zZWxlY3Rpb25Q
b3NpdGlvbkNoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogV2UgaGF2ZSBjb2Rl
IGluIHBsYWNlIHRvIGhhbmRsZSBzY3JvbGxpbmcgYW5kIGNsaXBwaW5nIHRhcCBoaWdobGlnaHQK
KyAgICAgICAgICAgICAgICAvLyBvbiBpbi1yZWdpb24gc2Nyb2xsaW5nLiBBcyBzb29uIGFzIGl0
IGlzIGZhc3QgZW5vdWdoIChpLmUuIHdlIGhhdmUgaXQgYmFja2VkIGJ5CisgICAgICAgICAgICAg
ICAgLy8gYSBiYWNraW5nIHN0b3JlKSwgd2UgY2FuIHJlbGlhYmx5IG1ha2UgdXNlIG9mIGl0IGlu
IHRoZSByZWFsIHdvcmxkLgorICAgICAgICAgICAgICAgIC8vIG1fdG91Y2hFdmVudEhhbmRsZXIt
PmRyYXdUYXBIaWdobGlnaHQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg
ICBzZXRTY3JvbGxQb3NpdGlvbihzY3JvbGxQb3NpdGlvbigpICsgZGVsdGEpOworICAgIHJldHVy
biB0cnVlOworfQorCit2b2lkIFdlYlBhZ2U6Om5vdGlmeUluUmVnaW9uU2Nyb2xsU3RhdHVzQ2hh
bmdlZChib29sIHN0YXR1cykKK3sKKyAgICBkLT5ub3RpZnlJblJlZ2lvblNjcm9sbFN0YXR1c0No
YW5nZWQoc3RhdHVzKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6bm90aWZ5SW5SZWdpb25T
Y3JvbGxTdGF0dXNDaGFuZ2VkKGJvb2wgc3RhdHVzKQoreworICAgIGlmICghc3RhdHVzICYmIG1f
aW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGUpIHsKKyAgICAgICAgZW5xdWV1ZVJlbmRlcmluZ09m
Q2xpcHBlZENvbnRlbnRPZlNjcm9sbGFibGVOb2RlQWZ0ZXJJblJlZ2lvblNjcm9sbGluZyhtX2lu
UmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2RlLmdldCgpKTsKKyAgICAgICAgbV9pblJlZ2lvblNjcm9s
bFN0YXJ0aW5nTm9kZSA9IDA7CisgICAgfQorfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjplbnF1
ZXVlUmVuZGVyaW5nT2ZDbGlwcGVkQ29udGVudE9mU2Nyb2xsYWJsZU5vZGVBZnRlckluUmVnaW9u
U2Nyb2xsaW5nKE5vZGUqIHNjcm9sbGVkTm9kZSkKK3sKKyAgICBBU1NFUlQoc2Nyb2xsZWROb2Rl
KTsKKyAgICBpZiAoc2Nyb2xsZWROb2RlLT5pc0RvY3VtZW50Tm9kZSgpKSB7CisgICAgICAgIEZy
YW1lKiBmcmFtZSA9IHN0YXRpY19jYXN0PGNvbnN0IERvY3VtZW50Kj4oc2Nyb2xsZWROb2RlKS0+
ZnJhbWUoKTsKKyAgICAgICAgQVNTRVJUKGZyYW1lKTsKKyAgICAgICAgaWYgKCFmcmFtZSkKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgQVNTRVJUKGZyYW1lICE9IG1fbWFpbkZyYW1lKTsK
KyAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0gZnJhbWUtPnZpZXcoKTsKKyAgICAgICAgaWYgKCF2
aWV3KQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFN0ZXBzOgorICAgICAgICAv
LyAjMSAtIEdldCBmcmFtZSByZWN0IGluIGNvbnRlbnRzIGNvb3Jkcy4KKyAgICAgICAgLy8gIzIg
LSBHZXQgdGhlIGNsaXBwZWQgc2Nyb2xsdmlldyByZWN0IGluIGNvbnRlbnRzIGNvb3Jkcy4KKyAg
ICAgICAgLy8gIzMgLSBUYWtlIHRyYW5zZm9ybSBpbnRvIGFjY291bnQgZm9yIDEgYW5kIDIuCisg
ICAgICAgIC8vICM0IC0gU3VidHJhY3QgMiBmcm9tIDEsIHNvIHdlIGtub3cgZXhhY3RseSB3aGlj
aCBhcmVhcyBvZiB0aGUgZnJhbWUKKyAgICAgICAgLy8gICAgICBhcmUgb2Zmc2NyZWVuLCBhbmQg
bmVlZCBhc3luYyByZXBhaW50aW5nLgorICAgICAgICBGcmFtZVZpZXcqIG1haW5GcmFtZVZpZXcg
PSBtX21haW5GcmFtZS0+dmlldygpOworICAgICAgICBBU1NFUlQobWFpbkZyYW1lVmlldyk7Cisg
ICAgICAgIEludFJlY3QgZnJhbWVSZWN0ID0gdmlldy0+ZnJhbWVSZWN0KCk7CisgICAgICAgIGZy
YW1lUmVjdCA9IGZyYW1lLT50cmVlKCktPnBhcmVudCgpLT52aWV3KCktPmNvbnRlbnRzVG9XaW5k
b3coZnJhbWVSZWN0KTsKKyAgICAgICAgZnJhbWVSZWN0ID0gbWFpbkZyYW1lVmlldy0+d2luZG93
VG9Db250ZW50cyhmcmFtZVJlY3QpOworCisgICAgICAgIEludFJlY3QgdmlzaWJsZVdpbmRvd1Jl
Y3QgPSBnZXRSZWN1cnNpdmVWaXNpYmxlV2luZG93UmVjdCh2aWV3KTsKKyAgICAgICAgSW50UmVj
dCB2aXNpYmxlQ29udGVudHNSZWN0ID0gbWFpbkZyYW1lVmlldy0+d2luZG93VG9Db250ZW50cyh2
aXNpYmxlV2luZG93UmVjdCk7CisKKyAgICAgICAgSW50UmVjdCB0cmFuc2Zvcm1lZEZyYW1lUmVj
dCA9IG1hcFRvVHJhbnNmb3JtZWQoZnJhbWVSZWN0KTsKKyAgICAgICAgSW50UmVjdCB0cmFuc2Zv
cm1lZFZpc2libGVDb250ZW50c1JlY3QgPSBtYXBUb1RyYW5zZm9ybWVkKHZpc2libGVDb250ZW50
c1JlY3QpOworCisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIG9mZnNjcmVlblJlZ2lv
bk9mSWZyYW1lCisgICAgICAgICAgICA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpzdWJ0cmFj
dFJlZ2lvbnMoUGxhdGZvcm06OkludFJlY3QodHJhbnNmb3JtZWRGcmFtZVJlY3QpLCBQbGF0Zm9y
bTo6SW50UmVjdCh0cmFuc2Zvcm1lZFZpc2libGVDb250ZW50c1JlY3QpKTsKKworICAgICAgICBp
ZiAoIW9mZnNjcmVlblJlZ2lvbk9mSWZyYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIG1fYmFj
a2luZ1N0b3JlLT5kLT5tX3JlbmRlclF1ZXVlLT5hZGRUb1F1ZXVlKFJlbmRlclF1ZXVlOjpSZWd1
bGFyUmVuZGVyLCBvZmZzY3JlZW5SZWdpb25PZklmcmFtZS5yZWN0cygpKTsKKyAgICB9Cit9CisK
K3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldEhhc0luUmVnaW9uU2Nyb2xsYWJsZUFyZWFzKGJvb2wg
YikKK3sKKyAgICBpZiAoYiAhPSBtX2hhc0luUmVnaW9uU2Nyb2xsYWJsZUFyZWFzKQorICAgICAg
ICBtX2hhc0luUmVnaW9uU2Nyb2xsYWJsZUFyZWFzID0gYjsKK30KKworSW50U2l6ZSBXZWJQYWdl
UHJpdmF0ZTo6dmlld3BvcnRTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbWFwRnJvbVRyYW5z
Zm9ybWVkKHRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCkpOworfQorCitJbnRTaXplIFdlYlBhZ2VQ
cml2YXRlOjphY3R1YWxWaXNpYmxlU2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1hcEZyb21U
cmFuc2Zvcm1lZCh0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKCkpOworfQorCitib29sIFdl
YlBhZ2VQcml2YXRlOjpoYXNWaXJ0dWFsVmlld3BvcnQoKSBjb25zdAoreworICAgIHJldHVybiBt
X3ZpcnR1YWxWaWV3cG9ydFdpZHRoICYmIG1fdmlydHVhbFZpZXdwb3J0SGVpZ2h0OworfQorCit2
b2lkIFdlYlBhZ2VQcml2YXRlOjp1cGRhdGVWaWV3cG9ydFNpemUoYm9vbCBzZXRGaXhlZFJlcG9y
dGVkU2l6ZSwgYm9vbCBzZW5kUmVzaXplRXZlbnQpCit7CisgICAgQVNTRVJUKG1fbWFpbkZyYW1l
LT52aWV3KCkpOworICAgIGlmIChzZXRGaXhlZFJlcG9ydGVkU2l6ZSkKKyAgICAgICAgbV9tYWlu
RnJhbWUtPnZpZXcoKS0+c2V0Rml4ZWRSZXBvcnRlZFNpemUoYWN0dWFsVmlzaWJsZVNpemUoKSk7
CisKKyAgICBJbnRSZWN0IGZyYW1lUmVjdCA9IEludFJlY3Qoc2Nyb2xsUG9zaXRpb24oKSwgdmll
d3BvcnRTaXplKCkpOworICAgIGlmIChmcmFtZVJlY3QgIT0gbV9tYWluRnJhbWUtPnZpZXcoKS0+
ZnJhbWVSZWN0KCkpIHsKKyAgICAgICAgbV9tYWluRnJhbWUtPnZpZXcoKS0+c2V0RnJhbWVSZWN0
KGZyYW1lUmVjdCk7CisgICAgICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPmFkanVzdFZpZXdTaXpl
KCk7CisgICAgfQorCisgICAgLy8gV2UncmUgZ29pbmcgdG8gbmVlZCB0byBzZW5kIGEgcmVzaXpl
IGV2ZW50IHRvIEphdmFTY3JpcHQgYmVjYXVzZQorICAgIC8vIGlubmVyV2lkdGggYW5kIGlubmVy
SGVpZ2h0IGRlcGVuZCBvbiBmaXhlZCByZXBvcnRlZCBzaXplLgorICAgIC8vIFRoaXMgaXMgaG93
IHdlIHN1cHBvcnQgbW9iaWxlIHBhZ2VzIHdoZXJlIEphdmFTY3JpcHQgcmVzaXplcworICAgIC8v
IHRoZSBwYWdlIGluIG9yZGVyIHRvIGdldCBhcm91bmQgdGhlIGZpeGVkIGxheW91dCBzaXplLCBl
LmcuCisgICAgLy8gZ29vZ2xlIG1hcHMgd2hlbiBpdCBkZXRlY3RzIGEgbW9iaWxlIHVzZXIgYWdl
bnQuCisgICAgaWYgKHNlbmRSZXNpemVFdmVudCAmJiBzaG91bGRTZW5kUmVzaXplRXZlbnQoKSkK
KyAgICAgICAgbV9tYWluRnJhbWUtPmV2ZW50SGFuZGxlcigpLT5zZW5kUmVzaXplRXZlbnQoKTsK
KworICAgIC8vIFdoZW4gdGhlIGFjdHVhbCB2aXNpYmxlIHNpemUgY2hhbmdlcywgd2UgYWxzbwor
ICAgIC8vIG5lZWQgdG8gcmVwb3NpdGlvbiBmaXhlZCBlbGVtZW50cy4KKyAgICBtX21haW5GcmFt
ZS0+dmlldygpLT5yZXBhaW50Rml4ZWRFbGVtZW50c0FmdGVyU2Nyb2xsaW5nKCk7Cit9CisKK0Zs
b2F0UG9pbnQgV2ViUGFnZVByaXZhdGU6OmNlbnRlck9mVmlzaWJsZUNvbnRlbnRzUmVjdCgpIGNv
bnN0Cit7CisgICAgLy8gVGhlIHZpc2libGUgY29udGVudHMgcmVjdCBpbiBmbG9hdC4KKyAgICBG
bG9hdFJlY3QgdmlzaWJsZUNvbnRlbnRzUmVjdCA9IHRoaXMtPnZpc2libGVDb250ZW50c1JlY3Qo
KTsKKworICAgIC8vIFRoZSBjZW50ZXIgb2YgdGhlIHZpc2libGUgY29udGVudHMgcmVjdCBpbiBm
bG9hdC4KKyAgICByZXR1cm4gRmxvYXRQb2ludCh2aXNpYmxlQ29udGVudHNSZWN0LngoKSArIHZp
c2libGVDb250ZW50c1JlY3Qud2lkdGgoKSAvIDIuMCwKKyAgICAgICAgICAgICAgICAgICAgICB2
aXNpYmxlQ29udGVudHNSZWN0LnkoKSArIHZpc2libGVDb250ZW50c1JlY3QuaGVpZ2h0KCkgLyAy
LjApOworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2YXRlOjp2aXNpYmxlQ29udGVudHNSZWN0KCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbV9iYWNraW5nU3RvcmVDbGllbnQtPnZpc2libGVDb250ZW50
c1JlY3QoKTsKK30KKworSW50U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6Y29udGVudHNTaXplKCkgY29u
c3QKK3sKKyAgICBpZiAoIW1fbWFpbkZyYW1lLT52aWV3KCkpCisgICAgICAgIHJldHVybiBJbnRT
aXplKCk7CisKKyAgICByZXR1cm4gbV9iYWNraW5nU3RvcmVDbGllbnQtPmNvbnRlbnRzU2l6ZSgp
OworfQorCitJbnRTaXplIFdlYlBhZ2VQcml2YXRlOjphYnNvbHV0ZVZpc2libGVPdmVyZmxvd1Np
emUoKSBjb25zdAoreworICAgIGlmICghbV9tYWluRnJhbWUtPmNvbnRlbnRSZW5kZXJlcigpKQor
ICAgICAgICByZXR1cm4gSW50U2l6ZSgpOworICAgIHJldHVybiBJbnRTaXplKG1fbWFpbkZyYW1l
LT5jb250ZW50UmVuZGVyZXIoKS0+cmlnaHRBYnNvbHV0ZVZpc2libGVPdmVyZmxvdygpLCBtX21h
aW5GcmFtZS0+Y29udGVudFJlbmRlcmVyKCktPmJvdHRvbUFic29sdXRlVmlzaWJsZU92ZXJmbG93
KCkpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpjb250ZW50c1NpemVDaGFuZ2VkKGNvbnN0
IEludFNpemUmIGNvbnRlbnRzU2l6ZSkKK3sKKyAgICBpZiAobV9wcmV2aW91c0NvbnRlbnRzU2l6
ZSA9PSBjb250ZW50c1NpemUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRoaXMgc2hvdWxk
IG9ubHkgb2NjdXIgaW4gdGhlIG1pZGRsZSBvZiBsYXlvdXQgc28gd2Ugc2V0IGEgZmxhZyBoZXJl
IGFuZAorICAgIC8vIGhhbmRsZSBpdCBhdCB0aGUgZW5kIG9mIHRoZSBsYXlvdXQuCisgICAgbV9j
b250ZW50c1NpemVDaGFuZ2VkID0gdHJ1ZTsKKworI2lmIERFQlVHX1dFQlBBR0VfTE9BRAorICAg
IFBsYXRmb3JtOjpsb2coUGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIldlYlBhZ2VQcml2YXRlOjpj
b250ZW50c1NpemVDaGFuZ2VkICVkeCVkIiwgY29udGVudHNTaXplLndpZHRoKCksIGNvbnRlbnRz
U2l6ZS5oZWlnaHQoKSk7CisjZW5kaWYKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6b3ZlcmZs
b3dFeGNlZWRzQ29udGVudHNTaXplKCkKK3sKKyAgICBtX292ZXJmbG93RXhjZWVkc0NvbnRlbnRz
U2l6ZSA9IHRydWU7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmxheW91dEZpbmlzaGVkKCkK
K3sKKyAgICBpZiAoIW1fY29udGVudHNTaXplQ2hhbmdlZCAmJiAhbV9vdmVyZmxvd0V4Y2VlZHND
b250ZW50c1NpemUpCisgICAgICAgIHJldHVybjsKKworICAgIG1fY29udGVudHNTaXplQ2hhbmdl
ZCA9IGZhbHNlOyAvLyBUb2dnbGUgdG8gdHVybiBvZmYgbm90aWZpY2F0aW9uIGFnYWluLgorICAg
IG1fb3ZlcmZsb3dFeGNlZWRzQ29udGVudHNTaXplID0gZmFsc2U7CisKKyAgICBpZiAoY29udGVu
dHNTaXplKCkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBUaGUgY2FsbCB0
byB6b29tVG9Jbml0aWFsU2NhbGVPbkxvYWQgY2FuIGNhdXNlIHJlY3Vyc2l2ZSBsYXlvdXQgd2hl
biBjYWxsZWQgZnJvbQorICAgIC8vIHRoZSBtaWRkbGUgb2YgYSBsYXlvdXQsIGJ1dCB0aGUgcmVj
dXJzaW9uIGlzIGxpbWl0ZWQgYnkgZGV0ZWN0aW9uIGNvZGUgaW4KKyAgICAvLyBzZXRWaWV3TW9k
ZSgpIGFuZCBtaXRpZ2F0aW9uIGNvZGUgaW4gZml4ZWRMYXlvdXRTaXplKCkuCisgICAgaWYgKGRp
ZExheW91dEV4Y2VlZE1heGltdW1JdGVyYXRpb25zKCkpIHsKKyAgICAgICAgbm90aWZ5VHJhbnNm
b3JtZWRDb250ZW50c1NpemVDaGFuZ2VkKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICAvLyBUZW1wb3JhcmlseSBzYXZlIHRoZSBtX3ByZXZpb3VzQ29udGVudHNTaXplIGhlcmUgYmVm
b3JlIHVwZGF0aW5nIGl0IChpbgorICAgIC8vIG5vdGlmeVRyYW5zZm9ybWVkQ29udGVudHNTaXpl
Q2hhbmdlZCgpKSBzbyB3ZSBjYW4gY29tcGFyZSBpZiBvdXIgY29udGVudHMKKyAgICAvLyBzaHJ1
bmsgYWZ0ZXJ3YXJkcy4KKyAgICBJbnRTaXplIHByZXZpb3VzQ29udGVudHNTaXplID0gbV9wcmV2
aW91c0NvbnRlbnRzU2l6ZTsKKworICAgIG1fbmVzdGVkTGF5b3V0RmluaXNoZWRDb3VudCsrOwor
CisgICAgaWYgKGxvYWRTdGF0ZSgpID09IENvbW1pdHRlZCkKKyAgICAgICAgem9vbVRvSW5pdGlh
bFNjYWxlT25Mb2FkKCk7CisgICAgZWxzZSBpZiAobG9hZFN0YXRlKCkgIT0gTm9uZSkKKyAgICAg
ICAgbm90aWZ5VHJhbnNmb3JtZWRDb250ZW50c1NpemVDaGFuZ2VkKCk7CisKKyAgICBtX25lc3Rl
ZExheW91dEZpbmlzaGVkQ291bnQtLTsKKworICAgIGlmICghbV9uZXN0ZWRMYXlvdXRGaW5pc2hl
ZENvdW50KSB7CisgICAgICAgIC8vIFdoZW4gdGhlIGNvbnRlbnRzIHNocmlua3MsIHRoZXJlIGlz
IGEgcmlzayB0aGF0IHdlCisgICAgICAgIC8vIHdpbGwgYmUgbGVmdCBhdCBhIHNjcm9sbCBwb3Np
dGlvbiB0aGF0IGxpZXMgb3V0c2lkZSBvZiB0aGUKKyAgICAgICAgLy8gY29udGVudHMgcmVjdC4g
U2luY2Ugd2UgYWxsb3cgb3ZlcnNjcm9sbGluZyBhbmQgbmVnbGVjdAorICAgICAgICAvLyB0byBj
bGFtcCBvdmVyc2Nyb2xsIGluIG9yZGVyIHRvIHJldGFpbiBpbnB1dCBmb2N1cyAoUklNIEJ1ZyAj
NDE0KQorICAgICAgICAvLyB3ZSBuZWVkIHRvIGNsYW1wIHNvbWV3aGVyZSwgYW5kIHRoaXMgaXMg
d2hlcmUgd2Uga25vdyB0aGUKKyAgICAgICAgLy8gY29udGVudHMgc2l6ZSBoYXMgY2hhbmdlZC4K
KworICAgICAgICBpZiAoY29udGVudHNTaXplKCkgIT0gcHJldmlvdXNDb250ZW50c1NpemUpIHsK
KworICAgICAgICAgICAgSW50UG9pbnQgbmV3U2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlv
bigpOworCisgICAgICAgICAgICBpZiAoY29udGVudHNTaXplKCkuaGVpZ2h0KCkgPCBwcmV2aW91
c0NvbnRlbnRzU2l6ZS5oZWlnaHQoKSkgeworICAgICAgICAgICAgICAgIEludFBvaW50IHNjcm9s
bFBvc2l0aW9uV2l0aEhlaWdodFNocnVuayA9IEludFBvaW50KG5ld1Njcm9sbFBvc2l0aW9uLngo
KSwgbWF4aW11bVNjcm9sbFBvc2l0aW9uKCkueSgpKTsKKyAgICAgICAgICAgICAgICBuZXdTY3Jv
bGxQb3NpdGlvbiA9IG5ld1Njcm9sbFBvc2l0aW9uLnNocnVua1RvKHNjcm9sbFBvc2l0aW9uV2l0
aEhlaWdodFNocnVuayk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb250ZW50
c1NpemUoKS53aWR0aCgpIDwgcHJldmlvdXNDb250ZW50c1NpemUud2lkdGgoKSkgeworICAgICAg
ICAgICAgICAgIEludFBvaW50IHNjcm9sbFBvc2l0aW9uV2l0aFdpZHRoU2hydW5rID0gSW50UG9p
bnQobWF4aW11bVNjcm9sbFBvc2l0aW9uKCkueCgpLCBuZXdTY3JvbGxQb3NpdGlvbi55KCkpOwor
ICAgICAgICAgICAgICAgIG5ld1Njcm9sbFBvc2l0aW9uID0gbmV3U2Nyb2xsUG9zaXRpb24uc2hy
dW5rVG8oc2Nyb2xsUG9zaXRpb25XaXRoV2lkdGhTaHJ1bmspOworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICBpZiAobmV3U2Nyb2xsUG9zaXRpb24gIT0gc2Nyb2xsUG9zaXRpb24oKSkgewor
ICAgICAgICAgICAgICAgIHNldFNjcm9sbFBvc2l0aW9uKG5ld1Njcm9sbFBvc2l0aW9uKTsKKyAg
ICAgICAgICAgICAgICBub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQoKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6em9vbVRv
SW5pdGlhbFNjYWxlT25Mb2FkKCkKK3sKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICBQbGF0
Zm9ybTo6bG9nKFBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJXZWJQYWdlUHJpdmF0ZTo6em9vbVRv
SW5pdGlhbFNjYWxlT25Mb2FkIik7CisjZW5kaWYKKworICAgIGJvb2wgbmVlZHNMYXlvdXQgPSBm
YWxzZTsKKworICAgIC8vIElmIHRoZSBjb250ZW50cyB3aWR0aCBleGNlZWRzIHRoZSB2aWV3cG9y
dCB3aWR0aCBzZXQgdG8gZGVza3RvcCBtb2RlLgorICAgIGlmIChtX3Nob3VsZFVzZUZpeGVkRGVz
a3RvcE1vZGUpCisgICAgICAgIG5lZWRzTGF5b3V0ID0gc2V0Vmlld01vZGUoRml4ZWREZXNrdG9w
KTsKKyNpZiAhT1MoUU5YKQorICAgIGVsc2UgeworICAgICAgICAvLyBPbiBoYW5kc2V0LCBpZiBh
IHdlYiBwYWdlIHdvdWxkIGZpdCBpbiBsYW5kc2NhcGUgbW9kZSB1c2UgbW9iaWxlLgorICAgICAg
ICBpbnQgbWF4TW9iaWxlV2lkdGggPSBQbGF0Zm9ybTo6R3JhcGhpY3M6OlNjcmVlbjo6bGFuZHNj
YXBlV2lkdGgoKTsKKworICAgICAgICBpZiAoY29udGVudHNTaXplKCkud2lkdGgoKSA+IG1heE1v
YmlsZVdpZHRoCisgICAgICAgIHx8IGFic29sdXRlVmlzaWJsZU92ZXJmbG93U2l6ZSgpLndpZHRo
KCkgPiBtYXhNb2JpbGVXaWR0aCkKKyAgICAgICAgICAgIG5lZWRzTGF5b3V0ID0gc2V0Vmlld01v
ZGUoRGVza3RvcCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5lZWRzTGF5b3V0ID0gc2V0
Vmlld01vZGUoTW9iaWxlKTsKKyAgICB9CisjZWxzZQorICAgIGVsc2UKKyAgICAgICAgbmVlZHNM
YXlvdXQgPSBzZXRWaWV3TW9kZShEZXNrdG9wKTsKKyNlbmRpZgorCisgICAgaWYgKG5lZWRzTGF5
b3V0KSB7CisgICAgICAgIC8vIFRoaXMgY2FuIGNhdXNlIHJlY3Vyc2l2ZSBsYXlvdXQuLi4KKyAg
ICAgICAgc2V0TmVlZHNMYXlvdXQoKTsKKyAgICB9CisKKyAgICBpZiAoY29udGVudHNTaXplKCku
aXNFbXB0eSgpKSB7CisjaWYgREVCVUdfV0VCUEFHRV9MT0FECisgICAgICAgIFBsYXRmb3JtOjps
b2coUGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIldlYlBhZ2VQcml2YXRlOjp6b29tVG9Jbml0aWFs
U2NhbGVPbkxvYWQgY29udGVudCBpcyBlbXB0eSEiKTsKKyNlbmRpZgorICAgICAgICByZXF1ZXN0
TGF5b3V0SWZOZWVkZWQoKTsKKyAgICAgICAgbV9jbGllbnQtPnJlc2V0Qml0bWFwWm9vbVNjYWxl
KGN1cnJlbnRTY2FsZSgpKTsKKyAgICAgICAgbm90aWZ5VHJhbnNmb3JtZWRDb250ZW50c1NpemVD
aGFuZ2VkKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIHBlcmZvcm1lZFpv
b20gPSBmYWxzZTsKKyAgICBib29sIHNob3VsZFpvb20gPSAhbV91c2VyUGVyZm9ybWVkTWFudWFs
Wm9vbTsKKworICAgIC8vIElmIHRoaXMgbG9hZCBzaG91bGQgcmVzdG9yZSB2aWV3IHN0YXRlLCBk
b24ndCB6b29tIHRvIGluaXRpYWwgc2NhbGUKKyAgICAvLyBidXQgaW5zdGVhZCBsZXQgdGhlIEhp
c3RvcnlJdGVtJ3Mgc2F2ZWQgdmlld3BvcnQgcmVpZ24gc3VwcmVtZS4KKyAgICBpZiAobV9tYWlu
RnJhbWUgJiYgbV9tYWluRnJhbWUtPmxvYWRlcigpICYmIG1fbWFpbkZyYW1lLT5sb2FkZXIoKS0+
c2hvdWxkUmVzdG9yZVNjcm9sbFBvc2l0aW9uQW5kVmlld1N0YXRlKCkpCisgICAgICAgIHNob3Vs
ZFpvb20gPSBmYWxzZTsKKworICAgIGlmIChzaG91bGRab29tICYmIGxvYWRTdGF0ZSgpID09IENv
bW1pdHRlZCkgeworICAgICAgICAvLyBQcmVzZXJ2ZSBhdCB0b3AgYW5kIGF0IGxlZnQgcG9zaXRp
b24sIHRvIGF2b2lkIHNjcm9sbGluZworICAgICAgICAvLyB0byBhIG5vbiB0b3AtbGVmdCBwb3Np
dGlvbiBmb3Igd2ViIHBhZ2Ugd2l0aCB2aWV3cG9ydCBtZXRhIHRhZworICAgICAgICAvLyB0aGF0
IHNwZWNpZmllcyBhbiBpbml0aWFsLXNjYWxlIHRoYXQgaXMgem9vbWVkIGluLgorICAgICAgICBG
bG9hdFBvaW50IGFuY2hvciA9IGNlbnRlck9mVmlzaWJsZUNvbnRlbnRzUmVjdCgpOworICAgICAg
ICBpZiAoIXNjcm9sbFBvc2l0aW9uKCkueCgpKQorICAgICAgICAgICAgYW5jaG9yLnNldFgoMCk7
CisgICAgICAgIGlmICghc2Nyb2xsUG9zaXRpb24oKS55KCkpCisgICAgICAgICAgICBhbmNob3Iu
c2V0WSgwKTsKKyAgICAgICAgcGVyZm9ybWVkWm9vbSA9IHpvb21BYm91dFBvaW50KGluaXRpYWxT
Y2FsZSgpLCBhbmNob3IpOworICAgIH0KKworICAgIC8vIHpvb21BYm91dFBvaW50IGFib3ZlIGNh
biBhbHNvIHRvZ2dsZSBzZXROZWVkc0xheW91dCBhbmQgY2F1c2UgcmVjdXJzaXZlIGxheW91dC4u
LgorICAgIHJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpOworCisgICAgaWYgKCFwZXJmb3JtZWRab29t
KSB7CisgICAgICAgIC8vIFdlIG9ubHkgbm90aWZ5IGlmIHdlIGRpZG4ndCBwZXJmb3JtIHpvb20s
IGJlY2F1c2Ugem9vbSB3aWxsIG5vdGlmeSBvbgorICAgICAgICAvLyBpdHMgb3duLi4uCisgICAg
ICAgIG1fY2xpZW50LT5yZXNldEJpdG1hcFpvb21TY2FsZShjdXJyZW50U2NhbGUoKSk7CisgICAg
ICAgIG5vdGlmeVRyYW5zZm9ybWVkQ29udGVudHNTaXplQ2hhbmdlZCgpOworICAgIH0KK30KKwor
ZG91YmxlIFdlYlBhZ2VQcml2YXRlOjpjdXJyZW50U2NhbGUoKSBjb25zdAoreworICAgIHJldHVy
biBtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tMTEoKTsKK30KKworZG91YmxlIFdlYlBhZ2VQcml2
YXRlOjp6b29tVG9GaXRTY2FsZSgpIGNvbnN0Cit7CisgICAgLy8gV2UgbXVzdCBjbGFtcCB0aGUg
Y29udGVudHMgZm9yIHRoaXMgY2FsY3VsYXRpb24gc28gdGhhdCB3ZSBkbyBub3QgYWxsb3cgYW4K
KyAgICAvLyBhcmJpdHJhcmlseSBzbWFsbCB6b29tVG9GaXRTY2FsZSBtdWNoIGxpa2Ugd2UgY2xh
bXAgdGhlIGZpeGVkTGF5b3V0U2l6ZSgpCisgICAgLy8gc28gdGhhdCB3ZSBkbyBub3QgaGF2ZSBh
cmJpdHJhcmlseSBsYXJnZSBsYXlvdXQgc2l6ZS4KKyAgICAvLyBJZiB3ZSBoYXZlIGEgc3BlY2lm
aWVkIHZpZXdwb3J0LCB3ZSBtYXkgbmVlZCB0byBiZSBhYmxlIHRvIHpvb20gb3V0IG1vcmUuCisg
ICAgaW50IGNvbnRlbnRXaWR0aCA9IHN0ZDo6bWluKGNvbnRlbnRzU2l6ZSgpLndpZHRoKCksIHN0
ZDo6bWF4KG1fdmlydHVhbFZpZXdwb3J0V2lkdGgsIHN0YXRpY19jYXN0PGludD4oZGVmYXVsdE1h
eExheW91dFNpemUoKS53aWR0aCgpKSkpOworCisgICAgLy8gZGVmYXVsdE1heExheW91dFNpemUo
KS53aWR0aCgpIGlzIGEgc2FmZWd1YXJkIGZvciBleGNlc3NpdmVseSBsYXJnZSBwYWdlIGxheW91
dHMgdGhhdAorICAgIC8vIGlzIHRvbyByZXN0cmljdGl2ZSBmb3IgaW1hZ2UgZG9jdW1lbnRzLiBJ
biB0aGlzIGNhc2UsIHRoZSBkb2N1bWVudCB3aWR0aCBpcyBzdWZmaWNpZW50LgorICAgIERvY3Vt
ZW50KiBkb2MgPSBtX3BhZ2UtPm1haW5GcmFtZSgpLT5kb2N1bWVudCgpOworICAgIGlmIChkb2Mg
JiYgZG9jLT5pc0ltYWdlRG9jdW1lbnQoKSkKKyAgICAgICBjb250ZW50V2lkdGggPSBjb250ZW50
c1NpemUoKS53aWR0aCgpOworCisgICAgLy8gSWYgd2UgaGF2ZSBhIHZpcnR1YWwgdmlld3BvcnQg
YW5kIGl0cyBhc3BlY3QgcmF0aW8gY2F1c2VkIGNvbnRlbnQgdG8gbGF5b3V0CisgICAgLy8gd2lk
ZXIgdGhhbiB0aGUgZGVmYXVsdCBsYXlvdXQgYXNwZWN0IHJhdGlvIHdlIG5lZWQgdG8gem9vbSB0
byBmaXQgdGhlIGNvbnRlbnQgaGVpZ2h0CisgICAgLy8gaW4gb3JkZXIgdG8gYXZvaWQgc2hvd2lu
ZyBhIGdyZXkgYXJlYSBiZWxvdyB0aGUgd2ViIHBhZ2UuCisgICAgLy8gV2l0aG91dCB2aXJ0dWFs
IHZpZXdwb3J0IHdlIGNhbiBuZXZlciBnZXQgaW50byB0aGlzIHNpdHVhdGlvbi4KKyAgICBpZiAo
aGFzVmlydHVhbFZpZXdwb3J0KCkpIHsKKyAgICAgICAgaW50IGNvbnRlbnRIZWlnaHQgPSBzdGQ6
Om1pbihjb250ZW50c1NpemUoKS5oZWlnaHQoKSwgc3RkOjptYXgobV92aXJ0dWFsVmlld3BvcnRI
ZWlnaHQsIHN0YXRpY19jYXN0PGludD4oZGVmYXVsdE1heExheW91dFNpemUoKS5oZWlnaHQoKSkp
KTsKKworICAgICAgICAvLyBBc3BlY3QgcmF0aW8gY2hlY2sgd2l0aG91dCBkaXZpc2lvbi4KKyAg
ICAgICAgaWYgKGNvbnRlbnRXaWR0aCAqIG1fZGVmYXVsdExheW91dFNpemUuaGVpZ2h0KCkgPiBj
b250ZW50SGVpZ2h0ICogbV9kZWZhdWx0TGF5b3V0U2l6ZS53aWR0aCgpKQorICAgICAgICAgICAg
cmV0dXJuIGNvbnRlbnRIZWlnaHQgPiAwID8gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX2RlZmF1bHRM
YXlvdXRTaXplLmhlaWdodCgpKSAvIGNvbnRlbnRIZWlnaHQgOiAxLjA7CisgICAgfQorCisgICAg
cmV0dXJuIGNvbnRlbnRXaWR0aCA+IDAuMCA/IHN0YXRpY19jYXN0PGRvdWJsZT4obV9hY3R1YWxW
aXNpYmxlV2lkdGgpIC8gY29udGVudFdpZHRoIDogMS4wOworfQorCitkb3VibGUgV2ViUGFnZVBy
aXZhdGU6OmluaXRpYWxTY2FsZSgpIGNvbnN0Cit7CisgICAgaWYgKG1faW5pdGlhbFNjYWxlID4g
MC4wKQorICAgICAgICByZXR1cm4gbV9pbml0aWFsU2NhbGU7CisKKyAgICBpZiAobV93ZWJTZXR0
aW5ncy0+aXNab29tVG9GaXRPbkxvYWQoKSkKKyAgICAgICAgcmV0dXJuIHpvb21Ub0ZpdFNjYWxl
KCk7CisKKyAgICByZXR1cm4gMS4wOworfQorCit2b2lkIFdlYlBhZ2U6OmluaXRpYWxpemVJY29u
RGF0YUJhc2UoKQoreworICAgIEljb25EYXRhYmFzZUNsaWVudEJsYWNrQmVycnk6OmdldEluc3Rh
bmNlKCktPmluaXRJY29uRGF0YWJhc2UoZC0+bV93ZWJTZXR0aW5ncyk7Cit9CisKK2Jvb2wgV2Vi
UGFnZTo6aXNVc2VyU2NhbGFibGUoKSBjb25zdAoreworICAgIHJldHVybiBkLT5pc1VzZXJTY2Fs
YWJsZSgpOworfQorCitkb3VibGUgV2ViUGFnZTo6Y3VycmVudFNjYWxlKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gZC0+Y3VycmVudFNjYWxlKCk7Cit9CisKK2RvdWJsZSBXZWJQYWdlOjppbml0aWFs
U2NhbGUoKSBjb25zdAoreworICAgIHJldHVybiBkLT5pbml0aWFsU2NhbGUoKTsKK30KKworZG91
YmxlIFdlYlBhZ2U6Onpvb21Ub0ZpdFNjYWxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+em9v
bVRvRml0U2NhbGUoKTsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRJbml0aWFsU2NhbGUoZG91Ymxl
IGluaXRpYWxTY2FsZSkKK3sKKyAgICBkLT5zZXRJbml0aWFsU2NhbGUoaW5pdGlhbFNjYWxlKTsK
K30KKworZG91YmxlIFdlYlBhZ2U6Om1pbmltdW1TY2FsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGQtPm1pbmltdW1TY2FsZSgpOworfQorCit2b2lkIFdlYlBhZ2U6OnNldE1pbmltdW1TY2FsZShk
b3VibGUgbWluaW11bVNjYWxlKQoreworICAgIGQtPnNldE1pbmltdW1TY2FsZShtaW5pbXVtU2Nh
bGUpOworfQorCitkb3VibGUgV2ViUGFnZTo6bWF4aW11bVNjYWxlKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gZC0+bWF4aW11bVNjYWxlKCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0TWF4aW11bVNj
YWxlKGRvdWJsZSBtYXhpbXVtU2NhbGUpCit7CisgICAgZC0+c2V0TWF4aW11bVNjYWxlKG1heGlt
dW1TY2FsZSk7Cit9CisKK2RvdWJsZSBXZWJQYWdlUHJpdmF0ZTo6bWluaW11bVNjYWxlKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gKG1fbWluaW11bVNjYWxlID4gem9vbVRvRml0U2NhbGUoKSAmJiBt
X21pbmltdW1TY2FsZSA8PSBtYXhpbXVtU2NhbGUoKSkgPyBtX21pbmltdW1TY2FsZSA6IHpvb21U
b0ZpdFNjYWxlKCk7Cit9CisKK2RvdWJsZSBXZWJQYWdlUHJpdmF0ZTo6bWF4aW11bVNjYWxlKCkg
Y29uc3QKK3sKKyAgICBpZiAobV9tYXhpbXVtU2NhbGUgPj0gem9vbVRvRml0U2NhbGUoKSAmJiBt
X21heGltdW1TY2FsZSA+PSBtX21pbmltdW1TY2FsZSkKKyAgICAgICAgcmV0dXJuIG1fbWF4aW11
bVNjYWxlOworCisgICAgcmV0dXJuIGhhc1ZpcnR1YWxWaWV3cG9ydCgpID8gc3RkOjptYXg8ZG91
YmxlPih6b29tVG9GaXRTY2FsZSgpLCA0LjApIDogNC4wOworfQorCit2b2lkIFdlYlBhZ2VQcml2
YXRlOjpyZXNldFNjYWxlcygpCit7CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggaWRlbnRpdHk7
CisgICAgKm1fdHJhbnNmb3JtYXRpb25NYXRyaXggPSBpZGVudGl0eTsKKyAgICBtX2luaXRpYWxT
Y2FsZSA9IG1fd2ViU2V0dGluZ3MtPmluaXRpYWxTY2FsZSgpID4gMCA/IG1fd2ViU2V0dGluZ3Mt
PmluaXRpYWxTY2FsZSgpIDogLTEuMDsKKyAgICBtX21pbmltdW1TY2FsZSA9IC0xLjA7CisgICAg
bV9tYXhpbXVtU2NhbGUgPSAtMS4wOworCisgICAgLy8gV2UgaGF2ZSB0byBsZXQgV2ViQ29yZSBr
bm93IGFib3V0IHVwZGF0ZWQgZnJhbWVyZWN0IG5vdyB0aGF0IHdlJ3ZlCisgICAgLy8gcmVzZXQg
b3VyIHNjYWxlcy4gU2VlOiBSSU0gQnVnICM0MDEuCisgICAgdXBkYXRlVmlld3BvcnRTaXplKCk7
Cit9CisKK0ludFBvaW50IFdlYlBhZ2VQcml2YXRlOjp0cmFuc2Zvcm1lZFNjcm9sbFBvc2l0aW9u
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9iYWNraW5nU3RvcmVDbGllbnQtPnRyYW5zZm9ybWVk
U2Nyb2xsUG9zaXRpb24oKTsKK30KKworSW50UG9pbnQgV2ViUGFnZVByaXZhdGU6OnRyYW5zZm9y
bWVkTWF4aW11bVNjcm9sbFBvc2l0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9iYWNraW5n
U3RvcmVDbGllbnQtPnRyYW5zZm9ybWVkTWF4aW11bVNjcm9sbFBvc2l0aW9uKCk7Cit9CisKK0lu
dFNpemUgV2ViUGFnZVByaXZhdGU6OnRyYW5zZm9ybWVkQWN0dWFsVmlzaWJsZVNpemUoKSBjb25z
dAoreworICAgIHJldHVybiBJbnRTaXplKG1fYWN0dWFsVmlzaWJsZVdpZHRoLCBtX2FjdHVhbFZp
c2libGVIZWlnaHQpOworfQorCitJbnRTaXplIFdlYlBhZ2VQcml2YXRlOjp0cmFuc2Zvcm1lZFZp
ZXdwb3J0U2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFBsYXRmb3JtOjpHcmFwaGljczo6U2Ny
ZWVuOjpzaXplKCk7Cit9CisKK0ludFJlY3QgV2ViUGFnZVByaXZhdGU6OnRyYW5zZm9ybWVkVmlz
aWJsZUNvbnRlbnRzUmVjdCgpIGNvbnN0Cit7CisgICAgLy8gVXN1YWxseSB0aGlzIHdvdWxkIGJl
IG1hcFRvVHJhbnNmb3JtZWQodmlzaWJsZUNvbnRlbnRzUmVjdCgpKSwgYnV0CisgICAgLy8gdGhh
dCByZXN1bHRzIGluIHJvdW5kaW5nIGVycm9ycyBiZWNhdXNlIHdlIGFscmVhZHkgc2V0IHRoZSBX
ZWJDb3JlCisgICAgLy8gdmlld3BvcnQgc2l6ZSBmcm9tIG91ciBvcmlnaW5hbCB0cmFuc2Zvcm1l
ZFZpZXdwb3J0U2l6ZSgpLgorICAgIC8vIEluc3RlYWQsIHdlIG9ubHkgdHJhbnNmb3JtIHRoZSBz
Y3JvbGwgcG9zaXRpb24gYW5kIHRha2UgdGhlCisgICAgLy8gdmlld3BvcnQgc2l6ZSBhcyBpdCBp
cywgd2hpY2ggZW5zdXJlcyB0aGF0IGUuZy4gYmxpdHRpbmcgb3BlcmF0aW9ucworICAgIC8vIGFs
d2F5cyBjb3ZlciB0aGUgd2hvbGUgd2lkZ2V0L3NjcmVlbi4KKyAgICByZXR1cm4gSW50UmVjdCh0
cmFuc2Zvcm1lZFNjcm9sbFBvc2l0aW9uKCksIHRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCkpOwor
fQorCitJbnRTaXplIFdlYlBhZ2VQcml2YXRlOjp0cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpIGNv
bnN0Cit7CisgICAgLy8gbWFwVG9UcmFuc2Zvcm1lZCgpIGZ1bmN0aW9ucyB1c2UgdGhpcyBtZXRo
b2QgdG8gY3JvcCB0aGVpciByZXN1bHRzLAorICAgIC8vIHNvIHdlIGNhbid0IG1ha2UgdXNlIG9m
IHRoZW0gaGVyZS4gV2hpbGUgd2Ugd2FudCByb3VuZGluZyBpbnNpZGUgcGFnZQorICAgIC8vIGJv
dW5kYXJpZXMgdG8gZXh0ZW5kIHJlY3RhbmdsZXMgYW5kIHJvdW5kIHBvaW50cywgd2UgbmVlZCB0
byBjcm9wIHRoZQorICAgIC8vIGNvbnRlbnRzIHNpemUgdG8gdGhlIGZsb29yZWQgdmFsdWVzIHNv
IHRoYXQgd2UgZG9uJ3QgdHJ5IHRvIGRpc3BsYXkKKyAgICAvLyBvciByZXBvcnQgcG9pbnRzIHRo
YXQgYXJlIG5vdCBmdWxseSBjb3ZlcmVkIGJ5IHRoZSBhY3R1YWwgZmxvYXQtcG9pbnQKKyAgICAv
LyBjb250ZW50cyByZWN0YW5nbGUuCisgICAgY29uc3QgSW50U2l6ZSB1bnRyYW5zZm9ybWVkQ29u
dGVudHNTaXplID0gY29udGVudHNTaXplKCk7CisgICAgY29uc3QgRmxvYXRQb2ludCB0cmFuc2Zv
cm1lZEJvdHRvbVJpZ2h0ID0gbV90cmFuc2Zvcm1hdGlvbk1hdHJpeC0+bWFwUG9pbnQoCisgICAg
ICAgIEZsb2F0UG9pbnQodW50cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZS53aWR0aCgpLCB1bnRyYW5z
Zm9ybWVkQ29udGVudHNTaXplLmhlaWdodCgpKSk7CisgICAgcmV0dXJuIEludFNpemUoZmxvb3Jm
KHRyYW5zZm9ybWVkQm90dG9tUmlnaHQueCgpKSwgZmxvb3JmKHRyYW5zZm9ybWVkQm90dG9tUmln
aHQueSgpKSk7Cit9CisKK0ludFBvaW50IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tQ29udGVudHNU
b1ZpZXdwb3J0KGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9i
YWNraW5nU3RvcmVDbGllbnQtPm1hcEZyb21Db250ZW50c1RvVmlld3BvcnQocG9pbnQpOworfQor
CitJbnRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6bWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyhjb25z
dCBJbnRQb2ludCYgcG9pbnQpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fYmFja2luZ1N0b3JlQ2xp
ZW50LT5tYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKHBvaW50KTsKK30KKworSW50UmVjdCBXZWJQ
YWdlUHJpdmF0ZTo6bWFwRnJvbUNvbnRlbnRzVG9WaWV3cG9ydChjb25zdCBJbnRSZWN0JiByZWN0
KSBjb25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNsaWVudC0+bWFwRnJvbUNvbnRl
bnRzVG9WaWV3cG9ydChyZWN0KTsKK30KKworSW50UmVjdCBXZWJQYWdlUHJpdmF0ZTo6bWFwRnJv
bVZpZXdwb3J0VG9Db250ZW50cyhjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHJl
dHVybiBtX2JhY2tpbmdTdG9yZUNsaWVudC0+bWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyhyZWN0
KTsKK30KKworSW50UG9pbnQgV2ViUGFnZVByaXZhdGU6Om1hcEZyb21UcmFuc2Zvcm1lZENvbnRl
bnRzVG9UcmFuc2Zvcm1lZFZpZXdwb3J0KGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9iYWNraW5nU3RvcmVDbGllbnQtPm1hcEZyb21UcmFuc2Zvcm1lZENvbnRl
bnRzVG9UcmFuc2Zvcm1lZFZpZXdwb3J0KHBvaW50KTsKK30KKworSW50UG9pbnQgV2ViUGFnZVBy
aXZhdGU6Om1hcEZyb21UcmFuc2Zvcm1lZFZpZXdwb3J0VG9UcmFuc2Zvcm1lZENvbnRlbnRzKGNv
bnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9iYWNraW5nU3RvcmVD
bGllbnQtPm1hcEZyb21UcmFuc2Zvcm1lZFZpZXdwb3J0VG9UcmFuc2Zvcm1lZENvbnRlbnRzKHBv
aW50KTsKK30KKworSW50UmVjdCBXZWJQYWdlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkQ29u
dGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9iYWNraW5nU3RvcmVDbGllbnQtPm1hcEZyb21UcmFuc2Zvcm1lZENvbnRl
bnRzVG9UcmFuc2Zvcm1lZFZpZXdwb3J0KHJlY3QpOworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2
YXRlOjptYXBGcm9tVHJhbnNmb3JtZWRWaWV3cG9ydFRvVHJhbnNmb3JtZWRDb250ZW50cyhjb25z
dCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNsaWVu
dC0+bWFwRnJvbVRyYW5zZm9ybWVkVmlld3BvcnRUb1RyYW5zZm9ybWVkQ29udGVudHMocmVjdCk7
Cit9CisKKy8vIE5PVEU6IFBJWEVMIFJPVU5ESU5HIQorLy8gQWNjdXJhdGUgYmFjay1hbmQtZm9y
dGggcm91bmRpbmcgaXMgbm90IHBvc3NpYmxlIHdpdGggaW5mb3JtYXRpb24gbG9zcworLy8gYnkg
aW50ZWdlciBwb2ludHMgYW5kIHNpemVzLCBzbyB3ZSBhbHdheXMgZXhwYW5kIHRoZSByZXN1bHRp
bmcgbWFwcGVkCisvLyBmbG9hdCByZWN0YW5nbGVzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIuIEZv
ciBwb2ludHMsIHdlIGFsd2F5cyB1c2UKKy8vIGZsb29yLXJvdW5kaW5nIGluIG1hcFRvVHJhbnNm
b3JtZWQoKSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY3JvcCB0bworLy8gdGhlIChmbG9vcidk
KSB0cmFuc2Zvcm1lZCBjb250ZW50cyBzaXplLgorc3RhdGljIGlubGluZSBJbnRQb2ludCByb3Vu
ZFRyYW5zZm9ybWVkUG9pbnQoY29uc3QgRmxvYXRQb2ludCAmcG9pbnQpCit7CisgICAgLy8gTWFw
cyBieSByb3VuZGluZyBoYWxmIHRvd2FyZHMgemVyby4KKyAgICByZXR1cm4gSW50UG9pbnQoc3Rh
dGljX2Nhc3Q8aW50PihmbG9vcmYocG9pbnQueCgpKSksIHN0YXRpY19jYXN0PGludD4oZmxvb3Jm
KHBvaW50LnkoKSkpKTsKK30KKworc3RhdGljIGlubGluZSBJbnRQb2ludCByb3VuZFVudHJhbnNm
b3JtZWRQb2ludChjb25zdCBGbG9hdFBvaW50ICZwb2ludCkKK3sKKyAgICAvLyBNYXBzIGJ5IHJv
dW5kaW5nIGhhbGYgYXdheSBmcm9tIHplcm8uCisgICAgcmV0dXJuIEludFBvaW50KHN0YXRpY19j
YXN0PGludD4oY2VpbGYocG9pbnQueCgpKSksIHN0YXRpY19jYXN0PGludD4oY2VpbGYocG9pbnQu
eSgpKSkpOworfQorCitJbnRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6bWFwVG9UcmFuc2Zvcm1lZChj
b25zdCBJbnRQb2ludCYgcG9pbnQpIGNvbnN0Cit7CisgICAgcmV0dXJuIHJvdW5kVHJhbnNmb3Jt
ZWRQb2ludChtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tYXBQb2ludChGbG9hdFBvaW50KHBvaW50
KSkpOworfQorCitGbG9hdFBvaW50IFdlYlBhZ2VQcml2YXRlOjptYXBUb1RyYW5zZm9ybWVkRmxv
YXRQb2ludChjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90
cmFuc2Zvcm1hdGlvbk1hdHJpeC0+bWFwUG9pbnQocG9pbnQpOworfQorCitJbnRQb2ludCBXZWJQ
YWdlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkKGNvbnN0IEludFBvaW50JiBwb2ludCkgY29u
c3QKK3sKKyAgICByZXR1cm4gcm91bmRVbnRyYW5zZm9ybWVkUG9pbnQobV90cmFuc2Zvcm1hdGlv
bk1hdHJpeC0+aW52ZXJzZSgpLm1hcFBvaW50KEZsb2F0UG9pbnQocG9pbnQpKSk7Cit9CisKK0Zs
b2F0UG9pbnQgV2ViUGFnZVByaXZhdGU6Om1hcEZyb21UcmFuc2Zvcm1lZEZsb2F0UG9pbnQoY29u
c3QgRmxvYXRQb2ludCYgcG9pbnQpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdHJhbnNmb3JtYXRp
b25NYXRyaXgtPmludmVyc2UoKS5tYXBQb2ludChwb2ludCk7Cit9CisKK0Zsb2F0UmVjdCBXZWJQ
YWdlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkRmxvYXRSZWN0KGNvbnN0IEZsb2F0UmVjdCYg
cmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90cmFuc2Zvcm1hdGlvbk1hdHJpeC0+aW52ZXJz
ZSgpLm1hcFJlY3QocmVjdCk7Cit9CisKK0ludFNpemUgV2ViUGFnZVByaXZhdGU6Om1hcFRvVHJh
bnNmb3JtZWQoY29uc3QgSW50U2l6ZSYgc2l6ZSkgY29uc3QKK3sKKyAgICByZXR1cm4gbWFwVG9U
cmFuc2Zvcm1lZChJbnRSZWN0KEludFBvaW50KDAsIDApLCBzaXplKSkuc2l6ZSgpOworfQorCitJ
bnRTaXplIFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVHJhbnNmb3JtZWQoY29uc3QgSW50U2l6ZSYg
c2l6ZSkgY29uc3QKK3sKKyAgICByZXR1cm4gbWFwRnJvbVRyYW5zZm9ybWVkKEludFJlY3QoSW50
UG9pbnQoMCwgMCksIHNpemUpKS5zaXplKCk7Cit9CisKK0ludFJlY3QgV2ViUGFnZVByaXZhdGU6
Om1hcFRvVHJhbnNmb3JtZWQoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1
cm4gZW5jbG9zaW5nSW50UmVjdChtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tYXBSZWN0KEZsb2F0
UmVjdChyZWN0KSkpOworfQorCisvLyBVc2UgdGhpcyBpbiBjb25qdW5jdGlvbiB3aXRoIG1hcFRv
VHJhbnNmb3JtZWQoSW50UmVjdCksIGluIG1vc3QgY2FzZXMuCit2b2lkIFdlYlBhZ2VQcml2YXRl
OjpjbGlwVG9UcmFuc2Zvcm1lZENvbnRlbnRzUmVjdChJbnRSZWN0JiByZWN0KSBjb25zdAorewor
ICAgIHJlY3QuaW50ZXJzZWN0KEludFJlY3QoSW50UG9pbnQoMCwgMCksIHRyYW5zZm9ybWVkQ29u
dGVudHNTaXplKCkpKTsKK30KKworSW50UmVjdCBXZWJQYWdlUHJpdmF0ZTo6bWFwRnJvbVRyYW5z
Zm9ybWVkKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGVuY2xvc2lu
Z0ludFJlY3QobV90cmFuc2Zvcm1hdGlvbk1hdHJpeC0+aW52ZXJzZSgpLm1hcFJlY3QoRmxvYXRS
ZWN0KHJlY3QpKSk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OnRyYW5zZm9ybWVkUG9pbnRF
cXVhbHNVbnRyYW5zZm9ybWVkUG9pbnQoY29uc3QgSW50UG9pbnQmIHRyYW5zZm9ybWVkUG9pbnQs
IGNvbnN0IEludFBvaW50JiB1bnRyYW5zZm9ybWVkUG9pbnQpCit7CisgICAgLy8gU2NhbGluZyBk
b3duIGlzIGFsd2F5cyBtb3JlIGFjY3VyYXRlIHRoYW4gc2NhbGluZyB1cC4KKyAgICBpZiAobV90
cmFuc2Zvcm1hdGlvbk1hdHJpeC0+YSgpID4gMS4wKQorICAgICAgICByZXR1cm4gdHJhbnNmb3Jt
ZWRQb2ludCA9PSBtYXBUb1RyYW5zZm9ybWVkKHVudHJhbnNmb3JtZWRQb2ludCk7CisKKyAgICBy
ZXR1cm4gbWFwRnJvbVRyYW5zZm9ybWVkKHRyYW5zZm9ybWVkUG9pbnQpID09IHVudHJhbnNmb3Jt
ZWRQb2ludDsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6bm90aWZ5VHJhbnNmb3JtQ2hhbmdl
ZCgpCit7CisgICAgbm90aWZ5VHJhbnNmb3JtZWRDb250ZW50c1NpemVDaGFuZ2VkKCk7CisgICAg
bm90aWZ5VHJhbnNmb3JtZWRTY3JvbGxDaGFuZ2VkKCk7CisKKyAgICBtX2JhY2tpbmdTdG9yZS0+
ZC0+dHJhbnNmb3JtQ2hhbmdlZCgpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpub3RpZnlU
cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZUNoYW5nZWQoKQoreworICAgIC8vIFdlIG1hcmsgaGVyZSBh
cyB0aGUgbGFzdCByZXBvcnRlZCBjb250ZW50IHNpemUgd2Ugc2VudCB0byB0aGUgY2xpZW50Lgor
ICAgIG1fcHJldmlvdXNDb250ZW50c1NpemUgPSBjb250ZW50c1NpemUoKTsKKworICAgIGNvbnN0
IEludFNpemUgc2l6ZSA9IHRyYW5zZm9ybWVkQ29udGVudHNTaXplKCk7CisgICAgbV9iYWNraW5n
U3RvcmUtPmQtPmNvbnRlbnRzU2l6ZUNoYW5nZWQoc2l6ZSk7CisgICAgbV9jbGllbnQtPmNvbnRl
bnRzU2l6ZUNoYW5nZWQoc2l6ZSk7CisgICAgbV9zZWxlY3Rpb25IYW5kbGVyLT5zZWxlY3Rpb25Q
b3NpdGlvbkNoYW5nZWQoKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6bm90aWZ5VHJhbnNm
b3JtZWRTY3JvbGxDaGFuZ2VkKCkKK3sKKyAgICBjb25zdCBJbnRQb2ludCBwb3MgPSB0cmFuc2Zv
cm1lZFNjcm9sbFBvc2l0aW9uKCk7CisgICAgbV9iYWNraW5nU3RvcmUtPmQtPnNjcm9sbENoYW5n
ZWQocG9zKTsKKyAgICBtX2NsaWVudC0+c2Nyb2xsQ2hhbmdlZChwb3MpOworfQorCitib29sIFdl
YlBhZ2VQcml2YXRlOjpzZXRWaWV3TW9kZShWaWV3TW9kZSBtb2RlKQoreworICAgIGlmICghbV9t
YWluRnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbV92aWV3TW9k
ZSA9IG1vZGU7CisKKyAgICAvLyBJZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgbmVzdGVkIGxh
eW91dCB3aXRoIGEgcmVjdXJzaW9uIGNvdW50IGFib3ZlCisgICAgLy8gc29tZSBtYXhpbXVtIHRo
cmVzaG9sZCwgdGhlbiBvdXIgYWxnb3JpdGhtIGZvciBmaW5kaW5nIHRoZSBtaW5pbXVtIGNvbnRl
bnQKKyAgICAvLyB3aWR0aCBvZiBhIGdpdmVuIHBhZ2UgaGFzIGJlY29tZSBkZXBlbmRlbnQgb24g
dGhlIHZpc2libGUgd2lkdGguCisgICAgLy8KKyAgICAvLyBXZSBuZWVkIHRvIGZpbmQgc29tZSBt
ZXRob2QgdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgZXhwZXJpZW5jZSBleGNlc3NpdmUKKyAgICAv
LyBhbmQgZXZlbiBpbmZpbml0ZSByZWN1cnNpb24uIFRoaXMgY2FuIGV2ZW4gaGFwcGVuIHdpdGgg
dmFsaWQgaHRtbC4gVGhlCisgICAgLy8gZm9ybWVyIGNhbiBoYXBwZW4gd2hlbiB3ZSBydW4gaW50
byBpbmxpbmUgdGV4dCB3aXRoIGZldyBjYW5kaWRhdGVzIGZvciBsaW5lCisgICAgLy8gYnJlYWsu
IFRoZSBsYXR0ZXIgY2FuIGhhcHBlbiBmb3IgaW5zdGFuY2UgaWYgdGhlIHBhZ2UgaGFzIGEgbmVn
YXRpdmUgbWFyZ2luCisgICAgLy8gc2V0IGFnYWluc3QgdGhlIHJpZ2h0IGJvcmRlci4gTm90ZTog
dGhpcyBpcyB2YWxpZCBieSBzcGVjIGFuZCBjYW4gbGVhZCB0bworICAgIC8vIGEgc2l0dWF0aW9u
IHdoZXJlIHRoZXJlIGlzIG5vIHZhbHVlIGZvciB3aGljaCB0aGUgY29udGVudCB3aWR0aCB3aWxs
IGVuc3VyZQorICAgIC8vIG5vIGhvcml6b250YWwgc2Nyb2xsYmFyLgorICAgIC8vIEV4YW1wbGU6
IExheW91dFRlc3RzL2NzczEvYm94X3Byb3BlcnRpZXMvbWFyZ2luLmh0bWwKKyAgICAvLworICAg
IC8vIEluIG9yZGVyIHRvIGFkZHJlc3Mgc3VjaCBzaXR1YXRpb25zIHdoZW4gd2UgZGV0ZWN0IGEg
cmVjdXJzaW9uIGFib3ZlIHNvbWUKKyAgICAvLyBtYXhpbXVtIHRocmVzaG9sZCB3ZSBzbmFwIG91
ciBmaXhlZCBsYXlvdXQgc2l6ZSB0byBhIGRlZmluZWQgcXVhbnR1bSBpbmNyZW1lbnQuCisgICAg
Ly8gRXZlbnR1YWxseSwgZWl0aGVyIHRoZSBjb250ZW50IHdpZHRoIHdpbGwgYmUgc2F0aXNmaWVk
IHRvIGVuc3VyZSBubyBob3Jpem9udGFsCisgICAgLy8gc2Nyb2xsYmFyIG9yIHRoaXMgaW5jcmVt
ZW50IHdpbGwgcnVuIGludG8gdGhlIG1heGltdW0gbGF5b3V0IHNpemUgYW5kIHRoZQorICAgIC8v
IHJlY3Vyc2lvbiB3aWxsIG5lY2Vzc2FyaWx5IGVuZC4KKyAgICBib29sIHNuYXBUb0luY3JlbWVu
dCA9IGRpZExheW91dEV4Y2VlZE1heGltdW1JdGVyYXRpb25zKCk7CisKKyAgICBJbnRTaXplIGN1
cnJlbnRTaXplID0gbV9tYWluRnJhbWUtPnZpZXcoKS0+Zml4ZWRMYXlvdXRTaXplKCk7CisgICAg
SW50U2l6ZSBuZXdTaXplID0gZml4ZWRMYXlvdXRTaXplKHNuYXBUb0luY3JlbWVudCk7CisgICAg
aWYgKGN1cnJlbnRTaXplID09IG5ld1NpemUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IC8vIEZJWE1FOiBUZW1wIHNvbHV0aW9uLiBXZSdsbCBnZXQgYmFjayB0byB0aGlzLgorICAgIGlm
IChtX25lc3RlZExheW91dEZpbmlzaGVkQ291bnQpIHsKKyAgICAgICAgZG91YmxlIHdpZHRoQ2hh
bmdlID0gZmFicyhkb3VibGUobmV3U2l6ZS53aWR0aCgpIC0gY3VycmVudFNpemUud2lkdGgoKSkg
LyBjdXJyZW50U2l6ZS53aWR0aCgpKTsKKyAgICAgICAgZG91YmxlIGhlaWdodENoYW5nZSA9IGZh
YnMoZG91YmxlKG5ld1NpemUuaGVpZ2h0KCkgLSBjdXJyZW50U2l6ZS5oZWlnaHQoKSkgLyBjdXJy
ZW50U2l6ZS5oZWlnaHQoKSk7CisgICAgICAgIGlmICh3aWR0aENoYW5nZSA8IDAuMDUgJiYgaGVp
Z2h0Q2hhbmdlIDwgMC4wNSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg
ICBtX21haW5GcmFtZS0+dmlldygpLT5zZXRVc2VGaXhlZExheW91dCh1c2VGaXhlZExheW91dCgp
KTsKKyAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXRGaXhlZExheW91dFNpemUobmV3U2l6ZSk7
CisgICAgcmV0dXJuIHRydWU7IC8vIE5lZWRzIHJlLWxheW91dCEKK30KKwordm9pZCBXZWJQYWdl
UHJpdmF0ZTo6c2V0Q3Vyc29yKFBsYXRmb3JtQ3Vyc29ySGFuZGxlIGhhbmRsZSkKK3sKKyAgICBp
ZiAobV9jdXJyZW50Q3Vyc29yLnR5cGUoKSAhPSBoYW5kbGUudHlwZSgpKSB7CisgICAgICAgIG1f
Y3VycmVudEN1cnNvciA9IGhhbmRsZTsKKyAgICAgICAgbV9jbGllbnQtPmN1cnNvckNoYW5nZWQo
aGFuZGxlLnR5cGUoKSwgaGFuZGxlLnVybCgpLmNfc3RyKCksIGhhbmRsZS5ob3RzcG90KCkueCgp
LCBoYW5kbGUuaG90c3BvdCgpLnkoKSk7CisgICAgfQorfQorCitQbGF0Zm9ybTo6TmV0d29ya1N0
cmVhbUZhY3RvcnkqIFdlYlBhZ2VQcml2YXRlOjpuZXR3b3JrU3RyZWFtRmFjdG9yeSgpCit7Cisg
ICAgcmV0dXJuIG1fY2xpZW50LT5uZXR3b3JrU3RyZWFtRmFjdG9yeSgpOworfQorCisKK1BsYXRm
b3JtOjpHcmFwaGljczo6V2luZG93KiBXZWJQYWdlUHJpdmF0ZTo6cGxhdGZvcm1XaW5kb3coKSBj
b25zdAoreworICAgIHJldHVybiBtX2NsaWVudC0+d2luZG93KCk7Cit9CisKK3ZvaWQgV2ViUGFn
ZVByaXZhdGU6OnNldFByZXZlbnRzU2NyZWVuRGltbWluZyhib29sIGtlZXBBd2FrZSkKK3sKKyAg
ICBpZiAoa2VlcEF3YWtlKSB7CisgICAgICAgIGlmICghbV9wcmV2ZW50SWRsZURpbW1pbmdDb3Vu
dCkKKyAgICAgICAgICAgIG1fY2xpZW50LT5zZXRQcmV2ZW50c1NjcmVlbklkbGVEaW1taW5nKHRy
dWUpOworICAgICAgICBtX3ByZXZlbnRJZGxlRGltbWluZ0NvdW50Kys7CisgICAgfSBlbHNlIGlm
IChtX3ByZXZlbnRJZGxlRGltbWluZ0NvdW50ID4gMCkgeworICAgICAgICBtX3ByZXZlbnRJZGxl
RGltbWluZ0NvdW50LS07CisgICAgICAgIGlmICghbV9wcmV2ZW50SWRsZURpbW1pbmdDb3VudCkK
KyAgICAgICAgICAgIG1fY2xpZW50LT5zZXRQcmV2ZW50c1NjcmVlbklkbGVEaW1taW5nKGZhbHNl
KTsKKyAgICB9IGVsc2UKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIFNldFByZXZl
bnRzU2NyZWVuSWRsZURpbW1pbmcoZmFsc2UpIGNhbGxlZCB0b28gbWFueSB0aW1lcy4KK30KKwor
dm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2hvd1ZpcnR1YWxLZXlib2FyZChib29sIHNob3dLZXlib2Fy
ZCkKK3sKKyAgICBtX2NsaWVudC0+aW5wdXRTZXROYXZpZ2F0aW9uTW9kZShzaG93S2V5Ym9hcmQp
OworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjplbnN1cmVDb250ZW50VmlzaWJsZShib29sIGNl
bnRlckluVmlldykKK3sKKyAgICBtX2lucHV0SGFuZGxlci0+ZW5zdXJlRm9jdXNFbGVtZW50Vmlz
aWJsZShjZW50ZXJJblZpZXcpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjp6b29tVG9Db250
ZW50UmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIERvbid0IHNjYWxlIGlmIHRo
ZSB1c2VyIGlzIG5vdCBzdXBwb3NlZCB0byBzY2FsZS4KKyAgICBpZiAoIWlzVXNlclNjYWxhYmxl
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIEZsb2F0UG9pbnQgYW5jaG9yID0gRmxvYXRQb2lu
dChyZWN0LndpZHRoKCkgLyAyLjAgKyByZWN0LngoKSwgcmVjdC5oZWlnaHQoKSAvIDIuMCArIHJl
Y3QueSgpKTsKKyAgICBJbnRTaXplIHZpZXdTaXplID0gdmlld3BvcnRTaXplKCk7CisKKyAgICAv
LyBDYWxjdWxhdGUgdGhlIHNjYWxlIHJlcXVpcmVkIHRvIHNjYWxlIHRoYXQgZGltZW5zaW9uIHRv
IGZpdC4KKyAgICBkb3VibGUgc2NhbGVIID0gKGRvdWJsZSl2aWV3U2l6ZS53aWR0aCgpIC8gKGRv
dWJsZSlyZWN0LndpZHRoKCk7CisgICAgZG91YmxlIHNjYWxlViA9IChkb3VibGUpdmlld1NpemUu
aGVpZ2h0KCkgLyAoZG91YmxlKXJlY3QuaGVpZ2h0KCk7CisKKyAgICAvLyBDaG9vc2UgdGhlIHNt
YWxsZXIgc2NhbGUgZmFjdG9yIHNvIHRoYXQgYWxsIG9mIHRoZSBjb250ZW50IGlzIHZpc2libGUu
CisgICAgem9vbUFib3V0UG9pbnQobWluKHNjYWxlSCwgc2NhbGVWKSwgYW5jaG9yKTsKK30KKwor
dm9pZCBXZWJQYWdlUHJpdmF0ZTo6cmVnaXN0ZXJQbHVnaW4oUGx1Z2luVmlldyogcGx1Z2luLCBi
b29sIHNob3VsZFJlZ2lzdGVyKQoreworICAgIGlmIChzaG91bGRSZWdpc3RlcikKKyAgICAgICAg
bV9wbHVnaW5WaWV3cy5hZGQocGx1Z2luKTsKKyAgICBlbHNlCisgICAgICAgIG1fcGx1Z2luVmll
d3MucmVtb3ZlKHBsdWdpbik7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6Om5vdGlmeVBhZ2VP
bkxvYWQoKQoreworICAgIEhhc2hTZXQ8UGx1Z2luVmlldyo+Ojpjb25zdF9pdGVyYXRvciBpdCA9
IG1fcGx1Z2luVmlld3MuYmVnaW4oKTsKKyAgICBIYXNoU2V0PFBsdWdpblZpZXcqPjo6Y29uc3Rf
aXRlcmF0b3IgbGFzdCA9IG1fcGx1Z2luVmlld3MuZW5kKCk7CisgICAgZm9yICg7IGl0ICE9IGxh
c3Q7ICsraXQpCisgICAgICAgICgqaXQpLT5oYW5kbGVPbkxvYWRFdmVudCgpOworfQorCitib29s
IFdlYlBhZ2VQcml2YXRlOjpzaG91bGRQbHVnaW5FbnRlckZ1bGxTY3JlZW4oUGx1Z2luVmlldyog
cGx1Z2luLCBjb25zdCBjaGFyKiB3aW5kb3dVbmlxdWVQcmVmaXgpCit7CisgICAgcmV0dXJuIG1f
Y2xpZW50LT5zaG91bGRQbHVnaW5FbnRlckZ1bGxTY3JlZW4oKTsKK30KKwordm9pZCBXZWJQYWdl
UHJpdmF0ZTo6ZGlkUGx1Z2luRW50ZXJGdWxsU2NyZWVuKFBsdWdpblZpZXcqIHBsdWdpbiwgY29u
c3QgY2hhciogd2luZG93VW5pcXVlUHJlZml4KQoreworICAgIG1fZnVsbFNjcmVlblBsdWdpblZp
ZXcgPSBwbHVnaW47CisgICAgbV9jbGllbnQtPmRpZFBsdWdpbkVudGVyRnVsbFNjcmVlbigpOwor
ICAgIFBsYXRmb3JtOjpHcmFwaGljczo6V2luZG93OjpzZXRUcmFuc3BhcmVuY3lEaXNjYXJkRmls
dGVyKHdpbmRvd1VuaXF1ZVByZWZpeCk7CisgICAgbV9jbGllbnQtPndpbmRvdygpLT5zZXRTZW5z
aXRpdml0eUZ1bGxzY3JlZW5PdmVycmlkZSh0cnVlKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0
ZTo6ZGlkUGx1Z2luRXhpdEZ1bGxTY3JlZW4oUGx1Z2luVmlldyogcGx1Z2luLCBjb25zdCBjaGFy
KiB3aW5kb3dVbmlxdWVQcmVmaXgpCit7CisgICAgbV9mdWxsU2NyZWVuUGx1Z2luVmlldyA9IDA7
CisgICAgbV9jbGllbnQtPmRpZFBsdWdpbkV4aXRGdWxsU2NyZWVuKCk7CisgICAgUGxhdGZvcm06
OkdyYXBoaWNzOjpXaW5kb3c6OnNldFRyYW5zcGFyZW5jeURpc2NhcmRGaWx0ZXIoMCk7CisgICAg
bV9jbGllbnQtPndpbmRvdygpLT5zZXRTZW5zaXRpdml0eUZ1bGxzY3JlZW5PdmVycmlkZShmYWxz
ZSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6Om9uUGx1Z2luU3RhcnRCYWNrZ3JvdW5kUGxh
eShQbHVnaW5WaWV3KiBwbHVnaW4sIGNvbnN0IGNoYXIqIHdpbmRvd1VuaXF1ZVByZWZpeCkKK3sK
KyAgICBtX2NsaWVudC0+b25QbHVnaW5TdGFydEJhY2tncm91bmRQbGF5KCk7Cit9CisKK3ZvaWQg
V2ViUGFnZVByaXZhdGU6Om9uUGx1Z2luU3RvcEJhY2tncm91bmRQbGF5KFBsdWdpblZpZXcqIHBs
dWdpbiwgY29uc3QgY2hhciogd2luZG93VW5pcXVlUHJlZml4KQoreworICAgIG1fY2xpZW50LT5v
blBsdWdpblN0b3BCYWNrZ3JvdW5kUGxheSgpOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjps
b2NrT3JpZW50YXRpb24oYm9vbCBsYW5kc2NhcGUpCit7CisgICAgcmV0dXJuIG1fY2xpZW50LT5s
b2NrT3JpZW50YXRpb24obGFuZHNjYXBlKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6dW5s
b2NrT3JpZW50YXRpb24oKQoreworICAgIHJldHVybiBtX2NsaWVudC0+dW5sb2NrT3JpZW50YXRp
b24oKTsKK30KKworaW50IFdlYlBhZ2VQcml2YXRlOjpvcmllbnRhdGlvbigpIGNvbnN0Cit7Cisj
aWYgRU5BQkxFKE9SSUVOVEFUSU9OX0VWRU5UUykKKyAgICByZXR1cm4gbV9tYWluRnJhbWUtPm9y
aWVudGF0aW9uKCk7CisjZWxzZQorI2Vycm9yIE9SSUVOVEFUSU9OX0VWRU5UUyBtdXN0IGJlIGRl
ZmluZWQuCisvLyBPciBhIGNvcHkgb2YgdGhlIG9yaWVudGF0aW9uIHZhbHVlIHdpbGwgaGF2ZSB0
byBiZSBzdG9yZWQgaW4gdGhlc2Ugb2JqZWN0cy4KKyNlbmRpZgorfQorCitkb3VibGUgV2ViUGFn
ZVByaXZhdGU6OmN1cnJlbnRab29tRmFjdG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gY3VycmVu
dFNjYWxlKCk7Cit9CisKK2ludCBXZWJQYWdlUHJpdmF0ZTo6c2hvd0FsZXJ0RGlhbG9nKFdlYlBh
Z2VDbGllbnQ6OkFsZXJ0VHlwZSBhdHlwZSkKK3sKKyAgICByZXR1cm4gbV9jbGllbnQtPnNob3dB
bGVydERpYWxvZyhhdHlwZSk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmlzQWN0aXZlKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbV9jbGllbnQtPmlzQWN0aXZlKCk7Cit9CisKK2Jvb2wgV2Vi
UGFnZVByaXZhdGU6OnVzZUZpeGVkTGF5b3V0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gdHJ1ZTsK
K30KKworQWN0aXZlTm9kZUNvbnRleHQgV2ViUGFnZVByaXZhdGU6OmFjdGl2ZU5vZGVDb250ZXh0
KFRhcmdldERldGVjdGlvblN0cmF0ZWd5IHN0cmF0ZWd5KQoreworICAgIEFjdGl2ZU5vZGVDb250
ZXh0IGNvbnRleHQ7CisKKyAgICBSZWZQdHI8Tm9kZT4gbm9kZSA9IGNvbnRleHROb2RlKHN0cmF0
ZWd5KTsKKyAgICBtX2N1cnJlbnRDb250ZXh0Tm9kZSA9IG5vZGU7CisgICAgaWYgKCFtX2N1cnJl
bnRDb250ZXh0Tm9kZSkKKyAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisKKyAgICByZXF1ZXN0TGF5
b3V0SWZOZWVkZWQoKTsKKworICAgIGJvb2wgbm9kZUFsbG93U2VsZWN0aW9uT3ZlcnJpZGUgPSBm
YWxzZTsKKyAgICBpZiAoTm9kZSogbGlua05vZGUgPSBub2RlLT5lbmNsb3NpbmdMaW5rRXZlbnRQ
YXJlbnRPclNlbGYoKSkgeworICAgICAgICBLVVJMIGhyZWY7CisgICAgICAgIGlmIChsaW5rTm9k
ZS0+aXNMaW5rKCkgJiYgbGlua05vZGUtPmhhc0F0dHJpYnV0ZXMoKSkgeworICAgICAgICAgICAg
aWYgKEF0dHJpYnV0ZSogYXR0cmlidXRlID0gbGlua05vZGUtPmF0dHJpYnV0ZXMoKS0+Z2V0QXR0
cmlidXRlSXRlbShIVE1MTmFtZXM6OmhyZWZBdHRyKSkKKyAgICAgICAgICAgICAgICBocmVmID0g
bGlua05vZGUtPmRvY3VtZW50KCktPmNvbXBsZXRlVVJMKHN0cmlwTGVhZGluZ0FuZFRyYWlsaW5n
SFRNTFNwYWNlcyhhdHRyaWJ1dGUtPnZhbHVlKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIFdU
Rjo6U3RyaW5nIHBhdHRlcm4gPSBmaW5kUGF0dGVyblN0cmluZ0ZvclVybChocmVmKTsKKyAgICAg
ICAgaWYgKCFwYXR0ZXJuLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRleHQuc2V0UGF0dGVy
bihwYXR0ZXJuKTsKKworICAgICAgICBpZiAoIWhyZWYuc3RyaW5nKCkuaXNFbXB0eSgpKSB7Cisg
ICAgICAgICAgICBjb250ZXh0LnNldFVybChocmVmLnN0cmluZygpKTsKKworICAgICAgICAgICAg
Ly8gTGlua3MgYXJlIG5vbi1zZWxlY3RhYmxlIGJ5IGRlZmF1bHQsIGJ1dCBzZWxlY3Rpb24gc2hv
dWxkIGJlIGFsbG93ZWQKKyAgICAgICAgICAgIC8vIHByb3ZpZGluZyB0aGUgcGFnZSBpcyBzZWxl
Y3RhYmxlLCB1c2UgdGhlIHBhcmVudCB0byBkZXRlcm1pbmUgaXQuCisgICAgICAgICAgICBpZiAo
bGlua05vZGUtPnBhcmVudE5vZGUoKSAmJiBsaW5rTm9kZS0+cGFyZW50Tm9kZSgpLT5jYW5TdGFy
dFNlbGVjdGlvbigpKQorICAgICAgICAgICAgICAgIG5vZGVBbGxvd1NlbGVjdGlvbk92ZXJyaWRl
ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghbm9kZUFsbG93U2VsZWN0aW9u
T3ZlcnJpZGUgJiYgIW5vZGUtPmNhblN0YXJ0U2VsZWN0aW9uKCkpCisgICAgICAgIGNvbnRleHQu
cmVzZXRGbGFnKEFjdGl2ZU5vZGVDb250ZXh0OjpJc1NlbGVjdGFibGUpOworCisgICAgaWYgKG5v
ZGUtPmlzSFRNTEVsZW1lbnQoKSkgeworICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZUVs
ZW1lbnQgPSAwOworICAgICAgICBpZiAobm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmltZ1Rh
ZykpCisgICAgICAgICAgICBpbWFnZUVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MSW1hZ2VFbGVt
ZW50Kj4obm9kZS5nZXQoKSk7CisgICAgICAgIGVsc2UgaWYgKG5vZGUtPmhhc1RhZ05hbWUoSFRN
TE5hbWVzOjphcmVhVGFnKSkKKyAgICAgICAgICAgIGltYWdlRWxlbWVudCA9IHN0YXRpY19jYXN0
PEhUTUxBcmVhRWxlbWVudCo+KG5vZGUuZ2V0KCkpLT5pbWFnZUVsZW1lbnQoKTsKKyAgICAgICAg
aWYgKGltYWdlRWxlbWVudCAmJiBpbWFnZUVsZW1lbnQtPnJlbmRlcmVyKCkpIHsKKyAgICAgICAg
ICAgIC8vIEZJWE1FOiBBdCB0aGUgbWVhbiB0aW1lLCB3ZSBvbmx5IHNob3cgIlNhdmUgSW1hZ2Ui
IHdoZW4gdGhlIGltYWdlIGRhdGEgaXMgYXZhaWxhYmxlLgorICAgICAgICAgICAgaWYgKENhY2hl
ZFJlc291cmNlKiBjYWNoZWRSZXNvdXJjZSA9IGltYWdlRWxlbWVudC0+Y2FjaGVkSW1hZ2UoKSkg
eworICAgICAgICAgICAgICAgIGlmIChjYWNoZWRSZXNvdXJjZS0+aXNMb2FkZWQoKSAmJiBjYWNo
ZWRSZXNvdXJjZS0+ZGF0YSgpKSB7CisgICAgICAgICAgICAgICAgICAgIFdURjo6U3RyaW5nIHVy
bCA9IHN0cmlwTGVhZGluZ0FuZFRyYWlsaW5nSFRNTFNwYWNlcyhpbWFnZUVsZW1lbnQtPmdldEF0
dHJpYnV0ZShIVE1MTmFtZXM6OnNyY0F0dHIpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAg
ICAgY29udGV4dC5zZXRJbWFnZVNyYyhub2RlLT5kb2N1bWVudCgpLT5jb21wbGV0ZVVSTCh1cmwp
LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBXVEY6OlN0cmluZyBhbHQgPSBpbWFnZUVsZW1lbnQtPmFsdFRleHQoKTsKKyAgICAgICAgICAg
IGlmICghYWx0LmlzTnVsbCgpKQorICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0SW1hZ2VBbHQo
YWx0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChub2RlLT5pc1RleHROb2RlKCkpIHsK
KyAgICAgICAgVGV4dCogY3VyVGV4dCA9IHN0YXRpY19jYXN0PFRleHQqPihub2RlLmdldCgpKTsK
KyAgICAgICAgaWYgKCFjdXJUZXh0LT53aG9sZVRleHQoKS5pc0VtcHR5KCkpCisgICAgICAgICAg
ICBjb250ZXh0LnNldFRleHQoY3VyVGV4dC0+d2hvbGVUZXh0KCkpOworICAgIH0KKworICAgIGlm
IChub2RlLT5pc0VsZW1lbnROb2RlKCkpIHsKKyAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IHN0
YXRpY19jYXN0PEVsZW1lbnQqPihub2RlLT5zaGFkb3dBbmNlc3Rvck5vZGUoKSk7CisgICAgICAg
IGlmIChET01TdXBwb3J0Ojppc1RleHRCYXNlZENvbnRlbnRFZGl0YWJsZUVsZW1lbnQoZWxlbWVu
dCkpIHsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0RmxhZyhBY3RpdmVOb2RlQ29udGV4dDo6SXNJ
bnB1dCk7CisgICAgICAgICAgICBpZiAoZWxlbWVudC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6Omlu
cHV0VGFnKSkKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldEZsYWcoQWN0aXZlTm9kZUNvbnRl
eHQ6OklzU2luZ2xlTGluZSk7CisgICAgICAgICAgICBpZiAoRE9NU3VwcG9ydDo6aXNQYXNzd29y
ZEVsZW1lbnQoZWxlbWVudCkpCisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRGbGFnKEFjdGl2
ZU5vZGVDb250ZXh0OjpJc1Bhc3N3b3JkKTsKKworICAgICAgICAgICAgV1RGOjpTdHJpbmcgZWxl
bWVudFRleHQoRE9NU3VwcG9ydDo6aW5wdXRFbGVtZW50VGV4dChlbGVtZW50KSk7CisgICAgICAg
ICAgICBpZiAoIWVsZW1lbnRUZXh0LnN0cmlwV2hpdGVTcGFjZSgpLmlzRW1wdHkoKSkKKyAgICAg
ICAgICAgICAgICBjb250ZXh0LnNldFRleHQoZWxlbWVudFRleHQpOworICAgICAgICB9CisgICAg
fQorCisgICAgaWYgKG5vZGUtPmlzRm9jdXNhYmxlKCkpCisgICAgICAgIGNvbnRleHQuc2V0Rmxh
ZyhBY3RpdmVOb2RlQ29udGV4dDo6SXNGb2N1c2FibGUpOworCisgICAgcmV0dXJuIGNvbnRleHQ7
Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnVwZGF0ZUN1cnNvcigpCit7CisgICAgaW50IGJ1
dHRvbk1hc2sgPSAwOworICAgIGlmIChtX2xhc3RNb3VzZUV2ZW50LmJ1dHRvbigpID09IExlZnRC
dXR0b24pCisgICAgICAgIGJ1dHRvbk1hc2sgPSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6U2NyZWVu
TGVmdE1vdXNlQnV0dG9uOworICAgIGVsc2UgaWYgKG1fbGFzdE1vdXNlRXZlbnQuYnV0dG9uKCkg
PT0gTWlkZGxlQnV0dG9uKQorICAgICAgICBidXR0b25NYXNrID0gUGxhdGZvcm06Ok1vdXNlRXZl
bnQ6OlNjcmVlbk1pZGRsZU1vdXNlQnV0dG9uOworICAgIGVsc2UgaWYgKG1fbGFzdE1vdXNlRXZl
bnQuYnV0dG9uKCkgPT0gUmlnaHRCdXR0b24pCisgICAgICAgIGJ1dHRvbk1hc2sgPSBQbGF0Zm9y
bTo6TW91c2VFdmVudDo6U2NyZWVuUmlnaHRNb3VzZUJ1dHRvbjsKKworICAgIFBsYXRmb3JtOjpN
b3VzZUV2ZW50IGV2ZW50KGJ1dHRvbk1hc2ssIGJ1dHRvbk1hc2ssIG1hcFRvVHJhbnNmb3JtZWQo
bV9sYXN0TW91c2VFdmVudC5wb3MoKSksIG1hcFRvVHJhbnNmb3JtZWQobV9sYXN0TW91c2VFdmVu
dC5nbG9iYWxQb3MoKSksIDAsIDApOworICAgIG1fd2ViUGFnZS0+bW91c2VFdmVudChldmVudCk7
Cit9CisKK0ludFNpemUgV2ViUGFnZVByaXZhdGU6OmZpeGVkTGF5b3V0U2l6ZShib29sIHNuYXBU
b0luY3JlbWVudCkgY29uc3QKK3sKKyAgICBpZiAoaGFzVmlydHVhbFZpZXdwb3J0KCkpCisgICAg
ICAgIHJldHVybiBJbnRTaXplKG1fdmlydHVhbFZpZXdwb3J0V2lkdGgsIG1fdmlydHVhbFZpZXdw
b3J0SGVpZ2h0KTsKKworICAgIGNvbnN0IGludCBkZWZhdWx0TGF5b3V0V2lkdGggPSBtX2RlZmF1
bHRMYXlvdXRTaXplLndpZHRoKCk7CisgICAgY29uc3QgaW50IGRlZmF1bHRMYXlvdXRIZWlnaHQg
PSBtX2RlZmF1bHRMYXlvdXRTaXplLmhlaWdodCgpOworCisgICAgaW50IG1pbldpZHRoID0gZGVm
YXVsdExheW91dFdpZHRoOworICAgIGludCBtYXhXaWR0aCA9IGRlZmF1bHRNYXhMYXlvdXRTaXpl
KCkud2lkdGgoKTsKKyAgICBpbnQgbWF4SGVpZ2h0ID0gZGVmYXVsdE1heExheW91dFNpemUoKS5o
ZWlnaHQoKTsKKworICAgIC8vIElmIHRoZSBsb2FkIHN0YXRlIGlzIG5vbmUgdGhlbiB3ZSBoYXZl
bid0IGFjdHVhbGx5IGdvdCBhbnl0aGluZyB5ZXQsIGJ1dCB3ZSBuZWVkIHRvIGxheW91dAorICAg
IC8vIHRoZSBlbnRpcmUgcGFnZSBzbyB0aGF0IHRoZSB1c2VyIHNlZXMgdGhlIGVudGlyZSBwYWdl
ICh1bnJlbmRlcmVkKSBpbnN0ZWFkIG9mIGp1c3QgcGFydCBvZiBpdC4KKyAgICBpZiAobV9sb2Fk
U3RhdGUgPT0gTm9uZSkKKyAgICAgICAgcmV0dXJuIEludFNpemUoZGVmYXVsdExheW91dFdpZHRo
LCBkZWZhdWx0TGF5b3V0SGVpZ2h0KTsKKworICAgIGlmIChtX3ZpZXdNb2RlID09IEZpeGVkRGVz
a3RvcCkgeworICAgICAgICBpbnQgd2lkdGggID0gbWF4V2lkdGg7CisgICAgICAgIC8vIGlmIHRo
ZSBkZWZhdWx0TGF5b3V0SGVpZ2h0IGlzIGF0IG1pbmltdW0sIGl0IHByb2JhYmx5IHdhcyBzZXQg
YXMgMAorICAgICAgICAvLyBhbmQgY2xhbXBlZCwgbWVhbmluZyBpdCdzIGVmZmVjdGl2ZWx5IG5v
dCBzZXQuICAoRXZlbiBpZiBpdCBoYXBwZW5lZAorICAgICAgICAvLyB0byBiZSBzZXQgZXhhY3Rs
eSB0byB0aGUgbWluaW11bSwgaXQncyB0b28gc21hbGwgdG8gYmUgdXNlZnVsLikgIFNvCisgICAg
ICAgIC8vIGlnbm9yZSBpdC4KKyAgICAgICAgaW50IGhlaWdodDsKKyAgICAgICAgaWYgKGRlZmF1
bHRMYXlvdXRIZWlnaHQgPD0gbWluaW11bUxheW91dFNpemUuaGVpZ2h0KCkpCisgICAgICAgICAg
ICBoZWlnaHQgPSBtYXhIZWlnaHQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGhlaWdodCA9
IGNlaWxmKHN0YXRpY19jYXN0PGZsb2F0Pih3aWR0aCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oZGVm
YXVsdExheW91dFdpZHRoKSAqIHN0YXRpY19jYXN0PGZsb2F0PihkZWZhdWx0TGF5b3V0SGVpZ2h0
KSk7CisgICAgICAgIHJldHVybiBJbnRTaXplKHdpZHRoLCBoZWlnaHQpOworICAgIH0KKworICAg
IGlmIChtX3ZpZXdNb2RlID09IERlc2t0b3ApIHsKKyAgICAgICAgLy8gSWYgd2UgZGV0ZWN0IGFu
IG92ZXJmbG93IGxhcmdlciB0aGFuIHRoZSBjb250ZW50cyBzaXplIHRoZW4gdXNlIHRoYXQgaW5z
dGVhZCBzaW5jZQorICAgICAgICAvLyBpdCdsbCBzdGlsbCBiZSBjbGFtcGVkIGJ5IHRoZSBtYXhX
aWR0aCBiZWxvdy4uLgorICAgICAgICBpbnQgd2lkdGggPSBzdGQ6Om1heChhYnNvbHV0ZVZpc2li
bGVPdmVyZmxvd1NpemUoKS53aWR0aCgpLCBjb250ZW50c1NpemUoKS53aWR0aCgpKTsKKworICAg
ICAgICBpZiAoc25hcFRvSW5jcmVtZW50KSB7CisgICAgICAgICAgICAvLyBTbmFwIHRvIGluY3Jl
bWVudHMgb2YgZGVmYXVsdExheW91dFdpZHRoIC8gMi4wLgorICAgICAgICAgICAgZmxvYXQgZmFj
dG9yID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHdpZHRoKSAvIChkZWZhdWx0TGF5b3V0V2lkdGggLyAy
LjApOworICAgICAgICAgICAgZmFjdG9yID0gY2VpbGYoZmFjdG9yKTsKKyAgICAgICAgICAgIHdp
ZHRoID0gKGRlZmF1bHRMYXlvdXRXaWR0aCAvIDIuMCkgKiBmYWN0b3I7CisgICAgICAgIH0KKwor
ICAgICAgICBpZiAod2lkdGggPCBtaW5XaWR0aCkKKyAgICAgICAgICAgIHdpZHRoID0gbWluV2lk
dGg7CisgICAgICAgIGlmICh3aWR0aCA+IG1heFdpZHRoKQorICAgICAgICAgICAgd2lkdGggPSBt
YXhXaWR0aDsKKyAgICAgICAgaW50IGhlaWdodCA9IGNlaWxmKHN0YXRpY19jYXN0PGZsb2F0Pih3
aWR0aCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oZGVmYXVsdExheW91dFdpZHRoKSAqIHN0YXRpY19j
YXN0PGZsb2F0PihkZWZhdWx0TGF5b3V0SGVpZ2h0KSk7CisgICAgICAgIHJldHVybiBJbnRTaXpl
KHdpZHRoLCBoZWlnaHQpOworICAgIH0KKworICAgIGlmIChtX3dlYlNldHRpbmdzLT5pc1pvb21U
b0ZpdE9uTG9hZCgpKSB7CisgICAgICAgIC8vIFdlIG5lZWQgdG8gY2xhbXAgdGhlIGxheW91dCB3
aWR0aCB0byB0aGUgbWluaW11bSBvZiB0aGUgbGF5b3V0CisgICAgICAgIC8vIHdpZHRoIG9yIHRo
ZSBjb250ZW50IHdpZHRoLiBUaGlzIGlzIGltcG9ydGFudCB1bmRlciByb3RhdGlvbiBmb3IgbW9i
aWxlCisgICAgICAgIC8vIHdlYnNpdGVzLiBXZSB3YW50IHRoZSBwYWdlIHRvIHJlbWFpbiBsYXlv
dXRlZCBhdCB0aGUgc2FtZSB3aWR0aCB3aGljaAorICAgICAgICAvLyBpdCB3YXMgbG9hZGVkIHdp
dGgsIGFuZCBpbnN0ZWFkIGNoYW5nZSB0aGUgem9vbSBsZXZlbCB0byBmaXQgdG8gc2NyZWVuLgor
ICAgICAgICAvLyBUaGUgaGVpZ2h0IGlzIHdlbGNvbWUgdG8gYWRhcHQgdG8gdGhlIGhlaWdodCB1
c2VkIGluIHRoZSBuZXcgb3JpZW50YXRpb24sCisgICAgICAgIC8vIG90aGVyd2lzZSB3ZSB3aWxs
IGdldCBhIGdyZXkgYmFyIGJlbG93IHRoZSB3ZWIgcGFnZS4KKyAgICAgICAgaWYgKG1fbWFpbkZy
YW1lLT52aWV3KCkgJiYgIWNvbnRlbnRzU2l6ZSgpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIG1p
bldpZHRoID0gY29udGVudHNTaXplKCkud2lkdGgoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAg
ICAgICAvLyBJZiB0aGVyZSBpcyBubyBjb250ZW50cyB3aWR0aCwgdXNlIHRoZSBtaW5pbXVtIG9m
IHNjcmVlbiB3aWR0aAorICAgICAgICAgICAgLy8gYW5kIGxheW91dCB3aWR0aCB0byBzaGFwZSB0
aGUgZmlyc3QgbGF5b3V0IHRvIGEgY29udGVudHMgd2lkdGgKKyAgICAgICAgICAgIC8vIHRoYXQg
d2UgY291bGQgcmVhc29uYWJseSB6b29tIHRvIGZpdCwgaW4gYSBtYW5uZXIgdGhhdCB0YWtlcwor
ICAgICAgICAgICAgLy8gb3JpZW50YXRpb24gaW50byBhY2NvdW50IGFuZCBzdGlsbCByZXNwZWN0
cyBhIHNtYWxsIGRlZmF1bHQKKyAgICAgICAgICAgIC8vIGxheW91dCB3aWR0aC4KKyNpZiBFTkFC
TEUoT1JJRU5UQVRJT05fRVZFTlRTKQorICAgICAgICAgICAgbWluV2lkdGggPSBtX21haW5GcmFt
ZS0+b3JpZW50YXRpb24oKSAlIDE4MAorICAgICAgICAgICAgICAgID8gUGxhdGZvcm06OkdyYXBo
aWNzOjpTY3JlZW46OmhlaWdodCgpCisgICAgICAgICAgICAgICAgOiBQbGF0Zm9ybTo6R3JhcGhp
Y3M6OlNjcmVlbjo6d2lkdGgoKTsKKyNlbHNlCisgICAgICAgICAgICBtaW5XaWR0aCA9IFBsYXRm
b3JtOjpHcmFwaGljczo6U2NyZWVuOjp3aWR0aCgpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9
CisKKyAgICByZXR1cm4gSW50U2l6ZShzdGQ6Om1pbihtaW5XaWR0aCwgZGVmYXVsdExheW91dFdp
ZHRoKSwgZGVmYXVsdExheW91dEhlaWdodCk7Cit9CisKK0JhY2tpbmdTdG9yZUNsaWVudCogV2Vi
UGFnZVByaXZhdGU6OmJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKGNvbnN0IEZyYW1lKiBmcmFt
ZSkgY29uc3QKK3sKKyAgICBBU1NFUlQoZnJhbWUpOworICAgIEJhY2tpbmdTdG9yZUNsaWVudCog
YmFja2luZ1N0b3JlQ2xpZW50ID0gMDsKKyAgICBpZiAobV9iYWNraW5nU3RvcmVDbGllbnRGb3JG
cmFtZU1hcC5jb250YWlucyhmcmFtZSkpCisgICAgICAgIGJhY2tpbmdTdG9yZUNsaWVudCA9IG1f
YmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWVNYXAuZ2V0KGZyYW1lKTsKKyAgICByZXR1cm4gYmFj
a2luZ1N0b3JlQ2xpZW50OworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjphZGRCYWNraW5nU3Rv
cmVDbGllbnRGb3JGcmFtZShjb25zdCBGcmFtZSogZnJhbWUsIEJhY2tpbmdTdG9yZUNsaWVudCog
Y2xpZW50KQoreworICAgIEFTU0VSVChmcmFtZSk7CisgICAgQVNTRVJUKGNsaWVudCk7CisgICAg
bV9iYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZU1hcC5hZGQoZnJhbWUsIGNsaWVudCk7Cit9CisK
K3ZvaWQgV2ViUGFnZVByaXZhdGU6OnJlbW92ZUJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKGNv
bnN0IEZyYW1lKiBmcmFtZSkKK3sKKyAgICBBU1NFUlQoZnJhbWUpOworICAgIGlmIChtX2JhY2tp
bmdTdG9yZUNsaWVudEZvckZyYW1lTWFwLmNvbnRhaW5zKGZyYW1lKSkKKyAgICAgICAgbV9iYWNr
aW5nU3RvcmVDbGllbnRGb3JGcmFtZU1hcC5yZW1vdmUoZnJhbWUpOworfQorCisKK3ZvaWQgV2Vi
UGFnZVByaXZhdGU6OmNsZWFyRG9jdW1lbnREYXRhKGNvbnN0IERvY3VtZW50KiBkb2N1bWVudEdv
aW5nQXdheSkKK3sKKyAgICBBU1NFUlQoZG9jdW1lbnRHb2luZ0F3YXkpOworICAgIGlmIChtX2N1
cnJlbnRDb250ZXh0Tm9kZSAmJiBtX2N1cnJlbnRDb250ZXh0Tm9kZS0+ZG9jdW1lbnQoKSA9PSBk
b2N1bWVudEdvaW5nQXdheSkKKyAgICAgICAgbV9jdXJyZW50Q29udGV4dE5vZGUgPSAwOworCisg
ICAgaWYgKG1fY3VycmVudFBpbmNoWm9vbU5vZGUgJiYgbV9jdXJyZW50UGluY2hab29tTm9kZS0+
ZG9jdW1lbnQoKSA9PSBkb2N1bWVudEdvaW5nQXdheSkKKyAgICAgICAgbV9jdXJyZW50UGluY2ha
b29tTm9kZSA9IDA7CisKKyAgICBpZiAobV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlICYm
IG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZS0+ZG9jdW1lbnQoKSA9PSBkb2N1bWVudEdv
aW5nQXdheSkKKyAgICAgICAgbV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlID0gMDsKKwor
ICAgIGlmIChtX2luUmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2RlICYmIG1faW5SZWdpb25TY3JvbGxT
dGFydGluZ05vZGUtPmRvY3VtZW50KCkgPT0gZG9jdW1lbnRHb2luZ0F3YXkpCisgICAgICAgIG1f
aW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGUgPSAwOworCisgICAgTm9kZSogbm9kZVVuZGVyRmF0
RmluZ2VyID0gbV90b3VjaEV2ZW50SGFuZGxlci0+bGFzdEZhdEZpbmdlcnNSZXN1bHQoKS52YWxp
ZE5vZGUoKTsKKyAgICBpZiAobm9kZVVuZGVyRmF0RmluZ2VyICYmIG5vZGVVbmRlckZhdEZpbmdl
ci0+ZG9jdW1lbnQoKSA9PSBkb2N1bWVudEdvaW5nQXdheSkKKyAgICAgICAgbV90b3VjaEV2ZW50
SGFuZGxlci0+cmVzZXRMYXN0RmF0RmluZ2Vyc1Jlc3VsdCgpOworCisgICAgLy8gTk9URTogbV9m
dWxsc2NyZWVuVmlkZW9Ob2RlLCBtX2Z1bGxTY3JlZW5QbHVnaW5WaWV3IGFuZCBtX3BsdWdpblZp
ZXdzCisgICAgLy8gYXJlIGNsZWFyZWQgaW4gb3RoZXIgbWV0aG9kcyBhbHJlYWR5LgorfQorCit0
eXBlZGVmIGJvb2wgKCpQcmVkaWNhdGVGdW5jdGlvbikoUmVuZGVyTGF5ZXIqKTsKK3N0YXRpYyBi
b29sIGlzUG9zaXRpb25lZENvbnRhaW5lcihSZW5kZXJMYXllciogbGF5ZXIpCit7CisgICAgUmVu
ZGVyT2JqZWN0KiBvID0gbGF5ZXItPnJlbmRlcmVyKCk7CisgICAgcmV0dXJuIG8tPmlzUmVuZGVy
VmlldygpIHx8IG8tPmlzUG9zaXRpb25lZCgpIHx8IG8tPmlzUmVsUG9zaXRpb25lZCgpIHx8IGxh
eWVyLT5oYXNUcmFuc2Zvcm0oKTsKK30KKworc3RhdGljIGJvb2wgaXNOb25SZW5kZXJWaWV3Rml4
ZWRQb3NpdGlvbmVkQ29udGFpbmVyKFJlbmRlckxheWVyKiBsYXllcikKK3sKKyAgICBSZW5kZXJP
YmplY3QqIG8gPSBsYXllci0+cmVuZGVyZXIoKTsKKyAgICBpZiAoby0+aXNSZW5kZXJWaWV3KCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBvLT5pc1Bvc2l0aW9uZWQoKSAm
JiBvLT5zdHlsZSgpLT5wb3NpdGlvbigpID09IEZpeGVkUG9zaXRpb247Cit9CisKK3N0YXRpYyBi
b29sIGlzRml4ZWRQb3NpdGlvbmVkQ29udGFpbmVyKFJlbmRlckxheWVyKiBsYXllcikKK3sKKyAg
ICBSZW5kZXJPYmplY3QqIG8gPSBsYXllci0+cmVuZGVyZXIoKTsKKyAgICByZXR1cm4gby0+aXNS
ZW5kZXJWaWV3KCkgfHwgKG8tPmlzUG9zaXRpb25lZCgpICYmIG8tPnN0eWxlKCktPnBvc2l0aW9u
KCkgPT0gRml4ZWRQb3NpdGlvbik7Cit9CisKK3N0YXRpYyBSZW5kZXJMYXllciogZmluZEFuY2Vz
dG9yT3JTZWxmTm90TWF0Y2hpbmcoUHJlZGljYXRlRnVuY3Rpb24gcHJlZGljYXRlLCBSZW5kZXJM
YXllciogbGF5ZXIpCit7CisgICAgUmVuZGVyTGF5ZXIqIGN1cnIgPSBsYXllcjsKKyAgICB3aGls
ZSAoY3VyciAmJiAhcHJlZGljYXRlKGN1cnIpKQorICAgICAgICBjdXJyID0gY3Vyci0+cGFyZW50
KCk7CisKKyAgICByZXR1cm4gY3VycjsKK30KKworUmVuZGVyTGF5ZXIqIFdlYlBhZ2VQcml2YXRl
OjplbmNsb3NpbmdGaXhlZFBvc2l0aW9uZWRBbmNlc3Rvck9yU2VsZklmRml4ZWRQb3NpdGlvbmVk
KFJlbmRlckxheWVyKiBsYXllcikKK3sKKyAgICByZXR1cm4gZmluZEFuY2VzdG9yT3JTZWxmTm90
TWF0Y2hpbmcoJmlzRml4ZWRQb3NpdGlvbmVkQ29udGFpbmVyLCBsYXllcik7Cit9CisKK1JlbmRl
ckxheWVyKiBXZWJQYWdlUHJpdmF0ZTo6ZW5jbG9zaW5nUG9zaXRpb25lZEFuY2VzdG9yT3JTZWxm
SWZQb3NpdGlvbmVkKFJlbmRlckxheWVyKiBsYXllcikKK3sKKyAgICByZXR1cm4gZmluZEFuY2Vz
dG9yT3JTZWxmTm90TWF0Y2hpbmcoJmlzUG9zaXRpb25lZENvbnRhaW5lciwgbGF5ZXIpOworfQor
CitzdGF0aWMgaW5saW5lIEZyYW1lKiBmcmFtZUZvck5vZGUoTm9kZSogbm9kZSkKK3sKKyAgICBO
b2RlKiBvcmlnTm9kZSA9IG5vZGU7CisgICAgZm9yICg7IG5vZGU7IG5vZGUgPSBub2RlLT5wYXJl
bnROb2RlKCkpIHsKKyAgICAgICAgaWYgKFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBub2RlLT5y
ZW5kZXJlcigpKSB7CisgICAgICAgICAgICBpZiAocmVuZGVyZXItPmlzUmVuZGVyVmlldygpKSB7
CisgICAgICAgICAgICAgICAgaWYgKEZyYW1lVmlldyogdmlldyA9IHRvUmVuZGVyVmlldyhyZW5k
ZXJlciktPmZyYW1lVmlldygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChGcmFtZSogZnJh
bWUgPSB2aWV3LT5mcmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1l
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZW5k
ZXJlci0+aXNXaWRnZXQoKSkgeworICAgICAgICAgICAgICAgIFdpZGdldCogd2lkZ2V0ID0gdG9S
ZW5kZXJXaWRnZXQocmVuZGVyZXIpLT53aWRnZXQoKTsKKyAgICAgICAgICAgICAgICBpZiAod2lk
Z2V0ICYmIHdpZGdldC0+aXNGcmFtZVZpZXcoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAo
RnJhbWUqIGZyYW1lID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4od2lkZ2V0KS0+ZnJhbWUoKSkK
KyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKG5vZGUgPSBvcmln
Tm9kZTsgbm9kZTsgbm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKSkgeworICAgICAgICBpZiAoRG9j
dW1lbnQqIGRvYyA9IG5vZGUtPmRvY3VtZW50KCkpIHsKKyAgICAgICAgICAgIGlmIChGcmFtZSog
ZnJhbWUgPSBkb2MtPmZyYW1lKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lOworICAg
ICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBJbnRSZWN0IGdldE5v
ZGVXaW5kb3dSZWN0KE5vZGUqIG5vZGUpCit7CisgICAgaWYgKEZyYW1lKiBmcmFtZSA9IGZyYW1l
Rm9yTm9kZShub2RlKSkgeworICAgICAgICBpZiAoRnJhbWVWaWV3KiB2aWV3ID0gZnJhbWUtPnZp
ZXcoKSkKKyAgICAgICAgICAgIHJldHVybiB2aWV3LT5jb250ZW50c1RvV2luZG93KG5vZGUtPmdl
dFJlY3QoKSk7CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBJ
bnRSZWN0KCk7Cit9CisKK0ludFJlY3QgV2ViUGFnZVByaXZhdGU6OmdldFJlY3Vyc2l2ZVZpc2li
bGVXaW5kb3dSZWN0KFNjcm9sbFZpZXcqIHZpZXcsIGJvb2wgbm9DbGlwT2ZNYWluRnJhbWUpCit7
CisgICAgQVNTRVJUKG1fbWFpbkZyYW1lKTsKKworICAgIC8vIERvbid0IGNhbGwgdGhpcyBmdW5j
dGlvbiBhc2tpbmcgdG8gbm90IGNsaXAgdGhlIG1haW4gZnJhbWUgcHJvdmlkaW5nIG9ubHkKKyAg
ICAvLyB0aGUgbWFpbiBmcmFtZS4gQWxsIHRoYXQgY2FuIGJlIHJldHVybmVkIGlzIHRoZSBjb250
ZW50IHJlY3Qgd2hpY2gKKyAgICAvLyBpc24ndCB3aGF0IHRoaXMgZnVuY3Rpb24gaXMgZm9yLgor
ICAgIGlmIChub0NsaXBPZk1haW5GcmFtZSAmJiB2aWV3ID09IG1fbWFpbkZyYW1lLT52aWV3KCkp
IHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBJbnRSZWN0
KEludFBvaW50KDAsIDApLCB2aWV3LT5jb250ZW50c1NpemUoKSk7CisgICAgfQorCisgICAgSW50
UmVjdCB2aXNpYmxlV2luZG93UmVjdCh2aWV3LT5jb250ZW50c1RvV2luZG93KHZpZXctPnZpc2li
bGVDb250ZW50UmVjdChmYWxzZSkpKTsKKyAgICBpZiAodmlldy0+cGFyZW50KCkgJiYgIShub0Ns
aXBPZk1haW5GcmFtZSAmJiB2aWV3LT5wYXJlbnQoKSA9PSBtX21haW5GcmFtZS0+dmlldygpKSkg
eworICAgICAgICAvLyBJbnRlcnNlY3Qgd2l0aCBwYXJlbnQgdmlzaWJsZSByZWN0LgorICAgICAg
ICB2aXNpYmxlV2luZG93UmVjdC5pbnRlcnNlY3QoZ2V0UmVjdXJzaXZlVmlzaWJsZVdpbmRvd1Jl
Y3Qodmlldy0+cGFyZW50KCksIG5vQ2xpcE9mTWFpbkZyYW1lKSk7CisgICAgfQorICAgIHJldHVy
biB2aXNpYmxlV2luZG93UmVjdDsKK30KKworY2xhc3MgQ29tcGxpY2F0ZWREaXN0YW5jZSB7Citw
dWJsaWM6CisKKyAgICBlbnVtIERpc3RhbmNlVHlwZSB7CisgICAgICAgIERpc3RhbmNlTm9uZSwK
KyAgICAgICAgRGlzdGFuY2VBcGFydCwKKyAgICAgICAgRGlzdGFuY2VJbnRlcnNlY3RlZCwKKyAg
ICAgICAgRGlzdGFuY2VPdmVybGFwcGVkLAorICAgIH07CisKKyAgICBEaXN0YW5jZVR5cGUgbV90
eXBlOworICAgIGludCBtX2Rpc3Q7CisKKyAgICBDb21wbGljYXRlZERpc3RhbmNlKCkgOiBtX3R5
cGUoRGlzdGFuY2VOb25lKSwgbV9kaXN0KDApIHsgfQorCisgICAgdm9pZCBjYWxjRGlzdGFuY2Uo
aW50IGJhc2VTdGFydCwgaW50IGJhc2VFbmQsIGludCB0YXJnZXRTdGFydCwgaW50IHRhcmdldEVu
ZCkKKyAgICB7CisgICAgICAgIG1fZGlzdCA9IHRhcmdldEVuZCA8PSBiYXNlU3RhcnQgPyB0YXJn
ZXRFbmQgLSBiYXNlU3RhcnQgLSAxCisgICAgICAgICAgICA6IHRhcmdldFN0YXJ0ID49IGJhc2VF
bmQgPyB0YXJnZXRTdGFydCAtIGJhc2VFbmQgKyAxCisgICAgICAgICAgICA6IDA7CisgICAgICAg
IGlmIChtX2Rpc3QpIHsKKyAgICAgICAgICAgIG1fdHlwZSA9IERpc3RhbmNlQXBhcnQ7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtX2Rpc3QgPSB0YXJnZXRTdGFy
dCA9PSBiYXNlU3RhcnQKKyAgICAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICAgICA6IHRh
cmdldFN0YXJ0IDwgYmFzZVN0YXJ0CisgICAgICAgICAgICAgICAgPyB0YXJnZXRFbmQgPj0gYmFz
ZUVuZCA/IDAgOiBiYXNlU3RhcnQgLSB0YXJnZXRFbmQKKyAgICAgICAgICAgICAgICA6IHRhcmdl
dEVuZCA8PSBiYXNlRW5kID8gMCA6IGJhc2VFbmQgLSB0YXJnZXRTdGFydDsKKyAgICAgICAgaWYg
KG1fZGlzdCkgeworICAgICAgICAgICAgbV90eXBlID0gRGlzdGFuY2VJbnRlcnNlY3RlZDsKKyAg
ICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1fZGlzdCA9IHRhcmdldFN0
YXJ0IC0gYmFzZVN0YXJ0ICsgdGFyZ2V0RW5kIC0gYmFzZUVuZDsKKyAgICAgICAgbV90eXBlID0g
RGlzdGFuY2VPdmVybGFwcGVkOworICAgIH0KKworICAgIGJvb2wgaXNQb3NpdGl2ZSgpIGNvbnN0
IHsgcmV0dXJuIG1fZGlzdCA+PSAwOyB9CisgICAgYm9vbCBpc05lZ2F0aXZlKCkgY29uc3QgeyBy
ZXR1cm4gbV9kaXN0IDw9IDA7IH0KKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IENvbXBsaWNh
dGVkRGlzdGFuY2UmIG8pIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV90eXBlICE9IG8u
bV90eXBlCisgICAgICAgICAgICA/IG1fdHlwZSA+IG8ubV90eXBlCisgICAgICAgICAgICA6IG1f
dHlwZSA9PSBEaXN0YW5jZUludGVyc2VjdGVkCisgICAgICAgICAgICA/IGFicyhtX2Rpc3QpID4g
YWJzKG8ubV9kaXN0KQorICAgICAgICAgICAgOiBhYnMobV9kaXN0KSA8IGFicyhvLm1fZGlzdCk7
CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb21wbGljYXRlZERpc3RhbmNlJiBv
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fdHlwZSA9PSBvLm1fdHlwZSAmJiBtX2Rp
c3QgPT0gby5tX2Rpc3Q7CisgICAgfQorfTsKKworc3RhdGljIGlubGluZSBib29sIGNoZWNrRGly
ZWN0aW9uKFBsYXRmb3JtOjpTY3JvbGxEaXJlY3Rpb24gZGlyLCBjb25zdCBDb21wbGljYXRlZERp
c3RhbmNlJiBkZWx0YSwgUGxhdGZvcm06OlNjcm9sbERpcmVjdGlvbiBuZWdEaXIsIFBsYXRmb3Jt
OjpTY3JvbGxEaXJlY3Rpb24gcG9zRGlyKQoreworICAgIHJldHVybiBkaXIgPT0gbmVnRGlyID8g
ZGVsdGEuaXNOZWdhdGl2ZSgpIDogZGlyID09IHBvc0RpciA/IGRlbHRhLmlzUG9zaXRpdmUoKSA6
IGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYXJlTm9kZXNQZXJwZW5kaWN1bGFybHlO
YXZpZ2F0YWJsZShQbGF0Zm9ybTo6U2Nyb2xsRGlyZWN0aW9uIGRpciwgY29uc3QgSW50UmVjdCYg
YmFzZVJlY3QsIGNvbnN0IEludFJlY3QmIHRhcmdldFJlY3QpCit7CisgICAgQ29tcGxpY2F0ZWRE
aXN0YW5jZSBkaXN0WCwgZGlzdFk7CisgICAgZGlzdFguY2FsY0Rpc3RhbmNlKGJhc2VSZWN0Lngo
KSwgYmFzZVJlY3QubWF4WCgpLCB0YXJnZXRSZWN0LngoKSwgdGFyZ2V0UmVjdC5tYXhYKCkpOwor
ICAgIGRpc3RZLmNhbGNEaXN0YW5jZShiYXNlUmVjdC55KCksIGJhc2VSZWN0Lm1heFkoKSwgdGFy
Z2V0UmVjdC55KCksIHRhcmdldFJlY3QubWF4WSgpKTsKKworICAgIHJldHVybiBkaXN0WSA8IGRp
c3RYID8gZGlyID09IFBsYXRmb3JtOjpTY3JvbGxVcCB8fCBkaXIgPT0gUGxhdGZvcm06OlNjcm9s
bERvd24KKyAgICAgICAgOiBkaXIgPT0gUGxhdGZvcm06OlNjcm9sbExlZnQgfHwgZGlyID09IFBs
YXRmb3JtOjpTY3JvbGxSaWdodDsKK30KKworc3RydWN0IE5vZGVEaXN0YW5jZSB7CisgICAgQ29t
cGxpY2F0ZWREaXN0YW5jZSBtX2Rpc3Q7CisgICAgQ29tcGxpY2F0ZWREaXN0YW5jZSBtX3BlcnBl
bmRpY3VsYXJEaXN0OworICAgIEludFJlY3QgbV9yZWN0OworCisgICAgYm9vbCBpc0Nsb3Nlcihj
b25zdCBOb2RlRGlzdGFuY2UmIG8sIFBsYXRmb3JtOjpTY3JvbGxEaXJlY3Rpb24gZGlyKSBjb25z
dAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fZGlzdC5tX3R5cGUgPT0gby5tX2Rpc3QubV90eXBl
CisgICAgICAgICAgICA/IChtX2Rpc3QgPT0gby5tX2Rpc3QgPyBtX3BlcnBlbmRpY3VsYXJEaXN0
IDwgby5tX3BlcnBlbmRpY3VsYXJEaXN0CisgICAgICAgICAgICAgICAgOiBtX2Rpc3QgPCBvLm1f
ZGlzdCA/IG1fcGVycGVuZGljdWxhckRpc3QubV90eXBlID49IG8ubV9wZXJwZW5kaWN1bGFyRGlz
dC5tX3R5cGUKKyAgICAgICAgICAgICAgICB8fCAhYXJlTm9kZXNQZXJwZW5kaWN1bGFybHlOYXZp
Z2F0YWJsZShkaXIsIG8ubV9yZWN0LCBtX3JlY3QpCisgICAgICAgICAgICAgICAgOiBtX3BlcnBl
bmRpY3VsYXJEaXN0Lm1fdHlwZSA+IG8ubV9wZXJwZW5kaWN1bGFyRGlzdC5tX3R5cGUKKyAgICAg
ICAgICAgICAgICAmJiBhcmVOb2Rlc1BlcnBlbmRpY3VsYXJseU5hdmlnYXRhYmxlKGRpciwgbV9y
ZWN0LCBvLm1fcmVjdCkpCisgICAgICAgICAgICA6IG1fZGlzdC5tX3R5cGUgPiBvLm1fZGlzdC5t
X3R5cGU7CisgICAgfQorfTsKKworc3RhdGljIGlubGluZSBib29sIHRlbGxEaXN0YW5jZShQbGF0
Zm9ybTo6U2Nyb2xsRGlyZWN0aW9uIGRpciwgY29uc3QgSW50UmVjdCYgYmFzZVJlY3QsIE5vZGVE
aXN0YW5jZSYgbm9kZURpc3QpCit7CisgICAgQ29tcGxpY2F0ZWREaXN0YW5jZSBkaXN0WCwgZGlz
dFk7CisgICAgZGlzdFguY2FsY0Rpc3RhbmNlKGJhc2VSZWN0LngoKSwgYmFzZVJlY3QubWF4WCgp
LCBub2RlRGlzdC5tX3JlY3QueCgpLCBub2RlRGlzdC5tX3JlY3QubWF4WCgpKTsKKyAgICBkaXN0
WS5jYWxjRGlzdGFuY2UoYmFzZVJlY3QueSgpLCBiYXNlUmVjdC5tYXhZKCksIG5vZGVEaXN0Lm1f
cmVjdC55KCksIG5vZGVEaXN0Lm1fcmVjdC5tYXhZKCkpOworCisgICAgYm9vbCBob3Jpem9udGFs
ID0gZGlzdFkgPCBkaXN0WDsKKyAgICBpZiAoaG9yaXpvbnRhbCA/IGNoZWNrRGlyZWN0aW9uKGRp
ciwgZGlzdFgsIFBsYXRmb3JtOjpTY3JvbGxMZWZ0LCBQbGF0Zm9ybTo6U2Nyb2xsUmlnaHQpIDog
Y2hlY2tEaXJlY3Rpb24oZGlyLCBkaXN0WSwgUGxhdGZvcm06OlNjcm9sbFVwLCBQbGF0Zm9ybTo6
U2Nyb2xsRG93bikpIHsKKyAgICAgICAgbm9kZURpc3QubV9kaXN0ID0gaG9yaXpvbnRhbCA/IGRp
c3RYIDogZGlzdFk7CisgICAgICAgIG5vZGVEaXN0Lm1fcGVycGVuZGljdWxhckRpc3QgPSBob3Jp
em9udGFsID8gZGlzdFkgOiBkaXN0WDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAg
IHJldHVybiBmYWxzZTsKK30KKwordm9pZCBXZWJQYWdlOjphc3NpZ25Gb2N1cyhQbGF0Zm9ybTo6
Rm9jdXNEaXJlY3Rpb24gZGlyZWN0aW9uKQoreworICAgIGQtPmFzc2lnbkZvY3VzKGRpcmVjdGlv
bik7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmFzc2lnbkZvY3VzKFBsYXRmb3JtOjpGb2N1
c0RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisgICAgQVNTRVJUKChpbnQpIFBsYXRmb3JtOjpGb2N1
c0RpcmVjdGlvbk5vbmUgPT0gKGludCkgRm9jdXNEaXJlY3Rpb25Ob25lKTsKKyAgICBBU1NFUlQo
KGludCkgUGxhdGZvcm06OkZvY3VzRGlyZWN0aW9uRm9yd2FyZCA9PSAoaW50KSBGb2N1c0RpcmVj
dGlvbkZvcndhcmQpOworICAgIEFTU0VSVCgoaW50KSBQbGF0Zm9ybTo6Rm9jdXNEaXJlY3Rpb25C
YWNrd2FyZCA9PSAoaW50KSBGb2N1c0RpcmVjdGlvbkJhY2t3YXJkKTsKKworICAgIC8vIEZpcnN0
IHdlIGNsZWFyIHRoZSBmb2N1cywgc2luY2Ugd2Ugd2FudCB0byBmb2N1cyBlaXRoZXIgaW5pdGlh
bCBvciB0aGUgbGFzdAorICAgIC8vIGZvY3VzYWJsZSBlbGVtZW50IGluIHRoZSB3ZWJwYWdlIChh
Y2NvcmRpbmcgdG8gdGhlIFRBQklOREVYKSwgb3Igc2ltcGx5IGNsZWFyCisgICAgLy8gdGhlIGZv
Y3VzLgorICAgIGNsZWFyRm9jdXNOb2RlKCk7CisKKyAgICBzd2l0Y2ggKGRpcmVjdGlvbikgewor
ICAgIGNhc2UgRm9jdXNEaXJlY3Rpb25Gb3J3YXJkOgorICAgIGNhc2UgRm9jdXNEaXJlY3Rpb25C
YWNrd2FyZDoKKyAgICAgICAgbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+c2V0SW5pdGlhbEZv
Y3VzKChGb2N1c0RpcmVjdGlvbikgZGlyZWN0aW9uLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBGb2N1c0RpcmVjdGlvbk5vbmU6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6Cisg
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KK30KKworYm9vbCBXZWJQYWdlUHJp
dmF0ZTo6bW92ZVRvTmV4dEZpZWxkKFBsYXRmb3JtOjpTY3JvbGxEaXJlY3Rpb24gZGlyLCBpbnQg
ZGVzaXJlZFNjcm9sbEFtb3VudCkKK3sKKyAgICBGcmFtZSogZnJhbWUgPSBmb2N1c2VkT3JNYWlu
RnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBy
ZXR1cm4gbW92ZVRvTmV4dEZpZWxkKGZyYW1lLCBkaXIsIGRlc2lyZWRTY3JvbGxBbW91bnQpOwor
fQorCitib29sIFdlYlBhZ2VQcml2YXRlOjptb3ZlVG9OZXh0RmllbGQoRnJhbWUqIGZyYW1lLCBQ
bGF0Zm9ybTo6U2Nyb2xsRGlyZWN0aW9uIGRpciwgaW50IGRlc2lyZWRTY3JvbGxBbW91bnQpCit7
CisgICAgRG9jdW1lbnQqIGRvYyA9IGZyYW1lLT5kb2N1bWVudCgpOworICAgIEZyYW1lVmlldyog
dmlldyA9IGZyYW1lLT52aWV3KCk7CisgICAgaWYgKCFkb2MgfHwgIXZpZXcgfHwgdmlldy0+bmVl
ZHNMYXlvdXQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhlIGxheW91dCBu
ZWVkcyB0byBiZSB1cC10by1kYXRlIHRvIGRldGVybWluZSBpZiBhIG5vZGUgaXMgZm9jdXNhYmxl
LgorICAgIGRvYy0+dXBkYXRlTGF5b3V0SWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzKCk7CisKKyAg
ICBOb2RlKiBvcmlnRm9jdXNlZE5vZGUgPSBkb2MtPmZvY3VzZWROb2RlKCk7CisKKyAgICBOb2Rl
KiBzdGFydE5vZGUgPSBtX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5maW5kRm9jdXNhYmxlTm9k
ZShGb2N1c0RpcmVjdGlvbkZvcndhcmQsIGRvYywgb3JpZ0ZvY3VzZWROb2RlLCAwKTsKKworICAg
IC8vIExhc3Qgbm9kZT8gZ2V0IGJhY2sgdG8gYmVnaW5uaW5nLgorICAgIGlmICghc3RhcnROb2Rl
ICYmIG9yaWdGb2N1c2VkTm9kZSkKKyAgICAgICAgc3RhcnROb2RlID0gbV9wYWdlLT5mb2N1c0Nv
bnRyb2xsZXIoKS0+ZmluZEZvY3VzYWJsZU5vZGUoRm9jdXNEaXJlY3Rpb25Gb3J3YXJkLCBkb2Ms
IDAsIDApOworCisgICAgaWYgKCFzdGFydE5vZGUgfHwgc3RhcnROb2RlID09IG9yaWdGb2N1c2Vk
Tm9kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgTm9kZSogb3JpZ1JhZGlvR3JvdXAg
PSBvcmlnRm9jdXNlZE5vZGUKKyAgICAgICAgJiYgKChvcmlnRm9jdXNlZE5vZGUtPmhhc1RhZ05h
bWUoSFRNTE5hbWVzOjppbnB1dFRhZykKKyAgICAgICAgJiYgc3RhdGljX2Nhc3Q8SFRNTElucHV0
RWxlbWVudCo+KG9yaWdGb2N1c2VkTm9kZSktPmlzUmFkaW9CdXR0b24oKSkpCisgICAgICAgID8g
b3JpZ0ZvY3VzZWROb2RlLT5wYXJlbnROb2RlKCkgOiAwOworCisgICAgSW50UmVjdCB2aXNpYmxl
UmVjdCA9IEludFJlY3QoSW50UG9pbnQoKSwgYWN0dWFsVmlzaWJsZVNpemUoKSk7CisgICAgLy8g
Q29uc3RyYWluIHRoZSByZWN0IGlmIHRoaXMgaXMgYSBzdWJmcmFtZS4KKyAgICBpZiAodmlldy0+
cGFyZW50KCkpCisgICAgICAgIHZpc2libGVSZWN0LmludGVyc2VjdChnZXRSZWN1cnNpdmVWaXNp
YmxlV2luZG93UmVjdCh2aWV3KSk7CisKKyAgICBJbnRSZWN0IGJhc2VSZWN0OworICAgIGlmIChv
cmlnUmFkaW9Hcm91cCkKKyAgICAgICAgYmFzZVJlY3QgPSBnZXROb2RlV2luZG93UmVjdChvcmln
UmFkaW9Hcm91cCk7CisgICAgZWxzZSBpZiAob3JpZ0ZvY3VzZWROb2RlKQorICAgICAgICBiYXNl
UmVjdCA9IGdldE5vZGVXaW5kb3dSZWN0KG9yaWdGb2N1c2VkTm9kZSk7CisgICAgZWxzZSB7Cisg
ICAgICAgIGJhc2VSZWN0ID0gdmlzaWJsZVJlY3Q7CisgICAgICAgIHN3aXRjaCAoZGlyKSB7Cisg
ICAgICAgIGNhc2UgUGxhdGZvcm06OlNjcm9sbExlZnQ6CisgICAgICAgICAgICBiYXNlUmVjdC5z
ZXRYKGJhc2VSZWN0Lm1heFgoKSk7CisgICAgICAgIGNhc2UgUGxhdGZvcm06OlNjcm9sbFJpZ2h0
OgorICAgICAgICAgICAgYmFzZVJlY3Quc2V0V2lkdGgoMCk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBQbGF0Zm9ybTo6U2Nyb2xsVXA6CisgICAgICAgICAgICBiYXNlUmVjdC5z
ZXRZKGJhc2VSZWN0Lm1heFkoKSk7CisgICAgICAgIGNhc2UgUGxhdGZvcm06OlNjcm9sbERvd246
CisgICAgICAgICAgICBiYXNlUmVjdC5zZXRIZWlnaHQoMCk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgIH0KKworICAgIE5vZGUqIGJlc3RDaG9pY2UgPSAwOworICAgIE5vZGVE
aXN0YW5jZSBiZXN0Q2hvaWNlRGlzdGFuY2U7CisgICAgTm9kZSogbGFzdENhbmRpZGF0ZSA9IDA7
CisgICAgSW50UmVjdCBiZXN0Q2hvaWNlUmVjdCA9IGJhc2VSZWN0OworICAgIE5vZGUqIGN1ciA9
IHN0YXJ0Tm9kZTsKKworICAgIGRvIHsKKyAgICAgICAgaWYgKGN1ci0+aXNGb2N1c2FibGUoKSkg
eworICAgICAgICAgICAgTm9kZSogY3VyUmFkaW9Hcm91cCA9IChjdXItPmhhc1RhZ05hbWUoSFRN
TE5hbWVzOjppbnB1dFRhZykKKyAgICAgICAgICAgICAgICAmJiBzdGF0aWNfY2FzdDxIVE1MSW5w
dXRFbGVtZW50Kj4oY3VyKS0+aXNSYWRpb0J1dHRvbigpKQorICAgICAgICAgICAgICAgID8gY3Vy
LT5wYXJlbnROb2RlKCkgOiAwOworICAgICAgICAgICAgaWYgKCFjdXJSYWRpb0dyb3VwIHx8IHN0
YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1lbnQqPihjdXIpLT5jaGVja2VkKCkpIHsKKyAgICAgICAg
ICAgICAgICBJbnRSZWN0IG5vZGVSZWN0ID0gY3VyUmFkaW9Hcm91cCA/IGdldE5vZGVXaW5kb3dS
ZWN0KGN1clJhZGlvR3JvdXApIDogZ2V0Tm9kZVdpbmRvd1JlY3QoY3VyKTsKKyAgICAgICAgICAg
ICAgICAvLyBOb3RlLCBpZiBmb3Igc29tZSByZWFzb24gdGhlIG5vZGVSZWN0IGlzIDB4MCwgaW50
ZXJzZWN0cyB3aWxsIG5vdCBtYXRjaC4gVGhpcyBzaG91bGRuJ3QgYmUgYQorICAgICAgICAgICAg
ICAgIC8vIHByb2JsZW0gYXMgd2UgZG9uJ3Qgd2FudCB0byBmb2N1cyBvbiBhIG5vbi12aXNpYmxl
IG5vZGUuCisgICAgICAgICAgICAgICAgaWYgKHZpc2libGVSZWN0LmludGVyc2VjdHMobm9kZVJl
Y3QpKSB7CisgICAgICAgICAgICAgICAgICAgIE5vZGVEaXN0YW5jZSBub2RlRGlzdGFuY2U7Cisg
ICAgICAgICAgICAgICAgICAgIG5vZGVEaXN0YW5jZS5tX3JlY3QgPSBub2RlUmVjdDsKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKHRlbGxEaXN0YW5jZShkaXIsIGJhc2VSZWN0LCBub2RlRGlzdGFu
Y2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJlc3RDaG9pY2UKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB8fCBub2RlRGlzdGFuY2UuaXNDbG9zZXIoYmVzdENob2ljZURp
c3RhbmNlLCBkaXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdENob2ljZSA9
IGN1cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0Q2hvaWNlRGlzdGFuY2UgPSBu
b2RlRGlzdGFuY2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdENob2ljZVJlY3Qg
PSBub2RlUmVjdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg
ICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q2FuZGlkYXRlID0gY3VyOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGN1
ciA9IG1fcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZpbmRGb2N1c2FibGVOb2RlKEZvY3VzRGly
ZWN0aW9uRm9yd2FyZCwgZG9jLCBjdXIsIDApOworCisgICAgICAgIC8vIExhc3Qgbm9kZT8gZ28g
YmFjaworICAgICAgICBpZiAoIWN1ciAmJiBvcmlnRm9jdXNlZE5vZGUpCisgICAgICAgICAgICBj
dXIgPSBtX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5maW5kRm9jdXNhYmxlTm9kZShGb2N1c0Rp
cmVjdGlvbkZvcndhcmQsIGRvYywgMCwgMCk7CisgICAgfSB3aGlsZSAoY3VyICYmIGN1ciAhPSBv
cmlnRm9jdXNlZE5vZGUgJiYgY3VyICE9IHN0YXJ0Tm9kZSk7CisKKyAgICBpZiAoIWJlc3RDaG9p
Y2UgJiYgIW9yaWdGb2N1c2VkTm9kZSkgeworICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHBy
ZXZpb3VzbHkgbm8gbm9kZSBpcyBvbiBmb2N1cy4KKyAgICAgICAgYmVzdENob2ljZSA9IGxhc3RD
YW5kaWRhdGU7CisgICAgfQorCisgICAgaWYgKGJlc3RDaG9pY2UpIHsKKyAgICAgICAgLy8gRklY
TUU6IFRlbXBvcmFyaWx5IGRpc2FibGUgYXV0b21hdGljYWwgc2Nyb2xsaW5nIGZvciBIVE1MIGVt
YWlsLgorI2lmIDAKKyAgICAgICAgaWYgKERvY3VtZW50KiBub2RlRG9jID0gYmVzdENob2ljZS0+
ZG9jdW1lbnQoKSkgeworICAgICAgICAgICAgaWYgKEZyYW1lVmlldyogbm9kZVZpZXcgPSBub2Rl
RG9jLT52aWV3KCkpCisgICAgICAgICAgICAgICAgbm9kZVZpZXctPnNjcm9sbFJlY3RJbnRvVmll
d1JlY3Vyc2l2ZWx5KGJlc3RDaG9pY2UtPmdldFJlY3QoKSk7CisgICAgICAgIH0KKyNlbmRpZgor
CisgICAgICAgIGlmIChiZXN0Q2hvaWNlLT5pc0VsZW1lbnROb2RlKCkpCisgICAgICAgICAgICBz
dGF0aWNfY2FzdDxFbGVtZW50Kj4oYmVzdENob2ljZSktPmZvY3VzKHRydWUpOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBtX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5zZXRGb2N1c2VkTm9k
ZShiZXN0Q2hvaWNlLCBiZXN0Q2hvaWNlLT5kb2N1bWVudCgpLT5mcmFtZSgpKTsKKworICAgICAg
ICAvLyBUcmlnZ2VyIGEgcmVwYWludCBvZiB0aGUgbm9kZSByZWN0IGFzIGl0IGZyZXF1ZW50bHkg
aXNuJ3QgdXBkYXRlZCBkdWUgdG8gSmF2YVNjcmlwdCBiZWluZworICAgICAgICAvLyBkaXNhYmxl
ZC4gU2VlIFJJTSBCdWcgIzEyNDIuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXBhaW50
KGJlc3RDaG9pY2VSZWN0LCB0cnVlIC8qIGNvbnRlbnRDaGFuZ2VkICovLCBmYWxzZSAvKiBpbW1l
ZGlhdGUgKi8pOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChGcmFt
ZSogcGFyZW50ID0gZnJhbWUtPnRyZWUoKS0+cGFyZW50KCkpIHsKKyAgICAgICAgaWYgKG1vdmVU
b05leHRGaWVsZChwYXJlbnQsIGRpciwgZGVzaXJlZFNjcm9sbEFtb3VudCkpCisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1BsYXRmb3Jt
OjpJbnRSZWN0IFdlYlBhZ2VQcml2YXRlOjpmb2N1c05vZGVSZWN0KCkKK3sKKyAgICBGcmFtZSog
ZnJhbWUgPSBmb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICBy
ZXR1cm4gUGxhdGZvcm06OkludFJlY3QoKTsKKworICAgIERvY3VtZW50KiBkb2MgPSBmcmFtZS0+
ZG9jdW1lbnQoKTsKKyAgICBGcmFtZVZpZXcqIHZpZXcgPSBmcmFtZS0+dmlldygpOworICAgIGlm
ICghZG9jIHx8ICF2aWV3IHx8IHZpZXctPm5lZWRzTGF5b3V0KCkpCisgICAgICAgIHJldHVybiBQ
bGF0Zm9ybTo6SW50UmVjdCgpOworCisgICAgSW50UmVjdCBmb2N1c1JlY3QgPSByZWN0Rm9yTm9k
ZShkb2MtPmZvY3VzZWROb2RlKCkpOworICAgIGZvY3VzUmVjdCA9IGFkanVzdFJlY3RPZmZzZXRG
b3JGcmFtZU9mZnNldChmb2N1c1JlY3QsIGRvYy0+Zm9jdXNlZE5vZGUoKSk7CisgICAgZm9jdXNS
ZWN0ID0gbWFwVG9UcmFuc2Zvcm1lZChmb2N1c1JlY3QpOworICAgIGNsaXBUb1RyYW5zZm9ybWVk
Q29udGVudHNSZWN0KGZvY3VzUmVjdCk7CisgICAgcmV0dXJuIGZvY3VzUmVjdDsKK30KKworUGFz
c1JlZlB0cjxOb2RlPiBXZWJQYWdlUHJpdmF0ZTo6Y29udGV4dE5vZGUoVGFyZ2V0RGV0ZWN0aW9u
U3RyYXRlZ3kgc3RyYXRlZ3kpCit7CisgICAgRXZlbnRIYW5kbGVyKiBldmVudEhhbmRsZXIgPSBm
b2N1c2VkT3JNYWluRnJhbWUoKS0+ZXZlbnRIYW5kbGVyKCk7CisgICAgY29uc3QgRmF0RmluZ2Vy
c1Jlc3VsdCBsYXN0RmF0RmluZ2Vyc1Jlc3VsdCA9IG1fdG91Y2hFdmVudEhhbmRsZXItPmxhc3RG
YXRGaW5nZXJzUmVzdWx0KCk7CisgICAgYm9vbCBpc1RvdWNoaW5nID0gbGFzdEZhdEZpbmdlcnNS
ZXN1bHQuaXNWYWxpZCgpICYmIHN0cmF0ZWd5ID09IFJlY3RCYXNlZDsKKworICAgIC8vIFVucHJl
c3MgdGhlIG1vdXNlIGJ1dHRvbiBhbHdheXMuCisgICAgaWYgKGV2ZW50SGFuZGxlci0+bW91c2VQ
cmVzc2VkKCkpCisgICAgICAgIGV2ZW50SGFuZGxlci0+c2V0TW91c2VQcmVzc2VkKGZhbHNlKTsK
KworICAgIC8vIENoZWNrIGlmIHdlJ3JlIHVzaW5nIExpbmtUb0xpbmsgYW5kIHRoZSB1c2VyIGlz
IG5vdCB0b3VjaGluZyB0aGUgc2NyZWVuLgorICAgIGlmIChtX3dlYlNldHRpbmdzLT5kb2VzR2V0
Rm9jdXNOb2RlQ29udGV4dCgpICYmICFpc1RvdWNoaW5nKSB7CisgICAgICAgIFJlZlB0cjxOb2Rl
PiBub2RlOworICAgICAgICBub2RlID0gbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNl
ZE9yTWFpbkZyYW1lKCktPmRvY3VtZW50KCktPmZvY3VzZWROb2RlKCk7CisgICAgICAgIGlmIChu
b2RlKSB7CisgICAgICAgICAgICBJbnRSZWN0IHZpc2libGVSZWN0ID0gSW50UmVjdChJbnRQb2lu
dCgpLCBhY3R1YWxWaXNpYmxlU2l6ZSgpKTsKKyAgICAgICAgICAgIGlmICghdmlzaWJsZVJlY3Qu
aW50ZXJzZWN0cyhnZXROb2RlV2luZG93UmVjdChub2RlLmdldCgpKSkpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vZGUucmVsZWFzZSgpOwor
ICAgIH0KKworICAgIC8vIENoZWNrIGZvciB0ZXh0IGlucHV0LgorICAgIGlmIChpc1RvdWNoaW5n
ICYmIGxhc3RGYXRGaW5nZXJzUmVzdWx0LmlzVGV4dElucHV0KCkpCisgICAgICAgIHJldHVybiBs
YXN0RmF0RmluZ2Vyc1Jlc3VsdC52YWxpZE5vZGUoKTsKKworICAgIEludFBvaW50IGNvbnRlbnRQ
b3M7CisgICAgaWYgKGlzVG91Y2hpbmcpCisgICAgICAgIGNvbnRlbnRQb3MgPSBsYXN0RmF0Rmlu
Z2Vyc1Jlc3VsdC5hZGp1c3RlZFBvc2l0aW9uKCk7CisgICAgZWxzZQorICAgICAgICBjb250ZW50
UG9zID0gbWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyhtX2xhc3RNb3VzZUV2ZW50LnBvcygpKTsK
KworICAgIGlmIChzdHJhdGVneSA9PSBSZWN0QmFzZWQpIHsKKyAgICAgICAgRmF0RmluZ2Vyc1Jl
c3VsdCByZXN1bHQgPSBGYXRGaW5nZXJzKHRoaXMsIGxhc3RGYXRGaW5nZXJzUmVzdWx0LmFkanVz
dGVkUG9zaXRpb24oKSwgRmF0RmluZ2Vyczo6VGV4dCkuZmluZEJlc3RQb2ludCgpOworICAgICAg
ICByZXR1cm4gcmVzdWx0LnZhbGlkTm9kZSgpOworICAgIH0KKworICAgIEhpdFRlc3RSZXN1bHQg
cmVzdWx0ID0gZXZlbnRIYW5kbGVyLT5oaXRUZXN0UmVzdWx0QXRQb2ludChjb250ZW50UG9zLCBm
YWxzZSAvKmFsbG93U2hhZG93Q29udGVudCovKTsKKyAgICByZXR1cm4gcmVzdWx0LmlubmVyTm9k
ZSgpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkaXN0YW5jZUJldHdlZW5Qb2ludHMoSW50UG9p
bnQgcDEsIEludFBvaW50IHAyKQoreworICAgIC8vIENoYW5nZSBpbnQgdG8gZG91YmxlLCBiZWNh
dXNlIChkeSAqIGR5KSBjYW4gY2F1c2UgaW50IG92ZXJmbG93IGluIHJlYWxpdHksIGUuZywgKC00
NjcwOSAqIC00NjcwOSkuCisgICAgZG91YmxlIGR4ID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihwMS54
KCkgLSBwMi54KCkpOworICAgIGRvdWJsZSBkeSA9IHN0YXRpY19jYXN0PGRvdWJsZT4ocDEueSgp
IC0gcDIueSgpKTsKKyAgICByZXR1cm4gc3FydCgoZHggKiBkeCkgKyAoZHkgKiBkeSkpOworfQor
CitOb2RlKiBXZWJQYWdlUHJpdmF0ZTo6YmVzdE5vZGVGb3Jab29tVW5kZXJQb2ludChjb25zdCBJ
bnRQb2ludCYgcG9pbnQpCit7CisgICAgSW50UG9pbnQgcHQgPSBtYXBGcm9tVHJhbnNmb3JtZWQo
cG9pbnQpOworICAgIEludFJlY3QgY2xpY2tSZWN0KHB0LngoKSAtIGJsb2NrQ2xpY2tSYWRpdXMs
IHB0LnkoKSAtIGJsb2NrQ2xpY2tSYWRpdXMsIDIgKiBibG9ja0NsaWNrUmFkaXVzLCAyICogYmxv
Y2tDbGlja1JhZGl1cyk7CisgICAgTm9kZSogb3JpZ2luYWxOb2RlID0gbm9kZUZvclpvb21VbmRl
clBvaW50KHBvaW50KTsKKyAgICBpZiAoIW9yaWdpbmFsTm9kZSkKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgTm9kZSogbm9kZSA9IGJlc3RDaGlsZE5vZGVGb3JDbGlja1JlY3Qob3JpZ2luYWxOb2Rl
LCBjbGlja1JlY3QpOworICAgIHJldHVybiBub2RlID8gYWRqdXN0ZWRCbG9ja1pvb21Ob2RlRm9y
Wm9vbUxpbWl0cyhub2RlKSA6IGFkanVzdGVkQmxvY2tab29tTm9kZUZvclpvb21MaW1pdHMob3Jp
Z2luYWxOb2RlKTsKK30KKworTm9kZSogV2ViUGFnZVByaXZhdGU6OmJlc3RDaGlsZE5vZGVGb3JD
bGlja1JlY3QoTm9kZSogcGFyZW50Tm9kZSwgY29uc3QgSW50UmVjdCYgY2xpY2tSZWN0KQorewor
ICAgIGlmICghcGFyZW50Tm9kZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpbnQgYmVzdERp
c3RhbmNlID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKworICAgIE5vZGUqIG5v
ZGUgPSBwYXJlbnROb2RlLT5maXJzdENoaWxkKCk7CisgICAgTm9kZSogYmVzdE5vZGUgPSAwOwor
ICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIEludFJlY3QgcmVjdCA9IHJlY3RGb3JOb2RlKG5v
ZGUpOworICAgICAgICBpZiAoY2xpY2tSZWN0LmludGVyc2VjdHMocmVjdCkpIHsKKyAgICAgICAg
ICAgIGludCBkaXN0YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50cyhyZWN0LmNlbnRlcigpLCBj
bGlja1JlY3QuY2VudGVyKCkpOworICAgICAgICAgICAgTm9kZSogYmVzdENoaWxkTm9kZSA9IGJl
c3RDaGlsZE5vZGVGb3JDbGlja1JlY3Qobm9kZSwgY2xpY2tSZWN0KTsKKyAgICAgICAgICAgIGlm
IChiZXN0Q2hpbGROb2RlKSB7CisgICAgICAgICAgICAgICAgSW50UmVjdCBiZXN0Q2hpbGRSZWN0
ID0gcmVjdEZvck5vZGUoYmVzdENoaWxkTm9kZSk7CisgICAgICAgICAgICAgICAgaW50IGJlc3RD
aGlsZERpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKGJlc3RDaGlsZFJlY3QuY2VudGVy
KCksIGNsaWNrUmVjdC5jZW50ZXIoKSk7CisgICAgICAgICAgICAgICAgaWYgKGJlc3RDaGlsZERp
c3RhbmNlIDwgZGlzdGFuY2UgJiYgYmVzdENoaWxkRGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHsK
KyAgICAgICAgICAgICAgICAgICAgYmVzdE5vZGUgPSBiZXN0Q2hpbGROb2RlOworICAgICAgICAg
ICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBiZXN0Q2hpbGREaXN0YW5jZTsKKyAgICAgICAgICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlz
dGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3ROb2RlID0gbm9kZTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlOworICAgICAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHsKKyAgICAgICAgICAgICAg
ICAgICAgYmVzdE5vZGUgPSBub2RlOworICAgICAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2Ug
PSBkaXN0YW5jZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHRTaWJsaW5nKCk7CisgICAgfQorCisgICAgcmV0dXJu
IGJlc3ROb2RlOworfQorCitkb3VibGUgV2ViUGFnZVByaXZhdGU6Om1heEJsb2NrWm9vbVNjYWxl
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RkOjptaW4obWF4aW11bUJsb2NrWm9vbVNjYWxlLCBt
YXhpbXVtU2NhbGUoKSk7Cit9CisKK05vZGUqIFdlYlBhZ2VQcml2YXRlOjpub2RlRm9yWm9vbVVu
ZGVyUG9pbnQoY29uc3QgSW50UG9pbnQmIHBvaW50KQoreworICAgIGlmICghbV9tYWluRnJhbWUp
CisgICAgICAgIHJldHVybiAwOworCisgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQgPSBtX21haW5G
cmFtZS0+ZXZlbnRIYW5kbGVyKCktPmhpdFRlc3RSZXN1bHRBdFBvaW50KG1hcEZyb21UcmFuc2Zv
cm1lZChwb2ludCksIGZhbHNlKTsKKworICAgIE5vZGUqIG5vZGUgPSByZXN1bHQuaW5uZXJOb25T
aGFyZWROb2RlKCk7CisKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiAwOworCisgICAg
UmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7CisgICAgd2hpbGUgKCFy
ZW5kZXJlcikgeworICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50Tm9kZSgpOworICAgICAgICBy
ZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7CisgICAgfQorCisgICAgcmV0dXJuIG5vZGU7Cit9
CisKK05vZGUqIFdlYlBhZ2VQcml2YXRlOjphZGp1c3RlZEJsb2NrWm9vbU5vZGVGb3Jab29tTGlt
aXRzKE5vZGUqIG5vZGUpCit7CisgICAgTm9kZSogaW5pdGlhbE5vZGUgPSBub2RlOworICAgIFJl
bmRlck9iamVjdCogcmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpOworICAgIGJvb2wgYWNjZXB0
YWJsZU5vZGVTaXplID0gbmV3U2NhbGVGb3JCbG9ja1pvb21SZWN0KHJlY3RGb3JOb2RlKG5vZGUp
LCAxLjAsIDApIDwgbWF4QmxvY2tab29tU2NhbGUoKTsKKworICAgIHdoaWxlICghcmVuZGVyZXIg
fHwgIWFjY2VwdGFibGVOb2RlU2l6ZSkgeworICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50Tm9k
ZSgpOworCisgICAgICAgIGlmICghbm9kZSkKKyAgICAgICAgICAgIHJldHVybiBpbml0aWFsTm9k
ZTsKKworICAgICAgICByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7CisgICAgICAgIGFjY2Vw
dGFibGVOb2RlU2l6ZSA9IG5ld1NjYWxlRm9yQmxvY2tab29tUmVjdChyZWN0Rm9yTm9kZShub2Rl
KSwgMS4wLCAwKSA8IG1heEJsb2NrWm9vbVNjYWxlKCk7CisgICAgfQorCisgICAgcmV0dXJuIG5v
ZGU7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmNvbXBhcmVOb2Rlc0ZvckJsb2NrWm9vbShO
b2RlKiBuMSwgTm9kZSogbjIpCit7CisgICAgaWYgKCFuMSB8fCAhbjIpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIHJldHVybiAobjIgPT0gbjEpIHx8IG4yLT5pc0Rlc2NlbmRhbnRPZihu
MSk7Cit9CisKK2RvdWJsZSBXZWJQYWdlUHJpdmF0ZTo6bmV3U2NhbGVGb3JCbG9ja1pvb21SZWN0
KGNvbnN0IEludFJlY3QmIHJlY3QsIGRvdWJsZSBvbGRTY2FsZSwgZG91YmxlIG1hcmdpbikKK3sK
KyAgICBpZiAocmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGlt
aXRzPGRvdWJsZT46Om1heCgpOworCisgICAgQVNTRVJUKHJlY3Qud2lkdGgoKSArIG1hcmdpbik7
CisKKyAgICBkb3VibGUgbmV3U2NhbGUgPSBvbGRTY2FsZSAqIHN0YXRpY19jYXN0PGRvdWJsZT4o
dHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSgpLndpZHRoKCkpIC8gKHJlY3Qud2lkdGgoKSAr
IG1hcmdpbik7CisKKyAgICByZXR1cm4gbmV3U2NhbGU7Cit9CisKK0ludFJlY3QgV2ViUGFnZVBy
aXZhdGU6OnJlY3RGb3JOb2RlKE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFub2RlKQorICAgICAg
ICByZXR1cm4gSW50UmVjdCgpOworCisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUt
PnJlbmRlcmVyKCk7CisKKyAgICBpZiAoIXJlbmRlcmVyKQorICAgICAgICByZXR1cm4gSW50UmVj
dCgpOworCisgICAgLy8gUmV0dXJuIHJlY3QgaW4gdW4tdHJhbnNmb3JtZWQgY29udGVudCBjb29y
ZGluYXRlcy4KKyAgICBJbnRSZWN0IGJsb2NrUmVjdDsKKworICAgIC8vIEZJWE1FOiBFbnN1cmUg
dGhpcyB3b3JrcyB3aXRoIGlmcmFtZXMuCisgICAgaWYgKG1fd2ViUGFnZS0+c2V0dGluZ3MoKS0+
dGV4dFJlZmxvd01vZGUoKSA9PSBXZWJTZXR0aW5nczo6VGV4dFJlZmxvd0VuYWJsZWQgJiYgcmVu
ZGVyZXItPmlzVGV4dCgpKSB7CisgICAgICAgIFJlbmRlckJsb2NrKiByZW5kZXJCbG9jayA9IHJl
bmRlcmVyLT5jb250YWluaW5nQmxvY2soKTsKKyAgICAgICAgaW50IHhPZmZzZXQgPSAwOworICAg
ICAgICBpbnQgeU9mZnNldCA9IDA7CisgICAgICAgIHdoaWxlICghcmVuZGVyQmxvY2stPmlzUm9v
dCgpKSB7CisgICAgICAgICAgICB4T2Zmc2V0ICs9IHJlbmRlckJsb2NrLT54KCk7CisgICAgICAg
ICAgICB5T2Zmc2V0ICs9IHJlbmRlckJsb2NrLT55KCk7CisgICAgICAgICAgICByZW5kZXJCbG9j
ayA9IHJlbmRlckJsb2NrLT5jb250YWluaW5nQmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICBj
b25zdCBSZW5kZXJUZXh0KiByZW5kZXJUZXh0ID0gdG9SZW5kZXJUZXh0KHJlbmRlcmVyKTsKKyAg
ICAgICAgSW50UmVjdCBsaW5lc0JveCA9IHJlbmRlclRleHQtPmxpbmVzQm91bmRpbmdCb3goKTsK
KyAgICAgICAgYmxvY2tSZWN0ID0gSW50UmVjdCh4T2Zmc2V0ICsgbGluZXNCb3gueCgpLCB5T2Zm
c2V0ICsgbGluZXNCb3gueSgpLCBsaW5lc0JveC53aWR0aCgpLCBsaW5lc0JveC5oZWlnaHQoKSk7
CisgICAgfSBlbHNlCisgICAgICAgIGJsb2NrUmVjdCA9IHJlbmRlcmVyLT5hYnNvbHV0ZUNsaXBw
ZWRPdmVyZmxvd1JlY3QoKTsKKworICAgIGlmIChyZW5kZXJlci0+aXNUZXh0KCkpIHsKKyAgICAg
ICAgUmVuZGVyQmxvY2sqIHJiID0gcmVuZGVyZXItPmNvbnRhaW5pbmdCbG9jaygpOworCisgICAg
ICAgIC8vIEluZWZmaWNpZW50PyBXYXkgdG8gZmluZCB3aWR0aCB3aGVuIGZsb2F0cyBpbnRlcnNl
Y3QgYSBibG9jay4KKyAgICAgICAgaW50IGJsb2NrV2lkdGggPSAwOworICAgICAgICBpbnQgbGlu
ZUNvdW50ID0gcmItPmxpbmVDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxp
bmVDb3VudDsgaSsrKQorICAgICAgICAgICAgYmxvY2tXaWR0aCA9IG1heChibG9ja1dpZHRoLCBy
Yi0+YXZhaWxhYmxlTG9naWNhbFdpZHRoRm9yTGluZShpLCBmYWxzZSkpOworCisgICAgICAgIGJs
b2NrUmVjdC5zZXRXaWR0aChibG9ja1dpZHRoKTsKKyAgICAgICAgYmxvY2tSZWN0LnNldFgoYmxv
Y2tSZWN0LngoKSArIHJiLT5sb2dpY2FsTGVmdE9mZnNldEZvckxpbmUoMSwgZmFsc2UpKTsKKyAg
ICB9CisKKyAgICAvLyBTdHJpcCBvZmYgcGFkZGluZy4KKyAgICBpZiAocmVuZGVyZXItPnN0eWxl
KCktPmhhc1BhZGRpbmcoKSkgeworICAgICAgICBibG9ja1JlY3Quc2V0WChibG9ja1JlY3QueCgp
ICsgcmVuZGVyZXItPnN0eWxlKCktPnBhZGRpbmdMZWZ0KCkudmFsdWUoKSk7CisgICAgICAgIGJs
b2NrUmVjdC5zZXRZKGJsb2NrUmVjdC55KCkgKyByZW5kZXJlci0+c3R5bGUoKS0+cGFkZGluZ1Rv
cCgpLnZhbHVlKCkpOworICAgICAgICBibG9ja1JlY3Quc2V0V2lkdGgoYmxvY2tSZWN0LndpZHRo
KCkgLSByZW5kZXJlci0+c3R5bGUoKS0+cGFkZGluZ1JpZ2h0KCkudmFsdWUoKSk7CisgICAgICAg
IGJsb2NrUmVjdC5zZXRIZWlnaHQoYmxvY2tSZWN0LmhlaWdodCgpIC0gcmVuZGVyZXItPnN0eWxl
KCktPnBhZGRpbmdCb3R0b20oKS52YWx1ZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmxvY2tS
ZWN0OworfQorCitJbnRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6ZnJhbWVPZmZzZXQoY29uc3QgRnJh
bWUqIGZyYW1lKSBjb25zdAoreworICAgIEFTU0VSVChmcmFtZSk7CisKKyAgICAvLyBGSVhNRTog
VGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHdoZW4gcGFnZSBpcyBiZWluZyBkZXN0cm95ZWQg
YW5kIEpTIHRyaWdnZXJzIHNlbGVjdGlvbiBjaGFuZ2UuCisgICAgLy8gV2UgY291bGQgYnJlYWsg
dGhlIGNhbGwgY2hhaW4gYXQgdXBwZXIgbGV2ZWxzLCBidXQgSSB0aGluayBpdCBpcyBiZXR0ZXIg
dG8gY2hlY2sgdGhlIGZyYW1lIHBvaW50ZXIKKyAgICAvLyBoZXJlIGJlY2F1c2UgdGhlIHBvaW50
ZXIgaXMgZXhwbGljaXRseSBjbGVhcmVkIGluIFdlYlBhZ2U6OmRlc3Ryb3koKS4KKyAgICBpZiAo
IW1haW5GcmFtZSgpKQorICAgICAgICByZXR1cm4gSW50UG9pbnQoKTsKKworICAgIC8vIENvbnZl
cnQgMCwwIGluIHRoZSBmcmFtZSdzIGNvb3JkaW5hdGUgc3lzdGVtIHRvIHdpbmRvdyBjb29yZGlu
YXRlcyB0bworICAgIC8vIGdldCB0aGUgZnJhbWUncyBnbG9iYWwgcG9zaXRpb24sIGFuZCByZXR1
cm4gdGhpcyBwb3NpdGlvbiBpbiB0aGUgbWFpbgorICAgIC8vIGZyYW1lJ3MgY29vcmRpbmF0ZXMu
ICAoU28gdGhlIG1haW4gZnJhbWUncyBjb29yZGluYXRlcyB3aWxsIGJlIDAsMC4pCisgICAgcmV0
dXJuIG1haW5GcmFtZSgpLT52aWV3KCktPndpbmRvd1RvQ29udGVudHMoZnJhbWUtPnZpZXcoKS0+
Y29udGVudHNUb1dpbmRvdyhJbnRQb2ludDo6emVybygpKSk7Cit9CisKK0ludFJlY3QgV2ViUGFn
ZVByaXZhdGU6OmFkanVzdFJlY3RPZmZzZXRGb3JGcmFtZU9mZnNldChjb25zdCBJbnRSZWN0JiBy
ZWN0LCBjb25zdCBOb2RlKiBub2RlKQoreworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJu
IHJlY3Q7CisKKyAgICAvLyBBZGp1c3QgdGhlIG9mZnNldCBvZiB0aGUgcmVjdCBpZiBpdCBpcyBp
biBhbiBpRnJhbWUvZnJhbWUgb3Igc2V0IG9mIGlGcmFtZXMvZnJhbWVzLgorICAgIC8vIEZJWE1F
OiBjYW4gd2UganVzdCB1c2UgZnJhbWVPZmZzZXQgaW5zdGVhZCBvZiB0aGlzIGJpZyByb3V0aW5l
PworICAgIGNvbnN0IE5vZGUqIHRub2RlID0gbm9kZTsKKyAgICBJbnRSZWN0IGFkanVzdGVkUmVj
dCA9IHJlY3Q7CisgICAgZG8geworICAgICAgICBGcmFtZSogZnJhbWUgPSB0bm9kZS0+ZG9jdW1l
bnQoKS0+ZnJhbWUoKTsKKyAgICAgICAgaWYgKGZyYW1lKSB7CisgICAgICAgICAgICBOb2RlKiBv
d25lck5vZGUgPSBzdGF0aWNfY2FzdDxOb2RlKj4oZnJhbWUtPm93bmVyRWxlbWVudCgpKTsKKyAg
ICAgICAgICAgIHRub2RlID0gb3duZXJOb2RlOworICAgICAgICAgICAgaWYgKG93bmVyTm9kZSAm
JiAob3duZXJOb2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aWZyYW1lVGFnKSB8fCBvd25lck5v
ZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpmcmFtZVRhZykpKSB7CisgICAgICAgICAgICAgICAg
SW50UmVjdCBpRnJhbWVSZWN0OworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAg
ICAgICAgaUZyYW1lUmVjdCA9IHJlY3RGb3JOb2RlKG93bmVyTm9kZSk7CisgICAgICAgICAgICAg
ICAgICAgIGFkanVzdGVkUmVjdC5tb3ZlKGlGcmFtZVJlY3QueCgpLCBpRnJhbWVSZWN0LnkoKSk7
CisgICAgICAgICAgICAgICAgICAgIGFkanVzdGVkUmVjdC5pbnRlcnNlY3QoaUZyYW1lUmVjdCk7
CisgICAgICAgICAgICAgICAgICAgIG93bmVyTm9kZSA9IG93bmVyTm9kZS0+cGFyZW50Tm9kZSgp
OworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGlGcmFtZVJlY3QuaXNFbXB0eSgpICYmIG93bmVy
Tm9kZSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgIH0gd2hpbGUgKHRub2RlID0gdG5vZGUtPnBhcmVudE5vZGUoKSk7CisKKyAgICBy
ZXR1cm4gYWRqdXN0ZWRSZWN0OworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2YXRlOjpibG9ja1pv
b21SZWN0Rm9yTm9kZShOb2RlKiBub2RlKQoreworICAgIGlmICghbm9kZSB8fCBjb250ZW50c1Np
emUoKS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CisKKyAgICBOb2RlKiB0
bm9kZSA9IG5vZGU7CisgICAgbV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlID0gdG5vZGU7
CisKKyAgICBJbnRSZWN0IGJsb2NrUmVjdCA9IHJlY3RGb3JOb2RlKHRub2RlKTsKKyAgICBJbnRS
ZWN0IG9yaWdpbmFsUmVjdCA9IGJsb2NrUmVjdDsKKworICAgIGludCBvcmlnaW5hbEFyZWEgPSBv
cmlnaW5hbFJlY3Qud2lkdGgoKSAqIG9yaWdpbmFsUmVjdC5oZWlnaHQoKTsKKyAgICBpbnQgcGFn
ZUFyZWEgPSBjb250ZW50c1NpemUoKS53aWR0aCgpICogY29udGVudHNTaXplKCkuaGVpZ2h0KCk7
CisgICAgZG91YmxlIGJsb2NrVG9QYWdlUmF0aW8gPSBzdGF0aWNfY2FzdDxkb3VibGU+KDEgLSBv
cmlnaW5hbEFyZWEgLyBwYWdlQXJlYSk7CisgICAgZG91YmxlIGJsb2NrRXhwYW5zaW9uUmF0aW8g
PSA1LjAgKiBibG9ja1RvUGFnZVJhdGlvICogYmxvY2tUb1BhZ2VSYXRpbzsKKworICAgIGlmICgh
dG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjppbWdUYWcpICYmICF0bm9kZS0+aGFzVGFnTmFt
ZShIVE1MTmFtZXM6OmlucHV0VGFnKSAmJiAhdG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjp0
ZXh0YXJlYVRhZykpCisgICAgICAgIHdoaWxlICh0bm9kZSA9IHRub2RlLT5wYXJlbnROb2RlKCkp
IHsKKyAgICAgICAgICAgIEFTU0VSVCh0bm9kZSk7CisgICAgICAgICAgICBJbnRSZWN0IHRSZWN0
ID0gcmVjdEZvck5vZGUodG5vZGUpOworICAgICAgICAgICAgaW50IHRlbXBCbG9ja0FyZWEgPSB0
UmVjdC53aWR0aCgpICogdFJlY3QuaGVpZ2h0KCk7CisgICAgICAgICAgICAvLyBEb24ndCBleHBh
bmQgdGhlIGJsb2NrIGlmIGl0IHdpbGwgYmUgdG9vIGxhcmdlIHJlbGF0aXZlIHRvIHRoZSBjb250
ZW50LgorICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PGRvdWJsZT4oMSAtIHRlbXBCbG9ja0Fy
ZWEgLyBwYWdlQXJlYSkgPCBtaW5pbXVtRXhwYW5kaW5nUmF0aW8pCisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICBpZiAodFJlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAg
IGNvbnRpbnVlOyAvLyBObyByZW5kZXJlci4KKyAgICAgICAgICAgIGlmICh0ZW1wQmxvY2tBcmVh
IDwgMS4xICogb3JpZ2luYWxBcmVhKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBUaGUg
c2l6ZSBvZiB0aGlzIHBhcmVudCBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBjaGlsZCwgbm8gbmVlZCB0
byBnbyB0byB0aGlzIHBhcmVudC4KKyAgICAgICAgICAgIC8vIERvbid0IGV4cGFuZCB0aGUgYmxv
Y2sgaWYgdGhlIHBhcmVudCBub2RlIHNpemUgaXMgYWxyZWFkeSBhbG1vc3QgdGhlIHNpemUgb2Yg
YWN0dWFsIHZpc2libGUgc2l6ZS4KKyAgICAgICAgICAgIEludFNpemUgYWN0dWFsU2l6ZSA9IGFj
dHVhbFZpc2libGVTaXplKCk7CisgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8ZG91YmxlPigx
IC0gdFJlY3Qud2lkdGgoKSAvIGFjdHVhbFNpemUud2lkdGgoKSkgPCBtaW5pbXVtRXhwYW5kaW5n
UmF0aW8pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAodGVtcEJsb2Nr
QXJlYSA8IGJsb2NrRXhwYW5zaW9uUmF0aW8gKiBvcmlnaW5hbEFyZWEpIHsKKyAgICAgICAgICAg
ICAgICBibG9ja1JlY3QgPSB0UmVjdDsKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRCbG9ja1pv
b21BZGp1c3RlZE5vZGUgPSB0bm9kZTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBibG9ja1JlY3QgPSBhZGp1c3RSZWN0T2Zmc2V0
Rm9yRnJhbWVPZmZzZXQoYmxvY2tSZWN0LCBub2RlKTsKKyAgICBibG9ja1JlY3QgPSBtYXBUb1Ry
YW5zZm9ybWVkKGJsb2NrUmVjdCk7CisgICAgY2xpcFRvVHJhbnNmb3JtZWRDb250ZW50c1JlY3Qo
YmxvY2tSZWN0KTsKKworI2lmIERFQlVHX0JMT0NLX1pPT00KKyAgICAvLyBSZS1wYWludCB0aGUg
YmFja2luZ3N0b3JlIHRvIHNjcmVlbiB0byBlcmFzZSBvdGhlciBhbm5vdGF0aW9ucy4KKyAgICBt
X2JhY2tpbmdTdG9yZS0+ZC0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhCYWNr
aW5nU3RvcmU6OkJsaXQpOworCisgICAgLy8gUmVuZGVyIGEgYmxhY2sgc3F1YXJlIG92ZXIgdGhl
IGNhbGN1bGF0ZWQgYmxvY2sgYW5kIGEgZ3JheSBzcXVhcmUgb3ZlciB0aGUgb3JpZ2luYWwgYmxv
Y2sgZm9yIHZpc3VhbCBpbnNwZWN0aW9uLgorICAgIG9yaWdpbmFsUmVjdCA9IG1hcFRvVHJhbnNm
b3JtZWQob3JpZ2luYWxSZWN0KTsKKyAgICBjbGlwVG9UcmFuc2Zvcm1lZENvbnRlbnRzUmVjdChv
cmlnaW5hbFJlY3QpOworICAgIEludFJlY3QgcmVuZGVyUmVjdCA9IG1hcEZyb21UcmFuc2Zvcm1l
ZENvbnRlbnRzVG9UcmFuc2Zvcm1lZFZpZXdwb3J0KGJsb2NrUmVjdCk7CisgICAgSW50UmVjdCBv
cmlnaW5hbFJlbmRlclJlY3QgPSBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVHJhbnNmb3Jt
ZWRWaWV3cG9ydChvcmlnaW5hbFJlY3QpOworICAgIEludFNpemUgdmlld3BvcnRTaXplID0gdHJh
bnNmb3JtZWRWaWV3cG9ydFNpemUoKTsKKyAgICByZW5kZXJSZWN0LmludGVyc2VjdChJbnRSZWN0
KDAsIDAsIHZpZXdwb3J0U2l6ZS53aWR0aCgpLCB2aWV3cG9ydFNpemUuaGVpZ2h0KCkpKTsKKyAg
ICBvcmlnaW5hbFJlbmRlclJlY3QuaW50ZXJzZWN0KEludFJlY3QoMCwgMCwgdmlld3BvcnRTaXpl
LndpZHRoKCksIHZpZXdwb3J0U2l6ZS5oZWlnaHQoKSkpOworICAgIG1fYmFja2luZ1N0b3JlLT5k
LT5jbGVhcldpbmRvdyhyZW5kZXJSZWN0LCAwLCAwLCAwKTsKKyAgICBtX2JhY2tpbmdTdG9yZS0+
ZC0+Y2xlYXJXaW5kb3cob3JpZ2luYWxSZW5kZXJSZWN0LCAxMjAsIDEyMCwgMTIwKTsKKyAgICBt
X2JhY2tpbmdTdG9yZS0+ZC0+aW52YWxpZGF0ZVdpbmRvdyhyZW5kZXJSZWN0KTsKKyNlbmRpZgor
CisgICAgcmV0dXJuIGJsb2NrUmVjdDsKK30KKwordm9pZCBXZWJQYWdlOjpibG9ja1pvb21Bbmlt
YXRpb25GaW5pc2hlZCgpCit7CisgICAgZC0+em9vbUJsb2NrKCk7Cit9CisKKy8vIFRoaXMgZnVu
Y3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuCisvLyBJdCBpcyBjYWxsZWQgYWZ0
ZXIgdGhlIGFuaW1hdGlvbiBlbmRzIChzZWUgYWJvdmUpLgordm9pZCBXZWJQYWdlUHJpdmF0ZTo6
em9vbUJsb2NrKCkKK3sKKyAgICBpZiAoIW1fbWFpbkZyYW1lKQorICAgICAgICByZXR1cm47CisK
KyAgICBJbnRQb2ludCBhbmNob3Iocm91bmRVbnRyYW5zZm9ybWVkUG9pbnQobWFwRnJvbVRyYW5z
Zm9ybWVkRmxvYXRQb2ludChtX2ZpbmFsQmxvY2tQb2ludCkpKTsKKyAgICBib29sIHdpbGxVc2VU
ZXh0UmVmbG93ID0gZmFsc2U7CisKKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9XKQorICAgIHdp
bGxVc2VUZXh0UmVmbG93ID0gbV93ZWJQYWdlLT5zZXR0aW5ncygpLT50ZXh0UmVmbG93TW9kZSgp
ICE9IFdlYlNldHRpbmdzOjpUZXh0UmVmbG93RGlzYWJsZWQ7CisgICAgdG9nZ2xlVGV4dFJlZmxv
d0lmVGV4dFJlZmxvd0VuYWJsZWRPbmx5Rm9yQmxvY2tab29tKG1fc2hvdWxkUmVmbG93QmxvY2sp
OworICAgIHNldE5lZWRzTGF5b3V0KCk7CisjZW5kaWYKKworICAgIFRyYW5zZm9ybWF0aW9uTWF0
cml4IHpvb207CisgICAgem9vbS5zY2FsZShtX2Jsb2NrWm9vbUZpbmFsU2NhbGUpOworICAgICpt
X3RyYW5zZm9ybWF0aW9uTWF0cml4ID0gem9vbTsKKyAgICBtX2NsaWVudC0+cmVzZXRCaXRtYXBa
b29tU2NhbGUobV9ibG9ja1pvb21GaW5hbFNjYWxlKTsKKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+
c3VzcGVuZFNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoKTsKKyAgICB1cGRhdGVWaWV3cG9y
dFNpemUoKTsKKworI2lmIEVOQUJMRShWSUVXUE9SVF9SRUZMT1cpCisgICAgcmVxdWVzdExheW91
dElmTmVlZGVkKCk7CisgICAgaWYgKHdpbGxVc2VUZXh0UmVmbG93ICYmIG1fc2hvdWxkUmVmbG93
QmxvY2spIHsKKyAgICAgICAgSW50UmVjdCByZWZsb3dlZFJlY3QgPSByZWN0Rm9yTm9kZShtX2N1
cnJlbnRCbG9ja1pvb21BZGp1c3RlZE5vZGUuZ2V0KCkpOworICAgICAgICByZWZsb3dlZFJlY3Qg
PSBhZGp1c3RSZWN0T2Zmc2V0Rm9yRnJhbWVPZmZzZXQocmVmbG93ZWRSZWN0LCBtX2N1cnJlbnRC
bG9ja1pvb21BZGp1c3RlZE5vZGUuZ2V0KCkpOworICAgICAgICByZWZsb3dlZFJlY3QubW92ZShy
b3VuZFRyYW5zZm9ybWVkUG9pbnQobV9maW5hbEJsb2NrUG9pbnRSZWZsb3dPZmZzZXQpLngoKSwg
cm91bmRUcmFuc2Zvcm1lZFBvaW50KG1fZmluYWxCbG9ja1BvaW50UmVmbG93T2Zmc2V0KS55KCkp
OworICAgICAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbV9jdXJyZW50QmxvY2tab29tQWRq
dXN0ZWROb2RlLT5yZW5kZXJlcigpOworICAgICAgICBJbnRQb2ludCB0b3BMZWZ0UG9pbnQocmVm
bG93ZWRSZWN0LmxvY2F0aW9uKCkpOworICAgICAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXIt
PmlzVGV4dCgpKSB7CisgICAgICAgICAgICBFVGV4dEFsaWduIHRleHRBbGlnbiA9IHJlbmRlcmVy
LT5zdHlsZSgpLT50ZXh0QWxpZ24oKTsKKyAgICAgICAgICAgIEludFBvaW50IHRleHRBbmNob3I7
CisgICAgICAgICAgICBzd2l0Y2ggKHRleHRBbGlnbikgeworICAgICAgICAgICAgY2FzZSBDRU5U
RVI6CisgICAgICAgICAgICBjYXNlIFdFQktJVF9DRU5URVI6CisgICAgICAgICAgICAgICAgdGV4
dEFuY2hvciA9IEludFBvaW50KHJlZmxvd2VkUmVjdC54KCkgKyAocmVmbG93ZWRSZWN0LndpZHRo
KCkgLSBhY3R1YWxWaXNpYmxlU2l6ZSgpLndpZHRoKCkpIC8gMiwgdG9wTGVmdFBvaW50LnkoKSk7
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIExFRlQ6CisgICAgICAg
ICAgICBjYXNlIFdFQktJVF9MRUZUOgorICAgICAgICAgICAgICAgIHRleHRBbmNob3IgPSB0b3BM
ZWZ0UG9pbnQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJJR0hU
OgorICAgICAgICAgICAgY2FzZSBXRUJLSVRfUklHSFQ6CisgICAgICAgICAgICAgICAgdGV4dEFu
Y2hvciA9IEludFBvaW50KHJlZmxvd2VkUmVjdC54KCkgKyByZWZsb3dlZFJlY3Qud2lkdGgoKSAt
IGFjdHVhbFZpc2libGVTaXplKCkud2lkdGgoKSwgdG9wTGVmdFBvaW50LnkoKSk7CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRBQVVUTzoKKyAgICAgICAgICAgIGNh
c2UgSlVTVElGWToKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHJl
bmRlcmVyLT5zdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCisgICAgICAgICAgICAg
ICAgICAgIHRleHRBbmNob3IgPSB0b3BMZWZ0UG9pbnQ7CisgICAgICAgICAgICAgICAgZWxzZQor
ICAgICAgICAgICAgICAgICAgICB0ZXh0QW5jaG9yID0gSW50UG9pbnQocmVmbG93ZWRSZWN0Lngo
KSArIHJlZmxvd2VkUmVjdC53aWR0aCgpIC0gYWN0dWFsVmlzaWJsZVNpemUoKS53aWR0aCgpLCB0
b3BMZWZ0UG9pbnQueSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIHNldFNjcm9sbFBvc2l0aW9uKHRleHRBbmNob3IpOworICAgICAgICB9IGVs
c2UKKyAgICAgICAgICAgIHJlbmRlcmVyLT5zdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9u
KCkgPyBzZXRTY3JvbGxQb3NpdGlvbih0b3BMZWZ0UG9pbnQpIDogc2V0U2Nyb2xsUG9zaXRpb24o
SW50UG9pbnQocmVmbG93ZWRSZWN0LngoKSArIHJlZmxvd2VkUmVjdC53aWR0aCgpIC0gYWN0dWFs
VmlzaWJsZVNpemUoKS53aWR0aCgpLCB0b3BMZWZ0UG9pbnQueSgpKSk7CisgICAgfSBlbHNlIGlm
ICh3aWxsVXNlVGV4dFJlZmxvdykgeworICAgICAgICBJbnRSZWN0IGZpbmFsUmVjdCA9IHJlY3RG
b3JOb2RlKG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZS5nZXQoKSk7CisgICAgICAgIGZp
bmFsUmVjdCA9IGFkanVzdFJlY3RPZmZzZXRGb3JGcmFtZU9mZnNldChmaW5hbFJlY3QsIG1fY3Vy
cmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZS5nZXQoKSk7CisgICAgICAgIHNldFNjcm9sbFBvc2l0
aW9uKEludFBvaW50KDAsIGZpbmFsUmVjdC55KCkgKyBtX2ZpbmFsQmxvY2tQb2ludFJlZmxvd09m
ZnNldC55KCkpKTsKKyAgICAgICAgcmVzZXRCbG9ja1pvb20oKTsKKyAgICB9CisjZW5kaWYKKyAg
ICBpZiAoIXdpbGxVc2VUZXh0UmVmbG93KSB7CisgICAgICAgIHNldFNjcm9sbFBvc2l0aW9uKGFu
Y2hvcik7CisgICAgICAgIGlmICghbV9zaG91bGRSZWZsb3dCbG9jaykKKyAgICAgICAgICAgIHJl
c2V0QmxvY2tab29tKCk7CisgICAgfQorCisgICAgbm90aWZ5VHJhbnNmb3JtQ2hhbmdlZCgpOwor
ICAgIG1fYmFja2luZ1N0b3JlLT5kLT5jbGVhcldpbmRvdygpOworICAgIG1fYmFja2luZ1N0b3Jl
LT5kLT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKEJhY2tpbmdTdG9yZTo6UmVu
ZGVyQW5kQmxpdCk7CisgICAgbV9jbGllbnQtPnpvb21DaGFuZ2VkKG1fd2ViUGFnZS0+aXNNaW5a
b29tZWQoKSwgbV93ZWJQYWdlLT5pc01heFpvb21lZCgpLCAhc2hvdWxkWm9vbU9uRXNjYXBlKCks
IGN1cnJlbnRTY2FsZSgpKTsKK30KKworCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpyZXNldEJsb2Nr
Wm9vbSgpCit7CisgICAgbV9jdXJyZW50QmxvY2tab29tTm9kZSA9IDA7CisgICAgbV9jdXJyZW50
QmxvY2tab29tQWRqdXN0ZWROb2RlID0gMDsKKyAgICBtX3Nob3VsZFJlZmxvd0Jsb2NrID0gZmFs
c2U7Cit9CisKK1dlYlBhZ2U6OldlYlBhZ2UoV2ViUGFnZUNsaWVudCogY2xpZW50LCBjb25zdCBX
ZWJTdHJpbmcmIHBhZ2VHcm91cE5hbWUsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0KQor
eworICAgIGdsb2JhbEluaXRpYWxpemUoKTsKKyAgICBkID0gbmV3IFdlYlBhZ2VQcml2YXRlKHRo
aXMsIGNsaWVudCwgcmVjdCk7CisgICAgZC0+aW5pdChwYWdlR3JvdXBOYW1lKTsKK30KKwordm9p
ZCBXZWJQYWdlOjpkZXN0cm95V2ViUGFnZUNvbXBvc2l0b3IoKQoreworI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKKyAgICAvLyBEZXN0cm95IHRoZSBsYXllciByZW5kZXJlciBpbiBh
IHN5bmMgY29tbWFuZCBiZWZvcmUgd2UgZGVzdHJveSB0aGUgYmFja2luZyBzdG9yZSwKKyAgICAv
LyB0byBmbHVzaCBhbnkgcGVuZGluZyBjb21wb3NpdGluZyBtZXNzYWdlcyBvbiB0aGUgY29tcG9z
aXRpbmcgdGhyZWFkLgorICAgIC8vIFRoZSBiYWNraW5nIHN0b3JlIGlzIGluZGlyZWN0bHkgZGVs
ZXRlZCBieSB0aGUgJ2RldGFjaEZyb21QYXJlbnQnIGNhbGwgYmVsb3cuCisgICAgZC0+c3luY0Rl
c3Ryb3lDb21wb3NpdG9yT25Db21wb3NpdGluZ1RocmVhZCgpOworI2VuZGlmCit9CisKK3ZvaWQg
V2ViUGFnZTo6ZGVzdHJveSgpCit7CisgICAgLy8gVE9ETzogbmVlZCB0byB2ZXJpZnkgaWYgdGhp
cyBjYWxsIG5lZWRzIHRvIGJlIG1hZGUgYmVmb3JlIGNhbGxpbmcKKyAgICAvLyBXZWJQYWdlOjpk
ZXN0cm95V2ViUGFnZUNvbXBvc2l0b3IoKQorICAgIGQtPm1fYmFja2luZ1N0b3JlLT5kLT5zdXNw
ZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcygpOworCisgICAgLy8gQ2xvc2UgdGhlIGJh
Y2tmb3J3YXJkIGxpc3QgYW5kIHJlbGVhc2UgdGhlIGNhY2hlZCBwYWdlcy4KKyAgICBkLT5tX3Bh
Z2UtPmJhY2tGb3J3YXJkKCktPmNsb3NlKCk7CisgICAgcGFnZUNhY2hlKCktPnJlbGVhc2VBdXRv
cmVsZWFzZWRQYWdlc05vdygpOworCisgICAgRnJhbWVMb2FkZXIqIGxvYWRlciA9IGQtPm1fbWFp
bkZyYW1lLT5sb2FkZXIoKTsKKworICAgIC8vIFJlbW92ZSBtYWluIGZyYW1lJ3MgYmFja2luZyBz
dG9yZSBjbGllbnQgZnJvbSB0aGUgbWFwCisgICAgLy8gdG8gcHJldmVudCBGcmFtZUxvYWRlckNs
aWVudEJsYWNreUJlcnJ5OjpkZXRhY2hGcm9tUGFyZW50MigpLAorICAgIC8vIHdoaWNoIGlzIGNh
bGxlZCBieSBsb2FkZXItPmRldGFjaEZyb21QYXJlbnQoKSwgZGVsZXRpbmcgaXQuCisgICAgLy8g
V2Ugd2lsbCBkZWxldGUgaXQgaW4gfldlYlBhZ2VQcml2YXRlKCkuCisgICAgLy8gUmVhc29uOiBs
b2FkZXItPmRldGFjaEZyb21QYXJlbnQoKSBtYXkgcGluZyBiYWNrIHRvIGJhY2tpbmcgc3RvcmUK
KyAgICAvLyBpbmRpcmVjdGx5IHRocm91Z2ggQ2hyb21lQ2xpZW50QmxhY2tCZXJyeTo6aW52YWxp
ZGF0ZUNvbnRlbnRzQW5kV2luZG93KCkuCisgICAgLy8gc2VlIFJJTSBQUiAjOTMyNTYuCisgICAg
ZC0+cmVtb3ZlQmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUoZC0+bV9tYWluRnJhbWUpOworCisg
ICAgLy8gU2V0IG1fbWFpbkZyYW1lIHRvIDAgdG8gYXZvaWQgY2FsbHMgYmFjayBpbiB0byB0aGUg
YmFja2luZ3N0b3JlIGR1cmluZyB3ZWJwYWdlIGRlbGV0aW9uLgorICAgIGQtPm1fbWFpbkZyYW1l
ID0gMDsKKyAgICBpZiAobG9hZGVyKQorICAgICAgICBsb2FkZXItPmRldGFjaEZyb21QYXJlbnQo
KTsKKworICAgIGRlbGV0ZSB0aGlzOworfQorCitXZWJQYWdlOjp+V2ViUGFnZSgpCit7CisgICAg
ZGVsZXRlIGQ7CisgICAgZCA9IDA7Cit9CisKK1dlYlBhZ2VDbGllbnQqIFdlYlBhZ2U6OmNsaWVu
dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fY2xpZW50OworfQorCit2b2lkIFdlYlBhZ2U6
OmxvYWQoY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFyKiBuZXR3b3JrVG9rZW4sIGJvb2wgaXNJ
bml0aWFsKQoreworICAgIGQtPmxvYWQodXJsLCBuZXR3b3JrVG9rZW4sICJHRVQiLCBQbGF0Zm9y
bTo6TmV0d29ya1JlcXVlc3Q6OlVzZVByb3RvY29sQ2FjaGVQb2xpY3ksIDAsIDAsIDAsIDAsIGlz
SW5pdGlhbCwgZmFsc2UpOworfQorCit2b2lkIFdlYlBhZ2U6OmxvYWRFeHRlbmRlZChjb25zdCBj
aGFyKiB1cmwsIGNvbnN0IGNoYXIqIG5ldHdvcmtUb2tlbiwgY29uc3QgY2hhciogbWV0aG9kLCBQ
bGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkNhY2hlUG9saWN5IGNhY2hlUG9saWN5LCBjb25zdCBj
aGFyKiBkYXRhLCBzaXplX3QgZGF0YUxlbmd0aCwgY29uc3QgY2hhciogY29uc3QqIGhlYWRlcnMs
IHNpemVfdCBoZWFkZXJzTGVuZ3RoLCBib29sIG11c3RIYW5kbGVJbnRlcm5hbGx5KQoreworICAg
IGQtPmxvYWQodXJsLCBuZXR3b3JrVG9rZW4sIG1ldGhvZCwgY2FjaGVQb2xpY3ksIGRhdGEsIGRh
dGFMZW5ndGgsIGhlYWRlcnMsIGhlYWRlcnNMZW5ndGgsIGZhbHNlLCBtdXN0SGFuZGxlSW50ZXJu
YWxseSwgZmFsc2UsICIiKTsKK30KKwordm9pZCBXZWJQYWdlOjpsb2FkRmlsZShjb25zdCBjaGFy
KiBwYXRoLCBjb25zdCBjaGFyKiBvdmVycmlkZUNvbnRlbnRUeXBlKQoreworICAgIHN0ZDo6c3Ry
aW5nIGZpbGVVcmwocGF0aCk7CisgICAgaWYgKCFmaWxlVXJsLmZpbmQoIi8iKSkKKyAgICAgICAg
ZmlsZVVybC5pbnNlcnQoMCwgImZpbGU6Ly8iKTsKKyAgICBlbHNlIGlmIChmaWxlVXJsLmZpbmQo
ImZpbGU6Ly8vIikpCisgICAgICAgIHJldHVybjsKKworICAgIGQtPmxvYWQoZmlsZVVybC5jX3N0
cigpLCAwLCAiR0VUIiwgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpVc2VQcm90b2NvbENhY2hl
UG9saWN5LCAwLCAwLCAwLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBvdmVycmlkZUNvbnRlbnRU
eXBlKTsKK30KKwordm9pZCBXZWJQYWdlOjpsb2FkU3RyaW5nKGNvbnN0IGNoYXIqIHN0cmluZywg
Y29uc3QgY2hhciogYmFzZVVSTCwgY29uc3QgY2hhciogbWltZVR5cGUsIGNvbnN0IGNoYXIqIGZh
aWxpbmdVUkwpCit7CisgICAgZC0+bG9hZFN0cmluZyhzdHJpbmcsIGJhc2VVUkwsIG1pbWVUeXBl
LCBmYWlsaW5nVVJMKTsKK30KKwordm9pZCBXZWJQYWdlOjpkb3dubG9hZChjb25zdCBQbGF0Zm9y
bTo6TmV0d29ya1JlcXVlc3QmIHJlcXVlc3QpCit7CisgICAgZC0+bG9hZChyZXF1ZXN0LmdldFVy
bFJlZigpLmNfc3RyKCksIDAsICJHRVQiLCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OlVzZVBy
b3RvY29sQ2FjaGVQb2xpY3ksIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgIiIpOwor
fQorCitib29sIFdlYlBhZ2U6OmV4ZWN1dGVKYXZhU2NyaXB0KGNvbnN0IGNoYXIqIHNjcmlwdCwg
SmF2YVNjcmlwdERhdGFUeXBlJiByZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKQor
eworICAgIHJldHVybiBkLT5leGVjdXRlSmF2YVNjcmlwdChzY3JpcHQsIHJldHVyblR5cGUsIHJl
dHVyblZhbHVlKTsKK30KKworYm9vbCBXZWJQYWdlOjpleGVjdXRlSmF2YVNjcmlwdEluSXNvbGF0
ZWRXb3JsZChjb25zdCBzdGQ6OndzdHJpbmcmIHNjcmlwdCwgSmF2YVNjcmlwdERhdGFUeXBlJiBy
ZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKQoreworICAgIC8vIE9uIG91ciBwbGF0
Zm9ybSB3Y2hhcl90IGlzIHVuc2lnbmVkIGludCBhbmQgVUNoYXIgaXMgdW5zaWduZWQgc2hvcnQK
KyAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnZlcnQgdXNpbmcgSUNVIGNvbnZlcnNpb24gZnVuY3Rp
b24KKyAgICBpbnQgbGVuZ3RoQ29waWVkID0gMDsKKyAgICBVRXJyb3JDb2RlIGVycm9yID0gVV9a
RVJPX0VSUk9SOworICAgIGNvbnN0IGludCBsZW5ndGggPSBzY3JpcHQubGVuZ3RoKCkgKyAxIC8q
bnVsbCB0ZXJtaW5hdGlvbiBjaGFyKi87CisgICAgVUNoYXIgZGF0YVtsZW5ndGhdOworCisgICAg
Ly8gRklYTUU6IFBSIDEzODE2MiBpcyBnaXZpbmcgVV9JTlZBTElEX0NIQVJfRk9VTkQgZXJyb3Iu
CisgICAgdV9zdHJGcm9tVVRGMzIoZGF0YSwgbGVuZ3RoLCAmbGVuZ3RoQ29waWVkLCByZWludGVy
cHJldF9jYXN0PGNvbnN0IFVDaGFyMzIqPihzY3JpcHQuY19zdHIoKSksIHNjcmlwdC5sZW5ndGgo
KSwgJmVycm9yKTsKKyAgICBCTEFDS0JFUlJZX0FTU0VSVChlcnJvciA9PSBVX1pFUk9fRVJST1Ip
OworICAgIGlmIChlcnJvciAhPSBVX1pFUk9fRVJST1IpIHsKKyAgICAgICAgUGxhdGZvcm06Omxv
Z0Fsd2F5cyhQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIldlYlBhZ2U6OmV4ZWN1dGVKYXZh
U2NyaXB0SW5Jc29sYXRlZFdvcmxkIGZhaWxlZCB0byBjb252ZXJ0IFVURjE2IHRvIEphdmFTY3Jp
cHQhIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgV1RGOjpTdHJpbmcgc3Ry
ID0gV1RGOjpTdHJpbmcoZGF0YSwgbGVuZ3RoQ29waWVkKTsKKyAgICBTY3JpcHRTb3VyY2VDb2Rl
IHNvdXJjZUNvZGUoc3RyLCBLVVJMKCkpOworICAgIHJldHVybiBkLT5leGVjdXRlSmF2YVNjcmlw
dEluSXNvbGF0ZWRXb3JsZChzb3VyY2VDb2RlLCByZXR1cm5UeXBlLCByZXR1cm5WYWx1ZSk7Cit9
CisKK2Jvb2wgV2ViUGFnZTo6ZXhlY3V0ZUphdmFTY3JpcHRJbklzb2xhdGVkV29ybGQoY29uc3Qg
Y2hhciogc2NyaXB0LCBKYXZhU2NyaXB0RGF0YVR5cGUmIHJldHVyblR5cGUsIFdlYlN0cmluZyYg
cmV0dXJuVmFsdWUpCit7CisgICAgU2NyaXB0U291cmNlQ29kZSBzb3VyY2VDb2RlKFdURjo6U3Ry
aW5nOjpmcm9tVVRGOChzY3JpcHQpLCBLVVJMKCkpOworICAgIHJldHVybiBkLT5leGVjdXRlSmF2
YVNjcmlwdEluSXNvbGF0ZWRXb3JsZChzb3VyY2VDb2RlLCByZXR1cm5UeXBlLCByZXR1cm5WYWx1
ZSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c3RvcExvYWRpbmcoKQoreworICAgIGQtPnN0b3BDdXJy
ZW50TG9hZCgpOworfQorCit2b2lkIFdlYlBhZ2U6OnByZXBhcmVUb0Rlc3Ryb3koKQoreworICAg
IGQtPnByZXBhcmVUb0Rlc3Ryb3koKTsKK30KKworaW50IFdlYlBhZ2U6OmJhY2tGb3J3YXJkTGlz
dExlbmd0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fcGFnZS0+Z2V0SGlzdG9yeUxlbmd0
aCgpOworfQorCitib29sIFdlYlBhZ2U6OmNhbkdvQmFja09yRm9yd2FyZChpbnQgZGVsdGEpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGQtPm1fcGFnZS0+Y2FuR29CYWNrT3JGb3J3YXJkKGRlbHRhKTsK
K30KKworYm9vbCBXZWJQYWdlOjpnb0JhY2tPckZvcndhcmQoaW50IGRlbHRhKQoreworICAgIGlm
IChkLT5tX3BhZ2UtPmNhbkdvQmFja09yRm9yd2FyZChkZWx0YSkpIHsKKyAgICAgICAgZC0+bV9w
YWdlLT5nb0JhY2tPckZvcndhcmQoZGVsdGEpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFdlYlBhZ2U6OmdvVG9CYWNrRm9yd2FyZEVu
dHJ5KEJhY2tGb3J3YXJkSWQgaWQpCit7CisgICAgSGlzdG9yeUl0ZW0qIGl0ZW0gPSBoaXN0b3J5
SXRlbUZyb21CYWNrRm9yd2FyZElkKGlkKTsKKyAgICBBU1NFUlQoaXRlbSk7CisgICAgZC0+bV9w
YWdlLT5nb1RvSXRlbShpdGVtLCBGcmFtZUxvYWRUeXBlSW5kZXhlZEJhY2tGb3J3YXJkKTsKK30K
Kwordm9pZCBXZWJQYWdlOjpyZWxvYWQoKQoreworICAgIGQtPm1fbWFpbkZyYW1lLT5sb2FkZXIo
KS0+cmVsb2FkKC8qIGJ5cGFzc0NhY2hlICovIHRydWUpOworfQorCit2b2lkIFdlYlBhZ2U6OnJl
bG9hZEZyb21DYWNoZSgpCit7CisgICAgZC0+bV9tYWluRnJhbWUtPmxvYWRlcigpLT5yZWxvYWQo
LyogYnlwYXNzQ2FjaGUgKi8gZmFsc2UpOworfQorCitXZWJTZXR0aW5ncyogV2ViUGFnZTo6c2V0
dGluZ3MoKSBjb25zdAoreworICAgIHJldHVybiBkLT5tX3dlYlNldHRpbmdzOworfQorCitib29s
IFdlYlBhZ2U6OmlzVmlzaWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fdmlzaWJsZTsK
K30KKwordm9pZCBXZWJQYWdlOjpzZXRWaXNpYmxlKGJvb2wgdmlzaWJsZSkKK3sKKyAgICBpZiAo
ZC0+bV92aXNpYmxlID09IHZpc2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIGQtPm1fdmlz
aWJsZSA9IHZpc2libGU7CisKKyAgICBpZiAoIXZpc2libGUpIHsKKyAgICAgICAgZC0+c3VzcGVu
ZEJhY2tpbmdTdG9yZSgpOworCisgICAgICAgIC8vIFJlbW92ZSB0aGlzIFdlYlBhZ2UgZnJvbSB0
aGUgdmlzaWJsZSBwYWdlcyBsaXN0LgorICAgICAgICBzaXplX3QgZm91bmRJbmRleCA9IHZpc2li
bGVXZWJQYWdlcygpLT5maW5kKHRoaXMpOworICAgICAgICBpZiAoZm91bmRJbmRleCAhPSBXVEY6
Om5vdEZvdW5kKQorICAgICAgICAgICAgdmlzaWJsZVdlYlBhZ2VzKCktPnJlbW92ZShmb3VuZElu
ZGV4KTsKKworICAgICAgICAvLyBSZXR1cm4gdGhlIGJhY2tpbmcgc3RvcmUgdG8gdGhlIGxhc3Qg
dmlzaWJsZSBXZWJQYWdlLgorICAgICAgICBpZiAoQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVu
dEJhY2tpbmdTdG9yZU93bmVyKCkgPT0gdGhpcyAmJiAhdmlzaWJsZVdlYlBhZ2VzKCktPmlzRW1w
dHkoKSkKKyAgICAgICAgICAgIHZpc2libGVXZWJQYWdlcygpLT5sYXN0KCktPmQtPnJlc3VtZUJh
Y2tpbmdTdG9yZSgpOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgICAg
ICAvLyBSb290IGxheWVyIGNvbW1pdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBpbnZpc2libGUgdGFi
cy4KKyAgICAgICAgLy8gQW5kIHJlbGVhc2UgbGF5ZXIgcmVzb3VyY2VzIGNhbiByZWR1Y2UgbWVt
b3J5IGNvbnN1bXB0aW9uLgorICAgICAgICBkLT5zdXNwZW5kUm9vdExheWVyQ29tbWl0KCk7Cisj
ZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKKyAgICBkLT5yZXN1bWVSb290TGF5ZXJDb21taXQoKTsKKyNlbmRpZgorCisgICAg
Ly8gUHVzaCB0aGlzIFdlYlBhZ2UgdG8gdGhlIHRvcCBvZiB0aGUgdmlzaWJsZSBwYWdlcyBsaXN0
LgorICAgIGlmICghdmlzaWJsZVdlYlBhZ2VzKCktPmlzRW1wdHkoKSAmJiB2aXNpYmxlV2ViUGFn
ZXMoKS0+bGFzdCgpICE9IHRoaXMpIHsKKyAgICAgICAgc2l6ZV90IGZvdW5kSW5kZXggPSB2aXNp
YmxlV2ViUGFnZXMoKS0+ZmluZCh0aGlzKTsKKyAgICAgICAgaWYgKGZvdW5kSW5kZXggIT0gV1RG
Ojpub3RGb3VuZCkKKyAgICAgICAgICAgIHZpc2libGVXZWJQYWdlcygpLT5yZW1vdmUoZm91bmRJ
bmRleCk7CisgICAgfQorICAgIHZpc2libGVXZWJQYWdlcygpLT5hcHBlbmQodGhpcyk7CisKKyAg
ICBpZiAoQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9yZU93bmVyKCkKKyAg
ICAgICAgJiYgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9yZU93bmVyKCkg
IT0gdGhpcykKKyAgICAgICAgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9y
ZU93bmVyKCktPmQtPnN1c3BlbmRCYWNraW5nU3RvcmUoKTsKKworICAgIC8vIHJlc3VtZUJhY2tp
bmdTdG9yZSB3aWxsIHNldCB0aGUgY3VycmVudCBvd25lciB0byB0aGlzIHdlYnBhZ2UuCisgICAg
Ly8gSWYgd2Ugc2V0IHRoZSBvd25lciBwcmVtYXR1cmVseSwgdGhlbiB0aGUgdGlsZXMgd2lsbCBu
b3QgYmUgcmVzZXQuCisgICAgZC0+cmVzdW1lQmFja2luZ1N0b3JlKCk7Cit9CisKK3ZvaWQgV2Vi
UGFnZVByaXZhdGU6OnNlbGVjdGlvbkNoYW5nZWQoRnJhbWUqIGZyYW1lKQoreworICAgIG1faW5w
dXRIYW5kbGVyLT5zZWxlY3Rpb25DaGFuZ2VkKCk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBh
IGhhY2shCisgICAgLy8gVG8gZW5zdXJlIHRoZSBzZWxlY3Rpb24gYmVpbmcgY2hhbmdlZCBoYXMg
aXRzIGZyYW1lICdmb2N1c2VkJywgbGV0cworICAgIC8vIHNldCBpdCBhcyBmb2N1c2VkIG91cnNl
bHZlcyAoUFIgIzEwNDcyNCkuCisgICAgbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+c2V0Rm9j
dXNlZEZyYW1lKGZyYW1lKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6dXBkYXRlRGVsZWdh
dGVkT3ZlcmxheXMoYm9vbCBkaXNwYXRjaGVkKQoreworICAgIC8vIFRyYWNrIGEgZGlzcGF0Y2hl
ZCBtZXNzYWdlLCB3ZSBkb24ndCB3YW50IHRvIGZsb29kIHRoZSB3ZWJraXQgdGhyZWFkLgorICAg
IC8vIFRoZXJlIGNhbiBiZSBhcyBtYW55IGFzIG9uZSBtb3JlIG1lc3NhZ2UgZW5xdWVkIGFzIG5l
ZWRlZCBidXQgbmV2ZXIgbGVzcy4KKyAgICBpZiAoZGlzcGF0Y2hlZCkKKyAgICAgICAgbV91cGRh
dGVEZWxlZ2F0ZWRPdmVybGF5c0Rpc3BhdGNoZWQgPSBmYWxzZTsKKyAgICBlbHNlIGlmIChtX3Vw
ZGF0ZURlbGVnYXRlZE92ZXJsYXlzRGlzcGF0Y2hlZCkgeworICAgICAgICAvLyBFYXJseSByZXR1
cm4gaWYgdGhlcmUgaXMgbWVzc2FnZSBhbHJlYWR5IHBlbmRpbmcgb24gdGhlIHdlYmtpdCB0aHJl
YWQuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoUGxhdGZvcm06OndlYktpdFRo
cmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgLy8gTXVz
dCBiZSBjYWxsZWQgb24gdGhlIFdlYktpdCB0aHJlYWQuCisgICAgICAgIGlmIChtX3NlbGVjdGlv
bkhhbmRsZXItPmlzU2VsZWN0aW9uQWN0aXZlKCkpCisgICAgICAgICAgICBtX3NlbGVjdGlvbkhh
bmRsZXItPnNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCh0cnVlIC8qIHZpc3VhbENoYW5nZU9ubHkg
Ki8pOworCisgICAgfSBlbHNlIGlmIChtX3NlbGVjdGlvbkhhbmRsZXItPmlzU2VsZWN0aW9uQWN0
aXZlKCkpIHsKKyAgICAgICAgLy8gRG9uJ3QgYm90aGVyIGRpc3BhdGNoaW5nIHRvIHdlYmtpdCB0
aHJlYWQgaWYgc2VsZWN0aW9uIGFuZCB0YXAgaGlnaGxpZ2h0IGFyZSBub3QgYWN0aXZlLgorICAg
ICAgICBtX3VwZGF0ZURlbGVnYXRlZE92ZXJsYXlzRGlzcGF0Y2hlZCA9IHRydWU7CisgICAgICAg
IFBsYXRmb3JtOjp3ZWJLaXRUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoTWVzc2FnZShQ
bGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJldlYlBhZ2VQcml2YXRlOjp1cGRhdGVE
ZWxlZ2F0ZWRPdmVybGF5cywgdGhpcywgdHJ1ZSAvKmRpc3BhdGNoZWQqLykpOworICAgIH0KK30K
Kwordm9pZCBXZWJQYWdlOjpzZXRDYXJldEhpZ2hsaWdodFN0eWxlKFBsYXRmb3JtOjpDYXJldEhp
Z2hsaWdodFN0eWxlIHN0eWxlKQoreworfQorCitib29sIFdlYlBhZ2U6OnNldEJhdGNoRWRpdGlu
Z0FjdGl2ZShib29sIGFjdGl2ZSkKK3sKKyAgICByZXR1cm4gZC0+bV9pbnB1dEhhbmRsZXItPnNl
dEJhdGNoRWRpdGluZ0FjdGl2ZShhY3RpdmUpOworfQorCitib29sIFdlYlBhZ2U6OnNldElucHV0
U2VsZWN0aW9uKHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQpCit7CisgICAgcmV0dXJuIGQt
Pm1faW5wdXRIYW5kbGVyLT5zZXRTZWxlY3Rpb24oc3RhcnQsIGVuZCk7Cit9CisKK2ludCBXZWJQ
YWdlOjppbnB1dENhcmV0UG9zaXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBkLT5tX2lucHV0
SGFuZGxlci0+Y2FyZXRQb3NpdGlvbigpOworfQorCit2b2lkIFdlYlBhZ2U6OnBvcHVwTGlzdENs
b3NlZChpbnQgc2l6ZSwgYm9vbCogc2VsZWN0ZWRzKQoreworICAgIGQtPm1faW5wdXRIYW5kbGVy
LT5zZXRQb3B1cExpc3RJbmRleGVzKHNpemUsIHNlbGVjdGVkcyk7Cit9CisKK3ZvaWQgV2ViUGFn
ZTo6cG9wdXBMaXN0Q2xvc2VkKGludCBpbmRleCkKK3sKKyAgICBkLT5tX2lucHV0SGFuZGxlci0+
c2V0UG9wdXBMaXN0SW5kZXgoaW5kZXgpOworfQorCit2b2lkIFdlYlBhZ2U6OnNldERhdGVUaW1l
SW5wdXQoY29uc3QgV2ViU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBkLT5tX2lucHV0SGFuZGxlci0+
c2V0SW5wdXRWYWx1ZShTdHJpbmcodmFsdWUuaW1wbCgpKSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6
c2V0Q29sb3JJbnB1dChjb25zdCBXZWJTdHJpbmcmIHZhbHVlKQoreworICAgIGQtPm1faW5wdXRI
YW5kbGVyLT5zZXRJbnB1dFZhbHVlKFN0cmluZyh2YWx1ZS5pbXBsKCkpKTsKK30KKworQWN0aXZl
Tm9kZUNvbnRleHQgV2ViUGFnZTo6YWN0aXZlTm9kZUNvbnRleHQoVGFyZ2V0RGV0ZWN0aW9uU3Ry
YXRlZ3kgc3RyYXRlZ3kpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmFjdGl2ZU5vZGVDb250ZXh0
KHN0cmF0ZWd5KTsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRWaXJ0dWFsVmlld3BvcnRTaXplKGlu
dCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBkLT5tX3ZpcnR1YWxWaWV3cG9ydFdpZHRoID0g
d2lkdGg7CisgICAgZC0+bV92aXJ0dWFsVmlld3BvcnRIZWlnaHQgPSBoZWlnaHQ7Cit9CisKK3Zv
aWQgV2ViUGFnZTo6cmVzZXRWaXJ0dWFsVmlld3BvcnRPbkNvbW1pdHRlZChib29sIHJlc2V0KQor
eworICAgIGQtPm1fcmVzZXRWaXJ0dWFsVmlld3BvcnRPbkNvbW1pdHRlZCA9IHJlc2V0OworfQor
CitJbnRTaXplIFdlYlBhZ2VQcml2YXRlOjpyZWNvbXB1dGVWaXJ0dWFsVmlld3BvcnRGcm9tVmll
d3BvcnRBcmd1bWVudHMoKQoreworICAgIHN0YXRpYyBWaWV3cG9ydEFyZ3VtZW50cyBkZWZhdWx0
Vmlld3BvcnRBcmd1bWVudHM7CisgICAgaWYgKG1fdmlld3BvcnRBcmd1bWVudHMgPT0gZGVmYXVs
dFZpZXdwb3J0QXJndW1lbnRzKQorICAgICAgICByZXR1cm4gSW50U2l6ZSgpOworCisgICAgaW50
IGRlc2t0b3BXaWR0aCA9IGRlZmF1bHRNYXhMYXlvdXRTaXplKCkud2lkdGgoKTsKKyAgICBpbnQg
ZGV2aWNlV2lkdGggPSBQbGF0Zm9ybTo6R3JhcGhpY3M6OlNjcmVlbjo6d2lkdGgoKTsKKyAgICBp
bnQgZGV2aWNlSGVpZ2h0ID0gUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OmhlaWdodCgpOwor
ICAgIEZsb2F0U2l6ZSBjdXJyZW50UFBJID0gUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OnBp
eGVsc1BlckluY2goLTEpOworICAgIGludCBkZXZpY2VEUEkgPSBpbnQocm91bmRmKChjdXJyZW50
UFBJLndpZHRoKCkgKyBjdXJyZW50UFBJLmhlaWdodCgpKSAvIDIpKTsKKyAgICBpZiAobV92aWV3
cG9ydEFyZ3VtZW50cy50YXJnZXREZW5zaXR5RHBpID09IFZpZXdwb3J0QXJndW1lbnRzOjpWYWx1
ZUF1dG8pIHsKKyAgICAgICAgLy8gQXV0byBtZWFucyAxNjBkcGkgaWYgd2UgbGVhdmUgaXQgYWxv
bmUuIFRoaXMgbG9va3MgdGVycmlibGUgZm9yIHBhZ2VzIHdhbnRpbmcgMToxLgorICAgICAgICAv
LyBGSVhNRTogVGhpcyBpcyBpbnN1ZmZpY2llbnQgZm9yIGRldmljZXMgd2l0aCBoaWdoIGRwaSwg
YXMgdGhleSB3aWxsIHJlbmRlciBjb250ZW50IHVucmVhZGFibHkgc21hbGwuCisgICAgICAgIG1f
dmlld3BvcnRBcmd1bWVudHMudGFyZ2V0RGVuc2l0eURwaSA9IGRldmljZURQSTsKKyAgICB9CisK
KyAgICBWaWV3cG9ydEF0dHJpYnV0ZXMgcmVzdWx0ID0gY29tcHV0ZVZpZXdwb3J0QXR0cmlidXRl
cyhtX3ZpZXdwb3J0QXJndW1lbnRzLCBkZXNrdG9wV2lkdGgsIGRldmljZVdpZHRoLCBkZXZpY2VI
ZWlnaHQsIGRldmljZURQSSwgbV9kZWZhdWx0TGF5b3V0U2l6ZSk7CisgICAgcmV0dXJuIEludFNp
emUocmVzdWx0LmxheW91dFNpemUud2lkdGgoKSwgcmVzdWx0LmxheW91dFNpemUuaGVpZ2h0KCkp
OworfQorCisjaWYgRU5BQkxFKEVWRU5UX01PREVfTUVUQVRBR1MpCit2b2lkIFdlYlBhZ2VQcml2
YXRlOjpkaWRSZWNlaXZlQ3Vyc29yRXZlbnRNb2RlKEN1cnNvckV2ZW50TW9kZSBtb2RlKQorewor
ICAgIGlmIChtb2RlICE9IG1fY3Vyc29yRXZlbnRNb2RlKQorICAgICAgICBtX2NsaWVudC0+Y3Vy
c29yRXZlbnRNb2RlQ2hhbmdlZCh0b1BsYXRmb3JtQ3Vyc29yRXZlbnRNb2RlKG1vZGUpKTsKKyAg
ICBtX2N1cnNvckV2ZW50TW9kZSA9IG1vZGU7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmRp
ZFJlY2VpdmVUb3VjaEV2ZW50TW9kZShUb3VjaEV2ZW50TW9kZSBtb2RlKQoreworICAgIGlmICht
b2RlICE9IG1fdG91Y2hFdmVudE1vZGUpCisgICAgICAgIG1fY2xpZW50LT50b3VjaEV2ZW50TW9k
ZUNoYW5nZWQodG9QbGF0Zm9ybVRvdWNoRXZlbnRNb2RlKG1vZGUpKTsKKyAgICBtX3RvdWNoRXZl
bnRNb2RlID0gbW9kZTsKK30KKyNlbmRpZgorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpkaXNwYXRj
aFZpZXdwb3J0UHJvcGVydGllc0RpZENoYW5nZShjb25zdCBWaWV3cG9ydEFyZ3VtZW50cyYgYXJn
dW1lbnRzKQoreworICAgIHN0YXRpYyBWaWV3cG9ydEFyZ3VtZW50cyBkZWZhdWx0Vmlld3BvcnRB
cmd1bWVudHM7CisgICAgaWYgKGFyZ3VtZW50cyA9PSBkZWZhdWx0Vmlld3BvcnRBcmd1bWVudHMp
CisgICAgICAgIHJldHVybjsKKworICAgIG1fdmlld3BvcnRBcmd1bWVudHMgPSBhcmd1bWVudHM7
CisKKyAgICAvLyAwIHdpZHRoIG9yIGhlaWdodCBpbiB2aWV3cG9ydCBhcmd1bWVudHMgbWFrZXMg
bm8gc2Vuc2UsIGFuZCByZXN1bHRzIGluIGEgdmVyeSBsYXJnZSBpbml0aWFsIHNjYWxlLgorICAg
IC8vIEluIHJlYWwgd29ybGQsIGEgMCB3aWR0aCBvciBoZWlnaHQgaXMgdXN1YWxseSBjYXVzZWQg
YnkgYSBzeW50YXggZXJyb3IgaW4gImNvbnRlbnQiIGZpZWxkIG9mIHZpZXdwb3J0CisgICAgLy8g
bWV0YSB0YWcsIGZvciBleGFtcGxlLCB1c2luZyBzZW1pY29sb24gaW5zdGVhZCBvZiBjb21tYSBh
cyBzZXBhcmF0b3IgKCJ3aWR0aD1kZXZpY2Utd2lkdGg7IGluaXRpYWwtc2NhbGU9MS4wIikuCisg
ICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIHBsYW4gdG8gdG9sZXJhdGUgdGhlIHNlbWljb2xvbiBzZXBh
cmF0b3IsIGJ1dCB3ZSBjYW4gYXZvaWQgYXBwbHlpbmcgMCB3aWR0aC9oZWlnaHQuCisgICAgLy8g
SSBkZWZhdWx0IGl0IHRvIFZhbHVlRGV2aWNlV2lkdGggcmF0aGVyIHRoYW4gVmFsdWVBdXRvIGJl
Y2F1c2UgaW4gbW9yZSBjYXNlcyB0aGUgd2ViIHNpdGUgd2FudHMgImRldmljZS13aWR0aCIKKyAg
ICAvLyB3aGVuIHRoZXkgc3BlY2lmeSB0aGUgdmlld3BvcnQgd2lkdGguCisgICAgaWYgKCFtX3Zp
ZXdwb3J0QXJndW1lbnRzLndpZHRoKQorICAgICAgICBtX3ZpZXdwb3J0QXJndW1lbnRzLndpZHRo
ID0gVmlld3BvcnRBcmd1bWVudHM6OlZhbHVlRGV2aWNlV2lkdGg7CisgICAgaWYgKCFtX3ZpZXdw
b3J0QXJndW1lbnRzLmhlaWdodCkKKyAgICAgICAgbV92aWV3cG9ydEFyZ3VtZW50cy5oZWlnaHQg
PSBWaWV3cG9ydEFyZ3VtZW50czo6VmFsdWVEZXZpY2VIZWlnaHQ7CisKKyAgICBzZXRVc2VyU2Nh
bGFibGUoYXJndW1lbnRzLnVzZXJTY2FsYWJsZSA9PSBWaWV3cG9ydEFyZ3VtZW50czo6VmFsdWVB
dXRvID8gdHJ1ZSA6IGFyZ3VtZW50cy51c2VyU2NhbGFibGUpOworICAgIGlmIChhcmd1bWVudHMu
aW5pdGlhbFNjYWxlID4gMCkKKyAgICAgICAgc2V0SW5pdGlhbFNjYWxlKGFyZ3VtZW50cy5pbml0
aWFsU2NhbGUpOworICAgIGlmIChhcmd1bWVudHMubWluaW11bVNjYWxlID4gMCkKKyAgICAgICAg
c2V0TWluaW11bVNjYWxlKGFyZ3VtZW50cy5taW5pbXVtU2NhbGUpOworICAgIGlmIChhcmd1bWVu
dHMubWF4aW11bVNjYWxlID4gMCkKKyAgICAgICAgc2V0TWF4aW11bVNjYWxlKGFyZ3VtZW50cy5t
YXhpbXVtU2NhbGUpOworCisgICAgSW50U2l6ZSB2aXJ0dWFsVmlld3BvcnQgPSByZWNvbXB1dGVW
aXJ0dWFsVmlld3BvcnRGcm9tVmlld3BvcnRBcmd1bWVudHMoKTsKKyAgICBtX3dlYlBhZ2UtPnNl
dFZpcnR1YWxWaWV3cG9ydFNpemUodmlydHVhbFZpZXdwb3J0LndpZHRoKCksIHZpcnR1YWxWaWV3
cG9ydC5oZWlnaHQoKSk7CisKKyAgICBpZiAobG9hZFN0YXRlKCkgPT0gV2ViS2l0OjpXZWJQYWdl
UHJpdmF0ZTo6Q29tbWl0dGVkKQorICAgICAgICB6b29tVG9Jbml0aWFsU2NhbGVPbkxvYWQoKTsK
K30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6b25JbnB1dExvY2FsZUNoYW5nZWQoYm9vbCBpc1JU
TCkKK3sKKyAgICBpZiAoaXNSVEwgIT0gbV93ZWJTZXR0aW5ncy0+aXNXcml0aW5nRGlyZWN0aW9u
UlRMKCkpIHsKKyAgICAgICAgbV93ZWJTZXR0aW5ncy0+c2V0V3JpdGluZ0RpcmVjdGlvblJUTChp
c1JUTCk7CisgICAgICAgIG1faW5wdXRIYW5kbGVyLT5oYW5kbGVJbnB1dExvY2FsZUNoYW5nZWQo
aXNSVEwpOworICAgIH0KK30KKwordm9pZCBXZWJQYWdlOjpzZXRTY3JlZW5PcmllbnRhdGlvbihp
bnQgb3JpZW50YXRpb24pCit7CisgICAgZC0+bV9wZW5kaW5nT3JpZW50YXRpb24gPSBvcmllbnRh
dGlvbjsKK30KKwordm9pZCBXZWJQYWdlOjphcHBseVBlbmRpbmdPcmllbnRhdGlvbklmTmVlZGVk
KCkKK3sKKyAgICBpZiAoZC0+bV9wZW5kaW5nT3JpZW50YXRpb24gIT0gLTEpCisgICAgICAgIGQt
PnNldFNjcmVlbk9yaWVudGF0aW9uKGQtPm1fcGVuZGluZ09yaWVudGF0aW9uKTsKK30KKwordm9p
ZCBXZWJQYWdlUHJpdmF0ZTo6c3VzcGVuZEJhY2tpbmdTdG9yZSgpCit7CisjaWYgVVNFKEFDQ0VM
RVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIHJlc2V0Q29tcG9zaXRpbmdTdXJmYWNlKCk7CisjZW5k
aWYKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6cmVzdW1lQmFja2luZ1N0b3JlKCkKK3sKKyAg
ICBBU1NFUlQobV93ZWJQYWdlLT5pc1Zpc2libGUoKSk7CisKKyNpZiBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCisgICAgc2V0TmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigp
OworI2VuZGlmCisKKyAgICBib29sIGRpcmVjdFJlbmRlcmluZyA9IG1fYmFja2luZ1N0b3JlLT5k
LT5zaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpOworICAgIGlmICghbV9iYWNraW5nU3Rv
cmUtPmQtPmlzQWN0aXZlKCkKKyAgICAgICAgfHwgc2hvdWxkUmVzZXRUaWxlc1doZW5TaG93bigp
CisgICAgICAgIHx8IGRpcmVjdFJlbmRlcmluZykgeworICAgICAgICAvLyBXZSBuZWVkIHRvIHJl
c2V0IGFsbCB0aWxlcyBzbyB0aGF0IHdlIGRvIG5vdCBzaG93IGFueSB0aWxlcyB3aG9zZSBjb250
ZW50IG1heQorICAgICAgICAvLyBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgYW5vdGhlciBXZWJQYWdl
IGluc3RhbmNlIChpLmUuIGFub3RoZXIgdGFiKS4KKyAgICAgICAgQmFja2luZ1N0b3JlUHJpdmF0
ZTo6c2V0Q3VycmVudEJhY2tpbmdTdG9yZU93bmVyKG1fd2ViUGFnZSk7CisgICAgICAgIG1fYmFj
a2luZ1N0b3JlLT5kLT5vcmllbnRhdGlvbkNoYW5nZWQoKTsgLy8gVXBkYXRlcyB0aWxlIGdlb21l
dHJ5IGFuZCBjcmVhdGVzIHZpc2libGUgdGlsZSBidWZmZXIKKyAgICAgICAgbV9iYWNraW5nU3Rv
cmUtPmQtPnJlc2V0VGlsZXModHJ1ZSAvKiByZXNldEJhY2tncm91bmQgKi8pOworICAgICAgICBt
X2JhY2tpbmdTdG9yZS0+ZC0+dXBkYXRlVGlsZXMoZmFsc2UgLyogdXBkYXRlVmlzaWJsZSAqLywg
ZmFsc2UgLyogaW1tZWRpYXRlICovKTsKKyAgICAgICAgLy8gVGhpcyB2YWx1ZSBtYXkgaGF2ZSBj
aGFuZ2VkLCBzbyB3ZSBuZWVkIHRvIHVwZGF0ZSBpdC4KKyAgICAgICAgZGlyZWN0UmVuZGVyaW5n
ID0gbV9iYWNraW5nU3RvcmUtPmQtPnNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCk7Cisg
ICAgICAgIGlmIChtX2JhY2tpbmdTdG9yZS0+ZC0+cmVuZGVyVmlzaWJsZUNvbnRlbnRzKCkgJiYg
IW1fYmFja2luZ1N0b3JlLT5kLT5pc1N1c3BlbmRlZCgpICYmICFkaXJlY3RSZW5kZXJpbmcpCisg
ICAgICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+YmxpdFZpc2libGVDb250ZW50cygpOworICAg
IH0gZWxzZSB7CisgICAgICAgIC8vIFJlbmRlcmluZyB3YXMgZGlzYWJsZWQgd2hpbGUgd2Ugd2Vy
ZSBoaWRkZW4sIHNvIHdlIG5lZWQgdG8gdXBkYXRlIGFsbCB0aWxlcy4KKyAgICAgICAgbV9iYWNr
aW5nU3RvcmUtPmQtPnVwZGF0ZVRpbGVzKHRydWUgLyogdXBkYXRlVmlzaWJsZSAqLywgZmFsc2Ug
LyogaW1tZWRpYXRlICovKTsKKyAgICB9CisKKyAgICBzZXRTaG91bGRSZXNldFRpbGVzV2hlblNo
b3duKGZhbHNlKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0U2NyZWVuT3JpZW50YXRp
b24oaW50IG9yaWVudGF0aW9uKQoreworICAgIEhhc2hTZXQ8UGx1Z2luVmlldyo+Ojpjb25zdF9p
dGVyYXRvciBpdCA9IG1fcGx1Z2luVmlld3MuYmVnaW4oKTsKKyAgICBIYXNoU2V0PFBsdWdpblZp
ZXcqPjo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IG1fcGx1Z2luVmlld3MuZW5kKCk7CisgICAgZm9y
ICg7IGl0ICE9IGxhc3Q7ICsraXQpCisgICAgICAgICgqaXQpLT5oYW5kbGVPcmllbnRhdGlvbkV2
ZW50KG9yaWVudGF0aW9uKTsKKworICAgIG1fcGVuZGluZ09yaWVudGF0aW9uID0gLTE7CisKKyNp
ZiBFTkFCTEUoT1JJRU5UQVRJT05fRVZFTlRTKQorICAgIGlmIChtX21haW5GcmFtZS0+b3JpZW50
YXRpb24oKSA9PSBvcmllbnRhdGlvbikKKyAgICAgICAgcmV0dXJuOworICAgIGZvciAoUmVmUHRy
PEZyYW1lPiBmcmFtZSA9IG1fbWFpbkZyYW1lOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgp
LT50cmF2ZXJzZU5leHQoKSkKKyAgICAgICAgZnJhbWUtPnNlbmRPcmllbnRhdGlvbkNoYW5nZUV2
ZW50KG9yaWVudGF0aW9uKTsKKyNlbmRpZgorfQorCitQbGF0Zm9ybTo6SW50U2l6ZSBXZWJQYWdl
Ojp2aWV3cG9ydFNpemUoKSBjb25zdAoreworICAgIHJldHVybiBkLT50cmFuc2Zvcm1lZEFjdHVh
bFZpc2libGVTaXplKCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0Vmlld3BvcnRTaXplKGNvbnN0
IFBsYXRmb3JtOjpJbnRTaXplJiB2aWV3cG9ydFNpemUsIGJvb2wgZW5zdXJlRm9jdXNFbGVtZW50
VmlzaWJsZSkKK3sKKyAgICBkLT5zZXRWaWV3cG9ydFNpemUodmlld3BvcnRTaXplLCBlbnN1cmVG
b2N1c0VsZW1lbnRWaXNpYmxlKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2NyZWVuUm90
YXRlZCgpCit7CisgICAgLy8gVGhpcyBjYWxsIHdpbGwgY2F1c2UgdGhlIGNsaWVudCB0byByZWFs
bG9jYXRlIHRoZSB3aW5kb3cgYnVmZmVyIHRvIG5ldyBzaXplLAorICAgIC8vIHdoaWNoIG5lZWRz
IHRvIGJlIHNlcmlhbGl6ZWQgd2l0aCB1c2FnZSBvZiB0aGUgd2luZG93IGJ1ZmZlci4gQWNjb21w
bGlzaAorICAgIC8vIHRoaXMgYnkgc2VuZGluZyBhIHN5bmMgbWVzc2FnZSB0byB0aGUgY29tcG9z
aXRpbmcgdGhyZWFkLiBBbGwgb3RoZXIgdXNhZ2Ugb2YKKyAgICAvLyB0aGUgd2luZG93IGJ1ZmZl
ciBoYXBwZW5zIG9uIHRoZSBjb21wb3NpdGluZyB0aHJlYWQuCisgICAgaWYgKCFQbGF0Zm9ybTo6
dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpIHsK
KyAgICAgICAgUGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmRp
c3BhdGNoU3luY01lc3NhZ2UoCisgICAgICAgICAgICBQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2Fs
bE1lc3NhZ2UoJldlYlBhZ2VQcml2YXRlOjpzY3JlZW5Sb3RhdGVkLCB0aGlzKSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICBTdXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+
bm90aWZ5U2NyZWVuUm90YXRlZCgpOworICAgIG1fY2xpZW50LT5ub3RpZnlTY3JlZW5Sb3RhdGVk
KCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldFZpZXdwb3J0U2l6ZShjb25zdCBJbnRT
aXplJiB0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplLCBib29sIGVuc3VyZUZvY3VzRWxlbWVu
dFZpc2libGUpCit7CisgICAgaWYgKG1fcGVuZGluZ09yaWVudGF0aW9uID09IC0xICYmIHRyYW5z
Zm9ybWVkQWN0dWFsVmlzaWJsZVNpemUgPT0gdGhpcy0+dHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxl
U2l6ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBTdXNwZW5kIGFsbCBzY3JlZW4gdXBk
YXRlcyB0byB0aGUgYmFja2luZ3N0b3JlIHRvIG1ha2Ugc3VyZSBuby1vbmUgdHJpZXMgdG8gYmxp
dAorICAgIC8vIHdoaWxlIHRoZSB3aW5kb3cgc3VyZmFjZSBhbmQgdGhlIEJhY2tpbmdTdG9yZSBh
cmUgb3V0IG9mIHN5bmMuCisgICAgbV9iYWNraW5nU3RvcmUtPmQtPnN1c3BlbmRTY3JlZW5BbmRC
YWNraW5nU3RvcmVVcGRhdGVzKCk7CisKKyAgICAvLyBUaGUgc2NyZWVuIHJvdGF0aW9uIGlzIGEg
bWFqb3Igc3RhdGUgdHJhbnNpdGlvbiB0aGF0IGluIHRoaXMgY2FzZSBpcyBub3QgcHJvcGVybHkK
KyAgICAvLyBjb21tdW5pY2F0ZWQgdG8gdGhlIGJhY2tpbmcgc3RvcmUsIHNpbmNlIGl0IGRvZXMg
ZWFybHkgcmV0dXJuIGluIG1vc3QgbWV0aG9kcyB3aGVuCisgICAgLy8gbm90IHZpc2libGUuCisg
ICAgaWYgKCFtX3Zpc2libGUgfHwgIW1fYmFja2luZ1N0b3JlLT5kLT5pc0FjdGl2ZSgpKQorICAg
ICAgICBzZXRTaG91bGRSZXNldFRpbGVzV2hlblNob3duKHRydWUpOworCisgICAgYm9vbCBoYXNQ
ZW5kaW5nT3JpZW50YXRpb24gPSBtX3BlbmRpbmdPcmllbnRhdGlvbiAhPSAtMTsKKyAgICBpZiAo
aGFzUGVuZGluZ09yaWVudGF0aW9uKQorICAgICAgICBzY3JlZW5Sb3RhdGVkKCk7CisKKyAgICAv
LyBUaGUgd2luZG93IGJ1ZmZlcnMgbWlnaHQgaGF2ZSBiZWVuIHJlY3JlYXRlZCwgY2xlYXJlZCwg
bW92ZWQsIGV0Yy4sIHNvOgorICAgIG1fYmFja2luZ1N0b3JlLT5kLT53aW5kb3dGcm9udEJ1ZmZl
clN0YXRlKCktPmNsZWFyQmxpdHRlZFJlZ2lvbigpOworICAgIG1fYmFja2luZ1N0b3JlLT5kLT53
aW5kb3dCYWNrQnVmZmVyU3RhdGUoKS0+Y2xlYXJCbGl0dGVkUmVnaW9uKCk7CisKKyAgICBJbnRT
aXplIHZpZXdwb3J0U2l6ZUJlZm9yZSA9IGFjdHVhbFZpc2libGVTaXplKCk7CisgICAgRmxvYXRQ
b2ludCBjZW50ZXJPZlZpc2libGVDb250ZW50c1JlY3QgPSB0aGlzLT5jZW50ZXJPZlZpc2libGVD
b250ZW50c1JlY3QoKTsKKyAgICBib29sIG5ld1Zpc2libGVSZWN0Q29udGFpbnNPbGRWaXNpYmxl
UmVjdCA9IChtX2FjdHVhbFZpc2libGVIZWlnaHQgPD0gdHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxl
U2l6ZS5oZWlnaHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICYmIChtX2FjdHVhbFZpc2libGVXaWR0aCA8PSB0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXpl
LndpZHRoKCkpOworCisgICAgYm9vbCBhdEluaXRpYWxTY2FsZSA9IGN1cnJlbnRTY2FsZSgpID09
IGluaXRpYWxTY2FsZSgpOworICAgIGJvb2wgYXRUb3AgPSAhc2Nyb2xsUG9zaXRpb24oKS55KCk7
CisgICAgYm9vbCBhdExlZnQgPSAhc2Nyb2xsUG9zaXRpb24oKS54KCk7CisKKyAgICAvLyBXZSBu
ZWVkIHRvIHJlb3JpZW50IHRoZSB2aXNpYmxlVGlsZVJlY3QgYmVjYXVzZSB0aGUgZm9sbG93aW5n
IGNvZGUKKyAgICAvLyBjb3VsZCBjYXVzZSBCYWNraW5nU3RvcmU6OnRyYW5zZm9ybUNoYW5nZWQg
dG8gYmUgY2FsbGVkLCB3aGVyZSBpdAorICAgIC8vIGlzIHVzZWQuCisgICAgLy8gSXQgaXMgb25s
eSBkZXBlbmRlbnQgb24gdGhlIHRyYW5zZm9ybWVkVmlld3BvcnRTaXplIHdoaWNoIGhhcyBiZWVu
CisgICAgLy8gdXBkYXRlZCBieSBub3cuCisgICAgbV9iYWNraW5nU3RvcmUtPmQtPmNyZWF0ZVZp
c2libGVUaWxlQnVmZmVyKCk7CisKKyAgICBzZXREZWZhdWx0TGF5b3V0U2l6ZSh0cmFuc2Zvcm1l
ZEFjdHVhbFZpc2libGVTaXplKTsKKworICAgIC8vIFJlY29tcHV0ZSBvdXIgdmlydHVhbCB2aWV3
cG9ydC4KKyAgICBib29sIG5lZWRzTGF5b3V0ID0gZmFsc2U7CisgICAgc3RhdGljIFZpZXdwb3J0
QXJndW1lbnRzIGRlZmF1bHRWaWV3cG9ydEFyZ3VtZW50czsKKyAgICBpZiAoIShtX3ZpZXdwb3J0
QXJndW1lbnRzID09IGRlZmF1bHRWaWV3cG9ydEFyZ3VtZW50cykpIHsKKyAgICAgICAgLy8gV2Ug
bWF5IG5lZWQgdG8gaW5mZXIgdGhlIHdpZHRoIGFuZCBoZWlnaHQgZm9yIHRoZSB2aWV3cG9ydCB3
aXRoIHJlc3BlY3QgdG8gdGhlIHJvdGF0aW9uLgorICAgICAgICBJbnRTaXplIG5ld1ZpcnR1YWxW
aWV3cG9ydCA9IHJlY29tcHV0ZVZpcnR1YWxWaWV3cG9ydEZyb21WaWV3cG9ydEFyZ3VtZW50cygp
OworICAgICAgICBBU1NFUlQoIW5ld1ZpcnR1YWxWaWV3cG9ydC5pc0VtcHR5KCkpOworICAgICAg
ICBtX3dlYlBhZ2UtPnNldFZpcnR1YWxWaWV3cG9ydFNpemUobmV3VmlydHVhbFZpZXdwb3J0Lndp
ZHRoKCksIG5ld1ZpcnR1YWxWaWV3cG9ydC5oZWlnaHQoKSk7CisgICAgICAgIG1fbWFpbkZyYW1l
LT52aWV3KCktPnNldFVzZUZpeGVkTGF5b3V0KHVzZUZpeGVkTGF5b3V0KCkpOworICAgICAgICBt
X21haW5GcmFtZS0+dmlldygpLT5zZXRGaXhlZExheW91dFNpemUoZml4ZWRMYXlvdXRTaXplKCkp
OworICAgICAgICBuZWVkc0xheW91dCA9IHRydWU7CisgICAgfQorCisgICAgLy8gV2Ugc3dpdGNo
IHRoaXMgc3RyaWN0bHkgYWZ0ZXIgcmVjb21wdXRpbmcgb3VyIHZpcnR1YWwgdmlld3BvcnQgYXMg
em9vbVRvRml0U2NhbGUgaXMgZGVwZW5kZW50CisgICAgLy8gdXBvbiB0aGVzZSB2YWx1ZXMgYW5k
IHNvIGlzIHRoZSB2aXJ0dWFsIHZpZXdwb3J0IHJlY2FsY3VsYXRpb24uCisgICAgbV9hY3R1YWxW
aXNpYmxlV2lkdGggPSB0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplLndpZHRoKCk7CisgICAg
bV9hY3R1YWxWaXNpYmxlSGVpZ2h0ID0gdHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZS5oZWln
aHQoKTsKKworICAgIEludFNpemUgdmlld3BvcnRTaXplQWZ0ZXIgPSBhY3R1YWxWaXNpYmxlU2l6
ZSgpOworCisgICAgSW50UG9pbnQgb2Zmc2V0KHJvdW5kZigodmlld3BvcnRTaXplQmVmb3JlLndp
ZHRoKCkgLSB2aWV3cG9ydFNpemVBZnRlci53aWR0aCgpKSAvIDIuMCksCisgICAgICAgICAgICAg
ICAgICAgIHJvdW5kZigodmlld3BvcnRTaXplQmVmb3JlLmhlaWdodCgpIC0gdmlld3BvcnRTaXpl
QWZ0ZXIuaGVpZ2h0KCkpIC8gMi4wKSk7CisKKyAgICAvLyBBcyBhIHNwZWNpYWwgY2FzZSwgaWYg
d2Ugd2VyZSBhbmNob3JlZCB0byB0aGUgdG9wIGxlZnQgcG9zaXRpb24gYXQKKyAgICAvLyB0aGUg
YmVnaW5uaW5nIG9mIHRoZSByb3RhdGlvbiB0aGVuIHByZXNlcnZlIHRoYXQgYW5jaG9yLgorICAg
IGlmIChhdFRvcCkKKyAgICAgICAgb2Zmc2V0LnNldFkoMCk7CisgICAgaWYgKGF0TGVmdCkKKyAg
ICAgICAgb2Zmc2V0LnNldFgoMCk7CisKKyAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byBvdmVyc2Ny
b2xsLCBjYXAgdGhlIG9mZnNldCB0byB2YWxpZCBjb250ZW50LgorICAgIEludFBvaW50IGJvdHRv
bVJpZ2h0KAorICAgICAgICBzY3JvbGxQb3NpdGlvbigpLngoKSArIHZpZXdwb3J0U2l6ZUFmdGVy
LndpZHRoKCksCisgICAgICAgIHNjcm9sbFBvc2l0aW9uKCkueSgpICsgdmlld3BvcnRTaXplQWZ0
ZXIuaGVpZ2h0KCkpOworCisgICAgaWYgKGJvdHRvbVJpZ2h0LngoKSArIG9mZnNldC54KCkgPiBj
b250ZW50c1NpemUoKS53aWR0aCgpKQorICAgICAgICBvZmZzZXQuc2V0WChjb250ZW50c1NpemUo
KS53aWR0aCgpIC0gYm90dG9tUmlnaHQueCgpKTsKKyAgICBpZiAoYm90dG9tUmlnaHQueSgpICsg
b2Zmc2V0LnkoKSA+IGNvbnRlbnRzU2l6ZSgpLmhlaWdodCgpKQorICAgICAgICBvZmZzZXQuc2V0
WShjb250ZW50c1NpemUoKS5oZWlnaHQoKSAtIGJvdHRvbVJpZ2h0LnkoKSk7CisgICAgaWYgKHNj
cm9sbFBvc2l0aW9uKCkueCgpICsgb2Zmc2V0LngoKSA8IDApCisgICAgICAgIG9mZnNldC5zZXRY
KC1zY3JvbGxQb3NpdGlvbigpLngoKSk7CisgICAgaWYgKHNjcm9sbFBvc2l0aW9uKCkueSgpICsg
b2Zmc2V0LnkoKSA8IDApCisgICAgICAgIG9mZnNldC5zZXRZKC1zY3JvbGxQb3NpdGlvbigpLnko
KSk7CisKKyAgICAvLyAuLi5iZWZvcmUgc2Nyb2xsaW5nLCBiZWNhdXNlIHRoZSBiYWNraW5nIHN0
b3JlIHdpbGwgYWxpZ24gaXRzCisgICAgLy8gdGlsZSBtYXRyaXggd2l0aCB0aGUgdmlld3BvcnQg
YXMgcmVwb3J0ZWQgYnkgdGhlIFNjcm9sbFZpZXcuCisgICAgc2Nyb2xsQnkob2Zmc2V0LngoKSwg
b2Zmc2V0LnkoKSk7CisgICAgbm90aWZ5VHJhbnNmb3JtZWRTY3JvbGxDaGFuZ2VkKCk7CisKKyAg
ICBtX2JhY2tpbmdTdG9yZS0+ZC0+b3JpZW50YXRpb25DaGFuZ2VkKCk7CisgICAgbV9iYWNraW5n
U3RvcmUtPmQtPmFjdHVhbFZpc2libGVTaXplQ2hhbmdlZCh0cmFuc2Zvcm1lZEFjdHVhbFZpc2li
bGVTaXplKTsKKworICAgIC8vIFVwZGF0ZSB2aWV3IG1vZGUgb25seSBhZnRlciB3ZSBoYXZlIHVw
ZGF0ZWQgdGhlIGFjdHVhbAorICAgIC8vIHZpc2libGUgc2l6ZSBhbmQgcmVzZXQgdGhlIGNvbnRl
bnRzIHJlY3QgaWYgbmVjZXNzYXJ5LgorICAgIGlmIChzZXRWaWV3TW9kZSh2aWV3TW9kZSgpKSkK
KyAgICAgICAgbmVlZHNMYXlvdXQgPSB0cnVlOworCisgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUg
dGhlIHZpZXdwb3J0IHNpemUgb2YgdGhlIFdlYkNvcmU6OlNjcm9sbFZpZXcuLi4KKyAgICB1cGRh
dGVWaWV3cG9ydFNpemUoIWhhc1BlbmRpbmdPcmllbnRhdGlvbiAvKiBzZXRGaXhlZFJlcG9ydGVk
U2l6ZSAqLywgZmFsc2UgLyogc2VuZFJlc2l6ZUV2ZW50ICovKTsKKyAgICBub3RpZnlUcmFuc2Zv
cm1lZENvbnRlbnRzU2l6ZUNoYW5nZWQoKTsKKworICAgIC8vIElmIGF1dG9tYXRpYyB6b29taW5n
IGlzIGRpc2FibGVkLCBwcmV2ZW50IHpvb21pbmcgYmVsb3cuCisgICAgaWYgKCFtX3dlYlNldHRp
bmdzLT5pc1pvb21Ub0ZpdE9uTG9hZCgpKSB7CisgICAgICAgIGF0SW5pdGlhbFNjYWxlID0gZmFs
c2U7CisKKyAgICAgICAgLy8gTm9ybWFsbHksIGlmIHRoZSBjb250ZW50cyBzaXplIGlzIHNtYWxs
ZXIgdGhhbiB0aGUgbGF5b3V0IHdpZHRoLAorICAgICAgICAvLyB3ZSB3b3VsZCB6b29tIGluLiBJ
ZiB6b29tIGlzIGRpc2FibGVkLCB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZyBlbHNlLAorICAgICAg
ICAvLyBvciB0aGVyZSB3aWxsIGJlIGFydGlmYWN0cyBkdWUgdG8gbm9uLXJlbmRlcmVkIGFyZWFz
IG91dHNpZGUgb2YgdGhlCisgICAgICAgIC8vIGNvbnRlbnRzIHNpemUuIElmIHRoZXJlIGlzIGEg
dmlydHVhbCB2aWV3cG9ydCwgd2UgYXJlIG5vdCBhbGxvd2VkCisgICAgICAgIC8vIHRvIG1vZGlm
eSB0aGUgZml4ZWQgbGF5b3V0IHNpemUsIGhvd2V2ZXIuCisgICAgICAgIGlmICghaGFzVmlydHVh
bFZpZXdwb3J0KCkgJiYgY29udGVudHNTaXplKCkud2lkdGgoKSA8IG1fZGVmYXVsdExheW91dFNp
emUud2lkdGgoKSkgeworICAgICAgICAgICAgbV9tYWluRnJhbWUtPnZpZXcoKS0+c2V0VXNlRml4
ZWRMYXlvdXQodXNlRml4ZWRMYXlvdXQoKSk7CisgICAgICAgICAgICBtX21haW5GcmFtZS0+dmll
dygpLT5zZXRGaXhlZExheW91dFNpemUobV9kZWZhdWx0TGF5b3V0U2l6ZSk7CisgICAgICAgICAg
ICBuZWVkc0xheW91dCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmVlZHNM
YXlvdXQpCisgICAgICAgIHNldE5lZWRzTGF5b3V0KCk7CisKKyAgICAvLyBOZWVkIHRvIHJlc3Vt
ZSBzbyB0aGF0IHRoZSBiYWNraW5nc3RvcmUgd2lsbCBzdGFydCByZWNvcmRpbmcgdGhlIGludmFs
aWRhdGVkCisgICAgLy8gcmVjdHMgZnJvbSBiZWxvdy4KKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+
cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6Ok5vbmUpOwor
CisgICAgLy8gV2UgbWlnaHQgbmVlZCB0byBsYXlvdXQgaGVyZSB0byBnZXQgYSBjb3JyZWN0IGNv
bnRlbnRzU2l6ZSBzbyB0aGF0IHpvb21Ub0ZpdAorICAgIC8vIGlzIGNhbGN1bGF0ZWQgY29ycmVj
dGx5LgorICAgIHJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpOworCisgICAgLy8gQXMgYSBzcGVjaWFs
IGNhc2UgaWYgd2Ugd2VyZSB6b29tZWQgdG8gdGhlIGluaXRpYWwgc2NhbGUgYXQgdGhlIGJlZ2lu
bmluZworICAgIC8vIG9mIHRoZSByb3RhdGlvbiB0aGVuIHByZXNlcnZlIHRoYXQgem9vbSBsZXZl
bCBldmVuIHdoZW4gaXQgaXMgem9vbVRvRml0LgorICAgIGRvdWJsZSBzY2FsZSA9IGF0SW5pdGlh
bFNjYWxlID8gaW5pdGlhbFNjYWxlKCkgOiBjdXJyZW50U2NhbGUoKTsKKworICAgIC8vIERvIG91
ciBvd24gY2xhbXBpbmcuCisgICAgc2NhbGUgPSBjbGFtcGVkU2NhbGUoc2NhbGUpOworCisgICAg
aWYgKGhhc1BlbmRpbmdPcmllbnRhdGlvbikgeworICAgICAgICAvLyBTZXQgdGhlIGZpeGVkIHJl
cG9ydGVkIHNpemUgaGVyZSBzbyB0aGF0IGlubmVyV2lkdGh8aW5uZXJIZWlnaHQgd29ya3MKKyAg
ICAgICAgLy8gd2l0aCB0aGlzIG5ldyBzY2FsZS4KKyAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRy
aXggcm90YXRpb25NYXRyaXg7CisgICAgICAgIHJvdGF0aW9uTWF0cml4LnNjYWxlKHNjYWxlKTsK
KyAgICAgICAgSW50UmVjdCB2aWV3cG9ydFJlY3QgPSBJbnRSZWN0KEludFBvaW50KDAsIDApLCB0
cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKTsKKyAgICAgICAgSW50UmVjdCBhY3R1YWxWaXNp
YmxlUmVjdAorICAgICAgICAgICAgPSBlbmNsb3NpbmdJbnRSZWN0KHJvdGF0aW9uTWF0cml4Lmlu
dmVyc2UoKS5tYXBSZWN0KEZsb2F0UmVjdCh2aWV3cG9ydFJlY3QpKSk7CisgICAgICAgIG1fbWFp
bkZyYW1lLT52aWV3KCktPnNldEZpeGVkUmVwb3J0ZWRTaXplKGFjdHVhbFZpc2libGVSZWN0LnNp
emUoKSk7CisgICAgfQorCisgICAgLy8gV2UncmUgZ29pbmcgdG8gbmVlZCB0byBzZW5kIGEgcmVz
aXplIGV2ZW50IHRvIEphdmFTY3JpcHQgYmVjYXVzZQorICAgIC8vIGlubmVyV2lkdGggYW5kIGlu
bmVySGVpZ2h0IGRlcGVuZCBvbiBmaXhlZCByZXBvcnRlZCBzaXplLgorICAgIC8vIFRoaXMgaXMg
aG93IHdlIHN1cHBvcnQgbW9iaWxlIHBhZ2VzIHdoZXJlIEphdmFTY3JpcHQgcmVzaXplcworICAg
IC8vIHRoZSBwYWdlIGluIG9yZGVyIHRvIGdldCBhcm91bmQgdGhlIGZpeGVkIGxheW91dCBzaXpl
LCBlLmcuCisgICAgLy8gZ29vZ2xlIG1hcHMgd2hlbiBpdCBkZXRlY3RzIGEgbW9iaWxlIHVzZXIg
YWdlbnQuCisgICAgaWYgKHNob3VsZFNlbmRSZXNpemVFdmVudCgpKQorICAgICAgICBtX21haW5G
cmFtZS0+ZXZlbnRIYW5kbGVyKCktPnNlbmRSZXNpemVFdmVudCgpOworCisgICAgLy8gQXMgYSBz
cGVjaWFsIGNhc2UgaWYgd2Ugd2VyZSBhbmNob3JlZCB0byB0aGUgdG9wIGxlZnQgcG9zaXRpb24g
YXQgdGhlIGJlZ2lubmluZworICAgIC8vIG9mIHRoZSByb3RhdGlvbiB0aGVuIHByZXNlcnZlIHRo
YXQgYW5jaG9yLgorICAgIEZsb2F0UG9pbnQgYW5jaG9yID0gY2VudGVyT2ZWaXNpYmxlQ29udGVu
dHNSZWN0OworICAgIGlmIChhdFRvcCkKKyAgICAgICAgYW5jaG9yLnNldFkoMCk7CisgICAgaWYg
KGF0TGVmdCkKKyAgICAgICAgYW5jaG9yLnNldFgoMCk7CisKKyAgICAvLyBUcnkgYW5kIHpvb20g
aGVyZSB3aXRoIGNsYW1waW5nIG9uLgorICAgIGlmIChtX2JhY2tpbmdTdG9yZS0+ZC0+c2hvdWxk
RGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkgeworICAgICAgICBib29sIHN1Y2Nlc3MgPSB6b29t
QWJvdXRQb2ludChzY2FsZSwgYW5jaG9yLCBmYWxzZSAvKiBlbmZvcmNlU2NhbGVDbGFtcGluZyAq
LywgdHJ1ZSAvKiBmb3JjZVJlbmRlcmluZyAqLyk7CisgICAgICAgIGlmICghc3VjY2VzcyAmJiBl
bnN1cmVGb2N1c0VsZW1lbnRWaXNpYmxlKQorICAgICAgICAgICAgZW5zdXJlQ29udGVudFZpc2li
bGUoIW5ld1Zpc2libGVSZWN0Q29udGFpbnNPbGRWaXNpYmxlUmVjdCk7CisgICAgfSBlbHNlIGlm
ICghc2NoZWR1bGVab29tQWJvdXRQb2ludChzY2FsZSwgYW5jaG9yLCBmYWxzZSAvKiBlbmZvcmNl
U2NhbGVDbGFtcGluZyAqLywgdHJ1ZSAvKiBmb3JjZVJlbmRlcmluZyAqLykpIHsKKyAgICAgICAg
Ly8gU3VzcGVuZCBhbGwgc2NyZWVuIHVwZGF0ZXMgdG8gdGhlIGJhY2tpbmdzdG9yZS4KKyAgICAg
ICAgbV9iYWNraW5nU3RvcmUtPmQtPnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVz
KCk7CisKKyAgICAgICAgLy8gSWYgdGhlIHpvb20gZmFpbGVkLCB0aGVuIHdlIHNob3VsZCBzdGls
bCBwcmVzZXJ2ZSB0aGUgc3BlY2lhbCBjYXNlIG9mIHNjcm9sbCBwb3NpdGlvbi4KKyAgICAgICAg
SW50UG9pbnQgc2Nyb2xsUG9zaXRpb24gPSB0aGlzLT5zY3JvbGxQb3NpdGlvbigpOworICAgICAg
ICBpZiAoYXRUb3ApCisgICAgICAgICAgICBzY3JvbGxQb3NpdGlvbi5zZXRZKDApOworICAgICAg
ICBpZiAoYXRMZWZ0KQorICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24uc2V0WCgwKTsKKyAgICAg
ICAgc2V0U2Nyb2xsUG9zaXRpb24oc2Nyb2xsUG9zaXRpb24pOworCisgICAgICAgIC8vIFRoZXNl
IG1pZ2h0IGhhdmUgYmVlbiBhbHRlcmVkIGV2ZW4gaWYgd2UgZGlkbid0IHpvb20gc28gbm90aWZ5
IHRoZSBjbGllbnQuCisgICAgICAgIG5vdGlmeVRyYW5zZm9ybWVkQ29udGVudHNTaXplQ2hhbmdl
ZCgpOworICAgICAgICBub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQoKTsKKworICAgICAg
ICBpZiAoIW5lZWRzTGF5b3V0KSB7CisgICAgICAgICAgICAvLyBUaGUgdmlzaWJsZSB0aWxlcyBm
b3Igc2Nyb2xsIG11c3QgYmUgdXAtdG8tZGF0ZSBiZWZvcmUgd2UgYmxpdCBzaW5jZSB3ZSBhcmUg
bm90IHBlcmZvcm1pbmcgYSBsYXlvdXQuCisgICAgICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+
dXBkYXRlVGlsZXNGb3JTY3JvbGxPck5vdFJlbmRlcmVkUmVnaW9uKCk7CisgICAgICAgIH0KKwor
ICAgICAgICBpZiAoZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJsZSkKKyAgICAgICAgICAgIGVuc3Vy
ZUNvbnRlbnRWaXNpYmxlKCFuZXdWaXNpYmxlUmVjdENvbnRhaW5zT2xkVmlzaWJsZVJlY3QpOwor
CisgICAgICAgIGlmIChuZWVkc0xheW91dCkgeworICAgICAgICAgICAgbV9iYWNraW5nU3RvcmUt
PmQtPnJlc2V0VGlsZXModHJ1ZSk7CisgICAgICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+dXBk
YXRlVGlsZXMoZmFsc2UgLyogdXBkYXRlVmlzaWJsZSAqLywgZmFsc2UgLyogaW1tZWRpYXRlICov
KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIG5lZWQgbGF5b3V0IHRoZW4gcmVuZGVy
IGFuZCBibGl0LCBvdGhlcndpc2UganVzdCBibGl0IGFzIG91ciB2aWV3cG9ydCBoYXMgY2hhbmdl
ZC4KKyAgICAgICAgbV9iYWNraW5nU3RvcmUtPmQtPnJlc3VtZVNjcmVlbkFuZEJhY2tpbmdTdG9y
ZVVwZGF0ZXMobmVlZHNMYXlvdXQgPyBCYWNraW5nU3RvcmU6OlJlbmRlckFuZEJsaXQgOiBCYWNr
aW5nU3RvcmU6OkJsaXQpOworICAgIH0gZWxzZSBpZiAoZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJs
ZSkKKyAgICAgICAgZW5zdXJlQ29udGVudFZpc2libGUoIW5ld1Zpc2libGVSZWN0Q29udGFpbnNP
bGRWaXNpYmxlUmVjdCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0RGVmYXVsdExheW91dFNpemUo
aW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIEludFNpemUgc2l6ZSh3aWR0aCwgaGVpZ2h0
KTsKKyAgICBpZiAoc2l6ZSA9PSBkLT5tX2RlZmF1bHRMYXlvdXRTaXplKQorICAgICAgICByZXR1
cm47CisKKyAgICBkLT5zZXREZWZhdWx0TGF5b3V0U2l6ZShzaXplKTsKKyAgICBib29sIG5lZWRz
TGF5b3V0ID0gZC0+c2V0Vmlld01vZGUoZC0+dmlld01vZGUoKSk7CisgICAgaWYgKG5lZWRzTGF5
b3V0KSB7CisgICAgICAgIGQtPnNldE5lZWRzTGF5b3V0KCk7CisgICAgICAgIGlmICghZC0+aXNM
b2FkaW5nKCkpCisgICAgICAgICAgICBkLT5yZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKTsKKyAgICB9
Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldERlZmF1bHRMYXlvdXRTaXplKGNvbnN0IElu
dFNpemUmIHNpemUpCit7CisgICAgSW50U2l6ZSBzY3JlZW5TaXplID0gUGxhdGZvcm06OkdyYXBo
aWNzOjpTY3JlZW46OnNpemUoKTsKKyAgICBBU1NFUlQoc2l6ZS53aWR0aCgpIDw9IHNjcmVlblNp
emUud2lkdGgoKSAmJiBzaXplLmhlaWdodCgpIDw9IHNjcmVlblNpemUuaGVpZ2h0KCkpOworICAg
IG1fZGVmYXVsdExheW91dFNpemUgPSBzaXplLmV4cGFuZGVkVG8obWluaW11bUxheW91dFNpemUp
LnNocnVua1RvKHNjcmVlblNpemUpOworfQorCitib29sIFdlYlBhZ2U6Om1vdXNlRXZlbnQoY29u
c3QgUGxhdGZvcm06Ok1vdXNlRXZlbnQmIG1vdXNlRXZlbnQsIGJvb2wqIHdoZWVsRGVsdGFBY2Nl
cHRlZCkKK3sKKyAgICBpZiAoIWQtPm1fbWFpbkZyYW1lLT52aWV3KCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIFBsdWdpblZpZXcqIHBsdWdpblZpZXcgPSBkLT5tX2Z1bGxTY3JlZW5Q
bHVnaW5WaWV3LmdldCgpOworICAgIGlmIChwbHVnaW5WaWV3KQorICAgICAgICByZXR1cm4gZC0+
ZGlzcGF0Y2hNb3VzZUV2ZW50VG9GdWxsU2NyZWVuUGx1Z2luKHBsdWdpblZpZXcsIG1vdXNlRXZl
bnQpOworCisgICAgaWYgKG1vdXNlRXZlbnQudHlwZSgpID09IFBsYXRmb3JtOjpNb3VzZUV2ZW50
OjpNb3VzZUFib3J0ZWQpIHsKKyAgICAgICAgZC0+bV9tYWluRnJhbWUtPmV2ZW50SGFuZGxlcigp
LT5zZXRNb3VzZVByZXNzZWQoZmFsc2UpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
CisgICAgZC0+bV9wbHVnaW5NYXlPcGVuTmV3VGFiID0gdHJ1ZTsKKworICAgIGQtPm1fbGFzdFVz
ZXJFdmVudFRpbWVzdGFtcCA9IGN1cnJlbnRUaW1lKCk7CisgICAgaW50IGNsaWNrQ291bnQgPSAo
ZC0+bV9zZWxlY3Rpb25IYW5kbGVyLT5pc1NlbGVjdGlvbkFjdGl2ZSgpIHx8IG1vdXNlRXZlbnQu
dHlwZSgpICE9IFBsYXRmb3JtOjpNb3VzZUV2ZW50OjpNb3VzZU1vdmUpID8gMSA6IDA7CisKKyAg
ICAvLyBTZXQgdGhlIGJ1dHRvbiB0eXBlLgorICAgIE1vdXNlQnV0dG9uIGJ1dHRvblR5cGUgPSBO
b0J1dHRvbjsKKyAgICBpZiAobW91c2VFdmVudC5pc0xlZnRCdXR0b24oKSkKKyAgICAgICAgYnV0
dG9uVHlwZSA9IExlZnRCdXR0b247CisgICAgZWxzZSBpZiAobW91c2VFdmVudC5pc1JpZ2h0QnV0
dG9uKCkpCisgICAgICAgIGJ1dHRvblR5cGUgPSBSaWdodEJ1dHRvbjsKKyAgICBlbHNlIGlmICht
b3VzZUV2ZW50LmlzTWlkZGxlQnV0dG9uKCkpCisgICAgICAgIGJ1dHRvblR5cGUgPSBNaWRkbGVC
dXR0b247CisKKyAgICAvLyBDcmVhdGUgb3VyIGV2ZW50LgorICAgIFBsYXRmb3JtTW91c2VFdmVu
dCBwbGF0Zm9ybU1vdXNlRXZlbnQoZC0+bWFwRnJvbVRyYW5zZm9ybWVkKG1vdXNlRXZlbnQucG9z
aXRpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5t
YXBGcm9tVHJhbnNmb3JtZWQobW91c2VFdmVudC5zY3JlZW5Qb3NpdGlvbigpKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvV2ViQ29yZU1vdXNlRXZlbnRUeXBl
KG1vdXNlRXZlbnQudHlwZSgpKSwgY2xpY2tDb3VudCwgYnV0dG9uVHlwZSwgUG9pbnRpbmdEZXZp
Y2UpOworICAgIGQtPm1fbGFzdE1vdXNlRXZlbnQgPSBwbGF0Zm9ybU1vdXNlRXZlbnQ7CisgICAg
Ym9vbCBzdWNjZXNzID0gZC0+aGFuZGxlTW91c2VFdmVudChwbGF0Zm9ybU1vdXNlRXZlbnQpOwor
CisgICAgaWYgKG1vdXNlRXZlbnQud2hlZWxUaWNrcygpKSB7CisgICAgICAgIFBsYXRmb3JtV2hl
ZWxFdmVudCB3aGVlbEV2ZW50KGQtPm1hcEZyb21UcmFuc2Zvcm1lZChtb3VzZUV2ZW50LnBvc2l0
aW9uKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5tYXBGcm9t
VHJhbnNmb3JtZWQobW91c2VFdmVudC5zY3JlZW5Qb3NpdGlvbigpKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgMCwgLW1vdXNlRXZlbnQud2hlZWxEZWx0YSgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAtbW91c2VFdmVudC53aGVlbFRp
Y2tzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcm9sbEJ5UGl4
ZWxXaGVlbEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxz
ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGlmICh3aGVlbERlbHRhQWNjZXB0ZWQp
CisgICAgICAgICAgICAqd2hlZWxEZWx0YUFjY2VwdGVkID0gZC0+aGFuZGxlV2hlZWxFdmVudCh3
aGVlbEV2ZW50KTsKKyAgICB9IGVsc2UgaWYgKHdoZWVsRGVsdGFBY2NlcHRlZCkKKyAgICAgICAg
KndoZWVsRGVsdGFBY2NlcHRlZCA9IGZhbHNlOworCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisK
K2Jvb2wgV2ViUGFnZVByaXZhdGU6OmRpc3BhdGNoTW91c2VFdmVudFRvRnVsbFNjcmVlblBsdWdp
bihQbHVnaW5WaWV3KiBwbHVnaW4sIGNvbnN0IFBsYXRmb3JtOjpNb3VzZUV2ZW50JiBldmVudCkK
K3sKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgTlBNb3VzZUV2ZW50IG1vdXNlRXZlbnQ7CisK
KyAgICBtb3VzZUV2ZW50LnggPSBldmVudC5zY3JlZW5Qb3NpdGlvbigpLngoKTsKKyAgICBtb3Vz
ZUV2ZW50LnkgPSBldmVudC5zY3JlZW5Qb3NpdGlvbigpLnkoKTsKKworICAgIHN3aXRjaCAoZXZl
bnQudHlwZSgpKSB7CisgICAgY2FzZSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6TW91c2VCdXR0b25E
b3duOgorICAgICAgICBtb3VzZUV2ZW50LnR5cGUgPSBNT1VTRV9CVVRUT05fRE9XTjsKKyAgICAg
ICAgbV9wbHVnaW5Nb3VzZUJ1dHRvblByZXNzZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIFBsYXRmb3JtOjpNb3VzZUV2ZW50OjpNb3VzZUJ1dHRvblVwOgorICAgICAgICBtb3Vz
ZUV2ZW50LnR5cGUgPSBNT1VTRV9CVVRUT05fVVA7CisgICAgICAgIG1fcGx1Z2luTW91c2VCdXR0
b25QcmVzc2VkID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUGxhdGZvcm06Ok1v
dXNlRXZlbnQ6Ok1vdXNlTW92ZToKKyAgICAgICAgbW91c2VFdmVudC50eXBlID0gTU9VU0VfTU9U
SU9OOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgbW91c2VFdmVudC5mbGFncyA9IDA7CisgICAgbW91c2VFdmVudC5idXR0
b24gPSBtX3BsdWdpbk1vdXNlQnV0dG9uUHJlc3NlZDsKKworICAgIG5wRXZlbnQudHlwZSA9IE5Q
X01vdXNlRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gJm1vdXNlRXZlbnQ7CisKKyAgICByZXR1
cm4gcGx1Z2luLT5kaXNwYXRjaEZ1bGxTY3JlZW5OUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lk
IFdlYlBhZ2U6OnNldFZpcnR1YWxLZXlib2FyZFZpc2libGUoYm9vbCB2aXNpYmxlKQoreworICAg
IGQtPnNob3dWaXJ0dWFsS2V5Ym9hcmQodmlzaWJsZSk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZh
dGU6OmhhbmRsZU1vdXNlRXZlbnQoUGxhdGZvcm1Nb3VzZUV2ZW50JiBtb3VzZUV2ZW50KQorewor
ICAgIEV2ZW50SGFuZGxlciogZXZlbnRIYW5kbGVyID0gbV9tYWluRnJhbWUtPmV2ZW50SGFuZGxl
cigpOworCisgICAgaWYgKG1vdXNlRXZlbnQuZXZlbnRUeXBlKCkgPT0gTW91c2VFdmVudE1vdmVk
KQorICAgICAgICByZXR1cm4gZXZlbnRIYW5kbGVyLT5tb3VzZU1vdmVkKG1vdXNlRXZlbnQpOwor
CisgICAgaWYgKG1vdXNlRXZlbnQuZXZlbnRUeXBlKCkgPT0gTW91c2VFdmVudFNjcm9sbCkKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBOb2RlKiBub2RlID0gMDsKKyAgICBpZiAobW91c2VF
dmVudC5pbnB1dE1ldGhvZCgpID09IFRvdWNoU2NyZWVuKSB7CisgICAgICAgIGNvbnN0IEZhdEZp
bmdlcnNSZXN1bHQgbGFzdEZhdEZpbmdlcnNSZXN1bHQgPSBtX3RvdWNoRXZlbnRIYW5kbGVyLT5s
YXN0RmF0RmluZ2Vyc1Jlc3VsdCgpOworCisgICAgICAgIC8vIEZhdCBmaW5nZXJzIGNhbiBkZWFs
IHdpdGggc2hhZG93IGNvbnRlbnQuCisgICAgICAgIGlmIChub2RlID0gbGFzdEZhdEZpbmdlcnNS
ZXN1bHQudmFsaWROb2RlKCkpCisgICAgICAgICAgICBub2RlID0gbm9kZS0+c2hhZG93QW5jZXN0
b3JOb2RlKCk7CisgICAgfQorCisgICAgaWYgKCFub2RlKSB7CisgICAgICAgIEhpdFRlc3RSZXN1
bHQgcmVzdWx0ID0gZXZlbnRIYW5kbGVyLT5oaXRUZXN0UmVzdWx0QXRQb2ludChtYXBGcm9tVmll
d3BvcnRUb0NvbnRlbnRzKG1vdXNlRXZlbnQucG9zKCkpLCBmYWxzZSAvKmFsbG93U2hhZG93Q29u
dGVudCovKTsKKyAgICAgICAgbm9kZSA9IHJlc3VsdC5pbm5lck5vZGUoKTsKKyAgICB9CisKKyAg
ICBpZiAobW91c2VFdmVudC5ldmVudFR5cGUoKSA9PSBNb3VzZUV2ZW50UHJlc3NlZCkgeworICAg
ICAgICBpZiAobV9pbnB1dEhhbmRsZXItPndpbGxPcGVuUG9wdXBGb3JOb2RlKG5vZGUpKSB7Cisg
ICAgICAgICAgICAvLyBEbyBub3QgYWxsb3cgYW55IGh1bWFuIGdlbmVyYXRlZCBtb3VzZSBvciBr
ZXlib2FyZCBldmVudHMgdG8gc2VsZWN0IDxvcHRpb24+cyBpbiB0aGUgbGlzdCBib3gKKyAgICAg
ICAgICAgIC8vIGJlY2F1c2Ugd2UgdXNlIGEgcG9wIHVwIGRpYWxvZyB0byBoYW5kbGUgdGhlIGFj
dHVhbCBzZWxlY3Rpb25zLiBUaGlzIHByZXZlbnRzIG9wdGlvbnMgZnJvbQorICAgICAgICAgICAg
Ly8gYmVpbmcgc2VsZWN0ZWQgcHJpb3IgdG8gZGlzcGxheWluZyB0aGUgcG9wIHVwIGRpYWxvZy4g
VGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0Ym94IGFyZSBmb3IKKyAgICAgICAgICAgIC8vIGRpc3Bs
YXkgb25seS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBGSVhNRTogV2UgZXhwbGlj
aXRseSBkbyBub3QgZm9yd2FyZCB0aGlzIGV2ZW50IHRvIFdlYkNvcmUgc28gYXMgdG8gcHJlc2Vy
dmUgc3ltbWV0cnkgd2l0aAorICAgICAgICAgICAgLy8gdGhlIE1vdXNlRXZlbnRSZWxlYXNlZCBo
YW5kbGluZyAoYmVsb3cpLiBUaGlzIGhhcyB0aGUgc2lkZS1lZmZlY3QgdGhhdCBtb3VzZWRvd24g
ZXZlbnRzCisgICAgICAgICAgICAvLyBhcmUgbm90IGZpcmVkIGZvciBodW1hbiBnZW5lcmF0ZWQg
bW91c2UgcHJlc3MgZXZlbnRzLiBTZWUgUklNIEJ1ZyAjMTU3OS4KKworICAgICAgICAgICAgLy8g
V2UgZG8gZm9jdXMgPHNlbGVjdD4vPG9wdGlvbj4gb24gbW91c2UgZG93biBzbyB0aGF0IGEgRm9j
dXMgZXZlbnQgaXMgZmlyZWQgYW5kIGhhdmUgdGhlCisgICAgICAgICAgICAvLyBlbGVtZW50IHBh
aW50ZWQgaW4gaXRzIGZvY3VzIHN0YXRlIG9uIHJlcGFpbnQuCisgICAgICAgICAgICBBU1NFUlQo
bm9kZS0+aXNFbGVtZW50Tm9kZSgpKTsKKyAgICAgICAgICAgIGlmIChub2RlLT5pc0VsZW1lbnRO
b2RlKCkpIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8
RWxlbWVudCo+KG5vZGUpOworICAgICAgICAgICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZXZlbnRIYW5kbGVyLT5oYW5k
bGVNb3VzZVByZXNzRXZlbnQobW91c2VFdmVudCk7CisgICAgfSBlbHNlIGlmIChtb3VzZUV2ZW50
LmV2ZW50VHlwZSgpID09IE1vdXNlRXZlbnRSZWxlYXNlZCkgeworICAgICAgICAvLyBGSVhNRTog
Rm9yIDxzZWxlY3Q+IGFuZCA8b3B0aW9ucz4gZWxlbWVudHMsIHdlIGV4cGxpY2l0bHkgZG8gbm90
IGZvcndhcmQgdGhpcyBldmVudCB0byBXZWJDb3JlIHNvCisgICAgICAgIC8vIGFzIHRvIHByZXNl
cnZlIHN5bW1ldHJ5IHdpdGggdGhlIE1vdXNlRXZlbnRQcmVzc2VkIGhhbmRsaW5nIChhYm92ZSku
IFRoaXMgaGFzIHRoZSBzaWRlLWVmZmVjdCB0aGF0CisgICAgICAgIC8vIG1vdXNldXAgZXZlbnRz
IGFyZSBub3QgZmlyZWQgb24gc3VjaCBlbGVtZW50cyBmb3IgaHVtYW4gZ2VuZXJhdGVkIG1vdXNl
IHJlbGVhc2UgZXZlbnRzLiBTZWUgUklNIEJ1ZyAjMTU3OS4KKyAgICAgICAgaWYgKCFtX2lucHV0
SGFuZGxlci0+ZGlkTm9kZU9wZW5Qb3B1cChub2RlKSkKKyAgICAgICAgICAgIGV2ZW50SGFuZGxl
ci0+aGFuZGxlTW91c2VSZWxlYXNlRXZlbnQobW91c2VFdmVudCk7CisgICAgfQorCisgICAgcmV0
dXJuIHRydWU7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmhhbmRsZVdoZWVsRXZlbnQoUGxh
dGZvcm1XaGVlbEV2ZW50JiB3aGVlbEV2ZW50KQoreworICAgIEV2ZW50SGFuZGxlciogZXZlbnRI
YW5kbGVyID0gbV9tYWluRnJhbWUtPmV2ZW50SGFuZGxlcigpOworCisgICAgcmV0dXJuIGV2ZW50
SGFuZGxlci0+aGFuZGxlV2hlZWxFdmVudCh3aGVlbEV2ZW50KTsKK30KKworYm9vbCBXZWJQYWdl
Ojp0b3VjaEV2ZW50KGNvbnN0IFBsYXRmb3JtOjpUb3VjaEV2ZW50JiBldmVudCkKK3sKKyNpZiBE
RUJVR19UT1VDSF9FVkVOVFMKKyAgICBzd2l0Y2ggKGV2ZW50Lm1fdHlwZSkgeworICAgIGNhc2Ug
UGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNoRW5kOgorICAgICAgICBQbGF0Zm9ybTo6bG9nKFBs
YXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiV2ViUGFnZTo6dG91Y2hFdmVudCBUb3VjaCBFbmQi
KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hT
dGFydDoKKyAgICAgICAgUGxhdGZvcm06OmxvZyhQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwg
IldlYlBhZ2U6OnRvdWNoRXZlbnQgVG91Y2ggU3RhcnQiKTsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hNb3ZlOgorICAgICAgICBQbGF0Zm9ybTo6
bG9nKFBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiV2ViUGFnZTo6dG91Y2hFdmVudCBUb3Vj
aCBNb3ZlIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgZXZlbnQubV9wb2ludHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChldmVudC5t
X3BvaW50c1tpXS5tX3N0YXRlKSB7CisgICAgICAgIGNhc2UgUGxhdGZvcm06OlRvdWNoUG9pbnQ6
OlRvdWNoUHJlc3NlZDoKKyAgICAgICAgICAgIFBsYXRmb3JtOjpsb2coUGxhdGZvcm06OkxvZ0xl
dmVsQ3JpdGljYWwsICJXZWJQYWdlOjp0b3VjaEV2ZW50ICVkIFRvdWNoIFByZXNzZWQgKCVkLCAl
ZCkiLCBldmVudC5tX3BvaW50c1tpXS5tX2lkLCBldmVudC5tX3BvaW50c1tpXS5tX3Bvcy54KCks
IGV2ZW50Lm1fcG9pbnRzW2ldLm1fcG9zLnkoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hQb2ludDo6VG91Y2hSZWxlYXNlZDoKKyAgICAgICAgICAg
IFBsYXRmb3JtOjpsb2coUGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJXZWJQYWdlOjp0b3Vj
aEV2ZW50ICVkIFRvdWNoIFJlbGVhc2VkICglZCwgJWQpIiwgZXZlbnQubV9wb2ludHNbaV0ubV9p
ZCwgZXZlbnQubV9wb2ludHNbaV0ubV9wb3MueCgpLCBldmVudC5tX3BvaW50c1tpXS5tX3Bvcy55
KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm06OlRvdWNoUG9p
bnQ6OlRvdWNoTW92ZWQ6CisgICAgICAgICAgICBQbGF0Zm9ybTo6bG9nKFBsYXRmb3JtOjpMb2dM
ZXZlbENyaXRpY2FsLCAiV2ViUGFnZTo6dG91Y2hFdmVudCAlZCBUb3VjaCBNb3ZlZCAoJWQsICVk
KSIsIGV2ZW50Lm1fcG9pbnRzW2ldLm1faWQsIGV2ZW50Lm1fcG9pbnRzW2ldLm1fcG9zLngoKSwg
ZXZlbnQubV9wb2ludHNbaV0ubV9wb3MueSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgfQorI2VuZGlmCisKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorCisgICAgUGx1
Z2luVmlldyogcGx1Z2luVmlldyA9IGQtPm1fZnVsbFNjcmVlblBsdWdpblZpZXcuZ2V0KCk7Cisg
ICAgaWYgKHBsdWdpblZpZXcpCisgICAgICAgIHJldHVybiBkLT5kaXNwYXRjaFRvdWNoRXZlbnRU
b0Z1bGxTY3JlZW5QbHVnaW4ocGx1Z2luVmlldywgZXZlbnQpOworCisgICAgaWYgKCFkLT5tX21h
aW5GcmFtZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgUGxhdGZvcm06OlRvdWNoRXZl
bnQgdEV2ZW50ID0gZXZlbnQ7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGV2ZW50Lm1f
cG9pbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHRFdmVudC5tX3BvaW50c1tpXS5tX3BvcyA9
IGQtPm1hcEZyb21UcmFuc2Zvcm1lZCh0RXZlbnQubV9wb2ludHNbaV0ubV9wb3MpOworICAgICAg
ICB0RXZlbnQubV9wb2ludHNbaV0ubV9zY3JlZW5Qb3MgPSBkLT5tYXBGcm9tVHJhbnNmb3JtZWQo
dEV2ZW50Lm1fcG9pbnRzW2ldLm1fc2NyZWVuUG9zKTsKKyAgICB9CisKKyAgICBQbGF0Zm9ybTo6
R2VzdHVyZSB0YXBHZXN0dXJlOworICAgIGlmIChldmVudC5oYXNHZXN0dXJlKFBsYXRmb3JtOjpH
ZXN0dXJlOjpTaW5nbGVUYXApKQorICAgICAgICBkLT5tX3BsdWdpbk1heU9wZW5OZXdUYWIgPSB0
cnVlOworICAgIGVsc2UgaWYgKHRFdmVudC5tX3R5cGUgPT0gUGxhdGZvcm06OlRvdWNoRXZlbnQ6
OlRvdWNoU3RhcnQgfHwgdEV2ZW50Lm1fdHlwZSA9PSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91
Y2hDYW5jZWwpCisgICAgICAgIGQtPm1fcGx1Z2luTWF5T3Blbk5ld1RhYiA9IGZhbHNlOworCisg
ICAgYm9vbCBoYW5kbGVkID0gZmFsc2U7CisKKyAgICBpZiAoZC0+bV9uZWVkVG91Y2hFdmVudHMg
JiYgIWV2ZW50Lmhhc0dlc3R1cmUoUGxhdGZvcm06Okdlc3R1cmU6OkluamVjdGVkKSkKKyAgICAg
ICAgaGFuZGxlZCA9IGQtPm1fbWFpbkZyYW1lLT5ldmVudEhhbmRsZXIoKS0+aGFuZGxlVG91Y2hF
dmVudChQbGF0Zm9ybVRvdWNoRXZlbnQoJnRFdmVudCkpOworCisgICAgLy8gVW5wcmVzcyBtb3Vz
ZSBpZiB0b3VjaCBlbmQgaXMgY29uc3VtZWQgYnkgYSBKYXZhU2NyaXB0IHRvdWNoIGhhbmRsZXIs
IG90aGVyd2lzZSB0aGUgbW91c2Ugc3RhdGUgd2lsbCByZW1haW4gcHJlc3NlZAorICAgIC8vIHdo
aWNoIGNvdWxkIGVpdGhlciBtZXNzIHVwIHRoZSBpbnRlcm5hbCBtb3VzZSBzdGF0ZSBvciBzdGFy
dCB0ZXh0IHNlbGVjdGlvbiBvbiB0aGUgbmV4dCBtb3VzZSBtb3ZlL2Rvd24uCisgICAgaWYgKHRF
dmVudC5tX3R5cGUgPT0gUGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNoRW5kICYmIGhhbmRsZWQg
JiYgZC0+bV9tYWluRnJhbWUtPmV2ZW50SGFuZGxlcigpLT5tb3VzZVByZXNzZWQoKSkKKyAgICAg
ICAgZC0+bV90b3VjaEV2ZW50SGFuZGxlci0+dG91Y2hFdmVudENhbmNlbCgpOworCisgICAgaWYg
KGQtPm1fcHJldmVudERlZmF1bHRPblRvdWNoU3RhcnQpIHsKKyAgICAgICAgaWYgKHRFdmVudC5t
X3R5cGUgPT0gUGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNoRW5kIHx8IHRFdmVudC5tX3R5cGUg
PT0gUGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNoQ2FuY2VsKQorICAgICAgICAgICAgZC0+bV9w
cmV2ZW50RGVmYXVsdE9uVG91Y2hTdGFydCA9IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisKKyAgICBpZiAoaGFuZGxlZCkgeworICAgICAgICBpZiAodEV2ZW50Lm1fdHlwZSA9
PSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hTdGFydCkKKyAgICAgICAgICAgIGQtPm1fcHJl
dmVudERlZmF1bHRPblRvdWNoU3RhcnQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisKKyAgICBpZiAoZXZlbnQuaGFzR2VzdHVyZShQbGF0Zm9ybTo6R2VzdHVyZTo6VG91Y2hI
b2xkKSkKKyAgICAgICAgZC0+bV90b3VjaEV2ZW50SGFuZGxlci0+dG91Y2hIb2xkRXZlbnQoKTsK
KyNlbmRpZgorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFdlYlBhZ2U6OnNldFNjcm9s
bE9yaWdpblBvaW50KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgcG9pbnQpCit7CisgICAgUGxh
dGZvcm06OkludFBvaW50IHVudHJhbnNmb3JtZWRQb2ludCA9IGQtPm1hcEZyb21UcmFuc2Zvcm1l
ZChwb2ludCk7CisgICAgZC0+c2V0U2Nyb2xsT3JpZ2luUG9pbnQodW50cmFuc2Zvcm1lZFBvaW50
KTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0U2Nyb2xsT3JpZ2luUG9pbnQoY29uc3Qg
UGxhdGZvcm06OkludFBvaW50JiBwb2ludCkKK3sKKyAgICBtX2luUmVnaW9uU2Nyb2xsU3RhcnRp
bmdOb2RlID0gMDsKKworICAgIGlmICghbV9oYXNJblJlZ2lvblNjcm9sbGFibGVBcmVhcykKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV9jbGllbnQtPm5vdGlmeUluUmVnaW9uU2Nyb2xsaW5nU3Rh
cnRpbmdQb2ludENoYW5nZWQoaW5SZWdpb25TY3JvbGxhYmxlQXJlYXNGb3JQb2ludChwb2ludCkp
OworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpkaXNwYXRjaFRvdWNoRXZlbnRUb0Z1bGxTY3Jl
ZW5QbHVnaW4oUGx1Z2luVmlldyogcGx1Z2luLCBjb25zdCBQbGF0Zm9ybTo6VG91Y2hFdmVudCYg
ZXZlbnQpCit7CisgICAgTlBUb3VjaEV2ZW50IG5wVG91Y2hFdmVudDsKKworICAgIGlmIChldmVu
dC5oYXNHZXN0dXJlKFBsYXRmb3JtOjpHZXN0dXJlOjpEb3VibGVUYXApKQorICAgICAgICBucFRv
dWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX0RPVUJMRVRBUDsKKyAgICBlbHNlIGlmIChldmVu
dC5oYXNHZXN0dXJlKFBsYXRmb3JtOjpHZXN0dXJlOjpUb3VjaEhvbGQpKQorICAgICAgICBucFRv
dWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX1RPVUNISE9MRDsKKyAgICBlbHNlIHsKKyAgICAg
ICAgc3dpdGNoIChldmVudC5tX3R5cGUpIHsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hF
dmVudDo6VG91Y2hTdGFydDoKKyAgICAgICAgICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hf
RVZFTlRfU1RBUlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybTo6
VG91Y2hFdmVudDo6VG91Y2hFbmQ6CisgICAgICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRP
VUNIX0VWRU5UX0VORDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBsYXRmb3Jt
OjpUb3VjaEV2ZW50OjpUb3VjaE1vdmU6CisgICAgICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9
IFRPVUNIX0VWRU5UX01PVkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0
Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hDYW5jZWw6CisgICAgICAgICAgICBucFRvdWNoRXZlbnQu
dHlwZSA9IFRPVUNIX0VWRU5UX0NBTkNFTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisg
ICAgbnBUb3VjaEV2ZW50LnBvaW50cyA9IDA7CisgICAgbnBUb3VjaEV2ZW50LnNpemUgPSBldmVu
dC5tX3BvaW50cy5zaXplKCk7CisgICAgaWYgKG5wVG91Y2hFdmVudC5zaXplKSB7CisgICAgICAg
IG5wVG91Y2hFdmVudC5wb2ludHMgPSBuZXcgTlBUb3VjaFBvaW50W25wVG91Y2hFdmVudC5zaXpl
XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucFRvdWNoRXZlbnQuc2l6ZTsgaSsrKSB7
CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLnRvdWNoSWQgPSBldmVudC5tX3Bv
aW50c1tpXS5tX2lkOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5jbGllbnRY
ID0gZXZlbnQubV9wb2ludHNbaV0ubV9zY3JlZW5Qb3MueCgpOworICAgICAgICAgICAgbnBUb3Vj
aEV2ZW50LnBvaW50c1tpXS5jbGllbnRZID0gZXZlbnQubV9wb2ludHNbaV0ubV9zY3JlZW5Qb3Mu
eSgpOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5zY3JlZW5YID0gZXZlbnQu
bV9wb2ludHNbaV0ubV9zY3JlZW5Qb3MueCgpOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBv
aW50c1tpXS5zY3JlZW5ZID0gZXZlbnQubV9wb2ludHNbaV0ubV9zY3JlZW5Qb3MueSgpOworICAg
ICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5wYWdlWCA9IGV2ZW50Lm1fcG9pbnRzW2ld
Lm1fcG9zLngoKTsKKyAgICAgICAgICAgIG5wVG91Y2hFdmVudC5wb2ludHNbaV0ucGFnZVkgPSBl
dmVudC5tX3BvaW50c1tpXS5tX3Bvcy55KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBOUEV2
ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfVG91Y2hFdmVudDsKKyAgICBucEV2
ZW50LmRhdGEgPSAmbnBUb3VjaEV2ZW50OworCisgICAgYm9vbCBoYW5kbGVkID0gcGx1Z2luLT5k
aXNwYXRjaEZ1bGxTY3JlZW5OUEV2ZW50KG5wRXZlbnQpOworCisgICAgaWYgKG5wVG91Y2hFdmVu
dC50eXBlID09IFRPVUNIX0VWRU5UX0RPVUJMRVRBUCAmJiAhaGFuZGxlZCkgeworICAgICAgICAv
LyBTZW5kIFRvdWNoIFVwIGlmIGRvdWJsZSB0YXAgbm90IGNvbnN1bWVkLgorICAgICAgICBucFRv
dWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX0VORDsKKyAgICAgICAgbnBFdmVudC5kYXRhID0g
Jm5wVG91Y2hFdmVudDsKKyAgICAgICAgaGFuZGxlZCA9IHBsdWdpbi0+ZGlzcGF0Y2hGdWxsU2Ny
ZWVuTlBFdmVudChucEV2ZW50KTsKKyAgICB9CisgICAgZGVsZXRlW10gbnBUb3VjaEV2ZW50LnBv
aW50czsKKyAgICByZXR1cm4gaGFuZGxlZDsKK30KKworYm9vbCBXZWJQYWdlOjp0b3VjaFBvaW50
QXNNb3VzZUV2ZW50KGNvbnN0IFBsYXRmb3JtOjpUb3VjaFBvaW50JiBwb2ludCkKK3sKKyAgICBQ
bHVnaW5WaWV3KiBwbHVnaW5WaWV3ID0gZC0+bV9mdWxsU2NyZWVuUGx1Z2luVmlldy5nZXQoKTsK
KyAgICBpZiAocGx1Z2luVmlldykKKyAgICAgICAgcmV0dXJuIGQtPmRpc3BhdGNoVG91Y2hQb2lu
dEFzTW91c2VFdmVudFRvRnVsbFNjcmVlblBsdWdpbihwbHVnaW5WaWV3LCBwb2ludCk7CisKKyAg
ICBkLT5tX2xhc3RVc2VyRXZlbnRUaW1lc3RhbXAgPSBjdXJyZW50VGltZSgpOworCisgICAgUGxh
dGZvcm06OlRvdWNoUG9pbnQgdFBvaW50ID0gcG9pbnQ7CisgICAgdFBvaW50Lm1fcG9zID0gZC0+
bWFwRnJvbVRyYW5zZm9ybWVkKHRQb2ludC5tX3Bvcyk7CisgICAgdFBvaW50Lm1fc2NyZWVuUG9z
ID0gZC0+bWFwRnJvbVRyYW5zZm9ybWVkKHRQb2ludC5tX3NjcmVlblBvcyk7CisKKyAgICByZXR1
cm4gZC0+bV90b3VjaEV2ZW50SGFuZGxlci0+aGFuZGxlVG91Y2hQb2ludCh0UG9pbnQpOworfQor
Citib29sIFdlYlBhZ2VQcml2YXRlOjpkaXNwYXRjaFRvdWNoUG9pbnRBc01vdXNlRXZlbnRUb0Z1
bGxTY3JlZW5QbHVnaW4oUGx1Z2luVmlldyogcGx1Z2luVmlldywgY29uc3QgUGxhdGZvcm06OlRv
dWNoUG9pbnQmIHBvaW50KQoreworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBOUE1vdXNlRXZl
bnQgbW91c2U7CisKKyAgICBzd2l0Y2ggKHBvaW50Lm1fc3RhdGUpIHsKKyAgICBjYXNlIFBsYXRm
b3JtOjpUb3VjaFBvaW50OjpUb3VjaFByZXNzZWQ6CisgICAgICAgIG1vdXNlLnR5cGUgPSBNT1VT
RV9CVVRUT05fRE9XTjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hQ
b2ludDo6VG91Y2hSZWxlYXNlZDoKKyAgICAgICAgbW91c2UudHlwZSA9IE1PVVNFX0JVVFRPTl9V
UDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hQb2ludDo6VG91Y2hN
b3ZlZDoKKyAgICAgICAgbW91c2UudHlwZSA9IE1PVVNFX01PVElPTjsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hQb2ludDo6VG91Y2hTdGF0aW9uYXJ5OgorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbW91c2UueCA9IHBvaW50Lm1fc2NyZWVuUG9z
LngoKTsKKyAgICBtb3VzZS55ID0gcG9pbnQubV9zY3JlZW5Qb3MueSgpOworICAgIG1vdXNlLmJ1
dHRvbiA9IG1vdXNlLnR5cGUgIT0gTU9VU0VfQlVUVE9OX1VQOworICAgIG1vdXNlLmZsYWdzID0g
MDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9Nb3VzZUV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9
ICZtb3VzZTsKKworICAgIHJldHVybiBwbHVnaW5WaWV3LT5kaXNwYXRjaEZ1bGxTY3JlZW5OUEV2
ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFdlYlBhZ2U6OnRvdWNoRXZlbnRDYW5jZWwoKQorewor
ICAgIGQtPm1fcGx1Z2luTWF5T3Blbk5ld1RhYiA9IGZhbHNlOworICAgIGQtPm1fdG91Y2hFdmVu
dEhhbmRsZXItPnRvdWNoRXZlbnRDYW5jZWwoKTsKK30KKwordm9pZCBXZWJQYWdlOjp0b3VjaEV2
ZW50Q2FuY2VsQW5kQ2xlYXJGb2N1c2VkTm9kZSgpCit7CisgICAgZC0+bV90b3VjaEV2ZW50SGFu
ZGxlci0+dG91Y2hFdmVudENhbmNlbEFuZENsZWFyRm9jdXNlZE5vZGUoKTsKK30KKworRnJhbWUq
IFdlYlBhZ2VQcml2YXRlOjpmb2N1c2VkT3JNYWluRnJhbWUoKSBjb25zdAoreworICAgIHJldHVy
biBtX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKK30KKwor
RnJhbWUqIFdlYlBhZ2VQcml2YXRlOjptYWluRnJhbWUoKSBjb25zdAoreworICAgIHJldHVybiBt
X21haW5GcmFtZTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6Y2xlYXJGb2N1c05vZGUoKQor
eworICAgIEZyYW1lKiBmcmFtZSA9IGZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIGlmICghZnJh
bWUpCisgICAgICAgIHJldHVybjsKKyAgICBBU1NFUlQoZnJhbWUtPmRvY3VtZW50KCkpOworCisg
ICAgaWYgKGZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpKQorICAgICAgICBmcmFtZS0+
cGFnZSgpLT5mb2N1c0NvbnRyb2xsZXIoKS0+c2V0Rm9jdXNlZE5vZGUoMCwgZnJhbWUpOworfQor
Citib29sIFdlYlBhZ2VQcml2YXRlOjpzY3JvbGxOb2RlUmVjdXJzaXZlbHkoTm9kZSogbm9kZSwg
Y29uc3QgSW50U2l6ZSYgZGVsdGEpCit7CisgICAgaWYgKGRlbHRhLmlzWmVybygpKQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7CisgICAgaWYg
KCFyZW5kZXJlcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgRnJhbWVWaWV3KiB2aWV3
ID0gcmVuZGVyZXItPnZpZXcoKS0+ZnJhbWVWaWV3KCk7CisgICAgaWYgKCF2aWV3KQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBUcnkgc2Nyb2xsaW5nIHRoZSByZW5kZXJlci4KKyAg
ICBpZiAoc2Nyb2xsUmVuZGVyZXIocmVuZGVyZXIsIGRlbHRhKSkKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisKKyAgICAvLyBXZSd2ZSBoaXQgdGhlIHBhZ2UsIGRvbid0IHNjcm9sbCBpdCBhbmQgcmV0
dXJuIGZhbHNlLgorICAgIGlmICh2aWV3ID09IG1fbWFpbkZyYW1lLT52aWV3KCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIC8vIFRyeSBzY3JvbGxpbmcgdGhlIEZyYW1lVmlldy4KKyAg
ICBpZiAoY2FuU2Nyb2xsSW5uZXJGcmFtZSh2aWV3LT5mcmFtZSgpKSkgeworICAgICAgICBJbnRT
aXplIHZpZXdEZWx0YSA9IGRlbHRhOworICAgICAgICBJbnRQb2ludCBuZXdWaWV3T2Zmc2V0ID0g
dmlldy0+c2Nyb2xsUG9zaXRpb24oKTsKKyAgICAgICAgSW50UG9pbnQgbWF4Vmlld09mZnNldCA9
IHZpZXctPm1heGltdW1TY3JvbGxQb3NpdGlvbigpOworICAgICAgICBhZGp1c3RTY3JvbGxEZWx0
YShtYXhWaWV3T2Zmc2V0LCBuZXdWaWV3T2Zmc2V0LCB2aWV3RGVsdGEpOworCisgICAgICAgIGlm
ICghdmlld0RlbHRhLmlzWmVybygpKSB7CisgICAgICAgICAgICB2aWV3LT5zZXRDYW5CbGl0T25T
Y3JvbGwoZmFsc2UpOworCisgICAgICAgICAgICBCYWNraW5nU3RvcmVDbGllbnQqIGJhY2tpbmdT
dG9yZUNsaWVudCA9IGJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKHZpZXctPmZyYW1lKCkpOwor
ICAgICAgICAgICAgaWYgKGJhY2tpbmdTdG9yZUNsaWVudCkgeworICAgICAgICAgICAgICAgIGJh
Y2tpbmdTdG9yZUNsaWVudC0+c2V0SXNDbGllbnRHZW5lcmF0ZWRTY3JvbGwodHJ1ZSk7CisgICAg
ICAgICAgICAgICAgYmFja2luZ1N0b3JlQ2xpZW50LT5zZXRJc1Njcm9sbE5vdGlmaWNhdGlvblN1
cHByZXNzZWQodHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1faW5SZWdpb25T
Y3JvbGxTdGFydGluZ05vZGUgPSB2aWV3LT5mcmFtZSgpLT5kb2N1bWVudCgpOworCisgICAgICAg
ICAgICB2aWV3LT5zY3JvbGxCeSh2aWV3RGVsdGEpOworCisgICAgICAgICAgICBpZiAoYmFja2lu
Z1N0b3JlQ2xpZW50KSB7CisgICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlQ2xpZW50LT5zZXRJ
c0NsaWVudEdlbmVyYXRlZFNjcm9sbChmYWxzZSk7CisgICAgICAgICAgICAgICAgYmFja2luZ1N0
b3JlQ2xpZW50LT5zZXRJc1Njcm9sbE5vdGlmaWNhdGlvblN1cHByZXNzZWQoZmFsc2UpOworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIC8vIFRyeSBzY3JvbGxpbmcgdGhlIG5vZGUgb2YgdGhlIGVuY2xvc2luZyBmcmFtZS4K
KyAgICBGcmFtZSogZnJhbWUgPSBub2RlLT5kb2N1bWVudCgpLT5mcmFtZSgpOworICAgIGlmIChm
cmFtZSkgeworICAgICAgICBOb2RlKiBvd25lck5vZGUgPSBzdGF0aWNfY2FzdDxOb2RlKj4oZnJh
bWUtPm93bmVyRWxlbWVudCgpKTsKKyAgICAgICAgaWYgKHNjcm9sbE5vZGVSZWN1cnNpdmVseShv
d25lck5vZGUsIGRlbHRhKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IHJldHVybiBmYWxzZTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6YWRqdXN0U2Nyb2xsRGVs
dGEoY29uc3QgSW50UG9pbnQmIG1heE9mZnNldCwgY29uc3QgSW50UG9pbnQmIGN1cnJlbnRPZmZz
ZXQsIEludFNpemUmIGRlbHRhKSBjb25zdAoreworICAgIGlmIChjdXJyZW50T2Zmc2V0LngoKSAr
IGRlbHRhLndpZHRoKCkgPiBtYXhPZmZzZXQueCgpKQorICAgICAgICBkZWx0YS5zZXRXaWR0aCht
aW4obWF4T2Zmc2V0LngoKSAtIGN1cnJlbnRPZmZzZXQueCgpLCBkZWx0YS53aWR0aCgpKSk7CisK
KyAgICBpZiAoY3VycmVudE9mZnNldC54KCkgKyBkZWx0YS53aWR0aCgpIDwgMCkKKyAgICAgICAg
ZGVsdGEuc2V0V2lkdGgobWF4KC1jdXJyZW50T2Zmc2V0LngoKSwgZGVsdGEud2lkdGgoKSkpOwor
CisgICAgaWYgKGN1cnJlbnRPZmZzZXQueSgpICsgZGVsdGEuaGVpZ2h0KCkgPiBtYXhPZmZzZXQu
eSgpKQorICAgICAgICBkZWx0YS5zZXRIZWlnaHQobWluKG1heE9mZnNldC55KCkgLSBjdXJyZW50
T2Zmc2V0LnkoKSwgZGVsdGEuaGVpZ2h0KCkpKTsKKworICAgIGlmIChjdXJyZW50T2Zmc2V0Lnko
KSArIGRlbHRhLmhlaWdodCgpIDwgMCkKKyAgICAgICAgZGVsdGEuc2V0SGVpZ2h0KG1heCgtY3Vy
cmVudE9mZnNldC55KCksIGRlbHRhLmhlaWdodCgpKSk7Cit9CisKK3N0YXRpYyBOb2RlKiBlbmNs
b3NpbmdMYXllck5vZGUoUmVuZGVyTGF5ZXIqKTsKKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6c2Ny
b2xsUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgSW50U2l6ZSYgZGVsdGEp
Cit7CisgICAgUmVuZGVyTGF5ZXIqIGxheWVyID0gcmVuZGVyZXItPmVuY2xvc2luZ0xheWVyKCk7
CisgICAgaWYgKCFsYXllcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVHJ5IHRv
IHNjcm9sbCBsYXllci4KKyAgICBib29sIHJlc3RyaWN0ZWRCeUxpbmVDbGFtcCA9IGZhbHNlOwor
ICAgIGlmIChyZW5kZXJlci0+cGFyZW50KCkpCisgICAgICAgIHJlc3RyaWN0ZWRCeUxpbmVDbGFt
cCA9ICFyZW5kZXJlci0+cGFyZW50KCktPnN0eWxlKCktPmxpbmVDbGFtcCgpLmlzTm9uZSgpOwor
CisgICAgaWYgKHJlbmRlcmVyLT5oYXNPdmVyZmxvd0NsaXAoKSAmJiAhcmVzdHJpY3RlZEJ5TGlu
ZUNsYW1wKSB7CisgICAgICAgIEludFNpemUgbGF5ZXJEZWx0YSA9IGRlbHRhOworICAgICAgICBJ
bnRQb2ludCBtYXhPZmZzZXQobGF5ZXItPnNjcm9sbFdpZHRoKCkgLSBsYXllci0+cmVuZGVyQm94
KCktPmNsaWVudFdpZHRoKCksIGxheWVyLT5zY3JvbGxIZWlnaHQoKSAtIGxheWVyLT5yZW5kZXJC
b3goKS0+Y2xpZW50SGVpZ2h0KCkpOworICAgICAgICBJbnRQb2ludCBjdXJyZW50T2Zmc2V0KGxh
eWVyLT5zY3JvbGxYT2Zmc2V0KCksIGxheWVyLT5zY3JvbGxZT2Zmc2V0KCkpOworICAgICAgICBh
ZGp1c3RTY3JvbGxEZWx0YShtYXhPZmZzZXQsIGN1cnJlbnRPZmZzZXQsIGxheWVyRGVsdGEpOwor
ICAgICAgICBpZiAoIWxheWVyRGVsdGEuaXNaZXJvKCkpIHsKKyAgICAgICAgICAgIG1faW5SZWdp
b25TY3JvbGxTdGFydGluZ05vZGUgPSBlbmNsb3NpbmdMYXllck5vZGUobGF5ZXIpOworICAgICAg
ICAgICAgSW50UG9pbnQgbmV3T2Zmc2V0ID0gY3VycmVudE9mZnNldCArIGxheWVyRGVsdGE7Cisg
ICAgICAgICAgICBsYXllci0+c2Nyb2xsVG9PZmZzZXQobmV3T2Zmc2V0LngoKSwgbmV3T2Zmc2V0
LnkoKSk7CisgICAgICAgICAgICByZW5kZXJlci0+cmVwYWludCh0cnVlKTsKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKGxheWVyID0gbGF5
ZXItPnBhcmVudCgpKSB7CisgICAgICAgIGlmIChjYW5TY3JvbGxSZW5kZXJCb3gobGF5ZXItPnJl
bmRlckJveCgpKSkKKyAgICAgICAgICAgIHJldHVybiBzY3JvbGxSZW5kZXJlcihsYXllci0+cmVu
ZGVyQm94KCksIGRlbHRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRp
YyB2b2lkIGhhbmRsZVNjcm9sbGluZyh1bnNpZ25lZCBzaG9ydCBjaGFyYWN0ZXIsIFdlYlBhZ2VQ
cml2YXRlKiBzY3JvbGxlcikKK3sKKyAgICBjb25zdCBpbnQgc2Nyb2xsRmFjdG9yID0gMjA7Cisg
ICAgaW50IGR4ID0gMCwgZHkgPSAwOworICAgIHN3aXRjaCAoY2hhcmFjdGVyKSB7CisgICAgY2Fz
ZSBLRVlDT0RFX0xFRlQ6CisgICAgICAgIGR4ID0gLXNjcm9sbEZhY3RvcjsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBLRVlDT0RFX1JJR0hUOgorICAgICAgICBkeCA9IHNjcm9sbEZhY3RvcjsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLRVlDT0RFX1VQOgorICAgICAgICBkeSA9IC1zY3Jv
bGxGYWN0b3I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0VZQ09ERV9ET1dOOgorICAgICAg
ICBkeSA9IHNjcm9sbEZhY3RvcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLRVlDT0RFX1BH
X1VQOgorICAgICAgICBBU1NFUlQoc2Nyb2xsZXIpOworICAgICAgICBkeSA9IHNjcm9sbEZhY3Rv
ciAtIHNjcm9sbGVyLT5hY3R1YWxWaXNpYmxlU2l6ZSgpLmhlaWdodCgpOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIEtFWUNPREVfUEdfRE9XTjoKKyAgICAgICAgQVNTRVJUKHNjcm9sbGVyKTsK
KyAgICAgICAgZHkgPSBzY3JvbGxlci0+YWN0dWFsVmlzaWJsZVNpemUoKS5oZWlnaHQoKSAtIHNj
cm9sbEZhY3RvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGR4IHx8IGR5KSB7
CisgICAgICAgIC8vIERvbid0IHVzZSB0aGUgc2Nyb2xsQnkgZnVuY3Rpb24gYmVjYXVzZSBpdCB0
cmlnZ2VycyB0aGUgc2Nyb2xsIGFzIG9yaWdpbmF0aW5nIGZyb20gQmxhY2tCZXJyeQorICAgICAg
ICAvLyBidXQgdGhlbiBpdCBleHBlY3RzIGEgc2VwYXJhdGUgaW52YWxpZGF0ZSB3aGljaCBpc24n
dCBzZW50IGluIHRoaXMgY2FzZS4KKyAgICAgICAgQVNTRVJUKHNjcm9sbGVyICYmIHNjcm9sbGVy
LT5tX21haW5GcmFtZSAmJiBzY3JvbGxlci0+bV9tYWluRnJhbWUtPnZpZXcoKSk7CisgICAgICAg
IEludFBvaW50IHBvcyhzY3JvbGxlci0+c2Nyb2xsUG9zaXRpb24oKSArIEludFNpemUoZHgsIGR5
KSk7CisKKyAgICAgICAgLy8gUHJldmVudCBvdmVyIHNjcm9sbGluZyBmb3IgYXJyb3dzIGFuZCBQ
YWdlIHVwL2Rvd24uCisgICAgICAgIGlmIChwb3MueCgpIDwgMCkKKyAgICAgICAgICAgIHBvcy5z
ZXRYKDApOworICAgICAgICBpZiAocG9zLnkoKSA8IDApCisgICAgICAgICAgICBwb3Muc2V0WSgw
KTsKKyAgICAgICAgaWYgKHBvcy54KCkgKyBzY3JvbGxlci0+YWN0dWFsVmlzaWJsZVNpemUoKS53
aWR0aCgpID4gc2Nyb2xsZXItPmNvbnRlbnRzU2l6ZSgpLndpZHRoKCkpCisgICAgICAgICAgICBw
b3Muc2V0WChzY3JvbGxlci0+Y29udGVudHNTaXplKCkud2lkdGgoKSAtIHNjcm9sbGVyLT5hY3R1
YWxWaXNpYmxlU2l6ZSgpLndpZHRoKCkpOworICAgICAgICBpZiAocG9zLnkoKSArIHNjcm9sbGVy
LT5hY3R1YWxWaXNpYmxlU2l6ZSgpLmhlaWdodCgpID4gc2Nyb2xsZXItPmNvbnRlbnRzU2l6ZSgp
LmhlaWdodCgpKQorICAgICAgICAgICAgcG9zLnNldFkoc2Nyb2xsZXItPmNvbnRlbnRzU2l6ZSgp
LmhlaWdodCgpIC0gc2Nyb2xsZXItPmFjdHVhbFZpc2libGVTaXplKCkuaGVpZ2h0KCkpOworCisg
ICAgICAgIHNjcm9sbGVyLT5tX21haW5GcmFtZS0+dmlldygpLT5zZXRTY3JvbGxQb3NpdGlvbihw
b3MpOworICAgICAgICBzY3JvbGxlci0+bV9jbGllbnQtPnNjcm9sbENoYW5nZWQocG9zKTsKKyAg
ICB9Cit9CisKK2Jvb2wgV2ViUGFnZTo6a2V5RXZlbnQoY29uc3QgUGxhdGZvcm06OktleWJvYXJk
RXZlbnQmIGtleWJvYXJkRXZlbnQpCit7CisgICAgaWYgKCFkLT5tX21haW5GcmFtZS0+dmlldygp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBBU1NFUlQoZC0+bV9wYWdlLT5mb2N1c0Nv
bnRyb2xsZXIoKSk7CisKKyAgICBib29sIGhhbmRsZWQgPSBkLT5tX2lucHV0SGFuZGxlci0+aGFu
ZGxlS2V5Ym9hcmRJbnB1dChrZXlib2FyZEV2ZW50KTsKKworICAgIGlmICghaGFuZGxlZCAmJiBr
ZXlib2FyZEV2ZW50LnR5cGUoKSA9PSBQbGF0Zm9ybTo6S2V5Ym9hcmRFdmVudDo6S2V5RG93biAm
JiAhZC0+bV9pbnB1dEhhbmRsZXItPmlzSW5wdXRNb2RlKCkpIHsKKyAgICAgICAgSW50UG9pbnQg
cHJldmlvdXNQb3MgPSBkLT5zY3JvbGxQb3NpdGlvbigpOworICAgICAgICBoYW5kbGVTY3JvbGxp
bmcoa2V5Ym9hcmRFdmVudC5jaGFyYWN0ZXIoKSwgZCk7CisgICAgICAgIGhhbmRsZWQgPSBwcmV2
aW91c1BvcyAhPSBkLT5zY3JvbGxQb3NpdGlvbigpOworICAgIH0KKworICAgIHJldHVybiBoYW5k
bGVkOworfQorCit2b2lkIFdlYlBhZ2U6Om5hdmlnYXRpb25Nb3ZlRXZlbnQoY29uc3QgdW5zaWdu
ZWQgc2hvcnQgY2hhcmFjdGVyLCBib29sIHNoaWZ0RG93biwgYm9vbCBhbHREb3duKQoreworICAg
IGlmICghZC0+bV9tYWluRnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNT
RVJUKGQtPm1fcGFnZS0+Zm9jdXNDb250cm9sbGVyKCkpOworICAgIGQtPm1faW5wdXRIYW5kbGVy
LT5oYW5kbGVOYXZpZ2F0aW9uTW92ZShjaGFyYWN0ZXIsIHNoaWZ0RG93biwgYWx0RG93bik7Cit9
CisKK2Jvb2wgV2ViUGFnZTo6ZGVsZXRlVGV4dFJlbGF0aXZlVG9DdXJzb3IodW5zaWduZWQgaW50
IGxlZnRPZmZzZXQsIHVuc2lnbmVkIGludCByaWdodE9mZnNldCkKK3sKKyAgICByZXR1cm4gZC0+
bV9pbnB1dEhhbmRsZXItPmRlbGV0ZVRleHRSZWxhdGl2ZVRvQ3Vyc29yKGxlZnRPZmZzZXQsIHJp
Z2h0T2Zmc2V0KTsKK30KKworc3Bhbm5hYmxlX3N0cmluZ190KiBXZWJQYWdlOjpzZWxlY3RlZFRl
eHQoaW50MzJfdCBmbGFncykKK3sKKyAgICByZXR1cm4gZC0+bV9pbnB1dEhhbmRsZXItPnNlbGVj
dGVkVGV4dChmbGFncyk7Cit9CisKK3NwYW5uYWJsZV9zdHJpbmdfdCogV2ViUGFnZTo6dGV4dEJl
Zm9yZUN1cnNvcihpbnQzMl90IGxlbmd0aCwgaW50MzJfdCBmbGFncykKK3sKKyAgICByZXR1cm4g
ZC0+bV9pbnB1dEhhbmRsZXItPnRleHRCZWZvcmVDdXJzb3IobGVuZ3RoLCBmbGFncyk7Cit9CisK
K3NwYW5uYWJsZV9zdHJpbmdfdCogV2ViUGFnZTo6dGV4dEFmdGVyQ3Vyc29yKGludDMyX3QgbGVu
Z3RoLCBpbnQzMl90IGZsYWdzKQoreworICAgIHJldHVybiBkLT5tX2lucHV0SGFuZGxlci0+dGV4
dEFmdGVyQ3Vyc29yKGxlbmd0aCwgZmxhZ3MpOworfQorCitleHRyYWN0ZWRfdGV4dF90KiBXZWJQ
YWdlOjpleHRyYWN0ZWRUZXh0UmVxdWVzdChleHRyYWN0ZWRfdGV4dF9yZXF1ZXN0X3QqIHJlcXVl
c3QsIGludDMyX3QgZmxhZ3MpCit7CisgICAgcmV0dXJuIGQtPm1faW5wdXRIYW5kbGVyLT5leHRy
YWN0ZWRUZXh0UmVxdWVzdChyZXF1ZXN0LCBmbGFncyk7Cit9CisKK2ludDMyX3QgV2ViUGFnZTo6
c2V0Q29tcG9zaW5nUmVnaW9uKGludDMyX3Qgc3RhcnQsIGludDMyX3QgZW5kKQoreworICAgIHJl
dHVybiBkLT5tX2lucHV0SGFuZGxlci0+c2V0Q29tcG9zaW5nUmVnaW9uKHN0YXJ0LCBlbmQpOwor
fQorCitpbnQzMl90IFdlYlBhZ2U6OmZpbmlzaENvbXBvc2l0aW9uKCkKK3sKKyAgICByZXR1cm4g
ZC0+bV9pbnB1dEhhbmRsZXItPmZpbmlzaENvbXBvc2l0aW9uKCk7Cit9CisKK2ludDMyX3QgV2Vi
UGFnZTo6c2V0Q29tcG9zaW5nVGV4dChzcGFubmFibGVfc3RyaW5nX3QqIHNwYW5uYWJsZVN0cmlu
ZywgaW50MzJfdCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uKQoreworICAgIHJldHVybiBkLT5tX2lu
cHV0SGFuZGxlci0+c2V0Q29tcG9zaW5nVGV4dChzcGFubmFibGVTdHJpbmcsIHJlbGF0aXZlQ3Vy
c29yUG9zaXRpb24pOworfQorCitpbnQzMl90IFdlYlBhZ2U6OmNvbW1pdFRleHQoc3Bhbm5hYmxl
X3N0cmluZ190KiBzcGFubmFibGVTdHJpbmcsIGludDMyX3QgcmVsYXRpdmVDdXJzb3JQb3NpdGlv
bikKK3sKKyAgICByZXR1cm4gZC0+bV9pbnB1dEhhbmRsZXItPmNvbW1pdFRleHQoc3Bhbm5hYmxl
U3RyaW5nLCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uKTsKK30KKwordm9pZCBXZWJQYWdlOjpzcGVs
bENoZWNraW5nRW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgc3RhdGljX2Nhc3Q8RWRpdG9y
Q2xpZW50QmxhY2tCZXJyeSo+KGQtPm1fcGFnZS0+ZWRpdG9yQ2xpZW50KCkpLT5lbmFibGVTcGVs
bENoZWNraW5nKGVuYWJsZWQpOworfQorCit2b2lkIFdlYlBhZ2U6OnNlbGVjdGlvbkNhbmNlbGxl
ZCgpCit7CisgICAgZC0+bV9zZWxlY3Rpb25IYW5kbGVyLT5jYW5jZWxTZWxlY3Rpb24oKTsKK30K
KworYm9vbCBXZWJQYWdlOjpzZWxlY3Rpb25Db250YWlucyhjb25zdCBQbGF0Zm9ybTo6SW50UG9p
bnQmIHBvaW50KQoreworICAgIHJldHVybiBkLT5tX3NlbGVjdGlvbkhhbmRsZXItPnNlbGVjdGlv
bkNvbnRhaW5zKGQtPm1hcEZyb21UcmFuc2Zvcm1lZChwb2ludCkpOworfQorCitXZWJTdHJpbmcg
V2ViUGFnZTo6dGl0bGUoKSBjb25zdAoreworICAgIGlmIChkLT5tX21haW5GcmFtZS0+ZG9jdW1l
bnQoKSkKKyAgICAgICAgcmV0dXJuIGQtPm1fbWFpbkZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRM
b2FkZXIoKS0+dGl0bGUoKS5zdHJpbmcoKTsKKyAgICByZXR1cm4gV2ViU3RyaW5nKCk7Cit9CisK
K1dlYlN0cmluZyBXZWJQYWdlOjpzZWxlY3RlZFRleHQoKSBjb25zdAoreworICAgIHJldHVybiBk
LT5tX3NlbGVjdGlvbkhhbmRsZXItPnNlbGVjdGVkVGV4dCgpOworfQorCitXZWJTdHJpbmcgV2Vi
UGFnZTo6Y3V0U2VsZWN0ZWRUZXh0KCkKK3sKKyAgICBXZWJTdHJpbmcgc2VsZWN0ZWRUZXh0ID0g
ZC0+bV9zZWxlY3Rpb25IYW5kbGVyLT5zZWxlY3RlZFRleHQoKTsKKyAgICBpZiAoIXNlbGVjdGVk
VGV4dC5pc0VtcHR5KCkpCisgICAgICAgIGQtPm1faW5wdXRIYW5kbGVyLT5kZWxldGVTZWxlY3Rp
b24oKTsKKyAgICByZXR1cm4gc2VsZWN0ZWRUZXh0OworfQorCit2b2lkIFdlYlBhZ2U6Omluc2Vy
dFRleHQoY29uc3QgV2ViU3RyaW5nJiBzdHJpbmcpCit7CisgICAgZC0+bV9pbnB1dEhhbmRsZXIt
Pmluc2VydFRleHQoc3RyaW5nKTsKK30KKwordm9pZCBXZWJQYWdlOjpjbGVhckN1cnJlbnRJbnB1
dEZpZWxkKCkKK3sKKyAgICBkLT5tX2lucHV0SGFuZGxlci0+Y2xlYXJGaWVsZCgpOworfQorCit2
b2lkIFdlYlBhZ2U6OmN1dCgpCit7CisgICAgZC0+bV9pbnB1dEhhbmRsZXItPmN1dCgpOworfQor
Cit2b2lkIFdlYlBhZ2U6OmNvcHkoKQoreworICAgIGQtPm1faW5wdXRIYW5kbGVyLT5jb3B5KCk7
Cit9CisKK3ZvaWQgV2ViUGFnZTo6cGFzdGUoKQoreworICAgIGQtPm1faW5wdXRIYW5kbGVyLT5w
YXN0ZSgpOworfQorCit2b2lkIFdlYlBhZ2U6OnNldFNlbGVjdGlvbihjb25zdCBQbGF0Zm9ybTo6
SW50UG9pbnQmIHN0YXJ0UG9pbnQsIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgZW5kUG9pbnQp
Cit7CisgICAgLy8gVHJhbnNmb3JtIHRoaXMgZXZlbnRzIGNvb3JkaW5hdGVzIHRvIHdlYmtpdCBj
b250ZW50IGNvb3JkaW5hdGVzLgorICAgIC8vIEZJWE1FOiBEb24ndCB0cmFuc2Zvcm0gdGhlIHNl
bnRpbmVsLCBiZWNhdXNlIGl0IG1heSBiZSB0cmFuc2Zvcm1lZCB0byBhIGZsb2F0aW5nIG51bWJl
cgorICAgIC8vIHdoaWNoIGNvdWxkIGJlIHJvdW5kZWQgdG8gMCBvciBvdGhlciBudW1iZXJzLiBU
aGlzIHdvcmthcm91bmQgc2hvdWxkIGJlIHJlbW92ZWQgYWZ0ZXIKKyAgICAvLyB0aGUgZXJyb3Ig
b2Ygcm91bmRVbnRyYW5zZm9ybWVkUG9pbnQoKSBpcyBmaXhlZC4KKyAgICBJbnRQb2ludCBzdGFy
dCA9CisgICAgICAgICAgICBJbnRQb2ludChzdGFydFBvaW50KSA9PSBET01TdXBwb3J0OjpJbnZh
bGlkUG9pbnQgPworICAgICAgICAgICAgRE9NU3VwcG9ydDo6SW52YWxpZFBvaW50IDoKKyAgICAg
ICAgICAgIGQtPm1hcEZyb21UcmFuc2Zvcm1lZChzdGFydFBvaW50KTsKKyAgICBJbnRQb2ludCBl
bmQgPQorICAgICAgICAgICAgSW50UG9pbnQoZW5kUG9pbnQpID09IERPTVN1cHBvcnQ6OkludmFs
aWRQb2ludCA/CisgICAgICAgICAgICBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQgOgorICAgICAg
ICAgICAgZC0+bWFwRnJvbVRyYW5zZm9ybWVkKGVuZFBvaW50KTsKKworICAgIGQtPm1fc2VsZWN0
aW9uSGFuZGxlci0+c2V0U2VsZWN0aW9uKHN0YXJ0LCBlbmQpOworfQorCit2b2lkIFdlYlBhZ2U6
OnNldENhcmV0UG9zaXRpb24oY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBwb3NpdGlvbikKK3sK
KyAgICAvLyBIYW5kbGVkIGJ5IHNlbGVjdGlvbiBoYW5kbGVyIGFzIGl0J3MgcG9pbnQgYmFzZWQu
CisgICAgLy8gVHJhbnNmb3JtIHRoaXMgZXZlbnRzIGNvb3JkaW5hdGVzIHRvIHdlYmtpdCBjb250
ZW50IGNvb3JkaW5hdGVzLgorICAgIGQtPm1fc2VsZWN0aW9uSGFuZGxlci0+c2V0Q2FyZXRQb3Np
dGlvbihkLT5tYXBGcm9tVHJhbnNmb3JtZWQocG9zaXRpb24pKTsKK30KKwordm9pZCBXZWJQYWdl
OjpzZWxlY3RBdFBvaW50KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgbG9jYXRpb24pCit7Cisg
ICAgLy8gVHJhbnNmb3JtIHRoaXMgZXZlbnRzIGNvb3JkaW5hdGVzIHRvIHdlYmtpdCBjb250ZW50
IGNvb3JkaW5hdGVzIGlmIGl0CisgICAgLy8gaXMgbm90IHRoZSBzZW50aW5lbCB2YWx1ZS4KKyAg
ICBJbnRQb2ludCBzZWxlY3Rpb25Mb2NhdGlvbiA9CisgICAgICAgICAgICBJbnRQb2ludChsb2Nh
dGlvbikgPT0gRE9NU3VwcG9ydDo6SW52YWxpZFBvaW50ID8KKyAgICAgICAgICAgIERPTVN1cHBv
cnQ6OkludmFsaWRQb2ludCA6CisgICAgICAgICAgICBkLT5tYXBGcm9tVHJhbnNmb3JtZWQobG9j
YXRpb24pOworCisgICAgZC0+bV9zZWxlY3Rpb25IYW5kbGVyLT5zZWxlY3RBdFBvaW50KHNlbGVj
dGlvbkxvY2F0aW9uKTsKK30KKworLy8gUmV0dXJuZWQgc2Nyb2xsIHBvc2l0aW9uIGlzIGluIHRy
YW5zZm9ybWVkIGNvb3JkaW5hdGVzLgorUGxhdGZvcm06OkludFBvaW50IFdlYlBhZ2U6OnNjcm9s
bFBvc2l0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+dHJhbnNmb3JtZWRTY3JvbGxQb3Np
dGlvbigpOworfQorCisvLyBTZXR0aW5nIHRoZSBzY3JvbGwgcG9zaXRpb24gaXMgaW4gdHJhbnNm
b3JtZWQgY29vcmRpbmF0ZXMuCit2b2lkIFdlYlBhZ2U6OnNldFNjcm9sbFBvc2l0aW9uKGNvbnN0
IFBsYXRmb3JtOjpJbnRQb2ludCYgcG9pbnQpCit7CisgICAgaWYgKGQtPnRyYW5zZm9ybWVkUG9p
bnRFcXVhbHNVbnRyYW5zZm9ybWVkUG9pbnQocG9pbnQsIGQtPnNjcm9sbFBvc2l0aW9uKCkpKQor
ICAgICAgICByZXR1cm47CisKKyAgICAvLyBJZiB0aGUgdXNlciByZWNlbnRseSBwZXJmb3JtZWQg
YW4gZXZlbnQsIHRoaXMgbmV3IHNjcm9sbCBwb3NpdGlvbgorICAgIC8vIGNvdWxkIHBvc3NpYmx5
IGJlIGEgcmVzdWx0IG9mIHRoYXQuIE9yIG5vdCwgdGhpcyBpcyBqdXN0IGEgaGV1cmlzdGljLgor
ICAgIGlmIChjdXJyZW50VGltZSgpIC0gZC0+bV9sYXN0VXNlckV2ZW50VGltZXN0YW1wIDwgbWFu
dWFsU2Nyb2xsSW50ZXJ2YWwpCisgICAgICAgIGQtPm1fdXNlclBlcmZvcm1lZE1hbnVhbFNjcm9s
bCA9IHRydWU7CisKKyAgICBkLT5tX2JhY2tpbmdTdG9yZUNsaWVudC0+c2V0SXNDbGllbnRHZW5l
cmF0ZWRTY3JvbGwodHJ1ZSk7CisgICAgZC0+bV9tYWluRnJhbWUtPnZpZXcoKS0+c2V0Q2FuT3Zl
cnNjcm9sbCh0cnVlKTsKKyAgICBkLT5zZXRTY3JvbGxQb3NpdGlvbihkLT5tYXBGcm9tVHJhbnNm
b3JtZWQocG9pbnQpKTsKKyAgICBkLT5tX21haW5GcmFtZS0+dmlldygpLT5zZXRDYW5PdmVyc2Ny
b2xsKGZhbHNlKTsKKyAgICBkLT5tX2JhY2tpbmdTdG9yZUNsaWVudC0+c2V0SXNDbGllbnRHZW5l
cmF0ZWRTY3JvbGwoZmFsc2UpOworfQorCitXZWJTdHJpbmcgV2ViUGFnZTo6dGV4dEVuY29kaW5n
KCkKK3sKKyAgICBGcmFtZSogZnJhbWUgPSBkLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICBp
ZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gIiI7CisKKyAgICBEb2N1bWVudCogZG9jdW1lbnQg
PSBmcmFtZS0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIWRvY3VtZW50KQorICAgICAgICByZXR1cm4g
IiI7CisKKyAgICByZXR1cm4gZG9jdW1lbnQtPmxvYWRlcigpLT53cml0ZXIoKS0+ZW5jb2Rpbmco
KTsKK30KKworV2ViU3RyaW5nIFdlYlBhZ2U6OmZvcmNlZFRleHRFbmNvZGluZygpCit7CisgICAg
RnJhbWUqIGZyYW1lID0gZC0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkK
KyAgICAgICAgcmV0dXJuICIiOworCisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gZnJhbWUtPmRv
Y3VtZW50KCk7CisgICAgaWYgKCFkb2N1bWVudCkKKyAgICAgICAgcmV0dXJuICIiOworCisgICAg
cmV0dXJuIGRvY3VtZW50LT5sb2FkZXIoKS0+b3ZlcnJpZGVFbmNvZGluZygpOworfQorCit2b2lk
IFdlYlBhZ2U6OnNldEZvcmNlZFRleHRFbmNvZGluZyhjb25zdCBjaGFyKiBlbmNvZGluZykKK3sK
KyAgICBpZiAoZW5jb2RpbmcgJiYgZC0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkgJiYgZC0+Zm9jdXNl
ZE9yTWFpbkZyYW1lKCktPmxvYWRlcigpICYmIGQtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5sb2Fk
ZXIoKSkKKyAgICAgICAgcmV0dXJuIGQtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5sb2FkZXIoKS0+
cmVsb2FkV2l0aE92ZXJyaWRlRW5jb2RpbmcoZW5jb2RpbmcpOworfQorCisvLyBGSVhNRTogTW92
ZSB0byBET01TdXBwb3J0LgorYm9vbCBXZWJQYWdlUHJpdmF0ZTo6Y2FuU2Nyb2xsSW5uZXJGcmFt
ZShGcmFtZSogZnJhbWUpIGNvbnN0Cit7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgaWYgKCFmcmFtZS0+dmlldygpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICAvLyBOb3QgaGF2aW5nIGFuIG93bmVyIGVsZW1lbnQgbWVhbnMgdGhhdCB3ZSBhcmUg
b24gdGhlIG1haW5mcmFtZS4KKyAgICBpZiAoIWZyYW1lLT5vd25lckVsZW1lbnQoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgQVNTRVJUKGZyYW1lICE9IG1fbWFpbkZyYW1lKTsKKwor
ICAgIEludFNpemUgdmlzaWJsZVNpemUgPSBmcmFtZS0+dmlldygpLT52aXNpYmxlQ29udGVudFJl
Y3QoKS5zaXplKCk7CisgICAgSW50U2l6ZSBjb250ZW50c1NpemUgPSBmcmFtZS0+dmlldygpLT5j
b250ZW50c1NpemUoKTsKKworICAgIGJvb2wgY2FuQmVTY3JvbGxlZCA9IGNvbnRlbnRzU2l6ZS5o
ZWlnaHQoKSA+IHZpc2libGVTaXplLmhlaWdodCgpIHx8IGNvbnRlbnRzU2l6ZS53aWR0aCgpID4g
dmlzaWJsZVNpemUud2lkdGgoKTsKKworICAgIC8vIExldHMgYWxzbyBjb25zaWRlciB0aGUgJ292
ZXJmbG93LXt4LHl9IHByb3BlcnR5IHNldCBkaXJlY3RseSB0byB0aGUge2l9ZnJhbWUgdGFnLgor
ICAgIHJldHVybiBjYW5CZVNjcm9sbGVkICYmIChmcmFtZS0+b3duZXJFbGVtZW50KCktPnNjcm9s
bGluZ01vZGUoKSAhPSBTY3JvbGxiYXJBbHdheXNPZmYpOworfQorCisvLyBUaGUgUmVuZGVyQm94
OjpjYW5iZVNjcm9sbGVkQW5kSGFzU2Nyb2xsYWJsZUFyZWEgbWV0aG9kIHJldHVybnMgdHJ1ZSBm
b3IgdGhlCisvLyBmb2xsb3dpbmcgc2NlbmFyaW8sIGZvciBleGFtcGxlOgorLy8gKDEpIGEgZGl2
IHRoYXQgaGFzIGEgdmVydGljYWwgb3ZlcmZsb3cgYnV0IG5vIGhvcml6b250YWwgb3ZlcmZsb3cK
Ky8vICAgICB3aXRoIG92ZXJmbG93LXk6IGhpZGRlbiBhbmQgb3ZlcmZsb3cteDogYXV0byBzZXQu
CisvLyBUaGUgdmVyc2lvbiBiZWxvdyBmaXhlcyBpdC4KKy8vIEZJWE1FOiBGaXggaXQgdXBzdHJl
YW0hCitib29sIFdlYlBhZ2VQcml2YXRlOjpjYW5TY3JvbGxSZW5kZXJCb3goUmVuZGVyQm94KiBi
b3gpCit7CisgICAgaWYgKCFib3gpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICgh
Ym94LT5oYXNPdmVyZmxvd0NsaXAoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYg
KGJveC0+c2Nyb2xsc092ZXJmbG93WCgpICYmIChib3gtPnNjcm9sbFdpZHRoKCkgIT0gYm94LT5j
bGllbnRXaWR0aCgpKQorICAgICAgICB8fCBib3gtPnNjcm9sbHNPdmVyZmxvd1koKSAmJiAoYm94
LT5zY3JvbGxIZWlnaHQoKSAhPSBib3gtPmNsaWVudEhlaWdodCgpKSkKKyAgICAgICAgcmV0dXJu
IHRydWU7CisKKyAgICBOb2RlKiBub2RlID0gYm94LT5ub2RlKCk7CisgICAgcmV0dXJuIG5vZGUg
JiYgKG5vZGUtPnJlbmRlcmVySXNFZGl0YWJsZSgpIHx8IG5vZGUtPmlzRG9jdW1lbnROb2RlKCkp
OworfQorCitzdGF0aWMgUmVuZGVyTGF5ZXIqIHBhcmVudExheWVyKFJlbmRlckxheWVyKiBsYXll
cikKK3sKKyAgICBBU1NFUlQobGF5ZXIpOworCisgICAgaWYgKGxheWVyLT5wYXJlbnQoKSkKKyAg
ICAgICAgcmV0dXJuIGxheWVyLT5wYXJlbnQoKTsKKworICAgIFJlbmRlck9iamVjdCogcmVuZGVy
ZXIgPSBsYXllci0+cmVuZGVyZXIoKTsKKyAgICBpZiAocmVuZGVyZXItPmRvY3VtZW50KCkgJiYg
cmVuZGVyZXItPmRvY3VtZW50KCktPm93bmVyRWxlbWVudCgpICYmIHJlbmRlcmVyLT5kb2N1bWVu
dCgpLT5vd25lckVsZW1lbnQoKS0+cmVuZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuIHJlbmRlcmVy
LT5kb2N1bWVudCgpLT5vd25lckVsZW1lbnQoKS0+cmVuZGVyZXIoKS0+ZW5jbG9zaW5nTGF5ZXIo
KTsKKworICAgIHJldHVybiAwOworfQorCisvLyBGSVhNRTogTWFrZSBSZW5kZXJMYXllcjo6ZW5j
bG9zaW5nRWxlbWVudCBwdWJsaWMgc28gdGhpcyBvbmUgY2FuIGJlIHJlbW92ZWQuCitzdGF0aWMg
Tm9kZSogZW5jbG9zaW5nTGF5ZXJOb2RlKFJlbmRlckxheWVyKiBsYXllcikKK3sKKyAgICBmb3Ig
KFJlbmRlck9iamVjdCogciA9IGxheWVyLT5yZW5kZXJlcigpOyByOyByID0gci0+cGFyZW50KCkp
IHsKKyAgICAgICAgaWYgKE5vZGUqIGUgPSByLT5ub2RlKCkpCisgICAgICAgICAgICByZXR1cm4g
ZTsKKyAgICB9CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisK
K3ZvaWQgcHVzaEJhY2tJblJlZ2lvblNjcm9sbGFibGUoc3RkOjp2ZWN0b3I8UGxhdGZvcm06OlNj
cm9sbFZpZXdCYXNlPiYgdmVjdG9yLCBJblJlZ2lvblNjcm9sbGFibGVBcmVhIHNjcm9sbGVyLCBX
ZWJQYWdlUHJpdmF0ZSogd2ViUGFnZSkKK3sKKyAgICBBU1NFUlQod2ViUGFnZSk7CisgICAgQVNT
RVJUKCFzY3JvbGxlci5pc051bGwoKSk7CisKKyAgICBzY3JvbGxlci5zZXRDYW5Qcm9wYWdhdGVT
Y3JvbGxpbmdUb0VuY2xvc2luZ1Njcm9sbGFibGUoIWlzTm9uUmVuZGVyVmlld0ZpeGVkUG9zaXRp
b25lZENvbnRhaW5lcihzY3JvbGxlci5sYXllcigpKSk7CisgICAgdmVjdG9yLnB1c2hfYmFjayhz
Y3JvbGxlcik7CisgICAgaWYgKHZlY3Rvci5zaXplKCkgPT0gMSkgeworICAgICAgICAvLyBGSVhN
RTogVXNlIFJlbmRlckxheWVyOjpyZW5kZXJCb3goKS0+bm9kZSgpIGluc3RlYWQ/CisgICAgICAg
IHdlYlBhZ2UtPm1faW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGUgPSBlbmNsb3NpbmdMYXllck5v
ZGUoc2Nyb2xsZXIubGF5ZXIoKSk7CisgICAgfQorfQorCitzdGQ6OnZlY3RvcjxQbGF0Zm9ybTo6
U2Nyb2xsVmlld0Jhc2U+IFdlYlBhZ2VQcml2YXRlOjppblJlZ2lvblNjcm9sbGFibGVBcmVhc0Zv
clBvaW50KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgcG9pbnQpCit7CisgICAgc3RkOjp2ZWN0
b3I8UGxhdGZvcm06OlNjcm9sbFZpZXdCYXNlPiB2YWxpZFJldHVybjsKKyAgICBzdGQ6OnZlY3Rv
cjxQbGF0Zm9ybTo6U2Nyb2xsVmlld0Jhc2U+IGVtcHR5UmV0dXJuOworCisgICAgSGl0VGVzdFJl
c3VsdCByZXN1bHQgPSBtX21haW5GcmFtZS0+ZXZlbnRIYW5kbGVyKCktPmhpdFRlc3RSZXN1bHRB
dFBvaW50KG1hcEZyb21WaWV3cG9ydFRvQ29udGVudHMocG9pbnQpLCBmYWxzZSAvKmFsbG93U2hh
ZG93Q29udGVudCovKTsKKyAgICBOb2RlKiBub2RlID0gcmVzdWx0LmlubmVyTm9uU2hhcmVkTm9k
ZSgpOworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIGVtcHR5UmV0dXJuOworCisgICAg
UmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7CisgICAgLy8gRklYTUU6
IFZhbGlkYXRlIHdpdGggZWxlbWVudHMgd2l0aCB2aXNpYmlsaXR5OmhpZGRlbi4KKyAgICBpZiAo
IXJlbmRlcmVyKQorICAgICAgICByZXR1cm4gZW1wdHlSZXR1cm47CisKKyAgICBSZW5kZXJMYXll
ciogbGF5ZXIgPSByZW5kZXJlci0+ZW5jbG9zaW5nTGF5ZXIoKTsKKworICAgIGRvIHsKKyAgICAg
ICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGxheWVyLT5yZW5kZXJlcigpOworCisgICAgICAg
IGlmIChyZW5kZXJlci0+aXNSZW5kZXJWaWV3KCkpIHsKKyAgICAgICAgICAgIGlmIChSZW5kZXJW
aWV3KiByZW5kZXJWaWV3ID0gdG9SZW5kZXJWaWV3KHJlbmRlcmVyKSkgeworICAgICAgICAgICAg
ICAgIEZyYW1lVmlldyogdmlldyA9IHJlbmRlclZpZXctPmZyYW1lVmlldygpOworICAgICAgICAg
ICAgICAgIGlmICghdmlldykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtcHR5UmV0dXJu
OworCisgICAgICAgICAgICAgICAgaWYgKGNhblNjcm9sbElubmVyRnJhbWUodmlldy0+ZnJhbWUo
KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEJhY2tJblJlZ2lvblNjcm9sbGFibGUodmFs
aWRSZXR1cm4sIEluUmVnaW9uU2Nyb2xsYWJsZUFyZWEodGhpcywgbGF5ZXIpLCB0aGlzKTsKKyAg
ICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNhblNjcm9sbFJlbmRlckJveChsYXllci0+cmVuZGVy
Qm94KCkpKSB7CisgICAgICAgICAgICBwdXNoQmFja0luUmVnaW9uU2Nyb2xsYWJsZSh2YWxpZFJl
dHVybiwgSW5SZWdpb25TY3JvbGxhYmxlQXJlYSh0aGlzLCBsYXllciksIHRoaXMpOworICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSBydW4gaW50byBh
IGZpeCBwb3NpdGlvbmVkIGxheWVyLCBzZXQgdGhlCisgICAgICAgIC8vIGxhc3Qgc2Nyb2xsYWJs
ZSBpbi1yZWdpb24gb2JqZWN0IGFzIG5vdCBhYmxlIHRvCisgICAgICAgIC8vIHByb3BhZ2F0ZSBz
Y3JvbGwgdG8gaXRzIHBhcmVudCBzY3JvbGxhYmxlLgorICAgICAgICBpZiAoaXNOb25SZW5kZXJW
aWV3Rml4ZWRQb3NpdGlvbmVkQ29udGFpbmVyKGxheWVyKSAmJiB2YWxpZFJldHVybi5zaXplKCkp
IHsKKyAgICAgICAgICAgIFBsYXRmb3JtOjpTY3JvbGxWaWV3QmFzZSYgZW5kID0gdmFsaWRSZXR1
cm4uYmFjaygpOworICAgICAgICAgICAgZW5kLnNldENhblByb3BhZ2F0ZVNjcm9sbGluZ1RvRW5j
bG9zaW5nU2Nyb2xsYWJsZShmYWxzZSk7CisgICAgICAgIH0KKworICAgIH0gd2hpbGUgKGxheWVy
ID0gcGFyZW50TGF5ZXIobGF5ZXIpKTsKKworICAgIGlmICh2YWxpZFJldHVybi5lbXB0eSgpKQor
ICAgICAgICByZXR1cm4gZW1wdHlSZXR1cm47CisKKyAgICByZXR1cm4gdmFsaWRSZXR1cm47Cit9
CisKK0JhY2tpbmdTdG9yZSogV2ViUGFnZTo6YmFja2luZ1N0b3JlKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gZC0+bV9iYWNraW5nU3RvcmU7Cit9CisKK2Jvb2wgV2ViUGFnZTo6em9vbVRvRml0KCkK
K3sKKyAgICBpZiAoZC0+Y29udGVudHNTaXplKCkuaXNFbXB0eSgpIHx8ICFkLT5pc1VzZXJTY2Fs
YWJsZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBkLT5tX3VzZXJQZXJmb3JtZWRN
YW51YWxab29tID0gdHJ1ZTsKKworICAgIC8vIFRPRE86IFdlIG1heSBuZWVkIHRvIHVzZSAoMCww
KSBhcyB0aGUgYW5jaG9yIHBvaW50IHdoZW4gdGV4dFJlZmxvdyBpcyBlbmFibGVkLgorICAgIC8v
IElGIHRoZSBtaW5pbXVtIGZvbnQgc2l6ZSBpcyBnaW5vcm1vdXMsIHdlIG1heSBzdGlsbCB3YW50
IHRoZSBzY3JvbGwgcG9zaXRpb24gdG8gYmUgMCwwCisgICAgcmV0dXJuIGQtPnpvb21BYm91dFBv
aW50KGQtPnpvb21Ub0ZpdFNjYWxlKCksIGQtPmNlbnRlck9mVmlzaWJsZUNvbnRlbnRzUmVjdCgp
KTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0VGV4dFJlZmxvd0FuY2hvclBvaW50KGNv
bnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgZm9jYWxQb2ludCkKK3sKKyAgICAvLyBTaG91bGQgb25s
eSBiZSBpbnZva2VkIHdoZW4gdGV4dCByZWZsb3cgaXMgZW5hYmxlZAorICAgIEFTU0VSVChtX3dl
YlBhZ2UtPnNldHRpbmdzKCktPnRleHRSZWZsb3dNb2RlKCkgPT0gV2ViU2V0dGluZ3M6OlRleHRS
ZWZsb3dFbmFibGVkKTsKKworICAgIG1fY3VycmVudFBpbmNoWm9vbU5vZGUgPSBiZXN0Tm9kZUZv
clpvb21VbmRlclBvaW50KGZvY2FsUG9pbnQpOworICAgIGlmICghbV9jdXJyZW50UGluY2hab29t
Tm9kZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgSW50UmVjdCBub2RlUmVjdCA9IHJlY3RGb3JO
b2RlKG1fY3VycmVudFBpbmNoWm9vbU5vZGUuZ2V0KCkpOworICAgIG1fYW5jaG9ySW5Ob2RlUmVj
dFJhdGlvLnNldChzdGF0aWNfY2FzdDxmbG9hdD4obWFwRnJvbVRyYW5zZm9ybWVkKGZvY2FsUG9p
bnQpLngoKSAtIG5vZGVSZWN0LngoKSkgLyBub2RlUmVjdC53aWR0aCgpLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4obWFwRnJvbVRyYW5zZm9ybWVk
KGZvY2FsUG9pbnQpLnkoKSAtIG5vZGVSZWN0LnkoKSkgLyBub2RlUmVjdC5oZWlnaHQoKSk7Cit9
CisKK2Jvb2wgV2ViUGFnZTo6cGluY2hab29tQWJvdXRQb2ludChkb3VibGUgc2NhbGUsIGludCB4
LCBpbnQgeSkKK3sKKyAgICBJbnRQb2ludCBhbmNob3IoeCwgeSk7CisgICAgZC0+bV91c2VyUGVy
Zm9ybWVkTWFudWFsWm9vbSA9IHRydWU7CisgICAgZC0+bV91c2VyUGVyZm9ybWVkTWFudWFsU2Ny
b2xsID0gdHJ1ZTsKKworICAgIGlmIChkLT5tX3dlYlBhZ2UtPnNldHRpbmdzKCktPnRleHRSZWZs
b3dNb2RlKCkgPT0gV2ViU2V0dGluZ3M6OlRleHRSZWZsb3dFbmFibGVkKSB7CisgICAgICAgIGQt
PnNldFRleHRSZWZsb3dBbmNob3JQb2ludChhbmNob3IpOworICAgICAgICAvLyBUaGVvcmV0aWNh
bGx5LCBkLT5ub2RlRm9yWm9vbVVuZGVyUG9pbnQoYW5jaG9yKSBjYW4gcmV0dXJuIG51bGwuCisg
ICAgICAgIGlmICghZC0+bV9jdXJyZW50UGluY2hab29tTm9kZSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gZC0+em9vbUFib3V0UG9pbnQoc2NhbGUsIGQt
Pm1hcEZyb21UcmFuc2Zvcm1lZChhbmNob3IpKTsKK30KKworI2lmIEVOQUJMRShWSUVXUE9SVF9S
RUZMT1cpCit2b2lkIFdlYlBhZ2VQcml2YXRlOjp0b2dnbGVUZXh0UmVmbG93SWZUZXh0UmVmbG93
RW5hYmxlZE9ubHlGb3JCbG9ja1pvb20oYm9vbCBzaG91bGRFbmFibGVUZXh0UmVmbG93KQorewor
ICAgIGlmIChtX3dlYlBhZ2UtPnNldHRpbmdzKCktPnRleHRSZWZsb3dNb2RlKCkgPT0gV2ViU2V0
dGluZ3M6OlRleHRSZWZsb3dFbmFibGVkT25seUZvckJsb2NrWm9vbSkKKyAgICAgICAgbV9wYWdl
LT5zZXR0aW5ncygpLT5zZXRUZXh0UmVmbG93RW5hYmxlZChzaG91bGRFbmFibGVUZXh0UmVmbG93
KTsKK30KKyNlbmRpZgorCitib29sIFdlYlBhZ2U6OmJsb2NrWm9vbShpbnQgeCwgaW50IHkpCit7
CisgICAgaWYgKCFkLT5tX21haW5GcmFtZS0+dmlldygpIHx8ICFkLT5pc1VzZXJTY2FsYWJsZSgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBOb2RlKiBub2RlID0gZC0+YmVzdE5vZGVG
b3Jab29tVW5kZXJQb2ludChJbnRQb2ludCh4LCB5KSk7CisgICAgaWYgKCFub2RlKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBJbnRSZWN0IG5vZGVSZWN0ID0gZC0+cmVjdEZvck5vZGUo
bm9kZSk7CisgICAgSW50UmVjdCBibG9ja1JlY3Q7CisgICAgYm9vbCBlbmRPZkJsb2NrWm9vbU1v
ZGUgPSBkLT5jb21wYXJlTm9kZXNGb3JCbG9ja1pvb20oZC0+bV9jdXJyZW50QmxvY2tab29tQWRq
dXN0ZWROb2RlLmdldCgpLCBub2RlKTsKKyAgICBjb25zdCBkb3VibGUgb2xkU2NhbGUgPSBkLT5t
X3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tMTEoKTsKKyAgICBkb3VibGUgbmV3U2NhbGUgPSAwLjA7
CisgICAgY29uc3QgZG91YmxlIG1hcmdpbiA9IGVuZE9mQmxvY2tab29tTW9kZSA/IDAgOiBibG9j
a1pvb21NYXJnaW4gKiAyICogb2xkU2NhbGU7CisgICAgYm9vbCBpc0ZpcnN0Wm9vbSA9IGZhbHNl
OworCisgICAgaWYgKGVuZE9mQmxvY2tab29tTW9kZSkgeworICAgICAgICAvLyBFbmQgb2YgYmxv
Y2sgem9vbSBtb2RlCisgICAgICAgIEludFJlY3QgcmVjdCA9IGQtPmJsb2NrWm9vbVJlY3RGb3JO
b2RlKG5vZGUpOworICAgICAgICBibG9ja1JlY3QgPSBJbnRSZWN0KDAsIHJlY3QueSgpLCBkLT50
cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpLndpZHRoKCksIGQtPnRyYW5zZm9ybWVkQ29udGVudHNT
aXplKCkuaGVpZ2h0KCkgLSByZWN0LnkoKSk7CisgICAgICAgIGQtPm1fc2hvdWxkUmVmbG93Qmxv
Y2sgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTdGFydC9jb250aW51ZSBibG9j
ayB6b29tIG1vZGUKKyAgICAgICAgTm9kZSogdGVtcEJsb2NrWm9vbUFkanVzdGVkTm9kZSA9IGQt
Pm1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZS5nZXQoKTsKKyAgICAgICAgYmxvY2tSZWN0
ID0gZC0+YmxvY2tab29tUmVjdEZvck5vZGUobm9kZSk7CisKKyAgICAgICAgLy8gRG9uJ3QgdXNl
IGEgYmxvY2sgaWYgaXQgaXMgdG9vIGNsb3NlIHRvIHRoZSBzaXplIG9mIHRoZSBhY3R1YWwgY29u
dGVudHMuCisgICAgICAgIC8vIFdlIGFsbG93IHRoaXMgZm9yIGltYWdlcyBvbmx5IHNvIHRoYXQg
dGhleSBjYW4gYmUgem9vbWVkIHRpZ2h0IHRvIHRoZSBzY3JlZW4uCisgICAgICAgIGlmICghbm9k
ZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmltZ1RhZykpIHsKKyAgICAgICAgICAgIEludFJlY3Qg
dFJlY3QgPSBkLT5tYXBGcm9tVHJhbnNmb3JtZWQoYmxvY2tSZWN0KTsKKyAgICAgICAgICAgIGlu
dCBibG9ja0FyZWEgPSB0UmVjdC53aWR0aCgpICogdFJlY3QuaGVpZ2h0KCk7CisgICAgICAgICAg
ICBpbnQgcGFnZUFyZWEgPSBkLT5jb250ZW50c1NpemUoKS53aWR0aCgpICogZC0+Y29udGVudHNT
aXplKCkuaGVpZ2h0KCk7CisgICAgICAgICAgICBkb3VibGUgYmxvY2tUb1BhZ2VSYXRpbyA9IHN0
YXRpY19jYXN0PGRvdWJsZT4oMSAtIGJsb2NrQXJlYSAvIHBhZ2VBcmVhKTsKKyAgICAgICAgICAg
IGlmIChibG9ja1RvUGFnZVJhdGlvIDwgbWluaW11bUV4cGFuZGluZ1JhdGlvKSB7CisgICAgICAg
ICAgICAgICAgLy8gUmVzdG9yZSBvbGQgYWRqdXN0IG5vZGUgYmVjYXVzZSB6b29tIHdhcyBjYW5j
ZWxlZC4KKyAgICAgICAgICAgICAgICBkLT5tX2N1cnJlbnRCbG9ja1pvb21BZGp1c3RlZE5vZGUg
PSB0ZW1wQmxvY2tab29tQWRqdXN0ZWROb2RlOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChibG9ja1JlY3QuaXNF
bXB0eSgpIHx8ICFibG9ja1JlY3Qud2lkdGgoKSB8fCAhYmxvY2tSZWN0LmhlaWdodCgpKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICghZC0+bV9jdXJyZW50QmxvY2ta
b29tTm9kZS5nZXQoKSkKKyAgICAgICAgICAgIGlzRmlyc3Rab29tID0gdHJ1ZTsKKworICAgICAg
ICBkLT5tX2N1cnJlbnRCbG9ja1pvb21Ob2RlID0gbm9kZTsKKyAgICAgICAgZC0+bV9zaG91bGRS
ZWZsb3dCbG9jayA9IHRydWU7CisgICAgfQorCisgICAgbmV3U2NhbGUgPSBzdGQ6Om1pbihkLT5u
ZXdTY2FsZUZvckJsb2NrWm9vbVJlY3QoYmxvY2tSZWN0LCBvbGRTY2FsZSwgbWFyZ2luKSwgZC0+
bWF4QmxvY2tab29tU2NhbGUoKSk7CisgICAgbmV3U2NhbGUgPSBzdGQ6Om1heChuZXdTY2FsZSwg
bWluaW11bVNjYWxlKCkpOworCisjaWYgREVCVUdfQkxPQ0tfWk9PTQorICAgIC8vIFJlbmRlciB0
aGUgZG91YmxlIHRhcCBwb2ludCBmb3IgdmlzdWFsIHJlZmVyZW5jZS4KKyAgICBJbnRSZWN0IHJl
bmRlclJlY3QoeCwgeSwgMSwgMSk7CisgICAgcmVuZGVyUmVjdCA9IGQtPm1hcEZyb21UcmFuc2Zv
cm1lZENvbnRlbnRzVG9UcmFuc2Zvcm1lZFZpZXdwb3J0KHJlbmRlclJlY3QpOworICAgIEludFNp
emUgdmlld3BvcnRTaXplID0gZC0+dHJhbnNmb3JtZWRWaWV3cG9ydFNpemUoKTsKKyAgICByZW5k
ZXJSZWN0LmludGVyc2VjdChJbnRSZWN0KDAsIDAsIHZpZXdwb3J0U2l6ZS53aWR0aCgpLCB2aWV3
cG9ydFNpemUuaGVpZ2h0KCkpKTsKKyAgICBkLT5tX2JhY2tpbmdTdG9yZS0+ZC0+Y2xlYXJXaW5k
b3cocmVuZGVyUmVjdCwgMCwgMCwgMCk7CisgICAgZC0+bV9iYWNraW5nU3RvcmUtPmQtPmludmFs
aWRhdGVXaW5kb3cocmVuZGVyUmVjdCk7CisKKyAgICAvLyBVbmNvbW1lbnQgdGhpcyB0byByZXR1
cm4gaW4gb3JkZXIgdG8gc2VlIHRoZSBibG9ja3MgYmVpbmcgc2VsZWN0ZWQuCisvLyAgICBkLT5t
X2NsaWVudC0+em9vbUNoYW5nZWQoaXNNaW5ab29tZWQoKSwgaXNNYXhab29tZWQoKSwgaXNBdElu
aXRpYWxab29tKCksIGN1cnJlbnRab29tTGV2ZWwoKSk7CisvLyAgICByZXR1cm4gdHJ1ZTsKKyNl
bmRpZgorCisjaWYgRU5BQkxFKFZJRVdQT1JUX1JFRkxPVykKKyAgICAvLyBJZiByZWZsb3dpbmcs
IGFkanVzdCB0aGUgcmVmbG93LXdpZHRoIG9mIHRleHQgbm9kZSB0byBtYWtlIHN1cmUgdGhlIGZv
bnQgaXMgYSByZWFzb25hYmxlIHNpemUuCisgICAgaWYgKGQtPm1fY3VycmVudEJsb2NrWm9vbU5v
ZGUgJiYgZC0+bV9zaG91bGRSZWZsb3dCbG9jayAmJiBzZXR0aW5ncygpLT50ZXh0UmVmbG93TW9k
ZSgpICE9IFdlYlNldHRpbmdzOjpUZXh0UmVmbG93RGlzYWJsZWQpIHsKKyAgICAgICAgUmVuZGVy
T2JqZWN0KiByZW5kZXJlciA9IGQtPm1fY3VycmVudEJsb2NrWm9vbU5vZGUtPnJlbmRlcmVyKCk7
CisgICAgICAgIGlmIChyZW5kZXJlciAmJiByZW5kZXJlci0+aXNUZXh0KCkpIHsKKyAgICAgICAg
ICAgIGRvdWJsZSBuZXdGb250U2l6ZSA9IHJlbmRlcmVyLT5zdHlsZSgpLT5mb250U2l6ZSgpICog
bmV3U2NhbGU7CisgICAgICAgICAgICBpZiAobmV3Rm9udFNpemUgPCBkLT5tX3dlYlNldHRpbmdz
LT5kZWZhdWx0Rm9udFNpemUoKSkgeworICAgICAgICAgICAgICAgIG5ld1NjYWxlID0gc3RkOjpt
aW4oc3RhdGljX2Nhc3Q8ZG91YmxlPihkLT5tX3dlYlNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUo
KSkgLyByZW5kZXJlci0+c3R5bGUoKS0+Zm9udFNpemUoKSwgZC0+bWF4QmxvY2tab29tU2NhbGUo
KSk7CisgICAgICAgICAgICAgICAgbmV3U2NhbGUgPSBzdGQ6Om1heChuZXdTY2FsZSwgbWluaW11
bVNjYWxlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmxvY2tSZWN0LnNldFdpZHRo
KG9sZFNjYWxlICogc3RhdGljX2Nhc3Q8ZG91YmxlPihkLT50cmFuc2Zvcm1lZEFjdHVhbFZpc2li
bGVTaXplKCkud2lkdGgoKSkgLyBuZXdTY2FsZSk7CisgICAgICAgICAgICAvLyBSZS1jYWxjdWxh
dGUgdGhlIHNjYWxlIGhlcmUgdG8gdGFrZSBpbiB0byBhY2NvdW50IHRoZSBtYXJnaW4uCisgICAg
ICAgICAgICBuZXdTY2FsZSA9IHN0ZDo6bWluKGQtPm5ld1NjYWxlRm9yQmxvY2tab29tUmVjdChi
bG9ja1JlY3QsIG9sZFNjYWxlLCBtYXJnaW4pLCBkLT5tYXhCbG9ja1pvb21TY2FsZSgpKTsKKyAg
ICAgICAgICAgIG5ld1NjYWxlID0gc3RkOjptYXgobmV3U2NhbGUsIG1pbmltdW1TY2FsZSgpKTsg
Ly8gU3RpbGwsIGl0J3Mgbm90IGFsbG93ZWQgdG8gYmUgc21hbGxlciB0aGFuIG1pbmltdW0gc2Nh
bGUuCisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIC8vIEFsaWduIHRoZSB6b29tZWQg
YmxvY2sgaW4gdGhlIHNjcmVlbi4KKyAgICBkb3VibGUgbmV3QmxvY2tIZWlnaHQgPSBkLT5tYXBG
cm9tVHJhbnNmb3JtZWQoYmxvY2tSZWN0KS5oZWlnaHQoKTsKKyAgICBkb3VibGUgbmV3QmxvY2tX
aWR0aCA9IGQtPm1hcEZyb21UcmFuc2Zvcm1lZChibG9ja1JlY3QpLndpZHRoKCk7CisgICAgZG91
YmxlIHNjYWxlZFZpZXdwb3J0V2lkdGggPSBzdGF0aWNfY2FzdDxkb3VibGU+KGQtPmFjdHVhbFZp
c2libGVTaXplKCkud2lkdGgoKSkgKiBvbGRTY2FsZSAvIG5ld1NjYWxlOworICAgIGRvdWJsZSBz
Y2FsZWRWaWV3cG9ydEhlaWdodCA9IHN0YXRpY19jYXN0PGRvdWJsZT4oZC0+YWN0dWFsVmlzaWJs
ZVNpemUoKS5oZWlnaHQoKSkgKiBvbGRTY2FsZSAvIG5ld1NjYWxlOworICAgIGRvdWJsZSBkeCA9
IHN0ZDo6bWF4KDAuMCwgKHNjYWxlZFZpZXdwb3J0V2lkdGggLSBuZXdCbG9ja1dpZHRoKSAvIDIu
MCk7CisgICAgZG91YmxlIGR5ID0gc3RkOjptYXgoMC4wLCAoc2NhbGVkVmlld3BvcnRIZWlnaHQg
LSBuZXdCbG9ja0hlaWdodCkgLyAyLjApOworCisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9
IGQtPm1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZS0+cmVuZGVyZXIoKTsKKyAgICBGbG9h
dFBvaW50IGFuY2hvcjsKKyAgICBGbG9hdFBvaW50IHRvcExlZnRQb2ludChkLT5tYXBGcm9tVHJh
bnNmb3JtZWQoYmxvY2tSZWN0KS5sb2NhdGlvbigpKTsKKyAgICBpZiAocmVuZGVyZXIgJiYgcmVu
ZGVyZXItPmlzVGV4dCgpKSB7CisgICAgICAgIEVUZXh0QWxpZ24gdGV4dEFsaWduID0gcmVuZGVy
ZXItPnN0eWxlKCktPnRleHRBbGlnbigpOworICAgICAgICBzd2l0Y2ggKHRleHRBbGlnbikgewor
ICAgICAgICBjYXNlIENFTlRFUjoKKyAgICAgICAgY2FzZSBXRUJLSVRfQ0VOVEVSOgorICAgICAg
ICAgICAgYW5jaG9yID0gRmxvYXRQb2ludChub2RlUmVjdC54KCkgKyAobm9kZVJlY3Qud2lkdGgo
KSAtIHNjYWxlZFZpZXdwb3J0V2lkdGgpIC8gMiwgdG9wTGVmdFBvaW50LnkoKSk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMRUZUOgorICAgICAgICBjYXNlIFdFQktJVF9MRUZU
OgorICAgICAgICAgICAgYW5jaG9yID0gdG9wTGVmdFBvaW50OworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgUklHSFQ6CisgICAgICAgIGNhc2UgV0VCS0lUX1JJR0hUOgorICAgICAg
ICAgICAgYW5jaG9yID0gRmxvYXRQb2ludChub2RlUmVjdC54KCkgKyBub2RlUmVjdC53aWR0aCgp
IC0gc2NhbGVkVmlld3BvcnRXaWR0aCwgdG9wTGVmdFBvaW50LnkoKSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBUQUFVVE86CisgICAgICAgIGNhc2UgSlVTVElGWToKKyAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChyZW5kZXJlci0+c3R5bGUoKS0+aXNMZWZ0VG9S
aWdodERpcmVjdGlvbigpKQorICAgICAgICAgICAgICAgIGFuY2hvciA9IHRvcExlZnRQb2ludDsK
KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhbmNob3IgPSBGbG9hdFBvaW50KG5v
ZGVSZWN0LngoKSArIG5vZGVSZWN0LndpZHRoKCkgLSBzY2FsZWRWaWV3cG9ydFdpZHRoLCB0b3BM
ZWZ0UG9pbnQueSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNl
CisgICAgICAgIGFuY2hvciA9IHJlbmRlcmVyLT5zdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0
aW9uKCkgPyB0b3BMZWZ0UG9pbnQgOiBGbG9hdFBvaW50KG5vZGVSZWN0LngoKSArIG5vZGVSZWN0
LndpZHRoKCkgLSBzY2FsZWRWaWV3cG9ydFdpZHRoLCB0b3BMZWZ0UG9pbnQueSgpKTsKKworICAg
IGlmIChuZXdCbG9ja0hlaWdodCA8PSBzY2FsZWRWaWV3cG9ydEhlaWdodCkgeworICAgICAgICAv
LyBUaGUgYmxvY2sgZml0cyBpbiB0aGUgdmlld3BvcnQgc28gY2VudGVyIGl0LgorICAgICAgICBk
LT5tX2ZpbmFsQmxvY2tQb2ludCA9IEZsb2F0UG9pbnQoYW5jaG9yLngoKSAtIGR4LCBhbmNob3Iu
eSgpIC0gZHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRoZSBibG9jayBpcyBsb25nZXIg
dGhhbiB0aGUgdmlld3BvcnQgc28gdG9wIGFsaWduIGl0IGFuZCBhZGQgMyBwaXhlbCBtYXJnaW4u
CisgICAgICAgIGQtPm1fZmluYWxCbG9ja1BvaW50ID0gRmxvYXRQb2ludChhbmNob3IueCgpIC0g
ZHgsIGFuY2hvci55KCkgLSAzKTsKKyAgICB9CisKKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9X
KQorICAgIC8vIFdlIGRvbid0IGtub3cgaG93IGxvbmcgdGhlIHJlZmxvd2VkIGJsb2NrIHdpbGwg
YmUgc28gd2UgcG9zaXRpb24gaXQgYXQgdGhlIHRvcCBvZiB0aGUgc2NyZWVuIHdpdGggYSBzbWFs
bCBtYXJnaW4uCisgICAgaWYgKHNldHRpbmdzKCktPnRleHRSZWZsb3dNb2RlKCkgIT0gV2ViU2V0
dGluZ3M6OlRleHRSZWZsb3dEaXNhYmxlZCkgeworICAgICAgICBkLT5tX2ZpbmFsQmxvY2tQb2lu
dCA9IEZsb2F0UG9pbnQoYW5jaG9yLngoKSAtIGR4LCBhbmNob3IueSgpIC0gMyk7CisgICAgICAg
IGQtPm1fZmluYWxCbG9ja1BvaW50UmVmbG93T2Zmc2V0ID0gRmxvYXRQb2ludCgtZHgsIC0zKTsK
KyAgICB9CisjZW5kaWYKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBvcmlnaW5hbCBub2Rl
IHJlY3QgaXMgdmlzaWJsZSBpbiB0aGUgc2NyZWVuIGFmdGVyIHRoZSB6b29tLiBUaGlzIGlzIG5l
Y2Vzc2FyeSBiZWNhdXNlIHRoZSBpZGVudGlmaWVkIGJsb2NrIHJlY3QgbWlnaHQKKyAgICAvLyBu
b3QgYmUgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIG5vZGUgcmVjdCwgYW5kIGl0IGNvdWxkIGZv
cmNlIHRoZSBvcmlnaW5hbCBub2RlIHJlY3Qgb2ZmIHRoZSBzY3JlZW4uCisgICAgRmxvYXRSZWN0
IGJyKGFuY2hvciwgRmxvYXRTaXplKHNjYWxlZFZpZXdwb3J0V2lkdGgsIHNjYWxlZFZpZXdwb3J0
SGVpZ2h0KSk7CisgICAgSW50UG9pbnQgY2xpY2tQb2ludCA9IGQtPm1hcEZyb21UcmFuc2Zvcm1l
ZChJbnRQb2ludCh4LCB5KSk7CisgICAgaWYgKCFici5jb250YWlucyhjbGlja1BvaW50KSkgewor
ICAgICAgICBkLT5tX2ZpbmFsQmxvY2tQb2ludFJlZmxvd09mZnNldC5tb3ZlKDAsIChjbGlja1Bv
aW50LnkoKSAtIHNjYWxlZFZpZXdwb3J0SGVpZ2h0IC8gMikgLSBkLT5tX2ZpbmFsQmxvY2tQb2lu
dC55KCkpOworICAgICAgICBkLT5tX2ZpbmFsQmxvY2tQb2ludCA9IEZsb2F0UG9pbnQoZC0+bV9m
aW5hbEJsb2NrUG9pbnQueCgpLCBjbGlja1BvaW50LnkoKSAtIHNjYWxlZFZpZXdwb3J0SGVpZ2h0
IC8gMik7CisgICAgfQorCisgICAgLy8gQ2xhbXAgdGhlIGZpbmFsQmxvY2tQb2ludCB0byBub3Qg
Y2F1c2UgYW55IG92ZXJmbG93IHNjcm9sbGluZy4KKyAgICBpZiAoZC0+bV9maW5hbEJsb2NrUG9p
bnQueCgpIDwgMCkgeworICAgICAgICBkLT5tX2ZpbmFsQmxvY2tQb2ludC5zZXRYKDApOworICAg
ICAgICBkLT5tX2ZpbmFsQmxvY2tQb2ludFJlZmxvd09mZnNldC5zZXRYKDApOworICAgIH0gZWxz
ZSBpZiAoZC0+bV9maW5hbEJsb2NrUG9pbnQueCgpICsgc2NhbGVkVmlld3BvcnRXaWR0aCA+IGQt
PmNvbnRlbnRzU2l6ZSgpLndpZHRoKCkpIHsKKyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnQu
c2V0WChkLT5jb250ZW50c1NpemUoKS53aWR0aCgpIC0gc2NhbGVkVmlld3BvcnRXaWR0aCk7Cisg
ICAgICAgIGQtPm1fZmluYWxCbG9ja1BvaW50UmVmbG93T2Zmc2V0LnNldFgoMCk7CisgICAgfQor
CisgICAgaWYgKGQtPm1fZmluYWxCbG9ja1BvaW50LnkoKSA8IDApIHsKKyAgICAgICAgZC0+bV9m
aW5hbEJsb2NrUG9pbnQuc2V0WSgwKTsKKyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnRSZWZs
b3dPZmZzZXQuc2V0WSgwKTsKKyAgICB9IGVsc2UgaWYgKGQtPm1fZmluYWxCbG9ja1BvaW50Lnko
KSArIHNjYWxlZFZpZXdwb3J0SGVpZ2h0ID4gZC0+Y29udGVudHNTaXplKCkuaGVpZ2h0KCkpIHsK
KyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnQuc2V0WShkLT5jb250ZW50c1NpemUoKS5oZWln
aHQoKSAtIHNjYWxlZFZpZXdwb3J0SGVpZ2h0KTsKKyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9p
bnRSZWZsb3dPZmZzZXQuc2V0WSgwKTsKKyAgICB9CisKKyAgICBkLT5tX2ZpbmFsQmxvY2tQb2lu
dCA9IGQtPm1hcFRvVHJhbnNmb3JtZWRGbG9hdFBvaW50KGQtPm1fZmluYWxCbG9ja1BvaW50KTsK
KworICAgIC8vIERvbid0IGJsb2NrIHpvb20gaWYgdGhlIHVzZXIgaXMgem9vbWluZyBhbmQgdGhl
IG5ldyBzY2FsZSBpcyBvbmx5IG1hcmdpbmFsbHkgZGlmZmVyZW50IGZyb20gdGhlCisgICAgLy8g
b2xkU2NhbGUgd2l0aCBvbmx5IGEgbWFyZ2luYWwgY2hhbmdlIGluIHNjcm9sbCBwb3NpdGlvbi4g
SWdub3JlIHNjcm9sbCBkaWZmZXJlbmNlIGluIHRoZSBzcGVjaWFsIGNhc2UKKyAgICAvLyB0aGF0
IHRoZSB6b29tIGxldmVsIGlzIHRoZSBtaW5pbXVtU2NhbGUuCisgICAgaWYgKCFlbmRPZkJsb2Nr
Wm9vbU1vZGUgJiYgYWJzKG5ld1NjYWxlIC0gb2xkU2NhbGUpIC8gb2xkU2NhbGUgPCBtaW5pbXVt
RXhwYW5kaW5nUmF0aW8pIHsKKyAgICAgICAgY29uc3QgZG91YmxlIG1pbmltdW1EaXNwbGFjZW1l
bnQgPSBtaW5pbXVtRXhwYW5kaW5nUmF0aW8gKiBkLT50cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVT
aXplKCkud2lkdGgoKTsKKyAgICAgICAgaWYgKG9sZFNjYWxlID09IGQtPm1pbmltdW1TY2FsZSgp
IHx8IChkaXN0YW5jZUJldHdlZW5Qb2ludHMocm91bmRUcmFuc2Zvcm1lZFBvaW50KGQtPm1hcFRv
VHJhbnNmb3JtZWQoZC0+c2Nyb2xsUG9zaXRpb24oKSkpLCByb3VuZFRyYW5zZm9ybWVkUG9pbnQo
ZC0+bV9maW5hbEJsb2NrUG9pbnQpKSA8IG1pbmltdW1EaXNwbGFjZW1lbnQgJiYgYWJzKG5ld1Nj
YWxlIC0gb2xkU2NhbGUpIC8gb2xkU2NhbGUgPCAwLjEwKSkgeworICAgICAgICAgICAgaWYgKGlz
Rmlyc3Rab29tKSB7CisgICAgICAgICAgICAgICAgZC0+cmVzZXRCbG9ja1pvb20oKTsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBa
b29tIG91dCBvZiBibG9jayB6b29tLgorICAgICAgICAgICAgYmxvY2tab29tKHgsIHkpOworICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkLT5tX2Jsb2Nr
Wm9vbUZpbmFsU2NhbGUgPSBuZXdTY2FsZTsKKworICAgIC8vIFdlIHNldCB0aGlzIGhlcmUgdG8g
bWFrZSBzdXJlIHdlIGRvbid0IHRyeSB0byByZS1yZW5kZXIgdGhlIHBhZ2UgYXQgYSBkaWZmZXJl
bnQgem9vbSBsZXZlbCBkdXJpbmcgbG9hZGluZy4KKyAgICBkLT5tX3VzZXJQZXJmb3JtZWRNYW51
YWxab29tID0gdHJ1ZTsKKyAgICBkLT5tX3VzZXJQZXJmb3JtZWRNYW51YWxTY3JvbGwgPSB0cnVl
OworICAgIGQtPm1fY2xpZW50LT5hbmltYXRlQmxvY2tab29tKGQtPm1fZmluYWxCbG9ja1BvaW50
LCBkLT5tX2Jsb2NrWm9vbUZpbmFsU2NhbGUpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jv
b2wgV2ViUGFnZTo6aXNNYXhab29tZWQoKSBjb25zdAoreworICAgIHJldHVybiAoZC0+Y3VycmVu
dFNjYWxlKCkgPT0gZC0+bWF4aW11bVNjYWxlKCkpIHx8ICFkLT5pc1VzZXJTY2FsYWJsZSgpOwor
fQorCitib29sIFdlYlBhZ2U6OmlzTWluWm9vbWVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKGQt
PmN1cnJlbnRTY2FsZSgpID09IGQtPm1pbmltdW1TY2FsZSgpKSB8fCAhZC0+aXNVc2VyU2NhbGFi
bGUoKTsKK30KKworYm9vbCBXZWJQYWdlOjppc0F0SW5pdGlhbFpvb20oKSBjb25zdAoreworICAg
IHJldHVybiAoZC0+Y3VycmVudFNjYWxlKCkgPT0gZC0+aW5pdGlhbFNjYWxlKCkpIHx8ICFkLT5p
c1VzZXJTY2FsYWJsZSgpOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpzaG91bGRab29tT25F
c2NhcGUoKSBjb25zdAoreworICAgIGlmICghaXNVc2VyU2NhbGFibGUoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgLy8gSWYgdGhlIGluaXRpYWwgc2NhbGUgaXMgbm90IHJlYWNoYWJs
ZSwgZG9uJ3QgdHJ5IHRvIHpvb20uCisgICAgaWYgKGluaXRpYWxTY2FsZSgpIDwgbWluaW11bVNj
YWxlKCkgfHwgaW5pdGlhbFNjYWxlKCkgPiBtYXhpbXVtU2NhbGUoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgLy8gRG9uJ3QgZXZlciB6b29tIGluIHdoZW4gd2UgcHJlc3MgZXNjYXBl
LgorICAgIGlmIChpbml0aWFsU2NhbGUoKSA+PSBjdXJyZW50U2NhbGUoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGN1cnJlbnRTY2FsZSgpICE9IGluaXRpYWxTY2FsZSgp
OworfQorCit2b2lkIFdlYlBhZ2U6Onpvb21Ub0luaXRpYWxTY2FsZSgpCit7CisgICAgaWYgKCFk
LT5pc1VzZXJTY2FsYWJsZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBkLT56b29tQWJvdXRQ
b2ludChkLT5pbml0aWFsU2NhbGUoKSwgZC0+Y2VudGVyT2ZWaXNpYmxlQ29udGVudHNSZWN0KCkp
OworfQorCitib29sIFdlYlBhZ2U6Onpvb21Ub09uZU9uZSgpCit7CisgICAgaWYgKCFkLT5pc1Vz
ZXJTY2FsYWJsZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBkb3VibGUgc2NhbGUg
PSAxLjA7CisgICAgcmV0dXJuIGQtPnpvb21BYm91dFBvaW50KHNjYWxlLCBkLT5jZW50ZXJPZlZp
c2libGVDb250ZW50c1JlY3QoKSk7Cit9CisKK2Jvb2wgV2ViUGFnZTo6bW92ZVRvTmV4dEZpZWxk
KFBsYXRmb3JtOjpTY3JvbGxEaXJlY3Rpb24gZGlyLCBpbnQgZGVzaXJlZFNjcm9sbEFtb3VudCkK
K3sKKyAgICByZXR1cm4gZC0+bW92ZVRvTmV4dEZpZWxkKGRpciwgZGVzaXJlZFNjcm9sbEFtb3Vu
dCk7Cit9CisKK1BsYXRmb3JtOjpJbnRSZWN0IFdlYlBhZ2U6OmZvY3VzTm9kZVJlY3QoKQorewor
ICAgIHJldHVybiBkLT5mb2N1c05vZGVSZWN0KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0Rm9j
dXNlZChib29sIGZvY3VzZWQpCit7CisgICAgRm9jdXNDb250cm9sbGVyKiBmb2N1c0NvbnRyb2xs
ZXIgPSBkLT5tX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpOworICAgIGZvY3VzQ29udHJvbGxlci0+
c2V0QWN0aXZlKGZvY3VzZWQpOworICAgIGlmIChmb2N1c2VkKSB7CisgICAgICAgIEZyYW1lKiBm
cmFtZSA9IGZvY3VzQ29udHJvbGxlci0+Zm9jdXNlZEZyYW1lKCk7CisgICAgICAgIGlmICghZnJh
bWUpCisgICAgICAgICAgICBmb2N1c0NvbnRyb2xsZXItPnNldEZvY3VzZWRGcmFtZShkLT5tX21h
aW5GcmFtZSk7CisgICAgfQorICAgIGZvY3VzQ29udHJvbGxlci0+c2V0Rm9jdXNlZChmb2N1c2Vk
KTsKK30KKworYm9vbCBXZWJQYWdlOjpsaW5rVG9MaW5rT25DbGljaygpCit7CisgICAgRnJhbWUq
IGZyYW1lID0gZC0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgRG9jdW1lbnQqIGRvYyA9IGZyYW1lLT5kb2N1bWVudCgp
OworICAgIGlmICghZG9jKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBOb2RlKiBmb2N1
c2VkTm9kZSA9IGRvYy0+Zm9jdXNlZE5vZGUoKTsKKworICAgIGlmICghZm9jdXNlZE5vZGUpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgbm9kZSBpcyB2aXNp
YmxlIGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSBjbGljay4KKyAgICBJbnRSZWN0IHZpc2libGVSZWN0
ID0gSW50UmVjdChJbnRQb2ludCgpLCBkLT5hY3R1YWxWaXNpYmxlU2l6ZSgpKTsKKyAgICAvLyBD
b25zdHJhaW4gdGhlIHJlY3QgaWYgdGhpcyBpcyBhIHN1YmZyYW1lLgorICAgIGlmIChmcmFtZS0+
dmlldygpLT5wYXJlbnQoKSkKKyAgICAgICAgdmlzaWJsZVJlY3QuaW50ZXJzZWN0KGQtPmdldFJl
Y3Vyc2l2ZVZpc2libGVXaW5kb3dSZWN0KGZyYW1lLT52aWV3KCkpKTsKKworICAgIGlmICghdmlz
aWJsZVJlY3QuaW50ZXJzZWN0cyhnZXROb2RlV2luZG93UmVjdChmb2N1c2VkTm9kZSkpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBDaGVjayBpZiB0aGUgcG9wdXAgb3BlbmVkLgor
ICAgIGQtPm1faW5wdXRIYW5kbGVyLT5kaWROb2RlT3BlblBvcHVwKGZvY3VzZWROb2RlKTsKKyAg
ICAvLyBDcmVhdGUgY2xpY2sgZXZlbnQuCisgICAgZm9jdXNlZE5vZGUtPmRpc3BhdGNoU2ltdWxh
dGVkQ2xpY2soMCwgdHJ1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgV2ViUGFnZTo6
ZmluZE5leHRTdHJpbmcoY29uc3QgY2hhciogdGV4dCwgYm9vbCBmb3J3YXJkKQoreworICAgIHJl
dHVybiBkLT5tX2luUGFnZVNlYXJjaE1hbmFnZXItPmZpbmROZXh0U3RyaW5nKFdURjo6U3RyaW5n
Ojpmcm9tVVRGOCh0ZXh0KSwgZm9yd2FyZCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6cnVuTGF5b3V0
VGVzdHMoKQoreworI2lmIEVOQUJMRV9EUlQKKyAgICAvLyBGSVhNRTogZG8gd2UgbmVlZCBBUEkg
dG8gdG9nZ2xlIHRoaXM/CisgICAgZC0+bV9wYWdlLT5zZXR0aW5ncygpLT5zZXREZXZlbG9wZXJF
eHRyYXNFbmFibGVkKHRydWUpOworCisgICAgaWYgKCFkLT5tX2R1bXBSZW5kZXJUcmVlKQorICAg
ICAgICBkLT5tX2R1bXBSZW5kZXJUcmVlID0gbmV3IER1bXBSZW5kZXJUcmVlKHRoaXMpOworICAg
IGQtPm1fZHVtcFJlbmRlclRyZWUtPnJ1blRlc3RzKCk7CisjZW5kaWYKK30KKworYm9vbCBXZWJQ
YWdlOjplbmFibGVTY3JpcHREZWJ1Z2dlcigpCit7CisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVC
VUdHRVIpCisgICAgaWYgKGQtPm1fc2NyaXB0RGVidWdnZXIpCisgICAgICAgIHJldHVybiB0cnVl
OworCisgICAgZC0+bV9zY3JpcHREZWJ1Z2dlciA9IGFkb3B0UHRyKG5ldyBKYXZhU2NyaXB0RGVi
dWdnZXJCbGFja0JlcnJ5KHRoaXMtPmQpKTsKKworICAgIHJldHVybiAhIWQtPm1fc2NyaXB0RGVi
dWdnZXI7CisjZW5kaWYKK30KKworYm9vbCBXZWJQYWdlOjpkaXNhYmxlU2NyaXB0RGVidWdnZXIo
KQoreworI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQorICAgIGlmICghZC0+bV9zY3Jp
cHREZWJ1Z2dlcikKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBkLT5tX3NjcmlwdERlYnVn
Z2VyLmNsZWFyKCk7CisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKwordm9pZCBXZWJQYWdl
OjphZGRCcmVha3BvaW50KGNvbnN0IHVuc2lnbmVkIHNob3J0KiB1cmwsIHVuc2lnbmVkIHVybExl
bmd0aCwgaW50IGxpbmVOdW1iZXIsIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBjb25kaXRpb24sIHVu
c2lnbmVkIGNvbmRpdGlvbkxlbmd0aCkKK3sKKyNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dF
UikKKyAgICBpZiAoZC0+bV9zY3JpcHREZWJ1Z2dlcikKKyAgICAgICAgZC0+bV9zY3JpcHREZWJ1
Z2dlci0+YWRkQnJlYWtwb2ludCh1cmwsIHVybExlbmd0aCwgbGluZU51bWJlciwgY29uZGl0aW9u
LCBjb25kaXRpb25MZW5ndGgpOworI2VuZGlmCit9CisKK3ZvaWQgV2ViUGFnZTo6dXBkYXRlQnJl
YWtwb2ludChjb25zdCB1bnNpZ25lZCBzaG9ydCogdXJsLCB1bnNpZ25lZCB1cmxMZW5ndGgsIGlu
dCBsaW5lTnVtYmVyLCBjb25zdCB1bnNpZ25lZCBzaG9ydCogY29uZGl0aW9uLCB1bnNpZ25lZCBj
b25kaXRpb25MZW5ndGgpCit7CisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCisgICAg
aWYgKGQtPm1fc2NyaXB0RGVidWdnZXIpCisgICAgICAgIGQtPm1fc2NyaXB0RGVidWdnZXItPnVw
ZGF0ZUJyZWFrcG9pbnQodXJsLCB1cmxMZW5ndGgsIGxpbmVOdW1iZXIsIGNvbmRpdGlvbiwgY29u
ZGl0aW9uTGVuZ3RoKTsKKyNlbmRpZgorfQorCit2b2lkIFdlYlBhZ2U6OnJlbW92ZUJyZWFrcG9p
bnQoY29uc3QgdW5zaWduZWQgc2hvcnQqIHVybCwgdW5zaWduZWQgdXJsTGVuZ3RoLCBpbnQgbGlu
ZU51bWJlcikKK3sKKyNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKKyAgICBpZiAoZC0+
bV9zY3JpcHREZWJ1Z2dlcikKKyAgICAgICAgZC0+bV9zY3JpcHREZWJ1Z2dlci0+cmVtb3ZlQnJl
YWtwb2ludCh1cmwsIHVybExlbmd0aCwgbGluZU51bWJlcik7CisjZW5kaWYKK30KKworYm9vbCBX
ZWJQYWdlOjpwYXVzZU9uRXhjZXB0aW9ucygpCit7CisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVC
VUdHRVIpCisgICAgcmV0dXJuIGQtPm1fc2NyaXB0RGVidWdnZXIgPyBkLT5tX3NjcmlwdERlYnVn
Z2VyLT5wYXVzZU9uRXhjZXB0aW9ucygpIDogZmFsc2U7CisjZW5kaWYKK30KKwordm9pZCBXZWJQ
YWdlOjpzZXRQYXVzZU9uRXhjZXB0aW9ucyhib29sIHBhdXNlKQoreworI2lmIEVOQUJMRShKQVZB
U0NSSVBUX0RFQlVHR0VSKQorICAgIGlmIChkLT5tX3NjcmlwdERlYnVnZ2VyKQorICAgICAgICBk
LT5tX3NjcmlwdERlYnVnZ2VyLT5zZXRQYXVzZU9uRXhjZXB0aW9ucyhwYXVzZSk7CisjZW5kaWYK
K30KKwordm9pZCBXZWJQYWdlOjpwYXVzZUluRGVidWdnZXIoKQorCit7CisjaWYgRU5BQkxFKEpB
VkFTQ1JJUFRfREVCVUdHRVIpCisgICAgaWYgKGQtPm1fc2NyaXB0RGVidWdnZXIpCisgICAgICAg
IGQtPm1fc2NyaXB0RGVidWdnZXItPnBhdXNlSW5EZWJ1Z2dlcigpOworI2VuZGlmCit9CisKK3Zv
aWQgV2ViUGFnZTo6cmVzdW1lRGVidWdnZXIoKQoreworI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RF
QlVHR0VSKQorICAgIGlmIChkLT5tX3NjcmlwdERlYnVnZ2VyKQorICAgICAgICBkLT5tX3Njcmlw
dERlYnVnZ2VyLT5yZXN1bWVEZWJ1Z2dlcigpOworI2VuZGlmCit9CisKK3ZvaWQgV2ViUGFnZTo6
c3RlcE92ZXJTdGF0ZW1lbnRJbkRlYnVnZ2VyKCkKK3sKKyNpZiBFTkFCTEUoSkFWQVNDUklQVF9E
RUJVR0dFUikKKyAgICBpZiAoZC0+bV9zY3JpcHREZWJ1Z2dlcikKKyAgICAgICAgZC0+bV9zY3Jp
cHREZWJ1Z2dlci0+c3RlcE92ZXJTdGF0ZW1lbnRJbkRlYnVnZ2VyKCk7CisjZW5kaWYKK30KKwor
dm9pZCBXZWJQYWdlOjpzdGVwSW50b1N0YXRlbWVudEluRGVidWdnZXIoKQoreworI2lmIEVOQUJM
RShKQVZBU0NSSVBUX0RFQlVHR0VSKQorICAgIGlmIChkLT5tX3NjcmlwdERlYnVnZ2VyKQorICAg
ICAgICBkLT5tX3NjcmlwdERlYnVnZ2VyLT5zdGVwSW50b1N0YXRlbWVudEluRGVidWdnZXIoKTsK
KyNlbmRpZgorfQorCit2b2lkIFdlYlBhZ2U6OnN0ZXBPdXRPZkZ1bmN0aW9uSW5EZWJ1Z2dlcigp
Cit7CisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCisgICAgaWYgKGQtPm1fc2NyaXB0
RGVidWdnZXIpCisgICAgICAgIGQtPm1fc2NyaXB0RGVidWdnZXItPnN0ZXBPdXRPZkZ1bmN0aW9u
SW5EZWJ1Z2dlcigpOworI2VuZGlmCit9CisKK3Vuc2lnbmVkIFdlYlBhZ2U6OnRpbWVvdXRGb3JK
YXZhU2NyaXB0RXhlY3V0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gU2V0dGluZ3M6OnRpbWVv
dXRGb3JKYXZhU2NyaXB0RXhlY3V0aW9uKGQtPm1fcGFnZS0+Z3JvdXBOYW1lKCkpOworfQorCit2
b2lkIFdlYlBhZ2U6OnNldFRpbWVvdXRGb3JKYXZhU2NyaXB0RXhlY3V0aW9uKHVuc2lnbmVkIG1z
KQoreworICAgIFNldHRpbmdzOjpzZXRUaW1lb3V0Rm9ySmF2YVNjcmlwdEV4ZWN1dGlvbihkLT5t
X3BhZ2UtPmdyb3VwTmFtZSgpLCBtcyk7CisKKyAgICBEb2N1bWVudCogZG9jID0gZC0+bV9wYWdl
LT5tYWluRnJhbWUoKS0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIWRvYykKKyAgICAgICAgcmV0dXJu
OworCisgICAgZG9jLT5nbG9iYWxEYXRhKCktPnRpbWVvdXRDaGVja2VyLnNldFRpbWVvdXRJbnRl
cnZhbChtcyk7Cit9CisKK0pTQ29udGV4dFJlZiBXZWJQYWdlOjpzY3JpcHRDb250ZXh0KCkgY29u
c3QKK3sKKyAgICBpZiAoIWQtPm1fbWFpbkZyYW1lKQorICAgICAgICByZXR1cm4gMDsKKyAgICBK
U0M6OkJpbmRpbmdzOjpSb290T2JqZWN0ICpyb290ID0gZC0+bV9tYWluRnJhbWUtPnNjcmlwdCgp
LT5iaW5kaW5nUm9vdE9iamVjdCgpOworICAgIGlmICghcm9vdCkKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgSlNDOjpFeGVjU3RhdGUgKmV4ZWMgPSByb290LT5nbG9iYWxPYmplY3QoKS0+Z2xvYmFs
RXhlYygpOworICAgIHJldHVybiB0b1JlZihleGVjKTsKK30KKworSlNWYWx1ZVJlZiBXZWJQYWdl
Ojp3aW5kb3dPYmplY3QoKSBjb25zdAoreworICAgIHJldHVybiB0b1JlZihkLT5tX21haW5GcmFt
ZS0+c2NyaXB0KCktPmdsb2JhbE9iamVjdChtYWluVGhyZWFkTm9ybWFsV29ybGQoKSkpOworfQor
CisjaWYgRU5BQkxFKFdFQkRPTSkKK1dlYkRPTURvY3VtZW50IFdlYlBhZ2U6OmRvY3VtZW50KCkg
Y29uc3QKK3sKKyAgICBpZiAoIWQtPm1fbWFpbkZyYW1lKQorICAgICAgICByZXR1cm4gV2ViRE9N
RG9jdW1lbnQoKTsKKyAgICByZXR1cm4gV2ViRE9NRG9jdW1lbnQoZC0+bV9tYWluRnJhbWUtPmRv
Y3VtZW50KCkpOworfQorI2VuZGlmCisKKy8vIFNlcmlhbGl6ZSBvbmx5IHRoZSBtZW1iZXJzIG9m
IEhpc3RvcnlJdGVtIHdoaWNoIGFyZSBuZWVkZWQgYnkgdGhlIGNsaWVudCwKKy8vIGFuZCBjb3B5
IHRoZW0gaW50byBhIFNoYXJlZEFycmF5LiBBbHNvIGluY2x1ZGUgdGhlIEhpc3RvcnlJdGVtIHBv
aW50ZXIgd2hpY2gKKy8vIHdpbGwgYmUgdXNlZCBieSB0aGUgY2xpZW50IGFzIGFuIG9wYXF1ZSBy
ZWZlcmVuY2UgdG8gaWRlbnRpZnkgdGhlIGl0ZW0uCit2b2lkIFdlYlBhZ2U6OmdldEJhY2tGb3J3
YXJkTGlzdChTaGFyZWRBcnJheTxCYWNrRm9yd2FyZEVudHJ5PiYgcmVzdWx0LCB1bnNpZ25lZCBp
bnQmIHJlc3VsdFNpemUpIGNvbnN0Cit7CisgICAgSGlzdG9yeUl0ZW1WZWN0b3IgZW50cmllcyA9
IHN0YXRpY19jYXN0PEJhY2tGb3J3YXJkTGlzdEltcGwqPihkLT5tX3BhZ2UtPmJhY2tGb3J3YXJk
KCktPmNsaWVudCgpKS0+ZW50cmllcygpOworICAgIHJlc3VsdFNpemUgPSBlbnRyaWVzLnNpemUo
KTsKKyAgICByZXN1bHQucmVzZXQobmV3IEJhY2tGb3J3YXJkRW50cnlbcmVzdWx0U2l6ZV0pOwor
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlc3VsdFNpemU7ICsraSkgeworICAgICAg
ICBSZWZQdHI8SGlzdG9yeUl0ZW0+IGVudHJ5ID0gZW50cmllc1tpXTsKKyAgICAgICAgQmFja0Zv
cndhcmRFbnRyeSYgcmVzdWx0RW50cnkgPSByZXN1bHRbaV07CisgICAgICAgIHJlc3VsdEVudHJ5
LnVybCA9IGVudHJ5LT51cmxTdHJpbmcoKTsKKyAgICAgICAgcmVzdWx0RW50cnkub3JpZ2luYWxV
cmwgPSBlbnRyeS0+b3JpZ2luYWxVUkxTdHJpbmcoKTsKKyAgICAgICAgcmVzdWx0RW50cnkudGl0
bGUgPSBlbnRyeS0+dGl0bGUoKTsKKyAgICAgICAgcmVzdWx0RW50cnkubmV0d29ya1Rva2VuID0g
ZW50cnktPnZpZXdTdGF0ZSgpLm5ldHdvcmtUb2tlbjsKKyAgICAgICAgcmVzdWx0RW50cnkubGFz
dFZpc2l0V2FzSFRUUE5vbkdldCA9IGVudHJ5LT5sYXN0VmlzaXRXYXNIVFRQTm9uR2V0KCk7Cisg
ICAgICAgIHJlc3VsdEVudHJ5LmlkID0gYmFja0ZvcndhcmRJZEZyb21IaXN0b3J5SXRlbShlbnRy
eS5nZXQoKSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBIaXN0b3J5SXRlbSBpcyBub3Qg
ZGlzcG9zZWQgd2hpbGUgdGhlIHJlc3VsdCBsaXN0IGlzIHN0aWxsIGJlaW5nIHVzZWQsIHRvIG1h
a2Ugc3VyZSB0aGUgcG9pbnRlciBpcyBub3QgcmV1c2VkCisgICAgICAgIC8vIHdpbGwgYmUgYmFs
YW5jZWQgYnkgZGVyZWYgaW4gcmVsZWFzZUJhY2tGb3J3YXJkRW50cnkuCisgICAgICAgIGVudHJ5
LT5yZWYoKTsKKyAgICB9Cit9CisKK3ZvaWQgV2ViUGFnZTo6cmVsZWFzZUJhY2tGb3J3YXJkRW50
cnkoQmFja0ZvcndhcmRJZCBpZCkgY29uc3QKK3sKKyAgICBIaXN0b3J5SXRlbSogaXRlbSA9IGhp
c3RvcnlJdGVtRnJvbUJhY2tGb3J3YXJkSWQoaWQpOworICAgIEFTU0VSVChpdGVtKTsKKyAgICBp
dGVtLT5kZXJlZigpOworfQorCit2b2lkIFdlYlBhZ2U6OmNsZWFyQnJvd3NpbmdEYXRhKCkKK3sK
KyAgICBjbGVhck1lbW9yeUNhY2hlcygpOworICAgIGNsZWFyQXBwQ2FjaGUoZC0+bV9wYWdlLT5n
cm91cE5hbWUoKSk7CisgICAgY2xlYXJMb2NhbFN0b3JhZ2UoKTsKKyAgICBjbGVhckNvb2tpZUNh
Y2hlKCk7CisgICAgY2xlYXJIaXN0b3J5KCk7CisgICAgY2xlYXJQbHVnaW5TaXRlRGF0YSgpOwor
fQorCit2b2lkIFdlYlBhZ2U6OmNsZWFySGlzdG9yeSgpCit7CisgICAgLy8gRG9uJ3QgY2xlYXIg
dGhlIGJhY2stZm9yd2FyZCBsaXN0IGFzIHdlIG1pZ2h0IGxpa2UgdG8ga2VlcCBpdC4KK30KKwor
dm9pZCBXZWJQYWdlOjpjbGVhckNvb2tpZXMoKQoreworICAgIGNsZWFyQ29va2llQ2FjaGUoKTsK
K30KKwordm9pZCBXZWJQYWdlOjpjbGVhckxvY2FsU3RvcmFnZSgpCit7CisgICAgQmxhY2tCZXJy
eTo6V2ViS2l0OjpjbGVhckxvY2FsU3RvcmFnZShkLT5tX3BhZ2UtPmdyb3VwTmFtZSgpKTsKKyAg
ICBCbGFja0JlcnJ5OjpXZWJLaXQ6OmNsZWFyRGF0YWJhc2UoZC0+bV9wYWdlLT5ncm91cE5hbWUo
KSk7CisgICAgY2xlYXJTdG9yYWdlKCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6Y2xlYXJDYWNoZSgp
Cit7CisgICAgY2xlYXJNZW1vcnlDYWNoZXMoKTsKKyAgICBjbGVhckFwcENhY2hlKGQtPm1fcGFn
ZS0+Z3JvdXBOYW1lKCkpOworfQorCit2b2lkIFdlYlBhZ2U6OmNsZWFyQmFja0ZvcndhcmRMaXN0
KGJvb2wga2VlcEN1cnJlbnRQYWdlKSBjb25zdAoreworICAgIEJhY2tGb3J3YXJkTGlzdEltcGwq
IGJhY2tGb3J3YXJkTGlzdCA9IHN0YXRpY19jYXN0PEJhY2tGb3J3YXJkTGlzdEltcGwqPihkLT5t
X3BhZ2UtPmJhY2tGb3J3YXJkKCktPmNsaWVudCgpKTsKKyAgICBSZWZQdHI8SGlzdG9yeUl0ZW0+
IGN1cnJlbnRJdGVtID0gYmFja0ZvcndhcmRMaXN0LT5jdXJyZW50SXRlbSgpOworICAgIHdoaWxl
ICghYmFja0ZvcndhcmRMaXN0LT5lbnRyaWVzKCkuaXNFbXB0eSgpKQorICAgICAgICBiYWNrRm9y
d2FyZExpc3QtPnJlbW92ZUl0ZW0oYmFja0ZvcndhcmRMaXN0LT5lbnRyaWVzKCkubGFzdCgpLmdl
dCgpKTsKKyAgICBpZiAoa2VlcEN1cnJlbnRQYWdlKQorICAgICAgICBiYWNrRm9yd2FyZExpc3Qt
PmFkZEl0ZW0oY3VycmVudEl0ZW0pOworfQorCitib29sIFdlYlBhZ2U6OmlzRW5hYmxlTG9jYWxB
Y2Nlc3NUb0FsbENvb2tpZXMoKSBjb25zdAoreworICAgIHJldHVybiBjb29raWVNYW5hZ2VyKCku
Y2FuTG9jYWxBY2Nlc3NBbGxDb29raWVzKCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0RW5hYmxl
TG9jYWxBY2Nlc3NUb0FsbENvb2tpZXMoYm9vbCBlbmFibGVkKQoreworICAgIGNvb2tpZU1hbmFn
ZXIoKS5zZXRDYW5Mb2NhbEFjY2Vzc0FsbENvb2tpZXMoZW5hYmxlZCk7Cit9CisKK3ZvaWQgV2Vi
UGFnZTo6YWRkVmlzaXRlZExpbmsoY29uc3QgdW5zaWduZWQgc2hvcnQqIHVybCwgdW5zaWduZWQg
aW50IGxlbmd0aCkKK3sKKyAgICBBU1NFUlQoZC0+bV9wYWdlKTsKKyAgICBkLT5tX3BhZ2UtPmdy
b3VwKCkuYWRkVmlzaXRlZExpbmsodXJsLCBsZW5ndGgpOworfQorCisjaWYgRU5BQkxFKFdFQkRP
TSkKK1dlYkRPTU5vZGUgV2ViUGFnZTo6bm9kZUF0UG9pbnQoaW50IHgsIGludCB5KQoreworICAg
IEhpdFRlc3RSZXN1bHQgcmVzdWx0ID0gZC0+bV9tYWluRnJhbWUtPmV2ZW50SGFuZGxlcigpLT5o
aXRUZXN0UmVzdWx0QXRQb2ludChkLT5tYXBGcm9tVHJhbnNmb3JtZWQoSW50UG9pbnQoeCwgeSkp
LCBmYWxzZSk7CisgICAgTm9kZSogbm9kZSA9IHJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKTsK
KyAgICByZXR1cm4gV2ViRE9NTm9kZShub2RlKTsKK30KKworYm9vbCBXZWJQYWdlOjpnZXROb2Rl
UmVjdChjb25zdCBXZWJET01Ob2RlJiBub2RlLCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVzdWx0KQor
eworICAgIE5vZGUqIG5vZGVJbXBsID0gbm9kZS5pbXBsKCk7CisgICAgaWYgKG5vZGVJbXBsICYm
IG5vZGVJbXBsLT5yZW5kZXJlcigpKSB7CisgICAgICAgIHJlc3VsdCA9IG5vZGVJbXBsLT5nZXRS
ZWN0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsK
K30KKworYm9vbCBXZWJQYWdlOjpzZXROb2RlRm9jdXMoY29uc3QgV2ViRE9NTm9kZSYgbm9kZSwg
Ym9vbCBvbikKK3sKKyAgICBOb2RlKiBub2RlSW1wbCA9IG5vZGUuaW1wbCgpOworCisgICAgaWYg
KG5vZGVJbXBsICYmIG5vZGVJbXBsLT5pc0ZvY3VzYWJsZSgpKSB7CisgICAgICAgIERvY3VtZW50
KiBkb2MgPSBub2RlSW1wbC0+ZG9jdW1lbnQoKTsKKyAgICAgICAgaWYgKFBhZ2UqIHBhZ2UgPSBk
b2MtPnBhZ2UoKSkgeworICAgICAgICAgICAgLy8gTW9kaWZ5IGlmIGZvY3VzaW5nIG9uIG5vZGUg
b3IgdHVybmluZyBvZmYgZm9jdXNlZCBub2RlLgorICAgICAgICAgICAgaWYgKG9uKSB7CisgICAg
ICAgICAgICAgICAgcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPnNldEZvY3VzZWROb2RlKG5vZGVJ
bXBsLCBkb2MtPmZyYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChub2RlSW1wbC0+aXNFbGVt
ZW50Tm9kZSgpKQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9k
ZUltcGwpLT51cGRhdGVGb2N1c0FwcGVhcmFuY2UodHJ1ZSk7CisgICAgICAgICAgICAgICAgZC0+
bV9pbnB1dEhhbmRsZXItPmRpZE5vZGVPcGVuUG9wdXAobm9kZUltcGwpOworICAgICAgICAgICAg
fSBlbHNlIGlmIChkb2MtPmZvY3VzZWROb2RlKCkgPT0gbm9kZUltcGwpIC8vICYmICFvbgorICAg
ICAgICAgICAgICAgIHBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5zZXRGb2N1c2VkTm9kZSgwLCBk
b2MtPmZyYW1lKCkpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAg
IH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgV2ViUGFnZTo6c2V0Tm9kZUhvdmVyZWQo
Y29uc3QgV2ViRE9NTm9kZSYgbm9kZSwgYm9vbCBvbikKK3sKKyAgICBOb2RlKiBub2RlSW1wbCA9
IG5vZGUuaW1wbCgpOworICAgIGlmIChub2RlSW1wbCkgeworICAgICAgICBub2RlSW1wbC0+c2V0
SG92ZXJlZChvbik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK2Jvb2wgV2ViUGFnZTo6bm9kZUhhc0hvdmVyKGNvbnN0IFdlYkRPTU5vZGUmIG5v
ZGUpCit7CisgICAgTm9kZSogbm9kZUltcGwgPSBub2RlLmltcGwoKTsKKyAgICBpZiAobm9kZUlt
cGwpIHsKKyAgICAgICAgUmVuZGVyU3R5bGUqIHN0eWxlID0gbm9kZUltcGwtPnJlbmRlclN0eWxl
KCk7CisgICAgICAgIGlmIChzdHlsZSkKKyAgICAgICAgICAgIHJldHVybiBzdHlsZS0+YWZmZWN0
ZWRCeUhvdmVyUnVsZXMoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisK
K1dURjo6U3RyaW5nIFdlYlBhZ2VQcml2YXRlOjpmaW5kUGF0dGVyblN0cmluZ0ZvclVybChjb25z
dCBLVVJMJiB1cmwpIGNvbnN0Cit7CisgICAgaWYgKChtX3dlYlNldHRpbmdzLT5zaG91bGRIYW5k
bGVQYXR0ZXJuVXJscygpICYmIHByb3RvY29sSXModXJsLCAicGF0dGVybiIpKQorICAgICAgICAg
ICAgfHwgcHJvdG9jb2xJcyh1cmwsICJ0ZWwiKQorICAgICAgICAgICAgfHwgcHJvdG9jb2xJcyh1
cmwsICJ3dGFpIikKKyAgICAgICAgICAgIHx8IHByb3RvY29sSXModXJsLCAiY3RpIikKKyAgICAg
ICAgICAgIHx8IHByb3RvY29sSXModXJsLCAibWFpbHRvIikKKyAgICAgICAgICAgIHx8IHByb3Rv
Y29sSXModXJsLCAic21zIikKKyAgICAgICAgICAgIHx8IHByb3RvY29sSXModXJsLCAicGluIikp
IHsKKyAgICAgICAgcmV0dXJuIHVybDsKKyAgICB9CisgICAgcmV0dXJuIFdURjo6U3RyaW5nKCk7
Cit9CisKK2Jvb2wgV2ViUGFnZTo6ZGVmZXJzTG9hZGluZygpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGQtPm1fcGFnZS0+ZGVmZXJzTG9hZGluZygpOworfQorCitib29sIFdlYlBhZ2U6OndpbGxGaXJl
VGltZXIoKQoreworICAgIGlmIChkLT5pc0xvYWRpbmcoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7
CisKKyAgICByZXR1cm4gZC0+bV9iYWNraW5nU3RvcmUtPmQtPndpbGxGaXJlVGltZXIoKTsKK30K
Kwordm9pZCBXZWJQYWdlOjpjbGVhclN0b3JhZ2UoKQoreworfQorCit2b2lkIFdlYlBhZ2U6Om5v
dGlmeVBhZ2VQYXVzZSgpCit7CisgICAgSGFzaFNldDxQbHVnaW5WaWV3Kj46OmNvbnN0X2l0ZXJh
dG9yIGl0ID0gZC0+bV9wbHVnaW5WaWV3cy5iZWdpbigpOworICAgIEhhc2hTZXQ8UGx1Z2luVmll
dyo+Ojpjb25zdF9pdGVyYXRvciBsYXN0ID0gZC0+bV9wbHVnaW5WaWV3cy5lbmQoKTsKKyAgICBm
b3IgKDsgaXQgIT0gbGFzdDsgKytpdCkKKyAgICAgICAgKCppdCktPmhhbmRsZVBhdXNlRXZlbnQo
KTsKK30KKwordm9pZCBXZWJQYWdlOjpub3RpZnlQYWdlUmVzdW1lKCkKK3sKKyAgICBIYXNoU2V0
PFBsdWdpblZpZXcqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBkLT5tX3BsdWdpblZpZXdzLmJlZ2lu
KCk7CisgICAgSGFzaFNldDxQbHVnaW5WaWV3Kj46OmNvbnN0X2l0ZXJhdG9yIGxhc3QgPSBkLT5t
X3BsdWdpblZpZXdzLmVuZCgpOworICAgIGZvciAoOyBpdCAhPSBsYXN0OyArK2l0KQorICAgICAg
ICAoKml0KS0+aGFuZGxlUmVzdW1lRXZlbnQoKTsKK30KKwordm9pZCBXZWJQYWdlOjpub3RpZnlQ
YWdlQmFja2dyb3VuZCgpCit7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAg
IGQtPnN1c3BlbmRSb290TGF5ZXJDb21taXQoKTsKKyNlbmRpZgorCisgICAgSGFzaFNldDxQbHVn
aW5WaWV3Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZC0+bV9wbHVnaW5WaWV3cy5iZWdpbigpOwor
ICAgIEhhc2hTZXQ8UGx1Z2luVmlldyo+Ojpjb25zdF9pdGVyYXRvciBsYXN0ID0gZC0+bV9wbHVn
aW5WaWV3cy5lbmQoKTsKKyAgICBmb3IgKDsgaXQgIT0gbGFzdDsgKytpdCkKKyAgICAgICAgKCpp
dCktPmhhbmRsZUJhY2tncm91bmRFdmVudCgpOworfQorCit2b2lkIFdlYlBhZ2U6Om5vdGlmeVBh
Z2VGb3JlZ3JvdW5kKCkKK3sKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAg
ZC0+cmVzdW1lUm9vdExheWVyQ29tbWl0KCk7CisjZW5kaWYKKworICAgIEhhc2hTZXQ8UGx1Z2lu
Vmlldyo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGQtPm1fcGx1Z2luVmlld3MuYmVnaW4oKTsKKyAg
ICBIYXNoU2V0PFBsdWdpblZpZXcqPjo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IGQtPm1fcGx1Z2lu
Vmlld3MuZW5kKCk7CisgICAgZm9yICg7IGl0ICE9IGxhc3Q7ICsraXQpCisgICAgICAgICgqaXQp
LT5oYW5kbGVGb3JlZ3JvdW5kRXZlbnQoKTsKK30KKwordm9pZCBXZWJQYWdlOjpub3RpZnlQYWdl
RnVsbFNjcmVlbkFsbG93ZWQoKQoreworICAgIEhhc2hTZXQ8UGx1Z2luVmlldyo+Ojpjb25zdF9p
dGVyYXRvciBpdCA9IGQtPm1fcGx1Z2luVmlld3MuYmVnaW4oKTsKKyAgICBIYXNoU2V0PFBsdWdp
blZpZXcqPjo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IGQtPm1fcGx1Z2luVmlld3MuZW5kKCk7Cisg
ICAgZm9yICg7IGl0ICE9IGxhc3Q7ICsraXQpCisgICAgICAgICgqaXQpLT5oYW5kbGVGdWxsU2Ny
ZWVuQWxsb3dlZEV2ZW50KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90aWZ5UGFnZUZ1bGxTY3Jl
ZW5FeGl0KCkKK3sKKyAgICBIYXNoU2V0PFBsdWdpblZpZXcqPjo6Y29uc3RfaXRlcmF0b3IgaXQg
PSBkLT5tX3BsdWdpblZpZXdzLmJlZ2luKCk7CisgICAgSGFzaFNldDxQbHVnaW5WaWV3Kj46OmNv
bnN0X2l0ZXJhdG9yIGxhc3QgPSBkLT5tX3BsdWdpblZpZXdzLmVuZCgpOworICAgIGZvciAoOyBp
dCAhPSBsYXN0OyArK2l0KQorICAgICAgICAoKml0KS0+aGFuZGxlRnVsbFNjcmVlbkV4aXRFdmVu
dCgpOworfQorCit2b2lkIFdlYlBhZ2U6Om5vdGlmeURldmljZUlkbGVTdGF0ZUNoYW5nZShib29s
IGVudGVySWRsZSkKK3sKKyAgICBIYXNoU2V0PFBsdWdpblZpZXcqPjo6Y29uc3RfaXRlcmF0b3Ig
aXQgPSBkLT5tX3BsdWdpblZpZXdzLmJlZ2luKCk7CisgICAgSGFzaFNldDxQbHVnaW5WaWV3Kj46
OmNvbnN0X2l0ZXJhdG9yIGxhc3QgPSBkLT5tX3BsdWdpblZpZXdzLmVuZCgpOworICAgIGZvciAo
OyBpdCAhPSBsYXN0OyArK2l0KQorICAgICAgICAoKml0KS0+aGFuZGxlSWRsZUV2ZW50KGVudGVy
SWRsZSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90aWZ5QXBwQWN0aXZhdGlvblN0YXRlQ2hhbmdl
KEFjdGl2YXRpb25TdGF0ZVR5cGUgYWN0aXZhdGlvblN0YXRlKQoreworICAgIEhhc2hTZXQ8UGx1
Z2luVmlldyo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGQtPm1fcGx1Z2luVmlld3MuYmVnaW4oKTsK
KyAgICBIYXNoU2V0PFBsdWdpblZpZXcqPjo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IGQtPm1fcGx1
Z2luVmlld3MuZW5kKCk7CisKKyNpZiBFTkFCTEUoVklERU8pCisgICAgaWYgKGFjdGl2YXRpb25T
dGF0ZSA9PSBBY3RpdmF0aW9uQWN0aXZlKQorICAgICAgICBNZWRpYVBsYXllclByaXZhdGU6Om5v
dGlmeUFwcEFjdGl2YXRlZEV2ZW50KHRydWUpOworICAgIGVsc2UKKyAgICAgICAgTWVkaWFQbGF5
ZXJQcml2YXRlOjpub3RpZnlBcHBBY3RpdmF0ZWRFdmVudChmYWxzZSk7CisjZW5kaWYKKworICAg
IGZvciAoOyBpdCAhPSBsYXN0OyArK2l0KSB7CisgICAgICAgIHN3aXRjaCAoYWN0aXZhdGlvblN0
YXRlKSB7CisgICAgICAgIGNhc2UgQWN0aXZhdGlvbkFjdGl2ZToKKyAgICAgICAgICAgICgqaXQp
LT5oYW5kbGVBcHBBY3RpdmF0ZWRFdmVudCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgQWN0aXZhdGlvbkluYWN0aXZlOgorICAgICAgICAgICAgKCppdCktPmhhbmRsZUFwcERl
YWN0aXZhdGVkRXZlbnQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFjdGl2
YXRpb25TdGFuZGJ5OgorICAgICAgICAgICAgKCppdCktPmhhbmRsZUFwcFN0YW5kYnlFdmVudCgp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vIEZJWE1FOiBHZXQgcmlk
IG9mIHRoZSBkZWZhdWx0IHRvIGZvcmNlIGEgY29tcGlsZXIgZXJyb3IgaW5zdGVhZCBvZiB1c2lu
ZyBhIHJ1bnRpbWUgZXJyb3IuIFNlZSBQUiAjMTIxMTA5LgorICAgICAgICAgICAgQVNTRVJUKDAp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgV2ViUGFn
ZTo6bm90aWZ5U3dpcGVFdmVudCgpCit7CisgICAgSGFzaFNldDxQbHVnaW5WaWV3Kj46OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gZC0+bV9wbHVnaW5WaWV3cy5iZWdpbigpOworICAgIEhhc2hTZXQ8UGx1
Z2luVmlldyo+Ojpjb25zdF9pdGVyYXRvciBsYXN0ID0gZC0+bV9wbHVnaW5WaWV3cy5lbmQoKTsK
KyAgICBmb3IgKDsgaXQgIT0gbGFzdDsgKytpdCkKKyAgICAgICAoKml0KS0+aGFuZGxlU3dpcGVF
dmVudCgpOworfQorCit2b2lkIFdlYlBhZ2U6Om5vdGlmeVNjcmVlblBvd2VyU3RhdGVDaGFuZ2Vk
KGJvb2wgcG93ZXJlZCkKK3sKKyAgICBIYXNoU2V0PFBsdWdpblZpZXcqPjo6Y29uc3RfaXRlcmF0
b3IgaXQgPSBkLT5tX3BsdWdpblZpZXdzLmJlZ2luKCk7CisgICAgSGFzaFNldDxQbHVnaW5WaWV3
Kj46OmNvbnN0X2l0ZXJhdG9yIGxhc3QgPSBkLT5tX3BsdWdpblZpZXdzLmVuZCgpOworICAgIGZv
ciAoOyBpdCAhPSBsYXN0OyArK2l0KQorICAgICAgICgqaXQpLT5oYW5kbGVTY3JlZW5Qb3dlckV2
ZW50KHBvd2VyZWQpOworfQorCit2b2lkIFdlYlBhZ2U6Om5vdGlmeUZ1bGxTY3JlZW5WaWRlb0V4
aXRlZChib29sIGRvbmUpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIGlmIChIVE1MTWVkaWFF
bGVtZW50KiBtZWRpYUVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MTWVkaWFFbGVtZW50Kj4oZC0+
bV9mdWxsc2NyZWVuVmlkZW9Ob2RlLmdldCgpKSkKKyAgICAgICAgbWVkaWFFbGVtZW50LT5leGl0
RnVsbHNjcmVlbigpOworI2VuZGlmCit9CisKK3ZvaWQgV2ViUGFnZTo6Y2xlYXJQbHVnaW5TaXRl
RGF0YSgpCit7CisgICAgUGx1Z2luRGF0YWJhc2UqIGRhdGFiYXNlID0gUGx1Z2luRGF0YWJhc2U6
Omluc3RhbGxlZFBsdWdpbnModHJ1ZSk7CisKKyAgICBpZiAoIWRhdGFiYXNlKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBWZWN0b3I8UGx1Z2luUGFja2FnZSo+IHBsdWdpbnMgPSBkYXRhYmFzZS0+
cGx1Z2lucygpOworCisgICAgVmVjdG9yPFBsdWdpblBhY2thZ2UqPjo6Y29uc3RfaXRlcmF0b3Ig
ZW5kID0gcGx1Z2lucy5lbmQoKTsKKyAgICBmb3IgKFZlY3RvcjxQbHVnaW5QYWNrYWdlKj46OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gcGx1Z2lucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAg
ICAgICgqaXQpLT5jbGVhclNpdGVEYXRhKFN0cmluZygpKTsKK30KKwordm9pZCBXZWJQYWdlOjpv
bklucHV0TG9jYWxlQ2hhbmdlZChib29sIGlzUlRMKQoreworICAgIGQtPm9uSW5wdXRMb2NhbGVD
aGFuZ2VkKGlzUlRMKTsKK30KKwordm9pZCBXZWJQYWdlOjpvbk5ldHdvcmtBdmFpbGFiaWxpdHlD
aGFuZ2VkKGJvb2wgYXZhaWxhYmxlKQoreworICAgIHVwZGF0ZU9ubGluZVN0YXR1cyhhdmFpbGFi
bGUpOworfQorCit2b2lkIFdlYlBhZ2U6Om9uQ2VydGlmaWNhdGVTdG9yZUxvY2F0aW9uU2V0KGNv
bnN0IFdlYlN0cmluZyYgY2FQYXRoKQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBNZWRpYVBs
YXllclByaXZhdGU6OnNldENlcnRpZmljYXRlUGF0aChjYVBhdGgpOworI2VuZGlmCit9CisKK3Zv
aWQgV2ViUGFnZTo6ZW5hYmxlV2ViSW5zcGVjdG9yKCkKK3sKKyAgICBkLT5tX3BhZ2UtPmluc3Bl
Y3RvckNvbnRyb2xsZXIoKS0+Y29ubmVjdEZyb250ZW5kKCk7CisgICAgZC0+bV9wYWdlLT5zZXR0
aW5ncygpLT5zZXREZXZlbG9wZXJFeHRyYXNFbmFibGVkKHRydWUpOworfQorCit2b2lkIFdlYlBh
Z2U6OmRpc2FibGVXZWJJbnNwZWN0b3IoKQoreworICAgIGQtPm1fcGFnZS0+aW5zcGVjdG9yQ29u
dHJvbGxlcigpLT5kaXNjb25uZWN0RnJvbnRlbmQoKTsKKyAgICBkLT5tX3BhZ2UtPnNldHRpbmdz
KCktPnNldERldmVsb3BlckV4dHJhc0VuYWJsZWQoZmFsc2UpOworfQorCit2b2lkIFdlYlBhZ2U6
OmVuYWJsZVBhc3N3b3JkRWNobygpCit7CisgICAgZC0+bV9wYWdlLT5zZXR0aW5ncygpLT5zZXRQ
YXNzd29yZEVjaG9FbmFibGVkKHRydWUpOworfQorCit2b2lkIFdlYlBhZ2U6OmRpc2FibGVQYXNz
d29yZEVjaG8oKQoreworICAgIGQtPm1fcGFnZS0+c2V0dGluZ3MoKS0+c2V0UGFzc3dvcmRFY2hv
RW5hYmxlZChmYWxzZSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6ZGlzcGF0Y2hJbnNwZWN0b3JNZXNz
YWdlKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGludCBsZW5ndGgpCit7CisgICAgU3RyaW5nIHN0cmlu
Z01lc3NhZ2UobWVzc2FnZSwgbGVuZ3RoKTsKKyAgICBkLT5tX3BhZ2UtPmluc3BlY3RvckNvbnRy
b2xsZXIoKS0+ZGlzcGF0Y2hNZXNzYWdlRnJvbUZyb250ZW5kKHN0cmluZ01lc3NhZ2UpOworfQor
CitGcmFtZSogV2ViUGFnZTo6bWFpbkZyYW1lKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+bV9t
YWluRnJhbWU7Cit9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCit2b2lkIFdl
YlBhZ2VQcml2YXRlOjpkcmF3TGF5ZXJzT25Db21taXQoKQoreworICAgIGlmICghUGxhdGZvcm06
OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKSB7
CisgICAgICAgIC8vIFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgbGF5
ZXIgYXBwZWFyYW5jZSBjaGFuZ2VkIGR1ZSB0bworICAgICAgICAvLyBhbmltYXRpb25zLiBBbmQg
b25seSBpZiB3ZSBkb24ndCBuZWVkIGEgb25lIHNob3QgZHJhd2luZyBzeW5jLgorICAgICAgICBB
U1NFUlQoIW5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKSk7CisKKyAgICAgICAg
aWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpIHx8ICFtX2JhY2tpbmdTdG9yZS0+ZC0+aXNBY3Rp
dmUoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+
d2lsbERyYXdMYXllcnNPbkNvbW1pdCgpOworCisgICAgICAgIFBsYXRmb3JtOjp1c2VySW50ZXJm
YWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5kaXNwYXRjaE1lc3NhZ2UoCisgICAgICAgICAgICBQ
bGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJldlYlBhZ2VQcml2YXRlOjpkcmF3TGF5
ZXJzT25Db21taXQsIHRoaXMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICht
X2NsaWVudC0+d2luZG93KCktPndpbmRvd1VzYWdlKCkgPT0gUGxhdGZvcm06OkdyYXBoaWNzOjpX
aW5kb3c6OkdMRVMyVXNhZ2UpIHsKKyAgICAgICAgbV9iYWNraW5nU3RvcmUtPmQtPmJsaXRWaXNp
YmxlQ29udGVudHMoKTsKKyAgICAgICAgcmV0dXJuOyAvLyBibGl0VmlzaWJsZUNvbnRlbnRzKCkg
aW5jbHVkZXMgZHJhd1N1YkxheWVycygpIGluIHRoaXMgY2FzZS4KKyAgICB9CisKKyAgICBpZiAo
IWRyYXdTdWJMYXllcnMoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSWYgd2UgdXNlIHRo
ZSBjb21wb3NpdGluZyBzdXJmYWNlLCB3ZSBuZWVkIHRvIHJlLWJsaXQgdGhlCisgICAgLy8gYmFj
a2luZ3N0b3JlIGFuZCBibGVuZCB0aGUgY29tcG9zaXRpbmcgc3VyZmFjZSBvbiB0b3Agb2YgdGhh
dAorICAgIC8vIGluIG9yZGVyIHRvIGdldCB0aGUgbmV3bHkgZHJhd24gbGF5ZXJzIG9uIHNjcmVl
bi4KKyAgICBpZiAoIVN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT5jb21wb3NpdGlu
Z1N1cmZhY2UoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSWYgdGhlcmUgYXJlIG5vIHZp
c2libGUgbGF5ZXJzLCByZXR1cm4gZWFybHkuCisgICAgaWYgKGxhc3RDb21wb3NpdGluZ1Jlc3Vs
dHMoKS5pc0VtcHR5KCkgJiYgbGFzdENvbXBvc2l0aW5nUmVzdWx0cygpLndhc0VtcHR5KQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAobV9iYWNraW5nU3RvcmUtPmQtPnNob3VsZERpcmVjdFJl
bmRlcmluZ1RvV2luZG93KCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fYmFja2luZ1N0b3Jl
LT5kLT5ibGl0VmlzaWJsZUNvbnRlbnRzKCk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmRy
YXdTdWJMYXllcnMoY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBjb250
ZW50cykKK3sKKyAgICBBU1NFUlQoUGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdl
Q2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKTsKKyAgICBpZiAoIVBsYXRmb3JtOjp1c2VySW50
ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgaWYgKG1fY29tcG9zaXRvcikgeworICAgICAgICBtX2NvbXBv
c2l0b3ItPnNldENvbXBvc2l0aW5nT250b01haW5XaW5kb3coCisgICAgICAgICAgICBtX2NsaWVu
dC0+d2luZG93KCktPndpbmRvd1VzYWdlKCkgPT0gUGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3c6
OkdMRVMyVXNhZ2UpOworICAgICAgICByZXR1cm4gbV9jb21wb3NpdG9yLT5kcmF3TGF5ZXJzKGRz
dFJlY3QsIGNvbnRlbnRzKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wg
V2ViUGFnZVByaXZhdGU6OmRyYXdTdWJMYXllcnMoKQoreworICAgIEFTU0VSVChQbGF0Zm9ybTo6
dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpOwor
ICAgIGlmICghUGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlz
Q3VycmVudFRocmVhZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gbV9i
YWNraW5nU3RvcmUtPmQtPmRyYXdTdWJMYXllcnMoKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0
ZTo6c2NoZWR1bGVSb290TGF5ZXJDb21taXQoKQoreworICAgIGlmICghbV9mcmFtZUxheWVycyB8
fCAhbV9mcmFtZUxheWVycy0+aGFzTGF5ZXIoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9u
ZWVkc0NvbW1pdCA9IHRydWU7CisgICAgaWYgKCFtX3Jvb3RMYXllckNvbW1pdFRpbWVyLT5pc0Fj
dGl2ZSgpKQorICAgICAgICBtX3Jvb3RMYXllckNvbW1pdFRpbWVyLT5zdGFydE9uZVNob3QoMCk7
Cit9CisKK3N0YXRpYyBib29sIG5lZWRzTGF5b3V0UmVjdXJzaXZlKEZyYW1lVmlldyogdmlldykK
K3sKKyAgICBpZiAodmlldy0+bmVlZHNMYXlvdXQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisK
KyAgICBib29sIHN1YmZyYW1lc05lZWRzTGF5b3V0ID0gZmFsc2U7CisgICAgY29uc3QgSGFzaFNl
dDxSZWZQdHI8V2lkZ2V0PiA+KiB2aWV3Q2hpbGRyZW4gPSB2aWV3LT5jaGlsZHJlbigpOworICAg
IEhhc2hTZXQ8UmVmUHRyPFdpZGdldD4gPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gdmlld0NoaWxk
cmVuLT5lbmQoKTsKKyAgICBmb3IgKEhhc2hTZXQ8UmVmUHRyPFdpZGdldD4gPjo6Y29uc3RfaXRl
cmF0b3IgY3VycmVudCA9IHZpZXdDaGlsZHJlbi0+YmVnaW4oKTsgY3VycmVudCAhPSBlbmQgJiYg
IXN1YmZyYW1lc05lZWRzTGF5b3V0OyArK2N1cnJlbnQpIHsKKyAgICAgICAgV2lkZ2V0KiB3aWRn
ZXQgPSAoKmN1cnJlbnQpLmdldCgpOworICAgICAgICBpZiAod2lkZ2V0LT5pc0ZyYW1lVmlldygp
KQorICAgICAgICAgICAgc3ViZnJhbWVzTmVlZHNMYXlvdXQgfD0gbmVlZHNMYXlvdXRSZWN1cnNp
dmUoc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4od2lkZ2V0KSk7CisgICAgfQorCisgICAgcmV0dXJu
IHN1YmZyYW1lc05lZWRzTGF5b3V0OworfQorCitMYXllclJlbmRlcmluZ1Jlc3VsdHMgV2ViUGFn
ZVByaXZhdGU6Omxhc3RDb21wb3NpdGluZ1Jlc3VsdHMoKSBjb25zdAoreworICAgIGlmIChtX2Nv
bXBvc2l0b3IpCisgICAgICAgIHJldHVybiBtX2NvbXBvc2l0b3ItPmxhc3RDb21wb3NpdGluZ1Jl
c3VsdHMoKTsKKyAgICByZXR1cm4gTGF5ZXJSZW5kZXJpbmdSZXN1bHRzKCk7Cit9CisKK3ZvaWQg
V2ViUGFnZVByaXZhdGU6OmNvbW1pdFJvb3RMYXllcihjb25zdCBJbnRSZWN0JiBsYXlvdXRSZWN0
Rm9yQ29tcG9zaXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgSW50U2l6ZSYgY29udGVudHNTaXplRm9yQ29tcG9zaXRpbmcpCit7CisgICAgaWYgKCFtX2Zy
YW1lTGF5ZXJzIHx8ICFtX2NvbXBvc2l0b3IpCisgICAgICAgIHJldHVybjsKKworICAgIG1fY29t
cG9zaXRvci0+c2V0TGF5b3V0UmVjdEZvckNvbXBvc2l0aW5nKGxheW91dFJlY3RGb3JDb21wb3Np
dGluZyk7CisgICAgbV9jb21wb3NpdG9yLT5zZXRDb250ZW50c1NpemVGb3JDb21wb3NpdGluZyhj
b250ZW50c1NpemVGb3JDb21wb3NpdGluZyk7CisgICAgbV9jb21wb3NpdG9yLT5jb21taXQobV9m
cmFtZUxheWVycy0+cm9vdExheWVyKCkpOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpjb21t
aXRSb290TGF5ZXJJZk5lZWRlZCgpCit7CisgICAgaWYgKG1fc3VzcGVuZFJvb3RMYXllckNvbW1p
dCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFtX25lZWRzQ29tbWl0KQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIW1fZnJhbWVMYXllcnMgfHwgIW1fZnJhbWVM
YXllcnMtPmhhc0xheWVyKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEZyYW1lVmll
dyogdmlldyA9IG1fbWFpbkZyYW1lLT52aWV3KCk7CisgICAgaWYgKCF2aWV3KQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZiB3ZSBzeW5jIGNvbXBvc2l0aW5nIGxheWVycyB3aGVu
IGEgbGF5b3V0IGlzIHBlbmRpbmcsIHdlIG1heSBjYXVzZSBwYWludGluZyBvZiBjb21wb3NpdGlu
ZworICAgIC8vIGxheWVyIGNvbnRlbnQgdG8gb2NjdXIgYmVmb3JlIGxheW91dCBoYXMgaGFwcGVu
ZWQsIHdoaWNoIHdpbGwgY2F1c2UgcGFpbnRDb250ZW50cygpIHRvIGJhaWwuCisgICAgaWYgKG5l
ZWRzTGF5b3V0UmVjdXJzaXZlKHZpZXcpKSB7CisgICAgICAgIC8vIEluIGNhc2Ugb2Ygb25lIHNo
b3QgZHJhd2luZyBzeW5jaHJvbml6YXRpb24sIHlvdQorICAgICAgICAvLyBzaG91bGQgZmlyc3Qg
bGF5b3V0SWZOZWVkZWQsIHJlbmRlciwgdGhlbiBjb21taXQgYW5kIGRyYXcgdGhlIGxheWVycy4K
KyAgICAgICAgQVNTRVJUKCFuZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0aW9uKCkpOwor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9uZWVkc0NvbW1pdCA9IGZhbHNl
OworICAgIC8vIFdlIGdldCBoZXJlIGVpdGhlciBkdWUgdG8gdGhlIGNvbW1pdCB0aW1lciwgd2hp
Y2ggd291bGQgaGF2ZSBjYWxsZWQKKyAgICAvLyByZW5kZXIgaWYgYSBvbmUgc2hvdCBzeW5jIHdh
cyBuZWVkZWQuIE9yIHdlIGdldCBjYWxsZWQgZnJvbSByZW5kZXIKKyAgICAvLyBiZWZvcmUgdGhl
IHRpbWVyIHRpbWVzIG91dCwgd2hpY2ggbWVhbnMgd2UgYXJlIGRvaW5nIGEgb25lIHNob3QgYW55
d2F5LgorICAgIG1fbmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbiA9IGZhbHNlOwor
CisgICAgaWYgKG1fcm9vdExheWVyQ29tbWl0VGltZXItPmlzQWN0aXZlKCkpCisgICAgICAgIG1f
cm9vdExheWVyQ29tbWl0VGltZXItPnN0b3AoKTsKKworICAgIG1fZnJhbWVMYXllcnMtPmNvbW1p
dE9uV2ViS2l0VGhyZWFkKGN1cnJlbnRTY2FsZSgpKTsKKyAgICB1cGRhdGVEZWxlZ2F0ZWRPdmVy
bGF5cygpOworCisgICAgLy8gU3Rhc2ggdGhlIHZpc2libGUgY29udGVudCByZWN0IGFjY29yZGlu
ZyB0byB3ZWJraXQgdGhyZWFkCisgICAgLy8gVGhpcyBpcyB0aGUgcmVjdGFuZ2xlIHVzZWQgdG8g
bGF5b3V0IGZpeGVkIHBvc2l0aW9uZWQgZWxlbWVudHMsCisgICAgLy8gYW5kIHRoYXQncyB3aGF0
IHRoZSBsYXllciByZW5kZXJlciB3YW50cy4KKyAgICBJbnRSZWN0IGxheW91dFJlY3RGb3JDb21w
b3NpdGluZyhzY3JvbGxQb3NpdGlvbigpLCBhY3R1YWxWaXNpYmxlU2l6ZSgpKTsKKyAgICBJbnRT
aXplIGNvbnRlbnRzU2l6ZUZvckNvbXBvc2l0aW5nID0gY29udGVudHNTaXplKCk7CisKKyAgICAv
LyBDb21taXQgY2hhbmdlcyBtYWRlIHRvIHRoZSBsYXllcnMgc3luY2hyb25vdXNseSB3aXRoIHRo
ZSBjb21wb3NpdGluZyB0aHJlYWQuCisgICAgUGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRN
ZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoU3luY01lc3NhZ2UoCisgICAgICAgIFBsYXRmb3JtOjpj
cmVhdGVNZXRob2RDYWxsTWVzc2FnZSgKKyAgICAgICAgICAgICZXZWJQYWdlUHJpdmF0ZTo6Y29t
bWl0Um9vdExheWVyLAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIGxheW91dFJlY3RG
b3JDb21wb3NpdGluZywKKyAgICAgICAgICAgIGNvbnRlbnRzU2l6ZUZvckNvbXBvc2l0aW5nKSk7
CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6cm9vdExheWVy
Q29tbWl0VGltZXJGaXJlZChUaW1lcjxXZWJQYWdlUHJpdmF0ZT4qKQoreworICAgIGlmIChtX3N1
c3BlbmRSb290TGF5ZXJDb21taXQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRoZSBjb21t
aXQgdGltZXIgbWF5IGhhdmUgZmlyZWQganVzdCBiZWZvcmUgdGhlIGxheW91dCB0aW1lciwgb3Ig
Zm9yIHNvbWUKKyAgICAvLyBvdGhlciByZWFzb24gd2UgbmVlZCBsYXlvdXQuIEl0J3Mgbm90IGFs
bG93ZWQgdG8gY29tbWl0IHdoZW4gYSBsYXlvdXQgaXMKKyAgICAvLyBwZW5kaW5nLCBiZWNhdWVz
IGEgY29tbWl0IGNhbiBjYXVzZSBwYXJ0cyBvZiB0aGUgd2ViIHBhZ2UgdG8gYmUgcmVuZGVyZWQK
KyAgICAvLyB0byB0ZXh0dXJlLgorICAgIC8vIFRoZSBsYXlvdXQgY2FuIGFsc28gdHVybiBvZiBj
b21wb3NpdGluZyBhbHRvZ2V0aGVyLCBzbyB3ZSBuZWVkIHRvIGJlIHByZXBhcmVkCisgICAgLy8g
dG8gaGFuZGxlIGEgb25lIHNob3QgZHJhd2luZyBzeW5jaHJvbml6YXRpb24gYWZ0ZXIgdGhlIGxh
eW91dC4KKyAgICByZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKTsKKworICAgIGJvb2wgaXNTaW5nbGVU
YXJnZXRXaW5kb3cgPSBTdXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+Y29tcG9zaXRp
bmdTdXJmYWNlKCkKKyAgICAgICAgfHwgbV9jbGllbnQtPndpbmRvdygpLT53aW5kb3dVc2FnZSgp
ID09IFBsYXRmb3JtOjpHcmFwaGljczo6V2luZG93OjpHTEVTMlVzYWdlOworCisgICAgLy8gSWYg
d2UgYXJlIGRvaW5nIGRpcmVjdCByZW5kZXJpbmcgYW5kIGhhdmUgYSBzaW5nbGUgcmVuZGVyaW5n
IHRhcmdldCwKKyAgICAvLyBjb21taXR0aW5nIGlzIGVxdWl2YWxlbnQgdG8gYSBvbmUgc2hvdCBk
cmF3aW5nIHN5bmNocm9uaXphdGlvbi4KKyAgICAvLyBXZSBuZWVkIHRvIHJlLXJlbmRlciB0aGUg
d2ViIHBhZ2UsIHJlLXJlbmRlciB0aGUgbGF5ZXJzLCBhbmQKKyAgICAvLyB0aGVuIGJsaXQgdGhl
bSBvbiB0b3Agb2YgdGhlIHJlLXJlbmRlcmVkIHdlYiBwYWdlLgorICAgIGlmIChpc1NpbmdsZVRh
cmdldFdpbmRvdyAmJiBtX2JhY2tpbmdTdG9yZS0+ZC0+c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9X
aW5kb3coKSkKKyAgICAgICAgc2V0TmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigp
OworCisgICAgaWYgKG5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKSkgeworICAg
ICAgICBjb25zdCBJbnRSZWN0IHdpbmRvd1JlY3QgPSBJbnRSZWN0KEludFBvaW50KDAsIDApLCB2
aWV3cG9ydFNpemUoKSk7CisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXBhaW50KHdpbmRv
d1JlY3QsIHRydWUgLypjb250ZW50Q2hhbmdlZCovLCB0cnVlIC8qaW1tZWRpYXRlKi8pOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgdGhlIHdlYiBwYWdlIG5lZWRzIGxheW91
dCwgdGhlIGNvbW1pdCB3aWxsIGZhaWwuCisgICAgLy8gTm8gbmVlZCB0byBkcmF3IHRoZSBsYXll
cnMgaWYgbm90aGluZyBjaGFuZ2VkLgorICAgIGlmIChjb21taXRSb290TGF5ZXJJZk5lZWRlZCgp
KQorICAgICAgICBkcmF3TGF5ZXJzT25Db21taXQoKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0
ZTo6c2V0SXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nQWN0aXZlKGJvb2wgYWN0aXZlKQoreworICAg
IC8vIEJhY2tpbmcgc3RvcmUgY2FuIGJlIG51bGwgaGVyZSBiZWNhdXNlIGl0IGhhcHBlbnMgZHVy
aW5nIHRlYXJkb3duLgorICAgIGlmIChtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGluZ0FjdGl2ZSA9
PSBhY3RpdmUgfHwgIW1fYmFja2luZ1N0b3JlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2lz
QWNjZWxlcmF0ZWRDb21wb3NpdGluZ0FjdGl2ZSA9IGFjdGl2ZTsKKworICAgIGlmICghYWN0aXZl
KSB7CisgICAgICAgIG1fY29tcG9zaXRvci5jbGVhcigpOworICAgICAgICByZXNldENvbXBvc2l0
aW5nU3VyZmFjZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtX2NvbXBv
c2l0b3IpIHsKKyAgICAgICAgbV9jb21wb3NpdG9yID0gYWRvcHRQdHIobmV3IFdlYlBhZ2VDb21w
b3NpdG9yKHRoaXMpKTsKKyAgICAgICAgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmdBY3RpdmUg
PSBtX2NvbXBvc2l0b3ItPmhhcmR3YXJlQ29tcG9zaXRpbmcoKTsKKyAgICAgICAgaWYgKCFtX2lz
QWNjZWxlcmF0ZWRDb21wb3NpdGluZ0FjdGl2ZSkKKyAgICAgICAgICAgIG1fY29tcG9zaXRvci5j
bGVhcigpOworICAgIH0KK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6cmVzZXRDb21wb3NpdGlu
Z1N1cmZhY2UoKQoreworICAgIGlmICghUGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNz
YWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKSB7CisgICAgICAgIFBsYXRmb3JtOjp1c2Vy
SW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5kaXNwYXRjaE1lc3NhZ2UoCisgICAgICAg
ICAgICBQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoCisgICAgICAgICAgICAgICAg
JldlYlBhZ2VQcml2YXRlOjpyZXNldENvbXBvc2l0aW5nU3VyZmFjZSwgdGhpcykpOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1fY29tcG9zaXRvcikKKyAgICAgICAgbV9jb21w
b3NpdG9yLT5zZXRMYXN0Q29tcG9zaXRpbmdSZXN1bHRzKExheWVyUmVuZGVyaW5nUmVzdWx0cygp
KTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0Um9vdExheWVyV2ViS2l0VGhyZWFkKEZy
YW1lKiBmcmFtZSwgTGF5ZXJXZWJLaXRUaHJlYWQqIGxheWVyKQoreworICAgIC8vIFRoaXMgbWV0
aG9kIHVwZGF0ZXMgdGhlIEZyYW1lTGF5ZXJzIGJhc2VkIG9uIGlucHV0IGZyb20gV2ViQ29yZS4K
KyAgICAvLyBGcmFtZUxheWVycyBrZWVwcyB0cmFjayBvZiB0aGUgbGF5ZXIgcHJveGllcyBhdHRh
Y2hlZCB0byBmcmFtZXMuCisgICAgLy8gV2Ugd2lsbCBoYXZlIHRvIGNvbXB1dGUgYSBuZXcgcm9v
dCBsYXllciBhbmQgdXBkYXRlIHRoZSBjb21wb3NpdG9yLgorICAgIGlmICghbGF5ZXIgJiYgIW1f
ZnJhbWVMYXllcnMpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghbGF5ZXIpIHsKKyAgICAg
ICAgIEFTU0VSVChtX2ZyYW1lTGF5ZXJzKTsKKyAgICAgICAgIG1fZnJhbWVMYXllcnMtPnJlbW92
ZUxheWVyQnlGcmFtZShmcmFtZSk7CisgICAgICAgICBpZiAoIW1fZnJhbWVMYXllcnMtPmhhc0xh
eWVyKCkpCisgICAgICAgICAgICAgbV9mcmFtZUxheWVycy5jbGVhcigpOworICAgIH0gZWxzZSB7
CisgICAgICAgIGlmICghbV9mcmFtZUxheWVycykKKyAgICAgICAgICAgIG1fZnJhbWVMYXllcnMg
PSBhZG9wdFB0cihuZXcgRnJhbWVMYXllcnModGhpcykpOworCisgICAgICAgIGlmICghbV9mcmFt
ZUxheWVycy0+Y29udGFpbnNMYXllckZvckZyYW1lKGZyYW1lKSkKKyAgICAgICAgICAgIG1fZnJh
bWVMYXllcnMtPmFkZExheWVyKGZyYW1lLCBsYXllcik7CisKKyAgICAgICAgQVNTRVJUKG1fZnJh
bWVMYXllcnMpOworICAgIH0KKworICAgIExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIHJvb3RMYXll
ckNvbXBvc2l0aW5nVGhyZWFkID0gMDsKKyAgICBpZiAobV9mcmFtZUxheWVycyAmJiBtX2ZyYW1l
TGF5ZXJzLT5yb290TGF5ZXIoKSkKKyAgICAgICAgcm9vdExheWVyQ29tcG9zaXRpbmdUaHJlYWQg
PSBtX2ZyYW1lTGF5ZXJzLT5yb290TGF5ZXIoKS0+bGF5ZXJDb21wb3NpdGluZ1RocmVhZCgpOwor
CisgICAgc2V0Um9vdExheWVyQ29tcG9zaXRpbmdUaHJlYWQocm9vdExheWVyQ29tcG9zaXRpbmdU
aHJlYWQpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXRSb290TGF5ZXJDb21wb3NpdGlu
Z1RocmVhZChMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBsYXllcikKK3sKKyAgICBpZiAoIVBsYXRm
b3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJlYWQo
KSkgeworICAgICAgICBQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQo
KS0+ZGlzcGF0Y2hTeW5jTWVzc2FnZSgKKyAgICAgICAgICAgIFBsYXRmb3JtOjpjcmVhdGVNZXRo
b2RDYWxsTWVzc2FnZSgmV2ViUGFnZVByaXZhdGU6OnNldFJvb3RMYXllckNvbXBvc2l0aW5nVGhy
ZWFkLCB0aGlzLCBsYXllcikpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRGVw
ZW5kaW5nIG9uIHdoZXRoZXIgd2UgaGF2ZSBhIHJvb3QgbGF5ZXIgb3Igbm90LAorICAgIC8vIHRo
aXMgbWV0aG9kIHdpbGwgdHVybiBvbiBvciBvZmYgYWNjZWxlcmF0ZWQgY29tcG9zaXRpbmcuCisg
ICAgaWYgKCFsYXllcikgeworICAgICAgICAgLy8gRG9uJ3QgQVNTRVJUKG1fY29tcG9zaXRvcikg
aGVyZSBiZWNhdXNlIHdlIG1heSBiZSBjYWxsZWQgaW4KKyAgICAgICAgIC8vIHRoZSBwcm9jZXNz
IG9mIGRlc3RydWN0aW9uIG9mIFdlYlBhZ2Ugd2hlcmUgd2UgaGF2ZSBhbHJlYWR5CisgICAgICAg
ICAvLyBjYWxsZWQgc3luY0Rlc3Ryb3lDb21wb3NpdG9yT25Db21wb3NpdGluZ1RocmVhZCgpIHRv
IGRlc3Ryb3kKKyAgICAgICAgIC8vIHRoZSBjb21wb3NpdG9yLgorICAgICAgICAgc2V0SXNBY2Nl
bGVyYXRlZENvbXBvc2l0aW5nQWN0aXZlKGZhbHNlKTsKKyAgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBpZiAoIW1fY29tcG9zaXRvcikKKyAgICAgICAgc2V0SXNBY2NlbGVyYXRlZENvbXBv
c2l0aW5nQWN0aXZlKHRydWUpOworCisgICAgLy8gRG9uJ3QgQVNTRVJUKG1fY29tcG9zaXRvcikg
aGVyZSBiZWNhdXNlIHNldElzQWNjZWxlcmF0ZWRDb21wb3NpdGluZ0FjdGl2ZSh0cnVlKQorICAg
IC8vIG1heSBub3QgdHVybiBhY2NlbGVyYXRlZCBjb21wb3NpdGluZyBvbiBzaW5jZSBtX2JhY2tp
bmdTdG9yZSBpcyAwLgorICAgIGlmIChtX2NvbXBvc2l0b3IpCisgICAgICAgIG1fY29tcG9zaXRv
ci0+c2V0Um9vdExheWVyKGxheWVyKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6ZGVzdHJv
eUNvbXBvc2l0b3IoKQoreworICAgICBtX2NvbXBvc2l0b3IuY2xlYXIoKTsKK30KKwordm9pZCBX
ZWJQYWdlUHJpdmF0ZTo6c3luY0Rlc3Ryb3lDb21wb3NpdG9yT25Db21wb3NpdGluZ1RocmVhZCgp
Cit7CisgICAgaWYgKCFtX2NvbXBvc2l0b3IpCisgICAgICAgIHJldHVybjsKKworICAgIFBsYXRm
b3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5kaXNwYXRjaFN5bmNNZXNz
YWdlKAorICAgICAgICBQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoCisgICAgICAg
ICAgICAmV2ViUGFnZVByaXZhdGU6OmRlc3Ryb3lDb21wb3NpdG9yLCB0aGlzKSk7Cit9CisKK3Zv
aWQgV2ViUGFnZVByaXZhdGU6OmRlc3Ryb3lMYXllclJlc291cmNlcygpCit7CisgICAgIG1fY29t
cG9zaXRvci0+cmVsZWFzZUxheWVyUmVzb3VyY2VzKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZh
dGU6OnN1c3BlbmRSb290TGF5ZXJDb21taXQoKQoreworICAgIGlmIChtX3N1c3BlbmRSb290TGF5
ZXJDb21taXQpCisgICAgICAgIHJldHVybjsKKworICAgIG1fc3VzcGVuZFJvb3RMYXllckNvbW1p
dCA9IHRydWU7CisKKyAgICBpZiAoIW1fZnJhbWVMYXllcnMgfHwgIW1fZnJhbWVMYXllcnMtPmhh
c0xheWVyKCkgfHwgIW1fY29tcG9zaXRvcikKKyAgICAgICAgcmV0dXJuOworCisgICAgUGxhdGZv
cm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoU3luY01lc3Nh
Z2UoCisgICAgICAgIFBsYXRmb3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSgmV2ViUGFnZVBy
aXZhdGU6OmRlc3Ryb3lMYXllclJlc291cmNlcywgdGhpcykpOworfQorCit2b2lkIFdlYlBhZ2VQ
cml2YXRlOjpyZXN1bWVSb290TGF5ZXJDb21taXQoKQoreworICAgIGlmICghbV9zdXNwZW5kUm9v
dExheWVyQ29tbWl0KQorICAgICAgICByZXR1cm47CisKKyAgICBtX3N1c3BlbmRSb290TGF5ZXJD
b21taXQgPSBmYWxzZTsKKyAgICBtX25lZWRzQ29tbWl0ID0gdHJ1ZTsKKworICAgIC8vIFJlY3Jl
YXRlIGxheWVyIHJlc291cmNlcyBpZiBuZWVkZWQuCisgICAgY29tbWl0Um9vdExheWVySWZOZWVk
ZWQoKTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6bmVlZHNPbmVTaG90RHJhd2luZ1N5bmNo
cm9uaXphdGlvbigpCit7CisgICAgcmV0dXJuIG1fbmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9u
aXphdGlvbjsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0TmVlZHNPbmVTaG90RHJhd2lu
Z1N5bmNocm9uaXphdGlvbigpCit7CisgICAgLy8gVGhpcyBtZWFucyB3ZSBoYXZlIHRvIGNvbW1p
dCBsYXllcnMgb24gbmV4dCByZW5kZXIsIG9yIHJlbmRlciBvbiB0aGUgbmV4dCBjb21taXQsCisg
ICAgLy8gd2hpY2hldmVyIGhhcHBlbnMgZmlyc3QuCisgICAgbV9uZWVkc0NvbW1pdCA9IHRydWU7
CisgICAgbV9uZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0aW9uID0gdHJ1ZTsKK30KKyNl
bmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKK3ZvaWQgV2ViUGFnZVByaXZh
dGU6OmVudGVyRnVsbHNjcmVlbkZvck5vZGUoTm9kZSogbm9kZSkKK3sKKyNpZiBFTkFCTEUoVklE
RU8pCisgICAgaWYgKCFub2RlIHx8ICFub2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6dmlkZW9U
YWcpKQorICAgICAgICByZXR1cm47CisKKyAgICBNZWRpYVBsYXllciogcGxheWVyID0gc3RhdGlj
X2Nhc3Q8SFRNTE1lZGlhRWxlbWVudCo+KG5vZGUpLT5wbGF5ZXIoKTsKKyAgICBpZiAoIXBsYXll
cikKKyAgICAgICAgcmV0dXJuOworCisgICAgTWVkaWFQbGF5ZXJQcml2YXRlKiBtbXJQbGF5ZXIg
PSBzdGF0aWNfY2FzdDxNZWRpYVBsYXllclByaXZhdGUqPihwbGF5ZXItPmltcGxlbWVudGF0aW9u
KCkpOworICAgIGlmICghbW1yUGxheWVyKQorICAgICAgICByZXR1cm47CisKKyAgICBQbGF0Zm9y
bTo6R3JhcGhpY3M6OldpbmRvdyogd2luZG93ID0gbW1yUGxheWVyLT53aW5kb3dHZXQoKTsKKyAg
ICBpZiAoIXdpbmRvdykKKyAgICAgICAgcmV0dXJuOworCisgICAgdW5zaWduZWQgeCwgeSwgd2lk
dGgsIGhlaWdodDsKKyAgICBtbXJQbGF5ZXItPndpbmRvd1Bvc2l0aW9uR2V0KHgsIHksIHdpZHRo
LCBoZWlnaHQpOworCisgICAgY29uc3QgY2hhciogY29udGV4dE5hbWUgPSBtbXJQbGF5ZXItPm1t
ckNvbnRleHROYW1lR2V0KCk7CisgICAgaWYgKCFjb250ZXh0TmFtZSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgbW1yUGxheWVyLT5zZXRGdWxsc2NyZWVuV2ViUGFnZUNsaWVudChtX2NsaWVudCk7
CisgICAgbV9mdWxsc2NyZWVuVmlkZW9Ob2RlID0gbm9kZTsKKyAgICBtX2NsaWVudC0+ZnVsbHNj
cmVlblN0YXJ0KGNvbnRleHROYW1lLCB3aW5kb3csIHgsIHksIHdpZHRoLCBoZWlnaHQpOworI2Vu
ZGlmCit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmV4aXRGdWxsc2NyZWVuRm9yTm9kZShOb2Rl
KiBub2RlKQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBpZiAobV9mdWxsc2NyZWVuVmlkZW9O
b2RlLmdldCgpKSB7CisgICAgICAgIG1fY2xpZW50LT5mdWxsc2NyZWVuU3RvcCgpOworICAgICAg
ICBtX2Z1bGxzY3JlZW5WaWRlb05vZGUgPSAwOworICAgIH0KKworICAgIGlmICghbm9kZSB8fCAh
bm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OnZpZGVvVGFnKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgTWVkaWFQbGF5ZXIqIHBsYXllciA9IHN0YXRpY19jYXN0PEhUTUxNZWRpYUVsZW1lbnQq
Pihub2RlKS0+cGxheWVyKCk7CisgICAgaWYgKCFwbGF5ZXIpCisgICAgICAgIHJldHVybjsKKwor
ICAgIE1lZGlhUGxheWVyUHJpdmF0ZSogbW1yUGxheWVyID0gc3RhdGljX2Nhc3Q8TWVkaWFQbGF5
ZXJQcml2YXRlKj4ocGxheWVyLT5pbXBsZW1lbnRhdGlvbigpKTsKKyAgICBpZiAoIW1tclBsYXll
cikKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRnVsbHNjcmVlbiBtb2RlIGlzIGJlaW5nIHR1
cm5lZCBvZmYsIHNvIE1lZGlhUGxheWVyUHJpdmF0ZSBubyBsb25nZXIgbmVlZHMgdGhlIHBvaW50
ZXIuCisgICAgbW1yUGxheWVyLT5zZXRGdWxsc2NyZWVuV2ViUGFnZUNsaWVudCgwKTsKKyNlbmRp
ZgorfQorCisvLyBNQVJLOiBXZWJTZXR0aW5nc0RlbGVnYXRlLgorCit2b2lkIFdlYlBhZ2VQcml2
YXRlOjpkaWRDaGFuZ2VTZXR0aW5ncyhXZWJTZXR0aW5ncyogd2ViU2V0dGluZ3MpCit7CisgICAg
U2V0dGluZ3MqIGNvcmVTZXR0aW5ncyA9IG1fcGFnZS0+c2V0dGluZ3MoKTsKKyAgICBtX3BhZ2Ut
PnNldEdyb3VwTmFtZSh3ZWJTZXR0aW5ncy0+cGFnZUdyb3VwTmFtZSgpKTsKKyAgICBjb3JlU2V0
dGluZ3MtPnNldFhTU0F1ZGl0b3JFbmFibGVkKHdlYlNldHRpbmdzLT54c3NBdWRpdG9yRW5hYmxl
ZCgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldExvYWRzSW1hZ2VzQXV0b21hdGljYWxseSh3ZWJT
ZXR0aW5ncy0+bG9hZHNJbWFnZXNBdXRvbWF0aWNhbGx5KCkpOworICAgIGNvcmVTZXR0aW5ncy0+
c2V0U2hvdWxkRHJhd0JvcmRlcldoaWxlTG9hZGluZ0ltYWdlcyh3ZWJTZXR0aW5ncy0+c2hvdWxk
RHJhd0JvcmRlcldoaWxlTG9hZGluZ0ltYWdlcygpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldFNj
cmlwdEVuYWJsZWQod2ViU2V0dGluZ3MtPmlzSmF2YVNjcmlwdEVuYWJsZWQoKSk7CisgICAgY29y
ZVNldHRpbmdzLT5zZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKHdlYlNldHRpbmdzLT5pc1ByaXZh
dGVCcm93c2luZ0VuYWJsZWQoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXREZWZhdWx0Rml4ZWRG
b250U2l6ZSh3ZWJTZXR0aW5ncy0+ZGVmYXVsdEZpeGVkRm9udFNpemUoKSk7CisgICAgY29yZVNl
dHRpbmdzLT5zZXREZWZhdWx0Rm9udFNpemUod2ViU2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgp
KTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldE1pbmltdW1Gb250U2l6ZSh3ZWJTZXR0aW5ncy0+bWlu
aW11bUZvbnRTaXplKCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0U2VyaWZGb250RmFtaWx5KHdl
YlNldHRpbmdzLT5zZXJpZkZvbnRGYW1pbHkoKS5pbXBsKCkpOworICAgIGNvcmVTZXR0aW5ncy0+
c2V0Rml4ZWRGb250RmFtaWx5KHdlYlNldHRpbmdzLT5maXhlZEZvbnRGYW1pbHkoKS5pbXBsKCkp
OworICAgIGNvcmVTZXR0aW5ncy0+c2V0U2Fuc1NlcmlmRm9udEZhbWlseSh3ZWJTZXR0aW5ncy0+
c2Fuc1NlcmlmRm9udEZhbWlseSgpLmltcGwoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXRTdGFu
ZGFyZEZvbnRGYW1pbHkod2ViU2V0dGluZ3MtPnN0YW5kYXJkRm9udEZhbWlseSgpLmltcGwoKSk7
CisgICAgY29yZVNldHRpbmdzLT5zZXRKYXZhU2NyaXB0Q2FuT3BlbldpbmRvd3NBdXRvbWF0aWNh
bGx5KHdlYlNldHRpbmdzLT5jYW5KYXZhU2NyaXB0T3BlbldpbmRvd3NBdXRvbWF0aWNhbGx5KCkp
OworICAgIGNvcmVTZXR0aW5ncy0+c2V0QWxsb3dTY3JpcHRzVG9DbG9zZVdpbmRvd3Mod2ViU2V0
dGluZ3MtPmNhbkphdmFTY3JpcHRPcGVuV2luZG93c0F1dG9tYXRpY2FsbHkoKSk7IC8vIFdoeSBh
cmUgd2UgdXNpbmcgdGhlIHNhbWUgdmFsdWUgYXMgc2V0SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dz
QXV0b21hdGljYWxseSgpPworICAgIGNvcmVTZXR0aW5ncy0+c2V0UGx1Z2luc0VuYWJsZWQod2Vi
U2V0dGluZ3MtPmFyZVBsdWdpbnNFbmFibGVkKCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0RGVm
YXVsdFRleHRFbmNvZGluZ05hbWUod2ViU2V0dGluZ3MtPmRlZmF1bHRUZXh0RW5jb2RpbmdOYW1l
KCkuaW1wbCgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldERvd25sb2FkYWJsZUJpbmFyeUZvbnRz
RW5hYmxlZCh3ZWJTZXR0aW5ncy0+ZG93bmxvYWRhYmxlQmluYXJ5Rm9udHNFbmFibGVkKCkpOwor
ICAgIGNvcmVTZXR0aW5ncy0+c2V0U3BhdGlhbE5hdmlnYXRpb25FbmFibGVkKG1fd2ViU2V0dGlu
Z3MtPmlzU3BhdGlhbE5hdmlnYXRpb25FbmFibGVkKCkpOworCisgICAgLy8gVXNlclNjYWxhYmxl
IHNob3VsZCBiZSByZXNldCBieSBuZXcgc2V0dGluZ3MuCisgICAgc2V0VXNlclNjYWxhYmxlKHdl
YlNldHRpbmdzLT5pc1VzZXJTY2FsYWJsZSgpKTsKKworICAgIFdlYlN0cmluZyBzdHlsZXNoZWV0
VVJMID0gd2ViU2V0dGluZ3MtPnVzZXJTdHlsZVNoZWV0U3RyaW5nKCk7CisgICAgaWYgKHN0eWxl
c2hlZXRVUkwuaXNFbXB0eSgpKQorICAgICAgICBzdHlsZXNoZWV0VVJMID0gd2ViU2V0dGluZ3Mt
PnVzZXJTdHlsZVNoZWV0TG9jYXRpb24oKTsKKyAgICBpZiAoIXN0eWxlc2hlZXRVUkwuaXNFbXB0
eSgpKQorICAgICAgICBjb3JlU2V0dGluZ3MtPnNldFVzZXJTdHlsZVNoZWV0TG9jYXRpb24oS1VS
TChLVVJMKCksIHN0eWxlc2hlZXRVUkwpKTsKKworICAgIGNvcmVTZXR0aW5ncy0+c2V0Rmlyc3RT
Y2hlZHVsZWRMYXlvdXREZWxheSh3ZWJTZXR0aW5ncy0+Zmlyc3RTY2hlZHVsZWRMYXlvdXREZWxh
eSgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldFVzZUNhY2hlKHdlYlNldHRpbmdzLT51c2VXZWJL
aXRDYWNoZSgpKTsKKworI2lmIEVOQUJMRShTUUxfREFUQUJBU0UpCisgICAgLy8gRGF0YWJhc2VU
cmFja2VyIGNhbiBvbmx5IGJlIGluaXRpYWxpemVkIGZvciBvbmNlLCBzbyBpdCBkb2Vzbid0Cisg
ICAgLy8gbWFrZSBzZW5zZSB0byBjaGFuZ2UgZGF0YWJhc2UgcGF0aCBhZnRlciBEYXRhYmFzZVRy
YWNrZXIgaGFzCisgICAgLy8gYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorICAgIHN0YXRpYyBi
b29sIGRiaW5pdCA9IGZhbHNlOworICAgIGlmICghZGJpbml0ICYmICF3ZWJTZXR0aW5ncy0+ZGF0
YWJhc2VQYXRoKCkuaXNFbXB0eSgpKSB7CisgICAgICAgIGRiaW5pdCA9IHRydWU7CisgICAgICAg
IERhdGFiYXNlVHJhY2tlcjo6aW5pdGlhbGl6ZVRyYWNrZXIod2ViU2V0dGluZ3MtPmRhdGFiYXNl
UGF0aCgpKTsKKyAgICB9CisKKyAgICAvLyBUaGUgZGlyZWN0b3J5IG9mIGNhY2hlU3RvcmFnZSBm
b3Igb25lIHBhZ2UgZ3JvdXAgY2FuIG9ubHkgYmUgaW5pdGlhbGl6ZWQgb25jZS4KKyAgICBzdGF0
aWMgYm9vbCBhY2luaXQgPSBmYWxzZTsKKyAgICBpZiAoIWFjaW5pdCAmJiAhd2ViU2V0dGluZ3Mt
PmFwcENhY2hlUGF0aCgpLmlzRW1wdHkoKSkgeworICAgICAgICBhY2luaXQgPSB0cnVlOworICAg
ICAgICBjYWNoZVN0b3JhZ2UoKS5zZXRDYWNoZURpcmVjdG9yeSh3ZWJTZXR0aW5ncy0+YXBwQ2Fj
aGVQYXRoKCkpOworICAgIH0KKworICAgIGNvcmVTZXR0aW5ncy0+c2V0TG9jYWxTdG9yYWdlRGF0
YWJhc2VQYXRoKHdlYlNldHRpbmdzLT5sb2NhbFN0b3JhZ2VQYXRoKCkpOworICAgIERhdGFiYXNl
OjpzZXRJc0F2YWlsYWJsZSh3ZWJTZXR0aW5ncy0+aXNEYXRhYmFzZXNFbmFibGVkKCkpOworICAg
IERhdGFiYXNlU3luYzo6c2V0SXNBdmFpbGFibGUod2ViU2V0dGluZ3MtPmlzRGF0YWJhc2VzRW5h
YmxlZCgpKTsKKworICAgIGNvcmVTZXR0aW5ncy0+c2V0TG9jYWxTdG9yYWdlRW5hYmxlZCh3ZWJT
ZXR0aW5ncy0+aXNMb2NhbFN0b3JhZ2VFbmFibGVkKCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0
T2ZmbGluZVdlYkFwcGxpY2F0aW9uQ2FjaGVFbmFibGVkKHdlYlNldHRpbmdzLT5pc0FwcENhY2hl
RW5hYmxlZCgpKTsKKworICAgIG1fcGFnZS0+Z3JvdXAoKS5ncm91cFNldHRpbmdzKCktPnNldExv
Y2FsU3RvcmFnZVF1b3RhQnl0ZXMod2ViU2V0dGluZ3MtPmxvY2FsU3RvcmFnZVF1b3RhKCkpOwor
ICAgIGNvcmVTZXR0aW5ncy0+c2V0VXNlc1BhZ2VDYWNoZSh3ZWJTZXR0aW5ncy0+bWF4aW11bVBh
Z2VzSW5DYWNoZSgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldEZyYW1lRmxhdHRlbmluZ0VuYWJs
ZWQod2ViU2V0dGluZ3MtPmlzRnJhbWVGbGF0dGVuaW5nRW5hYmxlZCgpKTsKKyNlbmRpZgorCisj
aWYgRU5BQkxFKFdFQl9TT0NLRVRTKQorICAgIFdlYlNvY2tldDo6c2V0SXNBdmFpbGFibGUod2Vi
U2V0dGluZ3MtPmFyZVdlYlNvY2tldHNFbmFibGVkKCkpOworI2VuZGlmCisKKyNpZiBFTkFCTEUo
VklFV1BPUlRfUkVGTE9XKQorICAgIGNvcmVTZXR0aW5ncy0+c2V0VGV4dFJlZmxvd0VuYWJsZWQo
d2ViU2V0dGluZ3MtPnRleHRSZWZsb3dNb2RlKCkgPT0gV2ViU2V0dGluZ3M6OlRleHRSZWZsb3dF
bmFibGVkKTsKKyNlbmRpZgorCisgICAgLy8gRklYTUU6IFdlIGRvbid0IHdhbnQgSFRNTFRva2Vu
aXplciB0byB5aWVsZCBmb3IgYW55dGhpbmcgb3RoZXIgdGhhbiBlbWFpbCBjYXNlIGJlY2F1c2UK
KyAgICAvLyBjYWxsIHRvIGN1cnJlbnRUaW1lKCkgaXMgdG9vIGV4cGVuc2l2ZSBvbiBvdXIgcGxh
dGZvcm0uIFNlZSBSSU0gQnVnICM3NDYuCisgICAgY29yZVNldHRpbmdzLT5zZXRTaG91bGRVc2VG
aXJzdFNjaGVkdWxlZExheW91dERlbGF5KHdlYlNldHRpbmdzLT5pc0VtYWlsTW9kZSgpKTsKKyAg
ICBjb3JlU2V0dGluZ3MtPnNldFByb2Nlc3NIVFRQRXF1aXYoIXdlYlNldHRpbmdzLT5pc0VtYWls
TW9kZSgpKTsKKworICAgIGNvcmVTZXR0aW5ncy0+c2V0U2hvdWxkVXNlQ3Jvc3NPcmlnaW5Qcm90
b2NvbENoZWNrKCF3ZWJTZXR0aW5ncy0+YWxsb3dDcm9zc1NpdGVSZXF1ZXN0cygpKTsKKworICAg
IGNvb2tpZU1hbmFnZXIoKS5zZXRQcml2YXRlTW9kZSh3ZWJTZXR0aW5ncy0+aXNQcml2YXRlQnJv
d3NpbmdFbmFibGVkKCkpOworCisgICAgaWYgKG1fbWFpbkZyYW1lICYmIG1fbWFpbkZyYW1lLT52
aWV3KCkpIHsKKyAgICAgICAgQ29sb3IgYmFja2dyb3VuZENvbG9yKHdlYlNldHRpbmdzLT5iYWNr
Z3JvdW5kQ29sb3IoKSk7CisgICAgICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPnVwZGF0ZUJhY2tn
cm91bmRSZWN1cnNpdmVseShiYWNrZ3JvdW5kQ29sb3IsIGJhY2tncm91bmRDb2xvci5oYXNBbHBo
YSgpKTsKKyAgICB9Cit9CisKK0ludFNpemUgV2ViUGFnZVByaXZhdGU6OmRlZmF1bHRNYXhMYXlv
dXRTaXplKCkKK3sKKyAgICBzdGF0aWMgSW50U2l6ZSBzaXplOworCisgICAgaWYgKHNpemUuaXNF
bXB0eSgpKQorICAgICAgICBzaXplID0gSW50U2l6ZShzdGQ6Om1heCgxMDI0LCBQbGF0Zm9ybTo6
R3JhcGhpY3M6OlNjcmVlbjo6bGFuZHNjYXBlV2lkdGgoKSksCisgICAgICAgICAgICAgICAgICAg
ICAgIHN0ZDo6bWF4KDc2OCwgUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OmxhbmRzY2FwZUhl
aWdodCgpKSk7CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworV2ViU3RyaW5nIFdlYlBhZ2U6OnRl
eHRIYXNBdHRyaWJ1dGUoY29uc3QgV2ViU3RyaW5nJiBxdWVyeSkgY29uc3QKK3sKKyAgICBEb2N1
bWVudCogZG9jID0gZC0+bV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZy
YW1lKCktPmRvY3VtZW50KCk7CisgICAgaWYgKGRvYykKKyAgICAgICAgcmV0dXJuIGRvYy0+cXVl
cnlDb21tYW5kVmFsdWUocXVlcnkpOworICAgIHJldHVybiAiIjsKK30KKwordm9pZCBXZWJQYWdl
OjpzZXRKYXZhU2NyaXB0Q2FuQWNjZXNzQ2xpcGJvYXJkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBk
LT5tX3BhZ2UtPnNldHRpbmdzKCktPnNldEphdmFTY3JpcHRDYW5BY2Nlc3NDbGlwYm9hcmQoZW5h
YmxlZCk7Cit9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCit2b2lkIFdlYlBh
Z2VQcml2YXRlOjpibGl0VmlzaWJsZUNvbnRlbnRzKCkKK3sKKyAgICBpZiAobV9iYWNraW5nU3Rv
cmUtPmQtPnNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpCisgICAgICAgIHJldHVybjsK
KworICAgIG1fYmFja2luZ1N0b3JlLT5kLT5ibGl0VmlzaWJsZUNvbnRlbnRzKCk7Cit9CisjZW5k
aWYKKwordm9pZCBXZWJQYWdlOjpzZXRXZWJHTEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAg
IGlmICghUGxhdGZvcm06OklUUG9saWN5Ojppc1dlYkdMRW5hYmxlZCgpKSB7CisgICAgICAgIGQt
Pm1fcGFnZS0+c2V0dGluZ3MoKS0+c2V0V2ViR0xFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICBkLT5tX3BhZ2UtPnNldHRpbmdzKCktPnNldFdlYkdMRW5hYmxlZChl
bmFibGVkKTsKK30KKworYm9vbCBXZWJQYWdlOjppc1dlYkdMRW5hYmxlZCgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGQtPm1fcGFnZS0+c2V0dGluZ3MoKS0+d2ViR0xFbmFibGVkKCk7Cit9CisKK3Zv
aWQgV2ViUGFnZVByaXZhdGU6OnNldE5lZWRUb3VjaEV2ZW50cyhib29sIHZhbHVlKQoreworICAg
IG1fbmVlZFRvdWNoRXZlbnRzID0gdmFsdWU7Cit9CisKK30KK30KZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvV2ViUGFnZS5oIGIvU291cmNlL1dlYktpdC9ibGFja2Jl
cnJ5L0FwaS9XZWJQYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uN2I2Yzc2NDJiMjY5ZGUxYTYzNTg4OTEyMmYx
NjJkNGEzMzU3YTY5ZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJy
eS9BcGkvV2ViUGFnZS5oCkBAIC0wLDAgKzEsMzY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA5LCAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdh
cmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
IEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgV2ViUGFnZV9oCisj
ZGVmaW5lIFdlYlBhZ2VfaAorCisjaW5jbHVkZSAiQWN0aXZlTm9kZUNvbnRleHQuaCIKKyNpbmNs
dWRlICJCbGFja0JlcnJ5R2xvYmFsLmgiCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtR3Vh
cmRlZFBvaW50ZXIuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1JbnB1dEV2ZW50cy5o
PgorI2luY2x1ZGUgPGltZi9pbnB1dF9kYXRhLmg+CisjaW5jbHVkZSA8bmV0d29yay9OZXR3b3Jr
UmVxdWVzdC5oPgorCitzdHJ1Y3QgT3BhcXVlSlNDb250ZXh0OwordHlwZWRlZiBjb25zdCBzdHJ1
Y3QgT3BhcXVlSlNDb250ZXh0KiBKU0NvbnRleHRSZWY7CisKK3N0cnVjdCBPcGFxdWVKU1ZhbHVl
OwordHlwZWRlZiBjb25zdCBzdHJ1Y3QgT3BhcXVlSlNWYWx1ZSogSlNWYWx1ZVJlZjsKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgQ2hyb21lQ2xpZW50QmxhY2tCZXJyeTsKK2NsYXNzIEVk
aXRvckNsaWVudEJsYWNrQmVycnk7CitjbGFzcyBFbGVtZW50OworY2xhc3MgRnJhbWU7CitjbGFz
cyBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk7CitjbGFzcyBHZW9sb2NhdGlvbkNvbnRyb2xs
ZXJDbGllbnRCbGFja0JlcnJ5OworY2xhc3MgSWNvbkRhdGFiYXNlQ2xpZW50QmxhY2tCZXJyeTsK
K2NsYXNzIEluc3BlY3RvckNsaWVudEJsYWNrQmVycnk7CitjbGFzcyBKYXZhU2NyaXB0RGVidWdn
ZXJCbGFja0JlcnJ5OworY2xhc3MgTm9kZTsKK2NsYXNzIFJlbmRlck9iamVjdDsKK2NsYXNzIFZp
c2libGVTZWxlY3Rpb247Cit9CisKK2NsYXNzIFdlYkRPTURvY3VtZW50OworY2xhc3MgV2ViRE9N
Tm9kZTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFNoYXJlZEFycmF5OworCituYW1lc3Bh
Y2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2UgUGxhdGZvcm0geworY2xhc3MgSW50UG9pbnQ7Citj
bGFzcyBJbnRSZWN0OworY2xhc3MgSW50U2l6ZTsKK2NsYXNzIEtleWJvYXJkRXZlbnQ7CitjbGFz
cyBNb3VzZUV2ZW50OworY2xhc3MgVG91Y2hFdmVudDsKK2NsYXNzIFRvdWNoUG9pbnQ7Cit9CisK
K25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBCYWNraW5nU3RvcmU7CitjbGFzcyBCYWNraW5n
U3RvcmVDbGllbnQ7CitjbGFzcyBCYWNraW5nU3RvcmVQcml2YXRlOworY2xhc3MgRHVtcFJlbmRl
clRyZWVDbGllbnQ7CitjbGFzcyBSZW5kZXJRdWV1ZTsKK2NsYXNzIFdlYlBhZ2VDbGllbnQ7Citj
bGFzcyBXZWJQYWdlR3JvdXBMb2FkRGVmZXJyZXI7CitjbGFzcyBXZWJQYWdlUHJpdmF0ZTsKK2Ns
YXNzIFdlYlNldHRpbmdzOworCitlbnVtIEphdmFTY3JpcHREYXRhVHlwZSB7IEpTVW5kZWZpbmVk
ID0gMCwgSlNOdWxsLCBKU0Jvb2xlYW4sIEpTTnVtYmVyLCBKU1N0cmluZywgSlNPYmplY3QsIEpT
RXhjZXB0aW9uLCBKU0RhdGFUeXBlTWF4IH07CisKK2VudW0gQWN0aXZhdGlvblN0YXRlVHlwZSB7
IEFjdGl2YXRpb25BY3RpdmUsIEFjdGl2YXRpb25JbmFjdGl2ZSwgQWN0aXZhdGlvblN0YW5kYnkg
fTsKKworZW51bSBUYXJnZXREZXRlY3Rpb25TdHJhdGVneSB7UG9pbnRCYXNlZCwgUmVjdEJhc2Vk
fTsKKworY2xhc3MgQkxBQ0tCRVJSWV9FWFBPUlQgV2ViUGFnZSA6IHB1YmxpYyBQbGF0Zm9ybTo6
R3VhcmRlZFBvaW50ZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBXZWJQYWdlKFdlYlBhZ2VDbGllbnQq
LCBjb25zdCBXZWJTdHJpbmcmIHBhZ2VHcm91cE5hbWUsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
Jik7CisgICAgdm9pZCBkZXN0cm95KCk7CisKKyAgICBXZWJQYWdlQ2xpZW50KiBjbGllbnQoKSBj
b25zdDsKKworICAgIHZvaWQgbG9hZChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIqIG5ldHdv
cmtUb2tlbiwgYm9vbCBpc0luaXRpYWwgPSBmYWxzZSk7CisKKyAgICB2b2lkIGxvYWRFeHRlbmRl
ZChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIqIG5ldHdvcmtUb2tlbiwgY29uc3QgY2hhciog
bWV0aG9kLCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkNhY2hlUG9saWN5ID0gUGxhdGZvcm06
Ok5ldHdvcmtSZXF1ZXN0OjpVc2VQcm90b2NvbENhY2hlUG9saWN5LCBjb25zdCBjaGFyKiBkYXRh
ID0gMCwgc2l6ZV90IGRhdGFMZW5ndGggPSAwLCBjb25zdCBjaGFyKiBjb25zdCogaGVhZGVycyA9
IDAsIHNpemVfdCBoZWFkZXJzTGVuZ3RoID0gMCwgYm9vbCBtdXN0SGFuZGxlSW50ZXJuYWxseSA9
IGZhbHNlKTsKKworICAgIHZvaWQgbG9hZEZpbGUoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hh
ciogb3ZlcnJpZGVDb250ZW50VHlwZSA9ICIiKTsKKworICAgIHZvaWQgbG9hZFN0cmluZyhjb25z
dCBjaGFyKiBzdHJpbmcsIGNvbnN0IGNoYXIqIGJhc2VVUkwsIGNvbnN0IGNoYXIqIGNvbnRlbnRU
eXBlID0gInRleHQvaHRtbCIsIGNvbnN0IGNoYXIqIGZhaWxpbmdVUkwgPSAwKTsKKworICAgIHZv
aWQgZG93bmxvYWQoY29uc3QgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0Jik7CisKKyAgICBib29s
IGV4ZWN1dGVKYXZhU2NyaXB0KGNvbnN0IGNoYXIqIHNjcmlwdCwgSmF2YVNjcmlwdERhdGFUeXBl
JiByZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKTsKKworICAgIC8vIFRoaXMgd2ls
bCBleGVjdXRlIHRoZSBzY3JpcHQgZXZlbiBpZiBpbi1wYWdlIEphdmFTY3JpcHQgaXMgZGlzYWJs
ZWQuCisgICAgYm9vbCBleGVjdXRlSmF2YVNjcmlwdEluSXNvbGF0ZWRXb3JsZChjb25zdCBjaGFy
KiBzY3JpcHQsIEphdmFTY3JpcHREYXRhVHlwZSYgcmV0dXJuVHlwZSwgV2ViU3RyaW5nJiByZXR1
cm5WYWx1ZSk7CisKKyAgICAvLyBUYWtlcyBhIFVURjE2IGVuY29kZWQgc2NyaXB0IHRoYXQgaXMg
dXNlZCBleHBsaWNpdGx5IGJ5IHRoZSBwYXR0ZXJuIG1hdGNoaW5nIGNvZGUKKyAgICBib29sIGV4
ZWN1dGVKYXZhU2NyaXB0SW5Jc29sYXRlZFdvcmxkKGNvbnN0IHN0ZDo6d3N0cmluZyYgc2NyaXB0
LCBKYXZhU2NyaXB0RGF0YVR5cGUmIHJldHVyblR5cGUsIFdlYlN0cmluZyYgcmV0dXJuVmFsdWUp
OworCisgICAgdm9pZCBpbml0aWFsaXplSWNvbkRhdGFCYXNlKCk7CisKKyAgICB2b2lkIHN0b3BM
b2FkaW5nKCk7CisKKyAgICAvLyBUaGlzIHdpbGwgZm9yY2UgYW55IHVubG9hZCBoYW5kbGVycyB0
byBydW4uCisgICAgdm9pZCBwcmVwYXJlVG9EZXN0cm95KCk7CisKKyAgICB2b2lkIHJlbG9hZCgp
OworICAgIHZvaWQgcmVsb2FkRnJvbUNhY2hlKCk7CisKKyAgICBXZWJTZXR0aW5ncyogc2V0dGlu
Z3MoKSBjb25zdDsKKworICAgIHZvaWQgc2V0VmlzaWJsZShib29sKTsKKyAgICBib29sIGlzVmlz
aWJsZSgpIGNvbnN0OworCisgICAgdm9pZCBzZXRTY3JlZW5PcmllbnRhdGlvbihpbnQpOworICAg
IHZvaWQgYXBwbHlQZW5kaW5nT3JpZW50YXRpb25JZk5lZWRlZCgpOworCisgICAgUGxhdGZvcm06
OkludFNpemUgdmlld3BvcnRTaXplKCkgY29uc3Q7CisgICAgdm9pZCBzZXRWaWV3cG9ydFNpemUo
Y29uc3QgUGxhdGZvcm06OkludFNpemUmIHZpZXdwb3J0U2l6ZSwgYm9vbCBlbnN1cmVGb2N1c0Vs
ZW1lbnRWaXNpYmxlID0gdHJ1ZSk7CisKKyAgICB2b2lkIHJlc2V0VmlydHVhbFZpZXdwb3J0T25D
b21taXR0ZWQoYm9vbCByZXNldCk7CisgICAgdm9pZCBzZXRWaXJ0dWFsVmlld3BvcnRTaXplKGlu
dCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyAgICAvLyBVc2VkIGZvciBkZWZhdWx0IGxheW91dCBz
aXplIHVubGVzcyBvdmVycmlkZGVuIGJ5IHdlYiBjb250ZW50IG9yIGJ5IG90aGVyIEFQSXMuCisg
ICAgdm9pZCBzZXREZWZhdWx0TGF5b3V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisg
ICAgYm9vbCBtb3VzZUV2ZW50KGNvbnN0IFBsYXRmb3JtOjpNb3VzZUV2ZW50JiwgYm9vbCogd2hl
ZWxEZWx0YUFjY2VwdGVkID0gMCk7CisKKyAgICAvLyBIYW5kbGVzIG5hdGl2ZSBqYXZhc2NyaXB0
IHRvdWNoIGV2ZW50cy4KKyAgICBib29sIHRvdWNoRXZlbnQoY29uc3QgUGxhdGZvcm06OlRvdWNo
RXZlbnQmKTsKKworICAgIC8vIEZvciBjb252ZXJzaW9uIHRvIG1vdXNlIGV2ZW50cy4KKyAgICB2
b2lkIHRvdWNoRXZlbnRDYW5jZWwoKTsKKyAgICB2b2lkIHRvdWNoRXZlbnRDYW5jZWxBbmRDbGVh
ckZvY3VzZWROb2RlKCk7CisgICAgYm9vbCB0b3VjaFBvaW50QXNNb3VzZUV2ZW50KGNvbnN0IFBs
YXRmb3JtOjpUb3VjaFBvaW50Jik7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGtleSBz
dHJva2Ugd2FzIGhhbmRsZWQgYnkgV2ViS2l0LgorICAgIGJvb2wga2V5RXZlbnQoY29uc3QgUGxh
dGZvcm06OktleWJvYXJkRXZlbnQmKTsKKworICAgIHZvaWQgbmF2aWdhdGlvbk1vdmVFdmVudChj
b25zdCB1bnNpZ25lZCBzaG9ydCBjaGFyYWN0ZXIsIGJvb2wgc2hpZnREb3duLCBib29sIGFsdERv
d24pOworCisgICAgV2ViU3RyaW5nIHRpdGxlKCkgY29uc3Q7CisgICAgV2ViU3RyaW5nIHNlbGVj
dGVkVGV4dCgpIGNvbnN0OworICAgIFdlYlN0cmluZyBjdXRTZWxlY3RlZFRleHQoKTsKKyAgICB2
b2lkIGluc2VydFRleHQoY29uc3QgV2ViU3RyaW5nJik7CisgICAgdm9pZCBjbGVhckN1cnJlbnRJ
bnB1dEZpZWxkKCk7CisKKyAgICB2b2lkIGN1dCgpOworICAgIHZvaWQgY29weSgpOworICAgIHZv
aWQgcGFzdGUoKTsKKworICAgIC8vIFRleHQgZW5jb2RpbmcuCisgICAgV2ViU3RyaW5nIHRleHRF
bmNvZGluZygpOworICAgIFdlYlN0cmluZyBmb3JjZWRUZXh0RW5jb2RpbmcoKTsKKyAgICB2b2lk
IHNldEZvcmNlZFRleHRFbmNvZGluZyhjb25zdCBjaGFyKik7CisKKyAgICAvLyBTY3JvbGwgcG9z
aXRpb24gcmV0dXJuZWQgaXMgaW4gdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMuCisgICAgUGxhdGZv
cm06OkludFBvaW50IHNjcm9sbFBvc2l0aW9uKCkgY29uc3Q7CisgICAgLy8gU2Nyb2xsIHBvc2l0
aW9uIHByb3ZpZGVkIHNob3VsZCBiZSBpbiB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KKyAgICB2
b2lkIHNldFNjcm9sbFBvc2l0aW9uKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYpOworICAgIGJv
b2wgc2Nyb2xsQnkoY29uc3QgUGxhdGZvcm06OkludFNpemUmLCBib29sIHNjcm9sbE1haW5GcmFt
ZSA9IHRydWUpOworICAgIHZvaWQgbm90aWZ5SW5SZWdpb25TY3JvbGxTdGF0dXNDaGFuZ2VkKGJv
b2wgc3RhdHVzKTsKKyAgICB2b2lkIHNldFNjcm9sbE9yaWdpblBvaW50KGNvbnN0IFBsYXRmb3Jt
OjpJbnRQb2ludCYpOworCisgICAgQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUoKSBjb25zdDsK
KworICAgIGJvb2wgem9vbVRvRml0KCk7CisgICAgYm9vbCB6b29tVG9PbmVPbmUoKTsKKyAgICB2
b2lkIHpvb21Ub0luaXRpYWxTY2FsZSgpOworICAgIGJvb2wgYmxvY2tab29tKGludCB4LCBpbnQg
eSk7CisgICAgdm9pZCBibG9ja1pvb21BbmltYXRpb25GaW5pc2hlZCgpOworICAgIGJvb2wgaXNB
dEluaXRpYWxab29tKCkgY29uc3Q7CisgICAgYm9vbCBpc01heFpvb21lZCgpIGNvbnN0OworICAg
IGJvb2wgaXNNaW5ab29tZWQoKSBjb25zdDsKKyAgICBib29sIHBpbmNoWm9vbUFib3V0UG9pbnQo
ZG91YmxlIHNjYWxlLCBpbnQgeCwgaW50IHkpOworCisgICAgYm9vbCBpc1VzZXJTY2FsYWJsZSgp
IGNvbnN0OworICAgIGRvdWJsZSBjdXJyZW50U2NhbGUoKSBjb25zdDsKKyAgICBkb3VibGUgaW5p
dGlhbFNjYWxlKCkgY29uc3Q7CisgICAgZG91YmxlIHpvb21Ub0ZpdFNjYWxlKCkgY29uc3Q7Cisg
ICAgdm9pZCBzZXRJbml0aWFsU2NhbGUoZG91YmxlKTsKKyAgICBkb3VibGUgbWluaW11bVNjYWxl
KCkgY29uc3Q7CisgICAgdm9pZCBzZXRNaW5pbXVtU2NhbGUoZG91YmxlKTsKKyAgICBkb3VibGUg
bWF4aW11bVNjYWxlKCkgY29uc3Q7CisgICAgdm9pZCBzZXRNYXhpbXVtU2NhbGUoZG91YmxlKTsK
KworICAgIHZvaWQgYXNzaWduRm9jdXMoUGxhdGZvcm06OkZvY3VzRGlyZWN0aW9uKTsKKworICAg
IGJvb2wgbW92ZVRvTmV4dEZpZWxkKFBsYXRmb3JtOjpTY3JvbGxEaXJlY3Rpb24sIGludCBkZXNp
cmVkU2Nyb2xsQW1vdW50KTsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBmb2N1c05vZGVSZWN0KCk7
CisKKyAgICB2b2lkIHNldEZvY3VzZWQoYm9vbCk7CisgICAgYm9vbCBsaW5rVG9MaW5rT25DbGlj
aygpOworCisgICAgdm9pZCBjbGVhckJyb3dzaW5nRGF0YSgpOworICAgIHZvaWQgY2xlYXJIaXN0
b3J5KCk7CisgICAgdm9pZCBjbGVhckNvb2tpZXMoKTsKKyAgICB2b2lkIGNsZWFyQ2FjaGUoKTsK
KyAgICB2b2lkIGNsZWFyTG9jYWxTdG9yYWdlKCk7CisKKyAgICB2b2lkIHJ1bkxheW91dFRlc3Rz
KCk7CisKKyAgICAgLy8gRmluZHMgYW5kIHNlbGVjdHMgdGhlIG5leHQgdXRmOCBzdHJpbmcgdGhh
dCBpcyBhIGNhc2Ugc2Vuc2l0aXZlCisgICAgIC8vIG1hdGNoIGluIHRoZSB3ZWIgcGFnZS4gSXQg
d2lsbCB3cmFwIHRoZSB3ZWIgcGFnZSBpZiBpdCByZWFjaGVzCisgICAgIC8vIHRoZSBlbmQuIEFu
IGVtcHR5IHN0cmluZyB3aWxsIHJlc3VsdCBpbiBubyBtYXRjaCBhbmQgbm8gc2VsZWN0aW9uLgor
ICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyBtYXRjaGVkIGFuZCBmYWxzZSBpZiBu
b3QuCisgICAgYm9vbCBmaW5kTmV4dFN0cmluZyhjb25zdCBjaGFyKiwgYm9vbCBmb3J3YXJkID0g
dHJ1ZSk7CisKKyAgICAvLyBKYXZhU2NyaXB0RGVidWdnZXIgaW50ZXJmYWNlLgorICAgIGJvb2wg
ZW5hYmxlU2NyaXB0RGVidWdnZXIoKTsKKyAgICBib29sIGRpc2FibGVTY3JpcHREZWJ1Z2dlcigp
OworCisgICAgSlNDb250ZXh0UmVmIHNjcmlwdENvbnRleHQoKSBjb25zdDsKKyAgICBKU1ZhbHVl
UmVmIHdpbmRvd09iamVjdCgpIGNvbnN0OworCisjaWYgZGVmaW5lZChFTkFCTEVfV0VCRE9NKSAm
JiBFTkFCTEVfV0VCRE9NCisgICAgV2ViRE9NRG9jdW1lbnQgZG9jdW1lbnQoKSBjb25zdDsKKyNl
bmRpZgorCisgICAgdm9pZCBhZGRCcmVha3BvaW50KGNvbnN0IHVuc2lnbmVkIHNob3J0KiB1cmws
IHVuc2lnbmVkIHVybExlbmd0aCwgaW50IGxpbmVOdW1iZXIsIGNvbnN0IHVuc2lnbmVkIHNob3J0
KiBjb25kaXRpb24sIHVuc2lnbmVkIGNvbmRpdGlvbkxlbmd0aCk7CisgICAgdm9pZCB1cGRhdGVC
cmVha3BvaW50KGNvbnN0IHVuc2lnbmVkIHNob3J0KiB1cmwsIHVuc2lnbmVkIHVybExlbmd0aCwg
aW50IGxpbmVOdW1iZXIsIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBjb25kaXRpb24sIHVuc2lnbmVk
IGNvbmRpdGlvbkxlbmd0aCk7CisgICAgdm9pZCByZW1vdmVCcmVha3BvaW50KGNvbnN0IHVuc2ln
bmVkIHNob3J0KiB1cmwsIHVuc2lnbmVkIHVybExlbmd0aCwgaW50IGxpbmVOdW1iZXIpOworCisg
ICAgYm9vbCBwYXVzZU9uRXhjZXB0aW9ucygpOworICAgIHZvaWQgc2V0UGF1c2VPbkV4Y2VwdGlv
bnMoYm9vbCk7CisKKyAgICB2b2lkIHBhdXNlSW5EZWJ1Z2dlcigpOworICAgIHZvaWQgcmVzdW1l
RGVidWdnZXIoKTsKKworICAgIHZvaWQgc3RlcE92ZXJTdGF0ZW1lbnRJbkRlYnVnZ2VyKCk7Cisg
ICAgdm9pZCBzdGVwSW50b1N0YXRlbWVudEluRGVidWdnZXIoKTsKKyAgICB2b2lkIHN0ZXBPdXRP
ZkZ1bmN0aW9uSW5EZWJ1Z2dlcigpOworCisgICAgdW5zaWduZWQgdGltZW91dEZvckphdmFTY3Jp
cHRFeGVjdXRpb24oKSBjb25zdDsKKyAgICB2b2lkIHNldFRpbWVvdXRGb3JKYXZhU2NyaXB0RXhl
Y3V0aW9uKHVuc2lnbmVkIG1zKTsKKworICAgIHZvaWQgc2V0Q2FyZXRIaWdobGlnaHRTdHlsZShQ
bGF0Zm9ybTo6Q2FyZXRIaWdobGlnaHRTdHlsZSk7CisKKyAgICAvLyBJTUYgZnVuY3Rpb25zLgor
ICAgIGJvb2wgc2V0QmF0Y2hFZGl0aW5nQWN0aXZlKGJvb2wpOworICAgIGJvb2wgc2V0SW5wdXRT
ZWxlY3Rpb24odW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCk7CisgICAgaW50IGlucHV0Q2Fy
ZXRQb3NpdGlvbigpIGNvbnN0OworICAgIGJvb2wgZGVsZXRlVGV4dFJlbGF0aXZlVG9DdXJzb3Io
dW5zaWduZWQgbGVmdE9mZnNldCwgdW5zaWduZWQgcmlnaHRPZmZzZXQpOworICAgIHNwYW5uYWJs
ZV9zdHJpbmdfdCogc2VsZWN0ZWRUZXh0KGludDMyX3QgZmxhZ3MpOworICAgIHNwYW5uYWJsZV9z
dHJpbmdfdCogdGV4dEJlZm9yZUN1cnNvcihpbnQzMl90IGxlbmd0aCwgaW50MzJfdCBmbGFncyk7
CisgICAgc3Bhbm5hYmxlX3N0cmluZ190KiB0ZXh0QWZ0ZXJDdXJzb3IoaW50MzJfdCBsZW5ndGgs
IGludDMyX3QgZmxhZ3MpOworICAgIGV4dHJhY3RlZF90ZXh0X3QqIGV4dHJhY3RlZFRleHRSZXF1
ZXN0KGV4dHJhY3RlZF90ZXh0X3JlcXVlc3RfdCosIGludDMyX3QgZmxhZ3MpOworICAgIGludDMy
X3Qgc2V0Q29tcG9zaW5nUmVnaW9uKGludDMyX3Qgc3RhcnQsIGludDMyX3QgZW5kKTsKKyAgICBp
bnQzMl90IGZpbmlzaENvbXBvc2l0aW9uKCk7CisgICAgaW50MzJfdCBzZXRDb21wb3NpbmdUZXh0
KHNwYW5uYWJsZV9zdHJpbmdfdCosIGludDMyX3QgcmVsYXRpdmVDdXJzb3JQb3NpdGlvbik7Cisg
ICAgaW50MzJfdCBjb21taXRUZXh0KHNwYW5uYWJsZV9zdHJpbmdfdCosIGludDMyX3QgcmVsYXRp
dmVDdXJzb3JQb3NpdGlvbik7CisKKyAgICB2b2lkIHNwZWxsQ2hlY2tpbmdFbmFibGVkKGJvb2wp
OworCisgICAgdm9pZCBzZXRTZWxlY3Rpb24oY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBzdGFy
dFBvaW50LCBjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIGVuZFBvaW50KTsKKyAgICB2b2lkIHNl
dENhcmV0UG9zaXRpb24oY29uc3QgUGxhdGZvcm06OkludFBvaW50Jik7CisgICAgdm9pZCBzZWxl
Y3RBdFBvaW50KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYpOworICAgIHZvaWQgc2VsZWN0aW9u
Q2FuY2VsbGVkKCk7CisgICAgYm9vbCBzZWxlY3Rpb25Db250YWlucyhjb25zdCBQbGF0Zm9ybTo6
SW50UG9pbnQmKTsKKworICAgIHZvaWQgcG9wdXBMaXN0Q2xvc2VkKGludCBzaXplLCBib29sKiBz
ZWxlY3RlZHMpOworICAgIHZvaWQgcG9wdXBMaXN0Q2xvc2VkKGludCBpbmRleCk7CisgICAgdm9p
ZCBzZXREYXRlVGltZUlucHV0KGNvbnN0IFdlYlN0cmluZyYgdmFsdWUpOworICAgIHZvaWQgc2V0
Q29sb3JJbnB1dChjb25zdCBXZWJTdHJpbmcmIHZhbHVlKTsKKworICAgIHZvaWQgb25JbnB1dExv
Y2FsZUNoYW5nZWQoYm9vbCBpc1JUTCk7CisgICAgc3RhdGljIHZvaWQgb25OZXR3b3JrQXZhaWxh
YmlsaXR5Q2hhbmdlZChib29sIGF2YWlsYWJsZSk7CisgICAgc3RhdGljIHZvaWQgb25DZXJ0aWZp
Y2F0ZVN0b3JlTG9jYXRpb25TZXQoY29uc3QgV2ViU3RyaW5nJiBjYVBhdGgpOworCisgICAgV2Vi
U3RyaW5nIHRleHRIYXNBdHRyaWJ1dGUoY29uc3QgV2ViU3RyaW5nJiBxdWVyeSkgY29uc3Q7CisK
KyAgICBBY3RpdmVOb2RlQ29udGV4dCBhY3RpdmVOb2RlQ29udGV4dChUYXJnZXREZXRlY3Rpb25T
dHJhdGVneSkgY29uc3Q7CisKKyAgICB0eXBlZGVmIGludHB0cl90IEJhY2tGb3J3YXJkSWQ7Cisg
ICAgc3RydWN0IEJhY2tGb3J3YXJkRW50cnkgeworICAgICAgICBXZWJTdHJpbmcgdXJsOworICAg
ICAgICBXZWJTdHJpbmcgb3JpZ2luYWxVcmw7CisgICAgICAgIFdlYlN0cmluZyB0aXRsZTsKKyAg
ICAgICAgV2ViU3RyaW5nIG5ldHdvcmtUb2tlbjsKKyAgICAgICAgQmFja0ZvcndhcmRJZCBpZDsK
KyAgICAgICAgYm9vbCBsYXN0VmlzaXRXYXNIVFRQTm9uR2V0OworICAgIH07CisKKyAgICBib29s
IGNhbkdvQmFja09yRm9yd2FyZChpbnQgZGVsdGEpIGNvbnN0OworICAgIC8vIFJldHVybnMgZmFs
c2UgaWYgdGhlcmUgaXMgbm8gcGFnZSBmb3IgdGhlIGdpdmVuIGRlbHRhIChlZy4KKyAgICAvLyBh
dHRlbXB0IHRvIGdvIGJhY2sgd2l0aCAtMSB3aGVuIG9uIHRoZSBmaXJzdCBwYWdlKS4KKyAgICBi
b29sIGdvQmFja09yRm9yd2FyZChpbnQgZGVsdGEpOworICAgIHZvaWQgZ29Ub0JhY2tGb3J3YXJk
RW50cnkoQmFja0ZvcndhcmRJZCk7CisKKyAgICBpbnQgYmFja0ZvcndhcmRMaXN0TGVuZ3RoKCkg
Y29uc3Q7CisgICAgdm9pZCBnZXRCYWNrRm9yd2FyZExpc3QoU2hhcmVkQXJyYXk8QmFja0Zvcndh
cmRFbnRyeT4mIHJlc3VsdCwgdW5zaWduZWQmIHJlc3VsdExlbmd0aCkgY29uc3Q7CisgICAgdm9p
ZCByZWxlYXNlQmFja0ZvcndhcmRFbnRyeShCYWNrRm9yd2FyZElkKSBjb25zdDsKKyAgICB2b2lk
IGNsZWFyQmFja0ZvcndhcmRMaXN0KGJvb2wga2VlcEN1cnJlbnRQYWdlKSBjb25zdDsKKworICAg
IHZvaWQgYWRkVmlzaXRlZExpbmsoY29uc3QgdW5zaWduZWQgc2hvcnQqIHVybCwgdW5zaWduZWQg
bGVuZ3RoKTsKKworI2lmIGRlZmluZWQoRU5BQkxFX1dFQkRPTSkgJiYgRU5BQkxFX1dFQkRPTQor
ICAgIFdlYkRPTU5vZGUgbm9kZUF0UG9pbnQoaW50IHgsIGludCB5KTsKKyAgICBib29sIGdldE5v
ZGVSZWN0KGNvbnN0IFdlYkRPTU5vZGUmLCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVzdWx0KTsKKyAg
ICBib29sIHNldE5vZGVGb2N1cyhjb25zdCBXZWJET01Ob2RlJiwgYm9vbCBvbik7CisgICAgYm9v
bCBzZXROb2RlSG92ZXJlZChjb25zdCBXZWJET01Ob2RlJiwgYm9vbCBvbik7CisgICAgYm9vbCBu
b2RlSGFzSG92ZXIoY29uc3QgV2ViRE9NTm9kZSYpOworI2VuZGlmCisKKyAgICBib29sIGRlZmVy
c0xvYWRpbmcoKSBjb25zdDsKKworICAgIGJvb2wgd2lsbEZpcmVUaW1lcigpOworCisgICAgdm9p
ZCBjbGVhclN0b3JhZ2UoKTsKKworICAgIGJvb2wgaXNFbmFibGVMb2NhbEFjY2Vzc1RvQWxsQ29v
a2llcygpIGNvbnN0OworICAgIHZvaWQgc2V0RW5hYmxlTG9jYWxBY2Nlc3NUb0FsbENvb2tpZXMo
Ym9vbCk7CisKKyAgICB2b2lkIGVuYWJsZVdlYkluc3BlY3RvcigpOworICAgIHZvaWQgZGlzYWJs
ZVdlYkluc3BlY3RvcigpOworICAgIHZvaWQgZW5hYmxlUGFzc3dvcmRFY2hvKCk7CisgICAgdm9p
ZCBkaXNhYmxlUGFzc3dvcmRFY2hvKCk7CisgICAgdm9pZCBkaXNwYXRjaEluc3BlY3Rvck1lc3Nh
Z2UoY29uc3QgY2hhciogbWVzc2FnZSwgaW50IGxlbmd0aCk7CisgICAgV2ViQ29yZTo6RnJhbWUq
IG1haW5GcmFtZSgpIGNvbnN0OworCisgICAgLy8gRklYTUU6IE5lZWRzIEFQSSByZXZpZXcgb24g
dGhpcyBoZWFkZXIuIFNlZSBQUiAjMTIwNDAyLgorICAgIHZvaWQgbm90aWZ5UGFnZVBhdXNlKCk7
CisgICAgdm9pZCBub3RpZnlQYWdlUmVzdW1lKCk7CisgICAgdm9pZCBub3RpZnlQYWdlQmFja2dy
b3VuZCgpOworICAgIHZvaWQgbm90aWZ5UGFnZUZvcmVncm91bmQoKTsKKyAgICB2b2lkIG5vdGlm
eVBhZ2VGdWxsU2NyZWVuQWxsb3dlZCgpOworICAgIHZvaWQgbm90aWZ5UGFnZUZ1bGxTY3JlZW5F
eGl0KCk7CisgICAgdm9pZCBub3RpZnlEZXZpY2VJZGxlU3RhdGVDaGFuZ2UoYm9vbCBlbnRlcklk
bGUpOworICAgIHZvaWQgbm90aWZ5QXBwQWN0aXZhdGlvblN0YXRlQ2hhbmdlKEFjdGl2YXRpb25T
dGF0ZVR5cGUpOworICAgIHZvaWQgbm90aWZ5U3dpcGVFdmVudCgpOworICAgIHZvaWQgbm90aWZ5
U2NyZWVuUG93ZXJTdGF0ZUNoYW5nZWQoYm9vbCBwb3dlcmVkKTsKKyAgICB2b2lkIG5vdGlmeUZ1
bGxTY3JlZW5WaWRlb0V4aXRlZChib29sIGRvbmUpOworICAgIHZvaWQgY2xlYXJQbHVnaW5TaXRl
RGF0YSgpOworICAgIHZvaWQgc2V0VmlydHVhbEtleWJvYXJkVmlzaWJsZShib29sKTsKKyAgICB2
b2lkIHNldEphdmFTY3JpcHRDYW5BY2Nlc3NDbGlwYm9hcmQoYm9vbCk7CisgICAgYm9vbCBpc1dl
YkdMRW5hYmxlZCgpIGNvbnN0OworICAgIHZvaWQgc2V0V2ViR0xFbmFibGVkKGJvb2wpOworCisg
ICAgdm9pZCBkZXN0cm95V2ViUGFnZUNvbXBvc2l0b3IoKTsKKworcHJpdmF0ZToKKyAgICB+V2Vi
UGFnZSgpOworCisgICAgZnJpZW5kIGNsYXNzIFdlYktpdDo6QmFja2luZ1N0b3JlOworICAgIGZy
aWVuZCBjbGFzcyBXZWJLaXQ6OkJhY2tpbmdTdG9yZUNsaWVudDsKKyAgICBmcmllbmQgY2xhc3Mg
V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOworICAgIGZyaWVuZCBjbGFzcyBXZWJLaXQ6OlJl
bmRlclF1ZXVlOworICAgIGZyaWVuZCBjbGFzcyBXZWJLaXQ6OldlYlBhZ2VHcm91cExvYWREZWZl
cnJlcjsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6Q2hyb21lQ2xpZW50QmxhY2tCZXJyeTsK
KyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6RWRpdG9yQ2xpZW50QmxhY2tCZXJyeTsKKyAgICBm
cmllbmQgY2xhc3MgV2ViQ29yZTo6RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5OworICAgIGZy
aWVuZCBjbGFzcyBXZWJDb3JlOjpJY29uRGF0YWJhc2VDbGllbnRCbGFja0JlcnJ5OworICAgIGZy
aWVuZCBjbGFzcyBXZWJDb3JlOjpJbnNwZWN0b3JDbGllbnRCbGFja0JlcnJ5OworICAgIGZyaWVu
ZCBjbGFzcyBXZWJDb3JlOjpKYXZhU2NyaXB0RGVidWdnZXJCbGFja0JlcnJ5OworICAgIGZyaWVu
ZCBjbGFzcyBXZWJDb3JlOjpHZW9sb2NhdGlvbkNvbnRyb2xsZXJDbGllbnRCbGFja0JlcnJ5Owor
ICAgIFdlYlBhZ2VQcml2YXRlKiBkOworfTsKK30KK30KKworI2VuZGlmIC8vIFdlYlBhZ2VfaApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9XZWJQYWdlX3AuaCBiL1Nv
dXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvV2ViUGFnZV9wLmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMzY3Y2Fh
YTdmMWIxNDM4NjVlYjMxMjFiMzY4YzNjMDQzNTRiOTM2MAotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvV2ViUGFnZV9wLmgKQEAgLTAsMCArMSw1MzUgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4g
TW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgor
ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3
cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8K
KworI2lmbmRlZiBXZWJQYWdlX3BfaAorI2RlZmluZSBXZWJQYWdlX3BfaAorCisjaW5jbHVkZSAi
Q2hyb21lQ2xpZW50LmgiCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2luY2x1
ZGUgIkxheWVyUmVuZGVyZXIuaCIKKyNlbmRpZgorI2luY2x1ZGUgIlBhZ2VDbGllbnRCbGFja0Jl
cnJ5LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCisjaW5jbHVkZSAiU2NyaXB0
U291cmNlQ29kZS5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSAiVmlld3BvcnRBcmd1
bWVudHMuaCIKKyNpbmNsdWRlICJXZWJQYWdlLmgiCisjaW5jbHVkZSAiV2ViU2V0dGluZ3MuaCIK
KworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDx3dGYv
SGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworY2xhc3MgQ3Vyc29yOworY2xhc3MgRE9NV3JhcHBlcldvcmxkOworY2xhc3MgRG9jdW1lbnQ7
CitjbGFzcyBGbG9hdFBvaW50OworY2xhc3MgRnJhbWU7CitjbGFzcyBGcmFtZVZpZXc7CitjbGFz
cyBHZW9sb2NhdGlvbkNvbnRyb2xsZXJDbGllbnRCbGFja0JlcnJ5OworY2xhc3MgSFRNTElucHV0
RWxlbWVudDsKK2NsYXNzIEhUTUxTZWxlY3RFbGVtZW50OworY2xhc3MgSW50UG9pbnQ7CitjbGFz
cyBJbnRSZWN0OworY2xhc3MgSW50U2l6ZTsKK2NsYXNzIEphdmFTY3JpcHREZWJ1Z2dlckJsYWNr
QmVycnk7CitjbGFzcyBLVVJMOworY2xhc3MgTm9kZTsKK2NsYXNzIFBhZ2U7CitjbGFzcyBQbHVn
aW5WaWV3OworY2xhc3MgUmVuZGVyTGF5ZXI7CitjbGFzcyBSZW5kZXJPYmplY3Q7CitjbGFzcyBT
Y3JvbGxWaWV3OworY2xhc3MgU3VyZmFjZU9wZW5WRzsKK2NsYXNzIFRyYW5zZm9ybWF0aW9uTWF0
cml4OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgVGltZXI7Cit9CisKK25hbWVzcGFjZSBC
bGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBCYWNraW5nU3RvcmU7Citj
bGFzcyBCYWNraW5nU3RvcmVDbGllbnQ7CitjbGFzcyBCYWNraW5nU3RvcmVUaWxlOworY2xhc3Mg
RHVtcFJlbmRlclRyZWVDbGllbnQ7CitjbGFzcyBJblBhZ2VTZWFyY2hNYW5hZ2VyOworY2xhc3Mg
SW5wdXRIYW5kbGVyOworY2xhc3MgSW5SZWdpb25TY3JvbGxhYmxlQXJlYTsKK2NsYXNzIFNlbGVj
dGlvbkhhbmRsZXI7CitjbGFzcyBUb3VjaEV2ZW50SGFuZGxlcjsKK2NsYXNzIFdlYlBhZ2U7Citj
bGFzcyBXZWJQYWdlQ2xpZW50OworCit0eXBlZGVmIEhhc2hNYXA8Y29uc3QgV2ViQ29yZTo6RnJh
bWUqLCBCYWNraW5nU3RvcmVDbGllbnQqPiBCYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZU1hcDsK
KworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKK2NsYXNzIEZyYW1lTGF5ZXJzOwor
Y2xhc3MgV2ViUGFnZUNvbXBvc2l0b3I7CisjZW5kaWYKKworLy8gSW4gdGhlIGNsaWVudCBjb2Rl
LCB0aGVyZSBpcyBzY3JlZW4gc2l6ZSBhbmQgdmlld3BvcnQuCisvLyBJbiBXZWJQYWdlUHJpdmF0
ZSwgdGhlIHNjcmVlbiBzaXplIGlzIGNhbGxlZCB0aGUgdHJhbnNmb3JtZWRWaWV3cG9ydFNpemUs
CisvLyB0aGUgdmlld3BvcnQgcG9zaXRpb24gaXMgY2FsbGVkIHRoZSB0cmFuc2Zvcm1lZFNjcm9s
bFBvc2l0aW9uLAorLy8gYW5kIHRoZSB2aWV3cG9ydCBzaXplIGlzIGNhbGxlZCB0aGUgdHJhbnNm
b3JtZWRBY3R1YWxWaXNpYmxlU2l6ZS4KK2NsYXNzIFdlYlBhZ2VQcml2YXRlIDogcHVibGljIFBh
Z2VDbGllbnRCbGFja0JlcnJ5LCBwdWJsaWMgV2ViU2V0dGluZ3NEZWxlZ2F0ZSwgcHVibGljIFBs
YXRmb3JtOjpHdWFyZGVkUG9pbnRlckJhc2UgeworcHVibGljOgorICAgIGVudW0gVmlld01vZGUg
eyBNb2JpbGUsIERlc2t0b3AsIEZpeGVkRGVza3RvcCB9OworICAgIGVudW0gTG9hZFN0YXRlIHsg
Tm9uZSAvKiBvbiBpbnN0YW50aWF0aW9uIG9mIHBhZ2UgKi8sIFByb3Zpc2lvbmFsLCBDb21taXR0
ZWQsIEZpbmlzaGVkLCBGYWlsZWQgfTsKKworICAgIFdlYlBhZ2VQcml2YXRlKFdlYlBhZ2UqLCBX
ZWJQYWdlQ2xpZW50KiwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmKTsKKyAgICB2aXJ0dWFsIH5X
ZWJQYWdlUHJpdmF0ZSgpOworCisgICAgdm9pZCBpbml0KGNvbnN0IFdlYlN0cmluZyYgcGFnZUdy
b3VwTmFtZSk7CisgICAgYm9vbCBoYW5kbGVNb3VzZUV2ZW50KFdlYkNvcmU6OlBsYXRmb3JtTW91
c2VFdmVudCYpOworICAgIGJvb2wgaGFuZGxlV2hlZWxFdmVudChXZWJDb3JlOjpQbGF0Zm9ybVdo
ZWVsRXZlbnQmKTsKKworICAgIHZvaWQgbG9hZChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIq
IG5ldHdvcmtUb2tlbiwgY29uc3QgY2hhciogbWV0aG9kLCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVl
c3Q6OkNhY2hlUG9saWN5LCBjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgZGF0YUxlbmd0aCwgY29u
c3QgY2hhciogY29uc3QqIGhlYWRlcnMsIHNpemVfdCBoZWFkZXJzTGVuZ3RoLCBib29sIGlzSW5p
dGlhbCwgYm9vbCBtdXN0SGFuZGxlSW50ZXJuYWxseSA9IGZhbHNlLCBib29sIGZvcmNlRG93bmxv
YWQgPSBmYWxzZSwgY29uc3QgY2hhciogb3ZlcnJpZGVDb250ZW50VHlwZSA9ICIiKTsKKyAgICB2
b2lkIGxvYWRTdHJpbmcoY29uc3QgY2hhciogc3RyaW5nLCBjb25zdCBjaGFyKiBiYXNlVVJMLCBj
b25zdCBjaGFyKiBtaW1lVHlwZSwgY29uc3QgY2hhciogZmFpbGluZ1VSTCA9IDApOworICAgIGJv
b2wgZXhlY3V0ZUphdmFTY3JpcHQoY29uc3QgY2hhciogc2NyaXB0LCBKYXZhU2NyaXB0RGF0YVR5
cGUmIHJldHVyblR5cGUsIFdlYlN0cmluZyYgcmV0dXJuVmFsdWUpOworICAgIGJvb2wgZXhlY3V0
ZUphdmFTY3JpcHRJbklzb2xhdGVkV29ybGQoY29uc3QgV2ViQ29yZTo6U2NyaXB0U291cmNlQ29k
ZSYsIEphdmFTY3JpcHREYXRhVHlwZSYgcmV0dXJuVHlwZSwgV2ViU3RyaW5nJiByZXR1cm5WYWx1
ZSk7CisKKyAgICB2b2lkIHN0b3BDdXJyZW50TG9hZCgpOworICAgIHZvaWQgcHJlcGFyZVRvRGVz
dHJveSgpOworCisgICAgTG9hZFN0YXRlIGxvYWRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fbG9h
ZFN0YXRlOyB9CisgICAgYm9vbCBpc0xvYWRpbmcoKSBjb25zdCB7IHJldHVybiBtX2xvYWRTdGF0
ZSA9PSBXZWJQYWdlUHJpdmF0ZTo6UHJvdmlzaW9uYWwgfHwgbV9sb2FkU3RhdGUgPT0gV2ViUGFn
ZVByaXZhdGU6OkNvbW1pdHRlZDsgfQorCisgICAgLy8gQ2FsbGVkIGZyb20gd2l0aGluIFdlYktp
dCB2aWEgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5LgorICAgIHZvaWQgc2V0TG9hZFN0YXRl
KExvYWRTdGF0ZSk7CisKKyAgICAvLyBDbGFtcCB0aGUgc2NhbGUuCisgICAgZG91YmxlIGNsYW1w
ZWRTY2FsZShkb3VibGUgc2NhbGUpIGNvbnN0OworCisgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIHNo
b3VsZCB6b29tLCBjbGFtcGluZyB0aGUgc2NhbGUgcGFyYW1ldGVyIGlmIHJlcXVpcmVkLgorICAg
IGJvb2wgc2hvdWxkWm9vbUFib3V0UG9pbnQoZG91YmxlIHNjYWxlLCBjb25zdCBXZWJDb3JlOjpG
bG9hdFBvaW50JiBhbmNob3IsIGJvb2wgZW5mb3JlU2NhbGVDbGFtcGluZywgZG91YmxlKiBjbGFt
cGVkU2NhbGUpOworCisgICAgLy8gU2NhbGUgdGhlIHBhZ2UgdG8gdGhlIGdpdmVuIHNjYWxlIGFu
ZCBhbmNob3IgYWJvdXQgdGhlIHBvaW50IHdoaWNoIGlzIHNwZWNpZmllZCBpbiB1bnRyYW5zZm9y
bWVkIGNvbnRlbnQgY29vcmRpbmF0ZXMuCisgICAgYm9vbCB6b29tQWJvdXRQb2ludChkb3VibGUg
c2NhbGUsIGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQmIGFuY2hvciwgYm9vbCBlbmZvcmNlU2Nh
bGVDbGFtcGluZyA9IHRydWUsIGJvb2wgZm9yY2VSZW5kZXJpbmcgPSBmYWxzZSwgYm9vbCBpc1Jl
c3RvcmluZ1pvb21MZXZlbCA9IGZhbHNlKTsKKyAgICBib29sIHNjaGVkdWxlWm9vbUFib3V0UG9p
bnQoZG91YmxlIHNjYWxlLCBjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50JiBhbmNob3IsIGJvb2wg
ZW5mb3JjZVNjYWxlQ2xhbXBpbmcgPSB0cnVlLCBib29sIGZvcmNlUmVuZGVyaW5nID0gZmFsc2Up
OworICAgIHZvaWQgdW5zY2hlZHVsZVpvb21BYm91dFBvaW50KCk7CisgICAgV2ViQ29yZTo6SW50
UG9pbnQgY2FsY3VsYXRlUmVmbG93ZWRTY3JvbGxQb3NpdGlvbihjb25zdCBXZWJDb3JlOjpGbG9h
dFBvaW50JiBhbmNob3JPZmZzZXQsIGRvdWJsZSBpbnZlcnNlU2NhbGUpOworICAgIHZvaWQgc2V0
VGV4dFJlZmxvd0FuY2hvclBvaW50KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgZm9jYWxQb2lu
dCk7CisKKyAgICB2b2lkIHNjaGVkdWxlUGluY2hab29tQWJvdXRQb2ludChkb3VibGUgc2NhbGUs
IGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBhbmNob3IpOworCisgICAgLy8gUGVyZm9ybSBhY3R1
YWwgem9vbSBmb3IgYmxvY2sgem9vbS4KKyAgICB2b2lkIHpvb21CbG9jaygpOworCisgICAgLy8g
Q2FsbGVkIGJ5IHRoZSBiYWNraW5nIHN0b3JlIGFzIHdlbGwgYXMgdGhlIG1ldGhvZCBiZWxvdy4K
KyAgICB2b2lkIHJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpIGNvbnN0OworICAgIHZvaWQgc2V0TmVl
ZHNMYXlvdXQoKTsKKworICAgIFdlYkNvcmU6OkludFBvaW50IHNjcm9sbFBvc2l0aW9uKCkgY29u
c3Q7CisgICAgV2ViQ29yZTo6SW50UG9pbnQgbWF4aW11bVNjcm9sbFBvc2l0aW9uKCkgY29uc3Q7
CisgICAgdm9pZCBzZXRTY3JvbGxQb3NpdGlvbihjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYpOwor
ICAgIGJvb2wgc2Nyb2xsQnkoaW50IGRlbHRhWCwgaW50IGRlbHRhWSwgYm9vbCBzY3JvbGxNYWlu
RnJhbWUgPSB0cnVlKTsKKworICAgIHZvaWQgZW5xdWV1ZVJlbmRlcmluZ09mQ2xpcHBlZENvbnRl
bnRPZlNjcm9sbGFibGVOb2RlQWZ0ZXJJblJlZ2lvblNjcm9sbGluZyhXZWJDb3JlOjpOb2RlKik7
CisgICAgc3RkOjp2ZWN0b3I8UGxhdGZvcm06OlNjcm9sbFZpZXdCYXNlPiBpblJlZ2lvblNjcm9s
bGFibGVBcmVhc0ZvclBvaW50KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYpOworICAgIHZvaWQg
bm90aWZ5SW5SZWdpb25TY3JvbGxTdGF0dXNDaGFuZ2VkKGJvb2wgc3RhdHVzKTsKKyAgICB2b2lk
IHNldFNjcm9sbE9yaWdpblBvaW50KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYpOworICAgIHZv
aWQgc2V0SGFzSW5SZWdpb25TY3JvbGxhYmxlQXJlYXMoYm9vbCk7CisKKyAgICAvLyBUaGUgYWN0
dWFsIHZpc2libGUgc2l6ZSBhcyByZXBvcnRlZCBieSB0aGUgY2xpZW50LCBidXQgaW4gV2ViS2l0
IGNvb3JkaW5hdGVzLgorICAgIFdlYkNvcmU6OkludFNpemUgYWN0dWFsVmlzaWJsZVNpemUoKSBj
b25zdDsKKworICAgIC8vIFRoZSB2aWV3cG9ydCBzaXplIGlzIHRoZSBzYW1lIGFzIHRoZSBjbGll
bnQncyB3aW5kb3cgc2l6ZSwgYnV0IGluIHdlYmtpdCBjb29yZGluYXRlcy4KKyAgICBXZWJDb3Jl
OjpJbnRTaXplIHZpZXdwb3J0U2l6ZSgpIGNvbnN0OworCisgICAgLy8gTW9kaWZpZXMgdGhlIHpv
b21Ub0ZpdCBhbGdvcml0aG0gbG9naWMgdG8gY29uc3RydWN0IGEgc2NhbGUgc3VjaCB0aGF0IHRo
ZSB2aWV3cG9ydFNpemUgYWJvdmUgaXMgZXF1YWwgdG8gdGhpcyBzaXplLgorICAgIGJvb2wgaGFz
VmlydHVhbFZpZXdwb3J0KCkgY29uc3Q7CisgICAgYm9vbCBpc1VzZXJTY2FsYWJsZSgpIGNvbnN0
IHsgcmV0dXJuIG1fdXNlclNjYWxhYmxlOyB9CisgICAgdm9pZCBzZXRVc2VyU2NhbGFibGUoYm9v
bCB1c2VyU2NhbGFibGUpIHsgbV91c2VyU2NhbGFibGUgPSB1c2VyU2NhbGFibGU7IH0KKworICAg
IC8vIFNldHMgZGVmYXVsdCBsYXlvdXQgc2l6ZSB3aXRob3V0IGRvaW5nIGxheW91dCBvciBtYXJr
aW5nIGFzIG5lZWRpbmcgbGF5b3V0LgorICAgIHZvaWQgc2V0RGVmYXVsdExheW91dFNpemUoY29u
c3QgV2ViQ29yZTo6SW50U2l6ZSYpOworCisgICAgLy8gVXBkYXRlcyBXZWJDb3JlIHdoZW4gdGhl
IHZpZXdwb3J0U2l6ZSgpIG9yIGFjdHVhbFZpc2libGVTaXplKCkgY2hhbmdlLgorICAgIHZvaWQg
dXBkYXRlVmlld3BvcnRTaXplKGJvb2wgc2V0Rml4ZWRSZXBvcnRlZFNpemUgPSB0cnVlLCBib29s
IHNlbmRSZXNpemVFdmVudCA9IHRydWUpOworCisgICAgV2ViQ29yZTo6RmxvYXRQb2ludCBjZW50
ZXJPZlZpc2libGVDb250ZW50c1JlY3QoKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IHZp
c2libGVDb250ZW50c1JlY3QoKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRTaXplIGNvbnRlbnRz
U2l6ZSgpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFNpemUgYWJzb2x1dGVWaXNpYmxlT3ZlcmZs
b3dTaXplKCkgY29uc3Q7CisKKyAgICAvLyBWaXJ0dWFsIGZ1bmN0aW9ucyBpbmhlcml0ZWQgZnJv
bSBQYWdlQ2xpZW50QmxhY2tCZXJyeS4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q3Vyc29yKFdlYkNv
cmU6OlBsYXRmb3JtQ3Vyc29ySGFuZGxlKTsKKyAgICB2aXJ0dWFsIFBsYXRmb3JtOjpOZXR3b3Jr
U3RyZWFtRmFjdG9yeSogbmV0d29ya1N0cmVhbUZhY3RvcnkoKTsKKyAgICB2aXJ0dWFsIFBsYXRm
b3JtOjpHcmFwaGljczo6V2luZG93KiBwbGF0Zm9ybVdpbmRvdygpIGNvbnN0OworICAgIHZpcnR1
YWwgdm9pZCBzZXRQcmV2ZW50c1NjcmVlbkRpbW1pbmcoYm9vbCBwcmV2ZW50RGltbWluZyk7Cisg
ICAgdmlydHVhbCB2b2lkIHNob3dWaXJ0dWFsS2V5Ym9hcmQoYm9vbCBzaG93S2V5Ym9hcmQpOwor
ICAgIHZpcnR1YWwgdm9pZCBlbnN1cmVDb250ZW50VmlzaWJsZShib29sIGNlbnRlckluVmlldyA9
IHRydWUpOworICAgIHZpcnR1YWwgdm9pZCB6b29tVG9Db250ZW50UmVjdChjb25zdCBXZWJDb3Jl
OjpJbnRSZWN0Jik7CisgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyUGx1Z2luKFdlYkNvcmU6OlBs
dWdpblZpZXcqLCBib29sKTsKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5UGFnZU9uTG9hZCgpOwor
ICAgIHZpcnR1YWwgYm9vbCBzaG91bGRQbHVnaW5FbnRlckZ1bGxTY3JlZW4oV2ViQ29yZTo6UGx1
Z2luVmlldyosIGNvbnN0IGNoYXIqKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkUGx1Z2luRW50ZXJG
dWxsU2NyZWVuKFdlYkNvcmU6OlBsdWdpblZpZXcqLCBjb25zdCBjaGFyKik7CisgICAgdmlydHVh
bCB2b2lkIGRpZFBsdWdpbkV4aXRGdWxsU2NyZWVuKFdlYkNvcmU6OlBsdWdpblZpZXcqLCBjb25z
dCBjaGFyKik7CisgICAgdmlydHVhbCB2b2lkIG9uUGx1Z2luU3RhcnRCYWNrZ3JvdW5kUGxheShX
ZWJDb3JlOjpQbHVnaW5WaWV3KiwgY29uc3QgY2hhciopOworICAgIHZpcnR1YWwgdm9pZCBvblBs
dWdpblN0b3BCYWNrZ3JvdW5kUGxheShXZWJDb3JlOjpQbHVnaW5WaWV3KiwgY29uc3QgY2hhciop
OworICAgIHZpcnR1YWwgYm9vbCBsb2NrT3JpZW50YXRpb24oYm9vbCBsYW5kc2NhcGUpOworICAg
IHZpcnR1YWwgdm9pZCB1bmxvY2tPcmllbnRhdGlvbigpOworICAgIHZpcnR1YWwgaW50IG9yaWVu
dGF0aW9uKCkgY29uc3Q7CisgICAgdmlydHVhbCBkb3VibGUgY3VycmVudFpvb21GYWN0b3IoKSBj
b25zdDsKKyAgICB2aXJ0dWFsIGludCBzaG93QWxlcnREaWFsb2coV2ViUGFnZUNsaWVudDo6QWxl
cnRUeXBlIGF0eXBlKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNBY3RpdmUoKSBjb25zdDsKKworICAg
IC8vIENhbGxlZCBmcm9tIHdpdGhpbiBXZWJLaXQgdmlhIENocm9tZUNsaWVudEJsYWNrQmVycnku
CisgICAgdm9pZCBlbnRlckZ1bGxzY3JlZW5Gb3JOb2RlKFdlYkNvcmU6Ok5vZGUqKTsKKyAgICB2
b2lkIGV4aXRGdWxsc2NyZWVuRm9yTm9kZShXZWJDb3JlOjpOb2RlKik7CisgICAgdm9pZCBjb250
ZW50c1NpemVDaGFuZ2VkKGNvbnN0IFdlYkNvcmU6OkludFNpemUmKTsKKyAgICB2b2lkIG92ZXJm
bG93RXhjZWVkc0NvbnRlbnRzU2l6ZSgpOworICAgIHZvaWQgbGF5b3V0RmluaXNoZWQoKTsKKyAg
ICB2b2lkIHNldE5lZWRUb3VjaEV2ZW50cyhib29sKTsKKworICAgIC8vIENhbGxlZCBhY2NvcmRp
bmcgdG8gb3VyIGhldXJpc3RpYyBvciBmcm9tIHNldExvYWRTdGF0ZSBkZXBlbmRpbmcgb24gd2hl
dGhlciB3ZSBoYXZlIGEgdmlydHVhbCB2aWV3cG9ydC4KKyAgICB2b2lkIHpvb21Ub0luaXRpYWxT
Y2FsZU9uTG9hZCgpOworCisgICAgLy8gVmFyaW91cyBzY2FsZSBmYWN0b3JzLgorICAgIGRvdWJs
ZSBjdXJyZW50U2NhbGUoKSBjb25zdDsKKyAgICBkb3VibGUgem9vbVRvRml0U2NhbGUoKSBjb25z
dDsKKyAgICBkb3VibGUgaW5pdGlhbFNjYWxlKCkgY29uc3Q7CisgICAgdm9pZCBzZXRJbml0aWFs
U2NhbGUoZG91YmxlIHNjYWxlKSB7IG1faW5pdGlhbFNjYWxlID0gc2NhbGU7IH0KKyAgICBkb3Vi
bGUgbWluaW11bVNjYWxlKCkgY29uc3Q7CisgICAgdm9pZCBzZXRNaW5pbXVtU2NhbGUoZG91Ymxl
IHNjYWxlKSB7IG1fbWluaW11bVNjYWxlID0gc2NhbGU7IH0KKyAgICBkb3VibGUgbWF4aW11bVNj
YWxlKCkgY29uc3Q7CisgICAgdm9pZCBzZXRNYXhpbXVtU2NhbGUoZG91YmxlIHNjYWxlKSB7IG1f
bWF4aW11bVNjYWxlID0gc2NhbGU7IH0KKyAgICB2b2lkIHJlc2V0U2NhbGVzKCk7CisKKyAgICBp
bnQgcmVmbG93V2lkdGgoKSBjb25zdAorICAgIHsKKyAgICAgICAgLy8gTm90ZTogdG8gbWFrZSB0
aGlzIHJlZmxvdyB3aWR0aCB0cmFuc2Zvcm0gaW52YXJpYW50IGp1c3QgdXNlCisgICAgICAgIC8v
IHRyYW5zZm9ybWVkQWN0dWFsVmlzaWJsZVNpemUoKSBoZXJlIGluc3RlYWQhCisgICAgICAgIHJl
dHVybiBhY3R1YWxWaXNpYmxlU2l6ZSgpLndpZHRoKCk7CisgICAgfQorCisgICAgLy8gVGhlc2Ug
bWV0aG9kcyBnaXZlIHRoZSByZWFsIGdlb21ldHJ5IG9mIHRoZSBkZXZpY2UgZ2l2ZW4gdGhlIGN1
cnJlbnRseSBzZXQgdHJhbnNmb3JtLgorICAgIFdlYkNvcmU6OkludFBvaW50IHRyYW5zZm9ybWVk
U2Nyb2xsUG9zaXRpb24oKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRQb2ludCB0cmFuc2Zvcm1l
ZE1heGltdW1TY3JvbGxQb3NpdGlvbigpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFNpemUgdHJh
bnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSgpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFNpemUg
dHJhbnNmb3JtZWRWaWV3cG9ydFNpemUoKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IHRy
YW5zZm9ybWVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFNp
emUgdHJhbnNmb3JtZWRDb250ZW50c1NpemUoKSBjb25zdDsKKworICAgIC8vIEdlbmVyaWMgY29u
dmVyc2lvbnMgb2YgcG9pbnRzLCByZWN0cywgcmVsYXRpdmUgdG8gYW5kIGZyb20gY29udGVudHMg
YW5kIHZpZXdwb3J0LgorICAgIFdlYkNvcmU6OkludFBvaW50IG1hcEZyb21Db250ZW50c1RvVmll
d3BvcnQoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRQ
b2ludCBtYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKGNvbnN0IFdlYkNvcmU6OkludFBvaW50Jikg
Y29uc3Q7CisgICAgV2ViQ29yZTo6SW50UmVjdCBtYXBGcm9tQ29udGVudHNUb1ZpZXdwb3J0KGNv
bnN0IFdlYkNvcmU6OkludFJlY3QmKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IG1hcEZy
b21WaWV3cG9ydFRvQ29udGVudHMoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYpIGNvbnN0OworCisg
ICAgLy8gR2VuZXJpYyBjb252ZXJzaW9ucyBvZiBwb2ludHMsIHJlY3RzLCByZWxhdGl2ZSB0byBh
bmQgZnJvbSB0cmFuc2Zvcm1lZCBjb250ZW50cyBhbmQgdHJhbnNmb3JtZWQgdmlld3BvcnQuCisg
ICAgV2ViQ29yZTo6SW50UG9pbnQgbWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RyYW5zZm9y
bWVkVmlld3BvcnQoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmKSBjb25zdDsKKyAgICBXZWJDb3Jl
OjpJbnRQb2ludCBtYXBGcm9tVHJhbnNmb3JtZWRWaWV3cG9ydFRvVHJhbnNmb3JtZWRDb250ZW50
cyhjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFJlY3Qg
bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQoY29uc3QgV2Vi
Q29yZTo6SW50UmVjdCYpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFJlY3QgbWFwRnJvbVRyYW5z
Zm9ybWVkVmlld3BvcnRUb1RyYW5zZm9ybWVkQ29udGVudHMoY29uc3QgV2ViQ29yZTo6SW50UmVj
dCYpIGNvbnN0OworCisgICAgLy8gR2VuZXJpYyBjb252ZXJzaW9ucyBvZiBwb2ludHMsIHJlY3Rz
LCBhbmQgc2l6ZXMgdG8gYW5kIGZyb20gdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMuCisgICAgV2Vi
Q29yZTo6SW50UG9pbnQgbWFwVG9UcmFuc2Zvcm1lZChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYp
IGNvbnN0OworICAgIFdlYkNvcmU6OkZsb2F0UG9pbnQgbWFwVG9UcmFuc2Zvcm1lZEZsb2F0UG9p
bnQoY29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludCYpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFBv
aW50IG1hcEZyb21UcmFuc2Zvcm1lZChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYpIGNvbnN0Owor
ICAgIFdlYkNvcmU6OkZsb2F0UG9pbnQgbWFwRnJvbVRyYW5zZm9ybWVkRmxvYXRQb2ludChjb25z
dCBXZWJDb3JlOjpGbG9hdFBvaW50JikgY29uc3Q7CisgICAgV2ViQ29yZTo6RmxvYXRSZWN0IG1h
cEZyb21UcmFuc2Zvcm1lZEZsb2F0UmVjdChjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmKSBjb25z
dDsKKyAgICBXZWJDb3JlOjpJbnRTaXplIG1hcFRvVHJhbnNmb3JtZWQoY29uc3QgV2ViQ29yZTo6
SW50U2l6ZSYpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFNpemUgbWFwRnJvbVRyYW5zZm9ybWVk
KGNvbnN0IFdlYkNvcmU6OkludFNpemUmKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IG1h
cFRvVHJhbnNmb3JtZWQoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYpIGNvbnN0OworICAgIHZvaWQg
Y2xpcFRvVHJhbnNmb3JtZWRDb250ZW50c1JlY3QoV2ViQ29yZTo6SW50UmVjdCYpIGNvbnN0Owor
ICAgIFdlYkNvcmU6OkludFJlY3QgbWFwRnJvbVRyYW5zZm9ybWVkKGNvbnN0IFdlYkNvcmU6Oklu
dFJlY3QmKSBjb25zdDsKKyAgICBib29sIHRyYW5zZm9ybWVkUG9pbnRFcXVhbHNVbnRyYW5zZm9y
bWVkUG9pbnQoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIHRyYW5zZm9ybWVkUG9pbnQsIGNvbnN0
IFdlYkNvcmU6OkludFBvaW50JiB1bnRyYW5zZm9ybWVkUG9pbnQpOworCisgICAgLy8gTm90aWZp
Y2F0aW9uIG1ldGhvZHMgdGhhdCBkZWxpdmVyIGNoYW5nZXMgdG8gdGhlIHJlYWwgZ2VvbWV0cnkg
b2YgdGhlIGRldmljZSBhcyBzcGVjaWZpZWQgYWJvdmUuCisgICAgdm9pZCBub3RpZnlUcmFuc2Zv
cm1DaGFuZ2VkKCk7CisgICAgdm9pZCBub3RpZnlUcmFuc2Zvcm1lZENvbnRlbnRzU2l6ZUNoYW5n
ZWQoKTsKKyAgICB2b2lkIG5vdGlmeVRyYW5zZm9ybWVkU2Nyb2xsQ2hhbmdlZCgpOworCisgICAg
dm9pZCBhc3NpZ25Gb2N1cyhQbGF0Zm9ybTo6Rm9jdXNEaXJlY3Rpb24pOworICAgIGJvb2wgbW92
ZVRvTmV4dEZpZWxkKFBsYXRmb3JtOjpTY3JvbGxEaXJlY3Rpb24sIGludCBkZXNpcmVkU2Nyb2xs
QW1vdW50KTsKKyAgICBib29sIG1vdmVUb05leHRGaWVsZChXZWJDb3JlOjpGcmFtZSosIFBsYXRm
b3JtOjpTY3JvbGxEaXJlY3Rpb24sIGludCBkZXNpcmVkU2Nyb2xsQW1vdW50KTsKKyAgICBQbGF0
Zm9ybTo6SW50UmVjdCBmb2N1c05vZGVSZWN0KCk7CisgICAgV2ViQ29yZTo6SW50UmVjdCBnZXRS
ZWN1cnNpdmVWaXNpYmxlV2luZG93UmVjdChXZWJDb3JlOjpTY3JvbGxWaWV3KiwgYm9vbCBub0Ns
aXBPZk1haW5GcmFtZSA9IGZhbHNlKTsKKworICAgIFdlYkNvcmU6OkludFBvaW50IGZyYW1lT2Zm
c2V0KGNvbnN0IFdlYkNvcmU6OkZyYW1lKikgY29uc3Q7CisKKyAgICBXZWJDb3JlOjpOb2RlKiBi
ZXN0Tm9kZUZvclpvb21VbmRlclBvaW50KGNvbnN0IFdlYkNvcmU6OkludFBvaW50Jik7CisgICAg
V2ViQ29yZTo6Tm9kZSogYmVzdENoaWxkTm9kZUZvckNsaWNrUmVjdChXZWJDb3JlOjpOb2RlKiBw
YXJlbnROb2RlLCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBjbGlja1JlY3QpOworICAgIFdlYkNv
cmU6Ok5vZGUqIG5vZGVGb3Jab29tVW5kZXJQb2ludChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYp
OworICAgIFdlYkNvcmU6Ok5vZGUqIGFkanVzdGVkQmxvY2tab29tTm9kZUZvclpvb21MaW1pdHMo
V2ViQ29yZTo6Tm9kZSopOworICAgIFdlYkNvcmU6OkludFJlY3QgcmVjdEZvck5vZGUoV2ViQ29y
ZTo6Tm9kZSopOworICAgIFdlYkNvcmU6OkludFJlY3QgYmxvY2tab29tUmVjdEZvck5vZGUoV2Vi
Q29yZTo6Tm9kZSopOworICAgIFdlYkNvcmU6OkludFJlY3QgYWRqdXN0UmVjdE9mZnNldEZvckZy
YW1lT2Zmc2V0KGNvbnN0IFdlYkNvcmU6OkludFJlY3QmLCBjb25zdCBXZWJDb3JlOjpOb2RlKik7
CisgICAgYm9vbCBjb21wYXJlTm9kZXNGb3JCbG9ja1pvb20oV2ViQ29yZTo6Tm9kZSogbjEsIFdl
YkNvcmU6Ok5vZGUqIG4yKTsKKyAgICBkb3VibGUgbmV3U2NhbGVGb3JCbG9ja1pvb21SZWN0KGNv
bnN0IFdlYkNvcmU6OkludFJlY3QmLCBkb3VibGUgb2xkU2NhbGUsIGRvdWJsZSBtYXJnaW4pOwor
ICAgIGRvdWJsZSBtYXhCbG9ja1pvb21TY2FsZSgpIGNvbnN0OworCisgICAgLy8gUGx1Z2luIE1l
dGhvZHMuCisgICAgdm9pZCBub3RpZnlQbHVnaW5SZWN0Q2hhbmdlZChpbnQgaWQsIGNvbnN0IFdl
YkNvcmU6OkludFJlY3QmIHJlY3RDaGFuZ2VkKTsKKworICAgIC8vIENvbnRleHQgTWV0aG9kcy4K
KyAgICBBY3RpdmVOb2RlQ29udGV4dCBhY3RpdmVOb2RlQ29udGV4dChUYXJnZXREZXRlY3Rpb25T
dHJhdGVneSk7CisgICAgUGFzc1JlZlB0cjxXZWJDb3JlOjpOb2RlPiBjb250ZXh0Tm9kZShUYXJn
ZXREZXRlY3Rpb25TdHJhdGVneSk7CisKKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9XKQorICAg
IHZvaWQgdG9nZ2xlVGV4dFJlZmxvd0lmVGV4dFJlZmxvd0VuYWJsZWRPbmx5Rm9yQmxvY2tab29t
KGJvb2wgc2hvdWxkRW5hYmxlVGV4dFJlZmxvdyA9IGZhbHNlKTsKKyNlbmRpZgorCisgICAgdm9p
ZCBzZWxlY3Rpb25DaGFuZ2VkKFdlYkNvcmU6OkZyYW1lKik7CisKKyAgICB2b2lkIHVwZGF0ZURl
bGVnYXRlZE92ZXJsYXlzKGJvb2wgZGlzcGF0Y2hlZCA9IGZhbHNlKTsKKworICAgIHZvaWQgdXBk
YXRlQ3Vyc29yKCk7CisKKyAgICB2b2lkIG9uSW5wdXRMb2NhbGVDaGFuZ2VkKGJvb2wgaXNSVEwp
OworCisgICAgVmlld01vZGUgdmlld01vZGUoKSBjb25zdCB7IHJldHVybiBtX3ZpZXdNb2RlOyB9
CisgICAgYm9vbCBzZXRWaWV3TW9kZShWaWV3TW9kZSk7IC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUg
Y2hhbmdlIHJlcXVpcmVzIHJlLWxheW91dC4KKworICAgIHZvaWQgc2V0U2hvdWxkVXNlRml4ZWRE
ZXNrdG9wTW9kZShib29sIGIpIHsgbV9zaG91bGRVc2VGaXhlZERlc2t0b3BNb2RlID0gYjsgfQor
CisgICAgYm9vbCB1c2VGaXhlZExheW91dCgpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFNpemUg
Zml4ZWRMYXlvdXRTaXplKGJvb2wgc25hcFRvSW5jcmVtZW50ID0gZmFsc2UpIGNvbnN0OworCisg
ICAgYm9vbCBkaWRMYXlvdXRFeGNlZWRNYXhpbXVtSXRlcmF0aW9ucygpIGNvbnN0CisgICAgewor
ICAgICAgICAvLyBab29tVG9GaXRPbkxvYWQgY2FuIGxlYWQgdG8gYSBsYXJnZSByZWN1cnNpb24g
ZGVwdGggaW4gRnJhbWVWaWV3OjpsYXlvdXQoKSBhcyB3ZSBhdHRlbXB0CisgICAgICAgIC8vIHRv
IGRldGVybWluZSB0aGUgem9vbSBzY2FsZSBmYWN0b3Igc28gYXMgdG8gaGF2ZSB0aGUgY29udGVu
dCBvZiB0aGUgcGFnZSBmaXQgd2l0aGluIHRoZQorICAgICAgICAvLyBhcmVhIG9mIHRoZSBmcmFt
ZS4gRnJvbSBvYnNlcnZhdGlvbiwgd2UgY2FuIGJhaWwgb3V0IGFmdGVyIGEgcmVjdXJzaW9uIGRl
cHRoIG9mIDEwIGFuZAorICAgICAgICAvLyBzdGlsbCBoYXZlIHJlYXNvbmFibGUgcmVzdWx0cy4K
KyAgICAgICAgcmV0dXJuIG1fbmVzdGVkTGF5b3V0RmluaXNoZWRDb3VudCA+IDEwOworICAgIH0K
KworCisgICAgdm9pZCBjbGVhckZvY3VzTm9kZSgpOworICAgIFdlYkNvcmU6OkZyYW1lKiBmb2N1
c2VkT3JNYWluRnJhbWUoKSBjb25zdDsKKyAgICBXZWJDb3JlOjpGcmFtZSogbWFpbkZyYW1lKCkg
Y29uc3Q7CisKKyAgICBib29sIHNjcm9sbE5vZGVSZWN1cnNpdmVseShXZWJDb3JlOjpOb2RlKiBv
cmlnaW5hbE5vZGUsIGNvbnN0IFdlYkNvcmU6OkludFNpemUmIGRlbHRhKTsKKyAgICBib29sIHNj
cm9sbFJlbmRlcmVyKFdlYkNvcmU6OlJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFdlYkNv
cmU6OkludFNpemUmIGRlbHRhKTsKKyAgICB2b2lkIGFkanVzdFNjcm9sbERlbHRhKGNvbnN0IFdl
YkNvcmU6OkludFBvaW50JiBtYXhPZmZzZXQsIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBjdXJy
ZW50T2Zmc2V0LCBXZWJDb3JlOjpJbnRTaXplJiBkZWx0YSkgY29uc3Q7CisKKyAgICBib29sIGNh
blNjcm9sbFJlbmRlckJveChXZWJDb3JlOjpSZW5kZXJCb3gqKTsKKyAgICBib29sIGNhblNjcm9s
bElubmVyRnJhbWUoV2ViQ29yZTo6RnJhbWUqKSBjb25zdDsKKworI2lmIEVOQUJMRShFVkVOVF9N
T0RFX01FVEFUQUdTKQorICAgIHZvaWQgZGlkUmVjZWl2ZUN1cnNvckV2ZW50TW9kZShXZWJDb3Jl
OjpDdXJzb3JFdmVudE1vZGUpOworICAgIHZvaWQgZGlkUmVjZWl2ZVRvdWNoRXZlbnRNb2RlKFdl
YkNvcmU6OlRvdWNoRXZlbnRNb2RlKTsKKyNlbmRpZgorCisgICAgdm9pZCBkaXNwYXRjaFZpZXdw
b3J0UHJvcGVydGllc0RpZENoYW5nZShjb25zdCBXZWJDb3JlOjpWaWV3cG9ydEFyZ3VtZW50cyYp
OworICAgIFdlYkNvcmU6OkludFNpemUgcmVjb21wdXRlVmlydHVhbFZpZXdwb3J0RnJvbVZpZXdw
b3J0QXJndW1lbnRzKCk7CisKKyAgICB2b2lkIHJlc2V0QmxvY2tab29tKCk7CisKKyAgICB2b2lk
IHpvb21BYm91dFBvaW50VGltZXJGaXJlZChXZWJDb3JlOjpUaW1lcjxXZWJQYWdlUHJpdmF0ZT4q
KTsKKyAgICBib29sIHNob3VsZFNlbmRSZXNpemVFdmVudCgpOworICAgIHZvaWQgc2Nyb2xsRXZl
bnRUaW1lckZpcmVkKFdlYkNvcmU6OlRpbWVyPFdlYlBhZ2VQcml2YXRlPiopOworICAgIHZvaWQg
cmVzaXplRXZlbnRUaW1lckZpcmVkKFdlYkNvcmU6OlRpbWVyPFdlYlBhZ2VQcml2YXRlPiopOwor
CisgICAgLy8gSWYgdGhpcyB1cmwgc2hvdWxkIGJlIGhhbmRsZWQgYXMgYSBwYXR0ZXJuLCByZXR1
cm5zIHRoZSBwYXR0ZXJuCisgICAgLy8gb3RoZXJ3aXNlLCByZXR1cm5zIGFuIGVtcHR5IHN0cmlu
Zy4KKyAgICBXVEY6OlN0cmluZyBmaW5kUGF0dGVyblN0cmluZ0ZvclVybChjb25zdCBXZWJDb3Jl
OjpLVVJMJikgY29uc3Q7CisKKyAgICB2b2lkIHN1c3BlbmRCYWNraW5nU3RvcmUoKTsKKyAgICB2
b2lkIHJlc3VtZUJhY2tpbmdTdG9yZSgpOworCisgICAgdm9pZCBzZXRTaG91bGRSZXNldFRpbGVz
V2hlblNob3duKGJvb2wgZmxhZykgeyBtX3Nob3VsZFJlc2V0VGlsZXNXaGVuU2hvd24gPSBmbGFn
OyB9CisgICAgYm9vbCBzaG91bGRSZXNldFRpbGVzV2hlblNob3duKCkgY29uc3QgeyByZXR1cm4g
bV9zaG91bGRSZXNldFRpbGVzV2hlblNob3duOyB9CisKKyAgICB2b2lkIHNldFNjcmVlbk9yaWVu
dGF0aW9uKGludCk7CisKKyAgICAvLyBTY3JvbGwgYW5kL29yIHpvb20gc28gdGhhdCB0aGUgV2Vi
UGFnZSBmaXRzIHRoZSBuZXcgYWN0dWFsCisgICAgLy8gdmlzaWJsZSBzaXplLgorICAgIHZvaWQg
c2V0Vmlld3BvcnRTaXplKGNvbnN0IFdlYkNvcmU6OkludFNpemUmIHRyYW5zZm9ybWVkQWN0dWFs
VmlzaWJsZVNpemUsIGJvb2wgZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJsZSk7CisgICAgdm9pZCBz
Y3JlZW5Sb3RhdGVkKCk7IC8vIEhlbHBlciBtZXRob2QgZm9yIHNldFZpZXdwb3J0U2l6ZSgpLgor
CisgICAgdm9pZCBzY2hlZHVsZURlZmVycmFibGVUaW1lcihXZWJDb3JlOjpUaW1lcjxXZWJQYWdl
UHJpdmF0ZT4qLCBkb3VibGUgdGltZU91dCk7CisgICAgdm9pZCB1bnNjaGVkdWxlQWxsRGVmZXJy
YWJsZVRpbWVycygpOworICAgIHZvaWQgd2lsbERlZmVyTG9hZGluZygpOworICAgIHZvaWQgZGlk
UmVzdW1lTG9hZGluZygpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBlc2NhcGUga2V5
IGhhbmRsZXIgc2hvdWxkIHpvb20uCisgICAgYm9vbCBzaG91bGRab29tT25Fc2NhcGUoKSBjb25z
dDsKKworICAgIFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4KiB0cmFuc2Zvcm1hdGlvbk1h
dHJpeCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV90cmFuc2Zvcm1hdGlvbk1hdHJp
eDsKKyAgICB9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgLy8gV2Vi
S2l0IHRocmVhZC4KKyAgICBib29sIG5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24o
KTsKKyAgICB2b2lkIHJvb3RMYXllckNvbW1pdFRpbWVyRmlyZWQoV2ViQ29yZTo6VGltZXI8V2Vi
UGFnZVByaXZhdGU+Kik7CisgICAgYm9vbCBjb21taXRSb290TGF5ZXJJZk5lZWRlZCgpOworICAg
IFdlYkNvcmU6OkxheWVyUmVuZGVyaW5nUmVzdWx0cyBsYXN0Q29tcG9zaXRpbmdSZXN1bHRzKCkg
Y29uc3Q7CisKKyAgICAvLyBXZWJLaXQgdGhyZWFkLCBwbHVtYmVkIHRocm91Z2ggZnJvbSBDaHJv
bWVDbGllbnRCbGFja0JlcnJ5LgorICAgIHZvaWQgc2V0Um9vdExheWVyV2ViS2l0VGhyZWFkKFdl
YkNvcmU6OkZyYW1lKiwgV2ViQ29yZTo6TGF5ZXJXZWJLaXRUaHJlYWQqKTsKKyAgICB2b2lkIHNl
dE5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKTsKKyAgICB2b2lkIHNjaGVkdWxl
Um9vdExheWVyQ29tbWl0KCk7CisKKyAgICAvLyBUaHJlYWQgc2FmZS4KKyAgICB2b2lkIHJlc2V0
Q29tcG9zaXRpbmdTdXJmYWNlKCk7CisgICAgdm9pZCBkcmF3TGF5ZXJzT25Db21taXQoKTsgLy8g
SW5jbHVkaW5nIGJhY2tpbmcgc3RvcmUgYmxpdC4KKyAgICBib29sIGRyYXdTdWJMYXllcnMoY29u
c3QgV2ViQ29yZTo6SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgV2ViQ29yZTo6RmxvYXRSZWN0JiBj
b250ZW50cyk7CisgICAgYm9vbCBkcmF3U3ViTGF5ZXJzKCk7IC8vIERyYXcgdGhlbSBhdCBsYXN0
IGtub3duIHBvc2l0aW9uLgorCisgICAgLy8gQ29tcG9zaXRpbmcgdGhyZWFkLgorICAgIHZvaWQg
c2V0Um9vdExheWVyQ29tcG9zaXRpbmdUaHJlYWQoV2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1Ro
cmVhZCopOworICAgIHZvaWQgY29tbWl0Um9vdExheWVyKGNvbnN0IFdlYkNvcmU6OkludFJlY3Qm
LCBjb25zdCBXZWJDb3JlOjpJbnRTaXplJik7CisgICAgdm9pZCBzZXRJc0FjY2VsZXJhdGVkQ29t
cG9zaXRpbmdBY3RpdmUoYm9vbCk7CisgICAgdm9pZCBkZXN0cm95Q29tcG9zaXRvcigpOworICAg
IHZvaWQgc3luY0Rlc3Ryb3lDb21wb3NpdG9yT25Db21wb3NpdGluZ1RocmVhZCgpOworICAgIHZv
aWQgZGVzdHJveUxheWVyUmVzb3VyY2VzKCk7CisgICAgdm9pZCBzdXNwZW5kUm9vdExheWVyQ29t
bWl0KCk7CisgICAgdm9pZCByZXN1bWVSb290TGF5ZXJDb21taXQoKTsKKyAgICB2b2lkIGJsaXRW
aXNpYmxlQ29udGVudHMoKTsKKyNlbmRpZgorCisgICAgYm9vbCBkaXNwYXRjaFRvdWNoRXZlbnRU
b0Z1bGxTY3JlZW5QbHVnaW4oV2ViQ29yZTo6UGx1Z2luVmlldyosIGNvbnN0IFBsYXRmb3JtOjpU
b3VjaEV2ZW50Jik7CisgICAgYm9vbCBkaXNwYXRjaFRvdWNoUG9pbnRBc01vdXNlRXZlbnRUb0Z1
bGxTY3JlZW5QbHVnaW4oV2ViQ29yZTo6UGx1Z2luVmlldyosIGNvbnN0IFBsYXRmb3JtOjpUb3Vj
aFBvaW50Jik7CisgICAgYm9vbCBkaXNwYXRjaE1vdXNlRXZlbnRUb0Z1bGxTY3JlZW5QbHVnaW4o
V2ViQ29yZTo6UGx1Z2luVmlldyosIGNvbnN0IFBsYXRmb3JtOjpNb3VzZUV2ZW50Jik7CisKKyAg
ICBCYWNraW5nU3RvcmVDbGllbnQqIGJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKGNvbnN0IFdl
YkNvcmU6OkZyYW1lKikgY29uc3Q7CisgICAgdm9pZCBhZGRCYWNraW5nU3RvcmVDbGllbnRGb3JG
cmFtZShjb25zdCBXZWJDb3JlOjpGcmFtZSosIEJhY2tpbmdTdG9yZUNsaWVudCopOworICAgIHZv
aWQgcmVtb3ZlQmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUoY29uc3QgV2ViQ29yZTo6RnJhbWUq
KTsKKworICAgIC8vIENsZWFuIHVwIGFueSBkb2N1bWVudCByZWxhdGVkIGRhdGEgd2UgbWlnaHQg
YmUgaG9sZGluZy4KKyAgICB2b2lkIGNsZWFyRG9jdW1lbnREYXRhKGNvbnN0IFdlYkNvcmU6OkRv
Y3VtZW50Kik7CisKKyAgICBzdGF0aWMgV2ViQ29yZTo6UmVuZGVyTGF5ZXIqIGVuY2xvc2luZ1Bv
c2l0aW9uZWRBbmNlc3Rvck9yU2VsZklmUG9zaXRpb25lZChXZWJDb3JlOjpSZW5kZXJMYXllciop
OworICAgIHN0YXRpYyBXZWJDb3JlOjpSZW5kZXJMYXllciogZW5jbG9zaW5nRml4ZWRQb3NpdGlv
bmVkQW5jZXN0b3JPclNlbGZJZkZpeGVkUG9zaXRpb25lZChXZWJDb3JlOjpSZW5kZXJMYXllciop
OworCisgICAgc3RhdGljIFdlYkNvcmU6OkludFNpemUgZGVmYXVsdE1heExheW91dFNpemUoKTsK
KworICAgIFdlYlBhZ2UqIG1fd2ViUGFnZTsKKyAgICBXZWJQYWdlQ2xpZW50KiBtX2NsaWVudDsK
KyAgICBXZWJDb3JlOjpQYWdlKiBtX3BhZ2U7CisgICAgV2ViQ29yZTo6RnJhbWUqIG1fbWFpbkZy
YW1lOworICAgIFJlZlB0cjxXZWJDb3JlOjpOb2RlPiBtX2N1cnJlbnRDb250ZXh0Tm9kZTsKKyAg
ICBXZWJTZXR0aW5ncyogbV93ZWJTZXR0aW5nczsKKworI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RF
QlVHR0VSKQorICAgIE93blB0cjxXZWJDb3JlOjpKYXZhU2NyaXB0RGVidWdnZXJCbGFja0JlcnJ5
PiBtX3NjcmlwdERlYnVnZ2VyOworI2VuZGlmCisKKyAgICBib29sIG1fdmlzaWJsZTsKKyAgICBi
b29sIG1fc2hvdWxkUmVzZXRUaWxlc1doZW5TaG93bjsKKyAgICBzdGF0aWMgVmVjdG9yPFdlYlBh
Z2UqPiogc192aXNpYmxlV2ViUGFnZXM7CisgICAgYm9vbCBtX3VzZXJTY2FsYWJsZTsKKyAgICBi
b29sIG1fdXNlclBlcmZvcm1lZE1hbnVhbFpvb207CisgICAgYm9vbCBtX3VzZXJQZXJmb3JtZWRN
YW51YWxTY3JvbGw7CisgICAgYm9vbCBtX2NvbnRlbnRzU2l6ZUNoYW5nZWQ7CisgICAgYm9vbCBt
X292ZXJmbG93RXhjZWVkc0NvbnRlbnRzU2l6ZTsKKyAgICBib29sIG1fcmVzZXRWaXJ0dWFsVmll
d3BvcnRPbkNvbW1pdHRlZDsKKyAgICBib29sIG1fc2hvdWxkVXNlRml4ZWREZXNrdG9wTW9kZTsK
KyAgICBib29sIG1fbmVlZFRvdWNoRXZlbnRzOworICAgIGludCBtX3ByZXZlbnRJZGxlRGltbWlu
Z0NvdW50OworCisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyAgICBib29sIG1fcHJldmVudERl
ZmF1bHRPblRvdWNoU3RhcnQ7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBtX25lc3RlZExheW91dEZp
bmlzaGVkQ291bnQ7CisgICAgV2ViQ29yZTo6SW50U2l6ZSBtX3ByZXZpb3VzQ29udGVudHNTaXpl
OworICAgIGludCBtX2FjdHVhbFZpc2libGVXaWR0aDsKKyAgICBpbnQgbV9hY3R1YWxWaXNpYmxl
SGVpZ2h0OworICAgIGludCBtX3ZpcnR1YWxWaWV3cG9ydFdpZHRoOworICAgIGludCBtX3ZpcnR1
YWxWaWV3cG9ydEhlaWdodDsKKyAgICBXZWJDb3JlOjpJbnRTaXplIG1fZGVmYXVsdExheW91dFNp
emU7CisgICAgV2ViQ29yZTo6Vmlld3BvcnRBcmd1bWVudHMgbV92aWV3cG9ydEFyZ3VtZW50czsg
Ly8gV2Uga2VlcCB0aGlzIGFyb3VuZCBzaW5jZSB3ZSBtYXkgbmVlZCB0byByZS1ldmFsdWF0ZSB0
aGUgYXJndW1lbnRzIG9uIHJvdGF0aW9uLgorICAgIGJvb2wgbV9kaWRSZXN0b3JlRnJvbVBhZ2VD
YWNoZTsKKyAgICBWaWV3TW9kZSBtX3ZpZXdNb2RlOworICAgIExvYWRTdGF0ZSBtX2xvYWRTdGF0
ZTsKKyAgICBXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCogbV90cmFuc2Zvcm1hdGlvbk1h
dHJpeDsKKyAgICBCYWNraW5nU3RvcmUqIG1fYmFja2luZ1N0b3JlOworICAgIEJhY2tpbmdTdG9y
ZUNsaWVudCogbV9iYWNraW5nU3RvcmVDbGllbnQ7CisgICAgSW5QYWdlU2VhcmNoTWFuYWdlciog
bV9pblBhZ2VTZWFyY2hNYW5hZ2VyOworICAgIElucHV0SGFuZGxlciogbV9pbnB1dEhhbmRsZXI7
CisgICAgU2VsZWN0aW9uSGFuZGxlciogbV9zZWxlY3Rpb25IYW5kbGVyOworICAgIFRvdWNoRXZl
bnRIYW5kbGVyKiBtX3RvdWNoRXZlbnRIYW5kbGVyOworCisjaWYgRU5BQkxFKEVWRU5UX01PREVf
TUVUQVRBR1MpCisgICAgV2ViQ29yZTo6Q3Vyc29yRXZlbnRNb2RlIG1fY3Vyc29yRXZlbnRNb2Rl
OworICAgIFdlYkNvcmU6OlRvdWNoRXZlbnRNb2RlIG1fdG91Y2hFdmVudE1vZGU7CisjZW5kaWYK
KworICAgIFBsYXRmb3JtOjpCbGFja0JlcnJ5Q3Vyc29yIG1fY3VycmVudEN1cnNvcjsKKworICAg
IER1bXBSZW5kZXJUcmVlQ2xpZW50KiBtX2R1bXBSZW5kZXJUcmVlOworCisgICAgZG91YmxlIG1f
aW5pdGlhbFNjYWxlOworICAgIGRvdWJsZSBtX21pbmltdW1TY2FsZTsKKyAgICBkb3VibGUgbV9t
YXhpbXVtU2NhbGU7CisKKyAgICAvLyBCbG9jayB6b29tIGFuaW1hdGlvbiBkYXRhLgorICAgIFdl
YkNvcmU6OkZsb2F0UG9pbnQgbV9maW5hbEJsb2NrUG9pbnQ7CisgICAgV2ViQ29yZTo6RmxvYXRQ
b2ludCBtX2ZpbmFsQmxvY2tQb2ludFJlZmxvd09mZnNldDsKKyAgICBkb3VibGUgbV9ibG9ja1pv
b21GaW5hbFNjYWxlOworICAgIFJlZlB0cjxXZWJDb3JlOjpOb2RlPiBtX2N1cnJlbnRQaW5jaFpv
b21Ob2RlOworICAgIFdlYkNvcmU6OkZsb2F0UG9pbnQgbV9hbmNob3JJbk5vZGVSZWN0UmF0aW87
CisgICAgUmVmUHRyPFdlYkNvcmU6Ok5vZGU+IG1fY3VycmVudEJsb2NrWm9vbU5vZGU7CisgICAg
UmVmUHRyPFdlYkNvcmU6Ok5vZGU+IG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZTsKKyAg
ICBib29sIG1fc2hvdWxkUmVmbG93QmxvY2s7CisKKyAgICAvLyBEZWxheWVkIHpvb21BYm91dFBv
aW50LgorICAgIE93blB0cjxXZWJDb3JlOjpUaW1lcjxXZWJQYWdlUHJpdmF0ZT4gPiBtX2RlbGF5
ZWRab29tVGltZXI7CisgICAgc3RydWN0IHsKKyAgICAgICAgZG91YmxlIHNjYWxlOworICAgICAg
ICBXZWJDb3JlOjpGbG9hdFBvaW50IGFuY2hvcjsKKyAgICAgICAgYm9vbCBlbmZvcmNlU2NhbGVD
bGFtcGluZzsKKyAgICAgICAgYm9vbCBmb3JjZVJlbmRlcmluZzsKKyAgICB9IG1fZGVsYXllZFpv
b21Bcmd1bWVudHM7CisKKyAgICBkb3VibGUgbV9sYXN0VXNlckV2ZW50VGltZXN0YW1wOyAvLyBV
c2VkIHRvIGRldGVjdCB1c2VyIHNjcm9sbGluZy4KKworICAgIFdlYkNvcmU6OlBsYXRmb3JtTW91
c2VFdmVudCBtX2xhc3RNb3VzZUV2ZW50OworICAgIGJvb2wgbV9wbHVnaW5Nb3VzZUJ1dHRvblBy
ZXNzZWQ7IC8vIFVzZWQgdG8gdHJhY2sgbW91c2UgYnV0dG9uIGZvciBmdWxsIHNjcmVlbiBwbHVn
aW5zLgorICAgIGJvb2wgbV9wbHVnaW5NYXlPcGVuTmV3VGFiOworCisgICAgV2ViQ29yZTo6R2Vv
bG9jYXRpb25Db250cm9sbGVyQ2xpZW50QmxhY2tCZXJyeSogbV9nZW9sb2NhdGlvbkNsaWVudDsK
KworICAgIEhhc2hTZXQ8V2ViQ29yZTo6UGx1Z2luVmlldyo+IG1fcGx1Z2luVmlld3M7CisKKyAg
ICBSZWZQdHI8V2ViQ29yZTo6Tm9kZT4gbV9pblJlZ2lvblNjcm9sbFN0YXJ0aW5nTm9kZTsKKwor
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBib29sIG1faXNBY2NlbGVyYXRl
ZENvbXBvc2l0aW5nQWN0aXZlOworICAgIE93blB0cjxGcmFtZUxheWVycz4gbV9mcmFtZUxheWVy
czsgLy8gV2ViS2l0IHRocmVhZCBvbmx5LgorICAgIE93blB0cjxXZWJQYWdlQ29tcG9zaXRvcj4g
bV9jb21wb3NpdG9yOyAvLyBDb21wb3NpdGluZyB0aHJlYWQgb25seS4KKyAgICBPd25QdHI8V2Vi
Q29yZTo6VGltZXI8V2ViUGFnZVByaXZhdGU+ID4gbV9yb290TGF5ZXJDb21taXRUaW1lcjsKKyAg
ICBib29sIG1fbmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbjsKKyAgICBib29sIG1f
bmVlZHNDb21taXQ7CisgICAgYm9vbCBtX3N1c3BlbmRSb290TGF5ZXJDb21taXQ7CisjZW5kaWYK
KworICAgIGludCBtX3BlbmRpbmdPcmllbnRhdGlvbjsKKworICAgIFJlZlB0cjxXZWJDb3JlOjpO
b2RlPiBtX2Z1bGxzY3JlZW5WaWRlb05vZGU7CisgICAgUmVmUHRyPFdlYkNvcmU6OlBsdWdpblZp
ZXc+IG1fZnVsbFNjcmVlblBsdWdpblZpZXc7CisgICAgQmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJh
bWVNYXAgbV9iYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZU1hcDsKKworICAgIC8vIFdlYlNldHRp
bmdzRGVsZWdhdGUgbWV0aG9kcy4KKyAgICB2aXJ0dWFsIHZvaWQgZGlkQ2hhbmdlU2V0dGluZ3Mo
V2ViU2V0dGluZ3MqKTsKKworICAgIFJlZlB0cjxXZWJDb3JlOjpET01XcmFwcGVyV29ybGQ+IG1f
aXNvbGF0ZWRXb3JsZDsKKyAgICBib29sIG1faGFzSW5SZWdpb25TY3JvbGxhYmxlQXJlYXM7Cisg
ICAgYm9vbCBtX3VwZGF0ZURlbGVnYXRlZE92ZXJsYXlzRGlzcGF0Y2hlZDsKKworfTsKK30KK30K
KworI2VuZGlmIC8vIFdlYlBhZ2VfcF9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128226</attachid>
            <date>2012-02-22 09:02:49 -0800</date>
            <delta_ts>2012-02-22 12:00:56 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74380-20120222120221.patch</filename>
            <type>text/plain</type>
            <size>245857</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4NTA1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Js
YWNrYmVycnkvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0NoYW5nZUxvZwpp
bmRleCBmNDVjMjAzMGIyZGU2ZjlhZDliYzVhMDUyNjJjYWY1MzhjNjAzZGIzLi41MDg0MjI2YjM3
NWJjOTgyOWNjMDMwZTc4NmUzYTU1NWExZmU0OWJhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
L2JsYWNrYmVycnkvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9DaGFu
Z2VMb2cKQEAgLTEsMyArMSwxNiBAQAorMjAxMi0wMi0yMiAgSmFja3kgSmlhbmcgIDx6aGFqaWFu
Z0ByaW0uY29tPgorCisgICAgICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBCbGFja0JlcnJ5IEFQ
SSB3ZWIgcGFnZSByZWxhdGVkIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD03NDM4MAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KKworICAgICAg
ICAqIEFwaS9XZWJQYWdlLmNwcDogQWRkZWQuCisgICAgICAgICogQXBpL1dlYlBhZ2UuaDogQWRk
ZWQuCisgICAgICAgICogQXBpL1dlYlBhZ2VfcC5oOiBBZGRlZC4KKwogMjAxMi0wMi0yMiAgUnlv
c3VrZSBOaXdhICA8cm5pd2FAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZW1vdmUgdGhlIHJlbWFp
bmluZyB1c2VzIG9mIENTU1N0eWxlRGVjbGFyYXRpb24gaW4gRWRpdG9yCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQXBpL1dlYlBhZ2UuY3BwIGIvU291cmNlL1dlYktpdC9i
bGFja2JlcnJ5L0FwaS9XZWJQYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41MzViMWZiMDkzZmU5Yzg2ZGI1
MGU5NGQ0NGNjNTQ1MTc1OTJhZjMxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9i
bGFja2JlcnJ5L0FwaS9XZWJQYWdlLmNwcApAQCAtMCwwICsxLDU2NTUgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0
ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUg
RnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIldlYlBhZ2UuaCIKKworI2luY2x1ZGUgIkFwcGxpY2F0aW9u
Q2FjaGVTdG9yYWdlLmgiCisjaW5jbHVkZSAiQmFja0ZvcndhcmRDb250cm9sbGVyLmgiCisjaW5j
bHVkZSAiQmFja0ZvcndhcmRMaXN0SW1wbC5oIgorI2luY2x1ZGUgIkJhY2tpbmdTdG9yZUNsaWVu
dC5oIgorI2luY2x1ZGUgIkJhY2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZS5oIgorI2luY2x1
ZGUgIkJhY2tpbmdTdG9yZV9wLmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIkNh
Y2hlZEltYWdlLmgiCisjaW5jbHVkZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAiQ2hyb21lQ2xpZW50
QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51Q2xpZW50QmxhY2tCZXJyeS5oIgor
I2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJET01TdXBwb3J0LmgiCisjaW5j
bHVkZSAiRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJEYXRhYmFzZVN5bmMuaCIKKyNpbmNsdWRlICJE
YXRhYmFzZVRyYWNrZXIuaCIKKyNpbmNsdWRlICJEZXZpY2VNb3Rpb25DbGllbnRCbGFja0JlcnJ5
LmgiCisjaW5jbHVkZSAiRGV2aWNlT3JpZW50YXRpb25DbGllbnRCbGFja0JlcnJ5LmgiCisjaW5j
bHVkZSAiRHJhZ0NsaWVudEJsYWNrQmVycnkuaCIKKy8vIEZJWE1FOiBXZSBzaG91bGQgYmUgdXNp
bmcgRHVtcFJlbmRlclRyZWVDbGllbnQsIGJ1dCBJJ20gbm90IHN1cmUgd2hlcmUgd2Ugc2hvdWxk
CisvLyBjcmVhdGUgdGhlIERSVF9CQiBvYmplY3QuIFNlZSBQUiAjMTIwMzU1LgorI2lmIEVOQUJM
RV9EUlQKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZUJsYWNrQmVycnkuaCIKKyNlbmRpZgorI2lu
Y2x1ZGUgIkVkaXRvckNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJGb2N1c0NvbnRyb2xs
ZXIuaCIKKyNpbmNsdWRlICJGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuaCIKKyNpZiBFTkFC
TEUoQ0xJRU5UX0JBU0VEX0dFT0xPQ0FUSU9OKQorI2lmIEVOQUJMRV9EUlQKKyNpbmNsdWRlICJH
ZW9sb2NhdGlvbkNsaWVudE1vY2suaCIKKyNlbmRpZgorI2luY2x1ZGUgIkdlb2xvY2F0aW9uQ29u
dHJvbGxlckNsaWVudEJsYWNrQmVycnkuaCIKKyNlbmRpZgorI2luY2x1ZGUgIkdyb3VwU2V0dGlu
Z3MuaCIKKyNpbmNsdWRlICJIVE1MQXJlYUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MRnJhbWVP
d25lckVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MSW1hZ2VFbGVtZW50LmgiCisjaW5jbHVkZSAi
SFRNTElucHV0RWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhU
TUxQYXJzZXJJZGlvbXMuaCIKKyNpbmNsdWRlICJIVFRQUGFyc2Vycy5oIgorI2luY2x1ZGUgIkhp
c3RvcnlJdGVtLmgiCisjaW5jbHVkZSAiSWNvbkRhdGFiYXNlQ2xpZW50QmxhY2tCZXJyeS5oIgor
I2luY2x1ZGUgIkluUGFnZVNlYXJjaE1hbmFnZXIuaCIKKyNpbmNsdWRlICJJblJlZ2lvblNjcm9s
bGFibGVBcmVhLmgiCisjaW5jbHVkZSAiSW5wdXRIYW5kbGVyLmgiCisjaW5jbHVkZSAiSW5zcGVj
dG9yQmFja2VuZERpc3BhdGNoZXIuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDbGllbnRCbGFja0Jl
cnJ5LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkphdmFT
Y3JpcHREZWJ1Z2dlckJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJMYXllcldlYktpdFRocmVhZC5o
IgorI2luY2x1ZGUgIk5ldHdvcmtNYW5hZ2VyLmgiCisjaW5jbHVkZSAiTm9kZVJlbmRlclN0eWxl
LmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBhZ2VDYWNoZS5oIgorI2luY2x1ZGUg
IlBhZ2VHcm91cC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtVG91Y2hFdmVudC5oIgorI2luY2x1ZGUg
IlBsYXRmb3JtV2hlZWxFdmVudC5oIgorI2luY2x1ZGUgIlBsdWdpbkRhdGFiYXNlLmgiCisjaW5j
bHVkZSAiUGx1Z2luVmlldy5oIgorI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKKyNpbmNsdWRlICJS
ZW5kZXJUaGVtZUJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJSZW5kZXJUcmVlQXNUZXh0LmgiCisj
aW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlJlbmRlcldpZGdldC5oIgorI2luY2x1
ZGUgIlNjcmlwdFNvdXJjZUNvZGUuaCIKKyNpbmNsdWRlICJTY3JpcHRWYWx1ZS5oIgorI2luY2x1
ZGUgIlNjcm9sbFR5cGVzLmgiCisjaW5jbHVkZSAiU2VsZWN0aW9uSGFuZGxlci5oIgorI2luY2x1
ZGUgIlNldHRpbmdzLmgiCisjaW5jbHVkZSAiU3RvcmFnZS5oIgorI2luY2x1ZGUgIlN0b3JhZ2VO
YW1lc3BhY2UuaCIKKyNpbmNsdWRlICJTdXJmYWNlUG9vbC5oIgorI2luY2x1ZGUgIlRleHQuaCIK
KyNpbmNsdWRlICJUaHJlYWRDaGVjay5oIgorI2luY2x1ZGUgIlRvdWNoRXZlbnRIYW5kbGVyLmgi
CisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRlICJWaXNpYmxlUG9z
aXRpb24uaCIKKyNpZiBFTkFCTEUoV0VCRE9NKQorI2luY2x1ZGUgIldlYkRPTURvY3VtZW50Lmgi
CisjZW5kaWYKKyNpbmNsdWRlICJXZWJQYWdlQ2xpZW50LmgiCisjaW5jbHVkZSAiV2ViU29ja2V0
LmgiCisjaW5jbHVkZSAibnBhcGkuaCIKKyNpbmNsdWRlICJydW50aW1lX3Jvb3QuaCIKKworI2lm
IEVOQUJMRShWSURFTykKKyNpbmNsdWRlICJIVE1MTWVkaWFFbGVtZW50LmgiCisjaW5jbHVkZSAi
TWVkaWFQbGF5ZXIuaCIKKyNpbmNsdWRlICJNZWRpYVBsYXllclByaXZhdGVCbGFja0JlcnJ5Lmgi
CisjZW5kaWYKKworI2lmIFVTRShTS0lBKQorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEu
aCIKKyNlbmRpZgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2luY2x1ZGUg
IkZyYW1lTGF5ZXJzLmgiCisjaW5jbHVkZSAiV2ViUGFnZUNvbXBvc2l0b3IuaCIKKyNlbmRpZgor
CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtRXhlY3V0YWJsZU1lc3NhZ2UuaD4KKyNpbmNs
dWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1JVFBvbGljeS5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQ
bGF0Zm9ybUtleWJvYXJkRXZlbnQuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1NZXNz
YWdlQ2xpZW50Lmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTW91c2VFdmVudC5oPgor
I2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVNjcmVlbi5oPgorI2luY2x1ZGUgPEJsYWNrQmVy
cnlQbGF0Zm9ybVNldHRpbmdzLmg+CisjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvQVBJQ2FzdC5o
PgorI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pTQ29udGV4dFJlZi5oPgorI2luY2x1ZGUgPFNo
YXJlZFBvaW50ZXIuaD4KKyNpbmNsdWRlIDxzeXMva2V5Y29kZXMuaD4KKyNpbmNsdWRlIDx1bmlj
b2RlL3VzdHJpbmcuaD4gLy8gcGxhdGZvcm0gSUNVCisKKyNpZm5kZWYgVVNFUl9QUk9DRVNTRVMK
KyNpbmNsdWRlIDxtZW1hbGxvYy5oPgorI2VuZGlmCisKKyNpZiBFTkFCTEUoU0tJQV9HUFVfQ0FO
VkFTKQorI2luY2x1ZGUgIkJsYWNrQmVycnlQbGF0Zm9ybUdyYXBoaWNzLmgiCisjaW5jbHVkZSAi
R3JDb250ZXh0LmgiCisjZW5kaWYKKworI2RlZmluZSBERUJVR19CTE9DS19aT09NIDAKKyNkZWZp
bmUgREVCVUdfVE9VQ0hfRVZFTlRTIDAKKyNkZWZpbmUgREVCVUdfV0VCUEFHRV9MT0FEIDAKKwor
dXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCit0eXBlZGVm
IGNvbnN0IHVuc2lnbmVkIHNob3J0KiBDVVNob3J0UHRyOworCituYW1lc3BhY2UgQmxhY2tCZXJy
eSB7CituYW1lc3BhY2UgV2ViS2l0IHsKKworVmVjdG9yPFdlYlBhZ2UqPiogV2ViUGFnZVByaXZh
dGU6OnNfdmlzaWJsZVdlYlBhZ2VzID0gMDsgLy8gSW5pdGlhbGx5LCBubyB3ZWIgcGFnZSBpcyB2
aXNpYmxlLgorCitzdGF0aWMgVmVjdG9yPFdlYlBhZ2UqPiogdmlzaWJsZVdlYlBhZ2VzKCkKK3sK
KyAgICBpZiAoIVdlYlBhZ2VQcml2YXRlOjpzX3Zpc2libGVXZWJQYWdlcykKKyAgICAgICAgV2Vi
UGFnZVByaXZhdGU6OnNfdmlzaWJsZVdlYlBhZ2VzID0gbmV3IFZlY3RvcjxXZWJQYWdlKj47Cisg
ICAgcmV0dXJuIFdlYlBhZ2VQcml2YXRlOjpzX3Zpc2libGVXZWJQYWdlczsKK30KKworY29uc3Qg
dW5zaWduZWQgYmxvY2tab29tTWFyZ2luID0gMzsgLy8gQWRkIDMgcGl4ZWwgbWFyZ2luIG9uIGVh
Y2ggc2lkZS4KK3N0YXRpYyBpbnQgYmxvY2tDbGlja1JhZGl1cyA9IDA7CitzdGF0aWMgZG91Ymxl
IG1heGltdW1CbG9ja1pvb21TY2FsZSA9IDMuMDsgLy8gVGhpcyBzY2FsZSBjYW4gYmUgY2xhbXBl
ZCBieSB0aGUgbWF4aW11bVNjYWxlIHNldCBmb3IgdGhlIHBhZ2UuCisKK2NvbnN0IGRvdWJsZSBt
YW51YWxTY3JvbGxJbnRlcnZhbCA9IDAuMTsgLy8gVGhlIHRpbWUgaW50ZXJ2YWwgZHVyaW5nIHdo
aWNoIHdlIGFzc29jaWF0ZSB1c2VyIGFjdGlvbiB3aXRoIHNjcm9sbGluZy4KKworY29uc3QgZG91
YmxlIGRlbGF5ZWRab29tSW50ZXJ2YWwgPSAwLjA7CisKK2NvbnN0IEludFNpemUgbWluaW11bUxh
eW91dFNpemUoMTAsIDEwKTsgLy8gTmVlZHMgdG8gYmUgYSBzbWFsbCBzaXplLCBncmVhdGVyIHRo
YW4gMCwgdGhhdCB3ZSBjYW4gZ3JvdyB0aGUgbGF5b3V0IGZyb20uCitjb25zdCBJbnRTaXplIG1h
eGltdW1MYXlvdXRTaXplKDEwMDAwLCAxMDAwMCk7IC8vIFVzZWQgd2l0aCB2aWV3cG9ydCBtZXRh
IHRhZywgYnV0IHdlIGNhbiBzdGlsbCBncm93IGZyb20gdGhpcyBvZiBjb3Vyc2UuCisKK2NvbnN0
IGRvdWJsZSBtaW5pbXVtRXhwYW5kaW5nUmF0aW8gPSAwLjE1OworCisvLyBIZWxwZXIgZnVuY3Rp
b24gdG8gcGFyc2UgYSBVUkwgYW5kIGZpbGwgaW4gbWlzc2luZyBwYXJ0cy4KK3N0YXRpYyBLVVJM
IHBhcnNlVXJsKGNvbnN0IFN0cmluZyYgdXJsKQoreworICAgIFN0cmluZyB1cmxTdHJpbmcodXJs
KTsKKyAgICBLVVJMIGt1cmwgPSBLVVJMKEtVUkwoKSwgdXJsU3RyaW5nKTsKKyAgICBpZiAoa3Vy
bC5wcm90b2NvbCgpLmlzRW1wdHkoKSkgeworICAgICAgICB1cmxTdHJpbmcuaW5zZXJ0KCJodHRw
Oi8vIiwgMCk7CisgICAgICAgIGt1cmwgPSBLVVJMKEtVUkwoKSwgdXJsU3RyaW5nKTsKKyAgICB9
CisKKyAgICByZXR1cm4ga3VybDsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9ucyB0byBjb252ZXJ0
IHRvIGFuZCBmcm9tIFdlYkNvcmUgdHlwZXMuCitzdGF0aWMgaW5saW5lIE1vdXNlRXZlbnRUeXBl
IHRvV2ViQ29yZU1vdXNlRXZlbnRUeXBlKGNvbnN0IFBsYXRmb3JtOjpNb3VzZUV2ZW50OjpUeXBl
IHR5cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBQbGF0Zm9ybTo6TW91c2VF
dmVudDo6TW91c2VCdXR0b25Eb3duOgorICAgICAgICByZXR1cm4gTW91c2VFdmVudFByZXNzZWQ7
CisgICAgY2FzZSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6TW91c2VCdXR0b25VcDoKKyAgICAgICAg
cmV0dXJuIE1vdXNlRXZlbnRSZWxlYXNlZDsKKyAgICBjYXNlIFBsYXRmb3JtOjpNb3VzZUV2ZW50
OjpNb3VzZU1vdmU6CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE1vdXNlRXZlbnRNb3Zl
ZDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgUmVzb3VyY2VSZXF1ZXN0Q2FjaGVQb2xpY3kg
dG9XZWJDb3JlQ2FjaGVQb2xpY3koUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpDYWNoZVBvbGlj
eSBwb2xpY3kpCit7CisgICAgc3dpdGNoIChwb2xpY3kpIHsKKyAgICBjYXNlIFBsYXRmb3JtOjpO
ZXR3b3JrUmVxdWVzdDo6VXNlUHJvdG9jb2xDYWNoZVBvbGljeToKKyAgICAgICAgcmV0dXJuIFVz
ZVByb3RvY29sQ2FjaGVQb2xpY3k7CisgICAgY2FzZSBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6
OlJlbG9hZElnbm9yaW5nQ2FjaGVEYXRhOgorICAgICAgICByZXR1cm4gUmVsb2FkSWdub3JpbmdD
YWNoZURhdGE7CisgICAgY2FzZSBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OlJldHVybkNhY2hl
RGF0YUVsc2VMb2FkOgorICAgICAgICByZXR1cm4gUmV0dXJuQ2FjaGVEYXRhRWxzZUxvYWQ7Cisg
ICAgY2FzZSBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OlJldHVybkNhY2hlRGF0YURvbnRMb2Fk
OgorICAgICAgICByZXR1cm4gUmV0dXJuQ2FjaGVEYXRhRG9udExvYWQ7CisgICAgZGVmYXVsdDoK
KyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBVc2VQcm90b2Nv
bENhY2hlUG9saWN5OworICAgIH0KK30KKworI2lmIEVOQUJMRShFVkVOVF9NT0RFX01FVEFUQUdT
KQorc3RhdGljIGlubGluZSBQbGF0Zm9ybTo6Q3Vyc29yRXZlbnRNb2RlIHRvUGxhdGZvcm1DdXJz
b3JFdmVudE1vZGUoQ3Vyc29yRXZlbnRNb2RlIG1vZGUpCit7CisgICAgc3dpdGNoIChtb2RlKSB7
CisgICAgY2FzZSBQcm9jZXNzZWRDdXJzb3JFdmVudHM6CisgICAgICAgIHJldHVybiBQbGF0Zm9y
bTo6UHJvY2Vzc2VkQ3Vyc29yRXZlbnRzOworICAgIGNhc2UgTmF0aXZlQ3Vyc29yRXZlbnRzOgor
ICAgICAgICByZXR1cm4gUGxhdGZvcm06Ok5hdGl2ZUN1cnNvckV2ZW50czsKKyAgICBkZWZhdWx0
OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIFBsYXRmb3Jt
OjpQcm9jZXNzZWRDdXJzb3JFdmVudHM7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIFBsYXRm
b3JtOjpUb3VjaEV2ZW50TW9kZSB0b1BsYXRmb3JtVG91Y2hFdmVudE1vZGUoVG91Y2hFdmVudE1v
ZGUgbW9kZSkKK3sKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIFByb2Nlc3NlZFRvdWNo
RXZlbnRzOgorICAgICAgICByZXR1cm4gUGxhdGZvcm06OlByb2Nlc3NlZFRvdWNoRXZlbnRzOwor
ICAgIGNhc2UgTmF0aXZlVG91Y2hFdmVudHM6CisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6TmF0
aXZlVG91Y2hFdmVudHM7CisgICAgY2FzZSBQdXJlVG91Y2hFdmVudHNXaXRoTW91c2VDb252ZXJz
aW9uOgorICAgICAgICByZXR1cm4gUGxhdGZvcm06OlB1cmVUb3VjaEV2ZW50c1dpdGhNb3VzZUNv
bnZlcnNpb247CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgICAgIHJldHVybiBQbGF0Zm9ybTo6UHJvY2Vzc2VkVG91Y2hFdmVudHM7CisgICAgfQorfQor
I2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgSGlzdG9yeUl0ZW0qIGhpc3RvcnlJdGVtRnJvbUJhY2tG
b3J3YXJkSWQoV2ViUGFnZTo6QmFja0ZvcndhcmRJZCBpZCkKK3sKKyAgICByZXR1cm4gcmVpbnRl
cnByZXRfY2FzdDxIaXN0b3J5SXRlbSo+KGlkKTsKK30KKworc3RhdGljIGlubGluZSBXZWJQYWdl
OjpCYWNrRm9yd2FyZElkIGJhY2tGb3J3YXJkSWRGcm9tSGlzdG9yeUl0ZW0oSGlzdG9yeUl0ZW0q
IGl0ZW0pCit7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8V2ViUGFnZTo6QmFja0Zvcndh
cmRJZD4oaXRlbSk7Cit9CisKK1dlYlBhZ2VQcml2YXRlOjpXZWJQYWdlUHJpdmF0ZShXZWJQYWdl
KiB3ZWJQYWdlLCBXZWJQYWdlQ2xpZW50KiBjbGllbnQsIGNvbnN0IEludFJlY3QmIHJlY3QpCisg
ICAgOiBtX3dlYlBhZ2Uod2ViUGFnZSkKKyAgICAsIG1fY2xpZW50KGNsaWVudCkKKyAgICAsIG1f
cGFnZSgwKSAvLyBJbml0aWFsaXplZCBieSBpbml0LgorICAgICwgbV9tYWluRnJhbWUoMCkgLy8g
SW5pdGlhbGl6ZWQgYnkgaW5pdC4KKyAgICAsIG1fY3VycmVudENvbnRleHROb2RlKDApCisgICAg
LCBtX3dlYlNldHRpbmdzKDApIC8vIEluaXRpYWxpemVkIGJ5IGluaXQuCisgICAgLCBtX3Zpc2li
bGUoZmFsc2UpCisgICAgLCBtX3Nob3VsZFJlc2V0VGlsZXNXaGVuU2hvd24oZmFsc2UpCisgICAg
LCBtX3VzZXJTY2FsYWJsZSh0cnVlKQorICAgICwgbV91c2VyUGVyZm9ybWVkTWFudWFsWm9vbShm
YWxzZSkKKyAgICAsIG1fdXNlclBlcmZvcm1lZE1hbnVhbFNjcm9sbChmYWxzZSkKKyAgICAsIG1f
Y29udGVudHNTaXplQ2hhbmdlZChmYWxzZSkKKyAgICAsIG1fb3ZlcmZsb3dFeGNlZWRzQ29udGVu
dHNTaXplKGZhbHNlKQorICAgICwgbV9yZXNldFZpcnR1YWxWaWV3cG9ydE9uQ29tbWl0dGVkKHRy
dWUpCisgICAgLCBtX3Nob3VsZFVzZUZpeGVkRGVza3RvcE1vZGUoZmFsc2UpCisgICAgLCBtX25l
ZWRUb3VjaEV2ZW50cyhmYWxzZSkKKyAgICAsIG1fcHJldmVudElkbGVEaW1taW5nQ291bnQoMCkK
KyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorICAgICwgbV9wcmV2ZW50RGVmYXVsdE9uVG91Y2hT
dGFydChmYWxzZSkKKyNlbmRpZgorICAgICwgbV9uZXN0ZWRMYXlvdXRGaW5pc2hlZENvdW50KDAp
CisgICAgLCBtX2FjdHVhbFZpc2libGVXaWR0aChyZWN0LndpZHRoKCkpCisgICAgLCBtX2FjdHVh
bFZpc2libGVIZWlnaHQocmVjdC5oZWlnaHQoKSkKKyAgICAsIG1fdmlydHVhbFZpZXdwb3J0V2lk
dGgoMCkKKyAgICAsIG1fdmlydHVhbFZpZXdwb3J0SGVpZ2h0KDApCisgICAgLCBtX2RlZmF1bHRM
YXlvdXRTaXplKG1pbmltdW1MYXlvdXRTaXplKQorICAgICwgbV9kaWRSZXN0b3JlRnJvbVBhZ2VD
YWNoZShmYWxzZSkKKyAgICAsIG1fdmlld01vZGUoV2ViUGFnZVByaXZhdGU6OkRlc2t0b3ApIC8v
IERlZmF1bHQgdG8gRGVza3RvcCBtb2RlIGZvciBQQi4KKyAgICAsIG1fbG9hZFN0YXRlKFdlYlBh
Z2VQcml2YXRlOjpOb25lKQorICAgICwgbV90cmFuc2Zvcm1hdGlvbk1hdHJpeChuZXcgVHJhbnNm
b3JtYXRpb25NYXRyaXgoKSkKKyAgICAsIG1fYmFja2luZ1N0b3JlKDApIC8vIEluaXRpYWxpemVk
IGJ5IGluaXQuCisgICAgLCBtX2JhY2tpbmdTdG9yZUNsaWVudCgwKSAvLyBJbml0aWFsaXplZCBi
eSBpbml0LgorICAgICwgbV9pblBhZ2VTZWFyY2hNYW5hZ2VyKG5ldyBJblBhZ2VTZWFyY2hNYW5h
Z2VyKHRoaXMpKQorICAgICwgbV9pbnB1dEhhbmRsZXIobmV3IElucHV0SGFuZGxlcih0aGlzKSkK
KyAgICAsIG1fc2VsZWN0aW9uSGFuZGxlcihuZXcgU2VsZWN0aW9uSGFuZGxlcih0aGlzKSkKKyAg
ICAsIG1fdG91Y2hFdmVudEhhbmRsZXIobmV3IFRvdWNoRXZlbnRIYW5kbGVyKHRoaXMpKQorI2lm
IEVOQUJMRShFVkVOVF9NT0RFX01FVEFUQUdTKQorICAgICwgbV9jdXJzb3JFdmVudE1vZGUoUHJv
Y2Vzc2VkQ3Vyc29yRXZlbnRzKQorICAgICwgbV90b3VjaEV2ZW50TW9kZShQcm9jZXNzZWRUb3Vj
aEV2ZW50cykKKyNlbmRpZgorICAgICwgbV9jdXJyZW50Q3Vyc29yKFBsYXRmb3JtOjpDdXJzb3JO
b25lKQorICAgICwgbV9kdW1wUmVuZGVyVHJlZSgwKSAvLyBMYXp5IGluaXRpYWxpemF0aW9uLgor
ICAgICwgbV9pbml0aWFsU2NhbGUoLTEuMCkKKyAgICAsIG1fbWluaW11bVNjYWxlKC0xLjApCisg
ICAgLCBtX21heGltdW1TY2FsZSgtMS4wKQorICAgICwgbV9ibG9ja1pvb21GaW5hbFNjYWxlKDEu
MCkKKyAgICAsIG1fYW5jaG9ySW5Ob2RlUmVjdFJhdGlvKC0xLCAtMSkKKyAgICAsIG1fY3VycmVu
dEJsb2NrWm9vbU5vZGUoMCkKKyAgICAsIG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZSgw
KQorICAgICwgbV9zaG91bGRSZWZsb3dCbG9jayhmYWxzZSkKKyAgICAsIG1fZGVsYXllZFpvb21U
aW1lcihhZG9wdFB0cihuZXcgVGltZXI8V2ViUGFnZVByaXZhdGU+KHRoaXMsICZXZWJQYWdlUHJp
dmF0ZTo6em9vbUFib3V0UG9pbnRUaW1lckZpcmVkKSkpCisgICAgLCBtX2xhc3RVc2VyRXZlbnRU
aW1lc3RhbXAoMC4wKQorICAgICwgbV9wbHVnaW5Nb3VzZUJ1dHRvblByZXNzZWQoZmFsc2UpCisg
ICAgLCBtX3BsdWdpbk1heU9wZW5OZXdUYWIoZmFsc2UpCisgICAgLCBtX2dlb2xvY2F0aW9uQ2xp
ZW50KDApCisgICAgLCBtX2luUmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2RlKDApCisjaWYgVVNFKEFD
Q0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgICwgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmdB
Y3RpdmUoZmFsc2UpCisgICAgLCBtX3Jvb3RMYXllckNvbW1pdFRpbWVyKGFkb3B0UHRyKG5ldyBU
aW1lcjxXZWJQYWdlUHJpdmF0ZT4odGhpcywgJldlYlBhZ2VQcml2YXRlOjpyb290TGF5ZXJDb21t
aXRUaW1lckZpcmVkKSkpCisgICAgLCBtX25lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRp
b24oZmFsc2UpCisgICAgLCBtX25lZWRzQ29tbWl0KGZhbHNlKQorICAgICwgbV9zdXNwZW5kUm9v
dExheWVyQ29tbWl0KGZhbHNlKQorI2VuZGlmCisgICAgLCBtX3BlbmRpbmdPcmllbnRhdGlvbigt
MSkKKyAgICAsIG1fZnVsbHNjcmVlblZpZGVvTm9kZSgwKQorICAgICwgbV9oYXNJblJlZ2lvblNj
cm9sbGFibGVBcmVhcyhmYWxzZSkKKyAgICAsIG1fdXBkYXRlRGVsZWdhdGVkT3ZlcmxheXNEaXNw
YXRjaGVkKGZhbHNlKQoreworfQorCitXZWJQYWdlUHJpdmF0ZTo6fldlYlBhZ2VQcml2YXRlKCkK
K3sKKyAgICAvLyBIYW5kIHRoZSBiYWNraW5nc3RvcmUgYmFjayB0byBhbm90aGVyIG93bmVyIGlm
IG5lY2Vzc2FyeS4KKyAgICBtX3dlYlBhZ2UtPnNldFZpc2libGUoZmFsc2UpOworICAgIGlmIChC
YWNraW5nU3RvcmVQcml2YXRlOjpjdXJyZW50QmFja2luZ1N0b3JlT3duZXIoKSA9PSBtX3dlYlBh
Z2UpCisgICAgICAgIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNldEN1cnJlbnRCYWNraW5nU3RvcmVP
d25lcigwKTsKKworICAgIGRlbGV0ZSBtX3dlYlNldHRpbmdzOworICAgIG1fd2ViU2V0dGluZ3Mg
PSAwOworCisgICAgZGVsZXRlIG1fYmFja2luZ1N0b3JlQ2xpZW50OworICAgIG1fYmFja2luZ1N0
b3JlQ2xpZW50ID0gMDsKKyAgICBtX2JhY2tpbmdTdG9yZSA9IDA7CisKKyAgICBkZWxldGUgbV9w
YWdlOworICAgIG1fcGFnZSA9IDA7CisKKyAgICBkZWxldGUgbV90cmFuc2Zvcm1hdGlvbk1hdHJp
eDsKKyAgICBtX3RyYW5zZm9ybWF0aW9uTWF0cml4ID0gMDsKKworICAgIGRlbGV0ZSBtX2luUGFn
ZVNlYXJjaE1hbmFnZXI7CisgICAgbV9pblBhZ2VTZWFyY2hNYW5hZ2VyID0gMDsKKworICAgIGRl
bGV0ZSBtX3NlbGVjdGlvbkhhbmRsZXI7CisgICAgbV9zZWxlY3Rpb25IYW5kbGVyID0gMDsKKwor
ICAgIGRlbGV0ZSBtX2lucHV0SGFuZGxlcjsKKyAgICBtX2lucHV0SGFuZGxlciA9IDA7CisKKyAg
ICBkZWxldGUgbV90b3VjaEV2ZW50SGFuZGxlcjsKKyAgICBtX3RvdWNoRXZlbnRIYW5kbGVyID0g
MDsKKworI2lmIEVOQUJMRV9EUlQKKyAgICBkZWxldGUgbV9kdW1wUmVuZGVyVHJlZTsKKyAgICBt
X2R1bXBSZW5kZXJUcmVlID0gMDsKKyNlbmRpZgorfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpp
bml0KGNvbnN0IFdlYlN0cmluZyYgcGFnZUdyb3VwTmFtZSkKK3sKKyAgICBDaHJvbWVDbGllbnRC
bGFja0JlcnJ5KiBjaHJvbWVDbGllbnQgPSBuZXcgQ2hyb21lQ2xpZW50QmxhY2tCZXJyeSh0aGlz
KTsKKyAgICBDb250ZXh0TWVudUNsaWVudEJsYWNrQmVycnkqIGNvbnRleHRNZW51Q2xpZW50ID0g
MDsKKyNpZiBFTkFCTEUoQ09OVEVYVF9NRU5VUykKKyAgICBjb250ZXh0TWVudUNsaWVudCA9IG5l
dyBDb250ZXh0TWVudUNsaWVudEJsYWNrQmVycnkoKTsKKyNlbmRpZgorICAgIEVkaXRvckNsaWVu
dEJsYWNrQmVycnkqIGVkaXRvckNsaWVudCA9IG5ldyBFZGl0b3JDbGllbnRCbGFja0JlcnJ5KHRo
aXMpOworICAgIERyYWdDbGllbnRCbGFja0JlcnJ5KiBkcmFnQ2xpZW50ID0gMDsKKyNpZiBFTkFC
TEUoRFJBR19TVVBQT1JUKQorICAgIGRyYWdDbGllbnQgPSBuZXcgRHJhZ0NsaWVudEJsYWNrQmVy
cnkoKTsKKyNlbmRpZgorICAgIEluc3BlY3RvckNsaWVudEJsYWNrQmVycnkqIGluc3BlY3RvckNs
aWVudCA9IDA7CisjaWYgRU5BQkxFKElOU1BFQ1RPUikKKyAgICBpbnNwZWN0b3JDbGllbnQgPSBu
ZXcgSW5zcGVjdG9yQ2xpZW50QmxhY2tCZXJyeSh0aGlzKTsKKyNlbmRpZgorCisgICAgRnJhbWVM
b2FkZXJDbGllbnRCbGFja0JlcnJ5KiBmcmFtZUxvYWRlckNsaWVudCA9IG5ldyBGcmFtZUxvYWRl
ckNsaWVudEJsYWNrQmVycnkoKTsKKworICAgIFBhZ2U6OlBhZ2VDbGllbnRzIHBhZ2VDbGllbnRz
OworICAgIHBhZ2VDbGllbnRzLmNocm9tZUNsaWVudCA9IGNocm9tZUNsaWVudDsKKyAgICBwYWdl
Q2xpZW50cy5jb250ZXh0TWVudUNsaWVudCA9IGNvbnRleHRNZW51Q2xpZW50OworICAgIHBhZ2VD
bGllbnRzLmVkaXRvckNsaWVudCA9IGVkaXRvckNsaWVudDsKKyAgICBwYWdlQ2xpZW50cy5kcmFn
Q2xpZW50ID0gZHJhZ0NsaWVudDsKKyAgICBwYWdlQ2xpZW50cy5pbnNwZWN0b3JDbGllbnQgPSBp
bnNwZWN0b3JDbGllbnQ7CisKKyNpZiBFTkFCTEUoQ0xJRU5UX0JBU0VEX0dFT0xPQ0FUSU9OKQor
ICAgIC8vIE5vdGUgdGhlIG9iamVjdCB3aWxsIGJlIGRlc3Ryb3llZCB3aGVuIHRoZSBwYWdlIGlz
IGRlc3Ryb3llZC4KKyNpZiBFTkFCTEVfRFJUCisgICAgaWYgKGdldGVudigiZHJ0UnVuIikpCisg
ICAgICAgIHBhZ2VDbGllbnRzLmdlb2xvY2F0aW9uQ2xpZW50ID0gbmV3IEdlb2xvY2F0aW9uQ2xp
ZW50TW9jaygpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBwYWdlQ2xpZW50cy5nZW9sb2Nh
dGlvbkNsaWVudCA9IG1fZ2VvbG9jYXRpb25DbGllbnQgPSBuZXcgR2VvbG9jYXRpb25Db250cm9s
bGVyQ2xpZW50QmxhY2tCZXJyeSh0aGlzKTsKKyNlbHNlCisgICAgcGFnZUNsaWVudHMuZ2VvbG9j
YXRpb25DbGllbnQgPSBtX2dlb2xvY2F0aW9uQ2xpZW50OworI2VuZGlmCisKKyAgICBwYWdlQ2xp
ZW50cy5kZXZpY2VNb3Rpb25DbGllbnQgPSBuZXcgRGV2aWNlTW90aW9uQ2xpZW50QmxhY2tCZXJy
eSh0aGlzKTsKKyAgICBwYWdlQ2xpZW50cy5kZXZpY2VPcmllbnRhdGlvbkNsaWVudCA9IG5ldyBE
ZXZpY2VPcmllbnRhdGlvbkNsaWVudEJsYWNrQmVycnkodGhpcyk7CisgICAgbV9wYWdlID0gbmV3
IFBhZ2UocGFnZUNsaWVudHMpOworCisjaWYgRU5BQkxFKENMSUVOVF9CQVNFRF9HRU9MT0NBVElP
TikgJiYgRU5BQkxFX0RSVAorICAgIC8vIEluIGNhc2UgcnVubmluZyBpbiBEdW1wUmVuZGVyVHJl
ZSBtb2RlIHNldCB0aGUgY29udHJvbGxlciB0byBtb2NrIHByb3ZpZGVyLgorICAgIGlmIChnZXRl
bnYoImRydFJ1biIpKQorICAgICAgICBzdGF0aWNfY2FzdDxHZW9sb2NhdGlvbkNsaWVudE1vY2sq
PihwYWdlQ2xpZW50cy5nZW9sb2NhdGlvbkNsaWVudCktPnNldENvbnRyb2xsZXIobV9wYWdlLT5n
ZW9sb2NhdGlvbkNvbnRyb2xsZXIoKSk7CisjZW5kaWYKKworICAgIG1fcGFnZS0+c2V0Q3VzdG9t
SFRNTFRva2VuaXplckNodW5rU2l6ZSgyNTYpOworICAgIG1fcGFnZS0+c2V0Q3VzdG9tSFRNTFRv
a2VuaXplclRpbWVEZWxheSgwLjMwMCk7CisKKyAgICBtX3dlYlNldHRpbmdzID0gV2ViU2V0dGlu
Z3M6OmNyZWF0ZUZyb21TdGFuZGFyZFNldHRpbmdzKCk7CisKKyAgICAvLyBGSVhNRTogV2UgZXhw
bGljaXRseSBjYWxsIHNldERlbGVnYXRlKCkgaW5zdGVhZCBvZiBwYXNzaW5nIG91cnNlbGYgaW4g
Y3JlYXRlRnJvbVN0YW5kYXJkU2V0dGluZ3MoKQorICAgIC8vIHNvIHRoYXQgd2Ugb25seSBnZXQg
b25lIGRpZENoYW5nZVNldHRpbmdzKCkgY2FsbGJhY2sgd2hlbiB3ZSBzZXQgdGhlIHBhZ2UgZ3Jv
dXAgbmFtZS4gVGhpcyBjYXVzZXMgdXMKKyAgICAvLyB0byBtYWtlIGEgY29weSBvZiB0aGUgV2Vi
U2V0dGluZ3Mgc2luY2Ugc29tZSBXZWJTZXR0aW5ncyBtZXRob2QgbWFrZSB1c2Ugb2YgdGhlIHBh
Z2UgZ3JvdXAgbmFtZS4KKyAgICAvLyBJbnN0ZWFkLCB3ZSBzaG91bGRuJ3QgYmUgc3RvcmluZyB0
aGUgcGFnZSBncm91cCBuYW1lIGluIFdlYlNldHRpbmdzLgorICAgIG1fd2ViU2V0dGluZ3MtPnNl
dERlbGVnYXRlKHRoaXMpOworICAgIG1fd2ViU2V0dGluZ3MtPnNldFBhZ2VHcm91cE5hbWUocGFn
ZUdyb3VwTmFtZSk7CisKKyAgICBSZWZQdHI8RnJhbWU+IG5ld0ZyYW1lID0gRnJhbWU6OmNyZWF0
ZShtX3BhZ2UsIC8qIEhUTUxGcmFtZU93bmVyRWxlbWVudCogKi8gMCwgZnJhbWVMb2FkZXJDbGll
bnQpOworCisgICAgbV9tYWluRnJhbWUgPSBuZXdGcmFtZS5nZXQoKTsKKyAgICBmcmFtZUxvYWRl
ckNsaWVudC0+c2V0RnJhbWUobV9tYWluRnJhbWUsIHRoaXMpOworICAgIG1fbWFpbkZyYW1lLT5p
bml0KCk7CisKKyNpZiBFTkFCTEUoV0VCR0wpCisgICAgUGxhdGZvcm06OlNldHRpbmdzKiBzZXR0
aW5ncyA9IFBsYXRmb3JtOjpTZXR0aW5nczo6Z2V0KCk7CisgICAgbV9wYWdlLT5zZXR0aW5ncygp
LT5zZXRXZWJHTEVuYWJsZWQoc2V0dGluZ3MgJiYgc2V0dGluZ3MtPmlzV2ViR0xTdXBwb3J0ZWQo
KSk7CisjZW5kaWYKKyNpZiBFTkFCTEUoU0tJQV9HUFVfQ0FOVkFTKQorICAgIG1fcGFnZS0+c2V0
dGluZ3MoKS0+c2V0Q2FudmFzVXNlc0FjY2VsZXJhdGVkRHJhd2luZyh0cnVlKTsKKyAgICBtX3Bh
Z2UtPnNldHRpbmdzKCktPnNldEFjY2VsZXJhdGVkMmRDYW52YXNFbmFibGVkKHRydWUpOworI2Vu
ZGlmCisjaWYgRU5BQkxFKFZJRVdQT1JUX1JFRkxPVykKKyAgICBtX3BhZ2UtPnNldHRpbmdzKCkt
PnNldFRleHRSZWZsb3dFbmFibGVkKG1fd2ViU2V0dGluZ3MtPnRleHRSZWZsb3dNb2RlKCkgPT0g
V2ViU2V0dGluZ3M6OlRleHRSZWZsb3dFbmFibGVkKTsKKyNlbmRpZgorCisgICAgbV9wYWdlLT5z
ZXR0aW5ncygpLT5zZXRVc2VIaXhpZTc2V2ViU29ja2V0UHJvdG9jb2woZmFsc2UpOworICAgIG1f
cGFnZS0+c2V0dGluZ3MoKS0+c2V0SW50ZXJhY3RpdmVGb3JtVmFsaWRhdGlvbkVuYWJsZWQodHJ1
ZSk7CisgICAgbV9wYWdlLT5zZXR0aW5ncygpLT5zZXRBbGxvd1VuaXZlcnNhbEFjY2Vzc0Zyb21G
aWxlVVJMcyhmYWxzZSk7CisKKyAgICBtX2JhY2tpbmdTdG9yZUNsaWVudCA9IEJhY2tpbmdTdG9y
ZUNsaWVudDo6Y3JlYXRlKG1fbWFpbkZyYW1lLCAvKiBwYXJlbnQgZnJhbWUgKi8gMCwgbV93ZWJQ
YWdlKTsKKyAgICAvLyBUaGUgZGlyZWN0IGFjY2VzcyB0byBCYWNraW5nU3RvcmUgaXMgbGVmdCBo
ZXJlIGZvciBjb252ZW5pZW5jZSBzaW5jZSBpdAorICAgIC8vIGlzIG93bmVkIGJ5IEJhY2tpbmdT
dG9yZUNsaWVudCBhbmQgdGhlbiBkZWxldGVkIGJ5IGl0cyBkZXN0cnVjdG9yLgorICAgIG1fYmFj
a2luZ1N0b3JlID0gbV9iYWNraW5nU3RvcmVDbGllbnQtPmJhY2tpbmdTdG9yZSgpOworCisgICAg
bV9wYWdlLT5zZXR0aW5ncygpLT5zZXRTcGF0aWFsTmF2aWdhdGlvbkVuYWJsZWQobV93ZWJTZXR0
aW5ncy0+aXNTcGF0aWFsTmF2aWdhdGlvbkVuYWJsZWQoKSk7CisgICAgYmxvY2tDbGlja1JhZGl1
cyA9IGludChyb3VuZGYoMC4zNSAqIFBsYXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjpwaXhlbHNQ
ZXJJbmNoKDApLndpZHRoKCkpKTsgLy8gVGhlIGNsaWNrZWQgcmVjdGFuZ2xlIGFyZWEgc2hvdWxk
IGJlIGEgZml4ZWQgdW5pdCBvZiBtZWFzdXJlbWVudC4KKworICAgIG1fcGFnZS0+c2V0dGluZ3Mo
KS0+c2V0RGVsZWdhdGVTZWxlY3Rpb25QYWludCh0cnVlKTsKK30KKwordm9pZCBXZWJQYWdlUHJp
dmF0ZTo6bG9hZChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIqIG5ldHdvcmtUb2tlbiwgY29u
c3QgY2hhciogbWV0aG9kLCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkNhY2hlUG9saWN5IGNh
Y2hlUG9saWN5LCBjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgZGF0YUxlbmd0aCwgY29uc3QgY2hh
ciogY29uc3QqIGhlYWRlcnMsIHNpemVfdCBoZWFkZXJzTGVuZ3RoLCBib29sIGlzSW5pdGlhbCwg
Ym9vbCBtdXN0SGFuZGxlSW50ZXJuYWxseSwgYm9vbCBmb3JjZURvd25sb2FkLCBjb25zdCBjaGFy
KiBvdmVycmlkZUNvbnRlbnRUeXBlKQoreworICAgIHN0b3BDdXJyZW50TG9hZCgpOworCisgICAg
U3RyaW5nIHVybFN0cmluZyh1cmwpOworICAgIGlmICh1cmxTdHJpbmcuc3RhcnRzV2l0aCgidnM6
IiwgZmFsc2UpKSB7CisgICAgICAgIHVybFN0cmluZyA9IHVybFN0cmluZy5zdWJzdHJpbmcoMyk7
CisgICAgICAgIG1fbWFpbkZyYW1lLT5zZXRJblZpZXdTb3VyY2VNb2RlKHRydWUpOworICAgIH0g
ZWxzZQorICAgICAgICBtX21haW5GcmFtZS0+c2V0SW5WaWV3U291cmNlTW9kZShmYWxzZSk7CisK
KyAgICBLVVJMIGt1cmwgPSBwYXJzZVVybCh1cmxTdHJpbmcpOworICAgIGlmIChwcm90b2NvbElz
KGt1cmwsICJqYXZhc2NyaXB0IikpIHsKKyAgICAgICAgLy8gTmV2ZXIgcnVuIGphdmFzY3JpcHQg
d2hpbGUgbG9hZGluZyBpcyBkZWZlcnJlZC4KKyAgICAgICAgaWYgKG1fcGFnZS0+ZGVmZXJzTG9h
ZGluZygpKSB7CisgICAgICAgICAgICBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkqIGZyYW1l
TG9hZGVyQ2xpZW50ID0gc3RhdGljX2Nhc3Q8RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Kj4o
bV9tYWluRnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKSk7CisgICAgICAgICAgICBmcmFtZUxvYWRl
ckNsaWVudC0+c2V0RGVmZXJyZWRNYW51YWxTY3JpcHQoa3VybCk7CisgICAgICAgIH0gZWxzZQor
ICAgICAgICAgICAgbV9tYWluRnJhbWUtPnNjcmlwdCgpLT5leGVjdXRlSWZKYXZhU2NyaXB0VVJM
KGt1cmwsIERvTm90UmVwbGFjZURvY3VtZW50SWZKYXZhU2NyaXB0VVJMKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIGlmIChpc0luaXRpYWwpCisgICAgICAgIE5ldHdvcmtNYW5hZ2Vy
OjppbnN0YW5jZSgpLT5zZXRJbml0aWFsVVJMKGt1cmwpOworCisgICAgUmVzb3VyY2VSZXF1ZXN0
IHJlcXVlc3Qoa3VybCwgIiIgLyogcmVmZXJyZXIgKi8pOworICAgIHJlcXVlc3Quc2V0VG9rZW4o
bmV0d29ya1Rva2VuKTsKKyAgICBpZiAoaXNJbml0aWFsIHx8IG11c3RIYW5kbGVJbnRlcm5hbGx5
KQorICAgICAgICByZXF1ZXN0LnNldE11c3RIYW5kbGVJbnRlcm5hbGx5KHRydWUpOworICAgIHJl
cXVlc3Quc2V0SFRUUE1ldGhvZChtZXRob2QpOworICAgIHJlcXVlc3Quc2V0Q2FjaGVQb2xpY3ko
dG9XZWJDb3JlQ2FjaGVQb2xpY3koY2FjaGVQb2xpY3kpKTsKKyAgICBpZiAob3ZlcnJpZGVDb250
ZW50VHlwZSkKKyAgICAgICAgcmVxdWVzdC5zZXRPdmVycmlkZUNvbnRlbnRUeXBlKG92ZXJyaWRl
Q29udGVudFR5cGUpOworCisgICAgaWYgKGRhdGEpCisgICAgICAgIHJlcXVlc3Quc2V0SFRUUEJv
ZHkoRm9ybURhdGE6OmNyZWF0ZShkYXRhLCBkYXRhTGVuZ3RoKSk7CisKKyAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpICsgMSA8IGhlYWRlcnNMZW5ndGg7IGkgKz0gMikKKyAgICAgICAgcmVxdWVz
dC5hZGRIVFRQSGVhZGVyRmllbGQoaGVhZGVyc1tpXSwgaGVhZGVyc1tpICsgMV0pOworCisgICAg
aWYgKGZvcmNlRG93bmxvYWQpCisgICAgICAgIHJlcXVlc3Quc2V0Rm9yY2VEb3dubG9hZCh0cnVl
KTsKKworICAgIG1fbWFpbkZyYW1lLT5sb2FkZXIoKS0+bG9hZChyZXF1ZXN0LCAiIiAvKiBuYW1l
ICovLCBmYWxzZSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmxvYWRTdHJpbmcoY29uc3Qg
Y2hhciogc3RyaW5nLCBjb25zdCBjaGFyKiBiYXNlVVJMLCBjb25zdCBjaGFyKiBjb250ZW50VHlw
ZSwgY29uc3QgY2hhciogZmFpbGluZ1VSTCkKK3sKKyAgICBLVVJMIGt1cmwgPSBwYXJzZVVybChi
YXNlVVJMKTsKKyAgICBSZXNvdXJjZVJlcXVlc3QgcmVxdWVzdChrdXJsKTsKKyAgICBXVEY6OlJl
ZlB0cjxTaGFyZWRCdWZmZXI+IGJ1ZmZlcgorICAgICAgICA9IFNoYXJlZEJ1ZmZlcjo6Y3JlYXRl
KHN0cmluZywgc3RybGVuKHN0cmluZykpOworICAgIFN1YnN0aXR1dGVEYXRhIHN1YnN0aXR1dGVE
YXRhKGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0TUlN
RVR5cGVGcm9tTWVkaWFUeXBlKGNvbnRlbnRUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBleHRyYWN0Q2hhcnNldEZyb21NZWRpYVR5cGUoY29udGVudFR5cGUpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxpbmdVUkwgPyBwYXJzZVVybChmYWls
aW5nVVJMKSA6IEtVUkwoKSk7CisgICAgbV9tYWluRnJhbWUtPmxvYWRlcigpLT5sb2FkKHJlcXVl
c3QsIHN1YnN0aXR1dGVEYXRhLCBmYWxzZSk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmV4
ZWN1dGVKYXZhU2NyaXB0KGNvbnN0IGNoYXIqIHNjcmlwdCwgSmF2YVNjcmlwdERhdGFUeXBlJiBy
ZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKQoreworICAgIFNjcmlwdFZhbHVlIHJl
c3VsdCA9IG1fbWFpbkZyYW1lLT5zY3JpcHQoKS0+ZXhlY3V0ZVNjcmlwdChTdHJpbmc6OmZyb21V
VEY4KHNjcmlwdCksIGZhbHNlKTsKKyAgICBKU0M6OkpTVmFsdWUgdmFsdWUgPSByZXN1bHQuanNW
YWx1ZSgpOworICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTRXhjZXB0
aW9uOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgSlNDOjpFeGVjU3RhdGUq
IGV4ZWMgPSBtX21haW5GcmFtZS0+c2NyaXB0KCktPmdsb2JhbE9iamVjdChtYWluVGhyZWFkTm9y
bWFsV29ybGQoKSktPmdsb2JhbEV4ZWMoKTsKKyAgICBKU0dsb2JhbENvbnRleHRSZWYgY29udGV4
dCA9IHRvR2xvYmFsUmVmKGV4ZWMpOworCisgICAgSlNUeXBlIHR5cGUgPSBKU1ZhbHVlR2V0VHlw
ZShjb250ZXh0LCB0b1JlZihleGVjLCB2YWx1ZSkpOworCisgICAgc3dpdGNoICh0eXBlKSB7Cisg
ICAgY2FzZSBrSlNUeXBlTnVsbDoKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTTnVsbDsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBrSlNUeXBlQm9vbGVhbjoKKyAgICAgICAgcmV0dXJuVHlwZSA9
IEpTQm9vbGVhbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrSlNUeXBlTnVtYmVyOgorICAg
ICAgICByZXR1cm5UeXBlID0gSlNOdW1iZXI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0pT
VHlwZVN0cmluZzoKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTU3RyaW5nOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIGtKU1R5cGVPYmplY3Q6CisgICAgICAgIHJldHVyblR5cGUgPSBKU09iamVj
dDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrSlNUeXBlVW5kZWZpbmVkOgorICAgIGRlZmF1
bHQ6CisgICAgICAgIHJldHVyblR5cGUgPSBKU1VuZGVmaW5lZDsKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorCisgICAgaWYgKHJldHVyblR5cGUgPT0gSlNCb29sZWFuIHx8IHJldHVyblR5cGUgPT0g
SlNOdW1iZXIgfHwgcmV0dXJuVHlwZSA9PSBKU1N0cmluZyB8fCByZXR1cm5UeXBlID09IEpTT2Jq
ZWN0KSB7CisgICAgICAgIFN0cmluZyBzdHIgPSByZXN1bHQudG9TdHJpbmcoZXhlYyk7CisgICAg
ICAgIHJldHVyblZhbHVlID0gV2ViU3RyaW5nKHN0ci5pbXBsKCkpOworICAgIH0KKworICAgIHJl
dHVybiB0cnVlOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpleGVjdXRlSmF2YVNjcmlwdElu
SXNvbGF0ZWRXb3JsZChjb25zdCBTY3JpcHRTb3VyY2VDb2RlJiBzb3VyY2VDb2RlLCBKYXZhU2Ny
aXB0RGF0YVR5cGUmIHJldHVyblR5cGUsIFdlYlN0cmluZyYgcmV0dXJuVmFsdWUpCit7CisgICAg
aWYgKCFtX2lzb2xhdGVkV29ybGQpCisgICAgICAgIG1faXNvbGF0ZWRXb3JsZCA9IG1fbWFpbkZy
YW1lLT5zY3JpcHQoKS0+Y3JlYXRlV29ybGQoKTsKKworICAgIC8vIFVzZSBldmFsdWF0ZUluV29y
bGQgdG8gYXZvaWQgY2FuRXhlY3V0ZVNjcmlwdHMgY2hlY2suCisgICAgU2NyaXB0VmFsdWUgcmVz
dWx0ID0gbV9tYWluRnJhbWUtPnNjcmlwdCgpLT5ldmFsdWF0ZUluV29ybGQoc291cmNlQ29kZSwg
bV9pc29sYXRlZFdvcmxkLmdldCgpKTsKKyAgICBKU0M6OkpTVmFsdWUgdmFsdWUgPSByZXN1bHQu
anNWYWx1ZSgpOworICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTRXhj
ZXB0aW9uOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgSlNDOjpFeGVjU3Rh
dGUqIGV4ZWMgPSBtX21haW5GcmFtZS0+c2NyaXB0KCktPmdsb2JhbE9iamVjdChtX2lzb2xhdGVk
V29ybGQuZ2V0KCkpLT5nbG9iYWxFeGVjKCk7CisgICAgSlNHbG9iYWxDb250ZXh0UmVmIGNvbnRl
eHQgPSB0b0dsb2JhbFJlZihleGVjKTsKKworICAgIEpTVHlwZSB0eXBlID0gSlNWYWx1ZUdldFR5
cGUoY29udGV4dCwgdG9SZWYoZXhlYywgdmFsdWUpKTsKKworICAgIHN3aXRjaCAodHlwZSkgewor
ICAgIGNhc2Uga0pTVHlwZU51bGw6CisgICAgICAgIHJldHVyblR5cGUgPSBKU051bGw7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2Uga0pTVHlwZUJvb2xlYW46CisgICAgICAgIHJldHVyblR5cGUg
PSBKU0Jvb2xlYW47CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0pTVHlwZU51bWJlcjoKKyAg
ICAgICAgcmV0dXJuVHlwZSA9IEpTTnVtYmVyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGtK
U1R5cGVTdHJpbmc6CisgICAgICAgIHJldHVyblR5cGUgPSBKU1N0cmluZzsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBrSlNUeXBlT2JqZWN0OgorICAgICAgICByZXR1cm5UeXBlID0gSlNPYmpl
Y3Q7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0pTVHlwZVVuZGVmaW5lZDoKKyAgICBkZWZh
dWx0OgorICAgICAgICByZXR1cm5UeXBlID0gSlNVbmRlZmluZWQ7CisgICAgICAgIGJyZWFrOwor
ICAgIH0KKworICAgIGlmIChyZXR1cm5UeXBlID09IEpTQm9vbGVhbiB8fCByZXR1cm5UeXBlID09
IEpTTnVtYmVyIHx8IHJldHVyblR5cGUgPT0gSlNTdHJpbmcgfHwgcmV0dXJuVHlwZSA9PSBKU09i
amVjdCkgeworICAgICAgICBTdHJpbmcgc3RyID0gcmVzdWx0LnRvU3RyaW5nKGV4ZWMpOworICAg
ICAgICByZXR1cm5WYWx1ZSA9IFdlYlN0cmluZyhzdHIuaW1wbCgpKTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c3RvcEN1cnJlbnRMb2FkKCkK
K3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBjb250YWluIGFsbCBjb21tb24gY29kZSB0
cmlnZ2VyZWQgYnkgV2ViUGFnZTo6bG9hZAorICAgIC8vICh3aGljaCBzdG9wcyBhbnkgbG9hZCBp
biBwcm9ncmVzcyBiZWZvcmUgc3RhcnRpbmcgdGhlIG5ldyBsb2FkKSBhbmQKKyAgICAvLyBXZWJQ
YWdlOjpzdG9wbG9hZGluZyAodGhlIGVudHJ5IHBvaW50IGZvciB0aGUgY2xpZW50IHRvIHN0b3Ag
dGhlIGxvYWQKKyAgICAvLyBleHBsaWNpdGx5KS4gSWYgaXQgc2hvdWxkIG9ubHkgYmUgZG9uZSB3
aGlsZSBzdG9wcGluZyB0aGUgbG9hZAorICAgIC8vIGV4cGxpY2l0bHksIGl0IGdvZXMgaW4gV2Vi
UGFnZTo6c3RvcExvYWRpbmcsIG5vdCBoZXJlLgorICAgIG1fbWFpbkZyYW1lLT5sb2FkZXIoKS0+
c3RvcEFsbExvYWRlcnMoKTsKKworICAgIC8vIENhbmNlbCBhbnkgZGVmZXJyZWQgc2NyaXB0IHRo
YXQgaGFzbid0IGJlZW4gcHJvY2Vzc2VkIHlldC4KKyAgICBGcmFtZUxvYWRlckNsaWVudEJsYWNr
QmVycnkqIGZyYW1lTG9hZGVyQ2xpZW50ID0gc3RhdGljX2Nhc3Q8RnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5Kj4obV9tYWluRnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKSk7CisgICAgZnJhbWVM
b2FkZXJDbGllbnQtPnNldERlZmVycmVkTWFudWFsU2NyaXB0KEtVUkwoKSk7Cit9CisKK3N0YXRp
YyB2b2lkIGNsb3NlVVJMUmVjdXJzaXZlbHkoRnJhbWUqIGZyYW1lKQoreworICAgIC8vIERvIG5v
dCBjcmVhdGUgbW9yZSBmcmFtZSBwbGVhc2UuCisgICAgRnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5KiBmcmFtZUxvYWRlckNsaWVudCA9IHN0YXRpY19jYXN0PEZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeSo+KGZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50KCkpOworICAgIGZyYW1lTG9hZGVyQ2xp
ZW50LT5zdXBwcmVzc0NoaWxkRnJhbWVDcmVhdGlvbigpOworCisgICAgZnJhbWUtPmxvYWRlcigp
LT5jbG9zZVVSTCgpOworCisgICAgVmVjdG9yPFJlZlB0cjxGcmFtZT4sIDEwPiBjaGlsZEZyYW1l
czsKKworICAgIGZvciAoUmVmUHRyPEZyYW1lPiBjaGlsZEZyYW1lID0gZnJhbWUtPnRyZWUoKS0+
Zmlyc3RDaGlsZCgpOyBjaGlsZEZyYW1lOyBjaGlsZEZyYW1lID0gY2hpbGRGcmFtZS0+dHJlZSgp
LT5uZXh0U2libGluZygpKQorICAgICAgICBjaGlsZEZyYW1lcy5hcHBlbmQoY2hpbGRGcmFtZSk7
CisKKyAgICB1bnNpZ25lZCBzaXplID0gY2hpbGRGcmFtZXMuc2l6ZSgpOworICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIGNsb3NlVVJMUmVjdXJzaXZlbHko
Y2hpbGRGcmFtZXNbaV0uZ2V0KCkpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpwcmVwYXJl
VG9EZXN0cm95KCkKK3sKKyAgICAvLyBCZWZvcmUgdGhlIGNsaWVudCBzdGFydHMgdGVhcmluZyBp
dHNlbGYgZG93biwgZGlzcGF0Y2ggdGhlIHVubG9hZCBldmVudAorICAgIC8vIHNvIGl0IGNhbiB0
YWtlIGVmZmVjdCB3aGlsZSBhbGwgdGhlIGNsaWVudCdzIHN0YXRlIChlLmcuIHNjcm9sbCBwb3Np
dGlvbikKKyAgICAvLyBpcyBzdGlsbCBwcmVzZW50LgorICAgIGNsb3NlVVJMUmVjdXJzaXZlbHko
bV9tYWluRnJhbWUpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXRMb2FkU3RhdGUoTG9h
ZFN0YXRlIHN0YXRlKQoreworICAgIGlmIChtX2xvYWRTdGF0ZSA9PSBzdGF0ZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgYm9vbCBpc0ZpcnN0TG9hZCA9IG1fbG9hZFN0YXRlID09IE5vbmU7CisK
KyAgICAvLyBTZWUgUklNIEJ1ZyAjMTA2OC4KKyAgICBpZiAoc3RhdGUgPT0gRmluaXNoZWQgJiYg
bV9tYWluRnJhbWUgJiYgbV9tYWluRnJhbWUtPmRvY3VtZW50KCkpCisgICAgICAgIG1fbWFpbkZy
YW1lLT5kb2N1bWVudCgpLT51cGRhdGVTdHlsZUlmTmVlZGVkKCk7CisKKyAgICBtX2xvYWRTdGF0
ZSA9IHN0YXRlOworCisjaWYgREVCVUdfV0VCUEFHRV9MT0FECisgICAgUGxhdGZvcm06OmxvZyhQ
bGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiV2ViUGFnZVByaXZhdGU6OnNldExvYWRTdGF0ZSAlZCIs
IHN0YXRlKTsKKyNlbmRpZgorCisgICAgc3dpdGNoIChtX2xvYWRTdGF0ZSkgeworICAgIGNhc2Ug
UHJvdmlzaW9uYWw6CisgICAgICAgIGlmIChpc0ZpcnN0TG9hZCkgeworICAgICAgICAgICAgLy8g
UGFpbnRzIHRoZSB2aXNpYmxlIGJhY2tpbmdzdG9yZSBhcyB3aGl0ZSB0byBwcmV2ZW50IGluaXRp
YWwgY2hlY2tlcmJvYXJkIG9uCisgICAgICAgICAgICAvLyB0aGUgZmlyc3QgYmxpdC4KKyAgICAg
ICAgICAgIGlmIChtX2JhY2tpbmdTdG9yZS0+ZC0+cmVuZGVyVmlzaWJsZUNvbnRlbnRzKCkgJiYg
IW1fYmFja2luZ1N0b3JlLT5kLT5pc1N1c3BlbmRlZCgpICYmICFtX2JhY2tpbmdTdG9yZS0+ZC0+
c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAgICAgICAgICAgICAgICBtX2JhY2tp
bmdTdG9yZS0+ZC0+YmxpdFZpc2libGVDb250ZW50cygpOworICAgICAgICB9CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgQ29tbWl0dGVkOgorICAgICAgICB7CisgICAgICAgICAgICB1bnNjaGVk
dWxlWm9vbUFib3V0UG9pbnQoKTsKKworI2lmIEVOQUJMRShTS0lBX0dQVV9DQU5WQVMpCisgICAg
ICAgICAgICBpZiAobV9wYWdlLT5zZXR0aW5ncygpLT5jYW52YXNVc2VzQWNjZWxlcmF0ZWREcmF3
aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGcmVlIEdQVSByZXNvdXJjZXMgYXMgd2UncmUg
b24gYSBuZXcgcGFnZS4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgaGVscCB1cyB0byBm
cmVlIG1lbW9yeSBwcmVzc3VyZS4KKyAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6R3JhcGhpY3M6
Om1ha2VTaGFyZWRSZXNvdXJjZUNvbnRleHRDdXJyZW50KFBsYXRmb3JtOjpHcmFwaGljczo6R0xF
UzIpOworICAgICAgICAgICAgICAgIEdyQ29udGV4dCogZ3JDb250ZXh0ID0gUGxhdGZvcm06Okdy
YXBoaWNzOjpnZXRHckNvbnRleHQoKTsKKyAgICAgICAgICAgICAgICBnckNvbnRleHQtPmZyZWVH
cHVSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisjaWYgVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQorICAgICAgICAgICAgLy8gRklYTUU6IGNvbXBvc2l0b3IgbWF5IG9u
bHkgYmUgdG91Y2hlZCBvbiB0aGUgY29tcG9zaXRpbmcgdGhyZWFkLgorICAgICAgICAgICAgLy8g
SG93ZXZlciwgaXQncyBjcmVhdGVkL2Rlc3Ryb3llZCBieSBhIHN5bmMgY29tbWFuZCBzbyB0aGlz
IGlzIGhhcm1sZXNzLgorICAgICAgICAgICAgaWYgKG1fY29tcG9zaXRvcikgeworICAgICAgICAg
ICAgICAgIG1fY29tcG9zaXRvci0+c2V0TGF5b3V0UmVjdEZvckNvbXBvc2l0aW5nKEludFJlY3Qo
KSk7CisgICAgICAgICAgICAgICAgbV9jb21wb3NpdG9yLT5zZXRDb250ZW50c1NpemVGb3JDb21w
b3NpdGluZyhJbnRTaXplKCkpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBt
X3ByZXZpb3VzQ29udGVudHNTaXplID0gSW50U2l6ZSgpOworICAgICAgICAgICAgbV9iYWNraW5n
U3RvcmUtPmQtPnJlc2V0UmVuZGVyUXVldWUoKTsKKyAgICAgICAgICAgIG1fYmFja2luZ1N0b3Jl
LT5kLT5yZXNldFRpbGVzKHRydWUgLyogcmVzZXRCYWNrZ3JvdW5kICovKTsKKyAgICAgICAgICAg
IG1fYmFja2luZ1N0b3JlLT5kLT5zZXRTY3JvbGxpbmdPclpvb21pbmcoZmFsc2UsIGZhbHNlIC8q
IHNob3VsZEJsaXQgKi8pOworICAgICAgICAgICAgbV91c2VyUGVyZm9ybWVkTWFudWFsWm9vbSA9
IGZhbHNlOworICAgICAgICAgICAgbV91c2VyUGVyZm9ybWVkTWFudWFsU2Nyb2xsID0gZmFsc2U7
CisgICAgICAgICAgICBtX3Nob3VsZFVzZUZpeGVkRGVza3RvcE1vZGUgPSBmYWxzZTsKKyAgICAg
ICAgICAgIGlmIChtX3Jlc2V0VmlydHVhbFZpZXdwb3J0T25Db21taXR0ZWQpIHsgLy8gRm9yIERS
VC4KKyAgICAgICAgICAgICAgICBtX3ZpcnR1YWxWaWV3cG9ydFdpZHRoID0gMDsKKyAgICAgICAg
ICAgICAgICBtX3ZpcnR1YWxWaWV3cG9ydEhlaWdodCA9IDA7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBpZiAobV93ZWJTZXR0aW5ncy0+dmlld3BvcnRXaWR0aCgpID4gMCkgeworICAgICAg
ICAgICAgICAgIG1fdmlydHVhbFZpZXdwb3J0V2lkdGggPSBtX3dlYlNldHRpbmdzLT52aWV3cG9y
dFdpZHRoKCk7CisgICAgICAgICAgICAgICAgbV92aXJ0dWFsVmlld3BvcnRIZWlnaHQgPSBtX2Rl
ZmF1bHRMYXlvdXRTaXplLmhlaWdodCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8g
Q2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IHByb2Nlc3MgdGhlIG1ldGEgdmlld3BvcnQgdGFnLCB0
aGlzIG9ubHkgaGFwcGVucyBvbiBoaXN0b3J5IG5hdmlnYXRpb24KKyAgICAgICAgICAgIGlmICgh
bV9kaWRSZXN0b3JlRnJvbVBhZ2VDYWNoZSkgeworICAgICAgICAgICAgICAgIG1fdmlld3BvcnRB
cmd1bWVudHMgPSBWaWV3cG9ydEFyZ3VtZW50cygpOworICAgICAgICAgICAgICAgIG1fdXNlclNj
YWxhYmxlID0gbV93ZWJTZXR0aW5ncy0+aXNVc2VyU2NhbGFibGUoKTsKKyAgICAgICAgICAgICAg
ICByZXNldFNjYWxlcygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBJ
bnRTaXplIHZpcnR1YWxWaWV3cG9ydCA9IHJlY29tcHV0ZVZpcnR1YWxWaWV3cG9ydEZyb21WaWV3
cG9ydEFyZ3VtZW50cygpOworICAgICAgICAgICAgICAgIG1fd2ViUGFnZS0+c2V0VmlydHVhbFZp
ZXdwb3J0U2l6ZSh2aXJ0dWFsVmlld3BvcnQud2lkdGgoKSwgdmlydHVhbFZpZXdwb3J0LmhlaWdo
dCgpKTsKKyAgICAgICAgICAgIH0KKworI2lmIEVOQUJMRShFVkVOVF9NT0RFX01FVEFUQUdTKQor
ICAgICAgICAgICAgZGlkUmVjZWl2ZUN1cnNvckV2ZW50TW9kZShQcm9jZXNzZWRDdXJzb3JFdmVu
dHMpOworICAgICAgICAgICAgZGlkUmVjZWl2ZVRvdWNoRXZlbnRNb2RlKFByb2Nlc3NlZFRvdWNo
RXZlbnRzKTsKKyNlbmRpZgorCisgICAgICAgICAgICAvLyBJZiBpdCdzIGEgb3V0bW9zdCBTVkcg
ZG9jdW1lbnQsIHdlIHVzZSBGaXhlZERlc2t0b3AgbW9kZSwgb3RoZXJ3aXNlCisgICAgICAgICAg
ICAvLyB3ZSBkZWZhdWx0IHRvIE1vYmlsZSBtb2RlLiBGb3IgZXhhbXBsZSwgdXNpbmcgRml4ZWRE
ZXNrdG9wIG1vZGUgdG8KKyAgICAgICAgICAgIC8vIHJlbmRlciBodHRwOi8vd3d3LmNyb2N6aWxs
YS5jb20vYml0c19hbmRfcGllY2VzL3N2Zy9zYW1wbGVzL3RpZ2VyL3RpZ2VyLnN2ZworICAgICAg
ICAgICAgLy8gaXMgdXNlci1leHBlcmllbmNlIGZyaWVuZGx5LgorICAgICAgICAgICAgaWYgKG1f
cGFnZS0+bWFpbkZyYW1lKCktPmRvY3VtZW50KCktPmlzU1ZHRG9jdW1lbnQoKSkgeworICAgICAg
ICAgICAgICAgIHNldFNob3VsZFVzZUZpeGVkRGVza3RvcE1vZGUodHJ1ZSk7CisgICAgICAgICAg
ICAgICAgc2V0Vmlld01vZGUoRml4ZWREZXNrdG9wKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAg
ICAgICAgICAgICAgIHNldFZpZXdNb2RlKE1vYmlsZSk7CisKKyAgICAgICAgICAgIC8vIFJlc2V0
IGJsb2NrIHpvb20gYW5kIHJlZmxvdy4KKyAgICAgICAgICAgIHJlc2V0QmxvY2tab29tKCk7Cisj
aWYgRU5BQkxFKFZJRVdQT1JUX1JFRkxPVykKKyAgICAgICAgICAgIHRvZ2dsZVRleHRSZWZsb3dJ
ZkVuYWJsZWRGb3JCbG9ja1pvb21Pbmx5KCk7CisjZW5kaWYKKworICAgICAgICAgICAgLy8gU2V0
IHRoZSBzY3JvbGwgdG8gb3JpZ2luIGhlcmUgYW5kIG5vdGlmeSB0aGUgY2xpZW50IHNpbmNlIHdl
J2xsIGJlCisgICAgICAgICAgICAvLyB6b29taW5nIGJlbG93IHdpdGhvdXQgYW55IHJlYWwgY29u
dGVudHMgeWV0IHRodXMgdGhlIGNvbnRlbnRzIHNpemUKKyAgICAgICAgICAgIC8vIHdlIHJlcG9y
dCB0byB0aGUgY2xpZW50IGNvdWxkIG1ha2Ugb3VyIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIGlu
dmFsaWQuCisgICAgICAgICAgICBzZXRTY3JvbGxQb3NpdGlvbihJbnRQb2ludDo6emVybygpKTsK
KyAgICAgICAgICAgIG5vdGlmeVRyYW5zZm9ybWVkU2Nyb2xsQ2hhbmdlZCgpOworCisgICAgICAg
ICAgICAvLyBQYWludHMgdGhlIHZpc2libGUgYmFja2luZ3N0b3JlIGFzIHdoaXRlLiBOb3RlIGl0
IGlzIGltcG9ydGFudCB3ZSBkbworICAgICAgICAgICAgLy8gdGhpcyBzdHJpY3RseSBhZnRlciBy
ZS1zZXR0aW5nIHRoZSBzY3JvbGwgcG9zaXRpb24gdG8gb3JpZ2luIGFuZCByZXNldHRpbmcKKyAg
ICAgICAgICAgIC8vIHRoZSBzY2FsZXMgb3RoZXJ3aXNlIHRoZSB2aXNpYmxlIGNvbnRlbnRzIGNh
bGN1bGF0aW9uIGlzIHdyb25nIGFuZCB3ZQorICAgICAgICAgICAgLy8gY2FuIGVuZCB1cCBibGl0
dGluZyBhcnRpZmFjdHMgaW5zdGVhZC4gU2VlOiBSSU0gQnVnICM0MDEuCisgICAgICAgICAgICBp
ZiAobV9iYWNraW5nU3RvcmUtPmQtPnJlbmRlclZpc2libGVDb250ZW50cygpICYmICFtX2JhY2tp
bmdTdG9yZS0+ZC0+aXNTdXNwZW5kZWQoKSAmJiAhbV9iYWNraW5nU3RvcmUtPmQtPnNob3VsZERp
cmVjdFJlbmRlcmluZ1RvV2luZG93KCkpCisgICAgICAgICAgICAgICAgbV9iYWNraW5nU3RvcmUt
PmQtPmJsaXRWaXNpYmxlQ29udGVudHMoKTsKKworICAgICAgICAgICAgem9vbVRvSW5pdGlhbFNj
YWxlT25Mb2FkKCk7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBjdXJzb3Igc3RhdHVzLgorICAg
ICAgICAgICAgdXBkYXRlQ3Vyc29yKCk7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCisgICAgICAgICAgICAvLyBEb24ndCByZW5kZXIgY29tcG9zaXRpbmcgY29udGVudHMgZnJv
bSBwcmV2aW91cyBwYWdlLgorICAgICAgICAgICAgcmVzZXRDb21wb3NpdGluZ1N1cmZhY2UoKTsK
KyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIEZpbmlzaGVk
OgorICAgIGNhc2UgRmFpbGVkOgorICAgICAgICAvLyBOb3RpZnkgY2xpZW50IG9mIHRoZSBpbml0
aWFsIHpvb20gY2hhbmdlLgorICAgICAgICBtX2NsaWVudC0+em9vbUNoYW5nZWQobV93ZWJQYWdl
LT5pc01pblpvb21lZCgpLCBtX3dlYlBhZ2UtPmlzTWF4Wm9vbWVkKCksICFzaG91bGRab29tT25F
c2NhcGUoKSwgY3VycmVudFNjYWxlKCkpOworICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+dXBk
YXRlVGlsZXModHJ1ZSAvKiB1cGRhdGVWaXNpYmxlICovLCBmYWxzZSAvKiBpbW1lZGlhdGUgKi8p
OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9
CisKK2RvdWJsZSBXZWJQYWdlUHJpdmF0ZTo6Y2xhbXBlZFNjYWxlKGRvdWJsZSBzY2FsZSkgY29u
c3QKK3sKKyAgICBpZiAoc2NhbGUgPCBtaW5pbXVtU2NhbGUoKSkKKyAgICAgICAgcmV0dXJuIG1p
bmltdW1TY2FsZSgpOworICAgIGlmIChzY2FsZSA+IG1heGltdW1TY2FsZSgpKQorICAgICAgICBy
ZXR1cm4gbWF4aW11bVNjYWxlKCk7CisgICAgcmV0dXJuIHNjYWxlOworfQorCitib29sIFdlYlBh
Z2VQcml2YXRlOjpzaG91bGRab29tQWJvdXRQb2ludChkb3VibGUgc2NhbGUsIGNvbnN0IEZsb2F0
UG9pbnQmLCBib29sIGVuZm9yY2VTY2FsZUNsYW1waW5nLCBkb3VibGUqIGNsYW1wZWRTY2FsZSkK
K3sKKyAgICBpZiAoIW1fbWFpbkZyYW1lLT52aWV3KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIGlmIChlbmZvcmNlU2NhbGVDbGFtcGluZykKKyAgICAgICAgc2NhbGUgPSB0aGlzLT5j
bGFtcGVkU2NhbGUoc2NhbGUpOworCisgICAgQVNTRVJUKGNsYW1wZWRTY2FsZSk7CisgICAgKmNs
YW1wZWRTY2FsZSA9IHNjYWxlOworCisgICAgaWYgKGN1cnJlbnRTY2FsZSgpID09IHNjYWxlKSB7
CisgICAgICAgIC8vIE1ha2Ugc3VyZSBiYWNraW5nc3RvcmUgdXBkYXRlcyByZXN1bWUgZnJvbSBw
aW5jaCB6b29tIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBmaW5hbCB6b29tIGxldmVsIGRvZXNuJ3Qg
Y2hhbmdlLgorICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+cmVzdW1lU2NyZWVuQW5kQmFja2lu
Z1N0b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6Ok5vbmUpOworICAgICAgICBtX2NsaWVudC0+em9v
bUNoYW5nZWQobV93ZWJQYWdlLT5pc01pblpvb21lZCgpLCBtX3dlYlBhZ2UtPmlzTWF4Wm9vbWVk
KCksICFzaG91bGRab29tT25Fc2NhcGUoKSwgY3VycmVudFNjYWxlKCkpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgV2ViUGFnZVBy
aXZhdGU6Onpvb21BYm91dFBvaW50KGRvdWJsZSB1bmNsYW1wZWRTY2FsZSwgY29uc3QgRmxvYXRQ
b2ludCYgYW5jaG9yLCBib29sIGVuZm9yY2VTY2FsZUNsYW1waW5nLCBib29sIGZvcmNlUmVuZGVy
aW5nLCBib29sIGlzUmVzdG9yaW5nWm9vbUxldmVsKQoreworICAgIGlmICghaXNSZXN0b3Jpbmda
b29tTGV2ZWwpIHsKKyAgICAgICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIGJsb2NrIHpvb20uICAo
SWYgd2UgYXJlIHJlc3RvcmluZyBhIHNhdmVkIHpvb20gbGV2ZWwgb24gcGFnZSBsb2FkLAorICAg
ICAgICAvLyB0aGVyZSBpcyBndWFyYW50ZWVkIHRvIGJlIG5vIGV4aXN0aW5nIGJsb2NrIHpvb20g
YW5kIHdlIGRvbid0IHdhbnQgdG8gY2xlYXIgbV9zaG91bGRSZWZsb3dCbG9jay4pCisgICAgICAg
IHJlc2V0QmxvY2tab29tKCk7CisgICAgfQorCisgICAgLy8gVGhlIHJlZmxvdyBhbmQgYmxvY2sg
em9vbSBzdHVmZiBoZXJlIG5lZWRzIHRvIGhhcHBlbiByZWdhcmRsZXNzIG9mCisgICAgLy8gd2hl
dGhlciB3ZSBzaG91bGRab29tQWJvdXRQb2ludC4KKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9X
KQorICAgIHRvZ2dsZVRleHRSZWZsb3dJZkVuYWJsZWRGb3JCbG9ja1pvb21Pbmx5KG1fc2hvdWxk
UmVmbG93QmxvY2spOworICAgIGlmIChtX3BhZ2UtPnNldHRpbmdzKCktPmlzVGV4dFJlZmxvd0Vu
YWJsZWQoKSAmJiBtX21haW5GcmFtZS0+dmlldygpKQorICAgICAgICBzZXROZWVkc0xheW91dCgp
OworI2VuZGlmCisKKyAgICBkb3VibGUgc2NhbGU7CisgICAgaWYgKCFzaG91bGRab29tQWJvdXRQ
b2ludCh1bmNsYW1wZWRTY2FsZSwgYW5jaG9yLCBlbmZvcmNlU2NhbGVDbGFtcGluZywgJnNjYWxl
KSkgeworICAgICAgICBpZiAobV93ZWJQYWdlLT5zZXR0aW5ncygpLT50ZXh0UmVmbG93TW9kZSgp
ID09IFdlYlNldHRpbmdzOjpUZXh0UmVmbG93RW5hYmxlZCkgeworICAgICAgICAgICAgbV9jdXJy
ZW50UGluY2hab29tTm9kZSA9IDA7CisgICAgICAgICAgICBtX2FuY2hvckluTm9kZVJlY3RSYXRp
byA9IEZsb2F0UG9pbnQoLTEsIC0xKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHpvb207CisgICAgem9vbS5zY2FsZShz
Y2FsZSk7CisKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICBpZiAobG9hZFN0YXRlKCkgPCBG
aW5pc2hlZCkKKyAgICAgICAgUGxhdGZvcm06OmxvZyhQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAi
V2ViUGFnZVByaXZhdGU6Onpvb21BYm91dFBvaW50IHNjYWxlICVmIGFuY2hvciAoJWYsICVmKSIs
IHNjYWxlLCBhbmNob3IueCgpLCBhbmNob3IueSgpKTsKKyNlbmRpZgorCisgICAgLy8gT3VyIGN1
cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIGluIGZsb2F0LgorICAgIEZsb2F0UG9pbnQgc2Nyb2xsUG9z
aXRpb24gPSB0aGlzLT5zY3JvbGxQb3NpdGlvbigpOworCisgICAgLy8gQW5jaG9yIG9mZnNldCBm
cm9tIHNjcm9sbCBwb3NpdGlvbiBpbiBmbG9hdC4KKyAgICBGbG9hdFBvaW50IGFuY2hvck9mZnNl
dChhbmNob3IueCgpIC0gc2Nyb2xsUG9zaXRpb24ueCgpLCBhbmNob3IueSgpIC0gc2Nyb2xsUG9z
aXRpb24ueSgpKTsKKworICAgIC8vIFRoZSBob3Jpem9udGFsIHNjYWxpbmcgZmFjdG9yIGFuZCB2
ZXJ0aWNhbCBzY2FsaW5nIGZhY3RvciBzaG91bGQgYmUgZXF1YWwKKyAgICAvLyB0byBwcmVzZXJ2
ZSBhc3BlY3QgcmF0aW8gb2YgY29udGVudC4KKyAgICBBU1NFUlQobV90cmFuc2Zvcm1hdGlvbk1h
dHJpeC0+bTExKCkgPT0gbV90cmFuc2Zvcm1hdGlvbk1hdHJpeC0+bTIyKCkpOworCisgICAgLy8g
TmVlZCB0byBpbnZlcnQgdGhlIHByZXZpb3VzIHRyYW5zZm9ybSB0byBhbmNob3IgdGhlIHZpZXdw
b3J0LgorICAgIGRvdWJsZSBpbnZlcnNlU2NhbGUgPSBzY2FsZSAvIG1fdHJhbnNmb3JtYXRpb25N
YXRyaXgtPm0xMSgpOworCisgICAgLy8gQWN0dWFsIHpvb20uCisgICAgKm1fdHJhbnNmb3JtYXRp
b25NYXRyaXggPSB6b29tOworCisgICAgLy8gU3VzcGVuZCBhbGwgc2NyZWVuIHVwZGF0ZXMgdG8g
dGhlIGJhY2tpbmdzdG9yZS4KKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+c3VzcGVuZFNjcmVlbkFu
ZEJhY2tpbmdTdG9yZVVwZGF0ZXMoKTsKKworICAgIHVwZGF0ZVZpZXdwb3J0U2l6ZSgpOworCisg
ICAgSW50UG9pbnQgbmV3U2Nyb2xsUG9zaXRpb24oSW50UG9pbnQobWF4KDAsIHN0YXRpY19jYXN0
PGludD4ocm91bmRmKGFuY2hvci54KCkgLSBhbmNob3JPZmZzZXQueCgpIC8gaW52ZXJzZVNjYWxl
KSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCgwLCBzdGF0
aWNfY2FzdDxpbnQ+KHJvdW5kZihhbmNob3IueSgpIC0gYW5jaG9yT2Zmc2V0LnkoKSAvIGludmVy
c2VTY2FsZSkpKSkpOworCisgICAgaWYgKG1fd2ViUGFnZS0+c2V0dGluZ3MoKS0+dGV4dFJlZmxv
d01vZGUoKSA9PSBXZWJTZXR0aW5nczo6VGV4dFJlZmxvd0VuYWJsZWQpIHsKKyAgICAgICAgLy8g
VGhpcyBpcyBhIGhhY2sgZm9yIGVtYWlsIHdoaWNoIGhhcyByZWZsb3cgYWx3YXlzIHR1cm5lZCBv
bi4KKyAgICAgICAgbV9tYWluRnJhbWUtPnZpZXcoKS0+c2V0TmVlZHNMYXlvdXQoKTsKKyAgICAg
ICAgcmVxdWVzdExheW91dElmTmVlZGVkKCk7CisgICAgICAgIGlmIChtX2N1cnJlbnRQaW5jaFpv
b21Ob2RlKQorICAgICAgICAgICAgbmV3U2Nyb2xsUG9zaXRpb24gPSBjYWxjdWxhdGVSZWZsb3dl
ZFNjcm9sbFBvc2l0aW9uKGFuY2hvck9mZnNldCwgc2NhbGUgPT0gbWluaW11bVNjYWxlKCkgPyAx
IDogaW52ZXJzZVNjYWxlKTsKKyAgICAgICAgIG1fY3VycmVudFBpbmNoWm9vbU5vZGUgPSAwOwor
ICAgICAgICAgbV9hbmNob3JJbk5vZGVSZWN0UmF0aW8gPSBGbG9hdFBvaW50KC0xLCAtMSk7Cisg
ICAgfQorCisgICAgc2V0U2Nyb2xsUG9zaXRpb24obmV3U2Nyb2xsUG9zaXRpb24pOworCisgICAg
bm90aWZ5VHJhbnNmb3JtQ2hhbmdlZCgpOworCisgICAgYm9vbCBpc0xvYWRpbmcgPSB0aGlzLT5p
c0xvYWRpbmcoKTsKKworICAgIC8vIFdlIG5lZWQgdG8gaW52YWxpZGF0ZSBhbGwgdGlsZXMgYm90
aCB2aXNpYmxlIGFuZCBub24tdmlzaWJsZSBpZiB3ZSdyZSBsb2FkaW5nLgorICAgIG1fYmFja2lu
Z1N0b3JlLT5kLT51cGRhdGVUaWxlcyhpc0xvYWRpbmcgLyogdXBkYXRlVmlzaWJsZSAqLywgZmFs
c2UgLyogaW1tZWRpYXRlICovKTsKKworICAgIG1fY2xpZW50LT5yZXNldEJpdG1hcFpvb21TY2Fs
ZShtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tMTEoKSk7CisKKyAgICBib29sIHNob3VsZFJlbmRl
ciA9ICFpc0xvYWRpbmcgfHwgbV91c2VyUGVyZm9ybWVkTWFudWFsWm9vbSB8fCBmb3JjZVJlbmRl
cmluZzsKKyAgICBib29sIHNob3VsZENsZWFyVmlzaWJsZVpvb20gPSBpc0xvYWRpbmcgJiYgc2hv
dWxkUmVuZGVyOworCisgICAgaWYgKHNob3VsZENsZWFyVmlzaWJsZVpvb20pIHsKKyAgICAgICAg
Ly8gSWYgd2UgYXJlIGxvYWRpbmcgYW5kIHJlbmRlcmluZyB0aGVuIHdlIG5lZWQgdG8gY2xlYXIg
dGhlIHJlbmRlciBxdWV1ZSdzCisgICAgICAgIC8vIHZpc2libGUgem9vbSBqb2JzIGFzIHRoZXkg
d2lsbCBiZSBpcnJlbGV2YW50IHdpdGggdGhlIHJlbmRlciBiZWxvdy4KKyAgICAgICAgbV9iYWNr
aW5nU3RvcmUtPmQtPmNsZWFyVmlzaWJsZVpvb20oKTsKKyAgICB9CisKKyAgICAvLyBDbGVhciB3
aW5kb3cgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBhcnRpZmFjdHMuCisgICAgaWYgKHNob3Vs
ZFJlbmRlcikgeworICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+Y2xlYXJXaW5kb3coKTsKKyAg
ICAgICAgLy8gUmVzdW1lIGFsbCBzY3JlZW4gdXBkYXRlcyB0byB0aGUgYmFja2luZ3N0b3JlIGFu
ZCByZW5kZXIrYmxpdCB2aXNpYmxlIGNvbnRlbnRzIHRvIHNjcmVlbi4KKyAgICAgICAgbV9iYWNr
aW5nU3RvcmUtPmQtPnJlc3VtZVNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoQmFja2luZ1N0
b3JlOjpSZW5kZXJBbmRCbGl0KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBSZXN1bWUgYWxs
IHNjcmVlbiB1cGRhdGVzIHRvIHRoZSBiYWNraW5nc3RvcmUgYnV0IGRvIG5vdCBibGl0IHRvIHRo
ZSBzY3JlZW4gYmVjYXVzZSB3ZSBub3QgcmVuZGVyaW5nLgorICAgICAgICBtX2JhY2tpbmdTdG9y
ZS0+ZC0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6Ok5v
bmUpOworICAgIH0KKworICAgIG1fY2xpZW50LT56b29tQ2hhbmdlZChtX3dlYlBhZ2UtPmlzTWlu
Wm9vbWVkKCksIG1fd2ViUGFnZS0+aXNNYXhab29tZWQoKSwgIXNob3VsZFpvb21PbkVzY2FwZSgp
LCBjdXJyZW50U2NhbGUoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworSW50UG9pbnQgV2Vi
UGFnZVByaXZhdGU6OmNhbGN1bGF0ZVJlZmxvd2VkU2Nyb2xsUG9zaXRpb24oY29uc3QgRmxvYXRQ
b2ludCYgYW5jaG9yT2Zmc2V0LCBkb3VibGUgaW52ZXJzZVNjYWxlKQoreworICAgIC8vIFNob3Vs
ZCBvbmx5IGJlIGludm9rZWQgd2hlbiB0ZXh0IHJlZmxvdyBpcyBlbmFibGVkLgorICAgIEFTU0VS
VChtX3dlYlBhZ2UtPnNldHRpbmdzKCktPnRleHRSZWZsb3dNb2RlKCkgPT0gV2ViU2V0dGluZ3M6
OlRleHRSZWZsb3dFbmFibGVkKTsKKworICAgIGludCBvZmZzZXRZID0gMDsKKyAgICBpbnQgb2Zm
c2V0WCA9IDA7CisKKyAgICBJbnRSZWN0IG5vZGVSZWN0ID0gcmVjdEZvck5vZGUobV9jdXJyZW50
UGluY2hab29tTm9kZS5nZXQoKSk7CisKKyAgICBpZiAobV9jdXJyZW50UGluY2hab29tTm9kZS0+
cmVuZGVyZXIoKSAmJiBtX2FuY2hvckluTm9kZVJlY3RSYXRpby55KCkgPj0gMCkgeworICAgICAg
ICBvZmZzZXRZID0gbm9kZVJlY3QuaGVpZ2h0KCkgKiBtX2FuY2hvckluTm9kZVJlY3RSYXRpby55
KCk7CisgICAgICAgIGlmIChtX2N1cnJlbnRQaW5jaFpvb21Ob2RlLT5yZW5kZXJlcigpLT5pc0lt
YWdlKCkgJiYgbV9hbmNob3JJbk5vZGVSZWN0UmF0aW8ueCgpID4gMCkKKyAgICAgICAgICAgIG9m
ZnNldFggPSBub2RlUmVjdC53aWR0aCgpICogbV9hbmNob3JJbk5vZGVSZWN0UmF0aW8ueCgpIC0g
YW5jaG9yT2Zmc2V0LngoKSAvIGludmVyc2VTY2FsZTsKKyAgICB9CisKKyAgICBJbnRSZWN0IHJl
Zmxvd2VkUmVjdCA9IGFkanVzdFJlY3RPZmZzZXRGb3JGcmFtZU9mZnNldChub2RlUmVjdCwgbV9j
dXJyZW50UGluY2hab29tTm9kZS5nZXQoKSk7CisKKyAgICByZXR1cm4gSW50UG9pbnQobWF4KDAs
IHN0YXRpY19jYXN0PGludD4ocm91bmRmKHJlZmxvd2VkUmVjdC54KCkgKyBvZmZzZXRYKSkpLAor
ICAgICAgICAgICAgICAgICAgICBtYXgoMCwgc3RhdGljX2Nhc3Q8aW50Pihyb3VuZGYocmVmbG93
ZWRSZWN0LnkoKSArIG9mZnNldFkgLSBhbmNob3JPZmZzZXQueSgpIC8gaW52ZXJzZVNjYWxlKSkp
KTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6c2NoZWR1bGVab29tQWJvdXRQb2ludChkb3Vi
bGUgdW5jbGFtcGVkU2NhbGUsIGNvbnN0IEZsb2F0UG9pbnQmIGFuY2hvciwgYm9vbCBlbmZvcmNl
U2NhbGVDbGFtcGluZywgYm9vbCBmb3JjZVJlbmRlcmluZykKK3sKKyAgICBkb3VibGUgc2NhbGU7
CisgICAgaWYgKCFzaG91bGRab29tQWJvdXRQb2ludCh1bmNsYW1wZWRTY2FsZSwgYW5jaG9yLCBl
bmZvcmNlU2NhbGVDbGFtcGluZywgJnNjYWxlKSkgeworICAgICAgICAvLyBXZSBjb3VsZCBiZSBi
YWNrIHRvIHRoZSByaWdodCB6b29tIGxldmVsIGJlZm9yZSB0aGUgdGltZXIgaGFzCisgICAgICAg
IC8vIHRpbWVkIG91dCwgYmVjYXVzZSBvZiB3aWdnbGluZyBiYWNrIGFuZCBmb3J0aC4gU3RvcCB0
aGUgdGltZXIuCisgICAgICAgIHVuc2NoZWR1bGVab29tQWJvdXRQb2ludCgpOworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRm9yIHNvbWUgcmVhc29uLCB0aGUgYml0bWFw
IHpvb20gd2FudHMgYW4gYW5jaG9yIGluIGJhY2tpbmdzdG9yZSBjb29yZGluYXRlcyEKKyAgICAv
LyB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIHpvb21BYm91dFBvaW50LCB3aGljaCB3YW50cyBjb250
ZW50IGNvb3JkaW5hdGVzLgorICAgIC8vIFNlZSBSSU0gQnVnICM2NDEuCisKKyAgICBGbG9hdFBv
aW50IHRyYW5zZm9ybWVkQW5jaG9yID0gbWFwVG9UcmFuc2Zvcm1lZEZsb2F0UG9pbnQoYW5jaG9y
KTsKKyAgICBGbG9hdFBvaW50IHRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24gPSBtYXBUb1RyYW5z
Zm9ybWVkRmxvYXRQb2ludChzY3JvbGxQb3NpdGlvbigpKTsKKworICAgIC8vIFByb2hpYml0IGJh
Y2tpbmdzdG9yZSBmcm9tIHVwZGF0aW5nIHRoZSB3aW5kb3cgb3ZlcnRvcCBvZiB0aGUgYml0bWFw
LgorICAgIG1fYmFja2luZ1N0b3JlLT5kLT5zdXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBk
YXRlcygpOworCisgICAgLy8gTmVlZCB0byBpbnZlcnQgdGhlIHByZXZpb3VzIHRyYW5zZm9ybSB0
byBhbmNob3IgdGhlIHZpZXdwb3J0LgorICAgIGRvdWJsZSB6b29tRnJhY3Rpb24gPSBzY2FsZSAv
IHRyYW5zZm9ybWF0aW9uTWF0cml4KCktPm0xMSgpOworCisgICAgLy8gQW5jaG9yIG9mZnNldCBm
cm9tIHNjcm9sbCBwb3NpdGlvbiBpbiBmbG9hdC4KKyAgICBGbG9hdFBvaW50IGFuY2hvck9mZnNl
dCh0cmFuc2Zvcm1lZEFuY2hvci54KCkgLSB0cmFuc2Zvcm1lZFNjcm9sbFBvc2l0aW9uLngoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZEFuY2hvci55KCkgLSB0cmFu
c2Zvcm1lZFNjcm9sbFBvc2l0aW9uLnkoKSk7CisKKyAgICBJbnRQb2ludCBzcmNQb2ludCgKKyAg
ICAgICAgc3RhdGljX2Nhc3Q8aW50Pihyb3VuZGYodHJhbnNmb3JtZWRBbmNob3IueCgpIC0gYW5j
aG9yT2Zmc2V0LngoKSAvIHpvb21GcmFjdGlvbikpLAorICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+
KHJvdW5kZih0cmFuc2Zvcm1lZEFuY2hvci55KCkgLSBhbmNob3JPZmZzZXQueSgpIC8gem9vbUZy
YWN0aW9uKSkpOworCisgICAgY29uc3QgSW50UmVjdCB2aWV3cG9ydFJlY3QgPSBJbnRSZWN0KElu
dFBvaW50KDAsIDApLCB0cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpKTsKKyAgICBjb25zdCBJbnRS
ZWN0IGRzdFJlY3QgPSB2aWV3cG9ydFJlY3Q7CisKKyAgICAvLyBUaGlzIGlzIHRoZSByZWN0IHRv
IHBhc3MgYXMgdGhlIGFjdHVhbCBzb3VyY2UgcmVjdCBpbiB0aGUgYmFja2luZ3N0b3JlCisgICAg
Ly8gZm9yIHRoZSB0cmFuc2Zvcm0gZ2l2ZW4gYnkgem9vbS4KKyAgICBJbnRSZWN0IHNyY1JlY3Qo
c3JjUG9pbnQueCgpLAorICAgICAgICAgICAgICAgICAgICBzcmNQb2ludC55KCksCisgICAgICAg
ICAgICAgICAgICAgIHZpZXdwb3J0UmVjdC53aWR0aCgpIC8gem9vbUZyYWN0aW9uLAorICAgICAg
ICAgICAgICAgICAgICB2aWV3cG9ydFJlY3QuaGVpZ2h0KCkgLyB6b29tRnJhY3Rpb24pOworICAg
IG1fYmFja2luZ1N0b3JlLT5kLT5ibGl0Q29udGVudHMoZHN0UmVjdCwgc3JjUmVjdCk7CisKKyAg
ICBtX2RlbGF5ZWRab29tQXJndW1lbnRzLnNjYWxlID0gc2NhbGU7CisgICAgbV9kZWxheWVkWm9v
bUFyZ3VtZW50cy5hbmNob3IgPSBhbmNob3I7CisgICAgbV9kZWxheWVkWm9vbUFyZ3VtZW50cy5l
bmZvcmNlU2NhbGVDbGFtcGluZyA9IGVuZm9yY2VTY2FsZUNsYW1waW5nOworICAgIG1fZGVsYXll
ZFpvb21Bcmd1bWVudHMuZm9yY2VSZW5kZXJpbmcgPSBmb3JjZVJlbmRlcmluZzsKKyAgICBtX2Rl
bGF5ZWRab29tVGltZXItPnN0YXJ0T25lU2hvdChkZWxheWVkWm9vbUludGVydmFsKTsKKworICAg
IHJldHVybiB0cnVlOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjp1bnNjaGVkdWxlWm9vbUFi
b3V0UG9pbnQoKQoreworICAgIGlmIChtX2RlbGF5ZWRab29tVGltZXItPmlzQWN0aXZlKCkpCisg
ICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRh
dGVzKEJhY2tpbmdTdG9yZTo6Tm9uZSk7CisKKyAgICBtX2RlbGF5ZWRab29tVGltZXItPnN0b3Ao
KTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6em9vbUFib3V0UG9pbnRUaW1lckZpcmVkKFRp
bWVyPFdlYlBhZ2VQcml2YXRlPiopCit7CisgICAgem9vbUFib3V0UG9pbnQobV9kZWxheWVkWm9v
bUFyZ3VtZW50cy5zY2FsZSwgbV9kZWxheWVkWm9vbUFyZ3VtZW50cy5hbmNob3IsIG1fZGVsYXll
ZFpvb21Bcmd1bWVudHMuZW5mb3JjZVNjYWxlQ2xhbXBpbmcsIG1fZGVsYXllZFpvb21Bcmd1bWVu
dHMuZm9yY2VSZW5kZXJpbmcpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXROZWVkc0xh
eW91dCgpCit7CisgICAgRnJhbWVWaWV3KiB2aWV3ID0gbV9tYWluRnJhbWUtPnZpZXcoKTsKKyAg
ICBBU1NFUlQodmlldyk7CisgICAgdmlldy0+c2V0TmVlZHNMYXlvdXQoKTsKK30KKwordm9pZCBX
ZWJQYWdlUHJpdmF0ZTo6cmVxdWVzdExheW91dElmTmVlZGVkKCkgY29uc3QKK3sKKyAgICBGcmFt
ZVZpZXcqIHZpZXcgPSBtX21haW5GcmFtZS0+dmlldygpOworICAgIEFTU0VSVCh2aWV3KTsKKyAg
ICB2aWV3LT51cGRhdGVMYXlvdXRBbmRTdHlsZUlmTmVlZGVkUmVjdXJzaXZlKCk7CisgICAgQVNT
RVJUKCF2aWV3LT5uZWVkc0xheW91dCgpKTsKK30KKworSW50UG9pbnQgV2ViUGFnZVByaXZhdGU6
OnNjcm9sbFBvc2l0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9iYWNraW5nU3RvcmVDbGll
bnQtPnNjcm9sbFBvc2l0aW9uKCk7Cit9CisKK0ludFBvaW50IFdlYlBhZ2VQcml2YXRlOjptYXhp
bXVtU2Nyb2xsUG9zaXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNs
aWVudC0+bWF4aW11bVNjcm9sbFBvc2l0aW9uKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6
OnNldFNjcm9sbFBvc2l0aW9uKGNvbnN0IEludFBvaW50JiBwb3MpCit7CisgICAgbV9iYWNraW5n
U3RvcmVDbGllbnQtPnNldFNjcm9sbFBvc2l0aW9uKHBvcyk7Cit9CisKK2Jvb2wgV2ViUGFnZVBy
aXZhdGU6OnNob3VsZFNlbmRSZXNpemVFdmVudCgpCit7CisgICAgaWYgKCFtX21haW5GcmFtZS0+
ZG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gUFIjOTY4NjUgOiBQ
cm92aWRlIGFuIG9wdGlvbiB0byBhbHdheXMgc2VuZCByZXNpemUgZXZlbnRzLCByZWdhcmRsZXNz
IG9mIHRoZSBsb2FkaW5nCisgICAgLy8gICAgICAgICAgICBzdGF0dXMuIFRoZSBzY2VuYXJpbyBm
b3IgdGhpcyBhcmUgU2FwcGhpcmUgYXBwbGljYXRpb25zIHdoaWNoIHRlbmQgdG8KKyAgICAvLyAg
ICAgICAgICAgIG1haW50YWluIGFuIG9wZW4gR0VUIHJlcXVlc3QgdG8gdGhlIHNlcnZlci4gVGhp
cyBvcGVuIEdFVCByZXN1bHRzIGluCisgICAgLy8gICAgICAgICAgICB3ZWJraXQgdGhpbmtpbmcg
dGhhdCBjb250ZW50IGlzIHN0aWxsIGFycml2aW5nIHdoZW4gYXQgdGhlIGFwcGxpY2F0aW9uCisg
ICAgLy8gICAgICAgICAgICBsZXZlbCBpdCBpcyBjb25zaWRlcmVkIGZ1bGx5IGxvYWRlZC4KKyAg
ICAvLworICAgIC8vICAgICAgICAgICAgTk9URTogQ2FyZSBtdXN0IGJlIGV4ZXJjaXNlZCBpbiB0
aGUgdXNlIG9mIHRoaXMgb3B0aW9uLCBhcyBpdCBieXBhc3NlcworICAgIC8vICAgICAgICAgICAg
ICAgICAgdGhlIHNhbml0eSBwcm92aWRlZCBpbiAnaXNMb2FkaW5nSW5BUElTZW5zZSgpJyBiZWxv
dy4KKyAgICAvLworICAgIHN0YXRpYyBjb25zdCBib29sIHVucmVzdHJpY3RlZFJlc2l6ZUV2ZW50
cyA9IFBsYXRmb3JtOjpTZXR0aW5nczo6Z2V0KCktPnVucmVzdHJpY3RlZFJlc2l6ZUV2ZW50cygp
OworICAgIGlmICh1bnJlc3RyaWN0ZWRSZXNpemVFdmVudHMpCisgICAgICAgIHJldHVybiB0cnVl
OworCisgICAgLy8gRG9uJ3Qgc2VuZCB0aGUgcmVzaXplIGV2ZW50IGlmIHRoZSBkb2N1bWVudCBp
cyBsb2FkaW5nLiBTb21lIHBhZ2VzIGF1dG9tYXRpY2FsbHkgcmVsb2FkCisgICAgLy8gd2hlbiB0
aGUgd2luZG93IGlzIHJlc2l6ZWQ7IFNhZmFyaSBvbiBpUGhvbmUgb2Z0ZW4gcmVzaXplcyB0aGUg
d2luZG93IHdoaWxlIHNldHRpbmcgdXAgaXRzCisgICAgLy8gdmlld3BvcnQuIFRoaXMgb2J2aW91
c2x5IGNhbiBjYXVzZSBwcm9ibGVtcy4KKyAgICBEb2N1bWVudExvYWRlciogZG9jdW1lbnRMb2Fk
ZXIgPSBtX21haW5GcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCk7CisgICAgaWYgKGRv
Y3VtZW50TG9hZGVyICYmIGRvY3VtZW50TG9hZGVyLT5pc0xvYWRpbmdJbkFQSVNlbnNlKCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFdlYlBh
Z2VQcml2YXRlOjp3aWxsRGVmZXJMb2FkaW5nKCkKK3sKKyAgICBtX2NsaWVudC0+d2lsbERlZmVy
TG9hZGluZygpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpkaWRSZXN1bWVMb2FkaW5nKCkK
K3sKKyAgICBtX2NsaWVudC0+ZGlkUmVzdW1lTG9hZGluZygpOworfQorCitib29sIFdlYlBhZ2U6
OnNjcm9sbEJ5KGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSwgYm9vbCBzY3JvbGxNYWlu
RnJhbWUpCit7CisgICAgZC0+bV9iYWNraW5nU3RvcmVDbGllbnQtPnNldElzQ2xpZW50R2VuZXJh
dGVkU2Nyb2xsKHRydWUpOworICAgIGJvb2wgYiA9IGQtPnNjcm9sbEJ5KGRlbHRhLndpZHRoKCks
IGRlbHRhLmhlaWdodCgpLCBzY3JvbGxNYWluRnJhbWUpOworICAgIGQtPm1fYmFja2luZ1N0b3Jl
Q2xpZW50LT5zZXRJc0NsaWVudEdlbmVyYXRlZFNjcm9sbChmYWxzZSk7CisgICAgcmV0dXJuIGI7
Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OnNjcm9sbEJ5KGludCBkZWx0YVgsIGludCBkZWx0
YVksIGJvb2wgc2Nyb2xsTWFpbkZyYW1lKQoreworICAgIEludFNpemUgZGVsdGEoZGVsdGFYLCBk
ZWx0YVkpOworICAgIGlmICghc2Nyb2xsTWFpbkZyYW1lKSB7CisgICAgICAgIC8vIFdlIG5lZWQg
dG8gd29yayBhcm91bmQgdGhlIGZhY3QgdGhhdCA6Om1hcHtUbyxGcm9tfVRyYW5zZm9ybWVkIGRv
IG5vdAorICAgICAgICAvLyB3b3JrIHdlbGwgd2l0aCBuZWdhdGl2ZSB2YWx1ZXMsIGxpa2UgYSBu
ZWdhdGl2ZSB3aWR0aCBvciBoZWlnaHQgb2YgYW4gSW50U2l6ZS4KKyAgICAgICAgSW50U2l6ZSBj
b3BpZWREZWx0YShJbnRTaXplKGFicyhkZWx0YS53aWR0aCgpKSwgYWJzKGRlbHRhLmhlaWdodCgp
KSkpOworICAgICAgICBJbnRTaXplIHVudHJhbnNmb3JtZWRDb3BpZWREZWx0YSA9IG1hcEZyb21U
cmFuc2Zvcm1lZChjb3BpZWREZWx0YSk7CisgICAgICAgIGRlbHRhID0gSW50U2l6ZSgKKyAgICAg
ICAgICAgIGRlbHRhLndpZHRoKCkgPCAwID8gLXVudHJhbnNmb3JtZWRDb3BpZWREZWx0YS53aWR0
aCgpIDogdW50cmFuc2Zvcm1lZENvcGllZERlbHRhLndpZHRoKCksCisgICAgICAgICAgICBkZWx0
YS5oZWlnaHQoKSA8IDAgPyAtdW50cmFuc2Zvcm1lZENvcGllZERlbHRhLmhlaWdodCgpOiB1bnRy
YW5zZm9ybWVkQ29waWVkRGVsdGEuaGVpZ2h0KCkpOworCisgICAgICAgIGlmIChtX2luUmVnaW9u
U2Nyb2xsU3RhcnRpbmdOb2RlKSB7CisgICAgICAgICAgICBpZiAoc2Nyb2xsTm9kZVJlY3Vyc2l2
ZWx5KG1faW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGUuZ2V0KCksIGRlbHRhKSkgeworICAgICAg
ICAgICAgICAgIG1fc2VsZWN0aW9uSGFuZGxlci0+c2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKCk7
CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFdlIGhhdmUgY29kZSBpbiBwbGFjZSB0byBoYW5k
bGUgc2Nyb2xsaW5nIGFuZCBjbGlwcGluZyB0YXAgaGlnaGxpZ2h0CisgICAgICAgICAgICAgICAg
Ly8gb24gaW4tcmVnaW9uIHNjcm9sbGluZy4gQXMgc29vbiBhcyBpdCBpcyBmYXN0IGVub3VnaCAo
aS5lLiB3ZSBoYXZlIGl0IGJhY2tlZCBieQorICAgICAgICAgICAgICAgIC8vIGEgYmFja2luZyBz
dG9yZSksIHdlIGNhbiByZWxpYWJseSBtYWtlIHVzZSBvZiBpdCBpbiB0aGUgcmVhbCB3b3JsZC4K
KyAgICAgICAgICAgICAgICAvLyBtX3RvdWNoRXZlbnRIYW5kbGVyLT5kcmF3VGFwSGlnaGxpZ2h0
KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2V0U2Nyb2xsUG9zaXRp
b24oc2Nyb2xsUG9zaXRpb24oKSArIGRlbHRhKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9p
ZCBXZWJQYWdlOjpub3RpZnlJblJlZ2lvblNjcm9sbFN0YXR1c0NoYW5nZWQoYm9vbCBzdGF0dXMp
Cit7CisgICAgZC0+bm90aWZ5SW5SZWdpb25TY3JvbGxTdGF0dXNDaGFuZ2VkKHN0YXR1cyk7Cit9
CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6Om5vdGlmeUluUmVnaW9uU2Nyb2xsU3RhdHVzQ2hhbmdl
ZChib29sIHN0YXR1cykKK3sKKyAgICBpZiAoIXN0YXR1cyAmJiBtX2luUmVnaW9uU2Nyb2xsU3Rh
cnRpbmdOb2RlKSB7CisgICAgICAgIGVucXVldWVSZW5kZXJpbmdPZkNsaXBwZWRDb250ZW50T2ZT
Y3JvbGxhYmxlTm9kZUFmdGVySW5SZWdpb25TY3JvbGxpbmcobV9pblJlZ2lvblNjcm9sbFN0YXJ0
aW5nTm9kZS5nZXQoKSk7CisgICAgICAgIG1faW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGUgPSAw
OworICAgIH0KK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6ZW5xdWV1ZVJlbmRlcmluZ09mQ2xp
cHBlZENvbnRlbnRPZlNjcm9sbGFibGVOb2RlQWZ0ZXJJblJlZ2lvblNjcm9sbGluZyhOb2RlKiBz
Y3JvbGxlZE5vZGUpCit7CisgICAgQVNTRVJUKHNjcm9sbGVkTm9kZSk7CisgICAgaWYgKHNjcm9s
bGVkTm9kZS0+aXNEb2N1bWVudE5vZGUoKSkgeworICAgICAgICBGcmFtZSogZnJhbWUgPSBzdGF0
aWNfY2FzdDxjb25zdCBEb2N1bWVudCo+KHNjcm9sbGVkTm9kZSktPmZyYW1lKCk7CisgICAgICAg
IEFTU0VSVChmcmFtZSk7CisgICAgICAgIGlmICghZnJhbWUpCisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIEFTU0VSVChmcmFtZSAhPSBtX21haW5GcmFtZSk7CisgICAgICAgIEZyYW1lVmll
dyogdmlldyA9IGZyYW1lLT52aWV3KCk7CisgICAgICAgIGlmICghdmlldykKKyAgICAgICAgICAg
IHJldHVybjsKKworICAgICAgICAvLyBTdGVwczoKKyAgICAgICAgLy8gIzEgLSBHZXQgZnJhbWUg
cmVjdCBpbiBjb250ZW50cyBjb29yZHMuCisgICAgICAgIC8vICMyIC0gR2V0IHRoZSBjbGlwcGVk
IHNjcm9sbHZpZXcgcmVjdCBpbiBjb250ZW50cyBjb29yZHMuCisgICAgICAgIC8vICMzIC0gVGFr
ZSB0cmFuc2Zvcm0gaW50byBhY2NvdW50IGZvciAxIGFuZCAyLgorICAgICAgICAvLyAjNCAtIFN1
YnRyYWN0IDIgZnJvbSAxLCBzbyB3ZSBrbm93IGV4YWN0bHkgd2hpY2ggYXJlYXMgb2YgdGhlIGZy
YW1lCisgICAgICAgIC8vICAgICAgYXJlIG9mZnNjcmVlbiwgYW5kIG5lZWQgYXN5bmMgcmVwYWlu
dGluZy4KKyAgICAgICAgRnJhbWVWaWV3KiBtYWluRnJhbWVWaWV3ID0gbV9tYWluRnJhbWUtPnZp
ZXcoKTsKKyAgICAgICAgQVNTRVJUKG1haW5GcmFtZVZpZXcpOworICAgICAgICBJbnRSZWN0IGZy
YW1lUmVjdCA9IHZpZXctPmZyYW1lUmVjdCgpOworICAgICAgICBmcmFtZVJlY3QgPSBmcmFtZS0+
dHJlZSgpLT5wYXJlbnQoKS0+dmlldygpLT5jb250ZW50c1RvV2luZG93KGZyYW1lUmVjdCk7Cisg
ICAgICAgIGZyYW1lUmVjdCA9IG1haW5GcmFtZVZpZXctPndpbmRvd1RvQ29udGVudHMoZnJhbWVS
ZWN0KTsKKworICAgICAgICBJbnRSZWN0IHZpc2libGVXaW5kb3dSZWN0ID0gZ2V0UmVjdXJzaXZl
VmlzaWJsZVdpbmRvd1JlY3Qodmlldyk7CisgICAgICAgIEludFJlY3QgdmlzaWJsZUNvbnRlbnRz
UmVjdCA9IG1haW5GcmFtZVZpZXctPndpbmRvd1RvQ29udGVudHModmlzaWJsZVdpbmRvd1JlY3Qp
OworCisgICAgICAgIEludFJlY3QgdHJhbnNmb3JtZWRGcmFtZVJlY3QgPSBtYXBUb1RyYW5zZm9y
bWVkKGZyYW1lUmVjdCk7CisgICAgICAgIEludFJlY3QgdHJhbnNmb3JtZWRWaXNpYmxlQ29udGVu
dHNSZWN0ID0gbWFwVG9UcmFuc2Zvcm1lZCh2aXNpYmxlQ29udGVudHNSZWN0KTsKKworICAgICAg
ICBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiBvZmZzY3JlZW5SZWdpb25PZklmcmFtZQorICAgICAg
ICAgICAgPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKFBsYXRmb3Jt
OjpJbnRSZWN0KHRyYW5zZm9ybWVkRnJhbWVSZWN0KSwgUGxhdGZvcm06OkludFJlY3QodHJhbnNm
b3JtZWRWaXNpYmxlQ29udGVudHNSZWN0KSk7CisKKyAgICAgICAgaWYgKCFvZmZzY3JlZW5SZWdp
b25PZklmcmFtZS5pc0VtcHR5KCkpCisgICAgICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+bV9y
ZW5kZXJRdWV1ZS0+YWRkVG9RdWV1ZShSZW5kZXJRdWV1ZTo6UmVndWxhclJlbmRlciwgb2Zmc2Ny
ZWVuUmVnaW9uT2ZJZnJhbWUucmVjdHMoKSk7CisgICAgfQorfQorCit2b2lkIFdlYlBhZ2VQcml2
YXRlOjpzZXRIYXNJblJlZ2lvblNjcm9sbGFibGVBcmVhcyhib29sIGIpCit7CisgICAgaWYgKGIg
IT0gbV9oYXNJblJlZ2lvblNjcm9sbGFibGVBcmVhcykKKyAgICAgICAgbV9oYXNJblJlZ2lvblNj
cm9sbGFibGVBcmVhcyA9IGI7Cit9CisKK0ludFNpemUgV2ViUGFnZVByaXZhdGU6OnZpZXdwb3J0
U2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1hcEZyb21UcmFuc2Zvcm1lZCh0cmFuc2Zvcm1l
ZFZpZXdwb3J0U2l6ZSgpKTsKK30KKworSW50U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6YWN0dWFsVmlz
aWJsZVNpemUoKSBjb25zdAoreworICAgIHJldHVybiBtYXBGcm9tVHJhbnNmb3JtZWQodHJhbnNm
b3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSgpKTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6aGFz
VmlydHVhbFZpZXdwb3J0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV92aXJ0dWFsVmlld3BvcnRX
aWR0aCAmJiBtX3ZpcnR1YWxWaWV3cG9ydEhlaWdodDsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0
ZTo6dXBkYXRlVmlld3BvcnRTaXplKGJvb2wgc2V0Rml4ZWRSZXBvcnRlZFNpemUsIGJvb2wgc2Vu
ZFJlc2l6ZUV2ZW50KQoreworICAgIEFTU0VSVChtX21haW5GcmFtZS0+dmlldygpKTsKKyAgICBp
ZiAoc2V0Rml4ZWRSZXBvcnRlZFNpemUpCisgICAgICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPnNl
dEZpeGVkUmVwb3J0ZWRTaXplKGFjdHVhbFZpc2libGVTaXplKCkpOworCisgICAgSW50UmVjdCBm
cmFtZVJlY3QgPSBJbnRSZWN0KHNjcm9sbFBvc2l0aW9uKCksIHZpZXdwb3J0U2l6ZSgpKTsKKyAg
ICBpZiAoZnJhbWVSZWN0ICE9IG1fbWFpbkZyYW1lLT52aWV3KCktPmZyYW1lUmVjdCgpKSB7Cisg
ICAgICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPnNldEZyYW1lUmVjdChmcmFtZVJlY3QpOworICAg
ICAgICBtX21haW5GcmFtZS0+dmlldygpLT5hZGp1c3RWaWV3U2l6ZSgpOworICAgIH0KKworICAg
IC8vIFdlJ3JlIGdvaW5nIHRvIG5lZWQgdG8gc2VuZCBhIHJlc2l6ZSBldmVudCB0byBKYXZhU2Ny
aXB0IGJlY2F1c2UKKyAgICAvLyBpbm5lcldpZHRoIGFuZCBpbm5lckhlaWdodCBkZXBlbmQgb24g
Zml4ZWQgcmVwb3J0ZWQgc2l6ZS4KKyAgICAvLyBUaGlzIGlzIGhvdyB3ZSBzdXBwb3J0IG1vYmls
ZSBwYWdlcyB3aGVyZSBKYXZhU2NyaXB0IHJlc2l6ZXMKKyAgICAvLyB0aGUgcGFnZSBpbiBvcmRl
ciB0byBnZXQgYXJvdW5kIHRoZSBmaXhlZCBsYXlvdXQgc2l6ZSwgZS5nLgorICAgIC8vIGdvb2ds
ZSBtYXBzIHdoZW4gaXQgZGV0ZWN0cyBhIG1vYmlsZSB1c2VyIGFnZW50LgorICAgIGlmIChzZW5k
UmVzaXplRXZlbnQgJiYgc2hvdWxkU2VuZFJlc2l6ZUV2ZW50KCkpCisgICAgICAgIG1fbWFpbkZy
YW1lLT5ldmVudEhhbmRsZXIoKS0+c2VuZFJlc2l6ZUV2ZW50KCk7CisKKyAgICAvLyBXaGVuIHRo
ZSBhY3R1YWwgdmlzaWJsZSBzaXplIGNoYW5nZXMsIHdlIGFsc28KKyAgICAvLyBuZWVkIHRvIHJl
cG9zaXRpb24gZml4ZWQgZWxlbWVudHMuCisgICAgbV9tYWluRnJhbWUtPnZpZXcoKS0+cmVwYWlu
dEZpeGVkRWxlbWVudHNBZnRlclNjcm9sbGluZygpOworfQorCitGbG9hdFBvaW50IFdlYlBhZ2VQ
cml2YXRlOjpjZW50ZXJPZlZpc2libGVDb250ZW50c1JlY3QoKSBjb25zdAoreworICAgIC8vIFRo
ZSB2aXNpYmxlIGNvbnRlbnRzIHJlY3QgaW4gZmxvYXQuCisgICAgRmxvYXRSZWN0IHZpc2libGVD
b250ZW50c1JlY3QgPSB0aGlzLT52aXNpYmxlQ29udGVudHNSZWN0KCk7CisKKyAgICAvLyBUaGUg
Y2VudGVyIG9mIHRoZSB2aXNpYmxlIGNvbnRlbnRzIHJlY3QgaW4gZmxvYXQuCisgICAgcmV0dXJu
IEZsb2F0UG9pbnQodmlzaWJsZUNvbnRlbnRzUmVjdC54KCkgKyB2aXNpYmxlQ29udGVudHNSZWN0
LndpZHRoKCkgLyAyLjAsCisgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZUNvbnRlbnRzUmVj
dC55KCkgKyB2aXNpYmxlQ29udGVudHNSZWN0LmhlaWdodCgpIC8gMi4wKTsKK30KKworSW50UmVj
dCBXZWJQYWdlUHJpdmF0ZTo6dmlzaWJsZUNvbnRlbnRzUmVjdCgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fYmFja2luZ1N0b3JlQ2xpZW50LT52aXNpYmxlQ29udGVudHNSZWN0KCk7Cit9CisKK0lu
dFNpemUgV2ViUGFnZVByaXZhdGU6OmNvbnRlbnRzU2l6ZSgpIGNvbnN0Cit7CisgICAgaWYgKCFt
X21haW5GcmFtZS0+dmlldygpKQorICAgICAgICByZXR1cm4gSW50U2l6ZSgpOworCisgICAgcmV0
dXJuIG1fYmFja2luZ1N0b3JlQ2xpZW50LT5jb250ZW50c1NpemUoKTsKK30KKworSW50U2l6ZSBX
ZWJQYWdlUHJpdmF0ZTo6YWJzb2x1dGVWaXNpYmxlT3ZlcmZsb3dTaXplKCkgY29uc3QKK3sKKyAg
ICBpZiAoIW1fbWFpbkZyYW1lLT5jb250ZW50UmVuZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuIElu
dFNpemUoKTsKKworICAgIHJldHVybiBJbnRTaXplKG1fbWFpbkZyYW1lLT5jb250ZW50UmVuZGVy
ZXIoKS0+cmlnaHRBYnNvbHV0ZVZpc2libGVPdmVyZmxvdygpLCBtX21haW5GcmFtZS0+Y29udGVu
dFJlbmRlcmVyKCktPmJvdHRvbUFic29sdXRlVmlzaWJsZU92ZXJmbG93KCkpOworfQorCit2b2lk
IFdlYlBhZ2VQcml2YXRlOjpjb250ZW50c1NpemVDaGFuZ2VkKGNvbnN0IEludFNpemUmIGNvbnRl
bnRzU2l6ZSkKK3sKKyAgICBpZiAobV9wcmV2aW91c0NvbnRlbnRzU2l6ZSA9PSBjb250ZW50c1Np
emUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgb2NjdXIgaW4g
dGhlIG1pZGRsZSBvZiBsYXlvdXQgc28gd2Ugc2V0IGEgZmxhZyBoZXJlIGFuZAorICAgIC8vIGhh
bmRsZSBpdCBhdCB0aGUgZW5kIG9mIHRoZSBsYXlvdXQuCisgICAgbV9jb250ZW50c1NpemVDaGFu
Z2VkID0gdHJ1ZTsKKworI2lmIERFQlVHX1dFQlBBR0VfTE9BRAorICAgIFBsYXRmb3JtOjpsb2co
UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIldlYlBhZ2VQcml2YXRlOjpjb250ZW50c1NpemVDaGFu
Z2VkICVkeCVkIiwgY29udGVudHNTaXplLndpZHRoKCksIGNvbnRlbnRzU2l6ZS5oZWlnaHQoKSk7
CisjZW5kaWYKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6b3ZlcmZsb3dFeGNlZWRzQ29udGVu
dHNTaXplKCkKK3sKKyAgICBtX292ZXJmbG93RXhjZWVkc0NvbnRlbnRzU2l6ZSA9IHRydWU7Cit9
CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmxheW91dEZpbmlzaGVkKCkKK3sKKyAgICBpZiAoIW1f
Y29udGVudHNTaXplQ2hhbmdlZCAmJiAhbV9vdmVyZmxvd0V4Y2VlZHNDb250ZW50c1NpemUpCisg
ICAgICAgIHJldHVybjsKKworICAgIG1fY29udGVudHNTaXplQ2hhbmdlZCA9IGZhbHNlOyAvLyBU
b2dnbGUgdG8gdHVybiBvZmYgbm90aWZpY2F0aW9uIGFnYWluLgorICAgIG1fb3ZlcmZsb3dFeGNl
ZWRzQ29udGVudHNTaXplID0gZmFsc2U7CisKKyAgICBpZiAoY29udGVudHNTaXplKCkuaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBUaGUgY2FsbCB0byB6b29tVG9Jbml0aWFs
U2NhbGVPbkxvYWQgY2FuIGNhdXNlIHJlY3Vyc2l2ZSBsYXlvdXQgd2hlbiBjYWxsZWQgZnJvbQor
ICAgIC8vIHRoZSBtaWRkbGUgb2YgYSBsYXlvdXQsIGJ1dCB0aGUgcmVjdXJzaW9uIGlzIGxpbWl0
ZWQgYnkgZGV0ZWN0aW9uIGNvZGUgaW4KKyAgICAvLyBzZXRWaWV3TW9kZSgpIGFuZCBtaXRpZ2F0
aW9uIGNvZGUgaW4gZml4ZWRMYXlvdXRTaXplKCkuCisgICAgaWYgKGRpZExheW91dEV4Y2VlZE1h
eGltdW1JdGVyYXRpb25zKCkpIHsKKyAgICAgICAgbm90aWZ5VHJhbnNmb3JtZWRDb250ZW50c1Np
emVDaGFuZ2VkKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUZW1wb3Jhcmls
eSBzYXZlIHRoZSBtX3ByZXZpb3VzQ29udGVudHNTaXplIGhlcmUgYmVmb3JlIHVwZGF0aW5nIGl0
IChpbgorICAgIC8vIG5vdGlmeVRyYW5zZm9ybWVkQ29udGVudHNTaXplQ2hhbmdlZCgpKSBzbyB3
ZSBjYW4gY29tcGFyZSBpZiBvdXIgY29udGVudHMKKyAgICAvLyBzaHJ1bmsgYWZ0ZXJ3YXJkcy4K
KyAgICBJbnRTaXplIHByZXZpb3VzQ29udGVudHNTaXplID0gbV9wcmV2aW91c0NvbnRlbnRzU2l6
ZTsKKworICAgIG1fbmVzdGVkTGF5b3V0RmluaXNoZWRDb3VudCsrOworCisgICAgaWYgKGxvYWRT
dGF0ZSgpID09IENvbW1pdHRlZCkKKyAgICAgICAgem9vbVRvSW5pdGlhbFNjYWxlT25Mb2FkKCk7
CisgICAgZWxzZSBpZiAobG9hZFN0YXRlKCkgIT0gTm9uZSkKKyAgICAgICAgbm90aWZ5VHJhbnNm
b3JtZWRDb250ZW50c1NpemVDaGFuZ2VkKCk7CisKKyAgICBtX25lc3RlZExheW91dEZpbmlzaGVk
Q291bnQtLTsKKworICAgIGlmICghbV9uZXN0ZWRMYXlvdXRGaW5pc2hlZENvdW50KSB7CisgICAg
ICAgIC8vIFdoZW4gdGhlIGNvbnRlbnRzIHNocmlua3MsIHRoZXJlIGlzIGEgcmlzayB0aGF0IHdl
CisgICAgICAgIC8vIHdpbGwgYmUgbGVmdCBhdCBhIHNjcm9sbCBwb3NpdGlvbiB0aGF0IGxpZXMg
b3V0c2lkZSBvZiB0aGUKKyAgICAgICAgLy8gY29udGVudHMgcmVjdC4gU2luY2Ugd2UgYWxsb3cg
b3ZlcnNjcm9sbGluZyBhbmQgbmVnbGVjdAorICAgICAgICAvLyB0byBjbGFtcCBvdmVyc2Nyb2xs
IGluIG9yZGVyIHRvIHJldGFpbiBpbnB1dCBmb2N1cyAoUklNIEJ1ZyAjNDE0KQorICAgICAgICAv
LyB3ZSBuZWVkIHRvIGNsYW1wIHNvbWV3aGVyZSwgYW5kIHRoaXMgaXMgd2hlcmUgd2Uga25vdyB0
aGUKKyAgICAgICAgLy8gY29udGVudHMgc2l6ZSBoYXMgY2hhbmdlZC4KKworICAgICAgICBpZiAo
Y29udGVudHNTaXplKCkgIT0gcHJldmlvdXNDb250ZW50c1NpemUpIHsKKworICAgICAgICAgICAg
SW50UG9pbnQgbmV3U2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbigpOworCisgICAgICAg
ICAgICBpZiAoY29udGVudHNTaXplKCkuaGVpZ2h0KCkgPCBwcmV2aW91c0NvbnRlbnRzU2l6ZS5o
ZWlnaHQoKSkgeworICAgICAgICAgICAgICAgIEludFBvaW50IHNjcm9sbFBvc2l0aW9uV2l0aEhl
aWdodFNocnVuayA9IEludFBvaW50KG5ld1Njcm9sbFBvc2l0aW9uLngoKSwgbWF4aW11bVNjcm9s
bFBvc2l0aW9uKCkueSgpKTsKKyAgICAgICAgICAgICAgICBuZXdTY3JvbGxQb3NpdGlvbiA9IG5l
d1Njcm9sbFBvc2l0aW9uLnNocnVua1RvKHNjcm9sbFBvc2l0aW9uV2l0aEhlaWdodFNocnVuayk7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb250ZW50c1NpemUoKS53aWR0aCgp
IDwgcHJldmlvdXNDb250ZW50c1NpemUud2lkdGgoKSkgeworICAgICAgICAgICAgICAgIEludFBv
aW50IHNjcm9sbFBvc2l0aW9uV2l0aFdpZHRoU2hydW5rID0gSW50UG9pbnQobWF4aW11bVNjcm9s
bFBvc2l0aW9uKCkueCgpLCBuZXdTY3JvbGxQb3NpdGlvbi55KCkpOworICAgICAgICAgICAgICAg
IG5ld1Njcm9sbFBvc2l0aW9uID0gbmV3U2Nyb2xsUG9zaXRpb24uc2hydW5rVG8oc2Nyb2xsUG9z
aXRpb25XaXRoV2lkdGhTaHJ1bmspOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAo
bmV3U2Nyb2xsUG9zaXRpb24gIT0gc2Nyb2xsUG9zaXRpb24oKSkgeworICAgICAgICAgICAgICAg
IHNldFNjcm9sbFBvc2l0aW9uKG5ld1Njcm9sbFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBu
b3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgIH0KK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6em9vbVRvSW5pdGlhbFNjYWxlT25M
b2FkKCkKK3sKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICBQbGF0Zm9ybTo6bG9nKFBsYXRm
b3JtOjpMb2dMZXZlbEluZm8sICJXZWJQYWdlUHJpdmF0ZTo6em9vbVRvSW5pdGlhbFNjYWxlT25M
b2FkIik7CisjZW5kaWYKKworICAgIGJvb2wgbmVlZHNMYXlvdXQgPSBmYWxzZTsKKworICAgIC8v
IElmIHRoZSBjb250ZW50cyB3aWR0aCBleGNlZWRzIHRoZSB2aWV3cG9ydCB3aWR0aCBzZXQgdG8g
ZGVza3RvcCBtb2RlLgorICAgIGlmIChtX3Nob3VsZFVzZUZpeGVkRGVza3RvcE1vZGUpCisgICAg
ICAgIG5lZWRzTGF5b3V0ID0gc2V0Vmlld01vZGUoRml4ZWREZXNrdG9wKTsKKyAgICBlbHNlCisg
ICAgICAgIG5lZWRzTGF5b3V0ID0gc2V0Vmlld01vZGUoRGVza3RvcCk7CisKKyAgICBpZiAobmVl
ZHNMYXlvdXQpIHsKKyAgICAgICAgLy8gVGhpcyBjYW4gY2F1c2UgcmVjdXJzaXZlIGxheW91dC4u
LgorICAgICAgICBzZXROZWVkc0xheW91dCgpOworICAgIH0KKworICAgIGlmIChjb250ZW50c1Np
emUoKS5pc0VtcHR5KCkpIHsKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICAgICAgUGxhdGZv
cm06OmxvZyhQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiV2ViUGFnZVByaXZhdGU6Onpvb21Ub0lu
aXRpYWxTY2FsZU9uTG9hZCBjb250ZW50IGlzIGVtcHR5ISIpOworI2VuZGlmCisgICAgICAgIHJl
cXVlc3RMYXlvdXRJZk5lZWRlZCgpOworICAgICAgICBtX2NsaWVudC0+cmVzZXRCaXRtYXBab29t
U2NhbGUoY3VycmVudFNjYWxlKCkpOworICAgICAgICBub3RpZnlUcmFuc2Zvcm1lZENvbnRlbnRz
U2l6ZUNoYW5nZWQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgcGVyZm9y
bWVkWm9vbSA9IGZhbHNlOworICAgIGJvb2wgc2hvdWxkWm9vbSA9ICFtX3VzZXJQZXJmb3JtZWRN
YW51YWxab29tOworCisgICAgLy8gSWYgdGhpcyBsb2FkIHNob3VsZCByZXN0b3JlIHZpZXcgc3Rh
dGUsIGRvbid0IHpvb20gdG8gaW5pdGlhbCBzY2FsZQorICAgIC8vIGJ1dCBpbnN0ZWFkIGxldCB0
aGUgSGlzdG9yeUl0ZW0ncyBzYXZlZCB2aWV3cG9ydCByZWlnbiBzdXByZW1lLgorICAgIGlmICht
X21haW5GcmFtZSAmJiBtX21haW5GcmFtZS0+bG9hZGVyKCkgJiYgbV9tYWluRnJhbWUtPmxvYWRl
cigpLT5zaG91bGRSZXN0b3JlU2Nyb2xsUG9zaXRpb25BbmRWaWV3U3RhdGUoKSkKKyAgICAgICAg
c2hvdWxkWm9vbSA9IGZhbHNlOworCisgICAgaWYgKHNob3VsZFpvb20gJiYgbG9hZFN0YXRlKCkg
PT0gQ29tbWl0dGVkKSB7CisgICAgICAgIC8vIFByZXNlcnZlIGF0IHRvcCBhbmQgYXQgbGVmdCBw
b3NpdGlvbiwgdG8gYXZvaWQgc2Nyb2xsaW5nCisgICAgICAgIC8vIHRvIGEgbm9uIHRvcC1sZWZ0
IHBvc2l0aW9uIGZvciB3ZWIgcGFnZSB3aXRoIHZpZXdwb3J0IG1ldGEgdGFnCisgICAgICAgIC8v
IHRoYXQgc3BlY2lmaWVzIGFuIGluaXRpYWwtc2NhbGUgdGhhdCBpcyB6b29tZWQgaW4uCisgICAg
ICAgIEZsb2F0UG9pbnQgYW5jaG9yID0gY2VudGVyT2ZWaXNpYmxlQ29udGVudHNSZWN0KCk7Cisg
ICAgICAgIGlmICghc2Nyb2xsUG9zaXRpb24oKS54KCkpCisgICAgICAgICAgICBhbmNob3Iuc2V0
WCgwKTsKKyAgICAgICAgaWYgKCFzY3JvbGxQb3NpdGlvbigpLnkoKSkKKyAgICAgICAgICAgIGFu
Y2hvci5zZXRZKDApOworICAgICAgICBwZXJmb3JtZWRab29tID0gem9vbUFib3V0UG9pbnQoaW5p
dGlhbFNjYWxlKCksIGFuY2hvcik7CisgICAgfQorCisgICAgLy8gem9vbUFib3V0UG9pbnQgYWJv
dmUgY2FuIGFsc28gdG9nZ2xlIHNldE5lZWRzTGF5b3V0IGFuZCBjYXVzZSByZWN1cnNpdmUgbGF5
b3V0Li4uCisgICAgcmVxdWVzdExheW91dElmTmVlZGVkKCk7CisKKyAgICBpZiAoIXBlcmZvcm1l
ZFpvb20pIHsKKyAgICAgICAgLy8gV2Ugb25seSBub3RpZnkgaWYgd2UgZGlkbid0IHBlcmZvcm0g
em9vbSwgYmVjYXVzZSB6b29tIHdpbGwgbm90aWZ5IG9uCisgICAgICAgIC8vIGl0cyBvd24uLi4K
KyAgICAgICAgbV9jbGllbnQtPnJlc2V0Qml0bWFwWm9vbVNjYWxlKGN1cnJlbnRTY2FsZSgpKTsK
KyAgICAgICAgbm90aWZ5VHJhbnNmb3JtZWRDb250ZW50c1NpemVDaGFuZ2VkKCk7CisgICAgfQor
fQorCitkb3VibGUgV2ViUGFnZVByaXZhdGU6OmN1cnJlbnRTY2FsZSgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIG1fdHJhbnNmb3JtYXRpb25NYXRyaXgtPm0xMSgpOworfQorCitkb3VibGUgV2ViUGFn
ZVByaXZhdGU6Onpvb21Ub0ZpdFNjYWxlKCkgY29uc3QKK3sKKyAgICAvLyBXZSBtdXN0IGNsYW1w
IHRoZSBjb250ZW50cyBmb3IgdGhpcyBjYWxjdWxhdGlvbiBzbyB0aGF0IHdlIGRvIG5vdCBhbGxv
dyBhbgorICAgIC8vIGFyYml0cmFyaWx5IHNtYWxsIHpvb21Ub0ZpdFNjYWxlIG11Y2ggbGlrZSB3
ZSBjbGFtcCB0aGUgZml4ZWRMYXlvdXRTaXplKCkKKyAgICAvLyBzbyB0aGF0IHdlIGRvIG5vdCBo
YXZlIGFyYml0cmFyaWx5IGxhcmdlIGxheW91dCBzaXplLgorICAgIC8vIElmIHdlIGhhdmUgYSBz
cGVjaWZpZWQgdmlld3BvcnQsIHdlIG1heSBuZWVkIHRvIGJlIGFibGUgdG8gem9vbSBvdXQgbW9y
ZS4KKyAgICBpbnQgY29udGVudFdpZHRoID0gc3RkOjptaW4oY29udGVudHNTaXplKCkud2lkdGgo
KSwgc3RkOjptYXgobV92aXJ0dWFsVmlld3BvcnRXaWR0aCwgc3RhdGljX2Nhc3Q8aW50PihkZWZh
dWx0TWF4TGF5b3V0U2l6ZSgpLndpZHRoKCkpKSk7CisKKyAgICAvLyBkZWZhdWx0TWF4TGF5b3V0
U2l6ZSgpLndpZHRoKCkgaXMgYSBzYWZlZ3VhcmQgZm9yIGV4Y2Vzc2l2ZWx5IGxhcmdlIHBhZ2Ug
bGF5b3V0cyB0aGF0CisgICAgLy8gaXMgdG9vIHJlc3RyaWN0aXZlIGZvciBpbWFnZSBkb2N1bWVu
dHMuIEluIHRoaXMgY2FzZSwgdGhlIGRvY3VtZW50IHdpZHRoIGlzIHN1ZmZpY2llbnQuCisgICAg
RG9jdW1lbnQqIGRvYyA9IG1fcGFnZS0+bWFpbkZyYW1lKCktPmRvY3VtZW50KCk7CisgICAgaWYg
KGRvYyAmJiBkb2MtPmlzSW1hZ2VEb2N1bWVudCgpKQorICAgICAgIGNvbnRlbnRXaWR0aCA9IGNv
bnRlbnRzU2l6ZSgpLndpZHRoKCk7CisKKyAgICAvLyBJZiB3ZSBoYXZlIGEgdmlydHVhbCB2aWV3
cG9ydCBhbmQgaXRzIGFzcGVjdCByYXRpbyBjYXVzZWQgY29udGVudCB0byBsYXlvdXQKKyAgICAv
LyB3aWRlciB0aGFuIHRoZSBkZWZhdWx0IGxheW91dCBhc3BlY3QgcmF0aW8gd2UgbmVlZCB0byB6
b29tIHRvIGZpdCB0aGUgY29udGVudCBoZWlnaHQKKyAgICAvLyBpbiBvcmRlciB0byBhdm9pZCBz
aG93aW5nIGEgZ3JleSBhcmVhIGJlbG93IHRoZSB3ZWIgcGFnZS4KKyAgICAvLyBXaXRob3V0IHZp
cnR1YWwgdmlld3BvcnQgd2UgY2FuIG5ldmVyIGdldCBpbnRvIHRoaXMgc2l0dWF0aW9uLgorICAg
IGlmIChoYXNWaXJ0dWFsVmlld3BvcnQoKSkgeworICAgICAgICBpbnQgY29udGVudEhlaWdodCA9
IHN0ZDo6bWluKGNvbnRlbnRzU2l6ZSgpLmhlaWdodCgpLCBzdGQ6Om1heChtX3ZpcnR1YWxWaWV3
cG9ydEhlaWdodCwgc3RhdGljX2Nhc3Q8aW50PihkZWZhdWx0TWF4TGF5b3V0U2l6ZSgpLmhlaWdo
dCgpKSkpOworCisgICAgICAgIC8vIEFzcGVjdCByYXRpbyBjaGVjayB3aXRob3V0IGRpdmlzaW9u
LgorICAgICAgICBpZiAoY29udGVudFdpZHRoICogbV9kZWZhdWx0TGF5b3V0U2l6ZS5oZWlnaHQo
KSA+IGNvbnRlbnRIZWlnaHQgKiBtX2RlZmF1bHRMYXlvdXRTaXplLndpZHRoKCkpCisgICAgICAg
ICAgICByZXR1cm4gY29udGVudEhlaWdodCA+IDAgPyBzdGF0aWNfY2FzdDxkb3VibGU+KG1fZGVm
YXVsdExheW91dFNpemUuaGVpZ2h0KCkpIC8gY29udGVudEhlaWdodCA6IDEuMDsKKyAgICB9CisK
KyAgICByZXR1cm4gY29udGVudFdpZHRoID4gMC4wID8gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX2Fj
dHVhbFZpc2libGVXaWR0aCkgLyBjb250ZW50V2lkdGggOiAxLjA7Cit9CisKK2RvdWJsZSBXZWJQ
YWdlUHJpdmF0ZTo6aW5pdGlhbFNjYWxlKCkgY29uc3QKK3sKKyAgICBpZiAobV9pbml0aWFsU2Nh
bGUgPiAwLjApCisgICAgICAgIHJldHVybiBtX2luaXRpYWxTY2FsZTsKKworICAgIGlmIChtX3dl
YlNldHRpbmdzLT5pc1pvb21Ub0ZpdE9uTG9hZCgpKQorICAgICAgICByZXR1cm4gem9vbVRvRml0
U2NhbGUoKTsKKworICAgIHJldHVybiAxLjA7Cit9CisKK3ZvaWQgV2ViUGFnZTo6aW5pdGlhbGl6
ZUljb25EYXRhQmFzZSgpCit7CisgICAgSWNvbkRhdGFiYXNlQ2xpZW50QmxhY2tCZXJyeTo6Z2V0
SW5zdGFuY2UoKS0+aW5pdEljb25EYXRhYmFzZShkLT5tX3dlYlNldHRpbmdzKTsKK30KKworYm9v
bCBXZWJQYWdlOjppc1VzZXJTY2FsYWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmlzVXNl
clNjYWxhYmxlKCk7Cit9CisKK2RvdWJsZSBXZWJQYWdlOjpjdXJyZW50U2NhbGUoKSBjb25zdAor
eworICAgIHJldHVybiBkLT5jdXJyZW50U2NhbGUoKTsKK30KKworZG91YmxlIFdlYlBhZ2U6Omlu
aXRpYWxTY2FsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmluaXRpYWxTY2FsZSgpOworfQor
Citkb3VibGUgV2ViUGFnZTo6em9vbVRvRml0U2NhbGUoKSBjb25zdAoreworICAgIHJldHVybiBk
LT56b29tVG9GaXRTY2FsZSgpOworfQorCit2b2lkIFdlYlBhZ2U6OnNldEluaXRpYWxTY2FsZShk
b3VibGUgaW5pdGlhbFNjYWxlKQoreworICAgIGQtPnNldEluaXRpYWxTY2FsZShpbml0aWFsU2Nh
bGUpOworfQorCitkb3VibGUgV2ViUGFnZTo6bWluaW11bVNjYWxlKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gZC0+bWluaW11bVNjYWxlKCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0TWluaW11bVNj
YWxlKGRvdWJsZSBtaW5pbXVtU2NhbGUpCit7CisgICAgZC0+c2V0TWluaW11bVNjYWxlKG1pbmlt
dW1TY2FsZSk7Cit9CisKK2RvdWJsZSBXZWJQYWdlOjptYXhpbXVtU2NhbGUoKSBjb25zdAorewor
ICAgIHJldHVybiBkLT5tYXhpbXVtU2NhbGUoKTsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRNYXhp
bXVtU2NhbGUoZG91YmxlIG1heGltdW1TY2FsZSkKK3sKKyAgICBkLT5zZXRNYXhpbXVtU2NhbGUo
bWF4aW11bVNjYWxlKTsKK30KKworZG91YmxlIFdlYlBhZ2VQcml2YXRlOjptaW5pbXVtU2NhbGUo
KSBjb25zdAoreworICAgIHJldHVybiAobV9taW5pbXVtU2NhbGUgPiB6b29tVG9GaXRTY2FsZSgp
ICYmIG1fbWluaW11bVNjYWxlIDw9IG1heGltdW1TY2FsZSgpKSA/IG1fbWluaW11bVNjYWxlIDog
em9vbVRvRml0U2NhbGUoKTsKK30KKworZG91YmxlIFdlYlBhZ2VQcml2YXRlOjptYXhpbXVtU2Nh
bGUoKSBjb25zdAoreworICAgIGlmIChtX21heGltdW1TY2FsZSA+PSB6b29tVG9GaXRTY2FsZSgp
ICYmIG1fbWF4aW11bVNjYWxlID49IG1fbWluaW11bVNjYWxlKQorICAgICAgICByZXR1cm4gbV9t
YXhpbXVtU2NhbGU7CisKKyAgICByZXR1cm4gaGFzVmlydHVhbFZpZXdwb3J0KCkgPyBzdGQ6Om1h
eDxkb3VibGU+KHpvb21Ub0ZpdFNjYWxlKCksIDQuMCkgOiA0LjA7Cit9CisKK3ZvaWQgV2ViUGFn
ZVByaXZhdGU6OnJlc2V0U2NhbGVzKCkKK3sKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBpZGVu
dGl0eTsKKyAgICAqbV90cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IGlkZW50aXR5OworICAgIG1faW5p
dGlhbFNjYWxlID0gbV93ZWJTZXR0aW5ncy0+aW5pdGlhbFNjYWxlKCkgPiAwID8gbV93ZWJTZXR0
aW5ncy0+aW5pdGlhbFNjYWxlKCkgOiAtMS4wOworICAgIG1fbWluaW11bVNjYWxlID0gLTEuMDsK
KyAgICBtX21heGltdW1TY2FsZSA9IC0xLjA7CisKKyAgICAvLyBXZSBoYXZlIHRvIGxldCBXZWJD
b3JlIGtub3cgYWJvdXQgdXBkYXRlZCBmcmFtZXJlY3Qgbm93IHRoYXQgd2UndmUKKyAgICAvLyBy
ZXNldCBvdXIgc2NhbGVzLiBTZWU6IFJJTSBCdWcgIzQwMS4KKyAgICB1cGRhdGVWaWV3cG9ydFNp
emUoKTsKK30KKworSW50UG9pbnQgV2ViUGFnZVByaXZhdGU6OnRyYW5zZm9ybWVkU2Nyb2xsUG9z
aXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNsaWVudC0+dHJhbnNm
b3JtZWRTY3JvbGxQb3NpdGlvbigpOworfQorCitJbnRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6dHJh
bnNmb3JtZWRNYXhpbXVtU2Nyb2xsUG9zaXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBtX2Jh
Y2tpbmdTdG9yZUNsaWVudC0+dHJhbnNmb3JtZWRNYXhpbXVtU2Nyb2xsUG9zaXRpb24oKTsKK30K
KworSW50U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6dHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIEludFNpemUobV9hY3R1YWxWaXNpYmxlV2lkdGgsIG1fYWN0
dWFsVmlzaWJsZUhlaWdodCk7Cit9CisKK0ludFNpemUgV2ViUGFnZVByaXZhdGU6OnRyYW5zZm9y
bWVkVmlld3BvcnRTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gUGxhdGZvcm06OkdyYXBoaWNz
OjpTY3JlZW46OnNpemUoKTsKK30KKworSW50UmVjdCBXZWJQYWdlUHJpdmF0ZTo6dHJhbnNmb3Jt
ZWRWaXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3QKK3sKKyAgICAvLyBVc3VhbGx5IHRoaXMgd291
bGQgYmUgbWFwVG9UcmFuc2Zvcm1lZCh2aXNpYmxlQ29udGVudHNSZWN0KCkpLCBidXQKKyAgICAv
LyB0aGF0IHJlc3VsdHMgaW4gcm91bmRpbmcgZXJyb3JzIGJlY2F1c2Ugd2UgYWxyZWFkeSBzZXQg
dGhlIFdlYkNvcmUKKyAgICAvLyB2aWV3cG9ydCBzaXplIGZyb20gb3VyIG9yaWdpbmFsIHRyYW5z
Zm9ybWVkVmlld3BvcnRTaXplKCkuCisgICAgLy8gSW5zdGVhZCwgd2Ugb25seSB0cmFuc2Zvcm0g
dGhlIHNjcm9sbCBwb3NpdGlvbiBhbmQgdGFrZSB0aGUKKyAgICAvLyB2aWV3cG9ydCBzaXplIGFz
IGl0IGlzLCB3aGljaCBlbnN1cmVzIHRoYXQgZS5nLiBibGl0dGluZyBvcGVyYXRpb25zCisgICAg
Ly8gYWx3YXlzIGNvdmVyIHRoZSB3aG9sZSB3aWRnZXQvc2NyZWVuLgorICAgIHJldHVybiBJbnRS
ZWN0KHRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24oKSwgdHJhbnNmb3JtZWRWaWV3cG9ydFNpemUo
KSk7Cit9CisKK0ludFNpemUgV2ViUGFnZVByaXZhdGU6OnRyYW5zZm9ybWVkQ29udGVudHNTaXpl
KCkgY29uc3QKK3sKKyAgICAvLyBtYXBUb1RyYW5zZm9ybWVkKCkgZnVuY3Rpb25zIHVzZSB0aGlz
IG1ldGhvZCB0byBjcm9wIHRoZWlyIHJlc3VsdHMsCisgICAgLy8gc28gd2UgY2FuJ3QgbWFrZSB1
c2Ugb2YgdGhlbSBoZXJlLiBXaGlsZSB3ZSB3YW50IHJvdW5kaW5nIGluc2lkZSBwYWdlCisgICAg
Ly8gYm91bmRhcmllcyB0byBleHRlbmQgcmVjdGFuZ2xlcyBhbmQgcm91bmQgcG9pbnRzLCB3ZSBu
ZWVkIHRvIGNyb3AgdGhlCisgICAgLy8gY29udGVudHMgc2l6ZSB0byB0aGUgZmxvb3JlZCB2YWx1
ZXMgc28gdGhhdCB3ZSBkb24ndCB0cnkgdG8gZGlzcGxheQorICAgIC8vIG9yIHJlcG9ydCBwb2lu
dHMgdGhhdCBhcmUgbm90IGZ1bGx5IGNvdmVyZWQgYnkgdGhlIGFjdHVhbCBmbG9hdC1wb2ludAor
ICAgIC8vIGNvbnRlbnRzIHJlY3RhbmdsZS4KKyAgICBjb25zdCBJbnRTaXplIHVudHJhbnNmb3Jt
ZWRDb250ZW50c1NpemUgPSBjb250ZW50c1NpemUoKTsKKyAgICBjb25zdCBGbG9hdFBvaW50IHRy
YW5zZm9ybWVkQm90dG9tUmlnaHQgPSBtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tYXBQb2ludCgK
KyAgICAgICAgRmxvYXRQb2ludCh1bnRyYW5zZm9ybWVkQ29udGVudHNTaXplLndpZHRoKCksIHVu
dHJhbnNmb3JtZWRDb250ZW50c1NpemUuaGVpZ2h0KCkpKTsKKyAgICByZXR1cm4gSW50U2l6ZShm
bG9vcmYodHJhbnNmb3JtZWRCb3R0b21SaWdodC54KCkpLCBmbG9vcmYodHJhbnNmb3JtZWRCb3R0
b21SaWdodC55KCkpKTsKK30KKworSW50UG9pbnQgV2ViUGFnZVByaXZhdGU6Om1hcEZyb21Db250
ZW50c1RvVmlld3BvcnQoY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIHJldHVy
biBtX2JhY2tpbmdTdG9yZUNsaWVudC0+bWFwRnJvbUNvbnRlbnRzVG9WaWV3cG9ydChwb2ludCk7
Cit9CisKK0ludFBvaW50IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRz
KGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9iYWNraW5nU3Rv
cmVDbGllbnQtPm1hcEZyb21WaWV3cG9ydFRvQ29udGVudHMocG9pbnQpOworfQorCitJbnRSZWN0
IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tQ29udGVudHNUb1ZpZXdwb3J0KGNvbnN0IEludFJlY3Qm
IHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fYmFja2luZ1N0b3JlQ2xpZW50LT5tYXBGcm9t
Q29udGVudHNUb1ZpZXdwb3J0KHJlY3QpOworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2YXRlOjpt
YXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fYmFja2luZ1N0b3JlQ2xpZW50LT5tYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRz
KHJlY3QpOworfQorCitJbnRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVk
Q29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQoY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25z
dAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNsaWVudC0+bWFwRnJvbVRyYW5zZm9ybWVk
Q29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQocG9pbnQpOworfQorCitJbnRQb2ludCBXZWJQ
YWdlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkVmlld3BvcnRUb1RyYW5zZm9ybWVkQ29udGVu
dHMoY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdT
dG9yZUNsaWVudC0+bWFwRnJvbVRyYW5zZm9ybWVkVmlld3BvcnRUb1RyYW5zZm9ybWVkQ29udGVu
dHMocG9pbnQpOworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVHJhbnNmb3Jt
ZWRDb250ZW50c1RvVHJhbnNmb3JtZWRWaWV3cG9ydChjb25zdCBJbnRSZWN0JiByZWN0KSBjb25z
dAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNsaWVudC0+bWFwRnJvbVRyYW5zZm9ybWVk
Q29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQocmVjdCk7Cit9CisKK0ludFJlY3QgV2ViUGFn
ZVByaXZhdGU6Om1hcEZyb21UcmFuc2Zvcm1lZFZpZXdwb3J0VG9UcmFuc2Zvcm1lZENvbnRlbnRz
KGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fYmFja2luZ1N0b3Jl
Q2xpZW50LT5tYXBGcm9tVHJhbnNmb3JtZWRWaWV3cG9ydFRvVHJhbnNmb3JtZWRDb250ZW50cyhy
ZWN0KTsKK30KKworLy8gTk9URTogUElYRUwgUk9VTkRJTkchCisvLyBBY2N1cmF0ZSBiYWNrLWFu
ZC1mb3J0aCByb3VuZGluZyBpcyBub3QgcG9zc2libGUgd2l0aCBpbmZvcm1hdGlvbiBsb3NzCisv
LyBieSBpbnRlZ2VyIHBvaW50cyBhbmQgc2l6ZXMsIHNvIHdlIGFsd2F5cyBleHBhbmQgdGhlIHJl
c3VsdGluZyBtYXBwZWQKKy8vIGZsb2F0IHJlY3RhbmdsZXMgdG8gdGhlIG5lYXJlc3QgaW50ZWdl
ci4gRm9yIHBvaW50cywgd2UgYWx3YXlzIHVzZQorLy8gZmxvb3Itcm91bmRpbmcgaW4gbWFwVG9U
cmFuc2Zvcm1lZCgpIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjcm9wIHRvCisvLyB0aGUgKGZs
b29yJ2QpIHRyYW5zZm9ybWVkIGNvbnRlbnRzIHNpemUuCitzdGF0aWMgaW5saW5lIEludFBvaW50
IHJvdW5kVHJhbnNmb3JtZWRQb2ludChjb25zdCBGbG9hdFBvaW50ICZwb2ludCkKK3sKKyAgICAv
LyBNYXBzIGJ5IHJvdW5kaW5nIGhhbGYgdG93YXJkcyB6ZXJvLgorICAgIHJldHVybiBJbnRQb2lu
dChzdGF0aWNfY2FzdDxpbnQ+KGZsb29yZihwb2ludC54KCkpKSwgc3RhdGljX2Nhc3Q8aW50Pihm
bG9vcmYocG9pbnQueSgpKSkpOworfQorCitzdGF0aWMgaW5saW5lIEludFBvaW50IHJvdW5kVW50
cmFuc2Zvcm1lZFBvaW50KGNvbnN0IEZsb2F0UG9pbnQgJnBvaW50KQoreworICAgIC8vIE1hcHMg
Ynkgcm91bmRpbmcgaGFsZiBhd2F5IGZyb20gemVyby4KKyAgICByZXR1cm4gSW50UG9pbnQoc3Rh
dGljX2Nhc3Q8aW50PihjZWlsZihwb2ludC54KCkpKSwgc3RhdGljX2Nhc3Q8aW50PihjZWlsZihw
b2ludC55KCkpKSk7Cit9CisKK0ludFBvaW50IFdlYlBhZ2VQcml2YXRlOjptYXBUb1RyYW5zZm9y
bWVkKGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICByZXR1cm4gcm91bmRUcmFu
c2Zvcm1lZFBvaW50KG1fdHJhbnNmb3JtYXRpb25NYXRyaXgtPm1hcFBvaW50KEZsb2F0UG9pbnQo
cG9pbnQpKSk7Cit9CisKK0Zsb2F0UG9pbnQgV2ViUGFnZVByaXZhdGU6Om1hcFRvVHJhbnNmb3Jt
ZWRGbG9hdFBvaW50KGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIHJldHVy
biBtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tYXBQb2ludChwb2ludCk7Cit9CisKK0ludFBvaW50
IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVHJhbnNmb3JtZWQoY29uc3QgSW50UG9pbnQmIHBvaW50
KSBjb25zdAoreworICAgIHJldHVybiByb3VuZFVudHJhbnNmb3JtZWRQb2ludChtX3RyYW5zZm9y
bWF0aW9uTWF0cml4LT5pbnZlcnNlKCkubWFwUG9pbnQoRmxvYXRQb2ludChwb2ludCkpKTsKK30K
KworRmxvYXRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkRmxvYXRQb2lu
dChjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90cmFuc2Zv
cm1hdGlvbk1hdHJpeC0+aW52ZXJzZSgpLm1hcFBvaW50KHBvaW50KTsKK30KKworRmxvYXRSZWN0
IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVHJhbnNmb3JtZWRGbG9hdFJlY3QoY29uc3QgRmxvYXRS
ZWN0JiByZWN0KSBjb25zdAoreworICAgIHJldHVybiBtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5p
bnZlcnNlKCkubWFwUmVjdChyZWN0KTsKK30KKworSW50U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6bWFw
VG9UcmFuc2Zvcm1lZChjb25zdCBJbnRTaXplJiBzaXplKSBjb25zdAoreworICAgIHJldHVybiBt
YXBUb1RyYW5zZm9ybWVkKEludFJlY3QoSW50UG9pbnQ6Onplcm8oKSwgc2l6ZSkpLnNpemUoKTsK
K30KKworSW50U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkKGNvbnN0IElu
dFNpemUmIHNpemUpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1hcEZyb21UcmFuc2Zvcm1lZChJbnRS
ZWN0KEludFBvaW50Ojp6ZXJvKCksIHNpemUpKS5zaXplKCk7Cit9CisKK0ludFJlY3QgV2ViUGFn
ZVByaXZhdGU6Om1hcFRvVHJhbnNmb3JtZWQoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sK
KyAgICByZXR1cm4gZW5jbG9zaW5nSW50UmVjdChtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tYXBS
ZWN0KEZsb2F0UmVjdChyZWN0KSkpOworfQorCisvLyBVc2UgdGhpcyBpbiBjb25qdW5jdGlvbiB3
aXRoIG1hcFRvVHJhbnNmb3JtZWQoSW50UmVjdCksIGluIG1vc3QgY2FzZXMuCit2b2lkIFdlYlBh
Z2VQcml2YXRlOjpjbGlwVG9UcmFuc2Zvcm1lZENvbnRlbnRzUmVjdChJbnRSZWN0JiByZWN0KSBj
b25zdAoreworICAgIHJlY3QuaW50ZXJzZWN0KEludFJlY3QoSW50UG9pbnQ6Onplcm8oKSwgdHJh
bnNmb3JtZWRDb250ZW50c1NpemUoKSkpOworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2YXRlOjpt
YXBGcm9tVHJhbnNmb3JtZWQoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1
cm4gZW5jbG9zaW5nSW50UmVjdChtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5pbnZlcnNlKCkubWFw
UmVjdChGbG9hdFJlY3QocmVjdCkpKTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6dHJhbnNm
b3JtZWRQb2ludEVxdWFsc1VudHJhbnNmb3JtZWRQb2ludChjb25zdCBJbnRQb2ludCYgdHJhbnNm
b3JtZWRQb2ludCwgY29uc3QgSW50UG9pbnQmIHVudHJhbnNmb3JtZWRQb2ludCkKK3sKKyAgICAv
LyBTY2FsaW5nIGRvd24gaXMgYWx3YXlzIG1vcmUgYWNjdXJhdGUgdGhhbiBzY2FsaW5nIHVwLgor
ICAgIGlmIChtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5hKCkgPiAxLjApCisgICAgICAgIHJldHVy
biB0cmFuc2Zvcm1lZFBvaW50ID09IG1hcFRvVHJhbnNmb3JtZWQodW50cmFuc2Zvcm1lZFBvaW50
KTsKKworICAgIHJldHVybiBtYXBGcm9tVHJhbnNmb3JtZWQodHJhbnNmb3JtZWRQb2ludCkgPT0g
dW50cmFuc2Zvcm1lZFBvaW50OworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpub3RpZnlUcmFu
c2Zvcm1DaGFuZ2VkKCkKK3sKKyAgICBub3RpZnlUcmFuc2Zvcm1lZENvbnRlbnRzU2l6ZUNoYW5n
ZWQoKTsKKyAgICBub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQoKTsKKworICAgIG1fYmFj
a2luZ1N0b3JlLT5kLT50cmFuc2Zvcm1DaGFuZ2VkKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZh
dGU6Om5vdGlmeVRyYW5zZm9ybWVkQ29udGVudHNTaXplQ2hhbmdlZCgpCit7CisgICAgLy8gV2Ug
bWFyayBoZXJlIGFzIHRoZSBsYXN0IHJlcG9ydGVkIGNvbnRlbnQgc2l6ZSB3ZSBzZW50IHRvIHRo
ZSBjbGllbnQuCisgICAgbV9wcmV2aW91c0NvbnRlbnRzU2l6ZSA9IGNvbnRlbnRzU2l6ZSgpOwor
CisgICAgY29uc3QgSW50U2l6ZSBzaXplID0gdHJhbnNmb3JtZWRDb250ZW50c1NpemUoKTsKKyAg
ICBtX2JhY2tpbmdTdG9yZS0+ZC0+Y29udGVudHNTaXplQ2hhbmdlZChzaXplKTsKKyAgICBtX2Ns
aWVudC0+Y29udGVudHNTaXplQ2hhbmdlZChzaXplKTsKKyAgICBtX3NlbGVjdGlvbkhhbmRsZXIt
PnNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCgpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpu
b3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQoKQoreworICAgIGNvbnN0IEludFBvaW50IHBv
cyA9IHRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24oKTsKKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+
c2Nyb2xsQ2hhbmdlZChwb3MpOworICAgIG1fY2xpZW50LT5zY3JvbGxDaGFuZ2VkKHBvcyk7Cit9
CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OnNldFZpZXdNb2RlKFZpZXdNb2RlIG1vZGUpCit7Cisg
ICAgaWYgKCFtX21haW5GcmFtZS0+dmlldygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBtX3ZpZXdNb2RlID0gbW9kZTsKKworICAgIC8vIElmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2Yg
YSBuZXN0ZWQgbGF5b3V0IHdpdGggYSByZWN1cnNpb24gY291bnQgYWJvdmUKKyAgICAvLyBzb21l
IG1heGltdW0gdGhyZXNob2xkLCB0aGVuIG91ciBhbGdvcml0aG0gZm9yIGZpbmRpbmcgdGhlIG1p
bmltdW0gY29udGVudAorICAgIC8vIHdpZHRoIG9mIGEgZ2l2ZW4gcGFnZSBoYXMgYmVjb21lIGRl
cGVuZGVudCBvbiB0aGUgdmlzaWJsZSB3aWR0aC4KKyAgICAvLworICAgIC8vIFdlIG5lZWQgdG8g
ZmluZCBzb21lIG1ldGhvZCB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBleHBlcmllbmNlIGV4Y2Vz
c2l2ZQorICAgIC8vIGFuZCBldmVuIGluZmluaXRlIHJlY3Vyc2lvbi4gVGhpcyBjYW4gZXZlbiBo
YXBwZW4gd2l0aCB2YWxpZCBodG1sLiBUaGUKKyAgICAvLyBmb3JtZXIgY2FuIGhhcHBlbiB3aGVu
IHdlIHJ1biBpbnRvIGlubGluZSB0ZXh0IHdpdGggZmV3IGNhbmRpZGF0ZXMgZm9yIGxpbmUKKyAg
ICAvLyBicmVhay4gVGhlIGxhdHRlciBjYW4gaGFwcGVuIGZvciBpbnN0YW5jZSBpZiB0aGUgcGFn
ZSBoYXMgYSBuZWdhdGl2ZSBtYXJnaW4KKyAgICAvLyBzZXQgYWdhaW5zdCB0aGUgcmlnaHQgYm9y
ZGVyLiBOb3RlOiB0aGlzIGlzIHZhbGlkIGJ5IHNwZWMgYW5kIGNhbiBsZWFkIHRvCisgICAgLy8g
YSBzaXR1YXRpb24gd2hlcmUgdGhlcmUgaXMgbm8gdmFsdWUgZm9yIHdoaWNoIHRoZSBjb250ZW50
IHdpZHRoIHdpbGwgZW5zdXJlCisgICAgLy8gbm8gaG9yaXpvbnRhbCBzY3JvbGxiYXIuCisgICAg
Ly8gRXhhbXBsZTogTGF5b3V0VGVzdHMvY3NzMS9ib3hfcHJvcGVydGllcy9tYXJnaW4uaHRtbAor
ICAgIC8vCisgICAgLy8gSW4gb3JkZXIgdG8gYWRkcmVzcyBzdWNoIHNpdHVhdGlvbnMgd2hlbiB3
ZSBkZXRlY3QgYSByZWN1cnNpb24gYWJvdmUgc29tZQorICAgIC8vIG1heGltdW0gdGhyZXNob2xk
IHdlIHNuYXAgb3VyIGZpeGVkIGxheW91dCBzaXplIHRvIGEgZGVmaW5lZCBxdWFudHVtIGluY3Jl
bWVudC4KKyAgICAvLyBFdmVudHVhbGx5LCBlaXRoZXIgdGhlIGNvbnRlbnQgd2lkdGggd2lsbCBi
ZSBzYXRpc2ZpZWQgdG8gZW5zdXJlIG5vIGhvcml6b250YWwKKyAgICAvLyBzY3JvbGxiYXIgb3Ig
dGhpcyBpbmNyZW1lbnQgd2lsbCBydW4gaW50byB0aGUgbWF4aW11bSBsYXlvdXQgc2l6ZSBhbmQg
dGhlCisgICAgLy8gcmVjdXJzaW9uIHdpbGwgbmVjZXNzYXJpbHkgZW5kLgorICAgIGJvb2wgc25h
cFRvSW5jcmVtZW50ID0gZGlkTGF5b3V0RXhjZWVkTWF4aW11bUl0ZXJhdGlvbnMoKTsKKworICAg
IEludFNpemUgY3VycmVudFNpemUgPSBtX21haW5GcmFtZS0+dmlldygpLT5maXhlZExheW91dFNp
emUoKTsKKyAgICBJbnRTaXplIG5ld1NpemUgPSBmaXhlZExheW91dFNpemUoc25hcFRvSW5jcmVt
ZW50KTsKKyAgICBpZiAoY3VycmVudFNpemUgPT0gbmV3U2l6ZSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgLy8gRklYTUU6IFRlbXAgc29sdXRpb24uIFdlJ2xsIGdldCBiYWNrIHRvIHRo
aXMuCisgICAgaWYgKG1fbmVzdGVkTGF5b3V0RmluaXNoZWRDb3VudCkgeworICAgICAgICBkb3Vi
bGUgd2lkdGhDaGFuZ2UgPSBmYWJzKGRvdWJsZShuZXdTaXplLndpZHRoKCkgLSBjdXJyZW50U2l6
ZS53aWR0aCgpKSAvIGN1cnJlbnRTaXplLndpZHRoKCkpOworICAgICAgICBkb3VibGUgaGVpZ2h0
Q2hhbmdlID0gZmFicyhkb3VibGUobmV3U2l6ZS5oZWlnaHQoKSAtIGN1cnJlbnRTaXplLmhlaWdo
dCgpKSAvIGN1cnJlbnRTaXplLmhlaWdodCgpKTsKKyAgICAgICAgaWYgKHdpZHRoQ2hhbmdlIDwg
MC4wNSAmJiBoZWlnaHRDaGFuZ2UgPCAwLjA1KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KKworICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPnNldFVzZUZpeGVkTGF5b3V0KHVzZUZp
eGVkTGF5b3V0KCkpOworICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPnNldEZpeGVkTGF5b3V0U2l6
ZShuZXdTaXplKTsKKyAgICByZXR1cm4gdHJ1ZTsgLy8gTmVlZHMgcmUtbGF5b3V0IQorfQorCit2
b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXRDdXJzb3IoUGxhdGZvcm1DdXJzb3JIYW5kbGUgaGFuZGxl
KQoreworICAgIGlmIChtX2N1cnJlbnRDdXJzb3IudHlwZSgpICE9IGhhbmRsZS50eXBlKCkpIHsK
KyAgICAgICAgbV9jdXJyZW50Q3Vyc29yID0gaGFuZGxlOworICAgICAgICBtX2NsaWVudC0+Y3Vy
c29yQ2hhbmdlZChoYW5kbGUudHlwZSgpLCBoYW5kbGUudXJsKCkuY19zdHIoKSwgaGFuZGxlLmhv
dHNwb3QoKS54KCksIGhhbmRsZS5ob3RzcG90KCkueSgpKTsKKyAgICB9Cit9CisKK1BsYXRmb3Jt
OjpOZXR3b3JrU3RyZWFtRmFjdG9yeSogV2ViUGFnZVByaXZhdGU6Om5ldHdvcmtTdHJlYW1GYWN0
b3J5KCkKK3sKKyAgICByZXR1cm4gbV9jbGllbnQtPm5ldHdvcmtTdHJlYW1GYWN0b3J5KCk7Cit9
CisKK1BsYXRmb3JtOjpHcmFwaGljczo6V2luZG93KiBXZWJQYWdlUHJpdmF0ZTo6cGxhdGZvcm1X
aW5kb3coKSBjb25zdAoreworICAgIHJldHVybiBtX2NsaWVudC0+d2luZG93KCk7Cit9CisKK3Zv
aWQgV2ViUGFnZVByaXZhdGU6OnNldFByZXZlbnRzU2NyZWVuRGltbWluZyhib29sIGtlZXBBd2Fr
ZSkKK3sKKyAgICBpZiAoa2VlcEF3YWtlKSB7CisgICAgICAgIGlmICghbV9wcmV2ZW50SWRsZURp
bW1pbmdDb3VudCkKKyAgICAgICAgICAgIG1fY2xpZW50LT5zZXRQcmV2ZW50c1NjcmVlbklkbGVE
aW1taW5nKHRydWUpOworICAgICAgICBtX3ByZXZlbnRJZGxlRGltbWluZ0NvdW50Kys7CisgICAg
fSBlbHNlIGlmIChtX3ByZXZlbnRJZGxlRGltbWluZ0NvdW50ID4gMCkgeworICAgICAgICBtX3By
ZXZlbnRJZGxlRGltbWluZ0NvdW50LS07CisgICAgICAgIGlmICghbV9wcmV2ZW50SWRsZURpbW1p
bmdDb3VudCkKKyAgICAgICAgICAgIG1fY2xpZW50LT5zZXRQcmV2ZW50c1NjcmVlbklkbGVEaW1t
aW5nKGZhbHNlKTsKKyAgICB9IGVsc2UKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8v
IFNldFByZXZlbnRzU2NyZWVuSWRsZURpbW1pbmcoZmFsc2UpIGNhbGxlZCB0b28gbWFueSB0aW1l
cy4KK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2hvd1ZpcnR1YWxLZXlib2FyZChib29sIHNo
b3dLZXlib2FyZCkKK3sKKyAgICBtX2NsaWVudC0+aW5wdXRTZXROYXZpZ2F0aW9uTW9kZShzaG93
S2V5Ym9hcmQpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjplbnN1cmVDb250ZW50VmlzaWJs
ZShib29sIGNlbnRlckluVmlldykKK3sKKyAgICBtX2lucHV0SGFuZGxlci0+ZW5zdXJlRm9jdXNF
bGVtZW50VmlzaWJsZShjZW50ZXJJblZpZXcpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjp6
b29tVG9Db250ZW50UmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIERvbid0IHNj
YWxlIGlmIHRoZSB1c2VyIGlzIG5vdCBzdXBwb3NlZCB0byBzY2FsZS4KKyAgICBpZiAoIWlzVXNl
clNjYWxhYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEZsb2F0UG9pbnQgYW5jaG9yID0g
RmxvYXRQb2ludChyZWN0LndpZHRoKCkgLyAyLjAgKyByZWN0LngoKSwgcmVjdC5oZWlnaHQoKSAv
IDIuMCArIHJlY3QueSgpKTsKKyAgICBJbnRTaXplIHZpZXdTaXplID0gdmlld3BvcnRTaXplKCk7
CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIHNjYWxlIHJlcXVpcmVkIHRvIHNjYWxlIHRoYXQgZGlt
ZW5zaW9uIHRvIGZpdC4KKyAgICBkb3VibGUgc2NhbGVIID0gKGRvdWJsZSl2aWV3U2l6ZS53aWR0
aCgpIC8gKGRvdWJsZSlyZWN0LndpZHRoKCk7CisgICAgZG91YmxlIHNjYWxlViA9IChkb3VibGUp
dmlld1NpemUuaGVpZ2h0KCkgLyAoZG91YmxlKXJlY3QuaGVpZ2h0KCk7CisKKyAgICAvLyBDaG9v
c2UgdGhlIHNtYWxsZXIgc2NhbGUgZmFjdG9yIHNvIHRoYXQgYWxsIG9mIHRoZSBjb250ZW50IGlz
IHZpc2libGUuCisgICAgem9vbUFib3V0UG9pbnQobWluKHNjYWxlSCwgc2NhbGVWKSwgYW5jaG9y
KTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6cmVnaXN0ZXJQbHVnaW4oUGx1Z2luVmlldyog
cGx1Z2luLCBib29sIHNob3VsZFJlZ2lzdGVyKQoreworICAgIGlmIChzaG91bGRSZWdpc3RlcikK
KyAgICAgICAgbV9wbHVnaW5WaWV3cy5hZGQocGx1Z2luKTsKKyAgICBlbHNlCisgICAgICAgIG1f
cGx1Z2luVmlld3MucmVtb3ZlKHBsdWdpbik7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6Om5v
dGlmeVBhZ2VPbkxvYWQoKQoreworICAgIEhhc2hTZXQ8UGx1Z2luVmlldyo+Ojpjb25zdF9pdGVy
YXRvciBpdCA9IG1fcGx1Z2luVmlld3MuYmVnaW4oKTsKKyAgICBIYXNoU2V0PFBsdWdpblZpZXcq
Pjo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IG1fcGx1Z2luVmlld3MuZW5kKCk7CisgICAgZm9yICg7
IGl0ICE9IGxhc3Q7ICsraXQpCisgICAgICAgICgqaXQpLT5oYW5kbGVPbkxvYWRFdmVudCgpOwor
fQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpzaG91bGRQbHVnaW5FbnRlckZ1bGxTY3JlZW4oUGx1
Z2luVmlldyogcGx1Z2luLCBjb25zdCBjaGFyKiB3aW5kb3dVbmlxdWVQcmVmaXgpCit7CisgICAg
cmV0dXJuIG1fY2xpZW50LT5zaG91bGRQbHVnaW5FbnRlckZ1bGxTY3JlZW4oKTsKK30KKwordm9p
ZCBXZWJQYWdlUHJpdmF0ZTo6ZGlkUGx1Z2luRW50ZXJGdWxsU2NyZWVuKFBsdWdpblZpZXcqIHBs
dWdpbiwgY29uc3QgY2hhciogd2luZG93VW5pcXVlUHJlZml4KQoreworICAgIG1fZnVsbFNjcmVl
blBsdWdpblZpZXcgPSBwbHVnaW47CisgICAgbV9jbGllbnQtPmRpZFBsdWdpbkVudGVyRnVsbFNj
cmVlbigpOworICAgIFBsYXRmb3JtOjpHcmFwaGljczo6V2luZG93OjpzZXRUcmFuc3BhcmVuY3lE
aXNjYXJkRmlsdGVyKHdpbmRvd1VuaXF1ZVByZWZpeCk7CisgICAgbV9jbGllbnQtPndpbmRvdygp
LT5zZXRTZW5zaXRpdml0eUZ1bGxzY3JlZW5PdmVycmlkZSh0cnVlKTsKK30KKwordm9pZCBXZWJQ
YWdlUHJpdmF0ZTo6ZGlkUGx1Z2luRXhpdEZ1bGxTY3JlZW4oUGx1Z2luVmlldyogcGx1Z2luLCBj
b25zdCBjaGFyKiB3aW5kb3dVbmlxdWVQcmVmaXgpCit7CisgICAgbV9mdWxsU2NyZWVuUGx1Z2lu
VmlldyA9IDA7CisgICAgbV9jbGllbnQtPmRpZFBsdWdpbkV4aXRGdWxsU2NyZWVuKCk7CisgICAg
UGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3c6OnNldFRyYW5zcGFyZW5jeURpc2NhcmRGaWx0ZXIo
MCk7CisgICAgbV9jbGllbnQtPndpbmRvdygpLT5zZXRTZW5zaXRpdml0eUZ1bGxzY3JlZW5PdmVy
cmlkZShmYWxzZSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6Om9uUGx1Z2luU3RhcnRCYWNr
Z3JvdW5kUGxheShQbHVnaW5WaWV3KiBwbHVnaW4sIGNvbnN0IGNoYXIqIHdpbmRvd1VuaXF1ZVBy
ZWZpeCkKK3sKKyAgICBtX2NsaWVudC0+b25QbHVnaW5TdGFydEJhY2tncm91bmRQbGF5KCk7Cit9
CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6Om9uUGx1Z2luU3RvcEJhY2tncm91bmRQbGF5KFBsdWdp
blZpZXcqIHBsdWdpbiwgY29uc3QgY2hhciogd2luZG93VW5pcXVlUHJlZml4KQoreworICAgIG1f
Y2xpZW50LT5vblBsdWdpblN0b3BCYWNrZ3JvdW5kUGxheSgpOworfQorCitib29sIFdlYlBhZ2VQ
cml2YXRlOjpsb2NrT3JpZW50YXRpb24oYm9vbCBsYW5kc2NhcGUpCit7CisgICAgcmV0dXJuIG1f
Y2xpZW50LT5sb2NrT3JpZW50YXRpb24obGFuZHNjYXBlKTsKK30KKwordm9pZCBXZWJQYWdlUHJp
dmF0ZTo6dW5sb2NrT3JpZW50YXRpb24oKQoreworICAgIHJldHVybiBtX2NsaWVudC0+dW5sb2Nr
T3JpZW50YXRpb24oKTsKK30KKworaW50IFdlYlBhZ2VQcml2YXRlOjpvcmllbnRhdGlvbigpIGNv
bnN0Cit7CisjaWYgRU5BQkxFKE9SSUVOVEFUSU9OX0VWRU5UUykKKyAgICByZXR1cm4gbV9tYWlu
RnJhbWUtPm9yaWVudGF0aW9uKCk7CisjZWxzZQorI2Vycm9yIE9SSUVOVEFUSU9OX0VWRU5UUyBt
dXN0IGJlIGRlZmluZWQuCisvLyBPciBhIGNvcHkgb2YgdGhlIG9yaWVudGF0aW9uIHZhbHVlIHdp
bGwgaGF2ZSB0byBiZSBzdG9yZWQgaW4gdGhlc2Ugb2JqZWN0cy4KKyNlbmRpZgorfQorCitkb3Vi
bGUgV2ViUGFnZVByaXZhdGU6OmN1cnJlbnRab29tRmFjdG9yKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gY3VycmVudFNjYWxlKCk7Cit9CisKK2ludCBXZWJQYWdlUHJpdmF0ZTo6c2hvd0FsZXJ0RGlh
bG9nKFdlYlBhZ2VDbGllbnQ6OkFsZXJ0VHlwZSBhdHlwZSkKK3sKKyAgICByZXR1cm4gbV9jbGll
bnQtPnNob3dBbGVydERpYWxvZyhhdHlwZSk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6Omlz
QWN0aXZlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9jbGllbnQtPmlzQWN0aXZlKCk7Cit9CisK
K2Jvb2wgV2ViUGFnZVByaXZhdGU6OnVzZUZpeGVkTGF5b3V0KCkgY29uc3QKK3sKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworQWN0aXZlTm9kZUNvbnRleHQgV2ViUGFnZVByaXZhdGU6OmFjdGl2ZU5v
ZGVDb250ZXh0KFRhcmdldERldGVjdGlvblN0cmF0ZWd5IHN0cmF0ZWd5KQoreworICAgIEFjdGl2
ZU5vZGVDb250ZXh0IGNvbnRleHQ7CisKKyAgICBSZWZQdHI8Tm9kZT4gbm9kZSA9IGNvbnRleHRO
b2RlKHN0cmF0ZWd5KTsKKyAgICBtX2N1cnJlbnRDb250ZXh0Tm9kZSA9IG5vZGU7CisgICAgaWYg
KCFtX2N1cnJlbnRDb250ZXh0Tm9kZSkKKyAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisKKyAgICBy
ZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKTsKKworICAgIGJvb2wgbm9kZUFsbG93U2VsZWN0aW9uT3Zl
cnJpZGUgPSBmYWxzZTsKKyAgICBpZiAoTm9kZSogbGlua05vZGUgPSBub2RlLT5lbmNsb3NpbmdM
aW5rRXZlbnRQYXJlbnRPclNlbGYoKSkgeworICAgICAgICBLVVJMIGhyZWY7CisgICAgICAgIGlm
IChsaW5rTm9kZS0+aXNMaW5rKCkgJiYgbGlua05vZGUtPmhhc0F0dHJpYnV0ZXMoKSkgeworICAg
ICAgICAgICAgaWYgKEF0dHJpYnV0ZSogYXR0cmlidXRlID0gbGlua05vZGUtPmF0dHJpYnV0ZXMo
KS0+Z2V0QXR0cmlidXRlSXRlbShIVE1MTmFtZXM6OmhyZWZBdHRyKSkKKyAgICAgICAgICAgICAg
ICBocmVmID0gbGlua05vZGUtPmRvY3VtZW50KCktPmNvbXBsZXRlVVJMKHN0cmlwTGVhZGluZ0Fu
ZFRyYWlsaW5nSFRNTFNwYWNlcyhhdHRyaWJ1dGUtPnZhbHVlKCkpKTsKKyAgICAgICAgfQorCisg
ICAgICAgIFN0cmluZyBwYXR0ZXJuID0gZmluZFBhdHRlcm5TdHJpbmdGb3JVcmwoaHJlZik7Cisg
ICAgICAgIGlmICghcGF0dGVybi5pc0VtcHR5KCkpCisgICAgICAgICAgICBjb250ZXh0LnNldFBh
dHRlcm4ocGF0dGVybik7CisKKyAgICAgICAgaWYgKCFocmVmLnN0cmluZygpLmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgY29udGV4dC5zZXRVcmwoaHJlZi5zdHJpbmcoKSk7CisKKyAgICAgICAg
ICAgIC8vIExpbmtzIGFyZSBub24tc2VsZWN0YWJsZSBieSBkZWZhdWx0LCBidXQgc2VsZWN0aW9u
IHNob3VsZCBiZSBhbGxvd2VkCisgICAgICAgICAgICAvLyBwcm92aWRpbmcgdGhlIHBhZ2UgaXMg
c2VsZWN0YWJsZSwgdXNlIHRoZSBwYXJlbnQgdG8gZGV0ZXJtaW5lIGl0LgorICAgICAgICAgICAg
aWYgKGxpbmtOb2RlLT5wYXJlbnROb2RlKCkgJiYgbGlua05vZGUtPnBhcmVudE5vZGUoKS0+Y2Fu
U3RhcnRTZWxlY3Rpb24oKSkKKyAgICAgICAgICAgICAgICBub2RlQWxsb3dTZWxlY3Rpb25PdmVy
cmlkZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW5vZGVBbGxvd1NlbGVj
dGlvbk92ZXJyaWRlICYmICFub2RlLT5jYW5TdGFydFNlbGVjdGlvbigpKQorICAgICAgICBjb250
ZXh0LnJlc2V0RmxhZyhBY3RpdmVOb2RlQ29udGV4dDo6SXNTZWxlY3RhYmxlKTsKKworICAgIGlm
IChub2RlLT5pc0hUTUxFbGVtZW50KCkpIHsKKyAgICAgICAgSFRNTEltYWdlRWxlbWVudCogaW1h
Z2VFbGVtZW50ID0gMDsKKyAgICAgICAgaWYgKG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpp
bWdUYWcpKQorICAgICAgICAgICAgaW1hZ2VFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTEltYWdl
RWxlbWVudCo+KG5vZGUuZ2V0KCkpOworICAgICAgICBlbHNlIGlmIChub2RlLT5oYXNUYWdOYW1l
KEhUTUxOYW1lczo6YXJlYVRhZykpCisgICAgICAgICAgICBpbWFnZUVsZW1lbnQgPSBzdGF0aWNf
Y2FzdDxIVE1MQXJlYUVsZW1lbnQqPihub2RlLmdldCgpKS0+aW1hZ2VFbGVtZW50KCk7CisgICAg
ICAgIGlmIChpbWFnZUVsZW1lbnQgJiYgaW1hZ2VFbGVtZW50LT5yZW5kZXJlcigpKSB7CisgICAg
ICAgICAgICAvLyBGSVhNRTogQXQgdGhlIG1lYW4gdGltZSwgd2Ugb25seSBzaG93ICJTYXZlIElt
YWdlIiB3aGVuIHRoZSBpbWFnZSBkYXRhIGlzIGF2YWlsYWJsZS4KKyAgICAgICAgICAgIGlmIChD
YWNoZWRSZXNvdXJjZSogY2FjaGVkUmVzb3VyY2UgPSBpbWFnZUVsZW1lbnQtPmNhY2hlZEltYWdl
KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGVkUmVzb3VyY2UtPmlzTG9hZGVkKCkgJiYg
Y2FjaGVkUmVzb3VyY2UtPmRhdGEoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdXJs
ID0gc3RyaXBMZWFkaW5nQW5kVHJhaWxpbmdIVE1MU3BhY2VzKGltYWdlRWxlbWVudC0+Z2V0QXR0
cmlidXRlKEhUTUxOYW1lczo6c3JjQXR0cikuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAg
ICBjb250ZXh0LnNldEltYWdlU3JjKG5vZGUtPmRvY3VtZW50KCktPmNvbXBsZXRlVVJMKHVybCku
c3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IFN0cmluZyBhbHQgPSBpbWFnZUVsZW1lbnQtPmFsdFRleHQoKTsKKyAgICAgICAgICAgIGlmICgh
YWx0LmlzTnVsbCgpKQorICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0SW1hZ2VBbHQoYWx0KTsK
KyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChub2RlLT5pc1RleHROb2RlKCkpIHsKKyAgICAg
ICAgVGV4dCogY3VyVGV4dCA9IHN0YXRpY19jYXN0PFRleHQqPihub2RlLmdldCgpKTsKKyAgICAg
ICAgaWYgKCFjdXJUZXh0LT53aG9sZVRleHQoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICBjb250
ZXh0LnNldFRleHQoY3VyVGV4dC0+d2hvbGVUZXh0KCkpOworICAgIH0KKworICAgIGlmIChub2Rl
LT5pc0VsZW1lbnROb2RlKCkpIHsKKyAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19j
YXN0PEVsZW1lbnQqPihub2RlLT5zaGFkb3dBbmNlc3Rvck5vZGUoKSk7CisgICAgICAgIGlmIChE
T01TdXBwb3J0Ojppc1RleHRCYXNlZENvbnRlbnRFZGl0YWJsZUVsZW1lbnQoZWxlbWVudCkpIHsK
KyAgICAgICAgICAgIGNvbnRleHQuc2V0RmxhZyhBY3RpdmVOb2RlQ29udGV4dDo6SXNJbnB1dCk7
CisgICAgICAgICAgICBpZiAoZWxlbWVudC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmlucHV0VGFn
KSkKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldEZsYWcoQWN0aXZlTm9kZUNvbnRleHQ6Oklz
U2luZ2xlTGluZSk7CisgICAgICAgICAgICBpZiAoRE9NU3VwcG9ydDo6aXNQYXNzd29yZEVsZW1l
bnQoZWxlbWVudCkpCisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRGbGFnKEFjdGl2ZU5vZGVD
b250ZXh0OjpJc1Bhc3N3b3JkKTsKKworICAgICAgICAgICAgU3RyaW5nIGVsZW1lbnRUZXh0KERP
TVN1cHBvcnQ6OmlucHV0RWxlbWVudFRleHQoZWxlbWVudCkpOworICAgICAgICAgICAgaWYgKCFl
bGVtZW50VGV4dC5zdHJpcFdoaXRlU3BhY2UoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAg
Y29udGV4dC5zZXRUZXh0KGVsZW1lbnRUZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlm
IChub2RlLT5pc0ZvY3VzYWJsZSgpKQorICAgICAgICBjb250ZXh0LnNldEZsYWcoQWN0aXZlTm9k
ZUNvbnRleHQ6OklzRm9jdXNhYmxlKTsKKworICAgIHJldHVybiBjb250ZXh0OworfQorCit2b2lk
IFdlYlBhZ2VQcml2YXRlOjp1cGRhdGVDdXJzb3IoKQoreworICAgIGludCBidXR0b25NYXNrID0g
MDsKKyAgICBpZiAobV9sYXN0TW91c2VFdmVudC5idXR0b24oKSA9PSBMZWZ0QnV0dG9uKQorICAg
ICAgICBidXR0b25NYXNrID0gUGxhdGZvcm06Ok1vdXNlRXZlbnQ6OlNjcmVlbkxlZnRNb3VzZUJ1
dHRvbjsKKyAgICBlbHNlIGlmIChtX2xhc3RNb3VzZUV2ZW50LmJ1dHRvbigpID09IE1pZGRsZUJ1
dHRvbikKKyAgICAgICAgYnV0dG9uTWFzayA9IFBsYXRmb3JtOjpNb3VzZUV2ZW50OjpTY3JlZW5N
aWRkbGVNb3VzZUJ1dHRvbjsKKyAgICBlbHNlIGlmIChtX2xhc3RNb3VzZUV2ZW50LmJ1dHRvbigp
ID09IFJpZ2h0QnV0dG9uKQorICAgICAgICBidXR0b25NYXNrID0gUGxhdGZvcm06Ok1vdXNlRXZl
bnQ6OlNjcmVlblJpZ2h0TW91c2VCdXR0b247CisKKyAgICBQbGF0Zm9ybTo6TW91c2VFdmVudCBl
dmVudChidXR0b25NYXNrLCBidXR0b25NYXNrLCBtYXBUb1RyYW5zZm9ybWVkKG1fbGFzdE1vdXNl
RXZlbnQucG9zKCkpLCBtYXBUb1RyYW5zZm9ybWVkKG1fbGFzdE1vdXNlRXZlbnQuZ2xvYmFsUG9z
KCkpLCAwLCAwKTsKKyAgICBtX3dlYlBhZ2UtPm1vdXNlRXZlbnQoZXZlbnQpOworfQorCitJbnRT
aXplIFdlYlBhZ2VQcml2YXRlOjpmaXhlZExheW91dFNpemUoYm9vbCBzbmFwVG9JbmNyZW1lbnQp
IGNvbnN0Cit7CisgICAgaWYgKGhhc1ZpcnR1YWxWaWV3cG9ydCgpKQorICAgICAgICByZXR1cm4g
SW50U2l6ZShtX3ZpcnR1YWxWaWV3cG9ydFdpZHRoLCBtX3ZpcnR1YWxWaWV3cG9ydEhlaWdodCk7
CisKKyAgICBjb25zdCBpbnQgZGVmYXVsdExheW91dFdpZHRoID0gbV9kZWZhdWx0TGF5b3V0U2l6
ZS53aWR0aCgpOworICAgIGNvbnN0IGludCBkZWZhdWx0TGF5b3V0SGVpZ2h0ID0gbV9kZWZhdWx0
TGF5b3V0U2l6ZS5oZWlnaHQoKTsKKworICAgIGludCBtaW5XaWR0aCA9IGRlZmF1bHRMYXlvdXRX
aWR0aDsKKyAgICBpbnQgbWF4V2lkdGggPSBkZWZhdWx0TWF4TGF5b3V0U2l6ZSgpLndpZHRoKCk7
CisgICAgaW50IG1heEhlaWdodCA9IGRlZmF1bHRNYXhMYXlvdXRTaXplKCkuaGVpZ2h0KCk7CisK
KyAgICAvLyBJZiB0aGUgbG9hZCBzdGF0ZSBpcyBub25lIHRoZW4gd2UgaGF2ZW4ndCBhY3R1YWxs
eSBnb3QgYW55dGhpbmcgeWV0LCBidXQgd2UgbmVlZCB0byBsYXlvdXQKKyAgICAvLyB0aGUgZW50
aXJlIHBhZ2Ugc28gdGhhdCB0aGUgdXNlciBzZWVzIHRoZSBlbnRpcmUgcGFnZSAodW5yZW5kZXJl
ZCkgaW5zdGVhZCBvZiBqdXN0IHBhcnQgb2YgaXQuCisgICAgaWYgKG1fbG9hZFN0YXRlID09IE5v
bmUpCisgICAgICAgIHJldHVybiBJbnRTaXplKGRlZmF1bHRMYXlvdXRXaWR0aCwgZGVmYXVsdExh
eW91dEhlaWdodCk7CisKKyAgICBpZiAobV92aWV3TW9kZSA9PSBGaXhlZERlc2t0b3ApIHsKKyAg
ICAgICAgaW50IHdpZHRoICA9IG1heFdpZHRoOworICAgICAgICAvLyBpZiB0aGUgZGVmYXVsdExh
eW91dEhlaWdodCBpcyBhdCBtaW5pbXVtLCBpdCBwcm9iYWJseSB3YXMgc2V0IGFzIDAKKyAgICAg
ICAgLy8gYW5kIGNsYW1wZWQsIG1lYW5pbmcgaXQncyBlZmZlY3RpdmVseSBub3Qgc2V0LiAgKEV2
ZW4gaWYgaXQgaGFwcGVuZWQKKyAgICAgICAgLy8gdG8gYmUgc2V0IGV4YWN0bHkgdG8gdGhlIG1p
bmltdW0sIGl0J3MgdG9vIHNtYWxsIHRvIGJlIHVzZWZ1bC4pICBTbworICAgICAgICAvLyBpZ25v
cmUgaXQuCisgICAgICAgIGludCBoZWlnaHQ7CisgICAgICAgIGlmIChkZWZhdWx0TGF5b3V0SGVp
Z2h0IDw9IG1pbmltdW1MYXlvdXRTaXplLmhlaWdodCgpKQorICAgICAgICAgICAgaGVpZ2h0ID0g
bWF4SGVpZ2h0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBoZWlnaHQgPSBjZWlsZihzdGF0
aWNfY2FzdDxmbG9hdD4od2lkdGgpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGRlZmF1bHRMYXlvdXRX
aWR0aCkgKiBzdGF0aWNfY2FzdDxmbG9hdD4oZGVmYXVsdExheW91dEhlaWdodCkpOworICAgICAg
ICByZXR1cm4gSW50U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisKKyAgICBpZiAobV92aWV3
TW9kZSA9PSBEZXNrdG9wKSB7CisgICAgICAgIC8vIElmIHdlIGRldGVjdCBhbiBvdmVyZmxvdyBs
YXJnZXIgdGhhbiB0aGUgY29udGVudHMgc2l6ZSB0aGVuIHVzZSB0aGF0IGluc3RlYWQgc2luY2UK
KyAgICAgICAgLy8gaXQnbGwgc3RpbGwgYmUgY2xhbXBlZCBieSB0aGUgbWF4V2lkdGggYmVsb3cu
Li4KKyAgICAgICAgaW50IHdpZHRoID0gc3RkOjptYXgoYWJzb2x1dGVWaXNpYmxlT3ZlcmZsb3dT
aXplKCkud2lkdGgoKSwgY29udGVudHNTaXplKCkud2lkdGgoKSk7CisKKyAgICAgICAgaWYgKHNu
YXBUb0luY3JlbWVudCkgeworICAgICAgICAgICAgLy8gU25hcCB0byBpbmNyZW1lbnRzIG9mIGRl
ZmF1bHRMYXlvdXRXaWR0aCAvIDIuMC4KKyAgICAgICAgICAgIGZsb2F0IGZhY3RvciA9IHN0YXRp
Y19jYXN0PGZsb2F0Pih3aWR0aCkgLyAoZGVmYXVsdExheW91dFdpZHRoIC8gMi4wKTsKKyAgICAg
ICAgICAgIGZhY3RvciA9IGNlaWxmKGZhY3Rvcik7CisgICAgICAgICAgICB3aWR0aCA9IChkZWZh
dWx0TGF5b3V0V2lkdGggLyAyLjApICogZmFjdG9yOworICAgICAgICB9CisKKyAgICAgICAgaWYg
KHdpZHRoIDwgbWluV2lkdGgpCisgICAgICAgICAgICB3aWR0aCA9IG1pbldpZHRoOworICAgICAg
ICBpZiAod2lkdGggPiBtYXhXaWR0aCkKKyAgICAgICAgICAgIHdpZHRoID0gbWF4V2lkdGg7Cisg
ICAgICAgIGludCBoZWlnaHQgPSBjZWlsZihzdGF0aWNfY2FzdDxmbG9hdD4od2lkdGgpIC8gc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KGRlZmF1bHRMYXlvdXRXaWR0aCkgKiBzdGF0aWNfY2FzdDxmbG9hdD4o
ZGVmYXVsdExheW91dEhlaWdodCkpOworICAgICAgICByZXR1cm4gSW50U2l6ZSh3aWR0aCwgaGVp
Z2h0KTsKKyAgICB9CisKKyAgICBpZiAobV93ZWJTZXR0aW5ncy0+aXNab29tVG9GaXRPbkxvYWQo
KSkgeworICAgICAgICAvLyBXZSBuZWVkIHRvIGNsYW1wIHRoZSBsYXlvdXQgd2lkdGggdG8gdGhl
IG1pbmltdW0gb2YgdGhlIGxheW91dAorICAgICAgICAvLyB3aWR0aCBvciB0aGUgY29udGVudCB3
aWR0aC4gVGhpcyBpcyBpbXBvcnRhbnQgdW5kZXIgcm90YXRpb24gZm9yIG1vYmlsZQorICAgICAg
ICAvLyB3ZWJzaXRlcy4gV2Ugd2FudCB0aGUgcGFnZSB0byByZW1haW4gbGF5b3V0ZWQgYXQgdGhl
IHNhbWUgd2lkdGggd2hpY2gKKyAgICAgICAgLy8gaXQgd2FzIGxvYWRlZCB3aXRoLCBhbmQgaW5z
dGVhZCBjaGFuZ2UgdGhlIHpvb20gbGV2ZWwgdG8gZml0IHRvIHNjcmVlbi4KKyAgICAgICAgLy8g
VGhlIGhlaWdodCBpcyB3ZWxjb21lIHRvIGFkYXB0IHRvIHRoZSBoZWlnaHQgdXNlZCBpbiB0aGUg
bmV3IG9yaWVudGF0aW9uLAorICAgICAgICAvLyBvdGhlcndpc2Ugd2Ugd2lsbCBnZXQgYSBncmV5
IGJhciBiZWxvdyB0aGUgd2ViIHBhZ2UuCisgICAgICAgIGlmIChtX21haW5GcmFtZS0+dmlldygp
ICYmICFjb250ZW50c1NpemUoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICBtaW5XaWR0aCA9IGNv
bnRlbnRzU2l6ZSgpLndpZHRoKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gSWYg
dGhlcmUgaXMgbm8gY29udGVudHMgd2lkdGgsIHVzZSB0aGUgbWluaW11bSBvZiBzY3JlZW4gd2lk
dGgKKyAgICAgICAgICAgIC8vIGFuZCBsYXlvdXQgd2lkdGggdG8gc2hhcGUgdGhlIGZpcnN0IGxh
eW91dCB0byBhIGNvbnRlbnRzIHdpZHRoCisgICAgICAgICAgICAvLyB0aGF0IHdlIGNvdWxkIHJl
YXNvbmFibHkgem9vbSB0byBmaXQsIGluIGEgbWFubmVyIHRoYXQgdGFrZXMKKyAgICAgICAgICAg
IC8vIG9yaWVudGF0aW9uIGludG8gYWNjb3VudCBhbmQgc3RpbGwgcmVzcGVjdHMgYSBzbWFsbCBk
ZWZhdWx0CisgICAgICAgICAgICAvLyBsYXlvdXQgd2lkdGguCisjaWYgRU5BQkxFKE9SSUVOVEFU
SU9OX0VWRU5UUykKKyAgICAgICAgICAgIG1pbldpZHRoID0gbV9tYWluRnJhbWUtPm9yaWVudGF0
aW9uKCkgJSAxODAKKyAgICAgICAgICAgICAgICA/IFBsYXRmb3JtOjpHcmFwaGljczo6U2NyZWVu
OjpoZWlnaHQoKQorICAgICAgICAgICAgICAgIDogUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46
OndpZHRoKCk7CisjZWxzZQorICAgICAgICAgICAgbWluV2lkdGggPSBQbGF0Zm9ybTo6R3JhcGhp
Y3M6OlNjcmVlbjo6d2lkdGgoKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgcmV0
dXJuIEludFNpemUoc3RkOjptaW4obWluV2lkdGgsIGRlZmF1bHRMYXlvdXRXaWR0aCksIGRlZmF1
bHRMYXlvdXRIZWlnaHQpOworfQorCitCYWNraW5nU3RvcmVDbGllbnQqIFdlYlBhZ2VQcml2YXRl
OjpiYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZShjb25zdCBGcmFtZSogZnJhbWUpIGNvbnN0Cit7
CisgICAgQVNTRVJUKGZyYW1lKTsKKyAgICBCYWNraW5nU3RvcmVDbGllbnQqIGJhY2tpbmdTdG9y
ZUNsaWVudCA9IDA7CisgICAgaWYgKG1fYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWVNYXAuY29u
dGFpbnMoZnJhbWUpKQorICAgICAgICBiYWNraW5nU3RvcmVDbGllbnQgPSBtX2JhY2tpbmdTdG9y
ZUNsaWVudEZvckZyYW1lTWFwLmdldChmcmFtZSk7CisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZUNs
aWVudDsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6YWRkQmFja2luZ1N0b3JlQ2xpZW50Rm9y
RnJhbWUoY29uc3QgRnJhbWUqIGZyYW1lLCBCYWNraW5nU3RvcmVDbGllbnQqIGNsaWVudCkKK3sK
KyAgICBBU1NFUlQoZnJhbWUpOworICAgIEFTU0VSVChjbGllbnQpOworICAgIG1fYmFja2luZ1N0
b3JlQ2xpZW50Rm9yRnJhbWVNYXAuYWRkKGZyYW1lLCBjbGllbnQpOworfQorCit2b2lkIFdlYlBh
Z2VQcml2YXRlOjpyZW1vdmVCYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZShjb25zdCBGcmFtZSog
ZnJhbWUpCit7CisgICAgQVNTRVJUKGZyYW1lKTsKKyAgICBpZiAobV9iYWNraW5nU3RvcmVDbGll
bnRGb3JGcmFtZU1hcC5jb250YWlucyhmcmFtZSkpCisgICAgICAgIG1fYmFja2luZ1N0b3JlQ2xp
ZW50Rm9yRnJhbWVNYXAucmVtb3ZlKGZyYW1lKTsKK30KKworCit2b2lkIFdlYlBhZ2VQcml2YXRl
OjpjbGVhckRvY3VtZW50RGF0YShjb25zdCBEb2N1bWVudCogZG9jdW1lbnRHb2luZ0F3YXkpCit7
CisgICAgQVNTRVJUKGRvY3VtZW50R29pbmdBd2F5KTsKKyAgICBpZiAobV9jdXJyZW50Q29udGV4
dE5vZGUgJiYgbV9jdXJyZW50Q29udGV4dE5vZGUtPmRvY3VtZW50KCkgPT0gZG9jdW1lbnRHb2lu
Z0F3YXkpCisgICAgICAgIG1fY3VycmVudENvbnRleHROb2RlID0gMDsKKworICAgIGlmIChtX2N1
cnJlbnRQaW5jaFpvb21Ob2RlICYmIG1fY3VycmVudFBpbmNoWm9vbU5vZGUtPmRvY3VtZW50KCkg
PT0gZG9jdW1lbnRHb2luZ0F3YXkpCisgICAgICAgIG1fY3VycmVudFBpbmNoWm9vbU5vZGUgPSAw
OworCisgICAgaWYgKG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZSAmJiBtX2N1cnJlbnRC
bG9ja1pvb21BZGp1c3RlZE5vZGUtPmRvY3VtZW50KCkgPT0gZG9jdW1lbnRHb2luZ0F3YXkpCisg
ICAgICAgIG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZSA9IDA7CisKKyAgICBpZiAobV9p
blJlZ2lvblNjcm9sbFN0YXJ0aW5nTm9kZSAmJiBtX2luUmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2Rl
LT5kb2N1bWVudCgpID09IGRvY3VtZW50R29pbmdBd2F5KQorICAgICAgICBtX2luUmVnaW9uU2Ny
b2xsU3RhcnRpbmdOb2RlID0gMDsKKworICAgIE5vZGUqIG5vZGVVbmRlckZhdEZpbmdlciA9IG1f
dG91Y2hFdmVudEhhbmRsZXItPmxhc3RGYXRGaW5nZXJzUmVzdWx0KCkudmFsaWROb2RlKCk7Cisg
ICAgaWYgKG5vZGVVbmRlckZhdEZpbmdlciAmJiBub2RlVW5kZXJGYXRGaW5nZXItPmRvY3VtZW50
KCkgPT0gZG9jdW1lbnRHb2luZ0F3YXkpCisgICAgICAgIG1fdG91Y2hFdmVudEhhbmRsZXItPnJl
c2V0TGFzdEZhdEZpbmdlcnNSZXN1bHQoKTsKKworICAgIC8vIE5PVEU6IG1fZnVsbHNjcmVlblZp
ZGVvTm9kZSwgbV9mdWxsU2NyZWVuUGx1Z2luVmlldyBhbmQgbV9wbHVnaW5WaWV3cworICAgIC8v
IGFyZSBjbGVhcmVkIGluIG90aGVyIG1ldGhvZHMgYWxyZWFkeS4KK30KKwordHlwZWRlZiBib29s
ICgqUHJlZGljYXRlRnVuY3Rpb24pKFJlbmRlckxheWVyKik7CitzdGF0aWMgYm9vbCBpc1Bvc2l0
aW9uZWRDb250YWluZXIoUmVuZGVyTGF5ZXIqIGxheWVyKQoreworICAgIFJlbmRlck9iamVjdCog
byA9IGxheWVyLT5yZW5kZXJlcigpOworICAgIHJldHVybiBvLT5pc1JlbmRlclZpZXcoKSB8fCBv
LT5pc1Bvc2l0aW9uZWQoKSB8fCBvLT5pc1JlbFBvc2l0aW9uZWQoKSB8fCBsYXllci0+aGFzVHJh
bnNmb3JtKCk7Cit9CisKK3N0YXRpYyBib29sIGlzTm9uUmVuZGVyVmlld0ZpeGVkUG9zaXRpb25l
ZENvbnRhaW5lcihSZW5kZXJMYXllciogbGF5ZXIpCit7CisgICAgUmVuZGVyT2JqZWN0KiBvID0g
bGF5ZXItPnJlbmRlcmVyKCk7CisgICAgaWYgKG8tPmlzUmVuZGVyVmlldygpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gby0+aXNQb3NpdGlvbmVkKCkgJiYgby0+c3R5bGUo
KS0+cG9zaXRpb24oKSA9PSBGaXhlZFBvc2l0aW9uOworfQorCitzdGF0aWMgYm9vbCBpc0ZpeGVk
UG9zaXRpb25lZENvbnRhaW5lcihSZW5kZXJMYXllciogbGF5ZXIpCit7CisgICAgUmVuZGVyT2Jq
ZWN0KiBvID0gbGF5ZXItPnJlbmRlcmVyKCk7CisgICAgcmV0dXJuIG8tPmlzUmVuZGVyVmlldygp
IHx8IChvLT5pc1Bvc2l0aW9uZWQoKSAmJiBvLT5zdHlsZSgpLT5wb3NpdGlvbigpID09IEZpeGVk
UG9zaXRpb24pOworfQorCitzdGF0aWMgUmVuZGVyTGF5ZXIqIGZpbmRBbmNlc3Rvck9yU2VsZk5v
dE1hdGNoaW5nKFByZWRpY2F0ZUZ1bmN0aW9uIHByZWRpY2F0ZSwgUmVuZGVyTGF5ZXIqIGxheWVy
KQoreworICAgIFJlbmRlckxheWVyKiBjdXJyID0gbGF5ZXI7CisgICAgd2hpbGUgKGN1cnIgJiYg
IXByZWRpY2F0ZShjdXJyKSkKKyAgICAgICAgY3VyciA9IGN1cnItPnBhcmVudCgpOworCisgICAg
cmV0dXJuIGN1cnI7Cit9CisKK1JlbmRlckxheWVyKiBXZWJQYWdlUHJpdmF0ZTo6ZW5jbG9zaW5n
Rml4ZWRQb3NpdGlvbmVkQW5jZXN0b3JPclNlbGZJZkZpeGVkUG9zaXRpb25lZChSZW5kZXJMYXll
ciogbGF5ZXIpCit7CisgICAgcmV0dXJuIGZpbmRBbmNlc3Rvck9yU2VsZk5vdE1hdGNoaW5nKCZp
c0ZpeGVkUG9zaXRpb25lZENvbnRhaW5lciwgbGF5ZXIpOworfQorCitSZW5kZXJMYXllciogV2Vi
UGFnZVByaXZhdGU6OmVuY2xvc2luZ1Bvc2l0aW9uZWRBbmNlc3Rvck9yU2VsZklmUG9zaXRpb25l
ZChSZW5kZXJMYXllciogbGF5ZXIpCit7CisgICAgcmV0dXJuIGZpbmRBbmNlc3Rvck9yU2VsZk5v
dE1hdGNoaW5nKCZpc1Bvc2l0aW9uZWRDb250YWluZXIsIGxheWVyKTsKK30KKworc3RhdGljIGlu
bGluZSBGcmFtZSogZnJhbWVGb3JOb2RlKE5vZGUqIG5vZGUpCit7CisgICAgTm9kZSogb3JpZ05v
ZGUgPSBub2RlOworICAgIGZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+cGFyZW50Tm9kZSgpKSB7
CisgICAgICAgIGlmIChSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKSkg
eworICAgICAgICAgICAgaWYgKHJlbmRlcmVyLT5pc1JlbmRlclZpZXcoKSkgeworICAgICAgICAg
ICAgICAgIGlmIChGcmFtZVZpZXcqIHZpZXcgPSB0b1JlbmRlclZpZXcocmVuZGVyZXIpLT5mcmFt
ZVZpZXcoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gdmlldy0+
ZnJhbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVuZGVyZXItPmlzV2lk
Z2V0KCkpIHsKKyAgICAgICAgICAgICAgICBXaWRnZXQqIHdpZGdldCA9IHRvUmVuZGVyV2lkZ2V0
KHJlbmRlcmVyKS0+d2lkZ2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHdpZGdldCAmJiB3aWRn
ZXQtPmlzRnJhbWVWaWV3KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZyYW1lKiBmcmFt
ZSA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHdpZGdldCktPmZyYW1lKCkpCisgICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gZnJhbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChub2RlID0gb3JpZ05vZGU7IG5vZGU7
IG5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCkpIHsKKyAgICAgICAgaWYgKERvY3VtZW50KiBkb2Mg
PSBub2RlLT5kb2N1bWVudCgpKSB7CisgICAgICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gZG9j
LT5mcmFtZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgSW50UmVjdCBnZXROb2RlV2luZG93UmVj
dChOb2RlKiBub2RlKQoreworICAgIGlmIChGcmFtZSogZnJhbWUgPSBmcmFtZUZvck5vZGUobm9k
ZSkpIHsKKyAgICAgICAgaWYgKEZyYW1lVmlldyogdmlldyA9IGZyYW1lLT52aWV3KCkpCisgICAg
ICAgICAgICByZXR1cm4gdmlldy0+Y29udGVudHNUb1dpbmRvdyhub2RlLT5nZXRSZWN0KCkpOwor
ICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gSW50UmVjdCgpOwor
fQorCitJbnRSZWN0IFdlYlBhZ2VQcml2YXRlOjpnZXRSZWN1cnNpdmVWaXNpYmxlV2luZG93UmVj
dChTY3JvbGxWaWV3KiB2aWV3LCBib29sIG5vQ2xpcE9mTWFpbkZyYW1lKQoreworICAgIEFTU0VS
VChtX21haW5GcmFtZSk7CisKKyAgICAvLyBEb24ndCBjYWxsIHRoaXMgZnVuY3Rpb24gYXNraW5n
IHRvIG5vdCBjbGlwIHRoZSBtYWluIGZyYW1lIHByb3ZpZGluZyBvbmx5CisgICAgLy8gdGhlIG1h
aW4gZnJhbWUuIEFsbCB0aGF0IGNhbiBiZSByZXR1cm5lZCBpcyB0aGUgY29udGVudCByZWN0IHdo
aWNoCisgICAgLy8gaXNuJ3Qgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIGZvci4KKyAgICBpZiAobm9D
bGlwT2ZNYWluRnJhbWUgJiYgdmlldyA9PSBtX21haW5GcmFtZS0+dmlldygpKSB7CisgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gSW50UmVjdChJbnRQb2ludCgw
LCAwKSwgdmlldy0+Y29udGVudHNTaXplKCkpOworICAgIH0KKworICAgIEludFJlY3QgdmlzaWJs
ZVdpbmRvd1JlY3Qodmlldy0+Y29udGVudHNUb1dpbmRvdyh2aWV3LT52aXNpYmxlQ29udGVudFJl
Y3QoZmFsc2UpKSk7CisgICAgaWYgKHZpZXctPnBhcmVudCgpICYmICEobm9DbGlwT2ZNYWluRnJh
bWUgJiYgdmlldy0+cGFyZW50KCkgPT0gbV9tYWluRnJhbWUtPnZpZXcoKSkpIHsKKyAgICAgICAg
Ly8gSW50ZXJzZWN0IHdpdGggcGFyZW50IHZpc2libGUgcmVjdC4KKyAgICAgICAgdmlzaWJsZVdp
bmRvd1JlY3QuaW50ZXJzZWN0KGdldFJlY3Vyc2l2ZVZpc2libGVXaW5kb3dSZWN0KHZpZXctPnBh
cmVudCgpLCBub0NsaXBPZk1haW5GcmFtZSkpOworICAgIH0KKyAgICByZXR1cm4gdmlzaWJsZVdp
bmRvd1JlY3Q7Cit9CisKK3ZvaWQgV2ViUGFnZTo6YXNzaWduRm9jdXMoUGxhdGZvcm06OkZvY3Vz
RGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICBkLT5hc3NpZ25Gb2N1cyhkaXJlY3Rpb24pOwor
fQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjphc3NpZ25Gb2N1cyhQbGF0Zm9ybTo6Rm9jdXNEaXJl
Y3Rpb24gZGlyZWN0aW9uKQoreworICAgIEFTU0VSVCgoaW50KSBQbGF0Zm9ybTo6Rm9jdXNEaXJl
Y3Rpb25Ob25lID09IChpbnQpIEZvY3VzRGlyZWN0aW9uTm9uZSk7CisgICAgQVNTRVJUKChpbnQp
IFBsYXRmb3JtOjpGb2N1c0RpcmVjdGlvbkZvcndhcmQgPT0gKGludCkgRm9jdXNEaXJlY3Rpb25G
b3J3YXJkKTsKKyAgICBBU1NFUlQoKGludCkgUGxhdGZvcm06OkZvY3VzRGlyZWN0aW9uQmFja3dh
cmQgPT0gKGludCkgRm9jdXNEaXJlY3Rpb25CYWNrd2FyZCk7CisKKyAgICAvLyBGaXJzdCB3ZSBj
bGVhciB0aGUgZm9jdXMsIHNpbmNlIHdlIHdhbnQgdG8gZm9jdXMgZWl0aGVyIGluaXRpYWwgb3Ig
dGhlIGxhc3QKKyAgICAvLyBmb2N1c2FibGUgZWxlbWVudCBpbiB0aGUgd2VicGFnZSAoYWNjb3Jk
aW5nIHRvIHRoZSBUQUJJTkRFWCksIG9yIHNpbXBseSBjbGVhcgorICAgIC8vIHRoZSBmb2N1cy4K
KyAgICBjbGVhckZvY3VzTm9kZSgpOworCisgICAgc3dpdGNoIChkaXJlY3Rpb24pIHsKKyAgICBj
YXNlIEZvY3VzRGlyZWN0aW9uRm9yd2FyZDoKKyAgICBjYXNlIEZvY3VzRGlyZWN0aW9uQmFja3dh
cmQ6CisgICAgICAgIG1fcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPnNldEluaXRpYWxGb2N1cygo
Rm9jdXNEaXJlY3Rpb24pIGRpcmVjdGlvbiwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
Rm9jdXNEaXJlY3Rpb25Ob25lOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9Cit9CisKK1BsYXRmb3JtOjpJbnRSZWN0IFdl
YlBhZ2VQcml2YXRlOjpmb2N1c05vZGVSZWN0KCkKK3sKKyAgICBGcmFtZSogZnJhbWUgPSBmb2N1
c2VkT3JNYWluRnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gUGxhdGZv
cm06OkludFJlY3QoKTsKKworICAgIERvY3VtZW50KiBkb2MgPSBmcmFtZS0+ZG9jdW1lbnQoKTsK
KyAgICBGcmFtZVZpZXcqIHZpZXcgPSBmcmFtZS0+dmlldygpOworICAgIGlmICghZG9jIHx8ICF2
aWV3IHx8IHZpZXctPm5lZWRzTGF5b3V0KCkpCisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6SW50
UmVjdCgpOworCisgICAgSW50UmVjdCBmb2N1c1JlY3QgPSByZWN0Rm9yTm9kZShkb2MtPmZvY3Vz
ZWROb2RlKCkpOworICAgIGZvY3VzUmVjdCA9IGFkanVzdFJlY3RPZmZzZXRGb3JGcmFtZU9mZnNl
dChmb2N1c1JlY3QsIGRvYy0+Zm9jdXNlZE5vZGUoKSk7CisgICAgZm9jdXNSZWN0ID0gbWFwVG9U
cmFuc2Zvcm1lZChmb2N1c1JlY3QpOworICAgIGNsaXBUb1RyYW5zZm9ybWVkQ29udGVudHNSZWN0
KGZvY3VzUmVjdCk7CisgICAgcmV0dXJuIGZvY3VzUmVjdDsKK30KKworUGFzc1JlZlB0cjxOb2Rl
PiBXZWJQYWdlUHJpdmF0ZTo6Y29udGV4dE5vZGUoVGFyZ2V0RGV0ZWN0aW9uU3RyYXRlZ3kgc3Ry
YXRlZ3kpCit7CisgICAgRXZlbnRIYW5kbGVyKiBldmVudEhhbmRsZXIgPSBmb2N1c2VkT3JNYWlu
RnJhbWUoKS0+ZXZlbnRIYW5kbGVyKCk7CisgICAgY29uc3QgRmF0RmluZ2Vyc1Jlc3VsdCBsYXN0
RmF0RmluZ2Vyc1Jlc3VsdCA9IG1fdG91Y2hFdmVudEhhbmRsZXItPmxhc3RGYXRGaW5nZXJzUmVz
dWx0KCk7CisgICAgYm9vbCBpc1RvdWNoaW5nID0gbGFzdEZhdEZpbmdlcnNSZXN1bHQuaXNWYWxp
ZCgpICYmIHN0cmF0ZWd5ID09IFJlY3RCYXNlZDsKKworICAgIC8vIFVucHJlc3MgdGhlIG1vdXNl
IGJ1dHRvbiBhbHdheXMuCisgICAgaWYgKGV2ZW50SGFuZGxlci0+bW91c2VQcmVzc2VkKCkpCisg
ICAgICAgIGV2ZW50SGFuZGxlci0+c2V0TW91c2VQcmVzc2VkKGZhbHNlKTsKKworICAgIC8vIENo
ZWNrIGlmIHdlJ3JlIHVzaW5nIExpbmtUb0xpbmsgYW5kIHRoZSB1c2VyIGlzIG5vdCB0b3VjaGlu
ZyB0aGUgc2NyZWVuLgorICAgIGlmIChtX3dlYlNldHRpbmdzLT5kb2VzR2V0Rm9jdXNOb2RlQ29u
dGV4dCgpICYmICFpc1RvdWNoaW5nKSB7CisgICAgICAgIFJlZlB0cjxOb2RlPiBub2RlOworICAg
ICAgICBub2RlID0gbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZyYW1l
KCktPmRvY3VtZW50KCktPmZvY3VzZWROb2RlKCk7CisgICAgICAgIGlmIChub2RlKSB7CisgICAg
ICAgICAgICBJbnRSZWN0IHZpc2libGVSZWN0ID0gSW50UmVjdChJbnRQb2ludCgpLCBhY3R1YWxW
aXNpYmxlU2l6ZSgpKTsKKyAgICAgICAgICAgIGlmICghdmlzaWJsZVJlY3QuaW50ZXJzZWN0cyhn
ZXROb2RlV2luZG93UmVjdChub2RlLmdldCgpKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vZGUucmVsZWFzZSgpOworICAgIH0KKworICAg
IC8vIENoZWNrIGZvciB0ZXh0IGlucHV0LgorICAgIGlmIChpc1RvdWNoaW5nICYmIGxhc3RGYXRG
aW5nZXJzUmVzdWx0LmlzVGV4dElucHV0KCkpCisgICAgICAgIHJldHVybiBsYXN0RmF0RmluZ2Vy
c1Jlc3VsdC52YWxpZE5vZGUoKTsKKworICAgIEludFBvaW50IGNvbnRlbnRQb3M7CisgICAgaWYg
KGlzVG91Y2hpbmcpCisgICAgICAgIGNvbnRlbnRQb3MgPSBsYXN0RmF0RmluZ2Vyc1Jlc3VsdC5h
ZGp1c3RlZFBvc2l0aW9uKCk7CisgICAgZWxzZQorICAgICAgICBjb250ZW50UG9zID0gbWFwRnJv
bVZpZXdwb3J0VG9Db250ZW50cyhtX2xhc3RNb3VzZUV2ZW50LnBvcygpKTsKKworICAgIGlmIChz
dHJhdGVneSA9PSBSZWN0QmFzZWQpIHsKKyAgICAgICAgRmF0RmluZ2Vyc1Jlc3VsdCByZXN1bHQg
PSBGYXRGaW5nZXJzKHRoaXMsIGxhc3RGYXRGaW5nZXJzUmVzdWx0LmFkanVzdGVkUG9zaXRpb24o
KSwgRmF0RmluZ2Vyczo6VGV4dCkuZmluZEJlc3RQb2ludCgpOworICAgICAgICByZXR1cm4gcmVz
dWx0LnZhbGlkTm9kZSgpOworICAgIH0KKworICAgIEhpdFRlc3RSZXN1bHQgcmVzdWx0ID0gZXZl
bnRIYW5kbGVyLT5oaXRUZXN0UmVzdWx0QXRQb2ludChjb250ZW50UG9zLCBmYWxzZSAvKmFsbG93
U2hhZG93Q29udGVudCovKTsKKyAgICByZXR1cm4gcmVzdWx0LmlubmVyTm9kZSgpOworfQorCitz
dGF0aWMgaW5saW5lIGludCBkaXN0YW5jZUJldHdlZW5Qb2ludHMoSW50UG9pbnQgcDEsIEludFBv
aW50IHAyKQoreworICAgIC8vIENoYW5nZSBpbnQgdG8gZG91YmxlLCBiZWNhdXNlIChkeSAqIGR5
KSBjYW4gY2F1c2UgaW50IG92ZXJmbG93IGluIHJlYWxpdHksIGUuZywgKC00NjcwOSAqIC00Njcw
OSkuCisgICAgZG91YmxlIGR4ID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihwMS54KCkgLSBwMi54KCkp
OworICAgIGRvdWJsZSBkeSA9IHN0YXRpY19jYXN0PGRvdWJsZT4ocDEueSgpIC0gcDIueSgpKTsK
KyAgICByZXR1cm4gc3FydCgoZHggKiBkeCkgKyAoZHkgKiBkeSkpOworfQorCitOb2RlKiBXZWJQ
YWdlUHJpdmF0ZTo6YmVzdE5vZGVGb3Jab29tVW5kZXJQb2ludChjb25zdCBJbnRQb2ludCYgcG9p
bnQpCit7CisgICAgSW50UG9pbnQgcHQgPSBtYXBGcm9tVHJhbnNmb3JtZWQocG9pbnQpOworICAg
IEludFJlY3QgY2xpY2tSZWN0KHB0LngoKSAtIGJsb2NrQ2xpY2tSYWRpdXMsIHB0LnkoKSAtIGJs
b2NrQ2xpY2tSYWRpdXMsIDIgKiBibG9ja0NsaWNrUmFkaXVzLCAyICogYmxvY2tDbGlja1JhZGl1
cyk7CisgICAgTm9kZSogb3JpZ2luYWxOb2RlID0gbm9kZUZvclpvb21VbmRlclBvaW50KHBvaW50
KTsKKyAgICBpZiAoIW9yaWdpbmFsTm9kZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgTm9kZSog
bm9kZSA9IGJlc3RDaGlsZE5vZGVGb3JDbGlja1JlY3Qob3JpZ2luYWxOb2RlLCBjbGlja1JlY3Qp
OworICAgIHJldHVybiBub2RlID8gYWRqdXN0ZWRCbG9ja1pvb21Ob2RlRm9yWm9vbUxpbWl0cyhu
b2RlKSA6IGFkanVzdGVkQmxvY2tab29tTm9kZUZvclpvb21MaW1pdHMob3JpZ2luYWxOb2RlKTsK
K30KKworTm9kZSogV2ViUGFnZVByaXZhdGU6OmJlc3RDaGlsZE5vZGVGb3JDbGlja1JlY3QoTm9k
ZSogcGFyZW50Tm9kZSwgY29uc3QgSW50UmVjdCYgY2xpY2tSZWN0KQoreworICAgIGlmICghcGFy
ZW50Tm9kZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpbnQgYmVzdERpc3RhbmNlID0gc3Rk
OjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKworICAgIE5vZGUqIG5vZGUgPSBwYXJlbnRO
b2RlLT5maXJzdENoaWxkKCk7CisgICAgTm9kZSogYmVzdE5vZGUgPSAwOworICAgIHdoaWxlIChu
b2RlKSB7CisgICAgICAgIEludFJlY3QgcmVjdCA9IHJlY3RGb3JOb2RlKG5vZGUpOworICAgICAg
ICBpZiAoY2xpY2tSZWN0LmludGVyc2VjdHMocmVjdCkpIHsKKyAgICAgICAgICAgIGludCBkaXN0
YW5jZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50cyhyZWN0LmNlbnRlcigpLCBjbGlja1JlY3QuY2Vu
dGVyKCkpOworICAgICAgICAgICAgTm9kZSogYmVzdENoaWxkTm9kZSA9IGJlc3RDaGlsZE5vZGVG
b3JDbGlja1JlY3Qobm9kZSwgY2xpY2tSZWN0KTsKKyAgICAgICAgICAgIGlmIChiZXN0Q2hpbGRO
b2RlKSB7CisgICAgICAgICAgICAgICAgSW50UmVjdCBiZXN0Q2hpbGRSZWN0ID0gcmVjdEZvck5v
ZGUoYmVzdENoaWxkTm9kZSk7CisgICAgICAgICAgICAgICAgaW50IGJlc3RDaGlsZERpc3RhbmNl
ID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKGJlc3RDaGlsZFJlY3QuY2VudGVyKCksIGNsaWNrUmVj
dC5jZW50ZXIoKSk7CisgICAgICAgICAgICAgICAgaWYgKGJlc3RDaGlsZERpc3RhbmNlIDwgZGlz
dGFuY2UgJiYgYmVzdENoaWxkRGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHsKKyAgICAgICAgICAg
ICAgICAgICAgYmVzdE5vZGUgPSBiZXN0Q2hpbGROb2RlOworICAgICAgICAgICAgICAgICAgICBi
ZXN0RGlzdGFuY2UgPSBiZXN0Q2hpbGREaXN0YW5jZTsKKyAgICAgICAgICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIGJlc3ROb2RlID0gbm9kZTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlOworICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBp
ZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgYmVzdE5v
ZGUgPSBub2RlOworICAgICAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbm9k
ZSA9IG5vZGUtPm5leHRTaWJsaW5nKCk7CisgICAgfQorCisgICAgcmV0dXJuIGJlc3ROb2RlOwor
fQorCitkb3VibGUgV2ViUGFnZVByaXZhdGU6Om1heEJsb2NrWm9vbVNjYWxlKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gc3RkOjptaW4obWF4aW11bUJsb2NrWm9vbVNjYWxlLCBtYXhpbXVtU2NhbGUo
KSk7Cit9CisKK05vZGUqIFdlYlBhZ2VQcml2YXRlOjpub2RlRm9yWm9vbVVuZGVyUG9pbnQoY29u
c3QgSW50UG9pbnQmIHBvaW50KQoreworICAgIGlmICghbV9tYWluRnJhbWUpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQgPSBtX21haW5GcmFtZS0+ZXZlbnRI
YW5kbGVyKCktPmhpdFRlc3RSZXN1bHRBdFBvaW50KG1hcEZyb21UcmFuc2Zvcm1lZChwb2ludCks
IGZhbHNlKTsKKworICAgIE5vZGUqIG5vZGUgPSByZXN1bHQuaW5uZXJOb25TaGFyZWROb2RlKCk7
CisKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiAwOworCisgICAgUmVuZGVyT2JqZWN0
KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7CisgICAgd2hpbGUgKCFyZW5kZXJlcikgewor
ICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50Tm9kZSgpOworICAgICAgICByZW5kZXJlciA9IG5v
ZGUtPnJlbmRlcmVyKCk7CisgICAgfQorCisgICAgcmV0dXJuIG5vZGU7Cit9CisKK05vZGUqIFdl
YlBhZ2VQcml2YXRlOjphZGp1c3RlZEJsb2NrWm9vbU5vZGVGb3Jab29tTGltaXRzKE5vZGUqIG5v
ZGUpCit7CisgICAgTm9kZSogaW5pdGlhbE5vZGUgPSBub2RlOworICAgIFJlbmRlck9iamVjdCog
cmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpOworICAgIGJvb2wgYWNjZXB0YWJsZU5vZGVTaXpl
ID0gbmV3U2NhbGVGb3JCbG9ja1pvb21SZWN0KHJlY3RGb3JOb2RlKG5vZGUpLCAxLjAsIDApIDwg
bWF4QmxvY2tab29tU2NhbGUoKTsKKworICAgIHdoaWxlICghcmVuZGVyZXIgfHwgIWFjY2VwdGFi
bGVOb2RlU2l6ZSkgeworICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50Tm9kZSgpOworCisgICAg
ICAgIGlmICghbm9kZSkKKyAgICAgICAgICAgIHJldHVybiBpbml0aWFsTm9kZTsKKworICAgICAg
ICByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7CisgICAgICAgIGFjY2VwdGFibGVOb2RlU2l6
ZSA9IG5ld1NjYWxlRm9yQmxvY2tab29tUmVjdChyZWN0Rm9yTm9kZShub2RlKSwgMS4wLCAwKSA8
IG1heEJsb2NrWm9vbVNjYWxlKCk7CisgICAgfQorCisgICAgcmV0dXJuIG5vZGU7Cit9CisKK2Jv
b2wgV2ViUGFnZVByaXZhdGU6OmNvbXBhcmVOb2Rlc0ZvckJsb2NrWm9vbShOb2RlKiBuMSwgTm9k
ZSogbjIpCit7CisgICAgaWYgKCFuMSB8fCAhbjIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIHJldHVybiAobjIgPT0gbjEpIHx8IG4yLT5pc0Rlc2NlbmRhbnRPZihuMSk7Cit9CisKK2Rv
dWJsZSBXZWJQYWdlUHJpdmF0ZTo6bmV3U2NhbGVGb3JCbG9ja1pvb21SZWN0KGNvbnN0IEludFJl
Y3QmIHJlY3QsIGRvdWJsZSBvbGRTY2FsZSwgZG91YmxlIG1hcmdpbikKK3sKKyAgICBpZiAocmVj
dC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46
Om1heCgpOworCisgICAgQVNTRVJUKHJlY3Qud2lkdGgoKSArIG1hcmdpbik7CisKKyAgICBkb3Vi
bGUgbmV3U2NhbGUgPSBvbGRTY2FsZSAqIHN0YXRpY19jYXN0PGRvdWJsZT4odHJhbnNmb3JtZWRB
Y3R1YWxWaXNpYmxlU2l6ZSgpLndpZHRoKCkpIC8gKHJlY3Qud2lkdGgoKSArIG1hcmdpbik7CisK
KyAgICByZXR1cm4gbmV3U2NhbGU7Cit9CisKK0ludFJlY3QgV2ViUGFnZVByaXZhdGU6OnJlY3RG
b3JOb2RlKE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gSW50
UmVjdCgpOworCisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7
CisKKyAgICBpZiAoIXJlbmRlcmVyKQorICAgICAgICByZXR1cm4gSW50UmVjdCgpOworCisgICAg
Ly8gUmV0dXJuIHJlY3QgaW4gdW4tdHJhbnNmb3JtZWQgY29udGVudCBjb29yZGluYXRlcy4KKyAg
ICBJbnRSZWN0IGJsb2NrUmVjdDsKKworICAgIC8vIEZJWE1FOiBFbnN1cmUgdGhpcyB3b3JrcyB3
aXRoIGlmcmFtZXMuCisgICAgaWYgKG1fd2ViUGFnZS0+c2V0dGluZ3MoKS0+dGV4dFJlZmxvd01v
ZGUoKSA9PSBXZWJTZXR0aW5nczo6VGV4dFJlZmxvd0VuYWJsZWQgJiYgcmVuZGVyZXItPmlzVGV4
dCgpKSB7CisgICAgICAgIFJlbmRlckJsb2NrKiByZW5kZXJCbG9jayA9IHJlbmRlcmVyLT5jb250
YWluaW5nQmxvY2soKTsKKyAgICAgICAgaW50IHhPZmZzZXQgPSAwOworICAgICAgICBpbnQgeU9m
ZnNldCA9IDA7CisgICAgICAgIHdoaWxlICghcmVuZGVyQmxvY2stPmlzUm9vdCgpKSB7CisgICAg
ICAgICAgICB4T2Zmc2V0ICs9IHJlbmRlckJsb2NrLT54KCk7CisgICAgICAgICAgICB5T2Zmc2V0
ICs9IHJlbmRlckJsb2NrLT55KCk7CisgICAgICAgICAgICByZW5kZXJCbG9jayA9IHJlbmRlckJs
b2NrLT5jb250YWluaW5nQmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBSZW5kZXJU
ZXh0KiByZW5kZXJUZXh0ID0gdG9SZW5kZXJUZXh0KHJlbmRlcmVyKTsKKyAgICAgICAgSW50UmVj
dCBsaW5lc0JveCA9IHJlbmRlclRleHQtPmxpbmVzQm91bmRpbmdCb3goKTsKKyAgICAgICAgYmxv
Y2tSZWN0ID0gSW50UmVjdCh4T2Zmc2V0ICsgbGluZXNCb3gueCgpLCB5T2Zmc2V0ICsgbGluZXNC
b3gueSgpLCBsaW5lc0JveC53aWR0aCgpLCBsaW5lc0JveC5oZWlnaHQoKSk7CisgICAgfSBlbHNl
CisgICAgICAgIGJsb2NrUmVjdCA9IHJlbmRlcmVyLT5hYnNvbHV0ZUNsaXBwZWRPdmVyZmxvd1Jl
Y3QoKTsKKworICAgIGlmIChyZW5kZXJlci0+aXNUZXh0KCkpIHsKKyAgICAgICAgUmVuZGVyQmxv
Y2sqIHJiID0gcmVuZGVyZXItPmNvbnRhaW5pbmdCbG9jaygpOworCisgICAgICAgIC8vIEluZWZm
aWNpZW50PyBXYXkgdG8gZmluZCB3aWR0aCB3aGVuIGZsb2F0cyBpbnRlcnNlY3QgYSBibG9jay4K
KyAgICAgICAgaW50IGJsb2NrV2lkdGggPSAwOworICAgICAgICBpbnQgbGluZUNvdW50ID0gcmIt
PmxpbmVDb3VudCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmVDb3VudDsgaSsr
KQorICAgICAgICAgICAgYmxvY2tXaWR0aCA9IG1heChibG9ja1dpZHRoLCByYi0+YXZhaWxhYmxl
TG9naWNhbFdpZHRoRm9yTGluZShpLCBmYWxzZSkpOworCisgICAgICAgIGJsb2NrUmVjdC5zZXRX
aWR0aChibG9ja1dpZHRoKTsKKyAgICAgICAgYmxvY2tSZWN0LnNldFgoYmxvY2tSZWN0LngoKSAr
IHJiLT5sb2dpY2FsTGVmdE9mZnNldEZvckxpbmUoMSwgZmFsc2UpKTsKKyAgICB9CisKKyAgICAv
LyBTdHJpcCBvZmYgcGFkZGluZy4KKyAgICBpZiAocmVuZGVyZXItPnN0eWxlKCktPmhhc1BhZGRp
bmcoKSkgeworICAgICAgICBibG9ja1JlY3Quc2V0WChibG9ja1JlY3QueCgpICsgcmVuZGVyZXIt
PnN0eWxlKCktPnBhZGRpbmdMZWZ0KCkudmFsdWUoKSk7CisgICAgICAgIGJsb2NrUmVjdC5zZXRZ
KGJsb2NrUmVjdC55KCkgKyByZW5kZXJlci0+c3R5bGUoKS0+cGFkZGluZ1RvcCgpLnZhbHVlKCkp
OworICAgICAgICBibG9ja1JlY3Quc2V0V2lkdGgoYmxvY2tSZWN0LndpZHRoKCkgLSByZW5kZXJl
ci0+c3R5bGUoKS0+cGFkZGluZ1JpZ2h0KCkudmFsdWUoKSk7CisgICAgICAgIGJsb2NrUmVjdC5z
ZXRIZWlnaHQoYmxvY2tSZWN0LmhlaWdodCgpIC0gcmVuZGVyZXItPnN0eWxlKCktPnBhZGRpbmdC
b3R0b20oKS52YWx1ZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmxvY2tSZWN0OworfQorCitJ
bnRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6ZnJhbWVPZmZzZXQoY29uc3QgRnJhbWUqIGZyYW1lKSBj
b25zdAoreworICAgIEFTU0VSVChmcmFtZSk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBmdW5jdGlv
biBjYW4gYmUgY2FsbGVkIHdoZW4gcGFnZSBpcyBiZWluZyBkZXN0cm95ZWQgYW5kIEpTIHRyaWdn
ZXJzIHNlbGVjdGlvbiBjaGFuZ2UuCisgICAgLy8gV2UgY291bGQgYnJlYWsgdGhlIGNhbGwgY2hh
aW4gYXQgdXBwZXIgbGV2ZWxzLCBidXQgSSB0aGluayBpdCBpcyBiZXR0ZXIgdG8gY2hlY2sgdGhl
IGZyYW1lIHBvaW50ZXIKKyAgICAvLyBoZXJlIGJlY2F1c2UgdGhlIHBvaW50ZXIgaXMgZXhwbGlj
aXRseSBjbGVhcmVkIGluIFdlYlBhZ2U6OmRlc3Ryb3koKS4KKyAgICBpZiAoIW1haW5GcmFtZSgp
KQorICAgICAgICByZXR1cm4gSW50UG9pbnQoKTsKKworICAgIC8vIENvbnZlcnQgMCwwIGluIHRo
ZSBmcmFtZSdzIGNvb3JkaW5hdGUgc3lzdGVtIHRvIHdpbmRvdyBjb29yZGluYXRlcyB0bworICAg
IC8vIGdldCB0aGUgZnJhbWUncyBnbG9iYWwgcG9zaXRpb24sIGFuZCByZXR1cm4gdGhpcyBwb3Np
dGlvbiBpbiB0aGUgbWFpbgorICAgIC8vIGZyYW1lJ3MgY29vcmRpbmF0ZXMuICAoU28gdGhlIG1h
aW4gZnJhbWUncyBjb29yZGluYXRlcyB3aWxsIGJlIDAsMC4pCisgICAgcmV0dXJuIG1haW5GcmFt
ZSgpLT52aWV3KCktPndpbmRvd1RvQ29udGVudHMoZnJhbWUtPnZpZXcoKS0+Y29udGVudHNUb1dp
bmRvdyhJbnRQb2ludDo6emVybygpKSk7Cit9CisKK0ludFJlY3QgV2ViUGFnZVByaXZhdGU6OmFk
anVzdFJlY3RPZmZzZXRGb3JGcmFtZU9mZnNldChjb25zdCBJbnRSZWN0JiByZWN0LCBjb25zdCBO
b2RlKiBub2RlKQoreworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIHJlY3Q7CisKKyAg
ICAvLyBBZGp1c3QgdGhlIG9mZnNldCBvZiB0aGUgcmVjdCBpZiBpdCBpcyBpbiBhbiBpRnJhbWUv
ZnJhbWUgb3Igc2V0IG9mIGlGcmFtZXMvZnJhbWVzLgorICAgIC8vIEZJWE1FOiBjYW4gd2UganVz
dCB1c2UgZnJhbWVPZmZzZXQgaW5zdGVhZCBvZiB0aGlzIGJpZyByb3V0aW5lPworICAgIGNvbnN0
IE5vZGUqIHRub2RlID0gbm9kZTsKKyAgICBJbnRSZWN0IGFkanVzdGVkUmVjdCA9IHJlY3Q7Cisg
ICAgZG8geworICAgICAgICBGcmFtZSogZnJhbWUgPSB0bm9kZS0+ZG9jdW1lbnQoKS0+ZnJhbWUo
KTsKKyAgICAgICAgaWYgKGZyYW1lKSB7CisgICAgICAgICAgICBOb2RlKiBvd25lck5vZGUgPSBz
dGF0aWNfY2FzdDxOb2RlKj4oZnJhbWUtPm93bmVyRWxlbWVudCgpKTsKKyAgICAgICAgICAgIHRu
b2RlID0gb3duZXJOb2RlOworICAgICAgICAgICAgaWYgKG93bmVyTm9kZSAmJiAob3duZXJOb2Rl
LT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aWZyYW1lVGFnKSB8fCBvd25lck5vZGUtPmhhc1RhZ05h
bWUoSFRNTE5hbWVzOjpmcmFtZVRhZykpKSB7CisgICAgICAgICAgICAgICAgSW50UmVjdCBpRnJh
bWVSZWN0OworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgaUZyYW1l
UmVjdCA9IHJlY3RGb3JOb2RlKG93bmVyTm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGFkanVz
dGVkUmVjdC5tb3ZlKGlGcmFtZVJlY3QueCgpLCBpRnJhbWVSZWN0LnkoKSk7CisgICAgICAgICAg
ICAgICAgICAgIGFkanVzdGVkUmVjdC5pbnRlcnNlY3QoaUZyYW1lUmVjdCk7CisgICAgICAgICAg
ICAgICAgICAgIG93bmVyTm9kZSA9IG93bmVyTm9kZS0+cGFyZW50Tm9kZSgpOworICAgICAgICAg
ICAgICAgIH0gd2hpbGUgKGlGcmFtZVJlY3QuaXNFbXB0eSgpICYmIG93bmVyTm9kZSk7CisgICAg
ICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0g
d2hpbGUgKHRub2RlID0gdG5vZGUtPnBhcmVudE5vZGUoKSk7CisKKyAgICByZXR1cm4gYWRqdXN0
ZWRSZWN0OworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2YXRlOjpibG9ja1pvb21SZWN0Rm9yTm9k
ZShOb2RlKiBub2RlKQoreworICAgIGlmICghbm9kZSB8fCBjb250ZW50c1NpemUoKS5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CisKKyAgICBOb2RlKiB0bm9kZSA9IG5vZGU7
CisgICAgbV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlID0gdG5vZGU7CisKKyAgICBJbnRS
ZWN0IGJsb2NrUmVjdCA9IHJlY3RGb3JOb2RlKHRub2RlKTsKKyAgICBJbnRSZWN0IG9yaWdpbmFs
UmVjdCA9IGJsb2NrUmVjdDsKKworICAgIGludCBvcmlnaW5hbEFyZWEgPSBvcmlnaW5hbFJlY3Qu
d2lkdGgoKSAqIG9yaWdpbmFsUmVjdC5oZWlnaHQoKTsKKyAgICBpbnQgcGFnZUFyZWEgPSBjb250
ZW50c1NpemUoKS53aWR0aCgpICogY29udGVudHNTaXplKCkuaGVpZ2h0KCk7CisgICAgZG91Ymxl
IGJsb2NrVG9QYWdlUmF0aW8gPSBzdGF0aWNfY2FzdDxkb3VibGU+KDEgLSBvcmlnaW5hbEFyZWEg
LyBwYWdlQXJlYSk7CisgICAgZG91YmxlIGJsb2NrRXhwYW5zaW9uUmF0aW8gPSA1LjAgKiBibG9j
a1RvUGFnZVJhdGlvICogYmxvY2tUb1BhZ2VSYXRpbzsKKworICAgIGlmICghdG5vZGUtPmhhc1Rh
Z05hbWUoSFRNTE5hbWVzOjppbWdUYWcpICYmICF0bm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6
OmlucHV0VGFnKSAmJiAhdG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjp0ZXh0YXJlYVRhZykp
CisgICAgICAgIHdoaWxlICh0bm9kZSA9IHRub2RlLT5wYXJlbnROb2RlKCkpIHsKKyAgICAgICAg
ICAgIEFTU0VSVCh0bm9kZSk7CisgICAgICAgICAgICBJbnRSZWN0IHRSZWN0ID0gcmVjdEZvck5v
ZGUodG5vZGUpOworICAgICAgICAgICAgaW50IHRlbXBCbG9ja0FyZWEgPSB0UmVjdC53aWR0aCgp
ICogdFJlY3QuaGVpZ2h0KCk7CisgICAgICAgICAgICAvLyBEb24ndCBleHBhbmQgdGhlIGJsb2Nr
IGlmIGl0IHdpbGwgYmUgdG9vIGxhcmdlIHJlbGF0aXZlIHRvIHRoZSBjb250ZW50LgorICAgICAg
ICAgICAgaWYgKHN0YXRpY19jYXN0PGRvdWJsZT4oMSAtIHRlbXBCbG9ja0FyZWEgLyBwYWdlQXJl
YSkgPCBtaW5pbXVtRXhwYW5kaW5nUmF0aW8pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICBpZiAodFJlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAv
LyBObyByZW5kZXJlci4KKyAgICAgICAgICAgIGlmICh0ZW1wQmxvY2tBcmVhIDwgMS4xICogb3Jp
Z2luYWxBcmVhKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBUaGUgc2l6ZSBvZiB0aGlz
IHBhcmVudCBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBjaGlsZCwgbm8gbmVlZCB0byBnbyB0byB0aGlz
IHBhcmVudC4KKyAgICAgICAgICAgIC8vIERvbid0IGV4cGFuZCB0aGUgYmxvY2sgaWYgdGhlIHBh
cmVudCBub2RlIHNpemUgaXMgYWxyZWFkeSBhbG1vc3QgdGhlIHNpemUgb2YgYWN0dWFsIHZpc2li
bGUgc2l6ZS4KKyAgICAgICAgICAgIEludFNpemUgYWN0dWFsU2l6ZSA9IGFjdHVhbFZpc2libGVT
aXplKCk7CisgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8ZG91YmxlPigxIC0gdFJlY3Qud2lk
dGgoKSAvIGFjdHVhbFNpemUud2lkdGgoKSkgPCBtaW5pbXVtRXhwYW5kaW5nUmF0aW8pCisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAodGVtcEJsb2NrQXJlYSA8IGJsb2Nr
RXhwYW5zaW9uUmF0aW8gKiBvcmlnaW5hbEFyZWEpIHsKKyAgICAgICAgICAgICAgICBibG9ja1Jl
Y3QgPSB0UmVjdDsKKyAgICAgICAgICAgICAgICBtX2N1cnJlbnRCbG9ja1pvb21BZGp1c3RlZE5v
ZGUgPSB0bm9kZTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisKKyAgICBibG9ja1JlY3QgPSBhZGp1c3RSZWN0T2Zmc2V0Rm9yRnJhbWVPZmZz
ZXQoYmxvY2tSZWN0LCBub2RlKTsKKyAgICBibG9ja1JlY3QgPSBtYXBUb1RyYW5zZm9ybWVkKGJs
b2NrUmVjdCk7CisgICAgY2xpcFRvVHJhbnNmb3JtZWRDb250ZW50c1JlY3QoYmxvY2tSZWN0KTsK
KworI2lmIERFQlVHX0JMT0NLX1pPT00KKyAgICAvLyBSZS1wYWludCB0aGUgYmFja2luZ3N0b3Jl
IHRvIHNjcmVlbiB0byBlcmFzZSBvdGhlciBhbm5vdGF0aW9ucy4KKyAgICBtX2JhY2tpbmdTdG9y
ZS0+ZC0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6OkJs
aXQpOworCisgICAgLy8gUmVuZGVyIGEgYmxhY2sgc3F1YXJlIG92ZXIgdGhlIGNhbGN1bGF0ZWQg
YmxvY2sgYW5kIGEgZ3JheSBzcXVhcmUgb3ZlciB0aGUgb3JpZ2luYWwgYmxvY2sgZm9yIHZpc3Vh
bCBpbnNwZWN0aW9uLgorICAgIG9yaWdpbmFsUmVjdCA9IG1hcFRvVHJhbnNmb3JtZWQob3JpZ2lu
YWxSZWN0KTsKKyAgICBjbGlwVG9UcmFuc2Zvcm1lZENvbnRlbnRzUmVjdChvcmlnaW5hbFJlY3Qp
OworICAgIEludFJlY3QgcmVuZGVyUmVjdCA9IG1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9U
cmFuc2Zvcm1lZFZpZXdwb3J0KGJsb2NrUmVjdCk7CisgICAgSW50UmVjdCBvcmlnaW5hbFJlbmRl
clJlY3QgPSBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVHJhbnNmb3JtZWRWaWV3cG9ydChv
cmlnaW5hbFJlY3QpOworICAgIEludFNpemUgdmlld3BvcnRTaXplID0gdHJhbnNmb3JtZWRWaWV3
cG9ydFNpemUoKTsKKyAgICByZW5kZXJSZWN0LmludGVyc2VjdChJbnRSZWN0KDAsIDAsIHZpZXdw
b3J0U2l6ZS53aWR0aCgpLCB2aWV3cG9ydFNpemUuaGVpZ2h0KCkpKTsKKyAgICBvcmlnaW5hbFJl
bmRlclJlY3QuaW50ZXJzZWN0KEludFJlY3QoMCwgMCwgdmlld3BvcnRTaXplLndpZHRoKCksIHZp
ZXdwb3J0U2l6ZS5oZWlnaHQoKSkpOworICAgIG1fYmFja2luZ1N0b3JlLT5kLT5jbGVhcldpbmRv
dyhyZW5kZXJSZWN0LCAwLCAwLCAwKTsKKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+Y2xlYXJXaW5k
b3cob3JpZ2luYWxSZW5kZXJSZWN0LCAxMjAsIDEyMCwgMTIwKTsKKyAgICBtX2JhY2tpbmdTdG9y
ZS0+ZC0+aW52YWxpZGF0ZVdpbmRvdyhyZW5kZXJSZWN0KTsKKyNlbmRpZgorCisgICAgcmV0dXJu
IGJsb2NrUmVjdDsKK30KKwordm9pZCBXZWJQYWdlOjpibG9ja1pvb21BbmltYXRpb25GaW5pc2hl
ZCgpCit7CisgICAgZC0+em9vbUJsb2NrKCk7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gc2hvdWxk
IG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuCisvLyBJdCBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGFuaW1h
dGlvbiBlbmRzIChzZWUgYWJvdmUpLgordm9pZCBXZWJQYWdlUHJpdmF0ZTo6em9vbUJsb2NrKCkK
K3sKKyAgICBpZiAoIW1fbWFpbkZyYW1lKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRQb2lu
dCBhbmNob3Iocm91bmRVbnRyYW5zZm9ybWVkUG9pbnQobWFwRnJvbVRyYW5zZm9ybWVkRmxvYXRQ
b2ludChtX2ZpbmFsQmxvY2tQb2ludCkpKTsKKyAgICBib29sIHdpbGxVc2VUZXh0UmVmbG93ID0g
ZmFsc2U7CisKKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9XKQorICAgIHdpbGxVc2VUZXh0UmVm
bG93ID0gbV93ZWJQYWdlLT5zZXR0aW5ncygpLT50ZXh0UmVmbG93TW9kZSgpICE9IFdlYlNldHRp
bmdzOjpUZXh0UmVmbG93RGlzYWJsZWQ7CisgICAgdG9nZ2xlVGV4dFJlZmxvd0lmRW5hYmxlZEZv
ckJsb2NrWm9vbU9ubHkobV9zaG91bGRSZWZsb3dCbG9jayk7CisgICAgc2V0TmVlZHNMYXlvdXQo
KTsKKyNlbmRpZgorCisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggem9vbTsKKyAgICB6b29tLnNj
YWxlKG1fYmxvY2tab29tRmluYWxTY2FsZSk7CisgICAgKm1fdHJhbnNmb3JtYXRpb25NYXRyaXgg
PSB6b29tOworICAgIG1fY2xpZW50LT5yZXNldEJpdG1hcFpvb21TY2FsZShtX2Jsb2NrWm9vbUZp
bmFsU2NhbGUpOworICAgIG1fYmFja2luZ1N0b3JlLT5kLT5zdXNwZW5kU2NyZWVuQW5kQmFja2lu
Z1N0b3JlVXBkYXRlcygpOworICAgIHVwZGF0ZVZpZXdwb3J0U2l6ZSgpOworCisjaWYgRU5BQkxF
KFZJRVdQT1JUX1JFRkxPVykKKyAgICByZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKTsKKyAgICBpZiAo
d2lsbFVzZVRleHRSZWZsb3cgJiYgbV9zaG91bGRSZWZsb3dCbG9jaykgeworICAgICAgICBJbnRS
ZWN0IHJlZmxvd2VkUmVjdCA9IHJlY3RGb3JOb2RlKG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVk
Tm9kZS5nZXQoKSk7CisgICAgICAgIHJlZmxvd2VkUmVjdCA9IGFkanVzdFJlY3RPZmZzZXRGb3JG
cmFtZU9mZnNldChyZWZsb3dlZFJlY3QsIG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZS5n
ZXQoKSk7CisgICAgICAgIHJlZmxvd2VkUmVjdC5tb3ZlKHJvdW5kVHJhbnNmb3JtZWRQb2ludCht
X2ZpbmFsQmxvY2tQb2ludFJlZmxvd09mZnNldCkueCgpLCByb3VuZFRyYW5zZm9ybWVkUG9pbnQo
bV9maW5hbEJsb2NrUG9pbnRSZWZsb3dPZmZzZXQpLnkoKSk7CisgICAgICAgIFJlbmRlck9iamVj
dCogcmVuZGVyZXIgPSBtX2N1cnJlbnRCbG9ja1pvb21BZGp1c3RlZE5vZGUtPnJlbmRlcmVyKCk7
CisgICAgICAgIEludFBvaW50IHRvcExlZnRQb2ludChyZWZsb3dlZFJlY3QubG9jYXRpb24oKSk7
CisgICAgICAgIGlmIChyZW5kZXJlciAmJiByZW5kZXJlci0+aXNUZXh0KCkpIHsKKyAgICAgICAg
ICAgIEVUZXh0QWxpZ24gdGV4dEFsaWduID0gcmVuZGVyZXItPnN0eWxlKCktPnRleHRBbGlnbigp
OworICAgICAgICAgICAgSW50UG9pbnQgdGV4dEFuY2hvcjsKKyAgICAgICAgICAgIHN3aXRjaCAo
dGV4dEFsaWduKSB7CisgICAgICAgICAgICBjYXNlIENFTlRFUjoKKyAgICAgICAgICAgIGNhc2Ug
V0VCS0lUX0NFTlRFUjoKKyAgICAgICAgICAgICAgICB0ZXh0QW5jaG9yID0gSW50UG9pbnQocmVm
bG93ZWRSZWN0LngoKSArIChyZWZsb3dlZFJlY3Qud2lkdGgoKSAtIGFjdHVhbFZpc2libGVTaXpl
KCkud2lkdGgoKSkgLyAyLCB0b3BMZWZ0UG9pbnQueSgpKTsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIGNhc2UgTEVGVDoKKyAgICAgICAgICAgIGNhc2UgV0VCS0lUX0xFRlQ6
CisgICAgICAgICAgICAgICAgdGV4dEFuY2hvciA9IHRvcExlZnRQb2ludDsKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUklHSFQ6CisgICAgICAgICAgICBjYXNlIFdF
QktJVF9SSUdIVDoKKyAgICAgICAgICAgICAgICB0ZXh0QW5jaG9yID0gSW50UG9pbnQocmVmbG93
ZWRSZWN0LngoKSArIHJlZmxvd2VkUmVjdC53aWR0aCgpIC0gYWN0dWFsVmlzaWJsZVNpemUoKS53
aWR0aCgpLCB0b3BMZWZ0UG9pbnQueSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIGNhc2UgVEFBVVRPOgorICAgICAgICAgICAgY2FzZSBKVVNUSUZZOgorICAgICAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXItPnN0eWxlKCktPmlzTGVm
dFRvUmlnaHREaXJlY3Rpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgdGV4dEFuY2hvciA9IHRv
cExlZnRQb2ludDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRl
eHRBbmNob3IgPSBJbnRQb2ludChyZWZsb3dlZFJlY3QueCgpICsgcmVmbG93ZWRSZWN0LndpZHRo
KCkgLSBhY3R1YWxWaXNpYmxlU2l6ZSgpLndpZHRoKCksIHRvcExlZnRQb2ludC55KCkpOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0U2Nyb2xs
UG9zaXRpb24odGV4dEFuY2hvcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZW5k
ZXJlci0+c3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpCisgICAgICAgICAgICAgICAg
PyBzZXRTY3JvbGxQb3NpdGlvbih0b3BMZWZ0UG9pbnQpCisgICAgICAgICAgICAgICAgOiBzZXRT
Y3JvbGxQb3NpdGlvbihJbnRQb2ludChyZWZsb3dlZFJlY3QueCgpICsgcmVmbG93ZWRSZWN0Lndp
ZHRoKCkgLSBhY3R1YWxWaXNpYmxlU2l6ZSgpLndpZHRoKCksIHRvcExlZnRQb2ludC55KCkpKTsK
KyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAod2lsbFVzZVRleHRSZWZsb3cpIHsKKyAgICAgICAg
SW50UmVjdCBmaW5hbFJlY3QgPSByZWN0Rm9yTm9kZShtX2N1cnJlbnRCbG9ja1pvb21BZGp1c3Rl
ZE5vZGUuZ2V0KCkpOworICAgICAgICBmaW5hbFJlY3QgPSBhZGp1c3RSZWN0T2Zmc2V0Rm9yRnJh
bWVPZmZzZXQoZmluYWxSZWN0LCBtX2N1cnJlbnRCbG9ja1pvb21BZGp1c3RlZE5vZGUuZ2V0KCkp
OworICAgICAgICBzZXRTY3JvbGxQb3NpdGlvbihJbnRQb2ludCgwLCBmaW5hbFJlY3QueSgpICsg
bV9maW5hbEJsb2NrUG9pbnRSZWZsb3dPZmZzZXQueSgpKSk7CisgICAgICAgIHJlc2V0QmxvY2ta
b29tKCk7CisgICAgfQorI2VuZGlmCisgICAgaWYgKCF3aWxsVXNlVGV4dFJlZmxvdykgeworICAg
ICAgICBzZXRTY3JvbGxQb3NpdGlvbihhbmNob3IpOworICAgICAgICBpZiAoIW1fc2hvdWxkUmVm
bG93QmxvY2spCisgICAgICAgICAgICByZXNldEJsb2NrWm9vbSgpOworICAgIH0KKworICAgIG5v
dGlmeVRyYW5zZm9ybUNoYW5nZWQoKTsKKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+Y2xlYXJXaW5k
b3coKTsKKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3Jl
VXBkYXRlcyhCYWNraW5nU3RvcmU6OlJlbmRlckFuZEJsaXQpOworICAgIG1fY2xpZW50LT56b29t
Q2hhbmdlZChtX3dlYlBhZ2UtPmlzTWluWm9vbWVkKCksIG1fd2ViUGFnZS0+aXNNYXhab29tZWQo
KSwgIXNob3VsZFpvb21PbkVzY2FwZSgpLCBjdXJyZW50U2NhbGUoKSk7Cit9CisKKwordm9pZCBX
ZWJQYWdlUHJpdmF0ZTo6cmVzZXRCbG9ja1pvb20oKQoreworICAgIG1fY3VycmVudEJsb2NrWm9v
bU5vZGUgPSAwOworICAgIG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZSA9IDA7CisgICAg
bV9zaG91bGRSZWZsb3dCbG9jayA9IGZhbHNlOworfQorCitXZWJQYWdlOjpXZWJQYWdlKFdlYlBh
Z2VDbGllbnQqIGNsaWVudCwgY29uc3QgV2ViU3RyaW5nJiBwYWdlR3JvdXBOYW1lLCBjb25zdCBQ
bGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkKK3sKKyAgICBnbG9iYWxJbml0aWFsaXplKCk7CisgICAg
ZCA9IG5ldyBXZWJQYWdlUHJpdmF0ZSh0aGlzLCBjbGllbnQsIHJlY3QpOworICAgIGQtPmluaXQo
cGFnZUdyb3VwTmFtZSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6ZGVzdHJveVdlYlBhZ2VDb21wb3Np
dG9yKCkKK3sKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgLy8gRGVzdHJv
eSB0aGUgbGF5ZXIgcmVuZGVyZXIgaW4gYSBzeW5jIGNvbW1hbmQgYmVmb3JlIHdlIGRlc3Ryb3kg
dGhlIGJhY2tpbmcgc3RvcmUsCisgICAgLy8gdG8gZmx1c2ggYW55IHBlbmRpbmcgY29tcG9zaXRp
bmcgbWVzc2FnZXMgb24gdGhlIGNvbXBvc2l0aW5nIHRocmVhZC4KKyAgICAvLyBUaGUgYmFja2lu
ZyBzdG9yZSBpcyBpbmRpcmVjdGx5IGRlbGV0ZWQgYnkgdGhlICdkZXRhY2hGcm9tUGFyZW50JyBj
YWxsIGJlbG93LgorICAgIGQtPnN5bmNEZXN0cm95Q29tcG9zaXRvck9uQ29tcG9zaXRpbmdUaHJl
YWQoKTsKKyNlbmRpZgorfQorCit2b2lkIFdlYlBhZ2U6OmRlc3Ryb3koKQoreworICAgIC8vIFRP
RE86IG5lZWQgdG8gdmVyaWZ5IGlmIHRoaXMgY2FsbCBuZWVkcyB0byBiZSBtYWRlIGJlZm9yZSBj
YWxsaW5nCisgICAgLy8gV2ViUGFnZTo6ZGVzdHJveVdlYlBhZ2VDb21wb3NpdG9yKCkKKyAgICBk
LT5tX2JhY2tpbmdTdG9yZS0+ZC0+c3VzcGVuZFNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMo
KTsKKworICAgIC8vIENsb3NlIHRoZSBiYWNrZm9yd2FyZCBsaXN0IGFuZCByZWxlYXNlIHRoZSBj
YWNoZWQgcGFnZXMuCisgICAgZC0+bV9wYWdlLT5iYWNrRm9yd2FyZCgpLT5jbG9zZSgpOworICAg
IHBhZ2VDYWNoZSgpLT5yZWxlYXNlQXV0b3JlbGVhc2VkUGFnZXNOb3coKTsKKworICAgIEZyYW1l
TG9hZGVyKiBsb2FkZXIgPSBkLT5tX21haW5GcmFtZS0+bG9hZGVyKCk7CisKKyAgICAvLyBSZW1v
dmUgbWFpbiBmcmFtZSdzIGJhY2tpbmcgc3RvcmUgY2xpZW50IGZyb20gdGhlIG1hcAorICAgIC8v
IHRvIHByZXZlbnQgRnJhbWVMb2FkZXJDbGllbnRCbGFja3lCZXJyeTo6ZGV0YWNoRnJvbVBhcmVu
dDIoKSwKKyAgICAvLyB3aGljaCBpcyBjYWxsZWQgYnkgbG9hZGVyLT5kZXRhY2hGcm9tUGFyZW50
KCksIGRlbGV0aW5nIGl0LgorICAgIC8vIFdlIHdpbGwgZGVsZXRlIGl0IGluIH5XZWJQYWdlUHJp
dmF0ZSgpLgorICAgIC8vIFJlYXNvbjogbG9hZGVyLT5kZXRhY2hGcm9tUGFyZW50KCkgbWF5IHBp
bmcgYmFjayB0byBiYWNraW5nIHN0b3JlCisgICAgLy8gaW5kaXJlY3RseSB0aHJvdWdoIENocm9t
ZUNsaWVudEJsYWNrQmVycnk6OmludmFsaWRhdGVDb250ZW50c0FuZFdpbmRvdygpLgorICAgIC8v
IHNlZSBSSU0gUFIgIzkzMjU2LgorICAgIGQtPnJlbW92ZUJhY2tpbmdTdG9yZUNsaWVudEZvckZy
YW1lKGQtPm1fbWFpbkZyYW1lKTsKKworICAgIC8vIFNldCBtX21haW5GcmFtZSB0byAwIHRvIGF2
b2lkIGNhbGxzIGJhY2sgaW4gdG8gdGhlIGJhY2tpbmdzdG9yZSBkdXJpbmcgd2VicGFnZSBkZWxl
dGlvbi4KKyAgICBkLT5tX21haW5GcmFtZSA9IDA7CisgICAgaWYgKGxvYWRlcikKKyAgICAgICAg
bG9hZGVyLT5kZXRhY2hGcm9tUGFyZW50KCk7CisKKyAgICBkZWxldGUgdGhpczsKK30KKworV2Vi
UGFnZTo6fldlYlBhZ2UoKQoreworICAgIGRlbGV0ZSBkOworICAgIGQgPSAwOworfQorCitXZWJQ
YWdlQ2xpZW50KiBXZWJQYWdlOjpjbGllbnQoKSBjb25zdAoreworICAgIHJldHVybiBkLT5tX2Ns
aWVudDsKK30KKwordm9pZCBXZWJQYWdlOjpsb2FkKGNvbnN0IGNoYXIqIHVybCwgY29uc3QgY2hh
ciogbmV0d29ya1Rva2VuLCBib29sIGlzSW5pdGlhbCkKK3sKKyAgICBkLT5sb2FkKHVybCwgbmV0
d29ya1Rva2VuLCAiR0VUIiwgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpVc2VQcm90b2NvbENh
Y2hlUG9saWN5LCAwLCAwLCAwLCAwLCBpc0luaXRpYWwsIGZhbHNlKTsKK30KKwordm9pZCBXZWJQ
YWdlOjpsb2FkRXh0ZW5kZWQoY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFyKiBuZXR3b3JrVG9r
ZW4sIGNvbnN0IGNoYXIqIG1ldGhvZCwgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpDYWNoZVBv
bGljeSBjYWNoZVBvbGljeSwgY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGRhdGFMZW5ndGgsIGNv
bnN0IGNoYXIqIGNvbnN0KiBoZWFkZXJzLCBzaXplX3QgaGVhZGVyc0xlbmd0aCwgYm9vbCBtdXN0
SGFuZGxlSW50ZXJuYWxseSkKK3sKKyAgICBkLT5sb2FkKHVybCwgbmV0d29ya1Rva2VuLCBtZXRo
b2QsIGNhY2hlUG9saWN5LCBkYXRhLCBkYXRhTGVuZ3RoLCBoZWFkZXJzLCBoZWFkZXJzTGVuZ3Ro
LCBmYWxzZSwgbXVzdEhhbmRsZUludGVybmFsbHksIGZhbHNlLCAiIik7Cit9CisKK3ZvaWQgV2Vi
UGFnZTo6bG9hZEZpbGUoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogb3ZlcnJpZGVDb250
ZW50VHlwZSkKK3sKKyAgICBzdGQ6OnN0cmluZyBmaWxlVXJsKHBhdGgpOworICAgIGlmICghZmls
ZVVybC5maW5kKCIvIikpCisgICAgICAgIGZpbGVVcmwuaW5zZXJ0KDAsICJmaWxlOi8vIik7Cisg
ICAgZWxzZSBpZiAoZmlsZVVybC5maW5kKCJmaWxlOi8vLyIpKQorICAgICAgICByZXR1cm47CisK
KyAgICBkLT5sb2FkKGZpbGVVcmwuY19zdHIoKSwgMCwgIkdFVCIsIFBsYXRmb3JtOjpOZXR3b3Jr
UmVxdWVzdDo6VXNlUHJvdG9jb2xDYWNoZVBvbGljeSwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNl
LCBmYWxzZSwgb3ZlcnJpZGVDb250ZW50VHlwZSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bG9hZFN0
cmluZyhjb25zdCBjaGFyKiBzdHJpbmcsIGNvbnN0IGNoYXIqIGJhc2VVUkwsIGNvbnN0IGNoYXIq
IG1pbWVUeXBlLCBjb25zdCBjaGFyKiBmYWlsaW5nVVJMKQoreworICAgIGQtPmxvYWRTdHJpbmco
c3RyaW5nLCBiYXNlVVJMLCBtaW1lVHlwZSwgZmFpbGluZ1VSTCk7Cit9CisKK3ZvaWQgV2ViUGFn
ZTo6ZG93bmxvYWQoY29uc3QgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0JiByZXF1ZXN0KQorewor
ICAgIGQtPmxvYWQocmVxdWVzdC5nZXRVcmxSZWYoKS5jX3N0cigpLCAwLCAiR0VUIiwgUGxhdGZv
cm06Ok5ldHdvcmtSZXF1ZXN0OjpVc2VQcm90b2NvbENhY2hlUG9saWN5LCAwLCAwLCAwLCAwLCBm
YWxzZSwgZmFsc2UsIHRydWUsICIiKTsKK30KKworYm9vbCBXZWJQYWdlOjpleGVjdXRlSmF2YVNj
cmlwdChjb25zdCBjaGFyKiBzY3JpcHQsIEphdmFTY3JpcHREYXRhVHlwZSYgcmV0dXJuVHlwZSwg
V2ViU3RyaW5nJiByZXR1cm5WYWx1ZSkKK3sKKyAgICByZXR1cm4gZC0+ZXhlY3V0ZUphdmFTY3Jp
cHQoc2NyaXB0LCByZXR1cm5UeXBlLCByZXR1cm5WYWx1ZSk7Cit9CisKK2Jvb2wgV2ViUGFnZTo6
ZXhlY3V0ZUphdmFTY3JpcHRJbklzb2xhdGVkV29ybGQoY29uc3Qgc3RkOjp3c3RyaW5nJiBzY3Jp
cHQsIEphdmFTY3JpcHREYXRhVHlwZSYgcmV0dXJuVHlwZSwgV2ViU3RyaW5nJiByZXR1cm5WYWx1
ZSkKK3sKKyAgICAvLyBPbiBvdXIgcGxhdGZvcm0gd2NoYXJfdCBpcyB1bnNpZ25lZCBpbnQgYW5k
IFVDaGFyIGlzIHVuc2lnbmVkIHNob3J0CisgICAgLy8gc28gd2UgaGF2ZSB0byBjb252ZXJ0IHVz
aW5nIElDVSBjb252ZXJzaW9uIGZ1bmN0aW9uCisgICAgaW50IGxlbmd0aENvcGllZCA9IDA7Cisg
ICAgVUVycm9yQ29kZSBlcnJvciA9IFVfWkVST19FUlJPUjsKKyAgICBjb25zdCBpbnQgbGVuZ3Ro
ID0gc2NyaXB0Lmxlbmd0aCgpICsgMSAvKm51bGwgdGVybWluYXRpb24gY2hhciovOworICAgIFVD
aGFyIGRhdGFbbGVuZ3RoXTsKKworICAgIC8vIEZJWE1FOiBQUiAxMzgxNjIgaXMgZ2l2aW5nIFVf
SU5WQUxJRF9DSEFSX0ZPVU5EIGVycm9yLgorICAgIHVfc3RyRnJvbVVURjMyKGRhdGEsIGxlbmd0
aCwgJmxlbmd0aENvcGllZCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVQ2hhcjMyKj4oc2NyaXB0
LmNfc3RyKCkpLCBzY3JpcHQubGVuZ3RoKCksICZlcnJvcik7CisgICAgQkxBQ0tCRVJSWV9BU1NF
UlQoZXJyb3IgPT0gVV9aRVJPX0VSUk9SKTsKKyAgICBpZiAoZXJyb3IgIT0gVV9aRVJPX0VSUk9S
KSB7CisgICAgICAgIFBsYXRmb3JtOjpsb2dBbHdheXMoUGxhdGZvcm06OkxvZ0xldmVsQ3JpdGlj
YWwsICJXZWJQYWdlOjpleGVjdXRlSmF2YVNjcmlwdEluSXNvbGF0ZWRXb3JsZCBmYWlsZWQgdG8g
Y29udmVydCBVVEYxNiB0byBKYXZhU2NyaXB0ISIpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorICAgIFN0cmluZyBzdHIgPSBTdHJpbmcoZGF0YSwgbGVuZ3RoQ29waWVkKTsKKyAgICBT
Y3JpcHRTb3VyY2VDb2RlIHNvdXJjZUNvZGUoc3RyLCBLVVJMKCkpOworICAgIHJldHVybiBkLT5l
eGVjdXRlSmF2YVNjcmlwdEluSXNvbGF0ZWRXb3JsZChzb3VyY2VDb2RlLCByZXR1cm5UeXBlLCBy
ZXR1cm5WYWx1ZSk7Cit9CisKK2Jvb2wgV2ViUGFnZTo6ZXhlY3V0ZUphdmFTY3JpcHRJbklzb2xh
dGVkV29ybGQoY29uc3QgY2hhciogc2NyaXB0LCBKYXZhU2NyaXB0RGF0YVR5cGUmIHJldHVyblR5
cGUsIFdlYlN0cmluZyYgcmV0dXJuVmFsdWUpCit7CisgICAgU2NyaXB0U291cmNlQ29kZSBzb3Vy
Y2VDb2RlKFN0cmluZzo6ZnJvbVVURjgoc2NyaXB0KSwgS1VSTCgpKTsKKyAgICByZXR1cm4gZC0+
ZXhlY3V0ZUphdmFTY3JpcHRJbklzb2xhdGVkV29ybGQoc291cmNlQ29kZSwgcmV0dXJuVHlwZSwg
cmV0dXJuVmFsdWUpOworfQorCit2b2lkIFdlYlBhZ2U6OnN0b3BMb2FkaW5nKCkKK3sKKyAgICBk
LT5zdG9wQ3VycmVudExvYWQoKTsKK30KKwordm9pZCBXZWJQYWdlOjpwcmVwYXJlVG9EZXN0cm95
KCkKK3sKKyAgICBkLT5wcmVwYXJlVG9EZXN0cm95KCk7Cit9CisKK2ludCBXZWJQYWdlOjpiYWNr
Rm9yd2FyZExpc3RMZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiBkLT5tX3BhZ2UtPmdldEhp
c3RvcnlMZW5ndGgoKTsKK30KKworYm9vbCBXZWJQYWdlOjpjYW5Hb0JhY2tPckZvcndhcmQoaW50
IGRlbHRhKSBjb25zdAoreworICAgIHJldHVybiBkLT5tX3BhZ2UtPmNhbkdvQmFja09yRm9yd2Fy
ZChkZWx0YSk7Cit9CisKK2Jvb2wgV2ViUGFnZTo6Z29CYWNrT3JGb3J3YXJkKGludCBkZWx0YSkK
K3sKKyAgICBpZiAoZC0+bV9wYWdlLT5jYW5Hb0JhY2tPckZvcndhcmQoZGVsdGEpKSB7CisgICAg
ICAgIGQtPm1fcGFnZS0+Z29CYWNrT3JGb3J3YXJkKGRlbHRhKTsKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBXZWJQYWdlOjpnb1RvQmFj
a0ZvcndhcmRFbnRyeShCYWNrRm9yd2FyZElkIGlkKQoreworICAgIEhpc3RvcnlJdGVtKiBpdGVt
ID0gaGlzdG9yeUl0ZW1Gcm9tQmFja0ZvcndhcmRJZChpZCk7CisgICAgQVNTRVJUKGl0ZW0pOwor
ICAgIGQtPm1fcGFnZS0+Z29Ub0l0ZW0oaXRlbSwgRnJhbWVMb2FkVHlwZUluZGV4ZWRCYWNrRm9y
d2FyZCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6cmVsb2FkKCkKK3sKKyAgICBkLT5tX21haW5GcmFt
ZS0+bG9hZGVyKCktPnJlbG9hZCgvKiBieXBhc3NDYWNoZSAqLyB0cnVlKTsKK30KKwordm9pZCBX
ZWJQYWdlOjpyZWxvYWRGcm9tQ2FjaGUoKQoreworICAgIGQtPm1fbWFpbkZyYW1lLT5sb2FkZXIo
KS0+cmVsb2FkKC8qIGJ5cGFzc0NhY2hlICovIGZhbHNlKTsKK30KKworV2ViU2V0dGluZ3MqIFdl
YlBhZ2U6OnNldHRpbmdzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+bV93ZWJTZXR0aW5nczsK
K30KKworYm9vbCBXZWJQYWdlOjppc1Zpc2libGUoKSBjb25zdAoreworICAgIHJldHVybiBkLT5t
X3Zpc2libGU7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0VmlzaWJsZShib29sIHZpc2libGUpCit7
CisgICAgaWYgKGQtPm1fdmlzaWJsZSA9PSB2aXNpYmxlKQorICAgICAgICByZXR1cm47CisKKyAg
ICBkLT5tX3Zpc2libGUgPSB2aXNpYmxlOworCisgICAgaWYgKCF2aXNpYmxlKSB7CisgICAgICAg
IGQtPnN1c3BlbmRCYWNraW5nU3RvcmUoKTsKKworICAgICAgICAvLyBSZW1vdmUgdGhpcyBXZWJQ
YWdlIGZyb20gdGhlIHZpc2libGUgcGFnZXMgbGlzdC4KKyAgICAgICAgc2l6ZV90IGZvdW5kSW5k
ZXggPSB2aXNpYmxlV2ViUGFnZXMoKS0+ZmluZCh0aGlzKTsKKyAgICAgICAgaWYgKGZvdW5kSW5k
ZXggIT0gV1RGOjpub3RGb3VuZCkKKyAgICAgICAgICAgIHZpc2libGVXZWJQYWdlcygpLT5yZW1v
dmUoZm91bmRJbmRleCk7CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBiYWNraW5nIHN0b3JlIHRv
IHRoZSBsYXN0IHZpc2libGUgV2ViUGFnZS4KKyAgICAgICAgaWYgKEJhY2tpbmdTdG9yZVByaXZh
dGU6OmN1cnJlbnRCYWNraW5nU3RvcmVPd25lcigpID09IHRoaXMgJiYgIXZpc2libGVXZWJQYWdl
cygpLT5pc0VtcHR5KCkpCisgICAgICAgICAgICB2aXNpYmxlV2ViUGFnZXMoKS0+bGFzdCgpLT5k
LT5yZXN1bWVCYWNraW5nU3RvcmUoKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKKyAgICAgICAgLy8gUm9vdCBsYXllciBjb21taXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgaW52
aXNpYmxlIHRhYnMuCisgICAgICAgIC8vIEFuZCByZWxlYXNlIGxheWVyIHJlc291cmNlcyBjYW4g
cmVkdWNlIG1lbW9yeSBjb25zdW1wdGlvbi4KKyAgICAgICAgZC0+c3VzcGVuZFJvb3RMYXllckNv
bW1pdCgpOworI2VuZGlmCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCisgICAgZC0+cmVzdW1lUm9vdExheWVyQ29tbWl0KCk7CisjZW5k
aWYKKworICAgIC8vIFB1c2ggdGhpcyBXZWJQYWdlIHRvIHRoZSB0b3Agb2YgdGhlIHZpc2libGUg
cGFnZXMgbGlzdC4KKyAgICBpZiAoIXZpc2libGVXZWJQYWdlcygpLT5pc0VtcHR5KCkgJiYgdmlz
aWJsZVdlYlBhZ2VzKCktPmxhc3QoKSAhPSB0aGlzKSB7CisgICAgICAgIHNpemVfdCBmb3VuZElu
ZGV4ID0gdmlzaWJsZVdlYlBhZ2VzKCktPmZpbmQodGhpcyk7CisgICAgICAgIGlmIChmb3VuZElu
ZGV4ICE9IFdURjo6bm90Rm91bmQpCisgICAgICAgICAgICB2aXNpYmxlV2ViUGFnZXMoKS0+cmVt
b3ZlKGZvdW5kSW5kZXgpOworICAgIH0KKyAgICB2aXNpYmxlV2ViUGFnZXMoKS0+YXBwZW5kKHRo
aXMpOworCisgICAgaWYgKEJhY2tpbmdTdG9yZVByaXZhdGU6OmN1cnJlbnRCYWNraW5nU3RvcmVP
d25lcigpCisgICAgICAgICYmIEJhY2tpbmdTdG9yZVByaXZhdGU6OmN1cnJlbnRCYWNraW5nU3Rv
cmVPd25lcigpICE9IHRoaXMpCisgICAgICAgIEJhY2tpbmdTdG9yZVByaXZhdGU6OmN1cnJlbnRC
YWNraW5nU3RvcmVPd25lcigpLT5kLT5zdXNwZW5kQmFja2luZ1N0b3JlKCk7CisKKyAgICAvLyBy
ZXN1bWVCYWNraW5nU3RvcmUgd2lsbCBzZXQgdGhlIGN1cnJlbnQgb3duZXIgdG8gdGhpcyB3ZWJw
YWdlLgorICAgIC8vIElmIHdlIHNldCB0aGUgb3duZXIgcHJlbWF0dXJlbHksIHRoZW4gdGhlIHRp
bGVzIHdpbGwgbm90IGJlIHJlc2V0LgorICAgIGQtPnJlc3VtZUJhY2tpbmdTdG9yZSgpOworfQor
Cit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZWxlY3Rpb25DaGFuZ2VkKEZyYW1lKiBmcmFtZSkKK3sK
KyAgICBtX2lucHV0SGFuZGxlci0+c2VsZWN0aW9uQ2hhbmdlZCgpOworCisgICAgLy8gRklYTUU6
IFRoaXMgaXMgYSBoYWNrIQorICAgIC8vIFRvIGVuc3VyZSB0aGUgc2VsZWN0aW9uIGJlaW5nIGNo
YW5nZWQgaGFzIGl0cyBmcmFtZSAnZm9jdXNlZCcsIGxldHMKKyAgICAvLyBzZXQgaXQgYXMgZm9j
dXNlZCBvdXJzZWx2ZXMgKFBSICMxMDQ3MjQpLgorICAgIG1fcGFnZS0+Zm9jdXNDb250cm9sbGVy
KCktPnNldEZvY3VzZWRGcmFtZShmcmFtZSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnVw
ZGF0ZURlbGVnYXRlZE92ZXJsYXlzKGJvb2wgZGlzcGF0Y2hlZCkKK3sKKyAgICAvLyBUcmFjayBh
IGRpc3BhdGNoZWQgbWVzc2FnZSwgd2UgZG9uJ3Qgd2FudCB0byBmbG9vZCB0aGUgd2Via2l0IHRo
cmVhZC4KKyAgICAvLyBUaGVyZSBjYW4gYmUgYXMgbWFueSBhcyBvbmUgbW9yZSBtZXNzYWdlIGVu
cXVlZCBhcyBuZWVkZWQgYnV0IG5ldmVyIGxlc3MuCisgICAgaWYgKGRpc3BhdGNoZWQpCisgICAg
ICAgIG1fdXBkYXRlRGVsZWdhdGVkT3ZlcmxheXNEaXNwYXRjaGVkID0gZmFsc2U7CisgICAgZWxz
ZSBpZiAobV91cGRhdGVEZWxlZ2F0ZWRPdmVybGF5c0Rpc3BhdGNoZWQpIHsKKyAgICAgICAgLy8g
RWFybHkgcmV0dXJuIGlmIHRoZXJlIGlzIG1lc3NhZ2UgYWxyZWFkeSBwZW5kaW5nIG9uIHRoZSB3
ZWJraXQgdGhyZWFkLgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKFBsYXRmb3Jt
Ojp3ZWJLaXRUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKSB7CisgICAg
ICAgIC8vIE11c3QgYmUgY2FsbGVkIG9uIHRoZSBXZWJLaXQgdGhyZWFkLgorICAgICAgICBpZiAo
bV9zZWxlY3Rpb25IYW5kbGVyLT5pc1NlbGVjdGlvbkFjdGl2ZSgpKQorICAgICAgICAgICAgbV9z
ZWxlY3Rpb25IYW5kbGVyLT5zZWxlY3Rpb25Qb3NpdGlvbkNoYW5nZWQodHJ1ZSAvKiB2aXN1YWxD
aGFuZ2VPbmx5ICovKTsKKworICAgIH0gZWxzZSBpZiAobV9zZWxlY3Rpb25IYW5kbGVyLT5pc1Nl
bGVjdGlvbkFjdGl2ZSgpKSB7CisgICAgICAgIC8vIERvbid0IGJvdGhlciBkaXNwYXRjaGluZyB0
byB3ZWJraXQgdGhyZWFkIGlmIHNlbGVjdGlvbiBhbmQgdGFwIGhpZ2hsaWdodCBhcmUgbm90IGFj
dGl2ZS4KKyAgICAgICAgbV91cGRhdGVEZWxlZ2F0ZWRPdmVybGF5c0Rpc3BhdGNoZWQgPSB0cnVl
OworICAgICAgICBQbGF0Zm9ybTo6d2ViS2l0VGhyZWFkTWVzc2FnZUNsaWVudCgpLT5kaXNwYXRj
aE1lc3NhZ2UoUGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKCZXZWJQYWdlUHJpdmF0
ZTo6dXBkYXRlRGVsZWdhdGVkT3ZlcmxheXMsIHRoaXMsIHRydWUgLypkaXNwYXRjaGVkKi8pKTsK
KyAgICB9Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0Q2FyZXRIaWdobGlnaHRTdHlsZShQbGF0Zm9y
bTo6Q2FyZXRIaWdobGlnaHRTdHlsZSBzdHlsZSkKK3sKK30KKworYm9vbCBXZWJQYWdlOjpzZXRC
YXRjaEVkaXRpbmdBY3RpdmUoYm9vbCBhY3RpdmUpCit7CisgICAgcmV0dXJuIGQtPm1faW5wdXRI
YW5kbGVyLT5zZXRCYXRjaEVkaXRpbmdBY3RpdmUoYWN0aXZlKTsKK30KKworYm9vbCBXZWJQYWdl
OjpzZXRJbnB1dFNlbGVjdGlvbih1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKQoreworICAg
IHJldHVybiBkLT5tX2lucHV0SGFuZGxlci0+c2V0U2VsZWN0aW9uKHN0YXJ0LCBlbmQpOworfQor
CitpbnQgV2ViUGFnZTo6aW5wdXRDYXJldFBvc2l0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
ZC0+bV9pbnB1dEhhbmRsZXItPmNhcmV0UG9zaXRpb24oKTsKK30KKwordm9pZCBXZWJQYWdlOjpw
b3B1cExpc3RDbG9zZWQoaW50IHNpemUsIGJvb2wqIHNlbGVjdGVkcykKK3sKKyAgICBkLT5tX2lu
cHV0SGFuZGxlci0+c2V0UG9wdXBMaXN0SW5kZXhlcyhzaXplLCBzZWxlY3RlZHMpOworfQorCit2
b2lkIFdlYlBhZ2U6OnBvcHVwTGlzdENsb3NlZChpbnQgaW5kZXgpCit7CisgICAgZC0+bV9pbnB1
dEhhbmRsZXItPnNldFBvcHVwTGlzdEluZGV4KGluZGV4KTsKK30KKwordm9pZCBXZWJQYWdlOjpz
ZXREYXRlVGltZUlucHV0KGNvbnN0IFdlYlN0cmluZyYgdmFsdWUpCit7CisgICAgZC0+bV9pbnB1
dEhhbmRsZXItPnNldElucHV0VmFsdWUoU3RyaW5nKHZhbHVlLmltcGwoKSkpOworfQorCit2b2lk
IFdlYlBhZ2U6OnNldENvbG9ySW5wdXQoY29uc3QgV2ViU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBk
LT5tX2lucHV0SGFuZGxlci0+c2V0SW5wdXRWYWx1ZShTdHJpbmcodmFsdWUuaW1wbCgpKSk7Cit9
CisKK0FjdGl2ZU5vZGVDb250ZXh0IFdlYlBhZ2U6OmFjdGl2ZU5vZGVDb250ZXh0KFRhcmdldERl
dGVjdGlvblN0cmF0ZWd5IHN0cmF0ZWd5KSBjb25zdAoreworICAgIHJldHVybiBkLT5hY3RpdmVO
b2RlQ29udGV4dChzdHJhdGVneSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0VmlydHVhbFZpZXdw
b3J0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgZC0+bV92aXJ0dWFsVmlld3Bv
cnRXaWR0aCA9IHdpZHRoOworICAgIGQtPm1fdmlydHVhbFZpZXdwb3J0SGVpZ2h0ID0gaGVpZ2h0
OworfQorCit2b2lkIFdlYlBhZ2U6OnJlc2V0VmlydHVhbFZpZXdwb3J0T25Db21taXR0ZWQoYm9v
bCByZXNldCkKK3sKKyAgICBkLT5tX3Jlc2V0VmlydHVhbFZpZXdwb3J0T25Db21taXR0ZWQgPSBy
ZXNldDsKK30KKworSW50U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6cmVjb21wdXRlVmlydHVhbFZpZXdw
b3J0RnJvbVZpZXdwb3J0QXJndW1lbnRzKCkKK3sKKyAgICBzdGF0aWMgVmlld3BvcnRBcmd1bWVu
dHMgZGVmYXVsdFZpZXdwb3J0QXJndW1lbnRzOworICAgIGlmIChtX3ZpZXdwb3J0QXJndW1lbnRz
ID09IGRlZmF1bHRWaWV3cG9ydEFyZ3VtZW50cykKKyAgICAgICAgcmV0dXJuIEludFNpemUoKTsK
KworICAgIGludCBkZXNrdG9wV2lkdGggPSBkZWZhdWx0TWF4TGF5b3V0U2l6ZSgpLndpZHRoKCk7
CisgICAgaW50IGRldmljZVdpZHRoID0gUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OndpZHRo
KCk7CisgICAgaW50IGRldmljZUhlaWdodCA9IFBsYXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjpo
ZWlnaHQoKTsKKyAgICBGbG9hdFNpemUgY3VycmVudFBQSSA9IFBsYXRmb3JtOjpHcmFwaGljczo6
U2NyZWVuOjpwaXhlbHNQZXJJbmNoKC0xKTsKKyAgICBpbnQgZGV2aWNlRFBJID0gaW50KHJvdW5k
ZigoY3VycmVudFBQSS53aWR0aCgpICsgY3VycmVudFBQSS5oZWlnaHQoKSkgLyAyKSk7CisgICAg
aWYgKG1fdmlld3BvcnRBcmd1bWVudHMudGFyZ2V0RGVuc2l0eURwaSA9PSBWaWV3cG9ydEFyZ3Vt
ZW50czo6VmFsdWVBdXRvKSB7CisgICAgICAgIC8vIEF1dG8gbWVhbnMgMTYwZHBpIGlmIHdlIGxl
YXZlIGl0IGFsb25lLiBUaGlzIGxvb2tzIHRlcnJpYmxlIGZvciBwYWdlcyB3YW50aW5nIDE6MS4K
KyAgICAgICAgLy8gRklYTUU6IFRoaXMgaXMgaW5zdWZmaWNpZW50IGZvciBkZXZpY2VzIHdpdGgg
aGlnaCBkcGksIGFzIHRoZXkgd2lsbCByZW5kZXIgY29udGVudCB1bnJlYWRhYmx5IHNtYWxsLgor
ICAgICAgICBtX3ZpZXdwb3J0QXJndW1lbnRzLnRhcmdldERlbnNpdHlEcGkgPSBkZXZpY2VEUEk7
CisgICAgfQorCisgICAgVmlld3BvcnRBdHRyaWJ1dGVzIHJlc3VsdCA9IGNvbXB1dGVWaWV3cG9y
dEF0dHJpYnV0ZXMobV92aWV3cG9ydEFyZ3VtZW50cywgZGVza3RvcFdpZHRoLCBkZXZpY2VXaWR0
aCwgZGV2aWNlSGVpZ2h0LCBkZXZpY2VEUEksIG1fZGVmYXVsdExheW91dFNpemUpOworICAgIHJl
dHVybiBJbnRTaXplKHJlc3VsdC5sYXlvdXRTaXplLndpZHRoKCksIHJlc3VsdC5sYXlvdXRTaXpl
LmhlaWdodCgpKTsKK30KKworI2lmIEVOQUJMRShFVkVOVF9NT0RFX01FVEFUQUdTKQordm9pZCBX
ZWJQYWdlUHJpdmF0ZTo6ZGlkUmVjZWl2ZUN1cnNvckV2ZW50TW9kZShDdXJzb3JFdmVudE1vZGUg
bW9kZSkKK3sKKyAgICBpZiAobW9kZSAhPSBtX2N1cnNvckV2ZW50TW9kZSkKKyAgICAgICAgbV9j
bGllbnQtPmN1cnNvckV2ZW50TW9kZUNoYW5nZWQodG9QbGF0Zm9ybUN1cnNvckV2ZW50TW9kZSht
b2RlKSk7CisgICAgbV9jdXJzb3JFdmVudE1vZGUgPSBtb2RlOworfQorCit2b2lkIFdlYlBhZ2VQ
cml2YXRlOjpkaWRSZWNlaXZlVG91Y2hFdmVudE1vZGUoVG91Y2hFdmVudE1vZGUgbW9kZSkKK3sK
KyAgICBpZiAobW9kZSAhPSBtX3RvdWNoRXZlbnRNb2RlKQorICAgICAgICBtX2NsaWVudC0+dG91
Y2hFdmVudE1vZGVDaGFuZ2VkKHRvUGxhdGZvcm1Ub3VjaEV2ZW50TW9kZShtb2RlKSk7CisgICAg
bV90b3VjaEV2ZW50TW9kZSA9IG1vZGU7Cit9CisjZW5kaWYKKwordm9pZCBXZWJQYWdlUHJpdmF0
ZTo6ZGlzcGF0Y2hWaWV3cG9ydFByb3BlcnRpZXNEaWRDaGFuZ2UoY29uc3QgVmlld3BvcnRBcmd1
bWVudHMmIGFyZ3VtZW50cykKK3sKKyAgICBzdGF0aWMgVmlld3BvcnRBcmd1bWVudHMgZGVmYXVs
dFZpZXdwb3J0QXJndW1lbnRzOworICAgIGlmIChhcmd1bWVudHMgPT0gZGVmYXVsdFZpZXdwb3J0
QXJndW1lbnRzKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3ZpZXdwb3J0QXJndW1lbnRzID0g
YXJndW1lbnRzOworCisgICAgLy8gMCB3aWR0aCBvciBoZWlnaHQgaW4gdmlld3BvcnQgYXJndW1l
bnRzIG1ha2VzIG5vIHNlbnNlLCBhbmQgcmVzdWx0cyBpbiBhIHZlcnkgbGFyZ2UgaW5pdGlhbCBz
Y2FsZS4KKyAgICAvLyBJbiByZWFsIHdvcmxkLCBhIDAgd2lkdGggb3IgaGVpZ2h0IGlzIHVzdWFs
bHkgY2F1c2VkIGJ5IGEgc3ludGF4IGVycm9yIGluICJjb250ZW50IiBmaWVsZCBvZiB2aWV3cG9y
dAorICAgIC8vIG1ldGEgdGFnLCBmb3IgZXhhbXBsZSwgdXNpbmcgc2VtaWNvbG9uIGluc3RlYWQg
b2YgY29tbWEgYXMgc2VwYXJhdG9yICgid2lkdGg9ZGV2aWNlLXdpZHRoOyBpbml0aWFsLXNjYWxl
PTEuMCIpLgorICAgIC8vIFdlIGRvbid0IGhhdmUgYSBwbGFuIHRvIHRvbGVyYXRlIHRoZSBzZW1p
Y29sb24gc2VwYXJhdG9yLCBidXQgd2UgY2FuIGF2b2lkIGFwcGx5aW5nIDAgd2lkdGgvaGVpZ2h0
LgorICAgIC8vIEkgZGVmYXVsdCBpdCB0byBWYWx1ZURldmljZVdpZHRoIHJhdGhlciB0aGFuIFZh
bHVlQXV0byBiZWNhdXNlIGluIG1vcmUgY2FzZXMgdGhlIHdlYiBzaXRlIHdhbnRzICJkZXZpY2Ut
d2lkdGgiCisgICAgLy8gd2hlbiB0aGV5IHNwZWNpZnkgdGhlIHZpZXdwb3J0IHdpZHRoLgorICAg
IGlmICghbV92aWV3cG9ydEFyZ3VtZW50cy53aWR0aCkKKyAgICAgICAgbV92aWV3cG9ydEFyZ3Vt
ZW50cy53aWR0aCA9IFZpZXdwb3J0QXJndW1lbnRzOjpWYWx1ZURldmljZVdpZHRoOworICAgIGlm
ICghbV92aWV3cG9ydEFyZ3VtZW50cy5oZWlnaHQpCisgICAgICAgIG1fdmlld3BvcnRBcmd1bWVu
dHMuaGVpZ2h0ID0gVmlld3BvcnRBcmd1bWVudHM6OlZhbHVlRGV2aWNlSGVpZ2h0OworCisgICAg
c2V0VXNlclNjYWxhYmxlKGFyZ3VtZW50cy51c2VyU2NhbGFibGUgPT0gVmlld3BvcnRBcmd1bWVu
dHM6OlZhbHVlQXV0byA/IHRydWUgOiBhcmd1bWVudHMudXNlclNjYWxhYmxlKTsKKyAgICBpZiAo
YXJndW1lbnRzLmluaXRpYWxTY2FsZSA+IDApCisgICAgICAgIHNldEluaXRpYWxTY2FsZShhcmd1
bWVudHMuaW5pdGlhbFNjYWxlKTsKKyAgICBpZiAoYXJndW1lbnRzLm1pbmltdW1TY2FsZSA+IDAp
CisgICAgICAgIHNldE1pbmltdW1TY2FsZShhcmd1bWVudHMubWluaW11bVNjYWxlKTsKKyAgICBp
ZiAoYXJndW1lbnRzLm1heGltdW1TY2FsZSA+IDApCisgICAgICAgIHNldE1heGltdW1TY2FsZShh
cmd1bWVudHMubWF4aW11bVNjYWxlKTsKKworICAgIEludFNpemUgdmlydHVhbFZpZXdwb3J0ID0g
cmVjb21wdXRlVmlydHVhbFZpZXdwb3J0RnJvbVZpZXdwb3J0QXJndW1lbnRzKCk7CisgICAgbV93
ZWJQYWdlLT5zZXRWaXJ0dWFsVmlld3BvcnRTaXplKHZpcnR1YWxWaWV3cG9ydC53aWR0aCgpLCB2
aXJ0dWFsVmlld3BvcnQuaGVpZ2h0KCkpOworCisgICAgaWYgKGxvYWRTdGF0ZSgpID09IFdlYktp
dDo6V2ViUGFnZVByaXZhdGU6OkNvbW1pdHRlZCkKKyAgICAgICAgem9vbVRvSW5pdGlhbFNjYWxl
T25Mb2FkKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6Om9uSW5wdXRMb2NhbGVDaGFuZ2Vk
KGJvb2wgaXNSVEwpCit7CisgICAgaWYgKGlzUlRMICE9IG1fd2ViU2V0dGluZ3MtPmlzV3JpdGlu
Z0RpcmVjdGlvblJUTCgpKSB7CisgICAgICAgIG1fd2ViU2V0dGluZ3MtPnNldFdyaXRpbmdEaXJl
Y3Rpb25SVEwoaXNSVEwpOworICAgICAgICBtX2lucHV0SGFuZGxlci0+aGFuZGxlSW5wdXRMb2Nh
bGVDaGFuZ2VkKGlzUlRMKTsKKyAgICB9Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0U2NyZWVuT3Jp
ZW50YXRpb24oaW50IG9yaWVudGF0aW9uKQoreworICAgIGQtPm1fcGVuZGluZ09yaWVudGF0aW9u
ID0gb3JpZW50YXRpb247Cit9CisKK3ZvaWQgV2ViUGFnZTo6YXBwbHlQZW5kaW5nT3JpZW50YXRp
b25JZk5lZWRlZCgpCit7CisgICAgaWYgKGQtPm1fcGVuZGluZ09yaWVudGF0aW9uICE9IC0xKQor
ICAgICAgICBkLT5zZXRTY3JlZW5PcmllbnRhdGlvbihkLT5tX3BlbmRpbmdPcmllbnRhdGlvbik7
Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnN1c3BlbmRCYWNraW5nU3RvcmUoKQoreworI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICByZXNldENvbXBvc2l0aW5nU3VyZmFj
ZSgpOworI2VuZGlmCit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnJlc3VtZUJhY2tpbmdTdG9y
ZSgpCit7CisgICAgQVNTRVJUKG1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpOworCisjaWYgVVNFKEFD
Q0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIHNldE5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJv
bml6YXRpb24oKTsKKyNlbmRpZgorCisgICAgYm9vbCBkaXJlY3RSZW5kZXJpbmcgPSBtX2JhY2tp
bmdTdG9yZS0+ZC0+c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKTsKKyAgICBpZiAoIW1f
YmFja2luZ1N0b3JlLT5kLT5pc0FjdGl2ZSgpCisgICAgICAgIHx8IHNob3VsZFJlc2V0VGlsZXNX
aGVuU2hvd24oKQorICAgICAgICB8fCBkaXJlY3RSZW5kZXJpbmcpIHsKKyAgICAgICAgLy8gV2Ug
bmVlZCB0byByZXNldCBhbGwgdGlsZXMgc28gdGhhdCB3ZSBkbyBub3Qgc2hvdyBhbnkgdGlsZXMg
d2hvc2UgY29udGVudCBtYXkKKyAgICAgICAgLy8gaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5IGFub3Ro
ZXIgV2ViUGFnZSBpbnN0YW5jZSAoaS5lLiBhbm90aGVyIHRhYikuCisgICAgICAgIEJhY2tpbmdT
dG9yZVByaXZhdGU6OnNldEN1cnJlbnRCYWNraW5nU3RvcmVPd25lcihtX3dlYlBhZ2UpOworICAg
ICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+b3JpZW50YXRpb25DaGFuZ2VkKCk7IC8vIFVwZGF0ZXMg
dGlsZSBnZW9tZXRyeSBhbmQgY3JlYXRlcyB2aXNpYmxlIHRpbGUgYnVmZmVyLgorICAgICAgICBt
X2JhY2tpbmdTdG9yZS0+ZC0+cmVzZXRUaWxlcyh0cnVlIC8qIHJlc2V0QmFja2dyb3VuZCAqLyk7
CisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT51cGRhdGVUaWxlcyhmYWxzZSAvKiB1cGRhdGVW
aXNpYmxlICovLCBmYWxzZSAvKiBpbW1lZGlhdGUgKi8pOworICAgICAgICAvLyBUaGlzIHZhbHVl
IG1heSBoYXZlIGNoYW5nZWQsIHNvIHdlIG5lZWQgdG8gdXBkYXRlIGl0LgorICAgICAgICBkaXJl
Y3RSZW5kZXJpbmcgPSBtX2JhY2tpbmdTdG9yZS0+ZC0+c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9X
aW5kb3coKTsKKyAgICAgICAgaWYgKG1fYmFja2luZ1N0b3JlLT5kLT5yZW5kZXJWaXNpYmxlQ29u
dGVudHMoKSAmJiAhbV9iYWNraW5nU3RvcmUtPmQtPmlzU3VzcGVuZGVkKCkgJiYgIWRpcmVjdFJl
bmRlcmluZykKKyAgICAgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5ibGl0VmlzaWJsZUNvbnRl
bnRzKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUmVuZGVyaW5nIHdhcyBkaXNhYmxlZCB3
aGlsZSB3ZSB3ZXJlIGhpZGRlbiwgc28gd2UgbmVlZCB0byB1cGRhdGUgYWxsIHRpbGVzLgorICAg
ICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+dXBkYXRlVGlsZXModHJ1ZSAvKiB1cGRhdGVWaXNpYmxl
ICovLCBmYWxzZSAvKiBpbW1lZGlhdGUgKi8pOworICAgIH0KKworICAgIHNldFNob3VsZFJlc2V0
VGlsZXNXaGVuU2hvd24oZmFsc2UpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXRTY3Jl
ZW5PcmllbnRhdGlvbihpbnQgb3JpZW50YXRpb24pCit7CisgICAgSGFzaFNldDxQbHVnaW5WaWV3
Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9wbHVnaW5WaWV3cy5iZWdpbigpOworICAgIEhhc2hT
ZXQ8UGx1Z2luVmlldyo+Ojpjb25zdF9pdGVyYXRvciBsYXN0ID0gbV9wbHVnaW5WaWV3cy5lbmQo
KTsKKyAgICBmb3IgKDsgaXQgIT0gbGFzdDsgKytpdCkKKyAgICAgICAgKCppdCktPmhhbmRsZU9y
aWVudGF0aW9uRXZlbnQob3JpZW50YXRpb24pOworCisgICAgbV9wZW5kaW5nT3JpZW50YXRpb24g
PSAtMTsKKworI2lmIEVOQUJMRShPUklFTlRBVElPTl9FVkVOVFMpCisgICAgaWYgKG1fbWFpbkZy
YW1lLT5vcmllbnRhdGlvbigpID09IG9yaWVudGF0aW9uKQorICAgICAgICByZXR1cm47CisgICAg
Zm9yIChSZWZQdHI8RnJhbWU+IGZyYW1lID0gbV9tYWluRnJhbWU7IGZyYW1lOyBmcmFtZSA9IGZy
YW1lLT50cmVlKCktPnRyYXZlcnNlTmV4dCgpKQorICAgICAgICBmcmFtZS0+c2VuZE9yaWVudGF0
aW9uQ2hhbmdlRXZlbnQob3JpZW50YXRpb24pOworI2VuZGlmCit9CisKK1BsYXRmb3JtOjpJbnRT
aXplIFdlYlBhZ2U6OnZpZXdwb3J0U2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPnRyYW5z
Zm9ybWVkQWN0dWFsVmlzaWJsZVNpemUoKTsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRWaWV3cG9y
dFNpemUoY29uc3QgUGxhdGZvcm06OkludFNpemUmIHZpZXdwb3J0U2l6ZSwgYm9vbCBlbnN1cmVG
b2N1c0VsZW1lbnRWaXNpYmxlKQoreworICAgIGQtPnNldFZpZXdwb3J0U2l6ZSh2aWV3cG9ydFNp
emUsIGVuc3VyZUZvY3VzRWxlbWVudFZpc2libGUpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRl
OjpzY3JlZW5Sb3RhdGVkKCkKK3sKKyAgICAvLyBUaGlzIGNhbGwgd2lsbCBjYXVzZSB0aGUgY2xp
ZW50IHRvIHJlYWxsb2NhdGUgdGhlIHdpbmRvdyBidWZmZXIgdG8gbmV3IHNpemUsCisgICAgLy8g
d2hpY2ggbmVlZHMgdG8gYmUgc2VyaWFsaXplZCB3aXRoIHVzYWdlIG9mIHRoZSB3aW5kb3cgYnVm
ZmVyLiBBY2NvbXBsaXNoCisgICAgLy8gdGhpcyBieSBzZW5kaW5nIGEgc3luYyBtZXNzYWdlIHRv
IHRoZSBjb21wb3NpdGluZyB0aHJlYWQuIEFsbCBvdGhlciB1c2FnZSBvZgorICAgIC8vIHRoZSB3
aW5kb3cgYnVmZmVyIGhhcHBlbnMgb24gdGhlIGNvbXBvc2l0aW5nIHRocmVhZC4KKyAgICBpZiAo
IVBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRU
aHJlYWQoKSkgeworICAgICAgICBQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VD
bGllbnQoKS0+ZGlzcGF0Y2hTeW5jTWVzc2FnZSgKKyAgICAgICAgICAgIFBsYXRmb3JtOjpjcmVh
dGVNZXRob2RDYWxsTWVzc2FnZSgmV2ViUGFnZVByaXZhdGU6OnNjcmVlblJvdGF0ZWQsIHRoaXMp
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFN1cmZhY2VQb29sOjpnbG9iYWxTdXJm
YWNlUG9vbCgpLT5ub3RpZnlTY3JlZW5Sb3RhdGVkKCk7CisgICAgbV9jbGllbnQtPm5vdGlmeVNj
cmVlblJvdGF0ZWQoKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0Vmlld3BvcnRTaXpl
KGNvbnN0IEludFNpemUmIHRyYW5zZm9ybWVkQWN0dWFsVmlzaWJsZVNpemUsIGJvb2wgZW5zdXJl
Rm9jdXNFbGVtZW50VmlzaWJsZSkKK3sKKyAgICBpZiAobV9wZW5kaW5nT3JpZW50YXRpb24gPT0g
LTEgJiYgdHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSA9PSB0aGlzLT50cmFuc2Zvcm1lZEFj
dHVhbFZpc2libGVTaXplKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFN1c3BlbmQgYWxs
IHNjcmVlbiB1cGRhdGVzIHRvIHRoZSBiYWNraW5nc3RvcmUgdG8gbWFrZSBzdXJlIG5vLW9uZSB0
cmllcyB0byBibGl0CisgICAgLy8gd2hpbGUgdGhlIHdpbmRvdyBzdXJmYWNlIGFuZCB0aGUgQmFj
a2luZ1N0b3JlIGFyZSBvdXQgb2Ygc3luYy4KKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+c3VzcGVu
ZFNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoKTsKKworICAgIC8vIFRoZSBzY3JlZW4gcm90
YXRpb24gaXMgYSBtYWpvciBzdGF0ZSB0cmFuc2l0aW9uIHRoYXQgaW4gdGhpcyBjYXNlIGlzIG5v
dCBwcm9wZXJseQorICAgIC8vIGNvbW11bmljYXRlZCB0byB0aGUgYmFja2luZyBzdG9yZSwgc2lu
Y2UgaXQgZG9lcyBlYXJseSByZXR1cm4gaW4gbW9zdCBtZXRob2RzIHdoZW4KKyAgICAvLyBub3Qg
dmlzaWJsZS4KKyAgICBpZiAoIW1fdmlzaWJsZSB8fCAhbV9iYWNraW5nU3RvcmUtPmQtPmlzQWN0
aXZlKCkpCisgICAgICAgIHNldFNob3VsZFJlc2V0VGlsZXNXaGVuU2hvd24odHJ1ZSk7CisKKyAg
ICBib29sIGhhc1BlbmRpbmdPcmllbnRhdGlvbiA9IG1fcGVuZGluZ09yaWVudGF0aW9uICE9IC0x
OworICAgIGlmIChoYXNQZW5kaW5nT3JpZW50YXRpb24pCisgICAgICAgIHNjcmVlblJvdGF0ZWQo
KTsKKworICAgIC8vIFRoZSB3aW5kb3cgYnVmZmVycyBtaWdodCBoYXZlIGJlZW4gcmVjcmVhdGVk
LCBjbGVhcmVkLCBtb3ZlZCwgZXRjLiwgc286CisgICAgbV9iYWNraW5nU3RvcmUtPmQtPndpbmRv
d0Zyb250QnVmZmVyU3RhdGUoKS0+Y2xlYXJCbGl0dGVkUmVnaW9uKCk7CisgICAgbV9iYWNraW5n
U3RvcmUtPmQtPndpbmRvd0JhY2tCdWZmZXJTdGF0ZSgpLT5jbGVhckJsaXR0ZWRSZWdpb24oKTsK
KworICAgIEludFNpemUgdmlld3BvcnRTaXplQmVmb3JlID0gYWN0dWFsVmlzaWJsZVNpemUoKTsK
KyAgICBGbG9hdFBvaW50IGNlbnRlck9mVmlzaWJsZUNvbnRlbnRzUmVjdCA9IHRoaXMtPmNlbnRl
ck9mVmlzaWJsZUNvbnRlbnRzUmVjdCgpOworICAgIGJvb2wgbmV3VmlzaWJsZVJlY3RDb250YWlu
c09sZFZpc2libGVSZWN0ID0gKG1fYWN0dWFsVmlzaWJsZUhlaWdodCA8PSB0cmFuc2Zvcm1lZEFj
dHVhbFZpc2libGVTaXplLmhlaWdodCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgJiYgKG1fYWN0dWFsVmlzaWJsZVdpZHRoIDw9IHRyYW5zZm9ybWVkQWN0dWFs
VmlzaWJsZVNpemUud2lkdGgoKSk7CisKKyAgICBib29sIGF0SW5pdGlhbFNjYWxlID0gY3VycmVu
dFNjYWxlKCkgPT0gaW5pdGlhbFNjYWxlKCk7CisgICAgYm9vbCBhdFRvcCA9ICFzY3JvbGxQb3Np
dGlvbigpLnkoKTsKKyAgICBib29sIGF0TGVmdCA9ICFzY3JvbGxQb3NpdGlvbigpLngoKTsKKwor
ICAgIC8vIFdlIG5lZWQgdG8gcmVvcmllbnQgdGhlIHZpc2libGVUaWxlUmVjdCBiZWNhdXNlIHRo
ZSBmb2xsb3dpbmcgY29kZQorICAgIC8vIGNvdWxkIGNhdXNlIEJhY2tpbmdTdG9yZTo6dHJhbnNm
b3JtQ2hhbmdlZCB0byBiZSBjYWxsZWQsIHdoZXJlIGl0CisgICAgLy8gaXMgdXNlZC4KKyAgICAv
LyBJdCBpcyBvbmx5IGRlcGVuZGVudCBvbiB0aGUgdHJhbnNmb3JtZWRWaWV3cG9ydFNpemUgd2hp
Y2ggaGFzIGJlZW4KKyAgICAvLyB1cGRhdGVkIGJ5IG5vdy4KKyAgICBtX2JhY2tpbmdTdG9yZS0+
ZC0+Y3JlYXRlVmlzaWJsZVRpbGVCdWZmZXIoKTsKKworICAgIHNldERlZmF1bHRMYXlvdXRTaXpl
KHRyYW5zZm9ybWVkQWN0dWFsVmlzaWJsZVNpemUpOworCisgICAgLy8gUmVjb21wdXRlIG91ciB2
aXJ0dWFsIHZpZXdwb3J0LgorICAgIGJvb2wgbmVlZHNMYXlvdXQgPSBmYWxzZTsKKyAgICBzdGF0
aWMgVmlld3BvcnRBcmd1bWVudHMgZGVmYXVsdFZpZXdwb3J0QXJndW1lbnRzOworICAgIGlmICgh
KG1fdmlld3BvcnRBcmd1bWVudHMgPT0gZGVmYXVsdFZpZXdwb3J0QXJndW1lbnRzKSkgeworICAg
ICAgICAvLyBXZSBtYXkgbmVlZCB0byBpbmZlciB0aGUgd2lkdGggYW5kIGhlaWdodCBmb3IgdGhl
IHZpZXdwb3J0IHdpdGggcmVzcGVjdCB0byB0aGUgcm90YXRpb24uCisgICAgICAgIEludFNpemUg
bmV3VmlydHVhbFZpZXdwb3J0ID0gcmVjb21wdXRlVmlydHVhbFZpZXdwb3J0RnJvbVZpZXdwb3J0
QXJndW1lbnRzKCk7CisgICAgICAgIEFTU0VSVCghbmV3VmlydHVhbFZpZXdwb3J0LmlzRW1wdHko
KSk7CisgICAgICAgIG1fd2ViUGFnZS0+c2V0VmlydHVhbFZpZXdwb3J0U2l6ZShuZXdWaXJ0dWFs
Vmlld3BvcnQud2lkdGgoKSwgbmV3VmlydHVhbFZpZXdwb3J0LmhlaWdodCgpKTsKKyAgICAgICAg
bV9tYWluRnJhbWUtPnZpZXcoKS0+c2V0VXNlRml4ZWRMYXlvdXQodXNlRml4ZWRMYXlvdXQoKSk7
CisgICAgICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPnNldEZpeGVkTGF5b3V0U2l6ZShmaXhlZExh
eW91dFNpemUoKSk7CisgICAgICAgIG5lZWRzTGF5b3V0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICAv
LyBXZSBzd2l0Y2ggdGhpcyBzdHJpY3RseSBhZnRlciByZWNvbXB1dGluZyBvdXIgdmlydHVhbCB2
aWV3cG9ydCBhcyB6b29tVG9GaXRTY2FsZSBpcyBkZXBlbmRlbnQKKyAgICAvLyB1cG9uIHRoZXNl
IHZhbHVlcyBhbmQgc28gaXMgdGhlIHZpcnR1YWwgdmlld3BvcnQgcmVjYWxjdWxhdGlvbi4KKyAg
ICBtX2FjdHVhbFZpc2libGVXaWR0aCA9IHRyYW5zZm9ybWVkQWN0dWFsVmlzaWJsZVNpemUud2lk
dGgoKTsKKyAgICBtX2FjdHVhbFZpc2libGVIZWlnaHQgPSB0cmFuc2Zvcm1lZEFjdHVhbFZpc2li
bGVTaXplLmhlaWdodCgpOworCisgICAgSW50U2l6ZSB2aWV3cG9ydFNpemVBZnRlciA9IGFjdHVh
bFZpc2libGVTaXplKCk7CisKKyAgICBJbnRQb2ludCBvZmZzZXQocm91bmRmKCh2aWV3cG9ydFNp
emVCZWZvcmUud2lkdGgoKSAtIHZpZXdwb3J0U2l6ZUFmdGVyLndpZHRoKCkpIC8gMi4wKSwKKyAg
ICAgICAgICAgICAgICAgICAgcm91bmRmKCh2aWV3cG9ydFNpemVCZWZvcmUuaGVpZ2h0KCkgLSB2
aWV3cG9ydFNpemVBZnRlci5oZWlnaHQoKSkgLyAyLjApKTsKKworICAgIC8vIEFzIGEgc3BlY2lh
bCBjYXNlLCBpZiB3ZSB3ZXJlIGFuY2hvcmVkIHRvIHRoZSB0b3AgbGVmdCBwb3NpdGlvbiBhdAor
ICAgIC8vIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJvdGF0aW9uIHRoZW4gcHJlc2VydmUgdGhhdCBh
bmNob3IuCisgICAgaWYgKGF0VG9wKQorICAgICAgICBvZmZzZXQuc2V0WSgwKTsKKyAgICBpZiAo
YXRMZWZ0KQorICAgICAgICBvZmZzZXQuc2V0WCgwKTsKKworICAgIC8vIElmIHdlJ3JlIGFib3V0
IHRvIG92ZXJzY3JvbGwsIGNhcCB0aGUgb2Zmc2V0IHRvIHZhbGlkIGNvbnRlbnQuCisgICAgSW50
UG9pbnQgYm90dG9tUmlnaHQoCisgICAgICAgIHNjcm9sbFBvc2l0aW9uKCkueCgpICsgdmlld3Bv
cnRTaXplQWZ0ZXIud2lkdGgoKSwKKyAgICAgICAgc2Nyb2xsUG9zaXRpb24oKS55KCkgKyB2aWV3
cG9ydFNpemVBZnRlci5oZWlnaHQoKSk7CisKKyAgICBpZiAoYm90dG9tUmlnaHQueCgpICsgb2Zm
c2V0LngoKSA+IGNvbnRlbnRzU2l6ZSgpLndpZHRoKCkpCisgICAgICAgIG9mZnNldC5zZXRYKGNv
bnRlbnRzU2l6ZSgpLndpZHRoKCkgLSBib3R0b21SaWdodC54KCkpOworICAgIGlmIChib3R0b21S
aWdodC55KCkgKyBvZmZzZXQueSgpID4gY29udGVudHNTaXplKCkuaGVpZ2h0KCkpCisgICAgICAg
IG9mZnNldC5zZXRZKGNvbnRlbnRzU2l6ZSgpLmhlaWdodCgpIC0gYm90dG9tUmlnaHQueSgpKTsK
KyAgICBpZiAoc2Nyb2xsUG9zaXRpb24oKS54KCkgKyBvZmZzZXQueCgpIDwgMCkKKyAgICAgICAg
b2Zmc2V0LnNldFgoLXNjcm9sbFBvc2l0aW9uKCkueCgpKTsKKyAgICBpZiAoc2Nyb2xsUG9zaXRp
b24oKS55KCkgKyBvZmZzZXQueSgpIDwgMCkKKyAgICAgICAgb2Zmc2V0LnNldFkoLXNjcm9sbFBv
c2l0aW9uKCkueSgpKTsKKworICAgIC8vIC4uLmJlZm9yZSBzY3JvbGxpbmcsIGJlY2F1c2UgdGhl
IGJhY2tpbmcgc3RvcmUgd2lsbCBhbGlnbiBpdHMKKyAgICAvLyB0aWxlIG1hdHJpeCB3aXRoIHRo
ZSB2aWV3cG9ydCBhcyByZXBvcnRlZCBieSB0aGUgU2Nyb2xsVmlldy4KKyAgICBzY3JvbGxCeShv
ZmZzZXQueCgpLCBvZmZzZXQueSgpKTsKKyAgICBub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5n
ZWQoKTsKKworICAgIG1fYmFja2luZ1N0b3JlLT5kLT5vcmllbnRhdGlvbkNoYW5nZWQoKTsKKyAg
ICBtX2JhY2tpbmdTdG9yZS0+ZC0+YWN0dWFsVmlzaWJsZVNpemVDaGFuZ2VkKHRyYW5zZm9ybWVk
QWN0dWFsVmlzaWJsZVNpemUpOworCisgICAgLy8gVXBkYXRlIHZpZXcgbW9kZSBvbmx5IGFmdGVy
IHdlIGhhdmUgdXBkYXRlZCB0aGUgYWN0dWFsCisgICAgLy8gdmlzaWJsZSBzaXplIGFuZCByZXNl
dCB0aGUgY29udGVudHMgcmVjdCBpZiBuZWNlc3NhcnkuCisgICAgaWYgKHNldFZpZXdNb2RlKHZp
ZXdNb2RlKCkpKQorICAgICAgICBuZWVkc0xheW91dCA9IHRydWU7CisKKyAgICAvLyBXZSBuZWVk
IHRvIHVwZGF0ZSB0aGUgdmlld3BvcnQgc2l6ZSBvZiB0aGUgV2ViQ29yZTo6U2Nyb2xsVmlldy4u
LgorICAgIHVwZGF0ZVZpZXdwb3J0U2l6ZSghaGFzUGVuZGluZ09yaWVudGF0aW9uIC8qIHNldEZp
eGVkUmVwb3J0ZWRTaXplICovLCBmYWxzZSAvKiBzZW5kUmVzaXplRXZlbnQgKi8pOworICAgIG5v
dGlmeVRyYW5zZm9ybWVkQ29udGVudHNTaXplQ2hhbmdlZCgpOworCisgICAgLy8gSWYgYXV0b21h
dGljIHpvb21pbmcgaXMgZGlzYWJsZWQsIHByZXZlbnQgem9vbWluZyBiZWxvdy4KKyAgICBpZiAo
IW1fd2ViU2V0dGluZ3MtPmlzWm9vbVRvRml0T25Mb2FkKCkpIHsKKyAgICAgICAgYXRJbml0aWFs
U2NhbGUgPSBmYWxzZTsKKworICAgICAgICAvLyBOb3JtYWxseSwgaWYgdGhlIGNvbnRlbnRzIHNp
emUgaXMgc21hbGxlciB0aGFuIHRoZSBsYXlvdXQgd2lkdGgsCisgICAgICAgIC8vIHdlIHdvdWxk
IHpvb20gaW4uIElmIHpvb20gaXMgZGlzYWJsZWQsIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nIGVs
c2UsCisgICAgICAgIC8vIG9yIHRoZXJlIHdpbGwgYmUgYXJ0aWZhY3RzIGR1ZSB0byBub24tcmVu
ZGVyZWQgYXJlYXMgb3V0c2lkZSBvZiB0aGUKKyAgICAgICAgLy8gY29udGVudHMgc2l6ZS4gSWYg
dGhlcmUgaXMgYSB2aXJ0dWFsIHZpZXdwb3J0LCB3ZSBhcmUgbm90IGFsbG93ZWQKKyAgICAgICAg
Ly8gdG8gbW9kaWZ5IHRoZSBmaXhlZCBsYXlvdXQgc2l6ZSwgaG93ZXZlci4KKyAgICAgICAgaWYg
KCFoYXNWaXJ0dWFsVmlld3BvcnQoKSAmJiBjb250ZW50c1NpemUoKS53aWR0aCgpIDwgbV9kZWZh
dWx0TGF5b3V0U2l6ZS53aWR0aCgpKSB7CisgICAgICAgICAgICBtX21haW5GcmFtZS0+dmlldygp
LT5zZXRVc2VGaXhlZExheW91dCh1c2VGaXhlZExheW91dCgpKTsKKyAgICAgICAgICAgIG1fbWFp
bkZyYW1lLT52aWV3KCktPnNldEZpeGVkTGF5b3V0U2l6ZShtX2RlZmF1bHRMYXlvdXRTaXplKTsK
KyAgICAgICAgICAgIG5lZWRzTGF5b3V0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IGlmIChuZWVkc0xheW91dCkKKyAgICAgICAgc2V0TmVlZHNMYXlvdXQoKTsKKworICAgIC8vIE5l
ZWQgdG8gcmVzdW1lIHNvIHRoYXQgdGhlIGJhY2tpbmdzdG9yZSB3aWxsIHN0YXJ0IHJlY29yZGlu
ZyB0aGUgaW52YWxpZGF0ZWQKKyAgICAvLyByZWN0cyBmcm9tIGJlbG93LgorICAgIG1fYmFja2lu
Z1N0b3JlLT5kLT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKEJhY2tpbmdTdG9y
ZTo6Tm9uZSk7CisKKyAgICAvLyBXZSBtaWdodCBuZWVkIHRvIGxheW91dCBoZXJlIHRvIGdldCBh
IGNvcnJlY3QgY29udGVudHNTaXplIHNvIHRoYXQgem9vbVRvRml0CisgICAgLy8gaXMgY2FsY3Vs
YXRlZCBjb3JyZWN0bHkuCisgICAgcmVxdWVzdExheW91dElmTmVlZGVkKCk7CisKKyAgICAvLyBB
cyBhIHNwZWNpYWwgY2FzZSBpZiB3ZSB3ZXJlIHpvb21lZCB0byB0aGUgaW5pdGlhbCBzY2FsZSBh
dCB0aGUgYmVnaW5uaW5nCisgICAgLy8gb2YgdGhlIHJvdGF0aW9uIHRoZW4gcHJlc2VydmUgdGhh
dCB6b29tIGxldmVsIGV2ZW4gd2hlbiBpdCBpcyB6b29tVG9GaXQuCisgICAgZG91YmxlIHNjYWxl
ID0gYXRJbml0aWFsU2NhbGUgPyBpbml0aWFsU2NhbGUoKSA6IGN1cnJlbnRTY2FsZSgpOworCisg
ICAgLy8gRG8gb3VyIG93biBjbGFtcGluZy4KKyAgICBzY2FsZSA9IGNsYW1wZWRTY2FsZShzY2Fs
ZSk7CisKKyAgICBpZiAoaGFzUGVuZGluZ09yaWVudGF0aW9uKSB7CisgICAgICAgIC8vIFNldCB0
aGUgZml4ZWQgcmVwb3J0ZWQgc2l6ZSBoZXJlIHNvIHRoYXQgaW5uZXJXaWR0aHxpbm5lckhlaWdo
dCB3b3JrcworICAgICAgICAvLyB3aXRoIHRoaXMgbmV3IHNjYWxlLgorICAgICAgICBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCByb3RhdGlvbk1hdHJpeDsKKyAgICAgICAgcm90YXRpb25NYXRyaXguc2Nh
bGUoc2NhbGUpOworICAgICAgICBJbnRSZWN0IHZpZXdwb3J0UmVjdCA9IEludFJlY3QoSW50UG9p
bnQ6Onplcm8oKSwgdHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSk7CisgICAgICAgIEludFJl
Y3QgYWN0dWFsVmlzaWJsZVJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KHJvdGF0aW9uTWF0cml4Lmlu
dmVyc2UoKS5tYXBSZWN0KEZsb2F0UmVjdCh2aWV3cG9ydFJlY3QpKSk7CisgICAgICAgIG1fbWFp
bkZyYW1lLT52aWV3KCktPnNldEZpeGVkUmVwb3J0ZWRTaXplKGFjdHVhbFZpc2libGVSZWN0LnNp
emUoKSk7CisgICAgfQorCisgICAgLy8gV2UncmUgZ29pbmcgdG8gbmVlZCB0byBzZW5kIGEgcmVz
aXplIGV2ZW50IHRvIEphdmFTY3JpcHQgYmVjYXVzZQorICAgIC8vIGlubmVyV2lkdGggYW5kIGlu
bmVySGVpZ2h0IGRlcGVuZCBvbiBmaXhlZCByZXBvcnRlZCBzaXplLgorICAgIC8vIFRoaXMgaXMg
aG93IHdlIHN1cHBvcnQgbW9iaWxlIHBhZ2VzIHdoZXJlIEphdmFTY3JpcHQgcmVzaXplcworICAg
IC8vIHRoZSBwYWdlIGluIG9yZGVyIHRvIGdldCBhcm91bmQgdGhlIGZpeGVkIGxheW91dCBzaXpl
LCBlLmcuCisgICAgLy8gZ29vZ2xlIG1hcHMgd2hlbiBpdCBkZXRlY3RzIGEgbW9iaWxlIHVzZXIg
YWdlbnQuCisgICAgaWYgKHNob3VsZFNlbmRSZXNpemVFdmVudCgpKQorICAgICAgICBtX21haW5G
cmFtZS0+ZXZlbnRIYW5kbGVyKCktPnNlbmRSZXNpemVFdmVudCgpOworCisgICAgLy8gQXMgYSBz
cGVjaWFsIGNhc2UgaWYgd2Ugd2VyZSBhbmNob3JlZCB0byB0aGUgdG9wIGxlZnQgcG9zaXRpb24g
YXQgdGhlIGJlZ2lubmluZworICAgIC8vIG9mIHRoZSByb3RhdGlvbiB0aGVuIHByZXNlcnZlIHRo
YXQgYW5jaG9yLgorICAgIEZsb2F0UG9pbnQgYW5jaG9yID0gY2VudGVyT2ZWaXNpYmxlQ29udGVu
dHNSZWN0OworICAgIGlmIChhdFRvcCkKKyAgICAgICAgYW5jaG9yLnNldFkoMCk7CisgICAgaWYg
KGF0TGVmdCkKKyAgICAgICAgYW5jaG9yLnNldFgoMCk7CisKKyAgICAvLyBUcnkgYW5kIHpvb20g
aGVyZSB3aXRoIGNsYW1waW5nIG9uLgorICAgIGlmIChtX2JhY2tpbmdTdG9yZS0+ZC0+c2hvdWxk
RGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkgeworICAgICAgICBib29sIHN1Y2Nlc3MgPSB6b29t
QWJvdXRQb2ludChzY2FsZSwgYW5jaG9yLCBmYWxzZSAvKiBlbmZvcmNlU2NhbGVDbGFtcGluZyAq
LywgdHJ1ZSAvKiBmb3JjZVJlbmRlcmluZyAqLyk7CisgICAgICAgIGlmICghc3VjY2VzcyAmJiBl
bnN1cmVGb2N1c0VsZW1lbnRWaXNpYmxlKQorICAgICAgICAgICAgZW5zdXJlQ29udGVudFZpc2li
bGUoIW5ld1Zpc2libGVSZWN0Q29udGFpbnNPbGRWaXNpYmxlUmVjdCk7CisgICAgfSBlbHNlIGlm
ICghc2NoZWR1bGVab29tQWJvdXRQb2ludChzY2FsZSwgYW5jaG9yLCBmYWxzZSAvKiBlbmZvcmNl
U2NhbGVDbGFtcGluZyAqLywgdHJ1ZSAvKiBmb3JjZVJlbmRlcmluZyAqLykpIHsKKyAgICAgICAg
Ly8gU3VzcGVuZCBhbGwgc2NyZWVuIHVwZGF0ZXMgdG8gdGhlIGJhY2tpbmdzdG9yZS4KKyAgICAg
ICAgbV9iYWNraW5nU3RvcmUtPmQtPnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVz
KCk7CisKKyAgICAgICAgLy8gSWYgdGhlIHpvb20gZmFpbGVkLCB0aGVuIHdlIHNob3VsZCBzdGls
bCBwcmVzZXJ2ZSB0aGUgc3BlY2lhbCBjYXNlIG9mIHNjcm9sbCBwb3NpdGlvbi4KKyAgICAgICAg
SW50UG9pbnQgc2Nyb2xsUG9zaXRpb24gPSB0aGlzLT5zY3JvbGxQb3NpdGlvbigpOworICAgICAg
ICBpZiAoYXRUb3ApCisgICAgICAgICAgICBzY3JvbGxQb3NpdGlvbi5zZXRZKDApOworICAgICAg
ICBpZiAoYXRMZWZ0KQorICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24uc2V0WCgwKTsKKyAgICAg
ICAgc2V0U2Nyb2xsUG9zaXRpb24oc2Nyb2xsUG9zaXRpb24pOworCisgICAgICAgIC8vIFRoZXNl
IG1pZ2h0IGhhdmUgYmVlbiBhbHRlcmVkIGV2ZW4gaWYgd2UgZGlkbid0IHpvb20gc28gbm90aWZ5
IHRoZSBjbGllbnQuCisgICAgICAgIG5vdGlmeVRyYW5zZm9ybWVkQ29udGVudHNTaXplQ2hhbmdl
ZCgpOworICAgICAgICBub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQoKTsKKworICAgICAg
ICBpZiAoIW5lZWRzTGF5b3V0KSB7CisgICAgICAgICAgICAvLyBUaGUgdmlzaWJsZSB0aWxlcyBm
b3Igc2Nyb2xsIG11c3QgYmUgdXAtdG8tZGF0ZSBiZWZvcmUgd2UgYmxpdCBzaW5jZSB3ZSBhcmUg
bm90IHBlcmZvcm1pbmcgYSBsYXlvdXQuCisgICAgICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+
dXBkYXRlVGlsZXNGb3JTY3JvbGxPck5vdFJlbmRlcmVkUmVnaW9uKCk7CisgICAgICAgIH0KKwor
ICAgICAgICBpZiAoZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJsZSkKKyAgICAgICAgICAgIGVuc3Vy
ZUNvbnRlbnRWaXNpYmxlKCFuZXdWaXNpYmxlUmVjdENvbnRhaW5zT2xkVmlzaWJsZVJlY3QpOwor
CisgICAgICAgIGlmIChuZWVkc0xheW91dCkgeworICAgICAgICAgICAgbV9iYWNraW5nU3RvcmUt
PmQtPnJlc2V0VGlsZXModHJ1ZSk7CisgICAgICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+dXBk
YXRlVGlsZXMoZmFsc2UgLyogdXBkYXRlVmlzaWJsZSAqLywgZmFsc2UgLyogaW1tZWRpYXRlICov
KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIG5lZWQgbGF5b3V0IHRoZW4gcmVuZGVy
IGFuZCBibGl0LCBvdGhlcndpc2UganVzdCBibGl0IGFzIG91ciB2aWV3cG9ydCBoYXMgY2hhbmdl
ZC4KKyAgICAgICAgbV9iYWNraW5nU3RvcmUtPmQtPnJlc3VtZVNjcmVlbkFuZEJhY2tpbmdTdG9y
ZVVwZGF0ZXMobmVlZHNMYXlvdXQgPyBCYWNraW5nU3RvcmU6OlJlbmRlckFuZEJsaXQgOiBCYWNr
aW5nU3RvcmU6OkJsaXQpOworICAgIH0gZWxzZSBpZiAoZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJs
ZSkKKyAgICAgICAgZW5zdXJlQ29udGVudFZpc2libGUoIW5ld1Zpc2libGVSZWN0Q29udGFpbnNP
bGRWaXNpYmxlUmVjdCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0RGVmYXVsdExheW91dFNpemUo
aW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIEludFNpemUgc2l6ZSh3aWR0aCwgaGVpZ2h0
KTsKKyAgICBpZiAoc2l6ZSA9PSBkLT5tX2RlZmF1bHRMYXlvdXRTaXplKQorICAgICAgICByZXR1
cm47CisKKyAgICBkLT5zZXREZWZhdWx0TGF5b3V0U2l6ZShzaXplKTsKKyAgICBib29sIG5lZWRz
TGF5b3V0ID0gZC0+c2V0Vmlld01vZGUoZC0+dmlld01vZGUoKSk7CisgICAgaWYgKG5lZWRzTGF5
b3V0KSB7CisgICAgICAgIGQtPnNldE5lZWRzTGF5b3V0KCk7CisgICAgICAgIGlmICghZC0+aXNM
b2FkaW5nKCkpCisgICAgICAgICAgICBkLT5yZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKTsKKyAgICB9
Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldERlZmF1bHRMYXlvdXRTaXplKGNvbnN0IElu
dFNpemUmIHNpemUpCit7CisgICAgSW50U2l6ZSBzY3JlZW5TaXplID0gUGxhdGZvcm06OkdyYXBo
aWNzOjpTY3JlZW46OnNpemUoKTsKKyAgICBBU1NFUlQoc2l6ZS53aWR0aCgpIDw9IHNjcmVlblNp
emUud2lkdGgoKSAmJiBzaXplLmhlaWdodCgpIDw9IHNjcmVlblNpemUuaGVpZ2h0KCkpOworICAg
IG1fZGVmYXVsdExheW91dFNpemUgPSBzaXplLmV4cGFuZGVkVG8obWluaW11bUxheW91dFNpemUp
LnNocnVua1RvKHNjcmVlblNpemUpOworfQorCitib29sIFdlYlBhZ2U6Om1vdXNlRXZlbnQoY29u
c3QgUGxhdGZvcm06Ok1vdXNlRXZlbnQmIG1vdXNlRXZlbnQsIGJvb2wqIHdoZWVsRGVsdGFBY2Nl
cHRlZCkKK3sKKyAgICBpZiAoIWQtPm1fbWFpbkZyYW1lLT52aWV3KCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIFBsdWdpblZpZXcqIHBsdWdpblZpZXcgPSBkLT5tX2Z1bGxTY3JlZW5Q
bHVnaW5WaWV3LmdldCgpOworICAgIGlmIChwbHVnaW5WaWV3KQorICAgICAgICByZXR1cm4gZC0+
ZGlzcGF0Y2hNb3VzZUV2ZW50VG9GdWxsU2NyZWVuUGx1Z2luKHBsdWdpblZpZXcsIG1vdXNlRXZl
bnQpOworCisgICAgaWYgKG1vdXNlRXZlbnQudHlwZSgpID09IFBsYXRmb3JtOjpNb3VzZUV2ZW50
OjpNb3VzZUFib3J0ZWQpIHsKKyAgICAgICAgZC0+bV9tYWluRnJhbWUtPmV2ZW50SGFuZGxlcigp
LT5zZXRNb3VzZVByZXNzZWQoZmFsc2UpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
CisgICAgZC0+bV9wbHVnaW5NYXlPcGVuTmV3VGFiID0gdHJ1ZTsKKworICAgIGQtPm1fbGFzdFVz
ZXJFdmVudFRpbWVzdGFtcCA9IGN1cnJlbnRUaW1lKCk7CisgICAgaW50IGNsaWNrQ291bnQgPSAo
ZC0+bV9zZWxlY3Rpb25IYW5kbGVyLT5pc1NlbGVjdGlvbkFjdGl2ZSgpIHx8IG1vdXNlRXZlbnQu
dHlwZSgpICE9IFBsYXRmb3JtOjpNb3VzZUV2ZW50OjpNb3VzZU1vdmUpID8gMSA6IDA7CisKKyAg
ICAvLyBTZXQgdGhlIGJ1dHRvbiB0eXBlLgorICAgIE1vdXNlQnV0dG9uIGJ1dHRvblR5cGUgPSBO
b0J1dHRvbjsKKyAgICBpZiAobW91c2VFdmVudC5pc0xlZnRCdXR0b24oKSkKKyAgICAgICAgYnV0
dG9uVHlwZSA9IExlZnRCdXR0b247CisgICAgZWxzZSBpZiAobW91c2VFdmVudC5pc1JpZ2h0QnV0
dG9uKCkpCisgICAgICAgIGJ1dHRvblR5cGUgPSBSaWdodEJ1dHRvbjsKKyAgICBlbHNlIGlmICht
b3VzZUV2ZW50LmlzTWlkZGxlQnV0dG9uKCkpCisgICAgICAgIGJ1dHRvblR5cGUgPSBNaWRkbGVC
dXR0b247CisKKyAgICAvLyBDcmVhdGUgb3VyIGV2ZW50LgorICAgIFBsYXRmb3JtTW91c2VFdmVu
dCBwbGF0Zm9ybU1vdXNlRXZlbnQoZC0+bWFwRnJvbVRyYW5zZm9ybWVkKG1vdXNlRXZlbnQucG9z
aXRpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5t
YXBGcm9tVHJhbnNmb3JtZWQobW91c2VFdmVudC5zY3JlZW5Qb3NpdGlvbigpKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvV2ViQ29yZU1vdXNlRXZlbnRUeXBl
KG1vdXNlRXZlbnQudHlwZSgpKSwgY2xpY2tDb3VudCwgYnV0dG9uVHlwZSwgUG9pbnRpbmdEZXZp
Y2UpOworICAgIGQtPm1fbGFzdE1vdXNlRXZlbnQgPSBwbGF0Zm9ybU1vdXNlRXZlbnQ7CisgICAg
Ym9vbCBzdWNjZXNzID0gZC0+aGFuZGxlTW91c2VFdmVudChwbGF0Zm9ybU1vdXNlRXZlbnQpOwor
CisgICAgaWYgKG1vdXNlRXZlbnQud2hlZWxUaWNrcygpKSB7CisgICAgICAgIFBsYXRmb3JtV2hl
ZWxFdmVudCB3aGVlbEV2ZW50KGQtPm1hcEZyb21UcmFuc2Zvcm1lZChtb3VzZUV2ZW50LnBvc2l0
aW9uKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5tYXBGcm9t
VHJhbnNmb3JtZWQobW91c2VFdmVudC5zY3JlZW5Qb3NpdGlvbigpKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgMCwgLW1vdXNlRXZlbnQud2hlZWxEZWx0YSgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAtbW91c2VFdmVudC53aGVlbFRp
Y2tzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcm9sbEJ5UGl4
ZWxXaGVlbEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxz
ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGlmICh3aGVlbERlbHRhQWNjZXB0ZWQp
CisgICAgICAgICAgICAqd2hlZWxEZWx0YUFjY2VwdGVkID0gZC0+aGFuZGxlV2hlZWxFdmVudCh3
aGVlbEV2ZW50KTsKKyAgICB9IGVsc2UgaWYgKHdoZWVsRGVsdGFBY2NlcHRlZCkKKyAgICAgICAg
KndoZWVsRGVsdGFBY2NlcHRlZCA9IGZhbHNlOworCisgICAgcmV0dXJuIHN1Y2Nlc3M7Cit9CisK
K2Jvb2wgV2ViUGFnZVByaXZhdGU6OmRpc3BhdGNoTW91c2VFdmVudFRvRnVsbFNjcmVlblBsdWdp
bihQbHVnaW5WaWV3KiBwbHVnaW4sIGNvbnN0IFBsYXRmb3JtOjpNb3VzZUV2ZW50JiBldmVudCkK
K3sKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgTlBNb3VzZUV2ZW50IG1vdXNlRXZlbnQ7CisK
KyAgICBtb3VzZUV2ZW50LnggPSBldmVudC5zY3JlZW5Qb3NpdGlvbigpLngoKTsKKyAgICBtb3Vz
ZUV2ZW50LnkgPSBldmVudC5zY3JlZW5Qb3NpdGlvbigpLnkoKTsKKworICAgIHN3aXRjaCAoZXZl
bnQudHlwZSgpKSB7CisgICAgY2FzZSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6TW91c2VCdXR0b25E
b3duOgorICAgICAgICBtb3VzZUV2ZW50LnR5cGUgPSBNT1VTRV9CVVRUT05fRE9XTjsKKyAgICAg
ICAgbV9wbHVnaW5Nb3VzZUJ1dHRvblByZXNzZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIFBsYXRmb3JtOjpNb3VzZUV2ZW50OjpNb3VzZUJ1dHRvblVwOgorICAgICAgICBtb3Vz
ZUV2ZW50LnR5cGUgPSBNT1VTRV9CVVRUT05fVVA7CisgICAgICAgIG1fcGx1Z2luTW91c2VCdXR0
b25QcmVzc2VkID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUGxhdGZvcm06Ok1v
dXNlRXZlbnQ6Ok1vdXNlTW92ZToKKyAgICAgICAgbW91c2VFdmVudC50eXBlID0gTU9VU0VfTU9U
SU9OOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgbW91c2VFdmVudC5mbGFncyA9IDA7CisgICAgbW91c2VFdmVudC5idXR0
b24gPSBtX3BsdWdpbk1vdXNlQnV0dG9uUHJlc3NlZDsKKworICAgIG5wRXZlbnQudHlwZSA9IE5Q
X01vdXNlRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gJm1vdXNlRXZlbnQ7CisKKyAgICByZXR1
cm4gcGx1Z2luLT5kaXNwYXRjaEZ1bGxTY3JlZW5OUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lk
IFdlYlBhZ2U6OnNldFZpcnR1YWxLZXlib2FyZFZpc2libGUoYm9vbCB2aXNpYmxlKQoreworICAg
IGQtPnNob3dWaXJ0dWFsS2V5Ym9hcmQodmlzaWJsZSk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZh
dGU6OmhhbmRsZU1vdXNlRXZlbnQoUGxhdGZvcm1Nb3VzZUV2ZW50JiBtb3VzZUV2ZW50KQorewor
ICAgIEV2ZW50SGFuZGxlciogZXZlbnRIYW5kbGVyID0gbV9tYWluRnJhbWUtPmV2ZW50SGFuZGxl
cigpOworCisgICAgaWYgKG1vdXNlRXZlbnQuZXZlbnRUeXBlKCkgPT0gTW91c2VFdmVudE1vdmVk
KQorICAgICAgICByZXR1cm4gZXZlbnRIYW5kbGVyLT5tb3VzZU1vdmVkKG1vdXNlRXZlbnQpOwor
CisgICAgaWYgKG1vdXNlRXZlbnQuZXZlbnRUeXBlKCkgPT0gTW91c2VFdmVudFNjcm9sbCkKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBOb2RlKiBub2RlID0gMDsKKyAgICBpZiAobW91c2VF
dmVudC5pbnB1dE1ldGhvZCgpID09IFRvdWNoU2NyZWVuKSB7CisgICAgICAgIGNvbnN0IEZhdEZp
bmdlcnNSZXN1bHQgbGFzdEZhdEZpbmdlcnNSZXN1bHQgPSBtX3RvdWNoRXZlbnRIYW5kbGVyLT5s
YXN0RmF0RmluZ2Vyc1Jlc3VsdCgpOworCisgICAgICAgIC8vIEZhdCBmaW5nZXJzIGNhbiBkZWFs
IHdpdGggc2hhZG93IGNvbnRlbnQuCisgICAgICAgIGlmIChub2RlID0gbGFzdEZhdEZpbmdlcnNS
ZXN1bHQudmFsaWROb2RlKCkpCisgICAgICAgICAgICBub2RlID0gbm9kZS0+c2hhZG93QW5jZXN0
b3JOb2RlKCk7CisgICAgfQorCisgICAgaWYgKCFub2RlKSB7CisgICAgICAgIEhpdFRlc3RSZXN1
bHQgcmVzdWx0ID0gZXZlbnRIYW5kbGVyLT5oaXRUZXN0UmVzdWx0QXRQb2ludChtYXBGcm9tVmll
d3BvcnRUb0NvbnRlbnRzKG1vdXNlRXZlbnQucG9zKCkpLCBmYWxzZSAvKmFsbG93U2hhZG93Q29u
dGVudCovKTsKKyAgICAgICAgbm9kZSA9IHJlc3VsdC5pbm5lck5vZGUoKTsKKyAgICB9CisKKyAg
ICBpZiAobW91c2VFdmVudC5ldmVudFR5cGUoKSA9PSBNb3VzZUV2ZW50UHJlc3NlZCkgeworICAg
ICAgICBpZiAobV9pbnB1dEhhbmRsZXItPndpbGxPcGVuUG9wdXBGb3JOb2RlKG5vZGUpKSB7Cisg
ICAgICAgICAgICAvLyBEbyBub3QgYWxsb3cgYW55IGh1bWFuIGdlbmVyYXRlZCBtb3VzZSBvciBr
ZXlib2FyZCBldmVudHMgdG8gc2VsZWN0IDxvcHRpb24+cyBpbiB0aGUgbGlzdCBib3gKKyAgICAg
ICAgICAgIC8vIGJlY2F1c2Ugd2UgdXNlIGEgcG9wIHVwIGRpYWxvZyB0byBoYW5kbGUgdGhlIGFj
dHVhbCBzZWxlY3Rpb25zLiBUaGlzIHByZXZlbnRzIG9wdGlvbnMgZnJvbQorICAgICAgICAgICAg
Ly8gYmVpbmcgc2VsZWN0ZWQgcHJpb3IgdG8gZGlzcGxheWluZyB0aGUgcG9wIHVwIGRpYWxvZy4g
VGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0Ym94IGFyZSBmb3IKKyAgICAgICAgICAgIC8vIGRpc3Bs
YXkgb25seS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBGSVhNRTogV2UgZXhwbGlj
aXRseSBkbyBub3QgZm9yd2FyZCB0aGlzIGV2ZW50IHRvIFdlYkNvcmUgc28gYXMgdG8gcHJlc2Vy
dmUgc3ltbWV0cnkgd2l0aAorICAgICAgICAgICAgLy8gdGhlIE1vdXNlRXZlbnRSZWxlYXNlZCBo
YW5kbGluZyAoYmVsb3cpLiBUaGlzIGhhcyB0aGUgc2lkZS1lZmZlY3QgdGhhdCBtb3VzZWRvd24g
ZXZlbnRzCisgICAgICAgICAgICAvLyBhcmUgbm90IGZpcmVkIGZvciBodW1hbiBnZW5lcmF0ZWQg
bW91c2UgcHJlc3MgZXZlbnRzLiBTZWUgUklNIEJ1ZyAjMTU3OS4KKworICAgICAgICAgICAgLy8g
V2UgZG8gZm9jdXMgPHNlbGVjdD4vPG9wdGlvbj4gb24gbW91c2UgZG93biBzbyB0aGF0IGEgRm9j
dXMgZXZlbnQgaXMgZmlyZWQgYW5kIGhhdmUgdGhlCisgICAgICAgICAgICAvLyBlbGVtZW50IHBh
aW50ZWQgaW4gaXRzIGZvY3VzIHN0YXRlIG9uIHJlcGFpbnQuCisgICAgICAgICAgICBBU1NFUlQo
bm9kZS0+aXNFbGVtZW50Tm9kZSgpKTsKKyAgICAgICAgICAgIGlmIChub2RlLT5pc0VsZW1lbnRO
b2RlKCkpIHsKKyAgICAgICAgICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8
RWxlbWVudCo+KG5vZGUpOworICAgICAgICAgICAgICAgIGVsZW1lbnQtPmZvY3VzKCk7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZXZlbnRIYW5kbGVyLT5oYW5k
bGVNb3VzZVByZXNzRXZlbnQobW91c2VFdmVudCk7CisgICAgfSBlbHNlIGlmIChtb3VzZUV2ZW50
LmV2ZW50VHlwZSgpID09IE1vdXNlRXZlbnRSZWxlYXNlZCkgeworICAgICAgICAvLyBGSVhNRTog
Rm9yIDxzZWxlY3Q+IGFuZCA8b3B0aW9ucz4gZWxlbWVudHMsIHdlIGV4cGxpY2l0bHkgZG8gbm90
IGZvcndhcmQgdGhpcyBldmVudCB0byBXZWJDb3JlIHNvCisgICAgICAgIC8vIGFzIHRvIHByZXNl
cnZlIHN5bW1ldHJ5IHdpdGggdGhlIE1vdXNlRXZlbnRQcmVzc2VkIGhhbmRsaW5nIChhYm92ZSku
IFRoaXMgaGFzIHRoZSBzaWRlLWVmZmVjdCB0aGF0CisgICAgICAgIC8vIG1vdXNldXAgZXZlbnRz
IGFyZSBub3QgZmlyZWQgb24gc3VjaCBlbGVtZW50cyBmb3IgaHVtYW4gZ2VuZXJhdGVkIG1vdXNl
IHJlbGVhc2UgZXZlbnRzLiBTZWUgUklNIEJ1ZyAjMTU3OS4KKyAgICAgICAgaWYgKCFtX2lucHV0
SGFuZGxlci0+ZGlkTm9kZU9wZW5Qb3B1cChub2RlKSkKKyAgICAgICAgICAgIGV2ZW50SGFuZGxl
ci0+aGFuZGxlTW91c2VSZWxlYXNlRXZlbnQobW91c2VFdmVudCk7CisgICAgfQorCisgICAgcmV0
dXJuIHRydWU7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmhhbmRsZVdoZWVsRXZlbnQoUGxh
dGZvcm1XaGVlbEV2ZW50JiB3aGVlbEV2ZW50KQoreworICAgIEV2ZW50SGFuZGxlciogZXZlbnRI
YW5kbGVyID0gbV9tYWluRnJhbWUtPmV2ZW50SGFuZGxlcigpOworCisgICAgcmV0dXJuIGV2ZW50
SGFuZGxlci0+aGFuZGxlV2hlZWxFdmVudCh3aGVlbEV2ZW50KTsKK30KKworYm9vbCBXZWJQYWdl
Ojp0b3VjaEV2ZW50KGNvbnN0IFBsYXRmb3JtOjpUb3VjaEV2ZW50JiBldmVudCkKK3sKKyNpZiBE
RUJVR19UT1VDSF9FVkVOVFMKKyAgICBzd2l0Y2ggKGV2ZW50Lm1fdHlwZSkgeworICAgIGNhc2Ug
UGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNoRW5kOgorICAgICAgICBQbGF0Zm9ybTo6bG9nKFBs
YXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiV2ViUGFnZTo6dG91Y2hFdmVudCBUb3VjaCBFbmQi
KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hT
dGFydDoKKyAgICAgICAgUGxhdGZvcm06OmxvZyhQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwg
IldlYlBhZ2U6OnRvdWNoRXZlbnQgVG91Y2ggU3RhcnQiKTsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hNb3ZlOgorICAgICAgICBQbGF0Zm9ybTo6
bG9nKFBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiV2ViUGFnZTo6dG91Y2hFdmVudCBUb3Vj
aCBNb3ZlIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUGxhdGZvcm06OlRvdWNoRXZlbnQ6
OlRvdWNoQ2FuY2VsOgorICAgICAgICBQbGF0Zm9ybTo6bG9nKFBsYXRmb3JtOjpMb2dMZXZlbENy
aXRpY2FsLCAiV2ViUGFnZTo6dG91Y2hDYW5jZWwgVG91Y2ggQ2FuY2VsIik7CisgICAgICAgIGJy
ZWFrOworICAgIH0KKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBldmVudC5tX3BvaW50
cy5zaXplKCk7IGkrKykgeworICAgICAgICBzd2l0Y2ggKGV2ZW50Lm1fcG9pbnRzW2ldLm1fc3Rh
dGUpIHsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hQb2ludDo6VG91Y2hQcmVzc2VkOgor
ICAgICAgICAgICAgUGxhdGZvcm06OmxvZyhQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIldl
YlBhZ2U6OnRvdWNoRXZlbnQgJWQgVG91Y2ggUHJlc3NlZCAoJWQsICVkKSIsIGV2ZW50Lm1fcG9p
bnRzW2ldLm1faWQsIGV2ZW50Lm1fcG9pbnRzW2ldLm1fcG9zLngoKSwgZXZlbnQubV9wb2ludHNb
aV0ubV9wb3MueSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBsYXRmb3Jt
OjpUb3VjaFBvaW50OjpUb3VjaFJlbGVhc2VkOgorICAgICAgICAgICAgUGxhdGZvcm06OmxvZyhQ
bGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIldlYlBhZ2U6OnRvdWNoRXZlbnQgJWQgVG91Y2gg
UmVsZWFzZWQgKCVkLCAlZCkiLCBldmVudC5tX3BvaW50c1tpXS5tX2lkLCBldmVudC5tX3BvaW50
c1tpXS5tX3Bvcy54KCksIGV2ZW50Lm1fcG9pbnRzW2ldLm1fcG9zLnkoKSk7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hQb2ludDo6VG91Y2hNb3ZlZDoK
KyAgICAgICAgICAgIFBsYXRmb3JtOjpsb2coUGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJX
ZWJQYWdlOjp0b3VjaEV2ZW50ICVkIFRvdWNoIE1vdmVkICglZCwgJWQpIiwgZXZlbnQubV9wb2lu
dHNbaV0ubV9pZCwgZXZlbnQubV9wb2ludHNbaV0ubV9wb3MueCgpLCBldmVudC5tX3BvaW50c1tp
XS5tX3Bvcy55KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm06
OlRvdWNoUG9pbnQ6OlRvdWNoU3RhdGlvbmFyeToKKyAgICAgICAgICAgIFBsYXRmb3JtOjpsb2co
UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJXZWJQYWdlOjp0b3VjaEV2ZW50ICVkIFRvdWNo
IFN0YXRpb25hcnkgKCVkLCAlZCkiLCBldmVudC5tX3BvaW50c1tpXS5tX2lkLCBldmVudC5tX3Bv
aW50c1tpXS5tX3Bvcy54KCksIGV2ZW50Lm1fcG9pbnRzW2ldLm1fcG9zLnkoKSk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjaWYgRU5BQkxFKFRPVUNI
X0VWRU5UUykKKyAgICBQbHVnaW5WaWV3KiBwbHVnaW5WaWV3ID0gZC0+bV9mdWxsU2NyZWVuUGx1
Z2luVmlldy5nZXQoKTsKKyAgICBpZiAocGx1Z2luVmlldykKKyAgICAgICAgcmV0dXJuIGQtPmRp
c3BhdGNoVG91Y2hFdmVudFRvRnVsbFNjcmVlblBsdWdpbihwbHVnaW5WaWV3LCBldmVudCk7CisK
KyAgICBpZiAoIWQtPm1fbWFpbkZyYW1lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBQ
bGF0Zm9ybTo6VG91Y2hFdmVudCB0RXZlbnQgPSBldmVudDsKKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgZXZlbnQubV9wb2ludHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgdEV2ZW50Lm1f
cG9pbnRzW2ldLm1fcG9zID0gZC0+bWFwRnJvbVRyYW5zZm9ybWVkKHRFdmVudC5tX3BvaW50c1tp
XS5tX3Bvcyk7CisgICAgICAgIHRFdmVudC5tX3BvaW50c1tpXS5tX3NjcmVlblBvcyA9IGQtPm1h
cEZyb21UcmFuc2Zvcm1lZCh0RXZlbnQubV9wb2ludHNbaV0ubV9zY3JlZW5Qb3MpOworICAgIH0K
KworICAgIFBsYXRmb3JtOjpHZXN0dXJlIHRhcEdlc3R1cmU7CisgICAgaWYgKGV2ZW50Lmhhc0dl
c3R1cmUoUGxhdGZvcm06Okdlc3R1cmU6OlNpbmdsZVRhcCkpCisgICAgICAgIGQtPm1fcGx1Z2lu
TWF5T3Blbk5ld1RhYiA9IHRydWU7CisgICAgZWxzZSBpZiAodEV2ZW50Lm1fdHlwZSA9PSBQbGF0
Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hTdGFydCB8fCB0RXZlbnQubV90eXBlID09IFBsYXRmb3Jt
OjpUb3VjaEV2ZW50OjpUb3VjaENhbmNlbCkKKyAgICAgICAgZC0+bV9wbHVnaW5NYXlPcGVuTmV3
VGFiID0gZmFsc2U7CisKKyAgICBib29sIGhhbmRsZWQgPSBmYWxzZTsKKworICAgIGlmIChkLT5t
X25lZWRUb3VjaEV2ZW50cyAmJiAhZXZlbnQuaGFzR2VzdHVyZShQbGF0Zm9ybTo6R2VzdHVyZTo6
SW5qZWN0ZWQpKQorICAgICAgICBoYW5kbGVkID0gZC0+bV9tYWluRnJhbWUtPmV2ZW50SGFuZGxl
cigpLT5oYW5kbGVUb3VjaEV2ZW50KFBsYXRmb3JtVG91Y2hFdmVudCgmdEV2ZW50KSk7CisKKyAg
ICAvLyBVbnByZXNzIG1vdXNlIGlmIHRvdWNoIGVuZCBpcyBjb25zdW1lZCBieSBhIEphdmFTY3Jp
cHQgdG91Y2ggaGFuZGxlciwgb3RoZXJ3aXNlIHRoZSBtb3VzZSBzdGF0ZSB3aWxsIHJlbWFpbiBw
cmVzc2VkCisgICAgLy8gd2hpY2ggY291bGQgZWl0aGVyIG1lc3MgdXAgdGhlIGludGVybmFsIG1v
dXNlIHN0YXRlIG9yIHN0YXJ0IHRleHQgc2VsZWN0aW9uIG9uIHRoZSBuZXh0IG1vdXNlIG1vdmUv
ZG93bi4KKyAgICBpZiAodEV2ZW50Lm1fdHlwZSA9PSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91
Y2hFbmQgJiYgaGFuZGxlZCAmJiBkLT5tX21haW5GcmFtZS0+ZXZlbnRIYW5kbGVyKCktPm1vdXNl
UHJlc3NlZCgpKQorICAgICAgICBkLT5tX3RvdWNoRXZlbnRIYW5kbGVyLT50b3VjaEV2ZW50Q2Fu
Y2VsKCk7CisKKyAgICBpZiAoZC0+bV9wcmV2ZW50RGVmYXVsdE9uVG91Y2hTdGFydCkgeworICAg
ICAgICBpZiAodEV2ZW50Lm1fdHlwZSA9PSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hFbmQg
fHwgdEV2ZW50Lm1fdHlwZSA9PSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hDYW5jZWwpCisg
ICAgICAgICAgICBkLT5tX3ByZXZlbnREZWZhdWx0T25Ub3VjaFN0YXJ0ID0gZmFsc2U7CisgICAg
ICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChoYW5kbGVkKSB7CisgICAgICAgIGlm
ICh0RXZlbnQubV90eXBlID09IFBsYXRmb3JtOjpUb3VjaEV2ZW50OjpUb3VjaFN0YXJ0KQorICAg
ICAgICAgICAgZC0+bV9wcmV2ZW50RGVmYXVsdE9uVG91Y2hTdGFydCA9IHRydWU7CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChldmVudC5oYXNHZXN0dXJlKFBsYXRmb3Jt
OjpHZXN0dXJlOjpUb3VjaEhvbGQpKQorICAgICAgICBkLT5tX3RvdWNoRXZlbnRIYW5kbGVyLT50
b3VjaEhvbGRFdmVudCgpOworI2VuZGlmCisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQg
V2ViUGFnZTo6c2V0U2Nyb2xsT3JpZ2luUG9pbnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBw
b2ludCkKK3sKKyAgICBQbGF0Zm9ybTo6SW50UG9pbnQgdW50cmFuc2Zvcm1lZFBvaW50ID0gZC0+
bWFwRnJvbVRyYW5zZm9ybWVkKHBvaW50KTsKKyAgICBkLT5zZXRTY3JvbGxPcmlnaW5Qb2ludCh1
bnRyYW5zZm9ybWVkUG9pbnQpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXRTY3JvbGxP
cmlnaW5Qb2ludChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIHBvaW50KQoreworICAgIG1faW5S
ZWdpb25TY3JvbGxTdGFydGluZ05vZGUgPSAwOworCisgICAgaWYgKCFtX2hhc0luUmVnaW9uU2Ny
b2xsYWJsZUFyZWFzKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2NsaWVudC0+bm90aWZ5SW5S
ZWdpb25TY3JvbGxpbmdTdGFydGluZ1BvaW50Q2hhbmdlZChpblJlZ2lvblNjcm9sbGFibGVBcmVh
c0ZvclBvaW50KHBvaW50KSk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmRpc3BhdGNoVG91
Y2hFdmVudFRvRnVsbFNjcmVlblBsdWdpbihQbHVnaW5WaWV3KiBwbHVnaW4sIGNvbnN0IFBsYXRm
b3JtOjpUb3VjaEV2ZW50JiBldmVudCkKK3sKKyAgICBOUFRvdWNoRXZlbnQgbnBUb3VjaEV2ZW50
OworCisgICAgaWYgKGV2ZW50Lmhhc0dlc3R1cmUoUGxhdGZvcm06Okdlc3R1cmU6OkRvdWJsZVRh
cCkpCisgICAgICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hfRVZFTlRfRE9VQkxFVEFQOwor
ICAgIGVsc2UgaWYgKGV2ZW50Lmhhc0dlc3R1cmUoUGxhdGZvcm06Okdlc3R1cmU6OlRvdWNoSG9s
ZCkpCisgICAgICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hfRVZFTlRfVE9VQ0hIT0xEOwor
ICAgIGVsc2UgeworICAgICAgICBzd2l0Y2ggKGV2ZW50Lm1fdHlwZSkgeworICAgICAgICBjYXNl
IFBsYXRmb3JtOjpUb3VjaEV2ZW50OjpUb3VjaFN0YXJ0OgorICAgICAgICAgICAgbnBUb3VjaEV2
ZW50LnR5cGUgPSBUT1VDSF9FVkVOVF9TVEFSVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIFBsYXRmb3JtOjpUb3VjaEV2ZW50OjpUb3VjaEVuZDoKKyAgICAgICAgICAgIG5wVG91
Y2hFdmVudC50eXBlID0gVE9VQ0hfRVZFTlRfRU5EOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UgUGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNoTW92ZToKKyAgICAgICAgICAgIG5w
VG91Y2hFdmVudC50eXBlID0gVE9VQ0hfRVZFTlRfTU9WRTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIFBsYXRmb3JtOjpUb3VjaEV2ZW50OjpUb3VjaENhbmNlbDoKKyAgICAgICAg
ICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hfRVZFTlRfQ0FOQ0VMOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICBucFRvdWNoRXZlbnQucG9pbnRzID0gMDsKKyAgICBucFRvdWNo
RXZlbnQuc2l6ZSA9IGV2ZW50Lm1fcG9pbnRzLnNpemUoKTsKKyAgICBpZiAobnBUb3VjaEV2ZW50
LnNpemUpIHsKKyAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50cyA9IG5ldyBOUFRvdWNoUG9pbnRb
bnBUb3VjaEV2ZW50LnNpemVdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5wVG91Y2hF
dmVudC5zaXplOyBpKyspIHsKKyAgICAgICAgICAgIG5wVG91Y2hFdmVudC5wb2ludHNbaV0udG91
Y2hJZCA9IGV2ZW50Lm1fcG9pbnRzW2ldLm1faWQ7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQu
cG9pbnRzW2ldLmNsaWVudFggPSBldmVudC5tX3BvaW50c1tpXS5tX3NjcmVlblBvcy54KCk7Cisg
ICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLmNsaWVudFkgPSBldmVudC5tX3BvaW50
c1tpXS5tX3NjcmVlblBvcy55KCk7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ld
LnNjcmVlblggPSBldmVudC5tX3BvaW50c1tpXS5tX3NjcmVlblBvcy54KCk7CisgICAgICAgICAg
ICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLnNjcmVlblkgPSBldmVudC5tX3BvaW50c1tpXS5tX3Nj
cmVlblBvcy55KCk7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLnBhZ2VYID0g
ZXZlbnQubV9wb2ludHNbaV0ubV9wb3MueCgpOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBv
aW50c1tpXS5wYWdlWSA9IGV2ZW50Lm1fcG9pbnRzW2ldLm1fcG9zLnkoKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIE5QRXZlbnQgbnBFdmVudDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9Ub3Vj
aEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9ICZucFRvdWNoRXZlbnQ7CisKKyAgICBib29sIGhh
bmRsZWQgPSBwbHVnaW4tPmRpc3BhdGNoRnVsbFNjcmVlbk5QRXZlbnQobnBFdmVudCk7CisKKyAg
ICBpZiAobnBUb3VjaEV2ZW50LnR5cGUgPT0gVE9VQ0hfRVZFTlRfRE9VQkxFVEFQICYmICFoYW5k
bGVkKSB7CisgICAgICAgIC8vIFNlbmQgVG91Y2ggVXAgaWYgZG91YmxlIHRhcCBub3QgY29uc3Vt
ZWQuCisgICAgICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hfRVZFTlRfRU5EOworICAgICAg
ICBucEV2ZW50LmRhdGEgPSAmbnBUb3VjaEV2ZW50OworICAgICAgICBoYW5kbGVkID0gcGx1Z2lu
LT5kaXNwYXRjaEZ1bGxTY3JlZW5OUEV2ZW50KG5wRXZlbnQpOworICAgIH0KKyAgICBkZWxldGVb
XSBucFRvdWNoRXZlbnQucG9pbnRzOworICAgIHJldHVybiBoYW5kbGVkOworfQorCitib29sIFdl
YlBhZ2U6OnRvdWNoUG9pbnRBc01vdXNlRXZlbnQoY29uc3QgUGxhdGZvcm06OlRvdWNoUG9pbnQm
IHBvaW50KQoreworICAgIFBsdWdpblZpZXcqIHBsdWdpblZpZXcgPSBkLT5tX2Z1bGxTY3JlZW5Q
bHVnaW5WaWV3LmdldCgpOworICAgIGlmIChwbHVnaW5WaWV3KQorICAgICAgICByZXR1cm4gZC0+
ZGlzcGF0Y2hUb3VjaFBvaW50QXNNb3VzZUV2ZW50VG9GdWxsU2NyZWVuUGx1Z2luKHBsdWdpblZp
ZXcsIHBvaW50KTsKKworICAgIGQtPm1fbGFzdFVzZXJFdmVudFRpbWVzdGFtcCA9IGN1cnJlbnRU
aW1lKCk7CisKKyAgICBQbGF0Zm9ybTo6VG91Y2hQb2ludCB0UG9pbnQgPSBwb2ludDsKKyAgICB0
UG9pbnQubV9wb3MgPSBkLT5tYXBGcm9tVHJhbnNmb3JtZWQodFBvaW50Lm1fcG9zKTsKKyAgICB0
UG9pbnQubV9zY3JlZW5Qb3MgPSBkLT5tYXBGcm9tVHJhbnNmb3JtZWQodFBvaW50Lm1fc2NyZWVu
UG9zKTsKKworICAgIHJldHVybiBkLT5tX3RvdWNoRXZlbnRIYW5kbGVyLT5oYW5kbGVUb3VjaFBv
aW50KHRQb2ludCk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmRpc3BhdGNoVG91Y2hQb2lu
dEFzTW91c2VFdmVudFRvRnVsbFNjcmVlblBsdWdpbihQbHVnaW5WaWV3KiBwbHVnaW5WaWV3LCBj
b25zdCBQbGF0Zm9ybTo6VG91Y2hQb2ludCYgcG9pbnQpCit7CisgICAgTlBFdmVudCBucEV2ZW50
OworICAgIE5QTW91c2VFdmVudCBtb3VzZTsKKworICAgIHN3aXRjaCAocG9pbnQubV9zdGF0ZSkg
eworICAgIGNhc2UgUGxhdGZvcm06OlRvdWNoUG9pbnQ6OlRvdWNoUHJlc3NlZDoKKyAgICAgICAg
bW91c2UudHlwZSA9IE1PVVNFX0JVVFRPTl9ET1dOOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IFBsYXRmb3JtOjpUb3VjaFBvaW50OjpUb3VjaFJlbGVhc2VkOgorICAgICAgICBtb3VzZS50eXBl
ID0gTU9VU0VfQlVUVE9OX1VQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBsYXRmb3JtOjpU
b3VjaFBvaW50OjpUb3VjaE1vdmVkOgorICAgICAgICBtb3VzZS50eXBlID0gTU9VU0VfTU9USU9O
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBsYXRmb3JtOjpUb3VjaFBvaW50OjpUb3VjaFN0
YXRpb25hcnk6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtb3VzZS54ID0g
cG9pbnQubV9zY3JlZW5Qb3MueCgpOworICAgIG1vdXNlLnkgPSBwb2ludC5tX3NjcmVlblBvcy55
KCk7CisgICAgbW91c2UuYnV0dG9uID0gbW91c2UudHlwZSAhPSBNT1VTRV9CVVRUT05fVVA7Cisg
ICAgbW91c2UuZmxhZ3MgPSAwOworICAgIG5wRXZlbnQudHlwZSA9IE5QX01vdXNlRXZlbnQ7Cisg
ICAgbnBFdmVudC5kYXRhID0gJm1vdXNlOworCisgICAgcmV0dXJuIHBsdWdpblZpZXctPmRpc3Bh
dGNoRnVsbFNjcmVlbk5QRXZlbnQobnBFdmVudCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6dG91Y2hF
dmVudENhbmNlbCgpCit7CisgICAgZC0+bV9wbHVnaW5NYXlPcGVuTmV3VGFiID0gZmFsc2U7Cisg
ICAgZC0+bV90b3VjaEV2ZW50SGFuZGxlci0+dG91Y2hFdmVudENhbmNlbCgpOworfQorCit2b2lk
IFdlYlBhZ2U6OnRvdWNoRXZlbnRDYW5jZWxBbmRDbGVhckZvY3VzZWROb2RlKCkKK3sKKyAgICBk
LT5tX3RvdWNoRXZlbnRIYW5kbGVyLT50b3VjaEV2ZW50Q2FuY2VsQW5kQ2xlYXJGb2N1c2VkTm9k
ZSgpOworfQorCitGcmFtZSogV2ViUGFnZVByaXZhdGU6OmZvY3VzZWRPck1haW5GcmFtZSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRPck1h
aW5GcmFtZSgpOworfQorCitGcmFtZSogV2ViUGFnZVByaXZhdGU6Om1haW5GcmFtZSgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIG1fbWFpbkZyYW1lOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpj
bGVhckZvY3VzTm9kZSgpCit7CisgICAgRnJhbWUqIGZyYW1lID0gZm9jdXNlZE9yTWFpbkZyYW1l
KCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOworICAgIEFTU0VSVChmcmFtZS0+
ZG9jdW1lbnQoKSk7CisKKyAgICBpZiAoZnJhbWUtPmRvY3VtZW50KCktPmZvY3VzZWROb2RlKCkp
CisgICAgICAgIGZyYW1lLT5wYWdlKCktPmZvY3VzQ29udHJvbGxlcigpLT5zZXRGb2N1c2VkTm9k
ZSgwLCBmcmFtZSk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OnNjcm9sbE5vZGVSZWN1cnNp
dmVseShOb2RlKiBub2RlLCBjb25zdCBJbnRTaXplJiBkZWx0YSkKK3sKKyAgICBpZiAoZGVsdGEu
aXNaZXJvKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFub2RlKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbm9kZS0+cmVu
ZGVyZXIoKTsKKyAgICBpZiAoIXJlbmRlcmVyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBGcmFtZVZpZXcqIHZpZXcgPSByZW5kZXJlci0+dmlldygpLT5mcmFtZVZpZXcoKTsKKyAgICBp
ZiAoIXZpZXcpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFRyeSBzY3JvbGxpbmcg
dGhlIHJlbmRlcmVyLgorICAgIGlmIChzY3JvbGxSZW5kZXJlcihyZW5kZXJlciwgZGVsdGEpKQor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFdlJ3ZlIGhpdCB0aGUgcGFnZSwgZG9uJ3Qg
c2Nyb2xsIGl0IGFuZCByZXR1cm4gZmFsc2UuCisgICAgaWYgKHZpZXcgPT0gbV9tYWluRnJhbWUt
PnZpZXcoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVHJ5IHNjcm9sbGluZyB0
aGUgRnJhbWVWaWV3LgorICAgIGlmIChjYW5TY3JvbGxJbm5lckZyYW1lKHZpZXctPmZyYW1lKCkp
KSB7CisgICAgICAgIEludFNpemUgdmlld0RlbHRhID0gZGVsdGE7CisgICAgICAgIEludFBvaW50
IG5ld1ZpZXdPZmZzZXQgPSB2aWV3LT5zY3JvbGxQb3NpdGlvbigpOworICAgICAgICBJbnRQb2lu
dCBtYXhWaWV3T2Zmc2V0ID0gdmlldy0+bWF4aW11bVNjcm9sbFBvc2l0aW9uKCk7CisgICAgICAg
IGFkanVzdFNjcm9sbERlbHRhKG1heFZpZXdPZmZzZXQsIG5ld1ZpZXdPZmZzZXQsIHZpZXdEZWx0
YSk7CisKKyAgICAgICAgaWYgKCF2aWV3RGVsdGEuaXNaZXJvKCkpIHsKKyAgICAgICAgICAgIHZp
ZXctPnNldENhbkJsaXRPblNjcm9sbChmYWxzZSk7CisKKyAgICAgICAgICAgIEJhY2tpbmdTdG9y
ZUNsaWVudCogYmFja2luZ1N0b3JlQ2xpZW50ID0gYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUo
dmlldy0+ZnJhbWUoKSk7CisgICAgICAgICAgICBpZiAoYmFja2luZ1N0b3JlQ2xpZW50KSB7Cisg
ICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlQ2xpZW50LT5zZXRJc0NsaWVudEdlbmVyYXRlZFNj
cm9sbCh0cnVlKTsKKyAgICAgICAgICAgICAgICBiYWNraW5nU3RvcmVDbGllbnQtPnNldElzU2Ny
b2xsTm90aWZpY2F0aW9uU3VwcHJlc3NlZCh0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgbV9pblJlZ2lvblNjcm9sbFN0YXJ0aW5nTm9kZSA9IHZpZXctPmZyYW1lKCktPmRvY3Vt
ZW50KCk7CisKKyAgICAgICAgICAgIHZpZXctPnNjcm9sbEJ5KHZpZXdEZWx0YSk7CisKKyAgICAg
ICAgICAgIGlmIChiYWNraW5nU3RvcmVDbGllbnQpIHsKKyAgICAgICAgICAgICAgICBiYWNraW5n
U3RvcmVDbGllbnQtPnNldElzQ2xpZW50R2VuZXJhdGVkU2Nyb2xsKGZhbHNlKTsKKyAgICAgICAg
ICAgICAgICBiYWNraW5nU3RvcmVDbGllbnQtPnNldElzU2Nyb2xsTm90aWZpY2F0aW9uU3VwcHJl
c3NlZChmYWxzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICB9CisgICAgfQorCisgICAgLy8gVHJ5IHNjcm9sbGluZyB0aGUgbm9kZSBvZiB0aGUg
ZW5jbG9zaW5nIGZyYW1lLgorICAgIEZyYW1lKiBmcmFtZSA9IG5vZGUtPmRvY3VtZW50KCktPmZy
YW1lKCk7CisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIE5vZGUqIG93bmVyTm9kZSA9IGZyYW1l
LT5vd25lckVsZW1lbnQoKTsKKyAgICAgICAgaWYgKHNjcm9sbE5vZGVSZWN1cnNpdmVseShvd25l
ck5vZGUsIGRlbHRhKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJl
dHVybiBmYWxzZTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6YWRqdXN0U2Nyb2xsRGVsdGEo
Y29uc3QgSW50UG9pbnQmIG1heE9mZnNldCwgY29uc3QgSW50UG9pbnQmIGN1cnJlbnRPZmZzZXQs
IEludFNpemUmIGRlbHRhKSBjb25zdAoreworICAgIGlmIChjdXJyZW50T2Zmc2V0LngoKSArIGRl
bHRhLndpZHRoKCkgPiBtYXhPZmZzZXQueCgpKQorICAgICAgICBkZWx0YS5zZXRXaWR0aChtaW4o
bWF4T2Zmc2V0LngoKSAtIGN1cnJlbnRPZmZzZXQueCgpLCBkZWx0YS53aWR0aCgpKSk7CisKKyAg
ICBpZiAoY3VycmVudE9mZnNldC54KCkgKyBkZWx0YS53aWR0aCgpIDwgMCkKKyAgICAgICAgZGVs
dGEuc2V0V2lkdGgobWF4KC1jdXJyZW50T2Zmc2V0LngoKSwgZGVsdGEud2lkdGgoKSkpOworCisg
ICAgaWYgKGN1cnJlbnRPZmZzZXQueSgpICsgZGVsdGEuaGVpZ2h0KCkgPiBtYXhPZmZzZXQueSgp
KQorICAgICAgICBkZWx0YS5zZXRIZWlnaHQobWluKG1heE9mZnNldC55KCkgLSBjdXJyZW50T2Zm
c2V0LnkoKSwgZGVsdGEuaGVpZ2h0KCkpKTsKKworICAgIGlmIChjdXJyZW50T2Zmc2V0LnkoKSAr
IGRlbHRhLmhlaWdodCgpIDwgMCkKKyAgICAgICAgZGVsdGEuc2V0SGVpZ2h0KG1heCgtY3VycmVu
dE9mZnNldC55KCksIGRlbHRhLmhlaWdodCgpKSk7Cit9CisKK3N0YXRpYyBOb2RlKiBlbmNsb3Np
bmdMYXllck5vZGUoUmVuZGVyTGF5ZXIqKTsKKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6c2Nyb2xs
UmVuZGVyZXIoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgSW50U2l6ZSYgZGVsdGEpCit7
CisgICAgUmVuZGVyTGF5ZXIqIGxheWVyID0gcmVuZGVyZXItPmVuY2xvc2luZ0xheWVyKCk7Cisg
ICAgaWYgKCFsYXllcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVHJ5IHRvIHNj
cm9sbCBsYXllci4KKyAgICBib29sIHJlc3RyaWN0ZWRCeUxpbmVDbGFtcCA9IGZhbHNlOworICAg
IGlmIChyZW5kZXJlci0+cGFyZW50KCkpCisgICAgICAgIHJlc3RyaWN0ZWRCeUxpbmVDbGFtcCA9
ICFyZW5kZXJlci0+cGFyZW50KCktPnN0eWxlKCktPmxpbmVDbGFtcCgpLmlzTm9uZSgpOworCisg
ICAgaWYgKHJlbmRlcmVyLT5oYXNPdmVyZmxvd0NsaXAoKSAmJiAhcmVzdHJpY3RlZEJ5TGluZUNs
YW1wKSB7CisgICAgICAgIEludFNpemUgbGF5ZXJEZWx0YSA9IGRlbHRhOworICAgICAgICBJbnRQ
b2ludCBtYXhPZmZzZXQobGF5ZXItPnNjcm9sbFdpZHRoKCkgLSBsYXllci0+cmVuZGVyQm94KCkt
PmNsaWVudFdpZHRoKCksIGxheWVyLT5zY3JvbGxIZWlnaHQoKSAtIGxheWVyLT5yZW5kZXJCb3go
KS0+Y2xpZW50SGVpZ2h0KCkpOworICAgICAgICBJbnRQb2ludCBjdXJyZW50T2Zmc2V0KGxheWVy
LT5zY3JvbGxYT2Zmc2V0KCksIGxheWVyLT5zY3JvbGxZT2Zmc2V0KCkpOworICAgICAgICBhZGp1
c3RTY3JvbGxEZWx0YShtYXhPZmZzZXQsIGN1cnJlbnRPZmZzZXQsIGxheWVyRGVsdGEpOworICAg
ICAgICBpZiAoIWxheWVyRGVsdGEuaXNaZXJvKCkpIHsKKyAgICAgICAgICAgIG1faW5SZWdpb25T
Y3JvbGxTdGFydGluZ05vZGUgPSBlbmNsb3NpbmdMYXllck5vZGUobGF5ZXIpOworICAgICAgICAg
ICAgSW50UG9pbnQgbmV3T2Zmc2V0ID0gY3VycmVudE9mZnNldCArIGxheWVyRGVsdGE7CisgICAg
ICAgICAgICBsYXllci0+c2Nyb2xsVG9PZmZzZXQobmV3T2Zmc2V0LngoKSwgbmV3T2Zmc2V0Lnko
KSk7CisgICAgICAgICAgICByZW5kZXJlci0+cmVwYWludCh0cnVlKTsKKyAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKGxheWVyID0gbGF5ZXIt
PnBhcmVudCgpKSB7CisgICAgICAgIGlmIChjYW5TY3JvbGxSZW5kZXJCb3gobGF5ZXItPnJlbmRl
ckJveCgpKSkKKyAgICAgICAgICAgIHJldHVybiBzY3JvbGxSZW5kZXJlcihsYXllci0+cmVuZGVy
Qm94KCksIGRlbHRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2
b2lkIGhhbmRsZVNjcm9sbGluZyh1bnNpZ25lZCBzaG9ydCBjaGFyYWN0ZXIsIFdlYlBhZ2VQcml2
YXRlKiBzY3JvbGxlcikKK3sKKyAgICBjb25zdCBpbnQgc2Nyb2xsRmFjdG9yID0gMjA7CisgICAg
aW50IGR4ID0gMCwgZHkgPSAwOworICAgIHN3aXRjaCAoY2hhcmFjdGVyKSB7CisgICAgY2FzZSBL
RVlDT0RFX0xFRlQ6CisgICAgICAgIGR4ID0gLXNjcm9sbEZhY3RvcjsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBLRVlDT0RFX1JJR0hUOgorICAgICAgICBkeCA9IHNjcm9sbEZhY3RvcjsKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSBLRVlDT0RFX1VQOgorICAgICAgICBkeSA9IC1zY3JvbGxG
YWN0b3I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0VZQ09ERV9ET1dOOgorICAgICAgICBk
eSA9IHNjcm9sbEZhY3RvcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLRVlDT0RFX1BHX1VQ
OgorICAgICAgICBBU1NFUlQoc2Nyb2xsZXIpOworICAgICAgICBkeSA9IHNjcm9sbEZhY3RvciAt
IHNjcm9sbGVyLT5hY3R1YWxWaXNpYmxlU2l6ZSgpLmhlaWdodCgpOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIEtFWUNPREVfUEdfRE9XTjoKKyAgICAgICAgQVNTRVJUKHNjcm9sbGVyKTsKKyAg
ICAgICAgZHkgPSBzY3JvbGxlci0+YWN0dWFsVmlzaWJsZVNpemUoKS5oZWlnaHQoKSAtIHNjcm9s
bEZhY3RvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGR4IHx8IGR5KSB7Cisg
ICAgICAgIC8vIERvbid0IHVzZSB0aGUgc2Nyb2xsQnkgZnVuY3Rpb24gYmVjYXVzZSBpdCB0cmln
Z2VycyB0aGUgc2Nyb2xsIGFzIG9yaWdpbmF0aW5nIGZyb20gQmxhY2tCZXJyeQorICAgICAgICAv
LyBidXQgdGhlbiBpdCBleHBlY3RzIGEgc2VwYXJhdGUgaW52YWxpZGF0ZSB3aGljaCBpc24ndCBz
ZW50IGluIHRoaXMgY2FzZS4KKyAgICAgICAgQVNTRVJUKHNjcm9sbGVyICYmIHNjcm9sbGVyLT5t
X21haW5GcmFtZSAmJiBzY3JvbGxlci0+bV9tYWluRnJhbWUtPnZpZXcoKSk7CisgICAgICAgIElu
dFBvaW50IHBvcyhzY3JvbGxlci0+c2Nyb2xsUG9zaXRpb24oKSArIEludFNpemUoZHgsIGR5KSk7
CisKKyAgICAgICAgLy8gUHJldmVudCBvdmVyIHNjcm9sbGluZyBmb3IgYXJyb3dzIGFuZCBQYWdl
IHVwL2Rvd24uCisgICAgICAgIGlmIChwb3MueCgpIDwgMCkKKyAgICAgICAgICAgIHBvcy5zZXRY
KDApOworICAgICAgICBpZiAocG9zLnkoKSA8IDApCisgICAgICAgICAgICBwb3Muc2V0WSgwKTsK
KyAgICAgICAgaWYgKHBvcy54KCkgKyBzY3JvbGxlci0+YWN0dWFsVmlzaWJsZVNpemUoKS53aWR0
aCgpID4gc2Nyb2xsZXItPmNvbnRlbnRzU2l6ZSgpLndpZHRoKCkpCisgICAgICAgICAgICBwb3Mu
c2V0WChzY3JvbGxlci0+Y29udGVudHNTaXplKCkud2lkdGgoKSAtIHNjcm9sbGVyLT5hY3R1YWxW
aXNpYmxlU2l6ZSgpLndpZHRoKCkpOworICAgICAgICBpZiAocG9zLnkoKSArIHNjcm9sbGVyLT5h
Y3R1YWxWaXNpYmxlU2l6ZSgpLmhlaWdodCgpID4gc2Nyb2xsZXItPmNvbnRlbnRzU2l6ZSgpLmhl
aWdodCgpKQorICAgICAgICAgICAgcG9zLnNldFkoc2Nyb2xsZXItPmNvbnRlbnRzU2l6ZSgpLmhl
aWdodCgpIC0gc2Nyb2xsZXItPmFjdHVhbFZpc2libGVTaXplKCkuaGVpZ2h0KCkpOworCisgICAg
ICAgIHNjcm9sbGVyLT5tX21haW5GcmFtZS0+dmlldygpLT5zZXRTY3JvbGxQb3NpdGlvbihwb3Mp
OworICAgICAgICBzY3JvbGxlci0+bV9jbGllbnQtPnNjcm9sbENoYW5nZWQocG9zKTsKKyAgICB9
Cit9CisKK2Jvb2wgV2ViUGFnZTo6a2V5RXZlbnQoY29uc3QgUGxhdGZvcm06OktleWJvYXJkRXZl
bnQmIGtleWJvYXJkRXZlbnQpCit7CisgICAgaWYgKCFkLT5tX21haW5GcmFtZS0+dmlldygpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBBU1NFUlQoZC0+bV9wYWdlLT5mb2N1c0NvbnRy
b2xsZXIoKSk7CisKKyAgICBib29sIGhhbmRsZWQgPSBkLT5tX2lucHV0SGFuZGxlci0+aGFuZGxl
S2V5Ym9hcmRJbnB1dChrZXlib2FyZEV2ZW50KTsKKworICAgIGlmICghaGFuZGxlZCAmJiBrZXli
b2FyZEV2ZW50LnR5cGUoKSA9PSBQbGF0Zm9ybTo6S2V5Ym9hcmRFdmVudDo6S2V5RG93biAmJiAh
ZC0+bV9pbnB1dEhhbmRsZXItPmlzSW5wdXRNb2RlKCkpIHsKKyAgICAgICAgSW50UG9pbnQgcHJl
dmlvdXNQb3MgPSBkLT5zY3JvbGxQb3NpdGlvbigpOworICAgICAgICBoYW5kbGVTY3JvbGxpbmco
a2V5Ym9hcmRFdmVudC5jaGFyYWN0ZXIoKSwgZCk7CisgICAgICAgIGhhbmRsZWQgPSBwcmV2aW91
c1BvcyAhPSBkLT5zY3JvbGxQb3NpdGlvbigpOworICAgIH0KKworICAgIHJldHVybiBoYW5kbGVk
OworfQorCit2b2lkIFdlYlBhZ2U6Om5hdmlnYXRpb25Nb3ZlRXZlbnQoY29uc3QgdW5zaWduZWQg
c2hvcnQgY2hhcmFjdGVyLCBib29sIHNoaWZ0RG93biwgYm9vbCBhbHREb3duKQoreworICAgIGlm
ICghZC0+bV9tYWluRnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJU
KGQtPm1fcGFnZS0+Zm9jdXNDb250cm9sbGVyKCkpOworICAgIGQtPm1faW5wdXRIYW5kbGVyLT5o
YW5kbGVOYXZpZ2F0aW9uTW92ZShjaGFyYWN0ZXIsIHNoaWZ0RG93biwgYWx0RG93bik7Cit9CisK
K2Jvb2wgV2ViUGFnZTo6ZGVsZXRlVGV4dFJlbGF0aXZlVG9DdXJzb3IodW5zaWduZWQgaW50IGxl
ZnRPZmZzZXQsIHVuc2lnbmVkIGludCByaWdodE9mZnNldCkKK3sKKyAgICByZXR1cm4gZC0+bV9p
bnB1dEhhbmRsZXItPmRlbGV0ZVRleHRSZWxhdGl2ZVRvQ3Vyc29yKGxlZnRPZmZzZXQsIHJpZ2h0
T2Zmc2V0KTsKK30KKworc3Bhbm5hYmxlX3N0cmluZ190KiBXZWJQYWdlOjpzZWxlY3RlZFRleHQo
aW50MzJfdCBmbGFncykKK3sKKyAgICByZXR1cm4gZC0+bV9pbnB1dEhhbmRsZXItPnNlbGVjdGVk
VGV4dChmbGFncyk7Cit9CisKK3NwYW5uYWJsZV9zdHJpbmdfdCogV2ViUGFnZTo6dGV4dEJlZm9y
ZUN1cnNvcihpbnQzMl90IGxlbmd0aCwgaW50MzJfdCBmbGFncykKK3sKKyAgICByZXR1cm4gZC0+
bV9pbnB1dEhhbmRsZXItPnRleHRCZWZvcmVDdXJzb3IobGVuZ3RoLCBmbGFncyk7Cit9CisKK3Nw
YW5uYWJsZV9zdHJpbmdfdCogV2ViUGFnZTo6dGV4dEFmdGVyQ3Vyc29yKGludDMyX3QgbGVuZ3Ro
LCBpbnQzMl90IGZsYWdzKQoreworICAgIHJldHVybiBkLT5tX2lucHV0SGFuZGxlci0+dGV4dEFm
dGVyQ3Vyc29yKGxlbmd0aCwgZmxhZ3MpOworfQorCitleHRyYWN0ZWRfdGV4dF90KiBXZWJQYWdl
OjpleHRyYWN0ZWRUZXh0UmVxdWVzdChleHRyYWN0ZWRfdGV4dF9yZXF1ZXN0X3QqIHJlcXVlc3Qs
IGludDMyX3QgZmxhZ3MpCit7CisgICAgcmV0dXJuIGQtPm1faW5wdXRIYW5kbGVyLT5leHRyYWN0
ZWRUZXh0UmVxdWVzdChyZXF1ZXN0LCBmbGFncyk7Cit9CisKK2ludDMyX3QgV2ViUGFnZTo6c2V0
Q29tcG9zaW5nUmVnaW9uKGludDMyX3Qgc3RhcnQsIGludDMyX3QgZW5kKQoreworICAgIHJldHVy
biBkLT5tX2lucHV0SGFuZGxlci0+c2V0Q29tcG9zaW5nUmVnaW9uKHN0YXJ0LCBlbmQpOworfQor
CitpbnQzMl90IFdlYlBhZ2U6OmZpbmlzaENvbXBvc2l0aW9uKCkKK3sKKyAgICByZXR1cm4gZC0+
bV9pbnB1dEhhbmRsZXItPmZpbmlzaENvbXBvc2l0aW9uKCk7Cit9CisKK2ludDMyX3QgV2ViUGFn
ZTo6c2V0Q29tcG9zaW5nVGV4dChzcGFubmFibGVfc3RyaW5nX3QqIHNwYW5uYWJsZVN0cmluZywg
aW50MzJfdCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uKQoreworICAgIHJldHVybiBkLT5tX2lucHV0
SGFuZGxlci0+c2V0Q29tcG9zaW5nVGV4dChzcGFubmFibGVTdHJpbmcsIHJlbGF0aXZlQ3Vyc29y
UG9zaXRpb24pOworfQorCitpbnQzMl90IFdlYlBhZ2U6OmNvbW1pdFRleHQoc3Bhbm5hYmxlX3N0
cmluZ190KiBzcGFubmFibGVTdHJpbmcsIGludDMyX3QgcmVsYXRpdmVDdXJzb3JQb3NpdGlvbikK
K3sKKyAgICByZXR1cm4gZC0+bV9pbnB1dEhhbmRsZXItPmNvbW1pdFRleHQoc3Bhbm5hYmxlU3Ry
aW5nLCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uKTsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRTcGVs
bGNoZWNraW5nRW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgc3RhdGljX2Nhc3Q8RWRpdG9y
Q2xpZW50QmxhY2tCZXJyeSo+KGQtPm1fcGFnZS0+ZWRpdG9yQ2xpZW50KCkpLT5lbmFibGVTcGVs
bENoZWNraW5nKGVuYWJsZWQpOworfQorCit2b2lkIFdlYlBhZ2U6OnNlbGVjdGlvbkNhbmNlbGxl
ZCgpCit7CisgICAgZC0+bV9zZWxlY3Rpb25IYW5kbGVyLT5jYW5jZWxTZWxlY3Rpb24oKTsKK30K
KworYm9vbCBXZWJQYWdlOjpzZWxlY3Rpb25Db250YWlucyhjb25zdCBQbGF0Zm9ybTo6SW50UG9p
bnQmIHBvaW50KQoreworICAgIHJldHVybiBkLT5tX3NlbGVjdGlvbkhhbmRsZXItPnNlbGVjdGlv
bkNvbnRhaW5zKGQtPm1hcEZyb21UcmFuc2Zvcm1lZChwb2ludCkpOworfQorCitXZWJTdHJpbmcg
V2ViUGFnZTo6dGl0bGUoKSBjb25zdAoreworICAgIGlmIChkLT5tX21haW5GcmFtZS0+ZG9jdW1l
bnQoKSkKKyAgICAgICAgcmV0dXJuIGQtPm1fbWFpbkZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRM
b2FkZXIoKS0+dGl0bGUoKS5zdHJpbmcoKTsKKyAgICByZXR1cm4gV2ViU3RyaW5nKCk7Cit9CisK
K1dlYlN0cmluZyBXZWJQYWdlOjpzZWxlY3RlZFRleHQoKSBjb25zdAoreworICAgIHJldHVybiBk
LT5tX3NlbGVjdGlvbkhhbmRsZXItPnNlbGVjdGVkVGV4dCgpOworfQorCitXZWJTdHJpbmcgV2Vi
UGFnZTo6Y3V0U2VsZWN0ZWRUZXh0KCkKK3sKKyAgICBXZWJTdHJpbmcgc2VsZWN0ZWRUZXh0ID0g
ZC0+bV9zZWxlY3Rpb25IYW5kbGVyLT5zZWxlY3RlZFRleHQoKTsKKyAgICBpZiAoIXNlbGVjdGVk
VGV4dC5pc0VtcHR5KCkpCisgICAgICAgIGQtPm1faW5wdXRIYW5kbGVyLT5kZWxldGVTZWxlY3Rp
b24oKTsKKyAgICByZXR1cm4gc2VsZWN0ZWRUZXh0OworfQorCit2b2lkIFdlYlBhZ2U6Omluc2Vy
dFRleHQoY29uc3QgV2ViU3RyaW5nJiBzdHJpbmcpCit7CisgICAgZC0+bV9pbnB1dEhhbmRsZXIt
Pmluc2VydFRleHQoc3RyaW5nKTsKK30KKwordm9pZCBXZWJQYWdlOjpjbGVhckN1cnJlbnRJbnB1
dEZpZWxkKCkKK3sKKyAgICBkLT5tX2lucHV0SGFuZGxlci0+Y2xlYXJGaWVsZCgpOworfQorCit2
b2lkIFdlYlBhZ2U6OmN1dCgpCit7CisgICAgZC0+bV9pbnB1dEhhbmRsZXItPmN1dCgpOworfQor
Cit2b2lkIFdlYlBhZ2U6OmNvcHkoKQoreworICAgIGQtPm1faW5wdXRIYW5kbGVyLT5jb3B5KCk7
Cit9CisKK3ZvaWQgV2ViUGFnZTo6cGFzdGUoKQoreworICAgIGQtPm1faW5wdXRIYW5kbGVyLT5w
YXN0ZSgpOworfQorCit2b2lkIFdlYlBhZ2U6OnNldFNlbGVjdGlvbihjb25zdCBQbGF0Zm9ybTo6
SW50UG9pbnQmIHN0YXJ0UG9pbnQsIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgZW5kUG9pbnQp
Cit7CisgICAgLy8gVHJhbnNmb3JtIHRoaXMgZXZlbnRzIGNvb3JkaW5hdGVzIHRvIHdlYmtpdCBj
b250ZW50IGNvb3JkaW5hdGVzLgorICAgIC8vIEZJWE1FOiBEb24ndCB0cmFuc2Zvcm0gdGhlIHNl
bnRpbmVsLCBiZWNhdXNlIGl0IG1heSBiZSB0cmFuc2Zvcm1lZCB0byBhIGZsb2F0aW5nIG51bWJl
cgorICAgIC8vIHdoaWNoIGNvdWxkIGJlIHJvdW5kZWQgdG8gMCBvciBvdGhlciBudW1iZXJzLiBU
aGlzIHdvcmthcm91bmQgc2hvdWxkIGJlIHJlbW92ZWQgYWZ0ZXIKKyAgICAvLyB0aGUgZXJyb3Ig
b2Ygcm91bmRVbnRyYW5zZm9ybWVkUG9pbnQoKSBpcyBmaXhlZC4KKyAgICBib29sIGludmFsaWRQ
b2ludCA9IEludFBvaW50KHN0YXJ0UG9pbnQpID09IERPTVN1cHBvcnQ6OkludmFsaWRQb2ludDsK
KyAgICBJbnRQb2ludCBzdGFydCA9IGludmFsaWRQb2ludCA/IERPTVN1cHBvcnQ6OkludmFsaWRQ
b2ludCA6IGQtPm1hcEZyb21UcmFuc2Zvcm1lZChzdGFydFBvaW50KTsKKyAgICBpbnZhbGlkUG9p
bnQgPSBJbnRQb2ludChlbmRQb2ludCkgPT0gRE9NU3VwcG9ydDo6SW52YWxpZFBvaW50OworICAg
IEludFBvaW50IGVuZCA9IGludmFsaWRQb2ludCA/IERPTVN1cHBvcnQ6OkludmFsaWRQb2ludCA6
IGQtPm1hcEZyb21UcmFuc2Zvcm1lZChlbmRQb2ludCk7CisKKyAgICBkLT5tX3NlbGVjdGlvbkhh
bmRsZXItPnNldFNlbGVjdGlvbihzdGFydCwgZW5kKTsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRD
YXJldFBvc2l0aW9uKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgcG9zaXRpb24pCit7CisgICAg
Ly8gSGFuZGxlZCBieSBzZWxlY3Rpb24gaGFuZGxlciBhcyBpdCdzIHBvaW50IGJhc2VkLgorICAg
IC8vIFRyYW5zZm9ybSB0aGlzIGV2ZW50cyBjb29yZGluYXRlcyB0byB3ZWJraXQgY29udGVudCBj
b29yZGluYXRlcy4KKyAgICBkLT5tX3NlbGVjdGlvbkhhbmRsZXItPnNldENhcmV0UG9zaXRpb24o
ZC0+bWFwRnJvbVRyYW5zZm9ybWVkKHBvc2l0aW9uKSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2Vs
ZWN0QXRQb2ludChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIGxvY2F0aW9uKQoreworICAgIC8v
IFRyYW5zZm9ybSB0aGlzIGV2ZW50cyBjb29yZGluYXRlcyB0byB3ZWJraXQgY29udGVudCBjb29y
ZGluYXRlcyBpZiBpdAorICAgIC8vIGlzIG5vdCB0aGUgc2VudGluZWwgdmFsdWUuCisgICAgSW50
UG9pbnQgc2VsZWN0aW9uTG9jYXRpb24gPQorICAgICAgICAgICAgSW50UG9pbnQobG9jYXRpb24p
ID09IERPTVN1cHBvcnQ6OkludmFsaWRQb2ludCA/CisgICAgICAgICAgICBET01TdXBwb3J0OjpJ
bnZhbGlkUG9pbnQgOgorICAgICAgICAgICAgZC0+bWFwRnJvbVRyYW5zZm9ybWVkKGxvY2F0aW9u
KTsKKworICAgIGQtPm1fc2VsZWN0aW9uSGFuZGxlci0+c2VsZWN0QXRQb2ludChzZWxlY3Rpb25M
b2NhdGlvbik7Cit9CisKKy8vIFJldHVybmVkIHNjcm9sbCBwb3NpdGlvbiBpcyBpbiB0cmFuc2Zv
cm1lZCBjb29yZGluYXRlcy4KK1BsYXRmb3JtOjpJbnRQb2ludCBXZWJQYWdlOjpzY3JvbGxQb3Np
dGlvbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPnRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24o
KTsKK30KKworLy8gU2V0dGluZyB0aGUgc2Nyb2xsIHBvc2l0aW9uIGlzIGluIHRyYW5zZm9ybWVk
IGNvb3JkaW5hdGVzLgordm9pZCBXZWJQYWdlOjpzZXRTY3JvbGxQb3NpdGlvbihjb25zdCBQbGF0
Zm9ybTo6SW50UG9pbnQmIHBvaW50KQoreworICAgIGlmIChkLT50cmFuc2Zvcm1lZFBvaW50RXF1
YWxzVW50cmFuc2Zvcm1lZFBvaW50KHBvaW50LCBkLT5zY3JvbGxQb3NpdGlvbigpKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgLy8gSWYgdGhlIHVzZXIgcmVjZW50bHkgcGVyZm9ybWVkIGFuIGV2
ZW50LCB0aGlzIG5ldyBzY3JvbGwgcG9zaXRpb24KKyAgICAvLyBjb3VsZCBwb3NzaWJseSBiZSBh
IHJlc3VsdCBvZiB0aGF0LiBPciBub3QsIHRoaXMgaXMganVzdCBhIGhldXJpc3RpYy4KKyAgICBp
ZiAoY3VycmVudFRpbWUoKSAtIGQtPm1fbGFzdFVzZXJFdmVudFRpbWVzdGFtcCA8IG1hbnVhbFNj
cm9sbEludGVydmFsKQorICAgICAgICBkLT5tX3VzZXJQZXJmb3JtZWRNYW51YWxTY3JvbGwgPSB0
cnVlOworCisgICAgZC0+bV9iYWNraW5nU3RvcmVDbGllbnQtPnNldElzQ2xpZW50R2VuZXJhdGVk
U2Nyb2xsKHRydWUpOworICAgIGQtPm1fbWFpbkZyYW1lLT52aWV3KCktPnNldENhbk92ZXJzY3Jv
bGwodHJ1ZSk7CisgICAgZC0+c2V0U2Nyb2xsUG9zaXRpb24oZC0+bWFwRnJvbVRyYW5zZm9ybWVk
KHBvaW50KSk7CisgICAgZC0+bV9tYWluRnJhbWUtPnZpZXcoKS0+c2V0Q2FuT3ZlcnNjcm9sbChm
YWxzZSk7CisgICAgZC0+bV9iYWNraW5nU3RvcmVDbGllbnQtPnNldElzQ2xpZW50R2VuZXJhdGVk
U2Nyb2xsKGZhbHNlKTsKK30KKworV2ViU3RyaW5nIFdlYlBhZ2U6OnRleHRFbmNvZGluZygpCit7
CisgICAgRnJhbWUqIGZyYW1lID0gZC0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisgICAgaWYgKCFm
cmFtZSkKKyAgICAgICAgcmV0dXJuICIiOworCisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gZnJh
bWUtPmRvY3VtZW50KCk7CisgICAgaWYgKCFkb2N1bWVudCkKKyAgICAgICAgcmV0dXJuICIiOwor
CisgICAgcmV0dXJuIGRvY3VtZW50LT5sb2FkZXIoKS0+d3JpdGVyKCktPmVuY29kaW5nKCk7Cit9
CisKK1dlYlN0cmluZyBXZWJQYWdlOjpmb3JjZWRUZXh0RW5jb2RpbmcoKQoreworICAgIEZyYW1l
KiBmcmFtZSA9IGQtPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAg
ICAgIHJldHVybiAiIjsKKworICAgIERvY3VtZW50KiBkb2N1bWVudCA9IGZyYW1lLT5kb2N1bWVu
dCgpOworICAgIGlmICghZG9jdW1lbnQpCisgICAgICAgIHJldHVybiAiIjsKKworICAgIHJldHVy
biBkb2N1bWVudC0+bG9hZGVyKCktPm92ZXJyaWRlRW5jb2RpbmcoKTsKK30KKwordm9pZCBXZWJQ
YWdlOjpzZXRGb3JjZWRUZXh0RW5jb2RpbmcoY29uc3QgY2hhciogZW5jb2RpbmcpCit7CisgICAg
aWYgKGVuY29kaW5nICYmIGQtPmZvY3VzZWRPck1haW5GcmFtZSgpICYmIGQtPmZvY3VzZWRPck1h
aW5GcmFtZSgpLT5sb2FkZXIoKSAmJiBkLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+bG9hZGVyKCkp
CisgICAgICAgIHJldHVybiBkLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+bG9hZGVyKCktPnJlbG9h
ZFdpdGhPdmVycmlkZUVuY29kaW5nKGVuY29kaW5nKTsKK30KKworLy8gRklYTUU6IE1vdmUgdG8g
RE9NU3VwcG9ydC4KK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmNhblNjcm9sbElubmVyRnJhbWUoRnJh
bWUqIGZyYW1lKSBjb25zdAoreworICAgIGlmICghZnJhbWUgfHwgIWZyYW1lLT52aWV3KCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIE5vdCBoYXZpbmcgYW4gb3duZXIgZWxlbWVu
dCBtZWFucyB0aGF0IHdlIGFyZSBvbiB0aGUgbWFpbmZyYW1lLgorICAgIGlmICghZnJhbWUtPm93
bmVyRWxlbWVudCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBBU1NFUlQoZnJhbWUg
IT0gbV9tYWluRnJhbWUpOworCisgICAgSW50U2l6ZSB2aXNpYmxlU2l6ZSA9IGZyYW1lLT52aWV3
KCktPnZpc2libGVDb250ZW50UmVjdCgpLnNpemUoKTsKKyAgICBJbnRTaXplIGNvbnRlbnRzU2l6
ZSA9IGZyYW1lLT52aWV3KCktPmNvbnRlbnRzU2l6ZSgpOworCisgICAgYm9vbCBjYW5CZVNjcm9s
bGVkID0gY29udGVudHNTaXplLmhlaWdodCgpID4gdmlzaWJsZVNpemUuaGVpZ2h0KCkgfHwgY29u
dGVudHNTaXplLndpZHRoKCkgPiB2aXNpYmxlU2l6ZS53aWR0aCgpOworCisgICAgLy8gTGV0cyBh
bHNvIGNvbnNpZGVyIHRoZSAnb3ZlcmZsb3cte3gseX0gcHJvcGVydHkgc2V0IGRpcmVjdGx5IHRv
IHRoZSB7aX1mcmFtZSB0YWcuCisgICAgcmV0dXJuIGNhbkJlU2Nyb2xsZWQgJiYgKGZyYW1lLT5v
d25lckVsZW1lbnQoKS0+c2Nyb2xsaW5nTW9kZSgpICE9IFNjcm9sbGJhckFsd2F5c09mZik7Cit9
CisKKy8vIFRoZSBSZW5kZXJCb3g6OmNhbmJlU2Nyb2xsZWRBbmRIYXNTY3JvbGxhYmxlQXJlYSBt
ZXRob2QgcmV0dXJucyB0cnVlIGZvciB0aGUKKy8vIGZvbGxvd2luZyBzY2VuYXJpbywgZm9yIGV4
YW1wbGU6CisvLyAoMSkgYSBkaXYgdGhhdCBoYXMgYSB2ZXJ0aWNhbCBvdmVyZmxvdyBidXQgbm8g
aG9yaXpvbnRhbCBvdmVyZmxvdworLy8gICAgIHdpdGggb3ZlcmZsb3cteTogaGlkZGVuIGFuZCBv
dmVyZmxvdy14OiBhdXRvIHNldC4KKy8vIFRoZSB2ZXJzaW9uIGJlbG93IGZpeGVzIGl0LgorLy8g
RklYTUU6IEZpeCBpdCB1cHN0cmVhbSEKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmNhblNjcm9sbFJl
bmRlckJveChSZW5kZXJCb3gqIGJveCkKK3sKKyAgICBpZiAoIWJveCB8fCAhYm94LT5oYXNPdmVy
Zmxvd0NsaXAoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGJveC0+c2Nyb2xs
c092ZXJmbG93WCgpICYmIChib3gtPnNjcm9sbFdpZHRoKCkgIT0gYm94LT5jbGllbnRXaWR0aCgp
KQorICAgICAgICB8fCBib3gtPnNjcm9sbHNPdmVyZmxvd1koKSAmJiAoYm94LT5zY3JvbGxIZWln
aHQoKSAhPSBib3gtPmNsaWVudEhlaWdodCgpKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAg
ICBOb2RlKiBub2RlID0gYm94LT5ub2RlKCk7CisgICAgcmV0dXJuIG5vZGUgJiYgKG5vZGUtPnJl
bmRlcmVySXNFZGl0YWJsZSgpIHx8IG5vZGUtPmlzRG9jdW1lbnROb2RlKCkpOworfQorCitzdGF0
aWMgUmVuZGVyTGF5ZXIqIHBhcmVudExheWVyKFJlbmRlckxheWVyKiBsYXllcikKK3sKKyAgICBB
U1NFUlQobGF5ZXIpOworCisgICAgaWYgKGxheWVyLT5wYXJlbnQoKSkKKyAgICAgICAgcmV0dXJu
IGxheWVyLT5wYXJlbnQoKTsKKworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBsYXllci0+
cmVuZGVyZXIoKTsKKyAgICBpZiAocmVuZGVyZXItPmRvY3VtZW50KCkgJiYgcmVuZGVyZXItPmRv
Y3VtZW50KCktPm93bmVyRWxlbWVudCgpICYmIHJlbmRlcmVyLT5kb2N1bWVudCgpLT5vd25lckVs
ZW1lbnQoKS0+cmVuZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuIHJlbmRlcmVyLT5kb2N1bWVudCgp
LT5vd25lckVsZW1lbnQoKS0+cmVuZGVyZXIoKS0+ZW5jbG9zaW5nTGF5ZXIoKTsKKworICAgIHJl
dHVybiAwOworfQorCisvLyBGSVhNRTogTWFrZSBSZW5kZXJMYXllcjo6ZW5jbG9zaW5nRWxlbWVu
dCBwdWJsaWMgc28gdGhpcyBvbmUgY2FuIGJlIHJlbW92ZWQuCitzdGF0aWMgTm9kZSogZW5jbG9z
aW5nTGF5ZXJOb2RlKFJlbmRlckxheWVyKiBsYXllcikKK3sKKyAgICBmb3IgKFJlbmRlck9iamVj
dCogciA9IGxheWVyLT5yZW5kZXJlcigpOyByOyByID0gci0+cGFyZW50KCkpIHsKKyAgICAgICAg
aWYgKE5vZGUqIGUgPSByLT5ub2RlKCkpCisgICAgICAgICAgICByZXR1cm4gZTsKKyAgICB9Cisg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lk
IHB1c2hCYWNrSW5SZWdpb25TY3JvbGxhYmxlKHN0ZDo6dmVjdG9yPFBsYXRmb3JtOjpTY3JvbGxW
aWV3QmFzZT4mIHZlY3RvciwgSW5SZWdpb25TY3JvbGxhYmxlQXJlYSBzY3JvbGxlciwgV2ViUGFn
ZVByaXZhdGUqIHdlYlBhZ2UpCit7CisgICAgQVNTRVJUKHdlYlBhZ2UpOworICAgIEFTU0VSVCgh
c2Nyb2xsZXIuaXNOdWxsKCkpOworCisgICAgc2Nyb2xsZXIuc2V0Q2FuUHJvcGFnYXRlU2Nyb2xs
aW5nVG9FbmNsb3NpbmdTY3JvbGxhYmxlKCFpc05vblJlbmRlclZpZXdGaXhlZFBvc2l0aW9uZWRD
b250YWluZXIoc2Nyb2xsZXIubGF5ZXIoKSkpOworICAgIHZlY3Rvci5wdXNoX2JhY2soc2Nyb2xs
ZXIpOworICAgIGlmICh2ZWN0b3Iuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgLy8gRklYTUU6IFVz
ZSBSZW5kZXJMYXllcjo6cmVuZGVyQm94KCktPm5vZGUoKSBpbnN0ZWFkPworICAgICAgICB3ZWJQ
YWdlLT5tX2luUmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2RlID0gZW5jbG9zaW5nTGF5ZXJOb2RlKHNj
cm9sbGVyLmxheWVyKCkpOworICAgIH0KK30KKworc3RkOjp2ZWN0b3I8UGxhdGZvcm06OlNjcm9s
bFZpZXdCYXNlPiBXZWJQYWdlUHJpdmF0ZTo6aW5SZWdpb25TY3JvbGxhYmxlQXJlYXNGb3JQb2lu
dChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIHBvaW50KQoreworICAgIHN0ZDo6dmVjdG9yPFBs
YXRmb3JtOjpTY3JvbGxWaWV3QmFzZT4gdmFsaWRSZXR1cm47CisgICAgc3RkOjp2ZWN0b3I8UGxh
dGZvcm06OlNjcm9sbFZpZXdCYXNlPiBlbXB0eVJldHVybjsKKworICAgIEhpdFRlc3RSZXN1bHQg
cmVzdWx0ID0gbV9tYWluRnJhbWUtPmV2ZW50SGFuZGxlcigpLT5oaXRUZXN0UmVzdWx0QXRQb2lu
dChtYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKHBvaW50KSwgZmFsc2UgLyphbGxvd1NoYWRvd0Nv
bnRlbnQqLyk7CisgICAgTm9kZSogbm9kZSA9IHJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKTsK
KyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiBlbXB0eVJldHVybjsKKworICAgIFJlbmRl
ck9iamVjdCogcmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpOworICAgIC8vIEZJWE1FOiBWYWxp
ZGF0ZSB3aXRoIGVsZW1lbnRzIHdpdGggdmlzaWJpbGl0eTpoaWRkZW4uCisgICAgaWYgKCFyZW5k
ZXJlcikKKyAgICAgICAgcmV0dXJuIGVtcHR5UmV0dXJuOworCisgICAgUmVuZGVyTGF5ZXIqIGxh
eWVyID0gcmVuZGVyZXItPmVuY2xvc2luZ0xheWVyKCk7CisKKyAgICBkbyB7CisgICAgICAgIFJl
bmRlck9iamVjdCogcmVuZGVyZXIgPSBsYXllci0+cmVuZGVyZXIoKTsKKworICAgICAgICBpZiAo
cmVuZGVyZXItPmlzUmVuZGVyVmlldygpKSB7CisgICAgICAgICAgICBpZiAoUmVuZGVyVmlldyog
cmVuZGVyVmlldyA9IHRvUmVuZGVyVmlldyhyZW5kZXJlcikpIHsKKyAgICAgICAgICAgICAgICBG
cmFtZVZpZXcqIHZpZXcgPSByZW5kZXJWaWV3LT5mcmFtZVZpZXcoKTsKKyAgICAgICAgICAgICAg
ICBpZiAoIXZpZXcpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbXB0eVJldHVybjsKKwor
ICAgICAgICAgICAgICAgIGlmIChjYW5TY3JvbGxJbm5lckZyYW1lKHZpZXctPmZyYW1lKCkpKSB7
CisgICAgICAgICAgICAgICAgICAgIHB1c2hCYWNrSW5SZWdpb25TY3JvbGxhYmxlKHZhbGlkUmV0
dXJuLCBJblJlZ2lvblNjcm9sbGFibGVBcmVhKHRoaXMsIGxheWVyKSwgdGhpcyk7CisgICAgICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KyAgICAgICAgfSBlbHNlIGlmIChjYW5TY3JvbGxSZW5kZXJCb3gobGF5ZXItPnJlbmRlckJveCgp
KSkgeworICAgICAgICAgICAgcHVzaEJhY2tJblJlZ2lvblNjcm9sbGFibGUodmFsaWRSZXR1cm4s
IEluUmVnaW9uU2Nyb2xsYWJsZUFyZWEodGhpcywgbGF5ZXIpLCB0aGlzKTsKKyAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgcnVuIGludG8gYSBmaXgg
cG9zaXRpb25lZCBsYXllciwgc2V0IHRoZSBsYXN0IHNjcm9sbGFibGUgaW4tcmVnaW9uIG9iamVj
dAorICAgICAgICAvLyBhcyBub3QgYWJsZSB0byBwcm9wYWdhdGUgc2Nyb2xsIHRvIGl0cyBwYXJl
bnQgc2Nyb2xsYWJsZS4KKyAgICAgICAgaWYgKGlzTm9uUmVuZGVyVmlld0ZpeGVkUG9zaXRpb25l
ZENvbnRhaW5lcihsYXllcikgJiYgdmFsaWRSZXR1cm4uc2l6ZSgpKSB7CisgICAgICAgICAgICBQ
bGF0Zm9ybTo6U2Nyb2xsVmlld0Jhc2UmIGVuZCA9IHZhbGlkUmV0dXJuLmJhY2soKTsKKyAgICAg
ICAgICAgIGVuZC5zZXRDYW5Qcm9wYWdhdGVTY3JvbGxpbmdUb0VuY2xvc2luZ1Njcm9sbGFibGUo
ZmFsc2UpOworICAgICAgICB9CisKKyAgICB9IHdoaWxlIChsYXllciA9IHBhcmVudExheWVyKGxh
eWVyKSk7CisKKyAgICBpZiAodmFsaWRSZXR1cm4uZW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGVt
cHR5UmV0dXJuOworCisgICAgcmV0dXJuIHZhbGlkUmV0dXJuOworfQorCitCYWNraW5nU3RvcmUq
IFdlYlBhZ2U6OmJhY2tpbmdTdG9yZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fYmFja2lu
Z1N0b3JlOworfQorCitib29sIFdlYlBhZ2U6Onpvb21Ub0ZpdCgpCit7CisgICAgaWYgKGQtPmNv
bnRlbnRzU2l6ZSgpLmlzRW1wdHkoKSB8fCAhZC0+aXNVc2VyU2NhbGFibGUoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgZC0+bV91c2VyUGVyZm9ybWVkTWFudWFsWm9vbSA9IHRydWU7
CisKKyAgICAvLyBUT0RPOiBXZSBtYXkgbmVlZCB0byB1c2UgKDAsMCkgYXMgdGhlIGFuY2hvciBw
b2ludCB3aGVuIHRleHRSZWZsb3cgaXMgZW5hYmxlZC4KKyAgICAvLyBJRiB0aGUgbWluaW11bSBm
b250IHNpemUgaXMgZ2lub3Jtb3VzLCB3ZSBtYXkgc3RpbGwgd2FudCB0aGUgc2Nyb2xsIHBvc2l0
aW9uIHRvIGJlIDAsMC4KKyAgICByZXR1cm4gZC0+em9vbUFib3V0UG9pbnQoZC0+em9vbVRvRml0
U2NhbGUoKSwgZC0+Y2VudGVyT2ZWaXNpYmxlQ29udGVudHNSZWN0KCkpOworfQorCit2b2lkIFdl
YlBhZ2VQcml2YXRlOjpzZXRUZXh0UmVmbG93QW5jaG9yUG9pbnQoY29uc3QgUGxhdGZvcm06Oklu
dFBvaW50JiBmb2NhbFBvaW50KQoreworICAgIC8vIFNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hl
biB0ZXh0IHJlZmxvdyBpcyBlbmFibGVkLgorICAgIEFTU0VSVChtX3dlYlBhZ2UtPnNldHRpbmdz
KCktPnRleHRSZWZsb3dNb2RlKCkgPT0gV2ViU2V0dGluZ3M6OlRleHRSZWZsb3dFbmFibGVkKTsK
KworICAgIG1fY3VycmVudFBpbmNoWm9vbU5vZGUgPSBiZXN0Tm9kZUZvclpvb21VbmRlclBvaW50
KGZvY2FsUG9pbnQpOworICAgIGlmICghbV9jdXJyZW50UGluY2hab29tTm9kZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgSW50UmVjdCBub2RlUmVjdCA9IHJlY3RGb3JOb2RlKG1fY3VycmVudFBp
bmNoWm9vbU5vZGUuZ2V0KCkpOworICAgIG1fYW5jaG9ySW5Ob2RlUmVjdFJhdGlvLnNldChzdGF0
aWNfY2FzdDxmbG9hdD4obWFwRnJvbVRyYW5zZm9ybWVkKGZvY2FsUG9pbnQpLngoKSAtIG5vZGVS
ZWN0LngoKSkgLyBub2RlUmVjdC53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBzdGF0aWNfY2FzdDxmbG9hdD4obWFwRnJvbVRyYW5zZm9ybWVkKGZvY2FsUG9pbnQpLnko
KSAtIG5vZGVSZWN0LnkoKSkgLyBub2RlUmVjdC5oZWlnaHQoKSk7Cit9CisKK2Jvb2wgV2ViUGFn
ZTo6cGluY2hab29tQWJvdXRQb2ludChkb3VibGUgc2NhbGUsIGludCB4LCBpbnQgeSkKK3sKKyAg
ICBJbnRQb2ludCBhbmNob3IoeCwgeSk7CisgICAgZC0+bV91c2VyUGVyZm9ybWVkTWFudWFsWm9v
bSA9IHRydWU7CisgICAgZC0+bV91c2VyUGVyZm9ybWVkTWFudWFsU2Nyb2xsID0gdHJ1ZTsKKwor
ICAgIGlmIChkLT5tX3dlYlBhZ2UtPnNldHRpbmdzKCktPnRleHRSZWZsb3dNb2RlKCkgPT0gV2Vi
U2V0dGluZ3M6OlRleHRSZWZsb3dFbmFibGVkKSB7CisgICAgICAgIGQtPnNldFRleHRSZWZsb3dB
bmNob3JQb2ludChhbmNob3IpOworICAgICAgICAvLyBUaGVvcmV0aWNhbGx5LCBkLT5ub2RlRm9y
Wm9vbVVuZGVyUG9pbnQoYW5jaG9yKSBjYW4gcmV0dXJuIG51bGwuCisgICAgICAgIGlmICghZC0+
bV9jdXJyZW50UGluY2hab29tTm9kZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICByZXR1cm4gZC0+em9vbUFib3V0UG9pbnQoc2NhbGUsIGQtPm1hcEZyb21UcmFuc2Zv
cm1lZChhbmNob3IpKTsKK30KKworI2lmIEVOQUJMRShWSUVXUE9SVF9SRUZMT1cpCit2b2lkIFdl
YlBhZ2VQcml2YXRlOjp0b2dnbGVUZXh0UmVmbG93SWZFbmFibGVkRm9yQmxvY2tab29tT25seShi
b29sIHNob3VsZEVuYWJsZVRleHRSZWZsb3cpCit7CisgICAgaWYgKG1fd2ViUGFnZS0+c2V0dGlu
Z3MoKS0+dGV4dFJlZmxvd01vZGUoKSA9PSBXZWJTZXR0aW5nczo6VGV4dFJlZmxvd0VuYWJsZWRP
bmx5Rm9yQmxvY2tab29tKQorICAgICAgICBtX3BhZ2UtPnNldHRpbmdzKCktPnNldFRleHRSZWZs
b3dFbmFibGVkKHNob3VsZEVuYWJsZVRleHRSZWZsb3cpOworfQorI2VuZGlmCisKK2Jvb2wgV2Vi
UGFnZTo6YmxvY2tab29tKGludCB4LCBpbnQgeSkKK3sKKyAgICBpZiAoIWQtPm1fbWFpbkZyYW1l
LT52aWV3KCkgfHwgIWQtPmlzVXNlclNjYWxhYmxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIE5vZGUqIG5vZGUgPSBkLT5iZXN0Tm9kZUZvclpvb21VbmRlclBvaW50KEludFBvaW50
KHgsIHkpKTsKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIElu
dFJlY3Qgbm9kZVJlY3QgPSBkLT5yZWN0Rm9yTm9kZShub2RlKTsKKyAgICBJbnRSZWN0IGJsb2Nr
UmVjdDsKKyAgICBib29sIGVuZE9mQmxvY2tab29tTW9kZSA9IGQtPmNvbXBhcmVOb2Rlc0ZvckJs
b2NrWm9vbShkLT5tX2N1cnJlbnRCbG9ja1pvb21BZGp1c3RlZE5vZGUuZ2V0KCksIG5vZGUpOwor
ICAgIGNvbnN0IGRvdWJsZSBvbGRTY2FsZSA9IGQtPm1fdHJhbnNmb3JtYXRpb25NYXRyaXgtPm0x
MSgpOworICAgIGRvdWJsZSBuZXdTY2FsZSA9IDA7CisgICAgY29uc3QgZG91YmxlIG1hcmdpbiA9
IGVuZE9mQmxvY2tab29tTW9kZSA/IDAgOiBibG9ja1pvb21NYXJnaW4gKiAyICogb2xkU2NhbGU7
CisgICAgYm9vbCBpc0ZpcnN0Wm9vbSA9IGZhbHNlOworCisgICAgaWYgKGVuZE9mQmxvY2tab29t
TW9kZSkgeworICAgICAgICAvLyBFbmQgb2YgYmxvY2sgem9vbSBtb2RlCisgICAgICAgIEludFJl
Y3QgcmVjdCA9IGQtPmJsb2NrWm9vbVJlY3RGb3JOb2RlKG5vZGUpOworICAgICAgICBibG9ja1Jl
Y3QgPSBJbnRSZWN0KDAsIHJlY3QueSgpLCBkLT50cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpLndp
ZHRoKCksIGQtPnRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkuaGVpZ2h0KCkgLSByZWN0LnkoKSk7
CisgICAgICAgIGQtPm1fc2hvdWxkUmVmbG93QmxvY2sgPSBmYWxzZTsKKyAgICB9IGVsc2Ugewor
ICAgICAgICAvLyBTdGFydC9jb250aW51ZSBibG9jayB6b29tIG1vZGUKKyAgICAgICAgTm9kZSog
dGVtcEJsb2NrWm9vbUFkanVzdGVkTm9kZSA9IGQtPm1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVk
Tm9kZS5nZXQoKTsKKyAgICAgICAgYmxvY2tSZWN0ID0gZC0+YmxvY2tab29tUmVjdEZvck5vZGUo
bm9kZSk7CisKKyAgICAgICAgLy8gRG9uJ3QgdXNlIGEgYmxvY2sgaWYgaXQgaXMgdG9vIGNsb3Nl
IHRvIHRoZSBzaXplIG9mIHRoZSBhY3R1YWwgY29udGVudHMuCisgICAgICAgIC8vIFdlIGFsbG93
IHRoaXMgZm9yIGltYWdlcyBvbmx5IHNvIHRoYXQgdGhleSBjYW4gYmUgem9vbWVkIHRpZ2h0IHRv
IHRoZSBzY3JlZW4uCisgICAgICAgIGlmICghbm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6Omlt
Z1RhZykpIHsKKyAgICAgICAgICAgIEludFJlY3QgdFJlY3QgPSBkLT5tYXBGcm9tVHJhbnNmb3Jt
ZWQoYmxvY2tSZWN0KTsKKyAgICAgICAgICAgIGludCBibG9ja0FyZWEgPSB0UmVjdC53aWR0aCgp
ICogdFJlY3QuaGVpZ2h0KCk7CisgICAgICAgICAgICBpbnQgcGFnZUFyZWEgPSBkLT5jb250ZW50
c1NpemUoKS53aWR0aCgpICogZC0+Y29udGVudHNTaXplKCkuaGVpZ2h0KCk7CisgICAgICAgICAg
ICBkb3VibGUgYmxvY2tUb1BhZ2VSYXRpbyA9IHN0YXRpY19jYXN0PGRvdWJsZT4oMSAtIGJsb2Nr
QXJlYSAvIHBhZ2VBcmVhKTsKKyAgICAgICAgICAgIGlmIChibG9ja1RvUGFnZVJhdGlvIDwgbWlu
aW11bUV4cGFuZGluZ1JhdGlvKSB7CisgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBvbGQgYWRq
dXN0IG5vZGUgYmVjYXVzZSB6b29tIHdhcyBjYW5jZWxlZC4KKyAgICAgICAgICAgICAgICBkLT5t
X2N1cnJlbnRCbG9ja1pvb21BZGp1c3RlZE5vZGUgPSB0ZW1wQmxvY2tab29tQWRqdXN0ZWROb2Rl
OworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorCisgICAgICAgIGlmIChibG9ja1JlY3QuaXNFbXB0eSgpIHx8ICFibG9ja1JlY3Qud2lkdGgo
KSB8fCAhYmxvY2tSZWN0LmhlaWdodCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgICAgIGlmICghZC0+bV9jdXJyZW50QmxvY2tab29tTm9kZS5nZXQoKSkKKyAgICAgICAgICAg
IGlzRmlyc3Rab29tID0gdHJ1ZTsKKworICAgICAgICBkLT5tX2N1cnJlbnRCbG9ja1pvb21Ob2Rl
ID0gbm9kZTsKKyAgICAgICAgZC0+bV9zaG91bGRSZWZsb3dCbG9jayA9IHRydWU7CisgICAgfQor
CisgICAgbmV3U2NhbGUgPSBzdGQ6Om1pbihkLT5uZXdTY2FsZUZvckJsb2NrWm9vbVJlY3QoYmxv
Y2tSZWN0LCBvbGRTY2FsZSwgbWFyZ2luKSwgZC0+bWF4QmxvY2tab29tU2NhbGUoKSk7CisgICAg
bmV3U2NhbGUgPSBzdGQ6Om1heChuZXdTY2FsZSwgbWluaW11bVNjYWxlKCkpOworCisjaWYgREVC
VUdfQkxPQ0tfWk9PTQorICAgIC8vIFJlbmRlciB0aGUgZG91YmxlIHRhcCBwb2ludCBmb3Igdmlz
dWFsIHJlZmVyZW5jZS4KKyAgICBJbnRSZWN0IHJlbmRlclJlY3QoeCwgeSwgMSwgMSk7CisgICAg
cmVuZGVyUmVjdCA9IGQtPm1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9UcmFuc2Zvcm1lZFZp
ZXdwb3J0KHJlbmRlclJlY3QpOworICAgIEludFNpemUgdmlld3BvcnRTaXplID0gZC0+dHJhbnNm
b3JtZWRWaWV3cG9ydFNpemUoKTsKKyAgICByZW5kZXJSZWN0LmludGVyc2VjdChJbnRSZWN0KDAs
IDAsIHZpZXdwb3J0U2l6ZS53aWR0aCgpLCB2aWV3cG9ydFNpemUuaGVpZ2h0KCkpKTsKKyAgICBk
LT5tX2JhY2tpbmdTdG9yZS0+ZC0+Y2xlYXJXaW5kb3cocmVuZGVyUmVjdCwgMCwgMCwgMCk7Cisg
ICAgZC0+bV9iYWNraW5nU3RvcmUtPmQtPmludmFsaWRhdGVXaW5kb3cocmVuZGVyUmVjdCk7CisK
KyAgICAvLyBVbmNvbW1lbnQgdGhpcyB0byByZXR1cm4gaW4gb3JkZXIgdG8gc2VlIHRoZSBibG9j
a3MgYmVpbmcgc2VsZWN0ZWQuCisvLyAgICBkLT5tX2NsaWVudC0+em9vbUNoYW5nZWQoaXNNaW5a
b29tZWQoKSwgaXNNYXhab29tZWQoKSwgaXNBdEluaXRpYWxab29tKCksIGN1cnJlbnRab29tTGV2
ZWwoKSk7CisvLyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorCisjaWYgRU5BQkxFKFZJRVdQT1JU
X1JFRkxPVykKKyAgICAvLyBJZiByZWZsb3dpbmcsIGFkanVzdCB0aGUgcmVmbG93LXdpZHRoIG9m
IHRleHQgbm9kZSB0byBtYWtlIHN1cmUgdGhlIGZvbnQgaXMgYSByZWFzb25hYmxlIHNpemUuCisg
ICAgaWYgKGQtPm1fY3VycmVudEJsb2NrWm9vbU5vZGUgJiYgZC0+bV9zaG91bGRSZWZsb3dCbG9j
ayAmJiBzZXR0aW5ncygpLT50ZXh0UmVmbG93TW9kZSgpICE9IFdlYlNldHRpbmdzOjpUZXh0UmVm
bG93RGlzYWJsZWQpIHsKKyAgICAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGQtPm1fY3Vy
cmVudEJsb2NrWm9vbU5vZGUtPnJlbmRlcmVyKCk7CisgICAgICAgIGlmIChyZW5kZXJlciAmJiBy
ZW5kZXJlci0+aXNUZXh0KCkpIHsKKyAgICAgICAgICAgIGRvdWJsZSBuZXdGb250U2l6ZSA9IHJl
bmRlcmVyLT5zdHlsZSgpLT5mb250U2l6ZSgpICogbmV3U2NhbGU7CisgICAgICAgICAgICBpZiAo
bmV3Rm9udFNpemUgPCBkLT5tX3dlYlNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKSkgeworICAg
ICAgICAgICAgICAgIG5ld1NjYWxlID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8ZG91YmxlPihkLT5t
X3dlYlNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKSkgLyByZW5kZXJlci0+c3R5bGUoKS0+Zm9u
dFNpemUoKSwgZC0+bWF4QmxvY2tab29tU2NhbGUoKSk7CisgICAgICAgICAgICAgICAgbmV3U2Nh
bGUgPSBzdGQ6Om1heChuZXdTY2FsZSwgbWluaW11bVNjYWxlKCkpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgYmxvY2tSZWN0LnNldFdpZHRoKG9sZFNjYWxlICogc3RhdGljX2Nhc3Q8ZG91
YmxlPihkLT50cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKCkud2lkdGgoKSkgLyBuZXdTY2Fs
ZSk7CisgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgdGhlIHNjYWxlIGhlcmUgdG8gdGFrZSBp
biB0byBhY2NvdW50IHRoZSBtYXJnaW4uCisgICAgICAgICAgICBuZXdTY2FsZSA9IHN0ZDo6bWlu
KGQtPm5ld1NjYWxlRm9yQmxvY2tab29tUmVjdChibG9ja1JlY3QsIG9sZFNjYWxlLCBtYXJnaW4p
LCBkLT5tYXhCbG9ja1pvb21TY2FsZSgpKTsKKyAgICAgICAgICAgIG5ld1NjYWxlID0gc3RkOjpt
YXgobmV3U2NhbGUsIG1pbmltdW1TY2FsZSgpKTsgLy8gU3RpbGwsIGl0J3Mgbm90IGFsbG93ZWQg
dG8gYmUgc21hbGxlciB0aGFuIG1pbmltdW0gc2NhbGUuCisgICAgICAgIH0KKyAgICB9CisjZW5k
aWYKKworICAgIC8vIEFsaWduIHRoZSB6b29tZWQgYmxvY2sgaW4gdGhlIHNjcmVlbi4KKyAgICBk
b3VibGUgbmV3QmxvY2tIZWlnaHQgPSBkLT5tYXBGcm9tVHJhbnNmb3JtZWQoYmxvY2tSZWN0KS5o
ZWlnaHQoKTsKKyAgICBkb3VibGUgbmV3QmxvY2tXaWR0aCA9IGQtPm1hcEZyb21UcmFuc2Zvcm1l
ZChibG9ja1JlY3QpLndpZHRoKCk7CisgICAgZG91YmxlIHNjYWxlZFZpZXdwb3J0V2lkdGggPSBz
dGF0aWNfY2FzdDxkb3VibGU+KGQtPmFjdHVhbFZpc2libGVTaXplKCkud2lkdGgoKSkgKiBvbGRT
Y2FsZSAvIG5ld1NjYWxlOworICAgIGRvdWJsZSBzY2FsZWRWaWV3cG9ydEhlaWdodCA9IHN0YXRp
Y19jYXN0PGRvdWJsZT4oZC0+YWN0dWFsVmlzaWJsZVNpemUoKS5oZWlnaHQoKSkgKiBvbGRTY2Fs
ZSAvIG5ld1NjYWxlOworICAgIGRvdWJsZSBkeCA9IHN0ZDo6bWF4KDAuMCwgKHNjYWxlZFZpZXdw
b3J0V2lkdGggLSBuZXdCbG9ja1dpZHRoKSAvIDIuMCk7CisgICAgZG91YmxlIGR5ID0gc3RkOjpt
YXgoMC4wLCAoc2NhbGVkVmlld3BvcnRIZWlnaHQgLSBuZXdCbG9ja0hlaWdodCkgLyAyLjApOwor
CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGQtPm1fY3VycmVudEJsb2NrWm9vbUFkanVz
dGVkTm9kZS0+cmVuZGVyZXIoKTsKKyAgICBGbG9hdFBvaW50IGFuY2hvcjsKKyAgICBGbG9hdFBv
aW50IHRvcExlZnRQb2ludChkLT5tYXBGcm9tVHJhbnNmb3JtZWQoYmxvY2tSZWN0KS5sb2NhdGlv
bigpKTsKKyAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXItPmlzVGV4dCgpKSB7CisgICAgICAg
IEVUZXh0QWxpZ24gdGV4dEFsaWduID0gcmVuZGVyZXItPnN0eWxlKCktPnRleHRBbGlnbigpOwor
ICAgICAgICBzd2l0Y2ggKHRleHRBbGlnbikgeworICAgICAgICBjYXNlIENFTlRFUjoKKyAgICAg
ICAgY2FzZSBXRUJLSVRfQ0VOVEVSOgorICAgICAgICAgICAgYW5jaG9yID0gRmxvYXRQb2ludChu
b2RlUmVjdC54KCkgKyAobm9kZVJlY3Qud2lkdGgoKSAtIHNjYWxlZFZpZXdwb3J0V2lkdGgpIC8g
MiwgdG9wTGVmdFBvaW50LnkoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBM
RUZUOgorICAgICAgICBjYXNlIFdFQktJVF9MRUZUOgorICAgICAgICAgICAgYW5jaG9yID0gdG9w
TGVmdFBvaW50OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUklHSFQ6CisgICAg
ICAgIGNhc2UgV0VCS0lUX1JJR0hUOgorICAgICAgICAgICAgYW5jaG9yID0gRmxvYXRQb2ludChu
b2RlUmVjdC54KCkgKyBub2RlUmVjdC53aWR0aCgpIC0gc2NhbGVkVmlld3BvcnRXaWR0aCwgdG9w
TGVmdFBvaW50LnkoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUQUFVVE86
CisgICAgICAgIGNhc2UgSlVTVElGWToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlm
IChyZW5kZXJlci0+c3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQorICAgICAgICAg
ICAgICAgIGFuY2hvciA9IHRvcExlZnRQb2ludDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICBhbmNob3IgPSBGbG9hdFBvaW50KG5vZGVSZWN0LngoKSArIG5vZGVSZWN0LndpZHRo
KCkgLSBzY2FsZWRWaWV3cG9ydFdpZHRoLCB0b3BMZWZ0UG9pbnQueSgpKTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIGFuY2hvciA9IHJlbmRlcmVy
LT5zdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyB0b3BMZWZ0UG9pbnQgOiBGbG9h
dFBvaW50KG5vZGVSZWN0LngoKSArIG5vZGVSZWN0LndpZHRoKCkgLSBzY2FsZWRWaWV3cG9ydFdp
ZHRoLCB0b3BMZWZ0UG9pbnQueSgpKTsKKworICAgIGlmIChuZXdCbG9ja0hlaWdodCA8PSBzY2Fs
ZWRWaWV3cG9ydEhlaWdodCkgeworICAgICAgICAvLyBUaGUgYmxvY2sgZml0cyBpbiB0aGUgdmll
d3BvcnQgc28gY2VudGVyIGl0LgorICAgICAgICBkLT5tX2ZpbmFsQmxvY2tQb2ludCA9IEZsb2F0
UG9pbnQoYW5jaG9yLngoKSAtIGR4LCBhbmNob3IueSgpIC0gZHkpOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIC8vIFRoZSBibG9jayBpcyBsb25nZXIgdGhhbiB0aGUgdmlld3BvcnQgc28gdG9wIGFs
aWduIGl0IGFuZCBhZGQgMyBwaXhlbCBtYXJnaW4uCisgICAgICAgIGQtPm1fZmluYWxCbG9ja1Bv
aW50ID0gRmxvYXRQb2ludChhbmNob3IueCgpIC0gZHgsIGFuY2hvci55KCkgLSAzKTsKKyAgICB9
CisKKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9XKQorICAgIC8vIFdlIGRvbid0IGtub3cgaG93
IGxvbmcgdGhlIHJlZmxvd2VkIGJsb2NrIHdpbGwgYmUgc28gd2UgcG9zaXRpb24gaXQgYXQgdGhl
IHRvcCBvZiB0aGUgc2NyZWVuIHdpdGggYSBzbWFsbCBtYXJnaW4uCisgICAgaWYgKHNldHRpbmdz
KCktPnRleHRSZWZsb3dNb2RlKCkgIT0gV2ViU2V0dGluZ3M6OlRleHRSZWZsb3dEaXNhYmxlZCkg
eworICAgICAgICBkLT5tX2ZpbmFsQmxvY2tQb2ludCA9IEZsb2F0UG9pbnQoYW5jaG9yLngoKSAt
IGR4LCBhbmNob3IueSgpIC0gMyk7CisgICAgICAgIGQtPm1fZmluYWxCbG9ja1BvaW50UmVmbG93
T2Zmc2V0ID0gRmxvYXRQb2ludCgtZHgsIC0zKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIE1h
a2Ugc3VyZSB0aGF0IHRoZSBvcmlnaW5hbCBub2RlIHJlY3QgaXMgdmlzaWJsZSBpbiB0aGUgc2Ny
ZWVuIGFmdGVyIHRoZSB6b29tLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBpZGVudGlm
aWVkIGJsb2NrIHJlY3QgbWlnaHQKKyAgICAvLyBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIG9yaWdp
bmFsIG5vZGUgcmVjdCwgYW5kIGl0IGNvdWxkIGZvcmNlIHRoZSBvcmlnaW5hbCBub2RlIHJlY3Qg
b2ZmIHRoZSBzY3JlZW4uCisgICAgRmxvYXRSZWN0IGJyKGFuY2hvciwgRmxvYXRTaXplKHNjYWxl
ZFZpZXdwb3J0V2lkdGgsIHNjYWxlZFZpZXdwb3J0SGVpZ2h0KSk7CisgICAgSW50UG9pbnQgY2xp
Y2tQb2ludCA9IGQtPm1hcEZyb21UcmFuc2Zvcm1lZChJbnRQb2ludCh4LCB5KSk7CisgICAgaWYg
KCFici5jb250YWlucyhjbGlja1BvaW50KSkgeworICAgICAgICBkLT5tX2ZpbmFsQmxvY2tQb2lu
dFJlZmxvd09mZnNldC5tb3ZlKDAsIChjbGlja1BvaW50LnkoKSAtIHNjYWxlZFZpZXdwb3J0SGVp
Z2h0IC8gMikgLSBkLT5tX2ZpbmFsQmxvY2tQb2ludC55KCkpOworICAgICAgICBkLT5tX2ZpbmFs
QmxvY2tQb2ludCA9IEZsb2F0UG9pbnQoZC0+bV9maW5hbEJsb2NrUG9pbnQueCgpLCBjbGlja1Bv
aW50LnkoKSAtIHNjYWxlZFZpZXdwb3J0SGVpZ2h0IC8gMik7CisgICAgfQorCisgICAgLy8gQ2xh
bXAgdGhlIGZpbmFsQmxvY2tQb2ludCB0byBub3QgY2F1c2UgYW55IG92ZXJmbG93IHNjcm9sbGlu
Zy4KKyAgICBpZiAoZC0+bV9maW5hbEJsb2NrUG9pbnQueCgpIDwgMCkgeworICAgICAgICBkLT5t
X2ZpbmFsQmxvY2tQb2ludC5zZXRYKDApOworICAgICAgICBkLT5tX2ZpbmFsQmxvY2tQb2ludFJl
Zmxvd09mZnNldC5zZXRYKDApOworICAgIH0gZWxzZSBpZiAoZC0+bV9maW5hbEJsb2NrUG9pbnQu
eCgpICsgc2NhbGVkVmlld3BvcnRXaWR0aCA+IGQtPmNvbnRlbnRzU2l6ZSgpLndpZHRoKCkpIHsK
KyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnQuc2V0WChkLT5jb250ZW50c1NpemUoKS53aWR0
aCgpIC0gc2NhbGVkVmlld3BvcnRXaWR0aCk7CisgICAgICAgIGQtPm1fZmluYWxCbG9ja1BvaW50
UmVmbG93T2Zmc2V0LnNldFgoMCk7CisgICAgfQorCisgICAgaWYgKGQtPm1fZmluYWxCbG9ja1Bv
aW50LnkoKSA8IDApIHsKKyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnQuc2V0WSgwKTsKKyAg
ICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnRSZWZsb3dPZmZzZXQuc2V0WSgwKTsKKyAgICB9IGVs
c2UgaWYgKGQtPm1fZmluYWxCbG9ja1BvaW50LnkoKSArIHNjYWxlZFZpZXdwb3J0SGVpZ2h0ID4g
ZC0+Y29udGVudHNTaXplKCkuaGVpZ2h0KCkpIHsKKyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9p
bnQuc2V0WShkLT5jb250ZW50c1NpemUoKS5oZWlnaHQoKSAtIHNjYWxlZFZpZXdwb3J0SGVpZ2h0
KTsKKyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnRSZWZsb3dPZmZzZXQuc2V0WSgwKTsKKyAg
ICB9CisKKyAgICBkLT5tX2ZpbmFsQmxvY2tQb2ludCA9IGQtPm1hcFRvVHJhbnNmb3JtZWRGbG9h
dFBvaW50KGQtPm1fZmluYWxCbG9ja1BvaW50KTsKKworICAgIC8vIERvbid0IGJsb2NrIHpvb20g
aWYgdGhlIHVzZXIgaXMgem9vbWluZyBhbmQgdGhlIG5ldyBzY2FsZSBpcyBvbmx5IG1hcmdpbmFs
bHkgZGlmZmVyZW50IGZyb20gdGhlCisgICAgLy8gb2xkU2NhbGUgd2l0aCBvbmx5IGEgbWFyZ2lu
YWwgY2hhbmdlIGluIHNjcm9sbCBwb3NpdGlvbi4gSWdub3JlIHNjcm9sbCBkaWZmZXJlbmNlIGlu
IHRoZSBzcGVjaWFsIGNhc2UKKyAgICAvLyB0aGF0IHRoZSB6b29tIGxldmVsIGlzIHRoZSBtaW5p
bXVtU2NhbGUuCisgICAgaWYgKCFlbmRPZkJsb2NrWm9vbU1vZGUgJiYgYWJzKG5ld1NjYWxlIC0g
b2xkU2NhbGUpIC8gb2xkU2NhbGUgPCBtaW5pbXVtRXhwYW5kaW5nUmF0aW8pIHsKKyAgICAgICAg
Y29uc3QgZG91YmxlIG1pbmltdW1EaXNwbGFjZW1lbnQgPSBtaW5pbXVtRXhwYW5kaW5nUmF0aW8g
KiBkLT50cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKCkud2lkdGgoKTsKKyAgICAgICAgaWYg
KG9sZFNjYWxlID09IGQtPm1pbmltdW1TY2FsZSgpIHx8IChkaXN0YW5jZUJldHdlZW5Qb2ludHMo
cm91bmRUcmFuc2Zvcm1lZFBvaW50KGQtPm1hcFRvVHJhbnNmb3JtZWQoZC0+c2Nyb2xsUG9zaXRp
b24oKSkpLCByb3VuZFRyYW5zZm9ybWVkUG9pbnQoZC0+bV9maW5hbEJsb2NrUG9pbnQpKSA8IG1p
bmltdW1EaXNwbGFjZW1lbnQgJiYgYWJzKG5ld1NjYWxlIC0gb2xkU2NhbGUpIC8gb2xkU2NhbGUg
PCAwLjEwKSkgeworICAgICAgICAgICAgaWYgKGlzRmlyc3Rab29tKSB7CisgICAgICAgICAgICAg
ICAgZC0+cmVzZXRCbG9ja1pvb20oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBab29tIG91dCBvZiBibG9jayB6b29tLgorICAg
ICAgICAgICAgYmxvY2tab29tKHgsIHkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICBkLT5tX2Jsb2NrWm9vbUZpbmFsU2NhbGUgPSBuZXdTY2FsZTsK
KworICAgIC8vIFdlIHNldCB0aGlzIGhlcmUgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHRyeSB0byBy
ZS1yZW5kZXIgdGhlIHBhZ2UgYXQgYSBkaWZmZXJlbnQgem9vbSBsZXZlbCBkdXJpbmcgbG9hZGlu
Zy4KKyAgICBkLT5tX3VzZXJQZXJmb3JtZWRNYW51YWxab29tID0gdHJ1ZTsKKyAgICBkLT5tX3Vz
ZXJQZXJmb3JtZWRNYW51YWxTY3JvbGwgPSB0cnVlOworICAgIGQtPm1fY2xpZW50LT5hbmltYXRl
QmxvY2tab29tKGQtPm1fZmluYWxCbG9ja1BvaW50LCBkLT5tX2Jsb2NrWm9vbUZpbmFsU2NhbGUp
OworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgV2ViUGFnZTo6aXNNYXhab29tZWQoKSBj
b25zdAoreworICAgIHJldHVybiAoZC0+Y3VycmVudFNjYWxlKCkgPT0gZC0+bWF4aW11bVNjYWxl
KCkpIHx8ICFkLT5pc1VzZXJTY2FsYWJsZSgpOworfQorCitib29sIFdlYlBhZ2U6OmlzTWluWm9v
bWVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKGQtPmN1cnJlbnRTY2FsZSgpID09IGQtPm1pbmlt
dW1TY2FsZSgpKSB8fCAhZC0+aXNVc2VyU2NhbGFibGUoKTsKK30KKworYm9vbCBXZWJQYWdlOjpp
c0F0SW5pdGlhbFpvb20oKSBjb25zdAoreworICAgIHJldHVybiAoZC0+Y3VycmVudFNjYWxlKCkg
PT0gZC0+aW5pdGlhbFNjYWxlKCkpIHx8ICFkLT5pc1VzZXJTY2FsYWJsZSgpOworfQorCitib29s
IFdlYlBhZ2VQcml2YXRlOjpzaG91bGRab29tT25Fc2NhcGUoKSBjb25zdAoreworICAgIGlmICgh
aXNVc2VyU2NhbGFibGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWYgdGhl
IGluaXRpYWwgc2NhbGUgaXMgbm90IHJlYWNoYWJsZSwgZG9uJ3QgdHJ5IHRvIHpvb20uCisgICAg
aWYgKGluaXRpYWxTY2FsZSgpIDwgbWluaW11bVNjYWxlKCkgfHwgaW5pdGlhbFNjYWxlKCkgPiBt
YXhpbXVtU2NhbGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRG9uJ3QgZXZl
ciB6b29tIGluIHdoZW4gd2UgcHJlc3MgZXNjYXBlLgorICAgIGlmIChpbml0aWFsU2NhbGUoKSA+
PSBjdXJyZW50U2NhbGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGN1
cnJlbnRTY2FsZSgpICE9IGluaXRpYWxTY2FsZSgpOworfQorCit2b2lkIFdlYlBhZ2U6Onpvb21U
b0luaXRpYWxTY2FsZSgpCit7CisgICAgaWYgKCFkLT5pc1VzZXJTY2FsYWJsZSgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBkLT56b29tQWJvdXRQb2ludChkLT5pbml0aWFsU2NhbGUoKSwgZC0+
Y2VudGVyT2ZWaXNpYmxlQ29udGVudHNSZWN0KCkpOworfQorCitib29sIFdlYlBhZ2U6Onpvb21U
b09uZU9uZSgpCit7CisgICAgaWYgKCFkLT5pc1VzZXJTY2FsYWJsZSgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBkb3VibGUgc2NhbGUgPSAxOworICAgIHJldHVybiBkLT56b29tQWJv
dXRQb2ludChzY2FsZSwgZC0+Y2VudGVyT2ZWaXNpYmxlQ29udGVudHNSZWN0KCkpOworfQorCitQ
bGF0Zm9ybTo6SW50UmVjdCBXZWJQYWdlOjpmb2N1c05vZGVSZWN0KCkKK3sKKyAgICByZXR1cm4g
ZC0+Zm9jdXNOb2RlUmVjdCgpOworfQorCit2b2lkIFdlYlBhZ2U6OnNldEZvY3VzZWQoYm9vbCBm
b2N1c2VkKQoreworICAgIEZvY3VzQ29udHJvbGxlciogZm9jdXNDb250cm9sbGVyID0gZC0+bV9w
YWdlLT5mb2N1c0NvbnRyb2xsZXIoKTsKKyAgICBmb2N1c0NvbnRyb2xsZXItPnNldEFjdGl2ZShm
b2N1c2VkKTsKKyAgICBpZiAoZm9jdXNlZCkgeworICAgICAgICBGcmFtZSogZnJhbWUgPSBmb2N1
c0NvbnRyb2xsZXItPmZvY3VzZWRGcmFtZSgpOworICAgICAgICBpZiAoIWZyYW1lKQorICAgICAg
ICAgICAgZm9jdXNDb250cm9sbGVyLT5zZXRGb2N1c2VkRnJhbWUoZC0+bV9tYWluRnJhbWUpOwor
ICAgIH0KKyAgICBmb2N1c0NvbnRyb2xsZXItPnNldEZvY3VzZWQoZm9jdXNlZCk7Cit9CisKK2Jv
b2wgV2ViUGFnZTo6ZmluZE5leHRTdHJpbmcoY29uc3QgY2hhciogdGV4dCwgYm9vbCBmb3J3YXJk
KQoreworICAgIHJldHVybiBkLT5tX2luUGFnZVNlYXJjaE1hbmFnZXItPmZpbmROZXh0U3RyaW5n
KFN0cmluZzo6ZnJvbVVURjgodGV4dCksIGZvcndhcmQpOworfQorCit2b2lkIFdlYlBhZ2U6OnJ1
bkxheW91dFRlc3RzKCkKK3sKKyNpZiBFTkFCTEVfRFJUCisgICAgLy8gRklYTUU6IGRvIHdlIG5l
ZWQgQVBJIHRvIHRvZ2dsZSB0aGlzPworICAgIGQtPm1fcGFnZS0+c2V0dGluZ3MoKS0+c2V0RGV2
ZWxvcGVyRXh0cmFzRW5hYmxlZCh0cnVlKTsKKworICAgIGlmICghZC0+bV9kdW1wUmVuZGVyVHJl
ZSkKKyAgICAgICAgZC0+bV9kdW1wUmVuZGVyVHJlZSA9IG5ldyBEdW1wUmVuZGVyVHJlZSh0aGlz
KTsKKyAgICBkLT5tX2R1bXBSZW5kZXJUcmVlLT5ydW5UZXN0cygpOworI2VuZGlmCit9CisKK2Jv
b2wgV2ViUGFnZTo6ZW5hYmxlU2NyaXB0RGVidWdnZXIoKQoreworI2lmIEVOQUJMRShKQVZBU0NS
SVBUX0RFQlVHR0VSKQorICAgIGlmIChkLT5tX3NjcmlwdERlYnVnZ2VyKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIGQtPm1fc2NyaXB0RGVidWdnZXIgPSBhZG9wdFB0cihuZXcgSmF2YVNj
cmlwdERlYnVnZ2VyQmxhY2tCZXJyeSh0aGlzLT5kKSk7CisKKyAgICByZXR1cm4gISFkLT5tX3Nj
cmlwdERlYnVnZ2VyOworI2VuZGlmCit9CisKK2Jvb2wgV2ViUGFnZTo6ZGlzYWJsZVNjcmlwdERl
YnVnZ2VyKCkKK3sKKyNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKKyAgICBpZiAoIWQt
Pm1fc2NyaXB0RGVidWdnZXIpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgZC0+bV9zY3Jp
cHREZWJ1Z2dlci5jbGVhcigpOworICAgIHJldHVybiB0cnVlOworI2VuZGlmCit9CisKK3ZvaWQg
V2ViUGFnZTo6YWRkQnJlYWtwb2ludChjb25zdCB1bnNpZ25lZCBzaG9ydCogdXJsLCB1bnNpZ25l
ZCB1cmxMZW5ndGgsIGludCBsaW5lTnVtYmVyLCBjb25zdCB1bnNpZ25lZCBzaG9ydCogY29uZGl0
aW9uLCB1bnNpZ25lZCBjb25kaXRpb25MZW5ndGgpCit7CisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRf
REVCVUdHRVIpCisgICAgaWYgKGQtPm1fc2NyaXB0RGVidWdnZXIpCisgICAgICAgIGQtPm1fc2Ny
aXB0RGVidWdnZXItPmFkZEJyZWFrcG9pbnQodXJsLCB1cmxMZW5ndGgsIGxpbmVOdW1iZXIsIGNv
bmRpdGlvbiwgY29uZGl0aW9uTGVuZ3RoKTsKKyNlbmRpZgorfQorCit2b2lkIFdlYlBhZ2U6OnVw
ZGF0ZUJyZWFrcG9pbnQoY29uc3QgdW5zaWduZWQgc2hvcnQqIHVybCwgdW5zaWduZWQgdXJsTGVu
Z3RoLCBpbnQgbGluZU51bWJlciwgY29uc3QgdW5zaWduZWQgc2hvcnQqIGNvbmRpdGlvbiwgdW5z
aWduZWQgY29uZGl0aW9uTGVuZ3RoKQoreworI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VS
KQorICAgIGlmIChkLT5tX3NjcmlwdERlYnVnZ2VyKQorICAgICAgICBkLT5tX3NjcmlwdERlYnVn
Z2VyLT51cGRhdGVCcmVha3BvaW50KHVybCwgdXJsTGVuZ3RoLCBsaW5lTnVtYmVyLCBjb25kaXRp
b24sIGNvbmRpdGlvbkxlbmd0aCk7CisjZW5kaWYKK30KKwordm9pZCBXZWJQYWdlOjpyZW1vdmVC
cmVha3BvaW50KGNvbnN0IHVuc2lnbmVkIHNob3J0KiB1cmwsIHVuc2lnbmVkIHVybExlbmd0aCwg
aW50IGxpbmVOdW1iZXIpCit7CisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCisgICAg
aWYgKGQtPm1fc2NyaXB0RGVidWdnZXIpCisgICAgICAgIGQtPm1fc2NyaXB0RGVidWdnZXItPnJl
bW92ZUJyZWFrcG9pbnQodXJsLCB1cmxMZW5ndGgsIGxpbmVOdW1iZXIpOworI2VuZGlmCit9CisK
K2Jvb2wgV2ViUGFnZTo6cGF1c2VPbkV4Y2VwdGlvbnMoKQoreworI2lmIEVOQUJMRShKQVZBU0NS
SVBUX0RFQlVHR0VSKQorICAgIHJldHVybiBkLT5tX3NjcmlwdERlYnVnZ2VyID8gZC0+bV9zY3Jp
cHREZWJ1Z2dlci0+cGF1c2VPbkV4Y2VwdGlvbnMoKSA6IGZhbHNlOworI2VuZGlmCit9CisKK3Zv
aWQgV2ViUGFnZTo6c2V0UGF1c2VPbkV4Y2VwdGlvbnMoYm9vbCBwYXVzZSkKK3sKKyNpZiBFTkFC
TEUoSkFWQVNDUklQVF9ERUJVR0dFUikKKyAgICBpZiAoZC0+bV9zY3JpcHREZWJ1Z2dlcikKKyAg
ICAgICAgZC0+bV9zY3JpcHREZWJ1Z2dlci0+c2V0UGF1c2VPbkV4Y2VwdGlvbnMocGF1c2UpOwor
I2VuZGlmCit9CisKK3ZvaWQgV2ViUGFnZTo6cGF1c2VJbkRlYnVnZ2VyKCkKKworeworI2lmIEVO
QUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQorICAgIGlmIChkLT5tX3NjcmlwdERlYnVnZ2VyKQor
ICAgICAgICBkLT5tX3NjcmlwdERlYnVnZ2VyLT5wYXVzZUluRGVidWdnZXIoKTsKKyNlbmRpZgor
fQorCit2b2lkIFdlYlBhZ2U6OnJlc3VtZURlYnVnZ2VyKCkKK3sKKyNpZiBFTkFCTEUoSkFWQVND
UklQVF9ERUJVR0dFUikKKyAgICBpZiAoZC0+bV9zY3JpcHREZWJ1Z2dlcikKKyAgICAgICAgZC0+
bV9zY3JpcHREZWJ1Z2dlci0+cmVzdW1lRGVidWdnZXIoKTsKKyNlbmRpZgorfQorCit2b2lkIFdl
YlBhZ2U6OnN0ZXBPdmVyU3RhdGVtZW50SW5EZWJ1Z2dlcigpCit7CisjaWYgRU5BQkxFKEpBVkFT
Q1JJUFRfREVCVUdHRVIpCisgICAgaWYgKGQtPm1fc2NyaXB0RGVidWdnZXIpCisgICAgICAgIGQt
Pm1fc2NyaXB0RGVidWdnZXItPnN0ZXBPdmVyU3RhdGVtZW50SW5EZWJ1Z2dlcigpOworI2VuZGlm
Cit9CisKK3ZvaWQgV2ViUGFnZTo6c3RlcEludG9TdGF0ZW1lbnRJbkRlYnVnZ2VyKCkKK3sKKyNp
ZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKKyAgICBpZiAoZC0+bV9zY3JpcHREZWJ1Z2dl
cikKKyAgICAgICAgZC0+bV9zY3JpcHREZWJ1Z2dlci0+c3RlcEludG9TdGF0ZW1lbnRJbkRlYnVn
Z2VyKCk7CisjZW5kaWYKK30KKwordm9pZCBXZWJQYWdlOjpzdGVwT3V0T2ZGdW5jdGlvbkluRGVi
dWdnZXIoKQoreworI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQorICAgIGlmIChkLT5t
X3NjcmlwdERlYnVnZ2VyKQorICAgICAgICBkLT5tX3NjcmlwdERlYnVnZ2VyLT5zdGVwT3V0T2ZG
dW5jdGlvbkluRGVidWdnZXIoKTsKKyNlbmRpZgorfQorCit1bnNpZ25lZCBXZWJQYWdlOjp0aW1l
b3V0Rm9ySmF2YVNjcmlwdEV4ZWN1dGlvbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIFNldHRpbmdz
Ojp0aW1lb3V0Rm9ySmF2YVNjcmlwdEV4ZWN1dGlvbihkLT5tX3BhZ2UtPmdyb3VwTmFtZSgpKTsK
K30KKwordm9pZCBXZWJQYWdlOjpzZXRUaW1lb3V0Rm9ySmF2YVNjcmlwdEV4ZWN1dGlvbih1bnNp
Z25lZCBtcykKK3sKKyAgICBTZXR0aW5nczo6c2V0VGltZW91dEZvckphdmFTY3JpcHRFeGVjdXRp
b24oZC0+bV9wYWdlLT5ncm91cE5hbWUoKSwgbXMpOworCisgICAgRG9jdW1lbnQqIGRvYyA9IGQt
Pm1fcGFnZS0+bWFpbkZyYW1lKCktPmRvY3VtZW50KCk7CisgICAgaWYgKCFkb2MpCisgICAgICAg
IHJldHVybjsKKworICAgIGRvYy0+Z2xvYmFsRGF0YSgpLT50aW1lb3V0Q2hlY2tlci5zZXRUaW1l
b3V0SW50ZXJ2YWwobXMpOworfQorCitKU0NvbnRleHRSZWYgV2ViUGFnZTo6c2NyaXB0Q29udGV4
dCgpIGNvbnN0Cit7CisgICAgaWYgKCFkLT5tX21haW5GcmFtZSkKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgSlNDOjpCaW5kaW5nczo6Um9vdE9iamVjdCAqcm9vdCA9IGQtPm1fbWFpbkZyYW1lLT5z
Y3JpcHQoKS0+YmluZGluZ1Jvb3RPYmplY3QoKTsKKyAgICBpZiAoIXJvb3QpCisgICAgICAgIHJl
dHVybiAwOworICAgIEpTQzo6RXhlY1N0YXRlICpleGVjID0gcm9vdC0+Z2xvYmFsT2JqZWN0KCkt
Pmdsb2JhbEV4ZWMoKTsKKyAgICByZXR1cm4gdG9SZWYoZXhlYyk7Cit9CisKK0pTVmFsdWVSZWYg
V2ViUGFnZTo6d2luZG93T2JqZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gdG9SZWYoZC0+bV9t
YWluRnJhbWUtPnNjcmlwdCgpLT5nbG9iYWxPYmplY3QobWFpblRocmVhZE5vcm1hbFdvcmxkKCkp
KTsKK30KKworI2lmIEVOQUJMRShXRUJET00pCitXZWJET01Eb2N1bWVudCBXZWJQYWdlOjpkb2N1
bWVudCgpIGNvbnN0Cit7CisgICAgaWYgKCFkLT5tX21haW5GcmFtZSkKKyAgICAgICAgcmV0dXJu
IFdlYkRPTURvY3VtZW50KCk7CisgICAgcmV0dXJuIFdlYkRPTURvY3VtZW50KGQtPm1fbWFpbkZy
YW1lLT5kb2N1bWVudCgpKTsKK30KKyNlbmRpZgorCisvLyBTZXJpYWxpemUgb25seSB0aGUgbWVt
YmVycyBvZiBIaXN0b3J5SXRlbSB3aGljaCBhcmUgbmVlZGVkIGJ5IHRoZSBjbGllbnQsCisvLyBh
bmQgY29weSB0aGVtIGludG8gYSBTaGFyZWRBcnJheS4gQWxzbyBpbmNsdWRlIHRoZSBIaXN0b3J5
SXRlbSBwb2ludGVyIHdoaWNoCisvLyB3aWxsIGJlIHVzZWQgYnkgdGhlIGNsaWVudCBhcyBhbiBv
cGFxdWUgcmVmZXJlbmNlIHRvIGlkZW50aWZ5IHRoZSBpdGVtLgordm9pZCBXZWJQYWdlOjpnZXRC
YWNrRm9yd2FyZExpc3QoU2hhcmVkQXJyYXk8QmFja0ZvcndhcmRFbnRyeT4mIHJlc3VsdCwgdW5z
aWduZWQgaW50JiByZXN1bHRTaXplKSBjb25zdAoreworICAgIEhpc3RvcnlJdGVtVmVjdG9yIGVu
dHJpZXMgPSBzdGF0aWNfY2FzdDxCYWNrRm9yd2FyZExpc3RJbXBsKj4oZC0+bV9wYWdlLT5iYWNr
Rm9yd2FyZCgpLT5jbGllbnQoKSktPmVudHJpZXMoKTsKKyAgICByZXN1bHRTaXplID0gZW50cmll
cy5zaXplKCk7CisgICAgcmVzdWx0LnJlc2V0KG5ldyBCYWNrRm9yd2FyZEVudHJ5W3Jlc3VsdFNp
emVdKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCByZXN1bHRTaXplOyArK2kpIHsK
KyAgICAgICAgUmVmUHRyPEhpc3RvcnlJdGVtPiBlbnRyeSA9IGVudHJpZXNbaV07CisgICAgICAg
IEJhY2tGb3J3YXJkRW50cnkmIHJlc3VsdEVudHJ5ID0gcmVzdWx0W2ldOworICAgICAgICByZXN1
bHRFbnRyeS51cmwgPSBlbnRyeS0+dXJsU3RyaW5nKCk7CisgICAgICAgIHJlc3VsdEVudHJ5Lm9y
aWdpbmFsVXJsID0gZW50cnktPm9yaWdpbmFsVVJMU3RyaW5nKCk7CisgICAgICAgIHJlc3VsdEVu
dHJ5LnRpdGxlID0gZW50cnktPnRpdGxlKCk7CisgICAgICAgIHJlc3VsdEVudHJ5Lm5ldHdvcmtU
b2tlbiA9IGVudHJ5LT52aWV3U3RhdGUoKS5uZXR3b3JrVG9rZW47CisgICAgICAgIHJlc3VsdEVu
dHJ5Lmxhc3RWaXNpdFdhc0hUVFBOb25HZXQgPSBlbnRyeS0+bGFzdFZpc2l0V2FzSFRUUE5vbkdl
dCgpOworICAgICAgICByZXN1bHRFbnRyeS5pZCA9IGJhY2tGb3J3YXJkSWRGcm9tSGlzdG9yeUl0
ZW0oZW50cnkuZ2V0KCkpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgSGlzdG9yeUl0ZW0g
aXMgbm90IGRpc3Bvc2VkIHdoaWxlIHRoZSByZXN1bHQgbGlzdCBpcyBzdGlsbCBiZWluZyB1c2Vk
LCB0byBtYWtlIHN1cmUgdGhlIHBvaW50ZXIgaXMgbm90IHJldXNlZAorICAgICAgICAvLyB3aWxs
IGJlIGJhbGFuY2VkIGJ5IGRlcmVmIGluIHJlbGVhc2VCYWNrRm9yd2FyZEVudHJ5LgorICAgICAg
ICBlbnRyeS0+cmVmKCk7CisgICAgfQorfQorCit2b2lkIFdlYlBhZ2U6OnJlbGVhc2VCYWNrRm9y
d2FyZEVudHJ5KEJhY2tGb3J3YXJkSWQgaWQpIGNvbnN0Cit7CisgICAgSGlzdG9yeUl0ZW0qIGl0
ZW0gPSBoaXN0b3J5SXRlbUZyb21CYWNrRm9yd2FyZElkKGlkKTsKKyAgICBBU1NFUlQoaXRlbSk7
CisgICAgaXRlbS0+ZGVyZWYoKTsKK30KKwordm9pZCBXZWJQYWdlOjpjbGVhckJyb3dzaW5nRGF0
YSgpCit7CisgICAgY2xlYXJNZW1vcnlDYWNoZXMoKTsKKyAgICBjbGVhckFwcENhY2hlKGQtPm1f
cGFnZS0+Z3JvdXBOYW1lKCkpOworICAgIGNsZWFyTG9jYWxTdG9yYWdlKCk7CisgICAgY2xlYXJD
b29raWVDYWNoZSgpOworICAgIGNsZWFySGlzdG9yeSgpOworICAgIGNsZWFyUGx1Z2luU2l0ZURh
dGEoKTsKK30KKwordm9pZCBXZWJQYWdlOjpjbGVhckhpc3RvcnkoKQoreworICAgIC8vIERvbid0
IGNsZWFyIHRoZSBiYWNrLWZvcndhcmQgbGlzdCBhcyB3ZSBtaWdodCBsaWtlIHRvIGtlZXAgaXQu
Cit9CisKK3ZvaWQgV2ViUGFnZTo6Y2xlYXJDb29raWVzKCkKK3sKKyAgICBjbGVhckNvb2tpZUNh
Y2hlKCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6Y2xlYXJMb2NhbFN0b3JhZ2UoKQoreworICAgIEJs
YWNrQmVycnk6OldlYktpdDo6Y2xlYXJMb2NhbFN0b3JhZ2UoZC0+bV9wYWdlLT5ncm91cE5hbWUo
KSk7CisgICAgY2xlYXJEYXRhYmFzZShkLT5tX3BhZ2UtPmdyb3VwTmFtZSgpKTsKK30KKwordm9p
ZCBXZWJQYWdlOjpjbGVhckNhY2hlKCkKK3sKKyAgICBjbGVhck1lbW9yeUNhY2hlcygpOworICAg
IGNsZWFyQXBwQ2FjaGUoZC0+bV9wYWdlLT5ncm91cE5hbWUoKSk7Cit9CisKK3ZvaWQgV2ViUGFn
ZTo6Y2xlYXJCYWNrRm9yd2FyZExpc3QoYm9vbCBrZWVwQ3VycmVudFBhZ2UpIGNvbnN0Cit7Cisg
ICAgQmFja0ZvcndhcmRMaXN0SW1wbCogYmFja0ZvcndhcmRMaXN0ID0gc3RhdGljX2Nhc3Q8QmFj
a0ZvcndhcmRMaXN0SW1wbCo+KGQtPm1fcGFnZS0+YmFja0ZvcndhcmQoKS0+Y2xpZW50KCkpOwor
ICAgIFJlZlB0cjxIaXN0b3J5SXRlbT4gY3VycmVudEl0ZW0gPSBiYWNrRm9yd2FyZExpc3QtPmN1
cnJlbnRJdGVtKCk7CisgICAgd2hpbGUgKCFiYWNrRm9yd2FyZExpc3QtPmVudHJpZXMoKS5pc0Vt
cHR5KCkpCisgICAgICAgIGJhY2tGb3J3YXJkTGlzdC0+cmVtb3ZlSXRlbShiYWNrRm9yd2FyZExp
c3QtPmVudHJpZXMoKS5sYXN0KCkuZ2V0KCkpOworICAgIGlmIChrZWVwQ3VycmVudFBhZ2UpCisg
ICAgICAgIGJhY2tGb3J3YXJkTGlzdC0+YWRkSXRlbShjdXJyZW50SXRlbSk7Cit9CisKK2Jvb2wg
V2ViUGFnZTo6aXNFbmFibGVMb2NhbEFjY2Vzc1RvQWxsQ29va2llcygpIGNvbnN0Cit7CisgICAg
cmV0dXJuIGNvb2tpZU1hbmFnZXIoKS5jYW5Mb2NhbEFjY2Vzc0FsbENvb2tpZXMoKTsKK30KKwor
dm9pZCBXZWJQYWdlOjpzZXRFbmFibGVMb2NhbEFjY2Vzc1RvQWxsQ29va2llcyhib29sIGVuYWJs
ZWQpCit7CisgICAgY29va2llTWFuYWdlcigpLnNldENhbkxvY2FsQWNjZXNzQWxsQ29va2llcyhl
bmFibGVkKTsKK30KKwordm9pZCBXZWJQYWdlOjphZGRWaXNpdGVkTGluayhjb25zdCB1bnNpZ25l
ZCBzaG9ydCogdXJsLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworICAgIEFTU0VSVChkLT5tX3Bh
Z2UpOworICAgIGQtPm1fcGFnZS0+Z3JvdXAoKS5hZGRWaXNpdGVkTGluayh1cmwsIGxlbmd0aCk7
Cit9CisKKyNpZiBFTkFCTEUoV0VCRE9NKQorV2ViRE9NTm9kZSBXZWJQYWdlOjpub2RlQXRQb2lu
dChpbnQgeCwgaW50IHkpCit7CisgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQgPSBkLT5tX21haW5G
cmFtZS0+ZXZlbnRIYW5kbGVyKCktPmhpdFRlc3RSZXN1bHRBdFBvaW50KGQtPm1hcEZyb21UcmFu
c2Zvcm1lZChJbnRQb2ludCh4LCB5KSksIGZhbHNlKTsKKyAgICBOb2RlKiBub2RlID0gcmVzdWx0
LmlubmVyTm9uU2hhcmVkTm9kZSgpOworICAgIHJldHVybiBXZWJET01Ob2RlKG5vZGUpOworfQor
Citib29sIFdlYlBhZ2U6OmdldE5vZGVSZWN0KGNvbnN0IFdlYkRPTU5vZGUmIG5vZGUsIFBsYXRm
b3JtOjpJbnRSZWN0JiByZXN1bHQpCit7CisgICAgTm9kZSogbm9kZUltcGwgPSBub2RlLmltcGwo
KTsKKyAgICBpZiAobm9kZUltcGwgJiYgbm9kZUltcGwtPnJlbmRlcmVyKCkpIHsKKyAgICAgICAg
cmVzdWx0ID0gbm9kZUltcGwtPmdldFJlY3QoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
fQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFdlYlBhZ2U6OnNldE5vZGVGb2N1cyhj
b25zdCBXZWJET01Ob2RlJiBub2RlLCBib29sIG9uKQoreworICAgIE5vZGUqIG5vZGVJbXBsID0g
bm9kZS5pbXBsKCk7CisKKyAgICBpZiAobm9kZUltcGwgJiYgbm9kZUltcGwtPmlzRm9jdXNhYmxl
KCkpIHsKKyAgICAgICAgRG9jdW1lbnQqIGRvYyA9IG5vZGVJbXBsLT5kb2N1bWVudCgpOworICAg
ICAgICBpZiAoUGFnZSogcGFnZSA9IGRvYy0+cGFnZSgpKSB7CisgICAgICAgICAgICAvLyBNb2Rp
ZnkgaWYgZm9jdXNpbmcgb24gbm9kZSBvciB0dXJuaW5nIG9mZiBmb2N1c2VkIG5vZGUuCisgICAg
ICAgICAgICBpZiAob24pIHsKKyAgICAgICAgICAgICAgICBwYWdlLT5mb2N1c0NvbnRyb2xsZXIo
KS0+c2V0Rm9jdXNlZE5vZGUobm9kZUltcGwsIGRvYy0+ZnJhbWUoKSk7CisgICAgICAgICAgICAg
ICAgaWYgKG5vZGVJbXBsLT5pc0VsZW1lbnROb2RlKCkpCisgICAgICAgICAgICAgICAgICAgIHN0
YXRpY19jYXN0PEVsZW1lbnQqPihub2RlSW1wbCktPnVwZGF0ZUZvY3VzQXBwZWFyYW5jZSh0cnVl
KTsKKyAgICAgICAgICAgICAgICBkLT5tX2lucHV0SGFuZGxlci0+ZGlkTm9kZU9wZW5Qb3B1cChu
b2RlSW1wbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRvYy0+Zm9jdXNlZE5vZGUoKSA9PSBu
b2RlSW1wbCkgLy8gJiYgIW9uCisgICAgICAgICAgICAgICAgcGFnZS0+Zm9jdXNDb250cm9sbGVy
KCktPnNldEZvY3VzZWROb2RlKDAsIGRvYy0+ZnJhbWUoKSk7CisKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBX
ZWJQYWdlOjpzZXROb2RlSG92ZXJlZChjb25zdCBXZWJET01Ob2RlJiBub2RlLCBib29sIG9uKQor
eworICAgIGlmIChOb2RlKiBub2RlSW1wbCA9IG5vZGUuaW1wbCgpKSB7CisgICAgICAgIG5vZGVJ
bXBsLT5zZXRIb3ZlcmVkKG9uKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJl
dHVybiBmYWxzZTsKK30KKworYm9vbCBXZWJQYWdlOjpub2RlSGFzSG92ZXIoY29uc3QgV2ViRE9N
Tm9kZSYgbm9kZSkKK3sKKyAgICBpZiAoTm9kZSogbm9kZUltcGwgPSBub2RlLmltcGwoKSkgewor
ICAgICAgICBpZiAoUmVuZGVyU3R5bGUqIHN0eWxlID0gbm9kZUltcGwtPnJlbmRlclN0eWxlKCkp
CisgICAgICAgICAgICByZXR1cm4gc3R5bGUtPmFmZmVjdGVkQnlIb3ZlclJ1bGVzKCk7CisgICAg
fQorICAgIHJldHVybiBmYWxzZTsKK30KKyNlbmRpZgorCitTdHJpbmcgV2ViUGFnZVByaXZhdGU6
OmZpbmRQYXR0ZXJuU3RyaW5nRm9yVXJsKGNvbnN0IEtVUkwmIHVybCkgY29uc3QKK3sKKyAgICBp
ZiAoKG1fd2ViU2V0dGluZ3MtPnNob3VsZEhhbmRsZVBhdHRlcm5VcmxzKCkgJiYgcHJvdG9jb2xJ
cyh1cmwsICJwYXR0ZXJuIikpCisgICAgICAgICAgICB8fCBwcm90b2NvbElzKHVybCwgInRlbCIp
CisgICAgICAgICAgICB8fCBwcm90b2NvbElzKHVybCwgInd0YWkiKQorICAgICAgICAgICAgfHwg
cHJvdG9jb2xJcyh1cmwsICJjdGkiKQorICAgICAgICAgICAgfHwgcHJvdG9jb2xJcyh1cmwsICJt
YWlsdG8iKQorICAgICAgICAgICAgfHwgcHJvdG9jb2xJcyh1cmwsICJzbXMiKQorICAgICAgICAg
ICAgfHwgcHJvdG9jb2xJcyh1cmwsICJwaW4iKSkgeworICAgICAgICByZXR1cm4gdXJsOworICAg
IH0KKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK2Jvb2wgV2ViUGFnZTo6ZGVmZXJzTG9hZGlu
ZygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fcGFnZS0+ZGVmZXJzTG9hZGluZygpOworfQor
Citib29sIFdlYlBhZ2U6OndpbGxGaXJlVGltZXIoKQoreworICAgIGlmIChkLT5pc0xvYWRpbmco
KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZC0+bV9iYWNraW5nU3RvcmUt
PmQtPndpbGxGaXJlVGltZXIoKTsKK30KKwordm9pZCBXZWJQYWdlOjpub3RpZnlQYWdlUGF1c2Uo
KQoreworICAgIEhhc2hTZXQ8UGx1Z2luVmlldyo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGQtPm1f
cGx1Z2luVmlld3MuYmVnaW4oKTsKKyAgICBIYXNoU2V0PFBsdWdpblZpZXcqPjo6Y29uc3RfaXRl
cmF0b3IgbGFzdCA9IGQtPm1fcGx1Z2luVmlld3MuZW5kKCk7CisgICAgZm9yICg7IGl0ICE9IGxh
c3Q7ICsraXQpCisgICAgICAgICgqaXQpLT5oYW5kbGVQYXVzZUV2ZW50KCk7Cit9CisKK3ZvaWQg
V2ViUGFnZTo6bm90aWZ5UGFnZVJlc3VtZSgpCit7CisgICAgSGFzaFNldDxQbHVnaW5WaWV3Kj46
OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZC0+bV9wbHVnaW5WaWV3cy5iZWdpbigpOworICAgIEhhc2hT
ZXQ8UGx1Z2luVmlldyo+Ojpjb25zdF9pdGVyYXRvciBsYXN0ID0gZC0+bV9wbHVnaW5WaWV3cy5l
bmQoKTsKKyAgICBmb3IgKDsgaXQgIT0gbGFzdDsgKytpdCkKKyAgICAgICAgKCppdCktPmhhbmRs
ZVJlc3VtZUV2ZW50KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90aWZ5UGFnZUJhY2tncm91bmQo
KQoreworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBkLT5zdXNwZW5kUm9v
dExheWVyQ29tbWl0KCk7CisjZW5kaWYKKworICAgIEhhc2hTZXQ8UGx1Z2luVmlldyo+Ojpjb25z
dF9pdGVyYXRvciBpdCA9IGQtPm1fcGx1Z2luVmlld3MuYmVnaW4oKTsKKyAgICBIYXNoU2V0PFBs
dWdpblZpZXcqPjo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IGQtPm1fcGx1Z2luVmlld3MuZW5kKCk7
CisgICAgZm9yICg7IGl0ICE9IGxhc3Q7ICsraXQpCisgICAgICAgICgqaXQpLT5oYW5kbGVCYWNr
Z3JvdW5kRXZlbnQoKTsKK30KKwordm9pZCBXZWJQYWdlOjpub3RpZnlQYWdlRm9yZWdyb3VuZCgp
Cit7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGQtPnJlc3VtZVJvb3RM
YXllckNvbW1pdCgpOworI2VuZGlmCisKKyAgICBIYXNoU2V0PFBsdWdpblZpZXcqPjo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBkLT5tX3BsdWdpblZpZXdzLmJlZ2luKCk7CisgICAgSGFzaFNldDxQbHVn
aW5WaWV3Kj46OmNvbnN0X2l0ZXJhdG9yIGxhc3QgPSBkLT5tX3BsdWdpblZpZXdzLmVuZCgpOwor
ICAgIGZvciAoOyBpdCAhPSBsYXN0OyArK2l0KQorICAgICAgICAoKml0KS0+aGFuZGxlRm9yZWdy
b3VuZEV2ZW50KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90aWZ5UGFnZUZ1bGxTY3JlZW5BbGxv
d2VkKCkKK3sKKyAgICBIYXNoU2V0PFBsdWdpblZpZXcqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBk
LT5tX3BsdWdpblZpZXdzLmJlZ2luKCk7CisgICAgSGFzaFNldDxQbHVnaW5WaWV3Kj46OmNvbnN0
X2l0ZXJhdG9yIGxhc3QgPSBkLT5tX3BsdWdpblZpZXdzLmVuZCgpOworICAgIGZvciAoOyBpdCAh
PSBsYXN0OyArK2l0KQorICAgICAgICAoKml0KS0+aGFuZGxlRnVsbFNjcmVlbkFsbG93ZWRFdmVu
dCgpOworfQorCit2b2lkIFdlYlBhZ2U6Om5vdGlmeVBhZ2VGdWxsU2NyZWVuRXhpdCgpCit7Cisg
ICAgSGFzaFNldDxQbHVnaW5WaWV3Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZC0+bV9wbHVnaW5W
aWV3cy5iZWdpbigpOworICAgIEhhc2hTZXQ8UGx1Z2luVmlldyo+Ojpjb25zdF9pdGVyYXRvciBs
YXN0ID0gZC0+bV9wbHVnaW5WaWV3cy5lbmQoKTsKKyAgICBmb3IgKDsgaXQgIT0gbGFzdDsgKytp
dCkKKyAgICAgICAgKCppdCktPmhhbmRsZUZ1bGxTY3JlZW5FeGl0RXZlbnQoKTsKK30KKwordm9p
ZCBXZWJQYWdlOjpub3RpZnlEZXZpY2VJZGxlU3RhdGVDaGFuZ2UoYm9vbCBlbnRlcklkbGUpCit7
CisgICAgSGFzaFNldDxQbHVnaW5WaWV3Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZC0+bV9wbHVn
aW5WaWV3cy5iZWdpbigpOworICAgIEhhc2hTZXQ8UGx1Z2luVmlldyo+Ojpjb25zdF9pdGVyYXRv
ciBsYXN0ID0gZC0+bV9wbHVnaW5WaWV3cy5lbmQoKTsKKyAgICBmb3IgKDsgaXQgIT0gbGFzdDsg
KytpdCkKKyAgICAgICAgKCppdCktPmhhbmRsZUlkbGVFdmVudChlbnRlcklkbGUpOworfQorCit2
b2lkIFdlYlBhZ2U6Om5vdGlmeUFwcEFjdGl2YXRpb25TdGF0ZUNoYW5nZShBY3RpdmF0aW9uU3Rh
dGVUeXBlIGFjdGl2YXRpb25TdGF0ZSkKK3sKKyAgICBIYXNoU2V0PFBsdWdpblZpZXcqPjo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBkLT5tX3BsdWdpblZpZXdzLmJlZ2luKCk7CisgICAgSGFzaFNldDxQ
bHVnaW5WaWV3Kj46OmNvbnN0X2l0ZXJhdG9yIGxhc3QgPSBkLT5tX3BsdWdpblZpZXdzLmVuZCgp
OworCisjaWYgRU5BQkxFKFZJREVPKQorICAgIE1lZGlhUGxheWVyUHJpdmF0ZTo6bm90aWZ5QXBw
QWN0aXZhdGVkRXZlbnQoYWN0aXZhdGlvblN0YXRlID09IEFjdGl2YXRpb25BY3RpdmUpOworI2Vu
ZGlmCisKKyAgICBmb3IgKDsgaXQgIT0gbGFzdDsgKytpdCkgeworICAgICAgICBzd2l0Y2ggKGFj
dGl2YXRpb25TdGF0ZSkgeworICAgICAgICBjYXNlIEFjdGl2YXRpb25BY3RpdmU6CisgICAgICAg
ICAgICAoKml0KS0+aGFuZGxlQXBwQWN0aXZhdGVkRXZlbnQoKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIEFjdGl2YXRpb25JbmFjdGl2ZToKKyAgICAgICAgICAgICgqaXQpLT5o
YW5kbGVBcHBEZWFjdGl2YXRlZEV2ZW50KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBBY3RpdmF0aW9uU3RhbmRieToKKyAgICAgICAgICAgICgqaXQpLT5oYW5kbGVBcHBTdGFu
ZGJ5RXZlbnQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBGSVhN
RTogR2V0IHJpZCBvZiB0aGUgZGVmYXVsdCB0byBmb3JjZSBhIGNvbXBpbGVyIGVycm9yIGluc3Rl
YWQgb2YgdXNpbmcgYSBydW50aW1lIGVycm9yLiBTZWUgUFIgIzEyMTEwOS4KKyAgICAgICAgICAg
IEFTU0VSVCgwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2
b2lkIFdlYlBhZ2U6Om5vdGlmeVN3aXBlRXZlbnQoKQoreworICAgIEhhc2hTZXQ8UGx1Z2luVmll
dyo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGQtPm1fcGx1Z2luVmlld3MuYmVnaW4oKTsKKyAgICBI
YXNoU2V0PFBsdWdpblZpZXcqPjo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IGQtPm1fcGx1Z2luVmll
d3MuZW5kKCk7CisgICAgZm9yICg7IGl0ICE9IGxhc3Q7ICsraXQpCisgICAgICAgKCppdCktPmhh
bmRsZVN3aXBlRXZlbnQoKTsKK30KKwordm9pZCBXZWJQYWdlOjpub3RpZnlTY3JlZW5Qb3dlclN0
YXRlQ2hhbmdlZChib29sIHBvd2VyZWQpCit7CisgICAgSGFzaFNldDxQbHVnaW5WaWV3Kj46OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gZC0+bV9wbHVnaW5WaWV3cy5iZWdpbigpOworICAgIEhhc2hTZXQ8
UGx1Z2luVmlldyo+Ojpjb25zdF9pdGVyYXRvciBsYXN0ID0gZC0+bV9wbHVnaW5WaWV3cy5lbmQo
KTsKKyAgICBmb3IgKDsgaXQgIT0gbGFzdDsgKytpdCkKKyAgICAgICAoKml0KS0+aGFuZGxlU2Ny
ZWVuUG93ZXJFdmVudChwb3dlcmVkKTsKK30KKwordm9pZCBXZWJQYWdlOjpub3RpZnlGdWxsU2Ny
ZWVuVmlkZW9FeGl0ZWQoYm9vbCBkb25lKQoreworICAgIFVOVVNFRF9QQVJBTShkb25lKTsKKyNp
ZiBFTkFCTEUoVklERU8pCisgICAgaWYgKEhUTUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVudCA9
IHN0YXRpY19jYXN0PEhUTUxNZWRpYUVsZW1lbnQqPihkLT5tX2Z1bGxzY3JlZW5WaWRlb05vZGUu
Z2V0KCkpKQorICAgICAgICBtZWRpYUVsZW1lbnQtPmV4aXRGdWxsc2NyZWVuKCk7CisjZW5kaWYK
K30KKwordm9pZCBXZWJQYWdlOjpjbGVhclBsdWdpblNpdGVEYXRhKCkKK3sKKyAgICBQbHVnaW5E
YXRhYmFzZSogZGF0YWJhc2UgPSBQbHVnaW5EYXRhYmFzZTo6aW5zdGFsbGVkUGx1Z2lucyh0cnVl
KTsKKworICAgIGlmICghZGF0YWJhc2UpCisgICAgICAgIHJldHVybjsKKworICAgIFZlY3RvcjxQ
bHVnaW5QYWNrYWdlKj4gcGx1Z2lucyA9IGRhdGFiYXNlLT5wbHVnaW5zKCk7CisKKyAgICBWZWN0
b3I8UGx1Z2luUGFja2FnZSo+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBwbHVnaW5zLmVuZCgpOwor
ICAgIGZvciAoVmVjdG9yPFBsdWdpblBhY2thZ2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBwbHVn
aW5zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgKCppdCktPmNsZWFyU2l0ZURh
dGEoU3RyaW5nKCkpOworfQorCit2b2lkIFdlYlBhZ2U6Om9uSW5wdXRMb2NhbGVDaGFuZ2VkKGJv
b2wgaXNSVEwpCit7CisgICAgZC0+b25JbnB1dExvY2FsZUNoYW5nZWQoaXNSVEwpOworfQorCit2
b2lkIFdlYlBhZ2U6Om9uTmV0d29ya0F2YWlsYWJpbGl0eUNoYW5nZWQoYm9vbCBhdmFpbGFibGUp
Cit7CisgICAgdXBkYXRlT25saW5lU3RhdHVzKGF2YWlsYWJsZSk7Cit9CisKK3ZvaWQgV2ViUGFn
ZTo6b25DZXJ0aWZpY2F0ZVN0b3JlTG9jYXRpb25TZXQoY29uc3QgV2ViU3RyaW5nJiBjYVBhdGgp
Cit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIE1lZGlhUGxheWVyUHJpdmF0ZTo6c2V0Q2VydGlm
aWNhdGVQYXRoKGNhUGF0aCk7CisjZW5kaWYKK30KKwordm9pZCBXZWJQYWdlOjplbmFibGVXZWJJ
bnNwZWN0b3IoKQoreworICAgIGQtPm1fcGFnZS0+aW5zcGVjdG9yQ29udHJvbGxlcigpLT5jb25u
ZWN0RnJvbnRlbmQoKTsKKyAgICBkLT5tX3BhZ2UtPnNldHRpbmdzKCktPnNldERldmVsb3BlckV4
dHJhc0VuYWJsZWQodHJ1ZSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6ZGlzYWJsZVdlYkluc3BlY3Rv
cigpCit7CisgICAgZC0+bV9wYWdlLT5pbnNwZWN0b3JDb250cm9sbGVyKCktPmRpc2Nvbm5lY3RG
cm9udGVuZCgpOworICAgIGQtPm1fcGFnZS0+c2V0dGluZ3MoKS0+c2V0RGV2ZWxvcGVyRXh0cmFz
RW5hYmxlZChmYWxzZSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6ZW5hYmxlUGFzc3dvcmRFY2hvKCkK
K3sKKyAgICBkLT5tX3BhZ2UtPnNldHRpbmdzKCktPnNldFBhc3N3b3JkRWNob0VuYWJsZWQodHJ1
ZSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6ZGlzYWJsZVBhc3N3b3JkRWNobygpCit7CisgICAgZC0+
bV9wYWdlLT5zZXR0aW5ncygpLT5zZXRQYXNzd29yZEVjaG9FbmFibGVkKGZhbHNlKTsKK30KKwor
dm9pZCBXZWJQYWdlOjpkaXNwYXRjaEluc3BlY3Rvck1lc3NhZ2UoY29uc3QgY2hhciogbWVzc2Fn
ZSwgaW50IGxlbmd0aCkKK3sKKyAgICBTdHJpbmcgc3RyaW5nTWVzc2FnZShtZXNzYWdlLCBsZW5n
dGgpOworICAgIGQtPm1fcGFnZS0+aW5zcGVjdG9yQ29udHJvbGxlcigpLT5kaXNwYXRjaE1lc3Nh
Z2VGcm9tRnJvbnRlbmQoc3RyaW5nTWVzc2FnZSk7Cit9CisKK0ZyYW1lKiBXZWJQYWdlOjptYWlu
RnJhbWUoKSBjb25zdAoreworICAgIHJldHVybiBkLT5tX21haW5GcmFtZTsKK30KKworI2lmIFVT
RShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmRyYXdMYXll
cnNPbkNvbW1pdCgpCit7CisgICAgaWYgKCFQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1l
c3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgLy8gVGhpcyBtZXRo
b2Qgd2lsbCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZSBsYXllciBhcHBlYXJhbmNlIGNoYW5nZWQg
ZHVlIHRvCisgICAgICAgIC8vIGFuaW1hdGlvbnMuIEFuZCBvbmx5IGlmIHdlIGRvbid0IG5lZWQg
YSBvbmUgc2hvdCBkcmF3aW5nIHN5bmMuCisgICAgICAgIEFTU0VSVCghbmVlZHNPbmVTaG90RHJh
d2luZ1N5bmNocm9uaXphdGlvbigpKTsKKworICAgICAgICBpZiAoIW1fd2ViUGFnZS0+aXNWaXNp
YmxlKCkgfHwgIW1fYmFja2luZ1N0b3JlLT5kLT5pc0FjdGl2ZSgpKQorICAgICAgICAgICAgcmV0
dXJuOworCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT53aWxsRHJhd0xheWVyc09uQ29tbWl0
KCk7CisKKyAgICAgICAgUGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50
KCktPmRpc3BhdGNoTWVzc2FnZSgKKyAgICAgICAgICAgIFBsYXRmb3JtOjpjcmVhdGVNZXRob2RD
YWxsTWVzc2FnZSgmV2ViUGFnZVByaXZhdGU6OmRyYXdMYXllcnNPbkNvbW1pdCwgdGhpcykpOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1fY2xpZW50LT53aW5kb3coKS0+d2lu
ZG93VXNhZ2UoKSA9PSBQbGF0Zm9ybTo6R3JhcGhpY3M6OldpbmRvdzo6R0xFUzJVc2FnZSkgewor
ICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+YmxpdFZpc2libGVDb250ZW50cygpOworICAgICAg
ICByZXR1cm47IC8vIGJsaXRWaXNpYmxlQ29udGVudHMoKSBpbmNsdWRlcyBkcmF3U3ViTGF5ZXJz
KCkgaW4gdGhpcyBjYXNlLgorICAgIH0KKworICAgIGlmICghZHJhd1N1YkxheWVycygpKQorICAg
ICAgICByZXR1cm47CisKKyAgICAvLyBJZiB3ZSB1c2UgdGhlIGNvbXBvc2l0aW5nIHN1cmZhY2Us
IHdlIG5lZWQgdG8gcmUtYmxpdCB0aGUKKyAgICAvLyBiYWNraW5nc3RvcmUgYW5kIGJsZW5kIHRo
ZSBjb21wb3NpdGluZyBzdXJmYWNlIG9uIHRvcCBvZiB0aGF0CisgICAgLy8gaW4gb3JkZXIgdG8g
Z2V0IHRoZSBuZXdseSBkcmF3biBsYXllcnMgb24gc2NyZWVuLgorICAgIGlmICghU3VyZmFjZVBv
b2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPmNvbXBvc2l0aW5nU3VyZmFjZSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICAvLyBJZiB0aGVyZSBhcmUgbm8gdmlzaWJsZSBsYXllcnMsIHJldHVybiBl
YXJseS4KKyAgICBpZiAobGFzdENvbXBvc2l0aW5nUmVzdWx0cygpLmlzRW1wdHkoKSAmJiBsYXN0
Q29tcG9zaXRpbmdSZXN1bHRzKCkud2FzRW1wdHkpCisgICAgICAgIHJldHVybjsKKworICAgIGlm
IChtX2JhY2tpbmdTdG9yZS0+ZC0+c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV9iYWNraW5nU3RvcmUtPmQtPmJsaXRWaXNpYmxlQ29udGVu
dHMoKTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6ZHJhd1N1YkxheWVycyhjb25zdCBJbnRS
ZWN0JiBkc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIGNvbnRlbnRzKQoreworICAgIEFTU0VSVChQ
bGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhy
ZWFkKCkpOworICAgIGlmICghUGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xp
ZW50KCktPmlzQ3VycmVudFRocmVhZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBp
ZiAobV9jb21wb3NpdG9yKSB7CisgICAgICAgIG1fY29tcG9zaXRvci0+c2V0Q29tcG9zaXRpbmdP
bnRvTWFpbldpbmRvdygKKyAgICAgICAgICAgIG1fY2xpZW50LT53aW5kb3coKS0+d2luZG93VXNh
Z2UoKSA9PSBQbGF0Zm9ybTo6R3JhcGhpY3M6OldpbmRvdzo6R0xFUzJVc2FnZSk7CisgICAgICAg
IHJldHVybiBtX2NvbXBvc2l0b3ItPmRyYXdMYXllcnMoZHN0UmVjdCwgY29udGVudHMpOworICAg
IH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6ZHJhd1N1
YkxheWVycygpCit7CisgICAgQVNTRVJUKFBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVz
c2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSk7CisgICAgaWYgKCFQbGF0Zm9ybTo6dXNl
ckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZS0+ZC0+ZHJhd1N1
YkxheWVycygpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzY2hlZHVsZVJvb3RMYXllckNv
bW1pdCgpCit7CisgICAgaWYgKCFtX2ZyYW1lTGF5ZXJzIHx8ICFtX2ZyYW1lTGF5ZXJzLT5oYXNM
YXllcigpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX25lZWRzQ29tbWl0ID0gdHJ1ZTsKKyAg
ICBpZiAoIW1fcm9vdExheWVyQ29tbWl0VGltZXItPmlzQWN0aXZlKCkpCisgICAgICAgIG1fcm9v
dExheWVyQ29tbWl0VGltZXItPnN0YXJ0T25lU2hvdCgwKTsKK30KKworc3RhdGljIGJvb2wgbmVl
ZHNMYXlvdXRSZWN1cnNpdmUoRnJhbWVWaWV3KiB2aWV3KQoreworICAgIGlmICh2aWV3LT5uZWVk
c0xheW91dCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGJvb2wgc3ViZnJhbWVzTmVl
ZHNMYXlvdXQgPSBmYWxzZTsKKyAgICBjb25zdCBIYXNoU2V0PFJlZlB0cjxXaWRnZXQ+ID4qIHZp
ZXdDaGlsZHJlbiA9IHZpZXctPmNoaWxkcmVuKCk7CisgICAgSGFzaFNldDxSZWZQdHI8V2lkZ2V0
PiA+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSB2aWV3Q2hpbGRyZW4tPmVuZCgpOworICAgIGZvciAo
SGFzaFNldDxSZWZQdHI8V2lkZ2V0PiA+Ojpjb25zdF9pdGVyYXRvciBjdXJyZW50ID0gdmlld0No
aWxkcmVuLT5iZWdpbigpOyBjdXJyZW50ICE9IGVuZCAmJiAhc3ViZnJhbWVzTmVlZHNMYXlvdXQ7
ICsrY3VycmVudCkgeworICAgICAgICBXaWRnZXQqIHdpZGdldCA9ICgqY3VycmVudCkuZ2V0KCk7
CisgICAgICAgIGlmICh3aWRnZXQtPmlzRnJhbWVWaWV3KCkpCisgICAgICAgICAgICBzdWJmcmFt
ZXNOZWVkc0xheW91dCB8PSBuZWVkc0xheW91dFJlY3Vyc2l2ZShzdGF0aWNfY2FzdDxGcmFtZVZp
ZXcqPih3aWRnZXQpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3ViZnJhbWVzTmVlZHNMYXlvdXQ7
Cit9CisKK0xheWVyUmVuZGVyaW5nUmVzdWx0cyBXZWJQYWdlUHJpdmF0ZTo6bGFzdENvbXBvc2l0
aW5nUmVzdWx0cygpIGNvbnN0Cit7CisgICAgaWYgKG1fY29tcG9zaXRvcikKKyAgICAgICAgcmV0
dXJuIG1fY29tcG9zaXRvci0+bGFzdENvbXBvc2l0aW5nUmVzdWx0cygpOworICAgIHJldHVybiBM
YXllclJlbmRlcmluZ1Jlc3VsdHMoKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6Y29tbWl0
Um9vdExheWVyKGNvbnN0IEludFJlY3QmIGxheW91dFJlY3RGb3JDb21wb3NpdGluZywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRTaXplJiBjb250ZW50c1Np
emVGb3JDb21wb3NpdGluZykKK3sKKyAgICBpZiAoIW1fZnJhbWVMYXllcnMgfHwgIW1fY29tcG9z
aXRvcikKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9jb21wb3NpdG9yLT5zZXRMYXlvdXRSZWN0
Rm9yQ29tcG9zaXRpbmcobGF5b3V0UmVjdEZvckNvbXBvc2l0aW5nKTsKKyAgICBtX2NvbXBvc2l0
b3ItPnNldENvbnRlbnRzU2l6ZUZvckNvbXBvc2l0aW5nKGNvbnRlbnRzU2l6ZUZvckNvbXBvc2l0
aW5nKTsKKyAgICBtX2NvbXBvc2l0b3ItPmNvbW1pdChtX2ZyYW1lTGF5ZXJzLT5yb290TGF5ZXIo
KSk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmNvbW1pdFJvb3RMYXllcklmTmVlZGVkKCkK
K3sKKyAgICBpZiAobV9zdXNwZW5kUm9vdExheWVyQ29tbWl0KQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBpZiAoIW1fbmVlZHNDb21taXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIGlmICghbV9mcmFtZUxheWVycyB8fCAhbV9mcmFtZUxheWVycy0+aGFzTGF5ZXIoKSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgRnJhbWVWaWV3KiB2aWV3ID0gbV9tYWluRnJhbWUt
PnZpZXcoKTsKKyAgICBpZiAoIXZpZXcpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8v
IElmIHdlIHN5bmMgY29tcG9zaXRpbmcgbGF5ZXJzIHdoZW4gYSBsYXlvdXQgaXMgcGVuZGluZywg
d2UgbWF5IGNhdXNlIHBhaW50aW5nIG9mIGNvbXBvc2l0aW5nCisgICAgLy8gbGF5ZXIgY29udGVu
dCB0byBvY2N1ciBiZWZvcmUgbGF5b3V0IGhhcyBoYXBwZW5lZCwgd2hpY2ggd2lsbCBjYXVzZSBw
YWludENvbnRlbnRzKCkgdG8gYmFpbC4KKyAgICBpZiAobmVlZHNMYXlvdXRSZWN1cnNpdmUodmll
dykpIHsKKyAgICAgICAgLy8gSW4gY2FzZSBvZiBvbmUgc2hvdCBkcmF3aW5nIHN5bmNocm9uaXph
dGlvbiwgeW91CisgICAgICAgIC8vIHNob3VsZCBmaXJzdCBsYXlvdXRJZk5lZWRlZCwgcmVuZGVy
LCB0aGVuIGNvbW1pdCBhbmQgZHJhdyB0aGUgbGF5ZXJzLgorICAgICAgICBBU1NFUlQoIW5lZWRz
T25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9CisKKyAgICBtX25lZWRzQ29tbWl0ID0gZmFsc2U7CisgICAgLy8gV2UgZ2V0IGhlcmUg
ZWl0aGVyIGR1ZSB0byB0aGUgY29tbWl0IHRpbWVyLCB3aGljaCB3b3VsZCBoYXZlIGNhbGxlZAor
ICAgIC8vIHJlbmRlciBpZiBhIG9uZSBzaG90IHN5bmMgd2FzIG5lZWRlZC4gT3Igd2UgZ2V0IGNh
bGxlZCBmcm9tIHJlbmRlcgorICAgIC8vIGJlZm9yZSB0aGUgdGltZXIgdGltZXMgb3V0LCB3aGlj
aCBtZWFucyB3ZSBhcmUgZG9pbmcgYSBvbmUgc2hvdCBhbnl3YXkuCisgICAgbV9uZWVkc09uZVNo
b3REcmF3aW5nU3luY2hyb25pemF0aW9uID0gZmFsc2U7CisKKyAgICBpZiAobV9yb290TGF5ZXJD
b21taXRUaW1lci0+aXNBY3RpdmUoKSkKKyAgICAgICAgbV9yb290TGF5ZXJDb21taXRUaW1lci0+
c3RvcCgpOworCisgICAgbV9mcmFtZUxheWVycy0+Y29tbWl0T25XZWJLaXRUaHJlYWQoY3VycmVu
dFNjYWxlKCkpOworICAgIHVwZGF0ZURlbGVnYXRlZE92ZXJsYXlzKCk7CisKKyAgICAvLyBTdGFz
aCB0aGUgdmlzaWJsZSBjb250ZW50IHJlY3QgYWNjb3JkaW5nIHRvIHdlYmtpdCB0aHJlYWQKKyAg
ICAvLyBUaGlzIGlzIHRoZSByZWN0YW5nbGUgdXNlZCB0byBsYXlvdXQgZml4ZWQgcG9zaXRpb25l
ZCBlbGVtZW50cywKKyAgICAvLyBhbmQgdGhhdCdzIHdoYXQgdGhlIGxheWVyIHJlbmRlcmVyIHdh
bnRzLgorICAgIEludFJlY3QgbGF5b3V0UmVjdEZvckNvbXBvc2l0aW5nKHNjcm9sbFBvc2l0aW9u
KCksIGFjdHVhbFZpc2libGVTaXplKCkpOworICAgIEludFNpemUgY29udGVudHNTaXplRm9yQ29t
cG9zaXRpbmcgPSBjb250ZW50c1NpemUoKTsKKworICAgIC8vIENvbW1pdCBjaGFuZ2VzIG1hZGUg
dG8gdGhlIGxheWVycyBzeW5jaHJvbm91c2x5IHdpdGggdGhlIGNvbXBvc2l0aW5nIHRocmVhZC4K
KyAgICBQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+ZGlzcGF0
Y2hTeW5jTWVzc2FnZSgKKyAgICAgICAgUGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdl
KAorICAgICAgICAgICAgJldlYlBhZ2VQcml2YXRlOjpjb21taXRSb290TGF5ZXIsCisgICAgICAg
ICAgICB0aGlzLAorICAgICAgICAgICAgbGF5b3V0UmVjdEZvckNvbXBvc2l0aW5nLAorICAgICAg
ICAgICAgY29udGVudHNTaXplRm9yQ29tcG9zaXRpbmcpKTsKKworICAgIHJldHVybiB0cnVlOwor
fQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpyb290TGF5ZXJDb21taXRUaW1lckZpcmVkKFRpbWVy
PFdlYlBhZ2VQcml2YXRlPiopCit7CisgICAgaWYgKG1fc3VzcGVuZFJvb3RMYXllckNvbW1pdCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVGhlIGNvbW1pdCB0aW1lciBtYXkgaGF2ZSBmaXJl
ZCBqdXN0IGJlZm9yZSB0aGUgbGF5b3V0IHRpbWVyLCBvciBmb3Igc29tZQorICAgIC8vIG90aGVy
IHJlYXNvbiB3ZSBuZWVkIGxheW91dC4gSXQncyBub3QgYWxsb3dlZCB0byBjb21taXQgd2hlbiBh
IGxheW91dCBpcworICAgIC8vIHBlbmRpbmcsIGJlY2F1ZXMgYSBjb21taXQgY2FuIGNhdXNlIHBh
cnRzIG9mIHRoZSB3ZWIgcGFnZSB0byBiZSByZW5kZXJlZAorICAgIC8vIHRvIHRleHR1cmUuCisg
ICAgLy8gVGhlIGxheW91dCBjYW4gYWxzbyB0dXJuIG9mIGNvbXBvc2l0aW5nIGFsdG9nZXRoZXIs
IHNvIHdlIG5lZWQgdG8gYmUgcHJlcGFyZWQKKyAgICAvLyB0byBoYW5kbGUgYSBvbmUgc2hvdCBk
cmF3aW5nIHN5bmNocm9uaXphdGlvbiBhZnRlciB0aGUgbGF5b3V0LgorICAgIHJlcXVlc3RMYXlv
dXRJZk5lZWRlZCgpOworCisgICAgYm9vbCBpc1NpbmdsZVRhcmdldFdpbmRvdyA9IFN1cmZhY2VQ
b29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT5jb21wb3NpdGluZ1N1cmZhY2UoKQorICAgICAgICB8
fCBtX2NsaWVudC0+d2luZG93KCktPndpbmRvd1VzYWdlKCkgPT0gUGxhdGZvcm06OkdyYXBoaWNz
OjpXaW5kb3c6OkdMRVMyVXNhZ2U7CisKKyAgICAvLyBJZiB3ZSBhcmUgZG9pbmcgZGlyZWN0IHJl
bmRlcmluZyBhbmQgaGF2ZSBhIHNpbmdsZSByZW5kZXJpbmcgdGFyZ2V0LAorICAgIC8vIGNvbW1p
dHRpbmcgaXMgZXF1aXZhbGVudCB0byBhIG9uZSBzaG90IGRyYXdpbmcgc3luY2hyb25pemF0aW9u
LgorICAgIC8vIFdlIG5lZWQgdG8gcmUtcmVuZGVyIHRoZSB3ZWIgcGFnZSwgcmUtcmVuZGVyIHRo
ZSBsYXllcnMsIGFuZAorICAgIC8vIHRoZW4gYmxpdCB0aGVtIG9uIHRvcCBvZiB0aGUgcmUtcmVu
ZGVyZWQgd2ViIHBhZ2UuCisgICAgaWYgKGlzU2luZ2xlVGFyZ2V0V2luZG93ICYmIG1fYmFja2lu
Z1N0b3JlLT5kLT5zaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKQorICAgICAgICBzZXRO
ZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0aW9uKCk7CisKKyAgICBpZiAobmVlZHNPbmVT
aG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpKSB7CisgICAgICAgIGNvbnN0IEludFJlY3Qgd2lu
ZG93UmVjdCA9IEludFJlY3QoSW50UG9pbnQ6Onplcm8oKSwgdmlld3BvcnRTaXplKCkpOworICAg
ICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+cmVwYWludCh3aW5kb3dSZWN0LCB0cnVlIC8qY29udGVu
dENoYW5nZWQqLywgdHJ1ZSAvKmltbWVkaWF0ZSovKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIC8vIElmIHRoZSB3ZWIgcGFnZSBuZWVkcyBsYXlvdXQsIHRoZSBjb21taXQgd2lsbCBm
YWlsLgorICAgIC8vIE5vIG5lZWQgdG8gZHJhdyB0aGUgbGF5ZXJzIGlmIG5vdGhpbmcgY2hhbmdl
ZC4KKyAgICBpZiAoY29tbWl0Um9vdExheWVySWZOZWVkZWQoKSkKKyAgICAgICAgZHJhd0xheWVy
c09uQ29tbWl0KCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldElzQWNjZWxlcmF0ZWRD
b21wb3NpdGluZ0FjdGl2ZShib29sIGFjdGl2ZSkKK3sKKyAgICAvLyBCYWNraW5nIHN0b3JlIGNh
biBiZSBudWxsIGhlcmUgYmVjYXVzZSBpdCBoYXBwZW5zIGR1cmluZyB0ZWFyZG93bi4KKyAgICBp
ZiAobV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmdBY3RpdmUgPT0gYWN0aXZlIHx8ICFtX2JhY2tp
bmdTdG9yZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRp
bmdBY3RpdmUgPSBhY3RpdmU7CisKKyAgICBpZiAoIWFjdGl2ZSkgeworICAgICAgICBtX2NvbXBv
c2l0b3IuY2xlYXIoKTsKKyAgICAgICAgcmVzZXRDb21wb3NpdGluZ1N1cmZhY2UoKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghbV9jb21wb3NpdG9yKSB7CisgICAgICAgIG1f
Y29tcG9zaXRvciA9IGFkb3B0UHRyKG5ldyBXZWJQYWdlQ29tcG9zaXRvcih0aGlzKSk7CisgICAg
ICAgIG1faXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nQWN0aXZlID0gbV9jb21wb3NpdG9yLT5oYXJk
d2FyZUNvbXBvc2l0aW5nKCk7CisgICAgICAgIGlmICghbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRp
bmdBY3RpdmUpCisgICAgICAgICAgICBtX2NvbXBvc2l0b3IuY2xlYXIoKTsKKyAgICB9Cit9CisK
K3ZvaWQgV2ViUGFnZVByaXZhdGU6OnJlc2V0Q29tcG9zaXRpbmdTdXJmYWNlKCkKK3sKKyAgICBp
ZiAoIVBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJl
bnRUaHJlYWQoKSkgeworICAgICAgICBQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3Nh
Z2VDbGllbnQoKS0+ZGlzcGF0Y2hNZXNzYWdlKAorICAgICAgICAgICAgUGxhdGZvcm06OmNyZWF0
ZU1ldGhvZENhbGxNZXNzYWdlKAorICAgICAgICAgICAgICAgICZXZWJQYWdlUHJpdmF0ZTo6cmVz
ZXRDb21wb3NpdGluZ1N1cmZhY2UsIHRoaXMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIGlmIChtX2NvbXBvc2l0b3IpCisgICAgICAgIG1fY29tcG9zaXRvci0+c2V0TGFzdENvbXBv
c2l0aW5nUmVzdWx0cyhMYXllclJlbmRlcmluZ1Jlc3VsdHMoKSk7Cit9CisKK3ZvaWQgV2ViUGFn
ZVByaXZhdGU6OnNldFJvb3RMYXllcldlYktpdFRocmVhZChGcmFtZSogZnJhbWUsIExheWVyV2Vi
S2l0VGhyZWFkKiBsYXllcikKK3sKKyAgICAvLyBUaGlzIG1ldGhvZCB1cGRhdGVzIHRoZSBGcmFt
ZUxheWVycyBiYXNlZCBvbiBpbnB1dCBmcm9tIFdlYkNvcmUuCisgICAgLy8gRnJhbWVMYXllcnMg
a2VlcHMgdHJhY2sgb2YgdGhlIGxheWVyIHByb3hpZXMgYXR0YWNoZWQgdG8gZnJhbWVzLgorICAg
IC8vIFdlIHdpbGwgaGF2ZSB0byBjb21wdXRlIGEgbmV3IHJvb3QgbGF5ZXIgYW5kIHVwZGF0ZSB0
aGUgY29tcG9zaXRvci4KKyAgICBpZiAoIWxheWVyICYmICFtX2ZyYW1lTGF5ZXJzKQorICAgICAg
ICByZXR1cm47CisKKyAgICBpZiAoIWxheWVyKSB7CisgICAgICAgICBBU1NFUlQobV9mcmFtZUxh
eWVycyk7CisgICAgICAgICBtX2ZyYW1lTGF5ZXJzLT5yZW1vdmVMYXllckJ5RnJhbWUoZnJhbWUp
OworICAgICAgICAgaWYgKCFtX2ZyYW1lTGF5ZXJzLT5oYXNMYXllcigpKQorICAgICAgICAgICAg
IG1fZnJhbWVMYXllcnMuY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIW1fZnJh
bWVMYXllcnMpCisgICAgICAgICAgICBtX2ZyYW1lTGF5ZXJzID0gYWRvcHRQdHIobmV3IEZyYW1l
TGF5ZXJzKHRoaXMpKTsKKworICAgICAgICBpZiAoIW1fZnJhbWVMYXllcnMtPmNvbnRhaW5zTGF5
ZXJGb3JGcmFtZShmcmFtZSkpCisgICAgICAgICAgICBtX2ZyYW1lTGF5ZXJzLT5hZGRMYXllcihm
cmFtZSwgbGF5ZXIpOworCisgICAgICAgIEFTU0VSVChtX2ZyYW1lTGF5ZXJzKTsKKyAgICB9CisK
KyAgICBMYXllckNvbXBvc2l0aW5nVGhyZWFkKiByb290TGF5ZXJDb21wb3NpdGluZ1RocmVhZCA9
IDA7CisgICAgaWYgKG1fZnJhbWVMYXllcnMgJiYgbV9mcmFtZUxheWVycy0+cm9vdExheWVyKCkp
CisgICAgICAgIHJvb3RMYXllckNvbXBvc2l0aW5nVGhyZWFkID0gbV9mcmFtZUxheWVycy0+cm9v
dExheWVyKCktPmxheWVyQ29tcG9zaXRpbmdUaHJlYWQoKTsKKworICAgIHNldFJvb3RMYXllckNv
bXBvc2l0aW5nVGhyZWFkKHJvb3RMYXllckNvbXBvc2l0aW5nVGhyZWFkKTsKK30KKwordm9pZCBX
ZWJQYWdlUHJpdmF0ZTo6c2V0Um9vdExheWVyQ29tcG9zaXRpbmdUaHJlYWQoTGF5ZXJDb21wb3Np
dGluZ1RocmVhZCogbGF5ZXIpCit7CisgICAgaWYgKCFQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRo
cmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgUGxhdGZv
cm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoU3luY01lc3Nh
Z2UoCisgICAgICAgICAgICBQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJldlYlBh
Z2VQcml2YXRlOjpzZXRSb290TGF5ZXJDb21wb3NpdGluZ1RocmVhZCwgdGhpcywgbGF5ZXIpKTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIERlcGVuZGluZyBvbiB3aGV0aGVyIHdl
IGhhdmUgYSByb290IGxheWVyIG9yIG5vdCwKKyAgICAvLyB0aGlzIG1ldGhvZCB3aWxsIHR1cm4g
b24gb3Igb2ZmIGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nLgorICAgIGlmICghbGF5ZXIpIHsKKyAg
ICAgICAgIC8vIERvbid0IEFTU0VSVChtX2NvbXBvc2l0b3IpIGhlcmUgYmVjYXVzZSB3ZSBtYXkg
YmUgY2FsbGVkIGluCisgICAgICAgICAvLyB0aGUgcHJvY2VzcyBvZiBkZXN0cnVjdGlvbiBvZiBX
ZWJQYWdlIHdoZXJlIHdlIGhhdmUgYWxyZWFkeQorICAgICAgICAgLy8gY2FsbGVkIHN5bmNEZXN0
cm95Q29tcG9zaXRvck9uQ29tcG9zaXRpbmdUaHJlYWQoKSB0byBkZXN0cm95CisgICAgICAgICAv
LyB0aGUgY29tcG9zaXRvci4KKyAgICAgICAgIHNldElzQWNjZWxlcmF0ZWRDb21wb3NpdGluZ0Fj
dGl2ZShmYWxzZSk7CisgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtX2NvbXBv
c2l0b3IpCisgICAgICAgIHNldElzQWNjZWxlcmF0ZWRDb21wb3NpdGluZ0FjdGl2ZSh0cnVlKTsK
KworICAgIC8vIERvbid0IEFTU0VSVChtX2NvbXBvc2l0b3IpIGhlcmUgYmVjYXVzZSBzZXRJc0Fj
Y2VsZXJhdGVkQ29tcG9zaXRpbmdBY3RpdmUodHJ1ZSkKKyAgICAvLyBtYXkgbm90IHR1cm4gYWNj
ZWxlcmF0ZWQgY29tcG9zaXRpbmcgb24gc2luY2UgbV9iYWNraW5nU3RvcmUgaXMgMC4KKyAgICBp
ZiAobV9jb21wb3NpdG9yKQorICAgICAgICBtX2NvbXBvc2l0b3ItPnNldFJvb3RMYXllcihsYXll
cik7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmRlc3Ryb3lDb21wb3NpdG9yKCkKK3sKKyAg
ICAgbV9jb21wb3NpdG9yLmNsZWFyKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnN5bmNE
ZXN0cm95Q29tcG9zaXRvck9uQ29tcG9zaXRpbmdUaHJlYWQoKQoreworICAgIGlmICghbV9jb21w
b3NpdG9yKQorICAgICAgICByZXR1cm47CisKKyAgICBQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRo
cmVhZE1lc3NhZ2VDbGllbnQoKS0+ZGlzcGF0Y2hTeW5jTWVzc2FnZSgKKyAgICAgICAgUGxhdGZv
cm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKAorICAgICAgICAgICAgJldlYlBhZ2VQcml2YXRl
OjpkZXN0cm95Q29tcG9zaXRvciwgdGhpcykpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpk
ZXN0cm95TGF5ZXJSZXNvdXJjZXMoKQoreworICAgICBtX2NvbXBvc2l0b3ItPnJlbGVhc2VMYXll
clJlc291cmNlcygpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzdXNwZW5kUm9vdExheWVy
Q29tbWl0KCkKK3sKKyAgICBpZiAobV9zdXNwZW5kUm9vdExheWVyQ29tbWl0KQorICAgICAgICBy
ZXR1cm47CisKKyAgICBtX3N1c3BlbmRSb290TGF5ZXJDb21taXQgPSB0cnVlOworCisgICAgaWYg
KCFtX2ZyYW1lTGF5ZXJzIHx8ICFtX2ZyYW1lTGF5ZXJzLT5oYXNMYXllcigpIHx8ICFtX2NvbXBv
c2l0b3IpCisgICAgICAgIHJldHVybjsKKworICAgIFBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhy
ZWFkTWVzc2FnZUNsaWVudCgpLT5kaXNwYXRjaFN5bmNNZXNzYWdlKAorICAgICAgICBQbGF0Zm9y
bTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJldlYlBhZ2VQcml2YXRlOjpkZXN0cm95TGF5ZXJS
ZXNvdXJjZXMsIHRoaXMpKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6cmVzdW1lUm9vdExh
eWVyQ29tbWl0KCkKK3sKKyAgICBpZiAoIW1fc3VzcGVuZFJvb3RMYXllckNvbW1pdCkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgbV9zdXNwZW5kUm9vdExheWVyQ29tbWl0ID0gZmFsc2U7CisgICAg
bV9uZWVkc0NvbW1pdCA9IHRydWU7CisKKyAgICAvLyBSZWNyZWF0ZSBsYXllciByZXNvdXJjZXMg
aWYgbmVlZGVkLgorICAgIGNvbW1pdFJvb3RMYXllcklmTmVlZGVkKCk7Cit9CisKK2Jvb2wgV2Vi
UGFnZVByaXZhdGU6Om5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKQoreworICAg
IHJldHVybiBtX25lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb247Cit9CisKK3ZvaWQg
V2ViUGFnZVByaXZhdGU6OnNldE5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKQor
eworICAgIC8vIFRoaXMgbWVhbnMgd2UgaGF2ZSB0byBjb21taXQgbGF5ZXJzIG9uIG5leHQgcmVu
ZGVyLCBvciByZW5kZXIgb24gdGhlIG5leHQgY29tbWl0LAorICAgIC8vIHdoaWNoZXZlciBoYXBw
ZW5zIGZpcnN0LgorICAgIG1fbmVlZHNDb21taXQgPSB0cnVlOworICAgIG1fbmVlZHNPbmVTaG90
RHJhd2luZ1N5bmNocm9uaXphdGlvbiA9IHRydWU7Cit9CisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjplbnRlckZ1bGxzY3JlZW5G
b3JOb2RlKE5vZGUqIG5vZGUpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIGlmICghbm9kZSB8
fCAhbm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OnZpZGVvVGFnKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgTWVkaWFQbGF5ZXIqIHBsYXllciA9IHN0YXRpY19jYXN0PEhUTUxNZWRpYUVsZW1l
bnQqPihub2RlKS0+cGxheWVyKCk7CisgICAgaWYgKCFwbGF5ZXIpCisgICAgICAgIHJldHVybjsK
KworICAgIE1lZGlhUGxheWVyUHJpdmF0ZSogbW1yUGxheWVyID0gc3RhdGljX2Nhc3Q8TWVkaWFQ
bGF5ZXJQcml2YXRlKj4ocGxheWVyLT5pbXBsZW1lbnRhdGlvbigpKTsKKyAgICBpZiAoIW1tclBs
YXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgUGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3cq
IHdpbmRvdyA9IG1tclBsYXllci0+d2luZG93R2V0KCk7CisgICAgaWYgKCF3aW5kb3cpCisgICAg
ICAgIHJldHVybjsKKworICAgIHVuc2lnbmVkIHgsIHksIHdpZHRoLCBoZWlnaHQ7CisgICAgbW1y
UGxheWVyLT53aW5kb3dQb3NpdGlvbkdldCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIGNv
bnN0IGNoYXIqIGNvbnRleHROYW1lID0gbW1yUGxheWVyLT5tbXJDb250ZXh0TmFtZUdldCgpOwor
ICAgIGlmICghY29udGV4dE5hbWUpCisgICAgICAgIHJldHVybjsKKworICAgIG1tclBsYXllci0+
c2V0RnVsbHNjcmVlbldlYlBhZ2VDbGllbnQobV9jbGllbnQpOworICAgIG1fZnVsbHNjcmVlblZp
ZGVvTm9kZSA9IG5vZGU7CisgICAgbV9jbGllbnQtPmZ1bGxzY3JlZW5TdGFydChjb250ZXh0TmFt
ZSwgd2luZG93LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyNlbmRpZgorfQorCit2b2lkIFdlYlBh
Z2VQcml2YXRlOjpleGl0RnVsbHNjcmVlbkZvck5vZGUoTm9kZSogbm9kZSkKK3sKKyNpZiBFTkFC
TEUoVklERU8pCisgICAgaWYgKG1fZnVsbHNjcmVlblZpZGVvTm9kZS5nZXQoKSkgeworICAgICAg
ICBtX2NsaWVudC0+ZnVsbHNjcmVlblN0b3AoKTsKKyAgICAgICAgbV9mdWxsc2NyZWVuVmlkZW9O
b2RlID0gMDsKKyAgICB9CisKKyAgICBpZiAoIW5vZGUgfHwgIW5vZGUtPmhhc1RhZ05hbWUoSFRN
TE5hbWVzOjp2aWRlb1RhZykpCisgICAgICAgIHJldHVybjsKKworICAgIE1lZGlhUGxheWVyKiBw
bGF5ZXIgPSBzdGF0aWNfY2FzdDxIVE1MTWVkaWFFbGVtZW50Kj4obm9kZSktPnBsYXllcigpOwor
ICAgIGlmICghcGxheWVyKQorICAgICAgICByZXR1cm47CisKKyAgICBNZWRpYVBsYXllclByaXZh
dGUqIG1tclBsYXllciA9IHN0YXRpY19jYXN0PE1lZGlhUGxheWVyUHJpdmF0ZSo+KHBsYXllci0+
aW1wbGVtZW50YXRpb24oKSk7CisgICAgaWYgKCFtbXJQbGF5ZXIpCisgICAgICAgIHJldHVybjsK
KworICAgIC8vIEZ1bGxzY3JlZW4gbW9kZSBpcyBiZWluZyB0dXJuZWQgb2ZmLCBzbyBNZWRpYVBs
YXllclByaXZhdGUgbm8gbG9uZ2VyIG5lZWRzIHRoZSBwb2ludGVyLgorICAgIG1tclBsYXllci0+
c2V0RnVsbHNjcmVlbldlYlBhZ2VDbGllbnQoMCk7CisjZW5kaWYKK30KKworLy8gTUFSSzogV2Vi
U2V0dGluZ3NEZWxlZ2F0ZS4KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6ZGlkQ2hhbmdlU2V0dGlu
Z3MoV2ViU2V0dGluZ3MqIHdlYlNldHRpbmdzKQoreworICAgIFNldHRpbmdzKiBjb3JlU2V0dGlu
Z3MgPSBtX3BhZ2UtPnNldHRpbmdzKCk7CisgICAgbV9wYWdlLT5zZXRHcm91cE5hbWUod2ViU2V0
dGluZ3MtPnBhZ2VHcm91cE5hbWUoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXRYU1NBdWRpdG9y
RW5hYmxlZCh3ZWJTZXR0aW5ncy0+eHNzQXVkaXRvckVuYWJsZWQoKSk7CisgICAgY29yZVNldHRp
bmdzLT5zZXRMb2Fkc0ltYWdlc0F1dG9tYXRpY2FsbHkod2ViU2V0dGluZ3MtPmxvYWRzSW1hZ2Vz
QXV0b21hdGljYWxseSgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldFNob3VsZERyYXdCb3JkZXJX
aGlsZUxvYWRpbmdJbWFnZXMod2ViU2V0dGluZ3MtPnNob3VsZERyYXdCb3JkZXJXaGlsZUxvYWRp
bmdJbWFnZXMoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXRTY3JpcHRFbmFibGVkKHdlYlNldHRp
bmdzLT5pc0phdmFTY3JpcHRFbmFibGVkKCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0UHJpdmF0
ZUJyb3dzaW5nRW5hYmxlZCh3ZWJTZXR0aW5ncy0+aXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCkp
OworICAgIGNvcmVTZXR0aW5ncy0+c2V0RGVmYXVsdEZpeGVkRm9udFNpemUod2ViU2V0dGluZ3Mt
PmRlZmF1bHRGaXhlZEZvbnRTaXplKCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0RGVmYXVsdEZv
bnRTaXplKHdlYlNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKSk7CisgICAgY29yZVNldHRpbmdz
LT5zZXRNaW5pbXVtRm9udFNpemUod2ViU2V0dGluZ3MtPm1pbmltdW1Gb250U2l6ZSgpKTsKKyAg
ICBjb3JlU2V0dGluZ3MtPnNldFNlcmlmRm9udEZhbWlseSh3ZWJTZXR0aW5ncy0+c2VyaWZGb250
RmFtaWx5KCkuaW1wbCgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldEZpeGVkRm9udEZhbWlseSh3
ZWJTZXR0aW5ncy0+Zml4ZWRGb250RmFtaWx5KCkuaW1wbCgpKTsKKyAgICBjb3JlU2V0dGluZ3Mt
PnNldFNhbnNTZXJpZkZvbnRGYW1pbHkod2ViU2V0dGluZ3MtPnNhbnNTZXJpZkZvbnRGYW1pbHko
KS5pbXBsKCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0U3RhbmRhcmRGb250RmFtaWx5KHdlYlNl
dHRpbmdzLT5zdGFuZGFyZEZvbnRGYW1pbHkoKS5pbXBsKCkpOworICAgIGNvcmVTZXR0aW5ncy0+
c2V0SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSh3ZWJTZXR0aW5ncy0+Y2Fu
SmF2YVNjcmlwdE9wZW5XaW5kb3dzQXV0b21hdGljYWxseSgpKTsKKyAgICBjb3JlU2V0dGluZ3Mt
PnNldEFsbG93U2NyaXB0c1RvQ2xvc2VXaW5kb3dzKHdlYlNldHRpbmdzLT5jYW5KYXZhU2NyaXB0
T3BlbldpbmRvd3NBdXRvbWF0aWNhbGx5KCkpOyAvLyBXaHkgYXJlIHdlIHVzaW5nIHRoZSBzYW1l
IHZhbHVlIGFzIHNldEphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHkoKT8KKyAg
ICBjb3JlU2V0dGluZ3MtPnNldFBsdWdpbnNFbmFibGVkKHdlYlNldHRpbmdzLT5hcmVQbHVnaW5z
RW5hYmxlZCgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldERlZmF1bHRUZXh0RW5jb2RpbmdOYW1l
KHdlYlNldHRpbmdzLT5kZWZhdWx0VGV4dEVuY29kaW5nTmFtZSgpLmltcGwoKSk7CisgICAgY29y
ZVNldHRpbmdzLT5zZXREb3dubG9hZGFibGVCaW5hcnlGb250c0VuYWJsZWQod2ViU2V0dGluZ3Mt
PmRvd25sb2FkYWJsZUJpbmFyeUZvbnRzRW5hYmxlZCgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNl
dFNwYXRpYWxOYXZpZ2F0aW9uRW5hYmxlZChtX3dlYlNldHRpbmdzLT5pc1NwYXRpYWxOYXZpZ2F0
aW9uRW5hYmxlZCgpKTsKKworICAgIC8vIFVzZXJTY2FsYWJsZSBzaG91bGQgYmUgcmVzZXQgYnkg
bmV3IHNldHRpbmdzLgorICAgIHNldFVzZXJTY2FsYWJsZSh3ZWJTZXR0aW5ncy0+aXNVc2VyU2Nh
bGFibGUoKSk7CisKKyAgICBXZWJTdHJpbmcgc3R5bGVzaGVldFVSTCA9IHdlYlNldHRpbmdzLT51
c2VyU3R5bGVTaGVldFN0cmluZygpOworICAgIGlmIChzdHlsZXNoZWV0VVJMLmlzRW1wdHkoKSkK
KyAgICAgICAgc3R5bGVzaGVldFVSTCA9IHdlYlNldHRpbmdzLT51c2VyU3R5bGVTaGVldExvY2F0
aW9uKCk7CisgICAgaWYgKCFzdHlsZXNoZWV0VVJMLmlzRW1wdHkoKSkKKyAgICAgICAgY29yZVNl
dHRpbmdzLT5zZXRVc2VyU3R5bGVTaGVldExvY2F0aW9uKEtVUkwoS1VSTCgpLCBzdHlsZXNoZWV0
VVJMKSk7CisKKyAgICBjb3JlU2V0dGluZ3MtPnNldEZpcnN0U2NoZWR1bGVkTGF5b3V0RGVsYXko
d2ViU2V0dGluZ3MtPmZpcnN0U2NoZWR1bGVkTGF5b3V0RGVsYXkoKSk7CisgICAgY29yZVNldHRp
bmdzLT5zZXRVc2VDYWNoZSh3ZWJTZXR0aW5ncy0+dXNlV2ViS2l0Q2FjaGUoKSk7CisKKyNpZiBF
TkFCTEUoU1FMX0RBVEFCQVNFKQorICAgIC8vIERhdGFiYXNlVHJhY2tlciBjYW4gb25seSBiZSBp
bml0aWFsaXplZCBmb3Igb25jZSwgc28gaXQgZG9lc24ndAorICAgIC8vIG1ha2Ugc2Vuc2UgdG8g
Y2hhbmdlIGRhdGFiYXNlIHBhdGggYWZ0ZXIgRGF0YWJhc2VUcmFja2VyIGhhcworICAgIC8vIGFs
cmVhZHkgYmVlbiBpbml0aWFsaXplZC4KKyAgICBzdGF0aWMgYm9vbCBkYmluaXQgPSBmYWxzZTsK
KyAgICBpZiAoIWRiaW5pdCAmJiAhd2ViU2V0dGluZ3MtPmRhdGFiYXNlUGF0aCgpLmlzRW1wdHko
KSkgeworICAgICAgICBkYmluaXQgPSB0cnVlOworICAgICAgICBEYXRhYmFzZVRyYWNrZXI6Omlu
aXRpYWxpemVUcmFja2VyKHdlYlNldHRpbmdzLT5kYXRhYmFzZVBhdGgoKSk7CisgICAgfQorCisg
ICAgLy8gVGhlIGRpcmVjdG9yeSBvZiBjYWNoZVN0b3JhZ2UgZm9yIG9uZSBwYWdlIGdyb3VwIGNh
biBvbmx5IGJlIGluaXRpYWxpemVkIG9uY2UuCisgICAgc3RhdGljIGJvb2wgYWNpbml0ID0gZmFs
c2U7CisgICAgaWYgKCFhY2luaXQgJiYgIXdlYlNldHRpbmdzLT5hcHBDYWNoZVBhdGgoKS5pc0Vt
cHR5KCkpIHsKKyAgICAgICAgYWNpbml0ID0gdHJ1ZTsKKyAgICAgICAgY2FjaGVTdG9yYWdlKCku
c2V0Q2FjaGVEaXJlY3Rvcnkod2ViU2V0dGluZ3MtPmFwcENhY2hlUGF0aCgpKTsKKyAgICB9CisK
KyAgICBjb3JlU2V0dGluZ3MtPnNldExvY2FsU3RvcmFnZURhdGFiYXNlUGF0aCh3ZWJTZXR0aW5n
cy0+bG9jYWxTdG9yYWdlUGF0aCgpKTsKKyAgICBEYXRhYmFzZTo6c2V0SXNBdmFpbGFibGUod2Vi
U2V0dGluZ3MtPmlzRGF0YWJhc2VzRW5hYmxlZCgpKTsKKyAgICBEYXRhYmFzZVN5bmM6OnNldElz
QXZhaWxhYmxlKHdlYlNldHRpbmdzLT5pc0RhdGFiYXNlc0VuYWJsZWQoKSk7CisKKyAgICBjb3Jl
U2V0dGluZ3MtPnNldExvY2FsU3RvcmFnZUVuYWJsZWQod2ViU2V0dGluZ3MtPmlzTG9jYWxTdG9y
YWdlRW5hYmxlZCgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldE9mZmxpbmVXZWJBcHBsaWNhdGlv
bkNhY2hlRW5hYmxlZCh3ZWJTZXR0aW5ncy0+aXNBcHBDYWNoZUVuYWJsZWQoKSk7CisKKyAgICBt
X3BhZ2UtPmdyb3VwKCkuZ3JvdXBTZXR0aW5ncygpLT5zZXRMb2NhbFN0b3JhZ2VRdW90YUJ5dGVz
KHdlYlNldHRpbmdzLT5sb2NhbFN0b3JhZ2VRdW90YSgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNl
dFVzZXNQYWdlQ2FjaGUod2ViU2V0dGluZ3MtPm1heGltdW1QYWdlc0luQ2FjaGUoKSk7CisgICAg
Y29yZVNldHRpbmdzLT5zZXRGcmFtZUZsYXR0ZW5pbmdFbmFibGVkKHdlYlNldHRpbmdzLT5pc0Zy
YW1lRmxhdHRlbmluZ0VuYWJsZWQoKSk7CisjZW5kaWYKKworI2lmIEVOQUJMRShXRUJfU09DS0VU
UykKKyAgICBXZWJTb2NrZXQ6OnNldElzQXZhaWxhYmxlKHdlYlNldHRpbmdzLT5hcmVXZWJTb2Nr
ZXRzRW5hYmxlZCgpKTsKKyNlbmRpZgorCisjaWYgRU5BQkxFKFZJRVdQT1JUX1JFRkxPVykKKyAg
ICBjb3JlU2V0dGluZ3MtPnNldFRleHRSZWZsb3dFbmFibGVkKHdlYlNldHRpbmdzLT50ZXh0UmVm
bG93TW9kZSgpID09IFdlYlNldHRpbmdzOjpUZXh0UmVmbG93RW5hYmxlZCk7CisjZW5kaWYKKwor
ICAgIC8vIEZJWE1FOiBXZSBkb24ndCB3YW50IEhUTUxUb2tlbml6ZXIgdG8geWllbGQgZm9yIGFu
eXRoaW5nIG90aGVyIHRoYW4gZW1haWwgY2FzZSBiZWNhdXNlCisgICAgLy8gY2FsbCB0byBjdXJy
ZW50VGltZSgpIGlzIHRvbyBleHBlbnNpdmUgb24gb3VyIHBsYXRmb3JtLiBTZWUgUklNIEJ1ZyAj
NzQ2LgorICAgIGNvcmVTZXR0aW5ncy0+c2V0U2hvdWxkVXNlRmlyc3RTY2hlZHVsZWRMYXlvdXRE
ZWxheSh3ZWJTZXR0aW5ncy0+aXNFbWFpbE1vZGUoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXRQ
cm9jZXNzSFRUUEVxdWl2KCF3ZWJTZXR0aW5ncy0+aXNFbWFpbE1vZGUoKSk7CisKKyAgICBjb3Jl
U2V0dGluZ3MtPnNldFNob3VsZFVzZUNyb3NzT3JpZ2luUHJvdG9jb2xDaGVjayghd2ViU2V0dGlu
Z3MtPmFsbG93Q3Jvc3NTaXRlUmVxdWVzdHMoKSk7CisKKyAgICBjb29raWVNYW5hZ2VyKCkuc2V0
UHJpdmF0ZU1vZGUod2ViU2V0dGluZ3MtPmlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCgpKTsKKwor
ICAgIGlmIChtX21haW5GcmFtZSAmJiBtX21haW5GcmFtZS0+dmlldygpKSB7CisgICAgICAgIENv
bG9yIGJhY2tncm91bmRDb2xvcih3ZWJTZXR0aW5ncy0+YmFja2dyb3VuZENvbG9yKCkpOworICAg
ICAgICBtX21haW5GcmFtZS0+dmlldygpLT51cGRhdGVCYWNrZ3JvdW5kUmVjdXJzaXZlbHkoYmFj
a2dyb3VuZENvbG9yLCBiYWNrZ3JvdW5kQ29sb3IuaGFzQWxwaGEoKSk7CisgICAgfQorfQorCitJ
bnRTaXplIFdlYlBhZ2VQcml2YXRlOjpkZWZhdWx0TWF4TGF5b3V0U2l6ZSgpCit7CisgICAgc3Rh
dGljIEludFNpemUgc2l6ZTsKKworICAgIGlmIChzaXplLmlzRW1wdHkoKSkKKyAgICAgICAgc2l6
ZSA9IEludFNpemUoc3RkOjptYXgoMTAyNCwgUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46Omxh
bmRzY2FwZVdpZHRoKCkpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heCg3NjgsIFBs
YXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjpsYW5kc2NhcGVIZWlnaHQoKSkpOworCisgICAgcmV0
dXJuIHNpemU7Cit9CisKK1dlYlN0cmluZyBXZWJQYWdlOjp0ZXh0SGFzQXR0cmlidXRlKGNvbnN0
IFdlYlN0cmluZyYgcXVlcnkpIGNvbnN0Cit7CisgICAgaWYgKERvY3VtZW50KiBkb2MgPSBkLT5t
X3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+ZG9jdW1lbnQo
KSkKKyAgICAgICAgcmV0dXJuIGRvYy0+cXVlcnlDb21tYW5kVmFsdWUocXVlcnkpOworICAgIHJl
dHVybiAiIjsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRKYXZhU2NyaXB0Q2FuQWNjZXNzQ2xpcGJv
YXJkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBkLT5tX3BhZ2UtPnNldHRpbmdzKCktPnNldEphdmFT
Y3JpcHRDYW5BY2Nlc3NDbGlwYm9hcmQoZW5hYmxlZCk7Cit9CisKKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpibGl0VmlzaWJsZUNvbnRlbnRz
KCkKK3sKKyAgICBpZiAobV9iYWNraW5nU3RvcmUtPmQtPnNob3VsZERpcmVjdFJlbmRlcmluZ1Rv
V2luZG93KCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fYmFja2luZ1N0b3JlLT5kLT5ibGl0
VmlzaWJsZUNvbnRlbnRzKCk7Cit9CisjZW5kaWYKKwordm9pZCBXZWJQYWdlOjpzZXRXZWJHTEVu
YWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIGlmICghUGxhdGZvcm06OklUUG9saWN5Ojppc1dl
YkdMRW5hYmxlZCgpKSB7CisgICAgICAgIGQtPm1fcGFnZS0+c2V0dGluZ3MoKS0+c2V0V2ViR0xF
bmFibGVkKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkLT5tX3BhZ2UtPnNl
dHRpbmdzKCktPnNldFdlYkdMRW5hYmxlZChlbmFibGVkKTsKK30KKworYm9vbCBXZWJQYWdlOjpp
c1dlYkdMRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fcGFnZS0+c2V0dGluZ3Mo
KS0+d2ViR0xFbmFibGVkKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldE5lZWRUb3Vj
aEV2ZW50cyhib29sIHZhbHVlKQoreworICAgIG1fbmVlZFRvdWNoRXZlbnRzID0gdmFsdWU7Cit9
CisKK30KK30KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvV2ViUGFn
ZS5oIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9XZWJQYWdlLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
ZjFjNzMzNjZkY2M1ZGI3NzFiMjEzMWNhNTQxYTI4MjZiNTc1YTNiZgotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvV2ViUGFnZS5oCkBAIC0wLDAgKzEsMzY1
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNo
IEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAq
IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJs
aWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp
b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
ICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5v
dCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZy
YW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQor
ICovCisKKyNpZm5kZWYgV2ViUGFnZV9oCisjZGVmaW5lIFdlYlBhZ2VfaAorCisjaW5jbHVkZSAi
QWN0aXZlTm9kZUNvbnRleHQuaCIKKyNpbmNsdWRlICJCbGFja0JlcnJ5R2xvYmFsLmgiCisjaW5j
bHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtR3VhcmRlZFBvaW50ZXIuaD4KKyNpbmNsdWRlIDxCbGFj
a0JlcnJ5UGxhdGZvcm1JbnB1dEV2ZW50cy5oPgorI2luY2x1ZGUgPGltZi9pbnB1dF9kYXRhLmg+
CisjaW5jbHVkZSA8bmV0d29yay9OZXR3b3JrUmVxdWVzdC5oPgorCitzdHJ1Y3QgT3BhcXVlSlND
b250ZXh0OwordHlwZWRlZiBjb25zdCBzdHJ1Y3QgT3BhcXVlSlNDb250ZXh0KiBKU0NvbnRleHRS
ZWY7CisKK3N0cnVjdCBPcGFxdWVKU1ZhbHVlOwordHlwZWRlZiBjb25zdCBzdHJ1Y3QgT3BhcXVl
SlNWYWx1ZSogSlNWYWx1ZVJlZjsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgQ2hyb21l
Q2xpZW50QmxhY2tCZXJyeTsKK2NsYXNzIEVkaXRvckNsaWVudEJsYWNrQmVycnk7CitjbGFzcyBF
bGVtZW50OworY2xhc3MgRnJhbWU7CitjbGFzcyBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk7
CitjbGFzcyBHZW9sb2NhdGlvbkNvbnRyb2xsZXJDbGllbnRCbGFja0JlcnJ5OworY2xhc3MgSWNv
bkRhdGFiYXNlQ2xpZW50QmxhY2tCZXJyeTsKK2NsYXNzIEluc3BlY3RvckNsaWVudEJsYWNrQmVy
cnk7CitjbGFzcyBKYXZhU2NyaXB0RGVidWdnZXJCbGFja0JlcnJ5OworY2xhc3MgTm9kZTsKK2Ns
YXNzIFJlbmRlck9iamVjdDsKK2NsYXNzIFZpc2libGVTZWxlY3Rpb247Cit9CisKK2NsYXNzIFdl
YkRPTURvY3VtZW50OworY2xhc3MgV2ViRE9NTm9kZTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNs
YXNzIFNoYXJlZEFycmF5OworCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2UgUGxh
dGZvcm0geworY2xhc3MgSW50UG9pbnQ7CitjbGFzcyBJbnRSZWN0OworY2xhc3MgSW50U2l6ZTsK
K2NsYXNzIEtleWJvYXJkRXZlbnQ7CitjbGFzcyBNb3VzZUV2ZW50OworY2xhc3MgVG91Y2hFdmVu
dDsKK2NsYXNzIFRvdWNoUG9pbnQ7Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBC
YWNraW5nU3RvcmU7CitjbGFzcyBCYWNraW5nU3RvcmVDbGllbnQ7CitjbGFzcyBCYWNraW5nU3Rv
cmVQcml2YXRlOworY2xhc3MgRHVtcFJlbmRlclRyZWVDbGllbnQ7CitjbGFzcyBSZW5kZXJRdWV1
ZTsKK2NsYXNzIFdlYlBhZ2VDbGllbnQ7CitjbGFzcyBXZWJQYWdlR3JvdXBMb2FkRGVmZXJyZXI7
CitjbGFzcyBXZWJQYWdlUHJpdmF0ZTsKK2NsYXNzIFdlYlNldHRpbmdzOworCitlbnVtIEphdmFT
Y3JpcHREYXRhVHlwZSB7IEpTVW5kZWZpbmVkID0gMCwgSlNOdWxsLCBKU0Jvb2xlYW4sIEpTTnVt
YmVyLCBKU1N0cmluZywgSlNPYmplY3QsIEpTRXhjZXB0aW9uLCBKU0RhdGFUeXBlTWF4IH07CisK
K2VudW0gQWN0aXZhdGlvblN0YXRlVHlwZSB7IEFjdGl2YXRpb25BY3RpdmUsIEFjdGl2YXRpb25J
bmFjdGl2ZSwgQWN0aXZhdGlvblN0YW5kYnkgfTsKKworZW51bSBUYXJnZXREZXRlY3Rpb25TdHJh
dGVneSB7UG9pbnRCYXNlZCwgUmVjdEJhc2VkfTsKKworY2xhc3MgQkxBQ0tCRVJSWV9FWFBPUlQg
V2ViUGFnZSA6IHB1YmxpYyBQbGF0Zm9ybTo6R3VhcmRlZFBvaW50ZXJCYXNlIHsKK3B1YmxpYzoK
KyAgICBXZWJQYWdlKFdlYlBhZ2VDbGllbnQqLCBjb25zdCBXZWJTdHJpbmcmIHBhZ2VHcm91cE5h
bWUsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0Jik7CisgICAgdm9pZCBkZXN0cm95KCk7CisKKyAg
ICBXZWJQYWdlQ2xpZW50KiBjbGllbnQoKSBjb25zdDsKKworICAgIHZvaWQgbG9hZChjb25zdCBj
aGFyKiB1cmwsIGNvbnN0IGNoYXIqIG5ldHdvcmtUb2tlbiwgYm9vbCBpc0luaXRpYWwgPSBmYWxz
ZSk7CisKKyAgICB2b2lkIGxvYWRFeHRlbmRlZChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIq
IG5ldHdvcmtUb2tlbiwgY29uc3QgY2hhciogbWV0aG9kLCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVl
c3Q6OkNhY2hlUG9saWN5ID0gUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpVc2VQcm90b2NvbENh
Y2hlUG9saWN5LCBjb25zdCBjaGFyKiBkYXRhID0gMCwgc2l6ZV90IGRhdGFMZW5ndGggPSAwLCBj
b25zdCBjaGFyKiBjb25zdCogaGVhZGVycyA9IDAsIHNpemVfdCBoZWFkZXJzTGVuZ3RoID0gMCwg
Ym9vbCBtdXN0SGFuZGxlSW50ZXJuYWxseSA9IGZhbHNlKTsKKworICAgIHZvaWQgbG9hZEZpbGUo
Y29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogb3ZlcnJpZGVDb250ZW50VHlwZSA9ICIiKTsK
KworICAgIHZvaWQgbG9hZFN0cmluZyhjb25zdCBjaGFyKiBzdHJpbmcsIGNvbnN0IGNoYXIqIGJh
c2VVUkwsIGNvbnN0IGNoYXIqIGNvbnRlbnRUeXBlID0gInRleHQvaHRtbCIsIGNvbnN0IGNoYXIq
IGZhaWxpbmdVUkwgPSAwKTsKKworICAgIHZvaWQgZG93bmxvYWQoY29uc3QgUGxhdGZvcm06Ok5l
dHdvcmtSZXF1ZXN0Jik7CisKKyAgICBib29sIGV4ZWN1dGVKYXZhU2NyaXB0KGNvbnN0IGNoYXIq
IHNjcmlwdCwgSmF2YVNjcmlwdERhdGFUeXBlJiByZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVy
blZhbHVlKTsKKworICAgIC8vIFRoaXMgd2lsbCBleGVjdXRlIHRoZSBzY3JpcHQgZXZlbiBpZiBp
bi1wYWdlIEphdmFTY3JpcHQgaXMgZGlzYWJsZWQuCisgICAgYm9vbCBleGVjdXRlSmF2YVNjcmlw
dEluSXNvbGF0ZWRXb3JsZChjb25zdCBjaGFyKiBzY3JpcHQsIEphdmFTY3JpcHREYXRhVHlwZSYg
cmV0dXJuVHlwZSwgV2ViU3RyaW5nJiByZXR1cm5WYWx1ZSk7CisKKyAgICAvLyBUYWtlcyBhIFVU
RjE2IGVuY29kZWQgc2NyaXB0IHRoYXQgaXMgdXNlZCBleHBsaWNpdGx5IGJ5IHRoZSBwYXR0ZXJu
IG1hdGNoaW5nIGNvZGUKKyAgICBib29sIGV4ZWN1dGVKYXZhU2NyaXB0SW5Jc29sYXRlZFdvcmxk
KGNvbnN0IHN0ZDo6d3N0cmluZyYgc2NyaXB0LCBKYXZhU2NyaXB0RGF0YVR5cGUmIHJldHVyblR5
cGUsIFdlYlN0cmluZyYgcmV0dXJuVmFsdWUpOworCisgICAgdm9pZCBpbml0aWFsaXplSWNvbkRh
dGFCYXNlKCk7CisKKyAgICB2b2lkIHN0b3BMb2FkaW5nKCk7CisKKyAgICAvLyBUaGlzIHdpbGwg
Zm9yY2UgYW55IHVubG9hZCBoYW5kbGVycyB0byBydW4uCisgICAgdm9pZCBwcmVwYXJlVG9EZXN0
cm95KCk7CisKKyAgICB2b2lkIHJlbG9hZCgpOworICAgIHZvaWQgcmVsb2FkRnJvbUNhY2hlKCk7
CisKKyAgICBXZWJTZXR0aW5ncyogc2V0dGluZ3MoKSBjb25zdDsKKworICAgIHZvaWQgc2V0Vmlz
aWJsZShib29sKTsKKyAgICBib29sIGlzVmlzaWJsZSgpIGNvbnN0OworCisgICAgdm9pZCBzZXRT
Y3JlZW5PcmllbnRhdGlvbihpbnQpOworICAgIHZvaWQgYXBwbHlQZW5kaW5nT3JpZW50YXRpb25J
Zk5lZWRlZCgpOworCisgICAgUGxhdGZvcm06OkludFNpemUgdmlld3BvcnRTaXplKCkgY29uc3Q7
CisgICAgdm9pZCBzZXRWaWV3cG9ydFNpemUoY29uc3QgUGxhdGZvcm06OkludFNpemUmIHZpZXdw
b3J0U2l6ZSwgYm9vbCBlbnN1cmVGb2N1c0VsZW1lbnRWaXNpYmxlID0gdHJ1ZSk7CisKKyAgICB2
b2lkIHJlc2V0VmlydHVhbFZpZXdwb3J0T25Db21taXR0ZWQoYm9vbCByZXNldCk7CisgICAgdm9p
ZCBzZXRWaXJ0dWFsVmlld3BvcnRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyAgICAv
LyBVc2VkIGZvciBkZWZhdWx0IGxheW91dCBzaXplIHVubGVzcyBvdmVycmlkZGVuIGJ5IHdlYiBj
b250ZW50IG9yIGJ5IG90aGVyIEFQSXMuCisgICAgdm9pZCBzZXREZWZhdWx0TGF5b3V0U2l6ZShp
bnQgd2lkdGgsIGludCBoZWlnaHQpOworCisgICAgYm9vbCBtb3VzZUV2ZW50KGNvbnN0IFBsYXRm
b3JtOjpNb3VzZUV2ZW50JiwgYm9vbCogd2hlZWxEZWx0YUFjY2VwdGVkID0gMCk7CisKKyAgICAv
LyBIYW5kbGVzIG5hdGl2ZSBqYXZhc2NyaXB0IHRvdWNoIGV2ZW50cy4KKyAgICBib29sIHRvdWNo
RXZlbnQoY29uc3QgUGxhdGZvcm06OlRvdWNoRXZlbnQmKTsKKworICAgIC8vIEZvciBjb252ZXJz
aW9uIHRvIG1vdXNlIGV2ZW50cy4KKyAgICB2b2lkIHRvdWNoRXZlbnRDYW5jZWwoKTsKKyAgICB2
b2lkIHRvdWNoRXZlbnRDYW5jZWxBbmRDbGVhckZvY3VzZWROb2RlKCk7CisgICAgYm9vbCB0b3Vj
aFBvaW50QXNNb3VzZUV2ZW50KGNvbnN0IFBsYXRmb3JtOjpUb3VjaFBvaW50Jik7CisKKyAgICAv
LyBSZXR1cm5zIHRydWUgaWYgdGhlIGtleSBzdHJva2Ugd2FzIGhhbmRsZWQgYnkgV2ViS2l0Lgor
ICAgIGJvb2wga2V5RXZlbnQoY29uc3QgUGxhdGZvcm06OktleWJvYXJkRXZlbnQmKTsKKworICAg
IHZvaWQgbmF2aWdhdGlvbk1vdmVFdmVudChjb25zdCB1bnNpZ25lZCBzaG9ydCBjaGFyYWN0ZXIs
IGJvb2wgc2hpZnREb3duLCBib29sIGFsdERvd24pOworCisgICAgV2ViU3RyaW5nIHRpdGxlKCkg
Y29uc3Q7CisgICAgV2ViU3RyaW5nIHNlbGVjdGVkVGV4dCgpIGNvbnN0OworICAgIFdlYlN0cmlu
ZyBjdXRTZWxlY3RlZFRleHQoKTsKKyAgICB2b2lkIGluc2VydFRleHQoY29uc3QgV2ViU3RyaW5n
Jik7CisgICAgdm9pZCBjbGVhckN1cnJlbnRJbnB1dEZpZWxkKCk7CisKKyAgICB2b2lkIGN1dCgp
OworICAgIHZvaWQgY29weSgpOworICAgIHZvaWQgcGFzdGUoKTsKKworICAgIC8vIFRleHQgZW5j
b2RpbmcuCisgICAgV2ViU3RyaW5nIHRleHRFbmNvZGluZygpOworICAgIFdlYlN0cmluZyBmb3Jj
ZWRUZXh0RW5jb2RpbmcoKTsKKyAgICB2b2lkIHNldEZvcmNlZFRleHRFbmNvZGluZyhjb25zdCBj
aGFyKik7CisKKyAgICAvLyBTY3JvbGwgcG9zaXRpb24gcmV0dXJuZWQgaXMgaW4gdHJhbnNmb3Jt
ZWQgY29vcmRpbmF0ZXMuCisgICAgUGxhdGZvcm06OkludFBvaW50IHNjcm9sbFBvc2l0aW9uKCkg
Y29uc3Q7CisgICAgLy8gU2Nyb2xsIHBvc2l0aW9uIHByb3ZpZGVkIHNob3VsZCBiZSBpbiB0cmFu
c2Zvcm1lZCBjb29yZGluYXRlcy4KKyAgICB2b2lkIHNldFNjcm9sbFBvc2l0aW9uKGNvbnN0IFBs
YXRmb3JtOjpJbnRQb2ludCYpOworICAgIGJvb2wgc2Nyb2xsQnkoY29uc3QgUGxhdGZvcm06Oklu
dFNpemUmLCBib29sIHNjcm9sbE1haW5GcmFtZSA9IHRydWUpOworICAgIHZvaWQgbm90aWZ5SW5S
ZWdpb25TY3JvbGxTdGF0dXNDaGFuZ2VkKGJvb2wgc3RhdHVzKTsKKyAgICB2b2lkIHNldFNjcm9s
bE9yaWdpblBvaW50KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYpOworCisgICAgQmFja2luZ1N0
b3JlKiBiYWNraW5nU3RvcmUoKSBjb25zdDsKKworICAgIGJvb2wgem9vbVRvRml0KCk7CisgICAg
Ym9vbCB6b29tVG9PbmVPbmUoKTsKKyAgICB2b2lkIHpvb21Ub0luaXRpYWxTY2FsZSgpOworICAg
IGJvb2wgYmxvY2tab29tKGludCB4LCBpbnQgeSk7CisgICAgdm9pZCBibG9ja1pvb21BbmltYXRp
b25GaW5pc2hlZCgpOworICAgIGJvb2wgaXNBdEluaXRpYWxab29tKCkgY29uc3Q7CisgICAgYm9v
bCBpc01heFpvb21lZCgpIGNvbnN0OworICAgIGJvb2wgaXNNaW5ab29tZWQoKSBjb25zdDsKKyAg
ICBib29sIHBpbmNoWm9vbUFib3V0UG9pbnQoZG91YmxlIHNjYWxlLCBpbnQgeCwgaW50IHkpOwor
CisgICAgYm9vbCBpc1VzZXJTY2FsYWJsZSgpIGNvbnN0OworICAgIGRvdWJsZSBjdXJyZW50U2Nh
bGUoKSBjb25zdDsKKyAgICBkb3VibGUgaW5pdGlhbFNjYWxlKCkgY29uc3Q7CisgICAgZG91Ymxl
IHpvb21Ub0ZpdFNjYWxlKCkgY29uc3Q7CisgICAgdm9pZCBzZXRJbml0aWFsU2NhbGUoZG91Ymxl
KTsKKyAgICBkb3VibGUgbWluaW11bVNjYWxlKCkgY29uc3Q7CisgICAgdm9pZCBzZXRNaW5pbXVt
U2NhbGUoZG91YmxlKTsKKyAgICBkb3VibGUgbWF4aW11bVNjYWxlKCkgY29uc3Q7CisgICAgdm9p
ZCBzZXRNYXhpbXVtU2NhbGUoZG91YmxlKTsKKworICAgIHZvaWQgYXNzaWduRm9jdXMoUGxhdGZv
cm06OkZvY3VzRGlyZWN0aW9uKTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGZvY3VzTm9kZVJl
Y3QoKTsKKworICAgIHZvaWQgc2V0Rm9jdXNlZChib29sKTsKKworICAgIHZvaWQgY2xlYXJCcm93
c2luZ0RhdGEoKTsKKyAgICB2b2lkIGNsZWFySGlzdG9yeSgpOworICAgIHZvaWQgY2xlYXJDb29r
aWVzKCk7CisgICAgdm9pZCBjbGVhckNhY2hlKCk7CisgICAgdm9pZCBjbGVhckxvY2FsU3RvcmFn
ZSgpOworCisgICAgdm9pZCBydW5MYXlvdXRUZXN0cygpOworCisgICAgIC8vIEZpbmRzIGFuZCBz
ZWxlY3RzIHRoZSBuZXh0IHV0Zjggc3RyaW5nIHRoYXQgaXMgYSBjYXNlIHNlbnNpdGl2ZQorICAg
ICAvLyBtYXRjaCBpbiB0aGUgd2ViIHBhZ2UuIEl0IHdpbGwgd3JhcCB0aGUgd2ViIHBhZ2UgaWYg
aXQgcmVhY2hlcworICAgICAvLyB0aGUgZW5kLiBBbiBlbXB0eSBzdHJpbmcgd2lsbCByZXN1bHQg
aW4gbm8gbWF0Y2ggYW5kIG5vIHNlbGVjdGlvbi4KKyAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRo
ZSBzdHJpbmcgbWF0Y2hlZCBhbmQgZmFsc2UgaWYgbm90LgorICAgIGJvb2wgZmluZE5leHRTdHJp
bmcoY29uc3QgY2hhciosIGJvb2wgZm9yd2FyZCA9IHRydWUpOworCisgICAgLy8gSmF2YVNjcmlw
dERlYnVnZ2VyIGludGVyZmFjZS4KKyAgICBib29sIGVuYWJsZVNjcmlwdERlYnVnZ2VyKCk7Cisg
ICAgYm9vbCBkaXNhYmxlU2NyaXB0RGVidWdnZXIoKTsKKworICAgIEpTQ29udGV4dFJlZiBzY3Jp
cHRDb250ZXh0KCkgY29uc3Q7CisgICAgSlNWYWx1ZVJlZiB3aW5kb3dPYmplY3QoKSBjb25zdDsK
KworI2lmIGRlZmluZWQoRU5BQkxFX1dFQkRPTSkgJiYgRU5BQkxFX1dFQkRPTQorICAgIFdlYkRP
TURvY3VtZW50IGRvY3VtZW50KCkgY29uc3Q7CisjZW5kaWYKKworICAgIHZvaWQgYWRkQnJlYWtw
b2ludChjb25zdCB1bnNpZ25lZCBzaG9ydCogdXJsLCB1bnNpZ25lZCB1cmxMZW5ndGgsIGludCBs
aW5lTnVtYmVyLCBjb25zdCB1bnNpZ25lZCBzaG9ydCogY29uZGl0aW9uLCB1bnNpZ25lZCBjb25k
aXRpb25MZW5ndGgpOworICAgIHZvaWQgdXBkYXRlQnJlYWtwb2ludChjb25zdCB1bnNpZ25lZCBz
aG9ydCogdXJsLCB1bnNpZ25lZCB1cmxMZW5ndGgsIGludCBsaW5lTnVtYmVyLCBjb25zdCB1bnNp
Z25lZCBzaG9ydCogY29uZGl0aW9uLCB1bnNpZ25lZCBjb25kaXRpb25MZW5ndGgpOworICAgIHZv
aWQgcmVtb3ZlQnJlYWtwb2ludChjb25zdCB1bnNpZ25lZCBzaG9ydCogdXJsLCB1bnNpZ25lZCB1
cmxMZW5ndGgsIGludCBsaW5lTnVtYmVyKTsKKworICAgIGJvb2wgcGF1c2VPbkV4Y2VwdGlvbnMo
KTsKKyAgICB2b2lkIHNldFBhdXNlT25FeGNlcHRpb25zKGJvb2wpOworCisgICAgdm9pZCBwYXVz
ZUluRGVidWdnZXIoKTsKKyAgICB2b2lkIHJlc3VtZURlYnVnZ2VyKCk7CisKKyAgICB2b2lkIHN0
ZXBPdmVyU3RhdGVtZW50SW5EZWJ1Z2dlcigpOworICAgIHZvaWQgc3RlcEludG9TdGF0ZW1lbnRJ
bkRlYnVnZ2VyKCk7CisgICAgdm9pZCBzdGVwT3V0T2ZGdW5jdGlvbkluRGVidWdnZXIoKTsKKwor
ICAgIHVuc2lnbmVkIHRpbWVvdXRGb3JKYXZhU2NyaXB0RXhlY3V0aW9uKCkgY29uc3Q7CisgICAg
dm9pZCBzZXRUaW1lb3V0Rm9ySmF2YVNjcmlwdEV4ZWN1dGlvbih1bnNpZ25lZCBtcyk7CisKKyAg
ICB2b2lkIHNldENhcmV0SGlnaGxpZ2h0U3R5bGUoUGxhdGZvcm06OkNhcmV0SGlnaGxpZ2h0U3R5
bGUpOworCisgICAgLy8gSU1GIGZ1bmN0aW9ucy4KKyAgICBib29sIHNldEJhdGNoRWRpdGluZ0Fj
dGl2ZShib29sKTsKKyAgICBib29sIHNldElucHV0U2VsZWN0aW9uKHVuc2lnbmVkIHN0YXJ0LCB1
bnNpZ25lZCBlbmQpOworICAgIGludCBpbnB1dENhcmV0UG9zaXRpb24oKSBjb25zdDsKKyAgICBi
b29sIGRlbGV0ZVRleHRSZWxhdGl2ZVRvQ3Vyc29yKHVuc2lnbmVkIGxlZnRPZmZzZXQsIHVuc2ln
bmVkIHJpZ2h0T2Zmc2V0KTsKKyAgICBzcGFubmFibGVfc3RyaW5nX3QqIHNlbGVjdGVkVGV4dChp
bnQzMl90IGZsYWdzKTsKKyAgICBzcGFubmFibGVfc3RyaW5nX3QqIHRleHRCZWZvcmVDdXJzb3Io
aW50MzJfdCBsZW5ndGgsIGludDMyX3QgZmxhZ3MpOworICAgIHNwYW5uYWJsZV9zdHJpbmdfdCog
dGV4dEFmdGVyQ3Vyc29yKGludDMyX3QgbGVuZ3RoLCBpbnQzMl90IGZsYWdzKTsKKyAgICBleHRy
YWN0ZWRfdGV4dF90KiBleHRyYWN0ZWRUZXh0UmVxdWVzdChleHRyYWN0ZWRfdGV4dF9yZXF1ZXN0
X3QqLCBpbnQzMl90IGZsYWdzKTsKKyAgICBpbnQzMl90IHNldENvbXBvc2luZ1JlZ2lvbihpbnQz
Ml90IHN0YXJ0LCBpbnQzMl90IGVuZCk7CisgICAgaW50MzJfdCBmaW5pc2hDb21wb3NpdGlvbigp
OworICAgIGludDMyX3Qgc2V0Q29tcG9zaW5nVGV4dChzcGFubmFibGVfc3RyaW5nX3QqLCBpbnQz
Ml90IHJlbGF0aXZlQ3Vyc29yUG9zaXRpb24pOworICAgIGludDMyX3QgY29tbWl0VGV4dChzcGFu
bmFibGVfc3RyaW5nX3QqLCBpbnQzMl90IHJlbGF0aXZlQ3Vyc29yUG9zaXRpb24pOworCisgICAg
dm9pZCBzZXRTcGVsbGNoZWNraW5nRW5hYmxlZChib29sKTsKKworICAgIHZvaWQgc2V0U2VsZWN0
aW9uKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgc3RhcnRQb2ludCwgY29uc3QgUGxhdGZvcm06
OkludFBvaW50JiBlbmRQb2ludCk7CisgICAgdm9pZCBzZXRDYXJldFBvc2l0aW9uKGNvbnN0IFBs
YXRmb3JtOjpJbnRQb2ludCYpOworICAgIHZvaWQgc2VsZWN0QXRQb2ludChjb25zdCBQbGF0Zm9y
bTo6SW50UG9pbnQmKTsKKyAgICB2b2lkIHNlbGVjdGlvbkNhbmNlbGxlZCgpOworICAgIGJvb2wg
c2VsZWN0aW9uQ29udGFpbnMoY29uc3QgUGxhdGZvcm06OkludFBvaW50Jik7CisKKyAgICB2b2lk
IHBvcHVwTGlzdENsb3NlZChpbnQgc2l6ZSwgYm9vbCogc2VsZWN0ZWRzKTsKKyAgICB2b2lkIHBv
cHVwTGlzdENsb3NlZChpbnQgaW5kZXgpOworICAgIHZvaWQgc2V0RGF0ZVRpbWVJbnB1dChjb25z
dCBXZWJTdHJpbmcmIHZhbHVlKTsKKyAgICB2b2lkIHNldENvbG9ySW5wdXQoY29uc3QgV2ViU3Ry
aW5nJiB2YWx1ZSk7CisKKyAgICB2b2lkIG9uSW5wdXRMb2NhbGVDaGFuZ2VkKGJvb2wgaXNSVEwp
OworICAgIHN0YXRpYyB2b2lkIG9uTmV0d29ya0F2YWlsYWJpbGl0eUNoYW5nZWQoYm9vbCBhdmFp
bGFibGUpOworICAgIHN0YXRpYyB2b2lkIG9uQ2VydGlmaWNhdGVTdG9yZUxvY2F0aW9uU2V0KGNv
bnN0IFdlYlN0cmluZyYgY2FQYXRoKTsKKworICAgIFdlYlN0cmluZyB0ZXh0SGFzQXR0cmlidXRl
KGNvbnN0IFdlYlN0cmluZyYgcXVlcnkpIGNvbnN0OworCisgICAgQWN0aXZlTm9kZUNvbnRleHQg
YWN0aXZlTm9kZUNvbnRleHQoVGFyZ2V0RGV0ZWN0aW9uU3RyYXRlZ3kpIGNvbnN0OworCisgICAg
dHlwZWRlZiBpbnRwdHJfdCBCYWNrRm9yd2FyZElkOworICAgIHN0cnVjdCBCYWNrRm9yd2FyZEVu
dHJ5IHsKKyAgICAgICAgV2ViU3RyaW5nIHVybDsKKyAgICAgICAgV2ViU3RyaW5nIG9yaWdpbmFs
VXJsOworICAgICAgICBXZWJTdHJpbmcgdGl0bGU7CisgICAgICAgIFdlYlN0cmluZyBuZXR3b3Jr
VG9rZW47CisgICAgICAgIEJhY2tGb3J3YXJkSWQgaWQ7CisgICAgICAgIGJvb2wgbGFzdFZpc2l0
V2FzSFRUUE5vbkdldDsKKyAgICB9OworCisgICAgYm9vbCBjYW5Hb0JhY2tPckZvcndhcmQoaW50
IGRlbHRhKSBjb25zdDsKKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIG5vIHBhZ2Ug
Zm9yIHRoZSBnaXZlbiBkZWx0YSAoZWcuCisgICAgLy8gYXR0ZW1wdCB0byBnbyBiYWNrIHdpdGgg
LTEgd2hlbiBvbiB0aGUgZmlyc3QgcGFnZSkuCisgICAgYm9vbCBnb0JhY2tPckZvcndhcmQoaW50
IGRlbHRhKTsKKyAgICB2b2lkIGdvVG9CYWNrRm9yd2FyZEVudHJ5KEJhY2tGb3J3YXJkSWQpOwor
CisgICAgaW50IGJhY2tGb3J3YXJkTGlzdExlbmd0aCgpIGNvbnN0OworICAgIHZvaWQgZ2V0QmFj
a0ZvcndhcmRMaXN0KFNoYXJlZEFycmF5PEJhY2tGb3J3YXJkRW50cnk+JiByZXN1bHQsIHVuc2ln
bmVkJiByZXN1bHRMZW5ndGgpIGNvbnN0OworICAgIHZvaWQgcmVsZWFzZUJhY2tGb3J3YXJkRW50
cnkoQmFja0ZvcndhcmRJZCkgY29uc3Q7CisgICAgdm9pZCBjbGVhckJhY2tGb3J3YXJkTGlzdChi
b29sIGtlZXBDdXJyZW50UGFnZSkgY29uc3Q7CisKKyAgICB2b2lkIGFkZFZpc2l0ZWRMaW5rKGNv
bnN0IHVuc2lnbmVkIHNob3J0KiB1cmwsIHVuc2lnbmVkIGxlbmd0aCk7CisKKyNpZiBkZWZpbmVk
KEVOQUJMRV9XRUJET00pICYmIEVOQUJMRV9XRUJET00KKyAgICBXZWJET01Ob2RlIG5vZGVBdFBv
aW50KGludCB4LCBpbnQgeSk7CisgICAgYm9vbCBnZXROb2RlUmVjdChjb25zdCBXZWJET01Ob2Rl
JiwgUGxhdGZvcm06OkludFJlY3QmIHJlc3VsdCk7CisgICAgYm9vbCBzZXROb2RlRm9jdXMoY29u
c3QgV2ViRE9NTm9kZSYsIGJvb2wgb24pOworICAgIGJvb2wgc2V0Tm9kZUhvdmVyZWQoY29uc3Qg
V2ViRE9NTm9kZSYsIGJvb2wgb24pOworICAgIGJvb2wgbm9kZUhhc0hvdmVyKGNvbnN0IFdlYkRP
TU5vZGUmKTsKKyNlbmRpZgorCisgICAgYm9vbCBkZWZlcnNMb2FkaW5nKCkgY29uc3Q7CisKKyAg
ICBib29sIHdpbGxGaXJlVGltZXIoKTsKKworICAgIGJvb2wgaXNFbmFibGVMb2NhbEFjY2Vzc1Rv
QWxsQ29va2llcygpIGNvbnN0OworICAgIHZvaWQgc2V0RW5hYmxlTG9jYWxBY2Nlc3NUb0FsbENv
b2tpZXMoYm9vbCk7CisKKyAgICB2b2lkIGVuYWJsZVdlYkluc3BlY3RvcigpOworICAgIHZvaWQg
ZGlzYWJsZVdlYkluc3BlY3RvcigpOworICAgIHZvaWQgZW5hYmxlUGFzc3dvcmRFY2hvKCk7Cisg
ICAgdm9pZCBkaXNhYmxlUGFzc3dvcmRFY2hvKCk7CisgICAgdm9pZCBkaXNwYXRjaEluc3BlY3Rv
ck1lc3NhZ2UoY29uc3QgY2hhciogbWVzc2FnZSwgaW50IGxlbmd0aCk7CisgICAgV2ViQ29yZTo6
RnJhbWUqIG1haW5GcmFtZSgpIGNvbnN0OworCisgICAgLy8gRklYTUU6IE5lZWRzIEFQSSByZXZp
ZXcgb24gdGhpcyBoZWFkZXIuIFNlZSBQUiAjMTIwNDAyLgorICAgIHZvaWQgbm90aWZ5UGFnZVBh
dXNlKCk7CisgICAgdm9pZCBub3RpZnlQYWdlUmVzdW1lKCk7CisgICAgdm9pZCBub3RpZnlQYWdl
QmFja2dyb3VuZCgpOworICAgIHZvaWQgbm90aWZ5UGFnZUZvcmVncm91bmQoKTsKKyAgICB2b2lk
IG5vdGlmeVBhZ2VGdWxsU2NyZWVuQWxsb3dlZCgpOworICAgIHZvaWQgbm90aWZ5UGFnZUZ1bGxT
Y3JlZW5FeGl0KCk7CisgICAgdm9pZCBub3RpZnlEZXZpY2VJZGxlU3RhdGVDaGFuZ2UoYm9vbCBl
bnRlcklkbGUpOworICAgIHZvaWQgbm90aWZ5QXBwQWN0aXZhdGlvblN0YXRlQ2hhbmdlKEFjdGl2
YXRpb25TdGF0ZVR5cGUpOworICAgIHZvaWQgbm90aWZ5U3dpcGVFdmVudCgpOworICAgIHZvaWQg
bm90aWZ5U2NyZWVuUG93ZXJTdGF0ZUNoYW5nZWQoYm9vbCBwb3dlcmVkKTsKKyAgICB2b2lkIG5v
dGlmeUZ1bGxTY3JlZW5WaWRlb0V4aXRlZChib29sIGRvbmUpOworICAgIHZvaWQgY2xlYXJQbHVn
aW5TaXRlRGF0YSgpOworICAgIHZvaWQgc2V0VmlydHVhbEtleWJvYXJkVmlzaWJsZShib29sKTsK
KyAgICB2b2lkIHNldEphdmFTY3JpcHRDYW5BY2Nlc3NDbGlwYm9hcmQoYm9vbCk7CisgICAgYm9v
bCBpc1dlYkdMRW5hYmxlZCgpIGNvbnN0OworICAgIHZvaWQgc2V0V2ViR0xFbmFibGVkKGJvb2wp
OworCisgICAgdm9pZCBkZXN0cm95V2ViUGFnZUNvbXBvc2l0b3IoKTsKKworcHJpdmF0ZToKKyAg
ICB+V2ViUGFnZSgpOworCisgICAgZnJpZW5kIGNsYXNzIFdlYktpdDo6QmFja2luZ1N0b3JlOwor
ICAgIGZyaWVuZCBjbGFzcyBXZWJLaXQ6OkJhY2tpbmdTdG9yZUNsaWVudDsKKyAgICBmcmllbmQg
Y2xhc3MgV2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOworICAgIGZyaWVuZCBjbGFzcyBXZWJL
aXQ6OlJlbmRlclF1ZXVlOworICAgIGZyaWVuZCBjbGFzcyBXZWJLaXQ6OldlYlBhZ2VHcm91cExv
YWREZWZlcnJlcjsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6Q2hyb21lQ2xpZW50QmxhY2tC
ZXJyeTsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6RWRpdG9yQ2xpZW50QmxhY2tCZXJyeTsK
KyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Owor
ICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpJY29uRGF0YWJhc2VDbGllbnRCbGFja0JlcnJ5Owor
ICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpJbnNwZWN0b3JDbGllbnRCbGFja0JlcnJ5OworICAg
IGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpKYXZhU2NyaXB0RGVidWdnZXJCbGFja0JlcnJ5OworICAg
IGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpHZW9sb2NhdGlvbkNvbnRyb2xsZXJDbGllbnRCbGFja0Jl
cnJ5OworICAgIFdlYlBhZ2VQcml2YXRlKiBkOworfTsKK30KK30KKworI2VuZGlmIC8vIFdlYlBh
Z2VfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9XZWJQYWdlX3Au
aCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvV2ViUGFnZV9wLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
NjhkYjQ3Y2NlNjhhYTY4ODFiYmJhODJjY2FhNTE0YzkxNTRjMGZiMQotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvV2ViUGFnZV9wLmgKQEAgLTAsMCArMSw1
MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFy
Y2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgor
ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYg
bm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNB
CisgKi8KKworI2lmbmRlZiBXZWJQYWdlX3BfaAorI2RlZmluZSBXZWJQYWdlX3BfaAorCisjaW5j
bHVkZSAiQ2hyb21lQ2xpZW50LmgiCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQor
I2luY2x1ZGUgIkxheWVyUmVuZGVyZXIuaCIKKyNlbmRpZgorI2luY2x1ZGUgIlBhZ2VDbGllbnRC
bGFja0JlcnJ5LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCisjaW5jbHVkZSAi
U2NyaXB0U291cmNlQ29kZS5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSAiVmlld3Bv
cnRBcmd1bWVudHMuaCIKKyNpbmNsdWRlICJXZWJQYWdlLmgiCisjaW5jbHVkZSAiV2ViU2V0dGlu
Z3MuaCIKKworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybU1lc3NhZ2UuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworY2xhc3MgRE9NV3JhcHBlcldvcmxkOworY2xhc3MgRG9jdW1lbnQ7Citj
bGFzcyBGcmFtZTsKK2NsYXNzIEZyYW1lVmlldzsKK2NsYXNzIEdlb2xvY2F0aW9uQ29udHJvbGxl
ckNsaWVudEJsYWNrQmVycnk7CitjbGFzcyBKYXZhU2NyaXB0RGVidWdnZXJCbGFja0JlcnJ5Owor
Y2xhc3MgS1VSTDsKK2NsYXNzIE5vZGU7CitjbGFzcyBQYWdlOworY2xhc3MgUGx1Z2luVmlldzsK
K2NsYXNzIFJlbmRlckxheWVyOworY2xhc3MgUmVuZGVyT2JqZWN0OworY2xhc3MgU2Nyb2xsVmll
dzsKK2NsYXNzIFRyYW5zZm9ybWF0aW9uTWF0cml4OwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xh
c3MgVGltZXI7Cit9CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQg
eworCitjbGFzcyBCYWNraW5nU3RvcmU7CitjbGFzcyBCYWNraW5nU3RvcmVDbGllbnQ7CitjbGFz
cyBCYWNraW5nU3RvcmVUaWxlOworY2xhc3MgRHVtcFJlbmRlclRyZWVDbGllbnQ7CitjbGFzcyBJ
blBhZ2VTZWFyY2hNYW5hZ2VyOworY2xhc3MgSW5wdXRIYW5kbGVyOworY2xhc3MgSW5SZWdpb25T
Y3JvbGxhYmxlQXJlYTsKK2NsYXNzIFNlbGVjdGlvbkhhbmRsZXI7CitjbGFzcyBUb3VjaEV2ZW50
SGFuZGxlcjsKK2NsYXNzIFdlYlBhZ2VDbGllbnQ7CisKK3R5cGVkZWYgSGFzaE1hcDxjb25zdCBX
ZWJDb3JlOjpGcmFtZSosIEJhY2tpbmdTdG9yZUNsaWVudCo+IEJhY2tpbmdTdG9yZUNsaWVudEZv
ckZyYW1lTWFwOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorY2xhc3MgRnJh
bWVMYXllcnM7CitjbGFzcyBXZWJQYWdlQ29tcG9zaXRvcjsKKyNlbmRpZgorCisvLyBJbiB0aGUg
Y2xpZW50IGNvZGUsIHRoZXJlIGlzIHNjcmVlbiBzaXplIGFuZCB2aWV3cG9ydC4KKy8vIEluIFdl
YlBhZ2VQcml2YXRlLCB0aGUgc2NyZWVuIHNpemUgaXMgY2FsbGVkIHRoZSB0cmFuc2Zvcm1lZFZp
ZXdwb3J0U2l6ZSwKKy8vIHRoZSB2aWV3cG9ydCBwb3NpdGlvbiBpcyBjYWxsZWQgdGhlIHRyYW5z
Zm9ybWVkU2Nyb2xsUG9zaXRpb24sCisvLyBhbmQgdGhlIHZpZXdwb3J0IHNpemUgaXMgY2FsbGVk
IHRoZSB0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplLgorY2xhc3MgV2ViUGFnZVByaXZhdGUg
OiBwdWJsaWMgUGFnZUNsaWVudEJsYWNrQmVycnksIHB1YmxpYyBXZWJTZXR0aW5nc0RlbGVnYXRl
LCBwdWJsaWMgUGxhdGZvcm06Okd1YXJkZWRQb2ludGVyQmFzZSB7CitwdWJsaWM6CisgICAgZW51
bSBWaWV3TW9kZSB7IE1vYmlsZSwgRGVza3RvcCwgRml4ZWREZXNrdG9wIH07CisgICAgZW51bSBM
b2FkU3RhdGUgeyBOb25lIC8qIG9uIGluc3RhbnRpYXRpb24gb2YgcGFnZSAqLywgUHJvdmlzaW9u
YWwsIENvbW1pdHRlZCwgRmluaXNoZWQsIEZhaWxlZCB9OworCisgICAgV2ViUGFnZVByaXZhdGUo
V2ViUGFnZSosIFdlYlBhZ2VDbGllbnQqLCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0Jik7CisgICAg
dmlydHVhbCB+V2ViUGFnZVByaXZhdGUoKTsKKworICAgIHZvaWQgaW5pdChjb25zdCBXZWJTdHJp
bmcmIHBhZ2VHcm91cE5hbWUpOworICAgIGJvb2wgaGFuZGxlTW91c2VFdmVudChXZWJDb3JlOjpQ
bGF0Zm9ybU1vdXNlRXZlbnQmKTsKKyAgICBib29sIGhhbmRsZVdoZWVsRXZlbnQoV2ViQ29yZTo6
UGxhdGZvcm1XaGVlbEV2ZW50Jik7CisKKyAgICB2b2lkIGxvYWQoY29uc3QgY2hhciogdXJsLCBj
b25zdCBjaGFyKiBuZXR3b3JrVG9rZW4sIGNvbnN0IGNoYXIqIG1ldGhvZCwgUGxhdGZvcm06Ok5l
dHdvcmtSZXF1ZXN0OjpDYWNoZVBvbGljeSwgY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGRhdGFM
ZW5ndGgsIGNvbnN0IGNoYXIqIGNvbnN0KiBoZWFkZXJzLCBzaXplX3QgaGVhZGVyc0xlbmd0aCwg
Ym9vbCBpc0luaXRpYWwsIGJvb2wgbXVzdEhhbmRsZUludGVybmFsbHkgPSBmYWxzZSwgYm9vbCBm
b3JjZURvd25sb2FkID0gZmFsc2UsIGNvbnN0IGNoYXIqIG92ZXJyaWRlQ29udGVudFR5cGUgPSAi
Iik7CisgICAgdm9pZCBsb2FkU3RyaW5nKGNvbnN0IGNoYXIqIHN0cmluZywgY29uc3QgY2hhciog
YmFzZVVSTCwgY29uc3QgY2hhciogbWltZVR5cGUsIGNvbnN0IGNoYXIqIGZhaWxpbmdVUkwgPSAw
KTsKKyAgICBib29sIGV4ZWN1dGVKYXZhU2NyaXB0KGNvbnN0IGNoYXIqIHNjcmlwdCwgSmF2YVNj
cmlwdERhdGFUeXBlJiByZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKTsKKyAgICBi
b29sIGV4ZWN1dGVKYXZhU2NyaXB0SW5Jc29sYXRlZFdvcmxkKGNvbnN0IFdlYkNvcmU6OlNjcmlw
dFNvdXJjZUNvZGUmLCBKYXZhU2NyaXB0RGF0YVR5cGUmIHJldHVyblR5cGUsIFdlYlN0cmluZyYg
cmV0dXJuVmFsdWUpOworCisgICAgdm9pZCBzdG9wQ3VycmVudExvYWQoKTsKKyAgICB2b2lkIHBy
ZXBhcmVUb0Rlc3Ryb3koKTsKKworICAgIExvYWRTdGF0ZSBsb2FkU3RhdGUoKSBjb25zdCB7IHJl
dHVybiBtX2xvYWRTdGF0ZTsgfQorICAgIGJvb2wgaXNMb2FkaW5nKCkgY29uc3QgeyByZXR1cm4g
bV9sb2FkU3RhdGUgPT0gV2ViUGFnZVByaXZhdGU6OlByb3Zpc2lvbmFsIHx8IG1fbG9hZFN0YXRl
ID09IFdlYlBhZ2VQcml2YXRlOjpDb21taXR0ZWQ7IH0KKworICAgIC8vIENhbGxlZCBmcm9tIHdp
dGhpbiBXZWJLaXQgdmlhIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeS4KKyAgICB2b2lkIHNl
dExvYWRTdGF0ZShMb2FkU3RhdGUpOworCisgICAgLy8gQ2xhbXAgdGhlIHNjYWxlLgorICAgIGRv
dWJsZSBjbGFtcGVkU2NhbGUoZG91YmxlIHNjYWxlKSBjb25zdDsKKworICAgIC8vIERldGVybWlu
ZSBpZiB3ZSBzaG91bGQgem9vbSwgY2xhbXBpbmcgdGhlIHNjYWxlIHBhcmFtZXRlciBpZiByZXF1
aXJlZC4KKyAgICBib29sIHNob3VsZFpvb21BYm91dFBvaW50KGRvdWJsZSBzY2FsZSwgY29uc3Qg
V2ViQ29yZTo6RmxvYXRQb2ludCYgYW5jaG9yLCBib29sIGVuZm9yZVNjYWxlQ2xhbXBpbmcsIGRv
dWJsZSogY2xhbXBlZFNjYWxlKTsKKworICAgIC8vIFNjYWxlIHRoZSBwYWdlIHRvIHRoZSBnaXZl
biBzY2FsZSBhbmQgYW5jaG9yIGFib3V0IHRoZSBwb2ludCB3aGljaCBpcyBzcGVjaWZpZWQgaW4g
dW50cmFuc2Zvcm1lZCBjb250ZW50IGNvb3JkaW5hdGVzLgorICAgIGJvb2wgem9vbUFib3V0UG9p
bnQoZG91YmxlIHNjYWxlLCBjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50JiBhbmNob3IsIGJvb2wg
ZW5mb3JjZVNjYWxlQ2xhbXBpbmcgPSB0cnVlLCBib29sIGZvcmNlUmVuZGVyaW5nID0gZmFsc2Us
IGJvb2wgaXNSZXN0b3Jpbmdab29tTGV2ZWwgPSBmYWxzZSk7CisgICAgYm9vbCBzY2hlZHVsZVpv
b21BYm91dFBvaW50KGRvdWJsZSBzY2FsZSwgY29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludCYgYW5j
aG9yLCBib29sIGVuZm9yY2VTY2FsZUNsYW1waW5nID0gdHJ1ZSwgYm9vbCBmb3JjZVJlbmRlcmlu
ZyA9IGZhbHNlKTsKKyAgICB2b2lkIHVuc2NoZWR1bGVab29tQWJvdXRQb2ludCgpOworICAgIFdl
YkNvcmU6OkludFBvaW50IGNhbGN1bGF0ZVJlZmxvd2VkU2Nyb2xsUG9zaXRpb24oY29uc3QgV2Vi
Q29yZTo6RmxvYXRQb2ludCYgYW5jaG9yT2Zmc2V0LCBkb3VibGUgaW52ZXJzZVNjYWxlKTsKKyAg
ICB2b2lkIHNldFRleHRSZWZsb3dBbmNob3JQb2ludChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQm
IGZvY2FsUG9pbnQpOworCisgICAgdm9pZCBzY2hlZHVsZVBpbmNoWm9vbUFib3V0UG9pbnQoZG91
YmxlIHNjYWxlLCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgYW5jaG9yKTsKKworICAgIC8vIFBl
cmZvcm0gYWN0dWFsIHpvb20gZm9yIGJsb2NrIHpvb20uCisgICAgdm9pZCB6b29tQmxvY2soKTsK
KworICAgIC8vIENhbGxlZCBieSB0aGUgYmFja2luZyBzdG9yZSBhcyB3ZWxsIGFzIHRoZSBtZXRo
b2QgYmVsb3cuCisgICAgdm9pZCByZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKSBjb25zdDsKKyAgICB2
b2lkIHNldE5lZWRzTGF5b3V0KCk7CisKKyAgICBXZWJDb3JlOjpJbnRQb2ludCBzY3JvbGxQb3Np
dGlvbigpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFBvaW50IG1heGltdW1TY3JvbGxQb3NpdGlv
bigpIGNvbnN0OworICAgIHZvaWQgc2V0U2Nyb2xsUG9zaXRpb24oY29uc3QgV2ViQ29yZTo6SW50
UG9pbnQmKTsKKyAgICBib29sIHNjcm9sbEJ5KGludCBkZWx0YVgsIGludCBkZWx0YVksIGJvb2wg
c2Nyb2xsTWFpbkZyYW1lID0gdHJ1ZSk7CisKKyAgICB2b2lkIGVucXVldWVSZW5kZXJpbmdPZkNs
aXBwZWRDb250ZW50T2ZTY3JvbGxhYmxlTm9kZUFmdGVySW5SZWdpb25TY3JvbGxpbmcoV2ViQ29y
ZTo6Tm9kZSopOworICAgIHN0ZDo6dmVjdG9yPFBsYXRmb3JtOjpTY3JvbGxWaWV3QmFzZT4gaW5S
ZWdpb25TY3JvbGxhYmxlQXJlYXNGb3JQb2ludChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmKTsK
KyAgICB2b2lkIG5vdGlmeUluUmVnaW9uU2Nyb2xsU3RhdHVzQ2hhbmdlZChib29sIHN0YXR1cyk7
CisgICAgdm9pZCBzZXRTY3JvbGxPcmlnaW5Qb2ludChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQm
KTsKKyAgICB2b2lkIHNldEhhc0luUmVnaW9uU2Nyb2xsYWJsZUFyZWFzKGJvb2wpOworCisgICAg
Ly8gVGhlIGFjdHVhbCB2aXNpYmxlIHNpemUgYXMgcmVwb3J0ZWQgYnkgdGhlIGNsaWVudCwgYnV0
IGluIFdlYktpdCBjb29yZGluYXRlcy4KKyAgICBXZWJDb3JlOjpJbnRTaXplIGFjdHVhbFZpc2li
bGVTaXplKCkgY29uc3Q7CisKKyAgICAvLyBUaGUgdmlld3BvcnQgc2l6ZSBpcyB0aGUgc2FtZSBh
cyB0aGUgY2xpZW50J3Mgd2luZG93IHNpemUsIGJ1dCBpbiB3ZWJraXQgY29vcmRpbmF0ZXMuCisg
ICAgV2ViQ29yZTo6SW50U2l6ZSB2aWV3cG9ydFNpemUoKSBjb25zdDsKKworICAgIC8vIE1vZGlm
aWVzIHRoZSB6b29tVG9GaXQgYWxnb3JpdGhtIGxvZ2ljIHRvIGNvbnN0cnVjdCBhIHNjYWxlIHN1
Y2ggdGhhdCB0aGUgdmlld3BvcnRTaXplIGFib3ZlIGlzIGVxdWFsIHRvIHRoaXMgc2l6ZS4KKyAg
ICBib29sIGhhc1ZpcnR1YWxWaWV3cG9ydCgpIGNvbnN0OworICAgIGJvb2wgaXNVc2VyU2NhbGFi
bGUoKSBjb25zdCB7IHJldHVybiBtX3VzZXJTY2FsYWJsZTsgfQorICAgIHZvaWQgc2V0VXNlclNj
YWxhYmxlKGJvb2wgdXNlclNjYWxhYmxlKSB7IG1fdXNlclNjYWxhYmxlID0gdXNlclNjYWxhYmxl
OyB9CisKKyAgICAvLyBTZXRzIGRlZmF1bHQgbGF5b3V0IHNpemUgd2l0aG91dCBkb2luZyBsYXlv
dXQgb3IgbWFya2luZyBhcyBuZWVkaW5nIGxheW91dC4KKyAgICB2b2lkIHNldERlZmF1bHRMYXlv
dXRTaXplKGNvbnN0IFdlYkNvcmU6OkludFNpemUmKTsKKworICAgIC8vIFVwZGF0ZXMgV2ViQ29y
ZSB3aGVuIHRoZSB2aWV3cG9ydFNpemUoKSBvciBhY3R1YWxWaXNpYmxlU2l6ZSgpIGNoYW5nZS4K
KyAgICB2b2lkIHVwZGF0ZVZpZXdwb3J0U2l6ZShib29sIHNldEZpeGVkUmVwb3J0ZWRTaXplID0g
dHJ1ZSwgYm9vbCBzZW5kUmVzaXplRXZlbnQgPSB0cnVlKTsKKworICAgIFdlYkNvcmU6OkZsb2F0
UG9pbnQgY2VudGVyT2ZWaXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3Q7CisgICAgV2ViQ29yZTo6
SW50UmVjdCB2aXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3Q7CisgICAgV2ViQ29yZTo6SW50U2l6
ZSBjb250ZW50c1NpemUoKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRTaXplIGFic29sdXRlVmlz
aWJsZU92ZXJmbG93U2l6ZSgpIGNvbnN0OworCisgICAgLy8gVmlydHVhbCBmdW5jdGlvbnMgaW5o
ZXJpdGVkIGZyb20gUGFnZUNsaWVudEJsYWNrQmVycnkuCisgICAgdmlydHVhbCB2b2lkIHNldEN1
cnNvcihXZWJDb3JlOjpQbGF0Zm9ybUN1cnNvckhhbmRsZSk7CisgICAgdmlydHVhbCBQbGF0Zm9y
bTo6TmV0d29ya1N0cmVhbUZhY3RvcnkqIG5ldHdvcmtTdHJlYW1GYWN0b3J5KCk7CisgICAgdmly
dHVhbCBQbGF0Zm9ybTo6R3JhcGhpY3M6OldpbmRvdyogcGxhdGZvcm1XaW5kb3coKSBjb25zdDsK
KyAgICB2aXJ0dWFsIHZvaWQgc2V0UHJldmVudHNTY3JlZW5EaW1taW5nKGJvb2wgcHJldmVudERp
bW1pbmcpOworICAgIHZpcnR1YWwgdm9pZCBzaG93VmlydHVhbEtleWJvYXJkKGJvb2wgc2hvd0tl
eWJvYXJkKTsKKyAgICB2aXJ0dWFsIHZvaWQgZW5zdXJlQ29udGVudFZpc2libGUoYm9vbCBjZW50
ZXJJblZpZXcgPSB0cnVlKTsKKyAgICB2aXJ0dWFsIHZvaWQgem9vbVRvQ29udGVudFJlY3QoY29u
c3QgV2ViQ29yZTo6SW50UmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclBsdWdpbihX
ZWJDb3JlOjpQbHVnaW5WaWV3KiwgYm9vbCk7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVBhZ2VP
bkxvYWQoKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkUGx1Z2luRW50ZXJGdWxsU2NyZWVuKFdl
YkNvcmU6OlBsdWdpblZpZXcqLCBjb25zdCBjaGFyKik7CisgICAgdmlydHVhbCB2b2lkIGRpZFBs
dWdpbkVudGVyRnVsbFNjcmVlbihXZWJDb3JlOjpQbHVnaW5WaWV3KiwgY29uc3QgY2hhciopOwor
ICAgIHZpcnR1YWwgdm9pZCBkaWRQbHVnaW5FeGl0RnVsbFNjcmVlbihXZWJDb3JlOjpQbHVnaW5W
aWV3KiwgY29uc3QgY2hhciopOworICAgIHZpcnR1YWwgdm9pZCBvblBsdWdpblN0YXJ0QmFja2dy
b3VuZFBsYXkoV2ViQ29yZTo6UGx1Z2luVmlldyosIGNvbnN0IGNoYXIqKTsKKyAgICB2aXJ0dWFs
IHZvaWQgb25QbHVnaW5TdG9wQmFja2dyb3VuZFBsYXkoV2ViQ29yZTo6UGx1Z2luVmlldyosIGNv
bnN0IGNoYXIqKTsKKyAgICB2aXJ0dWFsIGJvb2wgbG9ja09yaWVudGF0aW9uKGJvb2wgbGFuZHNj
YXBlKTsKKyAgICB2aXJ0dWFsIHZvaWQgdW5sb2NrT3JpZW50YXRpb24oKTsKKyAgICB2aXJ0dWFs
IGludCBvcmllbnRhdGlvbigpIGNvbnN0OworICAgIHZpcnR1YWwgZG91YmxlIGN1cnJlbnRab29t
RmFjdG9yKCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQgc2hvd0FsZXJ0RGlhbG9nKFdlYlBhZ2VD
bGllbnQ6OkFsZXJ0VHlwZSBhdHlwZSk7CisgICAgdmlydHVhbCBib29sIGlzQWN0aXZlKCkgY29u
c3Q7CisKKyAgICAvLyBDYWxsZWQgZnJvbSB3aXRoaW4gV2ViS2l0IHZpYSBDaHJvbWVDbGllbnRC
bGFja0JlcnJ5LgorICAgIHZvaWQgZW50ZXJGdWxsc2NyZWVuRm9yTm9kZShXZWJDb3JlOjpOb2Rl
Kik7CisgICAgdm9pZCBleGl0RnVsbHNjcmVlbkZvck5vZGUoV2ViQ29yZTo6Tm9kZSopOworICAg
IHZvaWQgY29udGVudHNTaXplQ2hhbmdlZChjb25zdCBXZWJDb3JlOjpJbnRTaXplJik7CisgICAg
dm9pZCBvdmVyZmxvd0V4Y2VlZHNDb250ZW50c1NpemUoKTsKKyAgICB2b2lkIGxheW91dEZpbmlz
aGVkKCk7CisgICAgdm9pZCBzZXROZWVkVG91Y2hFdmVudHMoYm9vbCk7CisKKyAgICAvLyBDYWxs
ZWQgYWNjb3JkaW5nIHRvIG91ciBoZXVyaXN0aWMgb3IgZnJvbSBzZXRMb2FkU3RhdGUgZGVwZW5k
aW5nIG9uIHdoZXRoZXIgd2UgaGF2ZSBhIHZpcnR1YWwgdmlld3BvcnQuCisgICAgdm9pZCB6b29t
VG9Jbml0aWFsU2NhbGVPbkxvYWQoKTsKKworICAgIC8vIFZhcmlvdXMgc2NhbGUgZmFjdG9ycy4K
KyAgICBkb3VibGUgY3VycmVudFNjYWxlKCkgY29uc3Q7CisgICAgZG91YmxlIHpvb21Ub0ZpdFNj
YWxlKCkgY29uc3Q7CisgICAgZG91YmxlIGluaXRpYWxTY2FsZSgpIGNvbnN0OworICAgIHZvaWQg
c2V0SW5pdGlhbFNjYWxlKGRvdWJsZSBzY2FsZSkgeyBtX2luaXRpYWxTY2FsZSA9IHNjYWxlOyB9
CisgICAgZG91YmxlIG1pbmltdW1TY2FsZSgpIGNvbnN0OworICAgIHZvaWQgc2V0TWluaW11bVNj
YWxlKGRvdWJsZSBzY2FsZSkgeyBtX21pbmltdW1TY2FsZSA9IHNjYWxlOyB9CisgICAgZG91Ymxl
IG1heGltdW1TY2FsZSgpIGNvbnN0OworICAgIHZvaWQgc2V0TWF4aW11bVNjYWxlKGRvdWJsZSBz
Y2FsZSkgeyBtX21heGltdW1TY2FsZSA9IHNjYWxlOyB9CisgICAgdm9pZCByZXNldFNjYWxlcygp
OworCisgICAgaW50IHJlZmxvd1dpZHRoKCkgY29uc3QKKyAgICB7CisgICAgICAgIC8vIE5vdGU6
IHRvIG1ha2UgdGhpcyByZWZsb3cgd2lkdGggdHJhbnNmb3JtIGludmFyaWFudCBqdXN0IHVzZQor
ICAgICAgICAvLyB0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKCkgaGVyZSBpbnN0ZWFkIQor
ICAgICAgICByZXR1cm4gYWN0dWFsVmlzaWJsZVNpemUoKS53aWR0aCgpOworICAgIH0KKworICAg
IC8vIFRoZXNlIG1ldGhvZHMgZ2l2ZSB0aGUgcmVhbCBnZW9tZXRyeSBvZiB0aGUgZGV2aWNlIGdp
dmVuIHRoZSBjdXJyZW50bHkgc2V0IHRyYW5zZm9ybS4KKyAgICBXZWJDb3JlOjpJbnRQb2ludCB0
cmFuc2Zvcm1lZFNjcm9sbFBvc2l0aW9uKCkgY29uc3Q7CisgICAgV2ViQ29yZTo6SW50UG9pbnQg
dHJhbnNmb3JtZWRNYXhpbXVtU2Nyb2xsUG9zaXRpb24oKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJ
bnRTaXplIHRyYW5zZm9ybWVkQWN0dWFsVmlzaWJsZVNpemUoKSBjb25zdDsKKyAgICBXZWJDb3Jl
OjpJbnRTaXplIHRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCkgY29uc3Q7CisgICAgV2ViQ29yZTo6
SW50UmVjdCB0cmFuc2Zvcm1lZFZpc2libGVDb250ZW50c1JlY3QoKSBjb25zdDsKKyAgICBXZWJD
b3JlOjpJbnRTaXplIHRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkgY29uc3Q7CisKKyAgICAvLyBH
ZW5lcmljIGNvbnZlcnNpb25zIG9mIHBvaW50cywgcmVjdHMsIHJlbGF0aXZlIHRvIGFuZCBmcm9t
IGNvbnRlbnRzIGFuZCB2aWV3cG9ydC4KKyAgICBXZWJDb3JlOjpJbnRQb2ludCBtYXBGcm9tQ29u
dGVudHNUb1ZpZXdwb3J0KGNvbnN0IFdlYkNvcmU6OkludFBvaW50JikgY29uc3Q7CisgICAgV2Vi
Q29yZTo6SW50UG9pbnQgbWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyhjb25zdCBXZWJDb3JlOjpJ
bnRQb2ludCYpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFJlY3QgbWFwRnJvbUNvbnRlbnRzVG9W
aWV3cG9ydChjb25zdCBXZWJDb3JlOjpJbnRSZWN0JikgY29uc3Q7CisgICAgV2ViQ29yZTo6SW50
UmVjdCBtYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKGNvbnN0IFdlYkNvcmU6OkludFJlY3QmKSBj
b25zdDsKKworICAgIC8vIEdlbmVyaWMgY29udmVyc2lvbnMgb2YgcG9pbnRzLCByZWN0cywgcmVs
YXRpdmUgdG8gYW5kIGZyb20gdHJhbnNmb3JtZWQgY29udGVudHMgYW5kIHRyYW5zZm9ybWVkIHZp
ZXdwb3J0LgorICAgIFdlYkNvcmU6OkludFBvaW50IG1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRz
VG9UcmFuc2Zvcm1lZFZpZXdwb3J0KGNvbnN0IFdlYkNvcmU6OkludFBvaW50JikgY29uc3Q7Cisg
ICAgV2ViQ29yZTo6SW50UG9pbnQgbWFwRnJvbVRyYW5zZm9ybWVkVmlld3BvcnRUb1RyYW5zZm9y
bWVkQ29udGVudHMoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmKSBjb25zdDsKKyAgICBXZWJDb3Jl
OjpJbnRSZWN0IG1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9UcmFuc2Zvcm1lZFZpZXdwb3J0
KGNvbnN0IFdlYkNvcmU6OkludFJlY3QmKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IG1h
cEZyb21UcmFuc2Zvcm1lZFZpZXdwb3J0VG9UcmFuc2Zvcm1lZENvbnRlbnRzKGNvbnN0IFdlYkNv
cmU6OkludFJlY3QmKSBjb25zdDsKKworICAgIC8vIEdlbmVyaWMgY29udmVyc2lvbnMgb2YgcG9p
bnRzLCByZWN0cywgYW5kIHNpemVzIHRvIGFuZCBmcm9tIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVz
LgorICAgIFdlYkNvcmU6OkludFBvaW50IG1hcFRvVHJhbnNmb3JtZWQoY29uc3QgV2ViQ29yZTo6
SW50UG9pbnQmKSBjb25zdDsKKyAgICBXZWJDb3JlOjpGbG9hdFBvaW50IG1hcFRvVHJhbnNmb3Jt
ZWRGbG9hdFBvaW50KGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQmKSBjb25zdDsKKyAgICBXZWJD
b3JlOjpJbnRQb2ludCBtYXBGcm9tVHJhbnNmb3JtZWQoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQm
KSBjb25zdDsKKyAgICBXZWJDb3JlOjpGbG9hdFBvaW50IG1hcEZyb21UcmFuc2Zvcm1lZEZsb2F0
UG9pbnQoY29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludCYpIGNvbnN0OworICAgIFdlYkNvcmU6OkZs
b2F0UmVjdCBtYXBGcm9tVHJhbnNmb3JtZWRGbG9hdFJlY3QoY29uc3QgV2ViQ29yZTo6RmxvYXRS
ZWN0JikgY29uc3Q7CisgICAgV2ViQ29yZTo6SW50U2l6ZSBtYXBUb1RyYW5zZm9ybWVkKGNvbnN0
IFdlYkNvcmU6OkludFNpemUmKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRTaXplIG1hcEZyb21U
cmFuc2Zvcm1lZChjb25zdCBXZWJDb3JlOjpJbnRTaXplJikgY29uc3Q7CisgICAgV2ViQ29yZTo6
SW50UmVjdCBtYXBUb1RyYW5zZm9ybWVkKGNvbnN0IFdlYkNvcmU6OkludFJlY3QmKSBjb25zdDsK
KyAgICB2b2lkIGNsaXBUb1RyYW5zZm9ybWVkQ29udGVudHNSZWN0KFdlYkNvcmU6OkludFJlY3Qm
KSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IG1hcEZyb21UcmFuc2Zvcm1lZChjb25zdCBX
ZWJDb3JlOjpJbnRSZWN0JikgY29uc3Q7CisgICAgYm9vbCB0cmFuc2Zvcm1lZFBvaW50RXF1YWxz
VW50cmFuc2Zvcm1lZFBvaW50KGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiB0cmFuc2Zvcm1lZFBv
aW50LCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgdW50cmFuc2Zvcm1lZFBvaW50KTsKKworICAg
IC8vIE5vdGlmaWNhdGlvbiBtZXRob2RzIHRoYXQgZGVsaXZlciBjaGFuZ2VzIHRvIHRoZSByZWFs
IGdlb21ldHJ5IG9mIHRoZSBkZXZpY2UgYXMgc3BlY2lmaWVkIGFib3ZlLgorICAgIHZvaWQgbm90
aWZ5VHJhbnNmb3JtQ2hhbmdlZCgpOworICAgIHZvaWQgbm90aWZ5VHJhbnNmb3JtZWRDb250ZW50
c1NpemVDaGFuZ2VkKCk7CisgICAgdm9pZCBub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQo
KTsKKworICAgIHZvaWQgYXNzaWduRm9jdXMoUGxhdGZvcm06OkZvY3VzRGlyZWN0aW9uKTsKKyAg
ICBQbGF0Zm9ybTo6SW50UmVjdCBmb2N1c05vZGVSZWN0KCk7CisgICAgV2ViQ29yZTo6SW50UmVj
dCBnZXRSZWN1cnNpdmVWaXNpYmxlV2luZG93UmVjdChXZWJDb3JlOjpTY3JvbGxWaWV3KiwgYm9v
bCBub0NsaXBPZk1haW5GcmFtZSA9IGZhbHNlKTsKKworICAgIFdlYkNvcmU6OkludFBvaW50IGZy
YW1lT2Zmc2V0KGNvbnN0IFdlYkNvcmU6OkZyYW1lKikgY29uc3Q7CisKKyAgICBXZWJDb3JlOjpO
b2RlKiBiZXN0Tm9kZUZvclpvb21VbmRlclBvaW50KGNvbnN0IFdlYkNvcmU6OkludFBvaW50Jik7
CisgICAgV2ViQ29yZTo6Tm9kZSogYmVzdENoaWxkTm9kZUZvckNsaWNrUmVjdChXZWJDb3JlOjpO
b2RlKiBwYXJlbnROb2RlLCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBjbGlja1JlY3QpOworICAg
IFdlYkNvcmU6Ok5vZGUqIG5vZGVGb3Jab29tVW5kZXJQb2ludChjb25zdCBXZWJDb3JlOjpJbnRQ
b2ludCYpOworICAgIFdlYkNvcmU6Ok5vZGUqIGFkanVzdGVkQmxvY2tab29tTm9kZUZvclpvb21M
aW1pdHMoV2ViQ29yZTo6Tm9kZSopOworICAgIFdlYkNvcmU6OkludFJlY3QgcmVjdEZvck5vZGUo
V2ViQ29yZTo6Tm9kZSopOworICAgIFdlYkNvcmU6OkludFJlY3QgYmxvY2tab29tUmVjdEZvck5v
ZGUoV2ViQ29yZTo6Tm9kZSopOworICAgIFdlYkNvcmU6OkludFJlY3QgYWRqdXN0UmVjdE9mZnNl
dEZvckZyYW1lT2Zmc2V0KGNvbnN0IFdlYkNvcmU6OkludFJlY3QmLCBjb25zdCBXZWJDb3JlOjpO
b2RlKik7CisgICAgYm9vbCBjb21wYXJlTm9kZXNGb3JCbG9ja1pvb20oV2ViQ29yZTo6Tm9kZSog
bjEsIFdlYkNvcmU6Ok5vZGUqIG4yKTsKKyAgICBkb3VibGUgbmV3U2NhbGVGb3JCbG9ja1pvb21S
ZWN0KGNvbnN0IFdlYkNvcmU6OkludFJlY3QmLCBkb3VibGUgb2xkU2NhbGUsIGRvdWJsZSBtYXJn
aW4pOworICAgIGRvdWJsZSBtYXhCbG9ja1pvb21TY2FsZSgpIGNvbnN0OworCisgICAgLy8gUGx1
Z2luIE1ldGhvZHMuCisgICAgdm9pZCBub3RpZnlQbHVnaW5SZWN0Q2hhbmdlZChpbnQgaWQsIGNv
bnN0IFdlYkNvcmU6OkludFJlY3QmIHJlY3RDaGFuZ2VkKTsKKworICAgIC8vIENvbnRleHQgTWV0
aG9kcy4KKyAgICBBY3RpdmVOb2RlQ29udGV4dCBhY3RpdmVOb2RlQ29udGV4dChUYXJnZXREZXRl
Y3Rpb25TdHJhdGVneSk7CisgICAgUGFzc1JlZlB0cjxXZWJDb3JlOjpOb2RlPiBjb250ZXh0Tm9k
ZShUYXJnZXREZXRlY3Rpb25TdHJhdGVneSk7CisKKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9X
KQorICAgIHZvaWQgdG9nZ2xlVGV4dFJlZmxvd0lmRW5hYmxlZEZvckJsb2NrWm9vbU9ubHkoYm9v
bCBzaG91bGRFbmFibGVUZXh0UmVmbG93ID0gZmFsc2UpOworI2VuZGlmCisKKyAgICB2b2lkIHNl
bGVjdGlvbkNoYW5nZWQoV2ViQ29yZTo6RnJhbWUqKTsKKworICAgIHZvaWQgdXBkYXRlRGVsZWdh
dGVkT3ZlcmxheXMoYm9vbCBkaXNwYXRjaGVkID0gZmFsc2UpOworCisgICAgdm9pZCB1cGRhdGVD
dXJzb3IoKTsKKworICAgIHZvaWQgb25JbnB1dExvY2FsZUNoYW5nZWQoYm9vbCBpc1JUTCk7CisK
KyAgICBWaWV3TW9kZSB2aWV3TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmlld01vZGU7IH0KKyAg
ICBib29sIHNldFZpZXdNb2RlKFZpZXdNb2RlKTsgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjaGFu
Z2UgcmVxdWlyZXMgcmUtbGF5b3V0LgorCisgICAgdm9pZCBzZXRTaG91bGRVc2VGaXhlZERlc2t0
b3BNb2RlKGJvb2wgYikgeyBtX3Nob3VsZFVzZUZpeGVkRGVza3RvcE1vZGUgPSBiOyB9CisKKyAg
ICBib29sIHVzZUZpeGVkTGF5b3V0KCkgY29uc3Q7CisgICAgV2ViQ29yZTo6SW50U2l6ZSBmaXhl
ZExheW91dFNpemUoYm9vbCBzbmFwVG9JbmNyZW1lbnQgPSBmYWxzZSkgY29uc3Q7CisKKyAgICBi
b29sIGRpZExheW91dEV4Y2VlZE1heGltdW1JdGVyYXRpb25zKCkgY29uc3QKKyAgICB7CisgICAg
ICAgIC8vIFpvb21Ub0ZpdE9uTG9hZCBjYW4gbGVhZCB0byBhIGxhcmdlIHJlY3Vyc2lvbiBkZXB0
aCBpbiBGcmFtZVZpZXc6OmxheW91dCgpIGFzIHdlIGF0dGVtcHQKKyAgICAgICAgLy8gdG8gZGV0
ZXJtaW5lIHRoZSB6b29tIHNjYWxlIGZhY3RvciBzbyBhcyB0byBoYXZlIHRoZSBjb250ZW50IG9m
IHRoZSBwYWdlIGZpdCB3aXRoaW4gdGhlCisgICAgICAgIC8vIGFyZWEgb2YgdGhlIGZyYW1lLiBG
cm9tIG9ic2VydmF0aW9uLCB3ZSBjYW4gYmFpbCBvdXQgYWZ0ZXIgYSByZWN1cnNpb24gZGVwdGgg
b2YgMTAgYW5kCisgICAgICAgIC8vIHN0aWxsIGhhdmUgcmVhc29uYWJsZSByZXN1bHRzLgorICAg
ICAgICByZXR1cm4gbV9uZXN0ZWRMYXlvdXRGaW5pc2hlZENvdW50ID4gMTA7CisgICAgfQorCisK
KyAgICB2b2lkIGNsZWFyRm9jdXNOb2RlKCk7CisgICAgV2ViQ29yZTo6RnJhbWUqIGZvY3VzZWRP
ck1haW5GcmFtZSgpIGNvbnN0OworICAgIFdlYkNvcmU6OkZyYW1lKiBtYWluRnJhbWUoKSBjb25z
dDsKKworICAgIGJvb2wgc2Nyb2xsTm9kZVJlY3Vyc2l2ZWx5KFdlYkNvcmU6Ok5vZGUqIG9yaWdp
bmFsTm9kZSwgY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYgZGVsdGEpOworICAgIGJvb2wgc2Nyb2xs
UmVuZGVyZXIoV2ViQ29yZTo6UmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgV2ViQ29yZTo6
SW50U2l6ZSYgZGVsdGEpOworICAgIHZvaWQgYWRqdXN0U2Nyb2xsRGVsdGEoY29uc3QgV2ViQ29y
ZTo6SW50UG9pbnQmIG1heE9mZnNldCwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIGN1cnJlbnRP
ZmZzZXQsIFdlYkNvcmU6OkludFNpemUmIGRlbHRhKSBjb25zdDsKKworICAgIGJvb2wgY2FuU2Ny
b2xsUmVuZGVyQm94KFdlYkNvcmU6OlJlbmRlckJveCopOworICAgIGJvb2wgY2FuU2Nyb2xsSW5u
ZXJGcmFtZShXZWJDb3JlOjpGcmFtZSopIGNvbnN0OworCisjaWYgRU5BQkxFKEVWRU5UX01PREVf
TUVUQVRBR1MpCisgICAgdm9pZCBkaWRSZWNlaXZlQ3Vyc29yRXZlbnRNb2RlKFdlYkNvcmU6OkN1
cnNvckV2ZW50TW9kZSk7CisgICAgdm9pZCBkaWRSZWNlaXZlVG91Y2hFdmVudE1vZGUoV2ViQ29y
ZTo6VG91Y2hFdmVudE1vZGUpOworI2VuZGlmCisKKyAgICB2b2lkIGRpc3BhdGNoVmlld3BvcnRQ
cm9wZXJ0aWVzRGlkQ2hhbmdlKGNvbnN0IFdlYkNvcmU6OlZpZXdwb3J0QXJndW1lbnRzJik7Cisg
ICAgV2ViQ29yZTo6SW50U2l6ZSByZWNvbXB1dGVWaXJ0dWFsVmlld3BvcnRGcm9tVmlld3BvcnRB
cmd1bWVudHMoKTsKKworICAgIHZvaWQgcmVzZXRCbG9ja1pvb20oKTsKKworICAgIHZvaWQgem9v
bUFib3V0UG9pbnRUaW1lckZpcmVkKFdlYkNvcmU6OlRpbWVyPFdlYlBhZ2VQcml2YXRlPiopOwor
ICAgIGJvb2wgc2hvdWxkU2VuZFJlc2l6ZUV2ZW50KCk7CisgICAgdm9pZCBzY3JvbGxFdmVudFRp
bWVyRmlyZWQoV2ViQ29yZTo6VGltZXI8V2ViUGFnZVByaXZhdGU+Kik7CisgICAgdm9pZCByZXNp
emVFdmVudFRpbWVyRmlyZWQoV2ViQ29yZTo6VGltZXI8V2ViUGFnZVByaXZhdGU+Kik7CisKKyAg
ICAvLyBJZiB0aGlzIHVybCBzaG91bGQgYmUgaGFuZGxlZCBhcyBhIHBhdHRlcm4sIHJldHVybnMg
dGhlIHBhdHRlcm4KKyAgICAvLyBvdGhlcndpc2UsIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgor
ICAgIFN0cmluZyBmaW5kUGF0dGVyblN0cmluZ0ZvclVybChjb25zdCBXZWJDb3JlOjpLVVJMJikg
Y29uc3Q7CisKKyAgICB2b2lkIHN1c3BlbmRCYWNraW5nU3RvcmUoKTsKKyAgICB2b2lkIHJlc3Vt
ZUJhY2tpbmdTdG9yZSgpOworCisgICAgdm9pZCBzZXRTaG91bGRSZXNldFRpbGVzV2hlblNob3du
KGJvb2wgZmxhZykgeyBtX3Nob3VsZFJlc2V0VGlsZXNXaGVuU2hvd24gPSBmbGFnOyB9CisgICAg
Ym9vbCBzaG91bGRSZXNldFRpbGVzV2hlblNob3duKCkgY29uc3QgeyByZXR1cm4gbV9zaG91bGRS
ZXNldFRpbGVzV2hlblNob3duOyB9CisKKyAgICB2b2lkIHNldFNjcmVlbk9yaWVudGF0aW9uKGlu
dCk7CisKKyAgICAvLyBTY3JvbGwgYW5kL29yIHpvb20gc28gdGhhdCB0aGUgV2ViUGFnZSBmaXRz
IHRoZSBuZXcgYWN0dWFsCisgICAgLy8gdmlzaWJsZSBzaXplLgorICAgIHZvaWQgc2V0Vmlld3Bv
cnRTaXplKGNvbnN0IFdlYkNvcmU6OkludFNpemUmIHRyYW5zZm9ybWVkQWN0dWFsVmlzaWJsZVNp
emUsIGJvb2wgZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJsZSk7CisgICAgdm9pZCBzY3JlZW5Sb3Rh
dGVkKCk7IC8vIEhlbHBlciBtZXRob2QgZm9yIHNldFZpZXdwb3J0U2l6ZSgpLgorCisgICAgdm9p
ZCBzY2hlZHVsZURlZmVycmFibGVUaW1lcihXZWJDb3JlOjpUaW1lcjxXZWJQYWdlUHJpdmF0ZT4q
LCBkb3VibGUgdGltZU91dCk7CisgICAgdm9pZCB1bnNjaGVkdWxlQWxsRGVmZXJyYWJsZVRpbWVy
cygpOworICAgIHZvaWQgd2lsbERlZmVyTG9hZGluZygpOworICAgIHZvaWQgZGlkUmVzdW1lTG9h
ZGluZygpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBlc2NhcGUga2V5IGhhbmRsZXIg
c2hvdWxkIHpvb20uCisgICAgYm9vbCBzaG91bGRab29tT25Fc2NhcGUoKSBjb25zdDsKKworICAg
IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4KiB0cmFuc2Zvcm1hdGlvbk1hdHJpeCgpIGNv
bnN0CisgICAgeworICAgICAgICByZXR1cm4gbV90cmFuc2Zvcm1hdGlvbk1hdHJpeDsKKyAgICB9
CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgLy8gV2ViS2l0IHRocmVh
ZC4KKyAgICBib29sIG5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKTsKKyAgICB2
b2lkIHJvb3RMYXllckNvbW1pdFRpbWVyRmlyZWQoV2ViQ29yZTo6VGltZXI8V2ViUGFnZVByaXZh
dGU+Kik7CisgICAgYm9vbCBjb21taXRSb290TGF5ZXJJZk5lZWRlZCgpOworICAgIFdlYkNvcmU6
OkxheWVyUmVuZGVyaW5nUmVzdWx0cyBsYXN0Q29tcG9zaXRpbmdSZXN1bHRzKCkgY29uc3Q7CisK
KyAgICAvLyBXZWJLaXQgdGhyZWFkLCBwbHVtYmVkIHRocm91Z2ggZnJvbSBDaHJvbWVDbGllbnRC
bGFja0JlcnJ5LgorICAgIHZvaWQgc2V0Um9vdExheWVyV2ViS2l0VGhyZWFkKFdlYkNvcmU6OkZy
YW1lKiwgV2ViQ29yZTo6TGF5ZXJXZWJLaXRUaHJlYWQqKTsKKyAgICB2b2lkIHNldE5lZWRzT25l
U2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKTsKKyAgICB2b2lkIHNjaGVkdWxlUm9vdExheWVy
Q29tbWl0KCk7CisKKyAgICAvLyBUaHJlYWQgc2FmZS4KKyAgICB2b2lkIHJlc2V0Q29tcG9zaXRp
bmdTdXJmYWNlKCk7CisgICAgdm9pZCBkcmF3TGF5ZXJzT25Db21taXQoKTsgLy8gSW5jbHVkaW5n
IGJhY2tpbmcgc3RvcmUgYmxpdC4KKyAgICBib29sIGRyYXdTdWJMYXllcnMoY29uc3QgV2ViQ29y
ZTo6SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgV2ViQ29yZTo6RmxvYXRSZWN0JiBjb250ZW50cyk7
CisgICAgYm9vbCBkcmF3U3ViTGF5ZXJzKCk7IC8vIERyYXcgdGhlbSBhdCBsYXN0IGtub3duIHBv
c2l0aW9uLgorCisgICAgLy8gQ29tcG9zaXRpbmcgdGhyZWFkLgorICAgIHZvaWQgc2V0Um9vdExh
eWVyQ29tcG9zaXRpbmdUaHJlYWQoV2ViQ29yZTo6TGF5ZXJDb21wb3NpdGluZ1RocmVhZCopOwor
ICAgIHZvaWQgY29tbWl0Um9vdExheWVyKGNvbnN0IFdlYkNvcmU6OkludFJlY3QmLCBjb25zdCBX
ZWJDb3JlOjpJbnRTaXplJik7CisgICAgdm9pZCBzZXRJc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmdB
Y3RpdmUoYm9vbCk7CisgICAgdm9pZCBkZXN0cm95Q29tcG9zaXRvcigpOworICAgIHZvaWQgc3lu
Y0Rlc3Ryb3lDb21wb3NpdG9yT25Db21wb3NpdGluZ1RocmVhZCgpOworICAgIHZvaWQgZGVzdHJv
eUxheWVyUmVzb3VyY2VzKCk7CisgICAgdm9pZCBzdXNwZW5kUm9vdExheWVyQ29tbWl0KCk7Cisg
ICAgdm9pZCByZXN1bWVSb290TGF5ZXJDb21taXQoKTsKKyAgICB2b2lkIGJsaXRWaXNpYmxlQ29u
dGVudHMoKTsKKyNlbmRpZgorCisgICAgYm9vbCBkaXNwYXRjaFRvdWNoRXZlbnRUb0Z1bGxTY3Jl
ZW5QbHVnaW4oV2ViQ29yZTo6UGx1Z2luVmlldyosIGNvbnN0IFBsYXRmb3JtOjpUb3VjaEV2ZW50
Jik7CisgICAgYm9vbCBkaXNwYXRjaFRvdWNoUG9pbnRBc01vdXNlRXZlbnRUb0Z1bGxTY3JlZW5Q
bHVnaW4oV2ViQ29yZTo6UGx1Z2luVmlldyosIGNvbnN0IFBsYXRmb3JtOjpUb3VjaFBvaW50Jik7
CisgICAgYm9vbCBkaXNwYXRjaE1vdXNlRXZlbnRUb0Z1bGxTY3JlZW5QbHVnaW4oV2ViQ29yZTo6
UGx1Z2luVmlldyosIGNvbnN0IFBsYXRmb3JtOjpNb3VzZUV2ZW50Jik7CisKKyAgICBCYWNraW5n
U3RvcmVDbGllbnQqIGJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKGNvbnN0IFdlYkNvcmU6OkZy
YW1lKikgY29uc3Q7CisgICAgdm9pZCBhZGRCYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZShjb25z
dCBXZWJDb3JlOjpGcmFtZSosIEJhY2tpbmdTdG9yZUNsaWVudCopOworICAgIHZvaWQgcmVtb3Zl
QmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUoY29uc3QgV2ViQ29yZTo6RnJhbWUqKTsKKworICAg
IC8vIENsZWFuIHVwIGFueSBkb2N1bWVudCByZWxhdGVkIGRhdGEgd2UgbWlnaHQgYmUgaG9sZGlu
Zy4KKyAgICB2b2lkIGNsZWFyRG9jdW1lbnREYXRhKGNvbnN0IFdlYkNvcmU6OkRvY3VtZW50Kik7
CisKKyAgICBzdGF0aWMgV2ViQ29yZTo6UmVuZGVyTGF5ZXIqIGVuY2xvc2luZ1Bvc2l0aW9uZWRB
bmNlc3Rvck9yU2VsZklmUG9zaXRpb25lZChXZWJDb3JlOjpSZW5kZXJMYXllciopOworICAgIHN0
YXRpYyBXZWJDb3JlOjpSZW5kZXJMYXllciogZW5jbG9zaW5nRml4ZWRQb3NpdGlvbmVkQW5jZXN0
b3JPclNlbGZJZkZpeGVkUG9zaXRpb25lZChXZWJDb3JlOjpSZW5kZXJMYXllciopOworCisgICAg
c3RhdGljIFdlYkNvcmU6OkludFNpemUgZGVmYXVsdE1heExheW91dFNpemUoKTsKKworICAgIFdl
YlBhZ2UqIG1fd2ViUGFnZTsKKyAgICBXZWJQYWdlQ2xpZW50KiBtX2NsaWVudDsKKyAgICBXZWJD
b3JlOjpQYWdlKiBtX3BhZ2U7CisgICAgV2ViQ29yZTo6RnJhbWUqIG1fbWFpbkZyYW1lOworICAg
IFJlZlB0cjxXZWJDb3JlOjpOb2RlPiBtX2N1cnJlbnRDb250ZXh0Tm9kZTsKKyAgICBXZWJTZXR0
aW5ncyogbV93ZWJTZXR0aW5nczsKKworI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQor
ICAgIE93blB0cjxXZWJDb3JlOjpKYXZhU2NyaXB0RGVidWdnZXJCbGFja0JlcnJ5PiBtX3Njcmlw
dERlYnVnZ2VyOworI2VuZGlmCisKKyAgICBib29sIG1fdmlzaWJsZTsKKyAgICBib29sIG1fc2hv
dWxkUmVzZXRUaWxlc1doZW5TaG93bjsKKyAgICBzdGF0aWMgVmVjdG9yPFdlYlBhZ2UqPiogc192
aXNpYmxlV2ViUGFnZXM7CisgICAgYm9vbCBtX3VzZXJTY2FsYWJsZTsKKyAgICBib29sIG1fdXNl
clBlcmZvcm1lZE1hbnVhbFpvb207CisgICAgYm9vbCBtX3VzZXJQZXJmb3JtZWRNYW51YWxTY3Jv
bGw7CisgICAgYm9vbCBtX2NvbnRlbnRzU2l6ZUNoYW5nZWQ7CisgICAgYm9vbCBtX292ZXJmbG93
RXhjZWVkc0NvbnRlbnRzU2l6ZTsKKyAgICBib29sIG1fcmVzZXRWaXJ0dWFsVmlld3BvcnRPbkNv
bW1pdHRlZDsKKyAgICBib29sIG1fc2hvdWxkVXNlRml4ZWREZXNrdG9wTW9kZTsKKyAgICBib29s
IG1fbmVlZFRvdWNoRXZlbnRzOworICAgIGludCBtX3ByZXZlbnRJZGxlRGltbWluZ0NvdW50Owor
CisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyAgICBib29sIG1fcHJldmVudERlZmF1bHRPblRv
dWNoU3RhcnQ7CisjZW5kaWYKKyAgICB1bnNpZ25lZCBtX25lc3RlZExheW91dEZpbmlzaGVkQ291
bnQ7CisgICAgV2ViQ29yZTo6SW50U2l6ZSBtX3ByZXZpb3VzQ29udGVudHNTaXplOworICAgIGlu
dCBtX2FjdHVhbFZpc2libGVXaWR0aDsKKyAgICBpbnQgbV9hY3R1YWxWaXNpYmxlSGVpZ2h0Owor
ICAgIGludCBtX3ZpcnR1YWxWaWV3cG9ydFdpZHRoOworICAgIGludCBtX3ZpcnR1YWxWaWV3cG9y
dEhlaWdodDsKKyAgICBXZWJDb3JlOjpJbnRTaXplIG1fZGVmYXVsdExheW91dFNpemU7CisgICAg
V2ViQ29yZTo6Vmlld3BvcnRBcmd1bWVudHMgbV92aWV3cG9ydEFyZ3VtZW50czsgLy8gV2Uga2Vl
cCB0aGlzIGFyb3VuZCBzaW5jZSB3ZSBtYXkgbmVlZCB0byByZS1ldmFsdWF0ZSB0aGUgYXJndW1l
bnRzIG9uIHJvdGF0aW9uLgorICAgIGJvb2wgbV9kaWRSZXN0b3JlRnJvbVBhZ2VDYWNoZTsKKyAg
ICBWaWV3TW9kZSBtX3ZpZXdNb2RlOworICAgIExvYWRTdGF0ZSBtX2xvYWRTdGF0ZTsKKyAgICBX
ZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCogbV90cmFuc2Zvcm1hdGlvbk1hdHJpeDsKKyAg
ICBCYWNraW5nU3RvcmUqIG1fYmFja2luZ1N0b3JlOworICAgIEJhY2tpbmdTdG9yZUNsaWVudCog
bV9iYWNraW5nU3RvcmVDbGllbnQ7CisgICAgSW5QYWdlU2VhcmNoTWFuYWdlciogbV9pblBhZ2VT
ZWFyY2hNYW5hZ2VyOworICAgIElucHV0SGFuZGxlciogbV9pbnB1dEhhbmRsZXI7CisgICAgU2Vs
ZWN0aW9uSGFuZGxlciogbV9zZWxlY3Rpb25IYW5kbGVyOworICAgIFRvdWNoRXZlbnRIYW5kbGVy
KiBtX3RvdWNoRXZlbnRIYW5kbGVyOworCisjaWYgRU5BQkxFKEVWRU5UX01PREVfTUVUQVRBR1Mp
CisgICAgV2ViQ29yZTo6Q3Vyc29yRXZlbnRNb2RlIG1fY3Vyc29yRXZlbnRNb2RlOworICAgIFdl
YkNvcmU6OlRvdWNoRXZlbnRNb2RlIG1fdG91Y2hFdmVudE1vZGU7CisjZW5kaWYKKworICAgIFBs
YXRmb3JtOjpCbGFja0JlcnJ5Q3Vyc29yIG1fY3VycmVudEN1cnNvcjsKKworICAgIER1bXBSZW5k
ZXJUcmVlQ2xpZW50KiBtX2R1bXBSZW5kZXJUcmVlOworCisgICAgZG91YmxlIG1faW5pdGlhbFNj
YWxlOworICAgIGRvdWJsZSBtX21pbmltdW1TY2FsZTsKKyAgICBkb3VibGUgbV9tYXhpbXVtU2Nh
bGU7CisKKyAgICAvLyBCbG9jayB6b29tIGFuaW1hdGlvbiBkYXRhLgorICAgIFdlYkNvcmU6OkZs
b2F0UG9pbnQgbV9maW5hbEJsb2NrUG9pbnQ7CisgICAgV2ViQ29yZTo6RmxvYXRQb2ludCBtX2Zp
bmFsQmxvY2tQb2ludFJlZmxvd09mZnNldDsKKyAgICBkb3VibGUgbV9ibG9ja1pvb21GaW5hbFNj
YWxlOworICAgIFJlZlB0cjxXZWJDb3JlOjpOb2RlPiBtX2N1cnJlbnRQaW5jaFpvb21Ob2RlOwor
ICAgIFdlYkNvcmU6OkZsb2F0UG9pbnQgbV9hbmNob3JJbk5vZGVSZWN0UmF0aW87CisgICAgUmVm
UHRyPFdlYkNvcmU6Ok5vZGU+IG1fY3VycmVudEJsb2NrWm9vbU5vZGU7CisgICAgUmVmUHRyPFdl
YkNvcmU6Ok5vZGU+IG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZTsKKyAgICBib29sIG1f
c2hvdWxkUmVmbG93QmxvY2s7CisKKyAgICAvLyBEZWxheWVkIHpvb21BYm91dFBvaW50LgorICAg
IE93blB0cjxXZWJDb3JlOjpUaW1lcjxXZWJQYWdlUHJpdmF0ZT4gPiBtX2RlbGF5ZWRab29tVGlt
ZXI7CisgICAgc3RydWN0IHsKKyAgICAgICAgZG91YmxlIHNjYWxlOworICAgICAgICBXZWJDb3Jl
OjpGbG9hdFBvaW50IGFuY2hvcjsKKyAgICAgICAgYm9vbCBlbmZvcmNlU2NhbGVDbGFtcGluZzsK
KyAgICAgICAgYm9vbCBmb3JjZVJlbmRlcmluZzsKKyAgICB9IG1fZGVsYXllZFpvb21Bcmd1bWVu
dHM7CisKKyAgICBkb3VibGUgbV9sYXN0VXNlckV2ZW50VGltZXN0YW1wOyAvLyBVc2VkIHRvIGRl
dGVjdCB1c2VyIHNjcm9sbGluZy4KKworICAgIFdlYkNvcmU6OlBsYXRmb3JtTW91c2VFdmVudCBt
X2xhc3RNb3VzZUV2ZW50OworICAgIGJvb2wgbV9wbHVnaW5Nb3VzZUJ1dHRvblByZXNzZWQ7IC8v
IFVzZWQgdG8gdHJhY2sgbW91c2UgYnV0dG9uIGZvciBmdWxsIHNjcmVlbiBwbHVnaW5zLgorICAg
IGJvb2wgbV9wbHVnaW5NYXlPcGVuTmV3VGFiOworCisgICAgV2ViQ29yZTo6R2VvbG9jYXRpb25D
b250cm9sbGVyQ2xpZW50QmxhY2tCZXJyeSogbV9nZW9sb2NhdGlvbkNsaWVudDsKKworICAgIEhh
c2hTZXQ8V2ViQ29yZTo6UGx1Z2luVmlldyo+IG1fcGx1Z2luVmlld3M7CisKKyAgICBSZWZQdHI8
V2ViQ29yZTo6Tm9kZT4gbV9pblJlZ2lvblNjcm9sbFN0YXJ0aW5nTm9kZTsKKworI2lmIFVTRShB
Q0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBib29sIG1faXNBY2NlbGVyYXRlZENvbXBvc2l0
aW5nQWN0aXZlOworICAgIE93blB0cjxGcmFtZUxheWVycz4gbV9mcmFtZUxheWVyczsgLy8gV2Vi
S2l0IHRocmVhZCBvbmx5LgorICAgIE93blB0cjxXZWJQYWdlQ29tcG9zaXRvcj4gbV9jb21wb3Np
dG9yOyAvLyBDb21wb3NpdGluZyB0aHJlYWQgb25seS4KKyAgICBPd25QdHI8V2ViQ29yZTo6VGlt
ZXI8V2ViUGFnZVByaXZhdGU+ID4gbV9yb290TGF5ZXJDb21taXRUaW1lcjsKKyAgICBib29sIG1f
bmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbjsKKyAgICBib29sIG1fbmVlZHNDb21t
aXQ7CisgICAgYm9vbCBtX3N1c3BlbmRSb290TGF5ZXJDb21taXQ7CisjZW5kaWYKKworICAgIGlu
dCBtX3BlbmRpbmdPcmllbnRhdGlvbjsKKworICAgIFJlZlB0cjxXZWJDb3JlOjpOb2RlPiBtX2Z1
bGxzY3JlZW5WaWRlb05vZGU7CisgICAgUmVmUHRyPFdlYkNvcmU6OlBsdWdpblZpZXc+IG1fZnVs
bFNjcmVlblBsdWdpblZpZXc7CisgICAgQmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWVNYXAgbV9i
YWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZU1hcDsKKworICAgIC8vIFdlYlNldHRpbmdzRGVsZWdh
dGUgbWV0aG9kcy4KKyAgICB2aXJ0dWFsIHZvaWQgZGlkQ2hhbmdlU2V0dGluZ3MoV2ViU2V0dGlu
Z3MqKTsKKworICAgIFJlZlB0cjxXZWJDb3JlOjpET01XcmFwcGVyV29ybGQ+IG1faXNvbGF0ZWRX
b3JsZDsKKyAgICBib29sIG1faGFzSW5SZWdpb25TY3JvbGxhYmxlQXJlYXM7CisgICAgYm9vbCBt
X3VwZGF0ZURlbGVnYXRlZE92ZXJsYXlzRGlzcGF0Y2hlZDsKKworfTsKK30KK30KKworI2VuZGlm
IC8vIFdlYlBhZ2VfcF9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128258</attachid>
            <date>2012-02-22 12:01:02 -0800</date>
            <delta_ts>2012-02-22 15:32:39 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74380-20120222150034.patch</filename>
            <type>text/plain</type>
            <size>244554</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4NTA1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Js
YWNrYmVycnkvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0NoYW5nZUxvZwpp
bmRleCBmNDVjMjAzMGIyZGU2ZjlhZDliYzVhMDUyNjJjYWY1MzhjNjAzZGIzLi41MDg0MjI2YjM3
NWJjOTgyOWNjMDMwZTc4NmUzYTU1NWExZmU0OWJhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
L2JsYWNrYmVycnkvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9DaGFu
Z2VMb2cKQEAgLTEsMyArMSwxNiBAQAorMjAxMi0wMi0yMiAgSmFja3kgSmlhbmcgIDx6aGFqaWFu
Z0ByaW0uY29tPgorCisgICAgICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBCbGFja0JlcnJ5IEFQ
SSB3ZWIgcGFnZSByZWxhdGVkIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD03NDM4MAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KKworICAgICAg
ICAqIEFwaS9XZWJQYWdlLmNwcDogQWRkZWQuCisgICAgICAgICogQXBpL1dlYlBhZ2UuaDogQWRk
ZWQuCisgICAgICAgICogQXBpL1dlYlBhZ2VfcC5oOiBBZGRlZC4KKwogMjAxMi0wMi0yMiAgUnlv
c3VrZSBOaXdhICA8cm5pd2FAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZW1vdmUgdGhlIHJlbWFp
bmluZyB1c2VzIG9mIENTU1N0eWxlRGVjbGFyYXRpb24gaW4gRWRpdG9yCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQXBpL1dlYlBhZ2UuY3BwIGIvU291cmNlL1dlYktpdC9i
bGFja2JlcnJ5L0FwaS9XZWJQYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wM2FlMWVkMzI2MDJiNjgwY2E3
NWJkYmU0YzcyMTBmYWJmOGQ2NWRlCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9i
bGFja2JlcnJ5L0FwaS9XZWJQYWdlLmNwcApAQCAtMCwwICsxLDU2MzggQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0
ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUg
RnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIldlYlBhZ2UuaCIKKworI2luY2x1ZGUgIkFwcGxpY2F0aW9u
Q2FjaGVTdG9yYWdlLmgiCisjaW5jbHVkZSAiQmFja0ZvcndhcmRDb250cm9sbGVyLmgiCisjaW5j
bHVkZSAiQmFja0ZvcndhcmRMaXN0SW1wbC5oIgorI2luY2x1ZGUgIkJhY2tpbmdTdG9yZUNsaWVu
dC5oIgorI2luY2x1ZGUgIkJhY2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZS5oIgorI2luY2x1
ZGUgIkJhY2tpbmdTdG9yZV9wLmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIkNh
Y2hlZEltYWdlLmgiCisjaW5jbHVkZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAiQ2hyb21lQ2xpZW50
QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51Q2xpZW50QmxhY2tCZXJyeS5oIgor
I2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJET01TdXBwb3J0LmgiCisjaW5j
bHVkZSAiRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJEYXRhYmFzZVN5bmMuaCIKKyNpbmNsdWRlICJE
YXRhYmFzZVRyYWNrZXIuaCIKKyNpbmNsdWRlICJEZXZpY2VNb3Rpb25DbGllbnRCbGFja0JlcnJ5
LmgiCisjaW5jbHVkZSAiRGV2aWNlT3JpZW50YXRpb25DbGllbnRCbGFja0JlcnJ5LmgiCisjaW5j
bHVkZSAiRHJhZ0NsaWVudEJsYWNrQmVycnkuaCIKKy8vIEZJWE1FOiBXZSBzaG91bGQgYmUgdXNp
bmcgRHVtcFJlbmRlclRyZWVDbGllbnQsIGJ1dCBJJ20gbm90IHN1cmUgd2hlcmUgd2Ugc2hvdWxk
CisvLyBjcmVhdGUgdGhlIERSVF9CQiBvYmplY3QuIFNlZSBQUiAjMTIwMzU1LgorI2lmIEVOQUJM
RV9EUlQKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZUJsYWNrQmVycnkuaCIKKyNlbmRpZgorI2lu
Y2x1ZGUgIkVkaXRvckNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJGb2N1c0NvbnRyb2xs
ZXIuaCIKKyNpbmNsdWRlICJGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuaCIKKyNpZiBFTkFC
TEUoQ0xJRU5UX0JBU0VEX0dFT0xPQ0FUSU9OKQorI2lmIEVOQUJMRV9EUlQKKyNpbmNsdWRlICJH
ZW9sb2NhdGlvbkNsaWVudE1vY2suaCIKKyNlbmRpZgorI2luY2x1ZGUgIkdlb2xvY2F0aW9uQ29u
dHJvbGxlckNsaWVudEJsYWNrQmVycnkuaCIKKyNlbmRpZgorI2luY2x1ZGUgIkdyb3VwU2V0dGlu
Z3MuaCIKKyNpbmNsdWRlICJIVE1MQXJlYUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MRnJhbWVP
d25lckVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MSW1hZ2VFbGVtZW50LmgiCisjaW5jbHVkZSAi
SFRNTElucHV0RWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhU
TUxQYXJzZXJJZGlvbXMuaCIKKyNpbmNsdWRlICJIVFRQUGFyc2Vycy5oIgorI2luY2x1ZGUgIkhp
c3RvcnlJdGVtLmgiCisjaW5jbHVkZSAiSWNvbkRhdGFiYXNlQ2xpZW50QmxhY2tCZXJyeS5oIgor
I2luY2x1ZGUgIkluUGFnZVNlYXJjaE1hbmFnZXIuaCIKKyNpbmNsdWRlICJJblJlZ2lvblNjcm9s
bGFibGVBcmVhLmgiCisjaW5jbHVkZSAiSW5wdXRIYW5kbGVyLmgiCisjaW5jbHVkZSAiSW5zcGVj
dG9yQmFja2VuZERpc3BhdGNoZXIuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDbGllbnRCbGFja0Jl
cnJ5LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkphdmFT
Y3JpcHREZWJ1Z2dlckJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJMYXllcldlYktpdFRocmVhZC5o
IgorI2luY2x1ZGUgIk5ldHdvcmtNYW5hZ2VyLmgiCisjaW5jbHVkZSAiTm9kZVJlbmRlclN0eWxl
LmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBhZ2VDYWNoZS5oIgorI2luY2x1ZGUg
IlBhZ2VHcm91cC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtVG91Y2hFdmVudC5oIgorI2luY2x1ZGUg
IlBsYXRmb3JtV2hlZWxFdmVudC5oIgorI2luY2x1ZGUgIlBsdWdpbkRhdGFiYXNlLmgiCisjaW5j
bHVkZSAiUGx1Z2luVmlldy5oIgorI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKKyNpbmNsdWRlICJS
ZW5kZXJUaGVtZUJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJSZW5kZXJUcmVlQXNUZXh0LmgiCisj
aW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlJlbmRlcldpZGdldC5oIgorI2luY2x1
ZGUgIlNjcmlwdFNvdXJjZUNvZGUuaCIKKyNpbmNsdWRlICJTY3JpcHRWYWx1ZS5oIgorI2luY2x1
ZGUgIlNjcm9sbFR5cGVzLmgiCisjaW5jbHVkZSAiU2VsZWN0aW9uSGFuZGxlci5oIgorI2luY2x1
ZGUgIlNldHRpbmdzLmgiCisjaW5jbHVkZSAiU3RvcmFnZS5oIgorI2luY2x1ZGUgIlN0b3JhZ2VO
YW1lc3BhY2UuaCIKKyNpbmNsdWRlICJTdXJmYWNlUG9vbC5oIgorI2luY2x1ZGUgIlRleHQuaCIK
KyNpbmNsdWRlICJUaHJlYWRDaGVjay5oIgorI2luY2x1ZGUgIlRvdWNoRXZlbnRIYW5kbGVyLmgi
CisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRlICJWaXNpYmxlUG9z
aXRpb24uaCIKKyNpZiBFTkFCTEUoV0VCRE9NKQorI2luY2x1ZGUgIldlYkRPTURvY3VtZW50Lmgi
CisjZW5kaWYKKyNpbmNsdWRlICJXZWJQYWdlQ2xpZW50LmgiCisjaW5jbHVkZSAiV2ViU29ja2V0
LmgiCisjaW5jbHVkZSAibnBhcGkuaCIKKyNpbmNsdWRlICJydW50aW1lX3Jvb3QuaCIKKworI2lm
IEVOQUJMRShWSURFTykKKyNpbmNsdWRlICJIVE1MTWVkaWFFbGVtZW50LmgiCisjaW5jbHVkZSAi
TWVkaWFQbGF5ZXIuaCIKKyNpbmNsdWRlICJNZWRpYVBsYXllclByaXZhdGVCbGFja0JlcnJ5Lmgi
CisjZW5kaWYKKworI2lmIFVTRShTS0lBKQorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEu
aCIKKyNlbmRpZgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2luY2x1ZGUg
IkZyYW1lTGF5ZXJzLmgiCisjaW5jbHVkZSAiV2ViUGFnZUNvbXBvc2l0b3IuaCIKKyNlbmRpZgor
CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtRXhlY3V0YWJsZU1lc3NhZ2UuaD4KKyNpbmNs
dWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1JVFBvbGljeS5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQ
bGF0Zm9ybUtleWJvYXJkRXZlbnQuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1NZXNz
YWdlQ2xpZW50Lmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTW91c2VFdmVudC5oPgor
I2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVNjcmVlbi5oPgorI2luY2x1ZGUgPEJsYWNrQmVy
cnlQbGF0Zm9ybVNldHRpbmdzLmg+CisjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvQVBJQ2FzdC5o
PgorI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pTQ29udGV4dFJlZi5oPgorI2luY2x1ZGUgPFNo
YXJlZFBvaW50ZXIuaD4KKyNpbmNsdWRlIDxzeXMva2V5Y29kZXMuaD4KKyNpbmNsdWRlIDx1bmlj
b2RlL3VzdHJpbmcuaD4gLy8gcGxhdGZvcm0gSUNVCisKKyNpZm5kZWYgVVNFUl9QUk9DRVNTRVMK
KyNpbmNsdWRlIDxtZW1hbGxvYy5oPgorI2VuZGlmCisKKyNpZiBFTkFCTEUoU0tJQV9HUFVfQ0FO
VkFTKQorI2luY2x1ZGUgIkJsYWNrQmVycnlQbGF0Zm9ybUdyYXBoaWNzLmgiCisjaW5jbHVkZSAi
R3JDb250ZXh0LmgiCisjZW5kaWYKKworI2RlZmluZSBERUJVR19CTE9DS19aT09NIDAKKyNkZWZp
bmUgREVCVUdfVE9VQ0hfRVZFTlRTIDAKKyNkZWZpbmUgREVCVUdfV0VCUEFHRV9MT0FEIDAKKwor
dXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCit0eXBlZGVm
IGNvbnN0IHVuc2lnbmVkIHNob3J0KiBDVVNob3J0UHRyOworCituYW1lc3BhY2UgQmxhY2tCZXJy
eSB7CituYW1lc3BhY2UgV2ViS2l0IHsKKworVmVjdG9yPFdlYlBhZ2UqPiogV2ViUGFnZVByaXZh
dGU6OnNfdmlzaWJsZVdlYlBhZ2VzID0gMDsgLy8gSW5pdGlhbGx5LCBubyB3ZWIgcGFnZSBpcyB2
aXNpYmxlLgorCitzdGF0aWMgVmVjdG9yPFdlYlBhZ2UqPiogdmlzaWJsZVdlYlBhZ2VzKCkKK3sK
KyAgICBpZiAoIVdlYlBhZ2VQcml2YXRlOjpzX3Zpc2libGVXZWJQYWdlcykKKyAgICAgICAgV2Vi
UGFnZVByaXZhdGU6OnNfdmlzaWJsZVdlYlBhZ2VzID0gbmV3IFZlY3RvcjxXZWJQYWdlKj47Cisg
ICAgcmV0dXJuIFdlYlBhZ2VQcml2YXRlOjpzX3Zpc2libGVXZWJQYWdlczsKK30KKworY29uc3Qg
dW5zaWduZWQgYmxvY2tab29tTWFyZ2luID0gMzsgLy8gQWRkIDMgcGl4ZWwgbWFyZ2luIG9uIGVh
Y2ggc2lkZS4KK3N0YXRpYyBpbnQgYmxvY2tDbGlja1JhZGl1cyA9IDA7CitzdGF0aWMgZG91Ymxl
IG1heGltdW1CbG9ja1pvb21TY2FsZSA9IDMuMDsgLy8gVGhpcyBzY2FsZSBjYW4gYmUgY2xhbXBl
ZCBieSB0aGUgbWF4aW11bVNjYWxlIHNldCBmb3IgdGhlIHBhZ2UuCisKK2NvbnN0IGRvdWJsZSBt
YW51YWxTY3JvbGxJbnRlcnZhbCA9IDAuMTsgLy8gVGhlIHRpbWUgaW50ZXJ2YWwgZHVyaW5nIHdo
aWNoIHdlIGFzc29jaWF0ZSB1c2VyIGFjdGlvbiB3aXRoIHNjcm9sbGluZy4KKworY29uc3QgZG91
YmxlIGRlbGF5ZWRab29tSW50ZXJ2YWwgPSAwLjA7CisKK2NvbnN0IEludFNpemUgbWluaW11bUxh
eW91dFNpemUoMTAsIDEwKTsgLy8gTmVlZHMgdG8gYmUgYSBzbWFsbCBzaXplLCBncmVhdGVyIHRo
YW4gMCwgdGhhdCB3ZSBjYW4gZ3JvdyB0aGUgbGF5b3V0IGZyb20uCitjb25zdCBJbnRTaXplIG1h
eGltdW1MYXlvdXRTaXplKDEwMDAwLCAxMDAwMCk7IC8vIFVzZWQgd2l0aCB2aWV3cG9ydCBtZXRh
IHRhZywgYnV0IHdlIGNhbiBzdGlsbCBncm93IGZyb20gdGhpcyBvZiBjb3Vyc2UuCisKK2NvbnN0
IGRvdWJsZSBtaW5pbXVtRXhwYW5kaW5nUmF0aW8gPSAwLjE1OworCisvLyBIZWxwZXIgZnVuY3Rp
b24gdG8gcGFyc2UgYSBVUkwgYW5kIGZpbGwgaW4gbWlzc2luZyBwYXJ0cy4KK3N0YXRpYyBLVVJM
IHBhcnNlVXJsKGNvbnN0IFN0cmluZyYgdXJsKQoreworICAgIFN0cmluZyB1cmxTdHJpbmcodXJs
KTsKKyAgICBLVVJMIGt1cmwgPSBLVVJMKEtVUkwoKSwgdXJsU3RyaW5nKTsKKyAgICBpZiAoa3Vy
bC5wcm90b2NvbCgpLmlzRW1wdHkoKSkgeworICAgICAgICB1cmxTdHJpbmcuaW5zZXJ0KCJodHRw
Oi8vIiwgMCk7CisgICAgICAgIGt1cmwgPSBLVVJMKEtVUkwoKSwgdXJsU3RyaW5nKTsKKyAgICB9
CisKKyAgICByZXR1cm4ga3VybDsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9ucyB0byBjb252ZXJ0
IHRvIGFuZCBmcm9tIFdlYkNvcmUgdHlwZXMuCitzdGF0aWMgaW5saW5lIE1vdXNlRXZlbnRUeXBl
IHRvV2ViQ29yZU1vdXNlRXZlbnRUeXBlKGNvbnN0IFBsYXRmb3JtOjpNb3VzZUV2ZW50OjpUeXBl
IHR5cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBQbGF0Zm9ybTo6TW91c2VF
dmVudDo6TW91c2VCdXR0b25Eb3duOgorICAgICAgICByZXR1cm4gTW91c2VFdmVudFByZXNzZWQ7
CisgICAgY2FzZSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6TW91c2VCdXR0b25VcDoKKyAgICAgICAg
cmV0dXJuIE1vdXNlRXZlbnRSZWxlYXNlZDsKKyAgICBjYXNlIFBsYXRmb3JtOjpNb3VzZUV2ZW50
OjpNb3VzZU1vdmU6CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE1vdXNlRXZlbnRNb3Zl
ZDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgUmVzb3VyY2VSZXF1ZXN0Q2FjaGVQb2xpY3kg
dG9XZWJDb3JlQ2FjaGVQb2xpY3koUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpDYWNoZVBvbGlj
eSBwb2xpY3kpCit7CisgICAgc3dpdGNoIChwb2xpY3kpIHsKKyAgICBjYXNlIFBsYXRmb3JtOjpO
ZXR3b3JrUmVxdWVzdDo6VXNlUHJvdG9jb2xDYWNoZVBvbGljeToKKyAgICAgICAgcmV0dXJuIFVz
ZVByb3RvY29sQ2FjaGVQb2xpY3k7CisgICAgY2FzZSBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6
OlJlbG9hZElnbm9yaW5nQ2FjaGVEYXRhOgorICAgICAgICByZXR1cm4gUmVsb2FkSWdub3JpbmdD
YWNoZURhdGE7CisgICAgY2FzZSBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OlJldHVybkNhY2hl
RGF0YUVsc2VMb2FkOgorICAgICAgICByZXR1cm4gUmV0dXJuQ2FjaGVEYXRhRWxzZUxvYWQ7Cisg
ICAgY2FzZSBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OlJldHVybkNhY2hlRGF0YURvbnRMb2Fk
OgorICAgICAgICByZXR1cm4gUmV0dXJuQ2FjaGVEYXRhRG9udExvYWQ7CisgICAgZGVmYXVsdDoK
KyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBVc2VQcm90b2Nv
bENhY2hlUG9saWN5OworICAgIH0KK30KKworI2lmIEVOQUJMRShFVkVOVF9NT0RFX01FVEFUQUdT
KQorc3RhdGljIGlubGluZSBQbGF0Zm9ybTo6Q3Vyc29yRXZlbnRNb2RlIHRvUGxhdGZvcm1DdXJz
b3JFdmVudE1vZGUoQ3Vyc29yRXZlbnRNb2RlIG1vZGUpCit7CisgICAgc3dpdGNoIChtb2RlKSB7
CisgICAgY2FzZSBQcm9jZXNzZWRDdXJzb3JFdmVudHM6CisgICAgICAgIHJldHVybiBQbGF0Zm9y
bTo6UHJvY2Vzc2VkQ3Vyc29yRXZlbnRzOworICAgIGNhc2UgTmF0aXZlQ3Vyc29yRXZlbnRzOgor
ICAgICAgICByZXR1cm4gUGxhdGZvcm06Ok5hdGl2ZUN1cnNvckV2ZW50czsKKyAgICBkZWZhdWx0
OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIFBsYXRmb3Jt
OjpQcm9jZXNzZWRDdXJzb3JFdmVudHM7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIFBsYXRm
b3JtOjpUb3VjaEV2ZW50TW9kZSB0b1BsYXRmb3JtVG91Y2hFdmVudE1vZGUoVG91Y2hFdmVudE1v
ZGUgbW9kZSkKK3sKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIFByb2Nlc3NlZFRvdWNo
RXZlbnRzOgorICAgICAgICByZXR1cm4gUGxhdGZvcm06OlByb2Nlc3NlZFRvdWNoRXZlbnRzOwor
ICAgIGNhc2UgTmF0aXZlVG91Y2hFdmVudHM6CisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6TmF0
aXZlVG91Y2hFdmVudHM7CisgICAgY2FzZSBQdXJlVG91Y2hFdmVudHNXaXRoTW91c2VDb252ZXJz
aW9uOgorICAgICAgICByZXR1cm4gUGxhdGZvcm06OlB1cmVUb3VjaEV2ZW50c1dpdGhNb3VzZUNv
bnZlcnNpb247CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgICAgIHJldHVybiBQbGF0Zm9ybTo6UHJvY2Vzc2VkVG91Y2hFdmVudHM7CisgICAgfQorfQor
I2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgSGlzdG9yeUl0ZW0qIGhpc3RvcnlJdGVtRnJvbUJhY2tG
b3J3YXJkSWQoV2ViUGFnZTo6QmFja0ZvcndhcmRJZCBpZCkKK3sKKyAgICByZXR1cm4gcmVpbnRl
cnByZXRfY2FzdDxIaXN0b3J5SXRlbSo+KGlkKTsKK30KKworc3RhdGljIGlubGluZSBXZWJQYWdl
OjpCYWNrRm9yd2FyZElkIGJhY2tGb3J3YXJkSWRGcm9tSGlzdG9yeUl0ZW0oSGlzdG9yeUl0ZW0q
IGl0ZW0pCit7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8V2ViUGFnZTo6QmFja0Zvcndh
cmRJZD4oaXRlbSk7Cit9CisKK1dlYlBhZ2VQcml2YXRlOjpXZWJQYWdlUHJpdmF0ZShXZWJQYWdl
KiB3ZWJQYWdlLCBXZWJQYWdlQ2xpZW50KiBjbGllbnQsIGNvbnN0IEludFJlY3QmIHJlY3QpCisg
ICAgOiBtX3dlYlBhZ2Uod2ViUGFnZSkKKyAgICAsIG1fY2xpZW50KGNsaWVudCkKKyAgICAsIG1f
cGFnZSgwKSAvLyBJbml0aWFsaXplZCBieSBpbml0LgorICAgICwgbV9tYWluRnJhbWUoMCkgLy8g
SW5pdGlhbGl6ZWQgYnkgaW5pdC4KKyAgICAsIG1fY3VycmVudENvbnRleHROb2RlKDApCisgICAg
LCBtX3dlYlNldHRpbmdzKDApIC8vIEluaXRpYWxpemVkIGJ5IGluaXQuCisgICAgLCBtX3Zpc2li
bGUoZmFsc2UpCisgICAgLCBtX3Nob3VsZFJlc2V0VGlsZXNXaGVuU2hvd24oZmFsc2UpCisgICAg
LCBtX3VzZXJTY2FsYWJsZSh0cnVlKQorICAgICwgbV91c2VyUGVyZm9ybWVkTWFudWFsWm9vbShm
YWxzZSkKKyAgICAsIG1fdXNlclBlcmZvcm1lZE1hbnVhbFNjcm9sbChmYWxzZSkKKyAgICAsIG1f
Y29udGVudHNTaXplQ2hhbmdlZChmYWxzZSkKKyAgICAsIG1fb3ZlcmZsb3dFeGNlZWRzQ29udGVu
dHNTaXplKGZhbHNlKQorICAgICwgbV9yZXNldFZpcnR1YWxWaWV3cG9ydE9uQ29tbWl0dGVkKHRy
dWUpCisgICAgLCBtX3Nob3VsZFVzZUZpeGVkRGVza3RvcE1vZGUoZmFsc2UpCisgICAgLCBtX25l
ZWRUb3VjaEV2ZW50cyhmYWxzZSkKKyAgICAsIG1fcHJldmVudElkbGVEaW1taW5nQ291bnQoMCkK
KyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorICAgICwgbV9wcmV2ZW50RGVmYXVsdE9uVG91Y2hT
dGFydChmYWxzZSkKKyNlbmRpZgorICAgICwgbV9uZXN0ZWRMYXlvdXRGaW5pc2hlZENvdW50KDAp
CisgICAgLCBtX2FjdHVhbFZpc2libGVXaWR0aChyZWN0LndpZHRoKCkpCisgICAgLCBtX2FjdHVh
bFZpc2libGVIZWlnaHQocmVjdC5oZWlnaHQoKSkKKyAgICAsIG1fdmlydHVhbFZpZXdwb3J0V2lk
dGgoMCkKKyAgICAsIG1fdmlydHVhbFZpZXdwb3J0SGVpZ2h0KDApCisgICAgLCBtX2RlZmF1bHRM
YXlvdXRTaXplKG1pbmltdW1MYXlvdXRTaXplKQorICAgICwgbV9kaWRSZXN0b3JlRnJvbVBhZ2VD
YWNoZShmYWxzZSkKKyAgICAsIG1fdmlld01vZGUoV2ViUGFnZVByaXZhdGU6OkRlc2t0b3ApIC8v
IERlZmF1bHQgdG8gRGVza3RvcCBtb2RlIGZvciBQQi4KKyAgICAsIG1fbG9hZFN0YXRlKFdlYlBh
Z2VQcml2YXRlOjpOb25lKQorICAgICwgbV90cmFuc2Zvcm1hdGlvbk1hdHJpeChuZXcgVHJhbnNm
b3JtYXRpb25NYXRyaXgoKSkKKyAgICAsIG1fYmFja2luZ1N0b3JlKDApIC8vIEluaXRpYWxpemVk
IGJ5IGluaXQuCisgICAgLCBtX2JhY2tpbmdTdG9yZUNsaWVudCgwKSAvLyBJbml0aWFsaXplZCBi
eSBpbml0LgorICAgICwgbV9pblBhZ2VTZWFyY2hNYW5hZ2VyKG5ldyBJblBhZ2VTZWFyY2hNYW5h
Z2VyKHRoaXMpKQorICAgICwgbV9pbnB1dEhhbmRsZXIobmV3IElucHV0SGFuZGxlcih0aGlzKSkK
KyAgICAsIG1fc2VsZWN0aW9uSGFuZGxlcihuZXcgU2VsZWN0aW9uSGFuZGxlcih0aGlzKSkKKyAg
ICAsIG1fdG91Y2hFdmVudEhhbmRsZXIobmV3IFRvdWNoRXZlbnRIYW5kbGVyKHRoaXMpKQorI2lm
IEVOQUJMRShFVkVOVF9NT0RFX01FVEFUQUdTKQorICAgICwgbV9jdXJzb3JFdmVudE1vZGUoUHJv
Y2Vzc2VkQ3Vyc29yRXZlbnRzKQorICAgICwgbV90b3VjaEV2ZW50TW9kZShQcm9jZXNzZWRUb3Vj
aEV2ZW50cykKKyNlbmRpZgorICAgICwgbV9jdXJyZW50Q3Vyc29yKFBsYXRmb3JtOjpDdXJzb3JO
b25lKQorICAgICwgbV9kdW1wUmVuZGVyVHJlZSgwKSAvLyBMYXp5IGluaXRpYWxpemF0aW9uLgor
ICAgICwgbV9pbml0aWFsU2NhbGUoLTEuMCkKKyAgICAsIG1fbWluaW11bVNjYWxlKC0xLjApCisg
ICAgLCBtX21heGltdW1TY2FsZSgtMS4wKQorICAgICwgbV9ibG9ja1pvb21GaW5hbFNjYWxlKDEu
MCkKKyAgICAsIG1fYW5jaG9ySW5Ob2RlUmVjdFJhdGlvKC0xLCAtMSkKKyAgICAsIG1fY3VycmVu
dEJsb2NrWm9vbU5vZGUoMCkKKyAgICAsIG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZSgw
KQorICAgICwgbV9zaG91bGRSZWZsb3dCbG9jayhmYWxzZSkKKyAgICAsIG1fZGVsYXllZFpvb21U
aW1lcihhZG9wdFB0cihuZXcgVGltZXI8V2ViUGFnZVByaXZhdGU+KHRoaXMsICZXZWJQYWdlUHJp
dmF0ZTo6em9vbUFib3V0UG9pbnRUaW1lckZpcmVkKSkpCisgICAgLCBtX2xhc3RVc2VyRXZlbnRU
aW1lc3RhbXAoMC4wKQorICAgICwgbV9wbHVnaW5Nb3VzZUJ1dHRvblByZXNzZWQoZmFsc2UpCisg
ICAgLCBtX3BsdWdpbk1heU9wZW5OZXdUYWIoZmFsc2UpCisgICAgLCBtX2dlb2xvY2F0aW9uQ2xp
ZW50KDApCisgICAgLCBtX2luUmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2RlKDApCisjaWYgVVNFKEFD
Q0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgICwgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmdB
Y3RpdmUoZmFsc2UpCisgICAgLCBtX3Jvb3RMYXllckNvbW1pdFRpbWVyKGFkb3B0UHRyKG5ldyBU
aW1lcjxXZWJQYWdlUHJpdmF0ZT4odGhpcywgJldlYlBhZ2VQcml2YXRlOjpyb290TGF5ZXJDb21t
aXRUaW1lckZpcmVkKSkpCisgICAgLCBtX25lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRp
b24oZmFsc2UpCisgICAgLCBtX25lZWRzQ29tbWl0KGZhbHNlKQorICAgICwgbV9zdXNwZW5kUm9v
dExheWVyQ29tbWl0KGZhbHNlKQorI2VuZGlmCisgICAgLCBtX3BlbmRpbmdPcmllbnRhdGlvbigt
MSkKKyAgICAsIG1fZnVsbHNjcmVlblZpZGVvTm9kZSgwKQorICAgICwgbV9oYXNJblJlZ2lvblNj
cm9sbGFibGVBcmVhcyhmYWxzZSkKKyAgICAsIG1fdXBkYXRlRGVsZWdhdGVkT3ZlcmxheXNEaXNw
YXRjaGVkKGZhbHNlKQoreworfQorCitXZWJQYWdlUHJpdmF0ZTo6fldlYlBhZ2VQcml2YXRlKCkK
K3sKKyAgICAvLyBIYW5kIHRoZSBiYWNraW5nc3RvcmUgYmFjayB0byBhbm90aGVyIG93bmVyIGlm
IG5lY2Vzc2FyeS4KKyAgICBtX3dlYlBhZ2UtPnNldFZpc2libGUoZmFsc2UpOworICAgIGlmIChC
YWNraW5nU3RvcmVQcml2YXRlOjpjdXJyZW50QmFja2luZ1N0b3JlT3duZXIoKSA9PSBtX3dlYlBh
Z2UpCisgICAgICAgIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNldEN1cnJlbnRCYWNraW5nU3RvcmVP
d25lcigwKTsKKworICAgIGRlbGV0ZSBtX3dlYlNldHRpbmdzOworICAgIG1fd2ViU2V0dGluZ3Mg
PSAwOworCisgICAgZGVsZXRlIG1fYmFja2luZ1N0b3JlQ2xpZW50OworICAgIG1fYmFja2luZ1N0
b3JlQ2xpZW50ID0gMDsKKyAgICBtX2JhY2tpbmdTdG9yZSA9IDA7CisKKyAgICBkZWxldGUgbV9w
YWdlOworICAgIG1fcGFnZSA9IDA7CisKKyAgICBkZWxldGUgbV90cmFuc2Zvcm1hdGlvbk1hdHJp
eDsKKyAgICBtX3RyYW5zZm9ybWF0aW9uTWF0cml4ID0gMDsKKworICAgIGRlbGV0ZSBtX2luUGFn
ZVNlYXJjaE1hbmFnZXI7CisgICAgbV9pblBhZ2VTZWFyY2hNYW5hZ2VyID0gMDsKKworICAgIGRl
bGV0ZSBtX3NlbGVjdGlvbkhhbmRsZXI7CisgICAgbV9zZWxlY3Rpb25IYW5kbGVyID0gMDsKKwor
ICAgIGRlbGV0ZSBtX2lucHV0SGFuZGxlcjsKKyAgICBtX2lucHV0SGFuZGxlciA9IDA7CisKKyAg
ICBkZWxldGUgbV90b3VjaEV2ZW50SGFuZGxlcjsKKyAgICBtX3RvdWNoRXZlbnRIYW5kbGVyID0g
MDsKKworI2lmIEVOQUJMRV9EUlQKKyAgICBkZWxldGUgbV9kdW1wUmVuZGVyVHJlZTsKKyAgICBt
X2R1bXBSZW5kZXJUcmVlID0gMDsKKyNlbmRpZgorfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpp
bml0KGNvbnN0IFdlYlN0cmluZyYgcGFnZUdyb3VwTmFtZSkKK3sKKyAgICBDaHJvbWVDbGllbnRC
bGFja0JlcnJ5KiBjaHJvbWVDbGllbnQgPSBuZXcgQ2hyb21lQ2xpZW50QmxhY2tCZXJyeSh0aGlz
KTsKKyAgICBDb250ZXh0TWVudUNsaWVudEJsYWNrQmVycnkqIGNvbnRleHRNZW51Q2xpZW50ID0g
MDsKKyNpZiBFTkFCTEUoQ09OVEVYVF9NRU5VUykKKyAgICBjb250ZXh0TWVudUNsaWVudCA9IG5l
dyBDb250ZXh0TWVudUNsaWVudEJsYWNrQmVycnkoKTsKKyNlbmRpZgorICAgIEVkaXRvckNsaWVu
dEJsYWNrQmVycnkqIGVkaXRvckNsaWVudCA9IG5ldyBFZGl0b3JDbGllbnRCbGFja0JlcnJ5KHRo
aXMpOworICAgIERyYWdDbGllbnRCbGFja0JlcnJ5KiBkcmFnQ2xpZW50ID0gMDsKKyNpZiBFTkFC
TEUoRFJBR19TVVBQT1JUKQorICAgIGRyYWdDbGllbnQgPSBuZXcgRHJhZ0NsaWVudEJsYWNrQmVy
cnkoKTsKKyNlbmRpZgorICAgIEluc3BlY3RvckNsaWVudEJsYWNrQmVycnkqIGluc3BlY3RvckNs
aWVudCA9IDA7CisjaWYgRU5BQkxFKElOU1BFQ1RPUikKKyAgICBpbnNwZWN0b3JDbGllbnQgPSBu
ZXcgSW5zcGVjdG9yQ2xpZW50QmxhY2tCZXJyeSh0aGlzKTsKKyNlbmRpZgorCisgICAgRnJhbWVM
b2FkZXJDbGllbnRCbGFja0JlcnJ5KiBmcmFtZUxvYWRlckNsaWVudCA9IG5ldyBGcmFtZUxvYWRl
ckNsaWVudEJsYWNrQmVycnkoKTsKKworICAgIFBhZ2U6OlBhZ2VDbGllbnRzIHBhZ2VDbGllbnRz
OworICAgIHBhZ2VDbGllbnRzLmNocm9tZUNsaWVudCA9IGNocm9tZUNsaWVudDsKKyAgICBwYWdl
Q2xpZW50cy5jb250ZXh0TWVudUNsaWVudCA9IGNvbnRleHRNZW51Q2xpZW50OworICAgIHBhZ2VD
bGllbnRzLmVkaXRvckNsaWVudCA9IGVkaXRvckNsaWVudDsKKyAgICBwYWdlQ2xpZW50cy5kcmFn
Q2xpZW50ID0gZHJhZ0NsaWVudDsKKyAgICBwYWdlQ2xpZW50cy5pbnNwZWN0b3JDbGllbnQgPSBp
bnNwZWN0b3JDbGllbnQ7CisKKyNpZiBFTkFCTEUoQ0xJRU5UX0JBU0VEX0dFT0xPQ0FUSU9OKQor
ICAgIC8vIE5vdGUgdGhlIG9iamVjdCB3aWxsIGJlIGRlc3Ryb3llZCB3aGVuIHRoZSBwYWdlIGlz
IGRlc3Ryb3llZC4KKyNpZiBFTkFCTEVfRFJUCisgICAgaWYgKGdldGVudigiZHJ0UnVuIikpCisg
ICAgICAgIHBhZ2VDbGllbnRzLmdlb2xvY2F0aW9uQ2xpZW50ID0gbmV3IEdlb2xvY2F0aW9uQ2xp
ZW50TW9jaygpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBwYWdlQ2xpZW50cy5nZW9sb2Nh
dGlvbkNsaWVudCA9IG1fZ2VvbG9jYXRpb25DbGllbnQgPSBuZXcgR2VvbG9jYXRpb25Db250cm9s
bGVyQ2xpZW50QmxhY2tCZXJyeSh0aGlzKTsKKyNlbHNlCisgICAgcGFnZUNsaWVudHMuZ2VvbG9j
YXRpb25DbGllbnQgPSBtX2dlb2xvY2F0aW9uQ2xpZW50OworI2VuZGlmCisKKyAgICBwYWdlQ2xp
ZW50cy5kZXZpY2VNb3Rpb25DbGllbnQgPSBuZXcgRGV2aWNlTW90aW9uQ2xpZW50QmxhY2tCZXJy
eSh0aGlzKTsKKyAgICBwYWdlQ2xpZW50cy5kZXZpY2VPcmllbnRhdGlvbkNsaWVudCA9IG5ldyBE
ZXZpY2VPcmllbnRhdGlvbkNsaWVudEJsYWNrQmVycnkodGhpcyk7CisgICAgbV9wYWdlID0gbmV3
IFBhZ2UocGFnZUNsaWVudHMpOworCisjaWYgRU5BQkxFKENMSUVOVF9CQVNFRF9HRU9MT0NBVElP
TikgJiYgRU5BQkxFX0RSVAorICAgIC8vIEluIGNhc2UgcnVubmluZyBpbiBEdW1wUmVuZGVyVHJl
ZSBtb2RlIHNldCB0aGUgY29udHJvbGxlciB0byBtb2NrIHByb3ZpZGVyLgorICAgIGlmIChnZXRl
bnYoImRydFJ1biIpKQorICAgICAgICBzdGF0aWNfY2FzdDxHZW9sb2NhdGlvbkNsaWVudE1vY2sq
PihwYWdlQ2xpZW50cy5nZW9sb2NhdGlvbkNsaWVudCktPnNldENvbnRyb2xsZXIobV9wYWdlLT5n
ZW9sb2NhdGlvbkNvbnRyb2xsZXIoKSk7CisjZW5kaWYKKworICAgIG1fcGFnZS0+c2V0Q3VzdG9t
SFRNTFRva2VuaXplckNodW5rU2l6ZSgyNTYpOworICAgIG1fcGFnZS0+c2V0Q3VzdG9tSFRNTFRv
a2VuaXplclRpbWVEZWxheSgwLjMwMCk7CisKKyAgICBtX3dlYlNldHRpbmdzID0gV2ViU2V0dGlu
Z3M6OmNyZWF0ZUZyb21TdGFuZGFyZFNldHRpbmdzKCk7CisKKyAgICAvLyBGSVhNRTogV2UgZXhw
bGljaXRseSBjYWxsIHNldERlbGVnYXRlKCkgaW5zdGVhZCBvZiBwYXNzaW5nIG91cnNlbGYgaW4g
Y3JlYXRlRnJvbVN0YW5kYXJkU2V0dGluZ3MoKQorICAgIC8vIHNvIHRoYXQgd2Ugb25seSBnZXQg
b25lIGRpZENoYW5nZVNldHRpbmdzKCkgY2FsbGJhY2sgd2hlbiB3ZSBzZXQgdGhlIHBhZ2UgZ3Jv
dXAgbmFtZS4gVGhpcyBjYXVzZXMgdXMKKyAgICAvLyB0byBtYWtlIGEgY29weSBvZiB0aGUgV2Vi
U2V0dGluZ3Mgc2luY2Ugc29tZSBXZWJTZXR0aW5ncyBtZXRob2QgbWFrZSB1c2Ugb2YgdGhlIHBh
Z2UgZ3JvdXAgbmFtZS4KKyAgICAvLyBJbnN0ZWFkLCB3ZSBzaG91bGRuJ3QgYmUgc3RvcmluZyB0
aGUgcGFnZSBncm91cCBuYW1lIGluIFdlYlNldHRpbmdzLgorICAgIG1fd2ViU2V0dGluZ3MtPnNl
dERlbGVnYXRlKHRoaXMpOworICAgIG1fd2ViU2V0dGluZ3MtPnNldFBhZ2VHcm91cE5hbWUocGFn
ZUdyb3VwTmFtZSk7CisKKyAgICBSZWZQdHI8RnJhbWU+IG5ld0ZyYW1lID0gRnJhbWU6OmNyZWF0
ZShtX3BhZ2UsIC8qIEhUTUxGcmFtZU93bmVyRWxlbWVudCogKi8gMCwgZnJhbWVMb2FkZXJDbGll
bnQpOworCisgICAgbV9tYWluRnJhbWUgPSBuZXdGcmFtZS5nZXQoKTsKKyAgICBmcmFtZUxvYWRl
ckNsaWVudC0+c2V0RnJhbWUobV9tYWluRnJhbWUsIHRoaXMpOworICAgIG1fbWFpbkZyYW1lLT5p
bml0KCk7CisKKyNpZiBFTkFCTEUoV0VCR0wpCisgICAgUGxhdGZvcm06OlNldHRpbmdzKiBzZXR0
aW5ncyA9IFBsYXRmb3JtOjpTZXR0aW5nczo6Z2V0KCk7CisgICAgbV9wYWdlLT5zZXR0aW5ncygp
LT5zZXRXZWJHTEVuYWJsZWQoc2V0dGluZ3MgJiYgc2V0dGluZ3MtPmlzV2ViR0xTdXBwb3J0ZWQo
KSk7CisjZW5kaWYKKyNpZiBFTkFCTEUoU0tJQV9HUFVfQ0FOVkFTKQorICAgIG1fcGFnZS0+c2V0
dGluZ3MoKS0+c2V0Q2FudmFzVXNlc0FjY2VsZXJhdGVkRHJhd2luZyh0cnVlKTsKKyAgICBtX3Bh
Z2UtPnNldHRpbmdzKCktPnNldEFjY2VsZXJhdGVkMmRDYW52YXNFbmFibGVkKHRydWUpOworI2Vu
ZGlmCisjaWYgRU5BQkxFKFZJRVdQT1JUX1JFRkxPVykKKyAgICBtX3BhZ2UtPnNldHRpbmdzKCkt
PnNldFRleHRSZWZsb3dFbmFibGVkKG1fd2ViU2V0dGluZ3MtPnRleHRSZWZsb3dNb2RlKCkgPT0g
V2ViU2V0dGluZ3M6OlRleHRSZWZsb3dFbmFibGVkKTsKKyNlbmRpZgorCisgICAgbV9wYWdlLT5z
ZXR0aW5ncygpLT5zZXRVc2VIaXhpZTc2V2ViU29ja2V0UHJvdG9jb2woZmFsc2UpOworICAgIG1f
cGFnZS0+c2V0dGluZ3MoKS0+c2V0SW50ZXJhY3RpdmVGb3JtVmFsaWRhdGlvbkVuYWJsZWQodHJ1
ZSk7CisgICAgbV9wYWdlLT5zZXR0aW5ncygpLT5zZXRBbGxvd1VuaXZlcnNhbEFjY2Vzc0Zyb21G
aWxlVVJMcyhmYWxzZSk7CisKKyAgICBtX2JhY2tpbmdTdG9yZUNsaWVudCA9IEJhY2tpbmdTdG9y
ZUNsaWVudDo6Y3JlYXRlKG1fbWFpbkZyYW1lLCAvKiBwYXJlbnQgZnJhbWUgKi8gMCwgbV93ZWJQ
YWdlKTsKKyAgICAvLyBUaGUgZGlyZWN0IGFjY2VzcyB0byBCYWNraW5nU3RvcmUgaXMgbGVmdCBo
ZXJlIGZvciBjb252ZW5pZW5jZSBzaW5jZSBpdAorICAgIC8vIGlzIG93bmVkIGJ5IEJhY2tpbmdT
dG9yZUNsaWVudCBhbmQgdGhlbiBkZWxldGVkIGJ5IGl0cyBkZXN0cnVjdG9yLgorICAgIG1fYmFj
a2luZ1N0b3JlID0gbV9iYWNraW5nU3RvcmVDbGllbnQtPmJhY2tpbmdTdG9yZSgpOworCisgICAg
bV9wYWdlLT5zZXR0aW5ncygpLT5zZXRTcGF0aWFsTmF2aWdhdGlvbkVuYWJsZWQobV93ZWJTZXR0
aW5ncy0+aXNTcGF0aWFsTmF2aWdhdGlvbkVuYWJsZWQoKSk7CisgICAgYmxvY2tDbGlja1JhZGl1
cyA9IGludChyb3VuZGYoMC4zNSAqIFBsYXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjpwaXhlbHNQ
ZXJJbmNoKDApLndpZHRoKCkpKTsgLy8gVGhlIGNsaWNrZWQgcmVjdGFuZ2xlIGFyZWEgc2hvdWxk
IGJlIGEgZml4ZWQgdW5pdCBvZiBtZWFzdXJlbWVudC4KKworICAgIG1fcGFnZS0+c2V0dGluZ3Mo
KS0+c2V0RGVsZWdhdGVTZWxlY3Rpb25QYWludCh0cnVlKTsKK30KKwordm9pZCBXZWJQYWdlUHJp
dmF0ZTo6bG9hZChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIqIG5ldHdvcmtUb2tlbiwgY29u
c3QgY2hhciogbWV0aG9kLCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkNhY2hlUG9saWN5IGNh
Y2hlUG9saWN5LCBjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgZGF0YUxlbmd0aCwgY29uc3QgY2hh
ciogY29uc3QqIGhlYWRlcnMsIHNpemVfdCBoZWFkZXJzTGVuZ3RoLCBib29sIGlzSW5pdGlhbCwg
Ym9vbCBtdXN0SGFuZGxlSW50ZXJuYWxseSwgYm9vbCBmb3JjZURvd25sb2FkLCBjb25zdCBjaGFy
KiBvdmVycmlkZUNvbnRlbnRUeXBlKQoreworICAgIHN0b3BDdXJyZW50TG9hZCgpOworCisgICAg
U3RyaW5nIHVybFN0cmluZyh1cmwpOworICAgIGlmICh1cmxTdHJpbmcuc3RhcnRzV2l0aCgidnM6
IiwgZmFsc2UpKSB7CisgICAgICAgIHVybFN0cmluZyA9IHVybFN0cmluZy5zdWJzdHJpbmcoMyk7
CisgICAgICAgIG1fbWFpbkZyYW1lLT5zZXRJblZpZXdTb3VyY2VNb2RlKHRydWUpOworICAgIH0g
ZWxzZQorICAgICAgICBtX21haW5GcmFtZS0+c2V0SW5WaWV3U291cmNlTW9kZShmYWxzZSk7CisK
KyAgICBLVVJMIGt1cmwgPSBwYXJzZVVybCh1cmxTdHJpbmcpOworICAgIGlmIChwcm90b2NvbElz
KGt1cmwsICJqYXZhc2NyaXB0IikpIHsKKyAgICAgICAgLy8gTmV2ZXIgcnVuIGphdmFzY3JpcHQg
d2hpbGUgbG9hZGluZyBpcyBkZWZlcnJlZC4KKyAgICAgICAgaWYgKG1fcGFnZS0+ZGVmZXJzTG9h
ZGluZygpKSB7CisgICAgICAgICAgICBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkqIGZyYW1l
TG9hZGVyQ2xpZW50ID0gc3RhdGljX2Nhc3Q8RnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5Kj4o
bV9tYWluRnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKSk7CisgICAgICAgICAgICBmcmFtZUxvYWRl
ckNsaWVudC0+c2V0RGVmZXJyZWRNYW51YWxTY3JpcHQoa3VybCk7CisgICAgICAgIH0gZWxzZQor
ICAgICAgICAgICAgbV9tYWluRnJhbWUtPnNjcmlwdCgpLT5leGVjdXRlSWZKYXZhU2NyaXB0VVJM
KGt1cmwsIERvTm90UmVwbGFjZURvY3VtZW50SWZKYXZhU2NyaXB0VVJMKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIGlmIChpc0luaXRpYWwpCisgICAgICAgIE5ldHdvcmtNYW5hZ2Vy
OjppbnN0YW5jZSgpLT5zZXRJbml0aWFsVVJMKGt1cmwpOworCisgICAgUmVzb3VyY2VSZXF1ZXN0
IHJlcXVlc3Qoa3VybCwgIiIgLyogcmVmZXJyZXIgKi8pOworICAgIHJlcXVlc3Quc2V0VG9rZW4o
bmV0d29ya1Rva2VuKTsKKyAgICBpZiAoaXNJbml0aWFsIHx8IG11c3RIYW5kbGVJbnRlcm5hbGx5
KQorICAgICAgICByZXF1ZXN0LnNldE11c3RIYW5kbGVJbnRlcm5hbGx5KHRydWUpOworICAgIHJl
cXVlc3Quc2V0SFRUUE1ldGhvZChtZXRob2QpOworICAgIHJlcXVlc3Quc2V0Q2FjaGVQb2xpY3ko
dG9XZWJDb3JlQ2FjaGVQb2xpY3koY2FjaGVQb2xpY3kpKTsKKyAgICBpZiAob3ZlcnJpZGVDb250
ZW50VHlwZSkKKyAgICAgICAgcmVxdWVzdC5zZXRPdmVycmlkZUNvbnRlbnRUeXBlKG92ZXJyaWRl
Q29udGVudFR5cGUpOworCisgICAgaWYgKGRhdGEpCisgICAgICAgIHJlcXVlc3Quc2V0SFRUUEJv
ZHkoRm9ybURhdGE6OmNyZWF0ZShkYXRhLCBkYXRhTGVuZ3RoKSk7CisKKyAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpICsgMSA8IGhlYWRlcnNMZW5ndGg7IGkgKz0gMikKKyAgICAgICAgcmVxdWVz
dC5hZGRIVFRQSGVhZGVyRmllbGQoaGVhZGVyc1tpXSwgaGVhZGVyc1tpICsgMV0pOworCisgICAg
aWYgKGZvcmNlRG93bmxvYWQpCisgICAgICAgIHJlcXVlc3Quc2V0Rm9yY2VEb3dubG9hZCh0cnVl
KTsKKworICAgIG1fbWFpbkZyYW1lLT5sb2FkZXIoKS0+bG9hZChyZXF1ZXN0LCAiIiAvKiBuYW1l
ICovLCBmYWxzZSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmxvYWRTdHJpbmcoY29uc3Qg
Y2hhciogc3RyaW5nLCBjb25zdCBjaGFyKiBiYXNlVVJMLCBjb25zdCBjaGFyKiBjb250ZW50VHlw
ZSwgY29uc3QgY2hhciogZmFpbGluZ1VSTCkKK3sKKyAgICBLVVJMIGt1cmwgPSBwYXJzZVVybChi
YXNlVVJMKTsKKyAgICBSZXNvdXJjZVJlcXVlc3QgcmVxdWVzdChrdXJsKTsKKyAgICBXVEY6OlJl
ZlB0cjxTaGFyZWRCdWZmZXI+IGJ1ZmZlcgorICAgICAgICA9IFNoYXJlZEJ1ZmZlcjo6Y3JlYXRl
KHN0cmluZywgc3RybGVuKHN0cmluZykpOworICAgIFN1YnN0aXR1dGVEYXRhIHN1YnN0aXR1dGVE
YXRhKGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0TUlN
RVR5cGVGcm9tTWVkaWFUeXBlKGNvbnRlbnRUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBleHRyYWN0Q2hhcnNldEZyb21NZWRpYVR5cGUoY29udGVudFR5cGUpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxpbmdVUkwgPyBwYXJzZVVybChmYWls
aW5nVVJMKSA6IEtVUkwoKSk7CisgICAgbV9tYWluRnJhbWUtPmxvYWRlcigpLT5sb2FkKHJlcXVl
c3QsIHN1YnN0aXR1dGVEYXRhLCBmYWxzZSk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmV4
ZWN1dGVKYXZhU2NyaXB0KGNvbnN0IGNoYXIqIHNjcmlwdCwgSmF2YVNjcmlwdERhdGFUeXBlJiBy
ZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKQoreworICAgIFNjcmlwdFZhbHVlIHJl
c3VsdCA9IG1fbWFpbkZyYW1lLT5zY3JpcHQoKS0+ZXhlY3V0ZVNjcmlwdChTdHJpbmc6OmZyb21V
VEY4KHNjcmlwdCksIGZhbHNlKTsKKyAgICBKU0M6OkpTVmFsdWUgdmFsdWUgPSByZXN1bHQuanNW
YWx1ZSgpOworICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTRXhjZXB0
aW9uOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgSlNDOjpFeGVjU3RhdGUq
IGV4ZWMgPSBtX21haW5GcmFtZS0+c2NyaXB0KCktPmdsb2JhbE9iamVjdChtYWluVGhyZWFkTm9y
bWFsV29ybGQoKSktPmdsb2JhbEV4ZWMoKTsKKyAgICBKU0dsb2JhbENvbnRleHRSZWYgY29udGV4
dCA9IHRvR2xvYmFsUmVmKGV4ZWMpOworCisgICAgSlNUeXBlIHR5cGUgPSBKU1ZhbHVlR2V0VHlw
ZShjb250ZXh0LCB0b1JlZihleGVjLCB2YWx1ZSkpOworCisgICAgc3dpdGNoICh0eXBlKSB7Cisg
ICAgY2FzZSBrSlNUeXBlTnVsbDoKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTTnVsbDsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBrSlNUeXBlQm9vbGVhbjoKKyAgICAgICAgcmV0dXJuVHlwZSA9
IEpTQm9vbGVhbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrSlNUeXBlTnVtYmVyOgorICAg
ICAgICByZXR1cm5UeXBlID0gSlNOdW1iZXI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0pT
VHlwZVN0cmluZzoKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTU3RyaW5nOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIGtKU1R5cGVPYmplY3Q6CisgICAgICAgIHJldHVyblR5cGUgPSBKU09iamVj
dDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrSlNUeXBlVW5kZWZpbmVkOgorICAgIGRlZmF1
bHQ6CisgICAgICAgIHJldHVyblR5cGUgPSBKU1VuZGVmaW5lZDsKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorCisgICAgaWYgKHJldHVyblR5cGUgPT0gSlNCb29sZWFuIHx8IHJldHVyblR5cGUgPT0g
SlNOdW1iZXIgfHwgcmV0dXJuVHlwZSA9PSBKU1N0cmluZyB8fCByZXR1cm5UeXBlID09IEpTT2Jq
ZWN0KSB7CisgICAgICAgIFN0cmluZyBzdHIgPSByZXN1bHQudG9TdHJpbmcoZXhlYyk7CisgICAg
ICAgIHJldHVyblZhbHVlID0gV2ViU3RyaW5nKHN0ci5pbXBsKCkpOworICAgIH0KKworICAgIHJl
dHVybiB0cnVlOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpleGVjdXRlSmF2YVNjcmlwdElu
SXNvbGF0ZWRXb3JsZChjb25zdCBTY3JpcHRTb3VyY2VDb2RlJiBzb3VyY2VDb2RlLCBKYXZhU2Ny
aXB0RGF0YVR5cGUmIHJldHVyblR5cGUsIFdlYlN0cmluZyYgcmV0dXJuVmFsdWUpCit7CisgICAg
aWYgKCFtX2lzb2xhdGVkV29ybGQpCisgICAgICAgIG1faXNvbGF0ZWRXb3JsZCA9IG1fbWFpbkZy
YW1lLT5zY3JpcHQoKS0+Y3JlYXRlV29ybGQoKTsKKworICAgIC8vIFVzZSBldmFsdWF0ZUluV29y
bGQgdG8gYXZvaWQgY2FuRXhlY3V0ZVNjcmlwdHMgY2hlY2suCisgICAgU2NyaXB0VmFsdWUgcmVz
dWx0ID0gbV9tYWluRnJhbWUtPnNjcmlwdCgpLT5ldmFsdWF0ZUluV29ybGQoc291cmNlQ29kZSwg
bV9pc29sYXRlZFdvcmxkLmdldCgpKTsKKyAgICBKU0M6OkpTVmFsdWUgdmFsdWUgPSByZXN1bHQu
anNWYWx1ZSgpOworICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTRXhj
ZXB0aW9uOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgSlNDOjpFeGVjU3Rh
dGUqIGV4ZWMgPSBtX21haW5GcmFtZS0+c2NyaXB0KCktPmdsb2JhbE9iamVjdChtX2lzb2xhdGVk
V29ybGQuZ2V0KCkpLT5nbG9iYWxFeGVjKCk7CisgICAgSlNHbG9iYWxDb250ZXh0UmVmIGNvbnRl
eHQgPSB0b0dsb2JhbFJlZihleGVjKTsKKworICAgIEpTVHlwZSB0eXBlID0gSlNWYWx1ZUdldFR5
cGUoY29udGV4dCwgdG9SZWYoZXhlYywgdmFsdWUpKTsKKworICAgIHN3aXRjaCAodHlwZSkgewor
ICAgIGNhc2Uga0pTVHlwZU51bGw6CisgICAgICAgIHJldHVyblR5cGUgPSBKU051bGw7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2Uga0pTVHlwZUJvb2xlYW46CisgICAgICAgIHJldHVyblR5cGUg
PSBKU0Jvb2xlYW47CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0pTVHlwZU51bWJlcjoKKyAg
ICAgICAgcmV0dXJuVHlwZSA9IEpTTnVtYmVyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGtK
U1R5cGVTdHJpbmc6CisgICAgICAgIHJldHVyblR5cGUgPSBKU1N0cmluZzsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBrSlNUeXBlT2JqZWN0OgorICAgICAgICByZXR1cm5UeXBlID0gSlNPYmpl
Y3Q7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0pTVHlwZVVuZGVmaW5lZDoKKyAgICBkZWZh
dWx0OgorICAgICAgICByZXR1cm5UeXBlID0gSlNVbmRlZmluZWQ7CisgICAgICAgIGJyZWFrOwor
ICAgIH0KKworICAgIGlmIChyZXR1cm5UeXBlID09IEpTQm9vbGVhbiB8fCByZXR1cm5UeXBlID09
IEpTTnVtYmVyIHx8IHJldHVyblR5cGUgPT0gSlNTdHJpbmcgfHwgcmV0dXJuVHlwZSA9PSBKU09i
amVjdCkgeworICAgICAgICBTdHJpbmcgc3RyID0gcmVzdWx0LnRvU3RyaW5nKGV4ZWMpOworICAg
ICAgICByZXR1cm5WYWx1ZSA9IFdlYlN0cmluZyhzdHIuaW1wbCgpKTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c3RvcEN1cnJlbnRMb2FkKCkK
K3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBjb250YWluIGFsbCBjb21tb24gY29kZSB0
cmlnZ2VyZWQgYnkgV2ViUGFnZTo6bG9hZAorICAgIC8vICh3aGljaCBzdG9wcyBhbnkgbG9hZCBp
biBwcm9ncmVzcyBiZWZvcmUgc3RhcnRpbmcgdGhlIG5ldyBsb2FkKSBhbmQKKyAgICAvLyBXZWJQ
YWdlOjpzdG9wbG9hZGluZyAodGhlIGVudHJ5IHBvaW50IGZvciB0aGUgY2xpZW50IHRvIHN0b3Ag
dGhlIGxvYWQKKyAgICAvLyBleHBsaWNpdGx5KS4gSWYgaXQgc2hvdWxkIG9ubHkgYmUgZG9uZSB3
aGlsZSBzdG9wcGluZyB0aGUgbG9hZAorICAgIC8vIGV4cGxpY2l0bHksIGl0IGdvZXMgaW4gV2Vi
UGFnZTo6c3RvcExvYWRpbmcsIG5vdCBoZXJlLgorICAgIG1fbWFpbkZyYW1lLT5sb2FkZXIoKS0+
c3RvcEFsbExvYWRlcnMoKTsKKworICAgIC8vIENhbmNlbCBhbnkgZGVmZXJyZWQgc2NyaXB0IHRo
YXQgaGFzbid0IGJlZW4gcHJvY2Vzc2VkIHlldC4KKyAgICBGcmFtZUxvYWRlckNsaWVudEJsYWNr
QmVycnkqIGZyYW1lTG9hZGVyQ2xpZW50ID0gc3RhdGljX2Nhc3Q8RnJhbWVMb2FkZXJDbGllbnRC
bGFja0JlcnJ5Kj4obV9tYWluRnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKSk7CisgICAgZnJhbWVM
b2FkZXJDbGllbnQtPnNldERlZmVycmVkTWFudWFsU2NyaXB0KEtVUkwoKSk7Cit9CisKK3N0YXRp
YyB2b2lkIGNsb3NlVVJMUmVjdXJzaXZlbHkoRnJhbWUqIGZyYW1lKQoreworICAgIC8vIERvIG5v
dCBjcmVhdGUgbW9yZSBmcmFtZSBwbGVhc2UuCisgICAgRnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5KiBmcmFtZUxvYWRlckNsaWVudCA9IHN0YXRpY19jYXN0PEZyYW1lTG9hZGVyQ2xpZW50Qmxh
Y2tCZXJyeSo+KGZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50KCkpOworICAgIGZyYW1lTG9hZGVyQ2xp
ZW50LT5zdXBwcmVzc0NoaWxkRnJhbWVDcmVhdGlvbigpOworCisgICAgZnJhbWUtPmxvYWRlcigp
LT5jbG9zZVVSTCgpOworCisgICAgVmVjdG9yPFJlZlB0cjxGcmFtZT4sIDEwPiBjaGlsZEZyYW1l
czsKKworICAgIGZvciAoUmVmUHRyPEZyYW1lPiBjaGlsZEZyYW1lID0gZnJhbWUtPnRyZWUoKS0+
Zmlyc3RDaGlsZCgpOyBjaGlsZEZyYW1lOyBjaGlsZEZyYW1lID0gY2hpbGRGcmFtZS0+dHJlZSgp
LT5uZXh0U2libGluZygpKQorICAgICAgICBjaGlsZEZyYW1lcy5hcHBlbmQoY2hpbGRGcmFtZSk7
CisKKyAgICB1bnNpZ25lZCBzaXplID0gY2hpbGRGcmFtZXMuc2l6ZSgpOworICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIGNsb3NlVVJMUmVjdXJzaXZlbHko
Y2hpbGRGcmFtZXNbaV0uZ2V0KCkpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpwcmVwYXJl
VG9EZXN0cm95KCkKK3sKKyAgICAvLyBCZWZvcmUgdGhlIGNsaWVudCBzdGFydHMgdGVhcmluZyBp
dHNlbGYgZG93biwgZGlzcGF0Y2ggdGhlIHVubG9hZCBldmVudAorICAgIC8vIHNvIGl0IGNhbiB0
YWtlIGVmZmVjdCB3aGlsZSBhbGwgdGhlIGNsaWVudCdzIHN0YXRlIChlLmcuIHNjcm9sbCBwb3Np
dGlvbikKKyAgICAvLyBpcyBzdGlsbCBwcmVzZW50LgorICAgIGNsb3NlVVJMUmVjdXJzaXZlbHko
bV9tYWluRnJhbWUpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXRMb2FkU3RhdGUoTG9h
ZFN0YXRlIHN0YXRlKQoreworICAgIGlmIChtX2xvYWRTdGF0ZSA9PSBzdGF0ZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgYm9vbCBpc0ZpcnN0TG9hZCA9IG1fbG9hZFN0YXRlID09IE5vbmU7CisK
KyAgICAvLyBTZWUgUklNIEJ1ZyAjMTA2OC4KKyAgICBpZiAoc3RhdGUgPT0gRmluaXNoZWQgJiYg
bV9tYWluRnJhbWUgJiYgbV9tYWluRnJhbWUtPmRvY3VtZW50KCkpCisgICAgICAgIG1fbWFpbkZy
YW1lLT5kb2N1bWVudCgpLT51cGRhdGVTdHlsZUlmTmVlZGVkKCk7CisKKyAgICBtX2xvYWRTdGF0
ZSA9IHN0YXRlOworCisjaWYgREVCVUdfV0VCUEFHRV9MT0FECisgICAgUGxhdGZvcm06OmxvZyhQ
bGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiV2ViUGFnZVByaXZhdGU6OnNldExvYWRTdGF0ZSAlZCIs
IHN0YXRlKTsKKyNlbmRpZgorCisgICAgc3dpdGNoIChtX2xvYWRTdGF0ZSkgeworICAgIGNhc2Ug
UHJvdmlzaW9uYWw6CisgICAgICAgIGlmIChpc0ZpcnN0TG9hZCkgeworICAgICAgICAgICAgLy8g
UGFpbnRzIHRoZSB2aXNpYmxlIGJhY2tpbmdzdG9yZSBhcyB3aGl0ZSB0byBwcmV2ZW50IGluaXRp
YWwgY2hlY2tlcmJvYXJkIG9uCisgICAgICAgICAgICAvLyB0aGUgZmlyc3QgYmxpdC4KKyAgICAg
ICAgICAgIGlmIChtX2JhY2tpbmdTdG9yZS0+ZC0+cmVuZGVyVmlzaWJsZUNvbnRlbnRzKCkgJiYg
IW1fYmFja2luZ1N0b3JlLT5kLT5pc1N1c3BlbmRlZCgpICYmICFtX2JhY2tpbmdTdG9yZS0+ZC0+
c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAgICAgICAgICAgICAgICBtX2JhY2tp
bmdTdG9yZS0+ZC0+YmxpdFZpc2libGVDb250ZW50cygpOworICAgICAgICB9CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgQ29tbWl0dGVkOgorICAgICAgICB7CisgICAgICAgICAgICB1bnNjaGVk
dWxlWm9vbUFib3V0UG9pbnQoKTsKKworI2lmIEVOQUJMRShTS0lBX0dQVV9DQU5WQVMpCisgICAg
ICAgICAgICBpZiAobV9wYWdlLT5zZXR0aW5ncygpLT5jYW52YXNVc2VzQWNjZWxlcmF0ZWREcmF3
aW5nKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGcmVlIEdQVSByZXNvdXJjZXMgYXMgd2UncmUg
b24gYSBuZXcgcGFnZS4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgaGVscCB1cyB0byBm
cmVlIG1lbW9yeSBwcmVzc3VyZS4KKyAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6R3JhcGhpY3M6
Om1ha2VTaGFyZWRSZXNvdXJjZUNvbnRleHRDdXJyZW50KFBsYXRmb3JtOjpHcmFwaGljczo6R0xF
UzIpOworICAgICAgICAgICAgICAgIEdyQ29udGV4dCogZ3JDb250ZXh0ID0gUGxhdGZvcm06Okdy
YXBoaWNzOjpnZXRHckNvbnRleHQoKTsKKyAgICAgICAgICAgICAgICBnckNvbnRleHQtPmZyZWVH
cHVSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisjaWYgVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQorICAgICAgICAgICAgLy8gRklYTUU6IGNvbXBvc2l0b3IgbWF5IG9u
bHkgYmUgdG91Y2hlZCBvbiB0aGUgY29tcG9zaXRpbmcgdGhyZWFkLgorICAgICAgICAgICAgLy8g
SG93ZXZlciwgaXQncyBjcmVhdGVkL2Rlc3Ryb3llZCBieSBhIHN5bmMgY29tbWFuZCBzbyB0aGlz
IGlzIGhhcm1sZXNzLgorICAgICAgICAgICAgaWYgKG1fY29tcG9zaXRvcikgeworICAgICAgICAg
ICAgICAgIG1fY29tcG9zaXRvci0+c2V0TGF5b3V0UmVjdEZvckNvbXBvc2l0aW5nKEludFJlY3Qo
KSk7CisgICAgICAgICAgICAgICAgbV9jb21wb3NpdG9yLT5zZXRDb250ZW50c1NpemVGb3JDb21w
b3NpdGluZyhJbnRTaXplKCkpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBt
X3ByZXZpb3VzQ29udGVudHNTaXplID0gSW50U2l6ZSgpOworICAgICAgICAgICAgbV9iYWNraW5n
U3RvcmUtPmQtPnJlc2V0UmVuZGVyUXVldWUoKTsKKyAgICAgICAgICAgIG1fYmFja2luZ1N0b3Jl
LT5kLT5yZXNldFRpbGVzKHRydWUgLyogcmVzZXRCYWNrZ3JvdW5kICovKTsKKyAgICAgICAgICAg
IG1fYmFja2luZ1N0b3JlLT5kLT5zZXRTY3JvbGxpbmdPclpvb21pbmcoZmFsc2UsIGZhbHNlIC8q
IHNob3VsZEJsaXQgKi8pOworICAgICAgICAgICAgbV91c2VyUGVyZm9ybWVkTWFudWFsWm9vbSA9
IGZhbHNlOworICAgICAgICAgICAgbV91c2VyUGVyZm9ybWVkTWFudWFsU2Nyb2xsID0gZmFsc2U7
CisgICAgICAgICAgICBtX3Nob3VsZFVzZUZpeGVkRGVza3RvcE1vZGUgPSBmYWxzZTsKKyAgICAg
ICAgICAgIGlmIChtX3Jlc2V0VmlydHVhbFZpZXdwb3J0T25Db21taXR0ZWQpIHsgLy8gRm9yIERS
VC4KKyAgICAgICAgICAgICAgICBtX3ZpcnR1YWxWaWV3cG9ydFdpZHRoID0gMDsKKyAgICAgICAg
ICAgICAgICBtX3ZpcnR1YWxWaWV3cG9ydEhlaWdodCA9IDA7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBpZiAobV93ZWJTZXR0aW5ncy0+dmlld3BvcnRXaWR0aCgpID4gMCkgeworICAgICAg
ICAgICAgICAgIG1fdmlydHVhbFZpZXdwb3J0V2lkdGggPSBtX3dlYlNldHRpbmdzLT52aWV3cG9y
dFdpZHRoKCk7CisgICAgICAgICAgICAgICAgbV92aXJ0dWFsVmlld3BvcnRIZWlnaHQgPSBtX2Rl
ZmF1bHRMYXlvdXRTaXplLmhlaWdodCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8g
Q2hlY2sgaWYgd2UgaGF2ZSBhbHJlYWR5IHByb2Nlc3MgdGhlIG1ldGEgdmlld3BvcnQgdGFnLCB0
aGlzIG9ubHkgaGFwcGVucyBvbiBoaXN0b3J5IG5hdmlnYXRpb24KKyAgICAgICAgICAgIGlmICgh
bV9kaWRSZXN0b3JlRnJvbVBhZ2VDYWNoZSkgeworICAgICAgICAgICAgICAgIG1fdmlld3BvcnRB
cmd1bWVudHMgPSBWaWV3cG9ydEFyZ3VtZW50cygpOworICAgICAgICAgICAgICAgIG1fdXNlclNj
YWxhYmxlID0gbV93ZWJTZXR0aW5ncy0+aXNVc2VyU2NhbGFibGUoKTsKKyAgICAgICAgICAgICAg
ICByZXNldFNjYWxlcygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBJ
bnRTaXplIHZpcnR1YWxWaWV3cG9ydCA9IHJlY29tcHV0ZVZpcnR1YWxWaWV3cG9ydEZyb21WaWV3
cG9ydEFyZ3VtZW50cygpOworICAgICAgICAgICAgICAgIG1fd2ViUGFnZS0+c2V0VmlydHVhbFZp
ZXdwb3J0U2l6ZSh2aXJ0dWFsVmlld3BvcnQud2lkdGgoKSwgdmlydHVhbFZpZXdwb3J0LmhlaWdo
dCgpKTsKKyAgICAgICAgICAgIH0KKworI2lmIEVOQUJMRShFVkVOVF9NT0RFX01FVEFUQUdTKQor
ICAgICAgICAgICAgZGlkUmVjZWl2ZUN1cnNvckV2ZW50TW9kZShQcm9jZXNzZWRDdXJzb3JFdmVu
dHMpOworICAgICAgICAgICAgZGlkUmVjZWl2ZVRvdWNoRXZlbnRNb2RlKFByb2Nlc3NlZFRvdWNo
RXZlbnRzKTsKKyNlbmRpZgorCisgICAgICAgICAgICAvLyBJZiBpdCdzIGEgb3V0bW9zdCBTVkcg
ZG9jdW1lbnQsIHdlIHVzZSBGaXhlZERlc2t0b3AgbW9kZSwgb3RoZXJ3aXNlCisgICAgICAgICAg
ICAvLyB3ZSBkZWZhdWx0IHRvIE1vYmlsZSBtb2RlLiBGb3IgZXhhbXBsZSwgdXNpbmcgRml4ZWRE
ZXNrdG9wIG1vZGUgdG8KKyAgICAgICAgICAgIC8vIHJlbmRlciBodHRwOi8vd3d3LmNyb2N6aWxs
YS5jb20vYml0c19hbmRfcGllY2VzL3N2Zy9zYW1wbGVzL3RpZ2VyL3RpZ2VyLnN2ZworICAgICAg
ICAgICAgLy8gaXMgdXNlci1leHBlcmllbmNlIGZyaWVuZGx5LgorICAgICAgICAgICAgaWYgKG1f
cGFnZS0+bWFpbkZyYW1lKCktPmRvY3VtZW50KCktPmlzU1ZHRG9jdW1lbnQoKSkgeworICAgICAg
ICAgICAgICAgIHNldFNob3VsZFVzZUZpeGVkRGVza3RvcE1vZGUodHJ1ZSk7CisgICAgICAgICAg
ICAgICAgc2V0Vmlld01vZGUoRml4ZWREZXNrdG9wKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAg
ICAgICAgICAgICAgIHNldFZpZXdNb2RlKE1vYmlsZSk7CisKKyAgICAgICAgICAgIC8vIFJlc2V0
IGJsb2NrIHpvb20gYW5kIHJlZmxvdy4KKyAgICAgICAgICAgIHJlc2V0QmxvY2tab29tKCk7Cisj
aWYgRU5BQkxFKFZJRVdQT1JUX1JFRkxPVykKKyAgICAgICAgICAgIHRvZ2dsZVRleHRSZWZsb3dJ
ZkVuYWJsZWRGb3JCbG9ja1pvb21Pbmx5KCk7CisjZW5kaWYKKworICAgICAgICAgICAgLy8gU2V0
IHRoZSBzY3JvbGwgdG8gb3JpZ2luIGhlcmUgYW5kIG5vdGlmeSB0aGUgY2xpZW50IHNpbmNlIHdl
J2xsIGJlCisgICAgICAgICAgICAvLyB6b29taW5nIGJlbG93IHdpdGhvdXQgYW55IHJlYWwgY29u
dGVudHMgeWV0IHRodXMgdGhlIGNvbnRlbnRzIHNpemUKKyAgICAgICAgICAgIC8vIHdlIHJlcG9y
dCB0byB0aGUgY2xpZW50IGNvdWxkIG1ha2Ugb3VyIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIGlu
dmFsaWQuCisgICAgICAgICAgICBzZXRTY3JvbGxQb3NpdGlvbihJbnRQb2ludDo6emVybygpKTsK
KyAgICAgICAgICAgIG5vdGlmeVRyYW5zZm9ybWVkU2Nyb2xsQ2hhbmdlZCgpOworCisgICAgICAg
ICAgICAvLyBQYWludHMgdGhlIHZpc2libGUgYmFja2luZ3N0b3JlIGFzIHdoaXRlLiBOb3RlIGl0
IGlzIGltcG9ydGFudCB3ZSBkbworICAgICAgICAgICAgLy8gdGhpcyBzdHJpY3RseSBhZnRlciBy
ZS1zZXR0aW5nIHRoZSBzY3JvbGwgcG9zaXRpb24gdG8gb3JpZ2luIGFuZCByZXNldHRpbmcKKyAg
ICAgICAgICAgIC8vIHRoZSBzY2FsZXMgb3RoZXJ3aXNlIHRoZSB2aXNpYmxlIGNvbnRlbnRzIGNh
bGN1bGF0aW9uIGlzIHdyb25nIGFuZCB3ZQorICAgICAgICAgICAgLy8gY2FuIGVuZCB1cCBibGl0
dGluZyBhcnRpZmFjdHMgaW5zdGVhZC4gU2VlOiBSSU0gQnVnICM0MDEuCisgICAgICAgICAgICBp
ZiAobV9iYWNraW5nU3RvcmUtPmQtPnJlbmRlclZpc2libGVDb250ZW50cygpICYmICFtX2JhY2tp
bmdTdG9yZS0+ZC0+aXNTdXNwZW5kZWQoKSAmJiAhbV9iYWNraW5nU3RvcmUtPmQtPnNob3VsZERp
cmVjdFJlbmRlcmluZ1RvV2luZG93KCkpCisgICAgICAgICAgICAgICAgbV9iYWNraW5nU3RvcmUt
PmQtPmJsaXRWaXNpYmxlQ29udGVudHMoKTsKKworICAgICAgICAgICAgem9vbVRvSW5pdGlhbFNj
YWxlT25Mb2FkKCk7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBjdXJzb3Igc3RhdHVzLgorICAg
ICAgICAgICAgdXBkYXRlQ3Vyc29yKCk7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCisgICAgICAgICAgICAvLyBEb24ndCByZW5kZXIgY29tcG9zaXRpbmcgY29udGVudHMgZnJv
bSBwcmV2aW91cyBwYWdlLgorICAgICAgICAgICAgcmVzZXRDb21wb3NpdGluZ1N1cmZhY2UoKTsK
KyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIEZpbmlzaGVk
OgorICAgIGNhc2UgRmFpbGVkOgorICAgICAgICAvLyBOb3RpZnkgY2xpZW50IG9mIHRoZSBpbml0
aWFsIHpvb20gY2hhbmdlLgorICAgICAgICBtX2NsaWVudC0+em9vbUNoYW5nZWQobV93ZWJQYWdl
LT5pc01pblpvb21lZCgpLCBtX3dlYlBhZ2UtPmlzTWF4Wm9vbWVkKCksICFzaG91bGRab29tT25F
c2NhcGUoKSwgY3VycmVudFNjYWxlKCkpOworICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+dXBk
YXRlVGlsZXModHJ1ZSAvKiB1cGRhdGVWaXNpYmxlICovLCBmYWxzZSAvKiBpbW1lZGlhdGUgKi8p
OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9
CisKK2RvdWJsZSBXZWJQYWdlUHJpdmF0ZTo6Y2xhbXBlZFNjYWxlKGRvdWJsZSBzY2FsZSkgY29u
c3QKK3sKKyAgICBpZiAoc2NhbGUgPCBtaW5pbXVtU2NhbGUoKSkKKyAgICAgICAgcmV0dXJuIG1p
bmltdW1TY2FsZSgpOworICAgIGlmIChzY2FsZSA+IG1heGltdW1TY2FsZSgpKQorICAgICAgICBy
ZXR1cm4gbWF4aW11bVNjYWxlKCk7CisgICAgcmV0dXJuIHNjYWxlOworfQorCitib29sIFdlYlBh
Z2VQcml2YXRlOjpzaG91bGRab29tQWJvdXRQb2ludChkb3VibGUgc2NhbGUsIGNvbnN0IEZsb2F0
UG9pbnQmLCBib29sIGVuZm9yY2VTY2FsZUNsYW1waW5nLCBkb3VibGUqIGNsYW1wZWRTY2FsZSkK
K3sKKyAgICBpZiAoIW1fbWFpbkZyYW1lLT52aWV3KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIGlmIChlbmZvcmNlU2NhbGVDbGFtcGluZykKKyAgICAgICAgc2NhbGUgPSB0aGlzLT5j
bGFtcGVkU2NhbGUoc2NhbGUpOworCisgICAgQVNTRVJUKGNsYW1wZWRTY2FsZSk7CisgICAgKmNs
YW1wZWRTY2FsZSA9IHNjYWxlOworCisgICAgaWYgKGN1cnJlbnRTY2FsZSgpID09IHNjYWxlKSB7
CisgICAgICAgIC8vIE1ha2Ugc3VyZSBiYWNraW5nc3RvcmUgdXBkYXRlcyByZXN1bWUgZnJvbSBw
aW5jaCB6b29tIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBmaW5hbCB6b29tIGxldmVsIGRvZXNuJ3Qg
Y2hhbmdlLgorICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+cmVzdW1lU2NyZWVuQW5kQmFja2lu
Z1N0b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6Ok5vbmUpOworICAgICAgICBtX2NsaWVudC0+em9v
bUNoYW5nZWQobV93ZWJQYWdlLT5pc01pblpvb21lZCgpLCBtX3dlYlBhZ2UtPmlzTWF4Wm9vbWVk
KCksICFzaG91bGRab29tT25Fc2NhcGUoKSwgY3VycmVudFNjYWxlKCkpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgV2ViUGFnZVBy
aXZhdGU6Onpvb21BYm91dFBvaW50KGRvdWJsZSB1bmNsYW1wZWRTY2FsZSwgY29uc3QgRmxvYXRQ
b2ludCYgYW5jaG9yLCBib29sIGVuZm9yY2VTY2FsZUNsYW1waW5nLCBib29sIGZvcmNlUmVuZGVy
aW5nLCBib29sIGlzUmVzdG9yaW5nWm9vbUxldmVsKQoreworICAgIGlmICghaXNSZXN0b3Jpbmda
b29tTGV2ZWwpIHsKKyAgICAgICAgLy8gQ2xlYXIgYW55IGV4aXN0aW5nIGJsb2NrIHpvb20uICAo
SWYgd2UgYXJlIHJlc3RvcmluZyBhIHNhdmVkIHpvb20gbGV2ZWwgb24gcGFnZSBsb2FkLAorICAg
ICAgICAvLyB0aGVyZSBpcyBndWFyYW50ZWVkIHRvIGJlIG5vIGV4aXN0aW5nIGJsb2NrIHpvb20g
YW5kIHdlIGRvbid0IHdhbnQgdG8gY2xlYXIgbV9zaG91bGRSZWZsb3dCbG9jay4pCisgICAgICAg
IHJlc2V0QmxvY2tab29tKCk7CisgICAgfQorCisgICAgLy8gVGhlIHJlZmxvdyBhbmQgYmxvY2sg
em9vbSBzdHVmZiBoZXJlIG5lZWRzIHRvIGhhcHBlbiByZWdhcmRsZXNzIG9mCisgICAgLy8gd2hl
dGhlciB3ZSBzaG91bGRab29tQWJvdXRQb2ludC4KKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9X
KQorICAgIHRvZ2dsZVRleHRSZWZsb3dJZkVuYWJsZWRGb3JCbG9ja1pvb21Pbmx5KG1fc2hvdWxk
UmVmbG93QmxvY2spOworICAgIGlmIChtX3BhZ2UtPnNldHRpbmdzKCktPmlzVGV4dFJlZmxvd0Vu
YWJsZWQoKSAmJiBtX21haW5GcmFtZS0+dmlldygpKQorICAgICAgICBzZXROZWVkc0xheW91dCgp
OworI2VuZGlmCisKKyAgICBkb3VibGUgc2NhbGU7CisgICAgaWYgKCFzaG91bGRab29tQWJvdXRQ
b2ludCh1bmNsYW1wZWRTY2FsZSwgYW5jaG9yLCBlbmZvcmNlU2NhbGVDbGFtcGluZywgJnNjYWxl
KSkgeworICAgICAgICBpZiAobV93ZWJQYWdlLT5zZXR0aW5ncygpLT50ZXh0UmVmbG93TW9kZSgp
ID09IFdlYlNldHRpbmdzOjpUZXh0UmVmbG93RW5hYmxlZCkgeworICAgICAgICAgICAgbV9jdXJy
ZW50UGluY2hab29tTm9kZSA9IDA7CisgICAgICAgICAgICBtX2FuY2hvckluTm9kZVJlY3RSYXRp
byA9IEZsb2F0UG9pbnQoLTEsIC0xKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHpvb207CisgICAgem9vbS5zY2FsZShz
Y2FsZSk7CisKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICBpZiAobG9hZFN0YXRlKCkgPCBG
aW5pc2hlZCkKKyAgICAgICAgUGxhdGZvcm06OmxvZyhQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAi
V2ViUGFnZVByaXZhdGU6Onpvb21BYm91dFBvaW50IHNjYWxlICVmIGFuY2hvciAoJWYsICVmKSIs
IHNjYWxlLCBhbmNob3IueCgpLCBhbmNob3IueSgpKTsKKyNlbmRpZgorCisgICAgLy8gT3VyIGN1
cnJlbnQgc2Nyb2xsIHBvc2l0aW9uIGluIGZsb2F0LgorICAgIEZsb2F0UG9pbnQgc2Nyb2xsUG9z
aXRpb24gPSB0aGlzLT5zY3JvbGxQb3NpdGlvbigpOworCisgICAgLy8gQW5jaG9yIG9mZnNldCBm
cm9tIHNjcm9sbCBwb3NpdGlvbiBpbiBmbG9hdC4KKyAgICBGbG9hdFBvaW50IGFuY2hvck9mZnNl
dChhbmNob3IueCgpIC0gc2Nyb2xsUG9zaXRpb24ueCgpLCBhbmNob3IueSgpIC0gc2Nyb2xsUG9z
aXRpb24ueSgpKTsKKworICAgIC8vIFRoZSBob3Jpem9udGFsIHNjYWxpbmcgZmFjdG9yIGFuZCB2
ZXJ0aWNhbCBzY2FsaW5nIGZhY3RvciBzaG91bGQgYmUgZXF1YWwKKyAgICAvLyB0byBwcmVzZXJ2
ZSBhc3BlY3QgcmF0aW8gb2YgY29udGVudC4KKyAgICBBU1NFUlQobV90cmFuc2Zvcm1hdGlvbk1h
dHJpeC0+bTExKCkgPT0gbV90cmFuc2Zvcm1hdGlvbk1hdHJpeC0+bTIyKCkpOworCisgICAgLy8g
TmVlZCB0byBpbnZlcnQgdGhlIHByZXZpb3VzIHRyYW5zZm9ybSB0byBhbmNob3IgdGhlIHZpZXdw
b3J0LgorICAgIGRvdWJsZSBpbnZlcnNlU2NhbGUgPSBzY2FsZSAvIG1fdHJhbnNmb3JtYXRpb25N
YXRyaXgtPm0xMSgpOworCisgICAgLy8gQWN0dWFsIHpvb20uCisgICAgKm1fdHJhbnNmb3JtYXRp
b25NYXRyaXggPSB6b29tOworCisgICAgLy8gU3VzcGVuZCBhbGwgc2NyZWVuIHVwZGF0ZXMgdG8g
dGhlIGJhY2tpbmdzdG9yZS4KKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+c3VzcGVuZFNjcmVlbkFu
ZEJhY2tpbmdTdG9yZVVwZGF0ZXMoKTsKKworICAgIHVwZGF0ZVZpZXdwb3J0U2l6ZSgpOworCisg
ICAgSW50UG9pbnQgbmV3U2Nyb2xsUG9zaXRpb24oSW50UG9pbnQobWF4KDAsIHN0YXRpY19jYXN0
PGludD4ocm91bmRmKGFuY2hvci54KCkgLSBhbmNob3JPZmZzZXQueCgpIC8gaW52ZXJzZVNjYWxl
KSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCgwLCBzdGF0
aWNfY2FzdDxpbnQ+KHJvdW5kZihhbmNob3IueSgpIC0gYW5jaG9yT2Zmc2V0LnkoKSAvIGludmVy
c2VTY2FsZSkpKSkpOworCisgICAgaWYgKG1fd2ViUGFnZS0+c2V0dGluZ3MoKS0+dGV4dFJlZmxv
d01vZGUoKSA9PSBXZWJTZXR0aW5nczo6VGV4dFJlZmxvd0VuYWJsZWQpIHsKKyAgICAgICAgLy8g
VGhpcyBpcyBhIGhhY2sgZm9yIGVtYWlsIHdoaWNoIGhhcyByZWZsb3cgYWx3YXlzIHR1cm5lZCBv
bi4KKyAgICAgICAgbV9tYWluRnJhbWUtPnZpZXcoKS0+c2V0TmVlZHNMYXlvdXQoKTsKKyAgICAg
ICAgcmVxdWVzdExheW91dElmTmVlZGVkKCk7CisgICAgICAgIGlmIChtX2N1cnJlbnRQaW5jaFpv
b21Ob2RlKQorICAgICAgICAgICAgbmV3U2Nyb2xsUG9zaXRpb24gPSBjYWxjdWxhdGVSZWZsb3dl
ZFNjcm9sbFBvc2l0aW9uKGFuY2hvck9mZnNldCwgc2NhbGUgPT0gbWluaW11bVNjYWxlKCkgPyAx
IDogaW52ZXJzZVNjYWxlKTsKKyAgICAgICAgIG1fY3VycmVudFBpbmNoWm9vbU5vZGUgPSAwOwor
ICAgICAgICAgbV9hbmNob3JJbk5vZGVSZWN0UmF0aW8gPSBGbG9hdFBvaW50KC0xLCAtMSk7Cisg
ICAgfQorCisgICAgc2V0U2Nyb2xsUG9zaXRpb24obmV3U2Nyb2xsUG9zaXRpb24pOworCisgICAg
bm90aWZ5VHJhbnNmb3JtQ2hhbmdlZCgpOworCisgICAgYm9vbCBpc0xvYWRpbmcgPSB0aGlzLT5p
c0xvYWRpbmcoKTsKKworICAgIC8vIFdlIG5lZWQgdG8gaW52YWxpZGF0ZSBhbGwgdGlsZXMgYm90
aCB2aXNpYmxlIGFuZCBub24tdmlzaWJsZSBpZiB3ZSdyZSBsb2FkaW5nLgorICAgIG1fYmFja2lu
Z1N0b3JlLT5kLT51cGRhdGVUaWxlcyhpc0xvYWRpbmcgLyogdXBkYXRlVmlzaWJsZSAqLywgZmFs
c2UgLyogaW1tZWRpYXRlICovKTsKKworICAgIG1fY2xpZW50LT5yZXNldEJpdG1hcFpvb21TY2Fs
ZShtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tMTEoKSk7CisKKyAgICBib29sIHNob3VsZFJlbmRl
ciA9ICFpc0xvYWRpbmcgfHwgbV91c2VyUGVyZm9ybWVkTWFudWFsWm9vbSB8fCBmb3JjZVJlbmRl
cmluZzsKKyAgICBib29sIHNob3VsZENsZWFyVmlzaWJsZVpvb20gPSBpc0xvYWRpbmcgJiYgc2hv
dWxkUmVuZGVyOworCisgICAgaWYgKHNob3VsZENsZWFyVmlzaWJsZVpvb20pIHsKKyAgICAgICAg
Ly8gSWYgd2UgYXJlIGxvYWRpbmcgYW5kIHJlbmRlcmluZyB0aGVuIHdlIG5lZWQgdG8gY2xlYXIg
dGhlIHJlbmRlciBxdWV1ZSdzCisgICAgICAgIC8vIHZpc2libGUgem9vbSBqb2JzIGFzIHRoZXkg
d2lsbCBiZSBpcnJlbGV2YW50IHdpdGggdGhlIHJlbmRlciBiZWxvdy4KKyAgICAgICAgbV9iYWNr
aW5nU3RvcmUtPmQtPmNsZWFyVmlzaWJsZVpvb20oKTsKKyAgICB9CisKKyAgICAvLyBDbGVhciB3
aW5kb3cgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBhcnRpZmFjdHMuCisgICAgaWYgKHNob3Vs
ZFJlbmRlcikgeworICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+Y2xlYXJXaW5kb3coKTsKKyAg
ICAgICAgLy8gUmVzdW1lIGFsbCBzY3JlZW4gdXBkYXRlcyB0byB0aGUgYmFja2luZ3N0b3JlIGFu
ZCByZW5kZXIrYmxpdCB2aXNpYmxlIGNvbnRlbnRzIHRvIHNjcmVlbi4KKyAgICAgICAgbV9iYWNr
aW5nU3RvcmUtPmQtPnJlc3VtZVNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoQmFja2luZ1N0
b3JlOjpSZW5kZXJBbmRCbGl0KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBSZXN1bWUgYWxs
IHNjcmVlbiB1cGRhdGVzIHRvIHRoZSBiYWNraW5nc3RvcmUgYnV0IGRvIG5vdCBibGl0IHRvIHRo
ZSBzY3JlZW4gYmVjYXVzZSB3ZSBub3QgcmVuZGVyaW5nLgorICAgICAgICBtX2JhY2tpbmdTdG9y
ZS0+ZC0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6Ok5v
bmUpOworICAgIH0KKworICAgIG1fY2xpZW50LT56b29tQ2hhbmdlZChtX3dlYlBhZ2UtPmlzTWlu
Wm9vbWVkKCksIG1fd2ViUGFnZS0+aXNNYXhab29tZWQoKSwgIXNob3VsZFpvb21PbkVzY2FwZSgp
LCBjdXJyZW50U2NhbGUoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworSW50UG9pbnQgV2Vi
UGFnZVByaXZhdGU6OmNhbGN1bGF0ZVJlZmxvd2VkU2Nyb2xsUG9zaXRpb24oY29uc3QgRmxvYXRQ
b2ludCYgYW5jaG9yT2Zmc2V0LCBkb3VibGUgaW52ZXJzZVNjYWxlKQoreworICAgIC8vIFNob3Vs
ZCBvbmx5IGJlIGludm9rZWQgd2hlbiB0ZXh0IHJlZmxvdyBpcyBlbmFibGVkLgorICAgIEFTU0VS
VChtX3dlYlBhZ2UtPnNldHRpbmdzKCktPnRleHRSZWZsb3dNb2RlKCkgPT0gV2ViU2V0dGluZ3M6
OlRleHRSZWZsb3dFbmFibGVkKTsKKworICAgIGludCBvZmZzZXRZID0gMDsKKyAgICBpbnQgb2Zm
c2V0WCA9IDA7CisKKyAgICBJbnRSZWN0IG5vZGVSZWN0ID0gcmVjdEZvck5vZGUobV9jdXJyZW50
UGluY2hab29tTm9kZS5nZXQoKSk7CisKKyAgICBpZiAobV9jdXJyZW50UGluY2hab29tTm9kZS0+
cmVuZGVyZXIoKSAmJiBtX2FuY2hvckluTm9kZVJlY3RSYXRpby55KCkgPj0gMCkgeworICAgICAg
ICBvZmZzZXRZID0gbm9kZVJlY3QuaGVpZ2h0KCkgKiBtX2FuY2hvckluTm9kZVJlY3RSYXRpby55
KCk7CisgICAgICAgIGlmIChtX2N1cnJlbnRQaW5jaFpvb21Ob2RlLT5yZW5kZXJlcigpLT5pc0lt
YWdlKCkgJiYgbV9hbmNob3JJbk5vZGVSZWN0UmF0aW8ueCgpID4gMCkKKyAgICAgICAgICAgIG9m
ZnNldFggPSBub2RlUmVjdC53aWR0aCgpICogbV9hbmNob3JJbk5vZGVSZWN0UmF0aW8ueCgpIC0g
YW5jaG9yT2Zmc2V0LngoKSAvIGludmVyc2VTY2FsZTsKKyAgICB9CisKKyAgICBJbnRSZWN0IHJl
Zmxvd2VkUmVjdCA9IGFkanVzdFJlY3RPZmZzZXRGb3JGcmFtZU9mZnNldChub2RlUmVjdCwgbV9j
dXJyZW50UGluY2hab29tTm9kZS5nZXQoKSk7CisKKyAgICByZXR1cm4gSW50UG9pbnQobWF4KDAs
IHN0YXRpY19jYXN0PGludD4ocm91bmRmKHJlZmxvd2VkUmVjdC54KCkgKyBvZmZzZXRYKSkpLAor
ICAgICAgICAgICAgICAgICAgICBtYXgoMCwgc3RhdGljX2Nhc3Q8aW50Pihyb3VuZGYocmVmbG93
ZWRSZWN0LnkoKSArIG9mZnNldFkgLSBhbmNob3JPZmZzZXQueSgpIC8gaW52ZXJzZVNjYWxlKSkp
KTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6c2NoZWR1bGVab29tQWJvdXRQb2ludChkb3Vi
bGUgdW5jbGFtcGVkU2NhbGUsIGNvbnN0IEZsb2F0UG9pbnQmIGFuY2hvciwgYm9vbCBlbmZvcmNl
U2NhbGVDbGFtcGluZywgYm9vbCBmb3JjZVJlbmRlcmluZykKK3sKKyAgICBkb3VibGUgc2NhbGU7
CisgICAgaWYgKCFzaG91bGRab29tQWJvdXRQb2ludCh1bmNsYW1wZWRTY2FsZSwgYW5jaG9yLCBl
bmZvcmNlU2NhbGVDbGFtcGluZywgJnNjYWxlKSkgeworICAgICAgICAvLyBXZSBjb3VsZCBiZSBi
YWNrIHRvIHRoZSByaWdodCB6b29tIGxldmVsIGJlZm9yZSB0aGUgdGltZXIgaGFzCisgICAgICAg
IC8vIHRpbWVkIG91dCwgYmVjYXVzZSBvZiB3aWdnbGluZyBiYWNrIGFuZCBmb3J0aC4gU3RvcCB0
aGUgdGltZXIuCisgICAgICAgIHVuc2NoZWR1bGVab29tQWJvdXRQb2ludCgpOworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRm9yIHNvbWUgcmVhc29uLCB0aGUgYml0bWFw
IHpvb20gd2FudHMgYW4gYW5jaG9yIGluIGJhY2tpbmdzdG9yZSBjb29yZGluYXRlcyEKKyAgICAv
LyB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIHpvb21BYm91dFBvaW50LCB3aGljaCB3YW50cyBjb250
ZW50IGNvb3JkaW5hdGVzLgorICAgIC8vIFNlZSBSSU0gQnVnICM2NDEuCisKKyAgICBGbG9hdFBv
aW50IHRyYW5zZm9ybWVkQW5jaG9yID0gbWFwVG9UcmFuc2Zvcm1lZEZsb2F0UG9pbnQoYW5jaG9y
KTsKKyAgICBGbG9hdFBvaW50IHRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24gPSBtYXBUb1RyYW5z
Zm9ybWVkRmxvYXRQb2ludChzY3JvbGxQb3NpdGlvbigpKTsKKworICAgIC8vIFByb2hpYml0IGJh
Y2tpbmdzdG9yZSBmcm9tIHVwZGF0aW5nIHRoZSB3aW5kb3cgb3ZlcnRvcCBvZiB0aGUgYml0bWFw
LgorICAgIG1fYmFja2luZ1N0b3JlLT5kLT5zdXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBk
YXRlcygpOworCisgICAgLy8gTmVlZCB0byBpbnZlcnQgdGhlIHByZXZpb3VzIHRyYW5zZm9ybSB0
byBhbmNob3IgdGhlIHZpZXdwb3J0LgorICAgIGRvdWJsZSB6b29tRnJhY3Rpb24gPSBzY2FsZSAv
IHRyYW5zZm9ybWF0aW9uTWF0cml4KCktPm0xMSgpOworCisgICAgLy8gQW5jaG9yIG9mZnNldCBm
cm9tIHNjcm9sbCBwb3NpdGlvbiBpbiBmbG9hdC4KKyAgICBGbG9hdFBvaW50IGFuY2hvck9mZnNl
dCh0cmFuc2Zvcm1lZEFuY2hvci54KCkgLSB0cmFuc2Zvcm1lZFNjcm9sbFBvc2l0aW9uLngoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZEFuY2hvci55KCkgLSB0cmFu
c2Zvcm1lZFNjcm9sbFBvc2l0aW9uLnkoKSk7CisKKyAgICBJbnRQb2ludCBzcmNQb2ludCgKKyAg
ICAgICAgc3RhdGljX2Nhc3Q8aW50Pihyb3VuZGYodHJhbnNmb3JtZWRBbmNob3IueCgpIC0gYW5j
aG9yT2Zmc2V0LngoKSAvIHpvb21GcmFjdGlvbikpLAorICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+
KHJvdW5kZih0cmFuc2Zvcm1lZEFuY2hvci55KCkgLSBhbmNob3JPZmZzZXQueSgpIC8gem9vbUZy
YWN0aW9uKSkpOworCisgICAgY29uc3QgSW50UmVjdCB2aWV3cG9ydFJlY3QgPSBJbnRSZWN0KElu
dFBvaW50KDAsIDApLCB0cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpKTsKKyAgICBjb25zdCBJbnRS
ZWN0IGRzdFJlY3QgPSB2aWV3cG9ydFJlY3Q7CisKKyAgICAvLyBUaGlzIGlzIHRoZSByZWN0IHRv
IHBhc3MgYXMgdGhlIGFjdHVhbCBzb3VyY2UgcmVjdCBpbiB0aGUgYmFja2luZ3N0b3JlCisgICAg
Ly8gZm9yIHRoZSB0cmFuc2Zvcm0gZ2l2ZW4gYnkgem9vbS4KKyAgICBJbnRSZWN0IHNyY1JlY3Qo
c3JjUG9pbnQueCgpLAorICAgICAgICAgICAgICAgICAgICBzcmNQb2ludC55KCksCisgICAgICAg
ICAgICAgICAgICAgIHZpZXdwb3J0UmVjdC53aWR0aCgpIC8gem9vbUZyYWN0aW9uLAorICAgICAg
ICAgICAgICAgICAgICB2aWV3cG9ydFJlY3QuaGVpZ2h0KCkgLyB6b29tRnJhY3Rpb24pOworICAg
IG1fYmFja2luZ1N0b3JlLT5kLT5ibGl0Q29udGVudHMoZHN0UmVjdCwgc3JjUmVjdCk7CisKKyAg
ICBtX2RlbGF5ZWRab29tQXJndW1lbnRzLnNjYWxlID0gc2NhbGU7CisgICAgbV9kZWxheWVkWm9v
bUFyZ3VtZW50cy5hbmNob3IgPSBhbmNob3I7CisgICAgbV9kZWxheWVkWm9vbUFyZ3VtZW50cy5l
bmZvcmNlU2NhbGVDbGFtcGluZyA9IGVuZm9yY2VTY2FsZUNsYW1waW5nOworICAgIG1fZGVsYXll
ZFpvb21Bcmd1bWVudHMuZm9yY2VSZW5kZXJpbmcgPSBmb3JjZVJlbmRlcmluZzsKKyAgICBtX2Rl
bGF5ZWRab29tVGltZXItPnN0YXJ0T25lU2hvdChkZWxheWVkWm9vbUludGVydmFsKTsKKworICAg
IHJldHVybiB0cnVlOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjp1bnNjaGVkdWxlWm9vbUFi
b3V0UG9pbnQoKQoreworICAgIGlmIChtX2RlbGF5ZWRab29tVGltZXItPmlzQWN0aXZlKCkpCisg
ICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRh
dGVzKEJhY2tpbmdTdG9yZTo6Tm9uZSk7CisKKyAgICBtX2RlbGF5ZWRab29tVGltZXItPnN0b3Ao
KTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6em9vbUFib3V0UG9pbnRUaW1lckZpcmVkKFRp
bWVyPFdlYlBhZ2VQcml2YXRlPiopCit7CisgICAgem9vbUFib3V0UG9pbnQobV9kZWxheWVkWm9v
bUFyZ3VtZW50cy5zY2FsZSwgbV9kZWxheWVkWm9vbUFyZ3VtZW50cy5hbmNob3IsIG1fZGVsYXll
ZFpvb21Bcmd1bWVudHMuZW5mb3JjZVNjYWxlQ2xhbXBpbmcsIG1fZGVsYXllZFpvb21Bcmd1bWVu
dHMuZm9yY2VSZW5kZXJpbmcpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXROZWVkc0xh
eW91dCgpCit7CisgICAgRnJhbWVWaWV3KiB2aWV3ID0gbV9tYWluRnJhbWUtPnZpZXcoKTsKKyAg
ICBBU1NFUlQodmlldyk7CisgICAgdmlldy0+c2V0TmVlZHNMYXlvdXQoKTsKK30KKwordm9pZCBX
ZWJQYWdlUHJpdmF0ZTo6cmVxdWVzdExheW91dElmTmVlZGVkKCkgY29uc3QKK3sKKyAgICBGcmFt
ZVZpZXcqIHZpZXcgPSBtX21haW5GcmFtZS0+dmlldygpOworICAgIEFTU0VSVCh2aWV3KTsKKyAg
ICB2aWV3LT51cGRhdGVMYXlvdXRBbmRTdHlsZUlmTmVlZGVkUmVjdXJzaXZlKCk7CisgICAgQVNT
RVJUKCF2aWV3LT5uZWVkc0xheW91dCgpKTsKK30KKworSW50UG9pbnQgV2ViUGFnZVByaXZhdGU6
OnNjcm9sbFBvc2l0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9iYWNraW5nU3RvcmVDbGll
bnQtPnNjcm9sbFBvc2l0aW9uKCk7Cit9CisKK0ludFBvaW50IFdlYlBhZ2VQcml2YXRlOjptYXhp
bXVtU2Nyb2xsUG9zaXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNs
aWVudC0+bWF4aW11bVNjcm9sbFBvc2l0aW9uKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6
OnNldFNjcm9sbFBvc2l0aW9uKGNvbnN0IEludFBvaW50JiBwb3MpCit7CisgICAgbV9iYWNraW5n
U3RvcmVDbGllbnQtPnNldFNjcm9sbFBvc2l0aW9uKHBvcyk7Cit9CisKK2Jvb2wgV2ViUGFnZVBy
aXZhdGU6OnNob3VsZFNlbmRSZXNpemVFdmVudCgpCit7CisgICAgaWYgKCFtX21haW5GcmFtZS0+
ZG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gUFIjOTY4NjUgOiBQ
cm92aWRlIGFuIG9wdGlvbiB0byBhbHdheXMgc2VuZCByZXNpemUgZXZlbnRzLCByZWdhcmRsZXNz
IG9mIHRoZSBsb2FkaW5nCisgICAgLy8gICAgICAgICAgICBzdGF0dXMuIFRoZSBzY2VuYXJpbyBm
b3IgdGhpcyBhcmUgU2FwcGhpcmUgYXBwbGljYXRpb25zIHdoaWNoIHRlbmQgdG8KKyAgICAvLyAg
ICAgICAgICAgIG1haW50YWluIGFuIG9wZW4gR0VUIHJlcXVlc3QgdG8gdGhlIHNlcnZlci4gVGhp
cyBvcGVuIEdFVCByZXN1bHRzIGluCisgICAgLy8gICAgICAgICAgICB3ZWJraXQgdGhpbmtpbmcg
dGhhdCBjb250ZW50IGlzIHN0aWxsIGFycml2aW5nIHdoZW4gYXQgdGhlIGFwcGxpY2F0aW9uCisg
ICAgLy8gICAgICAgICAgICBsZXZlbCBpdCBpcyBjb25zaWRlcmVkIGZ1bGx5IGxvYWRlZC4KKyAg
ICAvLworICAgIC8vICAgICAgICAgICAgTk9URTogQ2FyZSBtdXN0IGJlIGV4ZXJjaXNlZCBpbiB0
aGUgdXNlIG9mIHRoaXMgb3B0aW9uLCBhcyBpdCBieXBhc3NlcworICAgIC8vICAgICAgICAgICAg
ICAgICAgdGhlIHNhbml0eSBwcm92aWRlZCBpbiAnaXNMb2FkaW5nSW5BUElTZW5zZSgpJyBiZWxv
dy4KKyAgICAvLworICAgIHN0YXRpYyBjb25zdCBib29sIHVucmVzdHJpY3RlZFJlc2l6ZUV2ZW50
cyA9IFBsYXRmb3JtOjpTZXR0aW5nczo6Z2V0KCktPnVucmVzdHJpY3RlZFJlc2l6ZUV2ZW50cygp
OworICAgIGlmICh1bnJlc3RyaWN0ZWRSZXNpemVFdmVudHMpCisgICAgICAgIHJldHVybiB0cnVl
OworCisgICAgLy8gRG9uJ3Qgc2VuZCB0aGUgcmVzaXplIGV2ZW50IGlmIHRoZSBkb2N1bWVudCBp
cyBsb2FkaW5nLiBTb21lIHBhZ2VzIGF1dG9tYXRpY2FsbHkgcmVsb2FkCisgICAgLy8gd2hlbiB0
aGUgd2luZG93IGlzIHJlc2l6ZWQ7IFNhZmFyaSBvbiBpUGhvbmUgb2Z0ZW4gcmVzaXplcyB0aGUg
d2luZG93IHdoaWxlIHNldHRpbmcgdXAgaXRzCisgICAgLy8gdmlld3BvcnQuIFRoaXMgb2J2aW91
c2x5IGNhbiBjYXVzZSBwcm9ibGVtcy4KKyAgICBEb2N1bWVudExvYWRlciogZG9jdW1lbnRMb2Fk
ZXIgPSBtX21haW5GcmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCk7CisgICAgaWYgKGRv
Y3VtZW50TG9hZGVyICYmIGRvY3VtZW50TG9hZGVyLT5pc0xvYWRpbmdJbkFQSVNlbnNlKCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFdlYlBh
Z2VQcml2YXRlOjp3aWxsRGVmZXJMb2FkaW5nKCkKK3sKKyAgICBtX2NsaWVudC0+d2lsbERlZmVy
TG9hZGluZygpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpkaWRSZXN1bWVMb2FkaW5nKCkK
K3sKKyAgICBtX2NsaWVudC0+ZGlkUmVzdW1lTG9hZGluZygpOworfQorCitib29sIFdlYlBhZ2U6
OnNjcm9sbEJ5KGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSwgYm9vbCBzY3JvbGxNYWlu
RnJhbWUpCit7CisgICAgZC0+bV9iYWNraW5nU3RvcmVDbGllbnQtPnNldElzQ2xpZW50R2VuZXJh
dGVkU2Nyb2xsKHRydWUpOworICAgIGJvb2wgYiA9IGQtPnNjcm9sbEJ5KGRlbHRhLndpZHRoKCks
IGRlbHRhLmhlaWdodCgpLCBzY3JvbGxNYWluRnJhbWUpOworICAgIGQtPm1fYmFja2luZ1N0b3Jl
Q2xpZW50LT5zZXRJc0NsaWVudEdlbmVyYXRlZFNjcm9sbChmYWxzZSk7CisgICAgcmV0dXJuIGI7
Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OnNjcm9sbEJ5KGludCBkZWx0YVgsIGludCBkZWx0
YVksIGJvb2wgc2Nyb2xsTWFpbkZyYW1lKQoreworICAgIEludFNpemUgZGVsdGEoZGVsdGFYLCBk
ZWx0YVkpOworICAgIGlmICghc2Nyb2xsTWFpbkZyYW1lKSB7CisgICAgICAgIC8vIFdlIG5lZWQg
dG8gd29yayBhcm91bmQgdGhlIGZhY3QgdGhhdCA6Om1hcHtUbyxGcm9tfVRyYW5zZm9ybWVkIGRv
IG5vdAorICAgICAgICAvLyB3b3JrIHdlbGwgd2l0aCBuZWdhdGl2ZSB2YWx1ZXMsIGxpa2UgYSBu
ZWdhdGl2ZSB3aWR0aCBvciBoZWlnaHQgb2YgYW4gSW50U2l6ZS4KKyAgICAgICAgSW50U2l6ZSBj
b3BpZWREZWx0YShJbnRTaXplKGFicyhkZWx0YS53aWR0aCgpKSwgYWJzKGRlbHRhLmhlaWdodCgp
KSkpOworICAgICAgICBJbnRTaXplIHVudHJhbnNmb3JtZWRDb3BpZWREZWx0YSA9IG1hcEZyb21U
cmFuc2Zvcm1lZChjb3BpZWREZWx0YSk7CisgICAgICAgIGRlbHRhID0gSW50U2l6ZSgKKyAgICAg
ICAgICAgIGRlbHRhLndpZHRoKCkgPCAwID8gLXVudHJhbnNmb3JtZWRDb3BpZWREZWx0YS53aWR0
aCgpIDogdW50cmFuc2Zvcm1lZENvcGllZERlbHRhLndpZHRoKCksCisgICAgICAgICAgICBkZWx0
YS5oZWlnaHQoKSA8IDAgPyAtdW50cmFuc2Zvcm1lZENvcGllZERlbHRhLmhlaWdodCgpOiB1bnRy
YW5zZm9ybWVkQ29waWVkRGVsdGEuaGVpZ2h0KCkpOworCisgICAgICAgIGlmIChtX2luUmVnaW9u
U2Nyb2xsU3RhcnRpbmdOb2RlKSB7CisgICAgICAgICAgICBpZiAoc2Nyb2xsTm9kZVJlY3Vyc2l2
ZWx5KG1faW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGUuZ2V0KCksIGRlbHRhKSkgeworICAgICAg
ICAgICAgICAgIG1fc2VsZWN0aW9uSGFuZGxlci0+c2VsZWN0aW9uUG9zaXRpb25DaGFuZ2VkKCk7
CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IFdlIGhhdmUgY29kZSBpbiBwbGFjZSB0byBoYW5k
bGUgc2Nyb2xsaW5nIGFuZCBjbGlwcGluZyB0YXAgaGlnaGxpZ2h0CisgICAgICAgICAgICAgICAg
Ly8gb24gaW4tcmVnaW9uIHNjcm9sbGluZy4gQXMgc29vbiBhcyBpdCBpcyBmYXN0IGVub3VnaCAo
aS5lLiB3ZSBoYXZlIGl0IGJhY2tlZCBieQorICAgICAgICAgICAgICAgIC8vIGEgYmFja2luZyBz
dG9yZSksIHdlIGNhbiByZWxpYWJseSBtYWtlIHVzZSBvZiBpdCBpbiB0aGUgcmVhbCB3b3JsZC4K
KyAgICAgICAgICAgICAgICAvLyBtX3RvdWNoRXZlbnRIYW5kbGVyLT5kcmF3VGFwSGlnaGxpZ2h0
KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc2V0U2Nyb2xsUG9zaXRp
b24oc2Nyb2xsUG9zaXRpb24oKSArIGRlbHRhKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9p
ZCBXZWJQYWdlOjpub3RpZnlJblJlZ2lvblNjcm9sbFN0YXR1c0NoYW5nZWQoYm9vbCBzdGF0dXMp
Cit7CisgICAgZC0+bm90aWZ5SW5SZWdpb25TY3JvbGxTdGF0dXNDaGFuZ2VkKHN0YXR1cyk7Cit9
CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6Om5vdGlmeUluUmVnaW9uU2Nyb2xsU3RhdHVzQ2hhbmdl
ZChib29sIHN0YXR1cykKK3sKKyAgICBpZiAoIXN0YXR1cyAmJiBtX2luUmVnaW9uU2Nyb2xsU3Rh
cnRpbmdOb2RlKSB7CisgICAgICAgIGVucXVldWVSZW5kZXJpbmdPZkNsaXBwZWRDb250ZW50T2ZT
Y3JvbGxhYmxlTm9kZUFmdGVySW5SZWdpb25TY3JvbGxpbmcobV9pblJlZ2lvblNjcm9sbFN0YXJ0
aW5nTm9kZS5nZXQoKSk7CisgICAgICAgIG1faW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGUgPSAw
OworICAgIH0KK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6ZW5xdWV1ZVJlbmRlcmluZ09mQ2xp
cHBlZENvbnRlbnRPZlNjcm9sbGFibGVOb2RlQWZ0ZXJJblJlZ2lvblNjcm9sbGluZyhOb2RlKiBz
Y3JvbGxlZE5vZGUpCit7CisgICAgQVNTRVJUKHNjcm9sbGVkTm9kZSk7CisgICAgaWYgKHNjcm9s
bGVkTm9kZS0+aXNEb2N1bWVudE5vZGUoKSkgeworICAgICAgICBGcmFtZSogZnJhbWUgPSBzdGF0
aWNfY2FzdDxjb25zdCBEb2N1bWVudCo+KHNjcm9sbGVkTm9kZSktPmZyYW1lKCk7CisgICAgICAg
IEFTU0VSVChmcmFtZSk7CisgICAgICAgIGlmICghZnJhbWUpCisgICAgICAgICAgICByZXR1cm47
CisgICAgICAgIEFTU0VSVChmcmFtZSAhPSBtX21haW5GcmFtZSk7CisgICAgICAgIEZyYW1lVmll
dyogdmlldyA9IGZyYW1lLT52aWV3KCk7CisgICAgICAgIGlmICghdmlldykKKyAgICAgICAgICAg
IHJldHVybjsKKworICAgICAgICAvLyBTdGVwczoKKyAgICAgICAgLy8gIzEgLSBHZXQgZnJhbWUg
cmVjdCBpbiBjb250ZW50cyBjb29yZHMuCisgICAgICAgIC8vICMyIC0gR2V0IHRoZSBjbGlwcGVk
IHNjcm9sbHZpZXcgcmVjdCBpbiBjb250ZW50cyBjb29yZHMuCisgICAgICAgIC8vICMzIC0gVGFr
ZSB0cmFuc2Zvcm0gaW50byBhY2NvdW50IGZvciAxIGFuZCAyLgorICAgICAgICAvLyAjNCAtIFN1
YnRyYWN0IDIgZnJvbSAxLCBzbyB3ZSBrbm93IGV4YWN0bHkgd2hpY2ggYXJlYXMgb2YgdGhlIGZy
YW1lCisgICAgICAgIC8vICAgICAgYXJlIG9mZnNjcmVlbiwgYW5kIG5lZWQgYXN5bmMgcmVwYWlu
dGluZy4KKyAgICAgICAgRnJhbWVWaWV3KiBtYWluRnJhbWVWaWV3ID0gbV9tYWluRnJhbWUtPnZp
ZXcoKTsKKyAgICAgICAgQVNTRVJUKG1haW5GcmFtZVZpZXcpOworICAgICAgICBJbnRSZWN0IGZy
YW1lUmVjdCA9IHZpZXctPmZyYW1lUmVjdCgpOworICAgICAgICBmcmFtZVJlY3QgPSBmcmFtZS0+
dHJlZSgpLT5wYXJlbnQoKS0+dmlldygpLT5jb250ZW50c1RvV2luZG93KGZyYW1lUmVjdCk7Cisg
ICAgICAgIGZyYW1lUmVjdCA9IG1haW5GcmFtZVZpZXctPndpbmRvd1RvQ29udGVudHMoZnJhbWVS
ZWN0KTsKKworICAgICAgICBJbnRSZWN0IHZpc2libGVXaW5kb3dSZWN0ID0gZ2V0UmVjdXJzaXZl
VmlzaWJsZVdpbmRvd1JlY3Qodmlldyk7CisgICAgICAgIEludFJlY3QgdmlzaWJsZUNvbnRlbnRz
UmVjdCA9IG1haW5GcmFtZVZpZXctPndpbmRvd1RvQ29udGVudHModmlzaWJsZVdpbmRvd1JlY3Qp
OworCisgICAgICAgIEludFJlY3QgdHJhbnNmb3JtZWRGcmFtZVJlY3QgPSBtYXBUb1RyYW5zZm9y
bWVkKGZyYW1lUmVjdCk7CisgICAgICAgIEludFJlY3QgdHJhbnNmb3JtZWRWaXNpYmxlQ29udGVu
dHNSZWN0ID0gbWFwVG9UcmFuc2Zvcm1lZCh2aXNpYmxlQ29udGVudHNSZWN0KTsKKworICAgICAg
ICBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiBvZmZzY3JlZW5SZWdpb25PZklmcmFtZQorICAgICAg
ICAgICAgPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKFBsYXRmb3Jt
OjpJbnRSZWN0KHRyYW5zZm9ybWVkRnJhbWVSZWN0KSwgUGxhdGZvcm06OkludFJlY3QodHJhbnNm
b3JtZWRWaXNpYmxlQ29udGVudHNSZWN0KSk7CisKKyAgICAgICAgaWYgKCFvZmZzY3JlZW5SZWdp
b25PZklmcmFtZS5pc0VtcHR5KCkpCisgICAgICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+bV9y
ZW5kZXJRdWV1ZS0+YWRkVG9RdWV1ZShSZW5kZXJRdWV1ZTo6UmVndWxhclJlbmRlciwgb2Zmc2Ny
ZWVuUmVnaW9uT2ZJZnJhbWUucmVjdHMoKSk7CisgICAgfQorfQorCit2b2lkIFdlYlBhZ2VQcml2
YXRlOjpzZXRIYXNJblJlZ2lvblNjcm9sbGFibGVBcmVhcyhib29sIGIpCit7CisgICAgaWYgKGIg
IT0gbV9oYXNJblJlZ2lvblNjcm9sbGFibGVBcmVhcykKKyAgICAgICAgbV9oYXNJblJlZ2lvblNj
cm9sbGFibGVBcmVhcyA9IGI7Cit9CisKK0ludFNpemUgV2ViUGFnZVByaXZhdGU6OnZpZXdwb3J0
U2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1hcEZyb21UcmFuc2Zvcm1lZCh0cmFuc2Zvcm1l
ZFZpZXdwb3J0U2l6ZSgpKTsKK30KKworSW50U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6YWN0dWFsVmlz
aWJsZVNpemUoKSBjb25zdAoreworICAgIHJldHVybiBtYXBGcm9tVHJhbnNmb3JtZWQodHJhbnNm
b3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSgpKTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6aGFz
VmlydHVhbFZpZXdwb3J0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV92aXJ0dWFsVmlld3BvcnRX
aWR0aCAmJiBtX3ZpcnR1YWxWaWV3cG9ydEhlaWdodDsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0
ZTo6dXBkYXRlVmlld3BvcnRTaXplKGJvb2wgc2V0Rml4ZWRSZXBvcnRlZFNpemUsIGJvb2wgc2Vu
ZFJlc2l6ZUV2ZW50KQoreworICAgIEFTU0VSVChtX21haW5GcmFtZS0+dmlldygpKTsKKyAgICBp
ZiAoc2V0Rml4ZWRSZXBvcnRlZFNpemUpCisgICAgICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPnNl
dEZpeGVkUmVwb3J0ZWRTaXplKGFjdHVhbFZpc2libGVTaXplKCkpOworCisgICAgSW50UmVjdCBm
cmFtZVJlY3QgPSBJbnRSZWN0KHNjcm9sbFBvc2l0aW9uKCksIHZpZXdwb3J0U2l6ZSgpKTsKKyAg
ICBpZiAoZnJhbWVSZWN0ICE9IG1fbWFpbkZyYW1lLT52aWV3KCktPmZyYW1lUmVjdCgpKSB7Cisg
ICAgICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPnNldEZyYW1lUmVjdChmcmFtZVJlY3QpOworICAg
ICAgICBtX21haW5GcmFtZS0+dmlldygpLT5hZGp1c3RWaWV3U2l6ZSgpOworICAgIH0KKworICAg
IC8vIFdlJ3JlIGdvaW5nIHRvIG5lZWQgdG8gc2VuZCBhIHJlc2l6ZSBldmVudCB0byBKYXZhU2Ny
aXB0IGJlY2F1c2UKKyAgICAvLyBpbm5lcldpZHRoIGFuZCBpbm5lckhlaWdodCBkZXBlbmQgb24g
Zml4ZWQgcmVwb3J0ZWQgc2l6ZS4KKyAgICAvLyBUaGlzIGlzIGhvdyB3ZSBzdXBwb3J0IG1vYmls
ZSBwYWdlcyB3aGVyZSBKYXZhU2NyaXB0IHJlc2l6ZXMKKyAgICAvLyB0aGUgcGFnZSBpbiBvcmRl
ciB0byBnZXQgYXJvdW5kIHRoZSBmaXhlZCBsYXlvdXQgc2l6ZSwgZS5nLgorICAgIC8vIGdvb2ds
ZSBtYXBzIHdoZW4gaXQgZGV0ZWN0cyBhIG1vYmlsZSB1c2VyIGFnZW50LgorICAgIGlmIChzZW5k
UmVzaXplRXZlbnQgJiYgc2hvdWxkU2VuZFJlc2l6ZUV2ZW50KCkpCisgICAgICAgIG1fbWFpbkZy
YW1lLT5ldmVudEhhbmRsZXIoKS0+c2VuZFJlc2l6ZUV2ZW50KCk7CisKKyAgICAvLyBXaGVuIHRo
ZSBhY3R1YWwgdmlzaWJsZSBzaXplIGNoYW5nZXMsIHdlIGFsc28KKyAgICAvLyBuZWVkIHRvIHJl
cG9zaXRpb24gZml4ZWQgZWxlbWVudHMuCisgICAgbV9tYWluRnJhbWUtPnZpZXcoKS0+cmVwYWlu
dEZpeGVkRWxlbWVudHNBZnRlclNjcm9sbGluZygpOworfQorCitGbG9hdFBvaW50IFdlYlBhZ2VQ
cml2YXRlOjpjZW50ZXJPZlZpc2libGVDb250ZW50c1JlY3QoKSBjb25zdAoreworICAgIC8vIFRo
ZSB2aXNpYmxlIGNvbnRlbnRzIHJlY3QgaW4gZmxvYXQuCisgICAgRmxvYXRSZWN0IHZpc2libGVD
b250ZW50c1JlY3QgPSB0aGlzLT52aXNpYmxlQ29udGVudHNSZWN0KCk7CisKKyAgICAvLyBUaGUg
Y2VudGVyIG9mIHRoZSB2aXNpYmxlIGNvbnRlbnRzIHJlY3QgaW4gZmxvYXQuCisgICAgcmV0dXJu
IEZsb2F0UG9pbnQodmlzaWJsZUNvbnRlbnRzUmVjdC54KCkgKyB2aXNpYmxlQ29udGVudHNSZWN0
LndpZHRoKCkgLyAyLjAsCisgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZUNvbnRlbnRzUmVj
dC55KCkgKyB2aXNpYmxlQ29udGVudHNSZWN0LmhlaWdodCgpIC8gMi4wKTsKK30KKworSW50UmVj
dCBXZWJQYWdlUHJpdmF0ZTo6dmlzaWJsZUNvbnRlbnRzUmVjdCgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fYmFja2luZ1N0b3JlQ2xpZW50LT52aXNpYmxlQ29udGVudHNSZWN0KCk7Cit9CisKK0lu
dFNpemUgV2ViUGFnZVByaXZhdGU6OmNvbnRlbnRzU2l6ZSgpIGNvbnN0Cit7CisgICAgaWYgKCFt
X21haW5GcmFtZS0+dmlldygpKQorICAgICAgICByZXR1cm4gSW50U2l6ZSgpOworCisgICAgcmV0
dXJuIG1fYmFja2luZ1N0b3JlQ2xpZW50LT5jb250ZW50c1NpemUoKTsKK30KKworSW50U2l6ZSBX
ZWJQYWdlUHJpdmF0ZTo6YWJzb2x1dGVWaXNpYmxlT3ZlcmZsb3dTaXplKCkgY29uc3QKK3sKKyAg
ICBpZiAoIW1fbWFpbkZyYW1lLT5jb250ZW50UmVuZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuIElu
dFNpemUoKTsKKworICAgIHJldHVybiBJbnRTaXplKG1fbWFpbkZyYW1lLT5jb250ZW50UmVuZGVy
ZXIoKS0+cmlnaHRBYnNvbHV0ZVZpc2libGVPdmVyZmxvdygpLCBtX21haW5GcmFtZS0+Y29udGVu
dFJlbmRlcmVyKCktPmJvdHRvbUFic29sdXRlVmlzaWJsZU92ZXJmbG93KCkpOworfQorCit2b2lk
IFdlYlBhZ2VQcml2YXRlOjpjb250ZW50c1NpemVDaGFuZ2VkKGNvbnN0IEludFNpemUmIGNvbnRl
bnRzU2l6ZSkKK3sKKyAgICBpZiAobV9wcmV2aW91c0NvbnRlbnRzU2l6ZSA9PSBjb250ZW50c1Np
emUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgb2NjdXIgaW4g
dGhlIG1pZGRsZSBvZiBsYXlvdXQgc28gd2Ugc2V0IGEgZmxhZyBoZXJlIGFuZAorICAgIC8vIGhh
bmRsZSBpdCBhdCB0aGUgZW5kIG9mIHRoZSBsYXlvdXQuCisgICAgbV9jb250ZW50c1NpemVDaGFu
Z2VkID0gdHJ1ZTsKKworI2lmIERFQlVHX1dFQlBBR0VfTE9BRAorICAgIFBsYXRmb3JtOjpsb2co
UGxhdGZvcm06OkxvZ0xldmVsSW5mbywgIldlYlBhZ2VQcml2YXRlOjpjb250ZW50c1NpemVDaGFu
Z2VkICVkeCVkIiwgY29udGVudHNTaXplLndpZHRoKCksIGNvbnRlbnRzU2l6ZS5oZWlnaHQoKSk7
CisjZW5kaWYKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6b3ZlcmZsb3dFeGNlZWRzQ29udGVu
dHNTaXplKCkKK3sKKyAgICBtX292ZXJmbG93RXhjZWVkc0NvbnRlbnRzU2l6ZSA9IHRydWU7Cit9
CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmxheW91dEZpbmlzaGVkKCkKK3sKKyAgICBpZiAoIW1f
Y29udGVudHNTaXplQ2hhbmdlZCAmJiAhbV9vdmVyZmxvd0V4Y2VlZHNDb250ZW50c1NpemUpCisg
ICAgICAgIHJldHVybjsKKworICAgIG1fY29udGVudHNTaXplQ2hhbmdlZCA9IGZhbHNlOyAvLyBU
b2dnbGUgdG8gdHVybiBvZmYgbm90aWZpY2F0aW9uIGFnYWluLgorICAgIG1fb3ZlcmZsb3dFeGNl
ZWRzQ29udGVudHNTaXplID0gZmFsc2U7CisKKyAgICBpZiAoY29udGVudHNTaXplKCkuaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBUaGUgY2FsbCB0byB6b29tVG9Jbml0aWFs
U2NhbGVPbkxvYWQgY2FuIGNhdXNlIHJlY3Vyc2l2ZSBsYXlvdXQgd2hlbiBjYWxsZWQgZnJvbQor
ICAgIC8vIHRoZSBtaWRkbGUgb2YgYSBsYXlvdXQsIGJ1dCB0aGUgcmVjdXJzaW9uIGlzIGxpbWl0
ZWQgYnkgZGV0ZWN0aW9uIGNvZGUgaW4KKyAgICAvLyBzZXRWaWV3TW9kZSgpIGFuZCBtaXRpZ2F0
aW9uIGNvZGUgaW4gZml4ZWRMYXlvdXRTaXplKCkuCisgICAgaWYgKGRpZExheW91dEV4Y2VlZE1h
eGltdW1JdGVyYXRpb25zKCkpIHsKKyAgICAgICAgbm90aWZ5VHJhbnNmb3JtZWRDb250ZW50c1Np
emVDaGFuZ2VkKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUZW1wb3Jhcmls
eSBzYXZlIHRoZSBtX3ByZXZpb3VzQ29udGVudHNTaXplIGhlcmUgYmVmb3JlIHVwZGF0aW5nIGl0
IChpbgorICAgIC8vIG5vdGlmeVRyYW5zZm9ybWVkQ29udGVudHNTaXplQ2hhbmdlZCgpKSBzbyB3
ZSBjYW4gY29tcGFyZSBpZiBvdXIgY29udGVudHMKKyAgICAvLyBzaHJ1bmsgYWZ0ZXJ3YXJkcy4K
KyAgICBJbnRTaXplIHByZXZpb3VzQ29udGVudHNTaXplID0gbV9wcmV2aW91c0NvbnRlbnRzU2l6
ZTsKKworICAgIG1fbmVzdGVkTGF5b3V0RmluaXNoZWRDb3VudCsrOworCisgICAgaWYgKGxvYWRT
dGF0ZSgpID09IENvbW1pdHRlZCkKKyAgICAgICAgem9vbVRvSW5pdGlhbFNjYWxlT25Mb2FkKCk7
CisgICAgZWxzZSBpZiAobG9hZFN0YXRlKCkgIT0gTm9uZSkKKyAgICAgICAgbm90aWZ5VHJhbnNm
b3JtZWRDb250ZW50c1NpemVDaGFuZ2VkKCk7CisKKyAgICBtX25lc3RlZExheW91dEZpbmlzaGVk
Q291bnQtLTsKKworICAgIGlmICghbV9uZXN0ZWRMYXlvdXRGaW5pc2hlZENvdW50KSB7CisgICAg
ICAgIC8vIFdoZW4gdGhlIGNvbnRlbnRzIHNocmlua3MsIHRoZXJlIGlzIGEgcmlzayB0aGF0IHdl
CisgICAgICAgIC8vIHdpbGwgYmUgbGVmdCBhdCBhIHNjcm9sbCBwb3NpdGlvbiB0aGF0IGxpZXMg
b3V0c2lkZSBvZiB0aGUKKyAgICAgICAgLy8gY29udGVudHMgcmVjdC4gU2luY2Ugd2UgYWxsb3cg
b3ZlcnNjcm9sbGluZyBhbmQgbmVnbGVjdAorICAgICAgICAvLyB0byBjbGFtcCBvdmVyc2Nyb2xs
IGluIG9yZGVyIHRvIHJldGFpbiBpbnB1dCBmb2N1cyAoUklNIEJ1ZyAjNDE0KQorICAgICAgICAv
LyB3ZSBuZWVkIHRvIGNsYW1wIHNvbWV3aGVyZSwgYW5kIHRoaXMgaXMgd2hlcmUgd2Uga25vdyB0
aGUKKyAgICAgICAgLy8gY29udGVudHMgc2l6ZSBoYXMgY2hhbmdlZC4KKworICAgICAgICBpZiAo
Y29udGVudHNTaXplKCkgIT0gcHJldmlvdXNDb250ZW50c1NpemUpIHsKKworICAgICAgICAgICAg
SW50UG9pbnQgbmV3U2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbigpOworCisgICAgICAg
ICAgICBpZiAoY29udGVudHNTaXplKCkuaGVpZ2h0KCkgPCBwcmV2aW91c0NvbnRlbnRzU2l6ZS5o
ZWlnaHQoKSkgeworICAgICAgICAgICAgICAgIEludFBvaW50IHNjcm9sbFBvc2l0aW9uV2l0aEhl
aWdodFNocnVuayA9IEludFBvaW50KG5ld1Njcm9sbFBvc2l0aW9uLngoKSwgbWF4aW11bVNjcm9s
bFBvc2l0aW9uKCkueSgpKTsKKyAgICAgICAgICAgICAgICBuZXdTY3JvbGxQb3NpdGlvbiA9IG5l
d1Njcm9sbFBvc2l0aW9uLnNocnVua1RvKHNjcm9sbFBvc2l0aW9uV2l0aEhlaWdodFNocnVuayk7
CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb250ZW50c1NpemUoKS53aWR0aCgp
IDwgcHJldmlvdXNDb250ZW50c1NpemUud2lkdGgoKSkgeworICAgICAgICAgICAgICAgIEludFBv
aW50IHNjcm9sbFBvc2l0aW9uV2l0aFdpZHRoU2hydW5rID0gSW50UG9pbnQobWF4aW11bVNjcm9s
bFBvc2l0aW9uKCkueCgpLCBuZXdTY3JvbGxQb3NpdGlvbi55KCkpOworICAgICAgICAgICAgICAg
IG5ld1Njcm9sbFBvc2l0aW9uID0gbmV3U2Nyb2xsUG9zaXRpb24uc2hydW5rVG8oc2Nyb2xsUG9z
aXRpb25XaXRoV2lkdGhTaHJ1bmspOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAo
bmV3U2Nyb2xsUG9zaXRpb24gIT0gc2Nyb2xsUG9zaXRpb24oKSkgeworICAgICAgICAgICAgICAg
IHNldFNjcm9sbFBvc2l0aW9uKG5ld1Njcm9sbFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBu
b3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgIH0KK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6em9vbVRvSW5pdGlhbFNjYWxlT25M
b2FkKCkKK3sKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICBQbGF0Zm9ybTo6bG9nKFBsYXRm
b3JtOjpMb2dMZXZlbEluZm8sICJXZWJQYWdlUHJpdmF0ZTo6em9vbVRvSW5pdGlhbFNjYWxlT25M
b2FkIik7CisjZW5kaWYKKworICAgIGJvb2wgbmVlZHNMYXlvdXQgPSBmYWxzZTsKKworICAgIC8v
IElmIHRoZSBjb250ZW50cyB3aWR0aCBleGNlZWRzIHRoZSB2aWV3cG9ydCB3aWR0aCBzZXQgdG8g
ZGVza3RvcCBtb2RlLgorICAgIGlmIChtX3Nob3VsZFVzZUZpeGVkRGVza3RvcE1vZGUpCisgICAg
ICAgIG5lZWRzTGF5b3V0ID0gc2V0Vmlld01vZGUoRml4ZWREZXNrdG9wKTsKKyAgICBlbHNlCisg
ICAgICAgIG5lZWRzTGF5b3V0ID0gc2V0Vmlld01vZGUoRGVza3RvcCk7CisKKyAgICBpZiAobmVl
ZHNMYXlvdXQpIHsKKyAgICAgICAgLy8gVGhpcyBjYW4gY2F1c2UgcmVjdXJzaXZlIGxheW91dC4u
LgorICAgICAgICBzZXROZWVkc0xheW91dCgpOworICAgIH0KKworICAgIGlmIChjb250ZW50c1Np
emUoKS5pc0VtcHR5KCkpIHsKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICAgICAgUGxhdGZv
cm06OmxvZyhQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiV2ViUGFnZVByaXZhdGU6Onpvb21Ub0lu
aXRpYWxTY2FsZU9uTG9hZCBjb250ZW50IGlzIGVtcHR5ISIpOworI2VuZGlmCisgICAgICAgIHJl
cXVlc3RMYXlvdXRJZk5lZWRlZCgpOworICAgICAgICBtX2NsaWVudC0+cmVzZXRCaXRtYXBab29t
U2NhbGUoY3VycmVudFNjYWxlKCkpOworICAgICAgICBub3RpZnlUcmFuc2Zvcm1lZENvbnRlbnRz
U2l6ZUNoYW5nZWQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgcGVyZm9y
bWVkWm9vbSA9IGZhbHNlOworICAgIGJvb2wgc2hvdWxkWm9vbSA9ICFtX3VzZXJQZXJmb3JtZWRN
YW51YWxab29tOworCisgICAgLy8gSWYgdGhpcyBsb2FkIHNob3VsZCByZXN0b3JlIHZpZXcgc3Rh
dGUsIGRvbid0IHpvb20gdG8gaW5pdGlhbCBzY2FsZQorICAgIC8vIGJ1dCBpbnN0ZWFkIGxldCB0
aGUgSGlzdG9yeUl0ZW0ncyBzYXZlZCB2aWV3cG9ydCByZWlnbiBzdXByZW1lLgorICAgIGlmICht
X21haW5GcmFtZSAmJiBtX21haW5GcmFtZS0+bG9hZGVyKCkgJiYgbV9tYWluRnJhbWUtPmxvYWRl
cigpLT5zaG91bGRSZXN0b3JlU2Nyb2xsUG9zaXRpb25BbmRWaWV3U3RhdGUoKSkKKyAgICAgICAg
c2hvdWxkWm9vbSA9IGZhbHNlOworCisgICAgaWYgKHNob3VsZFpvb20gJiYgbG9hZFN0YXRlKCkg
PT0gQ29tbWl0dGVkKSB7CisgICAgICAgIC8vIFByZXNlcnZlIGF0IHRvcCBhbmQgYXQgbGVmdCBw
b3NpdGlvbiwgdG8gYXZvaWQgc2Nyb2xsaW5nCisgICAgICAgIC8vIHRvIGEgbm9uIHRvcC1sZWZ0
IHBvc2l0aW9uIGZvciB3ZWIgcGFnZSB3aXRoIHZpZXdwb3J0IG1ldGEgdGFnCisgICAgICAgIC8v
IHRoYXQgc3BlY2lmaWVzIGFuIGluaXRpYWwtc2NhbGUgdGhhdCBpcyB6b29tZWQgaW4uCisgICAg
ICAgIEZsb2F0UG9pbnQgYW5jaG9yID0gY2VudGVyT2ZWaXNpYmxlQ29udGVudHNSZWN0KCk7Cisg
ICAgICAgIGlmICghc2Nyb2xsUG9zaXRpb24oKS54KCkpCisgICAgICAgICAgICBhbmNob3Iuc2V0
WCgwKTsKKyAgICAgICAgaWYgKCFzY3JvbGxQb3NpdGlvbigpLnkoKSkKKyAgICAgICAgICAgIGFu
Y2hvci5zZXRZKDApOworICAgICAgICBwZXJmb3JtZWRab29tID0gem9vbUFib3V0UG9pbnQoaW5p
dGlhbFNjYWxlKCksIGFuY2hvcik7CisgICAgfQorCisgICAgLy8gem9vbUFib3V0UG9pbnQgYWJv
dmUgY2FuIGFsc28gdG9nZ2xlIHNldE5lZWRzTGF5b3V0IGFuZCBjYXVzZSByZWN1cnNpdmUgbGF5
b3V0Li4uCisgICAgcmVxdWVzdExheW91dElmTmVlZGVkKCk7CisKKyAgICBpZiAoIXBlcmZvcm1l
ZFpvb20pIHsKKyAgICAgICAgLy8gV2Ugb25seSBub3RpZnkgaWYgd2UgZGlkbid0IHBlcmZvcm0g
em9vbSwgYmVjYXVzZSB6b29tIHdpbGwgbm90aWZ5IG9uCisgICAgICAgIC8vIGl0cyBvd24uLi4K
KyAgICAgICAgbV9jbGllbnQtPnJlc2V0Qml0bWFwWm9vbVNjYWxlKGN1cnJlbnRTY2FsZSgpKTsK
KyAgICAgICAgbm90aWZ5VHJhbnNmb3JtZWRDb250ZW50c1NpemVDaGFuZ2VkKCk7CisgICAgfQor
fQorCitkb3VibGUgV2ViUGFnZVByaXZhdGU6OmN1cnJlbnRTY2FsZSgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIG1fdHJhbnNmb3JtYXRpb25NYXRyaXgtPm0xMSgpOworfQorCitkb3VibGUgV2ViUGFn
ZVByaXZhdGU6Onpvb21Ub0ZpdFNjYWxlKCkgY29uc3QKK3sKKyAgICAvLyBXZSBtdXN0IGNsYW1w
IHRoZSBjb250ZW50cyBmb3IgdGhpcyBjYWxjdWxhdGlvbiBzbyB0aGF0IHdlIGRvIG5vdCBhbGxv
dyBhbgorICAgIC8vIGFyYml0cmFyaWx5IHNtYWxsIHpvb21Ub0ZpdFNjYWxlIG11Y2ggbGlrZSB3
ZSBjbGFtcCB0aGUgZml4ZWRMYXlvdXRTaXplKCkKKyAgICAvLyBzbyB0aGF0IHdlIGRvIG5vdCBo
YXZlIGFyYml0cmFyaWx5IGxhcmdlIGxheW91dCBzaXplLgorICAgIC8vIElmIHdlIGhhdmUgYSBz
cGVjaWZpZWQgdmlld3BvcnQsIHdlIG1heSBuZWVkIHRvIGJlIGFibGUgdG8gem9vbSBvdXQgbW9y
ZS4KKyAgICBpbnQgY29udGVudFdpZHRoID0gc3RkOjptaW4oY29udGVudHNTaXplKCkud2lkdGgo
KSwgc3RkOjptYXgobV92aXJ0dWFsVmlld3BvcnRXaWR0aCwgc3RhdGljX2Nhc3Q8aW50PihkZWZh
dWx0TWF4TGF5b3V0U2l6ZSgpLndpZHRoKCkpKSk7CisKKyAgICAvLyBkZWZhdWx0TWF4TGF5b3V0
U2l6ZSgpLndpZHRoKCkgaXMgYSBzYWZlZ3VhcmQgZm9yIGV4Y2Vzc2l2ZWx5IGxhcmdlIHBhZ2Ug
bGF5b3V0cyB0aGF0CisgICAgLy8gaXMgdG9vIHJlc3RyaWN0aXZlIGZvciBpbWFnZSBkb2N1bWVu
dHMuIEluIHRoaXMgY2FzZSwgdGhlIGRvY3VtZW50IHdpZHRoIGlzIHN1ZmZpY2llbnQuCisgICAg
RG9jdW1lbnQqIGRvYyA9IG1fcGFnZS0+bWFpbkZyYW1lKCktPmRvY3VtZW50KCk7CisgICAgaWYg
KGRvYyAmJiBkb2MtPmlzSW1hZ2VEb2N1bWVudCgpKQorICAgICAgIGNvbnRlbnRXaWR0aCA9IGNv
bnRlbnRzU2l6ZSgpLndpZHRoKCk7CisKKyAgICAvLyBJZiB3ZSBoYXZlIGEgdmlydHVhbCB2aWV3
cG9ydCBhbmQgaXRzIGFzcGVjdCByYXRpbyBjYXVzZWQgY29udGVudCB0byBsYXlvdXQKKyAgICAv
LyB3aWRlciB0aGFuIHRoZSBkZWZhdWx0IGxheW91dCBhc3BlY3QgcmF0aW8gd2UgbmVlZCB0byB6
b29tIHRvIGZpdCB0aGUgY29udGVudCBoZWlnaHQKKyAgICAvLyBpbiBvcmRlciB0byBhdm9pZCBz
aG93aW5nIGEgZ3JleSBhcmVhIGJlbG93IHRoZSB3ZWIgcGFnZS4KKyAgICAvLyBXaXRob3V0IHZp
cnR1YWwgdmlld3BvcnQgd2UgY2FuIG5ldmVyIGdldCBpbnRvIHRoaXMgc2l0dWF0aW9uLgorICAg
IGlmIChoYXNWaXJ0dWFsVmlld3BvcnQoKSkgeworICAgICAgICBpbnQgY29udGVudEhlaWdodCA9
IHN0ZDo6bWluKGNvbnRlbnRzU2l6ZSgpLmhlaWdodCgpLCBzdGQ6Om1heChtX3ZpcnR1YWxWaWV3
cG9ydEhlaWdodCwgc3RhdGljX2Nhc3Q8aW50PihkZWZhdWx0TWF4TGF5b3V0U2l6ZSgpLmhlaWdo
dCgpKSkpOworCisgICAgICAgIC8vIEFzcGVjdCByYXRpbyBjaGVjayB3aXRob3V0IGRpdmlzaW9u
LgorICAgICAgICBpZiAoY29udGVudFdpZHRoICogbV9kZWZhdWx0TGF5b3V0U2l6ZS5oZWlnaHQo
KSA+IGNvbnRlbnRIZWlnaHQgKiBtX2RlZmF1bHRMYXlvdXRTaXplLndpZHRoKCkpCisgICAgICAg
ICAgICByZXR1cm4gY29udGVudEhlaWdodCA+IDAgPyBzdGF0aWNfY2FzdDxkb3VibGU+KG1fZGVm
YXVsdExheW91dFNpemUuaGVpZ2h0KCkpIC8gY29udGVudEhlaWdodCA6IDEuMDsKKyAgICB9CisK
KyAgICByZXR1cm4gY29udGVudFdpZHRoID4gMC4wID8gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX2Fj
dHVhbFZpc2libGVXaWR0aCkgLyBjb250ZW50V2lkdGggOiAxLjA7Cit9CisKK2RvdWJsZSBXZWJQ
YWdlUHJpdmF0ZTo6aW5pdGlhbFNjYWxlKCkgY29uc3QKK3sKKyAgICBpZiAobV9pbml0aWFsU2Nh
bGUgPiAwLjApCisgICAgICAgIHJldHVybiBtX2luaXRpYWxTY2FsZTsKKworICAgIGlmIChtX3dl
YlNldHRpbmdzLT5pc1pvb21Ub0ZpdE9uTG9hZCgpKQorICAgICAgICByZXR1cm4gem9vbVRvRml0
U2NhbGUoKTsKKworICAgIHJldHVybiAxLjA7Cit9CisKK3ZvaWQgV2ViUGFnZTo6aW5pdGlhbGl6
ZUljb25EYXRhQmFzZSgpCit7CisgICAgSWNvbkRhdGFiYXNlQ2xpZW50QmxhY2tCZXJyeTo6Z2V0
SW5zdGFuY2UoKS0+aW5pdEljb25EYXRhYmFzZShkLT5tX3dlYlNldHRpbmdzKTsKK30KKworYm9v
bCBXZWJQYWdlOjppc1VzZXJTY2FsYWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmlzVXNl
clNjYWxhYmxlKCk7Cit9CisKK2RvdWJsZSBXZWJQYWdlOjpjdXJyZW50U2NhbGUoKSBjb25zdAor
eworICAgIHJldHVybiBkLT5jdXJyZW50U2NhbGUoKTsKK30KKworZG91YmxlIFdlYlBhZ2U6Omlu
aXRpYWxTY2FsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmluaXRpYWxTY2FsZSgpOworfQor
Citkb3VibGUgV2ViUGFnZTo6em9vbVRvRml0U2NhbGUoKSBjb25zdAoreworICAgIHJldHVybiBk
LT56b29tVG9GaXRTY2FsZSgpOworfQorCit2b2lkIFdlYlBhZ2U6OnNldEluaXRpYWxTY2FsZShk
b3VibGUgaW5pdGlhbFNjYWxlKQoreworICAgIGQtPnNldEluaXRpYWxTY2FsZShpbml0aWFsU2Nh
bGUpOworfQorCitkb3VibGUgV2ViUGFnZTo6bWluaW11bVNjYWxlKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gZC0+bWluaW11bVNjYWxlKCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0TWluaW11bVNj
YWxlKGRvdWJsZSBtaW5pbXVtU2NhbGUpCit7CisgICAgZC0+c2V0TWluaW11bVNjYWxlKG1pbmlt
dW1TY2FsZSk7Cit9CisKK2RvdWJsZSBXZWJQYWdlOjptYXhpbXVtU2NhbGUoKSBjb25zdAorewor
ICAgIHJldHVybiBkLT5tYXhpbXVtU2NhbGUoKTsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRNYXhp
bXVtU2NhbGUoZG91YmxlIG1heGltdW1TY2FsZSkKK3sKKyAgICBkLT5zZXRNYXhpbXVtU2NhbGUo
bWF4aW11bVNjYWxlKTsKK30KKworZG91YmxlIFdlYlBhZ2VQcml2YXRlOjptaW5pbXVtU2NhbGUo
KSBjb25zdAoreworICAgIHJldHVybiAobV9taW5pbXVtU2NhbGUgPiB6b29tVG9GaXRTY2FsZSgp
ICYmIG1fbWluaW11bVNjYWxlIDw9IG1heGltdW1TY2FsZSgpKSA/IG1fbWluaW11bVNjYWxlIDog
em9vbVRvRml0U2NhbGUoKTsKK30KKworZG91YmxlIFdlYlBhZ2VQcml2YXRlOjptYXhpbXVtU2Nh
bGUoKSBjb25zdAoreworICAgIGlmIChtX21heGltdW1TY2FsZSA+PSB6b29tVG9GaXRTY2FsZSgp
ICYmIG1fbWF4aW11bVNjYWxlID49IG1fbWluaW11bVNjYWxlKQorICAgICAgICByZXR1cm4gbV9t
YXhpbXVtU2NhbGU7CisKKyAgICByZXR1cm4gaGFzVmlydHVhbFZpZXdwb3J0KCkgPyBzdGQ6Om1h
eDxkb3VibGU+KHpvb21Ub0ZpdFNjYWxlKCksIDQuMCkgOiA0LjA7Cit9CisKK3ZvaWQgV2ViUGFn
ZVByaXZhdGU6OnJlc2V0U2NhbGVzKCkKK3sKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBpZGVu
dGl0eTsKKyAgICAqbV90cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IGlkZW50aXR5OworICAgIG1faW5p
dGlhbFNjYWxlID0gbV93ZWJTZXR0aW5ncy0+aW5pdGlhbFNjYWxlKCkgPiAwID8gbV93ZWJTZXR0
aW5ncy0+aW5pdGlhbFNjYWxlKCkgOiAtMS4wOworICAgIG1fbWluaW11bVNjYWxlID0gLTEuMDsK
KyAgICBtX21heGltdW1TY2FsZSA9IC0xLjA7CisKKyAgICAvLyBXZSBoYXZlIHRvIGxldCBXZWJD
b3JlIGtub3cgYWJvdXQgdXBkYXRlZCBmcmFtZXJlY3Qgbm93IHRoYXQgd2UndmUKKyAgICAvLyBy
ZXNldCBvdXIgc2NhbGVzLiBTZWU6IFJJTSBCdWcgIzQwMS4KKyAgICB1cGRhdGVWaWV3cG9ydFNp
emUoKTsKK30KKworSW50UG9pbnQgV2ViUGFnZVByaXZhdGU6OnRyYW5zZm9ybWVkU2Nyb2xsUG9z
aXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNsaWVudC0+dHJhbnNm
b3JtZWRTY3JvbGxQb3NpdGlvbigpOworfQorCitJbnRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6dHJh
bnNmb3JtZWRNYXhpbXVtU2Nyb2xsUG9zaXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBtX2Jh
Y2tpbmdTdG9yZUNsaWVudC0+dHJhbnNmb3JtZWRNYXhpbXVtU2Nyb2xsUG9zaXRpb24oKTsKK30K
KworSW50U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6dHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIEludFNpemUobV9hY3R1YWxWaXNpYmxlV2lkdGgsIG1fYWN0
dWFsVmlzaWJsZUhlaWdodCk7Cit9CisKK0ludFNpemUgV2ViUGFnZVByaXZhdGU6OnRyYW5zZm9y
bWVkVmlld3BvcnRTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gUGxhdGZvcm06OkdyYXBoaWNz
OjpTY3JlZW46OnNpemUoKTsKK30KKworSW50UmVjdCBXZWJQYWdlUHJpdmF0ZTo6dHJhbnNmb3Jt
ZWRWaXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3QKK3sKKyAgICAvLyBVc3VhbGx5IHRoaXMgd291
bGQgYmUgbWFwVG9UcmFuc2Zvcm1lZCh2aXNpYmxlQ29udGVudHNSZWN0KCkpLCBidXQKKyAgICAv
LyB0aGF0IHJlc3VsdHMgaW4gcm91bmRpbmcgZXJyb3JzIGJlY2F1c2Ugd2UgYWxyZWFkeSBzZXQg
dGhlIFdlYkNvcmUKKyAgICAvLyB2aWV3cG9ydCBzaXplIGZyb20gb3VyIG9yaWdpbmFsIHRyYW5z
Zm9ybWVkVmlld3BvcnRTaXplKCkuCisgICAgLy8gSW5zdGVhZCwgd2Ugb25seSB0cmFuc2Zvcm0g
dGhlIHNjcm9sbCBwb3NpdGlvbiBhbmQgdGFrZSB0aGUKKyAgICAvLyB2aWV3cG9ydCBzaXplIGFz
IGl0IGlzLCB3aGljaCBlbnN1cmVzIHRoYXQgZS5nLiBibGl0dGluZyBvcGVyYXRpb25zCisgICAg
Ly8gYWx3YXlzIGNvdmVyIHRoZSB3aG9sZSB3aWRnZXQvc2NyZWVuLgorICAgIHJldHVybiBJbnRS
ZWN0KHRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24oKSwgdHJhbnNmb3JtZWRWaWV3cG9ydFNpemUo
KSk7Cit9CisKK0ludFNpemUgV2ViUGFnZVByaXZhdGU6OnRyYW5zZm9ybWVkQ29udGVudHNTaXpl
KCkgY29uc3QKK3sKKyAgICAvLyBtYXBUb1RyYW5zZm9ybWVkKCkgZnVuY3Rpb25zIHVzZSB0aGlz
IG1ldGhvZCB0byBjcm9wIHRoZWlyIHJlc3VsdHMsCisgICAgLy8gc28gd2UgY2FuJ3QgbWFrZSB1
c2Ugb2YgdGhlbSBoZXJlLiBXaGlsZSB3ZSB3YW50IHJvdW5kaW5nIGluc2lkZSBwYWdlCisgICAg
Ly8gYm91bmRhcmllcyB0byBleHRlbmQgcmVjdGFuZ2xlcyBhbmQgcm91bmQgcG9pbnRzLCB3ZSBu
ZWVkIHRvIGNyb3AgdGhlCisgICAgLy8gY29udGVudHMgc2l6ZSB0byB0aGUgZmxvb3JlZCB2YWx1
ZXMgc28gdGhhdCB3ZSBkb24ndCB0cnkgdG8gZGlzcGxheQorICAgIC8vIG9yIHJlcG9ydCBwb2lu
dHMgdGhhdCBhcmUgbm90IGZ1bGx5IGNvdmVyZWQgYnkgdGhlIGFjdHVhbCBmbG9hdC1wb2ludAor
ICAgIC8vIGNvbnRlbnRzIHJlY3RhbmdsZS4KKyAgICBjb25zdCBJbnRTaXplIHVudHJhbnNmb3Jt
ZWRDb250ZW50c1NpemUgPSBjb250ZW50c1NpemUoKTsKKyAgICBjb25zdCBGbG9hdFBvaW50IHRy
YW5zZm9ybWVkQm90dG9tUmlnaHQgPSBtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tYXBQb2ludCgK
KyAgICAgICAgRmxvYXRQb2ludCh1bnRyYW5zZm9ybWVkQ29udGVudHNTaXplLndpZHRoKCksIHVu
dHJhbnNmb3JtZWRDb250ZW50c1NpemUuaGVpZ2h0KCkpKTsKKyAgICByZXR1cm4gSW50U2l6ZShm
bG9vcmYodHJhbnNmb3JtZWRCb3R0b21SaWdodC54KCkpLCBmbG9vcmYodHJhbnNmb3JtZWRCb3R0
b21SaWdodC55KCkpKTsKK30KKworSW50UG9pbnQgV2ViUGFnZVByaXZhdGU6Om1hcEZyb21Db250
ZW50c1RvVmlld3BvcnQoY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIHJldHVy
biBtX2JhY2tpbmdTdG9yZUNsaWVudC0+bWFwRnJvbUNvbnRlbnRzVG9WaWV3cG9ydChwb2ludCk7
Cit9CisKK0ludFBvaW50IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRz
KGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9iYWNraW5nU3Rv
cmVDbGllbnQtPm1hcEZyb21WaWV3cG9ydFRvQ29udGVudHMocG9pbnQpOworfQorCitJbnRSZWN0
IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tQ29udGVudHNUb1ZpZXdwb3J0KGNvbnN0IEludFJlY3Qm
IHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fYmFja2luZ1N0b3JlQ2xpZW50LT5tYXBGcm9t
Q29udGVudHNUb1ZpZXdwb3J0KHJlY3QpOworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2YXRlOjpt
YXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fYmFja2luZ1N0b3JlQ2xpZW50LT5tYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRz
KHJlY3QpOworfQorCitJbnRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVk
Q29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQoY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25z
dAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNsaWVudC0+bWFwRnJvbVRyYW5zZm9ybWVk
Q29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQocG9pbnQpOworfQorCitJbnRQb2ludCBXZWJQ
YWdlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkVmlld3BvcnRUb1RyYW5zZm9ybWVkQ29udGVu
dHMoY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdT
dG9yZUNsaWVudC0+bWFwRnJvbVRyYW5zZm9ybWVkVmlld3BvcnRUb1RyYW5zZm9ybWVkQ29udGVu
dHMocG9pbnQpOworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVHJhbnNmb3Jt
ZWRDb250ZW50c1RvVHJhbnNmb3JtZWRWaWV3cG9ydChjb25zdCBJbnRSZWN0JiByZWN0KSBjb25z
dAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNsaWVudC0+bWFwRnJvbVRyYW5zZm9ybWVk
Q29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQocmVjdCk7Cit9CisKK0ludFJlY3QgV2ViUGFn
ZVByaXZhdGU6Om1hcEZyb21UcmFuc2Zvcm1lZFZpZXdwb3J0VG9UcmFuc2Zvcm1lZENvbnRlbnRz
KGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fYmFja2luZ1N0b3Jl
Q2xpZW50LT5tYXBGcm9tVHJhbnNmb3JtZWRWaWV3cG9ydFRvVHJhbnNmb3JtZWRDb250ZW50cyhy
ZWN0KTsKK30KKworLy8gTk9URTogUElYRUwgUk9VTkRJTkchCisvLyBBY2N1cmF0ZSBiYWNrLWFu
ZC1mb3J0aCByb3VuZGluZyBpcyBub3QgcG9zc2libGUgd2l0aCBpbmZvcm1hdGlvbiBsb3NzCisv
LyBieSBpbnRlZ2VyIHBvaW50cyBhbmQgc2l6ZXMsIHNvIHdlIGFsd2F5cyBleHBhbmQgdGhlIHJl
c3VsdGluZyBtYXBwZWQKKy8vIGZsb2F0IHJlY3RhbmdsZXMgdG8gdGhlIG5lYXJlc3QgaW50ZWdl
ci4gRm9yIHBvaW50cywgd2UgYWx3YXlzIHVzZQorLy8gZmxvb3Itcm91bmRpbmcgaW4gbWFwVG9U
cmFuc2Zvcm1lZCgpIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjcm9wIHRvCisvLyB0aGUgKGZs
b29yJ2QpIHRyYW5zZm9ybWVkIGNvbnRlbnRzIHNpemUuCitzdGF0aWMgaW5saW5lIEludFBvaW50
IHJvdW5kVHJhbnNmb3JtZWRQb2ludChjb25zdCBGbG9hdFBvaW50ICZwb2ludCkKK3sKKyAgICAv
LyBNYXBzIGJ5IHJvdW5kaW5nIGhhbGYgdG93YXJkcyB6ZXJvLgorICAgIHJldHVybiBJbnRQb2lu
dChzdGF0aWNfY2FzdDxpbnQ+KGZsb29yZihwb2ludC54KCkpKSwgc3RhdGljX2Nhc3Q8aW50Pihm
bG9vcmYocG9pbnQueSgpKSkpOworfQorCitzdGF0aWMgaW5saW5lIEludFBvaW50IHJvdW5kVW50
cmFuc2Zvcm1lZFBvaW50KGNvbnN0IEZsb2F0UG9pbnQgJnBvaW50KQoreworICAgIC8vIE1hcHMg
Ynkgcm91bmRpbmcgaGFsZiBhd2F5IGZyb20gemVyby4KKyAgICByZXR1cm4gSW50UG9pbnQoc3Rh
dGljX2Nhc3Q8aW50PihjZWlsZihwb2ludC54KCkpKSwgc3RhdGljX2Nhc3Q8aW50PihjZWlsZihw
b2ludC55KCkpKSk7Cit9CisKK0ludFBvaW50IFdlYlBhZ2VQcml2YXRlOjptYXBUb1RyYW5zZm9y
bWVkKGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICByZXR1cm4gcm91bmRUcmFu
c2Zvcm1lZFBvaW50KG1fdHJhbnNmb3JtYXRpb25NYXRyaXgtPm1hcFBvaW50KEZsb2F0UG9pbnQo
cG9pbnQpKSk7Cit9CisKK0Zsb2F0UG9pbnQgV2ViUGFnZVByaXZhdGU6Om1hcFRvVHJhbnNmb3Jt
ZWRGbG9hdFBvaW50KGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIHJldHVy
biBtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tYXBQb2ludChwb2ludCk7Cit9CisKK0ludFBvaW50
IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVHJhbnNmb3JtZWQoY29uc3QgSW50UG9pbnQmIHBvaW50
KSBjb25zdAoreworICAgIHJldHVybiByb3VuZFVudHJhbnNmb3JtZWRQb2ludChtX3RyYW5zZm9y
bWF0aW9uTWF0cml4LT5pbnZlcnNlKCkubWFwUG9pbnQoRmxvYXRQb2ludChwb2ludCkpKTsKK30K
KworRmxvYXRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkRmxvYXRQb2lu
dChjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90cmFuc2Zv
cm1hdGlvbk1hdHJpeC0+aW52ZXJzZSgpLm1hcFBvaW50KHBvaW50KTsKK30KKworRmxvYXRSZWN0
IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVHJhbnNmb3JtZWRGbG9hdFJlY3QoY29uc3QgRmxvYXRS
ZWN0JiByZWN0KSBjb25zdAoreworICAgIHJldHVybiBtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5p
bnZlcnNlKCkubWFwUmVjdChyZWN0KTsKK30KKworSW50U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6bWFw
VG9UcmFuc2Zvcm1lZChjb25zdCBJbnRTaXplJiBzaXplKSBjb25zdAoreworICAgIHJldHVybiBt
YXBUb1RyYW5zZm9ybWVkKEludFJlY3QoSW50UG9pbnQ6Onplcm8oKSwgc2l6ZSkpLnNpemUoKTsK
K30KKworSW50U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkKGNvbnN0IElu
dFNpemUmIHNpemUpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1hcEZyb21UcmFuc2Zvcm1lZChJbnRS
ZWN0KEludFBvaW50Ojp6ZXJvKCksIHNpemUpKS5zaXplKCk7Cit9CisKK0ludFJlY3QgV2ViUGFn
ZVByaXZhdGU6Om1hcFRvVHJhbnNmb3JtZWQoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sK
KyAgICByZXR1cm4gZW5jbG9zaW5nSW50UmVjdChtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tYXBS
ZWN0KEZsb2F0UmVjdChyZWN0KSkpOworfQorCisvLyBVc2UgdGhpcyBpbiBjb25qdW5jdGlvbiB3
aXRoIG1hcFRvVHJhbnNmb3JtZWQoSW50UmVjdCksIGluIG1vc3QgY2FzZXMuCit2b2lkIFdlYlBh
Z2VQcml2YXRlOjpjbGlwVG9UcmFuc2Zvcm1lZENvbnRlbnRzUmVjdChJbnRSZWN0JiByZWN0KSBj
b25zdAoreworICAgIHJlY3QuaW50ZXJzZWN0KEludFJlY3QoSW50UG9pbnQ6Onplcm8oKSwgdHJh
bnNmb3JtZWRDb250ZW50c1NpemUoKSkpOworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2YXRlOjpt
YXBGcm9tVHJhbnNmb3JtZWQoY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1
cm4gZW5jbG9zaW5nSW50UmVjdChtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5pbnZlcnNlKCkubWFw
UmVjdChGbG9hdFJlY3QocmVjdCkpKTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6dHJhbnNm
b3JtZWRQb2ludEVxdWFsc1VudHJhbnNmb3JtZWRQb2ludChjb25zdCBJbnRQb2ludCYgdHJhbnNm
b3JtZWRQb2ludCwgY29uc3QgSW50UG9pbnQmIHVudHJhbnNmb3JtZWRQb2ludCkKK3sKKyAgICAv
LyBTY2FsaW5nIGRvd24gaXMgYWx3YXlzIG1vcmUgYWNjdXJhdGUgdGhhbiBzY2FsaW5nIHVwLgor
ICAgIGlmIChtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5hKCkgPiAxLjApCisgICAgICAgIHJldHVy
biB0cmFuc2Zvcm1lZFBvaW50ID09IG1hcFRvVHJhbnNmb3JtZWQodW50cmFuc2Zvcm1lZFBvaW50
KTsKKworICAgIHJldHVybiBtYXBGcm9tVHJhbnNmb3JtZWQodHJhbnNmb3JtZWRQb2ludCkgPT0g
dW50cmFuc2Zvcm1lZFBvaW50OworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpub3RpZnlUcmFu
c2Zvcm1DaGFuZ2VkKCkKK3sKKyAgICBub3RpZnlUcmFuc2Zvcm1lZENvbnRlbnRzU2l6ZUNoYW5n
ZWQoKTsKKyAgICBub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQoKTsKKworICAgIG1fYmFj
a2luZ1N0b3JlLT5kLT50cmFuc2Zvcm1DaGFuZ2VkKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZh
dGU6Om5vdGlmeVRyYW5zZm9ybWVkQ29udGVudHNTaXplQ2hhbmdlZCgpCit7CisgICAgLy8gV2Ug
bWFyayBoZXJlIGFzIHRoZSBsYXN0IHJlcG9ydGVkIGNvbnRlbnQgc2l6ZSB3ZSBzZW50IHRvIHRo
ZSBjbGllbnQuCisgICAgbV9wcmV2aW91c0NvbnRlbnRzU2l6ZSA9IGNvbnRlbnRzU2l6ZSgpOwor
CisgICAgY29uc3QgSW50U2l6ZSBzaXplID0gdHJhbnNmb3JtZWRDb250ZW50c1NpemUoKTsKKyAg
ICBtX2JhY2tpbmdTdG9yZS0+ZC0+Y29udGVudHNTaXplQ2hhbmdlZChzaXplKTsKKyAgICBtX2Ns
aWVudC0+Y29udGVudHNTaXplQ2hhbmdlZChzaXplKTsKKyAgICBtX3NlbGVjdGlvbkhhbmRsZXIt
PnNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCgpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpu
b3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQoKQoreworICAgIGNvbnN0IEludFBvaW50IHBv
cyA9IHRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24oKTsKKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+
c2Nyb2xsQ2hhbmdlZChwb3MpOworICAgIG1fY2xpZW50LT5zY3JvbGxDaGFuZ2VkKHBvcyk7Cit9
CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OnNldFZpZXdNb2RlKFZpZXdNb2RlIG1vZGUpCit7Cisg
ICAgaWYgKCFtX21haW5GcmFtZS0+dmlldygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBtX3ZpZXdNb2RlID0gbW9kZTsKKworICAgIC8vIElmIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2Yg
YSBuZXN0ZWQgbGF5b3V0IHdpdGggYSByZWN1cnNpb24gY291bnQgYWJvdmUKKyAgICAvLyBzb21l
IG1heGltdW0gdGhyZXNob2xkLCB0aGVuIG91ciBhbGdvcml0aG0gZm9yIGZpbmRpbmcgdGhlIG1p
bmltdW0gY29udGVudAorICAgIC8vIHdpZHRoIG9mIGEgZ2l2ZW4gcGFnZSBoYXMgYmVjb21lIGRl
cGVuZGVudCBvbiB0aGUgdmlzaWJsZSB3aWR0aC4KKyAgICAvLworICAgIC8vIFdlIG5lZWQgdG8g
ZmluZCBzb21lIG1ldGhvZCB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBleHBlcmllbmNlIGV4Y2Vz
c2l2ZQorICAgIC8vIGFuZCBldmVuIGluZmluaXRlIHJlY3Vyc2lvbi4gVGhpcyBjYW4gZXZlbiBo
YXBwZW4gd2l0aCB2YWxpZCBodG1sLiBUaGUKKyAgICAvLyBmb3JtZXIgY2FuIGhhcHBlbiB3aGVu
IHdlIHJ1biBpbnRvIGlubGluZSB0ZXh0IHdpdGggZmV3IGNhbmRpZGF0ZXMgZm9yIGxpbmUKKyAg
ICAvLyBicmVhay4gVGhlIGxhdHRlciBjYW4gaGFwcGVuIGZvciBpbnN0YW5jZSBpZiB0aGUgcGFn
ZSBoYXMgYSBuZWdhdGl2ZSBtYXJnaW4KKyAgICAvLyBzZXQgYWdhaW5zdCB0aGUgcmlnaHQgYm9y
ZGVyLiBOb3RlOiB0aGlzIGlzIHZhbGlkIGJ5IHNwZWMgYW5kIGNhbiBsZWFkIHRvCisgICAgLy8g
YSBzaXR1YXRpb24gd2hlcmUgdGhlcmUgaXMgbm8gdmFsdWUgZm9yIHdoaWNoIHRoZSBjb250ZW50
IHdpZHRoIHdpbGwgZW5zdXJlCisgICAgLy8gbm8gaG9yaXpvbnRhbCBzY3JvbGxiYXIuCisgICAg
Ly8gRXhhbXBsZTogTGF5b3V0VGVzdHMvY3NzMS9ib3hfcHJvcGVydGllcy9tYXJnaW4uaHRtbAor
ICAgIC8vCisgICAgLy8gSW4gb3JkZXIgdG8gYWRkcmVzcyBzdWNoIHNpdHVhdGlvbnMgd2hlbiB3
ZSBkZXRlY3QgYSByZWN1cnNpb24gYWJvdmUgc29tZQorICAgIC8vIG1heGltdW0gdGhyZXNob2xk
IHdlIHNuYXAgb3VyIGZpeGVkIGxheW91dCBzaXplIHRvIGEgZGVmaW5lZCBxdWFudHVtIGluY3Jl
bWVudC4KKyAgICAvLyBFdmVudHVhbGx5LCBlaXRoZXIgdGhlIGNvbnRlbnQgd2lkdGggd2lsbCBi
ZSBzYXRpc2ZpZWQgdG8gZW5zdXJlIG5vIGhvcml6b250YWwKKyAgICAvLyBzY3JvbGxiYXIgb3Ig
dGhpcyBpbmNyZW1lbnQgd2lsbCBydW4gaW50byB0aGUgbWF4aW11bSBsYXlvdXQgc2l6ZSBhbmQg
dGhlCisgICAgLy8gcmVjdXJzaW9uIHdpbGwgbmVjZXNzYXJpbHkgZW5kLgorICAgIGJvb2wgc25h
cFRvSW5jcmVtZW50ID0gZGlkTGF5b3V0RXhjZWVkTWF4aW11bUl0ZXJhdGlvbnMoKTsKKworICAg
IEludFNpemUgY3VycmVudFNpemUgPSBtX21haW5GcmFtZS0+dmlldygpLT5maXhlZExheW91dFNp
emUoKTsKKyAgICBJbnRTaXplIG5ld1NpemUgPSBmaXhlZExheW91dFNpemUoc25hcFRvSW5jcmVt
ZW50KTsKKyAgICBpZiAoY3VycmVudFNpemUgPT0gbmV3U2l6ZSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgLy8gRklYTUU6IFRlbXAgc29sdXRpb24uIFdlJ2xsIGdldCBiYWNrIHRvIHRo
aXMuCisgICAgaWYgKG1fbmVzdGVkTGF5b3V0RmluaXNoZWRDb3VudCkgeworICAgICAgICBkb3Vi
bGUgd2lkdGhDaGFuZ2UgPSBmYWJzKGRvdWJsZShuZXdTaXplLndpZHRoKCkgLSBjdXJyZW50U2l6
ZS53aWR0aCgpKSAvIGN1cnJlbnRTaXplLndpZHRoKCkpOworICAgICAgICBkb3VibGUgaGVpZ2h0
Q2hhbmdlID0gZmFicyhkb3VibGUobmV3U2l6ZS5oZWlnaHQoKSAtIGN1cnJlbnRTaXplLmhlaWdo
dCgpKSAvIGN1cnJlbnRTaXplLmhlaWdodCgpKTsKKyAgICAgICAgaWYgKHdpZHRoQ2hhbmdlIDwg
MC4wNSAmJiBoZWlnaHRDaGFuZ2UgPCAwLjA1KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIH0KKworICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPnNldFVzZUZpeGVkTGF5b3V0KHVzZUZp
eGVkTGF5b3V0KCkpOworICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPnNldEZpeGVkTGF5b3V0U2l6
ZShuZXdTaXplKTsKKyAgICByZXR1cm4gdHJ1ZTsgLy8gTmVlZHMgcmUtbGF5b3V0IQorfQorCit2
b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXRDdXJzb3IoUGxhdGZvcm1DdXJzb3JIYW5kbGUgaGFuZGxl
KQoreworICAgIGlmIChtX2N1cnJlbnRDdXJzb3IudHlwZSgpICE9IGhhbmRsZS50eXBlKCkpIHsK
KyAgICAgICAgbV9jdXJyZW50Q3Vyc29yID0gaGFuZGxlOworICAgICAgICBtX2NsaWVudC0+Y3Vy
c29yQ2hhbmdlZChoYW5kbGUudHlwZSgpLCBoYW5kbGUudXJsKCkuY19zdHIoKSwgaGFuZGxlLmhv
dHNwb3QoKS54KCksIGhhbmRsZS5ob3RzcG90KCkueSgpKTsKKyAgICB9Cit9CisKK1BsYXRmb3Jt
OjpOZXR3b3JrU3RyZWFtRmFjdG9yeSogV2ViUGFnZVByaXZhdGU6Om5ldHdvcmtTdHJlYW1GYWN0
b3J5KCkKK3sKKyAgICByZXR1cm4gbV9jbGllbnQtPm5ldHdvcmtTdHJlYW1GYWN0b3J5KCk7Cit9
CisKK1BsYXRmb3JtOjpHcmFwaGljczo6V2luZG93KiBXZWJQYWdlUHJpdmF0ZTo6cGxhdGZvcm1X
aW5kb3coKSBjb25zdAoreworICAgIHJldHVybiBtX2NsaWVudC0+d2luZG93KCk7Cit9CisKK3Zv
aWQgV2ViUGFnZVByaXZhdGU6OnNldFByZXZlbnRzU2NyZWVuRGltbWluZyhib29sIGtlZXBBd2Fr
ZSkKK3sKKyAgICBpZiAoa2VlcEF3YWtlKSB7CisgICAgICAgIGlmICghbV9wcmV2ZW50SWRsZURp
bW1pbmdDb3VudCkKKyAgICAgICAgICAgIG1fY2xpZW50LT5zZXRQcmV2ZW50c1NjcmVlbklkbGVE
aW1taW5nKHRydWUpOworICAgICAgICBtX3ByZXZlbnRJZGxlRGltbWluZ0NvdW50Kys7CisgICAg
fSBlbHNlIGlmIChtX3ByZXZlbnRJZGxlRGltbWluZ0NvdW50ID4gMCkgeworICAgICAgICBtX3By
ZXZlbnRJZGxlRGltbWluZ0NvdW50LS07CisgICAgICAgIGlmICghbV9wcmV2ZW50SWRsZURpbW1p
bmdDb3VudCkKKyAgICAgICAgICAgIG1fY2xpZW50LT5zZXRQcmV2ZW50c1NjcmVlbklkbGVEaW1t
aW5nKGZhbHNlKTsKKyAgICB9IGVsc2UKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7IC8v
IFNldFByZXZlbnRzU2NyZWVuSWRsZURpbW1pbmcoZmFsc2UpIGNhbGxlZCB0b28gbWFueSB0aW1l
cy4KK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2hvd1ZpcnR1YWxLZXlib2FyZChib29sIHNo
b3dLZXlib2FyZCkKK3sKKyAgICBtX2NsaWVudC0+aW5wdXRTZXROYXZpZ2F0aW9uTW9kZShzaG93
S2V5Ym9hcmQpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjplbnN1cmVDb250ZW50VmlzaWJs
ZShib29sIGNlbnRlckluVmlldykKK3sKKyAgICBtX2lucHV0SGFuZGxlci0+ZW5zdXJlRm9jdXNF
bGVtZW50VmlzaWJsZShjZW50ZXJJblZpZXcpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjp6
b29tVG9Db250ZW50UmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIERvbid0IHNj
YWxlIGlmIHRoZSB1c2VyIGlzIG5vdCBzdXBwb3NlZCB0byBzY2FsZS4KKyAgICBpZiAoIWlzVXNl
clNjYWxhYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEZsb2F0UG9pbnQgYW5jaG9yID0g
RmxvYXRQb2ludChyZWN0LndpZHRoKCkgLyAyLjAgKyByZWN0LngoKSwgcmVjdC5oZWlnaHQoKSAv
IDIuMCArIHJlY3QueSgpKTsKKyAgICBJbnRTaXplIHZpZXdTaXplID0gdmlld3BvcnRTaXplKCk7
CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIHNjYWxlIHJlcXVpcmVkIHRvIHNjYWxlIHRoYXQgZGlt
ZW5zaW9uIHRvIGZpdC4KKyAgICBkb3VibGUgc2NhbGVIID0gKGRvdWJsZSl2aWV3U2l6ZS53aWR0
aCgpIC8gKGRvdWJsZSlyZWN0LndpZHRoKCk7CisgICAgZG91YmxlIHNjYWxlViA9IChkb3VibGUp
dmlld1NpemUuaGVpZ2h0KCkgLyAoZG91YmxlKXJlY3QuaGVpZ2h0KCk7CisKKyAgICAvLyBDaG9v
c2UgdGhlIHNtYWxsZXIgc2NhbGUgZmFjdG9yIHNvIHRoYXQgYWxsIG9mIHRoZSBjb250ZW50IGlz
IHZpc2libGUuCisgICAgem9vbUFib3V0UG9pbnQobWluKHNjYWxlSCwgc2NhbGVWKSwgYW5jaG9y
KTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6cmVnaXN0ZXJQbHVnaW4oUGx1Z2luVmlldyog
cGx1Z2luLCBib29sIHNob3VsZFJlZ2lzdGVyKQoreworICAgIGlmIChzaG91bGRSZWdpc3RlcikK
KyAgICAgICAgbV9wbHVnaW5WaWV3cy5hZGQocGx1Z2luKTsKKyAgICBlbHNlCisgICAgICAgIG1f
cGx1Z2luVmlld3MucmVtb3ZlKHBsdWdpbik7Cit9CisKKyNkZWZpbmUgRk9SX0VBQ0hfUExVR0lO
VklFVyhwbHVnaW5WaWV3cykgXAorICAgIEhhc2hTZXQ8UGx1Z2luVmlldyo+Ojpjb25zdF9pdGVy
YXRvciBpdCA9IHBsdWdpblZpZXdzLmJlZ2luKCk7IFwKKyAgICBIYXNoU2V0PFBsdWdpblZpZXcq
Pjo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IHBsdWdpblZpZXdzLmVuZCgpOyBcCisgICAgZm9yICg7
IGl0ICE9IGxhc3Q7ICsraXQpCisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6Om5vdGlmeVBhZ2VPbkxv
YWQoKQoreworICAgIEZPUl9FQUNIX1BMVUdJTlZJRVcobV9wbHVnaW5WaWV3cykKKyAgICAgICAg
KCppdCktPmhhbmRsZU9uTG9hZEV2ZW50KCk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OnNo
b3VsZFBsdWdpbkVudGVyRnVsbFNjcmVlbihQbHVnaW5WaWV3KiBwbHVnaW4sIGNvbnN0IGNoYXIq
IHdpbmRvd1VuaXF1ZVByZWZpeCkKK3sKKyAgICByZXR1cm4gbV9jbGllbnQtPnNob3VsZFBsdWdp
bkVudGVyRnVsbFNjcmVlbigpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpkaWRQbHVnaW5F
bnRlckZ1bGxTY3JlZW4oUGx1Z2luVmlldyogcGx1Z2luLCBjb25zdCBjaGFyKiB3aW5kb3dVbmlx
dWVQcmVmaXgpCit7CisgICAgbV9mdWxsU2NyZWVuUGx1Z2luVmlldyA9IHBsdWdpbjsKKyAgICBt
X2NsaWVudC0+ZGlkUGx1Z2luRW50ZXJGdWxsU2NyZWVuKCk7CisgICAgUGxhdGZvcm06OkdyYXBo
aWNzOjpXaW5kb3c6OnNldFRyYW5zcGFyZW5jeURpc2NhcmRGaWx0ZXIod2luZG93VW5pcXVlUHJl
Zml4KTsKKyAgICBtX2NsaWVudC0+d2luZG93KCktPnNldFNlbnNpdGl2aXR5RnVsbHNjcmVlbk92
ZXJyaWRlKHRydWUpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpkaWRQbHVnaW5FeGl0RnVs
bFNjcmVlbihQbHVnaW5WaWV3KiBwbHVnaW4sIGNvbnN0IGNoYXIqIHdpbmRvd1VuaXF1ZVByZWZp
eCkKK3sKKyAgICBtX2Z1bGxTY3JlZW5QbHVnaW5WaWV3ID0gMDsKKyAgICBtX2NsaWVudC0+ZGlk
UGx1Z2luRXhpdEZ1bGxTY3JlZW4oKTsKKyAgICBQbGF0Zm9ybTo6R3JhcGhpY3M6OldpbmRvdzo6
c2V0VHJhbnNwYXJlbmN5RGlzY2FyZEZpbHRlcigwKTsKKyAgICBtX2NsaWVudC0+d2luZG93KCkt
PnNldFNlbnNpdGl2aXR5RnVsbHNjcmVlbk92ZXJyaWRlKGZhbHNlKTsKK30KKwordm9pZCBXZWJQ
YWdlUHJpdmF0ZTo6b25QbHVnaW5TdGFydEJhY2tncm91bmRQbGF5KFBsdWdpblZpZXcqIHBsdWdp
biwgY29uc3QgY2hhciogd2luZG93VW5pcXVlUHJlZml4KQoreworICAgIG1fY2xpZW50LT5vblBs
dWdpblN0YXJ0QmFja2dyb3VuZFBsYXkoKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6b25Q
bHVnaW5TdG9wQmFja2dyb3VuZFBsYXkoUGx1Z2luVmlldyogcGx1Z2luLCBjb25zdCBjaGFyKiB3
aW5kb3dVbmlxdWVQcmVmaXgpCit7CisgICAgbV9jbGllbnQtPm9uUGx1Z2luU3RvcEJhY2tncm91
bmRQbGF5KCk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmxvY2tPcmllbnRhdGlvbihib29s
IGxhbmRzY2FwZSkKK3sKKyAgICByZXR1cm4gbV9jbGllbnQtPmxvY2tPcmllbnRhdGlvbihsYW5k
c2NhcGUpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjp1bmxvY2tPcmllbnRhdGlvbigpCit7
CisgICAgcmV0dXJuIG1fY2xpZW50LT51bmxvY2tPcmllbnRhdGlvbigpOworfQorCitpbnQgV2Vi
UGFnZVByaXZhdGU6Om9yaWVudGF0aW9uKCkgY29uc3QKK3sKKyNpZiBFTkFCTEUoT1JJRU5UQVRJ
T05fRVZFTlRTKQorICAgIHJldHVybiBtX21haW5GcmFtZS0+b3JpZW50YXRpb24oKTsKKyNlbHNl
CisjZXJyb3IgT1JJRU5UQVRJT05fRVZFTlRTIG11c3QgYmUgZGVmaW5lZC4KKy8vIE9yIGEgY29w
eSBvZiB0aGUgb3JpZW50YXRpb24gdmFsdWUgd2lsbCBoYXZlIHRvIGJlIHN0b3JlZCBpbiB0aGVz
ZSBvYmplY3RzLgorI2VuZGlmCit9CisKK2RvdWJsZSBXZWJQYWdlUHJpdmF0ZTo6Y3VycmVudFpv
b21GYWN0b3IoKSBjb25zdAoreworICAgIHJldHVybiBjdXJyZW50U2NhbGUoKTsKK30KKworaW50
IFdlYlBhZ2VQcml2YXRlOjpzaG93QWxlcnREaWFsb2coV2ViUGFnZUNsaWVudDo6QWxlcnRUeXBl
IGF0eXBlKQoreworICAgIHJldHVybiBtX2NsaWVudC0+c2hvd0FsZXJ0RGlhbG9nKGF0eXBlKTsK
K30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6aXNBY3RpdmUoKSBjb25zdAoreworICAgIHJldHVy
biBtX2NsaWVudC0+aXNBY3RpdmUoKTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6dXNlRml4
ZWRMYXlvdXQoKSBjb25zdAoreworICAgIHJldHVybiB0cnVlOworfQorCitBY3RpdmVOb2RlQ29u
dGV4dCBXZWJQYWdlUHJpdmF0ZTo6YWN0aXZlTm9kZUNvbnRleHQoVGFyZ2V0RGV0ZWN0aW9uU3Ry
YXRlZ3kgc3RyYXRlZ3kpCit7CisgICAgQWN0aXZlTm9kZUNvbnRleHQgY29udGV4dDsKKworICAg
IFJlZlB0cjxOb2RlPiBub2RlID0gY29udGV4dE5vZGUoc3RyYXRlZ3kpOworICAgIG1fY3VycmVu
dENvbnRleHROb2RlID0gbm9kZTsKKyAgICBpZiAoIW1fY3VycmVudENvbnRleHROb2RlKQorICAg
ICAgICByZXR1cm4gY29udGV4dDsKKworICAgIHJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpOworCisg
ICAgYm9vbCBub2RlQWxsb3dTZWxlY3Rpb25PdmVycmlkZSA9IGZhbHNlOworICAgIGlmIChOb2Rl
KiBsaW5rTm9kZSA9IG5vZGUtPmVuY2xvc2luZ0xpbmtFdmVudFBhcmVudE9yU2VsZigpKSB7Cisg
ICAgICAgIEtVUkwgaHJlZjsKKyAgICAgICAgaWYgKGxpbmtOb2RlLT5pc0xpbmsoKSAmJiBsaW5r
Tm9kZS0+aGFzQXR0cmlidXRlcygpKSB7CisgICAgICAgICAgICBpZiAoQXR0cmlidXRlKiBhdHRy
aWJ1dGUgPSBsaW5rTm9kZS0+YXR0cmlidXRlcygpLT5nZXRBdHRyaWJ1dGVJdGVtKEhUTUxOYW1l
czo6aHJlZkF0dHIpKQorICAgICAgICAgICAgICAgIGhyZWYgPSBsaW5rTm9kZS0+ZG9jdW1lbnQo
KS0+Y29tcGxldGVVUkwoc3RyaXBMZWFkaW5nQW5kVHJhaWxpbmdIVE1MU3BhY2VzKGF0dHJpYnV0
ZS0+dmFsdWUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHBhdHRlcm4gPSBmaW5k
UGF0dGVyblN0cmluZ0ZvclVybChocmVmKTsKKyAgICAgICAgaWYgKCFwYXR0ZXJuLmlzRW1wdHko
KSkKKyAgICAgICAgICAgIGNvbnRleHQuc2V0UGF0dGVybihwYXR0ZXJuKTsKKworICAgICAgICBp
ZiAoIWhyZWYuc3RyaW5nKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBjb250ZXh0LnNldFVy
bChocmVmLnN0cmluZygpKTsKKworICAgICAgICAgICAgLy8gTGlua3MgYXJlIG5vbi1zZWxlY3Rh
YmxlIGJ5IGRlZmF1bHQsIGJ1dCBzZWxlY3Rpb24gc2hvdWxkIGJlIGFsbG93ZWQKKyAgICAgICAg
ICAgIC8vIHByb3ZpZGluZyB0aGUgcGFnZSBpcyBzZWxlY3RhYmxlLCB1c2UgdGhlIHBhcmVudCB0
byBkZXRlcm1pbmUgaXQuCisgICAgICAgICAgICBpZiAobGlua05vZGUtPnBhcmVudE5vZGUoKSAm
JiBsaW5rTm9kZS0+cGFyZW50Tm9kZSgpLT5jYW5TdGFydFNlbGVjdGlvbigpKQorICAgICAgICAg
ICAgICAgIG5vZGVBbGxvd1NlbGVjdGlvbk92ZXJyaWRlID0gdHJ1ZTsKKyAgICAgICAgfQorICAg
IH0KKworICAgIGlmICghbm9kZUFsbG93U2VsZWN0aW9uT3ZlcnJpZGUgJiYgIW5vZGUtPmNhblN0
YXJ0U2VsZWN0aW9uKCkpCisgICAgICAgIGNvbnRleHQucmVzZXRGbGFnKEFjdGl2ZU5vZGVDb250
ZXh0OjpJc1NlbGVjdGFibGUpOworCisgICAgaWYgKG5vZGUtPmlzSFRNTEVsZW1lbnQoKSkgewor
ICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZUVsZW1lbnQgPSAwOworICAgICAgICBpZiAo
bm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmltZ1RhZykpCisgICAgICAgICAgICBpbWFnZUVs
ZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MSW1hZ2VFbGVtZW50Kj4obm9kZS5nZXQoKSk7CisgICAg
ICAgIGVsc2UgaWYgKG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjphcmVhVGFnKSkKKyAgICAg
ICAgICAgIGltYWdlRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxBcmVhRWxlbWVudCo+KG5vZGUu
Z2V0KCkpLT5pbWFnZUVsZW1lbnQoKTsKKyAgICAgICAgaWYgKGltYWdlRWxlbWVudCAmJiBpbWFn
ZUVsZW1lbnQtPnJlbmRlcmVyKCkpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBBdCB0aGUgbWVh
biB0aW1lLCB3ZSBvbmx5IHNob3cgIlNhdmUgSW1hZ2UiIHdoZW4gdGhlIGltYWdlIGRhdGEgaXMg
YXZhaWxhYmxlLgorICAgICAgICAgICAgaWYgKENhY2hlZFJlc291cmNlKiBjYWNoZWRSZXNvdXJj
ZSA9IGltYWdlRWxlbWVudC0+Y2FjaGVkSW1hZ2UoKSkgeworICAgICAgICAgICAgICAgIGlmIChj
YWNoZWRSZXNvdXJjZS0+aXNMb2FkZWQoKSAmJiBjYWNoZWRSZXNvdXJjZS0+ZGF0YSgpKSB7Cisg
ICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBzdHJpcExlYWRpbmdBbmRUcmFpbGluZ0hU
TUxTcGFjZXMoaW1hZ2VFbGVtZW50LT5nZXRBdHRyaWJ1dGUoSFRNTE5hbWVzOjpzcmNBdHRyKS5z
dHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0SW1hZ2VTcmMobm9kZS0+
ZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwodXJsKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGFsdCA9IGltYWdlRWxlbWVudC0+
YWx0VGV4dCgpOworICAgICAgICAgICAgaWYgKCFhbHQuaXNOdWxsKCkpCisgICAgICAgICAgICAg
ICAgY29udGV4dC5zZXRJbWFnZUFsdChhbHQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYg
KG5vZGUtPmlzVGV4dE5vZGUoKSkgeworICAgICAgICBUZXh0KiBjdXJUZXh0ID0gc3RhdGljX2Nh
c3Q8VGV4dCo+KG5vZGUuZ2V0KCkpOworICAgICAgICBpZiAoIWN1clRleHQtPndob2xlVGV4dCgp
LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRleHQuc2V0VGV4dChjdXJUZXh0LT53aG9sZVRl
eHQoKSk7CisgICAgfQorCisgICAgaWYgKG5vZGUtPmlzRWxlbWVudE5vZGUoKSkgeworICAgICAg
ICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG5vZGUtPnNoYWRvd0Fu
Y2VzdG9yTm9kZSgpKTsKKyAgICAgICAgaWYgKERPTVN1cHBvcnQ6OmlzVGV4dEJhc2VkQ29udGVu
dEVkaXRhYmxlRWxlbWVudChlbGVtZW50KSkgeworICAgICAgICAgICAgY29udGV4dC5zZXRGbGFn
KEFjdGl2ZU5vZGVDb250ZXh0OjpJc0lucHV0KTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50LT5o
YXNUYWdOYW1lKEhUTUxOYW1lczo6aW5wdXRUYWcpKQorICAgICAgICAgICAgICAgIGNvbnRleHQu
c2V0RmxhZyhBY3RpdmVOb2RlQ29udGV4dDo6SXNTaW5nbGVMaW5lKTsKKyAgICAgICAgICAgIGlm
IChET01TdXBwb3J0Ojppc1Bhc3N3b3JkRWxlbWVudChlbGVtZW50KSkKKyAgICAgICAgICAgICAg
ICBjb250ZXh0LnNldEZsYWcoQWN0aXZlTm9kZUNvbnRleHQ6OklzUGFzc3dvcmQpOworCisgICAg
ICAgICAgICBTdHJpbmcgZWxlbWVudFRleHQoRE9NU3VwcG9ydDo6aW5wdXRFbGVtZW50VGV4dChl
bGVtZW50KSk7CisgICAgICAgICAgICBpZiAoIWVsZW1lbnRUZXh0LnN0cmlwV2hpdGVTcGFjZSgp
LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldFRleHQoZWxlbWVudFRleHQp
OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5vZGUtPmlzRm9jdXNhYmxlKCkpCisgICAg
ICAgIGNvbnRleHQuc2V0RmxhZyhBY3RpdmVOb2RlQ29udGV4dDo6SXNGb2N1c2FibGUpOworCisg
ICAgcmV0dXJuIGNvbnRleHQ7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnVwZGF0ZUN1cnNv
cigpCit7CisgICAgaW50IGJ1dHRvbk1hc2sgPSAwOworICAgIGlmIChtX2xhc3RNb3VzZUV2ZW50
LmJ1dHRvbigpID09IExlZnRCdXR0b24pCisgICAgICAgIGJ1dHRvbk1hc2sgPSBQbGF0Zm9ybTo6
TW91c2VFdmVudDo6U2NyZWVuTGVmdE1vdXNlQnV0dG9uOworICAgIGVsc2UgaWYgKG1fbGFzdE1v
dXNlRXZlbnQuYnV0dG9uKCkgPT0gTWlkZGxlQnV0dG9uKQorICAgICAgICBidXR0b25NYXNrID0g
UGxhdGZvcm06Ok1vdXNlRXZlbnQ6OlNjcmVlbk1pZGRsZU1vdXNlQnV0dG9uOworICAgIGVsc2Ug
aWYgKG1fbGFzdE1vdXNlRXZlbnQuYnV0dG9uKCkgPT0gUmlnaHRCdXR0b24pCisgICAgICAgIGJ1
dHRvbk1hc2sgPSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6U2NyZWVuUmlnaHRNb3VzZUJ1dHRvbjsK
KworICAgIFBsYXRmb3JtOjpNb3VzZUV2ZW50IGV2ZW50KGJ1dHRvbk1hc2ssIGJ1dHRvbk1hc2ss
IG1hcFRvVHJhbnNmb3JtZWQobV9sYXN0TW91c2VFdmVudC5wb3MoKSksIG1hcFRvVHJhbnNmb3Jt
ZWQobV9sYXN0TW91c2VFdmVudC5nbG9iYWxQb3MoKSksIDAsIDApOworICAgIG1fd2ViUGFnZS0+
bW91c2VFdmVudChldmVudCk7Cit9CisKK0ludFNpemUgV2ViUGFnZVByaXZhdGU6OmZpeGVkTGF5
b3V0U2l6ZShib29sIHNuYXBUb0luY3JlbWVudCkgY29uc3QKK3sKKyAgICBpZiAoaGFzVmlydHVh
bFZpZXdwb3J0KCkpCisgICAgICAgIHJldHVybiBJbnRTaXplKG1fdmlydHVhbFZpZXdwb3J0V2lk
dGgsIG1fdmlydHVhbFZpZXdwb3J0SGVpZ2h0KTsKKworICAgIGNvbnN0IGludCBkZWZhdWx0TGF5
b3V0V2lkdGggPSBtX2RlZmF1bHRMYXlvdXRTaXplLndpZHRoKCk7CisgICAgY29uc3QgaW50IGRl
ZmF1bHRMYXlvdXRIZWlnaHQgPSBtX2RlZmF1bHRMYXlvdXRTaXplLmhlaWdodCgpOworCisgICAg
aW50IG1pbldpZHRoID0gZGVmYXVsdExheW91dFdpZHRoOworICAgIGludCBtYXhXaWR0aCA9IGRl
ZmF1bHRNYXhMYXlvdXRTaXplKCkud2lkdGgoKTsKKyAgICBpbnQgbWF4SGVpZ2h0ID0gZGVmYXVs
dE1heExheW91dFNpemUoKS5oZWlnaHQoKTsKKworICAgIC8vIElmIHRoZSBsb2FkIHN0YXRlIGlz
IG5vbmUgdGhlbiB3ZSBoYXZlbid0IGFjdHVhbGx5IGdvdCBhbnl0aGluZyB5ZXQsIGJ1dCB3ZSBu
ZWVkIHRvIGxheW91dAorICAgIC8vIHRoZSBlbnRpcmUgcGFnZSBzbyB0aGF0IHRoZSB1c2VyIHNl
ZXMgdGhlIGVudGlyZSBwYWdlICh1bnJlbmRlcmVkKSBpbnN0ZWFkIG9mIGp1c3QgcGFydCBvZiBp
dC4KKyAgICBpZiAobV9sb2FkU3RhdGUgPT0gTm9uZSkKKyAgICAgICAgcmV0dXJuIEludFNpemUo
ZGVmYXVsdExheW91dFdpZHRoLCBkZWZhdWx0TGF5b3V0SGVpZ2h0KTsKKworICAgIGlmIChtX3Zp
ZXdNb2RlID09IEZpeGVkRGVza3RvcCkgeworICAgICAgICBpbnQgd2lkdGggID0gbWF4V2lkdGg7
CisgICAgICAgIC8vIGlmIHRoZSBkZWZhdWx0TGF5b3V0SGVpZ2h0IGlzIGF0IG1pbmltdW0sIGl0
IHByb2JhYmx5IHdhcyBzZXQgYXMgMAorICAgICAgICAvLyBhbmQgY2xhbXBlZCwgbWVhbmluZyBp
dCdzIGVmZmVjdGl2ZWx5IG5vdCBzZXQuICAoRXZlbiBpZiBpdCBoYXBwZW5lZAorICAgICAgICAv
LyB0byBiZSBzZXQgZXhhY3RseSB0byB0aGUgbWluaW11bSwgaXQncyB0b28gc21hbGwgdG8gYmUg
dXNlZnVsLikgIFNvCisgICAgICAgIC8vIGlnbm9yZSBpdC4KKyAgICAgICAgaW50IGhlaWdodDsK
KyAgICAgICAgaWYgKGRlZmF1bHRMYXlvdXRIZWlnaHQgPD0gbWluaW11bUxheW91dFNpemUuaGVp
Z2h0KCkpCisgICAgICAgICAgICBoZWlnaHQgPSBtYXhIZWlnaHQ7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIGhlaWdodCA9IGNlaWxmKHN0YXRpY19jYXN0PGZsb2F0Pih3aWR0aCkgLyBzdGF0
aWNfY2FzdDxmbG9hdD4oZGVmYXVsdExheW91dFdpZHRoKSAqIHN0YXRpY19jYXN0PGZsb2F0Pihk
ZWZhdWx0TGF5b3V0SGVpZ2h0KSk7CisgICAgICAgIHJldHVybiBJbnRTaXplKHdpZHRoLCBoZWln
aHQpOworICAgIH0KKworICAgIGlmIChtX3ZpZXdNb2RlID09IERlc2t0b3ApIHsKKyAgICAgICAg
Ly8gSWYgd2UgZGV0ZWN0IGFuIG92ZXJmbG93IGxhcmdlciB0aGFuIHRoZSBjb250ZW50cyBzaXpl
IHRoZW4gdXNlIHRoYXQgaW5zdGVhZCBzaW5jZQorICAgICAgICAvLyBpdCdsbCBzdGlsbCBiZSBj
bGFtcGVkIGJ5IHRoZSBtYXhXaWR0aCBiZWxvdy4uLgorICAgICAgICBpbnQgd2lkdGggPSBzdGQ6
Om1heChhYnNvbHV0ZVZpc2libGVPdmVyZmxvd1NpemUoKS53aWR0aCgpLCBjb250ZW50c1NpemUo
KS53aWR0aCgpKTsKKworICAgICAgICBpZiAoc25hcFRvSW5jcmVtZW50KSB7CisgICAgICAgICAg
ICAvLyBTbmFwIHRvIGluY3JlbWVudHMgb2YgZGVmYXVsdExheW91dFdpZHRoIC8gMi4wLgorICAg
ICAgICAgICAgZmxvYXQgZmFjdG9yID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHdpZHRoKSAvIChkZWZh
dWx0TGF5b3V0V2lkdGggLyAyLjApOworICAgICAgICAgICAgZmFjdG9yID0gY2VpbGYoZmFjdG9y
KTsKKyAgICAgICAgICAgIHdpZHRoID0gKGRlZmF1bHRMYXlvdXRXaWR0aCAvIDIuMCkgKiBmYWN0
b3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2lkdGggPCBtaW5XaWR0aCkKKyAgICAgICAg
ICAgIHdpZHRoID0gbWluV2lkdGg7CisgICAgICAgIGlmICh3aWR0aCA+IG1heFdpZHRoKQorICAg
ICAgICAgICAgd2lkdGggPSBtYXhXaWR0aDsKKyAgICAgICAgaW50IGhlaWdodCA9IGNlaWxmKHN0
YXRpY19jYXN0PGZsb2F0Pih3aWR0aCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oZGVmYXVsdExheW91
dFdpZHRoKSAqIHN0YXRpY19jYXN0PGZsb2F0PihkZWZhdWx0TGF5b3V0SGVpZ2h0KSk7CisgICAg
ICAgIHJldHVybiBJbnRTaXplKHdpZHRoLCBoZWlnaHQpOworICAgIH0KKworICAgIGlmIChtX3dl
YlNldHRpbmdzLT5pc1pvb21Ub0ZpdE9uTG9hZCgpKSB7CisgICAgICAgIC8vIFdlIG5lZWQgdG8g
Y2xhbXAgdGhlIGxheW91dCB3aWR0aCB0byB0aGUgbWluaW11bSBvZiB0aGUgbGF5b3V0CisgICAg
ICAgIC8vIHdpZHRoIG9yIHRoZSBjb250ZW50IHdpZHRoLiBUaGlzIGlzIGltcG9ydGFudCB1bmRl
ciByb3RhdGlvbiBmb3IgbW9iaWxlCisgICAgICAgIC8vIHdlYnNpdGVzLiBXZSB3YW50IHRoZSBw
YWdlIHRvIHJlbWFpbiBsYXlvdXRlZCBhdCB0aGUgc2FtZSB3aWR0aCB3aGljaAorICAgICAgICAv
LyBpdCB3YXMgbG9hZGVkIHdpdGgsIGFuZCBpbnN0ZWFkIGNoYW5nZSB0aGUgem9vbSBsZXZlbCB0
byBmaXQgdG8gc2NyZWVuLgorICAgICAgICAvLyBUaGUgaGVpZ2h0IGlzIHdlbGNvbWUgdG8gYWRh
cHQgdG8gdGhlIGhlaWdodCB1c2VkIGluIHRoZSBuZXcgb3JpZW50YXRpb24sCisgICAgICAgIC8v
IG90aGVyd2lzZSB3ZSB3aWxsIGdldCBhIGdyZXkgYmFyIGJlbG93IHRoZSB3ZWIgcGFnZS4KKyAg
ICAgICAgaWYgKG1fbWFpbkZyYW1lLT52aWV3KCkgJiYgIWNvbnRlbnRzU2l6ZSgpLmlzRW1wdHko
KSkKKyAgICAgICAgICAgIG1pbldpZHRoID0gY29udGVudHNTaXplKCkud2lkdGgoKTsKKyAgICAg
ICAgZWxzZSB7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBjb250ZW50cyB3aWR0aCwg
dXNlIHRoZSBtaW5pbXVtIG9mIHNjcmVlbiB3aWR0aAorICAgICAgICAgICAgLy8gYW5kIGxheW91
dCB3aWR0aCB0byBzaGFwZSB0aGUgZmlyc3QgbGF5b3V0IHRvIGEgY29udGVudHMgd2lkdGgKKyAg
ICAgICAgICAgIC8vIHRoYXQgd2UgY291bGQgcmVhc29uYWJseSB6b29tIHRvIGZpdCwgaW4gYSBt
YW5uZXIgdGhhdCB0YWtlcworICAgICAgICAgICAgLy8gb3JpZW50YXRpb24gaW50byBhY2NvdW50
IGFuZCBzdGlsbCByZXNwZWN0cyBhIHNtYWxsIGRlZmF1bHQKKyAgICAgICAgICAgIC8vIGxheW91
dCB3aWR0aC4KKyNpZiBFTkFCTEUoT1JJRU5UQVRJT05fRVZFTlRTKQorICAgICAgICAgICAgbWlu
V2lkdGggPSBtX21haW5GcmFtZS0+b3JpZW50YXRpb24oKSAlIDE4MAorICAgICAgICAgICAgICAg
ID8gUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OmhlaWdodCgpCisgICAgICAgICAgICAgICAg
OiBQbGF0Zm9ybTo6R3JhcGhpY3M6OlNjcmVlbjo6d2lkdGgoKTsKKyNlbHNlCisgICAgICAgICAg
ICBtaW5XaWR0aCA9IFBsYXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjp3aWR0aCgpOworI2VuZGlm
CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gSW50U2l6ZShzdGQ6Om1pbihtaW5XaWR0
aCwgZGVmYXVsdExheW91dFdpZHRoKSwgZGVmYXVsdExheW91dEhlaWdodCk7Cit9CisKK0JhY2tp
bmdTdG9yZUNsaWVudCogV2ViUGFnZVByaXZhdGU6OmJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1l
KGNvbnN0IEZyYW1lKiBmcmFtZSkgY29uc3QKK3sKKyAgICBBU1NFUlQoZnJhbWUpOworICAgIEJh
Y2tpbmdTdG9yZUNsaWVudCogYmFja2luZ1N0b3JlQ2xpZW50ID0gMDsKKyAgICBpZiAobV9iYWNr
aW5nU3RvcmVDbGllbnRGb3JGcmFtZU1hcC5jb250YWlucyhmcmFtZSkpCisgICAgICAgIGJhY2tp
bmdTdG9yZUNsaWVudCA9IG1fYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWVNYXAuZ2V0KGZyYW1l
KTsKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlQ2xpZW50OworfQorCit2b2lkIFdlYlBhZ2VQcml2
YXRlOjphZGRCYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZShjb25zdCBGcmFtZSogZnJhbWUsIEJh
Y2tpbmdTdG9yZUNsaWVudCogY2xpZW50KQoreworICAgIEFTU0VSVChmcmFtZSk7CisgICAgQVNT
RVJUKGNsaWVudCk7CisgICAgbV9iYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZU1hcC5hZGQoZnJh
bWUsIGNsaWVudCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnJlbW92ZUJhY2tpbmdTdG9y
ZUNsaWVudEZvckZyYW1lKGNvbnN0IEZyYW1lKiBmcmFtZSkKK3sKKyAgICBBU1NFUlQoZnJhbWUp
OworICAgIGlmIChtX2JhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lTWFwLmNvbnRhaW5zKGZyYW1l
KSkKKyAgICAgICAgbV9iYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZU1hcC5yZW1vdmUoZnJhbWUp
OworfQorCisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmNsZWFyRG9jdW1lbnREYXRhKGNvbnN0IERv
Y3VtZW50KiBkb2N1bWVudEdvaW5nQXdheSkKK3sKKyAgICBBU1NFUlQoZG9jdW1lbnRHb2luZ0F3
YXkpOworICAgIGlmIChtX2N1cnJlbnRDb250ZXh0Tm9kZSAmJiBtX2N1cnJlbnRDb250ZXh0Tm9k
ZS0+ZG9jdW1lbnQoKSA9PSBkb2N1bWVudEdvaW5nQXdheSkKKyAgICAgICAgbV9jdXJyZW50Q29u
dGV4dE5vZGUgPSAwOworCisgICAgaWYgKG1fY3VycmVudFBpbmNoWm9vbU5vZGUgJiYgbV9jdXJy
ZW50UGluY2hab29tTm9kZS0+ZG9jdW1lbnQoKSA9PSBkb2N1bWVudEdvaW5nQXdheSkKKyAgICAg
ICAgbV9jdXJyZW50UGluY2hab29tTm9kZSA9IDA7CisKKyAgICBpZiAobV9jdXJyZW50QmxvY2ta
b29tQWRqdXN0ZWROb2RlICYmIG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZS0+ZG9jdW1l
bnQoKSA9PSBkb2N1bWVudEdvaW5nQXdheSkKKyAgICAgICAgbV9jdXJyZW50QmxvY2tab29tQWRq
dXN0ZWROb2RlID0gMDsKKworICAgIGlmIChtX2luUmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2RlICYm
IG1faW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGUtPmRvY3VtZW50KCkgPT0gZG9jdW1lbnRHb2lu
Z0F3YXkpCisgICAgICAgIG1faW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGUgPSAwOworCisgICAg
Tm9kZSogbm9kZVVuZGVyRmF0RmluZ2VyID0gbV90b3VjaEV2ZW50SGFuZGxlci0+bGFzdEZhdEZp
bmdlcnNSZXN1bHQoKS52YWxpZE5vZGUoKTsKKyAgICBpZiAobm9kZVVuZGVyRmF0RmluZ2VyICYm
IG5vZGVVbmRlckZhdEZpbmdlci0+ZG9jdW1lbnQoKSA9PSBkb2N1bWVudEdvaW5nQXdheSkKKyAg
ICAgICAgbV90b3VjaEV2ZW50SGFuZGxlci0+cmVzZXRMYXN0RmF0RmluZ2Vyc1Jlc3VsdCgpOwor
CisgICAgLy8gTk9URTogbV9mdWxsc2NyZWVuVmlkZW9Ob2RlLCBtX2Z1bGxTY3JlZW5QbHVnaW5W
aWV3IGFuZCBtX3BsdWdpblZpZXdzCisgICAgLy8gYXJlIGNsZWFyZWQgaW4gb3RoZXIgbWV0aG9k
cyBhbHJlYWR5LgorfQorCit0eXBlZGVmIGJvb2wgKCpQcmVkaWNhdGVGdW5jdGlvbikoUmVuZGVy
TGF5ZXIqKTsKK3N0YXRpYyBib29sIGlzUG9zaXRpb25lZENvbnRhaW5lcihSZW5kZXJMYXllciog
bGF5ZXIpCit7CisgICAgUmVuZGVyT2JqZWN0KiBvID0gbGF5ZXItPnJlbmRlcmVyKCk7CisgICAg
cmV0dXJuIG8tPmlzUmVuZGVyVmlldygpIHx8IG8tPmlzUG9zaXRpb25lZCgpIHx8IG8tPmlzUmVs
UG9zaXRpb25lZCgpIHx8IGxheWVyLT5oYXNUcmFuc2Zvcm0oKTsKK30KKworc3RhdGljIGJvb2wg
aXNOb25SZW5kZXJWaWV3Rml4ZWRQb3NpdGlvbmVkQ29udGFpbmVyKFJlbmRlckxheWVyKiBsYXll
cikKK3sKKyAgICBSZW5kZXJPYmplY3QqIG8gPSBsYXllci0+cmVuZGVyZXIoKTsKKyAgICBpZiAo
by0+aXNSZW5kZXJWaWV3KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBv
LT5pc1Bvc2l0aW9uZWQoKSAmJiBvLT5zdHlsZSgpLT5wb3NpdGlvbigpID09IEZpeGVkUG9zaXRp
b247Cit9CisKK3N0YXRpYyBib29sIGlzRml4ZWRQb3NpdGlvbmVkQ29udGFpbmVyKFJlbmRlckxh
eWVyKiBsYXllcikKK3sKKyAgICBSZW5kZXJPYmplY3QqIG8gPSBsYXllci0+cmVuZGVyZXIoKTsK
KyAgICByZXR1cm4gby0+aXNSZW5kZXJWaWV3KCkgfHwgKG8tPmlzUG9zaXRpb25lZCgpICYmIG8t
PnN0eWxlKCktPnBvc2l0aW9uKCkgPT0gRml4ZWRQb3NpdGlvbik7Cit9CisKK3N0YXRpYyBSZW5k
ZXJMYXllciogZmluZEFuY2VzdG9yT3JTZWxmTm90TWF0Y2hpbmcoUHJlZGljYXRlRnVuY3Rpb24g
cHJlZGljYXRlLCBSZW5kZXJMYXllciogbGF5ZXIpCit7CisgICAgUmVuZGVyTGF5ZXIqIGN1cnIg
PSBsYXllcjsKKyAgICB3aGlsZSAoY3VyciAmJiAhcHJlZGljYXRlKGN1cnIpKQorICAgICAgICBj
dXJyID0gY3Vyci0+cGFyZW50KCk7CisKKyAgICByZXR1cm4gY3VycjsKK30KKworUmVuZGVyTGF5
ZXIqIFdlYlBhZ2VQcml2YXRlOjplbmNsb3NpbmdGaXhlZFBvc2l0aW9uZWRBbmNlc3Rvck9yU2Vs
ZklmRml4ZWRQb3NpdGlvbmVkKFJlbmRlckxheWVyKiBsYXllcikKK3sKKyAgICByZXR1cm4gZmlu
ZEFuY2VzdG9yT3JTZWxmTm90TWF0Y2hpbmcoJmlzRml4ZWRQb3NpdGlvbmVkQ29udGFpbmVyLCBs
YXllcik7Cit9CisKK1JlbmRlckxheWVyKiBXZWJQYWdlUHJpdmF0ZTo6ZW5jbG9zaW5nUG9zaXRp
b25lZEFuY2VzdG9yT3JTZWxmSWZQb3NpdGlvbmVkKFJlbmRlckxheWVyKiBsYXllcikKK3sKKyAg
ICByZXR1cm4gZmluZEFuY2VzdG9yT3JTZWxmTm90TWF0Y2hpbmcoJmlzUG9zaXRpb25lZENvbnRh
aW5lciwgbGF5ZXIpOworfQorCitzdGF0aWMgaW5saW5lIEZyYW1lKiBmcmFtZUZvck5vZGUoTm9k
ZSogbm9kZSkKK3sKKyAgICBOb2RlKiBvcmlnTm9kZSA9IG5vZGU7CisgICAgZm9yICg7IG5vZGU7
IG5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCkpIHsKKyAgICAgICAgaWYgKFJlbmRlck9iamVjdCog
cmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpKSB7CisgICAgICAgICAgICBpZiAocmVuZGVyZXIt
PmlzUmVuZGVyVmlldygpKSB7CisgICAgICAgICAgICAgICAgaWYgKEZyYW1lVmlldyogdmlldyA9
IHRvUmVuZGVyVmlldyhyZW5kZXJlciktPmZyYW1lVmlldygpKSB7CisgICAgICAgICAgICAgICAg
ICAgIGlmIChGcmFtZSogZnJhbWUgPSB2aWV3LT5mcmFtZSgpKQorICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGZyYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGlmIChyZW5kZXJlci0+aXNXaWRnZXQoKSkgeworICAgICAgICAgICAgICAgIFdp
ZGdldCogd2lkZ2V0ID0gdG9SZW5kZXJXaWRnZXQocmVuZGVyZXIpLT53aWRnZXQoKTsKKyAgICAg
ICAgICAgICAgICBpZiAod2lkZ2V0ICYmIHdpZGdldC0+aXNGcmFtZVZpZXcoKSkgeworICAgICAg
ICAgICAgICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4o
d2lkZ2V0KS0+ZnJhbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZTsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICBmb3IgKG5vZGUgPSBvcmlnTm9kZTsgbm9kZTsgbm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKSkg
eworICAgICAgICBpZiAoRG9jdW1lbnQqIGRvYyA9IG5vZGUtPmRvY3VtZW50KCkpIHsKKyAgICAg
ICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBkb2MtPmZyYW1lKCkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIGZyYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0
YXRpYyBJbnRSZWN0IGdldE5vZGVXaW5kb3dSZWN0KE5vZGUqIG5vZGUpCit7CisgICAgaWYgKEZy
YW1lKiBmcmFtZSA9IGZyYW1lRm9yTm9kZShub2RlKSkgeworICAgICAgICBpZiAoRnJhbWVWaWV3
KiB2aWV3ID0gZnJhbWUtPnZpZXcoKSkKKyAgICAgICAgICAgIHJldHVybiB2aWV3LT5jb250ZW50
c1RvV2luZG93KG5vZGUtPmdldFJlY3QoKSk7CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgIHJldHVybiBJbnRSZWN0KCk7Cit9CisKK0ludFJlY3QgV2ViUGFnZVByaXZhdGU6
OmdldFJlY3Vyc2l2ZVZpc2libGVXaW5kb3dSZWN0KFNjcm9sbFZpZXcqIHZpZXcsIGJvb2wgbm9D
bGlwT2ZNYWluRnJhbWUpCit7CisgICAgQVNTRVJUKG1fbWFpbkZyYW1lKTsKKworICAgIC8vIERv
bid0IGNhbGwgdGhpcyBmdW5jdGlvbiBhc2tpbmcgdG8gbm90IGNsaXAgdGhlIG1haW4gZnJhbWUg
cHJvdmlkaW5nIG9ubHkKKyAgICAvLyB0aGUgbWFpbiBmcmFtZS4gQWxsIHRoYXQgY2FuIGJlIHJl
dHVybmVkIGlzIHRoZSBjb250ZW50IHJlY3Qgd2hpY2gKKyAgICAvLyBpc24ndCB3aGF0IHRoaXMg
ZnVuY3Rpb24gaXMgZm9yLgorICAgIGlmIChub0NsaXBPZk1haW5GcmFtZSAmJiB2aWV3ID09IG1f
bWFpbkZyYW1lLT52aWV3KCkpIHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAg
ICAgIHJldHVybiBJbnRSZWN0KEludFBvaW50KDAsIDApLCB2aWV3LT5jb250ZW50c1NpemUoKSk7
CisgICAgfQorCisgICAgSW50UmVjdCB2aXNpYmxlV2luZG93UmVjdCh2aWV3LT5jb250ZW50c1Rv
V2luZG93KHZpZXctPnZpc2libGVDb250ZW50UmVjdChmYWxzZSkpKTsKKyAgICBpZiAodmlldy0+
cGFyZW50KCkgJiYgIShub0NsaXBPZk1haW5GcmFtZSAmJiB2aWV3LT5wYXJlbnQoKSA9PSBtX21h
aW5GcmFtZS0+dmlldygpKSkgeworICAgICAgICAvLyBJbnRlcnNlY3Qgd2l0aCBwYXJlbnQgdmlz
aWJsZSByZWN0LgorICAgICAgICB2aXNpYmxlV2luZG93UmVjdC5pbnRlcnNlY3QoZ2V0UmVjdXJz
aXZlVmlzaWJsZVdpbmRvd1JlY3Qodmlldy0+cGFyZW50KCksIG5vQ2xpcE9mTWFpbkZyYW1lKSk7
CisgICAgfQorICAgIHJldHVybiB2aXNpYmxlV2luZG93UmVjdDsKK30KKwordm9pZCBXZWJQYWdl
Ojphc3NpZ25Gb2N1cyhQbGF0Zm9ybTo6Rm9jdXNEaXJlY3Rpb24gZGlyZWN0aW9uKQoreworICAg
IGQtPmFzc2lnbkZvY3VzKGRpcmVjdGlvbik7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmFz
c2lnbkZvY3VzKFBsYXRmb3JtOjpGb2N1c0RpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisgICAgQVNT
RVJUKChpbnQpIFBsYXRmb3JtOjpGb2N1c0RpcmVjdGlvbk5vbmUgPT0gKGludCkgRm9jdXNEaXJl
Y3Rpb25Ob25lKTsKKyAgICBBU1NFUlQoKGludCkgUGxhdGZvcm06OkZvY3VzRGlyZWN0aW9uRm9y
d2FyZCA9PSAoaW50KSBGb2N1c0RpcmVjdGlvbkZvcndhcmQpOworICAgIEFTU0VSVCgoaW50KSBQ
bGF0Zm9ybTo6Rm9jdXNEaXJlY3Rpb25CYWNrd2FyZCA9PSAoaW50KSBGb2N1c0RpcmVjdGlvbkJh
Y2t3YXJkKTsKKworICAgIC8vIEZpcnN0IHdlIGNsZWFyIHRoZSBmb2N1cywgc2luY2Ugd2Ugd2Fu
dCB0byBmb2N1cyBlaXRoZXIgaW5pdGlhbCBvciB0aGUgbGFzdAorICAgIC8vIGZvY3VzYWJsZSBl
bGVtZW50IGluIHRoZSB3ZWJwYWdlIChhY2NvcmRpbmcgdG8gdGhlIFRBQklOREVYKSwgb3Igc2lt
cGx5IGNsZWFyCisgICAgLy8gdGhlIGZvY3VzLgorICAgIGNsZWFyRm9jdXNOb2RlKCk7CisKKyAg
ICBzd2l0Y2ggKGRpcmVjdGlvbikgeworICAgIGNhc2UgRm9jdXNEaXJlY3Rpb25Gb3J3YXJkOgor
ICAgIGNhc2UgRm9jdXNEaXJlY3Rpb25CYWNrd2FyZDoKKyAgICAgICAgbV9wYWdlLT5mb2N1c0Nv
bnRyb2xsZXIoKS0+c2V0SW5pdGlhbEZvY3VzKChGb2N1c0RpcmVjdGlvbikgZGlyZWN0aW9uLCAw
KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb2N1c0RpcmVjdGlvbk5vbmU6CisgICAgICAg
IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
IH0KK30KKworUGxhdGZvcm06OkludFJlY3QgV2ViUGFnZVByaXZhdGU6OmZvY3VzTm9kZVJlY3Qo
KQoreworICAgIEZyYW1lKiBmcmFtZSA9IGZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIGlmICgh
ZnJhbWUpCisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdCgpOworCisgICAgRG9jdW1l
bnQqIGRvYyA9IGZyYW1lLT5kb2N1bWVudCgpOworICAgIEZyYW1lVmlldyogdmlldyA9IGZyYW1l
LT52aWV3KCk7CisgICAgaWYgKCFkb2MgfHwgIXZpZXcgfHwgdmlldy0+bmVlZHNMYXlvdXQoKSkK
KyAgICAgICAgcmV0dXJuIFBsYXRmb3JtOjpJbnRSZWN0KCk7CisKKyAgICBJbnRSZWN0IGZvY3Vz
UmVjdCA9IHJlY3RGb3JOb2RlKGRvYy0+Zm9jdXNlZE5vZGUoKSk7CisgICAgZm9jdXNSZWN0ID0g
YWRqdXN0UmVjdE9mZnNldEZvckZyYW1lT2Zmc2V0KGZvY3VzUmVjdCwgZG9jLT5mb2N1c2VkTm9k
ZSgpKTsKKyAgICBmb2N1c1JlY3QgPSBtYXBUb1RyYW5zZm9ybWVkKGZvY3VzUmVjdCk7CisgICAg
Y2xpcFRvVHJhbnNmb3JtZWRDb250ZW50c1JlY3QoZm9jdXNSZWN0KTsKKyAgICByZXR1cm4gZm9j
dXNSZWN0OworfQorCitQYXNzUmVmUHRyPE5vZGU+IFdlYlBhZ2VQcml2YXRlOjpjb250ZXh0Tm9k
ZShUYXJnZXREZXRlY3Rpb25TdHJhdGVneSBzdHJhdGVneSkKK3sKKyAgICBFdmVudEhhbmRsZXIq
IGV2ZW50SGFuZGxlciA9IGZvY3VzZWRPck1haW5GcmFtZSgpLT5ldmVudEhhbmRsZXIoKTsKKyAg
ICBjb25zdCBGYXRGaW5nZXJzUmVzdWx0IGxhc3RGYXRGaW5nZXJzUmVzdWx0ID0gbV90b3VjaEV2
ZW50SGFuZGxlci0+bGFzdEZhdEZpbmdlcnNSZXN1bHQoKTsKKyAgICBib29sIGlzVG91Y2hpbmcg
PSBsYXN0RmF0RmluZ2Vyc1Jlc3VsdC5pc1ZhbGlkKCkgJiYgc3RyYXRlZ3kgPT0gUmVjdEJhc2Vk
OworCisgICAgLy8gVW5wcmVzcyB0aGUgbW91c2UgYnV0dG9uIGFsd2F5cy4KKyAgICBpZiAoZXZl
bnRIYW5kbGVyLT5tb3VzZVByZXNzZWQoKSkKKyAgICAgICAgZXZlbnRIYW5kbGVyLT5zZXRNb3Vz
ZVByZXNzZWQoZmFsc2UpOworCisgICAgLy8gQ2hlY2sgaWYgd2UncmUgdXNpbmcgTGlua1RvTGlu
ayBhbmQgdGhlIHVzZXIgaXMgbm90IHRvdWNoaW5nIHRoZSBzY3JlZW4uCisgICAgaWYgKG1fd2Vi
U2V0dGluZ3MtPmRvZXNHZXRGb2N1c05vZGVDb250ZXh0KCkgJiYgIWlzVG91Y2hpbmcpIHsKKyAg
ICAgICAgUmVmUHRyPE5vZGU+IG5vZGU7CisgICAgICAgIG5vZGUgPSBtX3BhZ2UtPmZvY3VzQ29u
dHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUo
KTsKKyAgICAgICAgaWYgKG5vZGUpIHsKKyAgICAgICAgICAgIEludFJlY3QgdmlzaWJsZVJlY3Qg
PSBJbnRSZWN0KEludFBvaW50KCksIGFjdHVhbFZpc2libGVTaXplKCkpOworICAgICAgICAgICAg
aWYgKCF2aXNpYmxlUmVjdC5pbnRlcnNlY3RzKGdldE5vZGVXaW5kb3dSZWN0KG5vZGUuZ2V0KCkp
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4g
bm9kZS5yZWxlYXNlKCk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIHRleHQgaW5wdXQuCisg
ICAgaWYgKGlzVG91Y2hpbmcgJiYgbGFzdEZhdEZpbmdlcnNSZXN1bHQuaXNUZXh0SW5wdXQoKSkK
KyAgICAgICAgcmV0dXJuIGxhc3RGYXRGaW5nZXJzUmVzdWx0LnZhbGlkTm9kZSgpOworCisgICAg
SW50UG9pbnQgY29udGVudFBvczsKKyAgICBpZiAoaXNUb3VjaGluZykKKyAgICAgICAgY29udGVu
dFBvcyA9IGxhc3RGYXRGaW5nZXJzUmVzdWx0LmFkanVzdGVkUG9zaXRpb24oKTsKKyAgICBlbHNl
CisgICAgICAgIGNvbnRlbnRQb3MgPSBtYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKG1fbGFzdE1v
dXNlRXZlbnQucG9zKCkpOworCisgICAgaWYgKHN0cmF0ZWd5ID09IFJlY3RCYXNlZCkgeworICAg
ICAgICBGYXRGaW5nZXJzUmVzdWx0IHJlc3VsdCA9IEZhdEZpbmdlcnModGhpcywgbGFzdEZhdEZp
bmdlcnNSZXN1bHQuYWRqdXN0ZWRQb3NpdGlvbigpLCBGYXRGaW5nZXJzOjpUZXh0KS5maW5kQmVz
dFBvaW50KCk7CisgICAgICAgIHJldHVybiByZXN1bHQudmFsaWROb2RlKCk7CisgICAgfQorCisg
ICAgSGl0VGVzdFJlc3VsdCByZXN1bHQgPSBldmVudEhhbmRsZXItPmhpdFRlc3RSZXN1bHRBdFBv
aW50KGNvbnRlbnRQb3MsIGZhbHNlIC8qYWxsb3dTaGFkb3dDb250ZW50Ki8pOworICAgIHJldHVy
biByZXN1bHQuaW5uZXJOb2RlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRpc3RhbmNlQmV0
d2VlblBvaW50cyhJbnRQb2ludCBwMSwgSW50UG9pbnQgcDIpCit7CisgICAgLy8gQ2hhbmdlIGlu
dCB0byBkb3VibGUsIGJlY2F1c2UgKGR5ICogZHkpIGNhbiBjYXVzZSBpbnQgb3ZlcmZsb3cgaW4g
cmVhbGl0eSwgZS5nLCAoLTQ2NzA5ICogLTQ2NzA5KS4KKyAgICBkb3VibGUgZHggPSBzdGF0aWNf
Y2FzdDxkb3VibGU+KHAxLngoKSAtIHAyLngoKSk7CisgICAgZG91YmxlIGR5ID0gc3RhdGljX2Nh
c3Q8ZG91YmxlPihwMS55KCkgLSBwMi55KCkpOworICAgIHJldHVybiBzcXJ0KChkeCAqIGR4KSAr
IChkeSAqIGR5KSk7Cit9CisKK05vZGUqIFdlYlBhZ2VQcml2YXRlOjpiZXN0Tm9kZUZvclpvb21V
bmRlclBvaW50KGNvbnN0IEludFBvaW50JiBwb2ludCkKK3sKKyAgICBJbnRQb2ludCBwdCA9IG1h
cEZyb21UcmFuc2Zvcm1lZChwb2ludCk7CisgICAgSW50UmVjdCBjbGlja1JlY3QocHQueCgpIC0g
YmxvY2tDbGlja1JhZGl1cywgcHQueSgpIC0gYmxvY2tDbGlja1JhZGl1cywgMiAqIGJsb2NrQ2xp
Y2tSYWRpdXMsIDIgKiBibG9ja0NsaWNrUmFkaXVzKTsKKyAgICBOb2RlKiBvcmlnaW5hbE5vZGUg
PSBub2RlRm9yWm9vbVVuZGVyUG9pbnQocG9pbnQpOworICAgIGlmICghb3JpZ2luYWxOb2RlKQor
ICAgICAgICByZXR1cm4gMDsKKyAgICBOb2RlKiBub2RlID0gYmVzdENoaWxkTm9kZUZvckNsaWNr
UmVjdChvcmlnaW5hbE5vZGUsIGNsaWNrUmVjdCk7CisgICAgcmV0dXJuIG5vZGUgPyBhZGp1c3Rl
ZEJsb2NrWm9vbU5vZGVGb3Jab29tTGltaXRzKG5vZGUpIDogYWRqdXN0ZWRCbG9ja1pvb21Ob2Rl
Rm9yWm9vbUxpbWl0cyhvcmlnaW5hbE5vZGUpOworfQorCitOb2RlKiBXZWJQYWdlUHJpdmF0ZTo6
YmVzdENoaWxkTm9kZUZvckNsaWNrUmVjdChOb2RlKiBwYXJlbnROb2RlLCBjb25zdCBJbnRSZWN0
JiBjbGlja1JlY3QpCit7CisgICAgaWYgKCFwYXJlbnROb2RlKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIGludCBiZXN0RGlzdGFuY2UgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgp
OworCisgICAgTm9kZSogbm9kZSA9IHBhcmVudE5vZGUtPmZpcnN0Q2hpbGQoKTsKKyAgICBOb2Rl
KiBiZXN0Tm9kZSA9IDA7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgSW50UmVjdCByZWN0
ID0gcmVjdEZvck5vZGUobm9kZSk7CisgICAgICAgIGlmIChjbGlja1JlY3QuaW50ZXJzZWN0cyhy
ZWN0KSkgeworICAgICAgICAgICAgaW50IGRpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRz
KHJlY3QuY2VudGVyKCksIGNsaWNrUmVjdC5jZW50ZXIoKSk7CisgICAgICAgICAgICBOb2RlKiBi
ZXN0Q2hpbGROb2RlID0gYmVzdENoaWxkTm9kZUZvckNsaWNrUmVjdChub2RlLCBjbGlja1JlY3Qp
OworICAgICAgICAgICAgaWYgKGJlc3RDaGlsZE5vZGUpIHsKKyAgICAgICAgICAgICAgICBJbnRS
ZWN0IGJlc3RDaGlsZFJlY3QgPSByZWN0Rm9yTm9kZShiZXN0Q2hpbGROb2RlKTsKKyAgICAgICAg
ICAgICAgICBpbnQgYmVzdENoaWxkRGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludHMoYmVz
dENoaWxkUmVjdC5jZW50ZXIoKSwgY2xpY2tSZWN0LmNlbnRlcigpKTsKKyAgICAgICAgICAgICAg
ICBpZiAoYmVzdENoaWxkRGlzdGFuY2UgPCBkaXN0YW5jZSAmJiBiZXN0Q2hpbGREaXN0YW5jZSA8
IGJlc3REaXN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICBiZXN0Tm9kZSA9IGJlc3RDaGls
ZE5vZGU7CisgICAgICAgICAgICAgICAgICAgIGJlc3REaXN0YW5jZSA9IGJlc3RDaGlsZERpc3Rh
bmNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChk
aXN0YW5jZSA8IGJlc3REaXN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE5v
ZGUgPSBub2RlOworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdERpc3RhbmNlID0gZGlzdGFu
Y2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkg
eworICAgICAgICAgICAgICAgICAgICBiZXN0Tm9kZSA9IG5vZGU7CisgICAgICAgICAgICAgICAg
ICAgIGJlc3REaXN0YW5jZSA9IGRpc3RhbmNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dFNpYmxpbmcoKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gYmVzdE5vZGU7Cit9CisKK2RvdWJsZSBXZWJQYWdlUHJpdmF0ZTo6
bWF4QmxvY2tab29tU2NhbGUoKSBjb25zdAoreworICAgIHJldHVybiBzdGQ6Om1pbihtYXhpbXVt
QmxvY2tab29tU2NhbGUsIG1heGltdW1TY2FsZSgpKTsKK30KKworTm9kZSogV2ViUGFnZVByaXZh
dGU6Om5vZGVGb3Jab29tVW5kZXJQb2ludChjb25zdCBJbnRQb2ludCYgcG9pbnQpCit7CisgICAg
aWYgKCFtX21haW5GcmFtZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBIaXRUZXN0UmVzdWx0
IHJlc3VsdCA9IG1fbWFpbkZyYW1lLT5ldmVudEhhbmRsZXIoKS0+aGl0VGVzdFJlc3VsdEF0UG9p
bnQobWFwRnJvbVRyYW5zZm9ybWVkKHBvaW50KSwgZmFsc2UpOworCisgICAgTm9kZSogbm9kZSA9
IHJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKTsKKworICAgIGlmICghbm9kZSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIo
KTsKKyAgICB3aGlsZSAoIXJlbmRlcmVyKSB7CisgICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnRO
b2RlKCk7CisgICAgICAgIHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKTsKKyAgICB9CisKKyAg
ICByZXR1cm4gbm9kZTsKK30KKworTm9kZSogV2ViUGFnZVByaXZhdGU6OmFkanVzdGVkQmxvY2ta
b29tTm9kZUZvclpvb21MaW1pdHMoTm9kZSogbm9kZSkKK3sKKyAgICBOb2RlKiBpbml0aWFsTm9k
ZSA9IG5vZGU7CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7
CisgICAgYm9vbCBhY2NlcHRhYmxlTm9kZVNpemUgPSBuZXdTY2FsZUZvckJsb2NrWm9vbVJlY3Qo
cmVjdEZvck5vZGUobm9kZSksIDEuMCwgMCkgPCBtYXhCbG9ja1pvb21TY2FsZSgpOworCisgICAg
d2hpbGUgKCFyZW5kZXJlciB8fCAhYWNjZXB0YWJsZU5vZGVTaXplKSB7CisgICAgICAgIG5vZGUg
PSBub2RlLT5wYXJlbnROb2RlKCk7CisKKyAgICAgICAgaWYgKCFub2RlKQorICAgICAgICAgICAg
cmV0dXJuIGluaXRpYWxOb2RlOworCisgICAgICAgIHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIo
KTsKKyAgICAgICAgYWNjZXB0YWJsZU5vZGVTaXplID0gbmV3U2NhbGVGb3JCbG9ja1pvb21SZWN0
KHJlY3RGb3JOb2RlKG5vZGUpLCAxLjAsIDApIDwgbWF4QmxvY2tab29tU2NhbGUoKTsKKyAgICB9
CisKKyAgICByZXR1cm4gbm9kZTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6Y29tcGFyZU5v
ZGVzRm9yQmxvY2tab29tKE5vZGUqIG4xLCBOb2RlKiBuMikKK3sKKyAgICBpZiAoIW4xIHx8ICFu
MikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIChuMiA9PSBuMSkgfHwgbjIt
PmlzRGVzY2VuZGFudE9mKG4xKTsKK30KKworZG91YmxlIFdlYlBhZ2VQcml2YXRlOjpuZXdTY2Fs
ZUZvckJsb2NrWm9vbVJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCwgZG91YmxlIG9sZFNjYWxlLCBk
b3VibGUgbWFyZ2luKQoreworICAgIGlmIChyZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6bWF4KCk7CisKKyAgICBBU1NFUlQocmVjdC53
aWR0aCgpICsgbWFyZ2luKTsKKworICAgIGRvdWJsZSBuZXdTY2FsZSA9IG9sZFNjYWxlICogc3Rh
dGljX2Nhc3Q8ZG91YmxlPih0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKCkud2lkdGgoKSkg
LyAocmVjdC53aWR0aCgpICsgbWFyZ2luKTsKKworICAgIHJldHVybiBuZXdTY2FsZTsKK30KKwor
SW50UmVjdCBXZWJQYWdlUHJpdmF0ZTo6cmVjdEZvck5vZGUoTm9kZSogbm9kZSkKK3sKKyAgICBp
ZiAoIW5vZGUpCisgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CisKKyAgICBSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKTsKKworICAgIGlmICghcmVuZGVyZXIpCisgICAg
ICAgIHJldHVybiBJbnRSZWN0KCk7CisKKyAgICAvLyBSZXR1cm4gcmVjdCBpbiB1bi10cmFuc2Zv
cm1lZCBjb250ZW50IGNvb3JkaW5hdGVzLgorICAgIEludFJlY3QgYmxvY2tSZWN0OworCisgICAg
Ly8gRklYTUU6IEVuc3VyZSB0aGlzIHdvcmtzIHdpdGggaWZyYW1lcy4KKyAgICBpZiAobV93ZWJQ
YWdlLT5zZXR0aW5ncygpLT50ZXh0UmVmbG93TW9kZSgpID09IFdlYlNldHRpbmdzOjpUZXh0UmVm
bG93RW5hYmxlZCAmJiByZW5kZXJlci0+aXNUZXh0KCkpIHsKKyAgICAgICAgUmVuZGVyQmxvY2sq
IHJlbmRlckJsb2NrID0gcmVuZGVyZXItPmNvbnRhaW5pbmdCbG9jaygpOworICAgICAgICBpbnQg
eE9mZnNldCA9IDA7CisgICAgICAgIGludCB5T2Zmc2V0ID0gMDsKKyAgICAgICAgd2hpbGUgKCFy
ZW5kZXJCbG9jay0+aXNSb290KCkpIHsKKyAgICAgICAgICAgIHhPZmZzZXQgKz0gcmVuZGVyQmxv
Y2stPngoKTsKKyAgICAgICAgICAgIHlPZmZzZXQgKz0gcmVuZGVyQmxvY2stPnkoKTsKKyAgICAg
ICAgICAgIHJlbmRlckJsb2NrID0gcmVuZGVyQmxvY2stPmNvbnRhaW5pbmdCbG9jaygpOworICAg
ICAgICB9CisgICAgICAgIGNvbnN0IFJlbmRlclRleHQqIHJlbmRlclRleHQgPSB0b1JlbmRlclRl
eHQocmVuZGVyZXIpOworICAgICAgICBJbnRSZWN0IGxpbmVzQm94ID0gcmVuZGVyVGV4dC0+bGlu
ZXNCb3VuZGluZ0JveCgpOworICAgICAgICBibG9ja1JlY3QgPSBJbnRSZWN0KHhPZmZzZXQgKyBs
aW5lc0JveC54KCksIHlPZmZzZXQgKyBsaW5lc0JveC55KCksIGxpbmVzQm94LndpZHRoKCksIGxp
bmVzQm94LmhlaWdodCgpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgYmxvY2tSZWN0ID0gcmVuZGVy
ZXItPmFic29sdXRlQ2xpcHBlZE92ZXJmbG93UmVjdCgpOworCisgICAgaWYgKHJlbmRlcmVyLT5p
c1RleHQoKSkgeworICAgICAgICBSZW5kZXJCbG9jayogcmIgPSByZW5kZXJlci0+Y29udGFpbmlu
Z0Jsb2NrKCk7CisKKyAgICAgICAgLy8gSW5lZmZpY2llbnQ/IFdheSB0byBmaW5kIHdpZHRoIHdo
ZW4gZmxvYXRzIGludGVyc2VjdCBhIGJsb2NrLgorICAgICAgICBpbnQgYmxvY2tXaWR0aCA9IDA7
CisgICAgICAgIGludCBsaW5lQ291bnQgPSByYi0+bGluZUNvdW50KCk7CisgICAgICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspCisgICAgICAgICAgICBibG9ja1dpZHRoID0g
bWF4KGJsb2NrV2lkdGgsIHJiLT5hdmFpbGFibGVMb2dpY2FsV2lkdGhGb3JMaW5lKGksIGZhbHNl
KSk7CisKKyAgICAgICAgYmxvY2tSZWN0LnNldFdpZHRoKGJsb2NrV2lkdGgpOworICAgICAgICBi
bG9ja1JlY3Quc2V0WChibG9ja1JlY3QueCgpICsgcmItPmxvZ2ljYWxMZWZ0T2Zmc2V0Rm9yTGlu
ZSgxLCBmYWxzZSkpOworICAgIH0KKworICAgIC8vIFN0cmlwIG9mZiBwYWRkaW5nLgorICAgIGlm
IChyZW5kZXJlci0+c3R5bGUoKS0+aGFzUGFkZGluZygpKSB7CisgICAgICAgIGJsb2NrUmVjdC5z
ZXRYKGJsb2NrUmVjdC54KCkgKyByZW5kZXJlci0+c3R5bGUoKS0+cGFkZGluZ0xlZnQoKS52YWx1
ZSgpKTsKKyAgICAgICAgYmxvY2tSZWN0LnNldFkoYmxvY2tSZWN0LnkoKSArIHJlbmRlcmVyLT5z
dHlsZSgpLT5wYWRkaW5nVG9wKCkudmFsdWUoKSk7CisgICAgICAgIGJsb2NrUmVjdC5zZXRXaWR0
aChibG9ja1JlY3Qud2lkdGgoKSAtIHJlbmRlcmVyLT5zdHlsZSgpLT5wYWRkaW5nUmlnaHQoKS52
YWx1ZSgpKTsKKyAgICAgICAgYmxvY2tSZWN0LnNldEhlaWdodChibG9ja1JlY3QuaGVpZ2h0KCkg
LSByZW5kZXJlci0+c3R5bGUoKS0+cGFkZGluZ0JvdHRvbSgpLnZhbHVlKCkpOworICAgIH0KKwor
ICAgIHJldHVybiBibG9ja1JlY3Q7Cit9CisKK0ludFBvaW50IFdlYlBhZ2VQcml2YXRlOjpmcmFt
ZU9mZnNldChjb25zdCBGcmFtZSogZnJhbWUpIGNvbnN0Cit7CisgICAgQVNTRVJUKGZyYW1lKTsK
KworICAgIC8vIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgd2hlbiBwYWdlIGlz
IGJlaW5nIGRlc3Ryb3llZCBhbmQgSlMgdHJpZ2dlcnMgc2VsZWN0aW9uIGNoYW5nZS4KKyAgICAv
LyBXZSBjb3VsZCBicmVhayB0aGUgY2FsbCBjaGFpbiBhdCB1cHBlciBsZXZlbHMsIGJ1dCBJIHRo
aW5rIGl0IGlzIGJldHRlciB0byBjaGVjayB0aGUgZnJhbWUgcG9pbnRlcgorICAgIC8vIGhlcmUg
YmVjYXVzZSB0aGUgcG9pbnRlciBpcyBleHBsaWNpdGx5IGNsZWFyZWQgaW4gV2ViUGFnZTo6ZGVz
dHJveSgpLgorICAgIGlmICghbWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybiBJbnRQb2ludCgp
OworCisgICAgLy8gQ29udmVydCAwLDAgaW4gdGhlIGZyYW1lJ3MgY29vcmRpbmF0ZSBzeXN0ZW0g
dG8gd2luZG93IGNvb3JkaW5hdGVzIHRvCisgICAgLy8gZ2V0IHRoZSBmcmFtZSdzIGdsb2JhbCBw
b3NpdGlvbiwgYW5kIHJldHVybiB0aGlzIHBvc2l0aW9uIGluIHRoZSBtYWluCisgICAgLy8gZnJh
bWUncyBjb29yZGluYXRlcy4gIChTbyB0aGUgbWFpbiBmcmFtZSdzIGNvb3JkaW5hdGVzIHdpbGwg
YmUgMCwwLikKKyAgICByZXR1cm4gbWFpbkZyYW1lKCktPnZpZXcoKS0+d2luZG93VG9Db250ZW50
cyhmcmFtZS0+dmlldygpLT5jb250ZW50c1RvV2luZG93KEludFBvaW50Ojp6ZXJvKCkpKTsKK30K
KworSW50UmVjdCBXZWJQYWdlUHJpdmF0ZTo6YWRqdXN0UmVjdE9mZnNldEZvckZyYW1lT2Zmc2V0
KGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0IE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFub2Rl
KQorICAgICAgICByZXR1cm4gcmVjdDsKKworICAgIC8vIEFkanVzdCB0aGUgb2Zmc2V0IG9mIHRo
ZSByZWN0IGlmIGl0IGlzIGluIGFuIGlGcmFtZS9mcmFtZSBvciBzZXQgb2YgaUZyYW1lcy9mcmFt
ZXMuCisgICAgLy8gRklYTUU6IGNhbiB3ZSBqdXN0IHVzZSBmcmFtZU9mZnNldCBpbnN0ZWFkIG9m
IHRoaXMgYmlnIHJvdXRpbmU/CisgICAgY29uc3QgTm9kZSogdG5vZGUgPSBub2RlOworICAgIElu
dFJlY3QgYWRqdXN0ZWRSZWN0ID0gcmVjdDsKKyAgICBkbyB7CisgICAgICAgIEZyYW1lKiBmcmFt
ZSA9IHRub2RlLT5kb2N1bWVudCgpLT5mcmFtZSgpOworICAgICAgICBpZiAoZnJhbWUpIHsKKyAg
ICAgICAgICAgIE5vZGUqIG93bmVyTm9kZSA9IHN0YXRpY19jYXN0PE5vZGUqPihmcmFtZS0+b3du
ZXJFbGVtZW50KCkpOworICAgICAgICAgICAgdG5vZGUgPSBvd25lck5vZGU7CisgICAgICAgICAg
ICBpZiAob3duZXJOb2RlICYmIChvd25lck5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjppZnJh
bWVUYWcpIHx8IG93bmVyTm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmZyYW1lVGFnKSkpIHsK
KyAgICAgICAgICAgICAgICBJbnRSZWN0IGlGcmFtZVJlY3Q7CisgICAgICAgICAgICAgICAgZG8g
eworICAgICAgICAgICAgICAgICAgICBpRnJhbWVSZWN0ID0gcmVjdEZvck5vZGUob3duZXJOb2Rl
KTsKKyAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRSZWN0Lm1vdmUoaUZyYW1lUmVjdC54KCks
IGlGcmFtZVJlY3QueSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRSZWN0LmludGVy
c2VjdChpRnJhbWVSZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgb3duZXJOb2RlID0gb3duZXJO
b2RlLT5wYXJlbnROb2RlKCk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoaUZyYW1lUmVjdC5p
c0VtcHR5KCkgJiYgb3duZXJOb2RlKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAodG5vZGUgPSB0bm9kZS0+cGFyZW50
Tm9kZSgpKTsKKworICAgIHJldHVybiBhZGp1c3RlZFJlY3Q7Cit9CisKK0ludFJlY3QgV2ViUGFn
ZVByaXZhdGU6OmJsb2NrWm9vbVJlY3RGb3JOb2RlKE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFu
b2RlIHx8IGNvbnRlbnRzU2l6ZSgpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIEludFJlY3Qo
KTsKKworICAgIE5vZGUqIHRub2RlID0gbm9kZTsKKyAgICBtX2N1cnJlbnRCbG9ja1pvb21BZGp1
c3RlZE5vZGUgPSB0bm9kZTsKKworICAgIEludFJlY3QgYmxvY2tSZWN0ID0gcmVjdEZvck5vZGUo
dG5vZGUpOworICAgIEludFJlY3Qgb3JpZ2luYWxSZWN0ID0gYmxvY2tSZWN0OworCisgICAgaW50
IG9yaWdpbmFsQXJlYSA9IG9yaWdpbmFsUmVjdC53aWR0aCgpICogb3JpZ2luYWxSZWN0LmhlaWdo
dCgpOworICAgIGludCBwYWdlQXJlYSA9IGNvbnRlbnRzU2l6ZSgpLndpZHRoKCkgKiBjb250ZW50
c1NpemUoKS5oZWlnaHQoKTsKKyAgICBkb3VibGUgYmxvY2tUb1BhZ2VSYXRpbyA9IHN0YXRpY19j
YXN0PGRvdWJsZT4oMSAtIG9yaWdpbmFsQXJlYSAvIHBhZ2VBcmVhKTsKKyAgICBkb3VibGUgYmxv
Y2tFeHBhbnNpb25SYXRpbyA9IDUuMCAqIGJsb2NrVG9QYWdlUmF0aW8gKiBibG9ja1RvUGFnZVJh
dGlvOworCisgICAgaWYgKCF0bm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmltZ1RhZykgJiYg
IXRub2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aW5wdXRUYWcpICYmICF0bm9kZS0+aGFzVGFn
TmFtZShIVE1MTmFtZXM6OnRleHRhcmVhVGFnKSkKKyAgICAgICAgd2hpbGUgKHRub2RlID0gdG5v
ZGUtPnBhcmVudE5vZGUoKSkgeworICAgICAgICAgICAgQVNTRVJUKHRub2RlKTsKKyAgICAgICAg
ICAgIEludFJlY3QgdFJlY3QgPSByZWN0Rm9yTm9kZSh0bm9kZSk7CisgICAgICAgICAgICBpbnQg
dGVtcEJsb2NrQXJlYSA9IHRSZWN0LndpZHRoKCkgKiB0UmVjdC5oZWlnaHQoKTsKKyAgICAgICAg
ICAgIC8vIERvbid0IGV4cGFuZCB0aGUgYmxvY2sgaWYgaXQgd2lsbCBiZSB0b28gbGFyZ2UgcmVs
YXRpdmUgdG8gdGhlIGNvbnRlbnQuCisgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8ZG91Ymxl
PigxIC0gdGVtcEJsb2NrQXJlYSAvIHBhZ2VBcmVhKSA8IG1pbmltdW1FeHBhbmRpbmdSYXRpbykK
KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICh0UmVjdC5pc0VtcHR5KCkp
CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIE5vIHJlbmRlcmVyLgorICAgICAgICAgICAg
aWYgKHRlbXBCbG9ja0FyZWEgPCAxLjEgKiBvcmlnaW5hbEFyZWEpCisgICAgICAgICAgICAgICAg
Y29udGludWU7IC8vIFRoZSBzaXplIG9mIHRoaXMgcGFyZW50IGlzIHZlcnkgY2xvc2UgdG8gdGhl
IGNoaWxkLCBubyBuZWVkIHRvIGdvIHRvIHRoaXMgcGFyZW50LgorICAgICAgICAgICAgLy8gRG9u
J3QgZXhwYW5kIHRoZSBibG9jayBpZiB0aGUgcGFyZW50IG5vZGUgc2l6ZSBpcyBhbHJlYWR5IGFs
bW9zdCB0aGUgc2l6ZSBvZiBhY3R1YWwgdmlzaWJsZSBzaXplLgorICAgICAgICAgICAgSW50U2l6
ZSBhY3R1YWxTaXplID0gYWN0dWFsVmlzaWJsZVNpemUoKTsKKyAgICAgICAgICAgIGlmIChzdGF0
aWNfY2FzdDxkb3VibGU+KDEgLSB0UmVjdC53aWR0aCgpIC8gYWN0dWFsU2l6ZS53aWR0aCgpKSA8
IG1pbmltdW1FeHBhbmRpbmdSYXRpbykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIGlmICh0ZW1wQmxvY2tBcmVhIDwgYmxvY2tFeHBhbnNpb25SYXRpbyAqIG9yaWdpbmFsQXJl
YSkgeworICAgICAgICAgICAgICAgIGJsb2NrUmVjdCA9IHRSZWN0OworICAgICAgICAgICAgICAg
IG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZSA9IHRub2RlOworICAgICAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGJsb2NrUmVjdCA9
IGFkanVzdFJlY3RPZmZzZXRGb3JGcmFtZU9mZnNldChibG9ja1JlY3QsIG5vZGUpOworICAgIGJs
b2NrUmVjdCA9IG1hcFRvVHJhbnNmb3JtZWQoYmxvY2tSZWN0KTsKKyAgICBjbGlwVG9UcmFuc2Zv
cm1lZENvbnRlbnRzUmVjdChibG9ja1JlY3QpOworCisjaWYgREVCVUdfQkxPQ0tfWk9PTQorICAg
IC8vIFJlLXBhaW50IHRoZSBiYWNraW5nc3RvcmUgdG8gc2NyZWVuIHRvIGVyYXNlIG90aGVyIGFu
bm90YXRpb25zLgorICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXN1bWVTY3JlZW5BbmRCYWNraW5n
U3RvcmVVcGRhdGVzKEJhY2tpbmdTdG9yZTo6QmxpdCk7CisKKyAgICAvLyBSZW5kZXIgYSBibGFj
ayBzcXVhcmUgb3ZlciB0aGUgY2FsY3VsYXRlZCBibG9jayBhbmQgYSBncmF5IHNxdWFyZSBvdmVy
IHRoZSBvcmlnaW5hbCBibG9jayBmb3IgdmlzdWFsIGluc3BlY3Rpb24uCisgICAgb3JpZ2luYWxS
ZWN0ID0gbWFwVG9UcmFuc2Zvcm1lZChvcmlnaW5hbFJlY3QpOworICAgIGNsaXBUb1RyYW5zZm9y
bWVkQ29udGVudHNSZWN0KG9yaWdpbmFsUmVjdCk7CisgICAgSW50UmVjdCByZW5kZXJSZWN0ID0g
bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQoYmxvY2tSZWN0
KTsKKyAgICBJbnRSZWN0IG9yaWdpbmFsUmVuZGVyUmVjdCA9IG1hcEZyb21UcmFuc2Zvcm1lZENv
bnRlbnRzVG9UcmFuc2Zvcm1lZFZpZXdwb3J0KG9yaWdpbmFsUmVjdCk7CisgICAgSW50U2l6ZSB2
aWV3cG9ydFNpemUgPSB0cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpOworICAgIHJlbmRlclJlY3Qu
aW50ZXJzZWN0KEludFJlY3QoMCwgMCwgdmlld3BvcnRTaXplLndpZHRoKCksIHZpZXdwb3J0U2l6
ZS5oZWlnaHQoKSkpOworICAgIG9yaWdpbmFsUmVuZGVyUmVjdC5pbnRlcnNlY3QoSW50UmVjdCgw
LCAwLCB2aWV3cG9ydFNpemUud2lkdGgoKSwgdmlld3BvcnRTaXplLmhlaWdodCgpKSk7CisgICAg
bV9iYWNraW5nU3RvcmUtPmQtPmNsZWFyV2luZG93KHJlbmRlclJlY3QsIDAsIDAsIDApOworICAg
IG1fYmFja2luZ1N0b3JlLT5kLT5jbGVhcldpbmRvdyhvcmlnaW5hbFJlbmRlclJlY3QsIDEyMCwg
MTIwLCAxMjApOworICAgIG1fYmFja2luZ1N0b3JlLT5kLT5pbnZhbGlkYXRlV2luZG93KHJlbmRl
clJlY3QpOworI2VuZGlmCisKKyAgICByZXR1cm4gYmxvY2tSZWN0OworfQorCit2b2lkIFdlYlBh
Z2U6OmJsb2NrWm9vbUFuaW1hdGlvbkZpbmlzaGVkKCkKK3sKKyAgICBkLT56b29tQmxvY2soKTsK
K30KKworLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4KKy8v
IEl0IGlzIGNhbGxlZCBhZnRlciB0aGUgYW5pbWF0aW9uIGVuZHMgKHNlZSBhYm92ZSkuCit2b2lk
IFdlYlBhZ2VQcml2YXRlOjp6b29tQmxvY2soKQoreworICAgIGlmICghbV9tYWluRnJhbWUpCisg
ICAgICAgIHJldHVybjsKKworICAgIEludFBvaW50IGFuY2hvcihyb3VuZFVudHJhbnNmb3JtZWRQ
b2ludChtYXBGcm9tVHJhbnNmb3JtZWRGbG9hdFBvaW50KG1fZmluYWxCbG9ja1BvaW50KSkpOwor
ICAgIGJvb2wgd2lsbFVzZVRleHRSZWZsb3cgPSBmYWxzZTsKKworI2lmIEVOQUJMRShWSUVXUE9S
VF9SRUZMT1cpCisgICAgd2lsbFVzZVRleHRSZWZsb3cgPSBtX3dlYlBhZ2UtPnNldHRpbmdzKCkt
PnRleHRSZWZsb3dNb2RlKCkgIT0gV2ViU2V0dGluZ3M6OlRleHRSZWZsb3dEaXNhYmxlZDsKKyAg
ICB0b2dnbGVUZXh0UmVmbG93SWZFbmFibGVkRm9yQmxvY2tab29tT25seShtX3Nob3VsZFJlZmxv
d0Jsb2NrKTsKKyAgICBzZXROZWVkc0xheW91dCgpOworI2VuZGlmCisKKyAgICBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCB6b29tOworICAgIHpvb20uc2NhbGUobV9ibG9ja1pvb21GaW5hbFNjYWxlKTsK
KyAgICAqbV90cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IHpvb207CisgICAgbV9jbGllbnQtPnJlc2V0
Qml0bWFwWm9vbVNjYWxlKG1fYmxvY2tab29tRmluYWxTY2FsZSk7CisgICAgbV9iYWNraW5nU3Rv
cmUtPmQtPnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7CisgICAgdXBkYXRl
Vmlld3BvcnRTaXplKCk7CisKKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9XKQorICAgIHJlcXVl
c3RMYXlvdXRJZk5lZWRlZCgpOworICAgIGlmICh3aWxsVXNlVGV4dFJlZmxvdyAmJiBtX3Nob3Vs
ZFJlZmxvd0Jsb2NrKSB7CisgICAgICAgIEludFJlY3QgcmVmbG93ZWRSZWN0ID0gcmVjdEZvck5v
ZGUobV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlLmdldCgpKTsKKyAgICAgICAgcmVmbG93
ZWRSZWN0ID0gYWRqdXN0UmVjdE9mZnNldEZvckZyYW1lT2Zmc2V0KHJlZmxvd2VkUmVjdCwgbV9j
dXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlLmdldCgpKTsKKyAgICAgICAgcmVmbG93ZWRSZWN0
Lm1vdmUocm91bmRUcmFuc2Zvcm1lZFBvaW50KG1fZmluYWxCbG9ja1BvaW50UmVmbG93T2Zmc2V0
KS54KCksIHJvdW5kVHJhbnNmb3JtZWRQb2ludChtX2ZpbmFsQmxvY2tQb2ludFJlZmxvd09mZnNl
dCkueSgpKTsKKyAgICAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG1fY3VycmVudEJsb2Nr
Wm9vbUFkanVzdGVkTm9kZS0+cmVuZGVyZXIoKTsKKyAgICAgICAgSW50UG9pbnQgdG9wTGVmdFBv
aW50KHJlZmxvd2VkUmVjdC5sb2NhdGlvbigpKTsKKyAgICAgICAgaWYgKHJlbmRlcmVyICYmIHJl
bmRlcmVyLT5pc1RleHQoKSkgeworICAgICAgICAgICAgRVRleHRBbGlnbiB0ZXh0QWxpZ24gPSBy
ZW5kZXJlci0+c3R5bGUoKS0+dGV4dEFsaWduKCk7CisgICAgICAgICAgICBJbnRQb2ludCB0ZXh0
QW5jaG9yOworICAgICAgICAgICAgc3dpdGNoICh0ZXh0QWxpZ24pIHsKKyAgICAgICAgICAgIGNh
c2UgQ0VOVEVSOgorICAgICAgICAgICAgY2FzZSBXRUJLSVRfQ0VOVEVSOgorICAgICAgICAgICAg
ICAgIHRleHRBbmNob3IgPSBJbnRQb2ludChyZWZsb3dlZFJlY3QueCgpICsgKHJlZmxvd2VkUmVj
dC53aWR0aCgpIC0gYWN0dWFsVmlzaWJsZVNpemUoKS53aWR0aCgpKSAvIDIsIHRvcExlZnRQb2lu
dC55KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBMRUZUOgor
ICAgICAgICAgICAgY2FzZSBXRUJLSVRfTEVGVDoKKyAgICAgICAgICAgICAgICB0ZXh0QW5jaG9y
ID0gdG9wTGVmdFBvaW50OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2Fz
ZSBSSUdIVDoKKyAgICAgICAgICAgIGNhc2UgV0VCS0lUX1JJR0hUOgorICAgICAgICAgICAgICAg
IHRleHRBbmNob3IgPSBJbnRQb2ludChyZWZsb3dlZFJlY3QueCgpICsgcmVmbG93ZWRSZWN0Lndp
ZHRoKCkgLSBhY3R1YWxWaXNpYmxlU2l6ZSgpLndpZHRoKCksIHRvcExlZnRQb2ludC55KCkpOwor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUQUFVVE86CisgICAgICAg
ICAgICBjYXNlIEpVU1RJRlk6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAg
IGlmIChyZW5kZXJlci0+c3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQorICAgICAg
ICAgICAgICAgICAgICB0ZXh0QW5jaG9yID0gdG9wTGVmdFBvaW50OworICAgICAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGV4dEFuY2hvciA9IEludFBvaW50KHJlZmxvd2Vk
UmVjdC54KCkgKyByZWZsb3dlZFJlY3Qud2lkdGgoKSAtIGFjdHVhbFZpc2libGVTaXplKCkud2lk
dGgoKSwgdG9wTGVmdFBvaW50LnkoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBzZXRTY3JvbGxQb3NpdGlvbih0ZXh0QW5jaG9yKTsKKyAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbmRlcmVyLT5zdHlsZSgpLT5pc0xlZnRUb1JpZ2h0
RGlyZWN0aW9uKCkKKyAgICAgICAgICAgICAgICA/IHNldFNjcm9sbFBvc2l0aW9uKHRvcExlZnRQ
b2ludCkKKyAgICAgICAgICAgICAgICA6IHNldFNjcm9sbFBvc2l0aW9uKEludFBvaW50KHJlZmxv
d2VkUmVjdC54KCkgKyByZWZsb3dlZFJlY3Qud2lkdGgoKSAtIGFjdHVhbFZpc2libGVTaXplKCku
d2lkdGgoKSwgdG9wTGVmdFBvaW50LnkoKSkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh3
aWxsVXNlVGV4dFJlZmxvdykgeworICAgICAgICBJbnRSZWN0IGZpbmFsUmVjdCA9IHJlY3RGb3JO
b2RlKG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZS5nZXQoKSk7CisgICAgICAgIGZpbmFs
UmVjdCA9IGFkanVzdFJlY3RPZmZzZXRGb3JGcmFtZU9mZnNldChmaW5hbFJlY3QsIG1fY3VycmVu
dEJsb2NrWm9vbUFkanVzdGVkTm9kZS5nZXQoKSk7CisgICAgICAgIHNldFNjcm9sbFBvc2l0aW9u
KEludFBvaW50KDAsIGZpbmFsUmVjdC55KCkgKyBtX2ZpbmFsQmxvY2tQb2ludFJlZmxvd09mZnNl
dC55KCkpKTsKKyAgICAgICAgcmVzZXRCbG9ja1pvb20oKTsKKyAgICB9CisjZW5kaWYKKyAgICBp
ZiAoIXdpbGxVc2VUZXh0UmVmbG93KSB7CisgICAgICAgIHNldFNjcm9sbFBvc2l0aW9uKGFuY2hv
cik7CisgICAgICAgIGlmICghbV9zaG91bGRSZWZsb3dCbG9jaykKKyAgICAgICAgICAgIHJlc2V0
QmxvY2tab29tKCk7CisgICAgfQorCisgICAgbm90aWZ5VHJhbnNmb3JtQ2hhbmdlZCgpOworICAg
IG1fYmFja2luZ1N0b3JlLT5kLT5jbGVhcldpbmRvdygpOworICAgIG1fYmFja2luZ1N0b3JlLT5k
LT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKEJhY2tpbmdTdG9yZTo6UmVuZGVy
QW5kQmxpdCk7CisgICAgbV9jbGllbnQtPnpvb21DaGFuZ2VkKG1fd2ViUGFnZS0+aXNNaW5ab29t
ZWQoKSwgbV93ZWJQYWdlLT5pc01heFpvb21lZCgpLCAhc2hvdWxkWm9vbU9uRXNjYXBlKCksIGN1
cnJlbnRTY2FsZSgpKTsKK30KKworCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpyZXNldEJsb2NrWm9v
bSgpCit7CisgICAgbV9jdXJyZW50QmxvY2tab29tTm9kZSA9IDA7CisgICAgbV9jdXJyZW50Qmxv
Y2tab29tQWRqdXN0ZWROb2RlID0gMDsKKyAgICBtX3Nob3VsZFJlZmxvd0Jsb2NrID0gZmFsc2U7
Cit9CisKK1dlYlBhZ2U6OldlYlBhZ2UoV2ViUGFnZUNsaWVudCogY2xpZW50LCBjb25zdCBXZWJT
dHJpbmcmIHBhZ2VHcm91cE5hbWUsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0KQorewor
ICAgIGdsb2JhbEluaXRpYWxpemUoKTsKKyAgICBkID0gbmV3IFdlYlBhZ2VQcml2YXRlKHRoaXMs
IGNsaWVudCwgcmVjdCk7CisgICAgZC0+aW5pdChwYWdlR3JvdXBOYW1lKTsKK30KKwordm9pZCBX
ZWJQYWdlOjpkZXN0cm95V2ViUGFnZUNvbXBvc2l0b3IoKQoreworI2lmIFVTRShBQ0NFTEVSQVRF
RF9DT01QT1NJVElORykKKyAgICAvLyBEZXN0cm95IHRoZSBsYXllciByZW5kZXJlciBpbiBhIHN5
bmMgY29tbWFuZCBiZWZvcmUgd2UgZGVzdHJveSB0aGUgYmFja2luZyBzdG9yZSwKKyAgICAvLyB0
byBmbHVzaCBhbnkgcGVuZGluZyBjb21wb3NpdGluZyBtZXNzYWdlcyBvbiB0aGUgY29tcG9zaXRp
bmcgdGhyZWFkLgorICAgIC8vIFRoZSBiYWNraW5nIHN0b3JlIGlzIGluZGlyZWN0bHkgZGVsZXRl
ZCBieSB0aGUgJ2RldGFjaEZyb21QYXJlbnQnIGNhbGwgYmVsb3cuCisgICAgZC0+c3luY0Rlc3Ry
b3lDb21wb3NpdG9yT25Db21wb3NpdGluZ1RocmVhZCgpOworI2VuZGlmCit9CisKK3ZvaWQgV2Vi
UGFnZTo6ZGVzdHJveSgpCit7CisgICAgLy8gVE9ETzogbmVlZCB0byB2ZXJpZnkgaWYgdGhpcyBj
YWxsIG5lZWRzIHRvIGJlIG1hZGUgYmVmb3JlIGNhbGxpbmcKKyAgICAvLyBXZWJQYWdlOjpkZXN0
cm95V2ViUGFnZUNvbXBvc2l0b3IoKQorICAgIGQtPm1fYmFja2luZ1N0b3JlLT5kLT5zdXNwZW5k
U2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcygpOworCisgICAgLy8gQ2xvc2UgdGhlIGJhY2tm
b3J3YXJkIGxpc3QgYW5kIHJlbGVhc2UgdGhlIGNhY2hlZCBwYWdlcy4KKyAgICBkLT5tX3BhZ2Ut
PmJhY2tGb3J3YXJkKCktPmNsb3NlKCk7CisgICAgcGFnZUNhY2hlKCktPnJlbGVhc2VBdXRvcmVs
ZWFzZWRQYWdlc05vdygpOworCisgICAgRnJhbWVMb2FkZXIqIGxvYWRlciA9IGQtPm1fbWFpbkZy
YW1lLT5sb2FkZXIoKTsKKworICAgIC8vIFJlbW92ZSBtYWluIGZyYW1lJ3MgYmFja2luZyBzdG9y
ZSBjbGllbnQgZnJvbSB0aGUgbWFwCisgICAgLy8gdG8gcHJldmVudCBGcmFtZUxvYWRlckNsaWVu
dEJsYWNreUJlcnJ5OjpkZXRhY2hGcm9tUGFyZW50MigpLAorICAgIC8vIHdoaWNoIGlzIGNhbGxl
ZCBieSBsb2FkZXItPmRldGFjaEZyb21QYXJlbnQoKSwgZGVsZXRpbmcgaXQuCisgICAgLy8gV2Ug
d2lsbCBkZWxldGUgaXQgaW4gfldlYlBhZ2VQcml2YXRlKCkuCisgICAgLy8gUmVhc29uOiBsb2Fk
ZXItPmRldGFjaEZyb21QYXJlbnQoKSBtYXkgcGluZyBiYWNrIHRvIGJhY2tpbmcgc3RvcmUKKyAg
ICAvLyBpbmRpcmVjdGx5IHRocm91Z2ggQ2hyb21lQ2xpZW50QmxhY2tCZXJyeTo6aW52YWxpZGF0
ZUNvbnRlbnRzQW5kV2luZG93KCkuCisgICAgLy8gc2VlIFJJTSBQUiAjOTMyNTYuCisgICAgZC0+
cmVtb3ZlQmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUoZC0+bV9tYWluRnJhbWUpOworCisgICAg
Ly8gU2V0IG1fbWFpbkZyYW1lIHRvIDAgdG8gYXZvaWQgY2FsbHMgYmFjayBpbiB0byB0aGUgYmFj
a2luZ3N0b3JlIGR1cmluZyB3ZWJwYWdlIGRlbGV0aW9uLgorICAgIGQtPm1fbWFpbkZyYW1lID0g
MDsKKyAgICBpZiAobG9hZGVyKQorICAgICAgICBsb2FkZXItPmRldGFjaEZyb21QYXJlbnQoKTsK
KworICAgIGRlbGV0ZSB0aGlzOworfQorCitXZWJQYWdlOjp+V2ViUGFnZSgpCit7CisgICAgZGVs
ZXRlIGQ7CisgICAgZCA9IDA7Cit9CisKK1dlYlBhZ2VDbGllbnQqIFdlYlBhZ2U6OmNsaWVudCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fY2xpZW50OworfQorCit2b2lkIFdlYlBhZ2U6Omxv
YWQoY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFyKiBuZXR3b3JrVG9rZW4sIGJvb2wgaXNJbml0
aWFsKQoreworICAgIGQtPmxvYWQodXJsLCBuZXR3b3JrVG9rZW4sICJHRVQiLCBQbGF0Zm9ybTo6
TmV0d29ya1JlcXVlc3Q6OlVzZVByb3RvY29sQ2FjaGVQb2xpY3ksIDAsIDAsIDAsIDAsIGlzSW5p
dGlhbCwgZmFsc2UpOworfQorCit2b2lkIFdlYlBhZ2U6OmxvYWRFeHRlbmRlZChjb25zdCBjaGFy
KiB1cmwsIGNvbnN0IGNoYXIqIG5ldHdvcmtUb2tlbiwgY29uc3QgY2hhciogbWV0aG9kLCBQbGF0
Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkNhY2hlUG9saWN5IGNhY2hlUG9saWN5LCBjb25zdCBjaGFy
KiBkYXRhLCBzaXplX3QgZGF0YUxlbmd0aCwgY29uc3QgY2hhciogY29uc3QqIGhlYWRlcnMsIHNp
emVfdCBoZWFkZXJzTGVuZ3RoLCBib29sIG11c3RIYW5kbGVJbnRlcm5hbGx5KQoreworICAgIGQt
PmxvYWQodXJsLCBuZXR3b3JrVG9rZW4sIG1ldGhvZCwgY2FjaGVQb2xpY3ksIGRhdGEsIGRhdGFM
ZW5ndGgsIGhlYWRlcnMsIGhlYWRlcnNMZW5ndGgsIGZhbHNlLCBtdXN0SGFuZGxlSW50ZXJuYWxs
eSwgZmFsc2UsICIiKTsKK30KKwordm9pZCBXZWJQYWdlOjpsb2FkRmlsZShjb25zdCBjaGFyKiBw
YXRoLCBjb25zdCBjaGFyKiBvdmVycmlkZUNvbnRlbnRUeXBlKQoreworICAgIHN0ZDo6c3RyaW5n
IGZpbGVVcmwocGF0aCk7CisgICAgaWYgKCFmaWxlVXJsLmZpbmQoIi8iKSkKKyAgICAgICAgZmls
ZVVybC5pbnNlcnQoMCwgImZpbGU6Ly8iKTsKKyAgICBlbHNlIGlmIChmaWxlVXJsLmZpbmQoImZp
bGU6Ly8vIikpCisgICAgICAgIHJldHVybjsKKworICAgIGQtPmxvYWQoZmlsZVVybC5jX3N0cigp
LCAwLCAiR0VUIiwgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpVc2VQcm90b2NvbENhY2hlUG9s
aWN5LCAwLCAwLCAwLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBvdmVycmlkZUNvbnRlbnRUeXBl
KTsKK30KKwordm9pZCBXZWJQYWdlOjpsb2FkU3RyaW5nKGNvbnN0IGNoYXIqIHN0cmluZywgY29u
c3QgY2hhciogYmFzZVVSTCwgY29uc3QgY2hhciogbWltZVR5cGUsIGNvbnN0IGNoYXIqIGZhaWxp
bmdVUkwpCit7CisgICAgZC0+bG9hZFN0cmluZyhzdHJpbmcsIGJhc2VVUkwsIG1pbWVUeXBlLCBm
YWlsaW5nVVJMKTsKK30KKwordm9pZCBXZWJQYWdlOjpkb3dubG9hZChjb25zdCBQbGF0Zm9ybTo6
TmV0d29ya1JlcXVlc3QmIHJlcXVlc3QpCit7CisgICAgZC0+bG9hZChyZXF1ZXN0LmdldFVybFJl
ZigpLmNfc3RyKCksIDAsICJHRVQiLCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OlVzZVByb3Rv
Y29sQ2FjaGVQb2xpY3ksIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgIiIpOworfQor
Citib29sIFdlYlBhZ2U6OmV4ZWN1dGVKYXZhU2NyaXB0KGNvbnN0IGNoYXIqIHNjcmlwdCwgSmF2
YVNjcmlwdERhdGFUeXBlJiByZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKQorewor
ICAgIHJldHVybiBkLT5leGVjdXRlSmF2YVNjcmlwdChzY3JpcHQsIHJldHVyblR5cGUsIHJldHVy
blZhbHVlKTsKK30KKworYm9vbCBXZWJQYWdlOjpleGVjdXRlSmF2YVNjcmlwdEluSXNvbGF0ZWRX
b3JsZChjb25zdCBzdGQ6OndzdHJpbmcmIHNjcmlwdCwgSmF2YVNjcmlwdERhdGFUeXBlJiByZXR1
cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKQoreworICAgIC8vIE9uIG91ciBwbGF0Zm9y
bSB3Y2hhcl90IGlzIHVuc2lnbmVkIGludCBhbmQgVUNoYXIgaXMgdW5zaWduZWQgc2hvcnQKKyAg
ICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnZlcnQgdXNpbmcgSUNVIGNvbnZlcnNpb24gZnVuY3Rpb24K
KyAgICBpbnQgbGVuZ3RoQ29waWVkID0gMDsKKyAgICBVRXJyb3JDb2RlIGVycm9yID0gVV9aRVJP
X0VSUk9SOworICAgIGNvbnN0IGludCBsZW5ndGggPSBzY3JpcHQubGVuZ3RoKCkgKyAxIC8qbnVs
bCB0ZXJtaW5hdGlvbiBjaGFyKi87CisgICAgVUNoYXIgZGF0YVtsZW5ndGhdOworCisgICAgLy8g
RklYTUU6IFBSIDEzODE2MiBpcyBnaXZpbmcgVV9JTlZBTElEX0NIQVJfRk9VTkQgZXJyb3IuCisg
ICAgdV9zdHJGcm9tVVRGMzIoZGF0YSwgbGVuZ3RoLCAmbGVuZ3RoQ29waWVkLCByZWludGVycHJl
dF9jYXN0PGNvbnN0IFVDaGFyMzIqPihzY3JpcHQuY19zdHIoKSksIHNjcmlwdC5sZW5ndGgoKSwg
JmVycm9yKTsKKyAgICBCTEFDS0JFUlJZX0FTU0VSVChlcnJvciA9PSBVX1pFUk9fRVJST1IpOwor
ICAgIGlmIChlcnJvciAhPSBVX1pFUk9fRVJST1IpIHsKKyAgICAgICAgUGxhdGZvcm06OmxvZ0Fs
d2F5cyhQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIldlYlBhZ2U6OmV4ZWN1dGVKYXZhU2Ny
aXB0SW5Jc29sYXRlZFdvcmxkIGZhaWxlZCB0byBjb252ZXJ0IFVURjE2IHRvIEphdmFTY3JpcHQh
Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU3RyaW5nIHN0ciA9IFN0cmlu
ZyhkYXRhLCBsZW5ndGhDb3BpZWQpOworICAgIFNjcmlwdFNvdXJjZUNvZGUgc291cmNlQ29kZShz
dHIsIEtVUkwoKSk7CisgICAgcmV0dXJuIGQtPmV4ZWN1dGVKYXZhU2NyaXB0SW5Jc29sYXRlZFdv
cmxkKHNvdXJjZUNvZGUsIHJldHVyblR5cGUsIHJldHVyblZhbHVlKTsKK30KKworYm9vbCBXZWJQ
YWdlOjpleGVjdXRlSmF2YVNjcmlwdEluSXNvbGF0ZWRXb3JsZChjb25zdCBjaGFyKiBzY3JpcHQs
IEphdmFTY3JpcHREYXRhVHlwZSYgcmV0dXJuVHlwZSwgV2ViU3RyaW5nJiByZXR1cm5WYWx1ZSkK
K3sKKyAgICBTY3JpcHRTb3VyY2VDb2RlIHNvdXJjZUNvZGUoU3RyaW5nOjpmcm9tVVRGOChzY3Jp
cHQpLCBLVVJMKCkpOworICAgIHJldHVybiBkLT5leGVjdXRlSmF2YVNjcmlwdEluSXNvbGF0ZWRX
b3JsZChzb3VyY2VDb2RlLCByZXR1cm5UeXBlLCByZXR1cm5WYWx1ZSk7Cit9CisKK3ZvaWQgV2Vi
UGFnZTo6c3RvcExvYWRpbmcoKQoreworICAgIGQtPnN0b3BDdXJyZW50TG9hZCgpOworfQorCit2
b2lkIFdlYlBhZ2U6OnByZXBhcmVUb0Rlc3Ryb3koKQoreworICAgIGQtPnByZXBhcmVUb0Rlc3Ry
b3koKTsKK30KKworaW50IFdlYlBhZ2U6OmJhY2tGb3J3YXJkTGlzdExlbmd0aCgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGQtPm1fcGFnZS0+Z2V0SGlzdG9yeUxlbmd0aCgpOworfQorCitib29sIFdl
YlBhZ2U6OmNhbkdvQmFja09yRm9yd2FyZChpbnQgZGVsdGEpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGQtPm1fcGFnZS0+Y2FuR29CYWNrT3JGb3J3YXJkKGRlbHRhKTsKK30KKworYm9vbCBXZWJQYWdl
Ojpnb0JhY2tPckZvcndhcmQoaW50IGRlbHRhKQoreworICAgIGlmIChkLT5tX3BhZ2UtPmNhbkdv
QmFja09yRm9yd2FyZChkZWx0YSkpIHsKKyAgICAgICAgZC0+bV9wYWdlLT5nb0JhY2tPckZvcndh
cmQoZGVsdGEpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNl
OworfQorCit2b2lkIFdlYlBhZ2U6OmdvVG9CYWNrRm9yd2FyZEVudHJ5KEJhY2tGb3J3YXJkSWQg
aWQpCit7CisgICAgSGlzdG9yeUl0ZW0qIGl0ZW0gPSBoaXN0b3J5SXRlbUZyb21CYWNrRm9yd2Fy
ZElkKGlkKTsKKyAgICBBU1NFUlQoaXRlbSk7CisgICAgZC0+bV9wYWdlLT5nb1RvSXRlbShpdGVt
LCBGcmFtZUxvYWRUeXBlSW5kZXhlZEJhY2tGb3J3YXJkKTsKK30KKwordm9pZCBXZWJQYWdlOjpy
ZWxvYWQoKQoreworICAgIGQtPm1fbWFpbkZyYW1lLT5sb2FkZXIoKS0+cmVsb2FkKC8qIGJ5cGFz
c0NhY2hlICovIHRydWUpOworfQorCit2b2lkIFdlYlBhZ2U6OnJlbG9hZEZyb21DYWNoZSgpCit7
CisgICAgZC0+bV9tYWluRnJhbWUtPmxvYWRlcigpLT5yZWxvYWQoLyogYnlwYXNzQ2FjaGUgKi8g
ZmFsc2UpOworfQorCitXZWJTZXR0aW5ncyogV2ViUGFnZTo6c2V0dGluZ3MoKSBjb25zdAorewor
ICAgIHJldHVybiBkLT5tX3dlYlNldHRpbmdzOworfQorCitib29sIFdlYlBhZ2U6OmlzVmlzaWJs
ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fdmlzaWJsZTsKK30KKwordm9pZCBXZWJQYWdl
OjpzZXRWaXNpYmxlKGJvb2wgdmlzaWJsZSkKK3sKKyAgICBpZiAoZC0+bV92aXNpYmxlID09IHZp
c2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIGQtPm1fdmlzaWJsZSA9IHZpc2libGU7CisK
KyAgICBpZiAoIXZpc2libGUpIHsKKyAgICAgICAgZC0+c3VzcGVuZEJhY2tpbmdTdG9yZSgpOwor
CisgICAgICAgIC8vIFJlbW92ZSB0aGlzIFdlYlBhZ2UgZnJvbSB0aGUgdmlzaWJsZSBwYWdlcyBs
aXN0LgorICAgICAgICBzaXplX3QgZm91bmRJbmRleCA9IHZpc2libGVXZWJQYWdlcygpLT5maW5k
KHRoaXMpOworICAgICAgICBpZiAoZm91bmRJbmRleCAhPSBXVEY6Om5vdEZvdW5kKQorICAgICAg
ICAgICAgdmlzaWJsZVdlYlBhZ2VzKCktPnJlbW92ZShmb3VuZEluZGV4KTsKKworICAgICAgICAv
LyBSZXR1cm4gdGhlIGJhY2tpbmcgc3RvcmUgdG8gdGhlIGxhc3QgdmlzaWJsZSBXZWJQYWdlLgor
ICAgICAgICBpZiAoQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9yZU93bmVy
KCkgPT0gdGhpcyAmJiAhdmlzaWJsZVdlYlBhZ2VzKCktPmlzRW1wdHkoKSkKKyAgICAgICAgICAg
IHZpc2libGVXZWJQYWdlcygpLT5sYXN0KCktPmQtPnJlc3VtZUJhY2tpbmdTdG9yZSgpOworCisj
aWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgICAgICAvLyBSb290IGxheWVyIGNv
bW1pdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBpbnZpc2libGUgdGFicy4KKyAgICAgICAgLy8gQW5k
IHJlbGVhc2UgbGF5ZXIgcmVzb3VyY2VzIGNhbiByZWR1Y2UgbWVtb3J5IGNvbnN1bXB0aW9uLgor
ICAgICAgICBkLT5zdXNwZW5kUm9vdExheWVyQ29tbWl0KCk7CisjZW5kaWYKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBkLT5y
ZXN1bWVSb290TGF5ZXJDb21taXQoKTsKKyNlbmRpZgorCisgICAgLy8gUHVzaCB0aGlzIFdlYlBh
Z2UgdG8gdGhlIHRvcCBvZiB0aGUgdmlzaWJsZSBwYWdlcyBsaXN0LgorICAgIGlmICghdmlzaWJs
ZVdlYlBhZ2VzKCktPmlzRW1wdHkoKSAmJiB2aXNpYmxlV2ViUGFnZXMoKS0+bGFzdCgpICE9IHRo
aXMpIHsKKyAgICAgICAgc2l6ZV90IGZvdW5kSW5kZXggPSB2aXNpYmxlV2ViUGFnZXMoKS0+Zmlu
ZCh0aGlzKTsKKyAgICAgICAgaWYgKGZvdW5kSW5kZXggIT0gV1RGOjpub3RGb3VuZCkKKyAgICAg
ICAgICAgIHZpc2libGVXZWJQYWdlcygpLT5yZW1vdmUoZm91bmRJbmRleCk7CisgICAgfQorICAg
IHZpc2libGVXZWJQYWdlcygpLT5hcHBlbmQodGhpcyk7CisKKyAgICBpZiAoQmFja2luZ1N0b3Jl
UHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9yZU93bmVyKCkKKyAgICAgICAgJiYgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9yZU93bmVyKCkgIT0gdGhpcykKKyAgICAgICAg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9yZU93bmVyKCktPmQtPnN1c3Bl
bmRCYWNraW5nU3RvcmUoKTsKKworICAgIC8vIHJlc3VtZUJhY2tpbmdTdG9yZSB3aWxsIHNldCB0
aGUgY3VycmVudCBvd25lciB0byB0aGlzIHdlYnBhZ2UuCisgICAgLy8gSWYgd2Ugc2V0IHRoZSBv
d25lciBwcmVtYXR1cmVseSwgdGhlbiB0aGUgdGlsZXMgd2lsbCBub3QgYmUgcmVzZXQuCisgICAg
ZC0+cmVzdW1lQmFja2luZ1N0b3JlKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNlbGVj
dGlvbkNoYW5nZWQoRnJhbWUqIGZyYW1lKQoreworICAgIG1faW5wdXRIYW5kbGVyLT5zZWxlY3Rp
b25DaGFuZ2VkKCk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBhIGhhY2shCisgICAgLy8gVG8g
ZW5zdXJlIHRoZSBzZWxlY3Rpb24gYmVpbmcgY2hhbmdlZCBoYXMgaXRzIGZyYW1lICdmb2N1c2Vk
JywgbGV0cworICAgIC8vIHNldCBpdCBhcyBmb2N1c2VkIG91cnNlbHZlcyAoUFIgIzEwNDcyNCku
CisgICAgbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+c2V0Rm9jdXNlZEZyYW1lKGZyYW1lKTsK
K30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6dXBkYXRlRGVsZWdhdGVkT3ZlcmxheXMoYm9vbCBk
aXNwYXRjaGVkKQoreworICAgIC8vIFRyYWNrIGEgZGlzcGF0Y2hlZCBtZXNzYWdlLCB3ZSBkb24n
dCB3YW50IHRvIGZsb29kIHRoZSB3ZWJraXQgdGhyZWFkLgorICAgIC8vIFRoZXJlIGNhbiBiZSBh
cyBtYW55IGFzIG9uZSBtb3JlIG1lc3NhZ2UgZW5xdWVkIGFzIG5lZWRlZCBidXQgbmV2ZXIgbGVz
cy4KKyAgICBpZiAoZGlzcGF0Y2hlZCkKKyAgICAgICAgbV91cGRhdGVEZWxlZ2F0ZWRPdmVybGF5
c0Rpc3BhdGNoZWQgPSBmYWxzZTsKKyAgICBlbHNlIGlmIChtX3VwZGF0ZURlbGVnYXRlZE92ZXJs
YXlzRGlzcGF0Y2hlZCkgeworICAgICAgICAvLyBFYXJseSByZXR1cm4gaWYgdGhlcmUgaXMgbWVz
c2FnZSBhbHJlYWR5IHBlbmRpbmcgb24gdGhlIHdlYmtpdCB0aHJlYWQuCisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAoUGxhdGZvcm06OndlYktpdFRocmVhZE1lc3NhZ2VDbGllbnQo
KS0+aXNDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgb24gdGhl
IFdlYktpdCB0aHJlYWQuCisgICAgICAgIGlmIChtX3NlbGVjdGlvbkhhbmRsZXItPmlzU2VsZWN0
aW9uQWN0aXZlKCkpCisgICAgICAgICAgICBtX3NlbGVjdGlvbkhhbmRsZXItPnNlbGVjdGlvblBv
c2l0aW9uQ2hhbmdlZCh0cnVlIC8qIHZpc3VhbENoYW5nZU9ubHkgKi8pOworCisgICAgfSBlbHNl
IGlmIChtX3NlbGVjdGlvbkhhbmRsZXItPmlzU2VsZWN0aW9uQWN0aXZlKCkpIHsKKyAgICAgICAg
Ly8gRG9uJ3QgYm90aGVyIGRpc3BhdGNoaW5nIHRvIHdlYmtpdCB0aHJlYWQgaWYgc2VsZWN0aW9u
IGFuZCB0YXAgaGlnaGxpZ2h0IGFyZSBub3QgYWN0aXZlLgorICAgICAgICBtX3VwZGF0ZURlbGVn
YXRlZE92ZXJsYXlzRGlzcGF0Y2hlZCA9IHRydWU7CisgICAgICAgIFBsYXRmb3JtOjp3ZWJLaXRU
aHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoTWVzc2FnZShQbGF0Zm9ybTo6Y3JlYXRlTWV0
aG9kQ2FsbE1lc3NhZ2UoJldlYlBhZ2VQcml2YXRlOjp1cGRhdGVEZWxlZ2F0ZWRPdmVybGF5cywg
dGhpcywgdHJ1ZSAvKmRpc3BhdGNoZWQqLykpOworICAgIH0KK30KKwordm9pZCBXZWJQYWdlOjpz
ZXRDYXJldEhpZ2hsaWdodFN0eWxlKFBsYXRmb3JtOjpDYXJldEhpZ2hsaWdodFN0eWxlIHN0eWxl
KQoreworfQorCitib29sIFdlYlBhZ2U6OnNldEJhdGNoRWRpdGluZ0FjdGl2ZShib29sIGFjdGl2
ZSkKK3sKKyAgICByZXR1cm4gZC0+bV9pbnB1dEhhbmRsZXItPnNldEJhdGNoRWRpdGluZ0FjdGl2
ZShhY3RpdmUpOworfQorCitib29sIFdlYlBhZ2U6OnNldElucHV0U2VsZWN0aW9uKHVuc2lnbmVk
IHN0YXJ0LCB1bnNpZ25lZCBlbmQpCit7CisgICAgcmV0dXJuIGQtPm1faW5wdXRIYW5kbGVyLT5z
ZXRTZWxlY3Rpb24oc3RhcnQsIGVuZCk7Cit9CisKK2ludCBXZWJQYWdlOjppbnB1dENhcmV0UG9z
aXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBkLT5tX2lucHV0SGFuZGxlci0+Y2FyZXRQb3Np
dGlvbigpOworfQorCit2b2lkIFdlYlBhZ2U6OnBvcHVwTGlzdENsb3NlZChpbnQgc2l6ZSwgYm9v
bCogc2VsZWN0ZWRzKQoreworICAgIGQtPm1faW5wdXRIYW5kbGVyLT5zZXRQb3B1cExpc3RJbmRl
eGVzKHNpemUsIHNlbGVjdGVkcyk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6cG9wdXBMaXN0Q2xvc2Vk
KGludCBpbmRleCkKK3sKKyAgICBkLT5tX2lucHV0SGFuZGxlci0+c2V0UG9wdXBMaXN0SW5kZXgo
aW5kZXgpOworfQorCit2b2lkIFdlYlBhZ2U6OnNldERhdGVUaW1lSW5wdXQoY29uc3QgV2ViU3Ry
aW5nJiB2YWx1ZSkKK3sKKyAgICBkLT5tX2lucHV0SGFuZGxlci0+c2V0SW5wdXRWYWx1ZShTdHJp
bmcodmFsdWUuaW1wbCgpKSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0Q29sb3JJbnB1dChjb25z
dCBXZWJTdHJpbmcmIHZhbHVlKQoreworICAgIGQtPm1faW5wdXRIYW5kbGVyLT5zZXRJbnB1dFZh
bHVlKFN0cmluZyh2YWx1ZS5pbXBsKCkpKTsKK30KKworQWN0aXZlTm9kZUNvbnRleHQgV2ViUGFn
ZTo6YWN0aXZlTm9kZUNvbnRleHQoVGFyZ2V0RGV0ZWN0aW9uU3RyYXRlZ3kgc3RyYXRlZ3kpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGQtPmFjdGl2ZU5vZGVDb250ZXh0KHN0cmF0ZWd5KTsKK30KKwor
dm9pZCBXZWJQYWdlOjpzZXRWaXJ0dWFsVmlld3BvcnRTaXplKGludCB3aWR0aCwgaW50IGhlaWdo
dCkKK3sKKyAgICBkLT5tX3ZpcnR1YWxWaWV3cG9ydFdpZHRoID0gd2lkdGg7CisgICAgZC0+bV92
aXJ0dWFsVmlld3BvcnRIZWlnaHQgPSBoZWlnaHQ7Cit9CisKK3ZvaWQgV2ViUGFnZTo6cmVzZXRW
aXJ0dWFsVmlld3BvcnRPbkNvbW1pdHRlZChib29sIHJlc2V0KQoreworICAgIGQtPm1fcmVzZXRW
aXJ0dWFsVmlld3BvcnRPbkNvbW1pdHRlZCA9IHJlc2V0OworfQorCitJbnRTaXplIFdlYlBhZ2VQ
cml2YXRlOjpyZWNvbXB1dGVWaXJ0dWFsVmlld3BvcnRGcm9tVmlld3BvcnRBcmd1bWVudHMoKQor
eworICAgIHN0YXRpYyBWaWV3cG9ydEFyZ3VtZW50cyBkZWZhdWx0Vmlld3BvcnRBcmd1bWVudHM7
CisgICAgaWYgKG1fdmlld3BvcnRBcmd1bWVudHMgPT0gZGVmYXVsdFZpZXdwb3J0QXJndW1lbnRz
KQorICAgICAgICByZXR1cm4gSW50U2l6ZSgpOworCisgICAgaW50IGRlc2t0b3BXaWR0aCA9IGRl
ZmF1bHRNYXhMYXlvdXRTaXplKCkud2lkdGgoKTsKKyAgICBpbnQgZGV2aWNlV2lkdGggPSBQbGF0
Zm9ybTo6R3JhcGhpY3M6OlNjcmVlbjo6d2lkdGgoKTsKKyAgICBpbnQgZGV2aWNlSGVpZ2h0ID0g
UGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OmhlaWdodCgpOworICAgIEZsb2F0U2l6ZSBjdXJy
ZW50UFBJID0gUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OnBpeGVsc1BlckluY2goLTEpOwor
ICAgIGludCBkZXZpY2VEUEkgPSBpbnQocm91bmRmKChjdXJyZW50UFBJLndpZHRoKCkgKyBjdXJy
ZW50UFBJLmhlaWdodCgpKSAvIDIpKTsKKyAgICBpZiAobV92aWV3cG9ydEFyZ3VtZW50cy50YXJn
ZXREZW5zaXR5RHBpID09IFZpZXdwb3J0QXJndW1lbnRzOjpWYWx1ZUF1dG8pIHsKKyAgICAgICAg
Ly8gQXV0byBtZWFucyAxNjBkcGkgaWYgd2UgbGVhdmUgaXQgYWxvbmUuIFRoaXMgbG9va3MgdGVy
cmlibGUgZm9yIHBhZ2VzIHdhbnRpbmcgMToxLgorICAgICAgICAvLyBGSVhNRTogVGhpcyBpcyBp
bnN1ZmZpY2llbnQgZm9yIGRldmljZXMgd2l0aCBoaWdoIGRwaSwgYXMgdGhleSB3aWxsIHJlbmRl
ciBjb250ZW50IHVucmVhZGFibHkgc21hbGwuCisgICAgICAgIG1fdmlld3BvcnRBcmd1bWVudHMu
dGFyZ2V0RGVuc2l0eURwaSA9IGRldmljZURQSTsKKyAgICB9CisKKyAgICBWaWV3cG9ydEF0dHJp
YnV0ZXMgcmVzdWx0ID0gY29tcHV0ZVZpZXdwb3J0QXR0cmlidXRlcyhtX3ZpZXdwb3J0QXJndW1l
bnRzLCBkZXNrdG9wV2lkdGgsIGRldmljZVdpZHRoLCBkZXZpY2VIZWlnaHQsIGRldmljZURQSSwg
bV9kZWZhdWx0TGF5b3V0U2l6ZSk7CisgICAgcmV0dXJuIEludFNpemUocmVzdWx0LmxheW91dFNp
emUud2lkdGgoKSwgcmVzdWx0LmxheW91dFNpemUuaGVpZ2h0KCkpOworfQorCisjaWYgRU5BQkxF
KEVWRU5UX01PREVfTUVUQVRBR1MpCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpkaWRSZWNlaXZlQ3Vy
c29yRXZlbnRNb2RlKEN1cnNvckV2ZW50TW9kZSBtb2RlKQoreworICAgIGlmIChtb2RlICE9IG1f
Y3Vyc29yRXZlbnRNb2RlKQorICAgICAgICBtX2NsaWVudC0+Y3Vyc29yRXZlbnRNb2RlQ2hhbmdl
ZCh0b1BsYXRmb3JtQ3Vyc29yRXZlbnRNb2RlKG1vZGUpKTsKKyAgICBtX2N1cnNvckV2ZW50TW9k
ZSA9IG1vZGU7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmRpZFJlY2VpdmVUb3VjaEV2ZW50
TW9kZShUb3VjaEV2ZW50TW9kZSBtb2RlKQoreworICAgIGlmIChtb2RlICE9IG1fdG91Y2hFdmVu
dE1vZGUpCisgICAgICAgIG1fY2xpZW50LT50b3VjaEV2ZW50TW9kZUNoYW5nZWQodG9QbGF0Zm9y
bVRvdWNoRXZlbnRNb2RlKG1vZGUpKTsKKyAgICBtX3RvdWNoRXZlbnRNb2RlID0gbW9kZTsKK30K
KyNlbmRpZgorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpkaXNwYXRjaFZpZXdwb3J0UHJvcGVydGll
c0RpZENoYW5nZShjb25zdCBWaWV3cG9ydEFyZ3VtZW50cyYgYXJndW1lbnRzKQoreworICAgIHN0
YXRpYyBWaWV3cG9ydEFyZ3VtZW50cyBkZWZhdWx0Vmlld3BvcnRBcmd1bWVudHM7CisgICAgaWYg
KGFyZ3VtZW50cyA9PSBkZWZhdWx0Vmlld3BvcnRBcmd1bWVudHMpCisgICAgICAgIHJldHVybjsK
KworICAgIG1fdmlld3BvcnRBcmd1bWVudHMgPSBhcmd1bWVudHM7CisKKyAgICAvLyAwIHdpZHRo
IG9yIGhlaWdodCBpbiB2aWV3cG9ydCBhcmd1bWVudHMgbWFrZXMgbm8gc2Vuc2UsIGFuZCByZXN1
bHRzIGluIGEgdmVyeSBsYXJnZSBpbml0aWFsIHNjYWxlLgorICAgIC8vIEluIHJlYWwgd29ybGQs
IGEgMCB3aWR0aCBvciBoZWlnaHQgaXMgdXN1YWxseSBjYXVzZWQgYnkgYSBzeW50YXggZXJyb3Ig
aW4gImNvbnRlbnQiIGZpZWxkIG9mIHZpZXdwb3J0CisgICAgLy8gbWV0YSB0YWcsIGZvciBleGFt
cGxlLCB1c2luZyBzZW1pY29sb24gaW5zdGVhZCBvZiBjb21tYSBhcyBzZXBhcmF0b3IgKCJ3aWR0
aD1kZXZpY2Utd2lkdGg7IGluaXRpYWwtc2NhbGU9MS4wIikuCisgICAgLy8gV2UgZG9uJ3QgaGF2
ZSBhIHBsYW4gdG8gdG9sZXJhdGUgdGhlIHNlbWljb2xvbiBzZXBhcmF0b3IsIGJ1dCB3ZSBjYW4g
YXZvaWQgYXBwbHlpbmcgMCB3aWR0aC9oZWlnaHQuCisgICAgLy8gSSBkZWZhdWx0IGl0IHRvIFZh
bHVlRGV2aWNlV2lkdGggcmF0aGVyIHRoYW4gVmFsdWVBdXRvIGJlY2F1c2UgaW4gbW9yZSBjYXNl
cyB0aGUgd2ViIHNpdGUgd2FudHMgImRldmljZS13aWR0aCIKKyAgICAvLyB3aGVuIHRoZXkgc3Bl
Y2lmeSB0aGUgdmlld3BvcnQgd2lkdGguCisgICAgaWYgKCFtX3ZpZXdwb3J0QXJndW1lbnRzLndp
ZHRoKQorICAgICAgICBtX3ZpZXdwb3J0QXJndW1lbnRzLndpZHRoID0gVmlld3BvcnRBcmd1bWVu
dHM6OlZhbHVlRGV2aWNlV2lkdGg7CisgICAgaWYgKCFtX3ZpZXdwb3J0QXJndW1lbnRzLmhlaWdo
dCkKKyAgICAgICAgbV92aWV3cG9ydEFyZ3VtZW50cy5oZWlnaHQgPSBWaWV3cG9ydEFyZ3VtZW50
czo6VmFsdWVEZXZpY2VIZWlnaHQ7CisKKyAgICBzZXRVc2VyU2NhbGFibGUoYXJndW1lbnRzLnVz
ZXJTY2FsYWJsZSA9PSBWaWV3cG9ydEFyZ3VtZW50czo6VmFsdWVBdXRvID8gdHJ1ZSA6IGFyZ3Vt
ZW50cy51c2VyU2NhbGFibGUpOworICAgIGlmIChhcmd1bWVudHMuaW5pdGlhbFNjYWxlID4gMCkK
KyAgICAgICAgc2V0SW5pdGlhbFNjYWxlKGFyZ3VtZW50cy5pbml0aWFsU2NhbGUpOworICAgIGlm
IChhcmd1bWVudHMubWluaW11bVNjYWxlID4gMCkKKyAgICAgICAgc2V0TWluaW11bVNjYWxlKGFy
Z3VtZW50cy5taW5pbXVtU2NhbGUpOworICAgIGlmIChhcmd1bWVudHMubWF4aW11bVNjYWxlID4g
MCkKKyAgICAgICAgc2V0TWF4aW11bVNjYWxlKGFyZ3VtZW50cy5tYXhpbXVtU2NhbGUpOworCisg
ICAgSW50U2l6ZSB2aXJ0dWFsVmlld3BvcnQgPSByZWNvbXB1dGVWaXJ0dWFsVmlld3BvcnRGcm9t
Vmlld3BvcnRBcmd1bWVudHMoKTsKKyAgICBtX3dlYlBhZ2UtPnNldFZpcnR1YWxWaWV3cG9ydFNp
emUodmlydHVhbFZpZXdwb3J0LndpZHRoKCksIHZpcnR1YWxWaWV3cG9ydC5oZWlnaHQoKSk7CisK
KyAgICBpZiAobG9hZFN0YXRlKCkgPT0gV2ViS2l0OjpXZWJQYWdlUHJpdmF0ZTo6Q29tbWl0dGVk
KQorICAgICAgICB6b29tVG9Jbml0aWFsU2NhbGVPbkxvYWQoKTsKK30KKwordm9pZCBXZWJQYWdl
UHJpdmF0ZTo6b25JbnB1dExvY2FsZUNoYW5nZWQoYm9vbCBpc1JUTCkKK3sKKyAgICBpZiAoaXNS
VEwgIT0gbV93ZWJTZXR0aW5ncy0+aXNXcml0aW5nRGlyZWN0aW9uUlRMKCkpIHsKKyAgICAgICAg
bV93ZWJTZXR0aW5ncy0+c2V0V3JpdGluZ0RpcmVjdGlvblJUTChpc1JUTCk7CisgICAgICAgIG1f
aW5wdXRIYW5kbGVyLT5oYW5kbGVJbnB1dExvY2FsZUNoYW5nZWQoaXNSVEwpOworICAgIH0KK30K
Kwordm9pZCBXZWJQYWdlOjpzZXRTY3JlZW5PcmllbnRhdGlvbihpbnQgb3JpZW50YXRpb24pCit7
CisgICAgZC0+bV9wZW5kaW5nT3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKK30KKwordm9pZCBX
ZWJQYWdlOjphcHBseVBlbmRpbmdPcmllbnRhdGlvbklmTmVlZGVkKCkKK3sKKyAgICBpZiAoZC0+
bV9wZW5kaW5nT3JpZW50YXRpb24gIT0gLTEpCisgICAgICAgIGQtPnNldFNjcmVlbk9yaWVudGF0
aW9uKGQtPm1fcGVuZGluZ09yaWVudGF0aW9uKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6
c3VzcGVuZEJhY2tpbmdTdG9yZSgpCit7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQorICAgIHJlc2V0Q29tcG9zaXRpbmdTdXJmYWNlKCk7CisjZW5kaWYKK30KKwordm9pZCBXZWJQ
YWdlUHJpdmF0ZTo6cmVzdW1lQmFja2luZ1N0b3JlKCkKK3sKKyAgICBBU1NFUlQobV93ZWJQYWdl
LT5pc1Zpc2libGUoKSk7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAg
c2V0TmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpOworI2VuZGlmCisKKyAgICBi
b29sIGRpcmVjdFJlbmRlcmluZyA9IG1fYmFja2luZ1N0b3JlLT5kLT5zaG91bGREaXJlY3RSZW5k
ZXJpbmdUb1dpbmRvdygpOworICAgIGlmICghbV9iYWNraW5nU3RvcmUtPmQtPmlzQWN0aXZlKCkK
KyAgICAgICAgfHwgc2hvdWxkUmVzZXRUaWxlc1doZW5TaG93bigpCisgICAgICAgIHx8IGRpcmVj
dFJlbmRlcmluZykgeworICAgICAgICAvLyBXZSBuZWVkIHRvIHJlc2V0IGFsbCB0aWxlcyBzbyB0
aGF0IHdlIGRvIG5vdCBzaG93IGFueSB0aWxlcyB3aG9zZSBjb250ZW50IG1heQorICAgICAgICAv
LyBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgYW5vdGhlciBXZWJQYWdlIGluc3RhbmNlIChpLmUuIGFu
b3RoZXIgdGFiKS4KKyAgICAgICAgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2V0Q3VycmVudEJhY2tp
bmdTdG9yZU93bmVyKG1fd2ViUGFnZSk7CisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5vcmll
bnRhdGlvbkNoYW5nZWQoKTsgLy8gVXBkYXRlcyB0aWxlIGdlb21ldHJ5IGFuZCBjcmVhdGVzIHZp
c2libGUgdGlsZSBidWZmZXIuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXNldFRpbGVz
KHRydWUgLyogcmVzZXRCYWNrZ3JvdW5kICovKTsKKyAgICAgICAgbV9iYWNraW5nU3RvcmUtPmQt
PnVwZGF0ZVRpbGVzKGZhbHNlIC8qIHVwZGF0ZVZpc2libGUgKi8sIGZhbHNlIC8qIGltbWVkaWF0
ZSAqLyk7CisgICAgICAgIC8vIFRoaXMgdmFsdWUgbWF5IGhhdmUgY2hhbmdlZCwgc28gd2UgbmVl
ZCB0byB1cGRhdGUgaXQuCisgICAgICAgIGRpcmVjdFJlbmRlcmluZyA9IG1fYmFja2luZ1N0b3Jl
LT5kLT5zaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpOworICAgICAgICBpZiAobV9iYWNr
aW5nU3RvcmUtPmQtPnJlbmRlclZpc2libGVDb250ZW50cygpICYmICFtX2JhY2tpbmdTdG9yZS0+
ZC0+aXNTdXNwZW5kZWQoKSAmJiAhZGlyZWN0UmVuZGVyaW5nKQorICAgICAgICAgICAgbV9iYWNr
aW5nU3RvcmUtPmQtPmJsaXRWaXNpYmxlQ29udGVudHMoKTsKKyAgICB9IGVsc2UgeworICAgICAg
ICAvLyBSZW5kZXJpbmcgd2FzIGRpc2FibGVkIHdoaWxlIHdlIHdlcmUgaGlkZGVuLCBzbyB3ZSBu
ZWVkIHRvIHVwZGF0ZSBhbGwgdGlsZXMuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT51cGRh
dGVUaWxlcyh0cnVlIC8qIHVwZGF0ZVZpc2libGUgKi8sIGZhbHNlIC8qIGltbWVkaWF0ZSAqLyk7
CisgICAgfQorCisgICAgc2V0U2hvdWxkUmVzZXRUaWxlc1doZW5TaG93bihmYWxzZSk7Cit9CisK
K3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldFNjcmVlbk9yaWVudGF0aW9uKGludCBvcmllbnRhdGlv
bikKK3sKKyAgICBGT1JfRUFDSF9QTFVHSU5WSUVXKG1fcGx1Z2luVmlld3MpCisgICAgICAgICgq
aXQpLT5oYW5kbGVPcmllbnRhdGlvbkV2ZW50KG9yaWVudGF0aW9uKTsKKworICAgIG1fcGVuZGlu
Z09yaWVudGF0aW9uID0gLTE7CisKKyNpZiBFTkFCTEUoT1JJRU5UQVRJT05fRVZFTlRTKQorICAg
IGlmIChtX21haW5GcmFtZS0+b3JpZW50YXRpb24oKSA9PSBvcmllbnRhdGlvbikKKyAgICAgICAg
cmV0dXJuOworICAgIGZvciAoUmVmUHRyPEZyYW1lPiBmcmFtZSA9IG1fbWFpbkZyYW1lOyBmcmFt
ZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT50cmF2ZXJzZU5leHQoKSkKKyAgICAgICAgZnJhbWUt
PnNlbmRPcmllbnRhdGlvbkNoYW5nZUV2ZW50KG9yaWVudGF0aW9uKTsKKyNlbmRpZgorfQorCitQ
bGF0Zm9ybTo6SW50U2l6ZSBXZWJQYWdlOjp2aWV3cG9ydFNpemUoKSBjb25zdAoreworICAgIHJl
dHVybiBkLT50cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKCk7Cit9CisKK3ZvaWQgV2ViUGFn
ZTo6c2V0Vmlld3BvcnRTaXplKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiB2aWV3cG9ydFNpemUs
IGJvb2wgZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJsZSkKK3sKKyAgICBkLT5zZXRWaWV3cG9ydFNp
emUodmlld3BvcnRTaXplLCBlbnN1cmVGb2N1c0VsZW1lbnRWaXNpYmxlKTsKK30KKwordm9pZCBX
ZWJQYWdlUHJpdmF0ZTo6c2NyZWVuUm90YXRlZCgpCit7CisgICAgLy8gVGhpcyBjYWxsIHdpbGwg
Y2F1c2UgdGhlIGNsaWVudCB0byByZWFsbG9jYXRlIHRoZSB3aW5kb3cgYnVmZmVyIHRvIG5ldyBz
aXplLAorICAgIC8vIHdoaWNoIG5lZWRzIHRvIGJlIHNlcmlhbGl6ZWQgd2l0aCB1c2FnZSBvZiB0
aGUgd2luZG93IGJ1ZmZlci4gQWNjb21wbGlzaAorICAgIC8vIHRoaXMgYnkgc2VuZGluZyBhIHN5
bmMgbWVzc2FnZSB0byB0aGUgY29tcG9zaXRpbmcgdGhyZWFkLiBBbGwgb3RoZXIgdXNhZ2Ugb2YK
KyAgICAvLyB0aGUgd2luZG93IGJ1ZmZlciBoYXBwZW5zIG9uIHRoZSBjb21wb3NpdGluZyB0aHJl
YWQuCisgICAgaWYgKCFQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQo
KS0+aXNDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgUGxhdGZvcm06OnVzZXJJbnRlcmZhY2VU
aHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoU3luY01lc3NhZ2UoCisgICAgICAgICAgICBQ
bGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJldlYlBhZ2VQcml2YXRlOjpzY3JlZW5S
b3RhdGVkLCB0aGlzKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTdXJmYWNlUG9v
bDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+bm90aWZ5U2NyZWVuUm90YXRlZCgpOworICAgIG1fY2xp
ZW50LT5ub3RpZnlTY3JlZW5Sb3RhdGVkKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNl
dFZpZXdwb3J0U2l6ZShjb25zdCBJbnRTaXplJiB0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXpl
LCBib29sIGVuc3VyZUZvY3VzRWxlbWVudFZpc2libGUpCit7CisgICAgaWYgKG1fcGVuZGluZ09y
aWVudGF0aW9uID09IC0xICYmIHRyYW5zZm9ybWVkQWN0dWFsVmlzaWJsZVNpemUgPT0gdGhpcy0+
dHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAv
LyBTdXNwZW5kIGFsbCBzY3JlZW4gdXBkYXRlcyB0byB0aGUgYmFja2luZ3N0b3JlIHRvIG1ha2Ug
c3VyZSBuby1vbmUgdHJpZXMgdG8gYmxpdAorICAgIC8vIHdoaWxlIHRoZSB3aW5kb3cgc3VyZmFj
ZSBhbmQgdGhlIEJhY2tpbmdTdG9yZSBhcmUgb3V0IG9mIHN5bmMuCisgICAgbV9iYWNraW5nU3Rv
cmUtPmQtPnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7CisKKyAgICAvLyBU
aGUgc2NyZWVuIHJvdGF0aW9uIGlzIGEgbWFqb3Igc3RhdGUgdHJhbnNpdGlvbiB0aGF0IGluIHRo
aXMgY2FzZSBpcyBub3QgcHJvcGVybHkKKyAgICAvLyBjb21tdW5pY2F0ZWQgdG8gdGhlIGJhY2tp
bmcgc3RvcmUsIHNpbmNlIGl0IGRvZXMgZWFybHkgcmV0dXJuIGluIG1vc3QgbWV0aG9kcyB3aGVu
CisgICAgLy8gbm90IHZpc2libGUuCisgICAgaWYgKCFtX3Zpc2libGUgfHwgIW1fYmFja2luZ1N0
b3JlLT5kLT5pc0FjdGl2ZSgpKQorICAgICAgICBzZXRTaG91bGRSZXNldFRpbGVzV2hlblNob3du
KHRydWUpOworCisgICAgYm9vbCBoYXNQZW5kaW5nT3JpZW50YXRpb24gPSBtX3BlbmRpbmdPcmll
bnRhdGlvbiAhPSAtMTsKKyAgICBpZiAoaGFzUGVuZGluZ09yaWVudGF0aW9uKQorICAgICAgICBz
Y3JlZW5Sb3RhdGVkKCk7CisKKyAgICAvLyBUaGUgd2luZG93IGJ1ZmZlcnMgbWlnaHQgaGF2ZSBi
ZWVuIHJlY3JlYXRlZCwgY2xlYXJlZCwgbW92ZWQsIGV0Yy4sIHNvOgorICAgIG1fYmFja2luZ1N0
b3JlLT5kLT53aW5kb3dGcm9udEJ1ZmZlclN0YXRlKCktPmNsZWFyQmxpdHRlZFJlZ2lvbigpOwor
ICAgIG1fYmFja2luZ1N0b3JlLT5kLT53aW5kb3dCYWNrQnVmZmVyU3RhdGUoKS0+Y2xlYXJCbGl0
dGVkUmVnaW9uKCk7CisKKyAgICBJbnRTaXplIHZpZXdwb3J0U2l6ZUJlZm9yZSA9IGFjdHVhbFZp
c2libGVTaXplKCk7CisgICAgRmxvYXRQb2ludCBjZW50ZXJPZlZpc2libGVDb250ZW50c1JlY3Qg
PSB0aGlzLT5jZW50ZXJPZlZpc2libGVDb250ZW50c1JlY3QoKTsKKyAgICBib29sIG5ld1Zpc2li
bGVSZWN0Q29udGFpbnNPbGRWaXNpYmxlUmVjdCA9IChtX2FjdHVhbFZpc2libGVIZWlnaHQgPD0g
dHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZS5oZWlnaHQoKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtX2FjdHVhbFZpc2libGVXaWR0aCA8PSB0cmFu
c2Zvcm1lZEFjdHVhbFZpc2libGVTaXplLndpZHRoKCkpOworCisgICAgYm9vbCBhdEluaXRpYWxT
Y2FsZSA9IGN1cnJlbnRTY2FsZSgpID09IGluaXRpYWxTY2FsZSgpOworICAgIGJvb2wgYXRUb3Ag
PSAhc2Nyb2xsUG9zaXRpb24oKS55KCk7CisgICAgYm9vbCBhdExlZnQgPSAhc2Nyb2xsUG9zaXRp
b24oKS54KCk7CisKKyAgICAvLyBXZSBuZWVkIHRvIHJlb3JpZW50IHRoZSB2aXNpYmxlVGlsZVJl
Y3QgYmVjYXVzZSB0aGUgZm9sbG93aW5nIGNvZGUKKyAgICAvLyBjb3VsZCBjYXVzZSBCYWNraW5n
U3RvcmU6OnRyYW5zZm9ybUNoYW5nZWQgdG8gYmUgY2FsbGVkLCB3aGVyZSBpdAorICAgIC8vIGlz
IHVzZWQuCisgICAgLy8gSXQgaXMgb25seSBkZXBlbmRlbnQgb24gdGhlIHRyYW5zZm9ybWVkVmll
d3BvcnRTaXplIHdoaWNoIGhhcyBiZWVuCisgICAgLy8gdXBkYXRlZCBieSBub3cuCisgICAgbV9i
YWNraW5nU3RvcmUtPmQtPmNyZWF0ZVZpc2libGVUaWxlQnVmZmVyKCk7CisKKyAgICBzZXREZWZh
dWx0TGF5b3V0U2l6ZSh0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKTsKKworICAgIC8vIFJl
Y29tcHV0ZSBvdXIgdmlydHVhbCB2aWV3cG9ydC4KKyAgICBib29sIG5lZWRzTGF5b3V0ID0gZmFs
c2U7CisgICAgc3RhdGljIFZpZXdwb3J0QXJndW1lbnRzIGRlZmF1bHRWaWV3cG9ydEFyZ3VtZW50
czsKKyAgICBpZiAoIShtX3ZpZXdwb3J0QXJndW1lbnRzID09IGRlZmF1bHRWaWV3cG9ydEFyZ3Vt
ZW50cykpIHsKKyAgICAgICAgLy8gV2UgbWF5IG5lZWQgdG8gaW5mZXIgdGhlIHdpZHRoIGFuZCBo
ZWlnaHQgZm9yIHRoZSB2aWV3cG9ydCB3aXRoIHJlc3BlY3QgdG8gdGhlIHJvdGF0aW9uLgorICAg
ICAgICBJbnRTaXplIG5ld1ZpcnR1YWxWaWV3cG9ydCA9IHJlY29tcHV0ZVZpcnR1YWxWaWV3cG9y
dEZyb21WaWV3cG9ydEFyZ3VtZW50cygpOworICAgICAgICBBU1NFUlQoIW5ld1ZpcnR1YWxWaWV3
cG9ydC5pc0VtcHR5KCkpOworICAgICAgICBtX3dlYlBhZ2UtPnNldFZpcnR1YWxWaWV3cG9ydFNp
emUobmV3VmlydHVhbFZpZXdwb3J0LndpZHRoKCksIG5ld1ZpcnR1YWxWaWV3cG9ydC5oZWlnaHQo
KSk7CisgICAgICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPnNldFVzZUZpeGVkTGF5b3V0KHVzZUZp
eGVkTGF5b3V0KCkpOworICAgICAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXRGaXhlZExheW91
dFNpemUoZml4ZWRMYXlvdXRTaXplKCkpOworICAgICAgICBuZWVkc0xheW91dCA9IHRydWU7Cisg
ICAgfQorCisgICAgLy8gV2Ugc3dpdGNoIHRoaXMgc3RyaWN0bHkgYWZ0ZXIgcmVjb21wdXRpbmcg
b3VyIHZpcnR1YWwgdmlld3BvcnQgYXMgem9vbVRvRml0U2NhbGUgaXMgZGVwZW5kZW50CisgICAg
Ly8gdXBvbiB0aGVzZSB2YWx1ZXMgYW5kIHNvIGlzIHRoZSB2aXJ0dWFsIHZpZXdwb3J0IHJlY2Fs
Y3VsYXRpb24uCisgICAgbV9hY3R1YWxWaXNpYmxlV2lkdGggPSB0cmFuc2Zvcm1lZEFjdHVhbFZp
c2libGVTaXplLndpZHRoKCk7CisgICAgbV9hY3R1YWxWaXNpYmxlSGVpZ2h0ID0gdHJhbnNmb3Jt
ZWRBY3R1YWxWaXNpYmxlU2l6ZS5oZWlnaHQoKTsKKworICAgIEludFNpemUgdmlld3BvcnRTaXpl
QWZ0ZXIgPSBhY3R1YWxWaXNpYmxlU2l6ZSgpOworCisgICAgSW50UG9pbnQgb2Zmc2V0KHJvdW5k
Zigodmlld3BvcnRTaXplQmVmb3JlLndpZHRoKCkgLSB2aWV3cG9ydFNpemVBZnRlci53aWR0aCgp
KSAvIDIuMCksCisgICAgICAgICAgICAgICAgICAgIHJvdW5kZigodmlld3BvcnRTaXplQmVmb3Jl
LmhlaWdodCgpIC0gdmlld3BvcnRTaXplQWZ0ZXIuaGVpZ2h0KCkpIC8gMi4wKSk7CisKKyAgICAv
LyBBcyBhIHNwZWNpYWwgY2FzZSwgaWYgd2Ugd2VyZSBhbmNob3JlZCB0byB0aGUgdG9wIGxlZnQg
cG9zaXRpb24gYXQKKyAgICAvLyB0aGUgYmVnaW5uaW5nIG9mIHRoZSByb3RhdGlvbiB0aGVuIHBy
ZXNlcnZlIHRoYXQgYW5jaG9yLgorICAgIGlmIChhdFRvcCkKKyAgICAgICAgb2Zmc2V0LnNldFko
MCk7CisgICAgaWYgKGF0TGVmdCkKKyAgICAgICAgb2Zmc2V0LnNldFgoMCk7CisKKyAgICAvLyBJ
ZiB3ZSdyZSBhYm91dCB0byBvdmVyc2Nyb2xsLCBjYXAgdGhlIG9mZnNldCB0byB2YWxpZCBjb250
ZW50LgorICAgIEludFBvaW50IGJvdHRvbVJpZ2h0KAorICAgICAgICBzY3JvbGxQb3NpdGlvbigp
LngoKSArIHZpZXdwb3J0U2l6ZUFmdGVyLndpZHRoKCksCisgICAgICAgIHNjcm9sbFBvc2l0aW9u
KCkueSgpICsgdmlld3BvcnRTaXplQWZ0ZXIuaGVpZ2h0KCkpOworCisgICAgaWYgKGJvdHRvbVJp
Z2h0LngoKSArIG9mZnNldC54KCkgPiBjb250ZW50c1NpemUoKS53aWR0aCgpKQorICAgICAgICBv
ZmZzZXQuc2V0WChjb250ZW50c1NpemUoKS53aWR0aCgpIC0gYm90dG9tUmlnaHQueCgpKTsKKyAg
ICBpZiAoYm90dG9tUmlnaHQueSgpICsgb2Zmc2V0LnkoKSA+IGNvbnRlbnRzU2l6ZSgpLmhlaWdo
dCgpKQorICAgICAgICBvZmZzZXQuc2V0WShjb250ZW50c1NpemUoKS5oZWlnaHQoKSAtIGJvdHRv
bVJpZ2h0LnkoKSk7CisgICAgaWYgKHNjcm9sbFBvc2l0aW9uKCkueCgpICsgb2Zmc2V0LngoKSA8
IDApCisgICAgICAgIG9mZnNldC5zZXRYKC1zY3JvbGxQb3NpdGlvbigpLngoKSk7CisgICAgaWYg
KHNjcm9sbFBvc2l0aW9uKCkueSgpICsgb2Zmc2V0LnkoKSA8IDApCisgICAgICAgIG9mZnNldC5z
ZXRZKC1zY3JvbGxQb3NpdGlvbigpLnkoKSk7CisKKyAgICAvLyAuLi5iZWZvcmUgc2Nyb2xsaW5n
LCBiZWNhdXNlIHRoZSBiYWNraW5nIHN0b3JlIHdpbGwgYWxpZ24gaXRzCisgICAgLy8gdGlsZSBt
YXRyaXggd2l0aCB0aGUgdmlld3BvcnQgYXMgcmVwb3J0ZWQgYnkgdGhlIFNjcm9sbFZpZXcuCisg
ICAgc2Nyb2xsQnkob2Zmc2V0LngoKSwgb2Zmc2V0LnkoKSk7CisgICAgbm90aWZ5VHJhbnNmb3Jt
ZWRTY3JvbGxDaGFuZ2VkKCk7CisKKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+b3JpZW50YXRpb25D
aGFuZ2VkKCk7CisgICAgbV9iYWNraW5nU3RvcmUtPmQtPmFjdHVhbFZpc2libGVTaXplQ2hhbmdl
ZCh0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKTsKKworICAgIC8vIFVwZGF0ZSB2aWV3IG1v
ZGUgb25seSBhZnRlciB3ZSBoYXZlIHVwZGF0ZWQgdGhlIGFjdHVhbAorICAgIC8vIHZpc2libGUg
c2l6ZSBhbmQgcmVzZXQgdGhlIGNvbnRlbnRzIHJlY3QgaWYgbmVjZXNzYXJ5LgorICAgIGlmIChz
ZXRWaWV3TW9kZSh2aWV3TW9kZSgpKSkKKyAgICAgICAgbmVlZHNMYXlvdXQgPSB0cnVlOworCisg
ICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHZpZXdwb3J0IHNpemUgb2YgdGhlIFdlYkNvcmU6
OlNjcm9sbFZpZXcuLi4KKyAgICB1cGRhdGVWaWV3cG9ydFNpemUoIWhhc1BlbmRpbmdPcmllbnRh
dGlvbiAvKiBzZXRGaXhlZFJlcG9ydGVkU2l6ZSAqLywgZmFsc2UgLyogc2VuZFJlc2l6ZUV2ZW50
ICovKTsKKyAgICBub3RpZnlUcmFuc2Zvcm1lZENvbnRlbnRzU2l6ZUNoYW5nZWQoKTsKKworICAg
IC8vIElmIGF1dG9tYXRpYyB6b29taW5nIGlzIGRpc2FibGVkLCBwcmV2ZW50IHpvb21pbmcgYmVs
b3cuCisgICAgaWYgKCFtX3dlYlNldHRpbmdzLT5pc1pvb21Ub0ZpdE9uTG9hZCgpKSB7CisgICAg
ICAgIGF0SW5pdGlhbFNjYWxlID0gZmFsc2U7CisKKyAgICAgICAgLy8gTm9ybWFsbHksIGlmIHRo
ZSBjb250ZW50cyBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgbGF5b3V0IHdpZHRoLAorICAgICAg
ICAvLyB3ZSB3b3VsZCB6b29tIGluLiBJZiB6b29tIGlzIGRpc2FibGVkLCB3ZSBuZWVkIHRvIGRv
IHNvbWV0aGluZyBlbHNlLAorICAgICAgICAvLyBvciB0aGVyZSB3aWxsIGJlIGFydGlmYWN0cyBk
dWUgdG8gbm9uLXJlbmRlcmVkIGFyZWFzIG91dHNpZGUgb2YgdGhlCisgICAgICAgIC8vIGNvbnRl
bnRzIHNpemUuIElmIHRoZXJlIGlzIGEgdmlydHVhbCB2aWV3cG9ydCwgd2UgYXJlIG5vdCBhbGxv
d2VkCisgICAgICAgIC8vIHRvIG1vZGlmeSB0aGUgZml4ZWQgbGF5b3V0IHNpemUsIGhvd2V2ZXIu
CisgICAgICAgIGlmICghaGFzVmlydHVhbFZpZXdwb3J0KCkgJiYgY29udGVudHNTaXplKCkud2lk
dGgoKSA8IG1fZGVmYXVsdExheW91dFNpemUud2lkdGgoKSkgeworICAgICAgICAgICAgbV9tYWlu
RnJhbWUtPnZpZXcoKS0+c2V0VXNlRml4ZWRMYXlvdXQodXNlRml4ZWRMYXlvdXQoKSk7CisgICAg
ICAgICAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXRGaXhlZExheW91dFNpemUobV9kZWZhdWx0
TGF5b3V0U2l6ZSk7CisgICAgICAgICAgICBuZWVkc0xheW91dCA9IHRydWU7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICBpZiAobmVlZHNMYXlvdXQpCisgICAgICAgIHNldE5lZWRzTGF5b3V0KCk7
CisKKyAgICAvLyBOZWVkIHRvIHJlc3VtZSBzbyB0aGF0IHRoZSBiYWNraW5nc3RvcmUgd2lsbCBz
dGFydCByZWNvcmRpbmcgdGhlIGludmFsaWRhdGVkCisgICAgLy8gcmVjdHMgZnJvbSBiZWxvdy4K
KyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRl
cyhCYWNraW5nU3RvcmU6Ok5vbmUpOworCisgICAgLy8gV2UgbWlnaHQgbmVlZCB0byBsYXlvdXQg
aGVyZSB0byBnZXQgYSBjb3JyZWN0IGNvbnRlbnRzU2l6ZSBzbyB0aGF0IHpvb21Ub0ZpdAorICAg
IC8vIGlzIGNhbGN1bGF0ZWQgY29ycmVjdGx5LgorICAgIHJlcXVlc3RMYXlvdXRJZk5lZWRlZCgp
OworCisgICAgLy8gQXMgYSBzcGVjaWFsIGNhc2UgaWYgd2Ugd2VyZSB6b29tZWQgdG8gdGhlIGlu
aXRpYWwgc2NhbGUgYXQgdGhlIGJlZ2lubmluZworICAgIC8vIG9mIHRoZSByb3RhdGlvbiB0aGVu
IHByZXNlcnZlIHRoYXQgem9vbSBsZXZlbCBldmVuIHdoZW4gaXQgaXMgem9vbVRvRml0LgorICAg
IGRvdWJsZSBzY2FsZSA9IGF0SW5pdGlhbFNjYWxlID8gaW5pdGlhbFNjYWxlKCkgOiBjdXJyZW50
U2NhbGUoKTsKKworICAgIC8vIERvIG91ciBvd24gY2xhbXBpbmcuCisgICAgc2NhbGUgPSBjbGFt
cGVkU2NhbGUoc2NhbGUpOworCisgICAgaWYgKGhhc1BlbmRpbmdPcmllbnRhdGlvbikgeworICAg
ICAgICAvLyBTZXQgdGhlIGZpeGVkIHJlcG9ydGVkIHNpemUgaGVyZSBzbyB0aGF0IGlubmVyV2lk
dGh8aW5uZXJIZWlnaHQgd29ya3MKKyAgICAgICAgLy8gd2l0aCB0aGlzIG5ldyBzY2FsZS4KKyAg
ICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggcm90YXRpb25NYXRyaXg7CisgICAgICAgIHJvdGF0
aW9uTWF0cml4LnNjYWxlKHNjYWxlKTsKKyAgICAgICAgSW50UmVjdCB2aWV3cG9ydFJlY3QgPSBJ
bnRSZWN0KEludFBvaW50Ojp6ZXJvKCksIHRyYW5zZm9ybWVkQWN0dWFsVmlzaWJsZVNpemUpOwor
ICAgICAgICBJbnRSZWN0IGFjdHVhbFZpc2libGVSZWN0ID0gZW5jbG9zaW5nSW50UmVjdChyb3Rh
dGlvbk1hdHJpeC5pbnZlcnNlKCkubWFwUmVjdChGbG9hdFJlY3Qodmlld3BvcnRSZWN0KSkpOwor
ICAgICAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXRGaXhlZFJlcG9ydGVkU2l6ZShhY3R1YWxW
aXNpYmxlUmVjdC5zaXplKCkpOworICAgIH0KKworICAgIC8vIFdlJ3JlIGdvaW5nIHRvIG5lZWQg
dG8gc2VuZCBhIHJlc2l6ZSBldmVudCB0byBKYXZhU2NyaXB0IGJlY2F1c2UKKyAgICAvLyBpbm5l
cldpZHRoIGFuZCBpbm5lckhlaWdodCBkZXBlbmQgb24gZml4ZWQgcmVwb3J0ZWQgc2l6ZS4KKyAg
ICAvLyBUaGlzIGlzIGhvdyB3ZSBzdXBwb3J0IG1vYmlsZSBwYWdlcyB3aGVyZSBKYXZhU2NyaXB0
IHJlc2l6ZXMKKyAgICAvLyB0aGUgcGFnZSBpbiBvcmRlciB0byBnZXQgYXJvdW5kIHRoZSBmaXhl
ZCBsYXlvdXQgc2l6ZSwgZS5nLgorICAgIC8vIGdvb2dsZSBtYXBzIHdoZW4gaXQgZGV0ZWN0cyBh
IG1vYmlsZSB1c2VyIGFnZW50LgorICAgIGlmIChzaG91bGRTZW5kUmVzaXplRXZlbnQoKSkKKyAg
ICAgICAgbV9tYWluRnJhbWUtPmV2ZW50SGFuZGxlcigpLT5zZW5kUmVzaXplRXZlbnQoKTsKKwor
ICAgIC8vIEFzIGEgc3BlY2lhbCBjYXNlIGlmIHdlIHdlcmUgYW5jaG9yZWQgdG8gdGhlIHRvcCBs
ZWZ0IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcKKyAgICAvLyBvZiB0aGUgcm90YXRpb24gdGhl
biBwcmVzZXJ2ZSB0aGF0IGFuY2hvci4KKyAgICBGbG9hdFBvaW50IGFuY2hvciA9IGNlbnRlck9m
VmlzaWJsZUNvbnRlbnRzUmVjdDsKKyAgICBpZiAoYXRUb3ApCisgICAgICAgIGFuY2hvci5zZXRZ
KDApOworICAgIGlmIChhdExlZnQpCisgICAgICAgIGFuY2hvci5zZXRYKDApOworCisgICAgLy8g
VHJ5IGFuZCB6b29tIGhlcmUgd2l0aCBjbGFtcGluZyBvbi4KKyAgICBpZiAobV9iYWNraW5nU3Rv
cmUtPmQtPnNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpIHsKKyAgICAgICAgYm9vbCBz
dWNjZXNzID0gem9vbUFib3V0UG9pbnQoc2NhbGUsIGFuY2hvciwgZmFsc2UgLyogZW5mb3JjZVNj
YWxlQ2xhbXBpbmcgKi8sIHRydWUgLyogZm9yY2VSZW5kZXJpbmcgKi8pOworICAgICAgICBpZiAo
IXN1Y2Nlc3MgJiYgZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJsZSkKKyAgICAgICAgICAgIGVuc3Vy
ZUNvbnRlbnRWaXNpYmxlKCFuZXdWaXNpYmxlUmVjdENvbnRhaW5zT2xkVmlzaWJsZVJlY3QpOwor
ICAgIH0gZWxzZSBpZiAoIXNjaGVkdWxlWm9vbUFib3V0UG9pbnQoc2NhbGUsIGFuY2hvciwgZmFs
c2UgLyogZW5mb3JjZVNjYWxlQ2xhbXBpbmcgKi8sIHRydWUgLyogZm9yY2VSZW5kZXJpbmcgKi8p
KSB7CisgICAgICAgIC8vIFN1c3BlbmQgYWxsIHNjcmVlbiB1cGRhdGVzIHRvIHRoZSBiYWNraW5n
c3RvcmUuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5zdXNwZW5kU2NyZWVuQW5kQmFja2lu
Z1N0b3JlVXBkYXRlcygpOworCisgICAgICAgIC8vIElmIHRoZSB6b29tIGZhaWxlZCwgdGhlbiB3
ZSBzaG91bGQgc3RpbGwgcHJlc2VydmUgdGhlIHNwZWNpYWwgY2FzZSBvZiBzY3JvbGwgcG9zaXRp
b24uCisgICAgICAgIEludFBvaW50IHNjcm9sbFBvc2l0aW9uID0gdGhpcy0+c2Nyb2xsUG9zaXRp
b24oKTsKKyAgICAgICAgaWYgKGF0VG9wKQorICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24uc2V0
WSgwKTsKKyAgICAgICAgaWYgKGF0TGVmdCkKKyAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLnNl
dFgoMCk7CisgICAgICAgIHNldFNjcm9sbFBvc2l0aW9uKHNjcm9sbFBvc2l0aW9uKTsKKworICAg
ICAgICAvLyBUaGVzZSBtaWdodCBoYXZlIGJlZW4gYWx0ZXJlZCBldmVuIGlmIHdlIGRpZG4ndCB6
b29tIHNvIG5vdGlmeSB0aGUgY2xpZW50LgorICAgICAgICBub3RpZnlUcmFuc2Zvcm1lZENvbnRl
bnRzU2l6ZUNoYW5nZWQoKTsKKyAgICAgICAgbm90aWZ5VHJhbnNmb3JtZWRTY3JvbGxDaGFuZ2Vk
KCk7CisKKyAgICAgICAgaWYgKCFuZWVkc0xheW91dCkgeworICAgICAgICAgICAgLy8gVGhlIHZp
c2libGUgdGlsZXMgZm9yIHNjcm9sbCBtdXN0IGJlIHVwLXRvLWRhdGUgYmVmb3JlIHdlIGJsaXQg
c2luY2Ugd2UgYXJlIG5vdCBwZXJmb3JtaW5nIGEgbGF5b3V0LgorICAgICAgICAgICAgbV9iYWNr
aW5nU3RvcmUtPmQtPnVwZGF0ZVRpbGVzRm9yU2Nyb2xsT3JOb3RSZW5kZXJlZFJlZ2lvbigpOwor
ICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuc3VyZUZvY3VzRWxlbWVudFZpc2libGUpCisgICAg
ICAgICAgICBlbnN1cmVDb250ZW50VmlzaWJsZSghbmV3VmlzaWJsZVJlY3RDb250YWluc09sZFZp
c2libGVSZWN0KTsKKworICAgICAgICBpZiAobmVlZHNMYXlvdXQpIHsKKyAgICAgICAgICAgIG1f
YmFja2luZ1N0b3JlLT5kLT5yZXNldFRpbGVzKHRydWUpOworICAgICAgICAgICAgbV9iYWNraW5n
U3RvcmUtPmQtPnVwZGF0ZVRpbGVzKGZhbHNlIC8qIHVwZGF0ZVZpc2libGUgKi8sIGZhbHNlIC8q
IGltbWVkaWF0ZSAqLyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSBuZWVkIGxheW91
dCB0aGVuIHJlbmRlciBhbmQgYmxpdCwgb3RoZXJ3aXNlIGp1c3QgYmxpdCBhcyBvdXIgdmlld3Bv
cnQgaGFzIGNoYW5nZWQuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXN1bWVTY3JlZW5B
bmRCYWNraW5nU3RvcmVVcGRhdGVzKG5lZWRzTGF5b3V0ID8gQmFja2luZ1N0b3JlOjpSZW5kZXJB
bmRCbGl0IDogQmFja2luZ1N0b3JlOjpCbGl0KTsKKyAgICB9IGVsc2UgaWYgKGVuc3VyZUZvY3Vz
RWxlbWVudFZpc2libGUpCisgICAgICAgIGVuc3VyZUNvbnRlbnRWaXNpYmxlKCFuZXdWaXNpYmxl
UmVjdENvbnRhaW5zT2xkVmlzaWJsZVJlY3QpOworfQorCit2b2lkIFdlYlBhZ2U6OnNldERlZmF1
bHRMYXlvdXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBJbnRTaXplIHNpemUo
d2lkdGgsIGhlaWdodCk7CisgICAgaWYgKHNpemUgPT0gZC0+bV9kZWZhdWx0TGF5b3V0U2l6ZSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgZC0+c2V0RGVmYXVsdExheW91dFNpemUoc2l6ZSk7Cisg
ICAgYm9vbCBuZWVkc0xheW91dCA9IGQtPnNldFZpZXdNb2RlKGQtPnZpZXdNb2RlKCkpOworICAg
IGlmIChuZWVkc0xheW91dCkgeworICAgICAgICBkLT5zZXROZWVkc0xheW91dCgpOworICAgICAg
ICBpZiAoIWQtPmlzTG9hZGluZygpKQorICAgICAgICAgICAgZC0+cmVxdWVzdExheW91dElmTmVl
ZGVkKCk7CisgICAgfQorfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXREZWZhdWx0TGF5b3V0
U2l6ZShjb25zdCBJbnRTaXplJiBzaXplKQoreworICAgIEludFNpemUgc2NyZWVuU2l6ZSA9IFBs
YXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjpzaXplKCk7CisgICAgQVNTRVJUKHNpemUud2lkdGgo
KSA8PSBzY3JlZW5TaXplLndpZHRoKCkgJiYgc2l6ZS5oZWlnaHQoKSA8PSBzY3JlZW5TaXplLmhl
aWdodCgpKTsKKyAgICBtX2RlZmF1bHRMYXlvdXRTaXplID0gc2l6ZS5leHBhbmRlZFRvKG1pbmlt
dW1MYXlvdXRTaXplKS5zaHJ1bmtUbyhzY3JlZW5TaXplKTsKK30KKworYm9vbCBXZWJQYWdlOjpt
b3VzZUV2ZW50KGNvbnN0IFBsYXRmb3JtOjpNb3VzZUV2ZW50JiBtb3VzZUV2ZW50LCBib29sKiB3
aGVlbERlbHRhQWNjZXB0ZWQpCit7CisgICAgaWYgKCFkLT5tX21haW5GcmFtZS0+dmlldygpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBQbHVnaW5WaWV3KiBwbHVnaW5WaWV3ID0gZC0+
bV9mdWxsU2NyZWVuUGx1Z2luVmlldy5nZXQoKTsKKyAgICBpZiAocGx1Z2luVmlldykKKyAgICAg
ICAgcmV0dXJuIGQtPmRpc3BhdGNoTW91c2VFdmVudFRvRnVsbFNjcmVlblBsdWdpbihwbHVnaW5W
aWV3LCBtb3VzZUV2ZW50KTsKKworICAgIGlmIChtb3VzZUV2ZW50LnR5cGUoKSA9PSBQbGF0Zm9y
bTo6TW91c2VFdmVudDo6TW91c2VBYm9ydGVkKSB7CisgICAgICAgIGQtPm1fbWFpbkZyYW1lLT5l
dmVudEhhbmRsZXIoKS0+c2V0TW91c2VQcmVzc2VkKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIH0KKworICAgIGQtPm1fcGx1Z2luTWF5T3Blbk5ld1RhYiA9IHRydWU7CisKKyAg
ICBkLT5tX2xhc3RVc2VyRXZlbnRUaW1lc3RhbXAgPSBjdXJyZW50VGltZSgpOworICAgIGludCBj
bGlja0NvdW50ID0gKGQtPm1fc2VsZWN0aW9uSGFuZGxlci0+aXNTZWxlY3Rpb25BY3RpdmUoKSB8
fCBtb3VzZUV2ZW50LnR5cGUoKSAhPSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6TW91c2VNb3ZlKSA/
IDEgOiAwOworCisgICAgLy8gU2V0IHRoZSBidXR0b24gdHlwZS4KKyAgICBNb3VzZUJ1dHRvbiBi
dXR0b25UeXBlID0gTm9CdXR0b247CisgICAgaWYgKG1vdXNlRXZlbnQuaXNMZWZ0QnV0dG9uKCkp
CisgICAgICAgIGJ1dHRvblR5cGUgPSBMZWZ0QnV0dG9uOworICAgIGVsc2UgaWYgKG1vdXNlRXZl
bnQuaXNSaWdodEJ1dHRvbigpKQorICAgICAgICBidXR0b25UeXBlID0gUmlnaHRCdXR0b247Cisg
ICAgZWxzZSBpZiAobW91c2VFdmVudC5pc01pZGRsZUJ1dHRvbigpKQorICAgICAgICBidXR0b25U
eXBlID0gTWlkZGxlQnV0dG9uOworCisgICAgLy8gQ3JlYXRlIG91ciBldmVudC4KKyAgICBQbGF0
Zm9ybU1vdXNlRXZlbnQgcGxhdGZvcm1Nb3VzZUV2ZW50KGQtPm1hcEZyb21UcmFuc2Zvcm1lZCht
b3VzZUV2ZW50LnBvc2l0aW9uKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZC0+bWFwRnJvbVRyYW5zZm9ybWVkKG1vdXNlRXZlbnQuc2NyZWVuUG9zaXRpb24o
KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1dlYkNvcmVN
b3VzZUV2ZW50VHlwZShtb3VzZUV2ZW50LnR5cGUoKSksIGNsaWNrQ291bnQsIGJ1dHRvblR5cGUs
IFBvaW50aW5nRGV2aWNlKTsKKyAgICBkLT5tX2xhc3RNb3VzZUV2ZW50ID0gcGxhdGZvcm1Nb3Vz
ZUV2ZW50OworICAgIGJvb2wgc3VjY2VzcyA9IGQtPmhhbmRsZU1vdXNlRXZlbnQocGxhdGZvcm1N
b3VzZUV2ZW50KTsKKworICAgIGlmIChtb3VzZUV2ZW50LndoZWVsVGlja3MoKSkgeworICAgICAg
ICBQbGF0Zm9ybVdoZWVsRXZlbnQgd2hlZWxFdmVudChkLT5tYXBGcm9tVHJhbnNmb3JtZWQobW91
c2VFdmVudC5wb3NpdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZC0+bWFwRnJvbVRyYW5zZm9ybWVkKG1vdXNlRXZlbnQuc2NyZWVuUG9zaXRpb24oKSksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC1tb3VzZUV2ZW50LndoZWVs
RGVsdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLW1vdXNl
RXZlbnQud2hlZWxUaWNrcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBTY3JvbGxCeVBpeGVsV2hlZWxFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBpZiAod2hlZWxE
ZWx0YUFjY2VwdGVkKQorICAgICAgICAgICAgKndoZWVsRGVsdGFBY2NlcHRlZCA9IGQtPmhhbmRs
ZVdoZWVsRXZlbnQod2hlZWxFdmVudCk7CisgICAgfSBlbHNlIGlmICh3aGVlbERlbHRhQWNjZXB0
ZWQpCisgICAgICAgICp3aGVlbERlbHRhQWNjZXB0ZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBz
dWNjZXNzOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpkaXNwYXRjaE1vdXNlRXZlbnRUb0Z1
bGxTY3JlZW5QbHVnaW4oUGx1Z2luVmlldyogcGx1Z2luLCBjb25zdCBQbGF0Zm9ybTo6TW91c2VF
dmVudCYgZXZlbnQpCit7CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIE5QTW91c2VFdmVudCBt
b3VzZUV2ZW50OworCisgICAgbW91c2VFdmVudC54ID0gZXZlbnQuc2NyZWVuUG9zaXRpb24oKS54
KCk7CisgICAgbW91c2VFdmVudC55ID0gZXZlbnQuc2NyZWVuUG9zaXRpb24oKS55KCk7CisKKyAg
ICBzd2l0Y2ggKGV2ZW50LnR5cGUoKSkgeworICAgIGNhc2UgUGxhdGZvcm06Ok1vdXNlRXZlbnQ6
Ok1vdXNlQnV0dG9uRG93bjoKKyAgICAgICAgbW91c2VFdmVudC50eXBlID0gTU9VU0VfQlVUVE9O
X0RPV047CisgICAgICAgIG1fcGx1Z2luTW91c2VCdXR0b25QcmVzc2VkID0gdHJ1ZTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6TW91c2VCdXR0b25VcDoK
KyAgICAgICAgbW91c2VFdmVudC50eXBlID0gTU9VU0VfQlVUVE9OX1VQOworICAgICAgICBtX3Bs
dWdpbk1vdXNlQnV0dG9uUHJlc3NlZCA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IFBsYXRmb3JtOjpNb3VzZUV2ZW50OjpNb3VzZU1vdmU6CisgICAgICAgIG1vdXNlRXZlbnQudHlw
ZSA9IE1PVVNFX01PVElPTjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1vdXNlRXZlbnQuZmxhZ3MgPSAwOworICAgIG1v
dXNlRXZlbnQuYnV0dG9uID0gbV9wbHVnaW5Nb3VzZUJ1dHRvblByZXNzZWQ7CisKKyAgICBucEV2
ZW50LnR5cGUgPSBOUF9Nb3VzZUV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9ICZtb3VzZUV2ZW50
OworCisgICAgcmV0dXJuIHBsdWdpbi0+ZGlzcGF0Y2hGdWxsU2NyZWVuTlBFdmVudChucEV2ZW50
KTsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRWaXJ0dWFsS2V5Ym9hcmRWaXNpYmxlKGJvb2wgdmlz
aWJsZSkKK3sKKyAgICBkLT5zaG93VmlydHVhbEtleWJvYXJkKHZpc2libGUpOworfQorCitib29s
IFdlYlBhZ2VQcml2YXRlOjpoYW5kbGVNb3VzZUV2ZW50KFBsYXRmb3JtTW91c2VFdmVudCYgbW91
c2VFdmVudCkKK3sKKyAgICBFdmVudEhhbmRsZXIqIGV2ZW50SGFuZGxlciA9IG1fbWFpbkZyYW1l
LT5ldmVudEhhbmRsZXIoKTsKKworICAgIGlmIChtb3VzZUV2ZW50LmV2ZW50VHlwZSgpID09IE1v
dXNlRXZlbnRNb3ZlZCkKKyAgICAgICAgcmV0dXJuIGV2ZW50SGFuZGxlci0+bW91c2VNb3ZlZCht
b3VzZUV2ZW50KTsKKworICAgIGlmIChtb3VzZUV2ZW50LmV2ZW50VHlwZSgpID09IE1vdXNlRXZl
bnRTY3JvbGwpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgTm9kZSogbm9kZSA9IDA7Cisg
ICAgaWYgKG1vdXNlRXZlbnQuaW5wdXRNZXRob2QoKSA9PSBUb3VjaFNjcmVlbikgeworICAgICAg
ICBjb25zdCBGYXRGaW5nZXJzUmVzdWx0IGxhc3RGYXRGaW5nZXJzUmVzdWx0ID0gbV90b3VjaEV2
ZW50SGFuZGxlci0+bGFzdEZhdEZpbmdlcnNSZXN1bHQoKTsKKworICAgICAgICAvLyBGYXQgZmlu
Z2VycyBjYW4gZGVhbCB3aXRoIHNoYWRvdyBjb250ZW50LgorICAgICAgICBpZiAobm9kZSA9IGxh
c3RGYXRGaW5nZXJzUmVzdWx0LnZhbGlkTm9kZSgpKQorICAgICAgICAgICAgbm9kZSA9IG5vZGUt
PnNoYWRvd0FuY2VzdG9yTm9kZSgpOworICAgIH0KKworICAgIGlmICghbm9kZSkgeworICAgICAg
ICBIaXRUZXN0UmVzdWx0IHJlc3VsdCA9IGV2ZW50SGFuZGxlci0+aGl0VGVzdFJlc3VsdEF0UG9p
bnQobWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyhtb3VzZUV2ZW50LnBvcygpKSwgZmFsc2UgLyph
bGxvd1NoYWRvd0NvbnRlbnQqLyk7CisgICAgICAgIG5vZGUgPSByZXN1bHQuaW5uZXJOb2RlKCk7
CisgICAgfQorCisgICAgaWYgKG1vdXNlRXZlbnQuZXZlbnRUeXBlKCkgPT0gTW91c2VFdmVudFBy
ZXNzZWQpIHsKKyAgICAgICAgaWYgKG1faW5wdXRIYW5kbGVyLT53aWxsT3BlblBvcHVwRm9yTm9k
ZShub2RlKSkgeworICAgICAgICAgICAgLy8gRG8gbm90IGFsbG93IGFueSBodW1hbiBnZW5lcmF0
ZWQgbW91c2Ugb3Iga2V5Ym9hcmQgZXZlbnRzIHRvIHNlbGVjdCA8b3B0aW9uPnMgaW4gdGhlIGxp
c3QgYm94CisgICAgICAgICAgICAvLyBiZWNhdXNlIHdlIHVzZSBhIHBvcCB1cCBkaWFsb2cgdG8g
aGFuZGxlIHRoZSBhY3R1YWwgc2VsZWN0aW9ucy4gVGhpcyBwcmV2ZW50cyBvcHRpb25zIGZyb20K
KyAgICAgICAgICAgIC8vIGJlaW5nIHNlbGVjdGVkIHByaW9yIHRvIGRpc3BsYXlpbmcgdGhlIHBv
cCB1cCBkaWFsb2cuIFRoZSBjb250ZW50cyBvZiB0aGUgbGlzdGJveCBhcmUgZm9yCisgICAgICAg
ICAgICAvLyBkaXNwbGF5IG9ubHkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gRklY
TUU6IFdlIGV4cGxpY2l0bHkgZG8gbm90IGZvcndhcmQgdGhpcyBldmVudCB0byBXZWJDb3JlIHNv
IGFzIHRvIHByZXNlcnZlIHN5bW1ldHJ5IHdpdGgKKyAgICAgICAgICAgIC8vIHRoZSBNb3VzZUV2
ZW50UmVsZWFzZWQgaGFuZGxpbmcgKGJlbG93KS4gVGhpcyBoYXMgdGhlIHNpZGUtZWZmZWN0IHRo
YXQgbW91c2Vkb3duIGV2ZW50cworICAgICAgICAgICAgLy8gYXJlIG5vdCBmaXJlZCBmb3IgaHVt
YW4gZ2VuZXJhdGVkIG1vdXNlIHByZXNzIGV2ZW50cy4gU2VlIFJJTSBCdWcgIzE1NzkuCisKKyAg
ICAgICAgICAgIC8vIFdlIGRvIGZvY3VzIDxzZWxlY3Q+LzxvcHRpb24+IG9uIG1vdXNlIGRvd24g
c28gdGhhdCBhIEZvY3VzIGV2ZW50IGlzIGZpcmVkIGFuZCBoYXZlIHRoZQorICAgICAgICAgICAg
Ly8gZWxlbWVudCBwYWludGVkIGluIGl0cyBmb2N1cyBzdGF0ZSBvbiByZXBhaW50LgorICAgICAg
ICAgICAgQVNTRVJUKG5vZGUtPmlzRWxlbWVudE5vZGUoKSk7CisgICAgICAgICAgICBpZiAobm9k
ZS0+aXNFbGVtZW50Tm9kZSgpKSB7CisgICAgICAgICAgICAgICAgRWxlbWVudCogZWxlbWVudCA9
IHN0YXRpY19jYXN0PEVsZW1lbnQqPihub2RlKTsKKyAgICAgICAgICAgICAgICBlbGVtZW50LT5m
b2N1cygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGV2ZW50
SGFuZGxlci0+aGFuZGxlTW91c2VQcmVzc0V2ZW50KG1vdXNlRXZlbnQpOworICAgIH0gZWxzZSBp
ZiAobW91c2VFdmVudC5ldmVudFR5cGUoKSA9PSBNb3VzZUV2ZW50UmVsZWFzZWQpIHsKKyAgICAg
ICAgLy8gRklYTUU6IEZvciA8c2VsZWN0PiBhbmQgPG9wdGlvbnM+IGVsZW1lbnRzLCB3ZSBleHBs
aWNpdGx5IGRvIG5vdCBmb3J3YXJkIHRoaXMgZXZlbnQgdG8gV2ViQ29yZSBzbworICAgICAgICAv
LyBhcyB0byBwcmVzZXJ2ZSBzeW1tZXRyeSB3aXRoIHRoZSBNb3VzZUV2ZW50UHJlc3NlZCBoYW5k
bGluZyAoYWJvdmUpLiBUaGlzIGhhcyB0aGUgc2lkZS1lZmZlY3QgdGhhdAorICAgICAgICAvLyBt
b3VzZXVwIGV2ZW50cyBhcmUgbm90IGZpcmVkIG9uIHN1Y2ggZWxlbWVudHMgZm9yIGh1bWFuIGdl
bmVyYXRlZCBtb3VzZSByZWxlYXNlIGV2ZW50cy4gU2VlIFJJTSBCdWcgIzE1NzkuCisgICAgICAg
IGlmICghbV9pbnB1dEhhbmRsZXItPmRpZE5vZGVPcGVuUG9wdXAobm9kZSkpCisgICAgICAgICAg
ICBldmVudEhhbmRsZXItPmhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KG1vdXNlRXZlbnQpOworICAg
IH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpoYW5kbGVX
aGVlbEV2ZW50KFBsYXRmb3JtV2hlZWxFdmVudCYgd2hlZWxFdmVudCkKK3sKKyAgICBFdmVudEhh
bmRsZXIqIGV2ZW50SGFuZGxlciA9IG1fbWFpbkZyYW1lLT5ldmVudEhhbmRsZXIoKTsKKworICAg
IHJldHVybiBldmVudEhhbmRsZXItPmhhbmRsZVdoZWVsRXZlbnQod2hlZWxFdmVudCk7Cit9CisK
K2Jvb2wgV2ViUGFnZTo6dG91Y2hFdmVudChjb25zdCBQbGF0Zm9ybTo6VG91Y2hFdmVudCYgZXZl
bnQpCit7CisjaWYgREVCVUdfVE9VQ0hfRVZFTlRTCisgICAgc3dpdGNoIChldmVudC5tX3R5cGUp
IHsKKyAgICBjYXNlIFBsYXRmb3JtOjpUb3VjaEV2ZW50OjpUb3VjaEVuZDoKKyAgICAgICAgUGxh
dGZvcm06OmxvZyhQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIldlYlBhZ2U6OnRvdWNoRXZl
bnQgVG91Y2ggRW5kIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUGxhdGZvcm06OlRvdWNo
RXZlbnQ6OlRvdWNoU3RhcnQ6CisgICAgICAgIFBsYXRmb3JtOjpsb2coUGxhdGZvcm06OkxvZ0xl
dmVsQ3JpdGljYWwsICJXZWJQYWdlOjp0b3VjaEV2ZW50IFRvdWNoIFN0YXJ0Iik7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgUGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNoTW92ZToKKyAgICAg
ICAgUGxhdGZvcm06OmxvZyhQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIldlYlBhZ2U6OnRv
dWNoRXZlbnQgVG91Y2ggTW92ZSIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBsYXRmb3Jt
OjpUb3VjaEV2ZW50OjpUb3VjaENhbmNlbDoKKyAgICAgICAgUGxhdGZvcm06OmxvZyhQbGF0Zm9y
bTo6TG9nTGV2ZWxDcml0aWNhbCwgIldlYlBhZ2U6OnRvdWNoQ2FuY2VsIFRvdWNoIENhbmNlbCIp
OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
ZXZlbnQubV9wb2ludHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChldmVudC5tX3Bv
aW50c1tpXS5tX3N0YXRlKSB7CisgICAgICAgIGNhc2UgUGxhdGZvcm06OlRvdWNoUG9pbnQ6OlRv
dWNoUHJlc3NlZDoKKyAgICAgICAgICAgIFBsYXRmb3JtOjpsb2coUGxhdGZvcm06OkxvZ0xldmVs
Q3JpdGljYWwsICJXZWJQYWdlOjp0b3VjaEV2ZW50ICVkIFRvdWNoIFByZXNzZWQgKCVkLCAlZCki
LCBldmVudC5tX3BvaW50c1tpXS5tX2lkLCBldmVudC5tX3BvaW50c1tpXS5tX3Bvcy54KCksIGV2
ZW50Lm1fcG9pbnRzW2ldLm1fcG9zLnkoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBQbGF0Zm9ybTo6VG91Y2hQb2ludDo6VG91Y2hSZWxlYXNlZDoKKyAgICAgICAgICAgIFBs
YXRmb3JtOjpsb2coUGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJXZWJQYWdlOjp0b3VjaEV2
ZW50ICVkIFRvdWNoIFJlbGVhc2VkICglZCwgJWQpIiwgZXZlbnQubV9wb2ludHNbaV0ubV9pZCwg
ZXZlbnQubV9wb2ludHNbaV0ubV9wb3MueCgpLCBldmVudC5tX3BvaW50c1tpXS5tX3Bvcy55KCkp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm06OlRvdWNoUG9pbnQ6
OlRvdWNoTW92ZWQ6CisgICAgICAgICAgICBQbGF0Zm9ybTo6bG9nKFBsYXRmb3JtOjpMb2dMZXZl
bENyaXRpY2FsLCAiV2ViUGFnZTo6dG91Y2hFdmVudCAlZCBUb3VjaCBNb3ZlZCAoJWQsICVkKSIs
IGV2ZW50Lm1fcG9pbnRzW2ldLm1faWQsIGV2ZW50Lm1fcG9pbnRzW2ldLm1fcG9zLngoKSwgZXZl
bnQubV9wb2ludHNbaV0ubV9wb3MueSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIFBsYXRmb3JtOjpUb3VjaFBvaW50OjpUb3VjaFN0YXRpb25hcnk6CisgICAgICAgICAgICBQ
bGF0Zm9ybTo6bG9nKFBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiV2ViUGFnZTo6dG91Y2hF
dmVudCAlZCBUb3VjaCBTdGF0aW9uYXJ5ICglZCwgJWQpIiwgZXZlbnQubV9wb2ludHNbaV0ubV9p
ZCwgZXZlbnQubV9wb2ludHNbaV0ubV9wb3MueCgpLCBldmVudC5tX3BvaW50c1tpXS5tX3Bvcy55
KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lm
IEVOQUJMRShUT1VDSF9FVkVOVFMpCisgICAgUGx1Z2luVmlldyogcGx1Z2luVmlldyA9IGQtPm1f
ZnVsbFNjcmVlblBsdWdpblZpZXcuZ2V0KCk7CisgICAgaWYgKHBsdWdpblZpZXcpCisgICAgICAg
IHJldHVybiBkLT5kaXNwYXRjaFRvdWNoRXZlbnRUb0Z1bGxTY3JlZW5QbHVnaW4ocGx1Z2luVmll
dywgZXZlbnQpOworCisgICAgaWYgKCFkLT5tX21haW5GcmFtZSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgUGxhdGZvcm06OlRvdWNoRXZlbnQgdEV2ZW50ID0gZXZlbnQ7CisgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IGV2ZW50Lm1fcG9pbnRzLnNpemUoKTsgaSsrKSB7CisgICAg
ICAgIHRFdmVudC5tX3BvaW50c1tpXS5tX3BvcyA9IGQtPm1hcEZyb21UcmFuc2Zvcm1lZCh0RXZl
bnQubV9wb2ludHNbaV0ubV9wb3MpOworICAgICAgICB0RXZlbnQubV9wb2ludHNbaV0ubV9zY3Jl
ZW5Qb3MgPSBkLT5tYXBGcm9tVHJhbnNmb3JtZWQodEV2ZW50Lm1fcG9pbnRzW2ldLm1fc2NyZWVu
UG9zKTsKKyAgICB9CisKKyAgICBQbGF0Zm9ybTo6R2VzdHVyZSB0YXBHZXN0dXJlOworICAgIGlm
IChldmVudC5oYXNHZXN0dXJlKFBsYXRmb3JtOjpHZXN0dXJlOjpTaW5nbGVUYXApKQorICAgICAg
ICBkLT5tX3BsdWdpbk1heU9wZW5OZXdUYWIgPSB0cnVlOworICAgIGVsc2UgaWYgKHRFdmVudC5t
X3R5cGUgPT0gUGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNoU3RhcnQgfHwgdEV2ZW50Lm1fdHlw
ZSA9PSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hDYW5jZWwpCisgICAgICAgIGQtPm1fcGx1
Z2luTWF5T3Blbk5ld1RhYiA9IGZhbHNlOworCisgICAgYm9vbCBoYW5kbGVkID0gZmFsc2U7CisK
KyAgICBpZiAoZC0+bV9uZWVkVG91Y2hFdmVudHMgJiYgIWV2ZW50Lmhhc0dlc3R1cmUoUGxhdGZv
cm06Okdlc3R1cmU6OkluamVjdGVkKSkKKyAgICAgICAgaGFuZGxlZCA9IGQtPm1fbWFpbkZyYW1l
LT5ldmVudEhhbmRsZXIoKS0+aGFuZGxlVG91Y2hFdmVudChQbGF0Zm9ybVRvdWNoRXZlbnQoJnRF
dmVudCkpOworCisgICAgLy8gVW5wcmVzcyBtb3VzZSBpZiB0b3VjaCBlbmQgaXMgY29uc3VtZWQg
YnkgYSBKYXZhU2NyaXB0IHRvdWNoIGhhbmRsZXIsIG90aGVyd2lzZSB0aGUgbW91c2Ugc3RhdGUg
d2lsbCByZW1haW4gcHJlc3NlZAorICAgIC8vIHdoaWNoIGNvdWxkIGVpdGhlciBtZXNzIHVwIHRo
ZSBpbnRlcm5hbCBtb3VzZSBzdGF0ZSBvciBzdGFydCB0ZXh0IHNlbGVjdGlvbiBvbiB0aGUgbmV4
dCBtb3VzZSBtb3ZlL2Rvd24uCisgICAgaWYgKHRFdmVudC5tX3R5cGUgPT0gUGxhdGZvcm06OlRv
dWNoRXZlbnQ6OlRvdWNoRW5kICYmIGhhbmRsZWQgJiYgZC0+bV9tYWluRnJhbWUtPmV2ZW50SGFu
ZGxlcigpLT5tb3VzZVByZXNzZWQoKSkKKyAgICAgICAgZC0+bV90b3VjaEV2ZW50SGFuZGxlci0+
dG91Y2hFdmVudENhbmNlbCgpOworCisgICAgaWYgKGQtPm1fcHJldmVudERlZmF1bHRPblRvdWNo
U3RhcnQpIHsKKyAgICAgICAgaWYgKHRFdmVudC5tX3R5cGUgPT0gUGxhdGZvcm06OlRvdWNoRXZl
bnQ6OlRvdWNoRW5kIHx8IHRFdmVudC5tX3R5cGUgPT0gUGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRv
dWNoQ2FuY2VsKQorICAgICAgICAgICAgZC0+bV9wcmV2ZW50RGVmYXVsdE9uVG91Y2hTdGFydCA9
IGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoaGFuZGxlZCkg
eworICAgICAgICBpZiAodEV2ZW50Lm1fdHlwZSA9PSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91
Y2hTdGFydCkKKyAgICAgICAgICAgIGQtPm1fcHJldmVudERlZmF1bHRPblRvdWNoU3RhcnQgPSB0
cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoZXZlbnQuaGFzR2Vz
dHVyZShQbGF0Zm9ybTo6R2VzdHVyZTo6VG91Y2hIb2xkKSkKKyAgICAgICAgZC0+bV90b3VjaEV2
ZW50SGFuZGxlci0+dG91Y2hIb2xkRXZlbnQoKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIGZhbHNl
OworfQorCit2b2lkIFdlYlBhZ2U6OnNldFNjcm9sbE9yaWdpblBvaW50KGNvbnN0IFBsYXRmb3Jt
OjpJbnRQb2ludCYgcG9pbnQpCit7CisgICAgUGxhdGZvcm06OkludFBvaW50IHVudHJhbnNmb3Jt
ZWRQb2ludCA9IGQtPm1hcEZyb21UcmFuc2Zvcm1lZChwb2ludCk7CisgICAgZC0+c2V0U2Nyb2xs
T3JpZ2luUG9pbnQodW50cmFuc2Zvcm1lZFBvaW50KTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0
ZTo6c2V0U2Nyb2xsT3JpZ2luUG9pbnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBwb2ludCkK
K3sKKyAgICBtX2luUmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2RlID0gMDsKKworICAgIGlmICghbV9o
YXNJblJlZ2lvblNjcm9sbGFibGVBcmVhcykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9jbGll
bnQtPm5vdGlmeUluUmVnaW9uU2Nyb2xsaW5nU3RhcnRpbmdQb2ludENoYW5nZWQoaW5SZWdpb25T
Y3JvbGxhYmxlQXJlYXNGb3JQb2ludChwb2ludCkpOworfQorCitib29sIFdlYlBhZ2VQcml2YXRl
OjpkaXNwYXRjaFRvdWNoRXZlbnRUb0Z1bGxTY3JlZW5QbHVnaW4oUGx1Z2luVmlldyogcGx1Z2lu
LCBjb25zdCBQbGF0Zm9ybTo6VG91Y2hFdmVudCYgZXZlbnQpCit7CisgICAgTlBUb3VjaEV2ZW50
IG5wVG91Y2hFdmVudDsKKworICAgIGlmIChldmVudC5oYXNHZXN0dXJlKFBsYXRmb3JtOjpHZXN0
dXJlOjpEb3VibGVUYXApKQorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5U
X0RPVUJMRVRBUDsKKyAgICBlbHNlIGlmIChldmVudC5oYXNHZXN0dXJlKFBsYXRmb3JtOjpHZXN0
dXJlOjpUb3VjaEhvbGQpKQorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5U
X1RPVUNISE9MRDsKKyAgICBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChldmVudC5tX3R5cGUpIHsK
KyAgICAgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hTdGFydDoKKyAgICAgICAg
ICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hfRVZFTlRfU1RBUlQ7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hFbmQ6CisgICAg
ICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX0VORDsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBjYXNlIFBsYXRmb3JtOjpUb3VjaEV2ZW50OjpUb3VjaE1vdmU6Cisg
ICAgICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX01PVkU7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hDYW5j
ZWw6CisgICAgICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX0NBTkNFTDsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgbnBUb3VjaEV2ZW50LnBvaW50cyA9IDA7
CisgICAgbnBUb3VjaEV2ZW50LnNpemUgPSBldmVudC5tX3BvaW50cy5zaXplKCk7CisgICAgaWYg
KG5wVG91Y2hFdmVudC5zaXplKSB7CisgICAgICAgIG5wVG91Y2hFdmVudC5wb2ludHMgPSBuZXcg
TlBUb3VjaFBvaW50W25wVG91Y2hFdmVudC5zaXplXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7
IGkgPCBucFRvdWNoRXZlbnQuc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQu
cG9pbnRzW2ldLnRvdWNoSWQgPSBldmVudC5tX3BvaW50c1tpXS5tX2lkOworICAgICAgICAgICAg
bnBUb3VjaEV2ZW50LnBvaW50c1tpXS5jbGllbnRYID0gZXZlbnQubV9wb2ludHNbaV0ubV9zY3Jl
ZW5Qb3MueCgpOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5jbGllbnRZID0g
ZXZlbnQubV9wb2ludHNbaV0ubV9zY3JlZW5Qb3MueSgpOworICAgICAgICAgICAgbnBUb3VjaEV2
ZW50LnBvaW50c1tpXS5zY3JlZW5YID0gZXZlbnQubV9wb2ludHNbaV0ubV9zY3JlZW5Qb3MueCgp
OworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5zY3JlZW5ZID0gZXZlbnQubV9w
b2ludHNbaV0ubV9zY3JlZW5Qb3MueSgpOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50
c1tpXS5wYWdlWCA9IGV2ZW50Lm1fcG9pbnRzW2ldLm1fcG9zLngoKTsKKyAgICAgICAgICAgIG5w
VG91Y2hFdmVudC5wb2ludHNbaV0ucGFnZVkgPSBldmVudC5tX3BvaW50c1tpXS5tX3Bvcy55KCk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50
eXBlID0gTlBfVG91Y2hFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAmbnBUb3VjaEV2ZW50Owor
CisgICAgYm9vbCBoYW5kbGVkID0gcGx1Z2luLT5kaXNwYXRjaEZ1bGxTY3JlZW5OUEV2ZW50KG5w
RXZlbnQpOworCisgICAgaWYgKG5wVG91Y2hFdmVudC50eXBlID09IFRPVUNIX0VWRU5UX0RPVUJM
RVRBUCAmJiAhaGFuZGxlZCkgeworICAgICAgICAvLyBTZW5kIFRvdWNoIFVwIGlmIGRvdWJsZSB0
YXAgbm90IGNvbnN1bWVkLgorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5U
X0VORDsKKyAgICAgICAgbnBFdmVudC5kYXRhID0gJm5wVG91Y2hFdmVudDsKKyAgICAgICAgaGFu
ZGxlZCA9IHBsdWdpbi0+ZGlzcGF0Y2hGdWxsU2NyZWVuTlBFdmVudChucEV2ZW50KTsKKyAgICB9
CisgICAgZGVsZXRlW10gbnBUb3VjaEV2ZW50LnBvaW50czsKKyAgICByZXR1cm4gaGFuZGxlZDsK
K30KKworYm9vbCBXZWJQYWdlOjp0b3VjaFBvaW50QXNNb3VzZUV2ZW50KGNvbnN0IFBsYXRmb3Jt
OjpUb3VjaFBvaW50JiBwb2ludCkKK3sKKyAgICBQbHVnaW5WaWV3KiBwbHVnaW5WaWV3ID0gZC0+
bV9mdWxsU2NyZWVuUGx1Z2luVmlldy5nZXQoKTsKKyAgICBpZiAocGx1Z2luVmlldykKKyAgICAg
ICAgcmV0dXJuIGQtPmRpc3BhdGNoVG91Y2hQb2ludEFzTW91c2VFdmVudFRvRnVsbFNjcmVlblBs
dWdpbihwbHVnaW5WaWV3LCBwb2ludCk7CisKKyAgICBkLT5tX2xhc3RVc2VyRXZlbnRUaW1lc3Rh
bXAgPSBjdXJyZW50VGltZSgpOworCisgICAgUGxhdGZvcm06OlRvdWNoUG9pbnQgdFBvaW50ID0g
cG9pbnQ7CisgICAgdFBvaW50Lm1fcG9zID0gZC0+bWFwRnJvbVRyYW5zZm9ybWVkKHRQb2ludC5t
X3Bvcyk7CisgICAgdFBvaW50Lm1fc2NyZWVuUG9zID0gZC0+bWFwRnJvbVRyYW5zZm9ybWVkKHRQ
b2ludC5tX3NjcmVlblBvcyk7CisKKyAgICByZXR1cm4gZC0+bV90b3VjaEV2ZW50SGFuZGxlci0+
aGFuZGxlVG91Y2hQb2ludCh0UG9pbnQpOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpkaXNw
YXRjaFRvdWNoUG9pbnRBc01vdXNlRXZlbnRUb0Z1bGxTY3JlZW5QbHVnaW4oUGx1Z2luVmlldyog
cGx1Z2luVmlldywgY29uc3QgUGxhdGZvcm06OlRvdWNoUG9pbnQmIHBvaW50KQoreworICAgIE5Q
RXZlbnQgbnBFdmVudDsKKyAgICBOUE1vdXNlRXZlbnQgbW91c2U7CisKKyAgICBzd2l0Y2ggKHBv
aW50Lm1fc3RhdGUpIHsKKyAgICBjYXNlIFBsYXRmb3JtOjpUb3VjaFBvaW50OjpUb3VjaFByZXNz
ZWQ6CisgICAgICAgIG1vdXNlLnR5cGUgPSBNT1VTRV9CVVRUT05fRE9XTjsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hQb2ludDo6VG91Y2hSZWxlYXNlZDoKKyAgICAg
ICAgbW91c2UudHlwZSA9IE1PVVNFX0JVVFRPTl9VUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBQbGF0Zm9ybTo6VG91Y2hQb2ludDo6VG91Y2hNb3ZlZDoKKyAgICAgICAgbW91c2UudHlwZSA9
IE1PVVNFX01PVElPTjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hQ
b2ludDo6VG91Y2hTdGF0aW9uYXJ5OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisg
ICAgbW91c2UueCA9IHBvaW50Lm1fc2NyZWVuUG9zLngoKTsKKyAgICBtb3VzZS55ID0gcG9pbnQu
bV9zY3JlZW5Qb3MueSgpOworICAgIG1vdXNlLmJ1dHRvbiA9IG1vdXNlLnR5cGUgIT0gTU9VU0Vf
QlVUVE9OX1VQOworICAgIG1vdXNlLmZsYWdzID0gMDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9N
b3VzZUV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9ICZtb3VzZTsKKworICAgIHJldHVybiBwbHVn
aW5WaWV3LT5kaXNwYXRjaEZ1bGxTY3JlZW5OUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFdl
YlBhZ2U6OnRvdWNoRXZlbnRDYW5jZWwoKQoreworICAgIGQtPm1fcGx1Z2luTWF5T3Blbk5ld1Rh
YiA9IGZhbHNlOworICAgIGQtPm1fdG91Y2hFdmVudEhhbmRsZXItPnRvdWNoRXZlbnRDYW5jZWwo
KTsKK30KKwordm9pZCBXZWJQYWdlOjp0b3VjaEV2ZW50Q2FuY2VsQW5kQ2xlYXJGb2N1c2VkTm9k
ZSgpCit7CisgICAgZC0+bV90b3VjaEV2ZW50SGFuZGxlci0+dG91Y2hFdmVudENhbmNlbEFuZENs
ZWFyRm9jdXNlZE5vZGUoKTsKK30KKworRnJhbWUqIFdlYlBhZ2VQcml2YXRlOjpmb2N1c2VkT3JN
YWluRnJhbWUoKSBjb25zdAoreworICAgIHJldHVybiBtX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigp
LT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKK30KKworRnJhbWUqIFdlYlBhZ2VQcml2YXRlOjptYWlu
RnJhbWUoKSBjb25zdAoreworICAgIHJldHVybiBtX21haW5GcmFtZTsKK30KKwordm9pZCBXZWJQ
YWdlUHJpdmF0ZTo6Y2xlYXJGb2N1c05vZGUoKQoreworICAgIEZyYW1lKiBmcmFtZSA9IGZvY3Vz
ZWRPck1haW5GcmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybjsKKyAgICBB
U1NFUlQoZnJhbWUtPmRvY3VtZW50KCkpOworCisgICAgaWYgKGZyYW1lLT5kb2N1bWVudCgpLT5m
b2N1c2VkTm9kZSgpKQorICAgICAgICBmcmFtZS0+cGFnZSgpLT5mb2N1c0NvbnRyb2xsZXIoKS0+
c2V0Rm9jdXNlZE5vZGUoMCwgZnJhbWUpOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpzY3Jv
bGxOb2RlUmVjdXJzaXZlbHkoTm9kZSogbm9kZSwgY29uc3QgSW50U2l6ZSYgZGVsdGEpCit7Cisg
ICAgaWYgKGRlbHRhLmlzWmVybygpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICgh
bm9kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJl
ciA9IG5vZGUtPnJlbmRlcmVyKCk7CisgICAgaWYgKCFyZW5kZXJlcikKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgRnJhbWVWaWV3KiB2aWV3ID0gcmVuZGVyZXItPnZpZXcoKS0+ZnJhbWVW
aWV3KCk7CisgICAgaWYgKCF2aWV3KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBU
cnkgc2Nyb2xsaW5nIHRoZSByZW5kZXJlci4KKyAgICBpZiAoc2Nyb2xsUmVuZGVyZXIocmVuZGVy
ZXIsIGRlbHRhKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBXZSd2ZSBoaXQgdGhl
IHBhZ2UsIGRvbid0IHNjcm9sbCBpdCBhbmQgcmV0dXJuIGZhbHNlLgorICAgIGlmICh2aWV3ID09
IG1fbWFpbkZyYW1lLT52aWV3KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFRy
eSBzY3JvbGxpbmcgdGhlIEZyYW1lVmlldy4KKyAgICBpZiAoY2FuU2Nyb2xsSW5uZXJGcmFtZSh2
aWV3LT5mcmFtZSgpKSkgeworICAgICAgICBJbnRTaXplIHZpZXdEZWx0YSA9IGRlbHRhOworICAg
ICAgICBJbnRQb2ludCBuZXdWaWV3T2Zmc2V0ID0gdmlldy0+c2Nyb2xsUG9zaXRpb24oKTsKKyAg
ICAgICAgSW50UG9pbnQgbWF4Vmlld09mZnNldCA9IHZpZXctPm1heGltdW1TY3JvbGxQb3NpdGlv
bigpOworICAgICAgICBhZGp1c3RTY3JvbGxEZWx0YShtYXhWaWV3T2Zmc2V0LCBuZXdWaWV3T2Zm
c2V0LCB2aWV3RGVsdGEpOworCisgICAgICAgIGlmICghdmlld0RlbHRhLmlzWmVybygpKSB7Cisg
ICAgICAgICAgICB2aWV3LT5zZXRDYW5CbGl0T25TY3JvbGwoZmFsc2UpOworCisgICAgICAgICAg
ICBCYWNraW5nU3RvcmVDbGllbnQqIGJhY2tpbmdTdG9yZUNsaWVudCA9IGJhY2tpbmdTdG9yZUNs
aWVudEZvckZyYW1lKHZpZXctPmZyYW1lKCkpOworICAgICAgICAgICAgaWYgKGJhY2tpbmdTdG9y
ZUNsaWVudCkgeworICAgICAgICAgICAgICAgIGJhY2tpbmdTdG9yZUNsaWVudC0+c2V0SXNDbGll
bnRHZW5lcmF0ZWRTY3JvbGwodHJ1ZSk7CisgICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlQ2xp
ZW50LT5zZXRJc1Njcm9sbE5vdGlmaWNhdGlvblN1cHByZXNzZWQodHJ1ZSk7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIG1faW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGUgPSB2aWV3LT5m
cmFtZSgpLT5kb2N1bWVudCgpOworCisgICAgICAgICAgICB2aWV3LT5zY3JvbGxCeSh2aWV3RGVs
dGEpOworCisgICAgICAgICAgICBpZiAoYmFja2luZ1N0b3JlQ2xpZW50KSB7CisgICAgICAgICAg
ICAgICAgYmFja2luZ1N0b3JlQ2xpZW50LT5zZXRJc0NsaWVudEdlbmVyYXRlZFNjcm9sbChmYWxz
ZSk7CisgICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlQ2xpZW50LT5zZXRJc1Njcm9sbE5vdGlm
aWNhdGlvblN1cHByZXNzZWQoZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRyeSBzY3JvbGxpbmcgdGhl
IG5vZGUgb2YgdGhlIGVuY2xvc2luZyBmcmFtZS4KKyAgICBGcmFtZSogZnJhbWUgPSBub2RlLT5k
b2N1bWVudCgpLT5mcmFtZSgpOworICAgIGlmIChmcmFtZSkgeworICAgICAgICBOb2RlKiBvd25l
ck5vZGUgPSBmcmFtZS0+b3duZXJFbGVtZW50KCk7CisgICAgICAgIGlmIChzY3JvbGxOb2RlUmVj
dXJzaXZlbHkob3duZXJOb2RlLCBkZWx0YSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmFkanVz
dFNjcm9sbERlbHRhKGNvbnN0IEludFBvaW50JiBtYXhPZmZzZXQsIGNvbnN0IEludFBvaW50JiBj
dXJyZW50T2Zmc2V0LCBJbnRTaXplJiBkZWx0YSkgY29uc3QKK3sKKyAgICBpZiAoY3VycmVudE9m
ZnNldC54KCkgKyBkZWx0YS53aWR0aCgpID4gbWF4T2Zmc2V0LngoKSkKKyAgICAgICAgZGVsdGEu
c2V0V2lkdGgobWluKG1heE9mZnNldC54KCkgLSBjdXJyZW50T2Zmc2V0LngoKSwgZGVsdGEud2lk
dGgoKSkpOworCisgICAgaWYgKGN1cnJlbnRPZmZzZXQueCgpICsgZGVsdGEud2lkdGgoKSA8IDAp
CisgICAgICAgIGRlbHRhLnNldFdpZHRoKG1heCgtY3VycmVudE9mZnNldC54KCksIGRlbHRhLndp
ZHRoKCkpKTsKKworICAgIGlmIChjdXJyZW50T2Zmc2V0LnkoKSArIGRlbHRhLmhlaWdodCgpID4g
bWF4T2Zmc2V0LnkoKSkKKyAgICAgICAgZGVsdGEuc2V0SGVpZ2h0KG1pbihtYXhPZmZzZXQueSgp
IC0gY3VycmVudE9mZnNldC55KCksIGRlbHRhLmhlaWdodCgpKSk7CisKKyAgICBpZiAoY3VycmVu
dE9mZnNldC55KCkgKyBkZWx0YS5oZWlnaHQoKSA8IDApCisgICAgICAgIGRlbHRhLnNldEhlaWdo
dChtYXgoLWN1cnJlbnRPZmZzZXQueSgpLCBkZWx0YS5oZWlnaHQoKSkpOworfQorCitzdGF0aWMg
Tm9kZSogZW5jbG9zaW5nTGF5ZXJOb2RlKFJlbmRlckxheWVyKik7CisKK2Jvb2wgV2ViUGFnZVBy
aXZhdGU6OnNjcm9sbFJlbmRlcmVyKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IEludFNp
emUmIGRlbHRhKQoreworICAgIFJlbmRlckxheWVyKiBsYXllciA9IHJlbmRlcmVyLT5lbmNsb3Np
bmdMYXllcigpOworICAgIGlmICghbGF5ZXIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IC8vIFRyeSB0byBzY3JvbGwgbGF5ZXIuCisgICAgYm9vbCByZXN0cmljdGVkQnlMaW5lQ2xhbXAg
PSBmYWxzZTsKKyAgICBpZiAocmVuZGVyZXItPnBhcmVudCgpKQorICAgICAgICByZXN0cmljdGVk
QnlMaW5lQ2xhbXAgPSAhcmVuZGVyZXItPnBhcmVudCgpLT5zdHlsZSgpLT5saW5lQ2xhbXAoKS5p
c05vbmUoKTsKKworICAgIGlmIChyZW5kZXJlci0+aGFzT3ZlcmZsb3dDbGlwKCkgJiYgIXJlc3Ry
aWN0ZWRCeUxpbmVDbGFtcCkgeworICAgICAgICBJbnRTaXplIGxheWVyRGVsdGEgPSBkZWx0YTsK
KyAgICAgICAgSW50UG9pbnQgbWF4T2Zmc2V0KGxheWVyLT5zY3JvbGxXaWR0aCgpIC0gbGF5ZXIt
PnJlbmRlckJveCgpLT5jbGllbnRXaWR0aCgpLCBsYXllci0+c2Nyb2xsSGVpZ2h0KCkgLSBsYXll
ci0+cmVuZGVyQm94KCktPmNsaWVudEhlaWdodCgpKTsKKyAgICAgICAgSW50UG9pbnQgY3VycmVu
dE9mZnNldChsYXllci0+c2Nyb2xsWE9mZnNldCgpLCBsYXllci0+c2Nyb2xsWU9mZnNldCgpKTsK
KyAgICAgICAgYWRqdXN0U2Nyb2xsRGVsdGEobWF4T2Zmc2V0LCBjdXJyZW50T2Zmc2V0LCBsYXll
ckRlbHRhKTsKKyAgICAgICAgaWYgKCFsYXllckRlbHRhLmlzWmVybygpKSB7CisgICAgICAgICAg
ICBtX2luUmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2RlID0gZW5jbG9zaW5nTGF5ZXJOb2RlKGxheWVy
KTsKKyAgICAgICAgICAgIEludFBvaW50IG5ld09mZnNldCA9IGN1cnJlbnRPZmZzZXQgKyBsYXll
ckRlbHRhOworICAgICAgICAgICAgbGF5ZXItPnNjcm9sbFRvT2Zmc2V0KG5ld09mZnNldC54KCks
IG5ld09mZnNldC55KCkpOworICAgICAgICAgICAgcmVuZGVyZXItPnJlcGFpbnQodHJ1ZSk7Cisg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChs
YXllciA9IGxheWVyLT5wYXJlbnQoKSkgeworICAgICAgICBpZiAoY2FuU2Nyb2xsUmVuZGVyQm94
KGxheWVyLT5yZW5kZXJCb3goKSkpCisgICAgICAgICAgICByZXR1cm4gc2Nyb2xsUmVuZGVyZXIo
bGF5ZXItPnJlbmRlckJveCgpLCBkZWx0YSk7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOwor
fQorCitzdGF0aWMgdm9pZCBoYW5kbGVTY3JvbGxpbmcodW5zaWduZWQgc2hvcnQgY2hhcmFjdGVy
LCBXZWJQYWdlUHJpdmF0ZSogc2Nyb2xsZXIpCit7CisgICAgY29uc3QgaW50IHNjcm9sbEZhY3Rv
ciA9IDIwOworICAgIGludCBkeCA9IDAsIGR5ID0gMDsKKyAgICBzd2l0Y2ggKGNoYXJhY3Rlcikg
eworICAgIGNhc2UgS0VZQ09ERV9MRUZUOgorICAgICAgICBkeCA9IC1zY3JvbGxGYWN0b3I7Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgS0VZQ09ERV9SSUdIVDoKKyAgICAgICAgZHggPSBzY3Jv
bGxGYWN0b3I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0VZQ09ERV9VUDoKKyAgICAgICAg
ZHkgPSAtc2Nyb2xsRmFjdG9yOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEtFWUNPREVfRE9X
TjoKKyAgICAgICAgZHkgPSBzY3JvbGxGYWN0b3I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
S0VZQ09ERV9QR19VUDoKKyAgICAgICAgQVNTRVJUKHNjcm9sbGVyKTsKKyAgICAgICAgZHkgPSBz
Y3JvbGxGYWN0b3IgLSBzY3JvbGxlci0+YWN0dWFsVmlzaWJsZVNpemUoKS5oZWlnaHQoKTsKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSBLRVlDT0RFX1BHX0RPV046CisgICAgICAgIEFTU0VSVChz
Y3JvbGxlcik7CisgICAgICAgIGR5ID0gc2Nyb2xsZXItPmFjdHVhbFZpc2libGVTaXplKCkuaGVp
Z2h0KCkgLSBzY3JvbGxGYWN0b3I7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChk
eCB8fCBkeSkgeworICAgICAgICAvLyBEb24ndCB1c2UgdGhlIHNjcm9sbEJ5IGZ1bmN0aW9uIGJl
Y2F1c2UgaXQgdHJpZ2dlcnMgdGhlIHNjcm9sbCBhcyBvcmlnaW5hdGluZyBmcm9tIEJsYWNrQmVy
cnkKKyAgICAgICAgLy8gYnV0IHRoZW4gaXQgZXhwZWN0cyBhIHNlcGFyYXRlIGludmFsaWRhdGUg
d2hpY2ggaXNuJ3Qgc2VudCBpbiB0aGlzIGNhc2UuCisgICAgICAgIEFTU0VSVChzY3JvbGxlciAm
JiBzY3JvbGxlci0+bV9tYWluRnJhbWUgJiYgc2Nyb2xsZXItPm1fbWFpbkZyYW1lLT52aWV3KCkp
OworICAgICAgICBJbnRQb2ludCBwb3Moc2Nyb2xsZXItPnNjcm9sbFBvc2l0aW9uKCkgKyBJbnRT
aXplKGR4LCBkeSkpOworCisgICAgICAgIC8vIFByZXZlbnQgb3ZlciBzY3JvbGxpbmcgZm9yIGFy
cm93cyBhbmQgUGFnZSB1cC9kb3duLgorICAgICAgICBpZiAocG9zLngoKSA8IDApCisgICAgICAg
ICAgICBwb3Muc2V0WCgwKTsKKyAgICAgICAgaWYgKHBvcy55KCkgPCAwKQorICAgICAgICAgICAg
cG9zLnNldFkoMCk7CisgICAgICAgIGlmIChwb3MueCgpICsgc2Nyb2xsZXItPmFjdHVhbFZpc2li
bGVTaXplKCkud2lkdGgoKSA+IHNjcm9sbGVyLT5jb250ZW50c1NpemUoKS53aWR0aCgpKQorICAg
ICAgICAgICAgcG9zLnNldFgoc2Nyb2xsZXItPmNvbnRlbnRzU2l6ZSgpLndpZHRoKCkgLSBzY3Jv
bGxlci0+YWN0dWFsVmlzaWJsZVNpemUoKS53aWR0aCgpKTsKKyAgICAgICAgaWYgKHBvcy55KCkg
KyBzY3JvbGxlci0+YWN0dWFsVmlzaWJsZVNpemUoKS5oZWlnaHQoKSA+IHNjcm9sbGVyLT5jb250
ZW50c1NpemUoKS5oZWlnaHQoKSkKKyAgICAgICAgICAgIHBvcy5zZXRZKHNjcm9sbGVyLT5jb250
ZW50c1NpemUoKS5oZWlnaHQoKSAtIHNjcm9sbGVyLT5hY3R1YWxWaXNpYmxlU2l6ZSgpLmhlaWdo
dCgpKTsKKworICAgICAgICBzY3JvbGxlci0+bV9tYWluRnJhbWUtPnZpZXcoKS0+c2V0U2Nyb2xs
UG9zaXRpb24ocG9zKTsKKyAgICAgICAgc2Nyb2xsZXItPm1fY2xpZW50LT5zY3JvbGxDaGFuZ2Vk
KHBvcyk7CisgICAgfQorfQorCitib29sIFdlYlBhZ2U6OmtleUV2ZW50KGNvbnN0IFBsYXRmb3Jt
OjpLZXlib2FyZEV2ZW50JiBrZXlib2FyZEV2ZW50KQoreworICAgIGlmICghZC0+bV9tYWluRnJh
bWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQVNTRVJUKGQtPm1fcGFn
ZS0+Zm9jdXNDb250cm9sbGVyKCkpOworCisgICAgYm9vbCBoYW5kbGVkID0gZC0+bV9pbnB1dEhh
bmRsZXItPmhhbmRsZUtleWJvYXJkSW5wdXQoa2V5Ym9hcmRFdmVudCk7CisKKyAgICBpZiAoIWhh
bmRsZWQgJiYga2V5Ym9hcmRFdmVudC50eXBlKCkgPT0gUGxhdGZvcm06OktleWJvYXJkRXZlbnQ6
OktleURvd24gJiYgIWQtPm1faW5wdXRIYW5kbGVyLT5pc0lucHV0TW9kZSgpKSB7CisgICAgICAg
IEludFBvaW50IHByZXZpb3VzUG9zID0gZC0+c2Nyb2xsUG9zaXRpb24oKTsKKyAgICAgICAgaGFu
ZGxlU2Nyb2xsaW5nKGtleWJvYXJkRXZlbnQuY2hhcmFjdGVyKCksIGQpOworICAgICAgICBoYW5k
bGVkID0gcHJldmlvdXNQb3MgIT0gZC0+c2Nyb2xsUG9zaXRpb24oKTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gaGFuZGxlZDsKK30KKwordm9pZCBXZWJQYWdlOjpuYXZpZ2F0aW9uTW92ZUV2ZW50KGNv
bnN0IHVuc2lnbmVkIHNob3J0IGNoYXJhY3RlciwgYm9vbCBzaGlmdERvd24sIGJvb2wgYWx0RG93
bikKK3sKKyAgICBpZiAoIWQtPm1fbWFpbkZyYW1lLT52aWV3KCkpCisgICAgICAgIHJldHVybjsK
KworICAgIEFTU0VSVChkLT5tX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpKTsKKyAgICBkLT5tX2lu
cHV0SGFuZGxlci0+aGFuZGxlTmF2aWdhdGlvbk1vdmUoY2hhcmFjdGVyLCBzaGlmdERvd24sIGFs
dERvd24pOworfQorCitib29sIFdlYlBhZ2U6OmRlbGV0ZVRleHRSZWxhdGl2ZVRvQ3Vyc29yKHVu
c2lnbmVkIGludCBsZWZ0T2Zmc2V0LCB1bnNpZ25lZCBpbnQgcmlnaHRPZmZzZXQpCit7CisgICAg
cmV0dXJuIGQtPm1faW5wdXRIYW5kbGVyLT5kZWxldGVUZXh0UmVsYXRpdmVUb0N1cnNvcihsZWZ0
T2Zmc2V0LCByaWdodE9mZnNldCk7Cit9CisKK3NwYW5uYWJsZV9zdHJpbmdfdCogV2ViUGFnZTo6
c2VsZWN0ZWRUZXh0KGludDMyX3QgZmxhZ3MpCit7CisgICAgcmV0dXJuIGQtPm1faW5wdXRIYW5k
bGVyLT5zZWxlY3RlZFRleHQoZmxhZ3MpOworfQorCitzcGFubmFibGVfc3RyaW5nX3QqIFdlYlBh
Z2U6OnRleHRCZWZvcmVDdXJzb3IoaW50MzJfdCBsZW5ndGgsIGludDMyX3QgZmxhZ3MpCit7Cisg
ICAgcmV0dXJuIGQtPm1faW5wdXRIYW5kbGVyLT50ZXh0QmVmb3JlQ3Vyc29yKGxlbmd0aCwgZmxh
Z3MpOworfQorCitzcGFubmFibGVfc3RyaW5nX3QqIFdlYlBhZ2U6OnRleHRBZnRlckN1cnNvcihp
bnQzMl90IGxlbmd0aCwgaW50MzJfdCBmbGFncykKK3sKKyAgICByZXR1cm4gZC0+bV9pbnB1dEhh
bmRsZXItPnRleHRBZnRlckN1cnNvcihsZW5ndGgsIGZsYWdzKTsKK30KKworZXh0cmFjdGVkX3Rl
eHRfdCogV2ViUGFnZTo6ZXh0cmFjdGVkVGV4dFJlcXVlc3QoZXh0cmFjdGVkX3RleHRfcmVxdWVz
dF90KiByZXF1ZXN0LCBpbnQzMl90IGZsYWdzKQoreworICAgIHJldHVybiBkLT5tX2lucHV0SGFu
ZGxlci0+ZXh0cmFjdGVkVGV4dFJlcXVlc3QocmVxdWVzdCwgZmxhZ3MpOworfQorCitpbnQzMl90
IFdlYlBhZ2U6OnNldENvbXBvc2luZ1JlZ2lvbihpbnQzMl90IHN0YXJ0LCBpbnQzMl90IGVuZCkK
K3sKKyAgICByZXR1cm4gZC0+bV9pbnB1dEhhbmRsZXItPnNldENvbXBvc2luZ1JlZ2lvbihzdGFy
dCwgZW5kKTsKK30KKworaW50MzJfdCBXZWJQYWdlOjpmaW5pc2hDb21wb3NpdGlvbigpCit7Cisg
ICAgcmV0dXJuIGQtPm1faW5wdXRIYW5kbGVyLT5maW5pc2hDb21wb3NpdGlvbigpOworfQorCitp
bnQzMl90IFdlYlBhZ2U6OnNldENvbXBvc2luZ1RleHQoc3Bhbm5hYmxlX3N0cmluZ190KiBzcGFu
bmFibGVTdHJpbmcsIGludDMyX3QgcmVsYXRpdmVDdXJzb3JQb3NpdGlvbikKK3sKKyAgICByZXR1
cm4gZC0+bV9pbnB1dEhhbmRsZXItPnNldENvbXBvc2luZ1RleHQoc3Bhbm5hYmxlU3RyaW5nLCBy
ZWxhdGl2ZUN1cnNvclBvc2l0aW9uKTsKK30KKworaW50MzJfdCBXZWJQYWdlOjpjb21taXRUZXh0
KHNwYW5uYWJsZV9zdHJpbmdfdCogc3Bhbm5hYmxlU3RyaW5nLCBpbnQzMl90IHJlbGF0aXZlQ3Vy
c29yUG9zaXRpb24pCit7CisgICAgcmV0dXJuIGQtPm1faW5wdXRIYW5kbGVyLT5jb21taXRUZXh0
KHNwYW5uYWJsZVN0cmluZywgcmVsYXRpdmVDdXJzb3JQb3NpdGlvbik7Cit9CisKK3ZvaWQgV2Vi
UGFnZTo6c2V0U3BlbGxjaGVja2luZ0VuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIHN0YXRp
Y19jYXN0PEVkaXRvckNsaWVudEJsYWNrQmVycnkqPihkLT5tX3BhZ2UtPmVkaXRvckNsaWVudCgp
KS0+ZW5hYmxlU3BlbGxDaGVja2luZyhlbmFibGVkKTsKK30KKwordm9pZCBXZWJQYWdlOjpzZWxl
Y3Rpb25DYW5jZWxsZWQoKQoreworICAgIGQtPm1fc2VsZWN0aW9uSGFuZGxlci0+Y2FuY2VsU2Vs
ZWN0aW9uKCk7Cit9CisKK2Jvb2wgV2ViUGFnZTo6c2VsZWN0aW9uQ29udGFpbnMoY29uc3QgUGxh
dGZvcm06OkludFBvaW50JiBwb2ludCkKK3sKKyAgICByZXR1cm4gZC0+bV9zZWxlY3Rpb25IYW5k
bGVyLT5zZWxlY3Rpb25Db250YWlucyhkLT5tYXBGcm9tVHJhbnNmb3JtZWQocG9pbnQpKTsKK30K
KworV2ViU3RyaW5nIFdlYlBhZ2U6OnRpdGxlKCkgY29uc3QKK3sKKyAgICBpZiAoZC0+bV9tYWlu
RnJhbWUtPmRvY3VtZW50KCkpCisgICAgICAgIHJldHVybiBkLT5tX21haW5GcmFtZS0+bG9hZGVy
KCktPmRvY3VtZW50TG9hZGVyKCktPnRpdGxlKCkuc3RyaW5nKCk7CisgICAgcmV0dXJuIFdlYlN0
cmluZygpOworfQorCitXZWJTdHJpbmcgV2ViUGFnZTo6c2VsZWN0ZWRUZXh0KCkgY29uc3QKK3sK
KyAgICByZXR1cm4gZC0+bV9zZWxlY3Rpb25IYW5kbGVyLT5zZWxlY3RlZFRleHQoKTsKK30KKwor
V2ViU3RyaW5nIFdlYlBhZ2U6OmN1dFNlbGVjdGVkVGV4dCgpCit7CisgICAgV2ViU3RyaW5nIHNl
bGVjdGVkVGV4dCA9IGQtPm1fc2VsZWN0aW9uSGFuZGxlci0+c2VsZWN0ZWRUZXh0KCk7CisgICAg
aWYgKCFzZWxlY3RlZFRleHQuaXNFbXB0eSgpKQorICAgICAgICBkLT5tX2lucHV0SGFuZGxlci0+
ZGVsZXRlU2VsZWN0aW9uKCk7CisgICAgcmV0dXJuIHNlbGVjdGVkVGV4dDsKK30KKwordm9pZCBX
ZWJQYWdlOjppbnNlcnRUZXh0KGNvbnN0IFdlYlN0cmluZyYgc3RyaW5nKQoreworICAgIGQtPm1f
aW5wdXRIYW5kbGVyLT5pbnNlcnRUZXh0KHN0cmluZyk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6Y2xl
YXJDdXJyZW50SW5wdXRGaWVsZCgpCit7CisgICAgZC0+bV9pbnB1dEhhbmRsZXItPmNsZWFyRmll
bGQoKTsKK30KKwordm9pZCBXZWJQYWdlOjpjdXQoKQoreworICAgIGQtPm1faW5wdXRIYW5kbGVy
LT5jdXQoKTsKK30KKwordm9pZCBXZWJQYWdlOjpjb3B5KCkKK3sKKyAgICBkLT5tX2lucHV0SGFu
ZGxlci0+Y29weSgpOworfQorCit2b2lkIFdlYlBhZ2U6OnBhc3RlKCkKK3sKKyAgICBkLT5tX2lu
cHV0SGFuZGxlci0+cGFzdGUoKTsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRTZWxlY3Rpb24oY29u
c3QgUGxhdGZvcm06OkludFBvaW50JiBzdGFydFBvaW50LCBjb25zdCBQbGF0Zm9ybTo6SW50UG9p
bnQmIGVuZFBvaW50KQoreworICAgIC8vIFRyYW5zZm9ybSB0aGlzIGV2ZW50cyBjb29yZGluYXRl
cyB0byB3ZWJraXQgY29udGVudCBjb29yZGluYXRlcy4KKyAgICAvLyBGSVhNRTogRG9uJ3QgdHJh
bnNmb3JtIHRoZSBzZW50aW5lbCwgYmVjYXVzZSBpdCBtYXkgYmUgdHJhbnNmb3JtZWQgdG8gYSBm
bG9hdGluZyBudW1iZXIKKyAgICAvLyB3aGljaCBjb3VsZCBiZSByb3VuZGVkIHRvIDAgb3Igb3Ro
ZXIgbnVtYmVycy4gVGhpcyB3b3JrYXJvdW5kIHNob3VsZCBiZSByZW1vdmVkIGFmdGVyCisgICAg
Ly8gdGhlIGVycm9yIG9mIHJvdW5kVW50cmFuc2Zvcm1lZFBvaW50KCkgaXMgZml4ZWQuCisgICAg
Ym9vbCBpbnZhbGlkUG9pbnQgPSBJbnRQb2ludChzdGFydFBvaW50KSA9PSBET01TdXBwb3J0OjpJ
bnZhbGlkUG9pbnQ7CisgICAgSW50UG9pbnQgc3RhcnQgPSBpbnZhbGlkUG9pbnQgPyBET01TdXBw
b3J0OjpJbnZhbGlkUG9pbnQgOiBkLT5tYXBGcm9tVHJhbnNmb3JtZWQoc3RhcnRQb2ludCk7Cisg
ICAgaW52YWxpZFBvaW50ID0gSW50UG9pbnQoZW5kUG9pbnQpID09IERPTVN1cHBvcnQ6OkludmFs
aWRQb2ludDsKKyAgICBJbnRQb2ludCBlbmQgPSBpbnZhbGlkUG9pbnQgPyBET01TdXBwb3J0OjpJ
bnZhbGlkUG9pbnQgOiBkLT5tYXBGcm9tVHJhbnNmb3JtZWQoZW5kUG9pbnQpOworCisgICAgZC0+
bV9zZWxlY3Rpb25IYW5kbGVyLT5zZXRTZWxlY3Rpb24oc3RhcnQsIGVuZCk7Cit9CisKK3ZvaWQg
V2ViUGFnZTo6c2V0Q2FyZXRQb3NpdGlvbihjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIHBvc2l0
aW9uKQoreworICAgIC8vIEhhbmRsZWQgYnkgc2VsZWN0aW9uIGhhbmRsZXIgYXMgaXQncyBwb2lu
dCBiYXNlZC4KKyAgICAvLyBUcmFuc2Zvcm0gdGhpcyBldmVudHMgY29vcmRpbmF0ZXMgdG8gd2Vi
a2l0IGNvbnRlbnQgY29vcmRpbmF0ZXMuCisgICAgZC0+bV9zZWxlY3Rpb25IYW5kbGVyLT5zZXRD
YXJldFBvc2l0aW9uKGQtPm1hcEZyb21UcmFuc2Zvcm1lZChwb3NpdGlvbikpOworfQorCit2b2lk
IFdlYlBhZ2U6OnNlbGVjdEF0UG9pbnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBsb2NhdGlv
bikKK3sKKyAgICAvLyBUcmFuc2Zvcm0gdGhpcyBldmVudHMgY29vcmRpbmF0ZXMgdG8gd2Via2l0
IGNvbnRlbnQgY29vcmRpbmF0ZXMgaWYgaXQKKyAgICAvLyBpcyBub3QgdGhlIHNlbnRpbmVsIHZh
bHVlLgorICAgIEludFBvaW50IHNlbGVjdGlvbkxvY2F0aW9uID0KKyAgICAgICAgICAgIEludFBv
aW50KGxvY2F0aW9uKSA9PSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQgPworICAgICAgICAgICAg
RE9NU3VwcG9ydDo6SW52YWxpZFBvaW50IDoKKyAgICAgICAgICAgIGQtPm1hcEZyb21UcmFuc2Zv
cm1lZChsb2NhdGlvbik7CisKKyAgICBkLT5tX3NlbGVjdGlvbkhhbmRsZXItPnNlbGVjdEF0UG9p
bnQoc2VsZWN0aW9uTG9jYXRpb24pOworfQorCisvLyBSZXR1cm5lZCBzY3JvbGwgcG9zaXRpb24g
aXMgaW4gdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMuCitQbGF0Zm9ybTo6SW50UG9pbnQgV2ViUGFn
ZTo6c2Nyb2xsUG9zaXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBkLT50cmFuc2Zvcm1lZFNj
cm9sbFBvc2l0aW9uKCk7Cit9CisKKy8vIFNldHRpbmcgdGhlIHNjcm9sbCBwb3NpdGlvbiBpcyBp
biB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KK3ZvaWQgV2ViUGFnZTo6c2V0U2Nyb2xsUG9zaXRp
b24oY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBwb2ludCkKK3sKKyAgICBpZiAoZC0+dHJhbnNm
b3JtZWRQb2ludEVxdWFsc1VudHJhbnNmb3JtZWRQb2ludChwb2ludCwgZC0+c2Nyb2xsUG9zaXRp
b24oKSkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIElmIHRoZSB1c2VyIHJlY2VudGx5IHBl
cmZvcm1lZCBhbiBldmVudCwgdGhpcyBuZXcgc2Nyb2xsIHBvc2l0aW9uCisgICAgLy8gY291bGQg
cG9zc2libHkgYmUgYSByZXN1bHQgb2YgdGhhdC4gT3Igbm90LCB0aGlzIGlzIGp1c3QgYSBoZXVy
aXN0aWMuCisgICAgaWYgKGN1cnJlbnRUaW1lKCkgLSBkLT5tX2xhc3RVc2VyRXZlbnRUaW1lc3Rh
bXAgPCBtYW51YWxTY3JvbGxJbnRlcnZhbCkKKyAgICAgICAgZC0+bV91c2VyUGVyZm9ybWVkTWFu
dWFsU2Nyb2xsID0gdHJ1ZTsKKworICAgIGQtPm1fYmFja2luZ1N0b3JlQ2xpZW50LT5zZXRJc0Ns
aWVudEdlbmVyYXRlZFNjcm9sbCh0cnVlKTsKKyAgICBkLT5tX21haW5GcmFtZS0+dmlldygpLT5z
ZXRDYW5PdmVyc2Nyb2xsKHRydWUpOworICAgIGQtPnNldFNjcm9sbFBvc2l0aW9uKGQtPm1hcEZy
b21UcmFuc2Zvcm1lZChwb2ludCkpOworICAgIGQtPm1fbWFpbkZyYW1lLT52aWV3KCktPnNldENh
bk92ZXJzY3JvbGwoZmFsc2UpOworICAgIGQtPm1fYmFja2luZ1N0b3JlQ2xpZW50LT5zZXRJc0Ns
aWVudEdlbmVyYXRlZFNjcm9sbChmYWxzZSk7Cit9CisKK1dlYlN0cmluZyBXZWJQYWdlOjp0ZXh0
RW5jb2RpbmcoKQoreworICAgIEZyYW1lKiBmcmFtZSA9IGQtPmZvY3VzZWRPck1haW5GcmFtZSgp
OworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiAiIjsKKworICAgIERvY3VtZW50KiBk
b2N1bWVudCA9IGZyYW1lLT5kb2N1bWVudCgpOworICAgIGlmICghZG9jdW1lbnQpCisgICAgICAg
IHJldHVybiAiIjsKKworICAgIHJldHVybiBkb2N1bWVudC0+bG9hZGVyKCktPndyaXRlcigpLT5l
bmNvZGluZygpOworfQorCitXZWJTdHJpbmcgV2ViUGFnZTo6Zm9yY2VkVGV4dEVuY29kaW5nKCkK
K3sKKyAgICBGcmFtZSogZnJhbWUgPSBkLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICBpZiAo
IWZyYW1lKQorICAgICAgICByZXR1cm4gIiI7CisKKyAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBm
cmFtZS0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIWRvY3VtZW50KQorICAgICAgICByZXR1cm4gIiI7
CisKKyAgICByZXR1cm4gZG9jdW1lbnQtPmxvYWRlcigpLT5vdmVycmlkZUVuY29kaW5nKCk7Cit9
CisKK3ZvaWQgV2ViUGFnZTo6c2V0Rm9yY2VkVGV4dEVuY29kaW5nKGNvbnN0IGNoYXIqIGVuY29k
aW5nKQoreworICAgIGlmIChlbmNvZGluZyAmJiBkLT5mb2N1c2VkT3JNYWluRnJhbWUoKSAmJiBk
LT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+bG9hZGVyKCkgJiYgZC0+Zm9jdXNlZE9yTWFpbkZyYW1l
KCktPmxvYWRlcigpKQorICAgICAgICByZXR1cm4gZC0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPmxv
YWRlcigpLT5yZWxvYWRXaXRoT3ZlcnJpZGVFbmNvZGluZyhlbmNvZGluZyk7Cit9CisKKy8vIEZJ
WE1FOiBNb3ZlIHRvIERPTVN1cHBvcnQuCitib29sIFdlYlBhZ2VQcml2YXRlOjpjYW5TY3JvbGxJ
bm5lckZyYW1lKEZyYW1lKiBmcmFtZSkgY29uc3QKK3sKKyAgICBpZiAoIWZyYW1lIHx8ICFmcmFt
ZS0+dmlldygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBOb3QgaGF2aW5nIGFu
IG93bmVyIGVsZW1lbnQgbWVhbnMgdGhhdCB3ZSBhcmUgb24gdGhlIG1haW5mcmFtZS4KKyAgICBp
ZiAoIWZyYW1lLT5vd25lckVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
QVNTRVJUKGZyYW1lICE9IG1fbWFpbkZyYW1lKTsKKworICAgIEludFNpemUgdmlzaWJsZVNpemUg
PSBmcmFtZS0+dmlldygpLT52aXNpYmxlQ29udGVudFJlY3QoKS5zaXplKCk7CisgICAgSW50U2l6
ZSBjb250ZW50c1NpemUgPSBmcmFtZS0+dmlldygpLT5jb250ZW50c1NpemUoKTsKKworICAgIGJv
b2wgY2FuQmVTY3JvbGxlZCA9IGNvbnRlbnRzU2l6ZS5oZWlnaHQoKSA+IHZpc2libGVTaXplLmhl
aWdodCgpIHx8IGNvbnRlbnRzU2l6ZS53aWR0aCgpID4gdmlzaWJsZVNpemUud2lkdGgoKTsKKwor
ICAgIC8vIExldHMgYWxzbyBjb25zaWRlciB0aGUgJ292ZXJmbG93LXt4LHl9IHByb3BlcnR5IHNl
dCBkaXJlY3RseSB0byB0aGUge2l9ZnJhbWUgdGFnLgorICAgIHJldHVybiBjYW5CZVNjcm9sbGVk
ICYmIChmcmFtZS0+b3duZXJFbGVtZW50KCktPnNjcm9sbGluZ01vZGUoKSAhPSBTY3JvbGxiYXJB
bHdheXNPZmYpOworfQorCisvLyBUaGUgUmVuZGVyQm94OjpjYW5iZVNjcm9sbGVkQW5kSGFzU2Ny
b2xsYWJsZUFyZWEgbWV0aG9kIHJldHVybnMgdHJ1ZSBmb3IgdGhlCisvLyBmb2xsb3dpbmcgc2Nl
bmFyaW8sIGZvciBleGFtcGxlOgorLy8gKDEpIGEgZGl2IHRoYXQgaGFzIGEgdmVydGljYWwgb3Zl
cmZsb3cgYnV0IG5vIGhvcml6b250YWwgb3ZlcmZsb3cKKy8vICAgICB3aXRoIG92ZXJmbG93LXk6
IGhpZGRlbiBhbmQgb3ZlcmZsb3cteDogYXV0byBzZXQuCisvLyBUaGUgdmVyc2lvbiBiZWxvdyBm
aXhlcyBpdC4KKy8vIEZJWE1FOiBGaXggaXQgdXBzdHJlYW0hCitib29sIFdlYlBhZ2VQcml2YXRl
OjpjYW5TY3JvbGxSZW5kZXJCb3goUmVuZGVyQm94KiBib3gpCit7CisgICAgaWYgKCFib3ggfHwg
IWJveC0+aGFzT3ZlcmZsb3dDbGlwKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlm
IChib3gtPnNjcm9sbHNPdmVyZmxvd1goKSAmJiAoYm94LT5zY3JvbGxXaWR0aCgpICE9IGJveC0+
Y2xpZW50V2lkdGgoKSkKKyAgICAgICAgfHwgYm94LT5zY3JvbGxzT3ZlcmZsb3dZKCkgJiYgKGJv
eC0+c2Nyb2xsSGVpZ2h0KCkgIT0gYm94LT5jbGllbnRIZWlnaHQoKSkpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgTm9kZSogbm9kZSA9IGJveC0+bm9kZSgpOworICAgIHJldHVybiBub2Rl
ICYmIChub2RlLT5yZW5kZXJlcklzRWRpdGFibGUoKSB8fCBub2RlLT5pc0RvY3VtZW50Tm9kZSgp
KTsKK30KKworc3RhdGljIFJlbmRlckxheWVyKiBwYXJlbnRMYXllcihSZW5kZXJMYXllciogbGF5
ZXIpCit7CisgICAgQVNTRVJUKGxheWVyKTsKKworICAgIGlmIChsYXllci0+cGFyZW50KCkpCisg
ICAgICAgIHJldHVybiBsYXllci0+cGFyZW50KCk7CisKKyAgICBSZW5kZXJPYmplY3QqIHJlbmRl
cmVyID0gbGF5ZXItPnJlbmRlcmVyKCk7CisgICAgaWYgKHJlbmRlcmVyLT5kb2N1bWVudCgpICYm
IHJlbmRlcmVyLT5kb2N1bWVudCgpLT5vd25lckVsZW1lbnQoKSAmJiByZW5kZXJlci0+ZG9jdW1l
bnQoKS0+b3duZXJFbGVtZW50KCktPnJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybiByZW5kZXJl
ci0+ZG9jdW1lbnQoKS0+b3duZXJFbGVtZW50KCktPnJlbmRlcmVyKCktPmVuY2xvc2luZ0xheWVy
KCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLy8gRklYTUU6IE1ha2UgUmVuZGVyTGF5ZXI6OmVu
Y2xvc2luZ0VsZW1lbnQgcHVibGljIHNvIHRoaXMgb25lIGNhbiBiZSByZW1vdmVkLgorc3RhdGlj
IE5vZGUqIGVuY2xvc2luZ0xheWVyTm9kZShSZW5kZXJMYXllciogbGF5ZXIpCit7CisgICAgZm9y
IChSZW5kZXJPYmplY3QqIHIgPSBsYXllci0+cmVuZGVyZXIoKTsgcjsgciA9IHItPnBhcmVudCgp
KSB7CisgICAgICAgIGlmIChOb2RlKiBlID0gci0+bm9kZSgpKQorICAgICAgICAgICAgcmV0dXJu
IGU7CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQor
CitzdGF0aWMgdm9pZCBwdXNoQmFja0luUmVnaW9uU2Nyb2xsYWJsZShzdGQ6OnZlY3RvcjxQbGF0
Zm9ybTo6U2Nyb2xsVmlld0Jhc2U+JiB2ZWN0b3IsIEluUmVnaW9uU2Nyb2xsYWJsZUFyZWEgc2Ny
b2xsZXIsIFdlYlBhZ2VQcml2YXRlKiB3ZWJQYWdlKQoreworICAgIEFTU0VSVCh3ZWJQYWdlKTsK
KyAgICBBU1NFUlQoIXNjcm9sbGVyLmlzTnVsbCgpKTsKKworICAgIHNjcm9sbGVyLnNldENhblBy
b3BhZ2F0ZVNjcm9sbGluZ1RvRW5jbG9zaW5nU2Nyb2xsYWJsZSghaXNOb25SZW5kZXJWaWV3Rml4
ZWRQb3NpdGlvbmVkQ29udGFpbmVyKHNjcm9sbGVyLmxheWVyKCkpKTsKKyAgICB2ZWN0b3IucHVz
aF9iYWNrKHNjcm9sbGVyKTsKKyAgICBpZiAodmVjdG9yLnNpemUoKSA9PSAxKSB7CisgICAgICAg
IC8vIEZJWE1FOiBVc2UgUmVuZGVyTGF5ZXI6OnJlbmRlckJveCgpLT5ub2RlKCkgaW5zdGVhZD8K
KyAgICAgICAgd2ViUGFnZS0+bV9pblJlZ2lvblNjcm9sbFN0YXJ0aW5nTm9kZSA9IGVuY2xvc2lu
Z0xheWVyTm9kZShzY3JvbGxlci5sYXllcigpKTsKKyAgICB9Cit9CisKK3N0ZDo6dmVjdG9yPFBs
YXRmb3JtOjpTY3JvbGxWaWV3QmFzZT4gV2ViUGFnZVByaXZhdGU6OmluUmVnaW9uU2Nyb2xsYWJs
ZUFyZWFzRm9yUG9pbnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBwb2ludCkKK3sKKyAgICBz
dGQ6OnZlY3RvcjxQbGF0Zm9ybTo6U2Nyb2xsVmlld0Jhc2U+IHZhbGlkUmV0dXJuOworICAgIHN0
ZDo6dmVjdG9yPFBsYXRmb3JtOjpTY3JvbGxWaWV3QmFzZT4gZW1wdHlSZXR1cm47CisKKyAgICBI
aXRUZXN0UmVzdWx0IHJlc3VsdCA9IG1fbWFpbkZyYW1lLT5ldmVudEhhbmRsZXIoKS0+aGl0VGVz
dFJlc3VsdEF0UG9pbnQobWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyhwb2ludCksIGZhbHNlIC8q
YWxsb3dTaGFkb3dDb250ZW50Ki8pOworICAgIE5vZGUqIG5vZGUgPSByZXN1bHQuaW5uZXJOb25T
aGFyZWROb2RlKCk7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gZW1wdHlSZXR1cm47
CisKKyAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKTsKKyAgICAv
LyBGSVhNRTogVmFsaWRhdGUgd2l0aCBlbGVtZW50cyB3aXRoIHZpc2liaWxpdHk6aGlkZGVuLgor
ICAgIGlmICghcmVuZGVyZXIpCisgICAgICAgIHJldHVybiBlbXB0eVJldHVybjsKKworICAgIFJl
bmRlckxheWVyKiBsYXllciA9IHJlbmRlcmVyLT5lbmNsb3NpbmdMYXllcigpOworCisgICAgZG8g
eworICAgICAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbGF5ZXItPnJlbmRlcmVyKCk7CisK
KyAgICAgICAgaWYgKHJlbmRlcmVyLT5pc1JlbmRlclZpZXcoKSkgeworICAgICAgICAgICAgaWYg
KFJlbmRlclZpZXcqIHJlbmRlclZpZXcgPSB0b1JlbmRlclZpZXcocmVuZGVyZXIpKSB7CisgICAg
ICAgICAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0gcmVuZGVyVmlldy0+ZnJhbWVWaWV3KCk7Cisg
ICAgICAgICAgICAgICAgaWYgKCF2aWV3KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1w
dHlSZXR1cm47CisKKyAgICAgICAgICAgICAgICBpZiAoY2FuU2Nyb2xsSW5uZXJGcmFtZSh2aWV3
LT5mcmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBwdXNoQmFja0luUmVnaW9uU2Nyb2xs
YWJsZSh2YWxpZFJldHVybiwgSW5SZWdpb25TY3JvbGxhYmxlQXJlYSh0aGlzLCBsYXllciksIHRo
aXMpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2FuU2Nyb2xsUmVuZGVyQm94KGxheWVy
LT5yZW5kZXJCb3goKSkpIHsKKyAgICAgICAgICAgIHB1c2hCYWNrSW5SZWdpb25TY3JvbGxhYmxl
KHZhbGlkUmV0dXJuLCBJblJlZ2lvblNjcm9sbGFibGVBcmVhKHRoaXMsIGxheWVyKSwgdGhpcyk7
CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIHJ1
biBpbnRvIGEgZml4IHBvc2l0aW9uZWQgbGF5ZXIsIHNldCB0aGUgbGFzdCBzY3JvbGxhYmxlIGlu
LXJlZ2lvbiBvYmplY3QKKyAgICAgICAgLy8gYXMgbm90IGFibGUgdG8gcHJvcGFnYXRlIHNjcm9s
bCB0byBpdHMgcGFyZW50IHNjcm9sbGFibGUuCisgICAgICAgIGlmIChpc05vblJlbmRlclZpZXdG
aXhlZFBvc2l0aW9uZWRDb250YWluZXIobGF5ZXIpICYmIHZhbGlkUmV0dXJuLnNpemUoKSkgewor
ICAgICAgICAgICAgUGxhdGZvcm06OlNjcm9sbFZpZXdCYXNlJiBlbmQgPSB2YWxpZFJldHVybi5i
YWNrKCk7CisgICAgICAgICAgICBlbmQuc2V0Q2FuUHJvcGFnYXRlU2Nyb2xsaW5nVG9FbmNsb3Np
bmdTY3JvbGxhYmxlKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAobGF5ZXIgPSBw
YXJlbnRMYXllcihsYXllcikpOworCisgICAgaWYgKHZhbGlkUmV0dXJuLmVtcHR5KCkpCisgICAg
ICAgIHJldHVybiBlbXB0eVJldHVybjsKKworICAgIHJldHVybiB2YWxpZFJldHVybjsKK30KKwor
QmFja2luZ1N0b3JlKiBXZWJQYWdlOjpiYWNraW5nU3RvcmUoKSBjb25zdAoreworICAgIHJldHVy
biBkLT5tX2JhY2tpbmdTdG9yZTsKK30KKworYm9vbCBXZWJQYWdlOjp6b29tVG9GaXQoKQorewor
ICAgIGlmIChkLT5jb250ZW50c1NpemUoKS5pc0VtcHR5KCkgfHwgIWQtPmlzVXNlclNjYWxhYmxl
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGQtPm1fdXNlclBlcmZvcm1lZE1hbnVh
bFpvb20gPSB0cnVlOworCisgICAgLy8gVE9ETzogV2UgbWF5IG5lZWQgdG8gdXNlICgwLDApIGFz
IHRoZSBhbmNob3IgcG9pbnQgd2hlbiB0ZXh0UmVmbG93IGlzIGVuYWJsZWQuCisgICAgLy8gSUYg
dGhlIG1pbmltdW0gZm9udCBzaXplIGlzIGdpbm9ybW91cywgd2UgbWF5IHN0aWxsIHdhbnQgdGhl
IHNjcm9sbCBwb3NpdGlvbiB0byBiZSAwLDAuCisgICAgcmV0dXJuIGQtPnpvb21BYm91dFBvaW50
KGQtPnpvb21Ub0ZpdFNjYWxlKCksIGQtPmNlbnRlck9mVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsK
K30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0VGV4dFJlZmxvd0FuY2hvclBvaW50KGNvbnN0
IFBsYXRmb3JtOjpJbnRQb2ludCYgZm9jYWxQb2ludCkKK3sKKyAgICAvLyBTaG91bGQgb25seSBi
ZSBpbnZva2VkIHdoZW4gdGV4dCByZWZsb3cgaXMgZW5hYmxlZC4KKyAgICBBU1NFUlQobV93ZWJQ
YWdlLT5zZXR0aW5ncygpLT50ZXh0UmVmbG93TW9kZSgpID09IFdlYlNldHRpbmdzOjpUZXh0UmVm
bG93RW5hYmxlZCk7CisKKyAgICBtX2N1cnJlbnRQaW5jaFpvb21Ob2RlID0gYmVzdE5vZGVGb3Ja
b29tVW5kZXJQb2ludChmb2NhbFBvaW50KTsKKyAgICBpZiAoIW1fY3VycmVudFBpbmNoWm9vbU5v
ZGUpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3Qgbm9kZVJlY3QgPSByZWN0Rm9yTm9k
ZShtX2N1cnJlbnRQaW5jaFpvb21Ob2RlLmdldCgpKTsKKyAgICBtX2FuY2hvckluTm9kZVJlY3RS
YXRpby5zZXQoc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1hcEZyb21UcmFuc2Zvcm1lZChmb2NhbFBvaW50
KS54KCkgLSBub2RlUmVjdC54KCkpIC8gbm9kZVJlY3Qud2lkdGgoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1hcEZyb21UcmFuc2Zvcm1lZChm
b2NhbFBvaW50KS55KCkgLSBub2RlUmVjdC55KCkpIC8gbm9kZVJlY3QuaGVpZ2h0KCkpOworfQor
Citib29sIFdlYlBhZ2U6OnBpbmNoWm9vbUFib3V0UG9pbnQoZG91YmxlIHNjYWxlLCBpbnQgeCwg
aW50IHkpCit7CisgICAgSW50UG9pbnQgYW5jaG9yKHgsIHkpOworICAgIGQtPm1fdXNlclBlcmZv
cm1lZE1hbnVhbFpvb20gPSB0cnVlOworICAgIGQtPm1fdXNlclBlcmZvcm1lZE1hbnVhbFNjcm9s
bCA9IHRydWU7CisKKyAgICBpZiAoZC0+bV93ZWJQYWdlLT5zZXR0aW5ncygpLT50ZXh0UmVmbG93
TW9kZSgpID09IFdlYlNldHRpbmdzOjpUZXh0UmVmbG93RW5hYmxlZCkgeworICAgICAgICBkLT5z
ZXRUZXh0UmVmbG93QW5jaG9yUG9pbnQoYW5jaG9yKTsKKyAgICAgICAgLy8gVGhlb3JldGljYWxs
eSwgZC0+bm9kZUZvclpvb21VbmRlclBvaW50KGFuY2hvcikgY2FuIHJldHVybiBudWxsLgorICAg
ICAgICBpZiAoIWQtPm1fY3VycmVudFBpbmNoWm9vbU5vZGUpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIGQtPnpvb21BYm91dFBvaW50KHNjYWxlLCBkLT5t
YXBGcm9tVHJhbnNmb3JtZWQoYW5jaG9yKSk7Cit9CisKKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVG
TE9XKQordm9pZCBXZWJQYWdlUHJpdmF0ZTo6dG9nZ2xlVGV4dFJlZmxvd0lmRW5hYmxlZEZvckJs
b2NrWm9vbU9ubHkoYm9vbCBzaG91bGRFbmFibGVUZXh0UmVmbG93KQoreworICAgIGlmIChtX3dl
YlBhZ2UtPnNldHRpbmdzKCktPnRleHRSZWZsb3dNb2RlKCkgPT0gV2ViU2V0dGluZ3M6OlRleHRS
ZWZsb3dFbmFibGVkT25seUZvckJsb2NrWm9vbSkKKyAgICAgICAgbV9wYWdlLT5zZXR0aW5ncygp
LT5zZXRUZXh0UmVmbG93RW5hYmxlZChzaG91bGRFbmFibGVUZXh0UmVmbG93KTsKK30KKyNlbmRp
ZgorCitib29sIFdlYlBhZ2U6OmJsb2NrWm9vbShpbnQgeCwgaW50IHkpCit7CisgICAgaWYgKCFk
LT5tX21haW5GcmFtZS0+dmlldygpIHx8ICFkLT5pc1VzZXJTY2FsYWJsZSgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBOb2RlKiBub2RlID0gZC0+YmVzdE5vZGVGb3Jab29tVW5kZXJQ
b2ludChJbnRQb2ludCh4LCB5KSk7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBJbnRSZWN0IG5vZGVSZWN0ID0gZC0+cmVjdEZvck5vZGUobm9kZSk7CisgICAg
SW50UmVjdCBibG9ja1JlY3Q7CisgICAgYm9vbCBlbmRPZkJsb2NrWm9vbU1vZGUgPSBkLT5jb21w
YXJlTm9kZXNGb3JCbG9ja1pvb20oZC0+bV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlLmdl
dCgpLCBub2RlKTsKKyAgICBjb25zdCBkb3VibGUgb2xkU2NhbGUgPSBkLT5tX3RyYW5zZm9ybWF0
aW9uTWF0cml4LT5tMTEoKTsKKyAgICBkb3VibGUgbmV3U2NhbGUgPSAwOworICAgIGNvbnN0IGRv
dWJsZSBtYXJnaW4gPSBlbmRPZkJsb2NrWm9vbU1vZGUgPyAwIDogYmxvY2tab29tTWFyZ2luICog
MiAqIG9sZFNjYWxlOworICAgIGJvb2wgaXNGaXJzdFpvb20gPSBmYWxzZTsKKworICAgIGlmIChl
bmRPZkJsb2NrWm9vbU1vZGUpIHsKKyAgICAgICAgLy8gRW5kIG9mIGJsb2NrIHpvb20gbW9kZQor
ICAgICAgICBJbnRSZWN0IHJlY3QgPSBkLT5ibG9ja1pvb21SZWN0Rm9yTm9kZShub2RlKTsKKyAg
ICAgICAgYmxvY2tSZWN0ID0gSW50UmVjdCgwLCByZWN0LnkoKSwgZC0+dHJhbnNmb3JtZWRDb250
ZW50c1NpemUoKS53aWR0aCgpLCBkLT50cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpLmhlaWdodCgp
IC0gcmVjdC55KCkpOworICAgICAgICBkLT5tX3Nob3VsZFJlZmxvd0Jsb2NrID0gZmFsc2U7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU3RhcnQvY29udGludWUgYmxvY2sgem9vbSBtb2RlCisg
ICAgICAgIE5vZGUqIHRlbXBCbG9ja1pvb21BZGp1c3RlZE5vZGUgPSBkLT5tX2N1cnJlbnRCbG9j
a1pvb21BZGp1c3RlZE5vZGUuZ2V0KCk7CisgICAgICAgIGJsb2NrUmVjdCA9IGQtPmJsb2NrWm9v
bVJlY3RGb3JOb2RlKG5vZGUpOworCisgICAgICAgIC8vIERvbid0IHVzZSBhIGJsb2NrIGlmIGl0
IGlzIHRvbyBjbG9zZSB0byB0aGUgc2l6ZSBvZiB0aGUgYWN0dWFsIGNvbnRlbnRzLgorICAgICAg
ICAvLyBXZSBhbGxvdyB0aGlzIGZvciBpbWFnZXMgb25seSBzbyB0aGF0IHRoZXkgY2FuIGJlIHpv
b21lZCB0aWdodCB0byB0aGUgc2NyZWVuLgorICAgICAgICBpZiAoIW5vZGUtPmhhc1RhZ05hbWUo
SFRNTE5hbWVzOjppbWdUYWcpKSB7CisgICAgICAgICAgICBJbnRSZWN0IHRSZWN0ID0gZC0+bWFw
RnJvbVRyYW5zZm9ybWVkKGJsb2NrUmVjdCk7CisgICAgICAgICAgICBpbnQgYmxvY2tBcmVhID0g
dFJlY3Qud2lkdGgoKSAqIHRSZWN0LmhlaWdodCgpOworICAgICAgICAgICAgaW50IHBhZ2VBcmVh
ID0gZC0+Y29udGVudHNTaXplKCkud2lkdGgoKSAqIGQtPmNvbnRlbnRzU2l6ZSgpLmhlaWdodCgp
OworICAgICAgICAgICAgZG91YmxlIGJsb2NrVG9QYWdlUmF0aW8gPSBzdGF0aWNfY2FzdDxkb3Vi
bGU+KDEgLSBibG9ja0FyZWEgLyBwYWdlQXJlYSk7CisgICAgICAgICAgICBpZiAoYmxvY2tUb1Bh
Z2VSYXRpbyA8IG1pbmltdW1FeHBhbmRpbmdSYXRpbykgeworICAgICAgICAgICAgICAgIC8vIFJl
c3RvcmUgb2xkIGFkanVzdCBub2RlIGJlY2F1c2Ugem9vbSB3YXMgY2FuY2VsZWQuCisgICAgICAg
ICAgICAgICAgZC0+bV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlID0gdGVtcEJsb2NrWm9v
bUFkanVzdGVkTm9kZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmxvY2tSZWN0LmlzRW1wdHkoKSB8fCAhYmxv
Y2tSZWN0LndpZHRoKCkgfHwgIWJsb2NrUmVjdC5oZWlnaHQoKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgICAgICBpZiAoIWQtPm1fY3VycmVudEJsb2NrWm9vbU5vZGUuZ2V0KCkp
CisgICAgICAgICAgICBpc0ZpcnN0Wm9vbSA9IHRydWU7CisKKyAgICAgICAgZC0+bV9jdXJyZW50
QmxvY2tab29tTm9kZSA9IG5vZGU7CisgICAgICAgIGQtPm1fc2hvdWxkUmVmbG93QmxvY2sgPSB0
cnVlOworICAgIH0KKworICAgIG5ld1NjYWxlID0gc3RkOjptaW4oZC0+bmV3U2NhbGVGb3JCbG9j
a1pvb21SZWN0KGJsb2NrUmVjdCwgb2xkU2NhbGUsIG1hcmdpbiksIGQtPm1heEJsb2NrWm9vbVNj
YWxlKCkpOworICAgIG5ld1NjYWxlID0gc3RkOjptYXgobmV3U2NhbGUsIG1pbmltdW1TY2FsZSgp
KTsKKworI2lmIERFQlVHX0JMT0NLX1pPT00KKyAgICAvLyBSZW5kZXIgdGhlIGRvdWJsZSB0YXAg
cG9pbnQgZm9yIHZpc3VhbCByZWZlcmVuY2UuCisgICAgSW50UmVjdCByZW5kZXJSZWN0KHgsIHks
IDEsIDEpOworICAgIHJlbmRlclJlY3QgPSBkLT5tYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1Rv
VHJhbnNmb3JtZWRWaWV3cG9ydChyZW5kZXJSZWN0KTsKKyAgICBJbnRTaXplIHZpZXdwb3J0U2l6
ZSA9IGQtPnRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCk7CisgICAgcmVuZGVyUmVjdC5pbnRlcnNl
Y3QoSW50UmVjdCgwLCAwLCB2aWV3cG9ydFNpemUud2lkdGgoKSwgdmlld3BvcnRTaXplLmhlaWdo
dCgpKSk7CisgICAgZC0+bV9iYWNraW5nU3RvcmUtPmQtPmNsZWFyV2luZG93KHJlbmRlclJlY3Qs
IDAsIDAsIDApOworICAgIGQtPm1fYmFja2luZ1N0b3JlLT5kLT5pbnZhbGlkYXRlV2luZG93KHJl
bmRlclJlY3QpOworCisgICAgLy8gVW5jb21tZW50IHRoaXMgdG8gcmV0dXJuIGluIG9yZGVyIHRv
IHNlZSB0aGUgYmxvY2tzIGJlaW5nIHNlbGVjdGVkLgorLy8gICAgZC0+bV9jbGllbnQtPnpvb21D
aGFuZ2VkKGlzTWluWm9vbWVkKCksIGlzTWF4Wm9vbWVkKCksIGlzQXRJbml0aWFsWm9vbSgpLCBj
dXJyZW50Wm9vbUxldmVsKCkpOworLy8gICAgcmV0dXJuIHRydWU7CisjZW5kaWYKKworI2lmIEVO
QUJMRShWSUVXUE9SVF9SRUZMT1cpCisgICAgLy8gSWYgcmVmbG93aW5nLCBhZGp1c3QgdGhlIHJl
Zmxvdy13aWR0aCBvZiB0ZXh0IG5vZGUgdG8gbWFrZSBzdXJlIHRoZSBmb250IGlzIGEgcmVhc29u
YWJsZSBzaXplLgorICAgIGlmIChkLT5tX2N1cnJlbnRCbG9ja1pvb21Ob2RlICYmIGQtPm1fc2hv
dWxkUmVmbG93QmxvY2sgJiYgc2V0dGluZ3MoKS0+dGV4dFJlZmxvd01vZGUoKSAhPSBXZWJTZXR0
aW5nczo6VGV4dFJlZmxvd0Rpc2FibGVkKSB7CisgICAgICAgIFJlbmRlck9iamVjdCogcmVuZGVy
ZXIgPSBkLT5tX2N1cnJlbnRCbG9ja1pvb21Ob2RlLT5yZW5kZXJlcigpOworICAgICAgICBpZiAo
cmVuZGVyZXIgJiYgcmVuZGVyZXItPmlzVGV4dCgpKSB7CisgICAgICAgICAgICBkb3VibGUgbmV3
Rm9udFNpemUgPSByZW5kZXJlci0+c3R5bGUoKS0+Zm9udFNpemUoKSAqIG5ld1NjYWxlOworICAg
ICAgICAgICAgaWYgKG5ld0ZvbnRTaXplIDwgZC0+bV93ZWJTZXR0aW5ncy0+ZGVmYXVsdEZvbnRT
aXplKCkpIHsKKyAgICAgICAgICAgICAgICBuZXdTY2FsZSA9IHN0ZDo6bWluKHN0YXRpY19jYXN0
PGRvdWJsZT4oZC0+bV93ZWJTZXR0aW5ncy0+ZGVmYXVsdEZvbnRTaXplKCkpIC8gcmVuZGVyZXIt
PnN0eWxlKCktPmZvbnRTaXplKCksIGQtPm1heEJsb2NrWm9vbVNjYWxlKCkpOworICAgICAgICAg
ICAgICAgIG5ld1NjYWxlID0gc3RkOjptYXgobmV3U2NhbGUsIG1pbmltdW1TY2FsZSgpKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIGJsb2NrUmVjdC5zZXRXaWR0aChvbGRTY2FsZSAqIHN0
YXRpY19jYXN0PGRvdWJsZT4oZC0+dHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSgpLndpZHRo
KCkpIC8gbmV3U2NhbGUpOworICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIHRoZSBzY2FsZSBo
ZXJlIHRvIHRha2UgaW4gdG8gYWNjb3VudCB0aGUgbWFyZ2luLgorICAgICAgICAgICAgbmV3U2Nh
bGUgPSBzdGQ6Om1pbihkLT5uZXdTY2FsZUZvckJsb2NrWm9vbVJlY3QoYmxvY2tSZWN0LCBvbGRT
Y2FsZSwgbWFyZ2luKSwgZC0+bWF4QmxvY2tab29tU2NhbGUoKSk7CisgICAgICAgICAgICBuZXdT
Y2FsZSA9IHN0ZDo6bWF4KG5ld1NjYWxlLCBtaW5pbXVtU2NhbGUoKSk7IC8vIFN0aWxsLCBpdCdz
IG5vdCBhbGxvd2VkIHRvIGJlIHNtYWxsZXIgdGhhbiBtaW5pbXVtIHNjYWxlLgorICAgICAgICB9
CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBBbGlnbiB0aGUgem9vbWVkIGJsb2NrIGluIHRoZSBz
Y3JlZW4uCisgICAgZG91YmxlIG5ld0Jsb2NrSGVpZ2h0ID0gZC0+bWFwRnJvbVRyYW5zZm9ybWVk
KGJsb2NrUmVjdCkuaGVpZ2h0KCk7CisgICAgZG91YmxlIG5ld0Jsb2NrV2lkdGggPSBkLT5tYXBG
cm9tVHJhbnNmb3JtZWQoYmxvY2tSZWN0KS53aWR0aCgpOworICAgIGRvdWJsZSBzY2FsZWRWaWV3
cG9ydFdpZHRoID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihkLT5hY3R1YWxWaXNpYmxlU2l6ZSgpLndp
ZHRoKCkpICogb2xkU2NhbGUgLyBuZXdTY2FsZTsKKyAgICBkb3VibGUgc2NhbGVkVmlld3BvcnRI
ZWlnaHQgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGQtPmFjdHVhbFZpc2libGVTaXplKCkuaGVpZ2h0
KCkpICogb2xkU2NhbGUgLyBuZXdTY2FsZTsKKyAgICBkb3VibGUgZHggPSBzdGQ6Om1heCgwLjAs
IChzY2FsZWRWaWV3cG9ydFdpZHRoIC0gbmV3QmxvY2tXaWR0aCkgLyAyLjApOworICAgIGRvdWJs
ZSBkeSA9IHN0ZDo6bWF4KDAuMCwgKHNjYWxlZFZpZXdwb3J0SGVpZ2h0IC0gbmV3QmxvY2tIZWln
aHQpIC8gMi4wKTsKKworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBkLT5tX2N1cnJlbnRC
bG9ja1pvb21BZGp1c3RlZE5vZGUtPnJlbmRlcmVyKCk7CisgICAgRmxvYXRQb2ludCBhbmNob3I7
CisgICAgRmxvYXRQb2ludCB0b3BMZWZ0UG9pbnQoZC0+bWFwRnJvbVRyYW5zZm9ybWVkKGJsb2Nr
UmVjdCkubG9jYXRpb24oKSk7CisgICAgaWYgKHJlbmRlcmVyICYmIHJlbmRlcmVyLT5pc1RleHQo
KSkgeworICAgICAgICBFVGV4dEFsaWduIHRleHRBbGlnbiA9IHJlbmRlcmVyLT5zdHlsZSgpLT50
ZXh0QWxpZ24oKTsKKyAgICAgICAgc3dpdGNoICh0ZXh0QWxpZ24pIHsKKyAgICAgICAgY2FzZSBD
RU5URVI6CisgICAgICAgIGNhc2UgV0VCS0lUX0NFTlRFUjoKKyAgICAgICAgICAgIGFuY2hvciA9
IEZsb2F0UG9pbnQobm9kZVJlY3QueCgpICsgKG5vZGVSZWN0LndpZHRoKCkgLSBzY2FsZWRWaWV3
cG9ydFdpZHRoKSAvIDIsIHRvcExlZnRQb2ludC55KCkpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGNhc2UgTEVGVDoKKyAgICAgICAgY2FzZSBXRUJLSVRfTEVGVDoKKyAgICAgICAgICAg
IGFuY2hvciA9IHRvcExlZnRQb2ludDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNl
IFJJR0hUOgorICAgICAgICBjYXNlIFdFQktJVF9SSUdIVDoKKyAgICAgICAgICAgIGFuY2hvciA9
IEZsb2F0UG9pbnQobm9kZVJlY3QueCgpICsgbm9kZVJlY3Qud2lkdGgoKSAtIHNjYWxlZFZpZXdw
b3J0V2lkdGgsIHRvcExlZnRQb2ludC55KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgVEFBVVRPOgorICAgICAgICBjYXNlIEpVU1RJRlk6CisgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICBpZiAocmVuZGVyZXItPnN0eWxlKCktPmlzTGVmdFRvUmlnaHREaXJlY3Rpb24o
KSkKKyAgICAgICAgICAgICAgICBhbmNob3IgPSB0b3BMZWZ0UG9pbnQ7CisgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgYW5jaG9yID0gRmxvYXRQb2ludChub2RlUmVjdC54KCkgKyBu
b2RlUmVjdC53aWR0aCgpIC0gc2NhbGVkVmlld3BvcnRXaWR0aCwgdG9wTGVmdFBvaW50LnkoKSk7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBhbmNo
b3IgPSByZW5kZXJlci0+c3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpID8gdG9wTGVm
dFBvaW50IDogRmxvYXRQb2ludChub2RlUmVjdC54KCkgKyBub2RlUmVjdC53aWR0aCgpIC0gc2Nh
bGVkVmlld3BvcnRXaWR0aCwgdG9wTGVmdFBvaW50LnkoKSk7CisKKyAgICBpZiAobmV3QmxvY2tI
ZWlnaHQgPD0gc2NhbGVkVmlld3BvcnRIZWlnaHQpIHsKKyAgICAgICAgLy8gVGhlIGJsb2NrIGZp
dHMgaW4gdGhlIHZpZXdwb3J0IHNvIGNlbnRlciBpdC4KKyAgICAgICAgZC0+bV9maW5hbEJsb2Nr
UG9pbnQgPSBGbG9hdFBvaW50KGFuY2hvci54KCkgLSBkeCwgYW5jaG9yLnkoKSAtIGR5KTsKKyAg
ICB9IGVsc2UgeworICAgICAgICAvLyBUaGUgYmxvY2sgaXMgbG9uZ2VyIHRoYW4gdGhlIHZpZXdw
b3J0IHNvIHRvcCBhbGlnbiBpdCBhbmQgYWRkIDMgcGl4ZWwgbWFyZ2luLgorICAgICAgICBkLT5t
X2ZpbmFsQmxvY2tQb2ludCA9IEZsb2F0UG9pbnQoYW5jaG9yLngoKSAtIGR4LCBhbmNob3IueSgp
IC0gMyk7CisgICAgfQorCisjaWYgRU5BQkxFKFZJRVdQT1JUX1JFRkxPVykKKyAgICAvLyBXZSBk
b24ndCBrbm93IGhvdyBsb25nIHRoZSByZWZsb3dlZCBibG9jayB3aWxsIGJlIHNvIHdlIHBvc2l0
aW9uIGl0IGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbiB3aXRoIGEgc21hbGwgbWFyZ2luLgorICAg
IGlmIChzZXR0aW5ncygpLT50ZXh0UmVmbG93TW9kZSgpICE9IFdlYlNldHRpbmdzOjpUZXh0UmVm
bG93RGlzYWJsZWQpIHsKKyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnQgPSBGbG9hdFBvaW50
KGFuY2hvci54KCkgLSBkeCwgYW5jaG9yLnkoKSAtIDMpOworICAgICAgICBkLT5tX2ZpbmFsQmxv
Y2tQb2ludFJlZmxvd09mZnNldCA9IEZsb2F0UG9pbnQoLWR4LCAtMyk7CisgICAgfQorI2VuZGlm
CisKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgb3JpZ2luYWwgbm9kZSByZWN0IGlzIHZpc2li
bGUgaW4gdGhlIHNjcmVlbiBhZnRlciB0aGUgem9vbS4gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVz
ZSB0aGUgaWRlbnRpZmllZCBibG9jayByZWN0IG1pZ2h0CisgICAgLy8gbm90IGJlIHRoZSBzYW1l
IGFzIHRoZSBvcmlnaW5hbCBub2RlIHJlY3QsIGFuZCBpdCBjb3VsZCBmb3JjZSB0aGUgb3JpZ2lu
YWwgbm9kZSByZWN0IG9mZiB0aGUgc2NyZWVuLgorICAgIEZsb2F0UmVjdCBicihhbmNob3IsIEZs
b2F0U2l6ZShzY2FsZWRWaWV3cG9ydFdpZHRoLCBzY2FsZWRWaWV3cG9ydEhlaWdodCkpOworICAg
IEludFBvaW50IGNsaWNrUG9pbnQgPSBkLT5tYXBGcm9tVHJhbnNmb3JtZWQoSW50UG9pbnQoeCwg
eSkpOworICAgIGlmICghYnIuY29udGFpbnMoY2xpY2tQb2ludCkpIHsKKyAgICAgICAgZC0+bV9m
aW5hbEJsb2NrUG9pbnRSZWZsb3dPZmZzZXQubW92ZSgwLCAoY2xpY2tQb2ludC55KCkgLSBzY2Fs
ZWRWaWV3cG9ydEhlaWdodCAvIDIpIC0gZC0+bV9maW5hbEJsb2NrUG9pbnQueSgpKTsKKyAgICAg
ICAgZC0+bV9maW5hbEJsb2NrUG9pbnQgPSBGbG9hdFBvaW50KGQtPm1fZmluYWxCbG9ja1BvaW50
LngoKSwgY2xpY2tQb2ludC55KCkgLSBzY2FsZWRWaWV3cG9ydEhlaWdodCAvIDIpOworICAgIH0K
KworICAgIC8vIENsYW1wIHRoZSBmaW5hbEJsb2NrUG9pbnQgdG8gbm90IGNhdXNlIGFueSBvdmVy
ZmxvdyBzY3JvbGxpbmcuCisgICAgaWYgKGQtPm1fZmluYWxCbG9ja1BvaW50LngoKSA8IDApIHsK
KyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnQuc2V0WCgwKTsKKyAgICAgICAgZC0+bV9maW5h
bEJsb2NrUG9pbnRSZWZsb3dPZmZzZXQuc2V0WCgwKTsKKyAgICB9IGVsc2UgaWYgKGQtPm1fZmlu
YWxCbG9ja1BvaW50LngoKSArIHNjYWxlZFZpZXdwb3J0V2lkdGggPiBkLT5jb250ZW50c1NpemUo
KS53aWR0aCgpKSB7CisgICAgICAgIGQtPm1fZmluYWxCbG9ja1BvaW50LnNldFgoZC0+Y29udGVu
dHNTaXplKCkud2lkdGgoKSAtIHNjYWxlZFZpZXdwb3J0V2lkdGgpOworICAgICAgICBkLT5tX2Zp
bmFsQmxvY2tQb2ludFJlZmxvd09mZnNldC5zZXRYKDApOworICAgIH0KKworICAgIGlmIChkLT5t
X2ZpbmFsQmxvY2tQb2ludC55KCkgPCAwKSB7CisgICAgICAgIGQtPm1fZmluYWxCbG9ja1BvaW50
LnNldFkoMCk7CisgICAgICAgIGQtPm1fZmluYWxCbG9ja1BvaW50UmVmbG93T2Zmc2V0LnNldFko
MCk7CisgICAgfSBlbHNlIGlmIChkLT5tX2ZpbmFsQmxvY2tQb2ludC55KCkgKyBzY2FsZWRWaWV3
cG9ydEhlaWdodCA+IGQtPmNvbnRlbnRzU2l6ZSgpLmhlaWdodCgpKSB7CisgICAgICAgIGQtPm1f
ZmluYWxCbG9ja1BvaW50LnNldFkoZC0+Y29udGVudHNTaXplKCkuaGVpZ2h0KCkgLSBzY2FsZWRW
aWV3cG9ydEhlaWdodCk7CisgICAgICAgIGQtPm1fZmluYWxCbG9ja1BvaW50UmVmbG93T2Zmc2V0
LnNldFkoMCk7CisgICAgfQorCisgICAgZC0+bV9maW5hbEJsb2NrUG9pbnQgPSBkLT5tYXBUb1Ry
YW5zZm9ybWVkRmxvYXRQb2ludChkLT5tX2ZpbmFsQmxvY2tQb2ludCk7CisKKyAgICAvLyBEb24n
dCBibG9jayB6b29tIGlmIHRoZSB1c2VyIGlzIHpvb21pbmcgYW5kIHRoZSBuZXcgc2NhbGUgaXMg
b25seSBtYXJnaW5hbGx5IGRpZmZlcmVudCBmcm9tIHRoZQorICAgIC8vIG9sZFNjYWxlIHdpdGgg
b25seSBhIG1hcmdpbmFsIGNoYW5nZSBpbiBzY3JvbGwgcG9zaXRpb24uIElnbm9yZSBzY3JvbGwg
ZGlmZmVyZW5jZSBpbiB0aGUgc3BlY2lhbCBjYXNlCisgICAgLy8gdGhhdCB0aGUgem9vbSBsZXZl
bCBpcyB0aGUgbWluaW11bVNjYWxlLgorICAgIGlmICghZW5kT2ZCbG9ja1pvb21Nb2RlICYmIGFi
cyhuZXdTY2FsZSAtIG9sZFNjYWxlKSAvIG9sZFNjYWxlIDwgbWluaW11bUV4cGFuZGluZ1JhdGlv
KSB7CisgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5pbXVtRGlzcGxhY2VtZW50ID0gbWluaW11bUV4
cGFuZGluZ1JhdGlvICogZC0+dHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSgpLndpZHRoKCk7
CisgICAgICAgIGlmIChvbGRTY2FsZSA9PSBkLT5taW5pbXVtU2NhbGUoKSB8fCAoZGlzdGFuY2VC
ZXR3ZWVuUG9pbnRzKHJvdW5kVHJhbnNmb3JtZWRQb2ludChkLT5tYXBUb1RyYW5zZm9ybWVkKGQt
PnNjcm9sbFBvc2l0aW9uKCkpKSwgcm91bmRUcmFuc2Zvcm1lZFBvaW50KGQtPm1fZmluYWxCbG9j
a1BvaW50KSkgPCBtaW5pbXVtRGlzcGxhY2VtZW50ICYmIGFicyhuZXdTY2FsZSAtIG9sZFNjYWxl
KSAvIG9sZFNjYWxlIDwgMC4xMCkpIHsKKyAgICAgICAgICAgIGlmIChpc0ZpcnN0Wm9vbSkgewor
ICAgICAgICAgICAgICAgIGQtPnJlc2V0QmxvY2tab29tKCk7CisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gWm9vbSBvdXQgb2YgYmxv
Y2sgem9vbS4KKyAgICAgICAgICAgIGJsb2NrWm9vbSh4LCB5KTsKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgZC0+bV9ibG9ja1pvb21GaW5hbFNjYWxl
ID0gbmV3U2NhbGU7CisKKyAgICAvLyBXZSBzZXQgdGhpcyBoZXJlIHRvIG1ha2Ugc3VyZSB3ZSBk
b24ndCB0cnkgdG8gcmUtcmVuZGVyIHRoZSBwYWdlIGF0IGEgZGlmZmVyZW50IHpvb20gbGV2ZWwg
ZHVyaW5nIGxvYWRpbmcuCisgICAgZC0+bV91c2VyUGVyZm9ybWVkTWFudWFsWm9vbSA9IHRydWU7
CisgICAgZC0+bV91c2VyUGVyZm9ybWVkTWFudWFsU2Nyb2xsID0gdHJ1ZTsKKyAgICBkLT5tX2Ns
aWVudC0+YW5pbWF0ZUJsb2NrWm9vbShkLT5tX2ZpbmFsQmxvY2tQb2ludCwgZC0+bV9ibG9ja1pv
b21GaW5hbFNjYWxlKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFdlYlBhZ2U6Omlz
TWF4Wm9vbWVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKGQtPmN1cnJlbnRTY2FsZSgpID09IGQt
Pm1heGltdW1TY2FsZSgpKSB8fCAhZC0+aXNVc2VyU2NhbGFibGUoKTsKK30KKworYm9vbCBXZWJQ
YWdlOjppc01pblpvb21lZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIChkLT5jdXJyZW50U2NhbGUo
KSA9PSBkLT5taW5pbXVtU2NhbGUoKSkgfHwgIWQtPmlzVXNlclNjYWxhYmxlKCk7Cit9CisKK2Jv
b2wgV2ViUGFnZTo6aXNBdEluaXRpYWxab29tKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKGQtPmN1
cnJlbnRTY2FsZSgpID09IGQtPmluaXRpYWxTY2FsZSgpKSB8fCAhZC0+aXNVc2VyU2NhbGFibGUo
KTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6c2hvdWxkWm9vbU9uRXNjYXBlKCkgY29uc3QK
K3sKKyAgICBpZiAoIWlzVXNlclNjYWxhYmxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIC8vIElmIHRoZSBpbml0aWFsIHNjYWxlIGlzIG5vdCByZWFjaGFibGUsIGRvbid0IHRyeSB0
byB6b29tLgorICAgIGlmIChpbml0aWFsU2NhbGUoKSA8IG1pbmltdW1TY2FsZSgpIHx8IGluaXRp
YWxTY2FsZSgpID4gbWF4aW11bVNjYWxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IC8vIERvbid0IGV2ZXIgem9vbSBpbiB3aGVuIHdlIHByZXNzIGVzY2FwZS4KKyAgICBpZiAoaW5p
dGlhbFNjYWxlKCkgPj0gY3VycmVudFNjYWxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIHJldHVybiBjdXJyZW50U2NhbGUoKSAhPSBpbml0aWFsU2NhbGUoKTsKK30KKwordm9pZCBX
ZWJQYWdlOjp6b29tVG9Jbml0aWFsU2NhbGUoKQoreworICAgIGlmICghZC0+aXNVc2VyU2NhbGFi
bGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZC0+em9vbUFib3V0UG9pbnQoZC0+aW5pdGlh
bFNjYWxlKCksIGQtPmNlbnRlck9mVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKK30KKworYm9vbCBX
ZWJQYWdlOjp6b29tVG9PbmVPbmUoKQoreworICAgIGlmICghZC0+aXNVc2VyU2NhbGFibGUoKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZG91YmxlIHNjYWxlID0gMTsKKyAgICByZXR1
cm4gZC0+em9vbUFib3V0UG9pbnQoc2NhbGUsIGQtPmNlbnRlck9mVmlzaWJsZUNvbnRlbnRzUmVj
dCgpKTsKK30KKworUGxhdGZvcm06OkludFJlY3QgV2ViUGFnZTo6Zm9jdXNOb2RlUmVjdCgpCit7
CisgICAgcmV0dXJuIGQtPmZvY3VzTm9kZVJlY3QoKTsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRG
b2N1c2VkKGJvb2wgZm9jdXNlZCkKK3sKKyAgICBGb2N1c0NvbnRyb2xsZXIqIGZvY3VzQ29udHJv
bGxlciA9IGQtPm1fcGFnZS0+Zm9jdXNDb250cm9sbGVyKCk7CisgICAgZm9jdXNDb250cm9sbGVy
LT5zZXRBY3RpdmUoZm9jdXNlZCk7CisgICAgaWYgKGZvY3VzZWQpIHsKKyAgICAgICAgRnJhbWUq
IGZyYW1lID0gZm9jdXNDb250cm9sbGVyLT5mb2N1c2VkRnJhbWUoKTsKKyAgICAgICAgaWYgKCFm
cmFtZSkKKyAgICAgICAgICAgIGZvY3VzQ29udHJvbGxlci0+c2V0Rm9jdXNlZEZyYW1lKGQtPm1f
bWFpbkZyYW1lKTsKKyAgICB9CisgICAgZm9jdXNDb250cm9sbGVyLT5zZXRGb2N1c2VkKGZvY3Vz
ZWQpOworfQorCitib29sIFdlYlBhZ2U6OmZpbmROZXh0U3RyaW5nKGNvbnN0IGNoYXIqIHRleHQs
IGJvb2wgZm9yd2FyZCkKK3sKKyAgICByZXR1cm4gZC0+bV9pblBhZ2VTZWFyY2hNYW5hZ2VyLT5m
aW5kTmV4dFN0cmluZyhTdHJpbmc6OmZyb21VVEY4KHRleHQpLCBmb3J3YXJkKTsKK30KKwordm9p
ZCBXZWJQYWdlOjpydW5MYXlvdXRUZXN0cygpCit7CisjaWYgRU5BQkxFX0RSVAorICAgIC8vIEZJ
WE1FOiBkbyB3ZSBuZWVkIEFQSSB0byB0b2dnbGUgdGhpcz8KKyAgICBkLT5tX3BhZ2UtPnNldHRp
bmdzKCktPnNldERldmVsb3BlckV4dHJhc0VuYWJsZWQodHJ1ZSk7CisKKyAgICBpZiAoIWQtPm1f
ZHVtcFJlbmRlclRyZWUpCisgICAgICAgIGQtPm1fZHVtcFJlbmRlclRyZWUgPSBuZXcgRHVtcFJl
bmRlclRyZWUodGhpcyk7CisgICAgZC0+bV9kdW1wUmVuZGVyVHJlZS0+cnVuVGVzdHMoKTsKKyNl
bmRpZgorfQorCitib29sIFdlYlBhZ2U6OmVuYWJsZVNjcmlwdERlYnVnZ2VyKCkKK3sKKyNpZiBF
TkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKKyAgICBpZiAoZC0+bV9zY3JpcHREZWJ1Z2dlcikK
KyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBkLT5tX3NjcmlwdERlYnVnZ2VyID0gYWRvcHRQ
dHIobmV3IEphdmFTY3JpcHREZWJ1Z2dlckJsYWNrQmVycnkodGhpcy0+ZCkpOworCisgICAgcmV0
dXJuICEhZC0+bV9zY3JpcHREZWJ1Z2dlcjsKKyNlbmRpZgorfQorCitib29sIFdlYlBhZ2U6OmRp
c2FibGVTY3JpcHREZWJ1Z2dlcigpCit7CisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIp
CisgICAgaWYgKCFkLT5tX3NjcmlwdERlYnVnZ2VyKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKwor
ICAgIGQtPm1fc2NyaXB0RGVidWdnZXIuY2xlYXIoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRp
ZgorfQorCit2b2lkIFdlYlBhZ2U6OmFkZEJyZWFrcG9pbnQoY29uc3QgdW5zaWduZWQgc2hvcnQq
IHVybCwgdW5zaWduZWQgdXJsTGVuZ3RoLCBpbnQgbGluZU51bWJlciwgY29uc3QgdW5zaWduZWQg
c2hvcnQqIGNvbmRpdGlvbiwgdW5zaWduZWQgY29uZGl0aW9uTGVuZ3RoKQoreworI2lmIEVOQUJM
RShKQVZBU0NSSVBUX0RFQlVHR0VSKQorICAgIGlmIChkLT5tX3NjcmlwdERlYnVnZ2VyKQorICAg
ICAgICBkLT5tX3NjcmlwdERlYnVnZ2VyLT5hZGRCcmVha3BvaW50KHVybCwgdXJsTGVuZ3RoLCBs
aW5lTnVtYmVyLCBjb25kaXRpb24sIGNvbmRpdGlvbkxlbmd0aCk7CisjZW5kaWYKK30KKwordm9p
ZCBXZWJQYWdlOjp1cGRhdGVCcmVha3BvaW50KGNvbnN0IHVuc2lnbmVkIHNob3J0KiB1cmwsIHVu
c2lnbmVkIHVybExlbmd0aCwgaW50IGxpbmVOdW1iZXIsIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBj
b25kaXRpb24sIHVuc2lnbmVkIGNvbmRpdGlvbkxlbmd0aCkKK3sKKyNpZiBFTkFCTEUoSkFWQVND
UklQVF9ERUJVR0dFUikKKyAgICBpZiAoZC0+bV9zY3JpcHREZWJ1Z2dlcikKKyAgICAgICAgZC0+
bV9zY3JpcHREZWJ1Z2dlci0+dXBkYXRlQnJlYWtwb2ludCh1cmwsIHVybExlbmd0aCwgbGluZU51
bWJlciwgY29uZGl0aW9uLCBjb25kaXRpb25MZW5ndGgpOworI2VuZGlmCit9CisKK3ZvaWQgV2Vi
UGFnZTo6cmVtb3ZlQnJlYWtwb2ludChjb25zdCB1bnNpZ25lZCBzaG9ydCogdXJsLCB1bnNpZ25l
ZCB1cmxMZW5ndGgsIGludCBsaW5lTnVtYmVyKQoreworI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RF
QlVHR0VSKQorICAgIGlmIChkLT5tX3NjcmlwdERlYnVnZ2VyKQorICAgICAgICBkLT5tX3Njcmlw
dERlYnVnZ2VyLT5yZW1vdmVCcmVha3BvaW50KHVybCwgdXJsTGVuZ3RoLCBsaW5lTnVtYmVyKTsK
KyNlbmRpZgorfQorCitib29sIFdlYlBhZ2U6OnBhdXNlT25FeGNlcHRpb25zKCkKK3sKKyNpZiBF
TkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKKyAgICByZXR1cm4gZC0+bV9zY3JpcHREZWJ1Z2dl
ciA/IGQtPm1fc2NyaXB0RGVidWdnZXItPnBhdXNlT25FeGNlcHRpb25zKCkgOiBmYWxzZTsKKyNl
bmRpZgorfQorCit2b2lkIFdlYlBhZ2U6OnNldFBhdXNlT25FeGNlcHRpb25zKGJvb2wgcGF1c2Up
Cit7CisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCisgICAgaWYgKGQtPm1fc2NyaXB0
RGVidWdnZXIpCisgICAgICAgIGQtPm1fc2NyaXB0RGVidWdnZXItPnNldFBhdXNlT25FeGNlcHRp
b25zKHBhdXNlKTsKKyNlbmRpZgorfQorCit2b2lkIFdlYlBhZ2U6OnBhdXNlSW5EZWJ1Z2dlcigp
CisKK3sKKyNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKKyAgICBpZiAoZC0+bV9zY3Jp
cHREZWJ1Z2dlcikKKyAgICAgICAgZC0+bV9zY3JpcHREZWJ1Z2dlci0+cGF1c2VJbkRlYnVnZ2Vy
KCk7CisjZW5kaWYKK30KKwordm9pZCBXZWJQYWdlOjpyZXN1bWVEZWJ1Z2dlcigpCit7CisjaWYg
RU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCisgICAgaWYgKGQtPm1fc2NyaXB0RGVidWdnZXIp
CisgICAgICAgIGQtPm1fc2NyaXB0RGVidWdnZXItPnJlc3VtZURlYnVnZ2VyKCk7CisjZW5kaWYK
K30KKwordm9pZCBXZWJQYWdlOjpzdGVwT3ZlclN0YXRlbWVudEluRGVidWdnZXIoKQoreworI2lm
IEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQorICAgIGlmIChkLT5tX3NjcmlwdERlYnVnZ2Vy
KQorICAgICAgICBkLT5tX3NjcmlwdERlYnVnZ2VyLT5zdGVwT3ZlclN0YXRlbWVudEluRGVidWdn
ZXIoKTsKKyNlbmRpZgorfQorCit2b2lkIFdlYlBhZ2U6OnN0ZXBJbnRvU3RhdGVtZW50SW5EZWJ1
Z2dlcigpCit7CisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCisgICAgaWYgKGQtPm1f
c2NyaXB0RGVidWdnZXIpCisgICAgICAgIGQtPm1fc2NyaXB0RGVidWdnZXItPnN0ZXBJbnRvU3Rh
dGVtZW50SW5EZWJ1Z2dlcigpOworI2VuZGlmCit9CisKK3ZvaWQgV2ViUGFnZTo6c3RlcE91dE9m
RnVuY3Rpb25JbkRlYnVnZ2VyKCkKK3sKKyNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikK
KyAgICBpZiAoZC0+bV9zY3JpcHREZWJ1Z2dlcikKKyAgICAgICAgZC0+bV9zY3JpcHREZWJ1Z2dl
ci0+c3RlcE91dE9mRnVuY3Rpb25JbkRlYnVnZ2VyKCk7CisjZW5kaWYKK30KKwordW5zaWduZWQg
V2ViUGFnZTo6dGltZW91dEZvckphdmFTY3JpcHRFeGVjdXRpb24oKSBjb25zdAoreworICAgIHJl
dHVybiBTZXR0aW5nczo6dGltZW91dEZvckphdmFTY3JpcHRFeGVjdXRpb24oZC0+bV9wYWdlLT5n
cm91cE5hbWUoKSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0VGltZW91dEZvckphdmFTY3JpcHRF
eGVjdXRpb24odW5zaWduZWQgbXMpCit7CisgICAgU2V0dGluZ3M6OnNldFRpbWVvdXRGb3JKYXZh
U2NyaXB0RXhlY3V0aW9uKGQtPm1fcGFnZS0+Z3JvdXBOYW1lKCksIG1zKTsKKworICAgIERvY3Vt
ZW50KiBkb2MgPSBkLT5tX3BhZ2UtPm1haW5GcmFtZSgpLT5kb2N1bWVudCgpOworICAgIGlmICgh
ZG9jKQorICAgICAgICByZXR1cm47CisKKyAgICBkb2MtPmdsb2JhbERhdGEoKS0+dGltZW91dENo
ZWNrZXIuc2V0VGltZW91dEludGVydmFsKG1zKTsKK30KKworSlNDb250ZXh0UmVmIFdlYlBhZ2U6
OnNjcmlwdENvbnRleHQoKSBjb25zdAoreworICAgIGlmICghZC0+bV9tYWluRnJhbWUpCisgICAg
ICAgIHJldHVybiAwOworICAgIEpTQzo6QmluZGluZ3M6OlJvb3RPYmplY3QgKnJvb3QgPSBkLT5t
X21haW5GcmFtZS0+c2NyaXB0KCktPmJpbmRpbmdSb290T2JqZWN0KCk7CisgICAgaWYgKCFyb290
KQorICAgICAgICByZXR1cm4gMDsKKyAgICBKU0M6OkV4ZWNTdGF0ZSAqZXhlYyA9IHJvb3QtPmds
b2JhbE9iamVjdCgpLT5nbG9iYWxFeGVjKCk7CisgICAgcmV0dXJuIHRvUmVmKGV4ZWMpOworfQor
CitKU1ZhbHVlUmVmIFdlYlBhZ2U6OndpbmRvd09iamVjdCgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IHRvUmVmKGQtPm1fbWFpbkZyYW1lLT5zY3JpcHQoKS0+Z2xvYmFsT2JqZWN0KG1haW5UaHJlYWRO
b3JtYWxXb3JsZCgpKSk7Cit9CisKKyNpZiBFTkFCTEUoV0VCRE9NKQorV2ViRE9NRG9jdW1lbnQg
V2ViUGFnZTo6ZG9jdW1lbnQoKSBjb25zdAoreworICAgIGlmICghZC0+bV9tYWluRnJhbWUpCisg
ICAgICAgIHJldHVybiBXZWJET01Eb2N1bWVudCgpOworICAgIHJldHVybiBXZWJET01Eb2N1bWVu
dChkLT5tX21haW5GcmFtZS0+ZG9jdW1lbnQoKSk7Cit9CisjZW5kaWYKKworLy8gU2VyaWFsaXpl
IG9ubHkgdGhlIG1lbWJlcnMgb2YgSGlzdG9yeUl0ZW0gd2hpY2ggYXJlIG5lZWRlZCBieSB0aGUg
Y2xpZW50LAorLy8gYW5kIGNvcHkgdGhlbSBpbnRvIGEgU2hhcmVkQXJyYXkuIEFsc28gaW5jbHVk
ZSB0aGUgSGlzdG9yeUl0ZW0gcG9pbnRlciB3aGljaAorLy8gd2lsbCBiZSB1c2VkIGJ5IHRoZSBj
bGllbnQgYXMgYW4gb3BhcXVlIHJlZmVyZW5jZSB0byBpZGVudGlmeSB0aGUgaXRlbS4KK3ZvaWQg
V2ViUGFnZTo6Z2V0QmFja0ZvcndhcmRMaXN0KFNoYXJlZEFycmF5PEJhY2tGb3J3YXJkRW50cnk+
JiByZXN1bHQsIHVuc2lnbmVkIGludCYgcmVzdWx0U2l6ZSkgY29uc3QKK3sKKyAgICBIaXN0b3J5
SXRlbVZlY3RvciBlbnRyaWVzID0gc3RhdGljX2Nhc3Q8QmFja0ZvcndhcmRMaXN0SW1wbCo+KGQt
Pm1fcGFnZS0+YmFja0ZvcndhcmQoKS0+Y2xpZW50KCkpLT5lbnRyaWVzKCk7CisgICAgcmVzdWx0
U2l6ZSA9IGVudHJpZXMuc2l6ZSgpOworICAgIHJlc3VsdC5yZXNldChuZXcgQmFja0ZvcndhcmRF
bnRyeVtyZXN1bHRTaXplXSk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVzdWx0
U2l6ZTsgKytpKSB7CisgICAgICAgIFJlZlB0cjxIaXN0b3J5SXRlbT4gZW50cnkgPSBlbnRyaWVz
W2ldOworICAgICAgICBCYWNrRm9yd2FyZEVudHJ5JiByZXN1bHRFbnRyeSA9IHJlc3VsdFtpXTsK
KyAgICAgICAgcmVzdWx0RW50cnkudXJsID0gZW50cnktPnVybFN0cmluZygpOworICAgICAgICBy
ZXN1bHRFbnRyeS5vcmlnaW5hbFVybCA9IGVudHJ5LT5vcmlnaW5hbFVSTFN0cmluZygpOworICAg
ICAgICByZXN1bHRFbnRyeS50aXRsZSA9IGVudHJ5LT50aXRsZSgpOworICAgICAgICByZXN1bHRF
bnRyeS5uZXR3b3JrVG9rZW4gPSBlbnRyeS0+dmlld1N0YXRlKCkubmV0d29ya1Rva2VuOworICAg
ICAgICByZXN1bHRFbnRyeS5sYXN0VmlzaXRXYXNIVFRQTm9uR2V0ID0gZW50cnktPmxhc3RWaXNp
dFdhc0hUVFBOb25HZXQoKTsKKyAgICAgICAgcmVzdWx0RW50cnkuaWQgPSBiYWNrRm9yd2FyZElk
RnJvbUhpc3RvcnlJdGVtKGVudHJ5LmdldCgpKTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhl
IEhpc3RvcnlJdGVtIGlzIG5vdCBkaXNwb3NlZCB3aGlsZSB0aGUgcmVzdWx0IGxpc3QgaXMgc3Rp
bGwgYmVpbmcgdXNlZCwgdG8gbWFrZSBzdXJlIHRoZSBwb2ludGVyIGlzIG5vdCByZXVzZWQKKyAg
ICAgICAgLy8gd2lsbCBiZSBiYWxhbmNlZCBieSBkZXJlZiBpbiByZWxlYXNlQmFja0ZvcndhcmRF
bnRyeS4KKyAgICAgICAgZW50cnktPnJlZigpOworICAgIH0KK30KKwordm9pZCBXZWJQYWdlOjpy
ZWxlYXNlQmFja0ZvcndhcmRFbnRyeShCYWNrRm9yd2FyZElkIGlkKSBjb25zdAoreworICAgIEhp
c3RvcnlJdGVtKiBpdGVtID0gaGlzdG9yeUl0ZW1Gcm9tQmFja0ZvcndhcmRJZChpZCk7CisgICAg
QVNTRVJUKGl0ZW0pOworICAgIGl0ZW0tPmRlcmVmKCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6Y2xl
YXJCcm93c2luZ0RhdGEoKQoreworICAgIGNsZWFyTWVtb3J5Q2FjaGVzKCk7CisgICAgY2xlYXJB
cHBDYWNoZShkLT5tX3BhZ2UtPmdyb3VwTmFtZSgpKTsKKyAgICBjbGVhckxvY2FsU3RvcmFnZSgp
OworICAgIGNsZWFyQ29va2llQ2FjaGUoKTsKKyAgICBjbGVhckhpc3RvcnkoKTsKKyAgICBjbGVh
clBsdWdpblNpdGVEYXRhKCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6Y2xlYXJIaXN0b3J5KCkKK3sK
KyAgICAvLyBEb24ndCBjbGVhciB0aGUgYmFjay1mb3J3YXJkIGxpc3QgYXMgd2UgbWlnaHQgbGlr
ZSB0byBrZWVwIGl0LgorfQorCit2b2lkIFdlYlBhZ2U6OmNsZWFyQ29va2llcygpCit7CisgICAg
Y2xlYXJDb29raWVDYWNoZSgpOworfQorCit2b2lkIFdlYlBhZ2U6OmNsZWFyTG9jYWxTdG9yYWdl
KCkKK3sKKyAgICBCbGFja0JlcnJ5OjpXZWJLaXQ6OmNsZWFyTG9jYWxTdG9yYWdlKGQtPm1fcGFn
ZS0+Z3JvdXBOYW1lKCkpOworICAgIGNsZWFyRGF0YWJhc2UoZC0+bV9wYWdlLT5ncm91cE5hbWUo
KSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6Y2xlYXJDYWNoZSgpCit7CisgICAgY2xlYXJNZW1vcnlD
YWNoZXMoKTsKKyAgICBjbGVhckFwcENhY2hlKGQtPm1fcGFnZS0+Z3JvdXBOYW1lKCkpOworfQor
Cit2b2lkIFdlYlBhZ2U6OmNsZWFyQmFja0ZvcndhcmRMaXN0KGJvb2wga2VlcEN1cnJlbnRQYWdl
KSBjb25zdAoreworICAgIEJhY2tGb3J3YXJkTGlzdEltcGwqIGJhY2tGb3J3YXJkTGlzdCA9IHN0
YXRpY19jYXN0PEJhY2tGb3J3YXJkTGlzdEltcGwqPihkLT5tX3BhZ2UtPmJhY2tGb3J3YXJkKCkt
PmNsaWVudCgpKTsKKyAgICBSZWZQdHI8SGlzdG9yeUl0ZW0+IGN1cnJlbnRJdGVtID0gYmFja0Zv
cndhcmRMaXN0LT5jdXJyZW50SXRlbSgpOworICAgIHdoaWxlICghYmFja0ZvcndhcmRMaXN0LT5l
bnRyaWVzKCkuaXNFbXB0eSgpKQorICAgICAgICBiYWNrRm9yd2FyZExpc3QtPnJlbW92ZUl0ZW0o
YmFja0ZvcndhcmRMaXN0LT5lbnRyaWVzKCkubGFzdCgpLmdldCgpKTsKKyAgICBpZiAoa2VlcEN1
cnJlbnRQYWdlKQorICAgICAgICBiYWNrRm9yd2FyZExpc3QtPmFkZEl0ZW0oY3VycmVudEl0ZW0p
OworfQorCitib29sIFdlYlBhZ2U6OmlzRW5hYmxlTG9jYWxBY2Nlc3NUb0FsbENvb2tpZXMoKSBj
b25zdAoreworICAgIHJldHVybiBjb29raWVNYW5hZ2VyKCkuY2FuTG9jYWxBY2Nlc3NBbGxDb29r
aWVzKCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0RW5hYmxlTG9jYWxBY2Nlc3NUb0FsbENvb2tp
ZXMoYm9vbCBlbmFibGVkKQoreworICAgIGNvb2tpZU1hbmFnZXIoKS5zZXRDYW5Mb2NhbEFjY2Vz
c0FsbENvb2tpZXMoZW5hYmxlZCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6YWRkVmlzaXRlZExpbmso
Y29uc3QgdW5zaWduZWQgc2hvcnQqIHVybCwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKyAgICBB
U1NFUlQoZC0+bV9wYWdlKTsKKyAgICBkLT5tX3BhZ2UtPmdyb3VwKCkuYWRkVmlzaXRlZExpbmso
dXJsLCBsZW5ndGgpOworfQorCisjaWYgRU5BQkxFKFdFQkRPTSkKK1dlYkRPTU5vZGUgV2ViUGFn
ZTo6bm9kZUF0UG9pbnQoaW50IHgsIGludCB5KQoreworICAgIEhpdFRlc3RSZXN1bHQgcmVzdWx0
ID0gZC0+bV9tYWluRnJhbWUtPmV2ZW50SGFuZGxlcigpLT5oaXRUZXN0UmVzdWx0QXRQb2ludChk
LT5tYXBGcm9tVHJhbnNmb3JtZWQoSW50UG9pbnQoeCwgeSkpLCBmYWxzZSk7CisgICAgTm9kZSog
bm9kZSA9IHJlc3VsdC5pbm5lck5vblNoYXJlZE5vZGUoKTsKKyAgICByZXR1cm4gV2ViRE9NTm9k
ZShub2RlKTsKK30KKworYm9vbCBXZWJQYWdlOjpnZXROb2RlUmVjdChjb25zdCBXZWJET01Ob2Rl
JiBub2RlLCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVzdWx0KQoreworICAgIE5vZGUqIG5vZGVJbXBs
ID0gbm9kZS5pbXBsKCk7CisgICAgaWYgKG5vZGVJbXBsICYmIG5vZGVJbXBsLT5yZW5kZXJlcigp
KSB7CisgICAgICAgIHJlc3VsdCA9IG5vZGVJbXBsLT5nZXRSZWN0KCk7CisgICAgICAgIHJldHVy
biB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBXZWJQYWdlOjpz
ZXROb2RlRm9jdXMoY29uc3QgV2ViRE9NTm9kZSYgbm9kZSwgYm9vbCBvbikKK3sKKyAgICBOb2Rl
KiBub2RlSW1wbCA9IG5vZGUuaW1wbCgpOworCisgICAgaWYgKG5vZGVJbXBsICYmIG5vZGVJbXBs
LT5pc0ZvY3VzYWJsZSgpKSB7CisgICAgICAgIERvY3VtZW50KiBkb2MgPSBub2RlSW1wbC0+ZG9j
dW1lbnQoKTsKKyAgICAgICAgaWYgKFBhZ2UqIHBhZ2UgPSBkb2MtPnBhZ2UoKSkgeworICAgICAg
ICAgICAgLy8gTW9kaWZ5IGlmIGZvY3VzaW5nIG9uIG5vZGUgb3IgdHVybmluZyBvZmYgZm9jdXNl
ZCBub2RlLgorICAgICAgICAgICAgaWYgKG9uKSB7CisgICAgICAgICAgICAgICAgcGFnZS0+Zm9j
dXNDb250cm9sbGVyKCktPnNldEZvY3VzZWROb2RlKG5vZGVJbXBsLCBkb2MtPmZyYW1lKCkpOwor
ICAgICAgICAgICAgICAgIGlmIChub2RlSW1wbC0+aXNFbGVtZW50Tm9kZSgpKQorICAgICAgICAg
ICAgICAgICAgICBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZUltcGwpLT51cGRhdGVGb2N1c0Fw
cGVhcmFuY2UodHJ1ZSk7CisgICAgICAgICAgICAgICAgZC0+bV9pbnB1dEhhbmRsZXItPmRpZE5v
ZGVPcGVuUG9wdXAobm9kZUltcGwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChkb2MtPmZvY3Vz
ZWROb2RlKCkgPT0gbm9kZUltcGwpIC8vICYmICFvbgorICAgICAgICAgICAgICAgIHBhZ2UtPmZv
Y3VzQ29udHJvbGxlcigpLT5zZXRGb2N1c2VkTm9kZSgwLCBkb2MtPmZyYW1lKCkpOworCisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK2Jvb2wgV2ViUGFnZTo6c2V0Tm9kZUhvdmVyZWQoY29uc3QgV2ViRE9NTm9kZSYgbm9k
ZSwgYm9vbCBvbikKK3sKKyAgICBpZiAoTm9kZSogbm9kZUltcGwgPSBub2RlLmltcGwoKSkgewor
ICAgICAgICBub2RlSW1wbC0+c2V0SG92ZXJlZChvbik7CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgV2ViUGFnZTo6bm9kZUhhc0hvdmVy
KGNvbnN0IFdlYkRPTU5vZGUmIG5vZGUpCit7CisgICAgaWYgKE5vZGUqIG5vZGVJbXBsID0gbm9k
ZS5pbXBsKCkpIHsKKyAgICAgICAgaWYgKFJlbmRlclN0eWxlKiBzdHlsZSA9IG5vZGVJbXBsLT5y
ZW5kZXJTdHlsZSgpKQorICAgICAgICAgICAgcmV0dXJuIHN0eWxlLT5hZmZlY3RlZEJ5SG92ZXJS
dWxlcygpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKworU3RyaW5nIFdl
YlBhZ2VQcml2YXRlOjpmaW5kUGF0dGVyblN0cmluZ0ZvclVybChjb25zdCBLVVJMJiB1cmwpIGNv
bnN0Cit7CisgICAgaWYgKChtX3dlYlNldHRpbmdzLT5zaG91bGRIYW5kbGVQYXR0ZXJuVXJscygp
ICYmIHByb3RvY29sSXModXJsLCAicGF0dGVybiIpKQorICAgICAgICAgICAgfHwgcHJvdG9jb2xJ
cyh1cmwsICJ0ZWwiKQorICAgICAgICAgICAgfHwgcHJvdG9jb2xJcyh1cmwsICJ3dGFpIikKKyAg
ICAgICAgICAgIHx8IHByb3RvY29sSXModXJsLCAiY3RpIikKKyAgICAgICAgICAgIHx8IHByb3Rv
Y29sSXModXJsLCAibWFpbHRvIikKKyAgICAgICAgICAgIHx8IHByb3RvY29sSXModXJsLCAic21z
IikKKyAgICAgICAgICAgIHx8IHByb3RvY29sSXModXJsLCAicGluIikpIHsKKyAgICAgICAgcmV0
dXJuIHVybDsKKyAgICB9CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCitib29sIFdlYlBhZ2U6
OmRlZmVyc0xvYWRpbmcoKSBjb25zdAoreworICAgIHJldHVybiBkLT5tX3BhZ2UtPmRlZmVyc0xv
YWRpbmcoKTsKK30KKworYm9vbCBXZWJQYWdlOjp3aWxsRmlyZVRpbWVyKCkKK3sKKyAgICBpZiAo
ZC0+aXNMb2FkaW5nKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGQtPm1f
YmFja2luZ1N0b3JlLT5kLT53aWxsRmlyZVRpbWVyKCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90
aWZ5UGFnZVBhdXNlKCkKK3sKKyAgICBGT1JfRUFDSF9QTFVHSU5WSUVXKGQtPm1fcGx1Z2luVmll
d3MpCisgICAgICAgICgqaXQpLT5oYW5kbGVQYXVzZUV2ZW50KCk7Cit9CisKK3ZvaWQgV2ViUGFn
ZTo6bm90aWZ5UGFnZVJlc3VtZSgpCit7CisgICAgRk9SX0VBQ0hfUExVR0lOVklFVyhkLT5tX3Bs
dWdpblZpZXdzKQorICAgICAgICAoKml0KS0+aGFuZGxlUmVzdW1lRXZlbnQoKTsKK30KKwordm9p
ZCBXZWJQYWdlOjpub3RpZnlQYWdlQmFja2dyb3VuZCgpCit7CisjaWYgVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQorICAgIGQtPnN1c3BlbmRSb290TGF5ZXJDb21taXQoKTsKKyNlbmRpZgor
CisgICAgRk9SX0VBQ0hfUExVR0lOVklFVyhkLT5tX3BsdWdpblZpZXdzKQorICAgICAgICAoKml0
KS0+aGFuZGxlQmFja2dyb3VuZEV2ZW50KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90aWZ5UGFn
ZUZvcmVncm91bmQoKQoreworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBk
LT5yZXN1bWVSb290TGF5ZXJDb21taXQoKTsKKyNlbmRpZgorCisgICAgRk9SX0VBQ0hfUExVR0lO
VklFVyhkLT5tX3BsdWdpblZpZXdzKQorICAgICAgICAoKml0KS0+aGFuZGxlRm9yZWdyb3VuZEV2
ZW50KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90aWZ5UGFnZUZ1bGxTY3JlZW5BbGxvd2VkKCkK
K3sKKyAgICBGT1JfRUFDSF9QTFVHSU5WSUVXKGQtPm1fcGx1Z2luVmlld3MpCisgICAgICAgICgq
aXQpLT5oYW5kbGVGdWxsU2NyZWVuQWxsb3dlZEV2ZW50KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6
bm90aWZ5UGFnZUZ1bGxTY3JlZW5FeGl0KCkKK3sKKyAgICBGT1JfRUFDSF9QTFVHSU5WSUVXKGQt
Pm1fcGx1Z2luVmlld3MpCisgICAgICAgICgqaXQpLT5oYW5kbGVGdWxsU2NyZWVuRXhpdEV2ZW50
KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90aWZ5RGV2aWNlSWRsZVN0YXRlQ2hhbmdlKGJvb2wg
ZW50ZXJJZGxlKQoreworICAgIEZPUl9FQUNIX1BMVUdJTlZJRVcoZC0+bV9wbHVnaW5WaWV3cykK
KyAgICAgICAgKCppdCktPmhhbmRsZUlkbGVFdmVudChlbnRlcklkbGUpOworfQorCit2b2lkIFdl
YlBhZ2U6Om5vdGlmeUFwcEFjdGl2YXRpb25TdGF0ZUNoYW5nZShBY3RpdmF0aW9uU3RhdGVUeXBl
IGFjdGl2YXRpb25TdGF0ZSkKK3sKKyAgICBIYXNoU2V0PFBsdWdpblZpZXcqPjo6Y29uc3RfaXRl
cmF0b3IgaXQgPSBkLT5tX3BsdWdpblZpZXdzLmJlZ2luKCk7CisgICAgSGFzaFNldDxQbHVnaW5W
aWV3Kj46OmNvbnN0X2l0ZXJhdG9yIGxhc3QgPSBkLT5tX3BsdWdpblZpZXdzLmVuZCgpOworCisj
aWYgRU5BQkxFKFZJREVPKQorICAgIE1lZGlhUGxheWVyUHJpdmF0ZTo6bm90aWZ5QXBwQWN0aXZh
dGVkRXZlbnQoYWN0aXZhdGlvblN0YXRlID09IEFjdGl2YXRpb25BY3RpdmUpOworI2VuZGlmCisK
KyAgICBmb3IgKDsgaXQgIT0gbGFzdDsgKytpdCkgeworICAgICAgICBzd2l0Y2ggKGFjdGl2YXRp
b25TdGF0ZSkgeworICAgICAgICBjYXNlIEFjdGl2YXRpb25BY3RpdmU6CisgICAgICAgICAgICAo
Kml0KS0+aGFuZGxlQXBwQWN0aXZhdGVkRXZlbnQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIEFjdGl2YXRpb25JbmFjdGl2ZToKKyAgICAgICAgICAgICgqaXQpLT5oYW5kbGVB
cHBEZWFjdGl2YXRlZEV2ZW50KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBB
Y3RpdmF0aW9uU3RhbmRieToKKyAgICAgICAgICAgICgqaXQpLT5oYW5kbGVBcHBTdGFuZGJ5RXZl
bnQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBGSVhNRTogR2V0
IHJpZCBvZiB0aGUgZGVmYXVsdCB0byBmb3JjZSBhIGNvbXBpbGVyIGVycm9yIGluc3RlYWQgb2Yg
dXNpbmcgYSBydW50aW1lIGVycm9yLiBTZWUgUFIgIzEyMTEwOS4KKyAgICAgICAgICAgIEFTU0VS
VCgwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFdl
YlBhZ2U6Om5vdGlmeVN3aXBlRXZlbnQoKQoreworICAgIEZPUl9FQUNIX1BMVUdJTlZJRVcoZC0+
bV9wbHVnaW5WaWV3cykKKyAgICAgICAoKml0KS0+aGFuZGxlU3dpcGVFdmVudCgpOworfQorCit2
b2lkIFdlYlBhZ2U6Om5vdGlmeVNjcmVlblBvd2VyU3RhdGVDaGFuZ2VkKGJvb2wgcG93ZXJlZCkK
K3sKKyAgICBGT1JfRUFDSF9QTFVHSU5WSUVXKGQtPm1fcGx1Z2luVmlld3MpCisgICAgICAgKCpp
dCktPmhhbmRsZVNjcmVlblBvd2VyRXZlbnQocG93ZXJlZCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6
bm90aWZ5RnVsbFNjcmVlblZpZGVvRXhpdGVkKGJvb2wgZG9uZSkKK3sKKyAgICBVTlVTRURfUEFS
QU0oZG9uZSk7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIGlmIChIVE1MTWVkaWFFbGVtZW50KiBt
ZWRpYUVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MTWVkaWFFbGVtZW50Kj4oZC0+bV9mdWxsc2Ny
ZWVuVmlkZW9Ob2RlLmdldCgpKSkKKyAgICAgICAgbWVkaWFFbGVtZW50LT5leGl0RnVsbHNjcmVl
bigpOworI2VuZGlmCit9CisKK3ZvaWQgV2ViUGFnZTo6Y2xlYXJQbHVnaW5TaXRlRGF0YSgpCit7
CisgICAgUGx1Z2luRGF0YWJhc2UqIGRhdGFiYXNlID0gUGx1Z2luRGF0YWJhc2U6Omluc3RhbGxl
ZFBsdWdpbnModHJ1ZSk7CisKKyAgICBpZiAoIWRhdGFiYXNlKQorICAgICAgICByZXR1cm47CisK
KyAgICBWZWN0b3I8UGx1Z2luUGFja2FnZSo+IHBsdWdpbnMgPSBkYXRhYmFzZS0+cGx1Z2lucygp
OworCisgICAgVmVjdG9yPFBsdWdpblBhY2thZ2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gcGx1
Z2lucy5lbmQoKTsKKyAgICBmb3IgKFZlY3RvcjxQbHVnaW5QYWNrYWdlKj46OmNvbnN0X2l0ZXJh
dG9yIGl0ID0gcGx1Z2lucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgICgqaXQp
LT5jbGVhclNpdGVEYXRhKFN0cmluZygpKTsKK30KKwordm9pZCBXZWJQYWdlOjpvbklucHV0TG9j
YWxlQ2hhbmdlZChib29sIGlzUlRMKQoreworICAgIGQtPm9uSW5wdXRMb2NhbGVDaGFuZ2VkKGlz
UlRMKTsKK30KKwordm9pZCBXZWJQYWdlOjpvbk5ldHdvcmtBdmFpbGFiaWxpdHlDaGFuZ2VkKGJv
b2wgYXZhaWxhYmxlKQoreworICAgIHVwZGF0ZU9ubGluZVN0YXR1cyhhdmFpbGFibGUpOworfQor
Cit2b2lkIFdlYlBhZ2U6Om9uQ2VydGlmaWNhdGVTdG9yZUxvY2F0aW9uU2V0KGNvbnN0IFdlYlN0
cmluZyYgY2FQYXRoKQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBNZWRpYVBsYXllclByaXZh
dGU6OnNldENlcnRpZmljYXRlUGF0aChjYVBhdGgpOworI2VuZGlmCit9CisKK3ZvaWQgV2ViUGFn
ZTo6ZW5hYmxlV2ViSW5zcGVjdG9yKCkKK3sKKyAgICBkLT5tX3BhZ2UtPmluc3BlY3RvckNvbnRy
b2xsZXIoKS0+Y29ubmVjdEZyb250ZW5kKCk7CisgICAgZC0+bV9wYWdlLT5zZXR0aW5ncygpLT5z
ZXREZXZlbG9wZXJFeHRyYXNFbmFibGVkKHRydWUpOworfQorCit2b2lkIFdlYlBhZ2U6OmRpc2Fi
bGVXZWJJbnNwZWN0b3IoKQoreworICAgIGQtPm1fcGFnZS0+aW5zcGVjdG9yQ29udHJvbGxlcigp
LT5kaXNjb25uZWN0RnJvbnRlbmQoKTsKKyAgICBkLT5tX3BhZ2UtPnNldHRpbmdzKCktPnNldERl
dmVsb3BlckV4dHJhc0VuYWJsZWQoZmFsc2UpOworfQorCit2b2lkIFdlYlBhZ2U6OmVuYWJsZVBh
c3N3b3JkRWNobygpCit7CisgICAgZC0+bV9wYWdlLT5zZXR0aW5ncygpLT5zZXRQYXNzd29yZEVj
aG9FbmFibGVkKHRydWUpOworfQorCit2b2lkIFdlYlBhZ2U6OmRpc2FibGVQYXNzd29yZEVjaG8o
KQoreworICAgIGQtPm1fcGFnZS0+c2V0dGluZ3MoKS0+c2V0UGFzc3dvcmRFY2hvRW5hYmxlZChm
YWxzZSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6ZGlzcGF0Y2hJbnNwZWN0b3JNZXNzYWdlKGNvbnN0
IGNoYXIqIG1lc3NhZ2UsIGludCBsZW5ndGgpCit7CisgICAgU3RyaW5nIHN0cmluZ01lc3NhZ2Uo
bWVzc2FnZSwgbGVuZ3RoKTsKKyAgICBkLT5tX3BhZ2UtPmluc3BlY3RvckNvbnRyb2xsZXIoKS0+
ZGlzcGF0Y2hNZXNzYWdlRnJvbUZyb250ZW5kKHN0cmluZ01lc3NhZ2UpOworfQorCitGcmFtZSog
V2ViUGFnZTo6bWFpbkZyYW1lKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+bV9tYWluRnJhbWU7
Cit9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCit2b2lkIFdlYlBhZ2VQcml2
YXRlOjpkcmF3TGF5ZXJzT25Db21taXQoKQoreworICAgIGlmICghUGxhdGZvcm06OnVzZXJJbnRl
cmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKSB7CisgICAgICAg
IC8vIFRoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgbGF5ZXIgYXBwZWFy
YW5jZSBjaGFuZ2VkIGR1ZSB0bworICAgICAgICAvLyBhbmltYXRpb25zLiBBbmQgb25seSBpZiB3
ZSBkb24ndCBuZWVkIGEgb25lIHNob3QgZHJhd2luZyBzeW5jLgorICAgICAgICBBU1NFUlQoIW5l
ZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKSk7CisKKyAgICAgICAgaWYgKCFtX3dl
YlBhZ2UtPmlzVmlzaWJsZSgpIHx8ICFtX2JhY2tpbmdTdG9yZS0+ZC0+aXNBY3RpdmUoKSkKKyAg
ICAgICAgICAgIHJldHVybjsKKworICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+d2lsbERyYXdM
YXllcnNPbkNvbW1pdCgpOworCisgICAgICAgIFBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFk
TWVzc2FnZUNsaWVudCgpLT5kaXNwYXRjaE1lc3NhZ2UoCisgICAgICAgICAgICBQbGF0Zm9ybTo6
Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJldlYlBhZ2VQcml2YXRlOjpkcmF3TGF5ZXJzT25Db21t
aXQsIHRoaXMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtX2NsaWVudC0+
d2luZG93KCktPndpbmRvd1VzYWdlKCkgPT0gUGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3c6OkdM
RVMyVXNhZ2UpIHsKKyAgICAgICAgbV9iYWNraW5nU3RvcmUtPmQtPmJsaXRWaXNpYmxlQ29udGVu
dHMoKTsKKyAgICAgICAgcmV0dXJuOyAvLyBibGl0VmlzaWJsZUNvbnRlbnRzKCkgaW5jbHVkZXMg
ZHJhd1N1YkxheWVycygpIGluIHRoaXMgY2FzZS4KKyAgICB9CisKKyAgICBpZiAoIWRyYXdTdWJM
YXllcnMoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSWYgd2UgdXNlIHRoZSBjb21wb3Np
dGluZyBzdXJmYWNlLCB3ZSBuZWVkIHRvIHJlLWJsaXQgdGhlCisgICAgLy8gYmFja2luZ3N0b3Jl
IGFuZCBibGVuZCB0aGUgY29tcG9zaXRpbmcgc3VyZmFjZSBvbiB0b3Agb2YgdGhhdAorICAgIC8v
IGluIG9yZGVyIHRvIGdldCB0aGUgbmV3bHkgZHJhd24gbGF5ZXJzIG9uIHNjcmVlbi4KKyAgICBp
ZiAoIVN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT5jb21wb3NpdGluZ1N1cmZhY2Uo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSWYgdGhlcmUgYXJlIG5vIHZpc2libGUgbGF5
ZXJzLCByZXR1cm4gZWFybHkuCisgICAgaWYgKGxhc3RDb21wb3NpdGluZ1Jlc3VsdHMoKS5pc0Vt
cHR5KCkgJiYgbGFzdENvbXBvc2l0aW5nUmVzdWx0cygpLndhc0VtcHR5KQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAobV9iYWNraW5nU3RvcmUtPmQtPnNob3VsZERpcmVjdFJlbmRlcmluZ1Rv
V2luZG93KCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fYmFja2luZ1N0b3JlLT5kLT5ibGl0
VmlzaWJsZUNvbnRlbnRzKCk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmRyYXdTdWJMYXll
cnMoY29uc3QgSW50UmVjdCYgZHN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBjb250ZW50cykKK3sK
KyAgICBBU1NFUlQoUGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCkt
PmlzQ3VycmVudFRocmVhZCgpKTsKKyAgICBpZiAoIVBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhy
ZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgaWYgKG1fY29tcG9zaXRvcikgeworICAgICAgICBtX2NvbXBvc2l0b3ItPnNl
dENvbXBvc2l0aW5nT250b01haW5XaW5kb3coCisgICAgICAgICAgICBtX2NsaWVudC0+d2luZG93
KCktPndpbmRvd1VzYWdlKCkgPT0gUGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3c6OkdMRVMyVXNh
Z2UpOworICAgICAgICByZXR1cm4gbV9jb21wb3NpdG9yLT5kcmF3TGF5ZXJzKGRzdFJlY3QsIGNv
bnRlbnRzKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgV2ViUGFnZVBy
aXZhdGU6OmRyYXdTdWJMYXllcnMoKQoreworICAgIEFTU0VSVChQbGF0Zm9ybTo6dXNlckludGVy
ZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpOworICAgIGlmICgh
UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRo
cmVhZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gbV9iYWNraW5nU3Rv
cmUtPmQtPmRyYXdTdWJMYXllcnMoKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2NoZWR1
bGVSb290TGF5ZXJDb21taXQoKQoreworICAgIGlmICghbV9mcmFtZUxheWVycyB8fCAhbV9mcmFt
ZUxheWVycy0+aGFzTGF5ZXIoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9uZWVkc0NvbW1p
dCA9IHRydWU7CisgICAgaWYgKCFtX3Jvb3RMYXllckNvbW1pdFRpbWVyLT5pc0FjdGl2ZSgpKQor
ICAgICAgICBtX3Jvb3RMYXllckNvbW1pdFRpbWVyLT5zdGFydE9uZVNob3QoMCk7Cit9CisKK3N0
YXRpYyBib29sIG5lZWRzTGF5b3V0UmVjdXJzaXZlKEZyYW1lVmlldyogdmlldykKK3sKKyAgICBp
ZiAodmlldy0+bmVlZHNMYXlvdXQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBib29s
IHN1YmZyYW1lc05lZWRzTGF5b3V0ID0gZmFsc2U7CisgICAgY29uc3QgSGFzaFNldDxSZWZQdHI8
V2lkZ2V0PiA+KiB2aWV3Q2hpbGRyZW4gPSB2aWV3LT5jaGlsZHJlbigpOworICAgIEhhc2hTZXQ8
UmVmUHRyPFdpZGdldD4gPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gdmlld0NoaWxkcmVuLT5lbmQo
KTsKKyAgICBmb3IgKEhhc2hTZXQ8UmVmUHRyPFdpZGdldD4gPjo6Y29uc3RfaXRlcmF0b3IgY3Vy
cmVudCA9IHZpZXdDaGlsZHJlbi0+YmVnaW4oKTsgY3VycmVudCAhPSBlbmQgJiYgIXN1YmZyYW1l
c05lZWRzTGF5b3V0OyArK2N1cnJlbnQpIHsKKyAgICAgICAgV2lkZ2V0KiB3aWRnZXQgPSAoKmN1
cnJlbnQpLmdldCgpOworICAgICAgICBpZiAod2lkZ2V0LT5pc0ZyYW1lVmlldygpKQorICAgICAg
ICAgICAgc3ViZnJhbWVzTmVlZHNMYXlvdXQgfD0gbmVlZHNMYXlvdXRSZWN1cnNpdmUoc3RhdGlj
X2Nhc3Q8RnJhbWVWaWV3Kj4od2lkZ2V0KSk7CisgICAgfQorCisgICAgcmV0dXJuIHN1YmZyYW1l
c05lZWRzTGF5b3V0OworfQorCitMYXllclJlbmRlcmluZ1Jlc3VsdHMgV2ViUGFnZVByaXZhdGU6
Omxhc3RDb21wb3NpdGluZ1Jlc3VsdHMoKSBjb25zdAoreworICAgIGlmIChtX2NvbXBvc2l0b3Ip
CisgICAgICAgIHJldHVybiBtX2NvbXBvc2l0b3ItPmxhc3RDb21wb3NpdGluZ1Jlc3VsdHMoKTsK
KyAgICByZXR1cm4gTGF5ZXJSZW5kZXJpbmdSZXN1bHRzKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVBy
aXZhdGU6OmNvbW1pdFJvb3RMYXllcihjb25zdCBJbnRSZWN0JiBsYXlvdXRSZWN0Rm9yQ29tcG9z
aXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50U2l6
ZSYgY29udGVudHNTaXplRm9yQ29tcG9zaXRpbmcpCit7CisgICAgaWYgKCFtX2ZyYW1lTGF5ZXJz
IHx8ICFtX2NvbXBvc2l0b3IpCisgICAgICAgIHJldHVybjsKKworICAgIG1fY29tcG9zaXRvci0+
c2V0TGF5b3V0UmVjdEZvckNvbXBvc2l0aW5nKGxheW91dFJlY3RGb3JDb21wb3NpdGluZyk7Cisg
ICAgbV9jb21wb3NpdG9yLT5zZXRDb250ZW50c1NpemVGb3JDb21wb3NpdGluZyhjb250ZW50c1Np
emVGb3JDb21wb3NpdGluZyk7CisgICAgbV9jb21wb3NpdG9yLT5jb21taXQobV9mcmFtZUxheWVy
cy0+cm9vdExheWVyKCkpOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpjb21taXRSb290TGF5
ZXJJZk5lZWRlZCgpCit7CisgICAgaWYgKG1fc3VzcGVuZFJvb3RMYXllckNvbW1pdCkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFtX25lZWRzQ29tbWl0KQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBpZiAoIW1fZnJhbWVMYXllcnMgfHwgIW1fZnJhbWVMYXllcnMtPmhh
c0xheWVyKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEZyYW1lVmlldyogdmlldyA9
IG1fbWFpbkZyYW1lLT52aWV3KCk7CisgICAgaWYgKCF2aWV3KQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAvLyBJZiB3ZSBzeW5jIGNvbXBvc2l0aW5nIGxheWVycyB3aGVuIGEgbGF5b3V0
IGlzIHBlbmRpbmcsIHdlIG1heSBjYXVzZSBwYWludGluZyBvZiBjb21wb3NpdGluZworICAgIC8v
IGxheWVyIGNvbnRlbnQgdG8gb2NjdXIgYmVmb3JlIGxheW91dCBoYXMgaGFwcGVuZWQsIHdoaWNo
IHdpbGwgY2F1c2UgcGFpbnRDb250ZW50cygpIHRvIGJhaWwuCisgICAgaWYgKG5lZWRzTGF5b3V0
UmVjdXJzaXZlKHZpZXcpKSB7CisgICAgICAgIC8vIEluIGNhc2Ugb2Ygb25lIHNob3QgZHJhd2lu
ZyBzeW5jaHJvbml6YXRpb24sIHlvdQorICAgICAgICAvLyBzaG91bGQgZmlyc3QgbGF5b3V0SWZO
ZWVkZWQsIHJlbmRlciwgdGhlbiBjb21taXQgYW5kIGRyYXcgdGhlIGxheWVycy4KKyAgICAgICAg
QVNTRVJUKCFuZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0aW9uKCkpOworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9uZWVkc0NvbW1pdCA9IGZhbHNlOworICAgIC8v
IFdlIGdldCBoZXJlIGVpdGhlciBkdWUgdG8gdGhlIGNvbW1pdCB0aW1lciwgd2hpY2ggd291bGQg
aGF2ZSBjYWxsZWQKKyAgICAvLyByZW5kZXIgaWYgYSBvbmUgc2hvdCBzeW5jIHdhcyBuZWVkZWQu
IE9yIHdlIGdldCBjYWxsZWQgZnJvbSByZW5kZXIKKyAgICAvLyBiZWZvcmUgdGhlIHRpbWVyIHRp
bWVzIG91dCwgd2hpY2ggbWVhbnMgd2UgYXJlIGRvaW5nIGEgb25lIHNob3QgYW55d2F5LgorICAg
IG1fbmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbiA9IGZhbHNlOworCisgICAgaWYg
KG1fcm9vdExheWVyQ29tbWl0VGltZXItPmlzQWN0aXZlKCkpCisgICAgICAgIG1fcm9vdExheWVy
Q29tbWl0VGltZXItPnN0b3AoKTsKKworICAgIG1fZnJhbWVMYXllcnMtPmNvbW1pdE9uV2ViS2l0
VGhyZWFkKGN1cnJlbnRTY2FsZSgpKTsKKyAgICB1cGRhdGVEZWxlZ2F0ZWRPdmVybGF5cygpOwor
CisgICAgLy8gU3Rhc2ggdGhlIHZpc2libGUgY29udGVudCByZWN0IGFjY29yZGluZyB0byB3ZWJr
aXQgdGhyZWFkCisgICAgLy8gVGhpcyBpcyB0aGUgcmVjdGFuZ2xlIHVzZWQgdG8gbGF5b3V0IGZp
eGVkIHBvc2l0aW9uZWQgZWxlbWVudHMsCisgICAgLy8gYW5kIHRoYXQncyB3aGF0IHRoZSBsYXll
ciByZW5kZXJlciB3YW50cy4KKyAgICBJbnRSZWN0IGxheW91dFJlY3RGb3JDb21wb3NpdGluZyhz
Y3JvbGxQb3NpdGlvbigpLCBhY3R1YWxWaXNpYmxlU2l6ZSgpKTsKKyAgICBJbnRTaXplIGNvbnRl
bnRzU2l6ZUZvckNvbXBvc2l0aW5nID0gY29udGVudHNTaXplKCk7CisKKyAgICAvLyBDb21taXQg
Y2hhbmdlcyBtYWRlIHRvIHRoZSBsYXllcnMgc3luY2hyb25vdXNseSB3aXRoIHRoZSBjb21wb3Np
dGluZyB0aHJlYWQuCisgICAgUGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xp
ZW50KCktPmRpc3BhdGNoU3luY01lc3NhZ2UoCisgICAgICAgIFBsYXRmb3JtOjpjcmVhdGVNZXRo
b2RDYWxsTWVzc2FnZSgKKyAgICAgICAgICAgICZXZWJQYWdlUHJpdmF0ZTo6Y29tbWl0Um9vdExh
eWVyLAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIGxheW91dFJlY3RGb3JDb21wb3Np
dGluZywKKyAgICAgICAgICAgIGNvbnRlbnRzU2l6ZUZvckNvbXBvc2l0aW5nKSk7CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6cm9vdExheWVyQ29tbWl0VGlt
ZXJGaXJlZChUaW1lcjxXZWJQYWdlUHJpdmF0ZT4qKQoreworICAgIGlmIChtX3N1c3BlbmRSb290
TGF5ZXJDb21taXQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRoZSBjb21taXQgdGltZXIg
bWF5IGhhdmUgZmlyZWQganVzdCBiZWZvcmUgdGhlIGxheW91dCB0aW1lciwgb3IgZm9yIHNvbWUK
KyAgICAvLyBvdGhlciByZWFzb24gd2UgbmVlZCBsYXlvdXQuIEl0J3Mgbm90IGFsbG93ZWQgdG8g
Y29tbWl0IHdoZW4gYSBsYXlvdXQgaXMKKyAgICAvLyBwZW5kaW5nLCBiZWNhdWVzIGEgY29tbWl0
IGNhbiBjYXVzZSBwYXJ0cyBvZiB0aGUgd2ViIHBhZ2UgdG8gYmUgcmVuZGVyZWQKKyAgICAvLyB0
byB0ZXh0dXJlLgorICAgIC8vIFRoZSBsYXlvdXQgY2FuIGFsc28gdHVybiBvZiBjb21wb3NpdGlu
ZyBhbHRvZ2V0aGVyLCBzbyB3ZSBuZWVkIHRvIGJlIHByZXBhcmVkCisgICAgLy8gdG8gaGFuZGxl
IGEgb25lIHNob3QgZHJhd2luZyBzeW5jaHJvbml6YXRpb24gYWZ0ZXIgdGhlIGxheW91dC4KKyAg
ICByZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKTsKKworICAgIGJvb2wgaXNTaW5nbGVUYXJnZXRXaW5k
b3cgPSBTdXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+Y29tcG9zaXRpbmdTdXJmYWNl
KCkKKyAgICAgICAgfHwgbV9jbGllbnQtPndpbmRvdygpLT53aW5kb3dVc2FnZSgpID09IFBsYXRm
b3JtOjpHcmFwaGljczo6V2luZG93OjpHTEVTMlVzYWdlOworCisgICAgLy8gSWYgd2UgYXJlIGRv
aW5nIGRpcmVjdCByZW5kZXJpbmcgYW5kIGhhdmUgYSBzaW5nbGUgcmVuZGVyaW5nIHRhcmdldCwK
KyAgICAvLyBjb21taXR0aW5nIGlzIGVxdWl2YWxlbnQgdG8gYSBvbmUgc2hvdCBkcmF3aW5nIHN5
bmNocm9uaXphdGlvbi4KKyAgICAvLyBXZSBuZWVkIHRvIHJlLXJlbmRlciB0aGUgd2ViIHBhZ2Us
IHJlLXJlbmRlciB0aGUgbGF5ZXJzLCBhbmQKKyAgICAvLyB0aGVuIGJsaXQgdGhlbSBvbiB0b3Ag
b2YgdGhlIHJlLXJlbmRlcmVkIHdlYiBwYWdlLgorICAgIGlmIChpc1NpbmdsZVRhcmdldFdpbmRv
dyAmJiBtX2JhY2tpbmdTdG9yZS0+ZC0+c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkK
KyAgICAgICAgc2V0TmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpOworCisgICAg
aWYgKG5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKSkgeworICAgICAgICBjb25z
dCBJbnRSZWN0IHdpbmRvd1JlY3QgPSBJbnRSZWN0KEludFBvaW50Ojp6ZXJvKCksIHZpZXdwb3J0
U2l6ZSgpKTsKKyAgICAgICAgbV9iYWNraW5nU3RvcmUtPmQtPnJlcGFpbnQod2luZG93UmVjdCwg
dHJ1ZSAvKmNvbnRlbnRDaGFuZ2VkKi8sIHRydWUgLyppbW1lZGlhdGUqLyk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICAvLyBJZiB0aGUgd2ViIHBhZ2UgbmVlZHMgbGF5b3V0LCB0aGUg
Y29tbWl0IHdpbGwgZmFpbC4KKyAgICAvLyBObyBuZWVkIHRvIGRyYXcgdGhlIGxheWVycyBpZiBu
b3RoaW5nIGNoYW5nZWQuCisgICAgaWYgKGNvbW1pdFJvb3RMYXllcklmTmVlZGVkKCkpCisgICAg
ICAgIGRyYXdMYXllcnNPbkNvbW1pdCgpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXRJ
c0FjY2VsZXJhdGVkQ29tcG9zaXRpbmdBY3RpdmUoYm9vbCBhY3RpdmUpCit7CisgICAgLy8gQmFj
a2luZyBzdG9yZSBjYW4gYmUgbnVsbCBoZXJlIGJlY2F1c2UgaXQgaGFwcGVucyBkdXJpbmcgdGVh
cmRvd24uCisgICAgaWYgKG1faXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nQWN0aXZlID09IGFjdGl2
ZSB8fCAhbV9iYWNraW5nU3RvcmUpCisgICAgICAgIHJldHVybjsKKworICAgIG1faXNBY2NlbGVy
YXRlZENvbXBvc2l0aW5nQWN0aXZlID0gYWN0aXZlOworCisgICAgaWYgKCFhY3RpdmUpIHsKKyAg
ICAgICAgbV9jb21wb3NpdG9yLmNsZWFyKCk7CisgICAgICAgIHJlc2V0Q29tcG9zaXRpbmdTdXJm
YWNlKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIW1fY29tcG9zaXRvcikg
eworICAgICAgICBtX2NvbXBvc2l0b3IgPSBhZG9wdFB0cihuZXcgV2ViUGFnZUNvbXBvc2l0b3Io
dGhpcykpOworICAgICAgICBtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGluZ0FjdGl2ZSA9IG1fY29t
cG9zaXRvci0+aGFyZHdhcmVDb21wb3NpdGluZygpOworICAgICAgICBpZiAoIW1faXNBY2NlbGVy
YXRlZENvbXBvc2l0aW5nQWN0aXZlKQorICAgICAgICAgICAgbV9jb21wb3NpdG9yLmNsZWFyKCk7
CisgICAgfQorfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpyZXNldENvbXBvc2l0aW5nU3VyZmFj
ZSgpCit7CisgICAgaWYgKCFQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGll
bnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgUGxhdGZvcm06OnVzZXJJbnRlcmZh
Y2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoTWVzc2FnZSgKKyAgICAgICAgICAgIFBs
YXRmb3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAmV2ViUGFn
ZVByaXZhdGU6OnJlc2V0Q29tcG9zaXRpbmdTdXJmYWNlLCB0aGlzKSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAobV9jb21wb3NpdG9yKQorICAgICAgICBtX2NvbXBvc2l0b3It
PnNldExhc3RDb21wb3NpdGluZ1Jlc3VsdHMoTGF5ZXJSZW5kZXJpbmdSZXN1bHRzKCkpOworfQor
Cit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXRSb290TGF5ZXJXZWJLaXRUaHJlYWQoRnJhbWUqIGZy
YW1lLCBMYXllcldlYktpdFRocmVhZCogbGF5ZXIpCit7CisgICAgLy8gVGhpcyBtZXRob2QgdXBk
YXRlcyB0aGUgRnJhbWVMYXllcnMgYmFzZWQgb24gaW5wdXQgZnJvbSBXZWJDb3JlLgorICAgIC8v
IEZyYW1lTGF5ZXJzIGtlZXBzIHRyYWNrIG9mIHRoZSBsYXllciBwcm94aWVzIGF0dGFjaGVkIHRv
IGZyYW1lcy4KKyAgICAvLyBXZSB3aWxsIGhhdmUgdG8gY29tcHV0ZSBhIG5ldyByb290IGxheWVy
IGFuZCB1cGRhdGUgdGhlIGNvbXBvc2l0b3IuCisgICAgaWYgKCFsYXllciAmJiAhbV9mcmFtZUxh
eWVycykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFsYXllcikgeworICAgICAgICAgQVNT
RVJUKG1fZnJhbWVMYXllcnMpOworICAgICAgICAgbV9mcmFtZUxheWVycy0+cmVtb3ZlTGF5ZXJC
eUZyYW1lKGZyYW1lKTsKKyAgICAgICAgIGlmICghbV9mcmFtZUxheWVycy0+aGFzTGF5ZXIoKSkK
KyAgICAgICAgICAgICBtX2ZyYW1lTGF5ZXJzLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgaWYgKCFtX2ZyYW1lTGF5ZXJzKQorICAgICAgICAgICAgbV9mcmFtZUxheWVycyA9IGFkb3B0
UHRyKG5ldyBGcmFtZUxheWVycyh0aGlzKSk7CisKKyAgICAgICAgaWYgKCFtX2ZyYW1lTGF5ZXJz
LT5jb250YWluc0xheWVyRm9yRnJhbWUoZnJhbWUpKQorICAgICAgICAgICAgbV9mcmFtZUxheWVy
cy0+YWRkTGF5ZXIoZnJhbWUsIGxheWVyKTsKKworICAgICAgICBBU1NFUlQobV9mcmFtZUxheWVy
cyk7CisgICAgfQorCisgICAgTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogcm9vdExheWVyQ29tcG9z
aXRpbmdUaHJlYWQgPSAwOworICAgIGlmIChtX2ZyYW1lTGF5ZXJzICYmIG1fZnJhbWVMYXllcnMt
PnJvb3RMYXllcigpKQorICAgICAgICByb290TGF5ZXJDb21wb3NpdGluZ1RocmVhZCA9IG1fZnJh
bWVMYXllcnMtPnJvb3RMYXllcigpLT5sYXllckNvbXBvc2l0aW5nVGhyZWFkKCk7CisKKyAgICBz
ZXRSb290TGF5ZXJDb21wb3NpdGluZ1RocmVhZChyb290TGF5ZXJDb21wb3NpdGluZ1RocmVhZCk7
Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldFJvb3RMYXllckNvbXBvc2l0aW5nVGhyZWFk
KExheWVyQ29tcG9zaXRpbmdUaHJlYWQqIGxheWVyKQoreworICAgIGlmICghUGxhdGZvcm06OnVz
ZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKSB7Cisg
ICAgICAgIFBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5kaXNw
YXRjaFN5bmNNZXNzYWdlKAorICAgICAgICAgICAgUGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxN
ZXNzYWdlKCZXZWJQYWdlUHJpdmF0ZTo6c2V0Um9vdExheWVyQ29tcG9zaXRpbmdUaHJlYWQsIHRo
aXMsIGxheWVyKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBEZXBlbmRpbmcg
b24gd2hldGhlciB3ZSBoYXZlIGEgcm9vdCBsYXllciBvciBub3QsCisgICAgLy8gdGhpcyBtZXRo
b2Qgd2lsbCB0dXJuIG9uIG9yIG9mZiBhY2NlbGVyYXRlZCBjb21wb3NpdGluZy4KKyAgICBpZiAo
IWxheWVyKSB7CisgICAgICAgICAvLyBEb24ndCBBU1NFUlQobV9jb21wb3NpdG9yKSBoZXJlIGJl
Y2F1c2Ugd2UgbWF5IGJlIGNhbGxlZCBpbgorICAgICAgICAgLy8gdGhlIHByb2Nlc3Mgb2YgZGVz
dHJ1Y3Rpb24gb2YgV2ViUGFnZSB3aGVyZSB3ZSBoYXZlIGFscmVhZHkKKyAgICAgICAgIC8vIGNh
bGxlZCBzeW5jRGVzdHJveUNvbXBvc2l0b3JPbkNvbXBvc2l0aW5nVGhyZWFkKCkgdG8gZGVzdHJv
eQorICAgICAgICAgLy8gdGhlIGNvbXBvc2l0b3IuCisgICAgICAgICBzZXRJc0FjY2VsZXJhdGVk
Q29tcG9zaXRpbmdBY3RpdmUoZmFsc2UpOworICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IGlmICghbV9jb21wb3NpdG9yKQorICAgICAgICBzZXRJc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmdB
Y3RpdmUodHJ1ZSk7CisKKyAgICAvLyBEb24ndCBBU1NFUlQobV9jb21wb3NpdG9yKSBoZXJlIGJl
Y2F1c2Ugc2V0SXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nQWN0aXZlKHRydWUpCisgICAgLy8gbWF5
IG5vdCB0dXJuIGFjY2VsZXJhdGVkIGNvbXBvc2l0aW5nIG9uIHNpbmNlIG1fYmFja2luZ1N0b3Jl
IGlzIDAuCisgICAgaWYgKG1fY29tcG9zaXRvcikKKyAgICAgICAgbV9jb21wb3NpdG9yLT5zZXRS
b290TGF5ZXIobGF5ZXIpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpkZXN0cm95Q29tcG9z
aXRvcigpCit7CisgICAgIG1fY29tcG9zaXRvci5jbGVhcigpOworfQorCit2b2lkIFdlYlBhZ2VQ
cml2YXRlOjpzeW5jRGVzdHJveUNvbXBvc2l0b3JPbkNvbXBvc2l0aW5nVGhyZWFkKCkKK3sKKyAg
ICBpZiAoIW1fY29tcG9zaXRvcikKKyAgICAgICAgcmV0dXJuOworCisgICAgUGxhdGZvcm06OnVz
ZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoU3luY01lc3NhZ2UoCisg
ICAgICAgIFBsYXRmb3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSgKKyAgICAgICAgICAgICZX
ZWJQYWdlUHJpdmF0ZTo6ZGVzdHJveUNvbXBvc2l0b3IsIHRoaXMpKTsKK30KKwordm9pZCBXZWJQ
YWdlUHJpdmF0ZTo6ZGVzdHJveUxheWVyUmVzb3VyY2VzKCkKK3sKKyAgICAgbV9jb21wb3NpdG9y
LT5yZWxlYXNlTGF5ZXJSZXNvdXJjZXMoKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c3Vz
cGVuZFJvb3RMYXllckNvbW1pdCgpCit7CisgICAgaWYgKG1fc3VzcGVuZFJvb3RMYXllckNvbW1p
dCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9zdXNwZW5kUm9vdExheWVyQ29tbWl0ID0gdHJ1
ZTsKKworICAgIGlmICghbV9mcmFtZUxheWVycyB8fCAhbV9mcmFtZUxheWVycy0+aGFzTGF5ZXIo
KSB8fCAhbV9jb21wb3NpdG9yKQorICAgICAgICByZXR1cm47CisKKyAgICBQbGF0Zm9ybTo6dXNl
ckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+ZGlzcGF0Y2hTeW5jTWVzc2FnZSgKKyAg
ICAgICAgUGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKCZXZWJQYWdlUHJpdmF0ZTo6
ZGVzdHJveUxheWVyUmVzb3VyY2VzLCB0aGlzKSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6
OnJlc3VtZVJvb3RMYXllckNvbW1pdCgpCit7CisgICAgaWYgKCFtX3N1c3BlbmRSb290TGF5ZXJD
b21taXQpCisgICAgICAgIHJldHVybjsKKworICAgIG1fc3VzcGVuZFJvb3RMYXllckNvbW1pdCA9
IGZhbHNlOworICAgIG1fbmVlZHNDb21taXQgPSB0cnVlOworCisgICAgLy8gUmVjcmVhdGUgbGF5
ZXIgcmVzb3VyY2VzIGlmIG5lZWRlZC4KKyAgICBjb21taXRSb290TGF5ZXJJZk5lZWRlZCgpOwor
fQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpuZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0
aW9uKCkKK3sKKyAgICByZXR1cm4gbV9uZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0aW9u
OworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXROZWVkc09uZVNob3REcmF3aW5nU3luY2hy
b25pemF0aW9uKCkKK3sKKyAgICAvLyBUaGlzIG1lYW5zIHdlIGhhdmUgdG8gY29tbWl0IGxheWVy
cyBvbiBuZXh0IHJlbmRlciwgb3IgcmVuZGVyIG9uIHRoZSBuZXh0IGNvbW1pdCwKKyAgICAvLyB3
aGljaGV2ZXIgaGFwcGVucyBmaXJzdC4KKyAgICBtX25lZWRzQ29tbWl0ID0gdHJ1ZTsKKyAgICBt
X25lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24gPSB0cnVlOworfQorI2VuZGlmIC8v
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6ZW50
ZXJGdWxsc2NyZWVuRm9yTm9kZShOb2RlKiBub2RlKQoreworI2lmIEVOQUJMRShWSURFTykKKyAg
ICBpZiAoIW5vZGUgfHwgIW5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjp2aWRlb1RhZykpCisg
ICAgICAgIHJldHVybjsKKworICAgIE1lZGlhUGxheWVyKiBwbGF5ZXIgPSBzdGF0aWNfY2FzdDxI
VE1MTWVkaWFFbGVtZW50Kj4obm9kZSktPnBsYXllcigpOworICAgIGlmICghcGxheWVyKQorICAg
ICAgICByZXR1cm47CisKKyAgICBNZWRpYVBsYXllclByaXZhdGUqIG1tclBsYXllciA9IHN0YXRp
Y19jYXN0PE1lZGlhUGxheWVyUHJpdmF0ZSo+KHBsYXllci0+aW1wbGVtZW50YXRpb24oKSk7Cisg
ICAgaWYgKCFtbXJQbGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIFBsYXRmb3JtOjpHcmFw
aGljczo6V2luZG93KiB3aW5kb3cgPSBtbXJQbGF5ZXItPndpbmRvd0dldCgpOworICAgIGlmICgh
d2luZG93KQorICAgICAgICByZXR1cm47CisKKyAgICB1bnNpZ25lZCB4LCB5LCB3aWR0aCwgaGVp
Z2h0OworICAgIG1tclBsYXllci0+d2luZG93UG9zaXRpb25HZXQoeCwgeSwgd2lkdGgsIGhlaWdo
dCk7CisKKyAgICBjb25zdCBjaGFyKiBjb250ZXh0TmFtZSA9IG1tclBsYXllci0+bW1yQ29udGV4
dE5hbWVHZXQoKTsKKyAgICBpZiAoIWNvbnRleHROYW1lKQorICAgICAgICByZXR1cm47CisKKyAg
ICBtbXJQbGF5ZXItPnNldEZ1bGxzY3JlZW5XZWJQYWdlQ2xpZW50KG1fY2xpZW50KTsKKyAgICBt
X2Z1bGxzY3JlZW5WaWRlb05vZGUgPSBub2RlOworICAgIG1fY2xpZW50LT5mdWxsc2NyZWVuU3Rh
cnQoY29udGV4dE5hbWUsIHdpbmRvdywgeCwgeSwgd2lkdGgsIGhlaWdodCk7CisjZW5kaWYKK30K
Kwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6ZXhpdEZ1bGxzY3JlZW5Gb3JOb2RlKE5vZGUqIG5vZGUp
Cit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIGlmIChtX2Z1bGxzY3JlZW5WaWRlb05vZGUuZ2V0
KCkpIHsKKyAgICAgICAgbV9jbGllbnQtPmZ1bGxzY3JlZW5TdG9wKCk7CisgICAgICAgIG1fZnVs
bHNjcmVlblZpZGVvTm9kZSA9IDA7CisgICAgfQorCisgICAgaWYgKCFub2RlIHx8ICFub2RlLT5o
YXNUYWdOYW1lKEhUTUxOYW1lczo6dmlkZW9UYWcpKQorICAgICAgICByZXR1cm47CisKKyAgICBN
ZWRpYVBsYXllciogcGxheWVyID0gc3RhdGljX2Nhc3Q8SFRNTE1lZGlhRWxlbWVudCo+KG5vZGUp
LT5wbGF5ZXIoKTsKKyAgICBpZiAoIXBsYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgTWVk
aWFQbGF5ZXJQcml2YXRlKiBtbXJQbGF5ZXIgPSBzdGF0aWNfY2FzdDxNZWRpYVBsYXllclByaXZh
dGUqPihwbGF5ZXItPmltcGxlbWVudGF0aW9uKCkpOworICAgIGlmICghbW1yUGxheWVyKQorICAg
ICAgICByZXR1cm47CisKKyAgICAvLyBGdWxsc2NyZWVuIG1vZGUgaXMgYmVpbmcgdHVybmVkIG9m
Ziwgc28gTWVkaWFQbGF5ZXJQcml2YXRlIG5vIGxvbmdlciBuZWVkcyB0aGUgcG9pbnRlci4KKyAg
ICBtbXJQbGF5ZXItPnNldEZ1bGxzY3JlZW5XZWJQYWdlQ2xpZW50KDApOworI2VuZGlmCit9CisK
Ky8vIE1BUks6IFdlYlNldHRpbmdzRGVsZWdhdGUuCisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmRp
ZENoYW5nZVNldHRpbmdzKFdlYlNldHRpbmdzKiB3ZWJTZXR0aW5ncykKK3sKKyAgICBTZXR0aW5n
cyogY29yZVNldHRpbmdzID0gbV9wYWdlLT5zZXR0aW5ncygpOworICAgIG1fcGFnZS0+c2V0R3Jv
dXBOYW1lKHdlYlNldHRpbmdzLT5wYWdlR3JvdXBOYW1lKCkpOworICAgIGNvcmVTZXR0aW5ncy0+
c2V0WFNTQXVkaXRvckVuYWJsZWQod2ViU2V0dGluZ3MtPnhzc0F1ZGl0b3JFbmFibGVkKCkpOwor
ICAgIGNvcmVTZXR0aW5ncy0+c2V0TG9hZHNJbWFnZXNBdXRvbWF0aWNhbGx5KHdlYlNldHRpbmdz
LT5sb2Fkc0ltYWdlc0F1dG9tYXRpY2FsbHkoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXRTaG91
bGREcmF3Qm9yZGVyV2hpbGVMb2FkaW5nSW1hZ2VzKHdlYlNldHRpbmdzLT5zaG91bGREcmF3Qm9y
ZGVyV2hpbGVMb2FkaW5nSW1hZ2VzKCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0U2NyaXB0RW5h
YmxlZCh3ZWJTZXR0aW5ncy0+aXNKYXZhU2NyaXB0RW5hYmxlZCgpKTsKKyAgICBjb3JlU2V0dGlu
Z3MtPnNldFByaXZhdGVCcm93c2luZ0VuYWJsZWQod2ViU2V0dGluZ3MtPmlzUHJpdmF0ZUJyb3dz
aW5nRW5hYmxlZCgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldERlZmF1bHRGaXhlZEZvbnRTaXpl
KHdlYlNldHRpbmdzLT5kZWZhdWx0Rml4ZWRGb250U2l6ZSgpKTsKKyAgICBjb3JlU2V0dGluZ3Mt
PnNldERlZmF1bHRGb250U2l6ZSh3ZWJTZXR0aW5ncy0+ZGVmYXVsdEZvbnRTaXplKCkpOworICAg
IGNvcmVTZXR0aW5ncy0+c2V0TWluaW11bUZvbnRTaXplKHdlYlNldHRpbmdzLT5taW5pbXVtRm9u
dFNpemUoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXRTZXJpZkZvbnRGYW1pbHkod2ViU2V0dGlu
Z3MtPnNlcmlmRm9udEZhbWlseSgpLmltcGwoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXRGaXhl
ZEZvbnRGYW1pbHkod2ViU2V0dGluZ3MtPmZpeGVkRm9udEZhbWlseSgpLmltcGwoKSk7CisgICAg
Y29yZVNldHRpbmdzLT5zZXRTYW5zU2VyaWZGb250RmFtaWx5KHdlYlNldHRpbmdzLT5zYW5zU2Vy
aWZGb250RmFtaWx5KCkuaW1wbCgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldFN0YW5kYXJkRm9u
dEZhbWlseSh3ZWJTZXR0aW5ncy0+c3RhbmRhcmRGb250RmFtaWx5KCkuaW1wbCgpKTsKKyAgICBj
b3JlU2V0dGluZ3MtPnNldEphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHkod2Vi
U2V0dGluZ3MtPmNhbkphdmFTY3JpcHRPcGVuV2luZG93c0F1dG9tYXRpY2FsbHkoKSk7CisgICAg
Y29yZVNldHRpbmdzLT5zZXRBbGxvd1NjcmlwdHNUb0Nsb3NlV2luZG93cyh3ZWJTZXR0aW5ncy0+
Y2FuSmF2YVNjcmlwdE9wZW5XaW5kb3dzQXV0b21hdGljYWxseSgpKTsgLy8gV2h5IGFyZSB3ZSB1
c2luZyB0aGUgc2FtZSB2YWx1ZSBhcyBzZXRKYXZhU2NyaXB0Q2FuT3BlbldpbmRvd3NBdXRvbWF0
aWNhbGx5KCk/CisgICAgY29yZVNldHRpbmdzLT5zZXRQbHVnaW5zRW5hYmxlZCh3ZWJTZXR0aW5n
cy0+YXJlUGx1Z2luc0VuYWJsZWQoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXREZWZhdWx0VGV4
dEVuY29kaW5nTmFtZSh3ZWJTZXR0aW5ncy0+ZGVmYXVsdFRleHRFbmNvZGluZ05hbWUoKS5pbXBs
KCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0RG93bmxvYWRhYmxlQmluYXJ5Rm9udHNFbmFibGVk
KHdlYlNldHRpbmdzLT5kb3dubG9hZGFibGVCaW5hcnlGb250c0VuYWJsZWQoKSk7CisgICAgY29y
ZVNldHRpbmdzLT5zZXRTcGF0aWFsTmF2aWdhdGlvbkVuYWJsZWQobV93ZWJTZXR0aW5ncy0+aXNT
cGF0aWFsTmF2aWdhdGlvbkVuYWJsZWQoKSk7CisKKyAgICAvLyBVc2VyU2NhbGFibGUgc2hvdWxk
IGJlIHJlc2V0IGJ5IG5ldyBzZXR0aW5ncy4KKyAgICBzZXRVc2VyU2NhbGFibGUod2ViU2V0dGlu
Z3MtPmlzVXNlclNjYWxhYmxlKCkpOworCisgICAgV2ViU3RyaW5nIHN0eWxlc2hlZXRVUkwgPSB3
ZWJTZXR0aW5ncy0+dXNlclN0eWxlU2hlZXRTdHJpbmcoKTsKKyAgICBpZiAoc3R5bGVzaGVldFVS
TC5pc0VtcHR5KCkpCisgICAgICAgIHN0eWxlc2hlZXRVUkwgPSB3ZWJTZXR0aW5ncy0+dXNlclN0
eWxlU2hlZXRMb2NhdGlvbigpOworICAgIGlmICghc3R5bGVzaGVldFVSTC5pc0VtcHR5KCkpCisg
ICAgICAgIGNvcmVTZXR0aW5ncy0+c2V0VXNlclN0eWxlU2hlZXRMb2NhdGlvbihLVVJMKEtVUkwo
KSwgc3R5bGVzaGVldFVSTCkpOworCisgICAgY29yZVNldHRpbmdzLT5zZXRGaXJzdFNjaGVkdWxl
ZExheW91dERlbGF5KHdlYlNldHRpbmdzLT5maXJzdFNjaGVkdWxlZExheW91dERlbGF5KCkpOwor
ICAgIGNvcmVTZXR0aW5ncy0+c2V0VXNlQ2FjaGUod2ViU2V0dGluZ3MtPnVzZVdlYktpdENhY2hl
KCkpOworCisjaWYgRU5BQkxFKFNRTF9EQVRBQkFTRSkKKyAgICAvLyBEYXRhYmFzZVRyYWNrZXIg
Y2FuIG9ubHkgYmUgaW5pdGlhbGl6ZWQgZm9yIG9uY2UsIHNvIGl0IGRvZXNuJ3QKKyAgICAvLyBt
YWtlIHNlbnNlIHRvIGNoYW5nZSBkYXRhYmFzZSBwYXRoIGFmdGVyIERhdGFiYXNlVHJhY2tlciBo
YXMKKyAgICAvLyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgc3RhdGljIGJvb2wgZGJp
bml0ID0gZmFsc2U7CisgICAgaWYgKCFkYmluaXQgJiYgIXdlYlNldHRpbmdzLT5kYXRhYmFzZVBh
dGgoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgZGJpbml0ID0gdHJ1ZTsKKyAgICAgICAgRGF0YWJh
c2VUcmFja2VyOjppbml0aWFsaXplVHJhY2tlcih3ZWJTZXR0aW5ncy0+ZGF0YWJhc2VQYXRoKCkp
OworICAgIH0KKworICAgIC8vIFRoZSBkaXJlY3Rvcnkgb2YgY2FjaGVTdG9yYWdlIGZvciBvbmUg
cGFnZSBncm91cCBjYW4gb25seSBiZSBpbml0aWFsaXplZCBvbmNlLgorICAgIHN0YXRpYyBib29s
IGFjaW5pdCA9IGZhbHNlOworICAgIGlmICghYWNpbml0ICYmICF3ZWJTZXR0aW5ncy0+YXBwQ2Fj
aGVQYXRoKCkuaXNFbXB0eSgpKSB7CisgICAgICAgIGFjaW5pdCA9IHRydWU7CisgICAgICAgIGNh
Y2hlU3RvcmFnZSgpLnNldENhY2hlRGlyZWN0b3J5KHdlYlNldHRpbmdzLT5hcHBDYWNoZVBhdGgo
KSk7CisgICAgfQorCisgICAgY29yZVNldHRpbmdzLT5zZXRMb2NhbFN0b3JhZ2VEYXRhYmFzZVBh
dGgod2ViU2V0dGluZ3MtPmxvY2FsU3RvcmFnZVBhdGgoKSk7CisgICAgRGF0YWJhc2U6OnNldElz
QXZhaWxhYmxlKHdlYlNldHRpbmdzLT5pc0RhdGFiYXNlc0VuYWJsZWQoKSk7CisgICAgRGF0YWJh
c2VTeW5jOjpzZXRJc0F2YWlsYWJsZSh3ZWJTZXR0aW5ncy0+aXNEYXRhYmFzZXNFbmFibGVkKCkp
OworCisgICAgY29yZVNldHRpbmdzLT5zZXRMb2NhbFN0b3JhZ2VFbmFibGVkKHdlYlNldHRpbmdz
LT5pc0xvY2FsU3RvcmFnZUVuYWJsZWQoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXRPZmZsaW5l
V2ViQXBwbGljYXRpb25DYWNoZUVuYWJsZWQod2ViU2V0dGluZ3MtPmlzQXBwQ2FjaGVFbmFibGVk
KCkpOworCisgICAgbV9wYWdlLT5ncm91cCgpLmdyb3VwU2V0dGluZ3MoKS0+c2V0TG9jYWxTdG9y
YWdlUXVvdGFCeXRlcyh3ZWJTZXR0aW5ncy0+bG9jYWxTdG9yYWdlUXVvdGEoKSk7CisgICAgY29y
ZVNldHRpbmdzLT5zZXRVc2VzUGFnZUNhY2hlKHdlYlNldHRpbmdzLT5tYXhpbXVtUGFnZXNJbkNh
Y2hlKCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0RnJhbWVGbGF0dGVuaW5nRW5hYmxlZCh3ZWJT
ZXR0aW5ncy0+aXNGcmFtZUZsYXR0ZW5pbmdFbmFibGVkKCkpOworI2VuZGlmCisKKyNpZiBFTkFC
TEUoV0VCX1NPQ0tFVFMpCisgICAgV2ViU29ja2V0OjpzZXRJc0F2YWlsYWJsZSh3ZWJTZXR0aW5n
cy0+YXJlV2ViU29ja2V0c0VuYWJsZWQoKSk7CisjZW5kaWYKKworI2lmIEVOQUJMRShWSUVXUE9S
VF9SRUZMT1cpCisgICAgY29yZVNldHRpbmdzLT5zZXRUZXh0UmVmbG93RW5hYmxlZCh3ZWJTZXR0
aW5ncy0+dGV4dFJlZmxvd01vZGUoKSA9PSBXZWJTZXR0aW5nczo6VGV4dFJlZmxvd0VuYWJsZWQp
OworI2VuZGlmCisKKyAgICAvLyBGSVhNRTogV2UgZG9uJ3Qgd2FudCBIVE1MVG9rZW5pemVyIHRv
IHlpZWxkIGZvciBhbnl0aGluZyBvdGhlciB0aGFuIGVtYWlsIGNhc2UgYmVjYXVzZQorICAgIC8v
IGNhbGwgdG8gY3VycmVudFRpbWUoKSBpcyB0b28gZXhwZW5zaXZlIG9uIG91ciBwbGF0Zm9ybS4g
U2VlIFJJTSBCdWcgIzc0Ni4KKyAgICBjb3JlU2V0dGluZ3MtPnNldFNob3VsZFVzZUZpcnN0U2No
ZWR1bGVkTGF5b3V0RGVsYXkod2ViU2V0dGluZ3MtPmlzRW1haWxNb2RlKCkpOworICAgIGNvcmVT
ZXR0aW5ncy0+c2V0UHJvY2Vzc0hUVFBFcXVpdighd2ViU2V0dGluZ3MtPmlzRW1haWxNb2RlKCkp
OworCisgICAgY29yZVNldHRpbmdzLT5zZXRTaG91bGRVc2VDcm9zc09yaWdpblByb3RvY29sQ2hl
Y2soIXdlYlNldHRpbmdzLT5hbGxvd0Nyb3NzU2l0ZVJlcXVlc3RzKCkpOworCisgICAgY29va2ll
TWFuYWdlcigpLnNldFByaXZhdGVNb2RlKHdlYlNldHRpbmdzLT5pc1ByaXZhdGVCcm93c2luZ0Vu
YWJsZWQoKSk7CisKKyAgICBpZiAobV9tYWluRnJhbWUgJiYgbV9tYWluRnJhbWUtPnZpZXcoKSkg
eworICAgICAgICBDb2xvciBiYWNrZ3JvdW5kQ29sb3Iod2ViU2V0dGluZ3MtPmJhY2tncm91bmRD
b2xvcigpKTsKKyAgICAgICAgbV9tYWluRnJhbWUtPnZpZXcoKS0+dXBkYXRlQmFja2dyb3VuZFJl
Y3Vyc2l2ZWx5KGJhY2tncm91bmRDb2xvciwgYmFja2dyb3VuZENvbG9yLmhhc0FscGhhKCkpOwor
ICAgIH0KK30KKworSW50U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6ZGVmYXVsdE1heExheW91dFNpemUo
KQoreworICAgIHN0YXRpYyBJbnRTaXplIHNpemU7CisKKyAgICBpZiAoc2l6ZS5pc0VtcHR5KCkp
CisgICAgICAgIHNpemUgPSBJbnRTaXplKHN0ZDo6bWF4KDEwMjQsIFBsYXRmb3JtOjpHcmFwaGlj
czo6U2NyZWVuOjpsYW5kc2NhcGVXaWR0aCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3Rk
OjptYXgoNzY4LCBQbGF0Zm9ybTo6R3JhcGhpY3M6OlNjcmVlbjo6bGFuZHNjYXBlSGVpZ2h0KCkp
KTsKKworICAgIHJldHVybiBzaXplOworfQorCitXZWJTdHJpbmcgV2ViUGFnZTo6dGV4dEhhc0F0
dHJpYnV0ZShjb25zdCBXZWJTdHJpbmcmIHF1ZXJ5KSBjb25zdAoreworICAgIGlmIChEb2N1bWVu
dCogZG9jID0gZC0+bV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZyYW1l
KCktPmRvY3VtZW50KCkpCisgICAgICAgIHJldHVybiBkb2MtPnF1ZXJ5Q29tbWFuZFZhbHVlKHF1
ZXJ5KTsKKyAgICByZXR1cm4gIiI7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0SmF2YVNjcmlwdENh
bkFjY2Vzc0NsaXBib2FyZChib29sIGVuYWJsZWQpCit7CisgICAgZC0+bV9wYWdlLT5zZXR0aW5n
cygpLT5zZXRKYXZhU2NyaXB0Q2FuQWNjZXNzQ2xpcGJvYXJkKGVuYWJsZWQpOworfQorCisjaWYg
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQordm9pZCBXZWJQYWdlUHJpdmF0ZTo6YmxpdFZp
c2libGVDb250ZW50cygpCit7CisgICAgaWYgKG1fYmFja2luZ1N0b3JlLT5kLT5zaG91bGREaXJl
Y3RSZW5kZXJpbmdUb1dpbmRvdygpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX2JhY2tpbmdT
dG9yZS0+ZC0+YmxpdFZpc2libGVDb250ZW50cygpOworfQorI2VuZGlmCisKK3ZvaWQgV2ViUGFn
ZTo6c2V0V2ViR0xFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoIVBsYXRmb3JtOjpJ
VFBvbGljeTo6aXNXZWJHTEVuYWJsZWQoKSkgeworICAgICAgICBkLT5tX3BhZ2UtPnNldHRpbmdz
KCktPnNldFdlYkdMRW5hYmxlZChmYWxzZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAg
ZC0+bV9wYWdlLT5zZXR0aW5ncygpLT5zZXRXZWJHTEVuYWJsZWQoZW5hYmxlZCk7Cit9CisKK2Jv
b2wgV2ViUGFnZTo6aXNXZWJHTEVuYWJsZWQoKSBjb25zdAoreworICAgIHJldHVybiBkLT5tX3Bh
Z2UtPnNldHRpbmdzKCktPndlYkdMRW5hYmxlZCgpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRl
OjpzZXROZWVkVG91Y2hFdmVudHMoYm9vbCB2YWx1ZSkKK3sKKyAgICBtX25lZWRUb3VjaEV2ZW50
cyA9IHZhbHVlOworfQorCit9Cit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVy
cnkvQXBpL1dlYlBhZ2UuaCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvV2ViUGFnZS5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmYxYzczMzY2ZGNjNWRiNzcxYjIxMzFjYTU0MWEyODI2YjU3NWEzYmYKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQXBpL1dlYlBhZ2UuaApA
QCAtMCwwICsxLDM2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSwg
MjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2Vy
IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBs
aWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjEx
MC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIFdlYlBhZ2VfaAorI2RlZmluZSBXZWJQYWdlX2gK
KworI2luY2x1ZGUgIkFjdGl2ZU5vZGVDb250ZXh0LmgiCisjaW5jbHVkZSAiQmxhY2tCZXJyeUds
b2JhbC5oIgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUd1YXJkZWRQb2ludGVyLmg+Cisj
aW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtSW5wdXRFdmVudHMuaD4KKyNpbmNsdWRlIDxpbWYv
aW5wdXRfZGF0YS5oPgorI2luY2x1ZGUgPG5ldHdvcmsvTmV0d29ya1JlcXVlc3QuaD4KKworc3Ry
dWN0IE9wYXF1ZUpTQ29udGV4dDsKK3R5cGVkZWYgY29uc3Qgc3RydWN0IE9wYXF1ZUpTQ29udGV4
dCogSlNDb250ZXh0UmVmOworCitzdHJ1Y3QgT3BhcXVlSlNWYWx1ZTsKK3R5cGVkZWYgY29uc3Qg
c3RydWN0IE9wYXF1ZUpTVmFsdWUqIEpTVmFsdWVSZWY7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
K2NsYXNzIENocm9tZUNsaWVudEJsYWNrQmVycnk7CitjbGFzcyBFZGl0b3JDbGllbnRCbGFja0Jl
cnJ5OworY2xhc3MgRWxlbWVudDsKK2NsYXNzIEZyYW1lOworY2xhc3MgRnJhbWVMb2FkZXJDbGll
bnRCbGFja0JlcnJ5OworY2xhc3MgR2VvbG9jYXRpb25Db250cm9sbGVyQ2xpZW50QmxhY2tCZXJy
eTsKK2NsYXNzIEljb25EYXRhYmFzZUNsaWVudEJsYWNrQmVycnk7CitjbGFzcyBJbnNwZWN0b3JD
bGllbnRCbGFja0JlcnJ5OworY2xhc3MgSmF2YVNjcmlwdERlYnVnZ2VyQmxhY2tCZXJyeTsKK2Ns
YXNzIE5vZGU7CitjbGFzcyBSZW5kZXJPYmplY3Q7CitjbGFzcyBWaXNpYmxlU2VsZWN0aW9uOwor
fQorCitjbGFzcyBXZWJET01Eb2N1bWVudDsKK2NsYXNzIFdlYkRPTU5vZGU7Cit0ZW1wbGF0ZTx0
eXBlbmFtZSBUPiBjbGFzcyBTaGFyZWRBcnJheTsKKworbmFtZXNwYWNlIEJsYWNrQmVycnkgewor
bmFtZXNwYWNlIFBsYXRmb3JtIHsKK2NsYXNzIEludFBvaW50OworY2xhc3MgSW50UmVjdDsKK2Ns
YXNzIEludFNpemU7CitjbGFzcyBLZXlib2FyZEV2ZW50OworY2xhc3MgTW91c2VFdmVudDsKK2Ns
YXNzIFRvdWNoRXZlbnQ7CitjbGFzcyBUb3VjaFBvaW50OworfQorCituYW1lc3BhY2UgV2ViS2l0
IHsKKworY2xhc3MgQmFja2luZ1N0b3JlOworY2xhc3MgQmFja2luZ1N0b3JlQ2xpZW50OworY2xh
c3MgQmFja2luZ1N0b3JlUHJpdmF0ZTsKK2NsYXNzIER1bXBSZW5kZXJUcmVlQ2xpZW50OworY2xh
c3MgUmVuZGVyUXVldWU7CitjbGFzcyBXZWJQYWdlQ2xpZW50OworY2xhc3MgV2ViUGFnZUdyb3Vw
TG9hZERlZmVycmVyOworY2xhc3MgV2ViUGFnZVByaXZhdGU7CitjbGFzcyBXZWJTZXR0aW5nczsK
KworZW51bSBKYXZhU2NyaXB0RGF0YVR5cGUgeyBKU1VuZGVmaW5lZCA9IDAsIEpTTnVsbCwgSlNC
b29sZWFuLCBKU051bWJlciwgSlNTdHJpbmcsIEpTT2JqZWN0LCBKU0V4Y2VwdGlvbiwgSlNEYXRh
VHlwZU1heCB9OworCitlbnVtIEFjdGl2YXRpb25TdGF0ZVR5cGUgeyBBY3RpdmF0aW9uQWN0aXZl
LCBBY3RpdmF0aW9uSW5hY3RpdmUsIEFjdGl2YXRpb25TdGFuZGJ5IH07CisKK2VudW0gVGFyZ2V0
RGV0ZWN0aW9uU3RyYXRlZ3kge1BvaW50QmFzZWQsIFJlY3RCYXNlZH07CisKK2NsYXNzIEJMQUNL
QkVSUllfRVhQT1JUIFdlYlBhZ2UgOiBwdWJsaWMgUGxhdGZvcm06Okd1YXJkZWRQb2ludGVyQmFz
ZSB7CitwdWJsaWM6CisgICAgV2ViUGFnZShXZWJQYWdlQ2xpZW50KiwgY29uc3QgV2ViU3RyaW5n
JiBwYWdlR3JvdXBOYW1lLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpOworICAgIHZvaWQgZGVz
dHJveSgpOworCisgICAgV2ViUGFnZUNsaWVudCogY2xpZW50KCkgY29uc3Q7CisKKyAgICB2b2lk
IGxvYWQoY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFyKiBuZXR3b3JrVG9rZW4sIGJvb2wgaXNJ
bml0aWFsID0gZmFsc2UpOworCisgICAgdm9pZCBsb2FkRXh0ZW5kZWQoY29uc3QgY2hhciogdXJs
LCBjb25zdCBjaGFyKiBuZXR3b3JrVG9rZW4sIGNvbnN0IGNoYXIqIG1ldGhvZCwgUGxhdGZvcm06
Ok5ldHdvcmtSZXF1ZXN0OjpDYWNoZVBvbGljeSA9IFBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6
VXNlUHJvdG9jb2xDYWNoZVBvbGljeSwgY29uc3QgY2hhciogZGF0YSA9IDAsIHNpemVfdCBkYXRh
TGVuZ3RoID0gMCwgY29uc3QgY2hhciogY29uc3QqIGhlYWRlcnMgPSAwLCBzaXplX3QgaGVhZGVy
c0xlbmd0aCA9IDAsIGJvb2wgbXVzdEhhbmRsZUludGVybmFsbHkgPSBmYWxzZSk7CisKKyAgICB2
b2lkIGxvYWRGaWxlKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG92ZXJyaWRlQ29udGVu
dFR5cGUgPSAiIik7CisKKyAgICB2b2lkIGxvYWRTdHJpbmcoY29uc3QgY2hhciogc3RyaW5nLCBj
b25zdCBjaGFyKiBiYXNlVVJMLCBjb25zdCBjaGFyKiBjb250ZW50VHlwZSA9ICJ0ZXh0L2h0bWwi
LCBjb25zdCBjaGFyKiBmYWlsaW5nVVJMID0gMCk7CisKKyAgICB2b2lkIGRvd25sb2FkKGNvbnN0
IFBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdCYpOworCisgICAgYm9vbCBleGVjdXRlSmF2YVNjcmlw
dChjb25zdCBjaGFyKiBzY3JpcHQsIEphdmFTY3JpcHREYXRhVHlwZSYgcmV0dXJuVHlwZSwgV2Vi
U3RyaW5nJiByZXR1cm5WYWx1ZSk7CisKKyAgICAvLyBUaGlzIHdpbGwgZXhlY3V0ZSB0aGUgc2Ny
aXB0IGV2ZW4gaWYgaW4tcGFnZSBKYXZhU2NyaXB0IGlzIGRpc2FibGVkLgorICAgIGJvb2wgZXhl
Y3V0ZUphdmFTY3JpcHRJbklzb2xhdGVkV29ybGQoY29uc3QgY2hhciogc2NyaXB0LCBKYXZhU2Ny
aXB0RGF0YVR5cGUmIHJldHVyblR5cGUsIFdlYlN0cmluZyYgcmV0dXJuVmFsdWUpOworCisgICAg
Ly8gVGFrZXMgYSBVVEYxNiBlbmNvZGVkIHNjcmlwdCB0aGF0IGlzIHVzZWQgZXhwbGljaXRseSBi
eSB0aGUgcGF0dGVybiBtYXRjaGluZyBjb2RlCisgICAgYm9vbCBleGVjdXRlSmF2YVNjcmlwdElu
SXNvbGF0ZWRXb3JsZChjb25zdCBzdGQ6OndzdHJpbmcmIHNjcmlwdCwgSmF2YVNjcmlwdERhdGFU
eXBlJiByZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKTsKKworICAgIHZvaWQgaW5p
dGlhbGl6ZUljb25EYXRhQmFzZSgpOworCisgICAgdm9pZCBzdG9wTG9hZGluZygpOworCisgICAg
Ly8gVGhpcyB3aWxsIGZvcmNlIGFueSB1bmxvYWQgaGFuZGxlcnMgdG8gcnVuLgorICAgIHZvaWQg
cHJlcGFyZVRvRGVzdHJveSgpOworCisgICAgdm9pZCByZWxvYWQoKTsKKyAgICB2b2lkIHJlbG9h
ZEZyb21DYWNoZSgpOworCisgICAgV2ViU2V0dGluZ3MqIHNldHRpbmdzKCkgY29uc3Q7CisKKyAg
ICB2b2lkIHNldFZpc2libGUoYm9vbCk7CisgICAgYm9vbCBpc1Zpc2libGUoKSBjb25zdDsKKwor
ICAgIHZvaWQgc2V0U2NyZWVuT3JpZW50YXRpb24oaW50KTsKKyAgICB2b2lkIGFwcGx5UGVuZGlu
Z09yaWVudGF0aW9uSWZOZWVkZWQoKTsKKworICAgIFBsYXRmb3JtOjpJbnRTaXplIHZpZXdwb3J0
U2l6ZSgpIGNvbnN0OworICAgIHZvaWQgc2V0Vmlld3BvcnRTaXplKGNvbnN0IFBsYXRmb3JtOjpJ
bnRTaXplJiB2aWV3cG9ydFNpemUsIGJvb2wgZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJsZSA9IHRy
dWUpOworCisgICAgdm9pZCByZXNldFZpcnR1YWxWaWV3cG9ydE9uQ29tbWl0dGVkKGJvb2wgcmVz
ZXQpOworICAgIHZvaWQgc2V0VmlydHVhbFZpZXdwb3J0U2l6ZShpbnQgd2lkdGgsIGludCBoZWln
aHQpOworCisgICAgLy8gVXNlZCBmb3IgZGVmYXVsdCBsYXlvdXQgc2l6ZSB1bmxlc3Mgb3ZlcnJp
ZGRlbiBieSB3ZWIgY29udGVudCBvciBieSBvdGhlciBBUElzLgorICAgIHZvaWQgc2V0RGVmYXVs
dExheW91dFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworICAgIGJvb2wgbW91c2VFdmVu
dChjb25zdCBQbGF0Zm9ybTo6TW91c2VFdmVudCYsIGJvb2wqIHdoZWVsRGVsdGFBY2NlcHRlZCA9
IDApOworCisgICAgLy8gSGFuZGxlcyBuYXRpdmUgamF2YXNjcmlwdCB0b3VjaCBldmVudHMuCisg
ICAgYm9vbCB0b3VjaEV2ZW50KGNvbnN0IFBsYXRmb3JtOjpUb3VjaEV2ZW50Jik7CisKKyAgICAv
LyBGb3IgY29udmVyc2lvbiB0byBtb3VzZSBldmVudHMuCisgICAgdm9pZCB0b3VjaEV2ZW50Q2Fu
Y2VsKCk7CisgICAgdm9pZCB0b3VjaEV2ZW50Q2FuY2VsQW5kQ2xlYXJGb2N1c2VkTm9kZSgpOwor
ICAgIGJvb2wgdG91Y2hQb2ludEFzTW91c2VFdmVudChjb25zdCBQbGF0Zm9ybTo6VG91Y2hQb2lu
dCYpOworCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBrZXkgc3Ryb2tlIHdhcyBoYW5kbGVk
IGJ5IFdlYktpdC4KKyAgICBib29sIGtleUV2ZW50KGNvbnN0IFBsYXRmb3JtOjpLZXlib2FyZEV2
ZW50Jik7CisKKyAgICB2b2lkIG5hdmlnYXRpb25Nb3ZlRXZlbnQoY29uc3QgdW5zaWduZWQgc2hv
cnQgY2hhcmFjdGVyLCBib29sIHNoaWZ0RG93biwgYm9vbCBhbHREb3duKTsKKworICAgIFdlYlN0
cmluZyB0aXRsZSgpIGNvbnN0OworICAgIFdlYlN0cmluZyBzZWxlY3RlZFRleHQoKSBjb25zdDsK
KyAgICBXZWJTdHJpbmcgY3V0U2VsZWN0ZWRUZXh0KCk7CisgICAgdm9pZCBpbnNlcnRUZXh0KGNv
bnN0IFdlYlN0cmluZyYpOworICAgIHZvaWQgY2xlYXJDdXJyZW50SW5wdXRGaWVsZCgpOworCisg
ICAgdm9pZCBjdXQoKTsKKyAgICB2b2lkIGNvcHkoKTsKKyAgICB2b2lkIHBhc3RlKCk7CisKKyAg
ICAvLyBUZXh0IGVuY29kaW5nLgorICAgIFdlYlN0cmluZyB0ZXh0RW5jb2RpbmcoKTsKKyAgICBX
ZWJTdHJpbmcgZm9yY2VkVGV4dEVuY29kaW5nKCk7CisgICAgdm9pZCBzZXRGb3JjZWRUZXh0RW5j
b2RpbmcoY29uc3QgY2hhciopOworCisgICAgLy8gU2Nyb2xsIHBvc2l0aW9uIHJldHVybmVkIGlz
IGluIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgorICAgIFBsYXRmb3JtOjpJbnRQb2ludCBzY3Jv
bGxQb3NpdGlvbigpIGNvbnN0OworICAgIC8vIFNjcm9sbCBwb3NpdGlvbiBwcm92aWRlZCBzaG91
bGQgYmUgaW4gdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMuCisgICAgdm9pZCBzZXRTY3JvbGxQb3Np
dGlvbihjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmKTsKKyAgICBib29sIHNjcm9sbEJ5KGNvbnN0
IFBsYXRmb3JtOjpJbnRTaXplJiwgYm9vbCBzY3JvbGxNYWluRnJhbWUgPSB0cnVlKTsKKyAgICB2
b2lkIG5vdGlmeUluUmVnaW9uU2Nyb2xsU3RhdHVzQ2hhbmdlZChib29sIHN0YXR1cyk7CisgICAg
dm9pZCBzZXRTY3JvbGxPcmlnaW5Qb2ludChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmKTsKKwor
ICAgIEJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlKCkgY29uc3Q7CisKKyAgICBib29sIHpvb21U
b0ZpdCgpOworICAgIGJvb2wgem9vbVRvT25lT25lKCk7CisgICAgdm9pZCB6b29tVG9Jbml0aWFs
U2NhbGUoKTsKKyAgICBib29sIGJsb2NrWm9vbShpbnQgeCwgaW50IHkpOworICAgIHZvaWQgYmxv
Y2tab29tQW5pbWF0aW9uRmluaXNoZWQoKTsKKyAgICBib29sIGlzQXRJbml0aWFsWm9vbSgpIGNv
bnN0OworICAgIGJvb2wgaXNNYXhab29tZWQoKSBjb25zdDsKKyAgICBib29sIGlzTWluWm9vbWVk
KCkgY29uc3Q7CisgICAgYm9vbCBwaW5jaFpvb21BYm91dFBvaW50KGRvdWJsZSBzY2FsZSwgaW50
IHgsIGludCB5KTsKKworICAgIGJvb2wgaXNVc2VyU2NhbGFibGUoKSBjb25zdDsKKyAgICBkb3Vi
bGUgY3VycmVudFNjYWxlKCkgY29uc3Q7CisgICAgZG91YmxlIGluaXRpYWxTY2FsZSgpIGNvbnN0
OworICAgIGRvdWJsZSB6b29tVG9GaXRTY2FsZSgpIGNvbnN0OworICAgIHZvaWQgc2V0SW5pdGlh
bFNjYWxlKGRvdWJsZSk7CisgICAgZG91YmxlIG1pbmltdW1TY2FsZSgpIGNvbnN0OworICAgIHZv
aWQgc2V0TWluaW11bVNjYWxlKGRvdWJsZSk7CisgICAgZG91YmxlIG1heGltdW1TY2FsZSgpIGNv
bnN0OworICAgIHZvaWQgc2V0TWF4aW11bVNjYWxlKGRvdWJsZSk7CisKKyAgICB2b2lkIGFzc2ln
bkZvY3VzKFBsYXRmb3JtOjpGb2N1c0RpcmVjdGlvbik7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVj
dCBmb2N1c05vZGVSZWN0KCk7CisKKyAgICB2b2lkIHNldEZvY3VzZWQoYm9vbCk7CisKKyAgICB2
b2lkIGNsZWFyQnJvd3NpbmdEYXRhKCk7CisgICAgdm9pZCBjbGVhckhpc3RvcnkoKTsKKyAgICB2
b2lkIGNsZWFyQ29va2llcygpOworICAgIHZvaWQgY2xlYXJDYWNoZSgpOworICAgIHZvaWQgY2xl
YXJMb2NhbFN0b3JhZ2UoKTsKKworICAgIHZvaWQgcnVuTGF5b3V0VGVzdHMoKTsKKworICAgICAv
LyBGaW5kcyBhbmQgc2VsZWN0cyB0aGUgbmV4dCB1dGY4IHN0cmluZyB0aGF0IGlzIGEgY2FzZSBz
ZW5zaXRpdmUKKyAgICAgLy8gbWF0Y2ggaW4gdGhlIHdlYiBwYWdlLiBJdCB3aWxsIHdyYXAgdGhl
IHdlYiBwYWdlIGlmIGl0IHJlYWNoZXMKKyAgICAgLy8gdGhlIGVuZC4gQW4gZW1wdHkgc3RyaW5n
IHdpbGwgcmVzdWx0IGluIG5vIG1hdGNoIGFuZCBubyBzZWxlY3Rpb24uCisgICAgIC8vIFJldHVy
bnMgdHJ1ZSBpZiB0aGUgc3RyaW5nIG1hdGNoZWQgYW5kIGZhbHNlIGlmIG5vdC4KKyAgICBib29s
IGZpbmROZXh0U3RyaW5nKGNvbnN0IGNoYXIqLCBib29sIGZvcndhcmQgPSB0cnVlKTsKKworICAg
IC8vIEphdmFTY3JpcHREZWJ1Z2dlciBpbnRlcmZhY2UuCisgICAgYm9vbCBlbmFibGVTY3JpcHRE
ZWJ1Z2dlcigpOworICAgIGJvb2wgZGlzYWJsZVNjcmlwdERlYnVnZ2VyKCk7CisKKyAgICBKU0Nv
bnRleHRSZWYgc2NyaXB0Q29udGV4dCgpIGNvbnN0OworICAgIEpTVmFsdWVSZWYgd2luZG93T2Jq
ZWN0KCkgY29uc3Q7CisKKyNpZiBkZWZpbmVkKEVOQUJMRV9XRUJET00pICYmIEVOQUJMRV9XRUJE
T00KKyAgICBXZWJET01Eb2N1bWVudCBkb2N1bWVudCgpIGNvbnN0OworI2VuZGlmCisKKyAgICB2
b2lkIGFkZEJyZWFrcG9pbnQoY29uc3QgdW5zaWduZWQgc2hvcnQqIHVybCwgdW5zaWduZWQgdXJs
TGVuZ3RoLCBpbnQgbGluZU51bWJlciwgY29uc3QgdW5zaWduZWQgc2hvcnQqIGNvbmRpdGlvbiwg
dW5zaWduZWQgY29uZGl0aW9uTGVuZ3RoKTsKKyAgICB2b2lkIHVwZGF0ZUJyZWFrcG9pbnQoY29u
c3QgdW5zaWduZWQgc2hvcnQqIHVybCwgdW5zaWduZWQgdXJsTGVuZ3RoLCBpbnQgbGluZU51bWJl
ciwgY29uc3QgdW5zaWduZWQgc2hvcnQqIGNvbmRpdGlvbiwgdW5zaWduZWQgY29uZGl0aW9uTGVu
Z3RoKTsKKyAgICB2b2lkIHJlbW92ZUJyZWFrcG9pbnQoY29uc3QgdW5zaWduZWQgc2hvcnQqIHVy
bCwgdW5zaWduZWQgdXJsTGVuZ3RoLCBpbnQgbGluZU51bWJlcik7CisKKyAgICBib29sIHBhdXNl
T25FeGNlcHRpb25zKCk7CisgICAgdm9pZCBzZXRQYXVzZU9uRXhjZXB0aW9ucyhib29sKTsKKwor
ICAgIHZvaWQgcGF1c2VJbkRlYnVnZ2VyKCk7CisgICAgdm9pZCByZXN1bWVEZWJ1Z2dlcigpOwor
CisgICAgdm9pZCBzdGVwT3ZlclN0YXRlbWVudEluRGVidWdnZXIoKTsKKyAgICB2b2lkIHN0ZXBJ
bnRvU3RhdGVtZW50SW5EZWJ1Z2dlcigpOworICAgIHZvaWQgc3RlcE91dE9mRnVuY3Rpb25JbkRl
YnVnZ2VyKCk7CisKKyAgICB1bnNpZ25lZCB0aW1lb3V0Rm9ySmF2YVNjcmlwdEV4ZWN1dGlvbigp
IGNvbnN0OworICAgIHZvaWQgc2V0VGltZW91dEZvckphdmFTY3JpcHRFeGVjdXRpb24odW5zaWdu
ZWQgbXMpOworCisgICAgdm9pZCBzZXRDYXJldEhpZ2hsaWdodFN0eWxlKFBsYXRmb3JtOjpDYXJl
dEhpZ2hsaWdodFN0eWxlKTsKKworICAgIC8vIElNRiBmdW5jdGlvbnMuCisgICAgYm9vbCBzZXRC
YXRjaEVkaXRpbmdBY3RpdmUoYm9vbCk7CisgICAgYm9vbCBzZXRJbnB1dFNlbGVjdGlvbih1bnNp
Z25lZCBzdGFydCwgdW5zaWduZWQgZW5kKTsKKyAgICBpbnQgaW5wdXRDYXJldFBvc2l0aW9uKCkg
Y29uc3Q7CisgICAgYm9vbCBkZWxldGVUZXh0UmVsYXRpdmVUb0N1cnNvcih1bnNpZ25lZCBsZWZ0
T2Zmc2V0LCB1bnNpZ25lZCByaWdodE9mZnNldCk7CisgICAgc3Bhbm5hYmxlX3N0cmluZ190KiBz
ZWxlY3RlZFRleHQoaW50MzJfdCBmbGFncyk7CisgICAgc3Bhbm5hYmxlX3N0cmluZ190KiB0ZXh0
QmVmb3JlQ3Vyc29yKGludDMyX3QgbGVuZ3RoLCBpbnQzMl90IGZsYWdzKTsKKyAgICBzcGFubmFi
bGVfc3RyaW5nX3QqIHRleHRBZnRlckN1cnNvcihpbnQzMl90IGxlbmd0aCwgaW50MzJfdCBmbGFn
cyk7CisgICAgZXh0cmFjdGVkX3RleHRfdCogZXh0cmFjdGVkVGV4dFJlcXVlc3QoZXh0cmFjdGVk
X3RleHRfcmVxdWVzdF90KiwgaW50MzJfdCBmbGFncyk7CisgICAgaW50MzJfdCBzZXRDb21wb3Np
bmdSZWdpb24oaW50MzJfdCBzdGFydCwgaW50MzJfdCBlbmQpOworICAgIGludDMyX3QgZmluaXNo
Q29tcG9zaXRpb24oKTsKKyAgICBpbnQzMl90IHNldENvbXBvc2luZ1RleHQoc3Bhbm5hYmxlX3N0
cmluZ190KiwgaW50MzJfdCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uKTsKKyAgICBpbnQzMl90IGNv
bW1pdFRleHQoc3Bhbm5hYmxlX3N0cmluZ190KiwgaW50MzJfdCByZWxhdGl2ZUN1cnNvclBvc2l0
aW9uKTsKKworICAgIHZvaWQgc2V0U3BlbGxjaGVja2luZ0VuYWJsZWQoYm9vbCk7CisKKyAgICB2
b2lkIHNldFNlbGVjdGlvbihjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIHN0YXJ0UG9pbnQsIGNv
bnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgZW5kUG9pbnQpOworICAgIHZvaWQgc2V0Q2FyZXRQb3Np
dGlvbihjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmKTsKKyAgICB2b2lkIHNlbGVjdEF0UG9pbnQo
Y29uc3QgUGxhdGZvcm06OkludFBvaW50Jik7CisgICAgdm9pZCBzZWxlY3Rpb25DYW5jZWxsZWQo
KTsKKyAgICBib29sIHNlbGVjdGlvbkNvbnRhaW5zKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYp
OworCisgICAgdm9pZCBwb3B1cExpc3RDbG9zZWQoaW50IHNpemUsIGJvb2wqIHNlbGVjdGVkcyk7
CisgICAgdm9pZCBwb3B1cExpc3RDbG9zZWQoaW50IGluZGV4KTsKKyAgICB2b2lkIHNldERhdGVU
aW1lSW5wdXQoY29uc3QgV2ViU3RyaW5nJiB2YWx1ZSk7CisgICAgdm9pZCBzZXRDb2xvcklucHV0
KGNvbnN0IFdlYlN0cmluZyYgdmFsdWUpOworCisgICAgdm9pZCBvbklucHV0TG9jYWxlQ2hhbmdl
ZChib29sIGlzUlRMKTsKKyAgICBzdGF0aWMgdm9pZCBvbk5ldHdvcmtBdmFpbGFiaWxpdHlDaGFu
Z2VkKGJvb2wgYXZhaWxhYmxlKTsKKyAgICBzdGF0aWMgdm9pZCBvbkNlcnRpZmljYXRlU3RvcmVM
b2NhdGlvblNldChjb25zdCBXZWJTdHJpbmcmIGNhUGF0aCk7CisKKyAgICBXZWJTdHJpbmcgdGV4
dEhhc0F0dHJpYnV0ZShjb25zdCBXZWJTdHJpbmcmIHF1ZXJ5KSBjb25zdDsKKworICAgIEFjdGl2
ZU5vZGVDb250ZXh0IGFjdGl2ZU5vZGVDb250ZXh0KFRhcmdldERldGVjdGlvblN0cmF0ZWd5KSBj
b25zdDsKKworICAgIHR5cGVkZWYgaW50cHRyX3QgQmFja0ZvcndhcmRJZDsKKyAgICBzdHJ1Y3Qg
QmFja0ZvcndhcmRFbnRyeSB7CisgICAgICAgIFdlYlN0cmluZyB1cmw7CisgICAgICAgIFdlYlN0
cmluZyBvcmlnaW5hbFVybDsKKyAgICAgICAgV2ViU3RyaW5nIHRpdGxlOworICAgICAgICBXZWJT
dHJpbmcgbmV0d29ya1Rva2VuOworICAgICAgICBCYWNrRm9yd2FyZElkIGlkOworICAgICAgICBi
b29sIGxhc3RWaXNpdFdhc0hUVFBOb25HZXQ7CisgICAgfTsKKworICAgIGJvb2wgY2FuR29CYWNr
T3JGb3J3YXJkKGludCBkZWx0YSkgY29uc3Q7CisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aGVy
ZSBpcyBubyBwYWdlIGZvciB0aGUgZ2l2ZW4gZGVsdGEgKGVnLgorICAgIC8vIGF0dGVtcHQgdG8g
Z28gYmFjayB3aXRoIC0xIHdoZW4gb24gdGhlIGZpcnN0IHBhZ2UpLgorICAgIGJvb2wgZ29CYWNr
T3JGb3J3YXJkKGludCBkZWx0YSk7CisgICAgdm9pZCBnb1RvQmFja0ZvcndhcmRFbnRyeShCYWNr
Rm9yd2FyZElkKTsKKworICAgIGludCBiYWNrRm9yd2FyZExpc3RMZW5ndGgoKSBjb25zdDsKKyAg
ICB2b2lkIGdldEJhY2tGb3J3YXJkTGlzdChTaGFyZWRBcnJheTxCYWNrRm9yd2FyZEVudHJ5PiYg
cmVzdWx0LCB1bnNpZ25lZCYgcmVzdWx0TGVuZ3RoKSBjb25zdDsKKyAgICB2b2lkIHJlbGVhc2VC
YWNrRm9yd2FyZEVudHJ5KEJhY2tGb3J3YXJkSWQpIGNvbnN0OworICAgIHZvaWQgY2xlYXJCYWNr
Rm9yd2FyZExpc3QoYm9vbCBrZWVwQ3VycmVudFBhZ2UpIGNvbnN0OworCisgICAgdm9pZCBhZGRW
aXNpdGVkTGluayhjb25zdCB1bnNpZ25lZCBzaG9ydCogdXJsLCB1bnNpZ25lZCBsZW5ndGgpOwor
CisjaWYgZGVmaW5lZChFTkFCTEVfV0VCRE9NKSAmJiBFTkFCTEVfV0VCRE9NCisgICAgV2ViRE9N
Tm9kZSBub2RlQXRQb2ludChpbnQgeCwgaW50IHkpOworICAgIGJvb2wgZ2V0Tm9kZVJlY3QoY29u
c3QgV2ViRE9NTm9kZSYsIFBsYXRmb3JtOjpJbnRSZWN0JiByZXN1bHQpOworICAgIGJvb2wgc2V0
Tm9kZUZvY3VzKGNvbnN0IFdlYkRPTU5vZGUmLCBib29sIG9uKTsKKyAgICBib29sIHNldE5vZGVI
b3ZlcmVkKGNvbnN0IFdlYkRPTU5vZGUmLCBib29sIG9uKTsKKyAgICBib29sIG5vZGVIYXNIb3Zl
cihjb25zdCBXZWJET01Ob2RlJik7CisjZW5kaWYKKworICAgIGJvb2wgZGVmZXJzTG9hZGluZygp
IGNvbnN0OworCisgICAgYm9vbCB3aWxsRmlyZVRpbWVyKCk7CisKKyAgICBib29sIGlzRW5hYmxl
TG9jYWxBY2Nlc3NUb0FsbENvb2tpZXMoKSBjb25zdDsKKyAgICB2b2lkIHNldEVuYWJsZUxvY2Fs
QWNjZXNzVG9BbGxDb29raWVzKGJvb2wpOworCisgICAgdm9pZCBlbmFibGVXZWJJbnNwZWN0b3Io
KTsKKyAgICB2b2lkIGRpc2FibGVXZWJJbnNwZWN0b3IoKTsKKyAgICB2b2lkIGVuYWJsZVBhc3N3
b3JkRWNobygpOworICAgIHZvaWQgZGlzYWJsZVBhc3N3b3JkRWNobygpOworICAgIHZvaWQgZGlz
cGF0Y2hJbnNwZWN0b3JNZXNzYWdlKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGludCBsZW5ndGgpOwor
ICAgIFdlYkNvcmU6OkZyYW1lKiBtYWluRnJhbWUoKSBjb25zdDsKKworICAgIC8vIEZJWE1FOiBO
ZWVkcyBBUEkgcmV2aWV3IG9uIHRoaXMgaGVhZGVyLiBTZWUgUFIgIzEyMDQwMi4KKyAgICB2b2lk
IG5vdGlmeVBhZ2VQYXVzZSgpOworICAgIHZvaWQgbm90aWZ5UGFnZVJlc3VtZSgpOworICAgIHZv
aWQgbm90aWZ5UGFnZUJhY2tncm91bmQoKTsKKyAgICB2b2lkIG5vdGlmeVBhZ2VGb3JlZ3JvdW5k
KCk7CisgICAgdm9pZCBub3RpZnlQYWdlRnVsbFNjcmVlbkFsbG93ZWQoKTsKKyAgICB2b2lkIG5v
dGlmeVBhZ2VGdWxsU2NyZWVuRXhpdCgpOworICAgIHZvaWQgbm90aWZ5RGV2aWNlSWRsZVN0YXRl
Q2hhbmdlKGJvb2wgZW50ZXJJZGxlKTsKKyAgICB2b2lkIG5vdGlmeUFwcEFjdGl2YXRpb25TdGF0
ZUNoYW5nZShBY3RpdmF0aW9uU3RhdGVUeXBlKTsKKyAgICB2b2lkIG5vdGlmeVN3aXBlRXZlbnQo
KTsKKyAgICB2b2lkIG5vdGlmeVNjcmVlblBvd2VyU3RhdGVDaGFuZ2VkKGJvb2wgcG93ZXJlZCk7
CisgICAgdm9pZCBub3RpZnlGdWxsU2NyZWVuVmlkZW9FeGl0ZWQoYm9vbCBkb25lKTsKKyAgICB2
b2lkIGNsZWFyUGx1Z2luU2l0ZURhdGEoKTsKKyAgICB2b2lkIHNldFZpcnR1YWxLZXlib2FyZFZp
c2libGUoYm9vbCk7CisgICAgdm9pZCBzZXRKYXZhU2NyaXB0Q2FuQWNjZXNzQ2xpcGJvYXJkKGJv
b2wpOworICAgIGJvb2wgaXNXZWJHTEVuYWJsZWQoKSBjb25zdDsKKyAgICB2b2lkIHNldFdlYkdM
RW5hYmxlZChib29sKTsKKworICAgIHZvaWQgZGVzdHJveVdlYlBhZ2VDb21wb3NpdG9yKCk7CisK
K3ByaXZhdGU6CisgICAgfldlYlBhZ2UoKTsKKworICAgIGZyaWVuZCBjbGFzcyBXZWJLaXQ6OkJh
Y2tpbmdTdG9yZTsKKyAgICBmcmllbmQgY2xhc3MgV2ViS2l0OjpCYWNraW5nU3RvcmVDbGllbnQ7
CisgICAgZnJpZW5kIGNsYXNzIFdlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTsKKyAgICBmcmll
bmQgY2xhc3MgV2ViS2l0OjpSZW5kZXJRdWV1ZTsKKyAgICBmcmllbmQgY2xhc3MgV2ViS2l0OjpX
ZWJQYWdlR3JvdXBMb2FkRGVmZXJyZXI7CisgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OkNocm9t
ZUNsaWVudEJsYWNrQmVycnk7CisgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OkVkaXRvckNsaWVu
dEJsYWNrQmVycnk7CisgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OkZyYW1lTG9hZGVyQ2xpZW50
QmxhY2tCZXJyeTsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6SWNvbkRhdGFiYXNlQ2xpZW50
QmxhY2tCZXJyeTsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6SW5zcGVjdG9yQ2xpZW50Qmxh
Y2tCZXJyeTsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6SmF2YVNjcmlwdERlYnVnZ2VyQmxh
Y2tCZXJyeTsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6R2VvbG9jYXRpb25Db250cm9sbGVy
Q2xpZW50QmxhY2tCZXJyeTsKKyAgICBXZWJQYWdlUHJpdmF0ZSogZDsKK307Cit9Cit9CisKKyNl
bmRpZiAvLyBXZWJQYWdlX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9B
cGkvV2ViUGFnZV9wLmggYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQXBpL1dlYlBhZ2VfcC5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLjY2NzJjMmNkMGY4ZWM0NWU5ZjM2N2MwNWZmZWE2ZTQwM2U5NmY4MjMKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQXBpL1dlYlBhZ2VfcC5o
CkBAIC0wLDAgKzEsNTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDEx
LCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgV2ViUGFnZV9wX2gKKyNkZWZpbmUgV2ViUGFn
ZV9wX2gKKworI2luY2x1ZGUgIkNocm9tZUNsaWVudC5oIgorI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKyNpbmNsdWRlICJMYXllclJlbmRlcmVyLmgiCisjZW5kaWYKKyNpbmNsdWRl
ICJQYWdlQ2xpZW50QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5o
IgorI2luY2x1ZGUgIlNjcmlwdFNvdXJjZUNvZGUuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2lu
Y2x1ZGUgIlZpZXdwb3J0QXJndW1lbnRzLmgiCisjaW5jbHVkZSAiV2ViUGFnZS5oIgorI2luY2x1
ZGUgIldlYlNldHRpbmdzLmgiCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1NZXNzYWdl
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIERPTVdyYXBwZXJXb3JsZDsKK2NsYXNz
IERvY3VtZW50OworY2xhc3MgRnJhbWU7CitjbGFzcyBGcmFtZVZpZXc7CitjbGFzcyBHZW9sb2Nh
dGlvbkNvbnRyb2xsZXJDbGllbnRCbGFja0JlcnJ5OworY2xhc3MgSmF2YVNjcmlwdERlYnVnZ2Vy
QmxhY2tCZXJyeTsKK2NsYXNzIEtVUkw7CitjbGFzcyBOb2RlOworY2xhc3MgUGFnZTsKK2NsYXNz
IFBsdWdpblZpZXc7CitjbGFzcyBSZW5kZXJMYXllcjsKK2NsYXNzIFJlbmRlck9iamVjdDsKK2Ns
YXNzIFNjcm9sbFZpZXc7CitjbGFzcyBUcmFuc2Zvcm1hdGlvbk1hdHJpeDsKK3RlbXBsYXRlPHR5
cGVuYW1lIFQ+IGNsYXNzIFRpbWVyOworfQorCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1l
c3BhY2UgV2ViS2l0IHsKKworY2xhc3MgQmFja2luZ1N0b3JlOworY2xhc3MgQmFja2luZ1N0b3Jl
Q2xpZW50OworY2xhc3MgQmFja2luZ1N0b3JlVGlsZTsKK2NsYXNzIER1bXBSZW5kZXJUcmVlQ2xp
ZW50OworY2xhc3MgSW5QYWdlU2VhcmNoTWFuYWdlcjsKK2NsYXNzIElucHV0SGFuZGxlcjsKK2Ns
YXNzIEluUmVnaW9uU2Nyb2xsYWJsZUFyZWE7CitjbGFzcyBTZWxlY3Rpb25IYW5kbGVyOworY2xh
c3MgVG91Y2hFdmVudEhhbmRsZXI7CitjbGFzcyBXZWJQYWdlQ2xpZW50OworCisjaWYgVVNFKEFD
Q0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorY2xhc3MgRnJhbWVMYXllcnM7CitjbGFzcyBXZWJQYWdl
Q29tcG9zaXRvcjsKKyNlbmRpZgorCisvLyBJbiB0aGUgY2xpZW50IGNvZGUsIHRoZXJlIGlzIHNj
cmVlbiBzaXplIGFuZCB2aWV3cG9ydC4KKy8vIEluIFdlYlBhZ2VQcml2YXRlLCB0aGUgc2NyZWVu
IHNpemUgaXMgY2FsbGVkIHRoZSB0cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSwKKy8vIHRoZSB2aWV3
cG9ydCBwb3NpdGlvbiBpcyBjYWxsZWQgdGhlIHRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24sCisv
LyBhbmQgdGhlIHZpZXdwb3J0IHNpemUgaXMgY2FsbGVkIHRoZSB0cmFuc2Zvcm1lZEFjdHVhbFZp
c2libGVTaXplLgorY2xhc3MgV2ViUGFnZVByaXZhdGUgOiBwdWJsaWMgUGFnZUNsaWVudEJsYWNr
QmVycnksIHB1YmxpYyBXZWJTZXR0aW5nc0RlbGVnYXRlLCBwdWJsaWMgUGxhdGZvcm06Okd1YXJk
ZWRQb2ludGVyQmFzZSB7CitwdWJsaWM6CisgICAgZW51bSBWaWV3TW9kZSB7IE1vYmlsZSwgRGVz
a3RvcCwgRml4ZWREZXNrdG9wIH07CisgICAgZW51bSBMb2FkU3RhdGUgeyBOb25lIC8qIG9uIGlu
c3RhbnRpYXRpb24gb2YgcGFnZSAqLywgUHJvdmlzaW9uYWwsIENvbW1pdHRlZCwgRmluaXNoZWQs
IEZhaWxlZCB9OworCisgICAgV2ViUGFnZVByaXZhdGUoV2ViUGFnZSosIFdlYlBhZ2VDbGllbnQq
LCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0Jik7CisgICAgdmlydHVhbCB+V2ViUGFnZVByaXZhdGUo
KTsKKworICAgIHZvaWQgaW5pdChjb25zdCBXZWJTdHJpbmcmIHBhZ2VHcm91cE5hbWUpOworICAg
IGJvb2wgaGFuZGxlTW91c2VFdmVudChXZWJDb3JlOjpQbGF0Zm9ybU1vdXNlRXZlbnQmKTsKKyAg
ICBib29sIGhhbmRsZVdoZWVsRXZlbnQoV2ViQ29yZTo6UGxhdGZvcm1XaGVlbEV2ZW50Jik7CisK
KyAgICB2b2lkIGxvYWQoY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFyKiBuZXR3b3JrVG9rZW4s
IGNvbnN0IGNoYXIqIG1ldGhvZCwgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpDYWNoZVBvbGlj
eSwgY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IGRhdGFMZW5ndGgsIGNvbnN0IGNoYXIqIGNvbnN0
KiBoZWFkZXJzLCBzaXplX3QgaGVhZGVyc0xlbmd0aCwgYm9vbCBpc0luaXRpYWwsIGJvb2wgbXVz
dEhhbmRsZUludGVybmFsbHkgPSBmYWxzZSwgYm9vbCBmb3JjZURvd25sb2FkID0gZmFsc2UsIGNv
bnN0IGNoYXIqIG92ZXJyaWRlQ29udGVudFR5cGUgPSAiIik7CisgICAgdm9pZCBsb2FkU3RyaW5n
KGNvbnN0IGNoYXIqIHN0cmluZywgY29uc3QgY2hhciogYmFzZVVSTCwgY29uc3QgY2hhciogbWlt
ZVR5cGUsIGNvbnN0IGNoYXIqIGZhaWxpbmdVUkwgPSAwKTsKKyAgICBib29sIGV4ZWN1dGVKYXZh
U2NyaXB0KGNvbnN0IGNoYXIqIHNjcmlwdCwgSmF2YVNjcmlwdERhdGFUeXBlJiByZXR1cm5UeXBl
LCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKTsKKyAgICBib29sIGV4ZWN1dGVKYXZhU2NyaXB0SW5J
c29sYXRlZFdvcmxkKGNvbnN0IFdlYkNvcmU6OlNjcmlwdFNvdXJjZUNvZGUmLCBKYXZhU2NyaXB0
RGF0YVR5cGUmIHJldHVyblR5cGUsIFdlYlN0cmluZyYgcmV0dXJuVmFsdWUpOworCisgICAgdm9p
ZCBzdG9wQ3VycmVudExvYWQoKTsKKyAgICB2b2lkIHByZXBhcmVUb0Rlc3Ryb3koKTsKKworICAg
IExvYWRTdGF0ZSBsb2FkU3RhdGUoKSBjb25zdCB7IHJldHVybiBtX2xvYWRTdGF0ZTsgfQorICAg
IGJvb2wgaXNMb2FkaW5nKCkgY29uc3QgeyByZXR1cm4gbV9sb2FkU3RhdGUgPT0gV2ViUGFnZVBy
aXZhdGU6OlByb3Zpc2lvbmFsIHx8IG1fbG9hZFN0YXRlID09IFdlYlBhZ2VQcml2YXRlOjpDb21t
aXR0ZWQ7IH0KKworICAgIC8vIENhbGxlZCBmcm9tIHdpdGhpbiBXZWJLaXQgdmlhIEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeS4KKyAgICB2b2lkIHNldExvYWRTdGF0ZShMb2FkU3RhdGUpOwor
CisgICAgLy8gQ2xhbXAgdGhlIHNjYWxlLgorICAgIGRvdWJsZSBjbGFtcGVkU2NhbGUoZG91Ymxl
IHNjYWxlKSBjb25zdDsKKworICAgIC8vIERldGVybWluZSBpZiB3ZSBzaG91bGQgem9vbSwgY2xh
bXBpbmcgdGhlIHNjYWxlIHBhcmFtZXRlciBpZiByZXF1aXJlZC4KKyAgICBib29sIHNob3VsZFpv
b21BYm91dFBvaW50KGRvdWJsZSBzY2FsZSwgY29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludCYgYW5j
aG9yLCBib29sIGVuZm9yZVNjYWxlQ2xhbXBpbmcsIGRvdWJsZSogY2xhbXBlZFNjYWxlKTsKKwor
ICAgIC8vIFNjYWxlIHRoZSBwYWdlIHRvIHRoZSBnaXZlbiBzY2FsZSBhbmQgYW5jaG9yIGFib3V0
IHRoZSBwb2ludCB3aGljaCBpcyBzcGVjaWZpZWQgaW4gdW50cmFuc2Zvcm1lZCBjb250ZW50IGNv
b3JkaW5hdGVzLgorICAgIGJvb2wgem9vbUFib3V0UG9pbnQoZG91YmxlIHNjYWxlLCBjb25zdCBX
ZWJDb3JlOjpGbG9hdFBvaW50JiBhbmNob3IsIGJvb2wgZW5mb3JjZVNjYWxlQ2xhbXBpbmcgPSB0
cnVlLCBib29sIGZvcmNlUmVuZGVyaW5nID0gZmFsc2UsIGJvb2wgaXNSZXN0b3Jpbmdab29tTGV2
ZWwgPSBmYWxzZSk7CisgICAgYm9vbCBzY2hlZHVsZVpvb21BYm91dFBvaW50KGRvdWJsZSBzY2Fs
ZSwgY29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludCYgYW5jaG9yLCBib29sIGVuZm9yY2VTY2FsZUNs
YW1waW5nID0gdHJ1ZSwgYm9vbCBmb3JjZVJlbmRlcmluZyA9IGZhbHNlKTsKKyAgICB2b2lkIHVu
c2NoZWR1bGVab29tQWJvdXRQb2ludCgpOworICAgIFdlYkNvcmU6OkludFBvaW50IGNhbGN1bGF0
ZVJlZmxvd2VkU2Nyb2xsUG9zaXRpb24oY29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludCYgYW5jaG9y
T2Zmc2V0LCBkb3VibGUgaW52ZXJzZVNjYWxlKTsKKyAgICB2b2lkIHNldFRleHRSZWZsb3dBbmNo
b3JQb2ludChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIGZvY2FsUG9pbnQpOworCisgICAgdm9p
ZCBzY2hlZHVsZVBpbmNoWm9vbUFib3V0UG9pbnQoZG91YmxlIHNjYWxlLCBjb25zdCBXZWJDb3Jl
OjpJbnRQb2ludCYgYW5jaG9yKTsKKworICAgIC8vIFBlcmZvcm0gYWN0dWFsIHpvb20gZm9yIGJs
b2NrIHpvb20uCisgICAgdm9pZCB6b29tQmxvY2soKTsKKworICAgIC8vIENhbGxlZCBieSB0aGUg
YmFja2luZyBzdG9yZSBhcyB3ZWxsIGFzIHRoZSBtZXRob2QgYmVsb3cuCisgICAgdm9pZCByZXF1
ZXN0TGF5b3V0SWZOZWVkZWQoKSBjb25zdDsKKyAgICB2b2lkIHNldE5lZWRzTGF5b3V0KCk7CisK
KyAgICBXZWJDb3JlOjpJbnRQb2ludCBzY3JvbGxQb3NpdGlvbigpIGNvbnN0OworICAgIFdlYkNv
cmU6OkludFBvaW50IG1heGltdW1TY3JvbGxQb3NpdGlvbigpIGNvbnN0OworICAgIHZvaWQgc2V0
U2Nyb2xsUG9zaXRpb24oY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmKTsKKyAgICBib29sIHNjcm9s
bEJ5KGludCBkZWx0YVgsIGludCBkZWx0YVksIGJvb2wgc2Nyb2xsTWFpbkZyYW1lID0gdHJ1ZSk7
CisKKyAgICB2b2lkIGVucXVldWVSZW5kZXJpbmdPZkNsaXBwZWRDb250ZW50T2ZTY3JvbGxhYmxl
Tm9kZUFmdGVySW5SZWdpb25TY3JvbGxpbmcoV2ViQ29yZTo6Tm9kZSopOworICAgIHN0ZDo6dmVj
dG9yPFBsYXRmb3JtOjpTY3JvbGxWaWV3QmFzZT4gaW5SZWdpb25TY3JvbGxhYmxlQXJlYXNGb3JQ
b2ludChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmKTsKKyAgICB2b2lkIG5vdGlmeUluUmVnaW9u
U2Nyb2xsU3RhdHVzQ2hhbmdlZChib29sIHN0YXR1cyk7CisgICAgdm9pZCBzZXRTY3JvbGxPcmln
aW5Qb2ludChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmKTsKKyAgICB2b2lkIHNldEhhc0luUmVn
aW9uU2Nyb2xsYWJsZUFyZWFzKGJvb2wpOworCisgICAgLy8gVGhlIGFjdHVhbCB2aXNpYmxlIHNp
emUgYXMgcmVwb3J0ZWQgYnkgdGhlIGNsaWVudCwgYnV0IGluIFdlYktpdCBjb29yZGluYXRlcy4K
KyAgICBXZWJDb3JlOjpJbnRTaXplIGFjdHVhbFZpc2libGVTaXplKCkgY29uc3Q7CisKKyAgICAv
LyBUaGUgdmlld3BvcnQgc2l6ZSBpcyB0aGUgc2FtZSBhcyB0aGUgY2xpZW50J3Mgd2luZG93IHNp
emUsIGJ1dCBpbiB3ZWJraXQgY29vcmRpbmF0ZXMuCisgICAgV2ViQ29yZTo6SW50U2l6ZSB2aWV3
cG9ydFNpemUoKSBjb25zdDsKKworICAgIC8vIE1vZGlmaWVzIHRoZSB6b29tVG9GaXQgYWxnb3Jp
dGhtIGxvZ2ljIHRvIGNvbnN0cnVjdCBhIHNjYWxlIHN1Y2ggdGhhdCB0aGUgdmlld3BvcnRTaXpl
IGFib3ZlIGlzIGVxdWFsIHRvIHRoaXMgc2l6ZS4KKyAgICBib29sIGhhc1ZpcnR1YWxWaWV3cG9y
dCgpIGNvbnN0OworICAgIGJvb2wgaXNVc2VyU2NhbGFibGUoKSBjb25zdCB7IHJldHVybiBtX3Vz
ZXJTY2FsYWJsZTsgfQorICAgIHZvaWQgc2V0VXNlclNjYWxhYmxlKGJvb2wgdXNlclNjYWxhYmxl
KSB7IG1fdXNlclNjYWxhYmxlID0gdXNlclNjYWxhYmxlOyB9CisKKyAgICAvLyBTZXRzIGRlZmF1
bHQgbGF5b3V0IHNpemUgd2l0aG91dCBkb2luZyBsYXlvdXQgb3IgbWFya2luZyBhcyBuZWVkaW5n
IGxheW91dC4KKyAgICB2b2lkIHNldERlZmF1bHRMYXlvdXRTaXplKGNvbnN0IFdlYkNvcmU6Oklu
dFNpemUmKTsKKworICAgIC8vIFVwZGF0ZXMgV2ViQ29yZSB3aGVuIHRoZSB2aWV3cG9ydFNpemUo
KSBvciBhY3R1YWxWaXNpYmxlU2l6ZSgpIGNoYW5nZS4KKyAgICB2b2lkIHVwZGF0ZVZpZXdwb3J0
U2l6ZShib29sIHNldEZpeGVkUmVwb3J0ZWRTaXplID0gdHJ1ZSwgYm9vbCBzZW5kUmVzaXplRXZl
bnQgPSB0cnVlKTsKKworICAgIFdlYkNvcmU6OkZsb2F0UG9pbnQgY2VudGVyT2ZWaXNpYmxlQ29u
dGVudHNSZWN0KCkgY29uc3Q7CisgICAgV2ViQ29yZTo6SW50UmVjdCB2aXNpYmxlQ29udGVudHNS
ZWN0KCkgY29uc3Q7CisgICAgV2ViQ29yZTo6SW50U2l6ZSBjb250ZW50c1NpemUoKSBjb25zdDsK
KyAgICBXZWJDb3JlOjpJbnRTaXplIGFic29sdXRlVmlzaWJsZU92ZXJmbG93U2l6ZSgpIGNvbnN0
OworCisgICAgLy8gVmlydHVhbCBmdW5jdGlvbnMgaW5oZXJpdGVkIGZyb20gUGFnZUNsaWVudEJs
YWNrQmVycnkuCisgICAgdmlydHVhbCB2b2lkIHNldEN1cnNvcihXZWJDb3JlOjpQbGF0Zm9ybUN1
cnNvckhhbmRsZSk7CisgICAgdmlydHVhbCBQbGF0Zm9ybTo6TmV0d29ya1N0cmVhbUZhY3Rvcnkq
IG5ldHdvcmtTdHJlYW1GYWN0b3J5KCk7CisgICAgdmlydHVhbCBQbGF0Zm9ybTo6R3JhcGhpY3M6
OldpbmRvdyogcGxhdGZvcm1XaW5kb3coKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UHJl
dmVudHNTY3JlZW5EaW1taW5nKGJvb2wgcHJldmVudERpbW1pbmcpOworICAgIHZpcnR1YWwgdm9p
ZCBzaG93VmlydHVhbEtleWJvYXJkKGJvb2wgc2hvd0tleWJvYXJkKTsKKyAgICB2aXJ0dWFsIHZv
aWQgZW5zdXJlQ29udGVudFZpc2libGUoYm9vbCBjZW50ZXJJblZpZXcgPSB0cnVlKTsKKyAgICB2
aXJ0dWFsIHZvaWQgem9vbVRvQ29udGVudFJlY3QoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYpOwor
ICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclBsdWdpbihXZWJDb3JlOjpQbHVnaW5WaWV3KiwgYm9v
bCk7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVBhZ2VPbkxvYWQoKTsKKyAgICB2aXJ0dWFsIGJv
b2wgc2hvdWxkUGx1Z2luRW50ZXJGdWxsU2NyZWVuKFdlYkNvcmU6OlBsdWdpblZpZXcqLCBjb25z
dCBjaGFyKik7CisgICAgdmlydHVhbCB2b2lkIGRpZFBsdWdpbkVudGVyRnVsbFNjcmVlbihXZWJD
b3JlOjpQbHVnaW5WaWV3KiwgY29uc3QgY2hhciopOworICAgIHZpcnR1YWwgdm9pZCBkaWRQbHVn
aW5FeGl0RnVsbFNjcmVlbihXZWJDb3JlOjpQbHVnaW5WaWV3KiwgY29uc3QgY2hhciopOworICAg
IHZpcnR1YWwgdm9pZCBvblBsdWdpblN0YXJ0QmFja2dyb3VuZFBsYXkoV2ViQ29yZTo6UGx1Z2lu
VmlldyosIGNvbnN0IGNoYXIqKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25QbHVnaW5TdG9wQmFja2dy
b3VuZFBsYXkoV2ViQ29yZTo6UGx1Z2luVmlldyosIGNvbnN0IGNoYXIqKTsKKyAgICB2aXJ0dWFs
IGJvb2wgbG9ja09yaWVudGF0aW9uKGJvb2wgbGFuZHNjYXBlKTsKKyAgICB2aXJ0dWFsIHZvaWQg
dW5sb2NrT3JpZW50YXRpb24oKTsKKyAgICB2aXJ0dWFsIGludCBvcmllbnRhdGlvbigpIGNvbnN0
OworICAgIHZpcnR1YWwgZG91YmxlIGN1cnJlbnRab29tRmFjdG9yKCkgY29uc3Q7CisgICAgdmly
dHVhbCBpbnQgc2hvd0FsZXJ0RGlhbG9nKFdlYlBhZ2VDbGllbnQ6OkFsZXJ0VHlwZSBhdHlwZSk7
CisgICAgdmlydHVhbCBib29sIGlzQWN0aXZlKCkgY29uc3Q7CisKKyAgICAvLyBDYWxsZWQgZnJv
bSB3aXRoaW4gV2ViS2l0IHZpYSBDaHJvbWVDbGllbnRCbGFja0JlcnJ5LgorICAgIHZvaWQgZW50
ZXJGdWxsc2NyZWVuRm9yTm9kZShXZWJDb3JlOjpOb2RlKik7CisgICAgdm9pZCBleGl0RnVsbHNj
cmVlbkZvck5vZGUoV2ViQ29yZTo6Tm9kZSopOworICAgIHZvaWQgY29udGVudHNTaXplQ2hhbmdl
ZChjb25zdCBXZWJDb3JlOjpJbnRTaXplJik7CisgICAgdm9pZCBvdmVyZmxvd0V4Y2VlZHNDb250
ZW50c1NpemUoKTsKKyAgICB2b2lkIGxheW91dEZpbmlzaGVkKCk7CisgICAgdm9pZCBzZXROZWVk
VG91Y2hFdmVudHMoYm9vbCk7CisKKyAgICAvLyBDYWxsZWQgYWNjb3JkaW5nIHRvIG91ciBoZXVy
aXN0aWMgb3IgZnJvbSBzZXRMb2FkU3RhdGUgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgaGF2ZSBh
IHZpcnR1YWwgdmlld3BvcnQuCisgICAgdm9pZCB6b29tVG9Jbml0aWFsU2NhbGVPbkxvYWQoKTsK
KworICAgIC8vIFZhcmlvdXMgc2NhbGUgZmFjdG9ycy4KKyAgICBkb3VibGUgY3VycmVudFNjYWxl
KCkgY29uc3Q7CisgICAgZG91YmxlIHpvb21Ub0ZpdFNjYWxlKCkgY29uc3Q7CisgICAgZG91Ymxl
IGluaXRpYWxTY2FsZSgpIGNvbnN0OworICAgIHZvaWQgc2V0SW5pdGlhbFNjYWxlKGRvdWJsZSBz
Y2FsZSkgeyBtX2luaXRpYWxTY2FsZSA9IHNjYWxlOyB9CisgICAgZG91YmxlIG1pbmltdW1TY2Fs
ZSgpIGNvbnN0OworICAgIHZvaWQgc2V0TWluaW11bVNjYWxlKGRvdWJsZSBzY2FsZSkgeyBtX21p
bmltdW1TY2FsZSA9IHNjYWxlOyB9CisgICAgZG91YmxlIG1heGltdW1TY2FsZSgpIGNvbnN0Owor
ICAgIHZvaWQgc2V0TWF4aW11bVNjYWxlKGRvdWJsZSBzY2FsZSkgeyBtX21heGltdW1TY2FsZSA9
IHNjYWxlOyB9CisgICAgdm9pZCByZXNldFNjYWxlcygpOworCisgICAgLy8gTm90ZTogdG8gbWFr
ZSB0aGlzIHJlZmxvdyB3aWR0aCB0cmFuc2Zvcm0gaW52YXJpYW50IGp1c3QgdXNlCisgICAgLy8g
dHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSgpIGhlcmUgaW5zdGVhZCEKKyAgICBpbnQgcmVm
bG93V2lkdGgoKSBjb25zdCB7IHJldHVybiBhY3R1YWxWaXNpYmxlU2l6ZSgpLndpZHRoKCk7IH0K
KworICAgIC8vIFRoZXNlIG1ldGhvZHMgZ2l2ZSB0aGUgcmVhbCBnZW9tZXRyeSBvZiB0aGUgZGV2
aWNlIGdpdmVuIHRoZSBjdXJyZW50bHkgc2V0IHRyYW5zZm9ybS4KKyAgICBXZWJDb3JlOjpJbnRQ
b2ludCB0cmFuc2Zvcm1lZFNjcm9sbFBvc2l0aW9uKCkgY29uc3Q7CisgICAgV2ViQ29yZTo6SW50
UG9pbnQgdHJhbnNmb3JtZWRNYXhpbXVtU2Nyb2xsUG9zaXRpb24oKSBjb25zdDsKKyAgICBXZWJD
b3JlOjpJbnRTaXplIHRyYW5zZm9ybWVkQWN0dWFsVmlzaWJsZVNpemUoKSBjb25zdDsKKyAgICBX
ZWJDb3JlOjpJbnRTaXplIHRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCkgY29uc3Q7CisgICAgV2Vi
Q29yZTo6SW50UmVjdCB0cmFuc2Zvcm1lZFZpc2libGVDb250ZW50c1JlY3QoKSBjb25zdDsKKyAg
ICBXZWJDb3JlOjpJbnRTaXplIHRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkgY29uc3Q7CisKKyAg
ICAvLyBHZW5lcmljIGNvbnZlcnNpb25zIG9mIHBvaW50cywgcmVjdHMsIHJlbGF0aXZlIHRvIGFu
ZCBmcm9tIGNvbnRlbnRzIGFuZCB2aWV3cG9ydC4KKyAgICBXZWJDb3JlOjpJbnRQb2ludCBtYXBG
cm9tQ29udGVudHNUb1ZpZXdwb3J0KGNvbnN0IFdlYkNvcmU6OkludFBvaW50JikgY29uc3Q7Cisg
ICAgV2ViQ29yZTo6SW50UG9pbnQgbWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyhjb25zdCBXZWJD
b3JlOjpJbnRQb2ludCYpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFJlY3QgbWFwRnJvbUNvbnRl
bnRzVG9WaWV3cG9ydChjb25zdCBXZWJDb3JlOjpJbnRSZWN0JikgY29uc3Q7CisgICAgV2ViQ29y
ZTo6SW50UmVjdCBtYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKGNvbnN0IFdlYkNvcmU6OkludFJl
Y3QmKSBjb25zdDsKKworICAgIC8vIEdlbmVyaWMgY29udmVyc2lvbnMgb2YgcG9pbnRzLCByZWN0
cywgcmVsYXRpdmUgdG8gYW5kIGZyb20gdHJhbnNmb3JtZWQgY29udGVudHMgYW5kIHRyYW5zZm9y
bWVkIHZpZXdwb3J0LgorICAgIFdlYkNvcmU6OkludFBvaW50IG1hcEZyb21UcmFuc2Zvcm1lZENv
bnRlbnRzVG9UcmFuc2Zvcm1lZFZpZXdwb3J0KGNvbnN0IFdlYkNvcmU6OkludFBvaW50JikgY29u
c3Q7CisgICAgV2ViQ29yZTo6SW50UG9pbnQgbWFwRnJvbVRyYW5zZm9ybWVkVmlld3BvcnRUb1Ry
YW5zZm9ybWVkQ29udGVudHMoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmKSBjb25zdDsKKyAgICBX
ZWJDb3JlOjpJbnRSZWN0IG1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9UcmFuc2Zvcm1lZFZp
ZXdwb3J0KGNvbnN0IFdlYkNvcmU6OkludFJlY3QmKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRS
ZWN0IG1hcEZyb21UcmFuc2Zvcm1lZFZpZXdwb3J0VG9UcmFuc2Zvcm1lZENvbnRlbnRzKGNvbnN0
IFdlYkNvcmU6OkludFJlY3QmKSBjb25zdDsKKworICAgIC8vIEdlbmVyaWMgY29udmVyc2lvbnMg
b2YgcG9pbnRzLCByZWN0cywgYW5kIHNpemVzIHRvIGFuZCBmcm9tIHRyYW5zZm9ybWVkIGNvb3Jk
aW5hdGVzLgorICAgIFdlYkNvcmU6OkludFBvaW50IG1hcFRvVHJhbnNmb3JtZWQoY29uc3QgV2Vi
Q29yZTo6SW50UG9pbnQmKSBjb25zdDsKKyAgICBXZWJDb3JlOjpGbG9hdFBvaW50IG1hcFRvVHJh
bnNmb3JtZWRGbG9hdFBvaW50KGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQmKSBjb25zdDsKKyAg
ICBXZWJDb3JlOjpJbnRQb2ludCBtYXBGcm9tVHJhbnNmb3JtZWQoY29uc3QgV2ViQ29yZTo6SW50
UG9pbnQmKSBjb25zdDsKKyAgICBXZWJDb3JlOjpGbG9hdFBvaW50IG1hcEZyb21UcmFuc2Zvcm1l
ZEZsb2F0UG9pbnQoY29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludCYpIGNvbnN0OworICAgIFdlYkNv
cmU6OkZsb2F0UmVjdCBtYXBGcm9tVHJhbnNmb3JtZWRGbG9hdFJlY3QoY29uc3QgV2ViQ29yZTo6
RmxvYXRSZWN0JikgY29uc3Q7CisgICAgV2ViQ29yZTo6SW50U2l6ZSBtYXBUb1RyYW5zZm9ybWVk
KGNvbnN0IFdlYkNvcmU6OkludFNpemUmKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRTaXplIG1h
cEZyb21UcmFuc2Zvcm1lZChjb25zdCBXZWJDb3JlOjpJbnRTaXplJikgY29uc3Q7CisgICAgV2Vi
Q29yZTo6SW50UmVjdCBtYXBUb1RyYW5zZm9ybWVkKGNvbnN0IFdlYkNvcmU6OkludFJlY3QmKSBj
b25zdDsKKyAgICB2b2lkIGNsaXBUb1RyYW5zZm9ybWVkQ29udGVudHNSZWN0KFdlYkNvcmU6Oklu
dFJlY3QmKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IG1hcEZyb21UcmFuc2Zvcm1lZChj
b25zdCBXZWJDb3JlOjpJbnRSZWN0JikgY29uc3Q7CisgICAgYm9vbCB0cmFuc2Zvcm1lZFBvaW50
RXF1YWxzVW50cmFuc2Zvcm1lZFBvaW50KGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiB0cmFuc2Zv
cm1lZFBvaW50LCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgdW50cmFuc2Zvcm1lZFBvaW50KTsK
KworICAgIC8vIE5vdGlmaWNhdGlvbiBtZXRob2RzIHRoYXQgZGVsaXZlciBjaGFuZ2VzIHRvIHRo
ZSByZWFsIGdlb21ldHJ5IG9mIHRoZSBkZXZpY2UgYXMgc3BlY2lmaWVkIGFib3ZlLgorICAgIHZv
aWQgbm90aWZ5VHJhbnNmb3JtQ2hhbmdlZCgpOworICAgIHZvaWQgbm90aWZ5VHJhbnNmb3JtZWRD
b250ZW50c1NpemVDaGFuZ2VkKCk7CisgICAgdm9pZCBub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENo
YW5nZWQoKTsKKworICAgIHZvaWQgYXNzaWduRm9jdXMoUGxhdGZvcm06OkZvY3VzRGlyZWN0aW9u
KTsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBmb2N1c05vZGVSZWN0KCk7CisgICAgV2ViQ29yZTo6
SW50UmVjdCBnZXRSZWN1cnNpdmVWaXNpYmxlV2luZG93UmVjdChXZWJDb3JlOjpTY3JvbGxWaWV3
KiwgYm9vbCBub0NsaXBPZk1haW5GcmFtZSA9IGZhbHNlKTsKKworICAgIFdlYkNvcmU6OkludFBv
aW50IGZyYW1lT2Zmc2V0KGNvbnN0IFdlYkNvcmU6OkZyYW1lKikgY29uc3Q7CisKKyAgICBXZWJD
b3JlOjpOb2RlKiBiZXN0Tm9kZUZvclpvb21VbmRlclBvaW50KGNvbnN0IFdlYkNvcmU6OkludFBv
aW50Jik7CisgICAgV2ViQ29yZTo6Tm9kZSogYmVzdENoaWxkTm9kZUZvckNsaWNrUmVjdChXZWJD
b3JlOjpOb2RlKiBwYXJlbnROb2RlLCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBjbGlja1JlY3Qp
OworICAgIFdlYkNvcmU6Ok5vZGUqIG5vZGVGb3Jab29tVW5kZXJQb2ludChjb25zdCBXZWJDb3Jl
OjpJbnRQb2ludCYpOworICAgIFdlYkNvcmU6Ok5vZGUqIGFkanVzdGVkQmxvY2tab29tTm9kZUZv
clpvb21MaW1pdHMoV2ViQ29yZTo6Tm9kZSopOworICAgIFdlYkNvcmU6OkludFJlY3QgcmVjdEZv
ck5vZGUoV2ViQ29yZTo6Tm9kZSopOworICAgIFdlYkNvcmU6OkludFJlY3QgYmxvY2tab29tUmVj
dEZvck5vZGUoV2ViQ29yZTo6Tm9kZSopOworICAgIFdlYkNvcmU6OkludFJlY3QgYWRqdXN0UmVj
dE9mZnNldEZvckZyYW1lT2Zmc2V0KGNvbnN0IFdlYkNvcmU6OkludFJlY3QmLCBjb25zdCBXZWJD
b3JlOjpOb2RlKik7CisgICAgYm9vbCBjb21wYXJlTm9kZXNGb3JCbG9ja1pvb20oV2ViQ29yZTo6
Tm9kZSogbjEsIFdlYkNvcmU6Ok5vZGUqIG4yKTsKKyAgICBkb3VibGUgbmV3U2NhbGVGb3JCbG9j
a1pvb21SZWN0KGNvbnN0IFdlYkNvcmU6OkludFJlY3QmLCBkb3VibGUgb2xkU2NhbGUsIGRvdWJs
ZSBtYXJnaW4pOworICAgIGRvdWJsZSBtYXhCbG9ja1pvb21TY2FsZSgpIGNvbnN0OworCisgICAg
Ly8gUGx1Z2luIE1ldGhvZHMuCisgICAgdm9pZCBub3RpZnlQbHVnaW5SZWN0Q2hhbmdlZChpbnQg
aWQsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIHJlY3RDaGFuZ2VkKTsKKworICAgIC8vIENvbnRl
eHQgTWV0aG9kcy4KKyAgICBBY3RpdmVOb2RlQ29udGV4dCBhY3RpdmVOb2RlQ29udGV4dChUYXJn
ZXREZXRlY3Rpb25TdHJhdGVneSk7CisgICAgUGFzc1JlZlB0cjxXZWJDb3JlOjpOb2RlPiBjb250
ZXh0Tm9kZShUYXJnZXREZXRlY3Rpb25TdHJhdGVneSk7CisKKyNpZiBFTkFCTEUoVklFV1BPUlRf
UkVGTE9XKQorICAgIHZvaWQgdG9nZ2xlVGV4dFJlZmxvd0lmRW5hYmxlZEZvckJsb2NrWm9vbU9u
bHkoYm9vbCBzaG91bGRFbmFibGVUZXh0UmVmbG93ID0gZmFsc2UpOworI2VuZGlmCisKKyAgICB2
b2lkIHNlbGVjdGlvbkNoYW5nZWQoV2ViQ29yZTo6RnJhbWUqKTsKKworICAgIHZvaWQgdXBkYXRl
RGVsZWdhdGVkT3ZlcmxheXMoYm9vbCBkaXNwYXRjaGVkID0gZmFsc2UpOworCisgICAgdm9pZCB1
cGRhdGVDdXJzb3IoKTsKKworICAgIHZvaWQgb25JbnB1dExvY2FsZUNoYW5nZWQoYm9vbCBpc1JU
TCk7CisKKyAgICBWaWV3TW9kZSB2aWV3TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fdmlld01vZGU7
IH0KKyAgICBib29sIHNldFZpZXdNb2RlKFZpZXdNb2RlKTsgLy8gUmV0dXJucyB0cnVlIGlmIHRo
ZSBjaGFuZ2UgcmVxdWlyZXMgcmUtbGF5b3V0LgorCisgICAgdm9pZCBzZXRTaG91bGRVc2VGaXhl
ZERlc2t0b3BNb2RlKGJvb2wgYikgeyBtX3Nob3VsZFVzZUZpeGVkRGVza3RvcE1vZGUgPSBiOyB9
CisKKyAgICBib29sIHVzZUZpeGVkTGF5b3V0KCkgY29uc3Q7CisgICAgV2ViQ29yZTo6SW50U2l6
ZSBmaXhlZExheW91dFNpemUoYm9vbCBzbmFwVG9JbmNyZW1lbnQgPSBmYWxzZSkgY29uc3Q7CisK
KyAgICAvLyBab29tVG9GaXRPbkxvYWQgY2FuIGxlYWQgdG8gYSBsYXJnZSByZWN1cnNpb24gZGVw
dGggaW4gRnJhbWVWaWV3OjpsYXlvdXQoKSBhcyB3ZSBhdHRlbXB0CisgICAgLy8gdG8gZGV0ZXJt
aW5lIHRoZSB6b29tIHNjYWxlIGZhY3RvciBzbyBhcyB0byBoYXZlIHRoZSBjb250ZW50IG9mIHRo
ZSBwYWdlIGZpdCB3aXRoaW4gdGhlCisgICAgLy8gYXJlYSBvZiB0aGUgZnJhbWUuIEZyb20gb2Jz
ZXJ2YXRpb24sIHdlIGNhbiBiYWlsIG91dCBhZnRlciBhIHJlY3Vyc2lvbiBkZXB0aCBvZiAxMCBh
bmQKKyAgICAvLyBzdGlsbCBoYXZlIHJlYXNvbmFibGUgcmVzdWx0cy4KKyAgICBib29sIGRpZExh
eW91dEV4Y2VlZE1heGltdW1JdGVyYXRpb25zKCkgY29uc3QgeyByZXR1cm4gbV9uZXN0ZWRMYXlv
dXRGaW5pc2hlZENvdW50ID4gMTA7IH0KKworICAgIHZvaWQgY2xlYXJGb2N1c05vZGUoKTsKKyAg
ICBXZWJDb3JlOjpGcmFtZSogZm9jdXNlZE9yTWFpbkZyYW1lKCkgY29uc3Q7CisgICAgV2ViQ29y
ZTo6RnJhbWUqIG1haW5GcmFtZSgpIGNvbnN0OworCisgICAgYm9vbCBzY3JvbGxOb2RlUmVjdXJz
aXZlbHkoV2ViQ29yZTo6Tm9kZSogb3JpZ2luYWxOb2RlLCBjb25zdCBXZWJDb3JlOjpJbnRTaXpl
JiBkZWx0YSk7CisgICAgYm9vbCBzY3JvbGxSZW5kZXJlcihXZWJDb3JlOjpSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyLCBjb25zdCBXZWJDb3JlOjpJbnRTaXplJiBkZWx0YSk7CisgICAgdm9pZCBhZGp1
c3RTY3JvbGxEZWx0YShjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgbWF4T2Zmc2V0LCBjb25zdCBX
ZWJDb3JlOjpJbnRQb2ludCYgY3VycmVudE9mZnNldCwgV2ViQ29yZTo6SW50U2l6ZSYgZGVsdGEp
IGNvbnN0OworCisgICAgYm9vbCBjYW5TY3JvbGxSZW5kZXJCb3goV2ViQ29yZTo6UmVuZGVyQm94
Kik7CisgICAgYm9vbCBjYW5TY3JvbGxJbm5lckZyYW1lKFdlYkNvcmU6OkZyYW1lKikgY29uc3Q7
CisKKyNpZiBFTkFCTEUoRVZFTlRfTU9ERV9NRVRBVEFHUykKKyAgICB2b2lkIGRpZFJlY2VpdmVD
dXJzb3JFdmVudE1vZGUoV2ViQ29yZTo6Q3Vyc29yRXZlbnRNb2RlKTsKKyAgICB2b2lkIGRpZFJl
Y2VpdmVUb3VjaEV2ZW50TW9kZShXZWJDb3JlOjpUb3VjaEV2ZW50TW9kZSk7CisjZW5kaWYKKwor
ICAgIHZvaWQgZGlzcGF0Y2hWaWV3cG9ydFByb3BlcnRpZXNEaWRDaGFuZ2UoY29uc3QgV2ViQ29y
ZTo6Vmlld3BvcnRBcmd1bWVudHMmKTsKKyAgICBXZWJDb3JlOjpJbnRTaXplIHJlY29tcHV0ZVZp
cnR1YWxWaWV3cG9ydEZyb21WaWV3cG9ydEFyZ3VtZW50cygpOworCisgICAgdm9pZCByZXNldEJs
b2NrWm9vbSgpOworCisgICAgdm9pZCB6b29tQWJvdXRQb2ludFRpbWVyRmlyZWQoV2ViQ29yZTo6
VGltZXI8V2ViUGFnZVByaXZhdGU+Kik7CisgICAgYm9vbCBzaG91bGRTZW5kUmVzaXplRXZlbnQo
KTsKKyAgICB2b2lkIHNjcm9sbEV2ZW50VGltZXJGaXJlZChXZWJDb3JlOjpUaW1lcjxXZWJQYWdl
UHJpdmF0ZT4qKTsKKyAgICB2b2lkIHJlc2l6ZUV2ZW50VGltZXJGaXJlZChXZWJDb3JlOjpUaW1l
cjxXZWJQYWdlUHJpdmF0ZT4qKTsKKworICAgIC8vIElmIHRoaXMgdXJsIHNob3VsZCBiZSBoYW5k
bGVkIGFzIGEgcGF0dGVybiwgcmV0dXJucyB0aGUgcGF0dGVybgorICAgIC8vIG90aGVyd2lzZSwg
cmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgICAgU3RyaW5nIGZpbmRQYXR0ZXJuU3RyaW5nRm9y
VXJsKGNvbnN0IFdlYkNvcmU6OktVUkwmKSBjb25zdDsKKworICAgIHZvaWQgc3VzcGVuZEJhY2tp
bmdTdG9yZSgpOworICAgIHZvaWQgcmVzdW1lQmFja2luZ1N0b3JlKCk7CisKKyAgICB2b2lkIHNl
dFNob3VsZFJlc2V0VGlsZXNXaGVuU2hvd24oYm9vbCBmbGFnKSB7IG1fc2hvdWxkUmVzZXRUaWxl
c1doZW5TaG93biA9IGZsYWc7IH0KKyAgICBib29sIHNob3VsZFJlc2V0VGlsZXNXaGVuU2hvd24o
KSBjb25zdCB7IHJldHVybiBtX3Nob3VsZFJlc2V0VGlsZXNXaGVuU2hvd247IH0KKworICAgIHZv
aWQgc2V0U2NyZWVuT3JpZW50YXRpb24oaW50KTsKKworICAgIC8vIFNjcm9sbCBhbmQvb3Igem9v
bSBzbyB0aGF0IHRoZSBXZWJQYWdlIGZpdHMgdGhlIG5ldyBhY3R1YWwKKyAgICAvLyB2aXNpYmxl
IHNpemUuCisgICAgdm9pZCBzZXRWaWV3cG9ydFNpemUoY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYg
dHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSwgYm9vbCBlbnN1cmVGb2N1c0VsZW1lbnRWaXNp
YmxlKTsKKyAgICB2b2lkIHNjcmVlblJvdGF0ZWQoKTsgLy8gSGVscGVyIG1ldGhvZCBmb3Igc2V0
Vmlld3BvcnRTaXplKCkuCisKKyAgICB2b2lkIHNjaGVkdWxlRGVmZXJyYWJsZVRpbWVyKFdlYkNv
cmU6OlRpbWVyPFdlYlBhZ2VQcml2YXRlPiosIGRvdWJsZSB0aW1lT3V0KTsKKyAgICB2b2lkIHVu
c2NoZWR1bGVBbGxEZWZlcnJhYmxlVGltZXJzKCk7CisgICAgdm9pZCB3aWxsRGVmZXJMb2FkaW5n
KCk7CisgICAgdm9pZCBkaWRSZXN1bWVMb2FkaW5nKCk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUg
aWYgdGhlIGVzY2FwZSBrZXkgaGFuZGxlciBzaG91bGQgem9vbS4KKyAgICBib29sIHNob3VsZFpv
b21PbkVzY2FwZSgpIGNvbnN0OworCisgICAgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgq
IHRyYW5zZm9ybWF0aW9uTWF0cml4KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3Ry
YW5zZm9ybWF0aW9uTWF0cml4OworICAgIH0KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJ
VElORykKKyAgICAvLyBXZWJLaXQgdGhyZWFkLgorICAgIGJvb2wgbmVlZHNPbmVTaG90RHJhd2lu
Z1N5bmNocm9uaXphdGlvbigpOworICAgIHZvaWQgcm9vdExheWVyQ29tbWl0VGltZXJGaXJlZChX
ZWJDb3JlOjpUaW1lcjxXZWJQYWdlUHJpdmF0ZT4qKTsKKyAgICBib29sIGNvbW1pdFJvb3RMYXll
cklmTmVlZGVkKCk7CisgICAgV2ViQ29yZTo6TGF5ZXJSZW5kZXJpbmdSZXN1bHRzIGxhc3RDb21w
b3NpdGluZ1Jlc3VsdHMoKSBjb25zdDsKKworICAgIC8vIFdlYktpdCB0aHJlYWQsIHBsdW1iZWQg
dGhyb3VnaCBmcm9tIENocm9tZUNsaWVudEJsYWNrQmVycnkuCisgICAgdm9pZCBzZXRSb290TGF5
ZXJXZWJLaXRUaHJlYWQoV2ViQ29yZTo6RnJhbWUqLCBXZWJDb3JlOjpMYXllcldlYktpdFRocmVh
ZCopOworICAgIHZvaWQgc2V0TmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpOwor
ICAgIHZvaWQgc2NoZWR1bGVSb290TGF5ZXJDb21taXQoKTsKKworICAgIC8vIFRocmVhZCBzYWZl
LgorICAgIHZvaWQgcmVzZXRDb21wb3NpdGluZ1N1cmZhY2UoKTsKKyAgICB2b2lkIGRyYXdMYXll
cnNPbkNvbW1pdCgpOyAvLyBJbmNsdWRpbmcgYmFja2luZyBzdG9yZSBibGl0LgorICAgIGJvb2wg
ZHJhd1N1YkxheWVycyhjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBkc3RSZWN0LCBjb25zdCBXZWJD
b3JlOjpGbG9hdFJlY3QmIGNvbnRlbnRzKTsKKyAgICBib29sIGRyYXdTdWJMYXllcnMoKTsgLy8g
RHJhdyB0aGVtIGF0IGxhc3Qga25vd24gcG9zaXRpb24uCisKKyAgICAvLyBDb21wb3NpdGluZyB0
aHJlYWQuCisgICAgdm9pZCBzZXRSb290TGF5ZXJDb21wb3NpdGluZ1RocmVhZChXZWJDb3JlOjpM
YXllckNvbXBvc2l0aW5nVGhyZWFkKik7CisgICAgdm9pZCBjb21taXRSb290TGF5ZXIoY29uc3Qg
V2ViQ29yZTo6SW50UmVjdCYsIGNvbnN0IFdlYkNvcmU6OkludFNpemUmKTsKKyAgICB2b2lkIHNl
dElzQWNjZWxlcmF0ZWRDb21wb3NpdGluZ0FjdGl2ZShib29sKTsKKyAgICB2b2lkIGRlc3Ryb3lD
b21wb3NpdG9yKCk7CisgICAgdm9pZCBzeW5jRGVzdHJveUNvbXBvc2l0b3JPbkNvbXBvc2l0aW5n
VGhyZWFkKCk7CisgICAgdm9pZCBkZXN0cm95TGF5ZXJSZXNvdXJjZXMoKTsKKyAgICB2b2lkIHN1
c3BlbmRSb290TGF5ZXJDb21taXQoKTsKKyAgICB2b2lkIHJlc3VtZVJvb3RMYXllckNvbW1pdCgp
OworICAgIHZvaWQgYmxpdFZpc2libGVDb250ZW50cygpOworI2VuZGlmCisKKyAgICBib29sIGRp
c3BhdGNoVG91Y2hFdmVudFRvRnVsbFNjcmVlblBsdWdpbihXZWJDb3JlOjpQbHVnaW5WaWV3Kiwg
Y29uc3QgUGxhdGZvcm06OlRvdWNoRXZlbnQmKTsKKyAgICBib29sIGRpc3BhdGNoVG91Y2hQb2lu
dEFzTW91c2VFdmVudFRvRnVsbFNjcmVlblBsdWdpbihXZWJDb3JlOjpQbHVnaW5WaWV3KiwgY29u
c3QgUGxhdGZvcm06OlRvdWNoUG9pbnQmKTsKKyAgICBib29sIGRpc3BhdGNoTW91c2VFdmVudFRv
RnVsbFNjcmVlblBsdWdpbihXZWJDb3JlOjpQbHVnaW5WaWV3KiwgY29uc3QgUGxhdGZvcm06Ok1v
dXNlRXZlbnQmKTsKKworICAgIEJhY2tpbmdTdG9yZUNsaWVudCogYmFja2luZ1N0b3JlQ2xpZW50
Rm9yRnJhbWUoY29uc3QgV2ViQ29yZTo6RnJhbWUqKSBjb25zdDsKKyAgICB2b2lkIGFkZEJhY2tp
bmdTdG9yZUNsaWVudEZvckZyYW1lKGNvbnN0IFdlYkNvcmU6OkZyYW1lKiwgQmFja2luZ1N0b3Jl
Q2xpZW50Kik7CisgICAgdm9pZCByZW1vdmVCYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZShjb25z
dCBXZWJDb3JlOjpGcmFtZSopOworCisgICAgLy8gQ2xlYW4gdXAgYW55IGRvY3VtZW50IHJlbGF0
ZWQgZGF0YSB3ZSBtaWdodCBiZSBob2xkaW5nLgorICAgIHZvaWQgY2xlYXJEb2N1bWVudERhdGEo
Y29uc3QgV2ViQ29yZTo6RG9jdW1lbnQqKTsKKworICAgIHN0YXRpYyBXZWJDb3JlOjpSZW5kZXJM
YXllciogZW5jbG9zaW5nUG9zaXRpb25lZEFuY2VzdG9yT3JTZWxmSWZQb3NpdGlvbmVkKFdlYkNv
cmU6OlJlbmRlckxheWVyKik7CisgICAgc3RhdGljIFdlYkNvcmU6OlJlbmRlckxheWVyKiBlbmNs
b3NpbmdGaXhlZFBvc2l0aW9uZWRBbmNlc3Rvck9yU2VsZklmRml4ZWRQb3NpdGlvbmVkKFdlYkNv
cmU6OlJlbmRlckxheWVyKik7CisKKyAgICBzdGF0aWMgV2ViQ29yZTo6SW50U2l6ZSBkZWZhdWx0
TWF4TGF5b3V0U2l6ZSgpOworCisgICAgV2ViUGFnZSogbV93ZWJQYWdlOworICAgIFdlYlBhZ2VD
bGllbnQqIG1fY2xpZW50OworICAgIFdlYkNvcmU6OlBhZ2UqIG1fcGFnZTsKKyAgICBXZWJDb3Jl
OjpGcmFtZSogbV9tYWluRnJhbWU7CisgICAgUmVmUHRyPFdlYkNvcmU6Ok5vZGU+IG1fY3VycmVu
dENvbnRleHROb2RlOworICAgIFdlYlNldHRpbmdzKiBtX3dlYlNldHRpbmdzOworCisjaWYgRU5B
QkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCisgICAgT3duUHRyPFdlYkNvcmU6OkphdmFTY3JpcHRE
ZWJ1Z2dlckJsYWNrQmVycnk+IG1fc2NyaXB0RGVidWdnZXI7CisjZW5kaWYKKworICAgIGJvb2wg
bV92aXNpYmxlOworICAgIGJvb2wgbV9zaG91bGRSZXNldFRpbGVzV2hlblNob3duOworICAgIHN0
YXRpYyBWZWN0b3I8V2ViUGFnZSo+KiBzX3Zpc2libGVXZWJQYWdlczsKKyAgICBib29sIG1fdXNl
clNjYWxhYmxlOworICAgIGJvb2wgbV91c2VyUGVyZm9ybWVkTWFudWFsWm9vbTsKKyAgICBib29s
IG1fdXNlclBlcmZvcm1lZE1hbnVhbFNjcm9sbDsKKyAgICBib29sIG1fY29udGVudHNTaXplQ2hh
bmdlZDsKKyAgICBib29sIG1fb3ZlcmZsb3dFeGNlZWRzQ29udGVudHNTaXplOworICAgIGJvb2wg
bV9yZXNldFZpcnR1YWxWaWV3cG9ydE9uQ29tbWl0dGVkOworICAgIGJvb2wgbV9zaG91bGRVc2VG
aXhlZERlc2t0b3BNb2RlOworICAgIGJvb2wgbV9uZWVkVG91Y2hFdmVudHM7CisgICAgaW50IG1f
cHJldmVudElkbGVEaW1taW5nQ291bnQ7CisKKyNpZiBFTkFCTEUoVE9VQ0hfRVZFTlRTKQorICAg
IGJvb2wgbV9wcmV2ZW50RGVmYXVsdE9uVG91Y2hTdGFydDsKKyNlbmRpZgorICAgIHVuc2lnbmVk
IG1fbmVzdGVkTGF5b3V0RmluaXNoZWRDb3VudDsKKyAgICBXZWJDb3JlOjpJbnRTaXplIG1fcHJl
dmlvdXNDb250ZW50c1NpemU7CisgICAgaW50IG1fYWN0dWFsVmlzaWJsZVdpZHRoOworICAgIGlu
dCBtX2FjdHVhbFZpc2libGVIZWlnaHQ7CisgICAgaW50IG1fdmlydHVhbFZpZXdwb3J0V2lkdGg7
CisgICAgaW50IG1fdmlydHVhbFZpZXdwb3J0SGVpZ2h0OworICAgIFdlYkNvcmU6OkludFNpemUg
bV9kZWZhdWx0TGF5b3V0U2l6ZTsKKyAgICBXZWJDb3JlOjpWaWV3cG9ydEFyZ3VtZW50cyBtX3Zp
ZXdwb3J0QXJndW1lbnRzOyAvLyBXZSBrZWVwIHRoaXMgYXJvdW5kIHNpbmNlIHdlIG1heSBuZWVk
IHRvIHJlLWV2YWx1YXRlIHRoZSBhcmd1bWVudHMgb24gcm90YXRpb24uCisgICAgYm9vbCBtX2Rp
ZFJlc3RvcmVGcm9tUGFnZUNhY2hlOworICAgIFZpZXdNb2RlIG1fdmlld01vZGU7CisgICAgTG9h
ZFN0YXRlIG1fbG9hZFN0YXRlOworICAgIFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4KiBt
X3RyYW5zZm9ybWF0aW9uTWF0cml4OworICAgIEJhY2tpbmdTdG9yZSogbV9iYWNraW5nU3RvcmU7
CisgICAgQmFja2luZ1N0b3JlQ2xpZW50KiBtX2JhY2tpbmdTdG9yZUNsaWVudDsKKyAgICBJblBh
Z2VTZWFyY2hNYW5hZ2VyKiBtX2luUGFnZVNlYXJjaE1hbmFnZXI7CisgICAgSW5wdXRIYW5kbGVy
KiBtX2lucHV0SGFuZGxlcjsKKyAgICBTZWxlY3Rpb25IYW5kbGVyKiBtX3NlbGVjdGlvbkhhbmRs
ZXI7CisgICAgVG91Y2hFdmVudEhhbmRsZXIqIG1fdG91Y2hFdmVudEhhbmRsZXI7CisKKyNpZiBF
TkFCTEUoRVZFTlRfTU9ERV9NRVRBVEFHUykKKyAgICBXZWJDb3JlOjpDdXJzb3JFdmVudE1vZGUg
bV9jdXJzb3JFdmVudE1vZGU7CisgICAgV2ViQ29yZTo6VG91Y2hFdmVudE1vZGUgbV90b3VjaEV2
ZW50TW9kZTsKKyNlbmRpZgorCisgICAgUGxhdGZvcm06OkJsYWNrQmVycnlDdXJzb3IgbV9jdXJy
ZW50Q3Vyc29yOworCisgICAgRHVtcFJlbmRlclRyZWVDbGllbnQqIG1fZHVtcFJlbmRlclRyZWU7
CisKKyAgICBkb3VibGUgbV9pbml0aWFsU2NhbGU7CisgICAgZG91YmxlIG1fbWluaW11bVNjYWxl
OworICAgIGRvdWJsZSBtX21heGltdW1TY2FsZTsKKworICAgIC8vIEJsb2NrIHpvb20gYW5pbWF0
aW9uIGRhdGEuCisgICAgV2ViQ29yZTo6RmxvYXRQb2ludCBtX2ZpbmFsQmxvY2tQb2ludDsKKyAg
ICBXZWJDb3JlOjpGbG9hdFBvaW50IG1fZmluYWxCbG9ja1BvaW50UmVmbG93T2Zmc2V0OworICAg
IGRvdWJsZSBtX2Jsb2NrWm9vbUZpbmFsU2NhbGU7CisgICAgUmVmUHRyPFdlYkNvcmU6Ok5vZGU+
IG1fY3VycmVudFBpbmNoWm9vbU5vZGU7CisgICAgV2ViQ29yZTo6RmxvYXRQb2ludCBtX2FuY2hv
ckluTm9kZVJlY3RSYXRpbzsKKyAgICBSZWZQdHI8V2ViQ29yZTo6Tm9kZT4gbV9jdXJyZW50Qmxv
Y2tab29tTm9kZTsKKyAgICBSZWZQdHI8V2ViQ29yZTo6Tm9kZT4gbV9jdXJyZW50QmxvY2tab29t
QWRqdXN0ZWROb2RlOworICAgIGJvb2wgbV9zaG91bGRSZWZsb3dCbG9jazsKKworICAgIC8vIERl
bGF5ZWQgem9vbUFib3V0UG9pbnQuCisgICAgT3duUHRyPFdlYkNvcmU6OlRpbWVyPFdlYlBhZ2VQ
cml2YXRlPiA+IG1fZGVsYXllZFpvb21UaW1lcjsKKyAgICBzdHJ1Y3QgeworICAgICAgICBkb3Vi
bGUgc2NhbGU7CisgICAgICAgIFdlYkNvcmU6OkZsb2F0UG9pbnQgYW5jaG9yOworICAgICAgICBi
b29sIGVuZm9yY2VTY2FsZUNsYW1waW5nOworICAgICAgICBib29sIGZvcmNlUmVuZGVyaW5nOwor
ICAgIH0gbV9kZWxheWVkWm9vbUFyZ3VtZW50czsKKworICAgIGRvdWJsZSBtX2xhc3RVc2VyRXZl
bnRUaW1lc3RhbXA7IC8vIFVzZWQgdG8gZGV0ZWN0IHVzZXIgc2Nyb2xsaW5nLgorCisgICAgV2Vi
Q29yZTo6UGxhdGZvcm1Nb3VzZUV2ZW50IG1fbGFzdE1vdXNlRXZlbnQ7CisgICAgYm9vbCBtX3Bs
dWdpbk1vdXNlQnV0dG9uUHJlc3NlZDsgLy8gVXNlZCB0byB0cmFjayBtb3VzZSBidXR0b24gZm9y
IGZ1bGwgc2NyZWVuIHBsdWdpbnMuCisgICAgYm9vbCBtX3BsdWdpbk1heU9wZW5OZXdUYWI7CisK
KyAgICBXZWJDb3JlOjpHZW9sb2NhdGlvbkNvbnRyb2xsZXJDbGllbnRCbGFja0JlcnJ5KiBtX2dl
b2xvY2F0aW9uQ2xpZW50OworCisgICAgSGFzaFNldDxXZWJDb3JlOjpQbHVnaW5WaWV3Kj4gbV9w
bHVnaW5WaWV3czsKKworICAgIFJlZlB0cjxXZWJDb3JlOjpOb2RlPiBtX2luUmVnaW9uU2Nyb2xs
U3RhcnRpbmdOb2RlOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGJv
b2wgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmdBY3RpdmU7CisgICAgT3duUHRyPEZyYW1lTGF5
ZXJzPiBtX2ZyYW1lTGF5ZXJzOyAvLyBXZWJLaXQgdGhyZWFkIG9ubHkuCisgICAgT3duUHRyPFdl
YlBhZ2VDb21wb3NpdG9yPiBtX2NvbXBvc2l0b3I7IC8vIENvbXBvc2l0aW5nIHRocmVhZCBvbmx5
LgorICAgIE93blB0cjxXZWJDb3JlOjpUaW1lcjxXZWJQYWdlUHJpdmF0ZT4gPiBtX3Jvb3RMYXll
ckNvbW1pdFRpbWVyOworICAgIGJvb2wgbV9uZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0
aW9uOworICAgIGJvb2wgbV9uZWVkc0NvbW1pdDsKKyAgICBib29sIG1fc3VzcGVuZFJvb3RMYXll
ckNvbW1pdDsKKyNlbmRpZgorCisgICAgaW50IG1fcGVuZGluZ09yaWVudGF0aW9uOworCisgICAg
UmVmUHRyPFdlYkNvcmU6Ok5vZGU+IG1fZnVsbHNjcmVlblZpZGVvTm9kZTsKKyAgICBSZWZQdHI8
V2ViQ29yZTo6UGx1Z2luVmlldz4gbV9mdWxsU2NyZWVuUGx1Z2luVmlldzsKKworICAgIHR5cGVk
ZWYgSGFzaE1hcDxjb25zdCBXZWJDb3JlOjpGcmFtZSosIEJhY2tpbmdTdG9yZUNsaWVudCo+IEJh
Y2tpbmdTdG9yZUNsaWVudEZvckZyYW1lTWFwOworICAgIEJhY2tpbmdTdG9yZUNsaWVudEZvckZy
YW1lTWFwIG1fYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWVNYXA7CisKKyAgICAvLyBXZWJTZXR0
aW5nc0RlbGVnYXRlIG1ldGhvZHMuCisgICAgdmlydHVhbCB2b2lkIGRpZENoYW5nZVNldHRpbmdz
KFdlYlNldHRpbmdzKik7CisKKyAgICBSZWZQdHI8V2ViQ29yZTo6RE9NV3JhcHBlcldvcmxkPiBt
X2lzb2xhdGVkV29ybGQ7CisgICAgYm9vbCBtX2hhc0luUmVnaW9uU2Nyb2xsYWJsZUFyZWFzOwor
ICAgIGJvb2wgbV91cGRhdGVEZWxlZ2F0ZWRPdmVybGF5c0Rpc3BhdGNoZWQ7Cit9OworfQorfQor
CisjZW5kaWYgLy8gV2ViUGFnZV9wX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128304</attachid>
            <date>2012-02-22 15:32:44 -0800</date>
            <delta_ts>2012-02-23 11:25:50 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74380-20120222183217.patch</filename>
            <type>text/plain</type>
            <size>243614</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4NTA1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Js
YWNrYmVycnkvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0NoYW5nZUxvZwpp
bmRleCBmNDVjMjAzMGIyZGU2ZjlhZDliYzVhMDUyNjJjYWY1MzhjNjAzZGIzLi41MDg0MjI2YjM3
NWJjOTgyOWNjMDMwZTc4NmUzYTU1NWExZmU0OWJhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
L2JsYWNrYmVycnkvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9DaGFu
Z2VMb2cKQEAgLTEsMyArMSwxNiBAQAorMjAxMi0wMi0yMiAgSmFja3kgSmlhbmcgIDx6aGFqaWFu
Z0ByaW0uY29tPgorCisgICAgICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBCbGFja0JlcnJ5IEFQ
SSB3ZWIgcGFnZSByZWxhdGVkIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD03NDM4MAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KKworICAgICAg
ICAqIEFwaS9XZWJQYWdlLmNwcDogQWRkZWQuCisgICAgICAgICogQXBpL1dlYlBhZ2UuaDogQWRk
ZWQuCisgICAgICAgICogQXBpL1dlYlBhZ2VfcC5oOiBBZGRlZC4KKwogMjAxMi0wMi0yMiAgUnlv
c3VrZSBOaXdhICA8cm5pd2FAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZW1vdmUgdGhlIHJlbWFp
bmluZyB1c2VzIG9mIENTU1N0eWxlRGVjbGFyYXRpb24gaW4gRWRpdG9yCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQXBpL1dlYlBhZ2UuY3BwIGIvU291cmNlL1dlYktpdC9i
bGFja2JlcnJ5L0FwaS9XZWJQYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yM2NiM2YxYTRmZDIyNWUwYzkz
YWQ3MDcwMWM0MDM1NzI1N2E3OWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9i
bGFja2JlcnJ5L0FwaS9XZWJQYWdlLmNwcApAQCAtMCwwICsxLDU2MDQgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0
ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUg
RnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIldlYlBhZ2UuaCIKKworI2luY2x1ZGUgIkFwcGxpY2F0aW9u
Q2FjaGVTdG9yYWdlLmgiCisjaW5jbHVkZSAiQmFja0ZvcndhcmRDb250cm9sbGVyLmgiCisjaW5j
bHVkZSAiQmFja0ZvcndhcmRMaXN0SW1wbC5oIgorI2luY2x1ZGUgIkJhY2tpbmdTdG9yZUNsaWVu
dC5oIgorI2luY2x1ZGUgIkJhY2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZS5oIgorI2luY2x1
ZGUgIkJhY2tpbmdTdG9yZV9wLmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIkNh
Y2hlZEltYWdlLmgiCisjaW5jbHVkZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAiQ2hyb21lQ2xpZW50
QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51Q2xpZW50QmxhY2tCZXJyeS5oIgor
I2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJET01TdXBwb3J0LmgiCisjaW5j
bHVkZSAiRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJEYXRhYmFzZVN5bmMuaCIKKyNpbmNsdWRlICJE
YXRhYmFzZVRyYWNrZXIuaCIKKyNpbmNsdWRlICJEZXZpY2VNb3Rpb25DbGllbnRCbGFja0JlcnJ5
LmgiCisjaW5jbHVkZSAiRGV2aWNlT3JpZW50YXRpb25DbGllbnRCbGFja0JlcnJ5LmgiCisjaW5j
bHVkZSAiRHJhZ0NsaWVudEJsYWNrQmVycnkuaCIKKy8vIEZJWE1FOiBXZSBzaG91bGQgYmUgdXNp
bmcgRHVtcFJlbmRlclRyZWVDbGllbnQsIGJ1dCBJJ20gbm90IHN1cmUgd2hlcmUgd2Ugc2hvdWxk
CisvLyBjcmVhdGUgdGhlIERSVF9CQiBvYmplY3QuIFNlZSBQUiAjMTIwMzU1LgorI2lmIEVOQUJM
RV9EUlQKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZUJsYWNrQmVycnkuaCIKKyNlbmRpZgorI2lu
Y2x1ZGUgIkVkaXRvckNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJGb2N1c0NvbnRyb2xs
ZXIuaCIKKyNpbmNsdWRlICJGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuaCIKKyNpZiBFTkFC
TEUoQ0xJRU5UX0JBU0VEX0dFT0xPQ0FUSU9OKQorI2lmIEVOQUJMRV9EUlQKKyNpbmNsdWRlICJH
ZW9sb2NhdGlvbkNsaWVudE1vY2suaCIKKyNlbmRpZgorI2luY2x1ZGUgIkdlb2xvY2F0aW9uQ29u
dHJvbGxlckNsaWVudEJsYWNrQmVycnkuaCIKKyNlbmRpZgorI2luY2x1ZGUgIkdyb3VwU2V0dGlu
Z3MuaCIKKyNpbmNsdWRlICJIVE1MQXJlYUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MRnJhbWVP
d25lckVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MSW1hZ2VFbGVtZW50LmgiCisjaW5jbHVkZSAi
SFRNTElucHV0RWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhU
TUxQYXJzZXJJZGlvbXMuaCIKKyNpbmNsdWRlICJIVFRQUGFyc2Vycy5oIgorI2luY2x1ZGUgIkhp
c3RvcnlJdGVtLmgiCisjaW5jbHVkZSAiSWNvbkRhdGFiYXNlQ2xpZW50QmxhY2tCZXJyeS5oIgor
I2luY2x1ZGUgIkluUGFnZVNlYXJjaE1hbmFnZXIuaCIKKyNpbmNsdWRlICJJblJlZ2lvblNjcm9s
bGFibGVBcmVhLmgiCisjaW5jbHVkZSAiSW5wdXRIYW5kbGVyLmgiCisjaW5jbHVkZSAiSW5zcGVj
dG9yQmFja2VuZERpc3BhdGNoZXIuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDbGllbnRCbGFja0Jl
cnJ5LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkphdmFT
Y3JpcHREZWJ1Z2dlckJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJMYXllcldlYktpdFRocmVhZC5o
IgorI2luY2x1ZGUgIk5ldHdvcmtNYW5hZ2VyLmgiCisjaW5jbHVkZSAiTm9kZVJlbmRlclN0eWxl
LmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBhZ2VDYWNoZS5oIgorI2luY2x1ZGUg
IlBhZ2VHcm91cC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtVG91Y2hFdmVudC5oIgorI2luY2x1ZGUg
IlBsYXRmb3JtV2hlZWxFdmVudC5oIgorI2luY2x1ZGUgIlBsdWdpbkRhdGFiYXNlLmgiCisjaW5j
bHVkZSAiUGx1Z2luVmlldy5oIgorI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKKyNpbmNsdWRlICJS
ZW5kZXJUaGVtZUJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJSZW5kZXJUcmVlQXNUZXh0LmgiCisj
aW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlJlbmRlcldpZGdldC5oIgorI2luY2x1
ZGUgIlNjcmlwdFNvdXJjZUNvZGUuaCIKKyNpbmNsdWRlICJTY3JpcHRWYWx1ZS5oIgorI2luY2x1
ZGUgIlNjcm9sbFR5cGVzLmgiCisjaW5jbHVkZSAiU2VsZWN0aW9uSGFuZGxlci5oIgorI2luY2x1
ZGUgIlNldHRpbmdzLmgiCisjaW5jbHVkZSAiU3RvcmFnZS5oIgorI2luY2x1ZGUgIlN0b3JhZ2VO
YW1lc3BhY2UuaCIKKyNpbmNsdWRlICJTdXJmYWNlUG9vbC5oIgorI2luY2x1ZGUgIlRleHQuaCIK
KyNpbmNsdWRlICJUaHJlYWRDaGVjay5oIgorI2luY2x1ZGUgIlRvdWNoRXZlbnRIYW5kbGVyLmgi
CisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRlICJWaXNpYmxlUG9z
aXRpb24uaCIKKyNpZiBFTkFCTEUoV0VCRE9NKQorI2luY2x1ZGUgIldlYkRPTURvY3VtZW50Lmgi
CisjZW5kaWYKKyNpbmNsdWRlICJXZWJQYWdlQ2xpZW50LmgiCisjaW5jbHVkZSAiV2ViU29ja2V0
LmgiCisjaW5jbHVkZSAibnBhcGkuaCIKKyNpbmNsdWRlICJydW50aW1lX3Jvb3QuaCIKKworI2lm
IEVOQUJMRShWSURFTykKKyNpbmNsdWRlICJIVE1MTWVkaWFFbGVtZW50LmgiCisjaW5jbHVkZSAi
TWVkaWFQbGF5ZXIuaCIKKyNpbmNsdWRlICJNZWRpYVBsYXllclByaXZhdGVCbGFja0JlcnJ5Lmgi
CisjZW5kaWYKKworI2lmIFVTRShTS0lBKQorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEu
aCIKKyNlbmRpZgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2luY2x1ZGUg
IkZyYW1lTGF5ZXJzLmgiCisjaW5jbHVkZSAiV2ViUGFnZUNvbXBvc2l0b3IuaCIKKyNlbmRpZgor
CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtRXhlY3V0YWJsZU1lc3NhZ2UuaD4KKyNpbmNs
dWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1JVFBvbGljeS5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQ
bGF0Zm9ybUtleWJvYXJkRXZlbnQuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1NZXNz
YWdlQ2xpZW50Lmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTW91c2VFdmVudC5oPgor
I2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVNjcmVlbi5oPgorI2luY2x1ZGUgPEJsYWNrQmVy
cnlQbGF0Zm9ybVNldHRpbmdzLmg+CisjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvQVBJQ2FzdC5o
PgorI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pTQ29udGV4dFJlZi5oPgorI2luY2x1ZGUgPFNo
YXJlZFBvaW50ZXIuaD4KKyNpbmNsdWRlIDxzeXMva2V5Y29kZXMuaD4KKyNpbmNsdWRlIDx1bmlj
b2RlL3VzdHJpbmcuaD4gLy8gcGxhdGZvcm0gSUNVCisKKyNpZm5kZWYgVVNFUl9QUk9DRVNTRVMK
KyNpbmNsdWRlIDxtZW1hbGxvYy5oPgorI2VuZGlmCisKKyNpZiBFTkFCTEUoU0tJQV9HUFVfQ0FO
VkFTKQorI2luY2x1ZGUgIkJsYWNrQmVycnlQbGF0Zm9ybUdyYXBoaWNzLmgiCisjaW5jbHVkZSAi
R3JDb250ZXh0LmgiCisjZW5kaWYKKworI2RlZmluZSBERUJVR19CTE9DS19aT09NIDAKKyNkZWZp
bmUgREVCVUdfVE9VQ0hfRVZFTlRTIDAKKyNkZWZpbmUgREVCVUdfV0VCUEFHRV9MT0FEIDAKKwor
dXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCit0eXBlZGVm
IGNvbnN0IHVuc2lnbmVkIHNob3J0KiBDVVNob3J0UHRyOworCituYW1lc3BhY2UgQmxhY2tCZXJy
eSB7CituYW1lc3BhY2UgV2ViS2l0IHsKKworc3RhdGljIFZlY3RvcjxXZWJQYWdlKj4qIHZpc2li
bGVXZWJQYWdlcygpCit7CisgICAgc3RhdGljIFZlY3RvcjxXZWJQYWdlKj4qIHNfdmlzaWJsZVdl
YlBhZ2VzID0gMDsgLy8gSW5pdGlhbGx5LCBubyB3ZWIgcGFnZSBpcyB2aXNpYmxlLgorICAgIGlm
ICghc192aXNpYmxlV2ViUGFnZXMpCisgICAgICAgIHNfdmlzaWJsZVdlYlBhZ2VzID0gbmV3IFZl
Y3RvcjxXZWJQYWdlKj47CisgICAgcmV0dXJuIHNfdmlzaWJsZVdlYlBhZ2VzOworfQorCitjb25z
dCB1bnNpZ25lZCBibG9ja1pvb21NYXJnaW4gPSAzOyAvLyBBZGQgMyBwaXhlbCBtYXJnaW4gb24g
ZWFjaCBzaWRlLgorc3RhdGljIGludCBibG9ja0NsaWNrUmFkaXVzID0gMDsKK3N0YXRpYyBkb3Vi
bGUgbWF4aW11bUJsb2NrWm9vbVNjYWxlID0gMzsgLy8gVGhpcyBzY2FsZSBjYW4gYmUgY2xhbXBl
ZCBieSB0aGUgbWF4aW11bVNjYWxlIHNldCBmb3IgdGhlIHBhZ2UuCisKK2NvbnN0IGRvdWJsZSBt
YW51YWxTY3JvbGxJbnRlcnZhbCA9IDAuMTsgLy8gVGhlIHRpbWUgaW50ZXJ2YWwgZHVyaW5nIHdo
aWNoIHdlIGFzc29jaWF0ZSB1c2VyIGFjdGlvbiB3aXRoIHNjcm9sbGluZy4KKworY29uc3QgZG91
YmxlIGRlbGF5ZWRab29tSW50ZXJ2YWwgPSAwOworCitjb25zdCBJbnRTaXplIG1pbmltdW1MYXlv
dXRTaXplKDEwLCAxMCk7IC8vIE5lZWRzIHRvIGJlIGEgc21hbGwgc2l6ZSwgZ3JlYXRlciB0aGFu
IDAsIHRoYXQgd2UgY2FuIGdyb3cgdGhlIGxheW91dCBmcm9tLgorY29uc3QgSW50U2l6ZSBtYXhp
bXVtTGF5b3V0U2l6ZSgxMDAwMCwgMTAwMDApOyAvLyBVc2VkIHdpdGggdmlld3BvcnQgbWV0YSB0
YWcsIGJ1dCB3ZSBjYW4gc3RpbGwgZ3JvdyBmcm9tIHRoaXMgb2YgY291cnNlLgorCitjb25zdCBk
b3VibGUgbWluaW11bUV4cGFuZGluZ1JhdGlvID0gMC4xNTsKKworLy8gSGVscGVyIGZ1bmN0aW9u
IHRvIHBhcnNlIGEgVVJMIGFuZCBmaWxsIGluIG1pc3NpbmcgcGFydHMuCitzdGF0aWMgS1VSTCBw
YXJzZVVybChjb25zdCBTdHJpbmcmIHVybCkKK3sKKyAgICBTdHJpbmcgdXJsU3RyaW5nKHVybCk7
CisgICAgS1VSTCBrdXJsID0gS1VSTChLVVJMKCksIHVybFN0cmluZyk7CisgICAgaWYgKGt1cmwu
cHJvdG9jb2woKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgdXJsU3RyaW5nLmluc2VydCgiaHR0cDov
LyIsIDApOworICAgICAgICBrdXJsID0gS1VSTChLVVJMKCksIHVybFN0cmluZyk7CisgICAgfQor
CisgICAgcmV0dXJuIGt1cmw7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbnMgdG8gY29udmVydCB0
byBhbmQgZnJvbSBXZWJDb3JlIHR5cGVzLgorc3RhdGljIGlubGluZSBNb3VzZUV2ZW50VHlwZSB0
b1dlYkNvcmVNb3VzZUV2ZW50VHlwZShjb25zdCBQbGF0Zm9ybTo6TW91c2VFdmVudDo6VHlwZSB0
eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgUGxhdGZvcm06Ok1vdXNlRXZl
bnQ6Ok1vdXNlQnV0dG9uRG93bjoKKyAgICAgICAgcmV0dXJuIE1vdXNlRXZlbnRQcmVzc2VkOwor
ICAgIGNhc2UgUGxhdGZvcm06Ok1vdXNlRXZlbnQ6Ok1vdXNlQnV0dG9uVXA6CisgICAgICAgIHJl
dHVybiBNb3VzZUV2ZW50UmVsZWFzZWQ7CisgICAgY2FzZSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6
TW91c2VNb3ZlOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBNb3VzZUV2ZW50TW92ZWQ7
CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIFJlc291cmNlUmVxdWVzdENhY2hlUG9saWN5IHRv
V2ViQ29yZUNhY2hlUG9saWN5KFBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6Q2FjaGVQb2xpY3kg
cG9saWN5KQoreworICAgIHN3aXRjaCAocG9saWN5KSB7CisgICAgY2FzZSBQbGF0Zm9ybTo6TmV0
d29ya1JlcXVlc3Q6OlVzZVByb3RvY29sQ2FjaGVQb2xpY3k6CisgICAgICAgIHJldHVybiBVc2VQ
cm90b2NvbENhY2hlUG9saWN5OworICAgIGNhc2UgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpS
ZWxvYWRJZ25vcmluZ0NhY2hlRGF0YToKKyAgICAgICAgcmV0dXJuIFJlbG9hZElnbm9yaW5nQ2Fj
aGVEYXRhOworICAgIGNhc2UgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpSZXR1cm5DYWNoZURh
dGFFbHNlTG9hZDoKKyAgICAgICAgcmV0dXJuIFJldHVybkNhY2hlRGF0YUVsc2VMb2FkOworICAg
IGNhc2UgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpSZXR1cm5DYWNoZURhdGFEb250TG9hZDoK
KyAgICAgICAgcmV0dXJuIFJldHVybkNhY2hlRGF0YURvbnRMb2FkOworICAgIGRlZmF1bHQ6Cisg
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gVXNlUHJvdG9jb2xD
YWNoZVBvbGljeTsKKyAgICB9Cit9CisKKyNpZiBFTkFCTEUoRVZFTlRfTU9ERV9NRVRBVEFHUykK
K3N0YXRpYyBpbmxpbmUgUGxhdGZvcm06OkN1cnNvckV2ZW50TW9kZSB0b1BsYXRmb3JtQ3Vyc29y
RXZlbnRNb2RlKEN1cnNvckV2ZW50TW9kZSBtb2RlKQoreworICAgIHN3aXRjaCAobW9kZSkgewor
ICAgIGNhc2UgUHJvY2Vzc2VkQ3Vyc29yRXZlbnRzOgorICAgICAgICByZXR1cm4gUGxhdGZvcm06
OlByb2Nlc3NlZEN1cnNvckV2ZW50czsKKyAgICBjYXNlIE5hdGl2ZUN1cnNvckV2ZW50czoKKyAg
ICAgICAgcmV0dXJuIFBsYXRmb3JtOjpOYXRpdmVDdXJzb3JFdmVudHM7CisgICAgZGVmYXVsdDoK
KyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6
UHJvY2Vzc2VkQ3Vyc29yRXZlbnRzOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBQbGF0Zm9y
bTo6VG91Y2hFdmVudE1vZGUgdG9QbGF0Zm9ybVRvdWNoRXZlbnRNb2RlKFRvdWNoRXZlbnRNb2Rl
IG1vZGUpCit7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBQcm9jZXNzZWRUb3VjaEV2
ZW50czoKKyAgICAgICAgcmV0dXJuIFBsYXRmb3JtOjpQcm9jZXNzZWRUb3VjaEV2ZW50czsKKyAg
ICBjYXNlIE5hdGl2ZVRvdWNoRXZlbnRzOgorICAgICAgICByZXR1cm4gUGxhdGZvcm06Ok5hdGl2
ZVRvdWNoRXZlbnRzOworICAgIGNhc2UgUHVyZVRvdWNoRXZlbnRzV2l0aE1vdXNlQ29udmVyc2lv
bjoKKyAgICAgICAgcmV0dXJuIFBsYXRmb3JtOjpQdXJlVG91Y2hFdmVudHNXaXRoTW91c2VDb252
ZXJzaW9uOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
ICAgICByZXR1cm4gUGxhdGZvcm06OlByb2Nlc3NlZFRvdWNoRXZlbnRzOworICAgIH0KK30KKyNl
bmRpZgorCitzdGF0aWMgaW5saW5lIEhpc3RvcnlJdGVtKiBoaXN0b3J5SXRlbUZyb21CYWNrRm9y
d2FyZElkKFdlYlBhZ2U6OkJhY2tGb3J3YXJkSWQgaWQpCit7CisgICAgcmV0dXJuIHJlaW50ZXJw
cmV0X2Nhc3Q8SGlzdG9yeUl0ZW0qPihpZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgV2ViUGFnZTo6
QmFja0ZvcndhcmRJZCBiYWNrRm9yd2FyZElkRnJvbUhpc3RvcnlJdGVtKEhpc3RvcnlJdGVtKiBp
dGVtKQoreworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFdlYlBhZ2U6OkJhY2tGb3J3YXJk
SWQ+KGl0ZW0pOworfQorCitXZWJQYWdlUHJpdmF0ZTo6V2ViUGFnZVByaXZhdGUoV2ViUGFnZSog
d2ViUGFnZSwgV2ViUGFnZUNsaWVudCogY2xpZW50LCBjb25zdCBJbnRSZWN0JiByZWN0KQorICAg
IDogbV93ZWJQYWdlKHdlYlBhZ2UpCisgICAgLCBtX2NsaWVudChjbGllbnQpCisgICAgLCBtX3Bh
Z2UoMCkgLy8gSW5pdGlhbGl6ZWQgYnkgaW5pdC4KKyAgICAsIG1fbWFpbkZyYW1lKDApIC8vIElu
aXRpYWxpemVkIGJ5IGluaXQuCisgICAgLCBtX2N1cnJlbnRDb250ZXh0Tm9kZSgwKQorICAgICwg
bV93ZWJTZXR0aW5ncygwKSAvLyBJbml0aWFsaXplZCBieSBpbml0LgorICAgICwgbV92aXNpYmxl
KGZhbHNlKQorICAgICwgbV9zaG91bGRSZXNldFRpbGVzV2hlblNob3duKGZhbHNlKQorICAgICwg
bV91c2VyU2NhbGFibGUodHJ1ZSkKKyAgICAsIG1fdXNlclBlcmZvcm1lZE1hbnVhbFpvb20oZmFs
c2UpCisgICAgLCBtX3VzZXJQZXJmb3JtZWRNYW51YWxTY3JvbGwoZmFsc2UpCisgICAgLCBtX2Nv
bnRlbnRzU2l6ZUNoYW5nZWQoZmFsc2UpCisgICAgLCBtX292ZXJmbG93RXhjZWVkc0NvbnRlbnRz
U2l6ZShmYWxzZSkKKyAgICAsIG1fcmVzZXRWaXJ0dWFsVmlld3BvcnRPbkNvbW1pdHRlZCh0cnVl
KQorICAgICwgbV9zaG91bGRVc2VGaXhlZERlc2t0b3BNb2RlKGZhbHNlKQorICAgICwgbV9uZWVk
VG91Y2hFdmVudHMoZmFsc2UpCisgICAgLCBtX3ByZXZlbnRJZGxlRGltbWluZ0NvdW50KDApCisj
aWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyAgICAsIG1fcHJldmVudERlZmF1bHRPblRvdWNoU3Rh
cnQoZmFsc2UpCisjZW5kaWYKKyAgICAsIG1fbmVzdGVkTGF5b3V0RmluaXNoZWRDb3VudCgwKQor
ICAgICwgbV9hY3R1YWxWaXNpYmxlV2lkdGgocmVjdC53aWR0aCgpKQorICAgICwgbV9hY3R1YWxW
aXNpYmxlSGVpZ2h0KHJlY3QuaGVpZ2h0KCkpCisgICAgLCBtX3ZpcnR1YWxWaWV3cG9ydFdpZHRo
KDApCisgICAgLCBtX3ZpcnR1YWxWaWV3cG9ydEhlaWdodCgwKQorICAgICwgbV9kZWZhdWx0TGF5
b3V0U2l6ZShtaW5pbXVtTGF5b3V0U2l6ZSkKKyAgICAsIG1fZGlkUmVzdG9yZUZyb21QYWdlQ2Fj
aGUoZmFsc2UpCisgICAgLCBtX3ZpZXdNb2RlKFdlYlBhZ2VQcml2YXRlOjpEZXNrdG9wKSAvLyBE
ZWZhdWx0IHRvIERlc2t0b3AgbW9kZSBmb3IgUEIuCisgICAgLCBtX2xvYWRTdGF0ZShXZWJQYWdl
UHJpdmF0ZTo6Tm9uZSkKKyAgICAsIG1fdHJhbnNmb3JtYXRpb25NYXRyaXgobmV3IFRyYW5zZm9y
bWF0aW9uTWF0cml4KCkpCisgICAgLCBtX2JhY2tpbmdTdG9yZSgwKSAvLyBJbml0aWFsaXplZCBi
eSBpbml0LgorICAgICwgbV9iYWNraW5nU3RvcmVDbGllbnQoMCkgLy8gSW5pdGlhbGl6ZWQgYnkg
aW5pdC4KKyAgICAsIG1faW5QYWdlU2VhcmNoTWFuYWdlcihuZXcgSW5QYWdlU2VhcmNoTWFuYWdl
cih0aGlzKSkKKyAgICAsIG1faW5wdXRIYW5kbGVyKG5ldyBJbnB1dEhhbmRsZXIodGhpcykpCisg
ICAgLCBtX3NlbGVjdGlvbkhhbmRsZXIobmV3IFNlbGVjdGlvbkhhbmRsZXIodGhpcykpCisgICAg
LCBtX3RvdWNoRXZlbnRIYW5kbGVyKG5ldyBUb3VjaEV2ZW50SGFuZGxlcih0aGlzKSkKKyNpZiBF
TkFCTEUoRVZFTlRfTU9ERV9NRVRBVEFHUykKKyAgICAsIG1fY3Vyc29yRXZlbnRNb2RlKFByb2Nl
c3NlZEN1cnNvckV2ZW50cykKKyAgICAsIG1fdG91Y2hFdmVudE1vZGUoUHJvY2Vzc2VkVG91Y2hF
dmVudHMpCisjZW5kaWYKKyAgICAsIG1fY3VycmVudEN1cnNvcihQbGF0Zm9ybTo6Q3Vyc29yTm9u
ZSkKKyAgICAsIG1fZHVtcFJlbmRlclRyZWUoMCkgLy8gTGF6eSBpbml0aWFsaXphdGlvbi4KKyAg
ICAsIG1faW5pdGlhbFNjYWxlKC0xLjApCisgICAgLCBtX21pbmltdW1TY2FsZSgtMS4wKQorICAg
ICwgbV9tYXhpbXVtU2NhbGUoLTEuMCkKKyAgICAsIG1fYmxvY2tab29tRmluYWxTY2FsZSgxLjAp
CisgICAgLCBtX2FuY2hvckluTm9kZVJlY3RSYXRpbygtMSwgLTEpCisgICAgLCBtX2N1cnJlbnRC
bG9ja1pvb21Ob2RlKDApCisgICAgLCBtX2N1cnJlbnRCbG9ja1pvb21BZGp1c3RlZE5vZGUoMCkK
KyAgICAsIG1fc2hvdWxkUmVmbG93QmxvY2soZmFsc2UpCisgICAgLCBtX2RlbGF5ZWRab29tVGlt
ZXIoYWRvcHRQdHIobmV3IFRpbWVyPFdlYlBhZ2VQcml2YXRlPih0aGlzLCAmV2ViUGFnZVByaXZh
dGU6Onpvb21BYm91dFBvaW50VGltZXJGaXJlZCkpKQorICAgICwgbV9sYXN0VXNlckV2ZW50VGlt
ZXN0YW1wKDAuMCkKKyAgICAsIG1fcGx1Z2luTW91c2VCdXR0b25QcmVzc2VkKGZhbHNlKQorICAg
ICwgbV9wbHVnaW5NYXlPcGVuTmV3VGFiKGZhbHNlKQorICAgICwgbV9nZW9sb2NhdGlvbkNsaWVu
dCgwKQorICAgICwgbV9pblJlZ2lvblNjcm9sbFN0YXJ0aW5nTm9kZSgwKQorI2lmIFVTRShBQ0NF
TEVSQVRFRF9DT01QT1NJVElORykKKyAgICAsIG1faXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nQWN0
aXZlKGZhbHNlKQorICAgICwgbV9yb290TGF5ZXJDb21taXRUaW1lcihhZG9wdFB0cihuZXcgVGlt
ZXI8V2ViUGFnZVByaXZhdGU+KHRoaXMsICZXZWJQYWdlUHJpdmF0ZTo6cm9vdExheWVyQ29tbWl0
VGltZXJGaXJlZCkpKQorICAgICwgbV9uZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0aW9u
KGZhbHNlKQorICAgICwgbV9uZWVkc0NvbW1pdChmYWxzZSkKKyAgICAsIG1fc3VzcGVuZFJvb3RM
YXllckNvbW1pdChmYWxzZSkKKyNlbmRpZgorICAgICwgbV9wZW5kaW5nT3JpZW50YXRpb24oLTEp
CisgICAgLCBtX2Z1bGxzY3JlZW5WaWRlb05vZGUoMCkKKyAgICAsIG1faGFzSW5SZWdpb25TY3Jv
bGxhYmxlQXJlYXMoZmFsc2UpCisgICAgLCBtX3VwZGF0ZURlbGVnYXRlZE92ZXJsYXlzRGlzcGF0
Y2hlZChmYWxzZSkKK3sKK30KKworV2ViUGFnZVByaXZhdGU6On5XZWJQYWdlUHJpdmF0ZSgpCit7
CisgICAgLy8gSGFuZCB0aGUgYmFja2luZ3N0b3JlIGJhY2sgdG8gYW5vdGhlciBvd25lciBpZiBu
ZWNlc3NhcnkuCisgICAgbV93ZWJQYWdlLT5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICBpZiAoQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9yZU93bmVyKCkgPT0gbV93ZWJQYWdl
KQorICAgICAgICBCYWNraW5nU3RvcmVQcml2YXRlOjpzZXRDdXJyZW50QmFja2luZ1N0b3JlT3du
ZXIoMCk7CisKKyAgICBkZWxldGUgbV93ZWJTZXR0aW5nczsKKyAgICBtX3dlYlNldHRpbmdzID0g
MDsKKworICAgIGRlbGV0ZSBtX2JhY2tpbmdTdG9yZUNsaWVudDsKKyAgICBtX2JhY2tpbmdTdG9y
ZUNsaWVudCA9IDA7CisgICAgbV9iYWNraW5nU3RvcmUgPSAwOworCisgICAgZGVsZXRlIG1fcGFn
ZTsKKyAgICBtX3BhZ2UgPSAwOworCisgICAgZGVsZXRlIG1fdHJhbnNmb3JtYXRpb25NYXRyaXg7
CisgICAgbV90cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IDA7CisKKyAgICBkZWxldGUgbV9pblBhZ2VT
ZWFyY2hNYW5hZ2VyOworICAgIG1faW5QYWdlU2VhcmNoTWFuYWdlciA9IDA7CisKKyAgICBkZWxl
dGUgbV9zZWxlY3Rpb25IYW5kbGVyOworICAgIG1fc2VsZWN0aW9uSGFuZGxlciA9IDA7CisKKyAg
ICBkZWxldGUgbV9pbnB1dEhhbmRsZXI7CisgICAgbV9pbnB1dEhhbmRsZXIgPSAwOworCisgICAg
ZGVsZXRlIG1fdG91Y2hFdmVudEhhbmRsZXI7CisgICAgbV90b3VjaEV2ZW50SGFuZGxlciA9IDA7
CisKKyNpZiBFTkFCTEVfRFJUCisgICAgZGVsZXRlIG1fZHVtcFJlbmRlclRyZWU7CisgICAgbV9k
dW1wUmVuZGVyVHJlZSA9IDA7CisjZW5kaWYKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6aW5p
dChjb25zdCBXZWJTdHJpbmcmIHBhZ2VHcm91cE5hbWUpCit7CisgICAgQ2hyb21lQ2xpZW50Qmxh
Y2tCZXJyeSogY2hyb21lQ2xpZW50ID0gbmV3IENocm9tZUNsaWVudEJsYWNrQmVycnkodGhpcyk7
CisgICAgQ29udGV4dE1lbnVDbGllbnRCbGFja0JlcnJ5KiBjb250ZXh0TWVudUNsaWVudCA9IDA7
CisjaWYgRU5BQkxFKENPTlRFWFRfTUVOVVMpCisgICAgY29udGV4dE1lbnVDbGllbnQgPSBuZXcg
Q29udGV4dE1lbnVDbGllbnRCbGFja0JlcnJ5KCk7CisjZW5kaWYKKyAgICBFZGl0b3JDbGllbnRC
bGFja0JlcnJ5KiBlZGl0b3JDbGllbnQgPSBuZXcgRWRpdG9yQ2xpZW50QmxhY2tCZXJyeSh0aGlz
KTsKKyAgICBEcmFnQ2xpZW50QmxhY2tCZXJyeSogZHJhZ0NsaWVudCA9IDA7CisjaWYgRU5BQkxF
KERSQUdfU1VQUE9SVCkKKyAgICBkcmFnQ2xpZW50ID0gbmV3IERyYWdDbGllbnRCbGFja0JlcnJ5
KCk7CisjZW5kaWYKKyAgICBJbnNwZWN0b3JDbGllbnRCbGFja0JlcnJ5KiBpbnNwZWN0b3JDbGll
bnQgPSAwOworI2lmIEVOQUJMRShJTlNQRUNUT1IpCisgICAgaW5zcGVjdG9yQ2xpZW50ID0gbmV3
IEluc3BlY3RvckNsaWVudEJsYWNrQmVycnkodGhpcyk7CisjZW5kaWYKKworICAgIEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeSogZnJhbWVMb2FkZXJDbGllbnQgPSBuZXcgRnJhbWVMb2FkZXJD
bGllbnRCbGFja0JlcnJ5KCk7CisKKyAgICBQYWdlOjpQYWdlQ2xpZW50cyBwYWdlQ2xpZW50czsK
KyAgICBwYWdlQ2xpZW50cy5jaHJvbWVDbGllbnQgPSBjaHJvbWVDbGllbnQ7CisgICAgcGFnZUNs
aWVudHMuY29udGV4dE1lbnVDbGllbnQgPSBjb250ZXh0TWVudUNsaWVudDsKKyAgICBwYWdlQ2xp
ZW50cy5lZGl0b3JDbGllbnQgPSBlZGl0b3JDbGllbnQ7CisgICAgcGFnZUNsaWVudHMuZHJhZ0Ns
aWVudCA9IGRyYWdDbGllbnQ7CisgICAgcGFnZUNsaWVudHMuaW5zcGVjdG9yQ2xpZW50ID0gaW5z
cGVjdG9yQ2xpZW50OworCisjaWYgRU5BQkxFKENMSUVOVF9CQVNFRF9HRU9MT0NBVElPTikKKyAg
ICAvLyBOb3RlIHRoZSBvYmplY3Qgd2lsbCBiZSBkZXN0cm95ZWQgd2hlbiB0aGUgcGFnZSBpcyBk
ZXN0cm95ZWQuCisjaWYgRU5BQkxFX0RSVAorICAgIGlmIChnZXRlbnYoImRydFJ1biIpKQorICAg
ICAgICBwYWdlQ2xpZW50cy5nZW9sb2NhdGlvbkNsaWVudCA9IG5ldyBHZW9sb2NhdGlvbkNsaWVu
dE1vY2soKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgcGFnZUNsaWVudHMuZ2VvbG9jYXRp
b25DbGllbnQgPSBtX2dlb2xvY2F0aW9uQ2xpZW50ID0gbmV3IEdlb2xvY2F0aW9uQ29udHJvbGxl
ckNsaWVudEJsYWNrQmVycnkodGhpcyk7CisjZWxzZQorICAgIHBhZ2VDbGllbnRzLmdlb2xvY2F0
aW9uQ2xpZW50ID0gbV9nZW9sb2NhdGlvbkNsaWVudDsKKyNlbmRpZgorCisgICAgcGFnZUNsaWVu
dHMuZGV2aWNlTW90aW9uQ2xpZW50ID0gbmV3IERldmljZU1vdGlvbkNsaWVudEJsYWNrQmVycnko
dGhpcyk7CisgICAgcGFnZUNsaWVudHMuZGV2aWNlT3JpZW50YXRpb25DbGllbnQgPSBuZXcgRGV2
aWNlT3JpZW50YXRpb25DbGllbnRCbGFja0JlcnJ5KHRoaXMpOworICAgIG1fcGFnZSA9IG5ldyBQ
YWdlKHBhZ2VDbGllbnRzKTsKKworI2lmIEVOQUJMRShDTElFTlRfQkFTRURfR0VPTE9DQVRJT04p
ICYmIEVOQUJMRV9EUlQKKyAgICAvLyBJbiBjYXNlIHJ1bm5pbmcgaW4gRHVtcFJlbmRlclRyZWUg
bW9kZSBzZXQgdGhlIGNvbnRyb2xsZXIgdG8gbW9jayBwcm92aWRlci4KKyAgICBpZiAoZ2V0ZW52
KCJkcnRSdW4iKSkKKyAgICAgICAgc3RhdGljX2Nhc3Q8R2VvbG9jYXRpb25DbGllbnRNb2NrKj4o
cGFnZUNsaWVudHMuZ2VvbG9jYXRpb25DbGllbnQpLT5zZXRDb250cm9sbGVyKG1fcGFnZS0+Z2Vv
bG9jYXRpb25Db250cm9sbGVyKCkpOworI2VuZGlmCisKKyAgICBtX3BhZ2UtPnNldEN1c3RvbUhU
TUxUb2tlbml6ZXJDaHVua1NpemUoMjU2KTsKKyAgICBtX3BhZ2UtPnNldEN1c3RvbUhUTUxUb2tl
bml6ZXJUaW1lRGVsYXkoMC4zKTsKKworICAgIG1fd2ViU2V0dGluZ3MgPSBXZWJTZXR0aW5nczo6
Y3JlYXRlRnJvbVN0YW5kYXJkU2V0dGluZ3MoKTsKKworICAgIC8vIEZJWE1FOiBXZSBleHBsaWNp
dGx5IGNhbGwgc2V0RGVsZWdhdGUoKSBpbnN0ZWFkIG9mIHBhc3Npbmcgb3Vyc2VsZiBpbiBjcmVh
dGVGcm9tU3RhbmRhcmRTZXR0aW5ncygpCisgICAgLy8gc28gdGhhdCB3ZSBvbmx5IGdldCBvbmUg
ZGlkQ2hhbmdlU2V0dGluZ3MoKSBjYWxsYmFjayB3aGVuIHdlIHNldCB0aGUgcGFnZSBncm91cCBu
YW1lLiBUaGlzIGNhdXNlcyB1cworICAgIC8vIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBXZWJTZXR0
aW5ncyBzaW5jZSBzb21lIFdlYlNldHRpbmdzIG1ldGhvZCBtYWtlIHVzZSBvZiB0aGUgcGFnZSBn
cm91cCBuYW1lLgorICAgIC8vIEluc3RlYWQsIHdlIHNob3VsZG4ndCBiZSBzdG9yaW5nIHRoZSBw
YWdlIGdyb3VwIG5hbWUgaW4gV2ViU2V0dGluZ3MuCisgICAgbV93ZWJTZXR0aW5ncy0+c2V0RGVs
ZWdhdGUodGhpcyk7CisgICAgbV93ZWJTZXR0aW5ncy0+c2V0UGFnZUdyb3VwTmFtZShwYWdlR3Jv
dXBOYW1lKTsKKworICAgIFJlZlB0cjxGcmFtZT4gbmV3RnJhbWUgPSBGcmFtZTo6Y3JlYXRlKG1f
cGFnZSwgLyogSFRNTEZyYW1lT3duZXJFbGVtZW50KiAqLyAwLCBmcmFtZUxvYWRlckNsaWVudCk7
CisKKyAgICBtX21haW5GcmFtZSA9IG5ld0ZyYW1lLmdldCgpOworICAgIGZyYW1lTG9hZGVyQ2xp
ZW50LT5zZXRGcmFtZShtX21haW5GcmFtZSwgdGhpcyk7CisgICAgbV9tYWluRnJhbWUtPmluaXQo
KTsKKworI2lmIEVOQUJMRShXRUJHTCkKKyAgICBQbGF0Zm9ybTo6U2V0dGluZ3MqIHNldHRpbmdz
ID0gUGxhdGZvcm06OlNldHRpbmdzOjpnZXQoKTsKKyAgICBtX3BhZ2UtPnNldHRpbmdzKCktPnNl
dFdlYkdMRW5hYmxlZChzZXR0aW5ncyAmJiBzZXR0aW5ncy0+aXNXZWJHTFN1cHBvcnRlZCgpKTsK
KyNlbmRpZgorI2lmIEVOQUJMRShTS0lBX0dQVV9DQU5WQVMpCisgICAgbV9wYWdlLT5zZXR0aW5n
cygpLT5zZXRDYW52YXNVc2VzQWNjZWxlcmF0ZWREcmF3aW5nKHRydWUpOworICAgIG1fcGFnZS0+
c2V0dGluZ3MoKS0+c2V0QWNjZWxlcmF0ZWQyZENhbnZhc0VuYWJsZWQodHJ1ZSk7CisjZW5kaWYK
KyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9XKQorICAgIG1fcGFnZS0+c2V0dGluZ3MoKS0+c2V0
VGV4dFJlZmxvd0VuYWJsZWQobV93ZWJTZXR0aW5ncy0+dGV4dFJlZmxvd01vZGUoKSA9PSBXZWJT
ZXR0aW5nczo6VGV4dFJlZmxvd0VuYWJsZWQpOworI2VuZGlmCisKKyAgICBtX3BhZ2UtPnNldHRp
bmdzKCktPnNldFVzZUhpeGllNzZXZWJTb2NrZXRQcm90b2NvbChmYWxzZSk7CisgICAgbV9wYWdl
LT5zZXR0aW5ncygpLT5zZXRJbnRlcmFjdGl2ZUZvcm1WYWxpZGF0aW9uRW5hYmxlZCh0cnVlKTsK
KyAgICBtX3BhZ2UtPnNldHRpbmdzKCktPnNldEFsbG93VW5pdmVyc2FsQWNjZXNzRnJvbUZpbGVV
UkxzKGZhbHNlKTsKKworICAgIG1fYmFja2luZ1N0b3JlQ2xpZW50ID0gQmFja2luZ1N0b3JlQ2xp
ZW50OjpjcmVhdGUobV9tYWluRnJhbWUsIC8qIHBhcmVudCBmcmFtZSAqLyAwLCBtX3dlYlBhZ2Up
OworICAgIC8vIFRoZSBkaXJlY3QgYWNjZXNzIHRvIEJhY2tpbmdTdG9yZSBpcyBsZWZ0IGhlcmUg
Zm9yIGNvbnZlbmllbmNlIHNpbmNlIGl0CisgICAgLy8gaXMgb3duZWQgYnkgQmFja2luZ1N0b3Jl
Q2xpZW50IGFuZCB0aGVuIGRlbGV0ZWQgYnkgaXRzIGRlc3RydWN0b3IuCisgICAgbV9iYWNraW5n
U3RvcmUgPSBtX2JhY2tpbmdTdG9yZUNsaWVudC0+YmFja2luZ1N0b3JlKCk7CisKKyAgICBtX3Bh
Z2UtPnNldHRpbmdzKCktPnNldFNwYXRpYWxOYXZpZ2F0aW9uRW5hYmxlZChtX3dlYlNldHRpbmdz
LT5pc1NwYXRpYWxOYXZpZ2F0aW9uRW5hYmxlZCgpKTsKKyAgICBibG9ja0NsaWNrUmFkaXVzID0g
aW50KHJvdW5kZigwLjM1ICogUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OnBpeGVsc1Blcklu
Y2goMCkud2lkdGgoKSkpOyAvLyBUaGUgY2xpY2tlZCByZWN0YW5nbGUgYXJlYSBzaG91bGQgYmUg
YSBmaXhlZCB1bml0IG9mIG1lYXN1cmVtZW50LgorCisgICAgbV9wYWdlLT5zZXR0aW5ncygpLT5z
ZXREZWxlZ2F0ZVNlbGVjdGlvblBhaW50KHRydWUpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRl
Ojpsb2FkKGNvbnN0IGNoYXIqIHVybCwgY29uc3QgY2hhciogbmV0d29ya1Rva2VuLCBjb25zdCBj
aGFyKiBtZXRob2QsIFBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6Q2FjaGVQb2xpY3kgY2FjaGVQ
b2xpY3ksIGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBkYXRhTGVuZ3RoLCBjb25zdCBjaGFyKiBj
b25zdCogaGVhZGVycywgc2l6ZV90IGhlYWRlcnNMZW5ndGgsIGJvb2wgaXNJbml0aWFsLCBib29s
IG11c3RIYW5kbGVJbnRlcm5hbGx5LCBib29sIGZvcmNlRG93bmxvYWQsIGNvbnN0IGNoYXIqIG92
ZXJyaWRlQ29udGVudFR5cGUpCit7CisgICAgc3RvcEN1cnJlbnRMb2FkKCk7CisKKyAgICBTdHJp
bmcgdXJsU3RyaW5nKHVybCk7CisgICAgaWYgKHVybFN0cmluZy5zdGFydHNXaXRoKCJ2czoiLCBm
YWxzZSkpIHsKKyAgICAgICAgdXJsU3RyaW5nID0gdXJsU3RyaW5nLnN1YnN0cmluZygzKTsKKyAg
ICAgICAgbV9tYWluRnJhbWUtPnNldEluVmlld1NvdXJjZU1vZGUodHJ1ZSk7CisgICAgfSBlbHNl
CisgICAgICAgIG1fbWFpbkZyYW1lLT5zZXRJblZpZXdTb3VyY2VNb2RlKGZhbHNlKTsKKworICAg
IEtVUkwga3VybCA9IHBhcnNlVXJsKHVybFN0cmluZyk7CisgICAgaWYgKHByb3RvY29sSXMoa3Vy
bCwgImphdmFzY3JpcHQiKSkgeworICAgICAgICAvLyBOZXZlciBydW4gamF2YXNjcmlwdCB3aGls
ZSBsb2FkaW5nIGlzIGRlZmVycmVkLgorICAgICAgICBpZiAobV9wYWdlLT5kZWZlcnNMb2FkaW5n
KCkpIHsKKyAgICAgICAgICAgIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeSogZnJhbWVMb2Fk
ZXJDbGllbnQgPSBzdGF0aWNfY2FzdDxGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkqPihtX21h
aW5GcmFtZS0+bG9hZGVyKCktPmNsaWVudCgpKTsKKyAgICAgICAgICAgIGZyYW1lTG9hZGVyQ2xp
ZW50LT5zZXREZWZlcnJlZE1hbnVhbFNjcmlwdChrdXJsKTsKKyAgICAgICAgfSBlbHNlCisgICAg
ICAgICAgICBtX21haW5GcmFtZS0+c2NyaXB0KCktPmV4ZWN1dGVJZkphdmFTY3JpcHRVUkwoa3Vy
bCwgRG9Ob3RSZXBsYWNlRG9jdW1lbnRJZkphdmFTY3JpcHRVUkwpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgaWYgKGlzSW5pdGlhbCkKKyAgICAgICAgTmV0d29ya01hbmFnZXI6Omlu
c3RhbmNlKCktPnNldEluaXRpYWxVUkwoa3VybCk7CisKKyAgICBSZXNvdXJjZVJlcXVlc3QgcmVx
dWVzdChrdXJsLCAiIiAvKiByZWZlcnJlciAqLyk7CisgICAgcmVxdWVzdC5zZXRUb2tlbihuZXR3
b3JrVG9rZW4pOworICAgIGlmIChpc0luaXRpYWwgfHwgbXVzdEhhbmRsZUludGVybmFsbHkpCisg
ICAgICAgIHJlcXVlc3Quc2V0TXVzdEhhbmRsZUludGVybmFsbHkodHJ1ZSk7CisgICAgcmVxdWVz
dC5zZXRIVFRQTWV0aG9kKG1ldGhvZCk7CisgICAgcmVxdWVzdC5zZXRDYWNoZVBvbGljeSh0b1dl
YkNvcmVDYWNoZVBvbGljeShjYWNoZVBvbGljeSkpOworICAgIGlmIChvdmVycmlkZUNvbnRlbnRU
eXBlKQorICAgICAgICByZXF1ZXN0LnNldE92ZXJyaWRlQ29udGVudFR5cGUob3ZlcnJpZGVDb250
ZW50VHlwZSk7CisKKyAgICBpZiAoZGF0YSkKKyAgICAgICAgcmVxdWVzdC5zZXRIVFRQQm9keShG
b3JtRGF0YTo6Y3JlYXRlKGRhdGEsIGRhdGFMZW5ndGgpKTsKKworICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgKyAxIDwgaGVhZGVyc0xlbmd0aDsgaSArPSAyKQorICAgICAgICByZXF1ZXN0LmFk
ZEhUVFBIZWFkZXJGaWVsZChoZWFkZXJzW2ldLCBoZWFkZXJzW2kgKyAxXSk7CisKKyAgICBpZiAo
Zm9yY2VEb3dubG9hZCkKKyAgICAgICAgcmVxdWVzdC5zZXRGb3JjZURvd25sb2FkKHRydWUpOwor
CisgICAgbV9tYWluRnJhbWUtPmxvYWRlcigpLT5sb2FkKHJlcXVlc3QsICIiIC8qIG5hbWUgKi8s
IGZhbHNlKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6bG9hZFN0cmluZyhjb25zdCBjaGFy
KiBzdHJpbmcsIGNvbnN0IGNoYXIqIGJhc2VVUkwsIGNvbnN0IGNoYXIqIGNvbnRlbnRUeXBlLCBj
b25zdCBjaGFyKiBmYWlsaW5nVVJMKQoreworICAgIEtVUkwga3VybCA9IHBhcnNlVXJsKGJhc2VV
UkwpOworICAgIFJlc291cmNlUmVxdWVzdCByZXF1ZXN0KGt1cmwpOworICAgIFdURjo6UmVmUHRy
PFNoYXJlZEJ1ZmZlcj4gYnVmZmVyCisgICAgICAgID0gU2hhcmVkQnVmZmVyOjpjcmVhdGUoc3Ry
aW5nLCBzdHJsZW4oc3RyaW5nKSk7CisgICAgU3Vic3RpdHV0ZURhdGEgc3Vic3RpdHV0ZURhdGEo
YnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RNSU1FVHlw
ZUZyb21NZWRpYVR5cGUoY29udGVudFR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGV4dHJhY3RDaGFyc2V0RnJvbU1lZGlhVHlwZShjb250ZW50VHlwZSksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGluZ1VSTCA/IHBhcnNlVXJsKGZhaWxpbmdV
UkwpIDogS1VSTCgpKTsKKyAgICBtX21haW5GcmFtZS0+bG9hZGVyKCktPmxvYWQocmVxdWVzdCwg
c3Vic3RpdHV0ZURhdGEsIGZhbHNlKTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6ZXhlY3V0
ZUphdmFTY3JpcHQoY29uc3QgY2hhciogc2NyaXB0LCBKYXZhU2NyaXB0RGF0YVR5cGUmIHJldHVy
blR5cGUsIFdlYlN0cmluZyYgcmV0dXJuVmFsdWUpCit7CisgICAgU2NyaXB0VmFsdWUgcmVzdWx0
ID0gbV9tYWluRnJhbWUtPnNjcmlwdCgpLT5leGVjdXRlU2NyaXB0KFN0cmluZzo6ZnJvbVVURjgo
c2NyaXB0KSwgZmFsc2UpOworICAgIEpTQzo6SlNWYWx1ZSB2YWx1ZSA9IHJlc3VsdC5qc1ZhbHVl
KCk7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICByZXR1cm5UeXBlID0gSlNFeGNlcHRpb247
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBKU0M6OkV4ZWNTdGF0ZSogZXhl
YyA9IG1fbWFpbkZyYW1lLT5zY3JpcHQoKS0+Z2xvYmFsT2JqZWN0KG1haW5UaHJlYWROb3JtYWxX
b3JsZCgpKS0+Z2xvYmFsRXhlYygpOworICAgIEpTR2xvYmFsQ29udGV4dFJlZiBjb250ZXh0ID0g
dG9HbG9iYWxSZWYoZXhlYyk7CisKKyAgICBKU1R5cGUgdHlwZSA9IEpTVmFsdWVHZXRUeXBlKGNv
bnRleHQsIHRvUmVmKGV4ZWMsIHZhbHVlKSk7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBj
YXNlIGtKU1R5cGVOdWxsOgorICAgICAgICByZXR1cm5UeXBlID0gSlNOdWxsOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIGtKU1R5cGVCb29sZWFuOgorICAgICAgICByZXR1cm5UeXBlID0gSlNC
b29sZWFuOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGtKU1R5cGVOdW1iZXI6CisgICAgICAg
IHJldHVyblR5cGUgPSBKU051bWJlcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrSlNUeXBl
U3RyaW5nOgorICAgICAgICByZXR1cm5UeXBlID0gSlNTdHJpbmc7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2Uga0pTVHlwZU9iamVjdDoKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTT2JqZWN0Owor
ICAgICAgICBicmVhazsKKyAgICBjYXNlIGtKU1R5cGVVbmRlZmluZWQ6CisgICAgZGVmYXVsdDoK
KyAgICAgICAgcmV0dXJuVHlwZSA9IEpTVW5kZWZpbmVkOworICAgICAgICBicmVhazsKKyAgICB9
CisKKyAgICBpZiAocmV0dXJuVHlwZSA9PSBKU0Jvb2xlYW4gfHwgcmV0dXJuVHlwZSA9PSBKU051
bWJlciB8fCByZXR1cm5UeXBlID09IEpTU3RyaW5nIHx8IHJldHVyblR5cGUgPT0gSlNPYmplY3Qp
IHsKKyAgICAgICAgU3RyaW5nIHN0ciA9IHJlc3VsdC50b1N0cmluZyhleGVjKTsKKyAgICAgICAg
cmV0dXJuVmFsdWUgPSBXZWJTdHJpbmcoc3RyLmltcGwoKSk7CisgICAgfQorCisgICAgcmV0dXJu
IHRydWU7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmV4ZWN1dGVKYXZhU2NyaXB0SW5Jc29s
YXRlZFdvcmxkKGNvbnN0IFNjcmlwdFNvdXJjZUNvZGUmIHNvdXJjZUNvZGUsIEphdmFTY3JpcHRE
YXRhVHlwZSYgcmV0dXJuVHlwZSwgV2ViU3RyaW5nJiByZXR1cm5WYWx1ZSkKK3sKKyAgICBpZiAo
IW1faXNvbGF0ZWRXb3JsZCkKKyAgICAgICAgbV9pc29sYXRlZFdvcmxkID0gbV9tYWluRnJhbWUt
PnNjcmlwdCgpLT5jcmVhdGVXb3JsZCgpOworCisgICAgLy8gVXNlIGV2YWx1YXRlSW5Xb3JsZCB0
byBhdm9pZCBjYW5FeGVjdXRlU2NyaXB0cyBjaGVjay4KKyAgICBTY3JpcHRWYWx1ZSByZXN1bHQg
PSBtX21haW5GcmFtZS0+c2NyaXB0KCktPmV2YWx1YXRlSW5Xb3JsZChzb3VyY2VDb2RlLCBtX2lz
b2xhdGVkV29ybGQuZ2V0KCkpOworICAgIEpTQzo6SlNWYWx1ZSB2YWx1ZSA9IHJlc3VsdC5qc1Zh
bHVlKCk7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICByZXR1cm5UeXBlID0gSlNFeGNlcHRp
b247CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBKU0M6OkV4ZWNTdGF0ZSog
ZXhlYyA9IG1fbWFpbkZyYW1lLT5zY3JpcHQoKS0+Z2xvYmFsT2JqZWN0KG1faXNvbGF0ZWRXb3Js
ZC5nZXQoKSktPmdsb2JhbEV4ZWMoKTsKKyAgICBKU0dsb2JhbENvbnRleHRSZWYgY29udGV4dCA9
IHRvR2xvYmFsUmVmKGV4ZWMpOworCisgICAgSlNUeXBlIHR5cGUgPSBKU1ZhbHVlR2V0VHlwZShj
b250ZXh0LCB0b1JlZihleGVjLCB2YWx1ZSkpOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAg
Y2FzZSBrSlNUeXBlTnVsbDoKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTTnVsbDsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBrSlNUeXBlQm9vbGVhbjoKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpT
Qm9vbGVhbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrSlNUeXBlTnVtYmVyOgorICAgICAg
ICByZXR1cm5UeXBlID0gSlNOdW1iZXI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0pTVHlw
ZVN0cmluZzoKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTU3RyaW5nOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIGtKU1R5cGVPYmplY3Q6CisgICAgICAgIHJldHVyblR5cGUgPSBKU09iamVjdDsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrSlNUeXBlVW5kZWZpbmVkOgorICAgIGRlZmF1bHQ6
CisgICAgICAgIHJldHVyblR5cGUgPSBKU1VuZGVmaW5lZDsKKyAgICAgICAgYnJlYWs7CisgICAg
fQorCisgICAgaWYgKHJldHVyblR5cGUgPT0gSlNCb29sZWFuIHx8IHJldHVyblR5cGUgPT0gSlNO
dW1iZXIgfHwgcmV0dXJuVHlwZSA9PSBKU1N0cmluZyB8fCByZXR1cm5UeXBlID09IEpTT2JqZWN0
KSB7CisgICAgICAgIFN0cmluZyBzdHIgPSByZXN1bHQudG9TdHJpbmcoZXhlYyk7CisgICAgICAg
IHJldHVyblZhbHVlID0gV2ViU3RyaW5nKHN0ci5pbXBsKCkpOworICAgIH0KKworICAgIHJldHVy
biB0cnVlOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzdG9wQ3VycmVudExvYWQoKQorewor
ICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNvbnRhaW4gYWxsIGNvbW1vbiBjb2RlIHRyaWdn
ZXJlZCBieSBXZWJQYWdlOjpsb2FkCisgICAgLy8gKHdoaWNoIHN0b3BzIGFueSBsb2FkIGluIHBy
b2dyZXNzIGJlZm9yZSBzdGFydGluZyB0aGUgbmV3IGxvYWQpIGFuZAorICAgIC8vIFdlYlBhZ2U6
OnN0b3Bsb2FkaW5nICh0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBjbGllbnQgdG8gc3RvcCB0aGUg
bG9hZAorICAgIC8vIGV4cGxpY2l0bHkpLiBJZiBpdCBzaG91bGQgb25seSBiZSBkb25lIHdoaWxl
IHN0b3BwaW5nIHRoZSBsb2FkCisgICAgLy8gZXhwbGljaXRseSwgaXQgZ29lcyBpbiBXZWJQYWdl
OjpzdG9wTG9hZGluZywgbm90IGhlcmUuCisgICAgbV9tYWluRnJhbWUtPmxvYWRlcigpLT5zdG9w
QWxsTG9hZGVycygpOworCisgICAgLy8gQ2FuY2VsIGFueSBkZWZlcnJlZCBzY3JpcHQgdGhhdCBo
YXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LgorICAgIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJy
eSogZnJhbWVMb2FkZXJDbGllbnQgPSBzdGF0aWNfY2FzdDxGcmFtZUxvYWRlckNsaWVudEJsYWNr
QmVycnkqPihtX21haW5GcmFtZS0+bG9hZGVyKCktPmNsaWVudCgpKTsKKyAgICBmcmFtZUxvYWRl
ckNsaWVudC0+c2V0RGVmZXJyZWRNYW51YWxTY3JpcHQoS1VSTCgpKTsKK30KKworc3RhdGljIHZv
aWQgY2xvc2VVUkxSZWN1cnNpdmVseShGcmFtZSogZnJhbWUpCit7CisgICAgLy8gRG8gbm90IGNy
ZWF0ZSBtb3JlIGZyYW1lIHBsZWFzZS4KKyAgICBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkq
IGZyYW1lTG9hZGVyQ2xpZW50ID0gc3RhdGljX2Nhc3Q8RnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5Kj4oZnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKSk7CisgICAgZnJhbWVMb2FkZXJDbGllbnQt
PnN1cHByZXNzQ2hpbGRGcmFtZUNyZWF0aW9uKCk7CisKKyAgICBmcmFtZS0+bG9hZGVyKCktPmNs
b3NlVVJMKCk7CisKKyAgICBWZWN0b3I8UmVmUHRyPEZyYW1lPiwgMTA+IGNoaWxkRnJhbWVzOwor
CisgICAgZm9yIChSZWZQdHI8RnJhbWU+IGNoaWxkRnJhbWUgPSBmcmFtZS0+dHJlZSgpLT5maXJz
dENoaWxkKCk7IGNoaWxkRnJhbWU7IGNoaWxkRnJhbWUgPSBjaGlsZEZyYW1lLT50cmVlKCktPm5l
eHRTaWJsaW5nKCkpCisgICAgICAgIGNoaWxkRnJhbWVzLmFwcGVuZChjaGlsZEZyYW1lKTsKKwor
ICAgIHVuc2lnbmVkIHNpemUgPSBjaGlsZEZyYW1lcy5zaXplKCk7CisgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgY2xvc2VVUkxSZWN1cnNpdmVseShjaGls
ZEZyYW1lc1tpXS5nZXQoKSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnByZXBhcmVUb0Rl
c3Ryb3koKQoreworICAgIC8vIEJlZm9yZSB0aGUgY2xpZW50IHN0YXJ0cyB0ZWFyaW5nIGl0c2Vs
ZiBkb3duLCBkaXNwYXRjaCB0aGUgdW5sb2FkIGV2ZW50CisgICAgLy8gc28gaXQgY2FuIHRha2Ug
ZWZmZWN0IHdoaWxlIGFsbCB0aGUgY2xpZW50J3Mgc3RhdGUgKGUuZy4gc2Nyb2xsIHBvc2l0aW9u
KQorICAgIC8vIGlzIHN0aWxsIHByZXNlbnQuCisgICAgY2xvc2VVUkxSZWN1cnNpdmVseShtX21h
aW5GcmFtZSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldExvYWRTdGF0ZShMb2FkU3Rh
dGUgc3RhdGUpCit7CisgICAgaWYgKG1fbG9hZFN0YXRlID09IHN0YXRlKQorICAgICAgICByZXR1
cm47CisKKyAgICBib29sIGlzRmlyc3RMb2FkID0gbV9sb2FkU3RhdGUgPT0gTm9uZTsKKworICAg
IC8vIFNlZSBSSU0gQnVnICMxMDY4LgorICAgIGlmIChzdGF0ZSA9PSBGaW5pc2hlZCAmJiBtX21h
aW5GcmFtZSAmJiBtX21haW5GcmFtZS0+ZG9jdW1lbnQoKSkKKyAgICAgICAgbV9tYWluRnJhbWUt
PmRvY3VtZW50KCktPnVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKKworICAgIG1fbG9hZFN0YXRlID0g
c3RhdGU7CisKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICBQbGF0Zm9ybTo6bG9nKFBsYXRm
b3JtOjpMb2dMZXZlbEluZm8sICJXZWJQYWdlUHJpdmF0ZTo6c2V0TG9hZFN0YXRlICVkIiwgc3Rh
dGUpOworI2VuZGlmCisKKyAgICBzd2l0Y2ggKG1fbG9hZFN0YXRlKSB7CisgICAgY2FzZSBQcm92
aXNpb25hbDoKKyAgICAgICAgaWYgKGlzRmlyc3RMb2FkKSB7CisgICAgICAgICAgICAvLyBQYWlu
dHMgdGhlIHZpc2libGUgYmFja2luZ3N0b3JlIGFzIHdoaXRlIHRvIHByZXZlbnQgaW5pdGlhbCBj
aGVja2VyYm9hcmQgb24KKyAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBibGl0LgorICAgICAgICAg
ICAgaWYgKG1fYmFja2luZ1N0b3JlLT5kLT5yZW5kZXJWaXNpYmxlQ29udGVudHMoKSAmJiAhbV9i
YWNraW5nU3RvcmUtPmQtPmlzU3VzcGVuZGVkKCkgJiYgIW1fYmFja2luZ1N0b3JlLT5kLT5zaG91
bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKQorICAgICAgICAgICAgICAgIG1fYmFja2luZ1N0
b3JlLT5kLT5ibGl0VmlzaWJsZUNvbnRlbnRzKCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBDb21taXR0ZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2NoZWR1bGVa
b29tQWJvdXRQb2ludCgpOworCisjaWYgRU5BQkxFKFNLSUFfR1BVX0NBTlZBUykKKyAgICAgICAg
ICAgIGlmIChtX3BhZ2UtPnNldHRpbmdzKCktPmNhbnZhc1VzZXNBY2NlbGVyYXRlZERyYXdpbmco
KSkgeworICAgICAgICAgICAgICAgIC8vIEZyZWUgR1BVIHJlc291cmNlcyBhcyB3ZSdyZSBvbiBh
IG5ldyBwYWdlLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBoZWxwIHVzIHRvIGZyZWUg
bWVtb3J5IHByZXNzdXJlLgorICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpHcmFwaGljczo6bWFr
ZVNoYXJlZFJlc291cmNlQ29udGV4dEN1cnJlbnQoUGxhdGZvcm06OkdyYXBoaWNzOjpHTEVTMik7
CisgICAgICAgICAgICAgICAgR3JDb250ZXh0KiBnckNvbnRleHQgPSBQbGF0Zm9ybTo6R3JhcGhp
Y3M6OmdldEdyQ29udGV4dCgpOworICAgICAgICAgICAgICAgIGdyQ29udGV4dC0+ZnJlZUdwdVJl
c291cmNlcygpOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyNpZiBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCisgICAgICAgICAgICAvLyBGSVhNRTogY29tcG9zaXRvciBtYXkgb25seSBi
ZSB0b3VjaGVkIG9uIHRoZSBjb21wb3NpdGluZyB0aHJlYWQuCisgICAgICAgICAgICAvLyBIb3dl
dmVyLCBpdCdzIGNyZWF0ZWQvZGVzdHJveWVkIGJ5IGEgc3luYyBjb21tYW5kIHNvIHRoaXMgaXMg
aGFybWxlc3MuCisgICAgICAgICAgICBpZiAobV9jb21wb3NpdG9yKSB7CisgICAgICAgICAgICAg
ICAgbV9jb21wb3NpdG9yLT5zZXRMYXlvdXRSZWN0Rm9yQ29tcG9zaXRpbmcoSW50UmVjdCgpKTsK
KyAgICAgICAgICAgICAgICBtX2NvbXBvc2l0b3ItPnNldENvbnRlbnRzU2l6ZUZvckNvbXBvc2l0
aW5nKEludFNpemUoKSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIG1fcHJl
dmlvdXNDb250ZW50c1NpemUgPSBJbnRTaXplKCk7CisgICAgICAgICAgICBtX2JhY2tpbmdTdG9y
ZS0+ZC0+cmVzZXRSZW5kZXJRdWV1ZSgpOworICAgICAgICAgICAgbV9iYWNraW5nU3RvcmUtPmQt
PnJlc2V0VGlsZXModHJ1ZSAvKiByZXNldEJhY2tncm91bmQgKi8pOworICAgICAgICAgICAgbV9i
YWNraW5nU3RvcmUtPmQtPnNldFNjcm9sbGluZ09yWm9vbWluZyhmYWxzZSwgZmFsc2UgLyogc2hv
dWxkQmxpdCAqLyk7CisgICAgICAgICAgICBtX3VzZXJQZXJmb3JtZWRNYW51YWxab29tID0gZmFs
c2U7CisgICAgICAgICAgICBtX3VzZXJQZXJmb3JtZWRNYW51YWxTY3JvbGwgPSBmYWxzZTsKKyAg
ICAgICAgICAgIG1fc2hvdWxkVXNlRml4ZWREZXNrdG9wTW9kZSA9IGZhbHNlOworICAgICAgICAg
ICAgaWYgKG1fcmVzZXRWaXJ0dWFsVmlld3BvcnRPbkNvbW1pdHRlZCkgeyAvLyBGb3IgRFJULgor
ICAgICAgICAgICAgICAgIG1fdmlydHVhbFZpZXdwb3J0V2lkdGggPSAwOworICAgICAgICAgICAg
ICAgIG1fdmlydHVhbFZpZXdwb3J0SGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGlmIChtX3dlYlNldHRpbmdzLT52aWV3cG9ydFdpZHRoKCkgPiAwKSB7CisgICAgICAgICAg
ICAgICAgbV92aXJ0dWFsVmlld3BvcnRXaWR0aCA9IG1fd2ViU2V0dGluZ3MtPnZpZXdwb3J0V2lk
dGgoKTsKKyAgICAgICAgICAgICAgICBtX3ZpcnR1YWxWaWV3cG9ydEhlaWdodCA9IG1fZGVmYXVs
dExheW91dFNpemUuaGVpZ2h0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDaGVj
ayBpZiB3ZSBoYXZlIGFscmVhZHkgcHJvY2VzcyB0aGUgbWV0YSB2aWV3cG9ydCB0YWcsIHRoaXMg
b25seSBoYXBwZW5zIG9uIGhpc3RvcnkgbmF2aWdhdGlvbgorICAgICAgICAgICAgaWYgKCFtX2Rp
ZFJlc3RvcmVGcm9tUGFnZUNhY2hlKSB7CisgICAgICAgICAgICAgICAgbV92aWV3cG9ydEFyZ3Vt
ZW50cyA9IFZpZXdwb3J0QXJndW1lbnRzKCk7CisgICAgICAgICAgICAgICAgbV91c2VyU2NhbGFi
bGUgPSBtX3dlYlNldHRpbmdzLT5pc1VzZXJTY2FsYWJsZSgpOworICAgICAgICAgICAgICAgIHJl
c2V0U2NhbGVzKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEludFNp
emUgdmlydHVhbFZpZXdwb3J0ID0gcmVjb21wdXRlVmlydHVhbFZpZXdwb3J0RnJvbVZpZXdwb3J0
QXJndW1lbnRzKCk7CisgICAgICAgICAgICAgICAgbV93ZWJQYWdlLT5zZXRWaXJ0dWFsVmlld3Bv
cnRTaXplKHZpcnR1YWxWaWV3cG9ydC53aWR0aCgpLCB2aXJ0dWFsVmlld3BvcnQuaGVpZ2h0KCkp
OworICAgICAgICAgICAgfQorCisjaWYgRU5BQkxFKEVWRU5UX01PREVfTUVUQVRBR1MpCisgICAg
ICAgICAgICBkaWRSZWNlaXZlQ3Vyc29yRXZlbnRNb2RlKFByb2Nlc3NlZEN1cnNvckV2ZW50cyk7
CisgICAgICAgICAgICBkaWRSZWNlaXZlVG91Y2hFdmVudE1vZGUoUHJvY2Vzc2VkVG91Y2hFdmVu
dHMpOworI2VuZGlmCisKKyAgICAgICAgICAgIC8vIElmIGl0J3MgYSBvdXRtb3N0IFNWRyBkb2N1
bWVudCwgd2UgdXNlIEZpeGVkRGVza3RvcCBtb2RlLCBvdGhlcndpc2UKKyAgICAgICAgICAgIC8v
IHdlIGRlZmF1bHQgdG8gTW9iaWxlIG1vZGUuIEZvciBleGFtcGxlLCB1c2luZyBGaXhlZERlc2t0
b3AgbW9kZSB0bworICAgICAgICAgICAgLy8gcmVuZGVyIGh0dHA6Ly93d3cuY3JvY3ppbGxhLmNv
bS9iaXRzX2FuZF9waWVjZXMvc3ZnL3NhbXBsZXMvdGlnZXIvdGlnZXIuc3ZnCisgICAgICAgICAg
ICAvLyBpcyB1c2VyLWV4cGVyaWVuY2UgZnJpZW5kbHkuCisgICAgICAgICAgICBpZiAobV9wYWdl
LT5tYWluRnJhbWUoKS0+ZG9jdW1lbnQoKS0+aXNTVkdEb2N1bWVudCgpKSB7CisgICAgICAgICAg
ICAgICAgc2V0U2hvdWxkVXNlRml4ZWREZXNrdG9wTW9kZSh0cnVlKTsKKyAgICAgICAgICAgICAg
ICBzZXRWaWV3TW9kZShGaXhlZERlc2t0b3ApOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAg
ICAgICAgICAgc2V0Vmlld01vZGUoTW9iaWxlKTsKKworICAgICAgICAgICAgLy8gUmVzZXQgYmxv
Y2sgem9vbSBhbmQgcmVmbG93LgorICAgICAgICAgICAgcmVzZXRCbG9ja1pvb20oKTsKKyNpZiBF
TkFCTEUoVklFV1BPUlRfUkVGTE9XKQorICAgICAgICAgICAgdG9nZ2xlVGV4dFJlZmxvd0lmRW5h
YmxlZEZvckJsb2NrWm9vbU9ubHkoKTsKKyNlbmRpZgorCisgICAgICAgICAgICAvLyBTZXQgdGhl
IHNjcm9sbCB0byBvcmlnaW4gaGVyZSBhbmQgbm90aWZ5IHRoZSBjbGllbnQgc2luY2Ugd2UnbGwg
YmUKKyAgICAgICAgICAgIC8vIHpvb21pbmcgYmVsb3cgd2l0aG91dCBhbnkgcmVhbCBjb250ZW50
cyB5ZXQgdGh1cyB0aGUgY29udGVudHMgc2l6ZQorICAgICAgICAgICAgLy8gd2UgcmVwb3J0IHRv
IHRoZSBjbGllbnQgY291bGQgbWFrZSBvdXIgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gaW52YWxp
ZC4KKyAgICAgICAgICAgIHNldFNjcm9sbFBvc2l0aW9uKEludFBvaW50Ojp6ZXJvKCkpOworICAg
ICAgICAgICAgbm90aWZ5VHJhbnNmb3JtZWRTY3JvbGxDaGFuZ2VkKCk7CisKKyAgICAgICAgICAg
IC8vIFBhaW50cyB0aGUgdmlzaWJsZSBiYWNraW5nc3RvcmUgYXMgd2hpdGUuIE5vdGUgaXQgaXMg
aW1wb3J0YW50IHdlIGRvCisgICAgICAgICAgICAvLyB0aGlzIHN0cmljdGx5IGFmdGVyIHJlLXNl
dHRpbmcgdGhlIHNjcm9sbCBwb3NpdGlvbiB0byBvcmlnaW4gYW5kIHJlc2V0dGluZworICAgICAg
ICAgICAgLy8gdGhlIHNjYWxlcyBvdGhlcndpc2UgdGhlIHZpc2libGUgY29udGVudHMgY2FsY3Vs
YXRpb24gaXMgd3JvbmcgYW5kIHdlCisgICAgICAgICAgICAvLyBjYW4gZW5kIHVwIGJsaXR0aW5n
IGFydGlmYWN0cyBpbnN0ZWFkLiBTZWU6IFJJTSBCdWcgIzQwMS4KKyAgICAgICAgICAgIGlmICht
X2JhY2tpbmdTdG9yZS0+ZC0+cmVuZGVyVmlzaWJsZUNvbnRlbnRzKCkgJiYgIW1fYmFja2luZ1N0
b3JlLT5kLT5pc1N1c3BlbmRlZCgpICYmICFtX2JhY2tpbmdTdG9yZS0+ZC0+c2hvdWxkRGlyZWN0
UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAgICAgICAgICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+
YmxpdFZpc2libGVDb250ZW50cygpOworCisgICAgICAgICAgICB6b29tVG9Jbml0aWFsU2NhbGVP
bkxvYWQoKTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIGN1cnNvciBzdGF0dXMuCisgICAgICAg
ICAgICB1cGRhdGVDdXJzb3IoKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
KyAgICAgICAgICAgIC8vIERvbid0IHJlbmRlciBjb21wb3NpdGluZyBjb250ZW50cyBmcm9tIHBy
ZXZpb3VzIHBhZ2UuCisgICAgICAgICAgICByZXNldENvbXBvc2l0aW5nU3VyZmFjZSgpOworI2Vu
ZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgRmluaXNoZWQ6Cisg
ICAgY2FzZSBGYWlsZWQ6CisgICAgICAgIC8vIE5vdGlmeSBjbGllbnQgb2YgdGhlIGluaXRpYWwg
em9vbSBjaGFuZ2UuCisgICAgICAgIG1fY2xpZW50LT56b29tQ2hhbmdlZChtX3dlYlBhZ2UtPmlz
TWluWm9vbWVkKCksIG1fd2ViUGFnZS0+aXNNYXhab29tZWQoKSwgIXNob3VsZFpvb21PbkVzY2Fw
ZSgpLCBjdXJyZW50U2NhbGUoKSk7CisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT51cGRhdGVU
aWxlcyh0cnVlIC8qIHVwZGF0ZVZpc2libGUgKi8sIGZhbHNlIC8qIGltbWVkaWF0ZSAqLyk7Cisg
ICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwor
ZG91YmxlIFdlYlBhZ2VQcml2YXRlOjpjbGFtcGVkU2NhbGUoZG91YmxlIHNjYWxlKSBjb25zdAor
eworICAgIGlmIChzY2FsZSA8IG1pbmltdW1TY2FsZSgpKQorICAgICAgICByZXR1cm4gbWluaW11
bVNjYWxlKCk7CisgICAgaWYgKHNjYWxlID4gbWF4aW11bVNjYWxlKCkpCisgICAgICAgIHJldHVy
biBtYXhpbXVtU2NhbGUoKTsKKyAgICByZXR1cm4gc2NhbGU7Cit9CisKK2Jvb2wgV2ViUGFnZVBy
aXZhdGU6OnNob3VsZFpvb21BYm91dFBvaW50KGRvdWJsZSBzY2FsZSwgY29uc3QgRmxvYXRQb2lu
dCYsIGJvb2wgZW5mb3JjZVNjYWxlQ2xhbXBpbmcsIGRvdWJsZSogY2xhbXBlZFNjYWxlKQorewor
ICAgIGlmICghbV9tYWluRnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgaWYgKGVuZm9yY2VTY2FsZUNsYW1waW5nKQorICAgICAgICBzY2FsZSA9IHRoaXMtPmNsYW1w
ZWRTY2FsZShzY2FsZSk7CisKKyAgICBBU1NFUlQoY2xhbXBlZFNjYWxlKTsKKyAgICAqY2xhbXBl
ZFNjYWxlID0gc2NhbGU7CisKKyAgICBpZiAoY3VycmVudFNjYWxlKCkgPT0gc2NhbGUpIHsKKyAg
ICAgICAgLy8gTWFrZSBzdXJlIGJhY2tpbmdzdG9yZSB1cGRhdGVzIHJlc3VtZSBmcm9tIHBpbmNo
IHpvb20gaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGZpbmFsIHpvb20gbGV2ZWwgZG9lc24ndCBjaGFu
Z2UuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3Rv
cmVVcGRhdGVzKEJhY2tpbmdTdG9yZTo6Tm9uZSk7CisgICAgICAgIG1fY2xpZW50LT56b29tQ2hh
bmdlZChtX3dlYlBhZ2UtPmlzTWluWm9vbWVkKCksIG1fd2ViUGFnZS0+aXNNYXhab29tZWQoKSwg
IXNob3VsZFpvb21PbkVzY2FwZSgpLCBjdXJyZW50U2NhbGUoKSk7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0
ZTo6em9vbUFib3V0UG9pbnQoZG91YmxlIHVuY2xhbXBlZFNjYWxlLCBjb25zdCBGbG9hdFBvaW50
JiBhbmNob3IsIGJvb2wgZW5mb3JjZVNjYWxlQ2xhbXBpbmcsIGJvb2wgZm9yY2VSZW5kZXJpbmcs
IGJvb2wgaXNSZXN0b3Jpbmdab29tTGV2ZWwpCit7CisgICAgaWYgKCFpc1Jlc3RvcmluZ1pvb21M
ZXZlbCkgeworICAgICAgICAvLyBDbGVhciBhbnkgZXhpc3RpbmcgYmxvY2sgem9vbS4gIChJZiB3
ZSBhcmUgcmVzdG9yaW5nIGEgc2F2ZWQgem9vbSBsZXZlbCBvbiBwYWdlIGxvYWQsCisgICAgICAg
IC8vIHRoZXJlIGlzIGd1YXJhbnRlZWQgdG8gYmUgbm8gZXhpc3RpbmcgYmxvY2sgem9vbSBhbmQg
d2UgZG9uJ3Qgd2FudCB0byBjbGVhciBtX3Nob3VsZFJlZmxvd0Jsb2NrLikKKyAgICAgICAgcmVz
ZXRCbG9ja1pvb20oKTsKKyAgICB9CisKKyAgICAvLyBUaGUgcmVmbG93IGFuZCBibG9jayB6b29t
IHN0dWZmIGhlcmUgbmVlZHMgdG8gaGFwcGVuIHJlZ2FyZGxlc3Mgb2YKKyAgICAvLyB3aGV0aGVy
IHdlIHNob3VsZFpvb21BYm91dFBvaW50LgorI2lmIEVOQUJMRShWSUVXUE9SVF9SRUZMT1cpCisg
ICAgdG9nZ2xlVGV4dFJlZmxvd0lmRW5hYmxlZEZvckJsb2NrWm9vbU9ubHkobV9zaG91bGRSZWZs
b3dCbG9jayk7CisgICAgaWYgKG1fcGFnZS0+c2V0dGluZ3MoKS0+aXNUZXh0UmVmbG93RW5hYmxl
ZCgpICYmIG1fbWFpbkZyYW1lLT52aWV3KCkpCisgICAgICAgIHNldE5lZWRzTGF5b3V0KCk7Cisj
ZW5kaWYKKworICAgIGRvdWJsZSBzY2FsZTsKKyAgICBpZiAoIXNob3VsZFpvb21BYm91dFBvaW50
KHVuY2xhbXBlZFNjYWxlLCBhbmNob3IsIGVuZm9yY2VTY2FsZUNsYW1waW5nLCAmc2NhbGUpKSB7
CisgICAgICAgIGlmIChtX3dlYlBhZ2UtPnNldHRpbmdzKCktPnRleHRSZWZsb3dNb2RlKCkgPT0g
V2ViU2V0dGluZ3M6OlRleHRSZWZsb3dFbmFibGVkKSB7CisgICAgICAgICAgICBtX2N1cnJlbnRQ
aW5jaFpvb21Ob2RlID0gMDsKKyAgICAgICAgICAgIG1fYW5jaG9ySW5Ob2RlUmVjdFJhdGlvID0g
RmxvYXRQb2ludCgtMSwgLTEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggem9vbTsKKyAgICB6b29tLnNjYWxlKHNjYWxl
KTsKKworI2lmIERFQlVHX1dFQlBBR0VfTE9BRAorICAgIGlmIChsb2FkU3RhdGUoKSA8IEZpbmlz
aGVkKQorICAgICAgICBQbGF0Zm9ybTo6bG9nKFBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJXZWJQ
YWdlUHJpdmF0ZTo6em9vbUFib3V0UG9pbnQgc2NhbGUgJWYgYW5jaG9yICglZiwgJWYpIiwgc2Nh
bGUsIGFuY2hvci54KCksIGFuY2hvci55KCkpOworI2VuZGlmCisKKyAgICAvLyBPdXIgY3VycmVu
dCBzY3JvbGwgcG9zaXRpb24gaW4gZmxvYXQuCisgICAgRmxvYXRQb2ludCBzY3JvbGxQb3NpdGlv
biA9IHRoaXMtPnNjcm9sbFBvc2l0aW9uKCk7CisKKyAgICAvLyBBbmNob3Igb2Zmc2V0IGZyb20g
c2Nyb2xsIHBvc2l0aW9uIGluIGZsb2F0LgorICAgIEZsb2F0UG9pbnQgYW5jaG9yT2Zmc2V0KGFu
Y2hvci54KCkgLSBzY3JvbGxQb3NpdGlvbi54KCksIGFuY2hvci55KCkgLSBzY3JvbGxQb3NpdGlv
bi55KCkpOworCisgICAgLy8gVGhlIGhvcml6b250YWwgc2NhbGluZyBmYWN0b3IgYW5kIHZlcnRp
Y2FsIHNjYWxpbmcgZmFjdG9yIHNob3VsZCBiZSBlcXVhbAorICAgIC8vIHRvIHByZXNlcnZlIGFz
cGVjdCByYXRpbyBvZiBjb250ZW50LgorICAgIEFTU0VSVChtX3RyYW5zZm9ybWF0aW9uTWF0cml4
LT5tMTEoKSA9PSBtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tMjIoKSk7CisKKyAgICAvLyBOZWVk
IHRvIGludmVydCB0aGUgcHJldmlvdXMgdHJhbnNmb3JtIHRvIGFuY2hvciB0aGUgdmlld3BvcnQu
CisgICAgZG91YmxlIGludmVyc2VTY2FsZSA9IHNjYWxlIC8gbV90cmFuc2Zvcm1hdGlvbk1hdHJp
eC0+bTExKCk7CisKKyAgICAvLyBBY3R1YWwgem9vbS4KKyAgICAqbV90cmFuc2Zvcm1hdGlvbk1h
dHJpeCA9IHpvb207CisKKyAgICAvLyBTdXNwZW5kIGFsbCBzY3JlZW4gdXBkYXRlcyB0byB0aGUg
YmFja2luZ3N0b3JlLgorICAgIG1fYmFja2luZ1N0b3JlLT5kLT5zdXNwZW5kU2NyZWVuQW5kQmFj
a2luZ1N0b3JlVXBkYXRlcygpOworCisgICAgdXBkYXRlVmlld3BvcnRTaXplKCk7CisKKyAgICBJ
bnRQb2ludCBuZXdTY3JvbGxQb3NpdGlvbihJbnRQb2ludChtYXgoMCwgc3RhdGljX2Nhc3Q8aW50
Pihyb3VuZGYoYW5jaG9yLngoKSAtIGFuY2hvck9mZnNldC54KCkgLyBpbnZlcnNlU2NhbGUpKSks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KDAsIHN0YXRpY19j
YXN0PGludD4ocm91bmRmKGFuY2hvci55KCkgLSBhbmNob3JPZmZzZXQueSgpIC8gaW52ZXJzZVNj
YWxlKSkpKSk7CisKKyAgICBpZiAobV93ZWJQYWdlLT5zZXR0aW5ncygpLT50ZXh0UmVmbG93TW9k
ZSgpID09IFdlYlNldHRpbmdzOjpUZXh0UmVmbG93RW5hYmxlZCkgeworICAgICAgICAvLyBUaGlz
IGlzIGEgaGFjayBmb3IgZW1haWwgd2hpY2ggaGFzIHJlZmxvdyBhbHdheXMgdHVybmVkIG9uLgor
ICAgICAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXROZWVkc0xheW91dCgpOworICAgICAgICBy
ZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKTsKKyAgICAgICAgaWYgKG1fY3VycmVudFBpbmNoWm9vbU5v
ZGUpCisgICAgICAgICAgICBuZXdTY3JvbGxQb3NpdGlvbiA9IGNhbGN1bGF0ZVJlZmxvd2VkU2Ny
b2xsUG9zaXRpb24oYW5jaG9yT2Zmc2V0LCBzY2FsZSA9PSBtaW5pbXVtU2NhbGUoKSA/IDEgOiBp
bnZlcnNlU2NhbGUpOworICAgICAgICAgbV9jdXJyZW50UGluY2hab29tTm9kZSA9IDA7CisgICAg
ICAgICBtX2FuY2hvckluTm9kZVJlY3RSYXRpbyA9IEZsb2F0UG9pbnQoLTEsIC0xKTsKKyAgICB9
CisKKyAgICBzZXRTY3JvbGxQb3NpdGlvbihuZXdTY3JvbGxQb3NpdGlvbik7CisKKyAgICBub3Rp
ZnlUcmFuc2Zvcm1DaGFuZ2VkKCk7CisKKyAgICBib29sIGlzTG9hZGluZyA9IHRoaXMtPmlzTG9h
ZGluZygpOworCisgICAgLy8gV2UgbmVlZCB0byBpbnZhbGlkYXRlIGFsbCB0aWxlcyBib3RoIHZp
c2libGUgYW5kIG5vbi12aXNpYmxlIGlmIHdlJ3JlIGxvYWRpbmcuCisgICAgbV9iYWNraW5nU3Rv
cmUtPmQtPnVwZGF0ZVRpbGVzKGlzTG9hZGluZyAvKiB1cGRhdGVWaXNpYmxlICovLCBmYWxzZSAv
KiBpbW1lZGlhdGUgKi8pOworCisgICAgbV9jbGllbnQtPnJlc2V0Qml0bWFwWm9vbVNjYWxlKG1f
dHJhbnNmb3JtYXRpb25NYXRyaXgtPm0xMSgpKTsKKworICAgIGJvb2wgc2hvdWxkUmVuZGVyID0g
IWlzTG9hZGluZyB8fCBtX3VzZXJQZXJmb3JtZWRNYW51YWxab29tIHx8IGZvcmNlUmVuZGVyaW5n
OworICAgIGJvb2wgc2hvdWxkQ2xlYXJWaXNpYmxlWm9vbSA9IGlzTG9hZGluZyAmJiBzaG91bGRS
ZW5kZXI7CisKKyAgICBpZiAoc2hvdWxkQ2xlYXJWaXNpYmxlWm9vbSkgeworICAgICAgICAvLyBJ
ZiB3ZSBhcmUgbG9hZGluZyBhbmQgcmVuZGVyaW5nIHRoZW4gd2UgbmVlZCB0byBjbGVhciB0aGUg
cmVuZGVyIHF1ZXVlJ3MKKyAgICAgICAgLy8gdmlzaWJsZSB6b29tIGpvYnMgYXMgdGhleSB3aWxs
IGJlIGlycmVsZXZhbnQgd2l0aCB0aGUgcmVuZGVyIGJlbG93LgorICAgICAgICBtX2JhY2tpbmdT
dG9yZS0+ZC0+Y2xlYXJWaXNpYmxlWm9vbSgpOworICAgIH0KKworICAgIC8vIENsZWFyIHdpbmRv
dyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGFydGlmYWN0cy4KKyAgICBpZiAoc2hvdWxkUmVu
ZGVyKSB7CisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5jbGVhcldpbmRvdygpOworICAgICAg
ICAvLyBSZXN1bWUgYWxsIHNjcmVlbiB1cGRhdGVzIHRvIHRoZSBiYWNraW5nc3RvcmUgYW5kIHJl
bmRlcitibGl0IHZpc2libGUgY29udGVudHMgdG8gc2NyZWVuLgorICAgICAgICBtX2JhY2tpbmdT
dG9yZS0+ZC0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6
OlJlbmRlckFuZEJsaXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFJlc3VtZSBhbGwgc2Ny
ZWVuIHVwZGF0ZXMgdG8gdGhlIGJhY2tpbmdzdG9yZSBidXQgZG8gbm90IGJsaXQgdG8gdGhlIHNj
cmVlbiBiZWNhdXNlIHdlIG5vdCByZW5kZXJpbmcuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5k
LT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKEJhY2tpbmdTdG9yZTo6Tm9uZSk7
CisgICAgfQorCisgICAgbV9jbGllbnQtPnpvb21DaGFuZ2VkKG1fd2ViUGFnZS0+aXNNaW5ab29t
ZWQoKSwgbV93ZWJQYWdlLT5pc01heFpvb21lZCgpLCAhc2hvdWxkWm9vbU9uRXNjYXBlKCksIGN1
cnJlbnRTY2FsZSgpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitJbnRQb2ludCBXZWJQYWdl
UHJpdmF0ZTo6Y2FsY3VsYXRlUmVmbG93ZWRTY3JvbGxQb3NpdGlvbihjb25zdCBGbG9hdFBvaW50
JiBhbmNob3JPZmZzZXQsIGRvdWJsZSBpbnZlcnNlU2NhbGUpCit7CisgICAgLy8gU2hvdWxkIG9u
bHkgYmUgaW52b2tlZCB3aGVuIHRleHQgcmVmbG93IGlzIGVuYWJsZWQuCisgICAgQVNTRVJUKG1f
d2ViUGFnZS0+c2V0dGluZ3MoKS0+dGV4dFJlZmxvd01vZGUoKSA9PSBXZWJTZXR0aW5nczo6VGV4
dFJlZmxvd0VuYWJsZWQpOworCisgICAgaW50IG9mZnNldFkgPSAwOworICAgIGludCBvZmZzZXRY
ID0gMDsKKworICAgIEludFJlY3Qgbm9kZVJlY3QgPSByZWN0Rm9yTm9kZShtX2N1cnJlbnRQaW5j
aFpvb21Ob2RlLmdldCgpKTsKKworICAgIGlmIChtX2N1cnJlbnRQaW5jaFpvb21Ob2RlLT5yZW5k
ZXJlcigpICYmIG1fYW5jaG9ySW5Ob2RlUmVjdFJhdGlvLnkoKSA+PSAwKSB7CisgICAgICAgIG9m
ZnNldFkgPSBub2RlUmVjdC5oZWlnaHQoKSAqIG1fYW5jaG9ySW5Ob2RlUmVjdFJhdGlvLnkoKTsK
KyAgICAgICAgaWYgKG1fY3VycmVudFBpbmNoWm9vbU5vZGUtPnJlbmRlcmVyKCktPmlzSW1hZ2Uo
KSAmJiBtX2FuY2hvckluTm9kZVJlY3RSYXRpby54KCkgPiAwKQorICAgICAgICAgICAgb2Zmc2V0
WCA9IG5vZGVSZWN0LndpZHRoKCkgKiBtX2FuY2hvckluTm9kZVJlY3RSYXRpby54KCkgLSBhbmNo
b3JPZmZzZXQueCgpIC8gaW52ZXJzZVNjYWxlOworICAgIH0KKworICAgIEludFJlY3QgcmVmbG93
ZWRSZWN0ID0gYWRqdXN0UmVjdE9mZnNldEZvckZyYW1lT2Zmc2V0KG5vZGVSZWN0LCBtX2N1cnJl
bnRQaW5jaFpvb21Ob2RlLmdldCgpKTsKKworICAgIHJldHVybiBJbnRQb2ludChtYXgoMCwgc3Rh
dGljX2Nhc3Q8aW50Pihyb3VuZGYocmVmbG93ZWRSZWN0LngoKSArIG9mZnNldFgpKSksCisgICAg
ICAgICAgICAgICAgICAgIG1heCgwLCBzdGF0aWNfY2FzdDxpbnQ+KHJvdW5kZihyZWZsb3dlZFJl
Y3QueSgpICsgb2Zmc2V0WSAtIGFuY2hvck9mZnNldC55KCkgLyBpbnZlcnNlU2NhbGUpKSkpOwor
fQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpzY2hlZHVsZVpvb21BYm91dFBvaW50KGRvdWJsZSB1
bmNsYW1wZWRTY2FsZSwgY29uc3QgRmxvYXRQb2ludCYgYW5jaG9yLCBib29sIGVuZm9yY2VTY2Fs
ZUNsYW1waW5nLCBib29sIGZvcmNlUmVuZGVyaW5nKQoreworICAgIGRvdWJsZSBzY2FsZTsKKyAg
ICBpZiAoIXNob3VsZFpvb21BYm91dFBvaW50KHVuY2xhbXBlZFNjYWxlLCBhbmNob3IsIGVuZm9y
Y2VTY2FsZUNsYW1waW5nLCAmc2NhbGUpKSB7CisgICAgICAgIC8vIFdlIGNvdWxkIGJlIGJhY2sg
dG8gdGhlIHJpZ2h0IHpvb20gbGV2ZWwgYmVmb3JlIHRoZSB0aW1lciBoYXMKKyAgICAgICAgLy8g
dGltZWQgb3V0LCBiZWNhdXNlIG9mIHdpZ2dsaW5nIGJhY2sgYW5kIGZvcnRoLiBTdG9wIHRoZSB0
aW1lci4KKyAgICAgICAgdW5zY2hlZHVsZVpvb21BYm91dFBvaW50KCk7CisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBGb3Igc29tZSByZWFzb24sIHRoZSBiaXRtYXAgem9v
bSB3YW50cyBhbiBhbmNob3IgaW4gYmFja2luZ3N0b3JlIGNvb3JkaW5hdGVzIQorICAgIC8vIHRo
aXMgaXMgZGlmZmVyZW50IGZyb20gem9vbUFib3V0UG9pbnQsIHdoaWNoIHdhbnRzIGNvbnRlbnQg
Y29vcmRpbmF0ZXMuCisgICAgLy8gU2VlIFJJTSBCdWcgIzY0MS4KKworICAgIEZsb2F0UG9pbnQg
dHJhbnNmb3JtZWRBbmNob3IgPSBtYXBUb1RyYW5zZm9ybWVkRmxvYXRQb2ludChhbmNob3IpOwor
ICAgIEZsb2F0UG9pbnQgdHJhbnNmb3JtZWRTY3JvbGxQb3NpdGlvbiA9IG1hcFRvVHJhbnNmb3Jt
ZWRGbG9hdFBvaW50KHNjcm9sbFBvc2l0aW9uKCkpOworCisgICAgLy8gUHJvaGliaXQgYmFja2lu
Z3N0b3JlIGZyb20gdXBkYXRpbmcgdGhlIHdpbmRvdyBvdmVydG9wIG9mIHRoZSBiaXRtYXAuCisg
ICAgbV9iYWNraW5nU3RvcmUtPmQtPnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVz
KCk7CisKKyAgICAvLyBOZWVkIHRvIGludmVydCB0aGUgcHJldmlvdXMgdHJhbnNmb3JtIHRvIGFu
Y2hvciB0aGUgdmlld3BvcnQuCisgICAgZG91YmxlIHpvb21GcmFjdGlvbiA9IHNjYWxlIC8gdHJh
bnNmb3JtYXRpb25NYXRyaXgoKS0+bTExKCk7CisKKyAgICAvLyBBbmNob3Igb2Zmc2V0IGZyb20g
c2Nyb2xsIHBvc2l0aW9uIGluIGZsb2F0LgorICAgIEZsb2F0UG9pbnQgYW5jaG9yT2Zmc2V0KHRy
YW5zZm9ybWVkQW5jaG9yLngoKSAtIHRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24ueCgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkQW5jaG9yLnkoKSAtIHRyYW5zZm9y
bWVkU2Nyb2xsUG9zaXRpb24ueSgpKTsKKworICAgIEludFBvaW50IHNyY1BvaW50KAorICAgICAg
ICBzdGF0aWNfY2FzdDxpbnQ+KHJvdW5kZih0cmFuc2Zvcm1lZEFuY2hvci54KCkgLSBhbmNob3JP
ZmZzZXQueCgpIC8gem9vbUZyYWN0aW9uKSksCisgICAgICAgIHN0YXRpY19jYXN0PGludD4ocm91
bmRmKHRyYW5zZm9ybWVkQW5jaG9yLnkoKSAtIGFuY2hvck9mZnNldC55KCkgLyB6b29tRnJhY3Rp
b24pKSk7CisKKyAgICBjb25zdCBJbnRSZWN0IHZpZXdwb3J0UmVjdCA9IEludFJlY3QoSW50UG9p
bnQ6Onplcm8oKSwgdHJhbnNmb3JtZWRWaWV3cG9ydFNpemUoKSk7CisgICAgY29uc3QgSW50UmVj
dCBkc3RSZWN0ID0gdmlld3BvcnRSZWN0OworCisgICAgLy8gVGhpcyBpcyB0aGUgcmVjdCB0byBw
YXNzIGFzIHRoZSBhY3R1YWwgc291cmNlIHJlY3QgaW4gdGhlIGJhY2tpbmdzdG9yZQorICAgIC8v
IGZvciB0aGUgdHJhbnNmb3JtIGdpdmVuIGJ5IHpvb20uCisgICAgSW50UmVjdCBzcmNSZWN0KHNy
Y1BvaW50LngoKSwKKyAgICAgICAgICAgICAgICAgICAgc3JjUG9pbnQueSgpLAorICAgICAgICAg
ICAgICAgICAgICB2aWV3cG9ydFJlY3Qud2lkdGgoKSAvIHpvb21GcmFjdGlvbiwKKyAgICAgICAg
ICAgICAgICAgICAgdmlld3BvcnRSZWN0LmhlaWdodCgpIC8gem9vbUZyYWN0aW9uKTsKKyAgICBt
X2JhY2tpbmdTdG9yZS0+ZC0+YmxpdENvbnRlbnRzKGRzdFJlY3QsIHNyY1JlY3QpOworCisgICAg
bV9kZWxheWVkWm9vbUFyZ3VtZW50cy5zY2FsZSA9IHNjYWxlOworICAgIG1fZGVsYXllZFpvb21B
cmd1bWVudHMuYW5jaG9yID0gYW5jaG9yOworICAgIG1fZGVsYXllZFpvb21Bcmd1bWVudHMuZW5m
b3JjZVNjYWxlQ2xhbXBpbmcgPSBlbmZvcmNlU2NhbGVDbGFtcGluZzsKKyAgICBtX2RlbGF5ZWRa
b29tQXJndW1lbnRzLmZvcmNlUmVuZGVyaW5nID0gZm9yY2VSZW5kZXJpbmc7CisgICAgbV9kZWxh
eWVkWm9vbVRpbWVyLT5zdGFydE9uZVNob3QoZGVsYXllZFpvb21JbnRlcnZhbCk7CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6dW5zY2hlZHVsZVpvb21BYm91
dFBvaW50KCkKK3sKKyAgICBpZiAobV9kZWxheWVkWm9vbVRpbWVyLT5pc0FjdGl2ZSgpKQorICAg
ICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRl
cyhCYWNraW5nU3RvcmU6Ok5vbmUpOworCisgICAgbV9kZWxheWVkWm9vbVRpbWVyLT5zdG9wKCk7
Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6Onpvb21BYm91dFBvaW50VGltZXJGaXJlZChUaW1l
cjxXZWJQYWdlUHJpdmF0ZT4qKQoreworICAgIHpvb21BYm91dFBvaW50KG1fZGVsYXllZFpvb21B
cmd1bWVudHMuc2NhbGUsIG1fZGVsYXllZFpvb21Bcmd1bWVudHMuYW5jaG9yLCBtX2RlbGF5ZWRa
b29tQXJndW1lbnRzLmVuZm9yY2VTY2FsZUNsYW1waW5nLCBtX2RlbGF5ZWRab29tQXJndW1lbnRz
LmZvcmNlUmVuZGVyaW5nKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0TmVlZHNMYXlv
dXQoKQoreworICAgIEZyYW1lVmlldyogdmlldyA9IG1fbWFpbkZyYW1lLT52aWV3KCk7CisgICAg
QVNTRVJUKHZpZXcpOworICAgIHZpZXctPnNldE5lZWRzTGF5b3V0KCk7Cit9CisKK3ZvaWQgV2Vi
UGFnZVByaXZhdGU6OnJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpIGNvbnN0Cit7CisgICAgRnJhbWVW
aWV3KiB2aWV3ID0gbV9tYWluRnJhbWUtPnZpZXcoKTsKKyAgICBBU1NFUlQodmlldyk7CisgICAg
dmlldy0+dXBkYXRlTGF5b3V0QW5kU3R5bGVJZk5lZWRlZFJlY3Vyc2l2ZSgpOworICAgIEFTU0VS
VCghdmlldy0+bmVlZHNMYXlvdXQoKSk7Cit9CisKK0ludFBvaW50IFdlYlBhZ2VQcml2YXRlOjpz
Y3JvbGxQb3NpdGlvbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fYmFja2luZ1N0b3JlQ2xpZW50
LT5zY3JvbGxQb3NpdGlvbigpOworfQorCitJbnRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6bWF4aW11
bVNjcm9sbFBvc2l0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9iYWNraW5nU3RvcmVDbGll
bnQtPm1heGltdW1TY3JvbGxQb3NpdGlvbigpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpz
ZXRTY3JvbGxQb3NpdGlvbihjb25zdCBJbnRQb2ludCYgcG9zKQoreworICAgIG1fYmFja2luZ1N0
b3JlQ2xpZW50LT5zZXRTY3JvbGxQb3NpdGlvbihwb3MpOworfQorCitib29sIFdlYlBhZ2VQcml2
YXRlOjpzaG91bGRTZW5kUmVzaXplRXZlbnQoKQoreworICAgIGlmICghbV9tYWluRnJhbWUtPmRv
Y3VtZW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFBSIzk2ODY1IDogUHJv
dmlkZSBhbiBvcHRpb24gdG8gYWx3YXlzIHNlbmQgcmVzaXplIGV2ZW50cywgcmVnYXJkbGVzcyBv
ZiB0aGUgbG9hZGluZworICAgIC8vICAgICAgICAgICAgc3RhdHVzLiBUaGUgc2NlbmFyaW8gZm9y
IHRoaXMgYXJlIFNhcHBoaXJlIGFwcGxpY2F0aW9ucyB3aGljaCB0ZW5kIHRvCisgICAgLy8gICAg
ICAgICAgICBtYWludGFpbiBhbiBvcGVuIEdFVCByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIuIFRoaXMg
b3BlbiBHRVQgcmVzdWx0cyBpbgorICAgIC8vICAgICAgICAgICAgd2Via2l0IHRoaW5raW5nIHRo
YXQgY29udGVudCBpcyBzdGlsbCBhcnJpdmluZyB3aGVuIGF0IHRoZSBhcHBsaWNhdGlvbgorICAg
IC8vICAgICAgICAgICAgbGV2ZWwgaXQgaXMgY29uc2lkZXJlZCBmdWxseSBsb2FkZWQuCisgICAg
Ly8KKyAgICAvLyAgICAgICAgICAgIE5PVEU6IENhcmUgbXVzdCBiZSBleGVyY2lzZWQgaW4gdGhl
IHVzZSBvZiB0aGlzIG9wdGlvbiwgYXMgaXQgYnlwYXNzZXMKKyAgICAvLyAgICAgICAgICAgICAg
ICAgIHRoZSBzYW5pdHkgcHJvdmlkZWQgaW4gJ2lzTG9hZGluZ0luQVBJU2Vuc2UoKScgYmVsb3cu
CisgICAgLy8KKyAgICBzdGF0aWMgY29uc3QgYm9vbCB1bnJlc3RyaWN0ZWRSZXNpemVFdmVudHMg
PSBQbGF0Zm9ybTo6U2V0dGluZ3M6OmdldCgpLT51bnJlc3RyaWN0ZWRSZXNpemVFdmVudHMoKTsK
KyAgICBpZiAodW5yZXN0cmljdGVkUmVzaXplRXZlbnRzKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIC8vIERvbid0IHNlbmQgdGhlIHJlc2l6ZSBldmVudCBpZiB0aGUgZG9jdW1lbnQgaXMg
bG9hZGluZy4gU29tZSBwYWdlcyBhdXRvbWF0aWNhbGx5IHJlbG9hZAorICAgIC8vIHdoZW4gdGhl
IHdpbmRvdyBpcyByZXNpemVkOyBTYWZhcmkgb24gaVBob25lIG9mdGVuIHJlc2l6ZXMgdGhlIHdp
bmRvdyB3aGlsZSBzZXR0aW5nIHVwIGl0cworICAgIC8vIHZpZXdwb3J0LiBUaGlzIG9idmlvdXNs
eSBjYW4gY2F1c2UgcHJvYmxlbXMuCisgICAgRG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50TG9hZGVy
ID0gbV9tYWluRnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigpOworICAgIGlmIChkb2N1
bWVudExvYWRlciAmJiBkb2N1bWVudExvYWRlci0+aXNMb2FkaW5nSW5BUElTZW5zZSgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJQYWdl
UHJpdmF0ZTo6d2lsbERlZmVyTG9hZGluZygpCit7CisgICAgbV9jbGllbnQtPndpbGxEZWZlckxv
YWRpbmcoKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6ZGlkUmVzdW1lTG9hZGluZygpCit7
CisgICAgbV9jbGllbnQtPmRpZFJlc3VtZUxvYWRpbmcoKTsKK30KKworYm9vbCBXZWJQYWdlOjpz
Y3JvbGxCeShjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYgZGVsdGEsIGJvb2wgc2Nyb2xsTWFpbkZy
YW1lKQoreworICAgIGQtPm1fYmFja2luZ1N0b3JlQ2xpZW50LT5zZXRJc0NsaWVudEdlbmVyYXRl
ZFNjcm9sbCh0cnVlKTsKKyAgICBib29sIGIgPSBkLT5zY3JvbGxCeShkZWx0YS53aWR0aCgpLCBk
ZWx0YS5oZWlnaHQoKSwgc2Nyb2xsTWFpbkZyYW1lKTsKKyAgICBkLT5tX2JhY2tpbmdTdG9yZUNs
aWVudC0+c2V0SXNDbGllbnRHZW5lcmF0ZWRTY3JvbGwoZmFsc2UpOworICAgIHJldHVybiBiOwor
fQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpzY3JvbGxCeShpbnQgZGVsdGFYLCBpbnQgZGVsdGFZ
LCBib29sIHNjcm9sbE1haW5GcmFtZSkKK3sKKyAgICBJbnRTaXplIGRlbHRhKGRlbHRhWCwgZGVs
dGFZKTsKKyAgICBpZiAoIXNjcm9sbE1haW5GcmFtZSkgeworICAgICAgICAvLyBXZSBuZWVkIHRv
IHdvcmsgYXJvdW5kIHRoZSBmYWN0IHRoYXQgOjptYXB7VG8sRnJvbX1UcmFuc2Zvcm1lZCBkbyBu
b3QKKyAgICAgICAgLy8gd29yayB3ZWxsIHdpdGggbmVnYXRpdmUgdmFsdWVzLCBsaWtlIGEgbmVn
YXRpdmUgd2lkdGggb3IgaGVpZ2h0IG9mIGFuIEludFNpemUuCisgICAgICAgIEludFNpemUgY29w
aWVkRGVsdGEoSW50U2l6ZShhYnMoZGVsdGEud2lkdGgoKSksIGFicyhkZWx0YS5oZWlnaHQoKSkp
KTsKKyAgICAgICAgSW50U2l6ZSB1bnRyYW5zZm9ybWVkQ29waWVkRGVsdGEgPSBtYXBGcm9tVHJh
bnNmb3JtZWQoY29waWVkRGVsdGEpOworICAgICAgICBkZWx0YSA9IEludFNpemUoCisgICAgICAg
ICAgICBkZWx0YS53aWR0aCgpIDwgMCA/IC11bnRyYW5zZm9ybWVkQ29waWVkRGVsdGEud2lkdGgo
KSA6IHVudHJhbnNmb3JtZWRDb3BpZWREZWx0YS53aWR0aCgpLAorICAgICAgICAgICAgZGVsdGEu
aGVpZ2h0KCkgPCAwID8gLXVudHJhbnNmb3JtZWRDb3BpZWREZWx0YS5oZWlnaHQoKTogdW50cmFu
c2Zvcm1lZENvcGllZERlbHRhLmhlaWdodCgpKTsKKworICAgICAgICBpZiAobV9pblJlZ2lvblNj
cm9sbFN0YXJ0aW5nTm9kZSkgeworICAgICAgICAgICAgaWYgKHNjcm9sbE5vZGVSZWN1cnNpdmVs
eShtX2luUmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2RlLmdldCgpLCBkZWx0YSkpIHsKKyAgICAgICAg
ICAgICAgICBtX3NlbGVjdGlvbkhhbmRsZXItPnNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCgpOwor
ICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBoYXZlIGNvZGUgaW4gcGxhY2UgdG8gaGFuZGxl
IHNjcm9sbGluZyBhbmQgY2xpcHBpbmcgdGFwIGhpZ2hsaWdodAorICAgICAgICAgICAgICAgIC8v
IG9uIGluLXJlZ2lvbiBzY3JvbGxpbmcuIEFzIHNvb24gYXMgaXQgaXMgZmFzdCBlbm91Z2ggKGku
ZS4gd2UgaGF2ZSBpdCBiYWNrZWQgYnkKKyAgICAgICAgICAgICAgICAvLyBhIGJhY2tpbmcgc3Rv
cmUpLCB3ZSBjYW4gcmVsaWFibHkgbWFrZSB1c2Ugb2YgaXQgaW4gdGhlIHJlYWwgd29ybGQuCisg
ICAgICAgICAgICAgICAgLy8gbV90b3VjaEV2ZW50SGFuZGxlci0+ZHJhd1RhcEhpZ2hsaWdodCgp
OworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9
CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNldFNjcm9sbFBvc2l0aW9u
KHNjcm9sbFBvc2l0aW9uKCkgKyBkZWx0YSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQg
V2ViUGFnZTo6bm90aWZ5SW5SZWdpb25TY3JvbGxTdGF0dXNDaGFuZ2VkKGJvb2wgc3RhdHVzKQor
eworICAgIGQtPm5vdGlmeUluUmVnaW9uU2Nyb2xsU3RhdHVzQ2hhbmdlZChzdGF0dXMpOworfQor
Cit2b2lkIFdlYlBhZ2VQcml2YXRlOjpub3RpZnlJblJlZ2lvblNjcm9sbFN0YXR1c0NoYW5nZWQo
Ym9vbCBzdGF0dXMpCit7CisgICAgaWYgKCFzdGF0dXMgJiYgbV9pblJlZ2lvblNjcm9sbFN0YXJ0
aW5nTm9kZSkgeworICAgICAgICBlbnF1ZXVlUmVuZGVyaW5nT2ZDbGlwcGVkQ29udGVudE9mU2Ny
b2xsYWJsZU5vZGVBZnRlckluUmVnaW9uU2Nyb2xsaW5nKG1faW5SZWdpb25TY3JvbGxTdGFydGlu
Z05vZGUuZ2V0KCkpOworICAgICAgICBtX2luUmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2RlID0gMDsK
KyAgICB9Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmVucXVldWVSZW5kZXJpbmdPZkNsaXBw
ZWRDb250ZW50T2ZTY3JvbGxhYmxlTm9kZUFmdGVySW5SZWdpb25TY3JvbGxpbmcoTm9kZSogc2Ny
b2xsZWROb2RlKQoreworICAgIEFTU0VSVChzY3JvbGxlZE5vZGUpOworICAgIGlmIChzY3JvbGxl
ZE5vZGUtPmlzRG9jdW1lbnROb2RlKCkpIHsKKyAgICAgICAgRnJhbWUqIGZyYW1lID0gc3RhdGlj
X2Nhc3Q8Y29uc3QgRG9jdW1lbnQqPihzY3JvbGxlZE5vZGUpLT5mcmFtZSgpOworICAgICAgICBB
U1NFUlQoZnJhbWUpOworICAgICAgICBpZiAoIWZyYW1lKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICBBU1NFUlQoZnJhbWUgIT0gbV9tYWluRnJhbWUpOworICAgICAgICBGcmFtZVZpZXcq
IHZpZXcgPSBmcmFtZS0+dmlldygpOworICAgICAgICBpZiAoIXZpZXcpCisgICAgICAgICAgICBy
ZXR1cm47CisKKyAgICAgICAgLy8gU3RlcHM6CisgICAgICAgIC8vICMxIC0gR2V0IGZyYW1lIHJl
Y3QgaW4gY29udGVudHMgY29vcmRzLgorICAgICAgICAvLyAjMiAtIEdldCB0aGUgY2xpcHBlZCBz
Y3JvbGx2aWV3IHJlY3QgaW4gY29udGVudHMgY29vcmRzLgorICAgICAgICAvLyAjMyAtIFRha2Ug
dHJhbnNmb3JtIGludG8gYWNjb3VudCBmb3IgMSBhbmQgMi4KKyAgICAgICAgLy8gIzQgLSBTdWJ0
cmFjdCAyIGZyb20gMSwgc28gd2Uga25vdyBleGFjdGx5IHdoaWNoIGFyZWFzIG9mIHRoZSBmcmFt
ZQorICAgICAgICAvLyAgICAgIGFyZSBvZmZzY3JlZW4sIGFuZCBuZWVkIGFzeW5jIHJlcGFpbnRp
bmcuCisgICAgICAgIEZyYW1lVmlldyogbWFpbkZyYW1lVmlldyA9IG1fbWFpbkZyYW1lLT52aWV3
KCk7CisgICAgICAgIEFTU0VSVChtYWluRnJhbWVWaWV3KTsKKyAgICAgICAgSW50UmVjdCBmcmFt
ZVJlY3QgPSB2aWV3LT5mcmFtZVJlY3QoKTsKKyAgICAgICAgZnJhbWVSZWN0ID0gZnJhbWUtPnRy
ZWUoKS0+cGFyZW50KCktPnZpZXcoKS0+Y29udGVudHNUb1dpbmRvdyhmcmFtZVJlY3QpOworICAg
ICAgICBmcmFtZVJlY3QgPSBtYWluRnJhbWVWaWV3LT53aW5kb3dUb0NvbnRlbnRzKGZyYW1lUmVj
dCk7CisKKyAgICAgICAgSW50UmVjdCB2aXNpYmxlV2luZG93UmVjdCA9IGdldFJlY3Vyc2l2ZVZp
c2libGVXaW5kb3dSZWN0KHZpZXcpOworICAgICAgICBJbnRSZWN0IHZpc2libGVDb250ZW50c1Jl
Y3QgPSBtYWluRnJhbWVWaWV3LT53aW5kb3dUb0NvbnRlbnRzKHZpc2libGVXaW5kb3dSZWN0KTsK
KworICAgICAgICBJbnRSZWN0IHRyYW5zZm9ybWVkRnJhbWVSZWN0ID0gbWFwVG9UcmFuc2Zvcm1l
ZChmcmFtZVJlY3QpOworICAgICAgICBJbnRSZWN0IHRyYW5zZm9ybWVkVmlzaWJsZUNvbnRlbnRz
UmVjdCA9IG1hcFRvVHJhbnNmb3JtZWQodmlzaWJsZUNvbnRlbnRzUmVjdCk7CisKKyAgICAgICAg
UGxhdGZvcm06OkludFJlY3RSZWdpb24gb2Zmc2NyZWVuUmVnaW9uT2ZJZnJhbWUKKyAgICAgICAg
ICAgID0gUGxhdGZvcm06OkludFJlY3RSZWdpb246OnN1YnRyYWN0UmVnaW9ucyhQbGF0Zm9ybTo6
SW50UmVjdCh0cmFuc2Zvcm1lZEZyYW1lUmVjdCksIFBsYXRmb3JtOjpJbnRSZWN0KHRyYW5zZm9y
bWVkVmlzaWJsZUNvbnRlbnRzUmVjdCkpOworCisgICAgICAgIGlmICghb2Zmc2NyZWVuUmVnaW9u
T2ZJZnJhbWUuaXNFbXB0eSgpKQorICAgICAgICAgICAgbV9iYWNraW5nU3RvcmUtPmQtPm1fcmVu
ZGVyUXVldWUtPmFkZFRvUXVldWUoUmVuZGVyUXVldWU6OlJlZ3VsYXJSZW5kZXIsIG9mZnNjcmVl
blJlZ2lvbk9mSWZyYW1lLnJlY3RzKCkpOworICAgIH0KK30KKwordm9pZCBXZWJQYWdlUHJpdmF0
ZTo6c2V0SGFzSW5SZWdpb25TY3JvbGxhYmxlQXJlYXMoYm9vbCBiKQoreworICAgIGlmIChiICE9
IG1faGFzSW5SZWdpb25TY3JvbGxhYmxlQXJlYXMpCisgICAgICAgIG1faGFzSW5SZWdpb25TY3Jv
bGxhYmxlQXJlYXMgPSBiOworfQorCitJbnRTaXplIFdlYlBhZ2VQcml2YXRlOjp2aWV3cG9ydFNp
emUoKSBjb25zdAoreworICAgIHJldHVybiBtYXBGcm9tVHJhbnNmb3JtZWQodHJhbnNmb3JtZWRW
aWV3cG9ydFNpemUoKSk7Cit9CisKK0ludFNpemUgV2ViUGFnZVByaXZhdGU6OmFjdHVhbFZpc2li
bGVTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbWFwRnJvbVRyYW5zZm9ybWVkKHRyYW5zZm9y
bWVkQWN0dWFsVmlzaWJsZVNpemUoKSk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6Omhhc1Zp
cnR1YWxWaWV3cG9ydCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdmlydHVhbFZpZXdwb3J0V2lk
dGggJiYgbV92aXJ0dWFsVmlld3BvcnRIZWlnaHQ7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6
OnVwZGF0ZVZpZXdwb3J0U2l6ZShib29sIHNldEZpeGVkUmVwb3J0ZWRTaXplLCBib29sIHNlbmRS
ZXNpemVFdmVudCkKK3sKKyAgICBBU1NFUlQobV9tYWluRnJhbWUtPnZpZXcoKSk7CisgICAgaWYg
KHNldEZpeGVkUmVwb3J0ZWRTaXplKQorICAgICAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXRG
aXhlZFJlcG9ydGVkU2l6ZShhY3R1YWxWaXNpYmxlU2l6ZSgpKTsKKworICAgIEludFJlY3QgZnJh
bWVSZWN0ID0gSW50UmVjdChzY3JvbGxQb3NpdGlvbigpLCB2aWV3cG9ydFNpemUoKSk7CisgICAg
aWYgKGZyYW1lUmVjdCAhPSBtX21haW5GcmFtZS0+dmlldygpLT5mcmFtZVJlY3QoKSkgeworICAg
ICAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXRGcmFtZVJlY3QoZnJhbWVSZWN0KTsKKyAgICAg
ICAgbV9tYWluRnJhbWUtPnZpZXcoKS0+YWRqdXN0Vmlld1NpemUoKTsKKyAgICB9CisKKyAgICAv
LyBXZSdyZSBnb2luZyB0byBuZWVkIHRvIHNlbmQgYSByZXNpemUgZXZlbnQgdG8gSmF2YVNjcmlw
dCBiZWNhdXNlCisgICAgLy8gaW5uZXJXaWR0aCBhbmQgaW5uZXJIZWlnaHQgZGVwZW5kIG9uIGZp
eGVkIHJlcG9ydGVkIHNpemUuCisgICAgLy8gVGhpcyBpcyBob3cgd2Ugc3VwcG9ydCBtb2JpbGUg
cGFnZXMgd2hlcmUgSmF2YVNjcmlwdCByZXNpemVzCisgICAgLy8gdGhlIHBhZ2UgaW4gb3JkZXIg
dG8gZ2V0IGFyb3VuZCB0aGUgZml4ZWQgbGF5b3V0IHNpemUsIGUuZy4KKyAgICAvLyBnb29nbGUg
bWFwcyB3aGVuIGl0IGRldGVjdHMgYSBtb2JpbGUgdXNlciBhZ2VudC4KKyAgICBpZiAoc2VuZFJl
c2l6ZUV2ZW50ICYmIHNob3VsZFNlbmRSZXNpemVFdmVudCgpKQorICAgICAgICBtX21haW5GcmFt
ZS0+ZXZlbnRIYW5kbGVyKCktPnNlbmRSZXNpemVFdmVudCgpOworCisgICAgLy8gV2hlbiB0aGUg
YWN0dWFsIHZpc2libGUgc2l6ZSBjaGFuZ2VzLCB3ZSBhbHNvCisgICAgLy8gbmVlZCB0byByZXBv
c2l0aW9uIGZpeGVkIGVsZW1lbnRzLgorICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPnJlcGFpbnRG
aXhlZEVsZW1lbnRzQWZ0ZXJTY3JvbGxpbmcoKTsKK30KKworRmxvYXRQb2ludCBXZWJQYWdlUHJp
dmF0ZTo6Y2VudGVyT2ZWaXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3QKK3sKKyAgICAvLyBUaGUg
dmlzaWJsZSBjb250ZW50cyByZWN0IGluIGZsb2F0LgorICAgIEZsb2F0UmVjdCB2aXNpYmxlQ29u
dGVudHNSZWN0ID0gdGhpcy0+dmlzaWJsZUNvbnRlbnRzUmVjdCgpOworCisgICAgLy8gVGhlIGNl
bnRlciBvZiB0aGUgdmlzaWJsZSBjb250ZW50cyByZWN0IGluIGZsb2F0LgorICAgIHJldHVybiBG
bG9hdFBvaW50KHZpc2libGVDb250ZW50c1JlY3QueCgpICsgdmlzaWJsZUNvbnRlbnRzUmVjdC53
aWR0aCgpIC8gMi4wLAorICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVDb250ZW50c1JlY3Qu
eSgpICsgdmlzaWJsZUNvbnRlbnRzUmVjdC5oZWlnaHQoKSAvIDIuMCk7Cit9CisKK0ludFJlY3Qg
V2ViUGFnZVByaXZhdGU6OnZpc2libGVDb250ZW50c1JlY3QoKSBjb25zdAoreworICAgIHJldHVy
biBtX2JhY2tpbmdTdG9yZUNsaWVudC0+dmlzaWJsZUNvbnRlbnRzUmVjdCgpOworfQorCitJbnRT
aXplIFdlYlBhZ2VQcml2YXRlOjpjb250ZW50c1NpemUoKSBjb25zdAoreworICAgIGlmICghbV9t
YWluRnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJuIEludFNpemUoKTsKKworICAgIHJldHVy
biBtX2JhY2tpbmdTdG9yZUNsaWVudC0+Y29udGVudHNTaXplKCk7Cit9CisKK0ludFNpemUgV2Vi
UGFnZVByaXZhdGU6OmFic29sdXRlVmlzaWJsZU92ZXJmbG93U2l6ZSgpIGNvbnN0Cit7CisgICAg
aWYgKCFtX21haW5GcmFtZS0+Y29udGVudFJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybiBJbnRT
aXplKCk7CisKKyAgICByZXR1cm4gSW50U2l6ZShtX21haW5GcmFtZS0+Y29udGVudFJlbmRlcmVy
KCktPnJpZ2h0QWJzb2x1dGVWaXNpYmxlT3ZlcmZsb3coKSwgbV9tYWluRnJhbWUtPmNvbnRlbnRS
ZW5kZXJlcigpLT5ib3R0b21BYnNvbHV0ZVZpc2libGVPdmVyZmxvdygpKTsKK30KKwordm9pZCBX
ZWJQYWdlUHJpdmF0ZTo6Y29udGVudHNTaXplQ2hhbmdlZChjb25zdCBJbnRTaXplJiBjb250ZW50
c1NpemUpCit7CisgICAgaWYgKG1fcHJldmlvdXNDb250ZW50c1NpemUgPT0gY29udGVudHNTaXpl
KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBUaGlzIHNob3VsZCBvbmx5IG9jY3VyIGluIHRo
ZSBtaWRkbGUgb2YgbGF5b3V0IHNvIHdlIHNldCBhIGZsYWcgaGVyZSBhbmQKKyAgICAvLyBoYW5k
bGUgaXQgYXQgdGhlIGVuZCBvZiB0aGUgbGF5b3V0LgorICAgIG1fY29udGVudHNTaXplQ2hhbmdl
ZCA9IHRydWU7CisKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICBQbGF0Zm9ybTo6bG9nKFBs
YXRmb3JtOjpMb2dMZXZlbEluZm8sICJXZWJQYWdlUHJpdmF0ZTo6Y29udGVudHNTaXplQ2hhbmdl
ZCAlZHglZCIsIGNvbnRlbnRzU2l6ZS53aWR0aCgpLCBjb250ZW50c1NpemUuaGVpZ2h0KCkpOwor
I2VuZGlmCit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmxheW91dEZpbmlzaGVkKCkKK3sKKyAg
ICBpZiAoIW1fY29udGVudHNTaXplQ2hhbmdlZCAmJiAhbV9vdmVyZmxvd0V4Y2VlZHNDb250ZW50
c1NpemUpCisgICAgICAgIHJldHVybjsKKworICAgIG1fY29udGVudHNTaXplQ2hhbmdlZCA9IGZh
bHNlOyAvLyBUb2dnbGUgdG8gdHVybiBvZmYgbm90aWZpY2F0aW9uIGFnYWluLgorICAgIG1fb3Zl
cmZsb3dFeGNlZWRzQ29udGVudHNTaXplID0gZmFsc2U7CisKKyAgICBpZiAoY29udGVudHNTaXpl
KCkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBUaGUgY2FsbCB0byB6b29t
VG9Jbml0aWFsU2NhbGVPbkxvYWQgY2FuIGNhdXNlIHJlY3Vyc2l2ZSBsYXlvdXQgd2hlbiBjYWxs
ZWQgZnJvbQorICAgIC8vIHRoZSBtaWRkbGUgb2YgYSBsYXlvdXQsIGJ1dCB0aGUgcmVjdXJzaW9u
IGlzIGxpbWl0ZWQgYnkgZGV0ZWN0aW9uIGNvZGUgaW4KKyAgICAvLyBzZXRWaWV3TW9kZSgpIGFu
ZCBtaXRpZ2F0aW9uIGNvZGUgaW4gZml4ZWRMYXlvdXRTaXplKCkuCisgICAgaWYgKGRpZExheW91
dEV4Y2VlZE1heGltdW1JdGVyYXRpb25zKCkpIHsKKyAgICAgICAgbm90aWZ5VHJhbnNmb3JtZWRD
b250ZW50c1NpemVDaGFuZ2VkKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBU
ZW1wb3JhcmlseSBzYXZlIHRoZSBtX3ByZXZpb3VzQ29udGVudHNTaXplIGhlcmUgYmVmb3JlIHVw
ZGF0aW5nIGl0IChpbgorICAgIC8vIG5vdGlmeVRyYW5zZm9ybWVkQ29udGVudHNTaXplQ2hhbmdl
ZCgpKSBzbyB3ZSBjYW4gY29tcGFyZSBpZiBvdXIgY29udGVudHMKKyAgICAvLyBzaHJ1bmsgYWZ0
ZXJ3YXJkcy4KKyAgICBJbnRTaXplIHByZXZpb3VzQ29udGVudHNTaXplID0gbV9wcmV2aW91c0Nv
bnRlbnRzU2l6ZTsKKworICAgIG1fbmVzdGVkTGF5b3V0RmluaXNoZWRDb3VudCsrOworCisgICAg
aWYgKGxvYWRTdGF0ZSgpID09IENvbW1pdHRlZCkKKyAgICAgICAgem9vbVRvSW5pdGlhbFNjYWxl
T25Mb2FkKCk7CisgICAgZWxzZSBpZiAobG9hZFN0YXRlKCkgIT0gTm9uZSkKKyAgICAgICAgbm90
aWZ5VHJhbnNmb3JtZWRDb250ZW50c1NpemVDaGFuZ2VkKCk7CisKKyAgICBtX25lc3RlZExheW91
dEZpbmlzaGVkQ291bnQtLTsKKworICAgIGlmICghbV9uZXN0ZWRMYXlvdXRGaW5pc2hlZENvdW50
KSB7CisgICAgICAgIC8vIFdoZW4gdGhlIGNvbnRlbnRzIHNocmlua3MsIHRoZXJlIGlzIGEgcmlz
ayB0aGF0IHdlCisgICAgICAgIC8vIHdpbGwgYmUgbGVmdCBhdCBhIHNjcm9sbCBwb3NpdGlvbiB0
aGF0IGxpZXMgb3V0c2lkZSBvZiB0aGUKKyAgICAgICAgLy8gY29udGVudHMgcmVjdC4gU2luY2Ug
d2UgYWxsb3cgb3ZlcnNjcm9sbGluZyBhbmQgbmVnbGVjdAorICAgICAgICAvLyB0byBjbGFtcCBv
dmVyc2Nyb2xsIGluIG9yZGVyIHRvIHJldGFpbiBpbnB1dCBmb2N1cyAoUklNIEJ1ZyAjNDE0KQor
ICAgICAgICAvLyB3ZSBuZWVkIHRvIGNsYW1wIHNvbWV3aGVyZSwgYW5kIHRoaXMgaXMgd2hlcmUg
d2Uga25vdyB0aGUKKyAgICAgICAgLy8gY29udGVudHMgc2l6ZSBoYXMgY2hhbmdlZC4KKworICAg
ICAgICBpZiAoY29udGVudHNTaXplKCkgIT0gcHJldmlvdXNDb250ZW50c1NpemUpIHsKKworICAg
ICAgICAgICAgSW50UG9pbnQgbmV3U2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbigpOwor
CisgICAgICAgICAgICBpZiAoY29udGVudHNTaXplKCkuaGVpZ2h0KCkgPCBwcmV2aW91c0NvbnRl
bnRzU2l6ZS5oZWlnaHQoKSkgeworICAgICAgICAgICAgICAgIEludFBvaW50IHNjcm9sbFBvc2l0
aW9uV2l0aEhlaWdodFNocnVuayA9IEludFBvaW50KG5ld1Njcm9sbFBvc2l0aW9uLngoKSwgbWF4
aW11bVNjcm9sbFBvc2l0aW9uKCkueSgpKTsKKyAgICAgICAgICAgICAgICBuZXdTY3JvbGxQb3Np
dGlvbiA9IG5ld1Njcm9sbFBvc2l0aW9uLnNocnVua1RvKHNjcm9sbFBvc2l0aW9uV2l0aEhlaWdo
dFNocnVuayk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb250ZW50c1NpemUo
KS53aWR0aCgpIDwgcHJldmlvdXNDb250ZW50c1NpemUud2lkdGgoKSkgeworICAgICAgICAgICAg
ICAgIEludFBvaW50IHNjcm9sbFBvc2l0aW9uV2l0aFdpZHRoU2hydW5rID0gSW50UG9pbnQobWF4
aW11bVNjcm9sbFBvc2l0aW9uKCkueCgpLCBuZXdTY3JvbGxQb3NpdGlvbi55KCkpOworICAgICAg
ICAgICAgICAgIG5ld1Njcm9sbFBvc2l0aW9uID0gbmV3U2Nyb2xsUG9zaXRpb24uc2hydW5rVG8o
c2Nyb2xsUG9zaXRpb25XaXRoV2lkdGhTaHJ1bmspOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBpZiAobmV3U2Nyb2xsUG9zaXRpb24gIT0gc2Nyb2xsUG9zaXRpb24oKSkgeworICAgICAg
ICAgICAgICAgIHNldFNjcm9sbFBvc2l0aW9uKG5ld1Njcm9sbFBvc2l0aW9uKTsKKyAgICAgICAg
ICAgICAgICBub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQoKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6em9vbVRvSW5pdGlh
bFNjYWxlT25Mb2FkKCkKK3sKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICBQbGF0Zm9ybTo6
bG9nKFBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJXZWJQYWdlUHJpdmF0ZTo6em9vbVRvSW5pdGlh
bFNjYWxlT25Mb2FkIik7CisjZW5kaWYKKworICAgIGJvb2wgbmVlZHNMYXlvdXQgPSBmYWxzZTsK
KworICAgIC8vIElmIHRoZSBjb250ZW50cyB3aWR0aCBleGNlZWRzIHRoZSB2aWV3cG9ydCB3aWR0
aCBzZXQgdG8gZGVza3RvcCBtb2RlLgorICAgIGlmIChtX3Nob3VsZFVzZUZpeGVkRGVza3RvcE1v
ZGUpCisgICAgICAgIG5lZWRzTGF5b3V0ID0gc2V0Vmlld01vZGUoRml4ZWREZXNrdG9wKTsKKyAg
ICBlbHNlCisgICAgICAgIG5lZWRzTGF5b3V0ID0gc2V0Vmlld01vZGUoRGVza3RvcCk7CisKKyAg
ICBpZiAobmVlZHNMYXlvdXQpIHsKKyAgICAgICAgLy8gVGhpcyBjYW4gY2F1c2UgcmVjdXJzaXZl
IGxheW91dC4uLgorICAgICAgICBzZXROZWVkc0xheW91dCgpOworICAgIH0KKworICAgIGlmIChj
b250ZW50c1NpemUoKS5pc0VtcHR5KCkpIHsKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICAg
ICAgUGxhdGZvcm06OmxvZyhQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiV2ViUGFnZVByaXZhdGU6
Onpvb21Ub0luaXRpYWxTY2FsZU9uTG9hZCBjb250ZW50IGlzIGVtcHR5ISIpOworI2VuZGlmCisg
ICAgICAgIHJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpOworICAgICAgICBtX2NsaWVudC0+cmVzZXRC
aXRtYXBab29tU2NhbGUoY3VycmVudFNjYWxlKCkpOworICAgICAgICBub3RpZnlUcmFuc2Zvcm1l
ZENvbnRlbnRzU2l6ZUNoYW5nZWQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJv
b2wgcGVyZm9ybWVkWm9vbSA9IGZhbHNlOworICAgIGJvb2wgc2hvdWxkWm9vbSA9ICFtX3VzZXJQ
ZXJmb3JtZWRNYW51YWxab29tOworCisgICAgLy8gSWYgdGhpcyBsb2FkIHNob3VsZCByZXN0b3Jl
IHZpZXcgc3RhdGUsIGRvbid0IHpvb20gdG8gaW5pdGlhbCBzY2FsZQorICAgIC8vIGJ1dCBpbnN0
ZWFkIGxldCB0aGUgSGlzdG9yeUl0ZW0ncyBzYXZlZCB2aWV3cG9ydCByZWlnbiBzdXByZW1lLgor
ICAgIGlmIChtX21haW5GcmFtZSAmJiBtX21haW5GcmFtZS0+bG9hZGVyKCkgJiYgbV9tYWluRnJh
bWUtPmxvYWRlcigpLT5zaG91bGRSZXN0b3JlU2Nyb2xsUG9zaXRpb25BbmRWaWV3U3RhdGUoKSkK
KyAgICAgICAgc2hvdWxkWm9vbSA9IGZhbHNlOworCisgICAgaWYgKHNob3VsZFpvb20gJiYgbG9h
ZFN0YXRlKCkgPT0gQ29tbWl0dGVkKSB7CisgICAgICAgIC8vIFByZXNlcnZlIGF0IHRvcCBhbmQg
YXQgbGVmdCBwb3NpdGlvbiwgdG8gYXZvaWQgc2Nyb2xsaW5nCisgICAgICAgIC8vIHRvIGEgbm9u
IHRvcC1sZWZ0IHBvc2l0aW9uIGZvciB3ZWIgcGFnZSB3aXRoIHZpZXdwb3J0IG1ldGEgdGFnCisg
ICAgICAgIC8vIHRoYXQgc3BlY2lmaWVzIGFuIGluaXRpYWwtc2NhbGUgdGhhdCBpcyB6b29tZWQg
aW4uCisgICAgICAgIEZsb2F0UG9pbnQgYW5jaG9yID0gY2VudGVyT2ZWaXNpYmxlQ29udGVudHNS
ZWN0KCk7CisgICAgICAgIGlmICghc2Nyb2xsUG9zaXRpb24oKS54KCkpCisgICAgICAgICAgICBh
bmNob3Iuc2V0WCgwKTsKKyAgICAgICAgaWYgKCFzY3JvbGxQb3NpdGlvbigpLnkoKSkKKyAgICAg
ICAgICAgIGFuY2hvci5zZXRZKDApOworICAgICAgICBwZXJmb3JtZWRab29tID0gem9vbUFib3V0
UG9pbnQoaW5pdGlhbFNjYWxlKCksIGFuY2hvcik7CisgICAgfQorCisgICAgLy8gem9vbUFib3V0
UG9pbnQgYWJvdmUgY2FuIGFsc28gdG9nZ2xlIHNldE5lZWRzTGF5b3V0IGFuZCBjYXVzZSByZWN1
cnNpdmUgbGF5b3V0Li4uCisgICAgcmVxdWVzdExheW91dElmTmVlZGVkKCk7CisKKyAgICBpZiAo
IXBlcmZvcm1lZFpvb20pIHsKKyAgICAgICAgLy8gV2Ugb25seSBub3RpZnkgaWYgd2UgZGlkbid0
IHBlcmZvcm0gem9vbSwgYmVjYXVzZSB6b29tIHdpbGwgbm90aWZ5IG9uCisgICAgICAgIC8vIGl0
cyBvd24uLi4KKyAgICAgICAgbV9jbGllbnQtPnJlc2V0Qml0bWFwWm9vbVNjYWxlKGN1cnJlbnRT
Y2FsZSgpKTsKKyAgICAgICAgbm90aWZ5VHJhbnNmb3JtZWRDb250ZW50c1NpemVDaGFuZ2VkKCk7
CisgICAgfQorfQorCitkb3VibGUgV2ViUGFnZVByaXZhdGU6Onpvb21Ub0ZpdFNjYWxlKCkgY29u
c3QKK3sKKyAgICAvLyBXZSBtdXN0IGNsYW1wIHRoZSBjb250ZW50cyBmb3IgdGhpcyBjYWxjdWxh
dGlvbiBzbyB0aGF0IHdlIGRvIG5vdCBhbGxvdyBhbgorICAgIC8vIGFyYml0cmFyaWx5IHNtYWxs
IHpvb21Ub0ZpdFNjYWxlIG11Y2ggbGlrZSB3ZSBjbGFtcCB0aGUgZml4ZWRMYXlvdXRTaXplKCkK
KyAgICAvLyBzbyB0aGF0IHdlIGRvIG5vdCBoYXZlIGFyYml0cmFyaWx5IGxhcmdlIGxheW91dCBz
aXplLgorICAgIC8vIElmIHdlIGhhdmUgYSBzcGVjaWZpZWQgdmlld3BvcnQsIHdlIG1heSBuZWVk
IHRvIGJlIGFibGUgdG8gem9vbSBvdXQgbW9yZS4KKyAgICBpbnQgY29udGVudFdpZHRoID0gc3Rk
OjptaW4oY29udGVudHNTaXplKCkud2lkdGgoKSwgc3RkOjptYXgobV92aXJ0dWFsVmlld3BvcnRX
aWR0aCwgc3RhdGljX2Nhc3Q8aW50PihkZWZhdWx0TWF4TGF5b3V0U2l6ZSgpLndpZHRoKCkpKSk7
CisKKyAgICAvLyBkZWZhdWx0TWF4TGF5b3V0U2l6ZSgpLndpZHRoKCkgaXMgYSBzYWZlZ3VhcmQg
Zm9yIGV4Y2Vzc2l2ZWx5IGxhcmdlIHBhZ2UgbGF5b3V0cyB0aGF0CisgICAgLy8gaXMgdG9vIHJl
c3RyaWN0aXZlIGZvciBpbWFnZSBkb2N1bWVudHMuIEluIHRoaXMgY2FzZSwgdGhlIGRvY3VtZW50
IHdpZHRoIGlzIHN1ZmZpY2llbnQuCisgICAgRG9jdW1lbnQqIGRvYyA9IG1fcGFnZS0+bWFpbkZy
YW1lKCktPmRvY3VtZW50KCk7CisgICAgaWYgKGRvYyAmJiBkb2MtPmlzSW1hZ2VEb2N1bWVudCgp
KQorICAgICAgIGNvbnRlbnRXaWR0aCA9IGNvbnRlbnRzU2l6ZSgpLndpZHRoKCk7CisKKyAgICAv
LyBJZiB3ZSBoYXZlIGEgdmlydHVhbCB2aWV3cG9ydCBhbmQgaXRzIGFzcGVjdCByYXRpbyBjYXVz
ZWQgY29udGVudCB0byBsYXlvdXQKKyAgICAvLyB3aWRlciB0aGFuIHRoZSBkZWZhdWx0IGxheW91
dCBhc3BlY3QgcmF0aW8gd2UgbmVlZCB0byB6b29tIHRvIGZpdCB0aGUgY29udGVudCBoZWlnaHQK
KyAgICAvLyBpbiBvcmRlciB0byBhdm9pZCBzaG93aW5nIGEgZ3JleSBhcmVhIGJlbG93IHRoZSB3
ZWIgcGFnZS4KKyAgICAvLyBXaXRob3V0IHZpcnR1YWwgdmlld3BvcnQgd2UgY2FuIG5ldmVyIGdl
dCBpbnRvIHRoaXMgc2l0dWF0aW9uLgorICAgIGlmIChoYXNWaXJ0dWFsVmlld3BvcnQoKSkgewor
ICAgICAgICBpbnQgY29udGVudEhlaWdodCA9IHN0ZDo6bWluKGNvbnRlbnRzU2l6ZSgpLmhlaWdo
dCgpLCBzdGQ6Om1heChtX3ZpcnR1YWxWaWV3cG9ydEhlaWdodCwgc3RhdGljX2Nhc3Q8aW50Pihk
ZWZhdWx0TWF4TGF5b3V0U2l6ZSgpLmhlaWdodCgpKSkpOworCisgICAgICAgIC8vIEFzcGVjdCBy
YXRpbyBjaGVjayB3aXRob3V0IGRpdmlzaW9uLgorICAgICAgICBpZiAoY29udGVudFdpZHRoICog
bV9kZWZhdWx0TGF5b3V0U2l6ZS5oZWlnaHQoKSA+IGNvbnRlbnRIZWlnaHQgKiBtX2RlZmF1bHRM
YXlvdXRTaXplLndpZHRoKCkpCisgICAgICAgICAgICByZXR1cm4gY29udGVudEhlaWdodCA+IDAg
PyBzdGF0aWNfY2FzdDxkb3VibGU+KG1fZGVmYXVsdExheW91dFNpemUuaGVpZ2h0KCkpIC8gY29u
dGVudEhlaWdodCA6IDEuMDsKKyAgICB9CisKKyAgICByZXR1cm4gY29udGVudFdpZHRoID4gMC4w
ID8gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX2FjdHVhbFZpc2libGVXaWR0aCkgLyBjb250ZW50V2lk
dGggOiAxLjA7Cit9CisKK2RvdWJsZSBXZWJQYWdlUHJpdmF0ZTo6aW5pdGlhbFNjYWxlKCkgY29u
c3QKK3sKKyAgICBpZiAobV9pbml0aWFsU2NhbGUgPiAwLjApCisgICAgICAgIHJldHVybiBtX2lu
aXRpYWxTY2FsZTsKKworICAgIGlmIChtX3dlYlNldHRpbmdzLT5pc1pvb21Ub0ZpdE9uTG9hZCgp
KQorICAgICAgICByZXR1cm4gem9vbVRvRml0U2NhbGUoKTsKKworICAgIHJldHVybiAxLjA7Cit9
CisKK3ZvaWQgV2ViUGFnZTo6aW5pdGlhbGl6ZUljb25EYXRhQmFzZSgpCit7CisgICAgSWNvbkRh
dGFiYXNlQ2xpZW50QmxhY2tCZXJyeTo6Z2V0SW5zdGFuY2UoKS0+aW5pdEljb25EYXRhYmFzZShk
LT5tX3dlYlNldHRpbmdzKTsKK30KKworYm9vbCBXZWJQYWdlOjppc1VzZXJTY2FsYWJsZSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGQtPmlzVXNlclNjYWxhYmxlKCk7Cit9CisKK2RvdWJsZSBXZWJQ
YWdlOjpjdXJyZW50U2NhbGUoKSBjb25zdAoreworICAgIHJldHVybiBkLT5jdXJyZW50U2NhbGUo
KTsKK30KKworZG91YmxlIFdlYlBhZ2U6OmluaXRpYWxTY2FsZSgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIGQtPmluaXRpYWxTY2FsZSgpOworfQorCitkb3VibGUgV2ViUGFnZTo6em9vbVRvRml0U2Nh
bGUoKSBjb25zdAoreworICAgIHJldHVybiBkLT56b29tVG9GaXRTY2FsZSgpOworfQorCit2b2lk
IFdlYlBhZ2U6OnNldEluaXRpYWxTY2FsZShkb3VibGUgaW5pdGlhbFNjYWxlKQoreworICAgIGQt
PnNldEluaXRpYWxTY2FsZShpbml0aWFsU2NhbGUpOworfQorCitkb3VibGUgV2ViUGFnZTo6bWlu
aW11bVNjYWxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+bWluaW11bVNjYWxlKCk7Cit9CisK
K3ZvaWQgV2ViUGFnZTo6c2V0TWluaW11bVNjYWxlKGRvdWJsZSBtaW5pbXVtU2NhbGUpCit7Cisg
ICAgZC0+c2V0TWluaW11bVNjYWxlKG1pbmltdW1TY2FsZSk7Cit9CisKK2RvdWJsZSBXZWJQYWdl
OjptYXhpbXVtU2NhbGUoKSBjb25zdAoreworICAgIHJldHVybiBkLT5tYXhpbXVtU2NhbGUoKTsK
K30KKwordm9pZCBXZWJQYWdlOjpzZXRNYXhpbXVtU2NhbGUoZG91YmxlIG1heGltdW1TY2FsZSkK
K3sKKyAgICBkLT5zZXRNYXhpbXVtU2NhbGUobWF4aW11bVNjYWxlKTsKK30KKworZG91YmxlIFdl
YlBhZ2VQcml2YXRlOjptYXhpbXVtU2NhbGUoKSBjb25zdAoreworICAgIGlmIChtX21heGltdW1T
Y2FsZSA+PSB6b29tVG9GaXRTY2FsZSgpICYmIG1fbWF4aW11bVNjYWxlID49IG1fbWluaW11bVNj
YWxlKQorICAgICAgICByZXR1cm4gbV9tYXhpbXVtU2NhbGU7CisKKyAgICByZXR1cm4gaGFzVmly
dHVhbFZpZXdwb3J0KCkgPyBzdGQ6Om1heDxkb3VibGU+KHpvb21Ub0ZpdFNjYWxlKCksIDQuMCkg
OiA0LjA7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnJlc2V0U2NhbGVzKCkKK3sKKyAgICBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCBpZGVudGl0eTsKKyAgICAqbV90cmFuc2Zvcm1hdGlvbk1hdHJp
eCA9IGlkZW50aXR5OworICAgIG1faW5pdGlhbFNjYWxlID0gbV93ZWJTZXR0aW5ncy0+aW5pdGlh
bFNjYWxlKCkgPiAwID8gbV93ZWJTZXR0aW5ncy0+aW5pdGlhbFNjYWxlKCkgOiAtMS4wOworICAg
IG1fbWluaW11bVNjYWxlID0gLTEuMDsKKyAgICBtX21heGltdW1TY2FsZSA9IC0xLjA7CisKKyAg
ICAvLyBXZSBoYXZlIHRvIGxldCBXZWJDb3JlIGtub3cgYWJvdXQgdXBkYXRlZCBmcmFtZXJlY3Qg
bm93IHRoYXQgd2UndmUKKyAgICAvLyByZXNldCBvdXIgc2NhbGVzLiBTZWU6IFJJTSBCdWcgIzQw
MS4KKyAgICB1cGRhdGVWaWV3cG9ydFNpemUoKTsKK30KKworSW50UG9pbnQgV2ViUGFnZVByaXZh
dGU6OnRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBtX2Jh
Y2tpbmdTdG9yZUNsaWVudC0+dHJhbnNmb3JtZWRTY3JvbGxQb3NpdGlvbigpOworfQorCitJbnRQ
b2ludCBXZWJQYWdlUHJpdmF0ZTo6dHJhbnNmb3JtZWRNYXhpbXVtU2Nyb2xsUG9zaXRpb24oKSBj
b25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNsaWVudC0+dHJhbnNmb3JtZWRNYXhp
bXVtU2Nyb2xsUG9zaXRpb24oKTsKK30KKworSW50U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6dHJhbnNm
b3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIEludFNpemUobV9h
Y3R1YWxWaXNpYmxlV2lkdGgsIG1fYWN0dWFsVmlzaWJsZUhlaWdodCk7Cit9CisKK0ludFNpemUg
V2ViUGFnZVByaXZhdGU6OnRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OnNpemUoKTsKK30KKworSW50UmVjdCBX
ZWJQYWdlUHJpdmF0ZTo6dHJhbnNmb3JtZWRWaXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3QKK3sK
KyAgICAvLyBVc3VhbGx5IHRoaXMgd291bGQgYmUgbWFwVG9UcmFuc2Zvcm1lZCh2aXNpYmxlQ29u
dGVudHNSZWN0KCkpLCBidXQKKyAgICAvLyB0aGF0IHJlc3VsdHMgaW4gcm91bmRpbmcgZXJyb3Jz
IGJlY2F1c2Ugd2UgYWxyZWFkeSBzZXQgdGhlIFdlYkNvcmUKKyAgICAvLyB2aWV3cG9ydCBzaXpl
IGZyb20gb3VyIG9yaWdpbmFsIHRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCkuCisgICAgLy8gSW5z
dGVhZCwgd2Ugb25seSB0cmFuc2Zvcm0gdGhlIHNjcm9sbCBwb3NpdGlvbiBhbmQgdGFrZSB0aGUK
KyAgICAvLyB2aWV3cG9ydCBzaXplIGFzIGl0IGlzLCB3aGljaCBlbnN1cmVzIHRoYXQgZS5nLiBi
bGl0dGluZyBvcGVyYXRpb25zCisgICAgLy8gYWx3YXlzIGNvdmVyIHRoZSB3aG9sZSB3aWRnZXQv
c2NyZWVuLgorICAgIHJldHVybiBJbnRSZWN0KHRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24oKSwg
dHJhbnNmb3JtZWRWaWV3cG9ydFNpemUoKSk7Cit9CisKK0ludFNpemUgV2ViUGFnZVByaXZhdGU6
OnRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkgY29uc3QKK3sKKyAgICAvLyBtYXBUb1RyYW5zZm9y
bWVkKCkgZnVuY3Rpb25zIHVzZSB0aGlzIG1ldGhvZCB0byBjcm9wIHRoZWlyIHJlc3VsdHMsCisg
ICAgLy8gc28gd2UgY2FuJ3QgbWFrZSB1c2Ugb2YgdGhlbSBoZXJlLiBXaGlsZSB3ZSB3YW50IHJv
dW5kaW5nIGluc2lkZSBwYWdlCisgICAgLy8gYm91bmRhcmllcyB0byBleHRlbmQgcmVjdGFuZ2xl
cyBhbmQgcm91bmQgcG9pbnRzLCB3ZSBuZWVkIHRvIGNyb3AgdGhlCisgICAgLy8gY29udGVudHMg
c2l6ZSB0byB0aGUgZmxvb3JlZCB2YWx1ZXMgc28gdGhhdCB3ZSBkb24ndCB0cnkgdG8gZGlzcGxh
eQorICAgIC8vIG9yIHJlcG9ydCBwb2ludHMgdGhhdCBhcmUgbm90IGZ1bGx5IGNvdmVyZWQgYnkg
dGhlIGFjdHVhbCBmbG9hdC1wb2ludAorICAgIC8vIGNvbnRlbnRzIHJlY3RhbmdsZS4KKyAgICBj
b25zdCBJbnRTaXplIHVudHJhbnNmb3JtZWRDb250ZW50c1NpemUgPSBjb250ZW50c1NpemUoKTsK
KyAgICBjb25zdCBGbG9hdFBvaW50IHRyYW5zZm9ybWVkQm90dG9tUmlnaHQgPSBtX3RyYW5zZm9y
bWF0aW9uTWF0cml4LT5tYXBQb2ludCgKKyAgICAgICAgRmxvYXRQb2ludCh1bnRyYW5zZm9ybWVk
Q29udGVudHNTaXplLndpZHRoKCksIHVudHJhbnNmb3JtZWRDb250ZW50c1NpemUuaGVpZ2h0KCkp
KTsKKyAgICByZXR1cm4gSW50U2l6ZShmbG9vcmYodHJhbnNmb3JtZWRCb3R0b21SaWdodC54KCkp
LCBmbG9vcmYodHJhbnNmb3JtZWRCb3R0b21SaWdodC55KCkpKTsKK30KKworSW50UG9pbnQgV2Vi
UGFnZVByaXZhdGU6Om1hcEZyb21Db250ZW50c1RvVmlld3BvcnQoY29uc3QgSW50UG9pbnQmIHBv
aW50KSBjb25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNsaWVudC0+bWFwRnJvbUNv
bnRlbnRzVG9WaWV3cG9ydChwb2ludCk7Cit9CisKK0ludFBvaW50IFdlYlBhZ2VQcml2YXRlOjpt
YXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9iYWNraW5nU3RvcmVDbGllbnQtPm1hcEZyb21WaWV3cG9ydFRvQ29udGVu
dHMocG9pbnQpOworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tQ29udGVudHNU
b1ZpZXdwb3J0KGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fYmFj
a2luZ1N0b3JlQ2xpZW50LT5tYXBGcm9tQ29udGVudHNUb1ZpZXdwb3J0KHJlY3QpOworfQorCitJ
bnRSZWN0IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKGNvbnN0IElu
dFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fYmFja2luZ1N0b3JlQ2xpZW50LT5t
YXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKHJlY3QpOworfQorCitJbnRQb2ludCBXZWJQYWdlUHJp
dmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQoY29u
c3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNs
aWVudC0+bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQocG9p
bnQpOworfQorCitJbnRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkVmll
d3BvcnRUb1RyYW5zZm9ybWVkQ29udGVudHMoY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAor
eworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNsaWVudC0+bWFwRnJvbVRyYW5zZm9ybWVkVmll
d3BvcnRUb1RyYW5zZm9ybWVkQ29udGVudHMocG9pbnQpOworfQorCitJbnRSZWN0IFdlYlBhZ2VQ
cml2YXRlOjptYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVHJhbnNmb3JtZWRWaWV3cG9ydChj
b25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNs
aWVudC0+bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQocmVj
dCk7Cit9CisKK0ludFJlY3QgV2ViUGFnZVByaXZhdGU6Om1hcEZyb21UcmFuc2Zvcm1lZFZpZXdw
b3J0VG9UcmFuc2Zvcm1lZENvbnRlbnRzKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fYmFja2luZ1N0b3JlQ2xpZW50LT5tYXBGcm9tVHJhbnNmb3JtZWRWaWV3cG9y
dFRvVHJhbnNmb3JtZWRDb250ZW50cyhyZWN0KTsKK30KKworLy8gTk9URTogUElYRUwgUk9VTkRJ
TkchCisvLyBBY2N1cmF0ZSBiYWNrLWFuZC1mb3J0aCByb3VuZGluZyBpcyBub3QgcG9zc2libGUg
d2l0aCBpbmZvcm1hdGlvbiBsb3NzCisvLyBieSBpbnRlZ2VyIHBvaW50cyBhbmQgc2l6ZXMsIHNv
IHdlIGFsd2F5cyBleHBhbmQgdGhlIHJlc3VsdGluZyBtYXBwZWQKKy8vIGZsb2F0IHJlY3Rhbmds
ZXMgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gRm9yIHBvaW50cywgd2UgYWx3YXlzIHVzZQorLy8g
Zmxvb3Itcm91bmRpbmcgaW4gbWFwVG9UcmFuc2Zvcm1lZCgpIHNvIHRoYXQgd2UgZG9uJ3QgaGF2
ZSB0byBjcm9wIHRvCisvLyB0aGUgKGZsb29yJ2QpIHRyYW5zZm9ybWVkIGNvbnRlbnRzIHNpemUu
CitzdGF0aWMgaW5saW5lIEludFBvaW50IHJvdW5kVHJhbnNmb3JtZWRQb2ludChjb25zdCBGbG9h
dFBvaW50ICZwb2ludCkKK3sKKyAgICAvLyBNYXBzIGJ5IHJvdW5kaW5nIGhhbGYgdG93YXJkcyB6
ZXJvLgorICAgIHJldHVybiBJbnRQb2ludChzdGF0aWNfY2FzdDxpbnQ+KGZsb29yZihwb2ludC54
KCkpKSwgc3RhdGljX2Nhc3Q8aW50PihmbG9vcmYocG9pbnQueSgpKSkpOworfQorCitzdGF0aWMg
aW5saW5lIEludFBvaW50IHJvdW5kVW50cmFuc2Zvcm1lZFBvaW50KGNvbnN0IEZsb2F0UG9pbnQg
JnBvaW50KQoreworICAgIC8vIE1hcHMgYnkgcm91bmRpbmcgaGFsZiBhd2F5IGZyb20gemVyby4K
KyAgICByZXR1cm4gSW50UG9pbnQoc3RhdGljX2Nhc3Q8aW50PihjZWlsZihwb2ludC54KCkpKSwg
c3RhdGljX2Nhc3Q8aW50PihjZWlsZihwb2ludC55KCkpKSk7Cit9CisKK0ludFBvaW50IFdlYlBh
Z2VQcml2YXRlOjptYXBUb1RyYW5zZm9ybWVkKGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QK
K3sKKyAgICByZXR1cm4gcm91bmRUcmFuc2Zvcm1lZFBvaW50KG1fdHJhbnNmb3JtYXRpb25NYXRy
aXgtPm1hcFBvaW50KEZsb2F0UG9pbnQocG9pbnQpKSk7Cit9CisKK0Zsb2F0UG9pbnQgV2ViUGFn
ZVByaXZhdGU6Om1hcFRvVHJhbnNmb3JtZWRGbG9hdFBvaW50KGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50KSBjb25zdAoreworICAgIHJldHVybiBtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tYXBQb2lu
dChwb2ludCk7Cit9CisKK0ludFBvaW50IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVHJhbnNmb3Jt
ZWQoY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIHJldHVybiByb3VuZFVudHJh
bnNmb3JtZWRQb2ludChtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5pbnZlcnNlKCkubWFwUG9pbnQo
RmxvYXRQb2ludChwb2ludCkpKTsKK30KKworRmxvYXRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6bWFw
RnJvbVRyYW5zZm9ybWVkRmxvYXRQb2ludChjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QK
K3sKKyAgICByZXR1cm4gbV90cmFuc2Zvcm1hdGlvbk1hdHJpeC0+aW52ZXJzZSgpLm1hcFBvaW50
KHBvaW50KTsKK30KKworRmxvYXRSZWN0IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVHJhbnNmb3Jt
ZWRGbG9hdFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHJldHVybiBt
X3RyYW5zZm9ybWF0aW9uTWF0cml4LT5pbnZlcnNlKCkubWFwUmVjdChyZWN0KTsKK30KKworSW50
U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6bWFwVG9UcmFuc2Zvcm1lZChjb25zdCBJbnRTaXplJiBzaXpl
KSBjb25zdAoreworICAgIHJldHVybiBtYXBUb1RyYW5zZm9ybWVkKEludFJlY3QoSW50UG9pbnQ6
Onplcm8oKSwgc2l6ZSkpLnNpemUoKTsKK30KKworSW50U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6bWFw
RnJvbVRyYW5zZm9ybWVkKGNvbnN0IEludFNpemUmIHNpemUpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1hcEZyb21UcmFuc2Zvcm1lZChJbnRSZWN0KEludFBvaW50Ojp6ZXJvKCksIHNpemUpKS5zaXpl
KCk7Cit9CisKK0ludFJlY3QgV2ViUGFnZVByaXZhdGU6Om1hcFRvVHJhbnNmb3JtZWQoY29uc3Qg
SW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gZW5jbG9zaW5nSW50UmVjdChtX3Ry
YW5zZm9ybWF0aW9uTWF0cml4LT5tYXBSZWN0KEZsb2F0UmVjdChyZWN0KSkpOworfQorCisvLyBV
c2UgdGhpcyBpbiBjb25qdW5jdGlvbiB3aXRoIG1hcFRvVHJhbnNmb3JtZWQoSW50UmVjdCksIGlu
IG1vc3QgY2FzZXMuCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpjbGlwVG9UcmFuc2Zvcm1lZENvbnRl
bnRzUmVjdChJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHJlY3QuaW50ZXJzZWN0KEludFJl
Y3QoSW50UG9pbnQ6Onplcm8oKSwgdHJhbnNmb3JtZWRDb250ZW50c1NpemUoKSkpOworfQorCitJ
bnRSZWN0IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVHJhbnNmb3JtZWQoY29uc3QgSW50UmVjdCYg
cmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gZW5jbG9zaW5nSW50UmVjdChtX3RyYW5zZm9ybWF0
aW9uTWF0cml4LT5pbnZlcnNlKCkubWFwUmVjdChGbG9hdFJlY3QocmVjdCkpKTsKK30KKworYm9v
bCBXZWJQYWdlUHJpdmF0ZTo6dHJhbnNmb3JtZWRQb2ludEVxdWFsc1VudHJhbnNmb3JtZWRQb2lu
dChjb25zdCBJbnRQb2ludCYgdHJhbnNmb3JtZWRQb2ludCwgY29uc3QgSW50UG9pbnQmIHVudHJh
bnNmb3JtZWRQb2ludCkKK3sKKyAgICAvLyBTY2FsaW5nIGRvd24gaXMgYWx3YXlzIG1vcmUgYWNj
dXJhdGUgdGhhbiBzY2FsaW5nIHVwLgorICAgIGlmIChtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5h
KCkgPiAxLjApCisgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFBvaW50ID09IG1hcFRvVHJhbnNm
b3JtZWQodW50cmFuc2Zvcm1lZFBvaW50KTsKKworICAgIHJldHVybiBtYXBGcm9tVHJhbnNmb3Jt
ZWQodHJhbnNmb3JtZWRQb2ludCkgPT0gdW50cmFuc2Zvcm1lZFBvaW50OworfQorCit2b2lkIFdl
YlBhZ2VQcml2YXRlOjpub3RpZnlUcmFuc2Zvcm1DaGFuZ2VkKCkKK3sKKyAgICBub3RpZnlUcmFu
c2Zvcm1lZENvbnRlbnRzU2l6ZUNoYW5nZWQoKTsKKyAgICBub3RpZnlUcmFuc2Zvcm1lZFNjcm9s
bENoYW5nZWQoKTsKKworICAgIG1fYmFja2luZ1N0b3JlLT5kLT50cmFuc2Zvcm1DaGFuZ2VkKCk7
Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6Om5vdGlmeVRyYW5zZm9ybWVkQ29udGVudHNTaXpl
Q2hhbmdlZCgpCit7CisgICAgLy8gV2UgbWFyayBoZXJlIGFzIHRoZSBsYXN0IHJlcG9ydGVkIGNv
bnRlbnQgc2l6ZSB3ZSBzZW50IHRvIHRoZSBjbGllbnQuCisgICAgbV9wcmV2aW91c0NvbnRlbnRz
U2l6ZSA9IGNvbnRlbnRzU2l6ZSgpOworCisgICAgY29uc3QgSW50U2l6ZSBzaXplID0gdHJhbnNm
b3JtZWRDb250ZW50c1NpemUoKTsKKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+Y29udGVudHNTaXpl
Q2hhbmdlZChzaXplKTsKKyAgICBtX2NsaWVudC0+Y29udGVudHNTaXplQ2hhbmdlZChzaXplKTsK
KyAgICBtX3NlbGVjdGlvbkhhbmRsZXItPnNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCgpOworfQor
Cit2b2lkIFdlYlBhZ2VQcml2YXRlOjpub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQoKQor
eworICAgIGNvbnN0IEludFBvaW50IHBvcyA9IHRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24oKTsK
KyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+c2Nyb2xsQ2hhbmdlZChwb3MpOworICAgIG1fY2xpZW50
LT5zY3JvbGxDaGFuZ2VkKHBvcyk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OnNldFZpZXdN
b2RlKFZpZXdNb2RlIG1vZGUpCit7CisgICAgaWYgKCFtX21haW5GcmFtZS0+dmlldygpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBtX3ZpZXdNb2RlID0gbW9kZTsKKworICAgIC8vIElm
IHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSBuZXN0ZWQgbGF5b3V0IHdpdGggYSByZWN1cnNpb24g
Y291bnQgYWJvdmUKKyAgICAvLyBzb21lIG1heGltdW0gdGhyZXNob2xkLCB0aGVuIG91ciBhbGdv
cml0aG0gZm9yIGZpbmRpbmcgdGhlIG1pbmltdW0gY29udGVudAorICAgIC8vIHdpZHRoIG9mIGEg
Z2l2ZW4gcGFnZSBoYXMgYmVjb21lIGRlcGVuZGVudCBvbiB0aGUgdmlzaWJsZSB3aWR0aC4KKyAg
ICAvLworICAgIC8vIFdlIG5lZWQgdG8gZmluZCBzb21lIG1ldGhvZCB0byBlbnN1cmUgdGhhdCB3
ZSBkb24ndCBleHBlcmllbmNlIGV4Y2Vzc2l2ZQorICAgIC8vIGFuZCBldmVuIGluZmluaXRlIHJl
Y3Vyc2lvbi4gVGhpcyBjYW4gZXZlbiBoYXBwZW4gd2l0aCB2YWxpZCBodG1sLiBUaGUKKyAgICAv
LyBmb3JtZXIgY2FuIGhhcHBlbiB3aGVuIHdlIHJ1biBpbnRvIGlubGluZSB0ZXh0IHdpdGggZmV3
IGNhbmRpZGF0ZXMgZm9yIGxpbmUKKyAgICAvLyBicmVhay4gVGhlIGxhdHRlciBjYW4gaGFwcGVu
IGZvciBpbnN0YW5jZSBpZiB0aGUgcGFnZSBoYXMgYSBuZWdhdGl2ZSBtYXJnaW4KKyAgICAvLyBz
ZXQgYWdhaW5zdCB0aGUgcmlnaHQgYm9yZGVyLiBOb3RlOiB0aGlzIGlzIHZhbGlkIGJ5IHNwZWMg
YW5kIGNhbiBsZWFkIHRvCisgICAgLy8gYSBzaXR1YXRpb24gd2hlcmUgdGhlcmUgaXMgbm8gdmFs
dWUgZm9yIHdoaWNoIHRoZSBjb250ZW50IHdpZHRoIHdpbGwgZW5zdXJlCisgICAgLy8gbm8gaG9y
aXpvbnRhbCBzY3JvbGxiYXIuCisgICAgLy8gRXhhbXBsZTogTGF5b3V0VGVzdHMvY3NzMS9ib3hf
cHJvcGVydGllcy9tYXJnaW4uaHRtbAorICAgIC8vCisgICAgLy8gSW4gb3JkZXIgdG8gYWRkcmVz
cyBzdWNoIHNpdHVhdGlvbnMgd2hlbiB3ZSBkZXRlY3QgYSByZWN1cnNpb24gYWJvdmUgc29tZQor
ICAgIC8vIG1heGltdW0gdGhyZXNob2xkIHdlIHNuYXAgb3VyIGZpeGVkIGxheW91dCBzaXplIHRv
IGEgZGVmaW5lZCBxdWFudHVtIGluY3JlbWVudC4KKyAgICAvLyBFdmVudHVhbGx5LCBlaXRoZXIg
dGhlIGNvbnRlbnQgd2lkdGggd2lsbCBiZSBzYXRpc2ZpZWQgdG8gZW5zdXJlIG5vIGhvcml6b250
YWwKKyAgICAvLyBzY3JvbGxiYXIgb3IgdGhpcyBpbmNyZW1lbnQgd2lsbCBydW4gaW50byB0aGUg
bWF4aW11bSBsYXlvdXQgc2l6ZSBhbmQgdGhlCisgICAgLy8gcmVjdXJzaW9uIHdpbGwgbmVjZXNz
YXJpbHkgZW5kLgorICAgIGJvb2wgc25hcFRvSW5jcmVtZW50ID0gZGlkTGF5b3V0RXhjZWVkTWF4
aW11bUl0ZXJhdGlvbnMoKTsKKworICAgIEludFNpemUgY3VycmVudFNpemUgPSBtX21haW5GcmFt
ZS0+dmlldygpLT5maXhlZExheW91dFNpemUoKTsKKyAgICBJbnRTaXplIG5ld1NpemUgPSBmaXhl
ZExheW91dFNpemUoc25hcFRvSW5jcmVtZW50KTsKKyAgICBpZiAoY3VycmVudFNpemUgPT0gbmV3
U2l6ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRklYTUU6IFRlbXAgc29sdXRp
b24uIFdlJ2xsIGdldCBiYWNrIHRvIHRoaXMuCisgICAgaWYgKG1fbmVzdGVkTGF5b3V0RmluaXNo
ZWRDb3VudCkgeworICAgICAgICBkb3VibGUgd2lkdGhDaGFuZ2UgPSBmYWJzKGRvdWJsZShuZXdT
aXplLndpZHRoKCkgLSBjdXJyZW50U2l6ZS53aWR0aCgpKSAvIGN1cnJlbnRTaXplLndpZHRoKCkp
OworICAgICAgICBkb3VibGUgaGVpZ2h0Q2hhbmdlID0gZmFicyhkb3VibGUobmV3U2l6ZS5oZWln
aHQoKSAtIGN1cnJlbnRTaXplLmhlaWdodCgpKSAvIGN1cnJlbnRTaXplLmhlaWdodCgpKTsKKyAg
ICAgICAgaWYgKHdpZHRoQ2hhbmdlIDwgMC4wNSAmJiBoZWlnaHRDaGFuZ2UgPCAwLjA1KQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fbWFpbkZyYW1lLT52aWV3KCkt
PnNldFVzZUZpeGVkTGF5b3V0KHVzZUZpeGVkTGF5b3V0KCkpOworICAgIG1fbWFpbkZyYW1lLT52
aWV3KCktPnNldEZpeGVkTGF5b3V0U2l6ZShuZXdTaXplKTsKKyAgICByZXR1cm4gdHJ1ZTsgLy8g
TmVlZHMgcmUtbGF5b3V0IQorfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXRDdXJzb3IoUGxh
dGZvcm1DdXJzb3JIYW5kbGUgaGFuZGxlKQoreworICAgIGlmIChtX2N1cnJlbnRDdXJzb3IudHlw
ZSgpICE9IGhhbmRsZS50eXBlKCkpIHsKKyAgICAgICAgbV9jdXJyZW50Q3Vyc29yID0gaGFuZGxl
OworICAgICAgICBtX2NsaWVudC0+Y3Vyc29yQ2hhbmdlZChoYW5kbGUudHlwZSgpLCBoYW5kbGUu
dXJsKCkuY19zdHIoKSwgaGFuZGxlLmhvdHNwb3QoKS54KCksIGhhbmRsZS5ob3RzcG90KCkueSgp
KTsKKyAgICB9Cit9CisKK1BsYXRmb3JtOjpOZXR3b3JrU3RyZWFtRmFjdG9yeSogV2ViUGFnZVBy
aXZhdGU6Om5ldHdvcmtTdHJlYW1GYWN0b3J5KCkKK3sKKyAgICByZXR1cm4gbV9jbGllbnQtPm5l
dHdvcmtTdHJlYW1GYWN0b3J5KCk7Cit9CisKK1BsYXRmb3JtOjpHcmFwaGljczo6V2luZG93KiBX
ZWJQYWdlUHJpdmF0ZTo6cGxhdGZvcm1XaW5kb3coKSBjb25zdAoreworICAgIHJldHVybiBtX2Ns
aWVudC0+d2luZG93KCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldFByZXZlbnRzU2Ny
ZWVuRGltbWluZyhib29sIGtlZXBBd2FrZSkKK3sKKyAgICBpZiAoa2VlcEF3YWtlKSB7CisgICAg
ICAgIGlmICghbV9wcmV2ZW50SWRsZURpbW1pbmdDb3VudCkKKyAgICAgICAgICAgIG1fY2xpZW50
LT5zZXRQcmV2ZW50c1NjcmVlbklkbGVEaW1taW5nKHRydWUpOworICAgICAgICBtX3ByZXZlbnRJ
ZGxlRGltbWluZ0NvdW50Kys7CisgICAgfSBlbHNlIGlmIChtX3ByZXZlbnRJZGxlRGltbWluZ0Nv
dW50ID4gMCkgeworICAgICAgICBtX3ByZXZlbnRJZGxlRGltbWluZ0NvdW50LS07CisgICAgICAg
IGlmICghbV9wcmV2ZW50SWRsZURpbW1pbmdDb3VudCkKKyAgICAgICAgICAgIG1fY2xpZW50LT5z
ZXRQcmV2ZW50c1NjcmVlbklkbGVEaW1taW5nKGZhbHNlKTsKKyAgICB9IGVsc2UKKyAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIFNldFByZXZlbnRzU2NyZWVuSWRsZURpbW1pbmcoZmFs
c2UpIGNhbGxlZCB0b28gbWFueSB0aW1lcy4KK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2hv
d1ZpcnR1YWxLZXlib2FyZChib29sIHNob3dLZXlib2FyZCkKK3sKKyAgICBtX2NsaWVudC0+c2hv
d1ZpcnR1YWxLZXlib2FyZChzaG93S2V5Ym9hcmQpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRl
OjplbnN1cmVDb250ZW50VmlzaWJsZShib29sIGNlbnRlckluVmlldykKK3sKKyAgICBtX2lucHV0
SGFuZGxlci0+ZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJsZShjZW50ZXJJblZpZXcpOworfQorCit2
b2lkIFdlYlBhZ2VQcml2YXRlOjp6b29tVG9Db250ZW50UmVjdChjb25zdCBJbnRSZWN0JiByZWN0
KQoreworICAgIC8vIERvbid0IHNjYWxlIGlmIHRoZSB1c2VyIGlzIG5vdCBzdXBwb3NlZCB0byBz
Y2FsZS4KKyAgICBpZiAoIWlzVXNlclNjYWxhYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IEZsb2F0UG9pbnQgYW5jaG9yID0gRmxvYXRQb2ludChyZWN0LndpZHRoKCkgLyAyLjAgKyByZWN0
LngoKSwgcmVjdC5oZWlnaHQoKSAvIDIuMCArIHJlY3QueSgpKTsKKyAgICBJbnRTaXplIHZpZXdT
aXplID0gdmlld3BvcnRTaXplKCk7CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIHNjYWxlIHJlcXVp
cmVkIHRvIHNjYWxlIHRoYXQgZGltZW5zaW9uIHRvIGZpdC4KKyAgICBkb3VibGUgc2NhbGVIID0g
KGRvdWJsZSl2aWV3U2l6ZS53aWR0aCgpIC8gKGRvdWJsZSlyZWN0LndpZHRoKCk7CisgICAgZG91
YmxlIHNjYWxlViA9IChkb3VibGUpdmlld1NpemUuaGVpZ2h0KCkgLyAoZG91YmxlKXJlY3QuaGVp
Z2h0KCk7CisKKyAgICAvLyBDaG9vc2UgdGhlIHNtYWxsZXIgc2NhbGUgZmFjdG9yIHNvIHRoYXQg
YWxsIG9mIHRoZSBjb250ZW50IGlzIHZpc2libGUuCisgICAgem9vbUFib3V0UG9pbnQobWluKHNj
YWxlSCwgc2NhbGVWKSwgYW5jaG9yKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6cmVnaXN0
ZXJQbHVnaW4oUGx1Z2luVmlldyogcGx1Z2luLCBib29sIHNob3VsZFJlZ2lzdGVyKQoreworICAg
IGlmIChzaG91bGRSZWdpc3RlcikKKyAgICAgICAgbV9wbHVnaW5WaWV3cy5hZGQocGx1Z2luKTsK
KyAgICBlbHNlCisgICAgICAgIG1fcGx1Z2luVmlld3MucmVtb3ZlKHBsdWdpbik7Cit9CisKKyNk
ZWZpbmUgRk9SX0VBQ0hfUExVR0lOVklFVyhwbHVnaW5WaWV3cykgXAorICAgIEhhc2hTZXQ8UGx1
Z2luVmlldyo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHBsdWdpblZpZXdzLmJlZ2luKCk7IFwKKyAg
ICBIYXNoU2V0PFBsdWdpblZpZXcqPjo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IHBsdWdpblZpZXdz
LmVuZCgpOyBcCisgICAgZm9yICg7IGl0ICE9IGxhc3Q7ICsraXQpCisKK3ZvaWQgV2ViUGFnZVBy
aXZhdGU6Om5vdGlmeVBhZ2VPbkxvYWQoKQoreworICAgIEZPUl9FQUNIX1BMVUdJTlZJRVcobV9w
bHVnaW5WaWV3cykKKyAgICAgICAgKCppdCktPmhhbmRsZU9uTG9hZEV2ZW50KCk7Cit9CisKK2Jv
b2wgV2ViUGFnZVByaXZhdGU6OnNob3VsZFBsdWdpbkVudGVyRnVsbFNjcmVlbihQbHVnaW5WaWV3
KiBwbHVnaW4sIGNvbnN0IGNoYXIqIHdpbmRvd1VuaXF1ZVByZWZpeCkKK3sKKyAgICByZXR1cm4g
bV9jbGllbnQtPnNob3VsZFBsdWdpbkVudGVyRnVsbFNjcmVlbigpOworfQorCit2b2lkIFdlYlBh
Z2VQcml2YXRlOjpkaWRQbHVnaW5FbnRlckZ1bGxTY3JlZW4oUGx1Z2luVmlldyogcGx1Z2luLCBj
b25zdCBjaGFyKiB3aW5kb3dVbmlxdWVQcmVmaXgpCit7CisgICAgbV9mdWxsU2NyZWVuUGx1Z2lu
VmlldyA9IHBsdWdpbjsKKyAgICBtX2NsaWVudC0+ZGlkUGx1Z2luRW50ZXJGdWxsU2NyZWVuKCk7
CisgICAgUGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3c6OnNldFRyYW5zcGFyZW5jeURpc2NhcmRG
aWx0ZXIod2luZG93VW5pcXVlUHJlZml4KTsKKyAgICBtX2NsaWVudC0+d2luZG93KCktPnNldFNl
bnNpdGl2aXR5RnVsbHNjcmVlbk92ZXJyaWRlKHRydWUpOworfQorCit2b2lkIFdlYlBhZ2VQcml2
YXRlOjpkaWRQbHVnaW5FeGl0RnVsbFNjcmVlbihQbHVnaW5WaWV3KiBwbHVnaW4sIGNvbnN0IGNo
YXIqIHdpbmRvd1VuaXF1ZVByZWZpeCkKK3sKKyAgICBtX2Z1bGxTY3JlZW5QbHVnaW5WaWV3ID0g
MDsKKyAgICBtX2NsaWVudC0+ZGlkUGx1Z2luRXhpdEZ1bGxTY3JlZW4oKTsKKyAgICBQbGF0Zm9y
bTo6R3JhcGhpY3M6OldpbmRvdzo6c2V0VHJhbnNwYXJlbmN5RGlzY2FyZEZpbHRlcigwKTsKKyAg
ICBtX2NsaWVudC0+d2luZG93KCktPnNldFNlbnNpdGl2aXR5RnVsbHNjcmVlbk92ZXJyaWRlKGZh
bHNlKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6b25QbHVnaW5TdGFydEJhY2tncm91bmRQ
bGF5KFBsdWdpblZpZXcqIHBsdWdpbiwgY29uc3QgY2hhciogd2luZG93VW5pcXVlUHJlZml4KQor
eworICAgIG1fY2xpZW50LT5vblBsdWdpblN0YXJ0QmFja2dyb3VuZFBsYXkoKTsKK30KKwordm9p
ZCBXZWJQYWdlUHJpdmF0ZTo6b25QbHVnaW5TdG9wQmFja2dyb3VuZFBsYXkoUGx1Z2luVmlldyog
cGx1Z2luLCBjb25zdCBjaGFyKiB3aW5kb3dVbmlxdWVQcmVmaXgpCit7CisgICAgbV9jbGllbnQt
Pm9uUGx1Z2luU3RvcEJhY2tncm91bmRQbGF5KCk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6
OmxvY2tPcmllbnRhdGlvbihib29sIGxhbmRzY2FwZSkKK3sKKyAgICByZXR1cm4gbV9jbGllbnQt
PmxvY2tPcmllbnRhdGlvbihsYW5kc2NhcGUpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjp1
bmxvY2tPcmllbnRhdGlvbigpCit7CisgICAgcmV0dXJuIG1fY2xpZW50LT51bmxvY2tPcmllbnRh
dGlvbigpOworfQorCitpbnQgV2ViUGFnZVByaXZhdGU6Om9yaWVudGF0aW9uKCkgY29uc3QKK3sK
KyNpZiBFTkFCTEUoT1JJRU5UQVRJT05fRVZFTlRTKQorICAgIHJldHVybiBtX21haW5GcmFtZS0+
b3JpZW50YXRpb24oKTsKKyNlbHNlCisjZXJyb3IgT1JJRU5UQVRJT05fRVZFTlRTIG11c3QgYmUg
ZGVmaW5lZC4KKy8vIE9yIGEgY29weSBvZiB0aGUgb3JpZW50YXRpb24gdmFsdWUgd2lsbCBoYXZl
IHRvIGJlIHN0b3JlZCBpbiB0aGVzZSBvYmplY3RzLgorI2VuZGlmCit9CisKK2RvdWJsZSBXZWJQ
YWdlUHJpdmF0ZTo6Y3VycmVudFpvb21GYWN0b3IoKSBjb25zdAoreworICAgIHJldHVybiBjdXJy
ZW50U2NhbGUoKTsKK30KKworaW50IFdlYlBhZ2VQcml2YXRlOjpzaG93QWxlcnREaWFsb2coV2Vi
UGFnZUNsaWVudDo6QWxlcnRUeXBlIGF0eXBlKQoreworICAgIHJldHVybiBtX2NsaWVudC0+c2hv
d0FsZXJ0RGlhbG9nKGF0eXBlKTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6aXNBY3RpdmUo
KSBjb25zdAoreworICAgIHJldHVybiBtX2NsaWVudC0+aXNBY3RpdmUoKTsKK30KKworYm9vbCBX
ZWJQYWdlUHJpdmF0ZTo6dXNlRml4ZWRMYXlvdXQoKSBjb25zdAoreworICAgIHJldHVybiB0cnVl
OworfQorCitBY3RpdmVOb2RlQ29udGV4dCBXZWJQYWdlUHJpdmF0ZTo6YWN0aXZlTm9kZUNvbnRl
eHQoVGFyZ2V0RGV0ZWN0aW9uU3RyYXRlZ3kgc3RyYXRlZ3kpCit7CisgICAgQWN0aXZlTm9kZUNv
bnRleHQgY29udGV4dDsKKworICAgIFJlZlB0cjxOb2RlPiBub2RlID0gY29udGV4dE5vZGUoc3Ry
YXRlZ3kpOworICAgIG1fY3VycmVudENvbnRleHROb2RlID0gbm9kZTsKKyAgICBpZiAoIW1fY3Vy
cmVudENvbnRleHROb2RlKQorICAgICAgICByZXR1cm4gY29udGV4dDsKKworICAgIHJlcXVlc3RM
YXlvdXRJZk5lZWRlZCgpOworCisgICAgYm9vbCBub2RlQWxsb3dTZWxlY3Rpb25PdmVycmlkZSA9
IGZhbHNlOworICAgIGlmIChOb2RlKiBsaW5rTm9kZSA9IG5vZGUtPmVuY2xvc2luZ0xpbmtFdmVu
dFBhcmVudE9yU2VsZigpKSB7CisgICAgICAgIEtVUkwgaHJlZjsKKyAgICAgICAgaWYgKGxpbmtO
b2RlLT5pc0xpbmsoKSAmJiBsaW5rTm9kZS0+aGFzQXR0cmlidXRlcygpKSB7CisgICAgICAgICAg
ICBpZiAoQXR0cmlidXRlKiBhdHRyaWJ1dGUgPSBsaW5rTm9kZS0+YXR0cmlidXRlcygpLT5nZXRB
dHRyaWJ1dGVJdGVtKEhUTUxOYW1lczo6aHJlZkF0dHIpKQorICAgICAgICAgICAgICAgIGhyZWYg
PSBsaW5rTm9kZS0+ZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwoc3RyaXBMZWFkaW5nQW5kVHJhaWxp
bmdIVE1MU3BhY2VzKGF0dHJpYnV0ZS0+dmFsdWUoKSkpOworICAgICAgICB9CisKKyAgICAgICAg
U3RyaW5nIHBhdHRlcm4gPSBmaW5kUGF0dGVyblN0cmluZ0ZvclVybChocmVmKTsKKyAgICAgICAg
aWYgKCFwYXR0ZXJuLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRleHQuc2V0UGF0dGVybihw
YXR0ZXJuKTsKKworICAgICAgICBpZiAoIWhyZWYuc3RyaW5nKCkuaXNFbXB0eSgpKSB7CisgICAg
ICAgICAgICBjb250ZXh0LnNldFVybChocmVmLnN0cmluZygpKTsKKworICAgICAgICAgICAgLy8g
TGlua3MgYXJlIG5vbi1zZWxlY3RhYmxlIGJ5IGRlZmF1bHQsIGJ1dCBzZWxlY3Rpb24gc2hvdWxk
IGJlIGFsbG93ZWQKKyAgICAgICAgICAgIC8vIHByb3ZpZGluZyB0aGUgcGFnZSBpcyBzZWxlY3Rh
YmxlLCB1c2UgdGhlIHBhcmVudCB0byBkZXRlcm1pbmUgaXQuCisgICAgICAgICAgICBpZiAobGlu
a05vZGUtPnBhcmVudE5vZGUoKSAmJiBsaW5rTm9kZS0+cGFyZW50Tm9kZSgpLT5jYW5TdGFydFNl
bGVjdGlvbigpKQorICAgICAgICAgICAgICAgIG5vZGVBbGxvd1NlbGVjdGlvbk92ZXJyaWRlID0g
dHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghbm9kZUFsbG93U2VsZWN0aW9uT3Zl
cnJpZGUgJiYgIW5vZGUtPmNhblN0YXJ0U2VsZWN0aW9uKCkpCisgICAgICAgIGNvbnRleHQucmVz
ZXRGbGFnKEFjdGl2ZU5vZGVDb250ZXh0OjpJc1NlbGVjdGFibGUpOworCisgICAgaWYgKG5vZGUt
PmlzSFRNTEVsZW1lbnQoKSkgeworICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZUVsZW1l
bnQgPSAwOworICAgICAgICBpZiAobm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmltZ1RhZykp
CisgICAgICAgICAgICBpbWFnZUVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MSW1hZ2VFbGVtZW50
Kj4obm9kZS5nZXQoKSk7CisgICAgICAgIGVsc2UgaWYgKG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5h
bWVzOjphcmVhVGFnKSkKKyAgICAgICAgICAgIGltYWdlRWxlbWVudCA9IHN0YXRpY19jYXN0PEhU
TUxBcmVhRWxlbWVudCo+KG5vZGUuZ2V0KCkpLT5pbWFnZUVsZW1lbnQoKTsKKyAgICAgICAgaWYg
KGltYWdlRWxlbWVudCAmJiBpbWFnZUVsZW1lbnQtPnJlbmRlcmVyKCkpIHsKKyAgICAgICAgICAg
IC8vIEZJWE1FOiBBdCB0aGUgbWVhbiB0aW1lLCB3ZSBvbmx5IHNob3cgIlNhdmUgSW1hZ2UiIHdo
ZW4gdGhlIGltYWdlIGRhdGEgaXMgYXZhaWxhYmxlLgorICAgICAgICAgICAgaWYgKENhY2hlZFJl
c291cmNlKiBjYWNoZWRSZXNvdXJjZSA9IGltYWdlRWxlbWVudC0+Y2FjaGVkSW1hZ2UoKSkgewor
ICAgICAgICAgICAgICAgIGlmIChjYWNoZWRSZXNvdXJjZS0+aXNMb2FkZWQoKSAmJiBjYWNoZWRS
ZXNvdXJjZS0+ZGF0YSgpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBzdHJp
cExlYWRpbmdBbmRUcmFpbGluZ0hUTUxTcGFjZXMoaW1hZ2VFbGVtZW50LT5nZXRBdHRyaWJ1dGUo
SFRNTE5hbWVzOjpzcmNBdHRyKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRl
eHQuc2V0SW1hZ2VTcmMobm9kZS0+ZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwodXJsKS5zdHJpbmco
KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5n
IGFsdCA9IGltYWdlRWxlbWVudC0+YWx0VGV4dCgpOworICAgICAgICAgICAgaWYgKCFhbHQuaXNO
dWxsKCkpCisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRJbWFnZUFsdChhbHQpOworICAgICAg
ICB9CisgICAgfQorCisgICAgaWYgKG5vZGUtPmlzVGV4dE5vZGUoKSkgeworICAgICAgICBUZXh0
KiBjdXJUZXh0ID0gc3RhdGljX2Nhc3Q8VGV4dCo+KG5vZGUuZ2V0KCkpOworICAgICAgICBpZiAo
IWN1clRleHQtPndob2xlVGV4dCgpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRleHQuc2V0
VGV4dChjdXJUZXh0LT53aG9sZVRleHQoKSk7CisgICAgfQorCisgICAgaWYgKG5vZGUtPmlzRWxl
bWVudE5vZGUoKSkgeworICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxl
bWVudCo+KG5vZGUtPnNoYWRvd0FuY2VzdG9yTm9kZSgpKTsKKyAgICAgICAgaWYgKERPTVN1cHBv
cnQ6OmlzVGV4dEJhc2VkQ29udGVudEVkaXRhYmxlRWxlbWVudChlbGVtZW50KSkgeworICAgICAg
ICAgICAgY29udGV4dC5zZXRGbGFnKEFjdGl2ZU5vZGVDb250ZXh0OjpJc0lucHV0KTsKKyAgICAg
ICAgICAgIGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aW5wdXRUYWcpKQorICAg
ICAgICAgICAgICAgIGNvbnRleHQuc2V0RmxhZyhBY3RpdmVOb2RlQ29udGV4dDo6SXNTaW5nbGVM
aW5lKTsKKyAgICAgICAgICAgIGlmIChET01TdXBwb3J0Ojppc1Bhc3N3b3JkRWxlbWVudChlbGVt
ZW50KSkKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldEZsYWcoQWN0aXZlTm9kZUNvbnRleHQ6
OklzUGFzc3dvcmQpOworCisgICAgICAgICAgICBTdHJpbmcgZWxlbWVudFRleHQoRE9NU3VwcG9y
dDo6aW5wdXRFbGVtZW50VGV4dChlbGVtZW50KSk7CisgICAgICAgICAgICBpZiAoIWVsZW1lbnRU
ZXh0LnN0cmlwV2hpdGVTcGFjZSgpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBjb250ZXh0
LnNldFRleHQoZWxlbWVudFRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5vZGUt
PmlzRm9jdXNhYmxlKCkpCisgICAgICAgIGNvbnRleHQuc2V0RmxhZyhBY3RpdmVOb2RlQ29udGV4
dDo6SXNGb2N1c2FibGUpOworCisgICAgcmV0dXJuIGNvbnRleHQ7Cit9CisKK3ZvaWQgV2ViUGFn
ZVByaXZhdGU6OnVwZGF0ZUN1cnNvcigpCit7CisgICAgaW50IGJ1dHRvbk1hc2sgPSAwOworICAg
IGlmIChtX2xhc3RNb3VzZUV2ZW50LmJ1dHRvbigpID09IExlZnRCdXR0b24pCisgICAgICAgIGJ1
dHRvbk1hc2sgPSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6U2NyZWVuTGVmdE1vdXNlQnV0dG9uOwor
ICAgIGVsc2UgaWYgKG1fbGFzdE1vdXNlRXZlbnQuYnV0dG9uKCkgPT0gTWlkZGxlQnV0dG9uKQor
ICAgICAgICBidXR0b25NYXNrID0gUGxhdGZvcm06Ok1vdXNlRXZlbnQ6OlNjcmVlbk1pZGRsZU1v
dXNlQnV0dG9uOworICAgIGVsc2UgaWYgKG1fbGFzdE1vdXNlRXZlbnQuYnV0dG9uKCkgPT0gUmln
aHRCdXR0b24pCisgICAgICAgIGJ1dHRvbk1hc2sgPSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6U2Ny
ZWVuUmlnaHRNb3VzZUJ1dHRvbjsKKworICAgIFBsYXRmb3JtOjpNb3VzZUV2ZW50IGV2ZW50KGJ1
dHRvbk1hc2ssIGJ1dHRvbk1hc2ssIG1hcFRvVHJhbnNmb3JtZWQobV9sYXN0TW91c2VFdmVudC5w
b3MoKSksIG1hcFRvVHJhbnNmb3JtZWQobV9sYXN0TW91c2VFdmVudC5nbG9iYWxQb3MoKSksIDAs
IDApOworICAgIG1fd2ViUGFnZS0+bW91c2VFdmVudChldmVudCk7Cit9CisKK0ludFNpemUgV2Vi
UGFnZVByaXZhdGU6OmZpeGVkTGF5b3V0U2l6ZShib29sIHNuYXBUb0luY3JlbWVudCkgY29uc3QK
K3sKKyAgICBpZiAoaGFzVmlydHVhbFZpZXdwb3J0KCkpCisgICAgICAgIHJldHVybiBJbnRTaXpl
KG1fdmlydHVhbFZpZXdwb3J0V2lkdGgsIG1fdmlydHVhbFZpZXdwb3J0SGVpZ2h0KTsKKworICAg
IGNvbnN0IGludCBkZWZhdWx0TGF5b3V0V2lkdGggPSBtX2RlZmF1bHRMYXlvdXRTaXplLndpZHRo
KCk7CisgICAgY29uc3QgaW50IGRlZmF1bHRMYXlvdXRIZWlnaHQgPSBtX2RlZmF1bHRMYXlvdXRT
aXplLmhlaWdodCgpOworCisgICAgaW50IG1pbldpZHRoID0gZGVmYXVsdExheW91dFdpZHRoOwor
ICAgIGludCBtYXhXaWR0aCA9IGRlZmF1bHRNYXhMYXlvdXRTaXplKCkud2lkdGgoKTsKKyAgICBp
bnQgbWF4SGVpZ2h0ID0gZGVmYXVsdE1heExheW91dFNpemUoKS5oZWlnaHQoKTsKKworICAgIC8v
IElmIHRoZSBsb2FkIHN0YXRlIGlzIG5vbmUgdGhlbiB3ZSBoYXZlbid0IGFjdHVhbGx5IGdvdCBh
bnl0aGluZyB5ZXQsIGJ1dCB3ZSBuZWVkIHRvIGxheW91dAorICAgIC8vIHRoZSBlbnRpcmUgcGFn
ZSBzbyB0aGF0IHRoZSB1c2VyIHNlZXMgdGhlIGVudGlyZSBwYWdlICh1bnJlbmRlcmVkKSBpbnN0
ZWFkIG9mIGp1c3QgcGFydCBvZiBpdC4KKyAgICBpZiAobV9sb2FkU3RhdGUgPT0gTm9uZSkKKyAg
ICAgICAgcmV0dXJuIEludFNpemUoZGVmYXVsdExheW91dFdpZHRoLCBkZWZhdWx0TGF5b3V0SGVp
Z2h0KTsKKworICAgIGlmIChtX3ZpZXdNb2RlID09IEZpeGVkRGVza3RvcCkgeworICAgICAgICBp
bnQgd2lkdGggID0gbWF4V2lkdGg7CisgICAgICAgIC8vIGlmIHRoZSBkZWZhdWx0TGF5b3V0SGVp
Z2h0IGlzIGF0IG1pbmltdW0sIGl0IHByb2JhYmx5IHdhcyBzZXQgYXMgMAorICAgICAgICAvLyBh
bmQgY2xhbXBlZCwgbWVhbmluZyBpdCdzIGVmZmVjdGl2ZWx5IG5vdCBzZXQuICAoRXZlbiBpZiBp
dCBoYXBwZW5lZAorICAgICAgICAvLyB0byBiZSBzZXQgZXhhY3RseSB0byB0aGUgbWluaW11bSwg
aXQncyB0b28gc21hbGwgdG8gYmUgdXNlZnVsLikgIFNvCisgICAgICAgIC8vIGlnbm9yZSBpdC4K
KyAgICAgICAgaW50IGhlaWdodDsKKyAgICAgICAgaWYgKGRlZmF1bHRMYXlvdXRIZWlnaHQgPD0g
bWluaW11bUxheW91dFNpemUuaGVpZ2h0KCkpCisgICAgICAgICAgICBoZWlnaHQgPSBtYXhIZWln
aHQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGhlaWdodCA9IGNlaWxmKHN0YXRpY19jYXN0
PGZsb2F0Pih3aWR0aCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oZGVmYXVsdExheW91dFdpZHRoKSAq
IHN0YXRpY19jYXN0PGZsb2F0PihkZWZhdWx0TGF5b3V0SGVpZ2h0KSk7CisgICAgICAgIHJldHVy
biBJbnRTaXplKHdpZHRoLCBoZWlnaHQpOworICAgIH0KKworICAgIGlmIChtX3ZpZXdNb2RlID09
IERlc2t0b3ApIHsKKyAgICAgICAgLy8gSWYgd2UgZGV0ZWN0IGFuIG92ZXJmbG93IGxhcmdlciB0
aGFuIHRoZSBjb250ZW50cyBzaXplIHRoZW4gdXNlIHRoYXQgaW5zdGVhZCBzaW5jZQorICAgICAg
ICAvLyBpdCdsbCBzdGlsbCBiZSBjbGFtcGVkIGJ5IHRoZSBtYXhXaWR0aCBiZWxvdy4uLgorICAg
ICAgICBpbnQgd2lkdGggPSBzdGQ6Om1heChhYnNvbHV0ZVZpc2libGVPdmVyZmxvd1NpemUoKS53
aWR0aCgpLCBjb250ZW50c1NpemUoKS53aWR0aCgpKTsKKworICAgICAgICBpZiAoc25hcFRvSW5j
cmVtZW50KSB7CisgICAgICAgICAgICAvLyBTbmFwIHRvIGluY3JlbWVudHMgb2YgZGVmYXVsdExh
eW91dFdpZHRoIC8gMi4wLgorICAgICAgICAgICAgZmxvYXQgZmFjdG9yID0gc3RhdGljX2Nhc3Q8
ZmxvYXQ+KHdpZHRoKSAvIChkZWZhdWx0TGF5b3V0V2lkdGggLyAyLjApOworICAgICAgICAgICAg
ZmFjdG9yID0gY2VpbGYoZmFjdG9yKTsKKyAgICAgICAgICAgIHdpZHRoID0gKGRlZmF1bHRMYXlv
dXRXaWR0aCAvIDIuMCkgKiBmYWN0b3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2lkdGgg
PCBtaW5XaWR0aCkKKyAgICAgICAgICAgIHdpZHRoID0gbWluV2lkdGg7CisgICAgICAgIGlmICh3
aWR0aCA+IG1heFdpZHRoKQorICAgICAgICAgICAgd2lkdGggPSBtYXhXaWR0aDsKKyAgICAgICAg
aW50IGhlaWdodCA9IGNlaWxmKHN0YXRpY19jYXN0PGZsb2F0Pih3aWR0aCkgLyBzdGF0aWNfY2Fz
dDxmbG9hdD4oZGVmYXVsdExheW91dFdpZHRoKSAqIHN0YXRpY19jYXN0PGZsb2F0PihkZWZhdWx0
TGF5b3V0SGVpZ2h0KSk7CisgICAgICAgIHJldHVybiBJbnRTaXplKHdpZHRoLCBoZWlnaHQpOwor
ICAgIH0KKworICAgIGlmIChtX3dlYlNldHRpbmdzLT5pc1pvb21Ub0ZpdE9uTG9hZCgpKSB7Cisg
ICAgICAgIC8vIFdlIG5lZWQgdG8gY2xhbXAgdGhlIGxheW91dCB3aWR0aCB0byB0aGUgbWluaW11
bSBvZiB0aGUgbGF5b3V0CisgICAgICAgIC8vIHdpZHRoIG9yIHRoZSBjb250ZW50IHdpZHRoLiBU
aGlzIGlzIGltcG9ydGFudCB1bmRlciByb3RhdGlvbiBmb3IgbW9iaWxlCisgICAgICAgIC8vIHdl
YnNpdGVzLiBXZSB3YW50IHRoZSBwYWdlIHRvIHJlbWFpbiBsYXlvdXRlZCBhdCB0aGUgc2FtZSB3
aWR0aCB3aGljaAorICAgICAgICAvLyBpdCB3YXMgbG9hZGVkIHdpdGgsIGFuZCBpbnN0ZWFkIGNo
YW5nZSB0aGUgem9vbSBsZXZlbCB0byBmaXQgdG8gc2NyZWVuLgorICAgICAgICAvLyBUaGUgaGVp
Z2h0IGlzIHdlbGNvbWUgdG8gYWRhcHQgdG8gdGhlIGhlaWdodCB1c2VkIGluIHRoZSBuZXcgb3Jp
ZW50YXRpb24sCisgICAgICAgIC8vIG90aGVyd2lzZSB3ZSB3aWxsIGdldCBhIGdyZXkgYmFyIGJl
bG93IHRoZSB3ZWIgcGFnZS4KKyAgICAgICAgaWYgKG1fbWFpbkZyYW1lLT52aWV3KCkgJiYgIWNv
bnRlbnRzU2l6ZSgpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIG1pbldpZHRoID0gY29udGVudHNT
aXplKCkud2lkdGgoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSBp
cyBubyBjb250ZW50cyB3aWR0aCwgdXNlIHRoZSBtaW5pbXVtIG9mIHNjcmVlbiB3aWR0aAorICAg
ICAgICAgICAgLy8gYW5kIGxheW91dCB3aWR0aCB0byBzaGFwZSB0aGUgZmlyc3QgbGF5b3V0IHRv
IGEgY29udGVudHMgd2lkdGgKKyAgICAgICAgICAgIC8vIHRoYXQgd2UgY291bGQgcmVhc29uYWJs
eSB6b29tIHRvIGZpdCwgaW4gYSBtYW5uZXIgdGhhdCB0YWtlcworICAgICAgICAgICAgLy8gb3Jp
ZW50YXRpb24gaW50byBhY2NvdW50IGFuZCBzdGlsbCByZXNwZWN0cyBhIHNtYWxsIGRlZmF1bHQK
KyAgICAgICAgICAgIC8vIGxheW91dCB3aWR0aC4KKyNpZiBFTkFCTEUoT1JJRU5UQVRJT05fRVZF
TlRTKQorICAgICAgICAgICAgbWluV2lkdGggPSBtX21haW5GcmFtZS0+b3JpZW50YXRpb24oKSAl
IDE4MAorICAgICAgICAgICAgICAgID8gUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OmhlaWdo
dCgpCisgICAgICAgICAgICAgICAgOiBQbGF0Zm9ybTo6R3JhcGhpY3M6OlNjcmVlbjo6d2lkdGgo
KTsKKyNlbHNlCisgICAgICAgICAgICBtaW5XaWR0aCA9IFBsYXRmb3JtOjpHcmFwaGljczo6U2Ny
ZWVuOjp3aWR0aCgpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gSW50
U2l6ZShzdGQ6Om1pbihtaW5XaWR0aCwgZGVmYXVsdExheW91dFdpZHRoKSwgZGVmYXVsdExheW91
dEhlaWdodCk7Cit9CisKK0JhY2tpbmdTdG9yZUNsaWVudCogV2ViUGFnZVByaXZhdGU6OmJhY2tp
bmdTdG9yZUNsaWVudEZvckZyYW1lKGNvbnN0IEZyYW1lKiBmcmFtZSkgY29uc3QKK3sKKyAgICBB
U1NFUlQoZnJhbWUpOworICAgIEJhY2tpbmdTdG9yZUNsaWVudCogYmFja2luZ1N0b3JlQ2xpZW50
ID0gMDsKKyAgICBpZiAobV9iYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZU1hcC5jb250YWlucyhm
cmFtZSkpCisgICAgICAgIGJhY2tpbmdTdG9yZUNsaWVudCA9IG1fYmFja2luZ1N0b3JlQ2xpZW50
Rm9yRnJhbWVNYXAuZ2V0KGZyYW1lKTsKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlQ2xpZW50Owor
fQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjphZGRCYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZShj
b25zdCBGcmFtZSogZnJhbWUsIEJhY2tpbmdTdG9yZUNsaWVudCogY2xpZW50KQoreworICAgIEFT
U0VSVChmcmFtZSk7CisgICAgQVNTRVJUKGNsaWVudCk7CisgICAgbV9iYWNraW5nU3RvcmVDbGll
bnRGb3JGcmFtZU1hcC5hZGQoZnJhbWUsIGNsaWVudCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZh
dGU6OnJlbW92ZUJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKGNvbnN0IEZyYW1lKiBmcmFtZSkK
K3sKKyAgICBBU1NFUlQoZnJhbWUpOworICAgIGlmIChtX2JhY2tpbmdTdG9yZUNsaWVudEZvckZy
YW1lTWFwLmNvbnRhaW5zKGZyYW1lKSkKKyAgICAgICAgbV9iYWNraW5nU3RvcmVDbGllbnRGb3JG
cmFtZU1hcC5yZW1vdmUoZnJhbWUpOworfQorCisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmNsZWFy
RG9jdW1lbnREYXRhKGNvbnN0IERvY3VtZW50KiBkb2N1bWVudEdvaW5nQXdheSkKK3sKKyAgICBB
U1NFUlQoZG9jdW1lbnRHb2luZ0F3YXkpOworICAgIGlmIChtX2N1cnJlbnRDb250ZXh0Tm9kZSAm
JiBtX2N1cnJlbnRDb250ZXh0Tm9kZS0+ZG9jdW1lbnQoKSA9PSBkb2N1bWVudEdvaW5nQXdheSkK
KyAgICAgICAgbV9jdXJyZW50Q29udGV4dE5vZGUgPSAwOworCisgICAgaWYgKG1fY3VycmVudFBp
bmNoWm9vbU5vZGUgJiYgbV9jdXJyZW50UGluY2hab29tTm9kZS0+ZG9jdW1lbnQoKSA9PSBkb2N1
bWVudEdvaW5nQXdheSkKKyAgICAgICAgbV9jdXJyZW50UGluY2hab29tTm9kZSA9IDA7CisKKyAg
ICBpZiAobV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlICYmIG1fY3VycmVudEJsb2NrWm9v
bUFkanVzdGVkTm9kZS0+ZG9jdW1lbnQoKSA9PSBkb2N1bWVudEdvaW5nQXdheSkKKyAgICAgICAg
bV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlID0gMDsKKworICAgIGlmIChtX2luUmVnaW9u
U2Nyb2xsU3RhcnRpbmdOb2RlICYmIG1faW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGUtPmRvY3Vt
ZW50KCkgPT0gZG9jdW1lbnRHb2luZ0F3YXkpCisgICAgICAgIG1faW5SZWdpb25TY3JvbGxTdGFy
dGluZ05vZGUgPSAwOworCisgICAgTm9kZSogbm9kZVVuZGVyRmF0RmluZ2VyID0gbV90b3VjaEV2
ZW50SGFuZGxlci0+bGFzdEZhdEZpbmdlcnNSZXN1bHQoKS5ub2RlKCk7CisgICAgaWYgKG5vZGVV
bmRlckZhdEZpbmdlciAmJiBub2RlVW5kZXJGYXRGaW5nZXItPmRvY3VtZW50KCkgPT0gZG9jdW1l
bnRHb2luZ0F3YXkpCisgICAgICAgIG1fdG91Y2hFdmVudEhhbmRsZXItPnJlc2V0TGFzdEZhdEZp
bmdlcnNSZXN1bHQoKTsKKworICAgIC8vIE5PVEU6IG1fZnVsbHNjcmVlblZpZGVvTm9kZSwgbV9m
dWxsU2NyZWVuUGx1Z2luVmlldyBhbmQgbV9wbHVnaW5WaWV3cworICAgIC8vIGFyZSBjbGVhcmVk
IGluIG90aGVyIG1ldGhvZHMgYWxyZWFkeS4KK30KKwordHlwZWRlZiBib29sICgqUHJlZGljYXRl
RnVuY3Rpb24pKFJlbmRlckxheWVyKik7CitzdGF0aWMgYm9vbCBpc1Bvc2l0aW9uZWRDb250YWlu
ZXIoUmVuZGVyTGF5ZXIqIGxheWVyKQoreworICAgIFJlbmRlck9iamVjdCogbyA9IGxheWVyLT5y
ZW5kZXJlcigpOworICAgIHJldHVybiBvLT5pc1JlbmRlclZpZXcoKSB8fCBvLT5pc1Bvc2l0aW9u
ZWQoKSB8fCBvLT5pc1JlbFBvc2l0aW9uZWQoKSB8fCBsYXllci0+aGFzVHJhbnNmb3JtKCk7Cit9
CisKK3N0YXRpYyBib29sIGlzTm9uUmVuZGVyVmlld0ZpeGVkUG9zaXRpb25lZENvbnRhaW5lcihS
ZW5kZXJMYXllciogbGF5ZXIpCit7CisgICAgUmVuZGVyT2JqZWN0KiBvID0gbGF5ZXItPnJlbmRl
cmVyKCk7CisgICAgaWYgKG8tPmlzUmVuZGVyVmlldygpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICByZXR1cm4gby0+aXNQb3NpdGlvbmVkKCkgJiYgby0+c3R5bGUoKS0+cG9zaXRpb24o
KSA9PSBGaXhlZFBvc2l0aW9uOworfQorCitzdGF0aWMgYm9vbCBpc0ZpeGVkUG9zaXRpb25lZENv
bnRhaW5lcihSZW5kZXJMYXllciogbGF5ZXIpCit7CisgICAgUmVuZGVyT2JqZWN0KiBvID0gbGF5
ZXItPnJlbmRlcmVyKCk7CisgICAgcmV0dXJuIG8tPmlzUmVuZGVyVmlldygpIHx8IChvLT5pc1Bv
c2l0aW9uZWQoKSAmJiBvLT5zdHlsZSgpLT5wb3NpdGlvbigpID09IEZpeGVkUG9zaXRpb24pOwor
fQorCitzdGF0aWMgUmVuZGVyTGF5ZXIqIGZpbmRBbmNlc3Rvck9yU2VsZk5vdE1hdGNoaW5nKFBy
ZWRpY2F0ZUZ1bmN0aW9uIHByZWRpY2F0ZSwgUmVuZGVyTGF5ZXIqIGxheWVyKQoreworICAgIFJl
bmRlckxheWVyKiBjdXJyID0gbGF5ZXI7CisgICAgd2hpbGUgKGN1cnIgJiYgIXByZWRpY2F0ZShj
dXJyKSkKKyAgICAgICAgY3VyciA9IGN1cnItPnBhcmVudCgpOworCisgICAgcmV0dXJuIGN1cnI7
Cit9CisKK1JlbmRlckxheWVyKiBXZWJQYWdlUHJpdmF0ZTo6ZW5jbG9zaW5nRml4ZWRQb3NpdGlv
bmVkQW5jZXN0b3JPclNlbGZJZkZpeGVkUG9zaXRpb25lZChSZW5kZXJMYXllciogbGF5ZXIpCit7
CisgICAgcmV0dXJuIGZpbmRBbmNlc3Rvck9yU2VsZk5vdE1hdGNoaW5nKCZpc0ZpeGVkUG9zaXRp
b25lZENvbnRhaW5lciwgbGF5ZXIpOworfQorCitSZW5kZXJMYXllciogV2ViUGFnZVByaXZhdGU6
OmVuY2xvc2luZ1Bvc2l0aW9uZWRBbmNlc3Rvck9yU2VsZklmUG9zaXRpb25lZChSZW5kZXJMYXll
ciogbGF5ZXIpCit7CisgICAgcmV0dXJuIGZpbmRBbmNlc3Rvck9yU2VsZk5vdE1hdGNoaW5nKCZp
c1Bvc2l0aW9uZWRDb250YWluZXIsIGxheWVyKTsKK30KKworc3RhdGljIGlubGluZSBGcmFtZSog
ZnJhbWVGb3JOb2RlKE5vZGUqIG5vZGUpCit7CisgICAgTm9kZSogb3JpZ05vZGUgPSBub2RlOwor
ICAgIGZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+cGFyZW50Tm9kZSgpKSB7CisgICAgICAgIGlm
IChSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKSkgeworICAgICAgICAg
ICAgaWYgKHJlbmRlcmVyLT5pc1JlbmRlclZpZXcoKSkgeworICAgICAgICAgICAgICAgIGlmIChG
cmFtZVZpZXcqIHZpZXcgPSB0b1JlbmRlclZpZXcocmVuZGVyZXIpLT5mcmFtZVZpZXcoKSkgewor
ICAgICAgICAgICAgICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gdmlldy0+ZnJhbWUoKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZTsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVuZGVyZXItPmlzV2lkZ2V0KCkpIHsKKyAg
ICAgICAgICAgICAgICBXaWRnZXQqIHdpZGdldCA9IHRvUmVuZGVyV2lkZ2V0KHJlbmRlcmVyKS0+
d2lkZ2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHdpZGdldCAmJiB3aWRnZXQtPmlzRnJhbWVW
aWV3KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZyYW1lKiBmcmFtZSA9IHN0YXRpY19j
YXN0PEZyYW1lVmlldyo+KHdpZGdldCktPmZyYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gZnJhbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgfQorCisgICAgZm9yIChub2RlID0gb3JpZ05vZGU7IG5vZGU7IG5vZGUgPSBub2Rl
LT5wYXJlbnROb2RlKCkpIHsKKyAgICAgICAgaWYgKERvY3VtZW50KiBkb2MgPSBub2RlLT5kb2N1
bWVudCgpKSB7CisgICAgICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gZG9jLT5mcmFtZSgpKQor
ICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJl
dHVybiAwOworfQorCitzdGF0aWMgSW50UmVjdCBnZXROb2RlV2luZG93UmVjdChOb2RlKiBub2Rl
KQoreworICAgIGlmIChGcmFtZSogZnJhbWUgPSBmcmFtZUZvck5vZGUobm9kZSkpIHsKKyAgICAg
ICAgaWYgKEZyYW1lVmlldyogdmlldyA9IGZyYW1lLT52aWV3KCkpCisgICAgICAgICAgICByZXR1
cm4gdmlldy0+Y29udGVudHNUb1dpbmRvdyhub2RlLT5nZXRSZWN0KCkpOworICAgIH0KKyAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gSW50UmVjdCgpOworfQorCitJbnRSZWN0
IFdlYlBhZ2VQcml2YXRlOjpnZXRSZWN1cnNpdmVWaXNpYmxlV2luZG93UmVjdChTY3JvbGxWaWV3
KiB2aWV3LCBib29sIG5vQ2xpcE9mTWFpbkZyYW1lKQoreworICAgIEFTU0VSVChtX21haW5GcmFt
ZSk7CisKKyAgICAvLyBEb24ndCBjYWxsIHRoaXMgZnVuY3Rpb24gYXNraW5nIHRvIG5vdCBjbGlw
IHRoZSBtYWluIGZyYW1lIHByb3ZpZGluZyBvbmx5CisgICAgLy8gdGhlIG1haW4gZnJhbWUuIEFs
bCB0aGF0IGNhbiBiZSByZXR1cm5lZCBpcyB0aGUgY29udGVudCByZWN0IHdoaWNoCisgICAgLy8g
aXNuJ3Qgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIGZvci4KKyAgICBpZiAobm9DbGlwT2ZNYWluRnJh
bWUgJiYgdmlldyA9PSBtX21haW5GcmFtZS0+dmlldygpKSB7CisgICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gSW50UmVjdChJbnRQb2ludDo6emVybygpLCB2aWV3
LT5jb250ZW50c1NpemUoKSk7CisgICAgfQorCisgICAgSW50UmVjdCB2aXNpYmxlV2luZG93UmVj
dCh2aWV3LT5jb250ZW50c1RvV2luZG93KHZpZXctPnZpc2libGVDb250ZW50UmVjdChmYWxzZSkp
KTsKKyAgICBpZiAodmlldy0+cGFyZW50KCkgJiYgIShub0NsaXBPZk1haW5GcmFtZSAmJiB2aWV3
LT5wYXJlbnQoKSA9PSBtX21haW5GcmFtZS0+dmlldygpKSkgeworICAgICAgICAvLyBJbnRlcnNl
Y3Qgd2l0aCBwYXJlbnQgdmlzaWJsZSByZWN0LgorICAgICAgICB2aXNpYmxlV2luZG93UmVjdC5p
bnRlcnNlY3QoZ2V0UmVjdXJzaXZlVmlzaWJsZVdpbmRvd1JlY3Qodmlldy0+cGFyZW50KCksIG5v
Q2xpcE9mTWFpbkZyYW1lKSk7CisgICAgfQorICAgIHJldHVybiB2aXNpYmxlV2luZG93UmVjdDsK
K30KKwordm9pZCBXZWJQYWdlOjphc3NpZ25Gb2N1cyhQbGF0Zm9ybTo6Rm9jdXNEaXJlY3Rpb24g
ZGlyZWN0aW9uKQoreworICAgIGQtPmFzc2lnbkZvY3VzKGRpcmVjdGlvbik7Cit9CisKK3ZvaWQg
V2ViUGFnZVByaXZhdGU6OmFzc2lnbkZvY3VzKFBsYXRmb3JtOjpGb2N1c0RpcmVjdGlvbiBkaXJl
Y3Rpb24pCit7CisgICAgQVNTRVJUKChpbnQpIFBsYXRmb3JtOjpGb2N1c0RpcmVjdGlvbk5vbmUg
PT0gKGludCkgRm9jdXNEaXJlY3Rpb25Ob25lKTsKKyAgICBBU1NFUlQoKGludCkgUGxhdGZvcm06
OkZvY3VzRGlyZWN0aW9uRm9yd2FyZCA9PSAoaW50KSBGb2N1c0RpcmVjdGlvbkZvcndhcmQpOwor
ICAgIEFTU0VSVCgoaW50KSBQbGF0Zm9ybTo6Rm9jdXNEaXJlY3Rpb25CYWNrd2FyZCA9PSAoaW50
KSBGb2N1c0RpcmVjdGlvbkJhY2t3YXJkKTsKKworICAgIC8vIEZpcnN0IHdlIGNsZWFyIHRoZSBm
b2N1cywgc2luY2Ugd2Ugd2FudCB0byBmb2N1cyBlaXRoZXIgaW5pdGlhbCBvciB0aGUgbGFzdAor
ICAgIC8vIGZvY3VzYWJsZSBlbGVtZW50IGluIHRoZSB3ZWJwYWdlIChhY2NvcmRpbmcgdG8gdGhl
IFRBQklOREVYKSwgb3Igc2ltcGx5IGNsZWFyCisgICAgLy8gdGhlIGZvY3VzLgorICAgIGNsZWFy
Rm9jdXNOb2RlKCk7CisKKyAgICBzd2l0Y2ggKGRpcmVjdGlvbikgeworICAgIGNhc2UgRm9jdXNE
aXJlY3Rpb25Gb3J3YXJkOgorICAgIGNhc2UgRm9jdXNEaXJlY3Rpb25CYWNrd2FyZDoKKyAgICAg
ICAgbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+c2V0SW5pdGlhbEZvY3VzKChGb2N1c0RpcmVj
dGlvbikgZGlyZWN0aW9uLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb2N1c0RpcmVj
dGlvbk5vbmU6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworICAgIH0KK30KKworUGxhdGZvcm06OkludFJlY3QgV2ViUGFnZVByaXZh
dGU6OmZvY3VzTm9kZVJlY3QoKQoreworICAgIEZyYW1lKiBmcmFtZSA9IGZvY3VzZWRPck1haW5G
cmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVj
dCgpOworCisgICAgRG9jdW1lbnQqIGRvYyA9IGZyYW1lLT5kb2N1bWVudCgpOworICAgIEZyYW1l
VmlldyogdmlldyA9IGZyYW1lLT52aWV3KCk7CisgICAgaWYgKCFkb2MgfHwgIXZpZXcgfHwgdmll
dy0+bmVlZHNMYXlvdXQoKSkKKyAgICAgICAgcmV0dXJuIFBsYXRmb3JtOjpJbnRSZWN0KCk7CisK
KyAgICBJbnRSZWN0IGZvY3VzUmVjdCA9IHJlY3RGb3JOb2RlKGRvYy0+Zm9jdXNlZE5vZGUoKSk7
CisgICAgZm9jdXNSZWN0ID0gYWRqdXN0UmVjdE9mZnNldEZvckZyYW1lT2Zmc2V0KGZvY3VzUmVj
dCwgZG9jLT5mb2N1c2VkTm9kZSgpKTsKKyAgICBmb2N1c1JlY3QgPSBtYXBUb1RyYW5zZm9ybWVk
KGZvY3VzUmVjdCk7CisgICAgY2xpcFRvVHJhbnNmb3JtZWRDb250ZW50c1JlY3QoZm9jdXNSZWN0
KTsKKyAgICByZXR1cm4gZm9jdXNSZWN0OworfQorCitQYXNzUmVmUHRyPE5vZGU+IFdlYlBhZ2VQ
cml2YXRlOjpjb250ZXh0Tm9kZShUYXJnZXREZXRlY3Rpb25TdHJhdGVneSBzdHJhdGVneSkKK3sK
KyAgICBFdmVudEhhbmRsZXIqIGV2ZW50SGFuZGxlciA9IGZvY3VzZWRPck1haW5GcmFtZSgpLT5l
dmVudEhhbmRsZXIoKTsKKyAgICBjb25zdCBGYXRGaW5nZXJzUmVzdWx0IGxhc3RGYXRGaW5nZXJz
UmVzdWx0ID0gbV90b3VjaEV2ZW50SGFuZGxlci0+bGFzdEZhdEZpbmdlcnNSZXN1bHQoKTsKKyAg
ICBib29sIGlzVG91Y2hpbmcgPSBsYXN0RmF0RmluZ2Vyc1Jlc3VsdC5pc1ZhbGlkKCkgJiYgc3Ry
YXRlZ3kgPT0gUmVjdEJhc2VkOworCisgICAgLy8gVW5wcmVzcyB0aGUgbW91c2UgYnV0dG9uIGFs
d2F5cy4KKyAgICBpZiAoZXZlbnRIYW5kbGVyLT5tb3VzZVByZXNzZWQoKSkKKyAgICAgICAgZXZl
bnRIYW5kbGVyLT5zZXRNb3VzZVByZXNzZWQoZmFsc2UpOworCisgICAgLy8gQ2hlY2sgaWYgd2Un
cmUgdXNpbmcgTGlua1RvTGluayBhbmQgdGhlIHVzZXIgaXMgbm90IHRvdWNoaW5nIHRoZSBzY3Jl
ZW4uCisgICAgaWYgKG1fd2ViU2V0dGluZ3MtPmRvZXNHZXRGb2N1c05vZGVDb250ZXh0KCkgJiYg
IWlzVG91Y2hpbmcpIHsKKyAgICAgICAgUmVmUHRyPE5vZGU+IG5vZGU7CisgICAgICAgIG5vZGUg
PSBtX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+ZG9jdW1l
bnQoKS0+Zm9jdXNlZE5vZGUoKTsKKyAgICAgICAgaWYgKG5vZGUpIHsKKyAgICAgICAgICAgIElu
dFJlY3QgdmlzaWJsZVJlY3QgPSBJbnRSZWN0KEludFBvaW50KCksIGFjdHVhbFZpc2libGVTaXpl
KCkpOworICAgICAgICAgICAgaWYgKCF2aXNpYmxlUmVjdC5pbnRlcnNlY3RzKGdldE5vZGVXaW5k
b3dSZWN0KG5vZGUuZ2V0KCkpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
fQorICAgICAgICByZXR1cm4gbm9kZS5yZWxlYXNlKCk7CisgICAgfQorCisgICAgLy8gQ2hlY2sg
Zm9yIHRleHQgaW5wdXQuCisgICAgaWYgKGlzVG91Y2hpbmcgJiYgbGFzdEZhdEZpbmdlcnNSZXN1
bHQuaXNUZXh0SW5wdXQoKSkKKyAgICAgICAgcmV0dXJuIGxhc3RGYXRGaW5nZXJzUmVzdWx0Lm5v
ZGUoU2hhZG93Q29udGVudE5vdEFsbG93ZWQpOworCisgICAgSW50UG9pbnQgY29udGVudFBvczsK
KyAgICBpZiAoaXNUb3VjaGluZykKKyAgICAgICAgY29udGVudFBvcyA9IGxhc3RGYXRGaW5nZXJz
UmVzdWx0LmFkanVzdGVkUG9zaXRpb24oKTsKKyAgICBlbHNlCisgICAgICAgIGNvbnRlbnRQb3Mg
PSBtYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKG1fbGFzdE1vdXNlRXZlbnQucG9zKCkpOworCisg
ICAgaWYgKHN0cmF0ZWd5ID09IFJlY3RCYXNlZCkgeworICAgICAgICBGYXRGaW5nZXJzUmVzdWx0
IHJlc3VsdCA9IEZhdEZpbmdlcnModGhpcywgbGFzdEZhdEZpbmdlcnNSZXN1bHQuYWRqdXN0ZWRQ
b3NpdGlvbigpLCBGYXRGaW5nZXJzOjpUZXh0KS5maW5kQmVzdFBvaW50KCk7CisgICAgICAgIHJl
dHVybiByZXN1bHQubm9kZShTaGFkb3dDb250ZW50Tm90QWxsb3dlZCk7CisgICAgfQorCisgICAg
SGl0VGVzdFJlc3VsdCByZXN1bHQgPSBldmVudEhhbmRsZXItPmhpdFRlc3RSZXN1bHRBdFBvaW50
KGNvbnRlbnRQb3MsIGZhbHNlIC8qYWxsb3dTaGFkb3dDb250ZW50Ki8pOworICAgIHJldHVybiBy
ZXN1bHQuaW5uZXJOb2RlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRpc3RhbmNlQmV0d2Vl
blBvaW50cyhJbnRQb2ludCBwMSwgSW50UG9pbnQgcDIpCit7CisgICAgLy8gQ2hhbmdlIGludCB0
byBkb3VibGUsIGJlY2F1c2UgKGR5ICogZHkpIGNhbiBjYXVzZSBpbnQgb3ZlcmZsb3cgaW4gcmVh
bGl0eSwgZS5nLCAoLTQ2NzA5ICogLTQ2NzA5KS4KKyAgICBkb3VibGUgZHggPSBzdGF0aWNfY2Fz
dDxkb3VibGU+KHAxLngoKSAtIHAyLngoKSk7CisgICAgZG91YmxlIGR5ID0gc3RhdGljX2Nhc3Q8
ZG91YmxlPihwMS55KCkgLSBwMi55KCkpOworICAgIHJldHVybiBzcXJ0KChkeCAqIGR4KSArIChk
eSAqIGR5KSk7Cit9CisKK05vZGUqIFdlYlBhZ2VQcml2YXRlOjpiZXN0Tm9kZUZvclpvb21VbmRl
clBvaW50KGNvbnN0IEludFBvaW50JiBwb2ludCkKK3sKKyAgICBJbnRQb2ludCBwdCA9IG1hcEZy
b21UcmFuc2Zvcm1lZChwb2ludCk7CisgICAgSW50UmVjdCBjbGlja1JlY3QocHQueCgpIC0gYmxv
Y2tDbGlja1JhZGl1cywgcHQueSgpIC0gYmxvY2tDbGlja1JhZGl1cywgMiAqIGJsb2NrQ2xpY2tS
YWRpdXMsIDIgKiBibG9ja0NsaWNrUmFkaXVzKTsKKyAgICBOb2RlKiBvcmlnaW5hbE5vZGUgPSBu
b2RlRm9yWm9vbVVuZGVyUG9pbnQocG9pbnQpOworICAgIGlmICghb3JpZ2luYWxOb2RlKQorICAg
ICAgICByZXR1cm4gMDsKKyAgICBOb2RlKiBub2RlID0gYmVzdENoaWxkTm9kZUZvckNsaWNrUmVj
dChvcmlnaW5hbE5vZGUsIGNsaWNrUmVjdCk7CisgICAgcmV0dXJuIG5vZGUgPyBhZGp1c3RlZEJs
b2NrWm9vbU5vZGVGb3Jab29tTGltaXRzKG5vZGUpIDogYWRqdXN0ZWRCbG9ja1pvb21Ob2RlRm9y
Wm9vbUxpbWl0cyhvcmlnaW5hbE5vZGUpOworfQorCitOb2RlKiBXZWJQYWdlUHJpdmF0ZTo6YmVz
dENoaWxkTm9kZUZvckNsaWNrUmVjdChOb2RlKiBwYXJlbnROb2RlLCBjb25zdCBJbnRSZWN0JiBj
bGlja1JlY3QpCit7CisgICAgaWYgKCFwYXJlbnROb2RlKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIGludCBiZXN0RGlzdGFuY2UgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOwor
CisgICAgTm9kZSogbm9kZSA9IHBhcmVudE5vZGUtPmZpcnN0Q2hpbGQoKTsKKyAgICBOb2RlKiBi
ZXN0Tm9kZSA9IDA7CisgICAgZm9yICg7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0U2libGluZygp
KSB7CisgICAgICAgIEludFJlY3QgcmVjdCA9IHJlY3RGb3JOb2RlKG5vZGUpOworICAgICAgICBp
ZiAoIWNsaWNrUmVjdC5pbnRlcnNlY3RzKHJlY3QpKQorICAgICAgICAgICAgY29udGludWU7CisK
KyAgICAgICAgaW50IGRpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKHJlY3QuY2VudGVy
KCksIGNsaWNrUmVjdC5jZW50ZXIoKSk7CisgICAgICAgIE5vZGUqIGJlc3RDaGlsZE5vZGUgPSBi
ZXN0Q2hpbGROb2RlRm9yQ2xpY2tSZWN0KG5vZGUsIGNsaWNrUmVjdCk7CisgICAgICAgIGlmIChi
ZXN0Q2hpbGROb2RlKSB7CisgICAgICAgICAgICBJbnRSZWN0IGJlc3RDaGlsZFJlY3QgPSByZWN0
Rm9yTm9kZShiZXN0Q2hpbGROb2RlKTsKKyAgICAgICAgICAgIGludCBiZXN0Q2hpbGREaXN0YW5j
ZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50cyhiZXN0Q2hpbGRSZWN0LmNlbnRlcigpLCBjbGlja1Jl
Y3QuY2VudGVyKCkpOworICAgICAgICAgICAgaWYgKGJlc3RDaGlsZERpc3RhbmNlIDwgZGlzdGFu
Y2UgJiYgYmVzdENoaWxkRGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHsKKyAgICAgICAgICAgICAg
ICBiZXN0Tm9kZSA9IGJlc3RDaGlsZE5vZGU7CisgICAgICAgICAgICAgICAgYmVzdERpc3RhbmNl
ID0gYmVzdENoaWxkRGlzdGFuY2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
ICAgIGlmIChkaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICBi
ZXN0Tm9kZSA9IG5vZGU7CisgICAgICAgICAgICAgICAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3Rh
bmNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkgeworICAgICAgICAgICAg
ICAgIGJlc3ROb2RlID0gbm9kZTsKKyAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0
YW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiZXN0
Tm9kZTsKK30KKworZG91YmxlIFdlYlBhZ2VQcml2YXRlOjptYXhCbG9ja1pvb21TY2FsZSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6bWluKG1heGltdW1CbG9ja1pvb21TY2FsZSwgbWF4aW11
bVNjYWxlKCkpOworfQorCitOb2RlKiBXZWJQYWdlUHJpdmF0ZTo6bm9kZUZvclpvb21VbmRlclBv
aW50KGNvbnN0IEludFBvaW50JiBwb2ludCkKK3sKKyAgICBpZiAoIW1fbWFpbkZyYW1lKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIEhpdFRlc3RSZXN1bHQgcmVzdWx0ID0gbV9tYWluRnJhbWUt
PmV2ZW50SGFuZGxlcigpLT5oaXRUZXN0UmVzdWx0QXRQb2ludChtYXBGcm9tVHJhbnNmb3JtZWQo
cG9pbnQpLCBmYWxzZSk7CisKKyAgICBOb2RlKiBub2RlID0gcmVzdWx0LmlubmVyTm9uU2hhcmVk
Tm9kZSgpOworCisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFJlbmRl
ck9iamVjdCogcmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpOworICAgIHdoaWxlICghcmVuZGVy
ZXIpIHsKKyAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKTsKKyAgICAgICAgcmVuZGVy
ZXIgPSBub2RlLT5yZW5kZXJlcigpOworICAgIH0KKworICAgIHJldHVybiBub2RlOworfQorCitO
b2RlKiBXZWJQYWdlUHJpdmF0ZTo6YWRqdXN0ZWRCbG9ja1pvb21Ob2RlRm9yWm9vbUxpbWl0cyhO
b2RlKiBub2RlKQoreworICAgIE5vZGUqIGluaXRpYWxOb2RlID0gbm9kZTsKKyAgICBSZW5kZXJP
YmplY3QqIHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKTsKKyAgICBib29sIGFjY2VwdGFibGVO
b2RlU2l6ZSA9IG5ld1NjYWxlRm9yQmxvY2tab29tUmVjdChyZWN0Rm9yTm9kZShub2RlKSwgMS4w
LCAwKSA8IG1heEJsb2NrWm9vbVNjYWxlKCk7CisKKyAgICB3aGlsZSAoIXJlbmRlcmVyIHx8ICFh
Y2NlcHRhYmxlTm9kZVNpemUpIHsKKyAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKTsK
KworICAgICAgICBpZiAoIW5vZGUpCisgICAgICAgICAgICByZXR1cm4gaW5pdGlhbE5vZGU7CisK
KyAgICAgICAgcmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpOworICAgICAgICBhY2NlcHRhYmxl
Tm9kZVNpemUgPSBuZXdTY2FsZUZvckJsb2NrWm9vbVJlY3QocmVjdEZvck5vZGUobm9kZSksIDEu
MCwgMCkgPCBtYXhCbG9ja1pvb21TY2FsZSgpOworICAgIH0KKworICAgIHJldHVybiBub2RlOwor
fQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpjb21wYXJlTm9kZXNGb3JCbG9ja1pvb20oTm9kZSog
bjEsIE5vZGUqIG4yKQoreworICAgIGlmICghbjEgfHwgIW4yKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICByZXR1cm4gKG4yID09IG4xKSB8fCBuMi0+aXNEZXNjZW5kYW50T2YobjEpOwor
fQorCitkb3VibGUgV2ViUGFnZVByaXZhdGU6Om5ld1NjYWxlRm9yQmxvY2tab29tUmVjdChjb25z
dCBJbnRSZWN0JiByZWN0LCBkb3VibGUgb2xkU2NhbGUsIGRvdWJsZSBtYXJnaW4pCit7CisgICAg
aWYgKHJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxk
b3VibGU+OjptYXgoKTsKKworICAgIEFTU0VSVChyZWN0LndpZHRoKCkgKyBtYXJnaW4pOworCisg
ICAgZG91YmxlIG5ld1NjYWxlID0gb2xkU2NhbGUgKiBzdGF0aWNfY2FzdDxkb3VibGU+KHRyYW5z
Zm9ybWVkQWN0dWFsVmlzaWJsZVNpemUoKS53aWR0aCgpKSAvIChyZWN0LndpZHRoKCkgKyBtYXJn
aW4pOworCisgICAgcmV0dXJuIG5ld1NjYWxlOworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2YXRl
OjpyZWN0Rm9yTm9kZShOb2RlKiBub2RlKQoreworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0
dXJuIEludFJlY3QoKTsKKworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBub2RlLT5yZW5k
ZXJlcigpOworCisgICAgaWYgKCFyZW5kZXJlcikKKyAgICAgICAgcmV0dXJuIEludFJlY3QoKTsK
KworICAgIC8vIFJldHVybiByZWN0IGluIHVuLXRyYW5zZm9ybWVkIGNvbnRlbnQgY29vcmRpbmF0
ZXMuCisgICAgSW50UmVjdCBibG9ja1JlY3Q7CisKKyAgICAvLyBGSVhNRTogRW5zdXJlIHRoaXMg
d29ya3Mgd2l0aCBpZnJhbWVzLgorICAgIGlmIChtX3dlYlBhZ2UtPnNldHRpbmdzKCktPnRleHRS
ZWZsb3dNb2RlKCkgPT0gV2ViU2V0dGluZ3M6OlRleHRSZWZsb3dFbmFibGVkICYmIHJlbmRlcmVy
LT5pc1RleHQoKSkgeworICAgICAgICBSZW5kZXJCbG9jayogcmVuZGVyQmxvY2sgPSByZW5kZXJl
ci0+Y29udGFpbmluZ0Jsb2NrKCk7CisgICAgICAgIGludCB4T2Zmc2V0ID0gMDsKKyAgICAgICAg
aW50IHlPZmZzZXQgPSAwOworICAgICAgICB3aGlsZSAoIXJlbmRlckJsb2NrLT5pc1Jvb3QoKSkg
eworICAgICAgICAgICAgeE9mZnNldCArPSByZW5kZXJCbG9jay0+eCgpOworICAgICAgICAgICAg
eU9mZnNldCArPSByZW5kZXJCbG9jay0+eSgpOworICAgICAgICAgICAgcmVuZGVyQmxvY2sgPSBy
ZW5kZXJCbG9jay0+Y29udGFpbmluZ0Jsb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qg
UmVuZGVyVGV4dCogcmVuZGVyVGV4dCA9IHRvUmVuZGVyVGV4dChyZW5kZXJlcik7CisgICAgICAg
IEludFJlY3QgbGluZXNCb3ggPSByZW5kZXJUZXh0LT5saW5lc0JvdW5kaW5nQm94KCk7CisgICAg
ICAgIGJsb2NrUmVjdCA9IEludFJlY3QoeE9mZnNldCArIGxpbmVzQm94LngoKSwgeU9mZnNldCAr
IGxpbmVzQm94LnkoKSwgbGluZXNCb3gud2lkdGgoKSwgbGluZXNCb3guaGVpZ2h0KCkpOworICAg
IH0gZWxzZQorICAgICAgICBibG9ja1JlY3QgPSByZW5kZXJlci0+YWJzb2x1dGVDbGlwcGVkT3Zl
cmZsb3dSZWN0KCk7CisKKyAgICBpZiAocmVuZGVyZXItPmlzVGV4dCgpKSB7CisgICAgICAgIFJl
bmRlckJsb2NrKiByYiA9IHJlbmRlcmVyLT5jb250YWluaW5nQmxvY2soKTsKKworICAgICAgICAv
LyBJbmVmZmljaWVudD8gV2F5IHRvIGZpbmQgd2lkdGggd2hlbiBmbG9hdHMgaW50ZXJzZWN0IGEg
YmxvY2suCisgICAgICAgIGludCBibG9ja1dpZHRoID0gMDsKKyAgICAgICAgaW50IGxpbmVDb3Vu
dCA9IHJiLT5saW5lQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lQ291
bnQ7IGkrKykKKyAgICAgICAgICAgIGJsb2NrV2lkdGggPSBtYXgoYmxvY2tXaWR0aCwgcmItPmF2
YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckxpbmUoaSwgZmFsc2UpKTsKKworICAgICAgICBibG9ja1Jl
Y3Quc2V0V2lkdGgoYmxvY2tXaWR0aCk7CisgICAgICAgIGJsb2NrUmVjdC5zZXRYKGJsb2NrUmVj
dC54KCkgKyByYi0+bG9naWNhbExlZnRPZmZzZXRGb3JMaW5lKDEsIGZhbHNlKSk7CisgICAgfQor
CisgICAgLy8gU3RyaXAgb2ZmIHBhZGRpbmcuCisgICAgaWYgKHJlbmRlcmVyLT5zdHlsZSgpLT5o
YXNQYWRkaW5nKCkpIHsKKyAgICAgICAgYmxvY2tSZWN0LnNldFgoYmxvY2tSZWN0LngoKSArIHJl
bmRlcmVyLT5zdHlsZSgpLT5wYWRkaW5nTGVmdCgpLnZhbHVlKCkpOworICAgICAgICBibG9ja1Jl
Y3Quc2V0WShibG9ja1JlY3QueSgpICsgcmVuZGVyZXItPnN0eWxlKCktPnBhZGRpbmdUb3AoKS52
YWx1ZSgpKTsKKyAgICAgICAgYmxvY2tSZWN0LnNldFdpZHRoKGJsb2NrUmVjdC53aWR0aCgpIC0g
cmVuZGVyZXItPnN0eWxlKCktPnBhZGRpbmdSaWdodCgpLnZhbHVlKCkpOworICAgICAgICBibG9j
a1JlY3Quc2V0SGVpZ2h0KGJsb2NrUmVjdC5oZWlnaHQoKSAtIHJlbmRlcmVyLT5zdHlsZSgpLT5w
YWRkaW5nQm90dG9tKCkudmFsdWUoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGJsb2NrUmVjdDsK
K30KKworSW50UG9pbnQgV2ViUGFnZVByaXZhdGU6OmZyYW1lT2Zmc2V0KGNvbnN0IEZyYW1lKiBm
cmFtZSkgY29uc3QKK3sKKyAgICBBU1NFUlQoZnJhbWUpOworCisgICAgLy8gRklYTUU6IFRoaXMg
ZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB3aGVuIHBhZ2UgaXMgYmVpbmcgZGVzdHJveWVkIGFuZCBK
UyB0cmlnZ2VycyBzZWxlY3Rpb24gY2hhbmdlLgorICAgIC8vIFdlIGNvdWxkIGJyZWFrIHRoZSBj
YWxsIGNoYWluIGF0IHVwcGVyIGxldmVscywgYnV0IEkgdGhpbmsgaXQgaXMgYmV0dGVyIHRvIGNo
ZWNrIHRoZSBmcmFtZSBwb2ludGVyCisgICAgLy8gaGVyZSBiZWNhdXNlIHRoZSBwb2ludGVyIGlz
IGV4cGxpY2l0bHkgY2xlYXJlZCBpbiBXZWJQYWdlOjpkZXN0cm95KCkuCisgICAgaWYgKCFtYWlu
RnJhbWUoKSkKKyAgICAgICAgcmV0dXJuIEludFBvaW50KCk7CisKKyAgICAvLyBDb252ZXJ0IDAs
MCBpbiB0aGUgZnJhbWUncyBjb29yZGluYXRlIHN5c3RlbSB0byB3aW5kb3cgY29vcmRpbmF0ZXMg
dG8KKyAgICAvLyBnZXQgdGhlIGZyYW1lJ3MgZ2xvYmFsIHBvc2l0aW9uLCBhbmQgcmV0dXJuIHRo
aXMgcG9zaXRpb24gaW4gdGhlIG1haW4KKyAgICAvLyBmcmFtZSdzIGNvb3JkaW5hdGVzLiAgKFNv
IHRoZSBtYWluIGZyYW1lJ3MgY29vcmRpbmF0ZXMgd2lsbCBiZSAwLDAuKQorICAgIHJldHVybiBt
YWluRnJhbWUoKS0+dmlldygpLT53aW5kb3dUb0NvbnRlbnRzKGZyYW1lLT52aWV3KCktPmNvbnRl
bnRzVG9XaW5kb3coSW50UG9pbnQ6Onplcm8oKSkpOworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2
YXRlOjphZGp1c3RSZWN0T2Zmc2V0Rm9yRnJhbWVPZmZzZXQoY29uc3QgSW50UmVjdCYgcmVjdCwg
Y29uc3QgTm9kZSogbm9kZSkKK3sKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiByZWN0
OworCisgICAgLy8gQWRqdXN0IHRoZSBvZmZzZXQgb2YgdGhlIHJlY3QgaWYgaXQgaXMgaW4gYW4g
aUZyYW1lL2ZyYW1lIG9yIHNldCBvZiBpRnJhbWVzL2ZyYW1lcy4KKyAgICAvLyBGSVhNRTogY2Fu
IHdlIGp1c3QgdXNlIGZyYW1lT2Zmc2V0IGluc3RlYWQgb2YgdGhpcyBiaWcgcm91dGluZT8KKyAg
ICBjb25zdCBOb2RlKiB0bm9kZSA9IG5vZGU7CisgICAgSW50UmVjdCBhZGp1c3RlZFJlY3QgPSBy
ZWN0OworICAgIGRvIHsKKyAgICAgICAgRnJhbWUqIGZyYW1lID0gdG5vZGUtPmRvY3VtZW50KCkt
PmZyYW1lKCk7CisgICAgICAgIGlmICghZnJhbWUpCisgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICBOb2RlKiBvd25lck5vZGUgPSBzdGF0aWNfY2FzdDxOb2RlKj4oZnJhbWUtPm93bmVy
RWxlbWVudCgpKTsKKyAgICAgICAgdG5vZGUgPSBvd25lck5vZGU7CisgICAgICAgIGlmIChvd25l
ck5vZGUgJiYgKG93bmVyTm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmlmcmFtZVRhZykgfHwg
b3duZXJOb2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6ZnJhbWVUYWcpKSkgeworICAgICAgICAg
ICAgSW50UmVjdCBpRnJhbWVSZWN0OworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAg
IGlGcmFtZVJlY3QgPSByZWN0Rm9yTm9kZShvd25lck5vZGUpOworICAgICAgICAgICAgICAgIGFk
anVzdGVkUmVjdC5tb3ZlKGlGcmFtZVJlY3QueCgpLCBpRnJhbWVSZWN0LnkoKSk7CisgICAgICAg
ICAgICAgICAgYWRqdXN0ZWRSZWN0LmludGVyc2VjdChpRnJhbWVSZWN0KTsKKyAgICAgICAgICAg
ICAgICBvd25lck5vZGUgPSBvd25lck5vZGUtPnBhcmVudE5vZGUoKTsKKyAgICAgICAgICAgIH0g
d2hpbGUgKGlGcmFtZVJlY3QuaXNFbXB0eSgpICYmIG93bmVyTm9kZSk7CisgICAgICAgIH0gZWxz
ZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfSB3aGlsZSAodG5vZGUgPSB0bm9kZS0+cGFyZW50
Tm9kZSgpKTsKKworICAgIHJldHVybiBhZGp1c3RlZFJlY3Q7Cit9CisKK0ludFJlY3QgV2ViUGFn
ZVByaXZhdGU6OmJsb2NrWm9vbVJlY3RGb3JOb2RlKE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFu
b2RlIHx8IGNvbnRlbnRzU2l6ZSgpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIEludFJlY3Qo
KTsKKworICAgIE5vZGUqIHRub2RlID0gbm9kZTsKKyAgICBtX2N1cnJlbnRCbG9ja1pvb21BZGp1
c3RlZE5vZGUgPSB0bm9kZTsKKworICAgIEludFJlY3QgYmxvY2tSZWN0ID0gcmVjdEZvck5vZGUo
dG5vZGUpOworICAgIEludFJlY3Qgb3JpZ2luYWxSZWN0ID0gYmxvY2tSZWN0OworCisgICAgaW50
IG9yaWdpbmFsQXJlYSA9IG9yaWdpbmFsUmVjdC53aWR0aCgpICogb3JpZ2luYWxSZWN0LmhlaWdo
dCgpOworICAgIGludCBwYWdlQXJlYSA9IGNvbnRlbnRzU2l6ZSgpLndpZHRoKCkgKiBjb250ZW50
c1NpemUoKS5oZWlnaHQoKTsKKyAgICBkb3VibGUgYmxvY2tUb1BhZ2VSYXRpbyA9IHN0YXRpY19j
YXN0PGRvdWJsZT4oMSAtIG9yaWdpbmFsQXJlYSAvIHBhZ2VBcmVhKTsKKyAgICBkb3VibGUgYmxv
Y2tFeHBhbnNpb25SYXRpbyA9IDUuMCAqIGJsb2NrVG9QYWdlUmF0aW8gKiBibG9ja1RvUGFnZVJh
dGlvOworCisgICAgaWYgKCF0bm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmltZ1RhZykgJiYg
IXRub2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aW5wdXRUYWcpICYmICF0bm9kZS0+aGFzVGFn
TmFtZShIVE1MTmFtZXM6OnRleHRhcmVhVGFnKSkgeworICAgICAgICB3aGlsZSAodG5vZGUgPSB0
bm9kZS0+cGFyZW50Tm9kZSgpKSB7CisgICAgICAgICAgICBBU1NFUlQodG5vZGUpOworICAgICAg
ICAgICAgSW50UmVjdCB0UmVjdCA9IHJlY3RGb3JOb2RlKHRub2RlKTsKKyAgICAgICAgICAgIGlu
dCB0ZW1wQmxvY2tBcmVhID0gdFJlY3Qud2lkdGgoKSAqIHRSZWN0LmhlaWdodCgpOworICAgICAg
ICAgICAgLy8gRG9uJ3QgZXhwYW5kIHRoZSBibG9jayBpZiBpdCB3aWxsIGJlIHRvbyBsYXJnZSBy
ZWxhdGl2ZSB0byB0aGUgY29udGVudC4KKyAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxkb3Vi
bGU+KDEgLSB0ZW1wQmxvY2tBcmVhIC8gcGFnZUFyZWEpIDwgbWluaW11bUV4cGFuZGluZ1JhdGlv
KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHRSZWN0LmlzRW1wdHko
KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gTm8gcmVuZGVyZXIuCisgICAgICAgICAg
ICBpZiAodGVtcEJsb2NrQXJlYSA8IDEuMSAqIG9yaWdpbmFsQXJlYSkKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsgLy8gVGhlIHNpemUgb2YgdGhpcyBwYXJlbnQgaXMgdmVyeSBjbG9zZSB0byB0
aGUgY2hpbGQsIG5vIG5lZWQgdG8gZ28gdG8gdGhpcyBwYXJlbnQuCisgICAgICAgICAgICAvLyBE
b24ndCBleHBhbmQgdGhlIGJsb2NrIGlmIHRoZSBwYXJlbnQgbm9kZSBzaXplIGlzIGFscmVhZHkg
YWxtb3N0IHRoZSBzaXplIG9mIGFjdHVhbCB2aXNpYmxlIHNpemUuCisgICAgICAgICAgICBJbnRT
aXplIGFjdHVhbFNpemUgPSBhY3R1YWxWaXNpYmxlU2l6ZSgpOworICAgICAgICAgICAgaWYgKHN0
YXRpY19jYXN0PGRvdWJsZT4oMSAtIHRSZWN0LndpZHRoKCkgLyBhY3R1YWxTaXplLndpZHRoKCkp
IDwgbWluaW11bUV4cGFuZGluZ1JhdGlvKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgaWYgKHRlbXBCbG9ja0FyZWEgPCBibG9ja0V4cGFuc2lvblJhdGlvICogb3JpZ2luYWxB
cmVhKSB7CisgICAgICAgICAgICAgICAgYmxvY2tSZWN0ID0gdFJlY3Q7CisgICAgICAgICAgICAg
ICAgbV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlID0gdG5vZGU7CisgICAgICAgICAgICB9
IGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJs
b2NrUmVjdCA9IGFkanVzdFJlY3RPZmZzZXRGb3JGcmFtZU9mZnNldChibG9ja1JlY3QsIG5vZGUp
OworICAgIGJsb2NrUmVjdCA9IG1hcFRvVHJhbnNmb3JtZWQoYmxvY2tSZWN0KTsKKyAgICBjbGlw
VG9UcmFuc2Zvcm1lZENvbnRlbnRzUmVjdChibG9ja1JlY3QpOworCisjaWYgREVCVUdfQkxPQ0tf
Wk9PTQorICAgIC8vIFJlLXBhaW50IHRoZSBiYWNraW5nc3RvcmUgdG8gc2NyZWVuIHRvIGVyYXNl
IG90aGVyIGFubm90YXRpb25zLgorICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXN1bWVTY3JlZW5B
bmRCYWNraW5nU3RvcmVVcGRhdGVzKEJhY2tpbmdTdG9yZTo6QmxpdCk7CisKKyAgICAvLyBSZW5k
ZXIgYSBibGFjayBzcXVhcmUgb3ZlciB0aGUgY2FsY3VsYXRlZCBibG9jayBhbmQgYSBncmF5IHNx
dWFyZSBvdmVyIHRoZSBvcmlnaW5hbCBibG9jayBmb3IgdmlzdWFsIGluc3BlY3Rpb24uCisgICAg
b3JpZ2luYWxSZWN0ID0gbWFwVG9UcmFuc2Zvcm1lZChvcmlnaW5hbFJlY3QpOworICAgIGNsaXBU
b1RyYW5zZm9ybWVkQ29udGVudHNSZWN0KG9yaWdpbmFsUmVjdCk7CisgICAgSW50UmVjdCByZW5k
ZXJSZWN0ID0gbWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQo
YmxvY2tSZWN0KTsKKyAgICBJbnRSZWN0IG9yaWdpbmFsUmVuZGVyUmVjdCA9IG1hcEZyb21UcmFu
c2Zvcm1lZENvbnRlbnRzVG9UcmFuc2Zvcm1lZFZpZXdwb3J0KG9yaWdpbmFsUmVjdCk7CisgICAg
SW50U2l6ZSB2aWV3cG9ydFNpemUgPSB0cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpOworICAgIHJl
bmRlclJlY3QuaW50ZXJzZWN0KEludFJlY3QoMCwgMCwgdmlld3BvcnRTaXplLndpZHRoKCksIHZp
ZXdwb3J0U2l6ZS5oZWlnaHQoKSkpOworICAgIG9yaWdpbmFsUmVuZGVyUmVjdC5pbnRlcnNlY3Qo
SW50UmVjdCgwLCAwLCB2aWV3cG9ydFNpemUud2lkdGgoKSwgdmlld3BvcnRTaXplLmhlaWdodCgp
KSk7CisgICAgbV9iYWNraW5nU3RvcmUtPmQtPmNsZWFyV2luZG93KHJlbmRlclJlY3QsIDAsIDAs
IDApOworICAgIG1fYmFja2luZ1N0b3JlLT5kLT5jbGVhcldpbmRvdyhvcmlnaW5hbFJlbmRlclJl
Y3QsIDEyMCwgMTIwLCAxMjApOworICAgIG1fYmFja2luZ1N0b3JlLT5kLT5pbnZhbGlkYXRlV2lu
ZG93KHJlbmRlclJlY3QpOworI2VuZGlmCisKKyAgICByZXR1cm4gYmxvY2tSZWN0OworfQorCit2
b2lkIFdlYlBhZ2U6OmJsb2NrWm9vbUFuaW1hdGlvbkZpbmlzaGVkKCkKK3sKKyAgICBkLT56b29t
QmxvY2soKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJl
Y3RseS4KKy8vIEl0IGlzIGNhbGxlZCBhZnRlciB0aGUgYW5pbWF0aW9uIGVuZHMgKHNlZSBhYm92
ZSkuCit2b2lkIFdlYlBhZ2VQcml2YXRlOjp6b29tQmxvY2soKQoreworICAgIGlmICghbV9tYWlu
RnJhbWUpCisgICAgICAgIHJldHVybjsKKworICAgIEludFBvaW50IGFuY2hvcihyb3VuZFVudHJh
bnNmb3JtZWRQb2ludChtYXBGcm9tVHJhbnNmb3JtZWRGbG9hdFBvaW50KG1fZmluYWxCbG9ja1Bv
aW50KSkpOworICAgIGJvb2wgd2lsbFVzZVRleHRSZWZsb3cgPSBmYWxzZTsKKworI2lmIEVOQUJM
RShWSUVXUE9SVF9SRUZMT1cpCisgICAgd2lsbFVzZVRleHRSZWZsb3cgPSBtX3dlYlBhZ2UtPnNl
dHRpbmdzKCktPnRleHRSZWZsb3dNb2RlKCkgIT0gV2ViU2V0dGluZ3M6OlRleHRSZWZsb3dEaXNh
YmxlZDsKKyAgICB0b2dnbGVUZXh0UmVmbG93SWZFbmFibGVkRm9yQmxvY2tab29tT25seShtX3No
b3VsZFJlZmxvd0Jsb2NrKTsKKyAgICBzZXROZWVkc0xheW91dCgpOworI2VuZGlmCisKKyAgICBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCB6b29tOworICAgIHpvb20uc2NhbGUobV9ibG9ja1pvb21GaW5h
bFNjYWxlKTsKKyAgICAqbV90cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IHpvb207CisgICAgbV9jbGll
bnQtPnJlc2V0Qml0bWFwWm9vbVNjYWxlKG1fYmxvY2tab29tRmluYWxTY2FsZSk7CisgICAgbV9i
YWNraW5nU3RvcmUtPmQtPnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7Cisg
ICAgdXBkYXRlVmlld3BvcnRTaXplKCk7CisKKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9XKQor
ICAgIHJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpOworICAgIGlmICh3aWxsVXNlVGV4dFJlZmxvdyAm
JiBtX3Nob3VsZFJlZmxvd0Jsb2NrKSB7CisgICAgICAgIEludFJlY3QgcmVmbG93ZWRSZWN0ID0g
cmVjdEZvck5vZGUobV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlLmdldCgpKTsKKyAgICAg
ICAgcmVmbG93ZWRSZWN0ID0gYWRqdXN0UmVjdE9mZnNldEZvckZyYW1lT2Zmc2V0KHJlZmxvd2Vk
UmVjdCwgbV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlLmdldCgpKTsKKyAgICAgICAgcmVm
bG93ZWRSZWN0Lm1vdmUocm91bmRUcmFuc2Zvcm1lZFBvaW50KG1fZmluYWxCbG9ja1BvaW50UmVm
bG93T2Zmc2V0KS54KCksIHJvdW5kVHJhbnNmb3JtZWRQb2ludChtX2ZpbmFsQmxvY2tQb2ludFJl
Zmxvd09mZnNldCkueSgpKTsKKyAgICAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG1fY3Vy
cmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZS0+cmVuZGVyZXIoKTsKKyAgICAgICAgSW50UG9pbnQg
dG9wTGVmdFBvaW50KHJlZmxvd2VkUmVjdC5sb2NhdGlvbigpKTsKKyAgICAgICAgaWYgKHJlbmRl
cmVyICYmIHJlbmRlcmVyLT5pc1RleHQoKSkgeworICAgICAgICAgICAgRVRleHRBbGlnbiB0ZXh0
QWxpZ24gPSByZW5kZXJlci0+c3R5bGUoKS0+dGV4dEFsaWduKCk7CisgICAgICAgICAgICBJbnRQ
b2ludCB0ZXh0QW5jaG9yOworICAgICAgICAgICAgc3dpdGNoICh0ZXh0QWxpZ24pIHsKKyAgICAg
ICAgICAgIGNhc2UgQ0VOVEVSOgorICAgICAgICAgICAgY2FzZSBXRUJLSVRfQ0VOVEVSOgorICAg
ICAgICAgICAgICAgIHRleHRBbmNob3IgPSBJbnRQb2ludChyZWZsb3dlZFJlY3QueCgpICsgKHJl
Zmxvd2VkUmVjdC53aWR0aCgpIC0gYWN0dWFsVmlzaWJsZVNpemUoKS53aWR0aCgpKSAvIDIsIHRv
cExlZnRQb2ludC55KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2Fz
ZSBMRUZUOgorICAgICAgICAgICAgY2FzZSBXRUJLSVRfTEVGVDoKKyAgICAgICAgICAgICAgICB0
ZXh0QW5jaG9yID0gdG9wTGVmdFBvaW50OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgY2FzZSBSSUdIVDoKKyAgICAgICAgICAgIGNhc2UgV0VCS0lUX1JJR0hUOgorICAgICAg
ICAgICAgICAgIHRleHRBbmNob3IgPSBJbnRQb2ludChyZWZsb3dlZFJlY3QueCgpICsgcmVmbG93
ZWRSZWN0LndpZHRoKCkgLSBhY3R1YWxWaXNpYmxlU2l6ZSgpLndpZHRoKCksIHRvcExlZnRQb2lu
dC55KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUQUFVVE86
CisgICAgICAgICAgICBjYXNlIEpVU1RJRlk6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAg
ICAgICAgICAgIGlmIChyZW5kZXJlci0+c3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigp
KQorICAgICAgICAgICAgICAgICAgICB0ZXh0QW5jaG9yID0gdG9wTGVmdFBvaW50OworICAgICAg
ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGV4dEFuY2hvciA9IEludFBvaW50
KHJlZmxvd2VkUmVjdC54KCkgKyByZWZsb3dlZFJlY3Qud2lkdGgoKSAtIGFjdHVhbFZpc2libGVT
aXplKCkud2lkdGgoKSwgdG9wTGVmdFBvaW50LnkoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRTY3JvbGxQb3NpdGlvbih0ZXh0QW5jaG9y
KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbmRlcmVyLT5zdHlsZSgpLT5pc0xl
ZnRUb1JpZ2h0RGlyZWN0aW9uKCkKKyAgICAgICAgICAgICAgICA/IHNldFNjcm9sbFBvc2l0aW9u
KHRvcExlZnRQb2ludCkKKyAgICAgICAgICAgICAgICA6IHNldFNjcm9sbFBvc2l0aW9uKEludFBv
aW50KHJlZmxvd2VkUmVjdC54KCkgKyByZWZsb3dlZFJlY3Qud2lkdGgoKSAtIGFjdHVhbFZpc2li
bGVTaXplKCkud2lkdGgoKSwgdG9wTGVmdFBvaW50LnkoKSkpOworICAgICAgICB9CisgICAgfSBl
bHNlIGlmICh3aWxsVXNlVGV4dFJlZmxvdykgeworICAgICAgICBJbnRSZWN0IGZpbmFsUmVjdCA9
IHJlY3RGb3JOb2RlKG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZS5nZXQoKSk7CisgICAg
ICAgIGZpbmFsUmVjdCA9IGFkanVzdFJlY3RPZmZzZXRGb3JGcmFtZU9mZnNldChmaW5hbFJlY3Qs
IG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZS5nZXQoKSk7CisgICAgICAgIHNldFNjcm9s
bFBvc2l0aW9uKEludFBvaW50KDAsIGZpbmFsUmVjdC55KCkgKyBtX2ZpbmFsQmxvY2tQb2ludFJl
Zmxvd09mZnNldC55KCkpKTsKKyAgICAgICAgcmVzZXRCbG9ja1pvb20oKTsKKyAgICB9CisjZW5k
aWYKKyAgICBpZiAoIXdpbGxVc2VUZXh0UmVmbG93KSB7CisgICAgICAgIHNldFNjcm9sbFBvc2l0
aW9uKGFuY2hvcik7CisgICAgICAgIGlmICghbV9zaG91bGRSZWZsb3dCbG9jaykKKyAgICAgICAg
ICAgIHJlc2V0QmxvY2tab29tKCk7CisgICAgfQorCisgICAgbm90aWZ5VHJhbnNmb3JtQ2hhbmdl
ZCgpOworICAgIG1fYmFja2luZ1N0b3JlLT5kLT5jbGVhcldpbmRvdygpOworICAgIG1fYmFja2lu
Z1N0b3JlLT5kLT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKEJhY2tpbmdTdG9y
ZTo6UmVuZGVyQW5kQmxpdCk7CisgICAgbV9jbGllbnQtPnpvb21DaGFuZ2VkKG1fd2ViUGFnZS0+
aXNNaW5ab29tZWQoKSwgbV93ZWJQYWdlLT5pc01heFpvb21lZCgpLCAhc2hvdWxkWm9vbU9uRXNj
YXBlKCksIGN1cnJlbnRTY2FsZSgpKTsKK30KKworCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpyZXNl
dEJsb2NrWm9vbSgpCit7CisgICAgbV9jdXJyZW50QmxvY2tab29tTm9kZSA9IDA7CisgICAgbV9j
dXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlID0gMDsKKyAgICBtX3Nob3VsZFJlZmxvd0Jsb2Nr
ID0gZmFsc2U7Cit9CisKK1dlYlBhZ2U6OldlYlBhZ2UoV2ViUGFnZUNsaWVudCogY2xpZW50LCBj
b25zdCBXZWJTdHJpbmcmIHBhZ2VHcm91cE5hbWUsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBy
ZWN0KQoreworICAgIGdsb2JhbEluaXRpYWxpemUoKTsKKyAgICBkID0gbmV3IFdlYlBhZ2VQcml2
YXRlKHRoaXMsIGNsaWVudCwgcmVjdCk7CisgICAgZC0+aW5pdChwYWdlR3JvdXBOYW1lKTsKK30K
Kwordm9pZCBXZWJQYWdlOjpkZXN0cm95V2ViUGFnZUNvbXBvc2l0b3IoKQoreworI2lmIFVTRShB
Q0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAvLyBEZXN0cm95IHRoZSBsYXllciByZW5kZXJl
ciBpbiBhIHN5bmMgY29tbWFuZCBiZWZvcmUgd2UgZGVzdHJveSB0aGUgYmFja2luZyBzdG9yZSwK
KyAgICAvLyB0byBmbHVzaCBhbnkgcGVuZGluZyBjb21wb3NpdGluZyBtZXNzYWdlcyBvbiB0aGUg
Y29tcG9zaXRpbmcgdGhyZWFkLgorICAgIC8vIFRoZSBiYWNraW5nIHN0b3JlIGlzIGluZGlyZWN0
bHkgZGVsZXRlZCBieSB0aGUgJ2RldGFjaEZyb21QYXJlbnQnIGNhbGwgYmVsb3cuCisgICAgZC0+
c3luY0Rlc3Ryb3lDb21wb3NpdG9yT25Db21wb3NpdGluZ1RocmVhZCgpOworI2VuZGlmCit9CisK
K3ZvaWQgV2ViUGFnZTo6ZGVzdHJveSgpCit7CisgICAgLy8gVE9ETzogbmVlZCB0byB2ZXJpZnkg
aWYgdGhpcyBjYWxsIG5lZWRzIHRvIGJlIG1hZGUgYmVmb3JlIGNhbGxpbmcKKyAgICAvLyBXZWJQ
YWdlOjpkZXN0cm95V2ViUGFnZUNvbXBvc2l0b3IoKQorICAgIGQtPm1fYmFja2luZ1N0b3JlLT5k
LT5zdXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcygpOworCisgICAgLy8gQ2xvc2Ug
dGhlIGJhY2tmb3J3YXJkIGxpc3QgYW5kIHJlbGVhc2UgdGhlIGNhY2hlZCBwYWdlcy4KKyAgICBk
LT5tX3BhZ2UtPmJhY2tGb3J3YXJkKCktPmNsb3NlKCk7CisgICAgcGFnZUNhY2hlKCktPnJlbGVh
c2VBdXRvcmVsZWFzZWRQYWdlc05vdygpOworCisgICAgRnJhbWVMb2FkZXIqIGxvYWRlciA9IGQt
Pm1fbWFpbkZyYW1lLT5sb2FkZXIoKTsKKworICAgIC8vIFJlbW92ZSBtYWluIGZyYW1lJ3MgYmFj
a2luZyBzdG9yZSBjbGllbnQgZnJvbSB0aGUgbWFwCisgICAgLy8gdG8gcHJldmVudCBGcmFtZUxv
YWRlckNsaWVudEJsYWNreUJlcnJ5OjpkZXRhY2hGcm9tUGFyZW50MigpLAorICAgIC8vIHdoaWNo
IGlzIGNhbGxlZCBieSBsb2FkZXItPmRldGFjaEZyb21QYXJlbnQoKSwgZGVsZXRpbmcgaXQuCisg
ICAgLy8gV2Ugd2lsbCBkZWxldGUgaXQgaW4gfldlYlBhZ2VQcml2YXRlKCkuCisgICAgLy8gUmVh
c29uOiBsb2FkZXItPmRldGFjaEZyb21QYXJlbnQoKSBtYXkgcGluZyBiYWNrIHRvIGJhY2tpbmcg
c3RvcmUKKyAgICAvLyBpbmRpcmVjdGx5IHRocm91Z2ggQ2hyb21lQ2xpZW50QmxhY2tCZXJyeTo6
aW52YWxpZGF0ZUNvbnRlbnRzQW5kV2luZG93KCkuCisgICAgLy8gc2VlIFJJTSBQUiAjOTMyNTYu
CisgICAgZC0+cmVtb3ZlQmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUoZC0+bV9tYWluRnJhbWUp
OworCisgICAgLy8gU2V0IG1fbWFpbkZyYW1lIHRvIDAgdG8gYXZvaWQgY2FsbHMgYmFjayBpbiB0
byB0aGUgYmFja2luZ3N0b3JlIGR1cmluZyB3ZWJwYWdlIGRlbGV0aW9uLgorICAgIGQtPm1fbWFp
bkZyYW1lID0gMDsKKyAgICBpZiAobG9hZGVyKQorICAgICAgICBsb2FkZXItPmRldGFjaEZyb21Q
YXJlbnQoKTsKKworICAgIGRlbGV0ZSB0aGlzOworfQorCitXZWJQYWdlOjp+V2ViUGFnZSgpCit7
CisgICAgZGVsZXRlIGQ7CisgICAgZCA9IDA7Cit9CisKK1dlYlBhZ2VDbGllbnQqIFdlYlBhZ2U6
OmNsaWVudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fY2xpZW50OworfQorCit2b2lkIFdl
YlBhZ2U6OmxvYWQoY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFyKiBuZXR3b3JrVG9rZW4sIGJv
b2wgaXNJbml0aWFsKQoreworICAgIGQtPmxvYWQodXJsLCBuZXR3b3JrVG9rZW4sICJHRVQiLCBQ
bGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OlVzZVByb3RvY29sQ2FjaGVQb2xpY3ksIDAsIDAsIDAs
IDAsIGlzSW5pdGlhbCwgZmFsc2UpOworfQorCit2b2lkIFdlYlBhZ2U6OmxvYWRFeHRlbmRlZChj
b25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIqIG5ldHdvcmtUb2tlbiwgY29uc3QgY2hhciogbWV0
aG9kLCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkNhY2hlUG9saWN5IGNhY2hlUG9saWN5LCBj
b25zdCBjaGFyKiBkYXRhLCBzaXplX3QgZGF0YUxlbmd0aCwgY29uc3QgY2hhciogY29uc3QqIGhl
YWRlcnMsIHNpemVfdCBoZWFkZXJzTGVuZ3RoLCBib29sIG11c3RIYW5kbGVJbnRlcm5hbGx5KQor
eworICAgIGQtPmxvYWQodXJsLCBuZXR3b3JrVG9rZW4sIG1ldGhvZCwgY2FjaGVQb2xpY3ksIGRh
dGEsIGRhdGFMZW5ndGgsIGhlYWRlcnMsIGhlYWRlcnNMZW5ndGgsIGZhbHNlLCBtdXN0SGFuZGxl
SW50ZXJuYWxseSwgZmFsc2UsICIiKTsKK30KKwordm9pZCBXZWJQYWdlOjpsb2FkRmlsZShjb25z
dCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBvdmVycmlkZUNvbnRlbnRUeXBlKQoreworICAgIHN0
ZDo6c3RyaW5nIGZpbGVVcmwocGF0aCk7CisgICAgaWYgKCFmaWxlVXJsLmZpbmQoIi8iKSkKKyAg
ICAgICAgZmlsZVVybC5pbnNlcnQoMCwgImZpbGU6Ly8iKTsKKyAgICBlbHNlIGlmIChmaWxlVXJs
LmZpbmQoImZpbGU6Ly8vIikpCisgICAgICAgIHJldHVybjsKKworICAgIGQtPmxvYWQoZmlsZVVy
bC5jX3N0cigpLCAwLCAiR0VUIiwgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpVc2VQcm90b2Nv
bENhY2hlUG9saWN5LCAwLCAwLCAwLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBvdmVycmlkZUNv
bnRlbnRUeXBlKTsKK30KKwordm9pZCBXZWJQYWdlOjpsb2FkU3RyaW5nKGNvbnN0IGNoYXIqIHN0
cmluZywgY29uc3QgY2hhciogYmFzZVVSTCwgY29uc3QgY2hhciogbWltZVR5cGUsIGNvbnN0IGNo
YXIqIGZhaWxpbmdVUkwpCit7CisgICAgZC0+bG9hZFN0cmluZyhzdHJpbmcsIGJhc2VVUkwsIG1p
bWVUeXBlLCBmYWlsaW5nVVJMKTsKK30KKwordm9pZCBXZWJQYWdlOjpkb3dubG9hZChjb25zdCBQ
bGF0Zm9ybTo6TmV0d29ya1JlcXVlc3QmIHJlcXVlc3QpCit7CisgICAgZC0+bG9hZChyZXF1ZXN0
LmdldFVybFJlZigpLmNfc3RyKCksIDAsICJHRVQiLCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6
OlVzZVByb3RvY29sQ2FjaGVQb2xpY3ksIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwg
IiIpOworfQorCitib29sIFdlYlBhZ2U6OmV4ZWN1dGVKYXZhU2NyaXB0KGNvbnN0IGNoYXIqIHNj
cmlwdCwgSmF2YVNjcmlwdERhdGFUeXBlJiByZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZh
bHVlKQoreworICAgIHJldHVybiBkLT5leGVjdXRlSmF2YVNjcmlwdChzY3JpcHQsIHJldHVyblR5
cGUsIHJldHVyblZhbHVlKTsKK30KKworYm9vbCBXZWJQYWdlOjpleGVjdXRlSmF2YVNjcmlwdElu
SXNvbGF0ZWRXb3JsZChjb25zdCBzdGQ6OndzdHJpbmcmIHNjcmlwdCwgSmF2YVNjcmlwdERhdGFU
eXBlJiByZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKQoreworICAgIC8vIE9uIG91
ciBwbGF0Zm9ybSB3Y2hhcl90IGlzIHVuc2lnbmVkIGludCBhbmQgVUNoYXIgaXMgdW5zaWduZWQg
c2hvcnQKKyAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnZlcnQgdXNpbmcgSUNVIGNvbnZlcnNpb24g
ZnVuY3Rpb24KKyAgICBpbnQgbGVuZ3RoQ29waWVkID0gMDsKKyAgICBVRXJyb3JDb2RlIGVycm9y
ID0gVV9aRVJPX0VSUk9SOworICAgIGNvbnN0IGludCBsZW5ndGggPSBzY3JpcHQubGVuZ3RoKCkg
KyAxIC8qbnVsbCB0ZXJtaW5hdGlvbiBjaGFyKi87CisgICAgVUNoYXIgZGF0YVtsZW5ndGhdOwor
CisgICAgLy8gRklYTUU6IFBSIDEzODE2MiBpcyBnaXZpbmcgVV9JTlZBTElEX0NIQVJfRk9VTkQg
ZXJyb3IuCisgICAgdV9zdHJGcm9tVVRGMzIoZGF0YSwgbGVuZ3RoLCAmbGVuZ3RoQ29waWVkLCBy
ZWludGVycHJldF9jYXN0PGNvbnN0IFVDaGFyMzIqPihzY3JpcHQuY19zdHIoKSksIHNjcmlwdC5s
ZW5ndGgoKSwgJmVycm9yKTsKKyAgICBCTEFDS0JFUlJZX0FTU0VSVChlcnJvciA9PSBVX1pFUk9f
RVJST1IpOworICAgIGlmIChlcnJvciAhPSBVX1pFUk9fRVJST1IpIHsKKyAgICAgICAgUGxhdGZv
cm06OmxvZ0Fsd2F5cyhQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIldlYlBhZ2U6OmV4ZWN1
dGVKYXZhU2NyaXB0SW5Jc29sYXRlZFdvcmxkIGZhaWxlZCB0byBjb252ZXJ0IFVURjE2IHRvIEph
dmFTY3JpcHQhIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU3RyaW5nIHN0
ciA9IFN0cmluZyhkYXRhLCBsZW5ndGhDb3BpZWQpOworICAgIFNjcmlwdFNvdXJjZUNvZGUgc291
cmNlQ29kZShzdHIsIEtVUkwoKSk7CisgICAgcmV0dXJuIGQtPmV4ZWN1dGVKYXZhU2NyaXB0SW5J
c29sYXRlZFdvcmxkKHNvdXJjZUNvZGUsIHJldHVyblR5cGUsIHJldHVyblZhbHVlKTsKK30KKwor
Ym9vbCBXZWJQYWdlOjpleGVjdXRlSmF2YVNjcmlwdEluSXNvbGF0ZWRXb3JsZChjb25zdCBjaGFy
KiBzY3JpcHQsIEphdmFTY3JpcHREYXRhVHlwZSYgcmV0dXJuVHlwZSwgV2ViU3RyaW5nJiByZXR1
cm5WYWx1ZSkKK3sKKyAgICBTY3JpcHRTb3VyY2VDb2RlIHNvdXJjZUNvZGUoU3RyaW5nOjpmcm9t
VVRGOChzY3JpcHQpLCBLVVJMKCkpOworICAgIHJldHVybiBkLT5leGVjdXRlSmF2YVNjcmlwdElu
SXNvbGF0ZWRXb3JsZChzb3VyY2VDb2RlLCByZXR1cm5UeXBlLCByZXR1cm5WYWx1ZSk7Cit9CisK
K3ZvaWQgV2ViUGFnZTo6c3RvcExvYWRpbmcoKQoreworICAgIGQtPnN0b3BDdXJyZW50TG9hZCgp
OworfQorCit2b2lkIFdlYlBhZ2U6OnByZXBhcmVUb0Rlc3Ryb3koKQoreworICAgIGQtPnByZXBh
cmVUb0Rlc3Ryb3koKTsKK30KKworaW50IFdlYlBhZ2U6OmJhY2tGb3J3YXJkTGlzdExlbmd0aCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fcGFnZS0+Z2V0SGlzdG9yeUxlbmd0aCgpOworfQor
Citib29sIFdlYlBhZ2U6OmNhbkdvQmFja09yRm9yd2FyZChpbnQgZGVsdGEpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGQtPm1fcGFnZS0+Y2FuR29CYWNrT3JGb3J3YXJkKGRlbHRhKTsKK30KKworYm9v
bCBXZWJQYWdlOjpnb0JhY2tPckZvcndhcmQoaW50IGRlbHRhKQoreworICAgIGlmIChkLT5tX3Bh
Z2UtPmNhbkdvQmFja09yRm9yd2FyZChkZWx0YSkpIHsKKyAgICAgICAgZC0+bV9wYWdlLT5nb0Jh
Y2tPckZvcndhcmQoZGVsdGEpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0
dXJuIGZhbHNlOworfQorCit2b2lkIFdlYlBhZ2U6OmdvVG9CYWNrRm9yd2FyZEVudHJ5KEJhY2tG
b3J3YXJkSWQgaWQpCit7CisgICAgSGlzdG9yeUl0ZW0qIGl0ZW0gPSBoaXN0b3J5SXRlbUZyb21C
YWNrRm9yd2FyZElkKGlkKTsKKyAgICBBU1NFUlQoaXRlbSk7CisgICAgZC0+bV9wYWdlLT5nb1Rv
SXRlbShpdGVtLCBGcmFtZUxvYWRUeXBlSW5kZXhlZEJhY2tGb3J3YXJkKTsKK30KKwordm9pZCBX
ZWJQYWdlOjpyZWxvYWQoKQoreworICAgIGQtPm1fbWFpbkZyYW1lLT5sb2FkZXIoKS0+cmVsb2Fk
KC8qIGJ5cGFzc0NhY2hlICovIHRydWUpOworfQorCit2b2lkIFdlYlBhZ2U6OnJlbG9hZEZyb21D
YWNoZSgpCit7CisgICAgZC0+bV9tYWluRnJhbWUtPmxvYWRlcigpLT5yZWxvYWQoLyogYnlwYXNz
Q2FjaGUgKi8gZmFsc2UpOworfQorCitXZWJTZXR0aW5ncyogV2ViUGFnZTo6c2V0dGluZ3MoKSBj
b25zdAoreworICAgIHJldHVybiBkLT5tX3dlYlNldHRpbmdzOworfQorCitib29sIFdlYlBhZ2U6
OmlzVmlzaWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fdmlzaWJsZTsKK30KKwordm9p
ZCBXZWJQYWdlOjpzZXRWaXNpYmxlKGJvb2wgdmlzaWJsZSkKK3sKKyAgICBpZiAoZC0+bV92aXNp
YmxlID09IHZpc2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIGQtPm1fdmlzaWJsZSA9IHZp
c2libGU7CisKKyAgICBpZiAoIXZpc2libGUpIHsKKyAgICAgICAgZC0+c3VzcGVuZEJhY2tpbmdT
dG9yZSgpOworCisgICAgICAgIC8vIFJlbW92ZSB0aGlzIFdlYlBhZ2UgZnJvbSB0aGUgdmlzaWJs
ZSBwYWdlcyBsaXN0LgorICAgICAgICBzaXplX3QgZm91bmRJbmRleCA9IHZpc2libGVXZWJQYWdl
cygpLT5maW5kKHRoaXMpOworICAgICAgICBpZiAoZm91bmRJbmRleCAhPSBXVEY6Om5vdEZvdW5k
KQorICAgICAgICAgICAgdmlzaWJsZVdlYlBhZ2VzKCktPnJlbW92ZShmb3VuZEluZGV4KTsKKwor
ICAgICAgICAvLyBSZXR1cm4gdGhlIGJhY2tpbmcgc3RvcmUgdG8gdGhlIGxhc3QgdmlzaWJsZSBX
ZWJQYWdlLgorICAgICAgICBpZiAoQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdT
dG9yZU93bmVyKCkgPT0gdGhpcyAmJiAhdmlzaWJsZVdlYlBhZ2VzKCktPmlzRW1wdHkoKSkKKyAg
ICAgICAgICAgIHZpc2libGVXZWJQYWdlcygpLT5sYXN0KCktPmQtPnJlc3VtZUJhY2tpbmdTdG9y
ZSgpOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgICAgICAvLyBSb290
IGxheWVyIGNvbW1pdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBpbnZpc2libGUgdGFicy4KKyAgICAg
ICAgLy8gQW5kIHJlbGVhc2UgbGF5ZXIgcmVzb3VyY2VzIGNhbiByZWR1Y2UgbWVtb3J5IGNvbnN1
bXB0aW9uLgorICAgICAgICBkLT5zdXNwZW5kUm9vdExheWVyQ29tbWl0KCk7CisjZW5kaWYKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
KyAgICBkLT5yZXN1bWVSb290TGF5ZXJDb21taXQoKTsKKyNlbmRpZgorCisgICAgLy8gUHVzaCB0
aGlzIFdlYlBhZ2UgdG8gdGhlIHRvcCBvZiB0aGUgdmlzaWJsZSBwYWdlcyBsaXN0LgorICAgIGlm
ICghdmlzaWJsZVdlYlBhZ2VzKCktPmlzRW1wdHkoKSAmJiB2aXNpYmxlV2ViUGFnZXMoKS0+bGFz
dCgpICE9IHRoaXMpIHsKKyAgICAgICAgc2l6ZV90IGZvdW5kSW5kZXggPSB2aXNpYmxlV2ViUGFn
ZXMoKS0+ZmluZCh0aGlzKTsKKyAgICAgICAgaWYgKGZvdW5kSW5kZXggIT0gV1RGOjpub3RGb3Vu
ZCkKKyAgICAgICAgICAgIHZpc2libGVXZWJQYWdlcygpLT5yZW1vdmUoZm91bmRJbmRleCk7Cisg
ICAgfQorICAgIHZpc2libGVXZWJQYWdlcygpLT5hcHBlbmQodGhpcyk7CisKKyAgICBpZiAoQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9yZU93bmVyKCkKKyAgICAgICAgJiYg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9yZU93bmVyKCkgIT0gdGhpcykK
KyAgICAgICAgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9yZU93bmVyKCkt
PmQtPnN1c3BlbmRCYWNraW5nU3RvcmUoKTsKKworICAgIC8vIHJlc3VtZUJhY2tpbmdTdG9yZSB3
aWxsIHNldCB0aGUgY3VycmVudCBvd25lciB0byB0aGlzIHdlYnBhZ2UuCisgICAgLy8gSWYgd2Ug
c2V0IHRoZSBvd25lciBwcmVtYXR1cmVseSwgdGhlbiB0aGUgdGlsZXMgd2lsbCBub3QgYmUgcmVz
ZXQuCisgICAgZC0+cmVzdW1lQmFja2luZ1N0b3JlKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZh
dGU6OnNlbGVjdGlvbkNoYW5nZWQoRnJhbWUqIGZyYW1lKQoreworICAgIG1faW5wdXRIYW5kbGVy
LT5zZWxlY3Rpb25DaGFuZ2VkKCk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBhIGhhY2shCisg
ICAgLy8gVG8gZW5zdXJlIHRoZSBzZWxlY3Rpb24gYmVpbmcgY2hhbmdlZCBoYXMgaXRzIGZyYW1l
ICdmb2N1c2VkJywgbGV0cworICAgIC8vIHNldCBpdCBhcyBmb2N1c2VkIG91cnNlbHZlcyAoUFIg
IzEwNDcyNCkuCisgICAgbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+c2V0Rm9jdXNlZEZyYW1l
KGZyYW1lKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6dXBkYXRlRGVsZWdhdGVkT3Zlcmxh
eXMoYm9vbCBkaXNwYXRjaGVkKQoreworICAgIC8vIFRyYWNrIGEgZGlzcGF0Y2hlZCBtZXNzYWdl
LCB3ZSBkb24ndCB3YW50IHRvIGZsb29kIHRoZSB3ZWJraXQgdGhyZWFkLgorICAgIC8vIFRoZXJl
IGNhbiBiZSBhcyBtYW55IGFzIG9uZSBtb3JlIG1lc3NhZ2UgZW5xdWVkIGFzIG5lZWRlZCBidXQg
bmV2ZXIgbGVzcy4KKyAgICBpZiAoZGlzcGF0Y2hlZCkKKyAgICAgICAgbV91cGRhdGVEZWxlZ2F0
ZWRPdmVybGF5c0Rpc3BhdGNoZWQgPSBmYWxzZTsKKyAgICBlbHNlIGlmIChtX3VwZGF0ZURlbGVn
YXRlZE92ZXJsYXlzRGlzcGF0Y2hlZCkgeworICAgICAgICAvLyBFYXJseSByZXR1cm4gaWYgdGhl
cmUgaXMgbWVzc2FnZSBhbHJlYWR5IHBlbmRpbmcgb24gdGhlIHdlYmtpdCB0aHJlYWQuCisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoUGxhdGZvcm06OndlYktpdFRocmVhZE1lc3Nh
Z2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgLy8gTXVzdCBiZSBjYWxs
ZWQgb24gdGhlIFdlYktpdCB0aHJlYWQuCisgICAgICAgIGlmIChtX3NlbGVjdGlvbkhhbmRsZXIt
PmlzU2VsZWN0aW9uQWN0aXZlKCkpCisgICAgICAgICAgICBtX3NlbGVjdGlvbkhhbmRsZXItPnNl
bGVjdGlvblBvc2l0aW9uQ2hhbmdlZCh0cnVlIC8qIHZpc3VhbENoYW5nZU9ubHkgKi8pOworCisg
ICAgfSBlbHNlIGlmIChtX3NlbGVjdGlvbkhhbmRsZXItPmlzU2VsZWN0aW9uQWN0aXZlKCkpIHsK
KyAgICAgICAgLy8gRG9uJ3QgYm90aGVyIGRpc3BhdGNoaW5nIHRvIHdlYmtpdCB0aHJlYWQgaWYg
c2VsZWN0aW9uIGFuZCB0YXAgaGlnaGxpZ2h0IGFyZSBub3QgYWN0aXZlLgorICAgICAgICBtX3Vw
ZGF0ZURlbGVnYXRlZE92ZXJsYXlzRGlzcGF0Y2hlZCA9IHRydWU7CisgICAgICAgIFBsYXRmb3Jt
Ojp3ZWJLaXRUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoTWVzc2FnZShQbGF0Zm9ybTo6
Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJldlYlBhZ2VQcml2YXRlOjp1cGRhdGVEZWxlZ2F0ZWRP
dmVybGF5cywgdGhpcywgdHJ1ZSAvKmRpc3BhdGNoZWQqLykpOworICAgIH0KK30KKwordm9pZCBX
ZWJQYWdlOjpzZXRDYXJldEhpZ2hsaWdodFN0eWxlKFBsYXRmb3JtOjpDYXJldEhpZ2hsaWdodFN0
eWxlIHN0eWxlKQoreworfQorCitib29sIFdlYlBhZ2U6OnNldEJhdGNoRWRpdGluZ0FjdGl2ZShi
b29sIGFjdGl2ZSkKK3sKKyAgICByZXR1cm4gZC0+bV9pbnB1dEhhbmRsZXItPnNldEJhdGNoRWRp
dGluZ0FjdGl2ZShhY3RpdmUpOworfQorCitib29sIFdlYlBhZ2U6OnNldElucHV0U2VsZWN0aW9u
KHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQpCit7CisgICAgcmV0dXJuIGQtPm1faW5wdXRI
YW5kbGVyLT5zZXRTZWxlY3Rpb24oc3RhcnQsIGVuZCk7Cit9CisKK2ludCBXZWJQYWdlOjppbnB1
dENhcmV0UG9zaXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBkLT5tX2lucHV0SGFuZGxlci0+
Y2FyZXRQb3NpdGlvbigpOworfQorCit2b2lkIFdlYlBhZ2U6OnBvcHVwTGlzdENsb3NlZChpbnQg
c2l6ZSwgYm9vbCogc2VsZWN0ZWRzKQoreworICAgIGQtPm1faW5wdXRIYW5kbGVyLT5zZXRQb3B1
cExpc3RJbmRleGVzKHNpemUsIHNlbGVjdGVkcyk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6cG9wdXBM
aXN0Q2xvc2VkKGludCBpbmRleCkKK3sKKyAgICBkLT5tX2lucHV0SGFuZGxlci0+c2V0UG9wdXBM
aXN0SW5kZXgoaW5kZXgpOworfQorCit2b2lkIFdlYlBhZ2U6OnNldERhdGVUaW1lSW5wdXQoY29u
c3QgV2ViU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBkLT5tX2lucHV0SGFuZGxlci0+c2V0SW5wdXRW
YWx1ZShTdHJpbmcodmFsdWUuaW1wbCgpKSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0Q29sb3JJ
bnB1dChjb25zdCBXZWJTdHJpbmcmIHZhbHVlKQoreworICAgIGQtPm1faW5wdXRIYW5kbGVyLT5z
ZXRJbnB1dFZhbHVlKFN0cmluZyh2YWx1ZS5pbXBsKCkpKTsKK30KKworQWN0aXZlTm9kZUNvbnRl
eHQgV2ViUGFnZTo6YWN0aXZlTm9kZUNvbnRleHQoVGFyZ2V0RGV0ZWN0aW9uU3RyYXRlZ3kgc3Ry
YXRlZ3kpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmFjdGl2ZU5vZGVDb250ZXh0KHN0cmF0ZWd5
KTsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRWaXJ0dWFsVmlld3BvcnRTaXplKGludCB3aWR0aCwg
aW50IGhlaWdodCkKK3sKKyAgICBkLT5tX3ZpcnR1YWxWaWV3cG9ydFdpZHRoID0gd2lkdGg7Cisg
ICAgZC0+bV92aXJ0dWFsVmlld3BvcnRIZWlnaHQgPSBoZWlnaHQ7Cit9CisKK3ZvaWQgV2ViUGFn
ZTo6cmVzZXRWaXJ0dWFsVmlld3BvcnRPbkNvbW1pdHRlZChib29sIHJlc2V0KQoreworICAgIGQt
Pm1fcmVzZXRWaXJ0dWFsVmlld3BvcnRPbkNvbW1pdHRlZCA9IHJlc2V0OworfQorCitJbnRTaXpl
IFdlYlBhZ2VQcml2YXRlOjpyZWNvbXB1dGVWaXJ0dWFsVmlld3BvcnRGcm9tVmlld3BvcnRBcmd1
bWVudHMoKQoreworICAgIHN0YXRpYyBWaWV3cG9ydEFyZ3VtZW50cyBkZWZhdWx0Vmlld3BvcnRB
cmd1bWVudHM7CisgICAgaWYgKG1fdmlld3BvcnRBcmd1bWVudHMgPT0gZGVmYXVsdFZpZXdwb3J0
QXJndW1lbnRzKQorICAgICAgICByZXR1cm4gSW50U2l6ZSgpOworCisgICAgaW50IGRlc2t0b3BX
aWR0aCA9IGRlZmF1bHRNYXhMYXlvdXRTaXplKCkud2lkdGgoKTsKKyAgICBpbnQgZGV2aWNlV2lk
dGggPSBQbGF0Zm9ybTo6R3JhcGhpY3M6OlNjcmVlbjo6d2lkdGgoKTsKKyAgICBpbnQgZGV2aWNl
SGVpZ2h0ID0gUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OmhlaWdodCgpOworICAgIEZsb2F0
U2l6ZSBjdXJyZW50UFBJID0gUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OnBpeGVsc1Blcklu
Y2goLTEpOworICAgIGludCBkZXZpY2VEUEkgPSBpbnQocm91bmRmKChjdXJyZW50UFBJLndpZHRo
KCkgKyBjdXJyZW50UFBJLmhlaWdodCgpKSAvIDIpKTsKKyAgICBpZiAobV92aWV3cG9ydEFyZ3Vt
ZW50cy50YXJnZXREZW5zaXR5RHBpID09IFZpZXdwb3J0QXJndW1lbnRzOjpWYWx1ZUF1dG8pIHsK
KyAgICAgICAgLy8gQXV0byBtZWFucyAxNjBkcGkgaWYgd2UgbGVhdmUgaXQgYWxvbmUuIFRoaXMg
bG9va3MgdGVycmlibGUgZm9yIHBhZ2VzIHdhbnRpbmcgMToxLgorICAgICAgICAvLyBGSVhNRTog
VGhpcyBpcyBpbnN1ZmZpY2llbnQgZm9yIGRldmljZXMgd2l0aCBoaWdoIGRwaSwgYXMgdGhleSB3
aWxsIHJlbmRlciBjb250ZW50IHVucmVhZGFibHkgc21hbGwuCisgICAgICAgIG1fdmlld3BvcnRB
cmd1bWVudHMudGFyZ2V0RGVuc2l0eURwaSA9IGRldmljZURQSTsKKyAgICB9CisKKyAgICBWaWV3
cG9ydEF0dHJpYnV0ZXMgcmVzdWx0ID0gY29tcHV0ZVZpZXdwb3J0QXR0cmlidXRlcyhtX3ZpZXdw
b3J0QXJndW1lbnRzLCBkZXNrdG9wV2lkdGgsIGRldmljZVdpZHRoLCBkZXZpY2VIZWlnaHQsIGRl
dmljZURQSSwgbV9kZWZhdWx0TGF5b3V0U2l6ZSk7CisgICAgcmV0dXJuIEludFNpemUocmVzdWx0
LmxheW91dFNpemUud2lkdGgoKSwgcmVzdWx0LmxheW91dFNpemUuaGVpZ2h0KCkpOworfQorCisj
aWYgRU5BQkxFKEVWRU5UX01PREVfTUVUQVRBR1MpCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpkaWRS
ZWNlaXZlQ3Vyc29yRXZlbnRNb2RlKEN1cnNvckV2ZW50TW9kZSBtb2RlKQoreworICAgIGlmICht
b2RlICE9IG1fY3Vyc29yRXZlbnRNb2RlKQorICAgICAgICBtX2NsaWVudC0+Y3Vyc29yRXZlbnRN
b2RlQ2hhbmdlZCh0b1BsYXRmb3JtQ3Vyc29yRXZlbnRNb2RlKG1vZGUpKTsKKyAgICBtX2N1cnNv
ckV2ZW50TW9kZSA9IG1vZGU7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmRpZFJlY2VpdmVU
b3VjaEV2ZW50TW9kZShUb3VjaEV2ZW50TW9kZSBtb2RlKQoreworICAgIGlmIChtb2RlICE9IG1f
dG91Y2hFdmVudE1vZGUpCisgICAgICAgIG1fY2xpZW50LT50b3VjaEV2ZW50TW9kZUNoYW5nZWQo
dG9QbGF0Zm9ybVRvdWNoRXZlbnRNb2RlKG1vZGUpKTsKKyAgICBtX3RvdWNoRXZlbnRNb2RlID0g
bW9kZTsKK30KKyNlbmRpZgorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpkaXNwYXRjaFZpZXdwb3J0
UHJvcGVydGllc0RpZENoYW5nZShjb25zdCBWaWV3cG9ydEFyZ3VtZW50cyYgYXJndW1lbnRzKQor
eworICAgIHN0YXRpYyBWaWV3cG9ydEFyZ3VtZW50cyBkZWZhdWx0Vmlld3BvcnRBcmd1bWVudHM7
CisgICAgaWYgKGFyZ3VtZW50cyA9PSBkZWZhdWx0Vmlld3BvcnRBcmd1bWVudHMpCisgICAgICAg
IHJldHVybjsKKworICAgIG1fdmlld3BvcnRBcmd1bWVudHMgPSBhcmd1bWVudHM7CisKKyAgICAv
LyAwIHdpZHRoIG9yIGhlaWdodCBpbiB2aWV3cG9ydCBhcmd1bWVudHMgbWFrZXMgbm8gc2Vuc2Us
IGFuZCByZXN1bHRzIGluIGEgdmVyeSBsYXJnZSBpbml0aWFsIHNjYWxlLgorICAgIC8vIEluIHJl
YWwgd29ybGQsIGEgMCB3aWR0aCBvciBoZWlnaHQgaXMgdXN1YWxseSBjYXVzZWQgYnkgYSBzeW50
YXggZXJyb3IgaW4gImNvbnRlbnQiIGZpZWxkIG9mIHZpZXdwb3J0CisgICAgLy8gbWV0YSB0YWcs
IGZvciBleGFtcGxlLCB1c2luZyBzZW1pY29sb24gaW5zdGVhZCBvZiBjb21tYSBhcyBzZXBhcmF0
b3IgKCJ3aWR0aD1kZXZpY2Utd2lkdGg7IGluaXRpYWwtc2NhbGU9MS4wIikuCisgICAgLy8gV2Ug
ZG9uJ3QgaGF2ZSBhIHBsYW4gdG8gdG9sZXJhdGUgdGhlIHNlbWljb2xvbiBzZXBhcmF0b3IsIGJ1
dCB3ZSBjYW4gYXZvaWQgYXBwbHlpbmcgMCB3aWR0aC9oZWlnaHQuCisgICAgLy8gSSBkZWZhdWx0
IGl0IHRvIFZhbHVlRGV2aWNlV2lkdGggcmF0aGVyIHRoYW4gVmFsdWVBdXRvIGJlY2F1c2UgaW4g
bW9yZSBjYXNlcyB0aGUgd2ViIHNpdGUgd2FudHMgImRldmljZS13aWR0aCIKKyAgICAvLyB3aGVu
IHRoZXkgc3BlY2lmeSB0aGUgdmlld3BvcnQgd2lkdGguCisgICAgaWYgKCFtX3ZpZXdwb3J0QXJn
dW1lbnRzLndpZHRoKQorICAgICAgICBtX3ZpZXdwb3J0QXJndW1lbnRzLndpZHRoID0gVmlld3Bv
cnRBcmd1bWVudHM6OlZhbHVlRGV2aWNlV2lkdGg7CisgICAgaWYgKCFtX3ZpZXdwb3J0QXJndW1l
bnRzLmhlaWdodCkKKyAgICAgICAgbV92aWV3cG9ydEFyZ3VtZW50cy5oZWlnaHQgPSBWaWV3cG9y
dEFyZ3VtZW50czo6VmFsdWVEZXZpY2VIZWlnaHQ7CisKKyAgICBzZXRVc2VyU2NhbGFibGUoYXJn
dW1lbnRzLnVzZXJTY2FsYWJsZSA9PSBWaWV3cG9ydEFyZ3VtZW50czo6VmFsdWVBdXRvID8gdHJ1
ZSA6IGFyZ3VtZW50cy51c2VyU2NhbGFibGUpOworICAgIGlmIChhcmd1bWVudHMuaW5pdGlhbFNj
YWxlID4gMCkKKyAgICAgICAgc2V0SW5pdGlhbFNjYWxlKGFyZ3VtZW50cy5pbml0aWFsU2NhbGUp
OworICAgIGlmIChhcmd1bWVudHMubWluaW11bVNjYWxlID4gMCkKKyAgICAgICAgc2V0TWluaW11
bVNjYWxlKGFyZ3VtZW50cy5taW5pbXVtU2NhbGUpOworICAgIGlmIChhcmd1bWVudHMubWF4aW11
bVNjYWxlID4gMCkKKyAgICAgICAgc2V0TWF4aW11bVNjYWxlKGFyZ3VtZW50cy5tYXhpbXVtU2Nh
bGUpOworCisgICAgSW50U2l6ZSB2aXJ0dWFsVmlld3BvcnQgPSByZWNvbXB1dGVWaXJ0dWFsVmll
d3BvcnRGcm9tVmlld3BvcnRBcmd1bWVudHMoKTsKKyAgICBtX3dlYlBhZ2UtPnNldFZpcnR1YWxW
aWV3cG9ydFNpemUodmlydHVhbFZpZXdwb3J0LndpZHRoKCksIHZpcnR1YWxWaWV3cG9ydC5oZWln
aHQoKSk7CisKKyAgICBpZiAobG9hZFN0YXRlKCkgPT0gV2ViS2l0OjpXZWJQYWdlUHJpdmF0ZTo6
Q29tbWl0dGVkKQorICAgICAgICB6b29tVG9Jbml0aWFsU2NhbGVPbkxvYWQoKTsKK30KKwordm9p
ZCBXZWJQYWdlUHJpdmF0ZTo6b25JbnB1dExvY2FsZUNoYW5nZWQoYm9vbCBpc1JUTCkKK3sKKyAg
ICBpZiAoaXNSVEwgIT0gbV93ZWJTZXR0aW5ncy0+aXNXcml0aW5nRGlyZWN0aW9uUlRMKCkpIHsK
KyAgICAgICAgbV93ZWJTZXR0aW5ncy0+c2V0V3JpdGluZ0RpcmVjdGlvblJUTChpc1JUTCk7Cisg
ICAgICAgIG1faW5wdXRIYW5kbGVyLT5oYW5kbGVJbnB1dExvY2FsZUNoYW5nZWQoaXNSVEwpOwor
ICAgIH0KK30KKwordm9pZCBXZWJQYWdlOjpzZXRTY3JlZW5PcmllbnRhdGlvbihpbnQgb3JpZW50
YXRpb24pCit7CisgICAgZC0+bV9wZW5kaW5nT3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKK30K
Kwordm9pZCBXZWJQYWdlOjphcHBseVBlbmRpbmdPcmllbnRhdGlvbklmTmVlZGVkKCkKK3sKKyAg
ICBpZiAoZC0+bV9wZW5kaW5nT3JpZW50YXRpb24gIT0gLTEpCisgICAgICAgIGQtPnNldFNjcmVl
bk9yaWVudGF0aW9uKGQtPm1fcGVuZGluZ09yaWVudGF0aW9uKTsKK30KKwordm9pZCBXZWJQYWdl
UHJpdmF0ZTo6c3VzcGVuZEJhY2tpbmdTdG9yZSgpCit7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorICAgIHJlc2V0Q29tcG9zaXRpbmdTdXJmYWNlKCk7CisjZW5kaWYKK30KKwor
dm9pZCBXZWJQYWdlUHJpdmF0ZTo6cmVzdW1lQmFja2luZ1N0b3JlKCkKK3sKKyAgICBBU1NFUlQo
bV93ZWJQYWdlLT5pc1Zpc2libGUoKSk7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCisgICAgc2V0TmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpOworI2VuZGlm
CisKKyAgICBib29sIGRpcmVjdFJlbmRlcmluZyA9IG1fYmFja2luZ1N0b3JlLT5kLT5zaG91bGRE
aXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpOworICAgIGlmICghbV9iYWNraW5nU3RvcmUtPmQtPmlz
QWN0aXZlKCkKKyAgICAgICAgfHwgc2hvdWxkUmVzZXRUaWxlc1doZW5TaG93bigpCisgICAgICAg
IHx8IGRpcmVjdFJlbmRlcmluZykgeworICAgICAgICAvLyBXZSBuZWVkIHRvIHJlc2V0IGFsbCB0
aWxlcyBzbyB0aGF0IHdlIGRvIG5vdCBzaG93IGFueSB0aWxlcyB3aG9zZSBjb250ZW50IG1heQor
ICAgICAgICAvLyBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgYW5vdGhlciBXZWJQYWdlIGluc3RhbmNl
IChpLmUuIGFub3RoZXIgdGFiKS4KKyAgICAgICAgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2V0Q3Vy
cmVudEJhY2tpbmdTdG9yZU93bmVyKG1fd2ViUGFnZSk7CisgICAgICAgIG1fYmFja2luZ1N0b3Jl
LT5kLT5vcmllbnRhdGlvbkNoYW5nZWQoKTsgLy8gVXBkYXRlcyB0aWxlIGdlb21ldHJ5IGFuZCBj
cmVhdGVzIHZpc2libGUgdGlsZSBidWZmZXIuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5y
ZXNldFRpbGVzKHRydWUgLyogcmVzZXRCYWNrZ3JvdW5kICovKTsKKyAgICAgICAgbV9iYWNraW5n
U3RvcmUtPmQtPnVwZGF0ZVRpbGVzKGZhbHNlIC8qIHVwZGF0ZVZpc2libGUgKi8sIGZhbHNlIC8q
IGltbWVkaWF0ZSAqLyk7CisgICAgICAgIC8vIFRoaXMgdmFsdWUgbWF5IGhhdmUgY2hhbmdlZCwg
c28gd2UgbmVlZCB0byB1cGRhdGUgaXQuCisgICAgICAgIGRpcmVjdFJlbmRlcmluZyA9IG1fYmFj
a2luZ1N0b3JlLT5kLT5zaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpOworICAgICAgICBp
ZiAobV9iYWNraW5nU3RvcmUtPmQtPnJlbmRlclZpc2libGVDb250ZW50cygpICYmICFtX2JhY2tp
bmdTdG9yZS0+ZC0+aXNTdXNwZW5kZWQoKSAmJiAhZGlyZWN0UmVuZGVyaW5nKQorICAgICAgICAg
ICAgbV9iYWNraW5nU3RvcmUtPmQtPmJsaXRWaXNpYmxlQ29udGVudHMoKTsKKyAgICB9IGVsc2Ug
eworICAgICAgICAvLyBSZW5kZXJpbmcgd2FzIGRpc2FibGVkIHdoaWxlIHdlIHdlcmUgaGlkZGVu
LCBzbyB3ZSBuZWVkIHRvIHVwZGF0ZSBhbGwgdGlsZXMuCisgICAgICAgIG1fYmFja2luZ1N0b3Jl
LT5kLT51cGRhdGVUaWxlcyh0cnVlIC8qIHVwZGF0ZVZpc2libGUgKi8sIGZhbHNlIC8qIGltbWVk
aWF0ZSAqLyk7CisgICAgfQorCisgICAgc2V0U2hvdWxkUmVzZXRUaWxlc1doZW5TaG93bihmYWxz
ZSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldFNjcmVlbk9yaWVudGF0aW9uKGludCBv
cmllbnRhdGlvbikKK3sKKyAgICBGT1JfRUFDSF9QTFVHSU5WSUVXKG1fcGx1Z2luVmlld3MpCisg
ICAgICAgICgqaXQpLT5oYW5kbGVPcmllbnRhdGlvbkV2ZW50KG9yaWVudGF0aW9uKTsKKworICAg
IG1fcGVuZGluZ09yaWVudGF0aW9uID0gLTE7CisKKyNpZiBFTkFCTEUoT1JJRU5UQVRJT05fRVZF
TlRTKQorICAgIGlmIChtX21haW5GcmFtZS0+b3JpZW50YXRpb24oKSA9PSBvcmllbnRhdGlvbikK
KyAgICAgICAgcmV0dXJuOworICAgIGZvciAoUmVmUHRyPEZyYW1lPiBmcmFtZSA9IG1fbWFpbkZy
YW1lOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT50cmF2ZXJzZU5leHQoKSkKKyAgICAg
ICAgZnJhbWUtPnNlbmRPcmllbnRhdGlvbkNoYW5nZUV2ZW50KG9yaWVudGF0aW9uKTsKKyNlbmRp
ZgorfQorCitQbGF0Zm9ybTo6SW50U2l6ZSBXZWJQYWdlOjp2aWV3cG9ydFNpemUoKSBjb25zdAor
eworICAgIHJldHVybiBkLT50cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKCk7Cit9CisKK3Zv
aWQgV2ViUGFnZTo6c2V0Vmlld3BvcnRTaXplKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiB2aWV3
cG9ydFNpemUsIGJvb2wgZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJsZSkKK3sKKyAgICBkLT5zZXRW
aWV3cG9ydFNpemUodmlld3BvcnRTaXplLCBlbnN1cmVGb2N1c0VsZW1lbnRWaXNpYmxlKTsKK30K
Kwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2NyZWVuUm90YXRlZCgpCit7CisgICAgLy8gVGhpcyBj
YWxsIHdpbGwgY2F1c2UgdGhlIGNsaWVudCB0byByZWFsbG9jYXRlIHRoZSB3aW5kb3cgYnVmZmVy
IHRvIG5ldyBzaXplLAorICAgIC8vIHdoaWNoIG5lZWRzIHRvIGJlIHNlcmlhbGl6ZWQgd2l0aCB1
c2FnZSBvZiB0aGUgd2luZG93IGJ1ZmZlci4gQWNjb21wbGlzaAorICAgIC8vIHRoaXMgYnkgc2Vu
ZGluZyBhIHN5bmMgbWVzc2FnZSB0byB0aGUgY29tcG9zaXRpbmcgdGhyZWFkLiBBbGwgb3RoZXIg
dXNhZ2Ugb2YKKyAgICAvLyB0aGUgd2luZG93IGJ1ZmZlciBoYXBwZW5zIG9uIHRoZSBjb21wb3Np
dGluZyB0aHJlYWQuCisgICAgaWYgKCFQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3Nh
Z2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgUGxhdGZvcm06OnVzZXJJ
bnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoU3luY01lc3NhZ2UoCisgICAg
ICAgICAgICBQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJldlYlBhZ2VQcml2YXRl
OjpzY3JlZW5Sb3RhdGVkLCB0aGlzKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBT
dXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+bm90aWZ5U2NyZWVuUm90YXRlZCgpOwor
ICAgIG1fY2xpZW50LT5ub3RpZnlTY3JlZW5Sb3RhdGVkKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVBy
aXZhdGU6OnNldFZpZXdwb3J0U2l6ZShjb25zdCBJbnRTaXplJiB0cmFuc2Zvcm1lZEFjdHVhbFZp
c2libGVTaXplLCBib29sIGVuc3VyZUZvY3VzRWxlbWVudFZpc2libGUpCit7CisgICAgaWYgKG1f
cGVuZGluZ09yaWVudGF0aW9uID09IC0xICYmIHRyYW5zZm9ybWVkQWN0dWFsVmlzaWJsZVNpemUg
PT0gdGhpcy0+dHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSgpKQorICAgICAgICByZXR1cm47
CisKKyAgICAvLyBTdXNwZW5kIGFsbCBzY3JlZW4gdXBkYXRlcyB0byB0aGUgYmFja2luZ3N0b3Jl
IHRvIG1ha2Ugc3VyZSBuby1vbmUgdHJpZXMgdG8gYmxpdAorICAgIC8vIHdoaWxlIHRoZSB3aW5k
b3cgc3VyZmFjZSBhbmQgdGhlIEJhY2tpbmdTdG9yZSBhcmUgb3V0IG9mIHN5bmMuCisgICAgbV9i
YWNraW5nU3RvcmUtPmQtPnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7CisK
KyAgICAvLyBUaGUgc2NyZWVuIHJvdGF0aW9uIGlzIGEgbWFqb3Igc3RhdGUgdHJhbnNpdGlvbiB0
aGF0IGluIHRoaXMgY2FzZSBpcyBub3QgcHJvcGVybHkKKyAgICAvLyBjb21tdW5pY2F0ZWQgdG8g
dGhlIGJhY2tpbmcgc3RvcmUsIHNpbmNlIGl0IGRvZXMgZWFybHkgcmV0dXJuIGluIG1vc3QgbWV0
aG9kcyB3aGVuCisgICAgLy8gbm90IHZpc2libGUuCisgICAgaWYgKCFtX3Zpc2libGUgfHwgIW1f
YmFja2luZ1N0b3JlLT5kLT5pc0FjdGl2ZSgpKQorICAgICAgICBzZXRTaG91bGRSZXNldFRpbGVz
V2hlblNob3duKHRydWUpOworCisgICAgYm9vbCBoYXNQZW5kaW5nT3JpZW50YXRpb24gPSBtX3Bl
bmRpbmdPcmllbnRhdGlvbiAhPSAtMTsKKyAgICBpZiAoaGFzUGVuZGluZ09yaWVudGF0aW9uKQor
ICAgICAgICBzY3JlZW5Sb3RhdGVkKCk7CisKKyAgICAvLyBUaGUgd2luZG93IGJ1ZmZlcnMgbWln
aHQgaGF2ZSBiZWVuIHJlY3JlYXRlZCwgY2xlYXJlZCwgbW92ZWQsIGV0Yy4sIHNvOgorICAgIG1f
YmFja2luZ1N0b3JlLT5kLT53aW5kb3dGcm9udEJ1ZmZlclN0YXRlKCktPmNsZWFyQmxpdHRlZFJl
Z2lvbigpOworICAgIG1fYmFja2luZ1N0b3JlLT5kLT53aW5kb3dCYWNrQnVmZmVyU3RhdGUoKS0+
Y2xlYXJCbGl0dGVkUmVnaW9uKCk7CisKKyAgICBJbnRTaXplIHZpZXdwb3J0U2l6ZUJlZm9yZSA9
IGFjdHVhbFZpc2libGVTaXplKCk7CisgICAgRmxvYXRQb2ludCBjZW50ZXJPZlZpc2libGVDb250
ZW50c1JlY3QgPSB0aGlzLT5jZW50ZXJPZlZpc2libGVDb250ZW50c1JlY3QoKTsKKyAgICBib29s
IG5ld1Zpc2libGVSZWN0Q29udGFpbnNPbGRWaXNpYmxlUmVjdCA9IChtX2FjdHVhbFZpc2libGVI
ZWlnaHQgPD0gdHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZS5oZWlnaHQoKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtX2FjdHVhbFZpc2libGVXaWR0
aCA8PSB0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplLndpZHRoKCkpOworCisgICAgYm9vbCBh
dEluaXRpYWxTY2FsZSA9IGN1cnJlbnRTY2FsZSgpID09IGluaXRpYWxTY2FsZSgpOworICAgIGJv
b2wgYXRUb3AgPSAhc2Nyb2xsUG9zaXRpb24oKS55KCk7CisgICAgYm9vbCBhdExlZnQgPSAhc2Ny
b2xsUG9zaXRpb24oKS54KCk7CisKKyAgICAvLyBXZSBuZWVkIHRvIHJlb3JpZW50IHRoZSB2aXNp
YmxlVGlsZVJlY3QgYmVjYXVzZSB0aGUgZm9sbG93aW5nIGNvZGUKKyAgICAvLyBjb3VsZCBjYXVz
ZSBCYWNraW5nU3RvcmU6OnRyYW5zZm9ybUNoYW5nZWQgdG8gYmUgY2FsbGVkLCB3aGVyZSBpdAor
ICAgIC8vIGlzIHVzZWQuCisgICAgLy8gSXQgaXMgb25seSBkZXBlbmRlbnQgb24gdGhlIHRyYW5z
Zm9ybWVkVmlld3BvcnRTaXplIHdoaWNoIGhhcyBiZWVuCisgICAgLy8gdXBkYXRlZCBieSBub3cu
CisgICAgbV9iYWNraW5nU3RvcmUtPmQtPmNyZWF0ZVZpc2libGVUaWxlQnVmZmVyKCk7CisKKyAg
ICBzZXREZWZhdWx0TGF5b3V0U2l6ZSh0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKTsKKwor
ICAgIC8vIFJlY29tcHV0ZSBvdXIgdmlydHVhbCB2aWV3cG9ydC4KKyAgICBib29sIG5lZWRzTGF5
b3V0ID0gZmFsc2U7CisgICAgc3RhdGljIFZpZXdwb3J0QXJndW1lbnRzIGRlZmF1bHRWaWV3cG9y
dEFyZ3VtZW50czsKKyAgICBpZiAoIShtX3ZpZXdwb3J0QXJndW1lbnRzID09IGRlZmF1bHRWaWV3
cG9ydEFyZ3VtZW50cykpIHsKKyAgICAgICAgLy8gV2UgbWF5IG5lZWQgdG8gaW5mZXIgdGhlIHdp
ZHRoIGFuZCBoZWlnaHQgZm9yIHRoZSB2aWV3cG9ydCB3aXRoIHJlc3BlY3QgdG8gdGhlIHJvdGF0
aW9uLgorICAgICAgICBJbnRTaXplIG5ld1ZpcnR1YWxWaWV3cG9ydCA9IHJlY29tcHV0ZVZpcnR1
YWxWaWV3cG9ydEZyb21WaWV3cG9ydEFyZ3VtZW50cygpOworICAgICAgICBBU1NFUlQoIW5ld1Zp
cnR1YWxWaWV3cG9ydC5pc0VtcHR5KCkpOworICAgICAgICBtX3dlYlBhZ2UtPnNldFZpcnR1YWxW
aWV3cG9ydFNpemUobmV3VmlydHVhbFZpZXdwb3J0LndpZHRoKCksIG5ld1ZpcnR1YWxWaWV3cG9y
dC5oZWlnaHQoKSk7CisgICAgICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPnNldFVzZUZpeGVkTGF5
b3V0KHVzZUZpeGVkTGF5b3V0KCkpOworICAgICAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXRG
aXhlZExheW91dFNpemUoZml4ZWRMYXlvdXRTaXplKCkpOworICAgICAgICBuZWVkc0xheW91dCA9
IHRydWU7CisgICAgfQorCisgICAgLy8gV2Ugc3dpdGNoIHRoaXMgc3RyaWN0bHkgYWZ0ZXIgcmVj
b21wdXRpbmcgb3VyIHZpcnR1YWwgdmlld3BvcnQgYXMgem9vbVRvRml0U2NhbGUgaXMgZGVwZW5k
ZW50CisgICAgLy8gdXBvbiB0aGVzZSB2YWx1ZXMgYW5kIHNvIGlzIHRoZSB2aXJ0dWFsIHZpZXdw
b3J0IHJlY2FsY3VsYXRpb24uCisgICAgbV9hY3R1YWxWaXNpYmxlV2lkdGggPSB0cmFuc2Zvcm1l
ZEFjdHVhbFZpc2libGVTaXplLndpZHRoKCk7CisgICAgbV9hY3R1YWxWaXNpYmxlSGVpZ2h0ID0g
dHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZS5oZWlnaHQoKTsKKworICAgIEludFNpemUgdmll
d3BvcnRTaXplQWZ0ZXIgPSBhY3R1YWxWaXNpYmxlU2l6ZSgpOworCisgICAgSW50UG9pbnQgb2Zm
c2V0KHJvdW5kZigodmlld3BvcnRTaXplQmVmb3JlLndpZHRoKCkgLSB2aWV3cG9ydFNpemVBZnRl
ci53aWR0aCgpKSAvIDIuMCksCisgICAgICAgICAgICAgICAgICAgIHJvdW5kZigodmlld3BvcnRT
aXplQmVmb3JlLmhlaWdodCgpIC0gdmlld3BvcnRTaXplQWZ0ZXIuaGVpZ2h0KCkpIC8gMi4wKSk7
CisKKyAgICAvLyBBcyBhIHNwZWNpYWwgY2FzZSwgaWYgd2Ugd2VyZSBhbmNob3JlZCB0byB0aGUg
dG9wIGxlZnQgcG9zaXRpb24gYXQKKyAgICAvLyB0aGUgYmVnaW5uaW5nIG9mIHRoZSByb3RhdGlv
biB0aGVuIHByZXNlcnZlIHRoYXQgYW5jaG9yLgorICAgIGlmIChhdFRvcCkKKyAgICAgICAgb2Zm
c2V0LnNldFkoMCk7CisgICAgaWYgKGF0TGVmdCkKKyAgICAgICAgb2Zmc2V0LnNldFgoMCk7CisK
KyAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byBvdmVyc2Nyb2xsLCBjYXAgdGhlIG9mZnNldCB0byB2
YWxpZCBjb250ZW50LgorICAgIEludFBvaW50IGJvdHRvbVJpZ2h0KAorICAgICAgICBzY3JvbGxQ
b3NpdGlvbigpLngoKSArIHZpZXdwb3J0U2l6ZUFmdGVyLndpZHRoKCksCisgICAgICAgIHNjcm9s
bFBvc2l0aW9uKCkueSgpICsgdmlld3BvcnRTaXplQWZ0ZXIuaGVpZ2h0KCkpOworCisgICAgaWYg
KGJvdHRvbVJpZ2h0LngoKSArIG9mZnNldC54KCkgPiBjb250ZW50c1NpemUoKS53aWR0aCgpKQor
ICAgICAgICBvZmZzZXQuc2V0WChjb250ZW50c1NpemUoKS53aWR0aCgpIC0gYm90dG9tUmlnaHQu
eCgpKTsKKyAgICBpZiAoYm90dG9tUmlnaHQueSgpICsgb2Zmc2V0LnkoKSA+IGNvbnRlbnRzU2l6
ZSgpLmhlaWdodCgpKQorICAgICAgICBvZmZzZXQuc2V0WShjb250ZW50c1NpemUoKS5oZWlnaHQo
KSAtIGJvdHRvbVJpZ2h0LnkoKSk7CisgICAgaWYgKHNjcm9sbFBvc2l0aW9uKCkueCgpICsgb2Zm
c2V0LngoKSA8IDApCisgICAgICAgIG9mZnNldC5zZXRYKC1zY3JvbGxQb3NpdGlvbigpLngoKSk7
CisgICAgaWYgKHNjcm9sbFBvc2l0aW9uKCkueSgpICsgb2Zmc2V0LnkoKSA8IDApCisgICAgICAg
IG9mZnNldC5zZXRZKC1zY3JvbGxQb3NpdGlvbigpLnkoKSk7CisKKyAgICAvLyAuLi5iZWZvcmUg
c2Nyb2xsaW5nLCBiZWNhdXNlIHRoZSBiYWNraW5nIHN0b3JlIHdpbGwgYWxpZ24gaXRzCisgICAg
Ly8gdGlsZSBtYXRyaXggd2l0aCB0aGUgdmlld3BvcnQgYXMgcmVwb3J0ZWQgYnkgdGhlIFNjcm9s
bFZpZXcuCisgICAgc2Nyb2xsQnkob2Zmc2V0LngoKSwgb2Zmc2V0LnkoKSk7CisgICAgbm90aWZ5
VHJhbnNmb3JtZWRTY3JvbGxDaGFuZ2VkKCk7CisKKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+b3Jp
ZW50YXRpb25DaGFuZ2VkKCk7CisgICAgbV9iYWNraW5nU3RvcmUtPmQtPmFjdHVhbFZpc2libGVT
aXplQ2hhbmdlZCh0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKTsKKworICAgIC8vIFVwZGF0
ZSB2aWV3IG1vZGUgb25seSBhZnRlciB3ZSBoYXZlIHVwZGF0ZWQgdGhlIGFjdHVhbAorICAgIC8v
IHZpc2libGUgc2l6ZSBhbmQgcmVzZXQgdGhlIGNvbnRlbnRzIHJlY3QgaWYgbmVjZXNzYXJ5Lgor
ICAgIGlmIChzZXRWaWV3TW9kZSh2aWV3TW9kZSgpKSkKKyAgICAgICAgbmVlZHNMYXlvdXQgPSB0
cnVlOworCisgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHZpZXdwb3J0IHNpemUgb2YgdGhl
IFdlYkNvcmU6OlNjcm9sbFZpZXcuLi4KKyAgICB1cGRhdGVWaWV3cG9ydFNpemUoIWhhc1BlbmRp
bmdPcmllbnRhdGlvbiAvKiBzZXRGaXhlZFJlcG9ydGVkU2l6ZSAqLywgZmFsc2UgLyogc2VuZFJl
c2l6ZUV2ZW50ICovKTsKKyAgICBub3RpZnlUcmFuc2Zvcm1lZENvbnRlbnRzU2l6ZUNoYW5nZWQo
KTsKKworICAgIC8vIElmIGF1dG9tYXRpYyB6b29taW5nIGlzIGRpc2FibGVkLCBwcmV2ZW50IHpv
b21pbmcgYmVsb3cuCisgICAgaWYgKCFtX3dlYlNldHRpbmdzLT5pc1pvb21Ub0ZpdE9uTG9hZCgp
KSB7CisgICAgICAgIGF0SW5pdGlhbFNjYWxlID0gZmFsc2U7CisKKyAgICAgICAgLy8gTm9ybWFs
bHksIGlmIHRoZSBjb250ZW50cyBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgbGF5b3V0IHdpZHRo
LAorICAgICAgICAvLyB3ZSB3b3VsZCB6b29tIGluLiBJZiB6b29tIGlzIGRpc2FibGVkLCB3ZSBu
ZWVkIHRvIGRvIHNvbWV0aGluZyBlbHNlLAorICAgICAgICAvLyBvciB0aGVyZSB3aWxsIGJlIGFy
dGlmYWN0cyBkdWUgdG8gbm9uLXJlbmRlcmVkIGFyZWFzIG91dHNpZGUgb2YgdGhlCisgICAgICAg
IC8vIGNvbnRlbnRzIHNpemUuIElmIHRoZXJlIGlzIGEgdmlydHVhbCB2aWV3cG9ydCwgd2UgYXJl
IG5vdCBhbGxvd2VkCisgICAgICAgIC8vIHRvIG1vZGlmeSB0aGUgZml4ZWQgbGF5b3V0IHNpemUs
IGhvd2V2ZXIuCisgICAgICAgIGlmICghaGFzVmlydHVhbFZpZXdwb3J0KCkgJiYgY29udGVudHNT
aXplKCkud2lkdGgoKSA8IG1fZGVmYXVsdExheW91dFNpemUud2lkdGgoKSkgeworICAgICAgICAg
ICAgbV9tYWluRnJhbWUtPnZpZXcoKS0+c2V0VXNlRml4ZWRMYXlvdXQodXNlRml4ZWRMYXlvdXQo
KSk7CisgICAgICAgICAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXRGaXhlZExheW91dFNpemUo
bV9kZWZhdWx0TGF5b3V0U2l6ZSk7CisgICAgICAgICAgICBuZWVkc0xheW91dCA9IHRydWU7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmVlZHNMYXlvdXQpCisgICAgICAgIHNldE5lZWRz
TGF5b3V0KCk7CisKKyAgICAvLyBOZWVkIHRvIHJlc3VtZSBzbyB0aGF0IHRoZSBiYWNraW5nc3Rv
cmUgd2lsbCBzdGFydCByZWNvcmRpbmcgdGhlIGludmFsaWRhdGVkCisgICAgLy8gcmVjdHMgZnJv
bSBiZWxvdy4KKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0
b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6Ok5vbmUpOworCisgICAgLy8gV2UgbWlnaHQgbmVlZCB0
byBsYXlvdXQgaGVyZSB0byBnZXQgYSBjb3JyZWN0IGNvbnRlbnRzU2l6ZSBzbyB0aGF0IHpvb21U
b0ZpdAorICAgIC8vIGlzIGNhbGN1bGF0ZWQgY29ycmVjdGx5LgorICAgIHJlcXVlc3RMYXlvdXRJ
Zk5lZWRlZCgpOworCisgICAgLy8gQXMgYSBzcGVjaWFsIGNhc2UgaWYgd2Ugd2VyZSB6b29tZWQg
dG8gdGhlIGluaXRpYWwgc2NhbGUgYXQgdGhlIGJlZ2lubmluZworICAgIC8vIG9mIHRoZSByb3Rh
dGlvbiB0aGVuIHByZXNlcnZlIHRoYXQgem9vbSBsZXZlbCBldmVuIHdoZW4gaXQgaXMgem9vbVRv
Rml0LgorICAgIGRvdWJsZSBzY2FsZSA9IGF0SW5pdGlhbFNjYWxlID8gaW5pdGlhbFNjYWxlKCkg
OiBjdXJyZW50U2NhbGUoKTsKKworICAgIC8vIERvIG91ciBvd24gY2xhbXBpbmcuCisgICAgc2Nh
bGUgPSBjbGFtcGVkU2NhbGUoc2NhbGUpOworCisgICAgaWYgKGhhc1BlbmRpbmdPcmllbnRhdGlv
bikgeworICAgICAgICAvLyBTZXQgdGhlIGZpeGVkIHJlcG9ydGVkIHNpemUgaGVyZSBzbyB0aGF0
IGlubmVyV2lkdGh8aW5uZXJIZWlnaHQgd29ya3MKKyAgICAgICAgLy8gd2l0aCB0aGlzIG5ldyBz
Y2FsZS4KKyAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggcm90YXRpb25NYXRyaXg7CisgICAg
ICAgIHJvdGF0aW9uTWF0cml4LnNjYWxlKHNjYWxlKTsKKyAgICAgICAgSW50UmVjdCB2aWV3cG9y
dFJlY3QgPSBJbnRSZWN0KEludFBvaW50Ojp6ZXJvKCksIHRyYW5zZm9ybWVkQWN0dWFsVmlzaWJs
ZVNpemUpOworICAgICAgICBJbnRSZWN0IGFjdHVhbFZpc2libGVSZWN0ID0gZW5jbG9zaW5nSW50
UmVjdChyb3RhdGlvbk1hdHJpeC5pbnZlcnNlKCkubWFwUmVjdChGbG9hdFJlY3Qodmlld3BvcnRS
ZWN0KSkpOworICAgICAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXRGaXhlZFJlcG9ydGVkU2l6
ZShhY3R1YWxWaXNpYmxlUmVjdC5zaXplKCkpOworICAgIH0KKworICAgIC8vIFdlJ3JlIGdvaW5n
IHRvIG5lZWQgdG8gc2VuZCBhIHJlc2l6ZSBldmVudCB0byBKYXZhU2NyaXB0IGJlY2F1c2UKKyAg
ICAvLyBpbm5lcldpZHRoIGFuZCBpbm5lckhlaWdodCBkZXBlbmQgb24gZml4ZWQgcmVwb3J0ZWQg
c2l6ZS4KKyAgICAvLyBUaGlzIGlzIGhvdyB3ZSBzdXBwb3J0IG1vYmlsZSBwYWdlcyB3aGVyZSBK
YXZhU2NyaXB0IHJlc2l6ZXMKKyAgICAvLyB0aGUgcGFnZSBpbiBvcmRlciB0byBnZXQgYXJvdW5k
IHRoZSBmaXhlZCBsYXlvdXQgc2l6ZSwgZS5nLgorICAgIC8vIGdvb2dsZSBtYXBzIHdoZW4gaXQg
ZGV0ZWN0cyBhIG1vYmlsZSB1c2VyIGFnZW50LgorICAgIGlmIChzaG91bGRTZW5kUmVzaXplRXZl
bnQoKSkKKyAgICAgICAgbV9tYWluRnJhbWUtPmV2ZW50SGFuZGxlcigpLT5zZW5kUmVzaXplRXZl
bnQoKTsKKworICAgIC8vIEFzIGEgc3BlY2lhbCBjYXNlIGlmIHdlIHdlcmUgYW5jaG9yZWQgdG8g
dGhlIHRvcCBsZWZ0IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcKKyAgICAvLyBvZiB0aGUgcm90
YXRpb24gdGhlbiBwcmVzZXJ2ZSB0aGF0IGFuY2hvci4KKyAgICBGbG9hdFBvaW50IGFuY2hvciA9
IGNlbnRlck9mVmlzaWJsZUNvbnRlbnRzUmVjdDsKKyAgICBpZiAoYXRUb3ApCisgICAgICAgIGFu
Y2hvci5zZXRZKDApOworICAgIGlmIChhdExlZnQpCisgICAgICAgIGFuY2hvci5zZXRYKDApOwor
CisgICAgLy8gVHJ5IGFuZCB6b29tIGhlcmUgd2l0aCBjbGFtcGluZyBvbi4KKyAgICBpZiAobV9i
YWNraW5nU3RvcmUtPmQtPnNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpIHsKKyAgICAg
ICAgYm9vbCBzdWNjZXNzID0gem9vbUFib3V0UG9pbnQoc2NhbGUsIGFuY2hvciwgZmFsc2UgLyog
ZW5mb3JjZVNjYWxlQ2xhbXBpbmcgKi8sIHRydWUgLyogZm9yY2VSZW5kZXJpbmcgKi8pOworICAg
ICAgICBpZiAoIXN1Y2Nlc3MgJiYgZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJsZSkKKyAgICAgICAg
ICAgIGVuc3VyZUNvbnRlbnRWaXNpYmxlKCFuZXdWaXNpYmxlUmVjdENvbnRhaW5zT2xkVmlzaWJs
ZVJlY3QpOworICAgIH0gZWxzZSBpZiAoIXNjaGVkdWxlWm9vbUFib3V0UG9pbnQoc2NhbGUsIGFu
Y2hvciwgZmFsc2UgLyogZW5mb3JjZVNjYWxlQ2xhbXBpbmcgKi8sIHRydWUgLyogZm9yY2VSZW5k
ZXJpbmcgKi8pKSB7CisgICAgICAgIC8vIFN1c3BlbmQgYWxsIHNjcmVlbiB1cGRhdGVzIHRvIHRo
ZSBiYWNraW5nc3RvcmUuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5zdXNwZW5kU2NyZWVu
QW5kQmFja2luZ1N0b3JlVXBkYXRlcygpOworCisgICAgICAgIC8vIElmIHRoZSB6b29tIGZhaWxl
ZCwgdGhlbiB3ZSBzaG91bGQgc3RpbGwgcHJlc2VydmUgdGhlIHNwZWNpYWwgY2FzZSBvZiBzY3Jv
bGwgcG9zaXRpb24uCisgICAgICAgIEludFBvaW50IHNjcm9sbFBvc2l0aW9uID0gdGhpcy0+c2Ny
b2xsUG9zaXRpb24oKTsKKyAgICAgICAgaWYgKGF0VG9wKQorICAgICAgICAgICAgc2Nyb2xsUG9z
aXRpb24uc2V0WSgwKTsKKyAgICAgICAgaWYgKGF0TGVmdCkKKyAgICAgICAgICAgIHNjcm9sbFBv
c2l0aW9uLnNldFgoMCk7CisgICAgICAgIHNldFNjcm9sbFBvc2l0aW9uKHNjcm9sbFBvc2l0aW9u
KTsKKworICAgICAgICAvLyBUaGVzZSBtaWdodCBoYXZlIGJlZW4gYWx0ZXJlZCBldmVuIGlmIHdl
IGRpZG4ndCB6b29tIHNvIG5vdGlmeSB0aGUgY2xpZW50LgorICAgICAgICBub3RpZnlUcmFuc2Zv
cm1lZENvbnRlbnRzU2l6ZUNoYW5nZWQoKTsKKyAgICAgICAgbm90aWZ5VHJhbnNmb3JtZWRTY3Jv
bGxDaGFuZ2VkKCk7CisKKyAgICAgICAgaWYgKCFuZWVkc0xheW91dCkgeworICAgICAgICAgICAg
Ly8gVGhlIHZpc2libGUgdGlsZXMgZm9yIHNjcm9sbCBtdXN0IGJlIHVwLXRvLWRhdGUgYmVmb3Jl
IHdlIGJsaXQgc2luY2Ugd2UgYXJlIG5vdCBwZXJmb3JtaW5nIGEgbGF5b3V0LgorICAgICAgICAg
ICAgbV9iYWNraW5nU3RvcmUtPmQtPnVwZGF0ZVRpbGVzRm9yU2Nyb2xsT3JOb3RSZW5kZXJlZFJl
Z2lvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuc3VyZUZvY3VzRWxlbWVudFZpc2li
bGUpCisgICAgICAgICAgICBlbnN1cmVDb250ZW50VmlzaWJsZSghbmV3VmlzaWJsZVJlY3RDb250
YWluc09sZFZpc2libGVSZWN0KTsKKworICAgICAgICBpZiAobmVlZHNMYXlvdXQpIHsKKyAgICAg
ICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXNldFRpbGVzKHRydWUpOworICAgICAgICAgICAg
bV9iYWNraW5nU3RvcmUtPmQtPnVwZGF0ZVRpbGVzKGZhbHNlIC8qIHVwZGF0ZVZpc2libGUgKi8s
IGZhbHNlIC8qIGltbWVkaWF0ZSAqLyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSBu
ZWVkIGxheW91dCB0aGVuIHJlbmRlciBhbmQgYmxpdCwgb3RoZXJ3aXNlIGp1c3QgYmxpdCBhcyBv
dXIgdmlld3BvcnQgaGFzIGNoYW5nZWQuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXN1
bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKG5lZWRzTGF5b3V0ID8gQmFja2luZ1N0b3Jl
OjpSZW5kZXJBbmRCbGl0IDogQmFja2luZ1N0b3JlOjpCbGl0KTsKKyAgICB9IGVsc2UgaWYgKGVu
c3VyZUZvY3VzRWxlbWVudFZpc2libGUpCisgICAgICAgIGVuc3VyZUNvbnRlbnRWaXNpYmxlKCFu
ZXdWaXNpYmxlUmVjdENvbnRhaW5zT2xkVmlzaWJsZVJlY3QpOworfQorCit2b2lkIFdlYlBhZ2U6
OnNldERlZmF1bHRMYXlvdXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBJbnRT
aXplIHNpemUod2lkdGgsIGhlaWdodCk7CisgICAgaWYgKHNpemUgPT0gZC0+bV9kZWZhdWx0TGF5
b3V0U2l6ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZC0+c2V0RGVmYXVsdExheW91dFNpemUo
c2l6ZSk7CisgICAgYm9vbCBuZWVkc0xheW91dCA9IGQtPnNldFZpZXdNb2RlKGQtPnZpZXdNb2Rl
KCkpOworICAgIGlmIChuZWVkc0xheW91dCkgeworICAgICAgICBkLT5zZXROZWVkc0xheW91dCgp
OworICAgICAgICBpZiAoIWQtPmlzTG9hZGluZygpKQorICAgICAgICAgICAgZC0+cmVxdWVzdExh
eW91dElmTmVlZGVkKCk7CisgICAgfQorfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXREZWZh
dWx0TGF5b3V0U2l6ZShjb25zdCBJbnRTaXplJiBzaXplKQoreworICAgIEludFNpemUgc2NyZWVu
U2l6ZSA9IFBsYXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjpzaXplKCk7CisgICAgQVNTRVJUKHNp
emUud2lkdGgoKSA8PSBzY3JlZW5TaXplLndpZHRoKCkgJiYgc2l6ZS5oZWlnaHQoKSA8PSBzY3Jl
ZW5TaXplLmhlaWdodCgpKTsKKyAgICBtX2RlZmF1bHRMYXlvdXRTaXplID0gc2l6ZS5leHBhbmRl
ZFRvKG1pbmltdW1MYXlvdXRTaXplKS5zaHJ1bmtUbyhzY3JlZW5TaXplKTsKK30KKworYm9vbCBX
ZWJQYWdlOjptb3VzZUV2ZW50KGNvbnN0IFBsYXRmb3JtOjpNb3VzZUV2ZW50JiBtb3VzZUV2ZW50
LCBib29sKiB3aGVlbERlbHRhQWNjZXB0ZWQpCit7CisgICAgaWYgKCFkLT5tX21haW5GcmFtZS0+
dmlldygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBQbHVnaW5WaWV3KiBwbHVnaW5W
aWV3ID0gZC0+bV9mdWxsU2NyZWVuUGx1Z2luVmlldy5nZXQoKTsKKyAgICBpZiAocGx1Z2luVmll
dykKKyAgICAgICAgcmV0dXJuIGQtPmRpc3BhdGNoTW91c2VFdmVudFRvRnVsbFNjcmVlblBsdWdp
bihwbHVnaW5WaWV3LCBtb3VzZUV2ZW50KTsKKworICAgIGlmIChtb3VzZUV2ZW50LnR5cGUoKSA9
PSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6TW91c2VBYm9ydGVkKSB7CisgICAgICAgIGQtPm1fbWFp
bkZyYW1lLT5ldmVudEhhbmRsZXIoKS0+c2V0TW91c2VQcmVzc2VkKGZhbHNlKTsKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGQtPm1fcGx1Z2luTWF5T3Blbk5ld1RhYiA9IHRy
dWU7CisKKyAgICBkLT5tX2xhc3RVc2VyRXZlbnRUaW1lc3RhbXAgPSBjdXJyZW50VGltZSgpOwor
ICAgIGludCBjbGlja0NvdW50ID0gKGQtPm1fc2VsZWN0aW9uSGFuZGxlci0+aXNTZWxlY3Rpb25B
Y3RpdmUoKSB8fCBtb3VzZUV2ZW50LnR5cGUoKSAhPSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6TW91
c2VNb3ZlKSA/IDEgOiAwOworCisgICAgLy8gU2V0IHRoZSBidXR0b24gdHlwZS4KKyAgICBNb3Vz
ZUJ1dHRvbiBidXR0b25UeXBlID0gTm9CdXR0b247CisgICAgaWYgKG1vdXNlRXZlbnQuaXNMZWZ0
QnV0dG9uKCkpCisgICAgICAgIGJ1dHRvblR5cGUgPSBMZWZ0QnV0dG9uOworICAgIGVsc2UgaWYg
KG1vdXNlRXZlbnQuaXNSaWdodEJ1dHRvbigpKQorICAgICAgICBidXR0b25UeXBlID0gUmlnaHRC
dXR0b247CisgICAgZWxzZSBpZiAobW91c2VFdmVudC5pc01pZGRsZUJ1dHRvbigpKQorICAgICAg
ICBidXR0b25UeXBlID0gTWlkZGxlQnV0dG9uOworCisgICAgLy8gQ3JlYXRlIG91ciBldmVudC4K
KyAgICBQbGF0Zm9ybU1vdXNlRXZlbnQgcGxhdGZvcm1Nb3VzZUV2ZW50KGQtPm1hcEZyb21UcmFu
c2Zvcm1lZChtb3VzZUV2ZW50LnBvc2l0aW9uKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZC0+bWFwRnJvbVRyYW5zZm9ybWVkKG1vdXNlRXZlbnQuc2NyZWVu
UG9zaXRpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0
b1dlYkNvcmVNb3VzZUV2ZW50VHlwZShtb3VzZUV2ZW50LnR5cGUoKSksIGNsaWNrQ291bnQsIGJ1
dHRvblR5cGUsIFBvaW50aW5nRGV2aWNlKTsKKyAgICBkLT5tX2xhc3RNb3VzZUV2ZW50ID0gcGxh
dGZvcm1Nb3VzZUV2ZW50OworICAgIGJvb2wgc3VjY2VzcyA9IGQtPmhhbmRsZU1vdXNlRXZlbnQo
cGxhdGZvcm1Nb3VzZUV2ZW50KTsKKworICAgIGlmIChtb3VzZUV2ZW50LndoZWVsVGlja3MoKSkg
eworICAgICAgICBQbGF0Zm9ybVdoZWVsRXZlbnQgd2hlZWxFdmVudChkLT5tYXBGcm9tVHJhbnNm
b3JtZWQobW91c2VFdmVudC5wb3NpdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZC0+bWFwRnJvbVRyYW5zZm9ybWVkKG1vdXNlRXZlbnQuc2NyZWVuUG9zaXRp
b24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC1tb3VzZUV2
ZW50LndoZWVsRGVsdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
MCwgLW1vdXNlRXZlbnQud2hlZWxUaWNrcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBTY3JvbGxCeVBpeGVsV2hlZWxFdmVudCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBp
ZiAod2hlZWxEZWx0YUFjY2VwdGVkKQorICAgICAgICAgICAgKndoZWVsRGVsdGFBY2NlcHRlZCA9
IGQtPmhhbmRsZVdoZWVsRXZlbnQod2hlZWxFdmVudCk7CisgICAgfSBlbHNlIGlmICh3aGVlbERl
bHRhQWNjZXB0ZWQpCisgICAgICAgICp3aGVlbERlbHRhQWNjZXB0ZWQgPSBmYWxzZTsKKworICAg
IHJldHVybiBzdWNjZXNzOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpkaXNwYXRjaE1vdXNl
RXZlbnRUb0Z1bGxTY3JlZW5QbHVnaW4oUGx1Z2luVmlldyogcGx1Z2luLCBjb25zdCBQbGF0Zm9y
bTo6TW91c2VFdmVudCYgZXZlbnQpCit7CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIE5QTW91
c2VFdmVudCBtb3VzZUV2ZW50OworCisgICAgbW91c2VFdmVudC54ID0gZXZlbnQuc2NyZWVuUG9z
aXRpb24oKS54KCk7CisgICAgbW91c2VFdmVudC55ID0gZXZlbnQuc2NyZWVuUG9zaXRpb24oKS55
KCk7CisKKyAgICBzd2l0Y2ggKGV2ZW50LnR5cGUoKSkgeworICAgIGNhc2UgUGxhdGZvcm06Ok1v
dXNlRXZlbnQ6Ok1vdXNlQnV0dG9uRG93bjoKKyAgICAgICAgbW91c2VFdmVudC50eXBlID0gTU9V
U0VfQlVUVE9OX0RPV047CisgICAgICAgIG1fcGx1Z2luTW91c2VCdXR0b25QcmVzc2VkID0gdHJ1
ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6TW91c2VC
dXR0b25VcDoKKyAgICAgICAgbW91c2VFdmVudC50eXBlID0gTU9VU0VfQlVUVE9OX1VQOworICAg
ICAgICBtX3BsdWdpbk1vdXNlQnV0dG9uUHJlc3NlZCA9IGZhbHNlOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIFBsYXRmb3JtOjpNb3VzZUV2ZW50OjpNb3VzZU1vdmU6CisgICAgICAgIG1vdXNl
RXZlbnQudHlwZSA9IE1PVVNFX01PVElPTjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1vdXNlRXZlbnQuZmxhZ3MgPSAw
OworICAgIG1vdXNlRXZlbnQuYnV0dG9uID0gbV9wbHVnaW5Nb3VzZUJ1dHRvblByZXNzZWQ7CisK
KyAgICBucEV2ZW50LnR5cGUgPSBOUF9Nb3VzZUV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9ICZt
b3VzZUV2ZW50OworCisgICAgcmV0dXJuIHBsdWdpbi0+ZGlzcGF0Y2hGdWxsU2NyZWVuTlBFdmVu
dChucEV2ZW50KTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6aGFuZGxlTW91c2VFdmVudChQ
bGF0Zm9ybU1vdXNlRXZlbnQmIG1vdXNlRXZlbnQpCit7CisgICAgRXZlbnRIYW5kbGVyKiBldmVu
dEhhbmRsZXIgPSBtX21haW5GcmFtZS0+ZXZlbnRIYW5kbGVyKCk7CisKKyAgICBpZiAobW91c2VF
dmVudC5ldmVudFR5cGUoKSA9PSBNb3VzZUV2ZW50TW92ZWQpCisgICAgICAgIHJldHVybiBldmVu
dEhhbmRsZXItPm1vdXNlTW92ZWQobW91c2VFdmVudCk7CisKKyAgICBpZiAobW91c2VFdmVudC5l
dmVudFR5cGUoKSA9PSBNb3VzZUV2ZW50U2Nyb2xsKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKwor
ICAgIE5vZGUqIG5vZGUgPSAwOworICAgIGlmIChtb3VzZUV2ZW50LmlucHV0TWV0aG9kKCkgPT0g
VG91Y2hTY3JlZW4pIHsKKyAgICAgICAgY29uc3QgRmF0RmluZ2Vyc1Jlc3VsdCBsYXN0RmF0Rmlu
Z2Vyc1Jlc3VsdCA9IG1fdG91Y2hFdmVudEhhbmRsZXItPmxhc3RGYXRGaW5nZXJzUmVzdWx0KCk7
CisKKyAgICAgICAgLy8gRmF0IGZpbmdlcnMgY2FuIGRlYWwgd2l0aCBzaGFkb3cgY29udGVudC4K
KyAgICAgICAgbm9kZSA9IGxhc3RGYXRGaW5nZXJzUmVzdWx0Lm5vZGUoU2hhZG93Q29udGVudE5v
dEFsbG93ZWQpOworICAgIH0KKworICAgIGlmICghbm9kZSkgeworICAgICAgICBIaXRUZXN0UmVz
dWx0IHJlc3VsdCA9IGV2ZW50SGFuZGxlci0+aGl0VGVzdFJlc3VsdEF0UG9pbnQobWFwRnJvbVZp
ZXdwb3J0VG9Db250ZW50cyhtb3VzZUV2ZW50LnBvcygpKSwgZmFsc2UgLyphbGxvd1NoYWRvd0Nv
bnRlbnQqLyk7CisgICAgICAgIG5vZGUgPSByZXN1bHQuaW5uZXJOb2RlKCk7CisgICAgfQorCisg
ICAgaWYgKG1vdXNlRXZlbnQuZXZlbnRUeXBlKCkgPT0gTW91c2VFdmVudFByZXNzZWQpIHsKKyAg
ICAgICAgaWYgKG1faW5wdXRIYW5kbGVyLT53aWxsT3BlblBvcHVwRm9yTm9kZShub2RlKSkgewor
ICAgICAgICAgICAgLy8gRG8gbm90IGFsbG93IGFueSBodW1hbiBnZW5lcmF0ZWQgbW91c2Ugb3Ig
a2V5Ym9hcmQgZXZlbnRzIHRvIHNlbGVjdCA8b3B0aW9uPnMgaW4gdGhlIGxpc3QgYm94CisgICAg
ICAgICAgICAvLyBiZWNhdXNlIHdlIHVzZSBhIHBvcCB1cCBkaWFsb2cgdG8gaGFuZGxlIHRoZSBh
Y3R1YWwgc2VsZWN0aW9ucy4gVGhpcyBwcmV2ZW50cyBvcHRpb25zIGZyb20KKyAgICAgICAgICAg
IC8vIGJlaW5nIHNlbGVjdGVkIHByaW9yIHRvIGRpc3BsYXlpbmcgdGhlIHBvcCB1cCBkaWFsb2cu
IFRoZSBjb250ZW50cyBvZiB0aGUgbGlzdGJveCBhcmUgZm9yCisgICAgICAgICAgICAvLyBkaXNw
bGF5IG9ubHkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gRklYTUU6IFdlIGV4cGxp
Y2l0bHkgZG8gbm90IGZvcndhcmQgdGhpcyBldmVudCB0byBXZWJDb3JlIHNvIGFzIHRvIHByZXNl
cnZlIHN5bW1ldHJ5IHdpdGgKKyAgICAgICAgICAgIC8vIHRoZSBNb3VzZUV2ZW50UmVsZWFzZWQg
aGFuZGxpbmcgKGJlbG93KS4gVGhpcyBoYXMgdGhlIHNpZGUtZWZmZWN0IHRoYXQgbW91c2Vkb3du
IGV2ZW50cworICAgICAgICAgICAgLy8gYXJlIG5vdCBmaXJlZCBmb3IgaHVtYW4gZ2VuZXJhdGVk
IG1vdXNlIHByZXNzIGV2ZW50cy4gU2VlIFJJTSBCdWcgIzE1NzkuCisKKyAgICAgICAgICAgIC8v
IFdlIGRvIGZvY3VzIDxzZWxlY3Q+LzxvcHRpb24+IG9uIG1vdXNlIGRvd24gc28gdGhhdCBhIEZv
Y3VzIGV2ZW50IGlzIGZpcmVkIGFuZCBoYXZlIHRoZQorICAgICAgICAgICAgLy8gZWxlbWVudCBw
YWludGVkIGluIGl0cyBmb2N1cyBzdGF0ZSBvbiByZXBhaW50LgorICAgICAgICAgICAgQVNTRVJU
KG5vZGUtPmlzRWxlbWVudE5vZGUoKSk7CisgICAgICAgICAgICBpZiAobm9kZS0+aXNFbGVtZW50
Tm9kZSgpKSB7CisgICAgICAgICAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IHN0YXRpY19jYXN0
PEVsZW1lbnQqPihub2RlKTsKKyAgICAgICAgICAgICAgICBlbGVtZW50LT5mb2N1cygpOworICAg
ICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGV2ZW50SGFuZGxlci0+aGFu
ZGxlTW91c2VQcmVzc0V2ZW50KG1vdXNlRXZlbnQpOworICAgIH0gZWxzZSBpZiAobW91c2VFdmVu
dC5ldmVudFR5cGUoKSA9PSBNb3VzZUV2ZW50UmVsZWFzZWQpIHsKKyAgICAgICAgLy8gRklYTUU6
IEZvciA8c2VsZWN0PiBhbmQgPG9wdGlvbnM+IGVsZW1lbnRzLCB3ZSBleHBsaWNpdGx5IGRvIG5v
dCBmb3J3YXJkIHRoaXMgZXZlbnQgdG8gV2ViQ29yZSBzbworICAgICAgICAvLyBhcyB0byBwcmVz
ZXJ2ZSBzeW1tZXRyeSB3aXRoIHRoZSBNb3VzZUV2ZW50UHJlc3NlZCBoYW5kbGluZyAoYWJvdmUp
LiBUaGlzIGhhcyB0aGUgc2lkZS1lZmZlY3QgdGhhdAorICAgICAgICAvLyBtb3VzZXVwIGV2ZW50
cyBhcmUgbm90IGZpcmVkIG9uIHN1Y2ggZWxlbWVudHMgZm9yIGh1bWFuIGdlbmVyYXRlZCBtb3Vz
ZSByZWxlYXNlIGV2ZW50cy4gU2VlIFJJTSBCdWcgIzE1NzkuCisgICAgICAgIGlmICghbV9pbnB1
dEhhbmRsZXItPmRpZE5vZGVPcGVuUG9wdXAobm9kZSkpCisgICAgICAgICAgICBldmVudEhhbmRs
ZXItPmhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KG1vdXNlRXZlbnQpOworICAgIH0KKworICAgIHJl
dHVybiB0cnVlOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpoYW5kbGVXaGVlbEV2ZW50KFBs
YXRmb3JtV2hlZWxFdmVudCYgd2hlZWxFdmVudCkKK3sKKyAgICBFdmVudEhhbmRsZXIqIGV2ZW50
SGFuZGxlciA9IG1fbWFpbkZyYW1lLT5ldmVudEhhbmRsZXIoKTsKKworICAgIHJldHVybiBldmVu
dEhhbmRsZXItPmhhbmRsZVdoZWVsRXZlbnQod2hlZWxFdmVudCk7Cit9CisKK2Jvb2wgV2ViUGFn
ZTo6dG91Y2hFdmVudChjb25zdCBQbGF0Zm9ybTo6VG91Y2hFdmVudCYgZXZlbnQpCit7CisjaWYg
REVCVUdfVE9VQ0hfRVZFTlRTCisgICAgc3dpdGNoIChldmVudC5tX3R5cGUpIHsKKyAgICBjYXNl
IFBsYXRmb3JtOjpUb3VjaEV2ZW50OjpUb3VjaEVuZDoKKyAgICAgICAgUGxhdGZvcm06OmxvZyhQ
bGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIldlYlBhZ2U6OnRvdWNoRXZlbnQgVG91Y2ggRW5k
Iik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNo
U3RhcnQ6CisgICAgICAgIFBsYXRmb3JtOjpsb2coUGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWws
ICJXZWJQYWdlOjp0b3VjaEV2ZW50IFRvdWNoIFN0YXJ0Iik7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgUGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNoTW92ZToKKyAgICAgICAgUGxhdGZvcm06
OmxvZyhQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIldlYlBhZ2U6OnRvdWNoRXZlbnQgVG91
Y2ggTW92ZSIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBsYXRmb3JtOjpUb3VjaEV2ZW50
OjpUb3VjaENhbmNlbDoKKyAgICAgICAgUGxhdGZvcm06OmxvZyhQbGF0Zm9ybTo6TG9nTGV2ZWxD
cml0aWNhbCwgIldlYlBhZ2U6OnRvdWNoQ2FuY2VsIFRvdWNoIENhbmNlbCIpOworICAgICAgICBi
cmVhazsKKyAgICB9CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZXZlbnQubV9wb2lu
dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChldmVudC5tX3BvaW50c1tpXS5tX3N0
YXRlKSB7CisgICAgICAgIGNhc2UgUGxhdGZvcm06OlRvdWNoUG9pbnQ6OlRvdWNoUHJlc3NlZDoK
KyAgICAgICAgICAgIFBsYXRmb3JtOjpsb2coUGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJX
ZWJQYWdlOjp0b3VjaEV2ZW50ICVkIFRvdWNoIFByZXNzZWQgKCVkLCAlZCkiLCBldmVudC5tX3Bv
aW50c1tpXS5tX2lkLCBldmVudC5tX3BvaW50c1tpXS5tX3Bvcy54KCksIGV2ZW50Lm1fcG9pbnRz
W2ldLm1fcG9zLnkoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0Zm9y
bTo6VG91Y2hQb2ludDo6VG91Y2hSZWxlYXNlZDoKKyAgICAgICAgICAgIFBsYXRmb3JtOjpsb2co
UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJXZWJQYWdlOjp0b3VjaEV2ZW50ICVkIFRvdWNo
IFJlbGVhc2VkICglZCwgJWQpIiwgZXZlbnQubV9wb2ludHNbaV0ubV9pZCwgZXZlbnQubV9wb2lu
dHNbaV0ubV9wb3MueCgpLCBldmVudC5tX3BvaW50c1tpXS5tX3Bvcy55KCkpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm06OlRvdWNoUG9pbnQ6OlRvdWNoTW92ZWQ6
CisgICAgICAgICAgICBQbGF0Zm9ybTo6bG9nKFBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAi
V2ViUGFnZTo6dG91Y2hFdmVudCAlZCBUb3VjaCBNb3ZlZCAoJWQsICVkKSIsIGV2ZW50Lm1fcG9p
bnRzW2ldLm1faWQsIGV2ZW50Lm1fcG9pbnRzW2ldLm1fcG9zLngoKSwgZXZlbnQubV9wb2ludHNb
aV0ubV9wb3MueSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBsYXRmb3Jt
OjpUb3VjaFBvaW50OjpUb3VjaFN0YXRpb25hcnk6CisgICAgICAgICAgICBQbGF0Zm9ybTo6bG9n
KFBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiV2ViUGFnZTo6dG91Y2hFdmVudCAlZCBUb3Vj
aCBTdGF0aW9uYXJ5ICglZCwgJWQpIiwgZXZlbnQubV9wb2ludHNbaV0ubV9pZCwgZXZlbnQubV9w
b2ludHNbaV0ubV9wb3MueCgpLCBldmVudC5tX3BvaW50c1tpXS5tX3Bvcy55KCkpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lmIEVOQUJMRShUT1VD
SF9FVkVOVFMpCisgICAgUGx1Z2luVmlldyogcGx1Z2luVmlldyA9IGQtPm1fZnVsbFNjcmVlblBs
dWdpblZpZXcuZ2V0KCk7CisgICAgaWYgKHBsdWdpblZpZXcpCisgICAgICAgIHJldHVybiBkLT5k
aXNwYXRjaFRvdWNoRXZlbnRUb0Z1bGxTY3JlZW5QbHVnaW4ocGx1Z2luVmlldywgZXZlbnQpOwor
CisgICAgaWYgKCFkLT5tX21haW5GcmFtZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
UGxhdGZvcm06OlRvdWNoRXZlbnQgdEV2ZW50ID0gZXZlbnQ7CisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IGV2ZW50Lm1fcG9pbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHRFdmVudC5t
X3BvaW50c1tpXS5tX3BvcyA9IGQtPm1hcEZyb21UcmFuc2Zvcm1lZCh0RXZlbnQubV9wb2ludHNb
aV0ubV9wb3MpOworICAgICAgICB0RXZlbnQubV9wb2ludHNbaV0ubV9zY3JlZW5Qb3MgPSBkLT5t
YXBGcm9tVHJhbnNmb3JtZWQodEV2ZW50Lm1fcG9pbnRzW2ldLm1fc2NyZWVuUG9zKTsKKyAgICB9
CisKKyAgICBQbGF0Zm9ybTo6R2VzdHVyZSB0YXBHZXN0dXJlOworICAgIGlmIChldmVudC5oYXNH
ZXN0dXJlKFBsYXRmb3JtOjpHZXN0dXJlOjpTaW5nbGVUYXApKQorICAgICAgICBkLT5tX3BsdWdp
bk1heU9wZW5OZXdUYWIgPSB0cnVlOworICAgIGVsc2UgaWYgKHRFdmVudC5tX3R5cGUgPT0gUGxh
dGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNoU3RhcnQgfHwgdEV2ZW50Lm1fdHlwZSA9PSBQbGF0Zm9y
bTo6VG91Y2hFdmVudDo6VG91Y2hDYW5jZWwpCisgICAgICAgIGQtPm1fcGx1Z2luTWF5T3Blbk5l
d1RhYiA9IGZhbHNlOworCisgICAgYm9vbCBoYW5kbGVkID0gZmFsc2U7CisKKyAgICBpZiAoZC0+
bV9uZWVkVG91Y2hFdmVudHMgJiYgIWV2ZW50Lmhhc0dlc3R1cmUoUGxhdGZvcm06Okdlc3R1cmU6
OkluamVjdGVkKSkKKyAgICAgICAgaGFuZGxlZCA9IGQtPm1fbWFpbkZyYW1lLT5ldmVudEhhbmRs
ZXIoKS0+aGFuZGxlVG91Y2hFdmVudChQbGF0Zm9ybVRvdWNoRXZlbnQoJnRFdmVudCkpOworCisg
ICAgLy8gVW5wcmVzcyBtb3VzZSBpZiB0b3VjaCBlbmQgaXMgY29uc3VtZWQgYnkgYSBKYXZhU2Ny
aXB0IHRvdWNoIGhhbmRsZXIsIG90aGVyd2lzZSB0aGUgbW91c2Ugc3RhdGUgd2lsbCByZW1haW4g
cHJlc3NlZAorICAgIC8vIHdoaWNoIGNvdWxkIGVpdGhlciBtZXNzIHVwIHRoZSBpbnRlcm5hbCBt
b3VzZSBzdGF0ZSBvciBzdGFydCB0ZXh0IHNlbGVjdGlvbiBvbiB0aGUgbmV4dCBtb3VzZSBtb3Zl
L2Rvd24uCisgICAgaWYgKHRFdmVudC5tX3R5cGUgPT0gUGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRv
dWNoRW5kICYmIGhhbmRsZWQgJiYgZC0+bV9tYWluRnJhbWUtPmV2ZW50SGFuZGxlcigpLT5tb3Vz
ZVByZXNzZWQoKSkKKyAgICAgICAgZC0+bV90b3VjaEV2ZW50SGFuZGxlci0+dG91Y2hFdmVudENh
bmNlbCgpOworCisgICAgaWYgKGQtPm1fcHJldmVudERlZmF1bHRPblRvdWNoU3RhcnQpIHsKKyAg
ICAgICAgaWYgKHRFdmVudC5tX3R5cGUgPT0gUGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNoRW5k
IHx8IHRFdmVudC5tX3R5cGUgPT0gUGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNoQ2FuY2VsKQor
ICAgICAgICAgICAgZC0+bV9wcmV2ZW50RGVmYXVsdE9uVG91Y2hTdGFydCA9IGZhbHNlOworICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoaGFuZGxlZCkgeworICAgICAgICBp
ZiAodEV2ZW50Lm1fdHlwZSA9PSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hTdGFydCkKKyAg
ICAgICAgICAgIGQtPm1fcHJldmVudERlZmF1bHRPblRvdWNoU3RhcnQgPSB0cnVlOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoZXZlbnQuaGFzR2VzdHVyZShQbGF0Zm9y
bTo6R2VzdHVyZTo6VG91Y2hIb2xkKSkKKyAgICAgICAgZC0+bV90b3VjaEV2ZW50SGFuZGxlci0+
dG91Y2hIb2xkRXZlbnQoKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lk
IFdlYlBhZ2U6OnNldFNjcm9sbE9yaWdpblBvaW50KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYg
cG9pbnQpCit7CisgICAgUGxhdGZvcm06OkludFBvaW50IHVudHJhbnNmb3JtZWRQb2ludCA9IGQt
Pm1hcEZyb21UcmFuc2Zvcm1lZChwb2ludCk7CisgICAgZC0+c2V0U2Nyb2xsT3JpZ2luUG9pbnQo
dW50cmFuc2Zvcm1lZFBvaW50KTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0U2Nyb2xs
T3JpZ2luUG9pbnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBwb2ludCkKK3sKKyAgICBtX2lu
UmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2RlID0gMDsKKworICAgIGlmICghbV9oYXNJblJlZ2lvblNj
cm9sbGFibGVBcmVhcykKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9jbGllbnQtPm5vdGlmeUlu
UmVnaW9uU2Nyb2xsaW5nU3RhcnRpbmdQb2ludENoYW5nZWQoaW5SZWdpb25TY3JvbGxhYmxlQXJl
YXNGb3JQb2ludChwb2ludCkpOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpkaXNwYXRjaFRv
dWNoRXZlbnRUb0Z1bGxTY3JlZW5QbHVnaW4oUGx1Z2luVmlldyogcGx1Z2luLCBjb25zdCBQbGF0
Zm9ybTo6VG91Y2hFdmVudCYgZXZlbnQpCit7CisgICAgTlBUb3VjaEV2ZW50IG5wVG91Y2hFdmVu
dDsKKworICAgIGlmIChldmVudC5oYXNHZXN0dXJlKFBsYXRmb3JtOjpHZXN0dXJlOjpEb3VibGVU
YXApKQorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX0RPVUJMRVRBUDsK
KyAgICBlbHNlIGlmIChldmVudC5oYXNHZXN0dXJlKFBsYXRmb3JtOjpHZXN0dXJlOjpUb3VjaEhv
bGQpKQorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX1RPVUNISE9MRDsK
KyAgICBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChldmVudC5tX3R5cGUpIHsKKyAgICAgICAgY2Fz
ZSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hTdGFydDoKKyAgICAgICAgICAgIG5wVG91Y2hF
dmVudC50eXBlID0gVE9VQ0hfRVZFTlRfU1RBUlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hFbmQ6CisgICAgICAgICAgICBucFRv
dWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX0VORDsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIFBsYXRmb3JtOjpUb3VjaEV2ZW50OjpUb3VjaE1vdmU6CisgICAgICAgICAgICBu
cFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX01PVkU7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hDYW5jZWw6CisgICAgICAg
ICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX0NBTkNFTDsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgfQorCisgICAgbnBUb3VjaEV2ZW50LnBvaW50cyA9IDA7CisgICAgbnBUb3Vj
aEV2ZW50LnNpemUgPSBldmVudC5tX3BvaW50cy5zaXplKCk7CisgICAgaWYgKG5wVG91Y2hFdmVu
dC5zaXplKSB7CisgICAgICAgIG5wVG91Y2hFdmVudC5wb2ludHMgPSBuZXcgTlBUb3VjaFBvaW50
W25wVG91Y2hFdmVudC5zaXplXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBucFRvdWNo
RXZlbnQuc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLnRv
dWNoSWQgPSBldmVudC5tX3BvaW50c1tpXS5tX2lkOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50
LnBvaW50c1tpXS5jbGllbnRYID0gZXZlbnQubV9wb2ludHNbaV0ubV9zY3JlZW5Qb3MueCgpOwor
ICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5jbGllbnRZID0gZXZlbnQubV9wb2lu
dHNbaV0ubV9zY3JlZW5Qb3MueSgpOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tp
XS5zY3JlZW5YID0gZXZlbnQubV9wb2ludHNbaV0ubV9zY3JlZW5Qb3MueCgpOworICAgICAgICAg
ICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5zY3JlZW5ZID0gZXZlbnQubV9wb2ludHNbaV0ubV9z
Y3JlZW5Qb3MueSgpOworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5wYWdlWCA9
IGV2ZW50Lm1fcG9pbnRzW2ldLm1fcG9zLngoKTsKKyAgICAgICAgICAgIG5wVG91Y2hFdmVudC5w
b2ludHNbaV0ucGFnZVkgPSBldmVudC5tX3BvaW50c1tpXS5tX3Bvcy55KCk7CisgICAgICAgIH0K
KyAgICB9CisKKyAgICBOUEV2ZW50IG5wRXZlbnQ7CisgICAgbnBFdmVudC50eXBlID0gTlBfVG91
Y2hFdmVudDsKKyAgICBucEV2ZW50LmRhdGEgPSAmbnBUb3VjaEV2ZW50OworCisgICAgYm9vbCBo
YW5kbGVkID0gcGx1Z2luLT5kaXNwYXRjaEZ1bGxTY3JlZW5OUEV2ZW50KG5wRXZlbnQpOworCisg
ICAgaWYgKG5wVG91Y2hFdmVudC50eXBlID09IFRPVUNIX0VWRU5UX0RPVUJMRVRBUCAmJiAhaGFu
ZGxlZCkgeworICAgICAgICAvLyBTZW5kIFRvdWNoIFVwIGlmIGRvdWJsZSB0YXAgbm90IGNvbnN1
bWVkLgorICAgICAgICBucFRvdWNoRXZlbnQudHlwZSA9IFRPVUNIX0VWRU5UX0VORDsKKyAgICAg
ICAgbnBFdmVudC5kYXRhID0gJm5wVG91Y2hFdmVudDsKKyAgICAgICAgaGFuZGxlZCA9IHBsdWdp
bi0+ZGlzcGF0Y2hGdWxsU2NyZWVuTlBFdmVudChucEV2ZW50KTsKKyAgICB9CisgICAgZGVsZXRl
W10gbnBUb3VjaEV2ZW50LnBvaW50czsKKyAgICByZXR1cm4gaGFuZGxlZDsKK30KKworYm9vbCBX
ZWJQYWdlOjp0b3VjaFBvaW50QXNNb3VzZUV2ZW50KGNvbnN0IFBsYXRmb3JtOjpUb3VjaFBvaW50
JiBwb2ludCkKK3sKKyAgICBQbHVnaW5WaWV3KiBwbHVnaW5WaWV3ID0gZC0+bV9mdWxsU2NyZWVu
UGx1Z2luVmlldy5nZXQoKTsKKyAgICBpZiAocGx1Z2luVmlldykKKyAgICAgICAgcmV0dXJuIGQt
PmRpc3BhdGNoVG91Y2hQb2ludEFzTW91c2VFdmVudFRvRnVsbFNjcmVlblBsdWdpbihwbHVnaW5W
aWV3LCBwb2ludCk7CisKKyAgICBkLT5tX2xhc3RVc2VyRXZlbnRUaW1lc3RhbXAgPSBjdXJyZW50
VGltZSgpOworCisgICAgUGxhdGZvcm06OlRvdWNoUG9pbnQgdFBvaW50ID0gcG9pbnQ7CisgICAg
dFBvaW50Lm1fcG9zID0gZC0+bWFwRnJvbVRyYW5zZm9ybWVkKHRQb2ludC5tX3Bvcyk7CisgICAg
dFBvaW50Lm1fc2NyZWVuUG9zID0gZC0+bWFwRnJvbVRyYW5zZm9ybWVkKHRQb2ludC5tX3NjcmVl
blBvcyk7CisKKyAgICByZXR1cm4gZC0+bV90b3VjaEV2ZW50SGFuZGxlci0+aGFuZGxlVG91Y2hQ
b2ludCh0UG9pbnQpOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpkaXNwYXRjaFRvdWNoUG9p
bnRBc01vdXNlRXZlbnRUb0Z1bGxTY3JlZW5QbHVnaW4oUGx1Z2luVmlldyogcGx1Z2luVmlldywg
Y29uc3QgUGxhdGZvcm06OlRvdWNoUG9pbnQmIHBvaW50KQoreworICAgIE5QRXZlbnQgbnBFdmVu
dDsKKyAgICBOUE1vdXNlRXZlbnQgbW91c2U7CisKKyAgICBzd2l0Y2ggKHBvaW50Lm1fc3RhdGUp
IHsKKyAgICBjYXNlIFBsYXRmb3JtOjpUb3VjaFBvaW50OjpUb3VjaFByZXNzZWQ6CisgICAgICAg
IG1vdXNlLnR5cGUgPSBNT1VTRV9CVVRUT05fRE9XTjsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBQbGF0Zm9ybTo6VG91Y2hQb2ludDo6VG91Y2hSZWxlYXNlZDoKKyAgICAgICAgbW91c2UudHlw
ZSA9IE1PVVNFX0JVVFRPTl9VUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQbGF0Zm9ybTo6
VG91Y2hQb2ludDo6VG91Y2hNb3ZlZDoKKyAgICAgICAgbW91c2UudHlwZSA9IE1PVVNFX01PVElP
TjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hQb2ludDo6VG91Y2hT
dGF0aW9uYXJ5OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbW91c2UueCA9
IHBvaW50Lm1fc2NyZWVuUG9zLngoKTsKKyAgICBtb3VzZS55ID0gcG9pbnQubV9zY3JlZW5Qb3Mu
eSgpOworICAgIG1vdXNlLmJ1dHRvbiA9IG1vdXNlLnR5cGUgIT0gTU9VU0VfQlVUVE9OX1VQOwor
ICAgIG1vdXNlLmZsYWdzID0gMDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9Nb3VzZUV2ZW50Owor
ICAgIG5wRXZlbnQuZGF0YSA9ICZtb3VzZTsKKworICAgIHJldHVybiBwbHVnaW5WaWV3LT5kaXNw
YXRjaEZ1bGxTY3JlZW5OUEV2ZW50KG5wRXZlbnQpOworfQorCit2b2lkIFdlYlBhZ2U6OnRvdWNo
RXZlbnRDYW5jZWwoKQoreworICAgIGQtPm1fcGx1Z2luTWF5T3Blbk5ld1RhYiA9IGZhbHNlOwor
ICAgIGQtPm1fdG91Y2hFdmVudEhhbmRsZXItPnRvdWNoRXZlbnRDYW5jZWwoKTsKK30KKwordm9p
ZCBXZWJQYWdlOjp0b3VjaEV2ZW50Q2FuY2VsQW5kQ2xlYXJGb2N1c2VkTm9kZSgpCit7CisgICAg
ZC0+bV90b3VjaEV2ZW50SGFuZGxlci0+dG91Y2hFdmVudENhbmNlbEFuZENsZWFyRm9jdXNlZE5v
ZGUoKTsKK30KKworRnJhbWUqIFdlYlBhZ2VQcml2YXRlOjpmb2N1c2VkT3JNYWluRnJhbWUoKSBj
b25zdAoreworICAgIHJldHVybiBtX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JN
YWluRnJhbWUoKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6Y2xlYXJGb2N1c05vZGUoKQor
eworICAgIEZyYW1lKiBmcmFtZSA9IGZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIGlmICghZnJh
bWUpCisgICAgICAgIHJldHVybjsKKyAgICBBU1NFUlQoZnJhbWUtPmRvY3VtZW50KCkpOworCisg
ICAgaWYgKGZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpKQorICAgICAgICBmcmFtZS0+
cGFnZSgpLT5mb2N1c0NvbnRyb2xsZXIoKS0+c2V0Rm9jdXNlZE5vZGUoMCwgZnJhbWUpOworfQor
Citib29sIFdlYlBhZ2VQcml2YXRlOjpzY3JvbGxOb2RlUmVjdXJzaXZlbHkoTm9kZSogbm9kZSwg
Y29uc3QgSW50U2l6ZSYgZGVsdGEpCit7CisgICAgaWYgKGRlbHRhLmlzWmVybygpKQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7CisgICAgaWYg
KCFyZW5kZXJlcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgRnJhbWVWaWV3KiB2aWV3
ID0gcmVuZGVyZXItPnZpZXcoKS0+ZnJhbWVWaWV3KCk7CisgICAgaWYgKCF2aWV3KQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBUcnkgc2Nyb2xsaW5nIHRoZSByZW5kZXJlci4KKyAg
ICBpZiAoc2Nyb2xsUmVuZGVyZXIocmVuZGVyZXIsIGRlbHRhKSkKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisKKyAgICAvLyBXZSd2ZSBoaXQgdGhlIHBhZ2UsIGRvbid0IHNjcm9sbCBpdCBhbmQgcmV0
dXJuIGZhbHNlLgorICAgIGlmICh2aWV3ID09IG1fbWFpbkZyYW1lLT52aWV3KCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIC8vIFRyeSBzY3JvbGxpbmcgdGhlIEZyYW1lVmlldy4KKyAg
ICBpZiAoY2FuU2Nyb2xsSW5uZXJGcmFtZSh2aWV3LT5mcmFtZSgpKSkgeworICAgICAgICBJbnRT
aXplIHZpZXdEZWx0YSA9IGRlbHRhOworICAgICAgICBJbnRQb2ludCBuZXdWaWV3T2Zmc2V0ID0g
dmlldy0+c2Nyb2xsUG9zaXRpb24oKTsKKyAgICAgICAgSW50UG9pbnQgbWF4Vmlld09mZnNldCA9
IHZpZXctPm1heGltdW1TY3JvbGxQb3NpdGlvbigpOworICAgICAgICBhZGp1c3RTY3JvbGxEZWx0
YShtYXhWaWV3T2Zmc2V0LCBuZXdWaWV3T2Zmc2V0LCB2aWV3RGVsdGEpOworCisgICAgICAgIGlm
ICghdmlld0RlbHRhLmlzWmVybygpKSB7CisgICAgICAgICAgICB2aWV3LT5zZXRDYW5CbGl0T25T
Y3JvbGwoZmFsc2UpOworCisgICAgICAgICAgICBCYWNraW5nU3RvcmVDbGllbnQqIGJhY2tpbmdT
dG9yZUNsaWVudCA9IGJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKHZpZXctPmZyYW1lKCkpOwor
ICAgICAgICAgICAgaWYgKGJhY2tpbmdTdG9yZUNsaWVudCkgeworICAgICAgICAgICAgICAgIGJh
Y2tpbmdTdG9yZUNsaWVudC0+c2V0SXNDbGllbnRHZW5lcmF0ZWRTY3JvbGwodHJ1ZSk7CisgICAg
ICAgICAgICAgICAgYmFja2luZ1N0b3JlQ2xpZW50LT5zZXRJc1Njcm9sbE5vdGlmaWNhdGlvblN1
cHByZXNzZWQodHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1faW5SZWdpb25T
Y3JvbGxTdGFydGluZ05vZGUgPSB2aWV3LT5mcmFtZSgpLT5kb2N1bWVudCgpOworCisgICAgICAg
ICAgICB2aWV3LT5zY3JvbGxCeSh2aWV3RGVsdGEpOworCisgICAgICAgICAgICBpZiAoYmFja2lu
Z1N0b3JlQ2xpZW50KSB7CisgICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlQ2xpZW50LT5zZXRJ
c0NsaWVudEdlbmVyYXRlZFNjcm9sbChmYWxzZSk7CisgICAgICAgICAgICAgICAgYmFja2luZ1N0
b3JlQ2xpZW50LT5zZXRJc1Njcm9sbE5vdGlmaWNhdGlvblN1cHByZXNzZWQoZmFsc2UpOworICAg
ICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIC8vIFRyeSBzY3JvbGxpbmcgdGhlIG5vZGUgb2YgdGhlIGVuY2xvc2luZyBmcmFtZS4K
KyAgICBGcmFtZSogZnJhbWUgPSBub2RlLT5kb2N1bWVudCgpLT5mcmFtZSgpOworICAgIGlmIChm
cmFtZSkgeworICAgICAgICBOb2RlKiBvd25lck5vZGUgPSBmcmFtZS0+b3duZXJFbGVtZW50KCk7
CisgICAgICAgIGlmIChzY3JvbGxOb2RlUmVjdXJzaXZlbHkob3duZXJOb2RlLCBkZWx0YSkpCisg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K3ZvaWQgV2ViUGFnZVByaXZhdGU6OmFkanVzdFNjcm9sbERlbHRhKGNvbnN0IEludFBvaW50JiBt
YXhPZmZzZXQsIGNvbnN0IEludFBvaW50JiBjdXJyZW50T2Zmc2V0LCBJbnRTaXplJiBkZWx0YSkg
Y29uc3QKK3sKKyAgICBpZiAoY3VycmVudE9mZnNldC54KCkgKyBkZWx0YS53aWR0aCgpID4gbWF4
T2Zmc2V0LngoKSkKKyAgICAgICAgZGVsdGEuc2V0V2lkdGgobWluKG1heE9mZnNldC54KCkgLSBj
dXJyZW50T2Zmc2V0LngoKSwgZGVsdGEud2lkdGgoKSkpOworCisgICAgaWYgKGN1cnJlbnRPZmZz
ZXQueCgpICsgZGVsdGEud2lkdGgoKSA8IDApCisgICAgICAgIGRlbHRhLnNldFdpZHRoKG1heCgt
Y3VycmVudE9mZnNldC54KCksIGRlbHRhLndpZHRoKCkpKTsKKworICAgIGlmIChjdXJyZW50T2Zm
c2V0LnkoKSArIGRlbHRhLmhlaWdodCgpID4gbWF4T2Zmc2V0LnkoKSkKKyAgICAgICAgZGVsdGEu
c2V0SGVpZ2h0KG1pbihtYXhPZmZzZXQueSgpIC0gY3VycmVudE9mZnNldC55KCksIGRlbHRhLmhl
aWdodCgpKSk7CisKKyAgICBpZiAoY3VycmVudE9mZnNldC55KCkgKyBkZWx0YS5oZWlnaHQoKSA8
IDApCisgICAgICAgIGRlbHRhLnNldEhlaWdodChtYXgoLWN1cnJlbnRPZmZzZXQueSgpLCBkZWx0
YS5oZWlnaHQoKSkpOworfQorCitzdGF0aWMgTm9kZSogZW5jbG9zaW5nTGF5ZXJOb2RlKFJlbmRl
ckxheWVyKik7CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OnNjcm9sbFJlbmRlcmVyKFJlbmRlck9i
amVjdCogcmVuZGVyZXIsIGNvbnN0IEludFNpemUmIGRlbHRhKQoreworICAgIFJlbmRlckxheWVy
KiBsYXllciA9IHJlbmRlcmVyLT5lbmNsb3NpbmdMYXllcigpOworICAgIGlmICghbGF5ZXIpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFRyeSB0byBzY3JvbGwgbGF5ZXIuCisgICAg
Ym9vbCByZXN0cmljdGVkQnlMaW5lQ2xhbXAgPSBmYWxzZTsKKyAgICBpZiAocmVuZGVyZXItPnBh
cmVudCgpKQorICAgICAgICByZXN0cmljdGVkQnlMaW5lQ2xhbXAgPSAhcmVuZGVyZXItPnBhcmVu
dCgpLT5zdHlsZSgpLT5saW5lQ2xhbXAoKS5pc05vbmUoKTsKKworICAgIGlmIChyZW5kZXJlci0+
aGFzT3ZlcmZsb3dDbGlwKCkgJiYgIXJlc3RyaWN0ZWRCeUxpbmVDbGFtcCkgeworICAgICAgICBJ
bnRTaXplIGxheWVyRGVsdGEgPSBkZWx0YTsKKyAgICAgICAgSW50UG9pbnQgbWF4T2Zmc2V0KGxh
eWVyLT5zY3JvbGxXaWR0aCgpIC0gbGF5ZXItPnJlbmRlckJveCgpLT5jbGllbnRXaWR0aCgpLCBs
YXllci0+c2Nyb2xsSGVpZ2h0KCkgLSBsYXllci0+cmVuZGVyQm94KCktPmNsaWVudEhlaWdodCgp
KTsKKyAgICAgICAgSW50UG9pbnQgY3VycmVudE9mZnNldChsYXllci0+c2Nyb2xsWE9mZnNldCgp
LCBsYXllci0+c2Nyb2xsWU9mZnNldCgpKTsKKyAgICAgICAgYWRqdXN0U2Nyb2xsRGVsdGEobWF4
T2Zmc2V0LCBjdXJyZW50T2Zmc2V0LCBsYXllckRlbHRhKTsKKyAgICAgICAgaWYgKCFsYXllckRl
bHRhLmlzWmVybygpKSB7CisgICAgICAgICAgICBtX2luUmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2Rl
ID0gZW5jbG9zaW5nTGF5ZXJOb2RlKGxheWVyKTsKKyAgICAgICAgICAgIEludFBvaW50IG5ld09m
ZnNldCA9IGN1cnJlbnRPZmZzZXQgKyBsYXllckRlbHRhOworICAgICAgICAgICAgbGF5ZXItPnNj
cm9sbFRvT2Zmc2V0KG5ld09mZnNldC54KCksIG5ld09mZnNldC55KCkpOworICAgICAgICAgICAg
cmVuZGVyZXItPnJlcGFpbnQodHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIHdoaWxlIChsYXllciA9IGxheWVyLT5wYXJlbnQoKSkgeworICAg
ICAgICBpZiAoY2FuU2Nyb2xsUmVuZGVyQm94KGxheWVyLT5yZW5kZXJCb3goKSkpCisgICAgICAg
ICAgICByZXR1cm4gc2Nyb2xsUmVuZGVyZXIobGF5ZXItPnJlbmRlckJveCgpLCBkZWx0YSk7Cisg
ICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVTY3JvbGxp
bmcodW5zaWduZWQgc2hvcnQgY2hhcmFjdGVyLCBXZWJQYWdlUHJpdmF0ZSogc2Nyb2xsZXIpCit7
CisgICAgY29uc3QgaW50IHNjcm9sbEZhY3RvciA9IDIwOworICAgIGludCBkeCA9IDAsIGR5ID0g
MDsKKyAgICBzd2l0Y2ggKGNoYXJhY3RlcikgeworICAgIGNhc2UgS0VZQ09ERV9MRUZUOgorICAg
ICAgICBkeCA9IC1zY3JvbGxGYWN0b3I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0VZQ09E
RV9SSUdIVDoKKyAgICAgICAgZHggPSBzY3JvbGxGYWN0b3I7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgS0VZQ09ERV9VUDoKKyAgICAgICAgZHkgPSAtc2Nyb2xsRmFjdG9yOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIEtFWUNPREVfRE9XTjoKKyAgICAgICAgZHkgPSBzY3JvbGxGYWN0b3I7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0VZQ09ERV9QR19VUDoKKyAgICAgICAgQVNTRVJU
KHNjcm9sbGVyKTsKKyAgICAgICAgZHkgPSBzY3JvbGxGYWN0b3IgLSBzY3JvbGxlci0+YWN0dWFs
VmlzaWJsZVNpemUoKS5oZWlnaHQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLRVlDT0RF
X1BHX0RPV046CisgICAgICAgIEFTU0VSVChzY3JvbGxlcik7CisgICAgICAgIGR5ID0gc2Nyb2xs
ZXItPmFjdHVhbFZpc2libGVTaXplKCkuaGVpZ2h0KCkgLSBzY3JvbGxGYWN0b3I7CisgICAgICAg
IGJyZWFrOworICAgIH0KKworICAgIGlmIChkeCB8fCBkeSkgeworICAgICAgICAvLyBEb24ndCB1
c2UgdGhlIHNjcm9sbEJ5IGZ1bmN0aW9uIGJlY2F1c2UgaXQgdHJpZ2dlcnMgdGhlIHNjcm9sbCBh
cyBvcmlnaW5hdGluZyBmcm9tIEJsYWNrQmVycnkKKyAgICAgICAgLy8gYnV0IHRoZW4gaXQgZXhw
ZWN0cyBhIHNlcGFyYXRlIGludmFsaWRhdGUgd2hpY2ggaXNuJ3Qgc2VudCBpbiB0aGlzIGNhc2Uu
CisgICAgICAgIEFTU0VSVChzY3JvbGxlciAmJiBzY3JvbGxlci0+bV9tYWluRnJhbWUgJiYgc2Ny
b2xsZXItPm1fbWFpbkZyYW1lLT52aWV3KCkpOworICAgICAgICBJbnRQb2ludCBwb3Moc2Nyb2xs
ZXItPnNjcm9sbFBvc2l0aW9uKCkgKyBJbnRTaXplKGR4LCBkeSkpOworCisgICAgICAgIC8vIFBy
ZXZlbnQgb3ZlciBzY3JvbGxpbmcgZm9yIGFycm93cyBhbmQgUGFnZSB1cC9kb3duLgorICAgICAg
ICBpZiAocG9zLngoKSA8IDApCisgICAgICAgICAgICBwb3Muc2V0WCgwKTsKKyAgICAgICAgaWYg
KHBvcy55KCkgPCAwKQorICAgICAgICAgICAgcG9zLnNldFkoMCk7CisgICAgICAgIGlmIChwb3Mu
eCgpICsgc2Nyb2xsZXItPmFjdHVhbFZpc2libGVTaXplKCkud2lkdGgoKSA+IHNjcm9sbGVyLT5j
b250ZW50c1NpemUoKS53aWR0aCgpKQorICAgICAgICAgICAgcG9zLnNldFgoc2Nyb2xsZXItPmNv
bnRlbnRzU2l6ZSgpLndpZHRoKCkgLSBzY3JvbGxlci0+YWN0dWFsVmlzaWJsZVNpemUoKS53aWR0
aCgpKTsKKyAgICAgICAgaWYgKHBvcy55KCkgKyBzY3JvbGxlci0+YWN0dWFsVmlzaWJsZVNpemUo
KS5oZWlnaHQoKSA+IHNjcm9sbGVyLT5jb250ZW50c1NpemUoKS5oZWlnaHQoKSkKKyAgICAgICAg
ICAgIHBvcy5zZXRZKHNjcm9sbGVyLT5jb250ZW50c1NpemUoKS5oZWlnaHQoKSAtIHNjcm9sbGVy
LT5hY3R1YWxWaXNpYmxlU2l6ZSgpLmhlaWdodCgpKTsKKworICAgICAgICBzY3JvbGxlci0+bV9t
YWluRnJhbWUtPnZpZXcoKS0+c2V0U2Nyb2xsUG9zaXRpb24ocG9zKTsKKyAgICAgICAgc2Nyb2xs
ZXItPm1fY2xpZW50LT5zY3JvbGxDaGFuZ2VkKHBvcyk7CisgICAgfQorfQorCitib29sIFdlYlBh
Z2U6OmtleUV2ZW50KGNvbnN0IFBsYXRmb3JtOjpLZXlib2FyZEV2ZW50JiBrZXlib2FyZEV2ZW50
KQoreworICAgIGlmICghZC0+bV9tYWluRnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgQVNTRVJUKGQtPm1fcGFnZS0+Zm9jdXNDb250cm9sbGVyKCkpOworCisgICAg
Ym9vbCBoYW5kbGVkID0gZC0+bV9pbnB1dEhhbmRsZXItPmhhbmRsZUtleWJvYXJkSW5wdXQoa2V5
Ym9hcmRFdmVudCk7CisKKyAgICBpZiAoIWhhbmRsZWQgJiYga2V5Ym9hcmRFdmVudC50eXBlKCkg
PT0gUGxhdGZvcm06OktleWJvYXJkRXZlbnQ6OktleURvd24gJiYgIWQtPm1faW5wdXRIYW5kbGVy
LT5pc0lucHV0TW9kZSgpKSB7CisgICAgICAgIEludFBvaW50IHByZXZpb3VzUG9zID0gZC0+c2Ny
b2xsUG9zaXRpb24oKTsKKyAgICAgICAgaGFuZGxlU2Nyb2xsaW5nKGtleWJvYXJkRXZlbnQuY2hh
cmFjdGVyKCksIGQpOworICAgICAgICBoYW5kbGVkID0gcHJldmlvdXNQb3MgIT0gZC0+c2Nyb2xs
UG9zaXRpb24oKTsKKyAgICB9CisKKyAgICByZXR1cm4gaGFuZGxlZDsKK30KKworYm9vbCBXZWJQ
YWdlOjpkZWxldGVUZXh0UmVsYXRpdmVUb0N1cnNvcih1bnNpZ25lZCBpbnQgbGVmdE9mZnNldCwg
dW5zaWduZWQgaW50IHJpZ2h0T2Zmc2V0KQoreworICAgIHJldHVybiBkLT5tX2lucHV0SGFuZGxl
ci0+ZGVsZXRlVGV4dFJlbGF0aXZlVG9DdXJzb3IobGVmdE9mZnNldCwgcmlnaHRPZmZzZXQpOwor
fQorCitzcGFubmFibGVfc3RyaW5nX3QqIFdlYlBhZ2U6OnNlbGVjdGVkVGV4dChpbnQzMl90IGZs
YWdzKQoreworICAgIHJldHVybiBkLT5tX2lucHV0SGFuZGxlci0+c2VsZWN0ZWRUZXh0KGZsYWdz
KTsKK30KKworc3Bhbm5hYmxlX3N0cmluZ190KiBXZWJQYWdlOjp0ZXh0QmVmb3JlQ3Vyc29yKGlu
dDMyX3QgbGVuZ3RoLCBpbnQzMl90IGZsYWdzKQoreworICAgIHJldHVybiBkLT5tX2lucHV0SGFu
ZGxlci0+dGV4dEJlZm9yZUN1cnNvcihsZW5ndGgsIGZsYWdzKTsKK30KKworc3Bhbm5hYmxlX3N0
cmluZ190KiBXZWJQYWdlOjp0ZXh0QWZ0ZXJDdXJzb3IoaW50MzJfdCBsZW5ndGgsIGludDMyX3Qg
ZmxhZ3MpCit7CisgICAgcmV0dXJuIGQtPm1faW5wdXRIYW5kbGVyLT50ZXh0QWZ0ZXJDdXJzb3Io
bGVuZ3RoLCBmbGFncyk7Cit9CisKK2V4dHJhY3RlZF90ZXh0X3QqIFdlYlBhZ2U6OmV4dHJhY3Rl
ZFRleHRSZXF1ZXN0KGV4dHJhY3RlZF90ZXh0X3JlcXVlc3RfdCogcmVxdWVzdCwgaW50MzJfdCBm
bGFncykKK3sKKyAgICByZXR1cm4gZC0+bV9pbnB1dEhhbmRsZXItPmV4dHJhY3RlZFRleHRSZXF1
ZXN0KHJlcXVlc3QsIGZsYWdzKTsKK30KKworaW50MzJfdCBXZWJQYWdlOjpzZXRDb21wb3NpbmdS
ZWdpb24oaW50MzJfdCBzdGFydCwgaW50MzJfdCBlbmQpCit7CisgICAgcmV0dXJuIGQtPm1faW5w
dXRIYW5kbGVyLT5zZXRDb21wb3NpbmdSZWdpb24oc3RhcnQsIGVuZCk7Cit9CisKK2ludDMyX3Qg
V2ViUGFnZTo6ZmluaXNoQ29tcG9zaXRpb24oKQoreworICAgIHJldHVybiBkLT5tX2lucHV0SGFu
ZGxlci0+ZmluaXNoQ29tcG9zaXRpb24oKTsKK30KKworaW50MzJfdCBXZWJQYWdlOjpzZXRDb21w
b3NpbmdUZXh0KHNwYW5uYWJsZV9zdHJpbmdfdCogc3Bhbm5hYmxlU3RyaW5nLCBpbnQzMl90IHJl
bGF0aXZlQ3Vyc29yUG9zaXRpb24pCit7CisgICAgcmV0dXJuIGQtPm1faW5wdXRIYW5kbGVyLT5z
ZXRDb21wb3NpbmdUZXh0KHNwYW5uYWJsZVN0cmluZywgcmVsYXRpdmVDdXJzb3JQb3NpdGlvbik7
Cit9CisKK2ludDMyX3QgV2ViUGFnZTo6Y29tbWl0VGV4dChzcGFubmFibGVfc3RyaW5nX3QqIHNw
YW5uYWJsZVN0cmluZywgaW50MzJfdCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uKQoreworICAgIHJl
dHVybiBkLT5tX2lucHV0SGFuZGxlci0+Y29tbWl0VGV4dChzcGFubmFibGVTdHJpbmcsIHJlbGF0
aXZlQ3Vyc29yUG9zaXRpb24pOworfQorCit2b2lkIFdlYlBhZ2U6OnNwZWxsQ2hlY2tpbmdFbmFi
bGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBzdGF0aWNfY2FzdDxFZGl0b3JDbGllbnRCbGFja0Jl
cnJ5Kj4oZC0+bV9wYWdlLT5lZGl0b3JDbGllbnQoKSktPmVuYWJsZVNwZWxsQ2hlY2tpbmcoZW5h
YmxlZCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2VsZWN0aW9uQ2FuY2VsbGVkKCkKK3sKKyAgICBk
LT5tX3NlbGVjdGlvbkhhbmRsZXItPmNhbmNlbFNlbGVjdGlvbigpOworfQorCitib29sIFdlYlBh
Z2U6OnNlbGVjdGlvbkNvbnRhaW5zKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgcG9pbnQpCit7
CisgICAgcmV0dXJuIGQtPm1fc2VsZWN0aW9uSGFuZGxlci0+c2VsZWN0aW9uQ29udGFpbnMoZC0+
bWFwRnJvbVRyYW5zZm9ybWVkKHBvaW50KSk7Cit9CisKK1dlYlN0cmluZyBXZWJQYWdlOjp0aXRs
ZSgpIGNvbnN0Cit7CisgICAgaWYgKGQtPm1fbWFpbkZyYW1lLT5kb2N1bWVudCgpKQorICAgICAg
ICByZXR1cm4gZC0+bV9tYWluRnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigpLT50aXRs
ZSgpLnN0cmluZygpOworICAgIHJldHVybiBXZWJTdHJpbmcoKTsKK30KKworV2ViU3RyaW5nIFdl
YlBhZ2U6OnNlbGVjdGVkVGV4dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fc2VsZWN0aW9u
SGFuZGxlci0+c2VsZWN0ZWRUZXh0KCk7Cit9CisKK1dlYlN0cmluZyBXZWJQYWdlOjpjdXRTZWxl
Y3RlZFRleHQoKQoreworICAgIFdlYlN0cmluZyBzZWxlY3RlZFRleHQgPSBkLT5tX3NlbGVjdGlv
bkhhbmRsZXItPnNlbGVjdGVkVGV4dCgpOworICAgIGlmICghc2VsZWN0ZWRUZXh0LmlzRW1wdHko
KSkKKyAgICAgICAgZC0+bV9pbnB1dEhhbmRsZXItPmRlbGV0ZVNlbGVjdGlvbigpOworICAgIHJl
dHVybiBzZWxlY3RlZFRleHQ7Cit9CisKK3ZvaWQgV2ViUGFnZTo6aW5zZXJ0VGV4dChjb25zdCBX
ZWJTdHJpbmcmIHN0cmluZykKK3sKKyAgICBkLT5tX2lucHV0SGFuZGxlci0+aW5zZXJ0VGV4dChz
dHJpbmcpOworfQorCit2b2lkIFdlYlBhZ2U6OmNsZWFyQ3VycmVudElucHV0RmllbGQoKQorewor
ICAgIGQtPm1faW5wdXRIYW5kbGVyLT5jbGVhckZpZWxkKCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6
Y3V0KCkKK3sKKyAgICBkLT5tX2lucHV0SGFuZGxlci0+Y3V0KCk7Cit9CisKK3ZvaWQgV2ViUGFn
ZTo6Y29weSgpCit7CisgICAgZC0+bV9pbnB1dEhhbmRsZXItPmNvcHkoKTsKK30KKwordm9pZCBX
ZWJQYWdlOjpwYXN0ZSgpCit7CisgICAgZC0+bV9pbnB1dEhhbmRsZXItPnBhc3RlKCk7Cit9CisK
K3ZvaWQgV2ViUGFnZTo6c2V0U2VsZWN0aW9uKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgc3Rh
cnRQb2ludCwgY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBlbmRQb2ludCkKK3sKKyAgICAvLyBU
cmFuc2Zvcm0gdGhpcyBldmVudHMgY29vcmRpbmF0ZXMgdG8gd2Via2l0IGNvbnRlbnQgY29vcmRp
bmF0ZXMuCisgICAgLy8gRklYTUU6IERvbid0IHRyYW5zZm9ybSB0aGUgc2VudGluZWwsIGJlY2F1
c2UgaXQgbWF5IGJlIHRyYW5zZm9ybWVkIHRvIGEgZmxvYXRpbmcgbnVtYmVyCisgICAgLy8gd2hp
Y2ggY291bGQgYmUgcm91bmRlZCB0byAwIG9yIG90aGVyIG51bWJlcnMuIFRoaXMgd29ya2Fyb3Vu
ZCBzaG91bGQgYmUgcmVtb3ZlZCBhZnRlcgorICAgIC8vIHRoZSBlcnJvciBvZiByb3VuZFVudHJh
bnNmb3JtZWRQb2ludCgpIGlzIGZpeGVkLgorICAgIGJvb2wgaW52YWxpZFBvaW50ID0gSW50UG9p
bnQoc3RhcnRQb2ludCkgPT0gRE9NU3VwcG9ydDo6SW52YWxpZFBvaW50OworICAgIEludFBvaW50
IHN0YXJ0ID0gaW52YWxpZFBvaW50ID8gRE9NU3VwcG9ydDo6SW52YWxpZFBvaW50IDogZC0+bWFw
RnJvbVRyYW5zZm9ybWVkKHN0YXJ0UG9pbnQpOworICAgIGludmFsaWRQb2ludCA9IEludFBvaW50
KGVuZFBvaW50KSA9PSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQ7CisgICAgSW50UG9pbnQgZW5k
ID0gaW52YWxpZFBvaW50ID8gRE9NU3VwcG9ydDo6SW52YWxpZFBvaW50IDogZC0+bWFwRnJvbVRy
YW5zZm9ybWVkKGVuZFBvaW50KTsKKworICAgIGQtPm1fc2VsZWN0aW9uSGFuZGxlci0+c2V0U2Vs
ZWN0aW9uKHN0YXJ0LCBlbmQpOworfQorCit2b2lkIFdlYlBhZ2U6OnNldENhcmV0UG9zaXRpb24o
Y29uc3QgUGxhdGZvcm06OkludFBvaW50JiBwb3NpdGlvbikKK3sKKyAgICAvLyBIYW5kbGVkIGJ5
IHNlbGVjdGlvbiBoYW5kbGVyIGFzIGl0J3MgcG9pbnQgYmFzZWQuCisgICAgLy8gVHJhbnNmb3Jt
IHRoaXMgZXZlbnRzIGNvb3JkaW5hdGVzIHRvIHdlYmtpdCBjb250ZW50IGNvb3JkaW5hdGVzLgor
ICAgIGQtPm1fc2VsZWN0aW9uSGFuZGxlci0+c2V0Q2FyZXRQb3NpdGlvbihkLT5tYXBGcm9tVHJh
bnNmb3JtZWQocG9zaXRpb24pKTsKK30KKwordm9pZCBXZWJQYWdlOjpzZWxlY3RBdFBvaW50KGNv
bnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgbG9jYXRpb24pCit7CisgICAgLy8gVHJhbnNmb3JtIHRo
aXMgZXZlbnRzIGNvb3JkaW5hdGVzIHRvIHdlYmtpdCBjb250ZW50IGNvb3JkaW5hdGVzIGlmIGl0
CisgICAgLy8gaXMgbm90IHRoZSBzZW50aW5lbCB2YWx1ZS4KKyAgICBJbnRQb2ludCBzZWxlY3Rp
b25Mb2NhdGlvbiA9CisgICAgICAgICAgICBJbnRQb2ludChsb2NhdGlvbikgPT0gRE9NU3VwcG9y
dDo6SW52YWxpZFBvaW50ID8KKyAgICAgICAgICAgIERPTVN1cHBvcnQ6OkludmFsaWRQb2ludCA6
CisgICAgICAgICAgICBkLT5tYXBGcm9tVHJhbnNmb3JtZWQobG9jYXRpb24pOworCisgICAgZC0+
bV9zZWxlY3Rpb25IYW5kbGVyLT5zZWxlY3RBdFBvaW50KHNlbGVjdGlvbkxvY2F0aW9uKTsKK30K
KworLy8gUmV0dXJuZWQgc2Nyb2xsIHBvc2l0aW9uIGlzIGluIHRyYW5zZm9ybWVkIGNvb3JkaW5h
dGVzLgorUGxhdGZvcm06OkludFBvaW50IFdlYlBhZ2U6OnNjcm9sbFBvc2l0aW9uKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gZC0+dHJhbnNmb3JtZWRTY3JvbGxQb3NpdGlvbigpOworfQorCisvLyBT
ZXR0aW5nIHRoZSBzY3JvbGwgcG9zaXRpb24gaXMgaW4gdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMu
Cit2b2lkIFdlYlBhZ2U6OnNldFNjcm9sbFBvc2l0aW9uKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2lu
dCYgcG9pbnQpCit7CisgICAgaWYgKGQtPnRyYW5zZm9ybWVkUG9pbnRFcXVhbHNVbnRyYW5zZm9y
bWVkUG9pbnQocG9pbnQsIGQtPnNjcm9sbFBvc2l0aW9uKCkpKQorICAgICAgICByZXR1cm47CisK
KyAgICAvLyBJZiB0aGUgdXNlciByZWNlbnRseSBwZXJmb3JtZWQgYW4gZXZlbnQsIHRoaXMgbmV3
IHNjcm9sbCBwb3NpdGlvbgorICAgIC8vIGNvdWxkIHBvc3NpYmx5IGJlIGEgcmVzdWx0IG9mIHRo
YXQuIE9yIG5vdCwgdGhpcyBpcyBqdXN0IGEgaGV1cmlzdGljLgorICAgIGlmIChjdXJyZW50VGlt
ZSgpIC0gZC0+bV9sYXN0VXNlckV2ZW50VGltZXN0YW1wIDwgbWFudWFsU2Nyb2xsSW50ZXJ2YWwp
CisgICAgICAgIGQtPm1fdXNlclBlcmZvcm1lZE1hbnVhbFNjcm9sbCA9IHRydWU7CisKKyAgICBk
LT5tX2JhY2tpbmdTdG9yZUNsaWVudC0+c2V0SXNDbGllbnRHZW5lcmF0ZWRTY3JvbGwodHJ1ZSk7
CisgICAgZC0+bV9tYWluRnJhbWUtPnZpZXcoKS0+c2V0Q2FuT3ZlcnNjcm9sbCh0cnVlKTsKKyAg
ICBkLT5zZXRTY3JvbGxQb3NpdGlvbihkLT5tYXBGcm9tVHJhbnNmb3JtZWQocG9pbnQpKTsKKyAg
ICBkLT5tX21haW5GcmFtZS0+dmlldygpLT5zZXRDYW5PdmVyc2Nyb2xsKGZhbHNlKTsKKyAgICBk
LT5tX2JhY2tpbmdTdG9yZUNsaWVudC0+c2V0SXNDbGllbnRHZW5lcmF0ZWRTY3JvbGwoZmFsc2Up
OworfQorCitXZWJTdHJpbmcgV2ViUGFnZTo6dGV4dEVuY29kaW5nKCkKK3sKKyAgICBGcmFtZSog
ZnJhbWUgPSBkLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAg
ICByZXR1cm4gIiI7CisKKyAgICBEb2N1bWVudCogZG9jdW1lbnQgPSBmcmFtZS0+ZG9jdW1lbnQo
KTsKKyAgICBpZiAoIWRvY3VtZW50KQorICAgICAgICByZXR1cm4gIiI7CisKKyAgICByZXR1cm4g
ZG9jdW1lbnQtPmxvYWRlcigpLT53cml0ZXIoKS0+ZW5jb2RpbmcoKTsKK30KKworV2ViU3RyaW5n
IFdlYlBhZ2U6OmZvcmNlZFRleHRFbmNvZGluZygpCit7CisgICAgRnJhbWUqIGZyYW1lID0gZC0+
Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuICIi
OworCisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gZnJhbWUtPmRvY3VtZW50KCk7CisgICAgaWYg
KCFkb2N1bWVudCkKKyAgICAgICAgcmV0dXJuICIiOworCisgICAgcmV0dXJuIGRvY3VtZW50LT5s
b2FkZXIoKS0+b3ZlcnJpZGVFbmNvZGluZygpOworfQorCit2b2lkIFdlYlBhZ2U6OnNldEZvcmNl
ZFRleHRFbmNvZGluZyhjb25zdCBjaGFyKiBlbmNvZGluZykKK3sKKyAgICBpZiAoZW5jb2Rpbmcg
JiYgZC0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkgJiYgZC0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPmxv
YWRlcigpICYmIGQtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5sb2FkZXIoKSkKKyAgICAgICAgcmV0
dXJuIGQtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5sb2FkZXIoKS0+cmVsb2FkV2l0aE92ZXJyaWRl
RW5jb2RpbmcoZW5jb2RpbmcpOworfQorCisvLyBGSVhNRTogTW92ZSB0byBET01TdXBwb3J0Lgor
Ym9vbCBXZWJQYWdlUHJpdmF0ZTo6Y2FuU2Nyb2xsSW5uZXJGcmFtZShGcmFtZSogZnJhbWUpIGNv
bnN0Cit7CisgICAgaWYgKCFmcmFtZSB8fCAhZnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgLy8gTm90IGhhdmluZyBhbiBvd25lciBlbGVtZW50IG1lYW5zIHRoYXQg
d2UgYXJlIG9uIHRoZSBtYWluZnJhbWUuCisgICAgaWYgKCFmcmFtZS0+b3duZXJFbGVtZW50KCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEFTU0VSVChmcmFtZSAhPSBtX21haW5GcmFt
ZSk7CisKKyAgICBJbnRTaXplIHZpc2libGVTaXplID0gZnJhbWUtPnZpZXcoKS0+dmlzaWJsZUNv
bnRlbnRSZWN0KCkuc2l6ZSgpOworICAgIEludFNpemUgY29udGVudHNTaXplID0gZnJhbWUtPnZp
ZXcoKS0+Y29udGVudHNTaXplKCk7CisKKyAgICBib29sIGNhbkJlU2Nyb2xsZWQgPSBjb250ZW50
c1NpemUuaGVpZ2h0KCkgPiB2aXNpYmxlU2l6ZS5oZWlnaHQoKSB8fCBjb250ZW50c1NpemUud2lk
dGgoKSA+IHZpc2libGVTaXplLndpZHRoKCk7CisKKyAgICAvLyBMZXRzIGFsc28gY29uc2lkZXIg
dGhlICdvdmVyZmxvdy17eCx5fSBwcm9wZXJ0eSBzZXQgZGlyZWN0bHkgdG8gdGhlIHtpfWZyYW1l
IHRhZy4KKyAgICByZXR1cm4gY2FuQmVTY3JvbGxlZCAmJiAoZnJhbWUtPm93bmVyRWxlbWVudCgp
LT5zY3JvbGxpbmdNb2RlKCkgIT0gU2Nyb2xsYmFyQWx3YXlzT2ZmKTsKK30KKworLy8gVGhlIFJl
bmRlckJveDo6Y2FuYmVTY3JvbGxlZEFuZEhhc1Njcm9sbGFibGVBcmVhIG1ldGhvZCByZXR1cm5z
IHRydWUgZm9yIHRoZQorLy8gZm9sbG93aW5nIHNjZW5hcmlvLCBmb3IgZXhhbXBsZToKKy8vICgx
KSBhIGRpdiB0aGF0IGhhcyBhIHZlcnRpY2FsIG92ZXJmbG93IGJ1dCBubyBob3Jpem9udGFsIG92
ZXJmbG93CisvLyAgICAgd2l0aCBvdmVyZmxvdy15OiBoaWRkZW4gYW5kIG92ZXJmbG93LXg6IGF1
dG8gc2V0LgorLy8gVGhlIHZlcnNpb24gYmVsb3cgZml4ZXMgaXQuCisvLyBGSVhNRTogRml4IGl0
IHVwc3RyZWFtIQorYm9vbCBXZWJQYWdlUHJpdmF0ZTo6Y2FuU2Nyb2xsUmVuZGVyQm94KFJlbmRl
ckJveCogYm94KQoreworICAgIGlmICghYm94IHx8ICFib3gtPmhhc092ZXJmbG93Q2xpcCgpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoYm94LT5zY3JvbGxzT3ZlcmZsb3dYKCkg
JiYgKGJveC0+c2Nyb2xsV2lkdGgoKSAhPSBib3gtPmNsaWVudFdpZHRoKCkpCisgICAgICAgIHx8
IGJveC0+c2Nyb2xsc092ZXJmbG93WSgpICYmIChib3gtPnNjcm9sbEhlaWdodCgpICE9IGJveC0+
Y2xpZW50SGVpZ2h0KCkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIE5vZGUqIG5vZGUg
PSBib3gtPm5vZGUoKTsKKyAgICByZXR1cm4gbm9kZSAmJiAobm9kZS0+cmVuZGVyZXJJc0VkaXRh
YmxlKCkgfHwgbm9kZS0+aXNEb2N1bWVudE5vZGUoKSk7Cit9CisKK3N0YXRpYyBSZW5kZXJMYXll
ciogcGFyZW50TGF5ZXIoUmVuZGVyTGF5ZXIqIGxheWVyKQoreworICAgIEFTU0VSVChsYXllcik7
CisKKyAgICBpZiAobGF5ZXItPnBhcmVudCgpKQorICAgICAgICByZXR1cm4gbGF5ZXItPnBhcmVu
dCgpOworCisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGxheWVyLT5yZW5kZXJlcigpOwor
ICAgIGlmIChyZW5kZXJlci0+ZG9jdW1lbnQoKSAmJiByZW5kZXJlci0+ZG9jdW1lbnQoKS0+b3du
ZXJFbGVtZW50KCkgJiYgcmVuZGVyZXItPmRvY3VtZW50KCktPm93bmVyRWxlbWVudCgpLT5yZW5k
ZXJlcigpKQorICAgICAgICByZXR1cm4gcmVuZGVyZXItPmRvY3VtZW50KCktPm93bmVyRWxlbWVu
dCgpLT5yZW5kZXJlcigpLT5lbmNsb3NpbmdMYXllcigpOworCisgICAgcmV0dXJuIDA7Cit9CisK
Ky8vIEZJWE1FOiBNYWtlIFJlbmRlckxheWVyOjplbmNsb3NpbmdFbGVtZW50IHB1YmxpYyBzbyB0
aGlzIG9uZSBjYW4gYmUgcmVtb3ZlZC4KK3N0YXRpYyBOb2RlKiBlbmNsb3NpbmdMYXllck5vZGUo
UmVuZGVyTGF5ZXIqIGxheWVyKQoreworICAgIGZvciAoUmVuZGVyT2JqZWN0KiByID0gbGF5ZXIt
PnJlbmRlcmVyKCk7IHI7IHIgPSByLT5wYXJlbnQoKSkgeworICAgICAgICBpZiAoTm9kZSogZSA9
IHItPm5vZGUoKSkKKyAgICAgICAgICAgIHJldHVybiBlOworICAgIH0KKyAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHVzaEJhY2tJblJl
Z2lvblNjcm9sbGFibGUoc3RkOjp2ZWN0b3I8UGxhdGZvcm06OlNjcm9sbFZpZXdCYXNlPiYgdmVj
dG9yLCBJblJlZ2lvblNjcm9sbGFibGVBcmVhIHNjcm9sbGVyLCBXZWJQYWdlUHJpdmF0ZSogd2Vi
UGFnZSkKK3sKKyAgICBBU1NFUlQod2ViUGFnZSk7CisgICAgQVNTRVJUKCFzY3JvbGxlci5pc051
bGwoKSk7CisKKyAgICBzY3JvbGxlci5zZXRDYW5Qcm9wYWdhdGVTY3JvbGxpbmdUb0VuY2xvc2lu
Z1Njcm9sbGFibGUoIWlzTm9uUmVuZGVyVmlld0ZpeGVkUG9zaXRpb25lZENvbnRhaW5lcihzY3Jv
bGxlci5sYXllcigpKSk7CisgICAgdmVjdG9yLnB1c2hfYmFjayhzY3JvbGxlcik7CisgICAgaWYg
KHZlY3Rvci5zaXplKCkgPT0gMSkgeworICAgICAgICAvLyBGSVhNRTogVXNlIFJlbmRlckxheWVy
OjpyZW5kZXJCb3goKS0+bm9kZSgpIGluc3RlYWQ/CisgICAgICAgIHdlYlBhZ2UtPm1faW5SZWdp
b25TY3JvbGxTdGFydGluZ05vZGUgPSBlbmNsb3NpbmdMYXllck5vZGUoc2Nyb2xsZXIubGF5ZXIo
KSk7CisgICAgfQorfQorCitzdGQ6OnZlY3RvcjxQbGF0Zm9ybTo6U2Nyb2xsVmlld0Jhc2U+IFdl
YlBhZ2VQcml2YXRlOjppblJlZ2lvblNjcm9sbGFibGVBcmVhc0ZvclBvaW50KGNvbnN0IFBsYXRm
b3JtOjpJbnRQb2ludCYgcG9pbnQpCit7CisgICAgc3RkOjp2ZWN0b3I8UGxhdGZvcm06OlNjcm9s
bFZpZXdCYXNlPiB2YWxpZFJldHVybjsKKyAgICBzdGQ6OnZlY3RvcjxQbGF0Zm9ybTo6U2Nyb2xs
Vmlld0Jhc2U+IGVtcHR5UmV0dXJuOworCisgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQgPSBtX21h
aW5GcmFtZS0+ZXZlbnRIYW5kbGVyKCktPmhpdFRlc3RSZXN1bHRBdFBvaW50KG1hcEZyb21WaWV3
cG9ydFRvQ29udGVudHMocG9pbnQpLCBmYWxzZSAvKmFsbG93U2hhZG93Q29udGVudCovKTsKKyAg
ICBOb2RlKiBub2RlID0gcmVzdWx0LmlubmVyTm9uU2hhcmVkTm9kZSgpOworICAgIGlmICghbm9k
ZSkKKyAgICAgICAgcmV0dXJuIGVtcHR5UmV0dXJuOworCisgICAgUmVuZGVyT2JqZWN0KiByZW5k
ZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7CisgICAgLy8gRklYTUU6IFZhbGlkYXRlIHdpdGggZWxl
bWVudHMgd2l0aCB2aXNpYmlsaXR5OmhpZGRlbi4KKyAgICBpZiAoIXJlbmRlcmVyKQorICAgICAg
ICByZXR1cm4gZW1wdHlSZXR1cm47CisKKyAgICBSZW5kZXJMYXllciogbGF5ZXIgPSByZW5kZXJl
ci0+ZW5jbG9zaW5nTGF5ZXIoKTsKKworICAgIGRvIHsKKyAgICAgICAgUmVuZGVyT2JqZWN0KiBy
ZW5kZXJlciA9IGxheWVyLT5yZW5kZXJlcigpOworCisgICAgICAgIGlmIChyZW5kZXJlci0+aXNS
ZW5kZXJWaWV3KCkpIHsKKyAgICAgICAgICAgIGlmIChSZW5kZXJWaWV3KiByZW5kZXJWaWV3ID0g
dG9SZW5kZXJWaWV3KHJlbmRlcmVyKSkgeworICAgICAgICAgICAgICAgIEZyYW1lVmlldyogdmll
dyA9IHJlbmRlclZpZXctPmZyYW1lVmlldygpOworICAgICAgICAgICAgICAgIGlmICghdmlldykK
KyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtcHR5UmV0dXJuOworCisgICAgICAgICAgICAg
ICAgaWYgKGNhblNjcm9sbElubmVyRnJhbWUodmlldy0+ZnJhbWUoKSkpIHsKKyAgICAgICAgICAg
ICAgICAgICAgcHVzaEJhY2tJblJlZ2lvblNjcm9sbGFibGUodmFsaWRSZXR1cm4sIEluUmVnaW9u
U2Nyb2xsYWJsZUFyZWEodGhpcywgbGF5ZXIpLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVs
c2UgaWYgKGNhblNjcm9sbFJlbmRlckJveChsYXllci0+cmVuZGVyQm94KCkpKSB7CisgICAgICAg
ICAgICBwdXNoQmFja0luUmVnaW9uU2Nyb2xsYWJsZSh2YWxpZFJldHVybiwgSW5SZWdpb25TY3Jv
bGxhYmxlQXJlYSh0aGlzLCBsYXllciksIHRoaXMpOworICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSBydW4gaW50byBhIGZpeCBwb3NpdGlvbmVkIGxh
eWVyLCBzZXQgdGhlIGxhc3Qgc2Nyb2xsYWJsZSBpbi1yZWdpb24gb2JqZWN0CisgICAgICAgIC8v
IGFzIG5vdCBhYmxlIHRvIHByb3BhZ2F0ZSBzY3JvbGwgdG8gaXRzIHBhcmVudCBzY3JvbGxhYmxl
LgorICAgICAgICBpZiAoaXNOb25SZW5kZXJWaWV3Rml4ZWRQb3NpdGlvbmVkQ29udGFpbmVyKGxh
eWVyKSAmJiB2YWxpZFJldHVybi5zaXplKCkpIHsKKyAgICAgICAgICAgIFBsYXRmb3JtOjpTY3Jv
bGxWaWV3QmFzZSYgZW5kID0gdmFsaWRSZXR1cm4uYmFjaygpOworICAgICAgICAgICAgZW5kLnNl
dENhblByb3BhZ2F0ZVNjcm9sbGluZ1RvRW5jbG9zaW5nU2Nyb2xsYWJsZShmYWxzZSk7CisgICAg
ICAgIH0KKworICAgIH0gd2hpbGUgKGxheWVyID0gcGFyZW50TGF5ZXIobGF5ZXIpKTsKKworICAg
IGlmICh2YWxpZFJldHVybi5lbXB0eSgpKQorICAgICAgICByZXR1cm4gZW1wdHlSZXR1cm47CisK
KyAgICByZXR1cm4gdmFsaWRSZXR1cm47Cit9CisKK0JhY2tpbmdTdG9yZSogV2ViUGFnZTo6YmFj
a2luZ1N0b3JlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+bV9iYWNraW5nU3RvcmU7Cit9CisK
K2Jvb2wgV2ViUGFnZTo6em9vbVRvRml0KCkKK3sKKyAgICBpZiAoZC0+Y29udGVudHNTaXplKCku
aXNFbXB0eSgpIHx8ICFkLT5pc1VzZXJTY2FsYWJsZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBkLT5tX3VzZXJQZXJmb3JtZWRNYW51YWxab29tID0gdHJ1ZTsKKworICAgIC8vIFRP
RE86IFdlIG1heSBuZWVkIHRvIHVzZSAoMCwwKSBhcyB0aGUgYW5jaG9yIHBvaW50IHdoZW4gdGV4
dFJlZmxvdyBpcyBlbmFibGVkLgorICAgIC8vIElGIHRoZSBtaW5pbXVtIGZvbnQgc2l6ZSBpcyBn
aW5vcm1vdXMsIHdlIG1heSBzdGlsbCB3YW50IHRoZSBzY3JvbGwgcG9zaXRpb24gdG8gYmUgMCww
LgorICAgIHJldHVybiBkLT56b29tQWJvdXRQb2ludChkLT56b29tVG9GaXRTY2FsZSgpLCBkLT5j
ZW50ZXJPZlZpc2libGVDb250ZW50c1JlY3QoKSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6
OnNldFRleHRSZWZsb3dBbmNob3JQb2ludChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIGZvY2Fs
UG9pbnQpCit7CisgICAgLy8gU2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIHRleHQgcmVmbG93
IGlzIGVuYWJsZWQuCisgICAgQVNTRVJUKG1fd2ViUGFnZS0+c2V0dGluZ3MoKS0+dGV4dFJlZmxv
d01vZGUoKSA9PSBXZWJTZXR0aW5nczo6VGV4dFJlZmxvd0VuYWJsZWQpOworCisgICAgbV9jdXJy
ZW50UGluY2hab29tTm9kZSA9IGJlc3ROb2RlRm9yWm9vbVVuZGVyUG9pbnQoZm9jYWxQb2ludCk7
CisgICAgaWYgKCFtX2N1cnJlbnRQaW5jaFpvb21Ob2RlKQorICAgICAgICByZXR1cm47CisKKyAg
ICBJbnRSZWN0IG5vZGVSZWN0ID0gcmVjdEZvck5vZGUobV9jdXJyZW50UGluY2hab29tTm9kZS5n
ZXQoKSk7CisgICAgbV9hbmNob3JJbk5vZGVSZWN0UmF0aW8uc2V0KHN0YXRpY19jYXN0PGZsb2F0
PihtYXBGcm9tVHJhbnNmb3JtZWQoZm9jYWxQb2ludCkueCgpIC0gbm9kZVJlY3QueCgpKSAvIG5v
ZGVSZWN0LndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19j
YXN0PGZsb2F0PihtYXBGcm9tVHJhbnNmb3JtZWQoZm9jYWxQb2ludCkueSgpIC0gbm9kZVJlY3Qu
eSgpKSAvIG5vZGVSZWN0LmhlaWdodCgpKTsKK30KKworYm9vbCBXZWJQYWdlOjpwaW5jaFpvb21B
Ym91dFBvaW50KGRvdWJsZSBzY2FsZSwgaW50IHgsIGludCB5KQoreworICAgIEludFBvaW50IGFu
Y2hvcih4LCB5KTsKKyAgICBkLT5tX3VzZXJQZXJmb3JtZWRNYW51YWxab29tID0gdHJ1ZTsKKyAg
ICBkLT5tX3VzZXJQZXJmb3JtZWRNYW51YWxTY3JvbGwgPSB0cnVlOworCisgICAgaWYgKGQtPm1f
d2ViUGFnZS0+c2V0dGluZ3MoKS0+dGV4dFJlZmxvd01vZGUoKSA9PSBXZWJTZXR0aW5nczo6VGV4
dFJlZmxvd0VuYWJsZWQpIHsKKyAgICAgICAgZC0+c2V0VGV4dFJlZmxvd0FuY2hvclBvaW50KGFu
Y2hvcik7CisgICAgICAgIC8vIFRoZW9yZXRpY2FsbHksIGQtPm5vZGVGb3Jab29tVW5kZXJQb2lu
dChhbmNob3IpIGNhbiByZXR1cm4gbnVsbC4KKyAgICAgICAgaWYgKCFkLT5tX2N1cnJlbnRQaW5j
aFpvb21Ob2RlKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVy
biBkLT56b29tQWJvdXRQb2ludChzY2FsZSwgZC0+bWFwRnJvbVRyYW5zZm9ybWVkKGFuY2hvcikp
OworfQorCisjaWYgRU5BQkxFKFZJRVdQT1JUX1JFRkxPVykKK3ZvaWQgV2ViUGFnZVByaXZhdGU6
OnRvZ2dsZVRleHRSZWZsb3dJZkVuYWJsZWRGb3JCbG9ja1pvb21Pbmx5KGJvb2wgc2hvdWxkRW5h
YmxlVGV4dFJlZmxvdykKK3sKKyAgICBpZiAobV93ZWJQYWdlLT5zZXR0aW5ncygpLT50ZXh0UmVm
bG93TW9kZSgpID09IFdlYlNldHRpbmdzOjpUZXh0UmVmbG93RW5hYmxlZE9ubHlGb3JCbG9ja1pv
b20pCisgICAgICAgIG1fcGFnZS0+c2V0dGluZ3MoKS0+c2V0VGV4dFJlZmxvd0VuYWJsZWQoc2hv
dWxkRW5hYmxlVGV4dFJlZmxvdyk7Cit9CisjZW5kaWYKKworYm9vbCBXZWJQYWdlOjpibG9ja1pv
b20oaW50IHgsIGludCB5KQoreworICAgIGlmICghZC0+bV9tYWluRnJhbWUtPnZpZXcoKSB8fCAh
ZC0+aXNVc2VyU2NhbGFibGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgTm9kZSog
bm9kZSA9IGQtPmJlc3ROb2RlRm9yWm9vbVVuZGVyUG9pbnQoSW50UG9pbnQoeCwgeSkpOworICAg
IGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgSW50UmVjdCBub2RlUmVj
dCA9IGQtPnJlY3RGb3JOb2RlKG5vZGUpOworICAgIEludFJlY3QgYmxvY2tSZWN0OworICAgIGJv
b2wgZW5kT2ZCbG9ja1pvb21Nb2RlID0gZC0+Y29tcGFyZU5vZGVzRm9yQmxvY2tab29tKGQtPm1f
Y3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZS5nZXQoKSwgbm9kZSk7CisgICAgY29uc3QgZG91
YmxlIG9sZFNjYWxlID0gZC0+bV90cmFuc2Zvcm1hdGlvbk1hdHJpeC0+bTExKCk7CisgICAgZG91
YmxlIG5ld1NjYWxlID0gMDsKKyAgICBjb25zdCBkb3VibGUgbWFyZ2luID0gZW5kT2ZCbG9ja1pv
b21Nb2RlID8gMCA6IGJsb2NrWm9vbU1hcmdpbiAqIDIgKiBvbGRTY2FsZTsKKyAgICBib29sIGlz
Rmlyc3Rab29tID0gZmFsc2U7CisKKyAgICBpZiAoZW5kT2ZCbG9ja1pvb21Nb2RlKSB7CisgICAg
ICAgIC8vIEVuZCBvZiBibG9jayB6b29tIG1vZGUKKyAgICAgICAgSW50UmVjdCByZWN0ID0gZC0+
YmxvY2tab29tUmVjdEZvck5vZGUobm9kZSk7CisgICAgICAgIGJsb2NrUmVjdCA9IEludFJlY3Qo
MCwgcmVjdC55KCksIGQtPnRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkud2lkdGgoKSwgZC0+dHJh
bnNmb3JtZWRDb250ZW50c1NpemUoKS5oZWlnaHQoKSAtIHJlY3QueSgpKTsKKyAgICAgICAgZC0+
bV9zaG91bGRSZWZsb3dCbG9jayA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFN0
YXJ0L2NvbnRpbnVlIGJsb2NrIHpvb20gbW9kZQorICAgICAgICBOb2RlKiB0ZW1wQmxvY2tab29t
QWRqdXN0ZWROb2RlID0gZC0+bV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlLmdldCgpOwor
ICAgICAgICBibG9ja1JlY3QgPSBkLT5ibG9ja1pvb21SZWN0Rm9yTm9kZShub2RlKTsKKworICAg
ICAgICAvLyBEb24ndCB1c2UgYSBibG9jayBpZiBpdCBpcyB0b28gY2xvc2UgdG8gdGhlIHNpemUg
b2YgdGhlIGFjdHVhbCBjb250ZW50cy4KKyAgICAgICAgLy8gV2UgYWxsb3cgdGhpcyBmb3IgaW1h
Z2VzIG9ubHkgc28gdGhhdCB0aGV5IGNhbiBiZSB6b29tZWQgdGlnaHQgdG8gdGhlIHNjcmVlbi4K
KyAgICAgICAgaWYgKCFub2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aW1nVGFnKSkgeworICAg
ICAgICAgICAgSW50UmVjdCB0UmVjdCA9IGQtPm1hcEZyb21UcmFuc2Zvcm1lZChibG9ja1JlY3Qp
OworICAgICAgICAgICAgaW50IGJsb2NrQXJlYSA9IHRSZWN0LndpZHRoKCkgKiB0UmVjdC5oZWln
aHQoKTsKKyAgICAgICAgICAgIGludCBwYWdlQXJlYSA9IGQtPmNvbnRlbnRzU2l6ZSgpLndpZHRo
KCkgKiBkLT5jb250ZW50c1NpemUoKS5oZWlnaHQoKTsKKyAgICAgICAgICAgIGRvdWJsZSBibG9j
a1RvUGFnZVJhdGlvID0gc3RhdGljX2Nhc3Q8ZG91YmxlPigxIC0gYmxvY2tBcmVhIC8gcGFnZUFy
ZWEpOworICAgICAgICAgICAgaWYgKGJsb2NrVG9QYWdlUmF0aW8gPCBtaW5pbXVtRXhwYW5kaW5n
UmF0aW8pIHsKKyAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIG9sZCBhZGp1c3Qgbm9kZSBiZWNh
dXNlIHpvb20gd2FzIGNhbmNlbGVkLgorICAgICAgICAgICAgICAgIGQtPm1fY3VycmVudEJsb2Nr
Wm9vbUFkanVzdGVkTm9kZSA9IHRlbXBCbG9ja1pvb21BZGp1c3RlZE5vZGU7CisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
aWYgKGJsb2NrUmVjdC5pc0VtcHR5KCkgfHwgIWJsb2NrUmVjdC53aWR0aCgpIHx8ICFibG9ja1Jl
Y3QuaGVpZ2h0KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKCFk
LT5tX2N1cnJlbnRCbG9ja1pvb21Ob2RlLmdldCgpKQorICAgICAgICAgICAgaXNGaXJzdFpvb20g
PSB0cnVlOworCisgICAgICAgIGQtPm1fY3VycmVudEJsb2NrWm9vbU5vZGUgPSBub2RlOworICAg
ICAgICBkLT5tX3Nob3VsZFJlZmxvd0Jsb2NrID0gdHJ1ZTsKKyAgICB9CisKKyAgICBuZXdTY2Fs
ZSA9IHN0ZDo6bWluKGQtPm5ld1NjYWxlRm9yQmxvY2tab29tUmVjdChibG9ja1JlY3QsIG9sZFNj
YWxlLCBtYXJnaW4pLCBkLT5tYXhCbG9ja1pvb21TY2FsZSgpKTsKKyAgICBuZXdTY2FsZSA9IHN0
ZDo6bWF4KG5ld1NjYWxlLCBtaW5pbXVtU2NhbGUoKSk7CisKKyNpZiBERUJVR19CTE9DS19aT09N
CisgICAgLy8gUmVuZGVyIHRoZSBkb3VibGUgdGFwIHBvaW50IGZvciB2aXN1YWwgcmVmZXJlbmNl
LgorICAgIEludFJlY3QgcmVuZGVyUmVjdCh4LCB5LCAxLCAxKTsKKyAgICByZW5kZXJSZWN0ID0g
ZC0+bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQocmVuZGVy
UmVjdCk7CisgICAgSW50U2l6ZSB2aWV3cG9ydFNpemUgPSBkLT50cmFuc2Zvcm1lZFZpZXdwb3J0
U2l6ZSgpOworICAgIHJlbmRlclJlY3QuaW50ZXJzZWN0KEludFJlY3QoMCwgMCwgdmlld3BvcnRT
aXplLndpZHRoKCksIHZpZXdwb3J0U2l6ZS5oZWlnaHQoKSkpOworICAgIGQtPm1fYmFja2luZ1N0
b3JlLT5kLT5jbGVhcldpbmRvdyhyZW5kZXJSZWN0LCAwLCAwLCAwKTsKKyAgICBkLT5tX2JhY2tp
bmdTdG9yZS0+ZC0+aW52YWxpZGF0ZVdpbmRvdyhyZW5kZXJSZWN0KTsKKworICAgIC8vIFVuY29t
bWVudCB0aGlzIHRvIHJldHVybiBpbiBvcmRlciB0byBzZWUgdGhlIGJsb2NrcyBiZWluZyBzZWxl
Y3RlZC4KKy8vICAgIGQtPm1fY2xpZW50LT56b29tQ2hhbmdlZChpc01pblpvb21lZCgpLCBpc01h
eFpvb21lZCgpLCBpc0F0SW5pdGlhbFpvb20oKSwgY3VycmVudFpvb21MZXZlbCgpKTsKKy8vICAg
IHJldHVybiB0cnVlOworI2VuZGlmCisKKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9XKQorICAg
IC8vIElmIHJlZmxvd2luZywgYWRqdXN0IHRoZSByZWZsb3ctd2lkdGggb2YgdGV4dCBub2RlIHRv
IG1ha2Ugc3VyZSB0aGUgZm9udCBpcyBhIHJlYXNvbmFibGUgc2l6ZS4KKyAgICBpZiAoZC0+bV9j
dXJyZW50QmxvY2tab29tTm9kZSAmJiBkLT5tX3Nob3VsZFJlZmxvd0Jsb2NrICYmIHNldHRpbmdz
KCktPnRleHRSZWZsb3dNb2RlKCkgIT0gV2ViU2V0dGluZ3M6OlRleHRSZWZsb3dEaXNhYmxlZCkg
eworICAgICAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gZC0+bV9jdXJyZW50QmxvY2tab29t
Tm9kZS0+cmVuZGVyZXIoKTsKKyAgICAgICAgaWYgKHJlbmRlcmVyICYmIHJlbmRlcmVyLT5pc1Rl
eHQoKSkgeworICAgICAgICAgICAgZG91YmxlIG5ld0ZvbnRTaXplID0gcmVuZGVyZXItPnN0eWxl
KCktPmZvbnRTaXplKCkgKiBuZXdTY2FsZTsKKyAgICAgICAgICAgIGlmIChuZXdGb250U2l6ZSA8
IGQtPm1fd2ViU2V0dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpKSB7CisgICAgICAgICAgICAgICAg
bmV3U2NhbGUgPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDxkb3VibGU+KGQtPm1fd2ViU2V0dGluZ3Mt
PmRlZmF1bHRGb250U2l6ZSgpKSAvIHJlbmRlcmVyLT5zdHlsZSgpLT5mb250U2l6ZSgpLCBkLT5t
YXhCbG9ja1pvb21TY2FsZSgpKTsKKyAgICAgICAgICAgICAgICBuZXdTY2FsZSA9IHN0ZDo6bWF4
KG5ld1NjYWxlLCBtaW5pbXVtU2NhbGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBi
bG9ja1JlY3Quc2V0V2lkdGgob2xkU2NhbGUgKiBzdGF0aWNfY2FzdDxkb3VibGU+KGQtPnRyYW5z
Zm9ybWVkQWN0dWFsVmlzaWJsZVNpemUoKS53aWR0aCgpKSAvIG5ld1NjYWxlKTsKKyAgICAgICAg
ICAgIC8vIFJlLWNhbGN1bGF0ZSB0aGUgc2NhbGUgaGVyZSB0byB0YWtlIGluIHRvIGFjY291bnQg
dGhlIG1hcmdpbi4KKyAgICAgICAgICAgIG5ld1NjYWxlID0gc3RkOjptaW4oZC0+bmV3U2NhbGVG
b3JCbG9ja1pvb21SZWN0KGJsb2NrUmVjdCwgb2xkU2NhbGUsIG1hcmdpbiksIGQtPm1heEJsb2Nr
Wm9vbVNjYWxlKCkpOworICAgICAgICAgICAgbmV3U2NhbGUgPSBzdGQ6Om1heChuZXdTY2FsZSwg
bWluaW11bVNjYWxlKCkpOyAvLyBTdGlsbCwgaXQncyBub3QgYWxsb3dlZCB0byBiZSBzbWFsbGVy
IHRoYW4gbWluaW11bSBzY2FsZS4KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgLy8g
QWxpZ24gdGhlIHpvb21lZCBibG9jayBpbiB0aGUgc2NyZWVuLgorICAgIGRvdWJsZSBuZXdCbG9j
a0hlaWdodCA9IGQtPm1hcEZyb21UcmFuc2Zvcm1lZChibG9ja1JlY3QpLmhlaWdodCgpOworICAg
IGRvdWJsZSBuZXdCbG9ja1dpZHRoID0gZC0+bWFwRnJvbVRyYW5zZm9ybWVkKGJsb2NrUmVjdCku
d2lkdGgoKTsKKyAgICBkb3VibGUgc2NhbGVkVmlld3BvcnRXaWR0aCA9IHN0YXRpY19jYXN0PGRv
dWJsZT4oZC0+YWN0dWFsVmlzaWJsZVNpemUoKS53aWR0aCgpKSAqIG9sZFNjYWxlIC8gbmV3U2Nh
bGU7CisgICAgZG91YmxlIHNjYWxlZFZpZXdwb3J0SGVpZ2h0ID0gc3RhdGljX2Nhc3Q8ZG91Ymxl
PihkLT5hY3R1YWxWaXNpYmxlU2l6ZSgpLmhlaWdodCgpKSAqIG9sZFNjYWxlIC8gbmV3U2NhbGU7
CisgICAgZG91YmxlIGR4ID0gc3RkOjptYXgoMC4wLCAoc2NhbGVkVmlld3BvcnRXaWR0aCAtIG5l
d0Jsb2NrV2lkdGgpIC8gMi4wKTsKKyAgICBkb3VibGUgZHkgPSBzdGQ6Om1heCgwLjAsIChzY2Fs
ZWRWaWV3cG9ydEhlaWdodCAtIG5ld0Jsb2NrSGVpZ2h0KSAvIDIuMCk7CisKKyAgICBSZW5kZXJP
YmplY3QqIHJlbmRlcmVyID0gZC0+bV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlLT5yZW5k
ZXJlcigpOworICAgIEZsb2F0UG9pbnQgYW5jaG9yOworICAgIEZsb2F0UG9pbnQgdG9wTGVmdFBv
aW50KGQtPm1hcEZyb21UcmFuc2Zvcm1lZChibG9ja1JlY3QpLmxvY2F0aW9uKCkpOworICAgIGlm
IChyZW5kZXJlciAmJiByZW5kZXJlci0+aXNUZXh0KCkpIHsKKyAgICAgICAgRVRleHRBbGlnbiB0
ZXh0QWxpZ24gPSByZW5kZXJlci0+c3R5bGUoKS0+dGV4dEFsaWduKCk7CisgICAgICAgIHN3aXRj
aCAodGV4dEFsaWduKSB7CisgICAgICAgIGNhc2UgQ0VOVEVSOgorICAgICAgICBjYXNlIFdFQktJ
VF9DRU5URVI6CisgICAgICAgICAgICBhbmNob3IgPSBGbG9hdFBvaW50KG5vZGVSZWN0LngoKSAr
IChub2RlUmVjdC53aWR0aCgpIC0gc2NhbGVkVmlld3BvcnRXaWR0aCkgLyAyLCB0b3BMZWZ0UG9p
bnQueSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExFRlQ6CisgICAgICAg
IGNhc2UgV0VCS0lUX0xFRlQ6CisgICAgICAgICAgICBhbmNob3IgPSB0b3BMZWZ0UG9pbnQ7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSSUdIVDoKKyAgICAgICAgY2FzZSBXRUJL
SVRfUklHSFQ6CisgICAgICAgICAgICBhbmNob3IgPSBGbG9hdFBvaW50KG5vZGVSZWN0LngoKSAr
IG5vZGVSZWN0LndpZHRoKCkgLSBzY2FsZWRWaWV3cG9ydFdpZHRoLCB0b3BMZWZ0UG9pbnQueSgp
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRBQVVUTzoKKyAgICAgICAgY2Fz
ZSBKVVNUSUZZOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKHJlbmRlcmVyLT5z
dHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgYW5jaG9y
ID0gdG9wTGVmdFBvaW50OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFuY2hv
ciA9IEZsb2F0UG9pbnQobm9kZVJlY3QueCgpICsgbm9kZVJlY3Qud2lkdGgoKSAtIHNjYWxlZFZp
ZXdwb3J0V2lkdGgsIHRvcExlZnRQb2ludC55KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgYW5jaG9yID0gcmVuZGVyZXItPnN0eWxlKCktPmlz
TGVmdFRvUmlnaHREaXJlY3Rpb24oKSA/IHRvcExlZnRQb2ludCA6IEZsb2F0UG9pbnQobm9kZVJl
Y3QueCgpICsgbm9kZVJlY3Qud2lkdGgoKSAtIHNjYWxlZFZpZXdwb3J0V2lkdGgsIHRvcExlZnRQ
b2ludC55KCkpOworCisgICAgaWYgKG5ld0Jsb2NrSGVpZ2h0IDw9IHNjYWxlZFZpZXdwb3J0SGVp
Z2h0KSB7CisgICAgICAgIC8vIFRoZSBibG9jayBmaXRzIGluIHRoZSB2aWV3cG9ydCBzbyBjZW50
ZXIgaXQuCisgICAgICAgIGQtPm1fZmluYWxCbG9ja1BvaW50ID0gRmxvYXRQb2ludChhbmNob3Iu
eCgpIC0gZHgsIGFuY2hvci55KCkgLSBkeSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhl
IGJsb2NrIGlzIGxvbmdlciB0aGFuIHRoZSB2aWV3cG9ydCBzbyB0b3AgYWxpZ24gaXQgYW5kIGFk
ZCAzIHBpeGVsIG1hcmdpbi4KKyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnQgPSBGbG9hdFBv
aW50KGFuY2hvci54KCkgLSBkeCwgYW5jaG9yLnkoKSAtIDMpOworICAgIH0KKworI2lmIEVOQUJM
RShWSUVXUE9SVF9SRUZMT1cpCisgICAgLy8gV2UgZG9uJ3Qga25vdyBob3cgbG9uZyB0aGUgcmVm
bG93ZWQgYmxvY2sgd2lsbCBiZSBzbyB3ZSBwb3NpdGlvbiBpdCBhdCB0aGUgdG9wIG9mIHRoZSBz
Y3JlZW4gd2l0aCBhIHNtYWxsIG1hcmdpbi4KKyAgICBpZiAoc2V0dGluZ3MoKS0+dGV4dFJlZmxv
d01vZGUoKSAhPSBXZWJTZXR0aW5nczo6VGV4dFJlZmxvd0Rpc2FibGVkKSB7CisgICAgICAgIGQt
Pm1fZmluYWxCbG9ja1BvaW50ID0gRmxvYXRQb2ludChhbmNob3IueCgpIC0gZHgsIGFuY2hvci55
KCkgLSAzKTsKKyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnRSZWZsb3dPZmZzZXQgPSBGbG9h
dFBvaW50KC1keCwgLTMpOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gTWFrZSBzdXJlIHRoYXQg
dGhlIG9yaWdpbmFsIG5vZGUgcmVjdCBpcyB2aXNpYmxlIGluIHRoZSBzY3JlZW4gYWZ0ZXIgdGhl
IHpvb20uIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGlkZW50aWZpZWQgYmxvY2sgcmVj
dCBtaWdodAorICAgIC8vIG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgb3JpZ2luYWwgbm9kZSByZWN0
LCBhbmQgaXQgY291bGQgZm9yY2UgdGhlIG9yaWdpbmFsIG5vZGUgcmVjdCBvZmYgdGhlIHNjcmVl
bi4KKyAgICBGbG9hdFJlY3QgYnIoYW5jaG9yLCBGbG9hdFNpemUoc2NhbGVkVmlld3BvcnRXaWR0
aCwgc2NhbGVkVmlld3BvcnRIZWlnaHQpKTsKKyAgICBJbnRQb2ludCBjbGlja1BvaW50ID0gZC0+
bWFwRnJvbVRyYW5zZm9ybWVkKEludFBvaW50KHgsIHkpKTsKKyAgICBpZiAoIWJyLmNvbnRhaW5z
KGNsaWNrUG9pbnQpKSB7CisgICAgICAgIGQtPm1fZmluYWxCbG9ja1BvaW50UmVmbG93T2Zmc2V0
Lm1vdmUoMCwgKGNsaWNrUG9pbnQueSgpIC0gc2NhbGVkVmlld3BvcnRIZWlnaHQgLyAyKSAtIGQt
Pm1fZmluYWxCbG9ja1BvaW50LnkoKSk7CisgICAgICAgIGQtPm1fZmluYWxCbG9ja1BvaW50ID0g
RmxvYXRQb2ludChkLT5tX2ZpbmFsQmxvY2tQb2ludC54KCksIGNsaWNrUG9pbnQueSgpIC0gc2Nh
bGVkVmlld3BvcnRIZWlnaHQgLyAyKTsKKyAgICB9CisKKyAgICAvLyBDbGFtcCB0aGUgZmluYWxC
bG9ja1BvaW50IHRvIG5vdCBjYXVzZSBhbnkgb3ZlcmZsb3cgc2Nyb2xsaW5nLgorICAgIGlmIChk
LT5tX2ZpbmFsQmxvY2tQb2ludC54KCkgPCAwKSB7CisgICAgICAgIGQtPm1fZmluYWxCbG9ja1Bv
aW50LnNldFgoMCk7CisgICAgICAgIGQtPm1fZmluYWxCbG9ja1BvaW50UmVmbG93T2Zmc2V0LnNl
dFgoMCk7CisgICAgfSBlbHNlIGlmIChkLT5tX2ZpbmFsQmxvY2tQb2ludC54KCkgKyBzY2FsZWRW
aWV3cG9ydFdpZHRoID4gZC0+Y29udGVudHNTaXplKCkud2lkdGgoKSkgeworICAgICAgICBkLT5t
X2ZpbmFsQmxvY2tQb2ludC5zZXRYKGQtPmNvbnRlbnRzU2l6ZSgpLndpZHRoKCkgLSBzY2FsZWRW
aWV3cG9ydFdpZHRoKTsKKyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnRSZWZsb3dPZmZzZXQu
c2V0WCgwKTsKKyAgICB9CisKKyAgICBpZiAoZC0+bV9maW5hbEJsb2NrUG9pbnQueSgpIDwgMCkg
eworICAgICAgICBkLT5tX2ZpbmFsQmxvY2tQb2ludC5zZXRZKDApOworICAgICAgICBkLT5tX2Zp
bmFsQmxvY2tQb2ludFJlZmxvd09mZnNldC5zZXRZKDApOworICAgIH0gZWxzZSBpZiAoZC0+bV9m
aW5hbEJsb2NrUG9pbnQueSgpICsgc2NhbGVkVmlld3BvcnRIZWlnaHQgPiBkLT5jb250ZW50c1Np
emUoKS5oZWlnaHQoKSkgeworICAgICAgICBkLT5tX2ZpbmFsQmxvY2tQb2ludC5zZXRZKGQtPmNv
bnRlbnRzU2l6ZSgpLmhlaWdodCgpIC0gc2NhbGVkVmlld3BvcnRIZWlnaHQpOworICAgICAgICBk
LT5tX2ZpbmFsQmxvY2tQb2ludFJlZmxvd09mZnNldC5zZXRZKDApOworICAgIH0KKworICAgIGQt
Pm1fZmluYWxCbG9ja1BvaW50ID0gZC0+bWFwVG9UcmFuc2Zvcm1lZEZsb2F0UG9pbnQoZC0+bV9m
aW5hbEJsb2NrUG9pbnQpOworCisgICAgLy8gRG9uJ3QgYmxvY2sgem9vbSBpZiB0aGUgdXNlciBp
cyB6b29taW5nIGFuZCB0aGUgbmV3IHNjYWxlIGlzIG9ubHkgbWFyZ2luYWxseSBkaWZmZXJlbnQg
ZnJvbSB0aGUKKyAgICAvLyBvbGRTY2FsZSB3aXRoIG9ubHkgYSBtYXJnaW5hbCBjaGFuZ2UgaW4g
c2Nyb2xsIHBvc2l0aW9uLiBJZ25vcmUgc2Nyb2xsIGRpZmZlcmVuY2UgaW4gdGhlIHNwZWNpYWwg
Y2FzZQorICAgIC8vIHRoYXQgdGhlIHpvb20gbGV2ZWwgaXMgdGhlIG1pbmltdW1TY2FsZS4KKyAg
ICBpZiAoIWVuZE9mQmxvY2tab29tTW9kZSAmJiBhYnMobmV3U2NhbGUgLSBvbGRTY2FsZSkgLyBv
bGRTY2FsZSA8IG1pbmltdW1FeHBhbmRpbmdSYXRpbykgeworICAgICAgICBjb25zdCBkb3VibGUg
bWluaW11bURpc3BsYWNlbWVudCA9IG1pbmltdW1FeHBhbmRpbmdSYXRpbyAqIGQtPnRyYW5zZm9y
bWVkQWN0dWFsVmlzaWJsZVNpemUoKS53aWR0aCgpOworICAgICAgICBpZiAob2xkU2NhbGUgPT0g
ZC0+bWluaW11bVNjYWxlKCkgfHwgKGRpc3RhbmNlQmV0d2VlblBvaW50cyhyb3VuZFRyYW5zZm9y
bWVkUG9pbnQoZC0+bWFwVG9UcmFuc2Zvcm1lZChkLT5zY3JvbGxQb3NpdGlvbigpKSksIHJvdW5k
VHJhbnNmb3JtZWRQb2ludChkLT5tX2ZpbmFsQmxvY2tQb2ludCkpIDwgbWluaW11bURpc3BsYWNl
bWVudCAmJiBhYnMobmV3U2NhbGUgLSBvbGRTY2FsZSkgLyBvbGRTY2FsZSA8IDAuMTApKSB7Cisg
ICAgICAgICAgICBpZiAoaXNGaXJzdFpvb20pIHsKKyAgICAgICAgICAgICAgICBkLT5yZXNldEJs
b2NrWm9vbSgpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIC8vIFpvb20gb3V0IG9mIGJsb2NrIHpvb20uCisgICAgICAgICAgICBibG9j
a1pvb20oeCwgeSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIGQtPm1fYmxvY2tab29tRmluYWxTY2FsZSA9IG5ld1NjYWxlOworCisgICAgLy8gV2Ug
c2V0IHRoaXMgaGVyZSB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgdHJ5IHRvIHJlLXJlbmRlciB0aGUg
cGFnZSBhdCBhIGRpZmZlcmVudCB6b29tIGxldmVsIGR1cmluZyBsb2FkaW5nLgorICAgIGQtPm1f
dXNlclBlcmZvcm1lZE1hbnVhbFpvb20gPSB0cnVlOworICAgIGQtPm1fdXNlclBlcmZvcm1lZE1h
bnVhbFNjcm9sbCA9IHRydWU7CisgICAgZC0+bV9jbGllbnQtPmFuaW1hdGVCbG9ja1pvb20oZC0+
bV9maW5hbEJsb2NrUG9pbnQsIGQtPm1fYmxvY2tab29tRmluYWxTY2FsZSk7CisKKyAgICByZXR1
cm4gdHJ1ZTsKK30KKworYm9vbCBXZWJQYWdlOjppc01heFpvb21lZCgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIChkLT5jdXJyZW50U2NhbGUoKSA9PSBkLT5tYXhpbXVtU2NhbGUoKSkgfHwgIWQtPmlz
VXNlclNjYWxhYmxlKCk7Cit9CisKK2Jvb2wgV2ViUGFnZTo6aXNNaW5ab29tZWQoKSBjb25zdAor
eworICAgIHJldHVybiAoZC0+Y3VycmVudFNjYWxlKCkgPT0gZC0+bWluaW11bVNjYWxlKCkpIHx8
ICFkLT5pc1VzZXJTY2FsYWJsZSgpOworfQorCitib29sIFdlYlBhZ2U6OmlzQXRJbml0aWFsWm9v
bSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIChkLT5jdXJyZW50U2NhbGUoKSA9PSBkLT5pbml0aWFs
U2NhbGUoKSkgfHwgIWQtPmlzVXNlclNjYWxhYmxlKCk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZh
dGU6OnNob3VsZFpvb21PbkVzY2FwZSgpIGNvbnN0Cit7CisgICAgaWYgKCFpc1VzZXJTY2FsYWJs
ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBJZiB0aGUgaW5pdGlhbCBzY2Fs
ZSBpcyBub3QgcmVhY2hhYmxlLCBkb24ndCB0cnkgdG8gem9vbS4KKyAgICBpZiAoaW5pdGlhbFNj
YWxlKCkgPCBtaW5pbXVtU2NhbGUoKSB8fCBpbml0aWFsU2NhbGUoKSA+IG1heGltdW1TY2FsZSgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBEb24ndCBldmVyIHpvb20gaW4gd2hl
biB3ZSBwcmVzcyBlc2NhcGUuCisgICAgaWYgKGluaXRpYWxTY2FsZSgpID49IGN1cnJlbnRTY2Fs
ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gY3VycmVudFNjYWxlKCkg
IT0gaW5pdGlhbFNjYWxlKCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6em9vbVRvSW5pdGlhbFNjYWxl
KCkKK3sKKyAgICBpZiAoIWQtPmlzVXNlclNjYWxhYmxlKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGQtPnpvb21BYm91dFBvaW50KGQtPmluaXRpYWxTY2FsZSgpLCBkLT5jZW50ZXJPZlZpc2li
bGVDb250ZW50c1JlY3QoKSk7Cit9CisKK2Jvb2wgV2ViUGFnZTo6em9vbVRvT25lT25lKCkKK3sK
KyAgICBpZiAoIWQtPmlzVXNlclNjYWxhYmxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIGRvdWJsZSBzY2FsZSA9IDE7CisgICAgcmV0dXJuIGQtPnpvb21BYm91dFBvaW50KHNjYWxl
LCBkLT5jZW50ZXJPZlZpc2libGVDb250ZW50c1JlY3QoKSk7Cit9CisKK1BsYXRmb3JtOjpJbnRS
ZWN0IFdlYlBhZ2U6OmZvY3VzTm9kZVJlY3QoKQoreworICAgIHJldHVybiBkLT5mb2N1c05vZGVS
ZWN0KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0Rm9jdXNlZChib29sIGZvY3VzZWQpCit7Cisg
ICAgRm9jdXNDb250cm9sbGVyKiBmb2N1c0NvbnRyb2xsZXIgPSBkLT5tX3BhZ2UtPmZvY3VzQ29u
dHJvbGxlcigpOworICAgIGZvY3VzQ29udHJvbGxlci0+c2V0QWN0aXZlKGZvY3VzZWQpOworICAg
IGlmIChmb2N1c2VkKSB7CisgICAgICAgIEZyYW1lKiBmcmFtZSA9IGZvY3VzQ29udHJvbGxlci0+
Zm9jdXNlZEZyYW1lKCk7CisgICAgICAgIGlmICghZnJhbWUpCisgICAgICAgICAgICBmb2N1c0Nv
bnRyb2xsZXItPnNldEZvY3VzZWRGcmFtZShkLT5tX21haW5GcmFtZSk7CisgICAgfQorICAgIGZv
Y3VzQ29udHJvbGxlci0+c2V0Rm9jdXNlZChmb2N1c2VkKTsKK30KKworYm9vbCBXZWJQYWdlOjpm
aW5kTmV4dFN0cmluZyhjb25zdCBjaGFyKiB0ZXh0LCBib29sIGZvcndhcmQpCit7CisgICAgcmV0
dXJuIGQtPm1faW5QYWdlU2VhcmNoTWFuYWdlci0+ZmluZE5leHRTdHJpbmcoU3RyaW5nOjpmcm9t
VVRGOCh0ZXh0KSwgZm9yd2FyZCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6cnVuTGF5b3V0VGVzdHMo
KQoreworI2lmIEVOQUJMRV9EUlQKKyAgICAvLyBGSVhNRTogZG8gd2UgbmVlZCBBUEkgdG8gdG9n
Z2xlIHRoaXM/CisgICAgZC0+bV9wYWdlLT5zZXR0aW5ncygpLT5zZXREZXZlbG9wZXJFeHRyYXNF
bmFibGVkKHRydWUpOworCisgICAgaWYgKCFkLT5tX2R1bXBSZW5kZXJUcmVlKQorICAgICAgICBk
LT5tX2R1bXBSZW5kZXJUcmVlID0gbmV3IER1bXBSZW5kZXJUcmVlKHRoaXMpOworICAgIGQtPm1f
ZHVtcFJlbmRlclRyZWUtPnJ1blRlc3RzKCk7CisjZW5kaWYKK30KKworYm9vbCBXZWJQYWdlOjpl
bmFibGVTY3JpcHREZWJ1Z2dlcigpCit7CisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIp
CisgICAgaWYgKGQtPm1fc2NyaXB0RGVidWdnZXIpCisgICAgICAgIHJldHVybiB0cnVlOworCisg
ICAgZC0+bV9zY3JpcHREZWJ1Z2dlciA9IGFkb3B0UHRyKG5ldyBKYXZhU2NyaXB0RGVidWdnZXJC
bGFja0JlcnJ5KHRoaXMtPmQpKTsKKworICAgIHJldHVybiAhIWQtPm1fc2NyaXB0RGVidWdnZXI7
CisjZW5kaWYKK30KKworYm9vbCBXZWJQYWdlOjpkaXNhYmxlU2NyaXB0RGVidWdnZXIoKQorewor
I2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VSKQorICAgIGlmICghZC0+bV9zY3JpcHREZWJ1
Z2dlcikKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBkLT5tX3NjcmlwdERlYnVnZ2VyLmNs
ZWFyKCk7CisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKwordm9pZCBXZWJQYWdlOjphZGRC
cmVha3BvaW50KGNvbnN0IHVuc2lnbmVkIHNob3J0KiB1cmwsIHVuc2lnbmVkIHVybExlbmd0aCwg
aW50IGxpbmVOdW1iZXIsIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBjb25kaXRpb24sIHVuc2lnbmVk
IGNvbmRpdGlvbkxlbmd0aCkKK3sKKyNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKKyAg
ICBpZiAoZC0+bV9zY3JpcHREZWJ1Z2dlcikKKyAgICAgICAgZC0+bV9zY3JpcHREZWJ1Z2dlci0+
YWRkQnJlYWtwb2ludCh1cmwsIHVybExlbmd0aCwgbGluZU51bWJlciwgY29uZGl0aW9uLCBjb25k
aXRpb25MZW5ndGgpOworI2VuZGlmCit9CisKK3ZvaWQgV2ViUGFnZTo6dXBkYXRlQnJlYWtwb2lu
dChjb25zdCB1bnNpZ25lZCBzaG9ydCogdXJsLCB1bnNpZ25lZCB1cmxMZW5ndGgsIGludCBsaW5l
TnVtYmVyLCBjb25zdCB1bnNpZ25lZCBzaG9ydCogY29uZGl0aW9uLCB1bnNpZ25lZCBjb25kaXRp
b25MZW5ndGgpCit7CisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCisgICAgaWYgKGQt
Pm1fc2NyaXB0RGVidWdnZXIpCisgICAgICAgIGQtPm1fc2NyaXB0RGVidWdnZXItPnVwZGF0ZUJy
ZWFrcG9pbnQodXJsLCB1cmxMZW5ndGgsIGxpbmVOdW1iZXIsIGNvbmRpdGlvbiwgY29uZGl0aW9u
TGVuZ3RoKTsKKyNlbmRpZgorfQorCit2b2lkIFdlYlBhZ2U6OnJlbW92ZUJyZWFrcG9pbnQoY29u
c3QgdW5zaWduZWQgc2hvcnQqIHVybCwgdW5zaWduZWQgdXJsTGVuZ3RoLCBpbnQgbGluZU51bWJl
cikKK3sKKyNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKKyAgICBpZiAoZC0+bV9zY3Jp
cHREZWJ1Z2dlcikKKyAgICAgICAgZC0+bV9zY3JpcHREZWJ1Z2dlci0+cmVtb3ZlQnJlYWtwb2lu
dCh1cmwsIHVybExlbmd0aCwgbGluZU51bWJlcik7CisjZW5kaWYKK30KKworYm9vbCBXZWJQYWdl
OjpwYXVzZU9uRXhjZXB0aW9ucygpCit7CisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIp
CisgICAgcmV0dXJuIGQtPm1fc2NyaXB0RGVidWdnZXIgPyBkLT5tX3NjcmlwdERlYnVnZ2VyLT5w
YXVzZU9uRXhjZXB0aW9ucygpIDogZmFsc2U7CisjZW5kaWYKK30KKwordm9pZCBXZWJQYWdlOjpz
ZXRQYXVzZU9uRXhjZXB0aW9ucyhib29sIHBhdXNlKQoreworI2lmIEVOQUJMRShKQVZBU0NSSVBU
X0RFQlVHR0VSKQorICAgIGlmIChkLT5tX3NjcmlwdERlYnVnZ2VyKQorICAgICAgICBkLT5tX3Nj
cmlwdERlYnVnZ2VyLT5zZXRQYXVzZU9uRXhjZXB0aW9ucyhwYXVzZSk7CisjZW5kaWYKK30KKwor
dm9pZCBXZWJQYWdlOjpwYXVzZUluRGVidWdnZXIoKQorCit7CisjaWYgRU5BQkxFKEpBVkFTQ1JJ
UFRfREVCVUdHRVIpCisgICAgaWYgKGQtPm1fc2NyaXB0RGVidWdnZXIpCisgICAgICAgIGQtPm1f
c2NyaXB0RGVidWdnZXItPnBhdXNlSW5EZWJ1Z2dlcigpOworI2VuZGlmCit9CisKK3ZvaWQgV2Vi
UGFnZTo6cmVzdW1lRGVidWdnZXIoKQoreworI2lmIEVOQUJMRShKQVZBU0NSSVBUX0RFQlVHR0VS
KQorICAgIGlmIChkLT5tX3NjcmlwdERlYnVnZ2VyKQorICAgICAgICBkLT5tX3NjcmlwdERlYnVn
Z2VyLT5yZXN1bWVEZWJ1Z2dlcigpOworI2VuZGlmCit9CisKK3ZvaWQgV2ViUGFnZTo6c3RlcE92
ZXJTdGF0ZW1lbnRJbkRlYnVnZ2VyKCkKK3sKKyNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dF
UikKKyAgICBpZiAoZC0+bV9zY3JpcHREZWJ1Z2dlcikKKyAgICAgICAgZC0+bV9zY3JpcHREZWJ1
Z2dlci0+c3RlcE92ZXJTdGF0ZW1lbnRJbkRlYnVnZ2VyKCk7CisjZW5kaWYKK30KKwordm9pZCBX
ZWJQYWdlOjpzdGVwSW50b1N0YXRlbWVudEluRGVidWdnZXIoKQoreworI2lmIEVOQUJMRShKQVZB
U0NSSVBUX0RFQlVHR0VSKQorICAgIGlmIChkLT5tX3NjcmlwdERlYnVnZ2VyKQorICAgICAgICBk
LT5tX3NjcmlwdERlYnVnZ2VyLT5zdGVwSW50b1N0YXRlbWVudEluRGVidWdnZXIoKTsKKyNlbmRp
ZgorfQorCit2b2lkIFdlYlBhZ2U6OnN0ZXBPdXRPZkZ1bmN0aW9uSW5EZWJ1Z2dlcigpCit7Cisj
aWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCisgICAgaWYgKGQtPm1fc2NyaXB0RGVidWdn
ZXIpCisgICAgICAgIGQtPm1fc2NyaXB0RGVidWdnZXItPnN0ZXBPdXRPZkZ1bmN0aW9uSW5EZWJ1
Z2dlcigpOworI2VuZGlmCit9CisKK3Vuc2lnbmVkIFdlYlBhZ2U6OnRpbWVvdXRGb3JKYXZhU2Ny
aXB0RXhlY3V0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gU2V0dGluZ3M6OnRpbWVvdXRGb3JK
YXZhU2NyaXB0RXhlY3V0aW9uKGQtPm1fcGFnZS0+Z3JvdXBOYW1lKCkpOworfQorCit2b2lkIFdl
YlBhZ2U6OnNldFRpbWVvdXRGb3JKYXZhU2NyaXB0RXhlY3V0aW9uKHVuc2lnbmVkIG1zKQorewor
ICAgIFNldHRpbmdzOjpzZXRUaW1lb3V0Rm9ySmF2YVNjcmlwdEV4ZWN1dGlvbihkLT5tX3BhZ2Ut
Pmdyb3VwTmFtZSgpLCBtcyk7CisKKyAgICBEb2N1bWVudCogZG9jID0gZC0+bV9wYWdlLT5tYWlu
RnJhbWUoKS0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIWRvYykKKyAgICAgICAgcmV0dXJuOworCisg
ICAgZG9jLT5nbG9iYWxEYXRhKCktPnRpbWVvdXRDaGVja2VyLnNldFRpbWVvdXRJbnRlcnZhbCht
cyk7Cit9CisKK0pTQ29udGV4dFJlZiBXZWJQYWdlOjpzY3JpcHRDb250ZXh0KCkgY29uc3QKK3sK
KyAgICBpZiAoIWQtPm1fbWFpbkZyYW1lKQorICAgICAgICByZXR1cm4gMDsKKyAgICBKU0M6OkJp
bmRpbmdzOjpSb290T2JqZWN0ICpyb290ID0gZC0+bV9tYWluRnJhbWUtPnNjcmlwdCgpLT5iaW5k
aW5nUm9vdE9iamVjdCgpOworICAgIGlmICghcm9vdCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
SlNDOjpFeGVjU3RhdGUgKmV4ZWMgPSByb290LT5nbG9iYWxPYmplY3QoKS0+Z2xvYmFsRXhlYygp
OworICAgIHJldHVybiB0b1JlZihleGVjKTsKK30KKworSlNWYWx1ZVJlZiBXZWJQYWdlOjp3aW5k
b3dPYmplY3QoKSBjb25zdAoreworICAgIHJldHVybiB0b1JlZihkLT5tX21haW5GcmFtZS0+c2Ny
aXB0KCktPmdsb2JhbE9iamVjdChtYWluVGhyZWFkTm9ybWFsV29ybGQoKSkpOworfQorCisjaWYg
RU5BQkxFKFdFQkRPTSkKK1dlYkRPTURvY3VtZW50IFdlYlBhZ2U6OmRvY3VtZW50KCkgY29uc3QK
K3sKKyAgICBpZiAoIWQtPm1fbWFpbkZyYW1lKQorICAgICAgICByZXR1cm4gV2ViRE9NRG9jdW1l
bnQoKTsKKyAgICByZXR1cm4gV2ViRE9NRG9jdW1lbnQoZC0+bV9tYWluRnJhbWUtPmRvY3VtZW50
KCkpOworfQorI2VuZGlmCisKKy8vIFNlcmlhbGl6ZSBvbmx5IHRoZSBtZW1iZXJzIG9mIEhpc3Rv
cnlJdGVtIHdoaWNoIGFyZSBuZWVkZWQgYnkgdGhlIGNsaWVudCwKKy8vIGFuZCBjb3B5IHRoZW0g
aW50byBhIFNoYXJlZEFycmF5LiBBbHNvIGluY2x1ZGUgdGhlIEhpc3RvcnlJdGVtIHBvaW50ZXIg
d2hpY2gKKy8vIHdpbGwgYmUgdXNlZCBieSB0aGUgY2xpZW50IGFzIGFuIG9wYXF1ZSByZWZlcmVu
Y2UgdG8gaWRlbnRpZnkgdGhlIGl0ZW0uCit2b2lkIFdlYlBhZ2U6OmdldEJhY2tGb3J3YXJkTGlz
dChTaGFyZWRBcnJheTxCYWNrRm9yd2FyZEVudHJ5PiYgcmVzdWx0LCB1bnNpZ25lZCBpbnQmIHJl
c3VsdFNpemUpIGNvbnN0Cit7CisgICAgSGlzdG9yeUl0ZW1WZWN0b3IgZW50cmllcyA9IHN0YXRp
Y19jYXN0PEJhY2tGb3J3YXJkTGlzdEltcGwqPihkLT5tX3BhZ2UtPmJhY2tGb3J3YXJkKCktPmNs
aWVudCgpKS0+ZW50cmllcygpOworICAgIHJlc3VsdFNpemUgPSBlbnRyaWVzLnNpemUoKTsKKyAg
ICByZXN1bHQucmVzZXQobmV3IEJhY2tGb3J3YXJkRW50cnlbcmVzdWx0U2l6ZV0pOworCisgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlc3VsdFNpemU7ICsraSkgeworICAgICAgICBSZWZQ
dHI8SGlzdG9yeUl0ZW0+IGVudHJ5ID0gZW50cmllc1tpXTsKKyAgICAgICAgQmFja0ZvcndhcmRF
bnRyeSYgcmVzdWx0RW50cnkgPSByZXN1bHRbaV07CisgICAgICAgIHJlc3VsdEVudHJ5LnVybCA9
IGVudHJ5LT51cmxTdHJpbmcoKTsKKyAgICAgICAgcmVzdWx0RW50cnkub3JpZ2luYWxVcmwgPSBl
bnRyeS0+b3JpZ2luYWxVUkxTdHJpbmcoKTsKKyAgICAgICAgcmVzdWx0RW50cnkudGl0bGUgPSBl
bnRyeS0+dGl0bGUoKTsKKyAgICAgICAgcmVzdWx0RW50cnkubmV0d29ya1Rva2VuID0gZW50cnkt
PnZpZXdTdGF0ZSgpLm5ldHdvcmtUb2tlbjsKKyAgICAgICAgcmVzdWx0RW50cnkubGFzdFZpc2l0
V2FzSFRUUE5vbkdldCA9IGVudHJ5LT5sYXN0VmlzaXRXYXNIVFRQTm9uR2V0KCk7CisgICAgICAg
IHJlc3VsdEVudHJ5LmlkID0gYmFja0ZvcndhcmRJZEZyb21IaXN0b3J5SXRlbShlbnRyeS5nZXQo
KSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBIaXN0b3J5SXRlbSBpcyBub3QgZGlzcG9z
ZWQgd2hpbGUgdGhlIHJlc3VsdCBsaXN0IGlzIHN0aWxsIGJlaW5nIHVzZWQsIHRvIG1ha2Ugc3Vy
ZSB0aGUgcG9pbnRlciBpcyBub3QgcmV1c2VkCisgICAgICAgIC8vIHdpbGwgYmUgYmFsYW5jZWQg
YnkgZGVyZWYgaW4gcmVsZWFzZUJhY2tGb3J3YXJkRW50cnkuCisgICAgICAgIGVudHJ5LT5yZWYo
KTsKKyAgICB9Cit9CisKK3ZvaWQgV2ViUGFnZTo6cmVsZWFzZUJhY2tGb3J3YXJkRW50cnkoQmFj
a0ZvcndhcmRJZCBpZCkgY29uc3QKK3sKKyAgICBIaXN0b3J5SXRlbSogaXRlbSA9IGhpc3RvcnlJ
dGVtRnJvbUJhY2tGb3J3YXJkSWQoaWQpOworICAgIEFTU0VSVChpdGVtKTsKKyAgICBpdGVtLT5k
ZXJlZigpOworfQorCit2b2lkIFdlYlBhZ2U6OmNsZWFyQnJvd3NpbmdEYXRhKCkKK3sKKyAgICBj
bGVhck1lbW9yeUNhY2hlcygpOworICAgIGNsZWFyQXBwQ2FjaGUoZC0+bV9wYWdlLT5ncm91cE5h
bWUoKSk7CisgICAgY2xlYXJMb2NhbFN0b3JhZ2UoKTsKKyAgICBjbGVhckNvb2tpZUNhY2hlKCk7
CisgICAgY2xlYXJIaXN0b3J5KCk7CisgICAgY2xlYXJQbHVnaW5TaXRlRGF0YSgpOworfQorCit2
b2lkIFdlYlBhZ2U6OmNsZWFySGlzdG9yeSgpCit7CisgICAgLy8gRG9uJ3QgY2xlYXIgdGhlIGJh
Y2stZm9yd2FyZCBsaXN0IGFzIHdlIG1pZ2h0IGxpa2UgdG8ga2VlcCBpdC4KK30KKwordm9pZCBX
ZWJQYWdlOjpjbGVhckNvb2tpZXMoKQoreworICAgIGNsZWFyQ29va2llQ2FjaGUoKTsKK30KKwor
dm9pZCBXZWJQYWdlOjpjbGVhckxvY2FsU3RvcmFnZSgpCit7CisgICAgQmxhY2tCZXJyeTo6V2Vi
S2l0OjpjbGVhckxvY2FsU3RvcmFnZShkLT5tX3BhZ2UtPmdyb3VwTmFtZSgpKTsKKyAgICBjbGVh
ckRhdGFiYXNlKGQtPm1fcGFnZS0+Z3JvdXBOYW1lKCkpOworfQorCit2b2lkIFdlYlBhZ2U6OmNs
ZWFyQ2FjaGUoKQoreworICAgIGNsZWFyTWVtb3J5Q2FjaGVzKCk7CisgICAgY2xlYXJBcHBDYWNo
ZShkLT5tX3BhZ2UtPmdyb3VwTmFtZSgpKTsKK30KKwordm9pZCBXZWJQYWdlOjpjbGVhckJhY2tG
b3J3YXJkTGlzdChib29sIGtlZXBDdXJyZW50UGFnZSkgY29uc3QKK3sKKyAgICBCYWNrRm9yd2Fy
ZExpc3RJbXBsKiBiYWNrRm9yd2FyZExpc3QgPSBzdGF0aWNfY2FzdDxCYWNrRm9yd2FyZExpc3RJ
bXBsKj4oZC0+bV9wYWdlLT5iYWNrRm9yd2FyZCgpLT5jbGllbnQoKSk7CisgICAgUmVmUHRyPEhp
c3RvcnlJdGVtPiBjdXJyZW50SXRlbSA9IGJhY2tGb3J3YXJkTGlzdC0+Y3VycmVudEl0ZW0oKTsK
KyAgICB3aGlsZSAoIWJhY2tGb3J3YXJkTGlzdC0+ZW50cmllcygpLmlzRW1wdHkoKSkKKyAgICAg
ICAgYmFja0ZvcndhcmRMaXN0LT5yZW1vdmVJdGVtKGJhY2tGb3J3YXJkTGlzdC0+ZW50cmllcygp
Lmxhc3QoKS5nZXQoKSk7CisgICAgaWYgKGtlZXBDdXJyZW50UGFnZSkKKyAgICAgICAgYmFja0Zv
cndhcmRMaXN0LT5hZGRJdGVtKGN1cnJlbnRJdGVtKTsKK30KKworYm9vbCBXZWJQYWdlOjppc0Vu
YWJsZUxvY2FsQWNjZXNzVG9BbGxDb29raWVzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gY29va2ll
TWFuYWdlcigpLmNhbkxvY2FsQWNjZXNzQWxsQ29va2llcygpOworfQorCit2b2lkIFdlYlBhZ2U6
OnNldEVuYWJsZUxvY2FsQWNjZXNzVG9BbGxDb29raWVzKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBj
b29raWVNYW5hZ2VyKCkuc2V0Q2FuTG9jYWxBY2Nlc3NBbGxDb29raWVzKGVuYWJsZWQpOworfQor
Cit2b2lkIFdlYlBhZ2U6OmFkZFZpc2l0ZWRMaW5rKGNvbnN0IHVuc2lnbmVkIHNob3J0KiB1cmws
IHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisgICAgQVNTRVJUKGQtPm1fcGFnZSk7CisgICAgZC0+
bV9wYWdlLT5ncm91cCgpLmFkZFZpc2l0ZWRMaW5rKHVybCwgbGVuZ3RoKTsKK30KKworI2lmIEVO
QUJMRShXRUJET00pCitXZWJET01Ob2RlIFdlYlBhZ2U6Om5vZGVBdFBvaW50KGludCB4LCBpbnQg
eSkKK3sKKyAgICBIaXRUZXN0UmVzdWx0IHJlc3VsdCA9IGQtPm1fbWFpbkZyYW1lLT5ldmVudEhh
bmRsZXIoKS0+aGl0VGVzdFJlc3VsdEF0UG9pbnQoZC0+bWFwRnJvbVRyYW5zZm9ybWVkKEludFBv
aW50KHgsIHkpKSwgZmFsc2UpOworICAgIE5vZGUqIG5vZGUgPSByZXN1bHQuaW5uZXJOb25TaGFy
ZWROb2RlKCk7CisgICAgcmV0dXJuIFdlYkRPTU5vZGUobm9kZSk7Cit9CisKK2Jvb2wgV2ViUGFn
ZTo6Z2V0Tm9kZVJlY3QoY29uc3QgV2ViRE9NTm9kZSYgbm9kZSwgUGxhdGZvcm06OkludFJlY3Qm
IHJlc3VsdCkKK3sKKyAgICBOb2RlKiBub2RlSW1wbCA9IG5vZGUuaW1wbCgpOworICAgIGlmIChu
b2RlSW1wbCAmJiBub2RlSW1wbC0+cmVuZGVyZXIoKSkgeworICAgICAgICByZXN1bHQgPSBub2Rl
SW1wbC0+Z2V0UmVjdCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK2Jvb2wgV2ViUGFnZTo6c2V0Tm9kZUZvY3VzKGNvbnN0IFdlYkRPTU5v
ZGUmIG5vZGUsIGJvb2wgb24pCit7CisgICAgTm9kZSogbm9kZUltcGwgPSBub2RlLmltcGwoKTsK
KworICAgIGlmIChub2RlSW1wbCAmJiBub2RlSW1wbC0+aXNGb2N1c2FibGUoKSkgeworICAgICAg
ICBEb2N1bWVudCogZG9jID0gbm9kZUltcGwtPmRvY3VtZW50KCk7CisgICAgICAgIGlmIChQYWdl
KiBwYWdlID0gZG9jLT5wYWdlKCkpIHsKKyAgICAgICAgICAgIC8vIE1vZGlmeSBpZiBmb2N1c2lu
ZyBvbiBub2RlIG9yIHR1cm5pbmcgb2ZmIGZvY3VzZWQgbm9kZS4KKyAgICAgICAgICAgIGlmIChv
bikgeworICAgICAgICAgICAgICAgIHBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5zZXRGb2N1c2Vk
Tm9kZShub2RlSW1wbCwgZG9jLT5mcmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAobm9kZUlt
cGwtPmlzRWxlbWVudE5vZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWxl
bWVudCo+KG5vZGVJbXBsKS0+dXBkYXRlRm9jdXNBcHBlYXJhbmNlKHRydWUpOworICAgICAgICAg
ICAgICAgIGQtPm1faW5wdXRIYW5kbGVyLT5kaWROb2RlT3BlblBvcHVwKG5vZGVJbXBsKTsKKyAg
ICAgICAgICAgIH0gZWxzZSBpZiAoZG9jLT5mb2N1c2VkTm9kZSgpID09IG5vZGVJbXBsKSAvLyAm
JiAhb24KKyAgICAgICAgICAgICAgICBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+c2V0Rm9jdXNl
ZE5vZGUoMCwgZG9jLT5mcmFtZSgpKTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFdlYlBhZ2U6OnNldE5v
ZGVIb3ZlcmVkKGNvbnN0IFdlYkRPTU5vZGUmIG5vZGUsIGJvb2wgb24pCit7CisgICAgaWYgKE5v
ZGUqIG5vZGVJbXBsID0gbm9kZS5pbXBsKCkpIHsKKyAgICAgICAgbm9kZUltcGwtPnNldEhvdmVy
ZWQob24pOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwor
fQorCitib29sIFdlYlBhZ2U6Om5vZGVIYXNIb3Zlcihjb25zdCBXZWJET01Ob2RlJiBub2RlKQor
eworICAgIGlmIChOb2RlKiBub2RlSW1wbCA9IG5vZGUuaW1wbCgpKSB7CisgICAgICAgIGlmIChS
ZW5kZXJTdHlsZSogc3R5bGUgPSBub2RlSW1wbC0+cmVuZGVyU3R5bGUoKSkKKyAgICAgICAgICAg
IHJldHVybiBzdHlsZS0+YWZmZWN0ZWRCeUhvdmVyUnVsZXMoKTsKKyAgICB9CisgICAgcmV0dXJu
IGZhbHNlOworfQorI2VuZGlmCisKK1N0cmluZyBXZWJQYWdlUHJpdmF0ZTo6ZmluZFBhdHRlcm5T
dHJpbmdGb3JVcmwoY29uc3QgS1VSTCYgdXJsKSBjb25zdAoreworICAgIGlmICgobV93ZWJTZXR0
aW5ncy0+c2hvdWxkSGFuZGxlUGF0dGVyblVybHMoKSAmJiBwcm90b2NvbElzKHVybCwgInBhdHRl
cm4iKSkKKyAgICAgICAgICAgIHx8IHByb3RvY29sSXModXJsLCAidGVsIikKKyAgICAgICAgICAg
IHx8IHByb3RvY29sSXModXJsLCAid3RhaSIpCisgICAgICAgICAgICB8fCBwcm90b2NvbElzKHVy
bCwgImN0aSIpCisgICAgICAgICAgICB8fCBwcm90b2NvbElzKHVybCwgIm1haWx0byIpCisgICAg
ICAgICAgICB8fCBwcm90b2NvbElzKHVybCwgInNtcyIpCisgICAgICAgICAgICB8fCBwcm90b2Nv
bElzKHVybCwgInBpbiIpKSB7CisgICAgICAgIHJldHVybiB1cmw7CisgICAgfQorICAgIHJldHVy
biBTdHJpbmcoKTsKK30KKworYm9vbCBXZWJQYWdlOjpkZWZlcnNMb2FkaW5nKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gZC0+bV9wYWdlLT5kZWZlcnNMb2FkaW5nKCk7Cit9CisKK2Jvb2wgV2ViUGFn
ZTo6d2lsbEZpcmVUaW1lcigpCit7CisgICAgaWYgKGQtPmlzTG9hZGluZygpKQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBkLT5tX2JhY2tpbmdTdG9yZS0+ZC0+d2lsbEZpcmVU
aW1lcigpOworfQorCit2b2lkIFdlYlBhZ2U6Om5vdGlmeVBhZ2VQYXVzZSgpCit7CisgICAgRk9S
X0VBQ0hfUExVR0lOVklFVyhkLT5tX3BsdWdpblZpZXdzKQorICAgICAgICAoKml0KS0+aGFuZGxl
UGF1c2VFdmVudCgpOworfQorCit2b2lkIFdlYlBhZ2U6Om5vdGlmeVBhZ2VSZXN1bWUoKQorewor
ICAgIEZPUl9FQUNIX1BMVUdJTlZJRVcoZC0+bV9wbHVnaW5WaWV3cykKKyAgICAgICAgKCppdCkt
PmhhbmRsZVJlc3VtZUV2ZW50KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90aWZ5UGFnZUJhY2tn
cm91bmQoKQoreworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBkLT5zdXNw
ZW5kUm9vdExheWVyQ29tbWl0KCk7CisjZW5kaWYKKworICAgIEZPUl9FQUNIX1BMVUdJTlZJRVco
ZC0+bV9wbHVnaW5WaWV3cykKKyAgICAgICAgKCppdCktPmhhbmRsZUJhY2tncm91bmRFdmVudCgp
OworfQorCit2b2lkIFdlYlBhZ2U6Om5vdGlmeVBhZ2VGb3JlZ3JvdW5kKCkKK3sKKyNpZiBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgZC0+cmVzdW1lUm9vdExheWVyQ29tbWl0KCk7
CisjZW5kaWYKKworICAgIEZPUl9FQUNIX1BMVUdJTlZJRVcoZC0+bV9wbHVnaW5WaWV3cykKKyAg
ICAgICAgKCppdCktPmhhbmRsZUZvcmVncm91bmRFdmVudCgpOworfQorCit2b2lkIFdlYlBhZ2U6
Om5vdGlmeVBhZ2VGdWxsU2NyZWVuQWxsb3dlZCgpCit7CisgICAgRk9SX0VBQ0hfUExVR0lOVklF
VyhkLT5tX3BsdWdpblZpZXdzKQorICAgICAgICAoKml0KS0+aGFuZGxlRnVsbFNjcmVlbkFsbG93
ZWRFdmVudCgpOworfQorCit2b2lkIFdlYlBhZ2U6Om5vdGlmeVBhZ2VGdWxsU2NyZWVuRXhpdCgp
Cit7CisgICAgRk9SX0VBQ0hfUExVR0lOVklFVyhkLT5tX3BsdWdpblZpZXdzKQorICAgICAgICAo
Kml0KS0+aGFuZGxlRnVsbFNjcmVlbkV4aXRFdmVudCgpOworfQorCit2b2lkIFdlYlBhZ2U6Om5v
dGlmeURldmljZUlkbGVTdGF0ZUNoYW5nZShib29sIGVudGVySWRsZSkKK3sKKyAgICBGT1JfRUFD
SF9QTFVHSU5WSUVXKGQtPm1fcGx1Z2luVmlld3MpCisgICAgICAgICgqaXQpLT5oYW5kbGVJZGxl
RXZlbnQoZW50ZXJJZGxlKTsKK30KKwordm9pZCBXZWJQYWdlOjpub3RpZnlBcHBBY3RpdmF0aW9u
U3RhdGVDaGFuZ2UoQWN0aXZhdGlvblN0YXRlVHlwZSBhY3RpdmF0aW9uU3RhdGUpCit7CisgICAg
SGFzaFNldDxQbHVnaW5WaWV3Kj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZC0+bV9wbHVnaW5WaWV3
cy5iZWdpbigpOworICAgIEhhc2hTZXQ8UGx1Z2luVmlldyo+Ojpjb25zdF9pdGVyYXRvciBsYXN0
ID0gZC0+bV9wbHVnaW5WaWV3cy5lbmQoKTsKKworI2lmIEVOQUJMRShWSURFTykKKyAgICBNZWRp
YVBsYXllclByaXZhdGU6Om5vdGlmeUFwcEFjdGl2YXRlZEV2ZW50KGFjdGl2YXRpb25TdGF0ZSA9
PSBBY3RpdmF0aW9uQWN0aXZlKTsKKyNlbmRpZgorCisgICAgZm9yICg7IGl0ICE9IGxhc3Q7ICsr
aXQpIHsKKyAgICAgICAgc3dpdGNoIChhY3RpdmF0aW9uU3RhdGUpIHsKKyAgICAgICAgY2FzZSBB
Y3RpdmF0aW9uQWN0aXZlOgorICAgICAgICAgICAgKCppdCktPmhhbmRsZUFwcEFjdGl2YXRlZEV2
ZW50KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBY3RpdmF0aW9uSW5hY3Rp
dmU6CisgICAgICAgICAgICAoKml0KS0+aGFuZGxlQXBwRGVhY3RpdmF0ZWRFdmVudCgpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWN0aXZhdGlvblN0YW5kYnk6CisgICAgICAg
ICAgICAoKml0KS0+aGFuZGxlQXBwU3RhbmRieUV2ZW50KCk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgZGVmYXVsdDogLy8gRklYTUU6IEdldCByaWQgb2YgdGhlIGRlZmF1bHQgdG8gZm9y
Y2UgYSBjb21waWxlciBlcnJvciBpbnN0ZWFkIG9mIHVzaW5nIGEgcnVudGltZSBlcnJvci4gU2Vl
IFBSICMxMjExMDkuCisgICAgICAgICAgICBBU1NFUlQoMCk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBXZWJQYWdlOjpub3RpZnlTd2lwZUV2ZW50KCkK
K3sKKyAgICBGT1JfRUFDSF9QTFVHSU5WSUVXKGQtPm1fcGx1Z2luVmlld3MpCisgICAgICAgKCpp
dCktPmhhbmRsZVN3aXBlRXZlbnQoKTsKK30KKwordm9pZCBXZWJQYWdlOjpub3RpZnlTY3JlZW5Q
b3dlclN0YXRlQ2hhbmdlZChib29sIHBvd2VyZWQpCit7CisgICAgRk9SX0VBQ0hfUExVR0lOVklF
VyhkLT5tX3BsdWdpblZpZXdzKQorICAgICAgICgqaXQpLT5oYW5kbGVTY3JlZW5Qb3dlckV2ZW50
KHBvd2VyZWQpOworfQorCit2b2lkIFdlYlBhZ2U6Om5vdGlmeUZ1bGxTY3JlZW5WaWRlb0V4aXRl
ZChib29sIGRvbmUpCit7CisgICAgVU5VU0VEX1BBUkFNKGRvbmUpOworI2lmIEVOQUJMRShWSURF
TykKKyAgICBpZiAoSFRNTE1lZGlhRWxlbWVudCogbWVkaWFFbGVtZW50ID0gc3RhdGljX2Nhc3Q8
SFRNTE1lZGlhRWxlbWVudCo+KGQtPm1fZnVsbHNjcmVlblZpZGVvTm9kZS5nZXQoKSkpCisgICAg
ICAgIG1lZGlhRWxlbWVudC0+ZXhpdEZ1bGxzY3JlZW4oKTsKKyNlbmRpZgorfQorCit2b2lkIFdl
YlBhZ2U6OmNsZWFyUGx1Z2luU2l0ZURhdGEoKQoreworICAgIFBsdWdpbkRhdGFiYXNlKiBkYXRh
YmFzZSA9IFBsdWdpbkRhdGFiYXNlOjppbnN0YWxsZWRQbHVnaW5zKHRydWUpOworCisgICAgaWYg
KCFkYXRhYmFzZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgVmVjdG9yPFBsdWdpblBhY2thZ2Uq
PiBwbHVnaW5zID0gZGF0YWJhc2UtPnBsdWdpbnMoKTsKKworICAgIFZlY3RvcjxQbHVnaW5QYWNr
YWdlKj46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHBsdWdpbnMuZW5kKCk7CisgICAgZm9yIChWZWN0
b3I8UGx1Z2luUGFja2FnZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHBsdWdpbnMuYmVnaW4oKTsg
aXQgIT0gZW5kOyArK2l0KQorICAgICAgICAoKml0KS0+Y2xlYXJTaXRlRGF0YShTdHJpbmcoKSk7
Cit9CisKK3ZvaWQgV2ViUGFnZTo6b25JbnB1dExvY2FsZUNoYW5nZWQoYm9vbCBpc1JUTCkKK3sK
KyAgICBkLT5vbklucHV0TG9jYWxlQ2hhbmdlZChpc1JUTCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6
b25OZXR3b3JrQXZhaWxhYmlsaXR5Q2hhbmdlZChib29sIGF2YWlsYWJsZSkKK3sKKyAgICB1cGRh
dGVPbmxpbmVTdGF0dXMoYXZhaWxhYmxlKTsKK30KKwordm9pZCBXZWJQYWdlOjpvbkNlcnRpZmlj
YXRlU3RvcmVMb2NhdGlvblNldChjb25zdCBXZWJTdHJpbmcmIGNhUGF0aCkKK3sKKyNpZiBFTkFC
TEUoVklERU8pCisgICAgTWVkaWFQbGF5ZXJQcml2YXRlOjpzZXRDZXJ0aWZpY2F0ZVBhdGgoY2FQ
YXRoKTsKKyNlbmRpZgorfQorCit2b2lkIFdlYlBhZ2U6OmVuYWJsZVdlYkluc3BlY3RvcigpCit7
CisgICAgZC0+bV9wYWdlLT5pbnNwZWN0b3JDb250cm9sbGVyKCktPmNvbm5lY3RGcm9udGVuZCgp
OworICAgIGQtPm1fcGFnZS0+c2V0dGluZ3MoKS0+c2V0RGV2ZWxvcGVyRXh0cmFzRW5hYmxlZCh0
cnVlKTsKK30KKwordm9pZCBXZWJQYWdlOjpkaXNhYmxlV2ViSW5zcGVjdG9yKCkKK3sKKyAgICBk
LT5tX3BhZ2UtPmluc3BlY3RvckNvbnRyb2xsZXIoKS0+ZGlzY29ubmVjdEZyb250ZW5kKCk7Cisg
ICAgZC0+bV9wYWdlLT5zZXR0aW5ncygpLT5zZXREZXZlbG9wZXJFeHRyYXNFbmFibGVkKGZhbHNl
KTsKK30KKwordm9pZCBXZWJQYWdlOjplbmFibGVQYXNzd29yZEVjaG8oKQoreworICAgIGQtPm1f
cGFnZS0+c2V0dGluZ3MoKS0+c2V0UGFzc3dvcmRFY2hvRW5hYmxlZCh0cnVlKTsKK30KKwordm9p
ZCBXZWJQYWdlOjpkaXNhYmxlUGFzc3dvcmRFY2hvKCkKK3sKKyAgICBkLT5tX3BhZ2UtPnNldHRp
bmdzKCktPnNldFBhc3N3b3JkRWNob0VuYWJsZWQoZmFsc2UpOworfQorCit2b2lkIFdlYlBhZ2U6
OmRpc3BhdGNoSW5zcGVjdG9yTWVzc2FnZShjb25zdCBjaGFyKiBtZXNzYWdlLCBpbnQgbGVuZ3Ro
KQoreworICAgIFN0cmluZyBzdHJpbmdNZXNzYWdlKG1lc3NhZ2UsIGxlbmd0aCk7CisgICAgZC0+
bV9wYWdlLT5pbnNwZWN0b3JDb250cm9sbGVyKCktPmRpc3BhdGNoTWVzc2FnZUZyb21Gcm9udGVu
ZChzdHJpbmdNZXNzYWdlKTsKK30KKworRnJhbWUqIFdlYlBhZ2U6Om1haW5GcmFtZSgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIGQtPm1fbWFpbkZyYW1lOworfQorCisjaWYgVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQordm9pZCBXZWJQYWdlUHJpdmF0ZTo6ZHJhd0xheWVyc09uQ29tbWl0KCkK
K3sKKyAgICBpZiAoIVBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgp
LT5pc0N1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICAvLyBUaGlzIG1ldGhvZCB3aWxsIG9ubHkg
YmUgY2FsbGVkIHdoZW4gdGhlIGxheWVyIGFwcGVhcmFuY2UgY2hhbmdlZCBkdWUgdG8KKyAgICAg
ICAgLy8gYW5pbWF0aW9ucy4gQW5kIG9ubHkgaWYgd2UgZG9uJ3QgbmVlZCBhIG9uZSBzaG90IGRy
YXdpbmcgc3luYy4KKyAgICAgICAgQVNTRVJUKCFuZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25p
emF0aW9uKCkpOworCisgICAgICAgIGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUoKSB8fCAhbV9i
YWNraW5nU3RvcmUtPmQtPmlzQWN0aXZlKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAg
ICAgbV9iYWNraW5nU3RvcmUtPmQtPndpbGxEcmF3TGF5ZXJzT25Db21taXQoKTsKKworICAgICAg
ICBQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+ZGlzcGF0Y2hN
ZXNzYWdlKAorICAgICAgICAgICAgUGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKCZX
ZWJQYWdlUHJpdmF0ZTo6ZHJhd0xheWVyc09uQ29tbWl0LCB0aGlzKSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAobV9jbGllbnQtPndpbmRvdygpLT53aW5kb3dVc2FnZSgpID09
IFBsYXRmb3JtOjpHcmFwaGljczo6V2luZG93OjpHTEVTMlVzYWdlKSB7CisgICAgICAgIG1fYmFj
a2luZ1N0b3JlLT5kLT5ibGl0VmlzaWJsZUNvbnRlbnRzKCk7CisgICAgICAgIHJldHVybjsgLy8g
YmxpdFZpc2libGVDb250ZW50cygpIGluY2x1ZGVzIGRyYXdTdWJMYXllcnMoKSBpbiB0aGlzIGNh
c2UuCisgICAgfQorCisgICAgaWYgKCFkcmF3U3ViTGF5ZXJzKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIC8vIElmIHdlIHVzZSB0aGUgY29tcG9zaXRpbmcgc3VyZmFjZSwgd2UgbmVlZCB0byBy
ZS1ibGl0IHRoZQorICAgIC8vIGJhY2tpbmdzdG9yZSBhbmQgYmxlbmQgdGhlIGNvbXBvc2l0aW5n
IHN1cmZhY2Ugb24gdG9wIG9mIHRoYXQKKyAgICAvLyBpbiBvcmRlciB0byBnZXQgdGhlIG5ld2x5
IGRyYXduIGxheWVycyBvbiBzY3JlZW4uCisgICAgaWYgKCFTdXJmYWNlUG9vbDo6Z2xvYmFsU3Vy
ZmFjZVBvb2woKS0+Y29tcG9zaXRpbmdTdXJmYWNlKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IC8vIElmIHRoZXJlIGFyZSBubyB2aXNpYmxlIGxheWVycywgcmV0dXJuIGVhcmx5LgorICAgIGlm
IChsYXN0Q29tcG9zaXRpbmdSZXN1bHRzKCkuaXNFbXB0eSgpICYmIGxhc3RDb21wb3NpdGluZ1Jl
c3VsdHMoKS53YXNFbXB0eSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fYmFja2luZ1N0
b3JlLT5kLT5zaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKQorICAgICAgICByZXR1cm47
CisKKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+YmxpdFZpc2libGVDb250ZW50cygpOworfQorCiti
b29sIFdlYlBhZ2VQcml2YXRlOjpkcmF3U3ViTGF5ZXJzKGNvbnN0IEludFJlY3QmIGRzdFJlY3Qs
IGNvbnN0IEZsb2F0UmVjdCYgY29udGVudHMpCit7CisgICAgQVNTRVJUKFBsYXRmb3JtOjp1c2Vy
SW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSk7CisgICAg
aWYgKCFQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJy
ZW50VGhyZWFkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChtX2NvbXBvc2l0
b3IpIHsKKyAgICAgICAgbV9jb21wb3NpdG9yLT5zZXRDb21wb3NpdGluZ09udG9NYWluV2luZG93
KAorICAgICAgICAgICAgbV9jbGllbnQtPndpbmRvdygpLT53aW5kb3dVc2FnZSgpID09IFBsYXRm
b3JtOjpHcmFwaGljczo6V2luZG93OjpHTEVTMlVzYWdlKTsKKyAgICAgICAgcmV0dXJuIG1fY29t
cG9zaXRvci0+ZHJhd0xheWVycyhkc3RSZWN0LCBjb250ZW50cyk7CisgICAgfQorCisgICAgcmV0
dXJuIGZhbHNlOworfQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpkcmF3U3ViTGF5ZXJzKCkKK3sK
KyAgICBBU1NFUlQoUGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCkt
PmlzQ3VycmVudFRocmVhZCgpKTsKKyAgICBpZiAoIVBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhy
ZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgcmV0dXJuIG1fYmFja2luZ1N0b3JlLT5kLT5kcmF3U3ViTGF5ZXJzKCk7Cit9
CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNjaGVkdWxlUm9vdExheWVyQ29tbWl0KCkKK3sKKyAg
ICBpZiAoIW1fZnJhbWVMYXllcnMgfHwgIW1fZnJhbWVMYXllcnMtPmhhc0xheWVyKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1fbmVlZHNDb21taXQgPSB0cnVlOworICAgIGlmICghbV9yb290
TGF5ZXJDb21taXRUaW1lci0+aXNBY3RpdmUoKSkKKyAgICAgICAgbV9yb290TGF5ZXJDb21taXRU
aW1lci0+c3RhcnRPbmVTaG90KDApOworfQorCitzdGF0aWMgYm9vbCBuZWVkc0xheW91dFJlY3Vy
c2l2ZShGcmFtZVZpZXcqIHZpZXcpCit7CisgICAgaWYgKHZpZXctPm5lZWRzTGF5b3V0KCkpCisg
ICAgICAgIHJldHVybiB0cnVlOworCisgICAgYm9vbCBzdWJmcmFtZXNOZWVkc0xheW91dCA9IGZh
bHNlOworICAgIGNvbnN0IEhhc2hTZXQ8UmVmUHRyPFdpZGdldD4gPiogdmlld0NoaWxkcmVuID0g
dmlldy0+Y2hpbGRyZW4oKTsKKyAgICBIYXNoU2V0PFJlZlB0cjxXaWRnZXQ+ID46OmNvbnN0X2l0
ZXJhdG9yIGVuZCA9IHZpZXdDaGlsZHJlbi0+ZW5kKCk7CisgICAgZm9yIChIYXNoU2V0PFJlZlB0
cjxXaWRnZXQ+ID46OmNvbnN0X2l0ZXJhdG9yIGN1cnJlbnQgPSB2aWV3Q2hpbGRyZW4tPmJlZ2lu
KCk7IGN1cnJlbnQgIT0gZW5kICYmICFzdWJmcmFtZXNOZWVkc0xheW91dDsgKytjdXJyZW50KSB7
CisgICAgICAgIFdpZGdldCogd2lkZ2V0ID0gKCpjdXJyZW50KS5nZXQoKTsKKyAgICAgICAgaWYg
KHdpZGdldC0+aXNGcmFtZVZpZXcoKSkKKyAgICAgICAgICAgIHN1YmZyYW1lc05lZWRzTGF5b3V0
IHw9IG5lZWRzTGF5b3V0UmVjdXJzaXZlKHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHdpZGdldCkp
OworICAgIH0KKworICAgIHJldHVybiBzdWJmcmFtZXNOZWVkc0xheW91dDsKK30KKworTGF5ZXJS
ZW5kZXJpbmdSZXN1bHRzIFdlYlBhZ2VQcml2YXRlOjpsYXN0Q29tcG9zaXRpbmdSZXN1bHRzKCkg
Y29uc3QKK3sKKyAgICBpZiAobV9jb21wb3NpdG9yKQorICAgICAgICByZXR1cm4gbV9jb21wb3Np
dG9yLT5sYXN0Q29tcG9zaXRpbmdSZXN1bHRzKCk7CisgICAgcmV0dXJuIExheWVyUmVuZGVyaW5n
UmVzdWx0cygpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpjb21taXRSb290TGF5ZXIoY29u
c3QgSW50UmVjdCYgbGF5b3V0UmVjdEZvckNvbXBvc2l0aW5nLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnN0IEludFNpemUmIGNvbnRlbnRzU2l6ZUZvckNvbXBvc2l0
aW5nKQoreworICAgIGlmICghbV9mcmFtZUxheWVycyB8fCAhbV9jb21wb3NpdG9yKQorICAgICAg
ICByZXR1cm47CisKKyAgICBtX2NvbXBvc2l0b3ItPnNldExheW91dFJlY3RGb3JDb21wb3NpdGlu
ZyhsYXlvdXRSZWN0Rm9yQ29tcG9zaXRpbmcpOworICAgIG1fY29tcG9zaXRvci0+c2V0Q29udGVu
dHNTaXplRm9yQ29tcG9zaXRpbmcoY29udGVudHNTaXplRm9yQ29tcG9zaXRpbmcpOworICAgIG1f
Y29tcG9zaXRvci0+Y29tbWl0KG1fZnJhbWVMYXllcnMtPnJvb3RMYXllcigpKTsKK30KKworYm9v
bCBXZWJQYWdlUHJpdmF0ZTo6Y29tbWl0Um9vdExheWVySWZOZWVkZWQoKQoreworICAgIGlmICht
X3N1c3BlbmRSb290TGF5ZXJDb21taXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlm
ICghbV9uZWVkc0NvbW1pdCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFtX2Zy
YW1lTGF5ZXJzIHx8ICFtX2ZyYW1lTGF5ZXJzLT5oYXNMYXllcigpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBGcmFtZVZpZXcqIHZpZXcgPSBtX21haW5GcmFtZS0+dmlldygpOworICAg
IGlmICghdmlldykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWYgd2Ugc3luYyBj
b21wb3NpdGluZyBsYXllcnMgd2hlbiBhIGxheW91dCBpcyBwZW5kaW5nLCB3ZSBtYXkgY2F1c2Ug
cGFpbnRpbmcgb2YgY29tcG9zaXRpbmcKKyAgICAvLyBsYXllciBjb250ZW50IHRvIG9jY3VyIGJl
Zm9yZSBsYXlvdXQgaGFzIGhhcHBlbmVkLCB3aGljaCB3aWxsIGNhdXNlIHBhaW50Q29udGVudHMo
KSB0byBiYWlsLgorICAgIGlmIChuZWVkc0xheW91dFJlY3Vyc2l2ZSh2aWV3KSkgeworICAgICAg
ICAvLyBJbiBjYXNlIG9mIG9uZSBzaG90IGRyYXdpbmcgc3luY2hyb25pemF0aW9uLCB5b3UKKyAg
ICAgICAgLy8gc2hvdWxkIGZpcnN0IGxheW91dElmTmVlZGVkLCByZW5kZXIsIHRoZW4gY29tbWl0
IGFuZCBkcmF3IHRoZSBsYXllcnMuCisgICAgICAgIEFTU0VSVCghbmVlZHNPbmVTaG90RHJhd2lu
Z1N5bmNocm9uaXphdGlvbigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAg
IG1fbmVlZHNDb21taXQgPSBmYWxzZTsKKyAgICAvLyBXZSBnZXQgaGVyZSBlaXRoZXIgZHVlIHRv
IHRoZSBjb21taXQgdGltZXIsIHdoaWNoIHdvdWxkIGhhdmUgY2FsbGVkCisgICAgLy8gcmVuZGVy
IGlmIGEgb25lIHNob3Qgc3luYyB3YXMgbmVlZGVkLiBPciB3ZSBnZXQgY2FsbGVkIGZyb20gcmVu
ZGVyCisgICAgLy8gYmVmb3JlIHRoZSB0aW1lciB0aW1lcyBvdXQsIHdoaWNoIG1lYW5zIHdlIGFy
ZSBkb2luZyBhIG9uZSBzaG90IGFueXdheS4KKyAgICBtX25lZWRzT25lU2hvdERyYXdpbmdTeW5j
aHJvbml6YXRpb24gPSBmYWxzZTsKKworICAgIGlmIChtX3Jvb3RMYXllckNvbW1pdFRpbWVyLT5p
c0FjdGl2ZSgpKQorICAgICAgICBtX3Jvb3RMYXllckNvbW1pdFRpbWVyLT5zdG9wKCk7CisKKyAg
ICBtX2ZyYW1lTGF5ZXJzLT5jb21taXRPbldlYktpdFRocmVhZChjdXJyZW50U2NhbGUoKSk7Cisg
ICAgdXBkYXRlRGVsZWdhdGVkT3ZlcmxheXMoKTsKKworICAgIC8vIFN0YXNoIHRoZSB2aXNpYmxl
IGNvbnRlbnQgcmVjdCBhY2NvcmRpbmcgdG8gd2Via2l0IHRocmVhZAorICAgIC8vIFRoaXMgaXMg
dGhlIHJlY3RhbmdsZSB1c2VkIHRvIGxheW91dCBmaXhlZCBwb3NpdGlvbmVkIGVsZW1lbnRzLAor
ICAgIC8vIGFuZCB0aGF0J3Mgd2hhdCB0aGUgbGF5ZXIgcmVuZGVyZXIgd2FudHMuCisgICAgSW50
UmVjdCBsYXlvdXRSZWN0Rm9yQ29tcG9zaXRpbmcoc2Nyb2xsUG9zaXRpb24oKSwgYWN0dWFsVmlz
aWJsZVNpemUoKSk7CisgICAgSW50U2l6ZSBjb250ZW50c1NpemVGb3JDb21wb3NpdGluZyA9IGNv
bnRlbnRzU2l6ZSgpOworCisgICAgLy8gQ29tbWl0IGNoYW5nZXMgbWFkZSB0byB0aGUgbGF5ZXJz
IHN5bmNocm9ub3VzbHkgd2l0aCB0aGUgY29tcG9zaXRpbmcgdGhyZWFkLgorICAgIFBsYXRmb3Jt
Ojp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5kaXNwYXRjaFN5bmNNZXNzYWdl
KAorICAgICAgICBQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoCisgICAgICAgICAg
ICAmV2ViUGFnZVByaXZhdGU6OmNvbW1pdFJvb3RMYXllciwKKyAgICAgICAgICAgIHRoaXMsCisg
ICAgICAgICAgICBsYXlvdXRSZWN0Rm9yQ29tcG9zaXRpbmcsCisgICAgICAgICAgICBjb250ZW50
c1NpemVGb3JDb21wb3NpdGluZykpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgV2Vi
UGFnZVByaXZhdGU6OnJvb3RMYXllckNvbW1pdFRpbWVyRmlyZWQoVGltZXI8V2ViUGFnZVByaXZh
dGU+KikKK3sKKyAgICBpZiAobV9zdXNwZW5kUm9vdExheWVyQ29tbWl0KQorICAgICAgICByZXR1
cm47CisKKyAgICAvLyBUaGUgY29tbWl0IHRpbWVyIG1heSBoYXZlIGZpcmVkIGp1c3QgYmVmb3Jl
IHRoZSBsYXlvdXQgdGltZXIsIG9yIGZvciBzb21lCisgICAgLy8gb3RoZXIgcmVhc29uIHdlIG5l
ZWQgbGF5b3V0LiBJdCdzIG5vdCBhbGxvd2VkIHRvIGNvbW1pdCB3aGVuIGEgbGF5b3V0IGlzCisg
ICAgLy8gcGVuZGluZywgYmVjYXVlcyBhIGNvbW1pdCBjYW4gY2F1c2UgcGFydHMgb2YgdGhlIHdl
YiBwYWdlIHRvIGJlIHJlbmRlcmVkCisgICAgLy8gdG8gdGV4dHVyZS4KKyAgICAvLyBUaGUgbGF5
b3V0IGNhbiBhbHNvIHR1cm4gb2YgY29tcG9zaXRpbmcgYWx0b2dldGhlciwgc28gd2UgbmVlZCB0
byBiZSBwcmVwYXJlZAorICAgIC8vIHRvIGhhbmRsZSBhIG9uZSBzaG90IGRyYXdpbmcgc3luY2hy
b25pemF0aW9uIGFmdGVyIHRoZSBsYXlvdXQuCisgICAgcmVxdWVzdExheW91dElmTmVlZGVkKCk7
CisKKyAgICBib29sIGlzU2luZ2xlVGFyZ2V0V2luZG93ID0gU3VyZmFjZVBvb2w6Omdsb2JhbFN1
cmZhY2VQb29sKCktPmNvbXBvc2l0aW5nU3VyZmFjZSgpCisgICAgICAgIHx8IG1fY2xpZW50LT53
aW5kb3coKS0+d2luZG93VXNhZ2UoKSA9PSBQbGF0Zm9ybTo6R3JhcGhpY3M6OldpbmRvdzo6R0xF
UzJVc2FnZTsKKworICAgIC8vIElmIHdlIGFyZSBkb2luZyBkaXJlY3QgcmVuZGVyaW5nIGFuZCBo
YXZlIGEgc2luZ2xlIHJlbmRlcmluZyB0YXJnZXQsCisgICAgLy8gY29tbWl0dGluZyBpcyBlcXVp
dmFsZW50IHRvIGEgb25lIHNob3QgZHJhd2luZyBzeW5jaHJvbml6YXRpb24uCisgICAgLy8gV2Ug
bmVlZCB0byByZS1yZW5kZXIgdGhlIHdlYiBwYWdlLCByZS1yZW5kZXIgdGhlIGxheWVycywgYW5k
CisgICAgLy8gdGhlbiBibGl0IHRoZW0gb24gdG9wIG9mIHRoZSByZS1yZW5kZXJlZCB3ZWIgcGFn
ZS4KKyAgICBpZiAoaXNTaW5nbGVUYXJnZXRXaW5kb3cgJiYgbV9iYWNraW5nU3RvcmUtPmQtPnNo
b3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpCisgICAgICAgIHNldE5lZWRzT25lU2hvdERy
YXdpbmdTeW5jaHJvbml6YXRpb24oKTsKKworICAgIGlmIChuZWVkc09uZVNob3REcmF3aW5nU3lu
Y2hyb25pemF0aW9uKCkpIHsKKyAgICAgICAgY29uc3QgSW50UmVjdCB3aW5kb3dSZWN0ID0gSW50
UmVjdChJbnRQb2ludDo6emVybygpLCB2aWV3cG9ydFNpemUoKSk7CisgICAgICAgIG1fYmFja2lu
Z1N0b3JlLT5kLT5yZXBhaW50KHdpbmRvd1JlY3QsIHRydWUgLypjb250ZW50Q2hhbmdlZCovLCB0
cnVlIC8qaW1tZWRpYXRlKi8pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYg
dGhlIHdlYiBwYWdlIG5lZWRzIGxheW91dCwgdGhlIGNvbW1pdCB3aWxsIGZhaWwuCisgICAgLy8g
Tm8gbmVlZCB0byBkcmF3IHRoZSBsYXllcnMgaWYgbm90aGluZyBjaGFuZ2VkLgorICAgIGlmIChj
b21taXRSb290TGF5ZXJJZk5lZWRlZCgpKQorICAgICAgICBkcmF3TGF5ZXJzT25Db21taXQoKTsK
K30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0SXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nQWN0
aXZlKGJvb2wgYWN0aXZlKQoreworICAgIC8vIEJhY2tpbmcgc3RvcmUgY2FuIGJlIG51bGwgaGVy
ZSBiZWNhdXNlIGl0IGhhcHBlbnMgZHVyaW5nIHRlYXJkb3duLgorICAgIGlmIChtX2lzQWNjZWxl
cmF0ZWRDb21wb3NpdGluZ0FjdGl2ZSA9PSBhY3RpdmUgfHwgIW1fYmFja2luZ1N0b3JlKQorICAg
ICAgICByZXR1cm47CisKKyAgICBtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGluZ0FjdGl2ZSA9IGFj
dGl2ZTsKKworICAgIGlmICghYWN0aXZlKSB7CisgICAgICAgIG1fY29tcG9zaXRvci5jbGVhcigp
OworICAgICAgICByZXNldENvbXBvc2l0aW5nU3VyZmFjZSgpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgaWYgKCFtX2NvbXBvc2l0b3IpIHsKKyAgICAgICAgbV9jb21wb3NpdG9yID0g
YWRvcHRQdHIobmV3IFdlYlBhZ2VDb21wb3NpdG9yKHRoaXMpKTsKKyAgICAgICAgbV9pc0FjY2Vs
ZXJhdGVkQ29tcG9zaXRpbmdBY3RpdmUgPSBtX2NvbXBvc2l0b3ItPmhhcmR3YXJlQ29tcG9zaXRp
bmcoKTsKKyAgICAgICAgaWYgKCFtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGluZ0FjdGl2ZSkKKyAg
ICAgICAgICAgIG1fY29tcG9zaXRvci5jbGVhcigpOworICAgIH0KK30KKwordm9pZCBXZWJQYWdl
UHJpdmF0ZTo6cmVzZXRDb21wb3NpdGluZ1N1cmZhY2UoKQoreworICAgIGlmICghUGxhdGZvcm06
OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKSB7
CisgICAgICAgIFBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5k
aXNwYXRjaE1lc3NhZ2UoCisgICAgICAgICAgICBQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1l
c3NhZ2UoCisgICAgICAgICAgICAgICAgJldlYlBhZ2VQcml2YXRlOjpyZXNldENvbXBvc2l0aW5n
U3VyZmFjZSwgdGhpcykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1fY29t
cG9zaXRvcikKKyAgICAgICAgbV9jb21wb3NpdG9yLT5zZXRMYXN0Q29tcG9zaXRpbmdSZXN1bHRz
KExheWVyUmVuZGVyaW5nUmVzdWx0cygpKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0
Um9vdExheWVyV2ViS2l0VGhyZWFkKEZyYW1lKiBmcmFtZSwgTGF5ZXJXZWJLaXRUaHJlYWQqIGxh
eWVyKQoreworICAgIC8vIFRoaXMgbWV0aG9kIHVwZGF0ZXMgdGhlIEZyYW1lTGF5ZXJzIGJhc2Vk
IG9uIGlucHV0IGZyb20gV2ViQ29yZS4KKyAgICAvLyBGcmFtZUxheWVycyBrZWVwcyB0cmFjayBv
ZiB0aGUgbGF5ZXIgcHJveGllcyBhdHRhY2hlZCB0byBmcmFtZXMuCisgICAgLy8gV2Ugd2lsbCBo
YXZlIHRvIGNvbXB1dGUgYSBuZXcgcm9vdCBsYXllciBhbmQgdXBkYXRlIHRoZSBjb21wb3NpdG9y
LgorICAgIGlmICghbGF5ZXIgJiYgIW1fZnJhbWVMYXllcnMpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGlmICghbGF5ZXIpIHsKKyAgICAgICAgIEFTU0VSVChtX2ZyYW1lTGF5ZXJzKTsKKyAgICAg
ICAgIG1fZnJhbWVMYXllcnMtPnJlbW92ZUxheWVyQnlGcmFtZShmcmFtZSk7CisgICAgICAgICBp
ZiAoIW1fZnJhbWVMYXllcnMtPmhhc0xheWVyKCkpCisgICAgICAgICAgICAgbV9mcmFtZUxheWVy
cy5jbGVhcigpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghbV9mcmFtZUxheWVycykKKyAg
ICAgICAgICAgIG1fZnJhbWVMYXllcnMgPSBhZG9wdFB0cihuZXcgRnJhbWVMYXllcnModGhpcykp
OworCisgICAgICAgIGlmICghbV9mcmFtZUxheWVycy0+Y29udGFpbnNMYXllckZvckZyYW1lKGZy
YW1lKSkKKyAgICAgICAgICAgIG1fZnJhbWVMYXllcnMtPmFkZExheWVyKGZyYW1lLCBsYXllcik7
CisKKyAgICAgICAgQVNTRVJUKG1fZnJhbWVMYXllcnMpOworICAgIH0KKworICAgIExheWVyQ29t
cG9zaXRpbmdUaHJlYWQqIHJvb3RMYXllckNvbXBvc2l0aW5nVGhyZWFkID0gMDsKKyAgICBpZiAo
bV9mcmFtZUxheWVycyAmJiBtX2ZyYW1lTGF5ZXJzLT5yb290TGF5ZXIoKSkKKyAgICAgICAgcm9v
dExheWVyQ29tcG9zaXRpbmdUaHJlYWQgPSBtX2ZyYW1lTGF5ZXJzLT5yb290TGF5ZXIoKS0+bGF5
ZXJDb21wb3NpdGluZ1RocmVhZCgpOworCisgICAgc2V0Um9vdExheWVyQ29tcG9zaXRpbmdUaHJl
YWQocm9vdExheWVyQ29tcG9zaXRpbmdUaHJlYWQpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRl
OjpzZXRSb290TGF5ZXJDb21wb3NpdGluZ1RocmVhZChMYXllckNvbXBvc2l0aW5nVGhyZWFkKiBs
YXllcikKK3sKKyAgICBpZiAoIVBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNs
aWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICBQbGF0Zm9ybTo6dXNlckludGVy
ZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+ZGlzcGF0Y2hTeW5jTWVzc2FnZSgKKyAgICAgICAg
ICAgIFBsYXRmb3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSgmV2ViUGFnZVByaXZhdGU6OnNl
dFJvb3RMYXllckNvbXBvc2l0aW5nVGhyZWFkLCB0aGlzLCBsYXllcikpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgLy8gRGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgaGF2ZSBhIHJvb3Qg
bGF5ZXIgb3Igbm90LAorICAgIC8vIHRoaXMgbWV0aG9kIHdpbGwgdHVybiBvbiBvciBvZmYgYWNj
ZWxlcmF0ZWQgY29tcG9zaXRpbmcuCisgICAgaWYgKCFsYXllcikgeworICAgICAgICAgLy8gRG9u
J3QgQVNTRVJUKG1fY29tcG9zaXRvcikgaGVyZSBiZWNhdXNlIHdlIG1heSBiZSBjYWxsZWQgaW4K
KyAgICAgICAgIC8vIHRoZSBwcm9jZXNzIG9mIGRlc3RydWN0aW9uIG9mIFdlYlBhZ2Ugd2hlcmUg
d2UgaGF2ZSBhbHJlYWR5CisgICAgICAgICAvLyBjYWxsZWQgc3luY0Rlc3Ryb3lDb21wb3NpdG9y
T25Db21wb3NpdGluZ1RocmVhZCgpIHRvIGRlc3Ryb3kKKyAgICAgICAgIC8vIHRoZSBjb21wb3Np
dG9yLgorICAgICAgICAgc2V0SXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nQWN0aXZlKGZhbHNlKTsK
KyAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIW1fY29tcG9zaXRvcikKKyAgICAg
ICAgc2V0SXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nQWN0aXZlKHRydWUpOworCisgICAgLy8gRG9u
J3QgQVNTRVJUKG1fY29tcG9zaXRvcikgaGVyZSBiZWNhdXNlIHNldElzQWNjZWxlcmF0ZWRDb21w
b3NpdGluZ0FjdGl2ZSh0cnVlKQorICAgIC8vIG1heSBub3QgdHVybiBhY2NlbGVyYXRlZCBjb21w
b3NpdGluZyBvbiBzaW5jZSBtX2JhY2tpbmdTdG9yZSBpcyAwLgorICAgIGlmIChtX2NvbXBvc2l0
b3IpCisgICAgICAgIG1fY29tcG9zaXRvci0+c2V0Um9vdExheWVyKGxheWVyKTsKK30KKwordm9p
ZCBXZWJQYWdlUHJpdmF0ZTo6ZGVzdHJveUNvbXBvc2l0b3IoKQoreworICAgICBtX2NvbXBvc2l0
b3IuY2xlYXIoKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c3luY0Rlc3Ryb3lDb21wb3Np
dG9yT25Db21wb3NpdGluZ1RocmVhZCgpCit7CisgICAgaWYgKCFtX2NvbXBvc2l0b3IpCisgICAg
ICAgIHJldHVybjsKKworICAgIFBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNs
aWVudCgpLT5kaXNwYXRjaFN5bmNNZXNzYWdlKAorICAgICAgICBQbGF0Zm9ybTo6Y3JlYXRlTWV0
aG9kQ2FsbE1lc3NhZ2UoCisgICAgICAgICAgICAmV2ViUGFnZVByaXZhdGU6OmRlc3Ryb3lDb21w
b3NpdG9yLCB0aGlzKSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmRlc3Ryb3lMYXllclJl
c291cmNlcygpCit7CisgICAgIG1fY29tcG9zaXRvci0+cmVsZWFzZUxheWVyUmVzb3VyY2VzKCk7
Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnN1c3BlbmRSb290TGF5ZXJDb21taXQoKQorewor
ICAgIGlmIChtX3N1c3BlbmRSb290TGF5ZXJDb21taXQpCisgICAgICAgIHJldHVybjsKKworICAg
IG1fc3VzcGVuZFJvb3RMYXllckNvbW1pdCA9IHRydWU7CisKKyAgICBpZiAoIW1fZnJhbWVMYXll
cnMgfHwgIW1fZnJhbWVMYXllcnMtPmhhc0xheWVyKCkgfHwgIW1fY29tcG9zaXRvcikKKyAgICAg
ICAgcmV0dXJuOworCisgICAgUGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xp
ZW50KCktPmRpc3BhdGNoU3luY01lc3NhZ2UoCisgICAgICAgIFBsYXRmb3JtOjpjcmVhdGVNZXRo
b2RDYWxsTWVzc2FnZSgmV2ViUGFnZVByaXZhdGU6OmRlc3Ryb3lMYXllclJlc291cmNlcywgdGhp
cykpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpyZXN1bWVSb290TGF5ZXJDb21taXQoKQor
eworICAgIGlmICghbV9zdXNwZW5kUm9vdExheWVyQ29tbWl0KQorICAgICAgICByZXR1cm47CisK
KyAgICBtX3N1c3BlbmRSb290TGF5ZXJDb21taXQgPSBmYWxzZTsKKyAgICBtX25lZWRzQ29tbWl0
ID0gdHJ1ZTsKKworICAgIC8vIFJlY3JlYXRlIGxheWVyIHJlc291cmNlcyBpZiBuZWVkZWQuCisg
ICAgY29tbWl0Um9vdExheWVySWZOZWVkZWQoKTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6
bmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpCit7CisgICAgcmV0dXJuIG1fbmVl
ZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbjsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0
ZTo6c2V0TmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpCit7CisgICAgLy8gVGhp
cyBtZWFucyB3ZSBoYXZlIHRvIGNvbW1pdCBsYXllcnMgb24gbmV4dCByZW5kZXIsIG9yIHJlbmRl
ciBvbiB0aGUgbmV4dCBjb21taXQsCisgICAgLy8gd2hpY2hldmVyIGhhcHBlbnMgZmlyc3QuCisg
ICAgbV9uZWVkc0NvbW1pdCA9IHRydWU7CisgICAgbV9uZWVkc09uZVNob3REcmF3aW5nU3luY2hy
b25pemF0aW9uID0gdHJ1ZTsKK30KKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmVudGVyRnVsbHNjcmVlbkZvck5vZGUoTm9kZSog
bm9kZSkKK3sKKyNpZiBFTkFCTEUoVklERU8pCisgICAgaWYgKCFub2RlIHx8ICFub2RlLT5oYXNU
YWdOYW1lKEhUTUxOYW1lczo6dmlkZW9UYWcpKQorICAgICAgICByZXR1cm47CisKKyAgICBNZWRp
YVBsYXllciogcGxheWVyID0gc3RhdGljX2Nhc3Q8SFRNTE1lZGlhRWxlbWVudCo+KG5vZGUpLT5w
bGF5ZXIoKTsKKyAgICBpZiAoIXBsYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgTWVkaWFQ
bGF5ZXJQcml2YXRlKiBtbXJQbGF5ZXIgPSBzdGF0aWNfY2FzdDxNZWRpYVBsYXllclByaXZhdGUq
PihwbGF5ZXItPmltcGxlbWVudGF0aW9uKCkpOworICAgIGlmICghbW1yUGxheWVyKQorICAgICAg
ICByZXR1cm47CisKKyAgICBQbGF0Zm9ybTo6R3JhcGhpY3M6OldpbmRvdyogd2luZG93ID0gbW1y
UGxheWVyLT53aW5kb3dHZXQoKTsKKyAgICBpZiAoIXdpbmRvdykKKyAgICAgICAgcmV0dXJuOwor
CisgICAgdW5zaWduZWQgeCwgeSwgd2lkdGgsIGhlaWdodDsKKyAgICBtbXJQbGF5ZXItPndpbmRv
d1Bvc2l0aW9uR2V0KHgsIHksIHdpZHRoLCBoZWlnaHQpOworCisgICAgY29uc3QgY2hhciogY29u
dGV4dE5hbWUgPSBtbXJQbGF5ZXItPm1tckNvbnRleHROYW1lR2V0KCk7CisgICAgaWYgKCFjb250
ZXh0TmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbW1yUGxheWVyLT5zZXRGdWxsc2NyZWVu
V2ViUGFnZUNsaWVudChtX2NsaWVudCk7CisgICAgbV9mdWxsc2NyZWVuVmlkZW9Ob2RlID0gbm9k
ZTsKKyAgICBtX2NsaWVudC0+ZnVsbHNjcmVlblN0YXJ0KGNvbnRleHROYW1lLCB3aW5kb3csIHgs
IHksIHdpZHRoLCBoZWlnaHQpOworI2VuZGlmCit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmV4
aXRGdWxsc2NyZWVuRm9yTm9kZShOb2RlKiBub2RlKQoreworI2lmIEVOQUJMRShWSURFTykKKyAg
ICBpZiAobV9mdWxsc2NyZWVuVmlkZW9Ob2RlLmdldCgpKSB7CisgICAgICAgIG1fY2xpZW50LT5m
dWxsc2NyZWVuU3RvcCgpOworICAgICAgICBtX2Z1bGxzY3JlZW5WaWRlb05vZGUgPSAwOworICAg
IH0KKworICAgIGlmICghbm9kZSB8fCAhbm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OnZpZGVv
VGFnKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgTWVkaWFQbGF5ZXIqIHBsYXllciA9IHN0YXRp
Y19jYXN0PEhUTUxNZWRpYUVsZW1lbnQqPihub2RlKS0+cGxheWVyKCk7CisgICAgaWYgKCFwbGF5
ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIE1lZGlhUGxheWVyUHJpdmF0ZSogbW1yUGxheWVy
ID0gc3RhdGljX2Nhc3Q8TWVkaWFQbGF5ZXJQcml2YXRlKj4ocGxheWVyLT5pbXBsZW1lbnRhdGlv
bigpKTsKKyAgICBpZiAoIW1tclBsYXllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRnVs
bHNjcmVlbiBtb2RlIGlzIGJlaW5nIHR1cm5lZCBvZmYsIHNvIE1lZGlhUGxheWVyUHJpdmF0ZSBu
byBsb25nZXIgbmVlZHMgdGhlIHBvaW50ZXIuCisgICAgbW1yUGxheWVyLT5zZXRGdWxsc2NyZWVu
V2ViUGFnZUNsaWVudCgwKTsKKyNlbmRpZgorfQorCisvLyBNQVJLOiBXZWJTZXR0aW5nc0RlbGVn
YXRlLgorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpkaWRDaGFuZ2VTZXR0aW5ncyhXZWJTZXR0aW5n
cyogd2ViU2V0dGluZ3MpCit7CisgICAgU2V0dGluZ3MqIGNvcmVTZXR0aW5ncyA9IG1fcGFnZS0+
c2V0dGluZ3MoKTsKKyAgICBtX3BhZ2UtPnNldEdyb3VwTmFtZSh3ZWJTZXR0aW5ncy0+cGFnZUdy
b3VwTmFtZSgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldFhTU0F1ZGl0b3JFbmFibGVkKHdlYlNl
dHRpbmdzLT54c3NBdWRpdG9yRW5hYmxlZCgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldExvYWRz
SW1hZ2VzQXV0b21hdGljYWxseSh3ZWJTZXR0aW5ncy0+bG9hZHNJbWFnZXNBdXRvbWF0aWNhbGx5
KCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0U2hvdWxkRHJhd0JvcmRlcldoaWxlTG9hZGluZ0lt
YWdlcyh3ZWJTZXR0aW5ncy0+c2hvdWxkRHJhd0JvcmRlcldoaWxlTG9hZGluZ0ltYWdlcygpKTsK
KyAgICBjb3JlU2V0dGluZ3MtPnNldFNjcmlwdEVuYWJsZWQod2ViU2V0dGluZ3MtPmlzSmF2YVNj
cmlwdEVuYWJsZWQoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXRQcml2YXRlQnJvd3NpbmdFbmFi
bGVkKHdlYlNldHRpbmdzLT5pc1ByaXZhdGVCcm93c2luZ0VuYWJsZWQoKSk7CisgICAgY29yZVNl
dHRpbmdzLT5zZXREZWZhdWx0Rml4ZWRGb250U2l6ZSh3ZWJTZXR0aW5ncy0+ZGVmYXVsdEZpeGVk
Rm9udFNpemUoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXREZWZhdWx0Rm9udFNpemUod2ViU2V0
dGluZ3MtPmRlZmF1bHRGb250U2l6ZSgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldE1pbmltdW1G
b250U2l6ZSh3ZWJTZXR0aW5ncy0+bWluaW11bUZvbnRTaXplKCkpOworICAgIGNvcmVTZXR0aW5n
cy0+c2V0U2VyaWZGb250RmFtaWx5KHdlYlNldHRpbmdzLT5zZXJpZkZvbnRGYW1pbHkoKS5pbXBs
KCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0Rml4ZWRGb250RmFtaWx5KHdlYlNldHRpbmdzLT5m
aXhlZEZvbnRGYW1pbHkoKS5pbXBsKCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0U2Fuc1Nlcmlm
Rm9udEZhbWlseSh3ZWJTZXR0aW5ncy0+c2Fuc1NlcmlmRm9udEZhbWlseSgpLmltcGwoKSk7Cisg
ICAgY29yZVNldHRpbmdzLT5zZXRTdGFuZGFyZEZvbnRGYW1pbHkod2ViU2V0dGluZ3MtPnN0YW5k
YXJkRm9udEZhbWlseSgpLmltcGwoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXRKYXZhU2NyaXB0
Q2FuT3BlbldpbmRvd3NBdXRvbWF0aWNhbGx5KHdlYlNldHRpbmdzLT5jYW5KYXZhU2NyaXB0T3Bl
bldpbmRvd3NBdXRvbWF0aWNhbGx5KCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0QWxsb3dTY3Jp
cHRzVG9DbG9zZVdpbmRvd3Mod2ViU2V0dGluZ3MtPmNhbkphdmFTY3JpcHRPcGVuV2luZG93c0F1
dG9tYXRpY2FsbHkoKSk7IC8vIFdoeSBhcmUgd2UgdXNpbmcgdGhlIHNhbWUgdmFsdWUgYXMgc2V0
SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSgpPworICAgIGNvcmVTZXR0aW5n
cy0+c2V0UGx1Z2luc0VuYWJsZWQod2ViU2V0dGluZ3MtPmFyZVBsdWdpbnNFbmFibGVkKCkpOwor
ICAgIGNvcmVTZXR0aW5ncy0+c2V0RGVmYXVsdFRleHRFbmNvZGluZ05hbWUod2ViU2V0dGluZ3Mt
PmRlZmF1bHRUZXh0RW5jb2RpbmdOYW1lKCkuaW1wbCgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNl
dERvd25sb2FkYWJsZUJpbmFyeUZvbnRzRW5hYmxlZCh3ZWJTZXR0aW5ncy0+ZG93bmxvYWRhYmxl
QmluYXJ5Rm9udHNFbmFibGVkKCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0U3BhdGlhbE5hdmln
YXRpb25FbmFibGVkKG1fd2ViU2V0dGluZ3MtPmlzU3BhdGlhbE5hdmlnYXRpb25FbmFibGVkKCkp
OworCisgICAgLy8gVXNlclNjYWxhYmxlIHNob3VsZCBiZSByZXNldCBieSBuZXcgc2V0dGluZ3Mu
CisgICAgc2V0VXNlclNjYWxhYmxlKHdlYlNldHRpbmdzLT5pc1VzZXJTY2FsYWJsZSgpKTsKKwor
ICAgIFdlYlN0cmluZyBzdHlsZXNoZWV0VVJMID0gd2ViU2V0dGluZ3MtPnVzZXJTdHlsZVNoZWV0
U3RyaW5nKCk7CisgICAgaWYgKHN0eWxlc2hlZXRVUkwuaXNFbXB0eSgpKQorICAgICAgICBzdHls
ZXNoZWV0VVJMID0gd2ViU2V0dGluZ3MtPnVzZXJTdHlsZVNoZWV0TG9jYXRpb24oKTsKKyAgICBp
ZiAoIXN0eWxlc2hlZXRVUkwuaXNFbXB0eSgpKQorICAgICAgICBjb3JlU2V0dGluZ3MtPnNldFVz
ZXJTdHlsZVNoZWV0TG9jYXRpb24oS1VSTChLVVJMKCksIHN0eWxlc2hlZXRVUkwpKTsKKworICAg
IGNvcmVTZXR0aW5ncy0+c2V0Rmlyc3RTY2hlZHVsZWRMYXlvdXREZWxheSh3ZWJTZXR0aW5ncy0+
Zmlyc3RTY2hlZHVsZWRMYXlvdXREZWxheSgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldFVzZUNh
Y2hlKHdlYlNldHRpbmdzLT51c2VXZWJLaXRDYWNoZSgpKTsKKworI2lmIEVOQUJMRShTUUxfREFU
QUJBU0UpCisgICAgLy8gRGF0YWJhc2VUcmFja2VyIGNhbiBvbmx5IGJlIGluaXRpYWxpemVkIGZv
ciBvbmNlLCBzbyBpdCBkb2Vzbid0CisgICAgLy8gbWFrZSBzZW5zZSB0byBjaGFuZ2UgZGF0YWJh
c2UgcGF0aCBhZnRlciBEYXRhYmFzZVRyYWNrZXIgaGFzCisgICAgLy8gYWxyZWFkeSBiZWVuIGlu
aXRpYWxpemVkLgorICAgIHN0YXRpYyBib29sIGRiaW5pdCA9IGZhbHNlOworICAgIGlmICghZGJp
bml0ICYmICF3ZWJTZXR0aW5ncy0+ZGF0YWJhc2VQYXRoKCkuaXNFbXB0eSgpKSB7CisgICAgICAg
IGRiaW5pdCA9IHRydWU7CisgICAgICAgIERhdGFiYXNlVHJhY2tlcjo6aW5pdGlhbGl6ZVRyYWNr
ZXIod2ViU2V0dGluZ3MtPmRhdGFiYXNlUGF0aCgpKTsKKyAgICB9CisKKyAgICAvLyBUaGUgZGly
ZWN0b3J5IG9mIGNhY2hlU3RvcmFnZSBmb3Igb25lIHBhZ2UgZ3JvdXAgY2FuIG9ubHkgYmUgaW5p
dGlhbGl6ZWQgb25jZS4KKyAgICBzdGF0aWMgYm9vbCBhY2luaXQgPSBmYWxzZTsKKyAgICBpZiAo
IWFjaW5pdCAmJiAhd2ViU2V0dGluZ3MtPmFwcENhY2hlUGF0aCgpLmlzRW1wdHkoKSkgeworICAg
ICAgICBhY2luaXQgPSB0cnVlOworICAgICAgICBjYWNoZVN0b3JhZ2UoKS5zZXRDYWNoZURpcmVj
dG9yeSh3ZWJTZXR0aW5ncy0+YXBwQ2FjaGVQYXRoKCkpOworICAgIH0KKworICAgIGNvcmVTZXR0
aW5ncy0+c2V0TG9jYWxTdG9yYWdlRGF0YWJhc2VQYXRoKHdlYlNldHRpbmdzLT5sb2NhbFN0b3Jh
Z2VQYXRoKCkpOworICAgIERhdGFiYXNlOjpzZXRJc0F2YWlsYWJsZSh3ZWJTZXR0aW5ncy0+aXNE
YXRhYmFzZXNFbmFibGVkKCkpOworICAgIERhdGFiYXNlU3luYzo6c2V0SXNBdmFpbGFibGUod2Vi
U2V0dGluZ3MtPmlzRGF0YWJhc2VzRW5hYmxlZCgpKTsKKworICAgIGNvcmVTZXR0aW5ncy0+c2V0
TG9jYWxTdG9yYWdlRW5hYmxlZCh3ZWJTZXR0aW5ncy0+aXNMb2NhbFN0b3JhZ2VFbmFibGVkKCkp
OworICAgIGNvcmVTZXR0aW5ncy0+c2V0T2ZmbGluZVdlYkFwcGxpY2F0aW9uQ2FjaGVFbmFibGVk
KHdlYlNldHRpbmdzLT5pc0FwcENhY2hlRW5hYmxlZCgpKTsKKworICAgIG1fcGFnZS0+Z3JvdXAo
KS5ncm91cFNldHRpbmdzKCktPnNldExvY2FsU3RvcmFnZVF1b3RhQnl0ZXMod2ViU2V0dGluZ3Mt
PmxvY2FsU3RvcmFnZVF1b3RhKCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0VXNlc1BhZ2VDYWNo
ZSh3ZWJTZXR0aW5ncy0+bWF4aW11bVBhZ2VzSW5DYWNoZSgpKTsKKyAgICBjb3JlU2V0dGluZ3Mt
PnNldEZyYW1lRmxhdHRlbmluZ0VuYWJsZWQod2ViU2V0dGluZ3MtPmlzRnJhbWVGbGF0dGVuaW5n
RW5hYmxlZCgpKTsKKyNlbmRpZgorCisjaWYgRU5BQkxFKFdFQl9TT0NLRVRTKQorICAgIFdlYlNv
Y2tldDo6c2V0SXNBdmFpbGFibGUod2ViU2V0dGluZ3MtPmFyZVdlYlNvY2tldHNFbmFibGVkKCkp
OworI2VuZGlmCisKKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9XKQorICAgIGNvcmVTZXR0aW5n
cy0+c2V0VGV4dFJlZmxvd0VuYWJsZWQod2ViU2V0dGluZ3MtPnRleHRSZWZsb3dNb2RlKCkgPT0g
V2ViU2V0dGluZ3M6OlRleHRSZWZsb3dFbmFibGVkKTsKKyNlbmRpZgorCisgICAgLy8gRklYTUU6
IFdlIGRvbid0IHdhbnQgSFRNTFRva2VuaXplciB0byB5aWVsZCBmb3IgYW55dGhpbmcgb3RoZXIg
dGhhbiBlbWFpbCBjYXNlIGJlY2F1c2UKKyAgICAvLyBjYWxsIHRvIGN1cnJlbnRUaW1lKCkgaXMg
dG9vIGV4cGVuc2l2ZSBvbiBvdXIgcGxhdGZvcm0uIFNlZSBSSU0gQnVnICM3NDYuCisgICAgY29y
ZVNldHRpbmdzLT5zZXRTaG91bGRVc2VGaXJzdFNjaGVkdWxlZExheW91dERlbGF5KHdlYlNldHRp
bmdzLT5pc0VtYWlsTW9kZSgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldFByb2Nlc3NIVFRQRXF1
aXYoIXdlYlNldHRpbmdzLT5pc0VtYWlsTW9kZSgpKTsKKworICAgIGNvcmVTZXR0aW5ncy0+c2V0
U2hvdWxkVXNlQ3Jvc3NPcmlnaW5Qcm90b2NvbENoZWNrKCF3ZWJTZXR0aW5ncy0+YWxsb3dDcm9z
c1NpdGVSZXF1ZXN0cygpKTsKKworICAgIGNvb2tpZU1hbmFnZXIoKS5zZXRQcml2YXRlTW9kZSh3
ZWJTZXR0aW5ncy0+aXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCkpOworCisgICAgaWYgKG1fbWFp
bkZyYW1lICYmIG1fbWFpbkZyYW1lLT52aWV3KCkpIHsKKyAgICAgICAgQ29sb3IgYmFja2dyb3Vu
ZENvbG9yKHdlYlNldHRpbmdzLT5iYWNrZ3JvdW5kQ29sb3IoKSk7CisgICAgICAgIG1fbWFpbkZy
YW1lLT52aWV3KCktPnVwZGF0ZUJhY2tncm91bmRSZWN1cnNpdmVseShiYWNrZ3JvdW5kQ29sb3Is
IGJhY2tncm91bmRDb2xvci5oYXNBbHBoYSgpKTsKKyAgICB9Cit9CisKK0ludFNpemUgV2ViUGFn
ZVByaXZhdGU6OmRlZmF1bHRNYXhMYXlvdXRTaXplKCkKK3sKKyAgICBzdGF0aWMgSW50U2l6ZSBz
aXplOworCisgICAgaWYgKHNpemUuaXNFbXB0eSgpKQorICAgICAgICBzaXplID0gSW50U2l6ZShz
dGQ6Om1heCgxMDI0LCBQbGF0Zm9ybTo6R3JhcGhpY3M6OlNjcmVlbjo6bGFuZHNjYXBlV2lkdGgo
KSksCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KDc2OCwgUGxhdGZvcm06OkdyYXBo
aWNzOjpTY3JlZW46OmxhbmRzY2FwZUhlaWdodCgpKSk7CisKKyAgICByZXR1cm4gc2l6ZTsKK30K
KworV2ViU3RyaW5nIFdlYlBhZ2U6OnRleHRIYXNBdHRyaWJ1dGUoY29uc3QgV2ViU3RyaW5nJiBx
dWVyeSkgY29uc3QKK3sKKyAgICBpZiAoRG9jdW1lbnQqIGRvYyA9IGQtPm1fcGFnZS0+Zm9jdXND
b250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpLT5kb2N1bWVudCgpKQorICAgICAgICBy
ZXR1cm4gZG9jLT5xdWVyeUNvbW1hbmRWYWx1ZShxdWVyeSk7CisgICAgcmV0dXJuICIiOworfQor
Cit2b2lkIFdlYlBhZ2U6OnNldEphdmFTY3JpcHRDYW5BY2Nlc3NDbGlwYm9hcmQoYm9vbCBlbmFi
bGVkKQoreworICAgIGQtPm1fcGFnZS0+c2V0dGluZ3MoKS0+c2V0SmF2YVNjcmlwdENhbkFjY2Vz
c0NsaXBib2FyZChlbmFibGVkKTsKK30KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmJsaXRWaXNpYmxlQ29udGVudHMoKQoreworICAgIGlm
IChtX2JhY2tpbmdTdG9yZS0+ZC0+c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgbV9iYWNraW5nU3RvcmUtPmQtPmJsaXRWaXNpYmxlQ29udGVu
dHMoKTsKK30KKyNlbmRpZgorCit2b2lkIFdlYlBhZ2U6OnNldFdlYkdMRW5hYmxlZChib29sIGVu
YWJsZWQpCit7CisgICAgaWYgKCFQbGF0Zm9ybTo6SVRQb2xpY3k6OmlzV2ViR0xFbmFibGVkKCkp
IHsKKyAgICAgICAgZC0+bV9wYWdlLT5zZXR0aW5ncygpLT5zZXRXZWJHTEVuYWJsZWQoZmFsc2Up
OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGQtPm1fcGFnZS0+c2V0dGluZ3MoKS0+c2V0
V2ViR0xFbmFibGVkKGVuYWJsZWQpOworfQorCitib29sIFdlYlBhZ2U6OmlzV2ViR0xFbmFibGVk
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+bV9wYWdlLT5zZXR0aW5ncygpLT53ZWJHTEVuYWJs
ZWQoKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0TmVlZFRvdWNoRXZlbnRzKGJvb2wg
dmFsdWUpCit7CisgICAgbV9uZWVkVG91Y2hFdmVudHMgPSB2YWx1ZTsKK30KKworfQorfQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9XZWJQYWdlLmggYi9Tb3VyY2Uv
V2ViS2l0L2JsYWNrYmVycnkvQXBpL1dlYlBhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42M2Y0OWU1NTI4NzU0
NmJiYzcxNDcyZGRjYzA3NzEwMWI2YzZlNTEzCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YktpdC9ibGFja2JlcnJ5L0FwaS9XZWJQYWdlLmgKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExp
bWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0
aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRl
ZiBXZWJQYWdlX2gKKyNkZWZpbmUgV2ViUGFnZV9oCisKKyNpbmNsdWRlICJBY3RpdmVOb2RlQ29u
dGV4dC5oIgorI2luY2x1ZGUgIkJsYWNrQmVycnlHbG9iYWwuaCIKKyNpbmNsdWRlIDxCbGFja0Jl
cnJ5UGxhdGZvcm1HdWFyZGVkUG9pbnRlci5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9y
bUlucHV0RXZlbnRzLmg+CisjaW5jbHVkZSA8aW1mL2lucHV0X2RhdGEuaD4KKyNpbmNsdWRlIDxu
ZXR3b3JrL05ldHdvcmtSZXF1ZXN0Lmg+CisKK3N0cnVjdCBPcGFxdWVKU0NvbnRleHQ7Cit0eXBl
ZGVmIGNvbnN0IHN0cnVjdCBPcGFxdWVKU0NvbnRleHQqIEpTQ29udGV4dFJlZjsKKworc3RydWN0
IE9wYXF1ZUpTVmFsdWU7Cit0eXBlZGVmIGNvbnN0IHN0cnVjdCBPcGFxdWVKU1ZhbHVlKiBKU1Zh
bHVlUmVmOworCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBDaHJvbWVDbGllbnRCbGFja0Jl
cnJ5OworY2xhc3MgRWRpdG9yQ2xpZW50QmxhY2tCZXJyeTsKK2NsYXNzIEVsZW1lbnQ7CitjbGFz
cyBGcmFtZTsKK2NsYXNzIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTsKK2NsYXNzIEdlb2xv
Y2F0aW9uQ29udHJvbGxlckNsaWVudEJsYWNrQmVycnk7CitjbGFzcyBJY29uRGF0YWJhc2VDbGll
bnRCbGFja0JlcnJ5OworY2xhc3MgSW5zcGVjdG9yQ2xpZW50QmxhY2tCZXJyeTsKK2NsYXNzIEph
dmFTY3JpcHREZWJ1Z2dlckJsYWNrQmVycnk7CitjbGFzcyBOb2RlOworY2xhc3MgUmVuZGVyT2Jq
ZWN0OworY2xhc3MgVmlzaWJsZVNlbGVjdGlvbjsKK30KKworY2xhc3MgV2ViRE9NRG9jdW1lbnQ7
CitjbGFzcyBXZWJET01Ob2RlOwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgU2hhcmVkQXJy
YXk7CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBQbGF0Zm9ybSB7CitjbGFz
cyBJbnRQb2ludDsKK2NsYXNzIEludFJlY3Q7CitjbGFzcyBJbnRTaXplOworY2xhc3MgS2V5Ym9h
cmRFdmVudDsKK2NsYXNzIE1vdXNlRXZlbnQ7CitjbGFzcyBUb3VjaEV2ZW50OworY2xhc3MgVG91
Y2hQb2ludDsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIEJhY2tpbmdTdG9yZTsK
K2NsYXNzIEJhY2tpbmdTdG9yZUNsaWVudDsKK2NsYXNzIEJhY2tpbmdTdG9yZVByaXZhdGU7Citj
bGFzcyBEdW1wUmVuZGVyVHJlZUNsaWVudDsKK2NsYXNzIFJlbmRlclF1ZXVlOworY2xhc3MgV2Vi
UGFnZUNsaWVudDsKK2NsYXNzIFdlYlBhZ2VHcm91cExvYWREZWZlcnJlcjsKK2NsYXNzIFdlYlBh
Z2VQcml2YXRlOworY2xhc3MgV2ViU2V0dGluZ3M7CisKK2VudW0gSmF2YVNjcmlwdERhdGFUeXBl
IHsgSlNVbmRlZmluZWQgPSAwLCBKU051bGwsIEpTQm9vbGVhbiwgSlNOdW1iZXIsIEpTU3RyaW5n
LCBKU09iamVjdCwgSlNFeGNlcHRpb24sIEpTRGF0YVR5cGVNYXggfTsKKworZW51bSBBY3RpdmF0
aW9uU3RhdGVUeXBlIHsgQWN0aXZhdGlvbkFjdGl2ZSwgQWN0aXZhdGlvbkluYWN0aXZlLCBBY3Rp
dmF0aW9uU3RhbmRieSB9OworCitlbnVtIFRhcmdldERldGVjdGlvblN0cmF0ZWd5IHtQb2ludEJh
c2VkLCBSZWN0QmFzZWR9OworCitjbGFzcyBCTEFDS0JFUlJZX0VYUE9SVCBXZWJQYWdlIDogcHVi
bGljIFBsYXRmb3JtOjpHdWFyZGVkUG9pbnRlckJhc2UgeworcHVibGljOgorICAgIFdlYlBhZ2Uo
V2ViUGFnZUNsaWVudCosIGNvbnN0IFdlYlN0cmluZyYgcGFnZUdyb3VwTmFtZSwgY29uc3QgUGxh
dGZvcm06OkludFJlY3QmKTsKKyAgICB2b2lkIGRlc3Ryb3koKTsKKworICAgIFdlYlBhZ2VDbGll
bnQqIGNsaWVudCgpIGNvbnN0OworCisgICAgdm9pZCBsb2FkKGNvbnN0IGNoYXIqIHVybCwgY29u
c3QgY2hhciogbmV0d29ya1Rva2VuLCBib29sIGlzSW5pdGlhbCA9IGZhbHNlKTsKKworICAgIHZv
aWQgbG9hZEV4dGVuZGVkKGNvbnN0IGNoYXIqIHVybCwgY29uc3QgY2hhciogbmV0d29ya1Rva2Vu
LCBjb25zdCBjaGFyKiBtZXRob2QsIFBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6Q2FjaGVQb2xp
Y3kgPSBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OlVzZVByb3RvY29sQ2FjaGVQb2xpY3ksIGNv
bnN0IGNoYXIqIGRhdGEgPSAwLCBzaXplX3QgZGF0YUxlbmd0aCA9IDAsIGNvbnN0IGNoYXIqIGNv
bnN0KiBoZWFkZXJzID0gMCwgc2l6ZV90IGhlYWRlcnNMZW5ndGggPSAwLCBib29sIG11c3RIYW5k
bGVJbnRlcm5hbGx5ID0gZmFsc2UpOworCisgICAgdm9pZCBsb2FkRmlsZShjb25zdCBjaGFyKiBw
YXRoLCBjb25zdCBjaGFyKiBvdmVycmlkZUNvbnRlbnRUeXBlID0gIiIpOworCisgICAgdm9pZCBs
b2FkU3RyaW5nKGNvbnN0IGNoYXIqIHN0cmluZywgY29uc3QgY2hhciogYmFzZVVSTCwgY29uc3Qg
Y2hhciogY29udGVudFR5cGUgPSAidGV4dC9odG1sIiwgY29uc3QgY2hhciogZmFpbGluZ1VSTCA9
IDApOworCisgICAgdm9pZCBkb3dubG9hZChjb25zdCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Qm
KTsKKworICAgIGJvb2wgZXhlY3V0ZUphdmFTY3JpcHQoY29uc3QgY2hhciogc2NyaXB0LCBKYXZh
U2NyaXB0RGF0YVR5cGUmIHJldHVyblR5cGUsIFdlYlN0cmluZyYgcmV0dXJuVmFsdWUpOworCisg
ICAgLy8gVGhpcyB3aWxsIGV4ZWN1dGUgdGhlIHNjcmlwdCBldmVuIGlmIGluLXBhZ2UgSmF2YVNj
cmlwdCBpcyBkaXNhYmxlZC4KKyAgICBib29sIGV4ZWN1dGVKYXZhU2NyaXB0SW5Jc29sYXRlZFdv
cmxkKGNvbnN0IGNoYXIqIHNjcmlwdCwgSmF2YVNjcmlwdERhdGFUeXBlJiByZXR1cm5UeXBlLCBX
ZWJTdHJpbmcmIHJldHVyblZhbHVlKTsKKworICAgIC8vIFRha2VzIGEgVVRGMTYgZW5jb2RlZCBz
Y3JpcHQgdGhhdCBpcyB1c2VkIGV4cGxpY2l0bHkgYnkgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgY29k
ZQorICAgIGJvb2wgZXhlY3V0ZUphdmFTY3JpcHRJbklzb2xhdGVkV29ybGQoY29uc3Qgc3RkOjp3
c3RyaW5nJiBzY3JpcHQsIEphdmFTY3JpcHREYXRhVHlwZSYgcmV0dXJuVHlwZSwgV2ViU3RyaW5n
JiByZXR1cm5WYWx1ZSk7CisKKyAgICB2b2lkIGluaXRpYWxpemVJY29uRGF0YUJhc2UoKTsKKwor
ICAgIHZvaWQgc3RvcExvYWRpbmcoKTsKKworICAgIC8vIFRoaXMgd2lsbCBmb3JjZSBhbnkgdW5s
b2FkIGhhbmRsZXJzIHRvIHJ1bi4KKyAgICB2b2lkIHByZXBhcmVUb0Rlc3Ryb3koKTsKKworICAg
IHZvaWQgcmVsb2FkKCk7CisgICAgdm9pZCByZWxvYWRGcm9tQ2FjaGUoKTsKKworICAgIFdlYlNl
dHRpbmdzKiBzZXR0aW5ncygpIGNvbnN0OworCisgICAgdm9pZCBzZXRWaXNpYmxlKGJvb2wpOwor
ICAgIGJvb2wgaXNWaXNpYmxlKCkgY29uc3Q7CisKKyAgICB2b2lkIHNldFNjcmVlbk9yaWVudGF0
aW9uKGludCk7CisgICAgdm9pZCBhcHBseVBlbmRpbmdPcmllbnRhdGlvbklmTmVlZGVkKCk7CisK
KyAgICBQbGF0Zm9ybTo6SW50U2l6ZSB2aWV3cG9ydFNpemUoKSBjb25zdDsKKyAgICB2b2lkIHNl
dFZpZXdwb3J0U2l6ZShjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYgdmlld3BvcnRTaXplLCBib29s
IGVuc3VyZUZvY3VzRWxlbWVudFZpc2libGUgPSB0cnVlKTsKKworICAgIHZvaWQgcmVzZXRWaXJ0
dWFsVmlld3BvcnRPbkNvbW1pdHRlZChib29sIHJlc2V0KTsKKyAgICB2b2lkIHNldFZpcnR1YWxW
aWV3cG9ydFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworICAgIC8vIFVzZWQgZm9yIGRl
ZmF1bHQgbGF5b3V0IHNpemUgdW5sZXNzIG92ZXJyaWRkZW4gYnkgd2ViIGNvbnRlbnQgb3IgYnkg
b3RoZXIgQVBJcy4KKyAgICB2b2lkIHNldERlZmF1bHRMYXlvdXRTaXplKGludCB3aWR0aCwgaW50
IGhlaWdodCk7CisKKyAgICBib29sIG1vdXNlRXZlbnQoY29uc3QgUGxhdGZvcm06Ok1vdXNlRXZl
bnQmLCBib29sKiB3aGVlbERlbHRhQWNjZXB0ZWQgPSAwKTsKKworICAgIC8vIEhhbmRsZXMgbmF0
aXZlIGphdmFzY3JpcHQgdG91Y2ggZXZlbnRzLgorICAgIGJvb2wgdG91Y2hFdmVudChjb25zdCBQ
bGF0Zm9ybTo6VG91Y2hFdmVudCYpOworCisgICAgLy8gRm9yIGNvbnZlcnNpb24gdG8gbW91c2Ug
ZXZlbnRzLgorICAgIHZvaWQgdG91Y2hFdmVudENhbmNlbCgpOworICAgIHZvaWQgdG91Y2hFdmVu
dENhbmNlbEFuZENsZWFyRm9jdXNlZE5vZGUoKTsKKyAgICBib29sIHRvdWNoUG9pbnRBc01vdXNl
RXZlbnQoY29uc3QgUGxhdGZvcm06OlRvdWNoUG9pbnQmKTsKKworICAgIC8vIFJldHVybnMgdHJ1
ZSBpZiB0aGUga2V5IHN0cm9rZSB3YXMgaGFuZGxlZCBieSBXZWJLaXQuCisgICAgYm9vbCBrZXlF
dmVudChjb25zdCBQbGF0Zm9ybTo6S2V5Ym9hcmRFdmVudCYpOworCisgICAgV2ViU3RyaW5nIHRp
dGxlKCkgY29uc3Q7CisgICAgV2ViU3RyaW5nIHNlbGVjdGVkVGV4dCgpIGNvbnN0OworICAgIFdl
YlN0cmluZyBjdXRTZWxlY3RlZFRleHQoKTsKKyAgICB2b2lkIGluc2VydFRleHQoY29uc3QgV2Vi
U3RyaW5nJik7CisgICAgdm9pZCBjbGVhckN1cnJlbnRJbnB1dEZpZWxkKCk7CisKKyAgICB2b2lk
IGN1dCgpOworICAgIHZvaWQgY29weSgpOworICAgIHZvaWQgcGFzdGUoKTsKKworICAgIC8vIFRl
eHQgZW5jb2RpbmcuCisgICAgV2ViU3RyaW5nIHRleHRFbmNvZGluZygpOworICAgIFdlYlN0cmlu
ZyBmb3JjZWRUZXh0RW5jb2RpbmcoKTsKKyAgICB2b2lkIHNldEZvcmNlZFRleHRFbmNvZGluZyhj
b25zdCBjaGFyKik7CisKKyAgICAvLyBTY3JvbGwgcG9zaXRpb24gcmV0dXJuZWQgaXMgaW4gdHJh
bnNmb3JtZWQgY29vcmRpbmF0ZXMuCisgICAgUGxhdGZvcm06OkludFBvaW50IHNjcm9sbFBvc2l0
aW9uKCkgY29uc3Q7CisgICAgLy8gU2Nyb2xsIHBvc2l0aW9uIHByb3ZpZGVkIHNob3VsZCBiZSBp
biB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KKyAgICB2b2lkIHNldFNjcm9sbFBvc2l0aW9uKGNv
bnN0IFBsYXRmb3JtOjpJbnRQb2ludCYpOworICAgIGJvb2wgc2Nyb2xsQnkoY29uc3QgUGxhdGZv
cm06OkludFNpemUmLCBib29sIHNjcm9sbE1haW5GcmFtZSA9IHRydWUpOworICAgIHZvaWQgbm90
aWZ5SW5SZWdpb25TY3JvbGxTdGF0dXNDaGFuZ2VkKGJvb2wgc3RhdHVzKTsKKyAgICB2b2lkIHNl
dFNjcm9sbE9yaWdpblBvaW50KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYpOworCisgICAgQmFj
a2luZ1N0b3JlKiBiYWNraW5nU3RvcmUoKSBjb25zdDsKKworICAgIGJvb2wgem9vbVRvRml0KCk7
CisgICAgYm9vbCB6b29tVG9PbmVPbmUoKTsKKyAgICB2b2lkIHpvb21Ub0luaXRpYWxTY2FsZSgp
OworICAgIGJvb2wgYmxvY2tab29tKGludCB4LCBpbnQgeSk7CisgICAgdm9pZCBibG9ja1pvb21B
bmltYXRpb25GaW5pc2hlZCgpOworICAgIGJvb2wgaXNBdEluaXRpYWxab29tKCkgY29uc3Q7Cisg
ICAgYm9vbCBpc01heFpvb21lZCgpIGNvbnN0OworICAgIGJvb2wgaXNNaW5ab29tZWQoKSBjb25z
dDsKKyAgICBib29sIHBpbmNoWm9vbUFib3V0UG9pbnQoZG91YmxlIHNjYWxlLCBpbnQgeCwgaW50
IHkpOworCisgICAgYm9vbCBpc1VzZXJTY2FsYWJsZSgpIGNvbnN0OworICAgIGRvdWJsZSBjdXJy
ZW50U2NhbGUoKSBjb25zdDsKKyAgICBkb3VibGUgaW5pdGlhbFNjYWxlKCkgY29uc3Q7CisgICAg
ZG91YmxlIHpvb21Ub0ZpdFNjYWxlKCkgY29uc3Q7CisgICAgdm9pZCBzZXRJbml0aWFsU2NhbGUo
ZG91YmxlKTsKKyAgICBkb3VibGUgbWluaW11bVNjYWxlKCkgY29uc3Q7CisgICAgdm9pZCBzZXRN
aW5pbXVtU2NhbGUoZG91YmxlKTsKKyAgICBkb3VibGUgbWF4aW11bVNjYWxlKCkgY29uc3Q7Cisg
ICAgdm9pZCBzZXRNYXhpbXVtU2NhbGUoZG91YmxlKTsKKworICAgIHZvaWQgYXNzaWduRm9jdXMo
UGxhdGZvcm06OkZvY3VzRGlyZWN0aW9uKTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGZvY3Vz
Tm9kZVJlY3QoKTsKKworICAgIHZvaWQgc2V0Rm9jdXNlZChib29sKTsKKworICAgIHZvaWQgY2xl
YXJCcm93c2luZ0RhdGEoKTsKKyAgICB2b2lkIGNsZWFySGlzdG9yeSgpOworICAgIHZvaWQgY2xl
YXJDb29raWVzKCk7CisgICAgdm9pZCBjbGVhckNhY2hlKCk7CisgICAgdm9pZCBjbGVhckxvY2Fs
U3RvcmFnZSgpOworCisgICAgdm9pZCBydW5MYXlvdXRUZXN0cygpOworCisgICAgIC8vIEZpbmRz
IGFuZCBzZWxlY3RzIHRoZSBuZXh0IHV0Zjggc3RyaW5nIHRoYXQgaXMgYSBjYXNlIHNlbnNpdGl2
ZQorICAgICAvLyBtYXRjaCBpbiB0aGUgd2ViIHBhZ2UuIEl0IHdpbGwgd3JhcCB0aGUgd2ViIHBh
Z2UgaWYgaXQgcmVhY2hlcworICAgICAvLyB0aGUgZW5kLiBBbiBlbXB0eSBzdHJpbmcgd2lsbCBy
ZXN1bHQgaW4gbm8gbWF0Y2ggYW5kIG5vIHNlbGVjdGlvbi4KKyAgICAgLy8gUmV0dXJucyB0cnVl
IGlmIHRoZSBzdHJpbmcgbWF0Y2hlZCBhbmQgZmFsc2UgaWYgbm90LgorICAgIGJvb2wgZmluZE5l
eHRTdHJpbmcoY29uc3QgY2hhciosIGJvb2wgZm9yd2FyZCA9IHRydWUpOworCisgICAgLy8gSmF2
YVNjcmlwdERlYnVnZ2VyIGludGVyZmFjZS4KKyAgICBib29sIGVuYWJsZVNjcmlwdERlYnVnZ2Vy
KCk7CisgICAgYm9vbCBkaXNhYmxlU2NyaXB0RGVidWdnZXIoKTsKKworICAgIEpTQ29udGV4dFJl
ZiBzY3JpcHRDb250ZXh0KCkgY29uc3Q7CisgICAgSlNWYWx1ZVJlZiB3aW5kb3dPYmplY3QoKSBj
b25zdDsKKworI2lmIGRlZmluZWQoRU5BQkxFX1dFQkRPTSkgJiYgRU5BQkxFX1dFQkRPTQorICAg
IFdlYkRPTURvY3VtZW50IGRvY3VtZW50KCkgY29uc3Q7CisjZW5kaWYKKworICAgIHZvaWQgYWRk
QnJlYWtwb2ludChjb25zdCB1bnNpZ25lZCBzaG9ydCogdXJsLCB1bnNpZ25lZCB1cmxMZW5ndGgs
IGludCBsaW5lTnVtYmVyLCBjb25zdCB1bnNpZ25lZCBzaG9ydCogY29uZGl0aW9uLCB1bnNpZ25l
ZCBjb25kaXRpb25MZW5ndGgpOworICAgIHZvaWQgdXBkYXRlQnJlYWtwb2ludChjb25zdCB1bnNp
Z25lZCBzaG9ydCogdXJsLCB1bnNpZ25lZCB1cmxMZW5ndGgsIGludCBsaW5lTnVtYmVyLCBjb25z
dCB1bnNpZ25lZCBzaG9ydCogY29uZGl0aW9uLCB1bnNpZ25lZCBjb25kaXRpb25MZW5ndGgpOwor
ICAgIHZvaWQgcmVtb3ZlQnJlYWtwb2ludChjb25zdCB1bnNpZ25lZCBzaG9ydCogdXJsLCB1bnNp
Z25lZCB1cmxMZW5ndGgsIGludCBsaW5lTnVtYmVyKTsKKworICAgIGJvb2wgcGF1c2VPbkV4Y2Vw
dGlvbnMoKTsKKyAgICB2b2lkIHNldFBhdXNlT25FeGNlcHRpb25zKGJvb2wpOworCisgICAgdm9p
ZCBwYXVzZUluRGVidWdnZXIoKTsKKyAgICB2b2lkIHJlc3VtZURlYnVnZ2VyKCk7CisKKyAgICB2
b2lkIHN0ZXBPdmVyU3RhdGVtZW50SW5EZWJ1Z2dlcigpOworICAgIHZvaWQgc3RlcEludG9TdGF0
ZW1lbnRJbkRlYnVnZ2VyKCk7CisgICAgdm9pZCBzdGVwT3V0T2ZGdW5jdGlvbkluRGVidWdnZXIo
KTsKKworICAgIHVuc2lnbmVkIHRpbWVvdXRGb3JKYXZhU2NyaXB0RXhlY3V0aW9uKCkgY29uc3Q7
CisgICAgdm9pZCBzZXRUaW1lb3V0Rm9ySmF2YVNjcmlwdEV4ZWN1dGlvbih1bnNpZ25lZCBtcyk7
CisKKyAgICB2b2lkIHNldENhcmV0SGlnaGxpZ2h0U3R5bGUoUGxhdGZvcm06OkNhcmV0SGlnaGxp
Z2h0U3R5bGUpOworCisgICAgLy8gSU1GIGZ1bmN0aW9ucy4KKyAgICBib29sIHNldEJhdGNoRWRp
dGluZ0FjdGl2ZShib29sKTsKKyAgICBib29sIHNldElucHV0U2VsZWN0aW9uKHVuc2lnbmVkIHN0
YXJ0LCB1bnNpZ25lZCBlbmQpOworICAgIGludCBpbnB1dENhcmV0UG9zaXRpb24oKSBjb25zdDsK
KyAgICBib29sIGRlbGV0ZVRleHRSZWxhdGl2ZVRvQ3Vyc29yKHVuc2lnbmVkIGxlZnRPZmZzZXQs
IHVuc2lnbmVkIHJpZ2h0T2Zmc2V0KTsKKyAgICBzcGFubmFibGVfc3RyaW5nX3QqIHNlbGVjdGVk
VGV4dChpbnQzMl90IGZsYWdzKTsKKyAgICBzcGFubmFibGVfc3RyaW5nX3QqIHRleHRCZWZvcmVD
dXJzb3IoaW50MzJfdCBsZW5ndGgsIGludDMyX3QgZmxhZ3MpOworICAgIHNwYW5uYWJsZV9zdHJp
bmdfdCogdGV4dEFmdGVyQ3Vyc29yKGludDMyX3QgbGVuZ3RoLCBpbnQzMl90IGZsYWdzKTsKKyAg
ICBleHRyYWN0ZWRfdGV4dF90KiBleHRyYWN0ZWRUZXh0UmVxdWVzdChleHRyYWN0ZWRfdGV4dF9y
ZXF1ZXN0X3QqLCBpbnQzMl90IGZsYWdzKTsKKyAgICBpbnQzMl90IHNldENvbXBvc2luZ1JlZ2lv
bihpbnQzMl90IHN0YXJ0LCBpbnQzMl90IGVuZCk7CisgICAgaW50MzJfdCBmaW5pc2hDb21wb3Np
dGlvbigpOworICAgIGludDMyX3Qgc2V0Q29tcG9zaW5nVGV4dChzcGFubmFibGVfc3RyaW5nX3Qq
LCBpbnQzMl90IHJlbGF0aXZlQ3Vyc29yUG9zaXRpb24pOworICAgIGludDMyX3QgY29tbWl0VGV4
dChzcGFubmFibGVfc3RyaW5nX3QqLCBpbnQzMl90IHJlbGF0aXZlQ3Vyc29yUG9zaXRpb24pOwor
CisgICAgdm9pZCBzcGVsbENoZWNraW5nRW5hYmxlZChib29sKTsKKworICAgIHZvaWQgc2V0U2Vs
ZWN0aW9uKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgc3RhcnRQb2ludCwgY29uc3QgUGxhdGZv
cm06OkludFBvaW50JiBlbmRQb2ludCk7CisgICAgdm9pZCBzZXRDYXJldFBvc2l0aW9uKGNvbnN0
IFBsYXRmb3JtOjpJbnRQb2ludCYpOworICAgIHZvaWQgc2VsZWN0QXRQb2ludChjb25zdCBQbGF0
Zm9ybTo6SW50UG9pbnQmKTsKKyAgICB2b2lkIHNlbGVjdGlvbkNhbmNlbGxlZCgpOworICAgIGJv
b2wgc2VsZWN0aW9uQ29udGFpbnMoY29uc3QgUGxhdGZvcm06OkludFBvaW50Jik7CisKKyAgICB2
b2lkIHBvcHVwTGlzdENsb3NlZChpbnQgc2l6ZSwgYm9vbCogc2VsZWN0ZWRzKTsKKyAgICB2b2lk
IHBvcHVwTGlzdENsb3NlZChpbnQgaW5kZXgpOworICAgIHZvaWQgc2V0RGF0ZVRpbWVJbnB1dChj
b25zdCBXZWJTdHJpbmcmIHZhbHVlKTsKKyAgICB2b2lkIHNldENvbG9ySW5wdXQoY29uc3QgV2Vi
U3RyaW5nJiB2YWx1ZSk7CisKKyAgICB2b2lkIG9uSW5wdXRMb2NhbGVDaGFuZ2VkKGJvb2wgaXNS
VEwpOworICAgIHN0YXRpYyB2b2lkIG9uTmV0d29ya0F2YWlsYWJpbGl0eUNoYW5nZWQoYm9vbCBh
dmFpbGFibGUpOworICAgIHN0YXRpYyB2b2lkIG9uQ2VydGlmaWNhdGVTdG9yZUxvY2F0aW9uU2V0
KGNvbnN0IFdlYlN0cmluZyYgY2FQYXRoKTsKKworICAgIFdlYlN0cmluZyB0ZXh0SGFzQXR0cmli
dXRlKGNvbnN0IFdlYlN0cmluZyYgcXVlcnkpIGNvbnN0OworCisgICAgQWN0aXZlTm9kZUNvbnRl
eHQgYWN0aXZlTm9kZUNvbnRleHQoVGFyZ2V0RGV0ZWN0aW9uU3RyYXRlZ3kpIGNvbnN0OworCisg
ICAgdHlwZWRlZiBpbnRwdHJfdCBCYWNrRm9yd2FyZElkOworICAgIHN0cnVjdCBCYWNrRm9yd2Fy
ZEVudHJ5IHsKKyAgICAgICAgV2ViU3RyaW5nIHVybDsKKyAgICAgICAgV2ViU3RyaW5nIG9yaWdp
bmFsVXJsOworICAgICAgICBXZWJTdHJpbmcgdGl0bGU7CisgICAgICAgIFdlYlN0cmluZyBuZXR3
b3JrVG9rZW47CisgICAgICAgIEJhY2tGb3J3YXJkSWQgaWQ7CisgICAgICAgIGJvb2wgbGFzdFZp
c2l0V2FzSFRUUE5vbkdldDsKKyAgICB9OworCisgICAgYm9vbCBjYW5Hb0JhY2tPckZvcndhcmQo
aW50IGRlbHRhKSBjb25zdDsKKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIGlzIG5vIHBh
Z2UgZm9yIHRoZSBnaXZlbiBkZWx0YSAoZWcuCisgICAgLy8gYXR0ZW1wdCB0byBnbyBiYWNrIHdp
dGggLTEgd2hlbiBvbiB0aGUgZmlyc3QgcGFnZSkuCisgICAgYm9vbCBnb0JhY2tPckZvcndhcmQo
aW50IGRlbHRhKTsKKyAgICB2b2lkIGdvVG9CYWNrRm9yd2FyZEVudHJ5KEJhY2tGb3J3YXJkSWQp
OworCisgICAgaW50IGJhY2tGb3J3YXJkTGlzdExlbmd0aCgpIGNvbnN0OworICAgIHZvaWQgZ2V0
QmFja0ZvcndhcmRMaXN0KFNoYXJlZEFycmF5PEJhY2tGb3J3YXJkRW50cnk+JiByZXN1bHQsIHVu
c2lnbmVkJiByZXN1bHRMZW5ndGgpIGNvbnN0OworICAgIHZvaWQgcmVsZWFzZUJhY2tGb3J3YXJk
RW50cnkoQmFja0ZvcndhcmRJZCkgY29uc3Q7CisgICAgdm9pZCBjbGVhckJhY2tGb3J3YXJkTGlz
dChib29sIGtlZXBDdXJyZW50UGFnZSkgY29uc3Q7CisKKyAgICB2b2lkIGFkZFZpc2l0ZWRMaW5r
KGNvbnN0IHVuc2lnbmVkIHNob3J0KiB1cmwsIHVuc2lnbmVkIGxlbmd0aCk7CisKKyNpZiBkZWZp
bmVkKEVOQUJMRV9XRUJET00pICYmIEVOQUJMRV9XRUJET00KKyAgICBXZWJET01Ob2RlIG5vZGVB
dFBvaW50KGludCB4LCBpbnQgeSk7CisgICAgYm9vbCBnZXROb2RlUmVjdChjb25zdCBXZWJET01O
b2RlJiwgUGxhdGZvcm06OkludFJlY3QmIHJlc3VsdCk7CisgICAgYm9vbCBzZXROb2RlRm9jdXMo
Y29uc3QgV2ViRE9NTm9kZSYsIGJvb2wgb24pOworICAgIGJvb2wgc2V0Tm9kZUhvdmVyZWQoY29u
c3QgV2ViRE9NTm9kZSYsIGJvb2wgb24pOworICAgIGJvb2wgbm9kZUhhc0hvdmVyKGNvbnN0IFdl
YkRPTU5vZGUmKTsKKyNlbmRpZgorCisgICAgYm9vbCBkZWZlcnNMb2FkaW5nKCkgY29uc3Q7CisK
KyAgICBib29sIHdpbGxGaXJlVGltZXIoKTsKKworICAgIGJvb2wgaXNFbmFibGVMb2NhbEFjY2Vz
c1RvQWxsQ29va2llcygpIGNvbnN0OworICAgIHZvaWQgc2V0RW5hYmxlTG9jYWxBY2Nlc3NUb0Fs
bENvb2tpZXMoYm9vbCk7CisKKyAgICB2b2lkIGVuYWJsZVdlYkluc3BlY3RvcigpOworICAgIHZv
aWQgZGlzYWJsZVdlYkluc3BlY3RvcigpOworICAgIHZvaWQgZW5hYmxlUGFzc3dvcmRFY2hvKCk7
CisgICAgdm9pZCBkaXNhYmxlUGFzc3dvcmRFY2hvKCk7CisgICAgdm9pZCBkaXNwYXRjaEluc3Bl
Y3Rvck1lc3NhZ2UoY29uc3QgY2hhciogbWVzc2FnZSwgaW50IGxlbmd0aCk7CisgICAgV2ViQ29y
ZTo6RnJhbWUqIG1haW5GcmFtZSgpIGNvbnN0OworCisgICAgLy8gRklYTUU6IE5lZWRzIEFQSSBy
ZXZpZXcgb24gdGhpcyBoZWFkZXIuIFNlZSBQUiAjMTIwNDAyLgorICAgIHZvaWQgbm90aWZ5UGFn
ZVBhdXNlKCk7CisgICAgdm9pZCBub3RpZnlQYWdlUmVzdW1lKCk7CisgICAgdm9pZCBub3RpZnlQ
YWdlQmFja2dyb3VuZCgpOworICAgIHZvaWQgbm90aWZ5UGFnZUZvcmVncm91bmQoKTsKKyAgICB2
b2lkIG5vdGlmeVBhZ2VGdWxsU2NyZWVuQWxsb3dlZCgpOworICAgIHZvaWQgbm90aWZ5UGFnZUZ1
bGxTY3JlZW5FeGl0KCk7CisgICAgdm9pZCBub3RpZnlEZXZpY2VJZGxlU3RhdGVDaGFuZ2UoYm9v
bCBlbnRlcklkbGUpOworICAgIHZvaWQgbm90aWZ5QXBwQWN0aXZhdGlvblN0YXRlQ2hhbmdlKEFj
dGl2YXRpb25TdGF0ZVR5cGUpOworICAgIHZvaWQgbm90aWZ5U3dpcGVFdmVudCgpOworICAgIHZv
aWQgbm90aWZ5U2NyZWVuUG93ZXJTdGF0ZUNoYW5nZWQoYm9vbCBwb3dlcmVkKTsKKyAgICB2b2lk
IG5vdGlmeUZ1bGxTY3JlZW5WaWRlb0V4aXRlZChib29sIGRvbmUpOworICAgIHZvaWQgY2xlYXJQ
bHVnaW5TaXRlRGF0YSgpOworICAgIHZvaWQgc2V0SmF2YVNjcmlwdENhbkFjY2Vzc0NsaXBib2Fy
ZChib29sKTsKKyAgICBib29sIGlzV2ViR0xFbmFibGVkKCkgY29uc3Q7CisgICAgdm9pZCBzZXRX
ZWJHTEVuYWJsZWQoYm9vbCk7CisKKyAgICB2b2lkIGRlc3Ryb3lXZWJQYWdlQ29tcG9zaXRvcigp
OworCitwcml2YXRlOgorICAgIH5XZWJQYWdlKCk7CisKKyAgICBmcmllbmQgY2xhc3MgV2ViS2l0
OjpCYWNraW5nU3RvcmU7CisgICAgZnJpZW5kIGNsYXNzIFdlYktpdDo6QmFja2luZ1N0b3JlQ2xp
ZW50OworICAgIGZyaWVuZCBjbGFzcyBXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU7CisgICAg
ZnJpZW5kIGNsYXNzIFdlYktpdDo6UmVuZGVyUXVldWU7CisgICAgZnJpZW5kIGNsYXNzIFdlYktp
dDo6V2ViUGFnZUdyb3VwTG9hZERlZmVycmVyOworICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpD
aHJvbWVDbGllbnRCbGFja0JlcnJ5OworICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpFZGl0b3JD
bGllbnRCbGFja0JlcnJ5OworICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpGcmFtZUxvYWRlckNs
aWVudEJsYWNrQmVycnk7CisgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6Okljb25EYXRhYmFzZUNs
aWVudEJsYWNrQmVycnk7CisgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6Okluc3BlY3RvckNsaWVu
dEJsYWNrQmVycnk7CisgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OkphdmFTY3JpcHREZWJ1Z2dl
ckJsYWNrQmVycnk7CisgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6Okdlb2xvY2F0aW9uQ29udHJv
bGxlckNsaWVudEJsYWNrQmVycnk7CisgICAgV2ViUGFnZVByaXZhdGUqIGQ7Cit9OworfQorfQor
CisjZW5kaWYgLy8gV2ViUGFnZV9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVy
cnkvQXBpL1dlYlBhZ2VfcC5oIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9XZWJQYWdl
X3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi5lMDIzOGI2ZDY5MzI2ZmM1ZmU4ODVkODA3YmUyNzE3ZjA5OGZhNTYy
Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9XZWJQYWdl
X3AuaApAQCAtMCwwICsxLDUxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwg
MjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxp
YnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwK
KyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh
cnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGgg
dGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3Vu
ZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1B
ICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIFdlYlBhZ2VfcF9oCisjZGVmaW5lIFdl
YlBhZ2VfcF9oCisKKyNpbmNsdWRlICJDaHJvbWVDbGllbnQuaCIKKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisjaW5jbHVkZSAiTGF5ZXJSZW5kZXJlci5oIgorI2VuZGlmCisjaW5j
bHVkZSAiUGFnZUNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybU1vdXNlRXZl
bnQuaCIKKyNpbmNsdWRlICJTY3JpcHRTb3VyY2VDb2RlLmgiCisjaW5jbHVkZSAiVGltZXIuaCIK
KyNpbmNsdWRlICJWaWV3cG9ydEFyZ3VtZW50cy5oIgorI2luY2x1ZGUgIldlYlBhZ2UuaCIKKyNp
bmNsdWRlICJXZWJTZXR0aW5ncy5oIgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTWVz
c2FnZS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBET01XcmFwcGVyV29ybGQ7Citj
bGFzcyBEb2N1bWVudDsKK2NsYXNzIEZyYW1lOworY2xhc3MgRnJhbWVWaWV3OworY2xhc3MgR2Vv
bG9jYXRpb25Db250cm9sbGVyQ2xpZW50QmxhY2tCZXJyeTsKK2NsYXNzIEphdmFTY3JpcHREZWJ1
Z2dlckJsYWNrQmVycnk7CitjbGFzcyBLVVJMOworY2xhc3MgTm9kZTsKK2NsYXNzIFBhZ2U7Citj
bGFzcyBQbHVnaW5WaWV3OworY2xhc3MgUmVuZGVyTGF5ZXI7CitjbGFzcyBSZW5kZXJPYmplY3Q7
CitjbGFzcyBTY3JvbGxWaWV3OworY2xhc3MgVHJhbnNmb3JtYXRpb25NYXRyaXg7Cit0ZW1wbGF0
ZTx0eXBlbmFtZSBUPiBjbGFzcyBUaW1lcjsKK30KKworbmFtZXNwYWNlIEJsYWNrQmVycnkgewor
bmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIEJhY2tpbmdTdG9yZTsKK2NsYXNzIEJhY2tpbmdT
dG9yZUNsaWVudDsKK2NsYXNzIEJhY2tpbmdTdG9yZVRpbGU7CitjbGFzcyBEdW1wUmVuZGVyVHJl
ZUNsaWVudDsKK2NsYXNzIEluUGFnZVNlYXJjaE1hbmFnZXI7CitjbGFzcyBJbnB1dEhhbmRsZXI7
CitjbGFzcyBJblJlZ2lvblNjcm9sbGFibGVBcmVhOworY2xhc3MgU2VsZWN0aW9uSGFuZGxlcjsK
K2NsYXNzIFRvdWNoRXZlbnRIYW5kbGVyOworY2xhc3MgV2ViUGFnZUNsaWVudDsKKworI2lmIFVT
RShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKK2NsYXNzIEZyYW1lTGF5ZXJzOworY2xhc3MgV2Vi
UGFnZUNvbXBvc2l0b3I7CisjZW5kaWYKKworLy8gSW4gdGhlIGNsaWVudCBjb2RlLCB0aGVyZSBp
cyBzY3JlZW4gc2l6ZSBhbmQgdmlld3BvcnQuCisvLyBJbiBXZWJQYWdlUHJpdmF0ZSwgdGhlIHNj
cmVlbiBzaXplIGlzIGNhbGxlZCB0aGUgdHJhbnNmb3JtZWRWaWV3cG9ydFNpemUsCisvLyB0aGUg
dmlld3BvcnQgcG9zaXRpb24gaXMgY2FsbGVkIHRoZSB0cmFuc2Zvcm1lZFNjcm9sbFBvc2l0aW9u
LAorLy8gYW5kIHRoZSB2aWV3cG9ydCBzaXplIGlzIGNhbGxlZCB0aGUgdHJhbnNmb3JtZWRBY3R1
YWxWaXNpYmxlU2l6ZS4KK2NsYXNzIFdlYlBhZ2VQcml2YXRlIDogcHVibGljIFBhZ2VDbGllbnRC
bGFja0JlcnJ5LCBwdWJsaWMgV2ViU2V0dGluZ3NEZWxlZ2F0ZSwgcHVibGljIFBsYXRmb3JtOjpH
dWFyZGVkUG9pbnRlckJhc2UgeworcHVibGljOgorICAgIGVudW0gVmlld01vZGUgeyBNb2JpbGUs
IERlc2t0b3AsIEZpeGVkRGVza3RvcCB9OworICAgIGVudW0gTG9hZFN0YXRlIHsgTm9uZSAvKiBv
biBpbnN0YW50aWF0aW9uIG9mIHBhZ2UgKi8sIFByb3Zpc2lvbmFsLCBDb21taXR0ZWQsIEZpbmlz
aGVkLCBGYWlsZWQgfTsKKworICAgIFdlYlBhZ2VQcml2YXRlKFdlYlBhZ2UqLCBXZWJQYWdlQ2xp
ZW50KiwgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYpOworICAgIHZpcnR1YWwgfldlYlBhZ2VQcml2
YXRlKCk7CisKKyAgICB2b2lkIGluaXQoY29uc3QgV2ViU3RyaW5nJiBwYWdlR3JvdXBOYW1lKTsK
KyAgICBib29sIGhhbmRsZU1vdXNlRXZlbnQoV2ViQ29yZTo6UGxhdGZvcm1Nb3VzZUV2ZW50Jik7
CisgICAgYm9vbCBoYW5kbGVXaGVlbEV2ZW50KFdlYkNvcmU6OlBsYXRmb3JtV2hlZWxFdmVudCYp
OworCisgICAgdm9pZCBsb2FkKGNvbnN0IGNoYXIqIHVybCwgY29uc3QgY2hhciogbmV0d29ya1Rv
a2VuLCBjb25zdCBjaGFyKiBtZXRob2QsIFBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6Q2FjaGVQ
b2xpY3ksIGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBkYXRhTGVuZ3RoLCBjb25zdCBjaGFyKiBj
b25zdCogaGVhZGVycywgc2l6ZV90IGhlYWRlcnNMZW5ndGgsIGJvb2wgaXNJbml0aWFsLCBib29s
IG11c3RIYW5kbGVJbnRlcm5hbGx5ID0gZmFsc2UsIGJvb2wgZm9yY2VEb3dubG9hZCA9IGZhbHNl
LCBjb25zdCBjaGFyKiBvdmVycmlkZUNvbnRlbnRUeXBlID0gIiIpOworICAgIHZvaWQgbG9hZFN0
cmluZyhjb25zdCBjaGFyKiBzdHJpbmcsIGNvbnN0IGNoYXIqIGJhc2VVUkwsIGNvbnN0IGNoYXIq
IG1pbWVUeXBlLCBjb25zdCBjaGFyKiBmYWlsaW5nVVJMID0gMCk7CisgICAgYm9vbCBleGVjdXRl
SmF2YVNjcmlwdChjb25zdCBjaGFyKiBzY3JpcHQsIEphdmFTY3JpcHREYXRhVHlwZSYgcmV0dXJu
VHlwZSwgV2ViU3RyaW5nJiByZXR1cm5WYWx1ZSk7CisgICAgYm9vbCBleGVjdXRlSmF2YVNjcmlw
dEluSXNvbGF0ZWRXb3JsZChjb25zdCBXZWJDb3JlOjpTY3JpcHRTb3VyY2VDb2RlJiwgSmF2YVNj
cmlwdERhdGFUeXBlJiByZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKTsKKworICAg
IHZvaWQgc3RvcEN1cnJlbnRMb2FkKCk7CisgICAgdm9pZCBwcmVwYXJlVG9EZXN0cm95KCk7CisK
KyAgICBMb2FkU3RhdGUgbG9hZFN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9sb2FkU3RhdGU7IH0K
KyAgICBib29sIGlzTG9hZGluZygpIGNvbnN0IHsgcmV0dXJuIG1fbG9hZFN0YXRlID09IFdlYlBh
Z2VQcml2YXRlOjpQcm92aXNpb25hbCB8fCBtX2xvYWRTdGF0ZSA9PSBXZWJQYWdlUHJpdmF0ZTo6
Q29tbWl0dGVkOyB9CisKKyAgICAvLyBDYWxsZWQgZnJvbSB3aXRoaW4gV2ViS2l0IHZpYSBGcmFt
ZUxvYWRlckNsaWVudEJsYWNrQmVycnkuCisgICAgdm9pZCBzZXRMb2FkU3RhdGUoTG9hZFN0YXRl
KTsKKworICAgIC8vIENsYW1wIHRoZSBzY2FsZS4KKyAgICBkb3VibGUgY2xhbXBlZFNjYWxlKGRv
dWJsZSBzY2FsZSkgY29uc3Q7CisKKyAgICAvLyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHpvb20s
IGNsYW1waW5nIHRoZSBzY2FsZSBwYXJhbWV0ZXIgaWYgcmVxdWlyZWQuCisgICAgYm9vbCBzaG91
bGRab29tQWJvdXRQb2ludChkb3VibGUgc2NhbGUsIGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQm
IGFuY2hvciwgYm9vbCBlbmZvcmVTY2FsZUNsYW1waW5nLCBkb3VibGUqIGNsYW1wZWRTY2FsZSk7
CisKKyAgICAvLyBTY2FsZSB0aGUgcGFnZSB0byB0aGUgZ2l2ZW4gc2NhbGUgYW5kIGFuY2hvciBh
Ym91dCB0aGUgcG9pbnQgd2hpY2ggaXMgc3BlY2lmaWVkIGluIHVudHJhbnNmb3JtZWQgY29udGVu
dCBjb29yZGluYXRlcy4KKyAgICBib29sIHpvb21BYm91dFBvaW50KGRvdWJsZSBzY2FsZSwgY29u
c3QgV2ViQ29yZTo6RmxvYXRQb2ludCYgYW5jaG9yLCBib29sIGVuZm9yY2VTY2FsZUNsYW1waW5n
ID0gdHJ1ZSwgYm9vbCBmb3JjZVJlbmRlcmluZyA9IGZhbHNlLCBib29sIGlzUmVzdG9yaW5nWm9v
bUxldmVsID0gZmFsc2UpOworICAgIGJvb2wgc2NoZWR1bGVab29tQWJvdXRQb2ludChkb3VibGUg
c2NhbGUsIGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQmIGFuY2hvciwgYm9vbCBlbmZvcmNlU2Nh
bGVDbGFtcGluZyA9IHRydWUsIGJvb2wgZm9yY2VSZW5kZXJpbmcgPSBmYWxzZSk7CisgICAgdm9p
ZCB1bnNjaGVkdWxlWm9vbUFib3V0UG9pbnQoKTsKKyAgICBXZWJDb3JlOjpJbnRQb2ludCBjYWxj
dWxhdGVSZWZsb3dlZFNjcm9sbFBvc2l0aW9uKGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQmIGFu
Y2hvck9mZnNldCwgZG91YmxlIGludmVyc2VTY2FsZSk7CisgICAgdm9pZCBzZXRUZXh0UmVmbG93
QW5jaG9yUG9pbnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBmb2NhbFBvaW50KTsKKworICAg
IHZvaWQgc2NoZWR1bGVQaW5jaFpvb21BYm91dFBvaW50KGRvdWJsZSBzY2FsZSwgY29uc3QgV2Vi
Q29yZTo6SW50UG9pbnQmIGFuY2hvcik7CisKKyAgICAvLyBQZXJmb3JtIGFjdHVhbCB6b29tIGZv
ciBibG9jayB6b29tLgorICAgIHZvaWQgem9vbUJsb2NrKCk7CisKKyAgICAvLyBDYWxsZWQgYnkg
dGhlIGJhY2tpbmcgc3RvcmUgYXMgd2VsbCBhcyB0aGUgbWV0aG9kIGJlbG93LgorICAgIHZvaWQg
cmVxdWVzdExheW91dElmTmVlZGVkKCkgY29uc3Q7CisgICAgdm9pZCBzZXROZWVkc0xheW91dCgp
OworCisgICAgV2ViQ29yZTo6SW50UG9pbnQgc2Nyb2xsUG9zaXRpb24oKSBjb25zdDsKKyAgICBX
ZWJDb3JlOjpJbnRQb2ludCBtYXhpbXVtU2Nyb2xsUG9zaXRpb24oKSBjb25zdDsKKyAgICB2b2lk
IHNldFNjcm9sbFBvc2l0aW9uKGNvbnN0IFdlYkNvcmU6OkludFBvaW50Jik7CisgICAgYm9vbCBz
Y3JvbGxCeShpbnQgZGVsdGFYLCBpbnQgZGVsdGFZLCBib29sIHNjcm9sbE1haW5GcmFtZSA9IHRy
dWUpOworCisgICAgdm9pZCBlbnF1ZXVlUmVuZGVyaW5nT2ZDbGlwcGVkQ29udGVudE9mU2Nyb2xs
YWJsZU5vZGVBZnRlckluUmVnaW9uU2Nyb2xsaW5nKFdlYkNvcmU6Ok5vZGUqKTsKKyAgICBzdGQ6
OnZlY3RvcjxQbGF0Zm9ybTo6U2Nyb2xsVmlld0Jhc2U+IGluUmVnaW9uU2Nyb2xsYWJsZUFyZWFz
Rm9yUG9pbnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50Jik7CisgICAgdm9pZCBub3RpZnlJblJl
Z2lvblNjcm9sbFN0YXR1c0NoYW5nZWQoYm9vbCBzdGF0dXMpOworICAgIHZvaWQgc2V0U2Nyb2xs
T3JpZ2luUG9pbnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50Jik7CisgICAgdm9pZCBzZXRIYXNJ
blJlZ2lvblNjcm9sbGFibGVBcmVhcyhib29sKTsKKworICAgIC8vIFRoZSBhY3R1YWwgdmlzaWJs
ZSBzaXplIGFzIHJlcG9ydGVkIGJ5IHRoZSBjbGllbnQsIGJ1dCBpbiBXZWJLaXQgY29vcmRpbmF0
ZXMuCisgICAgV2ViQ29yZTo6SW50U2l6ZSBhY3R1YWxWaXNpYmxlU2l6ZSgpIGNvbnN0OworCisg
ICAgLy8gVGhlIHZpZXdwb3J0IHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIGNsaWVudCdzIHdpbmRv
dyBzaXplLCBidXQgaW4gd2Via2l0IGNvb3JkaW5hdGVzLgorICAgIFdlYkNvcmU6OkludFNpemUg
dmlld3BvcnRTaXplKCkgY29uc3Q7CisKKyAgICAvLyBNb2RpZmllcyB0aGUgem9vbVRvRml0IGFs
Z29yaXRobSBsb2dpYyB0byBjb25zdHJ1Y3QgYSBzY2FsZSBzdWNoIHRoYXQgdGhlIHZpZXdwb3J0
U2l6ZSBhYm92ZSBpcyBlcXVhbCB0byB0aGlzIHNpemUuCisgICAgYm9vbCBoYXNWaXJ0dWFsVmll
d3BvcnQoKSBjb25zdDsKKyAgICBib29sIGlzVXNlclNjYWxhYmxlKCkgY29uc3QgeyByZXR1cm4g
bV91c2VyU2NhbGFibGU7IH0KKyAgICB2b2lkIHNldFVzZXJTY2FsYWJsZShib29sIHVzZXJTY2Fs
YWJsZSkgeyBtX3VzZXJTY2FsYWJsZSA9IHVzZXJTY2FsYWJsZTsgfQorCisgICAgLy8gU2V0cyBk
ZWZhdWx0IGxheW91dCBzaXplIHdpdGhvdXQgZG9pbmcgbGF5b3V0IG9yIG1hcmtpbmcgYXMgbmVl
ZGluZyBsYXlvdXQuCisgICAgdm9pZCBzZXREZWZhdWx0TGF5b3V0U2l6ZShjb25zdCBXZWJDb3Jl
OjpJbnRTaXplJik7CisKKyAgICAvLyBVcGRhdGVzIFdlYkNvcmUgd2hlbiB0aGUgdmlld3BvcnRT
aXplKCkgb3IgYWN0dWFsVmlzaWJsZVNpemUoKSBjaGFuZ2UuCisgICAgdm9pZCB1cGRhdGVWaWV3
cG9ydFNpemUoYm9vbCBzZXRGaXhlZFJlcG9ydGVkU2l6ZSA9IHRydWUsIGJvb2wgc2VuZFJlc2l6
ZUV2ZW50ID0gdHJ1ZSk7CisKKyAgICBXZWJDb3JlOjpGbG9hdFBvaW50IGNlbnRlck9mVmlzaWJs
ZUNvbnRlbnRzUmVjdCgpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFJlY3QgdmlzaWJsZUNvbnRl
bnRzUmVjdCgpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFNpemUgY29udGVudHNTaXplKCkgY29u
c3Q7CisgICAgV2ViQ29yZTo6SW50U2l6ZSBhYnNvbHV0ZVZpc2libGVPdmVyZmxvd1NpemUoKSBj
b25zdDsKKworICAgIC8vIFZpcnR1YWwgZnVuY3Rpb25zIGluaGVyaXRlZCBmcm9tIFBhZ2VDbGll
bnRCbGFja0JlcnJ5LgorICAgIHZpcnR1YWwgdm9pZCBzZXRDdXJzb3IoV2ViQ29yZTo6UGxhdGZv
cm1DdXJzb3JIYW5kbGUpOworICAgIHZpcnR1YWwgUGxhdGZvcm06Ok5ldHdvcmtTdHJlYW1GYWN0
b3J5KiBuZXR3b3JrU3RyZWFtRmFjdG9yeSgpOworICAgIHZpcnR1YWwgUGxhdGZvcm06OkdyYXBo
aWNzOjpXaW5kb3cqIHBsYXRmb3JtV2luZG93KCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNl
dFByZXZlbnRzU2NyZWVuRGltbWluZyhib29sIHByZXZlbnREaW1taW5nKTsKKyAgICB2aXJ0dWFs
IHZvaWQgc2hvd1ZpcnR1YWxLZXlib2FyZChib29sIHNob3dLZXlib2FyZCk7CisgICAgdmlydHVh
bCB2b2lkIGVuc3VyZUNvbnRlbnRWaXNpYmxlKGJvb2wgY2VudGVySW5WaWV3ID0gdHJ1ZSk7Cisg
ICAgdmlydHVhbCB2b2lkIHpvb21Ub0NvbnRlbnRSZWN0KGNvbnN0IFdlYkNvcmU6OkludFJlY3Qm
KTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJQbHVnaW4oV2ViQ29yZTo6UGx1Z2luVmlldyos
IGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlQYWdlT25Mb2FkKCk7CisgICAgdmlydHVh
bCBib29sIHNob3VsZFBsdWdpbkVudGVyRnVsbFNjcmVlbihXZWJDb3JlOjpQbHVnaW5WaWV3Kiwg
Y29uc3QgY2hhciopOworICAgIHZpcnR1YWwgdm9pZCBkaWRQbHVnaW5FbnRlckZ1bGxTY3JlZW4o
V2ViQ29yZTo6UGx1Z2luVmlldyosIGNvbnN0IGNoYXIqKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGlk
UGx1Z2luRXhpdEZ1bGxTY3JlZW4oV2ViQ29yZTo6UGx1Z2luVmlldyosIGNvbnN0IGNoYXIqKTsK
KyAgICB2aXJ0dWFsIHZvaWQgb25QbHVnaW5TdGFydEJhY2tncm91bmRQbGF5KFdlYkNvcmU6OlBs
dWdpblZpZXcqLCBjb25zdCBjaGFyKik7CisgICAgdmlydHVhbCB2b2lkIG9uUGx1Z2luU3RvcEJh
Y2tncm91bmRQbGF5KFdlYkNvcmU6OlBsdWdpblZpZXcqLCBjb25zdCBjaGFyKik7CisgICAgdmly
dHVhbCBib29sIGxvY2tPcmllbnRhdGlvbihib29sIGxhbmRzY2FwZSk7CisgICAgdmlydHVhbCB2
b2lkIHVubG9ja09yaWVudGF0aW9uKCk7CisgICAgdmlydHVhbCBpbnQgb3JpZW50YXRpb24oKSBj
b25zdDsKKyAgICB2aXJ0dWFsIGRvdWJsZSBjdXJyZW50Wm9vbUZhY3RvcigpIGNvbnN0OworICAg
IHZpcnR1YWwgaW50IHNob3dBbGVydERpYWxvZyhXZWJQYWdlQ2xpZW50OjpBbGVydFR5cGUgYXR5
cGUpOworICAgIHZpcnR1YWwgYm9vbCBpc0FjdGl2ZSgpIGNvbnN0OworCisgICAgLy8gQ2FsbGVk
IGZyb20gd2l0aGluIFdlYktpdCB2aWEgQ2hyb21lQ2xpZW50QmxhY2tCZXJyeS4KKyAgICB2b2lk
IGVudGVyRnVsbHNjcmVlbkZvck5vZGUoV2ViQ29yZTo6Tm9kZSopOworICAgIHZvaWQgZXhpdEZ1
bGxzY3JlZW5Gb3JOb2RlKFdlYkNvcmU6Ok5vZGUqKTsKKyAgICB2b2lkIGNvbnRlbnRzU2l6ZUNo
YW5nZWQoY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYpOworICAgIHZvaWQgb3ZlcmZsb3dFeGNlZWRz
Q29udGVudHNTaXplKCkgeyBtX292ZXJmbG93RXhjZWVkc0NvbnRlbnRzU2l6ZSA9IHRydWU7IH0K
KyAgICB2b2lkIGxheW91dEZpbmlzaGVkKCk7CisgICAgdm9pZCBzZXROZWVkVG91Y2hFdmVudHMo
Ym9vbCk7CisKKyAgICAvLyBDYWxsZWQgYWNjb3JkaW5nIHRvIG91ciBoZXVyaXN0aWMgb3IgZnJv
bSBzZXRMb2FkU3RhdGUgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgaGF2ZSBhIHZpcnR1YWwgdmll
d3BvcnQuCisgICAgdm9pZCB6b29tVG9Jbml0aWFsU2NhbGVPbkxvYWQoKTsKKworICAgIC8vIFZh
cmlvdXMgc2NhbGUgZmFjdG9ycy4KKyAgICBkb3VibGUgY3VycmVudFNjYWxlKCkgY29uc3QgeyBy
ZXR1cm4gbV90cmFuc2Zvcm1hdGlvbk1hdHJpeC0+bTExKCk7IH0KKyAgICBkb3VibGUgem9vbVRv
Rml0U2NhbGUoKSBjb25zdDsKKyAgICBkb3VibGUgaW5pdGlhbFNjYWxlKCkgY29uc3Q7CisgICAg
dm9pZCBzZXRJbml0aWFsU2NhbGUoZG91YmxlIHNjYWxlKSB7IG1faW5pdGlhbFNjYWxlID0gc2Nh
bGU7IH0KKyAgICBkb3VibGUgbWluaW11bVNjYWxlKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJl
dHVybiAobV9taW5pbXVtU2NhbGUgPiB6b29tVG9GaXRTY2FsZSgpICYmIG1fbWluaW11bVNjYWxl
IDw9IG1heGltdW1TY2FsZSgpKSA/IG1fbWluaW11bVNjYWxlIDogem9vbVRvRml0U2NhbGUoKTsK
KyAgICB9CisKKyAgICB2b2lkIHNldE1pbmltdW1TY2FsZShkb3VibGUgc2NhbGUpIHsgbV9taW5p
bXVtU2NhbGUgPSBzY2FsZTsgfQorICAgIGRvdWJsZSBtYXhpbXVtU2NhbGUoKSBjb25zdDsKKyAg
ICB2b2lkIHNldE1heGltdW1TY2FsZShkb3VibGUgc2NhbGUpIHsgbV9tYXhpbXVtU2NhbGUgPSBz
Y2FsZTsgfQorICAgIHZvaWQgcmVzZXRTY2FsZXMoKTsKKworICAgIC8vIE5vdGU6IHRvIG1ha2Ug
dGhpcyByZWZsb3cgd2lkdGggdHJhbnNmb3JtIGludmFyaWFudCBqdXN0IHVzZQorICAgIC8vIHRy
YW5zZm9ybWVkQWN0dWFsVmlzaWJsZVNpemUoKSBoZXJlIGluc3RlYWQhCisgICAgaW50IHJlZmxv
d1dpZHRoKCkgY29uc3QgeyByZXR1cm4gYWN0dWFsVmlzaWJsZVNpemUoKS53aWR0aCgpOyB9CisK
KyAgICAvLyBUaGVzZSBtZXRob2RzIGdpdmUgdGhlIHJlYWwgZ2VvbWV0cnkgb2YgdGhlIGRldmlj
ZSBnaXZlbiB0aGUgY3VycmVudGx5IHNldCB0cmFuc2Zvcm0uCisgICAgV2ViQ29yZTo6SW50UG9p
bnQgdHJhbnNmb3JtZWRTY3JvbGxQb3NpdGlvbigpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFBv
aW50IHRyYW5zZm9ybWVkTWF4aW11bVNjcm9sbFBvc2l0aW9uKCkgY29uc3Q7CisgICAgV2ViQ29y
ZTo6SW50U2l6ZSB0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKCkgY29uc3Q7CisgICAgV2Vi
Q29yZTo6SW50U2l6ZSB0cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpIGNvbnN0OworICAgIFdlYkNv
cmU6OkludFJlY3QgdHJhbnNmb3JtZWRWaXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3Q7CisgICAg
V2ViQ29yZTo6SW50U2l6ZSB0cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpIGNvbnN0OworCisgICAg
Ly8gR2VuZXJpYyBjb252ZXJzaW9ucyBvZiBwb2ludHMsIHJlY3RzLCByZWxhdGl2ZSB0byBhbmQg
ZnJvbSBjb250ZW50cyBhbmQgdmlld3BvcnQuCisgICAgV2ViQ29yZTo6SW50UG9pbnQgbWFwRnJv
bUNvbnRlbnRzVG9WaWV3cG9ydChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYpIGNvbnN0OworICAg
IFdlYkNvcmU6OkludFBvaW50IG1hcEZyb21WaWV3cG9ydFRvQ29udGVudHMoY29uc3QgV2ViQ29y
ZTo6SW50UG9pbnQmKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IG1hcEZyb21Db250ZW50
c1RvVmlld3BvcnQoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYpIGNvbnN0OworICAgIFdlYkNvcmU6
OkludFJlY3QgbWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyhjb25zdCBXZWJDb3JlOjpJbnRSZWN0
JikgY29uc3Q7CisKKyAgICAvLyBHZW5lcmljIGNvbnZlcnNpb25zIG9mIHBvaW50cywgcmVjdHMs
IHJlbGF0aXZlIHRvIGFuZCBmcm9tIHRyYW5zZm9ybWVkIGNvbnRlbnRzIGFuZCB0cmFuc2Zvcm1l
ZCB2aWV3cG9ydC4KKyAgICBXZWJDb3JlOjpJbnRQb2ludCBtYXBGcm9tVHJhbnNmb3JtZWRDb250
ZW50c1RvVHJhbnNmb3JtZWRWaWV3cG9ydChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYpIGNvbnN0
OworICAgIFdlYkNvcmU6OkludFBvaW50IG1hcEZyb21UcmFuc2Zvcm1lZFZpZXdwb3J0VG9UcmFu
c2Zvcm1lZENvbnRlbnRzKGNvbnN0IFdlYkNvcmU6OkludFBvaW50JikgY29uc3Q7CisgICAgV2Vi
Q29yZTo6SW50UmVjdCBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVHJhbnNmb3JtZWRWaWV3
cG9ydChjb25zdCBXZWJDb3JlOjpJbnRSZWN0JikgY29uc3Q7CisgICAgV2ViQ29yZTo6SW50UmVj
dCBtYXBGcm9tVHJhbnNmb3JtZWRWaWV3cG9ydFRvVHJhbnNmb3JtZWRDb250ZW50cyhjb25zdCBX
ZWJDb3JlOjpJbnRSZWN0JikgY29uc3Q7CisKKyAgICAvLyBHZW5lcmljIGNvbnZlcnNpb25zIG9m
IHBvaW50cywgcmVjdHMsIGFuZCBzaXplcyB0byBhbmQgZnJvbSB0cmFuc2Zvcm1lZCBjb29yZGlu
YXRlcy4KKyAgICBXZWJDb3JlOjpJbnRQb2ludCBtYXBUb1RyYW5zZm9ybWVkKGNvbnN0IFdlYkNv
cmU6OkludFBvaW50JikgY29uc3Q7CisgICAgV2ViQ29yZTo6RmxvYXRQb2ludCBtYXBUb1RyYW5z
Zm9ybWVkRmxvYXRQb2ludChjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50JikgY29uc3Q7CisgICAg
V2ViQ29yZTo6SW50UG9pbnQgbWFwRnJvbVRyYW5zZm9ybWVkKGNvbnN0IFdlYkNvcmU6OkludFBv
aW50JikgY29uc3Q7CisgICAgV2ViQ29yZTo6RmxvYXRQb2ludCBtYXBGcm9tVHJhbnNmb3JtZWRG
bG9hdFBvaW50KGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQmKSBjb25zdDsKKyAgICBXZWJDb3Jl
OjpGbG9hdFJlY3QgbWFwRnJvbVRyYW5zZm9ybWVkRmxvYXRSZWN0KGNvbnN0IFdlYkNvcmU6OkZs
b2F0UmVjdCYpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFNpemUgbWFwVG9UcmFuc2Zvcm1lZChj
b25zdCBXZWJDb3JlOjpJbnRTaXplJikgY29uc3Q7CisgICAgV2ViQ29yZTo6SW50U2l6ZSBtYXBG
cm9tVHJhbnNmb3JtZWQoY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYpIGNvbnN0OworICAgIFdlYkNv
cmU6OkludFJlY3QgbWFwVG9UcmFuc2Zvcm1lZChjb25zdCBXZWJDb3JlOjpJbnRSZWN0JikgY29u
c3Q7CisgICAgdm9pZCBjbGlwVG9UcmFuc2Zvcm1lZENvbnRlbnRzUmVjdChXZWJDb3JlOjpJbnRS
ZWN0JikgY29uc3Q7CisgICAgV2ViQ29yZTo6SW50UmVjdCBtYXBGcm9tVHJhbnNmb3JtZWQoY29u
c3QgV2ViQ29yZTo6SW50UmVjdCYpIGNvbnN0OworICAgIGJvb2wgdHJhbnNmb3JtZWRQb2ludEVx
dWFsc1VudHJhbnNmb3JtZWRQb2ludChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgdHJhbnNmb3Jt
ZWRQb2ludCwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIHVudHJhbnNmb3JtZWRQb2ludCk7CisK
KyAgICAvLyBOb3RpZmljYXRpb24gbWV0aG9kcyB0aGF0IGRlbGl2ZXIgY2hhbmdlcyB0byB0aGUg
cmVhbCBnZW9tZXRyeSBvZiB0aGUgZGV2aWNlIGFzIHNwZWNpZmllZCBhYm92ZS4KKyAgICB2b2lk
IG5vdGlmeVRyYW5zZm9ybUNoYW5nZWQoKTsKKyAgICB2b2lkIG5vdGlmeVRyYW5zZm9ybWVkQ29u
dGVudHNTaXplQ2hhbmdlZCgpOworICAgIHZvaWQgbm90aWZ5VHJhbnNmb3JtZWRTY3JvbGxDaGFu
Z2VkKCk7CisKKyAgICB2b2lkIGFzc2lnbkZvY3VzKFBsYXRmb3JtOjpGb2N1c0RpcmVjdGlvbik7
CisgICAgUGxhdGZvcm06OkludFJlY3QgZm9jdXNOb2RlUmVjdCgpOworICAgIFdlYkNvcmU6Oklu
dFJlY3QgZ2V0UmVjdXJzaXZlVmlzaWJsZVdpbmRvd1JlY3QoV2ViQ29yZTo6U2Nyb2xsVmlldyos
IGJvb2wgbm9DbGlwT2ZNYWluRnJhbWUgPSBmYWxzZSk7CisKKyAgICBXZWJDb3JlOjpJbnRQb2lu
dCBmcmFtZU9mZnNldChjb25zdCBXZWJDb3JlOjpGcmFtZSopIGNvbnN0OworCisgICAgV2ViQ29y
ZTo6Tm9kZSogYmVzdE5vZGVGb3Jab29tVW5kZXJQb2ludChjb25zdCBXZWJDb3JlOjpJbnRQb2lu
dCYpOworICAgIFdlYkNvcmU6Ok5vZGUqIGJlc3RDaGlsZE5vZGVGb3JDbGlja1JlY3QoV2ViQ29y
ZTo6Tm9kZSogcGFyZW50Tm9kZSwgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgY2xpY2tSZWN0KTsK
KyAgICBXZWJDb3JlOjpOb2RlKiBub2RlRm9yWm9vbVVuZGVyUG9pbnQoY29uc3QgV2ViQ29yZTo6
SW50UG9pbnQmKTsKKyAgICBXZWJDb3JlOjpOb2RlKiBhZGp1c3RlZEJsb2NrWm9vbU5vZGVGb3Ja
b29tTGltaXRzKFdlYkNvcmU6Ok5vZGUqKTsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IHJlY3RGb3JO
b2RlKFdlYkNvcmU6Ok5vZGUqKTsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IGJsb2NrWm9vbVJlY3RG
b3JOb2RlKFdlYkNvcmU6Ok5vZGUqKTsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IGFkanVzdFJlY3RP
ZmZzZXRGb3JGcmFtZU9mZnNldChjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiwgY29uc3QgV2ViQ29y
ZTo6Tm9kZSopOworICAgIGJvb2wgY29tcGFyZU5vZGVzRm9yQmxvY2tab29tKFdlYkNvcmU6Ok5v
ZGUqIG4xLCBXZWJDb3JlOjpOb2RlKiBuMik7CisgICAgZG91YmxlIG5ld1NjYWxlRm9yQmxvY2ta
b29tUmVjdChjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiwgZG91YmxlIG9sZFNjYWxlLCBkb3VibGUg
bWFyZ2luKTsKKyAgICBkb3VibGUgbWF4QmxvY2tab29tU2NhbGUoKSBjb25zdDsKKworICAgIC8v
IFBsdWdpbiBNZXRob2RzLgorICAgIHZvaWQgbm90aWZ5UGx1Z2luUmVjdENoYW5nZWQoaW50IGlk
LCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiByZWN0Q2hhbmdlZCk7CisKKyAgICAvLyBDb250ZXh0
IE1ldGhvZHMuCisgICAgQWN0aXZlTm9kZUNvbnRleHQgYWN0aXZlTm9kZUNvbnRleHQoVGFyZ2V0
RGV0ZWN0aW9uU3RyYXRlZ3kpOworICAgIFBhc3NSZWZQdHI8V2ViQ29yZTo6Tm9kZT4gY29udGV4
dE5vZGUoVGFyZ2V0RGV0ZWN0aW9uU3RyYXRlZ3kpOworCisjaWYgRU5BQkxFKFZJRVdQT1JUX1JF
RkxPVykKKyAgICB2b2lkIHRvZ2dsZVRleHRSZWZsb3dJZkVuYWJsZWRGb3JCbG9ja1pvb21Pbmx5
KGJvb2wgc2hvdWxkRW5hYmxlVGV4dFJlZmxvdyA9IGZhbHNlKTsKKyNlbmRpZgorCisgICAgdm9p
ZCBzZWxlY3Rpb25DaGFuZ2VkKFdlYkNvcmU6OkZyYW1lKik7CisKKyAgICB2b2lkIHVwZGF0ZURl
bGVnYXRlZE92ZXJsYXlzKGJvb2wgZGlzcGF0Y2hlZCA9IGZhbHNlKTsKKworICAgIHZvaWQgdXBk
YXRlQ3Vyc29yKCk7CisKKyAgICB2b2lkIG9uSW5wdXRMb2NhbGVDaGFuZ2VkKGJvb2wgaXNSVEwp
OworCisgICAgVmlld01vZGUgdmlld01vZGUoKSBjb25zdCB7IHJldHVybiBtX3ZpZXdNb2RlOyB9
CisgICAgYm9vbCBzZXRWaWV3TW9kZShWaWV3TW9kZSk7IC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUg
Y2hhbmdlIHJlcXVpcmVzIHJlLWxheW91dC4KKworICAgIHZvaWQgc2V0U2hvdWxkVXNlRml4ZWRE
ZXNrdG9wTW9kZShib29sIGIpIHsgbV9zaG91bGRVc2VGaXhlZERlc2t0b3BNb2RlID0gYjsgfQor
CisgICAgYm9vbCB1c2VGaXhlZExheW91dCgpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFNpemUg
Zml4ZWRMYXlvdXRTaXplKGJvb2wgc25hcFRvSW5jcmVtZW50ID0gZmFsc2UpIGNvbnN0OworCisg
ICAgLy8gWm9vbVRvRml0T25Mb2FkIGNhbiBsZWFkIHRvIGEgbGFyZ2UgcmVjdXJzaW9uIGRlcHRo
IGluIEZyYW1lVmlldzo6bGF5b3V0KCkgYXMgd2UgYXR0ZW1wdAorICAgIC8vIHRvIGRldGVybWlu
ZSB0aGUgem9vbSBzY2FsZSBmYWN0b3Igc28gYXMgdG8gaGF2ZSB0aGUgY29udGVudCBvZiB0aGUg
cGFnZSBmaXQgd2l0aGluIHRoZQorICAgIC8vIGFyZWEgb2YgdGhlIGZyYW1lLiBGcm9tIG9ic2Vy
dmF0aW9uLCB3ZSBjYW4gYmFpbCBvdXQgYWZ0ZXIgYSByZWN1cnNpb24gZGVwdGggb2YgMTAgYW5k
CisgICAgLy8gc3RpbGwgaGF2ZSByZWFzb25hYmxlIHJlc3VsdHMuCisgICAgYm9vbCBkaWRMYXlv
dXRFeGNlZWRNYXhpbXVtSXRlcmF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fbmVzdGVkTGF5b3V0
RmluaXNoZWRDb3VudCA+IDEwOyB9CisKKyAgICB2b2lkIGNsZWFyRm9jdXNOb2RlKCk7CisgICAg
V2ViQ29yZTo6RnJhbWUqIGZvY3VzZWRPck1haW5GcmFtZSgpIGNvbnN0OworICAgIFdlYkNvcmU6
OkZyYW1lKiBtYWluRnJhbWUoKSBjb25zdCB7IHJldHVybiBtX21haW5GcmFtZTsgfQorCisgICAg
Ym9vbCBzY3JvbGxOb2RlUmVjdXJzaXZlbHkoV2ViQ29yZTo6Tm9kZSogb3JpZ2luYWxOb2RlLCBj
b25zdCBXZWJDb3JlOjpJbnRTaXplJiBkZWx0YSk7CisgICAgYm9vbCBzY3JvbGxSZW5kZXJlcihX
ZWJDb3JlOjpSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBXZWJDb3JlOjpJbnRTaXplJiBk
ZWx0YSk7CisgICAgdm9pZCBhZGp1c3RTY3JvbGxEZWx0YShjb25zdCBXZWJDb3JlOjpJbnRQb2lu
dCYgbWF4T2Zmc2V0LCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgY3VycmVudE9mZnNldCwgV2Vi
Q29yZTo6SW50U2l6ZSYgZGVsdGEpIGNvbnN0OworCisgICAgYm9vbCBjYW5TY3JvbGxSZW5kZXJC
b3goV2ViQ29yZTo6UmVuZGVyQm94Kik7CisgICAgYm9vbCBjYW5TY3JvbGxJbm5lckZyYW1lKFdl
YkNvcmU6OkZyYW1lKikgY29uc3Q7CisKKyNpZiBFTkFCTEUoRVZFTlRfTU9ERV9NRVRBVEFHUykK
KyAgICB2b2lkIGRpZFJlY2VpdmVDdXJzb3JFdmVudE1vZGUoV2ViQ29yZTo6Q3Vyc29yRXZlbnRN
b2RlKTsKKyAgICB2b2lkIGRpZFJlY2VpdmVUb3VjaEV2ZW50TW9kZShXZWJDb3JlOjpUb3VjaEV2
ZW50TW9kZSk7CisjZW5kaWYKKworICAgIHZvaWQgZGlzcGF0Y2hWaWV3cG9ydFByb3BlcnRpZXNE
aWRDaGFuZ2UoY29uc3QgV2ViQ29yZTo6Vmlld3BvcnRBcmd1bWVudHMmKTsKKyAgICBXZWJDb3Jl
OjpJbnRTaXplIHJlY29tcHV0ZVZpcnR1YWxWaWV3cG9ydEZyb21WaWV3cG9ydEFyZ3VtZW50cygp
OworCisgICAgdm9pZCByZXNldEJsb2NrWm9vbSgpOworCisgICAgdm9pZCB6b29tQWJvdXRQb2lu
dFRpbWVyRmlyZWQoV2ViQ29yZTo6VGltZXI8V2ViUGFnZVByaXZhdGU+Kik7CisgICAgYm9vbCBz
aG91bGRTZW5kUmVzaXplRXZlbnQoKTsKKyAgICB2b2lkIHNjcm9sbEV2ZW50VGltZXJGaXJlZChX
ZWJDb3JlOjpUaW1lcjxXZWJQYWdlUHJpdmF0ZT4qKTsKKyAgICB2b2lkIHJlc2l6ZUV2ZW50VGlt
ZXJGaXJlZChXZWJDb3JlOjpUaW1lcjxXZWJQYWdlUHJpdmF0ZT4qKTsKKworICAgIC8vIElmIHRo
aXMgdXJsIHNob3VsZCBiZSBoYW5kbGVkIGFzIGEgcGF0dGVybiwgcmV0dXJucyB0aGUgcGF0dGVy
bgorICAgIC8vIG90aGVyd2lzZSwgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgICAgU3RyaW5n
IGZpbmRQYXR0ZXJuU3RyaW5nRm9yVXJsKGNvbnN0IFdlYkNvcmU6OktVUkwmKSBjb25zdDsKKwor
ICAgIHZvaWQgc3VzcGVuZEJhY2tpbmdTdG9yZSgpOworICAgIHZvaWQgcmVzdW1lQmFja2luZ1N0
b3JlKCk7CisKKyAgICB2b2lkIHNldFNob3VsZFJlc2V0VGlsZXNXaGVuU2hvd24oYm9vbCBmbGFn
KSB7IG1fc2hvdWxkUmVzZXRUaWxlc1doZW5TaG93biA9IGZsYWc7IH0KKyAgICBib29sIHNob3Vs
ZFJlc2V0VGlsZXNXaGVuU2hvd24oKSBjb25zdCB7IHJldHVybiBtX3Nob3VsZFJlc2V0VGlsZXNX
aGVuU2hvd247IH0KKworICAgIHZvaWQgc2V0U2NyZWVuT3JpZW50YXRpb24oaW50KTsKKworICAg
IC8vIFNjcm9sbCBhbmQvb3Igem9vbSBzbyB0aGF0IHRoZSBXZWJQYWdlIGZpdHMgdGhlIG5ldyBh
Y3R1YWwKKyAgICAvLyB2aXNpYmxlIHNpemUuCisgICAgdm9pZCBzZXRWaWV3cG9ydFNpemUoY29u
c3QgV2ViQ29yZTo6SW50U2l6ZSYgdHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSwgYm9vbCBl
bnN1cmVGb2N1c0VsZW1lbnRWaXNpYmxlKTsKKyAgICB2b2lkIHNjcmVlblJvdGF0ZWQoKTsgLy8g
SGVscGVyIG1ldGhvZCBmb3Igc2V0Vmlld3BvcnRTaXplKCkuCisKKyAgICB2b2lkIHNjaGVkdWxl
RGVmZXJyYWJsZVRpbWVyKFdlYkNvcmU6OlRpbWVyPFdlYlBhZ2VQcml2YXRlPiosIGRvdWJsZSB0
aW1lT3V0KTsKKyAgICB2b2lkIHVuc2NoZWR1bGVBbGxEZWZlcnJhYmxlVGltZXJzKCk7CisgICAg
dm9pZCB3aWxsRGVmZXJMb2FkaW5nKCk7CisgICAgdm9pZCBkaWRSZXN1bWVMb2FkaW5nKCk7CisK
KyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGVzY2FwZSBrZXkgaGFuZGxlciBzaG91bGQgem9v
bS4KKyAgICBib29sIHNob3VsZFpvb21PbkVzY2FwZSgpIGNvbnN0OworCisgICAgV2ViQ29yZTo6
VHJhbnNmb3JtYXRpb25NYXRyaXgqIHRyYW5zZm9ybWF0aW9uTWF0cml4KCkgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiBtX3RyYW5zZm9ybWF0aW9uTWF0cml4OworICAgIH0KKworI2lmIFVT
RShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAvLyBXZWJLaXQgdGhyZWFkLgorICAgIGJv
b2wgbmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpOworICAgIHZvaWQgcm9vdExh
eWVyQ29tbWl0VGltZXJGaXJlZChXZWJDb3JlOjpUaW1lcjxXZWJQYWdlUHJpdmF0ZT4qKTsKKyAg
ICBib29sIGNvbW1pdFJvb3RMYXllcklmTmVlZGVkKCk7CisgICAgV2ViQ29yZTo6TGF5ZXJSZW5k
ZXJpbmdSZXN1bHRzIGxhc3RDb21wb3NpdGluZ1Jlc3VsdHMoKSBjb25zdDsKKworICAgIC8vIFdl
YktpdCB0aHJlYWQsIHBsdW1iZWQgdGhyb3VnaCBmcm9tIENocm9tZUNsaWVudEJsYWNrQmVycnku
CisgICAgdm9pZCBzZXRSb290TGF5ZXJXZWJLaXRUaHJlYWQoV2ViQ29yZTo6RnJhbWUqLCBXZWJD
b3JlOjpMYXllcldlYktpdFRocmVhZCopOworICAgIHZvaWQgc2V0TmVlZHNPbmVTaG90RHJhd2lu
Z1N5bmNocm9uaXphdGlvbigpOworICAgIHZvaWQgc2NoZWR1bGVSb290TGF5ZXJDb21taXQoKTsK
KworICAgIC8vIFRocmVhZCBzYWZlLgorICAgIHZvaWQgcmVzZXRDb21wb3NpdGluZ1N1cmZhY2Uo
KTsKKyAgICB2b2lkIGRyYXdMYXllcnNPbkNvbW1pdCgpOyAvLyBJbmNsdWRpbmcgYmFja2luZyBz
dG9yZSBibGl0LgorICAgIGJvb2wgZHJhd1N1YkxheWVycyhjb25zdCBXZWJDb3JlOjpJbnRSZWN0
JiBkc3RSZWN0LCBjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmIGNvbnRlbnRzKTsKKyAgICBib29s
IGRyYXdTdWJMYXllcnMoKTsgLy8gRHJhdyB0aGVtIGF0IGxhc3Qga25vd24gcG9zaXRpb24uCisK
KyAgICAvLyBDb21wb3NpdGluZyB0aHJlYWQuCisgICAgdm9pZCBzZXRSb290TGF5ZXJDb21wb3Np
dGluZ1RocmVhZChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkKik7CisgICAgdm9pZCBj
b21taXRSb290TGF5ZXIoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYsIGNvbnN0IFdlYkNvcmU6Oklu
dFNpemUmKTsKKyAgICB2b2lkIHNldElzQWNjZWxlcmF0ZWRDb21wb3NpdGluZ0FjdGl2ZShib29s
KTsKKyAgICB2b2lkIGRlc3Ryb3lDb21wb3NpdG9yKCk7CisgICAgdm9pZCBzeW5jRGVzdHJveUNv
bXBvc2l0b3JPbkNvbXBvc2l0aW5nVGhyZWFkKCk7CisgICAgdm9pZCBkZXN0cm95TGF5ZXJSZXNv
dXJjZXMoKTsKKyAgICB2b2lkIHN1c3BlbmRSb290TGF5ZXJDb21taXQoKTsKKyAgICB2b2lkIHJl
c3VtZVJvb3RMYXllckNvbW1pdCgpOworICAgIHZvaWQgYmxpdFZpc2libGVDb250ZW50cygpOwor
I2VuZGlmCisKKyAgICBib29sIGRpc3BhdGNoVG91Y2hFdmVudFRvRnVsbFNjcmVlblBsdWdpbihX
ZWJDb3JlOjpQbHVnaW5WaWV3KiwgY29uc3QgUGxhdGZvcm06OlRvdWNoRXZlbnQmKTsKKyAgICBi
b29sIGRpc3BhdGNoVG91Y2hQb2ludEFzTW91c2VFdmVudFRvRnVsbFNjcmVlblBsdWdpbihXZWJD
b3JlOjpQbHVnaW5WaWV3KiwgY29uc3QgUGxhdGZvcm06OlRvdWNoUG9pbnQmKTsKKyAgICBib29s
IGRpc3BhdGNoTW91c2VFdmVudFRvRnVsbFNjcmVlblBsdWdpbihXZWJDb3JlOjpQbHVnaW5WaWV3
KiwgY29uc3QgUGxhdGZvcm06Ok1vdXNlRXZlbnQmKTsKKworICAgIEJhY2tpbmdTdG9yZUNsaWVu
dCogYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUoY29uc3QgV2ViQ29yZTo6RnJhbWUqKSBjb25z
dDsKKyAgICB2b2lkIGFkZEJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKGNvbnN0IFdlYkNvcmU6
OkZyYW1lKiwgQmFja2luZ1N0b3JlQ2xpZW50Kik7CisgICAgdm9pZCByZW1vdmVCYWNraW5nU3Rv
cmVDbGllbnRGb3JGcmFtZShjb25zdCBXZWJDb3JlOjpGcmFtZSopOworCisgICAgLy8gQ2xlYW4g
dXAgYW55IGRvY3VtZW50IHJlbGF0ZWQgZGF0YSB3ZSBtaWdodCBiZSBob2xkaW5nLgorICAgIHZv
aWQgY2xlYXJEb2N1bWVudERhdGEoY29uc3QgV2ViQ29yZTo6RG9jdW1lbnQqKTsKKworICAgIHN0
YXRpYyBXZWJDb3JlOjpSZW5kZXJMYXllciogZW5jbG9zaW5nUG9zaXRpb25lZEFuY2VzdG9yT3JT
ZWxmSWZQb3NpdGlvbmVkKFdlYkNvcmU6OlJlbmRlckxheWVyKik7CisgICAgc3RhdGljIFdlYkNv
cmU6OlJlbmRlckxheWVyKiBlbmNsb3NpbmdGaXhlZFBvc2l0aW9uZWRBbmNlc3Rvck9yU2VsZklm
Rml4ZWRQb3NpdGlvbmVkKFdlYkNvcmU6OlJlbmRlckxheWVyKik7CisKKyAgICBzdGF0aWMgV2Vi
Q29yZTo6SW50U2l6ZSBkZWZhdWx0TWF4TGF5b3V0U2l6ZSgpOworCisgICAgV2ViUGFnZSogbV93
ZWJQYWdlOworICAgIFdlYlBhZ2VDbGllbnQqIG1fY2xpZW50OworICAgIFdlYkNvcmU6OlBhZ2Uq
IG1fcGFnZTsKKyAgICBXZWJDb3JlOjpGcmFtZSogbV9tYWluRnJhbWU7CisgICAgUmVmUHRyPFdl
YkNvcmU6Ok5vZGU+IG1fY3VycmVudENvbnRleHROb2RlOworICAgIFdlYlNldHRpbmdzKiBtX3dl
YlNldHRpbmdzOworCisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCisgICAgT3duUHRy
PFdlYkNvcmU6OkphdmFTY3JpcHREZWJ1Z2dlckJsYWNrQmVycnk+IG1fc2NyaXB0RGVidWdnZXI7
CisjZW5kaWYKKworICAgIGJvb2wgbV92aXNpYmxlOworICAgIGJvb2wgbV9zaG91bGRSZXNldFRp
bGVzV2hlblNob3duOworICAgIGJvb2wgbV91c2VyU2NhbGFibGU7CisgICAgYm9vbCBtX3VzZXJQ
ZXJmb3JtZWRNYW51YWxab29tOworICAgIGJvb2wgbV91c2VyUGVyZm9ybWVkTWFudWFsU2Nyb2xs
OworICAgIGJvb2wgbV9jb250ZW50c1NpemVDaGFuZ2VkOworICAgIGJvb2wgbV9vdmVyZmxvd0V4
Y2VlZHNDb250ZW50c1NpemU7CisgICAgYm9vbCBtX3Jlc2V0VmlydHVhbFZpZXdwb3J0T25Db21t
aXR0ZWQ7CisgICAgYm9vbCBtX3Nob3VsZFVzZUZpeGVkRGVza3RvcE1vZGU7CisgICAgYm9vbCBt
X25lZWRUb3VjaEV2ZW50czsKKyAgICBpbnQgbV9wcmV2ZW50SWRsZURpbW1pbmdDb3VudDsKKwor
I2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCisgICAgYm9vbCBtX3ByZXZlbnREZWZhdWx0T25Ub3Vj
aFN0YXJ0OworI2VuZGlmCisgICAgdW5zaWduZWQgbV9uZXN0ZWRMYXlvdXRGaW5pc2hlZENvdW50
OworICAgIFdlYkNvcmU6OkludFNpemUgbV9wcmV2aW91c0NvbnRlbnRzU2l6ZTsKKyAgICBpbnQg
bV9hY3R1YWxWaXNpYmxlV2lkdGg7CisgICAgaW50IG1fYWN0dWFsVmlzaWJsZUhlaWdodDsKKyAg
ICBpbnQgbV92aXJ0dWFsVmlld3BvcnRXaWR0aDsKKyAgICBpbnQgbV92aXJ0dWFsVmlld3BvcnRI
ZWlnaHQ7CisgICAgV2ViQ29yZTo6SW50U2l6ZSBtX2RlZmF1bHRMYXlvdXRTaXplOworICAgIFdl
YkNvcmU6OlZpZXdwb3J0QXJndW1lbnRzIG1fdmlld3BvcnRBcmd1bWVudHM7IC8vIFdlIGtlZXAg
dGhpcyBhcm91bmQgc2luY2Ugd2UgbWF5IG5lZWQgdG8gcmUtZXZhbHVhdGUgdGhlIGFyZ3VtZW50
cyBvbiByb3RhdGlvbi4KKyAgICBib29sIG1fZGlkUmVzdG9yZUZyb21QYWdlQ2FjaGU7CisgICAg
Vmlld01vZGUgbV92aWV3TW9kZTsKKyAgICBMb2FkU3RhdGUgbV9sb2FkU3RhdGU7CisgICAgV2Vi
Q29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgqIG1fdHJhbnNmb3JtYXRpb25NYXRyaXg7CisgICAg
QmFja2luZ1N0b3JlKiBtX2JhY2tpbmdTdG9yZTsKKyAgICBCYWNraW5nU3RvcmVDbGllbnQqIG1f
YmFja2luZ1N0b3JlQ2xpZW50OworICAgIEluUGFnZVNlYXJjaE1hbmFnZXIqIG1faW5QYWdlU2Vh
cmNoTWFuYWdlcjsKKyAgICBJbnB1dEhhbmRsZXIqIG1faW5wdXRIYW5kbGVyOworICAgIFNlbGVj
dGlvbkhhbmRsZXIqIG1fc2VsZWN0aW9uSGFuZGxlcjsKKyAgICBUb3VjaEV2ZW50SGFuZGxlciog
bV90b3VjaEV2ZW50SGFuZGxlcjsKKworI2lmIEVOQUJMRShFVkVOVF9NT0RFX01FVEFUQUdTKQor
ICAgIFdlYkNvcmU6OkN1cnNvckV2ZW50TW9kZSBtX2N1cnNvckV2ZW50TW9kZTsKKyAgICBXZWJD
b3JlOjpUb3VjaEV2ZW50TW9kZSBtX3RvdWNoRXZlbnRNb2RlOworI2VuZGlmCisKKyAgICBQbGF0
Zm9ybTo6QmxhY2tCZXJyeUN1cnNvciBtX2N1cnJlbnRDdXJzb3I7CisKKyAgICBEdW1wUmVuZGVy
VHJlZUNsaWVudCogbV9kdW1wUmVuZGVyVHJlZTsKKworICAgIGRvdWJsZSBtX2luaXRpYWxTY2Fs
ZTsKKyAgICBkb3VibGUgbV9taW5pbXVtU2NhbGU7CisgICAgZG91YmxlIG1fbWF4aW11bVNjYWxl
OworCisgICAgLy8gQmxvY2sgem9vbSBhbmltYXRpb24gZGF0YS4KKyAgICBXZWJDb3JlOjpGbG9h
dFBvaW50IG1fZmluYWxCbG9ja1BvaW50OworICAgIFdlYkNvcmU6OkZsb2F0UG9pbnQgbV9maW5h
bEJsb2NrUG9pbnRSZWZsb3dPZmZzZXQ7CisgICAgZG91YmxlIG1fYmxvY2tab29tRmluYWxTY2Fs
ZTsKKyAgICBSZWZQdHI8V2ViQ29yZTo6Tm9kZT4gbV9jdXJyZW50UGluY2hab29tTm9kZTsKKyAg
ICBXZWJDb3JlOjpGbG9hdFBvaW50IG1fYW5jaG9ySW5Ob2RlUmVjdFJhdGlvOworICAgIFJlZlB0
cjxXZWJDb3JlOjpOb2RlPiBtX2N1cnJlbnRCbG9ja1pvb21Ob2RlOworICAgIFJlZlB0cjxXZWJD
b3JlOjpOb2RlPiBtX2N1cnJlbnRCbG9ja1pvb21BZGp1c3RlZE5vZGU7CisgICAgYm9vbCBtX3No
b3VsZFJlZmxvd0Jsb2NrOworCisgICAgLy8gRGVsYXllZCB6b29tQWJvdXRQb2ludC4KKyAgICBP
d25QdHI8V2ViQ29yZTo6VGltZXI8V2ViUGFnZVByaXZhdGU+ID4gbV9kZWxheWVkWm9vbVRpbWVy
OworICAgIHN0cnVjdCB7CisgICAgICAgIGRvdWJsZSBzY2FsZTsKKyAgICAgICAgV2ViQ29yZTo6
RmxvYXRQb2ludCBhbmNob3I7CisgICAgICAgIGJvb2wgZW5mb3JjZVNjYWxlQ2xhbXBpbmc7Cisg
ICAgICAgIGJvb2wgZm9yY2VSZW5kZXJpbmc7CisgICAgfSBtX2RlbGF5ZWRab29tQXJndW1lbnRz
OworCisgICAgZG91YmxlIG1fbGFzdFVzZXJFdmVudFRpbWVzdGFtcDsgLy8gVXNlZCB0byBkZXRl
Y3QgdXNlciBzY3JvbGxpbmcuCisKKyAgICBXZWJDb3JlOjpQbGF0Zm9ybU1vdXNlRXZlbnQgbV9s
YXN0TW91c2VFdmVudDsKKyAgICBib29sIG1fcGx1Z2luTW91c2VCdXR0b25QcmVzc2VkOyAvLyBV
c2VkIHRvIHRyYWNrIG1vdXNlIGJ1dHRvbiBmb3IgZnVsbCBzY3JlZW4gcGx1Z2lucy4KKyAgICBi
b29sIG1fcGx1Z2luTWF5T3Blbk5ld1RhYjsKKworICAgIFdlYkNvcmU6Okdlb2xvY2F0aW9uQ29u
dHJvbGxlckNsaWVudEJsYWNrQmVycnkqIG1fZ2VvbG9jYXRpb25DbGllbnQ7CisKKyAgICBIYXNo
U2V0PFdlYkNvcmU6OlBsdWdpblZpZXcqPiBtX3BsdWdpblZpZXdzOworCisgICAgUmVmUHRyPFdl
YkNvcmU6Ok5vZGU+IG1faW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGU7CisKKyNpZiBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgYm9vbCBtX2lzQWNjZWxlcmF0ZWRDb21wb3NpdGlu
Z0FjdGl2ZTsKKyAgICBPd25QdHI8RnJhbWVMYXllcnM+IG1fZnJhbWVMYXllcnM7IC8vIFdlYktp
dCB0aHJlYWQgb25seS4KKyAgICBPd25QdHI8V2ViUGFnZUNvbXBvc2l0b3I+IG1fY29tcG9zaXRv
cjsgLy8gQ29tcG9zaXRpbmcgdGhyZWFkIG9ubHkuCisgICAgT3duUHRyPFdlYkNvcmU6OlRpbWVy
PFdlYlBhZ2VQcml2YXRlPiA+IG1fcm9vdExheWVyQ29tbWl0VGltZXI7CisgICAgYm9vbCBtX25l
ZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb247CisgICAgYm9vbCBtX25lZWRzQ29tbWl0
OworICAgIGJvb2wgbV9zdXNwZW5kUm9vdExheWVyQ29tbWl0OworI2VuZGlmCisKKyAgICBpbnQg
bV9wZW5kaW5nT3JpZW50YXRpb247CisKKyAgICBSZWZQdHI8V2ViQ29yZTo6Tm9kZT4gbV9mdWxs
c2NyZWVuVmlkZW9Ob2RlOworICAgIFJlZlB0cjxXZWJDb3JlOjpQbHVnaW5WaWV3PiBtX2Z1bGxT
Y3JlZW5QbHVnaW5WaWV3OworCisgICAgdHlwZWRlZiBIYXNoTWFwPGNvbnN0IFdlYkNvcmU6OkZy
YW1lKiwgQmFja2luZ1N0b3JlQ2xpZW50Kj4gQmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWVNYXA7
CisgICAgQmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWVNYXAgbV9iYWNraW5nU3RvcmVDbGllbnRG
b3JGcmFtZU1hcDsKKworICAgIC8vIFdlYlNldHRpbmdzRGVsZWdhdGUgbWV0aG9kcy4KKyAgICB2
aXJ0dWFsIHZvaWQgZGlkQ2hhbmdlU2V0dGluZ3MoV2ViU2V0dGluZ3MqKTsKKworICAgIFJlZlB0
cjxXZWJDb3JlOjpET01XcmFwcGVyV29ybGQ+IG1faXNvbGF0ZWRXb3JsZDsKKyAgICBib29sIG1f
aGFzSW5SZWdpb25TY3JvbGxhYmxlQXJlYXM7CisgICAgYm9vbCBtX3VwZGF0ZURlbGVnYXRlZE92
ZXJsYXlzRGlzcGF0Y2hlZDsKK307Cit9Cit9CisKKyNlbmRpZiAvLyBXZWJQYWdlX3BfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>128516</attachid>
            <date>2012-02-23 11:25:56 -0800</date>
            <delta_ts>2012-02-27 14:28:36 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74380-20120223142527.patch</filename>
            <type>text/plain</type>
            <size>243170</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA4NTA1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Js
YWNrYmVycnkvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0NoYW5nZUxvZwpp
bmRleCBmNDVjMjAzMGIyZGU2ZjlhZDliYzVhMDUyNjJjYWY1MzhjNjAzZGIzLi41MDg0MjI2YjM3
NWJjOTgyOWNjMDMwZTc4NmUzYTU1NWExZmU0OWJhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
L2JsYWNrYmVycnkvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9DaGFu
Z2VMb2cKQEAgLTEsMyArMSwxNiBAQAorMjAxMi0wMi0yMiAgSmFja3kgSmlhbmcgIDx6aGFqaWFu
Z0ByaW0uY29tPgorCisgICAgICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBCbGFja0JlcnJ5IEFQ
SSB3ZWIgcGFnZSByZWxhdGVkIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD03NDM4MAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KKworICAgICAg
ICAqIEFwaS9XZWJQYWdlLmNwcDogQWRkZWQuCisgICAgICAgICogQXBpL1dlYlBhZ2UuaDogQWRk
ZWQuCisgICAgICAgICogQXBpL1dlYlBhZ2VfcC5oOiBBZGRlZC4KKwogMjAxMi0wMi0yMiAgUnlv
c3VrZSBOaXdhICA8cm5pd2FAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZW1vdmUgdGhlIHJlbWFp
bmluZyB1c2VzIG9mIENTU1N0eWxlRGVjbGFyYXRpb24gaW4gRWRpdG9yCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQXBpL1dlYlBhZ2UuY3BwIGIvU291cmNlL1dlYktpdC9i
bGFja2JlcnJ5L0FwaS9XZWJQYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40OTBhODhjYmMyNmIwYzM0YWRj
OGVmMjZkYzQ4NzQ3ZWQ4M2ExMTBkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9i
bGFja2JlcnJ5L0FwaS9XZWJQYWdlLmNwcApAQCAtMCwwICsxLDU1OTggQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0
ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUg
RnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIldlYlBhZ2UuaCIKKworI2luY2x1ZGUgIkFwcGxpY2F0aW9u
Q2FjaGVTdG9yYWdlLmgiCisjaW5jbHVkZSAiQmFja0ZvcndhcmRDb250cm9sbGVyLmgiCisjaW5j
bHVkZSAiQmFja0ZvcndhcmRMaXN0SW1wbC5oIgorI2luY2x1ZGUgIkJhY2tpbmdTdG9yZUNsaWVu
dC5oIgorI2luY2x1ZGUgIkJhY2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZS5oIgorI2luY2x1
ZGUgIkJhY2tpbmdTdG9yZV9wLmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIkNh
Y2hlZEltYWdlLmgiCisjaW5jbHVkZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAiQ2hyb21lQ2xpZW50
QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51Q2xpZW50QmxhY2tCZXJyeS5oIgor
I2luY2x1ZGUgIkNvb2tpZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJET01TdXBwb3J0LmgiCisjaW5j
bHVkZSAiRGF0YWJhc2UuaCIKKyNpbmNsdWRlICJEYXRhYmFzZVN5bmMuaCIKKyNpbmNsdWRlICJE
YXRhYmFzZVRyYWNrZXIuaCIKKyNpbmNsdWRlICJEZXZpY2VNb3Rpb25DbGllbnRCbGFja0JlcnJ5
LmgiCisjaW5jbHVkZSAiRGV2aWNlT3JpZW50YXRpb25DbGllbnRCbGFja0JlcnJ5LmgiCisjaW5j
bHVkZSAiRHJhZ0NsaWVudEJsYWNrQmVycnkuaCIKKy8vIEZJWE1FOiBXZSBzaG91bGQgYmUgdXNp
bmcgRHVtcFJlbmRlclRyZWVDbGllbnQsIGJ1dCBJJ20gbm90IHN1cmUgd2hlcmUgd2Ugc2hvdWxk
CisvLyBjcmVhdGUgdGhlIERSVF9CQiBvYmplY3QuIFNlZSBQUiAjMTIwMzU1LgorI2lmIEVOQUJM
RV9EUlQKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZUJsYWNrQmVycnkuaCIKKyNlbmRpZgorI2lu
Y2x1ZGUgIkVkaXRvckNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJGb2N1c0NvbnRyb2xs
ZXIuaCIKKyNpbmNsdWRlICJGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuaCIKKyNpZiBFTkFC
TEUoQ0xJRU5UX0JBU0VEX0dFT0xPQ0FUSU9OKQorI2lmIEVOQUJMRV9EUlQKKyNpbmNsdWRlICJH
ZW9sb2NhdGlvbkNsaWVudE1vY2suaCIKKyNlbmRpZgorI2luY2x1ZGUgIkdlb2xvY2F0aW9uQ29u
dHJvbGxlckNsaWVudEJsYWNrQmVycnkuaCIKKyNlbmRpZgorI2luY2x1ZGUgIkdyb3VwU2V0dGlu
Z3MuaCIKKyNpbmNsdWRlICJIVE1MQXJlYUVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MRnJhbWVP
d25lckVsZW1lbnQuaCIKKyNpbmNsdWRlICJIVE1MSW1hZ2VFbGVtZW50LmgiCisjaW5jbHVkZSAi
SFRNTElucHV0RWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIkhU
TUxQYXJzZXJJZGlvbXMuaCIKKyNpbmNsdWRlICJIVFRQUGFyc2Vycy5oIgorI2luY2x1ZGUgIkhp
c3RvcnlJdGVtLmgiCisjaW5jbHVkZSAiSWNvbkRhdGFiYXNlQ2xpZW50QmxhY2tCZXJyeS5oIgor
I2luY2x1ZGUgIkluUGFnZVNlYXJjaE1hbmFnZXIuaCIKKyNpbmNsdWRlICJJblJlZ2lvblNjcm9s
bGFibGVBcmVhLmgiCisjaW5jbHVkZSAiSW5wdXRIYW5kbGVyLmgiCisjaW5jbHVkZSAiSW5zcGVj
dG9yQmFja2VuZERpc3BhdGNoZXIuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDbGllbnRCbGFja0Jl
cnJ5LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkphdmFT
Y3JpcHREZWJ1Z2dlckJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJMYXllcldlYktpdFRocmVhZC5o
IgorI2luY2x1ZGUgIk5ldHdvcmtNYW5hZ2VyLmgiCisjaW5jbHVkZSAiTm9kZVJlbmRlclN0eWxl
LmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBhZ2VDYWNoZS5oIgorI2luY2x1ZGUg
IlBhZ2VHcm91cC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtVG91Y2hFdmVudC5oIgorI2luY2x1ZGUg
IlBsYXRmb3JtV2hlZWxFdmVudC5oIgorI2luY2x1ZGUgIlBsdWdpbkRhdGFiYXNlLmgiCisjaW5j
bHVkZSAiUGx1Z2luVmlldy5oIgorI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKKyNpbmNsdWRlICJS
ZW5kZXJUaGVtZUJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJSZW5kZXJUcmVlQXNUZXh0LmgiCisj
aW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1ZGUgIlJlbmRlcldpZGdldC5oIgorI2luY2x1
ZGUgIlNjcmlwdFNvdXJjZUNvZGUuaCIKKyNpbmNsdWRlICJTY3JpcHRWYWx1ZS5oIgorI2luY2x1
ZGUgIlNjcm9sbFR5cGVzLmgiCisjaW5jbHVkZSAiU2VsZWN0aW9uSGFuZGxlci5oIgorI2luY2x1
ZGUgIlNldHRpbmdzLmgiCisjaW5jbHVkZSAiU3RvcmFnZS5oIgorI2luY2x1ZGUgIlN0b3JhZ2VO
YW1lc3BhY2UuaCIKKyNpbmNsdWRlICJTdXJmYWNlUG9vbC5oIgorI2luY2x1ZGUgIlRleHQuaCIK
KyNpbmNsdWRlICJUaHJlYWRDaGVjay5oIgorI2luY2x1ZGUgIlRvdWNoRXZlbnRIYW5kbGVyLmgi
CisjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKyNpbmNsdWRlICJWaXNpYmxlUG9z
aXRpb24uaCIKKyNpZiBFTkFCTEUoV0VCRE9NKQorI2luY2x1ZGUgIldlYkRPTURvY3VtZW50Lmgi
CisjZW5kaWYKKyNpbmNsdWRlICJXZWJQYWdlQ2xpZW50LmgiCisjaW5jbHVkZSAiV2ViU29ja2V0
LmgiCisjaW5jbHVkZSAibnBhcGkuaCIKKyNpbmNsdWRlICJydW50aW1lX3Jvb3QuaCIKKworI2lm
IEVOQUJMRShWSURFTykKKyNpbmNsdWRlICJIVE1MTWVkaWFFbGVtZW50LmgiCisjaW5jbHVkZSAi
TWVkaWFQbGF5ZXIuaCIKKyNpbmNsdWRlICJNZWRpYVBsYXllclByaXZhdGVCbGFja0JlcnJ5Lmgi
CisjZW5kaWYKKworI2lmIFVTRShTS0lBKQorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFNraWEu
aCIKKyNlbmRpZgorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2luY2x1ZGUg
IkZyYW1lTGF5ZXJzLmgiCisjaW5jbHVkZSAiV2ViUGFnZUNvbXBvc2l0b3IuaCIKKyNlbmRpZgor
CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtRXhlY3V0YWJsZU1lc3NhZ2UuaD4KKyNpbmNs
dWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1JVFBvbGljeS5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQ
bGF0Zm9ybUtleWJvYXJkRXZlbnQuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1NZXNz
YWdlQ2xpZW50Lmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTW91c2VFdmVudC5oPgor
I2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVNjcmVlbi5oPgorI2luY2x1ZGUgPEJsYWNrQmVy
cnlQbGF0Zm9ybVNldHRpbmdzLmg+CisjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvQVBJQ2FzdC5o
PgorI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pTQ29udGV4dFJlZi5oPgorI2luY2x1ZGUgPFNo
YXJlZFBvaW50ZXIuaD4KKyNpbmNsdWRlIDxzeXMva2V5Y29kZXMuaD4KKyNpbmNsdWRlIDx1bmlj
b2RlL3VzdHJpbmcuaD4gLy8gcGxhdGZvcm0gSUNVCisKKyNpZm5kZWYgVVNFUl9QUk9DRVNTRVMK
KyNpbmNsdWRlIDxtZW1hbGxvYy5oPgorI2VuZGlmCisKKyNpZiBFTkFCTEUoU0tJQV9HUFVfQ0FO
VkFTKQorI2luY2x1ZGUgIkJsYWNrQmVycnlQbGF0Zm9ybUdyYXBoaWNzLmgiCisjaW5jbHVkZSAi
R3JDb250ZXh0LmgiCisjZW5kaWYKKworI2RlZmluZSBERUJVR19CTE9DS19aT09NIDAKKyNkZWZp
bmUgREVCVUdfVE9VQ0hfRVZFTlRTIDAKKyNkZWZpbmUgREVCVUdfV0VCUEFHRV9MT0FEIDAKKwor
dXNpbmcgbmFtZXNwYWNlIHN0ZDsKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCit0eXBlZGVm
IGNvbnN0IHVuc2lnbmVkIHNob3J0KiBDVVNob3J0UHRyOworCituYW1lc3BhY2UgQmxhY2tCZXJy
eSB7CituYW1lc3BhY2UgV2ViS2l0IHsKKworc3RhdGljIFZlY3RvcjxXZWJQYWdlKj4qIHZpc2li
bGVXZWJQYWdlcygpCit7CisgICAgc3RhdGljIFZlY3RvcjxXZWJQYWdlKj4qIHNfdmlzaWJsZVdl
YlBhZ2VzID0gMDsgLy8gSW5pdGlhbGx5LCBubyB3ZWIgcGFnZSBpcyB2aXNpYmxlLgorICAgIGlm
ICghc192aXNpYmxlV2ViUGFnZXMpCisgICAgICAgIHNfdmlzaWJsZVdlYlBhZ2VzID0gbmV3IFZl
Y3RvcjxXZWJQYWdlKj47CisgICAgcmV0dXJuIHNfdmlzaWJsZVdlYlBhZ2VzOworfQorCitjb25z
dCB1bnNpZ25lZCBibG9ja1pvb21NYXJnaW4gPSAzOyAvLyBBZGQgMyBwaXhlbCBtYXJnaW4gb24g
ZWFjaCBzaWRlLgorc3RhdGljIGludCBibG9ja0NsaWNrUmFkaXVzID0gMDsKK3N0YXRpYyBkb3Vi
bGUgbWF4aW11bUJsb2NrWm9vbVNjYWxlID0gMzsgLy8gVGhpcyBzY2FsZSBjYW4gYmUgY2xhbXBl
ZCBieSB0aGUgbWF4aW11bVNjYWxlIHNldCBmb3IgdGhlIHBhZ2UuCisKK2NvbnN0IGRvdWJsZSBt
YW51YWxTY3JvbGxJbnRlcnZhbCA9IDAuMTsgLy8gVGhlIHRpbWUgaW50ZXJ2YWwgZHVyaW5nIHdo
aWNoIHdlIGFzc29jaWF0ZSB1c2VyIGFjdGlvbiB3aXRoIHNjcm9sbGluZy4KKworY29uc3QgZG91
YmxlIGRlbGF5ZWRab29tSW50ZXJ2YWwgPSAwOworCitjb25zdCBJbnRTaXplIG1pbmltdW1MYXlv
dXRTaXplKDEwLCAxMCk7IC8vIE5lZWRzIHRvIGJlIGEgc21hbGwgc2l6ZSwgZ3JlYXRlciB0aGFu
IDAsIHRoYXQgd2UgY2FuIGdyb3cgdGhlIGxheW91dCBmcm9tLgorY29uc3QgSW50U2l6ZSBtYXhp
bXVtTGF5b3V0U2l6ZSgxMDAwMCwgMTAwMDApOyAvLyBVc2VkIHdpdGggdmlld3BvcnQgbWV0YSB0
YWcsIGJ1dCB3ZSBjYW4gc3RpbGwgZ3JvdyBmcm9tIHRoaXMgb2YgY291cnNlLgorCitjb25zdCBk
b3VibGUgbWluaW11bUV4cGFuZGluZ1JhdGlvID0gMC4xNTsKKworLy8gSGVscGVyIGZ1bmN0aW9u
IHRvIHBhcnNlIGEgVVJMIGFuZCBmaWxsIGluIG1pc3NpbmcgcGFydHMuCitzdGF0aWMgS1VSTCBw
YXJzZVVybChjb25zdCBTdHJpbmcmIHVybCkKK3sKKyAgICBTdHJpbmcgdXJsU3RyaW5nKHVybCk7
CisgICAgS1VSTCBrdXJsID0gS1VSTChLVVJMKCksIHVybFN0cmluZyk7CisgICAgaWYgKGt1cmwu
cHJvdG9jb2woKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgdXJsU3RyaW5nLmluc2VydCgiaHR0cDov
LyIsIDApOworICAgICAgICBrdXJsID0gS1VSTChLVVJMKCksIHVybFN0cmluZyk7CisgICAgfQor
CisgICAgcmV0dXJuIGt1cmw7Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbnMgdG8gY29udmVydCB0
byBhbmQgZnJvbSBXZWJDb3JlIHR5cGVzLgorc3RhdGljIGlubGluZSBNb3VzZUV2ZW50VHlwZSB0
b1dlYkNvcmVNb3VzZUV2ZW50VHlwZShjb25zdCBQbGF0Zm9ybTo6TW91c2VFdmVudDo6VHlwZSB0
eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgUGxhdGZvcm06Ok1vdXNlRXZl
bnQ6Ok1vdXNlQnV0dG9uRG93bjoKKyAgICAgICAgcmV0dXJuIE1vdXNlRXZlbnRQcmVzc2VkOwor
ICAgIGNhc2UgUGxhdGZvcm06Ok1vdXNlRXZlbnQ6Ok1vdXNlQnV0dG9uVXA6CisgICAgICAgIHJl
dHVybiBNb3VzZUV2ZW50UmVsZWFzZWQ7CisgICAgY2FzZSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6
TW91c2VNb3ZlOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBNb3VzZUV2ZW50TW92ZWQ7
CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIFJlc291cmNlUmVxdWVzdENhY2hlUG9saWN5IHRv
V2ViQ29yZUNhY2hlUG9saWN5KFBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6Q2FjaGVQb2xpY3kg
cG9saWN5KQoreworICAgIHN3aXRjaCAocG9saWN5KSB7CisgICAgY2FzZSBQbGF0Zm9ybTo6TmV0
d29ya1JlcXVlc3Q6OlVzZVByb3RvY29sQ2FjaGVQb2xpY3k6CisgICAgICAgIHJldHVybiBVc2VQ
cm90b2NvbENhY2hlUG9saWN5OworICAgIGNhc2UgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpS
ZWxvYWRJZ25vcmluZ0NhY2hlRGF0YToKKyAgICAgICAgcmV0dXJuIFJlbG9hZElnbm9yaW5nQ2Fj
aGVEYXRhOworICAgIGNhc2UgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpSZXR1cm5DYWNoZURh
dGFFbHNlTG9hZDoKKyAgICAgICAgcmV0dXJuIFJldHVybkNhY2hlRGF0YUVsc2VMb2FkOworICAg
IGNhc2UgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpSZXR1cm5DYWNoZURhdGFEb250TG9hZDoK
KyAgICAgICAgcmV0dXJuIFJldHVybkNhY2hlRGF0YURvbnRMb2FkOworICAgIGRlZmF1bHQ6Cisg
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gVXNlUHJvdG9jb2xD
YWNoZVBvbGljeTsKKyAgICB9Cit9CisKKyNpZiBFTkFCTEUoRVZFTlRfTU9ERV9NRVRBVEFHUykK
K3N0YXRpYyBpbmxpbmUgUGxhdGZvcm06OkN1cnNvckV2ZW50TW9kZSB0b1BsYXRmb3JtQ3Vyc29y
RXZlbnRNb2RlKEN1cnNvckV2ZW50TW9kZSBtb2RlKQoreworICAgIHN3aXRjaCAobW9kZSkgewor
ICAgIGNhc2UgUHJvY2Vzc2VkQ3Vyc29yRXZlbnRzOgorICAgICAgICByZXR1cm4gUGxhdGZvcm06
OlByb2Nlc3NlZEN1cnNvckV2ZW50czsKKyAgICBjYXNlIE5hdGl2ZUN1cnNvckV2ZW50czoKKyAg
ICAgICAgcmV0dXJuIFBsYXRmb3JtOjpOYXRpdmVDdXJzb3JFdmVudHM7CisgICAgZGVmYXVsdDoK
KyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6
UHJvY2Vzc2VkQ3Vyc29yRXZlbnRzOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBQbGF0Zm9y
bTo6VG91Y2hFdmVudE1vZGUgdG9QbGF0Zm9ybVRvdWNoRXZlbnRNb2RlKFRvdWNoRXZlbnRNb2Rl
IG1vZGUpCit7CisgICAgc3dpdGNoIChtb2RlKSB7CisgICAgY2FzZSBQcm9jZXNzZWRUb3VjaEV2
ZW50czoKKyAgICAgICAgcmV0dXJuIFBsYXRmb3JtOjpQcm9jZXNzZWRUb3VjaEV2ZW50czsKKyAg
ICBjYXNlIE5hdGl2ZVRvdWNoRXZlbnRzOgorICAgICAgICByZXR1cm4gUGxhdGZvcm06Ok5hdGl2
ZVRvdWNoRXZlbnRzOworICAgIGNhc2UgUHVyZVRvdWNoRXZlbnRzV2l0aE1vdXNlQ29udmVyc2lv
bjoKKyAgICAgICAgcmV0dXJuIFBsYXRmb3JtOjpQdXJlVG91Y2hFdmVudHNXaXRoTW91c2VDb252
ZXJzaW9uOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
ICAgICByZXR1cm4gUGxhdGZvcm06OlByb2Nlc3NlZFRvdWNoRXZlbnRzOworICAgIH0KK30KKyNl
bmRpZgorCitzdGF0aWMgaW5saW5lIEhpc3RvcnlJdGVtKiBoaXN0b3J5SXRlbUZyb21CYWNrRm9y
d2FyZElkKFdlYlBhZ2U6OkJhY2tGb3J3YXJkSWQgaWQpCit7CisgICAgcmV0dXJuIHJlaW50ZXJw
cmV0X2Nhc3Q8SGlzdG9yeUl0ZW0qPihpZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgV2ViUGFnZTo6
QmFja0ZvcndhcmRJZCBiYWNrRm9yd2FyZElkRnJvbUhpc3RvcnlJdGVtKEhpc3RvcnlJdGVtKiBp
dGVtKQoreworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFdlYlBhZ2U6OkJhY2tGb3J3YXJk
SWQ+KGl0ZW0pOworfQorCitXZWJQYWdlUHJpdmF0ZTo6V2ViUGFnZVByaXZhdGUoV2ViUGFnZSog
d2ViUGFnZSwgV2ViUGFnZUNsaWVudCogY2xpZW50LCBjb25zdCBJbnRSZWN0JiByZWN0KQorICAg
IDogbV93ZWJQYWdlKHdlYlBhZ2UpCisgICAgLCBtX2NsaWVudChjbGllbnQpCisgICAgLCBtX3Bh
Z2UoMCkgLy8gSW5pdGlhbGl6ZWQgYnkgaW5pdC4KKyAgICAsIG1fbWFpbkZyYW1lKDApIC8vIElu
aXRpYWxpemVkIGJ5IGluaXQuCisgICAgLCBtX2N1cnJlbnRDb250ZXh0Tm9kZSgwKQorICAgICwg
bV93ZWJTZXR0aW5ncygwKSAvLyBJbml0aWFsaXplZCBieSBpbml0LgorICAgICwgbV92aXNpYmxl
KGZhbHNlKQorICAgICwgbV9zaG91bGRSZXNldFRpbGVzV2hlblNob3duKGZhbHNlKQorICAgICwg
bV91c2VyU2NhbGFibGUodHJ1ZSkKKyAgICAsIG1fdXNlclBlcmZvcm1lZE1hbnVhbFpvb20oZmFs
c2UpCisgICAgLCBtX3VzZXJQZXJmb3JtZWRNYW51YWxTY3JvbGwoZmFsc2UpCisgICAgLCBtX2Nv
bnRlbnRzU2l6ZUNoYW5nZWQoZmFsc2UpCisgICAgLCBtX292ZXJmbG93RXhjZWVkc0NvbnRlbnRz
U2l6ZShmYWxzZSkKKyAgICAsIG1fcmVzZXRWaXJ0dWFsVmlld3BvcnRPbkNvbW1pdHRlZCh0cnVl
KQorICAgICwgbV9zaG91bGRVc2VGaXhlZERlc2t0b3BNb2RlKGZhbHNlKQorICAgICwgbV9uZWVk
VG91Y2hFdmVudHMoZmFsc2UpCisgICAgLCBtX3ByZXZlbnRJZGxlRGltbWluZ0NvdW50KDApCisj
aWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyAgICAsIG1fcHJldmVudERlZmF1bHRPblRvdWNoU3Rh
cnQoZmFsc2UpCisjZW5kaWYKKyAgICAsIG1fbmVzdGVkTGF5b3V0RmluaXNoZWRDb3VudCgwKQor
ICAgICwgbV9hY3R1YWxWaXNpYmxlV2lkdGgocmVjdC53aWR0aCgpKQorICAgICwgbV9hY3R1YWxW
aXNpYmxlSGVpZ2h0KHJlY3QuaGVpZ2h0KCkpCisgICAgLCBtX3ZpcnR1YWxWaWV3cG9ydFdpZHRo
KDApCisgICAgLCBtX3ZpcnR1YWxWaWV3cG9ydEhlaWdodCgwKQorICAgICwgbV9kZWZhdWx0TGF5
b3V0U2l6ZShtaW5pbXVtTGF5b3V0U2l6ZSkKKyAgICAsIG1fZGlkUmVzdG9yZUZyb21QYWdlQ2Fj
aGUoZmFsc2UpCisgICAgLCBtX3ZpZXdNb2RlKFdlYlBhZ2VQcml2YXRlOjpEZXNrdG9wKSAvLyBE
ZWZhdWx0IHRvIERlc2t0b3AgbW9kZSBmb3IgUEIuCisgICAgLCBtX2xvYWRTdGF0ZShXZWJQYWdl
UHJpdmF0ZTo6Tm9uZSkKKyAgICAsIG1fdHJhbnNmb3JtYXRpb25NYXRyaXgobmV3IFRyYW5zZm9y
bWF0aW9uTWF0cml4KCkpCisgICAgLCBtX2JhY2tpbmdTdG9yZSgwKSAvLyBJbml0aWFsaXplZCBi
eSBpbml0LgorICAgICwgbV9iYWNraW5nU3RvcmVDbGllbnQoMCkgLy8gSW5pdGlhbGl6ZWQgYnkg
aW5pdC4KKyAgICAsIG1faW5QYWdlU2VhcmNoTWFuYWdlcihuZXcgSW5QYWdlU2VhcmNoTWFuYWdl
cih0aGlzKSkKKyAgICAsIG1faW5wdXRIYW5kbGVyKG5ldyBJbnB1dEhhbmRsZXIodGhpcykpCisg
ICAgLCBtX3NlbGVjdGlvbkhhbmRsZXIobmV3IFNlbGVjdGlvbkhhbmRsZXIodGhpcykpCisgICAg
LCBtX3RvdWNoRXZlbnRIYW5kbGVyKG5ldyBUb3VjaEV2ZW50SGFuZGxlcih0aGlzKSkKKyNpZiBF
TkFCTEUoRVZFTlRfTU9ERV9NRVRBVEFHUykKKyAgICAsIG1fY3Vyc29yRXZlbnRNb2RlKFByb2Nl
c3NlZEN1cnNvckV2ZW50cykKKyAgICAsIG1fdG91Y2hFdmVudE1vZGUoUHJvY2Vzc2VkVG91Y2hF
dmVudHMpCisjZW5kaWYKKyAgICAsIG1fY3VycmVudEN1cnNvcihQbGF0Zm9ybTo6Q3Vyc29yTm9u
ZSkKKyAgICAsIG1fZHVtcFJlbmRlclRyZWUoMCkgLy8gTGF6eSBpbml0aWFsaXphdGlvbi4KKyAg
ICAsIG1faW5pdGlhbFNjYWxlKC0xLjApCisgICAgLCBtX21pbmltdW1TY2FsZSgtMS4wKQorICAg
ICwgbV9tYXhpbXVtU2NhbGUoLTEuMCkKKyAgICAsIG1fYmxvY2tab29tRmluYWxTY2FsZSgxLjAp
CisgICAgLCBtX2FuY2hvckluTm9kZVJlY3RSYXRpbygtMSwgLTEpCisgICAgLCBtX2N1cnJlbnRC
bG9ja1pvb21Ob2RlKDApCisgICAgLCBtX2N1cnJlbnRCbG9ja1pvb21BZGp1c3RlZE5vZGUoMCkK
KyAgICAsIG1fc2hvdWxkUmVmbG93QmxvY2soZmFsc2UpCisgICAgLCBtX2RlbGF5ZWRab29tVGlt
ZXIoYWRvcHRQdHIobmV3IFRpbWVyPFdlYlBhZ2VQcml2YXRlPih0aGlzLCAmV2ViUGFnZVByaXZh
dGU6Onpvb21BYm91dFBvaW50VGltZXJGaXJlZCkpKQorICAgICwgbV9sYXN0VXNlckV2ZW50VGlt
ZXN0YW1wKDAuMCkKKyAgICAsIG1fcGx1Z2luTW91c2VCdXR0b25QcmVzc2VkKGZhbHNlKQorICAg
ICwgbV9wbHVnaW5NYXlPcGVuTmV3VGFiKGZhbHNlKQorICAgICwgbV9nZW9sb2NhdGlvbkNsaWVu
dCgwKQorICAgICwgbV9pblJlZ2lvblNjcm9sbFN0YXJ0aW5nTm9kZSgwKQorI2lmIFVTRShBQ0NF
TEVSQVRFRF9DT01QT1NJVElORykKKyAgICAsIG1faXNBY2NlbGVyYXRlZENvbXBvc2l0aW5nQWN0
aXZlKGZhbHNlKQorICAgICwgbV9yb290TGF5ZXJDb21taXRUaW1lcihhZG9wdFB0cihuZXcgVGlt
ZXI8V2ViUGFnZVByaXZhdGU+KHRoaXMsICZXZWJQYWdlUHJpdmF0ZTo6cm9vdExheWVyQ29tbWl0
VGltZXJGaXJlZCkpKQorICAgICwgbV9uZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0aW9u
KGZhbHNlKQorICAgICwgbV9uZWVkc0NvbW1pdChmYWxzZSkKKyAgICAsIG1fc3VzcGVuZFJvb3RM
YXllckNvbW1pdChmYWxzZSkKKyNlbmRpZgorICAgICwgbV9wZW5kaW5nT3JpZW50YXRpb24oLTEp
CisgICAgLCBtX2Z1bGxzY3JlZW5WaWRlb05vZGUoMCkKKyAgICAsIG1faGFzSW5SZWdpb25TY3Jv
bGxhYmxlQXJlYXMoZmFsc2UpCisgICAgLCBtX3VwZGF0ZURlbGVnYXRlZE92ZXJsYXlzRGlzcGF0
Y2hlZChmYWxzZSkKK3sKK30KKworV2ViUGFnZVByaXZhdGU6On5XZWJQYWdlUHJpdmF0ZSgpCit7
CisgICAgLy8gSGFuZCB0aGUgYmFja2luZ3N0b3JlIGJhY2sgdG8gYW5vdGhlciBvd25lciBpZiBu
ZWNlc3NhcnkuCisgICAgbV93ZWJQYWdlLT5zZXRWaXNpYmxlKGZhbHNlKTsKKyAgICBpZiAoQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9yZU93bmVyKCkgPT0gbV93ZWJQYWdl
KQorICAgICAgICBCYWNraW5nU3RvcmVQcml2YXRlOjpzZXRDdXJyZW50QmFja2luZ1N0b3JlT3du
ZXIoMCk7CisKKyAgICBkZWxldGUgbV93ZWJTZXR0aW5nczsKKyAgICBtX3dlYlNldHRpbmdzID0g
MDsKKworICAgIGRlbGV0ZSBtX2JhY2tpbmdTdG9yZUNsaWVudDsKKyAgICBtX2JhY2tpbmdTdG9y
ZUNsaWVudCA9IDA7CisgICAgbV9iYWNraW5nU3RvcmUgPSAwOworCisgICAgZGVsZXRlIG1fcGFn
ZTsKKyAgICBtX3BhZ2UgPSAwOworCisgICAgZGVsZXRlIG1fdHJhbnNmb3JtYXRpb25NYXRyaXg7
CisgICAgbV90cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IDA7CisKKyAgICBkZWxldGUgbV9pblBhZ2VT
ZWFyY2hNYW5hZ2VyOworICAgIG1faW5QYWdlU2VhcmNoTWFuYWdlciA9IDA7CisKKyAgICBkZWxl
dGUgbV9zZWxlY3Rpb25IYW5kbGVyOworICAgIG1fc2VsZWN0aW9uSGFuZGxlciA9IDA7CisKKyAg
ICBkZWxldGUgbV9pbnB1dEhhbmRsZXI7CisgICAgbV9pbnB1dEhhbmRsZXIgPSAwOworCisgICAg
ZGVsZXRlIG1fdG91Y2hFdmVudEhhbmRsZXI7CisgICAgbV90b3VjaEV2ZW50SGFuZGxlciA9IDA7
CisKKyNpZiBFTkFCTEVfRFJUCisgICAgZGVsZXRlIG1fZHVtcFJlbmRlclRyZWU7CisgICAgbV9k
dW1wUmVuZGVyVHJlZSA9IDA7CisjZW5kaWYKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6aW5p
dChjb25zdCBXZWJTdHJpbmcmIHBhZ2VHcm91cE5hbWUpCit7CisgICAgQ2hyb21lQ2xpZW50Qmxh
Y2tCZXJyeSogY2hyb21lQ2xpZW50ID0gbmV3IENocm9tZUNsaWVudEJsYWNrQmVycnkodGhpcyk7
CisgICAgQ29udGV4dE1lbnVDbGllbnRCbGFja0JlcnJ5KiBjb250ZXh0TWVudUNsaWVudCA9IDA7
CisjaWYgRU5BQkxFKENPTlRFWFRfTUVOVVMpCisgICAgY29udGV4dE1lbnVDbGllbnQgPSBuZXcg
Q29udGV4dE1lbnVDbGllbnRCbGFja0JlcnJ5KCk7CisjZW5kaWYKKyAgICBFZGl0b3JDbGllbnRC
bGFja0JlcnJ5KiBlZGl0b3JDbGllbnQgPSBuZXcgRWRpdG9yQ2xpZW50QmxhY2tCZXJyeSh0aGlz
KTsKKyAgICBEcmFnQ2xpZW50QmxhY2tCZXJyeSogZHJhZ0NsaWVudCA9IDA7CisjaWYgRU5BQkxF
KERSQUdfU1VQUE9SVCkKKyAgICBkcmFnQ2xpZW50ID0gbmV3IERyYWdDbGllbnRCbGFja0JlcnJ5
KCk7CisjZW5kaWYKKyAgICBJbnNwZWN0b3JDbGllbnRCbGFja0JlcnJ5KiBpbnNwZWN0b3JDbGll
bnQgPSAwOworI2lmIEVOQUJMRShJTlNQRUNUT1IpCisgICAgaW5zcGVjdG9yQ2xpZW50ID0gbmV3
IEluc3BlY3RvckNsaWVudEJsYWNrQmVycnkodGhpcyk7CisjZW5kaWYKKworICAgIEZyYW1lTG9h
ZGVyQ2xpZW50QmxhY2tCZXJyeSogZnJhbWVMb2FkZXJDbGllbnQgPSBuZXcgRnJhbWVMb2FkZXJD
bGllbnRCbGFja0JlcnJ5KCk7CisKKyAgICBQYWdlOjpQYWdlQ2xpZW50cyBwYWdlQ2xpZW50czsK
KyAgICBwYWdlQ2xpZW50cy5jaHJvbWVDbGllbnQgPSBjaHJvbWVDbGllbnQ7CisgICAgcGFnZUNs
aWVudHMuY29udGV4dE1lbnVDbGllbnQgPSBjb250ZXh0TWVudUNsaWVudDsKKyAgICBwYWdlQ2xp
ZW50cy5lZGl0b3JDbGllbnQgPSBlZGl0b3JDbGllbnQ7CisgICAgcGFnZUNsaWVudHMuZHJhZ0Ns
aWVudCA9IGRyYWdDbGllbnQ7CisgICAgcGFnZUNsaWVudHMuaW5zcGVjdG9yQ2xpZW50ID0gaW5z
cGVjdG9yQ2xpZW50OworCisjaWYgRU5BQkxFKENMSUVOVF9CQVNFRF9HRU9MT0NBVElPTikKKyAg
ICAvLyBOb3RlIHRoZSBvYmplY3Qgd2lsbCBiZSBkZXN0cm95ZWQgd2hlbiB0aGUgcGFnZSBpcyBk
ZXN0cm95ZWQuCisjaWYgRU5BQkxFX0RSVAorICAgIGlmIChnZXRlbnYoImRydFJ1biIpKQorICAg
ICAgICBwYWdlQ2xpZW50cy5nZW9sb2NhdGlvbkNsaWVudCA9IG5ldyBHZW9sb2NhdGlvbkNsaWVu
dE1vY2soKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgcGFnZUNsaWVudHMuZ2VvbG9jYXRp
b25DbGllbnQgPSBtX2dlb2xvY2F0aW9uQ2xpZW50ID0gbmV3IEdlb2xvY2F0aW9uQ29udHJvbGxl
ckNsaWVudEJsYWNrQmVycnkodGhpcyk7CisjZWxzZQorICAgIHBhZ2VDbGllbnRzLmdlb2xvY2F0
aW9uQ2xpZW50ID0gbV9nZW9sb2NhdGlvbkNsaWVudDsKKyNlbmRpZgorCisgICAgcGFnZUNsaWVu
dHMuZGV2aWNlTW90aW9uQ2xpZW50ID0gbmV3IERldmljZU1vdGlvbkNsaWVudEJsYWNrQmVycnko
dGhpcyk7CisgICAgcGFnZUNsaWVudHMuZGV2aWNlT3JpZW50YXRpb25DbGllbnQgPSBuZXcgRGV2
aWNlT3JpZW50YXRpb25DbGllbnRCbGFja0JlcnJ5KHRoaXMpOworICAgIG1fcGFnZSA9IG5ldyBQ
YWdlKHBhZ2VDbGllbnRzKTsKKworI2lmIEVOQUJMRShDTElFTlRfQkFTRURfR0VPTE9DQVRJT04p
ICYmIEVOQUJMRV9EUlQKKyAgICAvLyBJbiBjYXNlIHJ1bm5pbmcgaW4gRHVtcFJlbmRlclRyZWUg
bW9kZSBzZXQgdGhlIGNvbnRyb2xsZXIgdG8gbW9jayBwcm92aWRlci4KKyAgICBpZiAoZ2V0ZW52
KCJkcnRSdW4iKSkKKyAgICAgICAgc3RhdGljX2Nhc3Q8R2VvbG9jYXRpb25DbGllbnRNb2NrKj4o
cGFnZUNsaWVudHMuZ2VvbG9jYXRpb25DbGllbnQpLT5zZXRDb250cm9sbGVyKG1fcGFnZS0+Z2Vv
bG9jYXRpb25Db250cm9sbGVyKCkpOworI2VuZGlmCisKKyAgICBtX3BhZ2UtPnNldEN1c3RvbUhU
TUxUb2tlbml6ZXJDaHVua1NpemUoMjU2KTsKKyAgICBtX3BhZ2UtPnNldEN1c3RvbUhUTUxUb2tl
bml6ZXJUaW1lRGVsYXkoMC4zKTsKKworICAgIG1fd2ViU2V0dGluZ3MgPSBXZWJTZXR0aW5nczo6
Y3JlYXRlRnJvbVN0YW5kYXJkU2V0dGluZ3MoKTsKKworICAgIC8vIEZJWE1FOiBXZSBleHBsaWNp
dGx5IGNhbGwgc2V0RGVsZWdhdGUoKSBpbnN0ZWFkIG9mIHBhc3Npbmcgb3Vyc2VsZiBpbiBjcmVh
dGVGcm9tU3RhbmRhcmRTZXR0aW5ncygpCisgICAgLy8gc28gdGhhdCB3ZSBvbmx5IGdldCBvbmUg
ZGlkQ2hhbmdlU2V0dGluZ3MoKSBjYWxsYmFjayB3aGVuIHdlIHNldCB0aGUgcGFnZSBncm91cCBu
YW1lLiBUaGlzIGNhdXNlcyB1cworICAgIC8vIHRvIG1ha2UgYSBjb3B5IG9mIHRoZSBXZWJTZXR0
aW5ncyBzaW5jZSBzb21lIFdlYlNldHRpbmdzIG1ldGhvZCBtYWtlIHVzZSBvZiB0aGUgcGFnZSBn
cm91cCBuYW1lLgorICAgIC8vIEluc3RlYWQsIHdlIHNob3VsZG4ndCBiZSBzdG9yaW5nIHRoZSBw
YWdlIGdyb3VwIG5hbWUgaW4gV2ViU2V0dGluZ3MuCisgICAgbV93ZWJTZXR0aW5ncy0+c2V0RGVs
ZWdhdGUodGhpcyk7CisgICAgbV93ZWJTZXR0aW5ncy0+c2V0UGFnZUdyb3VwTmFtZShwYWdlR3Jv
dXBOYW1lKTsKKworICAgIFJlZlB0cjxGcmFtZT4gbmV3RnJhbWUgPSBGcmFtZTo6Y3JlYXRlKG1f
cGFnZSwgLyogSFRNTEZyYW1lT3duZXJFbGVtZW50KiAqLyAwLCBmcmFtZUxvYWRlckNsaWVudCk7
CisKKyAgICBtX21haW5GcmFtZSA9IG5ld0ZyYW1lLmdldCgpOworICAgIGZyYW1lTG9hZGVyQ2xp
ZW50LT5zZXRGcmFtZShtX21haW5GcmFtZSwgdGhpcyk7CisgICAgbV9tYWluRnJhbWUtPmluaXQo
KTsKKworI2lmIEVOQUJMRShXRUJHTCkKKyAgICBQbGF0Zm9ybTo6U2V0dGluZ3MqIHNldHRpbmdz
ID0gUGxhdGZvcm06OlNldHRpbmdzOjpnZXQoKTsKKyAgICBtX3BhZ2UtPnNldHRpbmdzKCktPnNl
dFdlYkdMRW5hYmxlZChzZXR0aW5ncyAmJiBzZXR0aW5ncy0+aXNXZWJHTFN1cHBvcnRlZCgpKTsK
KyNlbmRpZgorI2lmIEVOQUJMRShTS0lBX0dQVV9DQU5WQVMpCisgICAgbV9wYWdlLT5zZXR0aW5n
cygpLT5zZXRDYW52YXNVc2VzQWNjZWxlcmF0ZWREcmF3aW5nKHRydWUpOworICAgIG1fcGFnZS0+
c2V0dGluZ3MoKS0+c2V0QWNjZWxlcmF0ZWQyZENhbnZhc0VuYWJsZWQodHJ1ZSk7CisjZW5kaWYK
KyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9XKQorICAgIG1fcGFnZS0+c2V0dGluZ3MoKS0+c2V0
VGV4dFJlZmxvd0VuYWJsZWQobV93ZWJTZXR0aW5ncy0+dGV4dFJlZmxvd01vZGUoKSA9PSBXZWJT
ZXR0aW5nczo6VGV4dFJlZmxvd0VuYWJsZWQpOworI2VuZGlmCisKKyAgICBtX3BhZ2UtPnNldHRp
bmdzKCktPnNldFVzZUhpeGllNzZXZWJTb2NrZXRQcm90b2NvbChmYWxzZSk7CisgICAgbV9wYWdl
LT5zZXR0aW5ncygpLT5zZXRJbnRlcmFjdGl2ZUZvcm1WYWxpZGF0aW9uRW5hYmxlZCh0cnVlKTsK
KyAgICBtX3BhZ2UtPnNldHRpbmdzKCktPnNldEFsbG93VW5pdmVyc2FsQWNjZXNzRnJvbUZpbGVV
UkxzKGZhbHNlKTsKKworICAgIG1fYmFja2luZ1N0b3JlQ2xpZW50ID0gQmFja2luZ1N0b3JlQ2xp
ZW50OjpjcmVhdGUobV9tYWluRnJhbWUsIC8qIHBhcmVudCBmcmFtZSAqLyAwLCBtX3dlYlBhZ2Up
OworICAgIC8vIFRoZSBkaXJlY3QgYWNjZXNzIHRvIEJhY2tpbmdTdG9yZSBpcyBsZWZ0IGhlcmUg
Zm9yIGNvbnZlbmllbmNlIHNpbmNlIGl0CisgICAgLy8gaXMgb3duZWQgYnkgQmFja2luZ1N0b3Jl
Q2xpZW50IGFuZCB0aGVuIGRlbGV0ZWQgYnkgaXRzIGRlc3RydWN0b3IuCisgICAgbV9iYWNraW5n
U3RvcmUgPSBtX2JhY2tpbmdTdG9yZUNsaWVudC0+YmFja2luZ1N0b3JlKCk7CisKKyAgICBtX3Bh
Z2UtPnNldHRpbmdzKCktPnNldFNwYXRpYWxOYXZpZ2F0aW9uRW5hYmxlZChtX3dlYlNldHRpbmdz
LT5pc1NwYXRpYWxOYXZpZ2F0aW9uRW5hYmxlZCgpKTsKKyAgICBibG9ja0NsaWNrUmFkaXVzID0g
aW50KHJvdW5kZigwLjM1ICogUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OnBpeGVsc1Blcklu
Y2goMCkud2lkdGgoKSkpOyAvLyBUaGUgY2xpY2tlZCByZWN0YW5nbGUgYXJlYSBzaG91bGQgYmUg
YSBmaXhlZCB1bml0IG9mIG1lYXN1cmVtZW50LgorCisgICAgbV9wYWdlLT5zZXR0aW5ncygpLT5z
ZXREZWxlZ2F0ZVNlbGVjdGlvblBhaW50KHRydWUpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRl
Ojpsb2FkKGNvbnN0IGNoYXIqIHVybCwgY29uc3QgY2hhciogbmV0d29ya1Rva2VuLCBjb25zdCBj
aGFyKiBtZXRob2QsIFBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6Q2FjaGVQb2xpY3kgY2FjaGVQ
b2xpY3ksIGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBkYXRhTGVuZ3RoLCBjb25zdCBjaGFyKiBj
b25zdCogaGVhZGVycywgc2l6ZV90IGhlYWRlcnNMZW5ndGgsIGJvb2wgaXNJbml0aWFsLCBib29s
IG11c3RIYW5kbGVJbnRlcm5hbGx5LCBib29sIGZvcmNlRG93bmxvYWQsIGNvbnN0IGNoYXIqIG92
ZXJyaWRlQ29udGVudFR5cGUpCit7CisgICAgc3RvcEN1cnJlbnRMb2FkKCk7CisKKyAgICBTdHJp
bmcgdXJsU3RyaW5nKHVybCk7CisgICAgaWYgKHVybFN0cmluZy5zdGFydHNXaXRoKCJ2czoiLCBm
YWxzZSkpIHsKKyAgICAgICAgdXJsU3RyaW5nID0gdXJsU3RyaW5nLnN1YnN0cmluZygzKTsKKyAg
ICAgICAgbV9tYWluRnJhbWUtPnNldEluVmlld1NvdXJjZU1vZGUodHJ1ZSk7CisgICAgfSBlbHNl
CisgICAgICAgIG1fbWFpbkZyYW1lLT5zZXRJblZpZXdTb3VyY2VNb2RlKGZhbHNlKTsKKworICAg
IEtVUkwga3VybCA9IHBhcnNlVXJsKHVybFN0cmluZyk7CisgICAgaWYgKHByb3RvY29sSXMoa3Vy
bCwgImphdmFzY3JpcHQiKSkgeworICAgICAgICAvLyBOZXZlciBydW4gamF2YXNjcmlwdCB3aGls
ZSBsb2FkaW5nIGlzIGRlZmVycmVkLgorICAgICAgICBpZiAobV9wYWdlLT5kZWZlcnNMb2FkaW5n
KCkpIHsKKyAgICAgICAgICAgIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeSogZnJhbWVMb2Fk
ZXJDbGllbnQgPSBzdGF0aWNfY2FzdDxGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkqPihtX21h
aW5GcmFtZS0+bG9hZGVyKCktPmNsaWVudCgpKTsKKyAgICAgICAgICAgIGZyYW1lTG9hZGVyQ2xp
ZW50LT5zZXREZWZlcnJlZE1hbnVhbFNjcmlwdChrdXJsKTsKKyAgICAgICAgfSBlbHNlCisgICAg
ICAgICAgICBtX21haW5GcmFtZS0+c2NyaXB0KCktPmV4ZWN1dGVJZkphdmFTY3JpcHRVUkwoa3Vy
bCwgRG9Ob3RSZXBsYWNlRG9jdW1lbnRJZkphdmFTY3JpcHRVUkwpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgaWYgKGlzSW5pdGlhbCkKKyAgICAgICAgTmV0d29ya01hbmFnZXI6Omlu
c3RhbmNlKCktPnNldEluaXRpYWxVUkwoa3VybCk7CisKKyAgICBSZXNvdXJjZVJlcXVlc3QgcmVx
dWVzdChrdXJsLCAiIiAvKiByZWZlcnJlciAqLyk7CisgICAgcmVxdWVzdC5zZXRUb2tlbihuZXR3
b3JrVG9rZW4pOworICAgIGlmIChpc0luaXRpYWwgfHwgbXVzdEhhbmRsZUludGVybmFsbHkpCisg
ICAgICAgIHJlcXVlc3Quc2V0TXVzdEhhbmRsZUludGVybmFsbHkodHJ1ZSk7CisgICAgcmVxdWVz
dC5zZXRIVFRQTWV0aG9kKG1ldGhvZCk7CisgICAgcmVxdWVzdC5zZXRDYWNoZVBvbGljeSh0b1dl
YkNvcmVDYWNoZVBvbGljeShjYWNoZVBvbGljeSkpOworICAgIGlmIChvdmVycmlkZUNvbnRlbnRU
eXBlKQorICAgICAgICByZXF1ZXN0LnNldE92ZXJyaWRlQ29udGVudFR5cGUob3ZlcnJpZGVDb250
ZW50VHlwZSk7CisKKyAgICBpZiAoZGF0YSkKKyAgICAgICAgcmVxdWVzdC5zZXRIVFRQQm9keShG
b3JtRGF0YTo6Y3JlYXRlKGRhdGEsIGRhdGFMZW5ndGgpKTsKKworICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgKyAxIDwgaGVhZGVyc0xlbmd0aDsgaSArPSAyKQorICAgICAgICByZXF1ZXN0LmFk
ZEhUVFBIZWFkZXJGaWVsZChoZWFkZXJzW2ldLCBoZWFkZXJzW2kgKyAxXSk7CisKKyAgICBpZiAo
Zm9yY2VEb3dubG9hZCkKKyAgICAgICAgcmVxdWVzdC5zZXRGb3JjZURvd25sb2FkKHRydWUpOwor
CisgICAgbV9tYWluRnJhbWUtPmxvYWRlcigpLT5sb2FkKHJlcXVlc3QsICIiIC8qIG5hbWUgKi8s
IGZhbHNlKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6bG9hZFN0cmluZyhjb25zdCBjaGFy
KiBzdHJpbmcsIGNvbnN0IGNoYXIqIGJhc2VVUkwsIGNvbnN0IGNoYXIqIGNvbnRlbnRUeXBlLCBj
b25zdCBjaGFyKiBmYWlsaW5nVVJMKQoreworICAgIEtVUkwga3VybCA9IHBhcnNlVXJsKGJhc2VV
UkwpOworICAgIFJlc291cmNlUmVxdWVzdCByZXF1ZXN0KGt1cmwpOworICAgIFdURjo6UmVmUHRy
PFNoYXJlZEJ1ZmZlcj4gYnVmZmVyCisgICAgICAgID0gU2hhcmVkQnVmZmVyOjpjcmVhdGUoc3Ry
aW5nLCBzdHJsZW4oc3RyaW5nKSk7CisgICAgU3Vic3RpdHV0ZURhdGEgc3Vic3RpdHV0ZURhdGEo
YnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RNSU1FVHlw
ZUZyb21NZWRpYVR5cGUoY29udGVudFR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGV4dHJhY3RDaGFyc2V0RnJvbU1lZGlhVHlwZShjb250ZW50VHlwZSksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGluZ1VSTCA/IHBhcnNlVXJsKGZhaWxpbmdV
UkwpIDogS1VSTCgpKTsKKyAgICBtX21haW5GcmFtZS0+bG9hZGVyKCktPmxvYWQocmVxdWVzdCwg
c3Vic3RpdHV0ZURhdGEsIGZhbHNlKTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6ZXhlY3V0
ZUphdmFTY3JpcHQoY29uc3QgY2hhciogc2NyaXB0LCBKYXZhU2NyaXB0RGF0YVR5cGUmIHJldHVy
blR5cGUsIFdlYlN0cmluZyYgcmV0dXJuVmFsdWUpCit7CisgICAgU2NyaXB0VmFsdWUgcmVzdWx0
ID0gbV9tYWluRnJhbWUtPnNjcmlwdCgpLT5leGVjdXRlU2NyaXB0KFN0cmluZzo6ZnJvbVVURjgo
c2NyaXB0KSwgZmFsc2UpOworICAgIEpTQzo6SlNWYWx1ZSB2YWx1ZSA9IHJlc3VsdC5qc1ZhbHVl
KCk7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICByZXR1cm5UeXBlID0gSlNFeGNlcHRpb247
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBKU0M6OkV4ZWNTdGF0ZSogZXhl
YyA9IG1fbWFpbkZyYW1lLT5zY3JpcHQoKS0+Z2xvYmFsT2JqZWN0KG1haW5UaHJlYWROb3JtYWxX
b3JsZCgpKS0+Z2xvYmFsRXhlYygpOworICAgIEpTR2xvYmFsQ29udGV4dFJlZiBjb250ZXh0ID0g
dG9HbG9iYWxSZWYoZXhlYyk7CisKKyAgICBKU1R5cGUgdHlwZSA9IEpTVmFsdWVHZXRUeXBlKGNv
bnRleHQsIHRvUmVmKGV4ZWMsIHZhbHVlKSk7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBj
YXNlIGtKU1R5cGVOdWxsOgorICAgICAgICByZXR1cm5UeXBlID0gSlNOdWxsOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIGtKU1R5cGVCb29sZWFuOgorICAgICAgICByZXR1cm5UeXBlID0gSlNC
b29sZWFuOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGtKU1R5cGVOdW1iZXI6CisgICAgICAg
IHJldHVyblR5cGUgPSBKU051bWJlcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrSlNUeXBl
U3RyaW5nOgorICAgICAgICByZXR1cm5UeXBlID0gSlNTdHJpbmc7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2Uga0pTVHlwZU9iamVjdDoKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTT2JqZWN0Owor
ICAgICAgICBicmVhazsKKyAgICBjYXNlIGtKU1R5cGVVbmRlZmluZWQ6CisgICAgZGVmYXVsdDoK
KyAgICAgICAgcmV0dXJuVHlwZSA9IEpTVW5kZWZpbmVkOworICAgICAgICBicmVhazsKKyAgICB9
CisKKyAgICBpZiAocmV0dXJuVHlwZSA9PSBKU0Jvb2xlYW4gfHwgcmV0dXJuVHlwZSA9PSBKU051
bWJlciB8fCByZXR1cm5UeXBlID09IEpTU3RyaW5nIHx8IHJldHVyblR5cGUgPT0gSlNPYmplY3Qp
IHsKKyAgICAgICAgU3RyaW5nIHN0ciA9IHJlc3VsdC50b1N0cmluZyhleGVjKTsKKyAgICAgICAg
cmV0dXJuVmFsdWUgPSBXZWJTdHJpbmcoc3RyLmltcGwoKSk7CisgICAgfQorCisgICAgcmV0dXJu
IHRydWU7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OmV4ZWN1dGVKYXZhU2NyaXB0SW5Jc29s
YXRlZFdvcmxkKGNvbnN0IFNjcmlwdFNvdXJjZUNvZGUmIHNvdXJjZUNvZGUsIEphdmFTY3JpcHRE
YXRhVHlwZSYgcmV0dXJuVHlwZSwgV2ViU3RyaW5nJiByZXR1cm5WYWx1ZSkKK3sKKyAgICBpZiAo
IW1faXNvbGF0ZWRXb3JsZCkKKyAgICAgICAgbV9pc29sYXRlZFdvcmxkID0gbV9tYWluRnJhbWUt
PnNjcmlwdCgpLT5jcmVhdGVXb3JsZCgpOworCisgICAgLy8gVXNlIGV2YWx1YXRlSW5Xb3JsZCB0
byBhdm9pZCBjYW5FeGVjdXRlU2NyaXB0cyBjaGVjay4KKyAgICBTY3JpcHRWYWx1ZSByZXN1bHQg
PSBtX21haW5GcmFtZS0+c2NyaXB0KCktPmV2YWx1YXRlSW5Xb3JsZChzb3VyY2VDb2RlLCBtX2lz
b2xhdGVkV29ybGQuZ2V0KCkpOworICAgIEpTQzo6SlNWYWx1ZSB2YWx1ZSA9IHJlc3VsdC5qc1Zh
bHVlKCk7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICByZXR1cm5UeXBlID0gSlNFeGNlcHRp
b247CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBKU0M6OkV4ZWNTdGF0ZSog
ZXhlYyA9IG1fbWFpbkZyYW1lLT5zY3JpcHQoKS0+Z2xvYmFsT2JqZWN0KG1faXNvbGF0ZWRXb3Js
ZC5nZXQoKSktPmdsb2JhbEV4ZWMoKTsKKyAgICBKU0dsb2JhbENvbnRleHRSZWYgY29udGV4dCA9
IHRvR2xvYmFsUmVmKGV4ZWMpOworCisgICAgSlNUeXBlIHR5cGUgPSBKU1ZhbHVlR2V0VHlwZShj
b250ZXh0LCB0b1JlZihleGVjLCB2YWx1ZSkpOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAg
Y2FzZSBrSlNUeXBlTnVsbDoKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTTnVsbDsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBrSlNUeXBlQm9vbGVhbjoKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpT
Qm9vbGVhbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrSlNUeXBlTnVtYmVyOgorICAgICAg
ICByZXR1cm5UeXBlID0gSlNOdW1iZXI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga0pTVHlw
ZVN0cmluZzoKKyAgICAgICAgcmV0dXJuVHlwZSA9IEpTU3RyaW5nOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIGtKU1R5cGVPYmplY3Q6CisgICAgICAgIHJldHVyblR5cGUgPSBKU09iamVjdDsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrSlNUeXBlVW5kZWZpbmVkOgorICAgIGRlZmF1bHQ6
CisgICAgICAgIHJldHVyblR5cGUgPSBKU1VuZGVmaW5lZDsKKyAgICAgICAgYnJlYWs7CisgICAg
fQorCisgICAgaWYgKHJldHVyblR5cGUgPT0gSlNCb29sZWFuIHx8IHJldHVyblR5cGUgPT0gSlNO
dW1iZXIgfHwgcmV0dXJuVHlwZSA9PSBKU1N0cmluZyB8fCByZXR1cm5UeXBlID09IEpTT2JqZWN0
KSB7CisgICAgICAgIFN0cmluZyBzdHIgPSByZXN1bHQudG9TdHJpbmcoZXhlYyk7CisgICAgICAg
IHJldHVyblZhbHVlID0gV2ViU3RyaW5nKHN0ci5pbXBsKCkpOworICAgIH0KKworICAgIHJldHVy
biB0cnVlOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzdG9wQ3VycmVudExvYWQoKQorewor
ICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGNvbnRhaW4gYWxsIGNvbW1vbiBjb2RlIHRyaWdn
ZXJlZCBieSBXZWJQYWdlOjpsb2FkCisgICAgLy8gKHdoaWNoIHN0b3BzIGFueSBsb2FkIGluIHBy
b2dyZXNzIGJlZm9yZSBzdGFydGluZyB0aGUgbmV3IGxvYWQpIGFuZAorICAgIC8vIFdlYlBhZ2U6
OnN0b3Bsb2FkaW5nICh0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBjbGllbnQgdG8gc3RvcCB0aGUg
bG9hZAorICAgIC8vIGV4cGxpY2l0bHkpLiBJZiBpdCBzaG91bGQgb25seSBiZSBkb25lIHdoaWxl
IHN0b3BwaW5nIHRoZSBsb2FkCisgICAgLy8gZXhwbGljaXRseSwgaXQgZ29lcyBpbiBXZWJQYWdl
OjpzdG9wTG9hZGluZywgbm90IGhlcmUuCisgICAgbV9tYWluRnJhbWUtPmxvYWRlcigpLT5zdG9w
QWxsTG9hZGVycygpOworCisgICAgLy8gQ2FuY2VsIGFueSBkZWZlcnJlZCBzY3JpcHQgdGhhdCBo
YXNuJ3QgYmVlbiBwcm9jZXNzZWQgeWV0LgorICAgIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJy
eSogZnJhbWVMb2FkZXJDbGllbnQgPSBzdGF0aWNfY2FzdDxGcmFtZUxvYWRlckNsaWVudEJsYWNr
QmVycnkqPihtX21haW5GcmFtZS0+bG9hZGVyKCktPmNsaWVudCgpKTsKKyAgICBmcmFtZUxvYWRl
ckNsaWVudC0+c2V0RGVmZXJyZWRNYW51YWxTY3JpcHQoS1VSTCgpKTsKK30KKworc3RhdGljIHZv
aWQgY2xvc2VVUkxSZWN1cnNpdmVseShGcmFtZSogZnJhbWUpCit7CisgICAgLy8gRG8gbm90IGNy
ZWF0ZSBtb3JlIGZyYW1lIHBsZWFzZS4KKyAgICBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkq
IGZyYW1lTG9hZGVyQ2xpZW50ID0gc3RhdGljX2Nhc3Q8RnJhbWVMb2FkZXJDbGllbnRCbGFja0Jl
cnJ5Kj4oZnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKSk7CisgICAgZnJhbWVMb2FkZXJDbGllbnQt
PnN1cHByZXNzQ2hpbGRGcmFtZUNyZWF0aW9uKCk7CisKKyAgICBmcmFtZS0+bG9hZGVyKCktPmNs
b3NlVVJMKCk7CisKKyAgICBWZWN0b3I8UmVmUHRyPEZyYW1lPiwgMTA+IGNoaWxkRnJhbWVzOwor
CisgICAgZm9yIChSZWZQdHI8RnJhbWU+IGNoaWxkRnJhbWUgPSBmcmFtZS0+dHJlZSgpLT5maXJz
dENoaWxkKCk7IGNoaWxkRnJhbWU7IGNoaWxkRnJhbWUgPSBjaGlsZEZyYW1lLT50cmVlKCktPm5l
eHRTaWJsaW5nKCkpCisgICAgICAgIGNoaWxkRnJhbWVzLmFwcGVuZChjaGlsZEZyYW1lKTsKKwor
ICAgIHVuc2lnbmVkIHNpemUgPSBjaGlsZEZyYW1lcy5zaXplKCk7CisgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgY2xvc2VVUkxSZWN1cnNpdmVseShjaGls
ZEZyYW1lc1tpXS5nZXQoKSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnByZXBhcmVUb0Rl
c3Ryb3koKQoreworICAgIC8vIEJlZm9yZSB0aGUgY2xpZW50IHN0YXJ0cyB0ZWFyaW5nIGl0c2Vs
ZiBkb3duLCBkaXNwYXRjaCB0aGUgdW5sb2FkIGV2ZW50CisgICAgLy8gc28gaXQgY2FuIHRha2Ug
ZWZmZWN0IHdoaWxlIGFsbCB0aGUgY2xpZW50J3Mgc3RhdGUgKGUuZy4gc2Nyb2xsIHBvc2l0aW9u
KQorICAgIC8vIGlzIHN0aWxsIHByZXNlbnQuCisgICAgY2xvc2VVUkxSZWN1cnNpdmVseShtX21h
aW5GcmFtZSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldExvYWRTdGF0ZShMb2FkU3Rh
dGUgc3RhdGUpCit7CisgICAgaWYgKG1fbG9hZFN0YXRlID09IHN0YXRlKQorICAgICAgICByZXR1
cm47CisKKyAgICBib29sIGlzRmlyc3RMb2FkID0gbV9sb2FkU3RhdGUgPT0gTm9uZTsKKworICAg
IC8vIFNlZSBSSU0gQnVnICMxMDY4LgorICAgIGlmIChzdGF0ZSA9PSBGaW5pc2hlZCAmJiBtX21h
aW5GcmFtZSAmJiBtX21haW5GcmFtZS0+ZG9jdW1lbnQoKSkKKyAgICAgICAgbV9tYWluRnJhbWUt
PmRvY3VtZW50KCktPnVwZGF0ZVN0eWxlSWZOZWVkZWQoKTsKKworICAgIG1fbG9hZFN0YXRlID0g
c3RhdGU7CisKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICBQbGF0Zm9ybTo6bG9nKFBsYXRm
b3JtOjpMb2dMZXZlbEluZm8sICJXZWJQYWdlUHJpdmF0ZTo6c2V0TG9hZFN0YXRlICVkIiwgc3Rh
dGUpOworI2VuZGlmCisKKyAgICBzd2l0Y2ggKG1fbG9hZFN0YXRlKSB7CisgICAgY2FzZSBQcm92
aXNpb25hbDoKKyAgICAgICAgaWYgKGlzRmlyc3RMb2FkKSB7CisgICAgICAgICAgICAvLyBQYWlu
dHMgdGhlIHZpc2libGUgYmFja2luZ3N0b3JlIGFzIHdoaXRlIHRvIHByZXZlbnQgaW5pdGlhbCBj
aGVja2VyYm9hcmQgb24KKyAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBibGl0LgorICAgICAgICAg
ICAgaWYgKG1fYmFja2luZ1N0b3JlLT5kLT5yZW5kZXJWaXNpYmxlQ29udGVudHMoKSAmJiAhbV9i
YWNraW5nU3RvcmUtPmQtPmlzU3VzcGVuZGVkKCkgJiYgIW1fYmFja2luZ1N0b3JlLT5kLT5zaG91
bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKQorICAgICAgICAgICAgICAgIG1fYmFja2luZ1N0
b3JlLT5kLT5ibGl0VmlzaWJsZUNvbnRlbnRzKCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBDb21taXR0ZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2NoZWR1bGVa
b29tQWJvdXRQb2ludCgpOworCisjaWYgRU5BQkxFKFNLSUFfR1BVX0NBTlZBUykKKyAgICAgICAg
ICAgIGlmIChtX3BhZ2UtPnNldHRpbmdzKCktPmNhbnZhc1VzZXNBY2NlbGVyYXRlZERyYXdpbmco
KSkgeworICAgICAgICAgICAgICAgIC8vIEZyZWUgR1BVIHJlc291cmNlcyBhcyB3ZSdyZSBvbiBh
IG5ldyBwYWdlLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBoZWxwIHVzIHRvIGZyZWUg
bWVtb3J5IHByZXNzdXJlLgorICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpHcmFwaGljczo6bWFr
ZVNoYXJlZFJlc291cmNlQ29udGV4dEN1cnJlbnQoUGxhdGZvcm06OkdyYXBoaWNzOjpHTEVTMik7
CisgICAgICAgICAgICAgICAgR3JDb250ZXh0KiBnckNvbnRleHQgPSBQbGF0Zm9ybTo6R3JhcGhp
Y3M6OmdldEdyQ29udGV4dCgpOworICAgICAgICAgICAgICAgIGdyQ29udGV4dC0+ZnJlZUdwdVJl
c291cmNlcygpOworICAgICAgICAgICAgfQorI2VuZGlmCisKKyNpZiBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCisgICAgICAgICAgICAvLyBGSVhNRTogY29tcG9zaXRvciBtYXkgb25seSBi
ZSB0b3VjaGVkIG9uIHRoZSBjb21wb3NpdGluZyB0aHJlYWQuCisgICAgICAgICAgICAvLyBIb3dl
dmVyLCBpdCdzIGNyZWF0ZWQvZGVzdHJveWVkIGJ5IGEgc3luYyBjb21tYW5kIHNvIHRoaXMgaXMg
aGFybWxlc3MuCisgICAgICAgICAgICBpZiAobV9jb21wb3NpdG9yKSB7CisgICAgICAgICAgICAg
ICAgbV9jb21wb3NpdG9yLT5zZXRMYXlvdXRSZWN0Rm9yQ29tcG9zaXRpbmcoSW50UmVjdCgpKTsK
KyAgICAgICAgICAgICAgICBtX2NvbXBvc2l0b3ItPnNldENvbnRlbnRzU2l6ZUZvckNvbXBvc2l0
aW5nKEludFNpemUoKSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIG1fcHJl
dmlvdXNDb250ZW50c1NpemUgPSBJbnRTaXplKCk7CisgICAgICAgICAgICBtX2JhY2tpbmdTdG9y
ZS0+ZC0+cmVzZXRSZW5kZXJRdWV1ZSgpOworICAgICAgICAgICAgbV9iYWNraW5nU3RvcmUtPmQt
PnJlc2V0VGlsZXModHJ1ZSAvKiByZXNldEJhY2tncm91bmQgKi8pOworICAgICAgICAgICAgbV9i
YWNraW5nU3RvcmUtPmQtPnNldFNjcm9sbGluZ09yWm9vbWluZyhmYWxzZSwgZmFsc2UgLyogc2hv
dWxkQmxpdCAqLyk7CisgICAgICAgICAgICBtX3VzZXJQZXJmb3JtZWRNYW51YWxab29tID0gZmFs
c2U7CisgICAgICAgICAgICBtX3VzZXJQZXJmb3JtZWRNYW51YWxTY3JvbGwgPSBmYWxzZTsKKyAg
ICAgICAgICAgIG1fc2hvdWxkVXNlRml4ZWREZXNrdG9wTW9kZSA9IGZhbHNlOworICAgICAgICAg
ICAgaWYgKG1fcmVzZXRWaXJ0dWFsVmlld3BvcnRPbkNvbW1pdHRlZCkgeyAvLyBGb3IgRFJULgor
ICAgICAgICAgICAgICAgIG1fdmlydHVhbFZpZXdwb3J0V2lkdGggPSAwOworICAgICAgICAgICAg
ICAgIG1fdmlydHVhbFZpZXdwb3J0SGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGlmIChtX3dlYlNldHRpbmdzLT52aWV3cG9ydFdpZHRoKCkgPiAwKSB7CisgICAgICAgICAg
ICAgICAgbV92aXJ0dWFsVmlld3BvcnRXaWR0aCA9IG1fd2ViU2V0dGluZ3MtPnZpZXdwb3J0V2lk
dGgoKTsKKyAgICAgICAgICAgICAgICBtX3ZpcnR1YWxWaWV3cG9ydEhlaWdodCA9IG1fZGVmYXVs
dExheW91dFNpemUuaGVpZ2h0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDaGVj
ayBpZiB3ZSBoYXZlIGFscmVhZHkgcHJvY2VzcyB0aGUgbWV0YSB2aWV3cG9ydCB0YWcsIHRoaXMg
b25seSBoYXBwZW5zIG9uIGhpc3RvcnkgbmF2aWdhdGlvbgorICAgICAgICAgICAgaWYgKCFtX2Rp
ZFJlc3RvcmVGcm9tUGFnZUNhY2hlKSB7CisgICAgICAgICAgICAgICAgbV92aWV3cG9ydEFyZ3Vt
ZW50cyA9IFZpZXdwb3J0QXJndW1lbnRzKCk7CisgICAgICAgICAgICAgICAgbV91c2VyU2NhbGFi
bGUgPSBtX3dlYlNldHRpbmdzLT5pc1VzZXJTY2FsYWJsZSgpOworICAgICAgICAgICAgICAgIHJl
c2V0U2NhbGVzKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEludFNp
emUgdmlydHVhbFZpZXdwb3J0ID0gcmVjb21wdXRlVmlydHVhbFZpZXdwb3J0RnJvbVZpZXdwb3J0
QXJndW1lbnRzKCk7CisgICAgICAgICAgICAgICAgbV93ZWJQYWdlLT5zZXRWaXJ0dWFsVmlld3Bv
cnRTaXplKHZpcnR1YWxWaWV3cG9ydC53aWR0aCgpLCB2aXJ0dWFsVmlld3BvcnQuaGVpZ2h0KCkp
OworICAgICAgICAgICAgfQorCisjaWYgRU5BQkxFKEVWRU5UX01PREVfTUVUQVRBR1MpCisgICAg
ICAgICAgICBkaWRSZWNlaXZlQ3Vyc29yRXZlbnRNb2RlKFByb2Nlc3NlZEN1cnNvckV2ZW50cyk7
CisgICAgICAgICAgICBkaWRSZWNlaXZlVG91Y2hFdmVudE1vZGUoUHJvY2Vzc2VkVG91Y2hFdmVu
dHMpOworI2VuZGlmCisKKyAgICAgICAgICAgIC8vIElmIGl0J3MgYSBvdXRtb3N0IFNWRyBkb2N1
bWVudCwgd2UgdXNlIEZpeGVkRGVza3RvcCBtb2RlLCBvdGhlcndpc2UKKyAgICAgICAgICAgIC8v
IHdlIGRlZmF1bHQgdG8gTW9iaWxlIG1vZGUuIEZvciBleGFtcGxlLCB1c2luZyBGaXhlZERlc2t0
b3AgbW9kZSB0bworICAgICAgICAgICAgLy8gcmVuZGVyIGh0dHA6Ly93d3cuY3JvY3ppbGxhLmNv
bS9iaXRzX2FuZF9waWVjZXMvc3ZnL3NhbXBsZXMvdGlnZXIvdGlnZXIuc3ZnCisgICAgICAgICAg
ICAvLyBpcyB1c2VyLWV4cGVyaWVuY2UgZnJpZW5kbHkuCisgICAgICAgICAgICBpZiAobV9wYWdl
LT5tYWluRnJhbWUoKS0+ZG9jdW1lbnQoKS0+aXNTVkdEb2N1bWVudCgpKSB7CisgICAgICAgICAg
ICAgICAgc2V0U2hvdWxkVXNlRml4ZWREZXNrdG9wTW9kZSh0cnVlKTsKKyAgICAgICAgICAgICAg
ICBzZXRWaWV3TW9kZShGaXhlZERlc2t0b3ApOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAg
ICAgICAgICAgc2V0Vmlld01vZGUoTW9iaWxlKTsKKworICAgICAgICAgICAgLy8gUmVzZXQgYmxv
Y2sgem9vbSBhbmQgcmVmbG93LgorICAgICAgICAgICAgcmVzZXRCbG9ja1pvb20oKTsKKyNpZiBF
TkFCTEUoVklFV1BPUlRfUkVGTE9XKQorICAgICAgICAgICAgdG9nZ2xlVGV4dFJlZmxvd0lmRW5h
YmxlZEZvckJsb2NrWm9vbU9ubHkoKTsKKyNlbmRpZgorCisgICAgICAgICAgICAvLyBTZXQgdGhl
IHNjcm9sbCB0byBvcmlnaW4gaGVyZSBhbmQgbm90aWZ5IHRoZSBjbGllbnQgc2luY2Ugd2UnbGwg
YmUKKyAgICAgICAgICAgIC8vIHpvb21pbmcgYmVsb3cgd2l0aG91dCBhbnkgcmVhbCBjb250ZW50
cyB5ZXQgdGh1cyB0aGUgY29udGVudHMgc2l6ZQorICAgICAgICAgICAgLy8gd2UgcmVwb3J0IHRv
IHRoZSBjbGllbnQgY291bGQgbWFrZSBvdXIgY3VycmVudCBzY3JvbGwgcG9zaXRpb24gaW52YWxp
ZC4KKyAgICAgICAgICAgIHNldFNjcm9sbFBvc2l0aW9uKEludFBvaW50Ojp6ZXJvKCkpOworICAg
ICAgICAgICAgbm90aWZ5VHJhbnNmb3JtZWRTY3JvbGxDaGFuZ2VkKCk7CisKKyAgICAgICAgICAg
IC8vIFBhaW50cyB0aGUgdmlzaWJsZSBiYWNraW5nc3RvcmUgYXMgd2hpdGUuIE5vdGUgaXQgaXMg
aW1wb3J0YW50IHdlIGRvCisgICAgICAgICAgICAvLyB0aGlzIHN0cmljdGx5IGFmdGVyIHJlLXNl
dHRpbmcgdGhlIHNjcm9sbCBwb3NpdGlvbiB0byBvcmlnaW4gYW5kIHJlc2V0dGluZworICAgICAg
ICAgICAgLy8gdGhlIHNjYWxlcyBvdGhlcndpc2UgdGhlIHZpc2libGUgY29udGVudHMgY2FsY3Vs
YXRpb24gaXMgd3JvbmcgYW5kIHdlCisgICAgICAgICAgICAvLyBjYW4gZW5kIHVwIGJsaXR0aW5n
IGFydGlmYWN0cyBpbnN0ZWFkLiBTZWU6IFJJTSBCdWcgIzQwMS4KKyAgICAgICAgICAgIGlmICht
X2JhY2tpbmdTdG9yZS0+ZC0+cmVuZGVyVmlzaWJsZUNvbnRlbnRzKCkgJiYgIW1fYmFja2luZ1N0
b3JlLT5kLT5pc1N1c3BlbmRlZCgpICYmICFtX2JhY2tpbmdTdG9yZS0+ZC0+c2hvdWxkRGlyZWN0
UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAgICAgICAgICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+
YmxpdFZpc2libGVDb250ZW50cygpOworCisgICAgICAgICAgICB6b29tVG9Jbml0aWFsU2NhbGVP
bkxvYWQoKTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIGN1cnNvciBzdGF0dXMuCisgICAgICAg
ICAgICB1cGRhdGVDdXJzb3IoKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
KyAgICAgICAgICAgIC8vIERvbid0IHJlbmRlciBjb21wb3NpdGluZyBjb250ZW50cyBmcm9tIHBy
ZXZpb3VzIHBhZ2UuCisgICAgICAgICAgICByZXNldENvbXBvc2l0aW5nU3VyZmFjZSgpOworI2Vu
ZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgRmluaXNoZWQ6Cisg
ICAgY2FzZSBGYWlsZWQ6CisgICAgICAgIC8vIE5vdGlmeSBjbGllbnQgb2YgdGhlIGluaXRpYWwg
em9vbSBjaGFuZ2UuCisgICAgICAgIG1fY2xpZW50LT56b29tQ2hhbmdlZChtX3dlYlBhZ2UtPmlz
TWluWm9vbWVkKCksIG1fd2ViUGFnZS0+aXNNYXhab29tZWQoKSwgIXNob3VsZFpvb21PbkVzY2Fw
ZSgpLCBjdXJyZW50U2NhbGUoKSk7CisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT51cGRhdGVU
aWxlcyh0cnVlIC8qIHVwZGF0ZVZpc2libGUgKi8sIGZhbHNlIC8qIGltbWVkaWF0ZSAqLyk7Cisg
ICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwor
ZG91YmxlIFdlYlBhZ2VQcml2YXRlOjpjbGFtcGVkU2NhbGUoZG91YmxlIHNjYWxlKSBjb25zdAor
eworICAgIGlmIChzY2FsZSA8IG1pbmltdW1TY2FsZSgpKQorICAgICAgICByZXR1cm4gbWluaW11
bVNjYWxlKCk7CisgICAgaWYgKHNjYWxlID4gbWF4aW11bVNjYWxlKCkpCisgICAgICAgIHJldHVy
biBtYXhpbXVtU2NhbGUoKTsKKyAgICByZXR1cm4gc2NhbGU7Cit9CisKK2Jvb2wgV2ViUGFnZVBy
aXZhdGU6OnNob3VsZFpvb21BYm91dFBvaW50KGRvdWJsZSBzY2FsZSwgY29uc3QgRmxvYXRQb2lu
dCYsIGJvb2wgZW5mb3JjZVNjYWxlQ2xhbXBpbmcsIGRvdWJsZSogY2xhbXBlZFNjYWxlKQorewor
ICAgIGlmICghbV9tYWluRnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgaWYgKGVuZm9yY2VTY2FsZUNsYW1waW5nKQorICAgICAgICBzY2FsZSA9IHRoaXMtPmNsYW1w
ZWRTY2FsZShzY2FsZSk7CisKKyAgICBBU1NFUlQoY2xhbXBlZFNjYWxlKTsKKyAgICAqY2xhbXBl
ZFNjYWxlID0gc2NhbGU7CisKKyAgICBpZiAoY3VycmVudFNjYWxlKCkgPT0gc2NhbGUpIHsKKyAg
ICAgICAgLy8gTWFrZSBzdXJlIGJhY2tpbmdzdG9yZSB1cGRhdGVzIHJlc3VtZSBmcm9tIHBpbmNo
IHpvb20gaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGZpbmFsIHpvb20gbGV2ZWwgZG9lc24ndCBjaGFu
Z2UuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3Rv
cmVVcGRhdGVzKEJhY2tpbmdTdG9yZTo6Tm9uZSk7CisgICAgICAgIG1fY2xpZW50LT56b29tQ2hh
bmdlZChtX3dlYlBhZ2UtPmlzTWluWm9vbWVkKCksIG1fd2ViUGFnZS0+aXNNYXhab29tZWQoKSwg
IXNob3VsZFpvb21PbkVzY2FwZSgpLCBjdXJyZW50U2NhbGUoKSk7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0
ZTo6em9vbUFib3V0UG9pbnQoZG91YmxlIHVuY2xhbXBlZFNjYWxlLCBjb25zdCBGbG9hdFBvaW50
JiBhbmNob3IsIGJvb2wgZW5mb3JjZVNjYWxlQ2xhbXBpbmcsIGJvb2wgZm9yY2VSZW5kZXJpbmcs
IGJvb2wgaXNSZXN0b3Jpbmdab29tTGV2ZWwpCit7CisgICAgaWYgKCFpc1Jlc3RvcmluZ1pvb21M
ZXZlbCkgeworICAgICAgICAvLyBDbGVhciBhbnkgZXhpc3RpbmcgYmxvY2sgem9vbS4gIChJZiB3
ZSBhcmUgcmVzdG9yaW5nIGEgc2F2ZWQgem9vbSBsZXZlbCBvbiBwYWdlIGxvYWQsCisgICAgICAg
IC8vIHRoZXJlIGlzIGd1YXJhbnRlZWQgdG8gYmUgbm8gZXhpc3RpbmcgYmxvY2sgem9vbSBhbmQg
d2UgZG9uJ3Qgd2FudCB0byBjbGVhciBtX3Nob3VsZFJlZmxvd0Jsb2NrLikKKyAgICAgICAgcmVz
ZXRCbG9ja1pvb20oKTsKKyAgICB9CisKKyAgICAvLyBUaGUgcmVmbG93IGFuZCBibG9jayB6b29t
IHN0dWZmIGhlcmUgbmVlZHMgdG8gaGFwcGVuIHJlZ2FyZGxlc3Mgb2YKKyAgICAvLyB3aGV0aGVy
IHdlIHNob3VsZFpvb21BYm91dFBvaW50LgorI2lmIEVOQUJMRShWSUVXUE9SVF9SRUZMT1cpCisg
ICAgdG9nZ2xlVGV4dFJlZmxvd0lmRW5hYmxlZEZvckJsb2NrWm9vbU9ubHkobV9zaG91bGRSZWZs
b3dCbG9jayk7CisgICAgaWYgKG1fcGFnZS0+c2V0dGluZ3MoKS0+aXNUZXh0UmVmbG93RW5hYmxl
ZCgpICYmIG1fbWFpbkZyYW1lLT52aWV3KCkpCisgICAgICAgIHNldE5lZWRzTGF5b3V0KCk7Cisj
ZW5kaWYKKworICAgIGRvdWJsZSBzY2FsZTsKKyAgICBpZiAoIXNob3VsZFpvb21BYm91dFBvaW50
KHVuY2xhbXBlZFNjYWxlLCBhbmNob3IsIGVuZm9yY2VTY2FsZUNsYW1waW5nLCAmc2NhbGUpKSB7
CisgICAgICAgIGlmIChtX3dlYlBhZ2UtPnNldHRpbmdzKCktPnRleHRSZWZsb3dNb2RlKCkgPT0g
V2ViU2V0dGluZ3M6OlRleHRSZWZsb3dFbmFibGVkKSB7CisgICAgICAgICAgICBtX2N1cnJlbnRQ
aW5jaFpvb21Ob2RlID0gMDsKKyAgICAgICAgICAgIG1fYW5jaG9ySW5Ob2RlUmVjdFJhdGlvID0g
RmxvYXRQb2ludCgtMSwgLTEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggem9vbTsKKyAgICB6b29tLnNjYWxlKHNjYWxl
KTsKKworI2lmIERFQlVHX1dFQlBBR0VfTE9BRAorICAgIGlmIChsb2FkU3RhdGUoKSA8IEZpbmlz
aGVkKQorICAgICAgICBQbGF0Zm9ybTo6bG9nKFBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJXZWJQ
YWdlUHJpdmF0ZTo6em9vbUFib3V0UG9pbnQgc2NhbGUgJWYgYW5jaG9yICglZiwgJWYpIiwgc2Nh
bGUsIGFuY2hvci54KCksIGFuY2hvci55KCkpOworI2VuZGlmCisKKyAgICAvLyBPdXIgY3VycmVu
dCBzY3JvbGwgcG9zaXRpb24gaW4gZmxvYXQuCisgICAgRmxvYXRQb2ludCBzY3JvbGxQb3NpdGlv
biA9IHRoaXMtPnNjcm9sbFBvc2l0aW9uKCk7CisKKyAgICAvLyBBbmNob3Igb2Zmc2V0IGZyb20g
c2Nyb2xsIHBvc2l0aW9uIGluIGZsb2F0LgorICAgIEZsb2F0UG9pbnQgYW5jaG9yT2Zmc2V0KGFu
Y2hvci54KCkgLSBzY3JvbGxQb3NpdGlvbi54KCksIGFuY2hvci55KCkgLSBzY3JvbGxQb3NpdGlv
bi55KCkpOworCisgICAgLy8gVGhlIGhvcml6b250YWwgc2NhbGluZyBmYWN0b3IgYW5kIHZlcnRp
Y2FsIHNjYWxpbmcgZmFjdG9yIHNob3VsZCBiZSBlcXVhbAorICAgIC8vIHRvIHByZXNlcnZlIGFz
cGVjdCByYXRpbyBvZiBjb250ZW50LgorICAgIEFTU0VSVChtX3RyYW5zZm9ybWF0aW9uTWF0cml4
LT5tMTEoKSA9PSBtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tMjIoKSk7CisKKyAgICAvLyBOZWVk
IHRvIGludmVydCB0aGUgcHJldmlvdXMgdHJhbnNmb3JtIHRvIGFuY2hvciB0aGUgdmlld3BvcnQu
CisgICAgZG91YmxlIGludmVyc2VTY2FsZSA9IHNjYWxlIC8gbV90cmFuc2Zvcm1hdGlvbk1hdHJp
eC0+bTExKCk7CisKKyAgICAvLyBBY3R1YWwgem9vbS4KKyAgICAqbV90cmFuc2Zvcm1hdGlvbk1h
dHJpeCA9IHpvb207CisKKyAgICAvLyBTdXNwZW5kIGFsbCBzY3JlZW4gdXBkYXRlcyB0byB0aGUg
YmFja2luZ3N0b3JlLgorICAgIG1fYmFja2luZ1N0b3JlLT5kLT5zdXNwZW5kU2NyZWVuQW5kQmFj
a2luZ1N0b3JlVXBkYXRlcygpOworCisgICAgdXBkYXRlVmlld3BvcnRTaXplKCk7CisKKyAgICBJ
bnRQb2ludCBuZXdTY3JvbGxQb3NpdGlvbihJbnRQb2ludChtYXgoMCwgc3RhdGljX2Nhc3Q8aW50
Pihyb3VuZGYoYW5jaG9yLngoKSAtIGFuY2hvck9mZnNldC54KCkgLyBpbnZlcnNlU2NhbGUpKSks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KDAsIHN0YXRpY19j
YXN0PGludD4ocm91bmRmKGFuY2hvci55KCkgLSBhbmNob3JPZmZzZXQueSgpIC8gaW52ZXJzZVNj
YWxlKSkpKSk7CisKKyAgICBpZiAobV93ZWJQYWdlLT5zZXR0aW5ncygpLT50ZXh0UmVmbG93TW9k
ZSgpID09IFdlYlNldHRpbmdzOjpUZXh0UmVmbG93RW5hYmxlZCkgeworICAgICAgICAvLyBUaGlz
IGlzIGEgaGFjayBmb3IgZW1haWwgd2hpY2ggaGFzIHJlZmxvdyBhbHdheXMgdHVybmVkIG9uLgor
ICAgICAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXROZWVkc0xheW91dCgpOworICAgICAgICBy
ZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKTsKKyAgICAgICAgaWYgKG1fY3VycmVudFBpbmNoWm9vbU5v
ZGUpCisgICAgICAgICAgICBuZXdTY3JvbGxQb3NpdGlvbiA9IGNhbGN1bGF0ZVJlZmxvd2VkU2Ny
b2xsUG9zaXRpb24oYW5jaG9yT2Zmc2V0LCBzY2FsZSA9PSBtaW5pbXVtU2NhbGUoKSA/IDEgOiBp
bnZlcnNlU2NhbGUpOworICAgICAgICAgbV9jdXJyZW50UGluY2hab29tTm9kZSA9IDA7CisgICAg
ICAgICBtX2FuY2hvckluTm9kZVJlY3RSYXRpbyA9IEZsb2F0UG9pbnQoLTEsIC0xKTsKKyAgICB9
CisKKyAgICBzZXRTY3JvbGxQb3NpdGlvbihuZXdTY3JvbGxQb3NpdGlvbik7CisKKyAgICBub3Rp
ZnlUcmFuc2Zvcm1DaGFuZ2VkKCk7CisKKyAgICBib29sIGlzTG9hZGluZyA9IHRoaXMtPmlzTG9h
ZGluZygpOworCisgICAgLy8gV2UgbmVlZCB0byBpbnZhbGlkYXRlIGFsbCB0aWxlcyBib3RoIHZp
c2libGUgYW5kIG5vbi12aXNpYmxlIGlmIHdlJ3JlIGxvYWRpbmcuCisgICAgbV9iYWNraW5nU3Rv
cmUtPmQtPnVwZGF0ZVRpbGVzKGlzTG9hZGluZyAvKiB1cGRhdGVWaXNpYmxlICovLCBmYWxzZSAv
KiBpbW1lZGlhdGUgKi8pOworCisgICAgbV9jbGllbnQtPnJlc2V0Qml0bWFwWm9vbVNjYWxlKG1f
dHJhbnNmb3JtYXRpb25NYXRyaXgtPm0xMSgpKTsKKworICAgIGJvb2wgc2hvdWxkUmVuZGVyID0g
IWlzTG9hZGluZyB8fCBtX3VzZXJQZXJmb3JtZWRNYW51YWxab29tIHx8IGZvcmNlUmVuZGVyaW5n
OworICAgIGJvb2wgc2hvdWxkQ2xlYXJWaXNpYmxlWm9vbSA9IGlzTG9hZGluZyAmJiBzaG91bGRS
ZW5kZXI7CisKKyAgICBpZiAoc2hvdWxkQ2xlYXJWaXNpYmxlWm9vbSkgeworICAgICAgICAvLyBJ
ZiB3ZSBhcmUgbG9hZGluZyBhbmQgcmVuZGVyaW5nIHRoZW4gd2UgbmVlZCB0byBjbGVhciB0aGUg
cmVuZGVyIHF1ZXVlJ3MKKyAgICAgICAgLy8gdmlzaWJsZSB6b29tIGpvYnMgYXMgdGhleSB3aWxs
IGJlIGlycmVsZXZhbnQgd2l0aCB0aGUgcmVuZGVyIGJlbG93LgorICAgICAgICBtX2JhY2tpbmdT
dG9yZS0+ZC0+Y2xlYXJWaXNpYmxlWm9vbSgpOworICAgIH0KKworICAgIC8vIENsZWFyIHdpbmRv
dyB0byBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGFydGlmYWN0cy4KKyAgICBpZiAoc2hvdWxkUmVu
ZGVyKSB7CisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5jbGVhcldpbmRvdygpOworICAgICAg
ICAvLyBSZXN1bWUgYWxsIHNjcmVlbiB1cGRhdGVzIHRvIHRoZSBiYWNraW5nc3RvcmUgYW5kIHJl
bmRlcitibGl0IHZpc2libGUgY29udGVudHMgdG8gc2NyZWVuLgorICAgICAgICBtX2JhY2tpbmdT
dG9yZS0+ZC0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6
OlJlbmRlckFuZEJsaXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFJlc3VtZSBhbGwgc2Ny
ZWVuIHVwZGF0ZXMgdG8gdGhlIGJhY2tpbmdzdG9yZSBidXQgZG8gbm90IGJsaXQgdG8gdGhlIHNj
cmVlbiBiZWNhdXNlIHdlIG5vdCByZW5kZXJpbmcuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5k
LT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKEJhY2tpbmdTdG9yZTo6Tm9uZSk7
CisgICAgfQorCisgICAgbV9jbGllbnQtPnpvb21DaGFuZ2VkKG1fd2ViUGFnZS0+aXNNaW5ab29t
ZWQoKSwgbV93ZWJQYWdlLT5pc01heFpvb21lZCgpLCAhc2hvdWxkWm9vbU9uRXNjYXBlKCksIGN1
cnJlbnRTY2FsZSgpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitJbnRQb2ludCBXZWJQYWdl
UHJpdmF0ZTo6Y2FsY3VsYXRlUmVmbG93ZWRTY3JvbGxQb3NpdGlvbihjb25zdCBGbG9hdFBvaW50
JiBhbmNob3JPZmZzZXQsIGRvdWJsZSBpbnZlcnNlU2NhbGUpCit7CisgICAgLy8gU2hvdWxkIG9u
bHkgYmUgaW52b2tlZCB3aGVuIHRleHQgcmVmbG93IGlzIGVuYWJsZWQuCisgICAgQVNTRVJUKG1f
d2ViUGFnZS0+c2V0dGluZ3MoKS0+dGV4dFJlZmxvd01vZGUoKSA9PSBXZWJTZXR0aW5nczo6VGV4
dFJlZmxvd0VuYWJsZWQpOworCisgICAgaW50IG9mZnNldFkgPSAwOworICAgIGludCBvZmZzZXRY
ID0gMDsKKworICAgIEludFJlY3Qgbm9kZVJlY3QgPSByZWN0Rm9yTm9kZShtX2N1cnJlbnRQaW5j
aFpvb21Ob2RlLmdldCgpKTsKKworICAgIGlmIChtX2N1cnJlbnRQaW5jaFpvb21Ob2RlLT5yZW5k
ZXJlcigpICYmIG1fYW5jaG9ySW5Ob2RlUmVjdFJhdGlvLnkoKSA+PSAwKSB7CisgICAgICAgIG9m
ZnNldFkgPSBub2RlUmVjdC5oZWlnaHQoKSAqIG1fYW5jaG9ySW5Ob2RlUmVjdFJhdGlvLnkoKTsK
KyAgICAgICAgaWYgKG1fY3VycmVudFBpbmNoWm9vbU5vZGUtPnJlbmRlcmVyKCktPmlzSW1hZ2Uo
KSAmJiBtX2FuY2hvckluTm9kZVJlY3RSYXRpby54KCkgPiAwKQorICAgICAgICAgICAgb2Zmc2V0
WCA9IG5vZGVSZWN0LndpZHRoKCkgKiBtX2FuY2hvckluTm9kZVJlY3RSYXRpby54KCkgLSBhbmNo
b3JPZmZzZXQueCgpIC8gaW52ZXJzZVNjYWxlOworICAgIH0KKworICAgIEludFJlY3QgcmVmbG93
ZWRSZWN0ID0gYWRqdXN0UmVjdE9mZnNldEZvckZyYW1lT2Zmc2V0KG5vZGVSZWN0LCBtX2N1cnJl
bnRQaW5jaFpvb21Ob2RlLmdldCgpKTsKKworICAgIHJldHVybiBJbnRQb2ludChtYXgoMCwgc3Rh
dGljX2Nhc3Q8aW50Pihyb3VuZGYocmVmbG93ZWRSZWN0LngoKSArIG9mZnNldFgpKSksCisgICAg
ICAgICAgICAgICAgICAgIG1heCgwLCBzdGF0aWNfY2FzdDxpbnQ+KHJvdW5kZihyZWZsb3dlZFJl
Y3QueSgpICsgb2Zmc2V0WSAtIGFuY2hvck9mZnNldC55KCkgLyBpbnZlcnNlU2NhbGUpKSkpOwor
fQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpzY2hlZHVsZVpvb21BYm91dFBvaW50KGRvdWJsZSB1
bmNsYW1wZWRTY2FsZSwgY29uc3QgRmxvYXRQb2ludCYgYW5jaG9yLCBib29sIGVuZm9yY2VTY2Fs
ZUNsYW1waW5nLCBib29sIGZvcmNlUmVuZGVyaW5nKQoreworICAgIGRvdWJsZSBzY2FsZTsKKyAg
ICBpZiAoIXNob3VsZFpvb21BYm91dFBvaW50KHVuY2xhbXBlZFNjYWxlLCBhbmNob3IsIGVuZm9y
Y2VTY2FsZUNsYW1waW5nLCAmc2NhbGUpKSB7CisgICAgICAgIC8vIFdlIGNvdWxkIGJlIGJhY2sg
dG8gdGhlIHJpZ2h0IHpvb20gbGV2ZWwgYmVmb3JlIHRoZSB0aW1lciBoYXMKKyAgICAgICAgLy8g
dGltZWQgb3V0LCBiZWNhdXNlIG9mIHdpZ2dsaW5nIGJhY2sgYW5kIGZvcnRoLiBTdG9wIHRoZSB0
aW1lci4KKyAgICAgICAgdW5zY2hlZHVsZVpvb21BYm91dFBvaW50KCk7CisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBGb3Igc29tZSByZWFzb24sIHRoZSBiaXRtYXAgem9v
bSB3YW50cyBhbiBhbmNob3IgaW4gYmFja2luZ3N0b3JlIGNvb3JkaW5hdGVzIQorICAgIC8vIHRo
aXMgaXMgZGlmZmVyZW50IGZyb20gem9vbUFib3V0UG9pbnQsIHdoaWNoIHdhbnRzIGNvbnRlbnQg
Y29vcmRpbmF0ZXMuCisgICAgLy8gU2VlIFJJTSBCdWcgIzY0MS4KKworICAgIEZsb2F0UG9pbnQg
dHJhbnNmb3JtZWRBbmNob3IgPSBtYXBUb1RyYW5zZm9ybWVkRmxvYXRQb2ludChhbmNob3IpOwor
ICAgIEZsb2F0UG9pbnQgdHJhbnNmb3JtZWRTY3JvbGxQb3NpdGlvbiA9IG1hcFRvVHJhbnNmb3Jt
ZWRGbG9hdFBvaW50KHNjcm9sbFBvc2l0aW9uKCkpOworCisgICAgLy8gUHJvaGliaXQgYmFja2lu
Z3N0b3JlIGZyb20gdXBkYXRpbmcgdGhlIHdpbmRvdyBvdmVydG9wIG9mIHRoZSBiaXRtYXAuCisg
ICAgbV9iYWNraW5nU3RvcmUtPmQtPnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVz
KCk7CisKKyAgICAvLyBOZWVkIHRvIGludmVydCB0aGUgcHJldmlvdXMgdHJhbnNmb3JtIHRvIGFu
Y2hvciB0aGUgdmlld3BvcnQuCisgICAgZG91YmxlIHpvb21GcmFjdGlvbiA9IHNjYWxlIC8gdHJh
bnNmb3JtYXRpb25NYXRyaXgoKS0+bTExKCk7CisKKyAgICAvLyBBbmNob3Igb2Zmc2V0IGZyb20g
c2Nyb2xsIHBvc2l0aW9uIGluIGZsb2F0LgorICAgIEZsb2F0UG9pbnQgYW5jaG9yT2Zmc2V0KHRy
YW5zZm9ybWVkQW5jaG9yLngoKSAtIHRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24ueCgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkQW5jaG9yLnkoKSAtIHRyYW5zZm9y
bWVkU2Nyb2xsUG9zaXRpb24ueSgpKTsKKworICAgIEludFBvaW50IHNyY1BvaW50KAorICAgICAg
ICBzdGF0aWNfY2FzdDxpbnQ+KHJvdW5kZih0cmFuc2Zvcm1lZEFuY2hvci54KCkgLSBhbmNob3JP
ZmZzZXQueCgpIC8gem9vbUZyYWN0aW9uKSksCisgICAgICAgIHN0YXRpY19jYXN0PGludD4ocm91
bmRmKHRyYW5zZm9ybWVkQW5jaG9yLnkoKSAtIGFuY2hvck9mZnNldC55KCkgLyB6b29tRnJhY3Rp
b24pKSk7CisKKyAgICBjb25zdCBJbnRSZWN0IHZpZXdwb3J0UmVjdCA9IEludFJlY3QoSW50UG9p
bnQ6Onplcm8oKSwgdHJhbnNmb3JtZWRWaWV3cG9ydFNpemUoKSk7CisgICAgY29uc3QgSW50UmVj
dCBkc3RSZWN0ID0gdmlld3BvcnRSZWN0OworCisgICAgLy8gVGhpcyBpcyB0aGUgcmVjdCB0byBw
YXNzIGFzIHRoZSBhY3R1YWwgc291cmNlIHJlY3QgaW4gdGhlIGJhY2tpbmdzdG9yZQorICAgIC8v
IGZvciB0aGUgdHJhbnNmb3JtIGdpdmVuIGJ5IHpvb20uCisgICAgSW50UmVjdCBzcmNSZWN0KHNy
Y1BvaW50LngoKSwKKyAgICAgICAgICAgICAgICAgICAgc3JjUG9pbnQueSgpLAorICAgICAgICAg
ICAgICAgICAgICB2aWV3cG9ydFJlY3Qud2lkdGgoKSAvIHpvb21GcmFjdGlvbiwKKyAgICAgICAg
ICAgICAgICAgICAgdmlld3BvcnRSZWN0LmhlaWdodCgpIC8gem9vbUZyYWN0aW9uKTsKKyAgICBt
X2JhY2tpbmdTdG9yZS0+ZC0+YmxpdENvbnRlbnRzKGRzdFJlY3QsIHNyY1JlY3QpOworCisgICAg
bV9kZWxheWVkWm9vbUFyZ3VtZW50cy5zY2FsZSA9IHNjYWxlOworICAgIG1fZGVsYXllZFpvb21B
cmd1bWVudHMuYW5jaG9yID0gYW5jaG9yOworICAgIG1fZGVsYXllZFpvb21Bcmd1bWVudHMuZW5m
b3JjZVNjYWxlQ2xhbXBpbmcgPSBlbmZvcmNlU2NhbGVDbGFtcGluZzsKKyAgICBtX2RlbGF5ZWRa
b29tQXJndW1lbnRzLmZvcmNlUmVuZGVyaW5nID0gZm9yY2VSZW5kZXJpbmc7CisgICAgbV9kZWxh
eWVkWm9vbVRpbWVyLT5zdGFydE9uZVNob3QoZGVsYXllZFpvb21JbnRlcnZhbCk7CisKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6dW5zY2hlZHVsZVpvb21BYm91
dFBvaW50KCkKK3sKKyAgICBpZiAobV9kZWxheWVkWm9vbVRpbWVyLT5pc0FjdGl2ZSgpKQorICAg
ICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRl
cyhCYWNraW5nU3RvcmU6Ok5vbmUpOworCisgICAgbV9kZWxheWVkWm9vbVRpbWVyLT5zdG9wKCk7
Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6Onpvb21BYm91dFBvaW50VGltZXJGaXJlZChUaW1l
cjxXZWJQYWdlUHJpdmF0ZT4qKQoreworICAgIHpvb21BYm91dFBvaW50KG1fZGVsYXllZFpvb21B
cmd1bWVudHMuc2NhbGUsIG1fZGVsYXllZFpvb21Bcmd1bWVudHMuYW5jaG9yLCBtX2RlbGF5ZWRa
b29tQXJndW1lbnRzLmVuZm9yY2VTY2FsZUNsYW1waW5nLCBtX2RlbGF5ZWRab29tQXJndW1lbnRz
LmZvcmNlUmVuZGVyaW5nKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0TmVlZHNMYXlv
dXQoKQoreworICAgIEZyYW1lVmlldyogdmlldyA9IG1fbWFpbkZyYW1lLT52aWV3KCk7CisgICAg
QVNTRVJUKHZpZXcpOworICAgIHZpZXctPnNldE5lZWRzTGF5b3V0KCk7Cit9CisKK3ZvaWQgV2Vi
UGFnZVByaXZhdGU6OnJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpIGNvbnN0Cit7CisgICAgRnJhbWVW
aWV3KiB2aWV3ID0gbV9tYWluRnJhbWUtPnZpZXcoKTsKKyAgICBBU1NFUlQodmlldyk7CisgICAg
dmlldy0+dXBkYXRlTGF5b3V0QW5kU3R5bGVJZk5lZWRlZFJlY3Vyc2l2ZSgpOworICAgIEFTU0VS
VCghdmlldy0+bmVlZHNMYXlvdXQoKSk7Cit9CisKK0ludFBvaW50IFdlYlBhZ2VQcml2YXRlOjpz
Y3JvbGxQb3NpdGlvbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fYmFja2luZ1N0b3JlQ2xpZW50
LT5zY3JvbGxQb3NpdGlvbigpOworfQorCitJbnRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6bWF4aW11
bVNjcm9sbFBvc2l0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9iYWNraW5nU3RvcmVDbGll
bnQtPm1heGltdW1TY3JvbGxQb3NpdGlvbigpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpz
ZXRTY3JvbGxQb3NpdGlvbihjb25zdCBJbnRQb2ludCYgcG9zKQoreworICAgIG1fYmFja2luZ1N0
b3JlQ2xpZW50LT5zZXRTY3JvbGxQb3NpdGlvbihwb3MpOworfQorCitib29sIFdlYlBhZ2VQcml2
YXRlOjpzaG91bGRTZW5kUmVzaXplRXZlbnQoKQoreworICAgIGlmICghbV9tYWluRnJhbWUtPmRv
Y3VtZW50KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFBSIzk2ODY1IDogUHJv
dmlkZSBhbiBvcHRpb24gdG8gYWx3YXlzIHNlbmQgcmVzaXplIGV2ZW50cywgcmVnYXJkbGVzcyBv
ZiB0aGUgbG9hZGluZworICAgIC8vICAgICAgICAgICAgc3RhdHVzLiBUaGUgc2NlbmFyaW8gZm9y
IHRoaXMgYXJlIFNhcHBoaXJlIGFwcGxpY2F0aW9ucyB3aGljaCB0ZW5kIHRvCisgICAgLy8gICAg
ICAgICAgICBtYWludGFpbiBhbiBvcGVuIEdFVCByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIuIFRoaXMg
b3BlbiBHRVQgcmVzdWx0cyBpbgorICAgIC8vICAgICAgICAgICAgd2Via2l0IHRoaW5raW5nIHRo
YXQgY29udGVudCBpcyBzdGlsbCBhcnJpdmluZyB3aGVuIGF0IHRoZSBhcHBsaWNhdGlvbgorICAg
IC8vICAgICAgICAgICAgbGV2ZWwgaXQgaXMgY29uc2lkZXJlZCBmdWxseSBsb2FkZWQuCisgICAg
Ly8KKyAgICAvLyAgICAgICAgICAgIE5PVEU6IENhcmUgbXVzdCBiZSBleGVyY2lzZWQgaW4gdGhl
IHVzZSBvZiB0aGlzIG9wdGlvbiwgYXMgaXQgYnlwYXNzZXMKKyAgICAvLyAgICAgICAgICAgICAg
ICAgIHRoZSBzYW5pdHkgcHJvdmlkZWQgaW4gJ2lzTG9hZGluZ0luQVBJU2Vuc2UoKScgYmVsb3cu
CisgICAgLy8KKyAgICBzdGF0aWMgY29uc3QgYm9vbCB1bnJlc3RyaWN0ZWRSZXNpemVFdmVudHMg
PSBQbGF0Zm9ybTo6U2V0dGluZ3M6OmdldCgpLT51bnJlc3RyaWN0ZWRSZXNpemVFdmVudHMoKTsK
KyAgICBpZiAodW5yZXN0cmljdGVkUmVzaXplRXZlbnRzKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIC8vIERvbid0IHNlbmQgdGhlIHJlc2l6ZSBldmVudCBpZiB0aGUgZG9jdW1lbnQgaXMg
bG9hZGluZy4gU29tZSBwYWdlcyBhdXRvbWF0aWNhbGx5IHJlbG9hZAorICAgIC8vIHdoZW4gdGhl
IHdpbmRvdyBpcyByZXNpemVkOyBTYWZhcmkgb24gaVBob25lIG9mdGVuIHJlc2l6ZXMgdGhlIHdp
bmRvdyB3aGlsZSBzZXR0aW5nIHVwIGl0cworICAgIC8vIHZpZXdwb3J0LiBUaGlzIG9idmlvdXNs
eSBjYW4gY2F1c2UgcHJvYmxlbXMuCisgICAgRG9jdW1lbnRMb2FkZXIqIGRvY3VtZW50TG9hZGVy
ID0gbV9tYWluRnJhbWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigpOworICAgIGlmIChkb2N1
bWVudExvYWRlciAmJiBkb2N1bWVudExvYWRlci0+aXNMb2FkaW5nSW5BUElTZW5zZSgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJQYWdl
UHJpdmF0ZTo6d2lsbERlZmVyTG9hZGluZygpCit7CisgICAgbV9jbGllbnQtPndpbGxEZWZlckxv
YWRpbmcoKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6ZGlkUmVzdW1lTG9hZGluZygpCit7
CisgICAgbV9jbGllbnQtPmRpZFJlc3VtZUxvYWRpbmcoKTsKK30KKworYm9vbCBXZWJQYWdlOjpz
Y3JvbGxCeShjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYgZGVsdGEsIGJvb2wgc2Nyb2xsTWFpbkZy
YW1lKQoreworICAgIGQtPm1fYmFja2luZ1N0b3JlQ2xpZW50LT5zZXRJc0NsaWVudEdlbmVyYXRl
ZFNjcm9sbCh0cnVlKTsKKyAgICBib29sIGIgPSBkLT5zY3JvbGxCeShkZWx0YS53aWR0aCgpLCBk
ZWx0YS5oZWlnaHQoKSwgc2Nyb2xsTWFpbkZyYW1lKTsKKyAgICBkLT5tX2JhY2tpbmdTdG9yZUNs
aWVudC0+c2V0SXNDbGllbnRHZW5lcmF0ZWRTY3JvbGwoZmFsc2UpOworICAgIHJldHVybiBiOwor
fQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpzY3JvbGxCeShpbnQgZGVsdGFYLCBpbnQgZGVsdGFZ
LCBib29sIHNjcm9sbE1haW5GcmFtZSkKK3sKKyAgICBJbnRTaXplIGRlbHRhKGRlbHRhWCwgZGVs
dGFZKTsKKyAgICBpZiAoIXNjcm9sbE1haW5GcmFtZSkgeworICAgICAgICAvLyBXZSBuZWVkIHRv
IHdvcmsgYXJvdW5kIHRoZSBmYWN0IHRoYXQgOjptYXB7VG8sRnJvbX1UcmFuc2Zvcm1lZCBkbyBu
b3QKKyAgICAgICAgLy8gd29yayB3ZWxsIHdpdGggbmVnYXRpdmUgdmFsdWVzLCBsaWtlIGEgbmVn
YXRpdmUgd2lkdGggb3IgaGVpZ2h0IG9mIGFuIEludFNpemUuCisgICAgICAgIEludFNpemUgY29w
aWVkRGVsdGEoSW50U2l6ZShhYnMoZGVsdGEud2lkdGgoKSksIGFicyhkZWx0YS5oZWlnaHQoKSkp
KTsKKyAgICAgICAgSW50U2l6ZSB1bnRyYW5zZm9ybWVkQ29waWVkRGVsdGEgPSBtYXBGcm9tVHJh
bnNmb3JtZWQoY29waWVkRGVsdGEpOworICAgICAgICBkZWx0YSA9IEludFNpemUoCisgICAgICAg
ICAgICBkZWx0YS53aWR0aCgpIDwgMCA/IC11bnRyYW5zZm9ybWVkQ29waWVkRGVsdGEud2lkdGgo
KSA6IHVudHJhbnNmb3JtZWRDb3BpZWREZWx0YS53aWR0aCgpLAorICAgICAgICAgICAgZGVsdGEu
aGVpZ2h0KCkgPCAwID8gLXVudHJhbnNmb3JtZWRDb3BpZWREZWx0YS5oZWlnaHQoKTogdW50cmFu
c2Zvcm1lZENvcGllZERlbHRhLmhlaWdodCgpKTsKKworICAgICAgICBpZiAobV9pblJlZ2lvblNj
cm9sbFN0YXJ0aW5nTm9kZSkgeworICAgICAgICAgICAgaWYgKHNjcm9sbE5vZGVSZWN1cnNpdmVs
eShtX2luUmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2RlLmdldCgpLCBkZWx0YSkpIHsKKyAgICAgICAg
ICAgICAgICBtX3NlbGVjdGlvbkhhbmRsZXItPnNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCgpOwor
ICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBoYXZlIGNvZGUgaW4gcGxhY2UgdG8gaGFuZGxl
IHNjcm9sbGluZyBhbmQgY2xpcHBpbmcgdGFwIGhpZ2hsaWdodAorICAgICAgICAgICAgICAgIC8v
IG9uIGluLXJlZ2lvbiBzY3JvbGxpbmcuIEFzIHNvb24gYXMgaXQgaXMgZmFzdCBlbm91Z2ggKGku
ZS4gd2UgaGF2ZSBpdCBiYWNrZWQgYnkKKyAgICAgICAgICAgICAgICAvLyBhIGJhY2tpbmcgc3Rv
cmUpLCB3ZSBjYW4gcmVsaWFibHkgbWFrZSB1c2Ugb2YgaXQgaW4gdGhlIHJlYWwgd29ybGQuCisg
ICAgICAgICAgICAgICAgLy8gbV90b3VjaEV2ZW50SGFuZGxlci0+ZHJhd1RhcEhpZ2hsaWdodCgp
OworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9
CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNldFNjcm9sbFBvc2l0aW9u
KHNjcm9sbFBvc2l0aW9uKCkgKyBkZWx0YSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQg
V2ViUGFnZTo6bm90aWZ5SW5SZWdpb25TY3JvbGxTdGF0dXNDaGFuZ2VkKGJvb2wgc3RhdHVzKQor
eworICAgIGQtPm5vdGlmeUluUmVnaW9uU2Nyb2xsU3RhdHVzQ2hhbmdlZChzdGF0dXMpOworfQor
Cit2b2lkIFdlYlBhZ2VQcml2YXRlOjpub3RpZnlJblJlZ2lvblNjcm9sbFN0YXR1c0NoYW5nZWQo
Ym9vbCBzdGF0dXMpCit7CisgICAgaWYgKCFzdGF0dXMgJiYgbV9pblJlZ2lvblNjcm9sbFN0YXJ0
aW5nTm9kZSkgeworICAgICAgICBlbnF1ZXVlUmVuZGVyaW5nT2ZDbGlwcGVkQ29udGVudE9mU2Ny
b2xsYWJsZU5vZGVBZnRlckluUmVnaW9uU2Nyb2xsaW5nKG1faW5SZWdpb25TY3JvbGxTdGFydGlu
Z05vZGUuZ2V0KCkpOworICAgICAgICBtX2luUmVnaW9uU2Nyb2xsU3RhcnRpbmdOb2RlID0gMDsK
KyAgICB9Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmVucXVldWVSZW5kZXJpbmdPZkNsaXBw
ZWRDb250ZW50T2ZTY3JvbGxhYmxlTm9kZUFmdGVySW5SZWdpb25TY3JvbGxpbmcoTm9kZSogc2Ny
b2xsZWROb2RlKQoreworICAgIEFTU0VSVChzY3JvbGxlZE5vZGUpOworICAgIGlmIChzY3JvbGxl
ZE5vZGUtPmlzRG9jdW1lbnROb2RlKCkpIHsKKyAgICAgICAgRnJhbWUqIGZyYW1lID0gc3RhdGlj
X2Nhc3Q8Y29uc3QgRG9jdW1lbnQqPihzY3JvbGxlZE5vZGUpLT5mcmFtZSgpOworICAgICAgICBB
U1NFUlQoZnJhbWUpOworICAgICAgICBpZiAoIWZyYW1lKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICBBU1NFUlQoZnJhbWUgIT0gbV9tYWluRnJhbWUpOworICAgICAgICBGcmFtZVZpZXcq
IHZpZXcgPSBmcmFtZS0+dmlldygpOworICAgICAgICBpZiAoIXZpZXcpCisgICAgICAgICAgICBy
ZXR1cm47CisKKyAgICAgICAgLy8gU3RlcHM6CisgICAgICAgIC8vICMxIC0gR2V0IGZyYW1lIHJl
Y3QgaW4gY29udGVudHMgY29vcmRzLgorICAgICAgICAvLyAjMiAtIEdldCB0aGUgY2xpcHBlZCBz
Y3JvbGx2aWV3IHJlY3QgaW4gY29udGVudHMgY29vcmRzLgorICAgICAgICAvLyAjMyAtIFRha2Ug
dHJhbnNmb3JtIGludG8gYWNjb3VudCBmb3IgMSBhbmQgMi4KKyAgICAgICAgLy8gIzQgLSBTdWJ0
cmFjdCAyIGZyb20gMSwgc28gd2Uga25vdyBleGFjdGx5IHdoaWNoIGFyZWFzIG9mIHRoZSBmcmFt
ZQorICAgICAgICAvLyAgICAgIGFyZSBvZmZzY3JlZW4sIGFuZCBuZWVkIGFzeW5jIHJlcGFpbnRp
bmcuCisgICAgICAgIEZyYW1lVmlldyogbWFpbkZyYW1lVmlldyA9IG1fbWFpbkZyYW1lLT52aWV3
KCk7CisgICAgICAgIEFTU0VSVChtYWluRnJhbWVWaWV3KTsKKyAgICAgICAgSW50UmVjdCBmcmFt
ZVJlY3QgPSB2aWV3LT5mcmFtZVJlY3QoKTsKKyAgICAgICAgZnJhbWVSZWN0ID0gZnJhbWUtPnRy
ZWUoKS0+cGFyZW50KCktPnZpZXcoKS0+Y29udGVudHNUb1dpbmRvdyhmcmFtZVJlY3QpOworICAg
ICAgICBmcmFtZVJlY3QgPSBtYWluRnJhbWVWaWV3LT53aW5kb3dUb0NvbnRlbnRzKGZyYW1lUmVj
dCk7CisKKyAgICAgICAgSW50UmVjdCB2aXNpYmxlV2luZG93UmVjdCA9IGdldFJlY3Vyc2l2ZVZp
c2libGVXaW5kb3dSZWN0KHZpZXcpOworICAgICAgICBJbnRSZWN0IHZpc2libGVDb250ZW50c1Jl
Y3QgPSBtYWluRnJhbWVWaWV3LT53aW5kb3dUb0NvbnRlbnRzKHZpc2libGVXaW5kb3dSZWN0KTsK
KworICAgICAgICBJbnRSZWN0IHRyYW5zZm9ybWVkRnJhbWVSZWN0ID0gbWFwVG9UcmFuc2Zvcm1l
ZChmcmFtZVJlY3QpOworICAgICAgICBJbnRSZWN0IHRyYW5zZm9ybWVkVmlzaWJsZUNvbnRlbnRz
UmVjdCA9IG1hcFRvVHJhbnNmb3JtZWQodmlzaWJsZUNvbnRlbnRzUmVjdCk7CisKKyAgICAgICAg
UGxhdGZvcm06OkludFJlY3RSZWdpb24gb2Zmc2NyZWVuUmVnaW9uT2ZJZnJhbWUKKyAgICAgICAg
ICAgID0gUGxhdGZvcm06OkludFJlY3RSZWdpb246OnN1YnRyYWN0UmVnaW9ucyhQbGF0Zm9ybTo6
SW50UmVjdCh0cmFuc2Zvcm1lZEZyYW1lUmVjdCksIFBsYXRmb3JtOjpJbnRSZWN0KHRyYW5zZm9y
bWVkVmlzaWJsZUNvbnRlbnRzUmVjdCkpOworCisgICAgICAgIGlmICghb2Zmc2NyZWVuUmVnaW9u
T2ZJZnJhbWUuaXNFbXB0eSgpKQorICAgICAgICAgICAgbV9iYWNraW5nU3RvcmUtPmQtPm1fcmVu
ZGVyUXVldWUtPmFkZFRvUXVldWUoUmVuZGVyUXVldWU6OlJlZ3VsYXJSZW5kZXIsIG9mZnNjcmVl
blJlZ2lvbk9mSWZyYW1lLnJlY3RzKCkpOworICAgIH0KK30KKwordm9pZCBXZWJQYWdlUHJpdmF0
ZTo6c2V0SGFzSW5SZWdpb25TY3JvbGxhYmxlQXJlYXMoYm9vbCBiKQoreworICAgIGlmIChiICE9
IG1faGFzSW5SZWdpb25TY3JvbGxhYmxlQXJlYXMpCisgICAgICAgIG1faGFzSW5SZWdpb25TY3Jv
bGxhYmxlQXJlYXMgPSBiOworfQorCitJbnRTaXplIFdlYlBhZ2VQcml2YXRlOjp2aWV3cG9ydFNp
emUoKSBjb25zdAoreworICAgIHJldHVybiBtYXBGcm9tVHJhbnNmb3JtZWQodHJhbnNmb3JtZWRW
aWV3cG9ydFNpemUoKSk7Cit9CisKK0ludFNpemUgV2ViUGFnZVByaXZhdGU6OmFjdHVhbFZpc2li
bGVTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbWFwRnJvbVRyYW5zZm9ybWVkKHRyYW5zZm9y
bWVkQWN0dWFsVmlzaWJsZVNpemUoKSk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6Omhhc1Zp
cnR1YWxWaWV3cG9ydCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdmlydHVhbFZpZXdwb3J0V2lk
dGggJiYgbV92aXJ0dWFsVmlld3BvcnRIZWlnaHQ7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6
OnVwZGF0ZVZpZXdwb3J0U2l6ZShib29sIHNldEZpeGVkUmVwb3J0ZWRTaXplLCBib29sIHNlbmRS
ZXNpemVFdmVudCkKK3sKKyAgICBBU1NFUlQobV9tYWluRnJhbWUtPnZpZXcoKSk7CisgICAgaWYg
KHNldEZpeGVkUmVwb3J0ZWRTaXplKQorICAgICAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXRG
aXhlZFJlcG9ydGVkU2l6ZShhY3R1YWxWaXNpYmxlU2l6ZSgpKTsKKworICAgIEludFJlY3QgZnJh
bWVSZWN0ID0gSW50UmVjdChzY3JvbGxQb3NpdGlvbigpLCB2aWV3cG9ydFNpemUoKSk7CisgICAg
aWYgKGZyYW1lUmVjdCAhPSBtX21haW5GcmFtZS0+dmlldygpLT5mcmFtZVJlY3QoKSkgeworICAg
ICAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXRGcmFtZVJlY3QoZnJhbWVSZWN0KTsKKyAgICAg
ICAgbV9tYWluRnJhbWUtPnZpZXcoKS0+YWRqdXN0Vmlld1NpemUoKTsKKyAgICB9CisKKyAgICAv
LyBXZSdyZSBnb2luZyB0byBuZWVkIHRvIHNlbmQgYSByZXNpemUgZXZlbnQgdG8gSmF2YVNjcmlw
dCBiZWNhdXNlCisgICAgLy8gaW5uZXJXaWR0aCBhbmQgaW5uZXJIZWlnaHQgZGVwZW5kIG9uIGZp
eGVkIHJlcG9ydGVkIHNpemUuCisgICAgLy8gVGhpcyBpcyBob3cgd2Ugc3VwcG9ydCBtb2JpbGUg
cGFnZXMgd2hlcmUgSmF2YVNjcmlwdCByZXNpemVzCisgICAgLy8gdGhlIHBhZ2UgaW4gb3JkZXIg
dG8gZ2V0IGFyb3VuZCB0aGUgZml4ZWQgbGF5b3V0IHNpemUsIGUuZy4KKyAgICAvLyBnb29nbGUg
bWFwcyB3aGVuIGl0IGRldGVjdHMgYSBtb2JpbGUgdXNlciBhZ2VudC4KKyAgICBpZiAoc2VuZFJl
c2l6ZUV2ZW50ICYmIHNob3VsZFNlbmRSZXNpemVFdmVudCgpKQorICAgICAgICBtX21haW5GcmFt
ZS0+ZXZlbnRIYW5kbGVyKCktPnNlbmRSZXNpemVFdmVudCgpOworCisgICAgLy8gV2hlbiB0aGUg
YWN0dWFsIHZpc2libGUgc2l6ZSBjaGFuZ2VzLCB3ZSBhbHNvCisgICAgLy8gbmVlZCB0byByZXBv
c2l0aW9uIGZpeGVkIGVsZW1lbnRzLgorICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPnJlcGFpbnRG
aXhlZEVsZW1lbnRzQWZ0ZXJTY3JvbGxpbmcoKTsKK30KKworRmxvYXRQb2ludCBXZWJQYWdlUHJp
dmF0ZTo6Y2VudGVyT2ZWaXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3QKK3sKKyAgICAvLyBUaGUg
dmlzaWJsZSBjb250ZW50cyByZWN0IGluIGZsb2F0LgorICAgIEZsb2F0UmVjdCB2aXNpYmxlQ29u
dGVudHNSZWN0ID0gdGhpcy0+dmlzaWJsZUNvbnRlbnRzUmVjdCgpOworCisgICAgLy8gVGhlIGNl
bnRlciBvZiB0aGUgdmlzaWJsZSBjb250ZW50cyByZWN0IGluIGZsb2F0LgorICAgIHJldHVybiBG
bG9hdFBvaW50KHZpc2libGVDb250ZW50c1JlY3QueCgpICsgdmlzaWJsZUNvbnRlbnRzUmVjdC53
aWR0aCgpIC8gMi4wLAorICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVDb250ZW50c1JlY3Qu
eSgpICsgdmlzaWJsZUNvbnRlbnRzUmVjdC5oZWlnaHQoKSAvIDIuMCk7Cit9CisKK0ludFJlY3Qg
V2ViUGFnZVByaXZhdGU6OnZpc2libGVDb250ZW50c1JlY3QoKSBjb25zdAoreworICAgIHJldHVy
biBtX2JhY2tpbmdTdG9yZUNsaWVudC0+dmlzaWJsZUNvbnRlbnRzUmVjdCgpOworfQorCitJbnRT
aXplIFdlYlBhZ2VQcml2YXRlOjpjb250ZW50c1NpemUoKSBjb25zdAoreworICAgIGlmICghbV9t
YWluRnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJuIEludFNpemUoKTsKKworICAgIHJldHVy
biBtX2JhY2tpbmdTdG9yZUNsaWVudC0+Y29udGVudHNTaXplKCk7Cit9CisKK0ludFNpemUgV2Vi
UGFnZVByaXZhdGU6OmFic29sdXRlVmlzaWJsZU92ZXJmbG93U2l6ZSgpIGNvbnN0Cit7CisgICAg
aWYgKCFtX21haW5GcmFtZS0+Y29udGVudFJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybiBJbnRT
aXplKCk7CisKKyAgICByZXR1cm4gSW50U2l6ZShtX21haW5GcmFtZS0+Y29udGVudFJlbmRlcmVy
KCktPnJpZ2h0QWJzb2x1dGVWaXNpYmxlT3ZlcmZsb3coKSwgbV9tYWluRnJhbWUtPmNvbnRlbnRS
ZW5kZXJlcigpLT5ib3R0b21BYnNvbHV0ZVZpc2libGVPdmVyZmxvdygpKTsKK30KKwordm9pZCBX
ZWJQYWdlUHJpdmF0ZTo6Y29udGVudHNTaXplQ2hhbmdlZChjb25zdCBJbnRTaXplJiBjb250ZW50
c1NpemUpCit7CisgICAgaWYgKG1fcHJldmlvdXNDb250ZW50c1NpemUgPT0gY29udGVudHNTaXpl
KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBUaGlzIHNob3VsZCBvbmx5IG9jY3VyIGluIHRo
ZSBtaWRkbGUgb2YgbGF5b3V0IHNvIHdlIHNldCBhIGZsYWcgaGVyZSBhbmQKKyAgICAvLyBoYW5k
bGUgaXQgYXQgdGhlIGVuZCBvZiB0aGUgbGF5b3V0LgorICAgIG1fY29udGVudHNTaXplQ2hhbmdl
ZCA9IHRydWU7CisKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICBQbGF0Zm9ybTo6bG9nKFBs
YXRmb3JtOjpMb2dMZXZlbEluZm8sICJXZWJQYWdlUHJpdmF0ZTo6Y29udGVudHNTaXplQ2hhbmdl
ZCAlZHglZCIsIGNvbnRlbnRzU2l6ZS53aWR0aCgpLCBjb250ZW50c1NpemUuaGVpZ2h0KCkpOwor
I2VuZGlmCit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmxheW91dEZpbmlzaGVkKCkKK3sKKyAg
ICBpZiAoIW1fY29udGVudHNTaXplQ2hhbmdlZCAmJiAhbV9vdmVyZmxvd0V4Y2VlZHNDb250ZW50
c1NpemUpCisgICAgICAgIHJldHVybjsKKworICAgIG1fY29udGVudHNTaXplQ2hhbmdlZCA9IGZh
bHNlOyAvLyBUb2dnbGUgdG8gdHVybiBvZmYgbm90aWZpY2F0aW9uIGFnYWluLgorICAgIG1fb3Zl
cmZsb3dFeGNlZWRzQ29udGVudHNTaXplID0gZmFsc2U7CisKKyAgICBpZiAoY29udGVudHNTaXpl
KCkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBUaGUgY2FsbCB0byB6b29t
VG9Jbml0aWFsU2NhbGVPbkxvYWQgY2FuIGNhdXNlIHJlY3Vyc2l2ZSBsYXlvdXQgd2hlbiBjYWxs
ZWQgZnJvbQorICAgIC8vIHRoZSBtaWRkbGUgb2YgYSBsYXlvdXQsIGJ1dCB0aGUgcmVjdXJzaW9u
IGlzIGxpbWl0ZWQgYnkgZGV0ZWN0aW9uIGNvZGUgaW4KKyAgICAvLyBzZXRWaWV3TW9kZSgpIGFu
ZCBtaXRpZ2F0aW9uIGNvZGUgaW4gZml4ZWRMYXlvdXRTaXplKCkuCisgICAgaWYgKGRpZExheW91
dEV4Y2VlZE1heGltdW1JdGVyYXRpb25zKCkpIHsKKyAgICAgICAgbm90aWZ5VHJhbnNmb3JtZWRD
b250ZW50c1NpemVDaGFuZ2VkKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBU
ZW1wb3JhcmlseSBzYXZlIHRoZSBtX3ByZXZpb3VzQ29udGVudHNTaXplIGhlcmUgYmVmb3JlIHVw
ZGF0aW5nIGl0IChpbgorICAgIC8vIG5vdGlmeVRyYW5zZm9ybWVkQ29udGVudHNTaXplQ2hhbmdl
ZCgpKSBzbyB3ZSBjYW4gY29tcGFyZSBpZiBvdXIgY29udGVudHMKKyAgICAvLyBzaHJ1bmsgYWZ0
ZXJ3YXJkcy4KKyAgICBJbnRTaXplIHByZXZpb3VzQ29udGVudHNTaXplID0gbV9wcmV2aW91c0Nv
bnRlbnRzU2l6ZTsKKworICAgIG1fbmVzdGVkTGF5b3V0RmluaXNoZWRDb3VudCsrOworCisgICAg
aWYgKGxvYWRTdGF0ZSgpID09IENvbW1pdHRlZCkKKyAgICAgICAgem9vbVRvSW5pdGlhbFNjYWxl
T25Mb2FkKCk7CisgICAgZWxzZSBpZiAobG9hZFN0YXRlKCkgIT0gTm9uZSkKKyAgICAgICAgbm90
aWZ5VHJhbnNmb3JtZWRDb250ZW50c1NpemVDaGFuZ2VkKCk7CisKKyAgICBtX25lc3RlZExheW91
dEZpbmlzaGVkQ291bnQtLTsKKworICAgIGlmICghbV9uZXN0ZWRMYXlvdXRGaW5pc2hlZENvdW50
KSB7CisgICAgICAgIC8vIFdoZW4gdGhlIGNvbnRlbnRzIHNocmlua3MsIHRoZXJlIGlzIGEgcmlz
ayB0aGF0IHdlCisgICAgICAgIC8vIHdpbGwgYmUgbGVmdCBhdCBhIHNjcm9sbCBwb3NpdGlvbiB0
aGF0IGxpZXMgb3V0c2lkZSBvZiB0aGUKKyAgICAgICAgLy8gY29udGVudHMgcmVjdC4gU2luY2Ug
d2UgYWxsb3cgb3ZlcnNjcm9sbGluZyBhbmQgbmVnbGVjdAorICAgICAgICAvLyB0byBjbGFtcCBv
dmVyc2Nyb2xsIGluIG9yZGVyIHRvIHJldGFpbiBpbnB1dCBmb2N1cyAoUklNIEJ1ZyAjNDE0KQor
ICAgICAgICAvLyB3ZSBuZWVkIHRvIGNsYW1wIHNvbWV3aGVyZSwgYW5kIHRoaXMgaXMgd2hlcmUg
d2Uga25vdyB0aGUKKyAgICAgICAgLy8gY29udGVudHMgc2l6ZSBoYXMgY2hhbmdlZC4KKworICAg
ICAgICBpZiAoY29udGVudHNTaXplKCkgIT0gcHJldmlvdXNDb250ZW50c1NpemUpIHsKKworICAg
ICAgICAgICAgSW50UG9pbnQgbmV3U2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbigpOwor
CisgICAgICAgICAgICBpZiAoY29udGVudHNTaXplKCkuaGVpZ2h0KCkgPCBwcmV2aW91c0NvbnRl
bnRzU2l6ZS5oZWlnaHQoKSkgeworICAgICAgICAgICAgICAgIEludFBvaW50IHNjcm9sbFBvc2l0
aW9uV2l0aEhlaWdodFNocnVuayA9IEludFBvaW50KG5ld1Njcm9sbFBvc2l0aW9uLngoKSwgbWF4
aW11bVNjcm9sbFBvc2l0aW9uKCkueSgpKTsKKyAgICAgICAgICAgICAgICBuZXdTY3JvbGxQb3Np
dGlvbiA9IG5ld1Njcm9sbFBvc2l0aW9uLnNocnVua1RvKHNjcm9sbFBvc2l0aW9uV2l0aEhlaWdo
dFNocnVuayk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb250ZW50c1NpemUo
KS53aWR0aCgpIDwgcHJldmlvdXNDb250ZW50c1NpemUud2lkdGgoKSkgeworICAgICAgICAgICAg
ICAgIEludFBvaW50IHNjcm9sbFBvc2l0aW9uV2l0aFdpZHRoU2hydW5rID0gSW50UG9pbnQobWF4
aW11bVNjcm9sbFBvc2l0aW9uKCkueCgpLCBuZXdTY3JvbGxQb3NpdGlvbi55KCkpOworICAgICAg
ICAgICAgICAgIG5ld1Njcm9sbFBvc2l0aW9uID0gbmV3U2Nyb2xsUG9zaXRpb24uc2hydW5rVG8o
c2Nyb2xsUG9zaXRpb25XaXRoV2lkdGhTaHJ1bmspOworICAgICAgICAgICAgfQorCisgICAgICAg
ICAgICBpZiAobmV3U2Nyb2xsUG9zaXRpb24gIT0gc2Nyb2xsUG9zaXRpb24oKSkgeworICAgICAg
ICAgICAgICAgIHNldFNjcm9sbFBvc2l0aW9uKG5ld1Njcm9sbFBvc2l0aW9uKTsKKyAgICAgICAg
ICAgICAgICBub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQoKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6em9vbVRvSW5pdGlh
bFNjYWxlT25Mb2FkKCkKK3sKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICBQbGF0Zm9ybTo6
bG9nKFBsYXRmb3JtOjpMb2dMZXZlbEluZm8sICJXZWJQYWdlUHJpdmF0ZTo6em9vbVRvSW5pdGlh
bFNjYWxlT25Mb2FkIik7CisjZW5kaWYKKworICAgIGJvb2wgbmVlZHNMYXlvdXQgPSBmYWxzZTsK
KworICAgIC8vIElmIHRoZSBjb250ZW50cyB3aWR0aCBleGNlZWRzIHRoZSB2aWV3cG9ydCB3aWR0
aCBzZXQgdG8gZGVza3RvcCBtb2RlLgorICAgIGlmIChtX3Nob3VsZFVzZUZpeGVkRGVza3RvcE1v
ZGUpCisgICAgICAgIG5lZWRzTGF5b3V0ID0gc2V0Vmlld01vZGUoRml4ZWREZXNrdG9wKTsKKyAg
ICBlbHNlCisgICAgICAgIG5lZWRzTGF5b3V0ID0gc2V0Vmlld01vZGUoRGVza3RvcCk7CisKKyAg
ICBpZiAobmVlZHNMYXlvdXQpIHsKKyAgICAgICAgLy8gVGhpcyBjYW4gY2F1c2UgcmVjdXJzaXZl
IGxheW91dC4uLgorICAgICAgICBzZXROZWVkc0xheW91dCgpOworICAgIH0KKworICAgIGlmIChj
b250ZW50c1NpemUoKS5pc0VtcHR5KCkpIHsKKyNpZiBERUJVR19XRUJQQUdFX0xPQUQKKyAgICAg
ICAgUGxhdGZvcm06OmxvZyhQbGF0Zm9ybTo6TG9nTGV2ZWxJbmZvLCAiV2ViUGFnZVByaXZhdGU6
Onpvb21Ub0luaXRpYWxTY2FsZU9uTG9hZCBjb250ZW50IGlzIGVtcHR5ISIpOworI2VuZGlmCisg
ICAgICAgIHJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpOworICAgICAgICBtX2NsaWVudC0+cmVzZXRC
aXRtYXBab29tU2NhbGUoY3VycmVudFNjYWxlKCkpOworICAgICAgICBub3RpZnlUcmFuc2Zvcm1l
ZENvbnRlbnRzU2l6ZUNoYW5nZWQoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJv
b2wgcGVyZm9ybWVkWm9vbSA9IGZhbHNlOworICAgIGJvb2wgc2hvdWxkWm9vbSA9ICFtX3VzZXJQ
ZXJmb3JtZWRNYW51YWxab29tOworCisgICAgLy8gSWYgdGhpcyBsb2FkIHNob3VsZCByZXN0b3Jl
IHZpZXcgc3RhdGUsIGRvbid0IHpvb20gdG8gaW5pdGlhbCBzY2FsZQorICAgIC8vIGJ1dCBpbnN0
ZWFkIGxldCB0aGUgSGlzdG9yeUl0ZW0ncyBzYXZlZCB2aWV3cG9ydCByZWlnbiBzdXByZW1lLgor
ICAgIGlmIChtX21haW5GcmFtZSAmJiBtX21haW5GcmFtZS0+bG9hZGVyKCkgJiYgbV9tYWluRnJh
bWUtPmxvYWRlcigpLT5zaG91bGRSZXN0b3JlU2Nyb2xsUG9zaXRpb25BbmRWaWV3U3RhdGUoKSkK
KyAgICAgICAgc2hvdWxkWm9vbSA9IGZhbHNlOworCisgICAgaWYgKHNob3VsZFpvb20gJiYgbG9h
ZFN0YXRlKCkgPT0gQ29tbWl0dGVkKSB7CisgICAgICAgIC8vIFByZXNlcnZlIGF0IHRvcCBhbmQg
YXQgbGVmdCBwb3NpdGlvbiwgdG8gYXZvaWQgc2Nyb2xsaW5nCisgICAgICAgIC8vIHRvIGEgbm9u
IHRvcC1sZWZ0IHBvc2l0aW9uIGZvciB3ZWIgcGFnZSB3aXRoIHZpZXdwb3J0IG1ldGEgdGFnCisg
ICAgICAgIC8vIHRoYXQgc3BlY2lmaWVzIGFuIGluaXRpYWwtc2NhbGUgdGhhdCBpcyB6b29tZWQg
aW4uCisgICAgICAgIEZsb2F0UG9pbnQgYW5jaG9yID0gY2VudGVyT2ZWaXNpYmxlQ29udGVudHNS
ZWN0KCk7CisgICAgICAgIGlmICghc2Nyb2xsUG9zaXRpb24oKS54KCkpCisgICAgICAgICAgICBh
bmNob3Iuc2V0WCgwKTsKKyAgICAgICAgaWYgKCFzY3JvbGxQb3NpdGlvbigpLnkoKSkKKyAgICAg
ICAgICAgIGFuY2hvci5zZXRZKDApOworICAgICAgICBwZXJmb3JtZWRab29tID0gem9vbUFib3V0
UG9pbnQoaW5pdGlhbFNjYWxlKCksIGFuY2hvcik7CisgICAgfQorCisgICAgLy8gem9vbUFib3V0
UG9pbnQgYWJvdmUgY2FuIGFsc28gdG9nZ2xlIHNldE5lZWRzTGF5b3V0IGFuZCBjYXVzZSByZWN1
cnNpdmUgbGF5b3V0Li4uCisgICAgcmVxdWVzdExheW91dElmTmVlZGVkKCk7CisKKyAgICBpZiAo
IXBlcmZvcm1lZFpvb20pIHsKKyAgICAgICAgLy8gV2Ugb25seSBub3RpZnkgaWYgd2UgZGlkbid0
IHBlcmZvcm0gem9vbSwgYmVjYXVzZSB6b29tIHdpbGwgbm90aWZ5IG9uCisgICAgICAgIC8vIGl0
cyBvd24uLi4KKyAgICAgICAgbV9jbGllbnQtPnJlc2V0Qml0bWFwWm9vbVNjYWxlKGN1cnJlbnRT
Y2FsZSgpKTsKKyAgICAgICAgbm90aWZ5VHJhbnNmb3JtZWRDb250ZW50c1NpemVDaGFuZ2VkKCk7
CisgICAgfQorfQorCitkb3VibGUgV2ViUGFnZVByaXZhdGU6Onpvb21Ub0ZpdFNjYWxlKCkgY29u
c3QKK3sKKyAgICAvLyBXZSBtdXN0IGNsYW1wIHRoZSBjb250ZW50cyBmb3IgdGhpcyBjYWxjdWxh
dGlvbiBzbyB0aGF0IHdlIGRvIG5vdCBhbGxvdyBhbgorICAgIC8vIGFyYml0cmFyaWx5IHNtYWxs
IHpvb21Ub0ZpdFNjYWxlIG11Y2ggbGlrZSB3ZSBjbGFtcCB0aGUgZml4ZWRMYXlvdXRTaXplKCkK
KyAgICAvLyBzbyB0aGF0IHdlIGRvIG5vdCBoYXZlIGFyYml0cmFyaWx5IGxhcmdlIGxheW91dCBz
aXplLgorICAgIC8vIElmIHdlIGhhdmUgYSBzcGVjaWZpZWQgdmlld3BvcnQsIHdlIG1heSBuZWVk
IHRvIGJlIGFibGUgdG8gem9vbSBvdXQgbW9yZS4KKyAgICBpbnQgY29udGVudFdpZHRoID0gc3Rk
OjptaW4oY29udGVudHNTaXplKCkud2lkdGgoKSwgc3RkOjptYXgobV92aXJ0dWFsVmlld3BvcnRX
aWR0aCwgc3RhdGljX2Nhc3Q8aW50PihkZWZhdWx0TWF4TGF5b3V0U2l6ZSgpLndpZHRoKCkpKSk7
CisKKyAgICAvLyBkZWZhdWx0TWF4TGF5b3V0U2l6ZSgpLndpZHRoKCkgaXMgYSBzYWZlZ3VhcmQg
Zm9yIGV4Y2Vzc2l2ZWx5IGxhcmdlIHBhZ2UgbGF5b3V0cyB0aGF0CisgICAgLy8gaXMgdG9vIHJl
c3RyaWN0aXZlIGZvciBpbWFnZSBkb2N1bWVudHMuIEluIHRoaXMgY2FzZSwgdGhlIGRvY3VtZW50
IHdpZHRoIGlzIHN1ZmZpY2llbnQuCisgICAgRG9jdW1lbnQqIGRvYyA9IG1fcGFnZS0+bWFpbkZy
YW1lKCktPmRvY3VtZW50KCk7CisgICAgaWYgKGRvYyAmJiBkb2MtPmlzSW1hZ2VEb2N1bWVudCgp
KQorICAgICAgIGNvbnRlbnRXaWR0aCA9IGNvbnRlbnRzU2l6ZSgpLndpZHRoKCk7CisKKyAgICAv
LyBJZiB3ZSBoYXZlIGEgdmlydHVhbCB2aWV3cG9ydCBhbmQgaXRzIGFzcGVjdCByYXRpbyBjYXVz
ZWQgY29udGVudCB0byBsYXlvdXQKKyAgICAvLyB3aWRlciB0aGFuIHRoZSBkZWZhdWx0IGxheW91
dCBhc3BlY3QgcmF0aW8gd2UgbmVlZCB0byB6b29tIHRvIGZpdCB0aGUgY29udGVudCBoZWlnaHQK
KyAgICAvLyBpbiBvcmRlciB0byBhdm9pZCBzaG93aW5nIGEgZ3JleSBhcmVhIGJlbG93IHRoZSB3
ZWIgcGFnZS4KKyAgICAvLyBXaXRob3V0IHZpcnR1YWwgdmlld3BvcnQgd2UgY2FuIG5ldmVyIGdl
dCBpbnRvIHRoaXMgc2l0dWF0aW9uLgorICAgIGlmIChoYXNWaXJ0dWFsVmlld3BvcnQoKSkgewor
ICAgICAgICBpbnQgY29udGVudEhlaWdodCA9IHN0ZDo6bWluKGNvbnRlbnRzU2l6ZSgpLmhlaWdo
dCgpLCBzdGQ6Om1heChtX3ZpcnR1YWxWaWV3cG9ydEhlaWdodCwgc3RhdGljX2Nhc3Q8aW50Pihk
ZWZhdWx0TWF4TGF5b3V0U2l6ZSgpLmhlaWdodCgpKSkpOworCisgICAgICAgIC8vIEFzcGVjdCBy
YXRpbyBjaGVjayB3aXRob3V0IGRpdmlzaW9uLgorICAgICAgICBpZiAoY29udGVudFdpZHRoICog
bV9kZWZhdWx0TGF5b3V0U2l6ZS5oZWlnaHQoKSA+IGNvbnRlbnRIZWlnaHQgKiBtX2RlZmF1bHRM
YXlvdXRTaXplLndpZHRoKCkpCisgICAgICAgICAgICByZXR1cm4gY29udGVudEhlaWdodCA+IDAg
PyBzdGF0aWNfY2FzdDxkb3VibGU+KG1fZGVmYXVsdExheW91dFNpemUuaGVpZ2h0KCkpIC8gY29u
dGVudEhlaWdodCA6IDEuMDsKKyAgICB9CisKKyAgICByZXR1cm4gY29udGVudFdpZHRoID4gMC4w
ID8gc3RhdGljX2Nhc3Q8ZG91YmxlPihtX2FjdHVhbFZpc2libGVXaWR0aCkgLyBjb250ZW50V2lk
dGggOiAxLjA7Cit9CisKK2RvdWJsZSBXZWJQYWdlUHJpdmF0ZTo6aW5pdGlhbFNjYWxlKCkgY29u
c3QKK3sKKyAgICBpZiAobV9pbml0aWFsU2NhbGUgPiAwLjApCisgICAgICAgIHJldHVybiBtX2lu
aXRpYWxTY2FsZTsKKworICAgIGlmIChtX3dlYlNldHRpbmdzLT5pc1pvb21Ub0ZpdE9uTG9hZCgp
KQorICAgICAgICByZXR1cm4gem9vbVRvRml0U2NhbGUoKTsKKworICAgIHJldHVybiAxLjA7Cit9
CisKK3ZvaWQgV2ViUGFnZTo6aW5pdGlhbGl6ZUljb25EYXRhQmFzZSgpCit7CisgICAgSWNvbkRh
dGFiYXNlQ2xpZW50QmxhY2tCZXJyeTo6Z2V0SW5zdGFuY2UoKS0+aW5pdEljb25EYXRhYmFzZShk
LT5tX3dlYlNldHRpbmdzKTsKK30KKworYm9vbCBXZWJQYWdlOjppc1VzZXJTY2FsYWJsZSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGQtPmlzVXNlclNjYWxhYmxlKCk7Cit9CisKK2RvdWJsZSBXZWJQ
YWdlOjpjdXJyZW50U2NhbGUoKSBjb25zdAoreworICAgIHJldHVybiBkLT5jdXJyZW50U2NhbGUo
KTsKK30KKworZG91YmxlIFdlYlBhZ2U6OmluaXRpYWxTY2FsZSgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIGQtPmluaXRpYWxTY2FsZSgpOworfQorCitkb3VibGUgV2ViUGFnZTo6em9vbVRvRml0U2Nh
bGUoKSBjb25zdAoreworICAgIHJldHVybiBkLT56b29tVG9GaXRTY2FsZSgpOworfQorCit2b2lk
IFdlYlBhZ2U6OnNldEluaXRpYWxTY2FsZShkb3VibGUgaW5pdGlhbFNjYWxlKQoreworICAgIGQt
PnNldEluaXRpYWxTY2FsZShpbml0aWFsU2NhbGUpOworfQorCitkb3VibGUgV2ViUGFnZTo6bWlu
aW11bVNjYWxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+bWluaW11bVNjYWxlKCk7Cit9CisK
K3ZvaWQgV2ViUGFnZTo6c2V0TWluaW11bVNjYWxlKGRvdWJsZSBtaW5pbXVtU2NhbGUpCit7Cisg
ICAgZC0+c2V0TWluaW11bVNjYWxlKG1pbmltdW1TY2FsZSk7Cit9CisKK2RvdWJsZSBXZWJQYWdl
OjptYXhpbXVtU2NhbGUoKSBjb25zdAoreworICAgIHJldHVybiBkLT5tYXhpbXVtU2NhbGUoKTsK
K30KKwordm9pZCBXZWJQYWdlOjpzZXRNYXhpbXVtU2NhbGUoZG91YmxlIG1heGltdW1TY2FsZSkK
K3sKKyAgICBkLT5zZXRNYXhpbXVtU2NhbGUobWF4aW11bVNjYWxlKTsKK30KKworZG91YmxlIFdl
YlBhZ2VQcml2YXRlOjptYXhpbXVtU2NhbGUoKSBjb25zdAoreworICAgIGlmIChtX21heGltdW1T
Y2FsZSA+PSB6b29tVG9GaXRTY2FsZSgpICYmIG1fbWF4aW11bVNjYWxlID49IG1fbWluaW11bVNj
YWxlKQorICAgICAgICByZXR1cm4gbV9tYXhpbXVtU2NhbGU7CisKKyAgICByZXR1cm4gaGFzVmly
dHVhbFZpZXdwb3J0KCkgPyBzdGQ6Om1heDxkb3VibGU+KHpvb21Ub0ZpdFNjYWxlKCksIDQuMCkg
OiA0LjA7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnJlc2V0U2NhbGVzKCkKK3sKKyAgICBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCBpZGVudGl0eTsKKyAgICAqbV90cmFuc2Zvcm1hdGlvbk1hdHJp
eCA9IGlkZW50aXR5OworICAgIG1faW5pdGlhbFNjYWxlID0gbV93ZWJTZXR0aW5ncy0+aW5pdGlh
bFNjYWxlKCkgPiAwID8gbV93ZWJTZXR0aW5ncy0+aW5pdGlhbFNjYWxlKCkgOiAtMS4wOworICAg
IG1fbWluaW11bVNjYWxlID0gLTEuMDsKKyAgICBtX21heGltdW1TY2FsZSA9IC0xLjA7CisKKyAg
ICAvLyBXZSBoYXZlIHRvIGxldCBXZWJDb3JlIGtub3cgYWJvdXQgdXBkYXRlZCBmcmFtZXJlY3Qg
bm93IHRoYXQgd2UndmUKKyAgICAvLyByZXNldCBvdXIgc2NhbGVzLiBTZWU6IFJJTSBCdWcgIzQw
MS4KKyAgICB1cGRhdGVWaWV3cG9ydFNpemUoKTsKK30KKworSW50UG9pbnQgV2ViUGFnZVByaXZh
dGU6OnRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBtX2Jh
Y2tpbmdTdG9yZUNsaWVudC0+dHJhbnNmb3JtZWRTY3JvbGxQb3NpdGlvbigpOworfQorCitJbnRQ
b2ludCBXZWJQYWdlUHJpdmF0ZTo6dHJhbnNmb3JtZWRNYXhpbXVtU2Nyb2xsUG9zaXRpb24oKSBj
b25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNsaWVudC0+dHJhbnNmb3JtZWRNYXhp
bXVtU2Nyb2xsUG9zaXRpb24oKTsKK30KKworSW50U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6dHJhbnNm
b3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIEludFNpemUobV9h
Y3R1YWxWaXNpYmxlV2lkdGgsIG1fYWN0dWFsVmlzaWJsZUhlaWdodCk7Cit9CisKK0ludFNpemUg
V2ViUGFnZVByaXZhdGU6OnRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OnNpemUoKTsKK30KKworSW50UmVjdCBX
ZWJQYWdlUHJpdmF0ZTo6dHJhbnNmb3JtZWRWaXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3QKK3sK
KyAgICAvLyBVc3VhbGx5IHRoaXMgd291bGQgYmUgbWFwVG9UcmFuc2Zvcm1lZCh2aXNpYmxlQ29u
dGVudHNSZWN0KCkpLCBidXQKKyAgICAvLyB0aGF0IHJlc3VsdHMgaW4gcm91bmRpbmcgZXJyb3Jz
IGJlY2F1c2Ugd2UgYWxyZWFkeSBzZXQgdGhlIFdlYkNvcmUKKyAgICAvLyB2aWV3cG9ydCBzaXpl
IGZyb20gb3VyIG9yaWdpbmFsIHRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCkuCisgICAgLy8gSW5z
dGVhZCwgd2Ugb25seSB0cmFuc2Zvcm0gdGhlIHNjcm9sbCBwb3NpdGlvbiBhbmQgdGFrZSB0aGUK
KyAgICAvLyB2aWV3cG9ydCBzaXplIGFzIGl0IGlzLCB3aGljaCBlbnN1cmVzIHRoYXQgZS5nLiBi
bGl0dGluZyBvcGVyYXRpb25zCisgICAgLy8gYWx3YXlzIGNvdmVyIHRoZSB3aG9sZSB3aWRnZXQv
c2NyZWVuLgorICAgIHJldHVybiBJbnRSZWN0KHRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24oKSwg
dHJhbnNmb3JtZWRWaWV3cG9ydFNpemUoKSk7Cit9CisKK0ludFNpemUgV2ViUGFnZVByaXZhdGU6
OnRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkgY29uc3QKK3sKKyAgICAvLyBtYXBUb1RyYW5zZm9y
bWVkKCkgZnVuY3Rpb25zIHVzZSB0aGlzIG1ldGhvZCB0byBjcm9wIHRoZWlyIHJlc3VsdHMsCisg
ICAgLy8gc28gd2UgY2FuJ3QgbWFrZSB1c2Ugb2YgdGhlbSBoZXJlLiBXaGlsZSB3ZSB3YW50IHJv
dW5kaW5nIGluc2lkZSBwYWdlCisgICAgLy8gYm91bmRhcmllcyB0byBleHRlbmQgcmVjdGFuZ2xl
cyBhbmQgcm91bmQgcG9pbnRzLCB3ZSBuZWVkIHRvIGNyb3AgdGhlCisgICAgLy8gY29udGVudHMg
c2l6ZSB0byB0aGUgZmxvb3JlZCB2YWx1ZXMgc28gdGhhdCB3ZSBkb24ndCB0cnkgdG8gZGlzcGxh
eQorICAgIC8vIG9yIHJlcG9ydCBwb2ludHMgdGhhdCBhcmUgbm90IGZ1bGx5IGNvdmVyZWQgYnkg
dGhlIGFjdHVhbCBmbG9hdC1wb2ludAorICAgIC8vIGNvbnRlbnRzIHJlY3RhbmdsZS4KKyAgICBj
b25zdCBJbnRTaXplIHVudHJhbnNmb3JtZWRDb250ZW50c1NpemUgPSBjb250ZW50c1NpemUoKTsK
KyAgICBjb25zdCBGbG9hdFBvaW50IHRyYW5zZm9ybWVkQm90dG9tUmlnaHQgPSBtX3RyYW5zZm9y
bWF0aW9uTWF0cml4LT5tYXBQb2ludCgKKyAgICAgICAgRmxvYXRQb2ludCh1bnRyYW5zZm9ybWVk
Q29udGVudHNTaXplLndpZHRoKCksIHVudHJhbnNmb3JtZWRDb250ZW50c1NpemUuaGVpZ2h0KCkp
KTsKKyAgICByZXR1cm4gSW50U2l6ZShmbG9vcmYodHJhbnNmb3JtZWRCb3R0b21SaWdodC54KCkp
LCBmbG9vcmYodHJhbnNmb3JtZWRCb3R0b21SaWdodC55KCkpKTsKK30KKworSW50UG9pbnQgV2Vi
UGFnZVByaXZhdGU6Om1hcEZyb21Db250ZW50c1RvVmlld3BvcnQoY29uc3QgSW50UG9pbnQmIHBv
aW50KSBjb25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNsaWVudC0+bWFwRnJvbUNv
bnRlbnRzVG9WaWV3cG9ydChwb2ludCk7Cit9CisKK0ludFBvaW50IFdlYlBhZ2VQcml2YXRlOjpt
YXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9iYWNraW5nU3RvcmVDbGllbnQtPm1hcEZyb21WaWV3cG9ydFRvQ29udGVu
dHMocG9pbnQpOworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tQ29udGVudHNU
b1ZpZXdwb3J0KGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fYmFj
a2luZ1N0b3JlQ2xpZW50LT5tYXBGcm9tQ29udGVudHNUb1ZpZXdwb3J0KHJlY3QpOworfQorCitJ
bnRSZWN0IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKGNvbnN0IElu
dFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fYmFja2luZ1N0b3JlQ2xpZW50LT5t
YXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKHJlY3QpOworfQorCitJbnRQb2ludCBXZWJQYWdlUHJp
dmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQoY29u
c3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNs
aWVudC0+bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQocG9p
bnQpOworfQorCitJbnRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkVmll
d3BvcnRUb1RyYW5zZm9ybWVkQ29udGVudHMoY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAor
eworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNsaWVudC0+bWFwRnJvbVRyYW5zZm9ybWVkVmll
d3BvcnRUb1RyYW5zZm9ybWVkQ29udGVudHMocG9pbnQpOworfQorCitJbnRSZWN0IFdlYlBhZ2VQ
cml2YXRlOjptYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVHJhbnNmb3JtZWRWaWV3cG9ydChj
b25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHJldHVybiBtX2JhY2tpbmdTdG9yZUNs
aWVudC0+bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQocmVj
dCk7Cit9CisKK0ludFJlY3QgV2ViUGFnZVByaXZhdGU6Om1hcEZyb21UcmFuc2Zvcm1lZFZpZXdw
b3J0VG9UcmFuc2Zvcm1lZENvbnRlbnRzKGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fYmFja2luZ1N0b3JlQ2xpZW50LT5tYXBGcm9tVHJhbnNmb3JtZWRWaWV3cG9y
dFRvVHJhbnNmb3JtZWRDb250ZW50cyhyZWN0KTsKK30KKworLy8gTk9URTogUElYRUwgUk9VTkRJ
TkchCisvLyBBY2N1cmF0ZSBiYWNrLWFuZC1mb3J0aCByb3VuZGluZyBpcyBub3QgcG9zc2libGUg
d2l0aCBpbmZvcm1hdGlvbiBsb3NzCisvLyBieSBpbnRlZ2VyIHBvaW50cyBhbmQgc2l6ZXMsIHNv
IHdlIGFsd2F5cyBleHBhbmQgdGhlIHJlc3VsdGluZyBtYXBwZWQKKy8vIGZsb2F0IHJlY3Rhbmds
ZXMgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci4gRm9yIHBvaW50cywgd2UgYWx3YXlzIHVzZQorLy8g
Zmxvb3Itcm91bmRpbmcgaW4gbWFwVG9UcmFuc2Zvcm1lZCgpIHNvIHRoYXQgd2UgZG9uJ3QgaGF2
ZSB0byBjcm9wIHRvCisvLyB0aGUgKGZsb29yJ2QpIHRyYW5zZm9ybWVkIGNvbnRlbnRzIHNpemUu
CitzdGF0aWMgaW5saW5lIEludFBvaW50IHJvdW5kVHJhbnNmb3JtZWRQb2ludChjb25zdCBGbG9h
dFBvaW50ICZwb2ludCkKK3sKKyAgICAvLyBNYXBzIGJ5IHJvdW5kaW5nIGhhbGYgdG93YXJkcyB6
ZXJvLgorICAgIHJldHVybiBJbnRQb2ludChzdGF0aWNfY2FzdDxpbnQ+KGZsb29yZihwb2ludC54
KCkpKSwgc3RhdGljX2Nhc3Q8aW50PihmbG9vcmYocG9pbnQueSgpKSkpOworfQorCitzdGF0aWMg
aW5saW5lIEludFBvaW50IHJvdW5kVW50cmFuc2Zvcm1lZFBvaW50KGNvbnN0IEZsb2F0UG9pbnQg
JnBvaW50KQoreworICAgIC8vIE1hcHMgYnkgcm91bmRpbmcgaGFsZiBhd2F5IGZyb20gemVyby4K
KyAgICByZXR1cm4gSW50UG9pbnQoc3RhdGljX2Nhc3Q8aW50PihjZWlsZihwb2ludC54KCkpKSwg
c3RhdGljX2Nhc3Q8aW50PihjZWlsZihwb2ludC55KCkpKSk7Cit9CisKK0ludFBvaW50IFdlYlBh
Z2VQcml2YXRlOjptYXBUb1RyYW5zZm9ybWVkKGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QK
K3sKKyAgICByZXR1cm4gcm91bmRUcmFuc2Zvcm1lZFBvaW50KG1fdHJhbnNmb3JtYXRpb25NYXRy
aXgtPm1hcFBvaW50KEZsb2F0UG9pbnQocG9pbnQpKSk7Cit9CisKK0Zsb2F0UG9pbnQgV2ViUGFn
ZVByaXZhdGU6Om1hcFRvVHJhbnNmb3JtZWRGbG9hdFBvaW50KGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50KSBjb25zdAoreworICAgIHJldHVybiBtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5tYXBQb2lu
dChwb2ludCk7Cit9CisKK0ludFBvaW50IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVHJhbnNmb3Jt
ZWQoY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIHJldHVybiByb3VuZFVudHJh
bnNmb3JtZWRQb2ludChtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5pbnZlcnNlKCkubWFwUG9pbnQo
RmxvYXRQb2ludChwb2ludCkpKTsKK30KKworRmxvYXRQb2ludCBXZWJQYWdlUHJpdmF0ZTo6bWFw
RnJvbVRyYW5zZm9ybWVkRmxvYXRQb2ludChjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QK
K3sKKyAgICByZXR1cm4gbV90cmFuc2Zvcm1hdGlvbk1hdHJpeC0+aW52ZXJzZSgpLm1hcFBvaW50
KHBvaW50KTsKK30KKworRmxvYXRSZWN0IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVHJhbnNmb3Jt
ZWRGbG9hdFJlY3QoY29uc3QgRmxvYXRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHJldHVybiBt
X3RyYW5zZm9ybWF0aW9uTWF0cml4LT5pbnZlcnNlKCkubWFwUmVjdChyZWN0KTsKK30KKworSW50
U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6bWFwVG9UcmFuc2Zvcm1lZChjb25zdCBJbnRTaXplJiBzaXpl
KSBjb25zdAoreworICAgIHJldHVybiBtYXBUb1RyYW5zZm9ybWVkKEludFJlY3QoSW50UG9pbnQ6
Onplcm8oKSwgc2l6ZSkpLnNpemUoKTsKK30KKworSW50U2l6ZSBXZWJQYWdlUHJpdmF0ZTo6bWFw
RnJvbVRyYW5zZm9ybWVkKGNvbnN0IEludFNpemUmIHNpemUpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1hcEZyb21UcmFuc2Zvcm1lZChJbnRSZWN0KEludFBvaW50Ojp6ZXJvKCksIHNpemUpKS5zaXpl
KCk7Cit9CisKK0ludFJlY3QgV2ViUGFnZVByaXZhdGU6Om1hcFRvVHJhbnNmb3JtZWQoY29uc3Qg
SW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gZW5jbG9zaW5nSW50UmVjdChtX3Ry
YW5zZm9ybWF0aW9uTWF0cml4LT5tYXBSZWN0KEZsb2F0UmVjdChyZWN0KSkpOworfQorCisvLyBV
c2UgdGhpcyBpbiBjb25qdW5jdGlvbiB3aXRoIG1hcFRvVHJhbnNmb3JtZWQoSW50UmVjdCksIGlu
IG1vc3QgY2FzZXMuCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpjbGlwVG9UcmFuc2Zvcm1lZENvbnRl
bnRzUmVjdChJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHJlY3QuaW50ZXJzZWN0KEludFJl
Y3QoSW50UG9pbnQ6Onplcm8oKSwgdHJhbnNmb3JtZWRDb250ZW50c1NpemUoKSkpOworfQorCitJ
bnRSZWN0IFdlYlBhZ2VQcml2YXRlOjptYXBGcm9tVHJhbnNmb3JtZWQoY29uc3QgSW50UmVjdCYg
cmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gZW5jbG9zaW5nSW50UmVjdChtX3RyYW5zZm9ybWF0
aW9uTWF0cml4LT5pbnZlcnNlKCkubWFwUmVjdChGbG9hdFJlY3QocmVjdCkpKTsKK30KKworYm9v
bCBXZWJQYWdlUHJpdmF0ZTo6dHJhbnNmb3JtZWRQb2ludEVxdWFsc1VudHJhbnNmb3JtZWRQb2lu
dChjb25zdCBJbnRQb2ludCYgdHJhbnNmb3JtZWRQb2ludCwgY29uc3QgSW50UG9pbnQmIHVudHJh
bnNmb3JtZWRQb2ludCkKK3sKKyAgICAvLyBTY2FsaW5nIGRvd24gaXMgYWx3YXlzIG1vcmUgYWNj
dXJhdGUgdGhhbiBzY2FsaW5nIHVwLgorICAgIGlmIChtX3RyYW5zZm9ybWF0aW9uTWF0cml4LT5h
KCkgPiAxLjApCisgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFBvaW50ID09IG1hcFRvVHJhbnNm
b3JtZWQodW50cmFuc2Zvcm1lZFBvaW50KTsKKworICAgIHJldHVybiBtYXBGcm9tVHJhbnNmb3Jt
ZWQodHJhbnNmb3JtZWRQb2ludCkgPT0gdW50cmFuc2Zvcm1lZFBvaW50OworfQorCit2b2lkIFdl
YlBhZ2VQcml2YXRlOjpub3RpZnlUcmFuc2Zvcm1DaGFuZ2VkKCkKK3sKKyAgICBub3RpZnlUcmFu
c2Zvcm1lZENvbnRlbnRzU2l6ZUNoYW5nZWQoKTsKKyAgICBub3RpZnlUcmFuc2Zvcm1lZFNjcm9s
bENoYW5nZWQoKTsKKworICAgIG1fYmFja2luZ1N0b3JlLT5kLT50cmFuc2Zvcm1DaGFuZ2VkKCk7
Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6Om5vdGlmeVRyYW5zZm9ybWVkQ29udGVudHNTaXpl
Q2hhbmdlZCgpCit7CisgICAgLy8gV2UgbWFyayBoZXJlIGFzIHRoZSBsYXN0IHJlcG9ydGVkIGNv
bnRlbnQgc2l6ZSB3ZSBzZW50IHRvIHRoZSBjbGllbnQuCisgICAgbV9wcmV2aW91c0NvbnRlbnRz
U2l6ZSA9IGNvbnRlbnRzU2l6ZSgpOworCisgICAgY29uc3QgSW50U2l6ZSBzaXplID0gdHJhbnNm
b3JtZWRDb250ZW50c1NpemUoKTsKKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+Y29udGVudHNTaXpl
Q2hhbmdlZChzaXplKTsKKyAgICBtX2NsaWVudC0+Y29udGVudHNTaXplQ2hhbmdlZChzaXplKTsK
KyAgICBtX3NlbGVjdGlvbkhhbmRsZXItPnNlbGVjdGlvblBvc2l0aW9uQ2hhbmdlZCgpOworfQor
Cit2b2lkIFdlYlBhZ2VQcml2YXRlOjpub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQoKQor
eworICAgIGNvbnN0IEludFBvaW50IHBvcyA9IHRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24oKTsK
KyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+c2Nyb2xsQ2hhbmdlZChwb3MpOworICAgIG1fY2xpZW50
LT5zY3JvbGxDaGFuZ2VkKHBvcyk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OnNldFZpZXdN
b2RlKFZpZXdNb2RlIG1vZGUpCit7CisgICAgaWYgKCFtX21haW5GcmFtZS0+dmlldygpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBtX3ZpZXdNb2RlID0gbW9kZTsKKworICAgIC8vIElm
IHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSBuZXN0ZWQgbGF5b3V0IHdpdGggYSByZWN1cnNpb24g
Y291bnQgYWJvdmUKKyAgICAvLyBzb21lIG1heGltdW0gdGhyZXNob2xkLCB0aGVuIG91ciBhbGdv
cml0aG0gZm9yIGZpbmRpbmcgdGhlIG1pbmltdW0gY29udGVudAorICAgIC8vIHdpZHRoIG9mIGEg
Z2l2ZW4gcGFnZSBoYXMgYmVjb21lIGRlcGVuZGVudCBvbiB0aGUgdmlzaWJsZSB3aWR0aC4KKyAg
ICAvLworICAgIC8vIFdlIG5lZWQgdG8gZmluZCBzb21lIG1ldGhvZCB0byBlbnN1cmUgdGhhdCB3
ZSBkb24ndCBleHBlcmllbmNlIGV4Y2Vzc2l2ZQorICAgIC8vIGFuZCBldmVuIGluZmluaXRlIHJl
Y3Vyc2lvbi4gVGhpcyBjYW4gZXZlbiBoYXBwZW4gd2l0aCB2YWxpZCBodG1sLiBUaGUKKyAgICAv
LyBmb3JtZXIgY2FuIGhhcHBlbiB3aGVuIHdlIHJ1biBpbnRvIGlubGluZSB0ZXh0IHdpdGggZmV3
IGNhbmRpZGF0ZXMgZm9yIGxpbmUKKyAgICAvLyBicmVhay4gVGhlIGxhdHRlciBjYW4gaGFwcGVu
IGZvciBpbnN0YW5jZSBpZiB0aGUgcGFnZSBoYXMgYSBuZWdhdGl2ZSBtYXJnaW4KKyAgICAvLyBz
ZXQgYWdhaW5zdCB0aGUgcmlnaHQgYm9yZGVyLiBOb3RlOiB0aGlzIGlzIHZhbGlkIGJ5IHNwZWMg
YW5kIGNhbiBsZWFkIHRvCisgICAgLy8gYSBzaXR1YXRpb24gd2hlcmUgdGhlcmUgaXMgbm8gdmFs
dWUgZm9yIHdoaWNoIHRoZSBjb250ZW50IHdpZHRoIHdpbGwgZW5zdXJlCisgICAgLy8gbm8gaG9y
aXpvbnRhbCBzY3JvbGxiYXIuCisgICAgLy8gRXhhbXBsZTogTGF5b3V0VGVzdHMvY3NzMS9ib3hf
cHJvcGVydGllcy9tYXJnaW4uaHRtbAorICAgIC8vCisgICAgLy8gSW4gb3JkZXIgdG8gYWRkcmVz
cyBzdWNoIHNpdHVhdGlvbnMgd2hlbiB3ZSBkZXRlY3QgYSByZWN1cnNpb24gYWJvdmUgc29tZQor
ICAgIC8vIG1heGltdW0gdGhyZXNob2xkIHdlIHNuYXAgb3VyIGZpeGVkIGxheW91dCBzaXplIHRv
IGEgZGVmaW5lZCBxdWFudHVtIGluY3JlbWVudC4KKyAgICAvLyBFdmVudHVhbGx5LCBlaXRoZXIg
dGhlIGNvbnRlbnQgd2lkdGggd2lsbCBiZSBzYXRpc2ZpZWQgdG8gZW5zdXJlIG5vIGhvcml6b250
YWwKKyAgICAvLyBzY3JvbGxiYXIgb3IgdGhpcyBpbmNyZW1lbnQgd2lsbCBydW4gaW50byB0aGUg
bWF4aW11bSBsYXlvdXQgc2l6ZSBhbmQgdGhlCisgICAgLy8gcmVjdXJzaW9uIHdpbGwgbmVjZXNz
YXJpbHkgZW5kLgorICAgIGJvb2wgc25hcFRvSW5jcmVtZW50ID0gZGlkTGF5b3V0RXhjZWVkTWF4
aW11bUl0ZXJhdGlvbnMoKTsKKworICAgIEludFNpemUgY3VycmVudFNpemUgPSBtX21haW5GcmFt
ZS0+dmlldygpLT5maXhlZExheW91dFNpemUoKTsKKyAgICBJbnRTaXplIG5ld1NpemUgPSBmaXhl
ZExheW91dFNpemUoc25hcFRvSW5jcmVtZW50KTsKKyAgICBpZiAoY3VycmVudFNpemUgPT0gbmV3
U2l6ZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRklYTUU6IFRlbXAgc29sdXRp
b24uIFdlJ2xsIGdldCBiYWNrIHRvIHRoaXMuCisgICAgaWYgKG1fbmVzdGVkTGF5b3V0RmluaXNo
ZWRDb3VudCkgeworICAgICAgICBkb3VibGUgd2lkdGhDaGFuZ2UgPSBmYWJzKGRvdWJsZShuZXdT
aXplLndpZHRoKCkgLSBjdXJyZW50U2l6ZS53aWR0aCgpKSAvIGN1cnJlbnRTaXplLndpZHRoKCkp
OworICAgICAgICBkb3VibGUgaGVpZ2h0Q2hhbmdlID0gZmFicyhkb3VibGUobmV3U2l6ZS5oZWln
aHQoKSAtIGN1cnJlbnRTaXplLmhlaWdodCgpKSAvIGN1cnJlbnRTaXplLmhlaWdodCgpKTsKKyAg
ICAgICAgaWYgKHdpZHRoQ2hhbmdlIDwgMC4wNSAmJiBoZWlnaHRDaGFuZ2UgPCAwLjA1KQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fbWFpbkZyYW1lLT52aWV3KCkt
PnNldFVzZUZpeGVkTGF5b3V0KHVzZUZpeGVkTGF5b3V0KCkpOworICAgIG1fbWFpbkZyYW1lLT52
aWV3KCktPnNldEZpeGVkTGF5b3V0U2l6ZShuZXdTaXplKTsKKyAgICByZXR1cm4gdHJ1ZTsgLy8g
TmVlZHMgcmUtbGF5b3V0IQorfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXRDdXJzb3IoUGxh
dGZvcm1DdXJzb3JIYW5kbGUgaGFuZGxlKQoreworICAgIGlmIChtX2N1cnJlbnRDdXJzb3IudHlw
ZSgpICE9IGhhbmRsZS50eXBlKCkpIHsKKyAgICAgICAgbV9jdXJyZW50Q3Vyc29yID0gaGFuZGxl
OworICAgICAgICBtX2NsaWVudC0+Y3Vyc29yQ2hhbmdlZChoYW5kbGUudHlwZSgpLCBoYW5kbGUu
dXJsKCkuY19zdHIoKSwgaGFuZGxlLmhvdHNwb3QoKS54KCksIGhhbmRsZS5ob3RzcG90KCkueSgp
KTsKKyAgICB9Cit9CisKK1BsYXRmb3JtOjpOZXR3b3JrU3RyZWFtRmFjdG9yeSogV2ViUGFnZVBy
aXZhdGU6Om5ldHdvcmtTdHJlYW1GYWN0b3J5KCkKK3sKKyAgICByZXR1cm4gbV9jbGllbnQtPm5l
dHdvcmtTdHJlYW1GYWN0b3J5KCk7Cit9CisKK1BsYXRmb3JtOjpHcmFwaGljczo6V2luZG93KiBX
ZWJQYWdlUHJpdmF0ZTo6cGxhdGZvcm1XaW5kb3coKSBjb25zdAoreworICAgIHJldHVybiBtX2Ns
aWVudC0+d2luZG93KCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldFByZXZlbnRzU2Ny
ZWVuRGltbWluZyhib29sIGtlZXBBd2FrZSkKK3sKKyAgICBpZiAoa2VlcEF3YWtlKSB7CisgICAg
ICAgIGlmICghbV9wcmV2ZW50SWRsZURpbW1pbmdDb3VudCkKKyAgICAgICAgICAgIG1fY2xpZW50
LT5zZXRQcmV2ZW50c1NjcmVlbklkbGVEaW1taW5nKHRydWUpOworICAgICAgICBtX3ByZXZlbnRJ
ZGxlRGltbWluZ0NvdW50Kys7CisgICAgfSBlbHNlIGlmIChtX3ByZXZlbnRJZGxlRGltbWluZ0Nv
dW50ID4gMCkgeworICAgICAgICBtX3ByZXZlbnRJZGxlRGltbWluZ0NvdW50LS07CisgICAgICAg
IGlmICghbV9wcmV2ZW50SWRsZURpbW1pbmdDb3VudCkKKyAgICAgICAgICAgIG1fY2xpZW50LT5z
ZXRQcmV2ZW50c1NjcmVlbklkbGVEaW1taW5nKGZhbHNlKTsKKyAgICB9IGVsc2UKKyAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7IC8vIFNldFByZXZlbnRzU2NyZWVuSWRsZURpbW1pbmcoZmFs
c2UpIGNhbGxlZCB0b28gbWFueSB0aW1lcy4KK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2hv
d1ZpcnR1YWxLZXlib2FyZChib29sIHNob3dLZXlib2FyZCkKK3sKKyAgICBtX2NsaWVudC0+c2hv
d1ZpcnR1YWxLZXlib2FyZChzaG93S2V5Ym9hcmQpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRl
OjplbnN1cmVDb250ZW50VmlzaWJsZShib29sIGNlbnRlckluVmlldykKK3sKKyAgICBtX2lucHV0
SGFuZGxlci0+ZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJsZShjZW50ZXJJblZpZXcpOworfQorCit2
b2lkIFdlYlBhZ2VQcml2YXRlOjp6b29tVG9Db250ZW50UmVjdChjb25zdCBJbnRSZWN0JiByZWN0
KQoreworICAgIC8vIERvbid0IHNjYWxlIGlmIHRoZSB1c2VyIGlzIG5vdCBzdXBwb3NlZCB0byBz
Y2FsZS4KKyAgICBpZiAoIWlzVXNlclNjYWxhYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IEZsb2F0UG9pbnQgYW5jaG9yID0gRmxvYXRQb2ludChyZWN0LndpZHRoKCkgLyAyLjAgKyByZWN0
LngoKSwgcmVjdC5oZWlnaHQoKSAvIDIuMCArIHJlY3QueSgpKTsKKyAgICBJbnRTaXplIHZpZXdT
aXplID0gdmlld3BvcnRTaXplKCk7CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIHNjYWxlIHJlcXVp
cmVkIHRvIHNjYWxlIHRoYXQgZGltZW5zaW9uIHRvIGZpdC4KKyAgICBkb3VibGUgc2NhbGVIID0g
KGRvdWJsZSl2aWV3U2l6ZS53aWR0aCgpIC8gKGRvdWJsZSlyZWN0LndpZHRoKCk7CisgICAgZG91
YmxlIHNjYWxlViA9IChkb3VibGUpdmlld1NpemUuaGVpZ2h0KCkgLyAoZG91YmxlKXJlY3QuaGVp
Z2h0KCk7CisKKyAgICAvLyBDaG9vc2UgdGhlIHNtYWxsZXIgc2NhbGUgZmFjdG9yIHNvIHRoYXQg
YWxsIG9mIHRoZSBjb250ZW50IGlzIHZpc2libGUuCisgICAgem9vbUFib3V0UG9pbnQobWluKHNj
YWxlSCwgc2NhbGVWKSwgYW5jaG9yKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6cmVnaXN0
ZXJQbHVnaW4oUGx1Z2luVmlldyogcGx1Z2luLCBib29sIHNob3VsZFJlZ2lzdGVyKQoreworICAg
IGlmIChzaG91bGRSZWdpc3RlcikKKyAgICAgICAgbV9wbHVnaW5WaWV3cy5hZGQocGx1Z2luKTsK
KyAgICBlbHNlCisgICAgICAgIG1fcGx1Z2luVmlld3MucmVtb3ZlKHBsdWdpbik7Cit9CisKKyNk
ZWZpbmUgRk9SX0VBQ0hfUExVR0lOVklFVyhwbHVnaW5WaWV3cykgXAorICAgIEhhc2hTZXQ8UGx1
Z2luVmlldyo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IHBsdWdpblZpZXdzLmJlZ2luKCk7IFwKKyAg
ICBIYXNoU2V0PFBsdWdpblZpZXcqPjo6Y29uc3RfaXRlcmF0b3IgbGFzdCA9IHBsdWdpblZpZXdz
LmVuZCgpOyBcCisgICAgZm9yICg7IGl0ICE9IGxhc3Q7ICsraXQpCisKK3ZvaWQgV2ViUGFnZVBy
aXZhdGU6Om5vdGlmeVBhZ2VPbkxvYWQoKQoreworICAgIEZPUl9FQUNIX1BMVUdJTlZJRVcobV9w
bHVnaW5WaWV3cykKKyAgICAgICAgKCppdCktPmhhbmRsZU9uTG9hZEV2ZW50KCk7Cit9CisKK2Jv
b2wgV2ViUGFnZVByaXZhdGU6OnNob3VsZFBsdWdpbkVudGVyRnVsbFNjcmVlbihQbHVnaW5WaWV3
KiBwbHVnaW4sIGNvbnN0IGNoYXIqIHdpbmRvd1VuaXF1ZVByZWZpeCkKK3sKKyAgICByZXR1cm4g
bV9jbGllbnQtPnNob3VsZFBsdWdpbkVudGVyRnVsbFNjcmVlbigpOworfQorCit2b2lkIFdlYlBh
Z2VQcml2YXRlOjpkaWRQbHVnaW5FbnRlckZ1bGxTY3JlZW4oUGx1Z2luVmlldyogcGx1Z2luLCBj
b25zdCBjaGFyKiB3aW5kb3dVbmlxdWVQcmVmaXgpCit7CisgICAgbV9mdWxsU2NyZWVuUGx1Z2lu
VmlldyA9IHBsdWdpbjsKKyAgICBtX2NsaWVudC0+ZGlkUGx1Z2luRW50ZXJGdWxsU2NyZWVuKCk7
CisgICAgUGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3c6OnNldFRyYW5zcGFyZW5jeURpc2NhcmRG
aWx0ZXIod2luZG93VW5pcXVlUHJlZml4KTsKKyAgICBtX2NsaWVudC0+d2luZG93KCktPnNldFNl
bnNpdGl2aXR5RnVsbHNjcmVlbk92ZXJyaWRlKHRydWUpOworfQorCit2b2lkIFdlYlBhZ2VQcml2
YXRlOjpkaWRQbHVnaW5FeGl0RnVsbFNjcmVlbihQbHVnaW5WaWV3KiBwbHVnaW4sIGNvbnN0IGNo
YXIqIHdpbmRvd1VuaXF1ZVByZWZpeCkKK3sKKyAgICBtX2Z1bGxTY3JlZW5QbHVnaW5WaWV3ID0g
MDsKKyAgICBtX2NsaWVudC0+ZGlkUGx1Z2luRXhpdEZ1bGxTY3JlZW4oKTsKKyAgICBQbGF0Zm9y
bTo6R3JhcGhpY3M6OldpbmRvdzo6c2V0VHJhbnNwYXJlbmN5RGlzY2FyZEZpbHRlcigwKTsKKyAg
ICBtX2NsaWVudC0+d2luZG93KCktPnNldFNlbnNpdGl2aXR5RnVsbHNjcmVlbk92ZXJyaWRlKGZh
bHNlKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6b25QbHVnaW5TdGFydEJhY2tncm91bmRQ
bGF5KFBsdWdpblZpZXcqIHBsdWdpbiwgY29uc3QgY2hhciogd2luZG93VW5pcXVlUHJlZml4KQor
eworICAgIG1fY2xpZW50LT5vblBsdWdpblN0YXJ0QmFja2dyb3VuZFBsYXkoKTsKK30KKwordm9p
ZCBXZWJQYWdlUHJpdmF0ZTo6b25QbHVnaW5TdG9wQmFja2dyb3VuZFBsYXkoUGx1Z2luVmlldyog
cGx1Z2luLCBjb25zdCBjaGFyKiB3aW5kb3dVbmlxdWVQcmVmaXgpCit7CisgICAgbV9jbGllbnQt
Pm9uUGx1Z2luU3RvcEJhY2tncm91bmRQbGF5KCk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6
OmxvY2tPcmllbnRhdGlvbihib29sIGxhbmRzY2FwZSkKK3sKKyAgICByZXR1cm4gbV9jbGllbnQt
PmxvY2tPcmllbnRhdGlvbihsYW5kc2NhcGUpOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjp1
bmxvY2tPcmllbnRhdGlvbigpCit7CisgICAgcmV0dXJuIG1fY2xpZW50LT51bmxvY2tPcmllbnRh
dGlvbigpOworfQorCitpbnQgV2ViUGFnZVByaXZhdGU6Om9yaWVudGF0aW9uKCkgY29uc3QKK3sK
KyNpZiBFTkFCTEUoT1JJRU5UQVRJT05fRVZFTlRTKQorICAgIHJldHVybiBtX21haW5GcmFtZS0+
b3JpZW50YXRpb24oKTsKKyNlbHNlCisjZXJyb3IgT1JJRU5UQVRJT05fRVZFTlRTIG11c3QgYmUg
ZGVmaW5lZC4KKy8vIE9yIGEgY29weSBvZiB0aGUgb3JpZW50YXRpb24gdmFsdWUgd2lsbCBoYXZl
IHRvIGJlIHN0b3JlZCBpbiB0aGVzZSBvYmplY3RzLgorI2VuZGlmCit9CisKK2RvdWJsZSBXZWJQ
YWdlUHJpdmF0ZTo6Y3VycmVudFpvb21GYWN0b3IoKSBjb25zdAoreworICAgIHJldHVybiBjdXJy
ZW50U2NhbGUoKTsKK30KKworaW50IFdlYlBhZ2VQcml2YXRlOjpzaG93QWxlcnREaWFsb2coV2Vi
UGFnZUNsaWVudDo6QWxlcnRUeXBlIGF0eXBlKQoreworICAgIHJldHVybiBtX2NsaWVudC0+c2hv
d0FsZXJ0RGlhbG9nKGF0eXBlKTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6aXNBY3RpdmUo
KSBjb25zdAoreworICAgIHJldHVybiBtX2NsaWVudC0+aXNBY3RpdmUoKTsKK30KKworYm9vbCBX
ZWJQYWdlUHJpdmF0ZTo6dXNlRml4ZWRMYXlvdXQoKSBjb25zdAoreworICAgIHJldHVybiB0cnVl
OworfQorCitBY3RpdmVOb2RlQ29udGV4dCBXZWJQYWdlUHJpdmF0ZTo6YWN0aXZlTm9kZUNvbnRl
eHQoVGFyZ2V0RGV0ZWN0aW9uU3RyYXRlZ3kgc3RyYXRlZ3kpCit7CisgICAgQWN0aXZlTm9kZUNv
bnRleHQgY29udGV4dDsKKworICAgIFJlZlB0cjxOb2RlPiBub2RlID0gY29udGV4dE5vZGUoc3Ry
YXRlZ3kpOworICAgIG1fY3VycmVudENvbnRleHROb2RlID0gbm9kZTsKKyAgICBpZiAoIW1fY3Vy
cmVudENvbnRleHROb2RlKQorICAgICAgICByZXR1cm4gY29udGV4dDsKKworICAgIHJlcXVlc3RM
YXlvdXRJZk5lZWRlZCgpOworCisgICAgYm9vbCBub2RlQWxsb3dTZWxlY3Rpb25PdmVycmlkZSA9
IGZhbHNlOworICAgIGlmIChOb2RlKiBsaW5rTm9kZSA9IG5vZGUtPmVuY2xvc2luZ0xpbmtFdmVu
dFBhcmVudE9yU2VsZigpKSB7CisgICAgICAgIEtVUkwgaHJlZjsKKyAgICAgICAgaWYgKGxpbmtO
b2RlLT5pc0xpbmsoKSAmJiBsaW5rTm9kZS0+aGFzQXR0cmlidXRlcygpKSB7CisgICAgICAgICAg
ICBpZiAoQXR0cmlidXRlKiBhdHRyaWJ1dGUgPSBsaW5rTm9kZS0+YXR0cmlidXRlcygpLT5nZXRB
dHRyaWJ1dGVJdGVtKEhUTUxOYW1lczo6aHJlZkF0dHIpKQorICAgICAgICAgICAgICAgIGhyZWYg
PSBsaW5rTm9kZS0+ZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwoc3RyaXBMZWFkaW5nQW5kVHJhaWxp
bmdIVE1MU3BhY2VzKGF0dHJpYnV0ZS0+dmFsdWUoKSkpOworICAgICAgICB9CisKKyAgICAgICAg
U3RyaW5nIHBhdHRlcm4gPSBmaW5kUGF0dGVyblN0cmluZ0ZvclVybChocmVmKTsKKyAgICAgICAg
aWYgKCFwYXR0ZXJuLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRleHQuc2V0UGF0dGVybihw
YXR0ZXJuKTsKKworICAgICAgICBpZiAoIWhyZWYuc3RyaW5nKCkuaXNFbXB0eSgpKSB7CisgICAg
ICAgICAgICBjb250ZXh0LnNldFVybChocmVmLnN0cmluZygpKTsKKworICAgICAgICAgICAgLy8g
TGlua3MgYXJlIG5vbi1zZWxlY3RhYmxlIGJ5IGRlZmF1bHQsIGJ1dCBzZWxlY3Rpb24gc2hvdWxk
IGJlIGFsbG93ZWQKKyAgICAgICAgICAgIC8vIHByb3ZpZGluZyB0aGUgcGFnZSBpcyBzZWxlY3Rh
YmxlLCB1c2UgdGhlIHBhcmVudCB0byBkZXRlcm1pbmUgaXQuCisgICAgICAgICAgICBpZiAobGlu
a05vZGUtPnBhcmVudE5vZGUoKSAmJiBsaW5rTm9kZS0+cGFyZW50Tm9kZSgpLT5jYW5TdGFydFNl
bGVjdGlvbigpKQorICAgICAgICAgICAgICAgIG5vZGVBbGxvd1NlbGVjdGlvbk92ZXJyaWRlID0g
dHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghbm9kZUFsbG93U2VsZWN0aW9uT3Zl
cnJpZGUgJiYgIW5vZGUtPmNhblN0YXJ0U2VsZWN0aW9uKCkpCisgICAgICAgIGNvbnRleHQucmVz
ZXRGbGFnKEFjdGl2ZU5vZGVDb250ZXh0OjpJc1NlbGVjdGFibGUpOworCisgICAgaWYgKG5vZGUt
PmlzSFRNTEVsZW1lbnQoKSkgeworICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZUVsZW1l
bnQgPSAwOworICAgICAgICBpZiAobm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmltZ1RhZykp
CisgICAgICAgICAgICBpbWFnZUVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MSW1hZ2VFbGVtZW50
Kj4obm9kZS5nZXQoKSk7CisgICAgICAgIGVsc2UgaWYgKG5vZGUtPmhhc1RhZ05hbWUoSFRNTE5h
bWVzOjphcmVhVGFnKSkKKyAgICAgICAgICAgIGltYWdlRWxlbWVudCA9IHN0YXRpY19jYXN0PEhU
TUxBcmVhRWxlbWVudCo+KG5vZGUuZ2V0KCkpLT5pbWFnZUVsZW1lbnQoKTsKKyAgICAgICAgaWYg
KGltYWdlRWxlbWVudCAmJiBpbWFnZUVsZW1lbnQtPnJlbmRlcmVyKCkpIHsKKyAgICAgICAgICAg
IC8vIEZJWE1FOiBBdCB0aGUgbWVhbiB0aW1lLCB3ZSBvbmx5IHNob3cgIlNhdmUgSW1hZ2UiIHdo
ZW4gdGhlIGltYWdlIGRhdGEgaXMgYXZhaWxhYmxlLgorICAgICAgICAgICAgaWYgKENhY2hlZFJl
c291cmNlKiBjYWNoZWRSZXNvdXJjZSA9IGltYWdlRWxlbWVudC0+Y2FjaGVkSW1hZ2UoKSkgewor
ICAgICAgICAgICAgICAgIGlmIChjYWNoZWRSZXNvdXJjZS0+aXNMb2FkZWQoKSAmJiBjYWNoZWRS
ZXNvdXJjZS0+ZGF0YSgpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1cmwgPSBzdHJp
cExlYWRpbmdBbmRUcmFpbGluZ0hUTUxTcGFjZXMoaW1hZ2VFbGVtZW50LT5nZXRBdHRyaWJ1dGUo
SFRNTE5hbWVzOjpzcmNBdHRyKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRl
eHQuc2V0SW1hZ2VTcmMobm9kZS0+ZG9jdW1lbnQoKS0+Y29tcGxldGVVUkwodXJsKS5zdHJpbmco
KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5n
IGFsdCA9IGltYWdlRWxlbWVudC0+YWx0VGV4dCgpOworICAgICAgICAgICAgaWYgKCFhbHQuaXNO
dWxsKCkpCisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRJbWFnZUFsdChhbHQpOworICAgICAg
ICB9CisgICAgfQorCisgICAgaWYgKG5vZGUtPmlzVGV4dE5vZGUoKSkgeworICAgICAgICBUZXh0
KiBjdXJUZXh0ID0gc3RhdGljX2Nhc3Q8VGV4dCo+KG5vZGUuZ2V0KCkpOworICAgICAgICBpZiAo
IWN1clRleHQtPndob2xlVGV4dCgpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRleHQuc2V0
VGV4dChjdXJUZXh0LT53aG9sZVRleHQoKSk7CisgICAgfQorCisgICAgaWYgKG5vZGUtPmlzRWxl
bWVudE5vZGUoKSkgeworICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxl
bWVudCo+KG5vZGUtPnNoYWRvd0FuY2VzdG9yTm9kZSgpKTsKKyAgICAgICAgaWYgKERPTVN1cHBv
cnQ6OmlzVGV4dEJhc2VkQ29udGVudEVkaXRhYmxlRWxlbWVudChlbGVtZW50KSkgeworICAgICAg
ICAgICAgY29udGV4dC5zZXRGbGFnKEFjdGl2ZU5vZGVDb250ZXh0OjpJc0lucHV0KTsKKyAgICAg
ICAgICAgIGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aW5wdXRUYWcpKQorICAg
ICAgICAgICAgICAgIGNvbnRleHQuc2V0RmxhZyhBY3RpdmVOb2RlQ29udGV4dDo6SXNTaW5nbGVM
aW5lKTsKKyAgICAgICAgICAgIGlmIChET01TdXBwb3J0Ojppc1Bhc3N3b3JkRWxlbWVudChlbGVt
ZW50KSkKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldEZsYWcoQWN0aXZlTm9kZUNvbnRleHQ6
OklzUGFzc3dvcmQpOworCisgICAgICAgICAgICBTdHJpbmcgZWxlbWVudFRleHQoRE9NU3VwcG9y
dDo6aW5wdXRFbGVtZW50VGV4dChlbGVtZW50KSk7CisgICAgICAgICAgICBpZiAoIWVsZW1lbnRU
ZXh0LnN0cmlwV2hpdGVTcGFjZSgpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBjb250ZXh0
LnNldFRleHQoZWxlbWVudFRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5vZGUt
PmlzRm9jdXNhYmxlKCkpCisgICAgICAgIGNvbnRleHQuc2V0RmxhZyhBY3RpdmVOb2RlQ29udGV4
dDo6SXNGb2N1c2FibGUpOworCisgICAgcmV0dXJuIGNvbnRleHQ7Cit9CisKK3ZvaWQgV2ViUGFn
ZVByaXZhdGU6OnVwZGF0ZUN1cnNvcigpCit7CisgICAgaW50IGJ1dHRvbk1hc2sgPSAwOworICAg
IGlmIChtX2xhc3RNb3VzZUV2ZW50LmJ1dHRvbigpID09IExlZnRCdXR0b24pCisgICAgICAgIGJ1
dHRvbk1hc2sgPSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6U2NyZWVuTGVmdE1vdXNlQnV0dG9uOwor
ICAgIGVsc2UgaWYgKG1fbGFzdE1vdXNlRXZlbnQuYnV0dG9uKCkgPT0gTWlkZGxlQnV0dG9uKQor
ICAgICAgICBidXR0b25NYXNrID0gUGxhdGZvcm06Ok1vdXNlRXZlbnQ6OlNjcmVlbk1pZGRsZU1v
dXNlQnV0dG9uOworICAgIGVsc2UgaWYgKG1fbGFzdE1vdXNlRXZlbnQuYnV0dG9uKCkgPT0gUmln
aHRCdXR0b24pCisgICAgICAgIGJ1dHRvbk1hc2sgPSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6U2Ny
ZWVuUmlnaHRNb3VzZUJ1dHRvbjsKKworICAgIFBsYXRmb3JtOjpNb3VzZUV2ZW50IGV2ZW50KGJ1
dHRvbk1hc2ssIGJ1dHRvbk1hc2ssIG1hcFRvVHJhbnNmb3JtZWQobV9sYXN0TW91c2VFdmVudC5w
b3MoKSksIG1hcFRvVHJhbnNmb3JtZWQobV9sYXN0TW91c2VFdmVudC5nbG9iYWxQb3MoKSksIDAs
IDApOworICAgIG1fd2ViUGFnZS0+bW91c2VFdmVudChldmVudCk7Cit9CisKK0ludFNpemUgV2Vi
UGFnZVByaXZhdGU6OmZpeGVkTGF5b3V0U2l6ZShib29sIHNuYXBUb0luY3JlbWVudCkgY29uc3QK
K3sKKyAgICBpZiAoaGFzVmlydHVhbFZpZXdwb3J0KCkpCisgICAgICAgIHJldHVybiBJbnRTaXpl
KG1fdmlydHVhbFZpZXdwb3J0V2lkdGgsIG1fdmlydHVhbFZpZXdwb3J0SGVpZ2h0KTsKKworICAg
IGNvbnN0IGludCBkZWZhdWx0TGF5b3V0V2lkdGggPSBtX2RlZmF1bHRMYXlvdXRTaXplLndpZHRo
KCk7CisgICAgY29uc3QgaW50IGRlZmF1bHRMYXlvdXRIZWlnaHQgPSBtX2RlZmF1bHRMYXlvdXRT
aXplLmhlaWdodCgpOworCisgICAgaW50IG1pbldpZHRoID0gZGVmYXVsdExheW91dFdpZHRoOwor
ICAgIGludCBtYXhXaWR0aCA9IGRlZmF1bHRNYXhMYXlvdXRTaXplKCkud2lkdGgoKTsKKyAgICBp
bnQgbWF4SGVpZ2h0ID0gZGVmYXVsdE1heExheW91dFNpemUoKS5oZWlnaHQoKTsKKworICAgIC8v
IElmIHRoZSBsb2FkIHN0YXRlIGlzIG5vbmUgdGhlbiB3ZSBoYXZlbid0IGFjdHVhbGx5IGdvdCBh
bnl0aGluZyB5ZXQsIGJ1dCB3ZSBuZWVkIHRvIGxheW91dAorICAgIC8vIHRoZSBlbnRpcmUgcGFn
ZSBzbyB0aGF0IHRoZSB1c2VyIHNlZXMgdGhlIGVudGlyZSBwYWdlICh1bnJlbmRlcmVkKSBpbnN0
ZWFkIG9mIGp1c3QgcGFydCBvZiBpdC4KKyAgICBpZiAobV9sb2FkU3RhdGUgPT0gTm9uZSkKKyAg
ICAgICAgcmV0dXJuIEludFNpemUoZGVmYXVsdExheW91dFdpZHRoLCBkZWZhdWx0TGF5b3V0SGVp
Z2h0KTsKKworICAgIGlmIChtX3ZpZXdNb2RlID09IEZpeGVkRGVza3RvcCkgeworICAgICAgICBp
bnQgd2lkdGggID0gbWF4V2lkdGg7CisgICAgICAgIC8vIGlmIHRoZSBkZWZhdWx0TGF5b3V0SGVp
Z2h0IGlzIGF0IG1pbmltdW0sIGl0IHByb2JhYmx5IHdhcyBzZXQgYXMgMAorICAgICAgICAvLyBh
bmQgY2xhbXBlZCwgbWVhbmluZyBpdCdzIGVmZmVjdGl2ZWx5IG5vdCBzZXQuICAoRXZlbiBpZiBp
dCBoYXBwZW5lZAorICAgICAgICAvLyB0byBiZSBzZXQgZXhhY3RseSB0byB0aGUgbWluaW11bSwg
aXQncyB0b28gc21hbGwgdG8gYmUgdXNlZnVsLikgIFNvCisgICAgICAgIC8vIGlnbm9yZSBpdC4K
KyAgICAgICAgaW50IGhlaWdodDsKKyAgICAgICAgaWYgKGRlZmF1bHRMYXlvdXRIZWlnaHQgPD0g
bWluaW11bUxheW91dFNpemUuaGVpZ2h0KCkpCisgICAgICAgICAgICBoZWlnaHQgPSBtYXhIZWln
aHQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGhlaWdodCA9IGNlaWxmKHN0YXRpY19jYXN0
PGZsb2F0Pih3aWR0aCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oZGVmYXVsdExheW91dFdpZHRoKSAq
IHN0YXRpY19jYXN0PGZsb2F0PihkZWZhdWx0TGF5b3V0SGVpZ2h0KSk7CisgICAgICAgIHJldHVy
biBJbnRTaXplKHdpZHRoLCBoZWlnaHQpOworICAgIH0KKworICAgIGlmIChtX3ZpZXdNb2RlID09
IERlc2t0b3ApIHsKKyAgICAgICAgLy8gSWYgd2UgZGV0ZWN0IGFuIG92ZXJmbG93IGxhcmdlciB0
aGFuIHRoZSBjb250ZW50cyBzaXplIHRoZW4gdXNlIHRoYXQgaW5zdGVhZCBzaW5jZQorICAgICAg
ICAvLyBpdCdsbCBzdGlsbCBiZSBjbGFtcGVkIGJ5IHRoZSBtYXhXaWR0aCBiZWxvdy4uLgorICAg
ICAgICBpbnQgd2lkdGggPSBzdGQ6Om1heChhYnNvbHV0ZVZpc2libGVPdmVyZmxvd1NpemUoKS53
aWR0aCgpLCBjb250ZW50c1NpemUoKS53aWR0aCgpKTsKKworICAgICAgICBpZiAoc25hcFRvSW5j
cmVtZW50KSB7CisgICAgICAgICAgICAvLyBTbmFwIHRvIGluY3JlbWVudHMgb2YgZGVmYXVsdExh
eW91dFdpZHRoIC8gMi4wLgorICAgICAgICAgICAgZmxvYXQgZmFjdG9yID0gc3RhdGljX2Nhc3Q8
ZmxvYXQ+KHdpZHRoKSAvIChkZWZhdWx0TGF5b3V0V2lkdGggLyAyLjApOworICAgICAgICAgICAg
ZmFjdG9yID0gY2VpbGYoZmFjdG9yKTsKKyAgICAgICAgICAgIHdpZHRoID0gKGRlZmF1bHRMYXlv
dXRXaWR0aCAvIDIuMCkgKiBmYWN0b3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2lkdGgg
PCBtaW5XaWR0aCkKKyAgICAgICAgICAgIHdpZHRoID0gbWluV2lkdGg7CisgICAgICAgIGlmICh3
aWR0aCA+IG1heFdpZHRoKQorICAgICAgICAgICAgd2lkdGggPSBtYXhXaWR0aDsKKyAgICAgICAg
aW50IGhlaWdodCA9IGNlaWxmKHN0YXRpY19jYXN0PGZsb2F0Pih3aWR0aCkgLyBzdGF0aWNfY2Fz
dDxmbG9hdD4oZGVmYXVsdExheW91dFdpZHRoKSAqIHN0YXRpY19jYXN0PGZsb2F0PihkZWZhdWx0
TGF5b3V0SGVpZ2h0KSk7CisgICAgICAgIHJldHVybiBJbnRTaXplKHdpZHRoLCBoZWlnaHQpOwor
ICAgIH0KKworICAgIGlmIChtX3dlYlNldHRpbmdzLT5pc1pvb21Ub0ZpdE9uTG9hZCgpKSB7Cisg
ICAgICAgIC8vIFdlIG5lZWQgdG8gY2xhbXAgdGhlIGxheW91dCB3aWR0aCB0byB0aGUgbWluaW11
bSBvZiB0aGUgbGF5b3V0CisgICAgICAgIC8vIHdpZHRoIG9yIHRoZSBjb250ZW50IHdpZHRoLiBU
aGlzIGlzIGltcG9ydGFudCB1bmRlciByb3RhdGlvbiBmb3IgbW9iaWxlCisgICAgICAgIC8vIHdl
YnNpdGVzLiBXZSB3YW50IHRoZSBwYWdlIHRvIHJlbWFpbiBsYXlvdXRlZCBhdCB0aGUgc2FtZSB3
aWR0aCB3aGljaAorICAgICAgICAvLyBpdCB3YXMgbG9hZGVkIHdpdGgsIGFuZCBpbnN0ZWFkIGNo
YW5nZSB0aGUgem9vbSBsZXZlbCB0byBmaXQgdG8gc2NyZWVuLgorICAgICAgICAvLyBUaGUgaGVp
Z2h0IGlzIHdlbGNvbWUgdG8gYWRhcHQgdG8gdGhlIGhlaWdodCB1c2VkIGluIHRoZSBuZXcgb3Jp
ZW50YXRpb24sCisgICAgICAgIC8vIG90aGVyd2lzZSB3ZSB3aWxsIGdldCBhIGdyZXkgYmFyIGJl
bG93IHRoZSB3ZWIgcGFnZS4KKyAgICAgICAgaWYgKG1fbWFpbkZyYW1lLT52aWV3KCkgJiYgIWNv
bnRlbnRzU2l6ZSgpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIG1pbldpZHRoID0gY29udGVudHNT
aXplKCkud2lkdGgoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSBp
cyBubyBjb250ZW50cyB3aWR0aCwgdXNlIHRoZSBtaW5pbXVtIG9mIHNjcmVlbiB3aWR0aAorICAg
ICAgICAgICAgLy8gYW5kIGxheW91dCB3aWR0aCB0byBzaGFwZSB0aGUgZmlyc3QgbGF5b3V0IHRv
IGEgY29udGVudHMgd2lkdGgKKyAgICAgICAgICAgIC8vIHRoYXQgd2UgY291bGQgcmVhc29uYWJs
eSB6b29tIHRvIGZpdCwgaW4gYSBtYW5uZXIgdGhhdCB0YWtlcworICAgICAgICAgICAgLy8gb3Jp
ZW50YXRpb24gaW50byBhY2NvdW50IGFuZCBzdGlsbCByZXNwZWN0cyBhIHNtYWxsIGRlZmF1bHQK
KyAgICAgICAgICAgIC8vIGxheW91dCB3aWR0aC4KKyNpZiBFTkFCTEUoT1JJRU5UQVRJT05fRVZF
TlRTKQorICAgICAgICAgICAgbWluV2lkdGggPSBtX21haW5GcmFtZS0+b3JpZW50YXRpb24oKSAl
IDE4MAorICAgICAgICAgICAgICAgID8gUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OmhlaWdo
dCgpCisgICAgICAgICAgICAgICAgOiBQbGF0Zm9ybTo6R3JhcGhpY3M6OlNjcmVlbjo6d2lkdGgo
KTsKKyNlbHNlCisgICAgICAgICAgICBtaW5XaWR0aCA9IFBsYXRmb3JtOjpHcmFwaGljczo6U2Ny
ZWVuOjp3aWR0aCgpOworI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gSW50
U2l6ZShzdGQ6Om1pbihtaW5XaWR0aCwgZGVmYXVsdExheW91dFdpZHRoKSwgZGVmYXVsdExheW91
dEhlaWdodCk7Cit9CisKK0JhY2tpbmdTdG9yZUNsaWVudCogV2ViUGFnZVByaXZhdGU6OmJhY2tp
bmdTdG9yZUNsaWVudEZvckZyYW1lKGNvbnN0IEZyYW1lKiBmcmFtZSkgY29uc3QKK3sKKyAgICBB
U1NFUlQoZnJhbWUpOworICAgIEJhY2tpbmdTdG9yZUNsaWVudCogYmFja2luZ1N0b3JlQ2xpZW50
ID0gMDsKKyAgICBpZiAobV9iYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZU1hcC5jb250YWlucyhm
cmFtZSkpCisgICAgICAgIGJhY2tpbmdTdG9yZUNsaWVudCA9IG1fYmFja2luZ1N0b3JlQ2xpZW50
Rm9yRnJhbWVNYXAuZ2V0KGZyYW1lKTsKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlQ2xpZW50Owor
fQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjphZGRCYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZShj
b25zdCBGcmFtZSogZnJhbWUsIEJhY2tpbmdTdG9yZUNsaWVudCogY2xpZW50KQoreworICAgIEFT
U0VSVChmcmFtZSk7CisgICAgQVNTRVJUKGNsaWVudCk7CisgICAgbV9iYWNraW5nU3RvcmVDbGll
bnRGb3JGcmFtZU1hcC5hZGQoZnJhbWUsIGNsaWVudCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZh
dGU6OnJlbW92ZUJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKGNvbnN0IEZyYW1lKiBmcmFtZSkK
K3sKKyAgICBBU1NFUlQoZnJhbWUpOworICAgIGlmIChtX2JhY2tpbmdTdG9yZUNsaWVudEZvckZy
YW1lTWFwLmNvbnRhaW5zKGZyYW1lKSkKKyAgICAgICAgbV9iYWNraW5nU3RvcmVDbGllbnRGb3JG
cmFtZU1hcC5yZW1vdmUoZnJhbWUpOworfQorCisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmNsZWFy
RG9jdW1lbnREYXRhKGNvbnN0IERvY3VtZW50KiBkb2N1bWVudEdvaW5nQXdheSkKK3sKKyAgICBB
U1NFUlQoZG9jdW1lbnRHb2luZ0F3YXkpOworICAgIGlmIChtX2N1cnJlbnRDb250ZXh0Tm9kZSAm
JiBtX2N1cnJlbnRDb250ZXh0Tm9kZS0+ZG9jdW1lbnQoKSA9PSBkb2N1bWVudEdvaW5nQXdheSkK
KyAgICAgICAgbV9jdXJyZW50Q29udGV4dE5vZGUgPSAwOworCisgICAgaWYgKG1fY3VycmVudFBp
bmNoWm9vbU5vZGUgJiYgbV9jdXJyZW50UGluY2hab29tTm9kZS0+ZG9jdW1lbnQoKSA9PSBkb2N1
bWVudEdvaW5nQXdheSkKKyAgICAgICAgbV9jdXJyZW50UGluY2hab29tTm9kZSA9IDA7CisKKyAg
ICBpZiAobV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlICYmIG1fY3VycmVudEJsb2NrWm9v
bUFkanVzdGVkTm9kZS0+ZG9jdW1lbnQoKSA9PSBkb2N1bWVudEdvaW5nQXdheSkKKyAgICAgICAg
bV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlID0gMDsKKworICAgIGlmIChtX2luUmVnaW9u
U2Nyb2xsU3RhcnRpbmdOb2RlICYmIG1faW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGUtPmRvY3Vt
ZW50KCkgPT0gZG9jdW1lbnRHb2luZ0F3YXkpCisgICAgICAgIG1faW5SZWdpb25TY3JvbGxTdGFy
dGluZ05vZGUgPSAwOworCisgICAgTm9kZSogbm9kZVVuZGVyRmF0RmluZ2VyID0gbV90b3VjaEV2
ZW50SGFuZGxlci0+bGFzdEZhdEZpbmdlcnNSZXN1bHQoKS5ub2RlKCk7CisgICAgaWYgKG5vZGVV
bmRlckZhdEZpbmdlciAmJiBub2RlVW5kZXJGYXRGaW5nZXItPmRvY3VtZW50KCkgPT0gZG9jdW1l
bnRHb2luZ0F3YXkpCisgICAgICAgIG1fdG91Y2hFdmVudEhhbmRsZXItPnJlc2V0TGFzdEZhdEZp
bmdlcnNSZXN1bHQoKTsKKworICAgIC8vIE5PVEU6IG1fZnVsbHNjcmVlblZpZGVvTm9kZSwgbV9m
dWxsU2NyZWVuUGx1Z2luVmlldyBhbmQgbV9wbHVnaW5WaWV3cworICAgIC8vIGFyZSBjbGVhcmVk
IGluIG90aGVyIG1ldGhvZHMgYWxyZWFkeS4KK30KKwordHlwZWRlZiBib29sICgqUHJlZGljYXRl
RnVuY3Rpb24pKFJlbmRlckxheWVyKik7CitzdGF0aWMgYm9vbCBpc1Bvc2l0aW9uZWRDb250YWlu
ZXIoUmVuZGVyTGF5ZXIqIGxheWVyKQoreworICAgIFJlbmRlck9iamVjdCogbyA9IGxheWVyLT5y
ZW5kZXJlcigpOworICAgIHJldHVybiBvLT5pc1JlbmRlclZpZXcoKSB8fCBvLT5pc1Bvc2l0aW9u
ZWQoKSB8fCBvLT5pc1JlbFBvc2l0aW9uZWQoKSB8fCBsYXllci0+aGFzVHJhbnNmb3JtKCk7Cit9
CisKK3N0YXRpYyBib29sIGlzTm9uUmVuZGVyVmlld0ZpeGVkUG9zaXRpb25lZENvbnRhaW5lcihS
ZW5kZXJMYXllciogbGF5ZXIpCit7CisgICAgUmVuZGVyT2JqZWN0KiBvID0gbGF5ZXItPnJlbmRl
cmVyKCk7CisgICAgaWYgKG8tPmlzUmVuZGVyVmlldygpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICByZXR1cm4gby0+aXNQb3NpdGlvbmVkKCkgJiYgby0+c3R5bGUoKS0+cG9zaXRpb24o
KSA9PSBGaXhlZFBvc2l0aW9uOworfQorCitzdGF0aWMgYm9vbCBpc0ZpeGVkUG9zaXRpb25lZENv
bnRhaW5lcihSZW5kZXJMYXllciogbGF5ZXIpCit7CisgICAgUmVuZGVyT2JqZWN0KiBvID0gbGF5
ZXItPnJlbmRlcmVyKCk7CisgICAgcmV0dXJuIG8tPmlzUmVuZGVyVmlldygpIHx8IChvLT5pc1Bv
c2l0aW9uZWQoKSAmJiBvLT5zdHlsZSgpLT5wb3NpdGlvbigpID09IEZpeGVkUG9zaXRpb24pOwor
fQorCitzdGF0aWMgUmVuZGVyTGF5ZXIqIGZpbmRBbmNlc3Rvck9yU2VsZk5vdE1hdGNoaW5nKFBy
ZWRpY2F0ZUZ1bmN0aW9uIHByZWRpY2F0ZSwgUmVuZGVyTGF5ZXIqIGxheWVyKQoreworICAgIFJl
bmRlckxheWVyKiBjdXJyID0gbGF5ZXI7CisgICAgd2hpbGUgKGN1cnIgJiYgIXByZWRpY2F0ZShj
dXJyKSkKKyAgICAgICAgY3VyciA9IGN1cnItPnBhcmVudCgpOworCisgICAgcmV0dXJuIGN1cnI7
Cit9CisKK1JlbmRlckxheWVyKiBXZWJQYWdlUHJpdmF0ZTo6ZW5jbG9zaW5nRml4ZWRQb3NpdGlv
bmVkQW5jZXN0b3JPclNlbGZJZkZpeGVkUG9zaXRpb25lZChSZW5kZXJMYXllciogbGF5ZXIpCit7
CisgICAgcmV0dXJuIGZpbmRBbmNlc3Rvck9yU2VsZk5vdE1hdGNoaW5nKCZpc0ZpeGVkUG9zaXRp
b25lZENvbnRhaW5lciwgbGF5ZXIpOworfQorCitSZW5kZXJMYXllciogV2ViUGFnZVByaXZhdGU6
OmVuY2xvc2luZ1Bvc2l0aW9uZWRBbmNlc3Rvck9yU2VsZklmUG9zaXRpb25lZChSZW5kZXJMYXll
ciogbGF5ZXIpCit7CisgICAgcmV0dXJuIGZpbmRBbmNlc3Rvck9yU2VsZk5vdE1hdGNoaW5nKCZp
c1Bvc2l0aW9uZWRDb250YWluZXIsIGxheWVyKTsKK30KKworc3RhdGljIGlubGluZSBGcmFtZSog
ZnJhbWVGb3JOb2RlKE5vZGUqIG5vZGUpCit7CisgICAgTm9kZSogb3JpZ05vZGUgPSBub2RlOwor
ICAgIGZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+cGFyZW50Tm9kZSgpKSB7CisgICAgICAgIGlm
IChSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKSkgeworICAgICAgICAg
ICAgaWYgKHJlbmRlcmVyLT5pc1JlbmRlclZpZXcoKSkgeworICAgICAgICAgICAgICAgIGlmIChG
cmFtZVZpZXcqIHZpZXcgPSB0b1JlbmRlclZpZXcocmVuZGVyZXIpLT5mcmFtZVZpZXcoKSkgewor
ICAgICAgICAgICAgICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gdmlldy0+ZnJhbWUoKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZTsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVuZGVyZXItPmlzV2lkZ2V0KCkpIHsKKyAg
ICAgICAgICAgICAgICBXaWRnZXQqIHdpZGdldCA9IHRvUmVuZGVyV2lkZ2V0KHJlbmRlcmVyKS0+
d2lkZ2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHdpZGdldCAmJiB3aWRnZXQtPmlzRnJhbWVW
aWV3KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEZyYW1lKiBmcmFtZSA9IHN0YXRpY19j
YXN0PEZyYW1lVmlldyo+KHdpZGdldCktPmZyYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gZnJhbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgfQorCisgICAgZm9yIChub2RlID0gb3JpZ05vZGU7IG5vZGU7IG5vZGUgPSBub2Rl
LT5wYXJlbnROb2RlKCkpIHsKKyAgICAgICAgaWYgKERvY3VtZW50KiBkb2MgPSBub2RlLT5kb2N1
bWVudCgpKSB7CisgICAgICAgICAgICBpZiAoRnJhbWUqIGZyYW1lID0gZG9jLT5mcmFtZSgpKQor
ICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJl
dHVybiAwOworfQorCitzdGF0aWMgSW50UmVjdCBnZXROb2RlV2luZG93UmVjdChOb2RlKiBub2Rl
KQoreworICAgIGlmIChGcmFtZSogZnJhbWUgPSBmcmFtZUZvck5vZGUobm9kZSkpIHsKKyAgICAg
ICAgaWYgKEZyYW1lVmlldyogdmlldyA9IGZyYW1lLT52aWV3KCkpCisgICAgICAgICAgICByZXR1
cm4gdmlldy0+Y29udGVudHNUb1dpbmRvdyhub2RlLT5nZXRSZWN0KCkpOworICAgIH0KKyAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gSW50UmVjdCgpOworfQorCitJbnRSZWN0
IFdlYlBhZ2VQcml2YXRlOjpnZXRSZWN1cnNpdmVWaXNpYmxlV2luZG93UmVjdChTY3JvbGxWaWV3
KiB2aWV3LCBib29sIG5vQ2xpcE9mTWFpbkZyYW1lKQoreworICAgIEFTU0VSVChtX21haW5GcmFt
ZSk7CisKKyAgICAvLyBEb24ndCBjYWxsIHRoaXMgZnVuY3Rpb24gYXNraW5nIHRvIG5vdCBjbGlw
IHRoZSBtYWluIGZyYW1lIHByb3ZpZGluZyBvbmx5CisgICAgLy8gdGhlIG1haW4gZnJhbWUuIEFs
bCB0aGF0IGNhbiBiZSByZXR1cm5lZCBpcyB0aGUgY29udGVudCByZWN0IHdoaWNoCisgICAgLy8g
aXNuJ3Qgd2hhdCB0aGlzIGZ1bmN0aW9uIGlzIGZvci4KKyAgICBpZiAobm9DbGlwT2ZNYWluRnJh
bWUgJiYgdmlldyA9PSBtX21haW5GcmFtZS0+dmlldygpKSB7CisgICAgICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gSW50UmVjdChJbnRQb2ludDo6emVybygpLCB2aWV3
LT5jb250ZW50c1NpemUoKSk7CisgICAgfQorCisgICAgSW50UmVjdCB2aXNpYmxlV2luZG93UmVj
dCh2aWV3LT5jb250ZW50c1RvV2luZG93KHZpZXctPnZpc2libGVDb250ZW50UmVjdChmYWxzZSkp
KTsKKyAgICBpZiAodmlldy0+cGFyZW50KCkgJiYgIShub0NsaXBPZk1haW5GcmFtZSAmJiB2aWV3
LT5wYXJlbnQoKSA9PSBtX21haW5GcmFtZS0+dmlldygpKSkgeworICAgICAgICAvLyBJbnRlcnNl
Y3Qgd2l0aCBwYXJlbnQgdmlzaWJsZSByZWN0LgorICAgICAgICB2aXNpYmxlV2luZG93UmVjdC5p
bnRlcnNlY3QoZ2V0UmVjdXJzaXZlVmlzaWJsZVdpbmRvd1JlY3Qodmlldy0+cGFyZW50KCksIG5v
Q2xpcE9mTWFpbkZyYW1lKSk7CisgICAgfQorICAgIHJldHVybiB2aXNpYmxlV2luZG93UmVjdDsK
K30KKwordm9pZCBXZWJQYWdlOjphc3NpZ25Gb2N1cyhQbGF0Zm9ybTo6Rm9jdXNEaXJlY3Rpb24g
ZGlyZWN0aW9uKQoreworICAgIGQtPmFzc2lnbkZvY3VzKGRpcmVjdGlvbik7Cit9CisKK3ZvaWQg
V2ViUGFnZVByaXZhdGU6OmFzc2lnbkZvY3VzKFBsYXRmb3JtOjpGb2N1c0RpcmVjdGlvbiBkaXJl
Y3Rpb24pCit7CisgICAgQVNTRVJUKChpbnQpIFBsYXRmb3JtOjpGb2N1c0RpcmVjdGlvbk5vbmUg
PT0gKGludCkgRm9jdXNEaXJlY3Rpb25Ob25lKTsKKyAgICBBU1NFUlQoKGludCkgUGxhdGZvcm06
OkZvY3VzRGlyZWN0aW9uRm9yd2FyZCA9PSAoaW50KSBGb2N1c0RpcmVjdGlvbkZvcndhcmQpOwor
ICAgIEFTU0VSVCgoaW50KSBQbGF0Zm9ybTo6Rm9jdXNEaXJlY3Rpb25CYWNrd2FyZCA9PSAoaW50
KSBGb2N1c0RpcmVjdGlvbkJhY2t3YXJkKTsKKworICAgIC8vIEZpcnN0IHdlIGNsZWFyIHRoZSBm
b2N1cywgc2luY2Ugd2Ugd2FudCB0byBmb2N1cyBlaXRoZXIgaW5pdGlhbCBvciB0aGUgbGFzdAor
ICAgIC8vIGZvY3VzYWJsZSBlbGVtZW50IGluIHRoZSB3ZWJwYWdlIChhY2NvcmRpbmcgdG8gdGhl
IFRBQklOREVYKSwgb3Igc2ltcGx5IGNsZWFyCisgICAgLy8gdGhlIGZvY3VzLgorICAgIGNsZWFy
Rm9jdXNOb2RlKCk7CisKKyAgICBzd2l0Y2ggKGRpcmVjdGlvbikgeworICAgIGNhc2UgRm9jdXNE
aXJlY3Rpb25Gb3J3YXJkOgorICAgIGNhc2UgRm9jdXNEaXJlY3Rpb25CYWNrd2FyZDoKKyAgICAg
ICAgbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+c2V0SW5pdGlhbEZvY3VzKChGb2N1c0RpcmVj
dGlvbikgZGlyZWN0aW9uLCAwKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb2N1c0RpcmVj
dGlvbk5vbmU6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworICAgIH0KK30KKworUGxhdGZvcm06OkludFJlY3QgV2ViUGFnZVByaXZh
dGU6OmZvY3VzTm9kZVJlY3QoKQoreworICAgIEZyYW1lKiBmcmFtZSA9IGZvY3VzZWRPck1haW5G
cmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVj
dCgpOworCisgICAgRG9jdW1lbnQqIGRvYyA9IGZyYW1lLT5kb2N1bWVudCgpOworICAgIEZyYW1l
VmlldyogdmlldyA9IGZyYW1lLT52aWV3KCk7CisgICAgaWYgKCFkb2MgfHwgIXZpZXcgfHwgdmll
dy0+bmVlZHNMYXlvdXQoKSkKKyAgICAgICAgcmV0dXJuIFBsYXRmb3JtOjpJbnRSZWN0KCk7CisK
KyAgICBJbnRSZWN0IGZvY3VzUmVjdCA9IHJlY3RGb3JOb2RlKGRvYy0+Zm9jdXNlZE5vZGUoKSk7
CisgICAgZm9jdXNSZWN0ID0gYWRqdXN0UmVjdE9mZnNldEZvckZyYW1lT2Zmc2V0KGZvY3VzUmVj
dCwgZG9jLT5mb2N1c2VkTm9kZSgpKTsKKyAgICBmb2N1c1JlY3QgPSBtYXBUb1RyYW5zZm9ybWVk
KGZvY3VzUmVjdCk7CisgICAgY2xpcFRvVHJhbnNmb3JtZWRDb250ZW50c1JlY3QoZm9jdXNSZWN0
KTsKKyAgICByZXR1cm4gZm9jdXNSZWN0OworfQorCitQYXNzUmVmUHRyPE5vZGU+IFdlYlBhZ2VQ
cml2YXRlOjpjb250ZXh0Tm9kZShUYXJnZXREZXRlY3Rpb25TdHJhdGVneSBzdHJhdGVneSkKK3sK
KyAgICBFdmVudEhhbmRsZXIqIGV2ZW50SGFuZGxlciA9IGZvY3VzZWRPck1haW5GcmFtZSgpLT5l
dmVudEhhbmRsZXIoKTsKKyAgICBjb25zdCBGYXRGaW5nZXJzUmVzdWx0IGxhc3RGYXRGaW5nZXJz
UmVzdWx0ID0gbV90b3VjaEV2ZW50SGFuZGxlci0+bGFzdEZhdEZpbmdlcnNSZXN1bHQoKTsKKyAg
ICBib29sIGlzVG91Y2hpbmcgPSBsYXN0RmF0RmluZ2Vyc1Jlc3VsdC5pc1ZhbGlkKCkgJiYgc3Ry
YXRlZ3kgPT0gUmVjdEJhc2VkOworCisgICAgLy8gVW5wcmVzcyB0aGUgbW91c2UgYnV0dG9uIGFs
d2F5cy4KKyAgICBpZiAoZXZlbnRIYW5kbGVyLT5tb3VzZVByZXNzZWQoKSkKKyAgICAgICAgZXZl
bnRIYW5kbGVyLT5zZXRNb3VzZVByZXNzZWQoZmFsc2UpOworCisgICAgLy8gQ2hlY2sgaWYgd2Un
cmUgdXNpbmcgTGlua1RvTGluayBhbmQgdGhlIHVzZXIgaXMgbm90IHRvdWNoaW5nIHRoZSBzY3Jl
ZW4uCisgICAgaWYgKG1fd2ViU2V0dGluZ3MtPmRvZXNHZXRGb2N1c05vZGVDb250ZXh0KCkgJiYg
IWlzVG91Y2hpbmcpIHsKKyAgICAgICAgUmVmUHRyPE5vZGU+IG5vZGU7CisgICAgICAgIG5vZGUg
PSBtX3BhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+ZG9jdW1l
bnQoKS0+Zm9jdXNlZE5vZGUoKTsKKyAgICAgICAgaWYgKG5vZGUpIHsKKyAgICAgICAgICAgIElu
dFJlY3QgdmlzaWJsZVJlY3QgPSBJbnRSZWN0KEludFBvaW50KCksIGFjdHVhbFZpc2libGVTaXpl
KCkpOworICAgICAgICAgICAgaWYgKCF2aXNpYmxlUmVjdC5pbnRlcnNlY3RzKGdldE5vZGVXaW5k
b3dSZWN0KG5vZGUuZ2V0KCkpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
fQorICAgICAgICByZXR1cm4gbm9kZS5yZWxlYXNlKCk7CisgICAgfQorCisgICAgLy8gQ2hlY2sg
Zm9yIHRleHQgaW5wdXQuCisgICAgaWYgKGlzVG91Y2hpbmcgJiYgbGFzdEZhdEZpbmdlcnNSZXN1
bHQuaXNUZXh0SW5wdXQoKSkKKyAgICAgICAgcmV0dXJuIGxhc3RGYXRGaW5nZXJzUmVzdWx0Lm5v
ZGUoU2hhZG93Q29udGVudE5vdEFsbG93ZWQpOworCisgICAgSW50UG9pbnQgY29udGVudFBvczsK
KyAgICBpZiAoaXNUb3VjaGluZykKKyAgICAgICAgY29udGVudFBvcyA9IGxhc3RGYXRGaW5nZXJz
UmVzdWx0LmFkanVzdGVkUG9zaXRpb24oKTsKKyAgICBlbHNlCisgICAgICAgIGNvbnRlbnRQb3Mg
PSBtYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKG1fbGFzdE1vdXNlRXZlbnQucG9zKCkpOworCisg
ICAgaWYgKHN0cmF0ZWd5ID09IFJlY3RCYXNlZCkgeworICAgICAgICBGYXRGaW5nZXJzUmVzdWx0
IHJlc3VsdCA9IEZhdEZpbmdlcnModGhpcywgbGFzdEZhdEZpbmdlcnNSZXN1bHQuYWRqdXN0ZWRQ
b3NpdGlvbigpLCBGYXRGaW5nZXJzOjpUZXh0KS5maW5kQmVzdFBvaW50KCk7CisgICAgICAgIHJl
dHVybiByZXN1bHQubm9kZShTaGFkb3dDb250ZW50Tm90QWxsb3dlZCk7CisgICAgfQorCisgICAg
SGl0VGVzdFJlc3VsdCByZXN1bHQgPSBldmVudEhhbmRsZXItPmhpdFRlc3RSZXN1bHRBdFBvaW50
KGNvbnRlbnRQb3MsIGZhbHNlIC8qYWxsb3dTaGFkb3dDb250ZW50Ki8pOworICAgIHJldHVybiBy
ZXN1bHQuaW5uZXJOb2RlKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRpc3RhbmNlQmV0d2Vl
blBvaW50cyhJbnRQb2ludCBwMSwgSW50UG9pbnQgcDIpCit7CisgICAgLy8gQ2hhbmdlIGludCB0
byBkb3VibGUsIGJlY2F1c2UgKGR5ICogZHkpIGNhbiBjYXVzZSBpbnQgb3ZlcmZsb3cgaW4gcmVh
bGl0eSwgZS5nLCAoLTQ2NzA5ICogLTQ2NzA5KS4KKyAgICBkb3VibGUgZHggPSBzdGF0aWNfY2Fz
dDxkb3VibGU+KHAxLngoKSAtIHAyLngoKSk7CisgICAgZG91YmxlIGR5ID0gc3RhdGljX2Nhc3Q8
ZG91YmxlPihwMS55KCkgLSBwMi55KCkpOworICAgIHJldHVybiBzcXJ0KChkeCAqIGR4KSArIChk
eSAqIGR5KSk7Cit9CisKK05vZGUqIFdlYlBhZ2VQcml2YXRlOjpiZXN0Tm9kZUZvclpvb21VbmRl
clBvaW50KGNvbnN0IEludFBvaW50JiBwb2ludCkKK3sKKyAgICBJbnRQb2ludCBwdCA9IG1hcEZy
b21UcmFuc2Zvcm1lZChwb2ludCk7CisgICAgSW50UmVjdCBjbGlja1JlY3QocHQueCgpIC0gYmxv
Y2tDbGlja1JhZGl1cywgcHQueSgpIC0gYmxvY2tDbGlja1JhZGl1cywgMiAqIGJsb2NrQ2xpY2tS
YWRpdXMsIDIgKiBibG9ja0NsaWNrUmFkaXVzKTsKKyAgICBOb2RlKiBvcmlnaW5hbE5vZGUgPSBu
b2RlRm9yWm9vbVVuZGVyUG9pbnQocG9pbnQpOworICAgIGlmICghb3JpZ2luYWxOb2RlKQorICAg
ICAgICByZXR1cm4gMDsKKyAgICBOb2RlKiBub2RlID0gYmVzdENoaWxkTm9kZUZvckNsaWNrUmVj
dChvcmlnaW5hbE5vZGUsIGNsaWNrUmVjdCk7CisgICAgcmV0dXJuIG5vZGUgPyBhZGp1c3RlZEJs
b2NrWm9vbU5vZGVGb3Jab29tTGltaXRzKG5vZGUpIDogYWRqdXN0ZWRCbG9ja1pvb21Ob2RlRm9y
Wm9vbUxpbWl0cyhvcmlnaW5hbE5vZGUpOworfQorCitOb2RlKiBXZWJQYWdlUHJpdmF0ZTo6YmVz
dENoaWxkTm9kZUZvckNsaWNrUmVjdChOb2RlKiBwYXJlbnROb2RlLCBjb25zdCBJbnRSZWN0JiBj
bGlja1JlY3QpCit7CisgICAgaWYgKCFwYXJlbnROb2RlKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIGludCBiZXN0RGlzdGFuY2UgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOwor
CisgICAgTm9kZSogbm9kZSA9IHBhcmVudE5vZGUtPmZpcnN0Q2hpbGQoKTsKKyAgICBOb2RlKiBi
ZXN0Tm9kZSA9IDA7CisgICAgZm9yICg7IG5vZGU7IG5vZGUgPSBub2RlLT5uZXh0U2libGluZygp
KSB7CisgICAgICAgIEludFJlY3QgcmVjdCA9IHJlY3RGb3JOb2RlKG5vZGUpOworICAgICAgICBp
ZiAoIWNsaWNrUmVjdC5pbnRlcnNlY3RzKHJlY3QpKQorICAgICAgICAgICAgY29udGludWU7CisK
KyAgICAgICAgaW50IGRpc3RhbmNlID0gZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKHJlY3QuY2VudGVy
KCksIGNsaWNrUmVjdC5jZW50ZXIoKSk7CisgICAgICAgIE5vZGUqIGJlc3RDaGlsZE5vZGUgPSBi
ZXN0Q2hpbGROb2RlRm9yQ2xpY2tSZWN0KG5vZGUsIGNsaWNrUmVjdCk7CisgICAgICAgIGlmIChi
ZXN0Q2hpbGROb2RlKSB7CisgICAgICAgICAgICBJbnRSZWN0IGJlc3RDaGlsZFJlY3QgPSByZWN0
Rm9yTm9kZShiZXN0Q2hpbGROb2RlKTsKKyAgICAgICAgICAgIGludCBiZXN0Q2hpbGREaXN0YW5j
ZSA9IGRpc3RhbmNlQmV0d2VlblBvaW50cyhiZXN0Q2hpbGRSZWN0LmNlbnRlcigpLCBjbGlja1Jl
Y3QuY2VudGVyKCkpOworICAgICAgICAgICAgaWYgKGJlc3RDaGlsZERpc3RhbmNlIDwgZGlzdGFu
Y2UgJiYgYmVzdENoaWxkRGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHsKKyAgICAgICAgICAgICAg
ICBiZXN0Tm9kZSA9IGJlc3RDaGlsZE5vZGU7CisgICAgICAgICAgICAgICAgYmVzdERpc3RhbmNl
ID0gYmVzdENoaWxkRGlzdGFuY2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAg
ICAgIGlmIChkaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICBi
ZXN0Tm9kZSA9IG5vZGU7CisgICAgICAgICAgICAgICAgICAgIGJlc3REaXN0YW5jZSA9IGRpc3Rh
bmNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IGJlc3REaXN0YW5jZSkgeworICAgICAgICAgICAg
ICAgIGJlc3ROb2RlID0gbm9kZTsKKyAgICAgICAgICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0
YW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiZXN0
Tm9kZTsKK30KKworZG91YmxlIFdlYlBhZ2VQcml2YXRlOjptYXhCbG9ja1pvb21TY2FsZSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6bWluKG1heGltdW1CbG9ja1pvb21TY2FsZSwgbWF4aW11
bVNjYWxlKCkpOworfQorCitOb2RlKiBXZWJQYWdlUHJpdmF0ZTo6bm9kZUZvclpvb21VbmRlclBv
aW50KGNvbnN0IEludFBvaW50JiBwb2ludCkKK3sKKyAgICBpZiAoIW1fbWFpbkZyYW1lKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIEhpdFRlc3RSZXN1bHQgcmVzdWx0ID0gbV9tYWluRnJhbWUt
PmV2ZW50SGFuZGxlcigpLT5oaXRUZXN0UmVzdWx0QXRQb2ludChtYXBGcm9tVHJhbnNmb3JtZWQo
cG9pbnQpLCBmYWxzZSk7CisKKyAgICBOb2RlKiBub2RlID0gcmVzdWx0LmlubmVyTm9uU2hhcmVk
Tm9kZSgpOworCisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFJlbmRl
ck9iamVjdCogcmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpOworICAgIHdoaWxlICghcmVuZGVy
ZXIpIHsKKyAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKTsKKyAgICAgICAgcmVuZGVy
ZXIgPSBub2RlLT5yZW5kZXJlcigpOworICAgIH0KKworICAgIHJldHVybiBub2RlOworfQorCitO
b2RlKiBXZWJQYWdlUHJpdmF0ZTo6YWRqdXN0ZWRCbG9ja1pvb21Ob2RlRm9yWm9vbUxpbWl0cyhO
b2RlKiBub2RlKQoreworICAgIE5vZGUqIGluaXRpYWxOb2RlID0gbm9kZTsKKyAgICBSZW5kZXJP
YmplY3QqIHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKTsKKyAgICBib29sIGFjY2VwdGFibGVO
b2RlU2l6ZSA9IG5ld1NjYWxlRm9yQmxvY2tab29tUmVjdChyZWN0Rm9yTm9kZShub2RlKSwgMS4w
LCAwKSA8IG1heEJsb2NrWm9vbVNjYWxlKCk7CisKKyAgICB3aGlsZSAoIXJlbmRlcmVyIHx8ICFh
Y2NlcHRhYmxlTm9kZVNpemUpIHsKKyAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudE5vZGUoKTsK
KworICAgICAgICBpZiAoIW5vZGUpCisgICAgICAgICAgICByZXR1cm4gaW5pdGlhbE5vZGU7CisK
KyAgICAgICAgcmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpOworICAgICAgICBhY2NlcHRhYmxl
Tm9kZVNpemUgPSBuZXdTY2FsZUZvckJsb2NrWm9vbVJlY3QocmVjdEZvck5vZGUobm9kZSksIDEu
MCwgMCkgPCBtYXhCbG9ja1pvb21TY2FsZSgpOworICAgIH0KKworICAgIHJldHVybiBub2RlOwor
fQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpjb21wYXJlTm9kZXNGb3JCbG9ja1pvb20oTm9kZSog
bjEsIE5vZGUqIG4yKQoreworICAgIGlmICghbjEgfHwgIW4yKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICByZXR1cm4gKG4yID09IG4xKSB8fCBuMi0+aXNEZXNjZW5kYW50T2YobjEpOwor
fQorCitkb3VibGUgV2ViUGFnZVByaXZhdGU6Om5ld1NjYWxlRm9yQmxvY2tab29tUmVjdChjb25z
dCBJbnRSZWN0JiByZWN0LCBkb3VibGUgb2xkU2NhbGUsIGRvdWJsZSBtYXJnaW4pCit7CisgICAg
aWYgKHJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxk
b3VibGU+OjptYXgoKTsKKworICAgIEFTU0VSVChyZWN0LndpZHRoKCkgKyBtYXJnaW4pOworCisg
ICAgZG91YmxlIG5ld1NjYWxlID0gb2xkU2NhbGUgKiBzdGF0aWNfY2FzdDxkb3VibGU+KHRyYW5z
Zm9ybWVkQWN0dWFsVmlzaWJsZVNpemUoKS53aWR0aCgpKSAvIChyZWN0LndpZHRoKCkgKyBtYXJn
aW4pOworCisgICAgcmV0dXJuIG5ld1NjYWxlOworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2YXRl
OjpyZWN0Rm9yTm9kZShOb2RlKiBub2RlKQoreworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0
dXJuIEludFJlY3QoKTsKKworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBub2RlLT5yZW5k
ZXJlcigpOworCisgICAgaWYgKCFyZW5kZXJlcikKKyAgICAgICAgcmV0dXJuIEludFJlY3QoKTsK
KworICAgIC8vIFJldHVybiByZWN0IGluIHVuLXRyYW5zZm9ybWVkIGNvbnRlbnQgY29vcmRpbmF0
ZXMuCisgICAgSW50UmVjdCBibG9ja1JlY3Q7CisKKyAgICAvLyBGSVhNRTogRW5zdXJlIHRoaXMg
d29ya3Mgd2l0aCBpZnJhbWVzLgorICAgIGlmIChtX3dlYlBhZ2UtPnNldHRpbmdzKCktPnRleHRS
ZWZsb3dNb2RlKCkgPT0gV2ViU2V0dGluZ3M6OlRleHRSZWZsb3dFbmFibGVkICYmIHJlbmRlcmVy
LT5pc1RleHQoKSkgeworICAgICAgICBSZW5kZXJCbG9jayogcmVuZGVyQmxvY2sgPSByZW5kZXJl
ci0+Y29udGFpbmluZ0Jsb2NrKCk7CisgICAgICAgIGludCB4T2Zmc2V0ID0gMDsKKyAgICAgICAg
aW50IHlPZmZzZXQgPSAwOworICAgICAgICB3aGlsZSAoIXJlbmRlckJsb2NrLT5pc1Jvb3QoKSkg
eworICAgICAgICAgICAgeE9mZnNldCArPSByZW5kZXJCbG9jay0+eCgpOworICAgICAgICAgICAg
eU9mZnNldCArPSByZW5kZXJCbG9jay0+eSgpOworICAgICAgICAgICAgcmVuZGVyQmxvY2sgPSBy
ZW5kZXJCbG9jay0+Y29udGFpbmluZ0Jsb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3Qg
UmVuZGVyVGV4dCogcmVuZGVyVGV4dCA9IHRvUmVuZGVyVGV4dChyZW5kZXJlcik7CisgICAgICAg
IEludFJlY3QgbGluZXNCb3ggPSByZW5kZXJUZXh0LT5saW5lc0JvdW5kaW5nQm94KCk7CisgICAg
ICAgIGJsb2NrUmVjdCA9IEludFJlY3QoeE9mZnNldCArIGxpbmVzQm94LngoKSwgeU9mZnNldCAr
IGxpbmVzQm94LnkoKSwgbGluZXNCb3gud2lkdGgoKSwgbGluZXNCb3guaGVpZ2h0KCkpOworICAg
IH0gZWxzZQorICAgICAgICBibG9ja1JlY3QgPSByZW5kZXJlci0+YWJzb2x1dGVDbGlwcGVkT3Zl
cmZsb3dSZWN0KCk7CisKKyAgICBpZiAocmVuZGVyZXItPmlzVGV4dCgpKSB7CisgICAgICAgIFJl
bmRlckJsb2NrKiByYiA9IHJlbmRlcmVyLT5jb250YWluaW5nQmxvY2soKTsKKworICAgICAgICAv
LyBJbmVmZmljaWVudD8gV2F5IHRvIGZpbmQgd2lkdGggd2hlbiBmbG9hdHMgaW50ZXJzZWN0IGEg
YmxvY2suCisgICAgICAgIGludCBibG9ja1dpZHRoID0gMDsKKyAgICAgICAgaW50IGxpbmVDb3Vu
dCA9IHJiLT5saW5lQ291bnQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lQ291
bnQ7IGkrKykKKyAgICAgICAgICAgIGJsb2NrV2lkdGggPSBtYXgoYmxvY2tXaWR0aCwgcmItPmF2
YWlsYWJsZUxvZ2ljYWxXaWR0aEZvckxpbmUoaSwgZmFsc2UpKTsKKworICAgICAgICBibG9ja1Jl
Y3Quc2V0V2lkdGgoYmxvY2tXaWR0aCk7CisgICAgICAgIGJsb2NrUmVjdC5zZXRYKGJsb2NrUmVj
dC54KCkgKyByYi0+bG9naWNhbExlZnRPZmZzZXRGb3JMaW5lKDEsIGZhbHNlKSk7CisgICAgfQor
CisgICAgLy8gU3RyaXAgb2ZmIHBhZGRpbmcuCisgICAgaWYgKHJlbmRlcmVyLT5zdHlsZSgpLT5o
YXNQYWRkaW5nKCkpIHsKKyAgICAgICAgYmxvY2tSZWN0LnNldFgoYmxvY2tSZWN0LngoKSArIHJl
bmRlcmVyLT5zdHlsZSgpLT5wYWRkaW5nTGVmdCgpLnZhbHVlKCkpOworICAgICAgICBibG9ja1Jl
Y3Quc2V0WShibG9ja1JlY3QueSgpICsgcmVuZGVyZXItPnN0eWxlKCktPnBhZGRpbmdUb3AoKS52
YWx1ZSgpKTsKKyAgICAgICAgYmxvY2tSZWN0LnNldFdpZHRoKGJsb2NrUmVjdC53aWR0aCgpIC0g
cmVuZGVyZXItPnN0eWxlKCktPnBhZGRpbmdSaWdodCgpLnZhbHVlKCkpOworICAgICAgICBibG9j
a1JlY3Quc2V0SGVpZ2h0KGJsb2NrUmVjdC5oZWlnaHQoKSAtIHJlbmRlcmVyLT5zdHlsZSgpLT5w
YWRkaW5nQm90dG9tKCkudmFsdWUoKSk7CisgICAgfQorCisgICAgcmV0dXJuIGJsb2NrUmVjdDsK
K30KKworSW50UG9pbnQgV2ViUGFnZVByaXZhdGU6OmZyYW1lT2Zmc2V0KGNvbnN0IEZyYW1lKiBm
cmFtZSkgY29uc3QKK3sKKyAgICBBU1NFUlQoZnJhbWUpOworCisgICAgLy8gRklYTUU6IFRoaXMg
ZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB3aGVuIHBhZ2UgaXMgYmVpbmcgZGVzdHJveWVkIGFuZCBK
UyB0cmlnZ2VycyBzZWxlY3Rpb24gY2hhbmdlLgorICAgIC8vIFdlIGNvdWxkIGJyZWFrIHRoZSBj
YWxsIGNoYWluIGF0IHVwcGVyIGxldmVscywgYnV0IEkgdGhpbmsgaXQgaXMgYmV0dGVyIHRvIGNo
ZWNrIHRoZSBmcmFtZSBwb2ludGVyCisgICAgLy8gaGVyZSBiZWNhdXNlIHRoZSBwb2ludGVyIGlz
IGV4cGxpY2l0bHkgY2xlYXJlZCBpbiBXZWJQYWdlOjpkZXN0cm95KCkuCisgICAgaWYgKCFtYWlu
RnJhbWUoKSkKKyAgICAgICAgcmV0dXJuIEludFBvaW50KCk7CisKKyAgICAvLyBDb252ZXJ0IDAs
MCBpbiB0aGUgZnJhbWUncyBjb29yZGluYXRlIHN5c3RlbSB0byB3aW5kb3cgY29vcmRpbmF0ZXMg
dG8KKyAgICAvLyBnZXQgdGhlIGZyYW1lJ3MgZ2xvYmFsIHBvc2l0aW9uLCBhbmQgcmV0dXJuIHRo
aXMgcG9zaXRpb24gaW4gdGhlIG1haW4KKyAgICAvLyBmcmFtZSdzIGNvb3JkaW5hdGVzLiAgKFNv
IHRoZSBtYWluIGZyYW1lJ3MgY29vcmRpbmF0ZXMgd2lsbCBiZSAwLDAuKQorICAgIHJldHVybiBt
YWluRnJhbWUoKS0+dmlldygpLT53aW5kb3dUb0NvbnRlbnRzKGZyYW1lLT52aWV3KCktPmNvbnRl
bnRzVG9XaW5kb3coSW50UG9pbnQ6Onplcm8oKSkpOworfQorCitJbnRSZWN0IFdlYlBhZ2VQcml2
YXRlOjphZGp1c3RSZWN0T2Zmc2V0Rm9yRnJhbWVPZmZzZXQoY29uc3QgSW50UmVjdCYgcmVjdCwg
Y29uc3QgTm9kZSogbm9kZSkKK3sKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJldHVybiByZWN0
OworCisgICAgLy8gQWRqdXN0IHRoZSBvZmZzZXQgb2YgdGhlIHJlY3QgaWYgaXQgaXMgaW4gYW4g
aUZyYW1lL2ZyYW1lIG9yIHNldCBvZiBpRnJhbWVzL2ZyYW1lcy4KKyAgICAvLyBGSVhNRTogY2Fu
IHdlIGp1c3QgdXNlIGZyYW1lT2Zmc2V0IGluc3RlYWQgb2YgdGhpcyBiaWcgcm91dGluZT8KKyAg
ICBjb25zdCBOb2RlKiB0bm9kZSA9IG5vZGU7CisgICAgSW50UmVjdCBhZGp1c3RlZFJlY3QgPSBy
ZWN0OworICAgIGRvIHsKKyAgICAgICAgRnJhbWUqIGZyYW1lID0gdG5vZGUtPmRvY3VtZW50KCkt
PmZyYW1lKCk7CisgICAgICAgIGlmICghZnJhbWUpCisgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICBOb2RlKiBvd25lck5vZGUgPSBzdGF0aWNfY2FzdDxOb2RlKj4oZnJhbWUtPm93bmVy
RWxlbWVudCgpKTsKKyAgICAgICAgdG5vZGUgPSBvd25lck5vZGU7CisgICAgICAgIGlmIChvd25l
ck5vZGUgJiYgKG93bmVyTm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmlmcmFtZVRhZykgfHwg
b3duZXJOb2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6ZnJhbWVUYWcpKSkgeworICAgICAgICAg
ICAgSW50UmVjdCBpRnJhbWVSZWN0OworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAg
IGlGcmFtZVJlY3QgPSByZWN0Rm9yTm9kZShvd25lck5vZGUpOworICAgICAgICAgICAgICAgIGFk
anVzdGVkUmVjdC5tb3ZlKGlGcmFtZVJlY3QueCgpLCBpRnJhbWVSZWN0LnkoKSk7CisgICAgICAg
ICAgICAgICAgYWRqdXN0ZWRSZWN0LmludGVyc2VjdChpRnJhbWVSZWN0KTsKKyAgICAgICAgICAg
ICAgICBvd25lck5vZGUgPSBvd25lck5vZGUtPnBhcmVudE5vZGUoKTsKKyAgICAgICAgICAgIH0g
d2hpbGUgKGlGcmFtZVJlY3QuaXNFbXB0eSgpICYmIG93bmVyTm9kZSk7CisgICAgICAgIH0gZWxz
ZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfSB3aGlsZSAodG5vZGUgPSB0bm9kZS0+cGFyZW50
Tm9kZSgpKTsKKworICAgIHJldHVybiBhZGp1c3RlZFJlY3Q7Cit9CisKK0ludFJlY3QgV2ViUGFn
ZVByaXZhdGU6OmJsb2NrWm9vbVJlY3RGb3JOb2RlKE5vZGUqIG5vZGUpCit7CisgICAgaWYgKCFu
b2RlIHx8IGNvbnRlbnRzU2l6ZSgpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIEludFJlY3Qo
KTsKKworICAgIE5vZGUqIHRub2RlID0gbm9kZTsKKyAgICBtX2N1cnJlbnRCbG9ja1pvb21BZGp1
c3RlZE5vZGUgPSB0bm9kZTsKKworICAgIEludFJlY3QgYmxvY2tSZWN0ID0gcmVjdEZvck5vZGUo
dG5vZGUpOworICAgIEludFJlY3Qgb3JpZ2luYWxSZWN0ID0gYmxvY2tSZWN0OworCisgICAgaW50
IG9yaWdpbmFsQXJlYSA9IG9yaWdpbmFsUmVjdC53aWR0aCgpICogb3JpZ2luYWxSZWN0LmhlaWdo
dCgpOworICAgIGludCBwYWdlQXJlYSA9IGNvbnRlbnRzU2l6ZSgpLndpZHRoKCkgKiBjb250ZW50
c1NpemUoKS5oZWlnaHQoKTsKKyAgICBkb3VibGUgYmxvY2tUb1BhZ2VSYXRpbyA9IHN0YXRpY19j
YXN0PGRvdWJsZT4oMSAtIG9yaWdpbmFsQXJlYSAvIHBhZ2VBcmVhKTsKKyAgICBkb3VibGUgYmxv
Y2tFeHBhbnNpb25SYXRpbyA9IDUuMCAqIGJsb2NrVG9QYWdlUmF0aW8gKiBibG9ja1RvUGFnZVJh
dGlvOworCisgICAgaWYgKCF0bm9kZS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmltZ1RhZykgJiYg
IXRub2RlLT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6aW5wdXRUYWcpICYmICF0bm9kZS0+aGFzVGFn
TmFtZShIVE1MTmFtZXM6OnRleHRhcmVhVGFnKSkgeworICAgICAgICB3aGlsZSAodG5vZGUgPSB0
bm9kZS0+cGFyZW50Tm9kZSgpKSB7CisgICAgICAgICAgICBBU1NFUlQodG5vZGUpOworICAgICAg
ICAgICAgSW50UmVjdCB0UmVjdCA9IHJlY3RGb3JOb2RlKHRub2RlKTsKKyAgICAgICAgICAgIGlu
dCB0ZW1wQmxvY2tBcmVhID0gdFJlY3Qud2lkdGgoKSAqIHRSZWN0LmhlaWdodCgpOworICAgICAg
ICAgICAgLy8gRG9uJ3QgZXhwYW5kIHRoZSBibG9jayBpZiBpdCB3aWxsIGJlIHRvbyBsYXJnZSBy
ZWxhdGl2ZSB0byB0aGUgY29udGVudC4KKyAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxkb3Vi
bGU+KDEgLSB0ZW1wQmxvY2tBcmVhIC8gcGFnZUFyZWEpIDwgbWluaW11bUV4cGFuZGluZ1JhdGlv
KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHRSZWN0LmlzRW1wdHko
KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gTm8gcmVuZGVyZXIuCisgICAgICAgICAg
ICBpZiAodGVtcEJsb2NrQXJlYSA8IDEuMSAqIG9yaWdpbmFsQXJlYSkKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsgLy8gVGhlIHNpemUgb2YgdGhpcyBwYXJlbnQgaXMgdmVyeSBjbG9zZSB0byB0
aGUgY2hpbGQsIG5vIG5lZWQgdG8gZ28gdG8gdGhpcyBwYXJlbnQuCisgICAgICAgICAgICAvLyBE
b24ndCBleHBhbmQgdGhlIGJsb2NrIGlmIHRoZSBwYXJlbnQgbm9kZSBzaXplIGlzIGFscmVhZHkg
YWxtb3N0IHRoZSBzaXplIG9mIGFjdHVhbCB2aXNpYmxlIHNpemUuCisgICAgICAgICAgICBJbnRT
aXplIGFjdHVhbFNpemUgPSBhY3R1YWxWaXNpYmxlU2l6ZSgpOworICAgICAgICAgICAgaWYgKHN0
YXRpY19jYXN0PGRvdWJsZT4oMSAtIHRSZWN0LndpZHRoKCkgLyBhY3R1YWxTaXplLndpZHRoKCkp
IDwgbWluaW11bUV4cGFuZGluZ1JhdGlvKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgaWYgKHRlbXBCbG9ja0FyZWEgPCBibG9ja0V4cGFuc2lvblJhdGlvICogb3JpZ2luYWxB
cmVhKSB7CisgICAgICAgICAgICAgICAgYmxvY2tSZWN0ID0gdFJlY3Q7CisgICAgICAgICAgICAg
ICAgbV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlID0gdG5vZGU7CisgICAgICAgICAgICB9
IGVsc2UKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJs
b2NrUmVjdCA9IGFkanVzdFJlY3RPZmZzZXRGb3JGcmFtZU9mZnNldChibG9ja1JlY3QsIG5vZGUp
OworICAgIGJsb2NrUmVjdCA9IG1hcFRvVHJhbnNmb3JtZWQoYmxvY2tSZWN0KTsKKyAgICBjbGlw
VG9UcmFuc2Zvcm1lZENvbnRlbnRzUmVjdChibG9ja1JlY3QpOworCisjaWYgREVCVUdfQkxPQ0tf
Wk9PTQorICAgIC8vIFJlLXBhaW50IHRoZSBiYWNraW5nc3RvcmUgdG8gc2NyZWVuIHRvIGVyYXNl
IG90aGVyIGFubm90YXRpb25zLgorICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXN1bWVTY3JlZW5B
bmRCYWNraW5nU3RvcmVVcGRhdGVzKEJhY2tpbmdTdG9yZTo6QmxpdCk7CisKKyAgICAvLyBSZW5k
ZXIgYSBibGFjayBzcXVhcmUgb3ZlciB0aGUgY2FsY3VsYXRlZCBibG9jayBhbmQgYSBncmF5IHNx
dWFyZSBvdmVyIHRoZSBvcmlnaW5hbCBibG9jayBmb3IgdmlzdWFsIGluc3BlY3Rpb24uCisgICAg
b3JpZ2luYWxSZWN0ID0gbWFwVG9UcmFuc2Zvcm1lZChvcmlnaW5hbFJlY3QpOworICAgIGNsaXBU
b1RyYW5zZm9ybWVkQ29udGVudHNSZWN0KG9yaWdpbmFsUmVjdCk7CisgICAgSW50UmVjdCByZW5k
ZXJSZWN0ID0gbWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RyYW5zZm9ybWVkVmlld3BvcnQo
YmxvY2tSZWN0KTsKKyAgICBJbnRSZWN0IG9yaWdpbmFsUmVuZGVyUmVjdCA9IG1hcEZyb21UcmFu
c2Zvcm1lZENvbnRlbnRzVG9UcmFuc2Zvcm1lZFZpZXdwb3J0KG9yaWdpbmFsUmVjdCk7CisgICAg
SW50U2l6ZSB2aWV3cG9ydFNpemUgPSB0cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpOworICAgIHJl
bmRlclJlY3QuaW50ZXJzZWN0KEludFJlY3QoMCwgMCwgdmlld3BvcnRTaXplLndpZHRoKCksIHZp
ZXdwb3J0U2l6ZS5oZWlnaHQoKSkpOworICAgIG9yaWdpbmFsUmVuZGVyUmVjdC5pbnRlcnNlY3Qo
SW50UmVjdCgwLCAwLCB2aWV3cG9ydFNpemUud2lkdGgoKSwgdmlld3BvcnRTaXplLmhlaWdodCgp
KSk7CisgICAgbV9iYWNraW5nU3RvcmUtPmQtPmNsZWFyV2luZG93KHJlbmRlclJlY3QsIDAsIDAs
IDApOworICAgIG1fYmFja2luZ1N0b3JlLT5kLT5jbGVhcldpbmRvdyhvcmlnaW5hbFJlbmRlclJl
Y3QsIDEyMCwgMTIwLCAxMjApOworICAgIG1fYmFja2luZ1N0b3JlLT5kLT5pbnZhbGlkYXRlV2lu
ZG93KHJlbmRlclJlY3QpOworI2VuZGlmCisKKyAgICByZXR1cm4gYmxvY2tSZWN0OworfQorCit2
b2lkIFdlYlBhZ2U6OmJsb2NrWm9vbUFuaW1hdGlvbkZpbmlzaGVkKCkKK3sKKyAgICBkLT56b29t
QmxvY2soKTsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJl
Y3RseS4KKy8vIEl0IGlzIGNhbGxlZCBhZnRlciB0aGUgYW5pbWF0aW9uIGVuZHMgKHNlZSBhYm92
ZSkuCit2b2lkIFdlYlBhZ2VQcml2YXRlOjp6b29tQmxvY2soKQoreworICAgIGlmICghbV9tYWlu
RnJhbWUpCisgICAgICAgIHJldHVybjsKKworICAgIEludFBvaW50IGFuY2hvcihyb3VuZFVudHJh
bnNmb3JtZWRQb2ludChtYXBGcm9tVHJhbnNmb3JtZWRGbG9hdFBvaW50KG1fZmluYWxCbG9ja1Bv
aW50KSkpOworICAgIGJvb2wgd2lsbFVzZVRleHRSZWZsb3cgPSBmYWxzZTsKKworI2lmIEVOQUJM
RShWSUVXUE9SVF9SRUZMT1cpCisgICAgd2lsbFVzZVRleHRSZWZsb3cgPSBtX3dlYlBhZ2UtPnNl
dHRpbmdzKCktPnRleHRSZWZsb3dNb2RlKCkgIT0gV2ViU2V0dGluZ3M6OlRleHRSZWZsb3dEaXNh
YmxlZDsKKyAgICB0b2dnbGVUZXh0UmVmbG93SWZFbmFibGVkRm9yQmxvY2tab29tT25seShtX3No
b3VsZFJlZmxvd0Jsb2NrKTsKKyAgICBzZXROZWVkc0xheW91dCgpOworI2VuZGlmCisKKyAgICBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCB6b29tOworICAgIHpvb20uc2NhbGUobV9ibG9ja1pvb21GaW5h
bFNjYWxlKTsKKyAgICAqbV90cmFuc2Zvcm1hdGlvbk1hdHJpeCA9IHpvb207CisgICAgbV9jbGll
bnQtPnJlc2V0Qml0bWFwWm9vbVNjYWxlKG1fYmxvY2tab29tRmluYWxTY2FsZSk7CisgICAgbV9i
YWNraW5nU3RvcmUtPmQtPnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7Cisg
ICAgdXBkYXRlVmlld3BvcnRTaXplKCk7CisKKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9XKQor
ICAgIHJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpOworICAgIGlmICh3aWxsVXNlVGV4dFJlZmxvdyAm
JiBtX3Nob3VsZFJlZmxvd0Jsb2NrKSB7CisgICAgICAgIEludFJlY3QgcmVmbG93ZWRSZWN0ID0g
cmVjdEZvck5vZGUobV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlLmdldCgpKTsKKyAgICAg
ICAgcmVmbG93ZWRSZWN0ID0gYWRqdXN0UmVjdE9mZnNldEZvckZyYW1lT2Zmc2V0KHJlZmxvd2Vk
UmVjdCwgbV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlLmdldCgpKTsKKyAgICAgICAgcmVm
bG93ZWRSZWN0Lm1vdmUocm91bmRUcmFuc2Zvcm1lZFBvaW50KG1fZmluYWxCbG9ja1BvaW50UmVm
bG93T2Zmc2V0KS54KCksIHJvdW5kVHJhbnNmb3JtZWRQb2ludChtX2ZpbmFsQmxvY2tQb2ludFJl
Zmxvd09mZnNldCkueSgpKTsKKyAgICAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG1fY3Vy
cmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZS0+cmVuZGVyZXIoKTsKKyAgICAgICAgSW50UG9pbnQg
dG9wTGVmdFBvaW50KHJlZmxvd2VkUmVjdC5sb2NhdGlvbigpKTsKKyAgICAgICAgaWYgKHJlbmRl
cmVyICYmIHJlbmRlcmVyLT5pc1RleHQoKSkgeworICAgICAgICAgICAgRVRleHRBbGlnbiB0ZXh0
QWxpZ24gPSByZW5kZXJlci0+c3R5bGUoKS0+dGV4dEFsaWduKCk7CisgICAgICAgICAgICBJbnRQ
b2ludCB0ZXh0QW5jaG9yOworICAgICAgICAgICAgc3dpdGNoICh0ZXh0QWxpZ24pIHsKKyAgICAg
ICAgICAgIGNhc2UgQ0VOVEVSOgorICAgICAgICAgICAgY2FzZSBXRUJLSVRfQ0VOVEVSOgorICAg
ICAgICAgICAgICAgIHRleHRBbmNob3IgPSBJbnRQb2ludChyZWZsb3dlZFJlY3QueCgpICsgKHJl
Zmxvd2VkUmVjdC53aWR0aCgpIC0gYWN0dWFsVmlzaWJsZVNpemUoKS53aWR0aCgpKSAvIDIsIHRv
cExlZnRQb2ludC55KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2Fz
ZSBMRUZUOgorICAgICAgICAgICAgY2FzZSBXRUJLSVRfTEVGVDoKKyAgICAgICAgICAgICAgICB0
ZXh0QW5jaG9yID0gdG9wTGVmdFBvaW50OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgY2FzZSBSSUdIVDoKKyAgICAgICAgICAgIGNhc2UgV0VCS0lUX1JJR0hUOgorICAgICAg
ICAgICAgICAgIHRleHRBbmNob3IgPSBJbnRQb2ludChyZWZsb3dlZFJlY3QueCgpICsgcmVmbG93
ZWRSZWN0LndpZHRoKCkgLSBhY3R1YWxWaXNpYmxlU2l6ZSgpLndpZHRoKCksIHRvcExlZnRQb2lu
dC55KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBUQUFVVE86
CisgICAgICAgICAgICBjYXNlIEpVU1RJRlk6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAg
ICAgICAgICAgIGlmIChyZW5kZXJlci0+c3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigp
KQorICAgICAgICAgICAgICAgICAgICB0ZXh0QW5jaG9yID0gdG9wTGVmdFBvaW50OworICAgICAg
ICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGV4dEFuY2hvciA9IEludFBvaW50
KHJlZmxvd2VkUmVjdC54KCkgKyByZWZsb3dlZFJlY3Qud2lkdGgoKSAtIGFjdHVhbFZpc2libGVT
aXplKCkud2lkdGgoKSwgdG9wTGVmdFBvaW50LnkoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRTY3JvbGxQb3NpdGlvbih0ZXh0QW5jaG9y
KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbmRlcmVyLT5zdHlsZSgpLT5pc0xl
ZnRUb1JpZ2h0RGlyZWN0aW9uKCkKKyAgICAgICAgICAgICAgICA/IHNldFNjcm9sbFBvc2l0aW9u
KHRvcExlZnRQb2ludCkKKyAgICAgICAgICAgICAgICA6IHNldFNjcm9sbFBvc2l0aW9uKEludFBv
aW50KHJlZmxvd2VkUmVjdC54KCkgKyByZWZsb3dlZFJlY3Qud2lkdGgoKSAtIGFjdHVhbFZpc2li
bGVTaXplKCkud2lkdGgoKSwgdG9wTGVmdFBvaW50LnkoKSkpOworICAgICAgICB9CisgICAgfSBl
bHNlIGlmICh3aWxsVXNlVGV4dFJlZmxvdykgeworICAgICAgICBJbnRSZWN0IGZpbmFsUmVjdCA9
IHJlY3RGb3JOb2RlKG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZS5nZXQoKSk7CisgICAg
ICAgIGZpbmFsUmVjdCA9IGFkanVzdFJlY3RPZmZzZXRGb3JGcmFtZU9mZnNldChmaW5hbFJlY3Qs
IG1fY3VycmVudEJsb2NrWm9vbUFkanVzdGVkTm9kZS5nZXQoKSk7CisgICAgICAgIHNldFNjcm9s
bFBvc2l0aW9uKEludFBvaW50KDAsIGZpbmFsUmVjdC55KCkgKyBtX2ZpbmFsQmxvY2tQb2ludFJl
Zmxvd09mZnNldC55KCkpKTsKKyAgICAgICAgcmVzZXRCbG9ja1pvb20oKTsKKyAgICB9CisjZW5k
aWYKKyAgICBpZiAoIXdpbGxVc2VUZXh0UmVmbG93KSB7CisgICAgICAgIHNldFNjcm9sbFBvc2l0
aW9uKGFuY2hvcik7CisgICAgICAgIGlmICghbV9zaG91bGRSZWZsb3dCbG9jaykKKyAgICAgICAg
ICAgIHJlc2V0QmxvY2tab29tKCk7CisgICAgfQorCisgICAgbm90aWZ5VHJhbnNmb3JtQ2hhbmdl
ZCgpOworICAgIG1fYmFja2luZ1N0b3JlLT5kLT5jbGVhcldpbmRvdygpOworICAgIG1fYmFja2lu
Z1N0b3JlLT5kLT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKEJhY2tpbmdTdG9y
ZTo6UmVuZGVyQW5kQmxpdCk7CisgICAgbV9jbGllbnQtPnpvb21DaGFuZ2VkKG1fd2ViUGFnZS0+
aXNNaW5ab29tZWQoKSwgbV93ZWJQYWdlLT5pc01heFpvb21lZCgpLCAhc2hvdWxkWm9vbU9uRXNj
YXBlKCksIGN1cnJlbnRTY2FsZSgpKTsKK30KKworCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpyZXNl
dEJsb2NrWm9vbSgpCit7CisgICAgbV9jdXJyZW50QmxvY2tab29tTm9kZSA9IDA7CisgICAgbV9j
dXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlID0gMDsKKyAgICBtX3Nob3VsZFJlZmxvd0Jsb2Nr
ID0gZmFsc2U7Cit9CisKK1dlYlBhZ2U6OldlYlBhZ2UoV2ViUGFnZUNsaWVudCogY2xpZW50LCBj
b25zdCBXZWJTdHJpbmcmIHBhZ2VHcm91cE5hbWUsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBy
ZWN0KQoreworICAgIGdsb2JhbEluaXRpYWxpemUoKTsKKyAgICBkID0gbmV3IFdlYlBhZ2VQcml2
YXRlKHRoaXMsIGNsaWVudCwgcmVjdCk7CisgICAgZC0+aW5pdChwYWdlR3JvdXBOYW1lKTsKK30K
Kwordm9pZCBXZWJQYWdlOjpkZXN0cm95V2ViUGFnZUNvbXBvc2l0b3IoKQoreworI2lmIFVTRShB
Q0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAvLyBEZXN0cm95IHRoZSBsYXllciByZW5kZXJl
ciBpbiBhIHN5bmMgY29tbWFuZCBiZWZvcmUgd2UgZGVzdHJveSB0aGUgYmFja2luZyBzdG9yZSwK
KyAgICAvLyB0byBmbHVzaCBhbnkgcGVuZGluZyBjb21wb3NpdGluZyBtZXNzYWdlcyBvbiB0aGUg
Y29tcG9zaXRpbmcgdGhyZWFkLgorICAgIC8vIFRoZSBiYWNraW5nIHN0b3JlIGlzIGluZGlyZWN0
bHkgZGVsZXRlZCBieSB0aGUgJ2RldGFjaEZyb21QYXJlbnQnIGNhbGwgYmVsb3cuCisgICAgZC0+
c3luY0Rlc3Ryb3lDb21wb3NpdG9yT25Db21wb3NpdGluZ1RocmVhZCgpOworI2VuZGlmCit9CisK
K3ZvaWQgV2ViUGFnZTo6ZGVzdHJveSgpCit7CisgICAgLy8gVE9ETzogbmVlZCB0byB2ZXJpZnkg
aWYgdGhpcyBjYWxsIG5lZWRzIHRvIGJlIG1hZGUgYmVmb3JlIGNhbGxpbmcKKyAgICAvLyBXZWJQ
YWdlOjpkZXN0cm95V2ViUGFnZUNvbXBvc2l0b3IoKQorICAgIGQtPm1fYmFja2luZ1N0b3JlLT5k
LT5zdXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcygpOworCisgICAgLy8gQ2xvc2Ug
dGhlIGJhY2tmb3J3YXJkIGxpc3QgYW5kIHJlbGVhc2UgdGhlIGNhY2hlZCBwYWdlcy4KKyAgICBk
LT5tX3BhZ2UtPmJhY2tGb3J3YXJkKCktPmNsb3NlKCk7CisgICAgcGFnZUNhY2hlKCktPnJlbGVh
c2VBdXRvcmVsZWFzZWRQYWdlc05vdygpOworCisgICAgRnJhbWVMb2FkZXIqIGxvYWRlciA9IGQt
Pm1fbWFpbkZyYW1lLT5sb2FkZXIoKTsKKworICAgIC8vIFJlbW92ZSBtYWluIGZyYW1lJ3MgYmFj
a2luZyBzdG9yZSBjbGllbnQgZnJvbSB0aGUgbWFwCisgICAgLy8gdG8gcHJldmVudCBGcmFtZUxv
YWRlckNsaWVudEJsYWNreUJlcnJ5OjpkZXRhY2hGcm9tUGFyZW50MigpLAorICAgIC8vIHdoaWNo
IGlzIGNhbGxlZCBieSBsb2FkZXItPmRldGFjaEZyb21QYXJlbnQoKSwgZGVsZXRpbmcgaXQuCisg
ICAgLy8gV2Ugd2lsbCBkZWxldGUgaXQgaW4gfldlYlBhZ2VQcml2YXRlKCkuCisgICAgLy8gUmVh
c29uOiBsb2FkZXItPmRldGFjaEZyb21QYXJlbnQoKSBtYXkgcGluZyBiYWNrIHRvIGJhY2tpbmcg
c3RvcmUKKyAgICAvLyBpbmRpcmVjdGx5IHRocm91Z2ggQ2hyb21lQ2xpZW50QmxhY2tCZXJyeTo6
aW52YWxpZGF0ZUNvbnRlbnRzQW5kV2luZG93KCkuCisgICAgLy8gc2VlIFJJTSBQUiAjOTMyNTYu
CisgICAgZC0+cmVtb3ZlQmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUoZC0+bV9tYWluRnJhbWUp
OworCisgICAgLy8gU2V0IG1fbWFpbkZyYW1lIHRvIDAgdG8gYXZvaWQgY2FsbHMgYmFjayBpbiB0
byB0aGUgYmFja2luZ3N0b3JlIGR1cmluZyB3ZWJwYWdlIGRlbGV0aW9uLgorICAgIGQtPm1fbWFp
bkZyYW1lID0gMDsKKyAgICBpZiAobG9hZGVyKQorICAgICAgICBsb2FkZXItPmRldGFjaEZyb21Q
YXJlbnQoKTsKKworICAgIGRlbGV0ZSB0aGlzOworfQorCitXZWJQYWdlOjp+V2ViUGFnZSgpCit7
CisgICAgZGVsZXRlIGQ7CisgICAgZCA9IDA7Cit9CisKK1dlYlBhZ2VDbGllbnQqIFdlYlBhZ2U6
OmNsaWVudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fY2xpZW50OworfQorCit2b2lkIFdl
YlBhZ2U6OmxvYWQoY29uc3QgY2hhciogdXJsLCBjb25zdCBjaGFyKiBuZXR3b3JrVG9rZW4sIGJv
b2wgaXNJbml0aWFsKQoreworICAgIGQtPmxvYWQodXJsLCBuZXR3b3JrVG9rZW4sICJHRVQiLCBQ
bGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OlVzZVByb3RvY29sQ2FjaGVQb2xpY3ksIDAsIDAsIDAs
IDAsIGlzSW5pdGlhbCwgZmFsc2UpOworfQorCit2b2lkIFdlYlBhZ2U6OmxvYWRFeHRlbmRlZChj
b25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIqIG5ldHdvcmtUb2tlbiwgY29uc3QgY2hhciogbWV0
aG9kLCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkNhY2hlUG9saWN5IGNhY2hlUG9saWN5LCBj
b25zdCBjaGFyKiBkYXRhLCBzaXplX3QgZGF0YUxlbmd0aCwgY29uc3QgY2hhciogY29uc3QqIGhl
YWRlcnMsIHNpemVfdCBoZWFkZXJzTGVuZ3RoLCBib29sIG11c3RIYW5kbGVJbnRlcm5hbGx5KQor
eworICAgIGQtPmxvYWQodXJsLCBuZXR3b3JrVG9rZW4sIG1ldGhvZCwgY2FjaGVQb2xpY3ksIGRh
dGEsIGRhdGFMZW5ndGgsIGhlYWRlcnMsIGhlYWRlcnNMZW5ndGgsIGZhbHNlLCBtdXN0SGFuZGxl
SW50ZXJuYWxseSwgZmFsc2UsICIiKTsKK30KKwordm9pZCBXZWJQYWdlOjpsb2FkRmlsZShjb25z
dCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBvdmVycmlkZUNvbnRlbnRUeXBlKQoreworICAgIHN0
ZDo6c3RyaW5nIGZpbGVVcmwocGF0aCk7CisgICAgaWYgKCFmaWxlVXJsLmZpbmQoIi8iKSkKKyAg
ICAgICAgZmlsZVVybC5pbnNlcnQoMCwgImZpbGU6Ly8iKTsKKyAgICBlbHNlIGlmIChmaWxlVXJs
LmZpbmQoImZpbGU6Ly8vIikpCisgICAgICAgIHJldHVybjsKKworICAgIGQtPmxvYWQoZmlsZVVy
bC5jX3N0cigpLCAwLCAiR0VUIiwgUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpVc2VQcm90b2Nv
bENhY2hlUG9saWN5LCAwLCAwLCAwLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBvdmVycmlkZUNv
bnRlbnRUeXBlKTsKK30KKwordm9pZCBXZWJQYWdlOjpsb2FkU3RyaW5nKGNvbnN0IGNoYXIqIHN0
cmluZywgY29uc3QgY2hhciogYmFzZVVSTCwgY29uc3QgY2hhciogbWltZVR5cGUsIGNvbnN0IGNo
YXIqIGZhaWxpbmdVUkwpCit7CisgICAgZC0+bG9hZFN0cmluZyhzdHJpbmcsIGJhc2VVUkwsIG1p
bWVUeXBlLCBmYWlsaW5nVVJMKTsKK30KKwordm9pZCBXZWJQYWdlOjpkb3dubG9hZChjb25zdCBQ
bGF0Zm9ybTo6TmV0d29ya1JlcXVlc3QmIHJlcXVlc3QpCit7CisgICAgZC0+bG9hZChyZXF1ZXN0
LmdldFVybFJlZigpLmNfc3RyKCksIDAsICJHRVQiLCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6
OlVzZVByb3RvY29sQ2FjaGVQb2xpY3ksIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwg
IiIpOworfQorCitib29sIFdlYlBhZ2U6OmV4ZWN1dGVKYXZhU2NyaXB0KGNvbnN0IGNoYXIqIHNj
cmlwdCwgSmF2YVNjcmlwdERhdGFUeXBlJiByZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZh
bHVlKQoreworICAgIHJldHVybiBkLT5leGVjdXRlSmF2YVNjcmlwdChzY3JpcHQsIHJldHVyblR5
cGUsIHJldHVyblZhbHVlKTsKK30KKworYm9vbCBXZWJQYWdlOjpleGVjdXRlSmF2YVNjcmlwdElu
SXNvbGF0ZWRXb3JsZChjb25zdCBzdGQ6OndzdHJpbmcmIHNjcmlwdCwgSmF2YVNjcmlwdERhdGFU
eXBlJiByZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKQoreworICAgIC8vIE9uIG91
ciBwbGF0Zm9ybSB3Y2hhcl90IGlzIHVuc2lnbmVkIGludCBhbmQgVUNoYXIgaXMgdW5zaWduZWQg
c2hvcnQKKyAgICAvLyBzbyB3ZSBoYXZlIHRvIGNvbnZlcnQgdXNpbmcgSUNVIGNvbnZlcnNpb24g
ZnVuY3Rpb24KKyAgICBpbnQgbGVuZ3RoQ29waWVkID0gMDsKKyAgICBVRXJyb3JDb2RlIGVycm9y
ID0gVV9aRVJPX0VSUk9SOworICAgIGNvbnN0IGludCBsZW5ndGggPSBzY3JpcHQubGVuZ3RoKCkg
KyAxIC8qbnVsbCB0ZXJtaW5hdGlvbiBjaGFyKi87CisgICAgVUNoYXIgZGF0YVtsZW5ndGhdOwor
CisgICAgLy8gRklYTUU6IFBSIDEzODE2MiBpcyBnaXZpbmcgVV9JTlZBTElEX0NIQVJfRk9VTkQg
ZXJyb3IuCisgICAgdV9zdHJGcm9tVVRGMzIoZGF0YSwgbGVuZ3RoLCAmbGVuZ3RoQ29waWVkLCBy
ZWludGVycHJldF9jYXN0PGNvbnN0IFVDaGFyMzIqPihzY3JpcHQuY19zdHIoKSksIHNjcmlwdC5s
ZW5ndGgoKSwgJmVycm9yKTsKKyAgICBCTEFDS0JFUlJZX0FTU0VSVChlcnJvciA9PSBVX1pFUk9f
RVJST1IpOworICAgIGlmIChlcnJvciAhPSBVX1pFUk9fRVJST1IpIHsKKyAgICAgICAgUGxhdGZv
cm06OmxvZ0Fsd2F5cyhQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIldlYlBhZ2U6OmV4ZWN1
dGVKYXZhU2NyaXB0SW5Jc29sYXRlZFdvcmxkIGZhaWxlZCB0byBjb252ZXJ0IFVURjE2IHRvIEph
dmFTY3JpcHQhIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU3RyaW5nIHN0
ciA9IFN0cmluZyhkYXRhLCBsZW5ndGhDb3BpZWQpOworICAgIFNjcmlwdFNvdXJjZUNvZGUgc291
cmNlQ29kZShzdHIsIEtVUkwoKSk7CisgICAgcmV0dXJuIGQtPmV4ZWN1dGVKYXZhU2NyaXB0SW5J
c29sYXRlZFdvcmxkKHNvdXJjZUNvZGUsIHJldHVyblR5cGUsIHJldHVyblZhbHVlKTsKK30KKwor
Ym9vbCBXZWJQYWdlOjpleGVjdXRlSmF2YVNjcmlwdEluSXNvbGF0ZWRXb3JsZChjb25zdCBjaGFy
KiBzY3JpcHQsIEphdmFTY3JpcHREYXRhVHlwZSYgcmV0dXJuVHlwZSwgV2ViU3RyaW5nJiByZXR1
cm5WYWx1ZSkKK3sKKyAgICBTY3JpcHRTb3VyY2VDb2RlIHNvdXJjZUNvZGUoU3RyaW5nOjpmcm9t
VVRGOChzY3JpcHQpLCBLVVJMKCkpOworICAgIHJldHVybiBkLT5leGVjdXRlSmF2YVNjcmlwdElu
SXNvbGF0ZWRXb3JsZChzb3VyY2VDb2RlLCByZXR1cm5UeXBlLCByZXR1cm5WYWx1ZSk7Cit9CisK
K3ZvaWQgV2ViUGFnZTo6c3RvcExvYWRpbmcoKQoreworICAgIGQtPnN0b3BDdXJyZW50TG9hZCgp
OworfQorCit2b2lkIFdlYlBhZ2U6OnByZXBhcmVUb0Rlc3Ryb3koKQoreworICAgIGQtPnByZXBh
cmVUb0Rlc3Ryb3koKTsKK30KKworaW50IFdlYlBhZ2U6OmJhY2tGb3J3YXJkTGlzdExlbmd0aCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fcGFnZS0+Z2V0SGlzdG9yeUxlbmd0aCgpOworfQor
Citib29sIFdlYlBhZ2U6OmNhbkdvQmFja09yRm9yd2FyZChpbnQgZGVsdGEpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGQtPm1fcGFnZS0+Y2FuR29CYWNrT3JGb3J3YXJkKGRlbHRhKTsKK30KKworYm9v
bCBXZWJQYWdlOjpnb0JhY2tPckZvcndhcmQoaW50IGRlbHRhKQoreworICAgIGlmIChkLT5tX3Bh
Z2UtPmNhbkdvQmFja09yRm9yd2FyZChkZWx0YSkpIHsKKyAgICAgICAgZC0+bV9wYWdlLT5nb0Jh
Y2tPckZvcndhcmQoZGVsdGEpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0
dXJuIGZhbHNlOworfQorCit2b2lkIFdlYlBhZ2U6OmdvVG9CYWNrRm9yd2FyZEVudHJ5KEJhY2tG
b3J3YXJkSWQgaWQpCit7CisgICAgSGlzdG9yeUl0ZW0qIGl0ZW0gPSBoaXN0b3J5SXRlbUZyb21C
YWNrRm9yd2FyZElkKGlkKTsKKyAgICBBU1NFUlQoaXRlbSk7CisgICAgZC0+bV9wYWdlLT5nb1Rv
SXRlbShpdGVtLCBGcmFtZUxvYWRUeXBlSW5kZXhlZEJhY2tGb3J3YXJkKTsKK30KKwordm9pZCBX
ZWJQYWdlOjpyZWxvYWQoKQoreworICAgIGQtPm1fbWFpbkZyYW1lLT5sb2FkZXIoKS0+cmVsb2Fk
KC8qIGJ5cGFzc0NhY2hlICovIHRydWUpOworfQorCit2b2lkIFdlYlBhZ2U6OnJlbG9hZEZyb21D
YWNoZSgpCit7CisgICAgZC0+bV9tYWluRnJhbWUtPmxvYWRlcigpLT5yZWxvYWQoLyogYnlwYXNz
Q2FjaGUgKi8gZmFsc2UpOworfQorCitXZWJTZXR0aW5ncyogV2ViUGFnZTo6c2V0dGluZ3MoKSBj
b25zdAoreworICAgIHJldHVybiBkLT5tX3dlYlNldHRpbmdzOworfQorCitib29sIFdlYlBhZ2U6
OmlzVmlzaWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fdmlzaWJsZTsKK30KKwordm9p
ZCBXZWJQYWdlOjpzZXRWaXNpYmxlKGJvb2wgdmlzaWJsZSkKK3sKKyAgICBpZiAoZC0+bV92aXNp
YmxlID09IHZpc2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIGQtPm1fdmlzaWJsZSA9IHZp
c2libGU7CisKKyAgICBpZiAoIXZpc2libGUpIHsKKyAgICAgICAgZC0+c3VzcGVuZEJhY2tpbmdT
dG9yZSgpOworCisgICAgICAgIC8vIFJlbW92ZSB0aGlzIFdlYlBhZ2UgZnJvbSB0aGUgdmlzaWJs
ZSBwYWdlcyBsaXN0LgorICAgICAgICBzaXplX3QgZm91bmRJbmRleCA9IHZpc2libGVXZWJQYWdl
cygpLT5maW5kKHRoaXMpOworICAgICAgICBpZiAoZm91bmRJbmRleCAhPSBXVEY6Om5vdEZvdW5k
KQorICAgICAgICAgICAgdmlzaWJsZVdlYlBhZ2VzKCktPnJlbW92ZShmb3VuZEluZGV4KTsKKwor
ICAgICAgICAvLyBSZXR1cm4gdGhlIGJhY2tpbmcgc3RvcmUgdG8gdGhlIGxhc3QgdmlzaWJsZSBX
ZWJQYWdlLgorICAgICAgICBpZiAoQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdT
dG9yZU93bmVyKCkgPT0gdGhpcyAmJiAhdmlzaWJsZVdlYlBhZ2VzKCktPmlzRW1wdHkoKSkKKyAg
ICAgICAgICAgIHZpc2libGVXZWJQYWdlcygpLT5sYXN0KCktPmQtPnJlc3VtZUJhY2tpbmdTdG9y
ZSgpOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgICAgICAvLyBSb290
IGxheWVyIGNvbW1pdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBpbnZpc2libGUgdGFicy4KKyAgICAg
ICAgLy8gQW5kIHJlbGVhc2UgbGF5ZXIgcmVzb3VyY2VzIGNhbiByZWR1Y2UgbWVtb3J5IGNvbnN1
bXB0aW9uLgorICAgICAgICBkLT5zdXNwZW5kUm9vdExheWVyQ29tbWl0KCk7CisjZW5kaWYKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
KyAgICBkLT5yZXN1bWVSb290TGF5ZXJDb21taXQoKTsKKyNlbmRpZgorCisgICAgLy8gUHVzaCB0
aGlzIFdlYlBhZ2UgdG8gdGhlIHRvcCBvZiB0aGUgdmlzaWJsZSBwYWdlcyBsaXN0LgorICAgIGlm
ICghdmlzaWJsZVdlYlBhZ2VzKCktPmlzRW1wdHkoKSAmJiB2aXNpYmxlV2ViUGFnZXMoKS0+bGFz
dCgpICE9IHRoaXMpIHsKKyAgICAgICAgc2l6ZV90IGZvdW5kSW5kZXggPSB2aXNpYmxlV2ViUGFn
ZXMoKS0+ZmluZCh0aGlzKTsKKyAgICAgICAgaWYgKGZvdW5kSW5kZXggIT0gV1RGOjpub3RGb3Vu
ZCkKKyAgICAgICAgICAgIHZpc2libGVXZWJQYWdlcygpLT5yZW1vdmUoZm91bmRJbmRleCk7Cisg
ICAgfQorICAgIHZpc2libGVXZWJQYWdlcygpLT5hcHBlbmQodGhpcyk7CisKKyAgICBpZiAoQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9yZU93bmVyKCkKKyAgICAgICAgJiYg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9yZU93bmVyKCkgIT0gdGhpcykK
KyAgICAgICAgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9yZU93bmVyKCkt
PmQtPnN1c3BlbmRCYWNraW5nU3RvcmUoKTsKKworICAgIC8vIHJlc3VtZUJhY2tpbmdTdG9yZSB3
aWxsIHNldCB0aGUgY3VycmVudCBvd25lciB0byB0aGlzIHdlYnBhZ2UuCisgICAgLy8gSWYgd2Ug
c2V0IHRoZSBvd25lciBwcmVtYXR1cmVseSwgdGhlbiB0aGUgdGlsZXMgd2lsbCBub3QgYmUgcmVz
ZXQuCisgICAgZC0+cmVzdW1lQmFja2luZ1N0b3JlKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZh
dGU6OnNlbGVjdGlvbkNoYW5nZWQoRnJhbWUqIGZyYW1lKQoreworICAgIG1faW5wdXRIYW5kbGVy
LT5zZWxlY3Rpb25DaGFuZ2VkKCk7CisKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBhIGhhY2shCisg
ICAgLy8gVG8gZW5zdXJlIHRoZSBzZWxlY3Rpb24gYmVpbmcgY2hhbmdlZCBoYXMgaXRzIGZyYW1l
ICdmb2N1c2VkJywgbGV0cworICAgIC8vIHNldCBpdCBhcyBmb2N1c2VkIG91cnNlbHZlcyAoUFIg
IzEwNDcyNCkuCisgICAgbV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+c2V0Rm9jdXNlZEZyYW1l
KGZyYW1lKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6dXBkYXRlRGVsZWdhdGVkT3Zlcmxh
eXMoYm9vbCBkaXNwYXRjaGVkKQoreworICAgIC8vIFRyYWNrIGEgZGlzcGF0Y2hlZCBtZXNzYWdl
LCB3ZSBkb24ndCB3YW50IHRvIGZsb29kIHRoZSB3ZWJraXQgdGhyZWFkLgorICAgIC8vIFRoZXJl
IGNhbiBiZSBhcyBtYW55IGFzIG9uZSBtb3JlIG1lc3NhZ2UgZW5xdWVkIGFzIG5lZWRlZCBidXQg
bmV2ZXIgbGVzcy4KKyAgICBpZiAoZGlzcGF0Y2hlZCkKKyAgICAgICAgbV91cGRhdGVEZWxlZ2F0
ZWRPdmVybGF5c0Rpc3BhdGNoZWQgPSBmYWxzZTsKKyAgICBlbHNlIGlmIChtX3VwZGF0ZURlbGVn
YXRlZE92ZXJsYXlzRGlzcGF0Y2hlZCkgeworICAgICAgICAvLyBFYXJseSByZXR1cm4gaWYgdGhl
cmUgaXMgbWVzc2FnZSBhbHJlYWR5IHBlbmRpbmcgb24gdGhlIHdlYmtpdCB0aHJlYWQuCisgICAg
ICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoUGxhdGZvcm06OndlYktpdFRocmVhZE1lc3Nh
Z2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgLy8gTXVzdCBiZSBjYWxs
ZWQgb24gdGhlIFdlYktpdCB0aHJlYWQuCisgICAgICAgIGlmIChtX3NlbGVjdGlvbkhhbmRsZXIt
PmlzU2VsZWN0aW9uQWN0aXZlKCkpCisgICAgICAgICAgICBtX3NlbGVjdGlvbkhhbmRsZXItPnNl
bGVjdGlvblBvc2l0aW9uQ2hhbmdlZCh0cnVlIC8qIHZpc3VhbENoYW5nZU9ubHkgKi8pOworCisg
ICAgfSBlbHNlIGlmIChtX3NlbGVjdGlvbkhhbmRsZXItPmlzU2VsZWN0aW9uQWN0aXZlKCkpIHsK
KyAgICAgICAgLy8gRG9uJ3QgYm90aGVyIGRpc3BhdGNoaW5nIHRvIHdlYmtpdCB0aHJlYWQgaWYg
c2VsZWN0aW9uIGFuZCB0YXAgaGlnaGxpZ2h0IGFyZSBub3QgYWN0aXZlLgorICAgICAgICBtX3Vw
ZGF0ZURlbGVnYXRlZE92ZXJsYXlzRGlzcGF0Y2hlZCA9IHRydWU7CisgICAgICAgIFBsYXRmb3Jt
Ojp3ZWJLaXRUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoTWVzc2FnZShQbGF0Zm9ybTo6
Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJldlYlBhZ2VQcml2YXRlOjp1cGRhdGVEZWxlZ2F0ZWRP
dmVybGF5cywgdGhpcywgdHJ1ZSAvKmRpc3BhdGNoZWQqLykpOworICAgIH0KK30KKwordm9pZCBX
ZWJQYWdlOjpzZXRDYXJldEhpZ2hsaWdodFN0eWxlKFBsYXRmb3JtOjpDYXJldEhpZ2hsaWdodFN0
eWxlIHN0eWxlKQoreworfQorCitib29sIFdlYlBhZ2U6OnNldEJhdGNoRWRpdGluZ0FjdGl2ZShi
b29sIGFjdGl2ZSkKK3sKKyAgICByZXR1cm4gZC0+bV9pbnB1dEhhbmRsZXItPnNldEJhdGNoRWRp
dGluZ0FjdGl2ZShhY3RpdmUpOworfQorCitib29sIFdlYlBhZ2U6OnNldElucHV0U2VsZWN0aW9u
KHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQpCit7CisgICAgcmV0dXJuIGQtPm1faW5wdXRI
YW5kbGVyLT5zZXRTZWxlY3Rpb24oc3RhcnQsIGVuZCk7Cit9CisKK2ludCBXZWJQYWdlOjppbnB1
dENhcmV0UG9zaXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBkLT5tX2lucHV0SGFuZGxlci0+
Y2FyZXRQb3NpdGlvbigpOworfQorCit2b2lkIFdlYlBhZ2U6OnBvcHVwTGlzdENsb3NlZChpbnQg
c2l6ZSwgYm9vbCogc2VsZWN0ZWRzKQoreworICAgIGQtPm1faW5wdXRIYW5kbGVyLT5zZXRQb3B1
cExpc3RJbmRleGVzKHNpemUsIHNlbGVjdGVkcyk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6cG9wdXBM
aXN0Q2xvc2VkKGludCBpbmRleCkKK3sKKyAgICBkLT5tX2lucHV0SGFuZGxlci0+c2V0UG9wdXBM
aXN0SW5kZXgoaW5kZXgpOworfQorCit2b2lkIFdlYlBhZ2U6OnNldERhdGVUaW1lSW5wdXQoY29u
c3QgV2ViU3RyaW5nJiB2YWx1ZSkKK3sKKyAgICBkLT5tX2lucHV0SGFuZGxlci0+c2V0SW5wdXRW
YWx1ZShTdHJpbmcodmFsdWUuaW1wbCgpKSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0Q29sb3JJ
bnB1dChjb25zdCBXZWJTdHJpbmcmIHZhbHVlKQoreworICAgIGQtPm1faW5wdXRIYW5kbGVyLT5z
ZXRJbnB1dFZhbHVlKFN0cmluZyh2YWx1ZS5pbXBsKCkpKTsKK30KKworQWN0aXZlTm9kZUNvbnRl
eHQgV2ViUGFnZTo6YWN0aXZlTm9kZUNvbnRleHQoVGFyZ2V0RGV0ZWN0aW9uU3RyYXRlZ3kgc3Ry
YXRlZ3kpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmFjdGl2ZU5vZGVDb250ZXh0KHN0cmF0ZWd5
KTsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRWaXJ0dWFsVmlld3BvcnRTaXplKGludCB3aWR0aCwg
aW50IGhlaWdodCkKK3sKKyAgICBkLT5tX3ZpcnR1YWxWaWV3cG9ydFdpZHRoID0gd2lkdGg7Cisg
ICAgZC0+bV92aXJ0dWFsVmlld3BvcnRIZWlnaHQgPSBoZWlnaHQ7Cit9CisKK3ZvaWQgV2ViUGFn
ZTo6cmVzZXRWaXJ0dWFsVmlld3BvcnRPbkNvbW1pdHRlZChib29sIHJlc2V0KQoreworICAgIGQt
Pm1fcmVzZXRWaXJ0dWFsVmlld3BvcnRPbkNvbW1pdHRlZCA9IHJlc2V0OworfQorCitJbnRTaXpl
IFdlYlBhZ2VQcml2YXRlOjpyZWNvbXB1dGVWaXJ0dWFsVmlld3BvcnRGcm9tVmlld3BvcnRBcmd1
bWVudHMoKQoreworICAgIHN0YXRpYyBWaWV3cG9ydEFyZ3VtZW50cyBkZWZhdWx0Vmlld3BvcnRB
cmd1bWVudHM7CisgICAgaWYgKG1fdmlld3BvcnRBcmd1bWVudHMgPT0gZGVmYXVsdFZpZXdwb3J0
QXJndW1lbnRzKQorICAgICAgICByZXR1cm4gSW50U2l6ZSgpOworCisgICAgaW50IGRlc2t0b3BX
aWR0aCA9IGRlZmF1bHRNYXhMYXlvdXRTaXplKCkud2lkdGgoKTsKKyAgICBpbnQgZGV2aWNlV2lk
dGggPSBQbGF0Zm9ybTo6R3JhcGhpY3M6OlNjcmVlbjo6d2lkdGgoKTsKKyAgICBpbnQgZGV2aWNl
SGVpZ2h0ID0gUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OmhlaWdodCgpOworICAgIEZsb2F0
U2l6ZSBjdXJyZW50UFBJID0gUGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OnBpeGVsc1Blcklu
Y2goLTEpOworICAgIGludCBkZXZpY2VEUEkgPSBpbnQocm91bmRmKChjdXJyZW50UFBJLndpZHRo
KCkgKyBjdXJyZW50UFBJLmhlaWdodCgpKSAvIDIpKTsKKyAgICBpZiAobV92aWV3cG9ydEFyZ3Vt
ZW50cy50YXJnZXREZW5zaXR5RHBpID09IFZpZXdwb3J0QXJndW1lbnRzOjpWYWx1ZUF1dG8pIHsK
KyAgICAgICAgLy8gQXV0byBtZWFucyAxNjBkcGkgaWYgd2UgbGVhdmUgaXQgYWxvbmUuIFRoaXMg
bG9va3MgdGVycmlibGUgZm9yIHBhZ2VzIHdhbnRpbmcgMToxLgorICAgICAgICAvLyBGSVhNRTog
VGhpcyBpcyBpbnN1ZmZpY2llbnQgZm9yIGRldmljZXMgd2l0aCBoaWdoIGRwaSwgYXMgdGhleSB3
aWxsIHJlbmRlciBjb250ZW50IHVucmVhZGFibHkgc21hbGwuCisgICAgICAgIG1fdmlld3BvcnRB
cmd1bWVudHMudGFyZ2V0RGVuc2l0eURwaSA9IGRldmljZURQSTsKKyAgICB9CisKKyAgICBWaWV3
cG9ydEF0dHJpYnV0ZXMgcmVzdWx0ID0gY29tcHV0ZVZpZXdwb3J0QXR0cmlidXRlcyhtX3ZpZXdw
b3J0QXJndW1lbnRzLCBkZXNrdG9wV2lkdGgsIGRldmljZVdpZHRoLCBkZXZpY2VIZWlnaHQsIGRl
dmljZURQSSwgbV9kZWZhdWx0TGF5b3V0U2l6ZSk7CisgICAgcmV0dXJuIEludFNpemUocmVzdWx0
LmxheW91dFNpemUud2lkdGgoKSwgcmVzdWx0LmxheW91dFNpemUuaGVpZ2h0KCkpOworfQorCisj
aWYgRU5BQkxFKEVWRU5UX01PREVfTUVUQVRBR1MpCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpkaWRS
ZWNlaXZlQ3Vyc29yRXZlbnRNb2RlKEN1cnNvckV2ZW50TW9kZSBtb2RlKQoreworICAgIGlmICht
b2RlICE9IG1fY3Vyc29yRXZlbnRNb2RlKQorICAgICAgICBtX2NsaWVudC0+Y3Vyc29yRXZlbnRN
b2RlQ2hhbmdlZCh0b1BsYXRmb3JtQ3Vyc29yRXZlbnRNb2RlKG1vZGUpKTsKKyAgICBtX2N1cnNv
ckV2ZW50TW9kZSA9IG1vZGU7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OmRpZFJlY2VpdmVU
b3VjaEV2ZW50TW9kZShUb3VjaEV2ZW50TW9kZSBtb2RlKQoreworICAgIGlmIChtb2RlICE9IG1f
dG91Y2hFdmVudE1vZGUpCisgICAgICAgIG1fY2xpZW50LT50b3VjaEV2ZW50TW9kZUNoYW5nZWQo
dG9QbGF0Zm9ybVRvdWNoRXZlbnRNb2RlKG1vZGUpKTsKKyAgICBtX3RvdWNoRXZlbnRNb2RlID0g
bW9kZTsKK30KKyNlbmRpZgorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpkaXNwYXRjaFZpZXdwb3J0
UHJvcGVydGllc0RpZENoYW5nZShjb25zdCBWaWV3cG9ydEFyZ3VtZW50cyYgYXJndW1lbnRzKQor
eworICAgIHN0YXRpYyBWaWV3cG9ydEFyZ3VtZW50cyBkZWZhdWx0Vmlld3BvcnRBcmd1bWVudHM7
CisgICAgaWYgKGFyZ3VtZW50cyA9PSBkZWZhdWx0Vmlld3BvcnRBcmd1bWVudHMpCisgICAgICAg
IHJldHVybjsKKworICAgIG1fdmlld3BvcnRBcmd1bWVudHMgPSBhcmd1bWVudHM7CisKKyAgICAv
LyAwIHdpZHRoIG9yIGhlaWdodCBpbiB2aWV3cG9ydCBhcmd1bWVudHMgbWFrZXMgbm8gc2Vuc2Us
IGFuZCByZXN1bHRzIGluIGEgdmVyeSBsYXJnZSBpbml0aWFsIHNjYWxlLgorICAgIC8vIEluIHJl
YWwgd29ybGQsIGEgMCB3aWR0aCBvciBoZWlnaHQgaXMgdXN1YWxseSBjYXVzZWQgYnkgYSBzeW50
YXggZXJyb3IgaW4gImNvbnRlbnQiIGZpZWxkIG9mIHZpZXdwb3J0CisgICAgLy8gbWV0YSB0YWcs
IGZvciBleGFtcGxlLCB1c2luZyBzZW1pY29sb24gaW5zdGVhZCBvZiBjb21tYSBhcyBzZXBhcmF0
b3IgKCJ3aWR0aD1kZXZpY2Utd2lkdGg7IGluaXRpYWwtc2NhbGU9MS4wIikuCisgICAgLy8gV2Ug
ZG9uJ3QgaGF2ZSBhIHBsYW4gdG8gdG9sZXJhdGUgdGhlIHNlbWljb2xvbiBzZXBhcmF0b3IsIGJ1
dCB3ZSBjYW4gYXZvaWQgYXBwbHlpbmcgMCB3aWR0aC9oZWlnaHQuCisgICAgLy8gSSBkZWZhdWx0
IGl0IHRvIFZhbHVlRGV2aWNlV2lkdGggcmF0aGVyIHRoYW4gVmFsdWVBdXRvIGJlY2F1c2UgaW4g
bW9yZSBjYXNlcyB0aGUgd2ViIHNpdGUgd2FudHMgImRldmljZS13aWR0aCIKKyAgICAvLyB3aGVu
IHRoZXkgc3BlY2lmeSB0aGUgdmlld3BvcnQgd2lkdGguCisgICAgaWYgKCFtX3ZpZXdwb3J0QXJn
dW1lbnRzLndpZHRoKQorICAgICAgICBtX3ZpZXdwb3J0QXJndW1lbnRzLndpZHRoID0gVmlld3Bv
cnRBcmd1bWVudHM6OlZhbHVlRGV2aWNlV2lkdGg7CisgICAgaWYgKCFtX3ZpZXdwb3J0QXJndW1l
bnRzLmhlaWdodCkKKyAgICAgICAgbV92aWV3cG9ydEFyZ3VtZW50cy5oZWlnaHQgPSBWaWV3cG9y
dEFyZ3VtZW50czo6VmFsdWVEZXZpY2VIZWlnaHQ7CisKKyAgICBzZXRVc2VyU2NhbGFibGUoYXJn
dW1lbnRzLnVzZXJTY2FsYWJsZSA9PSBWaWV3cG9ydEFyZ3VtZW50czo6VmFsdWVBdXRvID8gdHJ1
ZSA6IGFyZ3VtZW50cy51c2VyU2NhbGFibGUpOworICAgIGlmIChhcmd1bWVudHMuaW5pdGlhbFNj
YWxlID4gMCkKKyAgICAgICAgc2V0SW5pdGlhbFNjYWxlKGFyZ3VtZW50cy5pbml0aWFsU2NhbGUp
OworICAgIGlmIChhcmd1bWVudHMubWluaW11bVNjYWxlID4gMCkKKyAgICAgICAgc2V0TWluaW11
bVNjYWxlKGFyZ3VtZW50cy5taW5pbXVtU2NhbGUpOworICAgIGlmIChhcmd1bWVudHMubWF4aW11
bVNjYWxlID4gMCkKKyAgICAgICAgc2V0TWF4aW11bVNjYWxlKGFyZ3VtZW50cy5tYXhpbXVtU2Nh
bGUpOworCisgICAgSW50U2l6ZSB2aXJ0dWFsVmlld3BvcnQgPSByZWNvbXB1dGVWaXJ0dWFsVmll
d3BvcnRGcm9tVmlld3BvcnRBcmd1bWVudHMoKTsKKyAgICBtX3dlYlBhZ2UtPnNldFZpcnR1YWxW
aWV3cG9ydFNpemUodmlydHVhbFZpZXdwb3J0LndpZHRoKCksIHZpcnR1YWxWaWV3cG9ydC5oZWln
aHQoKSk7CisKKyAgICBpZiAobG9hZFN0YXRlKCkgPT0gV2ViS2l0OjpXZWJQYWdlUHJpdmF0ZTo6
Q29tbWl0dGVkKQorICAgICAgICB6b29tVG9Jbml0aWFsU2NhbGVPbkxvYWQoKTsKK30KKwordm9p
ZCBXZWJQYWdlUHJpdmF0ZTo6b25JbnB1dExvY2FsZUNoYW5nZWQoYm9vbCBpc1JUTCkKK3sKKyAg
ICBpZiAoaXNSVEwgIT0gbV93ZWJTZXR0aW5ncy0+aXNXcml0aW5nRGlyZWN0aW9uUlRMKCkpIHsK
KyAgICAgICAgbV93ZWJTZXR0aW5ncy0+c2V0V3JpdGluZ0RpcmVjdGlvblJUTChpc1JUTCk7Cisg
ICAgICAgIG1faW5wdXRIYW5kbGVyLT5oYW5kbGVJbnB1dExvY2FsZUNoYW5nZWQoaXNSVEwpOwor
ICAgIH0KK30KKwordm9pZCBXZWJQYWdlOjpzZXRTY3JlZW5PcmllbnRhdGlvbihpbnQgb3JpZW50
YXRpb24pCit7CisgICAgZC0+bV9wZW5kaW5nT3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKK30K
Kwordm9pZCBXZWJQYWdlOjphcHBseVBlbmRpbmdPcmllbnRhdGlvbklmTmVlZGVkKCkKK3sKKyAg
ICBpZiAoZC0+bV9wZW5kaW5nT3JpZW50YXRpb24gIT0gLTEpCisgICAgICAgIGQtPnNldFNjcmVl
bk9yaWVudGF0aW9uKGQtPm1fcGVuZGluZ09yaWVudGF0aW9uKTsKK30KKwordm9pZCBXZWJQYWdl
UHJpdmF0ZTo6c3VzcGVuZEJhY2tpbmdTdG9yZSgpCit7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorICAgIHJlc2V0Q29tcG9zaXRpbmdTdXJmYWNlKCk7CisjZW5kaWYKK30KKwor
dm9pZCBXZWJQYWdlUHJpdmF0ZTo6cmVzdW1lQmFja2luZ1N0b3JlKCkKK3sKKyAgICBBU1NFUlQo
bV93ZWJQYWdlLT5pc1Zpc2libGUoKSk7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCisgICAgc2V0TmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpOworI2VuZGlm
CisKKyAgICBib29sIGRpcmVjdFJlbmRlcmluZyA9IG1fYmFja2luZ1N0b3JlLT5kLT5zaG91bGRE
aXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpOworICAgIGlmICghbV9iYWNraW5nU3RvcmUtPmQtPmlz
QWN0aXZlKCkKKyAgICAgICAgfHwgc2hvdWxkUmVzZXRUaWxlc1doZW5TaG93bigpCisgICAgICAg
IHx8IGRpcmVjdFJlbmRlcmluZykgeworICAgICAgICAvLyBXZSBuZWVkIHRvIHJlc2V0IGFsbCB0
aWxlcyBzbyB0aGF0IHdlIGRvIG5vdCBzaG93IGFueSB0aWxlcyB3aG9zZSBjb250ZW50IG1heQor
ICAgICAgICAvLyBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgYW5vdGhlciBXZWJQYWdlIGluc3RhbmNl
IChpLmUuIGFub3RoZXIgdGFiKS4KKyAgICAgICAgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2V0Q3Vy
cmVudEJhY2tpbmdTdG9yZU93bmVyKG1fd2ViUGFnZSk7CisgICAgICAgIG1fYmFja2luZ1N0b3Jl
LT5kLT5vcmllbnRhdGlvbkNoYW5nZWQoKTsgLy8gVXBkYXRlcyB0aWxlIGdlb21ldHJ5IGFuZCBj
cmVhdGVzIHZpc2libGUgdGlsZSBidWZmZXIuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5y
ZXNldFRpbGVzKHRydWUgLyogcmVzZXRCYWNrZ3JvdW5kICovKTsKKyAgICAgICAgbV9iYWNraW5n
U3RvcmUtPmQtPnVwZGF0ZVRpbGVzKGZhbHNlIC8qIHVwZGF0ZVZpc2libGUgKi8sIGZhbHNlIC8q
IGltbWVkaWF0ZSAqLyk7CisgICAgICAgIC8vIFRoaXMgdmFsdWUgbWF5IGhhdmUgY2hhbmdlZCwg
c28gd2UgbmVlZCB0byB1cGRhdGUgaXQuCisgICAgICAgIGRpcmVjdFJlbmRlcmluZyA9IG1fYmFj
a2luZ1N0b3JlLT5kLT5zaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpOworICAgICAgICBp
ZiAobV9iYWNraW5nU3RvcmUtPmQtPnJlbmRlclZpc2libGVDb250ZW50cygpICYmICFtX2JhY2tp
bmdTdG9yZS0+ZC0+aXNTdXNwZW5kZWQoKSAmJiAhZGlyZWN0UmVuZGVyaW5nKQorICAgICAgICAg
ICAgbV9iYWNraW5nU3RvcmUtPmQtPmJsaXRWaXNpYmxlQ29udGVudHMoKTsKKyAgICB9IGVsc2Ug
eworICAgICAgICAvLyBSZW5kZXJpbmcgd2FzIGRpc2FibGVkIHdoaWxlIHdlIHdlcmUgaGlkZGVu
LCBzbyB3ZSBuZWVkIHRvIHVwZGF0ZSBhbGwgdGlsZXMuCisgICAgICAgIG1fYmFja2luZ1N0b3Jl
LT5kLT51cGRhdGVUaWxlcyh0cnVlIC8qIHVwZGF0ZVZpc2libGUgKi8sIGZhbHNlIC8qIGltbWVk
aWF0ZSAqLyk7CisgICAgfQorCisgICAgc2V0U2hvdWxkUmVzZXRUaWxlc1doZW5TaG93bihmYWxz
ZSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldFNjcmVlbk9yaWVudGF0aW9uKGludCBv
cmllbnRhdGlvbikKK3sKKyAgICBGT1JfRUFDSF9QTFVHSU5WSUVXKG1fcGx1Z2luVmlld3MpCisg
ICAgICAgICgqaXQpLT5oYW5kbGVPcmllbnRhdGlvbkV2ZW50KG9yaWVudGF0aW9uKTsKKworICAg
IG1fcGVuZGluZ09yaWVudGF0aW9uID0gLTE7CisKKyNpZiBFTkFCTEUoT1JJRU5UQVRJT05fRVZF
TlRTKQorICAgIGlmIChtX21haW5GcmFtZS0+b3JpZW50YXRpb24oKSA9PSBvcmllbnRhdGlvbikK
KyAgICAgICAgcmV0dXJuOworICAgIGZvciAoUmVmUHRyPEZyYW1lPiBmcmFtZSA9IG1fbWFpbkZy
YW1lOyBmcmFtZTsgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT50cmF2ZXJzZU5leHQoKSkKKyAgICAg
ICAgZnJhbWUtPnNlbmRPcmllbnRhdGlvbkNoYW5nZUV2ZW50KG9yaWVudGF0aW9uKTsKKyNlbmRp
ZgorfQorCitQbGF0Zm9ybTo6SW50U2l6ZSBXZWJQYWdlOjp2aWV3cG9ydFNpemUoKSBjb25zdAor
eworICAgIHJldHVybiBkLT50cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKCk7Cit9CisKK3Zv
aWQgV2ViUGFnZTo6c2V0Vmlld3BvcnRTaXplKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiB2aWV3
cG9ydFNpemUsIGJvb2wgZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJsZSkKK3sKKyAgICBkLT5zZXRW
aWV3cG9ydFNpemUodmlld3BvcnRTaXplLCBlbnN1cmVGb2N1c0VsZW1lbnRWaXNpYmxlKTsKK30K
Kwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2NyZWVuUm90YXRlZCgpCit7CisgICAgLy8gVGhpcyBj
YWxsIHdpbGwgY2F1c2UgdGhlIGNsaWVudCB0byByZWFsbG9jYXRlIHRoZSB3aW5kb3cgYnVmZmVy
IHRvIG5ldyBzaXplLAorICAgIC8vIHdoaWNoIG5lZWRzIHRvIGJlIHNlcmlhbGl6ZWQgd2l0aCB1
c2FnZSBvZiB0aGUgd2luZG93IGJ1ZmZlci4gQWNjb21wbGlzaAorICAgIC8vIHRoaXMgYnkgc2Vu
ZGluZyBhIHN5bmMgbWVzc2FnZSB0byB0aGUgY29tcG9zaXRpbmcgdGhyZWFkLiBBbGwgb3RoZXIg
dXNhZ2Ugb2YKKyAgICAvLyB0aGUgd2luZG93IGJ1ZmZlciBoYXBwZW5zIG9uIHRoZSBjb21wb3Np
dGluZyB0aHJlYWQuCisgICAgaWYgKCFQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3Nh
Z2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgUGxhdGZvcm06OnVzZXJJ
bnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoU3luY01lc3NhZ2UoCisgICAg
ICAgICAgICBQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJldlYlBhZ2VQcml2YXRl
OjpzY3JlZW5Sb3RhdGVkLCB0aGlzKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBT
dXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+bm90aWZ5U2NyZWVuUm90YXRlZCgpOwor
ICAgIG1fY2xpZW50LT5ub3RpZnlTY3JlZW5Sb3RhdGVkKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVBy
aXZhdGU6OnNldFZpZXdwb3J0U2l6ZShjb25zdCBJbnRTaXplJiB0cmFuc2Zvcm1lZEFjdHVhbFZp
c2libGVTaXplLCBib29sIGVuc3VyZUZvY3VzRWxlbWVudFZpc2libGUpCit7CisgICAgaWYgKG1f
cGVuZGluZ09yaWVudGF0aW9uID09IC0xICYmIHRyYW5zZm9ybWVkQWN0dWFsVmlzaWJsZVNpemUg
PT0gdGhpcy0+dHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSgpKQorICAgICAgICByZXR1cm47
CisKKyAgICAvLyBTdXNwZW5kIGFsbCBzY3JlZW4gdXBkYXRlcyB0byB0aGUgYmFja2luZ3N0b3Jl
IHRvIG1ha2Ugc3VyZSBuby1vbmUgdHJpZXMgdG8gYmxpdAorICAgIC8vIHdoaWxlIHRoZSB3aW5k
b3cgc3VyZmFjZSBhbmQgdGhlIEJhY2tpbmdTdG9yZSBhcmUgb3V0IG9mIHN5bmMuCisgICAgbV9i
YWNraW5nU3RvcmUtPmQtPnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7CisK
KyAgICAvLyBUaGUgc2NyZWVuIHJvdGF0aW9uIGlzIGEgbWFqb3Igc3RhdGUgdHJhbnNpdGlvbiB0
aGF0IGluIHRoaXMgY2FzZSBpcyBub3QgcHJvcGVybHkKKyAgICAvLyBjb21tdW5pY2F0ZWQgdG8g
dGhlIGJhY2tpbmcgc3RvcmUsIHNpbmNlIGl0IGRvZXMgZWFybHkgcmV0dXJuIGluIG1vc3QgbWV0
aG9kcyB3aGVuCisgICAgLy8gbm90IHZpc2libGUuCisgICAgaWYgKCFtX3Zpc2libGUgfHwgIW1f
YmFja2luZ1N0b3JlLT5kLT5pc0FjdGl2ZSgpKQorICAgICAgICBzZXRTaG91bGRSZXNldFRpbGVz
V2hlblNob3duKHRydWUpOworCisgICAgYm9vbCBoYXNQZW5kaW5nT3JpZW50YXRpb24gPSBtX3Bl
bmRpbmdPcmllbnRhdGlvbiAhPSAtMTsKKyAgICBpZiAoaGFzUGVuZGluZ09yaWVudGF0aW9uKQor
ICAgICAgICBzY3JlZW5Sb3RhdGVkKCk7CisKKyAgICAvLyBUaGUgd2luZG93IGJ1ZmZlcnMgbWln
aHQgaGF2ZSBiZWVuIHJlY3JlYXRlZCwgY2xlYXJlZCwgbW92ZWQsIGV0Yy4sIHNvOgorICAgIG1f
YmFja2luZ1N0b3JlLT5kLT53aW5kb3dGcm9udEJ1ZmZlclN0YXRlKCktPmNsZWFyQmxpdHRlZFJl
Z2lvbigpOworICAgIG1fYmFja2luZ1N0b3JlLT5kLT53aW5kb3dCYWNrQnVmZmVyU3RhdGUoKS0+
Y2xlYXJCbGl0dGVkUmVnaW9uKCk7CisKKyAgICBJbnRTaXplIHZpZXdwb3J0U2l6ZUJlZm9yZSA9
IGFjdHVhbFZpc2libGVTaXplKCk7CisgICAgRmxvYXRQb2ludCBjZW50ZXJPZlZpc2libGVDb250
ZW50c1JlY3QgPSB0aGlzLT5jZW50ZXJPZlZpc2libGVDb250ZW50c1JlY3QoKTsKKyAgICBib29s
IG5ld1Zpc2libGVSZWN0Q29udGFpbnNPbGRWaXNpYmxlUmVjdCA9IChtX2FjdHVhbFZpc2libGVI
ZWlnaHQgPD0gdHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZS5oZWlnaHQoKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtX2FjdHVhbFZpc2libGVXaWR0
aCA8PSB0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplLndpZHRoKCkpOworCisgICAgYm9vbCBh
dEluaXRpYWxTY2FsZSA9IGN1cnJlbnRTY2FsZSgpID09IGluaXRpYWxTY2FsZSgpOworICAgIGJv
b2wgYXRUb3AgPSAhc2Nyb2xsUG9zaXRpb24oKS55KCk7CisgICAgYm9vbCBhdExlZnQgPSAhc2Ny
b2xsUG9zaXRpb24oKS54KCk7CisKKyAgICAvLyBXZSBuZWVkIHRvIHJlb3JpZW50IHRoZSB2aXNp
YmxlVGlsZVJlY3QgYmVjYXVzZSB0aGUgZm9sbG93aW5nIGNvZGUKKyAgICAvLyBjb3VsZCBjYXVz
ZSBCYWNraW5nU3RvcmU6OnRyYW5zZm9ybUNoYW5nZWQgdG8gYmUgY2FsbGVkLCB3aGVyZSBpdAor
ICAgIC8vIGlzIHVzZWQuCisgICAgLy8gSXQgaXMgb25seSBkZXBlbmRlbnQgb24gdGhlIHRyYW5z
Zm9ybWVkVmlld3BvcnRTaXplIHdoaWNoIGhhcyBiZWVuCisgICAgLy8gdXBkYXRlZCBieSBub3cu
CisgICAgbV9iYWNraW5nU3RvcmUtPmQtPmNyZWF0ZVZpc2libGVUaWxlQnVmZmVyKCk7CisKKyAg
ICBzZXREZWZhdWx0TGF5b3V0U2l6ZSh0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKTsKKwor
ICAgIC8vIFJlY29tcHV0ZSBvdXIgdmlydHVhbCB2aWV3cG9ydC4KKyAgICBib29sIG5lZWRzTGF5
b3V0ID0gZmFsc2U7CisgICAgc3RhdGljIFZpZXdwb3J0QXJndW1lbnRzIGRlZmF1bHRWaWV3cG9y
dEFyZ3VtZW50czsKKyAgICBpZiAoIShtX3ZpZXdwb3J0QXJndW1lbnRzID09IGRlZmF1bHRWaWV3
cG9ydEFyZ3VtZW50cykpIHsKKyAgICAgICAgLy8gV2UgbWF5IG5lZWQgdG8gaW5mZXIgdGhlIHdp
ZHRoIGFuZCBoZWlnaHQgZm9yIHRoZSB2aWV3cG9ydCB3aXRoIHJlc3BlY3QgdG8gdGhlIHJvdGF0
aW9uLgorICAgICAgICBJbnRTaXplIG5ld1ZpcnR1YWxWaWV3cG9ydCA9IHJlY29tcHV0ZVZpcnR1
YWxWaWV3cG9ydEZyb21WaWV3cG9ydEFyZ3VtZW50cygpOworICAgICAgICBBU1NFUlQoIW5ld1Zp
cnR1YWxWaWV3cG9ydC5pc0VtcHR5KCkpOworICAgICAgICBtX3dlYlBhZ2UtPnNldFZpcnR1YWxW
aWV3cG9ydFNpemUobmV3VmlydHVhbFZpZXdwb3J0LndpZHRoKCksIG5ld1ZpcnR1YWxWaWV3cG9y
dC5oZWlnaHQoKSk7CisgICAgICAgIG1fbWFpbkZyYW1lLT52aWV3KCktPnNldFVzZUZpeGVkTGF5
b3V0KHVzZUZpeGVkTGF5b3V0KCkpOworICAgICAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXRG
aXhlZExheW91dFNpemUoZml4ZWRMYXlvdXRTaXplKCkpOworICAgICAgICBuZWVkc0xheW91dCA9
IHRydWU7CisgICAgfQorCisgICAgLy8gV2Ugc3dpdGNoIHRoaXMgc3RyaWN0bHkgYWZ0ZXIgcmVj
b21wdXRpbmcgb3VyIHZpcnR1YWwgdmlld3BvcnQgYXMgem9vbVRvRml0U2NhbGUgaXMgZGVwZW5k
ZW50CisgICAgLy8gdXBvbiB0aGVzZSB2YWx1ZXMgYW5kIHNvIGlzIHRoZSB2aXJ0dWFsIHZpZXdw
b3J0IHJlY2FsY3VsYXRpb24uCisgICAgbV9hY3R1YWxWaXNpYmxlV2lkdGggPSB0cmFuc2Zvcm1l
ZEFjdHVhbFZpc2libGVTaXplLndpZHRoKCk7CisgICAgbV9hY3R1YWxWaXNpYmxlSGVpZ2h0ID0g
dHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZS5oZWlnaHQoKTsKKworICAgIEludFNpemUgdmll
d3BvcnRTaXplQWZ0ZXIgPSBhY3R1YWxWaXNpYmxlU2l6ZSgpOworCisgICAgSW50UG9pbnQgb2Zm
c2V0KHJvdW5kZigodmlld3BvcnRTaXplQmVmb3JlLndpZHRoKCkgLSB2aWV3cG9ydFNpemVBZnRl
ci53aWR0aCgpKSAvIDIuMCksCisgICAgICAgICAgICAgICAgICAgIHJvdW5kZigodmlld3BvcnRT
aXplQmVmb3JlLmhlaWdodCgpIC0gdmlld3BvcnRTaXplQWZ0ZXIuaGVpZ2h0KCkpIC8gMi4wKSk7
CisKKyAgICAvLyBBcyBhIHNwZWNpYWwgY2FzZSwgaWYgd2Ugd2VyZSBhbmNob3JlZCB0byB0aGUg
dG9wIGxlZnQgcG9zaXRpb24gYXQKKyAgICAvLyB0aGUgYmVnaW5uaW5nIG9mIHRoZSByb3RhdGlv
biB0aGVuIHByZXNlcnZlIHRoYXQgYW5jaG9yLgorICAgIGlmIChhdFRvcCkKKyAgICAgICAgb2Zm
c2V0LnNldFkoMCk7CisgICAgaWYgKGF0TGVmdCkKKyAgICAgICAgb2Zmc2V0LnNldFgoMCk7CisK
KyAgICAvLyBJZiB3ZSdyZSBhYm91dCB0byBvdmVyc2Nyb2xsLCBjYXAgdGhlIG9mZnNldCB0byB2
YWxpZCBjb250ZW50LgorICAgIEludFBvaW50IGJvdHRvbVJpZ2h0KAorICAgICAgICBzY3JvbGxQ
b3NpdGlvbigpLngoKSArIHZpZXdwb3J0U2l6ZUFmdGVyLndpZHRoKCksCisgICAgICAgIHNjcm9s
bFBvc2l0aW9uKCkueSgpICsgdmlld3BvcnRTaXplQWZ0ZXIuaGVpZ2h0KCkpOworCisgICAgaWYg
KGJvdHRvbVJpZ2h0LngoKSArIG9mZnNldC54KCkgPiBjb250ZW50c1NpemUoKS53aWR0aCgpKQor
ICAgICAgICBvZmZzZXQuc2V0WChjb250ZW50c1NpemUoKS53aWR0aCgpIC0gYm90dG9tUmlnaHQu
eCgpKTsKKyAgICBpZiAoYm90dG9tUmlnaHQueSgpICsgb2Zmc2V0LnkoKSA+IGNvbnRlbnRzU2l6
ZSgpLmhlaWdodCgpKQorICAgICAgICBvZmZzZXQuc2V0WShjb250ZW50c1NpemUoKS5oZWlnaHQo
KSAtIGJvdHRvbVJpZ2h0LnkoKSk7CisgICAgaWYgKHNjcm9sbFBvc2l0aW9uKCkueCgpICsgb2Zm
c2V0LngoKSA8IDApCisgICAgICAgIG9mZnNldC5zZXRYKC1zY3JvbGxQb3NpdGlvbigpLngoKSk7
CisgICAgaWYgKHNjcm9sbFBvc2l0aW9uKCkueSgpICsgb2Zmc2V0LnkoKSA8IDApCisgICAgICAg
IG9mZnNldC5zZXRZKC1zY3JvbGxQb3NpdGlvbigpLnkoKSk7CisKKyAgICAvLyAuLi5iZWZvcmUg
c2Nyb2xsaW5nLCBiZWNhdXNlIHRoZSBiYWNraW5nIHN0b3JlIHdpbGwgYWxpZ24gaXRzCisgICAg
Ly8gdGlsZSBtYXRyaXggd2l0aCB0aGUgdmlld3BvcnQgYXMgcmVwb3J0ZWQgYnkgdGhlIFNjcm9s
bFZpZXcuCisgICAgc2Nyb2xsQnkob2Zmc2V0LngoKSwgb2Zmc2V0LnkoKSk7CisgICAgbm90aWZ5
VHJhbnNmb3JtZWRTY3JvbGxDaGFuZ2VkKCk7CisKKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+b3Jp
ZW50YXRpb25DaGFuZ2VkKCk7CisgICAgbV9iYWNraW5nU3RvcmUtPmQtPmFjdHVhbFZpc2libGVT
aXplQ2hhbmdlZCh0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKTsKKworICAgIC8vIFVwZGF0
ZSB2aWV3IG1vZGUgb25seSBhZnRlciB3ZSBoYXZlIHVwZGF0ZWQgdGhlIGFjdHVhbAorICAgIC8v
IHZpc2libGUgc2l6ZSBhbmQgcmVzZXQgdGhlIGNvbnRlbnRzIHJlY3QgaWYgbmVjZXNzYXJ5Lgor
ICAgIGlmIChzZXRWaWV3TW9kZSh2aWV3TW9kZSgpKSkKKyAgICAgICAgbmVlZHNMYXlvdXQgPSB0
cnVlOworCisgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHZpZXdwb3J0IHNpemUgb2YgdGhl
IFdlYkNvcmU6OlNjcm9sbFZpZXcuLi4KKyAgICB1cGRhdGVWaWV3cG9ydFNpemUoIWhhc1BlbmRp
bmdPcmllbnRhdGlvbiAvKiBzZXRGaXhlZFJlcG9ydGVkU2l6ZSAqLywgZmFsc2UgLyogc2VuZFJl
c2l6ZUV2ZW50ICovKTsKKyAgICBub3RpZnlUcmFuc2Zvcm1lZENvbnRlbnRzU2l6ZUNoYW5nZWQo
KTsKKworICAgIC8vIElmIGF1dG9tYXRpYyB6b29taW5nIGlzIGRpc2FibGVkLCBwcmV2ZW50IHpv
b21pbmcgYmVsb3cuCisgICAgaWYgKCFtX3dlYlNldHRpbmdzLT5pc1pvb21Ub0ZpdE9uTG9hZCgp
KSB7CisgICAgICAgIGF0SW5pdGlhbFNjYWxlID0gZmFsc2U7CisKKyAgICAgICAgLy8gTm9ybWFs
bHksIGlmIHRoZSBjb250ZW50cyBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgbGF5b3V0IHdpZHRo
LAorICAgICAgICAvLyB3ZSB3b3VsZCB6b29tIGluLiBJZiB6b29tIGlzIGRpc2FibGVkLCB3ZSBu
ZWVkIHRvIGRvIHNvbWV0aGluZyBlbHNlLAorICAgICAgICAvLyBvciB0aGVyZSB3aWxsIGJlIGFy
dGlmYWN0cyBkdWUgdG8gbm9uLXJlbmRlcmVkIGFyZWFzIG91dHNpZGUgb2YgdGhlCisgICAgICAg
IC8vIGNvbnRlbnRzIHNpemUuIElmIHRoZXJlIGlzIGEgdmlydHVhbCB2aWV3cG9ydCwgd2UgYXJl
IG5vdCBhbGxvd2VkCisgICAgICAgIC8vIHRvIG1vZGlmeSB0aGUgZml4ZWQgbGF5b3V0IHNpemUs
IGhvd2V2ZXIuCisgICAgICAgIGlmICghaGFzVmlydHVhbFZpZXdwb3J0KCkgJiYgY29udGVudHNT
aXplKCkud2lkdGgoKSA8IG1fZGVmYXVsdExheW91dFNpemUud2lkdGgoKSkgeworICAgICAgICAg
ICAgbV9tYWluRnJhbWUtPnZpZXcoKS0+c2V0VXNlRml4ZWRMYXlvdXQodXNlRml4ZWRMYXlvdXQo
KSk7CisgICAgICAgICAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXRGaXhlZExheW91dFNpemUo
bV9kZWZhdWx0TGF5b3V0U2l6ZSk7CisgICAgICAgICAgICBuZWVkc0xheW91dCA9IHRydWU7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmVlZHNMYXlvdXQpCisgICAgICAgIHNldE5lZWRz
TGF5b3V0KCk7CisKKyAgICAvLyBOZWVkIHRvIHJlc3VtZSBzbyB0aGF0IHRoZSBiYWNraW5nc3Rv
cmUgd2lsbCBzdGFydCByZWNvcmRpbmcgdGhlIGludmFsaWRhdGVkCisgICAgLy8gcmVjdHMgZnJv
bSBiZWxvdy4KKyAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0
b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6Ok5vbmUpOworCisgICAgLy8gV2UgbWlnaHQgbmVlZCB0
byBsYXlvdXQgaGVyZSB0byBnZXQgYSBjb3JyZWN0IGNvbnRlbnRzU2l6ZSBzbyB0aGF0IHpvb21U
b0ZpdAorICAgIC8vIGlzIGNhbGN1bGF0ZWQgY29ycmVjdGx5LgorICAgIHJlcXVlc3RMYXlvdXRJ
Zk5lZWRlZCgpOworCisgICAgLy8gQXMgYSBzcGVjaWFsIGNhc2UgaWYgd2Ugd2VyZSB6b29tZWQg
dG8gdGhlIGluaXRpYWwgc2NhbGUgYXQgdGhlIGJlZ2lubmluZworICAgIC8vIG9mIHRoZSByb3Rh
dGlvbiB0aGVuIHByZXNlcnZlIHRoYXQgem9vbSBsZXZlbCBldmVuIHdoZW4gaXQgaXMgem9vbVRv
Rml0LgorICAgIGRvdWJsZSBzY2FsZSA9IGF0SW5pdGlhbFNjYWxlID8gaW5pdGlhbFNjYWxlKCkg
OiBjdXJyZW50U2NhbGUoKTsKKworICAgIC8vIERvIG91ciBvd24gY2xhbXBpbmcuCisgICAgc2Nh
bGUgPSBjbGFtcGVkU2NhbGUoc2NhbGUpOworCisgICAgaWYgKGhhc1BlbmRpbmdPcmllbnRhdGlv
bikgeworICAgICAgICAvLyBTZXQgdGhlIGZpeGVkIHJlcG9ydGVkIHNpemUgaGVyZSBzbyB0aGF0
IGlubmVyV2lkdGh8aW5uZXJIZWlnaHQgd29ya3MKKyAgICAgICAgLy8gd2l0aCB0aGlzIG5ldyBz
Y2FsZS4KKyAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggcm90YXRpb25NYXRyaXg7CisgICAg
ICAgIHJvdGF0aW9uTWF0cml4LnNjYWxlKHNjYWxlKTsKKyAgICAgICAgSW50UmVjdCB2aWV3cG9y
dFJlY3QgPSBJbnRSZWN0KEludFBvaW50Ojp6ZXJvKCksIHRyYW5zZm9ybWVkQWN0dWFsVmlzaWJs
ZVNpemUpOworICAgICAgICBJbnRSZWN0IGFjdHVhbFZpc2libGVSZWN0ID0gZW5jbG9zaW5nSW50
UmVjdChyb3RhdGlvbk1hdHJpeC5pbnZlcnNlKCkubWFwUmVjdChGbG9hdFJlY3Qodmlld3BvcnRS
ZWN0KSkpOworICAgICAgICBtX21haW5GcmFtZS0+dmlldygpLT5zZXRGaXhlZFJlcG9ydGVkU2l6
ZShhY3R1YWxWaXNpYmxlUmVjdC5zaXplKCkpOworICAgIH0KKworICAgIC8vIFdlJ3JlIGdvaW5n
IHRvIG5lZWQgdG8gc2VuZCBhIHJlc2l6ZSBldmVudCB0byBKYXZhU2NyaXB0IGJlY2F1c2UKKyAg
ICAvLyBpbm5lcldpZHRoIGFuZCBpbm5lckhlaWdodCBkZXBlbmQgb24gZml4ZWQgcmVwb3J0ZWQg
c2l6ZS4KKyAgICAvLyBUaGlzIGlzIGhvdyB3ZSBzdXBwb3J0IG1vYmlsZSBwYWdlcyB3aGVyZSBK
YXZhU2NyaXB0IHJlc2l6ZXMKKyAgICAvLyB0aGUgcGFnZSBpbiBvcmRlciB0byBnZXQgYXJvdW5k
IHRoZSBmaXhlZCBsYXlvdXQgc2l6ZSwgZS5nLgorICAgIC8vIGdvb2dsZSBtYXBzIHdoZW4gaXQg
ZGV0ZWN0cyBhIG1vYmlsZSB1c2VyIGFnZW50LgorICAgIGlmIChzaG91bGRTZW5kUmVzaXplRXZl
bnQoKSkKKyAgICAgICAgbV9tYWluRnJhbWUtPmV2ZW50SGFuZGxlcigpLT5zZW5kUmVzaXplRXZl
bnQoKTsKKworICAgIC8vIEFzIGEgc3BlY2lhbCBjYXNlIGlmIHdlIHdlcmUgYW5jaG9yZWQgdG8g
dGhlIHRvcCBsZWZ0IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcKKyAgICAvLyBvZiB0aGUgcm90
YXRpb24gdGhlbiBwcmVzZXJ2ZSB0aGF0IGFuY2hvci4KKyAgICBGbG9hdFBvaW50IGFuY2hvciA9
IGNlbnRlck9mVmlzaWJsZUNvbnRlbnRzUmVjdDsKKyAgICBpZiAoYXRUb3ApCisgICAgICAgIGFu
Y2hvci5zZXRZKDApOworICAgIGlmIChhdExlZnQpCisgICAgICAgIGFuY2hvci5zZXRYKDApOwor
CisgICAgLy8gVHJ5IGFuZCB6b29tIGhlcmUgd2l0aCBjbGFtcGluZyBvbi4KKyAgICBpZiAobV9i
YWNraW5nU3RvcmUtPmQtPnNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpIHsKKyAgICAg
ICAgYm9vbCBzdWNjZXNzID0gem9vbUFib3V0UG9pbnQoc2NhbGUsIGFuY2hvciwgZmFsc2UgLyog
ZW5mb3JjZVNjYWxlQ2xhbXBpbmcgKi8sIHRydWUgLyogZm9yY2VSZW5kZXJpbmcgKi8pOworICAg
ICAgICBpZiAoIXN1Y2Nlc3MgJiYgZW5zdXJlRm9jdXNFbGVtZW50VmlzaWJsZSkKKyAgICAgICAg
ICAgIGVuc3VyZUNvbnRlbnRWaXNpYmxlKCFuZXdWaXNpYmxlUmVjdENvbnRhaW5zT2xkVmlzaWJs
ZVJlY3QpOworICAgIH0gZWxzZSBpZiAoIXNjaGVkdWxlWm9vbUFib3V0UG9pbnQoc2NhbGUsIGFu
Y2hvciwgZmFsc2UgLyogZW5mb3JjZVNjYWxlQ2xhbXBpbmcgKi8sIHRydWUgLyogZm9yY2VSZW5k
ZXJpbmcgKi8pKSB7CisgICAgICAgIC8vIFN1c3BlbmQgYWxsIHNjcmVlbiB1cGRhdGVzIHRvIHRo
ZSBiYWNraW5nc3RvcmUuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5zdXNwZW5kU2NyZWVu
QW5kQmFja2luZ1N0b3JlVXBkYXRlcygpOworCisgICAgICAgIC8vIElmIHRoZSB6b29tIGZhaWxl
ZCwgdGhlbiB3ZSBzaG91bGQgc3RpbGwgcHJlc2VydmUgdGhlIHNwZWNpYWwgY2FzZSBvZiBzY3Jv
bGwgcG9zaXRpb24uCisgICAgICAgIEludFBvaW50IHNjcm9sbFBvc2l0aW9uID0gdGhpcy0+c2Ny
b2xsUG9zaXRpb24oKTsKKyAgICAgICAgaWYgKGF0VG9wKQorICAgICAgICAgICAgc2Nyb2xsUG9z
aXRpb24uc2V0WSgwKTsKKyAgICAgICAgaWYgKGF0TGVmdCkKKyAgICAgICAgICAgIHNjcm9sbFBv
c2l0aW9uLnNldFgoMCk7CisgICAgICAgIHNldFNjcm9sbFBvc2l0aW9uKHNjcm9sbFBvc2l0aW9u
KTsKKworICAgICAgICAvLyBUaGVzZSBtaWdodCBoYXZlIGJlZW4gYWx0ZXJlZCBldmVuIGlmIHdl
IGRpZG4ndCB6b29tIHNvIG5vdGlmeSB0aGUgY2xpZW50LgorICAgICAgICBub3RpZnlUcmFuc2Zv
cm1lZENvbnRlbnRzU2l6ZUNoYW5nZWQoKTsKKyAgICAgICAgbm90aWZ5VHJhbnNmb3JtZWRTY3Jv
bGxDaGFuZ2VkKCk7CisKKyAgICAgICAgaWYgKCFuZWVkc0xheW91dCkgeworICAgICAgICAgICAg
Ly8gVGhlIHZpc2libGUgdGlsZXMgZm9yIHNjcm9sbCBtdXN0IGJlIHVwLXRvLWRhdGUgYmVmb3Jl
IHdlIGJsaXQgc2luY2Ugd2UgYXJlIG5vdCBwZXJmb3JtaW5nIGEgbGF5b3V0LgorICAgICAgICAg
ICAgbV9iYWNraW5nU3RvcmUtPmQtPnVwZGF0ZVRpbGVzRm9yU2Nyb2xsT3JOb3RSZW5kZXJlZFJl
Z2lvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuc3VyZUZvY3VzRWxlbWVudFZpc2li
bGUpCisgICAgICAgICAgICBlbnN1cmVDb250ZW50VmlzaWJsZSghbmV3VmlzaWJsZVJlY3RDb250
YWluc09sZFZpc2libGVSZWN0KTsKKworICAgICAgICBpZiAobmVlZHNMYXlvdXQpIHsKKyAgICAg
ICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXNldFRpbGVzKHRydWUpOworICAgICAgICAgICAg
bV9iYWNraW5nU3RvcmUtPmQtPnVwZGF0ZVRpbGVzKGZhbHNlIC8qIHVwZGF0ZVZpc2libGUgKi8s
IGZhbHNlIC8qIGltbWVkaWF0ZSAqLyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSBu
ZWVkIGxheW91dCB0aGVuIHJlbmRlciBhbmQgYmxpdCwgb3RoZXJ3aXNlIGp1c3QgYmxpdCBhcyBv
dXIgdmlld3BvcnQgaGFzIGNoYW5nZWQuCisgICAgICAgIG1fYmFja2luZ1N0b3JlLT5kLT5yZXN1
bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKG5lZWRzTGF5b3V0ID8gQmFja2luZ1N0b3Jl
OjpSZW5kZXJBbmRCbGl0IDogQmFja2luZ1N0b3JlOjpCbGl0KTsKKyAgICB9IGVsc2UgaWYgKGVu
c3VyZUZvY3VzRWxlbWVudFZpc2libGUpCisgICAgICAgIGVuc3VyZUNvbnRlbnRWaXNpYmxlKCFu
ZXdWaXNpYmxlUmVjdENvbnRhaW5zT2xkVmlzaWJsZVJlY3QpOworfQorCit2b2lkIFdlYlBhZ2U6
OnNldERlZmF1bHRMYXlvdXRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBJbnRT
aXplIHNpemUod2lkdGgsIGhlaWdodCk7CisgICAgZC0+c2V0RGVmYXVsdExheW91dFNpemUoc2l6
ZSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldERlZmF1bHRMYXlvdXRTaXplKGNvbnN0
IEludFNpemUmIHNpemUpCit7CisgICAgaWYgKHNpemUgPT0gbV9kZWZhdWx0TGF5b3V0U2l6ZSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgSW50U2l6ZSBzY3JlZW5TaXplID0gUGxhdGZvcm06Okdy
YXBoaWNzOjpTY3JlZW46OnNpemUoKTsKKyAgICBBU1NFUlQoc2l6ZS53aWR0aCgpIDw9IHNjcmVl
blNpemUud2lkdGgoKSAmJiBzaXplLmhlaWdodCgpIDw9IHNjcmVlblNpemUuaGVpZ2h0KCkpOwor
ICAgIG1fZGVmYXVsdExheW91dFNpemUgPSBzaXplLmV4cGFuZGVkVG8obWluaW11bUxheW91dFNp
emUpLnNocnVua1RvKHNjcmVlblNpemUpOworCisgICAgYm9vbCBuZWVkc0xheW91dCA9IHNldFZp
ZXdNb2RlKHZpZXdNb2RlKCkpOworICAgIGlmIChuZWVkc0xheW91dCkgeworICAgICAgICBzZXRO
ZWVkc0xheW91dCgpOworICAgICAgICBpZiAoIWlzTG9hZGluZygpKQorICAgICAgICAgICAgcmVx
dWVzdExheW91dElmTmVlZGVkKCk7CisgICAgfQorfQorCitib29sIFdlYlBhZ2U6Om1vdXNlRXZl
bnQoY29uc3QgUGxhdGZvcm06Ok1vdXNlRXZlbnQmIG1vdXNlRXZlbnQsIGJvb2wqIHdoZWVsRGVs
dGFBY2NlcHRlZCkKK3sKKyAgICBpZiAoIWQtPm1fbWFpbkZyYW1lLT52aWV3KCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIFBsdWdpblZpZXcqIHBsdWdpblZpZXcgPSBkLT5tX2Z1bGxT
Y3JlZW5QbHVnaW5WaWV3LmdldCgpOworICAgIGlmIChwbHVnaW5WaWV3KQorICAgICAgICByZXR1
cm4gZC0+ZGlzcGF0Y2hNb3VzZUV2ZW50VG9GdWxsU2NyZWVuUGx1Z2luKHBsdWdpblZpZXcsIG1v
dXNlRXZlbnQpOworCisgICAgaWYgKG1vdXNlRXZlbnQudHlwZSgpID09IFBsYXRmb3JtOjpNb3Vz
ZUV2ZW50OjpNb3VzZUFib3J0ZWQpIHsKKyAgICAgICAgZC0+bV9tYWluRnJhbWUtPmV2ZW50SGFu
ZGxlcigpLT5zZXRNb3VzZVByZXNzZWQoZmFsc2UpOworICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgfQorCisgICAgZC0+bV9wbHVnaW5NYXlPcGVuTmV3VGFiID0gdHJ1ZTsKKworICAgIGQtPm1f
bGFzdFVzZXJFdmVudFRpbWVzdGFtcCA9IGN1cnJlbnRUaW1lKCk7CisgICAgaW50IGNsaWNrQ291
bnQgPSAoZC0+bV9zZWxlY3Rpb25IYW5kbGVyLT5pc1NlbGVjdGlvbkFjdGl2ZSgpIHx8IG1vdXNl
RXZlbnQudHlwZSgpICE9IFBsYXRmb3JtOjpNb3VzZUV2ZW50OjpNb3VzZU1vdmUpID8gMSA6IDA7
CisKKyAgICAvLyBTZXQgdGhlIGJ1dHRvbiB0eXBlLgorICAgIE1vdXNlQnV0dG9uIGJ1dHRvblR5
cGUgPSBOb0J1dHRvbjsKKyAgICBpZiAobW91c2VFdmVudC5pc0xlZnRCdXR0b24oKSkKKyAgICAg
ICAgYnV0dG9uVHlwZSA9IExlZnRCdXR0b247CisgICAgZWxzZSBpZiAobW91c2VFdmVudC5pc1Jp
Z2h0QnV0dG9uKCkpCisgICAgICAgIGJ1dHRvblR5cGUgPSBSaWdodEJ1dHRvbjsKKyAgICBlbHNl
IGlmIChtb3VzZUV2ZW50LmlzTWlkZGxlQnV0dG9uKCkpCisgICAgICAgIGJ1dHRvblR5cGUgPSBN
aWRkbGVCdXR0b247CisKKyAgICAvLyBDcmVhdGUgb3VyIGV2ZW50LgorICAgIFBsYXRmb3JtTW91
c2VFdmVudCBwbGF0Zm9ybU1vdXNlRXZlbnQoZC0+bWFwRnJvbVRyYW5zZm9ybWVkKG1vdXNlRXZl
bnQucG9zaXRpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBkLT5tYXBGcm9tVHJhbnNmb3JtZWQobW91c2VFdmVudC5zY3JlZW5Qb3NpdGlvbigpKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvV2ViQ29yZU1vdXNlRXZl
bnRUeXBlKG1vdXNlRXZlbnQudHlwZSgpKSwgY2xpY2tDb3VudCwgYnV0dG9uVHlwZSwgUG9pbnRp
bmdEZXZpY2UpOworICAgIGQtPm1fbGFzdE1vdXNlRXZlbnQgPSBwbGF0Zm9ybU1vdXNlRXZlbnQ7
CisgICAgYm9vbCBzdWNjZXNzID0gZC0+aGFuZGxlTW91c2VFdmVudChwbGF0Zm9ybU1vdXNlRXZl
bnQpOworCisgICAgaWYgKG1vdXNlRXZlbnQud2hlZWxUaWNrcygpKSB7CisgICAgICAgIFBsYXRm
b3JtV2hlZWxFdmVudCB3aGVlbEV2ZW50KGQtPm1hcEZyb21UcmFuc2Zvcm1lZChtb3VzZUV2ZW50
LnBvc2l0aW9uKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5t
YXBGcm9tVHJhbnNmb3JtZWQobW91c2VFdmVudC5zY3JlZW5Qb3NpdGlvbigpKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLW1vdXNlRXZlbnQud2hlZWxEZWx0YSgp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAtbW91c2VFdmVudC53
aGVlbFRpY2tzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcm9s
bEJ5UGl4ZWxXaGVlbEV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmYWxzZSAvKiBzaGlmdEtleSAqLywgZmFsc2UgLyogY3RybEtleSAqLywKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYWx0S2V5ICovLCBmYWxzZSAvKiBt
ZXRhS2V5ICovKTsKKyAgICAgICAgaWYgKHdoZWVsRGVsdGFBY2NlcHRlZCkKKyAgICAgICAgICAg
ICp3aGVlbERlbHRhQWNjZXB0ZWQgPSBkLT5oYW5kbGVXaGVlbEV2ZW50KHdoZWVsRXZlbnQpOwor
ICAgIH0gZWxzZSBpZiAod2hlZWxEZWx0YUFjY2VwdGVkKQorICAgICAgICAqd2hlZWxEZWx0YUFj
Y2VwdGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gc3VjY2VzczsKK30KKworYm9vbCBXZWJQYWdl
UHJpdmF0ZTo6ZGlzcGF0Y2hNb3VzZUV2ZW50VG9GdWxsU2NyZWVuUGx1Z2luKFBsdWdpblZpZXcq
IHBsdWdpbiwgY29uc3QgUGxhdGZvcm06Ok1vdXNlRXZlbnQmIGV2ZW50KQoreworICAgIE5QRXZl
bnQgbnBFdmVudDsKKyAgICBOUE1vdXNlRXZlbnQgbW91c2VFdmVudDsKKworICAgIG1vdXNlRXZl
bnQueCA9IGV2ZW50LnNjcmVlblBvc2l0aW9uKCkueCgpOworICAgIG1vdXNlRXZlbnQueSA9IGV2
ZW50LnNjcmVlblBvc2l0aW9uKCkueSgpOworCisgICAgc3dpdGNoIChldmVudC50eXBlKCkpIHsK
KyAgICBjYXNlIFBsYXRmb3JtOjpNb3VzZUV2ZW50OjpNb3VzZUJ1dHRvbkRvd246CisgICAgICAg
IG1vdXNlRXZlbnQudHlwZSA9IE1PVVNFX0JVVFRPTl9ET1dOOworICAgICAgICBtX3BsdWdpbk1v
dXNlQnV0dG9uUHJlc3NlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUGxhdGZv
cm06Ok1vdXNlRXZlbnQ6Ok1vdXNlQnV0dG9uVXA6CisgICAgICAgIG1vdXNlRXZlbnQudHlwZSA9
IE1PVVNFX0JVVFRPTl9VUDsKKyAgICAgICAgbV9wbHVnaW5Nb3VzZUJ1dHRvblByZXNzZWQgPSBm
YWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQbGF0Zm9ybTo6TW91c2VFdmVudDo6TW91
c2VNb3ZlOgorICAgICAgICBtb3VzZUV2ZW50LnR5cGUgPSBNT1VTRV9NT1RJT047CisgICAgICAg
IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg
ICBtb3VzZUV2ZW50LmZsYWdzID0gMDsKKyAgICBtb3VzZUV2ZW50LmJ1dHRvbiA9IG1fcGx1Z2lu
TW91c2VCdXR0b25QcmVzc2VkOworCisgICAgbnBFdmVudC50eXBlID0gTlBfTW91c2VFdmVudDsK
KyAgICBucEV2ZW50LmRhdGEgPSAmbW91c2VFdmVudDsKKworICAgIHJldHVybiBwbHVnaW4tPmRp
c3BhdGNoRnVsbFNjcmVlbk5QRXZlbnQobnBFdmVudCk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZh
dGU6OmhhbmRsZU1vdXNlRXZlbnQoUGxhdGZvcm1Nb3VzZUV2ZW50JiBtb3VzZUV2ZW50KQorewor
ICAgIEV2ZW50SGFuZGxlciogZXZlbnRIYW5kbGVyID0gbV9tYWluRnJhbWUtPmV2ZW50SGFuZGxl
cigpOworCisgICAgaWYgKG1vdXNlRXZlbnQuZXZlbnRUeXBlKCkgPT0gTW91c2VFdmVudE1vdmVk
KQorICAgICAgICByZXR1cm4gZXZlbnRIYW5kbGVyLT5tb3VzZU1vdmVkKG1vdXNlRXZlbnQpOwor
CisgICAgaWYgKG1vdXNlRXZlbnQuZXZlbnRUeXBlKCkgPT0gTW91c2VFdmVudFNjcm9sbCkKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBOb2RlKiBub2RlID0gMDsKKyAgICBpZiAobW91c2VF
dmVudC5pbnB1dE1ldGhvZCgpID09IFRvdWNoU2NyZWVuKSB7CisgICAgICAgIGNvbnN0IEZhdEZp
bmdlcnNSZXN1bHQgbGFzdEZhdEZpbmdlcnNSZXN1bHQgPSBtX3RvdWNoRXZlbnRIYW5kbGVyLT5s
YXN0RmF0RmluZ2Vyc1Jlc3VsdCgpOworCisgICAgICAgIC8vIEZhdCBmaW5nZXJzIGNhbiBkZWFs
IHdpdGggc2hhZG93IGNvbnRlbnQuCisgICAgICAgIG5vZGUgPSBsYXN0RmF0RmluZ2Vyc1Jlc3Vs
dC5ub2RlKFNoYWRvd0NvbnRlbnROb3RBbGxvd2VkKTsKKyAgICB9CisKKyAgICBpZiAoIW5vZGUp
IHsKKyAgICAgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQgPSBldmVudEhhbmRsZXItPmhpdFRlc3RS
ZXN1bHRBdFBvaW50KG1hcEZyb21WaWV3cG9ydFRvQ29udGVudHMobW91c2VFdmVudC5wb3MoKSks
IGZhbHNlIC8qYWxsb3dTaGFkb3dDb250ZW50Ki8pOworICAgICAgICBub2RlID0gcmVzdWx0Lmlu
bmVyTm9kZSgpOworICAgIH0KKworICAgIGlmIChtb3VzZUV2ZW50LmV2ZW50VHlwZSgpID09IE1v
dXNlRXZlbnRQcmVzc2VkKSB7CisgICAgICAgIGlmIChtX2lucHV0SGFuZGxlci0+d2lsbE9wZW5Q
b3B1cEZvck5vZGUobm9kZSkpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdCBhbGxvdyBhbnkgaHVt
YW4gZ2VuZXJhdGVkIG1vdXNlIG9yIGtleWJvYXJkIGV2ZW50cyB0byBzZWxlY3QgPG9wdGlvbj5z
IGluIHRoZSBsaXN0IGJveAorICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSB1c2UgYSBwb3AgdXAg
ZGlhbG9nIHRvIGhhbmRsZSB0aGUgYWN0dWFsIHNlbGVjdGlvbnMuIFRoaXMgcHJldmVudHMgb3B0
aW9ucyBmcm9tCisgICAgICAgICAgICAvLyBiZWluZyBzZWxlY3RlZCBwcmlvciB0byBkaXNwbGF5
aW5nIHRoZSBwb3AgdXAgZGlhbG9nLiBUaGUgY29udGVudHMgb2YgdGhlIGxpc3Rib3ggYXJlIGZv
cgorICAgICAgICAgICAgLy8gZGlzcGxheSBvbmx5LgorICAgICAgICAgICAgLy8KKyAgICAgICAg
ICAgIC8vIEZJWE1FOiBXZSBleHBsaWNpdGx5IGRvIG5vdCBmb3J3YXJkIHRoaXMgZXZlbnQgdG8g
V2ViQ29yZSBzbyBhcyB0byBwcmVzZXJ2ZSBzeW1tZXRyeSB3aXRoCisgICAgICAgICAgICAvLyB0
aGUgTW91c2VFdmVudFJlbGVhc2VkIGhhbmRsaW5nIChiZWxvdykuIFRoaXMgaGFzIHRoZSBzaWRl
LWVmZmVjdCB0aGF0IG1vdXNlZG93biBldmVudHMKKyAgICAgICAgICAgIC8vIGFyZSBub3QgZmly
ZWQgZm9yIGh1bWFuIGdlbmVyYXRlZCBtb3VzZSBwcmVzcyBldmVudHMuIFNlZSBSSU0gQnVnICMx
NTc5LgorCisgICAgICAgICAgICAvLyBXZSBkbyBmb2N1cyA8c2VsZWN0Pi88b3B0aW9uPiBvbiBt
b3VzZSBkb3duIHNvIHRoYXQgYSBGb2N1cyBldmVudCBpcyBmaXJlZCBhbmQgaGF2ZSB0aGUKKyAg
ICAgICAgICAgIC8vIGVsZW1lbnQgcGFpbnRlZCBpbiBpdHMgZm9jdXMgc3RhdGUgb24gcmVwYWlu
dC4KKyAgICAgICAgICAgIEFTU0VSVChub2RlLT5pc0VsZW1lbnROb2RlKCkpOworICAgICAgICAg
ICAgaWYgKG5vZGUtPmlzRWxlbWVudE5vZGUoKSkgeworICAgICAgICAgICAgICAgIEVsZW1lbnQq
IGVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obm9kZSk7CisgICAgICAgICAgICAgICAg
ZWxlbWVudC0+Zm9jdXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAg
ICAgICBldmVudEhhbmRsZXItPmhhbmRsZU1vdXNlUHJlc3NFdmVudChtb3VzZUV2ZW50KTsKKyAg
ICB9IGVsc2UgaWYgKG1vdXNlRXZlbnQuZXZlbnRUeXBlKCkgPT0gTW91c2VFdmVudFJlbGVhc2Vk
KSB7CisgICAgICAgIC8vIEZJWE1FOiBGb3IgPHNlbGVjdD4gYW5kIDxvcHRpb25zPiBlbGVtZW50
cywgd2UgZXhwbGljaXRseSBkbyBub3QgZm9yd2FyZCB0aGlzIGV2ZW50IHRvIFdlYkNvcmUgc28K
KyAgICAgICAgLy8gYXMgdG8gcHJlc2VydmUgc3ltbWV0cnkgd2l0aCB0aGUgTW91c2VFdmVudFBy
ZXNzZWQgaGFuZGxpbmcgKGFib3ZlKS4gVGhpcyBoYXMgdGhlIHNpZGUtZWZmZWN0IHRoYXQKKyAg
ICAgICAgLy8gbW91c2V1cCBldmVudHMgYXJlIG5vdCBmaXJlZCBvbiBzdWNoIGVsZW1lbnRzIGZv
ciBodW1hbiBnZW5lcmF0ZWQgbW91c2UgcmVsZWFzZSBldmVudHMuIFNlZSBSSU0gQnVnICMxNTc5
LgorICAgICAgICBpZiAoIW1faW5wdXRIYW5kbGVyLT5kaWROb2RlT3BlblBvcHVwKG5vZGUpKQor
ICAgICAgICAgICAgZXZlbnRIYW5kbGVyLT5oYW5kbGVNb3VzZVJlbGVhc2VFdmVudChtb3VzZUV2
ZW50KTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBXZWJQYWdlUHJpdmF0
ZTo6aGFuZGxlV2hlZWxFdmVudChQbGF0Zm9ybVdoZWVsRXZlbnQmIHdoZWVsRXZlbnQpCit7Cisg
ICAgcmV0dXJuIG1fbWFpbkZyYW1lLT5ldmVudEhhbmRsZXIoKS0+aGFuZGxlV2hlZWxFdmVudCh3
aGVlbEV2ZW50KTsKK30KKworYm9vbCBXZWJQYWdlOjp0b3VjaEV2ZW50KGNvbnN0IFBsYXRmb3Jt
OjpUb3VjaEV2ZW50JiBldmVudCkKK3sKKyNpZiBERUJVR19UT1VDSF9FVkVOVFMKKyAgICBzd2l0
Y2ggKGV2ZW50Lm1fdHlwZSkgeworICAgIGNhc2UgUGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNo
RW5kOgorICAgICAgICBQbGF0Zm9ybTo6bG9nKFBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAi
V2ViUGFnZTo6dG91Y2hFdmVudCBUb3VjaCBFbmQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hTdGFydDoKKyAgICAgICAgUGxhdGZvcm06Omxv
ZyhQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIldlYlBhZ2U6OnRvdWNoRXZlbnQgVG91Y2gg
U3RhcnQiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6
VG91Y2hNb3ZlOgorICAgICAgICBQbGF0Zm9ybTo6bG9nKFBsYXRmb3JtOjpMb2dMZXZlbENyaXRp
Y2FsLCAiV2ViUGFnZTo6dG91Y2hFdmVudCBUb3VjaCBNb3ZlIik7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgUGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNoQ2FuY2VsOgorICAgICAgICBQbGF0
Zm9ybTo6bG9nKFBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiV2ViUGFnZTo6dG91Y2hDYW5j
ZWwgVG91Y2ggQ2FuY2VsIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBldmVudC5tX3BvaW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBz
d2l0Y2ggKGV2ZW50Lm1fcG9pbnRzW2ldLm1fc3RhdGUpIHsKKyAgICAgICAgY2FzZSBQbGF0Zm9y
bTo6VG91Y2hQb2ludDo6VG91Y2hQcmVzc2VkOgorICAgICAgICAgICAgUGxhdGZvcm06OmxvZyhQ
bGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIldlYlBhZ2U6OnRvdWNoRXZlbnQgJWQgVG91Y2gg
UHJlc3NlZCAoJWQsICVkKSIsIGV2ZW50Lm1fcG9pbnRzW2ldLm1faWQsIGV2ZW50Lm1fcG9pbnRz
W2ldLm1fcG9zLngoKSwgZXZlbnQubV9wb2ludHNbaV0ubV9wb3MueSgpKTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBjYXNlIFBsYXRmb3JtOjpUb3VjaFBvaW50OjpUb3VjaFJlbGVhc2Vk
OgorICAgICAgICAgICAgUGxhdGZvcm06OmxvZyhQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwg
IldlYlBhZ2U6OnRvdWNoRXZlbnQgJWQgVG91Y2ggUmVsZWFzZWQgKCVkLCAlZCkiLCBldmVudC5t
X3BvaW50c1tpXS5tX2lkLCBldmVudC5tX3BvaW50c1tpXS5tX3Bvcy54KCksIGV2ZW50Lm1fcG9p
bnRzW2ldLm1fcG9zLnkoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0
Zm9ybTo6VG91Y2hQb2ludDo6VG91Y2hNb3ZlZDoKKyAgICAgICAgICAgIFBsYXRmb3JtOjpsb2co
UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJXZWJQYWdlOjp0b3VjaEV2ZW50ICVkIFRvdWNo
IE1vdmVkICglZCwgJWQpIiwgZXZlbnQubV9wb2ludHNbaV0ubV9pZCwgZXZlbnQubV9wb2ludHNb
aV0ubV9wb3MueCgpLCBldmVudC5tX3BvaW50c1tpXS5tX3Bvcy55KCkpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm06OlRvdWNoUG9pbnQ6OlRvdWNoU3RhdGlvbmFy
eToKKyAgICAgICAgICAgIFBsYXRmb3JtOjpsb2coUGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWws
ICJXZWJQYWdlOjp0b3VjaEV2ZW50ICVkIFRvdWNoIFN0YXRpb25hcnkgKCVkLCAlZCkiLCBldmVu
dC5tX3BvaW50c1tpXS5tX2lkLCBldmVudC5tX3BvaW50c1tpXS5tX3Bvcy54KCksIGV2ZW50Lm1f
cG9pbnRzW2ldLm1fcG9zLnkoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
IH0KKyNlbmRpZgorCisjaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKKyAgICBQbHVnaW5WaWV3KiBw
bHVnaW5WaWV3ID0gZC0+bV9mdWxsU2NyZWVuUGx1Z2luVmlldy5nZXQoKTsKKyAgICBpZiAocGx1
Z2luVmlldykKKyAgICAgICAgcmV0dXJuIGQtPmRpc3BhdGNoVG91Y2hFdmVudFRvRnVsbFNjcmVl
blBsdWdpbihwbHVnaW5WaWV3LCBldmVudCk7CisKKyAgICBpZiAoIWQtPm1fbWFpbkZyYW1lKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBQbGF0Zm9ybTo6VG91Y2hFdmVudCB0RXZlbnQg
PSBldmVudDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZXZlbnQubV9wb2ludHMuc2l6
ZSgpOyBpKyspIHsKKyAgICAgICAgdEV2ZW50Lm1fcG9pbnRzW2ldLm1fcG9zID0gZC0+bWFwRnJv
bVRyYW5zZm9ybWVkKHRFdmVudC5tX3BvaW50c1tpXS5tX3Bvcyk7CisgICAgICAgIHRFdmVudC5t
X3BvaW50c1tpXS5tX3NjcmVlblBvcyA9IGQtPm1hcEZyb21UcmFuc2Zvcm1lZCh0RXZlbnQubV9w
b2ludHNbaV0ubV9zY3JlZW5Qb3MpOworICAgIH0KKworICAgIFBsYXRmb3JtOjpHZXN0dXJlIHRh
cEdlc3R1cmU7CisgICAgaWYgKGV2ZW50Lmhhc0dlc3R1cmUoUGxhdGZvcm06Okdlc3R1cmU6OlNp
bmdsZVRhcCkpCisgICAgICAgIGQtPm1fcGx1Z2luTWF5T3Blbk5ld1RhYiA9IHRydWU7CisgICAg
ZWxzZSBpZiAodEV2ZW50Lm1fdHlwZSA9PSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hTdGFy
dCB8fCB0RXZlbnQubV90eXBlID09IFBsYXRmb3JtOjpUb3VjaEV2ZW50OjpUb3VjaENhbmNlbCkK
KyAgICAgICAgZC0+bV9wbHVnaW5NYXlPcGVuTmV3VGFiID0gZmFsc2U7CisKKyAgICBib29sIGhh
bmRsZWQgPSBmYWxzZTsKKworICAgIGlmIChkLT5tX25lZWRUb3VjaEV2ZW50cyAmJiAhZXZlbnQu
aGFzR2VzdHVyZShQbGF0Zm9ybTo6R2VzdHVyZTo6SW5qZWN0ZWQpKQorICAgICAgICBoYW5kbGVk
ID0gZC0+bV9tYWluRnJhbWUtPmV2ZW50SGFuZGxlcigpLT5oYW5kbGVUb3VjaEV2ZW50KFBsYXRm
b3JtVG91Y2hFdmVudCgmdEV2ZW50KSk7CisKKyAgICAvLyBVbnByZXNzIG1vdXNlIGlmIHRvdWNo
IGVuZCBpcyBjb25zdW1lZCBieSBhIEphdmFTY3JpcHQgdG91Y2ggaGFuZGxlciwgb3RoZXJ3aXNl
IHRoZSBtb3VzZSBzdGF0ZSB3aWxsIHJlbWFpbiBwcmVzc2VkCisgICAgLy8gd2hpY2ggY291bGQg
ZWl0aGVyIG1lc3MgdXAgdGhlIGludGVybmFsIG1vdXNlIHN0YXRlIG9yIHN0YXJ0IHRleHQgc2Vs
ZWN0aW9uIG9uIHRoZSBuZXh0IG1vdXNlIG1vdmUvZG93bi4KKyAgICBpZiAodEV2ZW50Lm1fdHlw
ZSA9PSBQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hFbmQgJiYgaGFuZGxlZCAmJiBkLT5tX21h
aW5GcmFtZS0+ZXZlbnRIYW5kbGVyKCktPm1vdXNlUHJlc3NlZCgpKQorICAgICAgICBkLT5tX3Rv
dWNoRXZlbnRIYW5kbGVyLT50b3VjaEV2ZW50Q2FuY2VsKCk7CisKKyAgICBpZiAoZC0+bV9wcmV2
ZW50RGVmYXVsdE9uVG91Y2hTdGFydCkgeworICAgICAgICBpZiAodEV2ZW50Lm1fdHlwZSA9PSBQ
bGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91Y2hFbmQgfHwgdEV2ZW50Lm1fdHlwZSA9PSBQbGF0Zm9y
bTo6VG91Y2hFdmVudDo6VG91Y2hDYW5jZWwpCisgICAgICAgICAgICBkLT5tX3ByZXZlbnREZWZh
dWx0T25Ub3VjaFN0YXJ0ID0gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKwor
ICAgIGlmIChoYW5kbGVkKSB7CisgICAgICAgIGlmICh0RXZlbnQubV90eXBlID09IFBsYXRmb3Jt
OjpUb3VjaEV2ZW50OjpUb3VjaFN0YXJ0KQorICAgICAgICAgICAgZC0+bV9wcmV2ZW50RGVmYXVs
dE9uVG91Y2hTdGFydCA9IHRydWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IGlmIChldmVudC5oYXNHZXN0dXJlKFBsYXRmb3JtOjpHZXN0dXJlOjpUb3VjaEhvbGQpKQorICAg
ICAgICBkLT5tX3RvdWNoRXZlbnRIYW5kbGVyLT50b3VjaEhvbGRFdmVudCgpOworI2VuZGlmCisK
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0U2Nyb2xsT3JpZ2luUG9p
bnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBwb2ludCkKK3sKKyAgICBQbGF0Zm9ybTo6SW50
UG9pbnQgdW50cmFuc2Zvcm1lZFBvaW50ID0gZC0+bWFwRnJvbVRyYW5zZm9ybWVkKHBvaW50KTsK
KyAgICBkLT5zZXRTY3JvbGxPcmlnaW5Qb2ludCh1bnRyYW5zZm9ybWVkUG9pbnQpOworfQorCit2
b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXRTY3JvbGxPcmlnaW5Qb2ludChjb25zdCBQbGF0Zm9ybTo6
SW50UG9pbnQmIHBvaW50KQoreworICAgIG1faW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGUgPSAw
OworCisgICAgaWYgKCFtX2hhc0luUmVnaW9uU2Nyb2xsYWJsZUFyZWFzKQorICAgICAgICByZXR1
cm47CisKKyAgICBtX2NsaWVudC0+bm90aWZ5SW5SZWdpb25TY3JvbGxpbmdTdGFydGluZ1BvaW50
Q2hhbmdlZChpblJlZ2lvblNjcm9sbGFibGVBcmVhc0ZvclBvaW50KHBvaW50KSk7Cit9CisKK2Jv
b2wgV2ViUGFnZVByaXZhdGU6OmRpc3BhdGNoVG91Y2hFdmVudFRvRnVsbFNjcmVlblBsdWdpbihQ
bHVnaW5WaWV3KiBwbHVnaW4sIGNvbnN0IFBsYXRmb3JtOjpUb3VjaEV2ZW50JiBldmVudCkKK3sK
KyAgICBOUFRvdWNoRXZlbnQgbnBUb3VjaEV2ZW50OworCisgICAgaWYgKGV2ZW50Lmhhc0dlc3R1
cmUoUGxhdGZvcm06Okdlc3R1cmU6OkRvdWJsZVRhcCkpCisgICAgICAgIG5wVG91Y2hFdmVudC50
eXBlID0gVE9VQ0hfRVZFTlRfRE9VQkxFVEFQOworICAgIGVsc2UgaWYgKGV2ZW50Lmhhc0dlc3R1
cmUoUGxhdGZvcm06Okdlc3R1cmU6OlRvdWNoSG9sZCkpCisgICAgICAgIG5wVG91Y2hFdmVudC50
eXBlID0gVE9VQ0hfRVZFTlRfVE9VQ0hIT0xEOworICAgIGVsc2UgeworICAgICAgICBzd2l0Y2gg
KGV2ZW50Lm1fdHlwZSkgeworICAgICAgICBjYXNlIFBsYXRmb3JtOjpUb3VjaEV2ZW50OjpUb3Vj
aFN0YXJ0OgorICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnR5cGUgPSBUT1VDSF9FVkVOVF9TVEFS
VDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBsYXRmb3JtOjpUb3VjaEV2ZW50
OjpUb3VjaEVuZDoKKyAgICAgICAgICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hfRVZFTlRf
RU5EOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm06OlRvdWNoRXZl
bnQ6OlRvdWNoTW92ZToKKyAgICAgICAgICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9VQ0hfRVZF
TlRfTU9WRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBsYXRmb3JtOjpUb3Vj
aEV2ZW50OjpUb3VjaENhbmNlbDoKKyAgICAgICAgICAgIG5wVG91Y2hFdmVudC50eXBlID0gVE9V
Q0hfRVZFTlRfQ0FOQ0VMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBucFRvdWNo
RXZlbnQucG9pbnRzID0gMDsKKyAgICBucFRvdWNoRXZlbnQuc2l6ZSA9IGV2ZW50Lm1fcG9pbnRz
LnNpemUoKTsKKyAgICBpZiAobnBUb3VjaEV2ZW50LnNpemUpIHsKKyAgICAgICAgbnBUb3VjaEV2
ZW50LnBvaW50cyA9IG5ldyBOUFRvdWNoUG9pbnRbbnBUb3VjaEV2ZW50LnNpemVdOworICAgICAg
ICBmb3IgKGludCBpID0gMDsgaSA8IG5wVG91Y2hFdmVudC5zaXplOyBpKyspIHsKKyAgICAgICAg
ICAgIG5wVG91Y2hFdmVudC5wb2ludHNbaV0udG91Y2hJZCA9IGV2ZW50Lm1fcG9pbnRzW2ldLm1f
aWQ7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLmNsaWVudFggPSBldmVudC5t
X3BvaW50c1tpXS5tX3NjcmVlblBvcy54KCk7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9p
bnRzW2ldLmNsaWVudFkgPSBldmVudC5tX3BvaW50c1tpXS5tX3NjcmVlblBvcy55KCk7CisgICAg
ICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLnNjcmVlblggPSBldmVudC5tX3BvaW50c1tp
XS5tX3NjcmVlblBvcy54KCk7CisgICAgICAgICAgICBucFRvdWNoRXZlbnQucG9pbnRzW2ldLnNj
cmVlblkgPSBldmVudC5tX3BvaW50c1tpXS5tX3NjcmVlblBvcy55KCk7CisgICAgICAgICAgICBu
cFRvdWNoRXZlbnQucG9pbnRzW2ldLnBhZ2VYID0gZXZlbnQubV9wb2ludHNbaV0ubV9wb3MueCgp
OworICAgICAgICAgICAgbnBUb3VjaEV2ZW50LnBvaW50c1tpXS5wYWdlWSA9IGV2ZW50Lm1fcG9p
bnRzW2ldLm1fcG9zLnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE5QRXZlbnQgbnBFdmVu
dDsKKyAgICBucEV2ZW50LnR5cGUgPSBOUF9Ub3VjaEV2ZW50OworICAgIG5wRXZlbnQuZGF0YSA9
ICZucFRvdWNoRXZlbnQ7CisKKyAgICBib29sIGhhbmRsZWQgPSBwbHVnaW4tPmRpc3BhdGNoRnVs
bFNjcmVlbk5QRXZlbnQobnBFdmVudCk7CisKKyAgICBpZiAobnBUb3VjaEV2ZW50LnR5cGUgPT0g
VE9VQ0hfRVZFTlRfRE9VQkxFVEFQICYmICFoYW5kbGVkKSB7CisgICAgICAgIC8vIFNlbmQgVG91
Y2ggVXAgaWYgZG91YmxlIHRhcCBub3QgY29uc3VtZWQuCisgICAgICAgIG5wVG91Y2hFdmVudC50
eXBlID0gVE9VQ0hfRVZFTlRfRU5EOworICAgICAgICBucEV2ZW50LmRhdGEgPSAmbnBUb3VjaEV2
ZW50OworICAgICAgICBoYW5kbGVkID0gcGx1Z2luLT5kaXNwYXRjaEZ1bGxTY3JlZW5OUEV2ZW50
KG5wRXZlbnQpOworICAgIH0KKyAgICBkZWxldGVbXSBucFRvdWNoRXZlbnQucG9pbnRzOworICAg
IHJldHVybiBoYW5kbGVkOworfQorCitib29sIFdlYlBhZ2U6OnRvdWNoUG9pbnRBc01vdXNlRXZl
bnQoY29uc3QgUGxhdGZvcm06OlRvdWNoUG9pbnQmIHBvaW50KQoreworICAgIFBsdWdpblZpZXcq
IHBsdWdpblZpZXcgPSBkLT5tX2Z1bGxTY3JlZW5QbHVnaW5WaWV3LmdldCgpOworICAgIGlmIChw
bHVnaW5WaWV3KQorICAgICAgICByZXR1cm4gZC0+ZGlzcGF0Y2hUb3VjaFBvaW50QXNNb3VzZUV2
ZW50VG9GdWxsU2NyZWVuUGx1Z2luKHBsdWdpblZpZXcsIHBvaW50KTsKKworICAgIGQtPm1fbGFz
dFVzZXJFdmVudFRpbWVzdGFtcCA9IGN1cnJlbnRUaW1lKCk7CisKKyAgICBQbGF0Zm9ybTo6VG91
Y2hQb2ludCB0UG9pbnQgPSBwb2ludDsKKyAgICB0UG9pbnQubV9wb3MgPSBkLT5tYXBGcm9tVHJh
bnNmb3JtZWQodFBvaW50Lm1fcG9zKTsKKyAgICB0UG9pbnQubV9zY3JlZW5Qb3MgPSBkLT5tYXBG
cm9tVHJhbnNmb3JtZWQodFBvaW50Lm1fc2NyZWVuUG9zKTsKKworICAgIHJldHVybiBkLT5tX3Rv
dWNoRXZlbnRIYW5kbGVyLT5oYW5kbGVUb3VjaFBvaW50KHRQb2ludCk7Cit9CisKK2Jvb2wgV2Vi
UGFnZVByaXZhdGU6OmRpc3BhdGNoVG91Y2hQb2ludEFzTW91c2VFdmVudFRvRnVsbFNjcmVlblBs
dWdpbihQbHVnaW5WaWV3KiBwbHVnaW5WaWV3LCBjb25zdCBQbGF0Zm9ybTo6VG91Y2hQb2ludCYg
cG9pbnQpCit7CisgICAgTlBFdmVudCBucEV2ZW50OworICAgIE5QTW91c2VFdmVudCBtb3VzZTsK
KworICAgIHN3aXRjaCAocG9pbnQubV9zdGF0ZSkgeworICAgIGNhc2UgUGxhdGZvcm06OlRvdWNo
UG9pbnQ6OlRvdWNoUHJlc3NlZDoKKyAgICAgICAgbW91c2UudHlwZSA9IE1PVVNFX0JVVFRPTl9E
T1dOOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBsYXRmb3JtOjpUb3VjaFBvaW50OjpUb3Vj
aFJlbGVhc2VkOgorICAgICAgICBtb3VzZS50eXBlID0gTU9VU0VfQlVUVE9OX1VQOworICAgICAg
ICBicmVhazsKKyAgICBjYXNlIFBsYXRmb3JtOjpUb3VjaFBvaW50OjpUb3VjaE1vdmVkOgorICAg
ICAgICBtb3VzZS50eXBlID0gTU9VU0VfTU9USU9OOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IFBsYXRmb3JtOjpUb3VjaFBvaW50OjpUb3VjaFN0YXRpb25hcnk6CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisKKyAgICBtb3VzZS54ID0gcG9pbnQubV9zY3JlZW5Qb3MueCgpOworICAg
IG1vdXNlLnkgPSBwb2ludC5tX3NjcmVlblBvcy55KCk7CisgICAgbW91c2UuYnV0dG9uID0gbW91
c2UudHlwZSAhPSBNT1VTRV9CVVRUT05fVVA7CisgICAgbW91c2UuZmxhZ3MgPSAwOworICAgIG5w
RXZlbnQudHlwZSA9IE5QX01vdXNlRXZlbnQ7CisgICAgbnBFdmVudC5kYXRhID0gJm1vdXNlOwor
CisgICAgcmV0dXJuIHBsdWdpblZpZXctPmRpc3BhdGNoRnVsbFNjcmVlbk5QRXZlbnQobnBFdmVu
dCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6dG91Y2hFdmVudENhbmNlbCgpCit7CisgICAgZC0+bV9w
bHVnaW5NYXlPcGVuTmV3VGFiID0gZmFsc2U7CisgICAgZC0+bV90b3VjaEV2ZW50SGFuZGxlci0+
dG91Y2hFdmVudENhbmNlbCgpOworfQorCit2b2lkIFdlYlBhZ2U6OnRvdWNoRXZlbnRDYW5jZWxB
bmRDbGVhckZvY3VzZWROb2RlKCkKK3sKKyAgICBkLT5tX3RvdWNoRXZlbnRIYW5kbGVyLT50b3Vj
aEV2ZW50Q2FuY2VsQW5kQ2xlYXJGb2N1c2VkTm9kZSgpOworfQorCitGcmFtZSogV2ViUGFnZVBy
aXZhdGU6OmZvY3VzZWRPck1haW5GcmFtZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGFnZS0+
Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpOworfQorCit2b2lkIFdlYlBh
Z2VQcml2YXRlOjpjbGVhckZvY3VzTm9kZSgpCit7CisgICAgRnJhbWUqIGZyYW1lID0gZm9jdXNl
ZE9yTWFpbkZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOworICAgIEFT
U0VSVChmcmFtZS0+ZG9jdW1lbnQoKSk7CisKKyAgICBpZiAoZnJhbWUtPmRvY3VtZW50KCktPmZv
Y3VzZWROb2RlKCkpCisgICAgICAgIGZyYW1lLT5wYWdlKCktPmZvY3VzQ29udHJvbGxlcigpLT5z
ZXRGb2N1c2VkTm9kZSgwLCBmcmFtZSk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6OnNjcm9s
bE5vZGVSZWN1cnNpdmVseShOb2RlKiBub2RlLCBjb25zdCBJbnRTaXplJiBkZWx0YSkKK3sKKyAg
ICBpZiAoZGVsdGEuaXNaZXJvKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFu
b2RlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVy
ID0gbm9kZS0+cmVuZGVyZXIoKTsKKyAgICBpZiAoIXJlbmRlcmVyKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBGcmFtZVZpZXcqIHZpZXcgPSByZW5kZXJlci0+dmlldygpLT5mcmFtZVZp
ZXcoKTsKKyAgICBpZiAoIXZpZXcpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFRy
eSBzY3JvbGxpbmcgdGhlIHJlbmRlcmVyLgorICAgIGlmIChzY3JvbGxSZW5kZXJlcihyZW5kZXJl
ciwgZGVsdGEpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFdlJ3ZlIGhpdCB0aGUg
cGFnZSwgZG9uJ3Qgc2Nyb2xsIGl0IGFuZCByZXR1cm4gZmFsc2UuCisgICAgaWYgKHZpZXcgPT0g
bV9tYWluRnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVHJ5
IHNjcm9sbGluZyB0aGUgRnJhbWVWaWV3LgorICAgIGlmIChjYW5TY3JvbGxJbm5lckZyYW1lKHZp
ZXctPmZyYW1lKCkpKSB7CisgICAgICAgIEludFNpemUgdmlld0RlbHRhID0gZGVsdGE7CisgICAg
ICAgIEludFBvaW50IG5ld1ZpZXdPZmZzZXQgPSB2aWV3LT5zY3JvbGxQb3NpdGlvbigpOworICAg
ICAgICBJbnRQb2ludCBtYXhWaWV3T2Zmc2V0ID0gdmlldy0+bWF4aW11bVNjcm9sbFBvc2l0aW9u
KCk7CisgICAgICAgIGFkanVzdFNjcm9sbERlbHRhKG1heFZpZXdPZmZzZXQsIG5ld1ZpZXdPZmZz
ZXQsIHZpZXdEZWx0YSk7CisKKyAgICAgICAgaWYgKCF2aWV3RGVsdGEuaXNaZXJvKCkpIHsKKyAg
ICAgICAgICAgIHZpZXctPnNldENhbkJsaXRPblNjcm9sbChmYWxzZSk7CisKKyAgICAgICAgICAg
IEJhY2tpbmdTdG9yZUNsaWVudCogYmFja2luZ1N0b3JlQ2xpZW50ID0gYmFja2luZ1N0b3JlQ2xp
ZW50Rm9yRnJhbWUodmlldy0+ZnJhbWUoKSk7CisgICAgICAgICAgICBpZiAoYmFja2luZ1N0b3Jl
Q2xpZW50KSB7CisgICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlQ2xpZW50LT5zZXRJc0NsaWVu
dEdlbmVyYXRlZFNjcm9sbCh0cnVlKTsKKyAgICAgICAgICAgICAgICBiYWNraW5nU3RvcmVDbGll
bnQtPnNldElzU2Nyb2xsTm90aWZpY2F0aW9uU3VwcHJlc3NlZCh0cnVlKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgbV9pblJlZ2lvblNjcm9sbFN0YXJ0aW5nTm9kZSA9IHZpZXctPmZy
YW1lKCktPmRvY3VtZW50KCk7CisKKyAgICAgICAgICAgIHZpZXctPnNjcm9sbEJ5KHZpZXdEZWx0
YSk7CisKKyAgICAgICAgICAgIGlmIChiYWNraW5nU3RvcmVDbGllbnQpIHsKKyAgICAgICAgICAg
ICAgICBiYWNraW5nU3RvcmVDbGllbnQtPnNldElzQ2xpZW50R2VuZXJhdGVkU2Nyb2xsKGZhbHNl
KTsKKyAgICAgICAgICAgICAgICBiYWNraW5nU3RvcmVDbGllbnQtPnNldElzU2Nyb2xsTm90aWZp
Y2F0aW9uU3VwcHJlc3NlZChmYWxzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVHJ5IHNjcm9sbGluZyB0aGUg
bm9kZSBvZiB0aGUgZW5jbG9zaW5nIGZyYW1lLgorICAgIEZyYW1lKiBmcmFtZSA9IG5vZGUtPmRv
Y3VtZW50KCktPmZyYW1lKCk7CisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIE5vZGUqIG93bmVy
Tm9kZSA9IGZyYW1lLT5vd25lckVsZW1lbnQoKTsKKyAgICAgICAgaWYgKHNjcm9sbE5vZGVSZWN1
cnNpdmVseShvd25lck5vZGUsIGRlbHRhKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6YWRqdXN0
U2Nyb2xsRGVsdGEoY29uc3QgSW50UG9pbnQmIG1heE9mZnNldCwgY29uc3QgSW50UG9pbnQmIGN1
cnJlbnRPZmZzZXQsIEludFNpemUmIGRlbHRhKSBjb25zdAoreworICAgIGlmIChjdXJyZW50T2Zm
c2V0LngoKSArIGRlbHRhLndpZHRoKCkgPiBtYXhPZmZzZXQueCgpKQorICAgICAgICBkZWx0YS5z
ZXRXaWR0aChtaW4obWF4T2Zmc2V0LngoKSAtIGN1cnJlbnRPZmZzZXQueCgpLCBkZWx0YS53aWR0
aCgpKSk7CisKKyAgICBpZiAoY3VycmVudE9mZnNldC54KCkgKyBkZWx0YS53aWR0aCgpIDwgMCkK
KyAgICAgICAgZGVsdGEuc2V0V2lkdGgobWF4KC1jdXJyZW50T2Zmc2V0LngoKSwgZGVsdGEud2lk
dGgoKSkpOworCisgICAgaWYgKGN1cnJlbnRPZmZzZXQueSgpICsgZGVsdGEuaGVpZ2h0KCkgPiBt
YXhPZmZzZXQueSgpKQorICAgICAgICBkZWx0YS5zZXRIZWlnaHQobWluKG1heE9mZnNldC55KCkg
LSBjdXJyZW50T2Zmc2V0LnkoKSwgZGVsdGEuaGVpZ2h0KCkpKTsKKworICAgIGlmIChjdXJyZW50
T2Zmc2V0LnkoKSArIGRlbHRhLmhlaWdodCgpIDwgMCkKKyAgICAgICAgZGVsdGEuc2V0SGVpZ2h0
KG1heCgtY3VycmVudE9mZnNldC55KCksIGRlbHRhLmhlaWdodCgpKSk7Cit9CisKK3N0YXRpYyBO
b2RlKiBlbmNsb3NpbmdMYXllck5vZGUoUmVuZGVyTGF5ZXIqKTsKKworYm9vbCBXZWJQYWdlUHJp
dmF0ZTo6c2Nyb2xsUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgSW50U2l6
ZSYgZGVsdGEpCit7CisgICAgUmVuZGVyTGF5ZXIqIGxheWVyID0gcmVuZGVyZXItPmVuY2xvc2lu
Z0xheWVyKCk7CisgICAgaWYgKCFsYXllcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Ly8gVHJ5IHRvIHNjcm9sbCBsYXllci4KKyAgICBib29sIHJlc3RyaWN0ZWRCeUxpbmVDbGFtcCA9
IGZhbHNlOworICAgIGlmIChyZW5kZXJlci0+cGFyZW50KCkpCisgICAgICAgIHJlc3RyaWN0ZWRC
eUxpbmVDbGFtcCA9ICFyZW5kZXJlci0+cGFyZW50KCktPnN0eWxlKCktPmxpbmVDbGFtcCgpLmlz
Tm9uZSgpOworCisgICAgaWYgKHJlbmRlcmVyLT5oYXNPdmVyZmxvd0NsaXAoKSAmJiAhcmVzdHJp
Y3RlZEJ5TGluZUNsYW1wKSB7CisgICAgICAgIEludFNpemUgbGF5ZXJEZWx0YSA9IGRlbHRhOwor
ICAgICAgICBJbnRQb2ludCBtYXhPZmZzZXQobGF5ZXItPnNjcm9sbFdpZHRoKCkgLSBsYXllci0+
cmVuZGVyQm94KCktPmNsaWVudFdpZHRoKCksIGxheWVyLT5zY3JvbGxIZWlnaHQoKSAtIGxheWVy
LT5yZW5kZXJCb3goKS0+Y2xpZW50SGVpZ2h0KCkpOworICAgICAgICBJbnRQb2ludCBjdXJyZW50
T2Zmc2V0KGxheWVyLT5zY3JvbGxYT2Zmc2V0KCksIGxheWVyLT5zY3JvbGxZT2Zmc2V0KCkpOwor
ICAgICAgICBhZGp1c3RTY3JvbGxEZWx0YShtYXhPZmZzZXQsIGN1cnJlbnRPZmZzZXQsIGxheWVy
RGVsdGEpOworICAgICAgICBpZiAoIWxheWVyRGVsdGEuaXNaZXJvKCkpIHsKKyAgICAgICAgICAg
IG1faW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGUgPSBlbmNsb3NpbmdMYXllck5vZGUobGF5ZXIp
OworICAgICAgICAgICAgSW50UG9pbnQgbmV3T2Zmc2V0ID0gY3VycmVudE9mZnNldCArIGxheWVy
RGVsdGE7CisgICAgICAgICAgICBsYXllci0+c2Nyb2xsVG9PZmZzZXQobmV3T2Zmc2V0LngoKSwg
bmV3T2Zmc2V0LnkoKSk7CisgICAgICAgICAgICByZW5kZXJlci0+cmVwYWludCh0cnVlKTsKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKGxh
eWVyID0gbGF5ZXItPnBhcmVudCgpKSB7CisgICAgICAgIGlmIChjYW5TY3JvbGxSZW5kZXJCb3go
bGF5ZXItPnJlbmRlckJveCgpKSkKKyAgICAgICAgICAgIHJldHVybiBzY3JvbGxSZW5kZXJlcihs
YXllci0+cmVuZGVyQm94KCksIGRlbHRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK3N0YXRpYyB2b2lkIGhhbmRsZVNjcm9sbGluZyh1bnNpZ25lZCBzaG9ydCBjaGFyYWN0ZXIs
IFdlYlBhZ2VQcml2YXRlKiBzY3JvbGxlcikKK3sKKyAgICBjb25zdCBpbnQgc2Nyb2xsRmFjdG9y
ID0gMjA7CisgICAgaW50IGR4ID0gMCwgZHkgPSAwOworICAgIHN3aXRjaCAoY2hhcmFjdGVyKSB7
CisgICAgY2FzZSBLRVlDT0RFX0xFRlQ6CisgICAgICAgIGR4ID0gLXNjcm9sbEZhY3RvcjsKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSBLRVlDT0RFX1JJR0hUOgorICAgICAgICBkeCA9IHNjcm9s
bEZhY3RvcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBLRVlDT0RFX1VQOgorICAgICAgICBk
eSA9IC1zY3JvbGxGYWN0b3I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0VZQ09ERV9ET1dO
OgorICAgICAgICBkeSA9IHNjcm9sbEZhY3RvcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBL
RVlDT0RFX1BHX1VQOgorICAgICAgICBBU1NFUlQoc2Nyb2xsZXIpOworICAgICAgICBkeSA9IHNj
cm9sbEZhY3RvciAtIHNjcm9sbGVyLT5hY3R1YWxWaXNpYmxlU2l6ZSgpLmhlaWdodCgpOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIEtFWUNPREVfUEdfRE9XTjoKKyAgICAgICAgQVNTRVJUKHNj
cm9sbGVyKTsKKyAgICAgICAgZHkgPSBzY3JvbGxlci0+YWN0dWFsVmlzaWJsZVNpemUoKS5oZWln
aHQoKSAtIHNjcm9sbEZhY3RvcjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGR4
IHx8IGR5KSB7CisgICAgICAgIC8vIERvbid0IHVzZSB0aGUgc2Nyb2xsQnkgZnVuY3Rpb24gYmVj
YXVzZSBpdCB0cmlnZ2VycyB0aGUgc2Nyb2xsIGFzIG9yaWdpbmF0aW5nIGZyb20gQmxhY2tCZXJy
eQorICAgICAgICAvLyBidXQgdGhlbiBpdCBleHBlY3RzIGEgc2VwYXJhdGUgaW52YWxpZGF0ZSB3
aGljaCBpc24ndCBzZW50IGluIHRoaXMgY2FzZS4KKyAgICAgICAgQVNTRVJUKHNjcm9sbGVyICYm
IHNjcm9sbGVyLT5tX21haW5GcmFtZSAmJiBzY3JvbGxlci0+bV9tYWluRnJhbWUtPnZpZXcoKSk7
CisgICAgICAgIEludFBvaW50IHBvcyhzY3JvbGxlci0+c2Nyb2xsUG9zaXRpb24oKSArIEludFNp
emUoZHgsIGR5KSk7CisKKyAgICAgICAgLy8gUHJldmVudCBvdmVyIHNjcm9sbGluZyBmb3IgYXJy
b3dzIGFuZCBQYWdlIHVwL2Rvd24uCisgICAgICAgIGlmIChwb3MueCgpIDwgMCkKKyAgICAgICAg
ICAgIHBvcy5zZXRYKDApOworICAgICAgICBpZiAocG9zLnkoKSA8IDApCisgICAgICAgICAgICBw
b3Muc2V0WSgwKTsKKyAgICAgICAgaWYgKHBvcy54KCkgKyBzY3JvbGxlci0+YWN0dWFsVmlzaWJs
ZVNpemUoKS53aWR0aCgpID4gc2Nyb2xsZXItPmNvbnRlbnRzU2l6ZSgpLndpZHRoKCkpCisgICAg
ICAgICAgICBwb3Muc2V0WChzY3JvbGxlci0+Y29udGVudHNTaXplKCkud2lkdGgoKSAtIHNjcm9s
bGVyLT5hY3R1YWxWaXNpYmxlU2l6ZSgpLndpZHRoKCkpOworICAgICAgICBpZiAocG9zLnkoKSAr
IHNjcm9sbGVyLT5hY3R1YWxWaXNpYmxlU2l6ZSgpLmhlaWdodCgpID4gc2Nyb2xsZXItPmNvbnRl
bnRzU2l6ZSgpLmhlaWdodCgpKQorICAgICAgICAgICAgcG9zLnNldFkoc2Nyb2xsZXItPmNvbnRl
bnRzU2l6ZSgpLmhlaWdodCgpIC0gc2Nyb2xsZXItPmFjdHVhbFZpc2libGVTaXplKCkuaGVpZ2h0
KCkpOworCisgICAgICAgIHNjcm9sbGVyLT5tX21haW5GcmFtZS0+dmlldygpLT5zZXRTY3JvbGxQ
b3NpdGlvbihwb3MpOworICAgICAgICBzY3JvbGxlci0+bV9jbGllbnQtPnNjcm9sbENoYW5nZWQo
cG9zKTsKKyAgICB9Cit9CisKK2Jvb2wgV2ViUGFnZTo6a2V5RXZlbnQoY29uc3QgUGxhdGZvcm06
OktleWJvYXJkRXZlbnQmIGtleWJvYXJkRXZlbnQpCit7CisgICAgaWYgKCFkLT5tX21haW5GcmFt
ZS0+dmlldygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBBU1NFUlQoZC0+bV9wYWdl
LT5mb2N1c0NvbnRyb2xsZXIoKSk7CisKKyAgICBib29sIGhhbmRsZWQgPSBkLT5tX2lucHV0SGFu
ZGxlci0+aGFuZGxlS2V5Ym9hcmRJbnB1dChrZXlib2FyZEV2ZW50KTsKKworICAgIGlmICghaGFu
ZGxlZCAmJiBrZXlib2FyZEV2ZW50LnR5cGUoKSA9PSBQbGF0Zm9ybTo6S2V5Ym9hcmRFdmVudDo6
S2V5RG93biAmJiAhZC0+bV9pbnB1dEhhbmRsZXItPmlzSW5wdXRNb2RlKCkpIHsKKyAgICAgICAg
SW50UG9pbnQgcHJldmlvdXNQb3MgPSBkLT5zY3JvbGxQb3NpdGlvbigpOworICAgICAgICBoYW5k
bGVTY3JvbGxpbmcoa2V5Ym9hcmRFdmVudC5jaGFyYWN0ZXIoKSwgZCk7CisgICAgICAgIGhhbmRs
ZWQgPSBwcmV2aW91c1BvcyAhPSBkLT5zY3JvbGxQb3NpdGlvbigpOworICAgIH0KKworICAgIHJl
dHVybiBoYW5kbGVkOworfQorCitib29sIFdlYlBhZ2U6OmRlbGV0ZVRleHRSZWxhdGl2ZVRvQ3Vy
c29yKHVuc2lnbmVkIGludCBsZWZ0T2Zmc2V0LCB1bnNpZ25lZCBpbnQgcmlnaHRPZmZzZXQpCit7
CisgICAgcmV0dXJuIGQtPm1faW5wdXRIYW5kbGVyLT5kZWxldGVUZXh0UmVsYXRpdmVUb0N1cnNv
cihsZWZ0T2Zmc2V0LCByaWdodE9mZnNldCk7Cit9CisKK3NwYW5uYWJsZV9zdHJpbmdfdCogV2Vi
UGFnZTo6c2VsZWN0ZWRUZXh0KGludDMyX3QgZmxhZ3MpCit7CisgICAgcmV0dXJuIGQtPm1faW5w
dXRIYW5kbGVyLT5zZWxlY3RlZFRleHQoZmxhZ3MpOworfQorCitzcGFubmFibGVfc3RyaW5nX3Qq
IFdlYlBhZ2U6OnRleHRCZWZvcmVDdXJzb3IoaW50MzJfdCBsZW5ndGgsIGludDMyX3QgZmxhZ3Mp
Cit7CisgICAgcmV0dXJuIGQtPm1faW5wdXRIYW5kbGVyLT50ZXh0QmVmb3JlQ3Vyc29yKGxlbmd0
aCwgZmxhZ3MpOworfQorCitzcGFubmFibGVfc3RyaW5nX3QqIFdlYlBhZ2U6OnRleHRBZnRlckN1
cnNvcihpbnQzMl90IGxlbmd0aCwgaW50MzJfdCBmbGFncykKK3sKKyAgICByZXR1cm4gZC0+bV9p
bnB1dEhhbmRsZXItPnRleHRBZnRlckN1cnNvcihsZW5ndGgsIGZsYWdzKTsKK30KKworZXh0cmFj
dGVkX3RleHRfdCogV2ViUGFnZTo6ZXh0cmFjdGVkVGV4dFJlcXVlc3QoZXh0cmFjdGVkX3RleHRf
cmVxdWVzdF90KiByZXF1ZXN0LCBpbnQzMl90IGZsYWdzKQoreworICAgIHJldHVybiBkLT5tX2lu
cHV0SGFuZGxlci0+ZXh0cmFjdGVkVGV4dFJlcXVlc3QocmVxdWVzdCwgZmxhZ3MpOworfQorCitp
bnQzMl90IFdlYlBhZ2U6OnNldENvbXBvc2luZ1JlZ2lvbihpbnQzMl90IHN0YXJ0LCBpbnQzMl90
IGVuZCkKK3sKKyAgICByZXR1cm4gZC0+bV9pbnB1dEhhbmRsZXItPnNldENvbXBvc2luZ1JlZ2lv
bihzdGFydCwgZW5kKTsKK30KKworaW50MzJfdCBXZWJQYWdlOjpmaW5pc2hDb21wb3NpdGlvbigp
Cit7CisgICAgcmV0dXJuIGQtPm1faW5wdXRIYW5kbGVyLT5maW5pc2hDb21wb3NpdGlvbigpOwor
fQorCitpbnQzMl90IFdlYlBhZ2U6OnNldENvbXBvc2luZ1RleHQoc3Bhbm5hYmxlX3N0cmluZ190
KiBzcGFubmFibGVTdHJpbmcsIGludDMyX3QgcmVsYXRpdmVDdXJzb3JQb3NpdGlvbikKK3sKKyAg
ICByZXR1cm4gZC0+bV9pbnB1dEhhbmRsZXItPnNldENvbXBvc2luZ1RleHQoc3Bhbm5hYmxlU3Ry
aW5nLCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uKTsKK30KKworaW50MzJfdCBXZWJQYWdlOjpjb21t
aXRUZXh0KHNwYW5uYWJsZV9zdHJpbmdfdCogc3Bhbm5hYmxlU3RyaW5nLCBpbnQzMl90IHJlbGF0
aXZlQ3Vyc29yUG9zaXRpb24pCit7CisgICAgcmV0dXJuIGQtPm1faW5wdXRIYW5kbGVyLT5jb21t
aXRUZXh0KHNwYW5uYWJsZVN0cmluZywgcmVsYXRpdmVDdXJzb3JQb3NpdGlvbik7Cit9CisKK3Zv
aWQgV2ViUGFnZTo6c3BlbGxDaGVja2luZ0VuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIHN0
YXRpY19jYXN0PEVkaXRvckNsaWVudEJsYWNrQmVycnkqPihkLT5tX3BhZ2UtPmVkaXRvckNsaWVu
dCgpKS0+ZW5hYmxlU3BlbGxDaGVja2luZyhlbmFibGVkKTsKK30KKwordm9pZCBXZWJQYWdlOjpz
ZWxlY3Rpb25DYW5jZWxsZWQoKQoreworICAgIGQtPm1fc2VsZWN0aW9uSGFuZGxlci0+Y2FuY2Vs
U2VsZWN0aW9uKCk7Cit9CisKK2Jvb2wgV2ViUGFnZTo6c2VsZWN0aW9uQ29udGFpbnMoY29uc3Qg
UGxhdGZvcm06OkludFBvaW50JiBwb2ludCkKK3sKKyAgICByZXR1cm4gZC0+bV9zZWxlY3Rpb25I
YW5kbGVyLT5zZWxlY3Rpb25Db250YWlucyhkLT5tYXBGcm9tVHJhbnNmb3JtZWQocG9pbnQpKTsK
K30KKworV2ViU3RyaW5nIFdlYlBhZ2U6OnRpdGxlKCkgY29uc3QKK3sKKyAgICBpZiAoZC0+bV9t
YWluRnJhbWUtPmRvY3VtZW50KCkpCisgICAgICAgIHJldHVybiBkLT5tX21haW5GcmFtZS0+bG9h
ZGVyKCktPmRvY3VtZW50TG9hZGVyKCktPnRpdGxlKCkuc3RyaW5nKCk7CisgICAgcmV0dXJuIFdl
YlN0cmluZygpOworfQorCitXZWJTdHJpbmcgV2ViUGFnZTo6c2VsZWN0ZWRUZXh0KCkgY29uc3QK
K3sKKyAgICByZXR1cm4gZC0+bV9zZWxlY3Rpb25IYW5kbGVyLT5zZWxlY3RlZFRleHQoKTsKK30K
KworV2ViU3RyaW5nIFdlYlBhZ2U6OmN1dFNlbGVjdGVkVGV4dCgpCit7CisgICAgV2ViU3RyaW5n
IHNlbGVjdGVkVGV4dCA9IGQtPm1fc2VsZWN0aW9uSGFuZGxlci0+c2VsZWN0ZWRUZXh0KCk7Cisg
ICAgaWYgKCFzZWxlY3RlZFRleHQuaXNFbXB0eSgpKQorICAgICAgICBkLT5tX2lucHV0SGFuZGxl
ci0+ZGVsZXRlU2VsZWN0aW9uKCk7CisgICAgcmV0dXJuIHNlbGVjdGVkVGV4dDsKK30KKwordm9p
ZCBXZWJQYWdlOjppbnNlcnRUZXh0KGNvbnN0IFdlYlN0cmluZyYgc3RyaW5nKQoreworICAgIGQt
Pm1faW5wdXRIYW5kbGVyLT5pbnNlcnRUZXh0KHN0cmluZyk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6
Y2xlYXJDdXJyZW50SW5wdXRGaWVsZCgpCit7CisgICAgZC0+bV9pbnB1dEhhbmRsZXItPmNsZWFy
RmllbGQoKTsKK30KKwordm9pZCBXZWJQYWdlOjpjdXQoKQoreworICAgIGQtPm1faW5wdXRIYW5k
bGVyLT5jdXQoKTsKK30KKwordm9pZCBXZWJQYWdlOjpjb3B5KCkKK3sKKyAgICBkLT5tX2lucHV0
SGFuZGxlci0+Y29weSgpOworfQorCit2b2lkIFdlYlBhZ2U6OnBhc3RlKCkKK3sKKyAgICBkLT5t
X2lucHV0SGFuZGxlci0+cGFzdGUoKTsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRTZWxlY3Rpb24o
Y29uc3QgUGxhdGZvcm06OkludFBvaW50JiBzdGFydFBvaW50LCBjb25zdCBQbGF0Zm9ybTo6SW50
UG9pbnQmIGVuZFBvaW50KQoreworICAgIC8vIFRyYW5zZm9ybSB0aGlzIGV2ZW50cyBjb29yZGlu
YXRlcyB0byB3ZWJraXQgY29udGVudCBjb29yZGluYXRlcy4KKyAgICAvLyBGSVhNRTogRG9uJ3Qg
dHJhbnNmb3JtIHRoZSBzZW50aW5lbCwgYmVjYXVzZSBpdCBtYXkgYmUgdHJhbnNmb3JtZWQgdG8g
YSBmbG9hdGluZyBudW1iZXIKKyAgICAvLyB3aGljaCBjb3VsZCBiZSByb3VuZGVkIHRvIDAgb3Ig
b3RoZXIgbnVtYmVycy4gVGhpcyB3b3JrYXJvdW5kIHNob3VsZCBiZSByZW1vdmVkIGFmdGVyCisg
ICAgLy8gdGhlIGVycm9yIG9mIHJvdW5kVW50cmFuc2Zvcm1lZFBvaW50KCkgaXMgZml4ZWQuCisg
ICAgYm9vbCBpbnZhbGlkUG9pbnQgPSBJbnRQb2ludChzdGFydFBvaW50KSA9PSBET01TdXBwb3J0
OjpJbnZhbGlkUG9pbnQ7CisgICAgSW50UG9pbnQgc3RhcnQgPSBpbnZhbGlkUG9pbnQgPyBET01T
dXBwb3J0OjpJbnZhbGlkUG9pbnQgOiBkLT5tYXBGcm9tVHJhbnNmb3JtZWQoc3RhcnRQb2ludCk7
CisgICAgaW52YWxpZFBvaW50ID0gSW50UG9pbnQoZW5kUG9pbnQpID09IERPTVN1cHBvcnQ6Oklu
dmFsaWRQb2ludDsKKyAgICBJbnRQb2ludCBlbmQgPSBpbnZhbGlkUG9pbnQgPyBET01TdXBwb3J0
OjpJbnZhbGlkUG9pbnQgOiBkLT5tYXBGcm9tVHJhbnNmb3JtZWQoZW5kUG9pbnQpOworCisgICAg
ZC0+bV9zZWxlY3Rpb25IYW5kbGVyLT5zZXRTZWxlY3Rpb24oc3RhcnQsIGVuZCk7Cit9CisKK3Zv
aWQgV2ViUGFnZTo6c2V0Q2FyZXRQb3NpdGlvbihjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIHBv
c2l0aW9uKQoreworICAgIC8vIEhhbmRsZWQgYnkgc2VsZWN0aW9uIGhhbmRsZXIgYXMgaXQncyBw
b2ludCBiYXNlZC4KKyAgICAvLyBUcmFuc2Zvcm0gdGhpcyBldmVudHMgY29vcmRpbmF0ZXMgdG8g
d2Via2l0IGNvbnRlbnQgY29vcmRpbmF0ZXMuCisgICAgZC0+bV9zZWxlY3Rpb25IYW5kbGVyLT5z
ZXRDYXJldFBvc2l0aW9uKGQtPm1hcEZyb21UcmFuc2Zvcm1lZChwb3NpdGlvbikpOworfQorCit2
b2lkIFdlYlBhZ2U6OnNlbGVjdEF0UG9pbnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBsb2Nh
dGlvbikKK3sKKyAgICAvLyBUcmFuc2Zvcm0gdGhpcyBldmVudHMgY29vcmRpbmF0ZXMgdG8gd2Vi
a2l0IGNvbnRlbnQgY29vcmRpbmF0ZXMgaWYgaXQKKyAgICAvLyBpcyBub3QgdGhlIHNlbnRpbmVs
IHZhbHVlLgorICAgIEludFBvaW50IHNlbGVjdGlvbkxvY2F0aW9uID0KKyAgICAgICAgICAgIElu
dFBvaW50KGxvY2F0aW9uKSA9PSBET01TdXBwb3J0OjpJbnZhbGlkUG9pbnQgPworICAgICAgICAg
ICAgRE9NU3VwcG9ydDo6SW52YWxpZFBvaW50IDoKKyAgICAgICAgICAgIGQtPm1hcEZyb21UcmFu
c2Zvcm1lZChsb2NhdGlvbik7CisKKyAgICBkLT5tX3NlbGVjdGlvbkhhbmRsZXItPnNlbGVjdEF0
UG9pbnQoc2VsZWN0aW9uTG9jYXRpb24pOworfQorCisvLyBSZXR1cm5lZCBzY3JvbGwgcG9zaXRp
b24gaXMgaW4gdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMuCitQbGF0Zm9ybTo6SW50UG9pbnQgV2Vi
UGFnZTo6c2Nyb2xsUG9zaXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBkLT50cmFuc2Zvcm1l
ZFNjcm9sbFBvc2l0aW9uKCk7Cit9CisKKy8vIFNldHRpbmcgdGhlIHNjcm9sbCBwb3NpdGlvbiBp
cyBpbiB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcy4KK3ZvaWQgV2ViUGFnZTo6c2V0U2Nyb2xsUG9z
aXRpb24oY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBwb2ludCkKK3sKKyAgICBpZiAoZC0+dHJh
bnNmb3JtZWRQb2ludEVxdWFsc1VudHJhbnNmb3JtZWRQb2ludChwb2ludCwgZC0+c2Nyb2xsUG9z
aXRpb24oKSkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIElmIHRoZSB1c2VyIHJlY2VudGx5
IHBlcmZvcm1lZCBhbiBldmVudCwgdGhpcyBuZXcgc2Nyb2xsIHBvc2l0aW9uCisgICAgLy8gY291
bGQgcG9zc2libHkgYmUgYSByZXN1bHQgb2YgdGhhdC4gT3Igbm90LCB0aGlzIGlzIGp1c3QgYSBo
ZXVyaXN0aWMuCisgICAgaWYgKGN1cnJlbnRUaW1lKCkgLSBkLT5tX2xhc3RVc2VyRXZlbnRUaW1l
c3RhbXAgPCBtYW51YWxTY3JvbGxJbnRlcnZhbCkKKyAgICAgICAgZC0+bV91c2VyUGVyZm9ybWVk
TWFudWFsU2Nyb2xsID0gdHJ1ZTsKKworICAgIGQtPm1fYmFja2luZ1N0b3JlQ2xpZW50LT5zZXRJ
c0NsaWVudEdlbmVyYXRlZFNjcm9sbCh0cnVlKTsKKyAgICBkLT5tX21haW5GcmFtZS0+dmlldygp
LT5zZXRDYW5PdmVyc2Nyb2xsKHRydWUpOworICAgIGQtPnNldFNjcm9sbFBvc2l0aW9uKGQtPm1h
cEZyb21UcmFuc2Zvcm1lZChwb2ludCkpOworICAgIGQtPm1fbWFpbkZyYW1lLT52aWV3KCktPnNl
dENhbk92ZXJzY3JvbGwoZmFsc2UpOworICAgIGQtPm1fYmFja2luZ1N0b3JlQ2xpZW50LT5zZXRJ
c0NsaWVudEdlbmVyYXRlZFNjcm9sbChmYWxzZSk7Cit9CisKK1dlYlN0cmluZyBXZWJQYWdlOjp0
ZXh0RW5jb2RpbmcoKQoreworICAgIEZyYW1lKiBmcmFtZSA9IGQtPmZvY3VzZWRPck1haW5GcmFt
ZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiAiIjsKKworICAgIERvY3VtZW50
KiBkb2N1bWVudCA9IGZyYW1lLT5kb2N1bWVudCgpOworICAgIGlmICghZG9jdW1lbnQpCisgICAg
ICAgIHJldHVybiAiIjsKKworICAgIHJldHVybiBkb2N1bWVudC0+bG9hZGVyKCktPndyaXRlcigp
LT5lbmNvZGluZygpOworfQorCitXZWJTdHJpbmcgV2ViUGFnZTo6Zm9yY2VkVGV4dEVuY29kaW5n
KCkKK3sKKyAgICBGcmFtZSogZnJhbWUgPSBkLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICBp
ZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gIiI7CisKKyAgICBEb2N1bWVudCogZG9jdW1lbnQg
PSBmcmFtZS0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIWRvY3VtZW50KQorICAgICAgICByZXR1cm4g
IiI7CisKKyAgICByZXR1cm4gZG9jdW1lbnQtPmxvYWRlcigpLT5vdmVycmlkZUVuY29kaW5nKCk7
Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0Rm9yY2VkVGV4dEVuY29kaW5nKGNvbnN0IGNoYXIqIGVu
Y29kaW5nKQoreworICAgIGlmIChlbmNvZGluZyAmJiBkLT5mb2N1c2VkT3JNYWluRnJhbWUoKSAm
JiBkLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+bG9hZGVyKCkgJiYgZC0+Zm9jdXNlZE9yTWFpbkZy
YW1lKCktPmxvYWRlcigpKQorICAgICAgICByZXR1cm4gZC0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkt
PmxvYWRlcigpLT5yZWxvYWRXaXRoT3ZlcnJpZGVFbmNvZGluZyhlbmNvZGluZyk7Cit9CisKKy8v
IEZJWE1FOiBNb3ZlIHRvIERPTVN1cHBvcnQuCitib29sIFdlYlBhZ2VQcml2YXRlOjpjYW5TY3Jv
bGxJbm5lckZyYW1lKEZyYW1lKiBmcmFtZSkgY29uc3QKK3sKKyAgICBpZiAoIWZyYW1lIHx8ICFm
cmFtZS0+dmlldygpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBOb3QgaGF2aW5n
IGFuIG93bmVyIGVsZW1lbnQgbWVhbnMgdGhhdCB3ZSBhcmUgb24gdGhlIG1haW5mcmFtZS4KKyAg
ICBpZiAoIWZyYW1lLT5vd25lckVsZW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgQVNTRVJUKGZyYW1lICE9IG1fbWFpbkZyYW1lKTsKKworICAgIEludFNpemUgdmlzaWJsZVNp
emUgPSBmcmFtZS0+dmlldygpLT52aXNpYmxlQ29udGVudFJlY3QoKS5zaXplKCk7CisgICAgSW50
U2l6ZSBjb250ZW50c1NpemUgPSBmcmFtZS0+dmlldygpLT5jb250ZW50c1NpemUoKTsKKworICAg
IGJvb2wgY2FuQmVTY3JvbGxlZCA9IGNvbnRlbnRzU2l6ZS5oZWlnaHQoKSA+IHZpc2libGVTaXpl
LmhlaWdodCgpIHx8IGNvbnRlbnRzU2l6ZS53aWR0aCgpID4gdmlzaWJsZVNpemUud2lkdGgoKTsK
KworICAgIC8vIExldHMgYWxzbyBjb25zaWRlciB0aGUgJ292ZXJmbG93LXt4LHl9IHByb3BlcnR5
IHNldCBkaXJlY3RseSB0byB0aGUge2l9ZnJhbWUgdGFnLgorICAgIHJldHVybiBjYW5CZVNjcm9s
bGVkICYmIChmcmFtZS0+b3duZXJFbGVtZW50KCktPnNjcm9sbGluZ01vZGUoKSAhPSBTY3JvbGxi
YXJBbHdheXNPZmYpOworfQorCisvLyBUaGUgUmVuZGVyQm94OjpjYW5iZVNjcm9sbGVkQW5kSGFz
U2Nyb2xsYWJsZUFyZWEgbWV0aG9kIHJldHVybnMgdHJ1ZSBmb3IgdGhlCisvLyBmb2xsb3dpbmcg
c2NlbmFyaW8sIGZvciBleGFtcGxlOgorLy8gKDEpIGEgZGl2IHRoYXQgaGFzIGEgdmVydGljYWwg
b3ZlcmZsb3cgYnV0IG5vIGhvcml6b250YWwgb3ZlcmZsb3cKKy8vICAgICB3aXRoIG92ZXJmbG93
LXk6IGhpZGRlbiBhbmQgb3ZlcmZsb3cteDogYXV0byBzZXQuCisvLyBUaGUgdmVyc2lvbiBiZWxv
dyBmaXhlcyBpdC4KKy8vIEZJWE1FOiBGaXggUmVuZGVyQm94OjpjYW5CZVNjcm9sbGVkQW5kSGFz
U2Nyb2xsYWJsZUFyZWEgbWV0aG9kIGluc3RlYWQuCitib29sIFdlYlBhZ2VQcml2YXRlOjpjYW5T
Y3JvbGxSZW5kZXJCb3goUmVuZGVyQm94KiBib3gpCit7CisgICAgaWYgKCFib3ggfHwgIWJveC0+
aGFzT3ZlcmZsb3dDbGlwKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChib3gt
PnNjcm9sbHNPdmVyZmxvd1goKSAmJiAoYm94LT5zY3JvbGxXaWR0aCgpICE9IGJveC0+Y2xpZW50
V2lkdGgoKSkKKyAgICAgICAgfHwgYm94LT5zY3JvbGxzT3ZlcmZsb3dZKCkgJiYgKGJveC0+c2Ny
b2xsSGVpZ2h0KCkgIT0gYm94LT5jbGllbnRIZWlnaHQoKSkpCisgICAgICAgIHJldHVybiB0cnVl
OworCisgICAgTm9kZSogbm9kZSA9IGJveC0+bm9kZSgpOworICAgIHJldHVybiBub2RlICYmIChu
b2RlLT5yZW5kZXJlcklzRWRpdGFibGUoKSB8fCBub2RlLT5pc0RvY3VtZW50Tm9kZSgpKTsKK30K
Kworc3RhdGljIFJlbmRlckxheWVyKiBwYXJlbnRMYXllcihSZW5kZXJMYXllciogbGF5ZXIpCit7
CisgICAgQVNTRVJUKGxheWVyKTsKKworICAgIGlmIChsYXllci0+cGFyZW50KCkpCisgICAgICAg
IHJldHVybiBsYXllci0+cGFyZW50KCk7CisKKyAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0g
bGF5ZXItPnJlbmRlcmVyKCk7CisgICAgaWYgKHJlbmRlcmVyLT5kb2N1bWVudCgpICYmIHJlbmRl
cmVyLT5kb2N1bWVudCgpLT5vd25lckVsZW1lbnQoKSAmJiByZW5kZXJlci0+ZG9jdW1lbnQoKS0+
b3duZXJFbGVtZW50KCktPnJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybiByZW5kZXJlci0+ZG9j
dW1lbnQoKS0+b3duZXJFbGVtZW50KCktPnJlbmRlcmVyKCktPmVuY2xvc2luZ0xheWVyKCk7CisK
KyAgICByZXR1cm4gMDsKK30KKworLy8gRklYTUU6IE1ha2UgUmVuZGVyTGF5ZXI6OmVuY2xvc2lu
Z0VsZW1lbnQgcHVibGljIHNvIHRoaXMgb25lIGNhbiBiZSByZW1vdmVkLgorc3RhdGljIE5vZGUq
IGVuY2xvc2luZ0xheWVyTm9kZShSZW5kZXJMYXllciogbGF5ZXIpCit7CisgICAgZm9yIChSZW5k
ZXJPYmplY3QqIHIgPSBsYXllci0+cmVuZGVyZXIoKTsgcjsgciA9IHItPnBhcmVudCgpKSB7Cisg
ICAgICAgIGlmIChOb2RlKiBlID0gci0+bm9kZSgpKQorICAgICAgICAgICAgcmV0dXJuIGU7Cisg
ICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCitzdGF0
aWMgdm9pZCBwdXNoQmFja0luUmVnaW9uU2Nyb2xsYWJsZShzdGQ6OnZlY3RvcjxQbGF0Zm9ybTo6
U2Nyb2xsVmlld0Jhc2U+JiB2ZWN0b3IsIEluUmVnaW9uU2Nyb2xsYWJsZUFyZWEgc2Nyb2xsZXIs
IFdlYlBhZ2VQcml2YXRlKiB3ZWJQYWdlKQoreworICAgIEFTU0VSVCh3ZWJQYWdlKTsKKyAgICBB
U1NFUlQoIXNjcm9sbGVyLmlzTnVsbCgpKTsKKworICAgIHNjcm9sbGVyLnNldENhblByb3BhZ2F0
ZVNjcm9sbGluZ1RvRW5jbG9zaW5nU2Nyb2xsYWJsZSghaXNOb25SZW5kZXJWaWV3Rml4ZWRQb3Np
dGlvbmVkQ29udGFpbmVyKHNjcm9sbGVyLmxheWVyKCkpKTsKKyAgICB2ZWN0b3IucHVzaF9iYWNr
KHNjcm9sbGVyKTsKKyAgICBpZiAodmVjdG9yLnNpemUoKSA9PSAxKSB7CisgICAgICAgIC8vIEZJ
WE1FOiBVc2UgUmVuZGVyTGF5ZXI6OnJlbmRlckJveCgpLT5ub2RlKCkgaW5zdGVhZD8KKyAgICAg
ICAgd2ViUGFnZS0+bV9pblJlZ2lvblNjcm9sbFN0YXJ0aW5nTm9kZSA9IGVuY2xvc2luZ0xheWVy
Tm9kZShzY3JvbGxlci5sYXllcigpKTsKKyAgICB9Cit9CisKK3N0ZDo6dmVjdG9yPFBsYXRmb3Jt
OjpTY3JvbGxWaWV3QmFzZT4gV2ViUGFnZVByaXZhdGU6OmluUmVnaW9uU2Nyb2xsYWJsZUFyZWFz
Rm9yUG9pbnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBwb2ludCkKK3sKKyAgICBzdGQ6OnZl
Y3RvcjxQbGF0Zm9ybTo6U2Nyb2xsVmlld0Jhc2U+IHZhbGlkUmV0dXJuOworICAgIHN0ZDo6dmVj
dG9yPFBsYXRmb3JtOjpTY3JvbGxWaWV3QmFzZT4gZW1wdHlSZXR1cm47CisKKyAgICBIaXRUZXN0
UmVzdWx0IHJlc3VsdCA9IG1fbWFpbkZyYW1lLT5ldmVudEhhbmRsZXIoKS0+aGl0VGVzdFJlc3Vs
dEF0UG9pbnQobWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyhwb2ludCksIGZhbHNlIC8qYWxsb3dT
aGFkb3dDb250ZW50Ki8pOworICAgIE5vZGUqIG5vZGUgPSByZXN1bHQuaW5uZXJOb25TaGFyZWRO
b2RlKCk7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gZW1wdHlSZXR1cm47CisKKyAg
ICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKTsKKyAgICAvLyBGSVhN
RTogVmFsaWRhdGUgd2l0aCBlbGVtZW50cyB3aXRoIHZpc2liaWxpdHk6aGlkZGVuLgorICAgIGlm
ICghcmVuZGVyZXIpCisgICAgICAgIHJldHVybiBlbXB0eVJldHVybjsKKworICAgIFJlbmRlckxh
eWVyKiBsYXllciA9IHJlbmRlcmVyLT5lbmNsb3NpbmdMYXllcigpOworCisgICAgZG8geworICAg
ICAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbGF5ZXItPnJlbmRlcmVyKCk7CisKKyAgICAg
ICAgaWYgKHJlbmRlcmVyLT5pc1JlbmRlclZpZXcoKSkgeworICAgICAgICAgICAgaWYgKFJlbmRl
clZpZXcqIHJlbmRlclZpZXcgPSB0b1JlbmRlclZpZXcocmVuZGVyZXIpKSB7CisgICAgICAgICAg
ICAgICAgRnJhbWVWaWV3KiB2aWV3ID0gcmVuZGVyVmlldy0+ZnJhbWVWaWV3KCk7CisgICAgICAg
ICAgICAgICAgaWYgKCF2aWV3KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1wdHlSZXR1
cm47CisKKyAgICAgICAgICAgICAgICBpZiAoY2FuU2Nyb2xsSW5uZXJGcmFtZSh2aWV3LT5mcmFt
ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBwdXNoQmFja0luUmVnaW9uU2Nyb2xsYWJsZSh2
YWxpZFJldHVybiwgSW5SZWdpb25TY3JvbGxhYmxlQXJlYSh0aGlzLCBsYXllciksIHRoaXMpOwor
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY2FuU2Nyb2xsUmVuZGVyQm94KGxheWVyLT5yZW5k
ZXJCb3goKSkpIHsKKyAgICAgICAgICAgIHB1c2hCYWNrSW5SZWdpb25TY3JvbGxhYmxlKHZhbGlk
UmV0dXJuLCBJblJlZ2lvblNjcm9sbGFibGVBcmVhKHRoaXMsIGxheWVyKSwgdGhpcyk7CisgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIHJ1biBpbnRv
IGEgZml4IHBvc2l0aW9uZWQgbGF5ZXIsIHNldCB0aGUgbGFzdCBzY3JvbGxhYmxlIGluLXJlZ2lv
biBvYmplY3QKKyAgICAgICAgLy8gYXMgbm90IGFibGUgdG8gcHJvcGFnYXRlIHNjcm9sbCB0byBp
dHMgcGFyZW50IHNjcm9sbGFibGUuCisgICAgICAgIGlmIChpc05vblJlbmRlclZpZXdGaXhlZFBv
c2l0aW9uZWRDb250YWluZXIobGF5ZXIpICYmIHZhbGlkUmV0dXJuLnNpemUoKSkgeworICAgICAg
ICAgICAgUGxhdGZvcm06OlNjcm9sbFZpZXdCYXNlJiBlbmQgPSB2YWxpZFJldHVybi5iYWNrKCk7
CisgICAgICAgICAgICBlbmQuc2V0Q2FuUHJvcGFnYXRlU2Nyb2xsaW5nVG9FbmNsb3NpbmdTY3Jv
bGxhYmxlKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAobGF5ZXIgPSBwYXJlbnRM
YXllcihsYXllcikpOworCisgICAgaWYgKHZhbGlkUmV0dXJuLmVtcHR5KCkpCisgICAgICAgIHJl
dHVybiBlbXB0eVJldHVybjsKKworICAgIHJldHVybiB2YWxpZFJldHVybjsKK30KKworQmFja2lu
Z1N0b3JlKiBXZWJQYWdlOjpiYWNraW5nU3RvcmUoKSBjb25zdAoreworICAgIHJldHVybiBkLT5t
X2JhY2tpbmdTdG9yZTsKK30KKworYm9vbCBXZWJQYWdlOjp6b29tVG9GaXQoKQoreworICAgIGlm
IChkLT5jb250ZW50c1NpemUoKS5pc0VtcHR5KCkgfHwgIWQtPmlzVXNlclNjYWxhYmxlKCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGQtPm1fdXNlclBlcmZvcm1lZE1hbnVhbFpvb20g
PSB0cnVlOworCisgICAgLy8gVE9ETzogV2UgbWF5IG5lZWQgdG8gdXNlICgwLDApIGFzIHRoZSBh
bmNob3IgcG9pbnQgd2hlbiB0ZXh0UmVmbG93IGlzIGVuYWJsZWQuCisgICAgLy8gSUYgdGhlIG1p
bmltdW0gZm9udCBzaXplIGlzIGdpbm9ybW91cywgd2UgbWF5IHN0aWxsIHdhbnQgdGhlIHNjcm9s
bCBwb3NpdGlvbiB0byBiZSAwLDAuCisgICAgcmV0dXJuIGQtPnpvb21BYm91dFBvaW50KGQtPnpv
b21Ub0ZpdFNjYWxlKCksIGQtPmNlbnRlck9mVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKK30KKwor
dm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0VGV4dFJlZmxvd0FuY2hvclBvaW50KGNvbnN0IFBsYXRm
b3JtOjpJbnRQb2ludCYgZm9jYWxQb2ludCkKK3sKKyAgICAvLyBTaG91bGQgb25seSBiZSBpbnZv
a2VkIHdoZW4gdGV4dCByZWZsb3cgaXMgZW5hYmxlZC4KKyAgICBBU1NFUlQobV93ZWJQYWdlLT5z
ZXR0aW5ncygpLT50ZXh0UmVmbG93TW9kZSgpID09IFdlYlNldHRpbmdzOjpUZXh0UmVmbG93RW5h
YmxlZCk7CisKKyAgICBtX2N1cnJlbnRQaW5jaFpvb21Ob2RlID0gYmVzdE5vZGVGb3Jab29tVW5k
ZXJQb2ludChmb2NhbFBvaW50KTsKKyAgICBpZiAoIW1fY3VycmVudFBpbmNoWm9vbU5vZGUpCisg
ICAgICAgIHJldHVybjsKKworICAgIEludFJlY3Qgbm9kZVJlY3QgPSByZWN0Rm9yTm9kZShtX2N1
cnJlbnRQaW5jaFpvb21Ob2RlLmdldCgpKTsKKyAgICBtX2FuY2hvckluTm9kZVJlY3RSYXRpby5z
ZXQoc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1hcEZyb21UcmFuc2Zvcm1lZChmb2NhbFBvaW50KS54KCkg
LSBub2RlUmVjdC54KCkpIC8gbm9kZVJlY3Qud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1hcEZyb21UcmFuc2Zvcm1lZChmb2NhbFBv
aW50KS55KCkgLSBub2RlUmVjdC55KCkpIC8gbm9kZVJlY3QuaGVpZ2h0KCkpOworfQorCitib29s
IFdlYlBhZ2U6OnBpbmNoWm9vbUFib3V0UG9pbnQoZG91YmxlIHNjYWxlLCBpbnQgeCwgaW50IHkp
Cit7CisgICAgSW50UG9pbnQgYW5jaG9yKHgsIHkpOworICAgIGQtPm1fdXNlclBlcmZvcm1lZE1h
bnVhbFpvb20gPSB0cnVlOworICAgIGQtPm1fdXNlclBlcmZvcm1lZE1hbnVhbFNjcm9sbCA9IHRy
dWU7CisKKyAgICBpZiAoZC0+bV93ZWJQYWdlLT5zZXR0aW5ncygpLT50ZXh0UmVmbG93TW9kZSgp
ID09IFdlYlNldHRpbmdzOjpUZXh0UmVmbG93RW5hYmxlZCkgeworICAgICAgICBkLT5zZXRUZXh0
UmVmbG93QW5jaG9yUG9pbnQoYW5jaG9yKTsKKyAgICAgICAgLy8gVGhlb3JldGljYWxseSwgZC0+
bm9kZUZvclpvb21VbmRlclBvaW50KGFuY2hvcikgY2FuIHJldHVybiBudWxsLgorICAgICAgICBp
ZiAoIWQtPm1fY3VycmVudFBpbmNoWm9vbU5vZGUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorCisgICAgcmV0dXJuIGQtPnpvb21BYm91dFBvaW50KHNjYWxlLCBkLT5tYXBGcm9t
VHJhbnNmb3JtZWQoYW5jaG9yKSk7Cit9CisKKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9XKQor
dm9pZCBXZWJQYWdlUHJpdmF0ZTo6dG9nZ2xlVGV4dFJlZmxvd0lmRW5hYmxlZEZvckJsb2NrWm9v
bU9ubHkoYm9vbCBzaG91bGRFbmFibGVUZXh0UmVmbG93KQoreworICAgIGlmIChtX3dlYlBhZ2Ut
PnNldHRpbmdzKCktPnRleHRSZWZsb3dNb2RlKCkgPT0gV2ViU2V0dGluZ3M6OlRleHRSZWZsb3dF
bmFibGVkT25seUZvckJsb2NrWm9vbSkKKyAgICAgICAgbV9wYWdlLT5zZXR0aW5ncygpLT5zZXRU
ZXh0UmVmbG93RW5hYmxlZChzaG91bGRFbmFibGVUZXh0UmVmbG93KTsKK30KKyNlbmRpZgorCiti
b29sIFdlYlBhZ2U6OmJsb2NrWm9vbShpbnQgeCwgaW50IHkpCit7CisgICAgaWYgKCFkLT5tX21h
aW5GcmFtZS0+dmlldygpIHx8ICFkLT5pc1VzZXJTY2FsYWJsZSgpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBOb2RlKiBub2RlID0gZC0+YmVzdE5vZGVGb3Jab29tVW5kZXJQb2ludChJ
bnRQb2ludCh4LCB5KSk7CisgICAgaWYgKCFub2RlKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBJbnRSZWN0IG5vZGVSZWN0ID0gZC0+cmVjdEZvck5vZGUobm9kZSk7CisgICAgSW50UmVj
dCBibG9ja1JlY3Q7CisgICAgYm9vbCBlbmRPZkJsb2NrWm9vbU1vZGUgPSBkLT5jb21wYXJlTm9k
ZXNGb3JCbG9ja1pvb20oZC0+bV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlLmdldCgpLCBu
b2RlKTsKKyAgICBjb25zdCBkb3VibGUgb2xkU2NhbGUgPSBkLT5tX3RyYW5zZm9ybWF0aW9uTWF0
cml4LT5tMTEoKTsKKyAgICBkb3VibGUgbmV3U2NhbGUgPSAwOworICAgIGNvbnN0IGRvdWJsZSBt
YXJnaW4gPSBlbmRPZkJsb2NrWm9vbU1vZGUgPyAwIDogYmxvY2tab29tTWFyZ2luICogMiAqIG9s
ZFNjYWxlOworICAgIGJvb2wgaXNGaXJzdFpvb20gPSBmYWxzZTsKKworICAgIGlmIChlbmRPZkJs
b2NrWm9vbU1vZGUpIHsKKyAgICAgICAgLy8gRW5kIG9mIGJsb2NrIHpvb20gbW9kZQorICAgICAg
ICBJbnRSZWN0IHJlY3QgPSBkLT5ibG9ja1pvb21SZWN0Rm9yTm9kZShub2RlKTsKKyAgICAgICAg
YmxvY2tSZWN0ID0gSW50UmVjdCgwLCByZWN0LnkoKSwgZC0+dHJhbnNmb3JtZWRDb250ZW50c1Np
emUoKS53aWR0aCgpLCBkLT50cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpLmhlaWdodCgpIC0gcmVj
dC55KCkpOworICAgICAgICBkLT5tX3Nob3VsZFJlZmxvd0Jsb2NrID0gZmFsc2U7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgLy8gU3RhcnQvY29udGludWUgYmxvY2sgem9vbSBtb2RlCisgICAgICAg
IE5vZGUqIHRlbXBCbG9ja1pvb21BZGp1c3RlZE5vZGUgPSBkLT5tX2N1cnJlbnRCbG9ja1pvb21B
ZGp1c3RlZE5vZGUuZ2V0KCk7CisgICAgICAgIGJsb2NrUmVjdCA9IGQtPmJsb2NrWm9vbVJlY3RG
b3JOb2RlKG5vZGUpOworCisgICAgICAgIC8vIERvbid0IHVzZSBhIGJsb2NrIGlmIGl0IGlzIHRv
byBjbG9zZSB0byB0aGUgc2l6ZSBvZiB0aGUgYWN0dWFsIGNvbnRlbnRzLgorICAgICAgICAvLyBX
ZSBhbGxvdyB0aGlzIGZvciBpbWFnZXMgb25seSBzbyB0aGF0IHRoZXkgY2FuIGJlIHpvb21lZCB0
aWdodCB0byB0aGUgc2NyZWVuLgorICAgICAgICBpZiAoIW5vZGUtPmhhc1RhZ05hbWUoSFRNTE5h
bWVzOjppbWdUYWcpKSB7CisgICAgICAgICAgICBJbnRSZWN0IHRSZWN0ID0gZC0+bWFwRnJvbVRy
YW5zZm9ybWVkKGJsb2NrUmVjdCk7CisgICAgICAgICAgICBpbnQgYmxvY2tBcmVhID0gdFJlY3Qu
d2lkdGgoKSAqIHRSZWN0LmhlaWdodCgpOworICAgICAgICAgICAgaW50IHBhZ2VBcmVhID0gZC0+
Y29udGVudHNTaXplKCkud2lkdGgoKSAqIGQtPmNvbnRlbnRzU2l6ZSgpLmhlaWdodCgpOworICAg
ICAgICAgICAgZG91YmxlIGJsb2NrVG9QYWdlUmF0aW8gPSBzdGF0aWNfY2FzdDxkb3VibGU+KDEg
LSBibG9ja0FyZWEgLyBwYWdlQXJlYSk7CisgICAgICAgICAgICBpZiAoYmxvY2tUb1BhZ2VSYXRp
byA8IG1pbmltdW1FeHBhbmRpbmdSYXRpbykgeworICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUg
b2xkIGFkanVzdCBub2RlIGJlY2F1c2Ugem9vbSB3YXMgY2FuY2VsZWQuCisgICAgICAgICAgICAg
ICAgZC0+bV9jdXJyZW50QmxvY2tab29tQWRqdXN0ZWROb2RlID0gdGVtcEJsb2NrWm9vbUFkanVz
dGVkTm9kZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKworICAgICAgICBpZiAoYmxvY2tSZWN0LmlzRW1wdHkoKSB8fCAhYmxvY2tSZWN0
LndpZHRoKCkgfHwgIWJsb2NrUmVjdC5oZWlnaHQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgICAgICBpZiAoIWQtPm1fY3VycmVudEJsb2NrWm9vbU5vZGUuZ2V0KCkpCisgICAg
ICAgICAgICBpc0ZpcnN0Wm9vbSA9IHRydWU7CisKKyAgICAgICAgZC0+bV9jdXJyZW50QmxvY2ta
b29tTm9kZSA9IG5vZGU7CisgICAgICAgIGQtPm1fc2hvdWxkUmVmbG93QmxvY2sgPSB0cnVlOwor
ICAgIH0KKworICAgIG5ld1NjYWxlID0gc3RkOjptaW4oZC0+bmV3U2NhbGVGb3JCbG9ja1pvb21S
ZWN0KGJsb2NrUmVjdCwgb2xkU2NhbGUsIG1hcmdpbiksIGQtPm1heEJsb2NrWm9vbVNjYWxlKCkp
OworICAgIG5ld1NjYWxlID0gc3RkOjptYXgobmV3U2NhbGUsIG1pbmltdW1TY2FsZSgpKTsKKwor
I2lmIERFQlVHX0JMT0NLX1pPT00KKyAgICAvLyBSZW5kZXIgdGhlIGRvdWJsZSB0YXAgcG9pbnQg
Zm9yIHZpc3VhbCByZWZlcmVuY2UuCisgICAgSW50UmVjdCByZW5kZXJSZWN0KHgsIHksIDEsIDEp
OworICAgIHJlbmRlclJlY3QgPSBkLT5tYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVHJhbnNm
b3JtZWRWaWV3cG9ydChyZW5kZXJSZWN0KTsKKyAgICBJbnRTaXplIHZpZXdwb3J0U2l6ZSA9IGQt
PnRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCk7CisgICAgcmVuZGVyUmVjdC5pbnRlcnNlY3QoSW50
UmVjdCgwLCAwLCB2aWV3cG9ydFNpemUud2lkdGgoKSwgdmlld3BvcnRTaXplLmhlaWdodCgpKSk7
CisgICAgZC0+bV9iYWNraW5nU3RvcmUtPmQtPmNsZWFyV2luZG93KHJlbmRlclJlY3QsIDAsIDAs
IDApOworICAgIGQtPm1fYmFja2luZ1N0b3JlLT5kLT5pbnZhbGlkYXRlV2luZG93KHJlbmRlclJl
Y3QpOworCisgICAgLy8gVW5jb21tZW50IHRoaXMgdG8gcmV0dXJuIGluIG9yZGVyIHRvIHNlZSB0
aGUgYmxvY2tzIGJlaW5nIHNlbGVjdGVkLgorICAgIC8vIGQtPm1fY2xpZW50LT56b29tQ2hhbmdl
ZChpc01pblpvb21lZCgpLCBpc01heFpvb21lZCgpLCBpc0F0SW5pdGlhbFpvb20oKSwgY3VycmVu
dFpvb21MZXZlbCgpKTsKKyAgICAvLyByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorCisjaWYgRU5BQkxF
KFZJRVdQT1JUX1JFRkxPVykKKyAgICAvLyBJZiByZWZsb3dpbmcsIGFkanVzdCB0aGUgcmVmbG93
LXdpZHRoIG9mIHRleHQgbm9kZSB0byBtYWtlIHN1cmUgdGhlIGZvbnQgaXMgYSByZWFzb25hYmxl
IHNpemUuCisgICAgaWYgKGQtPm1fY3VycmVudEJsb2NrWm9vbU5vZGUgJiYgZC0+bV9zaG91bGRS
ZWZsb3dCbG9jayAmJiBzZXR0aW5ncygpLT50ZXh0UmVmbG93TW9kZSgpICE9IFdlYlNldHRpbmdz
OjpUZXh0UmVmbG93RGlzYWJsZWQpIHsKKyAgICAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9
IGQtPm1fY3VycmVudEJsb2NrWm9vbU5vZGUtPnJlbmRlcmVyKCk7CisgICAgICAgIGlmIChyZW5k
ZXJlciAmJiByZW5kZXJlci0+aXNUZXh0KCkpIHsKKyAgICAgICAgICAgIGRvdWJsZSBuZXdGb250
U2l6ZSA9IHJlbmRlcmVyLT5zdHlsZSgpLT5mb250U2l6ZSgpICogbmV3U2NhbGU7CisgICAgICAg
ICAgICBpZiAobmV3Rm9udFNpemUgPCBkLT5tX3dlYlNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUo
KSkgeworICAgICAgICAgICAgICAgIG5ld1NjYWxlID0gc3RkOjptaW4oc3RhdGljX2Nhc3Q8ZG91
YmxlPihkLT5tX3dlYlNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKSkgLyByZW5kZXJlci0+c3R5
bGUoKS0+Zm9udFNpemUoKSwgZC0+bWF4QmxvY2tab29tU2NhbGUoKSk7CisgICAgICAgICAgICAg
ICAgbmV3U2NhbGUgPSBzdGQ6Om1heChuZXdTY2FsZSwgbWluaW11bVNjYWxlKCkpOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgYmxvY2tSZWN0LnNldFdpZHRoKG9sZFNjYWxlICogc3RhdGlj
X2Nhc3Q8ZG91YmxlPihkLT50cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKCkud2lkdGgoKSkg
LyBuZXdTY2FsZSk7CisgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgdGhlIHNjYWxlIGhlcmUg
dG8gdGFrZSBpbiB0byBhY2NvdW50IHRoZSBtYXJnaW4uCisgICAgICAgICAgICBuZXdTY2FsZSA9
IHN0ZDo6bWluKGQtPm5ld1NjYWxlRm9yQmxvY2tab29tUmVjdChibG9ja1JlY3QsIG9sZFNjYWxl
LCBtYXJnaW4pLCBkLT5tYXhCbG9ja1pvb21TY2FsZSgpKTsKKyAgICAgICAgICAgIG5ld1NjYWxl
ID0gc3RkOjptYXgobmV3U2NhbGUsIG1pbmltdW1TY2FsZSgpKTsgLy8gU3RpbGwsIGl0J3Mgbm90
IGFsbG93ZWQgdG8gYmUgc21hbGxlciB0aGFuIG1pbmltdW0gc2NhbGUuCisgICAgICAgIH0KKyAg
ICB9CisjZW5kaWYKKworICAgIC8vIEFsaWduIHRoZSB6b29tZWQgYmxvY2sgaW4gdGhlIHNjcmVl
bi4KKyAgICBkb3VibGUgbmV3QmxvY2tIZWlnaHQgPSBkLT5tYXBGcm9tVHJhbnNmb3JtZWQoYmxv
Y2tSZWN0KS5oZWlnaHQoKTsKKyAgICBkb3VibGUgbmV3QmxvY2tXaWR0aCA9IGQtPm1hcEZyb21U
cmFuc2Zvcm1lZChibG9ja1JlY3QpLndpZHRoKCk7CisgICAgZG91YmxlIHNjYWxlZFZpZXdwb3J0
V2lkdGggPSBzdGF0aWNfY2FzdDxkb3VibGU+KGQtPmFjdHVhbFZpc2libGVTaXplKCkud2lkdGgo
KSkgKiBvbGRTY2FsZSAvIG5ld1NjYWxlOworICAgIGRvdWJsZSBzY2FsZWRWaWV3cG9ydEhlaWdo
dCA9IHN0YXRpY19jYXN0PGRvdWJsZT4oZC0+YWN0dWFsVmlzaWJsZVNpemUoKS5oZWlnaHQoKSkg
KiBvbGRTY2FsZSAvIG5ld1NjYWxlOworICAgIGRvdWJsZSBkeCA9IHN0ZDo6bWF4KDAuMCwgKHNj
YWxlZFZpZXdwb3J0V2lkdGggLSBuZXdCbG9ja1dpZHRoKSAvIDIuMCk7CisgICAgZG91YmxlIGR5
ID0gc3RkOjptYXgoMC4wLCAoc2NhbGVkVmlld3BvcnRIZWlnaHQgLSBuZXdCbG9ja0hlaWdodCkg
LyAyLjApOworCisgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGQtPm1fY3VycmVudEJsb2Nr
Wm9vbUFkanVzdGVkTm9kZS0+cmVuZGVyZXIoKTsKKyAgICBGbG9hdFBvaW50IGFuY2hvcjsKKyAg
ICBGbG9hdFBvaW50IHRvcExlZnRQb2ludChkLT5tYXBGcm9tVHJhbnNmb3JtZWQoYmxvY2tSZWN0
KS5sb2NhdGlvbigpKTsKKyAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXItPmlzVGV4dCgpKSB7
CisgICAgICAgIEVUZXh0QWxpZ24gdGV4dEFsaWduID0gcmVuZGVyZXItPnN0eWxlKCktPnRleHRB
bGlnbigpOworICAgICAgICBzd2l0Y2ggKHRleHRBbGlnbikgeworICAgICAgICBjYXNlIENFTlRF
UjoKKyAgICAgICAgY2FzZSBXRUJLSVRfQ0VOVEVSOgorICAgICAgICAgICAgYW5jaG9yID0gRmxv
YXRQb2ludChub2RlUmVjdC54KCkgKyAobm9kZVJlY3Qud2lkdGgoKSAtIHNjYWxlZFZpZXdwb3J0
V2lkdGgpIC8gMiwgdG9wTGVmdFBvaW50LnkoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBMRUZUOgorICAgICAgICBjYXNlIFdFQktJVF9MRUZUOgorICAgICAgICAgICAgYW5j
aG9yID0gdG9wTGVmdFBvaW50OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUklH
SFQ6CisgICAgICAgIGNhc2UgV0VCS0lUX1JJR0hUOgorICAgICAgICAgICAgYW5jaG9yID0gRmxv
YXRQb2ludChub2RlUmVjdC54KCkgKyBub2RlUmVjdC53aWR0aCgpIC0gc2NhbGVkVmlld3BvcnRX
aWR0aCwgdG9wTGVmdFBvaW50LnkoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBUQUFVVE86CisgICAgICAgIGNhc2UgSlVTVElGWToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgIGlmIChyZW5kZXJlci0+c3R5bGUoKS0+aXNMZWZ0VG9SaWdodERpcmVjdGlvbigpKQor
ICAgICAgICAgICAgICAgIGFuY2hvciA9IHRvcExlZnRQb2ludDsKKyAgICAgICAgICAgIGVsc2UK
KyAgICAgICAgICAgICAgICBhbmNob3IgPSBGbG9hdFBvaW50KG5vZGVSZWN0LngoKSArIG5vZGVS
ZWN0LndpZHRoKCkgLSBzY2FsZWRWaWV3cG9ydFdpZHRoLCB0b3BMZWZ0UG9pbnQueSgpKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIGFuY2hvciA9
IHJlbmRlcmVyLT5zdHlsZSgpLT5pc0xlZnRUb1JpZ2h0RGlyZWN0aW9uKCkgPyB0b3BMZWZ0UG9p
bnQgOiBGbG9hdFBvaW50KG5vZGVSZWN0LngoKSArIG5vZGVSZWN0LndpZHRoKCkgLSBzY2FsZWRW
aWV3cG9ydFdpZHRoLCB0b3BMZWZ0UG9pbnQueSgpKTsKKworICAgIGlmIChuZXdCbG9ja0hlaWdo
dCA8PSBzY2FsZWRWaWV3cG9ydEhlaWdodCkgeworICAgICAgICAvLyBUaGUgYmxvY2sgZml0cyBp
biB0aGUgdmlld3BvcnQgc28gY2VudGVyIGl0LgorICAgICAgICBkLT5tX2ZpbmFsQmxvY2tQb2lu
dCA9IEZsb2F0UG9pbnQoYW5jaG9yLngoKSAtIGR4LCBhbmNob3IueSgpIC0gZHkpOworICAgIH0g
ZWxzZSB7CisgICAgICAgIC8vIFRoZSBibG9jayBpcyBsb25nZXIgdGhhbiB0aGUgdmlld3BvcnQg
c28gdG9wIGFsaWduIGl0IGFuZCBhZGQgMyBwaXhlbCBtYXJnaW4uCisgICAgICAgIGQtPm1fZmlu
YWxCbG9ja1BvaW50ID0gRmxvYXRQb2ludChhbmNob3IueCgpIC0gZHgsIGFuY2hvci55KCkgLSAz
KTsKKyAgICB9CisKKyNpZiBFTkFCTEUoVklFV1BPUlRfUkVGTE9XKQorICAgIC8vIFdlIGRvbid0
IGtub3cgaG93IGxvbmcgdGhlIHJlZmxvd2VkIGJsb2NrIHdpbGwgYmUgc28gd2UgcG9zaXRpb24g
aXQgYXQgdGhlIHRvcCBvZiB0aGUgc2NyZWVuIHdpdGggYSBzbWFsbCBtYXJnaW4uCisgICAgaWYg
KHNldHRpbmdzKCktPnRleHRSZWZsb3dNb2RlKCkgIT0gV2ViU2V0dGluZ3M6OlRleHRSZWZsb3dE
aXNhYmxlZCkgeworICAgICAgICBkLT5tX2ZpbmFsQmxvY2tQb2ludCA9IEZsb2F0UG9pbnQoYW5j
aG9yLngoKSAtIGR4LCBhbmNob3IueSgpIC0gMyk7CisgICAgICAgIGQtPm1fZmluYWxCbG9ja1Bv
aW50UmVmbG93T2Zmc2V0ID0gRmxvYXRQb2ludCgtZHgsIC0zKTsKKyAgICB9CisjZW5kaWYKKwor
ICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBvcmlnaW5hbCBub2RlIHJlY3QgaXMgdmlzaWJsZSBp
biB0aGUgc2NyZWVuIGFmdGVyIHRoZSB6b29tLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRo
ZSBpZGVudGlmaWVkIGJsb2NrIHJlY3QgbWlnaHQKKyAgICAvLyBub3QgYmUgdGhlIHNhbWUgYXMg
dGhlIG9yaWdpbmFsIG5vZGUgcmVjdCwgYW5kIGl0IGNvdWxkIGZvcmNlIHRoZSBvcmlnaW5hbCBu
b2RlIHJlY3Qgb2ZmIHRoZSBzY3JlZW4uCisgICAgRmxvYXRSZWN0IGJyKGFuY2hvciwgRmxvYXRT
aXplKHNjYWxlZFZpZXdwb3J0V2lkdGgsIHNjYWxlZFZpZXdwb3J0SGVpZ2h0KSk7CisgICAgSW50
UG9pbnQgY2xpY2tQb2ludCA9IGQtPm1hcEZyb21UcmFuc2Zvcm1lZChJbnRQb2ludCh4LCB5KSk7
CisgICAgaWYgKCFici5jb250YWlucyhjbGlja1BvaW50KSkgeworICAgICAgICBkLT5tX2ZpbmFs
QmxvY2tQb2ludFJlZmxvd09mZnNldC5tb3ZlKDAsIChjbGlja1BvaW50LnkoKSAtIHNjYWxlZFZp
ZXdwb3J0SGVpZ2h0IC8gMikgLSBkLT5tX2ZpbmFsQmxvY2tQb2ludC55KCkpOworICAgICAgICBk
LT5tX2ZpbmFsQmxvY2tQb2ludCA9IEZsb2F0UG9pbnQoZC0+bV9maW5hbEJsb2NrUG9pbnQueCgp
LCBjbGlja1BvaW50LnkoKSAtIHNjYWxlZFZpZXdwb3J0SGVpZ2h0IC8gMik7CisgICAgfQorCisg
ICAgLy8gQ2xhbXAgdGhlIGZpbmFsQmxvY2tQb2ludCB0byBub3QgY2F1c2UgYW55IG92ZXJmbG93
IHNjcm9sbGluZy4KKyAgICBpZiAoZC0+bV9maW5hbEJsb2NrUG9pbnQueCgpIDwgMCkgeworICAg
ICAgICBkLT5tX2ZpbmFsQmxvY2tQb2ludC5zZXRYKDApOworICAgICAgICBkLT5tX2ZpbmFsQmxv
Y2tQb2ludFJlZmxvd09mZnNldC5zZXRYKDApOworICAgIH0gZWxzZSBpZiAoZC0+bV9maW5hbEJs
b2NrUG9pbnQueCgpICsgc2NhbGVkVmlld3BvcnRXaWR0aCA+IGQtPmNvbnRlbnRzU2l6ZSgpLndp
ZHRoKCkpIHsKKyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnQuc2V0WChkLT5jb250ZW50c1Np
emUoKS53aWR0aCgpIC0gc2NhbGVkVmlld3BvcnRXaWR0aCk7CisgICAgICAgIGQtPm1fZmluYWxC
bG9ja1BvaW50UmVmbG93T2Zmc2V0LnNldFgoMCk7CisgICAgfQorCisgICAgaWYgKGQtPm1fZmlu
YWxCbG9ja1BvaW50LnkoKSA8IDApIHsKKyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnQuc2V0
WSgwKTsKKyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnRSZWZsb3dPZmZzZXQuc2V0WSgwKTsK
KyAgICB9IGVsc2UgaWYgKGQtPm1fZmluYWxCbG9ja1BvaW50LnkoKSArIHNjYWxlZFZpZXdwb3J0
SGVpZ2h0ID4gZC0+Y29udGVudHNTaXplKCkuaGVpZ2h0KCkpIHsKKyAgICAgICAgZC0+bV9maW5h
bEJsb2NrUG9pbnQuc2V0WShkLT5jb250ZW50c1NpemUoKS5oZWlnaHQoKSAtIHNjYWxlZFZpZXdw
b3J0SGVpZ2h0KTsKKyAgICAgICAgZC0+bV9maW5hbEJsb2NrUG9pbnRSZWZsb3dPZmZzZXQuc2V0
WSgwKTsKKyAgICB9CisKKyAgICBkLT5tX2ZpbmFsQmxvY2tQb2ludCA9IGQtPm1hcFRvVHJhbnNm
b3JtZWRGbG9hdFBvaW50KGQtPm1fZmluYWxCbG9ja1BvaW50KTsKKworICAgIC8vIERvbid0IGJs
b2NrIHpvb20gaWYgdGhlIHVzZXIgaXMgem9vbWluZyBhbmQgdGhlIG5ldyBzY2FsZSBpcyBvbmx5
IG1hcmdpbmFsbHkgZGlmZmVyZW50IGZyb20gdGhlCisgICAgLy8gb2xkU2NhbGUgd2l0aCBvbmx5
IGEgbWFyZ2luYWwgY2hhbmdlIGluIHNjcm9sbCBwb3NpdGlvbi4gSWdub3JlIHNjcm9sbCBkaWZm
ZXJlbmNlIGluIHRoZSBzcGVjaWFsIGNhc2UKKyAgICAvLyB0aGF0IHRoZSB6b29tIGxldmVsIGlz
IHRoZSBtaW5pbXVtU2NhbGUuCisgICAgaWYgKCFlbmRPZkJsb2NrWm9vbU1vZGUgJiYgYWJzKG5l
d1NjYWxlIC0gb2xkU2NhbGUpIC8gb2xkU2NhbGUgPCBtaW5pbXVtRXhwYW5kaW5nUmF0aW8pIHsK
KyAgICAgICAgY29uc3QgZG91YmxlIG1pbmltdW1EaXNwbGFjZW1lbnQgPSBtaW5pbXVtRXhwYW5k
aW5nUmF0aW8gKiBkLT50cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKCkud2lkdGgoKTsKKyAg
ICAgICAgaWYgKG9sZFNjYWxlID09IGQtPm1pbmltdW1TY2FsZSgpIHx8IChkaXN0YW5jZUJldHdl
ZW5Qb2ludHMocm91bmRUcmFuc2Zvcm1lZFBvaW50KGQtPm1hcFRvVHJhbnNmb3JtZWQoZC0+c2Ny
b2xsUG9zaXRpb24oKSkpLCByb3VuZFRyYW5zZm9ybWVkUG9pbnQoZC0+bV9maW5hbEJsb2NrUG9p
bnQpKSA8IG1pbmltdW1EaXNwbGFjZW1lbnQgJiYgYWJzKG5ld1NjYWxlIC0gb2xkU2NhbGUpIC8g
b2xkU2NhbGUgPCAwLjEwKSkgeworICAgICAgICAgICAgaWYgKGlzRmlyc3Rab29tKSB7CisgICAg
ICAgICAgICAgICAgZC0+cmVzZXRCbG9ja1pvb20oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBab29tIG91dCBvZiBibG9jayB6
b29tLgorICAgICAgICAgICAgYmxvY2tab29tKHgsIHkpOworICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkLT5tX2Jsb2NrWm9vbUZpbmFsU2NhbGUgPSBu
ZXdTY2FsZTsKKworICAgIC8vIFdlIHNldCB0aGlzIGhlcmUgdG8gbWFrZSBzdXJlIHdlIGRvbid0
IHRyeSB0byByZS1yZW5kZXIgdGhlIHBhZ2UgYXQgYSBkaWZmZXJlbnQgem9vbSBsZXZlbCBkdXJp
bmcgbG9hZGluZy4KKyAgICBkLT5tX3VzZXJQZXJmb3JtZWRNYW51YWxab29tID0gdHJ1ZTsKKyAg
ICBkLT5tX3VzZXJQZXJmb3JtZWRNYW51YWxTY3JvbGwgPSB0cnVlOworICAgIGQtPm1fY2xpZW50
LT5hbmltYXRlQmxvY2tab29tKGQtPm1fZmluYWxCbG9ja1BvaW50LCBkLT5tX2Jsb2NrWm9vbUZp
bmFsU2NhbGUpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgV2ViUGFnZTo6aXNNYXha
b29tZWQoKSBjb25zdAoreworICAgIHJldHVybiAoZC0+Y3VycmVudFNjYWxlKCkgPT0gZC0+bWF4
aW11bVNjYWxlKCkpIHx8ICFkLT5pc1VzZXJTY2FsYWJsZSgpOworfQorCitib29sIFdlYlBhZ2U6
OmlzTWluWm9vbWVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKGQtPmN1cnJlbnRTY2FsZSgpID09
IGQtPm1pbmltdW1TY2FsZSgpKSB8fCAhZC0+aXNVc2VyU2NhbGFibGUoKTsKK30KKworYm9vbCBX
ZWJQYWdlOjppc0F0SW5pdGlhbFpvb20oKSBjb25zdAoreworICAgIHJldHVybiAoZC0+Y3VycmVu
dFNjYWxlKCkgPT0gZC0+aW5pdGlhbFNjYWxlKCkpIHx8ICFkLT5pc1VzZXJTY2FsYWJsZSgpOwor
fQorCitib29sIFdlYlBhZ2VQcml2YXRlOjpzaG91bGRab29tT25Fc2NhcGUoKSBjb25zdAorewor
ICAgIGlmICghaXNVc2VyU2NhbGFibGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
Ly8gSWYgdGhlIGluaXRpYWwgc2NhbGUgaXMgbm90IHJlYWNoYWJsZSwgZG9uJ3QgdHJ5IHRvIHpv
b20uCisgICAgaWYgKGluaXRpYWxTY2FsZSgpIDwgbWluaW11bVNjYWxlKCkgfHwgaW5pdGlhbFNj
YWxlKCkgPiBtYXhpbXVtU2NhbGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8g
RG9uJ3QgZXZlciB6b29tIGluIHdoZW4gd2UgcHJlc3MgZXNjYXBlLgorICAgIGlmIChpbml0aWFs
U2NhbGUoKSA+PSBjdXJyZW50U2NhbGUoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
cmV0dXJuIGN1cnJlbnRTY2FsZSgpICE9IGluaXRpYWxTY2FsZSgpOworfQorCit2b2lkIFdlYlBh
Z2U6Onpvb21Ub0luaXRpYWxTY2FsZSgpCit7CisgICAgaWYgKCFkLT5pc1VzZXJTY2FsYWJsZSgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBkLT56b29tQWJvdXRQb2ludChkLT5pbml0aWFsU2Nh
bGUoKSwgZC0+Y2VudGVyT2ZWaXNpYmxlQ29udGVudHNSZWN0KCkpOworfQorCitib29sIFdlYlBh
Z2U6Onpvb21Ub09uZU9uZSgpCit7CisgICAgaWYgKCFkLT5pc1VzZXJTY2FsYWJsZSgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBkb3VibGUgc2NhbGUgPSAxOworICAgIHJldHVybiBk
LT56b29tQWJvdXRQb2ludChzY2FsZSwgZC0+Y2VudGVyT2ZWaXNpYmxlQ29udGVudHNSZWN0KCkp
OworfQorCitQbGF0Zm9ybTo6SW50UmVjdCBXZWJQYWdlOjpmb2N1c05vZGVSZWN0KCkKK3sKKyAg
ICByZXR1cm4gZC0+Zm9jdXNOb2RlUmVjdCgpOworfQorCit2b2lkIFdlYlBhZ2U6OnNldEZvY3Vz
ZWQoYm9vbCBmb2N1c2VkKQoreworICAgIEZvY3VzQ29udHJvbGxlciogZm9jdXNDb250cm9sbGVy
ID0gZC0+bV9wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKTsKKyAgICBmb2N1c0NvbnRyb2xsZXItPnNl
dEFjdGl2ZShmb2N1c2VkKTsKKyAgICBpZiAoZm9jdXNlZCkgeworICAgICAgICBGcmFtZSogZnJh
bWUgPSBmb2N1c0NvbnRyb2xsZXItPmZvY3VzZWRGcmFtZSgpOworICAgICAgICBpZiAoIWZyYW1l
KQorICAgICAgICAgICAgZm9jdXNDb250cm9sbGVyLT5zZXRGb2N1c2VkRnJhbWUoZC0+bV9tYWlu
RnJhbWUpOworICAgIH0KKyAgICBmb2N1c0NvbnRyb2xsZXItPnNldEZvY3VzZWQoZm9jdXNlZCk7
Cit9CisKK2Jvb2wgV2ViUGFnZTo6ZmluZE5leHRTdHJpbmcoY29uc3QgY2hhciogdGV4dCwgYm9v
bCBmb3J3YXJkKQoreworICAgIHJldHVybiBkLT5tX2luUGFnZVNlYXJjaE1hbmFnZXItPmZpbmRO
ZXh0U3RyaW5nKFN0cmluZzo6ZnJvbVVURjgodGV4dCksIGZvcndhcmQpOworfQorCit2b2lkIFdl
YlBhZ2U6OnJ1bkxheW91dFRlc3RzKCkKK3sKKyNpZiBFTkFCTEVfRFJUCisgICAgLy8gRklYTUU6
IGRvIHdlIG5lZWQgQVBJIHRvIHRvZ2dsZSB0aGlzPworICAgIGQtPm1fcGFnZS0+c2V0dGluZ3Mo
KS0+c2V0RGV2ZWxvcGVyRXh0cmFzRW5hYmxlZCh0cnVlKTsKKworICAgIGlmICghZC0+bV9kdW1w
UmVuZGVyVHJlZSkKKyAgICAgICAgZC0+bV9kdW1wUmVuZGVyVHJlZSA9IG5ldyBEdW1wUmVuZGVy
VHJlZSh0aGlzKTsKKyAgICBkLT5tX2R1bXBSZW5kZXJUcmVlLT5ydW5UZXN0cygpOworI2VuZGlm
Cit9CisKK2Jvb2wgV2ViUGFnZTo6ZW5hYmxlU2NyaXB0RGVidWdnZXIoKQoreworI2lmIEVOQUJM
RShKQVZBU0NSSVBUX0RFQlVHR0VSKQorICAgIGlmIChkLT5tX3NjcmlwdERlYnVnZ2VyKQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGQtPm1fc2NyaXB0RGVidWdnZXIgPSBhZG9wdFB0cihu
ZXcgSmF2YVNjcmlwdERlYnVnZ2VyQmxhY2tCZXJyeSh0aGlzLT5kKSk7CisKKyAgICByZXR1cm4g
ISFkLT5tX3NjcmlwdERlYnVnZ2VyOworI2VuZGlmCit9CisKK2Jvb2wgV2ViUGFnZTo6ZGlzYWJs
ZVNjcmlwdERlYnVnZ2VyKCkKK3sKKyNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKKyAg
ICBpZiAoIWQtPm1fc2NyaXB0RGVidWdnZXIpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAg
ZC0+bV9zY3JpcHREZWJ1Z2dlci5jbGVhcigpOworICAgIHJldHVybiB0cnVlOworI2VuZGlmCit9
CisKK3ZvaWQgV2ViUGFnZTo6YWRkQnJlYWtwb2ludChjb25zdCB1bnNpZ25lZCBzaG9ydCogdXJs
LCB1bnNpZ25lZCB1cmxMZW5ndGgsIGludCBsaW5lTnVtYmVyLCBjb25zdCB1bnNpZ25lZCBzaG9y
dCogY29uZGl0aW9uLCB1bnNpZ25lZCBjb25kaXRpb25MZW5ndGgpCit7CisjaWYgRU5BQkxFKEpB
VkFTQ1JJUFRfREVCVUdHRVIpCisgICAgaWYgKGQtPm1fc2NyaXB0RGVidWdnZXIpCisgICAgICAg
IGQtPm1fc2NyaXB0RGVidWdnZXItPmFkZEJyZWFrcG9pbnQodXJsLCB1cmxMZW5ndGgsIGxpbmVO
dW1iZXIsIGNvbmRpdGlvbiwgY29uZGl0aW9uTGVuZ3RoKTsKKyNlbmRpZgorfQorCit2b2lkIFdl
YlBhZ2U6OnVwZGF0ZUJyZWFrcG9pbnQoY29uc3QgdW5zaWduZWQgc2hvcnQqIHVybCwgdW5zaWdu
ZWQgdXJsTGVuZ3RoLCBpbnQgbGluZU51bWJlciwgY29uc3QgdW5zaWduZWQgc2hvcnQqIGNvbmRp
dGlvbiwgdW5zaWduZWQgY29uZGl0aW9uTGVuZ3RoKQoreworI2lmIEVOQUJMRShKQVZBU0NSSVBU
X0RFQlVHR0VSKQorICAgIGlmIChkLT5tX3NjcmlwdERlYnVnZ2VyKQorICAgICAgICBkLT5tX3Nj
cmlwdERlYnVnZ2VyLT51cGRhdGVCcmVha3BvaW50KHVybCwgdXJsTGVuZ3RoLCBsaW5lTnVtYmVy
LCBjb25kaXRpb24sIGNvbmRpdGlvbkxlbmd0aCk7CisjZW5kaWYKK30KKwordm9pZCBXZWJQYWdl
OjpyZW1vdmVCcmVha3BvaW50KGNvbnN0IHVuc2lnbmVkIHNob3J0KiB1cmwsIHVuc2lnbmVkIHVy
bExlbmd0aCwgaW50IGxpbmVOdW1iZXIpCit7CisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdH
RVIpCisgICAgaWYgKGQtPm1fc2NyaXB0RGVidWdnZXIpCisgICAgICAgIGQtPm1fc2NyaXB0RGVi
dWdnZXItPnJlbW92ZUJyZWFrcG9pbnQodXJsLCB1cmxMZW5ndGgsIGxpbmVOdW1iZXIpOworI2Vu
ZGlmCit9CisKK2Jvb2wgV2ViUGFnZTo6cGF1c2VPbkV4Y2VwdGlvbnMoKQoreworI2lmIEVOQUJM
RShKQVZBU0NSSVBUX0RFQlVHR0VSKQorICAgIHJldHVybiBkLT5tX3NjcmlwdERlYnVnZ2VyID8g
ZC0+bV9zY3JpcHREZWJ1Z2dlci0+cGF1c2VPbkV4Y2VwdGlvbnMoKSA6IGZhbHNlOworI2VuZGlm
Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0UGF1c2VPbkV4Y2VwdGlvbnMoYm9vbCBwYXVzZSkKK3sK
KyNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKKyAgICBpZiAoZC0+bV9zY3JpcHREZWJ1
Z2dlcikKKyAgICAgICAgZC0+bV9zY3JpcHREZWJ1Z2dlci0+c2V0UGF1c2VPbkV4Y2VwdGlvbnMo
cGF1c2UpOworI2VuZGlmCit9CisKK3ZvaWQgV2ViUGFnZTo6cGF1c2VJbkRlYnVnZ2VyKCkKK3sK
KyNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKKyAgICBpZiAoZC0+bV9zY3JpcHREZWJ1
Z2dlcikKKyAgICAgICAgZC0+bV9zY3JpcHREZWJ1Z2dlci0+cGF1c2VJbkRlYnVnZ2VyKCk7Cisj
ZW5kaWYKK30KKwordm9pZCBXZWJQYWdlOjpyZXN1bWVEZWJ1Z2dlcigpCit7CisjaWYgRU5BQkxF
KEpBVkFTQ1JJUFRfREVCVUdHRVIpCisgICAgaWYgKGQtPm1fc2NyaXB0RGVidWdnZXIpCisgICAg
ICAgIGQtPm1fc2NyaXB0RGVidWdnZXItPnJlc3VtZURlYnVnZ2VyKCk7CisjZW5kaWYKK30KKwor
dm9pZCBXZWJQYWdlOjpzdGVwT3ZlclN0YXRlbWVudEluRGVidWdnZXIoKQoreworI2lmIEVOQUJM
RShKQVZBU0NSSVBUX0RFQlVHR0VSKQorICAgIGlmIChkLT5tX3NjcmlwdERlYnVnZ2VyKQorICAg
ICAgICBkLT5tX3NjcmlwdERlYnVnZ2VyLT5zdGVwT3ZlclN0YXRlbWVudEluRGVidWdnZXIoKTsK
KyNlbmRpZgorfQorCit2b2lkIFdlYlBhZ2U6OnN0ZXBJbnRvU3RhdGVtZW50SW5EZWJ1Z2dlcigp
Cit7CisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIpCisgICAgaWYgKGQtPm1fc2NyaXB0
RGVidWdnZXIpCisgICAgICAgIGQtPm1fc2NyaXB0RGVidWdnZXItPnN0ZXBJbnRvU3RhdGVtZW50
SW5EZWJ1Z2dlcigpOworI2VuZGlmCit9CisKK3ZvaWQgV2ViUGFnZTo6c3RlcE91dE9mRnVuY3Rp
b25JbkRlYnVnZ2VyKCkKK3sKKyNpZiBFTkFCTEUoSkFWQVNDUklQVF9ERUJVR0dFUikKKyAgICBp
ZiAoZC0+bV9zY3JpcHREZWJ1Z2dlcikKKyAgICAgICAgZC0+bV9zY3JpcHREZWJ1Z2dlci0+c3Rl
cE91dE9mRnVuY3Rpb25JbkRlYnVnZ2VyKCk7CisjZW5kaWYKK30KKwordW5zaWduZWQgV2ViUGFn
ZTo6dGltZW91dEZvckphdmFTY3JpcHRFeGVjdXRpb24oKSBjb25zdAoreworICAgIHJldHVybiBT
ZXR0aW5nczo6dGltZW91dEZvckphdmFTY3JpcHRFeGVjdXRpb24oZC0+bV9wYWdlLT5ncm91cE5h
bWUoKSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6c2V0VGltZW91dEZvckphdmFTY3JpcHRFeGVjdXRp
b24odW5zaWduZWQgbXMpCit7CisgICAgU2V0dGluZ3M6OnNldFRpbWVvdXRGb3JKYXZhU2NyaXB0
RXhlY3V0aW9uKGQtPm1fcGFnZS0+Z3JvdXBOYW1lKCksIG1zKTsKKworICAgIERvY3VtZW50KiBk
b2MgPSBkLT5tX3BhZ2UtPm1haW5GcmFtZSgpLT5kb2N1bWVudCgpOworICAgIGlmICghZG9jKQor
ICAgICAgICByZXR1cm47CisKKyAgICBkb2MtPmdsb2JhbERhdGEoKS0+dGltZW91dENoZWNrZXIu
c2V0VGltZW91dEludGVydmFsKG1zKTsKK30KKworSlNDb250ZXh0UmVmIFdlYlBhZ2U6OnNjcmlw
dENvbnRleHQoKSBjb25zdAoreworICAgIGlmICghZC0+bV9tYWluRnJhbWUpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgSlNDOjpCaW5kaW5nczo6Um9vdE9iamVjdCAqcm9vdCA9IGQtPm1fbWFp
bkZyYW1lLT5zY3JpcHQoKS0+YmluZGluZ1Jvb3RPYmplY3QoKTsKKyAgICBpZiAoIXJvb3QpCisg
ICAgICAgIHJldHVybiAwOworCisgICAgSlNDOjpFeGVjU3RhdGUgKmV4ZWMgPSByb290LT5nbG9i
YWxPYmplY3QoKS0+Z2xvYmFsRXhlYygpOworICAgIHJldHVybiB0b1JlZihleGVjKTsKK30KKwor
SlNWYWx1ZVJlZiBXZWJQYWdlOjp3aW5kb3dPYmplY3QoKSBjb25zdAoreworICAgIHJldHVybiB0
b1JlZihkLT5tX21haW5GcmFtZS0+c2NyaXB0KCktPmdsb2JhbE9iamVjdChtYWluVGhyZWFkTm9y
bWFsV29ybGQoKSkpOworfQorCisvLyBTZXJpYWxpemUgb25seSB0aGUgbWVtYmVycyBvZiBIaXN0
b3J5SXRlbSB3aGljaCBhcmUgbmVlZGVkIGJ5IHRoZSBjbGllbnQsCisvLyBhbmQgY29weSB0aGVt
IGludG8gYSBTaGFyZWRBcnJheS4gQWxzbyBpbmNsdWRlIHRoZSBIaXN0b3J5SXRlbSBwb2ludGVy
IHdoaWNoCisvLyB3aWxsIGJlIHVzZWQgYnkgdGhlIGNsaWVudCBhcyBhbiBvcGFxdWUgcmVmZXJl
bmNlIHRvIGlkZW50aWZ5IHRoZSBpdGVtLgordm9pZCBXZWJQYWdlOjpnZXRCYWNrRm9yd2FyZExp
c3QoU2hhcmVkQXJyYXk8QmFja0ZvcndhcmRFbnRyeT4mIHJlc3VsdCwgdW5zaWduZWQgaW50JiBy
ZXN1bHRTaXplKSBjb25zdAoreworICAgIEhpc3RvcnlJdGVtVmVjdG9yIGVudHJpZXMgPSBzdGF0
aWNfY2FzdDxCYWNrRm9yd2FyZExpc3RJbXBsKj4oZC0+bV9wYWdlLT5iYWNrRm9yd2FyZCgpLT5j
bGllbnQoKSktPmVudHJpZXMoKTsKKyAgICByZXN1bHRTaXplID0gZW50cmllcy5zaXplKCk7Cisg
ICAgcmVzdWx0LnJlc2V0KG5ldyBCYWNrRm9yd2FyZEVudHJ5W3Jlc3VsdFNpemVdKTsKKworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCByZXN1bHRTaXplOyArK2kpIHsKKyAgICAgICAgUmVm
UHRyPEhpc3RvcnlJdGVtPiBlbnRyeSA9IGVudHJpZXNbaV07CisgICAgICAgIEJhY2tGb3J3YXJk
RW50cnkmIHJlc3VsdEVudHJ5ID0gcmVzdWx0W2ldOworICAgICAgICByZXN1bHRFbnRyeS51cmwg
PSBlbnRyeS0+dXJsU3RyaW5nKCk7CisgICAgICAgIHJlc3VsdEVudHJ5Lm9yaWdpbmFsVXJsID0g
ZW50cnktPm9yaWdpbmFsVVJMU3RyaW5nKCk7CisgICAgICAgIHJlc3VsdEVudHJ5LnRpdGxlID0g
ZW50cnktPnRpdGxlKCk7CisgICAgICAgIHJlc3VsdEVudHJ5Lm5ldHdvcmtUb2tlbiA9IGVudHJ5
LT52aWV3U3RhdGUoKS5uZXR3b3JrVG9rZW47CisgICAgICAgIHJlc3VsdEVudHJ5Lmxhc3RWaXNp
dFdhc0hUVFBOb25HZXQgPSBlbnRyeS0+bGFzdFZpc2l0V2FzSFRUUE5vbkdldCgpOworICAgICAg
ICByZXN1bHRFbnRyeS5pZCA9IGJhY2tGb3J3YXJkSWRGcm9tSGlzdG9yeUl0ZW0oZW50cnkuZ2V0
KCkpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgSGlzdG9yeUl0ZW0gaXMgbm90IGRpc3Bv
c2VkIHdoaWxlIHRoZSByZXN1bHQgbGlzdCBpcyBzdGlsbCBiZWluZyB1c2VkLCB0byBtYWtlIHN1
cmUgdGhlIHBvaW50ZXIgaXMgbm90IHJldXNlZAorICAgICAgICAvLyB3aWxsIGJlIGJhbGFuY2Vk
IGJ5IGRlcmVmIGluIHJlbGVhc2VCYWNrRm9yd2FyZEVudHJ5LgorICAgICAgICBlbnRyeS0+cmVm
KCk7CisgICAgfQorfQorCit2b2lkIFdlYlBhZ2U6OnJlbGVhc2VCYWNrRm9yd2FyZEVudHJ5KEJh
Y2tGb3J3YXJkSWQgaWQpIGNvbnN0Cit7CisgICAgSGlzdG9yeUl0ZW0qIGl0ZW0gPSBoaXN0b3J5
SXRlbUZyb21CYWNrRm9yd2FyZElkKGlkKTsKKyAgICBBU1NFUlQoaXRlbSk7CisgICAgaXRlbS0+
ZGVyZWYoKTsKK30KKwordm9pZCBXZWJQYWdlOjpjbGVhckJyb3dzaW5nRGF0YSgpCit7CisgICAg
Y2xlYXJNZW1vcnlDYWNoZXMoKTsKKyAgICBjbGVhckFwcENhY2hlKGQtPm1fcGFnZS0+Z3JvdXBO
YW1lKCkpOworICAgIGNsZWFyTG9jYWxTdG9yYWdlKCk7CisgICAgY2xlYXJDb29raWVDYWNoZSgp
OworICAgIGNsZWFySGlzdG9yeSgpOworICAgIGNsZWFyUGx1Z2luU2l0ZURhdGEoKTsKK30KKwor
dm9pZCBXZWJQYWdlOjpjbGVhckhpc3RvcnkoKQoreworICAgIC8vIERvbid0IGNsZWFyIHRoZSBi
YWNrLWZvcndhcmQgbGlzdCBhcyB3ZSBtaWdodCBsaWtlIHRvIGtlZXAgaXQuCit9CisKK3ZvaWQg
V2ViUGFnZTo6Y2xlYXJDb29raWVzKCkKK3sKKyAgICBjbGVhckNvb2tpZUNhY2hlKCk7Cit9CisK
K3ZvaWQgV2ViUGFnZTo6Y2xlYXJMb2NhbFN0b3JhZ2UoKQoreworICAgIEJsYWNrQmVycnk6Oldl
YktpdDo6Y2xlYXJMb2NhbFN0b3JhZ2UoZC0+bV9wYWdlLT5ncm91cE5hbWUoKSk7CisgICAgY2xl
YXJEYXRhYmFzZShkLT5tX3BhZ2UtPmdyb3VwTmFtZSgpKTsKK30KKwordm9pZCBXZWJQYWdlOjpj
bGVhckNhY2hlKCkKK3sKKyAgICBjbGVhck1lbW9yeUNhY2hlcygpOworICAgIGNsZWFyQXBwQ2Fj
aGUoZC0+bV9wYWdlLT5ncm91cE5hbWUoKSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6Y2xlYXJCYWNr
Rm9yd2FyZExpc3QoYm9vbCBrZWVwQ3VycmVudFBhZ2UpIGNvbnN0Cit7CisgICAgQmFja0Zvcndh
cmRMaXN0SW1wbCogYmFja0ZvcndhcmRMaXN0ID0gc3RhdGljX2Nhc3Q8QmFja0ZvcndhcmRMaXN0
SW1wbCo+KGQtPm1fcGFnZS0+YmFja0ZvcndhcmQoKS0+Y2xpZW50KCkpOworICAgIFJlZlB0cjxI
aXN0b3J5SXRlbT4gY3VycmVudEl0ZW0gPSBiYWNrRm9yd2FyZExpc3QtPmN1cnJlbnRJdGVtKCk7
CisgICAgd2hpbGUgKCFiYWNrRm9yd2FyZExpc3QtPmVudHJpZXMoKS5pc0VtcHR5KCkpCisgICAg
ICAgIGJhY2tGb3J3YXJkTGlzdC0+cmVtb3ZlSXRlbShiYWNrRm9yd2FyZExpc3QtPmVudHJpZXMo
KS5sYXN0KCkuZ2V0KCkpOworICAgIGlmIChrZWVwQ3VycmVudFBhZ2UpCisgICAgICAgIGJhY2tG
b3J3YXJkTGlzdC0+YWRkSXRlbShjdXJyZW50SXRlbSk7Cit9CisKK2Jvb2wgV2ViUGFnZTo6aXNF
bmFibGVMb2NhbEFjY2Vzc1RvQWxsQ29va2llcygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNvb2tp
ZU1hbmFnZXIoKS5jYW5Mb2NhbEFjY2Vzc0FsbENvb2tpZXMoKTsKK30KKwordm9pZCBXZWJQYWdl
OjpzZXRFbmFibGVMb2NhbEFjY2Vzc1RvQWxsQ29va2llcyhib29sIGVuYWJsZWQpCit7CisgICAg
Y29va2llTWFuYWdlcigpLnNldENhbkxvY2FsQWNjZXNzQWxsQ29va2llcyhlbmFibGVkKTsKK30K
Kwordm9pZCBXZWJQYWdlOjphZGRWaXNpdGVkTGluayhjb25zdCB1bnNpZ25lZCBzaG9ydCogdXJs
LCB1bnNpZ25lZCBpbnQgbGVuZ3RoKQoreworICAgIEFTU0VSVChkLT5tX3BhZ2UpOworICAgIGQt
Pm1fcGFnZS0+Z3JvdXAoKS5hZGRWaXNpdGVkTGluayh1cmwsIGxlbmd0aCk7Cit9CisKKyNpZiBF
TkFCTEUoV0VCRE9NKQorV2ViRE9NRG9jdW1lbnQgV2ViUGFnZTo6ZG9jdW1lbnQoKSBjb25zdAor
eworICAgIGlmICghZC0+bV9tYWluRnJhbWUpCisgICAgICAgIHJldHVybiBXZWJET01Eb2N1bWVu
dCgpOworICAgIHJldHVybiBXZWJET01Eb2N1bWVudChkLT5tX21haW5GcmFtZS0+ZG9jdW1lbnQo
KSk7Cit9CisKK1dlYkRPTU5vZGUgV2ViUGFnZTo6bm9kZUF0UG9pbnQoaW50IHgsIGludCB5KQor
eworICAgIEhpdFRlc3RSZXN1bHQgcmVzdWx0ID0gZC0+bV9tYWluRnJhbWUtPmV2ZW50SGFuZGxl
cigpLT5oaXRUZXN0UmVzdWx0QXRQb2ludChkLT5tYXBGcm9tVHJhbnNmb3JtZWQoSW50UG9pbnQo
eCwgeSkpLCBmYWxzZSk7CisgICAgTm9kZSogbm9kZSA9IHJlc3VsdC5pbm5lck5vblNoYXJlZE5v
ZGUoKTsKKyAgICByZXR1cm4gV2ViRE9NTm9kZShub2RlKTsKK30KKworYm9vbCBXZWJQYWdlOjpn
ZXROb2RlUmVjdChjb25zdCBXZWJET01Ob2RlJiBub2RlLCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVz
dWx0KQoreworICAgIE5vZGUqIG5vZGVJbXBsID0gbm9kZS5pbXBsKCk7CisgICAgaWYgKG5vZGVJ
bXBsICYmIG5vZGVJbXBsLT5yZW5kZXJlcigpKSB7CisgICAgICAgIHJlc3VsdCA9IG5vZGVJbXBs
LT5nZXRSZWN0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBm
YWxzZTsKK30KKworYm9vbCBXZWJQYWdlOjpzZXROb2RlRm9jdXMoY29uc3QgV2ViRE9NTm9kZSYg
bm9kZSwgYm9vbCBvbikKK3sKKyAgICBOb2RlKiBub2RlSW1wbCA9IG5vZGUuaW1wbCgpOworCisg
ICAgaWYgKG5vZGVJbXBsICYmIG5vZGVJbXBsLT5pc0ZvY3VzYWJsZSgpKSB7CisgICAgICAgIERv
Y3VtZW50KiBkb2MgPSBub2RlSW1wbC0+ZG9jdW1lbnQoKTsKKyAgICAgICAgaWYgKFBhZ2UqIHBh
Z2UgPSBkb2MtPnBhZ2UoKSkgeworICAgICAgICAgICAgLy8gTW9kaWZ5IGlmIGZvY3VzaW5nIG9u
IG5vZGUgb3IgdHVybmluZyBvZmYgZm9jdXNlZCBub2RlLgorICAgICAgICAgICAgaWYgKG9uKSB7
CisgICAgICAgICAgICAgICAgcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPnNldEZvY3VzZWROb2Rl
KG5vZGVJbXBsLCBkb2MtPmZyYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChub2RlSW1wbC0+
aXNFbGVtZW50Tm9kZSgpKQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFbGVtZW50
Kj4obm9kZUltcGwpLT51cGRhdGVGb2N1c0FwcGVhcmFuY2UodHJ1ZSk7CisgICAgICAgICAgICAg
ICAgZC0+bV9pbnB1dEhhbmRsZXItPmRpZE5vZGVPcGVuUG9wdXAobm9kZUltcGwpOworICAgICAg
ICAgICAgfSBlbHNlIGlmIChkb2MtPmZvY3VzZWROb2RlKCkgPT0gbm9kZUltcGwpIC8vICYmICFv
bgorICAgICAgICAgICAgICAgIHBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5zZXRGb2N1c2VkTm9k
ZSgwLCBkb2MtPmZyYW1lKCkpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
fQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgV2ViUGFnZTo6c2V0Tm9kZUhv
dmVyZWQoY29uc3QgV2ViRE9NTm9kZSYgbm9kZSwgYm9vbCBvbikKK3sKKyAgICBpZiAoTm9kZSog
bm9kZUltcGwgPSBub2RlLmltcGwoKSkgeworICAgICAgICBub2RlSW1wbC0+c2V0SG92ZXJlZChv
bik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K2Jvb2wgV2ViUGFnZTo6bm9kZUhhc0hvdmVyKGNvbnN0IFdlYkRPTU5vZGUmIG5vZGUpCit7Cisg
ICAgaWYgKE5vZGUqIG5vZGVJbXBsID0gbm9kZS5pbXBsKCkpIHsKKyAgICAgICAgaWYgKFJlbmRl
clN0eWxlKiBzdHlsZSA9IG5vZGVJbXBsLT5yZW5kZXJTdHlsZSgpKQorICAgICAgICAgICAgcmV0
dXJuIHN0eWxlLT5hZmZlY3RlZEJ5SG92ZXJSdWxlcygpOworICAgIH0KKyAgICByZXR1cm4gZmFs
c2U7Cit9CisjZW5kaWYKKworU3RyaW5nIFdlYlBhZ2VQcml2YXRlOjpmaW5kUGF0dGVyblN0cmlu
Z0ZvclVybChjb25zdCBLVVJMJiB1cmwpIGNvbnN0Cit7CisgICAgaWYgKChtX3dlYlNldHRpbmdz
LT5zaG91bGRIYW5kbGVQYXR0ZXJuVXJscygpICYmIHByb3RvY29sSXModXJsLCAicGF0dGVybiIp
KQorICAgICAgICAgICAgfHwgcHJvdG9jb2xJcyh1cmwsICJ0ZWwiKQorICAgICAgICAgICAgfHwg
cHJvdG9jb2xJcyh1cmwsICJ3dGFpIikKKyAgICAgICAgICAgIHx8IHByb3RvY29sSXModXJsLCAi
Y3RpIikKKyAgICAgICAgICAgIHx8IHByb3RvY29sSXModXJsLCAibWFpbHRvIikKKyAgICAgICAg
ICAgIHx8IHByb3RvY29sSXModXJsLCAic21zIikKKyAgICAgICAgICAgIHx8IHByb3RvY29sSXMo
dXJsLCAicGluIikpIHsKKyAgICAgICAgcmV0dXJuIHVybDsKKyAgICB9CisgICAgcmV0dXJuIFN0
cmluZygpOworfQorCitib29sIFdlYlBhZ2U6OmRlZmVyc0xvYWRpbmcoKSBjb25zdAoreworICAg
IHJldHVybiBkLT5tX3BhZ2UtPmRlZmVyc0xvYWRpbmcoKTsKK30KKworYm9vbCBXZWJQYWdlOjp3
aWxsRmlyZVRpbWVyKCkKK3sKKyAgICBpZiAoZC0+aXNMb2FkaW5nKCkpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgcmV0dXJuIGQtPm1fYmFja2luZ1N0b3JlLT5kLT53aWxsRmlyZVRpbWVy
KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90aWZ5UGFnZVBhdXNlKCkKK3sKKyAgICBGT1JfRUFD
SF9QTFVHSU5WSUVXKGQtPm1fcGx1Z2luVmlld3MpCisgICAgICAgICgqaXQpLT5oYW5kbGVQYXVz
ZUV2ZW50KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90aWZ5UGFnZVJlc3VtZSgpCit7CisgICAg
Rk9SX0VBQ0hfUExVR0lOVklFVyhkLT5tX3BsdWdpblZpZXdzKQorICAgICAgICAoKml0KS0+aGFu
ZGxlUmVzdW1lRXZlbnQoKTsKK30KKwordm9pZCBXZWJQYWdlOjpub3RpZnlQYWdlQmFja2dyb3Vu
ZCgpCit7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGQtPnN1c3BlbmRS
b290TGF5ZXJDb21taXQoKTsKKyNlbmRpZgorCisgICAgRk9SX0VBQ0hfUExVR0lOVklFVyhkLT5t
X3BsdWdpblZpZXdzKQorICAgICAgICAoKml0KS0+aGFuZGxlQmFja2dyb3VuZEV2ZW50KCk7Cit9
CisKK3ZvaWQgV2ViUGFnZTo6bm90aWZ5UGFnZUZvcmVncm91bmQoKQoreworI2lmIFVTRShBQ0NF
TEVSQVRFRF9DT01QT1NJVElORykKKyAgICBkLT5yZXN1bWVSb290TGF5ZXJDb21taXQoKTsKKyNl
bmRpZgorCisgICAgRk9SX0VBQ0hfUExVR0lOVklFVyhkLT5tX3BsdWdpblZpZXdzKQorICAgICAg
ICAoKml0KS0+aGFuZGxlRm9yZWdyb3VuZEV2ZW50KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90
aWZ5UGFnZUZ1bGxTY3JlZW5BbGxvd2VkKCkKK3sKKyAgICBGT1JfRUFDSF9QTFVHSU5WSUVXKGQt
Pm1fcGx1Z2luVmlld3MpCisgICAgICAgICgqaXQpLT5oYW5kbGVGdWxsU2NyZWVuQWxsb3dlZEV2
ZW50KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90aWZ5UGFnZUZ1bGxTY3JlZW5FeGl0KCkKK3sK
KyAgICBGT1JfRUFDSF9QTFVHSU5WSUVXKGQtPm1fcGx1Z2luVmlld3MpCisgICAgICAgICgqaXQp
LT5oYW5kbGVGdWxsU2NyZWVuRXhpdEV2ZW50KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90aWZ5
RGV2aWNlSWRsZVN0YXRlQ2hhbmdlKGJvb2wgZW50ZXJJZGxlKQoreworICAgIEZPUl9FQUNIX1BM
VUdJTlZJRVcoZC0+bV9wbHVnaW5WaWV3cykKKyAgICAgICAgKCppdCktPmhhbmRsZUlkbGVFdmVu
dChlbnRlcklkbGUpOworfQorCit2b2lkIFdlYlBhZ2U6Om5vdGlmeUFwcEFjdGl2YXRpb25TdGF0
ZUNoYW5nZShBY3RpdmF0aW9uU3RhdGVUeXBlIGFjdGl2YXRpb25TdGF0ZSkKK3sKKyNpZiBFTkFC
TEUoVklERU8pCisgICAgTWVkaWFQbGF5ZXJQcml2YXRlOjpub3RpZnlBcHBBY3RpdmF0ZWRFdmVu
dChhY3RpdmF0aW9uU3RhdGUgPT0gQWN0aXZhdGlvbkFjdGl2ZSk7CisjZW5kaWYKKworICAgIEZP
Ul9FQUNIX1BMVUdJTlZJRVcoZC0+bV9wbHVnaW5WaWV3cykgeworICAgICAgICBzd2l0Y2ggKGFj
dGl2YXRpb25TdGF0ZSkgeworICAgICAgICBjYXNlIEFjdGl2YXRpb25BY3RpdmU6CisgICAgICAg
ICAgICAoKml0KS0+aGFuZGxlQXBwQWN0aXZhdGVkRXZlbnQoKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIEFjdGl2YXRpb25JbmFjdGl2ZToKKyAgICAgICAgICAgICgqaXQpLT5o
YW5kbGVBcHBEZWFjdGl2YXRlZEV2ZW50KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBBY3RpdmF0aW9uU3RhbmRieToKKyAgICAgICAgICAgICgqaXQpLT5oYW5kbGVBcHBTdGFu
ZGJ5RXZlbnQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBGSVhN
RTogR2V0IHJpZCBvZiB0aGUgZGVmYXVsdCB0byBmb3JjZSBhIGNvbXBpbGVyIGVycm9yIGluc3Rl
YWQgb2YgdXNpbmcgYSBydW50aW1lIGVycm9yLiBTZWUgUFIgIzEyMTEwOS4KKyAgICAgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICB9Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90aWZ5U3dpcGVFdmVudCgpCit7CisgICAgRk9SX0VB
Q0hfUExVR0lOVklFVyhkLT5tX3BsdWdpblZpZXdzKQorICAgICAgICgqaXQpLT5oYW5kbGVTd2lw
ZUV2ZW50KCk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6bm90aWZ5U2NyZWVuUG93ZXJTdGF0ZUNoYW5n
ZWQoYm9vbCBwb3dlcmVkKQoreworICAgIEZPUl9FQUNIX1BMVUdJTlZJRVcoZC0+bV9wbHVnaW5W
aWV3cykKKyAgICAgICAoKml0KS0+aGFuZGxlU2NyZWVuUG93ZXJFdmVudChwb3dlcmVkKTsKK30K
Kwordm9pZCBXZWJQYWdlOjpub3RpZnlGdWxsU2NyZWVuVmlkZW9FeGl0ZWQoYm9vbCBkb25lKQor
eworICAgIFVOVVNFRF9QQVJBTShkb25lKTsKKyNpZiBFTkFCTEUoVklERU8pCisgICAgaWYgKEhU
TUxNZWRpYUVsZW1lbnQqIG1lZGlhRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxNZWRpYUVsZW1l
bnQqPihkLT5tX2Z1bGxzY3JlZW5WaWRlb05vZGUuZ2V0KCkpKQorICAgICAgICBtZWRpYUVsZW1l
bnQtPmV4aXRGdWxsc2NyZWVuKCk7CisjZW5kaWYKK30KKwordm9pZCBXZWJQYWdlOjpjbGVhclBs
dWdpblNpdGVEYXRhKCkKK3sKKyAgICBQbHVnaW5EYXRhYmFzZSogZGF0YWJhc2UgPSBQbHVnaW5E
YXRhYmFzZTo6aW5zdGFsbGVkUGx1Z2lucyh0cnVlKTsKKworICAgIGlmICghZGF0YWJhc2UpCisg
ICAgICAgIHJldHVybjsKKworICAgIFZlY3RvcjxQbHVnaW5QYWNrYWdlKj4gcGx1Z2lucyA9IGRh
dGFiYXNlLT5wbHVnaW5zKCk7CisKKyAgICBWZWN0b3I8UGx1Z2luUGFja2FnZSo+Ojpjb25zdF9p
dGVyYXRvciBlbmQgPSBwbHVnaW5zLmVuZCgpOworICAgIGZvciAoVmVjdG9yPFBsdWdpblBhY2th
Z2UqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBwbHVnaW5zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytp
dCkKKyAgICAgICAgKCppdCktPmNsZWFyU2l0ZURhdGEoU3RyaW5nKCkpOworfQorCit2b2lkIFdl
YlBhZ2U6Om9uSW5wdXRMb2NhbGVDaGFuZ2VkKGJvb2wgaXNSVEwpCit7CisgICAgZC0+b25JbnB1
dExvY2FsZUNoYW5nZWQoaXNSVEwpOworfQorCit2b2lkIFdlYlBhZ2U6Om9uTmV0d29ya0F2YWls
YWJpbGl0eUNoYW5nZWQoYm9vbCBhdmFpbGFibGUpCit7CisgICAgdXBkYXRlT25saW5lU3RhdHVz
KGF2YWlsYWJsZSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6b25DZXJ0aWZpY2F0ZVN0b3JlTG9jYXRp
b25TZXQoY29uc3QgV2ViU3RyaW5nJiBjYVBhdGgpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAg
IE1lZGlhUGxheWVyUHJpdmF0ZTo6c2V0Q2VydGlmaWNhdGVQYXRoKGNhUGF0aCk7CisjZW5kaWYK
K30KKwordm9pZCBXZWJQYWdlOjplbmFibGVXZWJJbnNwZWN0b3IoKQoreworICAgIGQtPm1fcGFn
ZS0+aW5zcGVjdG9yQ29udHJvbGxlcigpLT5jb25uZWN0RnJvbnRlbmQoKTsKKyAgICBkLT5tX3Bh
Z2UtPnNldHRpbmdzKCktPnNldERldmVsb3BlckV4dHJhc0VuYWJsZWQodHJ1ZSk7Cit9CisKK3Zv
aWQgV2ViUGFnZTo6ZGlzYWJsZVdlYkluc3BlY3RvcigpCit7CisgICAgZC0+bV9wYWdlLT5pbnNw
ZWN0b3JDb250cm9sbGVyKCktPmRpc2Nvbm5lY3RGcm9udGVuZCgpOworICAgIGQtPm1fcGFnZS0+
c2V0dGluZ3MoKS0+c2V0RGV2ZWxvcGVyRXh0cmFzRW5hYmxlZChmYWxzZSk7Cit9CisKK3ZvaWQg
V2ViUGFnZTo6ZW5hYmxlUGFzc3dvcmRFY2hvKCkKK3sKKyAgICBkLT5tX3BhZ2UtPnNldHRpbmdz
KCktPnNldFBhc3N3b3JkRWNob0VuYWJsZWQodHJ1ZSk7Cit9CisKK3ZvaWQgV2ViUGFnZTo6ZGlz
YWJsZVBhc3N3b3JkRWNobygpCit7CisgICAgZC0+bV9wYWdlLT5zZXR0aW5ncygpLT5zZXRQYXNz
d29yZEVjaG9FbmFibGVkKGZhbHNlKTsKK30KKwordm9pZCBXZWJQYWdlOjpkaXNwYXRjaEluc3Bl
Y3Rvck1lc3NhZ2UoY29uc3QgY2hhciogbWVzc2FnZSwgaW50IGxlbmd0aCkKK3sKKyAgICBTdHJp
bmcgc3RyaW5nTWVzc2FnZShtZXNzYWdlLCBsZW5ndGgpOworICAgIGQtPm1fcGFnZS0+aW5zcGVj
dG9yQ29udHJvbGxlcigpLT5kaXNwYXRjaE1lc3NhZ2VGcm9tRnJvbnRlbmQoc3RyaW5nTWVzc2Fn
ZSk7Cit9CisKK0ZyYW1lKiBXZWJQYWdlOjptYWluRnJhbWUoKSBjb25zdAoreworICAgIHJldHVy
biBkLT5tX21haW5GcmFtZTsKK30KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
K3ZvaWQgV2ViUGFnZVByaXZhdGU6OmRyYXdMYXllcnNPbkNvbW1pdCgpCit7CisgICAgaWYgKCFQ
bGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhy
ZWFkKCkpIHsKKyAgICAgICAgLy8gVGhpcyBtZXRob2Qgd2lsbCBvbmx5IGJlIGNhbGxlZCB3aGVu
IHRoZSBsYXllciBhcHBlYXJhbmNlIGNoYW5nZWQgZHVlIHRvCisgICAgICAgIC8vIGFuaW1hdGlv
bnMuIEFuZCBvbmx5IGlmIHdlIGRvbid0IG5lZWQgYSBvbmUgc2hvdCBkcmF3aW5nIHN5bmMuCisg
ICAgICAgIEFTU0VSVCghbmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpKTsKKwor
ICAgICAgICBpZiAoIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkgfHwgIW1fYmFja2luZ1N0b3JlLT5k
LT5pc0FjdGl2ZSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIG1fYmFja2luZ1N0
b3JlLT5kLT53aWxsRHJhd0xheWVyc09uQ29tbWl0KCk7CisKKyAgICAgICAgUGxhdGZvcm06OnVz
ZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoTWVzc2FnZSgKKyAgICAg
ICAgICAgIFBsYXRmb3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSgmV2ViUGFnZVByaXZhdGU6
OmRyYXdMYXllcnNPbkNvbW1pdCwgdGhpcykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgaWYgKG1fY2xpZW50LT53aW5kb3coKS0+d2luZG93VXNhZ2UoKSA9PSBQbGF0Zm9ybTo6R3Jh
cGhpY3M6OldpbmRvdzo6R0xFUzJVc2FnZSkgeworICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+
YmxpdFZpc2libGVDb250ZW50cygpOworICAgICAgICByZXR1cm47IC8vIGJsaXRWaXNpYmxlQ29u
dGVudHMoKSBpbmNsdWRlcyBkcmF3U3ViTGF5ZXJzKCkgaW4gdGhpcyBjYXNlLgorICAgIH0KKwor
ICAgIGlmICghZHJhd1N1YkxheWVycygpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBJZiB3
ZSB1c2UgdGhlIGNvbXBvc2l0aW5nIHN1cmZhY2UsIHdlIG5lZWQgdG8gcmUtYmxpdCB0aGUKKyAg
ICAvLyBiYWNraW5nc3RvcmUgYW5kIGJsZW5kIHRoZSBjb21wb3NpdGluZyBzdXJmYWNlIG9uIHRv
cCBvZiB0aGF0CisgICAgLy8gaW4gb3JkZXIgdG8gZ2V0IHRoZSBuZXdseSBkcmF3biBsYXllcnMg
b24gc2NyZWVuLgorICAgIGlmICghU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPmNv
bXBvc2l0aW5nU3VyZmFjZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBJZiB0aGVyZSBh
cmUgbm8gdmlzaWJsZSBsYXllcnMsIHJldHVybiBlYXJseS4KKyAgICBpZiAobGFzdENvbXBvc2l0
aW5nUmVzdWx0cygpLmlzRW1wdHkoKSAmJiBsYXN0Q29tcG9zaXRpbmdSZXN1bHRzKCkud2FzRW1w
dHkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX2JhY2tpbmdTdG9yZS0+ZC0+c2hvdWxk
RGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9iYWNr
aW5nU3RvcmUtPmQtPmJsaXRWaXNpYmxlQ29udGVudHMoKTsKK30KKworYm9vbCBXZWJQYWdlUHJp
dmF0ZTo6ZHJhd1N1YkxheWVycyhjb25zdCBJbnRSZWN0JiBkc3RSZWN0LCBjb25zdCBGbG9hdFJl
Y3QmIGNvbnRlbnRzKQoreworICAgIEFTU0VSVChQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVh
ZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpOworICAgIGlmICghUGxhdGZvcm06
OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobV9jb21wb3NpdG9yKSB7CisgICAgICAg
IG1fY29tcG9zaXRvci0+c2V0Q29tcG9zaXRpbmdPbnRvTWFpbldpbmRvdygKKyAgICAgICAgICAg
IG1fY2xpZW50LT53aW5kb3coKS0+d2luZG93VXNhZ2UoKSA9PSBQbGF0Zm9ybTo6R3JhcGhpY3M6
OldpbmRvdzo6R0xFUzJVc2FnZSk7CisgICAgICAgIHJldHVybiBtX2NvbXBvc2l0b3ItPmRyYXdM
YXllcnMoZHN0UmVjdCwgY29udGVudHMpOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30K
KworYm9vbCBXZWJQYWdlUHJpdmF0ZTo6ZHJhd1N1YkxheWVycygpCit7CisgICAgQVNTRVJUKFBs
YXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJl
YWQoKSk7CisgICAgaWYgKCFQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGll
bnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJl
dHVybiBtX2JhY2tpbmdTdG9yZS0+ZC0+ZHJhd1N1YkxheWVycygpOworfQorCit2b2lkIFdlYlBh
Z2VQcml2YXRlOjpzY2hlZHVsZVJvb3RMYXllckNvbW1pdCgpCit7CisgICAgaWYgKCFtX2ZyYW1l
TGF5ZXJzIHx8ICFtX2ZyYW1lTGF5ZXJzLT5oYXNMYXllcigpKQorICAgICAgICByZXR1cm47CisK
KyAgICBtX25lZWRzQ29tbWl0ID0gdHJ1ZTsKKyAgICBpZiAoIW1fcm9vdExheWVyQ29tbWl0VGlt
ZXItPmlzQWN0aXZlKCkpCisgICAgICAgIG1fcm9vdExheWVyQ29tbWl0VGltZXItPnN0YXJ0T25l
U2hvdCgwKTsKK30KKworc3RhdGljIGJvb2wgbmVlZHNMYXlvdXRSZWN1cnNpdmUoRnJhbWVWaWV3
KiB2aWV3KQoreworICAgIGlmICh2aWV3LT5uZWVkc0xheW91dCgpKQorICAgICAgICByZXR1cm4g
dHJ1ZTsKKworICAgIGJvb2wgc3ViZnJhbWVzTmVlZHNMYXlvdXQgPSBmYWxzZTsKKyAgICBjb25z
dCBIYXNoU2V0PFJlZlB0cjxXaWRnZXQ+ID4qIHZpZXdDaGlsZHJlbiA9IHZpZXctPmNoaWxkcmVu
KCk7CisgICAgSGFzaFNldDxSZWZQdHI8V2lkZ2V0PiA+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSB2
aWV3Q2hpbGRyZW4tPmVuZCgpOworICAgIGZvciAoSGFzaFNldDxSZWZQdHI8V2lkZ2V0PiA+Ojpj
b25zdF9pdGVyYXRvciBjdXJyZW50ID0gdmlld0NoaWxkcmVuLT5iZWdpbigpOyBjdXJyZW50ICE9
IGVuZCAmJiAhc3ViZnJhbWVzTmVlZHNMYXlvdXQ7ICsrY3VycmVudCkgeworICAgICAgICBXaWRn
ZXQqIHdpZGdldCA9ICgqY3VycmVudCkuZ2V0KCk7CisgICAgICAgIGlmICh3aWRnZXQtPmlzRnJh
bWVWaWV3KCkpCisgICAgICAgICAgICBzdWJmcmFtZXNOZWVkc0xheW91dCB8PSBuZWVkc0xheW91
dFJlY3Vyc2l2ZShzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPih3aWRnZXQpKTsKKyAgICB9CisKKyAg
ICByZXR1cm4gc3ViZnJhbWVzTmVlZHNMYXlvdXQ7Cit9CisKK0xheWVyUmVuZGVyaW5nUmVzdWx0
cyBXZWJQYWdlUHJpdmF0ZTo6bGFzdENvbXBvc2l0aW5nUmVzdWx0cygpIGNvbnN0Cit7CisgICAg
aWYgKG1fY29tcG9zaXRvcikKKyAgICAgICAgcmV0dXJuIG1fY29tcG9zaXRvci0+bGFzdENvbXBv
c2l0aW5nUmVzdWx0cygpOworICAgIHJldHVybiBMYXllclJlbmRlcmluZ1Jlc3VsdHMoKTsKK30K
Kwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6Y29tbWl0Um9vdExheWVyKGNvbnN0IEludFJlY3QmIGxh
eW91dFJlY3RGb3JDb21wb3NpdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBJbnRTaXplJiBjb250ZW50c1NpemVGb3JDb21wb3NpdGluZykKK3sKKyAgICBp
ZiAoIW1fZnJhbWVMYXllcnMgfHwgIW1fY29tcG9zaXRvcikKKyAgICAgICAgcmV0dXJuOworCisg
ICAgbV9jb21wb3NpdG9yLT5zZXRMYXlvdXRSZWN0Rm9yQ29tcG9zaXRpbmcobGF5b3V0UmVjdEZv
ckNvbXBvc2l0aW5nKTsKKyAgICBtX2NvbXBvc2l0b3ItPnNldENvbnRlbnRzU2l6ZUZvckNvbXBv
c2l0aW5nKGNvbnRlbnRzU2l6ZUZvckNvbXBvc2l0aW5nKTsKKyAgICBtX2NvbXBvc2l0b3ItPmNv
bW1pdChtX2ZyYW1lTGF5ZXJzLT5yb290TGF5ZXIoKSk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZh
dGU6OmNvbW1pdFJvb3RMYXllcklmTmVlZGVkKCkKK3sKKyAgICBpZiAobV9zdXNwZW5kUm9vdExh
eWVyQ29tbWl0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoIW1fbmVlZHNDb21t
aXQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghbV9mcmFtZUxheWVycyB8fCAh
bV9mcmFtZUxheWVycy0+aGFzTGF5ZXIoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
RnJhbWVWaWV3KiB2aWV3ID0gbV9tYWluRnJhbWUtPnZpZXcoKTsKKyAgICBpZiAoIXZpZXcpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIElmIHdlIHN5bmMgY29tcG9zaXRpbmcgbGF5
ZXJzIHdoZW4gYSBsYXlvdXQgaXMgcGVuZGluZywgd2UgbWF5IGNhdXNlIHBhaW50aW5nIG9mIGNv
bXBvc2l0aW5nCisgICAgLy8gbGF5ZXIgY29udGVudCB0byBvY2N1ciBiZWZvcmUgbGF5b3V0IGhh
cyBoYXBwZW5lZCwgd2hpY2ggd2lsbCBjYXVzZSBwYWludENvbnRlbnRzKCkgdG8gYmFpbC4KKyAg
ICBpZiAobmVlZHNMYXlvdXRSZWN1cnNpdmUodmlldykpIHsKKyAgICAgICAgLy8gSW4gY2FzZSBv
ZiBvbmUgc2hvdCBkcmF3aW5nIHN5bmNocm9uaXphdGlvbiwgeW91CisgICAgICAgIC8vIHNob3Vs
ZCBmaXJzdCBsYXlvdXRJZk5lZWRlZCwgcmVuZGVyLCB0aGVuIGNvbW1pdCBhbmQgZHJhdyB0aGUg
bGF5ZXJzLgorICAgICAgICBBU1NFUlQoIW5lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRp
b24oKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX25lZWRzQ29tbWl0
ID0gZmFsc2U7CisgICAgLy8gV2UgZ2V0IGhlcmUgZWl0aGVyIGR1ZSB0byB0aGUgY29tbWl0IHRp
bWVyLCB3aGljaCB3b3VsZCBoYXZlIGNhbGxlZAorICAgIC8vIHJlbmRlciBpZiBhIG9uZSBzaG90
IHN5bmMgd2FzIG5lZWRlZC4gT3Igd2UgZ2V0IGNhbGxlZCBmcm9tIHJlbmRlcgorICAgIC8vIGJl
Zm9yZSB0aGUgdGltZXIgdGltZXMgb3V0LCB3aGljaCBtZWFucyB3ZSBhcmUgZG9pbmcgYSBvbmUg
c2hvdCBhbnl3YXkuCisgICAgbV9uZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0aW9uID0g
ZmFsc2U7CisKKyAgICBpZiAobV9yb290TGF5ZXJDb21taXRUaW1lci0+aXNBY3RpdmUoKSkKKyAg
ICAgICAgbV9yb290TGF5ZXJDb21taXRUaW1lci0+c3RvcCgpOworCisgICAgbV9mcmFtZUxheWVy
cy0+Y29tbWl0T25XZWJLaXRUaHJlYWQoY3VycmVudFNjYWxlKCkpOworICAgIHVwZGF0ZURlbGVn
YXRlZE92ZXJsYXlzKCk7CisKKyAgICAvLyBTdGFzaCB0aGUgdmlzaWJsZSBjb250ZW50IHJlY3Qg
YWNjb3JkaW5nIHRvIHdlYmtpdCB0aHJlYWQKKyAgICAvLyBUaGlzIGlzIHRoZSByZWN0YW5nbGUg
dXNlZCB0byBsYXlvdXQgZml4ZWQgcG9zaXRpb25lZCBlbGVtZW50cywKKyAgICAvLyBhbmQgdGhh
dCdzIHdoYXQgdGhlIGxheWVyIHJlbmRlcmVyIHdhbnRzLgorICAgIEludFJlY3QgbGF5b3V0UmVj
dEZvckNvbXBvc2l0aW5nKHNjcm9sbFBvc2l0aW9uKCksIGFjdHVhbFZpc2libGVTaXplKCkpOwor
ICAgIEludFNpemUgY29udGVudHNTaXplRm9yQ29tcG9zaXRpbmcgPSBjb250ZW50c1NpemUoKTsK
KworICAgIC8vIENvbW1pdCBjaGFuZ2VzIG1hZGUgdG8gdGhlIGxheWVycyBzeW5jaHJvbm91c2x5
IHdpdGggdGhlIGNvbXBvc2l0aW5nIHRocmVhZC4KKyAgICBQbGF0Zm9ybTo6dXNlckludGVyZmFj
ZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+ZGlzcGF0Y2hTeW5jTWVzc2FnZSgKKyAgICAgICAgUGxh
dGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKAorICAgICAgICAgICAgJldlYlBhZ2VQcml2
YXRlOjpjb21taXRSb290TGF5ZXIsCisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgbGF5
b3V0UmVjdEZvckNvbXBvc2l0aW5nLAorICAgICAgICAgICAgY29udGVudHNTaXplRm9yQ29tcG9z
aXRpbmcpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpy
b290TGF5ZXJDb21taXRUaW1lckZpcmVkKFRpbWVyPFdlYlBhZ2VQcml2YXRlPiopCit7CisgICAg
aWYgKG1fc3VzcGVuZFJvb3RMYXllckNvbW1pdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8g
VGhlIGNvbW1pdCB0aW1lciBtYXkgaGF2ZSBmaXJlZCBqdXN0IGJlZm9yZSB0aGUgbGF5b3V0IHRp
bWVyLCBvciBmb3Igc29tZQorICAgIC8vIG90aGVyIHJlYXNvbiB3ZSBuZWVkIGxheW91dC4gSXQn
cyBub3QgYWxsb3dlZCB0byBjb21taXQgd2hlbiBhIGxheW91dCBpcworICAgIC8vIHBlbmRpbmcs
IGJlY2F1ZXMgYSBjb21taXQgY2FuIGNhdXNlIHBhcnRzIG9mIHRoZSB3ZWIgcGFnZSB0byBiZSBy
ZW5kZXJlZAorICAgIC8vIHRvIHRleHR1cmUuCisgICAgLy8gVGhlIGxheW91dCBjYW4gYWxzbyB0
dXJuIG9mIGNvbXBvc2l0aW5nIGFsdG9nZXRoZXIsIHNvIHdlIG5lZWQgdG8gYmUgcHJlcGFyZWQK
KyAgICAvLyB0byBoYW5kbGUgYSBvbmUgc2hvdCBkcmF3aW5nIHN5bmNocm9uaXphdGlvbiBhZnRl
ciB0aGUgbGF5b3V0LgorICAgIHJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpOworCisgICAgYm9vbCBp
c1NpbmdsZVRhcmdldFdpbmRvdyA9IFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT5j
b21wb3NpdGluZ1N1cmZhY2UoKQorICAgICAgICB8fCBtX2NsaWVudC0+d2luZG93KCktPndpbmRv
d1VzYWdlKCkgPT0gUGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3c6OkdMRVMyVXNhZ2U7CisKKyAg
ICAvLyBJZiB3ZSBhcmUgZG9pbmcgZGlyZWN0IHJlbmRlcmluZyBhbmQgaGF2ZSBhIHNpbmdsZSBy
ZW5kZXJpbmcgdGFyZ2V0LAorICAgIC8vIGNvbW1pdHRpbmcgaXMgZXF1aXZhbGVudCB0byBhIG9u
ZSBzaG90IGRyYXdpbmcgc3luY2hyb25pemF0aW9uLgorICAgIC8vIFdlIG5lZWQgdG8gcmUtcmVu
ZGVyIHRoZSB3ZWIgcGFnZSwgcmUtcmVuZGVyIHRoZSBsYXllcnMsIGFuZAorICAgIC8vIHRoZW4g
YmxpdCB0aGVtIG9uIHRvcCBvZiB0aGUgcmUtcmVuZGVyZWQgd2ViIHBhZ2UuCisgICAgaWYgKGlz
U2luZ2xlVGFyZ2V0V2luZG93ICYmIG1fYmFja2luZ1N0b3JlLT5kLT5zaG91bGREaXJlY3RSZW5k
ZXJpbmdUb1dpbmRvdygpKQorICAgICAgICBzZXROZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25p
emF0aW9uKCk7CisKKyAgICBpZiAobmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigp
KSB7CisgICAgICAgIGNvbnN0IEludFJlY3Qgd2luZG93UmVjdCA9IEludFJlY3QoSW50UG9pbnQ6
Onplcm8oKSwgdmlld3BvcnRTaXplKCkpOworICAgICAgICBtX2JhY2tpbmdTdG9yZS0+ZC0+cmVw
YWludCh3aW5kb3dSZWN0LCB0cnVlIC8qY29udGVudENoYW5nZWQqLywgdHJ1ZSAvKmltbWVkaWF0
ZSovKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElmIHRoZSB3ZWIgcGFnZSBu
ZWVkcyBsYXlvdXQsIHRoZSBjb21taXQgd2lsbCBmYWlsLgorICAgIC8vIE5vIG5lZWQgdG8gZHJh
dyB0aGUgbGF5ZXJzIGlmIG5vdGhpbmcgY2hhbmdlZC4KKyAgICBpZiAoY29tbWl0Um9vdExheWVy
SWZOZWVkZWQoKSkKKyAgICAgICAgZHJhd0xheWVyc09uQ29tbWl0KCk7Cit9CisKK3ZvaWQgV2Vi
UGFnZVByaXZhdGU6OnNldElzQWNjZWxlcmF0ZWRDb21wb3NpdGluZ0FjdGl2ZShib29sIGFjdGl2
ZSkKK3sKKyAgICAvLyBCYWNraW5nIHN0b3JlIGNhbiBiZSBudWxsIGhlcmUgYmVjYXVzZSBpdCBo
YXBwZW5zIGR1cmluZyB0ZWFyZG93bi4KKyAgICBpZiAobV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRp
bmdBY3RpdmUgPT0gYWN0aXZlIHx8ICFtX2JhY2tpbmdTdG9yZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmdBY3RpdmUgPSBhY3RpdmU7CisKKyAgICBp
ZiAoIWFjdGl2ZSkgeworICAgICAgICBtX2NvbXBvc2l0b3IuY2xlYXIoKTsKKyAgICAgICAgcmVz
ZXRDb21wb3NpdGluZ1N1cmZhY2UoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlm
ICghbV9jb21wb3NpdG9yKSB7CisgICAgICAgIG1fY29tcG9zaXRvciA9IGFkb3B0UHRyKG5ldyBX
ZWJQYWdlQ29tcG9zaXRvcih0aGlzKSk7CisgICAgICAgIG1faXNBY2NlbGVyYXRlZENvbXBvc2l0
aW5nQWN0aXZlID0gbV9jb21wb3NpdG9yLT5oYXJkd2FyZUNvbXBvc2l0aW5nKCk7CisgICAgICAg
IGlmICghbV9pc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmdBY3RpdmUpCisgICAgICAgICAgICBtX2Nv
bXBvc2l0b3IuY2xlYXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnJlc2V0
Q29tcG9zaXRpbmdTdXJmYWNlKCkKK3sKKyAgICBpZiAoIVBsYXRmb3JtOjp1c2VySW50ZXJmYWNl
VGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICBQbGF0
Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+ZGlzcGF0Y2hNZXNzYWdl
KAorICAgICAgICAgICAgUGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKAorICAgICAg
ICAgICAgICAgICZXZWJQYWdlUHJpdmF0ZTo6cmVzZXRDb21wb3NpdGluZ1N1cmZhY2UsIHRoaXMp
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtX2NvbXBvc2l0b3IpCisgICAg
ICAgIG1fY29tcG9zaXRvci0+c2V0TGFzdENvbXBvc2l0aW5nUmVzdWx0cyhMYXllclJlbmRlcmlu
Z1Jlc3VsdHMoKSk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldFJvb3RMYXllcldlYktp
dFRocmVhZChGcmFtZSogZnJhbWUsIExheWVyV2ViS2l0VGhyZWFkKiBsYXllcikKK3sKKyAgICAv
LyBUaGlzIG1ldGhvZCB1cGRhdGVzIHRoZSBGcmFtZUxheWVycyBiYXNlZCBvbiBpbnB1dCBmcm9t
IFdlYkNvcmUuCisgICAgLy8gRnJhbWVMYXllcnMga2VlcHMgdHJhY2sgb2YgdGhlIGxheWVyIHBy
b3hpZXMgYXR0YWNoZWQgdG8gZnJhbWVzLgorICAgIC8vIFdlIHdpbGwgaGF2ZSB0byBjb21wdXRl
IGEgbmV3IHJvb3QgbGF5ZXIgYW5kIHVwZGF0ZSB0aGUgY29tcG9zaXRvci4KKyAgICBpZiAoIWxh
eWVyICYmICFtX2ZyYW1lTGF5ZXJzKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWxheWVy
KSB7CisgICAgICAgICBBU1NFUlQobV9mcmFtZUxheWVycyk7CisgICAgICAgICBtX2ZyYW1lTGF5
ZXJzLT5yZW1vdmVMYXllckJ5RnJhbWUoZnJhbWUpOworICAgICAgICAgaWYgKCFtX2ZyYW1lTGF5
ZXJzLT5oYXNMYXllcigpKQorICAgICAgICAgICAgIG1fZnJhbWVMYXllcnMuY2xlYXIoKTsKKyAg
ICB9IGVsc2UgeworICAgICAgICBpZiAoIW1fZnJhbWVMYXllcnMpCisgICAgICAgICAgICBtX2Zy
YW1lTGF5ZXJzID0gYWRvcHRQdHIobmV3IEZyYW1lTGF5ZXJzKHRoaXMpKTsKKworICAgICAgICBp
ZiAoIW1fZnJhbWVMYXllcnMtPmNvbnRhaW5zTGF5ZXJGb3JGcmFtZShmcmFtZSkpCisgICAgICAg
ICAgICBtX2ZyYW1lTGF5ZXJzLT5hZGRMYXllcihmcmFtZSwgbGF5ZXIpOworCisgICAgICAgIEFT
U0VSVChtX2ZyYW1lTGF5ZXJzKTsKKyAgICB9CisKKyAgICBMYXllckNvbXBvc2l0aW5nVGhyZWFk
KiByb290TGF5ZXJDb21wb3NpdGluZ1RocmVhZCA9IDA7CisgICAgaWYgKG1fZnJhbWVMYXllcnMg
JiYgbV9mcmFtZUxheWVycy0+cm9vdExheWVyKCkpCisgICAgICAgIHJvb3RMYXllckNvbXBvc2l0
aW5nVGhyZWFkID0gbV9mcmFtZUxheWVycy0+cm9vdExheWVyKCktPmxheWVyQ29tcG9zaXRpbmdU
aHJlYWQoKTsKKworICAgIHNldFJvb3RMYXllckNvbXBvc2l0aW5nVGhyZWFkKHJvb3RMYXllckNv
bXBvc2l0aW5nVGhyZWFkKTsKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0Um9vdExheWVy
Q29tcG9zaXRpbmdUaHJlYWQoTGF5ZXJDb21wb3NpdGluZ1RocmVhZCogbGF5ZXIpCit7CisgICAg
aWYgKCFQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJy
ZW50VGhyZWFkKCkpIHsKKyAgICAgICAgUGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNz
YWdlQ2xpZW50KCktPmRpc3BhdGNoU3luY01lc3NhZ2UoCisgICAgICAgICAgICBQbGF0Zm9ybTo6
Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoJldlYlBhZ2VQcml2YXRlOjpzZXRSb290TGF5ZXJDb21w
b3NpdGluZ1RocmVhZCwgdGhpcywgbGF5ZXIpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwor
ICAgIC8vIERlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGhhdmUgYSByb290IGxheWVyIG9yIG5vdCwK
KyAgICAvLyB0aGlzIG1ldGhvZCB3aWxsIHR1cm4gb24gb3Igb2ZmIGFjY2VsZXJhdGVkIGNvbXBv
c2l0aW5nLgorICAgIGlmICghbGF5ZXIpIHsKKyAgICAgICAgIC8vIERvbid0IEFTU0VSVChtX2Nv
bXBvc2l0b3IpIGhlcmUgYmVjYXVzZSB3ZSBtYXkgYmUgY2FsbGVkIGluCisgICAgICAgICAvLyB0
aGUgcHJvY2VzcyBvZiBkZXN0cnVjdGlvbiBvZiBXZWJQYWdlIHdoZXJlIHdlIGhhdmUgYWxyZWFk
eQorICAgICAgICAgLy8gY2FsbGVkIHN5bmNEZXN0cm95Q29tcG9zaXRvck9uQ29tcG9zaXRpbmdU
aHJlYWQoKSB0byBkZXN0cm95CisgICAgICAgICAvLyB0aGUgY29tcG9zaXRvci4KKyAgICAgICAg
IHNldElzQWNjZWxlcmF0ZWRDb21wb3NpdGluZ0FjdGl2ZShmYWxzZSk7CisgICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgaWYgKCFtX2NvbXBvc2l0b3IpCisgICAgICAgIHNldElzQWNjZWxl
cmF0ZWRDb21wb3NpdGluZ0FjdGl2ZSh0cnVlKTsKKworICAgIC8vIERvbid0IEFTU0VSVChtX2Nv
bXBvc2l0b3IpIGhlcmUgYmVjYXVzZSBzZXRJc0FjY2VsZXJhdGVkQ29tcG9zaXRpbmdBY3RpdmUo
dHJ1ZSkKKyAgICAvLyBtYXkgbm90IHR1cm4gYWNjZWxlcmF0ZWQgY29tcG9zaXRpbmcgb24gc2lu
Y2UgbV9iYWNraW5nU3RvcmUgaXMgMC4KKyAgICBpZiAobV9jb21wb3NpdG9yKQorICAgICAgICBt
X2NvbXBvc2l0b3ItPnNldFJvb3RMYXllcihsYXllcik7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZh
dGU6OmRlc3Ryb3lDb21wb3NpdG9yKCkKK3sKKyAgICAgbV9jb21wb3NpdG9yLmNsZWFyKCk7Cit9
CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnN5bmNEZXN0cm95Q29tcG9zaXRvck9uQ29tcG9zaXRp
bmdUaHJlYWQoKQoreworICAgIGlmICghbV9jb21wb3NpdG9yKQorICAgICAgICByZXR1cm47CisK
KyAgICBQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+ZGlzcGF0
Y2hTeW5jTWVzc2FnZSgKKyAgICAgICAgUGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdl
KAorICAgICAgICAgICAgJldlYlBhZ2VQcml2YXRlOjpkZXN0cm95Q29tcG9zaXRvciwgdGhpcykp
OworfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpkZXN0cm95TGF5ZXJSZXNvdXJjZXMoKQorewor
ICAgICBtX2NvbXBvc2l0b3ItPnJlbGVhc2VMYXllclJlc291cmNlcygpOworfQorCit2b2lkIFdl
YlBhZ2VQcml2YXRlOjpzdXNwZW5kUm9vdExheWVyQ29tbWl0KCkKK3sKKyAgICBpZiAobV9zdXNw
ZW5kUm9vdExheWVyQ29tbWl0KQorICAgICAgICByZXR1cm47CisKKyAgICBtX3N1c3BlbmRSb290
TGF5ZXJDb21taXQgPSB0cnVlOworCisgICAgaWYgKCFtX2ZyYW1lTGF5ZXJzIHx8ICFtX2ZyYW1l
TGF5ZXJzLT5oYXNMYXllcigpIHx8ICFtX2NvbXBvc2l0b3IpCisgICAgICAgIHJldHVybjsKKwor
ICAgIFBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5kaXNwYXRj
aFN5bmNNZXNzYWdlKAorICAgICAgICBQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2Uo
JldlYlBhZ2VQcml2YXRlOjpkZXN0cm95TGF5ZXJSZXNvdXJjZXMsIHRoaXMpKTsKK30KKwordm9p
ZCBXZWJQYWdlUHJpdmF0ZTo6cmVzdW1lUm9vdExheWVyQ29tbWl0KCkKK3sKKyAgICBpZiAoIW1f
c3VzcGVuZFJvb3RMYXllckNvbW1pdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9zdXNwZW5k
Um9vdExheWVyQ29tbWl0ID0gZmFsc2U7CisgICAgbV9uZWVkc0NvbW1pdCA9IHRydWU7CisKKyAg
ICAvLyBSZWNyZWF0ZSBsYXllciByZXNvdXJjZXMgaWYgbmVlZGVkLgorICAgIGNvbW1pdFJvb3RM
YXllcklmTmVlZGVkKCk7Cit9CisKK2Jvb2wgV2ViUGFnZVByaXZhdGU6Om5lZWRzT25lU2hvdERy
YXdpbmdTeW5jaHJvbml6YXRpb24oKQoreworICAgIHJldHVybiBtX25lZWRzT25lU2hvdERyYXdp
bmdTeW5jaHJvbml6YXRpb247Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldE5lZWRzT25l
U2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb24oKQoreworICAgIC8vIFRoaXMgbWVhbnMgd2UgaGF2
ZSB0byBjb21taXQgbGF5ZXJzIG9uIG5leHQgcmVuZGVyLCBvciByZW5kZXIgb24gdGhlIG5leHQg
Y29tbWl0LAorICAgIC8vIHdoaWNoZXZlciBoYXBwZW5zIGZpcnN0LgorICAgIG1fbmVlZHNDb21t
aXQgPSB0cnVlOworICAgIG1fbmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbiA9IHRy
dWU7Cit9CisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCit2b2lkIFdl
YlBhZ2VQcml2YXRlOjplbnRlckZ1bGxzY3JlZW5Gb3JOb2RlKE5vZGUqIG5vZGUpCit7CisjaWYg
RU5BQkxFKFZJREVPKQorICAgIGlmICghbm9kZSB8fCAhbm9kZS0+aGFzVGFnTmFtZShIVE1MTmFt
ZXM6OnZpZGVvVGFnKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgTWVkaWFQbGF5ZXIqIHBsYXll
ciA9IHN0YXRpY19jYXN0PEhUTUxNZWRpYUVsZW1lbnQqPihub2RlKS0+cGxheWVyKCk7CisgICAg
aWYgKCFwbGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIE1lZGlhUGxheWVyUHJpdmF0ZSog
bW1yUGxheWVyID0gc3RhdGljX2Nhc3Q8TWVkaWFQbGF5ZXJQcml2YXRlKj4ocGxheWVyLT5pbXBs
ZW1lbnRhdGlvbigpKTsKKyAgICBpZiAoIW1tclBsYXllcikKKyAgICAgICAgcmV0dXJuOworCisg
ICAgUGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3cqIHdpbmRvdyA9IG1tclBsYXllci0+d2luZG93
R2V0KCk7CisgICAgaWYgKCF3aW5kb3cpCisgICAgICAgIHJldHVybjsKKworICAgIHVuc2lnbmVk
IHgsIHksIHdpZHRoLCBoZWlnaHQ7CisgICAgbW1yUGxheWVyLT53aW5kb3dQb3NpdGlvbkdldCh4
LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIGNvbnN0IGNoYXIqIGNvbnRleHROYW1lID0gbW1y
UGxheWVyLT5tbXJDb250ZXh0TmFtZUdldCgpOworICAgIGlmICghY29udGV4dE5hbWUpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1tclBsYXllci0+c2V0RnVsbHNjcmVlbldlYlBhZ2VDbGllbnQo
bV9jbGllbnQpOworICAgIG1fZnVsbHNjcmVlblZpZGVvTm9kZSA9IG5vZGU7CisgICAgbV9jbGll
bnQtPmZ1bGxzY3JlZW5TdGFydChjb250ZXh0TmFtZSwgd2luZG93LCB4LCB5LCB3aWR0aCwgaGVp
Z2h0KTsKKyNlbmRpZgorfQorCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpleGl0RnVsbHNjcmVlbkZv
ck5vZGUoTm9kZSogbm9kZSkKK3sKKyNpZiBFTkFCTEUoVklERU8pCisgICAgaWYgKG1fZnVsbHNj
cmVlblZpZGVvTm9kZS5nZXQoKSkgeworICAgICAgICBtX2NsaWVudC0+ZnVsbHNjcmVlblN0b3Ao
KTsKKyAgICAgICAgbV9mdWxsc2NyZWVuVmlkZW9Ob2RlID0gMDsKKyAgICB9CisKKyAgICBpZiAo
IW5vZGUgfHwgIW5vZGUtPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjp2aWRlb1RhZykpCisgICAgICAg
IHJldHVybjsKKworICAgIE1lZGlhUGxheWVyKiBwbGF5ZXIgPSBzdGF0aWNfY2FzdDxIVE1MTWVk
aWFFbGVtZW50Kj4obm9kZSktPnBsYXllcigpOworICAgIGlmICghcGxheWVyKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBNZWRpYVBsYXllclByaXZhdGUqIG1tclBsYXllciA9IHN0YXRpY19jYXN0
PE1lZGlhUGxheWVyUHJpdmF0ZSo+KHBsYXllci0+aW1wbGVtZW50YXRpb24oKSk7CisgICAgaWYg
KCFtbXJQbGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZ1bGxzY3JlZW4gbW9kZSBp
cyBiZWluZyB0dXJuZWQgb2ZmLCBzbyBNZWRpYVBsYXllclByaXZhdGUgbm8gbG9uZ2VyIG5lZWRz
IHRoZSBwb2ludGVyLgorICAgIG1tclBsYXllci0+c2V0RnVsbHNjcmVlbldlYlBhZ2VDbGllbnQo
MCk7CisjZW5kaWYKK30KKwordm9pZCBXZWJQYWdlUHJpdmF0ZTo6ZGlkQ2hhbmdlU2V0dGluZ3Mo
V2ViU2V0dGluZ3MqIHdlYlNldHRpbmdzKQoreworICAgIFNldHRpbmdzKiBjb3JlU2V0dGluZ3Mg
PSBtX3BhZ2UtPnNldHRpbmdzKCk7CisgICAgbV9wYWdlLT5zZXRHcm91cE5hbWUod2ViU2V0dGlu
Z3MtPnBhZ2VHcm91cE5hbWUoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXRYU1NBdWRpdG9yRW5h
YmxlZCh3ZWJTZXR0aW5ncy0+eHNzQXVkaXRvckVuYWJsZWQoKSk7CisgICAgY29yZVNldHRpbmdz
LT5zZXRMb2Fkc0ltYWdlc0F1dG9tYXRpY2FsbHkod2ViU2V0dGluZ3MtPmxvYWRzSW1hZ2VzQXV0
b21hdGljYWxseSgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldFNob3VsZERyYXdCb3JkZXJXaGls
ZUxvYWRpbmdJbWFnZXMod2ViU2V0dGluZ3MtPnNob3VsZERyYXdCb3JkZXJXaGlsZUxvYWRpbmdJ
bWFnZXMoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXRTY3JpcHRFbmFibGVkKHdlYlNldHRpbmdz
LT5pc0phdmFTY3JpcHRFbmFibGVkKCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0UHJpdmF0ZUJy
b3dzaW5nRW5hYmxlZCh3ZWJTZXR0aW5ncy0+aXNQcml2YXRlQnJvd3NpbmdFbmFibGVkKCkpOwor
ICAgIGNvcmVTZXR0aW5ncy0+c2V0RGVmYXVsdEZpeGVkRm9udFNpemUod2ViU2V0dGluZ3MtPmRl
ZmF1bHRGaXhlZEZvbnRTaXplKCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0RGVmYXVsdEZvbnRT
aXplKHdlYlNldHRpbmdzLT5kZWZhdWx0Rm9udFNpemUoKSk7CisgICAgY29yZVNldHRpbmdzLT5z
ZXRNaW5pbXVtRm9udFNpemUod2ViU2V0dGluZ3MtPm1pbmltdW1Gb250U2l6ZSgpKTsKKyAgICBj
b3JlU2V0dGluZ3MtPnNldFNlcmlmRm9udEZhbWlseSh3ZWJTZXR0aW5ncy0+c2VyaWZGb250RmFt
aWx5KCkuaW1wbCgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldEZpeGVkRm9udEZhbWlseSh3ZWJT
ZXR0aW5ncy0+Zml4ZWRGb250RmFtaWx5KCkuaW1wbCgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNl
dFNhbnNTZXJpZkZvbnRGYW1pbHkod2ViU2V0dGluZ3MtPnNhbnNTZXJpZkZvbnRGYW1pbHkoKS5p
bXBsKCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0U3RhbmRhcmRGb250RmFtaWx5KHdlYlNldHRp
bmdzLT5zdGFuZGFyZEZvbnRGYW1pbHkoKS5pbXBsKCkpOworICAgIGNvcmVTZXR0aW5ncy0+c2V0
SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSh3ZWJTZXR0aW5ncy0+Y2FuSmF2
YVNjcmlwdE9wZW5XaW5kb3dzQXV0b21hdGljYWxseSgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNl
dEFsbG93U2NyaXB0c1RvQ2xvc2VXaW5kb3dzKHdlYlNldHRpbmdzLT5jYW5KYXZhU2NyaXB0T3Bl
bldpbmRvd3NBdXRvbWF0aWNhbGx5KCkpOyAvLyBXaHkgYXJlIHdlIHVzaW5nIHRoZSBzYW1lIHZh
bHVlIGFzIHNldEphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9tYXRpY2FsbHkoKT8KKyAgICBj
b3JlU2V0dGluZ3MtPnNldFBsdWdpbnNFbmFibGVkKHdlYlNldHRpbmdzLT5hcmVQbHVnaW5zRW5h
YmxlZCgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldERlZmF1bHRUZXh0RW5jb2RpbmdOYW1lKHdl
YlNldHRpbmdzLT5kZWZhdWx0VGV4dEVuY29kaW5nTmFtZSgpLmltcGwoKSk7CisgICAgY29yZVNl
dHRpbmdzLT5zZXREb3dubG9hZGFibGVCaW5hcnlGb250c0VuYWJsZWQod2ViU2V0dGluZ3MtPmRv
d25sb2FkYWJsZUJpbmFyeUZvbnRzRW5hYmxlZCgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldFNw
YXRpYWxOYXZpZ2F0aW9uRW5hYmxlZChtX3dlYlNldHRpbmdzLT5pc1NwYXRpYWxOYXZpZ2F0aW9u
RW5hYmxlZCgpKTsKKworICAgIC8vIFVzZXJTY2FsYWJsZSBzaG91bGQgYmUgcmVzZXQgYnkgbmV3
IHNldHRpbmdzLgorICAgIHNldFVzZXJTY2FsYWJsZSh3ZWJTZXR0aW5ncy0+aXNVc2VyU2NhbGFi
bGUoKSk7CisKKyAgICBXZWJTdHJpbmcgc3R5bGVzaGVldFVSTCA9IHdlYlNldHRpbmdzLT51c2Vy
U3R5bGVTaGVldFN0cmluZygpOworICAgIGlmIChzdHlsZXNoZWV0VVJMLmlzRW1wdHkoKSkKKyAg
ICAgICAgc3R5bGVzaGVldFVSTCA9IHdlYlNldHRpbmdzLT51c2VyU3R5bGVTaGVldExvY2F0aW9u
KCk7CisgICAgaWYgKCFzdHlsZXNoZWV0VVJMLmlzRW1wdHkoKSkKKyAgICAgICAgY29yZVNldHRp
bmdzLT5zZXRVc2VyU3R5bGVTaGVldExvY2F0aW9uKEtVUkwoS1VSTCgpLCBzdHlsZXNoZWV0VVJM
KSk7CisKKyAgICBjb3JlU2V0dGluZ3MtPnNldEZpcnN0U2NoZWR1bGVkTGF5b3V0RGVsYXkod2Vi
U2V0dGluZ3MtPmZpcnN0U2NoZWR1bGVkTGF5b3V0RGVsYXkoKSk7CisgICAgY29yZVNldHRpbmdz
LT5zZXRVc2VDYWNoZSh3ZWJTZXR0aW5ncy0+dXNlV2ViS2l0Q2FjaGUoKSk7CisKKyNpZiBFTkFC
TEUoU1FMX0RBVEFCQVNFKQorICAgIC8vIERhdGFiYXNlVHJhY2tlciBjYW4gb25seSBiZSBpbml0
aWFsaXplZCBmb3Igb25jZSwgc28gaXQgZG9lc24ndAorICAgIC8vIG1ha2Ugc2Vuc2UgdG8gY2hh
bmdlIGRhdGFiYXNlIHBhdGggYWZ0ZXIgRGF0YWJhc2VUcmFja2VyIGhhcworICAgIC8vIGFscmVh
ZHkgYmVlbiBpbml0aWFsaXplZC4KKyAgICBzdGF0aWMgYm9vbCBkYmluaXQgPSBmYWxzZTsKKyAg
ICBpZiAoIWRiaW5pdCAmJiAhd2ViU2V0dGluZ3MtPmRhdGFiYXNlUGF0aCgpLmlzRW1wdHkoKSkg
eworICAgICAgICBkYmluaXQgPSB0cnVlOworICAgICAgICBEYXRhYmFzZVRyYWNrZXI6OmluaXRp
YWxpemVUcmFja2VyKHdlYlNldHRpbmdzLT5kYXRhYmFzZVBhdGgoKSk7CisgICAgfQorCisgICAg
Ly8gVGhlIGRpcmVjdG9yeSBvZiBjYWNoZVN0b3JhZ2UgZm9yIG9uZSBwYWdlIGdyb3VwIGNhbiBv
bmx5IGJlIGluaXRpYWxpemVkIG9uY2UuCisgICAgc3RhdGljIGJvb2wgYWNpbml0ID0gZmFsc2U7
CisgICAgaWYgKCFhY2luaXQgJiYgIXdlYlNldHRpbmdzLT5hcHBDYWNoZVBhdGgoKS5pc0VtcHR5
KCkpIHsKKyAgICAgICAgYWNpbml0ID0gdHJ1ZTsKKyAgICAgICAgY2FjaGVTdG9yYWdlKCkuc2V0
Q2FjaGVEaXJlY3Rvcnkod2ViU2V0dGluZ3MtPmFwcENhY2hlUGF0aCgpKTsKKyAgICB9CisKKyAg
ICBjb3JlU2V0dGluZ3MtPnNldExvY2FsU3RvcmFnZURhdGFiYXNlUGF0aCh3ZWJTZXR0aW5ncy0+
bG9jYWxTdG9yYWdlUGF0aCgpKTsKKyAgICBEYXRhYmFzZTo6c2V0SXNBdmFpbGFibGUod2ViU2V0
dGluZ3MtPmlzRGF0YWJhc2VzRW5hYmxlZCgpKTsKKyAgICBEYXRhYmFzZVN5bmM6OnNldElzQXZh
aWxhYmxlKHdlYlNldHRpbmdzLT5pc0RhdGFiYXNlc0VuYWJsZWQoKSk7CisKKyAgICBjb3JlU2V0
dGluZ3MtPnNldExvY2FsU3RvcmFnZUVuYWJsZWQod2ViU2V0dGluZ3MtPmlzTG9jYWxTdG9yYWdl
RW5hYmxlZCgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldE9mZmxpbmVXZWJBcHBsaWNhdGlvbkNh
Y2hlRW5hYmxlZCh3ZWJTZXR0aW5ncy0+aXNBcHBDYWNoZUVuYWJsZWQoKSk7CisKKyAgICBtX3Bh
Z2UtPmdyb3VwKCkuZ3JvdXBTZXR0aW5ncygpLT5zZXRMb2NhbFN0b3JhZ2VRdW90YUJ5dGVzKHdl
YlNldHRpbmdzLT5sb2NhbFN0b3JhZ2VRdW90YSgpKTsKKyAgICBjb3JlU2V0dGluZ3MtPnNldFVz
ZXNQYWdlQ2FjaGUod2ViU2V0dGluZ3MtPm1heGltdW1QYWdlc0luQ2FjaGUoKSk7CisgICAgY29y
ZVNldHRpbmdzLT5zZXRGcmFtZUZsYXR0ZW5pbmdFbmFibGVkKHdlYlNldHRpbmdzLT5pc0ZyYW1l
RmxhdHRlbmluZ0VuYWJsZWQoKSk7CisjZW5kaWYKKworI2lmIEVOQUJMRShXRUJfU09DS0VUUykK
KyAgICBXZWJTb2NrZXQ6OnNldElzQXZhaWxhYmxlKHdlYlNldHRpbmdzLT5hcmVXZWJTb2NrZXRz
RW5hYmxlZCgpKTsKKyNlbmRpZgorCisjaWYgRU5BQkxFKFZJRVdQT1JUX1JFRkxPVykKKyAgICBj
b3JlU2V0dGluZ3MtPnNldFRleHRSZWZsb3dFbmFibGVkKHdlYlNldHRpbmdzLT50ZXh0UmVmbG93
TW9kZSgpID09IFdlYlNldHRpbmdzOjpUZXh0UmVmbG93RW5hYmxlZCk7CisjZW5kaWYKKworICAg
IC8vIEZJWE1FOiBXZSBkb24ndCB3YW50IEhUTUxUb2tlbml6ZXIgdG8geWllbGQgZm9yIGFueXRo
aW5nIG90aGVyIHRoYW4gZW1haWwgY2FzZSBiZWNhdXNlCisgICAgLy8gY2FsbCB0byBjdXJyZW50
VGltZSgpIGlzIHRvbyBleHBlbnNpdmUgb24gb3VyIHBsYXRmb3JtLiBTZWUgUklNIEJ1ZyAjNzQ2
LgorICAgIGNvcmVTZXR0aW5ncy0+c2V0U2hvdWxkVXNlRmlyc3RTY2hlZHVsZWRMYXlvdXREZWxh
eSh3ZWJTZXR0aW5ncy0+aXNFbWFpbE1vZGUoKSk7CisgICAgY29yZVNldHRpbmdzLT5zZXRQcm9j
ZXNzSFRUUEVxdWl2KCF3ZWJTZXR0aW5ncy0+aXNFbWFpbE1vZGUoKSk7CisKKyAgICBjb3JlU2V0
dGluZ3MtPnNldFNob3VsZFVzZUNyb3NzT3JpZ2luUHJvdG9jb2xDaGVjayghd2ViU2V0dGluZ3Mt
PmFsbG93Q3Jvc3NTaXRlUmVxdWVzdHMoKSk7CisKKyAgICBjb29raWVNYW5hZ2VyKCkuc2V0UHJp
dmF0ZU1vZGUod2ViU2V0dGluZ3MtPmlzUHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCgpKTsKKworICAg
IGlmIChtX21haW5GcmFtZSAmJiBtX21haW5GcmFtZS0+dmlldygpKSB7CisgICAgICAgIENvbG9y
IGJhY2tncm91bmRDb2xvcih3ZWJTZXR0aW5ncy0+YmFja2dyb3VuZENvbG9yKCkpOworICAgICAg
ICBtX21haW5GcmFtZS0+dmlldygpLT51cGRhdGVCYWNrZ3JvdW5kUmVjdXJzaXZlbHkoYmFja2dy
b3VuZENvbG9yLCBiYWNrZ3JvdW5kQ29sb3IuaGFzQWxwaGEoKSk7CisgICAgfQorfQorCitJbnRT
aXplIFdlYlBhZ2VQcml2YXRlOjpkZWZhdWx0TWF4TGF5b3V0U2l6ZSgpCit7CisgICAgc3RhdGlj
IEludFNpemUgc2l6ZTsKKyAgICBpZiAoc2l6ZS5pc0VtcHR5KCkpCisgICAgICAgIHNpemUgPSBJ
bnRTaXplKHN0ZDo6bWF4KDEwMjQsIFBsYXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjpsYW5kc2Nh
cGVXaWR0aCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoNzY4LCBQbGF0Zm9y
bTo6R3JhcGhpY3M6OlNjcmVlbjo6bGFuZHNjYXBlSGVpZ2h0KCkpKTsKKworICAgIHJldHVybiBz
aXplOworfQorCitXZWJTdHJpbmcgV2ViUGFnZTo6dGV4dEhhc0F0dHJpYnV0ZShjb25zdCBXZWJT
dHJpbmcmIHF1ZXJ5KSBjb25zdAoreworICAgIGlmIChEb2N1bWVudCogZG9jID0gZC0+bV9wYWdl
LT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCktPmRvY3VtZW50KCkpCisg
ICAgICAgIHJldHVybiBkb2MtPnF1ZXJ5Q29tbWFuZFZhbHVlKHF1ZXJ5KTsKKworICAgIHJldHVy
biAiIjsKK30KKwordm9pZCBXZWJQYWdlOjpzZXRKYXZhU2NyaXB0Q2FuQWNjZXNzQ2xpcGJvYXJk
KGJvb2wgZW5hYmxlZCkKK3sKKyAgICBkLT5tX3BhZ2UtPnNldHRpbmdzKCktPnNldEphdmFTY3Jp
cHRDYW5BY2Nlc3NDbGlwYm9hcmQoZW5hYmxlZCk7Cit9CisKKyNpZiBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCit2b2lkIFdlYlBhZ2VQcml2YXRlOjpibGl0VmlzaWJsZUNvbnRlbnRzKCkK
K3sKKyAgICBpZiAobV9iYWNraW5nU3RvcmUtPmQtPnNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2lu
ZG93KCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fYmFja2luZ1N0b3JlLT5kLT5ibGl0Vmlz
aWJsZUNvbnRlbnRzKCk7Cit9CisjZW5kaWYKKwordm9pZCBXZWJQYWdlOjpzZXRXZWJHTEVuYWJs
ZWQoYm9vbCBlbmFibGVkKQoreworICAgIGlmICghUGxhdGZvcm06OklUUG9saWN5Ojppc1dlYkdM
RW5hYmxlZCgpKSB7CisgICAgICAgIGQtPm1fcGFnZS0+c2V0dGluZ3MoKS0+c2V0V2ViR0xFbmFi
bGVkKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkLT5tX3BhZ2UtPnNldHRp
bmdzKCktPnNldFdlYkdMRW5hYmxlZChlbmFibGVkKTsKK30KKworYm9vbCBXZWJQYWdlOjppc1dl
YkdMRW5hYmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fcGFnZS0+c2V0dGluZ3MoKS0+
d2ViR0xFbmFibGVkKCk7Cit9CisKK3ZvaWQgV2ViUGFnZVByaXZhdGU6OnNldE5lZWRUb3VjaEV2
ZW50cyhib29sIHZhbHVlKQoreworICAgIG1fbmVlZFRvdWNoRXZlbnRzID0gdmFsdWU7Cit9CisK
K30KK30KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvV2ViUGFnZS5o
IGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9XZWJQYWdlLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNDg5
ZjQ1MzZjNjNiMmRmNjg1NWFhMjc4MTFlYTJkZjg1OTNiZDJiMwotLS0gL2Rldi9udWxsCisrKyBi
L1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvV2ViUGFnZS5oCkBAIC0wLDAgKzEsMzU0IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIElu
IE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2Vu
ZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwg
d3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICov
CisKKyNpZm5kZWYgV2ViUGFnZV9oCisjZGVmaW5lIFdlYlBhZ2VfaAorCisjaW5jbHVkZSAiQWN0
aXZlTm9kZUNvbnRleHQuaCIKKyNpbmNsdWRlICJCbGFja0JlcnJ5R2xvYmFsLmgiCisjaW5jbHVk
ZSA8QmxhY2tCZXJyeVBsYXRmb3JtR3VhcmRlZFBvaW50ZXIuaD4KKyNpbmNsdWRlIDxCbGFja0Jl
cnJ5UGxhdGZvcm1JbnB1dEV2ZW50cy5oPgorI2luY2x1ZGUgPGltZi9pbnB1dF9kYXRhLmg+Cisj
aW5jbHVkZSA8bmV0d29yay9OZXR3b3JrUmVxdWVzdC5oPgorCitzdHJ1Y3QgT3BhcXVlSlNDb250
ZXh0OwordHlwZWRlZiBjb25zdCBzdHJ1Y3QgT3BhcXVlSlNDb250ZXh0KiBKU0NvbnRleHRSZWY7
CisKK3N0cnVjdCBPcGFxdWVKU1ZhbHVlOwordHlwZWRlZiBjb25zdCBzdHJ1Y3QgT3BhcXVlSlNW
YWx1ZSogSlNWYWx1ZVJlZjsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgQ2hyb21lQ2xp
ZW50QmxhY2tCZXJyeTsKK2NsYXNzIEVkaXRvckNsaWVudEJsYWNrQmVycnk7CitjbGFzcyBFbGVt
ZW50OworY2xhc3MgRnJhbWU7CitjbGFzcyBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk7Citj
bGFzcyBHZW9sb2NhdGlvbkNvbnRyb2xsZXJDbGllbnRCbGFja0JlcnJ5OworY2xhc3MgSWNvbkRh
dGFiYXNlQ2xpZW50QmxhY2tCZXJyeTsKK2NsYXNzIEluc3BlY3RvckNsaWVudEJsYWNrQmVycnk7
CitjbGFzcyBKYXZhU2NyaXB0RGVidWdnZXJCbGFja0JlcnJ5OworY2xhc3MgTm9kZTsKK2NsYXNz
IFJlbmRlck9iamVjdDsKK2NsYXNzIFZpc2libGVTZWxlY3Rpb247Cit9CisKK2NsYXNzIFdlYkRP
TURvY3VtZW50OworY2xhc3MgV2ViRE9NTm9kZTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNz
IFNoYXJlZEFycmF5OworCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2UgUGxhdGZv
cm0geworY2xhc3MgSW50UG9pbnQ7CitjbGFzcyBJbnRSZWN0OworY2xhc3MgSW50U2l6ZTsKK2Ns
YXNzIEtleWJvYXJkRXZlbnQ7CitjbGFzcyBNb3VzZUV2ZW50OworY2xhc3MgVG91Y2hFdmVudDsK
K2NsYXNzIFRvdWNoUG9pbnQ7Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBCYWNr
aW5nU3RvcmU7CitjbGFzcyBCYWNraW5nU3RvcmVDbGllbnQ7CitjbGFzcyBCYWNraW5nU3RvcmVQ
cml2YXRlOworY2xhc3MgRHVtcFJlbmRlclRyZWVDbGllbnQ7CitjbGFzcyBSZW5kZXJRdWV1ZTsK
K2NsYXNzIFdlYlBhZ2VDbGllbnQ7CitjbGFzcyBXZWJQYWdlR3JvdXBMb2FkRGVmZXJyZXI7Citj
bGFzcyBXZWJQYWdlUHJpdmF0ZTsKK2NsYXNzIFdlYlNldHRpbmdzOworCitlbnVtIEphdmFTY3Jp
cHREYXRhVHlwZSB7IEpTVW5kZWZpbmVkID0gMCwgSlNOdWxsLCBKU0Jvb2xlYW4sIEpTTnVtYmVy
LCBKU1N0cmluZywgSlNPYmplY3QsIEpTRXhjZXB0aW9uLCBKU0RhdGFUeXBlTWF4IH07CisKK2Vu
dW0gQWN0aXZhdGlvblN0YXRlVHlwZSB7IEFjdGl2YXRpb25BY3RpdmUsIEFjdGl2YXRpb25JbmFj
dGl2ZSwgQWN0aXZhdGlvblN0YW5kYnkgfTsKKworZW51bSBUYXJnZXREZXRlY3Rpb25TdHJhdGVn
eSB7UG9pbnRCYXNlZCwgUmVjdEJhc2VkfTsKKworY2xhc3MgQkxBQ0tCRVJSWV9FWFBPUlQgV2Vi
UGFnZSA6IHB1YmxpYyBQbGF0Zm9ybTo6R3VhcmRlZFBvaW50ZXJCYXNlIHsKK3B1YmxpYzoKKyAg
ICBXZWJQYWdlKFdlYlBhZ2VDbGllbnQqLCBjb25zdCBXZWJTdHJpbmcmIHBhZ2VHcm91cE5hbWUs
IGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0Jik7CisgICAgdm9pZCBkZXN0cm95KCk7CisKKyAgICBX
ZWJQYWdlQ2xpZW50KiBjbGllbnQoKSBjb25zdDsKKworICAgIHZvaWQgbG9hZChjb25zdCBjaGFy
KiB1cmwsIGNvbnN0IGNoYXIqIG5ldHdvcmtUb2tlbiwgYm9vbCBpc0luaXRpYWwgPSBmYWxzZSk7
CisKKyAgICB2b2lkIGxvYWRFeHRlbmRlZChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIqIG5l
dHdvcmtUb2tlbiwgY29uc3QgY2hhciogbWV0aG9kLCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6
OkNhY2hlUG9saWN5ID0gUGxhdGZvcm06Ok5ldHdvcmtSZXF1ZXN0OjpVc2VQcm90b2NvbENhY2hl
UG9saWN5LCBjb25zdCBjaGFyKiBkYXRhID0gMCwgc2l6ZV90IGRhdGFMZW5ndGggPSAwLCBjb25z
dCBjaGFyKiBjb25zdCogaGVhZGVycyA9IDAsIHNpemVfdCBoZWFkZXJzTGVuZ3RoID0gMCwgYm9v
bCBtdXN0SGFuZGxlSW50ZXJuYWxseSA9IGZhbHNlKTsKKworICAgIHZvaWQgbG9hZEZpbGUoY29u
c3QgY2hhciogcGF0aCwgY29uc3QgY2hhciogb3ZlcnJpZGVDb250ZW50VHlwZSA9ICIiKTsKKwor
ICAgIHZvaWQgbG9hZFN0cmluZyhjb25zdCBjaGFyKiBzdHJpbmcsIGNvbnN0IGNoYXIqIGJhc2VV
UkwsIGNvbnN0IGNoYXIqIGNvbnRlbnRUeXBlID0gInRleHQvaHRtbCIsIGNvbnN0IGNoYXIqIGZh
aWxpbmdVUkwgPSAwKTsKKworICAgIHZvaWQgZG93bmxvYWQoY29uc3QgUGxhdGZvcm06Ok5ldHdv
cmtSZXF1ZXN0Jik7CisKKyAgICBib29sIGV4ZWN1dGVKYXZhU2NyaXB0KGNvbnN0IGNoYXIqIHNj
cmlwdCwgSmF2YVNjcmlwdERhdGFUeXBlJiByZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZh
bHVlKTsKKworICAgIC8vIFRoaXMgd2lsbCBleGVjdXRlIHRoZSBzY3JpcHQgZXZlbiBpZiBpbi1w
YWdlIEphdmFTY3JpcHQgaXMgZGlzYWJsZWQuCisgICAgYm9vbCBleGVjdXRlSmF2YVNjcmlwdElu
SXNvbGF0ZWRXb3JsZChjb25zdCBjaGFyKiBzY3JpcHQsIEphdmFTY3JpcHREYXRhVHlwZSYgcmV0
dXJuVHlwZSwgV2ViU3RyaW5nJiByZXR1cm5WYWx1ZSk7CisKKyAgICAvLyBUYWtlcyBhIFVURjE2
IGVuY29kZWQgc2NyaXB0IHRoYXQgaXMgdXNlZCBleHBsaWNpdGx5IGJ5IHRoZSBwYXR0ZXJuIG1h
dGNoaW5nIGNvZGUKKyAgICBib29sIGV4ZWN1dGVKYXZhU2NyaXB0SW5Jc29sYXRlZFdvcmxkKGNv
bnN0IHN0ZDo6d3N0cmluZyYgc2NyaXB0LCBKYXZhU2NyaXB0RGF0YVR5cGUmIHJldHVyblR5cGUs
IFdlYlN0cmluZyYgcmV0dXJuVmFsdWUpOworCisgICAgdm9pZCBpbml0aWFsaXplSWNvbkRhdGFC
YXNlKCk7CisKKyAgICB2b2lkIHN0b3BMb2FkaW5nKCk7CisKKyAgICAvLyBUaGlzIHdpbGwgZm9y
Y2UgYW55IHVubG9hZCBoYW5kbGVycyB0byBydW4uCisgICAgdm9pZCBwcmVwYXJlVG9EZXN0cm95
KCk7CisKKyAgICB2b2lkIHJlbG9hZCgpOworICAgIHZvaWQgcmVsb2FkRnJvbUNhY2hlKCk7CisK
KyAgICBXZWJTZXR0aW5ncyogc2V0dGluZ3MoKSBjb25zdDsKKworICAgIHZvaWQgc2V0VmlzaWJs
ZShib29sKTsKKyAgICBib29sIGlzVmlzaWJsZSgpIGNvbnN0OworCisgICAgdm9pZCBzZXRTY3Jl
ZW5PcmllbnRhdGlvbihpbnQpOworICAgIHZvaWQgYXBwbHlQZW5kaW5nT3JpZW50YXRpb25JZk5l
ZWRlZCgpOworCisgICAgUGxhdGZvcm06OkludFNpemUgdmlld3BvcnRTaXplKCkgY29uc3Q7Cisg
ICAgdm9pZCBzZXRWaWV3cG9ydFNpemUoY29uc3QgUGxhdGZvcm06OkludFNpemUmIHZpZXdwb3J0
U2l6ZSwgYm9vbCBlbnN1cmVGb2N1c0VsZW1lbnRWaXNpYmxlID0gdHJ1ZSk7CisKKyAgICB2b2lk
IHJlc2V0VmlydHVhbFZpZXdwb3J0T25Db21taXR0ZWQoYm9vbCByZXNldCk7CisgICAgdm9pZCBz
ZXRWaXJ0dWFsVmlld3BvcnRTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyAgICAvLyBV
c2VkIGZvciBkZWZhdWx0IGxheW91dCBzaXplIHVubGVzcyBvdmVycmlkZGVuIGJ5IHdlYiBjb250
ZW50IG9yIGJ5IG90aGVyIEFQSXMuCisgICAgdm9pZCBzZXREZWZhdWx0TGF5b3V0U2l6ZShpbnQg
d2lkdGgsIGludCBoZWlnaHQpOworCisgICAgYm9vbCBtb3VzZUV2ZW50KGNvbnN0IFBsYXRmb3Jt
OjpNb3VzZUV2ZW50JiwgYm9vbCogd2hlZWxEZWx0YUFjY2VwdGVkID0gMCk7CisKKyAgICAvLyBI
YW5kbGVzIG5hdGl2ZSBqYXZhc2NyaXB0IHRvdWNoIGV2ZW50cy4KKyAgICBib29sIHRvdWNoRXZl
bnQoY29uc3QgUGxhdGZvcm06OlRvdWNoRXZlbnQmKTsKKworICAgIC8vIEZvciBjb252ZXJzaW9u
IHRvIG1vdXNlIGV2ZW50cy4KKyAgICB2b2lkIHRvdWNoRXZlbnRDYW5jZWwoKTsKKyAgICB2b2lk
IHRvdWNoRXZlbnRDYW5jZWxBbmRDbGVhckZvY3VzZWROb2RlKCk7CisgICAgYm9vbCB0b3VjaFBv
aW50QXNNb3VzZUV2ZW50KGNvbnN0IFBsYXRmb3JtOjpUb3VjaFBvaW50Jik7CisKKyAgICAvLyBS
ZXR1cm5zIHRydWUgaWYgdGhlIGtleSBzdHJva2Ugd2FzIGhhbmRsZWQgYnkgV2ViS2l0LgorICAg
IGJvb2wga2V5RXZlbnQoY29uc3QgUGxhdGZvcm06OktleWJvYXJkRXZlbnQmKTsKKworICAgIFdl
YlN0cmluZyB0aXRsZSgpIGNvbnN0OworICAgIFdlYlN0cmluZyBzZWxlY3RlZFRleHQoKSBjb25z
dDsKKyAgICBXZWJTdHJpbmcgY3V0U2VsZWN0ZWRUZXh0KCk7CisgICAgdm9pZCBpbnNlcnRUZXh0
KGNvbnN0IFdlYlN0cmluZyYpOworICAgIHZvaWQgY2xlYXJDdXJyZW50SW5wdXRGaWVsZCgpOwor
CisgICAgdm9pZCBjdXQoKTsKKyAgICB2b2lkIGNvcHkoKTsKKyAgICB2b2lkIHBhc3RlKCk7CisK
KyAgICAvLyBUZXh0IGVuY29kaW5nLgorICAgIFdlYlN0cmluZyB0ZXh0RW5jb2RpbmcoKTsKKyAg
ICBXZWJTdHJpbmcgZm9yY2VkVGV4dEVuY29kaW5nKCk7CisgICAgdm9pZCBzZXRGb3JjZWRUZXh0
RW5jb2RpbmcoY29uc3QgY2hhciopOworCisgICAgLy8gU2Nyb2xsIHBvc2l0aW9uIHJldHVybmVk
IGlzIGluIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgorICAgIFBsYXRmb3JtOjpJbnRQb2ludCBz
Y3JvbGxQb3NpdGlvbigpIGNvbnN0OworICAgIC8vIFNjcm9sbCBwb3NpdGlvbiBwcm92aWRlZCBz
aG91bGQgYmUgaW4gdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMuCisgICAgdm9pZCBzZXRTY3JvbGxQ
b3NpdGlvbihjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmKTsKKyAgICBib29sIHNjcm9sbEJ5KGNv
bnN0IFBsYXRmb3JtOjpJbnRTaXplJiwgYm9vbCBzY3JvbGxNYWluRnJhbWUgPSB0cnVlKTsKKyAg
ICB2b2lkIG5vdGlmeUluUmVnaW9uU2Nyb2xsU3RhdHVzQ2hhbmdlZChib29sIHN0YXR1cyk7Cisg
ICAgdm9pZCBzZXRTY3JvbGxPcmlnaW5Qb2ludChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmKTsK
KworICAgIEJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlKCkgY29uc3Q7CisKKyAgICBib29sIHpv
b21Ub0ZpdCgpOworICAgIGJvb2wgem9vbVRvT25lT25lKCk7CisgICAgdm9pZCB6b29tVG9Jbml0
aWFsU2NhbGUoKTsKKyAgICBib29sIGJsb2NrWm9vbShpbnQgeCwgaW50IHkpOworICAgIHZvaWQg
YmxvY2tab29tQW5pbWF0aW9uRmluaXNoZWQoKTsKKyAgICBib29sIGlzQXRJbml0aWFsWm9vbSgp
IGNvbnN0OworICAgIGJvb2wgaXNNYXhab29tZWQoKSBjb25zdDsKKyAgICBib29sIGlzTWluWm9v
bWVkKCkgY29uc3Q7CisgICAgYm9vbCBwaW5jaFpvb21BYm91dFBvaW50KGRvdWJsZSBzY2FsZSwg
aW50IHgsIGludCB5KTsKKworICAgIGJvb2wgaXNVc2VyU2NhbGFibGUoKSBjb25zdDsKKyAgICBk
b3VibGUgY3VycmVudFNjYWxlKCkgY29uc3Q7CisgICAgZG91YmxlIGluaXRpYWxTY2FsZSgpIGNv
bnN0OworICAgIGRvdWJsZSB6b29tVG9GaXRTY2FsZSgpIGNvbnN0OworICAgIHZvaWQgc2V0SW5p
dGlhbFNjYWxlKGRvdWJsZSk7CisgICAgZG91YmxlIG1pbmltdW1TY2FsZSgpIGNvbnN0OworICAg
IHZvaWQgc2V0TWluaW11bVNjYWxlKGRvdWJsZSk7CisgICAgZG91YmxlIG1heGltdW1TY2FsZSgp
IGNvbnN0OworICAgIHZvaWQgc2V0TWF4aW11bVNjYWxlKGRvdWJsZSk7CisKKyAgICB2b2lkIGFz
c2lnbkZvY3VzKFBsYXRmb3JtOjpGb2N1c0RpcmVjdGlvbik7CisKKyAgICBQbGF0Zm9ybTo6SW50
UmVjdCBmb2N1c05vZGVSZWN0KCk7CisKKyAgICB2b2lkIHNldEZvY3VzZWQoYm9vbCk7CisKKyAg
ICB2b2lkIGNsZWFyQnJvd3NpbmdEYXRhKCk7CisgICAgdm9pZCBjbGVhckhpc3RvcnkoKTsKKyAg
ICB2b2lkIGNsZWFyQ29va2llcygpOworICAgIHZvaWQgY2xlYXJDYWNoZSgpOworICAgIHZvaWQg
Y2xlYXJMb2NhbFN0b3JhZ2UoKTsKKworICAgIHZvaWQgcnVuTGF5b3V0VGVzdHMoKTsKKworICAg
ICAvLyBGaW5kcyBhbmQgc2VsZWN0cyB0aGUgbmV4dCB1dGY4IHN0cmluZyB0aGF0IGlzIGEgY2Fz
ZSBzZW5zaXRpdmUKKyAgICAgLy8gbWF0Y2ggaW4gdGhlIHdlYiBwYWdlLiBJdCB3aWxsIHdyYXAg
dGhlIHdlYiBwYWdlIGlmIGl0IHJlYWNoZXMKKyAgICAgLy8gdGhlIGVuZC4gQW4gZW1wdHkgc3Ry
aW5nIHdpbGwgcmVzdWx0IGluIG5vIG1hdGNoIGFuZCBubyBzZWxlY3Rpb24uCisgICAgIC8vIFJl
dHVybnMgdHJ1ZSBpZiB0aGUgc3RyaW5nIG1hdGNoZWQgYW5kIGZhbHNlIGlmIG5vdC4KKyAgICBi
b29sIGZpbmROZXh0U3RyaW5nKGNvbnN0IGNoYXIqLCBib29sIGZvcndhcmQgPSB0cnVlKTsKKwor
ICAgIC8vIEphdmFTY3JpcHREZWJ1Z2dlciBpbnRlcmZhY2UuCisgICAgYm9vbCBlbmFibGVTY3Jp
cHREZWJ1Z2dlcigpOworICAgIGJvb2wgZGlzYWJsZVNjcmlwdERlYnVnZ2VyKCk7CisKKyAgICBK
U0NvbnRleHRSZWYgc2NyaXB0Q29udGV4dCgpIGNvbnN0OworICAgIEpTVmFsdWVSZWYgd2luZG93
T2JqZWN0KCkgY29uc3Q7CisKKyAgICB2b2lkIGFkZEJyZWFrcG9pbnQoY29uc3QgdW5zaWduZWQg
c2hvcnQqIHVybCwgdW5zaWduZWQgdXJsTGVuZ3RoLCBpbnQgbGluZU51bWJlciwgY29uc3QgdW5z
aWduZWQgc2hvcnQqIGNvbmRpdGlvbiwgdW5zaWduZWQgY29uZGl0aW9uTGVuZ3RoKTsKKyAgICB2
b2lkIHVwZGF0ZUJyZWFrcG9pbnQoY29uc3QgdW5zaWduZWQgc2hvcnQqIHVybCwgdW5zaWduZWQg
dXJsTGVuZ3RoLCBpbnQgbGluZU51bWJlciwgY29uc3QgdW5zaWduZWQgc2hvcnQqIGNvbmRpdGlv
biwgdW5zaWduZWQgY29uZGl0aW9uTGVuZ3RoKTsKKyAgICB2b2lkIHJlbW92ZUJyZWFrcG9pbnQo
Y29uc3QgdW5zaWduZWQgc2hvcnQqIHVybCwgdW5zaWduZWQgdXJsTGVuZ3RoLCBpbnQgbGluZU51
bWJlcik7CisKKyAgICBib29sIHBhdXNlT25FeGNlcHRpb25zKCk7CisgICAgdm9pZCBzZXRQYXVz
ZU9uRXhjZXB0aW9ucyhib29sKTsKKworICAgIHZvaWQgcGF1c2VJbkRlYnVnZ2VyKCk7CisgICAg
dm9pZCByZXN1bWVEZWJ1Z2dlcigpOworCisgICAgdm9pZCBzdGVwT3ZlclN0YXRlbWVudEluRGVi
dWdnZXIoKTsKKyAgICB2b2lkIHN0ZXBJbnRvU3RhdGVtZW50SW5EZWJ1Z2dlcigpOworICAgIHZv
aWQgc3RlcE91dE9mRnVuY3Rpb25JbkRlYnVnZ2VyKCk7CisKKyAgICB1bnNpZ25lZCB0aW1lb3V0
Rm9ySmF2YVNjcmlwdEV4ZWN1dGlvbigpIGNvbnN0OworICAgIHZvaWQgc2V0VGltZW91dEZvckph
dmFTY3JpcHRFeGVjdXRpb24odW5zaWduZWQgbXMpOworCisgICAgdm9pZCBzZXRDYXJldEhpZ2hs
aWdodFN0eWxlKFBsYXRmb3JtOjpDYXJldEhpZ2hsaWdodFN0eWxlKTsKKworICAgIC8vIElNRiBm
dW5jdGlvbnMuCisgICAgYm9vbCBzZXRCYXRjaEVkaXRpbmdBY3RpdmUoYm9vbCk7CisgICAgYm9v
bCBzZXRJbnB1dFNlbGVjdGlvbih1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKTsKKyAgICBp
bnQgaW5wdXRDYXJldFBvc2l0aW9uKCkgY29uc3Q7CisgICAgYm9vbCBkZWxldGVUZXh0UmVsYXRp
dmVUb0N1cnNvcih1bnNpZ25lZCBsZWZ0T2Zmc2V0LCB1bnNpZ25lZCByaWdodE9mZnNldCk7Cisg
ICAgc3Bhbm5hYmxlX3N0cmluZ190KiBzZWxlY3RlZFRleHQoaW50MzJfdCBmbGFncyk7CisgICAg
c3Bhbm5hYmxlX3N0cmluZ190KiB0ZXh0QmVmb3JlQ3Vyc29yKGludDMyX3QgbGVuZ3RoLCBpbnQz
Ml90IGZsYWdzKTsKKyAgICBzcGFubmFibGVfc3RyaW5nX3QqIHRleHRBZnRlckN1cnNvcihpbnQz
Ml90IGxlbmd0aCwgaW50MzJfdCBmbGFncyk7CisgICAgZXh0cmFjdGVkX3RleHRfdCogZXh0cmFj
dGVkVGV4dFJlcXVlc3QoZXh0cmFjdGVkX3RleHRfcmVxdWVzdF90KiwgaW50MzJfdCBmbGFncyk7
CisgICAgaW50MzJfdCBzZXRDb21wb3NpbmdSZWdpb24oaW50MzJfdCBzdGFydCwgaW50MzJfdCBl
bmQpOworICAgIGludDMyX3QgZmluaXNoQ29tcG9zaXRpb24oKTsKKyAgICBpbnQzMl90IHNldENv
bXBvc2luZ1RleHQoc3Bhbm5hYmxlX3N0cmluZ190KiwgaW50MzJfdCByZWxhdGl2ZUN1cnNvclBv
c2l0aW9uKTsKKyAgICBpbnQzMl90IGNvbW1pdFRleHQoc3Bhbm5hYmxlX3N0cmluZ190KiwgaW50
MzJfdCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uKTsKKworICAgIHZvaWQgc3BlbGxDaGVja2luZ0Vu
YWJsZWQoYm9vbCk7CisKKyAgICB2b2lkIHNldFNlbGVjdGlvbihjb25zdCBQbGF0Zm9ybTo6SW50
UG9pbnQmIHN0YXJ0UG9pbnQsIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgZW5kUG9pbnQpOwor
ICAgIHZvaWQgc2V0Q2FyZXRQb3NpdGlvbihjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmKTsKKyAg
ICB2b2lkIHNlbGVjdEF0UG9pbnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50Jik7CisgICAgdm9p
ZCBzZWxlY3Rpb25DYW5jZWxsZWQoKTsKKyAgICBib29sIHNlbGVjdGlvbkNvbnRhaW5zKGNvbnN0
IFBsYXRmb3JtOjpJbnRQb2ludCYpOworCisgICAgdm9pZCBwb3B1cExpc3RDbG9zZWQoaW50IHNp
emUsIGJvb2wqIHNlbGVjdGVkcyk7CisgICAgdm9pZCBwb3B1cExpc3RDbG9zZWQoaW50IGluZGV4
KTsKKyAgICB2b2lkIHNldERhdGVUaW1lSW5wdXQoY29uc3QgV2ViU3RyaW5nJiB2YWx1ZSk7Cisg
ICAgdm9pZCBzZXRDb2xvcklucHV0KGNvbnN0IFdlYlN0cmluZyYgdmFsdWUpOworCisgICAgdm9p
ZCBvbklucHV0TG9jYWxlQ2hhbmdlZChib29sIGlzUlRMKTsKKyAgICBzdGF0aWMgdm9pZCBvbk5l
dHdvcmtBdmFpbGFiaWxpdHlDaGFuZ2VkKGJvb2wgYXZhaWxhYmxlKTsKKyAgICBzdGF0aWMgdm9p
ZCBvbkNlcnRpZmljYXRlU3RvcmVMb2NhdGlvblNldChjb25zdCBXZWJTdHJpbmcmIGNhUGF0aCk7
CisKKyAgICBXZWJTdHJpbmcgdGV4dEhhc0F0dHJpYnV0ZShjb25zdCBXZWJTdHJpbmcmIHF1ZXJ5
KSBjb25zdDsKKworICAgIEFjdGl2ZU5vZGVDb250ZXh0IGFjdGl2ZU5vZGVDb250ZXh0KFRhcmdl
dERldGVjdGlvblN0cmF0ZWd5KSBjb25zdDsKKworICAgIHR5cGVkZWYgaW50cHRyX3QgQmFja0Zv
cndhcmRJZDsKKyAgICBzdHJ1Y3QgQmFja0ZvcndhcmRFbnRyeSB7CisgICAgICAgIFdlYlN0cmlu
ZyB1cmw7CisgICAgICAgIFdlYlN0cmluZyBvcmlnaW5hbFVybDsKKyAgICAgICAgV2ViU3RyaW5n
IHRpdGxlOworICAgICAgICBXZWJTdHJpbmcgbmV0d29ya1Rva2VuOworICAgICAgICBCYWNrRm9y
d2FyZElkIGlkOworICAgICAgICBib29sIGxhc3RWaXNpdFdhc0hUVFBOb25HZXQ7CisgICAgfTsK
KworICAgIGJvb2wgY2FuR29CYWNrT3JGb3J3YXJkKGludCBkZWx0YSkgY29uc3Q7CisgICAgLy8g
UmV0dXJucyBmYWxzZSBpZiB0aGVyZSBpcyBubyBwYWdlIGZvciB0aGUgZ2l2ZW4gZGVsdGEgKGVn
LgorICAgIC8vIGF0dGVtcHQgdG8gZ28gYmFjayB3aXRoIC0xIHdoZW4gb24gdGhlIGZpcnN0IHBh
Z2UpLgorICAgIGJvb2wgZ29CYWNrT3JGb3J3YXJkKGludCBkZWx0YSk7CisgICAgdm9pZCBnb1Rv
QmFja0ZvcndhcmRFbnRyeShCYWNrRm9yd2FyZElkKTsKKworICAgIGludCBiYWNrRm9yd2FyZExp
c3RMZW5ndGgoKSBjb25zdDsKKyAgICB2b2lkIGdldEJhY2tGb3J3YXJkTGlzdChTaGFyZWRBcnJh
eTxCYWNrRm9yd2FyZEVudHJ5PiYgcmVzdWx0LCB1bnNpZ25lZCYgcmVzdWx0TGVuZ3RoKSBjb25z
dDsKKyAgICB2b2lkIHJlbGVhc2VCYWNrRm9yd2FyZEVudHJ5KEJhY2tGb3J3YXJkSWQpIGNvbnN0
OworICAgIHZvaWQgY2xlYXJCYWNrRm9yd2FyZExpc3QoYm9vbCBrZWVwQ3VycmVudFBhZ2UpIGNv
bnN0OworCisgICAgdm9pZCBhZGRWaXNpdGVkTGluayhjb25zdCB1bnNpZ25lZCBzaG9ydCogdXJs
LCB1bnNpZ25lZCBsZW5ndGgpOworCisjaWYgZGVmaW5lZChFTkFCTEVfV0VCRE9NKSAmJiBFTkFC
TEVfV0VCRE9NCisgICAgV2ViRE9NRG9jdW1lbnQgZG9jdW1lbnQoKSBjb25zdDsKKyAgICBXZWJE
T01Ob2RlIG5vZGVBdFBvaW50KGludCB4LCBpbnQgeSk7CisgICAgYm9vbCBnZXROb2RlUmVjdChj
b25zdCBXZWJET01Ob2RlJiwgUGxhdGZvcm06OkludFJlY3QmIHJlc3VsdCk7CisgICAgYm9vbCBz
ZXROb2RlRm9jdXMoY29uc3QgV2ViRE9NTm9kZSYsIGJvb2wgb24pOworICAgIGJvb2wgc2V0Tm9k
ZUhvdmVyZWQoY29uc3QgV2ViRE9NTm9kZSYsIGJvb2wgb24pOworICAgIGJvb2wgbm9kZUhhc0hv
dmVyKGNvbnN0IFdlYkRPTU5vZGUmKTsKKyNlbmRpZgorCisgICAgYm9vbCBkZWZlcnNMb2FkaW5n
KCkgY29uc3Q7CisKKyAgICBib29sIHdpbGxGaXJlVGltZXIoKTsKKworICAgIGJvb2wgaXNFbmFi
bGVMb2NhbEFjY2Vzc1RvQWxsQ29va2llcygpIGNvbnN0OworICAgIHZvaWQgc2V0RW5hYmxlTG9j
YWxBY2Nlc3NUb0FsbENvb2tpZXMoYm9vbCk7CisKKyAgICB2b2lkIGVuYWJsZVdlYkluc3BlY3Rv
cigpOworICAgIHZvaWQgZGlzYWJsZVdlYkluc3BlY3RvcigpOworICAgIHZvaWQgZW5hYmxlUGFz
c3dvcmRFY2hvKCk7CisgICAgdm9pZCBkaXNhYmxlUGFzc3dvcmRFY2hvKCk7CisgICAgdm9pZCBk
aXNwYXRjaEluc3BlY3Rvck1lc3NhZ2UoY29uc3QgY2hhciogbWVzc2FnZSwgaW50IGxlbmd0aCk7
CisgICAgV2ViQ29yZTo6RnJhbWUqIG1haW5GcmFtZSgpIGNvbnN0OworCisgICAgLy8gRklYTUU6
IE5lZWRzIEFQSSByZXZpZXcgb24gdGhpcyBoZWFkZXIuIFNlZSBQUiAjMTIwNDAyLgorICAgIHZv
aWQgbm90aWZ5UGFnZVBhdXNlKCk7CisgICAgdm9pZCBub3RpZnlQYWdlUmVzdW1lKCk7CisgICAg
dm9pZCBub3RpZnlQYWdlQmFja2dyb3VuZCgpOworICAgIHZvaWQgbm90aWZ5UGFnZUZvcmVncm91
bmQoKTsKKyAgICB2b2lkIG5vdGlmeVBhZ2VGdWxsU2NyZWVuQWxsb3dlZCgpOworICAgIHZvaWQg
bm90aWZ5UGFnZUZ1bGxTY3JlZW5FeGl0KCk7CisgICAgdm9pZCBub3RpZnlEZXZpY2VJZGxlU3Rh
dGVDaGFuZ2UoYm9vbCBlbnRlcklkbGUpOworICAgIHZvaWQgbm90aWZ5QXBwQWN0aXZhdGlvblN0
YXRlQ2hhbmdlKEFjdGl2YXRpb25TdGF0ZVR5cGUpOworICAgIHZvaWQgbm90aWZ5U3dpcGVFdmVu
dCgpOworICAgIHZvaWQgbm90aWZ5U2NyZWVuUG93ZXJTdGF0ZUNoYW5nZWQoYm9vbCBwb3dlcmVk
KTsKKyAgICB2b2lkIG5vdGlmeUZ1bGxTY3JlZW5WaWRlb0V4aXRlZChib29sIGRvbmUpOworICAg
IHZvaWQgY2xlYXJQbHVnaW5TaXRlRGF0YSgpOworICAgIHZvaWQgc2V0SmF2YVNjcmlwdENhbkFj
Y2Vzc0NsaXBib2FyZChib29sKTsKKyAgICBib29sIGlzV2ViR0xFbmFibGVkKCkgY29uc3Q7Cisg
ICAgdm9pZCBzZXRXZWJHTEVuYWJsZWQoYm9vbCk7CisKKyAgICB2b2lkIGRlc3Ryb3lXZWJQYWdl
Q29tcG9zaXRvcigpOworCitwcml2YXRlOgorICAgIH5XZWJQYWdlKCk7CisKKyAgICBmcmllbmQg
Y2xhc3MgV2ViS2l0OjpCYWNraW5nU3RvcmU7CisgICAgZnJpZW5kIGNsYXNzIFdlYktpdDo6QmFj
a2luZ1N0b3JlQ2xpZW50OworICAgIGZyaWVuZCBjbGFzcyBXZWJLaXQ6OkJhY2tpbmdTdG9yZVBy
aXZhdGU7CisgICAgZnJpZW5kIGNsYXNzIFdlYktpdDo6UmVuZGVyUXVldWU7CisgICAgZnJpZW5k
IGNsYXNzIFdlYktpdDo6V2ViUGFnZUdyb3VwTG9hZERlZmVycmVyOworICAgIGZyaWVuZCBjbGFz
cyBXZWJDb3JlOjpDaHJvbWVDbGllbnRCbGFja0JlcnJ5OworICAgIGZyaWVuZCBjbGFzcyBXZWJD
b3JlOjpGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk7CisgICAgV2ViUGFnZVByaXZhdGUqIGQ7
Cit9OworfQorfQorCisjZW5kaWYgLy8gV2ViUGFnZV9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L2JsYWNrYmVycnkvQXBpL1dlYlBhZ2VfcC5oIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5
L0FwaS9XZWJQYWdlX3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lMDIzOGI2ZDY5MzI2ZmM1ZmU4ODVkODA3YmUy
NzE3ZjA5OGZhNTYyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5
L0FwaS9XZWJQYWdlX3AuaApAQCAtMCwwICsxLDUxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAwOSwgMjAxMCwgMjAxMSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNl
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3
YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIFdlYlBhZ2VfcF9o
CisjZGVmaW5lIFdlYlBhZ2VfcF9oCisKKyNpbmNsdWRlICJDaHJvbWVDbGllbnQuaCIKKyNpZiBV
U0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisjaW5jbHVkZSAiTGF5ZXJSZW5kZXJlci5oIgor
I2VuZGlmCisjaW5jbHVkZSAiUGFnZUNsaWVudEJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJQbGF0
Zm9ybU1vdXNlRXZlbnQuaCIKKyNpbmNsdWRlICJTY3JpcHRTb3VyY2VDb2RlLmgiCisjaW5jbHVk
ZSAiVGltZXIuaCIKKyNpbmNsdWRlICJWaWV3cG9ydEFyZ3VtZW50cy5oIgorI2luY2x1ZGUgIldl
YlBhZ2UuaCIKKyNpbmNsdWRlICJXZWJTZXR0aW5ncy5oIgorCisjaW5jbHVkZSA8QmxhY2tCZXJy
eVBsYXRmb3JtTWVzc2FnZS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBET01XcmFw
cGVyV29ybGQ7CitjbGFzcyBEb2N1bWVudDsKK2NsYXNzIEZyYW1lOworY2xhc3MgRnJhbWVWaWV3
OworY2xhc3MgR2VvbG9jYXRpb25Db250cm9sbGVyQ2xpZW50QmxhY2tCZXJyeTsKK2NsYXNzIEph
dmFTY3JpcHREZWJ1Z2dlckJsYWNrQmVycnk7CitjbGFzcyBLVVJMOworY2xhc3MgTm9kZTsKK2Ns
YXNzIFBhZ2U7CitjbGFzcyBQbHVnaW5WaWV3OworY2xhc3MgUmVuZGVyTGF5ZXI7CitjbGFzcyBS
ZW5kZXJPYmplY3Q7CitjbGFzcyBTY3JvbGxWaWV3OworY2xhc3MgVHJhbnNmb3JtYXRpb25NYXRy
aXg7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUaW1lcjsKK30KKworbmFtZXNwYWNlIEJs
YWNrQmVycnkgeworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIEJhY2tpbmdTdG9yZTsKK2Ns
YXNzIEJhY2tpbmdTdG9yZUNsaWVudDsKK2NsYXNzIEJhY2tpbmdTdG9yZVRpbGU7CitjbGFzcyBE
dW1wUmVuZGVyVHJlZUNsaWVudDsKK2NsYXNzIEluUGFnZVNlYXJjaE1hbmFnZXI7CitjbGFzcyBJ
bnB1dEhhbmRsZXI7CitjbGFzcyBJblJlZ2lvblNjcm9sbGFibGVBcmVhOworY2xhc3MgU2VsZWN0
aW9uSGFuZGxlcjsKK2NsYXNzIFRvdWNoRXZlbnRIYW5kbGVyOworY2xhc3MgV2ViUGFnZUNsaWVu
dDsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKK2NsYXNzIEZyYW1lTGF5ZXJz
OworY2xhc3MgV2ViUGFnZUNvbXBvc2l0b3I7CisjZW5kaWYKKworLy8gSW4gdGhlIGNsaWVudCBj
b2RlLCB0aGVyZSBpcyBzY3JlZW4gc2l6ZSBhbmQgdmlld3BvcnQuCisvLyBJbiBXZWJQYWdlUHJp
dmF0ZSwgdGhlIHNjcmVlbiBzaXplIGlzIGNhbGxlZCB0aGUgdHJhbnNmb3JtZWRWaWV3cG9ydFNp
emUsCisvLyB0aGUgdmlld3BvcnQgcG9zaXRpb24gaXMgY2FsbGVkIHRoZSB0cmFuc2Zvcm1lZFNj
cm9sbFBvc2l0aW9uLAorLy8gYW5kIHRoZSB2aWV3cG9ydCBzaXplIGlzIGNhbGxlZCB0aGUgdHJh
bnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZS4KK2NsYXNzIFdlYlBhZ2VQcml2YXRlIDogcHVibGlj
IFBhZ2VDbGllbnRCbGFja0JlcnJ5LCBwdWJsaWMgV2ViU2V0dGluZ3NEZWxlZ2F0ZSwgcHVibGlj
IFBsYXRmb3JtOjpHdWFyZGVkUG9pbnRlckJhc2UgeworcHVibGljOgorICAgIGVudW0gVmlld01v
ZGUgeyBNb2JpbGUsIERlc2t0b3AsIEZpeGVkRGVza3RvcCB9OworICAgIGVudW0gTG9hZFN0YXRl
IHsgTm9uZSAvKiBvbiBpbnN0YW50aWF0aW9uIG9mIHBhZ2UgKi8sIFByb3Zpc2lvbmFsLCBDb21t
aXR0ZWQsIEZpbmlzaGVkLCBGYWlsZWQgfTsKKworICAgIFdlYlBhZ2VQcml2YXRlKFdlYlBhZ2Uq
LCBXZWJQYWdlQ2xpZW50KiwgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYpOworICAgIHZpcnR1YWwg
fldlYlBhZ2VQcml2YXRlKCk7CisKKyAgICB2b2lkIGluaXQoY29uc3QgV2ViU3RyaW5nJiBwYWdl
R3JvdXBOYW1lKTsKKyAgICBib29sIGhhbmRsZU1vdXNlRXZlbnQoV2ViQ29yZTo6UGxhdGZvcm1N
b3VzZUV2ZW50Jik7CisgICAgYm9vbCBoYW5kbGVXaGVlbEV2ZW50KFdlYkNvcmU6OlBsYXRmb3Jt
V2hlZWxFdmVudCYpOworCisgICAgdm9pZCBsb2FkKGNvbnN0IGNoYXIqIHVybCwgY29uc3QgY2hh
ciogbmV0d29ya1Rva2VuLCBjb25zdCBjaGFyKiBtZXRob2QsIFBsYXRmb3JtOjpOZXR3b3JrUmVx
dWVzdDo6Q2FjaGVQb2xpY3ksIGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBkYXRhTGVuZ3RoLCBj
b25zdCBjaGFyKiBjb25zdCogaGVhZGVycywgc2l6ZV90IGhlYWRlcnNMZW5ndGgsIGJvb2wgaXNJ
bml0aWFsLCBib29sIG11c3RIYW5kbGVJbnRlcm5hbGx5ID0gZmFsc2UsIGJvb2wgZm9yY2VEb3du
bG9hZCA9IGZhbHNlLCBjb25zdCBjaGFyKiBvdmVycmlkZUNvbnRlbnRUeXBlID0gIiIpOworICAg
IHZvaWQgbG9hZFN0cmluZyhjb25zdCBjaGFyKiBzdHJpbmcsIGNvbnN0IGNoYXIqIGJhc2VVUkws
IGNvbnN0IGNoYXIqIG1pbWVUeXBlLCBjb25zdCBjaGFyKiBmYWlsaW5nVVJMID0gMCk7CisgICAg
Ym9vbCBleGVjdXRlSmF2YVNjcmlwdChjb25zdCBjaGFyKiBzY3JpcHQsIEphdmFTY3JpcHREYXRh
VHlwZSYgcmV0dXJuVHlwZSwgV2ViU3RyaW5nJiByZXR1cm5WYWx1ZSk7CisgICAgYm9vbCBleGVj
dXRlSmF2YVNjcmlwdEluSXNvbGF0ZWRXb3JsZChjb25zdCBXZWJDb3JlOjpTY3JpcHRTb3VyY2VD
b2RlJiwgSmF2YVNjcmlwdERhdGFUeXBlJiByZXR1cm5UeXBlLCBXZWJTdHJpbmcmIHJldHVyblZh
bHVlKTsKKworICAgIHZvaWQgc3RvcEN1cnJlbnRMb2FkKCk7CisgICAgdm9pZCBwcmVwYXJlVG9E
ZXN0cm95KCk7CisKKyAgICBMb2FkU3RhdGUgbG9hZFN0YXRlKCkgY29uc3QgeyByZXR1cm4gbV9s
b2FkU3RhdGU7IH0KKyAgICBib29sIGlzTG9hZGluZygpIGNvbnN0IHsgcmV0dXJuIG1fbG9hZFN0
YXRlID09IFdlYlBhZ2VQcml2YXRlOjpQcm92aXNpb25hbCB8fCBtX2xvYWRTdGF0ZSA9PSBXZWJQ
YWdlUHJpdmF0ZTo6Q29tbWl0dGVkOyB9CisKKyAgICAvLyBDYWxsZWQgZnJvbSB3aXRoaW4gV2Vi
S2l0IHZpYSBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnkuCisgICAgdm9pZCBzZXRMb2FkU3Rh
dGUoTG9hZFN0YXRlKTsKKworICAgIC8vIENsYW1wIHRoZSBzY2FsZS4KKyAgICBkb3VibGUgY2xh
bXBlZFNjYWxlKGRvdWJsZSBzY2FsZSkgY29uc3Q7CisKKyAgICAvLyBEZXRlcm1pbmUgaWYgd2Ug
c2hvdWxkIHpvb20sIGNsYW1waW5nIHRoZSBzY2FsZSBwYXJhbWV0ZXIgaWYgcmVxdWlyZWQuCisg
ICAgYm9vbCBzaG91bGRab29tQWJvdXRQb2ludChkb3VibGUgc2NhbGUsIGNvbnN0IFdlYkNvcmU6
OkZsb2F0UG9pbnQmIGFuY2hvciwgYm9vbCBlbmZvcmVTY2FsZUNsYW1waW5nLCBkb3VibGUqIGNs
YW1wZWRTY2FsZSk7CisKKyAgICAvLyBTY2FsZSB0aGUgcGFnZSB0byB0aGUgZ2l2ZW4gc2NhbGUg
YW5kIGFuY2hvciBhYm91dCB0aGUgcG9pbnQgd2hpY2ggaXMgc3BlY2lmaWVkIGluIHVudHJhbnNm
b3JtZWQgY29udGVudCBjb29yZGluYXRlcy4KKyAgICBib29sIHpvb21BYm91dFBvaW50KGRvdWJs
ZSBzY2FsZSwgY29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludCYgYW5jaG9yLCBib29sIGVuZm9yY2VT
Y2FsZUNsYW1waW5nID0gdHJ1ZSwgYm9vbCBmb3JjZVJlbmRlcmluZyA9IGZhbHNlLCBib29sIGlz
UmVzdG9yaW5nWm9vbUxldmVsID0gZmFsc2UpOworICAgIGJvb2wgc2NoZWR1bGVab29tQWJvdXRQ
b2ludChkb3VibGUgc2NhbGUsIGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQmIGFuY2hvciwgYm9v
bCBlbmZvcmNlU2NhbGVDbGFtcGluZyA9IHRydWUsIGJvb2wgZm9yY2VSZW5kZXJpbmcgPSBmYWxz
ZSk7CisgICAgdm9pZCB1bnNjaGVkdWxlWm9vbUFib3V0UG9pbnQoKTsKKyAgICBXZWJDb3JlOjpJ
bnRQb2ludCBjYWxjdWxhdGVSZWZsb3dlZFNjcm9sbFBvc2l0aW9uKGNvbnN0IFdlYkNvcmU6OkZs
b2F0UG9pbnQmIGFuY2hvck9mZnNldCwgZG91YmxlIGludmVyc2VTY2FsZSk7CisgICAgdm9pZCBz
ZXRUZXh0UmVmbG93QW5jaG9yUG9pbnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBmb2NhbFBv
aW50KTsKKworICAgIHZvaWQgc2NoZWR1bGVQaW5jaFpvb21BYm91dFBvaW50KGRvdWJsZSBzY2Fs
ZSwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIGFuY2hvcik7CisKKyAgICAvLyBQZXJmb3JtIGFj
dHVhbCB6b29tIGZvciBibG9jayB6b29tLgorICAgIHZvaWQgem9vbUJsb2NrKCk7CisKKyAgICAv
LyBDYWxsZWQgYnkgdGhlIGJhY2tpbmcgc3RvcmUgYXMgd2VsbCBhcyB0aGUgbWV0aG9kIGJlbG93
LgorICAgIHZvaWQgcmVxdWVzdExheW91dElmTmVlZGVkKCkgY29uc3Q7CisgICAgdm9pZCBzZXRO
ZWVkc0xheW91dCgpOworCisgICAgV2ViQ29yZTo6SW50UG9pbnQgc2Nyb2xsUG9zaXRpb24oKSBj
b25zdDsKKyAgICBXZWJDb3JlOjpJbnRQb2ludCBtYXhpbXVtU2Nyb2xsUG9zaXRpb24oKSBjb25z
dDsKKyAgICB2b2lkIHNldFNjcm9sbFBvc2l0aW9uKGNvbnN0IFdlYkNvcmU6OkludFBvaW50Jik7
CisgICAgYm9vbCBzY3JvbGxCeShpbnQgZGVsdGFYLCBpbnQgZGVsdGFZLCBib29sIHNjcm9sbE1h
aW5GcmFtZSA9IHRydWUpOworCisgICAgdm9pZCBlbnF1ZXVlUmVuZGVyaW5nT2ZDbGlwcGVkQ29u
dGVudE9mU2Nyb2xsYWJsZU5vZGVBZnRlckluUmVnaW9uU2Nyb2xsaW5nKFdlYkNvcmU6Ok5vZGUq
KTsKKyAgICBzdGQ6OnZlY3RvcjxQbGF0Zm9ybTo6U2Nyb2xsVmlld0Jhc2U+IGluUmVnaW9uU2Ny
b2xsYWJsZUFyZWFzRm9yUG9pbnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50Jik7CisgICAgdm9p
ZCBub3RpZnlJblJlZ2lvblNjcm9sbFN0YXR1c0NoYW5nZWQoYm9vbCBzdGF0dXMpOworICAgIHZv
aWQgc2V0U2Nyb2xsT3JpZ2luUG9pbnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50Jik7CisgICAg
dm9pZCBzZXRIYXNJblJlZ2lvblNjcm9sbGFibGVBcmVhcyhib29sKTsKKworICAgIC8vIFRoZSBh
Y3R1YWwgdmlzaWJsZSBzaXplIGFzIHJlcG9ydGVkIGJ5IHRoZSBjbGllbnQsIGJ1dCBpbiBXZWJL
aXQgY29vcmRpbmF0ZXMuCisgICAgV2ViQ29yZTo6SW50U2l6ZSBhY3R1YWxWaXNpYmxlU2l6ZSgp
IGNvbnN0OworCisgICAgLy8gVGhlIHZpZXdwb3J0IHNpemUgaXMgdGhlIHNhbWUgYXMgdGhlIGNs
aWVudCdzIHdpbmRvdyBzaXplLCBidXQgaW4gd2Via2l0IGNvb3JkaW5hdGVzLgorICAgIFdlYkNv
cmU6OkludFNpemUgdmlld3BvcnRTaXplKCkgY29uc3Q7CisKKyAgICAvLyBNb2RpZmllcyB0aGUg
em9vbVRvRml0IGFsZ29yaXRobSBsb2dpYyB0byBjb25zdHJ1Y3QgYSBzY2FsZSBzdWNoIHRoYXQg
dGhlIHZpZXdwb3J0U2l6ZSBhYm92ZSBpcyBlcXVhbCB0byB0aGlzIHNpemUuCisgICAgYm9vbCBo
YXNWaXJ0dWFsVmlld3BvcnQoKSBjb25zdDsKKyAgICBib29sIGlzVXNlclNjYWxhYmxlKCkgY29u
c3QgeyByZXR1cm4gbV91c2VyU2NhbGFibGU7IH0KKyAgICB2b2lkIHNldFVzZXJTY2FsYWJsZShi
b29sIHVzZXJTY2FsYWJsZSkgeyBtX3VzZXJTY2FsYWJsZSA9IHVzZXJTY2FsYWJsZTsgfQorCisg
ICAgLy8gU2V0cyBkZWZhdWx0IGxheW91dCBzaXplIHdpdGhvdXQgZG9pbmcgbGF5b3V0IG9yIG1h
cmtpbmcgYXMgbmVlZGluZyBsYXlvdXQuCisgICAgdm9pZCBzZXREZWZhdWx0TGF5b3V0U2l6ZShj
b25zdCBXZWJDb3JlOjpJbnRTaXplJik7CisKKyAgICAvLyBVcGRhdGVzIFdlYkNvcmUgd2hlbiB0
aGUgdmlld3BvcnRTaXplKCkgb3IgYWN0dWFsVmlzaWJsZVNpemUoKSBjaGFuZ2UuCisgICAgdm9p
ZCB1cGRhdGVWaWV3cG9ydFNpemUoYm9vbCBzZXRGaXhlZFJlcG9ydGVkU2l6ZSA9IHRydWUsIGJv
b2wgc2VuZFJlc2l6ZUV2ZW50ID0gdHJ1ZSk7CisKKyAgICBXZWJDb3JlOjpGbG9hdFBvaW50IGNl
bnRlck9mVmlzaWJsZUNvbnRlbnRzUmVjdCgpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFJlY3Qg
dmlzaWJsZUNvbnRlbnRzUmVjdCgpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFNpemUgY29udGVu
dHNTaXplKCkgY29uc3Q7CisgICAgV2ViQ29yZTo6SW50U2l6ZSBhYnNvbHV0ZVZpc2libGVPdmVy
Zmxvd1NpemUoKSBjb25zdDsKKworICAgIC8vIFZpcnR1YWwgZnVuY3Rpb25zIGluaGVyaXRlZCBm
cm9tIFBhZ2VDbGllbnRCbGFja0JlcnJ5LgorICAgIHZpcnR1YWwgdm9pZCBzZXRDdXJzb3IoV2Vi
Q29yZTo6UGxhdGZvcm1DdXJzb3JIYW5kbGUpOworICAgIHZpcnR1YWwgUGxhdGZvcm06Ok5ldHdv
cmtTdHJlYW1GYWN0b3J5KiBuZXR3b3JrU3RyZWFtRmFjdG9yeSgpOworICAgIHZpcnR1YWwgUGxh
dGZvcm06OkdyYXBoaWNzOjpXaW5kb3cqIHBsYXRmb3JtV2luZG93KCkgY29uc3Q7CisgICAgdmly
dHVhbCB2b2lkIHNldFByZXZlbnRzU2NyZWVuRGltbWluZyhib29sIHByZXZlbnREaW1taW5nKTsK
KyAgICB2aXJ0dWFsIHZvaWQgc2hvd1ZpcnR1YWxLZXlib2FyZChib29sIHNob3dLZXlib2FyZCk7
CisgICAgdmlydHVhbCB2b2lkIGVuc3VyZUNvbnRlbnRWaXNpYmxlKGJvb2wgY2VudGVySW5WaWV3
ID0gdHJ1ZSk7CisgICAgdmlydHVhbCB2b2lkIHpvb21Ub0NvbnRlbnRSZWN0KGNvbnN0IFdlYkNv
cmU6OkludFJlY3QmKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJQbHVnaW4oV2ViQ29yZTo6
UGx1Z2luVmlldyosIGJvb2wpOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlQYWdlT25Mb2FkKCk7
CisgICAgdmlydHVhbCBib29sIHNob3VsZFBsdWdpbkVudGVyRnVsbFNjcmVlbihXZWJDb3JlOjpQ
bHVnaW5WaWV3KiwgY29uc3QgY2hhciopOworICAgIHZpcnR1YWwgdm9pZCBkaWRQbHVnaW5FbnRl
ckZ1bGxTY3JlZW4oV2ViQ29yZTo6UGx1Z2luVmlldyosIGNvbnN0IGNoYXIqKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlkUGx1Z2luRXhpdEZ1bGxTY3JlZW4oV2ViQ29yZTo6UGx1Z2luVmlldyosIGNv
bnN0IGNoYXIqKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25QbHVnaW5TdGFydEJhY2tncm91bmRQbGF5
KFdlYkNvcmU6OlBsdWdpblZpZXcqLCBjb25zdCBjaGFyKik7CisgICAgdmlydHVhbCB2b2lkIG9u
UGx1Z2luU3RvcEJhY2tncm91bmRQbGF5KFdlYkNvcmU6OlBsdWdpblZpZXcqLCBjb25zdCBjaGFy
Kik7CisgICAgdmlydHVhbCBib29sIGxvY2tPcmllbnRhdGlvbihib29sIGxhbmRzY2FwZSk7Cisg
ICAgdmlydHVhbCB2b2lkIHVubG9ja09yaWVudGF0aW9uKCk7CisgICAgdmlydHVhbCBpbnQgb3Jp
ZW50YXRpb24oKSBjb25zdDsKKyAgICB2aXJ0dWFsIGRvdWJsZSBjdXJyZW50Wm9vbUZhY3Rvcigp
IGNvbnN0OworICAgIHZpcnR1YWwgaW50IHNob3dBbGVydERpYWxvZyhXZWJQYWdlQ2xpZW50OjpB
bGVydFR5cGUgYXR5cGUpOworICAgIHZpcnR1YWwgYm9vbCBpc0FjdGl2ZSgpIGNvbnN0OworCisg
ICAgLy8gQ2FsbGVkIGZyb20gd2l0aGluIFdlYktpdCB2aWEgQ2hyb21lQ2xpZW50QmxhY2tCZXJy
eS4KKyAgICB2b2lkIGVudGVyRnVsbHNjcmVlbkZvck5vZGUoV2ViQ29yZTo6Tm9kZSopOworICAg
IHZvaWQgZXhpdEZ1bGxzY3JlZW5Gb3JOb2RlKFdlYkNvcmU6Ok5vZGUqKTsKKyAgICB2b2lkIGNv
bnRlbnRzU2l6ZUNoYW5nZWQoY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYpOworICAgIHZvaWQgb3Zl
cmZsb3dFeGNlZWRzQ29udGVudHNTaXplKCkgeyBtX292ZXJmbG93RXhjZWVkc0NvbnRlbnRzU2l6
ZSA9IHRydWU7IH0KKyAgICB2b2lkIGxheW91dEZpbmlzaGVkKCk7CisgICAgdm9pZCBzZXROZWVk
VG91Y2hFdmVudHMoYm9vbCk7CisKKyAgICAvLyBDYWxsZWQgYWNjb3JkaW5nIHRvIG91ciBoZXVy
aXN0aWMgb3IgZnJvbSBzZXRMb2FkU3RhdGUgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgaGF2ZSBh
IHZpcnR1YWwgdmlld3BvcnQuCisgICAgdm9pZCB6b29tVG9Jbml0aWFsU2NhbGVPbkxvYWQoKTsK
KworICAgIC8vIFZhcmlvdXMgc2NhbGUgZmFjdG9ycy4KKyAgICBkb3VibGUgY3VycmVudFNjYWxl
KCkgY29uc3QgeyByZXR1cm4gbV90cmFuc2Zvcm1hdGlvbk1hdHJpeC0+bTExKCk7IH0KKyAgICBk
b3VibGUgem9vbVRvRml0U2NhbGUoKSBjb25zdDsKKyAgICBkb3VibGUgaW5pdGlhbFNjYWxlKCkg
Y29uc3Q7CisgICAgdm9pZCBzZXRJbml0aWFsU2NhbGUoZG91YmxlIHNjYWxlKSB7IG1faW5pdGlh
bFNjYWxlID0gc2NhbGU7IH0KKyAgICBkb3VibGUgbWluaW11bVNjYWxlKCkgY29uc3QKKyAgICB7
CisgICAgICAgIHJldHVybiAobV9taW5pbXVtU2NhbGUgPiB6b29tVG9GaXRTY2FsZSgpICYmIG1f
bWluaW11bVNjYWxlIDw9IG1heGltdW1TY2FsZSgpKSA/IG1fbWluaW11bVNjYWxlIDogem9vbVRv
Rml0U2NhbGUoKTsKKyAgICB9CisKKyAgICB2b2lkIHNldE1pbmltdW1TY2FsZShkb3VibGUgc2Nh
bGUpIHsgbV9taW5pbXVtU2NhbGUgPSBzY2FsZTsgfQorICAgIGRvdWJsZSBtYXhpbXVtU2NhbGUo
KSBjb25zdDsKKyAgICB2b2lkIHNldE1heGltdW1TY2FsZShkb3VibGUgc2NhbGUpIHsgbV9tYXhp
bXVtU2NhbGUgPSBzY2FsZTsgfQorICAgIHZvaWQgcmVzZXRTY2FsZXMoKTsKKworICAgIC8vIE5v
dGU6IHRvIG1ha2UgdGhpcyByZWZsb3cgd2lkdGggdHJhbnNmb3JtIGludmFyaWFudCBqdXN0IHVz
ZQorICAgIC8vIHRyYW5zZm9ybWVkQWN0dWFsVmlzaWJsZVNpemUoKSBoZXJlIGluc3RlYWQhCisg
ICAgaW50IHJlZmxvd1dpZHRoKCkgY29uc3QgeyByZXR1cm4gYWN0dWFsVmlzaWJsZVNpemUoKS53
aWR0aCgpOyB9CisKKyAgICAvLyBUaGVzZSBtZXRob2RzIGdpdmUgdGhlIHJlYWwgZ2VvbWV0cnkg
b2YgdGhlIGRldmljZSBnaXZlbiB0aGUgY3VycmVudGx5IHNldCB0cmFuc2Zvcm0uCisgICAgV2Vi
Q29yZTo6SW50UG9pbnQgdHJhbnNmb3JtZWRTY3JvbGxQb3NpdGlvbigpIGNvbnN0OworICAgIFdl
YkNvcmU6OkludFBvaW50IHRyYW5zZm9ybWVkTWF4aW11bVNjcm9sbFBvc2l0aW9uKCkgY29uc3Q7
CisgICAgV2ViQ29yZTo6SW50U2l6ZSB0cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKCkgY29u
c3Q7CisgICAgV2ViQ29yZTo6SW50U2l6ZSB0cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpIGNvbnN0
OworICAgIFdlYkNvcmU6OkludFJlY3QgdHJhbnNmb3JtZWRWaXNpYmxlQ29udGVudHNSZWN0KCkg
Y29uc3Q7CisgICAgV2ViQ29yZTo6SW50U2l6ZSB0cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpIGNv
bnN0OworCisgICAgLy8gR2VuZXJpYyBjb252ZXJzaW9ucyBvZiBwb2ludHMsIHJlY3RzLCByZWxh
dGl2ZSB0byBhbmQgZnJvbSBjb250ZW50cyBhbmQgdmlld3BvcnQuCisgICAgV2ViQ29yZTo6SW50
UG9pbnQgbWFwRnJvbUNvbnRlbnRzVG9WaWV3cG9ydChjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYp
IGNvbnN0OworICAgIFdlYkNvcmU6OkludFBvaW50IG1hcEZyb21WaWV3cG9ydFRvQ29udGVudHMo
Y29uc3QgV2ViQ29yZTo6SW50UG9pbnQmKSBjb25zdDsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IG1h
cEZyb21Db250ZW50c1RvVmlld3BvcnQoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYpIGNvbnN0Owor
ICAgIFdlYkNvcmU6OkludFJlY3QgbWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyhjb25zdCBXZWJD
b3JlOjpJbnRSZWN0JikgY29uc3Q7CisKKyAgICAvLyBHZW5lcmljIGNvbnZlcnNpb25zIG9mIHBv
aW50cywgcmVjdHMsIHJlbGF0aXZlIHRvIGFuZCBmcm9tIHRyYW5zZm9ybWVkIGNvbnRlbnRzIGFu
ZCB0cmFuc2Zvcm1lZCB2aWV3cG9ydC4KKyAgICBXZWJDb3JlOjpJbnRQb2ludCBtYXBGcm9tVHJh
bnNmb3JtZWRDb250ZW50c1RvVHJhbnNmb3JtZWRWaWV3cG9ydChjb25zdCBXZWJDb3JlOjpJbnRQ
b2ludCYpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFBvaW50IG1hcEZyb21UcmFuc2Zvcm1lZFZp
ZXdwb3J0VG9UcmFuc2Zvcm1lZENvbnRlbnRzKGNvbnN0IFdlYkNvcmU6OkludFBvaW50JikgY29u
c3Q7CisgICAgV2ViQ29yZTo6SW50UmVjdCBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVHJh
bnNmb3JtZWRWaWV3cG9ydChjb25zdCBXZWJDb3JlOjpJbnRSZWN0JikgY29uc3Q7CisgICAgV2Vi
Q29yZTo6SW50UmVjdCBtYXBGcm9tVHJhbnNmb3JtZWRWaWV3cG9ydFRvVHJhbnNmb3JtZWRDb250
ZW50cyhjb25zdCBXZWJDb3JlOjpJbnRSZWN0JikgY29uc3Q7CisKKyAgICAvLyBHZW5lcmljIGNv
bnZlcnNpb25zIG9mIHBvaW50cywgcmVjdHMsIGFuZCBzaXplcyB0byBhbmQgZnJvbSB0cmFuc2Zv
cm1lZCBjb29yZGluYXRlcy4KKyAgICBXZWJDb3JlOjpJbnRQb2ludCBtYXBUb1RyYW5zZm9ybWVk
KGNvbnN0IFdlYkNvcmU6OkludFBvaW50JikgY29uc3Q7CisgICAgV2ViQ29yZTo6RmxvYXRQb2lu
dCBtYXBUb1RyYW5zZm9ybWVkRmxvYXRQb2ludChjb25zdCBXZWJDb3JlOjpGbG9hdFBvaW50Jikg
Y29uc3Q7CisgICAgV2ViQ29yZTo6SW50UG9pbnQgbWFwRnJvbVRyYW5zZm9ybWVkKGNvbnN0IFdl
YkNvcmU6OkludFBvaW50JikgY29uc3Q7CisgICAgV2ViQ29yZTo6RmxvYXRQb2ludCBtYXBGcm9t
VHJhbnNmb3JtZWRGbG9hdFBvaW50KGNvbnN0IFdlYkNvcmU6OkZsb2F0UG9pbnQmKSBjb25zdDsK
KyAgICBXZWJDb3JlOjpGbG9hdFJlY3QgbWFwRnJvbVRyYW5zZm9ybWVkRmxvYXRSZWN0KGNvbnN0
IFdlYkNvcmU6OkZsb2F0UmVjdCYpIGNvbnN0OworICAgIFdlYkNvcmU6OkludFNpemUgbWFwVG9U
cmFuc2Zvcm1lZChjb25zdCBXZWJDb3JlOjpJbnRTaXplJikgY29uc3Q7CisgICAgV2ViQ29yZTo6
SW50U2l6ZSBtYXBGcm9tVHJhbnNmb3JtZWQoY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYpIGNvbnN0
OworICAgIFdlYkNvcmU6OkludFJlY3QgbWFwVG9UcmFuc2Zvcm1lZChjb25zdCBXZWJDb3JlOjpJ
bnRSZWN0JikgY29uc3Q7CisgICAgdm9pZCBjbGlwVG9UcmFuc2Zvcm1lZENvbnRlbnRzUmVjdChX
ZWJDb3JlOjpJbnRSZWN0JikgY29uc3Q7CisgICAgV2ViQ29yZTo6SW50UmVjdCBtYXBGcm9tVHJh
bnNmb3JtZWQoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYpIGNvbnN0OworICAgIGJvb2wgdHJhbnNm
b3JtZWRQb2ludEVxdWFsc1VudHJhbnNmb3JtZWRQb2ludChjb25zdCBXZWJDb3JlOjpJbnRQb2lu
dCYgdHJhbnNmb3JtZWRQb2ludCwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIHVudHJhbnNmb3Jt
ZWRQb2ludCk7CisKKyAgICAvLyBOb3RpZmljYXRpb24gbWV0aG9kcyB0aGF0IGRlbGl2ZXIgY2hh
bmdlcyB0byB0aGUgcmVhbCBnZW9tZXRyeSBvZiB0aGUgZGV2aWNlIGFzIHNwZWNpZmllZCBhYm92
ZS4KKyAgICB2b2lkIG5vdGlmeVRyYW5zZm9ybUNoYW5nZWQoKTsKKyAgICB2b2lkIG5vdGlmeVRy
YW5zZm9ybWVkQ29udGVudHNTaXplQ2hhbmdlZCgpOworICAgIHZvaWQgbm90aWZ5VHJhbnNmb3Jt
ZWRTY3JvbGxDaGFuZ2VkKCk7CisKKyAgICB2b2lkIGFzc2lnbkZvY3VzKFBsYXRmb3JtOjpGb2N1
c0RpcmVjdGlvbik7CisgICAgUGxhdGZvcm06OkludFJlY3QgZm9jdXNOb2RlUmVjdCgpOworICAg
IFdlYkNvcmU6OkludFJlY3QgZ2V0UmVjdXJzaXZlVmlzaWJsZVdpbmRvd1JlY3QoV2ViQ29yZTo6
U2Nyb2xsVmlldyosIGJvb2wgbm9DbGlwT2ZNYWluRnJhbWUgPSBmYWxzZSk7CisKKyAgICBXZWJD
b3JlOjpJbnRQb2ludCBmcmFtZU9mZnNldChjb25zdCBXZWJDb3JlOjpGcmFtZSopIGNvbnN0Owor
CisgICAgV2ViQ29yZTo6Tm9kZSogYmVzdE5vZGVGb3Jab29tVW5kZXJQb2ludChjb25zdCBXZWJD
b3JlOjpJbnRQb2ludCYpOworICAgIFdlYkNvcmU6Ok5vZGUqIGJlc3RDaGlsZE5vZGVGb3JDbGlj
a1JlY3QoV2ViQ29yZTo6Tm9kZSogcGFyZW50Tm9kZSwgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYg
Y2xpY2tSZWN0KTsKKyAgICBXZWJDb3JlOjpOb2RlKiBub2RlRm9yWm9vbVVuZGVyUG9pbnQoY29u
c3QgV2ViQ29yZTo6SW50UG9pbnQmKTsKKyAgICBXZWJDb3JlOjpOb2RlKiBhZGp1c3RlZEJsb2Nr
Wm9vbU5vZGVGb3Jab29tTGltaXRzKFdlYkNvcmU6Ok5vZGUqKTsKKyAgICBXZWJDb3JlOjpJbnRS
ZWN0IHJlY3RGb3JOb2RlKFdlYkNvcmU6Ok5vZGUqKTsKKyAgICBXZWJDb3JlOjpJbnRSZWN0IGJs
b2NrWm9vbVJlY3RGb3JOb2RlKFdlYkNvcmU6Ok5vZGUqKTsKKyAgICBXZWJDb3JlOjpJbnRSZWN0
IGFkanVzdFJlY3RPZmZzZXRGb3JGcmFtZU9mZnNldChjb25zdCBXZWJDb3JlOjpJbnRSZWN0Jiwg
Y29uc3QgV2ViQ29yZTo6Tm9kZSopOworICAgIGJvb2wgY29tcGFyZU5vZGVzRm9yQmxvY2tab29t
KFdlYkNvcmU6Ok5vZGUqIG4xLCBXZWJDb3JlOjpOb2RlKiBuMik7CisgICAgZG91YmxlIG5ld1Nj
YWxlRm9yQmxvY2tab29tUmVjdChjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiwgZG91YmxlIG9sZFNj
YWxlLCBkb3VibGUgbWFyZ2luKTsKKyAgICBkb3VibGUgbWF4QmxvY2tab29tU2NhbGUoKSBjb25z
dDsKKworICAgIC8vIFBsdWdpbiBNZXRob2RzLgorICAgIHZvaWQgbm90aWZ5UGx1Z2luUmVjdENo
YW5nZWQoaW50IGlkLCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiByZWN0Q2hhbmdlZCk7CisKKyAg
ICAvLyBDb250ZXh0IE1ldGhvZHMuCisgICAgQWN0aXZlTm9kZUNvbnRleHQgYWN0aXZlTm9kZUNv
bnRleHQoVGFyZ2V0RGV0ZWN0aW9uU3RyYXRlZ3kpOworICAgIFBhc3NSZWZQdHI8V2ViQ29yZTo6
Tm9kZT4gY29udGV4dE5vZGUoVGFyZ2V0RGV0ZWN0aW9uU3RyYXRlZ3kpOworCisjaWYgRU5BQkxF
KFZJRVdQT1JUX1JFRkxPVykKKyAgICB2b2lkIHRvZ2dsZVRleHRSZWZsb3dJZkVuYWJsZWRGb3JC
bG9ja1pvb21Pbmx5KGJvb2wgc2hvdWxkRW5hYmxlVGV4dFJlZmxvdyA9IGZhbHNlKTsKKyNlbmRp
ZgorCisgICAgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFdlYkNvcmU6OkZyYW1lKik7CisKKyAgICB2
b2lkIHVwZGF0ZURlbGVnYXRlZE92ZXJsYXlzKGJvb2wgZGlzcGF0Y2hlZCA9IGZhbHNlKTsKKwor
ICAgIHZvaWQgdXBkYXRlQ3Vyc29yKCk7CisKKyAgICB2b2lkIG9uSW5wdXRMb2NhbGVDaGFuZ2Vk
KGJvb2wgaXNSVEwpOworCisgICAgVmlld01vZGUgdmlld01vZGUoKSBjb25zdCB7IHJldHVybiBt
X3ZpZXdNb2RlOyB9CisgICAgYm9vbCBzZXRWaWV3TW9kZShWaWV3TW9kZSk7IC8vIFJldHVybnMg
dHJ1ZSBpZiB0aGUgY2hhbmdlIHJlcXVpcmVzIHJlLWxheW91dC4KKworICAgIHZvaWQgc2V0U2hv
dWxkVXNlRml4ZWREZXNrdG9wTW9kZShib29sIGIpIHsgbV9zaG91bGRVc2VGaXhlZERlc2t0b3BN
b2RlID0gYjsgfQorCisgICAgYm9vbCB1c2VGaXhlZExheW91dCgpIGNvbnN0OworICAgIFdlYkNv
cmU6OkludFNpemUgZml4ZWRMYXlvdXRTaXplKGJvb2wgc25hcFRvSW5jcmVtZW50ID0gZmFsc2Up
IGNvbnN0OworCisgICAgLy8gWm9vbVRvRml0T25Mb2FkIGNhbiBsZWFkIHRvIGEgbGFyZ2UgcmVj
dXJzaW9uIGRlcHRoIGluIEZyYW1lVmlldzo6bGF5b3V0KCkgYXMgd2UgYXR0ZW1wdAorICAgIC8v
IHRvIGRldGVybWluZSB0aGUgem9vbSBzY2FsZSBmYWN0b3Igc28gYXMgdG8gaGF2ZSB0aGUgY29u
dGVudCBvZiB0aGUgcGFnZSBmaXQgd2l0aGluIHRoZQorICAgIC8vIGFyZWEgb2YgdGhlIGZyYW1l
LiBGcm9tIG9ic2VydmF0aW9uLCB3ZSBjYW4gYmFpbCBvdXQgYWZ0ZXIgYSByZWN1cnNpb24gZGVw
dGggb2YgMTAgYW5kCisgICAgLy8gc3RpbGwgaGF2ZSByZWFzb25hYmxlIHJlc3VsdHMuCisgICAg
Ym9vbCBkaWRMYXlvdXRFeGNlZWRNYXhpbXVtSXRlcmF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1f
bmVzdGVkTGF5b3V0RmluaXNoZWRDb3VudCA+IDEwOyB9CisKKyAgICB2b2lkIGNsZWFyRm9jdXNO
b2RlKCk7CisgICAgV2ViQ29yZTo6RnJhbWUqIGZvY3VzZWRPck1haW5GcmFtZSgpIGNvbnN0Owor
ICAgIFdlYkNvcmU6OkZyYW1lKiBtYWluRnJhbWUoKSBjb25zdCB7IHJldHVybiBtX21haW5GcmFt
ZTsgfQorCisgICAgYm9vbCBzY3JvbGxOb2RlUmVjdXJzaXZlbHkoV2ViQ29yZTo6Tm9kZSogb3Jp
Z2luYWxOb2RlLCBjb25zdCBXZWJDb3JlOjpJbnRTaXplJiBkZWx0YSk7CisgICAgYm9vbCBzY3Jv
bGxSZW5kZXJlcihXZWJDb3JlOjpSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBXZWJDb3Jl
OjpJbnRTaXplJiBkZWx0YSk7CisgICAgdm9pZCBhZGp1c3RTY3JvbGxEZWx0YShjb25zdCBXZWJD
b3JlOjpJbnRQb2ludCYgbWF4T2Zmc2V0LCBjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYgY3VycmVu
dE9mZnNldCwgV2ViQ29yZTo6SW50U2l6ZSYgZGVsdGEpIGNvbnN0OworCisgICAgYm9vbCBjYW5T
Y3JvbGxSZW5kZXJCb3goV2ViQ29yZTo6UmVuZGVyQm94Kik7CisgICAgYm9vbCBjYW5TY3JvbGxJ
bm5lckZyYW1lKFdlYkNvcmU6OkZyYW1lKikgY29uc3Q7CisKKyNpZiBFTkFCTEUoRVZFTlRfTU9E
RV9NRVRBVEFHUykKKyAgICB2b2lkIGRpZFJlY2VpdmVDdXJzb3JFdmVudE1vZGUoV2ViQ29yZTo6
Q3Vyc29yRXZlbnRNb2RlKTsKKyAgICB2b2lkIGRpZFJlY2VpdmVUb3VjaEV2ZW50TW9kZShXZWJD
b3JlOjpUb3VjaEV2ZW50TW9kZSk7CisjZW5kaWYKKworICAgIHZvaWQgZGlzcGF0Y2hWaWV3cG9y
dFByb3BlcnRpZXNEaWRDaGFuZ2UoY29uc3QgV2ViQ29yZTo6Vmlld3BvcnRBcmd1bWVudHMmKTsK
KyAgICBXZWJDb3JlOjpJbnRTaXplIHJlY29tcHV0ZVZpcnR1YWxWaWV3cG9ydEZyb21WaWV3cG9y
dEFyZ3VtZW50cygpOworCisgICAgdm9pZCByZXNldEJsb2NrWm9vbSgpOworCisgICAgdm9pZCB6
b29tQWJvdXRQb2ludFRpbWVyRmlyZWQoV2ViQ29yZTo6VGltZXI8V2ViUGFnZVByaXZhdGU+Kik7
CisgICAgYm9vbCBzaG91bGRTZW5kUmVzaXplRXZlbnQoKTsKKyAgICB2b2lkIHNjcm9sbEV2ZW50
VGltZXJGaXJlZChXZWJDb3JlOjpUaW1lcjxXZWJQYWdlUHJpdmF0ZT4qKTsKKyAgICB2b2lkIHJl
c2l6ZUV2ZW50VGltZXJGaXJlZChXZWJDb3JlOjpUaW1lcjxXZWJQYWdlUHJpdmF0ZT4qKTsKKwor
ICAgIC8vIElmIHRoaXMgdXJsIHNob3VsZCBiZSBoYW5kbGVkIGFzIGEgcGF0dGVybiwgcmV0dXJu
cyB0aGUgcGF0dGVybgorICAgIC8vIG90aGVyd2lzZSwgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcu
CisgICAgU3RyaW5nIGZpbmRQYXR0ZXJuU3RyaW5nRm9yVXJsKGNvbnN0IFdlYkNvcmU6OktVUkwm
KSBjb25zdDsKKworICAgIHZvaWQgc3VzcGVuZEJhY2tpbmdTdG9yZSgpOworICAgIHZvaWQgcmVz
dW1lQmFja2luZ1N0b3JlKCk7CisKKyAgICB2b2lkIHNldFNob3VsZFJlc2V0VGlsZXNXaGVuU2hv
d24oYm9vbCBmbGFnKSB7IG1fc2hvdWxkUmVzZXRUaWxlc1doZW5TaG93biA9IGZsYWc7IH0KKyAg
ICBib29sIHNob3VsZFJlc2V0VGlsZXNXaGVuU2hvd24oKSBjb25zdCB7IHJldHVybiBtX3Nob3Vs
ZFJlc2V0VGlsZXNXaGVuU2hvd247IH0KKworICAgIHZvaWQgc2V0U2NyZWVuT3JpZW50YXRpb24o
aW50KTsKKworICAgIC8vIFNjcm9sbCBhbmQvb3Igem9vbSBzbyB0aGF0IHRoZSBXZWJQYWdlIGZp
dHMgdGhlIG5ldyBhY3R1YWwKKyAgICAvLyB2aXNpYmxlIHNpemUuCisgICAgdm9pZCBzZXRWaWV3
cG9ydFNpemUoY29uc3QgV2ViQ29yZTo6SW50U2l6ZSYgdHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxl
U2l6ZSwgYm9vbCBlbnN1cmVGb2N1c0VsZW1lbnRWaXNpYmxlKTsKKyAgICB2b2lkIHNjcmVlblJv
dGF0ZWQoKTsgLy8gSGVscGVyIG1ldGhvZCBmb3Igc2V0Vmlld3BvcnRTaXplKCkuCisKKyAgICB2
b2lkIHNjaGVkdWxlRGVmZXJyYWJsZVRpbWVyKFdlYkNvcmU6OlRpbWVyPFdlYlBhZ2VQcml2YXRl
PiosIGRvdWJsZSB0aW1lT3V0KTsKKyAgICB2b2lkIHVuc2NoZWR1bGVBbGxEZWZlcnJhYmxlVGlt
ZXJzKCk7CisgICAgdm9pZCB3aWxsRGVmZXJMb2FkaW5nKCk7CisgICAgdm9pZCBkaWRSZXN1bWVM
b2FkaW5nKCk7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGVzY2FwZSBrZXkgaGFuZGxl
ciBzaG91bGQgem9vbS4KKyAgICBib29sIHNob3VsZFpvb21PbkVzY2FwZSgpIGNvbnN0OworCisg
ICAgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgqIHRyYW5zZm9ybWF0aW9uTWF0cml4KCkg
Y29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX3RyYW5zZm9ybWF0aW9uTWF0cml4OworICAg
IH0KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAvLyBXZWJLaXQgdGhy
ZWFkLgorICAgIGJvb2wgbmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpOworICAg
IHZvaWQgcm9vdExheWVyQ29tbWl0VGltZXJGaXJlZChXZWJDb3JlOjpUaW1lcjxXZWJQYWdlUHJp
dmF0ZT4qKTsKKyAgICBib29sIGNvbW1pdFJvb3RMYXllcklmTmVlZGVkKCk7CisgICAgV2ViQ29y
ZTo6TGF5ZXJSZW5kZXJpbmdSZXN1bHRzIGxhc3RDb21wb3NpdGluZ1Jlc3VsdHMoKSBjb25zdDsK
KworICAgIC8vIFdlYktpdCB0aHJlYWQsIHBsdW1iZWQgdGhyb3VnaCBmcm9tIENocm9tZUNsaWVu
dEJsYWNrQmVycnkuCisgICAgdm9pZCBzZXRSb290TGF5ZXJXZWJLaXRUaHJlYWQoV2ViQ29yZTo6
RnJhbWUqLCBXZWJDb3JlOjpMYXllcldlYktpdFRocmVhZCopOworICAgIHZvaWQgc2V0TmVlZHNP
bmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpOworICAgIHZvaWQgc2NoZWR1bGVSb290TGF5
ZXJDb21taXQoKTsKKworICAgIC8vIFRocmVhZCBzYWZlLgorICAgIHZvaWQgcmVzZXRDb21wb3Np
dGluZ1N1cmZhY2UoKTsKKyAgICB2b2lkIGRyYXdMYXllcnNPbkNvbW1pdCgpOyAvLyBJbmNsdWRp
bmcgYmFja2luZyBzdG9yZSBibGl0LgorICAgIGJvb2wgZHJhd1N1YkxheWVycyhjb25zdCBXZWJD
b3JlOjpJbnRSZWN0JiBkc3RSZWN0LCBjb25zdCBXZWJDb3JlOjpGbG9hdFJlY3QmIGNvbnRlbnRz
KTsKKyAgICBib29sIGRyYXdTdWJMYXllcnMoKTsgLy8gRHJhdyB0aGVtIGF0IGxhc3Qga25vd24g
cG9zaXRpb24uCisKKyAgICAvLyBDb21wb3NpdGluZyB0aHJlYWQuCisgICAgdm9pZCBzZXRSb290
TGF5ZXJDb21wb3NpdGluZ1RocmVhZChXZWJDb3JlOjpMYXllckNvbXBvc2l0aW5nVGhyZWFkKik7
CisgICAgdm9pZCBjb21taXRSb290TGF5ZXIoY29uc3QgV2ViQ29yZTo6SW50UmVjdCYsIGNvbnN0
IFdlYkNvcmU6OkludFNpemUmKTsKKyAgICB2b2lkIHNldElzQWNjZWxlcmF0ZWRDb21wb3NpdGlu
Z0FjdGl2ZShib29sKTsKKyAgICB2b2lkIGRlc3Ryb3lDb21wb3NpdG9yKCk7CisgICAgdm9pZCBz
eW5jRGVzdHJveUNvbXBvc2l0b3JPbkNvbXBvc2l0aW5nVGhyZWFkKCk7CisgICAgdm9pZCBkZXN0
cm95TGF5ZXJSZXNvdXJjZXMoKTsKKyAgICB2b2lkIHN1c3BlbmRSb290TGF5ZXJDb21taXQoKTsK
KyAgICB2b2lkIHJlc3VtZVJvb3RMYXllckNvbW1pdCgpOworICAgIHZvaWQgYmxpdFZpc2libGVD
b250ZW50cygpOworI2VuZGlmCisKKyAgICBib29sIGRpc3BhdGNoVG91Y2hFdmVudFRvRnVsbFNj
cmVlblBsdWdpbihXZWJDb3JlOjpQbHVnaW5WaWV3KiwgY29uc3QgUGxhdGZvcm06OlRvdWNoRXZl
bnQmKTsKKyAgICBib29sIGRpc3BhdGNoVG91Y2hQb2ludEFzTW91c2VFdmVudFRvRnVsbFNjcmVl
blBsdWdpbihXZWJDb3JlOjpQbHVnaW5WaWV3KiwgY29uc3QgUGxhdGZvcm06OlRvdWNoUG9pbnQm
KTsKKyAgICBib29sIGRpc3BhdGNoTW91c2VFdmVudFRvRnVsbFNjcmVlblBsdWdpbihXZWJDb3Jl
OjpQbHVnaW5WaWV3KiwgY29uc3QgUGxhdGZvcm06Ok1vdXNlRXZlbnQmKTsKKworICAgIEJhY2tp
bmdTdG9yZUNsaWVudCogYmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWUoY29uc3QgV2ViQ29yZTo6
RnJhbWUqKSBjb25zdDsKKyAgICB2b2lkIGFkZEJhY2tpbmdTdG9yZUNsaWVudEZvckZyYW1lKGNv
bnN0IFdlYkNvcmU6OkZyYW1lKiwgQmFja2luZ1N0b3JlQ2xpZW50Kik7CisgICAgdm9pZCByZW1v
dmVCYWNraW5nU3RvcmVDbGllbnRGb3JGcmFtZShjb25zdCBXZWJDb3JlOjpGcmFtZSopOworCisg
ICAgLy8gQ2xlYW4gdXAgYW55IGRvY3VtZW50IHJlbGF0ZWQgZGF0YSB3ZSBtaWdodCBiZSBob2xk
aW5nLgorICAgIHZvaWQgY2xlYXJEb2N1bWVudERhdGEoY29uc3QgV2ViQ29yZTo6RG9jdW1lbnQq
KTsKKworICAgIHN0YXRpYyBXZWJDb3JlOjpSZW5kZXJMYXllciogZW5jbG9zaW5nUG9zaXRpb25l
ZEFuY2VzdG9yT3JTZWxmSWZQb3NpdGlvbmVkKFdlYkNvcmU6OlJlbmRlckxheWVyKik7CisgICAg
c3RhdGljIFdlYkNvcmU6OlJlbmRlckxheWVyKiBlbmNsb3NpbmdGaXhlZFBvc2l0aW9uZWRBbmNl
c3Rvck9yU2VsZklmRml4ZWRQb3NpdGlvbmVkKFdlYkNvcmU6OlJlbmRlckxheWVyKik7CisKKyAg
ICBzdGF0aWMgV2ViQ29yZTo6SW50U2l6ZSBkZWZhdWx0TWF4TGF5b3V0U2l6ZSgpOworCisgICAg
V2ViUGFnZSogbV93ZWJQYWdlOworICAgIFdlYlBhZ2VDbGllbnQqIG1fY2xpZW50OworICAgIFdl
YkNvcmU6OlBhZ2UqIG1fcGFnZTsKKyAgICBXZWJDb3JlOjpGcmFtZSogbV9tYWluRnJhbWU7Cisg
ICAgUmVmUHRyPFdlYkNvcmU6Ok5vZGU+IG1fY3VycmVudENvbnRleHROb2RlOworICAgIFdlYlNl
dHRpbmdzKiBtX3dlYlNldHRpbmdzOworCisjaWYgRU5BQkxFKEpBVkFTQ1JJUFRfREVCVUdHRVIp
CisgICAgT3duUHRyPFdlYkNvcmU6OkphdmFTY3JpcHREZWJ1Z2dlckJsYWNrQmVycnk+IG1fc2Ny
aXB0RGVidWdnZXI7CisjZW5kaWYKKworICAgIGJvb2wgbV92aXNpYmxlOworICAgIGJvb2wgbV9z
aG91bGRSZXNldFRpbGVzV2hlblNob3duOworICAgIGJvb2wgbV91c2VyU2NhbGFibGU7CisgICAg
Ym9vbCBtX3VzZXJQZXJmb3JtZWRNYW51YWxab29tOworICAgIGJvb2wgbV91c2VyUGVyZm9ybWVk
TWFudWFsU2Nyb2xsOworICAgIGJvb2wgbV9jb250ZW50c1NpemVDaGFuZ2VkOworICAgIGJvb2wg
bV9vdmVyZmxvd0V4Y2VlZHNDb250ZW50c1NpemU7CisgICAgYm9vbCBtX3Jlc2V0VmlydHVhbFZp
ZXdwb3J0T25Db21taXR0ZWQ7CisgICAgYm9vbCBtX3Nob3VsZFVzZUZpeGVkRGVza3RvcE1vZGU7
CisgICAgYm9vbCBtX25lZWRUb3VjaEV2ZW50czsKKyAgICBpbnQgbV9wcmV2ZW50SWRsZURpbW1p
bmdDb3VudDsKKworI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCisgICAgYm9vbCBtX3ByZXZlbnRE
ZWZhdWx0T25Ub3VjaFN0YXJ0OworI2VuZGlmCisgICAgdW5zaWduZWQgbV9uZXN0ZWRMYXlvdXRG
aW5pc2hlZENvdW50OworICAgIFdlYkNvcmU6OkludFNpemUgbV9wcmV2aW91c0NvbnRlbnRzU2l6
ZTsKKyAgICBpbnQgbV9hY3R1YWxWaXNpYmxlV2lkdGg7CisgICAgaW50IG1fYWN0dWFsVmlzaWJs
ZUhlaWdodDsKKyAgICBpbnQgbV92aXJ0dWFsVmlld3BvcnRXaWR0aDsKKyAgICBpbnQgbV92aXJ0
dWFsVmlld3BvcnRIZWlnaHQ7CisgICAgV2ViQ29yZTo6SW50U2l6ZSBtX2RlZmF1bHRMYXlvdXRT
aXplOworICAgIFdlYkNvcmU6OlZpZXdwb3J0QXJndW1lbnRzIG1fdmlld3BvcnRBcmd1bWVudHM7
IC8vIFdlIGtlZXAgdGhpcyBhcm91bmQgc2luY2Ugd2UgbWF5IG5lZWQgdG8gcmUtZXZhbHVhdGUg
dGhlIGFyZ3VtZW50cyBvbiByb3RhdGlvbi4KKyAgICBib29sIG1fZGlkUmVzdG9yZUZyb21QYWdl
Q2FjaGU7CisgICAgVmlld01vZGUgbV92aWV3TW9kZTsKKyAgICBMb2FkU3RhdGUgbV9sb2FkU3Rh
dGU7CisgICAgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgqIG1fdHJhbnNmb3JtYXRpb25N
YXRyaXg7CisgICAgQmFja2luZ1N0b3JlKiBtX2JhY2tpbmdTdG9yZTsKKyAgICBCYWNraW5nU3Rv
cmVDbGllbnQqIG1fYmFja2luZ1N0b3JlQ2xpZW50OworICAgIEluUGFnZVNlYXJjaE1hbmFnZXIq
IG1faW5QYWdlU2VhcmNoTWFuYWdlcjsKKyAgICBJbnB1dEhhbmRsZXIqIG1faW5wdXRIYW5kbGVy
OworICAgIFNlbGVjdGlvbkhhbmRsZXIqIG1fc2VsZWN0aW9uSGFuZGxlcjsKKyAgICBUb3VjaEV2
ZW50SGFuZGxlciogbV90b3VjaEV2ZW50SGFuZGxlcjsKKworI2lmIEVOQUJMRShFVkVOVF9NT0RF
X01FVEFUQUdTKQorICAgIFdlYkNvcmU6OkN1cnNvckV2ZW50TW9kZSBtX2N1cnNvckV2ZW50TW9k
ZTsKKyAgICBXZWJDb3JlOjpUb3VjaEV2ZW50TW9kZSBtX3RvdWNoRXZlbnRNb2RlOworI2VuZGlm
CisKKyAgICBQbGF0Zm9ybTo6QmxhY2tCZXJyeUN1cnNvciBtX2N1cnJlbnRDdXJzb3I7CisKKyAg
ICBEdW1wUmVuZGVyVHJlZUNsaWVudCogbV9kdW1wUmVuZGVyVHJlZTsKKworICAgIGRvdWJsZSBt
X2luaXRpYWxTY2FsZTsKKyAgICBkb3VibGUgbV9taW5pbXVtU2NhbGU7CisgICAgZG91YmxlIG1f
bWF4aW11bVNjYWxlOworCisgICAgLy8gQmxvY2sgem9vbSBhbmltYXRpb24gZGF0YS4KKyAgICBX
ZWJDb3JlOjpGbG9hdFBvaW50IG1fZmluYWxCbG9ja1BvaW50OworICAgIFdlYkNvcmU6OkZsb2F0
UG9pbnQgbV9maW5hbEJsb2NrUG9pbnRSZWZsb3dPZmZzZXQ7CisgICAgZG91YmxlIG1fYmxvY2ta
b29tRmluYWxTY2FsZTsKKyAgICBSZWZQdHI8V2ViQ29yZTo6Tm9kZT4gbV9jdXJyZW50UGluY2ha
b29tTm9kZTsKKyAgICBXZWJDb3JlOjpGbG9hdFBvaW50IG1fYW5jaG9ySW5Ob2RlUmVjdFJhdGlv
OworICAgIFJlZlB0cjxXZWJDb3JlOjpOb2RlPiBtX2N1cnJlbnRCbG9ja1pvb21Ob2RlOworICAg
IFJlZlB0cjxXZWJDb3JlOjpOb2RlPiBtX2N1cnJlbnRCbG9ja1pvb21BZGp1c3RlZE5vZGU7Cisg
ICAgYm9vbCBtX3Nob3VsZFJlZmxvd0Jsb2NrOworCisgICAgLy8gRGVsYXllZCB6b29tQWJvdXRQ
b2ludC4KKyAgICBPd25QdHI8V2ViQ29yZTo6VGltZXI8V2ViUGFnZVByaXZhdGU+ID4gbV9kZWxh
eWVkWm9vbVRpbWVyOworICAgIHN0cnVjdCB7CisgICAgICAgIGRvdWJsZSBzY2FsZTsKKyAgICAg
ICAgV2ViQ29yZTo6RmxvYXRQb2ludCBhbmNob3I7CisgICAgICAgIGJvb2wgZW5mb3JjZVNjYWxl
Q2xhbXBpbmc7CisgICAgICAgIGJvb2wgZm9yY2VSZW5kZXJpbmc7CisgICAgfSBtX2RlbGF5ZWRa
b29tQXJndW1lbnRzOworCisgICAgZG91YmxlIG1fbGFzdFVzZXJFdmVudFRpbWVzdGFtcDsgLy8g
VXNlZCB0byBkZXRlY3QgdXNlciBzY3JvbGxpbmcuCisKKyAgICBXZWJDb3JlOjpQbGF0Zm9ybU1v
dXNlRXZlbnQgbV9sYXN0TW91c2VFdmVudDsKKyAgICBib29sIG1fcGx1Z2luTW91c2VCdXR0b25Q
cmVzc2VkOyAvLyBVc2VkIHRvIHRyYWNrIG1vdXNlIGJ1dHRvbiBmb3IgZnVsbCBzY3JlZW4gcGx1
Z2lucy4KKyAgICBib29sIG1fcGx1Z2luTWF5T3Blbk5ld1RhYjsKKworICAgIFdlYkNvcmU6Okdl
b2xvY2F0aW9uQ29udHJvbGxlckNsaWVudEJsYWNrQmVycnkqIG1fZ2VvbG9jYXRpb25DbGllbnQ7
CisKKyAgICBIYXNoU2V0PFdlYkNvcmU6OlBsdWdpblZpZXcqPiBtX3BsdWdpblZpZXdzOworCisg
ICAgUmVmUHRyPFdlYkNvcmU6Ok5vZGU+IG1faW5SZWdpb25TY3JvbGxTdGFydGluZ05vZGU7CisK
KyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgYm9vbCBtX2lzQWNjZWxlcmF0
ZWRDb21wb3NpdGluZ0FjdGl2ZTsKKyAgICBPd25QdHI8RnJhbWVMYXllcnM+IG1fZnJhbWVMYXll
cnM7IC8vIFdlYktpdCB0aHJlYWQgb25seS4KKyAgICBPd25QdHI8V2ViUGFnZUNvbXBvc2l0b3I+
IG1fY29tcG9zaXRvcjsgLy8gQ29tcG9zaXRpbmcgdGhyZWFkIG9ubHkuCisgICAgT3duUHRyPFdl
YkNvcmU6OlRpbWVyPFdlYlBhZ2VQcml2YXRlPiA+IG1fcm9vdExheWVyQ29tbWl0VGltZXI7Cisg
ICAgYm9vbCBtX25lZWRzT25lU2hvdERyYXdpbmdTeW5jaHJvbml6YXRpb247CisgICAgYm9vbCBt
X25lZWRzQ29tbWl0OworICAgIGJvb2wgbV9zdXNwZW5kUm9vdExheWVyQ29tbWl0OworI2VuZGlm
CisKKyAgICBpbnQgbV9wZW5kaW5nT3JpZW50YXRpb247CisKKyAgICBSZWZQdHI8V2ViQ29yZTo6
Tm9kZT4gbV9mdWxsc2NyZWVuVmlkZW9Ob2RlOworICAgIFJlZlB0cjxXZWJDb3JlOjpQbHVnaW5W
aWV3PiBtX2Z1bGxTY3JlZW5QbHVnaW5WaWV3OworCisgICAgdHlwZWRlZiBIYXNoTWFwPGNvbnN0
IFdlYkNvcmU6OkZyYW1lKiwgQmFja2luZ1N0b3JlQ2xpZW50Kj4gQmFja2luZ1N0b3JlQ2xpZW50
Rm9yRnJhbWVNYXA7CisgICAgQmFja2luZ1N0b3JlQ2xpZW50Rm9yRnJhbWVNYXAgbV9iYWNraW5n
U3RvcmVDbGllbnRGb3JGcmFtZU1hcDsKKworICAgIC8vIFdlYlNldHRpbmdzRGVsZWdhdGUgbWV0
aG9kcy4KKyAgICB2aXJ0dWFsIHZvaWQgZGlkQ2hhbmdlU2V0dGluZ3MoV2ViU2V0dGluZ3MqKTsK
KworICAgIFJlZlB0cjxXZWJDb3JlOjpET01XcmFwcGVyV29ybGQ+IG1faXNvbGF0ZWRXb3JsZDsK
KyAgICBib29sIG1faGFzSW5SZWdpb25TY3JvbGxhYmxlQXJlYXM7CisgICAgYm9vbCBtX3VwZGF0
ZURlbGVnYXRlZE92ZXJsYXlzRGlzcGF0Y2hlZDsKK307Cit9Cit9CisKKyNlbmRpZiAvLyBXZWJQ
YWdlX3BfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>129099</attachid>
            <date>2012-02-27 14:28:43 -0800</date>
            <delta_ts>2012-02-27 17:34:34 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-74380-20120227172810.patch</filename>
            <type>text/plain</type>
            <size>41663</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA5MDIyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Js
YWNrYmVycnkvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0NoYW5nZUxvZwpp
bmRleCA0MzU5MzE5NTA0NWVlNTM5YjJjNzYwM2YwZDZlZDEwOTQ1MmI3MjhmLi45MTU5M2VjMTIz
ODRhZjFmNmQ4YjIxZGZjZjliYWI5N2ZkMzUzNzg0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
L2JsYWNrYmVycnkvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9DaGFu
Z2VMb2cKQEAgLTEsMyArMSw4MCBAQAorMjAxMi0wMi0yNyAgSmFja3kgSmlhbmcgIDx6aGFqaWFu
Z0ByaW0uY29tPgorCisgICAgICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBCbGFja0JlcnJ5IEFQ
SSB3ZWIgcGFnZSByZWxhdGVkIGZpbGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD03NDM4MAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIENsZWFuIHVwIFdlYlBhZ2Uue2gsIGNwcH0gYW5kIFdlYlBhZ2VfcC5o
LgorICAgICAgICAtIFJlbW92ZSBXZWJQYWdlOjptYWluRnJhbWUoKSBhcyBpdCBpcyBiYWQgdG8g
ZXhwb3NlIFdlYkNvcmU6OkZyYW1lIGluCisgICAgICAgICAgdGhlIHB1YmxpYyBBUEksIGFkYXB0
IHRvIHRoZSBjaGFuZ2UgYnkgYWRkaW5nIGEgbmV3IG1ldGhvZAorICAgICAgICAgIFdlYlBhZ2VQ
cml2YXRlOjpjb3JlKENvbnN0IFdlYlBhZ2UqKSBhbmQgZXhwb3NlIGl0IHRvCisgICAgICAgICAg
RHVtcFJlbmRlclRyZWVTdXBwb3J0LgorICAgICAgICAtIFJlbmFtZSBXZWJQYWdlOjpzcGVsbENo
ZWNraW5nRW5hYmxlZCB0bworICAgICAgICAgIFdlYlBhZ2U6OnNldFNwZWxsQ2hlY2tpbmdFbmFi
bGVkLgorICAgICAgICAtIFJlbW92ZSB1bnVzZWQgV2ViUGFnZTo6Zm9jdXNOb2RlUmVjdCgpLgor
ICAgICAgICAtIFJlbW92ZSBleHRyYSBibGFuayBsaW5lcy4KKyAgICAgICAgLSBQdXQgV2ViUGFn
ZSBtZXRob2RzIGFuZCB0aGVpciBhc3NvY2lhdGVkIFdlYlBhZ2VQcml2YXRlIG1ldGhvZHMKKyAg
ICAgICAgICB0b2dldGhlci4KKworICAgICAgICBObyBuZXcgdGVzdHMgYXMgdGhpcyBwYXRjaCBk
b2Vzbid0IGNoYW5nZSBiZWhhdmlvci4KKworICAgICAgICAqIEFwaS9XZWJQYWdlLmNwcDoKKyAg
ICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6V2ViUGFnZTo6V2ViUGFnZSk6CisgICAgICAgIChX
ZWJLaXQpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQYWdlOjp+V2ViUGFnZSk6
CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OldlYlBhZ2VQcml2YXRlOjpjb3JlKToKKyAg
ICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6V2ViUGFnZTo6bG9hZCk6CisgICAgICAgIChCbGFj
a0JlcnJ5OjpXZWJLaXQ6OldlYlBhZ2U6OmxvYWRFeHRlbmRlZCk6CisgICAgICAgIChCbGFja0Jl
cnJ5OjpXZWJLaXQ6OldlYlBhZ2U6OmxvYWRGaWxlKToKKyAgICAgICAgKEJsYWNrQmVycnk6Oldl
YktpdDo6V2ViUGFnZTo6ZG93bmxvYWQpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpX
ZWJQYWdlOjpsb2FkU3RyaW5nKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6V2ViUGFn
ZTo6ZXhlY3V0ZUphdmFTY3JpcHQpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQ
YWdlOjpleGVjdXRlSmF2YVNjcmlwdEluSXNvbGF0ZWRXb3JsZCk6CisgICAgICAgIChCbGFja0Jl
cnJ5OjpXZWJLaXQ6OldlYlBhZ2U6OnN0b3BMb2FkaW5nKToKKyAgICAgICAgKEJsYWNrQmVycnk6
OldlYktpdDo6V2ViUGFnZTo6cHJlcGFyZVRvRGVzdHJveSk6CisgICAgICAgIChCbGFja0JlcnJ5
OjpXZWJLaXQ6OldlYlBhZ2U6OnNldFNjcm9sbFBvc2l0aW9uKToKKyAgICAgICAgKEJsYWNrQmVy
cnk6OldlYktpdDo6V2ViUGFnZTo6c2Nyb2xsQnkpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2Vi
S2l0OjpXZWJQYWdlOjpub3RpZnlJblJlZ2lvblNjcm9sbFN0YXR1c0NoYW5nZWQpOgorICAgICAg
ICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQYWdlOjp6b29tVG9GaXRTY2FsZSk6CisgICAgICAg
IChCbGFja0JlcnJ5OjpXZWJLaXQ6OldlYlBhZ2U6OmluaXRpYWxTY2FsZSk6CisgICAgICAgIChC
bGFja0JlcnJ5OjpXZWJLaXQ6OldlYlBhZ2U6Om1heGltdW1TY2FsZSk6CisgICAgICAgIChCbGFj
a0JlcnJ5OjpXZWJLaXQ6OldlYlBhZ2U6OnNjcm9sbFBvc2l0aW9uKToKKyAgICAgICAgKEJsYWNr
QmVycnk6OldlYktpdDo6V2ViUGFnZTo6dmlld3BvcnRTaXplKToKKyAgICAgICAgKEJsYWNrQmVy
cnk6OldlYktpdDo6V2ViUGFnZTo6YWN0aXZlTm9kZUNvbnRleHQpOgorICAgICAgICAoQmxhY2tC
ZXJyeTo6V2ViS2l0OjpXZWJQYWdlOjphc3NpZ25Gb2N1cyk6CisgICAgICAgIChCbGFja0JlcnJ5
OjpXZWJLaXQ6OldlYlBhZ2U6OmJsb2NrWm9vbUFuaW1hdGlvbkZpbmlzaGVkKToKKyAgICAgICAg
KEJsYWNrQmVycnk6OldlYktpdDo6V2ViUGFnZTo6b25JbnB1dExvY2FsZUNoYW5nZWQpOgorICAg
ICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQYWdlOjpzZXRTY3JlZW5PcmllbnRhdGlvbik6
CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OldlYlBhZ2U6OmFwcGx5UGVuZGluZ09yaWVu
dGF0aW9uSWZOZWVkZWQpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQYWdlOjpz
ZXRWaWV3cG9ydFNpemUpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQYWdlOjpz
ZXREZWZhdWx0TGF5b3V0U2l6ZSk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OldlYlBh
Z2U6OnNldFNjcm9sbE9yaWdpblBvaW50KToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6
V2ViUGFnZTo6dGV4dEVuY29kaW5nKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6V2Vi
UGFnZTo6Zm9yY2VkVGV4dEVuY29kaW5nKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6
V2ViUGFnZTo6c2V0Rm9yY2VkVGV4dEVuY29kaW5nKToKKyAgICAgICAgKEJsYWNrQmVycnk6Oldl
YktpdDo6V2ViUGFnZTo6c2V0U3BlbGxDaGVja2luZ0VuYWJsZWQpOgorICAgICAgICAoQmxhY2tC
ZXJyeTo6V2ViS2l0OjpwYXJlbnRMYXllcik6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6
OldlYlBhZ2VQcml2YXRlOjppblJlZ2lvblNjcm9sbGFibGVBcmVhc0ZvclBvaW50KToKKyAgICAg
ICAgKEJsYWNrQmVycnk6OldlYktpdDo6V2ViUGFnZTo6ZGVzdHJveVdlYlBhZ2VDb21wb3NpdG9y
KToKKyAgICAgICAgKiBBcGkvV2ViUGFnZS5oOgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAg
IChXZWJLaXQpOgorICAgICAgICAqIEFwaS9XZWJQYWdlX3AuaDoKKyAgICAgICAgKFdlYkNvcmUp
OgorICAgICAgICAoV2ViS2l0KToKKyAgICAgICAgKiBXZWJLaXRTdXBwb3J0L0R1bXBSZW5kZXJU
cmVlU3VwcG9ydC5jcHA6CisgICAgICAgIChEdW1wUmVuZGVyVHJlZVN1cHBvcnQ6OmNvcmVQYWdl
KToKKyAgICAgICAgKER1bXBSZW5kZXJUcmVlU3VwcG9ydDo6bnVtYmVyT2ZQZW5kaW5nR2VvbG9j
YXRpb25QZXJtaXNzaW9uUmVxdWVzdHMpOgorICAgICAgICAoRHVtcFJlbmRlclRyZWVTdXBwb3J0
OjpyZXNldEdlb2xvY2F0aW9uTW9jayk6CisgICAgICAgIChEdW1wUmVuZGVyVHJlZVN1cHBvcnQ6
OnNldE1vY2tHZW9sb2NhdGlvbkVycm9yKToKKyAgICAgICAgKER1bXBSZW5kZXJUcmVlU3VwcG9y
dDo6c2V0TW9ja0dlb2xvY2F0aW9uUGVybWlzc2lvbik6CisgICAgICAgIChEdW1wUmVuZGVyVHJl
ZVN1cHBvcnQ6OnNldE1vY2tHZW9sb2NhdGlvblBvc2l0aW9uKToKKyAgICAgICAgKER1bXBSZW5k
ZXJUcmVlU3VwcG9ydDo6c2NhbGVQYWdlQnkpOgorICAgICAgICAqIFdlYktpdFN1cHBvcnQvRHVt
cFJlbmRlclRyZWVTdXBwb3J0Lmg6CisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKER1bXBS
ZW5kZXJUcmVlU3VwcG9ydCk6CisKIDIwMTItMDItMjcgIE1pa2UgRmVudG9uICA8bWlmZW50b25A
cmltLmNvbT4KIAogICAgICAgICBbQmxhY2tCZXJyeV0gU2VsZWN0aW9uIGhhbmRsaW5nIHNob3Vs
ZCBiZSBlbnRpcmVseSBkaXJlY3Rpb25hbApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9ibGFj
a2JlcnJ5L0FwaS9XZWJQYWdlLmNwcCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvV2Vi
UGFnZS5jcHAKaW5kZXggZjNjZTVmMGNlNmVhYTNmOGY3NTQzZGY1Zjg3MTg5N2ZhMDIwNTZiMi4u
Yzg0ZjlhMjgwYTE0ZmFjM2FkMTgyNDYwOWEwYTY2NDk4ZTExYzRjZSAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9XZWJQYWdlLmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0
L2JsYWNrYmVycnkvQXBpL1dlYlBhZ2UuY3BwCkBAIC0zMzAsNiArMzMwLDEzIEBAIFdlYlBhZ2VQ
cml2YXRlOjpXZWJQYWdlUHJpdmF0ZShXZWJQYWdlKiB3ZWJQYWdlLCBXZWJQYWdlQ2xpZW50KiBj
bGllbnQsIGNvbnN0IEluCiB7CiB9CiAKK1dlYlBhZ2U6OldlYlBhZ2UoV2ViUGFnZUNsaWVudCog
Y2xpZW50LCBjb25zdCBXZWJTdHJpbmcmIHBhZ2VHcm91cE5hbWUsIGNvbnN0IFBsYXRmb3JtOjpJ
bnRSZWN0JiByZWN0KQoreworICAgIGdsb2JhbEluaXRpYWxpemUoKTsKKyAgICBkID0gbmV3IFdl
YlBhZ2VQcml2YXRlKHRoaXMsIGNsaWVudCwgcmVjdCk7CisgICAgZC0+aW5pdChwYWdlR3JvdXBO
YW1lKTsKK30KKwogV2ViUGFnZVByaXZhdGU6On5XZWJQYWdlUHJpdmF0ZSgpCiB7CiAgICAgLy8g
SGFuZCB0aGUgYmFja2luZ3N0b3JlIGJhY2sgdG8gYW5vdGhlciBvd25lciBpZiBuZWNlc3Nhcnku
CkBAIC0zNjgsNiArMzc1LDE3IEBAIFdlYlBhZ2VQcml2YXRlOjp+V2ViUGFnZVByaXZhdGUoKQog
I2VuZGlmCiB9CiAKK1dlYlBhZ2U6On5XZWJQYWdlKCkKK3sKKyAgICBkZWxldGUgZDsKKyAgICBk
ID0gMDsKK30KKworUGFnZSogV2ViUGFnZVByaXZhdGU6OmNvcmUoY29uc3QgV2ViUGFnZSogd2Vi
UGFnZSkKK3sKKyAgICByZXR1cm4gd2ViUGFnZS0+ZC0+bV9wYWdlOworfQorCiB2b2lkIFdlYlBh
Z2VQcml2YXRlOjppbml0KGNvbnN0IFdlYlN0cmluZyYgcGFnZUdyb3VwTmFtZSkKIHsKICAgICBD
aHJvbWVDbGllbnRCbGFja0JlcnJ5KiBjaHJvbWVDbGllbnQgPSBuZXcgQ2hyb21lQ2xpZW50Qmxh
Y2tCZXJyeSh0aGlzKTsKQEAgLTUwNyw2ICs1MjUsMzIgQEAgdm9pZCBXZWJQYWdlUHJpdmF0ZTo6
bG9hZChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIqIG5ldHdvcmtUb2tlbiwgY29uc3QgY2hh
cioKICAgICBtX21haW5GcmFtZS0+bG9hZGVyKCktPmxvYWQocmVxdWVzdCwgIiIgLyogbmFtZSAq
LywgZmFsc2UpOwogfQogCit2b2lkIFdlYlBhZ2U6OmxvYWQoY29uc3QgY2hhciogdXJsLCBjb25z
dCBjaGFyKiBuZXR3b3JrVG9rZW4sIGJvb2wgaXNJbml0aWFsKQoreworICAgIGQtPmxvYWQodXJs
LCBuZXR3b3JrVG9rZW4sICJHRVQiLCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OlVzZVByb3Rv
Y29sQ2FjaGVQb2xpY3ksIDAsIDAsIDAsIDAsIGlzSW5pdGlhbCwgZmFsc2UpOworfQorCit2b2lk
IFdlYlBhZ2U6OmxvYWRFeHRlbmRlZChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIqIG5ldHdv
cmtUb2tlbiwgY29uc3QgY2hhciogbWV0aG9kLCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3Q6OkNh
Y2hlUG9saWN5IGNhY2hlUG9saWN5LCBjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgZGF0YUxlbmd0
aCwgY29uc3QgY2hhciogY29uc3QqIGhlYWRlcnMsIHNpemVfdCBoZWFkZXJzTGVuZ3RoLCBib29s
IG11c3RIYW5kbGVJbnRlcm5hbGx5KQoreworICAgIGQtPmxvYWQodXJsLCBuZXR3b3JrVG9rZW4s
IG1ldGhvZCwgY2FjaGVQb2xpY3ksIGRhdGEsIGRhdGFMZW5ndGgsIGhlYWRlcnMsIGhlYWRlcnNM
ZW5ndGgsIGZhbHNlLCBtdXN0SGFuZGxlSW50ZXJuYWxseSwgZmFsc2UsICIiKTsKK30KKwordm9p
ZCBXZWJQYWdlOjpsb2FkRmlsZShjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyKiBvdmVycmlk
ZUNvbnRlbnRUeXBlKQoreworICAgIHN0ZDo6c3RyaW5nIGZpbGVVcmwocGF0aCk7CisgICAgaWYg
KCFmaWxlVXJsLmZpbmQoIi8iKSkKKyAgICAgICAgZmlsZVVybC5pbnNlcnQoMCwgImZpbGU6Ly8i
KTsKKyAgICBlbHNlIGlmIChmaWxlVXJsLmZpbmQoImZpbGU6Ly8vIikpCisgICAgICAgIHJldHVy
bjsKKworICAgIGQtPmxvYWQoZmlsZVVybC5jX3N0cigpLCAwLCAiR0VUIiwgUGxhdGZvcm06Ok5l
dHdvcmtSZXF1ZXN0OjpVc2VQcm90b2NvbENhY2hlUG9saWN5LCAwLCAwLCAwLCAwLCBmYWxzZSwg
ZmFsc2UsIGZhbHNlLCBvdmVycmlkZUNvbnRlbnRUeXBlKTsKK30KKwordm9pZCBXZWJQYWdlOjpk
b3dubG9hZChjb25zdCBQbGF0Zm9ybTo6TmV0d29ya1JlcXVlc3QmIHJlcXVlc3QpCit7CisgICAg
ZC0+bG9hZChyZXF1ZXN0LmdldFVybFJlZigpLmNfc3RyKCksIDAsICJHRVQiLCBQbGF0Zm9ybTo6
TmV0d29ya1JlcXVlc3Q6OlVzZVByb3RvY29sQ2FjaGVQb2xpY3ksIDAsIDAsIDAsIDAsIGZhbHNl
LCBmYWxzZSwgdHJ1ZSwgIiIpOworfQorCiB2b2lkIFdlYlBhZ2VQcml2YXRlOjpsb2FkU3RyaW5n
KGNvbnN0IGNoYXIqIHN0cmluZywgY29uc3QgY2hhciogYmFzZVVSTCwgY29uc3QgY2hhciogY29u
dGVudFR5cGUsIGNvbnN0IGNoYXIqIGZhaWxpbmdVUkwpCiB7CiAgICAgS1VSTCBrdXJsID0gcGFy
c2VVcmwoYmFzZVVSTCk7CkBAIC01MjAsNiArNTY0LDExIEBAIHZvaWQgV2ViUGFnZVByaXZhdGU6
OmxvYWRTdHJpbmcoY29uc3QgY2hhciogc3RyaW5nLCBjb25zdCBjaGFyKiBiYXNlVVJMLCBjb25z
dCBjCiAgICAgbV9tYWluRnJhbWUtPmxvYWRlcigpLT5sb2FkKHJlcXVlc3QsIHN1YnN0aXR1dGVE
YXRhLCBmYWxzZSk7CiB9CiAKK3ZvaWQgV2ViUGFnZTo6bG9hZFN0cmluZyhjb25zdCBjaGFyKiBz
dHJpbmcsIGNvbnN0IGNoYXIqIGJhc2VVUkwsIGNvbnN0IGNoYXIqIG1pbWVUeXBlLCBjb25zdCBj
aGFyKiBmYWlsaW5nVVJMKQoreworICAgIGQtPmxvYWRTdHJpbmcoc3RyaW5nLCBiYXNlVVJMLCBt
aW1lVHlwZSwgZmFpbGluZ1VSTCk7Cit9CisKIGJvb2wgV2ViUGFnZVByaXZhdGU6OmV4ZWN1dGVK
YXZhU2NyaXB0KGNvbnN0IGNoYXIqIHNjcmlwdCwgSmF2YVNjcmlwdERhdGFUeXBlJiByZXR1cm5U
eXBlLCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKQogewogICAgIFNjcmlwdFZhbHVlIHJlc3VsdCA9
IG1fbWFpbkZyYW1lLT5zY3JpcHQoKS0+ZXhlY3V0ZVNjcmlwdChTdHJpbmc6OmZyb21VVEY4KHNj
cmlwdCksIGZhbHNlKTsKQEAgLTU2NCw2ICs2MTMsMTEgQEAgYm9vbCBXZWJQYWdlUHJpdmF0ZTo6
ZXhlY3V0ZUphdmFTY3JpcHQoY29uc3QgY2hhciogc2NyaXB0LCBKYXZhU2NyaXB0RGF0YVR5cGUm
IHIKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBXZWJQYWdlOjpleGVjdXRlSmF2YVNjcmlw
dChjb25zdCBjaGFyKiBzY3JpcHQsIEphdmFTY3JpcHREYXRhVHlwZSYgcmV0dXJuVHlwZSwgV2Vi
U3RyaW5nJiByZXR1cm5WYWx1ZSkKK3sKKyAgICByZXR1cm4gZC0+ZXhlY3V0ZUphdmFTY3JpcHQo
c2NyaXB0LCByZXR1cm5UeXBlLCByZXR1cm5WYWx1ZSk7Cit9CisKIGJvb2wgV2ViUGFnZVByaXZh
dGU6OmV4ZWN1dGVKYXZhU2NyaXB0SW5Jc29sYXRlZFdvcmxkKGNvbnN0IFNjcmlwdFNvdXJjZUNv
ZGUmIHNvdXJjZUNvZGUsIEphdmFTY3JpcHREYXRhVHlwZSYgcmV0dXJuVHlwZSwgV2ViU3RyaW5n
JiByZXR1cm5WYWx1ZSkKIHsKICAgICBpZiAoIW1faXNvbGF0ZWRXb3JsZCkKQEAgLTYxMiw2ICs2
NjYsMzMgQEAgYm9vbCBXZWJQYWdlUHJpdmF0ZTo6ZXhlY3V0ZUphdmFTY3JpcHRJbklzb2xhdGVk
V29ybGQoY29uc3QgU2NyaXB0U291cmNlQ29kZSYgc28KICAgICByZXR1cm4gdHJ1ZTsKIH0KIAor
Ym9vbCBXZWJQYWdlOjpleGVjdXRlSmF2YVNjcmlwdEluSXNvbGF0ZWRXb3JsZChjb25zdCBzdGQ6
OndzdHJpbmcmIHNjcmlwdCwgSmF2YVNjcmlwdERhdGFUeXBlJiByZXR1cm5UeXBlLCBXZWJTdHJp
bmcmIHJldHVyblZhbHVlKQoreworICAgIC8vIE9uIG91ciBwbGF0Zm9ybSB3Y2hhcl90IGlzIHVu
c2lnbmVkIGludCBhbmQgVUNoYXIgaXMgdW5zaWduZWQgc2hvcnQKKyAgICAvLyBzbyB3ZSBoYXZl
IHRvIGNvbnZlcnQgdXNpbmcgSUNVIGNvbnZlcnNpb24gZnVuY3Rpb24KKyAgICBpbnQgbGVuZ3Ro
Q29waWVkID0gMDsKKyAgICBVRXJyb3JDb2RlIGVycm9yID0gVV9aRVJPX0VSUk9SOworICAgIGNv
bnN0IGludCBsZW5ndGggPSBzY3JpcHQubGVuZ3RoKCkgKyAxIC8qbnVsbCB0ZXJtaW5hdGlvbiBj
aGFyKi87CisgICAgVUNoYXIgZGF0YVtsZW5ndGhdOworCisgICAgLy8gRklYTUU6IFBSIDEzODE2
MiBpcyBnaXZpbmcgVV9JTlZBTElEX0NIQVJfRk9VTkQgZXJyb3IuCisgICAgdV9zdHJGcm9tVVRG
MzIoZGF0YSwgbGVuZ3RoLCAmbGVuZ3RoQ29waWVkLCByZWludGVycHJldF9jYXN0PGNvbnN0IFVD
aGFyMzIqPihzY3JpcHQuY19zdHIoKSksIHNjcmlwdC5sZW5ndGgoKSwgJmVycm9yKTsKKyAgICBC
TEFDS0JFUlJZX0FTU0VSVChlcnJvciA9PSBVX1pFUk9fRVJST1IpOworICAgIGlmIChlcnJvciAh
PSBVX1pFUk9fRVJST1IpIHsKKyAgICAgICAgUGxhdGZvcm06OmxvZ0Fsd2F5cyhQbGF0Zm9ybTo6
TG9nTGV2ZWxDcml0aWNhbCwgIldlYlBhZ2U6OmV4ZWN1dGVKYXZhU2NyaXB0SW5Jc29sYXRlZFdv
cmxkIGZhaWxlZCB0byBjb252ZXJ0IFVURjE2IHRvIEphdmFTY3JpcHQhIik7CisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9CisgICAgU3RyaW5nIHN0ciA9IFN0cmluZyhkYXRhLCBsZW5ndGhD
b3BpZWQpOworICAgIFNjcmlwdFNvdXJjZUNvZGUgc291cmNlQ29kZShzdHIsIEtVUkwoKSk7Cisg
ICAgcmV0dXJuIGQtPmV4ZWN1dGVKYXZhU2NyaXB0SW5Jc29sYXRlZFdvcmxkKHNvdXJjZUNvZGUs
IHJldHVyblR5cGUsIHJldHVyblZhbHVlKTsKK30KKworYm9vbCBXZWJQYWdlOjpleGVjdXRlSmF2
YVNjcmlwdEluSXNvbGF0ZWRXb3JsZChjb25zdCBjaGFyKiBzY3JpcHQsIEphdmFTY3JpcHREYXRh
VHlwZSYgcmV0dXJuVHlwZSwgV2ViU3RyaW5nJiByZXR1cm5WYWx1ZSkKK3sKKyAgICBTY3JpcHRT
b3VyY2VDb2RlIHNvdXJjZUNvZGUoU3RyaW5nOjpmcm9tVVRGOChzY3JpcHQpLCBLVVJMKCkpOwor
ICAgIHJldHVybiBkLT5leGVjdXRlSmF2YVNjcmlwdEluSXNvbGF0ZWRXb3JsZChzb3VyY2VDb2Rl
LCByZXR1cm5UeXBlLCByZXR1cm5WYWx1ZSk7Cit9CisKIHZvaWQgV2ViUGFnZVByaXZhdGU6OnN0
b3BDdXJyZW50TG9hZCgpCiB7CiAgICAgLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgY29udGFpbiBh
bGwgY29tbW9uIGNvZGUgdHJpZ2dlcmVkIGJ5IFdlYlBhZ2U6OmxvYWQKQEAgLTYyNiw2ICs3MDcs
MTEgQEAgdm9pZCBXZWJQYWdlUHJpdmF0ZTo6c3RvcEN1cnJlbnRMb2FkKCkKICAgICBmcmFtZUxv
YWRlckNsaWVudC0+c2V0RGVmZXJyZWRNYW51YWxTY3JpcHQoS1VSTCgpKTsKIH0KIAordm9pZCBX
ZWJQYWdlOjpzdG9wTG9hZGluZygpCit7CisgICAgZC0+c3RvcEN1cnJlbnRMb2FkKCk7Cit9CisK
IHN0YXRpYyB2b2lkIGNsb3NlVVJMUmVjdXJzaXZlbHkoRnJhbWUqIGZyYW1lKQogewogICAgIC8v
IERvIG5vdCBjcmVhdGUgbW9yZSBmcmFtZSBwbGVhc2UuCkBAIC02NTIsNiArNzM4LDExIEBAIHZv
aWQgV2ViUGFnZVByaXZhdGU6OnByZXBhcmVUb0Rlc3Ryb3koKQogICAgIGNsb3NlVVJMUmVjdXJz
aXZlbHkobV9tYWluRnJhbWUpOwogfQogCit2b2lkIFdlYlBhZ2U6OnByZXBhcmVUb0Rlc3Ryb3ko
KQoreworICAgIGQtPnByZXBhcmVUb0Rlc3Ryb3koKTsKK30KKwogdm9pZCBXZWJQYWdlUHJpdmF0
ZTo6c2V0TG9hZFN0YXRlKExvYWRTdGF0ZSBzdGF0ZSkKIHsKICAgICBpZiAobV9sb2FkU3RhdGUg
PT0gc3RhdGUpCkBAIC0xMDI4LDYgKzExMTksMjQgQEAgdm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0
U2Nyb2xsUG9zaXRpb24oY29uc3QgSW50UG9pbnQmIHBvcykKICAgICBtX2JhY2tpbmdTdG9yZUNs
aWVudC0+c2V0U2Nyb2xsUG9zaXRpb24ocG9zKTsKIH0KIAorLy8gU2V0dGluZyB0aGUgc2Nyb2xs
IHBvc2l0aW9uIGlzIGluIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgordm9pZCBXZWJQYWdlOjpz
ZXRTY3JvbGxQb3NpdGlvbihjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIHBvaW50KQoreworICAg
IGlmIChkLT50cmFuc2Zvcm1lZFBvaW50RXF1YWxzVW50cmFuc2Zvcm1lZFBvaW50KHBvaW50LCBk
LT5zY3JvbGxQb3NpdGlvbigpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSWYgdGhlIHVz
ZXIgcmVjZW50bHkgcGVyZm9ybWVkIGFuIGV2ZW50LCB0aGlzIG5ldyBzY3JvbGwgcG9zaXRpb24K
KyAgICAvLyBjb3VsZCBwb3NzaWJseSBiZSBhIHJlc3VsdCBvZiB0aGF0LiBPciBub3QsIHRoaXMg
aXMganVzdCBhIGhldXJpc3RpYy4KKyAgICBpZiAoY3VycmVudFRpbWUoKSAtIGQtPm1fbGFzdFVz
ZXJFdmVudFRpbWVzdGFtcCA8IG1hbnVhbFNjcm9sbEludGVydmFsKQorICAgICAgICBkLT5tX3Vz
ZXJQZXJmb3JtZWRNYW51YWxTY3JvbGwgPSB0cnVlOworCisgICAgZC0+bV9iYWNraW5nU3RvcmVD
bGllbnQtPnNldElzQ2xpZW50R2VuZXJhdGVkU2Nyb2xsKHRydWUpOworICAgIGQtPm1fbWFpbkZy
YW1lLT52aWV3KCktPnNldENhbk92ZXJzY3JvbGwodHJ1ZSk7CisgICAgZC0+c2V0U2Nyb2xsUG9z
aXRpb24oZC0+bWFwRnJvbVRyYW5zZm9ybWVkKHBvaW50KSk7CisgICAgZC0+bV9tYWluRnJhbWUt
PnZpZXcoKS0+c2V0Q2FuT3ZlcnNjcm9sbChmYWxzZSk7CisgICAgZC0+bV9iYWNraW5nU3RvcmVD
bGllbnQtPnNldElzQ2xpZW50R2VuZXJhdGVkU2Nyb2xsKGZhbHNlKTsKK30KKwogYm9vbCBXZWJQ
YWdlUHJpdmF0ZTo6c2hvdWxkU2VuZFJlc2l6ZUV2ZW50KCkKIHsKICAgICBpZiAoIW1fbWFpbkZy
YW1lLT5kb2N1bWVudCgpKQpAQCAtMTA2NiwxNCArMTE3NSw2IEBAIHZvaWQgV2ViUGFnZVByaXZh
dGU6OmRpZFJlc3VtZUxvYWRpbmcoKQogICAgIG1fY2xpZW50LT5kaWRSZXN1bWVMb2FkaW5nKCk7
CiB9CiAKLWJvb2wgV2ViUGFnZTo6c2Nyb2xsQnkoY29uc3QgUGxhdGZvcm06OkludFNpemUmIGRl
bHRhLCBib29sIHNjcm9sbE1haW5GcmFtZSkKLXsKLSAgICBkLT5tX2JhY2tpbmdTdG9yZUNsaWVu
dC0+c2V0SXNDbGllbnRHZW5lcmF0ZWRTY3JvbGwodHJ1ZSk7Ci0gICAgYm9vbCBiID0gZC0+c2Ny
b2xsQnkoZGVsdGEud2lkdGgoKSwgZGVsdGEuaGVpZ2h0KCksIHNjcm9sbE1haW5GcmFtZSk7Ci0g
ICAgZC0+bV9iYWNraW5nU3RvcmVDbGllbnQtPnNldElzQ2xpZW50R2VuZXJhdGVkU2Nyb2xsKGZh
bHNlKTsKLSAgICByZXR1cm4gYjsKLX0KLQogYm9vbCBXZWJQYWdlUHJpdmF0ZTo6c2Nyb2xsQnko
aW50IGRlbHRhWCwgaW50IGRlbHRhWSwgYm9vbCBzY3JvbGxNYWluRnJhbWUpCiB7CiAgICAgSW50
U2l6ZSBkZWx0YShkZWx0YVgsIGRlbHRhWSk7CkBAIC0xMTA0LDkgKzEyMDUsMTIgQEAgYm9vbCBX
ZWJQYWdlUHJpdmF0ZTo6c2Nyb2xsQnkoaW50IGRlbHRhWCwgaW50IGRlbHRhWSwgYm9vbCBzY3Jv
bGxNYWluRnJhbWUpCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgV2ViUGFnZTo6bm90aWZ5
SW5SZWdpb25TY3JvbGxTdGF0dXNDaGFuZ2VkKGJvb2wgc3RhdHVzKQorYm9vbCBXZWJQYWdlOjpz
Y3JvbGxCeShjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYgZGVsdGEsIGJvb2wgc2Nyb2xsTWFpbkZy
YW1lKQogewotICAgIGQtPm5vdGlmeUluUmVnaW9uU2Nyb2xsU3RhdHVzQ2hhbmdlZChzdGF0dXMp
OworICAgIGQtPm1fYmFja2luZ1N0b3JlQ2xpZW50LT5zZXRJc0NsaWVudEdlbmVyYXRlZFNjcm9s
bCh0cnVlKTsKKyAgICBib29sIGIgPSBkLT5zY3JvbGxCeShkZWx0YS53aWR0aCgpLCBkZWx0YS5o
ZWlnaHQoKSwgc2Nyb2xsTWFpbkZyYW1lKTsKKyAgICBkLT5tX2JhY2tpbmdTdG9yZUNsaWVudC0+
c2V0SXNDbGllbnRHZW5lcmF0ZWRTY3JvbGwoZmFsc2UpOworICAgIHJldHVybiBiOwogfQogCiB2
b2lkIFdlYlBhZ2VQcml2YXRlOjpub3RpZnlJblJlZ2lvblNjcm9sbFN0YXR1c0NoYW5nZWQoYm9v
bCBzdGF0dXMpCkBAIC0xMTE3LDYgKzEyMjEsMTEgQEAgdm9pZCBXZWJQYWdlUHJpdmF0ZTo6bm90
aWZ5SW5SZWdpb25TY3JvbGxTdGF0dXNDaGFuZ2VkKGJvb2wgc3RhdHVzKQogICAgIH0KIH0KIAor
dm9pZCBXZWJQYWdlOjpub3RpZnlJblJlZ2lvblNjcm9sbFN0YXR1c0NoYW5nZWQoYm9vbCBzdGF0
dXMpCit7CisgICAgZC0+bm90aWZ5SW5SZWdpb25TY3JvbGxTdGF0dXNDaGFuZ2VkKHN0YXR1cyk7
Cit9CisKIHZvaWQgV2ViUGFnZVByaXZhdGU6OmVucXVldWVSZW5kZXJpbmdPZkNsaXBwZWRDb250
ZW50T2ZTY3JvbGxhYmxlTm9kZUFmdGVySW5SZWdpb25TY3JvbGxpbmcoTm9kZSogc2Nyb2xsZWRO
b2RlKQogewogICAgIEFTU0VSVChzY3JvbGxlZE5vZGUpOwpAQCAtMTM5OSw2ICsxNTA4LDExIEBA
IGRvdWJsZSBXZWJQYWdlUHJpdmF0ZTo6em9vbVRvRml0U2NhbGUoKSBjb25zdAogICAgIHJldHVy
biBjb250ZW50V2lkdGggPiAwLjAgPyBzdGF0aWNfY2FzdDxkb3VibGU+KG1fYWN0dWFsVmlzaWJs
ZVdpZHRoKSAvIGNvbnRlbnRXaWR0aCA6IDEuMDsKIH0KIAorZG91YmxlIFdlYlBhZ2U6Onpvb21U
b0ZpdFNjYWxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+em9vbVRvRml0U2NhbGUoKTsKK30K
KwogZG91YmxlIFdlYlBhZ2VQcml2YXRlOjppbml0aWFsU2NhbGUoKSBjb25zdAogewogICAgIGlm
IChtX2luaXRpYWxTY2FsZSA+IDAuMCkKQEAgLTE0MTAsNiArMTUyNCwxMSBAQCBkb3VibGUgV2Vi
UGFnZVByaXZhdGU6OmluaXRpYWxTY2FsZSgpIGNvbnN0CiAgICAgcmV0dXJuIDEuMDsKIH0KIAor
ZG91YmxlIFdlYlBhZ2U6OmluaXRpYWxTY2FsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmlu
aXRpYWxTY2FsZSgpOworfQorCiB2b2lkIFdlYlBhZ2U6OmluaXRpYWxpemVJY29uRGF0YUJhc2Uo
KQogewogICAgIEljb25EYXRhYmFzZUNsaWVudEJsYWNrQmVycnk6OmdldEluc3RhbmNlKCktPmlu
aXRJY29uRGF0YWJhc2UoZC0+bV93ZWJTZXR0aW5ncyk7CkBAIC0xNDI1LDE2ICsxNTQ0LDYgQEAg
ZG91YmxlIFdlYlBhZ2U6OmN1cnJlbnRTY2FsZSgpIGNvbnN0CiAgICAgcmV0dXJuIGQtPmN1cnJl
bnRTY2FsZSgpOwogfQogCi1kb3VibGUgV2ViUGFnZTo6aW5pdGlhbFNjYWxlKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gZC0+aW5pdGlhbFNjYWxlKCk7Ci19Ci0KLWRvdWJsZSBXZWJQYWdlOjp6b29t
VG9GaXRTY2FsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGQtPnpvb21Ub0ZpdFNjYWxlKCk7Ci19
Ci0KIHZvaWQgV2ViUGFnZTo6c2V0SW5pdGlhbFNjYWxlKGRvdWJsZSBpbml0aWFsU2NhbGUpCiB7
CiAgICAgZC0+c2V0SW5pdGlhbFNjYWxlKGluaXRpYWxTY2FsZSk7CkBAIC0xNDUwLDExICsxNTU5
LDYgQEAgdm9pZCBXZWJQYWdlOjpzZXRNaW5pbXVtU2NhbGUoZG91YmxlIG1pbmltdW1TY2FsZSkK
ICAgICBkLT5zZXRNaW5pbXVtU2NhbGUobWluaW11bVNjYWxlKTsKIH0KIAotZG91YmxlIFdlYlBh
Z2U6Om1heGltdW1TY2FsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGQtPm1heGltdW1TY2FsZSgp
OwotfQotCiB2b2lkIFdlYlBhZ2U6OnNldE1heGltdW1TY2FsZShkb3VibGUgbWF4aW11bVNjYWxl
KQogewogICAgIGQtPnNldE1heGltdW1TY2FsZShtYXhpbXVtU2NhbGUpOwpAQCAtMTQ2OCw2ICsx
NTcyLDExIEBAIGRvdWJsZSBXZWJQYWdlUHJpdmF0ZTo6bWF4aW11bVNjYWxlKCkgY29uc3QKICAg
ICByZXR1cm4gaGFzVmlydHVhbFZpZXdwb3J0KCkgPyBzdGQ6Om1heDxkb3VibGU+KHpvb21Ub0Zp
dFNjYWxlKCksIDQuMCkgOiA0LjA7CiB9CiAKK2RvdWJsZSBXZWJQYWdlOjptYXhpbXVtU2NhbGUo
KSBjb25zdAoreworICAgIHJldHVybiBkLT5tYXhpbXVtU2NhbGUoKTsKK30KKwogdm9pZCBXZWJQ
YWdlUHJpdmF0ZTo6cmVzZXRTY2FsZXMoKQogewogICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGlk
ZW50aXR5OwpAQCAtMTQ4Niw2ICsxNTk1LDEyIEBAIEludFBvaW50IFdlYlBhZ2VQcml2YXRlOjp0
cmFuc2Zvcm1lZFNjcm9sbFBvc2l0aW9uKCkgY29uc3QKICAgICByZXR1cm4gbV9iYWNraW5nU3Rv
cmVDbGllbnQtPnRyYW5zZm9ybWVkU2Nyb2xsUG9zaXRpb24oKTsKIH0KIAorLy8gUmV0dXJuZWQg
c2Nyb2xsIHBvc2l0aW9uIGlzIGluIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgorUGxhdGZvcm06
OkludFBvaW50IFdlYlBhZ2U6OnNjcm9sbFBvc2l0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
ZC0+dHJhbnNmb3JtZWRTY3JvbGxQb3NpdGlvbigpOworfQorCiBJbnRQb2ludCBXZWJQYWdlUHJp
dmF0ZTo6dHJhbnNmb3JtZWRNYXhpbXVtU2Nyb2xsUG9zaXRpb24oKSBjb25zdAogewogICAgIHJl
dHVybiBtX2JhY2tpbmdTdG9yZUNsaWVudC0+dHJhbnNmb3JtZWRNYXhpbXVtU2Nyb2xsUG9zaXRp
b24oKTsKQEAgLTE0OTYsNiArMTYxMSwxMSBAQCBJbnRTaXplIFdlYlBhZ2VQcml2YXRlOjp0cmFu
c2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKCkgY29uc3QKICAgICByZXR1cm4gSW50U2l6ZShtX2Fj
dHVhbFZpc2libGVXaWR0aCwgbV9hY3R1YWxWaXNpYmxlSGVpZ2h0KTsKIH0KIAorUGxhdGZvcm06
OkludFNpemUgV2ViUGFnZTo6dmlld3BvcnRTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+
dHJhbnNmb3JtZWRBY3R1YWxWaXNpYmxlU2l6ZSgpOworfQorCiBJbnRTaXplIFdlYlBhZ2VQcml2
YXRlOjp0cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIFBsYXRm
b3JtOjpHcmFwaGljczo6U2NyZWVuOjpzaXplKCk7CkBAIC0xOTQ3LDYgKzIwNjcsMTEgQEAgQWN0
aXZlTm9kZUNvbnRleHQgV2ViUGFnZVByaXZhdGU6OmFjdGl2ZU5vZGVDb250ZXh0KFRhcmdldERl
dGVjdGlvblN0cmF0ZWd5IHN0cmEKICAgICByZXR1cm4gY29udGV4dDsKIH0KIAorQWN0aXZlTm9k
ZUNvbnRleHQgV2ViUGFnZTo6YWN0aXZlTm9kZUNvbnRleHQoVGFyZ2V0RGV0ZWN0aW9uU3RyYXRl
Z3kgc3RyYXRlZ3kpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmFjdGl2ZU5vZGVDb250ZXh0KHN0
cmF0ZWd5KTsKK30KKwogdm9pZCBXZWJQYWdlUHJpdmF0ZTo6dXBkYXRlQ3Vyc29yKCkKIHsKICAg
ICBpbnQgYnV0dG9uTWFzayA9IDA7CkBAIC0yMTg5LDExICsyMzE0LDYgQEAgSW50UmVjdCBXZWJQ
YWdlUHJpdmF0ZTo6Z2V0UmVjdXJzaXZlVmlzaWJsZVdpbmRvd1JlY3QoU2Nyb2xsVmlldyogdmll
dywgYm9vbCBub0MKICAgICByZXR1cm4gdmlzaWJsZVdpbmRvd1JlY3Q7CiB9CiAKLXZvaWQgV2Vi
UGFnZTo6YXNzaWduRm9jdXMoUGxhdGZvcm06OkZvY3VzRGlyZWN0aW9uIGRpcmVjdGlvbikKLXsK
LSAgICBkLT5hc3NpZ25Gb2N1cyhkaXJlY3Rpb24pOwotfQotCiB2b2lkIFdlYlBhZ2VQcml2YXRl
Ojphc3NpZ25Gb2N1cyhQbGF0Zm9ybTo6Rm9jdXNEaXJlY3Rpb24gZGlyZWN0aW9uKQogewogICAg
IEFTU0VSVCgoaW50KSBQbGF0Zm9ybTo6Rm9jdXNEaXJlY3Rpb25Ob25lID09IChpbnQpIEZvY3Vz
RGlyZWN0aW9uTm9uZSk7CkBAIC0yMjE3LDYgKzIzMzcsMTEgQEAgdm9pZCBXZWJQYWdlUHJpdmF0
ZTo6YXNzaWduRm9jdXMoUGxhdGZvcm06OkZvY3VzRGlyZWN0aW9uIGRpcmVjdGlvbikKICAgICB9
CiB9CiAKK3ZvaWQgV2ViUGFnZTo6YXNzaWduRm9jdXMoUGxhdGZvcm06OkZvY3VzRGlyZWN0aW9u
IGRpcmVjdGlvbikKK3sKKyAgICBkLT5hc3NpZ25Gb2N1cyhkaXJlY3Rpb24pOworfQorCiBQbGF0
Zm9ybTo6SW50UmVjdCBXZWJQYWdlUHJpdmF0ZTo6Zm9jdXNOb2RlUmVjdCgpCiB7CiAgICAgRnJh
bWUqIGZyYW1lID0gZm9jdXNlZE9yTWFpbkZyYW1lKCk7CkBAIC0yNTYzLDExICsyNjg4LDYgQEAg
SW50UmVjdCBXZWJQYWdlUHJpdmF0ZTo6YmxvY2tab29tUmVjdEZvck5vZGUoTm9kZSogbm9kZSkK
ICAgICByZXR1cm4gYmxvY2tSZWN0OwogfQogCi12b2lkIFdlYlBhZ2U6OmJsb2NrWm9vbUFuaW1h
dGlvbkZpbmlzaGVkKCkKLXsKLSAgICBkLT56b29tQmxvY2soKTsKLX0KLQogLy8gVGhpcyBmdW5j
dGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4KIC8vIEl0IGlzIGNhbGxlZCBhZnRl
ciB0aGUgYW5pbWF0aW9uIGVuZHMgKHNlZSBhYm92ZSkuCiB2b2lkIFdlYlBhZ2VQcml2YXRlOjp6
b29tQmxvY2soKQpAQCAtMjY0OSw2ICsyNzY5LDEwIEBAIHZvaWQgV2ViUGFnZVByaXZhdGU6Onpv
b21CbG9jaygpCiAgICAgbV9jbGllbnQtPnpvb21DaGFuZ2VkKG1fd2ViUGFnZS0+aXNNaW5ab29t
ZWQoKSwgbV93ZWJQYWdlLT5pc01heFpvb21lZCgpLCAhc2hvdWxkWm9vbU9uRXNjYXBlKCksIGN1
cnJlbnRTY2FsZSgpKTsKIH0KIAordm9pZCBXZWJQYWdlOjpibG9ja1pvb21BbmltYXRpb25GaW5p
c2hlZCgpCit7CisgICAgZC0+em9vbUJsb2NrKCk7Cit9CiAKIHZvaWQgV2ViUGFnZVByaXZhdGU6
OnJlc2V0QmxvY2tab29tKCkKIHsKQEAgLTI2NTcsMjMgKzI3ODEsNiBAQCB2b2lkIFdlYlBhZ2VQ
cml2YXRlOjpyZXNldEJsb2NrWm9vbSgpCiAgICAgbV9zaG91bGRSZWZsb3dCbG9jayA9IGZhbHNl
OwogfQogCi1XZWJQYWdlOjpXZWJQYWdlKFdlYlBhZ2VDbGllbnQqIGNsaWVudCwgY29uc3QgV2Vi
U3RyaW5nJiBwYWdlR3JvdXBOYW1lLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkKLXsK
LSAgICBnbG9iYWxJbml0aWFsaXplKCk7Ci0gICAgZCA9IG5ldyBXZWJQYWdlUHJpdmF0ZSh0aGlz
LCBjbGllbnQsIHJlY3QpOwotICAgIGQtPmluaXQocGFnZUdyb3VwTmFtZSk7Ci19Ci0KLXZvaWQg
V2ViUGFnZTo6ZGVzdHJveVdlYlBhZ2VDb21wb3NpdG9yKCkKLXsKLSNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCi0gICAgLy8gRGVzdHJveSB0aGUgbGF5ZXIgcmVuZGVyZXIgaW4gYSBz
eW5jIGNvbW1hbmQgYmVmb3JlIHdlIGRlc3Ryb3kgdGhlIGJhY2tpbmcgc3RvcmUsCi0gICAgLy8g
dG8gZmx1c2ggYW55IHBlbmRpbmcgY29tcG9zaXRpbmcgbWVzc2FnZXMgb24gdGhlIGNvbXBvc2l0
aW5nIHRocmVhZC4KLSAgICAvLyBUaGUgYmFja2luZyBzdG9yZSBpcyBpbmRpcmVjdGx5IGRlbGV0
ZWQgYnkgdGhlICdkZXRhY2hGcm9tUGFyZW50JyBjYWxsIGJlbG93LgotICAgIGQtPnN5bmNEZXN0
cm95Q29tcG9zaXRvck9uQ29tcG9zaXRpbmdUaHJlYWQoKTsKLSNlbmRpZgotfQotCiB2b2lkIFdl
YlBhZ2U6OmRlc3Ryb3koKQogewogICAgIC8vIFRPRE86IG5lZWQgdG8gdmVyaWZ5IGlmIHRoaXMg
Y2FsbCBuZWVkcyB0byBiZSBtYWRlIGJlZm9yZSBjYWxsaW5nCkBAIC0yNzAzLDkwICsyODEwLDEx
IEBAIHZvaWQgV2ViUGFnZTo6ZGVzdHJveSgpCiAgICAgZGVsZXRlIHRoaXM7CiB9CiAKLVdlYlBh
Z2U6On5XZWJQYWdlKCkKLXsKLSAgICBkZWxldGUgZDsKLSAgICBkID0gMDsKLX0KLQogV2ViUGFn
ZUNsaWVudCogV2ViUGFnZTo6Y2xpZW50KCkgY29uc3QKIHsKICAgICByZXR1cm4gZC0+bV9jbGll
bnQ7CiB9CiAKLXZvaWQgV2ViUGFnZTo6bG9hZChjb25zdCBjaGFyKiB1cmwsIGNvbnN0IGNoYXIq
IG5ldHdvcmtUb2tlbiwgYm9vbCBpc0luaXRpYWwpCi17Ci0gICAgZC0+bG9hZCh1cmwsIG5ldHdv
cmtUb2tlbiwgIkdFVCIsIFBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6VXNlUHJvdG9jb2xDYWNo
ZVBvbGljeSwgMCwgMCwgMCwgMCwgaXNJbml0aWFsLCBmYWxzZSk7Ci19Ci0KLXZvaWQgV2ViUGFn
ZTo6bG9hZEV4dGVuZGVkKGNvbnN0IGNoYXIqIHVybCwgY29uc3QgY2hhciogbmV0d29ya1Rva2Vu
LCBjb25zdCBjaGFyKiBtZXRob2QsIFBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdDo6Q2FjaGVQb2xp
Y3kgY2FjaGVQb2xpY3ksIGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBkYXRhTGVuZ3RoLCBjb25z
dCBjaGFyKiBjb25zdCogaGVhZGVycywgc2l6ZV90IGhlYWRlcnNMZW5ndGgsIGJvb2wgbXVzdEhh
bmRsZUludGVybmFsbHkpCi17Ci0gICAgZC0+bG9hZCh1cmwsIG5ldHdvcmtUb2tlbiwgbWV0aG9k
LCBjYWNoZVBvbGljeSwgZGF0YSwgZGF0YUxlbmd0aCwgaGVhZGVycywgaGVhZGVyc0xlbmd0aCwg
ZmFsc2UsIG11c3RIYW5kbGVJbnRlcm5hbGx5LCBmYWxzZSwgIiIpOwotfQotCi12b2lkIFdlYlBh
Z2U6OmxvYWRGaWxlKGNvbnN0IGNoYXIqIHBhdGgsIGNvbnN0IGNoYXIqIG92ZXJyaWRlQ29udGVu
dFR5cGUpCi17Ci0gICAgc3RkOjpzdHJpbmcgZmlsZVVybChwYXRoKTsKLSAgICBpZiAoIWZpbGVV
cmwuZmluZCgiLyIpKQotICAgICAgICBmaWxlVXJsLmluc2VydCgwLCAiZmlsZTovLyIpOwotICAg
IGVsc2UgaWYgKGZpbGVVcmwuZmluZCgiZmlsZTovLy8iKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgZC0+bG9hZChmaWxlVXJsLmNfc3RyKCksIDAsICJHRVQiLCBQbGF0Zm9ybTo6TmV0d29ya1Jl
cXVlc3Q6OlVzZVByb3RvY29sQ2FjaGVQb2xpY3ksIDAsIDAsIDAsIDAsIGZhbHNlLCBmYWxzZSwg
ZmFsc2UsIG92ZXJyaWRlQ29udGVudFR5cGUpOwotfQotCi12b2lkIFdlYlBhZ2U6OmxvYWRTdHJp
bmcoY29uc3QgY2hhciogc3RyaW5nLCBjb25zdCBjaGFyKiBiYXNlVVJMLCBjb25zdCBjaGFyKiBt
aW1lVHlwZSwgY29uc3QgY2hhciogZmFpbGluZ1VSTCkKLXsKLSAgICBkLT5sb2FkU3RyaW5nKHN0
cmluZywgYmFzZVVSTCwgbWltZVR5cGUsIGZhaWxpbmdVUkwpOwotfQotCi12b2lkIFdlYlBhZ2U6
OmRvd25sb2FkKGNvbnN0IFBsYXRmb3JtOjpOZXR3b3JrUmVxdWVzdCYgcmVxdWVzdCkKLXsKLSAg
ICBkLT5sb2FkKHJlcXVlc3QuZ2V0VXJsUmVmKCkuY19zdHIoKSwgMCwgIkdFVCIsIFBsYXRmb3Jt
OjpOZXR3b3JrUmVxdWVzdDo6VXNlUHJvdG9jb2xDYWNoZVBvbGljeSwgMCwgMCwgMCwgMCwgZmFs
c2UsIGZhbHNlLCB0cnVlLCAiIik7Ci19Ci0KLWJvb2wgV2ViUGFnZTo6ZXhlY3V0ZUphdmFTY3Jp
cHQoY29uc3QgY2hhciogc2NyaXB0LCBKYXZhU2NyaXB0RGF0YVR5cGUmIHJldHVyblR5cGUsIFdl
YlN0cmluZyYgcmV0dXJuVmFsdWUpCi17Ci0gICAgcmV0dXJuIGQtPmV4ZWN1dGVKYXZhU2NyaXB0
KHNjcmlwdCwgcmV0dXJuVHlwZSwgcmV0dXJuVmFsdWUpOwotfQotCi1ib29sIFdlYlBhZ2U6OmV4
ZWN1dGVKYXZhU2NyaXB0SW5Jc29sYXRlZFdvcmxkKGNvbnN0IHN0ZDo6d3N0cmluZyYgc2NyaXB0
LCBKYXZhU2NyaXB0RGF0YVR5cGUmIHJldHVyblR5cGUsIFdlYlN0cmluZyYgcmV0dXJuVmFsdWUp
Ci17Ci0gICAgLy8gT24gb3VyIHBsYXRmb3JtIHdjaGFyX3QgaXMgdW5zaWduZWQgaW50IGFuZCBV
Q2hhciBpcyB1bnNpZ25lZCBzaG9ydAotICAgIC8vIHNvIHdlIGhhdmUgdG8gY29udmVydCB1c2lu
ZyBJQ1UgY29udmVyc2lvbiBmdW5jdGlvbgotICAgIGludCBsZW5ndGhDb3BpZWQgPSAwOwotICAg
IFVFcnJvckNvZGUgZXJyb3IgPSBVX1pFUk9fRVJST1I7Ci0gICAgY29uc3QgaW50IGxlbmd0aCA9
IHNjcmlwdC5sZW5ndGgoKSArIDEgLypudWxsIHRlcm1pbmF0aW9uIGNoYXIqLzsKLSAgICBVQ2hh
ciBkYXRhW2xlbmd0aF07Ci0KLSAgICAvLyBGSVhNRTogUFIgMTM4MTYyIGlzIGdpdmluZyBVX0lO
VkFMSURfQ0hBUl9GT1VORCBlcnJvci4KLSAgICB1X3N0ckZyb21VVEYzMihkYXRhLCBsZW5ndGgs
ICZsZW5ndGhDb3BpZWQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUNoYXIzMio+KHNjcmlwdC5j
X3N0cigpKSwgc2NyaXB0Lmxlbmd0aCgpLCAmZXJyb3IpOwotICAgIEJMQUNLQkVSUllfQVNTRVJU
KGVycm9yID09IFVfWkVST19FUlJPUik7Ci0gICAgaWYgKGVycm9yICE9IFVfWkVST19FUlJPUikg
ewotICAgICAgICBQbGF0Zm9ybTo6bG9nQWx3YXlzKFBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2Fs
LCAiV2ViUGFnZTo6ZXhlY3V0ZUphdmFTY3JpcHRJbklzb2xhdGVkV29ybGQgZmFpbGVkIHRvIGNv
bnZlcnQgVVRGMTYgdG8gSmF2YVNjcmlwdCEiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IH0KLSAgICBTdHJpbmcgc3RyID0gU3RyaW5nKGRhdGEsIGxlbmd0aENvcGllZCk7Ci0gICAgU2Ny
aXB0U291cmNlQ29kZSBzb3VyY2VDb2RlKHN0ciwgS1VSTCgpKTsKLSAgICByZXR1cm4gZC0+ZXhl
Y3V0ZUphdmFTY3JpcHRJbklzb2xhdGVkV29ybGQoc291cmNlQ29kZSwgcmV0dXJuVHlwZSwgcmV0
dXJuVmFsdWUpOwotfQotCi1ib29sIFdlYlBhZ2U6OmV4ZWN1dGVKYXZhU2NyaXB0SW5Jc29sYXRl
ZFdvcmxkKGNvbnN0IGNoYXIqIHNjcmlwdCwgSmF2YVNjcmlwdERhdGFUeXBlJiByZXR1cm5UeXBl
LCBXZWJTdHJpbmcmIHJldHVyblZhbHVlKQotewotICAgIFNjcmlwdFNvdXJjZUNvZGUgc291cmNl
Q29kZShTdHJpbmc6OmZyb21VVEY4KHNjcmlwdCksIEtVUkwoKSk7Ci0gICAgcmV0dXJuIGQtPmV4
ZWN1dGVKYXZhU2NyaXB0SW5Jc29sYXRlZFdvcmxkKHNvdXJjZUNvZGUsIHJldHVyblR5cGUsIHJl
dHVyblZhbHVlKTsKLX0KLQotdm9pZCBXZWJQYWdlOjpzdG9wTG9hZGluZygpCi17Ci0gICAgZC0+
c3RvcEN1cnJlbnRMb2FkKCk7Ci19Ci0KLXZvaWQgV2ViUGFnZTo6cHJlcGFyZVRvRGVzdHJveSgp
Ci17Ci0gICAgZC0+cHJlcGFyZVRvRGVzdHJveSgpOwotfQotCiBpbnQgV2ViUGFnZTo6YmFja0Zv
cndhcmRMaXN0TGVuZ3RoKCkgY29uc3QKIHsKICAgICByZXR1cm4gZC0+bV9wYWdlLT5nZXRIaXN0
b3J5TGVuZ3RoKCk7CkBAIC0yOTUzLDExICsyOTgxLDYgQEAgdm9pZCBXZWJQYWdlOjpzZXRDb2xv
cklucHV0KGNvbnN0IFdlYlN0cmluZyYgdmFsdWUpCiAgICAgZC0+bV9pbnB1dEhhbmRsZXItPnNl
dElucHV0VmFsdWUoU3RyaW5nKHZhbHVlLmltcGwoKSkpOwogfQogCi1BY3RpdmVOb2RlQ29udGV4
dCBXZWJQYWdlOjphY3RpdmVOb2RlQ29udGV4dChUYXJnZXREZXRlY3Rpb25TdHJhdGVneSBzdHJh
dGVneSkgY29uc3QKLXsKLSAgICByZXR1cm4gZC0+YWN0aXZlTm9kZUNvbnRleHQoc3RyYXRlZ3kp
OwotfQotCiB2b2lkIFdlYlBhZ2U6OnNldFZpcnR1YWxWaWV3cG9ydFNpemUoaW50IHdpZHRoLCBp
bnQgaGVpZ2h0KQogewogICAgIGQtPm1fdmlydHVhbFZpZXdwb3J0V2lkdGggPSB3aWR0aDsKQEAg
LTMwNDgsMTUgKzMwNzEsOSBAQCB2b2lkIFdlYlBhZ2VQcml2YXRlOjpvbklucHV0TG9jYWxlQ2hh
bmdlZChib29sIGlzUlRMKQogICAgIH0KIH0KIAotdm9pZCBXZWJQYWdlOjpzZXRTY3JlZW5Pcmll
bnRhdGlvbihpbnQgb3JpZW50YXRpb24pCi17Ci0gICAgZC0+bV9wZW5kaW5nT3JpZW50YXRpb24g
PSBvcmllbnRhdGlvbjsKLX0KLQotdm9pZCBXZWJQYWdlOjphcHBseVBlbmRpbmdPcmllbnRhdGlv
bklmTmVlZGVkKCkKK3ZvaWQgV2ViUGFnZTo6b25JbnB1dExvY2FsZUNoYW5nZWQoYm9vbCBpc1JU
TCkKIHsKLSAgICBpZiAoZC0+bV9wZW5kaW5nT3JpZW50YXRpb24gIT0gLTEpCi0gICAgICAgIGQt
PnNldFNjcmVlbk9yaWVudGF0aW9uKGQtPm1fcGVuZGluZ09yaWVudGF0aW9uKTsKKyAgICBkLT5v
bklucHV0TG9jYWxlQ2hhbmdlZChpc1JUTCk7CiB9CiAKIHZvaWQgV2ViUGFnZVByaXZhdGU6OnN1
c3BlbmRCYWNraW5nU3RvcmUoKQpAQCAtMzExMSwxNCArMzEyOCwxNSBAQCB2b2lkIFdlYlBhZ2VQ
cml2YXRlOjpzZXRTY3JlZW5PcmllbnRhdGlvbihpbnQgb3JpZW50YXRpb24pCiAjZW5kaWYKIH0K
IAotUGxhdGZvcm06OkludFNpemUgV2ViUGFnZTo6dmlld3BvcnRTaXplKCkgY29uc3QKK3ZvaWQg
V2ViUGFnZTo6c2V0U2NyZWVuT3JpZW50YXRpb24oaW50IG9yaWVudGF0aW9uKQogewotICAgIHJl
dHVybiBkLT50cmFuc2Zvcm1lZEFjdHVhbFZpc2libGVTaXplKCk7CisgICAgZC0+bV9wZW5kaW5n
T3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKIH0KIAotdm9pZCBXZWJQYWdlOjpzZXRWaWV3cG9y
dFNpemUoY29uc3QgUGxhdGZvcm06OkludFNpemUmIHZpZXdwb3J0U2l6ZSwgYm9vbCBlbnN1cmVG
b2N1c0VsZW1lbnRWaXNpYmxlKQordm9pZCBXZWJQYWdlOjphcHBseVBlbmRpbmdPcmllbnRhdGlv
bklmTmVlZGVkKCkKIHsKLSAgICBkLT5zZXRWaWV3cG9ydFNpemUodmlld3BvcnRTaXplLCBlbnN1
cmVGb2N1c0VsZW1lbnRWaXNpYmxlKTsKKyAgICBpZiAoZC0+bV9wZW5kaW5nT3JpZW50YXRpb24g
IT0gLTEpCisgICAgICAgIGQtPnNldFNjcmVlbk9yaWVudGF0aW9uKGQtPm1fcGVuZGluZ09yaWVu
dGF0aW9uKTsKIH0KIAogdm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2NyZWVuUm90YXRlZCgpCkBAIC0z
MzM5LDEwICszMzU3LDkgQEAgdm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0Vmlld3BvcnRTaXplKGNv
bnN0IEludFNpemUmIHRyYW5zZm9ybWVkQWN0dWFsVmlzaWJsZVNpemUKICAgICAgICAgZW5zdXJl
Q29udGVudFZpc2libGUoIW5ld1Zpc2libGVSZWN0Q29udGFpbnNPbGRWaXNpYmxlUmVjdCk7CiB9
CiAKLXZvaWQgV2ViUGFnZTo6c2V0RGVmYXVsdExheW91dFNpemUoaW50IHdpZHRoLCBpbnQgaGVp
Z2h0KQordm9pZCBXZWJQYWdlOjpzZXRWaWV3cG9ydFNpemUoY29uc3QgUGxhdGZvcm06OkludFNp
emUmIHZpZXdwb3J0U2l6ZSwgYm9vbCBlbnN1cmVGb2N1c0VsZW1lbnRWaXNpYmxlKQogewotICAg
IEludFNpemUgc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLSAgICBkLT5zZXREZWZhdWx0TGF5b3V0U2l6
ZShzaXplKTsKKyAgICBkLT5zZXRWaWV3cG9ydFNpemUodmlld3BvcnRTaXplLCBlbnN1cmVGb2N1
c0VsZW1lbnRWaXNpYmxlKTsKIH0KIAogdm9pZCBXZWJQYWdlUHJpdmF0ZTo6c2V0RGVmYXVsdExh
eW91dFNpemUoY29uc3QgSW50U2l6ZSYgc2l6ZSkKQEAgLTMzNjIsNiArMzM3OSwxMiBAQCB2b2lk
IFdlYlBhZ2VQcml2YXRlOjpzZXREZWZhdWx0TGF5b3V0U2l6ZShjb25zdCBJbnRTaXplJiBzaXpl
KQogICAgIH0KIH0KIAordm9pZCBXZWJQYWdlOjpzZXREZWZhdWx0TGF5b3V0U2l6ZShpbnQgd2lk
dGgsIGludCBoZWlnaHQpCit7CisgICAgSW50U2l6ZSBzaXplKHdpZHRoLCBoZWlnaHQpOworICAg
IGQtPnNldERlZmF1bHRMYXlvdXRTaXplKHNpemUpOworfQorCiBib29sIFdlYlBhZ2U6Om1vdXNl
RXZlbnQoY29uc3QgUGxhdGZvcm06Ok1vdXNlRXZlbnQmIG1vdXNlRXZlbnQsIGJvb2wqIHdoZWVs
RGVsdGFBY2NlcHRlZCkKIHsKICAgICBpZiAoIWQtPm1fbWFpbkZyYW1lLT52aWV3KCkpCkBAIC0z
NTkwLDEyICszNjEzLDYgQEAgYm9vbCBXZWJQYWdlOjp0b3VjaEV2ZW50KGNvbnN0IFBsYXRmb3Jt
OjpUb3VjaEV2ZW50JiBldmVudCkKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLXZvaWQgV2ViUGFn
ZTo6c2V0U2Nyb2xsT3JpZ2luUG9pbnQoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBwb2ludCkK
LXsKLSAgICBQbGF0Zm9ybTo6SW50UG9pbnQgdW50cmFuc2Zvcm1lZFBvaW50ID0gZC0+bWFwRnJv
bVRyYW5zZm9ybWVkKHBvaW50KTsKLSAgICBkLT5zZXRTY3JvbGxPcmlnaW5Qb2ludCh1bnRyYW5z
Zm9ybWVkUG9pbnQpOwotfQotCiB2b2lkIFdlYlBhZ2VQcml2YXRlOjpzZXRTY3JvbGxPcmlnaW5Q
b2ludChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIHBvaW50KQogewogICAgIG1faW5SZWdpb25T
Y3JvbGxTdGFydGluZ05vZGUgPSAwOwpAQCAtMzYwNiw2ICszNjIzLDEyIEBAIHZvaWQgV2ViUGFn
ZVByaXZhdGU6OnNldFNjcm9sbE9yaWdpblBvaW50KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYg
cG9pbnQpCiAgICAgbV9jbGllbnQtPm5vdGlmeUluUmVnaW9uU2Nyb2xsaW5nU3RhcnRpbmdQb2lu
dENoYW5nZWQoaW5SZWdpb25TY3JvbGxhYmxlQXJlYXNGb3JQb2ludChwb2ludCkpOwogfQogCit2
b2lkIFdlYlBhZ2U6OnNldFNjcm9sbE9yaWdpblBvaW50KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2lu
dCYgcG9pbnQpCit7CisgICAgUGxhdGZvcm06OkludFBvaW50IHVudHJhbnNmb3JtZWRQb2ludCA9
IGQtPm1hcEZyb21UcmFuc2Zvcm1lZChwb2ludCk7CisgICAgZC0+c2V0U2Nyb2xsT3JpZ2luUG9p
bnQodW50cmFuc2Zvcm1lZFBvaW50KTsKK30KKwogYm9vbCBXZWJQYWdlUHJpdmF0ZTo6ZGlzcGF0
Y2hUb3VjaEV2ZW50VG9GdWxsU2NyZWVuUGx1Z2luKFBsdWdpblZpZXcqIHBsdWdpbiwgY29uc3Qg
UGxhdGZvcm06OlRvdWNoRXZlbnQmIGV2ZW50KQogewogICAgIE5QVG91Y2hFdmVudCBucFRvdWNo
RXZlbnQ7CkBAIC0zNzM1LDYgKzM3NTgsMzggQEAgdm9pZCBXZWJQYWdlUHJpdmF0ZTo6Y2xlYXJG
b2N1c05vZGUoKQogICAgICAgICBmcmFtZS0+cGFnZSgpLT5mb2N1c0NvbnRyb2xsZXIoKS0+c2V0
Rm9jdXNlZE5vZGUoMCwgZnJhbWUpOwogfQogCitXZWJTdHJpbmcgV2ViUGFnZTo6dGV4dEVuY29k
aW5nKCkKK3sKKyAgICBGcmFtZSogZnJhbWUgPSBkLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAg
ICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gIiI7CisKKyAgICBEb2N1bWVudCogZG9jdW1l
bnQgPSBmcmFtZS0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIWRvY3VtZW50KQorICAgICAgICByZXR1
cm4gIiI7CisKKyAgICByZXR1cm4gZG9jdW1lbnQtPmxvYWRlcigpLT53cml0ZXIoKS0+ZW5jb2Rp
bmcoKTsKK30KKworV2ViU3RyaW5nIFdlYlBhZ2U6OmZvcmNlZFRleHRFbmNvZGluZygpCit7Cisg
ICAgRnJhbWUqIGZyYW1lID0gZC0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisgICAgaWYgKCFmcmFt
ZSkKKyAgICAgICAgcmV0dXJuICIiOworCisgICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gZnJhbWUt
PmRvY3VtZW50KCk7CisgICAgaWYgKCFkb2N1bWVudCkKKyAgICAgICAgcmV0dXJuICIiOworCisg
ICAgcmV0dXJuIGRvY3VtZW50LT5sb2FkZXIoKS0+b3ZlcnJpZGVFbmNvZGluZygpOworfQorCit2
b2lkIFdlYlBhZ2U6OnNldEZvcmNlZFRleHRFbmNvZGluZyhjb25zdCBjaGFyKiBlbmNvZGluZykK
K3sKKyAgICBpZiAoZW5jb2RpbmcgJiYgZC0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkgJiYgZC0+Zm9j
dXNlZE9yTWFpbkZyYW1lKCktPmxvYWRlcigpICYmIGQtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5s
b2FkZXIoKSkKKyAgICAgICAgcmV0dXJuIGQtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5sb2FkZXIo
KS0+cmVsb2FkV2l0aE92ZXJyaWRlRW5jb2RpbmcoZW5jb2RpbmcpOworfQorCiBib29sIFdlYlBh
Z2VQcml2YXRlOjpzY3JvbGxOb2RlUmVjdXJzaXZlbHkoTm9kZSogbm9kZSwgY29uc3QgSW50U2l6
ZSYgZGVsdGEpCiB7CiAgICAgaWYgKGRlbHRhLmlzWmVybygpKQpAQCAtMzk2MCw3ICs0MDE1LDcg
QEAgaW50MzJfdCBXZWJQYWdlOjpjb21taXRUZXh0KHNwYW5uYWJsZV9zdHJpbmdfdCogc3Bhbm5h
YmxlU3RyaW5nLCBpbnQzMl90IHJlbGF0aXYKICAgICByZXR1cm4gZC0+bV9pbnB1dEhhbmRsZXIt
PmNvbW1pdFRleHQoc3Bhbm5hYmxlU3RyaW5nLCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uKTsKIH0K
IAotdm9pZCBXZWJQYWdlOjpzcGVsbENoZWNraW5nRW5hYmxlZChib29sIGVuYWJsZWQpCit2b2lk
IFdlYlBhZ2U6OnNldFNwZWxsQ2hlY2tpbmdFbmFibGVkKGJvb2wgZW5hYmxlZCkKIHsKICAgICBz
dGF0aWNfY2FzdDxFZGl0b3JDbGllbnRCbGFja0JlcnJ5Kj4oZC0+bV9wYWdlLT5lZGl0b3JDbGll
bnQoKSktPmVuYWJsZVNwZWxsQ2hlY2tpbmcoZW5hYmxlZCk7CiB9CkBAIC00MDUzLDYyICs0MTA4
LDYgQEAgdm9pZCBXZWJQYWdlOjpzZWxlY3RBdFBvaW50KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2lu
dCYgbG9jYXRpb24pCiAgICAgZC0+bV9zZWxlY3Rpb25IYW5kbGVyLT5zZWxlY3RBdFBvaW50KHNl
bGVjdGlvbkxvY2F0aW9uKTsKIH0KIAotLy8gUmV0dXJuZWQgc2Nyb2xsIHBvc2l0aW9uIGlzIGlu
IHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzLgotUGxhdGZvcm06OkludFBvaW50IFdlYlBhZ2U6OnNj
cm9sbFBvc2l0aW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZC0+dHJhbnNmb3JtZWRTY3JvbGxQ
b3NpdGlvbigpOwotfQotCi0vLyBTZXR0aW5nIHRoZSBzY3JvbGwgcG9zaXRpb24gaXMgaW4gdHJh
bnNmb3JtZWQgY29vcmRpbmF0ZXMuCi12b2lkIFdlYlBhZ2U6OnNldFNjcm9sbFBvc2l0aW9uKGNv
bnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgcG9pbnQpCi17Ci0gICAgaWYgKGQtPnRyYW5zZm9ybWVk
UG9pbnRFcXVhbHNVbnRyYW5zZm9ybWVkUG9pbnQocG9pbnQsIGQtPnNjcm9sbFBvc2l0aW9uKCkp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBJZiB0aGUgdXNlciByZWNlbnRseSBwZXJmb3Jt
ZWQgYW4gZXZlbnQsIHRoaXMgbmV3IHNjcm9sbCBwb3NpdGlvbgotICAgIC8vIGNvdWxkIHBvc3Np
Ymx5IGJlIGEgcmVzdWx0IG9mIHRoYXQuIE9yIG5vdCwgdGhpcyBpcyBqdXN0IGEgaGV1cmlzdGlj
LgotICAgIGlmIChjdXJyZW50VGltZSgpIC0gZC0+bV9sYXN0VXNlckV2ZW50VGltZXN0YW1wIDwg
bWFudWFsU2Nyb2xsSW50ZXJ2YWwpCi0gICAgICAgIGQtPm1fdXNlclBlcmZvcm1lZE1hbnVhbFNj
cm9sbCA9IHRydWU7Ci0KLSAgICBkLT5tX2JhY2tpbmdTdG9yZUNsaWVudC0+c2V0SXNDbGllbnRH
ZW5lcmF0ZWRTY3JvbGwodHJ1ZSk7Ci0gICAgZC0+bV9tYWluRnJhbWUtPnZpZXcoKS0+c2V0Q2Fu
T3ZlcnNjcm9sbCh0cnVlKTsKLSAgICBkLT5zZXRTY3JvbGxQb3NpdGlvbihkLT5tYXBGcm9tVHJh
bnNmb3JtZWQocG9pbnQpKTsKLSAgICBkLT5tX21haW5GcmFtZS0+dmlldygpLT5zZXRDYW5PdmVy
c2Nyb2xsKGZhbHNlKTsKLSAgICBkLT5tX2JhY2tpbmdTdG9yZUNsaWVudC0+c2V0SXNDbGllbnRH
ZW5lcmF0ZWRTY3JvbGwoZmFsc2UpOwotfQotCi1XZWJTdHJpbmcgV2ViUGFnZTo6dGV4dEVuY29k
aW5nKCkKLXsKLSAgICBGcmFtZSogZnJhbWUgPSBkLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKLSAg
ICBpZiAoIWZyYW1lKQotICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICBEb2N1bWVudCogZG9jdW1l
bnQgPSBmcmFtZS0+ZG9jdW1lbnQoKTsKLSAgICBpZiAoIWRvY3VtZW50KQotICAgICAgICByZXR1
cm4gIiI7Ci0KLSAgICByZXR1cm4gZG9jdW1lbnQtPmxvYWRlcigpLT53cml0ZXIoKS0+ZW5jb2Rp
bmcoKTsKLX0KLQotV2ViU3RyaW5nIFdlYlBhZ2U6OmZvcmNlZFRleHRFbmNvZGluZygpCi17Ci0g
ICAgRnJhbWUqIGZyYW1lID0gZC0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7Ci0gICAgaWYgKCFmcmFt
ZSkKLSAgICAgICAgcmV0dXJuICIiOwotCi0gICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gZnJhbWUt
PmRvY3VtZW50KCk7Ci0gICAgaWYgKCFkb2N1bWVudCkKLSAgICAgICAgcmV0dXJuICIiOwotCi0g
ICAgcmV0dXJuIGRvY3VtZW50LT5sb2FkZXIoKS0+b3ZlcnJpZGVFbmNvZGluZygpOwotfQotCi12
b2lkIFdlYlBhZ2U6OnNldEZvcmNlZFRleHRFbmNvZGluZyhjb25zdCBjaGFyKiBlbmNvZGluZykK
LXsKLSAgICBpZiAoZW5jb2RpbmcgJiYgZC0+Zm9jdXNlZE9yTWFpbkZyYW1lKCkgJiYgZC0+Zm9j
dXNlZE9yTWFpbkZyYW1lKCktPmxvYWRlcigpICYmIGQtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5s
b2FkZXIoKSkKLSAgICAgICAgcmV0dXJuIGQtPmZvY3VzZWRPck1haW5GcmFtZSgpLT5sb2FkZXIo
KS0+cmVsb2FkV2l0aE92ZXJyaWRlRW5jb2RpbmcoZW5jb2RpbmcpOwotfQotCiAvLyBGSVhNRTog
TW92ZSB0byBET01TdXBwb3J0LgogYm9vbCBXZWJQYWdlUHJpdmF0ZTo6Y2FuU2Nyb2xsSW5uZXJG
cmFtZShGcmFtZSogZnJhbWUpIGNvbnN0CiB7CkBAIC00MTUyLDcgKzQxNTEsNiBAQCBib29sIFdl
YlBhZ2VQcml2YXRlOjpjYW5TY3JvbGxSZW5kZXJCb3goUmVuZGVyQm94KiBib3gpCiBzdGF0aWMg
UmVuZGVyTGF5ZXIqIHBhcmVudExheWVyKFJlbmRlckxheWVyKiBsYXllcikKIHsKICAgICBBU1NF
UlQobGF5ZXIpOwotCiAgICAgaWYgKGxheWVyLT5wYXJlbnQoKSkKICAgICAgICAgcmV0dXJuIGxh
eWVyLT5wYXJlbnQoKTsKIApAQCAtNDIwMyw3ICs0MjAxLDYgQEAgc3RkOjp2ZWN0b3I8UGxhdGZv
cm06OlNjcm9sbFZpZXdCYXNlPiBXZWJQYWdlUHJpdmF0ZTo6aW5SZWdpb25TY3JvbGxhYmxlQXJl
YXNGb3IKICAgICAgICAgcmV0dXJuIGVtcHR5UmV0dXJuOwogCiAgICAgUmVuZGVyTGF5ZXIqIGxh
eWVyID0gcmVuZGVyZXItPmVuY2xvc2luZ0xheWVyKCk7Ci0KICAgICBkbyB7CiAgICAgICAgIFJl
bmRlck9iamVjdCogcmVuZGVyZXIgPSBsYXllci0+cmVuZGVyZXIoKTsKIApAQCAtNDIzMSw3ICs0
MjI4LDYgQEAgc3RkOjp2ZWN0b3I8UGxhdGZvcm06OlNjcm9sbFZpZXdCYXNlPiBXZWJQYWdlUHJp
dmF0ZTo6aW5SZWdpb25TY3JvbGxhYmxlQXJlYXNGb3IKICAgICAgICAgfQogCiAgICAgfSB3aGls
ZSAobGF5ZXIgPSBwYXJlbnRMYXllcihsYXllcikpOwotCiAgICAgaWYgKHZhbGlkUmV0dXJuLmVt
cHR5KCkpCiAgICAgICAgIHJldHVybiBlbXB0eVJldHVybjsKIApAQCAtNDUzNSwxMSArNDUzMSw2
IEBAIGJvb2wgV2ViUGFnZTo6em9vbVRvT25lT25lKCkKICAgICByZXR1cm4gZC0+em9vbUFib3V0
UG9pbnQoc2NhbGUsIGQtPmNlbnRlck9mVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKIH0KIAotUGxh
dGZvcm06OkludFJlY3QgV2ViUGFnZTo6Zm9jdXNOb2RlUmVjdCgpCi17Ci0gICAgcmV0dXJuIGQt
PmZvY3VzTm9kZVJlY3QoKTsKLX0KLQogdm9pZCBXZWJQYWdlOjpzZXRGb2N1c2VkKGJvb2wgZm9j
dXNlZCkKIHsKICAgICBGb2N1c0NvbnRyb2xsZXIqIGZvY3VzQ29udHJvbGxlciA9IGQtPm1fcGFn
ZS0+Zm9jdXNDb250cm9sbGVyKCk7CkBAIC00OTk4LDExICs0OTg5LDYgQEAgdm9pZCBXZWJQYWdl
OjpjbGVhclBsdWdpblNpdGVEYXRhKCkKICAgICAgICAgKCppdCktPmNsZWFyU2l0ZURhdGEoU3Ry
aW5nKCkpOwogfQogCi12b2lkIFdlYlBhZ2U6Om9uSW5wdXRMb2NhbGVDaGFuZ2VkKGJvb2wgaXNS
VEwpCi17Ci0gICAgZC0+b25JbnB1dExvY2FsZUNoYW5nZWQoaXNSVEwpOwotfQotCiB2b2lkIFdl
YlBhZ2U6Om9uTmV0d29ya0F2YWlsYWJpbGl0eUNoYW5nZWQoYm9vbCBhdmFpbGFibGUpCiB7CiAg
ICAgdXBkYXRlT25saW5lU3RhdHVzKGF2YWlsYWJsZSk7CkBAIC01MDQzLDExICs1MDI5LDYgQEAg
dm9pZCBXZWJQYWdlOjpkaXNwYXRjaEluc3BlY3Rvck1lc3NhZ2UoY29uc3QgY2hhciogbWVzc2Fn
ZSwgaW50IGxlbmd0aCkKICAgICBkLT5tX3BhZ2UtPmluc3BlY3RvckNvbnRyb2xsZXIoKS0+ZGlz
cGF0Y2hNZXNzYWdlRnJvbUZyb250ZW5kKHN0cmluZ01lc3NhZ2UpOwogfQogCi1GcmFtZSogV2Vi
UGFnZTo6bWFpbkZyYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZC0+bV9tYWluRnJhbWU7Ci19
Ci0KICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCiB2b2lkIFdlYlBhZ2VQcml2YXRl
OjpkcmF3TGF5ZXJzT25Db21taXQoKQogewpAQCAtNTM1NSw2ICs1MzM2LDE2IEBAIHZvaWQgV2Vi
UGFnZVByaXZhdGU6OnN5bmNEZXN0cm95Q29tcG9zaXRvck9uQ29tcG9zaXRpbmdUaHJlYWQoKQog
ICAgICAgICAgICAgJldlYlBhZ2VQcml2YXRlOjpkZXN0cm95Q29tcG9zaXRvciwgdGhpcykpOwog
fQogCit2b2lkIFdlYlBhZ2U6OmRlc3Ryb3lXZWJQYWdlQ29tcG9zaXRvcigpCit7CisjaWYgVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIC8vIERlc3Ryb3kgdGhlIGxheWVyIHJlbmRl
cmVyIGluIGEgc3luYyBjb21tYW5kIGJlZm9yZSB3ZSBkZXN0cm95IHRoZSBiYWNraW5nIHN0b3Jl
LAorICAgIC8vIHRvIGZsdXNoIGFueSBwZW5kaW5nIGNvbXBvc2l0aW5nIG1lc3NhZ2VzIG9uIHRo
ZSBjb21wb3NpdGluZyB0aHJlYWQuCisgICAgLy8gVGhlIGJhY2tpbmcgc3RvcmUgaXMgaW5kaXJl
Y3RseSBkZWxldGVkIGJ5IHRoZSAnZGV0YWNoRnJvbVBhcmVudCcgY2FsbCBiZWxvdy4KKyAgICBk
LT5zeW5jRGVzdHJveUNvbXBvc2l0b3JPbkNvbXBvc2l0aW5nVGhyZWFkKCk7CisjZW5kaWYKK30K
Kwogdm9pZCBXZWJQYWdlUHJpdmF0ZTo6ZGVzdHJveUxheWVyUmVzb3VyY2VzKCkKIHsKICAgICAg
bV9jb21wb3NpdG9yLT5yZWxlYXNlTGF5ZXJSZXNvdXJjZXMoKTsKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvV2ViUGFnZS5oIGIvU291cmNlL1dlYktpdC9ibGFja2Jl
cnJ5L0FwaS9XZWJQYWdlLmgKaW5kZXggNDg5ZjQ1MzZjNjNiMmRmNjg1NWFhMjc4MTFlYTJkZjg1
OTNiZDJiMy4uYjdiODljZDhmMTgzNTJiYjg0MDk0ZmJlMmU5OGUwYTkzZTNhYzU0NSAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9XZWJQYWdlLmgKKysrIGIvU291cmNl
L1dlYktpdC9ibGFja2JlcnJ5L0FwaS9XZWJQYWdlLmgKQEAgLTM0LDE3ICszNCw4IEBAIHR5cGVk
ZWYgY29uc3Qgc3RydWN0IE9wYXF1ZUpTVmFsdWUqIEpTVmFsdWVSZWY7CiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIGNsYXNzIENocm9tZUNsaWVudEJsYWNrQmVycnk7Ci1jbGFzcyBFZGl0b3JDbGll
bnRCbGFja0JlcnJ5OwotY2xhc3MgRWxlbWVudDsKIGNsYXNzIEZyYW1lOwogY2xhc3MgRnJhbWVM
b2FkZXJDbGllbnRCbGFja0JlcnJ5OwotY2xhc3MgR2VvbG9jYXRpb25Db250cm9sbGVyQ2xpZW50
QmxhY2tCZXJyeTsKLWNsYXNzIEljb25EYXRhYmFzZUNsaWVudEJsYWNrQmVycnk7Ci1jbGFzcyBJ
bnNwZWN0b3JDbGllbnRCbGFja0JlcnJ5OwotY2xhc3MgSmF2YVNjcmlwdERlYnVnZ2VyQmxhY2tC
ZXJyeTsKLWNsYXNzIE5vZGU7Ci1jbGFzcyBSZW5kZXJPYmplY3Q7Ci1jbGFzcyBWaXNpYmxlU2Vs
ZWN0aW9uOwogfQogCiBjbGFzcyBXZWJET01Eb2N1bWVudDsKQEAgLTY3LDcgKzU4LDYgQEAgbmFt
ZXNwYWNlIFdlYktpdCB7CiBjbGFzcyBCYWNraW5nU3RvcmU7CiBjbGFzcyBCYWNraW5nU3RvcmVD
bGllbnQ7CiBjbGFzcyBCYWNraW5nU3RvcmVQcml2YXRlOwotY2xhc3MgRHVtcFJlbmRlclRyZWVD
bGllbnQ7CiBjbGFzcyBSZW5kZXJRdWV1ZTsKIGNsYXNzIFdlYlBhZ2VDbGllbnQ7CiBjbGFzcyBX
ZWJQYWdlR3JvdXBMb2FkRGVmZXJyZXI7CkBAIC0xOTIsOCArMTgyLDYgQEAgcHVibGljOgogCiAg
ICAgdm9pZCBhc3NpZ25Gb2N1cyhQbGF0Zm9ybTo6Rm9jdXNEaXJlY3Rpb24pOwogCi0gICAgUGxh
dGZvcm06OkludFJlY3QgZm9jdXNOb2RlUmVjdCgpOwotCiAgICAgdm9pZCBzZXRGb2N1c2VkKGJv
b2wpOwogCiAgICAgdm9pZCBjbGVhckJyb3dzaW5nRGF0YSgpOwpAQCAtMjUwLDcgKzIzOCw3IEBA
IHB1YmxpYzoKICAgICBpbnQzMl90IHNldENvbXBvc2luZ1RleHQoc3Bhbm5hYmxlX3N0cmluZ190
KiwgaW50MzJfdCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uKTsKICAgICBpbnQzMl90IGNvbW1pdFRl
eHQoc3Bhbm5hYmxlX3N0cmluZ190KiwgaW50MzJfdCByZWxhdGl2ZUN1cnNvclBvc2l0aW9uKTsK
IAotICAgIHZvaWQgc3BlbGxDaGVja2luZ0VuYWJsZWQoYm9vbCk7CisgICAgdm9pZCBzZXRTcGVs
bENoZWNraW5nRW5hYmxlZChib29sKTsKIAogICAgIHZvaWQgc2V0U2VsZWN0aW9uKGNvbnN0IFBs
YXRmb3JtOjpJbnRQb2ludCYgc3RhcnRQb2ludCwgY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBl
bmRQb2ludCk7CiAgICAgdm9pZCBzZXRDYXJldFBvc2l0aW9uKGNvbnN0IFBsYXRmb3JtOjpJbnRQ
b2ludCYpOwpAQCAtMzE1LDcgKzMwMyw2IEBAIHB1YmxpYzoKICAgICB2b2lkIGVuYWJsZVBhc3N3
b3JkRWNobygpOwogICAgIHZvaWQgZGlzYWJsZVBhc3N3b3JkRWNobygpOwogICAgIHZvaWQgZGlz
cGF0Y2hJbnNwZWN0b3JNZXNzYWdlKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIGludCBsZW5ndGgpOwot
ICAgIFdlYkNvcmU6OkZyYW1lKiBtYWluRnJhbWUoKSBjb25zdDsKIAogICAgIC8vIEZJWE1FOiBO
ZWVkcyBBUEkgcmV2aWV3IG9uIHRoaXMgaGVhZGVyLiBTZWUgUFIgIzEyMDQwMi4KICAgICB2b2lk
IG5vdGlmeVBhZ2VQYXVzZSgpOwpAQCAtMzQ0LDYgKzMzMSw3IEBAIHByaXZhdGU6CiAgICAgZnJp
ZW5kIGNsYXNzIFdlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTsKICAgICBmcmllbmQgY2xhc3Mg
V2ViS2l0OjpSZW5kZXJRdWV1ZTsKICAgICBmcmllbmQgY2xhc3MgV2ViS2l0OjpXZWJQYWdlR3Jv
dXBMb2FkRGVmZXJyZXI7CisgICAgZnJpZW5kIGNsYXNzIFdlYktpdDo6V2ViUGFnZVByaXZhdGU7
CiAgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OkNocm9tZUNsaWVudEJsYWNrQmVycnk7CiAgICAg
ZnJpZW5kIGNsYXNzIFdlYkNvcmU6OkZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTsKICAgICBX
ZWJQYWdlUHJpdmF0ZSogZDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9B
cGkvV2ViUGFnZV9wLmggYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQXBpL1dlYlBhZ2VfcC5o
CmluZGV4IGUwMjM4YjZkNjkzMjZmYzVmZTg4NWQ4MDdiZTI3MTdmMDk4ZmE1NjIuLmQ2ZDE5OWZl
ZTEwMzU0NTc4MzRkOGE2MzVlMWQ5M2MxYjQxNDNkMzggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJL
aXQvYmxhY2tiZXJyeS9BcGkvV2ViUGFnZV9wLmgKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2Jl
cnJ5L0FwaS9XZWJQYWdlX3AuaApAQCAtMzcsNyArMzcsNiBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7
CiBjbGFzcyBET01XcmFwcGVyV29ybGQ7CiBjbGFzcyBEb2N1bWVudDsKIGNsYXNzIEZyYW1lOwot
Y2xhc3MgRnJhbWVWaWV3OwogY2xhc3MgR2VvbG9jYXRpb25Db250cm9sbGVyQ2xpZW50QmxhY2tC
ZXJyeTsKIGNsYXNzIEphdmFTY3JpcHREZWJ1Z2dlckJsYWNrQmVycnk7CiBjbGFzcyBLVVJMOwpA
QCAtNjAsNyArNTksNiBAQCBjbGFzcyBCYWNraW5nU3RvcmVUaWxlOwogY2xhc3MgRHVtcFJlbmRl
clRyZWVDbGllbnQ7CiBjbGFzcyBJblBhZ2VTZWFyY2hNYW5hZ2VyOwogY2xhc3MgSW5wdXRIYW5k
bGVyOwotY2xhc3MgSW5SZWdpb25TY3JvbGxhYmxlQXJlYTsKIGNsYXNzIFNlbGVjdGlvbkhhbmRs
ZXI7CiBjbGFzcyBUb3VjaEV2ZW50SGFuZGxlcjsKIGNsYXNzIFdlYlBhZ2VDbGllbnQ7CkBAIC04
Miw2ICs4MCw4IEBAIHB1YmxpYzoKICAgICBXZWJQYWdlUHJpdmF0ZShXZWJQYWdlKiwgV2ViUGFn
ZUNsaWVudCosIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmKTsKICAgICB2aXJ0dWFsIH5XZWJQYWdl
UHJpdmF0ZSgpOwogCisgICAgc3RhdGljIFdlYkNvcmU6OlBhZ2UqIGNvcmUoY29uc3QgV2ViUGFn
ZSopOworCiAgICAgdm9pZCBpbml0KGNvbnN0IFdlYlN0cmluZyYgcGFnZUdyb3VwTmFtZSk7CiAg
ICAgYm9vbCBoYW5kbGVNb3VzZUV2ZW50KFdlYkNvcmU6OlBsYXRmb3JtTW91c2VFdmVudCYpOwog
ICAgIGJvb2wgaGFuZGxlV2hlZWxFdmVudChXZWJDb3JlOjpQbGF0Zm9ybVdoZWVsRXZlbnQmKTsK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0L0R1bXBS
ZW5kZXJUcmVlU3VwcG9ydC5jcHAgYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3Vw
cG9ydC9EdW1wUmVuZGVyVHJlZVN1cHBvcnQuY3BwCmluZGV4IGE5MzAwNTAxMDU3MzBjMWRhNTMy
OTljYzE5ZGVmNGExOTYyMTBhYTcuLmM4ZWRlNmU1YTkzOGNmNTE2ZjQ2MWU0OWU3ZjAyYTczNGY2
MzA2OGIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9XZWJLaXRTdXBwb3J0
L0R1bXBSZW5kZXJUcmVlU3VwcG9ydC5jcHAKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5
L1dlYktpdFN1cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBwb3J0LmNwcApAQCAtMjksNyArMjksNyBA
QAogI2luY2x1ZGUgIkpTRWxlbWVudC5oIgogI2luY2x1ZGUgIlBhZ2UuaCIKICNpbmNsdWRlICJW
aWV3cG9ydEFyZ3VtZW50cy5oIgotI2luY2x1ZGUgIldlYlBhZ2UuaCIKKyNpbmNsdWRlICJXZWJQ
YWdlX3AuaCIKICNpbmNsdWRlICJiaW5kaW5ncy9qcy9HQ0NvbnRyb2xsZXIuaCIKICNpbmNsdWRl
IDxKYXZhU2NyaXB0Q29yZS9BUElDYXN0Lmg+CiAjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+
CkBAIC01Niw2ICs1NiwxMSBAQCBEdW1wUmVuZGVyVHJlZVN1cHBvcnQ6On5EdW1wUmVuZGVyVHJl
ZVN1cHBvcnQoKQogewogfQogCitQYWdlKiBEdW1wUmVuZGVyVHJlZVN1cHBvcnQ6OmNvcmVQYWdl
KFdlYlBhZ2UqIHdlYlBhZ2UpCit7CisgICAgcmV0dXJuIFdlYlBhZ2VQcml2YXRlOjpjb3JlKHdl
YlBhZ2UpOworfQorCiBpbnQgRHVtcFJlbmRlclRyZWVTdXBwb3J0OjpqYXZhU2NyaXB0T2JqZWN0
c0NvdW50KCkKIHsKICAgICByZXR1cm4gSlNET01XaW5kb3dCYXNlOjpjb21tb25KU0dsb2JhbERh
dGEoKS0+aGVhcC5nbG9iYWxPYmplY3RDb3VudCgpOwpAQCAtOTQsNyArOTksNyBAQCB2b2lkIER1
bXBSZW5kZXJUcmVlU3VwcG9ydDo6ZHVtcENvbmZpZ3VyYXRpb25Gb3JWaWV3cG9ydChGcmFtZSog
bWFpbkZyYW1lLCBpbnQgZAogaW50IER1bXBSZW5kZXJUcmVlU3VwcG9ydDo6bnVtYmVyT2ZQZW5k
aW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uUmVxdWVzdHMoV2ViUGFnZSogd2ViUGFnZSkKIHsKICNp
ZiBFTkFCTEUoQ0xJRU5UX0JBU0VEX0dFT0xPQ0FUSU9OKQotICAgIEdlb2xvY2F0aW9uQ2xpZW50
TW9jayogbW9ja0NsaWVudCA9IHRvR2VvbG9jYXRpb25DbGllbnRNb2NrKHdlYlBhZ2UtPm1haW5G
cmFtZSgpLT5wYWdlKCktPmdlb2xvY2F0aW9uQ29udHJvbGxlcigpLT5jbGllbnQoKSk7CisgICAg
R2VvbG9jYXRpb25DbGllbnRNb2NrKiBtb2NrQ2xpZW50ID0gdG9HZW9sb2NhdGlvbkNsaWVudE1v
Y2soY29yZVBhZ2Uod2ViUGFnZSktPmdlb2xvY2F0aW9uQ29udHJvbGxlcigpLT5jbGllbnQoKSk7
CiAgICAgcmV0dXJuIG1vY2tDbGllbnQtPm51bWJlck9mUGVuZGluZ1Blcm1pc3Npb25SZXF1ZXN0
cygpOwogI2Vsc2UKICAgICBVTlVTRURfUEFSQU0od2ViUGFnZSk7CkBAIC0xMDUsNyArMTEwLDcg
QEAgaW50IER1bXBSZW5kZXJUcmVlU3VwcG9ydDo6bnVtYmVyT2ZQZW5kaW5nR2VvbG9jYXRpb25Q
ZXJtaXNzaW9uUmVxdWVzdHMoV2ViUGFnZSoKIHZvaWQgRHVtcFJlbmRlclRyZWVTdXBwb3J0Ojpy
ZXNldEdlb2xvY2F0aW9uTW9jayhXZWJQYWdlKiB3ZWJQYWdlKQogewogI2lmIEVOQUJMRShDTElF
TlRfQkFTRURfR0VPTE9DQVRJT04pCi0gICAgR2VvbG9jYXRpb25DbGllbnRNb2NrKiBtb2NrQ2xp
ZW50ID0gdG9HZW9sb2NhdGlvbkNsaWVudE1vY2sod2ViUGFnZS0+bWFpbkZyYW1lKCktPnBhZ2Uo
KS0+Z2VvbG9jYXRpb25Db250cm9sbGVyKCktPmNsaWVudCgpKTsKKyAgICBHZW9sb2NhdGlvbkNs
aWVudE1vY2sqIG1vY2tDbGllbnQgPSB0b0dlb2xvY2F0aW9uQ2xpZW50TW9jayhjb3JlUGFnZSh3
ZWJQYWdlKS0+Z2VvbG9jYXRpb25Db250cm9sbGVyKCktPmNsaWVudCgpKTsKICAgICBtb2NrQ2xp
ZW50LT5yZXNldCgpOwogI2VuZGlmCiB9CkBAIC0xMjMsNyArMTI4LDcgQEAgdm9pZCBEdW1wUmVu
ZGVyVHJlZVN1cHBvcnQ6OnNldE1vY2tHZW9sb2NhdGlvbkVycm9yKFdlYlBhZ2UqIHdlYlBhZ2Us
IGludCBlcnJvckMKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgR2VvbG9jYXRpb25DbGll
bnRNb2NrKiBtb2NrQ2xpZW50ID0gc3RhdGljX2Nhc3Q8R2VvbG9jYXRpb25DbGllbnRNb2NrKj4o
d2ViUGFnZS0+bWFpbkZyYW1lKCktPnBhZ2UoKS0+Z2VvbG9jYXRpb25Db250cm9sbGVyKCktPmNs
aWVudCgpKTsKKyAgICBHZW9sb2NhdGlvbkNsaWVudE1vY2sqIG1vY2tDbGllbnQgPSBzdGF0aWNf
Y2FzdDxHZW9sb2NhdGlvbkNsaWVudE1vY2sqPihjb3JlUGFnZSh3ZWJQYWdlKS0+Z2VvbG9jYXRp
b25Db250cm9sbGVyKCktPmNsaWVudCgpKTsKICAgICBtb2NrQ2xpZW50LT5zZXRFcnJvcihHZW9s
b2NhdGlvbkVycm9yOjpjcmVhdGUoY29kZSwgbWVzc2FnZSkpOwogI2VuZGlmCiB9CkBAIC0xMzEs
NyArMTM2LDcgQEAgdm9pZCBEdW1wUmVuZGVyVHJlZVN1cHBvcnQ6OnNldE1vY2tHZW9sb2NhdGlv
bkVycm9yKFdlYlBhZ2UqIHdlYlBhZ2UsIGludCBlcnJvckMKIHZvaWQgRHVtcFJlbmRlclRyZWVT
dXBwb3J0OjpzZXRNb2NrR2VvbG9jYXRpb25QZXJtaXNzaW9uKFdlYlBhZ2UqIHdlYlBhZ2UsIGJv
b2wgYWxsb3dlZCkKIHsKICNpZiBFTkFCTEUoQ0xJRU5UX0JBU0VEX0dFT0xPQ0FUSU9OKQotICAg
IEdlb2xvY2F0aW9uQ2xpZW50TW9jayogbW9ja0NsaWVudCA9IHRvR2VvbG9jYXRpb25DbGllbnRN
b2NrKHdlYlBhZ2UtPm1haW5GcmFtZSgpLT5wYWdlKCktPmdlb2xvY2F0aW9uQ29udHJvbGxlcigp
LT5jbGllbnQoKSk7CisgICAgR2VvbG9jYXRpb25DbGllbnRNb2NrKiBtb2NrQ2xpZW50ID0gdG9H
ZW9sb2NhdGlvbkNsaWVudE1vY2soY29yZVBhZ2Uod2ViUGFnZSktPmdlb2xvY2F0aW9uQ29udHJv
bGxlcigpLT5jbGllbnQoKSk7CiAgICAgbW9ja0NsaWVudC0+c2V0UGVybWlzc2lvbihhbGxvd2Vk
KTsKICNlbmRpZgogfQpAQCAtMTM5LDE0ICsxNDQsMTQgQEAgdm9pZCBEdW1wUmVuZGVyVHJlZVN1
cHBvcnQ6OnNldE1vY2tHZW9sb2NhdGlvblBlcm1pc3Npb24oV2ViUGFnZSogd2ViUGFnZSwgYm9v
bAogdm9pZCBEdW1wUmVuZGVyVHJlZVN1cHBvcnQ6OnNldE1vY2tHZW9sb2NhdGlvblBvc2l0aW9u
KFdlYlBhZ2UqIHdlYlBhZ2UsIGRvdWJsZSBsYXRpdHVkZSwgZG91YmxlIGxvbmdpdHVkZSwgZG91
YmxlIGFjY3VyYWN5KQogewogI2lmIEVOQUJMRShDTElFTlRfQkFTRURfR0VPTE9DQVRJT04pCi0g
ICAgR2VvbG9jYXRpb25DbGllbnRNb2NrKiBtb2NrQ2xpZW50ID0gdG9HZW9sb2NhdGlvbkNsaWVu
dE1vY2sod2ViUGFnZS0+bWFpbkZyYW1lKCktPnBhZ2UoKS0+Z2VvbG9jYXRpb25Db250cm9sbGVy
KCktPmNsaWVudCgpKTsKKyAgICBHZW9sb2NhdGlvbkNsaWVudE1vY2sqIG1vY2tDbGllbnQgPSB0
b0dlb2xvY2F0aW9uQ2xpZW50TW9jayhjb3JlUGFnZSh3ZWJQYWdlKS0+Z2VvbG9jYXRpb25Db250
cm9sbGVyKCktPmNsaWVudCgpKTsKICAgICBtb2NrQ2xpZW50LT5zZXRQb3NpdGlvbihHZW9sb2Nh
dGlvblBvc2l0aW9uOjpjcmVhdGUoY3VycmVudFRpbWUoKSwgbGF0aXR1ZGUsIGxvbmdpdHVkZSwg
YWNjdXJhY3kpKTsKICNlbmRpZgogfQogCiB2b2lkIER1bXBSZW5kZXJUcmVlU3VwcG9ydDo6c2Nh
bGVQYWdlQnkoV2ViUGFnZSogd2ViUGFnZSwgZmxvYXQgc2NhbGVGYWN0b3IsIGZsb2F0IHgsIGZs
b2F0IHkpCiB7Ci0gICAgd2ViUGFnZS0+bWFpbkZyYW1lKCktPnBhZ2UoKS0+c2V0UGFnZVNjYWxl
RmFjdG9yKHNjYWxlRmFjdG9yLCBJbnRQb2ludCh4LCB5KSk7CisgICAgY29yZVBhZ2Uod2ViUGFn
ZSktPnNldFBhZ2VTY2FsZUZhY3RvcihzY2FsZUZhY3RvciwgSW50UG9pbnQoeCwgeSkpOwogfQog
CiBKU1ZhbHVlUmVmIER1bXBSZW5kZXJUcmVlU3VwcG9ydDo6Y29tcHV0ZWRTdHlsZUluY2x1ZGlu
Z1Zpc2l0ZWRJbmZvKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU1ZhbHVlUmVmIHZhbHVlKQpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L1dlYktpdFN1cHBvcnQvRHVtcFJlbmRl
clRyZWVTdXBwb3J0LmggYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9E
dW1wUmVuZGVyVHJlZVN1cHBvcnQuaAppbmRleCAzYjE0MDMwNGIyMzAwNzA4YTdmMTA5YjJlZThl
NDk1NWM1OTRlNDMyLi41NGU0OGYwMjk4MGE2YjFlZWZhMGI2MDVkZWU1NjYwNTVhZGEyODhlIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3VwcG9ydC9EdW1wUmVu
ZGVyVHJlZVN1cHBvcnQuaAorKysgYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvV2ViS2l0U3Vw
cG9ydC9EdW1wUmVuZGVyVHJlZVN1cHBvcnQuaApAQCAtMjksNiArMjksNyBAQCBjbGFzcyBXZWJQ
YWdlOwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiBjbGFzcyBGcmFtZTsKK2NsYXNzIFBhZ2U7CiB9
CiAKIG5hbWVzcGFjZSBXVEYgewpAQCAtNDAsNiArNDEsOCBAQCBwdWJsaWM6CiAgICAgRHVtcFJl
bmRlclRyZWVTdXBwb3J0KCk7CiAgICAgfkR1bXBSZW5kZXJUcmVlU3VwcG9ydCgpOwogCisgICAg
c3RhdGljIFdlYkNvcmU6OlBhZ2UqIGNvcmVQYWdlKEJsYWNrQmVycnk6OldlYktpdDo6V2ViUGFn
ZSopOworCiAgICAgc3RhdGljIHZvaWQgc2V0TGlua3NJbmNsdWRlZEluRm9jdXNDaGFpbihib29s
KTsKICAgICBzdGF0aWMgYm9vbCBsaW5rc0luY2x1ZGVkSW5Gb2N1c0NoYWluKCk7CiAKZGlmZiAt
LWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRleCAxOGVhZmNiMjFj
YzQwNGJlZDE5NTJiODlmY2UxOWUxZmYwN2RiNGNkLi4yYzU3YmUwM2Q0YTU1Yjg5NmNiYTE1OTlh
NTAyNmYzNWUxN2Q3MmEyIDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMv
Q2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTItMDItMjcgIEphY2t5IEppYW5nICA8emhh
amlhbmdAcmltLmNvbT4KKworICAgICAgICBbQmxhY2tCZXJyeV0gVXBzdHJlYW0gQmxhY2tCZXJy
eSBBUEkgd2ViIHBhZ2UgcmVsYXRlZCBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQzODAKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBBZGFwdCB0byB0aGUgcmVtb3Zpbmcgb2YgV2ViUGFnZTo6bWFp
bkZyYW1lKCksIHVzZQorICAgICAgICBEdW1wUmVuZGVyVHJlZVN1cHBvcnQ6OmNvcmVQYWdlKCkg
YW5kIGl0cyBtYWluRnJhbWUoKSBpbnN0ZWFkLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBhcyB0
aGlzIHBhdGNoIGRvZXNuJ3QgY2hhbmdlIGJlaGF2aW9yLgorCisgICAgICAgICogRHVtcFJlbmRl
clRyZWUvYmxhY2tiZXJyeS9EdW1wUmVuZGVyVHJlZS5jcHA6CisgICAgICAgIChCbGFja0JlcnJ5
OjpXZWJLaXQ6OkR1bXBSZW5kZXJUcmVlOjpyZXNldFRvQ29uc2lzdGVudFN0YXRlQmVmb3JlVGVz
dGluZyk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkR1bXBSZW5kZXJUcmVlOjpydW5U
ZXN0cyk6CisKIDIwMTItMDItMjcgIFhpYW56aHUgV2FuZyAgPHdhbmd4aWFuemh1QGNocm9taXVt
Lm9yZz4KIAogICAgICAgICBDaHJvbWl1bS1BbmRyb2lkIGxheW91dCB0ZXN0IHNjcmlwdDogdGhl
IGFkYiBzaGVsbCBwcm9tcHQgaXMgbm90IGFsd2F5cyAnIyAnCmRpZmYgLS1naXQgYS9Ub29scy9E
dW1wUmVuZGVyVHJlZS9ibGFja2JlcnJ5L0R1bXBSZW5kZXJUcmVlLmNwcCBiL1Rvb2xzL0R1bXBS
ZW5kZXJUcmVlL2JsYWNrYmVycnkvRHVtcFJlbmRlclRyZWUuY3BwCmluZGV4IGZiNTJjZmRlOTM0
YmE4NTBkODVjMjg4OTMwYWQ2NWRmMDhlOTZiYmYuLjVjMWU4ZjhhNzhiZmE4YTYyNmQ3N2UzMTA5
MmYwMzU3MzYwOWI0MTQgMTAwNjQ0Ci0tLSBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2JsYWNrYmVy
cnkvRHVtcFJlbmRlclRyZWUuY3BwCisrKyBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2JsYWNrYmVy
cnkvRHVtcFJlbmRlclRyZWUuY3BwCkBAIC0yNjUsMjEgKzI2NSwyMiBAQCB2b2lkIER1bXBSZW5k
ZXJUcmVlOjpyZXNldFRvQ29uc2lzdGVudFN0YXRlQmVmb3JlVGVzdGluZygpCiAgICAgbV9wYWdl
LT5yZXNldFZpcnR1YWxWaWV3cG9ydE9uQ29tbWl0dGVkKGZhbHNlKTsKICAgICBtX3BhZ2UtPnNl
dEphdmFTY3JpcHRDYW5BY2Nlc3NDbGlwYm9hcmQodHJ1ZSk7CiAKLSAgICBtYWluRnJhbWUgPSBt
X3BhZ2UtPm1haW5GcmFtZSgpOwotICAgIGlmIChtYWluRnJhbWUpIHsKLSAgICAgICAgbWFpbkZy
YW1lLT5wYWdlKCktPnNldFRhYktleUN5Y2xlc1Rocm91Z2hFbGVtZW50cyh0cnVlKTsKLSAgICAg
ICAgbWFpbkZyYW1lLT5wYWdlKCktPnNldHRpbmdzKCktPnNldEVkaXRpbmdCZWhhdmlvclR5cGUo
V2ViQ29yZTo6RWRpdGluZ1VuaXhCZWhhdmlvcik7Ci0gICAgICAgIG1haW5GcmFtZS0+cGFnZSgp
LT5zZXR0aW5ncygpLT5zZXRET01QYXN0ZUFsbG93ZWQodHJ1ZSk7Ci0gICAgICAgIG1haW5GcmFt
ZS0+cGFnZSgpLT5zZXR0aW5ncygpLT5zZXRWYWxpZGF0aW9uTWVzc2FnZVRpbWVyTWFnbmlmaWNh
dGlvbigtMSk7Ci0gICAgICAgIG1haW5GcmFtZS0+cGFnZSgpLT5zZXR0aW5ncygpLT5zZXRJbnRl
cmFjdGl2ZUZvcm1WYWxpZGF0aW9uRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgbWFpbkZyYW1lLT5w
YWdlKCktPnNldHRpbmdzKCktPnNldEFsbG93RmlsZUFjY2Vzc0Zyb21GaWxlVVJMcyh0cnVlKTsK
LSAgICAgICAgbWFpbkZyYW1lLT5wYWdlKCktPnNldHRpbmdzKCktPnNldEFsbG93VW5pdmVyc2Fs
QWNjZXNzRnJvbUZpbGVVUkxzKHRydWUpOwotICAgICAgICBtYWluRnJhbWUtPnBhZ2UoKS0+c2V0
dGluZ3MoKS0+c2V0QXV0aG9yQW5kVXNlclN0eWxlc0VuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIG1h
aW5GcmFtZS0+cGFnZSgpLT5zZXR0aW5ncygpLT5zZXRVc2VQcmVIVE1MNVBhcnNlclF1aXJrcyhm
YWxzZSk7Ci0gICAgICAgIG1haW5GcmFtZS0+dHJlZSgpLT5jbGVhck5hbWUoKTsKLSAgICAgICAg
bWFpbkZyYW1lLT5sb2FkZXIoKS0+c2V0T3BlbmVyKDApOworICAgIGlmIChXZWJDb3JlOjpQYWdl
KiBwYWdlID0gRHVtcFJlbmRlclRyZWVTdXBwb3J0Ojpjb3JlUGFnZShtX3BhZ2UpKSB7CisgICAg
ICAgIHBhZ2UtPnNldFRhYktleUN5Y2xlc1Rocm91Z2hFbGVtZW50cyh0cnVlKTsKKyAgICAgICAg
cGFnZS0+c2V0dGluZ3MoKS0+c2V0RWRpdGluZ0JlaGF2aW9yVHlwZShXZWJDb3JlOjpFZGl0aW5n
VW5peEJlaGF2aW9yKTsKKyAgICAgICAgcGFnZS0+c2V0dGluZ3MoKS0+c2V0RE9NUGFzdGVBbGxv
d2VkKHRydWUpOworICAgICAgICBwYWdlLT5zZXR0aW5ncygpLT5zZXRWYWxpZGF0aW9uTWVzc2Fn
ZVRpbWVyTWFnbmlmaWNhdGlvbigtMSk7CisgICAgICAgIHBhZ2UtPnNldHRpbmdzKCktPnNldElu
dGVyYWN0aXZlRm9ybVZhbGlkYXRpb25FbmFibGVkKHRydWUpOworICAgICAgICBwYWdlLT5zZXR0
aW5ncygpLT5zZXRBbGxvd0ZpbGVBY2Nlc3NGcm9tRmlsZVVSTHModHJ1ZSk7CisgICAgICAgIHBh
Z2UtPnNldHRpbmdzKCktPnNldEFsbG93VW5pdmVyc2FsQWNjZXNzRnJvbUZpbGVVUkxzKHRydWUp
OworICAgICAgICBwYWdlLT5zZXR0aW5ncygpLT5zZXRBdXRob3JBbmRVc2VyU3R5bGVzRW5hYmxl
ZCh0cnVlKTsKKyAgICAgICAgcGFnZS0+c2V0dGluZ3MoKS0+c2V0VXNlUHJlSFRNTDVQYXJzZXJR
dWlya3MoZmFsc2UpOwogICAgICAgICAvLyBGSVhNRTogT3RoZXIgcG9ydHMgYWxzbyBjbGVhciBo
aXN0b3J5L2JhY2tGb3J3YXJkTGlzdCBhbGxvbmcgd2l0aCB2aXNpdGVkIGxpbmtzLgotICAgICAg
ICBtYWluRnJhbWUtPnBhZ2UoKS0+Z3JvdXAoKS5yZW1vdmVWaXNpdGVkTGlua3MoKTsKKyAgICAg
ICAgcGFnZS0+Z3JvdXAoKS5yZW1vdmVWaXNpdGVkTGlua3MoKTsKKyAgICAgICAgaWYgKG1haW5G
cmFtZSA9IHBhZ2UtPm1haW5GcmFtZSgpKSB7CisgICAgICAgICAgICBtYWluRnJhbWUtPnRyZWUo
KS0+Y2xlYXJOYW1lKCk7CisgICAgICAgICAgICBtYWluRnJhbWUtPmxvYWRlcigpLT5zZXRPcGVu
ZXIoMCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBGb3Igbm93IHdlIG1hbnVhbGx5IGdh
cmJhZ2UgY29sbGVjdCBiZXR3ZWVuIGVhY2ggdGVzdCB0byBtYWtlIHN1cmUgdGhlIGRldmljZSB3
b24ndCBydW4gb3V0IG9mIG1lbW9yeSBkdWUgdG8gbGF6eSBjb2xsZWN0aW9uLgpAQCAtMjkyLDcg
KzI5Myw3IEBAIHZvaWQgRHVtcFJlbmRlclRyZWU6OnJ1blRlc3RzKCkKICAgICBtX2FjY2Vzc2li
aWxpdHlDb250cm9sbGVyID0gbmV3IEFjY2Vzc2liaWxpdHlDb250cm9sbGVyKCk7CiAgICAgZ2V0
VGVzdHNUb1J1bigpOwogCi0gICAgbWFpbkZyYW1lID0gbV9wYWdlLT5tYWluRnJhbWUoKTsKKyAg
ICBtYWluRnJhbWUgPSBEdW1wUmVuZGVyVHJlZVN1cHBvcnQ6OmNvcmVQYWdlKG1fcGFnZSktPm1h
aW5GcmFtZSgpOwogCiAgICAgbV9jdXJyZW50VGVzdCA9IG1fdGVzdHMuYmVnaW4oKTsKIAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>