<?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>50514</bug_id>
          
          <creation_ts>2010-12-03 22:15:03 -0800</creation_ts>
          <short_desc>WebKit2: Context menu support on Windows</short_desc>
          <delta_ts>2011-04-07 11:13:59 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Windows 7</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar, PlatformOnly</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>50586</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Brian Weinstein">bweinstein</reporter>
          <assigned_to name="Brian Weinstein">bweinstein</assigned_to>
          <cc>aroben</cc>
    
    <cc>buildbot</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>317238</commentid>
    <comment_count>0</comment_count>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-03 22:15:03 -0800</bug_when>
    <thetext>WebKit2 needs support for context menu items on Windows.

Context menus and context menu items on Windows need a major refactoring, because in their current state, they are not copyable (if you try to make a Vector of them, you will see a crash/double free, but the current WebKit1 code doesn&apos;t need to do this, so we&apos;ve gotten away with it so far).

The plan in this patch will be:

1) Refactor ContextMenu to be backed by a Vector&lt;ContextMenuItem&gt; (instead of an HMENU) and refactor ContextMenuItem to be backed by a

struct PlatformMenuItemDescription {
        PlatformMenuItemDescription()
            : type(ActionType)
            , action(ContextMenuItemTagNoAction)
            , title(&quot;&quot;)
            , checked(false)
            , enabled(true) { }
        ContextMenuItemType type;
        ContextMenuAction action;
        String title;
        Vector&lt;ContextMenuItem&gt; subMenuItems;
        bool checked;
        bool enabled;
    };

to match the other platforms.

2) Implement the necessary stubs in WebContextMenuProxyWin in WebKit2 to be able to create/draw context menus in WebKit2.

&lt;rdar://problem/8608754&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317241</commentid>
    <comment_count>1</comment_count>
      <attachid>75602</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-03 23:29:36 -0800</bug_when>
    <thetext>Created attachment 75602
[PATCH] Context Menu Refactoring

I&apos;m not 100% on the lifetimes of the platformRepresentations, so if the reviewer could take an extra-close look at that, that would be great.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317242</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-12-03 23:31:06 -0800</bug_when>
    <thetext>Attachment 75602 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;WebCore/ChangeLog&apos;, u&apos;WebCore/platform/ContextMenu.h&apos;, u&apos;WebCore/platform/ContextMenuItem.h&apos;, u&apos;WebCore/platform/PlatformMenuDescription.h&apos;, u&apos;WebCore/platform/win/ContextMenuItemWin.cpp&apos;, u&apos;WebCore/platform/win/ContextMenuWin.cpp&apos;, u&apos;WebKit/win/ChangeLog&apos;, u&apos;WebKit/win/WebCoreSupport/WebContextMenuClient.cpp&apos;, u&apos;WebKit/win/WebCoreSupport/WebContextMenuClient.h&apos;, u&apos;WebKit/win/WebView.cpp&apos;]&quot; exit_code: 1
WebCore/platform/win/ContextMenuWin.cpp:162:  This { should be at the end of the previous line  [whitespace/braces] [4]
WebCore/platform/win/ContextMenuWin.cpp:203:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
WebCore/platform/win/ContextMenuWin.cpp:216:  This { should be at the end of the previous line  [whitespace/braces] [4]
WebKit/win/WebView.cpp:1280:  One line control clauses should not use braces.  [whitespace/braces] [4]
Total errors found: 4 in 10 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317243</commentid>
    <comment_count>3</comment_count>
      <attachid>75603</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-03 23:35:59 -0800</bug_when>
    <thetext>Created attachment 75603
[PATCH] Context Menu Refactoring w/ style fixes 

Patch with style nits fixed - still same comments apply about the lifetime questions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317334</commentid>
    <comment_count>4</comment_count>
      <attachid>75622</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-04 19:04:30 -0800</bug_when>
    <thetext>Created attachment 75622
[PATCH] WebKit2 Win Context Menu Support</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317335</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-12-04 19:06:43 -0800</bug_when>
    <thetext>Attachment 75622 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;WebKit2/ChangeLog&apos;, u&apos;WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp&apos;, u&apos;WebKit2/UIProcess/win/WebContextMenuProxyWin.h&apos;, u&apos;WebKit2/UIProcess/win/WebView.cpp&apos;]&quot; exit_code: 1
WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp:46:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
Total errors found: 1 in 4 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317336</commentid>
    <comment_count>6</comment_count>
      <attachid>75623</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-04 19:09:21 -0800</bug_when>
    <thetext>Created attachment 75623
[PATCH] WebKit2 Win Context Menu Support w/ Style Fixes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317684</commentid>
    <comment_count>7</comment_count>
      <attachid>75623</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-12-06 10:01:25 -0800</bug_when>
    <thetext>Comment on attachment 75623
[PATCH] WebKit2 Win Context Menu Support w/ Style Fixes

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

&gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp:43
&gt; +    for (unsigned i = 0; i &lt; items.size(); ++i) {

size_t is the correct type for iterating a vector.

&gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp:44
&gt; +        WebContextMenuItemData itemData = items[i];

It’s better to use const WebContextMenuItemData&amp; to avoid an unnecessary copy of the data.

&gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp:49
&gt; +            UINT flags = 0;
&gt; +            flags |= itemData.enabled() ? MF_ENABLED : MF_DISABLED;

Seems you could combine these two lines and get better clarity.

&gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp:53
&gt; +            WTF::String title = itemData.title();
&gt; +            ::AppendMenu(menu, flags, itemData.action(), title.charactersWithNullTermination());

Why WTF::String instead of String here? I also think you should just drop the title local variable and say item.title().charactersWithNullTermination().

&gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp:65
&gt; +            WTF::String title = itemData.title();
&gt; +            ::AppendMenu(menu, MF_POPUP, (UINT) subMenu, title.charactersWithNullTermination());

Extra space in &quot;(UINT) subMenu&quot;. Also, is this our usual idiom for this cast? Can we use reinterpret_cast instead? Also, same comment about title local variable as above.

&gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp:87
&gt; +    UINT flags = TPM_RIGHTBUTTON | TPM_TOPALIGN | TPM_VERPOSANIMATION | TPM_HORIZONTAL
&gt; +            | TPM_LEFTALIGN | TPM_HORPOSANIMATION | TPM_RETURNCMD | TPM_NONOTIFY;

Indentation here is peculiar. Could be either 4-space indented, or all on one line.

&gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp:98
&gt; +    if (m_menu)
&gt; +        ::DestroyMenu(m_menu);

Shouldn’t this also set m_menu to 0?

&gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.h:44
&gt; +    WebContextMenuProxyWin(HWND parentWindow, WebPageProxy* page);

Argument name “page” seems unneeded here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317694</commentid>
    <comment_count>8</comment_count>
      <attachid>75603</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-12-06 10:19:46 -0800</bug_when>
    <thetext>Comment on attachment 75603
[PATCH] Context Menu Refactoring w/ style fixes 

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

I didn’t have time to review this whole thing, but there is a layering violation here.

&gt; WebCore/platform/ContextMenu.h:55
&gt;          ContextMenu(const HitTestResult&amp;, const PlatformMenuDescription);
&gt; +#if PLATFORM(WIN)
&gt; +        ContextMenu(const HitTestResult&amp;, const HMENU);
&gt; +#endif

The “const HMENU” here is no different from HMENU, and the const should be removed.

Same is true for “const PlatformMenuDescription”.

&gt; WebCore/platform/ContextMenuItem.h:44
&gt; +#include &quot;HitTestResult.h&quot;

This can’t be right. The platform directory is not allowed to include headers from the rest of WebCore. Something needs to be moved instead.

&gt; WebCore/platform/ContextMenuItem.h:281
&gt; +        ContextMenuItem(const HitTestResult&amp;, const LPMENUITEMINFO);

This is not acceptable layering. HitTestResult is a browser level concept that does not belong here at the platform layer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317706</commentid>
    <comment_count>9</comment_count>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-06 10:31:29 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 75603 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=75603&amp;action=review
&gt; 
&gt; I didn’t have time to review this whole thing, but there is a layering violation here.
&gt; 
&gt; &gt; WebCore/platform/ContextMenu.h:55
&gt; &gt;          ContextMenu(const HitTestResult&amp;, const PlatformMenuDescription);
&gt; &gt; +#if PLATFORM(WIN)
&gt; &gt; +        ContextMenu(const HitTestResult&amp;, const HMENU);
&gt; &gt; +#endif
&gt; 
&gt; The “const HMENU” here is no different from HMENU, and the const should be removed.
&gt; 
&gt; Same is true for “const PlatformMenuDescription”.
&gt; 
&gt; &gt; WebCore/platform/ContextMenuItem.h:44
&gt; &gt; +#include &quot;HitTestResult.h&quot;
&gt; 
&gt; This can’t be right. The platform directory is not allowed to include headers from the rest of WebCore. Something needs to be moved instead.
&gt; 
&gt; &gt; WebCore/platform/ContextMenuItem.h:281
&gt; &gt; +        ContextMenuItem(const HitTestResult&amp;, const LPMENUITEMINFO);
&gt; 
&gt; This is not acceptable layering. HitTestResult is a browser level concept that does not belong here at the platform layer.

I&apos;m confused by this, because ContextMenu also has a HitTestResult, and ContextMenu.h/.cpp is in the WebCore/platform directory as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317719</commentid>
    <comment_count>10</comment_count>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-06 10:54:50 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 75623 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=75623&amp;action=review
&gt; 
&gt; &gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp:43
&gt; &gt; +    for (unsigned i = 0; i &lt; items.size(); ++i) {
&gt; 
&gt; size_t is the correct type for iterating a vector.

Fixed.

&gt; 
&gt; &gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp:44
&gt; &gt; +        WebContextMenuItemData itemData = items[i];
&gt; 
&gt; It’s better to use const WebContextMenuItemData&amp; to avoid an unnecessary copy of the data.

Fixed.

&gt; 
&gt; &gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp:49
&gt; &gt; +            UINT flags = 0;
&gt; &gt; +            flags |= itemData.enabled() ? MF_ENABLED : MF_DISABLED;
&gt; 
&gt; Seems you could combine these two lines and get better clarity.

Fixed.

&gt; 
&gt; &gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp:53
&gt; &gt; +            WTF::String title = itemData.title();
&gt; &gt; +            ::AppendMenu(menu, flags, itemData.action(), title.charactersWithNullTermination());
&gt; 
&gt; Why WTF::String instead of String here? I also think you should just drop the title local variable and say item.title().charactersWithNullTermination().

When I do that, I get a compile error: &apos;WTF::String::charactersWithNullTermination&apos; : cannot convert &apos;this&apos; pointer from &apos;const WTF::String&apos; to &apos;WTF::String &amp;&apos;, but I made the local variable be just of type String, instead of WTF::String.

&gt; 
&gt; &gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp:65
&gt; &gt; +            WTF::String title = itemData.title();
&gt; &gt; +            ::AppendMenu(menu, MF_POPUP, (UINT) subMenu, title.charactersWithNullTermination());
&gt; 
&gt; Extra space in &quot;(UINT) subMenu&quot;. Also, is this our usual idiom for this cast? Can we use reinterpret_cast instead? Also, same comment about title local variable as above.

Same response as above about the title. Switched to using reinterpret_cast.

&gt; 
&gt; &gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp:87
&gt; &gt; +    UINT flags = TPM_RIGHTBUTTON | TPM_TOPALIGN | TPM_VERPOSANIMATION | TPM_HORIZONTAL
&gt; &gt; +            | TPM_LEFTALIGN | TPM_HORPOSANIMATION | TPM_RETURNCMD | TPM_NONOTIFY;
&gt; 
&gt; Indentation here is peculiar. Could be either 4-space indented, or all on one line.

Moved to all on one line.

&gt; 
&gt; &gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.cpp:98
&gt; &gt; +    if (m_menu)
&gt; &gt; +        ::DestroyMenu(m_menu);
&gt; 
&gt; Shouldn’t this also set m_menu to 0?

Fixed.

&gt; 
&gt; &gt; WebKit2/UIProcess/win/WebContextMenuProxyWin.h:44
&gt; &gt; +    WebContextMenuProxyWin(HWND parentWindow, WebPageProxy* page);
&gt; 
&gt; Argument name “page” seems unneeded here.

Removed.

Thanks for the review!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317766</commentid>
    <comment_count>11</comment_count>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-06 12:00:57 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #8)
&gt; &gt; (From update of attachment 75603 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=75603&amp;action=review
&gt; &gt; 
&gt; &gt; I didn’t have time to review this whole thing, but there is a layering violation here.
&gt; &gt; 
&gt; &gt; &gt; WebCore/platform/ContextMenu.h:55
&gt; &gt; &gt;          ContextMenu(const HitTestResult&amp;, const PlatformMenuDescription);
&gt; &gt; &gt; +#if PLATFORM(WIN)
&gt; &gt; &gt; +        ContextMenu(const HitTestResult&amp;, const HMENU);
&gt; &gt; &gt; +#endif
&gt; &gt; 
&gt; &gt; The “const HMENU” here is no different from HMENU, and the const should be removed.
&gt; &gt; 
&gt; &gt; Same is true for “const PlatformMenuDescription”.
&gt; &gt; 
&gt; &gt; &gt; WebCore/platform/ContextMenuItem.h:44
&gt; &gt; &gt; +#include &quot;HitTestResult.h&quot;
&gt; &gt; 
&gt; &gt; This can’t be right. The platform directory is not allowed to include headers from the rest of WebCore. Something needs to be moved instead.
&gt; &gt; 
&gt; &gt; &gt; WebCore/platform/ContextMenuItem.h:281
&gt; &gt; &gt; +        ContextMenuItem(const HitTestResult&amp;, const LPMENUITEMINFO);
&gt; &gt; 
&gt; &gt; This is not acceptable layering. HitTestResult is a browser level concept that does not belong here at the platform layer.
&gt; 
&gt; I&apos;m confused by this, because ContextMenu also has a HitTestResult, and ContextMenu.h/.cpp is in the WebCore/platform directory as well.

One option that comes to mind is that we could move the HitTestResult into ContextMenuController, since the ContextMenuController only keeps information about one ContextMenu.

I&apos;d like to do this in a follow-up however.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317854</commentid>
    <comment_count>12</comment_count>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-06 14:42:21 -0800</bug_when>
    <thetext>After discussion with Adam Roben, I&apos;m going to fix the layering violation in ContextMenu first - by moving functions in ContextMenu that interact with the m_hitTestResult (populate, appendInspectElementItem, checkOrEnableIfNeeded into ContextMenuController).

This is tracked by https://bugs.webkit.org/show_bug.cgi?id=50586.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318957</commentid>
    <comment_count>13</comment_count>
      <attachid>75950</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-08 12:57:08 -0800</bug_when>
    <thetext>Created attachment 75950
[PATCH] Context Menu Refactoring</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318961</commentid>
    <comment_count>14</comment_count>
      <attachid>75952</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-08 13:05:49 -0800</bug_when>
    <thetext>Created attachment 75952
[PATCH] Context Menu Refactoring - Reordered Functions</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318994</commentid>
    <comment_count>15</comment_count>
      <attachid>75952</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-12-08 13:41:42 -0800</bug_when>
    <thetext>Comment on attachment 75952
[PATCH] Context Menu Refactoring - Reordered Functions

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

&gt; WebCore/ChangeLog:20
&gt; +            that is a list of ContextMenuItems.

s/list/Vector/

&gt; WebCore/platform/ContextMenu.h:74
&gt; +        static void nativeMenu(PlatformMenuDescription, HMENU);

Can this function return an HMENU instead of filling one in?

&gt; WebCore/platform/ContextMenuItem.h:174
&gt; +            , title(&quot;&quot;)

Do we really need an empty string (and not a null string) here?

&gt; WebCore/platform/ContextMenuItem.h:176
&gt; +            , enabled(true) { }

These braces should be on their own lines.

&gt; WebCore/platform/ContextMenuItem.h:280
&gt; +        ContextMenuItem(const LPMENUITEMINFO);

The &quot;const&quot; here is meaningless.

&gt; WebCore/platform/ContextMenuItem.h:310
&gt; +        static void nativeMenuItem(const PlatformMenuItemDescription&amp;, LPMENUITEMINFO);

Can this return a MENUITEMINFO instead?

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:50
&gt; +    : m_platformDescription()

This isn&apos;t needed.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:63
&gt; +    m_platformDescription.type = info-&gt;fType &amp; MFT_SEPARATOR ? SeparatorType : ActionType;
&gt; +    m_platformDescription.action = static_cast&lt;ContextMenuAction&gt;(info-&gt;wID);
&gt; +    m_platformDescription.title = String(info-&gt;dwTypeData, wcslen(info-&gt;dwTypeData));
&gt; +
&gt; +    if (info-&gt;hSubMenu) {
&gt; +        m_platformDescription.type = SubmenuType;
&gt; +        ContextMenu subMenu(info-&gt;hSubMenu);
&gt; +        m_platformDescription.subMenuItems = contextMenuItemVector(subMenu.releasePlatformDescription());
&gt;      }
&gt; +
&gt; +    m_platformDescription.checked = info-&gt;fState &amp; MFS_CHECKED;
&gt; +    m_platformDescription.enabled = !(info-&gt;fState &amp; MFS_DISABLED);

You need to check that info-&gt;fMask has the relevant bit set before you use any of info&apos;s other members.

I think you should be using == instead of &amp; when comparing with MFT_SEPARATOR.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:67
&gt; +    : m_platformDescription()

This isn&apos;t needed.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:81
&gt; +    : m_platformDescription()

This isn&apos;t needed.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:87
&gt; +    : m_platformDescription()

This isn&apos;t needed.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:92
&gt; +ContextMenuItem::ContextMenuItem(PlatformMenuItemDescription item)

This should really take a const PlatformMenuItemDescription&amp;.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:101
&gt; +PlatformMenuItemDescription ContextMenuItem::releasePlatformDescription()

Can we just call this platformDescription instead? And have it return a const PlatformMenuItemDescription&amp;?

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:123
&gt; +    return const_cast&lt;Vector&lt;ContextMenuItem&gt;*&gt;(&amp;m_platformDescription.subMenuItems);

The const_cast here is ugly. Can we make PlatformMenuDescription be a const Vector&lt;ContextMenuItem&gt;* instead?

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:199
&gt; +void ContextMenuItem::nativeMenuItem(const PlatformMenuItemDescription&amp; item, LPMENUITEMINFO info)
&gt; +{
&gt; +    memset(info, 0, sizeof(MENUITEMINFO));
&gt; +    info-&gt;cbSize = sizeof(MENUITEMINFO);
&gt; +    
&gt; +    info-&gt;fMask = MIIM_FTYPE | MIIM_ID | MIIM_STRING | MIIM_STATE | MIIM_SUBMENU;
&gt; +
&gt; +    if (item.type == SubmenuType) {
&gt; +        HMENU nativeMenu = ::CreatePopupMenu();
&gt; +        ContextMenu::nativeMenu(const_cast&lt;Vector&lt;ContextMenuItem&gt;*&gt;(&amp;item.subMenuItems), nativeMenu);
&gt; +        info-&gt;hSubMenu = nativeMenu;
&gt; +    }
&gt; +
&gt; +    if (item.type == SeparatorType)
&gt; +        info-&gt;fType = MFT_SEPARATOR;
&gt; +    else
&gt; +        info-&gt;fType = MFT_STRING;
&gt; +
&gt; +    info-&gt;wID = item.action;
&gt; +
&gt; +    info-&gt;fState |= item.enabled ? MFS_ENABLED : MFS_DISABLED;
&gt; +    info-&gt;fState |= item.checked ? MFS_CHECKED : MFS_UNCHECKED;
&gt;  }

It looks like you aren&apos;t preserving the item&apos;s title.

Do callers know they are responsible for the HMENU in info-&gt;hSubMenu?

&gt; WebCore/platform/win/ContextMenuWin.cpp:57
&gt; +        int menuStringLength = ::GetMenuString(menu, i, 0, 0, MF_BYPOSITION);

MSDN says you&apos;re supposed to use GetMenuItemInfo instead of GetMenuString.

&gt; WebCore/platform/win/ContextMenuWin.cpp:59
&gt; +        if (!menuStringLength) {
&gt; +            // If we don&apos;t have a string, then we must be in a separator.

A better way to determine this is to check MENUITEMINFO::fType after calling GetMenuItemInfo.

&gt; WebCore/platform/win/ContextMenuWin.cpp:75
&gt; +        free(menuString);

This is wrong. You can&apos;t mix new[] and free(). You should be using delete[] (except that really you should be using OwnArrayPtr).

&gt; WebCore/platform/win/ContextMenuWin.cpp:154
&gt; +static ContextMenuItem* itemWithActionInMenu(unsigned action, Vector&lt;ContextMenuItem&gt;&amp; items)

Can items be a const Vector&amp;?

&gt; WebCore/platform/win/ContextMenuWin.cpp:156
&gt; +    for (unsigned i = 0; i &lt; items.size(); ++i) {

size_t is the type to use to iterate over a Vector.

&gt; WebCore/platform/win/ContextMenuWin.cpp:161
&gt; +            ContextMenuItem* searchSubmenu = itemWithActionInMenu(action, *items[i].platformSubMenu());
&gt; +            if (searchSubmenu)

This is a confusing variable name. And you can put the declaration inside the if itself:

if (ContextMenuItem* foo = itemWithActionInMenu(...))

&gt; WebCore/platform/win/ContextMenuWin.cpp:189
&gt; +    Vector&lt;ContextMenuItem&gt;* items = new Vector&lt;ContextMenuItem&gt;;

Who is responsible for deleting this?

&gt; WebCore/platform/win/ContextMenuWin.cpp:197
&gt; +    Vector&lt;ContextMenuItem&gt;* items = new Vector&lt;ContextMenuItem&gt;;

Who is responsible for deleting this?

Do we really need both platformDescription() and releasePlatformDescription()?

&gt; WebCore/platform/win/ContextMenuWin.cpp:216
&gt; +        WTF::String title = description.title;

No need for the WTF:: here.

&gt; WebCore/platform/win/ContextMenuWin.cpp:217
&gt; +        menuItem.dwTypeData = (LPWSTR) title.charactersWithNullTermination();

Please use C++ casts instead of a C-style cast here.

&gt; WebCore/platform/win/ContextMenuWin.cpp:224
&gt; +Vector&lt;ContextMenuItem&gt; contextMenuItemVector(Vector&lt;ContextMenuItem&gt;* menu)

I don&apos;t understand why this function is needed. But if it is needed, it can just be:

return *menu;

&gt; WebCore/platform/win/ContextMenuWin.cpp:242
&gt; +    PlatformMenuDescription platformMenu = new Vector&lt;ContextMenuItem&gt;;

Who is responsible for destroying this?

&gt; WebCore/platform/win/ContextMenuWin.cpp:243
&gt; +    for (unsigned i = 0; i &lt; menuItemVector.size(); ++i)

You should use size_t.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319545</commentid>
    <comment_count>16</comment_count>
      <attachid>76083</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-09 10:13:00 -0800</bug_when>
    <thetext>Created attachment 76083
[PATCH] WIP Context Menu Cross-Platform Goodness</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319554</commentid>
    <comment_count>17</comment_count>
      <attachid>76083</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-12-09 10:20:43 -0800</bug_when>
    <thetext>Comment on attachment 76083
[PATCH] WIP Context Menu Cross-Platform Goodness

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

Looks like this is on the right track!

&gt; WebCore/platform/ContextMenu.cpp:74
&gt; +void ContextMenu::setPlatformDescription(Vector&lt;ContextMenuItem&gt;* menuItems)
&gt; +{
&gt; +    ASSERT_ARG(menuItems, menuItems);
&gt; +
&gt; +    m_items.clear();
&gt; +    for (size_t i = 0; i &lt; menuItems-&gt;size(); ++i) {
&gt; +        m_items.append(menuItems-&gt;at(i));
&gt; +    }
&gt; +}

This whole function could just be: m_items = *menuItems;

Maybe this should be called setItems?

&gt; WebCore/platform/ContextMenu.cpp:84
&gt; +Vector&lt;ContextMenuItem&gt;* ContextMenu::platformDescription()
&gt; +{
&gt; +    // FIXME: I&apos;m not sure who is supposed to free this Vector, but if I just return &amp;m_items, then I get into a state
&gt; +    // in setPlatformDescription where the menuItems == &amp;m_items, and that isn&apos;t a good state to be in.
&gt; +    Vector&lt;ContextMenuItem&gt;* menuItems = new Vector&lt;ContextMenuItem&gt;;
&gt; +    for (size_t i = 0; i &lt; m_items.size(); ++i)
&gt; +        menuItems-&gt;append(m_items[i]);
&gt; +    return menuItems;
&gt; +}

I think a function like this would be more useful:

const Vector&lt;ContextMenuItem&gt;&amp; items() const { return m_items; }

&gt; WebCore/platform/ContextMenu.cpp:95
&gt; +Vector&lt;ContextMenuItem&gt; contextMenuItemVector(Vector&lt;ContextMenuItem&gt;* menu)
&gt; +{
&gt; +    ASSERT_ARG(menu, menu);
&gt; +    Vector&lt;ContextMenuItem&gt; itemList;
&gt; +
&gt; +    for (size_t i = 0; i &lt; menu-&gt;size(); ++i)
&gt; +        itemList.append(menu-&gt;at(i));
&gt; +
&gt; +    return itemList;
&gt; +}

This whole function could just be: return *menu;

Do we really need this function in the new model? It doesn&apos;t seem helpful.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319619</commentid>
    <comment_count>18</comment_count>
      <attachid>76099</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-09 11:32:57 -0800</bug_when>
    <thetext>Created attachment 76099
[PATCH] More WIP Goodness</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319643</commentid>
    <comment_count>19</comment_count>
      <attachid>76105</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-09 12:13:27 -0800</bug_when>
    <thetext>Created attachment 76105
[PATCH] CROSS_PLATFORM_CONTEXT_MENUS refactoring</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319664</commentid>
    <comment_count>20</comment_count>
      <attachid>76105</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-12-09 12:49:02 -0800</bug_when>
    <thetext>Comment on attachment 76105
[PATCH] CROSS_PLATFORM_CONTEXT_MENUS refactoring

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

&gt; WebCore/platform/ContextMenu.cpp:42
&gt; +void ContextMenu::setItems(Vector&lt;ContextMenuItem&gt; menuItems)

That should be a const Vector&lt;ContextMenuItem&gt;&amp;. I think the implementation of this function could go in the header.

&gt; WebCore/platform/ContextMenu.cpp:47
&gt; +Vector&lt;ContextMenuItem&gt; ContextMenu::items()

That should be a const Vector&lt;ContextMenuItem&gt;&amp;, and this should be a const member function. I think the implementation of this function could go in the header.

&gt; WebCore/platform/ContextMenu.cpp:55
&gt; +ContextMenuItem* ContextMenu::itemAtIndex(unsigned index)
&gt; +{
&gt; +    return &amp;(m_items[index]);
&gt; +}

No need for the parentheses. I think the implementation of this function could go in the header.

&gt; WebCore/platform/ContextMenu.cpp:57
&gt; +static ContextMenuItem* itemWithActionInMenu(unsigned action, Vector&lt;ContextMenuItem&gt;&amp; menu)

That should be a const Vector&lt;ContextMenuItem&gt;&amp;. I&apos;d remove the &quot;InMenu&quot; part of the name and call the parameter &quot;items&quot; instead of &quot;menu&quot;.

&gt; WebCore/platform/ContextMenu.cpp:64
&gt; +        if (menu[i].action() == action)
&gt; +            return &amp;menu[i];
&gt; +        if (menu[i].type() == SubmenuType) {
&gt; +            if (ContextMenuItem* subMenuItem = itemWithActionInMenu(action, menu[i].submenu()))
&gt; +                return subMenuItem;

Maybe it would be better to store menu[i] in a local: const ContextMenuItem&amp; item = menu[i];

Some early-continues could reduce the nesting here.

&gt; WebCore/platform/ContextMenu.h:52
&gt; +        typedef HMENU NativeMenuType;

No need for the &quot;Type&quot; in this name.

&gt; WebCore/platform/ContextMenu.h:56
&gt; +        ContextMenu(const Vector&lt;ContextMenuItem&gt;&amp;);
&gt; +        ContextMenu(NativeMenuType);

You should mark both of these constructors explicit.

&gt; WebCore/platform/ContextMenu.h:58
&gt; +        NativeMenuType nativeMenu();

This can be a const member function.

&gt; WebCore/platform/ContextMenu.h:71
&gt; +    private:
&gt; +        Vector&lt;ContextMenuItem&gt; m_items;
&gt; +#else
&gt;      public:

I know it&apos;s only meant to be temporary, but I think this #if style is a little strange. I think it would be better to just put #if USE(CROSS_PLATFORM_CONTEXT_MENUS) around the declarations that are different between the two implementations, rather than putting them around the whole class declaration.

&gt; WebCore/platform/ContextMenu.h:81
&gt; +
&gt;          ~ContextMenu();
&gt;  
&gt;          void insertItem(unsigned position, ContextMenuItem&amp;);
&gt;          void appendItem(ContextMenuItem&amp;);
&gt;          
&gt;          ContextMenuItem* itemWithAction(unsigned);
&gt; +        ContextMenuItem* itemAtIndex(unsigned);

Why are these changes needed?

&gt; WebCore/platform/ContextMenuItem.h:167
&gt; +

You should undo this change.

&gt; WebCore/platform/ContextMenuItem.h:258
&gt; +        typedef MENUITEMINFO NativeItemType;

No need for the &quot;Type&quot; in this name.

&gt; WebCore/platform/ContextMenuItem.h:263
&gt; +        ContextMenuItem(NativeItemType);

You should mark this constructor explicit.

&gt; WebCore/platform/ContextMenuItem.h:265
&gt; +        NativeItemType nativeMenuItem();

This can be a const member function.

&gt; WebCore/platform/ContextMenuItem.h:280
&gt; +        ContextMenuItemType type() const { return m_type; }
&gt; +        void setType(ContextMenuItemType type) { m_type = type; }
&gt; +
&gt; +        ContextMenuAction action() const { return m_action; }
&gt; +        void setAction(ContextMenuAction action) { m_action = action; }
&gt; +
&gt; +        String title() const { return m_title; }
&gt; +        void setTitle(const String&amp; title) { m_title = title; }
&gt; +
&gt; +        bool checked() const { return m_checked; }
&gt; +        void setChecked(bool checked = true) { m_checked = checked; }
&gt; +
&gt; +        bool enabled() const { return m_enabled; }
&gt; +        void setEnabled(bool enabled = true) { m_enabled = enabled; }

In general we prefer to put setters first.

&gt; WebCore/platform/ContextMenuItem.h:283
&gt; +        void setSubMenu(ContextMenu*);
&gt; +        Vector&lt;ContextMenuItem&gt;&amp; submenu() { return m_subMenuItems; }

&quot;submenu()&quot; doesn&apos;t follow the same capitalization as &quot;setSubMenu&quot; and &quot;m_subMenuItems&quot;.

Maybe submenu() should be renamed to subMenuItems?

submenu() should return a const Vector&lt;ContextMenuItem&gt;&amp; and be a const member function.

&gt; WebCore/platform/ContextMenuItem.h:286
&gt; +        ~ContextMenuItem();
&gt; +    private:

You should add a blank line between these two lines.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:55
&gt; +    m_type = info.fType &amp; MFT_SEPARATOR ? SeparatorType : ActionType;
&gt; +    m_action = static_cast&lt;ContextMenuAction&gt;(info.wID);
&gt; +    m_title = String(info.dwTypeData, wcslen(info.dwTypeData));
&gt; +
&gt; +    if (info.hSubMenu) {

All my comments from comment 15 (about checking info.fMask, etc.) still apply here.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:58
&gt; +        ContextMenu subMenu(info.hSubMenu);
&gt; +        m_subMenuItems = subMenu.items();

No need for the local variable here.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:81
&gt; +    info.cch = m_title.length();
&gt; +    info.dwTypeData = (LPWSTR) m_title.charactersWithNullTermination();

You should be using C++ casts here. You also shouldn&apos;t be setting these members for separator items.

But this seems problematic even for string items. It isn&apos;t clear to the caller that this dwTypeData is only valid while the ContextMenuItem is still around. It also seems strange for the caller to be responsible for cleaning up info.hSubMenu but not info.dwTypeData.

Maybe it would be better to get rid of ContextMenuItem::nativeMenuItem and put the code into a helper function that ContextMenu::nativeMenu calls instead. Then it would be OK for the helper function to do things like what you&apos;ve done here (where dwTypeData relies on the lifetime of the ContextMenuItem from which it came), because the scope of the code would be so constrained.

&gt; WebCore/platform/win/ContextMenuWin.cpp:64
&gt; +        if (info.fType == MFT_SEPARATOR) {
&gt; +            // If we don&apos;t have a string, then we must be in a separator.

I don&apos;t think this comment is needed or helpful. &quot;If we don&apos;t have a string&quot; isn&apos;t what we just found out; we just found out this is a separator item. I&apos;d just ditch the comment entirely.

&gt; WebCore/platform/win/ContextMenuWin.cpp:83
&gt; +    for (int i = 0; i &lt; m_items.size(); ++i) {

As previously mentioned, size_t is the right type for iterating over Vector.

&gt; WebKit2/Shared/WebContextMenuItemData.cpp:73
&gt; +        Vector&lt;WebCore::ContextMenuItem&gt; coreSubmenu = item.submenu();

This should be a const Vector&lt;WebCore::ContextMenuItem&gt;&amp;.

&gt; WebKit2/WebProcess/WebPage/WebContextMenu.cpp:68
&gt; +    Vector&lt;ContextMenuItem&gt; coreItems = menu-&gt;items();

This should be a const Vector&lt;ContextMenuItem&gt;&amp;.

&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.cpp:59
&gt; +PassOwnPtr&lt;ContextMenu&gt; WebContextMenuClient::customizeMenu(PassOwnPtr&lt;ContextMenu&gt; menu)
&gt;  {

I think it would be a little better to start this function like this:

customizeMenu(PassOwnPtr&lt;ContextMenu&gt; popMenu)
{
    OwnPtr&lt;ContextMenu&gt; menu = popMenu;

That way you don&apos;t have to worry about menu getting nulled out if you accidentally assign it into an OwnPtr or PassOwnPtr.

&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.cpp:74
&gt; +    if (FAILED(uiDelegate-&gt;contextMenuItemsForElement(m_webView, propertyBag.get(), (OLE_HANDLE)(ULONG64)nativeMenu, (OLE_HANDLE*)&amp;nativeMenu)))
&gt; +        return menu;
&gt; +    
&gt; +    OwnPtr&lt;ContextMenu&gt; customizedMenu(new ContextMenu(nativeMenu));
&gt; +    return customizedMenu.release();

You&apos;re leaking nativeMenu in both of these cases. You should also use adoptPtr when constructing the new menu.

&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.cpp:91
&gt; +    MENUITEMINFO selectedItem = item-&gt;nativeMenuItem();
&gt; +    uiDelegate-&gt;contextMenuItemSelected(m_webView, &amp;selectedItem, propertyBag.get());

If selectedItem contained an hSubMenu, you&apos;d be leaking it here. But I think it&apos;s guaranteed not to contain one (because you can&apos;t select submenu items), so you should add an assertion with a comment.

&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.h:28
&gt; +#include &lt;WebCore/PlatformMenuDescription.h&gt;

I don&apos;t think this is needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319671</commentid>
    <comment_count>21</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2010-12-09 13:04:08 -0800</bug_when>
    <thetext>Attachment 76105 did not build on win:
Build output: http://queues.webkit.org/results/6913009</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319698</commentid>
    <comment_count>22</comment_count>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-12-09 13:52:18 -0800</bug_when>
    <thetext>Did you actually turn on the new macro anywhere?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319710</commentid>
    <comment_count>23</comment_count>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-09 14:13:27 -0800</bug_when>
    <thetext>(In reply to comment #22)
&gt; Did you actually turn on the new macro anywhere?

I did in my tree, but it didn&apos;t show in the diff, so it borked the EWS bots.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319716</commentid>
    <comment_count>24</comment_count>
      <attachid>76105</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-09 14:22:28 -0800</bug_when>
    <thetext>Comment on attachment 76105
[PATCH] CROSS_PLATFORM_CONTEXT_MENUS refactoring

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

&gt;&gt; WebCore/platform/ContextMenu.cpp:42
&gt;&gt; +void ContextMenu::setItems(Vector&lt;ContextMenuItem&gt; menuItems)
&gt; 
&gt; That should be a const Vector&lt;ContextMenuItem&gt;&amp;. I think the implementation of this function could go in the header.

Fixed.

&gt;&gt; WebCore/platform/ContextMenu.cpp:47
&gt;&gt; +Vector&lt;ContextMenuItem&gt; ContextMenu::items()
&gt; 
&gt; That should be a const Vector&lt;ContextMenuItem&gt;&amp;, and this should be a const member function. I think the implementation of this function could go in the header.

Fixed.

&gt;&gt; WebCore/platform/ContextMenu.cpp:55
&gt;&gt; +}
&gt; 
&gt; No need for the parentheses. I think the implementation of this function could go in the header.

Fixed.

&gt;&gt; WebCore/platform/ContextMenu.cpp:57
&gt;&gt; +static ContextMenuItem* itemWithActionInMenu(unsigned action, Vector&lt;ContextMenuItem&gt;&amp; menu)
&gt; 
&gt; That should be a const Vector&lt;ContextMenuItem&gt;&amp;. I&apos;d remove the &quot;InMenu&quot; part of the name and call the parameter &quot;items&quot; instead of &quot;menu&quot;.

I couldn&apos;t name it just itemWithAction, that was causing compile errors - I named it findItemWithAction, to signify that it is doing work.

&gt;&gt; WebCore/platform/ContextMenu.cpp:64
&gt;&gt; +                return subMenuItem;
&gt; 
&gt; Maybe it would be better to store menu[i] in a local: const ContextMenuItem&amp; item = menu[i];
&gt; 
&gt; Some early-continues could reduce the nesting here.

Fixed, stored it in a non-const (due to the const discussion we had on IRC), and added an early continue.

&gt;&gt; WebCore/platform/ContextMenu.h:52
&gt;&gt; +        typedef HMENU NativeMenuType;
&gt; 
&gt; No need for the &quot;Type&quot; in this name.

Fixed.

&gt;&gt; WebCore/platform/ContextMenu.h:56
&gt;&gt; +        ContextMenu(NativeMenuType);
&gt; 
&gt; You should mark both of these constructors explicit.

Fixed.

&gt;&gt; WebCore/platform/ContextMenu.h:58
&gt;&gt; +        NativeMenuType nativeMenu();
&gt; 
&gt; This can be a const member function.

Fixed.

&gt;&gt; WebCore/platform/ContextMenu.h:71
&gt;&gt;      public:
&gt; 
&gt; I know it&apos;s only meant to be temporary, but I think this #if style is a little strange. I think it would be better to just put #if USE(CROSS_PLATFORM_CONTEXT_MENUS) around the declarations that are different between the two implementations, rather than putting them around the whole class declaration.

I think every function is different. Pretty much all of the functions in CROSS_PLATFORM_CONTEXT_MENUS are implemented in the headers, and the only one that isn&apos;t (itemWithAction) - has a different signature. I don&apos;t know what this would gain us.

&gt;&gt; WebCore/platform/ContextMenu.h:81
&gt;&gt; +        ContextMenuItem* itemAtIndex(unsigned);
&gt; 
&gt; Why are these changes needed?

They&apos;re not - removed.

&gt;&gt; WebCore/platform/ContextMenuItem.h:167
&gt;&gt; +
&gt; 
&gt; You should undo this change.

Done.

&gt;&gt; WebCore/platform/ContextMenuItem.h:258
&gt;&gt; +        typedef MENUITEMINFO NativeItemType;
&gt; 
&gt; No need for the &quot;Type&quot; in this name.

Fixed.

&gt;&gt; WebCore/platform/ContextMenuItem.h:263
&gt;&gt; +        ContextMenuItem(NativeItemType);
&gt; 
&gt; You should mark this constructor explicit.

Fixed.

&gt;&gt; WebCore/platform/ContextMenuItem.h:265
&gt;&gt; +        NativeItemType nativeMenuItem();
&gt; 
&gt; This can be a const member function.

Fixed.

&gt;&gt; WebCore/platform/ContextMenuItem.h:280
&gt;&gt; +        void setEnabled(bool enabled = true) { m_enabled = enabled; }
&gt; 
&gt; In general we prefer to put setters first.

Fixed.

&gt;&gt; WebCore/platform/ContextMenuItem.h:283
&gt;&gt; +        Vector&lt;ContextMenuItem&gt;&amp; submenu() { return m_subMenuItems; }
&gt; 
&gt; &quot;submenu()&quot; doesn&apos;t follow the same capitalization as &quot;setSubMenu&quot; and &quot;m_subMenuItems&quot;.
&gt; 
&gt; Maybe submenu() should be renamed to subMenuItems?
&gt; 
&gt; submenu() should return a const Vector&lt;ContextMenuItem&gt;&amp; and be a const member function.

Renamed to subMenuItems, and returns a const Vector&lt;ContextMenuItem&gt;&amp; and is a const function.

&gt;&gt; WebCore/platform/ContextMenuItem.h:286
&gt;&gt; +    private:
&gt; 
&gt; You should add a blank line between these two lines.

Fixed.

&gt;&gt; WebCore/platform/win/ContextMenuItemWin.cpp:55
&gt;&gt; +    if (info.hSubMenu) {
&gt; 
&gt; All my comments from comment 15 (about checking info.fMask, etc.) still apply here.

Done, checked info.fMask for any accessor before using it (MIIM_STATE for info.fState, MIIM_ID for wID, etc).

&gt;&gt; WebCore/platform/win/ContextMenuItemWin.cpp:58
&gt;&gt; +        m_subMenuItems = subMenu.items();
&gt; 
&gt; No need for the local variable here.

Fixed.

&gt;&gt; WebCore/platform/win/ContextMenuWin.cpp:64
&gt;&gt; +            // If we don&apos;t have a string, then we must be in a separator.
&gt; 
&gt; I don&apos;t think this comment is needed or helpful. &quot;If we don&apos;t have a string&quot; isn&apos;t what we just found out; we just found out this is a separator item. I&apos;d just ditch the comment entirely.

Removed, forgot to get rid of it earlier.

&gt;&gt; WebCore/platform/win/ContextMenuWin.cpp:83
&gt;&gt; +    for (int i = 0; i &lt; m_items.size(); ++i) {
&gt; 
&gt; As previously mentioned, size_t is the right type for iterating over Vector.

D&apos;oh, thought I had fixed all of these. Fixed.

&gt;&gt; WebKit2/Shared/WebContextMenuItemData.cpp:73
&gt;&gt; +        Vector&lt;WebCore::ContextMenuItem&gt; coreSubmenu = item.submenu();
&gt; 
&gt; This should be a const Vector&lt;WebCore::ContextMenuItem&gt;&amp;.

Fixed.

&gt;&gt; WebKit2/WebProcess/WebPage/WebContextMenu.cpp:68
&gt;&gt; +    Vector&lt;ContextMenuItem&gt; coreItems = menu-&gt;items();
&gt; 
&gt; This should be a const Vector&lt;ContextMenuItem&gt;&amp;.

Fixed (pending Mac building).

&gt;&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.cpp:59
&gt;&gt;  {
&gt; 
&gt; I think it would be a little better to start this function like this:
&gt; 
&gt; customizeMenu(PassOwnPtr&lt;ContextMenu&gt; popMenu)
&gt; {
&gt;     OwnPtr&lt;ContextMenu&gt; menu = popMenu;
&gt; 
&gt; That way you don&apos;t have to worry about menu getting nulled out if you accidentally assign it into an OwnPtr or PassOwnPtr.

Fixed.

&gt;&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.cpp:74
&gt;&gt; +    return customizedMenu.release();
&gt; 
&gt; You&apos;re leaking nativeMenu in both of these cases. You should also use adoptPtr when constructing the new menu.

Added the adoptPtr call, and called DestroyMenu on he created nativeMenu.

&gt;&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.cpp:91
&gt;&gt; +    uiDelegate-&gt;contextMenuItemSelected(m_webView, &amp;selectedItem, propertyBag.get());
&gt; 
&gt; If selectedItem contained an hSubMenu, you&apos;d be leaking it here. But I think it&apos;s guaranteed not to contain one (because you can&apos;t select submenu items), so you should add an assertion with a comment.

Added the comment and the assertion.

&gt;&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.h:28
&gt;&gt; +#include &lt;WebCore/PlatformMenuDescription.h&gt;
&gt; 
&gt; I don&apos;t think this is needed.

It&apos;s not - removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319737</commentid>
    <comment_count>25</comment_count>
      <attachid>76105</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-09 15:01:35 -0800</bug_when>
    <thetext>Comment on attachment 76105
[PATCH] CROSS_PLATFORM_CONTEXT_MENUS refactoring

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

&gt;&gt; WebCore/platform/ContextMenu.cpp:42
&gt;&gt; +void ContextMenu::setItems(Vector&lt;ContextMenuItem&gt; menuItems)
&gt; 
&gt; That should be a const Vector&lt;ContextMenuItem&gt;&amp;. I think the implementation of this function could go in the header.

Fixed.

&gt;&gt; WebCore/platform/ContextMenu.cpp:47
&gt;&gt; +Vector&lt;ContextMenuItem&gt; ContextMenu::items()
&gt; 
&gt; That should be a const Vector&lt;ContextMenuItem&gt;&amp;, and this should be a const member function. I think the implementation of this function could go in the header.

Fixed.

&gt;&gt; WebCore/platform/ContextMenu.cpp:55
&gt;&gt; +}
&gt; 
&gt; No need for the parentheses. I think the implementation of this function could go in the header.

Fixed.

&gt;&gt; WebCore/platform/ContextMenu.cpp:57
&gt;&gt; +static ContextMenuItem* itemWithActionInMenu(unsigned action, Vector&lt;ContextMenuItem&gt;&amp; menu)
&gt; 
&gt; That should be a const Vector&lt;ContextMenuItem&gt;&amp;. I&apos;d remove the &quot;InMenu&quot; part of the name and call the parameter &quot;items&quot; instead of &quot;menu&quot;.

I couldn&apos;t name it just itemWithAction, that was causing compile errors - I named it findItemWithAction, to signify that it is doing work.

&gt;&gt; WebCore/platform/ContextMenu.cpp:64
&gt;&gt; +                return subMenuItem;
&gt; 
&gt; Maybe it would be better to store menu[i] in a local: const ContextMenuItem&amp; item = menu[i];
&gt; 
&gt; Some early-continues could reduce the nesting here.

Fixed, stored it in a non-const (due to the const discussion we had on IRC), and added an early continue.

&gt;&gt; WebCore/platform/ContextMenu.h:52
&gt;&gt; +        typedef HMENU NativeMenuType;
&gt; 
&gt; No need for the &quot;Type&quot; in this name.

Fixed.

&gt;&gt; WebCore/platform/ContextMenu.h:56
&gt;&gt; +        ContextMenu(NativeMenuType);
&gt; 
&gt; You should mark both of these constructors explicit.

Fixed.

&gt;&gt; WebCore/platform/ContextMenu.h:58
&gt;&gt; +        NativeMenuType nativeMenu();
&gt; 
&gt; This can be a const member function.

Fixed.

&gt;&gt; WebCore/platform/ContextMenu.h:71
&gt;&gt;      public:
&gt; 
&gt; I know it&apos;s only meant to be temporary, but I think this #if style is a little strange. I think it would be better to just put #if USE(CROSS_PLATFORM_CONTEXT_MENUS) around the declarations that are different between the two implementations, rather than putting them around the whole class declaration.

I think every function is different. Pretty much all of the functions in CROSS_PLATFORM_CONTEXT_MENUS are implemented in the headers, and the only one that isn&apos;t (itemWithAction) - has a different signature. I don&apos;t know what this would gain us.

&gt;&gt; WebCore/platform/ContextMenu.h:81
&gt;&gt; +        ContextMenuItem* itemAtIndex(unsigned);
&gt; 
&gt; Why are these changes needed?

They&apos;re not - removed.

&gt;&gt; WebCore/platform/ContextMenuItem.h:167
&gt;&gt; +
&gt; 
&gt; You should undo this change.

Done.

&gt;&gt; WebCore/platform/ContextMenuItem.h:258
&gt;&gt; +        typedef MENUITEMINFO NativeItemType;
&gt; 
&gt; No need for the &quot;Type&quot; in this name.

Fixed.

&gt;&gt; WebCore/platform/ContextMenuItem.h:263
&gt;&gt; +        ContextMenuItem(NativeItemType);
&gt; 
&gt; You should mark this constructor explicit.

Fixed.

&gt;&gt; WebCore/platform/ContextMenuItem.h:265
&gt;&gt; +        NativeItemType nativeMenuItem();
&gt; 
&gt; This can be a const member function.

Fixed.

&gt;&gt; WebCore/platform/ContextMenuItem.h:280
&gt;&gt; +        void setEnabled(bool enabled = true) { m_enabled = enabled; }
&gt; 
&gt; In general we prefer to put setters first.

Fixed.

&gt;&gt; WebCore/platform/ContextMenuItem.h:283
&gt;&gt; +        Vector&lt;ContextMenuItem&gt;&amp; submenu() { return m_subMenuItems; }
&gt; 
&gt; &quot;submenu()&quot; doesn&apos;t follow the same capitalization as &quot;setSubMenu&quot; and &quot;m_subMenuItems&quot;.
&gt; 
&gt; Maybe submenu() should be renamed to subMenuItems?
&gt; 
&gt; submenu() should return a const Vector&lt;ContextMenuItem&gt;&amp; and be a const member function.

Renamed to subMenuItems, and returns a const Vector&lt;ContextMenuItem&gt;&amp; and is a const function.

&gt;&gt; WebCore/platform/ContextMenuItem.h:286
&gt;&gt; +    private:
&gt; 
&gt; You should add a blank line between these two lines.

Fixed.

&gt;&gt; WebCore/platform/win/ContextMenuItemWin.cpp:55
&gt;&gt; +    if (info.hSubMenu) {
&gt; 
&gt; All my comments from comment 15 (about checking info.fMask, etc.) still apply here.

Done, checked info.fMask for any accessor before using it (MIIM_STATE for info.fState, MIIM_ID for wID, etc).

&gt;&gt; WebCore/platform/win/ContextMenuItemWin.cpp:58
&gt;&gt; +        m_subMenuItems = subMenu.items();
&gt; 
&gt; No need for the local variable here.

Fixed.

&gt;&gt; WebCore/platform/win/ContextMenuWin.cpp:64
&gt;&gt; +            // If we don&apos;t have a string, then we must be in a separator.
&gt; 
&gt; I don&apos;t think this comment is needed or helpful. &quot;If we don&apos;t have a string&quot; isn&apos;t what we just found out; we just found out this is a separator item. I&apos;d just ditch the comment entirely.

Removed, forgot to get rid of it earlier.

&gt;&gt; WebCore/platform/win/ContextMenuWin.cpp:83
&gt;&gt; +    for (int i = 0; i &lt; m_items.size(); ++i) {
&gt; 
&gt; As previously mentioned, size_t is the right type for iterating over Vector.

D&apos;oh, thought I had fixed all of these. Fixed.

&gt;&gt; WebKit2/Shared/WebContextMenuItemData.cpp:73
&gt;&gt; +        Vector&lt;WebCore::ContextMenuItem&gt; coreSubmenu = item.submenu();
&gt; 
&gt; This should be a const Vector&lt;WebCore::ContextMenuItem&gt;&amp;.

Fixed.

&gt;&gt; WebKit2/WebProcess/WebPage/WebContextMenu.cpp:68
&gt;&gt; +    Vector&lt;ContextMenuItem&gt; coreItems = menu-&gt;items();
&gt; 
&gt; This should be a const Vector&lt;ContextMenuItem&gt;&amp;.

Fixed (pending Mac building).

&gt;&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.cpp:59
&gt;&gt;  {
&gt; 
&gt; I think it would be a little better to start this function like this:
&gt; 
&gt; customizeMenu(PassOwnPtr&lt;ContextMenu&gt; popMenu)
&gt; {
&gt;     OwnPtr&lt;ContextMenu&gt; menu = popMenu;
&gt; 
&gt; That way you don&apos;t have to worry about menu getting nulled out if you accidentally assign it into an OwnPtr or PassOwnPtr.

Fixed.

&gt;&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.cpp:74
&gt;&gt; +    return customizedMenu.release();
&gt; 
&gt; You&apos;re leaking nativeMenu in both of these cases. You should also use adoptPtr when constructing the new menu.

Added the adoptPtr call, and called DestroyMenu on he created nativeMenu.

&gt;&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.cpp:91
&gt;&gt; +    uiDelegate-&gt;contextMenuItemSelected(m_webView, &amp;selectedItem, propertyBag.get());
&gt; 
&gt; If selectedItem contained an hSubMenu, you&apos;d be leaking it here. But I think it&apos;s guaranteed not to contain one (because you can&apos;t select submenu items), so you should add an assertion with a comment.

Added the comment and the assertion.

&gt;&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.h:28
&gt;&gt; +#include &lt;WebCore/PlatformMenuDescription.h&gt;
&gt; 
&gt; I don&apos;t think this is needed.

It&apos;s not - removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319824</commentid>
    <comment_count>26</comment_count>
      <attachid>76105</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-09 17:39:10 -0800</bug_when>
    <thetext>Comment on attachment 76105
[PATCH] CROSS_PLATFORM_CONTEXT_MENUS refactoring

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

&gt;&gt; WebCore/platform/win/ContextMenuItemWin.cpp:81
&gt;&gt; +    info.dwTypeData = (LPWSTR) m_title.charactersWithNullTermination();
&gt; 
&gt; You should be using C++ casts here. You also shouldn&apos;t be setting these members for separator items.
&gt; 
&gt; But this seems problematic even for string items. It isn&apos;t clear to the caller that this dwTypeData is only valid while the ContextMenuItem is still around. It also seems strange for the caller to be responsible for cleaning up info.hSubMenu but not info.dwTypeData.
&gt; 
&gt; Maybe it would be better to get rid of ContextMenuItem::nativeMenuItem and put the code into a helper function that ContextMenu::nativeMenu calls instead. Then it would be OK for the helper function to do things like what you&apos;ve done here (where dwTypeData relies on the lifetime of the ContextMenuItem from which it came), because the scope of the code would be so constrained.

Fixed the separator issues.

I re-factored this code to not have dwTypeData set inside of nativeMenuItem. Only one caller needs that information (ContextMenu::nativeMenu), and so that caller will handle setting up that information. It makes the lifetime handling much more straightforward.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319828</commentid>
    <comment_count>27</comment_count>
      <attachid>76145</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-09 17:41:31 -0800</bug_when>
    <thetext>Created attachment 76145
[PATChH] CROSS_PLATFORM_CONTEXT_MENUS + Adam&apos;s feedback</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>319886</commentid>
    <comment_count>28</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2010-12-09 19:58:25 -0800</bug_when>
    <thetext>Attachment 76145 did not build on win:
Build output: http://queues.webkit.org/results/6958017</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320233</commentid>
    <comment_count>29</comment_count>
      <attachid>76145</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-12-10 10:35:52 -0800</bug_when>
    <thetext>Comment on attachment 76145
[PATChH] CROSS_PLATFORM_CONTEXT_MENUS + Adam&apos;s feedback

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

I still don&apos;t see a place that turns on CROSS_PLATFORM_CONTEXT_MENUS.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:49
&gt; +ContextMenuItem::ContextMenuItem(MENUITEMINFO info)

It looks like this constructor is now leaving member variables uninitialized when info.fMask doesn&apos;t contain the appropriate bits. You should initialize them!

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:52
&gt; +        m_type = info.fType &amp; MFT_SEPARATOR ? SeparatorType : ActionType;

That should be ==, not &amp;.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:53
&gt; +        m_title = String(info.dwTypeData, wcslen(info.dwTypeData));

You should only look at this if info.fType is MFT_STRING and info.fMask has MIIM_STRING set.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:61
&gt; +        m_subMenuItems = ContextMenu(info.hSubMenu).items();

It&apos;s unfortunate that this line of code will create and throwaway an extra copy of the items Vector. If you were to add a function like this:

void getContextMenuItems(NativeMenu, Vector&lt;ContextMenuItem&gt;&amp;);

Then you could use it here.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:73
&gt; +// ContextMenuItem::nativeMenuItem doesn&apos;t set the info.dwTypeData. This is
&gt; +// done to make the lifetime handling of the returned MENUITEMINFO easier on
&gt; +// callers. The only caller that uses the title is ContextMenu::nativeMenu,
&gt; +// so we just set the title there.

I&apos;d replace the last sentence here with something more generic, like &quot;Callers can set dwTypeData themselves (and make their own decisions about its lifetime) if they need it.&quot;

I think the way you chose to handle this issue. Maybe this comment should go in the header file? You&apos;d obviously have to prefix it with &quot;On Windows,&quot;.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:91
&gt; +    if (m_type == SubmenuType)
&gt; +        info.hSubMenu = ContextMenu(m_subMenuItems).nativeMenu();

Maybe you should only include MIIM_SUBMENU in info.fMask in this case?

It&apos;s unfortunate that this line of code will copy m_subMenuItems just to create an HMENU. You could add a function that goes directly from a Vector&lt;ContextMenuItem&gt; to an HMENU. (Then maybe you wouldn&apos;t even need the ContextMenu(const Vector&lt;ContextMenuItem&gt;&amp;) constructor? Or maybe you&apos;d still need that for WebKit2?)

&gt; WebCore/platform/win/ContextMenuWin.cpp:57
&gt; +        UINT infoMask = MIIM_FTYPE | MIIM_ID | MIIM_STRING | MIIM_STATE | MIIM_SUBMENU; 
&gt; +        MENUITEMINFO info = {0};
&gt; +        info.cbSize = sizeof(MENUITEMINFO);
&gt; +        info.fMask = infoMask;

I don&apos;t think the infoMask variable is helpful here.

&gt; WebCore/platform/win/ContextMenuWin.cpp:89
&gt; +        // lifetime handling easier for callers. This is the only caller that needs to set the title,
&gt; +        // so set it here.

I don&apos;t think the &quot;This is the only caller&quot; information is important, and it&apos;s likely to become out of date.

&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.cpp:73
&gt; +    if (FAILED(uiDelegate-&gt;contextMenuItemsForElement(m_webView, propertyBag.get(), (OLE_HANDLE)(ULONG64)nativeMenu, (OLE_HANDLE*)&amp;nativeMenu)))
&gt; +        return menu.release();

You&apos;re leaking nativeMenu here.

&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.cpp:96
&gt; +    ASSERT(item-&gt;type() != SubmenuType &amp;&amp; item-&gt;type() != SeparatorType);

You should split this up into two separate assertions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320238</commentid>
    <comment_count>30</comment_count>
      <attachid>76145</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-12-10 10:42:12 -0800</bug_when>
    <thetext>Comment on attachment 76145
[PATChH] CROSS_PLATFORM_CONTEXT_MENUS + Adam&apos;s feedback

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

&gt; WebCore/platform/ContextMenuItem.h:261
&gt; +        ContextMenuItem(ContextMenuAction, const String&amp;, bool enabled, bool checked, Vector&lt;ContextMenuItem&gt; subMenuItems);

subMenuItems should be a const Vector&lt;ContextMenuItem&gt;&amp;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320263</commentid>
    <comment_count>31</comment_count>
      <attachid>76145</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-10 11:29:46 -0800</bug_when>
    <thetext>Comment on attachment 76145
[PATChH] CROSS_PLATFORM_CONTEXT_MENUS + Adam&apos;s feedback

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

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:30
&gt; +#include &quot;HitTestResult.h&quot;

This was removed, sorry it was in here so long.

&gt;&gt; WebCore/platform/win/ContextMenuItemWin.cpp:49
&gt;&gt; +ContextMenuItem::ContextMenuItem(MENUITEMINFO info)
&gt; 
&gt; It looks like this constructor is now leaving member variables uninitialized when info.fMask doesn&apos;t contain the appropriate bits. You should initialize them!

Fixed - wasn&apos;t sure what to initialize the string to - I left it null, but initialized the rest.

&gt;&gt; WebCore/platform/win/ContextMenuItemWin.cpp:52
&gt;&gt; +        m_type = info.fType &amp; MFT_SEPARATOR ? SeparatorType : ActionType;
&gt; 
&gt; That should be ==, not &amp;.

Fixed.

&gt;&gt; WebCore/platform/win/ContextMenuItemWin.cpp:53
&gt;&gt; +        m_title = String(info.dwTypeData, wcslen(info.dwTypeData));
&gt; 
&gt; You should only look at this if info.fType is MFT_STRING and info.fMask has MIIM_STRING set.

Fixed, but not sure what to initialize it to if these aren&apos;t set.

&gt;&gt; WebCore/platform/win/ContextMenuItemWin.cpp:61
&gt;&gt; +        m_subMenuItems = ContextMenu(info.hSubMenu).items();
&gt; 
&gt; It&apos;s unfortunate that this line of code will create and throwaway an extra copy of the items Vector. If you were to add a function like this:
&gt; 
&gt; void getContextMenuItems(NativeMenu, Vector&lt;ContextMenuItem&gt;&amp;);
&gt; 
&gt; Then you could use it here.

Added a static void getContextMenuItems(HMENU, Vector&lt;ContextMenuItem&gt;&amp;) that is called by this and the ContextMenu(HMENU) constructor.

&gt;&gt; WebCore/platform/win/ContextMenuItemWin.cpp:73
&gt;&gt; +// so we just set the title there.
&gt; 
&gt; I&apos;d replace the last sentence here with something more generic, like &quot;Callers can set dwTypeData themselves (and make their own decisions about its lifetime) if they need it.&quot;
&gt; 
&gt; I think the way you chose to handle this issue. Maybe this comment should go in the header file? You&apos;d obviously have to prefix it with &quot;On Windows,&quot;.

Kept the comment in the implementation, and added a comment to the header to this effect.

&gt;&gt; WebCore/platform/win/ContextMenuItemWin.cpp:91
&gt;&gt; +        info.hSubMenu = ContextMenu(m_subMenuItems).nativeMenu();
&gt; 
&gt; Maybe you should only include MIIM_SUBMENU in info.fMask in this case?
&gt; 
&gt; It&apos;s unfortunate that this line of code will copy m_subMenuItems just to create an HMENU. You could add a function that goes directly from a Vector&lt;ContextMenuItem&gt; to an HMENU. (Then maybe you wouldn&apos;t even need the ContextMenu(const Vector&lt;ContextMenuItem&gt;&amp;) constructor? Or maybe you&apos;d still need that for WebKit2?)

Added a static function: static HMENU createMenuFromItems(const Vector&lt;ContextMenuItem&gt;&amp;) - and call that from both ContextMenu::nativeMenu() and here. I was able to get rid of the constructor.

&gt;&gt; WebCore/platform/win/ContextMenuWin.cpp:57
&gt;&gt; +        info.fMask = infoMask;
&gt; 
&gt; I don&apos;t think the infoMask variable is helpful here.

Removed.

&gt;&gt; WebCore/platform/win/ContextMenuWin.cpp:89
&gt;&gt; +        // so set it here.
&gt; 
&gt; I don&apos;t think the &quot;This is the only caller&quot; information is important, and it&apos;s likely to become out of date.

Removed.

&gt;&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.cpp:73
&gt;&gt; +        return menu.release();
&gt; 
&gt; You&apos;re leaking nativeMenu here.

Fixed.

&gt;&gt; WebKit/win/WebCoreSupport/WebContextMenuClient.cpp:96
&gt;&gt; +    ASSERT(item-&gt;type() != SubmenuType &amp;&amp; item-&gt;type() != SeparatorType);
&gt; 
&gt; You should split this up into two separate assertions.

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320265</commentid>
    <comment_count>32</comment_count>
      <attachid>76224</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-10 11:31:08 -0800</bug_when>
    <thetext>Created attachment 76224
[PATCH] Adam&apos;s Comments + Platform.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320270</commentid>
    <comment_count>33</comment_count>
      <attachid>76145</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-10 11:35:49 -0800</bug_when>
    <thetext>Comment on attachment 76145
[PATChH] CROSS_PLATFORM_CONTEXT_MENUS + Adam&apos;s feedback

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

&gt;&gt; WebCore/platform/ContextMenuItem.h:261
&gt;&gt; +        ContextMenuItem(ContextMenuAction, const String&amp;, bool enabled, bool checked, Vector&lt;ContextMenuItem&gt; subMenuItems);
&gt; 
&gt; subMenuItems should be a const Vector&lt;ContextMenuItem&gt;&amp;.

This is fixed, but didn&apos;t make it in the verison of the patch that was just uploaded, I didn&apos;t see the comment until after I uploaded.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320291</commentid>
    <comment_count>34</comment_count>
      <attachid>76224</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-12-10 11:51:48 -0800</bug_when>
    <thetext>Comment on attachment 76224
[PATCH] Adam&apos;s Comments + Platform.h

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

&gt; WebCore/platform/ContextMenu.cpp:39
&gt; +// FIXME: When more callers adopt CROSS_PLATFORM_CONTEXT_MENUS, this function should take a const Vector&lt;ContextMenuItem&gt;&amp; - and should
&gt; +// return a const ContextMenuItem*.
&gt; +static ContextMenuItem* findItemWithAction(unsigned action, Vector&lt;ContextMenuItem&gt;&amp; items)

Maybe it would be better to make this function take a const Vector and return a const ContextMenuItem* and to put a const_cast and this comment in ContextMenu::itemWithAction. Then all that has to change in the future is the removal of the const_cast.

&gt; WebCore/platform/ContextMenu.h:60
&gt; +        static NativeMenu createNativeMenuFromItems(const Vector&lt;ContextMenuItem&gt;&amp;);
&gt; +        static void getContextMenuItems(NativeMenu, Vector&lt;ContextMenuItem&gt;&amp;);

I don&apos;t think these have to be member functions, but it seems OK for them to be.

&gt; WebCore/platform/ContextMenuItem.h:282
&gt; +        ContextMenuItem(ContextMenuItemType, ContextMenuAction, const String&amp;, ContextMenu* subMenu = 0);
&gt; +        ContextMenuItem(ContextMenuItemType, ContextMenuAction, const String&amp;, bool enabled, bool checked);
&gt; +        ContextMenuItem(ContextMenuAction, const String&amp;, bool enabled, bool checked, Vector&lt;ContextMenuItem&gt; subMenuItems);
&gt; +        explicit ContextMenuItem(NativeItem);
&gt; +
&gt; +        // On Windows, the title (dwTypeData of the MENUITEMINFO) is not set in this function. Callers can set the title themselves,
&gt; +        // and handle the lifetime of the title, if they need it.
&gt; +        NativeItem nativeMenuItem() const;
&gt; +
&gt; +        void setType(ContextMenuItemType type) { m_type = type; }
&gt; +        ContextMenuItemType type() const { return m_type; }
&gt; +
&gt; +        void setAction(ContextMenuAction action) { m_action = action; }
&gt; +        ContextMenuAction action() const { return m_action; }
&gt; +
&gt; +        void setTitle(const String&amp; title) { m_title = title; }
&gt; +        const String&amp; title() const { return m_title; }
&gt; +
&gt; +        void setChecked(bool checked = true) { m_checked = checked; }
&gt; +        bool checked() const { return m_checked; }
&gt; +
&gt; +        void setEnabled(bool enabled = true) { m_enabled = enabled; }
&gt; +        bool enabled() const { return m_enabled; }
&gt; +

So many of these functions have the same declaration as in the !USE(CROSS_PLATFORM_CONTEXT_MENUS) case. I think it would be better to share those declarations and only #ifdef the ones that are different. That will also make it more clear which functions are used in both models and which ones are model-specific. (The same comment applies to ContextMenu.h, though there are fewer shared declarations there.) I&apos;d suggest doing it like this:

ContextMenuItem {
public:
    shared declarations
#if USE(CROSS_PLATFORM_CONTEXT_MENUS)
    more declarations
#else
    more declarations
#endif

private
#if USE(CROSS_PLATFORM_CONTEXT_MENUS)
    more declarations
#else
    more declarations
#endif
};

You&apos;ll have to move your setters/getters to ContextMenuItem.cpp, but that seems fine to me. Being able to share the declarations is worth it.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:48
&gt; +ContextMenuItem::ContextMenuItem(MENUITEMINFO info)

This should be a const MENUITEMINFO&amp;.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:51
&gt; +    if (info.fMask &amp; MIIM_FTYPE)
&gt; +        m_type = info.fType == MFT_SEPARATOR ? SeparatorType : ActionType;

It looks like m_type doesn&apos;t get set if MIIM_FTYPE and MIIM_SUBMENU aren&apos;t set.

&gt; WebCore/platform/win/ContextMenuItemWin.cpp:54
&gt; +        m_title = String(info.dwTypeData, wcslen(info.dwTypeData));

In theory you could use info.cch instead of wcslen(info.dwTypeData).

&gt; WebCore/platform/win/ContextMenuWin.cpp:58
&gt; +    for (unsigned i = 0; i &lt; count; ++i) {

You should probably use int for i, since count is an int.

&gt; WebCore/platform/win/ContextMenuWin.cpp:62
&gt; +        info.dwTypeData = 0;

This isn&apos;t needed. You already initialized it to 0 a few lines earlier.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320313</commentid>
    <comment_count>35</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2010-12-10 12:13:43 -0800</bug_when>
    <thetext>Attachment 76224 did not build on win:
Build output: http://queues.webkit.org/results/6914041</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320327</commentid>
    <comment_count>36</comment_count>
      <attachid>76224</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-10 12:28:22 -0800</bug_when>
    <thetext>Comment on attachment 76224
[PATCH] Adam&apos;s Comments + Platform.h

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

&gt;&gt; WebCore/platform/ContextMenu.cpp:39
&gt;&gt; +static ContextMenuItem* findItemWithAction(unsigned action, Vector&lt;ContextMenuItem&gt;&amp; items)
&gt; 
&gt; Maybe it would be better to make this function take a const Vector and return a const ContextMenuItem* and to put a const_cast and this comment in ContextMenu::itemWithAction. Then all that has to change in the future is the removal of the const_cast.

Fixed.

&gt;&gt; WebCore/platform/ContextMenuItem.h:282
&gt;&gt; +
&gt; 
&gt; So many of these functions have the same declaration as in the !USE(CROSS_PLATFORM_CONTEXT_MENUS) case. I think it would be better to share those declarations and only #ifdef the ones that are different. That will also make it more clear which functions are used in both models and which ones are model-specific. (The same comment applies to ContextMenu.h, though there are fewer shared declarations there.) I&apos;d suggest doing it like this:
&gt; 
&gt; ContextMenuItem {
&gt; public:
&gt;     shared declarations
&gt; #if USE(CROSS_PLATFORM_CONTEXT_MENUS)
&gt;     more declarations
&gt; #else
&gt;     more declarations
&gt; #endif
&gt; 
&gt; private
&gt; #if USE(CROSS_PLATFORM_CONTEXT_MENUS)
&gt;     more declarations
&gt; #else
&gt;     more declarations
&gt; #endif
&gt; };
&gt; 
&gt; You&apos;ll have to move your setters/getters to ContextMenuItem.cpp, but that seems fine to me. Being able to share the declarations is worth it.

I wasn&apos;t wild about moving the implementation to the cpp file, but it&apos;s not particularly hot code, and it should clean up the header.

&gt;&gt; WebCore/platform/win/ContextMenuItemWin.cpp:48
&gt;&gt; +ContextMenuItem::ContextMenuItem(MENUITEMINFO info)
&gt; 
&gt; This should be a const MENUITEMINFO&amp;.

Fixed.

&gt;&gt; WebCore/platform/win/ContextMenuItemWin.cpp:51
&gt;&gt; +        m_type = info.fType == MFT_SEPARATOR ? SeparatorType : ActionType;
&gt; 
&gt; It looks like m_type doesn&apos;t get set if MIIM_FTYPE and MIIM_SUBMENU aren&apos;t set.

Added an else and set it to SeparatorType.

&gt;&gt; WebCore/platform/win/ContextMenuItemWin.cpp:54
&gt;&gt; +        m_title = String(info.dwTypeData, wcslen(info.dwTypeData));
&gt; 
&gt; In theory you could use info.cch instead of wcslen(info.dwTypeData).

That seems cleaner. Fixed.

&gt;&gt; WebCore/platform/win/ContextMenuWin.cpp:58
&gt;&gt; +    for (unsigned i = 0; i &lt; count; ++i) {
&gt; 
&gt; You should probably use int for i, since count is an int.

Fixed.

&gt;&gt; WebCore/platform/win/ContextMenuWin.cpp:62
&gt;&gt; +        info.dwTypeData = 0;
&gt; 
&gt; This isn&apos;t needed. You already initialized it to 0 a few lines earlier.

Removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320331</commentid>
    <comment_count>37</comment_count>
      <attachid>76237</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-10 12:30:57 -0800</bug_when>
    <thetext>Created attachment 76237
[PATCH] Reordering ContextMenu{Item}.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320335</commentid>
    <comment_count>38</comment_count>
      <attachid>76237</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2010-12-10 12:37:22 -0800</bug_when>
    <thetext>Comment on attachment 76237
[PATCH] Reordering ContextMenu{Item}.h

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

&gt; WebCore/platform/ContextMenu.cpp:45
&gt; +        if (const ContextMenuItem* subMenuItem = findItemWithAction(action, const_cast&lt;Vector&lt;ContextMenuItem&gt;&amp;&gt;(item.subMenuItems())))

No need for the const_cast here anymore.

&gt; WebCore/platform/ContextMenu.h:52
&gt; +        ContextMenuItem* itemWithAction(unsigned);

Looks like you forgot to remove this from the #else case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320340</commentid>
    <comment_count>39</comment_count>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-10 12:46:46 -0800</bug_when>
    <thetext>(In reply to comment #38)
&gt; (From update of attachment 76237 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=76237&amp;action=review
&gt; 
&gt; &gt; WebCore/platform/ContextMenu.cpp:45
&gt; &gt; +        if (const ContextMenuItem* subMenuItem = findItemWithAction(action, const_cast&lt;Vector&lt;ContextMenuItem&gt;&amp;&gt;(item.subMenuItems())))
&gt; 
&gt; No need for the const_cast here anymore.

Removed.

&gt; 
&gt; &gt; WebCore/platform/ContextMenu.h:52
&gt; &gt; +        ContextMenuItem* itemWithAction(unsigned);
&gt; 
&gt; Looks like you forgot to remove this from the #else case.

That explains the strange build failure I saw on Mac. Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320341</commentid>
    <comment_count>40</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-12-10 12:48:50 -0800</bug_when>
    <thetext>Attachment 76237 did not build on chromium:
Build output: http://queues.webkit.org/results/6975028</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320342</commentid>
    <comment_count>41</comment_count>
      <attachid>76242</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-10 12:51:01 -0800</bug_when>
    <thetext>Created attachment 76242
[PATCH] For EWS bots + Adam&apos;s last comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320414</commentid>
    <comment_count>42</comment_count>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-10 14:25:07 -0800</bug_when>
    <thetext>Landed refactoring in r73802.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320457</commentid>
    <comment_count>43</comment_count>
      <attachid>76271</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2010-12-10 15:38:31 -0800</bug_when>
    <thetext>Created attachment 76271
[PATCH] Fix Silly Mistake</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320459</commentid>
    <comment_count>44</comment_count>
      <attachid>76271</attachid>
    <who name="Ada Chan">adachan</who>
    <bug_when>2010-12-10 15:40:09 -0800</bug_when>
    <thetext>Comment on attachment 76271
[PATCH] Fix Silly Mistake

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>321755</commentid>
    <comment_count>45</comment_count>
      <attachid>76224</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-12-14 01:25:22 -0800</bug_when>
    <thetext>Comment on attachment 76224
[PATCH] Adam&apos;s Comments + Platform.h

Cleared Adam Roben&apos;s review+ from obsolete attachment 76224 so that this bug does not appear in http://webkit.org/pending-commit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>321756</commentid>
    <comment_count>46</comment_count>
      <attachid>76237</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-12-14 01:25:27 -0800</bug_when>
    <thetext>Comment on attachment 76237
[PATCH] Reordering ContextMenu{Item}.h

Cleared Adam Roben&apos;s review+ from obsolete attachment 76237 so that this bug does not appear in http://webkit.org/pending-commit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>324825</commentid>
    <comment_count>47</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-12-20 22:48:16 -0800</bug_when>
    <thetext>Looks like this was landed?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>381505</commentid>
    <comment_count>48</comment_count>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2011-04-07 11:13:59 -0700</bug_when>
    <thetext>Landed in r73815.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>75602</attachid>
            <date>2010-12-03 23:29:36 -0800</date>
            <delta_ts>2010-12-04 19:12:42 -0800</delta_ts>
            <desc>[PATCH] Context Menu Refactoring</desc>
            <filename>context_menu_refactoring.patch</filename>
            <type>text/plain</type>
            <size>33329</size>
            <attacher name="Brian Weinstein">bweinstein</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MzMyNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjggQEAKKzIwMTAtMTItMDMgIEJyaWFuIFdlaW5zdGVpbiAgPGJ3ZWluc3RlaW5A
YXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFByZXAgd29yayBmb3IgV2ViS2l0MjogQ29udGV4dCBtZW51IHN1cHBvcnQgb24gV2luZG93
cworICAgICAgICA8aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUwNTE0
PgorICAgICAgICAKKyAgICAgICAgUmVmYWN0b3IgQ29udGV4dE1lbnUgdG8gYmUgYmFja2VkIGJ5
IGEgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gaW5zdGVhZCBvZiBhbiBITUVOVSwgCisgICAgICAg
IGFuZCByZWZhY3RvciBDb250ZXh0TWVudUl0ZW0gdG8gYmUgYmFja2VkIGJ5IGEgc3RydWN0IGNv
bnRhaW5pbmcgdGhlIGluZm9ybWF0aW9uIHRoYXQKKyAgICAgICAgaXMgbmVlZGVkIGluIGEgQ29u
dGV4dE1lbnVJdGVtIChhY3Rpb24sIHR5cGUsIHRpdGxlLCBzdWJtZW51IGl0ZW1zIChpbiBhIFZl
Y3RvcjxDb250ZXh0TWVudUl0ZW0+KSwKKyAgICAgICAgYW5kIHdoZXRoZXIgb3Igbm90IGl0IGlz
IGVuYWJsZWQgb3IgY2hlY2tlZC4KKyAgICAgICAgCisgICAgICAgIFRoaXMgaXMgbmVjZXNzYXJ5
IHNvIENvbnRleHRNZW51cyBhbmQgQ29udGV4dE1lbnVJdGVtcyBjYW4gYmUgY29waWVkLCB3aGlj
aCBITUVOVXMgYW5kIE1FTlVJVEVNSU5GT3MKKyAgICAgICAgY291bGRuJ3QgYmUuCisKKyAgICAg
ICAgUmVmYWN0b3JpbmcsIG5vIG5ldyB0ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL0NvbnRl
eHRNZW51Lmg6IEFkZCBzb21lIFdpbmRvd3Mtc3BlY2lmaWMgZnVuY3Rpb25zOiBBIENvbnRleHRN
ZW51IGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYW4gSE1FTlUsCisgICAgICAgICAgICBhIHN0YXRp
YyBmdW5jdGlvbiB0aGF0IHBvcHVsYXRlcyBhbiBITUVOVSBmcm9tIGEgVmVjdG9yIG9mIENvbnRl
eHRNZW51SXRlbXMsIGFuZCBhZGQgYSBuZXcgaW5zdGFuY2UgdmFyaWFibGUKKyAgICAgICAgICAg
IHRoYXQgaXMgYSBsaXN0IG9mIENvbnRleHRNZW51SXRlbXMuCisgICAgICAgICogcGxhdGZvcm0v
Q29udGV4dE1lbnVJdGVtLmg6IEFkZCBzb21lIFdpbmRvd3Mtc3BlY2lmaWMgZnVuY3Rpb25zOiBB
IENvbnRleHRNZW51SXRlbSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgTUVOVUlURU1JTkZPLAor
ICAgICAgICAgICAgYSBzdGF0aWMgZnVuY3Rpb24gdGhhdCBwb3B1bGF0ZXMgYSBNRU5VSVRFTUlO
Rk8gZnJvbSBhIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uLCBhbmQgY2hhbmdlIHRoZSBQbGF0Zm9y
bU1lbnVJdGVtRGVzY3JpcHRpb24KKyAgICAgICAgICAgIHRvIGJlIGEgc3RydWN0IGluc3RlYWQg
b2YgYW4gTFBNRU5VSVRFTUlORk8uCisgICAgICAgIChXZWJDb3JlOjpQbGF0Zm9ybU1lbnVJdGVt
RGVzY3JpcHRpb246OlBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbik6IFVwZGF0ZSB0aGUgdHlw
ZSBmb3IgV2luZG93cy4KKyAgICAgICAgKiBwbGF0Zm9ybS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlv
bi5oOgorCisgICAgICAgICogcGxhdGZvcm0vd2luL0NvbnRleHRNZW51SXRlbVdpbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbSk6IEFkZCBh
IG5ldyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGFuIExQTUVOVUlURU1JTkZPLCAKKyAgICAgICAg
ICAgIGFuZCByZWZhY3RvciB0aGUgb3RoZXIgY29uc3RydWN0b3JzIHRvIHBvcHVsYXRlIHRoZSBu
ZXcgZm9ybSBvZiB0aGUgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uLgorICAgICAgICAoV2Vi
Q29yZTo6Q29udGV4dE1lbnVJdGVtOjp+Q29udGV4dE1lbnVJdGVtKTogRG9uJ3QgbmVlZCB0byBk
byBhbnl0aGluZyBpbiB0aGUgZGVzdHJ1Y3RvciBhbnltb3JlLgorICAgICAgICAoV2ViQ29yZTo6
Q29udGV4dE1lbnVJdGVtOjpyZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbik6IFRoZXJlJ3Mgbm90
aGluZyB0byByZWxlYXNlLCBzbyBqdXN0IHJldHVybiB0aGUKKyAgICAgICAgICAgIHBsYXRmb3Jt
IGRlc2NyaXB0aW9uLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRUeXBl
KTogU2ltcGxlIHNldHRlciBvZiB0aGUgbWF0Y2hpbmcgdHlwZSBpbiB0aGUgc3RydWN0LgorICAg
ICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRBY3Rpb24pOiBEaXR0by4KKyAgICAg
ICAgKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6c2V0VGl0bGUpOiBEaXR0by4KKyAgICAgICAg
KFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6c2V0Q2hlY2tlZCk6IERpdHRvLgorICAgICAgICAo
V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRFbmFibGVkKTogRGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnR5cGUpOiBTaW1wbGUgZ2V0dGVyIG9mIHRoZSBtYXRj
aGluZyB0eXBlIGluIHRoZSBzdHJ1Y3QuCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0
ZW06OmFjdGlvbik6RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnRp
dGxlKTogRGl0dG8uICAKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6Y2hlY2tl
ZCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjplbmFibGVkKTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnBsYXRmb3JtU3ViTWVu
dSk6IFJldHVybiB0aGUgbWVudSdzIHN1Ym1lbnUgaXRlbXMuCisgICAgICAgIChXZWJDb3JlOjpD
b250ZXh0TWVudUl0ZW06OnNldFN1Yk1lbnUpOiBTZXQgdGhlIHN1Ym1lbnUgaWYgd2Ugd2VyZSBw
YXNzZWQgaW4gYSBzdWJtZW51LCBpZiBub3QsIAorICAgICAgICAgICAgY2xlYXIgaXQuIFRoaXMg
ZnVuY3Rpb24gYWxzbyB1cGRhdGVzIHRoZSB0eXBlIGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IHdl
IHdlcmUgcGFzc2VkIGluIGEgc3VibWVudS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51
SXRlbTo6bmF0aXZlTWVudUl0ZW0pOiBQb3B1bGF0ZXMgYSBuYXRpdmUgbWVudSBpdGVtIChhbiBM
UE1FTlVJVEVNSU5GTykgYmFzZWQgb24gdGhlCisgICAgICAgICAgICBQbGF0Zm9ybU1lbnVJdGVt
RGVzY3JpcHRpb24gdGhhdCB3YXMgcGFzc2VkIGluLgorCisgICAgICAgICogcGxhdGZvcm0vd2lu
L0NvbnRleHRNZW51V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjpDb250
ZXh0TWVudSk6IEFkZCBhIG5ldyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGFuIEhNRU5VLCBhbmQg
cmVmYWN0b3IgdGhlIG90aGVycyB0byAKKyAgICAgICAgICAgIHNldCB1cCBtX2l0ZW1zIGluc3Rl
YWQgb2YgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1l
bnU6On5Db250ZXh0TWVudSk6IERvbnQndCBuZWVkIHRvIGRvIGFueXRoaW5nIGluIHRoZSBjb25z
dHJ1Y3RvciBhbnltb3JlLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6Oml0ZW1Db3Vu
dCk6IFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9yLgorICAgICAgICAoV2ViQ29yZTo6Q29u
dGV4dE1lbnU6Omluc2VydEl0ZW0pOiBJbnNlcnQgdGhlIGl0ZW0gaW50byB0aGUgdmVjdG9yLgor
ICAgICAgICAoV2ViQ29yZTo6aXRlbVdpdGhBY3Rpb25Jbk1lbnUpOiBSZWN1cnNpdmVseSBzZWFy
Y2hlcyBtZW51cyBmb3IgYSBtZW51IGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gYWN0aW9uIChkaXZlcyBp
bnRvIHN1Ym1lbnVzKS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjppdGVtV2l0aEFj
dGlvbik6IENhbGxzIHRocm91Z2ggdG8gaXRlbVdpdGhBY3Rpb25Jbk1lbnUuCisgICAgICAgIChX
ZWJDb3JlOjpDb250ZXh0TWVudTo6aXRlbUF0SW5kZXgpOiBHZXRzIHRoZSBpdGVtIGluIHRoZSB2
ZWN0b3Igd2l0aCB0aGUgcGFzc2VkIGluIGluZGV4LgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4
dE1lbnU6OnNldFBsYXRmb3JtRGVzY3JpcHRpb24pOiBDbGVhcnMgdGhlIGl0ZW1zIHZlY3RvciBh
bmQgcmUtcG9wdWxhdGVzIGl0IGZyb20gdGhlIHZlY3RvciB0aGF0IHdhcyBwYXNzZWQgaW4uIAor
ICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6OnBsYXRmb3JtRGVzY3JpcHRpb24pOiBDcmVh
dGVzIGEgbmV3IHZlY3RvciwgcG9wdWxhdGVzIGl0IGZyb20gdGhlIG1faXRlbXMgdmVjdG9yLCBh
bmQgcmV0dXJucyBpdC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjpyZWxlYXNlUGxh
dGZvcm1EZXNjcmlwdGlvbik6IENyZWF0ZXMgYSBuZXcgdmVjdG9yLCBwb3B1bGF0ZXMgaXQgZnJv
bSB0aGUgbV9pdGVtcyB2ZWN0b3IsIGFuZCBjbGVhcnMgbV9pdGVtcworICAgICAgICAgICAgYW5k
IHJldHVybnMgdGhlIG5ld2x5IGNyZWF0ZWQgdmVjdG9yLgorICAgICAgICAoV2ViQ29yZTo6Q29u
dGV4dE1lbnU6Om5hdGl2ZU1lbnUpOiBQb3B1bGF0ZXMgYSBuYXRpdmUgbWVudSAoYW4gSE1FTlUp
IGJhc2VkIG9uIHRoZSBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiB0aGF0IHdhcyBwYXNzZWQgaW4u
CisgICAgICAgIChXZWJDb3JlOjpjb250ZXh0TWVudUl0ZW1WZWN0b3IpOiBDcmVhdGVzIGEgdmVj
dG9yIG9mIENvbnRleHRNZW51SXRlbXMsIHBvcHVsYXRlIGl0IHdpdGggd2hhdCB3YXMgcGFzc2Vk
IGluIHRoZSB2ZWN0b3IuIAorICAgICAgICAoV2ViQ29yZTo6cGxhdGZvcm1NZW51RGVzY3JpcHRp
b24pOiBDcmVhdGVzIGEgbmV3IHZlY3RvciBvZiBDb250ZXh0TWVudUl0ZW1zLCBwb3B1bGF0ZSBp
dCB3aXRoIHdoYXQgd2FzIGluIHRoZSBwYXNzZWQgaW4gdGhlIHZlY3Rvci4KKwogMjAxMC0xMi0w
MyAgRGltaXRyaSBHbGF6a292ICA8ZGdsYXprb3ZAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IERhcmluIEFkbGVyLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVu
dS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnUuaAkocmV2aXNp
b24gNzMxNjkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51LmgJKHdvcmtpbmcgY29w
eSkKQEAgLTUwLDYgKzUwLDkgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIHB1YmxpYzoKICAg
ICAgICAgQ29udGV4dE1lbnUoY29uc3QgSGl0VGVzdFJlc3VsdCYpOwogICAgICAgICBDb250ZXh0
TWVudShjb25zdCBIaXRUZXN0UmVzdWx0JiwgY29uc3QgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24p
OworI2lmIFBMQVRGT1JNKFdJTikKKyAgICAgICAgQ29udGV4dE1lbnUoY29uc3QgSGl0VGVzdFJl
c3VsdCYsIGNvbnN0IEhNRU5VKTsKKyNlbmRpZgogICAgICAgICB+Q29udGV4dE1lbnUoKTsKIAog
ICAgICAgICB2b2lkIHBvcHVsYXRlKCk7CkBAIC02MCw2ICs2Myw3IEBAIG5hbWVzcGFjZSBXZWJD
b3JlIHsKICAgICAgICAgdm9pZCBhcHBlbmRJdGVtKENvbnRleHRNZW51SXRlbSYpOwogICAgICAg
ICAKICAgICAgICAgQ29udGV4dE1lbnVJdGVtKiBpdGVtV2l0aEFjdGlvbih1bnNpZ25lZCk7Cisg
ICAgICAgIENvbnRleHRNZW51SXRlbSogaXRlbUF0SW5kZXgodW5zaWduZWQpOwogICAgICAgICBD
b250ZXh0TWVudUl0ZW0qIGl0ZW1BdEluZGV4KHVuc2lnbmVkLCBjb25zdCBQbGF0Zm9ybU1lbnVE
ZXNjcmlwdGlvbik7CiAKICAgICAgICAgdW5zaWduZWQgaXRlbUNvdW50KCkgY29uc3Q7CkBAIC03
NCw2ICs3OCw5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICNpZiBQTEFURk9STShXWCkKICAgICAg
ICAgc3RhdGljIENvbnRleHRNZW51SXRlbSogaXRlbVdpdGhJZChpbnQpOwogI2VuZGlmCisjaWYg
UExBVEZPUk0oV0lOKQorICAgICAgICBzdGF0aWMgdm9pZCBuYXRpdmVNZW51KFBsYXRmb3JtTWVu
dURlc2NyaXB0aW9uLCBITUVOVSk7CisjZW5kaWYKICAgICBwcml2YXRlOgogICAgICAgICBIaXRU
ZXN0UmVzdWx0IG1faGl0VGVzdFJlc3VsdDsKICNpZiBQTEFURk9STShNQUMpCkBAIC04Myw2ICs5
MCw4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgUUxpc3Q8Q29udGV4dE1lbnVJdGVt
PiBtX2l0ZW1zOwogI2VsaWYgUExBVEZPUk0oQ0hST01JVU0pCiAgICAgICAgIFZlY3RvcjxDb250
ZXh0TWVudUl0ZW0+IG1faXRlbXM7CisjZWxpZiBQTEFURk9STShXSU4pCisgICAgICAgIFZlY3Rv
cjxDb250ZXh0TWVudUl0ZW0+IG1faXRlbXM7CiAjZWxpZiBQTEFURk9STShFRkwpCiAgICAgICAg
IENvbnRleHRNZW51Q2xpZW50RWZsKiBtX2NvbnRleHRNZW51Q2xpZW50OwogICAgICAgICBQbGF0
Zm9ybU1lbnVEZXNjcmlwdGlvbiBtX3BsYXRmb3JtRGVzY3JpcHRpb247CkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL0NvbnRleHRNZW51SXRlbS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vQ29udGV4dE1lbnVJdGVtLmgJKHJldmlzaW9uIDczMTY5KQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9Db250ZXh0TWVudUl0ZW0uaAkod29ya2luZyBjb3B5KQpAQCAtNDEsNiArNDEsNyBAQCBjbGFz
cyBOU01lbnVJdGVtOwogI2VuZGlmCiAjZWxpZiBQTEFURk9STShXSU4pCiB0eXBlZGVmIHN0cnVj
dCB0YWdNRU5VSVRFTUlORk9XKiBMUE1FTlVJVEVNSU5GTzsKKyNpbmNsdWRlICJIaXRUZXN0UmVz
dWx0LmgiCiAjZWxpZiBQTEFURk9STShHVEspCiB0eXBlZGVmIHN0cnVjdCBfR3RrTWVudUl0ZW0g
R3RrTWVudUl0ZW07CiAjZWxpZiBQTEFURk9STShRVCkKQEAgLTE2Nyw3ICsxNjgsMjAgQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogI2lmIFBMQVRGT1JNKE1BQykKICAgICB0eXBlZGVmIE5TTWVudUl0
ZW0qIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbjsKICNlbGlmIFBMQVRGT1JNKFdJTikKLSAg
ICB0eXBlZGVmIExQTUVOVUlURU1JTkZPIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbjsKKyAg
ICBzdHJ1Y3QgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIHsKKyAgICAgICAgUGxhdGZvcm1N
ZW51SXRlbURlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgIDogdHlwZShBY3Rpb25UeXBlKQorICAg
ICAgICAgICAgLCBhY3Rpb24oQ29udGV4dE1lbnVJdGVtVGFnTm9BY3Rpb24pCisgICAgICAgICAg
ICAsIHRpdGxlKCIiKQorICAgICAgICAgICAgLCBjaGVja2VkKGZhbHNlKQorICAgICAgICAgICAg
LCBlbmFibGVkKHRydWUpIHsgfQorICAgICAgICBDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGU7Cisg
ICAgICAgIENvbnRleHRNZW51QWN0aW9uIGFjdGlvbjsKKyAgICAgICAgU3RyaW5nIHRpdGxlOwor
ICAgICAgICBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBzdWJNZW51SXRlbXM7CisgICAgICAgIGJv
b2wgY2hlY2tlZDsKKyAgICAgICAgYm9vbCBlbmFibGVkOworICAgIH07CiAjZWxpZiBQTEFURk9S
TShRVCkKICAgICBzdHJ1Y3QgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIHsKICAgICAgICAg
UGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uKCkKQEAgLTI2Myw2ICsyNzcsOSBAQCBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAjaWYgUExBVEZPUk0oR1RLKQogICAgICAgICBDb250ZXh0TWVudUl0ZW0o
R3RrTWVudUl0ZW0qKTsKICNlbmRpZgorI2lmIFBMQVRGT1JNKFdJTikKKyAgICAgICAgQ29udGV4
dE1lbnVJdGVtKGNvbnN0IEhpdFRlc3RSZXN1bHQmLCBjb25zdCBMUE1FTlVJVEVNSU5GTyk7Cisj
ZW5kaWYKICAgICAgICAgfkNvbnRleHRNZW51SXRlbSgpOwogCiAgICAgICAgIFBsYXRmb3JtTWVu
dUl0ZW1EZXNjcmlwdGlvbiByZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOwpAQCAtMjkwLDYg
KzMwNyw5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICNpZiBQTEFURk9STShHVEspCiAgICAgICAg
IHN0YXRpYyBHdGtNZW51SXRlbSogY3JlYXRlTmF0aXZlTWVudUl0ZW0oY29uc3QgUGxhdGZvcm1N
ZW51SXRlbURlc2NyaXB0aW9uJik7CiAjZW5kaWYKKyNpZiBQTEFURk9STShXSU4pCisgICAgICAg
IHN0YXRpYyB2b2lkIG5hdGl2ZU1lbnVJdGVtKGNvbnN0IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlw
dGlvbiYsIExQTUVOVUlURU1JTkZPKTsKKyNlbmRpZgogCiAgICAgcHJpdmF0ZToKICNpZiBQTEFU
Rk9STShNQUMpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL1BsYXRmb3JtTWVudURlc2NyaXB0aW9u
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlv
bi5oCShyZXZpc2lvbiA3MzE2OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vUGxhdGZvcm1NZW51RGVz
Y3JpcHRpb24uaAkod29ya2luZyBjb3B5KQpAQCAtMzMsNyArMzMsNyBAQAogY2xhc3MgTlNNdXRh
YmxlQXJyYXk7CiAjZW5kaWYKICNlbGlmIFBMQVRGT1JNKFdJTikKLXR5cGVkZWYgc3RydWN0IEhN
RU5VX18qIEhNRU5VOworI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KICNlbGlmIFBMQVRGT1JNKFFU
KQogI2luY2x1ZGUgPHFsaXN0Lmg+CiAjZWxpZiBQTEFURk9STShHVEspCkBAIC00OSw3ICs0OSw4
IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICNpZiBQTEFURk9STShNQUMpCiAgICAgdHlwZWRlZiBO
U011dGFibGVBcnJheSogUGxhdGZvcm1NZW51RGVzY3JpcHRpb247CiAjZWxpZiBQTEFURk9STShX
SU4pCi0gICAgdHlwZWRlZiBITUVOVSBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbjsKKyAgICBjbGFz
cyBDb250ZXh0TWVudUl0ZW07CisgICAgdHlwZWRlZiBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiog
UGxhdGZvcm1NZW51RGVzY3JpcHRpb247CiAjZWxpZiBQTEFURk9STShRVCkKICAgICBjbGFzcyBD
b250ZXh0TWVudUl0ZW07CiAgICAgdHlwZWRlZiBjb25zdCBRTGlzdDxDb250ZXh0TWVudUl0ZW0+
KiBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbjsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL0Nv
bnRleHRNZW51SXRlbVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4v
Q29udGV4dE1lbnVJdGVtV2luLmNwcAkocmV2aXNpb24gNzMxNjkpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL3dpbi9Db250ZXh0TWVudUl0ZW1XaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsy
Nyw3IEBACiAjaW5jbHVkZSAiQ29udGV4dE1lbnVJdGVtLmgiCiAKICNpbmNsdWRlICJDb250ZXh0
TWVudS5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKIAogI2luY2x1ZGUgPHd0Zi90ZXh0
L0NTdHJpbmcuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CkBAIC00NSwxODEgKzQ2LDE1NiBAQAog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUNvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVt
KExQTUVOVUlURU1JTkZPIGl0ZW0pCi0gICAgOiBtX3BsYXRmb3JtRGVzY3JpcHRpb24oaXRlbSkK
LXsKK0NvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKGNvbnN0IEhpdFRlc3RSZXN1bHQm
IGhpdFRlc3RSZXN1bHQsIExQTUVOVUlURU1JTkZPIGluZm8pCisgICAgOiBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24oKQoreyAgIAorICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi50eXBlID0gaW5mby0+
ZlR5cGUgJiBNRlRfU0VQQVJBVE9SID8gU2VwYXJhdG9yVHlwZSA6IEFjdGlvblR5cGU7CisgICAg
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLmFjdGlvbiA9IHN0YXRpY19jYXN0PENvbnRleHRNZW51QWN0
aW9uPihpbmZvLT53SUQpOworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi50aXRsZSA9IFN0cmlu
ZyhpbmZvLT5kd1R5cGVEYXRhLCB3Y3NsZW4oaW5mby0+ZHdUeXBlRGF0YSkpOworCisgICAgaWYg
KGluZm8tPmhTdWJNZW51KSB7CisgICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi50eXBlID0g
U3VibWVudVR5cGU7CisgICAgICAgIENvbnRleHRNZW51IHN1Yk1lbnUoaGl0VGVzdFJlc3VsdCwg
aW5mby0+aFN1Yk1lbnUpOworICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24uc3ViTWVudUl0
ZW1zID0gY29udGV4dE1lbnVJdGVtVmVjdG9yKHN1Yk1lbnUucmVsZWFzZVBsYXRmb3JtRGVzY3Jp
cHRpb24oKSk7CisgICAgfQorCisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLmNoZWNrZWQgPSBp
bmZvLT5mU3RhdGUgJiBNRlNfQ0hFQ0tFRDsKKyAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24uZW5h
YmxlZCA9ICEoaW5mby0+ZlN0YXRlICYgTUZTX0RJU0FCTEVEKTsKIH0KIAotQ29udGV4dE1lbnVJ
dGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnUqIHN1Yk1lbnUpCitDb250ZXh0TWVudUl0
ZW06OkNvbnRleHRNZW51SXRlbShQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24gaXRlbSkKKyAg
ICA6IG1fcGxhdGZvcm1EZXNjcmlwdGlvbihpdGVtKQogewotICAgIG1fcGxhdGZvcm1EZXNjcmlw
dGlvbiA9IChMUE1FTlVJVEVNSU5GTyltYWxsb2Moc2l6ZW9mKE1FTlVJVEVNSU5GTykpOwotICAg
IGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtZW1z
ZXQobV9wbGF0Zm9ybURlc2NyaXB0aW9uLCAwLCBzaXplb2YoTUVOVUlURU1JTkZPKSk7Ci0gICAg
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPKTsKLQot
ICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+d0lEID0gQ29udGV4dE1lbnVJdGVtVGFnTm9BY3Rp
b247Ci0gICAgaWYgKHN1Yk1lbnUpIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5m
TWFzayB8PSBNSUlNX1NVQk1FTlU7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1
Yk1lbnUgPSBzdWJNZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCk7Ci0gICAgfQogfQogCiBDb250
ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUsIENv
bnRleHRNZW51QWN0aW9uIGFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ29udGV4dE1lbnUq
IHN1Yk1lbnUpCisgICAgOiBtX3BsYXRmb3JtRGVzY3JpcHRpb24oKQogewotICAgIG1fcGxhdGZv
cm1EZXNjcmlwdGlvbiA9IChMUE1FTlVJVEVNSU5GTyltYWxsb2Moc2l6ZW9mKE1FTlVJVEVNSU5G
TykpOwotICAgIGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBtZW1zZXQobV9wbGF0Zm9ybURlc2NyaXB0aW9uLCAwLCBzaXplb2YoTUVOVUlURU1JTkZP
KSk7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1J
TkZPKTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZNYXNrID0gTUlJTV9GVFlQRTsKLQot
ICAgIGlmICh0eXBlID09IFNlcGFyYXRvclR5cGUpIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uLT5mVHlwZSA9IE1GVF9TRVBBUkFUT1I7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0g
ICAgCi0gICAgaWYgKHN1Yk1lbnUpIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5m
TWFzayB8PSBNSUlNX1NUUklORyB8IE1JSU1fU1VCTUVOVTsKLSAgICAgICAgbV9wbGF0Zm9ybURl
c2NyaXB0aW9uLT5oU3ViTWVudSA9IHN1Yk1lbnUtPnBsYXRmb3JtRGVzY3JpcHRpb24oKTsKLSAg
ICB9IGVsc2UKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFzayB8PSBNSUlNX1NU
UklORyB8IE1JSU1fSUQ7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLnR5cGUgPSB0eXBlOwor
ICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi5hY3Rpb24gPSBhY3Rpb247CisgICAgbV9wbGF0Zm9y
bURlc2NyaXB0aW9uLnRpdGxlID0gdGl0bGU7CiAKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24t
PmZUeXBlID0gTUZUX1NUUklORzsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPndJRCA9IGFj
dGlvbjsKLSAgICAKLSAgICBTdHJpbmcgdCA9IHRpdGxlOwotICAgIG1fcGxhdGZvcm1EZXNjcmlw
dGlvbi0+Y2NoID0gdC5sZW5ndGgoKTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlw
ZURhdGEgPSB3Y3NkdXAodC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKKyAgICBp
ZiAoc3ViTWVudSkKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLnN1Yk1lbnVJdGVtcyA9
IGNvbnRleHRNZW51SXRlbVZlY3RvcihzdWJNZW51LT5yZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlv
bigpKTsKKworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi5jaGVja2VkID0gZmFsc2U7CisgICAg
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLmVuYWJsZWQgPSB0cnVlOwogfQogCiBDb250ZXh0TWVudUl0
ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlLCBDb250ZXh0TWVudUFjdGlv
biwgY29uc3QgU3RyaW5nJiwgYm9vbCwgYm9vbCkKKyAgICA6IG1fcGxhdGZvcm1EZXNjcmlwdGlv
bigpCiB7CiAgICAgLy8gRklYTUU6IEltcGxlbWVudAogfQogCiBDb250ZXh0TWVudUl0ZW06OkNv
bnRleHRNZW51SXRlbShDb250ZXh0TWVudUFjdGlvbiwgY29uc3QgU3RyaW5nJiwgYm9vbCwgYm9v
bCwgVmVjdG9yPENvbnRleHRNZW51SXRlbT4mKQorICAgIDogbV9wbGF0Zm9ybURlc2NyaXB0aW9u
KCkKIHsKICAgICAvLyBGSVhNRTogSW1wbGVtZW50CiB9CiAKIENvbnRleHRNZW51SXRlbTo6fkNv
bnRleHRNZW51SXRlbSgpCiB7Ci0gICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikgewotICAg
ICAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSA9PSBNRlRfU1RSSU5HKQotICAg
ICAgICAgICAgZnJlZShtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEpOwotICAgICAg
ICBmcmVlKG1fcGxhdGZvcm1EZXNjcmlwdGlvbik7Ci0gICAgfQogfQogCi1MUE1FTlVJVEVNSU5G
TyBDb250ZXh0TWVudUl0ZW06OnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCkKK1BsYXRmb3Jt
TWVudUl0ZW1EZXNjcmlwdGlvbiBDb250ZXh0TWVudUl0ZW06OnJlbGVhc2VQbGF0Zm9ybURlc2Ny
aXB0aW9uKCkKIHsKLSAgICBMUE1FTlVJVEVNSU5GTyBpbmZvID0gbV9wbGF0Zm9ybURlc2NyaXB0
aW9uOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IDA7Ci0gICAgcmV0dXJuIGluZm87Cisg
ICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNjcmlwdGlvbjsKIH0KIAogQ29udGV4dE1lbnVJdGVtVHlw
ZSBDb250ZXh0TWVudUl0ZW06OnR5cGUoKSBjb25zdAogewotICAgIENvbnRleHRNZW51SXRlbVR5
cGUgdHlwZSA9IEFjdGlvblR5cGU7Ci0gICAgaWYgKCgobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5m
VHlwZSAmIH5NRlRfT1dORVJEUkFXKSA9PSBNRlRfU1RSSU5HKSAmJiBtX3BsYXRmb3JtRGVzY3Jp
cHRpb24tPmhTdWJNZW51KQotICAgICAgICB0eXBlID0gU3VibWVudVR5cGU7Ci0gICAgZWxzZSBp
ZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSAmIE1GVF9TRVBBUkFUT1IpCi0gICAgICAg
IHR5cGUgPSBTZXBhcmF0b3JUeXBlOworICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb24u
dHlwZTsKK30KIAotICAgIHJldHVybiB0eXBlOwordm9pZCBDb250ZXh0TWVudUl0ZW06OnNldFR5
cGUoQ29udGV4dE1lbnVJdGVtVHlwZSB0eXBlKQoreworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlv
bi50eXBlID0gdHlwZTsKIH0KIAogQ29udGV4dE1lbnVBY3Rpb24gQ29udGV4dE1lbnVJdGVtOjph
Y3Rpb24oKSBjb25zdAogeyAKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q29udGV4dE1lbnVBY3Rp
b24+KG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+d0lEKTsKKyAgICByZXR1cm4gbV9wbGF0Zm9ybURl
c2NyaXB0aW9uLmFjdGlvbjsKIH0KIAotU3RyaW5nIENvbnRleHRNZW51SXRlbTo6dGl0bGUoKSBj
b25zdCAKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRBY3Rpb24oQ29udGV4dE1lbnVBY3Rpb24g
YWN0aW9uKQogewotICAgIHJldHVybiBTdHJpbmcobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5
cGVEYXRhLCB3Y3NsZW4obV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVEYXRhKSk7CisgICAg
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLmFjdGlvbiA9IGFjdGlvbjsKIH0KIAotUGxhdGZvcm1NZW51
RGVzY3JpcHRpb24gQ29udGV4dE1lbnVJdGVtOjpwbGF0Zm9ybVN1Yk1lbnUoKSBjb25zdAorU3Ry
aW5nIENvbnRleHRNZW51SXRlbTo6dGl0bGUoKSBjb25zdCAKIHsKLSAgICByZXR1cm4gbV9wbGF0
Zm9ybURlc2NyaXB0aW9uLT5oU3ViTWVudTsKKyAgICByZXR1cm4gbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLnRpdGxlOwogfQogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VHlwZShDb250ZXh0TWVu
dUl0ZW1UeXBlIHR5cGUpCit2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VGl0bGUoY29uc3QgU3Ry
aW5nJiB0aXRsZSkKIHsKLSAgICBpZiAodHlwZSA9PSBTZXBhcmF0b3JUeXBlKQotICAgICAgICBt
X3BsYXRmb3JtRGVzY3JpcHRpb24tPmZUeXBlID0gTUZUX1NFUEFSQVRPUjsKLSAgICBlbHNlCi0g
ICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlR5cGUgPSBNRlRfU1RSSU5HOworICAgIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbi50aXRsZSA9IHRpdGxlOwogfQogCi12b2lkIENvbnRleHRNZW51
SXRlbTo6c2V0QWN0aW9uKENvbnRleHRNZW51QWN0aW9uIGFjdGlvbikKK1ZlY3RvcjxDb250ZXh0
TWVudUl0ZW0+KiBDb250ZXh0TWVudUl0ZW06OnBsYXRmb3JtU3ViTWVudSgpIGNvbnN0CiB7Ci0g
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT53SUQgPSBhY3Rpb247IAorICAgIHJldHVybiBjb25z
dF9jYXN0PFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+Kj4oJm1fcGxhdGZvcm1EZXNjcmlwdGlvbi5z
dWJNZW51SXRlbXMpOwogfQogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VGl0bGUoY29uc3Qg
U3RyaW5nJiB0aXRsZSkKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRTdWJNZW51KENvbnRleHRN
ZW51KiBzdWJNZW51KQogewotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURh
dGEpCi0gICAgICAgIGZyZWUobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVEYXRhKTsKLSAg
ICAKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmNjaCA9IHRpdGxlLmxlbmd0aCgpOwotICAg
IFN0cmluZyB0aXRsZUNvcHkgPSB0aXRsZTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3
VHlwZURhdGEgPSB3Y3NkdXAodGl0bGVDb3B5LmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9u
KCkpOworICAgIGlmIChzdWJNZW51KSB7CisgICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi5z
dWJNZW51SXRlbXMgPSBjb250ZXh0TWVudUl0ZW1WZWN0b3Ioc3ViTWVudS0+cmVsZWFzZVBsYXRm
b3JtRGVzY3JpcHRpb24oKSk7CisgICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi50eXBlID0g
U3VibWVudVR5cGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9u
LnN1Yk1lbnVJdGVtcy5jbGVhcigpOworICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24udHlw
ZSA9IEFjdGlvblR5cGU7CisgICAgfQogfQogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0U3Vi
TWVudShDb250ZXh0TWVudSogc3ViTWVudSkKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRTdWJN
ZW51KFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBpdGVtcykKIHsKLSAgICBpZiAoc3ViTWVudS0+
cGxhdGZvcm1EZXNjcmlwdGlvbigpID09IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJN
ZW51KQotICAgICAgICA6OkRlc3Ryb3lNZW51KG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1l
bnUpOwotCi0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFzayB8PSBNSUlNX1NVQk1FTlU7
Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5oU3ViTWVudSA9IHN1Yk1lbnUtPnJlbGVhc2VQ
bGF0Zm9ybURlc2NyaXB0aW9uKCk7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLnN1Yk1lbnVJ
dGVtcyA9IGl0ZW1zOwogfQogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0U3ViTWVudShWZWN0
b3I8Q29udGV4dE1lbnVJdGVtPiYpCitib29sIENvbnRleHRNZW51SXRlbTo6Y2hlY2tlZCgpIGNv
bnN0CiB7Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudAorICAgIHJldHVybiBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24uY2hlY2tlZDsKIH0KIAogdm9pZCBDb250ZXh0TWVudUl0ZW06OnNldENoZWNrZWQo
Ym9vbCBjaGVja2VkKQogewotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sgfD0gTUlJ
TV9TVEFURTsKLSAgICBpZiAoY2hlY2tlZCkgewotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRp
b24tPmZTdGF0ZSAmPSB+TUZTX1VOQ0hFQ0tFRDsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5mU3RhdGUgfD0gTUZTX0NIRUNLRUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wbGF0
Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1GU19DSEVDS0VEOwotICAgICAgICBtX3BsYXRm
b3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNfVU5DSEVDS0VEOwotICAgIH0KKyAgICBtX3Bs
YXRmb3JtRGVzY3JpcHRpb24uY2hlY2tlZCA9IGNoZWNrZWQ7CiB9CiAKLWJvb2wgQ29udGV4dE1l
bnVJdGVtOjpjaGVja2VkKCkgY29uc3QKK2Jvb2wgQ29udGV4dE1lbnVJdGVtOjplbmFibGVkKCkg
Y29uc3QKIHsKLSAgICAvLyBGSVhNRSAtIEltcGxlbWVudAotICAgIHJldHVybiBmYWxzZTsKKyAg
ICByZXR1cm4gbV9wbGF0Zm9ybURlc2NyaXB0aW9uLmVuYWJsZWQ7CiB9CiAKIHZvaWQgQ29udGV4
dE1lbnVJdGVtOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKIHsKLSAgICBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPmZNYXNrIHw9IE1JSU1fU1RBVEU7Ci0gICAgaWYgKGVuYWJsZWQpIHsKLSAgICAg
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1GU19ESVNBQkxFRDsKLSAgICAg
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgfD0gTUZTX0VOQUJMRUQ7Ci0gICAgfSBl
bHNlIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1GU19FTkFC
TEVEOwotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNfRElTQUJM
RUQ7Ci0gICAgfQorICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi5lbmFibGVkID0gZW5hYmxlZDsK
IH0KIAotYm9vbCBDb250ZXh0TWVudUl0ZW06OmVuYWJsZWQoKSBjb25zdAordm9pZCBDb250ZXh0
TWVudUl0ZW06Om5hdGl2ZU1lbnVJdGVtKGNvbnN0IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlv
biYgaXRlbSwgTFBNRU5VSVRFTUlORk8gaW5mbykKIHsKLSAgICByZXR1cm4gIShtX3BsYXRmb3Jt
RGVzY3JpcHRpb24tPmZTdGF0ZSAmIE1GU19ESVNBQkxFRCk7CisgICAgbWVtc2V0KGluZm8sIDAs
IHNpemVvZihNRU5VSVRFTUlORk8pKTsKKyAgICBpbmZvLT5jYlNpemUgPSBzaXplb2YoTUVOVUlU
RU1JTkZPKTsKKyAgICAKKyAgICBpbmZvLT5mTWFzayA9IE1JSU1fRlRZUEUgfCBNSUlNX0lEIHwg
TUlJTV9TVFJJTkcgfCBNSUlNX1NUQVRFIHwgTUlJTV9TVUJNRU5VOworCisgICAgaWYgKGl0ZW0u
dHlwZSA9PSBTdWJtZW51VHlwZSkgeworICAgICAgICBITUVOVSBuYXRpdmVNZW51ID0gOjpDcmVh
dGVQb3B1cE1lbnUoKTsKKyAgICAgICAgQ29udGV4dE1lbnU6Om5hdGl2ZU1lbnUoY29uc3RfY2Fz
dDxWZWN0b3I8Q29udGV4dE1lbnVJdGVtPio+KCZpdGVtLnN1Yk1lbnVJdGVtcyksIG5hdGl2ZU1l
bnUpOworICAgICAgICBpbmZvLT5oU3ViTWVudSA9IG5hdGl2ZU1lbnU7CisgICAgfQorCisgICAg
aWYgKGl0ZW0udHlwZSA9PSBTZXBhcmF0b3JUeXBlKQorICAgICAgICBpbmZvLT5mVHlwZSA9IE1G
VF9TRVBBUkFUT1I7CisgICAgZWxzZQorICAgICAgICBpbmZvLT5mVHlwZSA9IE1GVF9TVFJJTkc7
CisKKyAgICBpbmZvLT53SUQgPSBpdGVtLmFjdGlvbjsKKworICAgIGluZm8tPmZTdGF0ZSB8PSBp
dGVtLmVuYWJsZWQgPyBNRlNfRU5BQkxFRCA6IE1GU19ESVNBQkxFRDsKKyAgICBpbmZvLT5mU3Rh
dGUgfD0gaXRlbS5jaGVja2VkID8gTUZTX0NIRUNLRUQgOiBNRlNfVU5DSEVDS0VEOwogfQogCiB9
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9Db250ZXh0TWVudVdpbi5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ29udGV4dE1lbnVXaW4uY3BwCShyZXZpc2lvbiA3
MzE2OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL0NvbnRleHRNZW51V2luLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgIk5vZGUuaCIKICNpbmNsdWRlIDx0
Y2hhci5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAj
aW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCiAjaWZuZGVmIE1JSU1fRlRZUEUKQEAgLTQz
LDMwICs0NCw1OCBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUNvbnRleHRNZW51OjpDb250
ZXh0TWVudShjb25zdCBIaXRUZXN0UmVzdWx0JiByZXN1bHQpCitDb250ZXh0TWVudTo6Q29udGV4
dE1lbnUoY29uc3QgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBjb25zdCBITUVOVSBtZW51KQogICAg
IDogbV9oaXRUZXN0UmVzdWx0KHJlc3VsdCkKLSAgICAsIG1fcGxhdGZvcm1EZXNjcmlwdGlvbigw
KQogI2lmIE9TKFdJTkNFKQogICAgICwgbV9pdGVtQ291bnQoMCkKICNlbmRpZgogewotICAgIHNl
dFBsYXRmb3JtRGVzY3JpcHRpb24oOjpDcmVhdGVQb3B1cE1lbnUoKSk7CisgICAgaW50IGNvdW50
ID0gOjpHZXRNZW51SXRlbUNvdW50KG1lbnUpOworICAgIGlmIChjb3VudCA8PSAwKQorICAgICAg
ICByZXR1cm47CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewor
ICAgICAgICBpbnQgbWVudVN0cmluZ0xlbmd0aCA9IDo6R2V0TWVudVN0cmluZyhtZW51LCBpLCAw
LCAwLCBNRl9CWVBPU0lUSU9OKTsKKyAgICAgICAgaWYgKCFtZW51U3RyaW5nTGVuZ3RoKSB7Cisg
ICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgc3RyaW5nLCB0aGVuIHdlIG11c3QgYmUg
aW4gYSBzZXBhcmF0b3IuCisgICAgICAgICAgICBtX2l0ZW1zLmFwcGVuZChDb250ZXh0TWVudUl0
ZW0oU2VwYXJhdG9yVHlwZSwgQ29udGV4dE1lbnVJdGVtVGFnTm9BY3Rpb24sIFN0cmluZygpKSk7
CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIExQVFNUUiBtZW51
U3RyaW5nID0gbmV3IFdDSEFSW21lbnVTdHJpbmdMZW5ndGggKyAxXTsKKworICAgICAgICBNRU5V
SVRFTUlORk8gaW5mbyA9IHswfTsKKyAgICAgICAgaW5mby5jYlNpemUgPSBzaXplb2YoTUVOVUlU
RU1JTkZPKTsKKyAgICAgICAgaW5mby5mTWFzayA9IE1JSU1fRlRZUEUgfCBNSUlNX0lEIHwgTUlJ
TV9TVFJJTkcgfCBNSUlNX1NUQVRFIHwgTUlJTV9TVUJNRU5VOworICAgICAgICBpbmZvLmR3VHlw
ZURhdGEgPSBtZW51U3RyaW5nOworICAgICAgICBpbmZvLmNjaCA9IG1lbnVTdHJpbmdMZW5ndGgg
KyAxOworCisgICAgICAgIGlmICg6OkdldE1lbnVJdGVtSW5mbyhtZW51LCBpLCBUUlVFLCAmaW5m
bykpCisgICAgICAgICAgIG1faXRlbXMuYXBwZW5kKENvbnRleHRNZW51SXRlbShyZXN1bHQsICZp
bmZvKSk7CisKKyAgICAgICAgZnJlZShtZW51U3RyaW5nKTsKKyAgICB9CiB9CiAKLUNvbnRleHRN
ZW51OjpDb250ZXh0TWVudShjb25zdCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IFBsYXRm
b3JtTWVudURlc2NyaXB0aW9uIG1lbnUpCitDb250ZXh0TWVudTo6Q29udGV4dE1lbnUoY29uc3Qg
SGl0VGVzdFJlc3VsdCYgcmVzdWx0KQogICAgIDogbV9oaXRUZXN0UmVzdWx0KHJlc3VsdCkKLSAg
ICAsIG1fcGxhdGZvcm1EZXNjcmlwdGlvbigwKQogI2lmIE9TKFdJTkNFKQogICAgICwgbV9pdGVt
Q291bnQoMCkKICNlbmRpZgogewotICAgIHNldFBsYXRmb3JtRGVzY3JpcHRpb24obWVudSk7Cit9
CisKK0NvbnRleHRNZW51OjpDb250ZXh0TWVudShjb25zdCBIaXRUZXN0UmVzdWx0JiByZXN1bHQs
IGNvbnN0IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKQorICAgIDogbV9oaXRU
ZXN0UmVzdWx0KHJlc3VsdCkKKyAgICAsIG1faXRlbXMoY29udGV4dE1lbnVJdGVtVmVjdG9yKGRl
c2NyaXB0aW9uKSkKKyNpZiBPUyhXSU5DRSkKKyAgICAsIG1faXRlbUNvdW50KDApCisjZW5kaWYK
K3sgICAgCiB9CiAKIENvbnRleHRNZW51Ojp+Q29udGV4dE1lbnUoKQogewotICAgIGlmIChtX3Bs
YXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIDo6RGVzdHJveU1lbnUobV9wbGF0Zm9ybURlc2Ny
aXB0aW9uKTsKIH0KIAogdW5zaWduZWQgQ29udGV4dE1lbnU6Oml0ZW1Db3VudCgpIGNvbnN0CkBA
IC03NCwxMCArMTAzLDcgQEAgdW5zaWduZWQgQ29udGV4dE1lbnU6Oml0ZW1Db3VudCgpIGNvbnN0
CiAjaWYgT1MoV0lOQ0UpCiAgICAgcmV0dXJuIG1faXRlbUNvdW50OwogI2Vsc2UKLSAgICBpZiAo
IW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4g
OjpHZXRNZW51SXRlbUNvdW50KG1fcGxhdGZvcm1EZXNjcmlwdGlvbik7CisgICAgcmV0dXJuIG1f
aXRlbXMuc2l6ZSgpOwogI2VuZGlmCiB9CiAKQEAgLTExNSwxNiArMTQxLDEzIEBAIHN0YXRpYyBi
b29sIGluc2VydE1lbnVJdGVtKFBsYXRmb3JtTWVudUQKIAogdm9pZCBDb250ZXh0TWVudTo6aW5z
ZXJ0SXRlbSh1bnNpZ25lZCBpbnQgcG9zaXRpb24sIENvbnRleHRNZW51SXRlbSYgaXRlbSkKIHsK
LSAgICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKLSAgICAgICAgcmV0dXJuOwotCiAgICAg
Y2hlY2tPckVuYWJsZUlmTmVlZGVkKGl0ZW0pOwogCiAjaWYgT1MoV0lOQ0UpCiAgICAgaWYgKGlu
c2VydE1lbnVJdGVtKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgcG9zaXRpb24sIGl0ZW0pKQogICAg
ICAgICArK21faXRlbUNvdW50OwogI2Vsc2UKLSAgICA6Okluc2VydE1lbnVJdGVtKG1fcGxhdGZv
cm1EZXNjcmlwdGlvbiwgcG9zaXRpb24sIFRSVUUsIGl0ZW0ucmVsZWFzZVBsYXRmb3JtRGVzY3Jp
cHRpb24oKSk7CisgICAgbV9pdGVtcy5pbnNlcnQocG9zaXRpb24sIGl0ZW0pOwogI2VuZGlmCiB9
CiAKQEAgLTEzMyw5NCArMTU2LDEwMSBAQCB2b2lkIENvbnRleHRNZW51OjphcHBlbmRJdGVtKENv
bnRleHRNZW51CiAgICAgaW5zZXJ0SXRlbShpdGVtQ291bnQoKSwgaXRlbSk7CiB9CiAKLXN0YXRp
YyBDb250ZXh0TWVudUl0ZW0qIGNvbnRleHRNZW51SXRlbUJ5SWRPclBvc2l0aW9uKEhNRU5VIG1l
bnUsIHVuc2lnbmVkIGlkLCBCT09MIGJ5UG9zaXRpb24pCitzdGF0aWMgQ29udGV4dE1lbnVJdGVt
KiBpdGVtV2l0aEFjdGlvbkluTWVudSh1bnNpZ25lZCBhY3Rpb24sIFZlY3RvcjxDb250ZXh0TWVu
dUl0ZW0+JiBpdGVtcykKIHsKLSAgICBpZiAoIW1lbnUpCi0gICAgICAgIHJldHVybiAwOwotICAg
IExQTUVOVUlURU1JTkZPIGluZm8gPSBzdGF0aWNfY2FzdDxMUE1FTlVJVEVNSU5GTz4obWFsbG9j
KHNpemVvZihNRU5VSVRFTUlORk8pKSk7Ci0gICAgaWYgKCFpbmZvKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIG1lbXNldChpbmZvLCAwLCBzaXplb2YoTUVOVUlURU1JTkZPKSk7Ci0KLSAgICBp
bmZvLT5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPKTsKLQotICAgIC8vIFNldHRpbmcgTUlJ
TV9EQVRBIHdoaWNoIGlzIHVzZWZ1bCBmb3IgV2ViS2l0IGNsaWVudHMgd2hvIHN0b3JlIGRhdGEg
aW4gdGhpcyBtZW1iZXIgZm9yIHRoZWlyIGN1c3RvbSBtZW51IGl0ZW1zLgotICAgIGluZm8tPmZN
YXNrID0gTUlJTV9GVFlQRSB8IE1JSU1fSUQgfCBNSUlNX1NUUklORyB8IE1JSU1fREFUQTsKLQot
ICAgIGlmICghOjpHZXRNZW51SXRlbUluZm8obWVudSwgaWQsIGJ5UG9zaXRpb24sIGluZm8pKSB7
Ci0gICAgICAgIGZyZWUoaW5mbyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlm
IChpbmZvLT5mVHlwZSAmIE1GVF9TVFJJTkcpIHsKLSAgICAgICAgTFBUU1RSIGJ1ZmZlciA9IHN0
YXRpY19jYXN0PExQVFNUUj4obWFsbG9jKCsraW5mby0+Y2NoICogc2l6ZW9mKFRDSEFSKSkpOwot
ICAgICAgICBpZiAoIWJ1ZmZlcikgewotICAgICAgICAgICAgZnJlZShpbmZvKTsKLSAgICAgICAg
ICAgIHJldHVybiAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7
ICsraSkKKyAgICB7CisgICAgICAgIGlmIChpdGVtc1tpXS5hY3Rpb24oKSA9PSBhY3Rpb24pCisg
ICAgICAgICAgICByZXR1cm4gJml0ZW1zW2ldOworICAgICAgICBpZiAoaXRlbXNbaV0udHlwZSgp
ID09IFN1Ym1lbnVUeXBlKSB7CisgICAgICAgICAgICBDb250ZXh0TWVudUl0ZW0qIHNlYXJjaFN1
Ym1lbnUgPSBpdGVtV2l0aEFjdGlvbkluTWVudShhY3Rpb24sICppdGVtc1tpXS5wbGF0Zm9ybVN1
Yk1lbnUoKSk7CisgICAgICAgICAgICBpZiAoc2VhcmNoU3VibWVudSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gc2VhcmNoU3VibWVudTsKICAgICAgICAgfQotICAgICAgICBpbmZvLT5kd1R5cGVE
YXRhID0gYnVmZmVyOwotICAgICAgICA6OkdldE1lbnVJdGVtSW5mbyhtZW51LCBpZCwgYnlQb3Np
dGlvbiwgaW5mbyk7CiAgICAgfQogCi0gICAgcmV0dXJuIG5ldyBDb250ZXh0TWVudUl0ZW0oaW5m
byk7CisgICAgcmV0dXJuIDA7CiB9CiAKIENvbnRleHRNZW51SXRlbSogQ29udGV4dE1lbnU6Oml0
ZW1XaXRoQWN0aW9uKHVuc2lnbmVkIGFjdGlvbikKIHsKLSAgICByZXR1cm4gY29udGV4dE1lbnVJ
dGVtQnlJZE9yUG9zaXRpb24obV9wbGF0Zm9ybURlc2NyaXB0aW9uLCBhY3Rpb24sIEZBTFNFKTsK
KyAgICByZXR1cm4gaXRlbVdpdGhBY3Rpb25Jbk1lbnUoYWN0aW9uLCBtX2l0ZW1zKTsKIH0KIAot
Q29udGV4dE1lbnVJdGVtKiBDb250ZXh0TWVudTo6aXRlbUF0SW5kZXgodW5zaWduZWQgaW5kZXgs
IGNvbnN0IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIHBsYXRmb3JtRGVzY3JpcHRpb24pCitDb250
ZXh0TWVudUl0ZW0qIENvbnRleHRNZW51OjppdGVtQXRJbmRleCh1bnNpZ25lZCBpbmRleCkKIHsK
LSAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtQnlJZE9yUG9zaXRpb24ocGxhdGZvcm1EZXNjcmlw
dGlvbiwgaW5kZXgsIFRSVUUpOworICAgIHJldHVybiAmbV9pdGVtc1tpbmRleF07CiB9CiAKLXZv
aWQgQ29udGV4dE1lbnU6OnNldFBsYXRmb3JtRGVzY3JpcHRpb24oSE1FTlUgbWVudSkKK3ZvaWQg
Q29udGV4dE1lbnU6OnNldFBsYXRmb3JtRGVzY3JpcHRpb24oVmVjdG9yPENvbnRleHRNZW51SXRl
bT4qIHBsYXRmb3JtRGVzY3JpcHRpb24pCiB7Ci0gICAgaWYgKG1lbnUgPT0gbV9wbGF0Zm9ybURl
c2NyaXB0aW9uKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgaWYgKG1fcGxhdGZvcm1EZXNj
cmlwdGlvbikKLSAgICAgICAgOjpEZXN0cm95TWVudShtX3BsYXRmb3JtRGVzY3JpcHRpb24pOwor
ICAgIG1faXRlbXMuY2xlYXIoKTsKIAotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IG1lbnU7
Ci0gICAgaWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVybjsKKyAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcGxhdGZvcm1EZXNjcmlwdGlvbi0+c2l6ZSgpOyArK2kp
CisgICAgICAgIG1faXRlbXMuYXBwZW5kKENvbnRleHRNZW51SXRlbShwbGF0Zm9ybURlc2NyaXB0
aW9uLT5hdChpKS5yZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpKSk7Cit9CiAKLSNpZiAhT1Mo
V0lOQ0UpCi0gICAgTUVOVUlORk8gbWVudUluZm8gPSB7MH07Ci0gICAgbWVudUluZm8uY2JTaXpl
ID0gc2l6ZW9mKE1FTlVJTkZPKTsKLSAgICBtZW51SW5mby5mTWFzayA9IE1JTV9TVFlMRTsKLSAg
ICA6OkdldE1lbnVJbmZvKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgJm1lbnVJbmZvKTsKLSAgICBt
ZW51SW5mby5mTWFzayA9IE1JTV9TVFlMRTsKLSAgICBtZW51SW5mby5kd1N0eWxlIHw9IE1OU19O
T1RJRllCWVBPUzsKLSAgICA6OlNldE1lbnVJbmZvKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgJm1l
bnVJbmZvKTsKLSNlbmRpZgorVmVjdG9yPENvbnRleHRNZW51SXRlbT4qIENvbnRleHRNZW51Ojpw
bGF0Zm9ybURlc2NyaXB0aW9uKCkgY29uc3QKK3sKKyAgICBWZWN0b3I8Q29udGV4dE1lbnVJdGVt
PiogaXRlbXMgPSBuZXcgVmVjdG9yPENvbnRleHRNZW51SXRlbT47CisgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IG1faXRlbXMuc2l6ZSgpOyArK2kpCisgICAgICAgIGl0ZW1zLT5hcHBlbmQo
bV9pdGVtc1tpXSk7CisgICAgcmV0dXJuIGl0ZW1zOwogfQogCi1ITUVOVSBDb250ZXh0TWVudTo6
cGxhdGZvcm1EZXNjcmlwdGlvbigpIGNvbnN0CitWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiogQ29u
dGV4dE1lbnU6OnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCkKIHsKLSAgICByZXR1cm4gbV9w
bGF0Zm9ybURlc2NyaXB0aW9uOworICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4qIGl0ZW1zID0g
bmV3IFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+OworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBtX2l0ZW1zLnNpemUoKTsgKytpKQorICAgICAgICBpdGVtcy0+YXBwZW5kKG1faXRlbXNbaV0p
OworCisgICAgbV9pdGVtcy5jbGVhcigpOworICAgIHJldHVybiBpdGVtczsKIH0KIAotSE1FTlUg
Q29udGV4dE1lbnU6OnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCkKK3ZvaWQgQ29udGV4dE1l
bnU6Om5hdGl2ZU1lbnUoVmVjdG9yPENvbnRleHRNZW51SXRlbT4qIGl0ZW1zLCBITUVOVSBtZW51
KQogewotICAgIEhNRU5VIGRlc2NyaXB0aW9uID0gbV9wbGF0Zm9ybURlc2NyaXB0aW9uOwotICAg
IG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IDA7Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAg
IEFTU0VSVF9BUkcoaXRlbXMsIGl0ZW1zKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRl
bXMtPnNpemUoKTsgKytpKQorICAgIHsKKyAgICAgICAgTUVOVUlURU1JTkZPIG1lbnVJdGVtID0g
ezB9OworICAgICAgICBtZW51SXRlbS5jYlNpemUgPSBzaXplb2YobWVudUl0ZW0pOworCisgICAg
ICAgIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGl0ZW1zLT5hdChp
KS5yZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOworICAgICAgICBDb250ZXh0TWVudUl0ZW06
Om5hdGl2ZU1lbnVJdGVtKGRlc2NyaXB0aW9uLCAmbWVudUl0ZW0pOworCisgICAgICAgIFdURjo6
U3RyaW5nIHRpdGxlID0gZGVzY3JpcHRpb24udGl0bGU7CisgICAgICAgIG1lbnVJdGVtLmR3VHlw
ZURhdGEgPSAoTFBXU1RSKSB0aXRsZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpOwor
ICAgICAgICBtZW51SXRlbS5jY2ggPSB0aXRsZS5sZW5ndGgoKSArIDE7CisKKyAgICAgICAgOjpJ
bnNlcnRNZW51SXRlbShtZW51LCBpLCBUUlVFLCAmbWVudUl0ZW0pOworICAgIH0KIH0KIAotVmVj
dG9yPENvbnRleHRNZW51SXRlbT4gY29udGV4dE1lbnVJdGVtVmVjdG9yKFBsYXRmb3JtTWVudURl
c2NyaXB0aW9uKQorVmVjdG9yPENvbnRleHRNZW51SXRlbT4gY29udGV4dE1lbnVJdGVtVmVjdG9y
KFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+KiBtZW51KQogewotICAgIC8vIEZJWE1FIC0gSW1wbGVt
ZW50Ci0gICAgcmV0dXJuIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+KCk7CisgICAgQVNTRVJUX0FS
RyhtZW51LCBtZW51KTsKKworICAgIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+IGl0ZW1zOworICAg
IGludCBjb3VudCA9IG1lbnUtPnNpemUoKTsKKyAgICBpZiAoIWNvdW50KQorICAgICAgICByZXR1
cm4gaXRlbXM7CisgICAgaXRlbXMucmVzZXJ2ZUNhcGFjaXR5KGNvdW50KTsKKworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgICAgICBpdGVtcy5hcHBlbmQobWVu
dS0+YXQoaSkpOworCisgICAgcmV0dXJuIGl0ZW1zOwogfQogCiBQbGF0Zm9ybU1lbnVEZXNjcmlw
dGlvbiBwbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbihWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYgbWVu
dUl0ZW1WZWN0b3IpCiB7Ci0gICAgLy8gRklYTUUgLSBJbXBsZW1lbnQKLSAgICByZXR1cm4gMDsK
LX0KKyAgICBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBwbGF0Zm9ybU1lbnUgPSBuZXcgVmVjdG9y
PENvbnRleHRNZW51SXRlbT47CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1lbnVJdGVt
VmVjdG9yLnNpemUoKTsgKytpKQorICAgICAgICBwbGF0Zm9ybU1lbnUtPmFwcGVuZChtZW51SXRl
bVZlY3RvcltpXSk7CisKKyAgICByZXR1cm4gcGxhdGZvcm1NZW51OworfSAKIAogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpJbmRleDogV2ViS2l0L3dpbi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViS2l0L3dpbi9DaGFuZ2VMb2cJKHJldmlzaW9uIDczMzI1KQorKysgV2ViS2l0L3dpbi9DaGFu
Z2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwyNiBAQAorMjAxMC0xMi0wMyAgQnJpYW4g
V2VpbnN0ZWluICA8YndlaW5zdGVpbkBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgUHJlcCB3b3JrIGZvciBXZWJLaXQyOiBDb250ZXh0
IG1lbnUgc3VwcG9ydCBvbiBXaW5kb3dzCisgICAgICAgIDxodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NTA1MTQ+CisgICAgICAgIAorICAgICAgICBUaGUgV2ViQ29yZSBw
YXJ0IG9mIHRoaXMgY2hhbmdlZCByZWZhY3RvcmVkIENvbnRleHRNZW51cyBvbiBXaW5kb3dzIHRv
IGJlIGJhY2tlZCBieSBhIAorICAgICAgICBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBpbnN0ZWFk
IG9mIGFuIEhNRU5VLiBUaGlzIG1lYW5zIHRoYXQgY2FsbGVycyBvZiBwbGF0Zm9ybURlc2NyaXB0
aW9uKCkKKyAgICAgICAgd2VyZSBleHBlY3RpbmcgYW4gSE1FTlUsIGFuZCBub3cgdGhleSBhcmUg
Z2V0dGluZyBhIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+Ki4KKworICAgICAgICAqIFdlYkNvcmVT
dXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmNwcDoKKyAgICAgICAgKFdlYkNvbnRleHRNZW51
Q2xpZW50OjpnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcyk6IFVwZGF0ZSB0aGUgcmV0dXJu
IHR5cGUsIGFuZCBjcmVhdGUgYW4gSE1FTlUsIHRoZW4gcG9wdXBsYXRlCisgICAgICAgICAgICBp
dCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgQ29udGV4dE1lbnUgcGFzc2VkIGluLCBhbmQgdXNl
IHRoYXQgSE1FTlUgaW4gZnVuY3Rpb25zIHRoYXQgZXhwZWN0IG9uZS4KKyAgICAgICAgKFdlYkNv
bnRleHRNZW51Q2xpZW50Ojpjb250ZXh0TWVudUl0ZW1TZWxlY3RlZCk6IENyZWF0ZSBhIE1FTlVJ
VEVNSU5GTywgcG9wdWxhdGUgaXQgZnJvbSBhIENvbnRleHRNZW51SXRlbSwgYW5kIHBhc3MKKyAg
ICAgICAgICAgIHRoYXQgTUVOVUlURU1JTkZPIHRvIGZ1bmN0aW9ucyB0aGF0IGV4cGVjdCBvbmUu
CisgICAgICAgICogV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuaDogVXBkYXRl
IHRoZSByZXR1cm4gdHlwZSBvZiBnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcy4KKyAgICAg
ICAgKiBXZWJWaWV3LmNwcDoKKyAgICAgICAgKFdlYlZpZXc6OmhhbmRsZUNvbnRleHRNZW51RXZl
bnQpOiBDcmVhdGUgYW4gSE1FTlUsIHBvcHVsYXRlIGl0IHdpdGggdGhlIGNvbnRlbnRzCisgICAg
ICAgICAgICBvZiB0aGUgQ29udGV4dE1lbnUgcGFzc2VkIGluLCBhbmQgdXNlIHRoYXQgSE1FTlUg
aW4gdGhlIGZ1bmN0aW9ucyB0aGF0IGV4cGVjdCBvbmUuCisgICAgICAgIChXZWJWaWV3OjpwZXJm
b3JtQ29udGV4dE1lbnVBY3Rpb24pOiBDb250ZXh0TWVudTo6aXRlbUF0SW5kZXggZG9lc24ndCBu
ZWVkIGEgcGxhdGZvcm1SZXByZXNlbnRhdGlvbgorICAgICAgICAgICAgYW55bW9yZSwgaXQgY2Fu
IGp1c3Qgd29yayBiYXNlZCBvbiB0aGUgaW5kZXgsIHNvIG9ubHkgcGFzcyBvbmUgYXJndW1lbnQu
CisKIDIwMTAtMTItMDMgIFNhbSBXZWluaWcgIDxzYW1Ad2Via2l0Lm9yZz4KIAogICAgICAgICBS
ZXZpZXdlZCBieSBNYWNpZWogU3RhY2hvd2lhay4KSW5kZXg6IFdlYktpdC93aW4vV2ViVmlldy5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJWaWV3LmNwcAkocmV2aXNpb24gNzMxNjkp
CisrKyBXZWJLaXQvd2luL1dlYlZpZXcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjcyLDEzICsx
MjcyLDE2IEBAIGJvb2wgV2ViVmlldzo6aGFuZGxlQ29udGV4dE1lbnVFdmVudChXUEEKICAgICBp
ZiAobV91aURlbGVnYXRlKQogICAgICAgICBtX3VpRGVsZWdhdGUtPmhhc0N1c3RvbU1lbnVJbXBs
ZW1lbnRhdGlvbigmaGFzQ3VzdG9tTWVudXMpOwogCi0gICAgaWYgKGhhc0N1c3RvbU1lbnVzKQot
ICAgICAgICBtX3VpRGVsZWdhdGUtPnRyYWNrQ3VzdG9tUG9wdXBNZW51KChJV2ViVmlldyopdGhp
cywgKE9MRV9IQU5ETEUpKFVMT05HNjQpY29yZU1lbnUtPnBsYXRmb3JtRGVzY3JpcHRpb24oKSwg
JnBvaW50KTsKLSAgICBlbHNlIHsKKyAgICBITUVOVSBtZW51ID0gOjpDcmVhdGVQb3B1cE1lbnUo
KTsKKyAgICBDb250ZXh0TWVudTo6bmF0aXZlTWVudShjb3JlTWVudS0+cGxhdGZvcm1EZXNjcmlw
dGlvbigpLCBtZW51KTsKKworICAgIGlmIChoYXNDdXN0b21NZW51cykgeworICAgICAgICBtX3Vp
RGVsZWdhdGUtPnRyYWNrQ3VzdG9tUG9wdXBNZW51KChJV2ViVmlldyopdGhpcywgKE9MRV9IQU5E
TEUpKFVMT05HNjQpbWVudSwgJnBvaW50KTsKKyAgICB9IGVsc2UgewogICAgICAgICAvLyBTdXJw
cmlzaW5nbHksIFRQTV9SSUdIVEJVVFRPTiBtZWFucyB0aGF0IGl0ZW1zIGFyZSBzZWxlY3RhYmxl
IHdpdGggZWl0aGVyIHRoZSByaWdodCBPUiBsZWZ0IG1vdXNlIGJ1dHRvbgogICAgICAgICBVSU5U
IGZsYWdzID0gVFBNX1JJR0hUQlVUVE9OIHwgVFBNX1RPUEFMSUdOIHwgVFBNX1ZFUlBPU0FOSU1B
VElPTiB8IFRQTV9IT1JJWk9OVEFMCiAgICAgICAgICAgICB8IFRQTV9MRUZUQUxJR04gfCBUUE1f
SE9SUE9TQU5JTUFUSU9OOwotICAgICAgICA6OlRyYWNrUG9wdXBNZW51RXgoY29yZU1lbnUtPnBs
YXRmb3JtRGVzY3JpcHRpb24oKSwgZmxhZ3MsIHBvaW50LngsIHBvaW50LnksIG1fdmlld1dpbmRv
dywgMCk7CisgICAgICAgIDo6VHJhY2tQb3B1cE1lbnVFeChtZW51LCBmbGFncywgcG9pbnQueCwg
cG9pbnQueSwgbV92aWV3V2luZG93LCAwKTsKICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAg
LTEzNTMsMTEgKzEzNTYsMTAgQEAgdm9pZCBXZWJWaWV3OjpwZXJmb3JtQ29udGV4dE1lbnVBY3Rp
b24oVwogICAgIENvbnRleHRNZW51KiBtZW51ID0gbV9wYWdlLT5jb250ZXh0TWVudUNvbnRyb2xs
ZXIoKS0+Y29udGV4dE1lbnUoKTsKICAgICBBU1NFUlQobWVudSk7CiAKLSAgICBDb250ZXh0TWVu
dUl0ZW0qIGl0ZW0gPSBieVBvc2l0aW9uID8gbWVudS0+aXRlbUF0SW5kZXgoKHVuc2lnbmVkKXdQ
YXJhbSwgKEhNRU5VKWxQYXJhbSkgOiBtZW51LT5pdGVtV2l0aEFjdGlvbigoQ29udGV4dE1lbnVB
Y3Rpb24pd1BhcmFtKTsKKyAgICBDb250ZXh0TWVudUl0ZW0qIGl0ZW0gPSBieVBvc2l0aW9uID8g
bWVudS0+aXRlbUF0SW5kZXgoKHVuc2lnbmVkKXdQYXJhbSkgOiBtZW51LT5pdGVtV2l0aEFjdGlv
bigoQ29udGV4dE1lbnVBY3Rpb24pd1BhcmFtKTsKICAgICBpZiAoIWl0ZW0pCiAgICAgICAgIHJl
dHVybjsKICAgICBtX3BhZ2UtPmNvbnRleHRNZW51Q29udHJvbGxlcigpLT5jb250ZXh0TWVudUl0
ZW1TZWxlY3RlZChpdGVtKTsKLSAgICBkZWxldGUgaXRlbTsKIH0KIAogYm9vbCBXZWJWaWV3Ojpo
YW5kbGVNb3VzZUV2ZW50KFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJh
bSkKSW5kZXg6IFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1l
bnVDbGllbnQuY3BwCShyZXZpc2lvbiA3MzMwNikKKysrIFdlYktpdC93aW4vV2ViQ29yZVN1cHBv
cnQvV2ViQ29udGV4dE1lbnVDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NCw3ICs1NCw3
IEBAIHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51RGUKICAgICBkZWxldGUg
dGhpczsKIH0KIAotSE1FTlUgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmdldEN1c3RvbU1lbnVGcm9t
RGVmYXVsdEl0ZW1zKENvbnRleHRNZW51KiBtZW51KQorUGxhdGZvcm1NZW51RGVzY3JpcHRpb24g
V2ViQ29udGV4dE1lbnVDbGllbnQ6OmdldEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0ZW1zKENvbnRl
eHRNZW51KiBtZW51KQogewogICAgIENPTVB0cjxJV2ViVUlEZWxlZ2F0ZT4gdWlEZWxlZ2F0ZTsK
ICAgICBpZiAoRkFJTEVEKG1fd2ViVmlldy0+dWlEZWxlZ2F0ZSgmdWlEZWxlZ2F0ZSkpKQpAQCAt
NjYsOSArNjYsMTMgQEAgSE1FTlUgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmdldEN1c3RvbU1lbgog
ICAgIENPTVB0cjxXZWJFbGVtZW50UHJvcGVydHlCYWc+IHByb3BlcnR5QmFnOwogICAgIHByb3Bl
cnR5QmFnLmFkb3B0UmVmKFdlYkVsZW1lbnRQcm9wZXJ0eUJhZzo6Y3JlYXRlSW5zdGFuY2UobWVu
dS0+aGl0VGVzdFJlc3VsdCgpKSk7CiAgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gZGVjaWRlIHdo
ZXRoZXIgdG8gZG8gdGhlIGRlZmF1bHQgYmVmb3JlIGNhbGxpbmcgdGhpcyBkZWxlZ2F0ZSBtZXRo
b2QKLSAgICBpZiAoRkFJTEVEKHVpRGVsZWdhdGUtPmNvbnRleHRNZW51SXRlbXNGb3JFbGVtZW50
KG1fd2ViVmlldywgcHJvcGVydHlCYWcuZ2V0KCksIChPTEVfSEFORExFKShVTE9ORzY0KW1lbnUt
PnBsYXRmb3JtRGVzY3JpcHRpb24oKSwgKE9MRV9IQU5ETEUqKSZuZXdNZW51KSkpCisgICAgSE1F
TlUgd2luZG93c01lbnUgPSA6OkNyZWF0ZVBvcHVwTWVudSgpOyAgICAKKyAgICBDb250ZXh0TWVu
dTo6bmF0aXZlTWVudShtZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCksIHdpbmRvd3NNZW51KTsK
KyAgICBpZiAoRkFJTEVEKHVpRGVsZWdhdGUtPmNvbnRleHRNZW51SXRlbXNGb3JFbGVtZW50KG1f
d2ViVmlldywgcHJvcGVydHlCYWcuZ2V0KCksIChPTEVfSEFORExFKShVTE9ORzY0KXdpbmRvd3NN
ZW51LCAoT0xFX0hBTkRMRSopJm5ld01lbnUpKSkKICAgICAgICAgcmV0dXJuIG1lbnUtPnBsYXRm
b3JtRGVzY3JpcHRpb24oKTsKLSAgICByZXR1cm4gbmV3TWVudTsKKworICAgIENvbnRleHRNZW51
IGRlbGVnYXRlTWVudShDb250ZXh0TWVudShtZW51LT5oaXRUZXN0UmVzdWx0KCksIG5ld01lbnUp
KTsKKyAgICByZXR1cm4gZGVsZWdhdGVNZW51LnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCk7
CiB9CiAKIHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51SXRlbVNlbGVjdGVk
KENvbnRleHRNZW51SXRlbSogaXRlbSwgY29uc3QgQ29udGV4dE1lbnUqIHBhcmVudE1lbnUpCkBA
IC04Myw4ICs4NywxMCBAQCB2b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50Ojpjb250ZXh0TWVudUl0
CiAKICAgICBDT01QdHI8V2ViRWxlbWVudFByb3BlcnR5QmFnPiBwcm9wZXJ0eUJhZzsKICAgICBw
cm9wZXJ0eUJhZy5hZG9wdFJlZihXZWJFbGVtZW50UHJvcGVydHlCYWc6OmNyZWF0ZUluc3RhbmNl
KHBhcmVudE1lbnUtPmhpdFRlc3RSZXN1bHQoKSkpOwotICAgICAgICAgICAgCi0gICAgdWlEZWxl
Z2F0ZS0+Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQobV93ZWJWaWV3LCBpdGVtLT5yZWxlYXNlUGxh
dGZvcm1EZXNjcmlwdGlvbigpLCBwcm9wZXJ0eUJhZy5nZXQoKSk7CisgICAgCisgICAgTUVOVUlU
RU1JTkZPIGl0ZW1JbmZvOworICAgIENvbnRleHRNZW51SXRlbTo6bmF0aXZlTWVudUl0ZW0oaXRl
bS0+cmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKSwgJml0ZW1JbmZvKTsKKyAgICB1aURlbGVn
YXRlLT5jb250ZXh0TWVudUl0ZW1TZWxlY3RlZChtX3dlYlZpZXcsICZpdGVtSW5mbywgcHJvcGVy
dHlCYWcuZ2V0KCkpOwogfQogCiB2b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50Ojpkb3dubG9hZFVS
TChjb25zdCBLVVJMJiB1cmwpCkluZGV4OiBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNv
bnRleHRNZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9y
dC9XZWJDb250ZXh0TWVudUNsaWVudC5oCShyZXZpc2lvbiA3MzE2OSkKKysrIFdlYktpdC93aW4v
V2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAt
MjQsNiArMjQsNyBAQAogICovCiAKICNpbmNsdWRlIDxXZWJDb3JlL0NvbnRleHRNZW51Q2xpZW50
Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbi5oPgogI2luY2x1
ZGUgPHd0Zi9Gb3J3YXJkLmg+CiAKIGNsYXNzIFdlYlZpZXc7CkBAIC0zNCw3ICszNSw3IEBAIHB1
YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudURlc3Ryb3llZCgpOwogCi0gICAg
dmlydHVhbCBITUVOVSBnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcyhXZWJDb3JlOjpDb250
ZXh0TWVudSopOworICAgIHZpcnR1YWwgV2ViQ29yZTo6UGxhdGZvcm1NZW51RGVzY3JpcHRpb24g
Z2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMoV2ViQ29yZTo6Q29udGV4dE1lbnUqKTsKICAg
ICB2aXJ0dWFsIHZvaWQgY29udGV4dE1lbnVJdGVtU2VsZWN0ZWQoV2ViQ29yZTo6Q29udGV4dE1l
bnVJdGVtKiwgY29uc3QgV2ViQ29yZTo6Q29udGV4dE1lbnUqKTsKICAgICAKICAgICB2aXJ0dWFs
IHZvaWQgZG93bmxvYWRVUkwoY29uc3QgV2ViQ29yZTo6S1VSTCYpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>75603</attachid>
            <date>2010-12-03 23:35:59 -0800</date>
            <delta_ts>2010-12-08 12:57:08 -0800</delta_ts>
            <desc>[PATCH] Context Menu Refactoring w/ style fixes </desc>
            <filename>context_menu_refactoring.patch</filename>
            <type>text/plain</type>
            <size>33278</size>
            <attacher name="Brian Weinstein">bweinstein</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MzMyNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjggQEAKKzIwMTAtMTItMDMgIEJyaWFuIFdlaW5zdGVpbiAgPGJ3ZWluc3RlaW5A
YXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFByZXAgd29yayBmb3IgV2ViS2l0MjogQ29udGV4dCBtZW51IHN1cHBvcnQgb24gV2luZG93
cworICAgICAgICA8aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUwNTE0
PgorICAgICAgICAKKyAgICAgICAgUmVmYWN0b3IgQ29udGV4dE1lbnUgdG8gYmUgYmFja2VkIGJ5
IGEgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gaW5zdGVhZCBvZiBhbiBITUVOVSwgCisgICAgICAg
IGFuZCByZWZhY3RvciBDb250ZXh0TWVudUl0ZW0gdG8gYmUgYmFja2VkIGJ5IGEgc3RydWN0IGNv
bnRhaW5pbmcgdGhlIGluZm9ybWF0aW9uIHRoYXQKKyAgICAgICAgaXMgbmVlZGVkIGluIGEgQ29u
dGV4dE1lbnVJdGVtIChhY3Rpb24sIHR5cGUsIHRpdGxlLCBzdWJtZW51IGl0ZW1zIChpbiBhIFZl
Y3RvcjxDb250ZXh0TWVudUl0ZW0+KSwKKyAgICAgICAgYW5kIHdoZXRoZXIgb3Igbm90IGl0IGlz
IGVuYWJsZWQgb3IgY2hlY2tlZC4KKyAgICAgICAgCisgICAgICAgIFRoaXMgaXMgbmVjZXNzYXJ5
IHNvIENvbnRleHRNZW51cyBhbmQgQ29udGV4dE1lbnVJdGVtcyBjYW4gYmUgY29waWVkLCB3aGlj
aCBITUVOVXMgYW5kIE1FTlVJVEVNSU5GT3MKKyAgICAgICAgY291bGRuJ3QgYmUuCisKKyAgICAg
ICAgUmVmYWN0b3JpbmcsIG5vIG5ldyB0ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL0NvbnRl
eHRNZW51Lmg6IEFkZCBzb21lIFdpbmRvd3Mtc3BlY2lmaWMgZnVuY3Rpb25zOiBBIENvbnRleHRN
ZW51IGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYW4gSE1FTlUsCisgICAgICAgICAgICBhIHN0YXRp
YyBmdW5jdGlvbiB0aGF0IHBvcHVsYXRlcyBhbiBITUVOVSBmcm9tIGEgVmVjdG9yIG9mIENvbnRl
eHRNZW51SXRlbXMsIGFuZCBhZGQgYSBuZXcgaW5zdGFuY2UgdmFyaWFibGUKKyAgICAgICAgICAg
IHRoYXQgaXMgYSBsaXN0IG9mIENvbnRleHRNZW51SXRlbXMuCisgICAgICAgICogcGxhdGZvcm0v
Q29udGV4dE1lbnVJdGVtLmg6IEFkZCBzb21lIFdpbmRvd3Mtc3BlY2lmaWMgZnVuY3Rpb25zOiBB
IENvbnRleHRNZW51SXRlbSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgTUVOVUlURU1JTkZPLAor
ICAgICAgICAgICAgYSBzdGF0aWMgZnVuY3Rpb24gdGhhdCBwb3B1bGF0ZXMgYSBNRU5VSVRFTUlO
Rk8gZnJvbSBhIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uLCBhbmQgY2hhbmdlIHRoZSBQbGF0Zm9y
bU1lbnVJdGVtRGVzY3JpcHRpb24KKyAgICAgICAgICAgIHRvIGJlIGEgc3RydWN0IGluc3RlYWQg
b2YgYW4gTFBNRU5VSVRFTUlORk8uCisgICAgICAgIChXZWJDb3JlOjpQbGF0Zm9ybU1lbnVJdGVt
RGVzY3JpcHRpb246OlBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbik6IFVwZGF0ZSB0aGUgdHlw
ZSBmb3IgV2luZG93cy4KKyAgICAgICAgKiBwbGF0Zm9ybS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlv
bi5oOgorCisgICAgICAgICogcGxhdGZvcm0vd2luL0NvbnRleHRNZW51SXRlbVdpbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbSk6IEFkZCBh
IG5ldyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGFuIExQTUVOVUlURU1JTkZPLCAKKyAgICAgICAg
ICAgIGFuZCByZWZhY3RvciB0aGUgb3RoZXIgY29uc3RydWN0b3JzIHRvIHBvcHVsYXRlIHRoZSBu
ZXcgZm9ybSBvZiB0aGUgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uLgorICAgICAgICAoV2Vi
Q29yZTo6Q29udGV4dE1lbnVJdGVtOjp+Q29udGV4dE1lbnVJdGVtKTogRG9uJ3QgbmVlZCB0byBk
byBhbnl0aGluZyBpbiB0aGUgZGVzdHJ1Y3RvciBhbnltb3JlLgorICAgICAgICAoV2ViQ29yZTo6
Q29udGV4dE1lbnVJdGVtOjpyZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbik6IFRoZXJlJ3Mgbm90
aGluZyB0byByZWxlYXNlLCBzbyBqdXN0IHJldHVybiB0aGUKKyAgICAgICAgICAgIHBsYXRmb3Jt
IGRlc2NyaXB0aW9uLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRUeXBl
KTogU2ltcGxlIHNldHRlciBvZiB0aGUgbWF0Y2hpbmcgdHlwZSBpbiB0aGUgc3RydWN0LgorICAg
ICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRBY3Rpb24pOiBEaXR0by4KKyAgICAg
ICAgKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6c2V0VGl0bGUpOiBEaXR0by4KKyAgICAgICAg
KFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6c2V0Q2hlY2tlZCk6IERpdHRvLgorICAgICAgICAo
V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRFbmFibGVkKTogRGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnR5cGUpOiBTaW1wbGUgZ2V0dGVyIG9mIHRoZSBtYXRj
aGluZyB0eXBlIGluIHRoZSBzdHJ1Y3QuCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0
ZW06OmFjdGlvbik6RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnRp
dGxlKTogRGl0dG8uICAKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6Y2hlY2tl
ZCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjplbmFibGVkKTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnBsYXRmb3JtU3ViTWVu
dSk6IFJldHVybiB0aGUgbWVudSdzIHN1Ym1lbnUgaXRlbXMuCisgICAgICAgIChXZWJDb3JlOjpD
b250ZXh0TWVudUl0ZW06OnNldFN1Yk1lbnUpOiBTZXQgdGhlIHN1Ym1lbnUgaWYgd2Ugd2VyZSBw
YXNzZWQgaW4gYSBzdWJtZW51LCBpZiBub3QsIAorICAgICAgICAgICAgY2xlYXIgaXQuIFRoaXMg
ZnVuY3Rpb24gYWxzbyB1cGRhdGVzIHRoZSB0eXBlIGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IHdl
IHdlcmUgcGFzc2VkIGluIGEgc3VibWVudS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51
SXRlbTo6bmF0aXZlTWVudUl0ZW0pOiBQb3B1bGF0ZXMgYSBuYXRpdmUgbWVudSBpdGVtIChhbiBM
UE1FTlVJVEVNSU5GTykgYmFzZWQgb24gdGhlCisgICAgICAgICAgICBQbGF0Zm9ybU1lbnVJdGVt
RGVzY3JpcHRpb24gdGhhdCB3YXMgcGFzc2VkIGluLgorCisgICAgICAgICogcGxhdGZvcm0vd2lu
L0NvbnRleHRNZW51V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjpDb250
ZXh0TWVudSk6IEFkZCBhIG5ldyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGFuIEhNRU5VLCBhbmQg
cmVmYWN0b3IgdGhlIG90aGVycyB0byAKKyAgICAgICAgICAgIHNldCB1cCBtX2l0ZW1zIGluc3Rl
YWQgb2YgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1l
bnU6On5Db250ZXh0TWVudSk6IERvbnQndCBuZWVkIHRvIGRvIGFueXRoaW5nIGluIHRoZSBjb25z
dHJ1Y3RvciBhbnltb3JlLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6Oml0ZW1Db3Vu
dCk6IFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9yLgorICAgICAgICAoV2ViQ29yZTo6Q29u
dGV4dE1lbnU6Omluc2VydEl0ZW0pOiBJbnNlcnQgdGhlIGl0ZW0gaW50byB0aGUgdmVjdG9yLgor
ICAgICAgICAoV2ViQ29yZTo6aXRlbVdpdGhBY3Rpb25Jbk1lbnUpOiBSZWN1cnNpdmVseSBzZWFy
Y2hlcyBtZW51cyBmb3IgYSBtZW51IGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gYWN0aW9uIChkaXZlcyBp
bnRvIHN1Ym1lbnVzKS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjppdGVtV2l0aEFj
dGlvbik6IENhbGxzIHRocm91Z2ggdG8gaXRlbVdpdGhBY3Rpb25Jbk1lbnUuCisgICAgICAgIChX
ZWJDb3JlOjpDb250ZXh0TWVudTo6aXRlbUF0SW5kZXgpOiBHZXRzIHRoZSBpdGVtIGluIHRoZSB2
ZWN0b3Igd2l0aCB0aGUgcGFzc2VkIGluIGluZGV4LgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4
dE1lbnU6OnNldFBsYXRmb3JtRGVzY3JpcHRpb24pOiBDbGVhcnMgdGhlIGl0ZW1zIHZlY3RvciBh
bmQgcmUtcG9wdWxhdGVzIGl0IGZyb20gdGhlIHZlY3RvciB0aGF0IHdhcyBwYXNzZWQgaW4uIAor
ICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6OnBsYXRmb3JtRGVzY3JpcHRpb24pOiBDcmVh
dGVzIGEgbmV3IHZlY3RvciwgcG9wdWxhdGVzIGl0IGZyb20gdGhlIG1faXRlbXMgdmVjdG9yLCBh
bmQgcmV0dXJucyBpdC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjpyZWxlYXNlUGxh
dGZvcm1EZXNjcmlwdGlvbik6IENyZWF0ZXMgYSBuZXcgdmVjdG9yLCBwb3B1bGF0ZXMgaXQgZnJv
bSB0aGUgbV9pdGVtcyB2ZWN0b3IsIGFuZCBjbGVhcnMgbV9pdGVtcworICAgICAgICAgICAgYW5k
IHJldHVybnMgdGhlIG5ld2x5IGNyZWF0ZWQgdmVjdG9yLgorICAgICAgICAoV2ViQ29yZTo6Q29u
dGV4dE1lbnU6Om5hdGl2ZU1lbnUpOiBQb3B1bGF0ZXMgYSBuYXRpdmUgbWVudSAoYW4gSE1FTlUp
IGJhc2VkIG9uIHRoZSBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiB0aGF0IHdhcyBwYXNzZWQgaW4u
CisgICAgICAgIChXZWJDb3JlOjpjb250ZXh0TWVudUl0ZW1WZWN0b3IpOiBDcmVhdGVzIGEgdmVj
dG9yIG9mIENvbnRleHRNZW51SXRlbXMsIHBvcHVsYXRlIGl0IHdpdGggd2hhdCB3YXMgcGFzc2Vk
IGluIHRoZSB2ZWN0b3IuIAorICAgICAgICAoV2ViQ29yZTo6cGxhdGZvcm1NZW51RGVzY3JpcHRp
b24pOiBDcmVhdGVzIGEgbmV3IHZlY3RvciBvZiBDb250ZXh0TWVudUl0ZW1zLCBwb3B1bGF0ZSBp
dCB3aXRoIHdoYXQgd2FzIGluIHRoZSBwYXNzZWQgaW4gdGhlIHZlY3Rvci4KKwogMjAxMC0xMi0w
MyAgRGltaXRyaSBHbGF6a292ICA8ZGdsYXprb3ZAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IERhcmluIEFkbGVyLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVu
dS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnUuaAkocmV2aXNp
b24gNzMxNjkpCisrKyBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51LmgJKHdvcmtpbmcgY29w
eSkKQEAgLTUwLDYgKzUwLDkgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIHB1YmxpYzoKICAg
ICAgICAgQ29udGV4dE1lbnUoY29uc3QgSGl0VGVzdFJlc3VsdCYpOwogICAgICAgICBDb250ZXh0
TWVudShjb25zdCBIaXRUZXN0UmVzdWx0JiwgY29uc3QgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24p
OworI2lmIFBMQVRGT1JNKFdJTikKKyAgICAgICAgQ29udGV4dE1lbnUoY29uc3QgSGl0VGVzdFJl
c3VsdCYsIGNvbnN0IEhNRU5VKTsKKyNlbmRpZgogICAgICAgICB+Q29udGV4dE1lbnUoKTsKIAog
ICAgICAgICB2b2lkIHBvcHVsYXRlKCk7CkBAIC02MCw2ICs2Myw3IEBAIG5hbWVzcGFjZSBXZWJD
b3JlIHsKICAgICAgICAgdm9pZCBhcHBlbmRJdGVtKENvbnRleHRNZW51SXRlbSYpOwogICAgICAg
ICAKICAgICAgICAgQ29udGV4dE1lbnVJdGVtKiBpdGVtV2l0aEFjdGlvbih1bnNpZ25lZCk7Cisg
ICAgICAgIENvbnRleHRNZW51SXRlbSogaXRlbUF0SW5kZXgodW5zaWduZWQpOwogICAgICAgICBD
b250ZXh0TWVudUl0ZW0qIGl0ZW1BdEluZGV4KHVuc2lnbmVkLCBjb25zdCBQbGF0Zm9ybU1lbnVE
ZXNjcmlwdGlvbik7CiAKICAgICAgICAgdW5zaWduZWQgaXRlbUNvdW50KCkgY29uc3Q7CkBAIC03
NCw2ICs3OCw5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICNpZiBQTEFURk9STShXWCkKICAgICAg
ICAgc3RhdGljIENvbnRleHRNZW51SXRlbSogaXRlbVdpdGhJZChpbnQpOwogI2VuZGlmCisjaWYg
UExBVEZPUk0oV0lOKQorICAgICAgICBzdGF0aWMgdm9pZCBuYXRpdmVNZW51KFBsYXRmb3JtTWVu
dURlc2NyaXB0aW9uLCBITUVOVSk7CisjZW5kaWYKICAgICBwcml2YXRlOgogICAgICAgICBIaXRU
ZXN0UmVzdWx0IG1faGl0VGVzdFJlc3VsdDsKICNpZiBQTEFURk9STShNQUMpCkBAIC04Myw2ICs5
MCw4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgUUxpc3Q8Q29udGV4dE1lbnVJdGVt
PiBtX2l0ZW1zOwogI2VsaWYgUExBVEZPUk0oQ0hST01JVU0pCiAgICAgICAgIFZlY3RvcjxDb250
ZXh0TWVudUl0ZW0+IG1faXRlbXM7CisjZWxpZiBQTEFURk9STShXSU4pCisgICAgICAgIFZlY3Rv
cjxDb250ZXh0TWVudUl0ZW0+IG1faXRlbXM7CiAjZWxpZiBQTEFURk9STShFRkwpCiAgICAgICAg
IENvbnRleHRNZW51Q2xpZW50RWZsKiBtX2NvbnRleHRNZW51Q2xpZW50OwogICAgICAgICBQbGF0
Zm9ybU1lbnVEZXNjcmlwdGlvbiBtX3BsYXRmb3JtRGVzY3JpcHRpb247CkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL0NvbnRleHRNZW51SXRlbS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZv
cm0vQ29udGV4dE1lbnVJdGVtLmgJKHJldmlzaW9uIDczMTY5KQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9Db250ZXh0TWVudUl0ZW0uaAkod29ya2luZyBjb3B5KQpAQCAtNDEsNiArNDEsNyBAQCBjbGFz
cyBOU01lbnVJdGVtOwogI2VuZGlmCiAjZWxpZiBQTEFURk9STShXSU4pCiB0eXBlZGVmIHN0cnVj
dCB0YWdNRU5VSVRFTUlORk9XKiBMUE1FTlVJVEVNSU5GTzsKKyNpbmNsdWRlICJIaXRUZXN0UmVz
dWx0LmgiCiAjZWxpZiBQTEFURk9STShHVEspCiB0eXBlZGVmIHN0cnVjdCBfR3RrTWVudUl0ZW0g
R3RrTWVudUl0ZW07CiAjZWxpZiBQTEFURk9STShRVCkKQEAgLTE2Nyw3ICsxNjgsMjAgQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogI2lmIFBMQVRGT1JNKE1BQykKICAgICB0eXBlZGVmIE5TTWVudUl0
ZW0qIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbjsKICNlbGlmIFBMQVRGT1JNKFdJTikKLSAg
ICB0eXBlZGVmIExQTUVOVUlURU1JTkZPIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbjsKKyAg
ICBzdHJ1Y3QgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIHsKKyAgICAgICAgUGxhdGZvcm1N
ZW51SXRlbURlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgIDogdHlwZShBY3Rpb25UeXBlKQorICAg
ICAgICAgICAgLCBhY3Rpb24oQ29udGV4dE1lbnVJdGVtVGFnTm9BY3Rpb24pCisgICAgICAgICAg
ICAsIHRpdGxlKCIiKQorICAgICAgICAgICAgLCBjaGVja2VkKGZhbHNlKQorICAgICAgICAgICAg
LCBlbmFibGVkKHRydWUpIHsgfQorICAgICAgICBDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGU7Cisg
ICAgICAgIENvbnRleHRNZW51QWN0aW9uIGFjdGlvbjsKKyAgICAgICAgU3RyaW5nIHRpdGxlOwor
ICAgICAgICBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBzdWJNZW51SXRlbXM7CisgICAgICAgIGJv
b2wgY2hlY2tlZDsKKyAgICAgICAgYm9vbCBlbmFibGVkOworICAgIH07CiAjZWxpZiBQTEFURk9S
TShRVCkKICAgICBzdHJ1Y3QgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIHsKICAgICAgICAg
UGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uKCkKQEAgLTI2Myw2ICsyNzcsOSBAQCBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAjaWYgUExBVEZPUk0oR1RLKQogICAgICAgICBDb250ZXh0TWVudUl0ZW0o
R3RrTWVudUl0ZW0qKTsKICNlbmRpZgorI2lmIFBMQVRGT1JNKFdJTikKKyAgICAgICAgQ29udGV4
dE1lbnVJdGVtKGNvbnN0IEhpdFRlc3RSZXN1bHQmLCBjb25zdCBMUE1FTlVJVEVNSU5GTyk7Cisj
ZW5kaWYKICAgICAgICAgfkNvbnRleHRNZW51SXRlbSgpOwogCiAgICAgICAgIFBsYXRmb3JtTWVu
dUl0ZW1EZXNjcmlwdGlvbiByZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOwpAQCAtMjkwLDYg
KzMwNyw5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICNpZiBQTEFURk9STShHVEspCiAgICAgICAg
IHN0YXRpYyBHdGtNZW51SXRlbSogY3JlYXRlTmF0aXZlTWVudUl0ZW0oY29uc3QgUGxhdGZvcm1N
ZW51SXRlbURlc2NyaXB0aW9uJik7CiAjZW5kaWYKKyNpZiBQTEFURk9STShXSU4pCisgICAgICAg
IHN0YXRpYyB2b2lkIG5hdGl2ZU1lbnVJdGVtKGNvbnN0IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlw
dGlvbiYsIExQTUVOVUlURU1JTkZPKTsKKyNlbmRpZgogCiAgICAgcHJpdmF0ZToKICNpZiBQTEFU
Rk9STShNQUMpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL1BsYXRmb3JtTWVudURlc2NyaXB0aW9u
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlv
bi5oCShyZXZpc2lvbiA3MzE2OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vUGxhdGZvcm1NZW51RGVz
Y3JpcHRpb24uaAkod29ya2luZyBjb3B5KQpAQCAtMzMsNyArMzMsNyBAQAogY2xhc3MgTlNNdXRh
YmxlQXJyYXk7CiAjZW5kaWYKICNlbGlmIFBMQVRGT1JNKFdJTikKLXR5cGVkZWYgc3RydWN0IEhN
RU5VX18qIEhNRU5VOworI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KICNlbGlmIFBMQVRGT1JNKFFU
KQogI2luY2x1ZGUgPHFsaXN0Lmg+CiAjZWxpZiBQTEFURk9STShHVEspCkBAIC00OSw3ICs0OSw4
IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICNpZiBQTEFURk9STShNQUMpCiAgICAgdHlwZWRlZiBO
U011dGFibGVBcnJheSogUGxhdGZvcm1NZW51RGVzY3JpcHRpb247CiAjZWxpZiBQTEFURk9STShX
SU4pCi0gICAgdHlwZWRlZiBITUVOVSBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbjsKKyAgICBjbGFz
cyBDb250ZXh0TWVudUl0ZW07CisgICAgdHlwZWRlZiBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiog
UGxhdGZvcm1NZW51RGVzY3JpcHRpb247CiAjZWxpZiBQTEFURk9STShRVCkKICAgICBjbGFzcyBD
b250ZXh0TWVudUl0ZW07CiAgICAgdHlwZWRlZiBjb25zdCBRTGlzdDxDb250ZXh0TWVudUl0ZW0+
KiBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbjsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL0Nv
bnRleHRNZW51SXRlbVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4v
Q29udGV4dE1lbnVJdGVtV2luLmNwcAkocmV2aXNpb24gNzMxNjkpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL3dpbi9Db250ZXh0TWVudUl0ZW1XaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsy
Nyw3IEBACiAjaW5jbHVkZSAiQ29udGV4dE1lbnVJdGVtLmgiCiAKICNpbmNsdWRlICJDb250ZXh0
TWVudS5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKIAogI2luY2x1ZGUgPHd0Zi90ZXh0
L0NTdHJpbmcuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CkBAIC00NSwxODEgKzQ2LDE1NiBAQAog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUNvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVt
KExQTUVOVUlURU1JTkZPIGl0ZW0pCi0gICAgOiBtX3BsYXRmb3JtRGVzY3JpcHRpb24oaXRlbSkK
LXsKK0NvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKGNvbnN0IEhpdFRlc3RSZXN1bHQm
IGhpdFRlc3RSZXN1bHQsIExQTUVOVUlURU1JTkZPIGluZm8pCisgICAgOiBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24oKQoreyAgIAorICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi50eXBlID0gaW5mby0+
ZlR5cGUgJiBNRlRfU0VQQVJBVE9SID8gU2VwYXJhdG9yVHlwZSA6IEFjdGlvblR5cGU7CisgICAg
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLmFjdGlvbiA9IHN0YXRpY19jYXN0PENvbnRleHRNZW51QWN0
aW9uPihpbmZvLT53SUQpOworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi50aXRsZSA9IFN0cmlu
ZyhpbmZvLT5kd1R5cGVEYXRhLCB3Y3NsZW4oaW5mby0+ZHdUeXBlRGF0YSkpOworCisgICAgaWYg
KGluZm8tPmhTdWJNZW51KSB7CisgICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi50eXBlID0g
U3VibWVudVR5cGU7CisgICAgICAgIENvbnRleHRNZW51IHN1Yk1lbnUoaGl0VGVzdFJlc3VsdCwg
aW5mby0+aFN1Yk1lbnUpOworICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24uc3ViTWVudUl0
ZW1zID0gY29udGV4dE1lbnVJdGVtVmVjdG9yKHN1Yk1lbnUucmVsZWFzZVBsYXRmb3JtRGVzY3Jp
cHRpb24oKSk7CisgICAgfQorCisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLmNoZWNrZWQgPSBp
bmZvLT5mU3RhdGUgJiBNRlNfQ0hFQ0tFRDsKKyAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24uZW5h
YmxlZCA9ICEoaW5mby0+ZlN0YXRlICYgTUZTX0RJU0FCTEVEKTsKIH0KIAotQ29udGV4dE1lbnVJ
dGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnUqIHN1Yk1lbnUpCitDb250ZXh0TWVudUl0
ZW06OkNvbnRleHRNZW51SXRlbShQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24gaXRlbSkKKyAg
ICA6IG1fcGxhdGZvcm1EZXNjcmlwdGlvbihpdGVtKQogewotICAgIG1fcGxhdGZvcm1EZXNjcmlw
dGlvbiA9IChMUE1FTlVJVEVNSU5GTyltYWxsb2Moc2l6ZW9mKE1FTlVJVEVNSU5GTykpOwotICAg
IGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtZW1z
ZXQobV9wbGF0Zm9ybURlc2NyaXB0aW9uLCAwLCBzaXplb2YoTUVOVUlURU1JTkZPKSk7Ci0gICAg
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPKTsKLQot
ICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+d0lEID0gQ29udGV4dE1lbnVJdGVtVGFnTm9BY3Rp
b247Ci0gICAgaWYgKHN1Yk1lbnUpIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5m
TWFzayB8PSBNSUlNX1NVQk1FTlU7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1
Yk1lbnUgPSBzdWJNZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCk7Ci0gICAgfQogfQogCiBDb250
ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUsIENv
bnRleHRNZW51QWN0aW9uIGFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ29udGV4dE1lbnUq
IHN1Yk1lbnUpCisgICAgOiBtX3BsYXRmb3JtRGVzY3JpcHRpb24oKQogewotICAgIG1fcGxhdGZv
cm1EZXNjcmlwdGlvbiA9IChMUE1FTlVJVEVNSU5GTyltYWxsb2Moc2l6ZW9mKE1FTlVJVEVNSU5G
TykpOwotICAgIGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBtZW1zZXQobV9wbGF0Zm9ybURlc2NyaXB0aW9uLCAwLCBzaXplb2YoTUVOVUlURU1JTkZP
KSk7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1J
TkZPKTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZNYXNrID0gTUlJTV9GVFlQRTsKLQot
ICAgIGlmICh0eXBlID09IFNlcGFyYXRvclR5cGUpIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uLT5mVHlwZSA9IE1GVF9TRVBBUkFUT1I7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0g
ICAgCi0gICAgaWYgKHN1Yk1lbnUpIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5m
TWFzayB8PSBNSUlNX1NUUklORyB8IE1JSU1fU1VCTUVOVTsKLSAgICAgICAgbV9wbGF0Zm9ybURl
c2NyaXB0aW9uLT5oU3ViTWVudSA9IHN1Yk1lbnUtPnBsYXRmb3JtRGVzY3JpcHRpb24oKTsKLSAg
ICB9IGVsc2UKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFzayB8PSBNSUlNX1NU
UklORyB8IE1JSU1fSUQ7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLnR5cGUgPSB0eXBlOwor
ICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi5hY3Rpb24gPSBhY3Rpb247CisgICAgbV9wbGF0Zm9y
bURlc2NyaXB0aW9uLnRpdGxlID0gdGl0bGU7CiAKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24t
PmZUeXBlID0gTUZUX1NUUklORzsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPndJRCA9IGFj
dGlvbjsKLSAgICAKLSAgICBTdHJpbmcgdCA9IHRpdGxlOwotICAgIG1fcGxhdGZvcm1EZXNjcmlw
dGlvbi0+Y2NoID0gdC5sZW5ndGgoKTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlw
ZURhdGEgPSB3Y3NkdXAodC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKKyAgICBp
ZiAoc3ViTWVudSkKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLnN1Yk1lbnVJdGVtcyA9
IGNvbnRleHRNZW51SXRlbVZlY3RvcihzdWJNZW51LT5yZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlv
bigpKTsKKworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi5jaGVja2VkID0gZmFsc2U7CisgICAg
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLmVuYWJsZWQgPSB0cnVlOwogfQogCiBDb250ZXh0TWVudUl0
ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlLCBDb250ZXh0TWVudUFjdGlv
biwgY29uc3QgU3RyaW5nJiwgYm9vbCwgYm9vbCkKKyAgICA6IG1fcGxhdGZvcm1EZXNjcmlwdGlv
bigpCiB7CiAgICAgLy8gRklYTUU6IEltcGxlbWVudAogfQogCiBDb250ZXh0TWVudUl0ZW06OkNv
bnRleHRNZW51SXRlbShDb250ZXh0TWVudUFjdGlvbiwgY29uc3QgU3RyaW5nJiwgYm9vbCwgYm9v
bCwgVmVjdG9yPENvbnRleHRNZW51SXRlbT4mKQorICAgIDogbV9wbGF0Zm9ybURlc2NyaXB0aW9u
KCkKIHsKICAgICAvLyBGSVhNRTogSW1wbGVtZW50CiB9CiAKIENvbnRleHRNZW51SXRlbTo6fkNv
bnRleHRNZW51SXRlbSgpCiB7Ci0gICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikgewotICAg
ICAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSA9PSBNRlRfU1RSSU5HKQotICAg
ICAgICAgICAgZnJlZShtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEpOwotICAgICAg
ICBmcmVlKG1fcGxhdGZvcm1EZXNjcmlwdGlvbik7Ci0gICAgfQogfQogCi1MUE1FTlVJVEVNSU5G
TyBDb250ZXh0TWVudUl0ZW06OnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCkKK1BsYXRmb3Jt
TWVudUl0ZW1EZXNjcmlwdGlvbiBDb250ZXh0TWVudUl0ZW06OnJlbGVhc2VQbGF0Zm9ybURlc2Ny
aXB0aW9uKCkKIHsKLSAgICBMUE1FTlVJVEVNSU5GTyBpbmZvID0gbV9wbGF0Zm9ybURlc2NyaXB0
aW9uOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IDA7Ci0gICAgcmV0dXJuIGluZm87Cisg
ICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNjcmlwdGlvbjsKIH0KIAogQ29udGV4dE1lbnVJdGVtVHlw
ZSBDb250ZXh0TWVudUl0ZW06OnR5cGUoKSBjb25zdAogewotICAgIENvbnRleHRNZW51SXRlbVR5
cGUgdHlwZSA9IEFjdGlvblR5cGU7Ci0gICAgaWYgKCgobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5m
VHlwZSAmIH5NRlRfT1dORVJEUkFXKSA9PSBNRlRfU1RSSU5HKSAmJiBtX3BsYXRmb3JtRGVzY3Jp
cHRpb24tPmhTdWJNZW51KQotICAgICAgICB0eXBlID0gU3VibWVudVR5cGU7Ci0gICAgZWxzZSBp
ZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSAmIE1GVF9TRVBBUkFUT1IpCi0gICAgICAg
IHR5cGUgPSBTZXBhcmF0b3JUeXBlOworICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb24u
dHlwZTsKK30KIAotICAgIHJldHVybiB0eXBlOwordm9pZCBDb250ZXh0TWVudUl0ZW06OnNldFR5
cGUoQ29udGV4dE1lbnVJdGVtVHlwZSB0eXBlKQoreworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlv
bi50eXBlID0gdHlwZTsKIH0KIAogQ29udGV4dE1lbnVBY3Rpb24gQ29udGV4dE1lbnVJdGVtOjph
Y3Rpb24oKSBjb25zdAogeyAKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q29udGV4dE1lbnVBY3Rp
b24+KG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+d0lEKTsKKyAgICByZXR1cm4gbV9wbGF0Zm9ybURl
c2NyaXB0aW9uLmFjdGlvbjsKIH0KIAotU3RyaW5nIENvbnRleHRNZW51SXRlbTo6dGl0bGUoKSBj
b25zdCAKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRBY3Rpb24oQ29udGV4dE1lbnVBY3Rpb24g
YWN0aW9uKQogewotICAgIHJldHVybiBTdHJpbmcobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5
cGVEYXRhLCB3Y3NsZW4obV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVEYXRhKSk7CisgICAg
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLmFjdGlvbiA9IGFjdGlvbjsKIH0KIAotUGxhdGZvcm1NZW51
RGVzY3JpcHRpb24gQ29udGV4dE1lbnVJdGVtOjpwbGF0Zm9ybVN1Yk1lbnUoKSBjb25zdAorU3Ry
aW5nIENvbnRleHRNZW51SXRlbTo6dGl0bGUoKSBjb25zdCAKIHsKLSAgICByZXR1cm4gbV9wbGF0
Zm9ybURlc2NyaXB0aW9uLT5oU3ViTWVudTsKKyAgICByZXR1cm4gbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLnRpdGxlOwogfQogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VHlwZShDb250ZXh0TWVu
dUl0ZW1UeXBlIHR5cGUpCit2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VGl0bGUoY29uc3QgU3Ry
aW5nJiB0aXRsZSkKIHsKLSAgICBpZiAodHlwZSA9PSBTZXBhcmF0b3JUeXBlKQotICAgICAgICBt
X3BsYXRmb3JtRGVzY3JpcHRpb24tPmZUeXBlID0gTUZUX1NFUEFSQVRPUjsKLSAgICBlbHNlCi0g
ICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlR5cGUgPSBNRlRfU1RSSU5HOworICAgIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbi50aXRsZSA9IHRpdGxlOwogfQogCi12b2lkIENvbnRleHRNZW51
SXRlbTo6c2V0QWN0aW9uKENvbnRleHRNZW51QWN0aW9uIGFjdGlvbikKK1ZlY3RvcjxDb250ZXh0
TWVudUl0ZW0+KiBDb250ZXh0TWVudUl0ZW06OnBsYXRmb3JtU3ViTWVudSgpIGNvbnN0CiB7Ci0g
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT53SUQgPSBhY3Rpb247IAorICAgIHJldHVybiBjb25z
dF9jYXN0PFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+Kj4oJm1fcGxhdGZvcm1EZXNjcmlwdGlvbi5z
dWJNZW51SXRlbXMpOwogfQogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VGl0bGUoY29uc3Qg
U3RyaW5nJiB0aXRsZSkKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRTdWJNZW51KENvbnRleHRN
ZW51KiBzdWJNZW51KQogewotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURh
dGEpCi0gICAgICAgIGZyZWUobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVEYXRhKTsKLSAg
ICAKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmNjaCA9IHRpdGxlLmxlbmd0aCgpOwotICAg
IFN0cmluZyB0aXRsZUNvcHkgPSB0aXRsZTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3
VHlwZURhdGEgPSB3Y3NkdXAodGl0bGVDb3B5LmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9u
KCkpOworICAgIGlmIChzdWJNZW51KSB7CisgICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi5z
dWJNZW51SXRlbXMgPSBjb250ZXh0TWVudUl0ZW1WZWN0b3Ioc3ViTWVudS0+cmVsZWFzZVBsYXRm
b3JtRGVzY3JpcHRpb24oKSk7CisgICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi50eXBlID0g
U3VibWVudVR5cGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9u
LnN1Yk1lbnVJdGVtcy5jbGVhcigpOworICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24udHlw
ZSA9IEFjdGlvblR5cGU7CisgICAgfQogfQogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0U3Vi
TWVudShDb250ZXh0TWVudSogc3ViTWVudSkKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRTdWJN
ZW51KFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBpdGVtcykKIHsKLSAgICBpZiAoc3ViTWVudS0+
cGxhdGZvcm1EZXNjcmlwdGlvbigpID09IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJN
ZW51KQotICAgICAgICA6OkRlc3Ryb3lNZW51KG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1l
bnUpOwotCi0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFzayB8PSBNSUlNX1NVQk1FTlU7
Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5oU3ViTWVudSA9IHN1Yk1lbnUtPnJlbGVhc2VQ
bGF0Zm9ybURlc2NyaXB0aW9uKCk7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLnN1Yk1lbnVJ
dGVtcyA9IGl0ZW1zOwogfQogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0U3ViTWVudShWZWN0
b3I8Q29udGV4dE1lbnVJdGVtPiYpCitib29sIENvbnRleHRNZW51SXRlbTo6Y2hlY2tlZCgpIGNv
bnN0CiB7Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudAorICAgIHJldHVybiBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24uY2hlY2tlZDsKIH0KIAogdm9pZCBDb250ZXh0TWVudUl0ZW06OnNldENoZWNrZWQo
Ym9vbCBjaGVja2VkKQogewotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sgfD0gTUlJ
TV9TVEFURTsKLSAgICBpZiAoY2hlY2tlZCkgewotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRp
b24tPmZTdGF0ZSAmPSB+TUZTX1VOQ0hFQ0tFRDsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5mU3RhdGUgfD0gTUZTX0NIRUNLRUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wbGF0
Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1GU19DSEVDS0VEOwotICAgICAgICBtX3BsYXRm
b3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNfVU5DSEVDS0VEOwotICAgIH0KKyAgICBtX3Bs
YXRmb3JtRGVzY3JpcHRpb24uY2hlY2tlZCA9IGNoZWNrZWQ7CiB9CiAKLWJvb2wgQ29udGV4dE1l
bnVJdGVtOjpjaGVja2VkKCkgY29uc3QKK2Jvb2wgQ29udGV4dE1lbnVJdGVtOjplbmFibGVkKCkg
Y29uc3QKIHsKLSAgICAvLyBGSVhNRSAtIEltcGxlbWVudAotICAgIHJldHVybiBmYWxzZTsKKyAg
ICByZXR1cm4gbV9wbGF0Zm9ybURlc2NyaXB0aW9uLmVuYWJsZWQ7CiB9CiAKIHZvaWQgQ29udGV4
dE1lbnVJdGVtOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKIHsKLSAgICBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPmZNYXNrIHw9IE1JSU1fU1RBVEU7Ci0gICAgaWYgKGVuYWJsZWQpIHsKLSAgICAg
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1GU19ESVNBQkxFRDsKLSAgICAg
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgfD0gTUZTX0VOQUJMRUQ7Ci0gICAgfSBl
bHNlIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1GU19FTkFC
TEVEOwotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNfRElTQUJM
RUQ7Ci0gICAgfQorICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi5lbmFibGVkID0gZW5hYmxlZDsK
IH0KIAotYm9vbCBDb250ZXh0TWVudUl0ZW06OmVuYWJsZWQoKSBjb25zdAordm9pZCBDb250ZXh0
TWVudUl0ZW06Om5hdGl2ZU1lbnVJdGVtKGNvbnN0IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlv
biYgaXRlbSwgTFBNRU5VSVRFTUlORk8gaW5mbykKIHsKLSAgICByZXR1cm4gIShtX3BsYXRmb3Jt
RGVzY3JpcHRpb24tPmZTdGF0ZSAmIE1GU19ESVNBQkxFRCk7CisgICAgbWVtc2V0KGluZm8sIDAs
IHNpemVvZihNRU5VSVRFTUlORk8pKTsKKyAgICBpbmZvLT5jYlNpemUgPSBzaXplb2YoTUVOVUlU
RU1JTkZPKTsKKyAgICAKKyAgICBpbmZvLT5mTWFzayA9IE1JSU1fRlRZUEUgfCBNSUlNX0lEIHwg
TUlJTV9TVFJJTkcgfCBNSUlNX1NUQVRFIHwgTUlJTV9TVUJNRU5VOworCisgICAgaWYgKGl0ZW0u
dHlwZSA9PSBTdWJtZW51VHlwZSkgeworICAgICAgICBITUVOVSBuYXRpdmVNZW51ID0gOjpDcmVh
dGVQb3B1cE1lbnUoKTsKKyAgICAgICAgQ29udGV4dE1lbnU6Om5hdGl2ZU1lbnUoY29uc3RfY2Fz
dDxWZWN0b3I8Q29udGV4dE1lbnVJdGVtPio+KCZpdGVtLnN1Yk1lbnVJdGVtcyksIG5hdGl2ZU1l
bnUpOworICAgICAgICBpbmZvLT5oU3ViTWVudSA9IG5hdGl2ZU1lbnU7CisgICAgfQorCisgICAg
aWYgKGl0ZW0udHlwZSA9PSBTZXBhcmF0b3JUeXBlKQorICAgICAgICBpbmZvLT5mVHlwZSA9IE1G
VF9TRVBBUkFUT1I7CisgICAgZWxzZQorICAgICAgICBpbmZvLT5mVHlwZSA9IE1GVF9TVFJJTkc7
CisKKyAgICBpbmZvLT53SUQgPSBpdGVtLmFjdGlvbjsKKworICAgIGluZm8tPmZTdGF0ZSB8PSBp
dGVtLmVuYWJsZWQgPyBNRlNfRU5BQkxFRCA6IE1GU19ESVNBQkxFRDsKKyAgICBpbmZvLT5mU3Rh
dGUgfD0gaXRlbS5jaGVja2VkID8gTUZTX0NIRUNLRUQgOiBNRlNfVU5DSEVDS0VEOwogfQogCiB9
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9Db250ZXh0TWVudVdpbi5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ29udGV4dE1lbnVXaW4uY3BwCShyZXZpc2lvbiA3
MzE2OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL0NvbnRleHRNZW51V2luLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgIk5vZGUuaCIKICNpbmNsdWRlIDx0
Y2hhci5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAj
aW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCiAjaWZuZGVmIE1JSU1fRlRZUEUKQEAgLTQz
LDMwICs0NCw1OCBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUNvbnRleHRNZW51OjpDb250
ZXh0TWVudShjb25zdCBIaXRUZXN0UmVzdWx0JiByZXN1bHQpCitDb250ZXh0TWVudTo6Q29udGV4
dE1lbnUoY29uc3QgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBjb25zdCBITUVOVSBtZW51KQogICAg
IDogbV9oaXRUZXN0UmVzdWx0KHJlc3VsdCkKLSAgICAsIG1fcGxhdGZvcm1EZXNjcmlwdGlvbigw
KQogI2lmIE9TKFdJTkNFKQogICAgICwgbV9pdGVtQ291bnQoMCkKICNlbmRpZgogewotICAgIHNl
dFBsYXRmb3JtRGVzY3JpcHRpb24oOjpDcmVhdGVQb3B1cE1lbnUoKSk7CisgICAgaW50IGNvdW50
ID0gOjpHZXRNZW51SXRlbUNvdW50KG1lbnUpOworICAgIGlmIChjb3VudCA8PSAwKQorICAgICAg
ICByZXR1cm47CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewor
ICAgICAgICBpbnQgbWVudVN0cmluZ0xlbmd0aCA9IDo6R2V0TWVudVN0cmluZyhtZW51LCBpLCAw
LCAwLCBNRl9CWVBPU0lUSU9OKTsKKyAgICAgICAgaWYgKCFtZW51U3RyaW5nTGVuZ3RoKSB7Cisg
ICAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgc3RyaW5nLCB0aGVuIHdlIG11c3QgYmUg
aW4gYSBzZXBhcmF0b3IuCisgICAgICAgICAgICBtX2l0ZW1zLmFwcGVuZChDb250ZXh0TWVudUl0
ZW0oU2VwYXJhdG9yVHlwZSwgQ29udGV4dE1lbnVJdGVtVGFnTm9BY3Rpb24sIFN0cmluZygpKSk7
CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIExQVFNUUiBtZW51
U3RyaW5nID0gbmV3IFdDSEFSW21lbnVTdHJpbmdMZW5ndGggKyAxXTsKKworICAgICAgICBNRU5V
SVRFTUlORk8gaW5mbyA9IHswfTsKKyAgICAgICAgaW5mby5jYlNpemUgPSBzaXplb2YoTUVOVUlU
RU1JTkZPKTsKKyAgICAgICAgaW5mby5mTWFzayA9IE1JSU1fRlRZUEUgfCBNSUlNX0lEIHwgTUlJ
TV9TVFJJTkcgfCBNSUlNX1NUQVRFIHwgTUlJTV9TVUJNRU5VOworICAgICAgICBpbmZvLmR3VHlw
ZURhdGEgPSBtZW51U3RyaW5nOworICAgICAgICBpbmZvLmNjaCA9IG1lbnVTdHJpbmdMZW5ndGgg
KyAxOworCisgICAgICAgIGlmICg6OkdldE1lbnVJdGVtSW5mbyhtZW51LCBpLCBUUlVFLCAmaW5m
bykpCisgICAgICAgICAgIG1faXRlbXMuYXBwZW5kKENvbnRleHRNZW51SXRlbShyZXN1bHQsICZp
bmZvKSk7CisKKyAgICAgICAgZnJlZShtZW51U3RyaW5nKTsKKyAgICB9CiB9CiAKLUNvbnRleHRN
ZW51OjpDb250ZXh0TWVudShjb25zdCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IFBsYXRm
b3JtTWVudURlc2NyaXB0aW9uIG1lbnUpCitDb250ZXh0TWVudTo6Q29udGV4dE1lbnUoY29uc3Qg
SGl0VGVzdFJlc3VsdCYgcmVzdWx0KQogICAgIDogbV9oaXRUZXN0UmVzdWx0KHJlc3VsdCkKLSAg
ICAsIG1fcGxhdGZvcm1EZXNjcmlwdGlvbigwKQogI2lmIE9TKFdJTkNFKQogICAgICwgbV9pdGVt
Q291bnQoMCkKICNlbmRpZgogewotICAgIHNldFBsYXRmb3JtRGVzY3JpcHRpb24obWVudSk7Cit9
CisKK0NvbnRleHRNZW51OjpDb250ZXh0TWVudShjb25zdCBIaXRUZXN0UmVzdWx0JiByZXN1bHQs
IGNvbnN0IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKQorICAgIDogbV9oaXRU
ZXN0UmVzdWx0KHJlc3VsdCkKKyAgICAsIG1faXRlbXMoY29udGV4dE1lbnVJdGVtVmVjdG9yKGRl
c2NyaXB0aW9uKSkKKyNpZiBPUyhXSU5DRSkKKyAgICAsIG1faXRlbUNvdW50KDApCisjZW5kaWYK
K3sgICAgCiB9CiAKIENvbnRleHRNZW51Ojp+Q29udGV4dE1lbnUoKQogewotICAgIGlmIChtX3Bs
YXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIDo6RGVzdHJveU1lbnUobV9wbGF0Zm9ybURlc2Ny
aXB0aW9uKTsKIH0KIAogdW5zaWduZWQgQ29udGV4dE1lbnU6Oml0ZW1Db3VudCgpIGNvbnN0CkBA
IC03NCwxMCArMTAzLDcgQEAgdW5zaWduZWQgQ29udGV4dE1lbnU6Oml0ZW1Db3VudCgpIGNvbnN0
CiAjaWYgT1MoV0lOQ0UpCiAgICAgcmV0dXJuIG1faXRlbUNvdW50OwogI2Vsc2UKLSAgICBpZiAo
IW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4g
OjpHZXRNZW51SXRlbUNvdW50KG1fcGxhdGZvcm1EZXNjcmlwdGlvbik7CisgICAgcmV0dXJuIG1f
aXRlbXMuc2l6ZSgpOwogI2VuZGlmCiB9CiAKQEAgLTExNSwxNiArMTQxLDEzIEBAIHN0YXRpYyBi
b29sIGluc2VydE1lbnVJdGVtKFBsYXRmb3JtTWVudUQKIAogdm9pZCBDb250ZXh0TWVudTo6aW5z
ZXJ0SXRlbSh1bnNpZ25lZCBpbnQgcG9zaXRpb24sIENvbnRleHRNZW51SXRlbSYgaXRlbSkKIHsK
LSAgICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKLSAgICAgICAgcmV0dXJuOwotCiAgICAg
Y2hlY2tPckVuYWJsZUlmTmVlZGVkKGl0ZW0pOwogCiAjaWYgT1MoV0lOQ0UpCiAgICAgaWYgKGlu
c2VydE1lbnVJdGVtKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgcG9zaXRpb24sIGl0ZW0pKQogICAg
ICAgICArK21faXRlbUNvdW50OwogI2Vsc2UKLSAgICA6Okluc2VydE1lbnVJdGVtKG1fcGxhdGZv
cm1EZXNjcmlwdGlvbiwgcG9zaXRpb24sIFRSVUUsIGl0ZW0ucmVsZWFzZVBsYXRmb3JtRGVzY3Jp
cHRpb24oKSk7CisgICAgbV9pdGVtcy5pbnNlcnQocG9zaXRpb24sIGl0ZW0pOwogI2VuZGlmCiB9
CiAKQEAgLTEzMyw5NCArMTU2LDk5IEBAIHZvaWQgQ29udGV4dE1lbnU6OmFwcGVuZEl0ZW0oQ29u
dGV4dE1lbnUKICAgICBpbnNlcnRJdGVtKGl0ZW1Db3VudCgpLCBpdGVtKTsKIH0KIAotc3RhdGlj
IENvbnRleHRNZW51SXRlbSogY29udGV4dE1lbnVJdGVtQnlJZE9yUG9zaXRpb24oSE1FTlUgbWVu
dSwgdW5zaWduZWQgaWQsIEJPT0wgYnlQb3NpdGlvbikKK3N0YXRpYyBDb250ZXh0TWVudUl0ZW0q
IGl0ZW1XaXRoQWN0aW9uSW5NZW51KHVuc2lnbmVkIGFjdGlvbiwgVmVjdG9yPENvbnRleHRNZW51
SXRlbT4mIGl0ZW1zKQogewotICAgIGlmICghbWVudSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
TFBNRU5VSVRFTUlORk8gaW5mbyA9IHN0YXRpY19jYXN0PExQTUVOVUlURU1JTkZPPihtYWxsb2Mo
c2l6ZW9mKE1FTlVJVEVNSU5GTykpKTsKLSAgICBpZiAoIWluZm8pCi0gICAgICAgIHJldHVybiAw
OwotCi0gICAgbWVtc2V0KGluZm8sIDAsIHNpemVvZihNRU5VSVRFTUlORk8pKTsKLQotICAgIGlu
Zm8tPmNiU2l6ZSA9IHNpemVvZihNRU5VSVRFTUlORk8pOwotCi0gICAgLy8gU2V0dGluZyBNSUlN
X0RBVEEgd2hpY2ggaXMgdXNlZnVsIGZvciBXZWJLaXQgY2xpZW50cyB3aG8gc3RvcmUgZGF0YSBp
biB0aGlzIG1lbWJlciBmb3IgdGhlaXIgY3VzdG9tIG1lbnUgaXRlbXMuCi0gICAgaW5mby0+Zk1h
c2sgPSBNSUlNX0ZUWVBFIHwgTUlJTV9JRCB8IE1JSU1fU1RSSU5HIHwgTUlJTV9EQVRBOwotCi0g
ICAgaWYgKCE6OkdldE1lbnVJdGVtSW5mbyhtZW51LCBpZCwgYnlQb3NpdGlvbiwgaW5mbykpIHsK
LSAgICAgICAgZnJlZShpbmZvKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYg
KGluZm8tPmZUeXBlICYgTUZUX1NUUklORykgewotICAgICAgICBMUFRTVFIgYnVmZmVyID0gc3Rh
dGljX2Nhc3Q8TFBUU1RSPihtYWxsb2MoKytpbmZvLT5jY2ggKiBzaXplb2YoVENIQVIpKSk7Ci0g
ICAgICAgIGlmICghYnVmZmVyKSB7Ci0gICAgICAgICAgICBmcmVlKGluZm8pOwotICAgICAgICAg
ICAgcmV0dXJuIDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsg
KytpKSB7CisgICAgICAgIGlmIChpdGVtc1tpXS5hY3Rpb24oKSA9PSBhY3Rpb24pCisgICAgICAg
ICAgICByZXR1cm4gJml0ZW1zW2ldOworICAgICAgICBpZiAoaXRlbXNbaV0udHlwZSgpID09IFN1
Ym1lbnVUeXBlKSB7CisgICAgICAgICAgICBDb250ZXh0TWVudUl0ZW0qIHNlYXJjaFN1Ym1lbnUg
PSBpdGVtV2l0aEFjdGlvbkluTWVudShhY3Rpb24sICppdGVtc1tpXS5wbGF0Zm9ybVN1Yk1lbnUo
KSk7CisgICAgICAgICAgICBpZiAoc2VhcmNoU3VibWVudSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gc2VhcmNoU3VibWVudTsKICAgICAgICAgfQotICAgICAgICBpbmZvLT5kd1R5cGVEYXRhID0g
YnVmZmVyOwotICAgICAgICA6OkdldE1lbnVJdGVtSW5mbyhtZW51LCBpZCwgYnlQb3NpdGlvbiwg
aW5mbyk7CiAgICAgfQogCi0gICAgcmV0dXJuIG5ldyBDb250ZXh0TWVudUl0ZW0oaW5mbyk7Cisg
ICAgcmV0dXJuIDA7CiB9CiAKIENvbnRleHRNZW51SXRlbSogQ29udGV4dE1lbnU6Oml0ZW1XaXRo
QWN0aW9uKHVuc2lnbmVkIGFjdGlvbikKIHsKLSAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtQnlJ
ZE9yUG9zaXRpb24obV9wbGF0Zm9ybURlc2NyaXB0aW9uLCBhY3Rpb24sIEZBTFNFKTsKKyAgICBy
ZXR1cm4gaXRlbVdpdGhBY3Rpb25Jbk1lbnUoYWN0aW9uLCBtX2l0ZW1zKTsKIH0KIAotQ29udGV4
dE1lbnVJdGVtKiBDb250ZXh0TWVudTo6aXRlbUF0SW5kZXgodW5zaWduZWQgaW5kZXgsIGNvbnN0
IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIHBsYXRmb3JtRGVzY3JpcHRpb24pCitDb250ZXh0TWVu
dUl0ZW0qIENvbnRleHRNZW51OjppdGVtQXRJbmRleCh1bnNpZ25lZCBpbmRleCkKIHsKLSAgICBy
ZXR1cm4gY29udGV4dE1lbnVJdGVtQnlJZE9yUG9zaXRpb24ocGxhdGZvcm1EZXNjcmlwdGlvbiwg
aW5kZXgsIFRSVUUpOworICAgIHJldHVybiAmbV9pdGVtc1tpbmRleF07CiB9CiAKLXZvaWQgQ29u
dGV4dE1lbnU6OnNldFBsYXRmb3JtRGVzY3JpcHRpb24oSE1FTlUgbWVudSkKK3ZvaWQgQ29udGV4
dE1lbnU6OnNldFBsYXRmb3JtRGVzY3JpcHRpb24oVmVjdG9yPENvbnRleHRNZW51SXRlbT4qIHBs
YXRmb3JtRGVzY3JpcHRpb24pCiB7Ci0gICAgaWYgKG1lbnUgPT0gbV9wbGF0Zm9ybURlc2NyaXB0
aW9uKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlv
bikKLSAgICAgICAgOjpEZXN0cm95TWVudShtX3BsYXRmb3JtRGVzY3JpcHRpb24pOworICAgIG1f
aXRlbXMuY2xlYXIoKTsKIAotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IG1lbnU7Ci0gICAg
aWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVybjsKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgcGxhdGZvcm1EZXNjcmlwdGlvbi0+c2l6ZSgpOyArK2kpCisgICAg
ICAgIG1faXRlbXMuYXBwZW5kKENvbnRleHRNZW51SXRlbShwbGF0Zm9ybURlc2NyaXB0aW9uLT5h
dChpKS5yZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpKSk7Cit9CiAKLSNpZiAhT1MoV0lOQ0Up
Ci0gICAgTUVOVUlORk8gbWVudUluZm8gPSB7MH07Ci0gICAgbWVudUluZm8uY2JTaXplID0gc2l6
ZW9mKE1FTlVJTkZPKTsKLSAgICBtZW51SW5mby5mTWFzayA9IE1JTV9TVFlMRTsKLSAgICA6Okdl
dE1lbnVJbmZvKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgJm1lbnVJbmZvKTsKLSAgICBtZW51SW5m
by5mTWFzayA9IE1JTV9TVFlMRTsKLSAgICBtZW51SW5mby5kd1N0eWxlIHw9IE1OU19OT1RJRllC
WVBPUzsKLSAgICA6OlNldE1lbnVJbmZvKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgJm1lbnVJbmZv
KTsKLSNlbmRpZgorVmVjdG9yPENvbnRleHRNZW51SXRlbT4qIENvbnRleHRNZW51OjpwbGF0Zm9y
bURlc2NyaXB0aW9uKCkgY29uc3QKK3sKKyAgICBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiogaXRl
bXMgPSBuZXcgVmVjdG9yPENvbnRleHRNZW51SXRlbT47CisgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IG1faXRlbXMuc2l6ZSgpOyArK2kpCisgICAgICAgIGl0ZW1zLT5hcHBlbmQobV9pdGVt
c1tpXSk7CisgICAgcmV0dXJuIGl0ZW1zOwogfQogCi1ITUVOVSBDb250ZXh0TWVudTo6cGxhdGZv
cm1EZXNjcmlwdGlvbigpIGNvbnN0CitWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiogQ29udGV4dE1l
bnU6OnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCkKIHsKLSAgICByZXR1cm4gbV9wbGF0Zm9y
bURlc2NyaXB0aW9uOworICAgIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+KiBpdGVtcyA9IG5ldyBW
ZWN0b3I8Q29udGV4dE1lbnVJdGVtPjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9p
dGVtcy5zaXplKCk7ICsraSkKKyAgICAgICAgaXRlbXMtPmFwcGVuZChtX2l0ZW1zW2ldKTsKKwor
ICAgIG1faXRlbXMuY2xlYXIoKTsKKyAgICByZXR1cm4gaXRlbXM7CiB9CiAKLUhNRU5VIENvbnRl
eHRNZW51OjpyZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpCit2b2lkIENvbnRleHRNZW51Ojpu
YXRpdmVNZW51KFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+KiBpdGVtcywgSE1FTlUgbWVudSkKIHsK
LSAgICBITUVOVSBkZXNjcmlwdGlvbiA9IG1fcGxhdGZvcm1EZXNjcmlwdGlvbjsKLSAgICBtX3Bs
YXRmb3JtRGVzY3JpcHRpb24gPSAwOwotICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICBBU1NF
UlRfQVJHKGl0ZW1zLCBpdGVtcyk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLT5z
aXplKCk7ICsraSkgeworICAgICAgICBNRU5VSVRFTUlORk8gbWVudUl0ZW0gPSB7MH07CisgICAg
ICAgIG1lbnVJdGVtLmNiU2l6ZSA9IHNpemVvZihtZW51SXRlbSk7CisKKyAgICAgICAgUGxhdGZv
cm1NZW51SXRlbURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gaXRlbXMtPmF0KGkpLnJlbGVhc2VQ
bGF0Zm9ybURlc2NyaXB0aW9uKCk7CisgICAgICAgIENvbnRleHRNZW51SXRlbTo6bmF0aXZlTWVu
dUl0ZW0oZGVzY3JpcHRpb24sICZtZW51SXRlbSk7CisKKyAgICAgICAgV1RGOjpTdHJpbmcgdGl0
bGUgPSBkZXNjcmlwdGlvbi50aXRsZTsKKyAgICAgICAgbWVudUl0ZW0uZHdUeXBlRGF0YSA9IChM
UFdTVFIpIHRpdGxlLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCk7CisgICAgICAgIG1l
bnVJdGVtLmNjaCA9IHRpdGxlLmxlbmd0aCgpICsgMTsKKworICAgICAgICA6Okluc2VydE1lbnVJ
dGVtKG1lbnUsIGksIFRSVUUsICZtZW51SXRlbSk7CisgICAgfQogfQogCi1WZWN0b3I8Q29udGV4
dE1lbnVJdGVtPiBjb250ZXh0TWVudUl0ZW1WZWN0b3IoUGxhdGZvcm1NZW51RGVzY3JpcHRpb24p
CitWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBjb250ZXh0TWVudUl0ZW1WZWN0b3IoVmVjdG9yPENv
bnRleHRNZW51SXRlbT4qIG1lbnUpCiB7Ci0gICAgLy8gRklYTUUgLSBJbXBsZW1lbnQKLSAgICBy
ZXR1cm4gVmVjdG9yPENvbnRleHRNZW51SXRlbT4oKTsKKyAgICBBU1NFUlRfQVJHKG1lbnUsIG1l
bnUpOworCisgICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gaXRlbXM7CisgICAgaW50IGNvdW50
ID0gbWVudS0+c2l6ZSgpOworICAgIGlmICghY291bnQpCisgICAgICAgIHJldHVybiBpdGVtczsK
KyAgICBpdGVtcy5yZXNlcnZlQ2FwYWNpdHkoY291bnQpOworCisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgICAgIGl0ZW1zLmFwcGVuZChtZW51LT5hdChpKSk7
CisKKyAgICByZXR1cm4gaXRlbXM7CiB9CiAKIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIHBsYXRm
b3JtTWVudURlc2NyaXB0aW9uKFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBtZW51SXRlbVZlY3Rv
cikKIHsKLSAgICAvLyBGSVhNRSAtIEltcGxlbWVudAotICAgIHJldHVybiAwOwotfQorICAgIFBs
YXRmb3JtTWVudURlc2NyaXB0aW9uIHBsYXRmb3JtTWVudSA9IG5ldyBWZWN0b3I8Q29udGV4dE1l
bnVJdGVtPjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWVudUl0ZW1WZWN0b3Iuc2l6
ZSgpOyArK2kpCisgICAgICAgIHBsYXRmb3JtTWVudS0+YXBwZW5kKG1lbnVJdGVtVmVjdG9yW2ld
KTsKKworICAgIHJldHVybiBwbGF0Zm9ybU1lbnU7Cit9IAogCiB9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCkluZGV4OiBXZWJLaXQvd2luL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2lu
L0NoYW5nZUxvZwkocmV2aXNpb24gNzMzMjUpCisrKyBXZWJLaXQvd2luL0NoYW5nZUxvZwkod29y
a2luZyBjb3B5KQpAQCAtMSwzICsxLDI2IEBACisyMDEwLTEyLTAzICBCcmlhbiBXZWluc3RlaW4g
IDxid2VpbnN0ZWluQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBQcmVwIHdvcmsgZm9yIFdlYktpdDI6IENvbnRleHQgbWVudSBzdXBw
b3J0IG9uIFdpbmRvd3MKKyAgICAgICAgPGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD01MDUxND4KKyAgICAgICAgCisgICAgICAgIFRoZSBXZWJDb3JlIHBhcnQgb2YgdGhp
cyBjaGFuZ2VkIHJlZmFjdG9yZWQgQ29udGV4dE1lbnVzIG9uIFdpbmRvd3MgdG8gYmUgYmFja2Vk
IGJ5IGEgCisgICAgICAgIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+IGluc3RlYWQgb2YgYW4gSE1F
TlUuIFRoaXMgbWVhbnMgdGhhdCBjYWxsZXJzIG9mIHBsYXRmb3JtRGVzY3JpcHRpb24oKQorICAg
ICAgICB3ZXJlIGV4cGVjdGluZyBhbiBITUVOVSwgYW5kIG5vdyB0aGV5IGFyZSBnZXR0aW5nIGEg
VmVjdG9yPENvbnRleHRNZW51SXRlbT4qLgorCisgICAgICAgICogV2ViQ29yZVN1cHBvcnQvV2Vi
Q29udGV4dE1lbnVDbGllbnQuY3BwOgorICAgICAgICAoV2ViQ29udGV4dE1lbnVDbGllbnQ6Omdl
dEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0ZW1zKTogVXBkYXRlIHRoZSByZXR1cm4gdHlwZSwgYW5k
IGNyZWF0ZSBhbiBITUVOVSwgdGhlbiBwb3B1cGxhdGUKKyAgICAgICAgICAgIGl0IHdpdGggdGhl
IGNvbnRlbnRzIG9mIHRoZSBDb250ZXh0TWVudSBwYXNzZWQgaW4sIGFuZCB1c2UgdGhhdCBITUVO
VSBpbiBmdW5jdGlvbnMgdGhhdCBleHBlY3Qgb25lLgorICAgICAgICAoV2ViQ29udGV4dE1lbnVD
bGllbnQ6OmNvbnRleHRNZW51SXRlbVNlbGVjdGVkKTogQ3JlYXRlIGEgTUVOVUlURU1JTkZPLCBw
b3B1bGF0ZSBpdCBmcm9tIGEgQ29udGV4dE1lbnVJdGVtLCBhbmQgcGFzcworICAgICAgICAgICAg
dGhhdCBNRU5VSVRFTUlORk8gdG8gZnVuY3Rpb25zIHRoYXQgZXhwZWN0IG9uZS4KKyAgICAgICAg
KiBXZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oOiBVcGRhdGUgdGhlIHJldHVy
biB0eXBlIG9mIGdldEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0ZW1zLgorICAgICAgICAqIFdlYlZp
ZXcuY3BwOgorICAgICAgICAoV2ViVmlldzo6aGFuZGxlQ29udGV4dE1lbnVFdmVudCk6IENyZWF0
ZSBhbiBITUVOVSwgcG9wdWxhdGUgaXQgd2l0aCB0aGUgY29udGVudHMKKyAgICAgICAgICAgIG9m
IHRoZSBDb250ZXh0TWVudSBwYXNzZWQgaW4sIGFuZCB1c2UgdGhhdCBITUVOVSBpbiB0aGUgZnVu
Y3Rpb25zIHRoYXQgZXhwZWN0IG9uZS4KKyAgICAgICAgKFdlYlZpZXc6OnBlcmZvcm1Db250ZXh0
TWVudUFjdGlvbik6IENvbnRleHRNZW51OjppdGVtQXRJbmRleCBkb2Vzbid0IG5lZWQgYSBwbGF0
Zm9ybVJlcHJlc2VudGF0aW9uCisgICAgICAgICAgICBhbnltb3JlLCBpdCBjYW4ganVzdCB3b3Jr
IGJhc2VkIG9uIHRoZSBpbmRleCwgc28gb25seSBwYXNzIG9uZSBhcmd1bWVudC4KKwogMjAxMC0x
Mi0wMyAgU2FtIFdlaW5pZyAgPHNhbUB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IE1hY2llaiBTdGFjaG93aWFrLgpJbmRleDogV2ViS2l0L3dpbi9XZWJWaWV3LmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQvd2luL1dlYlZpZXcuY3BwCShyZXZpc2lvbiA3MzE2OSkKKysrIFdlYktp
dC93aW4vV2ViVmlldy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEyNzIsMTMgKzEyNzIsMTYgQEAg
Ym9vbCBXZWJWaWV3OjpoYW5kbGVDb250ZXh0TWVudUV2ZW50KFdQQQogICAgIGlmIChtX3VpRGVs
ZWdhdGUpCiAgICAgICAgIG1fdWlEZWxlZ2F0ZS0+aGFzQ3VzdG9tTWVudUltcGxlbWVudGF0aW9u
KCZoYXNDdXN0b21NZW51cyk7CiAKKyAgICBITUVOVSBtZW51ID0gOjpDcmVhdGVQb3B1cE1lbnUo
KTsKKyAgICBDb250ZXh0TWVudTo6bmF0aXZlTWVudShjb3JlTWVudS0+cGxhdGZvcm1EZXNjcmlw
dGlvbigpLCBtZW51KTsKKwogICAgIGlmIChoYXNDdXN0b21NZW51cykKLSAgICAgICAgbV91aURl
bGVnYXRlLT50cmFja0N1c3RvbVBvcHVwTWVudSgoSVdlYlZpZXcqKXRoaXMsIChPTEVfSEFORExF
KShVTE9ORzY0KWNvcmVNZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCksICZwb2ludCk7CisgICAg
ICAgIG1fdWlEZWxlZ2F0ZS0+dHJhY2tDdXN0b21Qb3B1cE1lbnUoKElXZWJWaWV3Kil0aGlzLCAo
T0xFX0hBTkRMRSkoVUxPTkc2NCltZW51LCAmcG9pbnQpOwogICAgIGVsc2UgewogICAgICAgICAv
LyBTdXJwcmlzaW5nbHksIFRQTV9SSUdIVEJVVFRPTiBtZWFucyB0aGF0IGl0ZW1zIGFyZSBzZWxl
Y3RhYmxlIHdpdGggZWl0aGVyIHRoZSByaWdodCBPUiBsZWZ0IG1vdXNlIGJ1dHRvbgogICAgICAg
ICBVSU5UIGZsYWdzID0gVFBNX1JJR0hUQlVUVE9OIHwgVFBNX1RPUEFMSUdOIHwgVFBNX1ZFUlBP
U0FOSU1BVElPTiB8IFRQTV9IT1JJWk9OVEFMCiAgICAgICAgICAgICB8IFRQTV9MRUZUQUxJR04g
fCBUUE1fSE9SUE9TQU5JTUFUSU9OOwotICAgICAgICA6OlRyYWNrUG9wdXBNZW51RXgoY29yZU1l
bnUtPnBsYXRmb3JtRGVzY3JpcHRpb24oKSwgZmxhZ3MsIHBvaW50LngsIHBvaW50LnksIG1fdmll
d1dpbmRvdywgMCk7CisgICAgICAgIDo6VHJhY2tQb3B1cE1lbnVFeChtZW51LCBmbGFncywgcG9p
bnQueCwgcG9pbnQueSwgbV92aWV3V2luZG93LCAwKTsKICAgICB9CiAKICAgICByZXR1cm4gdHJ1
ZTsKQEAgLTEzNTMsMTEgKzEzNTYsMTAgQEAgdm9pZCBXZWJWaWV3OjpwZXJmb3JtQ29udGV4dE1l
bnVBY3Rpb24oVwogICAgIENvbnRleHRNZW51KiBtZW51ID0gbV9wYWdlLT5jb250ZXh0TWVudUNv
bnRyb2xsZXIoKS0+Y29udGV4dE1lbnUoKTsKICAgICBBU1NFUlQobWVudSk7CiAKLSAgICBDb250
ZXh0TWVudUl0ZW0qIGl0ZW0gPSBieVBvc2l0aW9uID8gbWVudS0+aXRlbUF0SW5kZXgoKHVuc2ln
bmVkKXdQYXJhbSwgKEhNRU5VKWxQYXJhbSkgOiBtZW51LT5pdGVtV2l0aEFjdGlvbigoQ29udGV4
dE1lbnVBY3Rpb24pd1BhcmFtKTsKKyAgICBDb250ZXh0TWVudUl0ZW0qIGl0ZW0gPSBieVBvc2l0
aW9uID8gbWVudS0+aXRlbUF0SW5kZXgoKHVuc2lnbmVkKXdQYXJhbSkgOiBtZW51LT5pdGVtV2l0
aEFjdGlvbigoQ29udGV4dE1lbnVBY3Rpb24pd1BhcmFtKTsKICAgICBpZiAoIWl0ZW0pCiAgICAg
ICAgIHJldHVybjsKICAgICBtX3BhZ2UtPmNvbnRleHRNZW51Q29udHJvbGxlcigpLT5jb250ZXh0
TWVudUl0ZW1TZWxlY3RlZChpdGVtKTsKLSAgICBkZWxldGUgaXRlbTsKIH0KIAogYm9vbCBXZWJW
aWV3OjpoYW5kbGVNb3VzZUV2ZW50KFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFN
IGxQYXJhbSkKSW5kZXg6IFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVD
bGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ29u
dGV4dE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiA3MzMwNikKKysrIFdlYktpdC93aW4vV2ViQ29y
ZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NCw3
ICs1NCw3IEBAIHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51RGUKICAgICBk
ZWxldGUgdGhpczsKIH0KIAotSE1FTlUgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmdldEN1c3RvbU1l
bnVGcm9tRGVmYXVsdEl0ZW1zKENvbnRleHRNZW51KiBtZW51KQorUGxhdGZvcm1NZW51RGVzY3Jp
cHRpb24gV2ViQ29udGV4dE1lbnVDbGllbnQ6OmdldEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0ZW1z
KENvbnRleHRNZW51KiBtZW51KQogewogICAgIENPTVB0cjxJV2ViVUlEZWxlZ2F0ZT4gdWlEZWxl
Z2F0ZTsKICAgICBpZiAoRkFJTEVEKG1fd2ViVmlldy0+dWlEZWxlZ2F0ZSgmdWlEZWxlZ2F0ZSkp
KQpAQCAtNjYsOSArNjYsMTMgQEAgSE1FTlUgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmdldEN1c3Rv
bU1lbgogICAgIENPTVB0cjxXZWJFbGVtZW50UHJvcGVydHlCYWc+IHByb3BlcnR5QmFnOwogICAg
IHByb3BlcnR5QmFnLmFkb3B0UmVmKFdlYkVsZW1lbnRQcm9wZXJ0eUJhZzo6Y3JlYXRlSW5zdGFu
Y2UobWVudS0+aGl0VGVzdFJlc3VsdCgpKSk7CiAgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gZGVj
aWRlIHdoZXRoZXIgdG8gZG8gdGhlIGRlZmF1bHQgYmVmb3JlIGNhbGxpbmcgdGhpcyBkZWxlZ2F0
ZSBtZXRob2QKLSAgICBpZiAoRkFJTEVEKHVpRGVsZWdhdGUtPmNvbnRleHRNZW51SXRlbXNGb3JF
bGVtZW50KG1fd2ViVmlldywgcHJvcGVydHlCYWcuZ2V0KCksIChPTEVfSEFORExFKShVTE9ORzY0
KW1lbnUtPnBsYXRmb3JtRGVzY3JpcHRpb24oKSwgKE9MRV9IQU5ETEUqKSZuZXdNZW51KSkpCisg
ICAgSE1FTlUgd2luZG93c01lbnUgPSA6OkNyZWF0ZVBvcHVwTWVudSgpOyAgICAKKyAgICBDb250
ZXh0TWVudTo6bmF0aXZlTWVudShtZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCksIHdpbmRvd3NN
ZW51KTsKKyAgICBpZiAoRkFJTEVEKHVpRGVsZWdhdGUtPmNvbnRleHRNZW51SXRlbXNGb3JFbGVt
ZW50KG1fd2ViVmlldywgcHJvcGVydHlCYWcuZ2V0KCksIChPTEVfSEFORExFKShVTE9ORzY0KXdp
bmRvd3NNZW51LCAoT0xFX0hBTkRMRSopJm5ld01lbnUpKSkKICAgICAgICAgcmV0dXJuIG1lbnUt
PnBsYXRmb3JtRGVzY3JpcHRpb24oKTsKLSAgICByZXR1cm4gbmV3TWVudTsKKworICAgIENvbnRl
eHRNZW51IGRlbGVnYXRlTWVudShDb250ZXh0TWVudShtZW51LT5oaXRUZXN0UmVzdWx0KCksIG5l
d01lbnUpKTsKKyAgICByZXR1cm4gZGVsZWdhdGVNZW51LnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0
aW9uKCk7CiB9CiAKIHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51SXRlbVNl
bGVjdGVkKENvbnRleHRNZW51SXRlbSogaXRlbSwgY29uc3QgQ29udGV4dE1lbnUqIHBhcmVudE1l
bnUpCkBAIC04Myw4ICs4NywxMCBAQCB2b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50Ojpjb250ZXh0
TWVudUl0CiAKICAgICBDT01QdHI8V2ViRWxlbWVudFByb3BlcnR5QmFnPiBwcm9wZXJ0eUJhZzsK
ICAgICBwcm9wZXJ0eUJhZy5hZG9wdFJlZihXZWJFbGVtZW50UHJvcGVydHlCYWc6OmNyZWF0ZUlu
c3RhbmNlKHBhcmVudE1lbnUtPmhpdFRlc3RSZXN1bHQoKSkpOwotICAgICAgICAgICAgCi0gICAg
dWlEZWxlZ2F0ZS0+Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQobV93ZWJWaWV3LCBpdGVtLT5yZWxl
YXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpLCBwcm9wZXJ0eUJhZy5nZXQoKSk7CisgICAgCisgICAg
TUVOVUlURU1JTkZPIGl0ZW1JbmZvOworICAgIENvbnRleHRNZW51SXRlbTo6bmF0aXZlTWVudUl0
ZW0oaXRlbS0+cmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKSwgJml0ZW1JbmZvKTsKKyAgICB1
aURlbGVnYXRlLT5jb250ZXh0TWVudUl0ZW1TZWxlY3RlZChtX3dlYlZpZXcsICZpdGVtSW5mbywg
cHJvcGVydHlCYWcuZ2V0KCkpOwogfQogCiB2b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50Ojpkb3du
bG9hZFVSTChjb25zdCBLVVJMJiB1cmwpCkluZGV4OiBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0
L1dlYkNvbnRleHRNZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJDb3Jl
U3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oCShyZXZpc2lvbiA3MzE2OSkKKysrIFdlYktp
dC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5
KQpAQCAtMjQsNiArMjQsNyBAQAogICovCiAKICNpbmNsdWRlIDxXZWJDb3JlL0NvbnRleHRNZW51
Q2xpZW50Lmg+CisjaW5jbHVkZSA8V2ViQ29yZS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbi5oPgog
I2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CiAKIGNsYXNzIFdlYlZpZXc7CkBAIC0zNCw3ICszNSw3
IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudURlc3Ryb3llZCgpOwog
Ci0gICAgdmlydHVhbCBITUVOVSBnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcyhXZWJDb3Jl
OjpDb250ZXh0TWVudSopOworICAgIHZpcnR1YWwgV2ViQ29yZTo6UGxhdGZvcm1NZW51RGVzY3Jp
cHRpb24gZ2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMoV2ViQ29yZTo6Q29udGV4dE1lbnUq
KTsKICAgICB2aXJ0dWFsIHZvaWQgY29udGV4dE1lbnVJdGVtU2VsZWN0ZWQoV2ViQ29yZTo6Q29u
dGV4dE1lbnVJdGVtKiwgY29uc3QgV2ViQ29yZTo6Q29udGV4dE1lbnUqKTsKICAgICAKICAgICB2
aXJ0dWFsIHZvaWQgZG93bmxvYWRVUkwoY29uc3QgV2ViQ29yZTo6S1VSTCYpOwo=
</data>
<flag name="review"
          id="66432"
          type_id="1"
          status="-"
          setter="darin"
    />
    <flag name="commit-queue"
          id="66433"
          type_id="3"
          status="-"
          setter="bweinstein"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>75622</attachid>
            <date>2010-12-04 19:04:30 -0800</date>
            <delta_ts>2010-12-04 19:12:54 -0800</delta_ts>
            <desc>[PATCH] WebKit2 Win Context Menu Support</desc>
            <filename>context_menu_wk2.patch</filename>
            <type>text/plain</type>
            <size>7117</size>
            <attacher name="Brian Weinstein">bweinstein</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdDIvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdDIvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MzMzNikKKysrIFdlYktpdDIvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjggQEAKKzIwMTAtMTItMDQgIEJyaWFuIFdlaW5zdGVpbiAgPGJ3ZWluc3RlaW5A
YXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFdlYktpdDI6IENvbnRleHQgbWVudSBzdXBwb3J0IG9uIFdpbmRvd3MKKyAgICAgICAgPGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01MDUxND4KKyAgICAgICAgCisg
ICAgICAgIEltcGxtZW50IHNob3dpbmcgb2YgdGhlIGNvbnRleHQgbWVudSBvbiBXaW5kb3dzIGZv
ciBXZWJLaXQyLCBhbmQgY2FsbGluZyB0aHJvdWdoIHRvCisgICAgICAgIFdlYlBhZ2VQcm94eTo6
Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQuCisKKyAgICAgICAgKiBVSVByb2Nlc3Mvd2luL1dlYkNv
bnRleHRNZW51UHJveHlXaW4uY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJDb250ZXh0TWVudVBy
b3h5V2luOjpXZWJDb250ZXh0TWVudVByb3h5V2luKTogSW5pdGlhbGl6ZSB0aGUgbWVtYmVyIHZh
cmlhYmxlcy4KKyAgICAgICAgKFdlYktpdDo6V2ViQ29udGV4dE1lbnVQcm94eVdpbjo6cG9wdWxh
dGVNZW51KTogSXRlcmF0ZSBvdmVyIHRoZSB2ZWN0b3Igb2YgV2ViQ29udGV4dE1lbnVJdGVtRGF0
YQorICAgICAgICAgICAgdGhhdCB3YXMgcGFzc2VkIGluLCBhZGRpbmcgdGhlIG1lbnUgaXRlbXMg
YW5kIHJlY3Vyc2l2ZWx5IGNhbGxpbmcgYmFjayBpbnRvIHRoaXMgZnVuY3Rpb24gdG8gcG9wdWxh
dGUKKyAgICAgICAgICAgIGFueSBzdWJtZW51cyB0aGF0IGFyZSBuZWVkZWQuIFRoaXMgZnVuY3Rp
b24gYWxzbyBzZXRzIHVwIHRoZSBtYXAgZnJvbSBhY3Rpb24gaWRlbnRpZmllcnNzIHRvIFdlYkNv
bnRleHRNZW51SXRlbURhdGEsCisgICAgICAgICAgICB0byB1c2UgdG8gZmluZCB0aGUgV2ViQ29u
dGV4dE1lbnVJdGVtRGF0YSBmcm9tIGEgc2VsZWN0ZWQgbWVudSBpdGVtLgorICAgICAgICAoV2Vi
S2l0OjpXZWJDb250ZXh0TWVudVByb3h5V2luOjpzaG93Q29udGV4dE1lbnUpOiBEZXN0cm95IGFu
eSBtZW51IHdlIGhhdmUgYWxyZWFkeSBjcmVhdGVkLCBwb3B1bGF0ZSB0aGUgbWVudQorICAgICAg
ICAgICAgdG8gc2hvdywgYW5kIHNob3cgdGhlIGNvbnRleHQgbWVudS4gT25jZSBUcmFja1BvcHVw
TWVudUV4IHJldHVybnMsIGl0IHJldHVybnMgaWRlbnRpZmllciBvZiB0aGUgc2VsZWN0ZWQgbWVu
dSBpdGVtLgorICAgICAgICAgICAgTG9vayB1cCB0aGF0IGlkZW50aWZpZXIgaW4gdGhlIG1hcCB3
ZSBjcmVhdGVkLCBhbmQgdGVsbCB0aGUgV2ViUGFnZVByb3h5IHRoYXQgYSBjb250ZXh0IG1lbnUg
aXRlbSB3YXMgc2VsZWN0ZWQuCisgICAgICAgIChXZWJLaXQ6OldlYkNvbnRleHRNZW51UHJveHlX
aW46OmhpZGVDb250ZXh0TWVudSk6IERlc3Ryb3kgdGhlIEhNRU5VIGlmIGl0IGlzIG5vbi1udWxs
LCBhbmQgY2xlYXIgdGhlIGlkZW50aWZpZXIgbWFwLiAKKyAgICAgICAgKiBVSVByb2Nlc3Mvd2lu
L1dlYkNvbnRleHRNZW51UHJveHlXaW4uaDoKKyAgICAgICAgKFdlYktpdDo6V2ViQ29udGV4dE1l
bnVQcm94eVdpbjo6Y3JlYXRlKTogQ2FsbCB0aHJvdWdoIHRvIHRoZSBjb25zdHJ1Y3RvciwgYW5k
IGNoYW5nZSB0aGUgYXJndW1lbnRzIHRoYXQgaXQgdGFrZXMuCisgICAgICAgICogVUlQcm9jZXNz
L3dpbi9XZWJWaWV3LmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViVmlldzo6Y3JlYXRlQ29udGV4
dE1lbnVQcm94eSk6IENhbGwgd2l0aCB0aGUgY29ycmVjdCBhcmd1bWVudHMuCisKIDIwMTAtMTIt
MDQgIFNhbSBXZWluaWcgIDxzYW1Ad2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBK
b24gSG9uZXljdXR0LgpJbmRleDogV2ViS2l0Mi9VSVByb2Nlc3Mvd2luL1dlYkNvbnRleHRNZW51
UHJveHlXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdDIvVUlQcm9jZXNzL3dpbi9XZWJDb250
ZXh0TWVudVByb3h5V2luLmNwcAkocmV2aXNpb24gNzMxNjkpCisrKyBXZWJLaXQyL1VJUHJvY2Vz
cy93aW4vV2ViQ29udGV4dE1lbnVQcm94eVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDIz
ICszMSw3MyBAQCB1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKIAogbmFtZXNwYWNlIFdlYktpdCB7
CiAKLWlubGluZSBXZWJDb250ZXh0TWVudVByb3h5V2luOjpXZWJDb250ZXh0TWVudVByb3h5V2lu
KCkKK1dlYkNvbnRleHRNZW51UHJveHlXaW46OldlYkNvbnRleHRNZW51UHJveHlXaW4oSFdORCBw
YXJlbnRXaW5kb3csIFdlYlBhZ2VQcm94eSogcGFnZSkKKyAgICA6IG1fd2luZG93KHBhcmVudFdp
bmRvdykKKyAgICAsIG1fcGFnZShwYWdlKQorICAgICwgbV9tZW51KDApCiB7CiB9CiAKLVBhc3NS
ZWZQdHI8V2ViQ29udGV4dE1lbnVQcm94eVdpbj4gV2ViQ29udGV4dE1lbnVQcm94eVdpbjo6Y3Jl
YXRlKCkKK3ZvaWQgV2ViQ29udGV4dE1lbnVQcm94eVdpbjo6cG9wdWxhdGVNZW51KEhNRU5VIG1l
bnUsIGNvbnN0IFZlY3RvcjxXZWJDb250ZXh0TWVudUl0ZW1EYXRhPiYgaXRlbXMpCiB7Ci0gICAg
cmV0dXJuIGFkb3B0UmVmKG5ldyBXZWJDb250ZXh0TWVudVByb3h5V2luKTsKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgV2ViQ29udGV4
dE1lbnVJdGVtRGF0YSBpdGVtRGF0YSA9IGl0ZW1zW2ldOworICAgICAgICBzd2l0Y2ggKGl0ZW1E
YXRhLnR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBBY3Rpb25UeXBlOgorICAgICAgICAgICAg
Y2FzZSBDaGVja2FibGVBY3Rpb25UeXBlOiB7CisgICAgICAgICAgICAgICAgVUlOVCBmbGFncyA9
IDA7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gaXRlbURhdGEuZW5hYmxlZCgpID8gTUZfRU5B
QkxFRCA6IE1GX0RJU0FCTEVEOworICAgICAgICAgICAgICAgIGlmIChpdGVtRGF0YS5jaGVja2Vk
KCkpCisgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IE1GX0NIRUNLRUQ7CisgICAgICAgICAg
ICAgICAgV1RGOjpTdHJpbmcgdGl0bGUgPSBpdGVtRGF0YS50aXRsZSgpOworICAgICAgICAgICAg
ICAgIDo6QXBwZW5kTWVudShtZW51LCBmbGFncywgaXRlbURhdGEuYWN0aW9uKCksIHRpdGxlLmNo
YXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOworCisgICAgICAgICAgICAgICAgbV9hY3Rp
b25NYXAuYWRkKGl0ZW1EYXRhLmFjdGlvbigpLCBpdGVtRGF0YSk7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNlcGFyYXRvclR5cGU6Cisg
ICAgICAgICAgICAgICAgOjpBcHBlbmRNZW51KG1lbnUsIE1GX1NFUEFSQVRPUiwgMCwgMCk7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFN1Ym1lbnVUeXBlOiB7Cisg
ICAgICAgICAgICAgICAgSE1FTlUgc3ViTWVudSA9IDo6Q3JlYXRlUG9wdXBNZW51KCk7CisgICAg
ICAgICAgICAgICAgcG9wdWxhdGVNZW51KHN1Yk1lbnUsIGl0ZW1EYXRhLnN1Ym1lbnUoKSk7Cisg
ICAgICAgICAgICAgICAgV1RGOjpTdHJpbmcgdGl0bGUgPSBpdGVtRGF0YS50aXRsZSgpOworICAg
ICAgICAgICAgICAgIDo6QXBwZW5kTWVudShtZW51LCBNRl9QT1BVUCwgKFVJTlQpIHN1Yk1lbnUs
IHRpdGxlLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOworICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAotdm9pZCBX
ZWJDb250ZXh0TWVudVByb3h5V2luOjpzaG93Q29udGV4dE1lbnUoY29uc3QgSW50UG9pbnQmLCBj
b25zdCBWZWN0b3I8V2ViQ29udGV4dE1lbnVJdGVtRGF0YT4mKQordm9pZCBXZWJDb250ZXh0TWVu
dVByb3h5V2luOjpzaG93Q29udGV4dE1lbnUoY29uc3QgSW50UG9pbnQmIG9yaWdpbiwgY29uc3Qg
VmVjdG9yPFdlYkNvbnRleHRNZW51SXRlbURhdGE+JiBpdGVtcykKIHsKLSAgICBub3RJbXBsZW1l
bnRlZCgpOworICAgIC8vIEhpZGUgYW55IGNvbnRleHQgbWVudSB3ZSBoYXZlIHNob3dpbmcgKHRo
aXMgYWxzbyBkZXN0cm95cyB0aGUgbWVudSkuCisgICAgaGlkZUNvbnRleHRNZW51KCk7CisKKyAg
ICBtX21lbnUgPSA6OkNyZWF0ZVBvcHVwTWVudSgpOworICAgIHBvcHVsYXRlTWVudShtX21lbnUs
IGl0ZW1zKTsKKworICAgIFBPSU5UIHBvaW50ID0gUE9JTlQob3JpZ2luKTsKKyAgICBpZiAoITo6
Q2xpZW50VG9TY3JlZW4obV93aW5kb3csICZwb2ludCkpCisgICAgICAgIHJldHVybjsKKworICAg
IFVJTlQgZmxhZ3MgPSBUUE1fUklHSFRCVVRUT04gfCBUUE1fVE9QQUxJR04gfCBUUE1fVkVSUE9T
QU5JTUFUSU9OIHwgVFBNX0hPUklaT05UQUwKKyAgICAgICAgICAgIHwgVFBNX0xFRlRBTElHTiB8
IFRQTV9IT1JQT1NBTklNQVRJT04gfCBUUE1fUkVUVVJOQ01EIHwgVFBNX05PTk9USUZZOworICAg
IGludCBzZWxlY3RlZENvbW1hbmQgPSA6OlRyYWNrUG9wdXBNZW51RXgobV9tZW51LCBmbGFncywg
cG9pbnQueCwgcG9pbnQueSwgbV93aW5kb3csIDApOworICAgIGlmICghc2VsZWN0ZWRDb21tYW5k
KQorICAgICAgICByZXR1cm47CisKKyAgICBtX3BhZ2UtPmNvbnRleHRNZW51SXRlbVNlbGVjdGVk
KG1fYWN0aW9uTWFwLmdldChzZWxlY3RlZENvbW1hbmQpKTsKIH0KIAogdm9pZCBXZWJDb250ZXh0
TWVudVByb3h5V2luOjpoaWRlQ29udGV4dE1lbnUoKQogewotICAgIG5vdEltcGxlbWVudGVkKCk7
CisgICAgaWYgKG1fbWVudSkKKyAgICAgICAgOjpEZXN0cm95TWVudShtX21lbnUpOworCisgICAg
bV9hY3Rpb25NYXAuY2xlYXIoKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViS2l0CkluZGV4OiBX
ZWJLaXQyL1VJUHJvY2Vzcy93aW4vV2ViQ29udGV4dE1lbnVQcm94eVdpbi5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYktpdDIvVUlQcm9jZXNzL3dpbi9XZWJDb250ZXh0TWVudVByb3h5V2luLmgJKHJldmlz
aW9uIDczMTY5KQorKysgV2ViS2l0Mi9VSVByb2Nlc3Mvd2luL1dlYkNvbnRleHRNZW51UHJveHlX
aW4uaAkod29ya2luZyBjb3B5KQpAQCAtMjYsMTkgKzI2LDM0IEBACiAjaWZuZGVmIFdlYkNvbnRl
eHRNZW51UHJveHlXaW5faAogI2RlZmluZSBXZWJDb250ZXh0TWVudVByb3h5V2luX2gKIAorI2lu
Y2x1ZGUgIldlYkNvbnRleHRNZW51SXRlbURhdGEuaCIKICNpbmNsdWRlICJXZWJDb250ZXh0TWVu
dVByb3h5LmgiCisjaW5jbHVkZSAiV2ViUGFnZVByb3h5LmgiCisjaW5jbHVkZSA8d3RmL0hhc2hN
YXAuaD4KIAogbmFtZXNwYWNlIFdlYktpdCB7CiAKIGNsYXNzIFdlYkNvbnRleHRNZW51UHJveHlX
aW4gOiBwdWJsaWMgV2ViQ29udGV4dE1lbnVQcm94eSB7CiBwdWJsaWM6Ci0gICAgc3RhdGljIFBh
c3NSZWZQdHI8V2ViQ29udGV4dE1lbnVQcm94eVdpbj4gY3JlYXRlKCk7CisgICAgc3RhdGljIFBh
c3NSZWZQdHI8V2ViQ29udGV4dE1lbnVQcm94eVdpbj4gY3JlYXRlKEhXTkQgcGFyZW50V2luZG93
LCBXZWJQYWdlUHJveHkqIHBhZ2UpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3
IFdlYkNvbnRleHRNZW51UHJveHlXaW4ocGFyZW50V2luZG93LCBwYWdlKSk7CisgICAgfQogCiBw
cml2YXRlOgotICAgIFdlYkNvbnRleHRNZW51UHJveHlXaW4oKTsKKyAgICBXZWJDb250ZXh0TWVu
dVByb3h5V2luKEhXTkQgcGFyZW50V2luZG93LCBXZWJQYWdlUHJveHkqIHBhZ2UpOwogCiAgICAg
dmlydHVhbCB2b2lkIHNob3dDb250ZXh0TWVudShjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYsIGNv
bnN0IFZlY3RvcjxXZWJDb250ZXh0TWVudUl0ZW1EYXRhPiYpOwogICAgIHZpcnR1YWwgdm9pZCBo
aWRlQ29udGV4dE1lbnUoKTsKKworICAgIHZvaWQgcG9wdWxhdGVNZW51KEhNRU5VLCBjb25zdCBW
ZWN0b3I8V2ViQ29udGV4dE1lbnVJdGVtRGF0YT4mKTsKKworICAgIEhNRU5VIG1fbWVudTsKKyAg
ICBIV05EIG1fd2luZG93OworICAgIFdlYlBhZ2VQcm94eSogbV9wYWdlOworCisgICAgLy8gQ3Jl
YXRlcyBhIG1hcCBmcm9tIHRoZSBjb250ZXh0IG1lbnUgaXRlbSdzIGFjdGlvbiB0byB0aGUgY29u
dGV4dCBtZW51IGl0ZW0gaXRzZWxmLgorICAgIEhhc2hNYXA8aW50LCBXZWJDb250ZXh0TWVudUl0
ZW1EYXRhPiBtX2FjdGlvbk1hcDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYktpdApJbmRleDog
V2ViS2l0Mi9VSVByb2Nlc3Mvd2luL1dlYlZpZXcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdDIv
VUlQcm9jZXNzL3dpbi9XZWJWaWV3LmNwcAkocmV2aXNpb24gNzMxNjkpCisrKyBXZWJLaXQyL1VJ
UHJvY2Vzcy93aW4vV2ViVmlldy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYzMiw5ICs2MzIsOSBA
QCBQYXNzUmVmUHRyPFdlYlBvcHVwTWVudVByb3h5PiBXZWJWaWV3OjpjCiAgICAgcmV0dXJuIFdl
YlBvcHVwTWVudVByb3h5V2luOjpjcmVhdGUodGhpcyk7CiB9CiAKLVBhc3NSZWZQdHI8V2ViQ29u
dGV4dE1lbnVQcm94eT4gV2ViVmlldzo6Y3JlYXRlQ29udGV4dE1lbnVQcm94eShXZWJQYWdlUHJv
eHkqKQorUGFzc1JlZlB0cjxXZWJDb250ZXh0TWVudVByb3h5PiBXZWJWaWV3OjpjcmVhdGVDb250
ZXh0TWVudVByb3h5KFdlYlBhZ2VQcm94eSogcGFnZSkKIHsKLSAgICByZXR1cm4gV2ViQ29udGV4
dE1lbnVQcm94eVdpbjo6Y3JlYXRlKCk7CisgICAgcmV0dXJuIFdlYkNvbnRleHRNZW51UHJveHlX
aW46OmNyZWF0ZShtX3dpbmRvdywgcGFnZSk7CiB9CiAKIHZvaWQgV2ViVmlldzo6c2V0RmluZElu
ZGljYXRvcihQYXNzUmVmUHRyPEZpbmRJbmRpY2F0b3I+LCBib29sIGZhZGVPdXQpCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>75623</attachid>
            <date>2010-12-04 19:09:21 -0800</date>
            <delta_ts>2010-12-06 10:01:25 -0800</delta_ts>
            <desc>[PATCH] WebKit2 Win Context Menu Support w/ Style Fixes</desc>
            <filename>context_menu_wk2.patch</filename>
            <type>text/plain</type>
            <size>0</size>
            <attacher name="Brian Weinstein">bweinstein</attacher>
            
              <data encoding="base64"></data>
<flag name="review"
          id="66455"
          type_id="1"
          status="+"
          setter="darin"
    />
    <flag name="commit-queue"
          id="66456"
          type_id="3"
          status="-"
          setter="bweinstein"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>75950</attachid>
            <date>2010-12-08 12:57:08 -0800</date>
            <delta_ts>2010-12-08 13:05:49 -0800</delta_ts>
            <desc>[PATCH] Context Menu Refactoring</desc>
            <filename>context_menu_refactoring_win.patch</filename>
            <type>text/plain</type>
            <size>32696</size>
            <attacher name="Brian Weinstein">bweinstein</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MzUzNikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjggQEAKKzIwMTAtMTItMDggIEJyaWFuIFdlaW5zdGVpbiAgPGJ3ZWluc3RlaW5A
YXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFByZXAgd29yayBmb3IgV2ViS2l0MjogQ29udGV4dCBtZW51IHN1cHBvcnQgb24gV2luZG93
cworICAgICAgICA8aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUwNTE0
PgorICAgICAgICAKKyAgICAgICAgUmVmYWN0b3IgQ29udGV4dE1lbnUgdG8gYmUgYmFja2VkIGJ5
IGEgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gaW5zdGVhZCBvZiBhbiBITUVOVSwgCisgICAgICAg
IGFuZCByZWZhY3RvciBDb250ZXh0TWVudUl0ZW0gdG8gYmUgYmFja2VkIGJ5IGEgc3RydWN0IGNv
bnRhaW5pbmcgdGhlIGluZm9ybWF0aW9uIHRoYXQKKyAgICAgICAgaXMgbmVlZGVkIGluIGEgQ29u
dGV4dE1lbnVJdGVtIChhY3Rpb24sIHR5cGUsIHRpdGxlLCBzdWJtZW51IGl0ZW1zIChpbiBhIFZl
Y3RvcjxDb250ZXh0TWVudUl0ZW0+KSwKKyAgICAgICAgYW5kIHdoZXRoZXIgb3Igbm90IGl0IGlz
IGVuYWJsZWQgb3IgY2hlY2tlZC4KKyAgICAgICAgCisgICAgICAgIFRoaXMgaXMgbmVjZXNzYXJ5
IHNvIENvbnRleHRNZW51cyBhbmQgQ29udGV4dE1lbnVJdGVtcyBjYW4gYmUgY29waWVkLCB3aGlj
aCBITUVOVXMgYW5kIE1FTlVJVEVNSU5GT3MKKyAgICAgICAgY291bGRuJ3QgYmUuCisKKyAgICAg
ICAgUmVmYWN0b3JpbmcsIG5vIG5ldyB0ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL0NvbnRl
eHRNZW51Lmg6IEFkZCBzb21lIFdpbmRvd3Mtc3BlY2lmaWMgZnVuY3Rpb25zOiBBIENvbnRleHRN
ZW51IGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYW4gSE1FTlUsCisgICAgICAgICAgICBhIHN0YXRp
YyBmdW5jdGlvbiB0aGF0IHBvcHVsYXRlcyBhbiBITUVOVSBmcm9tIGEgVmVjdG9yIG9mIENvbnRl
eHRNZW51SXRlbXMsIGFuZCBhZGQgYSBuZXcgaW5zdGFuY2UgdmFyaWFibGUKKyAgICAgICAgICAg
IHRoYXQgaXMgYSBsaXN0IG9mIENvbnRleHRNZW51SXRlbXMuCisgICAgICAgICogcGxhdGZvcm0v
Q29udGV4dE1lbnVJdGVtLmg6IEFkZCBzb21lIFdpbmRvd3Mtc3BlY2lmaWMgZnVuY3Rpb25zOiBB
IENvbnRleHRNZW51SXRlbSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgTUVOVUlURU1JTkZPLAor
ICAgICAgICAgICAgYSBzdGF0aWMgZnVuY3Rpb24gdGhhdCBwb3B1bGF0ZXMgYSBNRU5VSVRFTUlO
Rk8gZnJvbSBhIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uLCBhbmQgY2hhbmdlIHRoZSBQbGF0Zm9y
bU1lbnVJdGVtRGVzY3JpcHRpb24KKyAgICAgICAgICAgIHRvIGJlIGEgc3RydWN0IGluc3RlYWQg
b2YgYW4gTFBNRU5VSVRFTUlORk8uCisgICAgICAgIChXZWJDb3JlOjpQbGF0Zm9ybU1lbnVJdGVt
RGVzY3JpcHRpb246OlBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbik6IFVwZGF0ZSB0aGUgdHlw
ZSBmb3IgV2luZG93cy4KKyAgICAgICAgKiBwbGF0Zm9ybS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlv
bi5oOgorCisgICAgICAgICogcGxhdGZvcm0vd2luL0NvbnRleHRNZW51SXRlbVdpbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbSk6IEFkZCBh
IG5ldyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGFuIExQTUVOVUlURU1JTkZPLCAKKyAgICAgICAg
ICAgIGFuZCByZWZhY3RvciB0aGUgb3RoZXIgY29uc3RydWN0b3JzIHRvIHBvcHVsYXRlIHRoZSBu
ZXcgZm9ybSBvZiB0aGUgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uLgorICAgICAgICAoV2Vi
Q29yZTo6Q29udGV4dE1lbnVJdGVtOjp+Q29udGV4dE1lbnVJdGVtKTogRG9uJ3QgbmVlZCB0byBk
byBhbnl0aGluZyBpbiB0aGUgZGVzdHJ1Y3RvciBhbnltb3JlLgorICAgICAgICAoV2ViQ29yZTo6
Q29udGV4dE1lbnVJdGVtOjpyZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbik6IFRoZXJlJ3Mgbm90
aGluZyB0byByZWxlYXNlLCBzbyBqdXN0IHJldHVybiB0aGUKKyAgICAgICAgICAgIHBsYXRmb3Jt
IGRlc2NyaXB0aW9uLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRUeXBl
KTogU2ltcGxlIHNldHRlciBvZiB0aGUgbWF0Y2hpbmcgdHlwZSBpbiB0aGUgc3RydWN0LgorICAg
ICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRBY3Rpb24pOiBEaXR0by4KKyAgICAg
ICAgKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6c2V0VGl0bGUpOiBEaXR0by4KKyAgICAgICAg
KFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6c2V0Q2hlY2tlZCk6IERpdHRvLgorICAgICAgICAo
V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRFbmFibGVkKTogRGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnR5cGUpOiBTaW1wbGUgZ2V0dGVyIG9mIHRoZSBtYXRj
aGluZyB0eXBlIGluIHRoZSBzdHJ1Y3QuCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0
ZW06OmFjdGlvbik6RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnRp
dGxlKTogRGl0dG8uICAKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6Y2hlY2tl
ZCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjplbmFibGVkKTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnBsYXRmb3JtU3ViTWVu
dSk6IFJldHVybiB0aGUgbWVudSdzIHN1Ym1lbnUgaXRlbXMuCisgICAgICAgIChXZWJDb3JlOjpD
b250ZXh0TWVudUl0ZW06OnNldFN1Yk1lbnUpOiBTZXQgdGhlIHN1Ym1lbnUgaWYgd2Ugd2VyZSBw
YXNzZWQgaW4gYSBzdWJtZW51LCBpZiBub3QsIAorICAgICAgICAgICAgY2xlYXIgaXQuIFRoaXMg
ZnVuY3Rpb24gYWxzbyB1cGRhdGVzIHRoZSB0eXBlIGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IHdl
IHdlcmUgcGFzc2VkIGluIGEgc3VibWVudS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51
SXRlbTo6bmF0aXZlTWVudUl0ZW0pOiBQb3B1bGF0ZXMgYSBuYXRpdmUgbWVudSBpdGVtIChhbiBM
UE1FTlVJVEVNSU5GTykgYmFzZWQgb24gdGhlCisgICAgICAgICAgICBQbGF0Zm9ybU1lbnVJdGVt
RGVzY3JpcHRpb24gdGhhdCB3YXMgcGFzc2VkIGluLgorCisgICAgICAgICogcGxhdGZvcm0vd2lu
L0NvbnRleHRNZW51V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjpDb250
ZXh0TWVudSk6IEFkZCBhIG5ldyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGFuIEhNRU5VLCBhbmQg
cmVmYWN0b3IgdGhlIG90aGVycyB0byAKKyAgICAgICAgICAgIHNldCB1cCBtX2l0ZW1zIGluc3Rl
YWQgb2YgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1l
bnU6On5Db250ZXh0TWVudSk6IERvbnQndCBuZWVkIHRvIGRvIGFueXRoaW5nIGluIHRoZSBjb25z
dHJ1Y3RvciBhbnltb3JlLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6Oml0ZW1Db3Vu
dCk6IFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9yLgorICAgICAgICAoV2ViQ29yZTo6Q29u
dGV4dE1lbnU6Omluc2VydEl0ZW0pOiBJbnNlcnQgdGhlIGl0ZW0gaW50byB0aGUgdmVjdG9yLgor
ICAgICAgICAoV2ViQ29yZTo6aXRlbVdpdGhBY3Rpb25Jbk1lbnUpOiBSZWN1cnNpdmVseSBzZWFy
Y2hlcyBtZW51cyBmb3IgYSBtZW51IGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gYWN0aW9uIChkaXZlcyBp
bnRvIHN1Ym1lbnVzKS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjppdGVtV2l0aEFj
dGlvbik6IENhbGxzIHRocm91Z2ggdG8gaXRlbVdpdGhBY3Rpb25Jbk1lbnUuCisgICAgICAgIChX
ZWJDb3JlOjpDb250ZXh0TWVudTo6aXRlbUF0SW5kZXgpOiBHZXRzIHRoZSBpdGVtIGluIHRoZSB2
ZWN0b3Igd2l0aCB0aGUgcGFzc2VkIGluIGluZGV4LgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4
dE1lbnU6OnNldFBsYXRmb3JtRGVzY3JpcHRpb24pOiBDbGVhcnMgdGhlIGl0ZW1zIHZlY3RvciBh
bmQgcmUtcG9wdWxhdGVzIGl0IGZyb20gdGhlIHZlY3RvciB0aGF0IHdhcyBwYXNzZWQgaW4uIAor
ICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6OnBsYXRmb3JtRGVzY3JpcHRpb24pOiBDcmVh
dGVzIGEgbmV3IHZlY3RvciwgcG9wdWxhdGVzIGl0IGZyb20gdGhlIG1faXRlbXMgdmVjdG9yLCBh
bmQgcmV0dXJucyBpdC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjpyZWxlYXNlUGxh
dGZvcm1EZXNjcmlwdGlvbik6IENyZWF0ZXMgYSBuZXcgdmVjdG9yLCBwb3B1bGF0ZXMgaXQgZnJv
bSB0aGUgbV9pdGVtcyB2ZWN0b3IsIGFuZCBjbGVhcnMgbV9pdGVtcworICAgICAgICAgICAgYW5k
IHJldHVybnMgdGhlIG5ld2x5IGNyZWF0ZWQgdmVjdG9yLgorICAgICAgICAoV2ViQ29yZTo6Q29u
dGV4dE1lbnU6Om5hdGl2ZU1lbnUpOiBQb3B1bGF0ZXMgYSBuYXRpdmUgbWVudSAoYW4gSE1FTlUp
IGJhc2VkIG9uIHRoZSBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiB0aGF0IHdhcyBwYXNzZWQgaW4u
CisgICAgICAgIChXZWJDb3JlOjpjb250ZXh0TWVudUl0ZW1WZWN0b3IpOiBDcmVhdGVzIGEgdmVj
dG9yIG9mIENvbnRleHRNZW51SXRlbXMsIHBvcHVsYXRlIGl0IHdpdGggd2hhdCB3YXMgcGFzc2Vk
IGluIHRoZSB2ZWN0b3IuIAorICAgICAgICAoV2ViQ29yZTo6cGxhdGZvcm1NZW51RGVzY3JpcHRp
b24pOiBDcmVhdGVzIGEgbmV3IHZlY3RvciBvZiBDb250ZXh0TWVudUl0ZW1zLCBwb3B1bGF0ZSBp
dCB3aXRoIHdoYXQgd2FzIGluIHRoZSBwYXNzZWQgaW4gdGhlIHZlY3Rvci4KKwogMjAxMC0xMi0w
NyAgQnJpYW4gV2VpbnN0ZWluICA8YndlaW5zdGVpbkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgSm9obiBTdWxsaXZhbi4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1l
bnUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51LmgJKHJldmlz
aW9uIDczNTM2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudS5oCSh3b3JraW5nIGNv
cHkpCkBAIC00OSwxMiArNDksMTYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIHB1YmxpYzoK
ICAgICAgICAgQ29udGV4dE1lbnUoKTsKICAgICAgICAgQ29udGV4dE1lbnUoY29uc3QgUGxhdGZv
cm1NZW51RGVzY3JpcHRpb24pOworI2lmIFBMQVRGT1JNKFdJTikKKyAgICAgICAgQ29udGV4dE1l
bnUoSE1FTlUpOworI2VuZGlmCiAgICAgICAgIH5Db250ZXh0TWVudSgpOwogCiAgICAgICAgIHZv
aWQgaW5zZXJ0SXRlbSh1bnNpZ25lZCBwb3NpdGlvbiwgQ29udGV4dE1lbnVJdGVtJik7CiAgICAg
ICAgIHZvaWQgYXBwZW5kSXRlbShDb250ZXh0TWVudUl0ZW0mKTsKICAgICAgICAgCiAgICAgICAg
IENvbnRleHRNZW51SXRlbSogaXRlbVdpdGhBY3Rpb24odW5zaWduZWQpOworICAgICAgICBDb250
ZXh0TWVudUl0ZW0qIGl0ZW1BdEluZGV4KHVuc2lnbmVkKTsKICAgICAgICAgQ29udGV4dE1lbnVJ
dGVtKiBpdGVtQXRJbmRleCh1bnNpZ25lZCwgY29uc3QgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24p
OwogCiAgICAgICAgIHVuc2lnbmVkIGl0ZW1Db3VudCgpIGNvbnN0OwpAQCAtNjYsNiArNzAsOSBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAjaWYgUExBVEZPUk0oV1gpCiAgICAgICAgIHN0YXRpYyBD
b250ZXh0TWVudUl0ZW0qIGl0ZW1XaXRoSWQoaW50KTsKICNlbmRpZgorI2lmIFBMQVRGT1JNKFdJ
TikKKyAgICAgICAgc3RhdGljIHZvaWQgbmF0aXZlTWVudShQbGF0Zm9ybU1lbnVEZXNjcmlwdGlv
biwgSE1FTlUpOworI2VuZGlmCiAgICAgcHJpdmF0ZToKICNpZiBQTEFURk9STShNQUMpCiAgICAg
ICAgIC8vIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggdGhlIFBsYXRmb3JtTWVudURlc2NyaXB0aW9u
IHR5cGVkZWYKQEAgLTc0LDYgKzgxLDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBR
TGlzdDxDb250ZXh0TWVudUl0ZW0+IG1faXRlbXM7CiAjZWxpZiBQTEFURk9STShDSFJPTUlVTSkK
ICAgICAgICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gbV9pdGVtczsKKyNlbGlmIFBMQVRGT1JN
KFdJTikKKyAgICAgICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gbV9pdGVtczsKICNlbGlmIFBM
QVRGT1JNKEVGTCkKICAgICAgICAgQ29udGV4dE1lbnVDbGllbnRFZmwqIG1fY29udGV4dE1lbnVD
bGllbnQ7CiAgICAgICAgIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIG1fcGxhdGZvcm1EZXNjcmlw
dGlvbjsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnVJdGVtLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudUl0ZW0uaAkocmV2aXNpb24gNzM1MzYp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51SXRlbS5oCSh3b3JraW5nIGNvcHkpCkBA
IC0xNjcsNyArMTY3LDIwIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICNpZiBQTEFURk9STShNQUMp
CiAgICAgdHlwZWRlZiBOU01lbnVJdGVtKiBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb247CiAj
ZWxpZiBQTEFURk9STShXSU4pCi0gICAgdHlwZWRlZiBMUE1FTlVJVEVNSU5GTyBQbGF0Zm9ybU1l
bnVJdGVtRGVzY3JpcHRpb247CisgICAgc3RydWN0IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlv
biB7CisgICAgICAgIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbigpCisgICAgICAgICAgICA6
IHR5cGUoQWN0aW9uVHlwZSkKKyAgICAgICAgICAgICwgYWN0aW9uKENvbnRleHRNZW51SXRlbVRh
Z05vQWN0aW9uKQorICAgICAgICAgICAgLCB0aXRsZSgiIikKKyAgICAgICAgICAgICwgY2hlY2tl
ZChmYWxzZSkKKyAgICAgICAgICAgICwgZW5hYmxlZCh0cnVlKSB7IH0KKyAgICAgICAgQ29udGV4
dE1lbnVJdGVtVHlwZSB0eXBlOworICAgICAgICBDb250ZXh0TWVudUFjdGlvbiBhY3Rpb247Cisg
ICAgICAgIFN0cmluZyB0aXRsZTsKKyAgICAgICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gc3Vi
TWVudUl0ZW1zOworICAgICAgICBib29sIGNoZWNrZWQ7CisgICAgICAgIGJvb2wgZW5hYmxlZDsK
KyAgICB9OwogI2VsaWYgUExBVEZPUk0oUVQpCiAgICAgc3RydWN0IFBsYXRmb3JtTWVudUl0ZW1E
ZXNjcmlwdGlvbiB7CiAgICAgICAgIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbigpCkBAIC0y
NjMsNiArMjc2LDkgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogI2lmIFBMQVRGT1JNKEdUSykKICAg
ICAgICAgQ29udGV4dE1lbnVJdGVtKEd0a01lbnVJdGVtKik7CiAjZW5kaWYKKyNpZiBQTEFURk9S
TShXSU4pCisgICAgICAgIENvbnRleHRNZW51SXRlbShjb25zdCBMUE1FTlVJVEVNSU5GTyk7Cisj
ZW5kaWYKICAgICAgICAgfkNvbnRleHRNZW51SXRlbSgpOwogCiAgICAgICAgIFBsYXRmb3JtTWVu
dUl0ZW1EZXNjcmlwdGlvbiByZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOwpAQCAtMjkwLDYg
KzMwNiw5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICNpZiBQTEFURk9STShHVEspCiAgICAgICAg
IHN0YXRpYyBHdGtNZW51SXRlbSogY3JlYXRlTmF0aXZlTWVudUl0ZW0oY29uc3QgUGxhdGZvcm1N
ZW51SXRlbURlc2NyaXB0aW9uJik7CiAjZW5kaWYKKyNpZiBQTEFURk9STShXSU4pCisgICAgICAg
IHN0YXRpYyB2b2lkIG5hdGl2ZU1lbnVJdGVtKGNvbnN0IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlw
dGlvbiYsIExQTUVOVUlURU1JTkZPKTsKKyNlbmRpZgogCiAgICAgcHJpdmF0ZToKICNpZiBQTEFU
Rk9STShNQUMpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL1BsYXRmb3JtTWVudURlc2NyaXB0aW9u
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlv
bi5oCShyZXZpc2lvbiA3MzUzNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vUGxhdGZvcm1NZW51RGVz
Y3JpcHRpb24uaAkod29ya2luZyBjb3B5KQpAQCAtMzMsNyArMzMsNyBAQAogY2xhc3MgTlNNdXRh
YmxlQXJyYXk7CiAjZW5kaWYKICNlbGlmIFBMQVRGT1JNKFdJTikKLXR5cGVkZWYgc3RydWN0IEhN
RU5VX18qIEhNRU5VOworI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KICNlbGlmIFBMQVRGT1JNKFFU
KQogI2luY2x1ZGUgPHFsaXN0Lmg+CiAjZWxpZiBQTEFURk9STShHVEspCkBAIC00OSw3ICs0OSw4
IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICNpZiBQTEFURk9STShNQUMpCiAgICAgdHlwZWRlZiBO
U011dGFibGVBcnJheSogUGxhdGZvcm1NZW51RGVzY3JpcHRpb247CiAjZWxpZiBQTEFURk9STShX
SU4pCi0gICAgdHlwZWRlZiBITUVOVSBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbjsKKyAgICBjbGFz
cyBDb250ZXh0TWVudUl0ZW07CisgICAgdHlwZWRlZiBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiog
UGxhdGZvcm1NZW51RGVzY3JpcHRpb247CiAjZWxpZiBQTEFURk9STShRVCkKICAgICBjbGFzcyBD
b250ZXh0TWVudUl0ZW07CiAgICAgdHlwZWRlZiBjb25zdCBRTGlzdDxDb250ZXh0TWVudUl0ZW0+
KiBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbjsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL0Nv
bnRleHRNZW51SXRlbVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4v
Q29udGV4dE1lbnVJdGVtV2luLmNwcAkocmV2aXNpb24gNzM1MzYpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL3dpbi9Db250ZXh0TWVudUl0ZW1XaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsy
Nyw3IEBACiAjaW5jbHVkZSAiQ29udGV4dE1lbnVJdGVtLmgiCiAKICNpbmNsdWRlICJDb250ZXh0
TWVudS5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKIAogI2luY2x1ZGUgPHd0Zi90ZXh0
L0NTdHJpbmcuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CkBAIC00NSwxODEgKzQ2LDE1NiBAQAog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUNvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVt
KExQTUVOVUlURU1JTkZPIGl0ZW0pCi0gICAgOiBtX3BsYXRmb3JtRGVzY3JpcHRpb24oaXRlbSkK
LXsKK0NvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKExQTUVOVUlURU1JTkZPIGluZm8p
CisgICAgOiBtX3BsYXRmb3JtRGVzY3JpcHRpb24oKQoreyAgIAorICAgIG1fcGxhdGZvcm1EZXNj
cmlwdGlvbi50eXBlID0gaW5mby0+ZlR5cGUgJiBNRlRfU0VQQVJBVE9SID8gU2VwYXJhdG9yVHlw
ZSA6IEFjdGlvblR5cGU7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLmFjdGlvbiA9IHN0YXRp
Y19jYXN0PENvbnRleHRNZW51QWN0aW9uPihpbmZvLT53SUQpOworICAgIG1fcGxhdGZvcm1EZXNj
cmlwdGlvbi50aXRsZSA9IFN0cmluZyhpbmZvLT5kd1R5cGVEYXRhLCB3Y3NsZW4oaW5mby0+ZHdU
eXBlRGF0YSkpOworCisgICAgaWYgKGluZm8tPmhTdWJNZW51KSB7CisgICAgICAgIG1fcGxhdGZv
cm1EZXNjcmlwdGlvbi50eXBlID0gU3VibWVudVR5cGU7CisgICAgICAgIENvbnRleHRNZW51IHN1
Yk1lbnUoaW5mby0+aFN1Yk1lbnUpOworICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24uc3Vi
TWVudUl0ZW1zID0gY29udGV4dE1lbnVJdGVtVmVjdG9yKHN1Yk1lbnUucmVsZWFzZVBsYXRmb3Jt
RGVzY3JpcHRpb24oKSk7CisgICAgfQorCisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLmNoZWNr
ZWQgPSBpbmZvLT5mU3RhdGUgJiBNRlNfQ0hFQ0tFRDsKKyAgICBtX3BsYXRmb3JtRGVzY3JpcHRp
b24uZW5hYmxlZCA9ICEoaW5mby0+ZlN0YXRlICYgTUZTX0RJU0FCTEVEKTsKIH0KIAotQ29udGV4
dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnUqIHN1Yk1lbnUpCitDb250ZXh0
TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24gaXRl
bSkKKyAgICA6IG1fcGxhdGZvcm1EZXNjcmlwdGlvbihpdGVtKQogewotICAgIG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbiA9IChMUE1FTlVJVEVNSU5GTyltYWxsb2Moc2l6ZW9mKE1FTlVJVEVNSU5GTykp
OwotICAgIGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBtZW1zZXQobV9wbGF0Zm9ybURlc2NyaXB0aW9uLCAwLCBzaXplb2YoTUVOVUlURU1JTkZPKSk7
Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZP
KTsKLQotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+d0lEID0gQ29udGV4dE1lbnVJdGVtVGFn
Tm9BY3Rpb247Ci0gICAgaWYgKHN1Yk1lbnUpIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5mTWFzayB8PSBNSUlNX1NVQk1FTlU7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlv
bi0+aFN1Yk1lbnUgPSBzdWJNZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCk7Ci0gICAgfQogfQog
CiBDb250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlIHR5
cGUsIENvbnRleHRNZW51QWN0aW9uIGFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ29udGV4
dE1lbnUqIHN1Yk1lbnUpCisgICAgOiBtX3BsYXRmb3JtRGVzY3JpcHRpb24oKQogewotICAgIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbiA9IChMUE1FTlVJVEVNSU5GTyltYWxsb2Moc2l6ZW9mKE1FTlVJ
VEVNSU5GTykpOwotICAgIGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBtZW1zZXQobV9wbGF0Zm9ybURlc2NyaXB0aW9uLCAwLCBzaXplb2YoTUVOVUlU
RU1JTkZPKSk7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5jYlNpemUgPSBzaXplb2YoTUVO
VUlURU1JTkZPKTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZNYXNrID0gTUlJTV9GVFlQ
RTsKLQotICAgIGlmICh0eXBlID09IFNlcGFyYXRvclR5cGUpIHsKLSAgICAgICAgbV9wbGF0Zm9y
bURlc2NyaXB0aW9uLT5mVHlwZSA9IE1GVF9TRVBBUkFUT1I7Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0gICAgCi0gICAgaWYgKHN1Yk1lbnUpIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5mTWFzayB8PSBNSUlNX1NUUklORyB8IE1JSU1fU1VCTUVOVTsKLSAgICAgICAgbV9wbGF0
Zm9ybURlc2NyaXB0aW9uLT5oU3ViTWVudSA9IHN1Yk1lbnUtPnBsYXRmb3JtRGVzY3JpcHRpb24o
KTsKLSAgICB9IGVsc2UKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFzayB8PSBN
SUlNX1NUUklORyB8IE1JSU1fSUQ7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLnR5cGUgPSB0
eXBlOworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi5hY3Rpb24gPSBhY3Rpb247CisgICAgbV9w
bGF0Zm9ybURlc2NyaXB0aW9uLnRpdGxlID0gdGl0bGU7CiAKLSAgICBtX3BsYXRmb3JtRGVzY3Jp
cHRpb24tPmZUeXBlID0gTUZUX1NUUklORzsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPndJ
RCA9IGFjdGlvbjsKLSAgICAKLSAgICBTdHJpbmcgdCA9IHRpdGxlOwotICAgIG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbi0+Y2NoID0gdC5sZW5ndGgoKTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24t
PmR3VHlwZURhdGEgPSB3Y3NkdXAodC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsK
KyAgICBpZiAoc3ViTWVudSkKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLnN1Yk1lbnVJ
dGVtcyA9IGNvbnRleHRNZW51SXRlbVZlY3RvcihzdWJNZW51LT5yZWxlYXNlUGxhdGZvcm1EZXNj
cmlwdGlvbigpKTsKKworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi5jaGVja2VkID0gZmFsc2U7
CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLmVuYWJsZWQgPSB0cnVlOwogfQogCiBDb250ZXh0
TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlLCBDb250ZXh0TWVu
dUFjdGlvbiwgY29uc3QgU3RyaW5nJiwgYm9vbCwgYm9vbCkKKyAgICA6IG1fcGxhdGZvcm1EZXNj
cmlwdGlvbigpCiB7CiAgICAgLy8gRklYTUU6IEltcGxlbWVudAogfQogCiBDb250ZXh0TWVudUl0
ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUFjdGlvbiwgY29uc3QgU3RyaW5nJiwgYm9v
bCwgYm9vbCwgVmVjdG9yPENvbnRleHRNZW51SXRlbT4mKQorICAgIDogbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uKCkKIHsKICAgICAvLyBGSVhNRTogSW1wbGVtZW50CiB9CiAKIENvbnRleHRNZW51SXRl
bTo6fkNvbnRleHRNZW51SXRlbSgpCiB7Ci0gICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikg
ewotICAgICAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSA9PSBNRlRfU1RSSU5H
KQotICAgICAgICAgICAgZnJlZShtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEpOwot
ICAgICAgICBmcmVlKG1fcGxhdGZvcm1EZXNjcmlwdGlvbik7Ci0gICAgfQogfQogCi1MUE1FTlVJ
VEVNSU5GTyBDb250ZXh0TWVudUl0ZW06OnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCkKK1Bs
YXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbiBDb250ZXh0TWVudUl0ZW06OnJlbGVhc2VQbGF0Zm9y
bURlc2NyaXB0aW9uKCkKIHsKLSAgICBMUE1FTlVJVEVNSU5GTyBpbmZvID0gbV9wbGF0Zm9ybURl
c2NyaXB0aW9uOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IDA7Ci0gICAgcmV0dXJuIGlu
Zm87CisgICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNjcmlwdGlvbjsKIH0KIAogQ29udGV4dE1lbnVJ
dGVtVHlwZSBDb250ZXh0TWVudUl0ZW06OnR5cGUoKSBjb25zdAogewotICAgIENvbnRleHRNZW51
SXRlbVR5cGUgdHlwZSA9IEFjdGlvblR5cGU7Ci0gICAgaWYgKCgobV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5mVHlwZSAmIH5NRlRfT1dORVJEUkFXKSA9PSBNRlRfU1RSSU5HKSAmJiBtX3BsYXRmb3Jt
RGVzY3JpcHRpb24tPmhTdWJNZW51KQotICAgICAgICB0eXBlID0gU3VibWVudVR5cGU7Ci0gICAg
ZWxzZSBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSAmIE1GVF9TRVBBUkFUT1IpCi0g
ICAgICAgIHR5cGUgPSBTZXBhcmF0b3JUeXBlOworICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3Jp
cHRpb24udHlwZTsKK30KIAotICAgIHJldHVybiB0eXBlOwordm9pZCBDb250ZXh0TWVudUl0ZW06
OnNldFR5cGUoQ29udGV4dE1lbnVJdGVtVHlwZSB0eXBlKQoreworICAgIG1fcGxhdGZvcm1EZXNj
cmlwdGlvbi50eXBlID0gdHlwZTsKIH0KIAogQ29udGV4dE1lbnVBY3Rpb24gQ29udGV4dE1lbnVJ
dGVtOjphY3Rpb24oKSBjb25zdAogeyAKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q29udGV4dE1l
bnVBY3Rpb24+KG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+d0lEKTsKKyAgICByZXR1cm4gbV9wbGF0
Zm9ybURlc2NyaXB0aW9uLmFjdGlvbjsKIH0KIAotU3RyaW5nIENvbnRleHRNZW51SXRlbTo6dGl0
bGUoKSBjb25zdCAKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRBY3Rpb24oQ29udGV4dE1lbnVB
Y3Rpb24gYWN0aW9uKQogewotICAgIHJldHVybiBTdHJpbmcobV9wbGF0Zm9ybURlc2NyaXB0aW9u
LT5kd1R5cGVEYXRhLCB3Y3NsZW4obV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVEYXRhKSk7
CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLmFjdGlvbiA9IGFjdGlvbjsKIH0KIAotUGxhdGZv
cm1NZW51RGVzY3JpcHRpb24gQ29udGV4dE1lbnVJdGVtOjpwbGF0Zm9ybVN1Yk1lbnUoKSBjb25z
dAorU3RyaW5nIENvbnRleHRNZW51SXRlbTo6dGl0bGUoKSBjb25zdCAKIHsKLSAgICByZXR1cm4g
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5oU3ViTWVudTsKKyAgICByZXR1cm4gbV9wbGF0Zm9ybURl
c2NyaXB0aW9uLnRpdGxlOwogfQogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VHlwZShDb250
ZXh0TWVudUl0ZW1UeXBlIHR5cGUpCit2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VGl0bGUoY29u
c3QgU3RyaW5nJiB0aXRsZSkKIHsKLSAgICBpZiAodHlwZSA9PSBTZXBhcmF0b3JUeXBlKQotICAg
ICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZUeXBlID0gTUZUX1NFUEFSQVRPUjsKLSAgICBl
bHNlCi0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlR5cGUgPSBNRlRfU1RSSU5HOwor
ICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi50aXRsZSA9IHRpdGxlOwogfQogCi12b2lkIENvbnRl
eHRNZW51SXRlbTo6c2V0QWN0aW9uKENvbnRleHRNZW51QWN0aW9uIGFjdGlvbikKK1ZlY3RvcjxD
b250ZXh0TWVudUl0ZW0+KiBDb250ZXh0TWVudUl0ZW06OnBsYXRmb3JtU3ViTWVudSgpIGNvbnN0
CiB7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT53SUQgPSBhY3Rpb247IAorICAgIHJldHVy
biBjb25zdF9jYXN0PFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+Kj4oJm1fcGxhdGZvcm1EZXNjcmlw
dGlvbi5zdWJNZW51SXRlbXMpOwogfQogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VGl0bGUo
Y29uc3QgU3RyaW5nJiB0aXRsZSkKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRTdWJNZW51KENv
bnRleHRNZW51KiBzdWJNZW51KQogewotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3
VHlwZURhdGEpCi0gICAgICAgIGZyZWUobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVEYXRh
KTsKLSAgICAKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmNjaCA9IHRpdGxlLmxlbmd0aCgp
OwotICAgIFN0cmluZyB0aXRsZUNvcHkgPSB0aXRsZTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRp
b24tPmR3VHlwZURhdGEgPSB3Y3NkdXAodGl0bGVDb3B5LmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1p
bmF0aW9uKCkpOworICAgIGlmIChzdWJNZW51KSB7CisgICAgICAgIG1fcGxhdGZvcm1EZXNjcmlw
dGlvbi5zdWJNZW51SXRlbXMgPSBjb250ZXh0TWVudUl0ZW1WZWN0b3Ioc3ViTWVudS0+cmVsZWFz
ZVBsYXRmb3JtRGVzY3JpcHRpb24oKSk7CisgICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi50
eXBlID0gU3VibWVudVR5cGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uLnN1Yk1lbnVJdGVtcy5jbGVhcigpOworICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRp
b24udHlwZSA9IEFjdGlvblR5cGU7CisgICAgfQogfQogCi12b2lkIENvbnRleHRNZW51SXRlbTo6
c2V0U3ViTWVudShDb250ZXh0TWVudSogc3ViTWVudSkKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpz
ZXRTdWJNZW51KFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBpdGVtcykKIHsKLSAgICBpZiAoc3Vi
TWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpID09IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1
Yk1lbnUpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24t
PmhTdWJNZW51KQotICAgICAgICA6OkRlc3Ryb3lNZW51KG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+
aFN1Yk1lbnUpOwotCi0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFzayB8PSBNSUlNX1NV
Qk1FTlU7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5oU3ViTWVudSA9IHN1Yk1lbnUtPnJl
bGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCk7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLnN1
Yk1lbnVJdGVtcyA9IGl0ZW1zOwogfQogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0U3ViTWVu
dShWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYpCitib29sIENvbnRleHRNZW51SXRlbTo6Y2hlY2tl
ZCgpIGNvbnN0CiB7Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudAorICAgIHJldHVybiBtX3BsYXRm
b3JtRGVzY3JpcHRpb24uY2hlY2tlZDsKIH0KIAogdm9pZCBDb250ZXh0TWVudUl0ZW06OnNldENo
ZWNrZWQoYm9vbCBjaGVja2VkKQogewotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sg
fD0gTUlJTV9TVEFURTsKLSAgICBpZiAoY2hlY2tlZCkgewotICAgICAgICBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPmZTdGF0ZSAmPSB+TUZTX1VOQ0hFQ0tFRDsKLSAgICAgICAgbV9wbGF0Zm9ybURl
c2NyaXB0aW9uLT5mU3RhdGUgfD0gTUZTX0NIRUNLRUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAg
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1GU19DSEVDS0VEOwotICAgICAgICBt
X3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNfVU5DSEVDS0VEOwotICAgIH0KKyAg
ICBtX3BsYXRmb3JtRGVzY3JpcHRpb24uY2hlY2tlZCA9IGNoZWNrZWQ7CiB9CiAKLWJvb2wgQ29u
dGV4dE1lbnVJdGVtOjpjaGVja2VkKCkgY29uc3QKK2Jvb2wgQ29udGV4dE1lbnVJdGVtOjplbmFi
bGVkKCkgY29uc3QKIHsKLSAgICAvLyBGSVhNRSAtIEltcGxlbWVudAotICAgIHJldHVybiBmYWxz
ZTsKKyAgICByZXR1cm4gbV9wbGF0Zm9ybURlc2NyaXB0aW9uLmVuYWJsZWQ7CiB9CiAKIHZvaWQg
Q29udGV4dE1lbnVJdGVtOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKIHsKLSAgICBtX3BsYXRm
b3JtRGVzY3JpcHRpb24tPmZNYXNrIHw9IE1JSU1fU1RBVEU7Ci0gICAgaWYgKGVuYWJsZWQpIHsK
LSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1GU19ESVNBQkxFRDsK
LSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgfD0gTUZTX0VOQUJMRUQ7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1G
U19FTkFCTEVEOwotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNf
RElTQUJMRUQ7Ci0gICAgfQorICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi5lbmFibGVkID0gZW5h
YmxlZDsKIH0KIAotYm9vbCBDb250ZXh0TWVudUl0ZW06OmVuYWJsZWQoKSBjb25zdAordm9pZCBD
b250ZXh0TWVudUl0ZW06Om5hdGl2ZU1lbnVJdGVtKGNvbnN0IFBsYXRmb3JtTWVudUl0ZW1EZXNj
cmlwdGlvbiYgaXRlbSwgTFBNRU5VSVRFTUlORk8gaW5mbykKIHsKLSAgICByZXR1cm4gIShtX3Bs
YXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSAmIE1GU19ESVNBQkxFRCk7CisgICAgbWVtc2V0KGlu
Zm8sIDAsIHNpemVvZihNRU5VSVRFTUlORk8pKTsKKyAgICBpbmZvLT5jYlNpemUgPSBzaXplb2Yo
TUVOVUlURU1JTkZPKTsKKyAgICAKKyAgICBpbmZvLT5mTWFzayA9IE1JSU1fRlRZUEUgfCBNSUlN
X0lEIHwgTUlJTV9TVFJJTkcgfCBNSUlNX1NUQVRFIHwgTUlJTV9TVUJNRU5VOworCisgICAgaWYg
KGl0ZW0udHlwZSA9PSBTdWJtZW51VHlwZSkgeworICAgICAgICBITUVOVSBuYXRpdmVNZW51ID0g
OjpDcmVhdGVQb3B1cE1lbnUoKTsKKyAgICAgICAgQ29udGV4dE1lbnU6Om5hdGl2ZU1lbnUoY29u
c3RfY2FzdDxWZWN0b3I8Q29udGV4dE1lbnVJdGVtPio+KCZpdGVtLnN1Yk1lbnVJdGVtcyksIG5h
dGl2ZU1lbnUpOworICAgICAgICBpbmZvLT5oU3ViTWVudSA9IG5hdGl2ZU1lbnU7CisgICAgfQor
CisgICAgaWYgKGl0ZW0udHlwZSA9PSBTZXBhcmF0b3JUeXBlKQorICAgICAgICBpbmZvLT5mVHlw
ZSA9IE1GVF9TRVBBUkFUT1I7CisgICAgZWxzZQorICAgICAgICBpbmZvLT5mVHlwZSA9IE1GVF9T
VFJJTkc7CisKKyAgICBpbmZvLT53SUQgPSBpdGVtLmFjdGlvbjsKKworICAgIGluZm8tPmZTdGF0
ZSB8PSBpdGVtLmVuYWJsZWQgPyBNRlNfRU5BQkxFRCA6IE1GU19ESVNBQkxFRDsKKyAgICBpbmZv
LT5mU3RhdGUgfD0gaXRlbS5jaGVja2VkID8gTUZTX0NIRUNLRUQgOiBNRlNfVU5DSEVDS0VEOwog
fQogCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9Db250ZXh0TWVudVdpbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ29udGV4dE1lbnVXaW4uY3BwCShyZXZp
c2lvbiA3MzUzNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL0NvbnRleHRNZW51V2luLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgIk5vZGUuaCIKICNpbmNs
dWRlIDx0Y2hhci5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9y
Lmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCiAjaWZuZGVmIE1JSU1fRlRZUEUK
QEAgLTQzLDI4ICs0NCw1NSBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK0NvbnRleHRNZW51
OjpDb250ZXh0TWVudShITUVOVSBtZW51KQorI2lmIE9TKFdJTkNFKQorICAgIDogbV9pdGVtQ291
bnQoMCkKKyNlbmRpZgoreworICAgIGludCBjb3VudCA9IDo6R2V0TWVudUl0ZW1Db3VudChtZW51
KTsKKyAgICBpZiAoY291bnQgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgaW50IG1lbnVTdHJpbmdMZW5n
dGggPSA6OkdldE1lbnVTdHJpbmcobWVudSwgaSwgMCwgMCwgTUZfQllQT1NJVElPTik7CisgICAg
ICAgIGlmICghbWVudVN0cmluZ0xlbmd0aCkgeworICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3Qg
aGF2ZSBhIHN0cmluZywgdGhlbiB3ZSBtdXN0IGJlIGluIGEgc2VwYXJhdG9yLgorICAgICAgICAg
ICAgbV9pdGVtcy5hcHBlbmQoQ29udGV4dE1lbnVJdGVtKFNlcGFyYXRvclR5cGUsIENvbnRleHRN
ZW51SXRlbVRhZ05vQWN0aW9uLCBTdHJpbmcoKSkpOworICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIH0KKworICAgICAgICBMUFRTVFIgbWVudVN0cmluZyA9IG5ldyBXQ0hBUlttZW51U3Ry
aW5nTGVuZ3RoICsgMV07CisKKyAgICAgICAgTUVOVUlURU1JTkZPIGluZm8gPSB7MH07CisgICAg
ICAgIGluZm8uY2JTaXplID0gc2l6ZW9mKE1FTlVJVEVNSU5GTyk7CisgICAgICAgIGluZm8uZk1h
c2sgPSBNSUlNX0ZUWVBFIHwgTUlJTV9JRCB8IE1JSU1fU1RSSU5HIHwgTUlJTV9TVEFURSB8IE1J
SU1fU1VCTUVOVTsKKyAgICAgICAgaW5mby5kd1R5cGVEYXRhID0gbWVudVN0cmluZzsKKyAgICAg
ICAgaW5mby5jY2ggPSBtZW51U3RyaW5nTGVuZ3RoICsgMTsKKworICAgICAgICBpZiAoOjpHZXRN
ZW51SXRlbUluZm8obWVudSwgaSwgVFJVRSwgJmluZm8pKQorICAgICAgICAgICBtX2l0ZW1zLmFw
cGVuZChDb250ZXh0TWVudUl0ZW0oJmluZm8pKTsKKworICAgICAgICBmcmVlKG1lbnVTdHJpbmcp
OworICAgIH0KK30KKwogQ29udGV4dE1lbnU6OkNvbnRleHRNZW51KCkKLSAgICA6IG1fcGxhdGZv
cm1EZXNjcmlwdGlvbigwKQogI2lmIE9TKFdJTkNFKQotICAgICwgbV9pdGVtQ291bnQoMCkKKyAg
ICA6IG1faXRlbUNvdW50KDApCiAjZW5kaWYKIHsKLSAgICBzZXRQbGF0Zm9ybURlc2NyaXB0aW9u
KDo6Q3JlYXRlUG9wdXBNZW51KCkpOwogfQogCi1Db250ZXh0TWVudTo6Q29udGV4dE1lbnUoY29u
c3QgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gbWVudSkKLSAgICA6IG1fcGxhdGZvcm1EZXNjcmlw
dGlvbigwKQorQ29udGV4dE1lbnU6OkNvbnRleHRNZW51KGNvbnN0IFBsYXRmb3JtTWVudURlc2Ny
aXB0aW9uIGRlc2NyaXB0aW9uKQorICAgIDogbV9pdGVtcyhjb250ZXh0TWVudUl0ZW1WZWN0b3Io
ZGVzY3JpcHRpb24pKQogI2lmIE9TKFdJTkNFKQogICAgICwgbV9pdGVtQ291bnQoMCkKICNlbmRp
ZgotewotICAgIHNldFBsYXRmb3JtRGVzY3JpcHRpb24obWVudSk7Cit7ICAgIAogfQogCiBDb250
ZXh0TWVudTo6fkNvbnRleHRNZW51KCkKIHsKLSAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9u
KQotICAgICAgICA6OkRlc3Ryb3lNZW51KG1fcGxhdGZvcm1EZXNjcmlwdGlvbik7CiB9CiAKIHVu
c2lnbmVkIENvbnRleHRNZW51OjppdGVtQ291bnQoKSBjb25zdApAQCAtNzIsMTAgKzEwMCw3IEBA
IHVuc2lnbmVkIENvbnRleHRNZW51OjppdGVtQ291bnQoKSBjb25zdAogI2lmIE9TKFdJTkNFKQog
ICAgIHJldHVybiBtX2l0ZW1Db3VudDsKICNlbHNlCi0gICAgaWYgKCFtX3BsYXRmb3JtRGVzY3Jp
cHRpb24pCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIDo6R2V0TWVudUl0ZW1Db3Vu
dChtX3BsYXRmb3JtRGVzY3JpcHRpb24pOworICAgIHJldHVybiBtX2l0ZW1zLnNpemUoKTsKICNl
bmRpZgogfQogCkBAIC0xMTMsMTQgKzEzOCwxMSBAQCBzdGF0aWMgYm9vbCBpbnNlcnRNZW51SXRl
bShQbGF0Zm9ybU1lbnVECiAKIHZvaWQgQ29udGV4dE1lbnU6Omluc2VydEl0ZW0odW5zaWduZWQg
aW50IHBvc2l0aW9uLCBDb250ZXh0TWVudUl0ZW0mIGl0ZW0pCiB7Ci0gICAgaWYgKCFtX3BsYXRm
b3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVybjsKLQogI2lmIE9TKFdJTkNFKQogICAgIGlm
IChpbnNlcnRNZW51SXRlbShtX3BsYXRmb3JtRGVzY3JpcHRpb24sIHBvc2l0aW9uLCBpdGVtKSkK
ICAgICAgICAgKyttX2l0ZW1Db3VudDsKICNlbHNlCi0gICAgOjpJbnNlcnRNZW51SXRlbShtX3Bs
YXRmb3JtRGVzY3JpcHRpb24sIHBvc2l0aW9uLCBUUlVFLCBpdGVtLnJlbGVhc2VQbGF0Zm9ybURl
c2NyaXB0aW9uKCkpOworICAgIG1faXRlbXMuaW5zZXJ0KHBvc2l0aW9uLCBpdGVtKTsKICNlbmRp
ZgogfQogCkBAIC0xMjksOTQgKzE1MSw5OSBAQCB2b2lkIENvbnRleHRNZW51OjphcHBlbmRJdGVt
KENvbnRleHRNZW51CiAgICAgaW5zZXJ0SXRlbShpdGVtQ291bnQoKSwgaXRlbSk7CiB9CiAKLXN0
YXRpYyBDb250ZXh0TWVudUl0ZW0qIGNvbnRleHRNZW51SXRlbUJ5SWRPclBvc2l0aW9uKEhNRU5V
IG1lbnUsIHVuc2lnbmVkIGlkLCBCT09MIGJ5UG9zaXRpb24pCitzdGF0aWMgQ29udGV4dE1lbnVJ
dGVtKiBpdGVtV2l0aEFjdGlvbkluTWVudSh1bnNpZ25lZCBhY3Rpb24sIFZlY3RvcjxDb250ZXh0
TWVudUl0ZW0+JiBpdGVtcykKIHsKLSAgICBpZiAoIW1lbnUpCi0gICAgICAgIHJldHVybiAwOwot
ICAgIExQTUVOVUlURU1JTkZPIGluZm8gPSBzdGF0aWNfY2FzdDxMUE1FTlVJVEVNSU5GTz4obWFs
bG9jKHNpemVvZihNRU5VSVRFTUlORk8pKSk7Ci0gICAgaWYgKCFpbmZvKQotICAgICAgICByZXR1
cm4gMDsKLQotICAgIG1lbXNldChpbmZvLCAwLCBzaXplb2YoTUVOVUlURU1JTkZPKSk7Ci0KLSAg
ICBpbmZvLT5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPKTsKLQotICAgIC8vIFNldHRpbmcg
TUlJTV9EQVRBIHdoaWNoIGlzIHVzZWZ1bCBmb3IgV2ViS2l0IGNsaWVudHMgd2hvIHN0b3JlIGRh
dGEgaW4gdGhpcyBtZW1iZXIgZm9yIHRoZWlyIGN1c3RvbSBtZW51IGl0ZW1zLgotICAgIGluZm8t
PmZNYXNrID0gTUlJTV9GVFlQRSB8IE1JSU1fSUQgfCBNSUlNX1NUUklORyB8IE1JSU1fREFUQTsK
LQotICAgIGlmICghOjpHZXRNZW51SXRlbUluZm8obWVudSwgaWQsIGJ5UG9zaXRpb24sIGluZm8p
KSB7Ci0gICAgICAgIGZyZWUoaW5mbyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAg
IGlmIChpbmZvLT5mVHlwZSAmIE1GVF9TVFJJTkcpIHsKLSAgICAgICAgTFBUU1RSIGJ1ZmZlciA9
IHN0YXRpY19jYXN0PExQVFNUUj4obWFsbG9jKCsraW5mby0+Y2NoICogc2l6ZW9mKFRDSEFSKSkp
OwotICAgICAgICBpZiAoIWJ1ZmZlcikgewotICAgICAgICAgICAgZnJlZShpbmZvKTsKLSAgICAg
ICAgICAgIHJldHVybiAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBpdGVtcy5zaXpl
KCk7ICsraSkgeworICAgICAgICBpZiAoaXRlbXNbaV0uYWN0aW9uKCkgPT0gYWN0aW9uKQorICAg
ICAgICAgICAgcmV0dXJuICZpdGVtc1tpXTsKKyAgICAgICAgaWYgKGl0ZW1zW2ldLnR5cGUoKSA9
PSBTdWJtZW51VHlwZSkgeworICAgICAgICAgICAgQ29udGV4dE1lbnVJdGVtKiBzZWFyY2hTdWJt
ZW51ID0gaXRlbVdpdGhBY3Rpb25Jbk1lbnUoYWN0aW9uLCAqaXRlbXNbaV0ucGxhdGZvcm1TdWJN
ZW51KCkpOworICAgICAgICAgICAgaWYgKHNlYXJjaFN1Ym1lbnUpCisgICAgICAgICAgICAgICAg
cmV0dXJuIHNlYXJjaFN1Ym1lbnU7CiAgICAgICAgIH0KLSAgICAgICAgaW5mby0+ZHdUeXBlRGF0
YSA9IGJ1ZmZlcjsKLSAgICAgICAgOjpHZXRNZW51SXRlbUluZm8obWVudSwgaWQsIGJ5UG9zaXRp
b24sIGluZm8pOwogICAgIH0KIAotICAgIHJldHVybiBuZXcgQ29udGV4dE1lbnVJdGVtKGluZm8p
OworICAgIHJldHVybiAwOwogfQogCiBDb250ZXh0TWVudUl0ZW0qIENvbnRleHRNZW51OjppdGVt
V2l0aEFjdGlvbih1bnNpZ25lZCBhY3Rpb24pCiB7Ci0gICAgcmV0dXJuIGNvbnRleHRNZW51SXRl
bUJ5SWRPclBvc2l0aW9uKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgYWN0aW9uLCBGQUxTRSk7Cisg
ICAgcmV0dXJuIGl0ZW1XaXRoQWN0aW9uSW5NZW51KGFjdGlvbiwgbV9pdGVtcyk7CiB9CiAKLUNv
bnRleHRNZW51SXRlbSogQ29udGV4dE1lbnU6Oml0ZW1BdEluZGV4KHVuc2lnbmVkIGluZGV4LCBj
b25zdCBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBwbGF0Zm9ybURlc2NyaXB0aW9uKQorQ29udGV4
dE1lbnVJdGVtKiBDb250ZXh0TWVudTo6aXRlbUF0SW5kZXgodW5zaWduZWQgaW5kZXgpCiB7Ci0g
ICAgcmV0dXJuIGNvbnRleHRNZW51SXRlbUJ5SWRPclBvc2l0aW9uKHBsYXRmb3JtRGVzY3JpcHRp
b24sIGluZGV4LCBUUlVFKTsKKyAgICByZXR1cm4gJm1faXRlbXNbaW5kZXhdOwogfQogCi12b2lk
IENvbnRleHRNZW51OjpzZXRQbGF0Zm9ybURlc2NyaXB0aW9uKEhNRU5VIG1lbnUpCit2b2lkIENv
bnRleHRNZW51OjpzZXRQbGF0Zm9ybURlc2NyaXB0aW9uKFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+
KiBwbGF0Zm9ybURlc2NyaXB0aW9uKQogewotICAgIGlmIChtZW51ID09IG1fcGxhdGZvcm1EZXNj
cmlwdGlvbikKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGlmIChtX3BsYXRmb3JtRGVzY3Jp
cHRpb24pCi0gICAgICAgIDo6RGVzdHJveU1lbnUobV9wbGF0Zm9ybURlc2NyaXB0aW9uKTsKKyAg
ICBtX2l0ZW1zLmNsZWFyKCk7CiAKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24gPSBtZW51Owot
ICAgIGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICByZXR1cm47CisgICAgZm9y
ICh1bnNpZ25lZCBpID0gMDsgaSA8IHBsYXRmb3JtRGVzY3JpcHRpb24tPnNpemUoKTsgKytpKQor
ICAgICAgICBtX2l0ZW1zLmFwcGVuZChDb250ZXh0TWVudUl0ZW0ocGxhdGZvcm1EZXNjcmlwdGlv
bi0+YXQoaSkucmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKSkpOworfQogCi0jaWYgIU9TKFdJ
TkNFKQotICAgIE1FTlVJTkZPIG1lbnVJbmZvID0gezB9OwotICAgIG1lbnVJbmZvLmNiU2l6ZSA9
IHNpemVvZihNRU5VSU5GTyk7Ci0gICAgbWVudUluZm8uZk1hc2sgPSBNSU1fU1RZTEU7Ci0gICAg
OjpHZXRNZW51SW5mbyhtX3BsYXRmb3JtRGVzY3JpcHRpb24sICZtZW51SW5mbyk7Ci0gICAgbWVu
dUluZm8uZk1hc2sgPSBNSU1fU1RZTEU7Ci0gICAgbWVudUluZm8uZHdTdHlsZSB8PSBNTlNfTk9U
SUZZQllQT1M7Ci0gICAgOjpTZXRNZW51SW5mbyhtX3BsYXRmb3JtRGVzY3JpcHRpb24sICZtZW51
SW5mbyk7Ci0jZW5kaWYKK1ZlY3RvcjxDb250ZXh0TWVudUl0ZW0+KiBDb250ZXh0TWVudTo6cGxh
dGZvcm1EZXNjcmlwdGlvbigpIGNvbnN0Cit7CisgICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4q
IGl0ZW1zID0gbmV3IFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+OworICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBtX2l0ZW1zLnNpemUoKTsgKytpKQorICAgICAgICBpdGVtcy0+YXBwZW5kKG1f
aXRlbXNbaV0pOworICAgIHJldHVybiBpdGVtczsKIH0KIAotSE1FTlUgQ29udGV4dE1lbnU6OnBs
YXRmb3JtRGVzY3JpcHRpb24oKSBjb25zdAorVmVjdG9yPENvbnRleHRNZW51SXRlbT4qIENvbnRl
eHRNZW51OjpyZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpCiB7Ci0gICAgcmV0dXJuIG1fcGxh
dGZvcm1EZXNjcmlwdGlvbjsKKyAgICBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiogaXRlbXMgPSBu
ZXcgVmVjdG9yPENvbnRleHRNZW51SXRlbT47CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IG1faXRlbXMuc2l6ZSgpOyArK2kpCisgICAgICAgIGl0ZW1zLT5hcHBlbmQobV9pdGVtc1tpXSk7
CisKKyAgICBtX2l0ZW1zLmNsZWFyKCk7CisgICAgcmV0dXJuIGl0ZW1zOwogfQogCi1ITUVOVSBD
b250ZXh0TWVudTo6cmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKQordm9pZCBDb250ZXh0TWVu
dTo6bmF0aXZlTWVudShWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiogaXRlbXMsIEhNRU5VIG1lbnUp
CiB7Ci0gICAgSE1FTlUgZGVzY3JpcHRpb24gPSBtX3BsYXRmb3JtRGVzY3JpcHRpb247Ci0gICAg
bV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gMDsKLSAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAg
QVNTRVJUX0FSRyhpdGVtcywgaXRlbXMpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVt
cy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgTUVOVUlURU1JTkZPIG1lbnVJdGVtID0gezB9Owor
ICAgICAgICBtZW51SXRlbS5jYlNpemUgPSBzaXplb2YobWVudUl0ZW0pOworCisgICAgICAgIFBs
YXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGl0ZW1zLT5hdChpKS5yZWxl
YXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOworICAgICAgICBDb250ZXh0TWVudUl0ZW06Om5hdGl2
ZU1lbnVJdGVtKGRlc2NyaXB0aW9uLCAmbWVudUl0ZW0pOworCisgICAgICAgIFdURjo6U3RyaW5n
IHRpdGxlID0gZGVzY3JpcHRpb24udGl0bGU7CisgICAgICAgIG1lbnVJdGVtLmR3VHlwZURhdGEg
PSAoTFBXU1RSKSB0aXRsZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpOworICAgICAg
ICBtZW51SXRlbS5jY2ggPSB0aXRsZS5sZW5ndGgoKSArIDE7CisKKyAgICAgICAgOjpJbnNlcnRN
ZW51SXRlbShtZW51LCBpLCBUUlVFLCAmbWVudUl0ZW0pOworICAgIH0KIH0KIAotVmVjdG9yPENv
bnRleHRNZW51SXRlbT4gY29udGV4dE1lbnVJdGVtVmVjdG9yKFBsYXRmb3JtTWVudURlc2NyaXB0
aW9uKQorVmVjdG9yPENvbnRleHRNZW51SXRlbT4gY29udGV4dE1lbnVJdGVtVmVjdG9yKFZlY3Rv
cjxDb250ZXh0TWVudUl0ZW0+KiBtZW51KQogewotICAgIC8vIEZJWE1FIC0gSW1wbGVtZW50Ci0g
ICAgcmV0dXJuIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+KCk7CisgICAgQVNTRVJUX0FSRyhtZW51
LCBtZW51KTsKKworICAgIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+IGl0ZW1zOworICAgIGludCBj
b3VudCA9IG1lbnUtPnNpemUoKTsKKyAgICBpZiAoIWNvdW50KQorICAgICAgICByZXR1cm4gaXRl
bXM7CisgICAgaXRlbXMucmVzZXJ2ZUNhcGFjaXR5KGNvdW50KTsKKworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgICAgICBpdGVtcy5hcHBlbmQobWVudS0+YXQo
aSkpOworCisgICAgcmV0dXJuIGl0ZW1zOwogfQogCiBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBw
bGF0Zm9ybU1lbnVEZXNjcmlwdGlvbihWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYgbWVudUl0ZW1W
ZWN0b3IpCiB7Ci0gICAgLy8gRklYTUUgLSBJbXBsZW1lbnQKLSAgICByZXR1cm4gMDsKLX0KKyAg
ICBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBwbGF0Zm9ybU1lbnUgPSBuZXcgVmVjdG9yPENvbnRl
eHRNZW51SXRlbT47CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG1lbnVJdGVtVmVjdG9y
LnNpemUoKTsgKytpKQorICAgICAgICBwbGF0Zm9ybU1lbnUtPmFwcGVuZChtZW51SXRlbVZlY3Rv
cltpXSk7CisKKyAgICByZXR1cm4gcGxhdGZvcm1NZW51OworfSAKIAogfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpJbmRleDogV2ViS2l0L3dpbi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0
L3dpbi9DaGFuZ2VMb2cJKHJldmlzaW9uIDczNTM2KQorKysgV2ViS2l0L3dpbi9DaGFuZ2VMb2cJ
KHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwyNiBAQAorMjAxMC0xMi0wOCAgQnJpYW4gV2VpbnN0
ZWluICA8YndlaW5zdGVpbkBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgUHJlcCB3b3JrIGZvciBXZWJLaXQyOiBDb250ZXh0IG1lbnUg
c3VwcG9ydCBvbiBXaW5kb3dzCisgICAgICAgIDxodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NTA1MTQ+CisgICAgICAgIAorICAgICAgICBUaGUgV2ViQ29yZSBwYXJ0IG9m
IHRoaXMgY2hhbmdlZCByZWZhY3RvcmVkIENvbnRleHRNZW51cyBvbiBXaW5kb3dzIHRvIGJlIGJh
Y2tlZCBieSBhIAorICAgICAgICBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBpbnN0ZWFkIG9mIGFu
IEhNRU5VLiBUaGlzIG1lYW5zIHRoYXQgY2FsbGVycyBvZiBwbGF0Zm9ybURlc2NyaXB0aW9uKCkK
KyAgICAgICAgd2VyZSBleHBlY3RpbmcgYW4gSE1FTlUsIGFuZCBub3cgdGhleSBhcmUgZ2V0dGlu
ZyBhIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+Ki4KKworICAgICAgICAqIFdlYkNvcmVTdXBwb3J0
L1dlYkNvbnRleHRNZW51Q2xpZW50LmNwcDoKKyAgICAgICAgKFdlYkNvbnRleHRNZW51Q2xpZW50
OjpnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcyk6IFVwZGF0ZSB0aGUgcmV0dXJuIHR5cGUs
IGFuZCBjcmVhdGUgYW4gSE1FTlUsIHRoZW4gcG9wdXBsYXRlCisgICAgICAgICAgICBpdCB3aXRo
IHRoZSBjb250ZW50cyBvZiB0aGUgQ29udGV4dE1lbnUgcGFzc2VkIGluLCBhbmQgdXNlIHRoYXQg
SE1FTlUgaW4gZnVuY3Rpb25zIHRoYXQgZXhwZWN0IG9uZS4KKyAgICAgICAgKFdlYkNvbnRleHRN
ZW51Q2xpZW50Ojpjb250ZXh0TWVudUl0ZW1TZWxlY3RlZCk6IENyZWF0ZSBhIE1FTlVJVEVNSU5G
TywgcG9wdWxhdGUgaXQgZnJvbSBhIENvbnRleHRNZW51SXRlbSwgYW5kIHBhc3MKKyAgICAgICAg
ICAgIHRoYXQgTUVOVUlURU1JTkZPIHRvIGZ1bmN0aW9ucyB0aGF0IGV4cGVjdCBvbmUuCisgICAg
ICAgICogV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuaDogVXBkYXRlIHRoZSBy
ZXR1cm4gdHlwZSBvZiBnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcy4KKyAgICAgICAgKiBX
ZWJWaWV3LmNwcDoKKyAgICAgICAgKFdlYlZpZXc6OmhhbmRsZUNvbnRleHRNZW51RXZlbnQpOiBD
cmVhdGUgYW4gSE1FTlUsIHBvcHVsYXRlIGl0IHdpdGggdGhlIGNvbnRlbnRzCisgICAgICAgICAg
ICBvZiB0aGUgQ29udGV4dE1lbnUgcGFzc2VkIGluLCBhbmQgdXNlIHRoYXQgSE1FTlUgaW4gdGhl
IGZ1bmN0aW9ucyB0aGF0IGV4cGVjdCBvbmUuCisgICAgICAgIChXZWJWaWV3OjpwZXJmb3JtQ29u
dGV4dE1lbnVBY3Rpb24pOiBDb250ZXh0TWVudTo6aXRlbUF0SW5kZXggZG9lc24ndCBuZWVkIGEg
cGxhdGZvcm1SZXByZXNlbnRhdGlvbgorICAgICAgICAgICAgYW55bW9yZSwgaXQgY2FuIGp1c3Qg
d29yayBiYXNlZCBvbiB0aGUgaW5kZXgsIHNvIG9ubHkgcGFzcyBvbmUgYXJndW1lbnQuCisKIDIw
MTAtMTItMDcgIEJyaWFuIFdlaW5zdGVpbiAgPGJ3ZWluc3RlaW5AYXBwbGUuY29tPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IEpvaG4gU3VsbGl2YW4uCkluZGV4OiBXZWJLaXQvd2luL1dlYlZpZXcu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViVmlldy5jcHAJKHJldmlzaW9uIDczNTM2
KQorKysgV2ViS2l0L3dpbi9XZWJWaWV3LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTI3NCwxMyAr
MTI3NCwxNiBAQCBib29sIFdlYlZpZXc6OmhhbmRsZUNvbnRleHRNZW51RXZlbnQoV1BBCiAgICAg
aWYgKG1fdWlEZWxlZ2F0ZSkKICAgICAgICAgbV91aURlbGVnYXRlLT5oYXNDdXN0b21NZW51SW1w
bGVtZW50YXRpb24oJmhhc0N1c3RvbU1lbnVzKTsKIAorICAgIEhNRU5VIG1lbnUgPSA6OkNyZWF0
ZVBvcHVwTWVudSgpOworICAgIENvbnRleHRNZW51OjpuYXRpdmVNZW51KGNvcmVNZW51LT5wbGF0
Zm9ybURlc2NyaXB0aW9uKCksIG1lbnUpOworCiAgICAgaWYgKGhhc0N1c3RvbU1lbnVzKQotICAg
ICAgICBtX3VpRGVsZWdhdGUtPnRyYWNrQ3VzdG9tUG9wdXBNZW51KChJV2ViVmlldyopdGhpcywg
KE9MRV9IQU5ETEUpKFVMT05HNjQpY29yZU1lbnUtPnBsYXRmb3JtRGVzY3JpcHRpb24oKSwgJnBv
aW50KTsKKyAgICAgICAgbV91aURlbGVnYXRlLT50cmFja0N1c3RvbVBvcHVwTWVudSgoSVdlYlZp
ZXcqKXRoaXMsIChPTEVfSEFORExFKShVTE9ORzY0KW1lbnUsICZwb2ludCk7CiAgICAgZWxzZSB7
CiAgICAgICAgIC8vIFN1cnByaXNpbmdseSwgVFBNX1JJR0hUQlVUVE9OIG1lYW5zIHRoYXQgaXRl
bXMgYXJlIHNlbGVjdGFibGUgd2l0aCBlaXRoZXIgdGhlIHJpZ2h0IE9SIGxlZnQgbW91c2UgYnV0
dG9uCiAgICAgICAgIFVJTlQgZmxhZ3MgPSBUUE1fUklHSFRCVVRUT04gfCBUUE1fVE9QQUxJR04g
fCBUUE1fVkVSUE9TQU5JTUFUSU9OIHwgVFBNX0hPUklaT05UQUwKICAgICAgICAgICAgIHwgVFBN
X0xFRlRBTElHTiB8IFRQTV9IT1JQT1NBTklNQVRJT047Ci0gICAgICAgIDo6VHJhY2tQb3B1cE1l
bnVFeChjb3JlTWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpLCBmbGFncywgcG9pbnQueCwgcG9p
bnQueSwgbV92aWV3V2luZG93LCAwKTsKKyAgICAgICAgOjpUcmFja1BvcHVwTWVudUV4KG1lbnUs
IGZsYWdzLCBwb2ludC54LCBwb2ludC55LCBtX3ZpZXdXaW5kb3csIDApOwogICAgIH0KIAogICAg
IHJldHVybiB0cnVlOwpAQCAtMTM1NSwxMSArMTM1OCwxMCBAQCB2b2lkIFdlYlZpZXc6OnBlcmZv
cm1Db250ZXh0TWVudUFjdGlvbihXCiAgICAgQ29udGV4dE1lbnUqIG1lbnUgPSBtX3BhZ2UtPmNv
bnRleHRNZW51Q29udHJvbGxlcigpLT5jb250ZXh0TWVudSgpOwogICAgIEFTU0VSVChtZW51KTsK
IAotICAgIENvbnRleHRNZW51SXRlbSogaXRlbSA9IGJ5UG9zaXRpb24gPyBtZW51LT5pdGVtQXRJ
bmRleCgodW5zaWduZWQpd1BhcmFtLCAoSE1FTlUpbFBhcmFtKSA6IG1lbnUtPml0ZW1XaXRoQWN0
aW9uKChDb250ZXh0TWVudUFjdGlvbil3UGFyYW0pOworICAgIENvbnRleHRNZW51SXRlbSogaXRl
bSA9IGJ5UG9zaXRpb24gPyBtZW51LT5pdGVtQXRJbmRleCgodW5zaWduZWQpd1BhcmFtKSA6IG1l
bnUtPml0ZW1XaXRoQWN0aW9uKChDb250ZXh0TWVudUFjdGlvbil3UGFyYW0pOwogICAgIGlmICgh
aXRlbSkKICAgICAgICAgcmV0dXJuOwogICAgIG1fcGFnZS0+Y29udGV4dE1lbnVDb250cm9sbGVy
KCktPmNvbnRleHRNZW51SXRlbVNlbGVjdGVkKGl0ZW0pOwotICAgIGRlbGV0ZSBpdGVtOwogfQog
CiBib29sIFdlYlZpZXc6OmhhbmRsZU1vdXNlRXZlbnQoVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1Bh
cmFtLCBMUEFSQU0gbFBhcmFtKQpJbmRleDogV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJD
b250ZXh0TWVudUNsaWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJDb3JlU3Vw
cG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDczNTM2KQorKysgV2ViS2l0
L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTU1LDcgKzU1LDcgQEAgdm9pZCBXZWJDb250ZXh0TWVudUNsaWVudDo6Y29udGV4dE1l
bnVEZQogICAgIGRlbGV0ZSB0aGlzOwogfQogCi1ITUVOVSBXZWJDb250ZXh0TWVudUNsaWVudDo6
Z2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMoQ29udGV4dE1lbnUqIG1lbnUpCitQbGF0Zm9y
bU1lbnVEZXNjcmlwdGlvbiBXZWJDb250ZXh0TWVudUNsaWVudDo6Z2V0Q3VzdG9tTWVudUZyb21E
ZWZhdWx0SXRlbXMoQ29udGV4dE1lbnUqIG1lbnUpCiB7CiAgICAgQ09NUHRyPElXZWJVSURlbGVn
YXRlPiB1aURlbGVnYXRlOwogICAgIGlmIChGQUlMRUQobV93ZWJWaWV3LT51aURlbGVnYXRlKCZ1
aURlbGVnYXRlKSkpCkBAIC02Nyw5ICs2NywxMyBAQCBITUVOVSBXZWJDb250ZXh0TWVudUNsaWVu
dDo6Z2V0Q3VzdG9tTWVuCiAgICAgQ09NUHRyPFdlYkVsZW1lbnRQcm9wZXJ0eUJhZz4gcHJvcGVy
dHlCYWc7CiAgICAgcHJvcGVydHlCYWcuYWRvcHRSZWYoV2ViRWxlbWVudFByb3BlcnR5QmFnOjpj
cmVhdGVJbnN0YW5jZShtX3dlYlZpZXctPnBhZ2UoKS0+Y29udGV4dE1lbnVDb250cm9sbGVyKCkt
PmhpdFRlc3RSZXN1bHQoKSkpOwogICAgIC8vIEZJWE1FOiBXZSBuZWVkIHRvIGRlY2lkZSB3aGV0
aGVyIHRvIGRvIHRoZSBkZWZhdWx0IGJlZm9yZSBjYWxsaW5nIHRoaXMgZGVsZWdhdGUgbWV0aG9k
Ci0gICAgaWYgKEZBSUxFRCh1aURlbGVnYXRlLT5jb250ZXh0TWVudUl0ZW1zRm9yRWxlbWVudCht
X3dlYlZpZXcsIHByb3BlcnR5QmFnLmdldCgpLCAoT0xFX0hBTkRMRSkoVUxPTkc2NCltZW51LT5w
bGF0Zm9ybURlc2NyaXB0aW9uKCksIChPTEVfSEFORExFKikmbmV3TWVudSkpKQorICAgIEhNRU5V
IHdpbmRvd3NNZW51ID0gOjpDcmVhdGVQb3B1cE1lbnUoKTsgICAgCisgICAgQ29udGV4dE1lbnU6
Om5hdGl2ZU1lbnUobWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpLCB3aW5kb3dzTWVudSk7Cisg
ICAgaWYgKEZBSUxFRCh1aURlbGVnYXRlLT5jb250ZXh0TWVudUl0ZW1zRm9yRWxlbWVudChtX3dl
YlZpZXcsIHByb3BlcnR5QmFnLmdldCgpLCAoT0xFX0hBTkRMRSkoVUxPTkc2NCl3aW5kb3dzTWVu
dSwgKE9MRV9IQU5ETEUqKSZuZXdNZW51KSkpCiAgICAgICAgIHJldHVybiBtZW51LT5wbGF0Zm9y
bURlc2NyaXB0aW9uKCk7Ci0gICAgcmV0dXJuIG5ld01lbnU7CisKKyAgICBDb250ZXh0TWVudSBk
ZWxlZ2F0ZU1lbnUobmV3TWVudSk7CisgICAgcmV0dXJuIGRlbGVnYXRlTWVudS5yZWxlYXNlUGxh
dGZvcm1EZXNjcmlwdGlvbigpOwogfQogCiB2b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50Ojpjb250
ZXh0TWVudUl0ZW1TZWxlY3RlZChDb250ZXh0TWVudUl0ZW0qIGl0ZW0sIGNvbnN0IENvbnRleHRN
ZW51KiBwYXJlbnRNZW51KQpAQCAtODQsOCArODgsMTAgQEAgdm9pZCBXZWJDb250ZXh0TWVudUNs
aWVudDo6Y29udGV4dE1lbnVJdAogCiAgICAgQ09NUHRyPFdlYkVsZW1lbnRQcm9wZXJ0eUJhZz4g
cHJvcGVydHlCYWc7CiAgICAgcHJvcGVydHlCYWcuYWRvcHRSZWYoV2ViRWxlbWVudFByb3BlcnR5
QmFnOjpjcmVhdGVJbnN0YW5jZShtX3dlYlZpZXctPnBhZ2UoKS0+Y29udGV4dE1lbnVDb250cm9s
bGVyKCktPmhpdFRlc3RSZXN1bHQoKSkpOwotICAgICAgICAgICAgCi0gICAgdWlEZWxlZ2F0ZS0+
Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQobV93ZWJWaWV3LCBpdGVtLT5yZWxlYXNlUGxhdGZvcm1E
ZXNjcmlwdGlvbigpLCBwcm9wZXJ0eUJhZy5nZXQoKSk7CisgICAgCisgICAgTUVOVUlURU1JTkZP
IGl0ZW1JbmZvOworICAgIENvbnRleHRNZW51SXRlbTo6bmF0aXZlTWVudUl0ZW0oaXRlbS0+cmVs
ZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKSwgJml0ZW1JbmZvKTsKKyAgICB1aURlbGVnYXRlLT5j
b250ZXh0TWVudUl0ZW1TZWxlY3RlZChtX3dlYlZpZXcsICZpdGVtSW5mbywgcHJvcGVydHlCYWcu
Z2V0KCkpOwogfQogCiB2b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50Ojpkb3dubG9hZFVSTChjb25z
dCBLVVJMJiB1cmwpCkluZGV4OiBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRN
ZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJD
b250ZXh0TWVudUNsaWVudC5oCShyZXZpc2lvbiA3MzUzNikKKysrIFdlYktpdC93aW4vV2ViQ29y
ZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMjQsNiAr
MjQsNyBAQAogICovCiAKICNpbmNsdWRlIDxXZWJDb3JlL0NvbnRleHRNZW51Q2xpZW50Lmg+Cisj
aW5jbHVkZSA8V2ViQ29yZS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbi5oPgogI2luY2x1ZGUgPHd0
Zi9Gb3J3YXJkLmg+CiAKIGNsYXNzIFdlYlZpZXc7CkBAIC0zNCw3ICszNSw3IEBAIHB1YmxpYzoK
IAogICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudURlc3Ryb3llZCgpOwogCi0gICAgdmlydHVh
bCBITUVOVSBnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcyhXZWJDb3JlOjpDb250ZXh0TWVu
dSopOworICAgIHZpcnR1YWwgV2ViQ29yZTo6UGxhdGZvcm1NZW51RGVzY3JpcHRpb24gZ2V0Q3Vz
dG9tTWVudUZyb21EZWZhdWx0SXRlbXMoV2ViQ29yZTo6Q29udGV4dE1lbnUqKTsKICAgICB2aXJ0
dWFsIHZvaWQgY29udGV4dE1lbnVJdGVtU2VsZWN0ZWQoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVt
KiwgY29uc3QgV2ViQ29yZTo6Q29udGV4dE1lbnUqKTsKICAgICAKICAgICB2aXJ0dWFsIHZvaWQg
ZG93bmxvYWRVUkwoY29uc3QgV2ViQ29yZTo6S1VSTCYpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>75952</attachid>
            <date>2010-12-08 13:05:49 -0800</date>
            <delta_ts>2010-12-09 10:13:00 -0800</delta_ts>
            <desc>[PATCH] Context Menu Refactoring - Reordered Functions</desc>
            <filename>context_menu_refactoring_win.patch</filename>
            <type>text/plain</type>
            <size>32356</size>
            <attacher name="Brian Weinstein">bweinstein</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MzUzNikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjggQEAKKzIwMTAtMTItMDggIEJyaWFuIFdlaW5zdGVpbiAgPGJ3ZWluc3RlaW5A
YXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFByZXAgd29yayBmb3IgV2ViS2l0MjogQ29udGV4dCBtZW51IHN1cHBvcnQgb24gV2luZG93
cworICAgICAgICA8aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUwNTE0
PgorICAgICAgICAKKyAgICAgICAgUmVmYWN0b3IgQ29udGV4dE1lbnUgdG8gYmUgYmFja2VkIGJ5
IGEgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gaW5zdGVhZCBvZiBhbiBITUVOVSwgCisgICAgICAg
IGFuZCByZWZhY3RvciBDb250ZXh0TWVudUl0ZW0gdG8gYmUgYmFja2VkIGJ5IGEgc3RydWN0IGNv
bnRhaW5pbmcgdGhlIGluZm9ybWF0aW9uIHRoYXQKKyAgICAgICAgaXMgbmVlZGVkIGluIGEgQ29u
dGV4dE1lbnVJdGVtIChhY3Rpb24sIHR5cGUsIHRpdGxlLCBzdWJtZW51IGl0ZW1zIChpbiBhIFZl
Y3RvcjxDb250ZXh0TWVudUl0ZW0+KSwKKyAgICAgICAgYW5kIHdoZXRoZXIgb3Igbm90IGl0IGlz
IGVuYWJsZWQgb3IgY2hlY2tlZC4KKyAgICAgICAgCisgICAgICAgIFRoaXMgaXMgbmVjZXNzYXJ5
IHNvIENvbnRleHRNZW51cyBhbmQgQ29udGV4dE1lbnVJdGVtcyBjYW4gYmUgY29waWVkLCB3aGlj
aCBITUVOVXMgYW5kIE1FTlVJVEVNSU5GT3MKKyAgICAgICAgY291bGRuJ3QgYmUuCisKKyAgICAg
ICAgUmVmYWN0b3JpbmcsIG5vIG5ldyB0ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL0NvbnRl
eHRNZW51Lmg6IEFkZCBzb21lIFdpbmRvd3Mtc3BlY2lmaWMgZnVuY3Rpb25zOiBBIENvbnRleHRN
ZW51IGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYW4gSE1FTlUsCisgICAgICAgICAgICBhIHN0YXRp
YyBmdW5jdGlvbiB0aGF0IHBvcHVsYXRlcyBhbiBITUVOVSBmcm9tIGEgVmVjdG9yIG9mIENvbnRl
eHRNZW51SXRlbXMsIGFuZCBhZGQgYSBuZXcgaW5zdGFuY2UgdmFyaWFibGUKKyAgICAgICAgICAg
IHRoYXQgaXMgYSBsaXN0IG9mIENvbnRleHRNZW51SXRlbXMuCisgICAgICAgICogcGxhdGZvcm0v
Q29udGV4dE1lbnVJdGVtLmg6IEFkZCBzb21lIFdpbmRvd3Mtc3BlY2lmaWMgZnVuY3Rpb25zOiBB
IENvbnRleHRNZW51SXRlbSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgTUVOVUlURU1JTkZPLAor
ICAgICAgICAgICAgYSBzdGF0aWMgZnVuY3Rpb24gdGhhdCBwb3B1bGF0ZXMgYSBNRU5VSVRFTUlO
Rk8gZnJvbSBhIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uLCBhbmQgY2hhbmdlIHRoZSBQbGF0Zm9y
bU1lbnVJdGVtRGVzY3JpcHRpb24KKyAgICAgICAgICAgIHRvIGJlIGEgc3RydWN0IGluc3RlYWQg
b2YgYW4gTFBNRU5VSVRFTUlORk8uCisgICAgICAgIChXZWJDb3JlOjpQbGF0Zm9ybU1lbnVJdGVt
RGVzY3JpcHRpb246OlBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbik6IFVwZGF0ZSB0aGUgdHlw
ZSBmb3IgV2luZG93cy4KKyAgICAgICAgKiBwbGF0Zm9ybS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlv
bi5oOgorCisgICAgICAgICogcGxhdGZvcm0vd2luL0NvbnRleHRNZW51SXRlbVdpbi5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbSk6IEFkZCBh
IG5ldyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGFuIExQTUVOVUlURU1JTkZPLCAKKyAgICAgICAg
ICAgIGFuZCByZWZhY3RvciB0aGUgb3RoZXIgY29uc3RydWN0b3JzIHRvIHBvcHVsYXRlIHRoZSBu
ZXcgZm9ybSBvZiB0aGUgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uLgorICAgICAgICAoV2Vi
Q29yZTo6Q29udGV4dE1lbnVJdGVtOjp+Q29udGV4dE1lbnVJdGVtKTogRG9uJ3QgbmVlZCB0byBk
byBhbnl0aGluZyBpbiB0aGUgZGVzdHJ1Y3RvciBhbnltb3JlLgorICAgICAgICAoV2ViQ29yZTo6
Q29udGV4dE1lbnVJdGVtOjpyZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbik6IFRoZXJlJ3Mgbm90
aGluZyB0byByZWxlYXNlLCBzbyBqdXN0IHJldHVybiB0aGUKKyAgICAgICAgICAgIHBsYXRmb3Jt
IGRlc2NyaXB0aW9uLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRUeXBl
KTogU2ltcGxlIHNldHRlciBvZiB0aGUgbWF0Y2hpbmcgdHlwZSBpbiB0aGUgc3RydWN0LgorICAg
ICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRBY3Rpb24pOiBEaXR0by4KKyAgICAg
ICAgKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6c2V0VGl0bGUpOiBEaXR0by4KKyAgICAgICAg
KFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6c2V0Q2hlY2tlZCk6IERpdHRvLgorICAgICAgICAo
V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRFbmFibGVkKTogRGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnR5cGUpOiBTaW1wbGUgZ2V0dGVyIG9mIHRoZSBtYXRj
aGluZyB0eXBlIGluIHRoZSBzdHJ1Y3QuCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0
ZW06OmFjdGlvbik6RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnRp
dGxlKTogRGl0dG8uICAKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6Y2hlY2tl
ZCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjplbmFibGVkKTog
RGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnBsYXRmb3JtU3ViTWVu
dSk6IFJldHVybiB0aGUgbWVudSdzIHN1Ym1lbnUgaXRlbXMuCisgICAgICAgIChXZWJDb3JlOjpD
b250ZXh0TWVudUl0ZW06OnNldFN1Yk1lbnUpOiBTZXQgdGhlIHN1Ym1lbnUgaWYgd2Ugd2VyZSBw
YXNzZWQgaW4gYSBzdWJtZW51LCBpZiBub3QsIAorICAgICAgICAgICAgY2xlYXIgaXQuIFRoaXMg
ZnVuY3Rpb24gYWxzbyB1cGRhdGVzIHRoZSB0eXBlIGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IHdl
IHdlcmUgcGFzc2VkIGluIGEgc3VibWVudS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51
SXRlbTo6bmF0aXZlTWVudUl0ZW0pOiBQb3B1bGF0ZXMgYSBuYXRpdmUgbWVudSBpdGVtIChhbiBM
UE1FTlVJVEVNSU5GTykgYmFzZWQgb24gdGhlCisgICAgICAgICAgICBQbGF0Zm9ybU1lbnVJdGVt
RGVzY3JpcHRpb24gdGhhdCB3YXMgcGFzc2VkIGluLgorCisgICAgICAgICogcGxhdGZvcm0vd2lu
L0NvbnRleHRNZW51V2luLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjpDb250
ZXh0TWVudSk6IEFkZCBhIG5ldyBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGFuIEhNRU5VLCBhbmQg
cmVmYWN0b3IgdGhlIG90aGVycyB0byAKKyAgICAgICAgICAgIHNldCB1cCBtX2l0ZW1zIGluc3Rl
YWQgb2YgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1l
bnU6On5Db250ZXh0TWVudSk6IERvbnQndCBuZWVkIHRvIGRvIGFueXRoaW5nIGluIHRoZSBjb25z
dHJ1Y3RvciBhbnltb3JlLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6Oml0ZW1Db3Vu
dCk6IFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgdmVjdG9yLgorICAgICAgICAoV2ViQ29yZTo6Q29u
dGV4dE1lbnU6Omluc2VydEl0ZW0pOiBJbnNlcnQgdGhlIGl0ZW0gaW50byB0aGUgdmVjdG9yLgor
ICAgICAgICAoV2ViQ29yZTo6aXRlbVdpdGhBY3Rpb25Jbk1lbnUpOiBSZWN1cnNpdmVseSBzZWFy
Y2hlcyBtZW51cyBmb3IgYSBtZW51IGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gYWN0aW9uIChkaXZlcyBp
bnRvIHN1Ym1lbnVzKS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjppdGVtV2l0aEFj
dGlvbik6IENhbGxzIHRocm91Z2ggdG8gaXRlbVdpdGhBY3Rpb25Jbk1lbnUuCisgICAgICAgIChX
ZWJDb3JlOjpDb250ZXh0TWVudTo6aXRlbUF0SW5kZXgpOiBHZXRzIHRoZSBpdGVtIGluIHRoZSB2
ZWN0b3Igd2l0aCB0aGUgcGFzc2VkIGluIGluZGV4LgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4
dE1lbnU6OnNldFBsYXRmb3JtRGVzY3JpcHRpb24pOiBDbGVhcnMgdGhlIGl0ZW1zIHZlY3RvciBh
bmQgcmUtcG9wdWxhdGVzIGl0IGZyb20gdGhlIHZlY3RvciB0aGF0IHdhcyBwYXNzZWQgaW4uIAor
ICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6OnBsYXRmb3JtRGVzY3JpcHRpb24pOiBDcmVh
dGVzIGEgbmV3IHZlY3RvciwgcG9wdWxhdGVzIGl0IGZyb20gdGhlIG1faXRlbXMgdmVjdG9yLCBh
bmQgcmV0dXJucyBpdC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjpyZWxlYXNlUGxh
dGZvcm1EZXNjcmlwdGlvbik6IENyZWF0ZXMgYSBuZXcgdmVjdG9yLCBwb3B1bGF0ZXMgaXQgZnJv
bSB0aGUgbV9pdGVtcyB2ZWN0b3IsIGFuZCBjbGVhcnMgbV9pdGVtcworICAgICAgICAgICAgYW5k
IHJldHVybnMgdGhlIG5ld2x5IGNyZWF0ZWQgdmVjdG9yLgorICAgICAgICAoV2ViQ29yZTo6Q29u
dGV4dE1lbnU6Om5hdGl2ZU1lbnUpOiBQb3B1bGF0ZXMgYSBuYXRpdmUgbWVudSAoYW4gSE1FTlUp
IGJhc2VkIG9uIHRoZSBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiB0aGF0IHdhcyBwYXNzZWQgaW4u
CisgICAgICAgIChXZWJDb3JlOjpjb250ZXh0TWVudUl0ZW1WZWN0b3IpOiBDcmVhdGVzIGEgdmVj
dG9yIG9mIENvbnRleHRNZW51SXRlbXMsIHBvcHVsYXRlIGl0IHdpdGggd2hhdCB3YXMgcGFzc2Vk
IGluIHRoZSB2ZWN0b3IuIAorICAgICAgICAoV2ViQ29yZTo6cGxhdGZvcm1NZW51RGVzY3JpcHRp
b24pOiBDcmVhdGVzIGEgbmV3IHZlY3RvciBvZiBDb250ZXh0TWVudUl0ZW1zLCBwb3B1bGF0ZSBp
dCB3aXRoIHdoYXQgd2FzIGluIHRoZSBwYXNzZWQgaW4gdGhlIHZlY3Rvci4KKwogMjAxMC0xMi0w
NyAgQnJpYW4gV2VpbnN0ZWluICA8YndlaW5zdGVpbkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgSm9obiBTdWxsaXZhbi4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1l
bnUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51LmgJKHJldmlz
aW9uIDczNTM2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudS5oCSh3b3JraW5nIGNv
cHkpCkBAIC00OSwxMiArNDksMTYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIHB1YmxpYzoK
ICAgICAgICAgQ29udGV4dE1lbnUoKTsKICAgICAgICAgQ29udGV4dE1lbnUoY29uc3QgUGxhdGZv
cm1NZW51RGVzY3JpcHRpb24pOworI2lmIFBMQVRGT1JNKFdJTikKKyAgICAgICAgQ29udGV4dE1l
bnUoSE1FTlUpOworI2VuZGlmCiAgICAgICAgIH5Db250ZXh0TWVudSgpOwogCiAgICAgICAgIHZv
aWQgaW5zZXJ0SXRlbSh1bnNpZ25lZCBwb3NpdGlvbiwgQ29udGV4dE1lbnVJdGVtJik7CiAgICAg
ICAgIHZvaWQgYXBwZW5kSXRlbShDb250ZXh0TWVudUl0ZW0mKTsKICAgICAgICAgCiAgICAgICAg
IENvbnRleHRNZW51SXRlbSogaXRlbVdpdGhBY3Rpb24odW5zaWduZWQpOworICAgICAgICBDb250
ZXh0TWVudUl0ZW0qIGl0ZW1BdEluZGV4KHVuc2lnbmVkKTsKICAgICAgICAgQ29udGV4dE1lbnVJ
dGVtKiBpdGVtQXRJbmRleCh1bnNpZ25lZCwgY29uc3QgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24p
OwogCiAgICAgICAgIHVuc2lnbmVkIGl0ZW1Db3VudCgpIGNvbnN0OwpAQCAtNjYsNiArNzAsOSBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAjaWYgUExBVEZPUk0oV1gpCiAgICAgICAgIHN0YXRpYyBD
b250ZXh0TWVudUl0ZW0qIGl0ZW1XaXRoSWQoaW50KTsKICNlbmRpZgorI2lmIFBMQVRGT1JNKFdJ
TikKKyAgICAgICAgc3RhdGljIHZvaWQgbmF0aXZlTWVudShQbGF0Zm9ybU1lbnVEZXNjcmlwdGlv
biwgSE1FTlUpOworI2VuZGlmCiAgICAgcHJpdmF0ZToKICNpZiBQTEFURk9STShNQUMpCiAgICAg
ICAgIC8vIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggdGhlIFBsYXRmb3JtTWVudURlc2NyaXB0aW9u
IHR5cGVkZWYKQEAgLTc0LDYgKzgxLDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBR
TGlzdDxDb250ZXh0TWVudUl0ZW0+IG1faXRlbXM7CiAjZWxpZiBQTEFURk9STShDSFJPTUlVTSkK
ICAgICAgICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gbV9pdGVtczsKKyNlbGlmIFBMQVRGT1JN
KFdJTikKKyAgICAgICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gbV9pdGVtczsKICNlbGlmIFBM
QVRGT1JNKEVGTCkKICAgICAgICAgQ29udGV4dE1lbnVDbGllbnRFZmwqIG1fY29udGV4dE1lbnVD
bGllbnQ7CiAgICAgICAgIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIG1fcGxhdGZvcm1EZXNjcmlw
dGlvbjsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnVJdGVtLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudUl0ZW0uaAkocmV2aXNpb24gNzM1MzYp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51SXRlbS5oCSh3b3JraW5nIGNvcHkpCkBA
IC0xNjcsNyArMTY3LDIwIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICNpZiBQTEFURk9STShNQUMp
CiAgICAgdHlwZWRlZiBOU01lbnVJdGVtKiBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb247CiAj
ZWxpZiBQTEFURk9STShXSU4pCi0gICAgdHlwZWRlZiBMUE1FTlVJVEVNSU5GTyBQbGF0Zm9ybU1l
bnVJdGVtRGVzY3JpcHRpb247CisgICAgc3RydWN0IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlv
biB7CisgICAgICAgIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbigpCisgICAgICAgICAgICA6
IHR5cGUoQWN0aW9uVHlwZSkKKyAgICAgICAgICAgICwgYWN0aW9uKENvbnRleHRNZW51SXRlbVRh
Z05vQWN0aW9uKQorICAgICAgICAgICAgLCB0aXRsZSgiIikKKyAgICAgICAgICAgICwgY2hlY2tl
ZChmYWxzZSkKKyAgICAgICAgICAgICwgZW5hYmxlZCh0cnVlKSB7IH0KKyAgICAgICAgQ29udGV4
dE1lbnVJdGVtVHlwZSB0eXBlOworICAgICAgICBDb250ZXh0TWVudUFjdGlvbiBhY3Rpb247Cisg
ICAgICAgIFN0cmluZyB0aXRsZTsKKyAgICAgICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gc3Vi
TWVudUl0ZW1zOworICAgICAgICBib29sIGNoZWNrZWQ7CisgICAgICAgIGJvb2wgZW5hYmxlZDsK
KyAgICB9OwogI2VsaWYgUExBVEZPUk0oUVQpCiAgICAgc3RydWN0IFBsYXRmb3JtTWVudUl0ZW1E
ZXNjcmlwdGlvbiB7CiAgICAgICAgIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbigpCkBAIC0y
NjMsNiArMjc2LDkgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogI2lmIFBMQVRGT1JNKEdUSykKICAg
ICAgICAgQ29udGV4dE1lbnVJdGVtKEd0a01lbnVJdGVtKik7CiAjZW5kaWYKKyNpZiBQTEFURk9S
TShXSU4pCisgICAgICAgIENvbnRleHRNZW51SXRlbShjb25zdCBMUE1FTlVJVEVNSU5GTyk7Cisj
ZW5kaWYKICAgICAgICAgfkNvbnRleHRNZW51SXRlbSgpOwogCiAgICAgICAgIFBsYXRmb3JtTWVu
dUl0ZW1EZXNjcmlwdGlvbiByZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOwpAQCAtMjkwLDYg
KzMwNiw5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICNpZiBQTEFURk9STShHVEspCiAgICAgICAg
IHN0YXRpYyBHdGtNZW51SXRlbSogY3JlYXRlTmF0aXZlTWVudUl0ZW0oY29uc3QgUGxhdGZvcm1N
ZW51SXRlbURlc2NyaXB0aW9uJik7CiAjZW5kaWYKKyNpZiBQTEFURk9STShXSU4pCisgICAgICAg
IHN0YXRpYyB2b2lkIG5hdGl2ZU1lbnVJdGVtKGNvbnN0IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlw
dGlvbiYsIExQTUVOVUlURU1JTkZPKTsKKyNlbmRpZgogCiAgICAgcHJpdmF0ZToKICNpZiBQTEFU
Rk9STShNQUMpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL1BsYXRmb3JtTWVudURlc2NyaXB0aW9u
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlv
bi5oCShyZXZpc2lvbiA3MzUzNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vUGxhdGZvcm1NZW51RGVz
Y3JpcHRpb24uaAkod29ya2luZyBjb3B5KQpAQCAtMzMsNyArMzMsNyBAQAogY2xhc3MgTlNNdXRh
YmxlQXJyYXk7CiAjZW5kaWYKICNlbGlmIFBMQVRGT1JNKFdJTikKLXR5cGVkZWYgc3RydWN0IEhN
RU5VX18qIEhNRU5VOworI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KICNlbGlmIFBMQVRGT1JNKFFU
KQogI2luY2x1ZGUgPHFsaXN0Lmg+CiAjZWxpZiBQTEFURk9STShHVEspCkBAIC00OSw3ICs0OSw4
IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICNpZiBQTEFURk9STShNQUMpCiAgICAgdHlwZWRlZiBO
U011dGFibGVBcnJheSogUGxhdGZvcm1NZW51RGVzY3JpcHRpb247CiAjZWxpZiBQTEFURk9STShX
SU4pCi0gICAgdHlwZWRlZiBITUVOVSBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbjsKKyAgICBjbGFz
cyBDb250ZXh0TWVudUl0ZW07CisgICAgdHlwZWRlZiBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiog
UGxhdGZvcm1NZW51RGVzY3JpcHRpb247CiAjZWxpZiBQTEFURk9STShRVCkKICAgICBjbGFzcyBD
b250ZXh0TWVudUl0ZW07CiAgICAgdHlwZWRlZiBjb25zdCBRTGlzdDxDb250ZXh0TWVudUl0ZW0+
KiBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbjsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL0Nv
bnRleHRNZW51SXRlbVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4v
Q29udGV4dE1lbnVJdGVtV2luLmNwcAkocmV2aXNpb24gNzM1MzYpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL3dpbi9Db250ZXh0TWVudUl0ZW1XaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsy
Nyw3IEBACiAjaW5jbHVkZSAiQ29udGV4dE1lbnVJdGVtLmgiCiAKICNpbmNsdWRlICJDb250ZXh0
TWVudS5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKIAogI2luY2x1ZGUgPHd0Zi90ZXh0
L0NTdHJpbmcuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CkBAIC00NSwxODEgKzQ2LDE1NiBAQAog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUNvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVt
KExQTUVOVUlURU1JTkZPIGl0ZW0pCi0gICAgOiBtX3BsYXRmb3JtRGVzY3JpcHRpb24oaXRlbSkK
LXsKLX0KLQotQ29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnUqIHN1
Yk1lbnUpCi17Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gKExQTUVOVUlURU1JTkZPKW1h
bGxvYyhzaXplb2YoTUVOVUlURU1JTkZPKSk7Ci0gICAgaWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRp
b24pCi0gICAgICAgIHJldHVybjsKLQotICAgIG1lbXNldChtX3BsYXRmb3JtRGVzY3JpcHRpb24s
IDAsIHNpemVvZihNRU5VSVRFTUlORk8pKTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmNi
U2l6ZSA9IHNpemVvZihNRU5VSVRFTUlORk8pOwotCi0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9u
LT53SUQgPSBDb250ZXh0TWVudUl0ZW1UYWdOb0FjdGlvbjsKLSAgICBpZiAoc3ViTWVudSkgewot
ICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZNYXNrIHw9IE1JSU1fU1VCTUVOVTsKLSAg
ICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5oU3ViTWVudSA9IHN1Yk1lbnUtPnBsYXRmb3Jt
RGVzY3JpcHRpb24oKTsKK0NvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKExQTUVOVUlU
RU1JTkZPIGluZm8pCisgICAgOiBtX3BsYXRmb3JtRGVzY3JpcHRpb24oKQoreyAgIAorICAgIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbi50eXBlID0gaW5mby0+ZlR5cGUgJiBNRlRfU0VQQVJBVE9SID8g
U2VwYXJhdG9yVHlwZSA6IEFjdGlvblR5cGU7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLmFj
dGlvbiA9IHN0YXRpY19jYXN0PENvbnRleHRNZW51QWN0aW9uPihpbmZvLT53SUQpOworICAgIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbi50aXRsZSA9IFN0cmluZyhpbmZvLT5kd1R5cGVEYXRhLCB3Y3Ns
ZW4oaW5mby0+ZHdUeXBlRGF0YSkpOworCisgICAgaWYgKGluZm8tPmhTdWJNZW51KSB7CisgICAg
ICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi50eXBlID0gU3VibWVudVR5cGU7CisgICAgICAgIENv
bnRleHRNZW51IHN1Yk1lbnUoaW5mby0+aFN1Yk1lbnUpOworICAgICAgICBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24uc3ViTWVudUl0ZW1zID0gY29udGV4dE1lbnVJdGVtVmVjdG9yKHN1Yk1lbnUucmVs
ZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKSk7CiAgICAgfQorCisgICAgbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uLmNoZWNrZWQgPSBpbmZvLT5mU3RhdGUgJiBNRlNfQ0hFQ0tFRDsKKyAgICBtX3BsYXRm
b3JtRGVzY3JpcHRpb24uZW5hYmxlZCA9ICEoaW5mby0+ZlN0YXRlICYgTUZTX0RJU0FCTEVEKTsK
IH0KIAogQ29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVJdGVtVHlw
ZSB0eXBlLCBDb250ZXh0TWVudUFjdGlvbiBhY3Rpb24sIGNvbnN0IFN0cmluZyYgdGl0bGUsIENv
bnRleHRNZW51KiBzdWJNZW51KQorICAgIDogbV9wbGF0Zm9ybURlc2NyaXB0aW9uKCkKIHsKLSAg
ICBtX3BsYXRmb3JtRGVzY3JpcHRpb24gPSAoTFBNRU5VSVRFTUlORk8pbWFsbG9jKHNpemVvZihN
RU5VSVRFTUlORk8pKTsKLSAgICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgbWVtc2V0KG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgMCwgc2l6ZW9mKE1F
TlVJVEVNSU5GTykpOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Y2JTaXplID0gc2l6ZW9m
KE1FTlVJVEVNSU5GTyk7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFzayA9IE1JSU1f
RlRZUEU7Ci0KLSAgICBpZiAodHlwZSA9PSBTZXBhcmF0b3JUeXBlKSB7Ci0gICAgICAgIG1fcGxh
dGZvcm1EZXNjcmlwdGlvbi0+ZlR5cGUgPSBNRlRfU0VQQVJBVE9SOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotICAgIAotICAgIGlmIChzdWJNZW51KSB7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNj
cmlwdGlvbi0+Zk1hc2sgfD0gTUlJTV9TVFJJTkcgfCBNSUlNX1NVQk1FTlU7Ci0gICAgICAgIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUgPSBzdWJNZW51LT5wbGF0Zm9ybURlc2NyaXB0
aW9uKCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sg
fD0gTUlJTV9TVFJJTkcgfCBNSUlNX0lEOworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi50eXBl
ID0gdHlwZTsKKyAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24uYWN0aW9uID0gYWN0aW9uOworICAg
IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi50aXRsZSA9IHRpdGxlOwogCi0gICAgbV9wbGF0Zm9ybURl
c2NyaXB0aW9uLT5mVHlwZSA9IE1GVF9TVFJJTkc7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9u
LT53SUQgPSBhY3Rpb247Ci0gICAgCi0gICAgU3RyaW5nIHQgPSB0aXRsZTsKLSAgICBtX3BsYXRm
b3JtRGVzY3JpcHRpb24tPmNjaCA9IHQubGVuZ3RoKCk7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5kd1R5cGVEYXRhID0gd2NzZHVwKHQuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24o
KSk7CisgICAgaWYgKHN1Yk1lbnUpCisgICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi5zdWJN
ZW51SXRlbXMgPSBjb250ZXh0TWVudUl0ZW1WZWN0b3Ioc3ViTWVudS0+cmVsZWFzZVBsYXRmb3Jt
RGVzY3JpcHRpb24oKSk7CisKKyAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24uY2hlY2tlZCA9IGZh
bHNlOworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi5lbmFibGVkID0gdHJ1ZTsKIH0KIAogQ29u
dGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVJdGVtVHlwZSwgQ29udGV4
dE1lbnVBY3Rpb24sIGNvbnN0IFN0cmluZyYsIGJvb2wsIGJvb2wpCisgICAgOiBtX3BsYXRmb3Jt
RGVzY3JpcHRpb24oKQogewogICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQKIH0KIAogQ29udGV4dE1l
bnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVBY3Rpb24sIGNvbnN0IFN0cmluZyYs
IGJvb2wsIGJvb2wsIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JikKKyAgICA6IG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbigpCiB7CiAgICAgLy8gRklYTUU6IEltcGxlbWVudAogfQogCitDb250ZXh0TWVu
dUl0ZW06OkNvbnRleHRNZW51SXRlbShQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24gaXRlbSkK
KyAgICA6IG1fcGxhdGZvcm1EZXNjcmlwdGlvbihpdGVtKQoreworfQorCiBDb250ZXh0TWVudUl0
ZW06On5Db250ZXh0TWVudUl0ZW0oKQogewotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24p
IHsKLSAgICAgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlR5cGUgPT0gTUZUX1NUUklO
RykKLSAgICAgICAgICAgIGZyZWUobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVEYXRhKTsK
LSAgICAgICAgZnJlZShtX3BsYXRmb3JtRGVzY3JpcHRpb24pOwotICAgIH0KIH0KIAotTFBNRU5V
SVRFTUlORk8gQ29udGV4dE1lbnVJdGVtOjpyZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpCitQ
bGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24gQ29udGV4dE1lbnVJdGVtOjpyZWxlYXNlUGxhdGZv
cm1EZXNjcmlwdGlvbigpCiB7Ci0gICAgTFBNRU5VSVRFTUlORk8gaW5mbyA9IG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbjsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24gPSAwOwotICAgIHJldHVybiBp
bmZvOworICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb247CiB9CiAKIENvbnRleHRNZW51
SXRlbVR5cGUgQ29udGV4dE1lbnVJdGVtOjp0eXBlKCkgY29uc3QKIHsKLSAgICBDb250ZXh0TWVu
dUl0ZW1UeXBlIHR5cGUgPSBBY3Rpb25UeXBlOwotICAgIGlmICgoKG1fcGxhdGZvcm1EZXNjcmlw
dGlvbi0+ZlR5cGUgJiB+TUZUX09XTkVSRFJBVykgPT0gTUZUX1NUUklORykgJiYgbV9wbGF0Zm9y
bURlc2NyaXB0aW9uLT5oU3ViTWVudSkKLSAgICAgICAgdHlwZSA9IFN1Ym1lbnVUeXBlOwotICAg
IGVsc2UgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlR5cGUgJiBNRlRfU0VQQVJBVE9SKQot
ICAgICAgICB0eXBlID0gU2VwYXJhdG9yVHlwZTsKLQotICAgIHJldHVybiB0eXBlOworICAgIHJl
dHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb24udHlwZTsKIH0KIAogQ29udGV4dE1lbnVBY3Rpb24g
Q29udGV4dE1lbnVJdGVtOjphY3Rpb24oKSBjb25zdAogeyAKLSAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8Q29udGV4dE1lbnVBY3Rpb24+KG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+d0lEKTsKKyAgICBy
ZXR1cm4gbV9wbGF0Zm9ybURlc2NyaXB0aW9uLmFjdGlvbjsKIH0KIAogU3RyaW5nIENvbnRleHRN
ZW51SXRlbTo6dGl0bGUoKSBjb25zdCAKIHsKLSAgICByZXR1cm4gU3RyaW5nKG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbi0+ZHdUeXBlRGF0YSwgd2NzbGVuKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZHdU
eXBlRGF0YSkpOworICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb24udGl0bGU7CiB9CiAK
LVBsYXRmb3JtTWVudURlc2NyaXB0aW9uIENvbnRleHRNZW51SXRlbTo6cGxhdGZvcm1TdWJNZW51
KCkgY29uc3QKK1ZlY3RvcjxDb250ZXh0TWVudUl0ZW0+KiBDb250ZXh0TWVudUl0ZW06OnBsYXRm
b3JtU3ViTWVudSgpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+
aFN1Yk1lbnU7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmVjdG9yPENvbnRleHRNZW51SXRlbT4q
PigmbV9wbGF0Zm9ybURlc2NyaXB0aW9uLnN1Yk1lbnVJdGVtcyk7CiB9CiAKIHZvaWQgQ29udGV4
dE1lbnVJdGVtOjpzZXRUeXBlKENvbnRleHRNZW51SXRlbVR5cGUgdHlwZSkKIHsKLSAgICBpZiAo
dHlwZSA9PSBTZXBhcmF0b3JUeXBlKQotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZU
eXBlID0gTUZUX1NFUEFSQVRPUjsKLSAgICBlbHNlCi0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlw
dGlvbi0+ZlR5cGUgPSBNRlRfU1RSSU5HOworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi50eXBl
ID0gdHlwZTsKIH0KIAogdm9pZCBDb250ZXh0TWVudUl0ZW06OnNldEFjdGlvbihDb250ZXh0TWVu
dUFjdGlvbiBhY3Rpb24pCiB7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT53SUQgPSBhY3Rp
b247IAorICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi5hY3Rpb24gPSBhY3Rpb247CiB9CiAKIHZv
aWQgQ29udGV4dE1lbnVJdGVtOjpzZXRUaXRsZShjb25zdCBTdHJpbmcmIHRpdGxlKQogewotICAg
IGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEpCi0gICAgICAgIGZyZWUobV9w
bGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVEYXRhKTsKLSAgICAKLSAgICBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPmNjaCA9IHRpdGxlLmxlbmd0aCgpOwotICAgIFN0cmluZyB0aXRsZUNvcHkgPSB0
aXRsZTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEgPSB3Y3NkdXAodGl0
bGVDb3B5LmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOworICAgIG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbi50aXRsZSA9IHRpdGxlOwogfQogCiB2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0
U3ViTWVudShDb250ZXh0TWVudSogc3ViTWVudSkKIHsKLSAgICBpZiAoc3ViTWVudS0+cGxhdGZv
cm1EZXNjcmlwdGlvbigpID09IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51KQot
ICAgICAgICA6OkRlc3Ryb3lNZW51KG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUpOwot
Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFzayB8PSBNSUlNX1NVQk1FTlU7Ci0gICAg
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5oU3ViTWVudSA9IHN1Yk1lbnUtPnJlbGVhc2VQbGF0Zm9y
bURlc2NyaXB0aW9uKCk7CisgICAgaWYgKHN1Yk1lbnUpIHsKKyAgICAgICAgbV9wbGF0Zm9ybURl
c2NyaXB0aW9uLnN1Yk1lbnVJdGVtcyA9IGNvbnRleHRNZW51SXRlbVZlY3RvcihzdWJNZW51LT5y
ZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpKTsKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLnR5cGUgPSBTdWJtZW51VHlwZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3BsYXRmb3Jt
RGVzY3JpcHRpb24uc3ViTWVudUl0ZW1zLmNsZWFyKCk7CisgICAgICAgIG1fcGxhdGZvcm1EZXNj
cmlwdGlvbi50eXBlID0gQWN0aW9uVHlwZTsKKyAgICB9CiB9CiAKLXZvaWQgQ29udGV4dE1lbnVJ
dGVtOjpzZXRTdWJNZW51KFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JikKK3ZvaWQgQ29udGV4dE1l
bnVJdGVtOjpzZXRTdWJNZW51KFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBpdGVtcykKIHsKLSAg
ICAvLyBGSVhNRTogSW1wbGVtZW50CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLnN1Yk1lbnVJ
dGVtcyA9IGl0ZW1zOwogfQogCiB2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0Q2hlY2tlZChib29s
IGNoZWNrZWQpCiB7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFzayB8PSBNSUlNX1NU
QVRFOwotICAgIGlmIChjaGVja2VkKSB7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+
ZlN0YXRlICY9IH5NRlNfVU5DSEVDS0VEOwotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24t
PmZTdGF0ZSB8PSBNRlNfQ0hFQ0tFRDsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BsYXRmb3Jt
RGVzY3JpcHRpb24tPmZTdGF0ZSAmPSB+TUZTX0NIRUNLRUQ7Ci0gICAgICAgIG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbi0+ZlN0YXRlIHw9IE1GU19VTkNIRUNLRUQ7Ci0gICAgfQorICAgIG1fcGxhdGZv
cm1EZXNjcmlwdGlvbi5jaGVja2VkID0gY2hlY2tlZDsKIH0KIAogYm9vbCBDb250ZXh0TWVudUl0
ZW06OmNoZWNrZWQoKSBjb25zdAogewotICAgIC8vIEZJWE1FIC0gSW1wbGVtZW50Ci0gICAgcmV0
dXJuIGZhbHNlOworICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb24uY2hlY2tlZDsKIH0K
IAogdm9pZCBDb250ZXh0TWVudUl0ZW06OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQogewotICAg
IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sgfD0gTUlJTV9TVEFURTsKLSAgICBpZiAoZW5h
YmxlZCkgewotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSAmPSB+TUZTX0RJ
U0FCTEVEOwotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNfRU5B
QkxFRDsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0
ZSAmPSB+TUZTX0VOQUJMRUQ7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlN0YXRl
IHw9IE1GU19ESVNBQkxFRDsKLSAgICB9CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLmVuYWJs
ZWQgPSBlbmFibGVkOwogfQogCiBib29sIENvbnRleHRNZW51SXRlbTo6ZW5hYmxlZCgpIGNvbnN0
CiB7Ci0gICAgcmV0dXJuICEobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJiBNRlNfRElT
QUJMRUQpOworICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb24uZW5hYmxlZDsKK30KKwor
dm9pZCBDb250ZXh0TWVudUl0ZW06Om5hdGl2ZU1lbnVJdGVtKGNvbnN0IFBsYXRmb3JtTWVudUl0
ZW1EZXNjcmlwdGlvbiYgaXRlbSwgTFBNRU5VSVRFTUlORk8gaW5mbykKK3sKKyAgICBtZW1zZXQo
aW5mbywgMCwgc2l6ZW9mKE1FTlVJVEVNSU5GTykpOworICAgIGluZm8tPmNiU2l6ZSA9IHNpemVv
ZihNRU5VSVRFTUlORk8pOworICAgIAorICAgIGluZm8tPmZNYXNrID0gTUlJTV9GVFlQRSB8IE1J
SU1fSUQgfCBNSUlNX1NUUklORyB8IE1JSU1fU1RBVEUgfCBNSUlNX1NVQk1FTlU7CisKKyAgICBp
ZiAoaXRlbS50eXBlID09IFN1Ym1lbnVUeXBlKSB7CisgICAgICAgIEhNRU5VIG5hdGl2ZU1lbnUg
PSA6OkNyZWF0ZVBvcHVwTWVudSgpOworICAgICAgICBDb250ZXh0TWVudTo6bmF0aXZlTWVudShj
b25zdF9jYXN0PFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+Kj4oJml0ZW0uc3ViTWVudUl0ZW1zKSwg
bmF0aXZlTWVudSk7CisgICAgICAgIGluZm8tPmhTdWJNZW51ID0gbmF0aXZlTWVudTsKKyAgICB9
CisKKyAgICBpZiAoaXRlbS50eXBlID09IFNlcGFyYXRvclR5cGUpCisgICAgICAgIGluZm8tPmZU
eXBlID0gTUZUX1NFUEFSQVRPUjsKKyAgICBlbHNlCisgICAgICAgIGluZm8tPmZUeXBlID0gTUZU
X1NUUklORzsKKworICAgIGluZm8tPndJRCA9IGl0ZW0uYWN0aW9uOworCisgICAgaW5mby0+ZlN0
YXRlIHw9IGl0ZW0uZW5hYmxlZCA/IE1GU19FTkFCTEVEIDogTUZTX0RJU0FCTEVEOworICAgIGlu
Zm8tPmZTdGF0ZSB8PSBpdGVtLmNoZWNrZWQgPyBNRlNfQ0hFQ0tFRCA6IE1GU19VTkNIRUNLRUQ7
CiB9CiAKIH0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL0NvbnRleHRNZW51V2luLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9Db250ZXh0TWVudVdpbi5jcHAJKHJl
dmlzaW9uIDczNTM2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ29udGV4dE1lbnVXaW4uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiTm9kZS5oIgogI2lu
Y2x1ZGUgPHRjaGFyLmg+CiAjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0
b3IuaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CiAKICNpZm5kZWYgTUlJTV9GVFlQ
RQpAQCAtNDMsMjggKzQ0LDU1IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorQ29udGV4dE1l
bnU6OkNvbnRleHRNZW51KEhNRU5VIG1lbnUpCisjaWYgT1MoV0lOQ0UpCisgICAgOiBtX2l0ZW1D
b3VudCgwKQorI2VuZGlmCit7CisgICAgaW50IGNvdW50ID0gOjpHZXRNZW51SXRlbUNvdW50KG1l
bnUpOworICAgIGlmIChjb3VudCA8PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKHVu
c2lnbmVkIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBpbnQgbWVudVN0cmluZ0xl
bmd0aCA9IDo6R2V0TWVudVN0cmluZyhtZW51LCBpLCAwLCAwLCBNRl9CWVBPU0lUSU9OKTsKKyAg
ICAgICAgaWYgKCFtZW51U3RyaW5nTGVuZ3RoKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBkb24n
dCBoYXZlIGEgc3RyaW5nLCB0aGVuIHdlIG11c3QgYmUgaW4gYSBzZXBhcmF0b3IuCisgICAgICAg
ICAgICBtX2l0ZW1zLmFwcGVuZChDb250ZXh0TWVudUl0ZW0oU2VwYXJhdG9yVHlwZSwgQ29udGV4
dE1lbnVJdGVtVGFnTm9BY3Rpb24sIFN0cmluZygpKSk7CisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgfQorCisgICAgICAgIExQVFNUUiBtZW51U3RyaW5nID0gbmV3IFdDSEFSW21lbnVT
dHJpbmdMZW5ndGggKyAxXTsKKworICAgICAgICBNRU5VSVRFTUlORk8gaW5mbyA9IHswfTsKKyAg
ICAgICAgaW5mby5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPKTsKKyAgICAgICAgaW5mby5m
TWFzayA9IE1JSU1fRlRZUEUgfCBNSUlNX0lEIHwgTUlJTV9TVFJJTkcgfCBNSUlNX1NUQVRFIHwg
TUlJTV9TVUJNRU5VOworICAgICAgICBpbmZvLmR3VHlwZURhdGEgPSBtZW51U3RyaW5nOworICAg
ICAgICBpbmZvLmNjaCA9IG1lbnVTdHJpbmdMZW5ndGggKyAxOworCisgICAgICAgIGlmICg6Okdl
dE1lbnVJdGVtSW5mbyhtZW51LCBpLCBUUlVFLCAmaW5mbykpCisgICAgICAgICAgIG1faXRlbXMu
YXBwZW5kKENvbnRleHRNZW51SXRlbSgmaW5mbykpOworCisgICAgICAgIGZyZWUobWVudVN0cmlu
Zyk7CisgICAgfQorfQorCiBDb250ZXh0TWVudTo6Q29udGV4dE1lbnUoKQotICAgIDogbV9wbGF0
Zm9ybURlc2NyaXB0aW9uKDApCiAjaWYgT1MoV0lOQ0UpCi0gICAgLCBtX2l0ZW1Db3VudCgwKQor
ICAgIDogbV9pdGVtQ291bnQoMCkKICNlbmRpZgogewotICAgIHNldFBsYXRmb3JtRGVzY3JpcHRp
b24oOjpDcmVhdGVQb3B1cE1lbnUoKSk7CiB9CiAKLUNvbnRleHRNZW51OjpDb250ZXh0TWVudShj
b25zdCBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBtZW51KQotICAgIDogbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uKDApCitDb250ZXh0TWVudTo6Q29udGV4dE1lbnUoY29uc3QgUGxhdGZvcm1NZW51RGVz
Y3JpcHRpb24gZGVzY3JpcHRpb24pCisgICAgOiBtX2l0ZW1zKGNvbnRleHRNZW51SXRlbVZlY3Rv
cihkZXNjcmlwdGlvbikpCiAjaWYgT1MoV0lOQ0UpCiAgICAgLCBtX2l0ZW1Db3VudCgwKQogI2Vu
ZGlmCi17Ci0gICAgc2V0UGxhdGZvcm1EZXNjcmlwdGlvbihtZW51KTsKK3sgICAgCiB9CiAKIENv
bnRleHRNZW51Ojp+Q29udGV4dE1lbnUoKQogewotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRp
b24pCi0gICAgICAgIDo6RGVzdHJveU1lbnUobV9wbGF0Zm9ybURlc2NyaXB0aW9uKTsKIH0KIAog
dW5zaWduZWQgQ29udGV4dE1lbnU6Oml0ZW1Db3VudCgpIGNvbnN0CkBAIC03MiwxMCArMTAwLDcg
QEAgdW5zaWduZWQgQ29udGV4dE1lbnU6Oml0ZW1Db3VudCgpIGNvbnN0CiAjaWYgT1MoV0lOQ0Up
CiAgICAgcmV0dXJuIG1faXRlbUNvdW50OwogI2Vsc2UKLSAgICBpZiAoIW1fcGxhdGZvcm1EZXNj
cmlwdGlvbikKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gOjpHZXRNZW51SXRlbUNv
dW50KG1fcGxhdGZvcm1EZXNjcmlwdGlvbik7CisgICAgcmV0dXJuIG1faXRlbXMuc2l6ZSgpOwog
I2VuZGlmCiB9CiAKQEAgLTExMywxNCArMTM4LDExIEBAIHN0YXRpYyBib29sIGluc2VydE1lbnVJ
dGVtKFBsYXRmb3JtTWVudUQKIAogdm9pZCBDb250ZXh0TWVudTo6aW5zZXJ0SXRlbSh1bnNpZ25l
ZCBpbnQgcG9zaXRpb24sIENvbnRleHRNZW51SXRlbSYgaXRlbSkKIHsKLSAgICBpZiAoIW1fcGxh
dGZvcm1EZXNjcmlwdGlvbikKLSAgICAgICAgcmV0dXJuOwotCiAjaWYgT1MoV0lOQ0UpCiAgICAg
aWYgKGluc2VydE1lbnVJdGVtKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgcG9zaXRpb24sIGl0ZW0p
KQogICAgICAgICArK21faXRlbUNvdW50OwogI2Vsc2UKLSAgICA6Okluc2VydE1lbnVJdGVtKG1f
cGxhdGZvcm1EZXNjcmlwdGlvbiwgcG9zaXRpb24sIFRSVUUsIGl0ZW0ucmVsZWFzZVBsYXRmb3Jt
RGVzY3JpcHRpb24oKSk7CisgICAgbV9pdGVtcy5pbnNlcnQocG9zaXRpb24sIGl0ZW0pOwogI2Vu
ZGlmCiB9CiAKQEAgLTEyOSw5NCArMTUxLDk5IEBAIHZvaWQgQ29udGV4dE1lbnU6OmFwcGVuZEl0
ZW0oQ29udGV4dE1lbnUKICAgICBpbnNlcnRJdGVtKGl0ZW1Db3VudCgpLCBpdGVtKTsKIH0KIAot
c3RhdGljIENvbnRleHRNZW51SXRlbSogY29udGV4dE1lbnVJdGVtQnlJZE9yUG9zaXRpb24oSE1F
TlUgbWVudSwgdW5zaWduZWQgaWQsIEJPT0wgYnlQb3NpdGlvbikKK3N0YXRpYyBDb250ZXh0TWVu
dUl0ZW0qIGl0ZW1XaXRoQWN0aW9uSW5NZW51KHVuc2lnbmVkIGFjdGlvbiwgVmVjdG9yPENvbnRl
eHRNZW51SXRlbT4mIGl0ZW1zKQogewotICAgIGlmICghbWVudSkKLSAgICAgICAgcmV0dXJuIDA7
Ci0gICAgTFBNRU5VSVRFTUlORk8gaW5mbyA9IHN0YXRpY19jYXN0PExQTUVOVUlURU1JTkZPPiht
YWxsb2Moc2l6ZW9mKE1FTlVJVEVNSU5GTykpKTsKLSAgICBpZiAoIWluZm8pCi0gICAgICAgIHJl
dHVybiAwOwotCi0gICAgbWVtc2V0KGluZm8sIDAsIHNpemVvZihNRU5VSVRFTUlORk8pKTsKLQot
ICAgIGluZm8tPmNiU2l6ZSA9IHNpemVvZihNRU5VSVRFTUlORk8pOwotCi0gICAgLy8gU2V0dGlu
ZyBNSUlNX0RBVEEgd2hpY2ggaXMgdXNlZnVsIGZvciBXZWJLaXQgY2xpZW50cyB3aG8gc3RvcmUg
ZGF0YSBpbiB0aGlzIG1lbWJlciBmb3IgdGhlaXIgY3VzdG9tIG1lbnUgaXRlbXMuCi0gICAgaW5m
by0+Zk1hc2sgPSBNSUlNX0ZUWVBFIHwgTUlJTV9JRCB8IE1JSU1fU1RSSU5HIHwgTUlJTV9EQVRB
OwotCi0gICAgaWYgKCE6OkdldE1lbnVJdGVtSW5mbyhtZW51LCBpZCwgYnlQb3NpdGlvbiwgaW5m
bykpIHsKLSAgICAgICAgZnJlZShpbmZvKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0g
ICAgaWYgKGluZm8tPmZUeXBlICYgTUZUX1NUUklORykgewotICAgICAgICBMUFRTVFIgYnVmZmVy
ID0gc3RhdGljX2Nhc3Q8TFBUU1RSPihtYWxsb2MoKytpbmZvLT5jY2ggKiBzaXplb2YoVENIQVIp
KSk7Ci0gICAgICAgIGlmICghYnVmZmVyKSB7Ci0gICAgICAgICAgICBmcmVlKGluZm8pOwotICAg
ICAgICAgICAgcmV0dXJuIDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGl0ZW1zLnNp
emUoKTsgKytpKSB7CisgICAgICAgIGlmIChpdGVtc1tpXS5hY3Rpb24oKSA9PSBhY3Rpb24pCisg
ICAgICAgICAgICByZXR1cm4gJml0ZW1zW2ldOworICAgICAgICBpZiAoaXRlbXNbaV0udHlwZSgp
ID09IFN1Ym1lbnVUeXBlKSB7CisgICAgICAgICAgICBDb250ZXh0TWVudUl0ZW0qIHNlYXJjaFN1
Ym1lbnUgPSBpdGVtV2l0aEFjdGlvbkluTWVudShhY3Rpb24sICppdGVtc1tpXS5wbGF0Zm9ybVN1
Yk1lbnUoKSk7CisgICAgICAgICAgICBpZiAoc2VhcmNoU3VibWVudSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gc2VhcmNoU3VibWVudTsKICAgICAgICAgfQotICAgICAgICBpbmZvLT5kd1R5cGVE
YXRhID0gYnVmZmVyOwotICAgICAgICA6OkdldE1lbnVJdGVtSW5mbyhtZW51LCBpZCwgYnlQb3Np
dGlvbiwgaW5mbyk7CiAgICAgfQogCi0gICAgcmV0dXJuIG5ldyBDb250ZXh0TWVudUl0ZW0oaW5m
byk7CisgICAgcmV0dXJuIDA7CiB9CiAKIENvbnRleHRNZW51SXRlbSogQ29udGV4dE1lbnU6Oml0
ZW1XaXRoQWN0aW9uKHVuc2lnbmVkIGFjdGlvbikKIHsKLSAgICByZXR1cm4gY29udGV4dE1lbnVJ
dGVtQnlJZE9yUG9zaXRpb24obV9wbGF0Zm9ybURlc2NyaXB0aW9uLCBhY3Rpb24sIEZBTFNFKTsK
KyAgICByZXR1cm4gaXRlbVdpdGhBY3Rpb25Jbk1lbnUoYWN0aW9uLCBtX2l0ZW1zKTsKIH0KIAot
Q29udGV4dE1lbnVJdGVtKiBDb250ZXh0TWVudTo6aXRlbUF0SW5kZXgodW5zaWduZWQgaW5kZXgs
IGNvbnN0IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIHBsYXRmb3JtRGVzY3JpcHRpb24pCitDb250
ZXh0TWVudUl0ZW0qIENvbnRleHRNZW51OjppdGVtQXRJbmRleCh1bnNpZ25lZCBpbmRleCkKIHsK
LSAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtQnlJZE9yUG9zaXRpb24ocGxhdGZvcm1EZXNjcmlw
dGlvbiwgaW5kZXgsIFRSVUUpOworICAgIHJldHVybiAmbV9pdGVtc1tpbmRleF07CiB9CiAKLXZv
aWQgQ29udGV4dE1lbnU6OnNldFBsYXRmb3JtRGVzY3JpcHRpb24oSE1FTlUgbWVudSkKK3ZvaWQg
Q29udGV4dE1lbnU6OnNldFBsYXRmb3JtRGVzY3JpcHRpb24oVmVjdG9yPENvbnRleHRNZW51SXRl
bT4qIHBsYXRmb3JtRGVzY3JpcHRpb24pCiB7Ci0gICAgaWYgKG1lbnUgPT0gbV9wbGF0Zm9ybURl
c2NyaXB0aW9uKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgaWYgKG1fcGxhdGZvcm1EZXNj
cmlwdGlvbikKLSAgICAgICAgOjpEZXN0cm95TWVudShtX3BsYXRmb3JtRGVzY3JpcHRpb24pOwor
ICAgIG1faXRlbXMuY2xlYXIoKTsKIAotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IG1lbnU7
Ci0gICAgaWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVybjsKKyAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcGxhdGZvcm1EZXNjcmlwdGlvbi0+c2l6ZSgpOyArK2kp
CisgICAgICAgIG1faXRlbXMuYXBwZW5kKENvbnRleHRNZW51SXRlbShwbGF0Zm9ybURlc2NyaXB0
aW9uLT5hdChpKS5yZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpKSk7Cit9CiAKLSNpZiAhT1Mo
V0lOQ0UpCi0gICAgTUVOVUlORk8gbWVudUluZm8gPSB7MH07Ci0gICAgbWVudUluZm8uY2JTaXpl
ID0gc2l6ZW9mKE1FTlVJTkZPKTsKLSAgICBtZW51SW5mby5mTWFzayA9IE1JTV9TVFlMRTsKLSAg
ICA6OkdldE1lbnVJbmZvKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgJm1lbnVJbmZvKTsKLSAgICBt
ZW51SW5mby5mTWFzayA9IE1JTV9TVFlMRTsKLSAgICBtZW51SW5mby5kd1N0eWxlIHw9IE1OU19O
T1RJRllCWVBPUzsKLSAgICA6OlNldE1lbnVJbmZvKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgJm1l
bnVJbmZvKTsKLSNlbmRpZgorVmVjdG9yPENvbnRleHRNZW51SXRlbT4qIENvbnRleHRNZW51Ojpw
bGF0Zm9ybURlc2NyaXB0aW9uKCkgY29uc3QKK3sKKyAgICBWZWN0b3I8Q29udGV4dE1lbnVJdGVt
PiogaXRlbXMgPSBuZXcgVmVjdG9yPENvbnRleHRNZW51SXRlbT47CisgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IG1faXRlbXMuc2l6ZSgpOyArK2kpCisgICAgICAgIGl0ZW1zLT5hcHBlbmQo
bV9pdGVtc1tpXSk7CisgICAgcmV0dXJuIGl0ZW1zOwogfQogCi1ITUVOVSBDb250ZXh0TWVudTo6
cGxhdGZvcm1EZXNjcmlwdGlvbigpIGNvbnN0CitWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiogQ29u
dGV4dE1lbnU6OnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCkKIHsKLSAgICByZXR1cm4gbV9w
bGF0Zm9ybURlc2NyaXB0aW9uOworICAgIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+KiBpdGVtcyA9
IG5ldyBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgbV9pdGVtcy5zaXplKCk7ICsraSkKKyAgICAgICAgaXRlbXMtPmFwcGVuZChtX2l0ZW1zW2ld
KTsKKworICAgIG1faXRlbXMuY2xlYXIoKTsKKyAgICByZXR1cm4gaXRlbXM7CiB9CiAKLUhNRU5V
IENvbnRleHRNZW51OjpyZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpCit2b2lkIENvbnRleHRN
ZW51OjpuYXRpdmVNZW51KFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+KiBpdGVtcywgSE1FTlUgbWVu
dSkKIHsKLSAgICBITUVOVSBkZXNjcmlwdGlvbiA9IG1fcGxhdGZvcm1EZXNjcmlwdGlvbjsKLSAg
ICBtX3BsYXRmb3JtRGVzY3JpcHRpb24gPSAwOwotICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAg
ICBBU1NFUlRfQVJHKGl0ZW1zLCBpdGVtcyk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0
ZW1zLT5zaXplKCk7ICsraSkgeworICAgICAgICBNRU5VSVRFTUlORk8gbWVudUl0ZW0gPSB7MH07
CisgICAgICAgIG1lbnVJdGVtLmNiU2l6ZSA9IHNpemVvZihtZW51SXRlbSk7CisKKyAgICAgICAg
UGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gaXRlbXMtPmF0KGkpLnJl
bGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCk7CisgICAgICAgIENvbnRleHRNZW51SXRlbTo6bmF0
aXZlTWVudUl0ZW0oZGVzY3JpcHRpb24sICZtZW51SXRlbSk7CisKKyAgICAgICAgV1RGOjpTdHJp
bmcgdGl0bGUgPSBkZXNjcmlwdGlvbi50aXRsZTsKKyAgICAgICAgbWVudUl0ZW0uZHdUeXBlRGF0
YSA9IChMUFdTVFIpIHRpdGxlLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCk7CisgICAg
ICAgIG1lbnVJdGVtLmNjaCA9IHRpdGxlLmxlbmd0aCgpICsgMTsKKworICAgICAgICA6Okluc2Vy
dE1lbnVJdGVtKG1lbnUsIGksIFRSVUUsICZtZW51SXRlbSk7CisgICAgfQogfQogCi1WZWN0b3I8
Q29udGV4dE1lbnVJdGVtPiBjb250ZXh0TWVudUl0ZW1WZWN0b3IoUGxhdGZvcm1NZW51RGVzY3Jp
cHRpb24pCitWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBjb250ZXh0TWVudUl0ZW1WZWN0b3IoVmVj
dG9yPENvbnRleHRNZW51SXRlbT4qIG1lbnUpCiB7Ci0gICAgLy8gRklYTUUgLSBJbXBsZW1lbnQK
LSAgICByZXR1cm4gVmVjdG9yPENvbnRleHRNZW51SXRlbT4oKTsKKyAgICBBU1NFUlRfQVJHKG1l
bnUsIG1lbnUpOworCisgICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gaXRlbXM7CisgICAgaW50
IGNvdW50ID0gbWVudS0+c2l6ZSgpOworICAgIGlmICghY291bnQpCisgICAgICAgIHJldHVybiBp
dGVtczsKKyAgICBpdGVtcy5yZXNlcnZlQ2FwYWNpdHkoY291bnQpOworCisgICAgZm9yICh1bnNp
Z25lZCBpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgICAgIGl0ZW1zLmFwcGVuZChtZW51LT5h
dChpKSk7CisKKyAgICByZXR1cm4gaXRlbXM7CiB9CiAKIFBsYXRmb3JtTWVudURlc2NyaXB0aW9u
IHBsYXRmb3JtTWVudURlc2NyaXB0aW9uKFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBtZW51SXRl
bVZlY3RvcikKIHsKLSAgICAvLyBGSVhNRSAtIEltcGxlbWVudAotICAgIHJldHVybiAwOwotfQor
ICAgIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIHBsYXRmb3JtTWVudSA9IG5ldyBWZWN0b3I8Q29u
dGV4dE1lbnVJdGVtPjsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbWVudUl0ZW1WZWN0
b3Iuc2l6ZSgpOyArK2kpCisgICAgICAgIHBsYXRmb3JtTWVudS0+YXBwZW5kKG1lbnVJdGVtVmVj
dG9yW2ldKTsKKworICAgIHJldHVybiBwbGF0Zm9ybU1lbnU7Cit9IAogCiB9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCkluZGV4OiBXZWJLaXQvd2luL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQvd2luL0NoYW5nZUxvZwkocmV2aXNpb24gNzM1MzYpCisrKyBXZWJLaXQvd2luL0NoYW5nZUxv
Zwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI2IEBACisyMDEwLTEyLTA4ICBCcmlhbiBXZWlu
c3RlaW4gIDxid2VpbnN0ZWluQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBQcmVwIHdvcmsgZm9yIFdlYktpdDI6IENvbnRleHQgbWVu
dSBzdXBwb3J0IG9uIFdpbmRvd3MKKyAgICAgICAgPGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD01MDUxND4KKyAgICAgICAgCisgICAgICAgIFRoZSBXZWJDb3JlIHBhcnQg
b2YgdGhpcyBjaGFuZ2VkIHJlZmFjdG9yZWQgQ29udGV4dE1lbnVzIG9uIFdpbmRvd3MgdG8gYmUg
YmFja2VkIGJ5IGEgCisgICAgICAgIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+IGluc3RlYWQgb2Yg
YW4gSE1FTlUuIFRoaXMgbWVhbnMgdGhhdCBjYWxsZXJzIG9mIHBsYXRmb3JtRGVzY3JpcHRpb24o
KQorICAgICAgICB3ZXJlIGV4cGVjdGluZyBhbiBITUVOVSwgYW5kIG5vdyB0aGV5IGFyZSBnZXR0
aW5nIGEgVmVjdG9yPENvbnRleHRNZW51SXRlbT4qLgorCisgICAgICAgICogV2ViQ29yZVN1cHBv
cnQvV2ViQ29udGV4dE1lbnVDbGllbnQuY3BwOgorICAgICAgICAoV2ViQ29udGV4dE1lbnVDbGll
bnQ6OmdldEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0ZW1zKTogVXBkYXRlIHRoZSByZXR1cm4gdHlw
ZSwgYW5kIGNyZWF0ZSBhbiBITUVOVSwgdGhlbiBwb3B1cGxhdGUKKyAgICAgICAgICAgIGl0IHdp
dGggdGhlIGNvbnRlbnRzIG9mIHRoZSBDb250ZXh0TWVudSBwYXNzZWQgaW4sIGFuZCB1c2UgdGhh
dCBITUVOVSBpbiBmdW5jdGlvbnMgdGhhdCBleHBlY3Qgb25lLgorICAgICAgICAoV2ViQ29udGV4
dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51SXRlbVNlbGVjdGVkKTogQ3JlYXRlIGEgTUVOVUlURU1J
TkZPLCBwb3B1bGF0ZSBpdCBmcm9tIGEgQ29udGV4dE1lbnVJdGVtLCBhbmQgcGFzcworICAgICAg
ICAgICAgdGhhdCBNRU5VSVRFTUlORk8gdG8gZnVuY3Rpb25zIHRoYXQgZXhwZWN0IG9uZS4KKyAg
ICAgICAgKiBXZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oOiBVcGRhdGUgdGhl
IHJldHVybiB0eXBlIG9mIGdldEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0ZW1zLgorICAgICAgICAq
IFdlYlZpZXcuY3BwOgorICAgICAgICAoV2ViVmlldzo6aGFuZGxlQ29udGV4dE1lbnVFdmVudCk6
IENyZWF0ZSBhbiBITUVOVSwgcG9wdWxhdGUgaXQgd2l0aCB0aGUgY29udGVudHMKKyAgICAgICAg
ICAgIG9mIHRoZSBDb250ZXh0TWVudSBwYXNzZWQgaW4sIGFuZCB1c2UgdGhhdCBITUVOVSBpbiB0
aGUgZnVuY3Rpb25zIHRoYXQgZXhwZWN0IG9uZS4KKyAgICAgICAgKFdlYlZpZXc6OnBlcmZvcm1D
b250ZXh0TWVudUFjdGlvbik6IENvbnRleHRNZW51OjppdGVtQXRJbmRleCBkb2Vzbid0IG5lZWQg
YSBwbGF0Zm9ybVJlcHJlc2VudGF0aW9uCisgICAgICAgICAgICBhbnltb3JlLCBpdCBjYW4ganVz
dCB3b3JrIGJhc2VkIG9uIHRoZSBpbmRleCwgc28gb25seSBwYXNzIG9uZSBhcmd1bWVudC4KKwog
MjAxMC0xMi0wNyAgQnJpYW4gV2VpbnN0ZWluICA8YndlaW5zdGVpbkBhcHBsZS5jb20+CiAKICAg
ICAgICAgUmV2aWV3ZWQgYnkgSm9obiBTdWxsaXZhbi4KSW5kZXg6IFdlYktpdC93aW4vV2ViVmll
dy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJWaWV3LmNwcAkocmV2aXNpb24gNzM1
MzYpCisrKyBXZWJLaXQvd2luL1dlYlZpZXcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjc0LDEz
ICsxMjc0LDE2IEBAIGJvb2wgV2ViVmlldzo6aGFuZGxlQ29udGV4dE1lbnVFdmVudChXUEEKICAg
ICBpZiAobV91aURlbGVnYXRlKQogICAgICAgICBtX3VpRGVsZWdhdGUtPmhhc0N1c3RvbU1lbnVJ
bXBsZW1lbnRhdGlvbigmaGFzQ3VzdG9tTWVudXMpOwogCisgICAgSE1FTlUgbWVudSA9IDo6Q3Jl
YXRlUG9wdXBNZW51KCk7CisgICAgQ29udGV4dE1lbnU6Om5hdGl2ZU1lbnUoY29yZU1lbnUtPnBs
YXRmb3JtRGVzY3JpcHRpb24oKSwgbWVudSk7CisKICAgICBpZiAoaGFzQ3VzdG9tTWVudXMpCi0g
ICAgICAgIG1fdWlEZWxlZ2F0ZS0+dHJhY2tDdXN0b21Qb3B1cE1lbnUoKElXZWJWaWV3Kil0aGlz
LCAoT0xFX0hBTkRMRSkoVUxPTkc2NCljb3JlTWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpLCAm
cG9pbnQpOworICAgICAgICBtX3VpRGVsZWdhdGUtPnRyYWNrQ3VzdG9tUG9wdXBNZW51KChJV2Vi
VmlldyopdGhpcywgKE9MRV9IQU5ETEUpKFVMT05HNjQpbWVudSwgJnBvaW50KTsKICAgICBlbHNl
IHsKICAgICAgICAgLy8gU3VycHJpc2luZ2x5LCBUUE1fUklHSFRCVVRUT04gbWVhbnMgdGhhdCBp
dGVtcyBhcmUgc2VsZWN0YWJsZSB3aXRoIGVpdGhlciB0aGUgcmlnaHQgT1IgbGVmdCBtb3VzZSBi
dXR0b24KICAgICAgICAgVUlOVCBmbGFncyA9IFRQTV9SSUdIVEJVVFRPTiB8IFRQTV9UT1BBTElH
TiB8IFRQTV9WRVJQT1NBTklNQVRJT04gfCBUUE1fSE9SSVpPTlRBTAogICAgICAgICAgICAgfCBU
UE1fTEVGVEFMSUdOIHwgVFBNX0hPUlBPU0FOSU1BVElPTjsKLSAgICAgICAgOjpUcmFja1BvcHVw
TWVudUV4KGNvcmVNZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCksIGZsYWdzLCBwb2ludC54LCBw
b2ludC55LCBtX3ZpZXdXaW5kb3csIDApOworICAgICAgICA6OlRyYWNrUG9wdXBNZW51RXgobWVu
dSwgZmxhZ3MsIHBvaW50LngsIHBvaW50LnksIG1fdmlld1dpbmRvdywgMCk7CiAgICAgfQogCiAg
ICAgcmV0dXJuIHRydWU7CkBAIC0xMzU1LDExICsxMzU4LDEwIEBAIHZvaWQgV2ViVmlldzo6cGVy
Zm9ybUNvbnRleHRNZW51QWN0aW9uKFcKICAgICBDb250ZXh0TWVudSogbWVudSA9IG1fcGFnZS0+
Y29udGV4dE1lbnVDb250cm9sbGVyKCktPmNvbnRleHRNZW51KCk7CiAgICAgQVNTRVJUKG1lbnUp
OwogCi0gICAgQ29udGV4dE1lbnVJdGVtKiBpdGVtID0gYnlQb3NpdGlvbiA/IG1lbnUtPml0ZW1B
dEluZGV4KCh1bnNpZ25lZCl3UGFyYW0sIChITUVOVSlsUGFyYW0pIDogbWVudS0+aXRlbVdpdGhB
Y3Rpb24oKENvbnRleHRNZW51QWN0aW9uKXdQYXJhbSk7CisgICAgQ29udGV4dE1lbnVJdGVtKiBp
dGVtID0gYnlQb3NpdGlvbiA/IG1lbnUtPml0ZW1BdEluZGV4KCh1bnNpZ25lZCl3UGFyYW0pIDog
bWVudS0+aXRlbVdpdGhBY3Rpb24oKENvbnRleHRNZW51QWN0aW9uKXdQYXJhbSk7CiAgICAgaWYg
KCFpdGVtKQogICAgICAgICByZXR1cm47CiAgICAgbV9wYWdlLT5jb250ZXh0TWVudUNvbnRyb2xs
ZXIoKS0+Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQoaXRlbSk7Ci0gICAgZGVsZXRlIGl0ZW07CiB9
CiAKIGJvb2wgV2ViVmlldzo6aGFuZGxlTW91c2VFdmVudChVSU5UIG1lc3NhZ2UsIFdQQVJBTSB3
UGFyYW0sIExQQVJBTSBsUGFyYW0pCkluZGV4OiBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dl
YkNvbnRleHRNZW51Q2xpZW50LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYkNvcmVT
dXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmNwcAkocmV2aXNpb24gNzM1MzYpCisrKyBXZWJL
aXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNTUsNyArNTUsNyBAQCB2b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50Ojpjb250ZXh0
TWVudURlCiAgICAgZGVsZXRlIHRoaXM7CiB9CiAKLUhNRU5VIFdlYkNvbnRleHRNZW51Q2xpZW50
OjpnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcyhDb250ZXh0TWVudSogbWVudSkKK1BsYXRm
b3JtTWVudURlc2NyaXB0aW9uIFdlYkNvbnRleHRNZW51Q2xpZW50OjpnZXRDdXN0b21NZW51RnJv
bURlZmF1bHRJdGVtcyhDb250ZXh0TWVudSogbWVudSkKIHsKICAgICBDT01QdHI8SVdlYlVJRGVs
ZWdhdGU+IHVpRGVsZWdhdGU7CiAgICAgaWYgKEZBSUxFRChtX3dlYlZpZXctPnVpRGVsZWdhdGUo
JnVpRGVsZWdhdGUpKSkKQEAgLTY3LDkgKzY3LDEzIEBAIEhNRU5VIFdlYkNvbnRleHRNZW51Q2xp
ZW50OjpnZXRDdXN0b21NZW4KICAgICBDT01QdHI8V2ViRWxlbWVudFByb3BlcnR5QmFnPiBwcm9w
ZXJ0eUJhZzsKICAgICBwcm9wZXJ0eUJhZy5hZG9wdFJlZihXZWJFbGVtZW50UHJvcGVydHlCYWc6
OmNyZWF0ZUluc3RhbmNlKG1fd2ViVmlldy0+cGFnZSgpLT5jb250ZXh0TWVudUNvbnRyb2xsZXIo
KS0+aGl0VGVzdFJlc3VsdCgpKSk7CiAgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gZGVjaWRlIHdo
ZXRoZXIgdG8gZG8gdGhlIGRlZmF1bHQgYmVmb3JlIGNhbGxpbmcgdGhpcyBkZWxlZ2F0ZSBtZXRo
b2QKLSAgICBpZiAoRkFJTEVEKHVpRGVsZWdhdGUtPmNvbnRleHRNZW51SXRlbXNGb3JFbGVtZW50
KG1fd2ViVmlldywgcHJvcGVydHlCYWcuZ2V0KCksIChPTEVfSEFORExFKShVTE9ORzY0KW1lbnUt
PnBsYXRmb3JtRGVzY3JpcHRpb24oKSwgKE9MRV9IQU5ETEUqKSZuZXdNZW51KSkpCisgICAgSE1F
TlUgd2luZG93c01lbnUgPSA6OkNyZWF0ZVBvcHVwTWVudSgpOyAgICAKKyAgICBDb250ZXh0TWVu
dTo6bmF0aXZlTWVudShtZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCksIHdpbmRvd3NNZW51KTsK
KyAgICBpZiAoRkFJTEVEKHVpRGVsZWdhdGUtPmNvbnRleHRNZW51SXRlbXNGb3JFbGVtZW50KG1f
d2ViVmlldywgcHJvcGVydHlCYWcuZ2V0KCksIChPTEVfSEFORExFKShVTE9ORzY0KXdpbmRvd3NN
ZW51LCAoT0xFX0hBTkRMRSopJm5ld01lbnUpKSkKICAgICAgICAgcmV0dXJuIG1lbnUtPnBsYXRm
b3JtRGVzY3JpcHRpb24oKTsKLSAgICByZXR1cm4gbmV3TWVudTsKKworICAgIENvbnRleHRNZW51
IGRlbGVnYXRlTWVudShuZXdNZW51KTsKKyAgICByZXR1cm4gZGVsZWdhdGVNZW51LnJlbGVhc2VQ
bGF0Zm9ybURlc2NyaXB0aW9uKCk7CiB9CiAKIHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmNv
bnRleHRNZW51SXRlbVNlbGVjdGVkKENvbnRleHRNZW51SXRlbSogaXRlbSwgY29uc3QgQ29udGV4
dE1lbnUqIHBhcmVudE1lbnUpCkBAIC04NCw4ICs4OCwxMCBAQCB2b2lkIFdlYkNvbnRleHRNZW51
Q2xpZW50Ojpjb250ZXh0TWVudUl0CiAKICAgICBDT01QdHI8V2ViRWxlbWVudFByb3BlcnR5QmFn
PiBwcm9wZXJ0eUJhZzsKICAgICBwcm9wZXJ0eUJhZy5hZG9wdFJlZihXZWJFbGVtZW50UHJvcGVy
dHlCYWc6OmNyZWF0ZUluc3RhbmNlKG1fd2ViVmlldy0+cGFnZSgpLT5jb250ZXh0TWVudUNvbnRy
b2xsZXIoKS0+aGl0VGVzdFJlc3VsdCgpKSk7Ci0gICAgICAgICAgICAKLSAgICB1aURlbGVnYXRl
LT5jb250ZXh0TWVudUl0ZW1TZWxlY3RlZChtX3dlYlZpZXcsIGl0ZW0tPnJlbGVhc2VQbGF0Zm9y
bURlc2NyaXB0aW9uKCksIHByb3BlcnR5QmFnLmdldCgpKTsKKyAgICAKKyAgICBNRU5VSVRFTUlO
Rk8gaXRlbUluZm87CisgICAgQ29udGV4dE1lbnVJdGVtOjpuYXRpdmVNZW51SXRlbShpdGVtLT5y
ZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpLCAmaXRlbUluZm8pOworICAgIHVpRGVsZWdhdGUt
PmNvbnRleHRNZW51SXRlbVNlbGVjdGVkKG1fd2ViVmlldywgJml0ZW1JbmZvLCBwcm9wZXJ0eUJh
Zy5nZXQoKSk7CiB9CiAKIHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmRvd25sb2FkVVJMKGNv
bnN0IEtVUkwmIHVybCkKSW5kZXg6IFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4
dE1lbnVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dl
YkNvbnRleHRNZW51Q2xpZW50LmgJKHJldmlzaW9uIDczNTM2KQorKysgV2ViS2l0L3dpbi9XZWJD
b3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw2
ICsyNCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPFdlYkNvcmUvQ29udGV4dE1lbnVDbGllbnQuaD4K
KyNpbmNsdWRlIDxXZWJDb3JlL1BsYXRmb3JtTWVudURlc2NyaXB0aW9uLmg+CiAjaW5jbHVkZSA8
d3RmL0ZvcndhcmQuaD4KIAogY2xhc3MgV2ViVmlldzsKQEAgLTM0LDcgKzM1LDcgQEAgcHVibGlj
OgogCiAgICAgdmlydHVhbCB2b2lkIGNvbnRleHRNZW51RGVzdHJveWVkKCk7CiAKLSAgICB2aXJ0
dWFsIEhNRU5VIGdldEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0ZW1zKFdlYkNvcmU6OkNvbnRleHRN
ZW51Kik7CisgICAgdmlydHVhbCBXZWJDb3JlOjpQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBnZXRD
dXN0b21NZW51RnJvbURlZmF1bHRJdGVtcyhXZWJDb3JlOjpDb250ZXh0TWVudSopOwogICAgIHZp
cnR1YWwgdm9pZCBjb250ZXh0TWVudUl0ZW1TZWxlY3RlZChXZWJDb3JlOjpDb250ZXh0TWVudUl0
ZW0qLCBjb25zdCBXZWJDb3JlOjpDb250ZXh0TWVudSopOwogICAgIAogICAgIHZpcnR1YWwgdm9p
ZCBkb3dubG9hZFVSTChjb25zdCBXZWJDb3JlOjpLVVJMJik7Cg==
</data>
<flag name="review"
          id="66806"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76083</attachid>
            <date>2010-12-09 10:13:00 -0800</date>
            <delta_ts>2010-12-09 11:32:57 -0800</delta_ts>
            <desc>[PATCH] WIP Context Menu Cross-Platform Goodness</desc>
            <filename>context_menu_refactoring_win_wip.patch</filename>
            <type>text/plain</type>
            <size>30553</size>
            <attacher name="Brian Weinstein">bweinstein</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkocmV2aXNpb24gNzM1MzYp
CisrKyBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCSh3b3JraW5nIGNvcHkp
CkBAIC0yNTMxNCwxMCArMjUzMTQsMTggQEAKIAkJCQk+CiAJCQk8L0ZpbGU+CiAJCQk8RmlsZQor
CQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cQ29udGV4dE1lbnUuY3BwIgorCQkJCT4KKwkJ
CTwvRmlsZT4KKwkJCTxGaWxlCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxDb250ZXh0
TWVudS5oIgogCQkJCT4KIAkJCTwvRmlsZT4KIAkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIu
LlxwbGF0Zm9ybVxDb250ZXh0TWVudUl0ZW0uY3BwIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxG
aWxlCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxDb250ZXh0TWVudUl0ZW0uaCIKIAkJ
CQk+CiAJCQk8L0ZpbGU+CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51LmNwcAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnUuY3BwCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IkNvbnRleHRNZW51LmgiCisKKyNpZiBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCitDb250ZXh0TWVudTo6Q29udGV4dE1lbnUoKQorewor
fQorCitDb250ZXh0TWVudTo6Q29udGV4dE1lbnUoY29uc3QgVmVjdG9yPENvbnRleHRNZW51SXRl
bT4mIGl0ZW1zKQorICAgIDogbV9pdGVtcyhpdGVtcykgCit7Cit9CisKK0NvbnRleHRNZW51SXRl
bSogQ29udGV4dE1lbnU6Oml0ZW1BdEluZGV4KHVuc2lnbmVkIGluZGV4KQoreworICAgIHJldHVy
biAmKG1faXRlbXNbaW5kZXhdKTsKK30KKworc3RhdGljIENvbnRleHRNZW51SXRlbSogaXRlbVdp
dGhBY3Rpb25Jbk1lbnUodW5zaWduZWQgYWN0aW9uLCBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYg
bWVudSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lbnUuc2l6ZSgpOyArK2kpIHsK
KyAgICAgICAgaWYgKG1lbnVbaV0uYWN0aW9uKCkgPT0gYWN0aW9uKQorICAgICAgICAgICAgcmV0
dXJuICZtZW51W2ldOworICAgICAgICBpZiAobWVudVtpXS50eXBlKCkgPT0gU3VibWVudVR5cGUp
IHsKKyAgICAgICAgICAgIGlmIChDb250ZXh0TWVudUl0ZW0qIHN1Yk1lbnVJdGVtID0gaXRlbVdp
dGhBY3Rpb25Jbk1lbnUoYWN0aW9uLCAqKG1lbnVbaV0ucGxhdGZvcm1TdWJNZW51KCkpKSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gc3ViTWVudUl0ZW07CisgICAgICAgIH0KKworICAgIH0KKyAg
ICByZXR1cm4gMDsKK30KKworQ29udGV4dE1lbnVJdGVtKiBDb250ZXh0TWVudTo6aXRlbVdpdGhB
Y3Rpb24odW5zaWduZWQgYWN0aW9uKQoreworICAgIHJldHVybiBpdGVtV2l0aEFjdGlvbkluTWVu
dShhY3Rpb24sIG1faXRlbXMpOworfQorCit2b2lkIENvbnRleHRNZW51OjpzZXRQbGF0Zm9ybURl
c2NyaXB0aW9uKFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+KiBtZW51SXRlbXMpCit7CisgICAgQVNT
RVJUX0FSRyhtZW51SXRlbXMsIG1lbnVJdGVtcyk7CisKKyAgICBtX2l0ZW1zLmNsZWFyKCk7Cisg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZW51SXRlbXMtPnNpemUoKTsgKytpKSB7CisgICAg
ICAgIG1faXRlbXMuYXBwZW5kKG1lbnVJdGVtcy0+YXQoaSkpOworICAgIH0KK30KKworVmVjdG9y
PENvbnRleHRNZW51SXRlbT4qIENvbnRleHRNZW51OjpwbGF0Zm9ybURlc2NyaXB0aW9uKCkKK3sK
KyAgICAvLyBGSVhNRTogSSdtIG5vdCBzdXJlIHdobyBpcyBzdXBwb3NlZCB0byBmcmVlIHRoaXMg
VmVjdG9yLCBidXQgaWYgSSBqdXN0IHJldHVybiAmbV9pdGVtcywgdGhlbiBJIGdldCBpbnRvIGEg
c3RhdGUKKyAgICAvLyBpbiBzZXRQbGF0Zm9ybURlc2NyaXB0aW9uIHdoZXJlIHRoZSBtZW51SXRl
bXMgPT0gJm1faXRlbXMsIGFuZCB0aGF0IGlzbid0IGEgZ29vZCBzdGF0ZSB0byBiZSBpbi4KKyAg
ICBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiogbWVudUl0ZW1zID0gbmV3IFZlY3RvcjxDb250ZXh0
TWVudUl0ZW0+OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9pdGVtcy5zaXplKCk7ICsr
aSkKKyAgICAgICAgbWVudUl0ZW1zLT5hcHBlbmQobV9pdGVtc1tpXSk7CisgICAgcmV0dXJuIG1l
bnVJdGVtczsKK30KKworVmVjdG9yPENvbnRleHRNZW51SXRlbT4gY29udGV4dE1lbnVJdGVtVmVj
dG9yKFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+KiBtZW51KQoreworICAgIEFTU0VSVF9BUkcobWVu
dSwgbWVudSk7CisgICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gaXRlbUxpc3Q7CisKKyAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IG1lbnUtPnNpemUoKTsgKytpKQorICAgICAgICBpdGVtTGlz
dC5hcHBlbmQobWVudS0+YXQoaSkpOworCisgICAgcmV0dXJuIGl0ZW1MaXN0OworfQorCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVY
VF9NRU5VUykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnUuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51LmgJKHJldmlzaW9uIDczNTM2KQorKysg
V2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudS5oCSh3b3JraW5nIGNvcHkpCkBAIC00NiwxNSAr
NDYsMzkgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiAgICAgY2xhc3MgQ29udGV4dE1lbnUgOiBw
dWJsaWMgTm9uY29weWFibGUKICAgICB7CisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRf
TUVOVVMpCisgICAgcHVibGljOgorI2lmIFBMQVRGT1JNKFdJTikKKyAgICAgICAgdHlwZWRlZiBI
TUVOVSBOYXRpdmVNZW51VHlwZTsKKyNlbmRpZgorICAgICAgICBDb250ZXh0TWVudSgpOworICAg
ICAgICBDb250ZXh0TWVudShjb25zdCBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYpOworICAgICAg
ICBDb250ZXh0TWVudShOYXRpdmVNZW51VHlwZSk7CisKKyAgICAgICAgTmF0aXZlTWVudVR5cGUg
bmF0aXZlTWVudSgpOworCisgICAgICAgIENvbnRleHRNZW51SXRlbSogaXRlbVdpdGhBY3Rpb24o
dW5zaWduZWQpOworICAgICAgICBDb250ZXh0TWVudUl0ZW0qIGl0ZW1BdEluZGV4KHVuc2lnbmVk
KTsKKworICAgICAgICB2b2lkIHNldFBsYXRmb3JtRGVzY3JpcHRpb24oUGxhdGZvcm1NZW51RGVz
Y3JpcHRpb24pOworICAgICAgICBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBwbGF0Zm9ybURlc2Ny
aXB0aW9uKCk7CisKKyAgICAgICAgdm9pZCBhcHBlbmRJdGVtKGNvbnN0IENvbnRleHRNZW51SXRl
bSYgaXRlbSkgeyBtX2l0ZW1zLmFwcGVuZChpdGVtKTsgfSAKKworICAgIHByaXZhdGU6CisgICAg
ICAgIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+IG1faXRlbXM7CisjZWxzZQogICAgIHB1YmxpYzoK
ICAgICAgICAgQ29udGV4dE1lbnUoKTsKICAgICAgICAgQ29udGV4dE1lbnUoY29uc3QgUGxhdGZv
cm1NZW51RGVzY3JpcHRpb24pOworCiAgICAgICAgIH5Db250ZXh0TWVudSgpOwogCiAgICAgICAg
IHZvaWQgaW5zZXJ0SXRlbSh1bnNpZ25lZCBwb3NpdGlvbiwgQ29udGV4dE1lbnVJdGVtJik7CiAg
ICAgICAgIHZvaWQgYXBwZW5kSXRlbShDb250ZXh0TWVudUl0ZW0mKTsKICAgICAgICAgCiAgICAg
ICAgIENvbnRleHRNZW51SXRlbSogaXRlbVdpdGhBY3Rpb24odW5zaWduZWQpOworICAgICAgICBD
b250ZXh0TWVudUl0ZW0qIGl0ZW1BdEluZGV4KHVuc2lnbmVkKTsKICAgICAgICAgQ29udGV4dE1l
bnVJdGVtKiBpdGVtQXRJbmRleCh1bnNpZ25lZCwgY29uc3QgUGxhdGZvcm1NZW51RGVzY3JpcHRp
b24pOwogCiAgICAgICAgIHVuc2lnbmVkIGl0ZW1Db3VudCgpIGNvbnN0OwpAQCAtODMsNiArMTA3
LDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB1bnNpZ25lZCBtX2l0ZW1Db3VudDsK
ICNlbmRpZgogI2VuZGlmCisKKyNlbmRpZiAvLyBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9N
RU5VUykKICAgICB9OwogCiBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBjb250ZXh0TWVudUl0ZW1W
ZWN0b3IoUGxhdGZvcm1NZW51RGVzY3JpcHRpb24pOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9D
b250ZXh0TWVudUl0ZW0uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4
dE1lbnVJdGVtLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1l
bnVJdGVtLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJ
QlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElU
UyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDb250ZXh0TWVudUl0ZW0uaCIKKworI2luY2x1
ZGUgIkNvbnRleHRNZW51LmgiCisKKyNpZiBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5V
UykKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitDb250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51
SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUsIENvbnRleHRNZW51QWN0aW9uIGFjdGlvbiwg
Y29uc3QgU3RyaW5nJiB0aXRsZSwgQ29udGV4dE1lbnUqIHN1Yk1lbnUpCisgICAgOiBtX3R5cGUo
dHlwZSkKKyAgICAsIG1fYWN0aW9uKGFjdGlvbikKKyAgICAsIG1fdGl0bGUodGl0bGUpCisgICAg
LCBtX2VuYWJsZWQodHJ1ZSkKKyAgICAsIG1fY2hlY2tlZChmYWxzZSkKK3sKKyAgICBzZXRTdWJN
ZW51KHN1Yk1lbnUpOworfQorCitDb250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250
ZXh0TWVudUl0ZW1UeXBlIHR5cGUsIENvbnRleHRNZW51QWN0aW9uIGFjdGlvbiwgY29uc3QgU3Ry
aW5nJiB0aXRsZSwgYm9vbCBlbmFibGVkLCBib29sIGNoZWNrZWQpCisgICAgOiBtX3R5cGUodHlw
ZSkKKyAgICAsIG1fYWN0aW9uKGFjdGlvbikKKyAgICAsIG1fdGl0bGUodGl0bGUpCisgICAgLCBt
X2VuYWJsZWQoZW5hYmxlZCkKKyAgICAsIG1fY2hlY2tlZChjaGVja2VkKQoreworfQorICAgICAg
ICAKK0NvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51QWN0aW9uIGFj
dGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgYm9vbCBlbmFibGVkLCBib29sIGNoZWNrZWQsIFZl
Y3RvcjxDb250ZXh0TWVudUl0ZW0+IHN1Yk1lbnVJdGVtcykKKyAgICA6IG1fdHlwZShTdWJtZW51
VHlwZSkKKyAgICAsIG1fYWN0aW9uKGFjdGlvbikKKyAgICAsIG1fdGl0bGUodGl0bGUpCisgICAg
LCBtX2VuYWJsZWQoZW5hYmxlZCkKKyAgICAsIG1fY2hlY2tlZChjaGVja2VkKQorICAgICwgbV9z
dWJNZW51SXRlbXMoc3ViTWVudUl0ZW1zKQoreworfQorCitDb250ZXh0TWVudUl0ZW06On5Db250
ZXh0TWVudUl0ZW0oKQoreworfQorCit2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0U3ViTWVudShD
b250ZXh0TWVudSogc3ViTWVudSkKK3sKKyAgICBpZiAoc3ViTWVudSkgeworICAgICAgICBtX3R5
cGUgPSBTdWJtZW51VHlwZTsKKyAgICAgICAgbV9zdWJNZW51SXRlbXMgPSBjb250ZXh0TWVudUl0
ZW1WZWN0b3Ioc3ViTWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpKTsKKyAgICB9IGVsc2Ugewor
ICAgICAgICBtX3R5cGUgPSBBY3Rpb25UeXBlOworICAgICAgICBtX3N1Yk1lbnVJdGVtcy5jbGVh
cigpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNF
KENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL0Nv
bnRleHRNZW51SXRlbS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1l
bnVJdGVtLmgJKHJldmlzaW9uIDczNTM2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVu
dUl0ZW0uaAkod29ya2luZyBjb3B5KQpAQCAtNDAsNyArNDAsNyBAQAogY2xhc3MgTlNNZW51SXRl
bTsKICNlbmRpZgogI2VsaWYgUExBVEZPUk0oV0lOKQotdHlwZWRlZiBzdHJ1Y3QgdGFnTUVOVUlU
RU1JTkZPVyogTFBNRU5VSVRFTUlORk87Cit0eXBlZGVmIHN0cnVjdCB0YWdNRU5VSVRFTUlORk9X
IE1FTlVJVEVNSU5GTzsKICNlbGlmIFBMQVRGT1JNKEdUSykKIHR5cGVkZWYgc3RydWN0IF9HdGtN
ZW51SXRlbSBHdGtNZW51SXRlbTsKICNlbGlmIFBMQVRGT1JNKFFUKQpAQCAtMTY0LDEwICsxNjQs
OSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgICAgIFN1Ym1lbnVUeXBlCiAgICAgfTsKIAor
CiAjaWYgUExBVEZPUk0oTUFDKQogICAgIHR5cGVkZWYgTlNNZW51SXRlbSogUGxhdGZvcm1NZW51
SXRlbURlc2NyaXB0aW9uOwotI2VsaWYgUExBVEZPUk0oV0lOKQotICAgIHR5cGVkZWYgTFBNRU5V
SVRFTUlORk8gUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uOwogI2VsaWYgUExBVEZPUk0oUVQp
CiAgICAgc3RydWN0IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbiB7CiAgICAgICAgIFBsYXRm
b3JtTWVudUl0ZW1EZXNjcmlwdGlvbigpCkBAIC0yNTMsNiArMjUyLDQ1IEBAIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKICNlbmRpZgogCiAgICAgY2xhc3MgQ29udGV4dE1lbnVJdGVtIDogcHVibGljIEZh
c3RBbGxvY0Jhc2UgeworI2lmIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQorICAg
IHB1YmxpYzoKKyNpZiBQTEFURk9STShXSU4pCisgICAgICAgIHR5cGVkZWYgTUVOVUlURU1JTkZP
IE5hdGl2ZUl0ZW1UeXBlOworI2VuZGlmCisgICAgICAgIENvbnRleHRNZW51SXRlbShDb250ZXh0
TWVudUl0ZW1UeXBlLCBDb250ZXh0TWVudUFjdGlvbiwgY29uc3QgU3RyaW5nJiwgQ29udGV4dE1l
bnUqIHN1Yk1lbnUgPSAwKTsKKyAgICAgICAgQ29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51SXRl
bVR5cGUsIENvbnRleHRNZW51QWN0aW9uLCBjb25zdCBTdHJpbmcmLCBib29sIGVuYWJsZWQsIGJv
b2wgY2hlY2tlZCk7CisgICAgICAgIENvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUFjdGlvbiwg
Y29uc3QgU3RyaW5nJiwgYm9vbCBlbmFibGVkLCBib29sIGNoZWNrZWQsIFZlY3RvcjxDb250ZXh0
TWVudUl0ZW0+IHN1Yk1lbnVJdGVtcyk7CisgICAgICAgIENvbnRleHRNZW51SXRlbShOYXRpdmVJ
dGVtVHlwZSk7CisKKyAgICAgICAgTmF0aXZlSXRlbVR5cGUgbmF0aXZlTWVudUl0ZW0oKTsKKwor
ICAgICAgICBDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7
IH0KKyAgICAgICAgdm9pZCBzZXRUeXBlKENvbnRleHRNZW51SXRlbVR5cGUgdHlwZSkgeyBtX3R5
cGUgPSB0eXBlOyB9CisKKyAgICAgICAgQ29udGV4dE1lbnVBY3Rpb24gYWN0aW9uKCkgY29uc3Qg
eyByZXR1cm4gbV9hY3Rpb247IH0KKyAgICAgICAgdm9pZCBzZXRBY3Rpb24oQ29udGV4dE1lbnVB
Y3Rpb24gYWN0aW9uKSB7IG1fYWN0aW9uID0gYWN0aW9uOyB9CisKKyAgICAgICAgU3RyaW5nIHRp
dGxlKCkgY29uc3QgeyByZXR1cm4gbV90aXRsZTsgfQorICAgICAgICB2b2lkIHNldFRpdGxlKGNv
bnN0IFN0cmluZyYgdGl0bGUpIHsgbV90aXRsZSA9IHRpdGxlOyB9CisKKyAgICAgICAgYm9vbCBj
aGVja2VkKCkgY29uc3QgeyByZXR1cm4gbV9jaGVja2VkOyB9CisgICAgICAgIHZvaWQgc2V0Q2hl
Y2tlZChib29sIGNoZWNrZWQgPSB0cnVlKSB7IG1fY2hlY2tlZCA9IGNoZWNrZWQ7IH0KKworICAg
ICAgICBib29sIGVuYWJsZWQoKSBjb25zdCB7IHJldHVybiBtX2VuYWJsZWQ7IH0KKyAgICAgICAg
dm9pZCBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCA9IHRydWUpIHsgbV9lbmFibGVkID0gZW5hYmxl
ZDsgfQorCisgICAgICAgIHZvaWQgc2V0U3ViTWVudShDb250ZXh0TWVudSopOworICAgICAgICBQ
bGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBwbGF0Zm9ybVN1Yk1lbnUoKSB7IHJldHVybiAmbV9zdWJN
ZW51SXRlbXM7IH0KKworICAgICAgICB+Q29udGV4dE1lbnVJdGVtKCk7CisgICAgcHJpdmF0ZToK
KyAgICAgICAgU3RyaW5nIG1fdGl0bGU7CisgICAgICAgIGJvb2wgbV9lbmFibGVkOworICAgICAg
ICBib29sIG1fY2hlY2tlZDsKKyAgICAgICAgQ29udGV4dE1lbnVBY3Rpb24gbV9hY3Rpb247Cisg
ICAgICAgIENvbnRleHRNZW51SXRlbVR5cGUgbV90eXBlOworICAgICAgICBWZWN0b3I8Q29udGV4
dE1lbnVJdGVtPiBtX3N1Yk1lbnVJdGVtczsKKyNlbHNlCiAgICAgcHVibGljOgogICAgICAgICBD
b250ZXh0TWVudUl0ZW0oUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uKTsKICAgICAgICAgQ29u
dGV4dE1lbnVJdGVtKENvbnRleHRNZW51KiBzdWJNZW51ID0gMCk7CkBAIC0yOTcsNiArMzM1LDcg
QEAgbmFtZXNwYWNlIFdlYkNvcmUgewogI2Vsc2UKICAgICAgICAgUGxhdGZvcm1NZW51SXRlbURl
c2NyaXB0aW9uIG1fcGxhdGZvcm1EZXNjcmlwdGlvbjsKICNlbmRpZgorI2VuZGlmIC8vIFVTRShD
Uk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQogICAgIH07CiAKIH0KSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vUGxhdGZvcm1NZW51RGVzY3JpcHRpb24uaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL1BsYXRmb3JtTWVudURlc2NyaXB0aW9uLmgJKHJldmlzaW9uIDczNTM2KQorKysg
V2ViQ29yZS9wbGF0Zm9ybS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbi5oCSh3b3JraW5nIGNvcHkp
CkBAIC0yNiw2ICsyNiwxMCBAQAogI2lmbmRlZiBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbl9oCiAj
ZGVmaW5lIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uX2gKIAorI2lmIFVTRShDUk9TU19QTEFURk9S
TV9DT05URVhUX01FTlVTKQorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNlbmRpZgorCiAjaWYg
UExBVEZPUk0oTUFDKQogI2lmZGVmIF9fT0JKQ19fCiBAY2xhc3MgTlNNdXRhYmxlQXJyYXk7CkBA
IC0zMyw3ICszNyw3IEBACiBjbGFzcyBOU011dGFibGVBcnJheTsKICNlbmRpZgogI2VsaWYgUExB
VEZPUk0oV0lOKQotdHlwZWRlZiBzdHJ1Y3QgSE1FTlVfXyogSE1FTlU7CisjaW5jbHVkZSA8d3Rm
L1ZlY3Rvci5oPgogI2VsaWYgUExBVEZPUk0oUVQpCiAjaW5jbHVkZSA8cWxpc3QuaD4KICNlbGlm
IFBMQVRGT1JNKEdUSykKQEAgLTQ2LDEwICs1MCwxMiBAQCBjbGFzcyBCTWVudTsKIAogbmFtZXNw
YWNlIFdlYkNvcmUgewogCisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCisg
ICAgY2xhc3MgQ29udGV4dE1lbnVJdGVtOworICAgIHR5cGVkZWYgVmVjdG9yPENvbnRleHRNZW51
SXRlbT4qIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uOworI2Vsc2UKICNpZiBQTEFURk9STShNQUMp
CiAgICAgdHlwZWRlZiBOU011dGFibGVBcnJheSogUGxhdGZvcm1NZW51RGVzY3JpcHRpb247Ci0j
ZWxpZiBQTEFURk9STShXSU4pCi0gICAgdHlwZWRlZiBITUVOVSBQbGF0Zm9ybU1lbnVEZXNjcmlw
dGlvbjsKICNlbGlmIFBMQVRGT1JNKFFUKQogICAgIGNsYXNzIENvbnRleHRNZW51SXRlbTsKICAg
ICB0eXBlZGVmIGNvbnN0IFFMaXN0PENvbnRleHRNZW51SXRlbT4qIFBsYXRmb3JtTWVudURlc2Ny
aXB0aW9uOwpAQCAtNjIsNiArNjgsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAjZWxzZQogICAg
IHR5cGVkZWYgdm9pZCogUGxhdGZvcm1NZW51RGVzY3JpcHRpb247CiAjZW5kaWYKKyNlbmRpZiAv
LyBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKIAogfSAvLyBuYW1lc3BhY2UKIApJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ29udGV4dE1lbnVJdGVtV2luLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9Db250ZXh0TWVudUl0ZW1XaW4uY3BwCShyZXZp
c2lvbiA3MzUzNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL0NvbnRleHRNZW51SXRlbVdpbi5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJDb250ZXh0TWVu
dUl0ZW0uaCIKIAogI2luY2x1ZGUgIkNvbnRleHRNZW51LmgiCisjaW5jbHVkZSAiSGl0VGVzdFJl
c3VsdC5oIgogCiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogI2luY2x1ZGUgPHdpbmRv
d3MuaD4KQEAgLTQ1LDE4MSArNDYsNDYgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1Db250
ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShMUE1FTlVJVEVNSU5GTyBpdGVtKQotICAgIDog
bV9wbGF0Zm9ybURlc2NyaXB0aW9uKGl0ZW0pCi17Ci19Ci0KLUNvbnRleHRNZW51SXRlbTo6Q29u
dGV4dE1lbnVJdGVtKENvbnRleHRNZW51KiBzdWJNZW51KQotewotICAgIG1fcGxhdGZvcm1EZXNj
cmlwdGlvbiA9IChMUE1FTlVJVEVNSU5GTyltYWxsb2Moc2l6ZW9mKE1FTlVJVEVNSU5GTykpOwot
ICAgIGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICByZXR1cm47Ci0KLSAgICBt
ZW1zZXQobV9wbGF0Zm9ybURlc2NyaXB0aW9uLCAwLCBzaXplb2YoTUVOVUlURU1JTkZPKSk7Ci0g
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPKTsK
LQotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+d0lEID0gQ29udGV4dE1lbnVJdGVtVGFnTm9B
Y3Rpb247Ci0gICAgaWYgKHN1Yk1lbnUpIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9u
LT5mTWFzayB8PSBNSUlNX1NVQk1FTlU7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+
aFN1Yk1lbnUgPSBzdWJNZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCk7Ci0gICAgfQotfQotCi1D
b250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUs
IENvbnRleHRNZW51QWN0aW9uIGFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ29udGV4dE1l
bnUqIHN1Yk1lbnUpCi17Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gKExQTUVOVUlURU1J
TkZPKW1hbGxvYyhzaXplb2YoTUVOVUlURU1JTkZPKSk7Ci0gICAgaWYgKCFtX3BsYXRmb3JtRGVz
Y3JpcHRpb24pCi0gICAgICAgIHJldHVybjsKLQotICAgIG1lbXNldChtX3BsYXRmb3JtRGVzY3Jp
cHRpb24sIDAsIHNpemVvZihNRU5VSVRFTUlORk8pKTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRp
b24tPmNiU2l6ZSA9IHNpemVvZihNRU5VSVRFTUlORk8pOwotICAgIG1fcGxhdGZvcm1EZXNjcmlw
dGlvbi0+Zk1hc2sgPSBNSUlNX0ZUWVBFOwotCi0gICAgaWYgKHR5cGUgPT0gU2VwYXJhdG9yVHlw
ZSkgewotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZUeXBlID0gTUZUX1NFUEFSQVRP
UjsKLSAgICAgICAgcmV0dXJuOworQ29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oTUVO
VUlURU1JTkZPIGluZm8pCit7ICAgCisgICAgbV90eXBlID0gaW5mby5mVHlwZSAmIE1GVF9TRVBB
UkFUT1IgPyBTZXBhcmF0b3JUeXBlIDogQWN0aW9uVHlwZTsKKyAgICBtX2FjdGlvbiA9IHN0YXRp
Y19jYXN0PENvbnRleHRNZW51QWN0aW9uPihpbmZvLndJRCk7CisgICAgbV90aXRsZSA9IFN0cmlu
ZyhpbmZvLmR3VHlwZURhdGEsIHdjc2xlbihpbmZvLmR3VHlwZURhdGEpKTsKKworICAgIGlmIChp
bmZvLmhTdWJNZW51KSB7CisgICAgICAgIG1fdHlwZSA9IFN1Ym1lbnVUeXBlOworICAgICAgICBD
b250ZXh0TWVudSBzdWJNZW51KGluZm8uaFN1Yk1lbnUpOworICAgICAgICBtX3N1Yk1lbnVJdGVt
cyA9IGNvbnRleHRNZW51SXRlbVZlY3RvcihzdWJNZW51LnBsYXRmb3JtRGVzY3JpcHRpb24oKSk7
CiAgICAgfQotICAgIAotICAgIGlmIChzdWJNZW51KSB7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNj
cmlwdGlvbi0+Zk1hc2sgfD0gTUlJTV9TVFJJTkcgfCBNSUlNX1NVQk1FTlU7Ci0gICAgICAgIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUgPSBzdWJNZW51LT5wbGF0Zm9ybURlc2NyaXB0
aW9uKCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sg
fD0gTUlJTV9TVFJJTkcgfCBNSUlNX0lEOwotCi0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5m
VHlwZSA9IE1GVF9TVFJJTkc7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT53SUQgPSBhY3Rp
b247Ci0gICAgCi0gICAgU3RyaW5nIHQgPSB0aXRsZTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRp
b24tPmNjaCA9IHQubGVuZ3RoKCk7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVE
YXRhID0gd2NzZHVwKHQuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSk7Ci19CiAKLUNv
bnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51SXRlbVR5cGUsIENvbnRl
eHRNZW51QWN0aW9uLCBjb25zdCBTdHJpbmcmLCBib29sLCBib29sKQotewotICAgIC8vIEZJWE1F
OiBJbXBsZW1lbnQKLX0KLQotQ29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4
dE1lbnVBY3Rpb24sIGNvbnN0IFN0cmluZyYsIGJvb2wsIGJvb2wsIFZlY3RvcjxDb250ZXh0TWVu
dUl0ZW0+JikKLXsKLSAgICAvLyBGSVhNRTogSW1wbGVtZW50CisgICAgbV9jaGVja2VkID0gaW5m
by5mU3RhdGUgJiBNRlNfQ0hFQ0tFRDsKKyAgICBtX2VuYWJsZWQgPSAhKGluZm8uZlN0YXRlICYg
TUZTX0RJU0FCTEVEKTsKIH0KIAotQ29udGV4dE1lbnVJdGVtOjp+Q29udGV4dE1lbnVJdGVtKCkK
K01FTlVJVEVNSU5GTyBDb250ZXh0TWVudUl0ZW06Om5hdGl2ZU1lbnVJdGVtKCkKIHsKLSAgICBp
ZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKSB7Ci0gICAgICAgIGlmIChtX3BsYXRmb3JtRGVzY3Jp
cHRpb24tPmZUeXBlID09IE1GVF9TVFJJTkcpCi0gICAgICAgICAgICBmcmVlKG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbi0+ZHdUeXBlRGF0YSk7Ci0gICAgICAgIGZyZWUobV9wbGF0Zm9ybURlc2NyaXB0
aW9uKTsKLSAgICB9Ci19Ci0KLUxQTUVOVUlURU1JTkZPIENvbnRleHRNZW51SXRlbTo6cmVsZWFz
ZVBsYXRmb3JtRGVzY3JpcHRpb24oKQotewotICAgIExQTUVOVUlURU1JTkZPIGluZm8gPSBtX3Bs
YXRmb3JtRGVzY3JpcHRpb247Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gMDsKLSAgICBy
ZXR1cm4gaW5mbzsKLX0KLQotQ29udGV4dE1lbnVJdGVtVHlwZSBDb250ZXh0TWVudUl0ZW06OnR5
cGUoKSBjb25zdAotewotICAgIENvbnRleHRNZW51SXRlbVR5cGUgdHlwZSA9IEFjdGlvblR5cGU7
Ci0gICAgaWYgKCgobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSAmIH5NRlRfT1dORVJEUkFX
KSA9PSBNRlRfU1RSSU5HKSAmJiBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51KQotICAg
ICAgICB0eXBlID0gU3VibWVudVR5cGU7Ci0gICAgZWxzZSBpZiAobV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5mVHlwZSAmIE1GVF9TRVBBUkFUT1IpCi0gICAgICAgIHR5cGUgPSBTZXBhcmF0b3JUeXBl
OwotCi0gICAgcmV0dXJuIHR5cGU7Ci19Ci0KLUNvbnRleHRNZW51QWN0aW9uIENvbnRleHRNZW51
SXRlbTo6YWN0aW9uKCkgY29uc3QKLXsgCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENvbnRleHRN
ZW51QWN0aW9uPihtX3BsYXRmb3JtRGVzY3JpcHRpb24tPndJRCk7Ci19Ci0KLVN0cmluZyBDb250
ZXh0TWVudUl0ZW06OnRpdGxlKCkgY29uc3QgCi17Ci0gICAgcmV0dXJuIFN0cmluZyhtX3BsYXRm
b3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEsIHdjc2xlbihtX3BsYXRmb3JtRGVzY3JpcHRpb24t
PmR3VHlwZURhdGEpKTsKLX0KLQotUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gQ29udGV4dE1lbnVJ
dGVtOjpwbGF0Zm9ybVN1Yk1lbnUoKSBjb25zdAotewotICAgIHJldHVybiBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPmhTdWJNZW51OwotfQotCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VHlwZShD
b250ZXh0TWVudUl0ZW1UeXBlIHR5cGUpCi17Ci0gICAgaWYgKHR5cGUgPT0gU2VwYXJhdG9yVHlw
ZSkKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSA9IE1GVF9TRVBBUkFUT1I7
Ci0gICAgZWxzZQotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZUeXBlID0gTUZUX1NU
UklORzsKLX0KLQotdm9pZCBDb250ZXh0TWVudUl0ZW06OnNldEFjdGlvbihDb250ZXh0TWVudUFj
dGlvbiBhY3Rpb24pCi17Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT53SUQgPSBhY3Rpb247
IAotfQotCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VGl0bGUoY29uc3QgU3RyaW5nJiB0aXRs
ZSkKLXsKLSAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVEYXRhKQotICAgICAg
ICBmcmVlKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZHdUeXBlRGF0YSk7CisgICAgTUVOVUlURU1J
TkZPIGluZm8gPSB7MH07CisgICAgaW5mby5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPKTsK
ICAgICAKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmNjaCA9IHRpdGxlLmxlbmd0aCgpOwot
ICAgIFN0cmluZyB0aXRsZUNvcHkgPSB0aXRsZTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24t
PmR3VHlwZURhdGEgPSB3Y3NkdXAodGl0bGVDb3B5LmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0
aW9uKCkpOwotfQotCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0U3ViTWVudShDb250ZXh0TWVu
dSogc3ViTWVudSkKLXsKLSAgICBpZiAoc3ViTWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpID09
IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUpCi0gICAgICAgIHJldHVybjsKKyAgICBp
bmZvLmZNYXNrID0gTUlJTV9GVFlQRSB8IE1JSU1fSUQgfCBNSUlNX1NUUklORyB8IE1JSU1fU1RB
VEUgfCBNSUlNX1NVQk1FTlU7CiAKLSAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5oU3Vi
TWVudSkKLSAgICAgICAgOjpEZXN0cm95TWVudShtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJN
ZW51KTsKKyAgICBpZiAobV90eXBlID09IFN1Ym1lbnVUeXBlKQorICAgICAgICBpbmZvLmhTdWJN
ZW51ID0gQ29udGV4dE1lbnUobV9zdWJNZW51SXRlbXMpLm5hdGl2ZU1lbnUoKTsKIAotICAgIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sgfD0gTUlJTV9TVUJNRU5VOwotICAgIG1fcGxhdGZv
cm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUgPSBzdWJNZW51LT5yZWxlYXNlUGxhdGZvcm1EZXNjcmlw
dGlvbigpOwotfQorICAgIGlmIChtX3R5cGUgPT0gU2VwYXJhdG9yVHlwZSkKKyAgICAgICAgaW5m
by5mVHlwZSA9IE1GVF9TRVBBUkFUT1I7CisgICAgZWxzZQorICAgICAgICBpbmZvLmZUeXBlID0g
TUZUX1NUUklORzsKIAotdm9pZCBDb250ZXh0TWVudUl0ZW06OnNldFN1Yk1lbnUoVmVjdG9yPENv
bnRleHRNZW51SXRlbT4mKQotewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQKLX0KKyAgICBpbmZv
LmNjaCA9IG1fdGl0bGUubGVuZ3RoKCk7CisgICAgaW5mby5kd1R5cGVEYXRhID0gKExQV1NUUikg
bV90aXRsZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpOwogCi12b2lkIENvbnRleHRN
ZW51SXRlbTo6c2V0Q2hlY2tlZChib29sIGNoZWNrZWQpCi17Ci0gICAgbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uLT5mTWFzayB8PSBNSUlNX1NUQVRFOwotICAgIGlmIChjaGVja2VkKSB7Ci0gICAgICAg
IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlN0YXRlICY9IH5NRlNfVU5DSEVDS0VEOwotICAgICAg
ICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNfQ0hFQ0tFRDsKLSAgICB9IGVs
c2UgewotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSAmPSB+TUZTX0NIRUNL
RUQ7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlN0YXRlIHw9IE1GU19VTkNIRUNL
RUQ7Ci0gICAgfQotfQorICAgIGluZm8ud0lEID0gbV9hY3Rpb247CiAKLWJvb2wgQ29udGV4dE1l
bnVJdGVtOjpjaGVja2VkKCkgY29uc3QKLXsKLSAgICAvLyBGSVhNRSAtIEltcGxlbWVudAotICAg
IHJldHVybiBmYWxzZTsKLX0KKyAgICBpbmZvLmZTdGF0ZSB8PSBtX2VuYWJsZWQgPyBNRlNfRU5B
QkxFRCA6IE1GU19ESVNBQkxFRDsKKyAgICBpbmZvLmZTdGF0ZSB8PSBtX2NoZWNrZWQgPyBNRlNf
Q0hFQ0tFRCA6IE1GU19VTkNIRUNLRUQ7CiAKLXZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRFbmFi
bGVkKGJvb2wgZW5hYmxlZCkKLXsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZNYXNrIHw9
IE1JSU1fU1RBVEU7Ci0gICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uLT5mU3RhdGUgJj0gfk1GU19ESVNBQkxFRDsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uLT5mU3RhdGUgfD0gTUZTX0VOQUJMRUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9w
bGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1GU19FTkFCTEVEOwotICAgICAgICBtX3Bs
YXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNfRElTQUJMRUQ7Ci0gICAgfQotfQotCi1i
b29sIENvbnRleHRNZW51SXRlbTo6ZW5hYmxlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICEobV9w
bGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJiBNRlNfRElTQUJMRUQpOworICAgIHJldHVybiBp
bmZvOwogfQogCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9Db250ZXh0TWVudVdpbi5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ29udGV4dE1lbnVXaW4uY3Bw
CShyZXZpc2lvbiA3MzUzNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL0NvbnRleHRNZW51V2lu
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgIk5vZGUuaCIK
ICNpbmNsdWRlIDx0Y2hhci5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3dGYv
VmVjdG9yLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCiAjaWZuZGVmIE1JSU1f
RlRZUEUKQEAgLTQzLDE4MCArNDQsNDMgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1Db250
ZXh0TWVudTo6Q29udGV4dE1lbnUoKQotICAgIDogbV9wbGF0Zm9ybURlc2NyaXB0aW9uKDApCi0j
aWYgT1MoV0lOQ0UpCi0gICAgLCBtX2l0ZW1Db3VudCgwKQotI2VuZGlmCi17Ci0gICAgc2V0UGxh
dGZvcm1EZXNjcmlwdGlvbig6OkNyZWF0ZVBvcHVwTWVudSgpKTsKLX0KLQotQ29udGV4dE1lbnU6
OkNvbnRleHRNZW51KGNvbnN0IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIG1lbnUpCi0gICAgOiBt
X3BsYXRmb3JtRGVzY3JpcHRpb24oMCkKLSNpZiBPUyhXSU5DRSkKLSAgICAsIG1faXRlbUNvdW50
KDApCi0jZW5kaWYKLXsKLSAgICBzZXRQbGF0Zm9ybURlc2NyaXB0aW9uKG1lbnUpOwotfQotCi1D
b250ZXh0TWVudTo6fkNvbnRleHRNZW51KCkKLXsKLSAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0
aW9uKQotICAgICAgICA6OkRlc3Ryb3lNZW51KG1fcGxhdGZvcm1EZXNjcmlwdGlvbik7Ci19Ci0K
LXVuc2lnbmVkIENvbnRleHRNZW51OjppdGVtQ291bnQoKSBjb25zdAorQ29udGV4dE1lbnU6OkNv
bnRleHRNZW51KEhNRU5VIG1lbnUpCiB7Ci0jaWYgT1MoV0lOQ0UpCi0gICAgcmV0dXJuIG1faXRl
bUNvdW50OwotI2Vsc2UKLSAgICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKLSAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gOjpHZXRNZW51SXRlbUNvdW50KG1fcGxhdGZvcm1EZXNj
cmlwdGlvbik7Ci0jZW5kaWYKLX0KLQotI2lmIE9TKFdJTkNFKQotc3RhdGljIGJvb2wgaW5zZXJ0
TWVudUl0ZW0oUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gbWVudSwgdW5zaWduZWQgaW50IHBvc2l0
aW9uLCBDb250ZXh0TWVudUl0ZW0mIGl0ZW0pCi17Ci0gICAgVUlOVCBmbGFncyA9IE1GX0JZUE9T
SVRJT047Ci0gICAgVUlOVCBuZXdJdGVtID0gMDsKLSAgICBMUENXU1RSIHRpdGxlID0gMDsKLQot
ICAgIGlmIChpdGVtLnR5cGUoKSA9PSBTZXBhcmF0b3JUeXBlKQotICAgICAgICBmbGFncyB8PSBN
Rl9TRVBBUkFUT1I7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZsYWdzIHw9IE1GX1NUUklORzsKLSAg
ICAgICAgZmxhZ3MgfD0gaXRlbS5jaGVja2VkKCkgPyBNRl9DSEVDS0VEIDogTUZfVU5DSEVDS0VE
OwotICAgICAgICBmbGFncyB8PSBpdGVtLmVuYWJsZWQoKSA/IE1GX0VOQUJMRUQgOiBNRl9HUkFZ
RUQ7Ci0KLSAgICAgICAgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0g
aXRlbS5yZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOwotICAgICAgICB0aXRsZSA9IGRlc2Ny
aXB0aW9uLT5kd1R5cGVEYXRhOwotICAgICAgICBkZXNjcmlwdGlvbi0+ZHdUeXBlRGF0YSA9IDA7
Ci0KLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uLT5oU3ViTWVudSkgewotICAgICAgICAgICAgZmxh
Z3MgfD0gTUZfUE9QVVA7Ci0gICAgICAgICAgICBuZXdJdGVtID0gcmVpbnRlcnByZXRfY2FzdDxV
SU5UPihkZXNjcmlwdGlvbi0+aFN1Yk1lbnUpOwotICAgICAgICAgICAgZGVzY3JpcHRpb24tPmhT
dWJNZW51ID0gMDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBuZXdJdGVtID0gZGVzY3Jp
cHRpb24tPndJRDsKLQotICAgICAgICBmcmVlKGRlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gOjpJbnNlcnRNZW51VyhtZW51LCBwb3NpdGlvbiwgZmxhZ3MsIG5ld0l0ZW0sIHRpdGxl
KTsKLX0KLSNlbmRpZgotCi12b2lkIENvbnRleHRNZW51OjppbnNlcnRJdGVtKHVuc2lnbmVkIGlu
dCBwb3NpdGlvbiwgQ29udGV4dE1lbnVJdGVtJiBpdGVtKQotewotICAgIGlmICghbV9wbGF0Zm9y
bURlc2NyaXB0aW9uKQorICAgIGludCBjb3VudCA9IDo6R2V0TWVudUl0ZW1Db3VudChtZW51KTsK
KyAgICBpZiAoY291bnQgPD0gMCkKICAgICAgICAgcmV0dXJuOwogCi0jaWYgT1MoV0lOQ0UpCi0g
ICAgaWYgKGluc2VydE1lbnVJdGVtKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgcG9zaXRpb24sIGl0
ZW0pKQotICAgICAgICArK21faXRlbUNvdW50OwotI2Vsc2UKLSAgICA6Okluc2VydE1lbnVJdGVt
KG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgcG9zaXRpb24sIFRSVUUsIGl0ZW0ucmVsZWFzZVBsYXRm
b3JtRGVzY3JpcHRpb24oKSk7Ci0jZW5kaWYKLX0KLQotdm9pZCBDb250ZXh0TWVudTo6YXBwZW5k
SXRlbShDb250ZXh0TWVudUl0ZW0mIGl0ZW0pCi17Ci0gICAgaW5zZXJ0SXRlbShpdGVtQ291bnQo
KSwgaXRlbSk7Ci19Ci0KLXN0YXRpYyBDb250ZXh0TWVudUl0ZW0qIGNvbnRleHRNZW51SXRlbUJ5
SWRPclBvc2l0aW9uKEhNRU5VIG1lbnUsIHVuc2lnbmVkIGlkLCBCT09MIGJ5UG9zaXRpb24pCi17
Ci0gICAgaWYgKCFtZW51KQotICAgICAgICByZXR1cm4gMDsKLSAgICBMUE1FTlVJVEVNSU5GTyBp
bmZvID0gc3RhdGljX2Nhc3Q8TFBNRU5VSVRFTUlORk8+KG1hbGxvYyhzaXplb2YoTUVOVUlURU1J
TkZPKSkpOwotICAgIGlmICghaW5mbykKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBtZW1zZXQo
aW5mbywgMCwgc2l6ZW9mKE1FTlVJVEVNSU5GTykpOwotCi0gICAgaW5mby0+Y2JTaXplID0gc2l6
ZW9mKE1FTlVJVEVNSU5GTyk7Ci0KLSAgICAvLyBTZXR0aW5nIE1JSU1fREFUQSB3aGljaCBpcyB1
c2VmdWwgZm9yIFdlYktpdCBjbGllbnRzIHdobyBzdG9yZSBkYXRhIGluIHRoaXMgbWVtYmVyIGZv
ciB0aGVpciBjdXN0b20gbWVudSBpdGVtcy4KLSAgICBpbmZvLT5mTWFzayA9IE1JSU1fRlRZUEUg
fCBNSUlNX0lEIHwgTUlJTV9TVFJJTkcgfCBNSUlNX0RBVEE7Ci0KLSAgICBpZiAoITo6R2V0TWVu
dUl0ZW1JbmZvKG1lbnUsIGlkLCBieVBvc2l0aW9uLCBpbmZvKSkgewotICAgICAgICBmcmVlKGlu
Zm8pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoaW5mby0+ZlR5cGUgJiBN
RlRfU1RSSU5HKSB7Ci0gICAgICAgIExQVFNUUiBidWZmZXIgPSBzdGF0aWNfY2FzdDxMUFRTVFI+
KG1hbGxvYygrK2luZm8tPmNjaCAqIHNpemVvZihUQ0hBUikpKTsKLSAgICAgICAgaWYgKCFidWZm
ZXIpIHsKLSAgICAgICAgICAgIGZyZWUoaW5mbyk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBpbnQgbWVu
dVN0cmluZ0xlbmd0aCA9IDo6R2V0TWVudVN0cmluZyhtZW51LCBpLCAwLCAwLCBNRl9CWVBPU0lU
SU9OKTsKKyAgICAgICAgaWYgKCFtZW51U3RyaW5nTGVuZ3RoKSB7CisgICAgICAgICAgICAvLyBJ
ZiB3ZSBkb24ndCBoYXZlIGEgc3RyaW5nLCB0aGVuIHdlIG11c3QgYmUgaW4gYSBzZXBhcmF0b3Iu
CisgICAgICAgICAgICBtX2l0ZW1zLmFwcGVuZChDb250ZXh0TWVudUl0ZW0oU2VwYXJhdG9yVHlw
ZSwgQ29udGV4dE1lbnVJdGVtVGFnTm9BY3Rpb24sIFN0cmluZygpKSk7CisgICAgICAgICAgICBj
b250aW51ZTsKICAgICAgICAgfQotICAgICAgICBpbmZvLT5kd1R5cGVEYXRhID0gYnVmZmVyOwot
ICAgICAgICA6OkdldE1lbnVJdGVtSW5mbyhtZW51LCBpZCwgYnlQb3NpdGlvbiwgaW5mbyk7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIG5ldyBDb250ZXh0TWVudUl0ZW0oaW5mbyk7Ci19CiAKLUNvbnRl
eHRNZW51SXRlbSogQ29udGV4dE1lbnU6Oml0ZW1XaXRoQWN0aW9uKHVuc2lnbmVkIGFjdGlvbikK
LXsKLSAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtQnlJZE9yUG9zaXRpb24obV9wbGF0Zm9ybURl
c2NyaXB0aW9uLCBhY3Rpb24sIEZBTFNFKTsKLX0KKyAgICAgICAgT3duQXJyYXlQdHI8V0NIQVI+
IG1lbnVTdHJpbmcobmV3IFdDSEFSW21lbnVTdHJpbmdMZW5ndGggKyAxXSk7CiAKLUNvbnRleHRN
ZW51SXRlbSogQ29udGV4dE1lbnU6Oml0ZW1BdEluZGV4KHVuc2lnbmVkIGluZGV4LCBjb25zdCBQ
bGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBwbGF0Zm9ybURlc2NyaXB0aW9uKQotewotICAgIHJldHVy
biBjb250ZXh0TWVudUl0ZW1CeUlkT3JQb3NpdGlvbihwbGF0Zm9ybURlc2NyaXB0aW9uLCBpbmRl
eCwgVFJVRSk7Ci19CisgICAgICAgIE1FTlVJVEVNSU5GTyBpbmZvID0gezB9OworICAgICAgICBp
bmZvLmNiU2l6ZSA9IHNpemVvZihNRU5VSVRFTUlORk8pOworICAgICAgICBpbmZvLmZNYXNrID0g
TUlJTV9GVFlQRSB8IE1JSU1fSUQgfCBNSUlNX1NUUklORyB8IE1JSU1fU1RBVEUgfCBNSUlNX1NV
Qk1FTlU7CisgICAgICAgIGluZm8uZHdUeXBlRGF0YSA9IG1lbnVTdHJpbmcuZ2V0KCk7CisgICAg
ICAgIGluZm8uY2NoID0gbWVudVN0cmluZ0xlbmd0aCArIDE7CiAKLXZvaWQgQ29udGV4dE1lbnU6
OnNldFBsYXRmb3JtRGVzY3JpcHRpb24oSE1FTlUgbWVudSkKLXsKLSAgICBpZiAobWVudSA9PSBt
X3BsYXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBpZiAobV9w
bGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICA6OkRlc3Ryb3lNZW51KG1fcGxhdGZvcm1EZXNj
cmlwdGlvbik7Ci0KLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24gPSBtZW51OwotICAgIGlmICgh
bV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICByZXR1cm47Ci0KLSNpZiAhT1MoV0lOQ0Up
Ci0gICAgTUVOVUlORk8gbWVudUluZm8gPSB7MH07Ci0gICAgbWVudUluZm8uY2JTaXplID0gc2l6
ZW9mKE1FTlVJTkZPKTsKLSAgICBtZW51SW5mby5mTWFzayA9IE1JTV9TVFlMRTsKLSAgICA6Okdl
dE1lbnVJbmZvKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgJm1lbnVJbmZvKTsKLSAgICBtZW51SW5m
by5mTWFzayA9IE1JTV9TVFlMRTsKLSAgICBtZW51SW5mby5kd1N0eWxlIHw9IE1OU19OT1RJRllC
WVBPUzsKLSAgICA6OlNldE1lbnVJbmZvKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgJm1lbnVJbmZv
KTsKLSNlbmRpZgotfQotCi1ITUVOVSBDb250ZXh0TWVudTo6cGxhdGZvcm1EZXNjcmlwdGlvbigp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNjcmlwdGlvbjsKKyAgICAgICAgaWYg
KDo6R2V0TWVudUl0ZW1JbmZvKG1lbnUsIGksIFRSVUUsICZpbmZvKSkKKyAgICAgICAgICAgbV9p
dGVtcy5hcHBlbmQoQ29udGV4dE1lbnVJdGVtKGluZm8pKTsKKyAgICB9CiB9CiAKLUhNRU5VIENv
bnRleHRNZW51OjpyZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpCitITUVOVSBDb250ZXh0TWVu
dTo6bmF0aXZlTWVudSgpCiB7Ci0gICAgSE1FTlUgZGVzY3JpcHRpb24gPSBtX3BsYXRmb3JtRGVz
Y3JpcHRpb247Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gMDsKLSAgICByZXR1cm4gZGVz
Y3JpcHRpb247Ci19CisgICAgSE1FTlUgbWVudSA9IDo6Q3JlYXRlUG9wdXBNZW51KCk7CiAKLVZl
Y3RvcjxDb250ZXh0TWVudUl0ZW0+IGNvbnRleHRNZW51SXRlbVZlY3RvcihQbGF0Zm9ybU1lbnVE
ZXNjcmlwdGlvbikKLXsKLSAgICAvLyBGSVhNRSAtIEltcGxlbWVudAotICAgIHJldHVybiBWZWN0
b3I8Q29udGV4dE1lbnVJdGVtPigpOwotfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9pdGVt
cy5zaXplKCk7ICsraSkgeworICAgICAgICBNRU5VSVRFTUlORk8gbWVudUl0ZW0gPSBtX2l0ZW1z
W2ldLm5hdGl2ZU1lbnVJdGVtKCk7CisgICAgICAgIDo6SW5zZXJ0TWVudUl0ZW0obWVudSwgaSwg
VFJVRSwgJm1lbnVJdGVtKTsKKyAgICB9CiAKLVBsYXRmb3JtTWVudURlc2NyaXB0aW9uIHBsYXRm
b3JtTWVudURlc2NyaXB0aW9uKFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBtZW51SXRlbVZlY3Rv
cikKLXsKLSAgICAvLyBGSVhNRSAtIEltcGxlbWVudAotICAgIHJldHVybiAwOworICAgIHJldHVy
biBtZW51OwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJLaXQvd2luL1dl
YlZpZXcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViVmlldy5jcHAJKHJldmlzaW9u
IDczNTM2KQorKysgV2ViS2l0L3dpbi9XZWJWaWV3LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTI3
NSwxMiArMTI3NSwxMiBAQCBib29sIFdlYlZpZXc6OmhhbmRsZUNvbnRleHRNZW51RXZlbnQoV1BB
CiAgICAgICAgIG1fdWlEZWxlZ2F0ZS0+aGFzQ3VzdG9tTWVudUltcGxlbWVudGF0aW9uKCZoYXND
dXN0b21NZW51cyk7CiAKICAgICBpZiAoaGFzQ3VzdG9tTWVudXMpCi0gICAgICAgIG1fdWlEZWxl
Z2F0ZS0+dHJhY2tDdXN0b21Qb3B1cE1lbnUoKElXZWJWaWV3Kil0aGlzLCAoT0xFX0hBTkRMRSko
VUxPTkc2NCljb3JlTWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpLCAmcG9pbnQpOworICAgICAg
ICBtX3VpRGVsZWdhdGUtPnRyYWNrQ3VzdG9tUG9wdXBNZW51KChJV2ViVmlldyopdGhpcywgKE9M
RV9IQU5ETEUpKFVMT05HNjQpY29yZU1lbnUtPm5hdGl2ZU1lbnUoKSwgJnBvaW50KTsKICAgICBl
bHNlIHsKICAgICAgICAgLy8gU3VycHJpc2luZ2x5LCBUUE1fUklHSFRCVVRUT04gbWVhbnMgdGhh
dCBpdGVtcyBhcmUgc2VsZWN0YWJsZSB3aXRoIGVpdGhlciB0aGUgcmlnaHQgT1IgbGVmdCBtb3Vz
ZSBidXR0b24KICAgICAgICAgVUlOVCBmbGFncyA9IFRQTV9SSUdIVEJVVFRPTiB8IFRQTV9UT1BB
TElHTiB8IFRQTV9WRVJQT1NBTklNQVRJT04gfCBUUE1fSE9SSVpPTlRBTAogICAgICAgICAgICAg
fCBUUE1fTEVGVEFMSUdOIHwgVFBNX0hPUlBPU0FOSU1BVElPTjsKLSAgICAgICAgOjpUcmFja1Bv
cHVwTWVudUV4KGNvcmVNZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCksIGZsYWdzLCBwb2ludC54
LCBwb2ludC55LCBtX3ZpZXdXaW5kb3csIDApOworICAgICAgICA6OlRyYWNrUG9wdXBNZW51RXgo
Y29yZU1lbnUtPm5hdGl2ZU1lbnUoKSwgZmxhZ3MsIHBvaW50LngsIHBvaW50LnksIG1fdmlld1dp
bmRvdywgMCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CkBAIC0xMzU1LDExICsxMzU1LDEw
IEBAIHZvaWQgV2ViVmlldzo6cGVyZm9ybUNvbnRleHRNZW51QWN0aW9uKFcKICAgICBDb250ZXh0
TWVudSogbWVudSA9IG1fcGFnZS0+Y29udGV4dE1lbnVDb250cm9sbGVyKCktPmNvbnRleHRNZW51
KCk7CiAgICAgQVNTRVJUKG1lbnUpOwogCi0gICAgQ29udGV4dE1lbnVJdGVtKiBpdGVtID0gYnlQ
b3NpdGlvbiA/IG1lbnUtPml0ZW1BdEluZGV4KCh1bnNpZ25lZCl3UGFyYW0sIChITUVOVSlsUGFy
YW0pIDogbWVudS0+aXRlbVdpdGhBY3Rpb24oKENvbnRleHRNZW51QWN0aW9uKXdQYXJhbSk7Cisg
ICAgQ29udGV4dE1lbnVJdGVtKiBpdGVtID0gYnlQb3NpdGlvbiA/IG1lbnUtPml0ZW1BdEluZGV4
KCh1bnNpZ25lZCl3UGFyYW0pIDogbWVudS0+aXRlbVdpdGhBY3Rpb24oKENvbnRleHRNZW51QWN0
aW9uKXdQYXJhbSk7CiAgICAgaWYgKCFpdGVtKQogICAgICAgICByZXR1cm47CiAgICAgbV9wYWdl
LT5jb250ZXh0TWVudUNvbnRyb2xsZXIoKS0+Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQoaXRlbSk7
Ci0gICAgZGVsZXRlIGl0ZW07CiB9CiAKIGJvb2wgV2ViVmlldzo6aGFuZGxlTW91c2VFdmVudChV
SU5UIG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCkluZGV4OiBXZWJLaXQv
d2luL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmNwcAkocmV2
aXNpb24gNzM1MzYpCisrKyBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51
Q2xpZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTUsNyArNTUsNyBAQCB2b2lkIFdlYkNvbnRl
eHRNZW51Q2xpZW50Ojpjb250ZXh0TWVudURlCiAgICAgZGVsZXRlIHRoaXM7CiB9CiAKLUhNRU5V
IFdlYkNvbnRleHRNZW51Q2xpZW50OjpnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcyhDb250
ZXh0TWVudSogbWVudSkKK1dlYkNvcmU6OlBsYXRmb3JtTWVudURlc2NyaXB0aW9uIFdlYkNvbnRl
eHRNZW51Q2xpZW50OjpnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcyhDb250ZXh0TWVudSog
bWVudSkKIHsKICAgICBDT01QdHI8SVdlYlVJRGVsZWdhdGU+IHVpRGVsZWdhdGU7CiAgICAgaWYg
KEZBSUxFRChtX3dlYlZpZXctPnVpRGVsZWdhdGUoJnVpRGVsZWdhdGUpKSkKQEAgLTYzLDEzICs2
MywxNCBAQCBITUVOVSBXZWJDb250ZXh0TWVudUNsaWVudDo6Z2V0Q3VzdG9tTWVuCiAKICAgICBB
U1NFUlQodWlEZWxlZ2F0ZSk7CiAKLSAgICBITUVOVSBuZXdNZW51ID0gMDsKKyAgICBITUVOVSBu
ZXdNZW51ID0gbWVudS0+bmF0aXZlTWVudSgpOwogICAgIENPTVB0cjxXZWJFbGVtZW50UHJvcGVy
dHlCYWc+IHByb3BlcnR5QmFnOwogICAgIHByb3BlcnR5QmFnLmFkb3B0UmVmKFdlYkVsZW1lbnRQ
cm9wZXJ0eUJhZzo6Y3JlYXRlSW5zdGFuY2UobV93ZWJWaWV3LT5wYWdlKCktPmNvbnRleHRNZW51
Q29udHJvbGxlcigpLT5oaXRUZXN0UmVzdWx0KCkpKTsKICAgICAvLyBGSVhNRTogV2UgbmVlZCB0
byBkZWNpZGUgd2hldGhlciB0byBkbyB0aGUgZGVmYXVsdCBiZWZvcmUgY2FsbGluZyB0aGlzIGRl
bGVnYXRlIG1ldGhvZAotICAgIGlmIChGQUlMRUQodWlEZWxlZ2F0ZS0+Y29udGV4dE1lbnVJdGVt
c0ZvckVsZW1lbnQobV93ZWJWaWV3LCBwcm9wZXJ0eUJhZy5nZXQoKSwgKE9MRV9IQU5ETEUpKFVM
T05HNjQpbWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpLCAoT0xFX0hBTkRMRSopJm5ld01lbnUp
KSkKKyAgICBpZiAoRkFJTEVEKHVpRGVsZWdhdGUtPmNvbnRleHRNZW51SXRlbXNGb3JFbGVtZW50
KG1fd2ViVmlldywgcHJvcGVydHlCYWcuZ2V0KCksIChPTEVfSEFORExFKShVTE9ORzY0KW5ld01l
bnUsIChPTEVfSEFORExFKikmbmV3TWVudSkpKQogICAgICAgICByZXR1cm4gbWVudS0+cGxhdGZv
cm1EZXNjcmlwdGlvbigpOwotICAgIHJldHVybiBuZXdNZW51OworICAgIAorICAgIHJldHVybiBD
b250ZXh0TWVudShuZXdNZW51KS5wbGF0Zm9ybURlc2NyaXB0aW9uKCk7CiB9CiAKIHZvaWQgV2Vi
Q29udGV4dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51SXRlbVNlbGVjdGVkKENvbnRleHRNZW51SXRl
bSogaXRlbSwgY29uc3QgQ29udGV4dE1lbnUqIHBhcmVudE1lbnUpCkBAIC04NCw4ICs4NSw5IEBA
IHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51SXQKIAogICAgIENPTVB0cjxX
ZWJFbGVtZW50UHJvcGVydHlCYWc+IHByb3BlcnR5QmFnOwogICAgIHByb3BlcnR5QmFnLmFkb3B0
UmVmKFdlYkVsZW1lbnRQcm9wZXJ0eUJhZzo6Y3JlYXRlSW5zdGFuY2UobV93ZWJWaWV3LT5wYWdl
KCktPmNvbnRleHRNZW51Q29udHJvbGxlcigpLT5oaXRUZXN0UmVzdWx0KCkpKTsKLSAgICAgICAg
ICAgIAotICAgIHVpRGVsZWdhdGUtPmNvbnRleHRNZW51SXRlbVNlbGVjdGVkKG1fd2ViVmlldywg
aXRlbS0+cmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKSwgcHJvcGVydHlCYWcuZ2V0KCkpOwor
CisgICAgTUVOVUlURU1JTkZPIHNlbGVjdGVkSXRlbSA9IGl0ZW0tPm5hdGl2ZU1lbnVJdGVtKCk7
CisgICAgdWlEZWxlZ2F0ZS0+Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQobV93ZWJWaWV3LCAmc2Vs
ZWN0ZWRJdGVtLCBwcm9wZXJ0eUJhZy5nZXQoKSk7CiB9CiAKIHZvaWQgV2ViQ29udGV4dE1lbnVD
bGllbnQ6OmRvd25sb2FkVVJMKGNvbnN0IEtVUkwmIHVybCkKSW5kZXg6IFdlYktpdC93aW4vV2Vi
Q29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQv
d2luL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmgJKHJldmlzaW9uIDczNTM2
KQorKysgV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oCSh3
b3JraW5nIGNvcHkpCkBAIC0yNCw2ICsyNCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPFdlYkNvcmUv
Q29udGV4dE1lbnVDbGllbnQuaD4KKyNpbmNsdWRlIDxXZWJDb3JlL1BsYXRmb3JtTWVudURlc2Ny
aXB0aW9uLmg+CiAjaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4KIAogY2xhc3MgV2ViVmlldzsKQEAg
LTM0LDcgKzM1LDcgQEAgcHVibGljOgogCiAgICAgdmlydHVhbCB2b2lkIGNvbnRleHRNZW51RGVz
dHJveWVkKCk7CiAKLSAgICB2aXJ0dWFsIEhNRU5VIGdldEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0
ZW1zKFdlYkNvcmU6OkNvbnRleHRNZW51Kik7CisgICAgdmlydHVhbCBXZWJDb3JlOjpQbGF0Zm9y
bU1lbnVEZXNjcmlwdGlvbiBnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcyhXZWJDb3JlOjpD
b250ZXh0TWVudSopOwogICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudUl0ZW1TZWxlY3RlZChX
ZWJDb3JlOjpDb250ZXh0TWVudUl0ZW0qLCBjb25zdCBXZWJDb3JlOjpDb250ZXh0TWVudSopOwog
ICAgIAogICAgIHZpcnR1YWwgdm9pZCBkb3dubG9hZFVSTChjb25zdCBXZWJDb3JlOjpLVVJMJik7
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76099</attachid>
            <date>2010-12-09 11:32:57 -0800</date>
            <delta_ts>2010-12-09 12:13:27 -0800</delta_ts>
            <desc>[PATCH] More WIP Goodness</desc>
            <filename>context_menu_refactoring_win_wip.patch</filename>
            <type>text/plain</type>
            <size>35291</size>
            <attacher name="Brian Weinstein">bweinstein</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkocmV2aXNpb24gNzM1MzYp
CisrKyBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCSh3b3JraW5nIGNvcHkp
CkBAIC0yNTMxNCwxMCArMjUzMTQsMTggQEAKIAkJCQk+CiAJCQk8L0ZpbGU+CiAJCQk8RmlsZQor
CQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cQ29udGV4dE1lbnUuY3BwIgorCQkJCT4KKwkJ
CTwvRmlsZT4KKwkJCTxGaWxlCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxDb250ZXh0
TWVudS5oIgogCQkJCT4KIAkJCTwvRmlsZT4KIAkJCTxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIu
LlxwbGF0Zm9ybVxDb250ZXh0TWVudUl0ZW0uY3BwIgorCQkJCT4KKwkJCTwvRmlsZT4KKwkJCTxG
aWxlCiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxDb250ZXh0TWVudUl0ZW0uaCIKIAkJ
CQk+CiAJCQk8L0ZpbGU+CkluZGV4OiBXZWJDb3JlL2xvYWRlci9FbXB0eUNsaWVudHMuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL2xvYWRlci9FbXB0eUNsaWVudHMuaAkocmV2aXNpb24gNzM1MzYp
CisrKyBXZWJDb3JlL2xvYWRlci9FbXB0eUNsaWVudHMuaAkod29ya2luZyBjb3B5KQpAQCAtNTAx
LDcgKzUwMSwxMSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB+RW1wdHlDb250ZXh0TWVudUNsaWVu
dCgpIHsgIH0KICAgICB2aXJ0dWFsIHZvaWQgY29udGV4dE1lbnVEZXN0cm95ZWQoKSB7IH0KIAor
I2lmIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQorICAgIHZpcnR1YWwgUGFzc093
blB0cjxDb250ZXh0TWVudT4gY3VzdG9taXplTWVudShQYXNzT3duUHRyPENvbnRleHRNZW51Pikg
eyByZXR1cm4gMDsgfQorI2Vsc2UKICAgICB2aXJ0dWFsIFBsYXRmb3JtTWVudURlc2NyaXB0aW9u
IGdldEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0ZW1zKENvbnRleHRNZW51KikgeyByZXR1cm4gMDsg
fQorI2VuZGlmCiAgICAgdmlydHVhbCB2b2lkIGNvbnRleHRNZW51SXRlbVNlbGVjdGVkKENvbnRl
eHRNZW51SXRlbSosIGNvbnN0IENvbnRleHRNZW51KikgeyB9CiAKICAgICB2aXJ0dWFsIHZvaWQg
ZG93bmxvYWRVUkwoY29uc3QgS1VSTCYpIHsgfQpJbmRleDogV2ViQ29yZS9wYWdlL0NvbnRleHRN
ZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wYWdlL0NvbnRleHRNZW51Q2xpZW50
LmgJKHJldmlzaW9uIDczNTM2KQorKysgV2ViQ29yZS9wYWdlL0NvbnRleHRNZW51Q2xpZW50LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTI2LDExICsyNiwxMiBAQAogI2lmbmRlZiBDb250ZXh0TWVudUNs
aWVudF9oCiAjZGVmaW5lIENvbnRleHRNZW51Q2xpZW50X2gKIAorI2luY2x1ZGUgIkNvbnRleHRN
ZW51LmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1NZW51RGVzY3JpcHRpb24uaCIKICNpbmNsdWRlIDx3
dGYvRm9yd2FyZC5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKLSAgICBjbGFzcyBDb250ZXh0TWVudTsKICAgICBjbGFzcyBDb250ZXh0TWVudUl0
ZW07CiAgICAgY2xhc3MgRnJhbWU7CiAgICAgY2xhc3MgSGl0VGVzdFJlc3VsdDsKQEAgLTQxLDcg
KzQyLDEyIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdmlydHVhbCB+Q29udGV4dE1l
bnVDbGllbnQoKSB7ICB9CiAgICAgICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudURlc3Ryb3ll
ZCgpID0gMDsKICAgICAgICAgCisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMp
CisgICAgICAgIHZpcnR1YWwgUGFzc093blB0cjxDb250ZXh0TWVudT4gY3VzdG9taXplTWVudShQ
YXNzT3duUHRyPENvbnRleHRNZW51PikgPSAwOworI2Vsc2UKICAgICAgICAgdmlydHVhbCBQbGF0
Zm9ybU1lbnVEZXNjcmlwdGlvbiBnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcyhDb250ZXh0
TWVudSopID0gMDsKKyNlbmRpZgorCiAgICAgICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudUl0
ZW1TZWxlY3RlZChDb250ZXh0TWVudUl0ZW0qLCBjb25zdCBDb250ZXh0TWVudSopID0gMDsKIAog
ICAgICAgICB2aXJ0dWFsIHZvaWQgZG93bmxvYWRVUkwoY29uc3QgS1VSTCYgdXJsKSA9IDA7Cklu
ZGV4OiBXZWJDb3JlL3BhZ2UvQ29udGV4dE1lbnVDb250cm9sbGVyLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BhZ2UvQ29udGV4dE1lbnVDb250cm9sbGVyLmNwcAkocmV2aXNpb24gNzM1MzYp
CisrKyBXZWJDb3JlL3BhZ2UvQ29udGV4dE1lbnVDb250cm9sbGVyLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTQ0LDggKzE0NCwxMyBAQCB2b2lkIENvbnRleHRNZW51Q29udHJvbGxlcjo6c2hvd0Nv
bnRleHRNCiAgICAgaWYgKG1fcGFnZS0+aW5zcGVjdG9yQ29udHJvbGxlcigpLT5lbmFibGVkKCkp
CiAgICAgICAgIGFkZEluc3BlY3RFbGVtZW50SXRlbSgpOwogI2VuZGlmCisKKyNpZiBVU0UoQ1JP
U1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKyAgICBtX2NvbnRleHRNZW51ID0gbV9jbGllbnQt
PmN1c3RvbWl6ZU1lbnUobV9jb250ZXh0TWVudS5yZWxlYXNlKCkpOworI2Vsc2UKICAgICBQbGF0
Zm9ybU1lbnVEZXNjcmlwdGlvbiBjdXN0b21NZW51ID0gbV9jbGllbnQtPmdldEN1c3RvbU1lbnVG
cm9tRGVmYXVsdEl0ZW1zKG1fY29udGV4dE1lbnUuZ2V0KCkpOwogICAgIG1fY29udGV4dE1lbnUt
PnNldFBsYXRmb3JtRGVzY3JpcHRpb24oY3VzdG9tTWVudSk7CisjZW5kaWYKICAgICBldmVudC0+
c2V0RGVmYXVsdEhhbmRsZWQoKTsKIH0KIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0
TWVudS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudS5jcHAJ
KHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51LmNwcAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwor
ICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAq
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJDb250ZXh0TWVudS5oIgorCisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRF
WFRfTUVOVVMpCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ29udGV4dE1lbnU6OkNvbnRleHRN
ZW51KCkKK3sKK30KKworQ29udGV4dE1lbnU6OkNvbnRleHRNZW51KGNvbnN0IFZlY3RvcjxDb250
ZXh0TWVudUl0ZW0+JiBpdGVtcykKKyAgICA6IG1faXRlbXMoaXRlbXMpIAoreworfQorCit2b2lk
IENvbnRleHRNZW51OjpzZXRJdGVtcyhWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBtZW51SXRlbXMp
Cit7CisgICAgbV9pdGVtcyA9IG1lbnVJdGVtczsKK30KKworVmVjdG9yPENvbnRleHRNZW51SXRl
bT4gQ29udGV4dE1lbnU6Oml0ZW1zKCkKK3sKKyAgICByZXR1cm4gbV9pdGVtczsKK30KKworQ29u
dGV4dE1lbnVJdGVtKiBDb250ZXh0TWVudTo6aXRlbUF0SW5kZXgodW5zaWduZWQgaW5kZXgpCit7
CisgICAgcmV0dXJuICYobV9pdGVtc1tpbmRleF0pOworfQorCitzdGF0aWMgQ29udGV4dE1lbnVJ
dGVtKiBpdGVtV2l0aEFjdGlvbkluTWVudSh1bnNpZ25lZCBhY3Rpb24sIFZlY3RvcjxDb250ZXh0
TWVudUl0ZW0+JiBtZW51KQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVudS5zaXpl
KCk7ICsraSkgeworICAgICAgICBpZiAobWVudVtpXS5hY3Rpb24oKSA9PSBhY3Rpb24pCisgICAg
ICAgICAgICByZXR1cm4gJm1lbnVbaV07CisgICAgICAgIGlmIChtZW51W2ldLnR5cGUoKSA9PSBT
dWJtZW51VHlwZSkgeworICAgICAgICAgICAgaWYgKENvbnRleHRNZW51SXRlbSogc3ViTWVudUl0
ZW0gPSBpdGVtV2l0aEFjdGlvbkluTWVudShhY3Rpb24sIG1lbnVbaV0uc3VibWVudSgpKSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gc3ViTWVudUl0ZW07CisgICAgICAgIH0KKworICAgIH0KKyAg
ICByZXR1cm4gMDsKK30KKworQ29udGV4dE1lbnVJdGVtKiBDb250ZXh0TWVudTo6aXRlbVdpdGhB
Y3Rpb24odW5zaWduZWQgYWN0aW9uKQoreworICAgIHJldHVybiBpdGVtV2l0aEFjdGlvbkluTWVu
dShhY3Rpb24sIG1faXRlbXMpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRp
ZiAvLyBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vQ29udGV4dE1lbnUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL0NvbnRl
eHRNZW51LmgJKHJldmlzaW9uIDczNTM2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVu
dS5oCSh3b3JraW5nIGNvcHkpCkBAIC00NiwxNSArNDYsMzkgQEAgbmFtZXNwYWNlIFdlYkNvcmUg
ewogCiAgICAgY2xhc3MgQ29udGV4dE1lbnUgOiBwdWJsaWMgTm9uY29weWFibGUKICAgICB7Cisj
aWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCisgICAgcHVibGljOgorI2lmIFBM
QVRGT1JNKFdJTikKKyAgICAgICAgdHlwZWRlZiBITUVOVSBOYXRpdmVNZW51VHlwZTsKKyNlbmRp
ZgorICAgICAgICBDb250ZXh0TWVudSgpOworICAgICAgICBDb250ZXh0TWVudShjb25zdCBWZWN0
b3I8Q29udGV4dE1lbnVJdGVtPiYpOworICAgICAgICBDb250ZXh0TWVudShOYXRpdmVNZW51VHlw
ZSk7CisKKyAgICAgICAgTmF0aXZlTWVudVR5cGUgbmF0aXZlTWVudSgpOworCisgICAgICAgIENv
bnRleHRNZW51SXRlbSogaXRlbVdpdGhBY3Rpb24odW5zaWduZWQpOworICAgICAgICBDb250ZXh0
TWVudUl0ZW0qIGl0ZW1BdEluZGV4KHVuc2lnbmVkKTsKKworICAgICAgICB2b2lkIHNldEl0ZW1z
KFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+IGl0ZW1zKTsKKyAgICAgICAgVmVjdG9yPENvbnRleHRN
ZW51SXRlbT4gaXRlbXMoKTsKKworICAgICAgICB2b2lkIGFwcGVuZEl0ZW0oY29uc3QgQ29udGV4
dE1lbnVJdGVtJiBpdGVtKSB7IG1faXRlbXMuYXBwZW5kKGl0ZW0pOyB9IAorCisgICAgcHJpdmF0
ZToKKyAgICAgICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gbV9pdGVtczsKKyNlbHNlCiAgICAg
cHVibGljOgogICAgICAgICBDb250ZXh0TWVudSgpOwogICAgICAgICBDb250ZXh0TWVudShjb25z
dCBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbik7CisKICAgICAgICAgfkNvbnRleHRNZW51KCk7CiAK
ICAgICAgICAgdm9pZCBpbnNlcnRJdGVtKHVuc2lnbmVkIHBvc2l0aW9uLCBDb250ZXh0TWVudUl0
ZW0mKTsKICAgICAgICAgdm9pZCBhcHBlbmRJdGVtKENvbnRleHRNZW51SXRlbSYpOwogICAgICAg
ICAKICAgICAgICAgQ29udGV4dE1lbnVJdGVtKiBpdGVtV2l0aEFjdGlvbih1bnNpZ25lZCk7Cisg
ICAgICAgIENvbnRleHRNZW51SXRlbSogaXRlbUF0SW5kZXgodW5zaWduZWQpOwogICAgICAgICBD
b250ZXh0TWVudUl0ZW0qIGl0ZW1BdEluZGV4KHVuc2lnbmVkLCBjb25zdCBQbGF0Zm9ybU1lbnVE
ZXNjcmlwdGlvbik7CiAKICAgICAgICAgdW5zaWduZWQgaXRlbUNvdW50KCkgY29uc3Q7CkBAIC04
MywxMCArMTA3LDE0IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdW5zaWduZWQgbV9p
dGVtQ291bnQ7CiAjZW5kaWYKICNlbmRpZgorCisjZW5kaWYgLy8gVVNFKENST1NTX1BMQVRGT1JN
X0NPTlRFWFRfTUVOVVMpCiAgICAgfTsKIAorI2lmICFVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVY
VF9NRU5VUykKIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+IGNvbnRleHRNZW51SXRlbVZlY3RvcihQ
bGF0Zm9ybU1lbnVEZXNjcmlwdGlvbik7CiBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBwbGF0Zm9y
bU1lbnVEZXNjcmlwdGlvbihWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYpOworI2VuZGlmCiAKIH0K
IApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudUl0ZW0uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnVJdGVtLmNwcAkocmV2aXNpb24gMCkKKysr
IFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnVJdGVtLmNwcAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
CisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJD
b250ZXh0TWVudUl0ZW0uaCIKKworI2luY2x1ZGUgIkNvbnRleHRNZW51LmgiCisKKyNpZiBVU0Uo
Q1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitD
b250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUs
IENvbnRleHRNZW51QWN0aW9uIGFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ29udGV4dE1l
bnUqIHN1Yk1lbnUpCisgICAgOiBtX3R5cGUodHlwZSkKKyAgICAsIG1fYWN0aW9uKGFjdGlvbikK
KyAgICAsIG1fdGl0bGUodGl0bGUpCisgICAgLCBtX2VuYWJsZWQodHJ1ZSkKKyAgICAsIG1fY2hl
Y2tlZChmYWxzZSkKK3sKKyAgICBzZXRTdWJNZW51KHN1Yk1lbnUpOworfQorCitDb250ZXh0TWVu
dUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUsIENvbnRleHRN
ZW51QWN0aW9uIGFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgYm9vbCBlbmFibGVkLCBib29s
IGNoZWNrZWQpCisgICAgOiBtX3R5cGUodHlwZSkKKyAgICAsIG1fYWN0aW9uKGFjdGlvbikKKyAg
ICAsIG1fdGl0bGUodGl0bGUpCisgICAgLCBtX2VuYWJsZWQoZW5hYmxlZCkKKyAgICAsIG1fY2hl
Y2tlZChjaGVja2VkKQoreworfQorICAgICAgICAKK0NvbnRleHRNZW51SXRlbTo6Q29udGV4dE1l
bnVJdGVtKENvbnRleHRNZW51QWN0aW9uIGFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgYm9v
bCBlbmFibGVkLCBib29sIGNoZWNrZWQsIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+IHN1Yk1lbnVJ
dGVtcykKKyAgICA6IG1fdHlwZShTdWJtZW51VHlwZSkKKyAgICAsIG1fYWN0aW9uKGFjdGlvbikK
KyAgICAsIG1fdGl0bGUodGl0bGUpCisgICAgLCBtX2VuYWJsZWQoZW5hYmxlZCkKKyAgICAsIG1f
Y2hlY2tlZChjaGVja2VkKQorICAgICwgbV9zdWJNZW51SXRlbXMoc3ViTWVudUl0ZW1zKQorewor
fQorCitDb250ZXh0TWVudUl0ZW06On5Db250ZXh0TWVudUl0ZW0oKQoreworfQorCit2b2lkIENv
bnRleHRNZW51SXRlbTo6c2V0U3ViTWVudShDb250ZXh0TWVudSogc3ViTWVudSkKK3sKKyAgICBp
ZiAoc3ViTWVudSkgeworICAgICAgICBtX3R5cGUgPSBTdWJtZW51VHlwZTsKKyAgICAgICAgbV9z
dWJNZW51SXRlbXMgPSBzdWJNZW51LT5pdGVtcygpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1f
dHlwZSA9IEFjdGlvblR5cGU7CisgICAgICAgIG1fc3ViTWVudUl0ZW1zLmNsZWFyKCk7CisgICAg
fQorfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQ1JPU1NfUExB
VEZPUk1fQ09OVEVYVF9NRU5VUykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnVJ
dGVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudUl0ZW0uaAko
cmV2aXNpb24gNzM1MzYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51SXRlbS5oCSh3
b3JraW5nIGNvcHkpCkBAIC00MCw3ICs0MCw3IEBACiBjbGFzcyBOU01lbnVJdGVtOwogI2VuZGlm
CiAjZWxpZiBQTEFURk9STShXSU4pCi10eXBlZGVmIHN0cnVjdCB0YWdNRU5VSVRFTUlORk9XKiBM
UE1FTlVJVEVNSU5GTzsKK3R5cGVkZWYgc3RydWN0IHRhZ01FTlVJVEVNSU5GT1cgTUVOVUlURU1J
TkZPOwogI2VsaWYgUExBVEZPUk0oR1RLKQogdHlwZWRlZiBzdHJ1Y3QgX0d0a01lbnVJdGVtIEd0
a01lbnVJdGVtOwogI2VsaWYgUExBVEZPUk0oUVQpCkBAIC0xNjQsMTAgKzE2NCw5IEBAIG5hbWVz
cGFjZSBXZWJDb3JlIHsKICAgICAgICAgU3VibWVudVR5cGUKICAgICB9OwogCisKICNpZiBQTEFU
Rk9STShNQUMpCiAgICAgdHlwZWRlZiBOU01lbnVJdGVtKiBQbGF0Zm9ybU1lbnVJdGVtRGVzY3Jp
cHRpb247Ci0jZWxpZiBQTEFURk9STShXSU4pCi0gICAgdHlwZWRlZiBMUE1FTlVJVEVNSU5GTyBQ
bGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb247CiAjZWxpZiBQTEFURk9STShRVCkKICAgICBzdHJ1
Y3QgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIHsKICAgICAgICAgUGxhdGZvcm1NZW51SXRl
bURlc2NyaXB0aW9uKCkKQEAgLTI1Myw2ICsyNTIsNDUgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewog
I2VuZGlmCiAKICAgICBjbGFzcyBDb250ZXh0TWVudUl0ZW0gOiBwdWJsaWMgRmFzdEFsbG9jQmFz
ZSB7CisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCisgICAgcHVibGljOgor
I2lmIFBMQVRGT1JNKFdJTikKKyAgICAgICAgdHlwZWRlZiBNRU5VSVRFTUlORk8gTmF0aXZlSXRl
bVR5cGU7CisjZW5kaWYKKyAgICAgICAgQ29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51SXRlbVR5
cGUsIENvbnRleHRNZW51QWN0aW9uLCBjb25zdCBTdHJpbmcmLCBDb250ZXh0TWVudSogc3ViTWVu
dSA9IDApOworICAgICAgICBDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVJdGVtVHlwZSwgQ29u
dGV4dE1lbnVBY3Rpb24sIGNvbnN0IFN0cmluZyYsIGJvb2wgZW5hYmxlZCwgYm9vbCBjaGVja2Vk
KTsKKyAgICAgICAgQ29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51QWN0aW9uLCBjb25zdCBTdHJp
bmcmLCBib29sIGVuYWJsZWQsIGJvb2wgY2hlY2tlZCwgVmVjdG9yPENvbnRleHRNZW51SXRlbT4g
c3ViTWVudUl0ZW1zKTsKKyAgICAgICAgQ29udGV4dE1lbnVJdGVtKE5hdGl2ZUl0ZW1UeXBlKTsK
KworICAgICAgICBOYXRpdmVJdGVtVHlwZSBuYXRpdmVNZW51SXRlbSgpOworCisgICAgICAgIENv
bnRleHRNZW51SXRlbVR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsgfQorICAgICAg
ICB2b2lkIHNldFR5cGUoQ29udGV4dE1lbnVJdGVtVHlwZSB0eXBlKSB7IG1fdHlwZSA9IHR5cGU7
IH0KKworICAgICAgICBDb250ZXh0TWVudUFjdGlvbiBhY3Rpb24oKSBjb25zdCB7IHJldHVybiBt
X2FjdGlvbjsgfQorICAgICAgICB2b2lkIHNldEFjdGlvbihDb250ZXh0TWVudUFjdGlvbiBhY3Rp
b24pIHsgbV9hY3Rpb24gPSBhY3Rpb247IH0KKworICAgICAgICBTdHJpbmcgdGl0bGUoKSBjb25z
dCB7IHJldHVybiBtX3RpdGxlOyB9CisgICAgICAgIHZvaWQgc2V0VGl0bGUoY29uc3QgU3RyaW5n
JiB0aXRsZSkgeyBtX3RpdGxlID0gdGl0bGU7IH0KKworICAgICAgICBib29sIGNoZWNrZWQoKSBj
b25zdCB7IHJldHVybiBtX2NoZWNrZWQ7IH0KKyAgICAgICAgdm9pZCBzZXRDaGVja2VkKGJvb2wg
Y2hlY2tlZCA9IHRydWUpIHsgbV9jaGVja2VkID0gY2hlY2tlZDsgfQorCisgICAgICAgIGJvb2wg
ZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1fZW5hYmxlZDsgfQorICAgICAgICB2b2lkIHNldEVu
YWJsZWQoYm9vbCBlbmFibGVkID0gdHJ1ZSkgeyBtX2VuYWJsZWQgPSBlbmFibGVkOyB9CisKKyAg
ICAgICAgdm9pZCBzZXRTdWJNZW51KENvbnRleHRNZW51Kik7CisgICAgICAgIFZlY3RvcjxDb250
ZXh0TWVudUl0ZW0+JiBzdWJtZW51KCkgeyByZXR1cm4gbV9zdWJNZW51SXRlbXM7IH0KKworICAg
ICAgICB+Q29udGV4dE1lbnVJdGVtKCk7CisgICAgcHJpdmF0ZToKKyAgICAgICAgU3RyaW5nIG1f
dGl0bGU7CisgICAgICAgIGJvb2wgbV9lbmFibGVkOworICAgICAgICBib29sIG1fY2hlY2tlZDsK
KyAgICAgICAgQ29udGV4dE1lbnVBY3Rpb24gbV9hY3Rpb247CisgICAgICAgIENvbnRleHRNZW51
SXRlbVR5cGUgbV90eXBlOworICAgICAgICBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBtX3N1Yk1l
bnVJdGVtczsKKyNlbHNlCiAgICAgcHVibGljOgogICAgICAgICBDb250ZXh0TWVudUl0ZW0oUGxh
dGZvcm1NZW51SXRlbURlc2NyaXB0aW9uKTsKICAgICAgICAgQ29udGV4dE1lbnVJdGVtKENvbnRl
eHRNZW51KiBzdWJNZW51ID0gMCk7CkBAIC0yOTcsNiArMzM1LDcgQEAgbmFtZXNwYWNlIFdlYkNv
cmUgewogI2Vsc2UKICAgICAgICAgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIG1fcGxhdGZv
cm1EZXNjcmlwdGlvbjsKICNlbmRpZgorI2VuZGlmIC8vIFVTRShDUk9TU19QTEFURk9STV9DT05U
RVhUX01FTlVTKQogICAgIH07CiAKIH0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vUGxhdGZvcm1N
ZW51RGVzY3JpcHRpb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL1BsYXRmb3Jt
TWVudURlc2NyaXB0aW9uLmgJKHJldmlzaW9uIDczNTM2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9Q
bGF0Zm9ybU1lbnVEZXNjcmlwdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw4ICszMiw2IEBA
CiAjZWxzZQogY2xhc3MgTlNNdXRhYmxlQXJyYXk7CiAjZW5kaWYKLSNlbGlmIFBMQVRGT1JNKFdJ
TikKLXR5cGVkZWYgc3RydWN0IEhNRU5VX18qIEhNRU5VOwogI2VsaWYgUExBVEZPUk0oUVQpCiAj
aW5jbHVkZSA8cWxpc3QuaD4KICNlbGlmIFBMQVRGT1JNKEdUSykKQEAgLTQ2LDEwICs0NCw5IEBA
IGNsYXNzIEJNZW51OwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKKyNpZiAhVVNFKENST1NTX1BM
QVRGT1JNX0NPTlRFWFRfTUVOVVMpCiAjaWYgUExBVEZPUk0oTUFDKQogICAgIHR5cGVkZWYgTlNN
dXRhYmxlQXJyYXkqIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uOwotI2VsaWYgUExBVEZPUk0oV0lO
KQotICAgIHR5cGVkZWYgSE1FTlUgUGxhdGZvcm1NZW51RGVzY3JpcHRpb247CiAjZWxpZiBQTEFU
Rk9STShRVCkKICAgICBjbGFzcyBDb250ZXh0TWVudUl0ZW07CiAgICAgdHlwZWRlZiBjb25zdCBR
TGlzdDxDb250ZXh0TWVudUl0ZW0+KiBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbjsKQEAgLTYyLDYg
KzU5LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogI2Vsc2UKICAgICB0eXBlZGVmIHZvaWQqIFBs
YXRmb3JtTWVudURlc2NyaXB0aW9uOwogI2VuZGlmCisjZW5kaWYgLy8gIVVTRShDUk9TU19QTEFU
Rk9STV9DT05URVhUX01FTlVTKQogCiB9IC8vIG5hbWVzcGFjZQogCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL3dpbi9Db250ZXh0TWVudUl0ZW1XaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vd2luL0NvbnRleHRNZW51SXRlbVdpbi5jcHAJKHJldmlzaW9uIDczNTM2KQorKysg
V2ViQ29yZS9wbGF0Zm9ybS93aW4vQ29udGV4dE1lbnVJdGVtV2luLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgIkNvbnRleHRNZW51SXRlbS5oIgogCiAjaW5j
bHVkZSAiQ29udGV4dE1lbnUuaCIKKyNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCiAKICNpbmNs
dWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CiAjaW5jbHVkZSA8d2luZG93cy5oPgpAQCAtNDUsMTgx
ICs0Niw0NiBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUNvbnRleHRNZW51SXRlbTo6Q29u
dGV4dE1lbnVJdGVtKExQTUVOVUlURU1JTkZPIGl0ZW0pCi0gICAgOiBtX3BsYXRmb3JtRGVzY3Jp
cHRpb24oaXRlbSkKLXsKLX0KLQotQ29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oQ29u
dGV4dE1lbnUqIHN1Yk1lbnUpCi17Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gKExQTUVO
VUlURU1JTkZPKW1hbGxvYyhzaXplb2YoTUVOVUlURU1JTkZPKSk7Ci0gICAgaWYgKCFtX3BsYXRm
b3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVybjsKLQotICAgIG1lbXNldChtX3BsYXRmb3Jt
RGVzY3JpcHRpb24sIDAsIHNpemVvZihNRU5VSVRFTUlORk8pKTsKLSAgICBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPmNiU2l6ZSA9IHNpemVvZihNRU5VSVRFTUlORk8pOwotCi0gICAgbV9wbGF0Zm9y
bURlc2NyaXB0aW9uLT53SUQgPSBDb250ZXh0TWVudUl0ZW1UYWdOb0FjdGlvbjsKLSAgICBpZiAo
c3ViTWVudSkgewotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZNYXNrIHw9IE1JSU1f
U1VCTUVOVTsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5oU3ViTWVudSA9IHN1Yk1l
bnUtPnBsYXRmb3JtRGVzY3JpcHRpb24oKTsKLSAgICB9Ci19Ci0KLUNvbnRleHRNZW51SXRlbTo6
Q29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51SXRlbVR5cGUgdHlwZSwgQ29udGV4dE1lbnVBY3Rp
b24gYWN0aW9uLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBDb250ZXh0TWVudSogc3ViTWVudSkKLXsK
LSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24gPSAoTFBNRU5VSVRFTUlORk8pbWFsbG9jKHNpemVv
ZihNRU5VSVRFTUlORk8pKTsKLSAgICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgbWVtc2V0KG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgMCwgc2l6ZW9m
KE1FTlVJVEVNSU5GTykpOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Y2JTaXplID0gc2l6
ZW9mKE1FTlVJVEVNSU5GTyk7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFzayA9IE1J
SU1fRlRZUEU7Ci0KLSAgICBpZiAodHlwZSA9PSBTZXBhcmF0b3JUeXBlKSB7Ci0gICAgICAgIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlR5cGUgPSBNRlRfU0VQQVJBVE9SOwotICAgICAgICByZXR1
cm47CitDb250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShNRU5VSVRFTUlORk8gaW5mbykK
K3sgICAKKyAgICBtX3R5cGUgPSBpbmZvLmZUeXBlICYgTUZUX1NFUEFSQVRPUiA/IFNlcGFyYXRv
clR5cGUgOiBBY3Rpb25UeXBlOworICAgIG1fYWN0aW9uID0gc3RhdGljX2Nhc3Q8Q29udGV4dE1l
bnVBY3Rpb24+KGluZm8ud0lEKTsKKyAgICBtX3RpdGxlID0gU3RyaW5nKGluZm8uZHdUeXBlRGF0
YSwgd2NzbGVuKGluZm8uZHdUeXBlRGF0YSkpOworCisgICAgaWYgKGluZm8uaFN1Yk1lbnUpIHsK
KyAgICAgICAgbV90eXBlID0gU3VibWVudVR5cGU7CisgICAgICAgIENvbnRleHRNZW51IHN1Yk1l
bnUoaW5mby5oU3ViTWVudSk7CisgICAgICAgIG1fc3ViTWVudUl0ZW1zID0gc3ViTWVudS5pdGVt
cygpOwogICAgIH0KLSAgICAKLSAgICBpZiAoc3ViTWVudSkgewotICAgICAgICBtX3BsYXRmb3Jt
RGVzY3JpcHRpb24tPmZNYXNrIHw9IE1JSU1fU1RSSU5HIHwgTUlJTV9TVUJNRU5VOwotICAgICAg
ICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51ID0gc3ViTWVudS0+cGxhdGZvcm1EZXNj
cmlwdGlvbigpOwotICAgIH0gZWxzZQotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZN
YXNrIHw9IE1JSU1fU1RSSU5HIHwgTUlJTV9JRDsKLQotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlv
bi0+ZlR5cGUgPSBNRlRfU1RSSU5HOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+d0lEID0g
YWN0aW9uOwotICAgIAotICAgIFN0cmluZyB0ID0gdGl0bGU7Ci0gICAgbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uLT5jY2ggPSB0Lmxlbmd0aCgpOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZHdU
eXBlRGF0YSA9IHdjc2R1cCh0LmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOwotfQog
Ci1Db250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlLCBD
b250ZXh0TWVudUFjdGlvbiwgY29uc3QgU3RyaW5nJiwgYm9vbCwgYm9vbCkKLXsKLSAgICAvLyBG
SVhNRTogSW1wbGVtZW50Ci19Ci0KLUNvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKENv
bnRleHRNZW51QWN0aW9uLCBjb25zdCBTdHJpbmcmLCBib29sLCBib29sLCBWZWN0b3I8Q29udGV4
dE1lbnVJdGVtPiYpCi17Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudAorICAgIG1fY2hlY2tlZCA9
IGluZm8uZlN0YXRlICYgTUZTX0NIRUNLRUQ7CisgICAgbV9lbmFibGVkID0gIShpbmZvLmZTdGF0
ZSAmIE1GU19ESVNBQkxFRCk7CiB9CiAKLUNvbnRleHRNZW51SXRlbTo6fkNvbnRleHRNZW51SXRl
bSgpCitNRU5VSVRFTUlORk8gQ29udGV4dE1lbnVJdGVtOjpuYXRpdmVNZW51SXRlbSgpCiB7Ci0g
ICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikgewotICAgICAgICBpZiAobV9wbGF0Zm9ybURl
c2NyaXB0aW9uLT5mVHlwZSA9PSBNRlRfU1RSSU5HKQotICAgICAgICAgICAgZnJlZShtX3BsYXRm
b3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEpOwotICAgICAgICBmcmVlKG1fcGxhdGZvcm1EZXNj
cmlwdGlvbik7Ci0gICAgfQotfQotCi1MUE1FTlVJVEVNSU5GTyBDb250ZXh0TWVudUl0ZW06OnJl
bGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCkKLXsKLSAgICBMUE1FTlVJVEVNSU5GTyBpbmZvID0g
bV9wbGF0Zm9ybURlc2NyaXB0aW9uOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IDA7Ci0g
ICAgcmV0dXJuIGluZm87Ci19Ci0KLUNvbnRleHRNZW51SXRlbVR5cGUgQ29udGV4dE1lbnVJdGVt
Ojp0eXBlKCkgY29uc3QKLXsKLSAgICBDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUgPSBBY3Rpb25U
eXBlOwotICAgIGlmICgoKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlR5cGUgJiB+TUZUX09XTkVS
RFJBVykgPT0gTUZUX1NUUklORykgJiYgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5oU3ViTWVudSkK
LSAgICAgICAgdHlwZSA9IFN1Ym1lbnVUeXBlOwotICAgIGVsc2UgaWYgKG1fcGxhdGZvcm1EZXNj
cmlwdGlvbi0+ZlR5cGUgJiBNRlRfU0VQQVJBVE9SKQotICAgICAgICB0eXBlID0gU2VwYXJhdG9y
VHlwZTsKLQotICAgIHJldHVybiB0eXBlOwotfQotCi1Db250ZXh0TWVudUFjdGlvbiBDb250ZXh0
TWVudUl0ZW06OmFjdGlvbigpIGNvbnN0Ci17IAotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDb250
ZXh0TWVudUFjdGlvbj4obV9wbGF0Zm9ybURlc2NyaXB0aW9uLT53SUQpOwotfQotCi1TdHJpbmcg
Q29udGV4dE1lbnVJdGVtOjp0aXRsZSgpIGNvbnN0IAotewotICAgIHJldHVybiBTdHJpbmcobV9w
bGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVEYXRhLCB3Y3NsZW4obV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5kd1R5cGVEYXRhKSk7Ci19Ci0KLVBsYXRmb3JtTWVudURlc2NyaXB0aW9uIENvbnRleHRN
ZW51SXRlbTo6cGxhdGZvcm1TdWJNZW51KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wbGF0Zm9y
bURlc2NyaXB0aW9uLT5oU3ViTWVudTsKLX0KLQotdm9pZCBDb250ZXh0TWVudUl0ZW06OnNldFR5
cGUoQ29udGV4dE1lbnVJdGVtVHlwZSB0eXBlKQotewotICAgIGlmICh0eXBlID09IFNlcGFyYXRv
clR5cGUpCi0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlR5cGUgPSBNRlRfU0VQQVJB
VE9SOwotICAgIGVsc2UKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSA9IE1G
VF9TVFJJTkc7Ci19Ci0KLXZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRBY3Rpb24oQ29udGV4dE1l
bnVBY3Rpb24gYWN0aW9uKQotewotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+d0lEID0gYWN0
aW9uOyAKLX0KLQotdm9pZCBDb250ZXh0TWVudUl0ZW06OnNldFRpdGxlKGNvbnN0IFN0cmluZyYg
dGl0bGUpCi17Ci0gICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZHdUeXBlRGF0YSkKLSAg
ICAgICAgZnJlZShtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEpOworICAgIE1FTlVJ
VEVNSU5GTyBpbmZvID0gezB9OworICAgIGluZm8uY2JTaXplID0gc2l6ZW9mKE1FTlVJVEVNSU5G
Tyk7CiAgICAgCi0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5jY2ggPSB0aXRsZS5sZW5ndGgo
KTsKLSAgICBTdHJpbmcgdGl0bGVDb3B5ID0gdGl0bGU7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5kd1R5cGVEYXRhID0gd2NzZHVwKHRpdGxlQ29weS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJt
aW5hdGlvbigpKTsKLX0KLQotdm9pZCBDb250ZXh0TWVudUl0ZW06OnNldFN1Yk1lbnUoQ29udGV4
dE1lbnUqIHN1Yk1lbnUpCi17Ci0gICAgaWYgKHN1Yk1lbnUtPnBsYXRmb3JtRGVzY3JpcHRpb24o
KSA9PSBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51KQotICAgICAgICByZXR1cm47Cisg
ICAgaW5mby5mTWFzayA9IE1JSU1fRlRZUEUgfCBNSUlNX0lEIHwgTUlJTV9TVFJJTkcgfCBNSUlN
X1NUQVRFIHwgTUlJTV9TVUJNRU5VOwogCi0gICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+
aFN1Yk1lbnUpCi0gICAgICAgIDo6RGVzdHJveU1lbnUobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5o
U3ViTWVudSk7CisgICAgaWYgKG1fdHlwZSA9PSBTdWJtZW51VHlwZSkKKyAgICAgICAgaW5mby5o
U3ViTWVudSA9IENvbnRleHRNZW51KG1fc3ViTWVudUl0ZW1zKS5uYXRpdmVNZW51KCk7CiAKLSAg
ICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZNYXNrIHw9IE1JSU1fU1VCTUVOVTsKLSAgICBtX3Bs
YXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51ID0gc3ViTWVudS0+cmVsZWFzZVBsYXRmb3JtRGVz
Y3JpcHRpb24oKTsKLX0KKyAgICBpZiAobV90eXBlID09IFNlcGFyYXRvclR5cGUpCisgICAgICAg
IGluZm8uZlR5cGUgPSBNRlRfU0VQQVJBVE9SOworICAgIGVsc2UKKyAgICAgICAgaW5mby5mVHlw
ZSA9IE1GVF9TVFJJTkc7CiAKLXZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRTdWJNZW51KFZlY3Rv
cjxDb250ZXh0TWVudUl0ZW0+JikKLXsKLSAgICAvLyBGSVhNRTogSW1wbGVtZW50Ci19CisgICAg
aW5mby5jY2ggPSBtX3RpdGxlLmxlbmd0aCgpOworICAgIGluZm8uZHdUeXBlRGF0YSA9IChMUFdT
VFIpIG1fdGl0bGUuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKTsKIAotdm9pZCBDb250
ZXh0TWVudUl0ZW06OnNldENoZWNrZWQoYm9vbCBjaGVja2VkKQotewotICAgIG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbi0+Zk1hc2sgfD0gTUlJTV9TVEFURTsKLSAgICBpZiAoY2hlY2tlZCkgewotICAg
ICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSAmPSB+TUZTX1VOQ0hFQ0tFRDsKLSAg
ICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgfD0gTUZTX0NIRUNLRUQ7Ci0gICAg
fSBlbHNlIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1GU19D
SEVDS0VEOwotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNfVU5D
SEVDS0VEOwotICAgIH0KLX0KKyAgICBpbmZvLndJRCA9IG1fYWN0aW9uOwogCi1ib29sIENvbnRl
eHRNZW51SXRlbTo6Y2hlY2tlZCgpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUUgLSBJbXBsZW1lbnQK
LSAgICByZXR1cm4gZmFsc2U7Ci19CisgICAgaW5mby5mU3RhdGUgfD0gbV9lbmFibGVkID8gTUZT
X0VOQUJMRUQgOiBNRlNfRElTQUJMRUQ7CisgICAgaW5mby5mU3RhdGUgfD0gbV9jaGVja2VkID8g
TUZTX0NIRUNLRUQgOiBNRlNfVU5DSEVDS0VEOwogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0
RW5hYmxlZChib29sIGVuYWJsZWQpCi17Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFz
ayB8PSBNSUlNX1NUQVRFOwotICAgIGlmIChlbmFibGVkKSB7Ci0gICAgICAgIG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbi0+ZlN0YXRlICY9IH5NRlNfRElTQUJMRUQ7Ci0gICAgICAgIG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbi0+ZlN0YXRlIHw9IE1GU19FTkFCTEVEOwotICAgIH0gZWxzZSB7Ci0gICAgICAg
IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlN0YXRlICY9IH5NRlNfRU5BQkxFRDsKLSAgICAgICAg
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgfD0gTUZTX0RJU0FCTEVEOwotICAgIH0KLX0K
LQotYm9vbCBDb250ZXh0TWVudUl0ZW06OmVuYWJsZWQoKSBjb25zdAotewotICAgIHJldHVybiAh
KG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlN0YXRlICYgTUZTX0RJU0FCTEVEKTsKKyAgICByZXR1
cm4gaW5mbzsKIH0KIAogfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ29udGV4dE1lbnVX
aW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0NvbnRleHRNZW51V2lu
LmNwcAkocmV2aXNpb24gNzM1MzYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9Db250ZXh0TWVu
dVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJOb2Rl
LmgiCiAjaW5jbHVkZSA8dGNoYXIuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8
d3RmL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KIAogI2lmbmRlZiBN
SUlNX0ZUWVBFCkBAIC00MywxODAgKzQ0LDQzIEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAot
Q29udGV4dE1lbnU6OkNvbnRleHRNZW51KCkKLSAgICA6IG1fcGxhdGZvcm1EZXNjcmlwdGlvbigw
KQotI2lmIE9TKFdJTkNFKQotICAgICwgbV9pdGVtQ291bnQoMCkKLSNlbmRpZgotewotICAgIHNl
dFBsYXRmb3JtRGVzY3JpcHRpb24oOjpDcmVhdGVQb3B1cE1lbnUoKSk7Ci19Ci0KLUNvbnRleHRN
ZW51OjpDb250ZXh0TWVudShjb25zdCBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBtZW51KQotICAg
IDogbV9wbGF0Zm9ybURlc2NyaXB0aW9uKDApCi0jaWYgT1MoV0lOQ0UpCi0gICAgLCBtX2l0ZW1D
b3VudCgwKQotI2VuZGlmCi17Ci0gICAgc2V0UGxhdGZvcm1EZXNjcmlwdGlvbihtZW51KTsKLX0K
LQotQ29udGV4dE1lbnU6On5Db250ZXh0TWVudSgpCi17Ci0gICAgaWYgKG1fcGxhdGZvcm1EZXNj
cmlwdGlvbikKLSAgICAgICAgOjpEZXN0cm95TWVudShtX3BsYXRmb3JtRGVzY3JpcHRpb24pOwot
fQotCi11bnNpZ25lZCBDb250ZXh0TWVudTo6aXRlbUNvdW50KCkgY29uc3QKK0NvbnRleHRNZW51
OjpDb250ZXh0TWVudShITUVOVSBtZW51KQogewotI2lmIE9TKFdJTkNFKQotICAgIHJldHVybiBt
X2l0ZW1Db3VudDsKLSNlbHNlCi0gICAgaWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCi0gICAg
ICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIDo6R2V0TWVudUl0ZW1Db3VudChtX3BsYXRmb3Jt
RGVzY3JpcHRpb24pOwotI2VuZGlmCi19Ci0KLSNpZiBPUyhXSU5DRSkKLXN0YXRpYyBib29sIGlu
c2VydE1lbnVJdGVtKFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIG1lbnUsIHVuc2lnbmVkIGludCBw
b3NpdGlvbiwgQ29udGV4dE1lbnVJdGVtJiBpdGVtKQotewotICAgIFVJTlQgZmxhZ3MgPSBNRl9C
WVBPU0lUSU9OOwotICAgIFVJTlQgbmV3SXRlbSA9IDA7Ci0gICAgTFBDV1NUUiB0aXRsZSA9IDA7
Ci0KLSAgICBpZiAoaXRlbS50eXBlKCkgPT0gU2VwYXJhdG9yVHlwZSkKLSAgICAgICAgZmxhZ3Mg
fD0gTUZfU0VQQVJBVE9SOwotICAgIGVsc2UgewotICAgICAgICBmbGFncyB8PSBNRl9TVFJJTkc7
Ci0gICAgICAgIGZsYWdzIHw9IGl0ZW0uY2hlY2tlZCgpID8gTUZfQ0hFQ0tFRCA6IE1GX1VOQ0hF
Q0tFRDsKLSAgICAgICAgZmxhZ3MgfD0gaXRlbS5lbmFibGVkKCkgPyBNRl9FTkFCTEVEIDogTUZf
R1JBWUVEOwotCi0gICAgICAgIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbiBkZXNjcmlwdGlv
biA9IGl0ZW0ucmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKTsKLSAgICAgICAgdGl0bGUgPSBk
ZXNjcmlwdGlvbi0+ZHdUeXBlRGF0YTsKLSAgICAgICAgZGVzY3JpcHRpb24tPmR3VHlwZURhdGEg
PSAwOwotCi0gICAgICAgIGlmIChkZXNjcmlwdGlvbi0+aFN1Yk1lbnUpIHsKLSAgICAgICAgICAg
IGZsYWdzIHw9IE1GX1BPUFVQOwotICAgICAgICAgICAgbmV3SXRlbSA9IHJlaW50ZXJwcmV0X2Nh
c3Q8VUlOVD4oZGVzY3JpcHRpb24tPmhTdWJNZW51KTsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9u
LT5oU3ViTWVudSA9IDA7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbmV3SXRlbSA9IGRl
c2NyaXB0aW9uLT53SUQ7Ci0KLSAgICAgICAgZnJlZShkZXNjcmlwdGlvbik7Ci0gICAgfQotCi0g
ICAgcmV0dXJuIDo6SW5zZXJ0TWVudVcobWVudSwgcG9zaXRpb24sIGZsYWdzLCBuZXdJdGVtLCB0
aXRsZSk7Ci19Ci0jZW5kaWYKLQotdm9pZCBDb250ZXh0TWVudTo6aW5zZXJ0SXRlbSh1bnNpZ25l
ZCBpbnQgcG9zaXRpb24sIENvbnRleHRNZW51SXRlbSYgaXRlbSkKLXsKLSAgICBpZiAoIW1fcGxh
dGZvcm1EZXNjcmlwdGlvbikKKyAgICBpbnQgY291bnQgPSA6OkdldE1lbnVJdGVtQ291bnQobWVu
dSk7CisgICAgaWYgKGNvdW50IDw9IDApCiAgICAgICAgIHJldHVybjsKIAotI2lmIE9TKFdJTkNF
KQotICAgIGlmIChpbnNlcnRNZW51SXRlbShtX3BsYXRmb3JtRGVzY3JpcHRpb24sIHBvc2l0aW9u
LCBpdGVtKSkKLSAgICAgICAgKyttX2l0ZW1Db3VudDsKLSNlbHNlCi0gICAgOjpJbnNlcnRNZW51
SXRlbShtX3BsYXRmb3JtRGVzY3JpcHRpb24sIHBvc2l0aW9uLCBUUlVFLCBpdGVtLnJlbGVhc2VQ
bGF0Zm9ybURlc2NyaXB0aW9uKCkpOwotI2VuZGlmCi19Ci0KLXZvaWQgQ29udGV4dE1lbnU6OmFw
cGVuZEl0ZW0oQ29udGV4dE1lbnVJdGVtJiBpdGVtKQotewotICAgIGluc2VydEl0ZW0oaXRlbUNv
dW50KCksIGl0ZW0pOwotfQotCi1zdGF0aWMgQ29udGV4dE1lbnVJdGVtKiBjb250ZXh0TWVudUl0
ZW1CeUlkT3JQb3NpdGlvbihITUVOVSBtZW51LCB1bnNpZ25lZCBpZCwgQk9PTCBieVBvc2l0aW9u
KQotewotICAgIGlmICghbWVudSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgTFBNRU5VSVRFTUlO
Rk8gaW5mbyA9IHN0YXRpY19jYXN0PExQTUVOVUlURU1JTkZPPihtYWxsb2Moc2l6ZW9mKE1FTlVJ
VEVNSU5GTykpKTsKLSAgICBpZiAoIWluZm8pCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgbWVt
c2V0KGluZm8sIDAsIHNpemVvZihNRU5VSVRFTUlORk8pKTsKLQotICAgIGluZm8tPmNiU2l6ZSA9
IHNpemVvZihNRU5VSVRFTUlORk8pOwotCi0gICAgLy8gU2V0dGluZyBNSUlNX0RBVEEgd2hpY2gg
aXMgdXNlZnVsIGZvciBXZWJLaXQgY2xpZW50cyB3aG8gc3RvcmUgZGF0YSBpbiB0aGlzIG1lbWJl
ciBmb3IgdGhlaXIgY3VzdG9tIG1lbnUgaXRlbXMuCi0gICAgaW5mby0+Zk1hc2sgPSBNSUlNX0ZU
WVBFIHwgTUlJTV9JRCB8IE1JSU1fU1RSSU5HIHwgTUlJTV9EQVRBOwotCi0gICAgaWYgKCE6Okdl
dE1lbnVJdGVtSW5mbyhtZW51LCBpZCwgYnlQb3NpdGlvbiwgaW5mbykpIHsKLSAgICAgICAgZnJl
ZShpbmZvKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKGluZm8tPmZUeXBl
ICYgTUZUX1NUUklORykgewotICAgICAgICBMUFRTVFIgYnVmZmVyID0gc3RhdGljX2Nhc3Q8TFBU
U1RSPihtYWxsb2MoKytpbmZvLT5jY2ggKiBzaXplb2YoVENIQVIpKSk7Ci0gICAgICAgIGlmICgh
YnVmZmVyKSB7Ci0gICAgICAgICAgICBmcmVlKGluZm8pOwotICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgaW50
IG1lbnVTdHJpbmdMZW5ndGggPSA6OkdldE1lbnVTdHJpbmcobWVudSwgaSwgMCwgMCwgTUZfQllQ
T1NJVElPTik7CisgICAgICAgIGlmICghbWVudVN0cmluZ0xlbmd0aCkgeworICAgICAgICAgICAg
Ly8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHN0cmluZywgdGhlbiB3ZSBtdXN0IGJlIGluIGEgc2VwYXJh
dG9yLgorICAgICAgICAgICAgbV9pdGVtcy5hcHBlbmQoQ29udGV4dE1lbnVJdGVtKFNlcGFyYXRv
clR5cGUsIENvbnRleHRNZW51SXRlbVRhZ05vQWN0aW9uLCBTdHJpbmcoKSkpOworICAgICAgICAg
ICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgaW5mby0+ZHdUeXBlRGF0YSA9IGJ1ZmZl
cjsKLSAgICAgICAgOjpHZXRNZW51SXRlbUluZm8obWVudSwgaWQsIGJ5UG9zaXRpb24sIGluZm8p
OwotICAgIH0KLQotICAgIHJldHVybiBuZXcgQ29udGV4dE1lbnVJdGVtKGluZm8pOwotfQogCi1D
b250ZXh0TWVudUl0ZW0qIENvbnRleHRNZW51OjppdGVtV2l0aEFjdGlvbih1bnNpZ25lZCBhY3Rp
b24pCi17Ci0gICAgcmV0dXJuIGNvbnRleHRNZW51SXRlbUJ5SWRPclBvc2l0aW9uKG1fcGxhdGZv
cm1EZXNjcmlwdGlvbiwgYWN0aW9uLCBGQUxTRSk7Ci19CisgICAgICAgIE93bkFycmF5UHRyPFdD
SEFSPiBtZW51U3RyaW5nKG5ldyBXQ0hBUlttZW51U3RyaW5nTGVuZ3RoICsgMV0pOwogCi1Db250
ZXh0TWVudUl0ZW0qIENvbnRleHRNZW51OjppdGVtQXRJbmRleCh1bnNpZ25lZCBpbmRleCwgY29u
c3QgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gcGxhdGZvcm1EZXNjcmlwdGlvbikKLXsKLSAgICBy
ZXR1cm4gY29udGV4dE1lbnVJdGVtQnlJZE9yUG9zaXRpb24ocGxhdGZvcm1EZXNjcmlwdGlvbiwg
aW5kZXgsIFRSVUUpOwotfQorICAgICAgICBNRU5VSVRFTUlORk8gaW5mbyA9IHswfTsKKyAgICAg
ICAgaW5mby5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPKTsKKyAgICAgICAgaW5mby5mTWFz
ayA9IE1JSU1fRlRZUEUgfCBNSUlNX0lEIHwgTUlJTV9TVFJJTkcgfCBNSUlNX1NUQVRFIHwgTUlJ
TV9TVUJNRU5VOworICAgICAgICBpbmZvLmR3VHlwZURhdGEgPSBtZW51U3RyaW5nLmdldCgpOwor
ICAgICAgICBpbmZvLmNjaCA9IG1lbnVTdHJpbmdMZW5ndGggKyAxOwogCi12b2lkIENvbnRleHRN
ZW51OjpzZXRQbGF0Zm9ybURlc2NyaXB0aW9uKEhNRU5VIG1lbnUpCi17Ci0gICAgaWYgKG1lbnUg
PT0gbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgaWYg
KG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKLSAgICAgICAgOjpEZXN0cm95TWVudShtX3BsYXRmb3Jt
RGVzY3JpcHRpb24pOwotCi0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gbWVudTsKLSAgICBp
ZiAoIW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKLSAgICAgICAgcmV0dXJuOwotCi0jaWYgIU9TKFdJ
TkNFKQotICAgIE1FTlVJTkZPIG1lbnVJbmZvID0gezB9OwotICAgIG1lbnVJbmZvLmNiU2l6ZSA9
IHNpemVvZihNRU5VSU5GTyk7Ci0gICAgbWVudUluZm8uZk1hc2sgPSBNSU1fU1RZTEU7Ci0gICAg
OjpHZXRNZW51SW5mbyhtX3BsYXRmb3JtRGVzY3JpcHRpb24sICZtZW51SW5mbyk7Ci0gICAgbWVu
dUluZm8uZk1hc2sgPSBNSU1fU1RZTEU7Ci0gICAgbWVudUluZm8uZHdTdHlsZSB8PSBNTlNfTk9U
SUZZQllQT1M7Ci0gICAgOjpTZXRNZW51SW5mbyhtX3BsYXRmb3JtRGVzY3JpcHRpb24sICZtZW51
SW5mbyk7Ci0jZW5kaWYKLX0KLQotSE1FTlUgQ29udGV4dE1lbnU6OnBsYXRmb3JtRGVzY3JpcHRp
b24oKSBjb25zdAotewotICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb247CisgICAgICAg
IGlmICg6OkdldE1lbnVJdGVtSW5mbyhtZW51LCBpLCBUUlVFLCAmaW5mbykpCisgICAgICAgICAg
IG1faXRlbXMuYXBwZW5kKENvbnRleHRNZW51SXRlbShpbmZvKSk7CisgICAgfQogfQogCi1ITUVO
VSBDb250ZXh0TWVudTo6cmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKQorSE1FTlUgQ29udGV4
dE1lbnU6Om5hdGl2ZU1lbnUoKQogewotICAgIEhNRU5VIGRlc2NyaXB0aW9uID0gbV9wbGF0Zm9y
bURlc2NyaXB0aW9uOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IDA7Ci0gICAgcmV0dXJu
IGRlc2NyaXB0aW9uOwotfQorICAgIEhNRU5VIG1lbnUgPSA6OkNyZWF0ZVBvcHVwTWVudSgpOwog
Ci1WZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBjb250ZXh0TWVudUl0ZW1WZWN0b3IoUGxhdGZvcm1N
ZW51RGVzY3JpcHRpb24pCi17Ci0gICAgLy8gRklYTUUgLSBJbXBsZW1lbnQKLSAgICByZXR1cm4g
VmVjdG9yPENvbnRleHRNZW51SXRlbT4oKTsKLX0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1f
aXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgTUVOVUlURU1JTkZPIG1lbnVJdGVtID0gbV9p
dGVtc1tpXS5uYXRpdmVNZW51SXRlbSgpOworICAgICAgICA6Okluc2VydE1lbnVJdGVtKG1lbnUs
IGksIFRSVUUsICZtZW51SXRlbSk7CisgICAgfQogCi1QbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBw
bGF0Zm9ybU1lbnVEZXNjcmlwdGlvbihWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYgbWVudUl0ZW1W
ZWN0b3IpCi17Ci0gICAgLy8gRklYTUUgLSBJbXBsZW1lbnQKLSAgICByZXR1cm4gMDsKKyAgICBy
ZXR1cm4gbWVudTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViS2l0Mi9T
aGFyZWQvV2ViQ29udGV4dE1lbnVJdGVtRGF0YS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Mi9T
aGFyZWQvV2ViQ29udGV4dE1lbnVJdGVtRGF0YS5jcHAJKHJldmlzaW9uIDczNTM2KQorKysgV2Vi
S2l0Mi9TaGFyZWQvV2ViQ29udGV4dE1lbnVJdGVtRGF0YS5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTY5LDcgKzY5LDExIEBAIFdlYkNvbnRleHRNZW51SXRlbURhdGE6OldlYkNvbnRleHRNZW51SXQK
ICAgICAsIG1fdGl0bGUoaXRlbS50aXRsZSgpKQogewogICAgIGlmIChtX3R5cGUgPT0gV2ViQ29y
ZTo6U3VibWVudVR5cGUpIHsKKyNpZiBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykK
KyAgICAgICAgVmVjdG9yPFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbT4gY29yZVN1Ym1lbnUgPSBp
dGVtLnN1Ym1lbnUoKTsKKyNlbHNlCiAgICAgICAgIFZlY3RvcjxXZWJDb3JlOjpDb250ZXh0TWVu
dUl0ZW0+IGNvcmVTdWJtZW51ID0gV2ViQ29yZTo6Y29udGV4dE1lbnVJdGVtVmVjdG9yKGl0ZW0u
cGxhdGZvcm1TdWJNZW51KCkpOworI2VuZGlmCiAgICAgICAgIG1fc3VibWVudSA9IGtpdEl0ZW1z
KGNvcmVTdWJtZW51LCBtZW51KTsKICAgICB9CiAgICAgCkluZGV4OiBXZWJLaXQyL1dlYlByb2Nl
c3MvV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5j
cHAJKHJldmlzaW9uIDczNTM2KQorKysgV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0
L1dlYkNvbnRleHRNZW51Q2xpZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDEsMTEgKzQxLDE5
IEBAIHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51RGUKICAgICBkZWxldGUg
dGhpczsKIH0KIAorI2lmIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQorUGFzc093
blB0cjxDb250ZXh0TWVudT4gV2ViQ29udGV4dE1lbnVDbGllbnQ6OmN1c3RvbWl6ZU1lbnUoUGFz
c093blB0cjxDb250ZXh0TWVudT4gbWVudSkKK3sKKyAgICAvLyBXZWJLaXQyIGlnbm9yZXMgdGhp
cyBjbGllbnQgY2FsbGJhY2sgYW5kIGRvZXMgY29udGV4dCBtZW51IGN1c3RvbWl6YXRpb24gd2hl
biBpdCBpcyB0b2xkIHRvIHNob3cgdGhlIG1lbnUuCisgICAgcmV0dXJuIG1lbnU7Cit9CisjZWxz
ZQogUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gV2ViQ29udGV4dE1lbnVDbGllbnQ6OmdldEN1c3Rv
bU1lbnVGcm9tRGVmYXVsdEl0ZW1zKENvbnRleHRNZW51KiBtZW51KQogewogICAgIC8vIFdlYktp
dDIgaWdub3JlcyB0aGlzIGNsaWVudCBjYWxsYmFjayBhbmQgZG9lcyBjb250ZXh0IG1lbnUgY3Vz
dG9taXphdGlvbiB3aGVuIGl0IGlzIHRvbGQgdG8gc2hvdyB0aGUgbWVudS4KICAgICByZXR1cm4g
bWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpOwogfQorI2VuZGlmCiAKIHZvaWQgV2ViQ29udGV4
dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51SXRlbVNlbGVjdGVkKENvbnRleHRNZW51SXRlbSosIGNv
bnN0IENvbnRleHRNZW51KikKIHsKSW5kZXg6IFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3Vw
cG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdDIvV2ViUHJv
Y2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oCShyZXZpc2lvbiA3MzUz
NikKKysrIFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNs
aWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC00Miw3ICs0MiwxMSBAQCBwdWJsaWM6CiBwcml2YXRl
OgogICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudURlc3Ryb3llZCgpOwogICAgIAorI2lmIFVT
RShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQorICAgIHZpcnR1YWwgUGFzc093blB0cjxX
ZWJDb3JlOjpDb250ZXh0TWVudT4gY3VzdG9taXplTWVudShQYXNzT3duUHRyPFdlYkNvcmU6OkNv
bnRleHRNZW51Pik7CisjZWxzZQogICAgIHZpcnR1YWwgV2ViQ29yZTo6UGxhdGZvcm1NZW51RGVz
Y3JpcHRpb24gZ2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMoV2ViQ29yZTo6Q29udGV4dE1l
bnUqKTsKKyNlbmRpZgogICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudUl0ZW1TZWxlY3RlZChX
ZWJDb3JlOjpDb250ZXh0TWVudUl0ZW0qLCBjb25zdCBXZWJDb3JlOjpDb250ZXh0TWVudSopOwog
ICAgIAogICAgIHZpcnR1YWwgdm9pZCBkb3dubG9hZFVSTChjb25zdCBXZWJDb3JlOjpLVVJMJiB1
cmwpOwpJbmRleDogV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViQ29udGV4dE1lbnUuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYkNvbnRleHRNZW51
LmNwcAkocmV2aXNpb24gNzM1MzYpCisrKyBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJD
b250ZXh0TWVudS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY0LDcgKzY0LDExIEBAIHZvaWQgV2Vi
Q29udGV4dE1lbnU6OnNob3coKQogICAgICAgICByZXR1cm47CiAKICAgICAvLyBHaXZlIHRoZSBi
dW5kbGUgY2xpZW50IGEgY2hhbmNlIHRvIHByb2Nlc3MgdGhlIG1lbnUuCisjaWYgVVNFKENST1NT
X1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCisgICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gY29y
ZUl0ZW1zID0gbWVudS0+aXRlbXMoKTsKKyNlbHNlCiAgICAgVmVjdG9yPENvbnRleHRNZW51SXRl
bT4gY29yZUl0ZW1zID0gY29udGV4dE1lbnVJdGVtVmVjdG9yKG1lbnUtPnBsYXRmb3JtRGVzY3Jp
cHRpb24oKSk7CisjZW5kaWYKICAgICBWZWN0b3I8V2ViQ29udGV4dE1lbnVJdGVtRGF0YT4gcHJv
cG9zZWRNZW51ID0ga2l0SXRlbXMoY29yZUl0ZW1zLCBtZW51KTsKICAgICBWZWN0b3I8V2ViQ29u
dGV4dE1lbnVJdGVtRGF0YT4gbmV3TWVudTsKICAgICBSZWZQdHI8QVBJT2JqZWN0PiB1c2VyRGF0
YTsKSW5kZXg6IFdlYktpdC93aW4vV2ViVmlldy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dp
bi9XZWJWaWV3LmNwcAkocmV2aXNpb24gNzM1MzYpCisrKyBXZWJLaXQvd2luL1dlYlZpZXcuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xMjc1LDEyICsxMjc1LDEyIEBAIGJvb2wgV2ViVmlldzo6aGFu
ZGxlQ29udGV4dE1lbnVFdmVudChXUEEKICAgICAgICAgbV91aURlbGVnYXRlLT5oYXNDdXN0b21N
ZW51SW1wbGVtZW50YXRpb24oJmhhc0N1c3RvbU1lbnVzKTsKIAogICAgIGlmIChoYXNDdXN0b21N
ZW51cykKLSAgICAgICAgbV91aURlbGVnYXRlLT50cmFja0N1c3RvbVBvcHVwTWVudSgoSVdlYlZp
ZXcqKXRoaXMsIChPTEVfSEFORExFKShVTE9ORzY0KWNvcmVNZW51LT5wbGF0Zm9ybURlc2NyaXB0
aW9uKCksICZwb2ludCk7CisgICAgICAgIG1fdWlEZWxlZ2F0ZS0+dHJhY2tDdXN0b21Qb3B1cE1l
bnUoKElXZWJWaWV3Kil0aGlzLCAoT0xFX0hBTkRMRSkoVUxPTkc2NCljb3JlTWVudS0+bmF0aXZl
TWVudSgpLCAmcG9pbnQpOwogICAgIGVsc2UgewogICAgICAgICAvLyBTdXJwcmlzaW5nbHksIFRQ
TV9SSUdIVEJVVFRPTiBtZWFucyB0aGF0IGl0ZW1zIGFyZSBzZWxlY3RhYmxlIHdpdGggZWl0aGVy
IHRoZSByaWdodCBPUiBsZWZ0IG1vdXNlIGJ1dHRvbgogICAgICAgICBVSU5UIGZsYWdzID0gVFBN
X1JJR0hUQlVUVE9OIHwgVFBNX1RPUEFMSUdOIHwgVFBNX1ZFUlBPU0FOSU1BVElPTiB8IFRQTV9I
T1JJWk9OVEFMCiAgICAgICAgICAgICB8IFRQTV9MRUZUQUxJR04gfCBUUE1fSE9SUE9TQU5JTUFU
SU9OOwotICAgICAgICA6OlRyYWNrUG9wdXBNZW51RXgoY29yZU1lbnUtPnBsYXRmb3JtRGVzY3Jp
cHRpb24oKSwgZmxhZ3MsIHBvaW50LngsIHBvaW50LnksIG1fdmlld1dpbmRvdywgMCk7CisgICAg
ICAgIDo6VHJhY2tQb3B1cE1lbnVFeChjb3JlTWVudS0+bmF0aXZlTWVudSgpLCBmbGFncywgcG9p
bnQueCwgcG9pbnQueSwgbV92aWV3V2luZG93LCAwKTsKICAgICB9CiAKICAgICByZXR1cm4gdHJ1
ZTsKQEAgLTEzNTUsMTEgKzEzNTUsMTAgQEAgdm9pZCBXZWJWaWV3OjpwZXJmb3JtQ29udGV4dE1l
bnVBY3Rpb24oVwogICAgIENvbnRleHRNZW51KiBtZW51ID0gbV9wYWdlLT5jb250ZXh0TWVudUNv
bnRyb2xsZXIoKS0+Y29udGV4dE1lbnUoKTsKICAgICBBU1NFUlQobWVudSk7CiAKLSAgICBDb250
ZXh0TWVudUl0ZW0qIGl0ZW0gPSBieVBvc2l0aW9uID8gbWVudS0+aXRlbUF0SW5kZXgoKHVuc2ln
bmVkKXdQYXJhbSwgKEhNRU5VKWxQYXJhbSkgOiBtZW51LT5pdGVtV2l0aEFjdGlvbigoQ29udGV4
dE1lbnVBY3Rpb24pd1BhcmFtKTsKKyAgICBDb250ZXh0TWVudUl0ZW0qIGl0ZW0gPSBieVBvc2l0
aW9uID8gbWVudS0+aXRlbUF0SW5kZXgoKHVuc2lnbmVkKXdQYXJhbSkgOiBtZW51LT5pdGVtV2l0
aEFjdGlvbigoQ29udGV4dE1lbnVBY3Rpb24pd1BhcmFtKTsKICAgICBpZiAoIWl0ZW0pCiAgICAg
ICAgIHJldHVybjsKICAgICBtX3BhZ2UtPmNvbnRleHRNZW51Q29udHJvbGxlcigpLT5jb250ZXh0
TWVudUl0ZW1TZWxlY3RlZChpdGVtKTsKLSAgICBkZWxldGUgaXRlbTsKIH0KIAogYm9vbCBXZWJW
aWV3OjpoYW5kbGVNb3VzZUV2ZW50KFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFN
IGxQYXJhbSkKSW5kZXg6IFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVD
bGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ29u
dGV4dE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiA3MzUzNikKKysrIFdlYktpdC93aW4vV2ViQ29y
ZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01NSwy
MSArNTUsMjMgQEAgdm9pZCBXZWJDb250ZXh0TWVudUNsaWVudDo6Y29udGV4dE1lbnVEZQogICAg
IGRlbGV0ZSB0aGlzOwogfQogCi1ITUVOVSBXZWJDb250ZXh0TWVudUNsaWVudDo6Z2V0Q3VzdG9t
TWVudUZyb21EZWZhdWx0SXRlbXMoQ29udGV4dE1lbnUqIG1lbnUpCitQYXNzT3duUHRyPENvbnRl
eHRNZW51PiBXZWJDb250ZXh0TWVudUNsaWVudDo6Y3VzdG9taXplTWVudShQYXNzT3duUHRyPENv
bnRleHRNZW51PiBtZW51KQogewogICAgIENPTVB0cjxJV2ViVUlEZWxlZ2F0ZT4gdWlEZWxlZ2F0
ZTsKICAgICBpZiAoRkFJTEVEKG1fd2ViVmlldy0+dWlEZWxlZ2F0ZSgmdWlEZWxlZ2F0ZSkpKQot
ICAgICAgICByZXR1cm4gbWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpOworICAgICAgICByZXR1
cm4gbWVudTsKIAogICAgIEFTU0VSVCh1aURlbGVnYXRlKTsKIAotICAgIEhNRU5VIG5ld01lbnUg
PSAwOworICAgIEhNRU5VIG5hdGl2ZU1lbnUgPSBtZW51LT5uYXRpdmVNZW51KCk7CiAgICAgQ09N
UHRyPFdlYkVsZW1lbnRQcm9wZXJ0eUJhZz4gcHJvcGVydHlCYWc7CiAgICAgcHJvcGVydHlCYWcu
YWRvcHRSZWYoV2ViRWxlbWVudFByb3BlcnR5QmFnOjpjcmVhdGVJbnN0YW5jZShtX3dlYlZpZXct
PnBhZ2UoKS0+Y29udGV4dE1lbnVDb250cm9sbGVyKCktPmhpdFRlc3RSZXN1bHQoKSkpOwogICAg
IC8vIEZJWE1FOiBXZSBuZWVkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGRvIHRoZSBkZWZhdWx0IGJl
Zm9yZSBjYWxsaW5nIHRoaXMgZGVsZWdhdGUgbWV0aG9kCi0gICAgaWYgKEZBSUxFRCh1aURlbGVn
YXRlLT5jb250ZXh0TWVudUl0ZW1zRm9yRWxlbWVudChtX3dlYlZpZXcsIHByb3BlcnR5QmFnLmdl
dCgpLCAoT0xFX0hBTkRMRSkoVUxPTkc2NCltZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCksIChP
TEVfSEFORExFKikmbmV3TWVudSkpKQotICAgICAgICByZXR1cm4gbWVudS0+cGxhdGZvcm1EZXNj
cmlwdGlvbigpOwotICAgIHJldHVybiBuZXdNZW51OworICAgIGlmIChGQUlMRUQodWlEZWxlZ2F0
ZS0+Y29udGV4dE1lbnVJdGVtc0ZvckVsZW1lbnQobV93ZWJWaWV3LCBwcm9wZXJ0eUJhZy5nZXQo
KSwgKE9MRV9IQU5ETEUpKFVMT05HNjQpbmF0aXZlTWVudSwgKE9MRV9IQU5ETEUqKSZuYXRpdmVN
ZW51KSkpCisgICAgICAgIHJldHVybiBtZW51OworICAgIAorICAgIE93blB0cjxDb250ZXh0TWVu
dT4gY3VzdG9taXplZE1lbnUobmV3IENvbnRleHRNZW51KG5hdGl2ZU1lbnUpKTsKKyAgICByZXR1
cm4gY3VzdG9taXplZE1lbnUucmVsZWFzZSgpOwogfQogCiB2b2lkIFdlYkNvbnRleHRNZW51Q2xp
ZW50Ojpjb250ZXh0TWVudUl0ZW1TZWxlY3RlZChDb250ZXh0TWVudUl0ZW0qIGl0ZW0sIGNvbnN0
IENvbnRleHRNZW51KiBwYXJlbnRNZW51KQpAQCAtODQsOCArODYsOSBAQCB2b2lkIFdlYkNvbnRl
eHRNZW51Q2xpZW50Ojpjb250ZXh0TWVudUl0CiAKICAgICBDT01QdHI8V2ViRWxlbWVudFByb3Bl
cnR5QmFnPiBwcm9wZXJ0eUJhZzsKICAgICBwcm9wZXJ0eUJhZy5hZG9wdFJlZihXZWJFbGVtZW50
UHJvcGVydHlCYWc6OmNyZWF0ZUluc3RhbmNlKG1fd2ViVmlldy0+cGFnZSgpLT5jb250ZXh0TWVu
dUNvbnRyb2xsZXIoKS0+aGl0VGVzdFJlc3VsdCgpKSk7Ci0gICAgICAgICAgICAKLSAgICB1aURl
bGVnYXRlLT5jb250ZXh0TWVudUl0ZW1TZWxlY3RlZChtX3dlYlZpZXcsIGl0ZW0tPnJlbGVhc2VQ
bGF0Zm9ybURlc2NyaXB0aW9uKCksIHByb3BlcnR5QmFnLmdldCgpKTsKKworICAgIE1FTlVJVEVN
SU5GTyBzZWxlY3RlZEl0ZW0gPSBpdGVtLT5uYXRpdmVNZW51SXRlbSgpOworICAgIHVpRGVsZWdh
dGUtPmNvbnRleHRNZW51SXRlbVNlbGVjdGVkKG1fd2ViVmlldywgJnNlbGVjdGVkSXRlbSwgcHJv
cGVydHlCYWcuZ2V0KCkpOwogfQogCiB2b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50Ojpkb3dubG9h
ZFVSTChjb25zdCBLVVJMJiB1cmwpCkluZGV4OiBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dl
YkNvbnRleHRNZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJDb3JlU3Vw
cG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oCShyZXZpc2lvbiA3MzUzNikKKysrIFdlYktpdC93
aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpA
QCAtMjMsOCArMjMsMTEgQEAKICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAogICovCiAKKyNpbmNsdWRlIDxXZWJD
b3JlL0NvbnRleHRNZW51Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9Db250ZXh0TWVudUNsaWVudC5o
PgorI2luY2x1ZGUgPFdlYkNvcmUvUGxhdGZvcm1NZW51RGVzY3JpcHRpb24uaD4KICNpbmNsdWRl
IDx3dGYvRm9yd2FyZC5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CiAKIGNsYXNzIFdl
YlZpZXc7CiAKQEAgLTM0LDcgKzM3LDcgQEAgcHVibGljOgogCiAgICAgdmlydHVhbCB2b2lkIGNv
bnRleHRNZW51RGVzdHJveWVkKCk7CiAKLSAgICB2aXJ0dWFsIEhNRU5VIGdldEN1c3RvbU1lbnVG
cm9tRGVmYXVsdEl0ZW1zKFdlYkNvcmU6OkNvbnRleHRNZW51Kik7CisgICAgdmlydHVhbCBQYXNz
T3duUHRyPFdlYkNvcmU6OkNvbnRleHRNZW51PiBjdXN0b21pemVNZW51KFBhc3NPd25QdHI8V2Vi
Q29yZTo6Q29udGV4dE1lbnU+KTsKICAgICB2aXJ0dWFsIHZvaWQgY29udGV4dE1lbnVJdGVtU2Vs
ZWN0ZWQoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtKiwgY29uc3QgV2ViQ29yZTo6Q29udGV4dE1l
bnUqKTsKICAgICAKICAgICB2aXJ0dWFsIHZvaWQgZG93bmxvYWRVUkwoY29uc3QgV2ViQ29yZTo6
S1VSTCYpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76105</attachid>
            <date>2010-12-09 12:13:27 -0800</date>
            <delta_ts>2010-12-09 17:41:31 -0800</delta_ts>
            <desc>[PATCH] CROSS_PLATFORM_CONTEXT_MENUS refactoring</desc>
            <filename>context_menu_refactoring_win.patch</filename>
            <type>text/plain</type>
            <size>42916</size>
            <attacher name="Brian Weinstein">bweinstein</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MzYzNCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzUgQEAKKzIwMTAtMTItMDkgIEJyaWFuIFdlaW5zdGVpbiAgPGJ3ZWluc3RlaW5A
YXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFByZXAgZm9yIFdlYktpdDI6IENvbnRleHQgbWVudSBzdXBwb3J0IG9uIFdpbmRvd3MKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUwNTE0CisgICAg
ICAgIAorICAgICAgICBCZWZvcmUgdGhpcyBwYXRjaCBDb250ZXh0TWVudSBvbiBXaW5kb3dzIHdl
cmUgYmFja2VkIGJ5IEhNRU5VcywgYW5kIENvbnRleHRNZW51SXRlbXMKKyAgICAgICAgd2VyZSBi
YWNrZWQgYnkgTUVOVUlURU1JTkZPcy4gVGhpcyBtZWFudCB0aGV5IGNvdWxkbid0IGJlIGNvcGll
ZCwgYW5kIHRoZXkgbmVlZGVkIHRvCisgICAgICAgIGJlIHRvIHdvcmsgaW4gV2ViS2l0Mi4KKyAg
ICAgICAgCisgICAgICAgIFRoaXMgcGF0Y2ggYWRkcyBhIG5ldyBVU0UgZmxhZyAtIENST1NTX1BM
QVRGT1JNX0NPTlRFWFRfTUVOVVMgdGhhdCBhcmUgZm9yIGEgY3Jvc3MtcGxhdGZvcm0KKyAgICAg
ICAgcmVwcmVzZW50YXRpb24gb2YgY29udGV4dCBtZW51cy4gVGhpcyBwYXRjaCBhbHNvIGhhcyBX
aW5kb3dzIGFkb3B0IHRoZW0uCisgICAgICAgIAorICAgICAgICBDcm9zcy1wbGF0Zm9ybSBjb250
ZXh0IG1lbnVzIGNoYW5nZSB0aGUgQVBJIG9mIGNvbnRleHQgbWVudXMgYW5kIHRoZSBDb250ZXh0
TWVudUNsaWVudC4gVGhlcmUKKyAgICAgICAgaXMgbm8gbW9yZSBpZGVhIG9mIGEgUGxhdGZvcm1N
ZW51RGVzY3JpcHRpb24gb3IgYSBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24uIE1lbnVzIGFy
ZSBiYWNrZWQKKyAgICAgICAgYnkgYSBWZWN0b3Igb2YgQ29udGV4dE1lbnVJdGVtcywgYW5kIG1l
bnUgaXRlbXMgYXJlIGJhY2tlZCBieSB0aGUgdmFyaWFibGVzIHRoZXkgbmVlZCAoZW5hYmxlZCwg
Y2hlY2tlZAorICAgICAgICB0aXRsZSwgYWN0aW9uLCB0eXBlLCBhbmQgc3VibWVudSkuCisgICAg
ICAgIAorICAgICAgICBUaGlzIHBhdGNoIGFsc28gcmVmYWN0b3JzIHRoZSBDb250ZXh0TWVudUNs
aWVudCBpbnRlcmZhY2UgdG8gdXNlIGEgdmFyaWF0aW9uIG9uIHRoZSBnZXRDdXN0b21NZW51RnJv
bURlZmF1bHRJdGVtcworICAgICAgICBmdW5jdGlvbiB0byBhbGxvdyBmb3IgY3VzdG9taXphdGlv
biBvZiB0aGUgY29udGV4dCBtZW51LgorICAgICAgICAKKyAgICAgICAgRm9yIG90aGVyIHBvcnRz
IHRvIHVzZSBDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTLCBhbGwgdGhleSBuZWVkIHRvIGRv
IGlzIHdyaXRlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGZyb20KKyAgICAgICAgYSBDb250ZXh0TWVu
dSA8LT4gbmF0aXZlIG1lbnUgdHlwZSwgYW5kIENvbnRleHRNZW51SXRlbSA8LT4gbmF0aXZlIG1l
bnUgaXRlbSB0eXBlLiBGb3IgV2luZG93cywgdGhpcyBpcyBkb25lCisgICAgICAgIGluIENvbnRl
eHRNZW51V2luLmNwcCBhbmQgQ29udGV4dE1lbnVJdGVtV2luLmNwcC4KKworICAgICAgICBObyBu
ZXcgdGVzdHMsIG5vIGNoYW5nZSBpbiBiZWhhdmlvci4KKworICAgICAgICAqIFdlYkNvcmUudmNw
cm9qL1dlYkNvcmUudmNwcm9qOiBBZGQgbmV3IGZpbGVzIChvbmx5IG5lZWRlZCBvbiBXaW5kb3dz
IGZvciBub3cpLgorICAgICAgICAqIGxvYWRlci9FbXB0eUNsaWVudHMuaDoKKyAgICAgICAgKFdl
YkNvcmU6OkVtcHR5Q29udGV4dE1lbnVDbGllbnQ6OmN1c3RvbWl6ZU1lbnUpOiBEZWZpbmUgdGhp
cyBmdW5jdGlvbiBpZiBDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTCisgICAgICAgICAgICBp
cyBvbi4KKyAgICAgICAgKiBwYWdlL0NvbnRleHRNZW51Q2xpZW50Lmg6IERpdHRvLiAKKyAgICAg
ICAgKiBwYWdlL0NvbnRleHRNZW51Q29udHJvbGxlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpD
b250ZXh0TWVudUNvbnRyb2xsZXI6OnNob3dDb250ZXh0TWVudSk6IENhbGwgY3VzdG9taXplTWVu
dSBpbnN0ZWFkIG9mIAorICAgICAgICAgICAgZ2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMg
aWYgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUyBpcyBvbi4KKyAgICAgICAgKiBwbGF0Zm9y
bS9Db250ZXh0TWVudS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6
OkNvbnRleHRNZW51KTogRW1wdHkgY29uc3RydWN0b3IuCisgICAgICAgIChXZWJDb3JlOjpDb250
ZXh0TWVudTo6c2V0SXRlbXMpOiBTZXRzIHRoZSBpdGVtcyBpbiB0aGUgbWVudS4KKyAgICAgICAg
KFdlYkNvcmU6OkNvbnRleHRNZW51OjppdGVtcyk6IFJldHVybnMgdGhlIGl0ZW1zIGluIHRoZSBt
ZW51LgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6Oml0ZW1BdEluZGV4KToKKyAgICAg
ICAgKFdlYkNvcmU6Oml0ZW1XaXRoQWN0aW9uSW5NZW51KTogUmV0dXJucyB0aGUgaXRlbSB3aXRo
IHRoZSBjb3JyZWN0IGFjdGlvbiwgcmVjdXJzaXZlbHkgZGVzY2VuZGluZworICAgICAgICAgICAg
aW50byBzdWJtZW51cy4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjppdGVtV2l0aEFj
dGlvbik6IENhbGxzIHRocm91Z2ggdG8gaXRlbVdpdGhBY3Rpb25Jbk1lbnUuCisgICAgICAgICog
cGxhdGZvcm0vQ29udGV4dE1lbnUuaDogQWRkZWQgYSBuZXcgc2V0IG9mIGZ1bmN0aW9ucyBhbmQg
bWVtYmVyIHZhcmlhYmxlcyB0aGF0IGFyZSBkZWZpbmVkIGZvcgorICAgICAgICAgICAgQ1JPU1Nf
UExBVEZPUk1fQ09OVEVYVF9NRU5VUy4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51Ojph
cHBlbmRJdGVtKTogQXBwZW5kcyBhbiBpdGVtIHRvIHRoZSBtZW51LgorICAgICAgICAqIHBsYXRm
b3JtL0NvbnRleHRNZW51SXRlbS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4
dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0pOgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1l
bnVJdGVtOjp+Q29udGV4dE1lbnVJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51
SXRlbTo6c2V0U3ViTWVudSk6CisgICAgICAgICogcGxhdGZvcm0vQ29udGV4dE1lbnVJdGVtLmg6
CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnR5cGUpOiBSZXR1cm5zIHRoZSB0
eXBlLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRUeXBlKTogU2V0cyB0
aGUgdHlwZS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6YWN0aW9uKTogUmV0
dXJucyB0aGUgYWN0aW9uLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRB
Y3Rpb24pOiBTZXRzIHRoZSBhY3Rpb24uCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0
ZW06OnRpdGxlKTogUmV0dXJucyB0aGUgdGl0bGUuCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0
TWVudUl0ZW06OnNldFRpdGxlKTogU2V0cyB0aGUgdGl0bGUuCisgICAgICAgIChXZWJDb3JlOjpD
b250ZXh0TWVudUl0ZW06OmNoZWNrZWQpOiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtZW51
IGl0ZW0gaXMgY2hlY2tlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6c2V0
Q2hlY2tlZCk6IFNldHMgd2hldGhlciBvdCBub3QgdGhlIG1lbnUgaXRlbSBpcyBjaGVja2VkLgor
ICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjplbmFibGVkKTogUmV0dXJucyB3aGV0
aGVyIG9yIG5vdCB0aGUgbWVudSBpdGVtIGlzIGVuYWJsZWQuCisgICAgICAgIChXZWJDb3JlOjpD
b250ZXh0TWVudUl0ZW06OnNldEVuYWJsZWQpOiBTZXRzIHdoZXRoZXIgb3Igbm90IHRoZSBtZW51
IGl0ZW0gaXMgZW5hYmxlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6c3Vi
bWVudSk6IFJldHVybnMgdGhlIHN1Ym1lbnUuCisgICAgICAgICogcGxhdGZvcm0vUGxhdGZvcm1N
ZW51RGVzY3JpcHRpb24uaDogUmVtb3ZlIHRoZSBpZGVhIGlmIGEgUGxhdGZvcm1NZW51RGVzY3Jp
cHRpb24gaWYgCisgICAgICAgICAgICBDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTIGlzIG9u
LgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9Db250ZXh0TWVudUl0ZW1XaW4uY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0pOiBDcmVhdGVzIGEg
Q29udGV4dE1lbnVJdGVtIGZyb20gYSBNRU5VSVRFTUlORk8uCisgICAgICAgIChXZWJDb3JlOjpD
b250ZXh0TWVudUl0ZW06Om5hdGl2ZU1lbnVJdGVtKTogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIE1F
TlVJVEVNSU5GTy4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vQ29udGV4dE1lbnVXaW4uY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6OkNvbnRleHRNZW51KTogQ3JlYXRlcyBhIENv
bnRleHRNZW51IGZyb20gYW4gSE1FTlUuCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudTo6
bmF0aXZlTWVudSk6IENyZWF0ZXMgYW5kIHJldHVybnMgYW4gSE1FTlUuCisKIDIwMTAtMTItMDkg
IFlhZWwgQWhhcm9uICA8eWFlbC5haGFyb25Abm9raWEuY29tPgogCiAgICAgICAgIFJldmlld2Vk
IGJ5IEFudG9uaW8gR29tZXMuCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUu
dmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3By
b2oJKHJldmlzaW9uIDczNTM2KQorKysgV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZj
cHJvagkod29ya2luZyBjb3B5KQpAQCAtMjUzMTMsMTAgKzI1MzEzLDE4IEBACiAJCQkJUmVsYXRp
dmVQYXRoPSIuLlxwbGF0Zm9ybVxDb250ZW50VHlwZS5oIgogCQkJCT4KIAkJCTwvRmlsZT4KKyAg
ICAgICAgICAgIDxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxDb250ZXh0TWVu
dS5jcHAiCisJCQkJPgorCQkJPC9GaWxlPgogCQkJPEZpbGUKIAkJCQlSZWxhdGl2ZVBhdGg9Ii4u
XHBsYXRmb3JtXENvbnRleHRNZW51LmgiCiAJCQkJPgogCQkJPC9GaWxlPgorICAgICAgICAgICAg
PEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXENvbnRleHRNZW51SXRlbS5jcHAi
CisJCQkJPgorCQkJPC9GaWxlPgogCQkJPEZpbGUKIAkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRm
b3JtXENvbnRleHRNZW51SXRlbS5oIgogCQkJCT4KSW5kZXg6IFdlYkNvcmUvbG9hZGVyL0VtcHR5
Q2xpZW50cy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvbG9hZGVyL0VtcHR5Q2xpZW50cy5oCShy
ZXZpc2lvbiA3MzUzNikKKysrIFdlYkNvcmUvbG9hZGVyL0VtcHR5Q2xpZW50cy5oCSh3b3JraW5n
IGNvcHkpCkBAIC01MDEsNyArNTAxLDExIEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5FbXB0eUNv
bnRleHRNZW51Q2xpZW50KCkgeyAgfQogICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudURlc3Ry
b3llZCgpIHsgfQogCisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCisgICAg
dmlydHVhbCBQYXNzT3duUHRyPENvbnRleHRNZW51PiBjdXN0b21pemVNZW51KFBhc3NPd25QdHI8
Q29udGV4dE1lbnU+KSB7IHJldHVybiAwOyB9CisjZWxzZQogICAgIHZpcnR1YWwgUGxhdGZvcm1N
ZW51RGVzY3JpcHRpb24gZ2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMoQ29udGV4dE1lbnUq
KSB7IHJldHVybiAwOyB9CisjZW5kaWYKICAgICB2aXJ0dWFsIHZvaWQgY29udGV4dE1lbnVJdGVt
U2VsZWN0ZWQoQ29udGV4dE1lbnVJdGVtKiwgY29uc3QgQ29udGV4dE1lbnUqKSB7IH0KIAogICAg
IHZpcnR1YWwgdm9pZCBkb3dubG9hZFVSTChjb25zdCBLVVJMJikgeyB9CkluZGV4OiBXZWJDb3Jl
L3BhZ2UvQ29udGV4dE1lbnVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BhZ2UvQ29u
dGV4dE1lbnVDbGllbnQuaAkocmV2aXNpb24gNzM1MzYpCisrKyBXZWJDb3JlL3BhZ2UvQ29udGV4
dE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMjYsMTEgKzI2LDEyIEBACiAjaWZuZGVm
IENvbnRleHRNZW51Q2xpZW50X2gKICNkZWZpbmUgQ29udGV4dE1lbnVDbGllbnRfaAogCisjaW5j
bHVkZSAiQ29udGV4dE1lbnUuaCIKICNpbmNsdWRlICJQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbi5o
IgogI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4K
IAogbmFtZXNwYWNlIFdlYkNvcmUgewotICAgIGNsYXNzIENvbnRleHRNZW51OwogICAgIGNsYXNz
IENvbnRleHRNZW51SXRlbTsKICAgICBjbGFzcyBGcmFtZTsKICAgICBjbGFzcyBIaXRUZXN0UmVz
dWx0OwpAQCAtNDEsNyArNDIsMTIgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB2aXJ0
dWFsIH5Db250ZXh0TWVudUNsaWVudCgpIHsgIH0KICAgICAgICAgdmlydHVhbCB2b2lkIGNvbnRl
eHRNZW51RGVzdHJveWVkKCkgPSAwOwogICAgICAgICAKKyNpZiBVU0UoQ1JPU1NfUExBVEZPUk1f
Q09OVEVYVF9NRU5VUykKKyAgICAgICAgdmlydHVhbCBQYXNzT3duUHRyPENvbnRleHRNZW51PiBj
dXN0b21pemVNZW51KFBhc3NPd25QdHI8Q29udGV4dE1lbnU+KSA9IDA7CisjZWxzZQogICAgICAg
ICB2aXJ0dWFsIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGdldEN1c3RvbU1lbnVGcm9tRGVmYXVs
dEl0ZW1zKENvbnRleHRNZW51KikgPSAwOworI2VuZGlmCisKICAgICAgICAgdmlydHVhbCB2b2lk
IGNvbnRleHRNZW51SXRlbVNlbGVjdGVkKENvbnRleHRNZW51SXRlbSosIGNvbnN0IENvbnRleHRN
ZW51KikgPSAwOwogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBkb3dubG9hZFVSTChjb25zdCBLVVJM
JiB1cmwpID0gMDsKSW5kZXg6IFdlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNvbnRyb2xsZXIuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNvbnRyb2xsZXIuY3BwCShy
ZXZpc2lvbiA3MzUzNikKKysrIFdlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNvbnRyb2xsZXIuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xNDQsOCArMTQ0LDEzIEBAIHZvaWQgQ29udGV4dE1lbnVDb250
cm9sbGVyOjpzaG93Q29udGV4dE0KICAgICBpZiAobV9wYWdlLT5pbnNwZWN0b3JDb250cm9sbGVy
KCktPmVuYWJsZWQoKSkKICAgICAgICAgYWRkSW5zcGVjdEVsZW1lbnRJdGVtKCk7CiAjZW5kaWYK
KworI2lmIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQorICAgIG1fY29udGV4dE1l
bnUgPSBtX2NsaWVudC0+Y3VzdG9taXplTWVudShtX2NvbnRleHRNZW51LnJlbGVhc2UoKSk7Cisj
ZWxzZQogICAgIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGN1c3RvbU1lbnUgPSBtX2NsaWVudC0+
Z2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMobV9jb250ZXh0TWVudS5nZXQoKSk7CiAgICAg
bV9jb250ZXh0TWVudS0+c2V0UGxhdGZvcm1EZXNjcmlwdGlvbihjdXN0b21NZW51KTsKKyNlbmRp
ZgogICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOwogfQogCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL0NvbnRleHRNZW51LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL0Nv
bnRleHRNZW51LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1l
bnUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51LmgiCisKKyNpZiBVU0UoQ1JPU1Nf
UExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitDb250ZXh0
TWVudTo6Q29udGV4dE1lbnUoKQoreworfQorCitDb250ZXh0TWVudTo6Q29udGV4dE1lbnUoY29u
c3QgVmVjdG9yPENvbnRleHRNZW51SXRlbT4mIGl0ZW1zKQorICAgIDogbV9pdGVtcyhpdGVtcykg
Cit7Cit9CisKK3ZvaWQgQ29udGV4dE1lbnU6OnNldEl0ZW1zKFZlY3RvcjxDb250ZXh0TWVudUl0
ZW0+IG1lbnVJdGVtcykKK3sKKyAgICBtX2l0ZW1zID0gbWVudUl0ZW1zOworfQorCitWZWN0b3I8
Q29udGV4dE1lbnVJdGVtPiBDb250ZXh0TWVudTo6aXRlbXMoKQoreworICAgIHJldHVybiBtX2l0
ZW1zOworfQorCitDb250ZXh0TWVudUl0ZW0qIENvbnRleHRNZW51OjppdGVtQXRJbmRleCh1bnNp
Z25lZCBpbmRleCkKK3sKKyAgICByZXR1cm4gJihtX2l0ZW1zW2luZGV4XSk7Cit9CisKK3N0YXRp
YyBDb250ZXh0TWVudUl0ZW0qIGl0ZW1XaXRoQWN0aW9uSW5NZW51KHVuc2lnbmVkIGFjdGlvbiwg
VmVjdG9yPENvbnRleHRNZW51SXRlbT4mIG1lbnUpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBtZW51LnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChtZW51W2ldLmFjdGlvbigpID09
IGFjdGlvbikKKyAgICAgICAgICAgIHJldHVybiAmbWVudVtpXTsKKyAgICAgICAgaWYgKG1lbnVb
aV0udHlwZSgpID09IFN1Ym1lbnVUeXBlKSB7CisgICAgICAgICAgICBpZiAoQ29udGV4dE1lbnVJ
dGVtKiBzdWJNZW51SXRlbSA9IGl0ZW1XaXRoQWN0aW9uSW5NZW51KGFjdGlvbiwgbWVudVtpXS5z
dWJtZW51KCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBzdWJNZW51SXRlbTsKKyAgICAgICAg
fQorCisgICAgfQorICAgIHJldHVybiAwOworfQorCitDb250ZXh0TWVudUl0ZW0qIENvbnRleHRN
ZW51OjppdGVtV2l0aEFjdGlvbih1bnNpZ25lZCBhY3Rpb24pCit7CisgICAgcmV0dXJuIGl0ZW1X
aXRoQWN0aW9uSW5NZW51KGFjdGlvbiwgbV9pdGVtcyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKKworI2VuZGlmIC8vIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudS5oCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vQ29udGV4dE1lbnUuaAkocmV2aXNpb24gNzM1MzYpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL0NvbnRleHRNZW51LmgJKHdvcmtpbmcgY29weSkKQEAgLTQ2LDE1ICs0NiwzOSBAQCBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKICAgICBjbGFzcyBDb250ZXh0TWVudSA6IHB1YmxpYyBOb25jb3B5
YWJsZQogICAgIHsKKyNpZiBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKyAgICBw
dWJsaWM6CisjaWYgUExBVEZPUk0oV0lOKQorICAgICAgICB0eXBlZGVmIEhNRU5VIE5hdGl2ZU1l
bnVUeXBlOworI2VuZGlmCisgICAgICAgIENvbnRleHRNZW51KCk7CisgICAgICAgIENvbnRleHRN
ZW51KGNvbnN0IFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+Jik7CisgICAgICAgIENvbnRleHRNZW51
KE5hdGl2ZU1lbnVUeXBlKTsKKworICAgICAgICBOYXRpdmVNZW51VHlwZSBuYXRpdmVNZW51KCk7
CisKKyAgICAgICAgQ29udGV4dE1lbnVJdGVtKiBpdGVtV2l0aEFjdGlvbih1bnNpZ25lZCk7Cisg
ICAgICAgIENvbnRleHRNZW51SXRlbSogaXRlbUF0SW5kZXgodW5zaWduZWQpOworCisgICAgICAg
IHZvaWQgc2V0SXRlbXMoVmVjdG9yPENvbnRleHRNZW51SXRlbT4gaXRlbXMpOworICAgICAgICBW
ZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBpdGVtcygpOworCisgICAgICAgIHZvaWQgYXBwZW5kSXRl
bShjb25zdCBDb250ZXh0TWVudUl0ZW0mIGl0ZW0pIHsgbV9pdGVtcy5hcHBlbmQoaXRlbSk7IH0g
CisKKyAgICBwcml2YXRlOgorICAgICAgICBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBtX2l0ZW1z
OworI2Vsc2UKICAgICBwdWJsaWM6CiAgICAgICAgIENvbnRleHRNZW51KCk7CiAgICAgICAgIENv
bnRleHRNZW51KGNvbnN0IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uKTsKKwogICAgICAgICB+Q29u
dGV4dE1lbnUoKTsKIAogICAgICAgICB2b2lkIGluc2VydEl0ZW0odW5zaWduZWQgcG9zaXRpb24s
IENvbnRleHRNZW51SXRlbSYpOwogICAgICAgICB2b2lkIGFwcGVuZEl0ZW0oQ29udGV4dE1lbnVJ
dGVtJik7CiAgICAgICAgIAogICAgICAgICBDb250ZXh0TWVudUl0ZW0qIGl0ZW1XaXRoQWN0aW9u
KHVuc2lnbmVkKTsKKyAgICAgICAgQ29udGV4dE1lbnVJdGVtKiBpdGVtQXRJbmRleCh1bnNpZ25l
ZCk7CiAgICAgICAgIENvbnRleHRNZW51SXRlbSogaXRlbUF0SW5kZXgodW5zaWduZWQsIGNvbnN0
IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uKTsKIAogICAgICAgICB1bnNpZ25lZCBpdGVtQ291bnQo
KSBjb25zdDsKQEAgLTgzLDEwICsxMDcsMTQgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAg
ICB1bnNpZ25lZCBtX2l0ZW1Db3VudDsKICNlbmRpZgogI2VuZGlmCisKKyNlbmRpZiAvLyBVU0Uo
Q1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKICAgICB9OwogCisjaWYgIVVTRShDUk9TU19Q
TEFURk9STV9DT05URVhUX01FTlVTKQogVmVjdG9yPENvbnRleHRNZW51SXRlbT4gY29udGV4dE1l
bnVJdGVtVmVjdG9yKFBsYXRmb3JtTWVudURlc2NyaXB0aW9uKTsKIFBsYXRmb3JtTWVudURlc2Ny
aXB0aW9uIHBsYXRmb3JtTWVudURlc2NyaXB0aW9uKFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+Jik7
CisjZW5kaWYKIAogfQogCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51SXRlbS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudUl0ZW0uY3BwCShy
ZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudUl0ZW0uY3BwCShyZXZp
c2lvbiAwKQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycn
CisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwor
ICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICog
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkNvbnRleHRNZW51SXRlbS5oIgorCisjaW5jbHVkZSAiQ29udGV4dE1lbnUu
aCIKKworI2lmIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK0NvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51
SXRlbVR5cGUgdHlwZSwgQ29udGV4dE1lbnVBY3Rpb24gYWN0aW9uLCBjb25zdCBTdHJpbmcmIHRp
dGxlLCBDb250ZXh0TWVudSogc3ViTWVudSkKKyAgICA6IG1fdHlwZSh0eXBlKQorICAgICwgbV9h
Y3Rpb24oYWN0aW9uKQorICAgICwgbV90aXRsZSh0aXRsZSkKKyAgICAsIG1fZW5hYmxlZCh0cnVl
KQorICAgICwgbV9jaGVja2VkKGZhbHNlKQoreworICAgIHNldFN1Yk1lbnUoc3ViTWVudSk7Cit9
CisKK0NvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51SXRlbVR5cGUg
dHlwZSwgQ29udGV4dE1lbnVBY3Rpb24gYWN0aW9uLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBib29s
IGVuYWJsZWQsIGJvb2wgY2hlY2tlZCkKKyAgICA6IG1fdHlwZSh0eXBlKQorICAgICwgbV9hY3Rp
b24oYWN0aW9uKQorICAgICwgbV90aXRsZSh0aXRsZSkKKyAgICAsIG1fZW5hYmxlZChlbmFibGVk
KQorICAgICwgbV9jaGVja2VkKGNoZWNrZWQpCit7Cit9CisgICAgICAgIAorQ29udGV4dE1lbnVJ
dGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVBY3Rpb24gYWN0aW9uLCBjb25zdCBTdHJp
bmcmIHRpdGxlLCBib29sIGVuYWJsZWQsIGJvb2wgY2hlY2tlZCwgVmVjdG9yPENvbnRleHRNZW51
SXRlbT4gc3ViTWVudUl0ZW1zKQorICAgIDogbV90eXBlKFN1Ym1lbnVUeXBlKQorICAgICwgbV9h
Y3Rpb24oYWN0aW9uKQorICAgICwgbV90aXRsZSh0aXRsZSkKKyAgICAsIG1fZW5hYmxlZChlbmFi
bGVkKQorICAgICwgbV9jaGVja2VkKGNoZWNrZWQpCisgICAgLCBtX3N1Yk1lbnVJdGVtcyhzdWJN
ZW51SXRlbXMpCit7Cit9CisKK0NvbnRleHRNZW51SXRlbTo6fkNvbnRleHRNZW51SXRlbSgpCit7
Cit9CisKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRTdWJNZW51KENvbnRleHRNZW51KiBzdWJN
ZW51KQoreworICAgIGlmIChzdWJNZW51KSB7CisgICAgICAgIG1fdHlwZSA9IFN1Ym1lbnVUeXBl
OworICAgICAgICBtX3N1Yk1lbnVJdGVtcyA9IHN1Yk1lbnUtPml0ZW1zKCk7CisgICAgfSBlbHNl
IHsKKyAgICAgICAgbV90eXBlID0gQWN0aW9uVHlwZTsKKyAgICAgICAgbV9zdWJNZW51SXRlbXMu
Y2xlYXIoKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8v
IFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9Db250ZXh0TWVudUl0ZW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL0NvbnRl
eHRNZW51SXRlbS5oCShyZXZpc2lvbiA3MzUzNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4
dE1lbnVJdGVtLmgJKHdvcmtpbmcgY29weSkKQEAgLTQwLDcgKzQwLDcgQEAKIGNsYXNzIE5TTWVu
dUl0ZW07CiAjZW5kaWYKICNlbGlmIFBMQVRGT1JNKFdJTikKLXR5cGVkZWYgc3RydWN0IHRhZ01F
TlVJVEVNSU5GT1cqIExQTUVOVUlURU1JTkZPOwordHlwZWRlZiBzdHJ1Y3QgdGFnTUVOVUlURU1J
TkZPVyBNRU5VSVRFTUlORk87CiAjZWxpZiBQTEFURk9STShHVEspCiB0eXBlZGVmIHN0cnVjdCBf
R3RrTWVudUl0ZW0gR3RrTWVudUl0ZW07CiAjZWxpZiBQTEFURk9STShRVCkKQEAgLTE2NCwxMCAr
MTY0LDkgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBTdWJtZW51VHlwZQogICAgIH07
CiAKKwogI2lmIFBMQVRGT1JNKE1BQykKICAgICB0eXBlZGVmIE5TTWVudUl0ZW0qIFBsYXRmb3Jt
TWVudUl0ZW1EZXNjcmlwdGlvbjsKLSNlbGlmIFBMQVRGT1JNKFdJTikKLSAgICB0eXBlZGVmIExQ
TUVOVUlURU1JTkZPIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbjsKICNlbGlmIFBMQVRGT1JN
KFFUKQogICAgIHN0cnVjdCBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24gewogICAgICAgICBQ
bGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24oKQpAQCAtMjUzLDYgKzI1Miw0NSBAQCBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAjZW5kaWYKIAogICAgIGNsYXNzIENvbnRleHRNZW51SXRlbSA6IHB1Ymxp
YyBGYXN0QWxsb2NCYXNlIHsKKyNpZiBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykK
KyAgICBwdWJsaWM6CisjaWYgUExBVEZPUk0oV0lOKQorICAgICAgICB0eXBlZGVmIE1FTlVJVEVN
SU5GTyBOYXRpdmVJdGVtVHlwZTsKKyNlbmRpZgorICAgICAgICBDb250ZXh0TWVudUl0ZW0oQ29u
dGV4dE1lbnVJdGVtVHlwZSwgQ29udGV4dE1lbnVBY3Rpb24sIGNvbnN0IFN0cmluZyYsIENvbnRl
eHRNZW51KiBzdWJNZW51ID0gMCk7CisgICAgICAgIENvbnRleHRNZW51SXRlbShDb250ZXh0TWVu
dUl0ZW1UeXBlLCBDb250ZXh0TWVudUFjdGlvbiwgY29uc3QgU3RyaW5nJiwgYm9vbCBlbmFibGVk
LCBib29sIGNoZWNrZWQpOworICAgICAgICBDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVBY3Rp
b24sIGNvbnN0IFN0cmluZyYsIGJvb2wgZW5hYmxlZCwgYm9vbCBjaGVja2VkLCBWZWN0b3I8Q29u
dGV4dE1lbnVJdGVtPiBzdWJNZW51SXRlbXMpOworICAgICAgICBDb250ZXh0TWVudUl0ZW0oTmF0
aXZlSXRlbVR5cGUpOworCisgICAgICAgIE5hdGl2ZUl0ZW1UeXBlIG5hdGl2ZU1lbnVJdGVtKCk7
CisKKyAgICAgICAgQ29udGV4dE1lbnVJdGVtVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gbV90
eXBlOyB9CisgICAgICAgIHZvaWQgc2V0VHlwZShDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUpIHsg
bV90eXBlID0gdHlwZTsgfQorCisgICAgICAgIENvbnRleHRNZW51QWN0aW9uIGFjdGlvbigpIGNv
bnN0IHsgcmV0dXJuIG1fYWN0aW9uOyB9CisgICAgICAgIHZvaWQgc2V0QWN0aW9uKENvbnRleHRN
ZW51QWN0aW9uIGFjdGlvbikgeyBtX2FjdGlvbiA9IGFjdGlvbjsgfQorCisgICAgICAgIFN0cmlu
ZyB0aXRsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGl0bGU7IH0KKyAgICAgICAgdm9pZCBzZXRUaXRs
ZShjb25zdCBTdHJpbmcmIHRpdGxlKSB7IG1fdGl0bGUgPSB0aXRsZTsgfQorCisgICAgICAgIGJv
b2wgY2hlY2tlZCgpIGNvbnN0IHsgcmV0dXJuIG1fY2hlY2tlZDsgfQorICAgICAgICB2b2lkIHNl
dENoZWNrZWQoYm9vbCBjaGVja2VkID0gdHJ1ZSkgeyBtX2NoZWNrZWQgPSBjaGVja2VkOyB9CisK
KyAgICAgICAgYm9vbCBlbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbV9lbmFibGVkOyB9CisgICAg
ICAgIHZvaWQgc2V0RW5hYmxlZChib29sIGVuYWJsZWQgPSB0cnVlKSB7IG1fZW5hYmxlZCA9IGVu
YWJsZWQ7IH0KKworICAgICAgICB2b2lkIHNldFN1Yk1lbnUoQ29udGV4dE1lbnUqKTsKKyAgICAg
ICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4mIHN1Ym1lbnUoKSB7IHJldHVybiBtX3N1Yk1lbnVJ
dGVtczsgfQorCisgICAgICAgIH5Db250ZXh0TWVudUl0ZW0oKTsKKyAgICBwcml2YXRlOgorICAg
ICAgICBTdHJpbmcgbV90aXRsZTsKKyAgICAgICAgYm9vbCBtX2VuYWJsZWQ7CisgICAgICAgIGJv
b2wgbV9jaGVja2VkOworICAgICAgICBDb250ZXh0TWVudUFjdGlvbiBtX2FjdGlvbjsKKyAgICAg
ICAgQ29udGV4dE1lbnVJdGVtVHlwZSBtX3R5cGU7CisgICAgICAgIFZlY3RvcjxDb250ZXh0TWVu
dUl0ZW0+IG1fc3ViTWVudUl0ZW1zOworI2Vsc2UKICAgICBwdWJsaWM6CiAgICAgICAgIENvbnRl
eHRNZW51SXRlbShQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24pOwogICAgICAgICBDb250ZXh0
TWVudUl0ZW0oQ29udGV4dE1lbnUqIHN1Yk1lbnUgPSAwKTsKQEAgLTI5Nyw2ICszMzUsNyBAQCBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAjZWxzZQogICAgICAgICBQbGF0Zm9ybU1lbnVJdGVtRGVzY3Jp
cHRpb24gbV9wbGF0Zm9ybURlc2NyaXB0aW9uOwogI2VuZGlmCisjZW5kaWYgLy8gVVNFKENST1NT
X1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCiAgICAgfTsKIAogfQpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxh
dGZvcm0vUGxhdGZvcm1NZW51RGVzY3JpcHRpb24uaAkocmV2aXNpb24gNzM1MzYpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL1BsYXRmb3JtTWVudURlc2NyaXB0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAg
LTMyLDggKzMyLDYgQEAKICNlbHNlCiBjbGFzcyBOU011dGFibGVBcnJheTsKICNlbmRpZgotI2Vs
aWYgUExBVEZPUk0oV0lOKQotdHlwZWRlZiBzdHJ1Y3QgSE1FTlVfXyogSE1FTlU7CiAjZWxpZiBQ
TEFURk9STShRVCkKICNpbmNsdWRlIDxxbGlzdC5oPgogI2VsaWYgUExBVEZPUk0oR1RLKQpAQCAt
NDYsMTAgKzQ0LDkgQEAgY2xhc3MgQk1lbnU7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorI2lm
ICFVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKICNpZiBQTEFURk9STShNQUMpCiAg
ICAgdHlwZWRlZiBOU011dGFibGVBcnJheSogUGxhdGZvcm1NZW51RGVzY3JpcHRpb247Ci0jZWxp
ZiBQTEFURk9STShXSU4pCi0gICAgdHlwZWRlZiBITUVOVSBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlv
bjsKICNlbGlmIFBMQVRGT1JNKFFUKQogICAgIGNsYXNzIENvbnRleHRNZW51SXRlbTsKICAgICB0
eXBlZGVmIGNvbnN0IFFMaXN0PENvbnRleHRNZW51SXRlbT4qIFBsYXRmb3JtTWVudURlc2NyaXB0
aW9uOwpAQCAtNjIsNiArNTksNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAjZWxzZQogICAgIHR5
cGVkZWYgdm9pZCogUGxhdGZvcm1NZW51RGVzY3JpcHRpb247CiAjZW5kaWYKKyNlbmRpZiAvLyAh
VVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCiAKIH0gLy8gbmFtZXNwYWNlCiAKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL0NvbnRleHRNZW51SXRlbVdpbi5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ29udGV4dE1lbnVJdGVtV2luLmNwcAkocmV2aXNp
b24gNzM1MzYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9Db250ZXh0TWVudUl0ZW1XaW4uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAiQ29udGV4dE1lbnVJ
dGVtLmgiCiAKICNpbmNsdWRlICJDb250ZXh0TWVudS5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXN1
bHQuaCIKIAogI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KICNpbmNsdWRlIDx3aW5kb3dz
Lmg+CkBAIC00NSwxODEgKzQ2LDQ2IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotQ29udGV4
dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oTFBNRU5VSVRFTUlORk8gaXRlbSkKLSAgICA6IG1f
cGxhdGZvcm1EZXNjcmlwdGlvbihpdGVtKQotewotfQotCi1Db250ZXh0TWVudUl0ZW06OkNvbnRl
eHRNZW51SXRlbShDb250ZXh0TWVudSogc3ViTWVudSkKLXsKLSAgICBtX3BsYXRmb3JtRGVzY3Jp
cHRpb24gPSAoTFBNRU5VSVRFTUlORk8pbWFsbG9jKHNpemVvZihNRU5VSVRFTUlORk8pKTsKLSAg
ICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbWVt
c2V0KG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgMCwgc2l6ZW9mKE1FTlVJVEVNSU5GTykpOwotICAg
IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Y2JTaXplID0gc2l6ZW9mKE1FTlVJVEVNSU5GTyk7Ci0K
LSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPndJRCA9IENvbnRleHRNZW51SXRlbVRhZ05vQWN0
aW9uOwotICAgIGlmIChzdWJNZW51KSB7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+
Zk1hc2sgfD0gTUlJTV9TVUJNRU5VOwotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhT
dWJNZW51ID0gc3ViTWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpOwotICAgIH0KLX0KLQotQ29u
dGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVJdGVtVHlwZSB0eXBlLCBD
b250ZXh0TWVudUFjdGlvbiBhY3Rpb24sIGNvbnN0IFN0cmluZyYgdGl0bGUsIENvbnRleHRNZW51
KiBzdWJNZW51KQotewotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IChMUE1FTlVJVEVNSU5G
TyltYWxsb2Moc2l6ZW9mKE1FTlVJVEVNSU5GTykpOwotICAgIGlmICghbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtZW1zZXQobV9wbGF0Zm9ybURlc2NyaXB0
aW9uLCAwLCBzaXplb2YoTUVOVUlURU1JTkZPKSk7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9u
LT5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPKTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRp
b24tPmZNYXNrID0gTUlJTV9GVFlQRTsKLQotICAgIGlmICh0eXBlID09IFNlcGFyYXRvclR5cGUp
IHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSA9IE1GVF9TRVBBUkFUT1I7
Ci0gICAgICAgIHJldHVybjsKK0NvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKE1FTlVJ
VEVNSU5GTyBpbmZvKQoreyAgIAorICAgIG1fdHlwZSA9IGluZm8uZlR5cGUgJiBNRlRfU0VQQVJB
VE9SID8gU2VwYXJhdG9yVHlwZSA6IEFjdGlvblR5cGU7CisgICAgbV9hY3Rpb24gPSBzdGF0aWNf
Y2FzdDxDb250ZXh0TWVudUFjdGlvbj4oaW5mby53SUQpOworICAgIG1fdGl0bGUgPSBTdHJpbmco
aW5mby5kd1R5cGVEYXRhLCB3Y3NsZW4oaW5mby5kd1R5cGVEYXRhKSk7CisKKyAgICBpZiAoaW5m
by5oU3ViTWVudSkgeworICAgICAgICBtX3R5cGUgPSBTdWJtZW51VHlwZTsKKyAgICAgICAgQ29u
dGV4dE1lbnUgc3ViTWVudShpbmZvLmhTdWJNZW51KTsKKyAgICAgICAgbV9zdWJNZW51SXRlbXMg
PSBzdWJNZW51Lml0ZW1zKCk7CiAgICAgfQotICAgIAotICAgIGlmIChzdWJNZW51KSB7Ci0gICAg
ICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sgfD0gTUlJTV9TVFJJTkcgfCBNSUlNX1NV
Qk1FTlU7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUgPSBzdWJNZW51
LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbi0+Zk1hc2sgfD0gTUlJTV9TVFJJTkcgfCBNSUlNX0lEOwotCi0gICAgbV9wbGF0
Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSA9IE1GVF9TVFJJTkc7Ci0gICAgbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uLT53SUQgPSBhY3Rpb247Ci0gICAgCi0gICAgU3RyaW5nIHQgPSB0aXRsZTsKLSAgICBt
X3BsYXRmb3JtRGVzY3JpcHRpb24tPmNjaCA9IHQubGVuZ3RoKCk7Ci0gICAgbV9wbGF0Zm9ybURl
c2NyaXB0aW9uLT5kd1R5cGVEYXRhID0gd2NzZHVwKHQuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWlu
YXRpb24oKSk7Ci19CiAKLUNvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKENvbnRleHRN
ZW51SXRlbVR5cGUsIENvbnRleHRNZW51QWN0aW9uLCBjb25zdCBTdHJpbmcmLCBib29sLCBib29s
KQotewotICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQKLX0KLQotQ29udGV4dE1lbnVJdGVtOjpDb250
ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVBY3Rpb24sIGNvbnN0IFN0cmluZyYsIGJvb2wsIGJvb2ws
IFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JikKLXsKLSAgICAvLyBGSVhNRTogSW1wbGVtZW50Cisg
ICAgbV9jaGVja2VkID0gaW5mby5mU3RhdGUgJiBNRlNfQ0hFQ0tFRDsKKyAgICBtX2VuYWJsZWQg
PSAhKGluZm8uZlN0YXRlICYgTUZTX0RJU0FCTEVEKTsKIH0KIAotQ29udGV4dE1lbnVJdGVtOjp+
Q29udGV4dE1lbnVJdGVtKCkKK01FTlVJVEVNSU5GTyBDb250ZXh0TWVudUl0ZW06Om5hdGl2ZU1l
bnVJdGVtKCkKIHsKLSAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKSB7Ci0gICAgICAgIGlm
IChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZUeXBlID09IE1GVF9TVFJJTkcpCi0gICAgICAgICAg
ICBmcmVlKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZHdUeXBlRGF0YSk7Ci0gICAgICAgIGZyZWUo
bV9wbGF0Zm9ybURlc2NyaXB0aW9uKTsKLSAgICB9Ci19Ci0KLUxQTUVOVUlURU1JTkZPIENvbnRl
eHRNZW51SXRlbTo6cmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKQotewotICAgIExQTUVOVUlU
RU1JTkZPIGluZm8gPSBtX3BsYXRmb3JtRGVzY3JpcHRpb247Ci0gICAgbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uID0gMDsKLSAgICByZXR1cm4gaW5mbzsKLX0KLQotQ29udGV4dE1lbnVJdGVtVHlwZSBD
b250ZXh0TWVudUl0ZW06OnR5cGUoKSBjb25zdAotewotICAgIENvbnRleHRNZW51SXRlbVR5cGUg
dHlwZSA9IEFjdGlvblR5cGU7Ci0gICAgaWYgKCgobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlw
ZSAmIH5NRlRfT1dORVJEUkFXKSA9PSBNRlRfU1RSSU5HKSAmJiBtX3BsYXRmb3JtRGVzY3JpcHRp
b24tPmhTdWJNZW51KQotICAgICAgICB0eXBlID0gU3VibWVudVR5cGU7Ci0gICAgZWxzZSBpZiAo
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSAmIE1GVF9TRVBBUkFUT1IpCi0gICAgICAgIHR5
cGUgPSBTZXBhcmF0b3JUeXBlOwotCi0gICAgcmV0dXJuIHR5cGU7Ci19Ci0KLUNvbnRleHRNZW51
QWN0aW9uIENvbnRleHRNZW51SXRlbTo6YWN0aW9uKCkgY29uc3QKLXsgCi0gICAgcmV0dXJuIHN0
YXRpY19jYXN0PENvbnRleHRNZW51QWN0aW9uPihtX3BsYXRmb3JtRGVzY3JpcHRpb24tPndJRCk7
Ci19Ci0KLVN0cmluZyBDb250ZXh0TWVudUl0ZW06OnRpdGxlKCkgY29uc3QgCi17Ci0gICAgcmV0
dXJuIFN0cmluZyhtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEsIHdjc2xlbihtX3Bs
YXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEpKTsKLX0KLQotUGxhdGZvcm1NZW51RGVzY3Jp
cHRpb24gQ29udGV4dE1lbnVJdGVtOjpwbGF0Zm9ybVN1Yk1lbnUoKSBjb25zdAotewotICAgIHJl
dHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51OwotfQotCi12b2lkIENvbnRleHRN
ZW51SXRlbTo6c2V0VHlwZShDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUpCi17Ci0gICAgaWYgKHR5
cGUgPT0gU2VwYXJhdG9yVHlwZSkKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlw
ZSA9IE1GVF9TRVBBUkFUT1I7Ci0gICAgZWxzZQotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRp
b24tPmZUeXBlID0gTUZUX1NUUklORzsKLX0KLQotdm9pZCBDb250ZXh0TWVudUl0ZW06OnNldEFj
dGlvbihDb250ZXh0TWVudUFjdGlvbiBhY3Rpb24pCi17Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT53SUQgPSBhY3Rpb247IAotfQotCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VGl0bGUo
Y29uc3QgU3RyaW5nJiB0aXRsZSkKLXsKLSAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5k
d1R5cGVEYXRhKQotICAgICAgICBmcmVlKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZHdUeXBlRGF0
YSk7CisgICAgTUVOVUlURU1JTkZPIGluZm8gPSB7MH07CisgICAgaW5mby5jYlNpemUgPSBzaXpl
b2YoTUVOVUlURU1JTkZPKTsKICAgICAKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmNjaCA9
IHRpdGxlLmxlbmd0aCgpOwotICAgIFN0cmluZyB0aXRsZUNvcHkgPSB0aXRsZTsKLSAgICBtX3Bs
YXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEgPSB3Y3NkdXAodGl0bGVDb3B5LmNoYXJhY3Rl
cnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOwotfQotCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0
U3ViTWVudShDb250ZXh0TWVudSogc3ViTWVudSkKLXsKLSAgICBpZiAoc3ViTWVudS0+cGxhdGZv
cm1EZXNjcmlwdGlvbigpID09IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUpCi0gICAg
ICAgIHJldHVybjsKKyAgICBpbmZvLmZNYXNrID0gTUlJTV9GVFlQRSB8IE1JSU1fSUQgfCBNSUlN
X1NUUklORyB8IE1JSU1fU1RBVEUgfCBNSUlNX1NVQk1FTlU7CiAKLSAgICBpZiAobV9wbGF0Zm9y
bURlc2NyaXB0aW9uLT5oU3ViTWVudSkKLSAgICAgICAgOjpEZXN0cm95TWVudShtX3BsYXRmb3Jt
RGVzY3JpcHRpb24tPmhTdWJNZW51KTsKKyAgICBpZiAobV90eXBlID09IFN1Ym1lbnVUeXBlKQor
ICAgICAgICBpbmZvLmhTdWJNZW51ID0gQ29udGV4dE1lbnUobV9zdWJNZW51SXRlbXMpLm5hdGl2
ZU1lbnUoKTsKIAotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sgfD0gTUlJTV9TVUJN
RU5VOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUgPSBzdWJNZW51LT5yZWxl
YXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOwotfQorICAgIGlmIChtX3R5cGUgPT0gU2VwYXJhdG9y
VHlwZSkKKyAgICAgICAgaW5mby5mVHlwZSA9IE1GVF9TRVBBUkFUT1I7CisgICAgZWxzZQorICAg
ICAgICBpbmZvLmZUeXBlID0gTUZUX1NUUklORzsKIAotdm9pZCBDb250ZXh0TWVudUl0ZW06OnNl
dFN1Yk1lbnUoVmVjdG9yPENvbnRleHRNZW51SXRlbT4mKQotewotICAgIC8vIEZJWE1FOiBJbXBs
ZW1lbnQKLX0KKyAgICBpbmZvLmNjaCA9IG1fdGl0bGUubGVuZ3RoKCk7CisgICAgaW5mby5kd1R5
cGVEYXRhID0gKExQV1NUUikgbV90aXRsZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigp
OwogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0Q2hlY2tlZChib29sIGNoZWNrZWQpCi17Ci0g
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFzayB8PSBNSUlNX1NUQVRFOwotICAgIGlmIChj
aGVja2VkKSB7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlN0YXRlICY9IH5NRlNf
VU5DSEVDS0VEOwotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNf
Q0hFQ0tFRDsKLSAgICB9IGVsc2UgewotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZT
dGF0ZSAmPSB+TUZTX0NIRUNLRUQ7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlN0
YXRlIHw9IE1GU19VTkNIRUNLRUQ7Ci0gICAgfQotfQorICAgIGluZm8ud0lEID0gbV9hY3Rpb247
CiAKLWJvb2wgQ29udGV4dE1lbnVJdGVtOjpjaGVja2VkKCkgY29uc3QKLXsKLSAgICAvLyBGSVhN
RSAtIEltcGxlbWVudAotICAgIHJldHVybiBmYWxzZTsKLX0KKyAgICBpbmZvLmZTdGF0ZSB8PSBt
X2VuYWJsZWQgPyBNRlNfRU5BQkxFRCA6IE1GU19ESVNBQkxFRDsKKyAgICBpbmZvLmZTdGF0ZSB8
PSBtX2NoZWNrZWQgPyBNRlNfQ0hFQ0tFRCA6IE1GU19VTkNIRUNLRUQ7CiAKLXZvaWQgQ29udGV4
dE1lbnVJdGVtOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKLXsKLSAgICBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPmZNYXNrIHw9IE1JSU1fU1RBVEU7Ci0gICAgaWYgKGVuYWJsZWQpIHsKLSAgICAg
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1GU19ESVNBQkxFRDsKLSAgICAg
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgfD0gTUZTX0VOQUJMRUQ7Ci0gICAgfSBl
bHNlIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1GU19FTkFC
TEVEOwotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNfRElTQUJM
RUQ7Ci0gICAgfQotfQotCi1ib29sIENvbnRleHRNZW51SXRlbTo6ZW5hYmxlZCgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuICEobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJiBNRlNfRElTQUJM
RUQpOworICAgIHJldHVybiBpbmZvOwogfQogCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dp
bi9Db250ZXh0TWVudVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4v
Q29udGV4dE1lbnVXaW4uY3BwCShyZXZpc2lvbiA3MzUzNikKKysrIFdlYkNvcmUvcGxhdGZvcm0v
d2luL0NvbnRleHRNZW51V2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzIsNiArMzIsNyBAQAog
I2luY2x1ZGUgIk5vZGUuaCIKICNpbmNsdWRlIDx0Y2hhci5oPgogI2luY2x1ZGUgPHdpbmRvd3Mu
aD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5o
PgogCiAjaWZuZGVmIE1JSU1fRlRZUEUKQEAgLTQzLDE4MCArNDQsNDggQEAKIAogbmFtZXNwYWNl
IFdlYkNvcmUgewogCi1Db250ZXh0TWVudTo6Q29udGV4dE1lbnUoKQotICAgIDogbV9wbGF0Zm9y
bURlc2NyaXB0aW9uKDApCi0jaWYgT1MoV0lOQ0UpCi0gICAgLCBtX2l0ZW1Db3VudCgwKQotI2Vu
ZGlmCi17Ci0gICAgc2V0UGxhdGZvcm1EZXNjcmlwdGlvbig6OkNyZWF0ZVBvcHVwTWVudSgpKTsK
LX0KLQotQ29udGV4dE1lbnU6OkNvbnRleHRNZW51KGNvbnN0IFBsYXRmb3JtTWVudURlc2NyaXB0
aW9uIG1lbnUpCi0gICAgOiBtX3BsYXRmb3JtRGVzY3JpcHRpb24oMCkKLSNpZiBPUyhXSU5DRSkK
LSAgICAsIG1faXRlbUNvdW50KDApCi0jZW5kaWYKLXsKLSAgICBzZXRQbGF0Zm9ybURlc2NyaXB0
aW9uKG1lbnUpOwotfQotCi1Db250ZXh0TWVudTo6fkNvbnRleHRNZW51KCkKLXsKLSAgICBpZiAo
bV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICA6OkRlc3Ryb3lNZW51KG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbik7Ci19Ci0KLXVuc2lnbmVkIENvbnRleHRNZW51OjppdGVtQ291bnQoKSBjb25z
dAotewotI2lmIE9TKFdJTkNFKQotICAgIHJldHVybiBtX2l0ZW1Db3VudDsKLSNlbHNlCi0gICAg
aWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0
dXJuIDo6R2V0TWVudUl0ZW1Db3VudChtX3BsYXRmb3JtRGVzY3JpcHRpb24pOwotI2VuZGlmCi19
Ci0KLSNpZiBPUyhXSU5DRSkKLXN0YXRpYyBib29sIGluc2VydE1lbnVJdGVtKFBsYXRmb3JtTWVu
dURlc2NyaXB0aW9uIG1lbnUsIHVuc2lnbmVkIGludCBwb3NpdGlvbiwgQ29udGV4dE1lbnVJdGVt
JiBpdGVtKQotewotICAgIFVJTlQgZmxhZ3MgPSBNRl9CWVBPU0lUSU9OOwotICAgIFVJTlQgbmV3
SXRlbSA9IDA7Ci0gICAgTFBDV1NUUiB0aXRsZSA9IDA7Ci0KLSAgICBpZiAoaXRlbS50eXBlKCkg
PT0gU2VwYXJhdG9yVHlwZSkKLSAgICAgICAgZmxhZ3MgfD0gTUZfU0VQQVJBVE9SOwotICAgIGVs
c2UgewotICAgICAgICBmbGFncyB8PSBNRl9TVFJJTkc7Ci0gICAgICAgIGZsYWdzIHw9IGl0ZW0u
Y2hlY2tlZCgpID8gTUZfQ0hFQ0tFRCA6IE1GX1VOQ0hFQ0tFRDsKLSAgICAgICAgZmxhZ3MgfD0g
aXRlbS5lbmFibGVkKCkgPyBNRl9FTkFCTEVEIDogTUZfR1JBWUVEOwotCi0gICAgICAgIFBsYXRm
b3JtTWVudUl0ZW1EZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGl0ZW0ucmVsZWFzZVBsYXRmb3Jt
RGVzY3JpcHRpb24oKTsKLSAgICAgICAgdGl0bGUgPSBkZXNjcmlwdGlvbi0+ZHdUeXBlRGF0YTsK
LSAgICAgICAgZGVzY3JpcHRpb24tPmR3VHlwZURhdGEgPSAwOwotCi0gICAgICAgIGlmIChkZXNj
cmlwdGlvbi0+aFN1Yk1lbnUpIHsKLSAgICAgICAgICAgIGZsYWdzIHw9IE1GX1BPUFVQOwotICAg
ICAgICAgICAgbmV3SXRlbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VUlOVD4oZGVzY3JpcHRpb24tPmhT
dWJNZW51KTsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uLT5oU3ViTWVudSA9IDA7Ci0gICAgICAg
IH0gZWxzZQotICAgICAgICAgICAgbmV3SXRlbSA9IGRlc2NyaXB0aW9uLT53SUQ7Ci0KLSAgICAg
ICAgZnJlZShkZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIDo6SW5zZXJ0TWVudVco
bWVudSwgcG9zaXRpb24sIGZsYWdzLCBuZXdJdGVtLCB0aXRsZSk7Ci19Ci0jZW5kaWYKLQotdm9p
ZCBDb250ZXh0TWVudTo6aW5zZXJ0SXRlbSh1bnNpZ25lZCBpbnQgcG9zaXRpb24sIENvbnRleHRN
ZW51SXRlbSYgaXRlbSkKK0NvbnRleHRNZW51OjpDb250ZXh0TWVudShITUVOVSBtZW51KQogewot
ICAgIGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQorICAgIGludCBjb3VudCA9IDo6R2V0TWVu
dUl0ZW1Db3VudChtZW51KTsKKyAgICBpZiAoY291bnQgPD0gMCkKICAgICAgICAgcmV0dXJuOwog
Ci0jaWYgT1MoV0lOQ0UpCi0gICAgaWYgKGluc2VydE1lbnVJdGVtKG1fcGxhdGZvcm1EZXNjcmlw
dGlvbiwgcG9zaXRpb24sIGl0ZW0pKQotICAgICAgICArK21faXRlbUNvdW50OwotI2Vsc2UKLSAg
ICA6Okluc2VydE1lbnVJdGVtKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgcG9zaXRpb24sIFRSVUUs
IGl0ZW0ucmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKSk7Ci0jZW5kaWYKLX0KLQotdm9pZCBD
b250ZXh0TWVudTo6YXBwZW5kSXRlbShDb250ZXh0TWVudUl0ZW0mIGl0ZW0pCi17Ci0gICAgaW5z
ZXJ0SXRlbShpdGVtQ291bnQoKSwgaXRlbSk7Ci19Ci0KLXN0YXRpYyBDb250ZXh0TWVudUl0ZW0q
IGNvbnRleHRNZW51SXRlbUJ5SWRPclBvc2l0aW9uKEhNRU5VIG1lbnUsIHVuc2lnbmVkIGlkLCBC
T09MIGJ5UG9zaXRpb24pCi17Ci0gICAgaWYgKCFtZW51KQotICAgICAgICByZXR1cm4gMDsKLSAg
ICBMUE1FTlVJVEVNSU5GTyBpbmZvID0gc3RhdGljX2Nhc3Q8TFBNRU5VSVRFTUlORk8+KG1hbGxv
YyhzaXplb2YoTUVOVUlURU1JTkZPKSkpOwotICAgIGlmICghaW5mbykKLSAgICAgICAgcmV0dXJu
IDA7Ci0KLSAgICBtZW1zZXQoaW5mbywgMCwgc2l6ZW9mKE1FTlVJVEVNSU5GTykpOwotCi0gICAg
aW5mby0+Y2JTaXplID0gc2l6ZW9mKE1FTlVJVEVNSU5GTyk7Ci0KLSAgICAvLyBTZXR0aW5nIE1J
SU1fREFUQSB3aGljaCBpcyB1c2VmdWwgZm9yIFdlYktpdCBjbGllbnRzIHdobyBzdG9yZSBkYXRh
IGluIHRoaXMgbWVtYmVyIGZvciB0aGVpciBjdXN0b20gbWVudSBpdGVtcy4KLSAgICBpbmZvLT5m
TWFzayA9IE1JSU1fRlRZUEUgfCBNSUlNX0lEIHwgTUlJTV9TVFJJTkcgfCBNSUlNX0RBVEE7Ci0K
LSAgICBpZiAoITo6R2V0TWVudUl0ZW1JbmZvKG1lbnUsIGlkLCBieVBvc2l0aW9uLCBpbmZvKSkg
ewotICAgICAgICBmcmVlKGluZm8pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBp
ZiAoaW5mby0+ZlR5cGUgJiBNRlRfU1RSSU5HKSB7Ci0gICAgICAgIExQVFNUUiBidWZmZXIgPSBz
dGF0aWNfY2FzdDxMUFRTVFI+KG1hbGxvYygrK2luZm8tPmNjaCAqIHNpemVvZihUQ0hBUikpKTsK
LSAgICAgICAgaWYgKCFidWZmZXIpIHsKLSAgICAgICAgICAgIGZyZWUoaW5mbyk7Ci0gICAgICAg
ICAgICByZXR1cm4gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY291bnQ7ICsraSkg
eworICAgICAgICBVSU5UIGluZm9NYXNrID0gTUlJTV9GVFlQRSB8IE1JSU1fSUQgfCBNSUlNX1NU
UklORyB8IE1JSU1fU1RBVEUgfCBNSUlNX1NVQk1FTlU7IAorICAgICAgICBNRU5VSVRFTUlORk8g
aW5mbyA9IHswfTsKKyAgICAgICAgaW5mby5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPKTsK
KyAgICAgICAgaW5mby5mTWFzayA9IGluZm9NYXNrOworICAgICAgICBpbmZvLmR3VHlwZURhdGEg
PSAwOworCisgICAgICAgIGlmICghOjpHZXRNZW51SXRlbUluZm8obWVudSwgaSwgVFJVRSwgJmlu
Zm8pKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGluZm8uZlR5cGUgPT0g
TUZUX1NFUEFSQVRPUikgeworICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHN0cmlu
ZywgdGhlbiB3ZSBtdXN0IGJlIGluIGEgc2VwYXJhdG9yLgorICAgICAgICAgICAgbV9pdGVtcy5h
cHBlbmQoQ29udGV4dE1lbnVJdGVtKFNlcGFyYXRvclR5cGUsIENvbnRleHRNZW51SXRlbVRhZ05v
QWN0aW9uLCBTdHJpbmcoKSkpOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAg
ICAgICAgaW5mby0+ZHdUeXBlRGF0YSA9IGJ1ZmZlcjsKLSAgICAgICAgOjpHZXRNZW51SXRlbUlu
Zm8obWVudSwgaWQsIGJ5UG9zaXRpb24sIGluZm8pOwotICAgIH0KLQotICAgIHJldHVybiBuZXcg
Q29udGV4dE1lbnVJdGVtKGluZm8pOwotfQogCi1Db250ZXh0TWVudUl0ZW0qIENvbnRleHRNZW51
OjppdGVtV2l0aEFjdGlvbih1bnNpZ25lZCBhY3Rpb24pCi17Ci0gICAgcmV0dXJuIGNvbnRleHRN
ZW51SXRlbUJ5SWRPclBvc2l0aW9uKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgYWN0aW9uLCBGQUxT
RSk7Ci19CisgICAgICAgIGludCBtZW51U3RyaW5nTGVuZ3RoID0gaW5mby5jY2ggKyAxOworICAg
ICAgICBPd25BcnJheVB0cjxXQ0hBUj4gbWVudVN0cmluZyhuZXcgV0NIQVJbbWVudVN0cmluZ0xl
bmd0aF0pOworICAgICAgICBpbmZvLmR3VHlwZURhdGEgPSBtZW51U3RyaW5nLmdldCgpOworICAg
ICAgICBpbmZvLmNjaCA9IG1lbnVTdHJpbmdMZW5ndGg7CiAKLUNvbnRleHRNZW51SXRlbSogQ29u
dGV4dE1lbnU6Oml0ZW1BdEluZGV4KHVuc2lnbmVkIGluZGV4LCBjb25zdCBQbGF0Zm9ybU1lbnVE
ZXNjcmlwdGlvbiBwbGF0Zm9ybURlc2NyaXB0aW9uKQotewotICAgIHJldHVybiBjb250ZXh0TWVu
dUl0ZW1CeUlkT3JQb3NpdGlvbihwbGF0Zm9ybURlc2NyaXB0aW9uLCBpbmRleCwgVFJVRSk7Ci19
Ci0KLXZvaWQgQ29udGV4dE1lbnU6OnNldFBsYXRmb3JtRGVzY3JpcHRpb24oSE1FTlUgbWVudSkK
LXsKLSAgICBpZiAobWVudSA9PSBtX3BsYXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVy
bjsKLSAgICAKLSAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICA6OkRlc3Ry
b3lNZW51KG1fcGxhdGZvcm1EZXNjcmlwdGlvbik7Ci0KLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRp
b24gPSBtZW51OwotICAgIGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICByZXR1
cm47Ci0KLSNpZiAhT1MoV0lOQ0UpCi0gICAgTUVOVUlORk8gbWVudUluZm8gPSB7MH07Ci0gICAg
bWVudUluZm8uY2JTaXplID0gc2l6ZW9mKE1FTlVJTkZPKTsKLSAgICBtZW51SW5mby5mTWFzayA9
IE1JTV9TVFlMRTsKLSAgICA6OkdldE1lbnVJbmZvKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgJm1l
bnVJbmZvKTsKLSAgICBtZW51SW5mby5mTWFzayA9IE1JTV9TVFlMRTsKLSAgICBtZW51SW5mby5k
d1N0eWxlIHw9IE1OU19OT1RJRllCWVBPUzsKLSAgICA6OlNldE1lbnVJbmZvKG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbiwgJm1lbnVJbmZvKTsKLSNlbmRpZgotfQotCi1ITUVOVSBDb250ZXh0TWVudTo6
cGxhdGZvcm1EZXNjcmlwdGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNj
cmlwdGlvbjsKKyAgICAgICAgaWYgKDo6R2V0TWVudUl0ZW1JbmZvKG1lbnUsIGksIFRSVUUsICZp
bmZvKSkKKyAgICAgICAgICAgbV9pdGVtcy5hcHBlbmQoQ29udGV4dE1lbnVJdGVtKGluZm8pKTsK
KyAgICB9CiB9CiAKLUhNRU5VIENvbnRleHRNZW51OjpyZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlv
bigpCitITUVOVSBDb250ZXh0TWVudTo6bmF0aXZlTWVudSgpCiB7Ci0gICAgSE1FTlUgZGVzY3Jp
cHRpb24gPSBtX3BsYXRmb3JtRGVzY3JpcHRpb247Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9u
ID0gMDsKLSAgICByZXR1cm4gZGVzY3JpcHRpb247Ci19CisgICAgSE1FTlUgbWVudSA9IDo6Q3Jl
YXRlUG9wdXBNZW51KCk7CiAKLVZlY3RvcjxDb250ZXh0TWVudUl0ZW0+IGNvbnRleHRNZW51SXRl
bVZlY3RvcihQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbikKLXsKLSAgICAvLyBGSVhNRSAtIEltcGxl
bWVudAotICAgIHJldHVybiBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPigpOwotfQorICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgbV9pdGVtcy5zaXplKCk7ICsraSkgeworICAgICAgICBNRU5VSVRFTUlO
Rk8gbWVudUl0ZW0gPSBtX2l0ZW1zW2ldLm5hdGl2ZU1lbnVJdGVtKCk7CisgICAgICAgIDo6SW5z
ZXJ0TWVudUl0ZW0obWVudSwgaSwgVFJVRSwgJm1lbnVJdGVtKTsKKyAgICB9CiAKLVBsYXRmb3Jt
TWVudURlc2NyaXB0aW9uIHBsYXRmb3JtTWVudURlc2NyaXB0aW9uKFZlY3RvcjxDb250ZXh0TWVu
dUl0ZW0+JiBtZW51SXRlbVZlY3RvcikKLXsKLSAgICAvLyBGSVhNRSAtIEltcGxlbWVudAotICAg
IHJldHVybiAwOworICAgIHJldHVybiBtZW51OwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CkluZGV4OiBXZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQyL0NoYW5nZUxv
ZwkocmV2aXNpb24gNzM2MzQpCisrKyBXZWJLaXQyL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpA
QCAtMSwzICsxLDI1IEBACisyMDEwLTEyLTA5ICBCcmlhbiBXZWluc3RlaW4gIDxid2VpbnN0ZWlu
QGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBQcmVwIGZvciBXZWJLaXQyOiBDb250ZXh0IG1lbnUgc3VwcG9ydCBvbiBXaW5kb3dzCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01MDUxNAorICAg
ICAgICAKKyAgICAgICAgVXBkYXRlIFdlYktpdDIgdG8gY2FsbCB0aGUgY29ycmVjdCBjb2RlIHdo
ZW4gQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUyBpcyBzZXQuCisKKyAgICAgICAgKiBTaGFy
ZWQvV2ViQ29udGV4dE1lbnVJdGVtRGF0YS5jcHA6CisgICAgICAgIChXZWJLaXQ6OldlYkNvbnRl
eHRNZW51SXRlbURhdGE6OldlYkNvbnRleHRNZW51SXRlbURhdGEpOiBBZGQgYSBicmFuY2ggYmFz
ZWQgb24gd2hldGhlciBvciBub3QgCisgICAgICAgICAgICBDUk9TU19QTEFURk9STV9DT05URVhU
X01FTlVTIGlzIHNldC4KKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkNv
bnRleHRNZW51Q2xpZW50LmNwcDoKKyAgICAgICAgKFdlYktpdDo6V2ViQ29udGV4dE1lbnVDbGll
bnQ6OmN1c3RvbWl6ZU1lbnUpOiBEZWZpbmUgZGlmZmVyZW50IGZ1bmN0aW9ucyBiYXNlZCBvbgor
ICAgICAgICAgICAgd2hldGhlciBvciBub3QgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUy4g
Qm90aCBvZiB0aGVzZSBhcmUgc3R1YnMsIHNvIGZ1bmN0aW9uYWxpdHkKKyAgICAgICAgICAgIGRv
ZXNuJ3QgbmVlZCB0byBiZSBzaGFyZWQuCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJDb3JlU3Vw
cG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oOiBEZWZpbmUgZGlmZmVyZW50IGZ1bmN0aW9ucyBi
YXNlZCBvbgorICAgICAgICAgICAgd2hldGhlciBvciBub3QgQ1JPU1NfUExBVEZPUk1fQ09OVEVY
VF9NRU5VUy4gCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYkNvbnRleHRNZW51LmNw
cDoKKyAgICAgICAgKFdlYktpdDo6V2ViQ29udGV4dE1lbnU6OnNob3cpOiBBZGQgYSBicmFuY2gg
YmFzZWQgb24gd2hldGhlciBvciBub3QgCisgICAgICAgICAgICBDUk9TU19QTEFURk9STV9DT05U
RVhUX01FTlVTIGlzIHNldC4KKwogMjAxMC0xMi0wOSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJz
Y2FAYXBwbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFNhbSBXZWluaWcuCkluZGV4OiBX
ZWJLaXQyL1NoYXJlZC9XZWJDb250ZXh0TWVudUl0ZW1EYXRhLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJLaXQyL1NoYXJlZC9XZWJDb250ZXh0TWVudUl0ZW1EYXRhLmNwcAkocmV2aXNpb24gNzM1MzYp
CisrKyBXZWJLaXQyL1NoYXJlZC9XZWJDb250ZXh0TWVudUl0ZW1EYXRhLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNjksNyArNjksMTEgQEAgV2ViQ29udGV4dE1lbnVJdGVtRGF0YTo6V2ViQ29udGV4
dE1lbnVJdAogICAgICwgbV90aXRsZShpdGVtLnRpdGxlKCkpCiB7CiAgICAgaWYgKG1fdHlwZSA9
PSBXZWJDb3JlOjpTdWJtZW51VHlwZSkgeworI2lmIFVTRShDUk9TU19QTEFURk9STV9DT05URVhU
X01FTlVTKQorICAgICAgICBWZWN0b3I8V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtPiBjb3JlU3Vi
bWVudSA9IGl0ZW0uc3VibWVudSgpOworI2Vsc2UKICAgICAgICAgVmVjdG9yPFdlYkNvcmU6OkNv
bnRleHRNZW51SXRlbT4gY29yZVN1Ym1lbnUgPSBXZWJDb3JlOjpjb250ZXh0TWVudUl0ZW1WZWN0
b3IoaXRlbS5wbGF0Zm9ybVN1Yk1lbnUoKSk7CisjZW5kaWYKICAgICAgICAgbV9zdWJtZW51ID0g
a2l0SXRlbXMoY29yZVN1Ym1lbnUsIG1lbnUpOwogICAgIH0KICAgICAKSW5kZXg6IFdlYktpdDIv
V2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51
Q2xpZW50LmNwcAkocmV2aXNpb24gNzM1MzYpCisrKyBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29y
ZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MSwx
MSArNDEsMTkgQEAgdm9pZCBXZWJDb250ZXh0TWVudUNsaWVudDo6Y29udGV4dE1lbnVEZQogICAg
IGRlbGV0ZSB0aGlzOwogfQogCisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMp
CitQYXNzT3duUHRyPENvbnRleHRNZW51PiBXZWJDb250ZXh0TWVudUNsaWVudDo6Y3VzdG9taXpl
TWVudShQYXNzT3duUHRyPENvbnRleHRNZW51PiBtZW51KQoreworICAgIC8vIFdlYktpdDIgaWdu
b3JlcyB0aGlzIGNsaWVudCBjYWxsYmFjayBhbmQgZG9lcyBjb250ZXh0IG1lbnUgY3VzdG9taXph
dGlvbiB3aGVuIGl0IGlzIHRvbGQgdG8gc2hvdyB0aGUgbWVudS4KKyAgICByZXR1cm4gbWVudTsK
K30KKyNlbHNlCiBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBXZWJDb250ZXh0TWVudUNsaWVudDo6
Z2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMoQ29udGV4dE1lbnUqIG1lbnUpCiB7CiAgICAg
Ly8gV2ViS2l0MiBpZ25vcmVzIHRoaXMgY2xpZW50IGNhbGxiYWNrIGFuZCBkb2VzIGNvbnRleHQg
bWVudSBjdXN0b21pemF0aW9uIHdoZW4gaXQgaXMgdG9sZCB0byBzaG93IHRoZSBtZW51LgogICAg
IHJldHVybiBtZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCk7CiB9CisjZW5kaWYKIAogdm9pZCBX
ZWJDb250ZXh0TWVudUNsaWVudDo6Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQoQ29udGV4dE1lbnVJ
dGVtKiwgY29uc3QgQ29udGV4dE1lbnUqKQogewpJbmRleDogV2ViS2l0Mi9XZWJQcm9jZXNzL1dl
YkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0
Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmgJKHJldmlz
aW9uIDczNTM2KQorKysgV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRl
eHRNZW51Q2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTQyLDcgKzQyLDExIEBAIHB1YmxpYzoK
IHByaXZhdGU6CiAgICAgdmlydHVhbCB2b2lkIGNvbnRleHRNZW51RGVzdHJveWVkKCk7CiAgICAg
CisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCisgICAgdmlydHVhbCBQYXNz
T3duUHRyPFdlYkNvcmU6OkNvbnRleHRNZW51PiBjdXN0b21pemVNZW51KFBhc3NPd25QdHI8V2Vi
Q29yZTo6Q29udGV4dE1lbnU+KTsKKyNlbHNlCiAgICAgdmlydHVhbCBXZWJDb3JlOjpQbGF0Zm9y
bU1lbnVEZXNjcmlwdGlvbiBnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcyhXZWJDb3JlOjpD
b250ZXh0TWVudSopOworI2VuZGlmCiAgICAgdmlydHVhbCB2b2lkIGNvbnRleHRNZW51SXRlbVNl
bGVjdGVkKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbSosIGNvbnN0IFdlYkNvcmU6OkNvbnRleHRN
ZW51Kik7CiAgICAgCiAgICAgdmlydHVhbCB2b2lkIGRvd25sb2FkVVJMKGNvbnN0IFdlYkNvcmU6
OktVUkwmIHVybCk7CkluZGV4OiBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJDb250ZXh0
TWVudS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViQ29u
dGV4dE1lbnUuY3BwCShyZXZpc2lvbiA3MzUzNikKKysrIFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJQ
YWdlL1dlYkNvbnRleHRNZW51LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjQsNyArNjQsMTEgQEAg
dm9pZCBXZWJDb250ZXh0TWVudTo6c2hvdygpCiAgICAgICAgIHJldHVybjsKIAogICAgIC8vIEdp
dmUgdGhlIGJ1bmRsZSBjbGllbnQgYSBjaGFuY2UgdG8gcHJvY2VzcyB0aGUgbWVudS4KKyNpZiBV
U0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKyAgICBWZWN0b3I8Q29udGV4dE1lbnVJ
dGVtPiBjb3JlSXRlbXMgPSBtZW51LT5pdGVtcygpOworI2Vsc2UKICAgICBWZWN0b3I8Q29udGV4
dE1lbnVJdGVtPiBjb3JlSXRlbXMgPSBjb250ZXh0TWVudUl0ZW1WZWN0b3IobWVudS0+cGxhdGZv
cm1EZXNjcmlwdGlvbigpKTsKKyNlbmRpZgogICAgIFZlY3RvcjxXZWJDb250ZXh0TWVudUl0ZW1E
YXRhPiBwcm9wb3NlZE1lbnUgPSBraXRJdGVtcyhjb3JlSXRlbXMsIG1lbnUpOwogICAgIFZlY3Rv
cjxXZWJDb250ZXh0TWVudUl0ZW1EYXRhPiBuZXdNZW51OwogICAgIFJlZlB0cjxBUElPYmplY3Q+
IHVzZXJEYXRhOwpJbmRleDogV2ViS2l0L3dpbi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
S2l0L3dpbi9DaGFuZ2VMb2cJKHJldmlzaW9uIDczNjM0KQorKysgV2ViS2l0L3dpbi9DaGFuZ2VM
b2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwyMyBAQAorMjAxMC0xMi0wOSAgQnJpYW4gV2Vp
bnN0ZWluICA8YndlaW5zdGVpbkBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgUHJlcCBmb3IgV2ViS2l0MjogQ29udGV4dCBtZW51IHN1
cHBvcnQgb24gV2luZG93cworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9NTA1MTQKKyAgICAgICAgCisgICAgICAgIFVwZGF0ZSBXZWJLaXQgZm9yIHRoZSBu
ZXcgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUyBmbGFnLCBhbmQgZGVmaW5lIGN1c3RvbWl6
ZU1lbnUKKyAgICAgICAgaW5zdGVhZCBvZiBnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcy4K
KworICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmNwcDoKKyAg
ICAgICAgKFdlYkNvbnRleHRNZW51Q2xpZW50OjpjdXN0b21pemVNZW51KTogZ2V0Q3VzdG9tTWVu
dUZyb21EZWZhdWx0SXRlbXMgd2FzIHR1cm5lZCBpbnRvCisgICAgICAgICAgICB0aGlzIGZ1bmN0
aW9uLCB3aXRoIHJlZmFjdG9yaW5nIHVzaW5nIG5hdGl2ZU1lbnUgaW5zdGVhZCBvZiBwbGF0Zm9y
bURlc2NyaXB0aW9uLgorICAgICAgICAoV2ViQ29udGV4dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51
SXRlbVNlbGVjdGVkKTogIFVzZSBuYXRpdmVNZW51IGluc3RlYWQgb2YgcGxhdGZvcm1EZXNjcmlw
dGlvbi4KKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oOgor
ICAgICAgICAqIFdlYlZpZXcuY3BwOgorICAgICAgICAoV2ViVmlldzo6aGFuZGxlQ29udGV4dE1l
bnVFdmVudCk6IENhbGwgbmF0aXZlTWVudSBpbnN0ZWFkIG9mIHBsYXRmb3JtRGVzY3JpcHRpb24u
CisgICAgICAgIChXZWJWaWV3OjpwZXJmb3JtQ29udGV4dE1lbnVBY3Rpb24pOiBPbmx5IGNhbGwg
aXRlbUF0SW5kZXggd2l0aCBvbmUgYXJndW1lbnQsIG5vIG5lZWQKKyAgICAgICAgICAgIGZvciB0
aGUgc2Vjb25kLgorCiAyMDEwLTEyLTA3ICBCcmlhbiBXZWluc3RlaW4gIDxid2VpbnN0ZWluQGFw
cGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBKb2huIFN1bGxpdmFuLgpJbmRleDogV2Vi
S2l0L3dpbi9XZWJWaWV3LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYlZpZXcuY3Bw
CShyZXZpc2lvbiA3MzUzNikKKysrIFdlYktpdC93aW4vV2ViVmlldy5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTEyNzUsMTIgKzEyNzUsMTIgQEAgYm9vbCBXZWJWaWV3OjpoYW5kbGVDb250ZXh0TWVu
dUV2ZW50KFdQQQogICAgICAgICBtX3VpRGVsZWdhdGUtPmhhc0N1c3RvbU1lbnVJbXBsZW1lbnRh
dGlvbigmaGFzQ3VzdG9tTWVudXMpOwogCiAgICAgaWYgKGhhc0N1c3RvbU1lbnVzKQotICAgICAg
ICBtX3VpRGVsZWdhdGUtPnRyYWNrQ3VzdG9tUG9wdXBNZW51KChJV2ViVmlldyopdGhpcywgKE9M
RV9IQU5ETEUpKFVMT05HNjQpY29yZU1lbnUtPnBsYXRmb3JtRGVzY3JpcHRpb24oKSwgJnBvaW50
KTsKKyAgICAgICAgbV91aURlbGVnYXRlLT50cmFja0N1c3RvbVBvcHVwTWVudSgoSVdlYlZpZXcq
KXRoaXMsIChPTEVfSEFORExFKShVTE9ORzY0KWNvcmVNZW51LT5uYXRpdmVNZW51KCksICZwb2lu
dCk7CiAgICAgZWxzZSB7CiAgICAgICAgIC8vIFN1cnByaXNpbmdseSwgVFBNX1JJR0hUQlVUVE9O
IG1lYW5zIHRoYXQgaXRlbXMgYXJlIHNlbGVjdGFibGUgd2l0aCBlaXRoZXIgdGhlIHJpZ2h0IE9S
IGxlZnQgbW91c2UgYnV0dG9uCiAgICAgICAgIFVJTlQgZmxhZ3MgPSBUUE1fUklHSFRCVVRUT04g
fCBUUE1fVE9QQUxJR04gfCBUUE1fVkVSUE9TQU5JTUFUSU9OIHwgVFBNX0hPUklaT05UQUwKICAg
ICAgICAgICAgIHwgVFBNX0xFRlRBTElHTiB8IFRQTV9IT1JQT1NBTklNQVRJT047Ci0gICAgICAg
IDo6VHJhY2tQb3B1cE1lbnVFeChjb3JlTWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpLCBmbGFn
cywgcG9pbnQueCwgcG9pbnQueSwgbV92aWV3V2luZG93LCAwKTsKKyAgICAgICAgOjpUcmFja1Bv
cHVwTWVudUV4KGNvcmVNZW51LT5uYXRpdmVNZW51KCksIGZsYWdzLCBwb2ludC54LCBwb2ludC55
LCBtX3ZpZXdXaW5kb3csIDApOwogICAgIH0KIAogICAgIHJldHVybiB0cnVlOwpAQCAtMTM1NSwx
MSArMTM1NSwxMCBAQCB2b2lkIFdlYlZpZXc6OnBlcmZvcm1Db250ZXh0TWVudUFjdGlvbihXCiAg
ICAgQ29udGV4dE1lbnUqIG1lbnUgPSBtX3BhZ2UtPmNvbnRleHRNZW51Q29udHJvbGxlcigpLT5j
b250ZXh0TWVudSgpOwogICAgIEFTU0VSVChtZW51KTsKIAotICAgIENvbnRleHRNZW51SXRlbSog
aXRlbSA9IGJ5UG9zaXRpb24gPyBtZW51LT5pdGVtQXRJbmRleCgodW5zaWduZWQpd1BhcmFtLCAo
SE1FTlUpbFBhcmFtKSA6IG1lbnUtPml0ZW1XaXRoQWN0aW9uKChDb250ZXh0TWVudUFjdGlvbil3
UGFyYW0pOworICAgIENvbnRleHRNZW51SXRlbSogaXRlbSA9IGJ5UG9zaXRpb24gPyBtZW51LT5p
dGVtQXRJbmRleCgodW5zaWduZWQpd1BhcmFtKSA6IG1lbnUtPml0ZW1XaXRoQWN0aW9uKChDb250
ZXh0TWVudUFjdGlvbil3UGFyYW0pOwogICAgIGlmICghaXRlbSkKICAgICAgICAgcmV0dXJuOwog
ICAgIG1fcGFnZS0+Y29udGV4dE1lbnVDb250cm9sbGVyKCktPmNvbnRleHRNZW51SXRlbVNlbGVj
dGVkKGl0ZW0pOwotICAgIGRlbGV0ZSBpdGVtOwogfQogCiBib29sIFdlYlZpZXc6OmhhbmRsZU1v
dXNlRXZlbnQoVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQpJbmRl
eDogV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVu
dC5jcHAJKHJldmlzaW9uIDczNTM2KQorKysgV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJD
b250ZXh0TWVudUNsaWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU1LDIxICs1NSwyMyBAQCB2
b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50Ojpjb250ZXh0TWVudURlCiAgICAgZGVsZXRlIHRoaXM7
CiB9CiAKLUhNRU5VIFdlYkNvbnRleHRNZW51Q2xpZW50OjpnZXRDdXN0b21NZW51RnJvbURlZmF1
bHRJdGVtcyhDb250ZXh0TWVudSogbWVudSkKK1Bhc3NPd25QdHI8Q29udGV4dE1lbnU+IFdlYkNv
bnRleHRNZW51Q2xpZW50OjpjdXN0b21pemVNZW51KFBhc3NPd25QdHI8Q29udGV4dE1lbnU+IG1l
bnUpCiB7CiAgICAgQ09NUHRyPElXZWJVSURlbGVnYXRlPiB1aURlbGVnYXRlOwogICAgIGlmIChG
QUlMRUQobV93ZWJWaWV3LT51aURlbGVnYXRlKCZ1aURlbGVnYXRlKSkpCi0gICAgICAgIHJldHVy
biBtZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCk7CisgICAgICAgIHJldHVybiBtZW51OwogCiAg
ICAgQVNTRVJUKHVpRGVsZWdhdGUpOwogCi0gICAgSE1FTlUgbmV3TWVudSA9IDA7CisgICAgSE1F
TlUgbmF0aXZlTWVudSA9IG1lbnUtPm5hdGl2ZU1lbnUoKTsKICAgICBDT01QdHI8V2ViRWxlbWVu
dFByb3BlcnR5QmFnPiBwcm9wZXJ0eUJhZzsKICAgICBwcm9wZXJ0eUJhZy5hZG9wdFJlZihXZWJF
bGVtZW50UHJvcGVydHlCYWc6OmNyZWF0ZUluc3RhbmNlKG1fd2ViVmlldy0+cGFnZSgpLT5jb250
ZXh0TWVudUNvbnRyb2xsZXIoKS0+aGl0VGVzdFJlc3VsdCgpKSk7CiAgICAgLy8gRklYTUU6IFdl
IG5lZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gZG8gdGhlIGRlZmF1bHQgYmVmb3JlIGNhbGxpbmcg
dGhpcyBkZWxlZ2F0ZSBtZXRob2QKLSAgICBpZiAoRkFJTEVEKHVpRGVsZWdhdGUtPmNvbnRleHRN
ZW51SXRlbXNGb3JFbGVtZW50KG1fd2ViVmlldywgcHJvcGVydHlCYWcuZ2V0KCksIChPTEVfSEFO
RExFKShVTE9ORzY0KW1lbnUtPnBsYXRmb3JtRGVzY3JpcHRpb24oKSwgKE9MRV9IQU5ETEUqKSZu
ZXdNZW51KSkpCi0gICAgICAgIHJldHVybiBtZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCk7Ci0g
ICAgcmV0dXJuIG5ld01lbnU7CisgICAgaWYgKEZBSUxFRCh1aURlbGVnYXRlLT5jb250ZXh0TWVu
dUl0ZW1zRm9yRWxlbWVudChtX3dlYlZpZXcsIHByb3BlcnR5QmFnLmdldCgpLCAoT0xFX0hBTkRM
RSkoVUxPTkc2NCluYXRpdmVNZW51LCAoT0xFX0hBTkRMRSopJm5hdGl2ZU1lbnUpKSkKKyAgICAg
ICAgcmV0dXJuIG1lbnU7CisgICAgCisgICAgT3duUHRyPENvbnRleHRNZW51PiBjdXN0b21pemVk
TWVudShuZXcgQ29udGV4dE1lbnUobmF0aXZlTWVudSkpOworICAgIHJldHVybiBjdXN0b21pemVk
TWVudS5yZWxlYXNlKCk7CiB9CiAKIHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmNvbnRleHRN
ZW51SXRlbVNlbGVjdGVkKENvbnRleHRNZW51SXRlbSogaXRlbSwgY29uc3QgQ29udGV4dE1lbnUq
IHBhcmVudE1lbnUpCkBAIC04NCw4ICs4Niw5IEBAIHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6
OmNvbnRleHRNZW51SXQKIAogICAgIENPTVB0cjxXZWJFbGVtZW50UHJvcGVydHlCYWc+IHByb3Bl
cnR5QmFnOwogICAgIHByb3BlcnR5QmFnLmFkb3B0UmVmKFdlYkVsZW1lbnRQcm9wZXJ0eUJhZzo6
Y3JlYXRlSW5zdGFuY2UobV93ZWJWaWV3LT5wYWdlKCktPmNvbnRleHRNZW51Q29udHJvbGxlcigp
LT5oaXRUZXN0UmVzdWx0KCkpKTsKLSAgICAgICAgICAgIAotICAgIHVpRGVsZWdhdGUtPmNvbnRl
eHRNZW51SXRlbVNlbGVjdGVkKG1fd2ViVmlldywgaXRlbS0+cmVsZWFzZVBsYXRmb3JtRGVzY3Jp
cHRpb24oKSwgcHJvcGVydHlCYWcuZ2V0KCkpOworCisgICAgTUVOVUlURU1JTkZPIHNlbGVjdGVk
SXRlbSA9IGl0ZW0tPm5hdGl2ZU1lbnVJdGVtKCk7CisgICAgdWlEZWxlZ2F0ZS0+Y29udGV4dE1l
bnVJdGVtU2VsZWN0ZWQobV93ZWJWaWV3LCAmc2VsZWN0ZWRJdGVtLCBwcm9wZXJ0eUJhZy5nZXQo
KSk7CiB9CiAKIHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmRvd25sb2FkVVJMKGNvbnN0IEtV
UkwmIHVybCkKSW5kZXg6IFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVD
bGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRl
eHRNZW51Q2xpZW50LmgJKHJldmlzaW9uIDczNTM2KQorKysgV2ViS2l0L3dpbi9XZWJDb3JlU3Vw
cG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMyw4ICsyMywx
MSBAQAogICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCiAgKi8KIAorI2luY2x1ZGUgPFdlYkNvcmUvQ29udGV4dE1l
bnUuaD4KICNpbmNsdWRlIDxXZWJDb3JlL0NvbnRleHRNZW51Q2xpZW50Lmg+CisjaW5jbHVkZSA8
V2ViQ29yZS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbi5oPgogI2luY2x1ZGUgPHd0Zi9Gb3J3YXJk
Lmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KIAogY2xhc3MgV2ViVmlldzsKIApAQCAt
MzQsNyArMzcsNyBAQCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIHZvaWQgY29udGV4dE1lbnVEZXN0
cm95ZWQoKTsKIAotICAgIHZpcnR1YWwgSE1FTlUgZ2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRl
bXMoV2ViQ29yZTo6Q29udGV4dE1lbnUqKTsKKyAgICB2aXJ0dWFsIFBhc3NPd25QdHI8V2ViQ29y
ZTo6Q29udGV4dE1lbnU+IGN1c3RvbWl6ZU1lbnUoUGFzc093blB0cjxXZWJDb3JlOjpDb250ZXh0
TWVudT4pOwogICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudUl0ZW1TZWxlY3RlZChXZWJDb3Jl
OjpDb250ZXh0TWVudUl0ZW0qLCBjb25zdCBXZWJDb3JlOjpDb250ZXh0TWVudSopOwogICAgIAog
ICAgIHZpcnR1YWwgdm9pZCBkb3dubG9hZFVSTChjb25zdCBXZWJDb3JlOjpLVVJMJik7Cg==
</data>
<flag name="review"
          id="66980"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76145</attachid>
            <date>2010-12-09 17:41:31 -0800</date>
            <delta_ts>2010-12-10 11:35:49 -0800</delta_ts>
            <desc>[PATChH] CROSS_PLATFORM_CONTEXT_MENUS + Adam&apos;s feedback</desc>
            <filename>context_menu_refactoring_win.patch</filename>
            <type>text/plain</type>
            <size>45997</size>
            <attacher name="Brian Weinstein">bweinstein</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MzYzNCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNzUgQEAKKzIwMTAtMTItMDkgIEJyaWFuIFdlaW5zdGVpbiAgPGJ3ZWluc3RlaW5A
YXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFByZXAgZm9yIFdlYktpdDI6IENvbnRleHQgbWVudSBzdXBwb3J0IG9uIFdpbmRvd3MKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUwNTE0CisgICAg
ICAgIAorICAgICAgICBCZWZvcmUgdGhpcyBwYXRjaCBDb250ZXh0TWVudSBvbiBXaW5kb3dzIHdl
cmUgYmFja2VkIGJ5IEhNRU5VcywgYW5kIENvbnRleHRNZW51SXRlbXMKKyAgICAgICAgd2VyZSBi
YWNrZWQgYnkgTUVOVUlURU1JTkZPcy4gVGhpcyBtZWFudCB0aGV5IGNvdWxkbid0IGJlIGNvcGll
ZCwgYW5kIHRoZXkgbmVlZGVkIHRvCisgICAgICAgIGJlIHRvIHdvcmsgaW4gV2ViS2l0Mi4KKyAg
ICAgICAgCisgICAgICAgIFRoaXMgcGF0Y2ggYWRkcyBhIG5ldyBVU0UgZmxhZyAtIENST1NTX1BM
QVRGT1JNX0NPTlRFWFRfTUVOVVMgdGhhdCBhcmUgZm9yIGEgY3Jvc3MtcGxhdGZvcm0KKyAgICAg
ICAgcmVwcmVzZW50YXRpb24gb2YgY29udGV4dCBtZW51cy4gVGhpcyBwYXRjaCBhbHNvIGhhcyBX
aW5kb3dzIGFkb3B0IHRoZW0uCisgICAgICAgIAorICAgICAgICBDcm9zcy1wbGF0Zm9ybSBjb250
ZXh0IG1lbnVzIGNoYW5nZSB0aGUgQVBJIG9mIGNvbnRleHQgbWVudXMgYW5kIHRoZSBDb250ZXh0
TWVudUNsaWVudC4gVGhlcmUKKyAgICAgICAgaXMgbm8gbW9yZSBpZGVhIG9mIGEgUGxhdGZvcm1N
ZW51RGVzY3JpcHRpb24gb3IgYSBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24uIE1lbnVzIGFy
ZSBiYWNrZWQKKyAgICAgICAgYnkgYSBWZWN0b3Igb2YgQ29udGV4dE1lbnVJdGVtcywgYW5kIG1l
bnUgaXRlbXMgYXJlIGJhY2tlZCBieSB0aGUgdmFyaWFibGVzIHRoZXkgbmVlZCAoZW5hYmxlZCwg
Y2hlY2tlZAorICAgICAgICB0aXRsZSwgYWN0aW9uLCB0eXBlLCBhbmQgc3VibWVudSkuCisgICAg
ICAgIAorICAgICAgICBUaGlzIHBhdGNoIGFsc28gcmVmYWN0b3JzIHRoZSBDb250ZXh0TWVudUNs
aWVudCBpbnRlcmZhY2UgdG8gdXNlIGEgdmFyaWF0aW9uIG9uIHRoZSBnZXRDdXN0b21NZW51RnJv
bURlZmF1bHRJdGVtcworICAgICAgICBmdW5jdGlvbiB0byBhbGxvdyBmb3IgY3VzdG9taXphdGlv
biBvZiB0aGUgY29udGV4dCBtZW51LgorICAgICAgICAKKyAgICAgICAgRm9yIG90aGVyIHBvcnRz
IHRvIHVzZSBDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTLCBhbGwgdGhleSBuZWVkIHRvIGRv
IGlzIHdyaXRlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGZyb20KKyAgICAgICAgYSBDb250ZXh0TWVu
dSA8LT4gbmF0aXZlIG1lbnUgdHlwZSwgYW5kIENvbnRleHRNZW51SXRlbSA8LT4gbmF0aXZlIG1l
bnUgaXRlbSB0eXBlLiBGb3IgV2luZG93cywgdGhpcyBpcyBkb25lCisgICAgICAgIGluIENvbnRl
eHRNZW51V2luLmNwcCBhbmQgQ29udGV4dE1lbnVJdGVtV2luLmNwcC4KKworICAgICAgICBObyBu
ZXcgdGVzdHMsIG5vIGNoYW5nZSBpbiBiZWhhdmlvci4KKworICAgICAgICAqIFdlYkNvcmUudmNw
cm9qL1dlYkNvcmUudmNwcm9qOiBBZGQgbmV3IGZpbGVzIChvbmx5IG5lZWRlZCBvbiBXaW5kb3dz
IGZvciBub3cpLgorICAgICAgICAqIGxvYWRlci9FbXB0eUNsaWVudHMuaDoKKyAgICAgICAgKFdl
YkNvcmU6OkVtcHR5Q29udGV4dE1lbnVDbGllbnQ6OmN1c3RvbWl6ZU1lbnUpOiBEZWZpbmUgdGhp
cyBmdW5jdGlvbiBpZiBDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTCisgICAgICAgICAgICBp
cyBvbi4KKyAgICAgICAgKiBwYWdlL0NvbnRleHRNZW51Q2xpZW50Lmg6IERpdHRvLiAKKyAgICAg
ICAgKiBwYWdlL0NvbnRleHRNZW51Q29udHJvbGxlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpD
b250ZXh0TWVudUNvbnRyb2xsZXI6OnNob3dDb250ZXh0TWVudSk6IENhbGwgY3VzdG9taXplTWVu
dSBpbnN0ZWFkIG9mIAorICAgICAgICAgICAgZ2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMg
aWYgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUyBpcyBvbi4KKyAgICAgICAgKiBwbGF0Zm9y
bS9Db250ZXh0TWVudS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6
OkNvbnRleHRNZW51KTogRW1wdHkgY29uc3RydWN0b3IuCisgICAgICAgIChXZWJDb3JlOjpDb250
ZXh0TWVudTo6c2V0SXRlbXMpOiBTZXRzIHRoZSBpdGVtcyBpbiB0aGUgbWVudS4KKyAgICAgICAg
KFdlYkNvcmU6OkNvbnRleHRNZW51OjppdGVtcyk6IFJldHVybnMgdGhlIGl0ZW1zIGluIHRoZSBt
ZW51LgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6Oml0ZW1BdEluZGV4KToKKyAgICAg
ICAgKFdlYkNvcmU6Oml0ZW1XaXRoQWN0aW9uSW5NZW51KTogUmV0dXJucyB0aGUgaXRlbSB3aXRo
IHRoZSBjb3JyZWN0IGFjdGlvbiwgcmVjdXJzaXZlbHkgZGVzY2VuZGluZworICAgICAgICAgICAg
aW50byBzdWJtZW51cy4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjppdGVtV2l0aEFj
dGlvbik6IENhbGxzIHRocm91Z2ggdG8gaXRlbVdpdGhBY3Rpb25Jbk1lbnUuCisgICAgICAgICog
cGxhdGZvcm0vQ29udGV4dE1lbnUuaDogQWRkZWQgYSBuZXcgc2V0IG9mIGZ1bmN0aW9ucyBhbmQg
bWVtYmVyIHZhcmlhYmxlcyB0aGF0IGFyZSBkZWZpbmVkIGZvcgorICAgICAgICAgICAgQ1JPU1Nf
UExBVEZPUk1fQ09OVEVYVF9NRU5VUy4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51Ojph
cHBlbmRJdGVtKTogQXBwZW5kcyBhbiBpdGVtIHRvIHRoZSBtZW51LgorICAgICAgICAqIHBsYXRm
b3JtL0NvbnRleHRNZW51SXRlbS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4
dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0pOgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1l
bnVJdGVtOjp+Q29udGV4dE1lbnVJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51
SXRlbTo6c2V0U3ViTWVudSk6CisgICAgICAgICogcGxhdGZvcm0vQ29udGV4dE1lbnVJdGVtLmg6
CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnR5cGUpOiBSZXR1cm5zIHRoZSB0
eXBlLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRUeXBlKTogU2V0cyB0
aGUgdHlwZS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6YWN0aW9uKTogUmV0
dXJucyB0aGUgYWN0aW9uLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpzZXRB
Y3Rpb24pOiBTZXRzIHRoZSBhY3Rpb24uCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0
ZW06OnRpdGxlKTogUmV0dXJucyB0aGUgdGl0bGUuCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0
TWVudUl0ZW06OnNldFRpdGxlKTogU2V0cyB0aGUgdGl0bGUuCisgICAgICAgIChXZWJDb3JlOjpD
b250ZXh0TWVudUl0ZW06OmNoZWNrZWQpOiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtZW51
IGl0ZW0gaXMgY2hlY2tlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6c2V0
Q2hlY2tlZCk6IFNldHMgd2hldGhlciBvdCBub3QgdGhlIG1lbnUgaXRlbSBpcyBjaGVja2VkLgor
ICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjplbmFibGVkKTogUmV0dXJucyB3aGV0
aGVyIG9yIG5vdCB0aGUgbWVudSBpdGVtIGlzIGVuYWJsZWQuCisgICAgICAgIChXZWJDb3JlOjpD
b250ZXh0TWVudUl0ZW06OnNldEVuYWJsZWQpOiBTZXRzIHdoZXRoZXIgb3Igbm90IHRoZSBtZW51
IGl0ZW0gaXMgZW5hYmxlZC4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6c3Vi
bWVudSk6IFJldHVybnMgdGhlIHN1Ym1lbnUuCisgICAgICAgICogcGxhdGZvcm0vUGxhdGZvcm1N
ZW51RGVzY3JpcHRpb24uaDogUmVtb3ZlIHRoZSBpZGVhIGlmIGEgUGxhdGZvcm1NZW51RGVzY3Jp
cHRpb24gaWYgCisgICAgICAgICAgICBDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTIGlzIG9u
LgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9Db250ZXh0TWVudUl0ZW1XaW4uY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0pOiBDcmVhdGVzIGEg
Q29udGV4dE1lbnVJdGVtIGZyb20gYSBNRU5VSVRFTUlORk8uCisgICAgICAgIChXZWJDb3JlOjpD
b250ZXh0TWVudUl0ZW06Om5hdGl2ZU1lbnVJdGVtKTogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIE1F
TlVJVEVNSU5GTy4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4vQ29udGV4dE1lbnVXaW4uY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6OkNvbnRleHRNZW51KTogQ3JlYXRlcyBhIENv
bnRleHRNZW51IGZyb20gYW4gSE1FTlUuCisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudTo6
bmF0aXZlTWVudSk6IENyZWF0ZXMgYW5kIHJldHVybnMgYW4gSE1FTlUuCisKIDIwMTAtMTItMDkg
IFlhZWwgQWhhcm9uICA8eWFlbC5haGFyb25Abm9raWEuY29tPgogCiAgICAgICAgIFJldmlld2Vk
IGJ5IEFudG9uaW8gR29tZXMuCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUu
dmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3By
b2oJKHJldmlzaW9uIDczNTM2KQorKysgV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZj
cHJvagkod29ya2luZyBjb3B5KQpAQCAtMjUzMTMsMTAgKzI1MzEzLDE4IEBACiAJCQkJUmVsYXRp
dmVQYXRoPSIuLlxwbGF0Zm9ybVxDb250ZW50VHlwZS5oIgogCQkJCT4KIAkJCTwvRmlsZT4KKyAg
ICAgICAgICAgIDxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxDb250ZXh0TWVu
dS5jcHAiCisJCQkJPgorCQkJPC9GaWxlPgogCQkJPEZpbGUKIAkJCQlSZWxhdGl2ZVBhdGg9Ii4u
XHBsYXRmb3JtXENvbnRleHRNZW51LmgiCiAJCQkJPgogCQkJPC9GaWxlPgorICAgICAgICAgICAg
PEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXENvbnRleHRNZW51SXRlbS5jcHAi
CisJCQkJPgorCQkJPC9GaWxlPgogCQkJPEZpbGUKIAkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRm
b3JtXENvbnRleHRNZW51SXRlbS5oIgogCQkJCT4KSW5kZXg6IFdlYkNvcmUvbG9hZGVyL0VtcHR5
Q2xpZW50cy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvbG9hZGVyL0VtcHR5Q2xpZW50cy5oCShy
ZXZpc2lvbiA3MzUzNikKKysrIFdlYkNvcmUvbG9hZGVyL0VtcHR5Q2xpZW50cy5oCSh3b3JraW5n
IGNvcHkpCkBAIC01MDEsNyArNTAxLDExIEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5FbXB0eUNv
bnRleHRNZW51Q2xpZW50KCkgeyAgfQogICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudURlc3Ry
b3llZCgpIHsgfQogCisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCisgICAg
dmlydHVhbCBQYXNzT3duUHRyPENvbnRleHRNZW51PiBjdXN0b21pemVNZW51KFBhc3NPd25QdHI8
Q29udGV4dE1lbnU+KSB7IHJldHVybiAwOyB9CisjZWxzZQogICAgIHZpcnR1YWwgUGxhdGZvcm1N
ZW51RGVzY3JpcHRpb24gZ2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMoQ29udGV4dE1lbnUq
KSB7IHJldHVybiAwOyB9CisjZW5kaWYKICAgICB2aXJ0dWFsIHZvaWQgY29udGV4dE1lbnVJdGVt
U2VsZWN0ZWQoQ29udGV4dE1lbnVJdGVtKiwgY29uc3QgQ29udGV4dE1lbnUqKSB7IH0KIAogICAg
IHZpcnR1YWwgdm9pZCBkb3dubG9hZFVSTChjb25zdCBLVVJMJikgeyB9CkluZGV4OiBXZWJDb3Jl
L3BhZ2UvQ29udGV4dE1lbnVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BhZ2UvQ29u
dGV4dE1lbnVDbGllbnQuaAkocmV2aXNpb24gNzM1MzYpCisrKyBXZWJDb3JlL3BhZ2UvQ29udGV4
dE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMjYsMTEgKzI2LDEyIEBACiAjaWZuZGVm
IENvbnRleHRNZW51Q2xpZW50X2gKICNkZWZpbmUgQ29udGV4dE1lbnVDbGllbnRfaAogCisjaW5j
bHVkZSAiQ29udGV4dE1lbnUuaCIKICNpbmNsdWRlICJQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbi5o
IgogI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4K
IAogbmFtZXNwYWNlIFdlYkNvcmUgewotICAgIGNsYXNzIENvbnRleHRNZW51OwogICAgIGNsYXNz
IENvbnRleHRNZW51SXRlbTsKICAgICBjbGFzcyBGcmFtZTsKICAgICBjbGFzcyBIaXRUZXN0UmVz
dWx0OwpAQCAtNDEsNyArNDIsMTIgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB2aXJ0
dWFsIH5Db250ZXh0TWVudUNsaWVudCgpIHsgIH0KICAgICAgICAgdmlydHVhbCB2b2lkIGNvbnRl
eHRNZW51RGVzdHJveWVkKCkgPSAwOwogICAgICAgICAKKyNpZiBVU0UoQ1JPU1NfUExBVEZPUk1f
Q09OVEVYVF9NRU5VUykKKyAgICAgICAgdmlydHVhbCBQYXNzT3duUHRyPENvbnRleHRNZW51PiBj
dXN0b21pemVNZW51KFBhc3NPd25QdHI8Q29udGV4dE1lbnU+KSA9IDA7CisjZWxzZQogICAgICAg
ICB2aXJ0dWFsIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGdldEN1c3RvbU1lbnVGcm9tRGVmYXVs
dEl0ZW1zKENvbnRleHRNZW51KikgPSAwOworI2VuZGlmCisKICAgICAgICAgdmlydHVhbCB2b2lk
IGNvbnRleHRNZW51SXRlbVNlbGVjdGVkKENvbnRleHRNZW51SXRlbSosIGNvbnN0IENvbnRleHRN
ZW51KikgPSAwOwogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBkb3dubG9hZFVSTChjb25zdCBLVVJM
JiB1cmwpID0gMDsKSW5kZXg6IFdlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNvbnRyb2xsZXIuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNvbnRyb2xsZXIuY3BwCShy
ZXZpc2lvbiA3MzUzNikKKysrIFdlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNvbnRyb2xsZXIuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0xNDQsOCArMTQ0LDEzIEBAIHZvaWQgQ29udGV4dE1lbnVDb250
cm9sbGVyOjpzaG93Q29udGV4dE0KICAgICBpZiAobV9wYWdlLT5pbnNwZWN0b3JDb250cm9sbGVy
KCktPmVuYWJsZWQoKSkKICAgICAgICAgYWRkSW5zcGVjdEVsZW1lbnRJdGVtKCk7CiAjZW5kaWYK
KworI2lmIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQorICAgIG1fY29udGV4dE1l
bnUgPSBtX2NsaWVudC0+Y3VzdG9taXplTWVudShtX2NvbnRleHRNZW51LnJlbGVhc2UoKSk7Cisj
ZWxzZQogICAgIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGN1c3RvbU1lbnUgPSBtX2NsaWVudC0+
Z2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMobV9jb250ZXh0TWVudS5nZXQoKSk7CiAgICAg
bV9jb250ZXh0TWVudS0+c2V0UGxhdGZvcm1EZXNjcmlwdGlvbihjdXN0b21NZW51KTsKKyNlbmRp
ZgogICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOwogfQogCkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL0NvbnRleHRNZW51LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL0Nv
bnRleHRNZW51LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1l
bnUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51LmgiCisKKyNpZiBVU0UoQ1JPU1Nf
UExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitDb250ZXh0
TWVudTo6Q29udGV4dE1lbnUoKQoreworfQorCitDb250ZXh0TWVudTo6Q29udGV4dE1lbnUoY29u
c3QgVmVjdG9yPENvbnRleHRNZW51SXRlbT4mIGl0ZW1zKQorICAgIDogbV9pdGVtcyhpdGVtcykg
Cit7Cit9CisKKy8vIEZJWE1FOiBXaGVuIG1vcmUgY2FsbGVycyBhZG9wdCBDUk9TU19QTEFURk9S
TV9DT05URVhUX01FTlVTLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCB0YWtlIGEgY29uc3QgVmVjdG9y
PENvbnRleHRNZW51SXRlbT4mIC0gYW5kIHNob3VsZAorLy8gcmV0dXJuIGEgY29uc3QgQ29udGV4
dE1lbnVJdGVtKi4KK3N0YXRpYyBDb250ZXh0TWVudUl0ZW0qIGZpbmRJdGVtV2l0aEFjdGlvbih1
bnNpZ25lZCBhY3Rpb24sIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBpdGVtcykKK3sKKyAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgIENvbnRl
eHRNZW51SXRlbSYgaXRlbSA9IGl0ZW1zW2ldOworICAgICAgICBpZiAoaXRlbS5hY3Rpb24oKSA9
PSBhY3Rpb24pCisgICAgICAgICAgICByZXR1cm4gJml0ZW07CisgICAgICAgIGlmIChpdGVtLnR5
cGUoKSAhPSBTdWJtZW51VHlwZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAo
Q29udGV4dE1lbnVJdGVtKiBzdWJNZW51SXRlbSA9IGZpbmRJdGVtV2l0aEFjdGlvbihhY3Rpb24s
IGNvbnN0X2Nhc3Q8VmVjdG9yPENvbnRleHRNZW51SXRlbT4mPihpdGVtLnN1Yk1lbnVJdGVtcygp
KSkpCisgICAgICAgICAgICByZXR1cm4gc3ViTWVudUl0ZW07CisgICAgfQorCisgICAgcmV0dXJu
IDA7Cit9CisKK0NvbnRleHRNZW51SXRlbSogQ29udGV4dE1lbnU6Oml0ZW1XaXRoQWN0aW9uKHVu
c2lnbmVkIGFjdGlvbikKK3sKKyAgICByZXR1cm4gZmluZEl0ZW1XaXRoQWN0aW9uKGFjdGlvbiwg
bV9pdGVtcyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShD
Uk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9Db250
ZXh0TWVudS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnUuaAko
cmV2aXNpb24gNzM1MzYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51LmgJKHdvcmtp
bmcgY29weSkKQEAgLTQ2LDYgKzQ2LDI5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogICAgIGNs
YXNzIENvbnRleHRNZW51IDogcHVibGljIE5vbmNvcHlhYmxlCiAgICAgeworI2lmIFVTRShDUk9T
U19QTEFURk9STV9DT05URVhUX01FTlVTKQorICAgIHB1YmxpYzoKKyNpZiBQTEFURk9STShXSU4p
CisgICAgICAgIHR5cGVkZWYgSE1FTlUgTmF0aXZlTWVudTsKKyNlbmRpZgorICAgICAgICBDb250
ZXh0TWVudSgpOworICAgICAgICBleHBsaWNpdCBDb250ZXh0TWVudShjb25zdCBWZWN0b3I8Q29u
dGV4dE1lbnVJdGVtPiYpOworICAgICAgICBleHBsaWNpdCBDb250ZXh0TWVudShOYXRpdmVNZW51
KTsKKworICAgICAgICBOYXRpdmVNZW51IG5hdGl2ZU1lbnUoKSBjb25zdDsKKworICAgICAgICAv
LyBGSVhNRTogV2hlbiBtb3JlIHBsYXRmb3JtcyBzd2l0Y2ggb3ZlciwgdGhlc2Ugc2hvdWxkIHJl
dHVybiBjb25zdCBDb250ZXh0TWVudUl0ZW0qJ3MuCisgICAgICAgIENvbnRleHRNZW51SXRlbSog
aXRlbVdpdGhBY3Rpb24odW5zaWduZWQpOworICAgICAgICBDb250ZXh0TWVudUl0ZW0qIGl0ZW1B
dEluZGV4KHVuc2lnbmVkIGluZGV4KSB7IHJldHVybiAmbV9pdGVtc1tpbmRleF07IH0KKworICAg
ICAgICB2b2lkIHNldEl0ZW1zKGNvbnN0IFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBpdGVtcykg
eyBtX2l0ZW1zID0gaXRlbXM7IH0KKyAgICAgICAgY29uc3QgVmVjdG9yPENvbnRleHRNZW51SXRl
bT4mIGl0ZW1zKCkgY29uc3QgeyByZXR1cm4gbV9pdGVtczsgfQorCisgICAgICAgIHZvaWQgYXBw
ZW5kSXRlbShjb25zdCBDb250ZXh0TWVudUl0ZW0mIGl0ZW0pIHsgbV9pdGVtcy5hcHBlbmQoaXRl
bSk7IH0gCisKKyAgICBwcml2YXRlOgorICAgICAgICBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBt
X2l0ZW1zOworI2Vsc2UKICAgICBwdWJsaWM6CiAgICAgICAgIENvbnRleHRNZW51KCk7CiAgICAg
ICAgIENvbnRleHRNZW51KGNvbnN0IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uKTsKQEAgLTgzLDEw
ICsxMDYsMTQgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB1bnNpZ25lZCBtX2l0ZW1D
b3VudDsKICNlbmRpZgogI2VuZGlmCisKKyNlbmRpZiAvLyBVU0UoQ1JPU1NfUExBVEZPUk1fQ09O
VEVYVF9NRU5VUykKICAgICB9OwogCisjaWYgIVVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01F
TlVTKQogVmVjdG9yPENvbnRleHRNZW51SXRlbT4gY29udGV4dE1lbnVJdGVtVmVjdG9yKFBsYXRm
b3JtTWVudURlc2NyaXB0aW9uKTsKIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIHBsYXRmb3JtTWVu
dURlc2NyaXB0aW9uKFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+Jik7CisjZW5kaWYKIAogfQogCklu
ZGV4OiBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51SXRlbS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudUl0ZW0uY3BwCShyZXZpc2lvbiAwKQorKysgV2Vi
Q29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudUl0ZW0uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgor
ICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAq
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvbnRl
eHRNZW51SXRlbS5oIgorCisjaW5jbHVkZSAiQ29udGV4dE1lbnUuaCIKKworI2lmIFVTRShDUk9T
U19QTEFURk9STV9DT05URVhUX01FTlVTKQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0NvbnRl
eHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51SXRlbVR5cGUgdHlwZSwgQ29u
dGV4dE1lbnVBY3Rpb24gYWN0aW9uLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBDb250ZXh0TWVudSog
c3ViTWVudSkKKyAgICA6IG1fdHlwZSh0eXBlKQorICAgICwgbV9hY3Rpb24oYWN0aW9uKQorICAg
ICwgbV90aXRsZSh0aXRsZSkKKyAgICAsIG1fZW5hYmxlZCh0cnVlKQorICAgICwgbV9jaGVja2Vk
KGZhbHNlKQoreworICAgIHNldFN1Yk1lbnUoc3ViTWVudSk7Cit9CisKK0NvbnRleHRNZW51SXRl
bTo6Q29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51SXRlbVR5cGUgdHlwZSwgQ29udGV4dE1lbnVB
Y3Rpb24gYWN0aW9uLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBib29sIGVuYWJsZWQsIGJvb2wgY2hl
Y2tlZCkKKyAgICA6IG1fdHlwZSh0eXBlKQorICAgICwgbV9hY3Rpb24oYWN0aW9uKQorICAgICwg
bV90aXRsZSh0aXRsZSkKKyAgICAsIG1fZW5hYmxlZChlbmFibGVkKQorICAgICwgbV9jaGVja2Vk
KGNoZWNrZWQpCit7Cit9CisgICAgICAgIAorQ29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0
ZW0oQ29udGV4dE1lbnVBY3Rpb24gYWN0aW9uLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBib29sIGVu
YWJsZWQsIGJvb2wgY2hlY2tlZCwgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gc3ViTWVudUl0ZW1z
KQorICAgIDogbV90eXBlKFN1Ym1lbnVUeXBlKQorICAgICwgbV9hY3Rpb24oYWN0aW9uKQorICAg
ICwgbV90aXRsZSh0aXRsZSkKKyAgICAsIG1fZW5hYmxlZChlbmFibGVkKQorICAgICwgbV9jaGVj
a2VkKGNoZWNrZWQpCisgICAgLCBtX3N1Yk1lbnVJdGVtcyhzdWJNZW51SXRlbXMpCit7Cit9CisK
K0NvbnRleHRNZW51SXRlbTo6fkNvbnRleHRNZW51SXRlbSgpCit7Cit9CisKK3ZvaWQgQ29udGV4
dE1lbnVJdGVtOjpzZXRTdWJNZW51KENvbnRleHRNZW51KiBzdWJNZW51KQoreworICAgIGlmIChz
dWJNZW51KSB7CisgICAgICAgIG1fdHlwZSA9IFN1Ym1lbnVUeXBlOworICAgICAgICBtX3N1Yk1l
bnVJdGVtcyA9IHN1Yk1lbnUtPml0ZW1zKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV90eXBl
ID0gQWN0aW9uVHlwZTsKKyAgICAgICAgbV9zdWJNZW51SXRlbXMuY2xlYXIoKTsKKyAgICB9Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShDUk9TU19QTEFURk9S
TV9DT05URVhUX01FTlVTKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudUl0ZW0u
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51SXRlbS5oCShyZXZp
c2lvbiA3MzUzNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnVJdGVtLmgJKHdvcmtp
bmcgY29weSkKQEAgLTQwLDcgKzQwLDcgQEAKIGNsYXNzIE5TTWVudUl0ZW07CiAjZW5kaWYKICNl
bGlmIFBMQVRGT1JNKFdJTikKLXR5cGVkZWYgc3RydWN0IHRhZ01FTlVJVEVNSU5GT1cqIExQTUVO
VUlURU1JTkZPOwordHlwZWRlZiBzdHJ1Y3QgdGFnTUVOVUlURU1JTkZPVyBNRU5VSVRFTUlORk87
CiAjZWxpZiBQTEFURk9STShHVEspCiB0eXBlZGVmIHN0cnVjdCBfR3RrTWVudUl0ZW0gR3RrTWVu
dUl0ZW07CiAjZWxpZiBQTEFURk9STShRVCkKQEAgLTE2Niw4ICsxNjYsNiBAQCBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKICNpZiBQTEFURk9STShNQUMpCiAgICAgdHlwZWRlZiBOU01lbnVJdGVtKiBQ
bGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb247Ci0jZWxpZiBQTEFURk9STShXSU4pCi0gICAgdHlw
ZWRlZiBMUE1FTlVJVEVNSU5GTyBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb247CiAjZWxpZiBQ
TEFURk9STShRVCkKICAgICBzdHJ1Y3QgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIHsKICAg
ICAgICAgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uKCkKQEAgLTI1Myw2ICsyNTEsNDYgQEAg
bmFtZXNwYWNlIFdlYkNvcmUgewogI2VuZGlmCiAKICAgICBjbGFzcyBDb250ZXh0TWVudUl0ZW0g
OiBwdWJsaWMgRmFzdEFsbG9jQmFzZSB7CisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRf
TUVOVVMpCisgICAgcHVibGljOgorI2lmIFBMQVRGT1JNKFdJTikKKyAgICAgICAgdHlwZWRlZiBN
RU5VSVRFTUlORk8gTmF0aXZlSXRlbTsKKyNlbmRpZgorICAgICAgICBDb250ZXh0TWVudUl0ZW0o
Q29udGV4dE1lbnVJdGVtVHlwZSwgQ29udGV4dE1lbnVBY3Rpb24sIGNvbnN0IFN0cmluZyYsIENv
bnRleHRNZW51KiBzdWJNZW51ID0gMCk7CisgICAgICAgIENvbnRleHRNZW51SXRlbShDb250ZXh0
TWVudUl0ZW1UeXBlLCBDb250ZXh0TWVudUFjdGlvbiwgY29uc3QgU3RyaW5nJiwgYm9vbCBlbmFi
bGVkLCBib29sIGNoZWNrZWQpOworICAgICAgICBDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVB
Y3Rpb24sIGNvbnN0IFN0cmluZyYsIGJvb2wgZW5hYmxlZCwgYm9vbCBjaGVja2VkLCBWZWN0b3I8
Q29udGV4dE1lbnVJdGVtPiBzdWJNZW51SXRlbXMpOworICAgICAgICBleHBsaWNpdCBDb250ZXh0
TWVudUl0ZW0oTmF0aXZlSXRlbSk7CisKKyAgICAgICAgTmF0aXZlSXRlbSBuYXRpdmVNZW51SXRl
bSgpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2V0VHlwZShDb250ZXh0TWVudUl0ZW1UeXBlIHR5
cGUpIHsgbV90eXBlID0gdHlwZTsgfQorICAgICAgICBDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUo
KSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KKworICAgICAgICB2b2lkIHNldEFjdGlvbihDb250
ZXh0TWVudUFjdGlvbiBhY3Rpb24pIHsgbV9hY3Rpb24gPSBhY3Rpb247IH0KKyAgICAgICAgQ29u
dGV4dE1lbnVBY3Rpb24gYWN0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9hY3Rpb247IH0KKworICAg
ICAgICB2b2lkIHNldFRpdGxlKGNvbnN0IFN0cmluZyYgdGl0bGUpIHsgbV90aXRsZSA9IHRpdGxl
OyB9CisgICAgICAgIGNvbnN0IFN0cmluZyYgdGl0bGUoKSBjb25zdCB7IHJldHVybiBtX3RpdGxl
OyB9CisKKyAgICAgICAgdm9pZCBzZXRDaGVja2VkKGJvb2wgY2hlY2tlZCA9IHRydWUpIHsgbV9j
aGVja2VkID0gY2hlY2tlZDsgfQorICAgICAgICBib29sIGNoZWNrZWQoKSBjb25zdCB7IHJldHVy
biBtX2NoZWNrZWQ7IH0KKworICAgICAgICB2b2lkIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkID0g
dHJ1ZSkgeyBtX2VuYWJsZWQgPSBlbmFibGVkOyB9CisgICAgICAgIGJvb2wgZW5hYmxlZCgpIGNv
bnN0IHsgcmV0dXJuIG1fZW5hYmxlZDsgfQorCisgICAgICAgIHZvaWQgc2V0U3ViTWVudShDb250
ZXh0TWVudSopOworICAgICAgICBjb25zdCBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYgc3ViTWVu
dUl0ZW1zKCkgY29uc3QgeyByZXR1cm4gbV9zdWJNZW51SXRlbXM7IH0KKworICAgICAgICB+Q29u
dGV4dE1lbnVJdGVtKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBTdHJpbmcgbV90aXRsZTsK
KyAgICAgICAgYm9vbCBtX2VuYWJsZWQ7CisgICAgICAgIGJvb2wgbV9jaGVja2VkOworICAgICAg
ICBDb250ZXh0TWVudUFjdGlvbiBtX2FjdGlvbjsKKyAgICAgICAgQ29udGV4dE1lbnVJdGVtVHlw
ZSBtX3R5cGU7CisgICAgICAgIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+IG1fc3ViTWVudUl0ZW1z
OworI2Vsc2UKICAgICBwdWJsaWM6CiAgICAgICAgIENvbnRleHRNZW51SXRlbShQbGF0Zm9ybU1l
bnVJdGVtRGVzY3JpcHRpb24pOwogICAgICAgICBDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnUq
IHN1Yk1lbnUgPSAwKTsKQEAgLTI5Nyw2ICszMzUsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAj
ZWxzZQogICAgICAgICBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24gbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uOwogI2VuZGlmCisjZW5kaWYgLy8gVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVO
VVMpCiAgICAgfTsKIAogfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9QbGF0Zm9ybU1lbnVEZXNj
cmlwdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vUGxhdGZvcm1NZW51RGVz
Y3JpcHRpb24uaAkocmV2aXNpb24gNzM1MzYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL1BsYXRmb3Jt
TWVudURlc2NyaXB0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTMyLDggKzMyLDYgQEAKICNlbHNl
CiBjbGFzcyBOU011dGFibGVBcnJheTsKICNlbmRpZgotI2VsaWYgUExBVEZPUk0oV0lOKQotdHlw
ZWRlZiBzdHJ1Y3QgSE1FTlVfXyogSE1FTlU7CiAjZWxpZiBQTEFURk9STShRVCkKICNpbmNsdWRl
IDxxbGlzdC5oPgogI2VsaWYgUExBVEZPUk0oR1RLKQpAQCAtNDYsMTAgKzQ0LDkgQEAgY2xhc3Mg
Qk1lbnU7CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorI2lmICFVU0UoQ1JPU1NfUExBVEZPUk1f
Q09OVEVYVF9NRU5VUykKICNpZiBQTEFURk9STShNQUMpCiAgICAgdHlwZWRlZiBOU011dGFibGVB
cnJheSogUGxhdGZvcm1NZW51RGVzY3JpcHRpb247Ci0jZWxpZiBQTEFURk9STShXSU4pCi0gICAg
dHlwZWRlZiBITUVOVSBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbjsKICNlbGlmIFBMQVRGT1JNKFFU
KQogICAgIGNsYXNzIENvbnRleHRNZW51SXRlbTsKICAgICB0eXBlZGVmIGNvbnN0IFFMaXN0PENv
bnRleHRNZW51SXRlbT4qIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uOwpAQCAtNjIsNiArNTksNyBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAjZWxzZQogICAgIHR5cGVkZWYgdm9pZCogUGxhdGZvcm1N
ZW51RGVzY3JpcHRpb247CiAjZW5kaWYKKyNlbmRpZiAvLyAhVVNFKENST1NTX1BMQVRGT1JNX0NP
TlRFWFRfTUVOVVMpCiAKIH0gLy8gbmFtZXNwYWNlCiAKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0v
d2luL0NvbnRleHRNZW51SXRlbVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS93aW4vQ29udGV4dE1lbnVJdGVtV2luLmNwcAkocmV2aXNpb24gNzM1MzYpCisrKyBXZWJDb3Jl
L3BsYXRmb3JtL3dpbi9Db250ZXh0TWVudUl0ZW1XaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
Nyw2ICsyNyw3IEBACiAjaW5jbHVkZSAiQ29udGV4dE1lbnVJdGVtLmgiCiAKICNpbmNsdWRlICJD
b250ZXh0TWVudS5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKIAogI2luY2x1ZGUgPHd0
Zi90ZXh0L0NTdHJpbmcuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CkBAIC00NSwxODEgKzQ2LDU0
IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotQ29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVu
dUl0ZW0oTFBNRU5VSVRFTUlORk8gaXRlbSkKLSAgICA6IG1fcGxhdGZvcm1EZXNjcmlwdGlvbihp
dGVtKQorQ29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oTUVOVUlURU1JTkZPIGluZm8p
CiB7Ci19Ci0KLUNvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51KiBz
dWJNZW51KQotewotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IChMUE1FTlVJVEVNSU5GTylt
YWxsb2Moc2l6ZW9mKE1FTlVJVEVNSU5GTykpOwotICAgIGlmICghbV9wbGF0Zm9ybURlc2NyaXB0
aW9uKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtZW1zZXQobV9wbGF0Zm9ybURlc2NyaXB0aW9u
LCAwLCBzaXplb2YoTUVOVUlURU1JTkZPKSk7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5j
YlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPKTsKLQotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlv
bi0+d0lEID0gQ29udGV4dE1lbnVJdGVtVGFnTm9BY3Rpb247Ci0gICAgaWYgKHN1Yk1lbnUpIHsK
LSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFzayB8PSBNSUlNX1NVQk1FTlU7Ci0g
ICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUgPSBzdWJNZW51LT5wbGF0Zm9y
bURlc2NyaXB0aW9uKCk7Ci0gICAgfQotfQotCi1Db250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51
SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUsIENvbnRleHRNZW51QWN0aW9uIGFjdGlvbiwg
Y29uc3QgU3RyaW5nJiB0aXRsZSwgQ29udGV4dE1lbnUqIHN1Yk1lbnUpCi17Ci0gICAgbV9wbGF0
Zm9ybURlc2NyaXB0aW9uID0gKExQTUVOVUlURU1JTkZPKW1hbGxvYyhzaXplb2YoTUVOVUlURU1J
TkZPKSk7Ci0gICAgaWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVybjsK
LQotICAgIG1lbXNldChtX3BsYXRmb3JtRGVzY3JpcHRpb24sIDAsIHNpemVvZihNRU5VSVRFTUlO
Rk8pKTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmNiU2l6ZSA9IHNpemVvZihNRU5VSVRF
TUlORk8pOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sgPSBNSUlNX0ZUWVBFOwot
Ci0gICAgaWYgKHR5cGUgPT0gU2VwYXJhdG9yVHlwZSkgewotICAgICAgICBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPmZUeXBlID0gTUZUX1NFUEFSQVRPUjsKLSAgICAgICAgcmV0dXJuOworICAgIGlm
IChpbmZvLmZNYXNrICYgTUlJTV9GVFlQRSkgeyAKKyAgICAgICAgbV90eXBlID0gaW5mby5mVHlw
ZSAmIE1GVF9TRVBBUkFUT1IgPyBTZXBhcmF0b3JUeXBlIDogQWN0aW9uVHlwZTsKKyAgICAgICAg
bV90aXRsZSA9IFN0cmluZyhpbmZvLmR3VHlwZURhdGEsIHdjc2xlbihpbmZvLmR3VHlwZURhdGEp
KTsKICAgICB9Ci0gICAgCi0gICAgaWYgKHN1Yk1lbnUpIHsKLSAgICAgICAgbV9wbGF0Zm9ybURl
c2NyaXB0aW9uLT5mTWFzayB8PSBNSUlNX1NUUklORyB8IE1JSU1fU1VCTUVOVTsKLSAgICAgICAg
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5oU3ViTWVudSA9IHN1Yk1lbnUtPnBsYXRmb3JtRGVzY3Jp
cHRpb24oKTsKLSAgICB9IGVsc2UKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFz
ayB8PSBNSUlNX1NUUklORyB8IE1JSU1fSUQ7Ci0KLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24t
PmZUeXBlID0gTUZUX1NUUklORzsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPndJRCA9IGFj
dGlvbjsKLSAgICAKLSAgICBTdHJpbmcgdCA9IHRpdGxlOwotICAgIG1fcGxhdGZvcm1EZXNjcmlw
dGlvbi0+Y2NoID0gdC5sZW5ndGgoKTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlw
ZURhdGEgPSB3Y3NkdXAodC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKLX0KIAot
Q29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVJdGVtVHlwZSwgQ29u
dGV4dE1lbnVBY3Rpb24sIGNvbnN0IFN0cmluZyYsIGJvb2wsIGJvb2wpCi17Ci0gICAgLy8gRklY
TUU6IEltcGxlbWVudAotfQorICAgIGlmIChpbmZvLmZNYXNrICYgTUlJTV9JRCkKKyAgICAgICAg
bV9hY3Rpb24gPSBzdGF0aWNfY2FzdDxDb250ZXh0TWVudUFjdGlvbj4oaW5mby53SUQpOwogCi1D
b250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUFjdGlvbiwgY29uc3Qg
U3RyaW5nJiwgYm9vbCwgYm9vbCwgVmVjdG9yPENvbnRleHRNZW51SXRlbT4mKQotewotICAgIC8v
IEZJWE1FOiBJbXBsZW1lbnQKLX0KLQotQ29udGV4dE1lbnVJdGVtOjp+Q29udGV4dE1lbnVJdGVt
KCkKLXsKLSAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKSB7Ci0gICAgICAgIGlmIChtX3Bs
YXRmb3JtRGVzY3JpcHRpb24tPmZUeXBlID09IE1GVF9TVFJJTkcpCi0gICAgICAgICAgICBmcmVl
KG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZHdUeXBlRGF0YSk7Ci0gICAgICAgIGZyZWUobV9wbGF0
Zm9ybURlc2NyaXB0aW9uKTsKKyAgICBpZiAoKGluZm8uZk1hc2sgJiBNSUlNX1NVQk1FTlUpICYm
IGluZm8uaFN1Yk1lbnUpIHsKKyAgICAgICAgbV90eXBlID0gU3VibWVudVR5cGU7CisgICAgICAg
IG1fc3ViTWVudUl0ZW1zID0gQ29udGV4dE1lbnUoaW5mby5oU3ViTWVudSkuaXRlbXMoKTsKICAg
ICB9Ci19Ci0KLUxQTUVOVUlURU1JTkZPIENvbnRleHRNZW51SXRlbTo6cmVsZWFzZVBsYXRmb3Jt
RGVzY3JpcHRpb24oKQotewotICAgIExQTUVOVUlURU1JTkZPIGluZm8gPSBtX3BsYXRmb3JtRGVz
Y3JpcHRpb247Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gMDsKLSAgICByZXR1cm4gaW5m
bzsKLX0KLQotQ29udGV4dE1lbnVJdGVtVHlwZSBDb250ZXh0TWVudUl0ZW06OnR5cGUoKSBjb25z
dAotewotICAgIENvbnRleHRNZW51SXRlbVR5cGUgdHlwZSA9IEFjdGlvblR5cGU7Ci0gICAgaWYg
KCgobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSAmIH5NRlRfT1dORVJEUkFXKSA9PSBNRlRf
U1RSSU5HKSAmJiBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51KQotICAgICAgICB0eXBl
ID0gU3VibWVudVR5cGU7Ci0gICAgZWxzZSBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlw
ZSAmIE1GVF9TRVBBUkFUT1IpCi0gICAgICAgIHR5cGUgPSBTZXBhcmF0b3JUeXBlOwotCi0gICAg
cmV0dXJuIHR5cGU7Ci19Ci0KLUNvbnRleHRNZW51QWN0aW9uIENvbnRleHRNZW51SXRlbTo6YWN0
aW9uKCkgY29uc3QKLXsgCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENvbnRleHRNZW51QWN0aW9u
PihtX3BsYXRmb3JtRGVzY3JpcHRpb24tPndJRCk7Ci19Ci0KLVN0cmluZyBDb250ZXh0TWVudUl0
ZW06OnRpdGxlKCkgY29uc3QgCi17Ci0gICAgcmV0dXJuIFN0cmluZyhtX3BsYXRmb3JtRGVzY3Jp
cHRpb24tPmR3VHlwZURhdGEsIHdjc2xlbihtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURh
dGEpKTsKLX0KIAotUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gQ29udGV4dE1lbnVJdGVtOjpwbGF0
Zm9ybVN1Yk1lbnUoKSBjb25zdAotewotICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb24t
PmhTdWJNZW51OwotfQotCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VHlwZShDb250ZXh0TWVu
dUl0ZW1UeXBlIHR5cGUpCi17Ci0gICAgaWYgKHR5cGUgPT0gU2VwYXJhdG9yVHlwZSkKLSAgICAg
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSA9IE1GVF9TRVBBUkFUT1I7Ci0gICAgZWxz
ZQotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZUeXBlID0gTUZUX1NUUklORzsKLX0K
LQotdm9pZCBDb250ZXh0TWVudUl0ZW06OnNldEFjdGlvbihDb250ZXh0TWVudUFjdGlvbiBhY3Rp
b24pCi17Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT53SUQgPSBhY3Rpb247IAotfQotCi12
b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VGl0bGUoY29uc3QgU3RyaW5nJiB0aXRsZSkKLXsKLSAg
ICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVEYXRhKQotICAgICAgICBmcmVlKG1f
cGxhdGZvcm1EZXNjcmlwdGlvbi0+ZHdUeXBlRGF0YSk7Ci0gICAgCi0gICAgbV9wbGF0Zm9ybURl
c2NyaXB0aW9uLT5jY2ggPSB0aXRsZS5sZW5ndGgoKTsKLSAgICBTdHJpbmcgdGl0bGVDb3B5ID0g
dGl0bGU7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVEYXRhID0gd2NzZHVwKHRp
dGxlQ29weS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKKyAgICBpZiAoaW5mby5m
TWFzayAmIE1JSU1fU1RBVEUpIHsKKyAgICAgICAgbV9jaGVja2VkID0gaW5mby5mU3RhdGUgJiBN
RlNfQ0hFQ0tFRDsKKyAgICAgICAgbV9lbmFibGVkID0gIShpbmZvLmZTdGF0ZSAmIE1GU19ESVNB
QkxFRCk7CisgICAgfQogfQogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0U3ViTWVudShDb250
ZXh0TWVudSogc3ViTWVudSkKLXsKLSAgICBpZiAoc3ViTWVudS0+cGxhdGZvcm1EZXNjcmlwdGlv
bigpID09IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUpCi0gICAgICAgIHJldHVybjsK
LQotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51KQotICAgICAgICA6OkRl
c3Ryb3lNZW51KG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUpOwotCi0gICAgbV9wbGF0
Zm9ybURlc2NyaXB0aW9uLT5mTWFzayB8PSBNSUlNX1NVQk1FTlU7Ci0gICAgbV9wbGF0Zm9ybURl
c2NyaXB0aW9uLT5oU3ViTWVudSA9IHN1Yk1lbnUtPnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9u
KCk7Ci19CisvLyBDb250ZXh0TWVudUl0ZW06Om5hdGl2ZU1lbnVJdGVtIGRvZXNuJ3Qgc2V0IHRo
ZSBpbmZvLmR3VHlwZURhdGEuIFRoaXMgaXMKKy8vIGRvbmUgdG8gbWFrZSB0aGUgbGlmZXRpbWUg
aGFuZGxpbmcgb2YgdGhlIHJldHVybmVkIE1FTlVJVEVNSU5GTyBlYXNpZXIgb24KKy8vIGNhbGxl
cnMuIFRoZSBvbmx5IGNhbGxlciB0aGF0IHVzZXMgdGhlIHRpdGxlIGlzIENvbnRleHRNZW51Ojpu
YXRpdmVNZW51LAorLy8gc28gd2UganVzdCBzZXQgdGhlIHRpdGxlIHRoZXJlLgorTUVOVUlURU1J
TkZPIENvbnRleHRNZW51SXRlbTo6bmF0aXZlTWVudUl0ZW0oKSBjb25zdAoreworICAgIE1FTlVJ
VEVNSU5GTyBpbmZvID0gezB9OworICAgIGluZm8uY2JTaXplID0gc2l6ZW9mKE1FTlVJVEVNSU5G
Tyk7CisKKyAgICBpZiAobV90eXBlID09IFNlcGFyYXRvclR5cGUpIHsKKyAgICAgICAgaW5mby5m
TWFzayA9IE1JSU1fRlRZUEU7CisgICAgICAgIGluZm8uZlR5cGUgPSBNRlRfU0VQQVJBVE9SOwor
ICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CiAKLXZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRT
dWJNZW51KFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JikKLXsKLSAgICAvLyBGSVhNRTogSW1wbGVt
ZW50Ci19CisgICAgaW5mby5mTWFzayA9IE1JSU1fRlRZUEUgfCBNSUlNX0lEIHwgTUlJTV9TVEFU
RSB8IE1JSU1fU1VCTUVOVTsKKyAgICBpbmZvLmZUeXBlID0gTUZUX1NUUklORzsKIAotdm9pZCBD
b250ZXh0TWVudUl0ZW06OnNldENoZWNrZWQoYm9vbCBjaGVja2VkKQotewotICAgIG1fcGxhdGZv
cm1EZXNjcmlwdGlvbi0+Zk1hc2sgfD0gTUlJTV9TVEFURTsKLSAgICBpZiAoY2hlY2tlZCkgewot
ICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSAmPSB+TUZTX1VOQ0hFQ0tFRDsK
LSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgfD0gTUZTX0NIRUNLRUQ7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1G
U19DSEVDS0VEOwotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNf
VU5DSEVDS0VEOwotICAgIH0KLX0KKyAgICBpbmZvLndJRCA9IG1fYWN0aW9uOwogCi1ib29sIENv
bnRleHRNZW51SXRlbTo6Y2hlY2tlZCgpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUUgLSBJbXBsZW1l
bnQKLSAgICByZXR1cm4gZmFsc2U7Ci19CisgICAgaWYgKG1fdHlwZSA9PSBTdWJtZW51VHlwZSkK
KyAgICAgICAgaW5mby5oU3ViTWVudSA9IENvbnRleHRNZW51KG1fc3ViTWVudUl0ZW1zKS5uYXRp
dmVNZW51KCk7CiAKLXZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxl
ZCkKLXsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZNYXNrIHw9IE1JSU1fU1RBVEU7Ci0g
ICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUg
Jj0gfk1GU19ESVNBQkxFRDsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUg
fD0gTUZTX0VOQUJMRUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5mU3RhdGUgJj0gfk1GU19FTkFCTEVEOwotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRp
b24tPmZTdGF0ZSB8PSBNRlNfRElTQUJMRUQ7Ci0gICAgfQotfQorICAgIGluZm8uZlN0YXRlIHw9
IG1fZW5hYmxlZCA/IE1GU19FTkFCTEVEIDogTUZTX0RJU0FCTEVEOworICAgIGluZm8uZlN0YXRl
IHw9IG1fY2hlY2tlZCA/IE1GU19DSEVDS0VEIDogTUZTX1VOQ0hFQ0tFRDsKIAotYm9vbCBDb250
ZXh0TWVudUl0ZW06OmVuYWJsZWQoKSBjb25zdAotewotICAgIHJldHVybiAhKG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbi0+ZlN0YXRlICYgTUZTX0RJU0FCTEVEKTsKKyAgICByZXR1cm4gaW5mbzsKIH0K
IAogfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ29udGV4dE1lbnVXaW4uY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2luL0NvbnRleHRNZW51V2luLmNwcAkocmV2aXNp
b24gNzM1MzYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3dpbi9Db250ZXh0TWVudVdpbi5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJOb2RlLmgiCiAjaW5jbHVk
ZSA8dGNoYXIuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5o
PgogI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KIAogI2lmbmRlZiBNSUlNX0ZUWVBFCkBA
IC00MywxODAgKzQ0LDYwIEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotQ29udGV4dE1lbnU6
OkNvbnRleHRNZW51KCkKLSAgICA6IG1fcGxhdGZvcm1EZXNjcmlwdGlvbigwKQotI2lmIE9TKFdJ
TkNFKQotICAgICwgbV9pdGVtQ291bnQoMCkKLSNlbmRpZgotewotICAgIHNldFBsYXRmb3JtRGVz
Y3JpcHRpb24oOjpDcmVhdGVQb3B1cE1lbnUoKSk7Ci19Ci0KLUNvbnRleHRNZW51OjpDb250ZXh0
TWVudShjb25zdCBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBtZW51KQotICAgIDogbV9wbGF0Zm9y
bURlc2NyaXB0aW9uKDApCi0jaWYgT1MoV0lOQ0UpCi0gICAgLCBtX2l0ZW1Db3VudCgwKQotI2Vu
ZGlmCi17Ci0gICAgc2V0UGxhdGZvcm1EZXNjcmlwdGlvbihtZW51KTsKLX0KLQotQ29udGV4dE1l
bnU6On5Db250ZXh0TWVudSgpCi17Ci0gICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKLSAg
ICAgICAgOjpEZXN0cm95TWVudShtX3BsYXRmb3JtRGVzY3JpcHRpb24pOwotfQotCi11bnNpZ25l
ZCBDb250ZXh0TWVudTo6aXRlbUNvdW50KCkgY29uc3QKK0NvbnRleHRNZW51OjpDb250ZXh0TWVu
dShITUVOVSBtZW51KQogewotI2lmIE9TKFdJTkNFKQotICAgIHJldHVybiBtX2l0ZW1Db3VudDsK
LSNlbHNlCi0gICAgaWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVybiAw
OwotCi0gICAgcmV0dXJuIDo6R2V0TWVudUl0ZW1Db3VudChtX3BsYXRmb3JtRGVzY3JpcHRpb24p
OwotI2VuZGlmCi19Ci0KLSNpZiBPUyhXSU5DRSkKLXN0YXRpYyBib29sIGluc2VydE1lbnVJdGVt
KFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIG1lbnUsIHVuc2lnbmVkIGludCBwb3NpdGlvbiwgQ29u
dGV4dE1lbnVJdGVtJiBpdGVtKQotewotICAgIFVJTlQgZmxhZ3MgPSBNRl9CWVBPU0lUSU9OOwot
ICAgIFVJTlQgbmV3SXRlbSA9IDA7Ci0gICAgTFBDV1NUUiB0aXRsZSA9IDA7Ci0KLSAgICBpZiAo
aXRlbS50eXBlKCkgPT0gU2VwYXJhdG9yVHlwZSkKLSAgICAgICAgZmxhZ3MgfD0gTUZfU0VQQVJB
VE9SOwotICAgIGVsc2UgewotICAgICAgICBmbGFncyB8PSBNRl9TVFJJTkc7Ci0gICAgICAgIGZs
YWdzIHw9IGl0ZW0uY2hlY2tlZCgpID8gTUZfQ0hFQ0tFRCA6IE1GX1VOQ0hFQ0tFRDsKLSAgICAg
ICAgZmxhZ3MgfD0gaXRlbS5lbmFibGVkKCkgPyBNRl9FTkFCTEVEIDogTUZfR1JBWUVEOwotCi0g
ICAgICAgIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGl0ZW0ucmVs
ZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKTsKLSAgICAgICAgdGl0bGUgPSBkZXNjcmlwdGlvbi0+
ZHdUeXBlRGF0YTsKLSAgICAgICAgZGVzY3JpcHRpb24tPmR3VHlwZURhdGEgPSAwOwotCi0gICAg
ICAgIGlmIChkZXNjcmlwdGlvbi0+aFN1Yk1lbnUpIHsKLSAgICAgICAgICAgIGZsYWdzIHw9IE1G
X1BPUFVQOwotICAgICAgICAgICAgbmV3SXRlbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VUlOVD4oZGVz
Y3JpcHRpb24tPmhTdWJNZW51KTsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uLT5oU3ViTWVudSA9
IDA7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbmV3SXRlbSA9IGRlc2NyaXB0aW9uLT53
SUQ7Ci0KLSAgICAgICAgZnJlZShkZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIDo6
SW5zZXJ0TWVudVcobWVudSwgcG9zaXRpb24sIGZsYWdzLCBuZXdJdGVtLCB0aXRsZSk7Ci19Ci0j
ZW5kaWYKLQotdm9pZCBDb250ZXh0TWVudTo6aW5zZXJ0SXRlbSh1bnNpZ25lZCBpbnQgcG9zaXRp
b24sIENvbnRleHRNZW51SXRlbSYgaXRlbSkKLXsKLSAgICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlw
dGlvbikKKyAgICBpbnQgY291bnQgPSA6OkdldE1lbnVJdGVtQ291bnQobWVudSk7CisgICAgaWYg
KGNvdW50IDw9IDApCiAgICAgICAgIHJldHVybjsKIAotI2lmIE9TKFdJTkNFKQotICAgIGlmIChp
bnNlcnRNZW51SXRlbShtX3BsYXRmb3JtRGVzY3JpcHRpb24sIHBvc2l0aW9uLCBpdGVtKSkKLSAg
ICAgICAgKyttX2l0ZW1Db3VudDsKLSNlbHNlCi0gICAgOjpJbnNlcnRNZW51SXRlbShtX3BsYXRm
b3JtRGVzY3JpcHRpb24sIHBvc2l0aW9uLCBUUlVFLCBpdGVtLnJlbGVhc2VQbGF0Zm9ybURlc2Ny
aXB0aW9uKCkpOwotI2VuZGlmCi19Ci0KLXZvaWQgQ29udGV4dE1lbnU6OmFwcGVuZEl0ZW0oQ29u
dGV4dE1lbnVJdGVtJiBpdGVtKQotewotICAgIGluc2VydEl0ZW0oaXRlbUNvdW50KCksIGl0ZW0p
OwotfQotCi1zdGF0aWMgQ29udGV4dE1lbnVJdGVtKiBjb250ZXh0TWVudUl0ZW1CeUlkT3JQb3Np
dGlvbihITUVOVSBtZW51LCB1bnNpZ25lZCBpZCwgQk9PTCBieVBvc2l0aW9uKQotewotICAgIGlm
ICghbWVudSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgTFBNRU5VSVRFTUlORk8gaW5mbyA9IHN0
YXRpY19jYXN0PExQTUVOVUlURU1JTkZPPihtYWxsb2Moc2l6ZW9mKE1FTlVJVEVNSU5GTykpKTsK
LSAgICBpZiAoIWluZm8pCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgbWVtc2V0KGluZm8sIDAs
IHNpemVvZihNRU5VSVRFTUlORk8pKTsKLQotICAgIGluZm8tPmNiU2l6ZSA9IHNpemVvZihNRU5V
SVRFTUlORk8pOwotCi0gICAgLy8gU2V0dGluZyBNSUlNX0RBVEEgd2hpY2ggaXMgdXNlZnVsIGZv
ciBXZWJLaXQgY2xpZW50cyB3aG8gc3RvcmUgZGF0YSBpbiB0aGlzIG1lbWJlciBmb3IgdGhlaXIg
Y3VzdG9tIG1lbnUgaXRlbXMuCi0gICAgaW5mby0+Zk1hc2sgPSBNSUlNX0ZUWVBFIHwgTUlJTV9J
RCB8IE1JSU1fU1RSSU5HIHwgTUlJTV9EQVRBOwotCi0gICAgaWYgKCE6OkdldE1lbnVJdGVtSW5m
byhtZW51LCBpZCwgYnlQb3NpdGlvbiwgaW5mbykpIHsKLSAgICAgICAgZnJlZShpbmZvKTsKLSAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKGluZm8tPmZUeXBlICYgTUZUX1NUUklO
RykgewotICAgICAgICBMUFRTVFIgYnVmZmVyID0gc3RhdGljX2Nhc3Q8TFBUU1RSPihtYWxsb2Mo
KytpbmZvLT5jY2ggKiBzaXplb2YoVENIQVIpKSk7Ci0gICAgICAgIGlmICghYnVmZmVyKSB7Ci0g
ICAgICAgICAgICBmcmVlKGluZm8pOwotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgVUlOVCBpbmZvTWFzayA9
IE1JSU1fRlRZUEUgfCBNSUlNX0lEIHwgTUlJTV9TVFJJTkcgfCBNSUlNX1NUQVRFIHwgTUlJTV9T
VUJNRU5VOyAKKyAgICAgICAgTUVOVUlURU1JTkZPIGluZm8gPSB7MH07CisgICAgICAgIGluZm8u
Y2JTaXplID0gc2l6ZW9mKE1FTlVJVEVNSU5GTyk7CisgICAgICAgIGluZm8uZk1hc2sgPSBpbmZv
TWFzazsKKyAgICAgICAgaW5mby5kd1R5cGVEYXRhID0gMDsKKworICAgICAgICBpZiAoITo6R2V0
TWVudUl0ZW1JbmZvKG1lbnUsIGksIFRSVUUsICZpbmZvKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworCisgICAgICAgIGlmIChpbmZvLmZUeXBlID09IE1GVF9TRVBBUkFUT1IpIHsKKyAgICAgICAg
ICAgIG1faXRlbXMuYXBwZW5kKENvbnRleHRNZW51SXRlbShTZXBhcmF0b3JUeXBlLCBDb250ZXh0
TWVudUl0ZW1UYWdOb0FjdGlvbiwgU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOwog
ICAgICAgICB9Ci0gICAgICAgIGluZm8tPmR3VHlwZURhdGEgPSBidWZmZXI7Ci0gICAgICAgIDo6
R2V0TWVudUl0ZW1JbmZvKG1lbnUsIGlkLCBieVBvc2l0aW9uLCBpbmZvKTsKLSAgICB9CiAKLSAg
ICByZXR1cm4gbmV3IENvbnRleHRNZW51SXRlbShpbmZvKTsKLX0KKyAgICAgICAgaW50IG1lbnVT
dHJpbmdMZW5ndGggPSBpbmZvLmNjaCArIDE7CisgICAgICAgIE93bkFycmF5UHRyPFdDSEFSPiBt
ZW51U3RyaW5nKG5ldyBXQ0hBUlttZW51U3RyaW5nTGVuZ3RoXSk7CisgICAgICAgIGluZm8uZHdU
eXBlRGF0YSA9IG1lbnVTdHJpbmcuZ2V0KCk7CisgICAgICAgIGluZm8uY2NoID0gbWVudVN0cmlu
Z0xlbmd0aDsKIAotQ29udGV4dE1lbnVJdGVtKiBDb250ZXh0TWVudTo6aXRlbVdpdGhBY3Rpb24o
dW5zaWduZWQgYWN0aW9uKQotewotICAgIHJldHVybiBjb250ZXh0TWVudUl0ZW1CeUlkT3JQb3Np
dGlvbihtX3BsYXRmb3JtRGVzY3JpcHRpb24sIGFjdGlvbiwgRkFMU0UpOwotfQotCi1Db250ZXh0
TWVudUl0ZW0qIENvbnRleHRNZW51OjppdGVtQXRJbmRleCh1bnNpZ25lZCBpbmRleCwgY29uc3Qg
UGxhdGZvcm1NZW51RGVzY3JpcHRpb24gcGxhdGZvcm1EZXNjcmlwdGlvbikKLXsKLSAgICByZXR1
cm4gY29udGV4dE1lbnVJdGVtQnlJZE9yUG9zaXRpb24ocGxhdGZvcm1EZXNjcmlwdGlvbiwgaW5k
ZXgsIFRSVUUpOworICAgICAgICBpZiAoOjpHZXRNZW51SXRlbUluZm8obWVudSwgaSwgVFJVRSwg
JmluZm8pKQorICAgICAgICAgICBtX2l0ZW1zLmFwcGVuZChDb250ZXh0TWVudUl0ZW0oaW5mbykp
OworICAgIH0KIH0KIAotdm9pZCBDb250ZXh0TWVudTo6c2V0UGxhdGZvcm1EZXNjcmlwdGlvbihI
TUVOVSBtZW51KQorSE1FTlUgQ29udGV4dE1lbnU6Om5hdGl2ZU1lbnUoKSBjb25zdAogewotICAg
IGlmIChtZW51ID09IG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKLSAgICAgICAgcmV0dXJuOwotICAg
IAotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIDo6RGVzdHJveU1lbnUo
bV9wbGF0Zm9ybURlc2NyaXB0aW9uKTsKKyAgICBITUVOVSBtZW51ID0gOjpDcmVhdGVQb3B1cE1l
bnUoKTsKIAotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IG1lbnU7Ci0gICAgaWYgKCFtX3Bs
YXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVybjsKKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IG1faXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgQ29udGV4dE1lbnVJ
dGVtJiBpdGVtID0gbV9pdGVtc1tpXTsKIAotI2lmICFPUyhXSU5DRSkKLSAgICBNRU5VSU5GTyBt
ZW51SW5mbyA9IHswfTsKLSAgICBtZW51SW5mby5jYlNpemUgPSBzaXplb2YoTUVOVUlORk8pOwot
ICAgIG1lbnVJbmZvLmZNYXNrID0gTUlNX1NUWUxFOwotICAgIDo6R2V0TWVudUluZm8obV9wbGF0
Zm9ybURlc2NyaXB0aW9uLCAmbWVudUluZm8pOwotICAgIG1lbnVJbmZvLmZNYXNrID0gTUlNX1NU
WUxFOwotICAgIG1lbnVJbmZvLmR3U3R5bGUgfD0gTU5TX05PVElGWUJZUE9TOwotICAgIDo6U2V0
TWVudUluZm8obV9wbGF0Zm9ybURlc2NyaXB0aW9uLCAmbWVudUluZm8pOwotI2VuZGlmCi19Cisg
ICAgICAgIE1FTlVJVEVNSU5GTyBtZW51SXRlbSA9IGl0ZW0ubmF0aXZlTWVudUl0ZW0oKTsKIAot
SE1FTlUgQ29udGV4dE1lbnU6OnBsYXRmb3JtRGVzY3JpcHRpb24oKSBjb25zdAotewotICAgIHJl
dHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb247Ci19Ci0KLUhNRU5VIENvbnRleHRNZW51OjpyZWxl
YXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpCi17Ci0gICAgSE1FTlUgZGVzY3JpcHRpb24gPSBtX3Bs
YXRmb3JtRGVzY3JpcHRpb247Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gMDsKLSAgICBy
ZXR1cm4gZGVzY3JpcHRpb247Ci19CisgICAgICAgIC8vIENvbnRleHRNZW51SXRlbTo6bmF0aXZl
TWVudUl0ZW0gZG9lc24ndCBzZXQgdGhlIHRpdGxlIG9mIHRoZSBNRU5VSVRFTUlORk8gdG8gbWFr
ZSB0aGUKKyAgICAgICAgLy8gbGlmZXRpbWUgaGFuZGxpbmcgZWFzaWVyIGZvciBjYWxsZXJzLiBU
aGlzIGlzIHRoZSBvbmx5IGNhbGxlciB0aGF0IG5lZWRzIHRvIHNldCB0aGUgdGl0bGUsCisgICAg
ICAgIC8vIHNvIHNldCBpdCBoZXJlLgorICAgICAgICBTdHJpbmcgaXRlbVRpdGxlID0gaXRlbS50
aXRsZSgpOworICAgICAgICBpZiAoaXRlbS50eXBlKCkgIT0gU2VwYXJhdG9yVHlwZSkgeworICAg
ICAgICAgICAgbWVudUl0ZW0uZk1hc2sgfD0gTUlJTV9TVFJJTkc7CisgICAgICAgICAgICBtZW51
SXRlbS5jY2ggPSBpdGVtVGl0bGUubGVuZ3RoKCk7CisgICAgICAgICAgICBtZW51SXRlbS5kd1R5
cGVEYXRhID0gY29uc3RfY2FzdDxMUFdTVFI+KGl0ZW1UaXRsZS5jaGFyYWN0ZXJzV2l0aE51bGxU
ZXJtaW5hdGlvbigpKTsKKyAgICAgICAgfQogCi1WZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBjb250
ZXh0TWVudUl0ZW1WZWN0b3IoUGxhdGZvcm1NZW51RGVzY3JpcHRpb24pCi17Ci0gICAgLy8gRklY
TUUgLSBJbXBsZW1lbnQKLSAgICByZXR1cm4gVmVjdG9yPENvbnRleHRNZW51SXRlbT4oKTsKLX0K
KyAgICAgICAgOjpJbnNlcnRNZW51SXRlbShtZW51LCBpLCBUUlVFLCAmbWVudUl0ZW0pOworICAg
IH0KIAotUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gcGxhdGZvcm1NZW51RGVzY3JpcHRpb24oVmVj
dG9yPENvbnRleHRNZW51SXRlbT4mIG1lbnVJdGVtVmVjdG9yKQotewotICAgIC8vIEZJWE1FIC0g
SW1wbGVtZW50Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIG1lbnU7CiB9CiAKIH0gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYktpdDIvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YktpdDIvQ2hhbmdlTG9nCShyZXZpc2lvbiA3MzYzNCkKKysrIFdlYktpdDIvQ2hhbmdlTG9nCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjUgQEAKKzIwMTAtMTItMDkgIEJyaWFuIFdlaW5zdGVp
biAgPGJ3ZWluc3RlaW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFByZXAgZm9yIFdlYktpdDI6IENvbnRleHQgbWVudSBzdXBwb3J0
IG9uIFdpbmRvd3MKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTUwNTE0CisgICAgICAgIAorICAgICAgICBVcGRhdGUgV2ViS2l0MiB0byBjYWxsIHRoZSBj
b3JyZWN0IGNvZGUgd2hlbiBDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTIGlzIHNldC4KKwor
ICAgICAgICAqIFNoYXJlZC9XZWJDb250ZXh0TWVudUl0ZW1EYXRhLmNwcDoKKyAgICAgICAgKFdl
YktpdDo6V2ViQ29udGV4dE1lbnVJdGVtRGF0YTo6V2ViQ29udGV4dE1lbnVJdGVtRGF0YSk6IEFk
ZCBhIGJyYW5jaCBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCAKKyAgICAgICAgICAgIENST1NTX1BM
QVRGT1JNX0NPTlRFWFRfTUVOVVMgaXMgc2V0LgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViQ29y
ZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJD
b250ZXh0TWVudUNsaWVudDo6Y3VzdG9taXplTWVudSk6IERlZmluZSBkaWZmZXJlbnQgZnVuY3Rp
b25zIGJhc2VkIG9uCisgICAgICAgICAgICB3aGV0aGVyIG9yIG5vdCBDUk9TU19QTEFURk9STV9D
T05URVhUX01FTlVTLiBCb3RoIG9mIHRoZXNlIGFyZSBzdHVicywgc28gZnVuY3Rpb25hbGl0eQor
ICAgICAgICAgICAgZG9lc24ndCBuZWVkIHRvIGJlIHNoYXJlZC4KKyAgICAgICAgKiBXZWJQcm9j
ZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50Lmg6IERlZmluZSBkaWZmZXJl
bnQgZnVuY3Rpb25zIGJhc2VkIG9uCisgICAgICAgICAgICB3aGV0aGVyIG9yIG5vdCBDUk9TU19Q
TEFURk9STV9DT05URVhUX01FTlVTLiAKKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvV2Vi
Q29udGV4dE1lbnUuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJDb250ZXh0TWVudTo6c2hvdyk6
IEFkZCBhIGJyYW5jaCBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCAKKyAgICAgICAgICAgIENST1NT
X1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMgaXMgc2V0LgorCiAyMDEwLTEyLTA5ICBBbmRlcnMgQ2Fy
bHNzb24gIDxhbmRlcnNjYUBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgU2FtIFdl
aW5pZy4KSW5kZXg6IFdlYktpdDIvU2hhcmVkL1dlYkNvbnRleHRNZW51SXRlbURhdGEuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYktpdDIvU2hhcmVkL1dlYkNvbnRleHRNZW51SXRlbURhdGEuY3BwCShy
ZXZpc2lvbiA3MzUzNikKKysrIFdlYktpdDIvU2hhcmVkL1dlYkNvbnRleHRNZW51SXRlbURhdGEu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MywxMyArNjMsMTcgQEAgV2ViQ29udGV4dE1lbnVJdGVt
RGF0YTo6V2ViQ29udGV4dE1lbnVJdAogewogfQogCi1XZWJDb250ZXh0TWVudUl0ZW1EYXRhOjpX
ZWJDb250ZXh0TWVudUl0ZW1EYXRhKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbSYgaXRlbSwgV2Vi
Q29yZTo6Q29udGV4dE1lbnUqIG1lbnUpCitXZWJDb250ZXh0TWVudUl0ZW1EYXRhOjpXZWJDb250
ZXh0TWVudUl0ZW1EYXRhKGNvbnN0IFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbSYgaXRlbSwgV2Vi
Q29yZTo6Q29udGV4dE1lbnUqIG1lbnUpCiAgICAgOiBtX3R5cGUoaXRlbS50eXBlKCkpCiAgICAg
LCBtX2FjdGlvbihpdGVtLmFjdGlvbigpKQogICAgICwgbV90aXRsZShpdGVtLnRpdGxlKCkpCiB7
CiAgICAgaWYgKG1fdHlwZSA9PSBXZWJDb3JlOjpTdWJtZW51VHlwZSkgeworI2lmIFVTRShDUk9T
U19QTEFURk9STV9DT05URVhUX01FTlVTKQorICAgICAgICBjb25zdCBWZWN0b3I8V2ViQ29yZTo6
Q29udGV4dE1lbnVJdGVtPiYgY29yZVN1Ym1lbnUgPSBpdGVtLnN1Yk1lbnVJdGVtcygpOworI2Vs
c2UKICAgICAgICAgVmVjdG9yPFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbT4gY29yZVN1Ym1lbnUg
PSBXZWJDb3JlOjpjb250ZXh0TWVudUl0ZW1WZWN0b3IoaXRlbS5wbGF0Zm9ybVN1Yk1lbnUoKSk7
CisjZW5kaWYKICAgICAgICAgbV9zdWJtZW51ID0ga2l0SXRlbXMoY29yZVN1Ym1lbnUsIG1lbnUp
OwogICAgIH0KICAgICAKQEAgLTEzMCw3ICsxMzQsNyBAQCBib29sIFdlYkNvbnRleHRNZW51SXRl
bURhdGE6OmRlY29kZShDb3JlCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLVZlY3RvcjxXZWJDb250
ZXh0TWVudUl0ZW1EYXRhPiBraXRJdGVtcyhWZWN0b3I8V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVt
PiYgY29yZUl0ZW1WZWN0b3IsIFdlYkNvcmU6OkNvbnRleHRNZW51KiBtZW51KQorVmVjdG9yPFdl
YkNvbnRleHRNZW51SXRlbURhdGE+IGtpdEl0ZW1zKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpDb250
ZXh0TWVudUl0ZW0+JiBjb3JlSXRlbVZlY3RvciwgV2ViQ29yZTo6Q29udGV4dE1lbnUqIG1lbnUp
CiB7CiAgICAgVmVjdG9yPFdlYkNvbnRleHRNZW51SXRlbURhdGE+IHJlc3VsdDsKICAgICByZXN1
bHQucmVzZXJ2ZUNhcGFjaXR5KGNvcmVJdGVtVmVjdG9yLnNpemUoKSk7CkluZGV4OiBXZWJLaXQy
L1NoYXJlZC9XZWJDb250ZXh0TWVudUl0ZW1EYXRhLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Mi9T
aGFyZWQvV2ViQ29udGV4dE1lbnVJdGVtRGF0YS5oCShyZXZpc2lvbiA3MzUzNikKKysrIFdlYktp
dDIvU2hhcmVkL1dlYkNvbnRleHRNZW51SXRlbURhdGEuaAkod29ya2luZyBjb3B5KQpAQCAtNDUs
NyArNDUsNyBAQCBjbGFzcyBBUElPYmplY3Q7CiBjbGFzcyBXZWJDb250ZXh0TWVudUl0ZW1EYXRh
IHsKIHB1YmxpYzoKICAgICBXZWJDb250ZXh0TWVudUl0ZW1EYXRhKCk7Ci0gICAgV2ViQ29udGV4
dE1lbnVJdGVtRGF0YShXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW0mLCBXZWJDb3JlOjpDb250ZXh0
TWVudSogbWVudSk7CisgICAgV2ViQ29udGV4dE1lbnVJdGVtRGF0YShjb25zdCBXZWJDb3JlOjpD
b250ZXh0TWVudUl0ZW0mLCBXZWJDb3JlOjpDb250ZXh0TWVudSogbWVudSk7CiAgICAgV2ViQ29u
dGV4dE1lbnVJdGVtRGF0YShXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UeXBlLCBXZWJDb3JlOjpD
b250ZXh0TWVudUFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgYm9vbCBlbmFibGVkLCBib29s
IGNoZWNrZWQpOwogICAgIFdlYkNvbnRleHRNZW51SXRlbURhdGEoV2ViQ29yZTo6Q29udGV4dE1l
bnVBY3Rpb24sIGNvbnN0IFN0cmluZyYgdGl0bGUsIGJvb2wgZW5hYmxlZCwgY29uc3QgVmVjdG9y
PFdlYkNvbnRleHRNZW51SXRlbURhdGE+JiBzdWJtZW51KTsKIApAQCAtNzQsNyArNzQsNyBAQCBw
cml2YXRlOgogICAgIFJlZlB0cjxBUElPYmplY3Q+IG1fdXNlckRhdGE7CiB9OwogCi1WZWN0b3I8
V2ViQ29udGV4dE1lbnVJdGVtRGF0YT4ga2l0SXRlbXMoVmVjdG9yPFdlYkNvcmU6OkNvbnRleHRN
ZW51SXRlbT4mLCBXZWJDb3JlOjpDb250ZXh0TWVudSopOworVmVjdG9yPFdlYkNvbnRleHRNZW51
SXRlbURhdGE+IGtpdEl0ZW1zKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW0+
JiwgV2ViQ29yZTo6Q29udGV4dE1lbnUqKTsKIFZlY3RvcjxXZWJDb3JlOjpDb250ZXh0TWVudUl0
ZW0+IGNvcmVJdGVtcyhjb25zdCBWZWN0b3I8V2ViQ29udGV4dE1lbnVJdGVtRGF0YT4mKTsKIAog
fSAvLyBuYW1lc3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1
cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdDIvV2Vi
UHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5jcHAJKHJldmlzaW9u
IDczNTM2KQorKysgV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRN
ZW51Q2xpZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDEsMTEgKzQxLDE5IEBAIHZvaWQgV2Vi
Q29udGV4dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51RGUKICAgICBkZWxldGUgdGhpczsKIH0KIAor
I2lmIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQorUGFzc093blB0cjxDb250ZXh0
TWVudT4gV2ViQ29udGV4dE1lbnVDbGllbnQ6OmN1c3RvbWl6ZU1lbnUoUGFzc093blB0cjxDb250
ZXh0TWVudT4gbWVudSkKK3sKKyAgICAvLyBXZWJLaXQyIGlnbm9yZXMgdGhpcyBjbGllbnQgY2Fs
bGJhY2sgYW5kIGRvZXMgY29udGV4dCBtZW51IGN1c3RvbWl6YXRpb24gd2hlbiBpdCBpcyB0b2xk
IHRvIHNob3cgdGhlIG1lbnUuCisgICAgcmV0dXJuIG1lbnU7Cit9CisjZWxzZQogUGxhdGZvcm1N
ZW51RGVzY3JpcHRpb24gV2ViQ29udGV4dE1lbnVDbGllbnQ6OmdldEN1c3RvbU1lbnVGcm9tRGVm
YXVsdEl0ZW1zKENvbnRleHRNZW51KiBtZW51KQogewogICAgIC8vIFdlYktpdDIgaWdub3JlcyB0
aGlzIGNsaWVudCBjYWxsYmFjayBhbmQgZG9lcyBjb250ZXh0IG1lbnUgY3VzdG9taXphdGlvbiB3
aGVuIGl0IGlzIHRvbGQgdG8gc2hvdyB0aGUgbWVudS4KICAgICByZXR1cm4gbWVudS0+cGxhdGZv
cm1EZXNjcmlwdGlvbigpOwogfQorI2VuZGlmCiAKIHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6
OmNvbnRleHRNZW51SXRlbVNlbGVjdGVkKENvbnRleHRNZW51SXRlbSosIGNvbnN0IENvbnRleHRN
ZW51KikKIHsKSW5kZXg6IFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJDb250
ZXh0TWVudUNsaWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3Jl
U3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oCShyZXZpc2lvbiA3MzUzNikKKysrIFdlYktp
dDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC00Miw3ICs0MiwxMSBAQCBwdWJsaWM6CiBwcml2YXRlOgogICAgIHZpcnR1
YWwgdm9pZCBjb250ZXh0TWVudURlc3Ryb3llZCgpOwogICAgIAorI2lmIFVTRShDUk9TU19QTEFU
Rk9STV9DT05URVhUX01FTlVTKQorICAgIHZpcnR1YWwgUGFzc093blB0cjxXZWJDb3JlOjpDb250
ZXh0TWVudT4gY3VzdG9taXplTWVudShQYXNzT3duUHRyPFdlYkNvcmU6OkNvbnRleHRNZW51Pik7
CisjZWxzZQogICAgIHZpcnR1YWwgV2ViQ29yZTo6UGxhdGZvcm1NZW51RGVzY3JpcHRpb24gZ2V0
Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMoV2ViQ29yZTo6Q29udGV4dE1lbnUqKTsKKyNlbmRp
ZgogICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudUl0ZW1TZWxlY3RlZChXZWJDb3JlOjpDb250
ZXh0TWVudUl0ZW0qLCBjb25zdCBXZWJDb3JlOjpDb250ZXh0TWVudSopOwogICAgIAogICAgIHZp
cnR1YWwgdm9pZCBkb3dubG9hZFVSTChjb25zdCBXZWJDb3JlOjpLVVJMJiB1cmwpOwpJbmRleDog
V2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViQ29udGV4dE1lbnUuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYkNvbnRleHRNZW51LmNwcAkocmV2aXNp
b24gNzM1MzYpCisrKyBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJDb250ZXh0TWVudS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTY0LDcgKzY0LDExIEBAIHZvaWQgV2ViQ29udGV4dE1lbnU6
OnNob3coKQogICAgICAgICByZXR1cm47CiAKICAgICAvLyBHaXZlIHRoZSBidW5kbGUgY2xpZW50
IGEgY2hhbmNlIHRvIHByb2Nlc3MgdGhlIG1lbnUuCisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NP
TlRFWFRfTUVOVVMpCisgICAgY29uc3QgVmVjdG9yPENvbnRleHRNZW51SXRlbT4mIGNvcmVJdGVt
cyA9IG1lbnUtPml0ZW1zKCk7CisjZWxzZQogICAgIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+IGNv
cmVJdGVtcyA9IGNvbnRleHRNZW51SXRlbVZlY3RvcihtZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9u
KCkpOworI2VuZGlmCiAgICAgVmVjdG9yPFdlYkNvbnRleHRNZW51SXRlbURhdGE+IHByb3Bvc2Vk
TWVudSA9IGtpdEl0ZW1zKGNvcmVJdGVtcywgbWVudSk7CiAgICAgVmVjdG9yPFdlYkNvbnRleHRN
ZW51SXRlbURhdGE+IG5ld01lbnU7CiAgICAgUmVmUHRyPEFQSU9iamVjdD4gdXNlckRhdGE7Cklu
ZGV4OiBXZWJLaXQvd2luL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL0NoYW5n
ZUxvZwkocmV2aXNpb24gNzM2MzQpCisrKyBXZWJLaXQvd2luL0NoYW5nZUxvZwkod29ya2luZyBj
b3B5KQpAQCAtMSwzICsxLDIzIEBACisyMDEwLTEyLTA5ICBCcmlhbiBXZWluc3RlaW4gIDxid2Vp
bnN0ZWluQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBQcmVwIGZvciBXZWJLaXQyOiBDb250ZXh0IG1lbnUgc3VwcG9ydCBvbiBXaW5k
b3dzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01MDUx
NAorICAgICAgICAKKyAgICAgICAgVXBkYXRlIFdlYktpdCBmb3IgdGhlIG5ldyBDUk9TU19QTEFU
Rk9STV9DT05URVhUX01FTlVTIGZsYWcsIGFuZCBkZWZpbmUgY3VzdG9taXplTWVudQorICAgICAg
ICBpbnN0ZWFkIG9mIGdldEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0ZW1zLgorCisgICAgICAgICog
V2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuY3BwOgorICAgICAgICAoV2ViQ29u
dGV4dE1lbnVDbGllbnQ6OmN1c3RvbWl6ZU1lbnUpOiBnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJ
dGVtcyB3YXMgdHVybmVkIGludG8KKyAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24sIHdpdGggcmVm
YWN0b3JpbmcgdXNpbmcgbmF0aXZlTWVudSBpbnN0ZWFkIG9mIHBsYXRmb3JtRGVzY3JpcHRpb24u
CisgICAgICAgIChXZWJDb250ZXh0TWVudUNsaWVudDo6Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQp
OiAgVXNlIG5hdGl2ZU1lbnUgaW5zdGVhZCBvZiBwbGF0Zm9ybURlc2NyaXB0aW9uLgorICAgICAg
ICAqIFdlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50Lmg6CisgICAgICAgICogV2Vi
Vmlldy5jcHA6CisgICAgICAgIChXZWJWaWV3OjpoYW5kbGVDb250ZXh0TWVudUV2ZW50KTogQ2Fs
bCBuYXRpdmVNZW51IGluc3RlYWQgb2YgcGxhdGZvcm1EZXNjcmlwdGlvbi4KKyAgICAgICAgKFdl
YlZpZXc6OnBlcmZvcm1Db250ZXh0TWVudUFjdGlvbik6IE9ubHkgY2FsbCBpdGVtQXRJbmRleCB3
aXRoIG9uZSBhcmd1bWVudCwgbm8gbmVlZAorICAgICAgICAgICAgZm9yIHRoZSBzZWNvbmQuCisK
IDIwMTAtMTItMDcgIEJyaWFuIFdlaW5zdGVpbiAgPGJ3ZWluc3RlaW5AYXBwbGUuY29tPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IEpvaG4gU3VsbGl2YW4uCkluZGV4OiBXZWJLaXQvd2luL1dlYlZp
ZXcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViVmlldy5jcHAJKHJldmlzaW9uIDcz
NTM2KQorKysgV2ViS2l0L3dpbi9XZWJWaWV3LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTI3NSwx
MiArMTI3NSwxMiBAQCBib29sIFdlYlZpZXc6OmhhbmRsZUNvbnRleHRNZW51RXZlbnQoV1BBCiAg
ICAgICAgIG1fdWlEZWxlZ2F0ZS0+aGFzQ3VzdG9tTWVudUltcGxlbWVudGF0aW9uKCZoYXNDdXN0
b21NZW51cyk7CiAKICAgICBpZiAoaGFzQ3VzdG9tTWVudXMpCi0gICAgICAgIG1fdWlEZWxlZ2F0
ZS0+dHJhY2tDdXN0b21Qb3B1cE1lbnUoKElXZWJWaWV3Kil0aGlzLCAoT0xFX0hBTkRMRSkoVUxP
Tkc2NCljb3JlTWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpLCAmcG9pbnQpOworICAgICAgICBt
X3VpRGVsZWdhdGUtPnRyYWNrQ3VzdG9tUG9wdXBNZW51KChJV2ViVmlldyopdGhpcywgKE9MRV9I
QU5ETEUpKFVMT05HNjQpY29yZU1lbnUtPm5hdGl2ZU1lbnUoKSwgJnBvaW50KTsKICAgICBlbHNl
IHsKICAgICAgICAgLy8gU3VycHJpc2luZ2x5LCBUUE1fUklHSFRCVVRUT04gbWVhbnMgdGhhdCBp
dGVtcyBhcmUgc2VsZWN0YWJsZSB3aXRoIGVpdGhlciB0aGUgcmlnaHQgT1IgbGVmdCBtb3VzZSBi
dXR0b24KICAgICAgICAgVUlOVCBmbGFncyA9IFRQTV9SSUdIVEJVVFRPTiB8IFRQTV9UT1BBTElH
TiB8IFRQTV9WRVJQT1NBTklNQVRJT04gfCBUUE1fSE9SSVpPTlRBTAogICAgICAgICAgICAgfCBU
UE1fTEVGVEFMSUdOIHwgVFBNX0hPUlBPU0FOSU1BVElPTjsKLSAgICAgICAgOjpUcmFja1BvcHVw
TWVudUV4KGNvcmVNZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCksIGZsYWdzLCBwb2ludC54LCBw
b2ludC55LCBtX3ZpZXdXaW5kb3csIDApOworICAgICAgICA6OlRyYWNrUG9wdXBNZW51RXgoY29y
ZU1lbnUtPm5hdGl2ZU1lbnUoKSwgZmxhZ3MsIHBvaW50LngsIHBvaW50LnksIG1fdmlld1dpbmRv
dywgMCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CkBAIC0xMzU1LDExICsxMzU1LDEwIEBA
IHZvaWQgV2ViVmlldzo6cGVyZm9ybUNvbnRleHRNZW51QWN0aW9uKFcKICAgICBDb250ZXh0TWVu
dSogbWVudSA9IG1fcGFnZS0+Y29udGV4dE1lbnVDb250cm9sbGVyKCktPmNvbnRleHRNZW51KCk7
CiAgICAgQVNTRVJUKG1lbnUpOwogCi0gICAgQ29udGV4dE1lbnVJdGVtKiBpdGVtID0gYnlQb3Np
dGlvbiA/IG1lbnUtPml0ZW1BdEluZGV4KCh1bnNpZ25lZCl3UGFyYW0sIChITUVOVSlsUGFyYW0p
IDogbWVudS0+aXRlbVdpdGhBY3Rpb24oKENvbnRleHRNZW51QWN0aW9uKXdQYXJhbSk7CisgICAg
Q29udGV4dE1lbnVJdGVtKiBpdGVtID0gYnlQb3NpdGlvbiA/IG1lbnUtPml0ZW1BdEluZGV4KCh1
bnNpZ25lZCl3UGFyYW0pIDogbWVudS0+aXRlbVdpdGhBY3Rpb24oKENvbnRleHRNZW51QWN0aW9u
KXdQYXJhbSk7CiAgICAgaWYgKCFpdGVtKQogICAgICAgICByZXR1cm47CiAgICAgbV9wYWdlLT5j
b250ZXh0TWVudUNvbnRyb2xsZXIoKS0+Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQoaXRlbSk7Ci0g
ICAgZGVsZXRlIGl0ZW07CiB9CiAKIGJvb2wgV2ViVmlldzo6aGFuZGxlTW91c2VFdmVudChVSU5U
IG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCkluZGV4OiBXZWJLaXQvd2lu
L1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmNwcAkocmV2aXNp
b24gNzM1MzYpCisrKyBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xp
ZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTUsMjEgKzU1LDI3IEBAIHZvaWQgV2ViQ29udGV4
dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51RGUKICAgICBkZWxldGUgdGhpczsKIH0KIAotSE1FTlUg
V2ViQ29udGV4dE1lbnVDbGllbnQ6OmdldEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0ZW1zKENvbnRl
eHRNZW51KiBtZW51KQorUGFzc093blB0cjxDb250ZXh0TWVudT4gV2ViQ29udGV4dE1lbnVDbGll
bnQ6OmN1c3RvbWl6ZU1lbnUoUGFzc093blB0cjxDb250ZXh0TWVudT4gcG9wTWVudSkKIHsKKyAg
ICBPd25QdHI8Q29udGV4dE1lbnU+IG1lbnUgPSBwb3BNZW51OworCiAgICAgQ09NUHRyPElXZWJV
SURlbGVnYXRlPiB1aURlbGVnYXRlOwogICAgIGlmIChGQUlMRUQobV93ZWJWaWV3LT51aURlbGVn
YXRlKCZ1aURlbGVnYXRlKSkpCi0gICAgICAgIHJldHVybiBtZW51LT5wbGF0Zm9ybURlc2NyaXB0
aW9uKCk7CisgICAgICAgIHJldHVybiBtZW51LnJlbGVhc2UoKTsKIAogICAgIEFTU0VSVCh1aURl
bGVnYXRlKTsKIAotICAgIEhNRU5VIG5ld01lbnUgPSAwOworICAgIEhNRU5VIG5hdGl2ZU1lbnUg
PSBtZW51LT5uYXRpdmVNZW51KCk7CiAgICAgQ09NUHRyPFdlYkVsZW1lbnRQcm9wZXJ0eUJhZz4g
cHJvcGVydHlCYWc7CiAgICAgcHJvcGVydHlCYWcuYWRvcHRSZWYoV2ViRWxlbWVudFByb3BlcnR5
QmFnOjpjcmVhdGVJbnN0YW5jZShtX3dlYlZpZXctPnBhZ2UoKS0+Y29udGV4dE1lbnVDb250cm9s
bGVyKCktPmhpdFRlc3RSZXN1bHQoKSkpOwogICAgIC8vIEZJWE1FOiBXZSBuZWVkIHRvIGRlY2lk
ZSB3aGV0aGVyIHRvIGRvIHRoZSBkZWZhdWx0IGJlZm9yZSBjYWxsaW5nIHRoaXMgZGVsZWdhdGUg
bWV0aG9kCi0gICAgaWYgKEZBSUxFRCh1aURlbGVnYXRlLT5jb250ZXh0TWVudUl0ZW1zRm9yRWxl
bWVudChtX3dlYlZpZXcsIHByb3BlcnR5QmFnLmdldCgpLCAoT0xFX0hBTkRMRSkoVUxPTkc2NClt
ZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCksIChPTEVfSEFORExFKikmbmV3TWVudSkpKQotICAg
ICAgICByZXR1cm4gbWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpOwotICAgIHJldHVybiBuZXdN
ZW51OworICAgIGlmIChGQUlMRUQodWlEZWxlZ2F0ZS0+Y29udGV4dE1lbnVJdGVtc0ZvckVsZW1l
bnQobV93ZWJWaWV3LCBwcm9wZXJ0eUJhZy5nZXQoKSwgKE9MRV9IQU5ETEUpKFVMT05HNjQpbmF0
aXZlTWVudSwgKE9MRV9IQU5ETEUqKSZuYXRpdmVNZW51KSkpCisgICAgICAgIHJldHVybiBtZW51
LnJlbGVhc2UoKTsKKyAgICAKKyAgICBPd25QdHI8Q29udGV4dE1lbnU+IGN1c3RvbWl6ZWRNZW51
ID0gYWRvcHRQdHIobmV3IENvbnRleHRNZW51KG5hdGl2ZU1lbnUpKTsKKyAgICA6OkRlc3Ryb3lN
ZW51KG5hdGl2ZU1lbnUpOworCisgICAgcmV0dXJuIGN1c3RvbWl6ZWRNZW51LnJlbGVhc2UoKTsK
IH0KIAogdm9pZCBXZWJDb250ZXh0TWVudUNsaWVudDo6Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQo
Q29udGV4dE1lbnVJdGVtKiBpdGVtLCBjb25zdCBDb250ZXh0TWVudSogcGFyZW50TWVudSkKQEAg
LTg0LDggKzkwLDE2IEBAIHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51SXQK
IAogICAgIENPTVB0cjxXZWJFbGVtZW50UHJvcGVydHlCYWc+IHByb3BlcnR5QmFnOwogICAgIHBy
b3BlcnR5QmFnLmFkb3B0UmVmKFdlYkVsZW1lbnRQcm9wZXJ0eUJhZzo6Y3JlYXRlSW5zdGFuY2Uo
bV93ZWJWaWV3LT5wYWdlKCktPmNvbnRleHRNZW51Q29udHJvbGxlcigpLT5oaXRUZXN0UmVzdWx0
KCkpKTsKLSAgICAgICAgICAgIAotICAgIHVpRGVsZWdhdGUtPmNvbnRleHRNZW51SXRlbVNlbGVj
dGVkKG1fd2ViVmlldywgaXRlbS0+cmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKSwgcHJvcGVy
dHlCYWcuZ2V0KCkpOworCisgICAgLy8gVGhpcyBjYWxsIHdvdWxkIGxlYWsgdGhlIE1FTlVJVEVN
SU5GTydzIHN1Yk1lbnUgaWYgaXQgaGFkIG9uZSwgYnV0IG9uIFdpbmRvd3MsIHN1Yk1lbnVzIGNh
bid0IGJlIHNlbGVjdGVkLCBzbyB0aGVyZSBpcworICAgIC8vIG5vIHdheSB3ZSB3b3VsZCBnZXQg
dG8gdGhpcyBwb2ludC4KKyAgICBBU1NFUlQoaXRlbS0+dHlwZSgpICE9IFN1Ym1lbnVUeXBlICYm
IGl0ZW0tPnR5cGUoKSAhPSBTZXBhcmF0b3JUeXBlKTsKKworICAgIC8vIENvbnRleHRNZW51SXRl
bTo6bmF0aXZlTWVudUl0ZW0gZG9lc24ndCBzZXQgdGhlIGR3VHlwZURhdGEgb2YgdGhlIE1FTlVJ
VEVNSU5GTywgYnV0IG5vIFdlYktpdCBjbGllbnRzCisgICAgLy8gdXNlIHRoZSB0aXRsZSBpbiBJ
V2ViVUlEZWxlZ2F0ZTo6Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQsIHNvIHdlIGRvbid0IG5lZWQg
dG8gcG9wdWxhdGUgaXQgaGVyZS4KKyAgICBNRU5VSVRFTUlORk8gc2VsZWN0ZWRJdGVtID0gaXRl
bS0+bmF0aXZlTWVudUl0ZW0oKTsKKworICAgIHVpRGVsZWdhdGUtPmNvbnRleHRNZW51SXRlbVNl
bGVjdGVkKG1fd2ViVmlldywgJnNlbGVjdGVkSXRlbSwgcHJvcGVydHlCYWcuZ2V0KCkpOwogfQog
CiB2b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50Ojpkb3dubG9hZFVSTChjb25zdCBLVVJMJiB1cmwp
CkluZGV4OiBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNs
aWVudC5oCShyZXZpc2lvbiA3MzUzNikKKysrIFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2Vi
Q29udGV4dE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMjMsOCArMjMsMTAgQEAKICAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAogICovCiAKKyNpbmNsdWRlIDxXZWJDb3JlL0NvbnRleHRNZW51Lmg+CiAj
aW5jbHVkZSA8V2ViQ29yZS9Db250ZXh0TWVudUNsaWVudC5oPgogI2luY2x1ZGUgPHd0Zi9Gb3J3
YXJkLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KIAogY2xhc3MgV2ViVmlldzsKIApA
QCAtMzQsNyArMzYsNyBAQCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIHZvaWQgY29udGV4dE1lbnVE
ZXN0cm95ZWQoKTsKIAotICAgIHZpcnR1YWwgSE1FTlUgZ2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0
SXRlbXMoV2ViQ29yZTo6Q29udGV4dE1lbnUqKTsKKyAgICB2aXJ0dWFsIFBhc3NPd25QdHI8V2Vi
Q29yZTo6Q29udGV4dE1lbnU+IGN1c3RvbWl6ZU1lbnUoUGFzc093blB0cjxXZWJDb3JlOjpDb250
ZXh0TWVudT4pOwogICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudUl0ZW1TZWxlY3RlZChXZWJD
b3JlOjpDb250ZXh0TWVudUl0ZW0qLCBjb25zdCBXZWJDb3JlOjpDb250ZXh0TWVudSopOwogICAg
IAogICAgIHZpcnR1YWwgdm9pZCBkb3dubG9hZFVSTChjb25zdCBXZWJDb3JlOjpLVVJMJik7Cg==
</data>
<flag name="review"
          id="67037"
          type_id="1"
          status="-"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76224</attachid>
            <date>2010-12-10 11:31:08 -0800</date>
            <delta_ts>2010-12-14 01:25:22 -0800</delta_ts>
            <desc>[PATCH] Adam&apos;s Comments + Platform.h</desc>
            <filename>context_menu_refactoring_win.patch</filename>
            <type>text/plain</type>
            <size>47700</size>
            <attacher name="Brian Weinstein">bweinstein</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDczNzQyKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTEgQEAKKzIwMTAtMTItMTAgIEJyaWFuIFdl
aW5zdGVpbiAgPGJ3ZWluc3RlaW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFR1cm4gb24gVVNFKENST1NTX1BMQVRGT1JNX0NPTlRF
WFRfTUVOVVMpIGZvciBXaW5kb3dzLgorCisgICAgICAgICogd3RmL1BsYXRmb3JtLmg6CisKIDIw
MTAtMTItMTAgIFBhdHJpY2sgR2Fuc3RlcmVyICA8cGFyb2dhQHdlYmtpdC5vcmc+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlkZWwuCkluZGV4OiBKYXZhU2NyaXB0Q29yZS93dGYvUGxh
dGZvcm0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvUGxhdGZvcm0uaAkocmV2
aXNpb24gNzM2NjIpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvUGxhdGZvcm0uaAkod29ya2luZyBj
b3B5KQpAQCAtMTEwNiw2ICsxMTA2LDEwIEBACiAjZGVmaW5lIFdURl9VU0VfUExBVEZPUk1fU1RS
QVRFR0lFUyAxCiAjZW5kaWYKIAorI2lmIFBMQVRGT1JNKFdJTikKKyNkZWZpbmUgV1RGX1VTRV9D
Uk9TU19QTEFURk9STV9DT05URVhUX01FTlVTIDEKKyNlbmRpZgorCiAvKiBHZW9sb2NhdGlvbiBy
ZXF1ZXN0IHBvbGljeS4gcHJlLWVtcHRpdmUgcG9saWN5IGlzIHRvIGFjcXVpcmUgdXNlciBwZXJt
aXNzaW9uIGJlZm9yZSBhY3F1aXJpbmcgbG9jYXRpb24uCiAgICBDbGllbnQgYmFzZWQgaW1wbGVt
ZW50YXRpb25zIHdpbGwgaGF2ZSBvcHRpb24gdG8gY2hvb3NlIGJldHdlZW4gcHJlLWVtcHRpdmUg
YW5kIG5vbnByZS1lbXB0aXZlIHBlcm1pc3Npb24gcG9saWN5LgogICAgcHJlLWVtcHRpdmUgcGVy
bWlzc2lvbiBwb2xpY3kgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBhbGwgY2xpZW50LWJhc2Vk
IGltcGxlbWVudGF0aW9ucy4gKi8KSW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvQ2hhbmdlTG9nCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzUgQEAKKzIwMTAtMTItMDkgIEJyaWFuIFdl
aW5zdGVpbiAgPGJ3ZWluc3RlaW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFByZXAgZm9yIFdlYktpdDI6IENvbnRleHQgbWVudSBz
dXBwb3J0IG9uIFdpbmRvd3MKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTUwNTE0CisgICAgICAgIAorICAgICAgICBCZWZvcmUgdGhpcyBwYXRjaCBDb250
ZXh0TWVudSBvbiBXaW5kb3dzIHdlcmUgYmFja2VkIGJ5IEhNRU5VcywgYW5kIENvbnRleHRNZW51
SXRlbXMKKyAgICAgICAgd2VyZSBiYWNrZWQgYnkgTUVOVUlURU1JTkZPcy4gVGhpcyBtZWFudCB0
aGV5IGNvdWxkbid0IGJlIGNvcGllZCwgYW5kIHRoZXkgbmVlZGVkIHRvCisgICAgICAgIGJlIHRv
IHdvcmsgaW4gV2ViS2l0Mi4KKyAgICAgICAgCisgICAgICAgIFRoaXMgcGF0Y2ggYWRkcyBhIG5l
dyBVU0UgZmxhZyAtIENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMgdGhhdCBhcmUgZm9yIGEg
Y3Jvc3MtcGxhdGZvcm0KKyAgICAgICAgcmVwcmVzZW50YXRpb24gb2YgY29udGV4dCBtZW51cy4g
VGhpcyBwYXRjaCBhbHNvIGhhcyBXaW5kb3dzIGFkb3B0IHRoZW0uCisgICAgICAgIAorICAgICAg
ICBDcm9zcy1wbGF0Zm9ybSBjb250ZXh0IG1lbnVzIGNoYW5nZSB0aGUgQVBJIG9mIGNvbnRleHQg
bWVudXMgYW5kIHRoZSBDb250ZXh0TWVudUNsaWVudC4gVGhlcmUKKyAgICAgICAgaXMgbm8gbW9y
ZSBpZGVhIG9mIGEgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gb3IgYSBQbGF0Zm9ybU1lbnVJdGVt
RGVzY3JpcHRpb24uIE1lbnVzIGFyZSBiYWNrZWQKKyAgICAgICAgYnkgYSBWZWN0b3Igb2YgQ29u
dGV4dE1lbnVJdGVtcywgYW5kIG1lbnUgaXRlbXMgYXJlIGJhY2tlZCBieSB0aGUgdmFyaWFibGVz
IHRoZXkgbmVlZCAoZW5hYmxlZCwgY2hlY2tlZAorICAgICAgICB0aXRsZSwgYWN0aW9uLCB0eXBl
LCBhbmQgc3VibWVudSkuCisgICAgICAgIAorICAgICAgICBUaGlzIHBhdGNoIGFsc28gcmVmYWN0
b3JzIHRoZSBDb250ZXh0TWVudUNsaWVudCBpbnRlcmZhY2UgdG8gdXNlIGEgdmFyaWF0aW9uIG9u
IHRoZSBnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcworICAgICAgICBmdW5jdGlvbiB0byBh
bGxvdyBmb3IgY3VzdG9taXphdGlvbiBvZiB0aGUgY29udGV4dCBtZW51LgorICAgICAgICAKKyAg
ICAgICAgRm9yIG90aGVyIHBvcnRzIHRvIHVzZSBDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVT
LCBhbGwgdGhleSBuZWVkIHRvIGRvIGlzIHdyaXRlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGZyb20K
KyAgICAgICAgYSBDb250ZXh0TWVudSA8LT4gbmF0aXZlIG1lbnUgdHlwZSwgYW5kIENvbnRleHRN
ZW51SXRlbSA8LT4gbmF0aXZlIG1lbnUgaXRlbSB0eXBlLiBGb3IgV2luZG93cywgdGhpcyBpcyBk
b25lCisgICAgICAgIGluIENvbnRleHRNZW51V2luLmNwcCBhbmQgQ29udGV4dE1lbnVJdGVtV2lu
LmNwcC4KKworICAgICAgICBObyBuZXcgdGVzdHMsIG5vIGNoYW5nZSBpbiBiZWhhdmlvci4KKwor
ICAgICAgICAqIFdlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qOiBBZGQgbmV3IGZpbGVzIChv
bmx5IG5lZWRlZCBvbiBXaW5kb3dzIGZvciBub3cpLgorICAgICAgICAqIGxvYWRlci9FbXB0eUNs
aWVudHMuaDoKKyAgICAgICAgKFdlYkNvcmU6OkVtcHR5Q29udGV4dE1lbnVDbGllbnQ6OmN1c3Rv
bWl6ZU1lbnUpOiBEZWZpbmUgdGhpcyBmdW5jdGlvbiBpZiBDUk9TU19QTEFURk9STV9DT05URVhU
X01FTlVTCisgICAgICAgICAgICBpcyBvbi4KKyAgICAgICAgKiBwYWdlL0NvbnRleHRNZW51Q2xp
ZW50Lmg6IERpdHRvLiAKKyAgICAgICAgKiBwYWdlL0NvbnRleHRNZW51Q29udHJvbGxlci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUNvbnRyb2xsZXI6OnNob3dDb250ZXh0TWVu
dSk6IENhbGwgY3VzdG9taXplTWVudSBpbnN0ZWFkIG9mIAorICAgICAgICAgICAgZ2V0Q3VzdG9t
TWVudUZyb21EZWZhdWx0SXRlbXMgaWYgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUyBpcyBv
bi4KKyAgICAgICAgKiBwbGF0Zm9ybS9Db250ZXh0TWVudS5jcHA6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZTo6Q29udGV4dE1lbnU6OkNvbnRleHRNZW51KTogRW1wdHkgY29uc3RydWN0b3IuCisg
ICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudTo6c2V0SXRlbXMpOiBTZXRzIHRoZSBpdGVtcyBp
biB0aGUgbWVudS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjppdGVtcyk6IFJldHVy
bnMgdGhlIGl0ZW1zIGluIHRoZSBtZW51LgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6
Oml0ZW1BdEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6Oml0ZW1XaXRoQWN0aW9uSW5NZW51KTog
UmV0dXJucyB0aGUgaXRlbSB3aXRoIHRoZSBjb3JyZWN0IGFjdGlvbiwgcmVjdXJzaXZlbHkgZGVz
Y2VuZGluZworICAgICAgICAgICAgaW50byBzdWJtZW51cy4KKyAgICAgICAgKFdlYkNvcmU6OkNv
bnRleHRNZW51OjppdGVtV2l0aEFjdGlvbik6IENhbGxzIHRocm91Z2ggdG8gaXRlbVdpdGhBY3Rp
b25Jbk1lbnUuCisgICAgICAgICogcGxhdGZvcm0vQ29udGV4dE1lbnUuaDogQWRkZWQgYSBuZXcg
c2V0IG9mIGZ1bmN0aW9ucyBhbmQgbWVtYmVyIHZhcmlhYmxlcyB0aGF0IGFyZSBkZWZpbmVkIGZv
cgorICAgICAgICAgICAgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUy4KKyAgICAgICAgKFdl
YkNvcmU6OkNvbnRleHRNZW51OjphcHBlbmRJdGVtKTogQXBwZW5kcyBhbiBpdGVtIHRvIHRoZSBt
ZW51LgorICAgICAgICAqIHBsYXRmb3JtL0NvbnRleHRNZW51SXRlbS5jcHA6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0pOgorICAgICAg
ICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjp+Q29udGV4dE1lbnVJdGVtKToKKyAgICAgICAg
KFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6c2V0U3ViTWVudSk6CisgICAgICAgICogcGxhdGZv
cm0vQ29udGV4dE1lbnVJdGVtLmg6CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06
OnR5cGUpOiBSZXR1cm5zIHRoZSB0eXBlLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJ
dGVtOjpzZXRUeXBlKTogU2V0cyB0aGUgdHlwZS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRN
ZW51SXRlbTo6YWN0aW9uKTogUmV0dXJucyB0aGUgYWN0aW9uLgorICAgICAgICAoV2ViQ29yZTo6
Q29udGV4dE1lbnVJdGVtOjpzZXRBY3Rpb24pOiBTZXRzIHRoZSBhY3Rpb24uCisgICAgICAgIChX
ZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnRpdGxlKTogUmV0dXJucyB0aGUgdGl0bGUuCisgICAg
ICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnNldFRpdGxlKTogU2V0cyB0aGUgdGl0bGUu
CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OmNoZWNrZWQpOiBSZXR1cm5zIHdo
ZXRoZXIgb3Igbm90IHRoZSBtZW51IGl0ZW0gaXMgY2hlY2tlZC4KKyAgICAgICAgKFdlYkNvcmU6
OkNvbnRleHRNZW51SXRlbTo6c2V0Q2hlY2tlZCk6IFNldHMgd2hldGhlciBvdCBub3QgdGhlIG1l
bnUgaXRlbSBpcyBjaGVja2VkLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpl
bmFibGVkKTogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWVudSBpdGVtIGlzIGVuYWJsZWQu
CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnNldEVuYWJsZWQpOiBTZXRzIHdo
ZXRoZXIgb3Igbm90IHRoZSBtZW51IGl0ZW0gaXMgZW5hYmxlZC4KKyAgICAgICAgKFdlYkNvcmU6
OkNvbnRleHRNZW51SXRlbTo6c3VibWVudSk6IFJldHVybnMgdGhlIHN1Ym1lbnUuCisgICAgICAg
ICogcGxhdGZvcm0vUGxhdGZvcm1NZW51RGVzY3JpcHRpb24uaDogUmVtb3ZlIHRoZSBpZGVhIGlm
IGEgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gaWYgCisgICAgICAgICAgICBDUk9TU19QTEFURk9S
TV9DT05URVhUX01FTlVTIGlzIG9uLgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9Db250ZXh0TWVu
dUl0ZW1XaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpDb250ZXh0
TWVudUl0ZW0pOiBDcmVhdGVzIGEgQ29udGV4dE1lbnVJdGVtIGZyb20gYSBNRU5VSVRFTUlORk8u
CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06Om5hdGl2ZU1lbnVJdGVtKTogQ3Jl
YXRlcyBhbmQgcmV0dXJucyBhIE1FTlVJVEVNSU5GTy4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4v
Q29udGV4dE1lbnVXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6OkNvbnRl
eHRNZW51KTogQ3JlYXRlcyBhIENvbnRleHRNZW51IGZyb20gYW4gSE1FTlUuCisgICAgICAgIChX
ZWJDb3JlOjpDb250ZXh0TWVudTo6bmF0aXZlTWVudSk6IENyZWF0ZXMgYW5kIHJldHVybnMgYW4g
SE1FTlUuCisKIDIwMTAtMTItMDkgIERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29tPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IFNhbSBXZWluaWcuCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUudmNw
cm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ov
V2ViQ29yZS52Y3Byb2oJKHJldmlzaW9uIDczNjYyKQorKysgV2ViQ29yZS9XZWJDb3JlLnZjcHJv
ai9XZWJDb3JlLnZjcHJvagkod29ya2luZyBjb3B5KQpAQCAtMjUzMTMsMTAgKzI1MzEzLDE4IEBA
CiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxDb250ZW50VHlwZS5oIgogCQkJCT4KIAkJ
CTwvRmlsZT4KKyAgICAgICAgICAgIDxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9y
bVxDb250ZXh0TWVudS5jcHAiCisJCQkJPgorCQkJPC9GaWxlPgogCQkJPEZpbGUKIAkJCQlSZWxh
dGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXENvbnRleHRNZW51LmgiCiAJCQkJPgogCQkJPC9GaWxlPgor
ICAgICAgICAgICAgPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXENvbnRleHRN
ZW51SXRlbS5jcHAiCisJCQkJPgorCQkJPC9GaWxlPgogCQkJPEZpbGUKIAkJCQlSZWxhdGl2ZVBh
dGg9Ii4uXHBsYXRmb3JtXENvbnRleHRNZW51SXRlbS5oIgogCQkJCT4KSW5kZXg6IFdlYkNvcmUv
bG9hZGVyL0VtcHR5Q2xpZW50cy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvbG9hZGVyL0VtcHR5
Q2xpZW50cy5oCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYkNvcmUvbG9hZGVyL0VtcHR5Q2xpZW50
cy5oCSh3b3JraW5nIGNvcHkpCkBAIC01MDEsNyArNTAxLDExIEBAIHB1YmxpYzoKICAgICB2aXJ0
dWFsIH5FbXB0eUNvbnRleHRNZW51Q2xpZW50KCkgeyAgfQogICAgIHZpcnR1YWwgdm9pZCBjb250
ZXh0TWVudURlc3Ryb3llZCgpIHsgfQogCisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRf
TUVOVVMpCisgICAgdmlydHVhbCBQYXNzT3duUHRyPENvbnRleHRNZW51PiBjdXN0b21pemVNZW51
KFBhc3NPd25QdHI8Q29udGV4dE1lbnU+KSB7IHJldHVybiAwOyB9CisjZWxzZQogICAgIHZpcnR1
YWwgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gZ2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMo
Q29udGV4dE1lbnUqKSB7IHJldHVybiAwOyB9CisjZW5kaWYKICAgICB2aXJ0dWFsIHZvaWQgY29u
dGV4dE1lbnVJdGVtU2VsZWN0ZWQoQ29udGV4dE1lbnVJdGVtKiwgY29uc3QgQ29udGV4dE1lbnUq
KSB7IH0KIAogICAgIHZpcnR1YWwgdm9pZCBkb3dubG9hZFVSTChjb25zdCBLVVJMJikgeyB9Cklu
ZGV4OiBXZWJDb3JlL3BhZ2UvQ29udGV4dE1lbnVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BhZ2UvQ29udGV4dE1lbnVDbGllbnQuaAkocmV2aXNpb24gNzM2NjIpCisrKyBXZWJDb3Jl
L3BhZ2UvQ29udGV4dE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMjYsMTEgKzI2LDEy
IEBACiAjaWZuZGVmIENvbnRleHRNZW51Q2xpZW50X2gKICNkZWZpbmUgQ29udGV4dE1lbnVDbGll
bnRfaAogCisjaW5jbHVkZSAiQ29udGV4dE1lbnUuaCIKICNpbmNsdWRlICJQbGF0Zm9ybU1lbnVE
ZXNjcmlwdGlvbi5oIgogI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CisjaW5jbHVkZSA8d3RmL1Bh
c3NPd25QdHIuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewotICAgIGNsYXNzIENvbnRleHRNZW51
OwogICAgIGNsYXNzIENvbnRleHRNZW51SXRlbTsKICAgICBjbGFzcyBGcmFtZTsKICAgICBjbGFz
cyBIaXRUZXN0UmVzdWx0OwpAQCAtNDEsNyArNDIsMTIgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewog
ICAgICAgICB2aXJ0dWFsIH5Db250ZXh0TWVudUNsaWVudCgpIHsgIH0KICAgICAgICAgdmlydHVh
bCB2b2lkIGNvbnRleHRNZW51RGVzdHJveWVkKCkgPSAwOwogICAgICAgICAKKyNpZiBVU0UoQ1JP
U1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKyAgICAgICAgdmlydHVhbCBQYXNzT3duUHRyPENv
bnRleHRNZW51PiBjdXN0b21pemVNZW51KFBhc3NPd25QdHI8Q29udGV4dE1lbnU+KSA9IDA7Cisj
ZWxzZQogICAgICAgICB2aXJ0dWFsIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGdldEN1c3RvbU1l
bnVGcm9tRGVmYXVsdEl0ZW1zKENvbnRleHRNZW51KikgPSAwOworI2VuZGlmCisKICAgICAgICAg
dmlydHVhbCB2b2lkIGNvbnRleHRNZW51SXRlbVNlbGVjdGVkKENvbnRleHRNZW51SXRlbSosIGNv
bnN0IENvbnRleHRNZW51KikgPSAwOwogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBkb3dubG9hZFVS
TChjb25zdCBLVVJMJiB1cmwpID0gMDsKSW5kZXg6IFdlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNv
bnRyb2xsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNvbnRy
b2xsZXIuY3BwCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNv
bnRyb2xsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDQsOCArMTQ0LDEzIEBAIHZvaWQgQ29u
dGV4dE1lbnVDb250cm9sbGVyOjpzaG93Q29udGV4dE0KICAgICBpZiAobV9wYWdlLT5pbnNwZWN0
b3JDb250cm9sbGVyKCktPmVuYWJsZWQoKSkKICAgICAgICAgYWRkSW5zcGVjdEVsZW1lbnRJdGVt
KCk7CiAjZW5kaWYKKworI2lmIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQorICAg
IG1fY29udGV4dE1lbnUgPSBtX2NsaWVudC0+Y3VzdG9taXplTWVudShtX2NvbnRleHRNZW51LnJl
bGVhc2UoKSk7CisjZWxzZQogICAgIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGN1c3RvbU1lbnUg
PSBtX2NsaWVudC0+Z2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMobV9jb250ZXh0TWVudS5n
ZXQoKSk7CiAgICAgbV9jb250ZXh0TWVudS0+c2V0UGxhdGZvcm1EZXNjcmlwdGlvbihjdXN0b21N
ZW51KTsKKyNlbmRpZgogICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOwogfQogCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL0NvbnRleHRNZW51LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZv
cm0vQ29udGV4dE1lbnUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDYxIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51LmgiCisKKyNp
ZiBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitDb250ZXh0TWVudTo6Q29udGV4dE1lbnUoKQoreworfQorCisvLyBGSVhNRTogV2hlbiBt
b3JlIGNhbGxlcnMgYWRvcHQgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUywgdGhpcyBmdW5j
dGlvbiBzaG91bGQgdGFrZSBhIGNvbnN0IFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiAtIGFuZCBz
aG91bGQKKy8vIHJldHVybiBhIGNvbnN0IENvbnRleHRNZW51SXRlbSouCitzdGF0aWMgQ29udGV4
dE1lbnVJdGVtKiBmaW5kSXRlbVdpdGhBY3Rpb24odW5zaWduZWQgYWN0aW9uLCBWZWN0b3I8Q29u
dGV4dE1lbnVJdGVtPiYgaXRlbXMpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpdGVt
cy5zaXplKCk7ICsraSkgeworICAgICAgICBDb250ZXh0TWVudUl0ZW0mIGl0ZW0gPSBpdGVtc1tp
XTsKKyAgICAgICAgaWYgKGl0ZW0uYWN0aW9uKCkgPT0gYWN0aW9uKQorICAgICAgICAgICAgcmV0
dXJuICZpdGVtOworICAgICAgICBpZiAoaXRlbS50eXBlKCkgIT0gU3VibWVudVR5cGUpCisgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKENvbnRleHRNZW51SXRlbSogc3ViTWVudUl0
ZW0gPSBmaW5kSXRlbVdpdGhBY3Rpb24oYWN0aW9uLCBjb25zdF9jYXN0PFZlY3RvcjxDb250ZXh0
TWVudUl0ZW0+Jj4oaXRlbS5zdWJNZW51SXRlbXMoKSkpKQorICAgICAgICAgICAgcmV0dXJuIHN1
Yk1lbnVJdGVtOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitDb250ZXh0TWVudUl0ZW0q
IENvbnRleHRNZW51OjppdGVtV2l0aEFjdGlvbih1bnNpZ25lZCBhY3Rpb24pCit7CisgICAgcmV0
dXJuIGZpbmRJdGVtV2l0aEFjdGlvbihhY3Rpb24sIG1faXRlbXMpOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5V
UykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnUuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51LmgJKHJldmlzaW9uIDczNjYyKQorKysgV2ViQ29y
ZS9wbGF0Zm9ybS9Db250ZXh0TWVudS5oCSh3b3JraW5nIGNvcHkpCkBAIC00Niw2ICs0NiwzMSBA
QCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKICAgICBjbGFzcyBDb250ZXh0TWVudSA6IHB1YmxpYyBO
b25jb3B5YWJsZQogICAgIHsKKyNpZiBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykK
KyAgICBwdWJsaWM6CisjaWYgUExBVEZPUk0oV0lOKQorICAgICAgICB0eXBlZGVmIEhNRU5VIE5h
dGl2ZU1lbnU7CisjZW5kaWYKKyAgICAgICAgQ29udGV4dE1lbnUoKTsKKyAgICAgICAgZXhwbGlj
aXQgQ29udGV4dE1lbnUoTmF0aXZlTWVudSk7CisKKyAgICAgICAgTmF0aXZlTWVudSBuYXRpdmVN
ZW51KCkgY29uc3Q7CisKKyAgICAgICAgc3RhdGljIE5hdGl2ZU1lbnUgY3JlYXRlTmF0aXZlTWVu
dUZyb21JdGVtcyhjb25zdCBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYpOworICAgICAgICBzdGF0
aWMgdm9pZCBnZXRDb250ZXh0TWVudUl0ZW1zKE5hdGl2ZU1lbnUsIFZlY3RvcjxDb250ZXh0TWVu
dUl0ZW0+Jik7CisKKyAgICAgICAgLy8gRklYTUU6IFdoZW4gbW9yZSBwbGF0Zm9ybXMgc3dpdGNo
IG92ZXIsIHRoZXNlIHNob3VsZCByZXR1cm4gY29uc3QgQ29udGV4dE1lbnVJdGVtKidzLgorICAg
ICAgICBDb250ZXh0TWVudUl0ZW0qIGl0ZW1XaXRoQWN0aW9uKHVuc2lnbmVkKTsKKyAgICAgICAg
Q29udGV4dE1lbnVJdGVtKiBpdGVtQXRJbmRleCh1bnNpZ25lZCBpbmRleCkgeyByZXR1cm4gJm1f
aXRlbXNbaW5kZXhdOyB9CisKKyAgICAgICAgdm9pZCBzZXRJdGVtcyhjb25zdCBWZWN0b3I8Q29u
dGV4dE1lbnVJdGVtPiYgaXRlbXMpIHsgbV9pdGVtcyA9IGl0ZW1zOyB9CisgICAgICAgIGNvbnN0
IFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBpdGVtcygpIGNvbnN0IHsgcmV0dXJuIG1faXRlbXM7
IH0KKworICAgICAgICB2b2lkIGFwcGVuZEl0ZW0oY29uc3QgQ29udGV4dE1lbnVJdGVtJiBpdGVt
KSB7IG1faXRlbXMuYXBwZW5kKGl0ZW0pOyB9IAorCisgICAgcHJpdmF0ZToKKyAgICAgICAgVmVj
dG9yPENvbnRleHRNZW51SXRlbT4gbV9pdGVtczsKKyNlbHNlCiAgICAgcHVibGljOgogICAgICAg
ICBDb250ZXh0TWVudSgpOwogICAgICAgICBDb250ZXh0TWVudShjb25zdCBQbGF0Zm9ybU1lbnVE
ZXNjcmlwdGlvbik7CkBAIC04MywxMCArMTA4LDE0IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAg
ICAgICAgdW5zaWduZWQgbV9pdGVtQ291bnQ7CiAjZW5kaWYKICNlbmRpZgorCisjZW5kaWYgLy8g
VVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCiAgICAgfTsKIAorI2lmICFVU0UoQ1JP
U1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+IGNvbnRl
eHRNZW51SXRlbVZlY3RvcihQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbik7CiBQbGF0Zm9ybU1lbnVE
ZXNjcmlwdGlvbiBwbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbihWZWN0b3I8Q29udGV4dE1lbnVJdGVt
PiYpOworI2VuZGlmCiAKIH0KIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudUl0
ZW0uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnVJdGVtLmNw
cAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnVJdGVtLmNwcAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRP
UlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MK
KyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgor
ICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJDb250ZXh0TWVudUl0ZW0uaCIKKworI2luY2x1ZGUgIkNvbnRleHRN
ZW51LmgiCisKKyNpZiBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitDb250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0
TWVudUl0ZW1UeXBlIHR5cGUsIENvbnRleHRNZW51QWN0aW9uIGFjdGlvbiwgY29uc3QgU3RyaW5n
JiB0aXRsZSwgQ29udGV4dE1lbnUqIHN1Yk1lbnUpCisgICAgOiBtX3R5cGUodHlwZSkKKyAgICAs
IG1fYWN0aW9uKGFjdGlvbikKKyAgICAsIG1fdGl0bGUodGl0bGUpCisgICAgLCBtX2VuYWJsZWQo
dHJ1ZSkKKyAgICAsIG1fY2hlY2tlZChmYWxzZSkKK3sKKyAgICBzZXRTdWJNZW51KHN1Yk1lbnUp
OworfQorCitDb250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1U
eXBlIHR5cGUsIENvbnRleHRNZW51QWN0aW9uIGFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwg
Ym9vbCBlbmFibGVkLCBib29sIGNoZWNrZWQpCisgICAgOiBtX3R5cGUodHlwZSkKKyAgICAsIG1f
YWN0aW9uKGFjdGlvbikKKyAgICAsIG1fdGl0bGUodGl0bGUpCisgICAgLCBtX2VuYWJsZWQoZW5h
YmxlZCkKKyAgICAsIG1fY2hlY2tlZChjaGVja2VkKQoreworfQorICAgICAgICAKK0NvbnRleHRN
ZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51QWN0aW9uIGFjdGlvbiwgY29uc3Qg
U3RyaW5nJiB0aXRsZSwgYm9vbCBlbmFibGVkLCBib29sIGNoZWNrZWQsIFZlY3RvcjxDb250ZXh0
TWVudUl0ZW0+IHN1Yk1lbnVJdGVtcykKKyAgICA6IG1fdHlwZShTdWJtZW51VHlwZSkKKyAgICAs
IG1fYWN0aW9uKGFjdGlvbikKKyAgICAsIG1fdGl0bGUodGl0bGUpCisgICAgLCBtX2VuYWJsZWQo
ZW5hYmxlZCkKKyAgICAsIG1fY2hlY2tlZChjaGVja2VkKQorICAgICwgbV9zdWJNZW51SXRlbXMo
c3ViTWVudUl0ZW1zKQoreworfQorCitDb250ZXh0TWVudUl0ZW06On5Db250ZXh0TWVudUl0ZW0o
KQoreworfQorCit2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0U3ViTWVudShDb250ZXh0TWVudSog
c3ViTWVudSkKK3sKKyAgICBpZiAoc3ViTWVudSkgeworICAgICAgICBtX3R5cGUgPSBTdWJtZW51
VHlwZTsKKyAgICAgICAgbV9zdWJNZW51SXRlbXMgPSBzdWJNZW51LT5pdGVtcygpOworICAgIH0g
ZWxzZSB7CisgICAgICAgIG1fdHlwZSA9IEFjdGlvblR5cGU7CisgICAgICAgIG1fc3ViTWVudUl0
ZW1zLmNsZWFyKCk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRp
ZiAvLyBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vQ29udGV4dE1lbnVJdGVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9D
b250ZXh0TWVudUl0ZW0uaAkocmV2aXNpb24gNzM2NjIpCisrKyBXZWJDb3JlL3BsYXRmb3JtL0Nv
bnRleHRNZW51SXRlbS5oCSh3b3JraW5nIGNvcHkpCkBAIC00MCw3ICs0MCw3IEBACiBjbGFzcyBO
U01lbnVJdGVtOwogI2VuZGlmCiAjZWxpZiBQTEFURk9STShXSU4pCi10eXBlZGVmIHN0cnVjdCB0
YWdNRU5VSVRFTUlORk9XKiBMUE1FTlVJVEVNSU5GTzsKK3R5cGVkZWYgc3RydWN0IHRhZ01FTlVJ
VEVNSU5GT1cgTUVOVUlURU1JTkZPOwogI2VsaWYgUExBVEZPUk0oR1RLKQogdHlwZWRlZiBzdHJ1
Y3QgX0d0a01lbnVJdGVtIEd0a01lbnVJdGVtOwogI2VsaWYgUExBVEZPUk0oUVQpCkBAIC0xNjYs
OCArMTY2LDYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiAjaWYgUExBVEZPUk0oTUFDKQogICAg
IHR5cGVkZWYgTlNNZW51SXRlbSogUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uOwotI2VsaWYg
UExBVEZPUk0oV0lOKQotICAgIHR5cGVkZWYgTFBNRU5VSVRFTUlORk8gUGxhdGZvcm1NZW51SXRl
bURlc2NyaXB0aW9uOwogI2VsaWYgUExBVEZPUk0oUVQpCiAgICAgc3RydWN0IFBsYXRmb3JtTWVu
dUl0ZW1EZXNjcmlwdGlvbiB7CiAgICAgICAgIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbigp
CkBAIC0yNTMsNiArMjUxLDQ4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICNlbmRpZgogCiAgICAg
Y2xhc3MgQ29udGV4dE1lbnVJdGVtIDogcHVibGljIEZhc3RBbGxvY0Jhc2UgeworI2lmIFVTRShD
Uk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQorICAgIHB1YmxpYzoKKyNpZiBQTEFURk9STShX
SU4pCisgICAgICAgIHR5cGVkZWYgTUVOVUlURU1JTkZPIE5hdGl2ZUl0ZW07CisjZW5kaWYKKyAg
ICAgICAgQ29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51SXRlbVR5cGUsIENvbnRleHRNZW51QWN0
aW9uLCBjb25zdCBTdHJpbmcmLCBDb250ZXh0TWVudSogc3ViTWVudSA9IDApOworICAgICAgICBD
b250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVJdGVtVHlwZSwgQ29udGV4dE1lbnVBY3Rpb24sIGNv
bnN0IFN0cmluZyYsIGJvb2wgZW5hYmxlZCwgYm9vbCBjaGVja2VkKTsKKyAgICAgICAgQ29udGV4
dE1lbnVJdGVtKENvbnRleHRNZW51QWN0aW9uLCBjb25zdCBTdHJpbmcmLCBib29sIGVuYWJsZWQs
IGJvb2wgY2hlY2tlZCwgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gc3ViTWVudUl0ZW1zKTsKKyAg
ICAgICAgZXhwbGljaXQgQ29udGV4dE1lbnVJdGVtKE5hdGl2ZUl0ZW0pOworCisgICAgICAgIC8v
IE9uIFdpbmRvd3MsIHRoZSB0aXRsZSAoZHdUeXBlRGF0YSBvZiB0aGUgTUVOVUlURU1JTkZPKSBp
cyBub3Qgc2V0IGluIHRoaXMgZnVuY3Rpb24uIENhbGxlcnMgY2FuIHNldCB0aGUgdGl0bGUgdGhl
bXNlbHZlcywKKyAgICAgICAgLy8gYW5kIGhhbmRsZSB0aGUgbGlmZXRpbWUgb2YgdGhlIHRpdGxl
LCBpZiB0aGV5IG5lZWQgaXQuCisgICAgICAgIE5hdGl2ZUl0ZW0gbmF0aXZlTWVudUl0ZW0oKSBj
b25zdDsKKworICAgICAgICB2b2lkIHNldFR5cGUoQ29udGV4dE1lbnVJdGVtVHlwZSB0eXBlKSB7
IG1fdHlwZSA9IHR5cGU7IH0KKyAgICAgICAgQ29udGV4dE1lbnVJdGVtVHlwZSB0eXBlKCkgY29u
c3QgeyByZXR1cm4gbV90eXBlOyB9CisKKyAgICAgICAgdm9pZCBzZXRBY3Rpb24oQ29udGV4dE1l
bnVBY3Rpb24gYWN0aW9uKSB7IG1fYWN0aW9uID0gYWN0aW9uOyB9CisgICAgICAgIENvbnRleHRN
ZW51QWN0aW9uIGFjdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fYWN0aW9uOyB9CisKKyAgICAgICAg
dm9pZCBzZXRUaXRsZShjb25zdCBTdHJpbmcmIHRpdGxlKSB7IG1fdGl0bGUgPSB0aXRsZTsgfQor
ICAgICAgICBjb25zdCBTdHJpbmcmIHRpdGxlKCkgY29uc3QgeyByZXR1cm4gbV90aXRsZTsgfQor
CisgICAgICAgIHZvaWQgc2V0Q2hlY2tlZChib29sIGNoZWNrZWQgPSB0cnVlKSB7IG1fY2hlY2tl
ZCA9IGNoZWNrZWQ7IH0KKyAgICAgICAgYm9vbCBjaGVja2VkKCkgY29uc3QgeyByZXR1cm4gbV9j
aGVja2VkOyB9CisKKyAgICAgICAgdm9pZCBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCA9IHRydWUp
IHsgbV9lbmFibGVkID0gZW5hYmxlZDsgfQorICAgICAgICBib29sIGVuYWJsZWQoKSBjb25zdCB7
IHJldHVybiBtX2VuYWJsZWQ7IH0KKworICAgICAgICB2b2lkIHNldFN1Yk1lbnUoQ29udGV4dE1l
bnUqKTsKKyAgICAgICAgY29uc3QgVmVjdG9yPENvbnRleHRNZW51SXRlbT4mIHN1Yk1lbnVJdGVt
cygpIGNvbnN0IHsgcmV0dXJuIG1fc3ViTWVudUl0ZW1zOyB9CisKKyAgICAgICAgfkNvbnRleHRN
ZW51SXRlbSgpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgU3RyaW5nIG1fdGl0bGU7CisgICAg
ICAgIGJvb2wgbV9lbmFibGVkOworICAgICAgICBib29sIG1fY2hlY2tlZDsKKyAgICAgICAgQ29u
dGV4dE1lbnVBY3Rpb24gbV9hY3Rpb247CisgICAgICAgIENvbnRleHRNZW51SXRlbVR5cGUgbV90
eXBlOworICAgICAgICBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBtX3N1Yk1lbnVJdGVtczsKKyNl
bHNlCiAgICAgcHVibGljOgogICAgICAgICBDb250ZXh0TWVudUl0ZW0oUGxhdGZvcm1NZW51SXRl
bURlc2NyaXB0aW9uKTsKICAgICAgICAgQ29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51KiBzdWJN
ZW51ID0gMCk7CkBAIC0yOTcsNiArMzM3LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogI2Vsc2UK
ICAgICAgICAgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIG1fcGxhdGZvcm1EZXNjcmlwdGlv
bjsKICNlbmRpZgorI2VuZGlmIC8vIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQog
ICAgIH07CiAKIH0KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vUGxhdGZvcm1NZW51RGVzY3JpcHRp
b24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL1BsYXRmb3JtTWVudURlc2NyaXB0
aW9uLmgJKHJldmlzaW9uIDczNjYyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9QbGF0Zm9ybU1lbnVE
ZXNjcmlwdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw4ICszMiw2IEBACiAjZWxzZQogY2xh
c3MgTlNNdXRhYmxlQXJyYXk7CiAjZW5kaWYKLSNlbGlmIFBMQVRGT1JNKFdJTikKLXR5cGVkZWYg
c3RydWN0IEhNRU5VX18qIEhNRU5VOwogI2VsaWYgUExBVEZPUk0oUVQpCiAjaW5jbHVkZSA8cWxp
c3QuaD4KICNlbGlmIFBMQVRGT1JNKEdUSykKQEAgLTQ2LDEwICs0NCw5IEBAIGNsYXNzIEJNZW51
OwogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKKyNpZiAhVVNFKENST1NTX1BMQVRGT1JNX0NPTlRF
WFRfTUVOVVMpCiAjaWYgUExBVEZPUk0oTUFDKQogICAgIHR5cGVkZWYgTlNNdXRhYmxlQXJyYXkq
IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uOwotI2VsaWYgUExBVEZPUk0oV0lOKQotICAgIHR5cGVk
ZWYgSE1FTlUgUGxhdGZvcm1NZW51RGVzY3JpcHRpb247CiAjZWxpZiBQTEFURk9STShRVCkKICAg
ICBjbGFzcyBDb250ZXh0TWVudUl0ZW07CiAgICAgdHlwZWRlZiBjb25zdCBRTGlzdDxDb250ZXh0
TWVudUl0ZW0+KiBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbjsKQEAgLTYyLDYgKzU5LDcgQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogI2Vsc2UKICAgICB0eXBlZGVmIHZvaWQqIFBsYXRmb3JtTWVudURl
c2NyaXB0aW9uOwogI2VuZGlmCisjZW5kaWYgLy8gIVVTRShDUk9TU19QTEFURk9STV9DT05URVhU
X01FTlVTKQogCiB9IC8vIG5hbWVzcGFjZQogCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9D
b250ZXh0TWVudUl0ZW1XaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vd2lu
L0NvbnRleHRNZW51SXRlbVdpbi5jcHAJKHJldmlzaW9uIDczNjYyKQorKysgV2ViQ29yZS9wbGF0
Zm9ybS93aW4vQ29udGV4dE1lbnVJdGVtV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDUsMTgx
ICs0NSw2MiBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUNvbnRleHRNZW51SXRlbTo6Q29u
dGV4dE1lbnVJdGVtKExQTUVOVUlURU1JTkZPIGl0ZW0pCi0gICAgOiBtX3BsYXRmb3JtRGVzY3Jp
cHRpb24oaXRlbSkKK0NvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKE1FTlVJVEVNSU5G
TyBpbmZvKQogewotfQotCi1Db250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0
TWVudSogc3ViTWVudSkKLXsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24gPSAoTFBNRU5VSVRF
TUlORk8pbWFsbG9jKHNpemVvZihNRU5VSVRFTUlORk8pKTsKLSAgICBpZiAoIW1fcGxhdGZvcm1E
ZXNjcmlwdGlvbikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbWVtc2V0KG1fcGxhdGZvcm1EZXNj
cmlwdGlvbiwgMCwgc2l6ZW9mKE1FTlVJVEVNSU5GTykpOwotICAgIG1fcGxhdGZvcm1EZXNjcmlw
dGlvbi0+Y2JTaXplID0gc2l6ZW9mKE1FTlVJVEVNSU5GTyk7Ci0KLSAgICBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPndJRCA9IENvbnRleHRNZW51SXRlbVRhZ05vQWN0aW9uOwotICAgIGlmIChzdWJN
ZW51KSB7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sgfD0gTUlJTV9TVUJN
RU5VOwotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51ID0gc3ViTWVudS0+
cGxhdGZvcm1EZXNjcmlwdGlvbigpOwotICAgIH0KLX0KKyAgICBpZiAoaW5mby5mTWFzayAmIE1J
SU1fRlRZUEUpCisgICAgICAgIG1fdHlwZSA9IGluZm8uZlR5cGUgPT0gTUZUX1NFUEFSQVRPUiA/
IFNlcGFyYXRvclR5cGUgOiBBY3Rpb25UeXBlOwogCi1Db250ZXh0TWVudUl0ZW06OkNvbnRleHRN
ZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUsIENvbnRleHRNZW51QWN0aW9uIGFjdGlv
biwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ29udGV4dE1lbnUqIHN1Yk1lbnUpCi17Ci0gICAgbV9w
bGF0Zm9ybURlc2NyaXB0aW9uID0gKExQTUVOVUlURU1JTkZPKW1hbGxvYyhzaXplb2YoTUVOVUlU
RU1JTkZPKSk7Ci0gICAgaWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVy
bjsKLQotICAgIG1lbXNldChtX3BsYXRmb3JtRGVzY3JpcHRpb24sIDAsIHNpemVvZihNRU5VSVRF
TUlORk8pKTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmNiU2l6ZSA9IHNpemVvZihNRU5V
SVRFTUlORk8pOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sgPSBNSUlNX0ZUWVBF
OwotCi0gICAgaWYgKHR5cGUgPT0gU2VwYXJhdG9yVHlwZSkgewotICAgICAgICBtX3BsYXRmb3Jt
RGVzY3JpcHRpb24tPmZUeXBlID0gTUZUX1NFUEFSQVRPUjsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICAKLSAgICBpZiAoc3ViTWVudSkgewotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRp
b24tPmZNYXNrIHw9IE1JSU1fU1RSSU5HIHwgTUlJTV9TVUJNRU5VOwotICAgICAgICBtX3BsYXRm
b3JtRGVzY3JpcHRpb24tPmhTdWJNZW51ID0gc3ViTWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigp
OwotICAgIH0gZWxzZQotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZNYXNrIHw9IE1J
SU1fU1RSSU5HIHwgTUlJTV9JRDsKLQotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlR5cGUg
PSBNRlRfU1RSSU5HOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+d0lEID0gYWN0aW9uOwot
ICAgIAotICAgIFN0cmluZyB0ID0gdGl0bGU7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5j
Y2ggPSB0Lmxlbmd0aCgpOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZHdUeXBlRGF0YSA9
IHdjc2R1cCh0LmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOwotfQorICAgIGlmIChp
bmZvLmZUeXBlID09IE1GVF9TVFJJTkcgJiYgaW5mby5mTWFzayAmIE1JSU1fU1RSSU5HKQorICAg
ICAgICBtX3RpdGxlID0gU3RyaW5nKGluZm8uZHdUeXBlRGF0YSwgd2NzbGVuKGluZm8uZHdUeXBl
RGF0YSkpOwogCi1Db250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0
ZW1UeXBlLCBDb250ZXh0TWVudUFjdGlvbiwgY29uc3QgU3RyaW5nJiwgYm9vbCwgYm9vbCkKLXsK
LSAgICAvLyBGSVhNRTogSW1wbGVtZW50Ci19Ci0KLUNvbnRleHRNZW51SXRlbTo6Q29udGV4dE1l
bnVJdGVtKENvbnRleHRNZW51QWN0aW9uLCBjb25zdCBTdHJpbmcmLCBib29sLCBib29sLCBWZWN0
b3I8Q29udGV4dE1lbnVJdGVtPiYpCi17Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudAotfQotCi1D
b250ZXh0TWVudUl0ZW06On5Db250ZXh0TWVudUl0ZW0oKQotewotICAgIGlmIChtX3BsYXRmb3Jt
RGVzY3JpcHRpb24pIHsKLSAgICAgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlR5cGUg
PT0gTUZUX1NUUklORykKLSAgICAgICAgICAgIGZyZWUobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5k
d1R5cGVEYXRhKTsKLSAgICAgICAgZnJlZShtX3BsYXRmb3JtRGVzY3JpcHRpb24pOworICAgIGlm
ICgoaW5mby5mTWFzayAmIE1JSU1fU1VCTUVOVSkgJiYgaW5mby5oU3ViTWVudSkgeworICAgICAg
ICBtX3R5cGUgPSBTdWJtZW51VHlwZTsKKyAgICAgICAgQ29udGV4dE1lbnU6OmdldENvbnRleHRN
ZW51SXRlbXMoaW5mby5oU3ViTWVudSwgbV9zdWJNZW51SXRlbXMpOwogICAgIH0KLX0KLQotTFBN
RU5VSVRFTUlORk8gQ29udGV4dE1lbnVJdGVtOjpyZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigp
Ci17Ci0gICAgTFBNRU5VSVRFTUlORk8gaW5mbyA9IG1fcGxhdGZvcm1EZXNjcmlwdGlvbjsKLSAg
ICBtX3BsYXRmb3JtRGVzY3JpcHRpb24gPSAwOwotICAgIHJldHVybiBpbmZvOwotfQotCi1Db250
ZXh0TWVudUl0ZW1UeXBlIENvbnRleHRNZW51SXRlbTo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgQ29u
dGV4dE1lbnVJdGVtVHlwZSB0eXBlID0gQWN0aW9uVHlwZTsKLSAgICBpZiAoKChtX3BsYXRmb3Jt
RGVzY3JpcHRpb24tPmZUeXBlICYgfk1GVF9PV05FUkRSQVcpID09IE1GVF9TVFJJTkcpICYmIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUpCi0gICAgICAgIHR5cGUgPSBTdWJtZW51VHlw
ZTsKLSAgICBlbHNlIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZUeXBlICYgTUZUX1NFUEFS
QVRPUikKLSAgICAgICAgdHlwZSA9IFNlcGFyYXRvclR5cGU7Ci0KLSAgICByZXR1cm4gdHlwZTsK
LX0KLQotQ29udGV4dE1lbnVBY3Rpb24gQ29udGV4dE1lbnVJdGVtOjphY3Rpb24oKSBjb25zdAot
eyAKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q29udGV4dE1lbnVBY3Rpb24+KG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbi0+d0lEKTsKLX0KLQotU3RyaW5nIENvbnRleHRNZW51SXRlbTo6dGl0bGUoKSBj
b25zdCAKLXsKLSAgICByZXR1cm4gU3RyaW5nKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZHdUeXBl
RGF0YSwgd2NzbGVuKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZHdUeXBlRGF0YSkpOwotfQogCi1Q
bGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBDb250ZXh0TWVudUl0ZW06OnBsYXRmb3JtU3ViTWVudSgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnU7Ci19
Ci0KLXZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRUeXBlKENvbnRleHRNZW51SXRlbVR5cGUgdHlw
ZSkKLXsKLSAgICBpZiAodHlwZSA9PSBTZXBhcmF0b3JUeXBlKQotICAgICAgICBtX3BsYXRmb3Jt
RGVzY3JpcHRpb24tPmZUeXBlID0gTUZUX1NFUEFSQVRPUjsKKyAgICBpZiAoaW5mby5mTWFzayAm
IE1JSU1fSUQpCisgICAgICAgIG1fYWN0aW9uID0gc3RhdGljX2Nhc3Q8Q29udGV4dE1lbnVBY3Rp
b24+KGluZm8ud0lEKTsKICAgICBlbHNlCi0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+
ZlR5cGUgPSBNRlRfU1RSSU5HOwotfQotCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0QWN0aW9u
KENvbnRleHRNZW51QWN0aW9uIGFjdGlvbikKLXsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24t
PndJRCA9IGFjdGlvbjsgCi19CisgICAgICAgIG1fYWN0aW9uID0gQ29udGV4dE1lbnVJdGVtVGFn
Tm9BY3Rpb247CiAKLXZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRUaXRsZShjb25zdCBTdHJpbmcm
IHRpdGxlKQotewotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEpCi0g
ICAgICAgIGZyZWUobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVEYXRhKTsKLSAgICAKLSAg
ICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmNjaCA9IHRpdGxlLmxlbmd0aCgpOwotICAgIFN0cmlu
ZyB0aXRsZUNvcHkgPSB0aXRsZTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURh
dGEgPSB3Y3NkdXAodGl0bGVDb3B5LmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOwor
ICAgIGlmIChpbmZvLmZNYXNrICYgTUlJTV9TVEFURSkgeworICAgICAgICBtX2NoZWNrZWQgPSBp
bmZvLmZTdGF0ZSAmIE1GU19DSEVDS0VEOworICAgICAgICBtX2VuYWJsZWQgPSAhKGluZm8uZlN0
YXRlICYgTUZTX0RJU0FCTEVEKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX2NoZWNrZWQgPSBm
YWxzZTsKKyAgICAgICAgbV9lbmFibGVkID0gZmFsc2U7CisgICAgfQogfQogCi12b2lkIENvbnRl
eHRNZW51SXRlbTo6c2V0U3ViTWVudShDb250ZXh0TWVudSogc3ViTWVudSkKLXsKLSAgICBpZiAo
c3ViTWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpID09IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+
aFN1Yk1lbnUpCi0gICAgICAgIHJldHVybjsKKy8vIENvbnRleHRNZW51SXRlbTo6bmF0aXZlTWVu
dUl0ZW0gZG9lc24ndCBzZXQgdGhlIGluZm8uZHdUeXBlRGF0YS4gVGhpcyBpcworLy8gZG9uZSB0
byBtYWtlIHRoZSBsaWZldGltZSBoYW5kbGluZyBvZiB0aGUgcmV0dXJuZWQgTUVOVUlURU1JTkZP
IGVhc2llciBvbgorLy8gY2FsbGVycy4gQ2FsbGVycyBjYW4gc2V0IGR3VHlwZURhdGEgdGhlbXNl
bHZlcyAoYW5kIG1ha2UgdGhlaXIgb3duIGRlY2lzaW9ucworLy8gYWJvdXQgaXRzIGxpZmV0aW1l
KSBpZiB0aGV5IG5lZWQgaXQuCitNRU5VSVRFTUlORk8gQ29udGV4dE1lbnVJdGVtOjpuYXRpdmVN
ZW51SXRlbSgpIGNvbnN0Cit7CisgICAgTUVOVUlURU1JTkZPIGluZm8gPSB7MH07CisgICAgaW5m
by5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPKTsKKworICAgIGlmIChtX3R5cGUgPT0gU2Vw
YXJhdG9yVHlwZSkgeworICAgICAgICBpbmZvLmZNYXNrID0gTUlJTV9GVFlQRTsKKyAgICAgICAg
aW5mby5mVHlwZSA9IE1GVF9TRVBBUkFUT1I7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0K
IAotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51KQotICAgICAgICA6OkRl
c3Ryb3lNZW51KG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUpOworICAgIGluZm8uZk1h
c2sgPSBNSUlNX0ZUWVBFIHwgTUlJTV9JRCB8IE1JSU1fU1RBVEU7CisgICAgaW5mby5mVHlwZSA9
IE1GVF9TVFJJTkc7CiAKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZNYXNrIHw9IE1JSU1f
U1VCTUVOVTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51ID0gc3ViTWVudS0+
cmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKTsKLX0KKyAgICBpbmZvLndJRCA9IG1fYWN0aW9u
OwogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0U3ViTWVudShWZWN0b3I8Q29udGV4dE1lbnVJ
dGVtPiYpCi17Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudAotfQotCi12b2lkIENvbnRleHRNZW51
SXRlbTo6c2V0Q2hlY2tlZChib29sIGNoZWNrZWQpCi17Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5mTWFzayB8PSBNSUlNX1NUQVRFOwotICAgIGlmIChjaGVja2VkKSB7Ci0gICAgICAgIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlN0YXRlICY9IH5NRlNfVU5DSEVDS0VEOwotICAgICAgICBt
X3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNfQ0hFQ0tFRDsKLSAgICB9IGVsc2Ug
ewotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSAmPSB+TUZTX0NIRUNLRUQ7
Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlN0YXRlIHw9IE1GU19VTkNIRUNLRUQ7
CisgICAgaWYgKG1fdHlwZSA9PSBTdWJtZW51VHlwZSkgeworICAgICAgICBpbmZvLmZNYXNrIHw9
IE1JSU1fU1VCTUVOVTsKKyAgICAgICAgaW5mby5oU3ViTWVudSA9IENvbnRleHRNZW51OjpjcmVh
dGVOYXRpdmVNZW51RnJvbUl0ZW1zKG1fc3ViTWVudUl0ZW1zKTsKICAgICB9Ci19Ci0KLWJvb2wg
Q29udGV4dE1lbnVJdGVtOjpjaGVja2VkKCkgY29uc3QKLXsKLSAgICAvLyBGSVhNRSAtIEltcGxl
bWVudAotICAgIHJldHVybiBmYWxzZTsKLX0KIAotdm9pZCBDb250ZXh0TWVudUl0ZW06OnNldEVu
YWJsZWQoYm9vbCBlbmFibGVkKQotewotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sg
fD0gTUlJTV9TVEFURTsKLSAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPmZTdGF0ZSAmPSB+TUZTX0RJU0FCTEVEOwotICAgICAgICBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNfRU5BQkxFRDsKLSAgICB9IGVsc2UgewotICAgICAgICBt
X3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSAmPSB+TUZTX0VOQUJMRUQ7Ci0gICAgICAgIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlN0YXRlIHw9IE1GU19ESVNBQkxFRDsKLSAgICB9Ci19Cisg
ICAgaW5mby5mU3RhdGUgfD0gbV9lbmFibGVkID8gTUZTX0VOQUJMRUQgOiBNRlNfRElTQUJMRUQ7
CisgICAgaW5mby5mU3RhdGUgfD0gbV9jaGVja2VkID8gTUZTX0NIRUNLRUQgOiBNRlNfVU5DSEVD
S0VEOwogCi1ib29sIENvbnRleHRNZW51SXRlbTo6ZW5hYmxlZCgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuICEobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJiBNRlNfRElTQUJMRUQpOworICAg
IHJldHVybiBpbmZvOwogfQogCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9Db250ZXh0
TWVudVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ29udGV4dE1l
bnVXaW4uY3BwCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL0NvbnRl
eHRNZW51V2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUg
Ik5vZGUuaCIKICNpbmNsdWRlIDx0Y2hhci5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNs
dWRlIDx3dGYvVmVjdG9yLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCiAjaWZu
ZGVmIE1JSU1fRlRZUEUKQEAgLTQzLDE4MCArNDQsNjggQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUg
ewogCi1Db250ZXh0TWVudTo6Q29udGV4dE1lbnUoKQotICAgIDogbV9wbGF0Zm9ybURlc2NyaXB0
aW9uKDApCi0jaWYgT1MoV0lOQ0UpCi0gICAgLCBtX2l0ZW1Db3VudCgwKQotI2VuZGlmCi17Ci0g
ICAgc2V0UGxhdGZvcm1EZXNjcmlwdGlvbig6OkNyZWF0ZVBvcHVwTWVudSgpKTsKLX0KLQotQ29u
dGV4dE1lbnU6OkNvbnRleHRNZW51KGNvbnN0IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIG1lbnUp
Ci0gICAgOiBtX3BsYXRmb3JtRGVzY3JpcHRpb24oMCkKLSNpZiBPUyhXSU5DRSkKLSAgICAsIG1f
aXRlbUNvdW50KDApCi0jZW5kaWYKLXsKLSAgICBzZXRQbGF0Zm9ybURlc2NyaXB0aW9uKG1lbnUp
OwotfQotCi1Db250ZXh0TWVudTo6fkNvbnRleHRNZW51KCkKLXsKLSAgICBpZiAobV9wbGF0Zm9y
bURlc2NyaXB0aW9uKQotICAgICAgICA6OkRlc3Ryb3lNZW51KG1fcGxhdGZvcm1EZXNjcmlwdGlv
bik7Ci19Ci0KLXVuc2lnbmVkIENvbnRleHRNZW51OjppdGVtQ291bnQoKSBjb25zdAotewotI2lm
IE9TKFdJTkNFKQotICAgIHJldHVybiBtX2l0ZW1Db3VudDsKLSNlbHNlCi0gICAgaWYgKCFtX3Bs
YXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIDo6R2V0
TWVudUl0ZW1Db3VudChtX3BsYXRmb3JtRGVzY3JpcHRpb24pOwotI2VuZGlmCi19Ci0KLSNpZiBP
UyhXSU5DRSkKLXN0YXRpYyBib29sIGluc2VydE1lbnVJdGVtKFBsYXRmb3JtTWVudURlc2NyaXB0
aW9uIG1lbnUsIHVuc2lnbmVkIGludCBwb3NpdGlvbiwgQ29udGV4dE1lbnVJdGVtJiBpdGVtKQor
Q29udGV4dE1lbnU6OkNvbnRleHRNZW51KEhNRU5VIG1lbnUpCiB7Ci0gICAgVUlOVCBmbGFncyA9
IE1GX0JZUE9TSVRJT047Ci0gICAgVUlOVCBuZXdJdGVtID0gMDsKLSAgICBMUENXU1RSIHRpdGxl
ID0gMDsKLQotICAgIGlmIChpdGVtLnR5cGUoKSA9PSBTZXBhcmF0b3JUeXBlKQotICAgICAgICBm
bGFncyB8PSBNRl9TRVBBUkFUT1I7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZsYWdzIHw9IE1GX1NU
UklORzsKLSAgICAgICAgZmxhZ3MgfD0gaXRlbS5jaGVja2VkKCkgPyBNRl9DSEVDS0VEIDogTUZf
VU5DSEVDS0VEOwotICAgICAgICBmbGFncyB8PSBpdGVtLmVuYWJsZWQoKSA/IE1GX0VOQUJMRUQg
OiBNRl9HUkFZRUQ7Ci0KLSAgICAgICAgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIGRlc2Ny
aXB0aW9uID0gaXRlbS5yZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOwotICAgICAgICB0aXRs
ZSA9IGRlc2NyaXB0aW9uLT5kd1R5cGVEYXRhOwotICAgICAgICBkZXNjcmlwdGlvbi0+ZHdUeXBl
RGF0YSA9IDA7Ci0KLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uLT5oU3ViTWVudSkgewotICAgICAg
ICAgICAgZmxhZ3MgfD0gTUZfUE9QVVA7Ci0gICAgICAgICAgICBuZXdJdGVtID0gcmVpbnRlcnBy
ZXRfY2FzdDxVSU5UPihkZXNjcmlwdGlvbi0+aFN1Yk1lbnUpOwotICAgICAgICAgICAgZGVzY3Jp
cHRpb24tPmhTdWJNZW51ID0gMDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBuZXdJdGVt
ID0gZGVzY3JpcHRpb24tPndJRDsKLQotICAgICAgICBmcmVlKGRlc2NyaXB0aW9uKTsKLSAgICB9
Ci0KLSAgICByZXR1cm4gOjpJbnNlcnRNZW51VyhtZW51LCBwb3NpdGlvbiwgZmxhZ3MsIG5ld0l0
ZW0sIHRpdGxlKTsKKyAgICBnZXRDb250ZXh0TWVudUl0ZW1zKG1lbnUsIG1faXRlbXMpOwogfQot
I2VuZGlmCiAKLXZvaWQgQ29udGV4dE1lbnU6Omluc2VydEl0ZW0odW5zaWduZWQgaW50IHBvc2l0
aW9uLCBDb250ZXh0TWVudUl0ZW0mIGl0ZW0pCit2b2lkIENvbnRleHRNZW51OjpnZXRDb250ZXh0
TWVudUl0ZW1zKEhNRU5VIG1lbnUsIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBpdGVtcykKIHsK
LSAgICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICBpbnQgY291bnQgPSA6OkdldE1l
bnVJdGVtQ291bnQobWVudSk7CisgICAgaWYgKGNvdW50IDw9IDApCiAgICAgICAgIHJldHVybjsK
IAotI2lmIE9TKFdJTkNFKQotICAgIGlmIChpbnNlcnRNZW51SXRlbShtX3BsYXRmb3JtRGVzY3Jp
cHRpb24sIHBvc2l0aW9uLCBpdGVtKSkKLSAgICAgICAgKyttX2l0ZW1Db3VudDsKLSNlbHNlCi0g
ICAgOjpJbnNlcnRNZW51SXRlbShtX3BsYXRmb3JtRGVzY3JpcHRpb24sIHBvc2l0aW9uLCBUUlVF
LCBpdGVtLnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCkpOwotI2VuZGlmCi19Ci0KLXZvaWQg
Q29udGV4dE1lbnU6OmFwcGVuZEl0ZW0oQ29udGV4dE1lbnVJdGVtJiBpdGVtKQotewotICAgIGlu
c2VydEl0ZW0oaXRlbUNvdW50KCksIGl0ZW0pOwotfQorICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgIE1FTlVJVEVNSU5GTyBpbmZvID0gezB9OworICAg
ICAgICBpbmZvLmNiU2l6ZSA9IHNpemVvZihNRU5VSVRFTUlORk8pOworICAgICAgICBpbmZvLmZN
YXNrID0gTUlJTV9GVFlQRSB8IE1JSU1fSUQgfCBNSUlNX1NUUklORyB8IE1JSU1fU1RBVEUgfCBN
SUlNX1NVQk1FTlU7CisgICAgICAgIGluZm8uZHdUeXBlRGF0YSA9IDA7CisKKyAgICAgICAgaWYg
KCE6OkdldE1lbnVJdGVtSW5mbyhtZW51LCBpLCBUUlVFLCAmaW5mbykpCisgICAgICAgICAgICBj
b250aW51ZTsKKworICAgICAgICBpZiAoaW5mby5mVHlwZSA9PSBNRlRfU0VQQVJBVE9SKSB7Cisg
ICAgICAgICAgICBpdGVtcy5hcHBlbmQoQ29udGV4dE1lbnVJdGVtKFNlcGFyYXRvclR5cGUsIENv
bnRleHRNZW51SXRlbVRhZ05vQWN0aW9uLCBTdHJpbmcoKSkpOworICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgIH0KIAotc3RhdGljIENvbnRleHRNZW51SXRlbSogY29udGV4dE1lbnVJdGVt
QnlJZE9yUG9zaXRpb24oSE1FTlUgbWVudSwgdW5zaWduZWQgaWQsIEJPT0wgYnlQb3NpdGlvbikK
LXsKLSAgICBpZiAoIW1lbnUpCi0gICAgICAgIHJldHVybiAwOwotICAgIExQTUVOVUlURU1JTkZP
IGluZm8gPSBzdGF0aWNfY2FzdDxMUE1FTlVJVEVNSU5GTz4obWFsbG9jKHNpemVvZihNRU5VSVRF
TUlORk8pKSk7Ci0gICAgaWYgKCFpbmZvKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIG1lbXNl
dChpbmZvLCAwLCBzaXplb2YoTUVOVUlURU1JTkZPKSk7Ci0KLSAgICBpbmZvLT5jYlNpemUgPSBz
aXplb2YoTUVOVUlURU1JTkZPKTsKLQotICAgIC8vIFNldHRpbmcgTUlJTV9EQVRBIHdoaWNoIGlz
IHVzZWZ1bCBmb3IgV2ViS2l0IGNsaWVudHMgd2hvIHN0b3JlIGRhdGEgaW4gdGhpcyBtZW1iZXIg
Zm9yIHRoZWlyIGN1c3RvbSBtZW51IGl0ZW1zLgotICAgIGluZm8tPmZNYXNrID0gTUlJTV9GVFlQ
RSB8IE1JSU1fSUQgfCBNSUlNX1NUUklORyB8IE1JSU1fREFUQTsKLQotICAgIGlmICghOjpHZXRN
ZW51SXRlbUluZm8obWVudSwgaWQsIGJ5UG9zaXRpb24sIGluZm8pKSB7Ci0gICAgICAgIGZyZWUo
aW5mbyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICAgICAgaW50IG1lbnVTdHJpbmdM
ZW5ndGggPSBpbmZvLmNjaCArIDE7CisgICAgICAgIE93bkFycmF5UHRyPFdDSEFSPiBtZW51U3Ry
aW5nKG5ldyBXQ0hBUlttZW51U3RyaW5nTGVuZ3RoXSk7CisgICAgICAgIGluZm8uZHdUeXBlRGF0
YSA9IG1lbnVTdHJpbmcuZ2V0KCk7CisgICAgICAgIGluZm8uY2NoID0gbWVudVN0cmluZ0xlbmd0
aDsKIAotICAgIGlmIChpbmZvLT5mVHlwZSAmIE1GVF9TVFJJTkcpIHsKLSAgICAgICAgTFBUU1RS
IGJ1ZmZlciA9IHN0YXRpY19jYXN0PExQVFNUUj4obWFsbG9jKCsraW5mby0+Y2NoICogc2l6ZW9m
KFRDSEFSKSkpOwotICAgICAgICBpZiAoIWJ1ZmZlcikgewotICAgICAgICAgICAgZnJlZShpbmZv
KTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGluZm8tPmR3VHlw
ZURhdGEgPSBidWZmZXI7Ci0gICAgICAgIDo6R2V0TWVudUl0ZW1JbmZvKG1lbnUsIGlkLCBieVBv
c2l0aW9uLCBpbmZvKTsKKyAgICAgICAgaWYgKDo6R2V0TWVudUl0ZW1JbmZvKG1lbnUsIGksIFRS
VUUsICZpbmZvKSkKKyAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnRleHRNZW51SXRlbShpbmZv
KSk7CiAgICAgfQotCi0gICAgcmV0dXJuIG5ldyBDb250ZXh0TWVudUl0ZW0oaW5mbyk7CiB9CiAK
LUNvbnRleHRNZW51SXRlbSogQ29udGV4dE1lbnU6Oml0ZW1XaXRoQWN0aW9uKHVuc2lnbmVkIGFj
dGlvbikKK0hNRU5VIENvbnRleHRNZW51OjpjcmVhdGVOYXRpdmVNZW51RnJvbUl0ZW1zKGNvbnN0
IFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBpdGVtcykKIHsKLSAgICByZXR1cm4gY29udGV4dE1l
bnVJdGVtQnlJZE9yUG9zaXRpb24obV9wbGF0Zm9ybURlc2NyaXB0aW9uLCBhY3Rpb24sIEZBTFNF
KTsKLX0KKyAgICBITUVOVSBtZW51ID0gOjpDcmVhdGVQb3B1cE1lbnUoKTsKIAotQ29udGV4dE1l
bnVJdGVtKiBDb250ZXh0TWVudTo6aXRlbUF0SW5kZXgodW5zaWduZWQgaW5kZXgsIGNvbnN0IFBs
YXRmb3JtTWVudURlc2NyaXB0aW9uIHBsYXRmb3JtRGVzY3JpcHRpb24pCi17Ci0gICAgcmV0dXJu
IGNvbnRleHRNZW51SXRlbUJ5SWRPclBvc2l0aW9uKHBsYXRmb3JtRGVzY3JpcHRpb24sIGluZGV4
LCBUUlVFKTsKLX0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgKytp
KSB7CisgICAgICAgIGNvbnN0IENvbnRleHRNZW51SXRlbSYgaXRlbSA9IGl0ZW1zW2ldOwogCi12
b2lkIENvbnRleHRNZW51OjpzZXRQbGF0Zm9ybURlc2NyaXB0aW9uKEhNRU5VIG1lbnUpCi17Ci0g
ICAgaWYgKG1lbnUgPT0gbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICByZXR1cm47Ci0g
ICAgCi0gICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKLSAgICAgICAgOjpEZXN0cm95TWVu
dShtX3BsYXRmb3JtRGVzY3JpcHRpb24pOworICAgICAgICBNRU5VSVRFTUlORk8gbWVudUl0ZW0g
PSBpdGVtLm5hdGl2ZU1lbnVJdGVtKCk7CiAKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24gPSBt
ZW51OwotICAgIGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICByZXR1cm47Ci0K
LSNpZiAhT1MoV0lOQ0UpCi0gICAgTUVOVUlORk8gbWVudUluZm8gPSB7MH07Ci0gICAgbWVudUlu
Zm8uY2JTaXplID0gc2l6ZW9mKE1FTlVJTkZPKTsKLSAgICBtZW51SW5mby5mTWFzayA9IE1JTV9T
VFlMRTsKLSAgICA6OkdldE1lbnVJbmZvKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgJm1lbnVJbmZv
KTsKLSAgICBtZW51SW5mby5mTWFzayA9IE1JTV9TVFlMRTsKLSAgICBtZW51SW5mby5kd1N0eWxl
IHw9IE1OU19OT1RJRllCWVBPUzsKLSAgICA6OlNldE1lbnVJbmZvKG1fcGxhdGZvcm1EZXNjcmlw
dGlvbiwgJm1lbnVJbmZvKTsKLSNlbmRpZgotfQotCi1ITUVOVSBDb250ZXh0TWVudTo6cGxhdGZv
cm1EZXNjcmlwdGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNjcmlwdGlv
bjsKLX0KKyAgICAgICAgLy8gQ29udGV4dE1lbnVJdGVtOjpuYXRpdmVNZW51SXRlbSBkb2Vzbid0
IHNldCB0aGUgdGl0bGUgb2YgdGhlIE1FTlVJVEVNSU5GTyB0byBtYWtlIHRoZQorICAgICAgICAv
LyBsaWZldGltZSBoYW5kbGluZyBlYXNpZXIgZm9yIGNhbGxlcnMuCisgICAgICAgIFN0cmluZyBp
dGVtVGl0bGUgPSBpdGVtLnRpdGxlKCk7CisgICAgICAgIGlmIChpdGVtLnR5cGUoKSAhPSBTZXBh
cmF0b3JUeXBlKSB7CisgICAgICAgICAgICBtZW51SXRlbS5mTWFzayB8PSBNSUlNX1NUUklORzsK
KyAgICAgICAgICAgIG1lbnVJdGVtLmNjaCA9IGl0ZW1UaXRsZS5sZW5ndGgoKTsKKyAgICAgICAg
ICAgIG1lbnVJdGVtLmR3VHlwZURhdGEgPSBjb25zdF9jYXN0PExQV1NUUj4oaXRlbVRpdGxlLmNo
YXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOworICAgICAgICB9CiAKLUhNRU5VIENvbnRl
eHRNZW51OjpyZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpCi17Ci0gICAgSE1FTlUgZGVzY3Jp
cHRpb24gPSBtX3BsYXRmb3JtRGVzY3JpcHRpb247Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9u
ID0gMDsKLSAgICByZXR1cm4gZGVzY3JpcHRpb247Ci19CisgICAgICAgIDo6SW5zZXJ0TWVudUl0
ZW0obWVudSwgaSwgVFJVRSwgJm1lbnVJdGVtKTsKKyAgICB9CiAKLVZlY3RvcjxDb250ZXh0TWVu
dUl0ZW0+IGNvbnRleHRNZW51SXRlbVZlY3RvcihQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbikKLXsK
LSAgICAvLyBGSVhNRSAtIEltcGxlbWVudAotICAgIHJldHVybiBWZWN0b3I8Q29udGV4dE1lbnVJ
dGVtPigpOworICAgIHJldHVybiBtZW51OwogfQogCi1QbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBw
bGF0Zm9ybU1lbnVEZXNjcmlwdGlvbihWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYgbWVudUl0ZW1W
ZWN0b3IpCitITUVOVSBDb250ZXh0TWVudTo6bmF0aXZlTWVudSgpIGNvbnN0CiB7Ci0gICAgLy8g
RklYTUUgLSBJbXBsZW1lbnQKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gY3JlYXRlTmF0aXZl
TWVudUZyb21JdGVtcyhtX2l0ZW1zKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRl
eDogV2ViS2l0Mi9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Mi9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDczNjYyKQorKysgV2ViS2l0Mi9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEs
MyArMSwyNSBAQAorMjAxMC0xMi0wOSAgQnJpYW4gV2VpbnN0ZWluICA8YndlaW5zdGVpbkBhcHBs
ZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
UHJlcCBmb3IgV2ViS2l0MjogQ29udGV4dCBtZW51IHN1cHBvcnQgb24gV2luZG93cworICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTA1MTQKKyAgICAgICAg
CisgICAgICAgIFVwZGF0ZSBXZWJLaXQyIHRvIGNhbGwgdGhlIGNvcnJlY3QgY29kZSB3aGVuIENS
T1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMgaXMgc2V0LgorCisgICAgICAgICogU2hhcmVkL1dl
YkNvbnRleHRNZW51SXRlbURhdGEuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJDb250ZXh0TWVu
dUl0ZW1EYXRhOjpXZWJDb250ZXh0TWVudUl0ZW1EYXRhKTogQWRkIGEgYnJhbmNoIGJhc2VkIG9u
IHdoZXRoZXIgb3Igbm90IAorICAgICAgICAgICAgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5V
UyBpcyBzZXQuCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0
TWVudUNsaWVudC5jcHA6CisgICAgICAgIChXZWJLaXQ6OldlYkNvbnRleHRNZW51Q2xpZW50Ojpj
dXN0b21pemVNZW51KTogRGVmaW5lIGRpZmZlcmVudCBmdW5jdGlvbnMgYmFzZWQgb24KKyAgICAg
ICAgICAgIHdoZXRoZXIgb3Igbm90IENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMuIEJvdGgg
b2YgdGhlc2UgYXJlIHN0dWJzLCBzbyBmdW5jdGlvbmFsaXR5CisgICAgICAgICAgICBkb2Vzbid0
IG5lZWQgdG8gYmUgc2hhcmVkLgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQv
V2ViQ29udGV4dE1lbnVDbGllbnQuaDogRGVmaW5lIGRpZmZlcmVudCBmdW5jdGlvbnMgYmFzZWQg
b24KKyAgICAgICAgICAgIHdoZXRoZXIgb3Igbm90IENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVO
VVMuIAorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViUGFnZS9XZWJDb250ZXh0TWVudS5jcHA6Cisg
ICAgICAgIChXZWJLaXQ6OldlYkNvbnRleHRNZW51OjpzaG93KTogQWRkIGEgYnJhbmNoIGJhc2Vk
IG9uIHdoZXRoZXIgb3Igbm90IAorICAgICAgICAgICAgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9N
RU5VUyBpcyBzZXQuCisKIDIwMTAtMTItMDkgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGFw
cGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBTYW0gV2VpbmlnLgpJbmRleDogV2ViS2l0
Mi9TaGFyZWQvV2ViQ29udGV4dE1lbnVJdGVtRGF0YS5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0
Mi9TaGFyZWQvV2ViQ29udGV4dE1lbnVJdGVtRGF0YS5jcHAJKHJldmlzaW9uIDczNjYyKQorKysg
V2ViS2l0Mi9TaGFyZWQvV2ViQ29udGV4dE1lbnVJdGVtRGF0YS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTYzLDEzICs2MywxNyBAQCBXZWJDb250ZXh0TWVudUl0ZW1EYXRhOjpXZWJDb250ZXh0TWVu
dUl0CiB7CiB9CiAKLVdlYkNvbnRleHRNZW51SXRlbURhdGE6OldlYkNvbnRleHRNZW51SXRlbURh
dGEoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtJiBpdGVtLCBXZWJDb3JlOjpDb250ZXh0TWVudSog
bWVudSkKK1dlYkNvbnRleHRNZW51SXRlbURhdGE6OldlYkNvbnRleHRNZW51SXRlbURhdGEoY29u
c3QgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtJiBpdGVtLCBXZWJDb3JlOjpDb250ZXh0TWVudSog
bWVudSkKICAgICA6IG1fdHlwZShpdGVtLnR5cGUoKSkKICAgICAsIG1fYWN0aW9uKGl0ZW0uYWN0
aW9uKCkpCiAgICAgLCBtX3RpdGxlKGl0ZW0udGl0bGUoKSkKIHsKICAgICBpZiAobV90eXBlID09
IFdlYkNvcmU6OlN1Ym1lbnVUeXBlKSB7CisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRf
TUVOVVMpCisgICAgICAgIGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW0+JiBj
b3JlU3VibWVudSA9IGl0ZW0uc3ViTWVudUl0ZW1zKCk7CisjZWxzZQogICAgICAgICBWZWN0b3I8
V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtPiBjb3JlU3VibWVudSA9IFdlYkNvcmU6OmNvbnRleHRN
ZW51SXRlbVZlY3RvcihpdGVtLnBsYXRmb3JtU3ViTWVudSgpKTsKKyNlbmRpZgogICAgICAgICBt
X3N1Ym1lbnUgPSBraXRJdGVtcyhjb3JlU3VibWVudSwgbWVudSk7CiAgICAgfQogICAgIApAQCAt
MTMwLDcgKzEzNCw3IEBAIGJvb2wgV2ViQ29udGV4dE1lbnVJdGVtRGF0YTo6ZGVjb2RlKENvcmUK
ICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotVmVjdG9yPFdlYkNvbnRleHRNZW51SXRlbURhdGE+IGtp
dEl0ZW1zKFZlY3RvcjxXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW0+JiBjb3JlSXRlbVZlY3Rvciwg
V2ViQ29yZTo6Q29udGV4dE1lbnUqIG1lbnUpCitWZWN0b3I8V2ViQ29udGV4dE1lbnVJdGVtRGF0
YT4ga2l0SXRlbXMoY29uc3QgVmVjdG9yPFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbT4mIGNvcmVJ
dGVtVmVjdG9yLCBXZWJDb3JlOjpDb250ZXh0TWVudSogbWVudSkKIHsKICAgICBWZWN0b3I8V2Vi
Q29udGV4dE1lbnVJdGVtRGF0YT4gcmVzdWx0OwogICAgIHJlc3VsdC5yZXNlcnZlQ2FwYWNpdHko
Y29yZUl0ZW1WZWN0b3Iuc2l6ZSgpKTsKSW5kZXg6IFdlYktpdDIvU2hhcmVkL1dlYkNvbnRleHRN
ZW51SXRlbURhdGEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQyL1NoYXJlZC9XZWJDb250ZXh0TWVu
dUl0ZW1EYXRhLmgJKHJldmlzaW9uIDczNjYyKQorKysgV2ViS2l0Mi9TaGFyZWQvV2ViQ29udGV4
dE1lbnVJdGVtRGF0YS5oCSh3b3JraW5nIGNvcHkpCkBAIC00NSw3ICs0NSw3IEBAIGNsYXNzIEFQ
SU9iamVjdDsKIGNsYXNzIFdlYkNvbnRleHRNZW51SXRlbURhdGEgewogcHVibGljOgogICAgIFdl
YkNvbnRleHRNZW51SXRlbURhdGEoKTsKLSAgICBXZWJDb250ZXh0TWVudUl0ZW1EYXRhKFdlYkNv
cmU6OkNvbnRleHRNZW51SXRlbSYsIFdlYkNvcmU6OkNvbnRleHRNZW51KiBtZW51KTsKKyAgICBX
ZWJDb250ZXh0TWVudUl0ZW1EYXRhKGNvbnN0IFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbSYsIFdl
YkNvcmU6OkNvbnRleHRNZW51KiBtZW51KTsKICAgICBXZWJDb250ZXh0TWVudUl0ZW1EYXRhKFdl
YkNvcmU6OkNvbnRleHRNZW51SXRlbVR5cGUsIFdlYkNvcmU6OkNvbnRleHRNZW51QWN0aW9uLCBj
b25zdCBTdHJpbmcmIHRpdGxlLCBib29sIGVuYWJsZWQsIGJvb2wgY2hlY2tlZCk7CiAgICAgV2Vi
Q29udGV4dE1lbnVJdGVtRGF0YShXZWJDb3JlOjpDb250ZXh0TWVudUFjdGlvbiwgY29uc3QgU3Ry
aW5nJiB0aXRsZSwgYm9vbCBlbmFibGVkLCBjb25zdCBWZWN0b3I8V2ViQ29udGV4dE1lbnVJdGVt
RGF0YT4mIHN1Ym1lbnUpOwogCkBAIC03NCw3ICs3NCw3IEBAIHByaXZhdGU6CiAgICAgUmVmUHRy
PEFQSU9iamVjdD4gbV91c2VyRGF0YTsKIH07CiAKLVZlY3RvcjxXZWJDb250ZXh0TWVudUl0ZW1E
YXRhPiBraXRJdGVtcyhWZWN0b3I8V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtPiYsIFdlYkNvcmU6
OkNvbnRleHRNZW51Kik7CitWZWN0b3I8V2ViQ29udGV4dE1lbnVJdGVtRGF0YT4ga2l0SXRlbXMo
Y29uc3QgVmVjdG9yPFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbT4mLCBXZWJDb3JlOjpDb250ZXh0
TWVudSopOwogVmVjdG9yPFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbT4gY29yZUl0ZW1zKGNvbnN0
IFZlY3RvcjxXZWJDb250ZXh0TWVudUl0ZW1EYXRhPiYpOwogCiB9IC8vIG5hbWVzcGFjZSBXZWJL
aXQKSW5kZXg6IFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVu
dUNsaWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBw
b3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmNwcAkocmV2aXNpb24gNzM2NjIpCisrKyBXZWJLaXQy
L1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC00NCwxMSArNDQsMTkgQEAgdm9pZCBXZWJDb250ZXh0TWVudUNsaWVudDo6
Y29udGV4dE1lbnVEZQogICAgIGRlbGV0ZSB0aGlzOwogfQogCisjaWYgVVNFKENST1NTX1BMQVRG
T1JNX0NPTlRFWFRfTUVOVVMpCitQYXNzT3duUHRyPENvbnRleHRNZW51PiBXZWJDb250ZXh0TWVu
dUNsaWVudDo6Y3VzdG9taXplTWVudShQYXNzT3duUHRyPENvbnRleHRNZW51PiBtZW51KQorewor
ICAgIC8vIFdlYktpdDIgaWdub3JlcyB0aGlzIGNsaWVudCBjYWxsYmFjayBhbmQgZG9lcyBjb250
ZXh0IG1lbnUgY3VzdG9taXphdGlvbiB3aGVuIGl0IGlzIHRvbGQgdG8gc2hvdyB0aGUgbWVudS4K
KyAgICByZXR1cm4gbWVudTsKK30KKyNlbHNlCiBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBXZWJD
b250ZXh0TWVudUNsaWVudDo6Z2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMoQ29udGV4dE1l
bnUqIG1lbnUpCiB7CiAgICAgLy8gV2ViS2l0MiBpZ25vcmVzIHRoaXMgY2xpZW50IGNhbGxiYWNr
IGFuZCBkb2VzIGNvbnRleHQgbWVudSBjdXN0b21pemF0aW9uIHdoZW4gaXQgaXMgdG9sZCB0byBz
aG93IHRoZSBtZW51LgogICAgIHJldHVybiBtZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCk7CiB9
CisjZW5kaWYKIAogdm9pZCBXZWJDb250ZXh0TWVudUNsaWVudDo6Y29udGV4dE1lbnVJdGVtU2Vs
ZWN0ZWQoQ29udGV4dE1lbnVJdGVtKiwgY29uc3QgQ29udGV4dE1lbnUqKQogewpJbmRleDogV2Vi
S2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRN
ZW51Q2xpZW50LmgJKHJldmlzaW9uIDczNjYyKQorKysgV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNv
cmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmgJKHdvcmtpbmcgY29weSkKQEAgLTQyLDcg
KzQyLDExIEBAIHB1YmxpYzoKIHByaXZhdGU6CiAgICAgdmlydHVhbCB2b2lkIGNvbnRleHRNZW51
RGVzdHJveWVkKCk7CiAgICAgCisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMp
CisgICAgdmlydHVhbCBQYXNzT3duUHRyPFdlYkNvcmU6OkNvbnRleHRNZW51PiBjdXN0b21pemVN
ZW51KFBhc3NPd25QdHI8V2ViQ29yZTo6Q29udGV4dE1lbnU+KTsKKyNlbHNlCiAgICAgdmlydHVh
bCBXZWJDb3JlOjpQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBnZXRDdXN0b21NZW51RnJvbURlZmF1
bHRJdGVtcyhXZWJDb3JlOjpDb250ZXh0TWVudSopOworI2VuZGlmCiAgICAgdmlydHVhbCB2b2lk
IGNvbnRleHRNZW51SXRlbVNlbGVjdGVkKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbSosIGNvbnN0
IFdlYkNvcmU6OkNvbnRleHRNZW51Kik7CiAgICAgCiAgICAgdmlydHVhbCB2b2lkIGRvd25sb2Fk
VVJMKGNvbnN0IFdlYkNvcmU6OktVUkwmIHVybCk7CkluZGV4OiBXZWJLaXQyL1dlYlByb2Nlc3Mv
V2ViUGFnZS9XZWJDb250ZXh0TWVudS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Mi9XZWJQcm9j
ZXNzL1dlYlBhZ2UvV2ViQ29udGV4dE1lbnUuY3BwCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYktp
dDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYkNvbnRleHRNZW51LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNjQsNyArNjQsMTEgQEAgdm9pZCBXZWJDb250ZXh0TWVudTo6c2hvdygpCiAgICAgICAgIHJl
dHVybjsKIAogICAgIC8vIEdpdmUgdGhlIGJ1bmRsZSBjbGllbnQgYSBjaGFuY2UgdG8gcHJvY2Vz
cyB0aGUgbWVudS4KKyNpZiBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKyAgICBj
b25zdCBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYgY29yZUl0ZW1zID0gbWVudS0+aXRlbXMoKTsK
KyNlbHNlCiAgICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gY29yZUl0ZW1zID0gY29udGV4dE1l
bnVJdGVtVmVjdG9yKG1lbnUtPnBsYXRmb3JtRGVzY3JpcHRpb24oKSk7CisjZW5kaWYKICAgICBW
ZWN0b3I8V2ViQ29udGV4dE1lbnVJdGVtRGF0YT4gcHJvcG9zZWRNZW51ID0ga2l0SXRlbXMoY29y
ZUl0ZW1zLCBtZW51KTsKICAgICBWZWN0b3I8V2ViQ29udGV4dE1lbnVJdGVtRGF0YT4gbmV3TWVu
dTsKICAgICBSZWZQdHI8QVBJT2JqZWN0PiB1c2VyRGF0YTsKSW5kZXg6IFdlYktpdC93aW4vQ2hh
bmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vQ2hhbmdlTG9nCShyZXZpc2lvbiA3MzY2
MikKKysrIFdlYktpdC93aW4vQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjMg
QEAKKzIwMTAtMTItMDkgIEJyaWFuIFdlaW5zdGVpbiAgPGJ3ZWluc3RlaW5AYXBwbGUuY29tPgor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFByZXAgZm9y
IFdlYktpdDI6IENvbnRleHQgbWVudSBzdXBwb3J0IG9uIFdpbmRvd3MKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUwNTE0CisgICAgICAgIAorICAgICAg
ICBVcGRhdGUgV2ViS2l0IGZvciB0aGUgbmV3IENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMg
ZmxhZywgYW5kIGRlZmluZSBjdXN0b21pemVNZW51CisgICAgICAgIGluc3RlYWQgb2YgZ2V0Q3Vz
dG9tTWVudUZyb21EZWZhdWx0SXRlbXMuCisKKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9XZWJD
b250ZXh0TWVudUNsaWVudC5jcHA6CisgICAgICAgIChXZWJDb250ZXh0TWVudUNsaWVudDo6Y3Vz
dG9taXplTWVudSk6IGdldEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0ZW1zIHdhcyB0dXJuZWQgaW50
bworICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiwgd2l0aCByZWZhY3RvcmluZyB1c2luZyBuYXRp
dmVNZW51IGluc3RlYWQgb2YgcGxhdGZvcm1EZXNjcmlwdGlvbi4KKyAgICAgICAgKFdlYkNvbnRl
eHRNZW51Q2xpZW50Ojpjb250ZXh0TWVudUl0ZW1TZWxlY3RlZCk6ICBVc2UgbmF0aXZlTWVudSBp
bnN0ZWFkIG9mIHBsYXRmb3JtRGVzY3JpcHRpb24uCisgICAgICAgICogV2ViQ29yZVN1cHBvcnQv
V2ViQ29udGV4dE1lbnVDbGllbnQuaDoKKyAgICAgICAgKiBXZWJWaWV3LmNwcDoKKyAgICAgICAg
KFdlYlZpZXc6OmhhbmRsZUNvbnRleHRNZW51RXZlbnQpOiBDYWxsIG5hdGl2ZU1lbnUgaW5zdGVh
ZCBvZiBwbGF0Zm9ybURlc2NyaXB0aW9uLgorICAgICAgICAoV2ViVmlldzo6cGVyZm9ybUNvbnRl
eHRNZW51QWN0aW9uKTogT25seSBjYWxsIGl0ZW1BdEluZGV4IHdpdGggb25lIGFyZ3VtZW50LCBu
byBuZWVkCisgICAgICAgICAgICBmb3IgdGhlIHNlY29uZC4KKwogMjAxMC0xMi0wNyAgQnJpYW4g
V2VpbnN0ZWluICA8YndlaW5zdGVpbkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkg
Sm9obiBTdWxsaXZhbi4KSW5kZXg6IFdlYktpdC93aW4vV2ViVmlldy5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViS2l0L3dpbi9XZWJWaWV3LmNwcAkocmV2aXNpb24gNzM2NjIpCisrKyBXZWJLaXQvd2lu
L1dlYlZpZXcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjc1LDEyICsxMjc1LDEyIEBAIGJvb2wg
V2ViVmlldzo6aGFuZGxlQ29udGV4dE1lbnVFdmVudChXUEEKICAgICAgICAgbV91aURlbGVnYXRl
LT5oYXNDdXN0b21NZW51SW1wbGVtZW50YXRpb24oJmhhc0N1c3RvbU1lbnVzKTsKIAogICAgIGlm
IChoYXNDdXN0b21NZW51cykKLSAgICAgICAgbV91aURlbGVnYXRlLT50cmFja0N1c3RvbVBvcHVw
TWVudSgoSVdlYlZpZXcqKXRoaXMsIChPTEVfSEFORExFKShVTE9ORzY0KWNvcmVNZW51LT5wbGF0
Zm9ybURlc2NyaXB0aW9uKCksICZwb2ludCk7CisgICAgICAgIG1fdWlEZWxlZ2F0ZS0+dHJhY2tD
dXN0b21Qb3B1cE1lbnUoKElXZWJWaWV3Kil0aGlzLCAoT0xFX0hBTkRMRSkoVUxPTkc2NCljb3Jl
TWVudS0+bmF0aXZlTWVudSgpLCAmcG9pbnQpOwogICAgIGVsc2UgewogICAgICAgICAvLyBTdXJw
cmlzaW5nbHksIFRQTV9SSUdIVEJVVFRPTiBtZWFucyB0aGF0IGl0ZW1zIGFyZSBzZWxlY3RhYmxl
IHdpdGggZWl0aGVyIHRoZSByaWdodCBPUiBsZWZ0IG1vdXNlIGJ1dHRvbgogICAgICAgICBVSU5U
IGZsYWdzID0gVFBNX1JJR0hUQlVUVE9OIHwgVFBNX1RPUEFMSUdOIHwgVFBNX1ZFUlBPU0FOSU1B
VElPTiB8IFRQTV9IT1JJWk9OVEFMCiAgICAgICAgICAgICB8IFRQTV9MRUZUQUxJR04gfCBUUE1f
SE9SUE9TQU5JTUFUSU9OOwotICAgICAgICA6OlRyYWNrUG9wdXBNZW51RXgoY29yZU1lbnUtPnBs
YXRmb3JtRGVzY3JpcHRpb24oKSwgZmxhZ3MsIHBvaW50LngsIHBvaW50LnksIG1fdmlld1dpbmRv
dywgMCk7CisgICAgICAgIDo6VHJhY2tQb3B1cE1lbnVFeChjb3JlTWVudS0+bmF0aXZlTWVudSgp
LCBmbGFncywgcG9pbnQueCwgcG9pbnQueSwgbV92aWV3V2luZG93LCAwKTsKICAgICB9CiAKICAg
ICByZXR1cm4gdHJ1ZTsKQEAgLTEzNTUsMTEgKzEzNTUsMTAgQEAgdm9pZCBXZWJWaWV3OjpwZXJm
b3JtQ29udGV4dE1lbnVBY3Rpb24oVwogICAgIENvbnRleHRNZW51KiBtZW51ID0gbV9wYWdlLT5j
b250ZXh0TWVudUNvbnRyb2xsZXIoKS0+Y29udGV4dE1lbnUoKTsKICAgICBBU1NFUlQobWVudSk7
CiAKLSAgICBDb250ZXh0TWVudUl0ZW0qIGl0ZW0gPSBieVBvc2l0aW9uID8gbWVudS0+aXRlbUF0
SW5kZXgoKHVuc2lnbmVkKXdQYXJhbSwgKEhNRU5VKWxQYXJhbSkgOiBtZW51LT5pdGVtV2l0aEFj
dGlvbigoQ29udGV4dE1lbnVBY3Rpb24pd1BhcmFtKTsKKyAgICBDb250ZXh0TWVudUl0ZW0qIGl0
ZW0gPSBieVBvc2l0aW9uID8gbWVudS0+aXRlbUF0SW5kZXgoKHVuc2lnbmVkKXdQYXJhbSkgOiBt
ZW51LT5pdGVtV2l0aEFjdGlvbigoQ29udGV4dE1lbnVBY3Rpb24pd1BhcmFtKTsKICAgICBpZiAo
IWl0ZW0pCiAgICAgICAgIHJldHVybjsKICAgICBtX3BhZ2UtPmNvbnRleHRNZW51Q29udHJvbGxl
cigpLT5jb250ZXh0TWVudUl0ZW1TZWxlY3RlZChpdGVtKTsKLSAgICBkZWxldGUgaXRlbTsKIH0K
IAogYm9vbCBXZWJWaWV3OjpoYW5kbGVNb3VzZUV2ZW50KFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQ
YXJhbSwgTFBBUkFNIGxQYXJhbSkKSW5kZXg6IFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2Vi
Q29udGV4dE1lbnVDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViQ29yZVN1
cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYktp
dC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC01NSwyMSArNTUsMjkgQEAgdm9pZCBXZWJDb250ZXh0TWVudUNsaWVudDo6Y29udGV4
dE1lbnVEZQogICAgIGRlbGV0ZSB0aGlzOwogfQogCi1ITUVOVSBXZWJDb250ZXh0TWVudUNsaWVu
dDo6Z2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMoQ29udGV4dE1lbnUqIG1lbnUpCitQYXNz
T3duUHRyPENvbnRleHRNZW51PiBXZWJDb250ZXh0TWVudUNsaWVudDo6Y3VzdG9taXplTWVudShQ
YXNzT3duUHRyPENvbnRleHRNZW51PiBwb3BNZW51KQogeworICAgIE93blB0cjxDb250ZXh0TWVu
dT4gbWVudSA9IHBvcE1lbnU7CisKICAgICBDT01QdHI8SVdlYlVJRGVsZWdhdGU+IHVpRGVsZWdh
dGU7CiAgICAgaWYgKEZBSUxFRChtX3dlYlZpZXctPnVpRGVsZWdhdGUoJnVpRGVsZWdhdGUpKSkK
LSAgICAgICAgcmV0dXJuIG1lbnUtPnBsYXRmb3JtRGVzY3JpcHRpb24oKTsKKyAgICAgICAgcmV0
dXJuIG1lbnUucmVsZWFzZSgpOwogCiAgICAgQVNTRVJUKHVpRGVsZWdhdGUpOwogCi0gICAgSE1F
TlUgbmV3TWVudSA9IDA7CisgICAgSE1FTlUgbmF0aXZlTWVudSA9IG1lbnUtPm5hdGl2ZU1lbnUo
KTsKICAgICBDT01QdHI8V2ViRWxlbWVudFByb3BlcnR5QmFnPiBwcm9wZXJ0eUJhZzsKICAgICBw
cm9wZXJ0eUJhZy5hZG9wdFJlZihXZWJFbGVtZW50UHJvcGVydHlCYWc6OmNyZWF0ZUluc3RhbmNl
KG1fd2ViVmlldy0+cGFnZSgpLT5jb250ZXh0TWVudUNvbnRyb2xsZXIoKS0+aGl0VGVzdFJlc3Vs
dCgpKSk7CiAgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gZG8gdGhl
IGRlZmF1bHQgYmVmb3JlIGNhbGxpbmcgdGhpcyBkZWxlZ2F0ZSBtZXRob2QKLSAgICBpZiAoRkFJ
TEVEKHVpRGVsZWdhdGUtPmNvbnRleHRNZW51SXRlbXNGb3JFbGVtZW50KG1fd2ViVmlldywgcHJv
cGVydHlCYWcuZ2V0KCksIChPTEVfSEFORExFKShVTE9ORzY0KW1lbnUtPnBsYXRmb3JtRGVzY3Jp
cHRpb24oKSwgKE9MRV9IQU5ETEUqKSZuZXdNZW51KSkpCi0gICAgICAgIHJldHVybiBtZW51LT5w
bGF0Zm9ybURlc2NyaXB0aW9uKCk7Ci0gICAgcmV0dXJuIG5ld01lbnU7CisgICAgaWYgKEZBSUxF
RCh1aURlbGVnYXRlLT5jb250ZXh0TWVudUl0ZW1zRm9yRWxlbWVudChtX3dlYlZpZXcsIHByb3Bl
cnR5QmFnLmdldCgpLCAoT0xFX0hBTkRMRSkoVUxPTkc2NCluYXRpdmVNZW51LCAoT0xFX0hBTkRM
RSopJm5hdGl2ZU1lbnUpKSkgeworICAgICAgICA6OkRlc3Ryb3lNZW51KG5hdGl2ZU1lbnUpOwor
ICAgICAgICByZXR1cm4gbWVudS5yZWxlYXNlKCk7CisgICAgfQorICAgIAorICAgIE93blB0cjxD
b250ZXh0TWVudT4gY3VzdG9taXplZE1lbnUgPSBhZG9wdFB0cihuZXcgQ29udGV4dE1lbnUobmF0
aXZlTWVudSkpOworICAgIDo6RGVzdHJveU1lbnUobmF0aXZlTWVudSk7CisKKyAgICByZXR1cm4g
Y3VzdG9taXplZE1lbnUucmVsZWFzZSgpOwogfQogCiB2b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50
Ojpjb250ZXh0TWVudUl0ZW1TZWxlY3RlZChDb250ZXh0TWVudUl0ZW0qIGl0ZW0sIGNvbnN0IENv
bnRleHRNZW51KiBwYXJlbnRNZW51KQpAQCAtODQsOCArOTIsMTcgQEAgdm9pZCBXZWJDb250ZXh0
TWVudUNsaWVudDo6Y29udGV4dE1lbnVJdAogCiAgICAgQ09NUHRyPFdlYkVsZW1lbnRQcm9wZXJ0
eUJhZz4gcHJvcGVydHlCYWc7CiAgICAgcHJvcGVydHlCYWcuYWRvcHRSZWYoV2ViRWxlbWVudFBy
b3BlcnR5QmFnOjpjcmVhdGVJbnN0YW5jZShtX3dlYlZpZXctPnBhZ2UoKS0+Y29udGV4dE1lbnVD
b250cm9sbGVyKCktPmhpdFRlc3RSZXN1bHQoKSkpOwotICAgICAgICAgICAgCi0gICAgdWlEZWxl
Z2F0ZS0+Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQobV93ZWJWaWV3LCBpdGVtLT5yZWxlYXNlUGxh
dGZvcm1EZXNjcmlwdGlvbigpLCBwcm9wZXJ0eUJhZy5nZXQoKSk7CisKKyAgICAvLyBUaGlzIGNh
bGwgd291bGQgbGVhayB0aGUgTUVOVUlURU1JTkZPJ3Mgc3ViTWVudSBpZiBpdCBoYWQgb25lLCBi
dXQgb24gV2luZG93cywgc3ViTWVudXMgY2FuJ3QgYmUgc2VsZWN0ZWQsIHNvIHRoZXJlIGlzCisg
ICAgLy8gbm8gd2F5IHdlIHdvdWxkIGdldCB0byB0aGlzIHBvaW50LiBBbHNvLCBpdCBjYW4ndCBi
ZSBhIHNlcGFyYXRvciwgYmVjYXVzZSBzZXBhcmF0b3JzIGNhbm5vdCBiZSBzZWxlY3RlZC4KKyAg
ICBBU1NFUlQoaXRlbS0+dHlwZSgpICE9IFN1Ym1lbnVUeXBlKTsKKyAgICBBU1NFUlQoaXRlbS0+
dHlwZSgpICE9IFNlcGFyYXRvclR5cGUpOworCisgICAgLy8gQ29udGV4dE1lbnVJdGVtOjpuYXRp
dmVNZW51SXRlbSBkb2Vzbid0IHNldCB0aGUgZHdUeXBlRGF0YSBvZiB0aGUgTUVOVUlURU1JTkZP
LCBidXQgbm8gV2ViS2l0IGNsaWVudHMKKyAgICAvLyB1c2UgdGhlIHRpdGxlIGluIElXZWJVSURl
bGVnYXRlOjpjb250ZXh0TWVudUl0ZW1TZWxlY3RlZCwgc28gd2UgZG9uJ3QgbmVlZCB0byBwb3B1
bGF0ZSBpdCBoZXJlLgorICAgIE1FTlVJVEVNSU5GTyBzZWxlY3RlZEl0ZW0gPSBpdGVtLT5uYXRp
dmVNZW51SXRlbSgpOworCisgICAgdWlEZWxlZ2F0ZS0+Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQo
bV93ZWJWaWV3LCAmc2VsZWN0ZWRJdGVtLCBwcm9wZXJ0eUJhZy5nZXQoKSk7CiB9CiAKIHZvaWQg
V2ViQ29udGV4dE1lbnVDbGllbnQ6OmRvd25sb2FkVVJMKGNvbnN0IEtVUkwmIHVybCkKSW5kZXg6
IFdlYktpdC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmgJ
KHJldmlzaW9uIDczNjYyKQorKysgV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0
TWVudUNsaWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMyw4ICsyMywxMCBAQAogICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCiAgKi8KIAorI2luY2x1ZGUgPFdlYkNvcmUvQ29udGV4dE1lbnUuaD4KICNpbmNsdWRl
IDxXZWJDb3JlL0NvbnRleHRNZW51Q2xpZW50Lmg+CiAjaW5jbHVkZSA8d3RmL0ZvcndhcmQuaD4K
KyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgogCiBjbGFzcyBXZWJWaWV3OwogCkBAIC0zNCw3
ICszNiw3IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudURlc3Ryb3ll
ZCgpOwogCi0gICAgdmlydHVhbCBITUVOVSBnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcyhX
ZWJDb3JlOjpDb250ZXh0TWVudSopOworICAgIHZpcnR1YWwgUGFzc093blB0cjxXZWJDb3JlOjpD
b250ZXh0TWVudT4gY3VzdG9taXplTWVudShQYXNzT3duUHRyPFdlYkNvcmU6OkNvbnRleHRNZW51
Pik7CiAgICAgdmlydHVhbCB2b2lkIGNvbnRleHRNZW51SXRlbVNlbGVjdGVkKFdlYkNvcmU6OkNv
bnRleHRNZW51SXRlbSosIGNvbnN0IFdlYkNvcmU6OkNvbnRleHRNZW51Kik7CiAgICAgCiAgICAg
dmlydHVhbCB2b2lkIGRvd25sb2FkVVJMKGNvbnN0IFdlYkNvcmU6OktVUkwmKTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76237</attachid>
            <date>2010-12-10 12:30:57 -0800</date>
            <delta_ts>2010-12-14 01:25:27 -0800</delta_ts>
            <desc>[PATCH] Reordering ContextMenu{Item}.h</desc>
            <filename>context_menu_refactoring_win.patch</filename>
            <type>text/plain</type>
            <size>50284</size>
            <attacher name="Brian Weinstein">bweinstein</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDczNzQyKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTEgQEAKKzIwMTAtMTItMTAgIEJyaWFuIFdl
aW5zdGVpbiAgPGJ3ZWluc3RlaW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFR1cm4gb24gVVNFKENST1NTX1BMQVRGT1JNX0NPTlRF
WFRfTUVOVVMpIGZvciBXaW5kb3dzLgorCisgICAgICAgICogd3RmL1BsYXRmb3JtLmg6CisKIDIw
MTAtMTItMTAgIFBhdHJpY2sgR2Fuc3RlcmVyICA8cGFyb2dhQHdlYmtpdC5vcmc+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlkZWwuCkluZGV4OiBKYXZhU2NyaXB0Q29yZS93dGYvUGxh
dGZvcm0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvUGxhdGZvcm0uaAkocmV2
aXNpb24gNzM2NjIpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvUGxhdGZvcm0uaAkod29ya2luZyBj
b3B5KQpAQCAtMTEwNiw2ICsxMTA2LDEwIEBACiAjZGVmaW5lIFdURl9VU0VfUExBVEZPUk1fU1RS
QVRFR0lFUyAxCiAjZW5kaWYKIAorI2lmIFBMQVRGT1JNKFdJTikKKyNkZWZpbmUgV1RGX1VTRV9D
Uk9TU19QTEFURk9STV9DT05URVhUX01FTlVTIDEKKyNlbmRpZgorCiAvKiBHZW9sb2NhdGlvbiBy
ZXF1ZXN0IHBvbGljeS4gcHJlLWVtcHRpdmUgcG9saWN5IGlzIHRvIGFjcXVpcmUgdXNlciBwZXJt
aXNzaW9uIGJlZm9yZSBhY3F1aXJpbmcgbG9jYXRpb24uCiAgICBDbGllbnQgYmFzZWQgaW1wbGVt
ZW50YXRpb25zIHdpbGwgaGF2ZSBvcHRpb24gdG8gY2hvb3NlIGJldHdlZW4gcHJlLWVtcHRpdmUg
YW5kIG5vbnByZS1lbXB0aXZlIHBlcm1pc3Npb24gcG9saWN5LgogICAgcHJlLWVtcHRpdmUgcGVy
bWlzc2lvbiBwb2xpY3kgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBhbGwgY2xpZW50LWJhc2Vk
IGltcGxlbWVudGF0aW9ucy4gKi8KSW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvQ2hhbmdlTG9nCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzUgQEAKKzIwMTAtMTItMDkgIEJyaWFuIFdl
aW5zdGVpbiAgPGJ3ZWluc3RlaW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFByZXAgZm9yIFdlYktpdDI6IENvbnRleHQgbWVudSBz
dXBwb3J0IG9uIFdpbmRvd3MKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTUwNTE0CisgICAgICAgIAorICAgICAgICBCZWZvcmUgdGhpcyBwYXRjaCBDb250
ZXh0TWVudSBvbiBXaW5kb3dzIHdlcmUgYmFja2VkIGJ5IEhNRU5VcywgYW5kIENvbnRleHRNZW51
SXRlbXMKKyAgICAgICAgd2VyZSBiYWNrZWQgYnkgTUVOVUlURU1JTkZPcy4gVGhpcyBtZWFudCB0
aGV5IGNvdWxkbid0IGJlIGNvcGllZCwgYW5kIHRoZXkgbmVlZGVkIHRvCisgICAgICAgIGJlIHRv
IHdvcmsgaW4gV2ViS2l0Mi4KKyAgICAgICAgCisgICAgICAgIFRoaXMgcGF0Y2ggYWRkcyBhIG5l
dyBVU0UgZmxhZyAtIENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMgdGhhdCBhcmUgZm9yIGEg
Y3Jvc3MtcGxhdGZvcm0KKyAgICAgICAgcmVwcmVzZW50YXRpb24gb2YgY29udGV4dCBtZW51cy4g
VGhpcyBwYXRjaCBhbHNvIGhhcyBXaW5kb3dzIGFkb3B0IHRoZW0uCisgICAgICAgIAorICAgICAg
ICBDcm9zcy1wbGF0Zm9ybSBjb250ZXh0IG1lbnVzIGNoYW5nZSB0aGUgQVBJIG9mIGNvbnRleHQg
bWVudXMgYW5kIHRoZSBDb250ZXh0TWVudUNsaWVudC4gVGhlcmUKKyAgICAgICAgaXMgbm8gbW9y
ZSBpZGVhIG9mIGEgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gb3IgYSBQbGF0Zm9ybU1lbnVJdGVt
RGVzY3JpcHRpb24uIE1lbnVzIGFyZSBiYWNrZWQKKyAgICAgICAgYnkgYSBWZWN0b3Igb2YgQ29u
dGV4dE1lbnVJdGVtcywgYW5kIG1lbnUgaXRlbXMgYXJlIGJhY2tlZCBieSB0aGUgdmFyaWFibGVz
IHRoZXkgbmVlZCAoZW5hYmxlZCwgY2hlY2tlZAorICAgICAgICB0aXRsZSwgYWN0aW9uLCB0eXBl
LCBhbmQgc3VibWVudSkuCisgICAgICAgIAorICAgICAgICBUaGlzIHBhdGNoIGFsc28gcmVmYWN0
b3JzIHRoZSBDb250ZXh0TWVudUNsaWVudCBpbnRlcmZhY2UgdG8gdXNlIGEgdmFyaWF0aW9uIG9u
IHRoZSBnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcworICAgICAgICBmdW5jdGlvbiB0byBh
bGxvdyBmb3IgY3VzdG9taXphdGlvbiBvZiB0aGUgY29udGV4dCBtZW51LgorICAgICAgICAKKyAg
ICAgICAgRm9yIG90aGVyIHBvcnRzIHRvIHVzZSBDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVT
LCBhbGwgdGhleSBuZWVkIHRvIGRvIGlzIHdyaXRlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGZyb20K
KyAgICAgICAgYSBDb250ZXh0TWVudSA8LT4gbmF0aXZlIG1lbnUgdHlwZSwgYW5kIENvbnRleHRN
ZW51SXRlbSA8LT4gbmF0aXZlIG1lbnUgaXRlbSB0eXBlLiBGb3IgV2luZG93cywgdGhpcyBpcyBk
b25lCisgICAgICAgIGluIENvbnRleHRNZW51V2luLmNwcCBhbmQgQ29udGV4dE1lbnVJdGVtV2lu
LmNwcC4KKworICAgICAgICBObyBuZXcgdGVzdHMsIG5vIGNoYW5nZSBpbiBiZWhhdmlvci4KKwor
ICAgICAgICAqIFdlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qOiBBZGQgbmV3IGZpbGVzIChv
bmx5IG5lZWRlZCBvbiBXaW5kb3dzIGZvciBub3cpLgorICAgICAgICAqIGxvYWRlci9FbXB0eUNs
aWVudHMuaDoKKyAgICAgICAgKFdlYkNvcmU6OkVtcHR5Q29udGV4dE1lbnVDbGllbnQ6OmN1c3Rv
bWl6ZU1lbnUpOiBEZWZpbmUgdGhpcyBmdW5jdGlvbiBpZiBDUk9TU19QTEFURk9STV9DT05URVhU
X01FTlVTCisgICAgICAgICAgICBpcyBvbi4KKyAgICAgICAgKiBwYWdlL0NvbnRleHRNZW51Q2xp
ZW50Lmg6IERpdHRvLiAKKyAgICAgICAgKiBwYWdlL0NvbnRleHRNZW51Q29udHJvbGxlci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUNvbnRyb2xsZXI6OnNob3dDb250ZXh0TWVu
dSk6IENhbGwgY3VzdG9taXplTWVudSBpbnN0ZWFkIG9mIAorICAgICAgICAgICAgZ2V0Q3VzdG9t
TWVudUZyb21EZWZhdWx0SXRlbXMgaWYgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUyBpcyBv
bi4KKyAgICAgICAgKiBwbGF0Zm9ybS9Db250ZXh0TWVudS5jcHA6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZTo6Q29udGV4dE1lbnU6OkNvbnRleHRNZW51KTogRW1wdHkgY29uc3RydWN0b3IuCisg
ICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudTo6c2V0SXRlbXMpOiBTZXRzIHRoZSBpdGVtcyBp
biB0aGUgbWVudS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjppdGVtcyk6IFJldHVy
bnMgdGhlIGl0ZW1zIGluIHRoZSBtZW51LgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6
Oml0ZW1BdEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6Oml0ZW1XaXRoQWN0aW9uSW5NZW51KTog
UmV0dXJucyB0aGUgaXRlbSB3aXRoIHRoZSBjb3JyZWN0IGFjdGlvbiwgcmVjdXJzaXZlbHkgZGVz
Y2VuZGluZworICAgICAgICAgICAgaW50byBzdWJtZW51cy4KKyAgICAgICAgKFdlYkNvcmU6OkNv
bnRleHRNZW51OjppdGVtV2l0aEFjdGlvbik6IENhbGxzIHRocm91Z2ggdG8gaXRlbVdpdGhBY3Rp
b25Jbk1lbnUuCisgICAgICAgICogcGxhdGZvcm0vQ29udGV4dE1lbnUuaDogQWRkZWQgYSBuZXcg
c2V0IG9mIGZ1bmN0aW9ucyBhbmQgbWVtYmVyIHZhcmlhYmxlcyB0aGF0IGFyZSBkZWZpbmVkIGZv
cgorICAgICAgICAgICAgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUy4KKyAgICAgICAgKFdl
YkNvcmU6OkNvbnRleHRNZW51OjphcHBlbmRJdGVtKTogQXBwZW5kcyBhbiBpdGVtIHRvIHRoZSBt
ZW51LgorICAgICAgICAqIHBsYXRmb3JtL0NvbnRleHRNZW51SXRlbS5jcHA6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0pOgorICAgICAg
ICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjp+Q29udGV4dE1lbnVJdGVtKToKKyAgICAgICAg
KFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6c2V0U3ViTWVudSk6CisgICAgICAgICogcGxhdGZv
cm0vQ29udGV4dE1lbnVJdGVtLmg6CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06
OnR5cGUpOiBSZXR1cm5zIHRoZSB0eXBlLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJ
dGVtOjpzZXRUeXBlKTogU2V0cyB0aGUgdHlwZS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRN
ZW51SXRlbTo6YWN0aW9uKTogUmV0dXJucyB0aGUgYWN0aW9uLgorICAgICAgICAoV2ViQ29yZTo6
Q29udGV4dE1lbnVJdGVtOjpzZXRBY3Rpb24pOiBTZXRzIHRoZSBhY3Rpb24uCisgICAgICAgIChX
ZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnRpdGxlKTogUmV0dXJucyB0aGUgdGl0bGUuCisgICAg
ICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnNldFRpdGxlKTogU2V0cyB0aGUgdGl0bGUu
CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OmNoZWNrZWQpOiBSZXR1cm5zIHdo
ZXRoZXIgb3Igbm90IHRoZSBtZW51IGl0ZW0gaXMgY2hlY2tlZC4KKyAgICAgICAgKFdlYkNvcmU6
OkNvbnRleHRNZW51SXRlbTo6c2V0Q2hlY2tlZCk6IFNldHMgd2hldGhlciBvdCBub3QgdGhlIG1l
bnUgaXRlbSBpcyBjaGVja2VkLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpl
bmFibGVkKTogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWVudSBpdGVtIGlzIGVuYWJsZWQu
CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnNldEVuYWJsZWQpOiBTZXRzIHdo
ZXRoZXIgb3Igbm90IHRoZSBtZW51IGl0ZW0gaXMgZW5hYmxlZC4KKyAgICAgICAgKFdlYkNvcmU6
OkNvbnRleHRNZW51SXRlbTo6c3VibWVudSk6IFJldHVybnMgdGhlIHN1Ym1lbnUuCisgICAgICAg
ICogcGxhdGZvcm0vUGxhdGZvcm1NZW51RGVzY3JpcHRpb24uaDogUmVtb3ZlIHRoZSBpZGVhIGlm
IGEgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gaWYgCisgICAgICAgICAgICBDUk9TU19QTEFURk9S
TV9DT05URVhUX01FTlVTIGlzIG9uLgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9Db250ZXh0TWVu
dUl0ZW1XaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpDb250ZXh0
TWVudUl0ZW0pOiBDcmVhdGVzIGEgQ29udGV4dE1lbnVJdGVtIGZyb20gYSBNRU5VSVRFTUlORk8u
CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06Om5hdGl2ZU1lbnVJdGVtKTogQ3Jl
YXRlcyBhbmQgcmV0dXJucyBhIE1FTlVJVEVNSU5GTy4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4v
Q29udGV4dE1lbnVXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6OkNvbnRl
eHRNZW51KTogQ3JlYXRlcyBhIENvbnRleHRNZW51IGZyb20gYW4gSE1FTlUuCisgICAgICAgIChX
ZWJDb3JlOjpDb250ZXh0TWVudTo6bmF0aXZlTWVudSk6IENyZWF0ZXMgYW5kIHJldHVybnMgYW4g
SE1FTlUuCisKIDIwMTAtMTItMDkgIERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29tPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IFNhbSBXZWluaWcuCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUudmNw
cm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ov
V2ViQ29yZS52Y3Byb2oJKHJldmlzaW9uIDczNjYyKQorKysgV2ViQ29yZS9XZWJDb3JlLnZjcHJv
ai9XZWJDb3JlLnZjcHJvagkod29ya2luZyBjb3B5KQpAQCAtMjUzMTMsMTAgKzI1MzEzLDE4IEBA
CiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxDb250ZW50VHlwZS5oIgogCQkJCT4KIAkJ
CTwvRmlsZT4KKyAgICAgICAgICAgIDxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9y
bVxDb250ZXh0TWVudS5jcHAiCisJCQkJPgorCQkJPC9GaWxlPgogCQkJPEZpbGUKIAkJCQlSZWxh
dGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXENvbnRleHRNZW51LmgiCiAJCQkJPgogCQkJPC9GaWxlPgor
ICAgICAgICAgICAgPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXENvbnRleHRN
ZW51SXRlbS5jcHAiCisJCQkJPgorCQkJPC9GaWxlPgogCQkJPEZpbGUKIAkJCQlSZWxhdGl2ZVBh
dGg9Ii4uXHBsYXRmb3JtXENvbnRleHRNZW51SXRlbS5oIgogCQkJCT4KSW5kZXg6IFdlYkNvcmUv
bG9hZGVyL0VtcHR5Q2xpZW50cy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvbG9hZGVyL0VtcHR5
Q2xpZW50cy5oCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYkNvcmUvbG9hZGVyL0VtcHR5Q2xpZW50
cy5oCSh3b3JraW5nIGNvcHkpCkBAIC01MDEsNyArNTAxLDExIEBAIHB1YmxpYzoKICAgICB2aXJ0
dWFsIH5FbXB0eUNvbnRleHRNZW51Q2xpZW50KCkgeyAgfQogICAgIHZpcnR1YWwgdm9pZCBjb250
ZXh0TWVudURlc3Ryb3llZCgpIHsgfQogCisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRf
TUVOVVMpCisgICAgdmlydHVhbCBQYXNzT3duUHRyPENvbnRleHRNZW51PiBjdXN0b21pemVNZW51
KFBhc3NPd25QdHI8Q29udGV4dE1lbnU+KSB7IHJldHVybiAwOyB9CisjZWxzZQogICAgIHZpcnR1
YWwgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gZ2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMo
Q29udGV4dE1lbnUqKSB7IHJldHVybiAwOyB9CisjZW5kaWYKICAgICB2aXJ0dWFsIHZvaWQgY29u
dGV4dE1lbnVJdGVtU2VsZWN0ZWQoQ29udGV4dE1lbnVJdGVtKiwgY29uc3QgQ29udGV4dE1lbnUq
KSB7IH0KIAogICAgIHZpcnR1YWwgdm9pZCBkb3dubG9hZFVSTChjb25zdCBLVVJMJikgeyB9Cklu
ZGV4OiBXZWJDb3JlL3BhZ2UvQ29udGV4dE1lbnVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BhZ2UvQ29udGV4dE1lbnVDbGllbnQuaAkocmV2aXNpb24gNzM2NjIpCisrKyBXZWJDb3Jl
L3BhZ2UvQ29udGV4dE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMjYsMTEgKzI2LDEy
IEBACiAjaWZuZGVmIENvbnRleHRNZW51Q2xpZW50X2gKICNkZWZpbmUgQ29udGV4dE1lbnVDbGll
bnRfaAogCisjaW5jbHVkZSAiQ29udGV4dE1lbnUuaCIKICNpbmNsdWRlICJQbGF0Zm9ybU1lbnVE
ZXNjcmlwdGlvbi5oIgogI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CisjaW5jbHVkZSA8d3RmL1Bh
c3NPd25QdHIuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewotICAgIGNsYXNzIENvbnRleHRNZW51
OwogICAgIGNsYXNzIENvbnRleHRNZW51SXRlbTsKICAgICBjbGFzcyBGcmFtZTsKICAgICBjbGFz
cyBIaXRUZXN0UmVzdWx0OwpAQCAtNDEsNyArNDIsMTIgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewog
ICAgICAgICB2aXJ0dWFsIH5Db250ZXh0TWVudUNsaWVudCgpIHsgIH0KICAgICAgICAgdmlydHVh
bCB2b2lkIGNvbnRleHRNZW51RGVzdHJveWVkKCkgPSAwOwogICAgICAgICAKKyNpZiBVU0UoQ1JP
U1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKyAgICAgICAgdmlydHVhbCBQYXNzT3duUHRyPENv
bnRleHRNZW51PiBjdXN0b21pemVNZW51KFBhc3NPd25QdHI8Q29udGV4dE1lbnU+KSA9IDA7Cisj
ZWxzZQogICAgICAgICB2aXJ0dWFsIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGdldEN1c3RvbU1l
bnVGcm9tRGVmYXVsdEl0ZW1zKENvbnRleHRNZW51KikgPSAwOworI2VuZGlmCisKICAgICAgICAg
dmlydHVhbCB2b2lkIGNvbnRleHRNZW51SXRlbVNlbGVjdGVkKENvbnRleHRNZW51SXRlbSosIGNv
bnN0IENvbnRleHRNZW51KikgPSAwOwogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBkb3dubG9hZFVS
TChjb25zdCBLVVJMJiB1cmwpID0gMDsKSW5kZXg6IFdlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNv
bnRyb2xsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNvbnRy
b2xsZXIuY3BwCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNv
bnRyb2xsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDQsOCArMTQ0LDEzIEBAIHZvaWQgQ29u
dGV4dE1lbnVDb250cm9sbGVyOjpzaG93Q29udGV4dE0KICAgICBpZiAobV9wYWdlLT5pbnNwZWN0
b3JDb250cm9sbGVyKCktPmVuYWJsZWQoKSkKICAgICAgICAgYWRkSW5zcGVjdEVsZW1lbnRJdGVt
KCk7CiAjZW5kaWYKKworI2lmIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQorICAg
IG1fY29udGV4dE1lbnUgPSBtX2NsaWVudC0+Y3VzdG9taXplTWVudShtX2NvbnRleHRNZW51LnJl
bGVhc2UoKSk7CisjZWxzZQogICAgIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGN1c3RvbU1lbnUg
PSBtX2NsaWVudC0+Z2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMobV9jb250ZXh0TWVudS5n
ZXQoKSk7CiAgICAgbV9jb250ZXh0TWVudS0+c2V0UGxhdGZvcm1EZXNjcmlwdGlvbihjdXN0b21N
ZW51KTsKKyNlbmRpZgogICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOwogfQogCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL0NvbnRleHRNZW51LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZv
cm0vQ29udGV4dE1lbnUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDYxIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51LmgiCisKKyNp
ZiBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitDb250ZXh0TWVudTo6Q29udGV4dE1lbnUoKQoreworfQorCitzdGF0aWMgY29uc3QgQ29u
dGV4dE1lbnVJdGVtKiBmaW5kSXRlbVdpdGhBY3Rpb24odW5zaWduZWQgYWN0aW9uLCBjb25zdCBW
ZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYgaXRlbXMpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBDb250ZXh0TWVudUl0ZW0m
IGl0ZW0gPSBpdGVtc1tpXTsKKyAgICAgICAgaWYgKGl0ZW0uYWN0aW9uKCkgPT0gYWN0aW9uKQor
ICAgICAgICAgICAgcmV0dXJuICZpdGVtOworICAgICAgICBpZiAoaXRlbS50eXBlKCkgIT0gU3Vi
bWVudVR5cGUpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGNvbnN0IENvbnRl
eHRNZW51SXRlbSogc3ViTWVudUl0ZW0gPSBmaW5kSXRlbVdpdGhBY3Rpb24oYWN0aW9uLCBjb25z
dF9jYXN0PFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+Jj4oaXRlbS5zdWJNZW51SXRlbXMoKSkpKQor
ICAgICAgICAgICAgcmV0dXJuIHN1Yk1lbnVJdGVtOworICAgIH0KKworICAgIHJldHVybiAwOwor
fQorCitDb250ZXh0TWVudUl0ZW0qIENvbnRleHRNZW51OjppdGVtV2l0aEFjdGlvbih1bnNpZ25l
ZCBhY3Rpb24pCit7CisgICAgLy8gRklYTUU6IFdoZW4gbW9yZSBwbGF0Zm9ybXMgc3dpdGNoIG92
ZXIsIHRoaXMgZnVjbnRpb24gc2hvdWxkIHJldHVybiBhIGNvbnN0IENvbnRleHRNZW51SXRlbSon
cywgYW5kIHRoZSBjb25zdF9jYXN0CisgICAgLy8gd29uJ3QgYmUgbmVlZGVkIGFueW1vcmUuCisg
ICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q29udGV4dE1lbnVJdGVtKj4oZmluZEl0ZW1XaXRoQWN0aW9u
KGFjdGlvbiwgbV9pdGVtcykpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRp
ZiAvLyBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vQ29udGV4dE1lbnUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL0NvbnRl
eHRNZW51LmgJKHJldmlzaW9uIDczNjYyKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVu
dS5oCSh3b3JraW5nIGNvcHkpCkBAIC00OCw2ICs0OCwyOCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAgICAgewogICAgIHB1YmxpYzoKICAgICAgICAgQ29udGV4dE1lbnUoKTsKKworICAgICAgICBD
b250ZXh0TWVudUl0ZW0qIGl0ZW1XaXRoQWN0aW9uKHVuc2lnbmVkKTsKKworI2lmIFVTRShDUk9T
U19QTEFURk9STV9DT05URVhUX01FTlVTKQorI2lmIFBMQVRGT1JNKFdJTikKKyAgICAgICAgdHlw
ZWRlZiBITUVOVSBOYXRpdmVNZW51OworI2VuZGlmCisgICAgICAgIGV4cGxpY2l0IENvbnRleHRN
ZW51KE5hdGl2ZU1lbnUpOworCisgICAgICAgIE5hdGl2ZU1lbnUgbmF0aXZlTWVudSgpIGNvbnN0
OworCisgICAgICAgIHN0YXRpYyBOYXRpdmVNZW51IGNyZWF0ZU5hdGl2ZU1lbnVGcm9tSXRlbXMo
Y29uc3QgVmVjdG9yPENvbnRleHRNZW51SXRlbT4mKTsKKyAgICAgICAgc3RhdGljIHZvaWQgZ2V0
Q29udGV4dE1lbnVJdGVtcyhOYXRpdmVNZW51LCBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYpOwor
CisgICAgICAgIC8vIEZJWE1FOiBXaGVuIG1vcmUgcGxhdGZvcm1zIHN3aXRjaCBvdmVyLCB0aGlz
IHNob3VsZCByZXR1cm4gY29uc3QgQ29udGV4dE1lbnVJdGVtKidzLgorICAgICAgICBDb250ZXh0
TWVudUl0ZW0qIGl0ZW1BdEluZGV4KHVuc2lnbmVkIGluZGV4KSB7IHJldHVybiAmbV9pdGVtc1tp
bmRleF07IH0KKworICAgICAgICB2b2lkIHNldEl0ZW1zKGNvbnN0IFZlY3RvcjxDb250ZXh0TWVu
dUl0ZW0+JiBpdGVtcykgeyBtX2l0ZW1zID0gaXRlbXM7IH0KKyAgICAgICAgY29uc3QgVmVjdG9y
PENvbnRleHRNZW51SXRlbT4mIGl0ZW1zKCkgY29uc3QgeyByZXR1cm4gbV9pdGVtczsgfQorCisg
ICAgICAgIHZvaWQgYXBwZW5kSXRlbShjb25zdCBDb250ZXh0TWVudUl0ZW0mIGl0ZW0pIHsgbV9p
dGVtcy5hcHBlbmQoaXRlbSk7IH0gCisjZWxzZQogICAgICAgICBDb250ZXh0TWVudShjb25zdCBQ
bGF0Zm9ybU1lbnVEZXNjcmlwdGlvbik7CiAgICAgICAgIH5Db250ZXh0TWVudSgpOwogCkBAIC02
MywxMCArODUsMTcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB2b2lkIHNldFBsYXRm
b3JtRGVzY3JpcHRpb24oUGxhdGZvcm1NZW51RGVzY3JpcHRpb24pOwogCiAgICAgICAgIFBsYXRm
b3JtTWVudURlc2NyaXB0aW9uIHJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCk7CisKICNpZiBQ
TEFURk9STShXWCkKICAgICAgICAgc3RhdGljIENvbnRleHRNZW51SXRlbSogaXRlbVdpdGhJZChp
bnQpOwogI2VuZGlmCisKKyNlbmRpZiAvLyBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5V
UykKKwogICAgIHByaXZhdGU6CisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMp
CisgICAgICAgIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+IG1faXRlbXM7CisjZWxzZQogI2lmIFBM
QVRGT1JNKE1BQykKICAgICAgICAgLy8gS2VlcCB0aGlzIGluIHN5bmMgd2l0aCB0aGUgUGxhdGZv
cm1NZW51RGVzY3JpcHRpb24gdHlwZWRlZgogICAgICAgICBSZXRhaW5QdHI8TlNNdXRhYmxlQXJy
YXk+IG1fcGxhdGZvcm1EZXNjcmlwdGlvbjsKQEAgLTgzLDEwICsxMTIsMTQgQEAgbmFtZXNwYWNl
IFdlYkNvcmUgewogICAgICAgICB1bnNpZ25lZCBtX2l0ZW1Db3VudDsKICNlbmRpZgogI2VuZGlm
CisKKyNlbmRpZiAvLyBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKICAgICB9Owog
CisjaWYgIVVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQogVmVjdG9yPENvbnRleHRN
ZW51SXRlbT4gY29udGV4dE1lbnVJdGVtVmVjdG9yKFBsYXRmb3JtTWVudURlc2NyaXB0aW9uKTsK
IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIHBsYXRmb3JtTWVudURlc2NyaXB0aW9uKFZlY3RvcjxD
b250ZXh0TWVudUl0ZW0+Jik7CisjZW5kaWYKIAogfQogCkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L0NvbnRleHRNZW51SXRlbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9Db250
ZXh0TWVudUl0ZW0uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0
TWVudUl0ZW0uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09O
VFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
IElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICog
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDb250ZXh0TWVudUl0ZW0uaCIKKworI2lu
Y2x1ZGUgIkNvbnRleHRNZW51LmgiCisKKyNpZiBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9N
RU5VUykKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitDb250ZXh0TWVudUl0ZW06OkNvbnRleHRN
ZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUsIENvbnRleHRNZW51QWN0aW9uIGFjdGlv
biwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ29udGV4dE1lbnUqIHN1Yk1lbnUpCisgICAgOiBtX3R5
cGUodHlwZSkKKyAgICAsIG1fYWN0aW9uKGFjdGlvbikKKyAgICAsIG1fdGl0bGUodGl0bGUpCisg
ICAgLCBtX2VuYWJsZWQodHJ1ZSkKKyAgICAsIG1fY2hlY2tlZChmYWxzZSkKK3sKKyAgICBzZXRT
dWJNZW51KHN1Yk1lbnUpOworfQorCitDb250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShD
b250ZXh0TWVudUl0ZW1UeXBlIHR5cGUsIENvbnRleHRNZW51QWN0aW9uIGFjdGlvbiwgY29uc3Qg
U3RyaW5nJiB0aXRsZSwgYm9vbCBlbmFibGVkLCBib29sIGNoZWNrZWQpCisgICAgOiBtX3R5cGUo
dHlwZSkKKyAgICAsIG1fYWN0aW9uKGFjdGlvbikKKyAgICAsIG1fdGl0bGUodGl0bGUpCisgICAg
LCBtX2VuYWJsZWQoZW5hYmxlZCkKKyAgICAsIG1fY2hlY2tlZChjaGVja2VkKQoreworfQorICAg
ICAgICAKK0NvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51QWN0aW9u
IGFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgYm9vbCBlbmFibGVkLCBib29sIGNoZWNrZWQs
IGNvbnN0IFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBzdWJNZW51SXRlbXMpCisgICAgOiBtX3R5
cGUoU3VibWVudVR5cGUpCisgICAgLCBtX2FjdGlvbihhY3Rpb24pCisgICAgLCBtX3RpdGxlKHRp
dGxlKQorICAgICwgbV9lbmFibGVkKGVuYWJsZWQpCisgICAgLCBtX2NoZWNrZWQoY2hlY2tlZCkK
KyAgICAsIG1fc3ViTWVudUl0ZW1zKHN1Yk1lbnVJdGVtcykKK3sKK30KKworQ29udGV4dE1lbnVJ
dGVtOjp+Q29udGV4dE1lbnVJdGVtKCkKK3sKK30KKwordm9pZCBDb250ZXh0TWVudUl0ZW06OnNl
dFN1Yk1lbnUoQ29udGV4dE1lbnUqIHN1Yk1lbnUpCit7CisgICAgaWYgKHN1Yk1lbnUpIHsKKyAg
ICAgICAgbV90eXBlID0gU3VibWVudVR5cGU7CisgICAgICAgIG1fc3ViTWVudUl0ZW1zID0gc3Vi
TWVudS0+aXRlbXMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX3R5cGUgPSBBY3Rpb25UeXBl
OworICAgICAgICBtX3N1Yk1lbnVJdGVtcy5jbGVhcigpOworICAgIH0KK30KKwordm9pZCBDb250
ZXh0TWVudUl0ZW06OnNldFR5cGUoQ29udGV4dE1lbnVJdGVtVHlwZSB0eXBlKQoreworICAgIG1f
dHlwZSA9IHR5cGU7Cit9CisKK0NvbnRleHRNZW51SXRlbVR5cGUgQ29udGV4dE1lbnVJdGVtOjp0
eXBlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV90eXBlOworfQorCit2b2lkIENvbnRleHRNZW51
SXRlbTo6c2V0QWN0aW9uKENvbnRleHRNZW51QWN0aW9uIGFjdGlvbikKK3sKKyAgICBtX2FjdGlv
biA9IGFjdGlvbjsKK30KKworQ29udGV4dE1lbnVBY3Rpb24gQ29udGV4dE1lbnVJdGVtOjphY3Rp
b24oKSBjb25zdAoreworICAgIHJldHVybiBtX2FjdGlvbjsKK30KKwordm9pZCBDb250ZXh0TWVu
dUl0ZW06OnNldENoZWNrZWQoYm9vbCBjaGVja2VkKQoreworICAgIG1fY2hlY2tlZCA9IGNoZWNr
ZWQ7Cit9CisKK2Jvb2wgQ29udGV4dE1lbnVJdGVtOjpjaGVja2VkKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9jaGVja2VkOworfQorCit2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0RW5hYmxlZChi
b29sIGVuYWJsZWQpCit7CisgICAgbV9lbmFibGVkID0gZW5hYmxlZDsKK30KKworYm9vbCBDb250
ZXh0TWVudUl0ZW06OmVuYWJsZWQoKSBjb25zdAoreworICAgIHJldHVybiBtX2VuYWJsZWQ7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVTRShDUk9TU19QTEFURk9S
TV9DT05URVhUX01FTlVTKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudUl0ZW0u
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51SXRlbS5oCShyZXZp
c2lvbiA3MzY2MikKKysrIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnVJdGVtLmgJKHdvcmtp
bmcgY29weSkKQEAgLTQwLDcgKzQwLDcgQEAKIGNsYXNzIE5TTWVudUl0ZW07CiAjZW5kaWYKICNl
bGlmIFBMQVRGT1JNKFdJTikKLXR5cGVkZWYgc3RydWN0IHRhZ01FTlVJVEVNSU5GT1cqIExQTUVO
VUlURU1JTkZPOwordHlwZWRlZiBzdHJ1Y3QgdGFnTUVOVUlURU1JTkZPVyBNRU5VSVRFTUlORk87
CiAjZWxpZiBQTEFURk9STShHVEspCiB0eXBlZGVmIHN0cnVjdCBfR3RrTWVudUl0ZW0gR3RrTWVu
dUl0ZW07CiAjZWxpZiBQTEFURk9STShRVCkKQEAgLTE2Niw4ICsxNjYsNiBAQCBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKICNpZiBQTEFURk9STShNQUMpCiAgICAgdHlwZWRlZiBOU01lbnVJdGVtKiBQ
bGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb247Ci0jZWxpZiBQTEFURk9STShXSU4pCi0gICAgdHlw
ZWRlZiBMUE1FTlVJVEVNSU5GTyBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb247CiAjZWxpZiBQ
TEFURk9STShRVCkKICAgICBzdHJ1Y3QgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIHsKICAg
ICAgICAgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uKCkKQEAgLTI1NCw0OSArMjUyLDc5IEBA
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogICAgIGNsYXNzIENvbnRleHRNZW51SXRlbSA6IHB1Ymxp
YyBGYXN0QWxsb2NCYXNlIHsKICAgICBwdWJsaWM6CisgICAgICAgIENvbnRleHRNZW51SXRlbShD
b250ZXh0TWVudUl0ZW1UeXBlLCBDb250ZXh0TWVudUFjdGlvbiwgY29uc3QgU3RyaW5nJiwgQ29u
dGV4dE1lbnUqIHN1Yk1lbnUgPSAwKTsKKyAgICAgICAgQ29udGV4dE1lbnVJdGVtKENvbnRleHRN
ZW51SXRlbVR5cGUsIENvbnRleHRNZW51QWN0aW9uLCBjb25zdCBTdHJpbmcmLCBib29sIGVuYWJs
ZWQsIGJvb2wgY2hlY2tlZCk7CisKKyAgICAgICAgfkNvbnRleHRNZW51SXRlbSgpOworCisgICAg
ICAgIHZvaWQgc2V0VHlwZShDb250ZXh0TWVudUl0ZW1UeXBlKTsKKyAgICAgICAgQ29udGV4dE1l
bnVJdGVtVHlwZSB0eXBlKCkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBzZXRBY3Rpb24oQ29udGV4
dE1lbnVBY3Rpb24pOworICAgICAgICBDb250ZXh0TWVudUFjdGlvbiBhY3Rpb24oKSBjb25zdDsK
KworICAgICAgICB2b2lkIHNldENoZWNrZWQoYm9vbCA9IHRydWUpOworICAgICAgICBib29sIGNo
ZWNrZWQoKSBjb25zdDsKKworICAgICAgICB2b2lkIHNldEVuYWJsZWQoYm9vbCA9IHRydWUpOwor
ICAgICAgICBib29sIGVuYWJsZWQoKSBjb25zdDsKKworICAgICAgICB2b2lkIHNldFN1Yk1lbnUo
Q29udGV4dE1lbnUqKTsKKworI2lmIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQor
I2lmIFBMQVRGT1JNKFdJTikKKyAgICAgICAgdHlwZWRlZiBNRU5VSVRFTUlORk8gTmF0aXZlSXRl
bTsKKyNlbmRpZgorICAgICAgICBDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVBY3Rpb24sIGNv
bnN0IFN0cmluZyYsIGJvb2wgZW5hYmxlZCwgYm9vbCBjaGVja2VkLCBjb25zdCBWZWN0b3I8Q29u
dGV4dE1lbnVJdGVtPiYgc3ViTWVudUl0ZW1zKTsKKyAgICAgICAgZXhwbGljaXQgQ29udGV4dE1l
bnVJdGVtKGNvbnN0IE5hdGl2ZUl0ZW0mKTsKKworICAgICAgICAvLyBPbiBXaW5kb3dzLCB0aGUg
dGl0bGUgKGR3VHlwZURhdGEgb2YgdGhlIE1FTlVJVEVNSU5GTykgaXMgbm90IHNldCBpbiB0aGlz
IGZ1bmN0aW9uLiBDYWxsZXJzIGNhbiBzZXQgdGhlIHRpdGxlIHRoZW1zZWx2ZXMsCisgICAgICAg
IC8vIGFuZCBoYW5kbGUgdGhlIGxpZmV0aW1lIG9mIHRoZSB0aXRsZSwgaWYgdGhleSBuZWVkIGl0
LgorICAgICAgICBOYXRpdmVJdGVtIG5hdGl2ZU1lbnVJdGVtKCkgY29uc3Q7CisKKyAgICAgICAg
dm9pZCBzZXRUaXRsZShjb25zdCBTdHJpbmcmIHRpdGxlKSB7IG1fdGl0bGUgPSB0aXRsZTsgfQor
ICAgICAgICBjb25zdCBTdHJpbmcmIHRpdGxlKCkgY29uc3QgeyByZXR1cm4gbV90aXRsZTsgfQor
CisgICAgICAgIGNvbnN0IFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBzdWJNZW51SXRlbXMoKSBj
b25zdCB7IHJldHVybiBtX3N1Yk1lbnVJdGVtczsgfQorI2Vsc2UKKyAgICBwdWJsaWM6CiAgICAg
ICAgIENvbnRleHRNZW51SXRlbShQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24pOwogICAgICAg
ICBDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnUqIHN1Yk1lbnUgPSAwKTsKLSAgICAgICAgQ29u
dGV4dE1lbnVJdGVtKENvbnRleHRNZW51SXRlbVR5cGUgdHlwZSwgQ29udGV4dE1lbnVBY3Rpb24g
YWN0aW9uLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBDb250ZXh0TWVudSogc3ViTWVudSA9IDApOwot
Ci0gICAgICAgIENvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlLCBDb250ZXh0TWVu
dUFjdGlvbiwgY29uc3QgU3RyaW5nJiwgYm9vbCBlbmFibGVkLCBib29sIGNoZWNrZWQpOwogICAg
ICAgICBDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVBY3Rpb24sIGNvbnN0IFN0cmluZyYsIGJv
b2wgZW5hYmxlZCwgYm9vbCBjaGVja2VkLCBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYgc3VibWVu
dUl0ZW1zKTsKKwogI2lmIFBMQVRGT1JNKEdUSykKICAgICAgICAgQ29udGV4dE1lbnVJdGVtKEd0
a01lbnVJdGVtKik7CiAjZW5kaWYKLSAgICAgICAgfkNvbnRleHRNZW51SXRlbSgpOwogCiAgICAg
ICAgIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbiByZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlv
bigpOwogCi0gICAgICAgIENvbnRleHRNZW51SXRlbVR5cGUgdHlwZSgpIGNvbnN0OwotICAgICAg
ICB2b2lkIHNldFR5cGUoQ29udGV4dE1lbnVJdGVtVHlwZSk7Ci0KLSAgICAgICAgQ29udGV4dE1l
bnVBY3Rpb24gYWN0aW9uKCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgc2V0QWN0aW9uKENvbnRleHRN
ZW51QWN0aW9uKTsKLQogICAgICAgICBTdHJpbmcgdGl0bGUoKSBjb25zdDsKICAgICAgICAgdm9p
ZCBzZXRUaXRsZShjb25zdCBTdHJpbmcmKTsKIAogICAgICAgICBQbGF0Zm9ybU1lbnVEZXNjcmlw
dGlvbiBwbGF0Zm9ybVN1Yk1lbnUoKSBjb25zdDsKLSAgICAgICAgdm9pZCBzZXRTdWJNZW51KENv
bnRleHRNZW51Kik7CiAgICAgICAgIHZvaWQgc2V0U3ViTWVudShWZWN0b3I8Q29udGV4dE1lbnVJ
dGVtPiYpOwogCi0gICAgICAgIHZvaWQgc2V0Q2hlY2tlZChib29sID0gdHJ1ZSk7Ci0gICAgICAg
IGJvb2wgY2hlY2tlZCgpIGNvbnN0OwotCi0gICAgICAgIHZvaWQgc2V0RW5hYmxlZChib29sID0g
dHJ1ZSk7Ci0gICAgICAgIGJvb2wgZW5hYmxlZCgpIGNvbnN0OwotCiAgICAgICAgIC8vIEZJWE1F
OiBEbyB3ZSBuZWVkIGEga2V5Ym9hcmQgYWNjZWxlcmF0b3IgaGVyZT8KICNpZiBQTEFURk9STShH
VEspCiAgICAgICAgIHN0YXRpYyBHdGtNZW51SXRlbSogY3JlYXRlTmF0aXZlTWVudUl0ZW0oY29u
c3QgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uJik7CiAjZW5kaWYKKyNlbmRpZiAvLyBVU0Uo
Q1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKIAogICAgIHByaXZhdGU6CisjaWYgVVNFKENS
T1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCisgICAgICAgIFN0cmluZyBtX3RpdGxlOworICAg
ICAgICBib29sIG1fZW5hYmxlZDsKKyAgICAgICAgYm9vbCBtX2NoZWNrZWQ7CisgICAgICAgIENv
bnRleHRNZW51QWN0aW9uIG1fYWN0aW9uOworICAgICAgICBDb250ZXh0TWVudUl0ZW1UeXBlIG1f
dHlwZTsKKyAgICAgICAgVmVjdG9yPENvbnRleHRNZW51SXRlbT4gbV9zdWJNZW51SXRlbXM7Cisj
ZWxzZQogI2lmIFBMQVRGT1JNKE1BQykKICAgICAgICAgUmV0YWluUHRyPE5TTWVudUl0ZW0+IG1f
cGxhdGZvcm1EZXNjcmlwdGlvbjsKICNlbHNlCiAgICAgICAgIFBsYXRmb3JtTWVudUl0ZW1EZXNj
cmlwdGlvbiBtX3BsYXRmb3JtRGVzY3JpcHRpb247CiAjZW5kaWYKKyNlbmRpZiAvLyBVU0UoQ1JP
U1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKICAgICB9OwogCiB9CkluZGV4OiBXZWJDb3JlL3Bs
YXRmb3JtL1BsYXRmb3JtTWVudURlc2NyaXB0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbi5oCShyZXZpc2lvbiA3MzY2MikKKysrIFdl
YkNvcmUvcGxhdGZvcm0vUGxhdGZvcm1NZW51RGVzY3JpcHRpb24uaAkod29ya2luZyBjb3B5KQpA
QCAtMzIsOCArMzIsNiBAQAogI2Vsc2UKIGNsYXNzIE5TTXV0YWJsZUFycmF5OwogI2VuZGlmCi0j
ZWxpZiBQTEFURk9STShXSU4pCi10eXBlZGVmIHN0cnVjdCBITUVOVV9fKiBITUVOVTsKICNlbGlm
IFBMQVRGT1JNKFFUKQogI2luY2x1ZGUgPHFsaXN0Lmg+CiAjZWxpZiBQTEFURk9STShHVEspCkBA
IC00NiwxMCArNDQsOSBAQCBjbGFzcyBCTWVudTsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCisj
aWYgIVVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQogI2lmIFBMQVRGT1JNKE1BQykK
ICAgICB0eXBlZGVmIE5TTXV0YWJsZUFycmF5KiBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbjsKLSNl
bGlmIFBMQVRGT1JNKFdJTikKLSAgICB0eXBlZGVmIEhNRU5VIFBsYXRmb3JtTWVudURlc2NyaXB0
aW9uOwogI2VsaWYgUExBVEZPUk0oUVQpCiAgICAgY2xhc3MgQ29udGV4dE1lbnVJdGVtOwogICAg
IHR5cGVkZWYgY29uc3QgUUxpc3Q8Q29udGV4dE1lbnVJdGVtPiogUGxhdGZvcm1NZW51RGVzY3Jp
cHRpb247CkBAIC02Miw2ICs1OSw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICNlbHNlCiAgICAg
dHlwZWRlZiB2b2lkKiBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbjsKICNlbmRpZgorI2VuZGlmIC8v
ICFVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKIAogfSAvLyBuYW1lc3BhY2UKIApJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ29udGV4dE1lbnVJdGVtV2luLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3dpbi9Db250ZXh0TWVudUl0ZW1XaW4uY3BwCShyZXZp
c2lvbiA3MzY2MikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL0NvbnRleHRNZW51SXRlbVdpbi5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTI4LDE5OCArMjgsNjYgQEAKIAogI2luY2x1ZGUgIkNvbnRl
eHRNZW51LmgiCiAKLSNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+Ci0jaW5jbHVkZSA8d2lu
ZG93cy5oPgotCi0jaWYgT1MoV0lOQ0UpCi0jaWZuZGVmIE1GU19ESVNBQkxFRAotI2RlZmluZSBN
RlNfRElTQUJMRUQgTUZfR1JBWUVECi0jZW5kaWYKLSNpZm5kZWYgTUlJTV9GVFlQRQotI2RlZmlu
ZSBNSUlNX0ZUWVBFIE1JSU1fVFlQRQotI2VuZGlmCi0jaWZuZGVmIE1JSU1fU1RSSU5HCi0jZGVm
aW5lIE1JSU1fU1RSSU5HIDAKLSNlbmRpZgotI2VuZGlmCi0KIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAotQ29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oTFBNRU5VSVRFTUlORk8gaXRlbSkK
LSAgICA6IG1fcGxhdGZvcm1EZXNjcmlwdGlvbihpdGVtKQorQ29udGV4dE1lbnVJdGVtOjpDb250
ZXh0TWVudUl0ZW0oY29uc3QgTUVOVUlURU1JTkZPJiBpbmZvKQogewotfQorICAgIGlmIChpbmZv
LmZNYXNrICYgTUlJTV9GVFlQRSkKKyAgICAgICAgbV90eXBlID0gaW5mby5mVHlwZSA9PSBNRlRf
U0VQQVJBVE9SID8gU2VwYXJhdG9yVHlwZSA6IEFjdGlvblR5cGU7CisgICAgZWxzZQorICAgICAg
ICBtX3R5cGUgPSBTZXBhcmF0b3JUeXBlOwogCi1Db250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51
SXRlbShDb250ZXh0TWVudSogc3ViTWVudSkKLXsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24g
PSAoTFBNRU5VSVRFTUlORk8pbWFsbG9jKHNpemVvZihNRU5VSVRFTUlORk8pKTsKLSAgICBpZiAo
IW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbWVtc2V0KG1f
cGxhdGZvcm1EZXNjcmlwdGlvbiwgMCwgc2l6ZW9mKE1FTlVJVEVNSU5GTykpOwotICAgIG1fcGxh
dGZvcm1EZXNjcmlwdGlvbi0+Y2JTaXplID0gc2l6ZW9mKE1FTlVJVEVNSU5GTyk7Ci0KLSAgICBt
X3BsYXRmb3JtRGVzY3JpcHRpb24tPndJRCA9IENvbnRleHRNZW51SXRlbVRhZ05vQWN0aW9uOwot
ICAgIGlmIChzdWJNZW51KSB7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sg
fD0gTUlJTV9TVUJNRU5VOwotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51
ID0gc3ViTWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpOwotICAgIH0KLX0KKyAgICBpZiAobV90
eXBlID09IEFjdGlvblR5cGUgJiYgaW5mby5mTWFzayAmIE1JSU1fU1RSSU5HKQorICAgICAgICBt
X3RpdGxlID0gU3RyaW5nKGluZm8uZHdUeXBlRGF0YSwgaW5mby5jY2gpOwogCi1Db250ZXh0TWVu
dUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUsIENvbnRleHRN
ZW51QWN0aW9uIGFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ29udGV4dE1lbnUqIHN1Yk1l
bnUpCi17Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gKExQTUVOVUlURU1JTkZPKW1hbGxv
YyhzaXplb2YoTUVOVUlURU1JTkZPKSk7Ci0gICAgaWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRpb24p
Ci0gICAgICAgIHJldHVybjsKLQotICAgIG1lbXNldChtX3BsYXRmb3JtRGVzY3JpcHRpb24sIDAs
IHNpemVvZihNRU5VSVRFTUlORk8pKTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmNiU2l6
ZSA9IHNpemVvZihNRU5VSVRFTUlORk8pOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1h
c2sgPSBNSUlNX0ZUWVBFOwotCi0gICAgaWYgKHR5cGUgPT0gU2VwYXJhdG9yVHlwZSkgewotICAg
ICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZUeXBlID0gTUZUX1NFUEFSQVRPUjsKLSAgICAg
ICAgcmV0dXJuOworICAgIGlmICgoaW5mby5mTWFzayAmIE1JSU1fU1VCTUVOVSkgJiYgaW5mby5o
U3ViTWVudSkgeworICAgICAgICBtX3R5cGUgPSBTdWJtZW51VHlwZTsKKyAgICAgICAgQ29udGV4
dE1lbnU6OmdldENvbnRleHRNZW51SXRlbXMoaW5mby5oU3ViTWVudSwgbV9zdWJNZW51SXRlbXMp
OwogICAgIH0KLSAgICAKLSAgICBpZiAoc3ViTWVudSkgewotICAgICAgICBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPmZNYXNrIHw9IE1JSU1fU1RSSU5HIHwgTUlJTV9TVUJNRU5VOwotICAgICAgICBt
X3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51ID0gc3ViTWVudS0+cGxhdGZvcm1EZXNjcmlw
dGlvbigpOwotICAgIH0gZWxzZQotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZNYXNr
IHw9IE1JSU1fU1RSSU5HIHwgTUlJTV9JRDsKLQotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+
ZlR5cGUgPSBNRlRfU1RSSU5HOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+d0lEID0gYWN0
aW9uOwotICAgIAotICAgIFN0cmluZyB0ID0gdGl0bGU7Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5jY2ggPSB0Lmxlbmd0aCgpOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZHdUeXBl
RGF0YSA9IHdjc2R1cCh0LmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOwotfQotCi1D
b250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlLCBDb250
ZXh0TWVudUFjdGlvbiwgY29uc3QgU3RyaW5nJiwgYm9vbCwgYm9vbCkKLXsKLSAgICAvLyBGSVhN
RTogSW1wbGVtZW50Ci19CiAKLUNvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKENvbnRl
eHRNZW51QWN0aW9uLCBjb25zdCBTdHJpbmcmLCBib29sLCBib29sLCBWZWN0b3I8Q29udGV4dE1l
bnVJdGVtPiYpCi17Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudAotfQotCi1Db250ZXh0TWVudUl0
ZW06On5Db250ZXh0TWVudUl0ZW0oKQotewotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24p
IHsKLSAgICAgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlR5cGUgPT0gTUZUX1NUUklO
RykKLSAgICAgICAgICAgIGZyZWUobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVEYXRhKTsK
LSAgICAgICAgZnJlZShtX3BsYXRmb3JtRGVzY3JpcHRpb24pOwotICAgIH0KLX0KLQotTFBNRU5V
SVRFTUlORk8gQ29udGV4dE1lbnVJdGVtOjpyZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpCi17
Ci0gICAgTFBNRU5VSVRFTUlORk8gaW5mbyA9IG1fcGxhdGZvcm1EZXNjcmlwdGlvbjsKLSAgICBt
X3BsYXRmb3JtRGVzY3JpcHRpb24gPSAwOwotICAgIHJldHVybiBpbmZvOwotfQotCi1Db250ZXh0
TWVudUl0ZW1UeXBlIENvbnRleHRNZW51SXRlbTo6dHlwZSgpIGNvbnN0Ci17Ci0gICAgQ29udGV4
dE1lbnVJdGVtVHlwZSB0eXBlID0gQWN0aW9uVHlwZTsKLSAgICBpZiAoKChtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPmZUeXBlICYgfk1GVF9PV05FUkRSQVcpID09IE1GVF9TVFJJTkcpICYmIG1fcGxh
dGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUpCi0gICAgICAgIHR5cGUgPSBTdWJtZW51VHlwZTsK
LSAgICBlbHNlIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZUeXBlICYgTUZUX1NFUEFSQVRP
UikKLSAgICAgICAgdHlwZSA9IFNlcGFyYXRvclR5cGU7Ci0KLSAgICByZXR1cm4gdHlwZTsKLX0K
LQotQ29udGV4dE1lbnVBY3Rpb24gQ29udGV4dE1lbnVJdGVtOjphY3Rpb24oKSBjb25zdAoteyAK
LSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q29udGV4dE1lbnVBY3Rpb24+KG1fcGxhdGZvcm1EZXNj
cmlwdGlvbi0+d0lEKTsKLX0KLQotU3RyaW5nIENvbnRleHRNZW51SXRlbTo6dGl0bGUoKSBjb25z
dCAKLXsKLSAgICByZXR1cm4gU3RyaW5nKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZHdUeXBlRGF0
YSwgd2NzbGVuKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZHdUeXBlRGF0YSkpOwotfQotCi1QbGF0
Zm9ybU1lbnVEZXNjcmlwdGlvbiBDb250ZXh0TWVudUl0ZW06OnBsYXRmb3JtU3ViTWVudSgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnU7Ci19Ci0K
LXZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRUeXBlKENvbnRleHRNZW51SXRlbVR5cGUgdHlwZSkK
LXsKLSAgICBpZiAodHlwZSA9PSBTZXBhcmF0b3JUeXBlKQotICAgICAgICBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPmZUeXBlID0gTUZUX1NFUEFSQVRPUjsKKyAgICBpZiAoaW5mby5mTWFzayAmIE1J
SU1fSUQpCisgICAgICAgIG1fYWN0aW9uID0gc3RhdGljX2Nhc3Q8Q29udGV4dE1lbnVBY3Rpb24+
KGluZm8ud0lEKTsKICAgICBlbHNlCi0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlR5
cGUgPSBNRlRfU1RSSU5HOwotfQorICAgICAgICBtX2FjdGlvbiA9IENvbnRleHRNZW51SXRlbVRh
Z05vQWN0aW9uOwogCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0QWN0aW9uKENvbnRleHRNZW51
QWN0aW9uIGFjdGlvbikKLXsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPndJRCA9IGFjdGlv
bjsgCi19Ci0KLXZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRUaXRsZShjb25zdCBTdHJpbmcmIHRp
dGxlKQotewotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEpCi0gICAg
ICAgIGZyZWUobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5kd1R5cGVEYXRhKTsKLSAgICAKLSAgICBt
X3BsYXRmb3JtRGVzY3JpcHRpb24tPmNjaCA9IHRpdGxlLmxlbmd0aCgpOwotICAgIFN0cmluZyB0
aXRsZUNvcHkgPSB0aXRsZTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEg
PSB3Y3NkdXAodGl0bGVDb3B5LmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOworICAg
IGlmIChpbmZvLmZNYXNrICYgTUlJTV9TVEFURSkgeworICAgICAgICBtX2NoZWNrZWQgPSBpbmZv
LmZTdGF0ZSAmIE1GU19DSEVDS0VEOworICAgICAgICBtX2VuYWJsZWQgPSAhKGluZm8uZlN0YXRl
ICYgTUZTX0RJU0FCTEVEKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX2NoZWNrZWQgPSBmYWxz
ZTsKKyAgICAgICAgbV9lbmFibGVkID0gZmFsc2U7CisgICAgfQogfQogCi12b2lkIENvbnRleHRN
ZW51SXRlbTo6c2V0U3ViTWVudShDb250ZXh0TWVudSogc3ViTWVudSkKLXsKLSAgICBpZiAoc3Vi
TWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpID09IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1
Yk1lbnUpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24t
PmhTdWJNZW51KQotICAgICAgICA6OkRlc3Ryb3lNZW51KG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+
aFN1Yk1lbnUpOworLy8gQ29udGV4dE1lbnVJdGVtOjpuYXRpdmVNZW51SXRlbSBkb2Vzbid0IHNl
dCB0aGUgaW5mby5kd1R5cGVEYXRhLiBUaGlzIGlzCisvLyBkb25lIHRvIG1ha2UgdGhlIGxpZmV0
aW1lIGhhbmRsaW5nIG9mIHRoZSByZXR1cm5lZCBNRU5VSVRFTUlORk8gZWFzaWVyIG9uCisvLyBj
YWxsZXJzLiBDYWxsZXJzIGNhbiBzZXQgZHdUeXBlRGF0YSB0aGVtc2VsdmVzIChhbmQgbWFrZSB0
aGVpciBvd24gZGVjaXNpb25zCisvLyBhYm91dCBpdHMgbGlmZXRpbWUpIGlmIHRoZXkgbmVlZCBp
dC4KK01FTlVJVEVNSU5GTyBDb250ZXh0TWVudUl0ZW06Om5hdGl2ZU1lbnVJdGVtKCkgY29uc3QK
K3sKKyAgICBNRU5VSVRFTUlORk8gaW5mbyA9IHswfTsKKyAgICBpbmZvLmNiU2l6ZSA9IHNpemVv
ZihNRU5VSVRFTUlORk8pOworCisgICAgaWYgKG1fdHlwZSA9PSBTZXBhcmF0b3JUeXBlKSB7Cisg
ICAgICAgIGluZm8uZk1hc2sgPSBNSUlNX0ZUWVBFOworICAgICAgICBpbmZvLmZUeXBlID0gTUZU
X1NFUEFSQVRPUjsKKyAgICAgICAgcmV0dXJuIGluZm87CisgICAgfQogCi0gICAgbV9wbGF0Zm9y
bURlc2NyaXB0aW9uLT5mTWFzayB8PSBNSUlNX1NVQk1FTlU7Ci0gICAgbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uLT5oU3ViTWVudSA9IHN1Yk1lbnUtPnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCk7
Ci19CisgICAgaW5mby5mTWFzayA9IE1JSU1fRlRZUEUgfCBNSUlNX0lEIHwgTUlJTV9TVEFURTsK
KyAgICBpbmZvLmZUeXBlID0gTUZUX1NUUklORzsKIAotdm9pZCBDb250ZXh0TWVudUl0ZW06OnNl
dFN1Yk1lbnUoVmVjdG9yPENvbnRleHRNZW51SXRlbT4mKQotewotICAgIC8vIEZJWE1FOiBJbXBs
ZW1lbnQKLX0KKyAgICBpbmZvLndJRCA9IG1fYWN0aW9uOwogCi12b2lkIENvbnRleHRNZW51SXRl
bTo6c2V0Q2hlY2tlZChib29sIGNoZWNrZWQpCi17Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9u
LT5mTWFzayB8PSBNSUlNX1NUQVRFOwotICAgIGlmIChjaGVja2VkKSB7Ci0gICAgICAgIG1fcGxh
dGZvcm1EZXNjcmlwdGlvbi0+ZlN0YXRlICY9IH5NRlNfVU5DSEVDS0VEOwotICAgICAgICBtX3Bs
YXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNfQ0hFQ0tFRDsKLSAgICB9IGVsc2Ugewot
ICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSAmPSB+TUZTX0NIRUNLRUQ7Ci0g
ICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlN0YXRlIHw9IE1GU19VTkNIRUNLRUQ7Cisg
ICAgaWYgKG1fdHlwZSA9PSBTdWJtZW51VHlwZSkgeworICAgICAgICBpbmZvLmZNYXNrIHw9IE1J
SU1fU1VCTUVOVTsKKyAgICAgICAgaW5mby5oU3ViTWVudSA9IENvbnRleHRNZW51OjpjcmVhdGVO
YXRpdmVNZW51RnJvbUl0ZW1zKG1fc3ViTWVudUl0ZW1zKTsKICAgICB9Ci19CiAKLWJvb2wgQ29u
dGV4dE1lbnVJdGVtOjpjaGVja2VkKCkgY29uc3QKLXsKLSAgICAvLyBGSVhNRSAtIEltcGxlbWVu
dAotICAgIHJldHVybiBmYWxzZTsKLX0KKyAgICBpbmZvLmZTdGF0ZSB8PSBtX2VuYWJsZWQgPyBN
RlNfRU5BQkxFRCA6IE1GU19ESVNBQkxFRDsKKyAgICBpbmZvLmZTdGF0ZSB8PSBtX2NoZWNrZWQg
PyBNRlNfQ0hFQ0tFRCA6IE1GU19VTkNIRUNLRUQ7CiAKLXZvaWQgQ29udGV4dE1lbnVJdGVtOjpz
ZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKLXsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZN
YXNrIHw9IE1JSU1fU1RBVEU7Ci0gICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgbV9wbGF0Zm9y
bURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1GU19ESVNBQkxFRDsKLSAgICAgICAgbV9wbGF0Zm9y
bURlc2NyaXB0aW9uLT5mU3RhdGUgfD0gTUZTX0VOQUJMRUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAg
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJj0gfk1GU19FTkFCTEVEOwotICAgICAg
ICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSB8PSBNRlNfRElTQUJMRUQ7Ci0gICAgfQot
fQotCi1ib29sIENvbnRleHRNZW51SXRlbTo6ZW5hYmxlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
ICEobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgJiBNRlNfRElTQUJMRUQpOworICAgIHJl
dHVybiBpbmZvOwogfQogCiB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3dpbi9Db250ZXh0TWVu
dVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ29udGV4dE1lbnVX
aW4uY3BwCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYkNvcmUvcGxhdGZvcm0vd2luL0NvbnRleHRN
ZW51V2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgIk5v
ZGUuaCIKICNpbmNsdWRlIDx0Y2hhci5oPgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRl
IDx3dGYvVmVjdG9yLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCiAjaWZuZGVm
IE1JSU1fRlRZUEUKQEAgLTQzLDE4MCArNDQsNjcgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewog
Ci1Db250ZXh0TWVudTo6Q29udGV4dE1lbnUoKQotICAgIDogbV9wbGF0Zm9ybURlc2NyaXB0aW9u
KDApCi0jaWYgT1MoV0lOQ0UpCi0gICAgLCBtX2l0ZW1Db3VudCgwKQotI2VuZGlmCi17Ci0gICAg
c2V0UGxhdGZvcm1EZXNjcmlwdGlvbig6OkNyZWF0ZVBvcHVwTWVudSgpKTsKLX0KLQotQ29udGV4
dE1lbnU6OkNvbnRleHRNZW51KGNvbnN0IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIG1lbnUpCi0g
ICAgOiBtX3BsYXRmb3JtRGVzY3JpcHRpb24oMCkKLSNpZiBPUyhXSU5DRSkKLSAgICAsIG1faXRl
bUNvdW50KDApCi0jZW5kaWYKLXsKLSAgICBzZXRQbGF0Zm9ybURlc2NyaXB0aW9uKG1lbnUpOwot
fQotCi1Db250ZXh0TWVudTo6fkNvbnRleHRNZW51KCkKLXsKLSAgICBpZiAobV9wbGF0Zm9ybURl
c2NyaXB0aW9uKQotICAgICAgICA6OkRlc3Ryb3lNZW51KG1fcGxhdGZvcm1EZXNjcmlwdGlvbik7
Ci19Ci0KLXVuc2lnbmVkIENvbnRleHRNZW51OjppdGVtQ291bnQoKSBjb25zdAotewotI2lmIE9T
KFdJTkNFKQotICAgIHJldHVybiBtX2l0ZW1Db3VudDsKLSNlbHNlCi0gICAgaWYgKCFtX3BsYXRm
b3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIDo6R2V0TWVu
dUl0ZW1Db3VudChtX3BsYXRmb3JtRGVzY3JpcHRpb24pOwotI2VuZGlmCi19Ci0KLSNpZiBPUyhX
SU5DRSkKLXN0YXRpYyBib29sIGluc2VydE1lbnVJdGVtKFBsYXRmb3JtTWVudURlc2NyaXB0aW9u
IG1lbnUsIHVuc2lnbmVkIGludCBwb3NpdGlvbiwgQ29udGV4dE1lbnVJdGVtJiBpdGVtKQorQ29u
dGV4dE1lbnU6OkNvbnRleHRNZW51KEhNRU5VIG1lbnUpCiB7Ci0gICAgVUlOVCBmbGFncyA9IE1G
X0JZUE9TSVRJT047Ci0gICAgVUlOVCBuZXdJdGVtID0gMDsKLSAgICBMUENXU1RSIHRpdGxlID0g
MDsKLQotICAgIGlmIChpdGVtLnR5cGUoKSA9PSBTZXBhcmF0b3JUeXBlKQotICAgICAgICBmbGFn
cyB8PSBNRl9TRVBBUkFUT1I7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZsYWdzIHw9IE1GX1NUUklO
RzsKLSAgICAgICAgZmxhZ3MgfD0gaXRlbS5jaGVja2VkKCkgPyBNRl9DSEVDS0VEIDogTUZfVU5D
SEVDS0VEOwotICAgICAgICBmbGFncyB8PSBpdGVtLmVuYWJsZWQoKSA/IE1GX0VOQUJMRUQgOiBN
Rl9HUkFZRUQ7Ci0KLSAgICAgICAgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIGRlc2NyaXB0
aW9uID0gaXRlbS5yZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOwotICAgICAgICB0aXRsZSA9
IGRlc2NyaXB0aW9uLT5kd1R5cGVEYXRhOwotICAgICAgICBkZXNjcmlwdGlvbi0+ZHdUeXBlRGF0
YSA9IDA7Ci0KLSAgICAgICAgaWYgKGRlc2NyaXB0aW9uLT5oU3ViTWVudSkgewotICAgICAgICAg
ICAgZmxhZ3MgfD0gTUZfUE9QVVA7Ci0gICAgICAgICAgICBuZXdJdGVtID0gcmVpbnRlcnByZXRf
Y2FzdDxVSU5UPihkZXNjcmlwdGlvbi0+aFN1Yk1lbnUpOwotICAgICAgICAgICAgZGVzY3JpcHRp
b24tPmhTdWJNZW51ID0gMDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBuZXdJdGVtID0g
ZGVzY3JpcHRpb24tPndJRDsKLQotICAgICAgICBmcmVlKGRlc2NyaXB0aW9uKTsKLSAgICB9Ci0K
LSAgICByZXR1cm4gOjpJbnNlcnRNZW51VyhtZW51LCBwb3NpdGlvbiwgZmxhZ3MsIG5ld0l0ZW0s
IHRpdGxlKTsKKyAgICBnZXRDb250ZXh0TWVudUl0ZW1zKG1lbnUsIG1faXRlbXMpOwogfQotI2Vu
ZGlmCiAKLXZvaWQgQ29udGV4dE1lbnU6Omluc2VydEl0ZW0odW5zaWduZWQgaW50IHBvc2l0aW9u
LCBDb250ZXh0TWVudUl0ZW0mIGl0ZW0pCit2b2lkIENvbnRleHRNZW51OjpnZXRDb250ZXh0TWVu
dUl0ZW1zKEhNRU5VIG1lbnUsIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBpdGVtcykKIHsKLSAg
ICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICBpbnQgY291bnQgPSA6OkdldE1lbnVJ
dGVtQ291bnQobWVudSk7CisgICAgaWYgKGNvdW50IDw9IDApCiAgICAgICAgIHJldHVybjsKIAot
I2lmIE9TKFdJTkNFKQotICAgIGlmIChpbnNlcnRNZW51SXRlbShtX3BsYXRmb3JtRGVzY3JpcHRp
b24sIHBvc2l0aW9uLCBpdGVtKSkKLSAgICAgICAgKyttX2l0ZW1Db3VudDsKLSNlbHNlCi0gICAg
OjpJbnNlcnRNZW51SXRlbShtX3BsYXRmb3JtRGVzY3JpcHRpb24sIHBvc2l0aW9uLCBUUlVFLCBp
dGVtLnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCkpOwotI2VuZGlmCi19Ci0KLXZvaWQgQ29u
dGV4dE1lbnU6OmFwcGVuZEl0ZW0oQ29udGV4dE1lbnVJdGVtJiBpdGVtKQotewotICAgIGluc2Vy
dEl0ZW0oaXRlbUNvdW50KCksIGl0ZW0pOwotfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291
bnQ7ICsraSkgeworICAgICAgICBNRU5VSVRFTUlORk8gaW5mbyA9IHswfTsKKyAgICAgICAgaW5m
by5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPKTsKKyAgICAgICAgaW5mby5mTWFzayA9IE1J
SU1fRlRZUEUgfCBNSUlNX0lEIHwgTUlJTV9TVFJJTkcgfCBNSUlNX1NUQVRFIHwgTUlJTV9TVUJN
RU5VOworCisgICAgICAgIGlmICghOjpHZXRNZW51SXRlbUluZm8obWVudSwgaSwgVFJVRSwgJmlu
Zm8pKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGluZm8uZlR5cGUgPT0g
TUZUX1NFUEFSQVRPUikgeworICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnRleHRNZW51SXRl
bShTZXBhcmF0b3JUeXBlLCBDb250ZXh0TWVudUl0ZW1UYWdOb0FjdGlvbiwgU3RyaW5nKCkpKTsK
KyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLXN0YXRpYyBDb250ZXh0TWVudUl0
ZW0qIGNvbnRleHRNZW51SXRlbUJ5SWRPclBvc2l0aW9uKEhNRU5VIG1lbnUsIHVuc2lnbmVkIGlk
LCBCT09MIGJ5UG9zaXRpb24pCi17Ci0gICAgaWYgKCFtZW51KQotICAgICAgICByZXR1cm4gMDsK
LSAgICBMUE1FTlVJVEVNSU5GTyBpbmZvID0gc3RhdGljX2Nhc3Q8TFBNRU5VSVRFTUlORk8+KG1h
bGxvYyhzaXplb2YoTUVOVUlURU1JTkZPKSkpOwotICAgIGlmICghaW5mbykKLSAgICAgICAgcmV0
dXJuIDA7Ci0KLSAgICBtZW1zZXQoaW5mbywgMCwgc2l6ZW9mKE1FTlVJVEVNSU5GTykpOwotCi0g
ICAgaW5mby0+Y2JTaXplID0gc2l6ZW9mKE1FTlVJVEVNSU5GTyk7Ci0KLSAgICAvLyBTZXR0aW5n
IE1JSU1fREFUQSB3aGljaCBpcyB1c2VmdWwgZm9yIFdlYktpdCBjbGllbnRzIHdobyBzdG9yZSBk
YXRhIGluIHRoaXMgbWVtYmVyIGZvciB0aGVpciBjdXN0b20gbWVudSBpdGVtcy4KLSAgICBpbmZv
LT5mTWFzayA9IE1JSU1fRlRZUEUgfCBNSUlNX0lEIHwgTUlJTV9TVFJJTkcgfCBNSUlNX0RBVEE7
Ci0KLSAgICBpZiAoITo6R2V0TWVudUl0ZW1JbmZvKG1lbnUsIGlkLCBieVBvc2l0aW9uLCBpbmZv
KSkgewotICAgICAgICBmcmVlKGluZm8pOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAg
ICAgIGludCBtZW51U3RyaW5nTGVuZ3RoID0gaW5mby5jY2ggKyAxOworICAgICAgICBPd25BcnJh
eVB0cjxXQ0hBUj4gbWVudVN0cmluZyhuZXcgV0NIQVJbbWVudVN0cmluZ0xlbmd0aF0pOworICAg
ICAgICBpbmZvLmR3VHlwZURhdGEgPSBtZW51U3RyaW5nLmdldCgpOworICAgICAgICBpbmZvLmNj
aCA9IG1lbnVTdHJpbmdMZW5ndGg7CiAKLSAgICBpZiAoaW5mby0+ZlR5cGUgJiBNRlRfU1RSSU5H
KSB7Ci0gICAgICAgIExQVFNUUiBidWZmZXIgPSBzdGF0aWNfY2FzdDxMUFRTVFI+KG1hbGxvYygr
K2luZm8tPmNjaCAqIHNpemVvZihUQ0hBUikpKTsKLSAgICAgICAgaWYgKCFidWZmZXIpIHsKLSAg
ICAgICAgICAgIGZyZWUoaW5mbyk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQot
ICAgICAgICBpbmZvLT5kd1R5cGVEYXRhID0gYnVmZmVyOwotICAgICAgICA6OkdldE1lbnVJdGVt
SW5mbyhtZW51LCBpZCwgYnlQb3NpdGlvbiwgaW5mbyk7CisgICAgICAgIGlmICg6OkdldE1lbnVJ
dGVtSW5mbyhtZW51LCBpLCBUUlVFLCAmaW5mbykpCisgICAgICAgICAgIGl0ZW1zLmFwcGVuZChD
b250ZXh0TWVudUl0ZW0oaW5mbykpOwogICAgIH0KLQotICAgIHJldHVybiBuZXcgQ29udGV4dE1l
bnVJdGVtKGluZm8pOwogfQogCi1Db250ZXh0TWVudUl0ZW0qIENvbnRleHRNZW51OjppdGVtV2l0
aEFjdGlvbih1bnNpZ25lZCBhY3Rpb24pCitITUVOVSBDb250ZXh0TWVudTo6Y3JlYXRlTmF0aXZl
TWVudUZyb21JdGVtcyhjb25zdCBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYgaXRlbXMpCiB7Ci0g
ICAgcmV0dXJuIGNvbnRleHRNZW51SXRlbUJ5SWRPclBvc2l0aW9uKG1fcGxhdGZvcm1EZXNjcmlw
dGlvbiwgYWN0aW9uLCBGQUxTRSk7Ci19CisgICAgSE1FTlUgbWVudSA9IDo6Q3JlYXRlUG9wdXBN
ZW51KCk7CiAKLUNvbnRleHRNZW51SXRlbSogQ29udGV4dE1lbnU6Oml0ZW1BdEluZGV4KHVuc2ln
bmVkIGluZGV4LCBjb25zdCBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBwbGF0Zm9ybURlc2NyaXB0
aW9uKQotewotICAgIHJldHVybiBjb250ZXh0TWVudUl0ZW1CeUlkT3JQb3NpdGlvbihwbGF0Zm9y
bURlc2NyaXB0aW9uLCBpbmRleCwgVFJVRSk7Ci19CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBpdGVtcy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBDb250ZXh0TWVudUl0ZW0mIGl0
ZW0gPSBpdGVtc1tpXTsKIAotdm9pZCBDb250ZXh0TWVudTo6c2V0UGxhdGZvcm1EZXNjcmlwdGlv
bihITUVOVSBtZW51KQotewotICAgIGlmIChtZW51ID09IG1fcGxhdGZvcm1EZXNjcmlwdGlvbikK
LSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24pCi0g
ICAgICAgIDo6RGVzdHJveU1lbnUobV9wbGF0Zm9ybURlc2NyaXB0aW9uKTsKKyAgICAgICAgTUVO
VUlURU1JTkZPIG1lbnVJdGVtID0gaXRlbS5uYXRpdmVNZW51SXRlbSgpOwogCi0gICAgbV9wbGF0
Zm9ybURlc2NyaXB0aW9uID0gbWVudTsKLSAgICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlwdGlvbikK
LSAgICAgICAgcmV0dXJuOwotCi0jaWYgIU9TKFdJTkNFKQotICAgIE1FTlVJTkZPIG1lbnVJbmZv
ID0gezB9OwotICAgIG1lbnVJbmZvLmNiU2l6ZSA9IHNpemVvZihNRU5VSU5GTyk7Ci0gICAgbWVu
dUluZm8uZk1hc2sgPSBNSU1fU1RZTEU7Ci0gICAgOjpHZXRNZW51SW5mbyhtX3BsYXRmb3JtRGVz
Y3JpcHRpb24sICZtZW51SW5mbyk7Ci0gICAgbWVudUluZm8uZk1hc2sgPSBNSU1fU1RZTEU7Ci0g
ICAgbWVudUluZm8uZHdTdHlsZSB8PSBNTlNfTk9USUZZQllQT1M7Ci0gICAgOjpTZXRNZW51SW5m
byhtX3BsYXRmb3JtRGVzY3JpcHRpb24sICZtZW51SW5mbyk7Ci0jZW5kaWYKLX0KLQotSE1FTlUg
Q29udGV4dE1lbnU6OnBsYXRmb3JtRGVzY3JpcHRpb24oKSBjb25zdAotewotICAgIHJldHVybiBt
X3BsYXRmb3JtRGVzY3JpcHRpb247Ci19CisgICAgICAgIC8vIENvbnRleHRNZW51SXRlbTo6bmF0
aXZlTWVudUl0ZW0gZG9lc24ndCBzZXQgdGhlIHRpdGxlIG9mIHRoZSBNRU5VSVRFTUlORk8gdG8g
bWFrZSB0aGUKKyAgICAgICAgLy8gbGlmZXRpbWUgaGFuZGxpbmcgZWFzaWVyIGZvciBjYWxsZXJz
LgorICAgICAgICBTdHJpbmcgaXRlbVRpdGxlID0gaXRlbS50aXRsZSgpOworICAgICAgICBpZiAo
aXRlbS50eXBlKCkgIT0gU2VwYXJhdG9yVHlwZSkgeworICAgICAgICAgICAgbWVudUl0ZW0uZk1h
c2sgfD0gTUlJTV9TVFJJTkc7CisgICAgICAgICAgICBtZW51SXRlbS5jY2ggPSBpdGVtVGl0bGUu
bGVuZ3RoKCk7CisgICAgICAgICAgICBtZW51SXRlbS5kd1R5cGVEYXRhID0gY29uc3RfY2FzdDxM
UFdTVFI+KGl0ZW1UaXRsZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKKyAgICAg
ICAgfQogCi1ITUVOVSBDb250ZXh0TWVudTo6cmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKQot
ewotICAgIEhNRU5VIGRlc2NyaXB0aW9uID0gbV9wbGF0Zm9ybURlc2NyaXB0aW9uOwotICAgIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbiA9IDA7Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uOwotfQorICAg
ICAgICA6Okluc2VydE1lbnVJdGVtKG1lbnUsIGksIFRSVUUsICZtZW51SXRlbSk7CisgICAgfQog
Ci1WZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBjb250ZXh0TWVudUl0ZW1WZWN0b3IoUGxhdGZvcm1N
ZW51RGVzY3JpcHRpb24pCi17Ci0gICAgLy8gRklYTUUgLSBJbXBsZW1lbnQKLSAgICByZXR1cm4g
VmVjdG9yPENvbnRleHRNZW51SXRlbT4oKTsKKyAgICByZXR1cm4gbWVudTsKIH0KIAotUGxhdGZv
cm1NZW51RGVzY3JpcHRpb24gcGxhdGZvcm1NZW51RGVzY3JpcHRpb24oVmVjdG9yPENvbnRleHRN
ZW51SXRlbT4mIG1lbnVJdGVtVmVjdG9yKQorSE1FTlUgQ29udGV4dE1lbnU6Om5hdGl2ZU1lbnUo
KSBjb25zdAogewotICAgIC8vIEZJWE1FIC0gSW1wbGVtZW50Ci0gICAgcmV0dXJuIDA7CisgICAg
cmV0dXJuIGNyZWF0ZU5hdGl2ZU1lbnVGcm9tSXRlbXMobV9pdGVtcyk7CiB9CiAKIH0gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYktpdDIvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YktpdDIvQ2hhbmdlTG9nCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYktpdDIvQ2hhbmdlTG9nCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjUgQEAKKzIwMTAtMTItMDkgIEJyaWFuIFdlaW5zdGVp
biAgPGJ3ZWluc3RlaW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIFByZXAgZm9yIFdlYktpdDI6IENvbnRleHQgbWVudSBzdXBwb3J0
IG9uIFdpbmRvd3MKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTUwNTE0CisgICAgICAgIAorICAgICAgICBVcGRhdGUgV2ViS2l0MiB0byBjYWxsIHRoZSBj
b3JyZWN0IGNvZGUgd2hlbiBDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTIGlzIHNldC4KKwor
ICAgICAgICAqIFNoYXJlZC9XZWJDb250ZXh0TWVudUl0ZW1EYXRhLmNwcDoKKyAgICAgICAgKFdl
YktpdDo6V2ViQ29udGV4dE1lbnVJdGVtRGF0YTo6V2ViQ29udGV4dE1lbnVJdGVtRGF0YSk6IEFk
ZCBhIGJyYW5jaCBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCAKKyAgICAgICAgICAgIENST1NTX1BM
QVRGT1JNX0NPTlRFWFRfTUVOVVMgaXMgc2V0LgorICAgICAgICAqIFdlYlByb2Nlc3MvV2ViQ29y
ZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJD
b250ZXh0TWVudUNsaWVudDo6Y3VzdG9taXplTWVudSk6IERlZmluZSBkaWZmZXJlbnQgZnVuY3Rp
b25zIGJhc2VkIG9uCisgICAgICAgICAgICB3aGV0aGVyIG9yIG5vdCBDUk9TU19QTEFURk9STV9D
T05URVhUX01FTlVTLiBCb3RoIG9mIHRoZXNlIGFyZSBzdHVicywgc28gZnVuY3Rpb25hbGl0eQor
ICAgICAgICAgICAgZG9lc24ndCBuZWVkIHRvIGJlIHNoYXJlZC4KKyAgICAgICAgKiBXZWJQcm9j
ZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50Lmg6IERlZmluZSBkaWZmZXJl
bnQgZnVuY3Rpb25zIGJhc2VkIG9uCisgICAgICAgICAgICB3aGV0aGVyIG9yIG5vdCBDUk9TU19Q
TEFURk9STV9DT05URVhUX01FTlVTLiAKKyAgICAgICAgKiBXZWJQcm9jZXNzL1dlYlBhZ2UvV2Vi
Q29udGV4dE1lbnUuY3BwOgorICAgICAgICAoV2ViS2l0OjpXZWJDb250ZXh0TWVudTo6c2hvdyk6
IEFkZCBhIGJyYW5jaCBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCAKKyAgICAgICAgICAgIENST1NT
X1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMgaXMgc2V0LgorCiAyMDEwLTEyLTA5ICBBbmRlcnMgQ2Fy
bHNzb24gIDxhbmRlcnNjYUBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgU2FtIFdl
aW5pZy4KSW5kZXg6IFdlYktpdDIvU2hhcmVkL1dlYkNvbnRleHRNZW51SXRlbURhdGEuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYktpdDIvU2hhcmVkL1dlYkNvbnRleHRNZW51SXRlbURhdGEuY3BwCShy
ZXZpc2lvbiA3MzY2MikKKysrIFdlYktpdDIvU2hhcmVkL1dlYkNvbnRleHRNZW51SXRlbURhdGEu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MywxMyArNjMsMTcgQEAgV2ViQ29udGV4dE1lbnVJdGVt
RGF0YTo6V2ViQ29udGV4dE1lbnVJdAogewogfQogCi1XZWJDb250ZXh0TWVudUl0ZW1EYXRhOjpX
ZWJDb250ZXh0TWVudUl0ZW1EYXRhKFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbSYgaXRlbSwgV2Vi
Q29yZTo6Q29udGV4dE1lbnUqIG1lbnUpCitXZWJDb250ZXh0TWVudUl0ZW1EYXRhOjpXZWJDb250
ZXh0TWVudUl0ZW1EYXRhKGNvbnN0IFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbSYgaXRlbSwgV2Vi
Q29yZTo6Q29udGV4dE1lbnUqIG1lbnUpCiAgICAgOiBtX3R5cGUoaXRlbS50eXBlKCkpCiAgICAg
LCBtX2FjdGlvbihpdGVtLmFjdGlvbigpKQogICAgICwgbV90aXRsZShpdGVtLnRpdGxlKCkpCiB7
CiAgICAgaWYgKG1fdHlwZSA9PSBXZWJDb3JlOjpTdWJtZW51VHlwZSkgeworI2lmIFVTRShDUk9T
U19QTEFURk9STV9DT05URVhUX01FTlVTKQorICAgICAgICBjb25zdCBWZWN0b3I8V2ViQ29yZTo6
Q29udGV4dE1lbnVJdGVtPiYgY29yZVN1Ym1lbnUgPSBpdGVtLnN1Yk1lbnVJdGVtcygpOworI2Vs
c2UKICAgICAgICAgVmVjdG9yPFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbT4gY29yZVN1Ym1lbnUg
PSBXZWJDb3JlOjpjb250ZXh0TWVudUl0ZW1WZWN0b3IoaXRlbS5wbGF0Zm9ybVN1Yk1lbnUoKSk7
CisjZW5kaWYKICAgICAgICAgbV9zdWJtZW51ID0ga2l0SXRlbXMoY29yZVN1Ym1lbnUsIG1lbnUp
OwogICAgIH0KICAgICAKQEAgLTEzMCw3ICsxMzQsNyBAQCBib29sIFdlYkNvbnRleHRNZW51SXRl
bURhdGE6OmRlY29kZShDb3JlCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLVZlY3RvcjxXZWJDb250
ZXh0TWVudUl0ZW1EYXRhPiBraXRJdGVtcyhWZWN0b3I8V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVt
PiYgY29yZUl0ZW1WZWN0b3IsIFdlYkNvcmU6OkNvbnRleHRNZW51KiBtZW51KQorVmVjdG9yPFdl
YkNvbnRleHRNZW51SXRlbURhdGE+IGtpdEl0ZW1zKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpDb250
ZXh0TWVudUl0ZW0+JiBjb3JlSXRlbVZlY3RvciwgV2ViQ29yZTo6Q29udGV4dE1lbnUqIG1lbnUp
CiB7CiAgICAgVmVjdG9yPFdlYkNvbnRleHRNZW51SXRlbURhdGE+IHJlc3VsdDsKICAgICByZXN1
bHQucmVzZXJ2ZUNhcGFjaXR5KGNvcmVJdGVtVmVjdG9yLnNpemUoKSk7CkluZGV4OiBXZWJLaXQy
L1NoYXJlZC9XZWJDb250ZXh0TWVudUl0ZW1EYXRhLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0Mi9T
aGFyZWQvV2ViQ29udGV4dE1lbnVJdGVtRGF0YS5oCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYktp
dDIvU2hhcmVkL1dlYkNvbnRleHRNZW51SXRlbURhdGEuaAkod29ya2luZyBjb3B5KQpAQCAtNDUs
NyArNDUsNyBAQCBjbGFzcyBBUElPYmplY3Q7CiBjbGFzcyBXZWJDb250ZXh0TWVudUl0ZW1EYXRh
IHsKIHB1YmxpYzoKICAgICBXZWJDb250ZXh0TWVudUl0ZW1EYXRhKCk7Ci0gICAgV2ViQ29udGV4
dE1lbnVJdGVtRGF0YShXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW0mLCBXZWJDb3JlOjpDb250ZXh0
TWVudSogbWVudSk7CisgICAgV2ViQ29udGV4dE1lbnVJdGVtRGF0YShjb25zdCBXZWJDb3JlOjpD
b250ZXh0TWVudUl0ZW0mLCBXZWJDb3JlOjpDb250ZXh0TWVudSogbWVudSk7CiAgICAgV2ViQ29u
dGV4dE1lbnVJdGVtRGF0YShXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UeXBlLCBXZWJDb3JlOjpD
b250ZXh0TWVudUFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgYm9vbCBlbmFibGVkLCBib29s
IGNoZWNrZWQpOwogICAgIFdlYkNvbnRleHRNZW51SXRlbURhdGEoV2ViQ29yZTo6Q29udGV4dE1l
bnVBY3Rpb24sIGNvbnN0IFN0cmluZyYgdGl0bGUsIGJvb2wgZW5hYmxlZCwgY29uc3QgVmVjdG9y
PFdlYkNvbnRleHRNZW51SXRlbURhdGE+JiBzdWJtZW51KTsKIApAQCAtNzQsNyArNzQsNyBAQCBw
cml2YXRlOgogICAgIFJlZlB0cjxBUElPYmplY3Q+IG1fdXNlckRhdGE7CiB9OwogCi1WZWN0b3I8
V2ViQ29udGV4dE1lbnVJdGVtRGF0YT4ga2l0SXRlbXMoVmVjdG9yPFdlYkNvcmU6OkNvbnRleHRN
ZW51SXRlbT4mLCBXZWJDb3JlOjpDb250ZXh0TWVudSopOworVmVjdG9yPFdlYkNvbnRleHRNZW51
SXRlbURhdGE+IGtpdEl0ZW1zKGNvbnN0IFZlY3RvcjxXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW0+
JiwgV2ViQ29yZTo6Q29udGV4dE1lbnUqKTsKIFZlY3RvcjxXZWJDb3JlOjpDb250ZXh0TWVudUl0
ZW0+IGNvcmVJdGVtcyhjb25zdCBWZWN0b3I8V2ViQ29udGV4dE1lbnVJdGVtRGF0YT4mKTsKIAog
fSAvLyBuYW1lc3BhY2UgV2ViS2l0CkluZGV4OiBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1
cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdDIvV2Vi
UHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5jcHAJKHJldmlzaW9u
IDczNjYyKQorKysgV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRN
ZW51Q2xpZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsMTEgKzQ0LDE5IEBAIHZvaWQgV2Vi
Q29udGV4dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51RGUKICAgICBkZWxldGUgdGhpczsKIH0KIAor
I2lmIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQorUGFzc093blB0cjxDb250ZXh0
TWVudT4gV2ViQ29udGV4dE1lbnVDbGllbnQ6OmN1c3RvbWl6ZU1lbnUoUGFzc093blB0cjxDb250
ZXh0TWVudT4gbWVudSkKK3sKKyAgICAvLyBXZWJLaXQyIGlnbm9yZXMgdGhpcyBjbGllbnQgY2Fs
bGJhY2sgYW5kIGRvZXMgY29udGV4dCBtZW51IGN1c3RvbWl6YXRpb24gd2hlbiBpdCBpcyB0b2xk
IHRvIHNob3cgdGhlIG1lbnUuCisgICAgcmV0dXJuIG1lbnU7Cit9CisjZWxzZQogUGxhdGZvcm1N
ZW51RGVzY3JpcHRpb24gV2ViQ29udGV4dE1lbnVDbGllbnQ6OmdldEN1c3RvbU1lbnVGcm9tRGVm
YXVsdEl0ZW1zKENvbnRleHRNZW51KiBtZW51KQogewogICAgIC8vIFdlYktpdDIgaWdub3JlcyB0
aGlzIGNsaWVudCBjYWxsYmFjayBhbmQgZG9lcyBjb250ZXh0IG1lbnUgY3VzdG9taXphdGlvbiB3
aGVuIGl0IGlzIHRvbGQgdG8gc2hvdyB0aGUgbWVudS4KICAgICByZXR1cm4gbWVudS0+cGxhdGZv
cm1EZXNjcmlwdGlvbigpOwogfQorI2VuZGlmCiAKIHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6
OmNvbnRleHRNZW51SXRlbVNlbGVjdGVkKENvbnRleHRNZW51SXRlbSosIGNvbnN0IENvbnRleHRN
ZW51KikKIHsKSW5kZXg6IFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJDb250
ZXh0TWVudUNsaWVudC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJDb3Jl
U3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYktp
dDIvV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC00Miw3ICs0MiwxMSBAQCBwdWJsaWM6CiBwcml2YXRlOgogICAgIHZpcnR1
YWwgdm9pZCBjb250ZXh0TWVudURlc3Ryb3llZCgpOwogICAgIAorI2lmIFVTRShDUk9TU19QTEFU
Rk9STV9DT05URVhUX01FTlVTKQorICAgIHZpcnR1YWwgUGFzc093blB0cjxXZWJDb3JlOjpDb250
ZXh0TWVudT4gY3VzdG9taXplTWVudShQYXNzT3duUHRyPFdlYkNvcmU6OkNvbnRleHRNZW51Pik7
CisjZWxzZQogICAgIHZpcnR1YWwgV2ViQ29yZTo6UGxhdGZvcm1NZW51RGVzY3JpcHRpb24gZ2V0
Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMoV2ViQ29yZTo6Q29udGV4dE1lbnUqKTsKKyNlbmRp
ZgogICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudUl0ZW1TZWxlY3RlZChXZWJDb3JlOjpDb250
ZXh0TWVudUl0ZW0qLCBjb25zdCBXZWJDb3JlOjpDb250ZXh0TWVudSopOwogICAgIAogICAgIHZp
cnR1YWwgdm9pZCBkb3dubG9hZFVSTChjb25zdCBXZWJDb3JlOjpLVVJMJiB1cmwpOwpJbmRleDog
V2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2UvV2ViQ29udGV4dE1lbnUuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYkNvbnRleHRNZW51LmNwcAkocmV2aXNp
b24gNzM2NjIpCisrKyBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJDb250ZXh0TWVudS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTY0LDcgKzY0LDExIEBAIHZvaWQgV2ViQ29udGV4dE1lbnU6
OnNob3coKQogICAgICAgICByZXR1cm47CiAKICAgICAvLyBHaXZlIHRoZSBidW5kbGUgY2xpZW50
IGEgY2hhbmNlIHRvIHByb2Nlc3MgdGhlIG1lbnUuCisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NP
TlRFWFRfTUVOVVMpCisgICAgY29uc3QgVmVjdG9yPENvbnRleHRNZW51SXRlbT4mIGNvcmVJdGVt
cyA9IG1lbnUtPml0ZW1zKCk7CisjZWxzZQogICAgIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+IGNv
cmVJdGVtcyA9IGNvbnRleHRNZW51SXRlbVZlY3RvcihtZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9u
KCkpOworI2VuZGlmCiAgICAgVmVjdG9yPFdlYkNvbnRleHRNZW51SXRlbURhdGE+IHByb3Bvc2Vk
TWVudSA9IGtpdEl0ZW1zKGNvcmVJdGVtcywgbWVudSk7CiAgICAgVmVjdG9yPFdlYkNvbnRleHRN
ZW51SXRlbURhdGE+IG5ld01lbnU7CiAgICAgUmVmUHRyPEFQSU9iamVjdD4gdXNlckRhdGE7Cklu
ZGV4OiBXZWJLaXQvd2luL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2luL0NoYW5n
ZUxvZwkocmV2aXNpb24gNzM2NjIpCisrKyBXZWJLaXQvd2luL0NoYW5nZUxvZwkod29ya2luZyBj
b3B5KQpAQCAtMSwzICsxLDIzIEBACisyMDEwLTEyLTA5ICBCcmlhbiBXZWluc3RlaW4gIDxid2Vp
bnN0ZWluQGFwcGxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBQcmVwIGZvciBXZWJLaXQyOiBDb250ZXh0IG1lbnUgc3VwcG9ydCBvbiBXaW5k
b3dzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01MDUx
NAorICAgICAgICAKKyAgICAgICAgVXBkYXRlIFdlYktpdCBmb3IgdGhlIG5ldyBDUk9TU19QTEFU
Rk9STV9DT05URVhUX01FTlVTIGZsYWcsIGFuZCBkZWZpbmUgY3VzdG9taXplTWVudQorICAgICAg
ICBpbnN0ZWFkIG9mIGdldEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0ZW1zLgorCisgICAgICAgICog
V2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuY3BwOgorICAgICAgICAoV2ViQ29u
dGV4dE1lbnVDbGllbnQ6OmN1c3RvbWl6ZU1lbnUpOiBnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJ
dGVtcyB3YXMgdHVybmVkIGludG8KKyAgICAgICAgICAgIHRoaXMgZnVuY3Rpb24sIHdpdGggcmVm
YWN0b3JpbmcgdXNpbmcgbmF0aXZlTWVudSBpbnN0ZWFkIG9mIHBsYXRmb3JtRGVzY3JpcHRpb24u
CisgICAgICAgIChXZWJDb250ZXh0TWVudUNsaWVudDo6Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQp
OiAgVXNlIG5hdGl2ZU1lbnUgaW5zdGVhZCBvZiBwbGF0Zm9ybURlc2NyaXB0aW9uLgorICAgICAg
ICAqIFdlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50Lmg6CisgICAgICAgICogV2Vi
Vmlldy5jcHA6CisgICAgICAgIChXZWJWaWV3OjpoYW5kbGVDb250ZXh0TWVudUV2ZW50KTogQ2Fs
bCBuYXRpdmVNZW51IGluc3RlYWQgb2YgcGxhdGZvcm1EZXNjcmlwdGlvbi4KKyAgICAgICAgKFdl
YlZpZXc6OnBlcmZvcm1Db250ZXh0TWVudUFjdGlvbik6IE9ubHkgY2FsbCBpdGVtQXRJbmRleCB3
aXRoIG9uZSBhcmd1bWVudCwgbm8gbmVlZAorICAgICAgICAgICAgZm9yIHRoZSBzZWNvbmQuCisK
IDIwMTAtMTItMDcgIEJyaWFuIFdlaW5zdGVpbiAgPGJ3ZWluc3RlaW5AYXBwbGUuY29tPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IEpvaG4gU3VsbGl2YW4uCkluZGV4OiBXZWJLaXQvd2luL1dlYlZp
ZXcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC93aW4vV2ViVmlldy5jcHAJKHJldmlzaW9uIDcz
NjYyKQorKysgV2ViS2l0L3dpbi9XZWJWaWV3LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTI3NSwx
MiArMTI3NSwxMiBAQCBib29sIFdlYlZpZXc6OmhhbmRsZUNvbnRleHRNZW51RXZlbnQoV1BBCiAg
ICAgICAgIG1fdWlEZWxlZ2F0ZS0+aGFzQ3VzdG9tTWVudUltcGxlbWVudGF0aW9uKCZoYXNDdXN0
b21NZW51cyk7CiAKICAgICBpZiAoaGFzQ3VzdG9tTWVudXMpCi0gICAgICAgIG1fdWlEZWxlZ2F0
ZS0+dHJhY2tDdXN0b21Qb3B1cE1lbnUoKElXZWJWaWV3Kil0aGlzLCAoT0xFX0hBTkRMRSkoVUxP
Tkc2NCljb3JlTWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpLCAmcG9pbnQpOworICAgICAgICBt
X3VpRGVsZWdhdGUtPnRyYWNrQ3VzdG9tUG9wdXBNZW51KChJV2ViVmlldyopdGhpcywgKE9MRV9I
QU5ETEUpKFVMT05HNjQpY29yZU1lbnUtPm5hdGl2ZU1lbnUoKSwgJnBvaW50KTsKICAgICBlbHNl
IHsKICAgICAgICAgLy8gU3VycHJpc2luZ2x5LCBUUE1fUklHSFRCVVRUT04gbWVhbnMgdGhhdCBp
dGVtcyBhcmUgc2VsZWN0YWJsZSB3aXRoIGVpdGhlciB0aGUgcmlnaHQgT1IgbGVmdCBtb3VzZSBi
dXR0b24KICAgICAgICAgVUlOVCBmbGFncyA9IFRQTV9SSUdIVEJVVFRPTiB8IFRQTV9UT1BBTElH
TiB8IFRQTV9WRVJQT1NBTklNQVRJT04gfCBUUE1fSE9SSVpPTlRBTAogICAgICAgICAgICAgfCBU
UE1fTEVGVEFMSUdOIHwgVFBNX0hPUlBPU0FOSU1BVElPTjsKLSAgICAgICAgOjpUcmFja1BvcHVw
TWVudUV4KGNvcmVNZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCksIGZsYWdzLCBwb2ludC54LCBw
b2ludC55LCBtX3ZpZXdXaW5kb3csIDApOworICAgICAgICA6OlRyYWNrUG9wdXBNZW51RXgoY29y
ZU1lbnUtPm5hdGl2ZU1lbnUoKSwgZmxhZ3MsIHBvaW50LngsIHBvaW50LnksIG1fdmlld1dpbmRv
dywgMCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CkBAIC0xMzU1LDExICsxMzU1LDEwIEBA
IHZvaWQgV2ViVmlldzo6cGVyZm9ybUNvbnRleHRNZW51QWN0aW9uKFcKICAgICBDb250ZXh0TWVu
dSogbWVudSA9IG1fcGFnZS0+Y29udGV4dE1lbnVDb250cm9sbGVyKCktPmNvbnRleHRNZW51KCk7
CiAgICAgQVNTRVJUKG1lbnUpOwogCi0gICAgQ29udGV4dE1lbnVJdGVtKiBpdGVtID0gYnlQb3Np
dGlvbiA/IG1lbnUtPml0ZW1BdEluZGV4KCh1bnNpZ25lZCl3UGFyYW0sIChITUVOVSlsUGFyYW0p
IDogbWVudS0+aXRlbVdpdGhBY3Rpb24oKENvbnRleHRNZW51QWN0aW9uKXdQYXJhbSk7CisgICAg
Q29udGV4dE1lbnVJdGVtKiBpdGVtID0gYnlQb3NpdGlvbiA/IG1lbnUtPml0ZW1BdEluZGV4KCh1
bnNpZ25lZCl3UGFyYW0pIDogbWVudS0+aXRlbVdpdGhBY3Rpb24oKENvbnRleHRNZW51QWN0aW9u
KXdQYXJhbSk7CiAgICAgaWYgKCFpdGVtKQogICAgICAgICByZXR1cm47CiAgICAgbV9wYWdlLT5j
b250ZXh0TWVudUNvbnRyb2xsZXIoKS0+Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQoaXRlbSk7Ci0g
ICAgZGVsZXRlIGl0ZW07CiB9CiAKIGJvb2wgV2ViVmlldzo6aGFuZGxlTW91c2VFdmVudChVSU5U
IG1lc3NhZ2UsIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCkluZGV4OiBXZWJLaXQvd2lu
L1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmNwcAkocmV2aXNp
b24gNzM2NjIpCisrKyBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xp
ZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTUsMjEgKzU1LDI5IEBAIHZvaWQgV2ViQ29udGV4
dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51RGUKICAgICBkZWxldGUgdGhpczsKIH0KIAotSE1FTlUg
V2ViQ29udGV4dE1lbnVDbGllbnQ6OmdldEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0ZW1zKENvbnRl
eHRNZW51KiBtZW51KQorUGFzc093blB0cjxDb250ZXh0TWVudT4gV2ViQ29udGV4dE1lbnVDbGll
bnQ6OmN1c3RvbWl6ZU1lbnUoUGFzc093blB0cjxDb250ZXh0TWVudT4gcG9wTWVudSkKIHsKKyAg
ICBPd25QdHI8Q29udGV4dE1lbnU+IG1lbnUgPSBwb3BNZW51OworCiAgICAgQ09NUHRyPElXZWJV
SURlbGVnYXRlPiB1aURlbGVnYXRlOwogICAgIGlmIChGQUlMRUQobV93ZWJWaWV3LT51aURlbGVn
YXRlKCZ1aURlbGVnYXRlKSkpCi0gICAgICAgIHJldHVybiBtZW51LT5wbGF0Zm9ybURlc2NyaXB0
aW9uKCk7CisgICAgICAgIHJldHVybiBtZW51LnJlbGVhc2UoKTsKIAogICAgIEFTU0VSVCh1aURl
bGVnYXRlKTsKIAotICAgIEhNRU5VIG5ld01lbnUgPSAwOworICAgIEhNRU5VIG5hdGl2ZU1lbnUg
PSBtZW51LT5uYXRpdmVNZW51KCk7CiAgICAgQ09NUHRyPFdlYkVsZW1lbnRQcm9wZXJ0eUJhZz4g
cHJvcGVydHlCYWc7CiAgICAgcHJvcGVydHlCYWcuYWRvcHRSZWYoV2ViRWxlbWVudFByb3BlcnR5
QmFnOjpjcmVhdGVJbnN0YW5jZShtX3dlYlZpZXctPnBhZ2UoKS0+Y29udGV4dE1lbnVDb250cm9s
bGVyKCktPmhpdFRlc3RSZXN1bHQoKSkpOwogICAgIC8vIEZJWE1FOiBXZSBuZWVkIHRvIGRlY2lk
ZSB3aGV0aGVyIHRvIGRvIHRoZSBkZWZhdWx0IGJlZm9yZSBjYWxsaW5nIHRoaXMgZGVsZWdhdGUg
bWV0aG9kCi0gICAgaWYgKEZBSUxFRCh1aURlbGVnYXRlLT5jb250ZXh0TWVudUl0ZW1zRm9yRWxl
bWVudChtX3dlYlZpZXcsIHByb3BlcnR5QmFnLmdldCgpLCAoT0xFX0hBTkRMRSkoVUxPTkc2NClt
ZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCksIChPTEVfSEFORExFKikmbmV3TWVudSkpKQotICAg
ICAgICByZXR1cm4gbWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpOwotICAgIHJldHVybiBuZXdN
ZW51OworICAgIGlmIChGQUlMRUQodWlEZWxlZ2F0ZS0+Y29udGV4dE1lbnVJdGVtc0ZvckVsZW1l
bnQobV93ZWJWaWV3LCBwcm9wZXJ0eUJhZy5nZXQoKSwgKE9MRV9IQU5ETEUpKFVMT05HNjQpbmF0
aXZlTWVudSwgKE9MRV9IQU5ETEUqKSZuYXRpdmVNZW51KSkpIHsKKyAgICAgICAgOjpEZXN0cm95
TWVudShuYXRpdmVNZW51KTsKKyAgICAgICAgcmV0dXJuIG1lbnUucmVsZWFzZSgpOworICAgIH0K
KyAgICAKKyAgICBPd25QdHI8Q29udGV4dE1lbnU+IGN1c3RvbWl6ZWRNZW51ID0gYWRvcHRQdHIo
bmV3IENvbnRleHRNZW51KG5hdGl2ZU1lbnUpKTsKKyAgICA6OkRlc3Ryb3lNZW51KG5hdGl2ZU1l
bnUpOworCisgICAgcmV0dXJuIGN1c3RvbWl6ZWRNZW51LnJlbGVhc2UoKTsKIH0KIAogdm9pZCBX
ZWJDb250ZXh0TWVudUNsaWVudDo6Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQoQ29udGV4dE1lbnVJ
dGVtKiBpdGVtLCBjb25zdCBDb250ZXh0TWVudSogcGFyZW50TWVudSkKQEAgLTg0LDggKzkyLDE3
IEBAIHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51SXQKIAogICAgIENPTVB0
cjxXZWJFbGVtZW50UHJvcGVydHlCYWc+IHByb3BlcnR5QmFnOwogICAgIHByb3BlcnR5QmFnLmFk
b3B0UmVmKFdlYkVsZW1lbnRQcm9wZXJ0eUJhZzo6Y3JlYXRlSW5zdGFuY2UobV93ZWJWaWV3LT5w
YWdlKCktPmNvbnRleHRNZW51Q29udHJvbGxlcigpLT5oaXRUZXN0UmVzdWx0KCkpKTsKLSAgICAg
ICAgICAgIAotICAgIHVpRGVsZWdhdGUtPmNvbnRleHRNZW51SXRlbVNlbGVjdGVkKG1fd2ViVmll
dywgaXRlbS0+cmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKSwgcHJvcGVydHlCYWcuZ2V0KCkp
OworCisgICAgLy8gVGhpcyBjYWxsIHdvdWxkIGxlYWsgdGhlIE1FTlVJVEVNSU5GTydzIHN1Yk1l
bnUgaWYgaXQgaGFkIG9uZSwgYnV0IG9uIFdpbmRvd3MsIHN1Yk1lbnVzIGNhbid0IGJlIHNlbGVj
dGVkLCBzbyB0aGVyZSBpcworICAgIC8vIG5vIHdheSB3ZSB3b3VsZCBnZXQgdG8gdGhpcyBwb2lu
dC4gQWxzbywgaXQgY2FuJ3QgYmUgYSBzZXBhcmF0b3IsIGJlY2F1c2Ugc2VwYXJhdG9ycyBjYW5u
b3QgYmUgc2VsZWN0ZWQuCisgICAgQVNTRVJUKGl0ZW0tPnR5cGUoKSAhPSBTdWJtZW51VHlwZSk7
CisgICAgQVNTRVJUKGl0ZW0tPnR5cGUoKSAhPSBTZXBhcmF0b3JUeXBlKTsKKworICAgIC8vIENv
bnRleHRNZW51SXRlbTo6bmF0aXZlTWVudUl0ZW0gZG9lc24ndCBzZXQgdGhlIGR3VHlwZURhdGEg
b2YgdGhlIE1FTlVJVEVNSU5GTywgYnV0IG5vIFdlYktpdCBjbGllbnRzCisgICAgLy8gdXNlIHRo
ZSB0aXRsZSBpbiBJV2ViVUlEZWxlZ2F0ZTo6Y29udGV4dE1lbnVJdGVtU2VsZWN0ZWQsIHNvIHdl
IGRvbid0IG5lZWQgdG8gcG9wdWxhdGUgaXQgaGVyZS4KKyAgICBNRU5VSVRFTUlORk8gc2VsZWN0
ZWRJdGVtID0gaXRlbS0+bmF0aXZlTWVudUl0ZW0oKTsKKworICAgIHVpRGVsZWdhdGUtPmNvbnRl
eHRNZW51SXRlbVNlbGVjdGVkKG1fd2ViVmlldywgJnNlbGVjdGVkSXRlbSwgcHJvcGVydHlCYWcu
Z2V0KCkpOwogfQogCiB2b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50Ojpkb3dubG9hZFVSTChjb25z
dCBLVVJMJiB1cmwpCkluZGV4OiBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRN
ZW51Q2xpZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJD
b250ZXh0TWVudUNsaWVudC5oCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYktpdC93aW4vV2ViQ29y
ZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMjMsOCAr
MjMsMTAgQEAKICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAogICovCiAKKyNpbmNsdWRlIDxXZWJDb3JlL0NvbnRl
eHRNZW51Lmg+CiAjaW5jbHVkZSA8V2ViQ29yZS9Db250ZXh0TWVudUNsaWVudC5oPgogI2luY2x1
ZGUgPHd0Zi9Gb3J3YXJkLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KIAogY2xhc3Mg
V2ViVmlldzsKIApAQCAtMzQsNyArMzYsNyBAQCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIHZvaWQg
Y29udGV4dE1lbnVEZXN0cm95ZWQoKTsKIAotICAgIHZpcnR1YWwgSE1FTlUgZ2V0Q3VzdG9tTWVu
dUZyb21EZWZhdWx0SXRlbXMoV2ViQ29yZTo6Q29udGV4dE1lbnUqKTsKKyAgICB2aXJ0dWFsIFBh
c3NPd25QdHI8V2ViQ29yZTo6Q29udGV4dE1lbnU+IGN1c3RvbWl6ZU1lbnUoUGFzc093blB0cjxX
ZWJDb3JlOjpDb250ZXh0TWVudT4pOwogICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudUl0ZW1T
ZWxlY3RlZChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW0qLCBjb25zdCBXZWJDb3JlOjpDb250ZXh0
TWVudSopOwogICAgIAogICAgIHZpcnR1YWwgdm9pZCBkb3dubG9hZFVSTChjb25zdCBXZWJDb3Jl
OjpLVVJMJik7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76242</attachid>
            <date>2010-12-10 12:51:01 -0800</date>
            <delta_ts>2010-12-10 12:51:26 -0800</delta_ts>
            <desc>[PATCH] For EWS bots + Adam&apos;s last comments</desc>
            <filename>context_menu_refactoring_win.patch</filename>
            <type>text/plain</type>
            <size>50537</size>
            <attacher name="Brian Weinstein">bweinstein</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDczNzQyKQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTEgQEAKKzIwMTAtMTItMTAgIEJyaWFuIFdl
aW5zdGVpbiAgPGJ3ZWluc3RlaW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFR1cm4gb24gVVNFKENST1NTX1BMQVRGT1JNX0NPTlRF
WFRfTUVOVVMpIGZvciBXaW5kb3dzLgorCisgICAgICAgICogd3RmL1BsYXRmb3JtLmg6CisKIDIw
MTAtMTItMTAgIFBhdHJpY2sgR2Fuc3RlcmVyICA8cGFyb2dhQHdlYmtpdC5vcmc+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgRXJpYyBTZWlkZWwuCkluZGV4OiBKYXZhU2NyaXB0Q29yZS93dGYvUGxh
dGZvcm0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvUGxhdGZvcm0uaAkocmV2
aXNpb24gNzM2NjIpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvUGxhdGZvcm0uaAkod29ya2luZyBj
b3B5KQpAQCAtMTEwNiw2ICsxMTA2LDEwIEBACiAjZGVmaW5lIFdURl9VU0VfUExBVEZPUk1fU1RS
QVRFR0lFUyAxCiAjZW5kaWYKIAorI2lmIFBMQVRGT1JNKFdJTikKKyNkZWZpbmUgV1RGX1VTRV9D
Uk9TU19QTEFURk9STV9DT05URVhUX01FTlVTIDEKKyNlbmRpZgorCiAvKiBHZW9sb2NhdGlvbiBy
ZXF1ZXN0IHBvbGljeS4gcHJlLWVtcHRpdmUgcG9saWN5IGlzIHRvIGFjcXVpcmUgdXNlciBwZXJt
aXNzaW9uIGJlZm9yZSBhY3F1aXJpbmcgbG9jYXRpb24uCiAgICBDbGllbnQgYmFzZWQgaW1wbGVt
ZW50YXRpb25zIHdpbGwgaGF2ZSBvcHRpb24gdG8gY2hvb3NlIGJldHdlZW4gcHJlLWVtcHRpdmUg
YW5kIG5vbnByZS1lbXB0aXZlIHBlcm1pc3Npb24gcG9saWN5LgogICAgcHJlLWVtcHRpdmUgcGVy
bWlzc2lvbiBwb2xpY3kgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGZvciBhbGwgY2xpZW50LWJhc2Vk
IGltcGxlbWVudGF0aW9ucy4gKi8KSW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvQ2hhbmdlTG9nCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzUgQEAKKzIwMTAtMTItMDkgIEJyaWFuIFdl
aW5zdGVpbiAgPGJ3ZWluc3RlaW5AYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFByZXAgZm9yIFdlYktpdDI6IENvbnRleHQgbWVudSBz
dXBwb3J0IG9uIFdpbmRvd3MKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTUwNTE0CisgICAgICAgIAorICAgICAgICBCZWZvcmUgdGhpcyBwYXRjaCBDb250
ZXh0TWVudSBvbiBXaW5kb3dzIHdlcmUgYmFja2VkIGJ5IEhNRU5VcywgYW5kIENvbnRleHRNZW51
SXRlbXMKKyAgICAgICAgd2VyZSBiYWNrZWQgYnkgTUVOVUlURU1JTkZPcy4gVGhpcyBtZWFudCB0
aGV5IGNvdWxkbid0IGJlIGNvcGllZCwgYW5kIHRoZXkgbmVlZGVkIHRvCisgICAgICAgIGJlIHRv
IHdvcmsgaW4gV2ViS2l0Mi4KKyAgICAgICAgCisgICAgICAgIFRoaXMgcGF0Y2ggYWRkcyBhIG5l
dyBVU0UgZmxhZyAtIENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMgdGhhdCBhcmUgZm9yIGEg
Y3Jvc3MtcGxhdGZvcm0KKyAgICAgICAgcmVwcmVzZW50YXRpb24gb2YgY29udGV4dCBtZW51cy4g
VGhpcyBwYXRjaCBhbHNvIGhhcyBXaW5kb3dzIGFkb3B0IHRoZW0uCisgICAgICAgIAorICAgICAg
ICBDcm9zcy1wbGF0Zm9ybSBjb250ZXh0IG1lbnVzIGNoYW5nZSB0aGUgQVBJIG9mIGNvbnRleHQg
bWVudXMgYW5kIHRoZSBDb250ZXh0TWVudUNsaWVudC4gVGhlcmUKKyAgICAgICAgaXMgbm8gbW9y
ZSBpZGVhIG9mIGEgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gb3IgYSBQbGF0Zm9ybU1lbnVJdGVt
RGVzY3JpcHRpb24uIE1lbnVzIGFyZSBiYWNrZWQKKyAgICAgICAgYnkgYSBWZWN0b3Igb2YgQ29u
dGV4dE1lbnVJdGVtcywgYW5kIG1lbnUgaXRlbXMgYXJlIGJhY2tlZCBieSB0aGUgdmFyaWFibGVz
IHRoZXkgbmVlZCAoZW5hYmxlZCwgY2hlY2tlZAorICAgICAgICB0aXRsZSwgYWN0aW9uLCB0eXBl
LCBhbmQgc3VibWVudSkuCisgICAgICAgIAorICAgICAgICBUaGlzIHBhdGNoIGFsc28gcmVmYWN0
b3JzIHRoZSBDb250ZXh0TWVudUNsaWVudCBpbnRlcmZhY2UgdG8gdXNlIGEgdmFyaWF0aW9uIG9u
IHRoZSBnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcworICAgICAgICBmdW5jdGlvbiB0byBh
bGxvdyBmb3IgY3VzdG9taXphdGlvbiBvZiB0aGUgY29udGV4dCBtZW51LgorICAgICAgICAKKyAg
ICAgICAgRm9yIG90aGVyIHBvcnRzIHRvIHVzZSBDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVT
LCBhbGwgdGhleSBuZWVkIHRvIGRvIGlzIHdyaXRlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGZyb20K
KyAgICAgICAgYSBDb250ZXh0TWVudSA8LT4gbmF0aXZlIG1lbnUgdHlwZSwgYW5kIENvbnRleHRN
ZW51SXRlbSA8LT4gbmF0aXZlIG1lbnUgaXRlbSB0eXBlLiBGb3IgV2luZG93cywgdGhpcyBpcyBk
b25lCisgICAgICAgIGluIENvbnRleHRNZW51V2luLmNwcCBhbmQgQ29udGV4dE1lbnVJdGVtV2lu
LmNwcC4KKworICAgICAgICBObyBuZXcgdGVzdHMsIG5vIGNoYW5nZSBpbiBiZWhhdmlvci4KKwor
ICAgICAgICAqIFdlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qOiBBZGQgbmV3IGZpbGVzIChv
bmx5IG5lZWRlZCBvbiBXaW5kb3dzIGZvciBub3cpLgorICAgICAgICAqIGxvYWRlci9FbXB0eUNs
aWVudHMuaDoKKyAgICAgICAgKFdlYkNvcmU6OkVtcHR5Q29udGV4dE1lbnVDbGllbnQ6OmN1c3Rv
bWl6ZU1lbnUpOiBEZWZpbmUgdGhpcyBmdW5jdGlvbiBpZiBDUk9TU19QTEFURk9STV9DT05URVhU
X01FTlVTCisgICAgICAgICAgICBpcyBvbi4KKyAgICAgICAgKiBwYWdlL0NvbnRleHRNZW51Q2xp
ZW50Lmg6IERpdHRvLiAKKyAgICAgICAgKiBwYWdlL0NvbnRleHRNZW51Q29udHJvbGxlci5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUNvbnRyb2xsZXI6OnNob3dDb250ZXh0TWVu
dSk6IENhbGwgY3VzdG9taXplTWVudSBpbnN0ZWFkIG9mIAorICAgICAgICAgICAgZ2V0Q3VzdG9t
TWVudUZyb21EZWZhdWx0SXRlbXMgaWYgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUyBpcyBv
bi4KKyAgICAgICAgKiBwbGF0Zm9ybS9Db250ZXh0TWVudS5jcHA6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZTo6Q29udGV4dE1lbnU6OkNvbnRleHRNZW51KTogRW1wdHkgY29uc3RydWN0b3IuCisg
ICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudTo6c2V0SXRlbXMpOiBTZXRzIHRoZSBpdGVtcyBp
biB0aGUgbWVudS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRNZW51OjppdGVtcyk6IFJldHVy
bnMgdGhlIGl0ZW1zIGluIHRoZSBtZW51LgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6
Oml0ZW1BdEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6Oml0ZW1XaXRoQWN0aW9uSW5NZW51KTog
UmV0dXJucyB0aGUgaXRlbSB3aXRoIHRoZSBjb3JyZWN0IGFjdGlvbiwgcmVjdXJzaXZlbHkgZGVz
Y2VuZGluZworICAgICAgICAgICAgaW50byBzdWJtZW51cy4KKyAgICAgICAgKFdlYkNvcmU6OkNv
bnRleHRNZW51OjppdGVtV2l0aEFjdGlvbik6IENhbGxzIHRocm91Z2ggdG8gaXRlbVdpdGhBY3Rp
b25Jbk1lbnUuCisgICAgICAgICogcGxhdGZvcm0vQ29udGV4dE1lbnUuaDogQWRkZWQgYSBuZXcg
c2V0IG9mIGZ1bmN0aW9ucyBhbmQgbWVtYmVyIHZhcmlhYmxlcyB0aGF0IGFyZSBkZWZpbmVkIGZv
cgorICAgICAgICAgICAgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUy4KKyAgICAgICAgKFdl
YkNvcmU6OkNvbnRleHRNZW51OjphcHBlbmRJdGVtKTogQXBwZW5kcyBhbiBpdGVtIHRvIHRoZSBt
ZW51LgorICAgICAgICAqIHBsYXRmb3JtL0NvbnRleHRNZW51SXRlbS5jcHA6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0pOgorICAgICAg
ICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjp+Q29udGV4dE1lbnVJdGVtKToKKyAgICAgICAg
KFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbTo6c2V0U3ViTWVudSk6CisgICAgICAgICogcGxhdGZv
cm0vQ29udGV4dE1lbnVJdGVtLmg6CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06
OnR5cGUpOiBSZXR1cm5zIHRoZSB0eXBlLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJ
dGVtOjpzZXRUeXBlKTogU2V0cyB0aGUgdHlwZS4KKyAgICAgICAgKFdlYkNvcmU6OkNvbnRleHRN
ZW51SXRlbTo6YWN0aW9uKTogUmV0dXJucyB0aGUgYWN0aW9uLgorICAgICAgICAoV2ViQ29yZTo6
Q29udGV4dE1lbnVJdGVtOjpzZXRBY3Rpb24pOiBTZXRzIHRoZSBhY3Rpb24uCisgICAgICAgIChX
ZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnRpdGxlKTogUmV0dXJucyB0aGUgdGl0bGUuCisgICAg
ICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnNldFRpdGxlKTogU2V0cyB0aGUgdGl0bGUu
CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OmNoZWNrZWQpOiBSZXR1cm5zIHdo
ZXRoZXIgb3Igbm90IHRoZSBtZW51IGl0ZW0gaXMgY2hlY2tlZC4KKyAgICAgICAgKFdlYkNvcmU6
OkNvbnRleHRNZW51SXRlbTo6c2V0Q2hlY2tlZCk6IFNldHMgd2hldGhlciBvdCBub3QgdGhlIG1l
bnUgaXRlbSBpcyBjaGVja2VkLgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpl
bmFibGVkKTogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWVudSBpdGVtIGlzIGVuYWJsZWQu
CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06OnNldEVuYWJsZWQpOiBTZXRzIHdo
ZXRoZXIgb3Igbm90IHRoZSBtZW51IGl0ZW0gaXMgZW5hYmxlZC4KKyAgICAgICAgKFdlYkNvcmU6
OkNvbnRleHRNZW51SXRlbTo6c3VibWVudSk6IFJldHVybnMgdGhlIHN1Ym1lbnUuCisgICAgICAg
ICogcGxhdGZvcm0vUGxhdGZvcm1NZW51RGVzY3JpcHRpb24uaDogUmVtb3ZlIHRoZSBpZGVhIGlm
IGEgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gaWYgCisgICAgICAgICAgICBDUk9TU19QTEFURk9S
TV9DT05URVhUX01FTlVTIGlzIG9uLgorICAgICAgICAqIHBsYXRmb3JtL3dpbi9Db250ZXh0TWVu
dUl0ZW1XaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtOjpDb250ZXh0
TWVudUl0ZW0pOiBDcmVhdGVzIGEgQ29udGV4dE1lbnVJdGVtIGZyb20gYSBNRU5VSVRFTUlORk8u
CisgICAgICAgIChXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW06Om5hdGl2ZU1lbnVJdGVtKTogQ3Jl
YXRlcyBhbmQgcmV0dXJucyBhIE1FTlVJVEVNSU5GTy4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW4v
Q29udGV4dE1lbnVXaW4uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4dE1lbnU6OkNvbnRl
eHRNZW51KTogQ3JlYXRlcyBhIENvbnRleHRNZW51IGZyb20gYW4gSE1FTlUuCisgICAgICAgIChX
ZWJDb3JlOjpDb250ZXh0TWVudTo6bmF0aXZlTWVudSk6IENyZWF0ZXMgYW5kIHJldHVybnMgYW4g
SE1FTlUuCisKIDIwMTAtMTItMDkgIERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29tPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IFNhbSBXZWluaWcuCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUudmNw
cm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ov
V2ViQ29yZS52Y3Byb2oJKHJldmlzaW9uIDczNjYyKQorKysgV2ViQ29yZS9XZWJDb3JlLnZjcHJv
ai9XZWJDb3JlLnZjcHJvagkod29ya2luZyBjb3B5KQpAQCAtMjUzMTMsMTAgKzI1MzEzLDE4IEBA
CiAJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxDb250ZW50VHlwZS5oIgogCQkJCT4KIAkJ
CTwvRmlsZT4KKyAgICAgICAgICAgIDxGaWxlCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9y
bVxDb250ZXh0TWVudS5jcHAiCisJCQkJPgorCQkJPC9GaWxlPgogCQkJPEZpbGUKIAkJCQlSZWxh
dGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXENvbnRleHRNZW51LmgiCiAJCQkJPgogCQkJPC9GaWxlPgor
ICAgICAgICAgICAgPEZpbGUKKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBsYXRmb3JtXENvbnRleHRN
ZW51SXRlbS5jcHAiCisJCQkJPgorCQkJPC9GaWxlPgogCQkJPEZpbGUKIAkJCQlSZWxhdGl2ZVBh
dGg9Ii4uXHBsYXRmb3JtXENvbnRleHRNZW51SXRlbS5oIgogCQkJCT4KSW5kZXg6IFdlYkNvcmUv
bG9hZGVyL0VtcHR5Q2xpZW50cy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvbG9hZGVyL0VtcHR5
Q2xpZW50cy5oCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYkNvcmUvbG9hZGVyL0VtcHR5Q2xpZW50
cy5oCSh3b3JraW5nIGNvcHkpCkBAIC01MDEsNyArNTAxLDExIEBAIHB1YmxpYzoKICAgICB2aXJ0
dWFsIH5FbXB0eUNvbnRleHRNZW51Q2xpZW50KCkgeyAgfQogICAgIHZpcnR1YWwgdm9pZCBjb250
ZXh0TWVudURlc3Ryb3llZCgpIHsgfQogCisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRf
TUVOVVMpCisgICAgdmlydHVhbCBQYXNzT3duUHRyPENvbnRleHRNZW51PiBjdXN0b21pemVNZW51
KFBhc3NPd25QdHI8Q29udGV4dE1lbnU+KSB7IHJldHVybiAwOyB9CisjZWxzZQogICAgIHZpcnR1
YWwgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gZ2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMo
Q29udGV4dE1lbnUqKSB7IHJldHVybiAwOyB9CisjZW5kaWYKICAgICB2aXJ0dWFsIHZvaWQgY29u
dGV4dE1lbnVJdGVtU2VsZWN0ZWQoQ29udGV4dE1lbnVJdGVtKiwgY29uc3QgQ29udGV4dE1lbnUq
KSB7IH0KIAogICAgIHZpcnR1YWwgdm9pZCBkb3dubG9hZFVSTChjb25zdCBLVVJMJikgeyB9Cklu
ZGV4OiBXZWJDb3JlL3BhZ2UvQ29udGV4dE1lbnVDbGllbnQuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3BhZ2UvQ29udGV4dE1lbnVDbGllbnQuaAkocmV2aXNpb24gNzM2NjIpCisrKyBXZWJDb3Jl
L3BhZ2UvQ29udGV4dE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMjYsMTEgKzI2LDEy
IEBACiAjaWZuZGVmIENvbnRleHRNZW51Q2xpZW50X2gKICNkZWZpbmUgQ29udGV4dE1lbnVDbGll
bnRfaAogCisjaW5jbHVkZSAiQ29udGV4dE1lbnUuaCIKICNpbmNsdWRlICJQbGF0Zm9ybU1lbnVE
ZXNjcmlwdGlvbi5oIgogI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CisjaW5jbHVkZSA8d3RmL1Bh
c3NPd25QdHIuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewotICAgIGNsYXNzIENvbnRleHRNZW51
OwogICAgIGNsYXNzIENvbnRleHRNZW51SXRlbTsKICAgICBjbGFzcyBGcmFtZTsKICAgICBjbGFz
cyBIaXRUZXN0UmVzdWx0OwpAQCAtNDEsNyArNDIsMTIgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewog
ICAgICAgICB2aXJ0dWFsIH5Db250ZXh0TWVudUNsaWVudCgpIHsgIH0KICAgICAgICAgdmlydHVh
bCB2b2lkIGNvbnRleHRNZW51RGVzdHJveWVkKCkgPSAwOwogICAgICAgICAKKyNpZiBVU0UoQ1JP
U1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKyAgICAgICAgdmlydHVhbCBQYXNzT3duUHRyPENv
bnRleHRNZW51PiBjdXN0b21pemVNZW51KFBhc3NPd25QdHI8Q29udGV4dE1lbnU+KSA9IDA7Cisj
ZWxzZQogICAgICAgICB2aXJ0dWFsIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGdldEN1c3RvbU1l
bnVGcm9tRGVmYXVsdEl0ZW1zKENvbnRleHRNZW51KikgPSAwOworI2VuZGlmCisKICAgICAgICAg
dmlydHVhbCB2b2lkIGNvbnRleHRNZW51SXRlbVNlbGVjdGVkKENvbnRleHRNZW51SXRlbSosIGNv
bnN0IENvbnRleHRNZW51KikgPSAwOwogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBkb3dubG9hZFVS
TChjb25zdCBLVVJMJiB1cmwpID0gMDsKSW5kZXg6IFdlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNv
bnRyb2xsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNvbnRy
b2xsZXIuY3BwCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYkNvcmUvcGFnZS9Db250ZXh0TWVudUNv
bnRyb2xsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDQsOCArMTQ0LDEzIEBAIHZvaWQgQ29u
dGV4dE1lbnVDb250cm9sbGVyOjpzaG93Q29udGV4dE0KICAgICBpZiAobV9wYWdlLT5pbnNwZWN0
b3JDb250cm9sbGVyKCktPmVuYWJsZWQoKSkKICAgICAgICAgYWRkSW5zcGVjdEVsZW1lbnRJdGVt
KCk7CiAjZW5kaWYKKworI2lmIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQorICAg
IG1fY29udGV4dE1lbnUgPSBtX2NsaWVudC0+Y3VzdG9taXplTWVudShtX2NvbnRleHRNZW51LnJl
bGVhc2UoKSk7CisjZWxzZQogICAgIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGN1c3RvbU1lbnUg
PSBtX2NsaWVudC0+Z2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMobV9jb250ZXh0TWVudS5n
ZXQoKSk7CiAgICAgbV9jb250ZXh0TWVudS0+c2V0UGxhdGZvcm1EZXNjcmlwdGlvbihjdXN0b21N
ZW51KTsKKyNlbmRpZgogICAgIGV2ZW50LT5zZXREZWZhdWx0SGFuZGxlZCgpOwogfQogCkluZGV4
OiBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL0NvbnRleHRNZW51LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZv
cm0vQ29udGV4dE1lbnUuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDYxIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51LmgiCisKKyNp
ZiBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitDb250ZXh0TWVudTo6Q29udGV4dE1lbnUoKQoreworfQorCitzdGF0aWMgY29uc3QgQ29u
dGV4dE1lbnVJdGVtKiBmaW5kSXRlbVdpdGhBY3Rpb24odW5zaWduZWQgYWN0aW9uLCBjb25zdCBW
ZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYgaXRlbXMpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBpdGVtcy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBDb250ZXh0TWVudUl0ZW0m
IGl0ZW0gPSBpdGVtc1tpXTsKKyAgICAgICAgaWYgKGl0ZW0uYWN0aW9uKCkgPT0gYWN0aW9uKQor
ICAgICAgICAgICAgcmV0dXJuICZpdGVtOworICAgICAgICBpZiAoaXRlbS50eXBlKCkgIT0gU3Vi
bWVudVR5cGUpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGNvbnN0IENvbnRl
eHRNZW51SXRlbSogc3ViTWVudUl0ZW0gPSBmaW5kSXRlbVdpdGhBY3Rpb24oYWN0aW9uLCBpdGVt
LnN1Yk1lbnVJdGVtcygpKSkKKyAgICAgICAgICAgIHJldHVybiBzdWJNZW51SXRlbTsKKyAgICB9
CisKKyAgICByZXR1cm4gMDsKK30KKworQ29udGV4dE1lbnVJdGVtKiBDb250ZXh0TWVudTo6aXRl
bVdpdGhBY3Rpb24odW5zaWduZWQgYWN0aW9uKQoreworICAgIC8vIEZJWE1FOiBXaGVuIG1vcmUg
cGxhdGZvcm1zIHN3aXRjaCBvdmVyLCB0aGlzIGZ1Y250aW9uIHNob3VsZCByZXR1cm4gYSBjb25z
dCBDb250ZXh0TWVudUl0ZW0qJ3MsIGFuZCB0aGUgY29uc3RfY2FzdAorICAgIC8vIHdvbid0IGJl
IG5lZWRlZCBhbnltb3JlLgorICAgIHJldHVybiBjb25zdF9jYXN0PENvbnRleHRNZW51SXRlbSo+
KGZpbmRJdGVtV2l0aEFjdGlvbihhY3Rpb24sIG1faXRlbXMpKTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMp
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL0NvbnRleHRNZW51LmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudS5oCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYkNvcmUv
cGxhdGZvcm0vQ29udGV4dE1lbnUuaAkod29ya2luZyBjb3B5KQpAQCAtNDgsMTMgKzQ4LDM0IEBA
IG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICB7CiAgICAgcHVibGljOgogICAgICAgICBDb250ZXh0
TWVudSgpOworCisgICAgICAgIENvbnRleHRNZW51SXRlbSogaXRlbVdpdGhBY3Rpb24odW5zaWdu
ZWQpOworCisjaWYgVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCisjaWYgUExBVEZP
Uk0oV0lOKQorICAgICAgICB0eXBlZGVmIEhNRU5VIE5hdGl2ZU1lbnU7CisjZW5kaWYKKyAgICAg
ICAgZXhwbGljaXQgQ29udGV4dE1lbnUoTmF0aXZlTWVudSk7CisKKyAgICAgICAgTmF0aXZlTWVu
dSBuYXRpdmVNZW51KCkgY29uc3Q7CisKKyAgICAgICAgc3RhdGljIE5hdGl2ZU1lbnUgY3JlYXRl
TmF0aXZlTWVudUZyb21JdGVtcyhjb25zdCBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYpOworICAg
ICAgICBzdGF0aWMgdm9pZCBnZXRDb250ZXh0TWVudUl0ZW1zKE5hdGl2ZU1lbnUsIFZlY3RvcjxD
b250ZXh0TWVudUl0ZW0+Jik7CisKKyAgICAgICAgLy8gRklYTUU6IFdoZW4gbW9yZSBwbGF0Zm9y
bXMgc3dpdGNoIG92ZXIsIHRoaXMgc2hvdWxkIHJldHVybiBjb25zdCBDb250ZXh0TWVudUl0ZW0q
J3MuCisgICAgICAgIENvbnRleHRNZW51SXRlbSogaXRlbUF0SW5kZXgodW5zaWduZWQgaW5kZXgp
IHsgcmV0dXJuICZtX2l0ZW1zW2luZGV4XTsgfQorCisgICAgICAgIHZvaWQgc2V0SXRlbXMoY29u
c3QgVmVjdG9yPENvbnRleHRNZW51SXRlbT4mIGl0ZW1zKSB7IG1faXRlbXMgPSBpdGVtczsgfQor
ICAgICAgICBjb25zdCBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYgaXRlbXMoKSBjb25zdCB7IHJl
dHVybiBtX2l0ZW1zOyB9CisKKyAgICAgICAgdm9pZCBhcHBlbmRJdGVtKGNvbnN0IENvbnRleHRN
ZW51SXRlbSYgaXRlbSkgeyBtX2l0ZW1zLmFwcGVuZChpdGVtKTsgfSAKKyNlbHNlCiAgICAgICAg
IENvbnRleHRNZW51KGNvbnN0IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uKTsKICAgICAgICAgfkNv
bnRleHRNZW51KCk7CiAKICAgICAgICAgdm9pZCBpbnNlcnRJdGVtKHVuc2lnbmVkIHBvc2l0aW9u
LCBDb250ZXh0TWVudUl0ZW0mKTsKICAgICAgICAgdm9pZCBhcHBlbmRJdGVtKENvbnRleHRNZW51
SXRlbSYpOwotICAgICAgICAKLSAgICAgICAgQ29udGV4dE1lbnVJdGVtKiBpdGVtV2l0aEFjdGlv
bih1bnNpZ25lZCk7CisKICAgICAgICAgQ29udGV4dE1lbnVJdGVtKiBpdGVtQXRJbmRleCh1bnNp
Z25lZCwgY29uc3QgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24pOwogCiAgICAgICAgIHVuc2lnbmVk
IGl0ZW1Db3VudCgpIGNvbnN0OwpAQCAtNjMsMTAgKzg0LDE3IEBAIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKICAgICAgICAgdm9pZCBzZXRQbGF0Zm9ybURlc2NyaXB0aW9uKFBsYXRmb3JtTWVudURlc2Ny
aXB0aW9uKTsKIAogICAgICAgICBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiByZWxlYXNlUGxhdGZv
cm1EZXNjcmlwdGlvbigpOworCiAjaWYgUExBVEZPUk0oV1gpCiAgICAgICAgIHN0YXRpYyBDb250
ZXh0TWVudUl0ZW0qIGl0ZW1XaXRoSWQoaW50KTsKICNlbmRpZgorCisjZW5kaWYgLy8gVVNFKENS
T1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCisKICAgICBwcml2YXRlOgorI2lmIFVTRShDUk9T
U19QTEFURk9STV9DT05URVhUX01FTlVTKQorICAgICAgICBWZWN0b3I8Q29udGV4dE1lbnVJdGVt
PiBtX2l0ZW1zOworI2Vsc2UKICNpZiBQTEFURk9STShNQUMpCiAgICAgICAgIC8vIEtlZXAgdGhp
cyBpbiBzeW5jIHdpdGggdGhlIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIHR5cGVkZWYKICAgICAg
ICAgUmV0YWluUHRyPE5TTXV0YWJsZUFycmF5PiBtX3BsYXRmb3JtRGVzY3JpcHRpb247CkBAIC04
MywxMCArMTExLDE0IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgdW5zaWduZWQgbV9p
dGVtQ291bnQ7CiAjZW5kaWYKICNlbmRpZgorCisjZW5kaWYgLy8gVVNFKENST1NTX1BMQVRGT1JN
X0NPTlRFWFRfTUVOVVMpCiAgICAgfTsKIAorI2lmICFVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVY
VF9NRU5VUykKIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+IGNvbnRleHRNZW51SXRlbVZlY3RvcihQ
bGF0Zm9ybU1lbnVEZXNjcmlwdGlvbik7CiBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBwbGF0Zm9y
bU1lbnVEZXNjcmlwdGlvbihWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYpOworI2VuZGlmCiAKIH0K
IApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9Db250ZXh0TWVudUl0ZW0uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnVJdGVtLmNwcAkocmV2aXNpb24gMCkKKysr
IFdlYkNvcmUvcGxhdGZvcm0vQ29udGV4dE1lbnVJdGVtLmNwcAkocmV2aXNpb24gMCkKQEAgLTAs
MCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
Q29udGV4dE1lbnVJdGVtLmgiCisKKyNpbmNsdWRlICJDb250ZXh0TWVudS5oIgorCisjaWYgVVNF
KENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
Q29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVJdGVtVHlwZSB0eXBl
LCBDb250ZXh0TWVudUFjdGlvbiBhY3Rpb24sIGNvbnN0IFN0cmluZyYgdGl0bGUsIENvbnRleHRN
ZW51KiBzdWJNZW51KQorICAgIDogbV90eXBlKHR5cGUpCisgICAgLCBtX2FjdGlvbihhY3Rpb24p
CisgICAgLCBtX3RpdGxlKHRpdGxlKQorICAgICwgbV9lbmFibGVkKHRydWUpCisgICAgLCBtX2No
ZWNrZWQoZmFsc2UpCit7CisgICAgc2V0U3ViTWVudShzdWJNZW51KTsKK30KKworQ29udGV4dE1l
bnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVJdGVtVHlwZSB0eXBlLCBDb250ZXh0
TWVudUFjdGlvbiBhY3Rpb24sIGNvbnN0IFN0cmluZyYgdGl0bGUsIGJvb2wgZW5hYmxlZCwgYm9v
bCBjaGVja2VkKQorICAgIDogbV90eXBlKHR5cGUpCisgICAgLCBtX2FjdGlvbihhY3Rpb24pCisg
ICAgLCBtX3RpdGxlKHRpdGxlKQorICAgICwgbV9lbmFibGVkKGVuYWJsZWQpCisgICAgLCBtX2No
ZWNrZWQoY2hlY2tlZCkKK3sKK30KKyAgICAgICAgCitDb250ZXh0TWVudUl0ZW06OkNvbnRleHRN
ZW51SXRlbShDb250ZXh0TWVudUFjdGlvbiBhY3Rpb24sIGNvbnN0IFN0cmluZyYgdGl0bGUsIGJv
b2wgZW5hYmxlZCwgYm9vbCBjaGVja2VkLCBjb25zdCBWZWN0b3I8Q29udGV4dE1lbnVJdGVtPiYg
c3ViTWVudUl0ZW1zKQorICAgIDogbV90eXBlKFN1Ym1lbnVUeXBlKQorICAgICwgbV9hY3Rpb24o
YWN0aW9uKQorICAgICwgbV90aXRsZSh0aXRsZSkKKyAgICAsIG1fZW5hYmxlZChlbmFibGVkKQor
ICAgICwgbV9jaGVja2VkKGNoZWNrZWQpCisgICAgLCBtX3N1Yk1lbnVJdGVtcyhzdWJNZW51SXRl
bXMpCit7Cit9CisKK0NvbnRleHRNZW51SXRlbTo6fkNvbnRleHRNZW51SXRlbSgpCit7Cit9CisK
K3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRTdWJNZW51KENvbnRleHRNZW51KiBzdWJNZW51KQor
eworICAgIGlmIChzdWJNZW51KSB7CisgICAgICAgIG1fdHlwZSA9IFN1Ym1lbnVUeXBlOworICAg
ICAgICBtX3N1Yk1lbnVJdGVtcyA9IHN1Yk1lbnUtPml0ZW1zKCk7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgbV90eXBlID0gQWN0aW9uVHlwZTsKKyAgICAgICAgbV9zdWJNZW51SXRlbXMuY2xlYXIo
KTsKKyAgICB9Cit9CisKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRUeXBlKENvbnRleHRNZW51
SXRlbVR5cGUgdHlwZSkKK3sKKyAgICBtX3R5cGUgPSB0eXBlOworfQorCitDb250ZXh0TWVudUl0
ZW1UeXBlIENvbnRleHRNZW51SXRlbTo6dHlwZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdHlw
ZTsKK30KKwordm9pZCBDb250ZXh0TWVudUl0ZW06OnNldEFjdGlvbihDb250ZXh0TWVudUFjdGlv
biBhY3Rpb24pCit7CisgICAgbV9hY3Rpb24gPSBhY3Rpb247Cit9CisKK0NvbnRleHRNZW51QWN0
aW9uIENvbnRleHRNZW51SXRlbTo6YWN0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9hY3Rp
b247Cit9CisKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRDaGVja2VkKGJvb2wgY2hlY2tlZCkK
K3sKKyAgICBtX2NoZWNrZWQgPSBjaGVja2VkOworfQorCitib29sIENvbnRleHRNZW51SXRlbTo6
Y2hlY2tlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fY2hlY2tlZDsKK30KKwordm9pZCBDb250
ZXh0TWVudUl0ZW06OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIG1fZW5hYmxlZCA9
IGVuYWJsZWQ7Cit9CisKK2Jvb2wgQ29udGV4dE1lbnVJdGVtOjplbmFibGVkKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9lbmFibGVkOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNl
bmRpZiAvLyBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vQ29udGV4dE1lbnVJdGVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9Db250ZXh0TWVudUl0ZW0uaAkocmV2aXNpb24gNzM2NjIpCisrKyBXZWJDb3JlL3BsYXRmb3Jt
L0NvbnRleHRNZW51SXRlbS5oCSh3b3JraW5nIGNvcHkpCkBAIC00MCw3ICs0MCw3IEBACiBjbGFz
cyBOU01lbnVJdGVtOwogI2VuZGlmCiAjZWxpZiBQTEFURk9STShXSU4pCi10eXBlZGVmIHN0cnVj
dCB0YWdNRU5VSVRFTUlORk9XKiBMUE1FTlVJVEVNSU5GTzsKK3R5cGVkZWYgc3RydWN0IHRhZ01F
TlVJVEVNSU5GT1cgTUVOVUlURU1JTkZPOwogI2VsaWYgUExBVEZPUk0oR1RLKQogdHlwZWRlZiBz
dHJ1Y3QgX0d0a01lbnVJdGVtIEd0a01lbnVJdGVtOwogI2VsaWYgUExBVEZPUk0oUVQpCkBAIC0x
NjYsOCArMTY2LDYgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiAjaWYgUExBVEZPUk0oTUFDKQog
ICAgIHR5cGVkZWYgTlNNZW51SXRlbSogUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uOwotI2Vs
aWYgUExBVEZPUk0oV0lOKQotICAgIHR5cGVkZWYgTFBNRU5VSVRFTUlORk8gUGxhdGZvcm1NZW51
SXRlbURlc2NyaXB0aW9uOwogI2VsaWYgUExBVEZPUk0oUVQpCiAgICAgc3RydWN0IFBsYXRmb3Jt
TWVudUl0ZW1EZXNjcmlwdGlvbiB7CiAgICAgICAgIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlv
bigpCkBAIC0yNTQsNDkgKzI1Miw3OSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKICAgICBjbGFz
cyBDb250ZXh0TWVudUl0ZW0gOiBwdWJsaWMgRmFzdEFsbG9jQmFzZSB7CiAgICAgcHVibGljOgor
ICAgICAgICBDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnVJdGVtVHlwZSwgQ29udGV4dE1lbnVB
Y3Rpb24sIGNvbnN0IFN0cmluZyYsIENvbnRleHRNZW51KiBzdWJNZW51ID0gMCk7CisgICAgICAg
IENvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlLCBDb250ZXh0TWVudUFjdGlvbiwg
Y29uc3QgU3RyaW5nJiwgYm9vbCBlbmFibGVkLCBib29sIGNoZWNrZWQpOworCisgICAgICAgIH5D
b250ZXh0TWVudUl0ZW0oKTsKKworICAgICAgICB2b2lkIHNldFR5cGUoQ29udGV4dE1lbnVJdGVt
VHlwZSk7CisgICAgICAgIENvbnRleHRNZW51SXRlbVR5cGUgdHlwZSgpIGNvbnN0OworCisgICAg
ICAgIHZvaWQgc2V0QWN0aW9uKENvbnRleHRNZW51QWN0aW9uKTsKKyAgICAgICAgQ29udGV4dE1l
bnVBY3Rpb24gYWN0aW9uKCkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBzZXRDaGVja2VkKGJvb2wg
PSB0cnVlKTsKKyAgICAgICAgYm9vbCBjaGVja2VkKCkgY29uc3Q7CisKKyAgICAgICAgdm9pZCBz
ZXRFbmFibGVkKGJvb2wgPSB0cnVlKTsKKyAgICAgICAgYm9vbCBlbmFibGVkKCkgY29uc3Q7CisK
KyAgICAgICAgdm9pZCBzZXRTdWJNZW51KENvbnRleHRNZW51Kik7CisKKyNpZiBVU0UoQ1JPU1Nf
UExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKyNpZiBQTEFURk9STShXSU4pCisgICAgICAgIHR5cGVk
ZWYgTUVOVUlURU1JTkZPIE5hdGl2ZUl0ZW07CisjZW5kaWYKKyAgICAgICAgQ29udGV4dE1lbnVJ
dGVtKENvbnRleHRNZW51QWN0aW9uLCBjb25zdCBTdHJpbmcmLCBib29sIGVuYWJsZWQsIGJvb2wg
Y2hlY2tlZCwgY29uc3QgVmVjdG9yPENvbnRleHRNZW51SXRlbT4mIHN1Yk1lbnVJdGVtcyk7Cisg
ICAgICAgIGV4cGxpY2l0IENvbnRleHRNZW51SXRlbShjb25zdCBOYXRpdmVJdGVtJik7CisKKyAg
ICAgICAgLy8gT24gV2luZG93cywgdGhlIHRpdGxlIChkd1R5cGVEYXRhIG9mIHRoZSBNRU5VSVRF
TUlORk8pIGlzIG5vdCBzZXQgaW4gdGhpcyBmdW5jdGlvbi4gQ2FsbGVycyBjYW4gc2V0IHRoZSB0
aXRsZSB0aGVtc2VsdmVzLAorICAgICAgICAvLyBhbmQgaGFuZGxlIHRoZSBsaWZldGltZSBvZiB0
aGUgdGl0bGUsIGlmIHRoZXkgbmVlZCBpdC4KKyAgICAgICAgTmF0aXZlSXRlbSBuYXRpdmVNZW51
SXRlbSgpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2V0VGl0bGUoY29uc3QgU3RyaW5nJiB0aXRs
ZSkgeyBtX3RpdGxlID0gdGl0bGU7IH0KKyAgICAgICAgY29uc3QgU3RyaW5nJiB0aXRsZSgpIGNv
bnN0IHsgcmV0dXJuIG1fdGl0bGU7IH0KKworICAgICAgICBjb25zdCBWZWN0b3I8Q29udGV4dE1l
bnVJdGVtPiYgc3ViTWVudUl0ZW1zKCkgY29uc3QgeyByZXR1cm4gbV9zdWJNZW51SXRlbXM7IH0K
KyNlbHNlCisgICAgcHVibGljOgogICAgICAgICBDb250ZXh0TWVudUl0ZW0oUGxhdGZvcm1NZW51
SXRlbURlc2NyaXB0aW9uKTsKICAgICAgICAgQ29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51KiBz
dWJNZW51ID0gMCk7Ci0gICAgICAgIENvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBl
IHR5cGUsIENvbnRleHRNZW51QWN0aW9uIGFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ29u
dGV4dE1lbnUqIHN1Yk1lbnUgPSAwKTsKLQotICAgICAgICBDb250ZXh0TWVudUl0ZW0oQ29udGV4
dE1lbnVJdGVtVHlwZSwgQ29udGV4dE1lbnVBY3Rpb24sIGNvbnN0IFN0cmluZyYsIGJvb2wgZW5h
YmxlZCwgYm9vbCBjaGVja2VkKTsKICAgICAgICAgQ29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51
QWN0aW9uLCBjb25zdCBTdHJpbmcmLCBib29sIGVuYWJsZWQsIGJvb2wgY2hlY2tlZCwgVmVjdG9y
PENvbnRleHRNZW51SXRlbT4mIHN1Ym1lbnVJdGVtcyk7CisKICNpZiBQTEFURk9STShHVEspCiAg
ICAgICAgIENvbnRleHRNZW51SXRlbShHdGtNZW51SXRlbSopOwogI2VuZGlmCi0gICAgICAgIH5D
b250ZXh0TWVudUl0ZW0oKTsKIAogICAgICAgICBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24g
cmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKTsKIAotICAgICAgICBDb250ZXh0TWVudUl0ZW1U
eXBlIHR5cGUoKSBjb25zdDsKLSAgICAgICAgdm9pZCBzZXRUeXBlKENvbnRleHRNZW51SXRlbVR5
cGUpOwotCi0gICAgICAgIENvbnRleHRNZW51QWN0aW9uIGFjdGlvbigpIGNvbnN0OwotICAgICAg
ICB2b2lkIHNldEFjdGlvbihDb250ZXh0TWVudUFjdGlvbik7Ci0KICAgICAgICAgU3RyaW5nIHRp
dGxlKCkgY29uc3Q7CiAgICAgICAgIHZvaWQgc2V0VGl0bGUoY29uc3QgU3RyaW5nJik7CiAKICAg
ICAgICAgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gcGxhdGZvcm1TdWJNZW51KCkgY29uc3Q7Ci0g
ICAgICAgIHZvaWQgc2V0U3ViTWVudShDb250ZXh0TWVudSopOwogICAgICAgICB2b2lkIHNldFN1
Yk1lbnUoVmVjdG9yPENvbnRleHRNZW51SXRlbT4mKTsKIAotICAgICAgICB2b2lkIHNldENoZWNr
ZWQoYm9vbCA9IHRydWUpOwotICAgICAgICBib29sIGNoZWNrZWQoKSBjb25zdDsKLQotICAgICAg
ICB2b2lkIHNldEVuYWJsZWQoYm9vbCA9IHRydWUpOwotICAgICAgICBib29sIGVuYWJsZWQoKSBj
b25zdDsKLQogICAgICAgICAvLyBGSVhNRTogRG8gd2UgbmVlZCBhIGtleWJvYXJkIGFjY2VsZXJh
dG9yIGhlcmU/CiAjaWYgUExBVEZPUk0oR1RLKQogICAgICAgICBzdGF0aWMgR3RrTWVudUl0ZW0q
IGNyZWF0ZU5hdGl2ZU1lbnVJdGVtKGNvbnN0IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbiYp
OwogI2VuZGlmCisjZW5kaWYgLy8gVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCiAK
ICAgICBwcml2YXRlOgorI2lmIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQorICAg
ICAgICBTdHJpbmcgbV90aXRsZTsKKyAgICAgICAgYm9vbCBtX2VuYWJsZWQ7CisgICAgICAgIGJv
b2wgbV9jaGVja2VkOworICAgICAgICBDb250ZXh0TWVudUFjdGlvbiBtX2FjdGlvbjsKKyAgICAg
ICAgQ29udGV4dE1lbnVJdGVtVHlwZSBtX3R5cGU7CisgICAgICAgIFZlY3RvcjxDb250ZXh0TWVu
dUl0ZW0+IG1fc3ViTWVudUl0ZW1zOworI2Vsc2UKICNpZiBQTEFURk9STShNQUMpCiAgICAgICAg
IFJldGFpblB0cjxOU01lbnVJdGVtPiBtX3BsYXRmb3JtRGVzY3JpcHRpb247CiAjZWxzZQogICAg
ICAgICBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24gbV9wbGF0Zm9ybURlc2NyaXB0aW9uOwog
I2VuZGlmCisjZW5kaWYgLy8gVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVOVVMpCiAgICAg
fTsKIAogfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9QbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbi5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vUGxhdGZvcm1NZW51RGVzY3JpcHRpb24u
aAkocmV2aXNpb24gNzM2NjIpCisrKyBXZWJDb3JlL3BsYXRmb3JtL1BsYXRmb3JtTWVudURlc2Ny
aXB0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTMyLDggKzMyLDYgQEAKICNlbHNlCiBjbGFzcyBO
U011dGFibGVBcnJheTsKICNlbmRpZgotI2VsaWYgUExBVEZPUk0oV0lOKQotdHlwZWRlZiBzdHJ1
Y3QgSE1FTlVfXyogSE1FTlU7CiAjZWxpZiBQTEFURk9STShRVCkKICNpbmNsdWRlIDxxbGlzdC5o
PgogI2VsaWYgUExBVEZPUk0oR1RLKQpAQCAtNDYsMTAgKzQ0LDkgQEAgY2xhc3MgQk1lbnU7CiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorI2lmICFVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9N
RU5VUykKICNpZiBQTEFURk9STShNQUMpCiAgICAgdHlwZWRlZiBOU011dGFibGVBcnJheSogUGxh
dGZvcm1NZW51RGVzY3JpcHRpb247Ci0jZWxpZiBQTEFURk9STShXSU4pCi0gICAgdHlwZWRlZiBI
TUVOVSBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbjsKICNlbGlmIFBMQVRGT1JNKFFUKQogICAgIGNs
YXNzIENvbnRleHRNZW51SXRlbTsKICAgICB0eXBlZGVmIGNvbnN0IFFMaXN0PENvbnRleHRNZW51
SXRlbT4qIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uOwpAQCAtNjIsNiArNTksNyBAQCBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAjZWxzZQogICAgIHR5cGVkZWYgdm9pZCogUGxhdGZvcm1NZW51RGVzY3Jp
cHRpb247CiAjZW5kaWYKKyNlbmRpZiAvLyAhVVNFKENST1NTX1BMQVRGT1JNX0NPTlRFWFRfTUVO
VVMpCiAKIH0gLy8gbmFtZXNwYWNlCiAKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vd2luL0NvbnRl
eHRNZW51SXRlbVdpbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS93aW4vQ29u
dGV4dE1lbnVJdGVtV2luLmNwcAkocmV2aXNpb24gNzM2NjIpCisrKyBXZWJDb3JlL3BsYXRmb3Jt
L3dpbi9Db250ZXh0TWVudUl0ZW1XaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOCwxOTggKzI4
LDY2IEBACiAKICNpbmNsdWRlICJDb250ZXh0TWVudS5oIgogCi0jaW5jbHVkZSA8d3RmL3RleHQv
Q1N0cmluZy5oPgotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2lmIE9TKFdJTkNFKQotI2lmbmRl
ZiBNRlNfRElTQUJMRUQKLSNkZWZpbmUgTUZTX0RJU0FCTEVEIE1GX0dSQVlFRAotI2VuZGlmCi0j
aWZuZGVmIE1JSU1fRlRZUEUKLSNkZWZpbmUgTUlJTV9GVFlQRSBNSUlNX1RZUEUKLSNlbmRpZgot
I2lmbmRlZiBNSUlNX1NUUklORwotI2RlZmluZSBNSUlNX1NUUklORyAwCi0jZW5kaWYKLSNlbmRp
ZgotCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLUNvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJ
dGVtKExQTUVOVUlURU1JTkZPIGl0ZW0pCi0gICAgOiBtX3BsYXRmb3JtRGVzY3JpcHRpb24oaXRl
bSkKK0NvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKGNvbnN0IE1FTlVJVEVNSU5GTyYg
aW5mbykKIHsKLX0KKyAgICBpZiAoaW5mby5mTWFzayAmIE1JSU1fRlRZUEUpCisgICAgICAgIG1f
dHlwZSA9IGluZm8uZlR5cGUgPT0gTUZUX1NFUEFSQVRPUiA/IFNlcGFyYXRvclR5cGUgOiBBY3Rp
b25UeXBlOworICAgIGVsc2UKKyAgICAgICAgbV90eXBlID0gU2VwYXJhdG9yVHlwZTsKIAotQ29u
dGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnUqIHN1Yk1lbnUpCi17Ci0g
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gKExQTUVOVUlURU1JTkZPKW1hbGxvYyhzaXplb2Yo
TUVOVUlURU1JTkZPKSk7Ci0gICAgaWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAg
IHJldHVybjsKLQotICAgIG1lbXNldChtX3BsYXRmb3JtRGVzY3JpcHRpb24sIDAsIHNpemVvZihN
RU5VSVRFTUlORk8pKTsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmNiU2l6ZSA9IHNpemVv
ZihNRU5VSVRFTUlORk8pOwotCi0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT53SUQgPSBDb250
ZXh0TWVudUl0ZW1UYWdOb0FjdGlvbjsKLSAgICBpZiAoc3ViTWVudSkgewotICAgICAgICBtX3Bs
YXRmb3JtRGVzY3JpcHRpb24tPmZNYXNrIHw9IE1JSU1fU1VCTUVOVTsKLSAgICAgICAgbV9wbGF0
Zm9ybURlc2NyaXB0aW9uLT5oU3ViTWVudSA9IHN1Yk1lbnUtPnBsYXRmb3JtRGVzY3JpcHRpb24o
KTsKLSAgICB9Ci19CisgICAgaWYgKG1fdHlwZSA9PSBBY3Rpb25UeXBlICYmIGluZm8uZk1hc2sg
JiBNSUlNX1NUUklORykKKyAgICAgICAgbV90aXRsZSA9IFN0cmluZyhpbmZvLmR3VHlwZURhdGEs
IGluZm8uY2NoKTsKIAotQ29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1l
bnVJdGVtVHlwZSB0eXBlLCBDb250ZXh0TWVudUFjdGlvbiBhY3Rpb24sIGNvbnN0IFN0cmluZyYg
dGl0bGUsIENvbnRleHRNZW51KiBzdWJNZW51KQotewotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlv
biA9IChMUE1FTlVJVEVNSU5GTyltYWxsb2Moc2l6ZW9mKE1FTlVJVEVNSU5GTykpOwotICAgIGlm
ICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtZW1zZXQo
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLCAwLCBzaXplb2YoTUVOVUlURU1JTkZPKSk7Ci0gICAgbV9w
bGF0Zm9ybURlc2NyaXB0aW9uLT5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPKTsKLSAgICBt
X3BsYXRmb3JtRGVzY3JpcHRpb24tPmZNYXNrID0gTUlJTV9GVFlQRTsKLQotICAgIGlmICh0eXBl
ID09IFNlcGFyYXRvclR5cGUpIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlw
ZSA9IE1GVF9TRVBBUkFUT1I7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoKGluZm8uZk1hc2sg
JiBNSUlNX1NVQk1FTlUpICYmIGluZm8uaFN1Yk1lbnUpIHsKKyAgICAgICAgbV90eXBlID0gU3Vi
bWVudVR5cGU7CisgICAgICAgIENvbnRleHRNZW51OjpnZXRDb250ZXh0TWVudUl0ZW1zKGluZm8u
aFN1Yk1lbnUsIG1fc3ViTWVudUl0ZW1zKTsKICAgICB9Ci0gICAgCi0gICAgaWYgKHN1Yk1lbnUp
IHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFzayB8PSBNSUlNX1NUUklORyB8
IE1JSU1fU1VCTUVOVTsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5oU3ViTWVudSA9
IHN1Yk1lbnUtPnBsYXRmb3JtRGVzY3JpcHRpb24oKTsKLSAgICB9IGVsc2UKLSAgICAgICAgbV9w
bGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFzayB8PSBNSUlNX1NUUklORyB8IE1JSU1fSUQ7Ci0KLSAg
ICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZUeXBlID0gTUZUX1NUUklORzsKLSAgICBtX3BsYXRm
b3JtRGVzY3JpcHRpb24tPndJRCA9IGFjdGlvbjsKLSAgICAKLSAgICBTdHJpbmcgdCA9IHRpdGxl
OwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Y2NoID0gdC5sZW5ndGgoKTsKLSAgICBtX3Bs
YXRmb3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEgPSB3Y3NkdXAodC5jaGFyYWN0ZXJzV2l0aE51
bGxUZXJtaW5hdGlvbigpKTsKLX0KLQotQ29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0o
Q29udGV4dE1lbnVJdGVtVHlwZSwgQ29udGV4dE1lbnVBY3Rpb24sIGNvbnN0IFN0cmluZyYsIGJv
b2wsIGJvb2wpCi17Ci0gICAgLy8gRklYTUU6IEltcGxlbWVudAotfQogCi1Db250ZXh0TWVudUl0
ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUFjdGlvbiwgY29uc3QgU3RyaW5nJiwgYm9v
bCwgYm9vbCwgVmVjdG9yPENvbnRleHRNZW51SXRlbT4mKQotewotICAgIC8vIEZJWE1FOiBJbXBs
ZW1lbnQKLX0KLQotQ29udGV4dE1lbnVJdGVtOjp+Q29udGV4dE1lbnVJdGVtKCkKLXsKLSAgICBp
ZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKSB7Ci0gICAgICAgIGlmIChtX3BsYXRmb3JtRGVzY3Jp
cHRpb24tPmZUeXBlID09IE1GVF9TVFJJTkcpCi0gICAgICAgICAgICBmcmVlKG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbi0+ZHdUeXBlRGF0YSk7Ci0gICAgICAgIGZyZWUobV9wbGF0Zm9ybURlc2NyaXB0
aW9uKTsKLSAgICB9Ci19Ci0KLUxQTUVOVUlURU1JTkZPIENvbnRleHRNZW51SXRlbTo6cmVsZWFz
ZVBsYXRmb3JtRGVzY3JpcHRpb24oKQotewotICAgIExQTUVOVUlURU1JTkZPIGluZm8gPSBtX3Bs
YXRmb3JtRGVzY3JpcHRpb247Ci0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gMDsKLSAgICBy
ZXR1cm4gaW5mbzsKLX0KLQotQ29udGV4dE1lbnVJdGVtVHlwZSBDb250ZXh0TWVudUl0ZW06OnR5
cGUoKSBjb25zdAotewotICAgIENvbnRleHRNZW51SXRlbVR5cGUgdHlwZSA9IEFjdGlvblR5cGU7
Ci0gICAgaWYgKCgobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSAmIH5NRlRfT1dORVJEUkFX
KSA9PSBNRlRfU1RSSU5HKSAmJiBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51KQotICAg
ICAgICB0eXBlID0gU3VibWVudVR5cGU7Ci0gICAgZWxzZSBpZiAobV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5mVHlwZSAmIE1GVF9TRVBBUkFUT1IpCi0gICAgICAgIHR5cGUgPSBTZXBhcmF0b3JUeXBl
OwotCi0gICAgcmV0dXJuIHR5cGU7Ci19Ci0KLUNvbnRleHRNZW51QWN0aW9uIENvbnRleHRNZW51
SXRlbTo6YWN0aW9uKCkgY29uc3QKLXsgCi0gICAgcmV0dXJuIHN0YXRpY19jYXN0PENvbnRleHRN
ZW51QWN0aW9uPihtX3BsYXRmb3JtRGVzY3JpcHRpb24tPndJRCk7Ci19Ci0KLVN0cmluZyBDb250
ZXh0TWVudUl0ZW06OnRpdGxlKCkgY29uc3QgCi17Ci0gICAgcmV0dXJuIFN0cmluZyhtX3BsYXRm
b3JtRGVzY3JpcHRpb24tPmR3VHlwZURhdGEsIHdjc2xlbihtX3BsYXRmb3JtRGVzY3JpcHRpb24t
PmR3VHlwZURhdGEpKTsKLX0KLQotUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gQ29udGV4dE1lbnVJ
dGVtOjpwbGF0Zm9ybVN1Yk1lbnUoKSBjb25zdAotewotICAgIHJldHVybiBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPmhTdWJNZW51OwotfQotCi12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VHlwZShD
b250ZXh0TWVudUl0ZW1UeXBlIHR5cGUpCi17Ci0gICAgaWYgKHR5cGUgPT0gU2VwYXJhdG9yVHlw
ZSkKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mVHlwZSA9IE1GVF9TRVBBUkFUT1I7
CisgICAgaWYgKGluZm8uZk1hc2sgJiBNSUlNX0lEKQorICAgICAgICBtX2FjdGlvbiA9IHN0YXRp
Y19jYXN0PENvbnRleHRNZW51QWN0aW9uPihpbmZvLndJRCk7CiAgICAgZWxzZQotICAgICAgICBt
X3BsYXRmb3JtRGVzY3JpcHRpb24tPmZUeXBlID0gTUZUX1NUUklORzsKLX0KKyAgICAgICAgbV9h
Y3Rpb24gPSBDb250ZXh0TWVudUl0ZW1UYWdOb0FjdGlvbjsKIAotdm9pZCBDb250ZXh0TWVudUl0
ZW06OnNldEFjdGlvbihDb250ZXh0TWVudUFjdGlvbiBhY3Rpb24pCi17Ci0gICAgbV9wbGF0Zm9y
bURlc2NyaXB0aW9uLT53SUQgPSBhY3Rpb247IAotfQotCi12b2lkIENvbnRleHRNZW51SXRlbTo6
c2V0VGl0bGUoY29uc3QgU3RyaW5nJiB0aXRsZSkKLXsKLSAgICBpZiAobV9wbGF0Zm9ybURlc2Ny
aXB0aW9uLT5kd1R5cGVEYXRhKQotICAgICAgICBmcmVlKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+
ZHdUeXBlRGF0YSk7Ci0gICAgCi0gICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5jY2ggPSB0aXRs
ZS5sZW5ndGgoKTsKLSAgICBTdHJpbmcgdGl0bGVDb3B5ID0gdGl0bGU7Ci0gICAgbV9wbGF0Zm9y
bURlc2NyaXB0aW9uLT5kd1R5cGVEYXRhID0gd2NzZHVwKHRpdGxlQ29weS5jaGFyYWN0ZXJzV2l0
aE51bGxUZXJtaW5hdGlvbigpKTsKKyAgICBpZiAoaW5mby5mTWFzayAmIE1JSU1fU1RBVEUpIHsK
KyAgICAgICAgbV9jaGVja2VkID0gaW5mby5mU3RhdGUgJiBNRlNfQ0hFQ0tFRDsKKyAgICAgICAg
bV9lbmFibGVkID0gIShpbmZvLmZTdGF0ZSAmIE1GU19ESVNBQkxFRCk7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgbV9jaGVja2VkID0gZmFsc2U7CisgICAgICAgIG1fZW5hYmxlZCA9IGZhbHNlOwor
ICAgIH0KIH0KIAotdm9pZCBDb250ZXh0TWVudUl0ZW06OnNldFN1Yk1lbnUoQ29udGV4dE1lbnUq
IHN1Yk1lbnUpCi17Ci0gICAgaWYgKHN1Yk1lbnUtPnBsYXRmb3JtRGVzY3JpcHRpb24oKSA9PSBt
X3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51KQotICAgICAgICByZXR1cm47Ci0KLSAgICBp
ZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5oU3ViTWVudSkKLSAgICAgICAgOjpEZXN0cm95TWVu
dShtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhTdWJNZW51KTsKKy8vIENvbnRleHRNZW51SXRlbTo6
bmF0aXZlTWVudUl0ZW0gZG9lc24ndCBzZXQgdGhlIGluZm8uZHdUeXBlRGF0YS4gVGhpcyBpcwor
Ly8gZG9uZSB0byBtYWtlIHRoZSBsaWZldGltZSBoYW5kbGluZyBvZiB0aGUgcmV0dXJuZWQgTUVO
VUlURU1JTkZPIGVhc2llciBvbgorLy8gY2FsbGVycy4gQ2FsbGVycyBjYW4gc2V0IGR3VHlwZURh
dGEgdGhlbXNlbHZlcyAoYW5kIG1ha2UgdGhlaXIgb3duIGRlY2lzaW9ucworLy8gYWJvdXQgaXRz
IGxpZmV0aW1lKSBpZiB0aGV5IG5lZWQgaXQuCitNRU5VSVRFTUlORk8gQ29udGV4dE1lbnVJdGVt
OjpuYXRpdmVNZW51SXRlbSgpIGNvbnN0Cit7CisgICAgTUVOVUlURU1JTkZPIGluZm8gPSB7MH07
CisgICAgaW5mby5jYlNpemUgPSBzaXplb2YoTUVOVUlURU1JTkZPKTsKKworICAgIGlmIChtX3R5
cGUgPT0gU2VwYXJhdG9yVHlwZSkgeworICAgICAgICBpbmZvLmZNYXNrID0gTUlJTV9GVFlQRTsK
KyAgICAgICAgaW5mby5mVHlwZSA9IE1GVF9TRVBBUkFUT1I7CisgICAgICAgIHJldHVybiBpbmZv
OworICAgIH0KIAotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sgfD0gTUlJTV9TVUJN
RU5VOwotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aFN1Yk1lbnUgPSBzdWJNZW51LT5yZWxl
YXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOwotfQorICAgIGluZm8uZk1hc2sgPSBNSUlNX0ZUWVBF
IHwgTUlJTV9JRCB8IE1JSU1fU1RBVEU7CisgICAgaW5mby5mVHlwZSA9IE1GVF9TVFJJTkc7CiAK
LXZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRTdWJNZW51KFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+
JikKLXsKLSAgICAvLyBGSVhNRTogSW1wbGVtZW50Ci19CisgICAgaW5mby53SUQgPSBtX2FjdGlv
bjsKIAotdm9pZCBDb250ZXh0TWVudUl0ZW06OnNldENoZWNrZWQoYm9vbCBjaGVja2VkKQotewot
ICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+Zk1hc2sgfD0gTUlJTV9TVEFURTsKLSAgICBpZiAo
Y2hlY2tlZCkgewotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZTdGF0ZSAmPSB+TUZT
X1VOQ0hFQ0tFRDsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUgfD0gTUZT
X0NIRUNLRUQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5m
U3RhdGUgJj0gfk1GU19DSEVDS0VEOwotICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmZT
dGF0ZSB8PSBNRlNfVU5DSEVDS0VEOworICAgIGlmIChtX3R5cGUgPT0gU3VibWVudVR5cGUpIHsK
KyAgICAgICAgaW5mby5mTWFzayB8PSBNSUlNX1NVQk1FTlU7CisgICAgICAgIGluZm8uaFN1Yk1l
bnUgPSBDb250ZXh0TWVudTo6Y3JlYXRlTmF0aXZlTWVudUZyb21JdGVtcyhtX3N1Yk1lbnVJdGVt
cyk7CiAgICAgfQotfQogCi1ib29sIENvbnRleHRNZW51SXRlbTo6Y2hlY2tlZCgpIGNvbnN0Ci17
Ci0gICAgLy8gRklYTUUgLSBJbXBsZW1lbnQKLSAgICByZXR1cm4gZmFsc2U7Ci19CisgICAgaW5m
by5mU3RhdGUgfD0gbV9lbmFibGVkID8gTUZTX0VOQUJMRUQgOiBNRlNfRElTQUJMRUQ7CisgICAg
aW5mby5mU3RhdGUgfD0gbV9jaGVja2VkID8gTUZTX0NIRUNLRUQgOiBNRlNfVU5DSEVDS0VEOwog
Ci12b2lkIENvbnRleHRNZW51SXRlbTo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCi17Ci0gICAg
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mTWFzayB8PSBNSUlNX1NUQVRFOwotICAgIGlmIChlbmFi
bGVkKSB7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlN0YXRlICY9IH5NRlNfRElT
QUJMRUQ7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlN0YXRlIHw9IE1GU19FTkFC
TEVEOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlN0YXRl
ICY9IH5NRlNfRU5BQkxFRDsKLSAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5mU3RhdGUg
fD0gTUZTX0RJU0FCTEVEOwotICAgIH0KLX0KLQotYm9vbCBDb250ZXh0TWVudUl0ZW06OmVuYWJs
ZWQoKSBjb25zdAotewotICAgIHJldHVybiAhKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+ZlN0YXRl
ICYgTUZTX0RJU0FCTEVEKTsKKyAgICByZXR1cm4gaW5mbzsKIH0KIAogfQpJbmRleDogV2ViQ29y
ZS9wbGF0Zm9ybS93aW4vQ29udGV4dE1lbnVXaW4uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vd2luL0NvbnRleHRNZW51V2luLmNwcAkocmV2aXNpb24gNzM2NjIpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL3dpbi9Db250ZXh0TWVudVdpbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMy
LDYgKzMyLDcgQEAKICNpbmNsdWRlICJOb2RlLmgiCiAjaW5jbHVkZSA8dGNoYXIuaD4KICNpbmNs
dWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHd0Zi90
ZXh0L0NTdHJpbmcuaD4KIAogI2lmbmRlZiBNSUlNX0ZUWVBFCkBAIC00MywxODAgKzQ0LDY3IEBA
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotQ29udGV4dE1lbnU6OkNvbnRleHRNZW51KCkKLSAg
ICA6IG1fcGxhdGZvcm1EZXNjcmlwdGlvbigwKQotI2lmIE9TKFdJTkNFKQotICAgICwgbV9pdGVt
Q291bnQoMCkKLSNlbmRpZgotewotICAgIHNldFBsYXRmb3JtRGVzY3JpcHRpb24oOjpDcmVhdGVQ
b3B1cE1lbnUoKSk7Ci19Ci0KLUNvbnRleHRNZW51OjpDb250ZXh0TWVudShjb25zdCBQbGF0Zm9y
bU1lbnVEZXNjcmlwdGlvbiBtZW51KQotICAgIDogbV9wbGF0Zm9ybURlc2NyaXB0aW9uKDApCi0j
aWYgT1MoV0lOQ0UpCi0gICAgLCBtX2l0ZW1Db3VudCgwKQotI2VuZGlmCi17Ci0gICAgc2V0UGxh
dGZvcm1EZXNjcmlwdGlvbihtZW51KTsKLX0KLQotQ29udGV4dE1lbnU6On5Db250ZXh0TWVudSgp
Ci17Ci0gICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKLSAgICAgICAgOjpEZXN0cm95TWVu
dShtX3BsYXRmb3JtRGVzY3JpcHRpb24pOwotfQotCi11bnNpZ25lZCBDb250ZXh0TWVudTo6aXRl
bUNvdW50KCkgY29uc3QKLXsKLSNpZiBPUyhXSU5DRSkKLSAgICByZXR1cm4gbV9pdGVtQ291bnQ7
Ci0jZWxzZQotICAgIGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICByZXR1cm4g
MDsKLQotICAgIHJldHVybiA6OkdldE1lbnVJdGVtQ291bnQobV9wbGF0Zm9ybURlc2NyaXB0aW9u
KTsKLSNlbmRpZgotfQotCi0jaWYgT1MoV0lOQ0UpCi1zdGF0aWMgYm9vbCBpbnNlcnRNZW51SXRl
bShQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBtZW51LCB1bnNpZ25lZCBpbnQgcG9zaXRpb24sIENv
bnRleHRNZW51SXRlbSYgaXRlbSkKK0NvbnRleHRNZW51OjpDb250ZXh0TWVudShITUVOVSBtZW51
KQogewotICAgIFVJTlQgZmxhZ3MgPSBNRl9CWVBPU0lUSU9OOwotICAgIFVJTlQgbmV3SXRlbSA9
IDA7Ci0gICAgTFBDV1NUUiB0aXRsZSA9IDA7Ci0KLSAgICBpZiAoaXRlbS50eXBlKCkgPT0gU2Vw
YXJhdG9yVHlwZSkKLSAgICAgICAgZmxhZ3MgfD0gTUZfU0VQQVJBVE9SOwotICAgIGVsc2Ugewot
ICAgICAgICBmbGFncyB8PSBNRl9TVFJJTkc7Ci0gICAgICAgIGZsYWdzIHw9IGl0ZW0uY2hlY2tl
ZCgpID8gTUZfQ0hFQ0tFRCA6IE1GX1VOQ0hFQ0tFRDsKLSAgICAgICAgZmxhZ3MgfD0gaXRlbS5l
bmFibGVkKCkgPyBNRl9FTkFCTEVEIDogTUZfR1JBWUVEOwotCi0gICAgICAgIFBsYXRmb3JtTWVu
dUl0ZW1EZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGl0ZW0ucmVsZWFzZVBsYXRmb3JtRGVzY3Jp
cHRpb24oKTsKLSAgICAgICAgdGl0bGUgPSBkZXNjcmlwdGlvbi0+ZHdUeXBlRGF0YTsKLSAgICAg
ICAgZGVzY3JpcHRpb24tPmR3VHlwZURhdGEgPSAwOwotCi0gICAgICAgIGlmIChkZXNjcmlwdGlv
bi0+aFN1Yk1lbnUpIHsKLSAgICAgICAgICAgIGZsYWdzIHw9IE1GX1BPUFVQOwotICAgICAgICAg
ICAgbmV3SXRlbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VUlOVD4oZGVzY3JpcHRpb24tPmhTdWJNZW51
KTsKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uLT5oU3ViTWVudSA9IDA7Ci0gICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgbmV3SXRlbSA9IGRlc2NyaXB0aW9uLT53SUQ7Ci0KLSAgICAgICAgZnJl
ZShkZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIDo6SW5zZXJ0TWVudVcobWVudSwg
cG9zaXRpb24sIGZsYWdzLCBuZXdJdGVtLCB0aXRsZSk7CisgICAgZ2V0Q29udGV4dE1lbnVJdGVt
cyhtZW51LCBtX2l0ZW1zKTsKIH0KLSNlbmRpZgogCi12b2lkIENvbnRleHRNZW51OjppbnNlcnRJ
dGVtKHVuc2lnbmVkIGludCBwb3NpdGlvbiwgQ29udGV4dE1lbnVJdGVtJiBpdGVtKQordm9pZCBD
b250ZXh0TWVudTo6Z2V0Q29udGV4dE1lbnVJdGVtcyhITUVOVSBtZW51LCBWZWN0b3I8Q29udGV4
dE1lbnVJdGVtPiYgaXRlbXMpCiB7Ci0gICAgaWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCisg
ICAgaW50IGNvdW50ID0gOjpHZXRNZW51SXRlbUNvdW50KG1lbnUpOworICAgIGlmIChjb3VudCA8
PSAwKQogICAgICAgICByZXR1cm47CiAKLSNpZiBPUyhXSU5DRSkKLSAgICBpZiAoaW5zZXJ0TWVu
dUl0ZW0obV9wbGF0Zm9ybURlc2NyaXB0aW9uLCBwb3NpdGlvbiwgaXRlbSkpCi0gICAgICAgICsr
bV9pdGVtQ291bnQ7Ci0jZWxzZQotICAgIDo6SW5zZXJ0TWVudUl0ZW0obV9wbGF0Zm9ybURlc2Ny
aXB0aW9uLCBwb3NpdGlvbiwgVFJVRSwgaXRlbS5yZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigp
KTsKLSNlbmRpZgotfQotCi12b2lkIENvbnRleHRNZW51OjphcHBlbmRJdGVtKENvbnRleHRNZW51
SXRlbSYgaXRlbSkKLXsKLSAgICBpbnNlcnRJdGVtKGl0ZW1Db3VudCgpLCBpdGVtKTsKLX0KKyAg
ICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgTUVOVUlURU1JTkZP
IGluZm8gPSB7MH07CisgICAgICAgIGluZm8uY2JTaXplID0gc2l6ZW9mKE1FTlVJVEVNSU5GTyk7
CisgICAgICAgIGluZm8uZk1hc2sgPSBNSUlNX0ZUWVBFIHwgTUlJTV9JRCB8IE1JSU1fU1RSSU5H
IHwgTUlJTV9TVEFURSB8IE1JSU1fU1VCTUVOVTsKKworICAgICAgICBpZiAoITo6R2V0TWVudUl0
ZW1JbmZvKG1lbnUsIGksIFRSVUUsICZpbmZvKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisg
ICAgICAgIGlmIChpbmZvLmZUeXBlID09IE1GVF9TRVBBUkFUT1IpIHsKKyAgICAgICAgICAgIGl0
ZW1zLmFwcGVuZChDb250ZXh0TWVudUl0ZW0oU2VwYXJhdG9yVHlwZSwgQ29udGV4dE1lbnVJdGVt
VGFnTm9BY3Rpb24sIFN0cmluZygpKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
fQogCi1zdGF0aWMgQ29udGV4dE1lbnVJdGVtKiBjb250ZXh0TWVudUl0ZW1CeUlkT3JQb3NpdGlv
bihITUVOVSBtZW51LCB1bnNpZ25lZCBpZCwgQk9PTCBieVBvc2l0aW9uKQotewotICAgIGlmICgh
bWVudSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgTFBNRU5VSVRFTUlORk8gaW5mbyA9IHN0YXRp
Y19jYXN0PExQTUVOVUlURU1JTkZPPihtYWxsb2Moc2l6ZW9mKE1FTlVJVEVNSU5GTykpKTsKLSAg
ICBpZiAoIWluZm8pCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgbWVtc2V0KGluZm8sIDAsIHNp
emVvZihNRU5VSVRFTUlORk8pKTsKLQotICAgIGluZm8tPmNiU2l6ZSA9IHNpemVvZihNRU5VSVRF
TUlORk8pOwotCi0gICAgLy8gU2V0dGluZyBNSUlNX0RBVEEgd2hpY2ggaXMgdXNlZnVsIGZvciBX
ZWJLaXQgY2xpZW50cyB3aG8gc3RvcmUgZGF0YSBpbiB0aGlzIG1lbWJlciBmb3IgdGhlaXIgY3Vz
dG9tIG1lbnUgaXRlbXMuCi0gICAgaW5mby0+Zk1hc2sgPSBNSUlNX0ZUWVBFIHwgTUlJTV9JRCB8
IE1JSU1fU1RSSU5HIHwgTUlJTV9EQVRBOwotCi0gICAgaWYgKCE6OkdldE1lbnVJdGVtSW5mbyht
ZW51LCBpZCwgYnlQb3NpdGlvbiwgaW5mbykpIHsKLSAgICAgICAgZnJlZShpbmZvKTsKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQorICAgICAgICBpbnQgbWVudVN0cmluZ0xlbmd0aCA9IGluZm8u
Y2NoICsgMTsKKyAgICAgICAgT3duQXJyYXlQdHI8V0NIQVI+IG1lbnVTdHJpbmcobmV3IFdDSEFS
W21lbnVTdHJpbmdMZW5ndGhdKTsKKyAgICAgICAgaW5mby5kd1R5cGVEYXRhID0gbWVudVN0cmlu
Zy5nZXQoKTsKKyAgICAgICAgaW5mby5jY2ggPSBtZW51U3RyaW5nTGVuZ3RoOwogCi0gICAgaWYg
KGluZm8tPmZUeXBlICYgTUZUX1NUUklORykgewotICAgICAgICBMUFRTVFIgYnVmZmVyID0gc3Rh
dGljX2Nhc3Q8TFBUU1RSPihtYWxsb2MoKytpbmZvLT5jY2ggKiBzaXplb2YoVENIQVIpKSk7Ci0g
ICAgICAgIGlmICghYnVmZmVyKSB7Ci0gICAgICAgICAgICBmcmVlKGluZm8pOwotICAgICAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaW5mby0+ZHdUeXBlRGF0YSA9IGJ1ZmZl
cjsKLSAgICAgICAgOjpHZXRNZW51SXRlbUluZm8obWVudSwgaWQsIGJ5UG9zaXRpb24sIGluZm8p
OworICAgICAgICBpZiAoOjpHZXRNZW51SXRlbUluZm8obWVudSwgaSwgVFJVRSwgJmluZm8pKQor
ICAgICAgICAgICBpdGVtcy5hcHBlbmQoQ29udGV4dE1lbnVJdGVtKGluZm8pKTsKICAgICB9Ci0K
LSAgICByZXR1cm4gbmV3IENvbnRleHRNZW51SXRlbShpbmZvKTsKIH0KIAotQ29udGV4dE1lbnVJ
dGVtKiBDb250ZXh0TWVudTo6aXRlbVdpdGhBY3Rpb24odW5zaWduZWQgYWN0aW9uKQorSE1FTlUg
Q29udGV4dE1lbnU6OmNyZWF0ZU5hdGl2ZU1lbnVGcm9tSXRlbXMoY29uc3QgVmVjdG9yPENvbnRl
eHRNZW51SXRlbT4mIGl0ZW1zKQogewotICAgIHJldHVybiBjb250ZXh0TWVudUl0ZW1CeUlkT3JQ
b3NpdGlvbihtX3BsYXRmb3JtRGVzY3JpcHRpb24sIGFjdGlvbiwgRkFMU0UpOwotfQorICAgIEhN
RU5VIG1lbnUgPSA6OkNyZWF0ZVBvcHVwTWVudSgpOwogCi1Db250ZXh0TWVudUl0ZW0qIENvbnRl
eHRNZW51OjppdGVtQXRJbmRleCh1bnNpZ25lZCBpbmRleCwgY29uc3QgUGxhdGZvcm1NZW51RGVz
Y3JpcHRpb24gcGxhdGZvcm1EZXNjcmlwdGlvbikKLXsKLSAgICByZXR1cm4gY29udGV4dE1lbnVJ
dGVtQnlJZE9yUG9zaXRpb24ocGxhdGZvcm1EZXNjcmlwdGlvbiwgaW5kZXgsIFRSVUUpOwotfQor
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAg
Y29uc3QgQ29udGV4dE1lbnVJdGVtJiBpdGVtID0gaXRlbXNbaV07CiAKLXZvaWQgQ29udGV4dE1l
bnU6OnNldFBsYXRmb3JtRGVzY3JpcHRpb24oSE1FTlUgbWVudSkKLXsKLSAgICBpZiAobWVudSA9
PSBtX3BsYXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBpZiAo
bV9wbGF0Zm9ybURlc2NyaXB0aW9uKQotICAgICAgICA6OkRlc3Ryb3lNZW51KG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbik7CisgICAgICAgIE1FTlVJVEVNSU5GTyBtZW51SXRlbSA9IGl0ZW0ubmF0aXZl
TWVudUl0ZW0oKTsKIAotICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IG1lbnU7Ci0gICAgaWYg
KCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCi0gICAgICAgIHJldHVybjsKLQotI2lmICFPUyhXSU5D
RSkKLSAgICBNRU5VSU5GTyBtZW51SW5mbyA9IHswfTsKLSAgICBtZW51SW5mby5jYlNpemUgPSBz
aXplb2YoTUVOVUlORk8pOwotICAgIG1lbnVJbmZvLmZNYXNrID0gTUlNX1NUWUxFOwotICAgIDo6
R2V0TWVudUluZm8obV9wbGF0Zm9ybURlc2NyaXB0aW9uLCAmbWVudUluZm8pOwotICAgIG1lbnVJ
bmZvLmZNYXNrID0gTUlNX1NUWUxFOwotICAgIG1lbnVJbmZvLmR3U3R5bGUgfD0gTU5TX05PVElG
WUJZUE9TOwotICAgIDo6U2V0TWVudUluZm8obV9wbGF0Zm9ybURlc2NyaXB0aW9uLCAmbWVudUlu
Zm8pOwotI2VuZGlmCi19Ci0KLUhNRU5VIENvbnRleHRNZW51OjpwbGF0Zm9ybURlc2NyaXB0aW9u
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wbGF0Zm9ybURlc2NyaXB0aW9uOwotfQorICAgICAg
ICAvLyBDb250ZXh0TWVudUl0ZW06Om5hdGl2ZU1lbnVJdGVtIGRvZXNuJ3Qgc2V0IHRoZSB0aXRs
ZSBvZiB0aGUgTUVOVUlURU1JTkZPIHRvIG1ha2UgdGhlCisgICAgICAgIC8vIGxpZmV0aW1lIGhh
bmRsaW5nIGVhc2llciBmb3IgY2FsbGVycy4KKyAgICAgICAgU3RyaW5nIGl0ZW1UaXRsZSA9IGl0
ZW0udGl0bGUoKTsKKyAgICAgICAgaWYgKGl0ZW0udHlwZSgpICE9IFNlcGFyYXRvclR5cGUpIHsK
KyAgICAgICAgICAgIG1lbnVJdGVtLmZNYXNrIHw9IE1JSU1fU1RSSU5HOworICAgICAgICAgICAg
bWVudUl0ZW0uY2NoID0gaXRlbVRpdGxlLmxlbmd0aCgpOworICAgICAgICAgICAgbWVudUl0ZW0u
ZHdUeXBlRGF0YSA9IGNvbnN0X2Nhc3Q8TFBXU1RSPihpdGVtVGl0bGUuY2hhcmFjdGVyc1dpdGhO
dWxsVGVybWluYXRpb24oKSk7CisgICAgICAgIH0KIAotSE1FTlUgQ29udGV4dE1lbnU6OnJlbGVh
c2VQbGF0Zm9ybURlc2NyaXB0aW9uKCkKLXsKLSAgICBITUVOVSBkZXNjcmlwdGlvbiA9IG1fcGxh
dGZvcm1EZXNjcmlwdGlvbjsKLSAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24gPSAwOwotICAgIHJl
dHVybiBkZXNjcmlwdGlvbjsKLX0KKyAgICAgICAgOjpJbnNlcnRNZW51SXRlbShtZW51LCBpLCBU
UlVFLCAmbWVudUl0ZW0pOworICAgIH0KIAotVmVjdG9yPENvbnRleHRNZW51SXRlbT4gY29udGV4
dE1lbnVJdGVtVmVjdG9yKFBsYXRmb3JtTWVudURlc2NyaXB0aW9uKQotewotICAgIC8vIEZJWE1F
IC0gSW1wbGVtZW50Ci0gICAgcmV0dXJuIFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+KCk7CisgICAg
cmV0dXJuIG1lbnU7CiB9CiAKLVBsYXRmb3JtTWVudURlc2NyaXB0aW9uIHBsYXRmb3JtTWVudURl
c2NyaXB0aW9uKFZlY3RvcjxDb250ZXh0TWVudUl0ZW0+JiBtZW51SXRlbVZlY3RvcikKK0hNRU5V
IENvbnRleHRNZW51OjpuYXRpdmVNZW51KCkgY29uc3QKIHsKLSAgICAvLyBGSVhNRSAtIEltcGxl
bWVudAotICAgIHJldHVybiAwOworICAgIHJldHVybiBjcmVhdGVOYXRpdmVNZW51RnJvbUl0ZW1z
KG1faXRlbXMpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJLaXQyL0No
YW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQyL0NoYW5nZUxvZwkocmV2aXNpb24gNzM2NjIp
CisrKyBXZWJLaXQyL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI1IEBACisy
MDEwLTEyLTA5ICBCcmlhbiBXZWluc3RlaW4gIDxid2VpbnN0ZWluQGFwcGxlLmNvbT4KKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBQcmVwIGZvciBXZWJL
aXQyOiBDb250ZXh0IG1lbnUgc3VwcG9ydCBvbiBXaW5kb3dzCisgICAgICAgIGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01MDUxNAorICAgICAgICAKKyAgICAgICAgVXBk
YXRlIFdlYktpdDIgdG8gY2FsbCB0aGUgY29ycmVjdCBjb2RlIHdoZW4gQ1JPU1NfUExBVEZPUk1f
Q09OVEVYVF9NRU5VUyBpcyBzZXQuCisKKyAgICAgICAgKiBTaGFyZWQvV2ViQ29udGV4dE1lbnVJ
dGVtRGF0YS5jcHA6CisgICAgICAgIChXZWJLaXQ6OldlYkNvbnRleHRNZW51SXRlbURhdGE6Oldl
YkNvbnRleHRNZW51SXRlbURhdGEpOiBBZGQgYSBicmFuY2ggYmFzZWQgb24gd2hldGhlciBvciBu
b3QgCisgICAgICAgICAgICBDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTIGlzIHNldC4KKyAg
ICAgICAgKiBXZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmNw
cDoKKyAgICAgICAgKFdlYktpdDo6V2ViQ29udGV4dE1lbnVDbGllbnQ6OmN1c3RvbWl6ZU1lbnUp
OiBEZWZpbmUgZGlmZmVyZW50IGZ1bmN0aW9ucyBiYXNlZCBvbgorICAgICAgICAgICAgd2hldGhl
ciBvciBub3QgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUy4gQm90aCBvZiB0aGVzZSBhcmUg
c3R1YnMsIHNvIGZ1bmN0aW9uYWxpdHkKKyAgICAgICAgICAgIGRvZXNuJ3QgbmVlZCB0byBiZSBz
aGFyZWQuCisgICAgICAgICogV2ViUHJvY2Vzcy9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVu
dUNsaWVudC5oOiBEZWZpbmUgZGlmZmVyZW50IGZ1bmN0aW9ucyBiYXNlZCBvbgorICAgICAgICAg
ICAgd2hldGhlciBvciBub3QgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUy4gCisgICAgICAg
ICogV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYkNvbnRleHRNZW51LmNwcDoKKyAgICAgICAgKFdlYktp
dDo6V2ViQ29udGV4dE1lbnU6OnNob3cpOiBBZGQgYSBicmFuY2ggYmFzZWQgb24gd2hldGhlciBv
ciBub3QgCisgICAgICAgICAgICBDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTIGlzIHNldC4K
KwogMjAxMC0xMi0wOSAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAYXBwbGUuY29tPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IFNhbSBXZWluaWcuCkluZGV4OiBXZWJLaXQyL1NoYXJlZC9XZWJD
b250ZXh0TWVudUl0ZW1EYXRhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQyL1NoYXJlZC9XZWJD
b250ZXh0TWVudUl0ZW1EYXRhLmNwcAkocmV2aXNpb24gNzM2NjIpCisrKyBXZWJLaXQyL1NoYXJl
ZC9XZWJDb250ZXh0TWVudUl0ZW1EYXRhLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjMsMTMgKzYz
LDE3IEBAIFdlYkNvbnRleHRNZW51SXRlbURhdGE6OldlYkNvbnRleHRNZW51SXQKIHsKIH0KIAot
V2ViQ29udGV4dE1lbnVJdGVtRGF0YTo6V2ViQ29udGV4dE1lbnVJdGVtRGF0YShXZWJDb3JlOjpD
b250ZXh0TWVudUl0ZW0mIGl0ZW0sIFdlYkNvcmU6OkNvbnRleHRNZW51KiBtZW51KQorV2ViQ29u
dGV4dE1lbnVJdGVtRGF0YTo6V2ViQ29udGV4dE1lbnVJdGVtRGF0YShjb25zdCBXZWJDb3JlOjpD
b250ZXh0TWVudUl0ZW0mIGl0ZW0sIFdlYkNvcmU6OkNvbnRleHRNZW51KiBtZW51KQogICAgIDog
bV90eXBlKGl0ZW0udHlwZSgpKQogICAgICwgbV9hY3Rpb24oaXRlbS5hY3Rpb24oKSkKICAgICAs
IG1fdGl0bGUoaXRlbS50aXRsZSgpKQogewogICAgIGlmIChtX3R5cGUgPT0gV2ViQ29yZTo6U3Vi
bWVudVR5cGUpIHsKKyNpZiBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKyAgICAg
ICAgY29uc3QgVmVjdG9yPFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbT4mIGNvcmVTdWJtZW51ID0g
aXRlbS5zdWJNZW51SXRlbXMoKTsKKyNlbHNlCiAgICAgICAgIFZlY3RvcjxXZWJDb3JlOjpDb250
ZXh0TWVudUl0ZW0+IGNvcmVTdWJtZW51ID0gV2ViQ29yZTo6Y29udGV4dE1lbnVJdGVtVmVjdG9y
KGl0ZW0ucGxhdGZvcm1TdWJNZW51KCkpOworI2VuZGlmCiAgICAgICAgIG1fc3VibWVudSA9IGtp
dEl0ZW1zKGNvcmVTdWJtZW51LCBtZW51KTsKICAgICB9CiAgICAgCkBAIC0xMzAsNyArMTM0LDcg
QEAgYm9vbCBXZWJDb250ZXh0TWVudUl0ZW1EYXRhOjpkZWNvZGUoQ29yZQogICAgIHJldHVybiB0
cnVlOwogfQogCi1WZWN0b3I8V2ViQ29udGV4dE1lbnVJdGVtRGF0YT4ga2l0SXRlbXMoVmVjdG9y
PFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbT4mIGNvcmVJdGVtVmVjdG9yLCBXZWJDb3JlOjpDb250
ZXh0TWVudSogbWVudSkKK1ZlY3RvcjxXZWJDb250ZXh0TWVudUl0ZW1EYXRhPiBraXRJdGVtcyhj
b25zdCBWZWN0b3I8V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtPiYgY29yZUl0ZW1WZWN0b3IsIFdl
YkNvcmU6OkNvbnRleHRNZW51KiBtZW51KQogewogICAgIFZlY3RvcjxXZWJDb250ZXh0TWVudUl0
ZW1EYXRhPiByZXN1bHQ7CiAgICAgcmVzdWx0LnJlc2VydmVDYXBhY2l0eShjb3JlSXRlbVZlY3Rv
ci5zaXplKCkpOwpJbmRleDogV2ViS2l0Mi9TaGFyZWQvV2ViQ29udGV4dE1lbnVJdGVtRGF0YS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYktpdDIvU2hhcmVkL1dlYkNvbnRleHRNZW51SXRlbURhdGEuaAko
cmV2aXNpb24gNzM2NjIpCisrKyBXZWJLaXQyL1NoYXJlZC9XZWJDb250ZXh0TWVudUl0ZW1EYXRh
LmgJKHdvcmtpbmcgY29weSkKQEAgLTQ1LDcgKzQ1LDcgQEAgY2xhc3MgQVBJT2JqZWN0OwogY2xh
c3MgV2ViQ29udGV4dE1lbnVJdGVtRGF0YSB7CiBwdWJsaWM6CiAgICAgV2ViQ29udGV4dE1lbnVJ
dGVtRGF0YSgpOwotICAgIFdlYkNvbnRleHRNZW51SXRlbURhdGEoV2ViQ29yZTo6Q29udGV4dE1l
bnVJdGVtJiwgV2ViQ29yZTo6Q29udGV4dE1lbnUqIG1lbnUpOworICAgIFdlYkNvbnRleHRNZW51
SXRlbURhdGEoY29uc3QgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtJiwgV2ViQ29yZTo6Q29udGV4
dE1lbnUqIG1lbnUpOwogICAgIFdlYkNvbnRleHRNZW51SXRlbURhdGEoV2ViQ29yZTo6Q29udGV4
dE1lbnVJdGVtVHlwZSwgV2ViQ29yZTo6Q29udGV4dE1lbnVBY3Rpb24sIGNvbnN0IFN0cmluZyYg
dGl0bGUsIGJvb2wgZW5hYmxlZCwgYm9vbCBjaGVja2VkKTsKICAgICBXZWJDb250ZXh0TWVudUl0
ZW1EYXRhKFdlYkNvcmU6OkNvbnRleHRNZW51QWN0aW9uLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBi
b29sIGVuYWJsZWQsIGNvbnN0IFZlY3RvcjxXZWJDb250ZXh0TWVudUl0ZW1EYXRhPiYgc3VibWVu
dSk7CiAKQEAgLTc0LDcgKzc0LDcgQEAgcHJpdmF0ZToKICAgICBSZWZQdHI8QVBJT2JqZWN0PiBt
X3VzZXJEYXRhOwogfTsKIAotVmVjdG9yPFdlYkNvbnRleHRNZW51SXRlbURhdGE+IGtpdEl0ZW1z
KFZlY3RvcjxXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW0+JiwgV2ViQ29yZTo6Q29udGV4dE1lbnUq
KTsKK1ZlY3RvcjxXZWJDb250ZXh0TWVudUl0ZW1EYXRhPiBraXRJdGVtcyhjb25zdCBWZWN0b3I8
V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtPiYsIFdlYkNvcmU6OkNvbnRleHRNZW51Kik7CiBWZWN0
b3I8V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtPiBjb3JlSXRlbXMoY29uc3QgVmVjdG9yPFdlYkNv
bnRleHRNZW51SXRlbURhdGE+Jik7CiAKIH0gLy8gbmFtZXNwYWNlIFdlYktpdApJbmRleDogV2Vi
S2l0Mi9XZWJQcm9jZXNzL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4
dE1lbnVDbGllbnQuY3BwCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYktpdDIvV2ViUHJvY2Vzcy9X
ZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTQ0LDExICs0NCwxOSBAQCB2b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50Ojpjb250ZXh0TWVudURl
CiAgICAgZGVsZXRlIHRoaXM7CiB9CiAKKyNpZiBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9N
RU5VUykKK1Bhc3NPd25QdHI8Q29udGV4dE1lbnU+IFdlYkNvbnRleHRNZW51Q2xpZW50OjpjdXN0
b21pemVNZW51KFBhc3NPd25QdHI8Q29udGV4dE1lbnU+IG1lbnUpCit7CisgICAgLy8gV2ViS2l0
MiBpZ25vcmVzIHRoaXMgY2xpZW50IGNhbGxiYWNrIGFuZCBkb2VzIGNvbnRleHQgbWVudSBjdXN0
b21pemF0aW9uIHdoZW4gaXQgaXMgdG9sZCB0byBzaG93IHRoZSBtZW51LgorICAgIHJldHVybiBt
ZW51OworfQorI2Vsc2UKIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIFdlYkNvbnRleHRNZW51Q2xp
ZW50OjpnZXRDdXN0b21NZW51RnJvbURlZmF1bHRJdGVtcyhDb250ZXh0TWVudSogbWVudSkKIHsK
ICAgICAvLyBXZWJLaXQyIGlnbm9yZXMgdGhpcyBjbGllbnQgY2FsbGJhY2sgYW5kIGRvZXMgY29u
dGV4dCBtZW51IGN1c3RvbWl6YXRpb24gd2hlbiBpdCBpcyB0b2xkIHRvIHNob3cgdGhlIG1lbnUu
CiAgICAgcmV0dXJuIG1lbnUtPnBsYXRmb3JtRGVzY3JpcHRpb24oKTsKIH0KKyNlbmRpZgogCiB2
b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50Ojpjb250ZXh0TWVudUl0ZW1TZWxlY3RlZChDb250ZXh0
TWVudUl0ZW0qLCBjb25zdCBDb250ZXh0TWVudSopCiB7CkluZGV4OiBXZWJLaXQyL1dlYlByb2Nl
c3MvV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuaAko
cmV2aXNpb24gNzM2NjIpCisrKyBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViQ29yZVN1cHBvcnQvV2Vi
Q29udGV4dE1lbnVDbGllbnQuaAkod29ya2luZyBjb3B5KQpAQCAtNDIsNyArNDIsMTEgQEAgcHVi
bGljOgogcHJpdmF0ZToKICAgICB2aXJ0dWFsIHZvaWQgY29udGV4dE1lbnVEZXN0cm95ZWQoKTsK
ICAgICAKKyNpZiBVU0UoQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUykKKyAgICB2aXJ0dWFs
IFBhc3NPd25QdHI8V2ViQ29yZTo6Q29udGV4dE1lbnU+IGN1c3RvbWl6ZU1lbnUoUGFzc093blB0
cjxXZWJDb3JlOjpDb250ZXh0TWVudT4pOworI2Vsc2UKICAgICB2aXJ0dWFsIFdlYkNvcmU6OlBs
YXRmb3JtTWVudURlc2NyaXB0aW9uIGdldEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0ZW1zKFdlYkNv
cmU6OkNvbnRleHRNZW51Kik7CisjZW5kaWYKICAgICB2aXJ0dWFsIHZvaWQgY29udGV4dE1lbnVJ
dGVtU2VsZWN0ZWQoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtKiwgY29uc3QgV2ViQ29yZTo6Q29u
dGV4dE1lbnUqKTsKICAgICAKICAgICB2aXJ0dWFsIHZvaWQgZG93bmxvYWRVUkwoY29uc3QgV2Vi
Q29yZTo6S1VSTCYgdXJsKTsKSW5kZXg6IFdlYktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYkNv
bnRleHRNZW51LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQyL1dlYlByb2Nlc3MvV2ViUGFnZS9X
ZWJDb250ZXh0TWVudS5jcHAJKHJldmlzaW9uIDczNjYyKQorKysgV2ViS2l0Mi9XZWJQcm9jZXNz
L1dlYlBhZ2UvV2ViQ29udGV4dE1lbnUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02NCw3ICs2NCwx
MSBAQCB2b2lkIFdlYkNvbnRleHRNZW51OjpzaG93KCkKICAgICAgICAgcmV0dXJuOwogCiAgICAg
Ly8gR2l2ZSB0aGUgYnVuZGxlIGNsaWVudCBhIGNoYW5jZSB0byBwcm9jZXNzIHRoZSBtZW51Lgor
I2lmIFVTRShDUk9TU19QTEFURk9STV9DT05URVhUX01FTlVTKQorICAgIGNvbnN0IFZlY3RvcjxD
b250ZXh0TWVudUl0ZW0+JiBjb3JlSXRlbXMgPSBtZW51LT5pdGVtcygpOworI2Vsc2UKICAgICBW
ZWN0b3I8Q29udGV4dE1lbnVJdGVtPiBjb3JlSXRlbXMgPSBjb250ZXh0TWVudUl0ZW1WZWN0b3Io
bWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpKTsKKyNlbmRpZgogICAgIFZlY3RvcjxXZWJDb250
ZXh0TWVudUl0ZW1EYXRhPiBwcm9wb3NlZE1lbnUgPSBraXRJdGVtcyhjb3JlSXRlbXMsIG1lbnUp
OwogICAgIFZlY3RvcjxXZWJDb250ZXh0TWVudUl0ZW1EYXRhPiBuZXdNZW51OwogICAgIFJlZlB0
cjxBUElPYmplY3Q+IHVzZXJEYXRhOwpJbmRleDogV2ViS2l0L3dpbi9DaGFuZ2VMb2cKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViS2l0L3dpbi9DaGFuZ2VMb2cJKHJldmlzaW9uIDczNjYyKQorKysgV2ViS2l0
L3dpbi9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwyMyBAQAorMjAxMC0xMi0w
OSAgQnJpYW4gV2VpbnN0ZWluICA8YndlaW5zdGVpbkBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgUHJlcCBmb3IgV2ViS2l0MjogQ29u
dGV4dCBtZW51IHN1cHBvcnQgb24gV2luZG93cworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTA1MTQKKyAgICAgICAgCisgICAgICAgIFVwZGF0ZSBXZWJL
aXQgZm9yIHRoZSBuZXcgQ1JPU1NfUExBVEZPUk1fQ09OVEVYVF9NRU5VUyBmbGFnLCBhbmQgZGVm
aW5lIGN1c3RvbWl6ZU1lbnUKKyAgICAgICAgaW5zdGVhZCBvZiBnZXRDdXN0b21NZW51RnJvbURl
ZmF1bHRJdGVtcy4KKworICAgICAgICAqIFdlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xp
ZW50LmNwcDoKKyAgICAgICAgKFdlYkNvbnRleHRNZW51Q2xpZW50OjpjdXN0b21pemVNZW51KTog
Z2V0Q3VzdG9tTWVudUZyb21EZWZhdWx0SXRlbXMgd2FzIHR1cm5lZCBpbnRvCisgICAgICAgICAg
ICB0aGlzIGZ1bmN0aW9uLCB3aXRoIHJlZmFjdG9yaW5nIHVzaW5nIG5hdGl2ZU1lbnUgaW5zdGVh
ZCBvZiBwbGF0Zm9ybURlc2NyaXB0aW9uLgorICAgICAgICAoV2ViQ29udGV4dE1lbnVDbGllbnQ6
OmNvbnRleHRNZW51SXRlbVNlbGVjdGVkKTogIFVzZSBuYXRpdmVNZW51IGluc3RlYWQgb2YgcGxh
dGZvcm1EZXNjcmlwdGlvbi4KKyAgICAgICAgKiBXZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVu
dUNsaWVudC5oOgorICAgICAgICAqIFdlYlZpZXcuY3BwOgorICAgICAgICAoV2ViVmlldzo6aGFu
ZGxlQ29udGV4dE1lbnVFdmVudCk6IENhbGwgbmF0aXZlTWVudSBpbnN0ZWFkIG9mIHBsYXRmb3Jt
RGVzY3JpcHRpb24uCisgICAgICAgIChXZWJWaWV3OjpwZXJmb3JtQ29udGV4dE1lbnVBY3Rpb24p
OiBPbmx5IGNhbGwgaXRlbUF0SW5kZXggd2l0aCBvbmUgYXJndW1lbnQsIG5vIG5lZWQKKyAgICAg
ICAgICAgIGZvciB0aGUgc2Vjb25kLgorCiAyMDEwLTEyLTA3ICBCcmlhbiBXZWluc3RlaW4gIDxi
d2VpbnN0ZWluQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBKb2huIFN1bGxpdmFu
LgpJbmRleDogV2ViS2l0L3dpbi9XZWJWaWV3LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvd2lu
L1dlYlZpZXcuY3BwCShyZXZpc2lvbiA3MzY2MikKKysrIFdlYktpdC93aW4vV2ViVmlldy5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEyNzUsMTIgKzEyNzUsMTIgQEAgYm9vbCBXZWJWaWV3OjpoYW5k
bGVDb250ZXh0TWVudUV2ZW50KFdQQQogICAgICAgICBtX3VpRGVsZWdhdGUtPmhhc0N1c3RvbU1l
bnVJbXBsZW1lbnRhdGlvbigmaGFzQ3VzdG9tTWVudXMpOwogCiAgICAgaWYgKGhhc0N1c3RvbU1l
bnVzKQotICAgICAgICBtX3VpRGVsZWdhdGUtPnRyYWNrQ3VzdG9tUG9wdXBNZW51KChJV2ViVmll
dyopdGhpcywgKE9MRV9IQU5ETEUpKFVMT05HNjQpY29yZU1lbnUtPnBsYXRmb3JtRGVzY3JpcHRp
b24oKSwgJnBvaW50KTsKKyAgICAgICAgbV91aURlbGVnYXRlLT50cmFja0N1c3RvbVBvcHVwTWVu
dSgoSVdlYlZpZXcqKXRoaXMsIChPTEVfSEFORExFKShVTE9ORzY0KWNvcmVNZW51LT5uYXRpdmVN
ZW51KCksICZwb2ludCk7CiAgICAgZWxzZSB7CiAgICAgICAgIC8vIFN1cnByaXNpbmdseSwgVFBN
X1JJR0hUQlVUVE9OIG1lYW5zIHRoYXQgaXRlbXMgYXJlIHNlbGVjdGFibGUgd2l0aCBlaXRoZXIg
dGhlIHJpZ2h0IE9SIGxlZnQgbW91c2UgYnV0dG9uCiAgICAgICAgIFVJTlQgZmxhZ3MgPSBUUE1f
UklHSFRCVVRUT04gfCBUUE1fVE9QQUxJR04gfCBUUE1fVkVSUE9TQU5JTUFUSU9OIHwgVFBNX0hP
UklaT05UQUwKICAgICAgICAgICAgIHwgVFBNX0xFRlRBTElHTiB8IFRQTV9IT1JQT1NBTklNQVRJ
T047Ci0gICAgICAgIDo6VHJhY2tQb3B1cE1lbnVFeChjb3JlTWVudS0+cGxhdGZvcm1EZXNjcmlw
dGlvbigpLCBmbGFncywgcG9pbnQueCwgcG9pbnQueSwgbV92aWV3V2luZG93LCAwKTsKKyAgICAg
ICAgOjpUcmFja1BvcHVwTWVudUV4KGNvcmVNZW51LT5uYXRpdmVNZW51KCksIGZsYWdzLCBwb2lu
dC54LCBwb2ludC55LCBtX3ZpZXdXaW5kb3csIDApOwogICAgIH0KIAogICAgIHJldHVybiB0cnVl
OwpAQCAtMTM1NSwxMSArMTM1NSwxMCBAQCB2b2lkIFdlYlZpZXc6OnBlcmZvcm1Db250ZXh0TWVu
dUFjdGlvbihXCiAgICAgQ29udGV4dE1lbnUqIG1lbnUgPSBtX3BhZ2UtPmNvbnRleHRNZW51Q29u
dHJvbGxlcigpLT5jb250ZXh0TWVudSgpOwogICAgIEFTU0VSVChtZW51KTsKIAotICAgIENvbnRl
eHRNZW51SXRlbSogaXRlbSA9IGJ5UG9zaXRpb24gPyBtZW51LT5pdGVtQXRJbmRleCgodW5zaWdu
ZWQpd1BhcmFtLCAoSE1FTlUpbFBhcmFtKSA6IG1lbnUtPml0ZW1XaXRoQWN0aW9uKChDb250ZXh0
TWVudUFjdGlvbil3UGFyYW0pOworICAgIENvbnRleHRNZW51SXRlbSogaXRlbSA9IGJ5UG9zaXRp
b24gPyBtZW51LT5pdGVtQXRJbmRleCgodW5zaWduZWQpd1BhcmFtKSA6IG1lbnUtPml0ZW1XaXRo
QWN0aW9uKChDb250ZXh0TWVudUFjdGlvbil3UGFyYW0pOwogICAgIGlmICghaXRlbSkKICAgICAg
ICAgcmV0dXJuOwogICAgIG1fcGFnZS0+Y29udGV4dE1lbnVDb250cm9sbGVyKCktPmNvbnRleHRN
ZW51SXRlbVNlbGVjdGVkKGl0ZW0pOwotICAgIGRlbGV0ZSBpdGVtOwogfQogCiBib29sIFdlYlZp
ZXc6OmhhbmRsZU1vdXNlRXZlbnQoVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0g
bFBhcmFtKQpJbmRleDogV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNs
aWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L3dpbi9XZWJDb3JlU3VwcG9ydC9XZWJDb250
ZXh0TWVudUNsaWVudC5jcHAJKHJldmlzaW9uIDczNjYyKQorKysgV2ViS2l0L3dpbi9XZWJDb3Jl
U3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU1LDIx
ICs1NSwyOSBAQCB2b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50Ojpjb250ZXh0TWVudURlCiAgICAg
ZGVsZXRlIHRoaXM7CiB9CiAKLUhNRU5VIFdlYkNvbnRleHRNZW51Q2xpZW50OjpnZXRDdXN0b21N
ZW51RnJvbURlZmF1bHRJdGVtcyhDb250ZXh0TWVudSogbWVudSkKK1Bhc3NPd25QdHI8Q29udGV4
dE1lbnU+IFdlYkNvbnRleHRNZW51Q2xpZW50OjpjdXN0b21pemVNZW51KFBhc3NPd25QdHI8Q29u
dGV4dE1lbnU+IHBvcE1lbnUpCiB7CisgICAgT3duUHRyPENvbnRleHRNZW51PiBtZW51ID0gcG9w
TWVudTsKKwogICAgIENPTVB0cjxJV2ViVUlEZWxlZ2F0ZT4gdWlEZWxlZ2F0ZTsKICAgICBpZiAo
RkFJTEVEKG1fd2ViVmlldy0+dWlEZWxlZ2F0ZSgmdWlEZWxlZ2F0ZSkpKQotICAgICAgICByZXR1
cm4gbWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpOworICAgICAgICByZXR1cm4gbWVudS5yZWxl
YXNlKCk7CiAKICAgICBBU1NFUlQodWlEZWxlZ2F0ZSk7CiAKLSAgICBITUVOVSBuZXdNZW51ID0g
MDsKKyAgICBITUVOVSBuYXRpdmVNZW51ID0gbWVudS0+bmF0aXZlTWVudSgpOwogICAgIENPTVB0
cjxXZWJFbGVtZW50UHJvcGVydHlCYWc+IHByb3BlcnR5QmFnOwogICAgIHByb3BlcnR5QmFnLmFk
b3B0UmVmKFdlYkVsZW1lbnRQcm9wZXJ0eUJhZzo6Y3JlYXRlSW5zdGFuY2UobV93ZWJWaWV3LT5w
YWdlKCktPmNvbnRleHRNZW51Q29udHJvbGxlcigpLT5oaXRUZXN0UmVzdWx0KCkpKTsKICAgICAv
LyBGSVhNRTogV2UgbmVlZCB0byBkZWNpZGUgd2hldGhlciB0byBkbyB0aGUgZGVmYXVsdCBiZWZv
cmUgY2FsbGluZyB0aGlzIGRlbGVnYXRlIG1ldGhvZAotICAgIGlmIChGQUlMRUQodWlEZWxlZ2F0
ZS0+Y29udGV4dE1lbnVJdGVtc0ZvckVsZW1lbnQobV93ZWJWaWV3LCBwcm9wZXJ0eUJhZy5nZXQo
KSwgKE9MRV9IQU5ETEUpKFVMT05HNjQpbWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpLCAoT0xF
X0hBTkRMRSopJm5ld01lbnUpKSkKLSAgICAgICAgcmV0dXJuIG1lbnUtPnBsYXRmb3JtRGVzY3Jp
cHRpb24oKTsKLSAgICByZXR1cm4gbmV3TWVudTsKKyAgICBpZiAoRkFJTEVEKHVpRGVsZWdhdGUt
PmNvbnRleHRNZW51SXRlbXNGb3JFbGVtZW50KG1fd2ViVmlldywgcHJvcGVydHlCYWcuZ2V0KCks
IChPTEVfSEFORExFKShVTE9ORzY0KW5hdGl2ZU1lbnUsIChPTEVfSEFORExFKikmbmF0aXZlTWVu
dSkpKSB7CisgICAgICAgIDo6RGVzdHJveU1lbnUobmF0aXZlTWVudSk7CisgICAgICAgIHJldHVy
biBtZW51LnJlbGVhc2UoKTsKKyAgICB9CisgICAgCisgICAgT3duUHRyPENvbnRleHRNZW51PiBj
dXN0b21pemVkTWVudSA9IGFkb3B0UHRyKG5ldyBDb250ZXh0TWVudShuYXRpdmVNZW51KSk7Cisg
ICAgOjpEZXN0cm95TWVudShuYXRpdmVNZW51KTsKKworICAgIHJldHVybiBjdXN0b21pemVkTWVu
dS5yZWxlYXNlKCk7CiB9CiAKIHZvaWQgV2ViQ29udGV4dE1lbnVDbGllbnQ6OmNvbnRleHRNZW51
SXRlbVNlbGVjdGVkKENvbnRleHRNZW51SXRlbSogaXRlbSwgY29uc3QgQ29udGV4dE1lbnUqIHBh
cmVudE1lbnUpCkBAIC04NCw4ICs5MiwxNyBAQCB2b2lkIFdlYkNvbnRleHRNZW51Q2xpZW50Ojpj
b250ZXh0TWVudUl0CiAKICAgICBDT01QdHI8V2ViRWxlbWVudFByb3BlcnR5QmFnPiBwcm9wZXJ0
eUJhZzsKICAgICBwcm9wZXJ0eUJhZy5hZG9wdFJlZihXZWJFbGVtZW50UHJvcGVydHlCYWc6OmNy
ZWF0ZUluc3RhbmNlKG1fd2ViVmlldy0+cGFnZSgpLT5jb250ZXh0TWVudUNvbnRyb2xsZXIoKS0+
aGl0VGVzdFJlc3VsdCgpKSk7Ci0gICAgICAgICAgICAKLSAgICB1aURlbGVnYXRlLT5jb250ZXh0
TWVudUl0ZW1TZWxlY3RlZChtX3dlYlZpZXcsIGl0ZW0tPnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0
aW9uKCksIHByb3BlcnR5QmFnLmdldCgpKTsKKworICAgIC8vIFRoaXMgY2FsbCB3b3VsZCBsZWFr
IHRoZSBNRU5VSVRFTUlORk8ncyBzdWJNZW51IGlmIGl0IGhhZCBvbmUsIGJ1dCBvbiBXaW5kb3dz
LCBzdWJNZW51cyBjYW4ndCBiZSBzZWxlY3RlZCwgc28gdGhlcmUgaXMKKyAgICAvLyBubyB3YXkg
d2Ugd291bGQgZ2V0IHRvIHRoaXMgcG9pbnQuIEFsc28sIGl0IGNhbid0IGJlIGEgc2VwYXJhdG9y
LCBiZWNhdXNlIHNlcGFyYXRvcnMgY2Fubm90IGJlIHNlbGVjdGVkLgorICAgIEFTU0VSVChpdGVt
LT50eXBlKCkgIT0gU3VibWVudVR5cGUpOworICAgIEFTU0VSVChpdGVtLT50eXBlKCkgIT0gU2Vw
YXJhdG9yVHlwZSk7CisKKyAgICAvLyBDb250ZXh0TWVudUl0ZW06Om5hdGl2ZU1lbnVJdGVtIGRv
ZXNuJ3Qgc2V0IHRoZSBkd1R5cGVEYXRhIG9mIHRoZSBNRU5VSVRFTUlORk8sIGJ1dCBubyBXZWJL
aXQgY2xpZW50cworICAgIC8vIHVzZSB0aGUgdGl0bGUgaW4gSVdlYlVJRGVsZWdhdGU6OmNvbnRl
eHRNZW51SXRlbVNlbGVjdGVkLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHBvcHVsYXRlIGl0IGhlcmUu
CisgICAgTUVOVUlURU1JTkZPIHNlbGVjdGVkSXRlbSA9IGl0ZW0tPm5hdGl2ZU1lbnVJdGVtKCk7
CisKKyAgICB1aURlbGVnYXRlLT5jb250ZXh0TWVudUl0ZW1TZWxlY3RlZChtX3dlYlZpZXcsICZz
ZWxlY3RlZEl0ZW0sIHByb3BlcnR5QmFnLmdldCgpKTsKIH0KIAogdm9pZCBXZWJDb250ZXh0TWVu
dUNsaWVudDo6ZG93bmxvYWRVUkwoY29uc3QgS1VSTCYgdXJsKQpJbmRleDogV2ViS2l0L3dpbi9X
ZWJDb3JlU3VwcG9ydC9XZWJDb250ZXh0TWVudUNsaWVudC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktp
dC93aW4vV2ViQ29yZVN1cHBvcnQvV2ViQ29udGV4dE1lbnVDbGllbnQuaAkocmV2aXNpb24gNzM2
NjIpCisrKyBXZWJLaXQvd2luL1dlYkNvcmVTdXBwb3J0L1dlYkNvbnRleHRNZW51Q2xpZW50LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTIzLDggKzIzLDEwIEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKICAqLwog
CisjaW5jbHVkZSA8V2ViQ29yZS9Db250ZXh0TWVudS5oPgogI2luY2x1ZGUgPFdlYkNvcmUvQ29u
dGV4dE1lbnVDbGllbnQuaD4KICNpbmNsdWRlIDx3dGYvRm9yd2FyZC5oPgorI2luY2x1ZGUgPHd0
Zi9QYXNzT3duUHRyLmg+CiAKIGNsYXNzIFdlYlZpZXc7CiAKQEAgLTM0LDcgKzM2LDcgQEAgcHVi
bGljOgogCiAgICAgdmlydHVhbCB2b2lkIGNvbnRleHRNZW51RGVzdHJveWVkKCk7CiAKLSAgICB2
aXJ0dWFsIEhNRU5VIGdldEN1c3RvbU1lbnVGcm9tRGVmYXVsdEl0ZW1zKFdlYkNvcmU6OkNvbnRl
eHRNZW51Kik7CisgICAgdmlydHVhbCBQYXNzT3duUHRyPFdlYkNvcmU6OkNvbnRleHRNZW51PiBj
dXN0b21pemVNZW51KFBhc3NPd25QdHI8V2ViQ29yZTo6Q29udGV4dE1lbnU+KTsKICAgICB2aXJ0
dWFsIHZvaWQgY29udGV4dE1lbnVJdGVtU2VsZWN0ZWQoV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVt
KiwgY29uc3QgV2ViQ29yZTo6Q29udGV4dE1lbnUqKTsKICAgICAKICAgICB2aXJ0dWFsIHZvaWQg
ZG93bmxvYWRVUkwoY29uc3QgV2ViQ29yZTo6S1VSTCYpOwo=
</data>
<flag name="review"
          id="67152"
          type_id="1"
          status="+"
          setter="aroben"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76271</attachid>
            <date>2010-12-10 15:38:31 -0800</date>
            <delta_ts>2010-12-10 15:40:09 -0800</delta_ts>
            <desc>[PATCH] Fix Silly Mistake</desc>
            <filename>silly-mistake.patch</filename>
            <type>text/plain</type>
            <size>1161</size>
            <attacher name="Brian Weinstein">bweinstein</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MzgxMSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTMgQEAKKzIwMTAtMTItMTAgIEJyaWFuIFdlaW5zdGVpbiAgPGJ3ZWluc3RlaW5A
YXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIFdoZW4gd2UgYXJlIGNyZWF0aW5nIGEgQ29udGV4dE1lbnVJdGVtLCBvbmx5IGNhbGwgc2V0
U3ViTWVudSBpZiB3ZSBoYXZlCisgICAgICAgIGEgc3ViTWVudSB0byBzZXQuCisKKyAgICAgICAg
KiBwbGF0Zm9ybS9Db250ZXh0TWVudUl0ZW0uY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q29udGV4
dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0pOgorCiAyMDEwLTEyLTEwICBLZW5uZXRoIFJ1c3Nl
bGwgIDxrYnJAZ29vZ2xlLmNvbT4KIAogICAgICAgICBVbnJldmlld2VkLCBhbm90aGVyIGJ1aWxk
IGZpeC4gI2luY2x1ZGUgPHd0Zi9VbnVzZWRQYXJhbS5oPiBuZWVkZWQKSW5kZXg6IFdlYkNvcmUv
cGxhdGZvcm0vQ29udGV4dE1lbnVJdGVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL0NvbnRleHRNZW51SXRlbS5jcHAJKHJldmlzaW9uIDczODA1KQorKysgV2ViQ29yZS9wbGF0
Zm9ybS9Db250ZXh0TWVudUl0ZW0uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw3ICszOSw4IEBA
IENvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKENvbnRleHQKICAgICAsIG1fZW5hYmxl
ZCh0cnVlKQogICAgICwgbV9jaGVja2VkKGZhbHNlKQogewotICAgIHNldFN1Yk1lbnUoc3ViTWVu
dSk7CisgICAgaWYgKHN1Yk1lbnUpCisgICAgICAgIHNldFN1Yk1lbnUoc3ViTWVudSk7CiB9CiAK
IENvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKENvbnRleHRNZW51SXRlbVR5cGUgdHlw
ZSwgQ29udGV4dE1lbnVBY3Rpb24gYWN0aW9uLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBib29sIGVu
YWJsZWQsIGJvb2wgY2hlY2tlZCkK
</data>
<flag name="review"
          id="67191"
          type_id="1"
          status="+"
          setter="adachan"
    />
          </attachment>
      

    </bug>

</bugzilla>