<?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>50820</bug_id>
          
          <creation_ts>2010-12-10 08:50:57 -0800</creation_ts>
          <short_desc>[GTK] Port to GtkStyleContext</short_desc>
          <delta_ts>2011-01-10 14:05:22 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKitGTK</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>51755</dependson>
    
    <dependson>51764</dependson>
    
    <dependson>51812</dependson>
    
    <dependson>51815</dependson>
    
    <dependson>51828</dependson>
    
    <dependson>51830</dependson>
    
    <dependson>51870</dependson>
    
    <dependson>51874</dependson>
    
    <dependson>51923</dependson>
    
    <dependson>52051</dependson>
    
    <dependson>52054</dependson>
    
    <dependson>52170</dependson>
          <blocked>51454</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Carlos Garcia Campos">cgarcia</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>eric</cc>
    
    <cc>mrobinson</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>320186</commentid>
    <comment_count>0</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2010-12-10 08:50:57 -0800</bug_when>
    <thetext>GtkStyle is now deprecated in gtk+ 3, GtkStyleContext is the replacement that allows us painting the widgets without using real widgets.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>320190</commentid>
    <comment_count>1</comment_count>
      <attachid>76209</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2010-12-10 08:57:04 -0800</bug_when>
    <thetext>Created attachment 76209
Patch to port gtk3 code to GtkStyleContext</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>321836</commentid>
    <comment_count>2</comment_count>
      <attachid>76518</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2010-12-14 01:57:38 -0800</bug_when>
    <thetext>Created attachment 76518
Fork RenderThemeGtk and ScrollbarThemeGtk

I&apos;m splitting the patch as requested by Martin to make it easier for reviewers, please don&apos;t expect individual patches to work (not even build), they are only for review. The idea is to merge this as a single patch to make sure it builds and works and it won&apos;t break any future bisection. I&apos;m also commenting here the changes made in every file.

This first patch forksRenderThemeGtk and ScrollbarThemeGtk moving the code that is specific to gtk2 from RenderThemeGtk and ScrollbarThemeGtk to RenderThemeGtk2 and ScrollbarThemeGtk2 leaving the common code in the original files.

RenderThemeGtk: paintStockIcon has been splitted into getStockIcon, that has different implementations in gtk2 and gtk3, and paintStockIcon() which is common. Some methods that were static and private to RenderThemeGtk are now static methods of the class so that they can be used in RenderThemeGtk2 and RenderThemeGtk3. Some public methods returning or using gtk enums are using integers now, because we don&apos;t have forward declarations for enums. 

RenderThemeGtk2: m_themeParts and m_themePartsHaveRGBAColormap have been removed. Mozilla code uses a global static GtkThemeParts struct, hwoever, we are allocating a new structure everytime a new RenderThemeGtk instance is created, but that new struct is not used because moz_gtk_use_theme_parts() is only called the first time. So we can allocate the GtkThemeParts only once the first time, move the HaveRGBAColormap to the struct and add an accessor to gtkdrawing to get the global struct. If using heap allocation is a problem we can use a stack allocated struct in gtkdrawing. getIndicatorMetrics() was basicly a wrapper for moz_gtk_checkbox_get_metrics() and only used by WidgetRenderingContextGtk2 that already knows about mozilla code, so it has been removed and moz_gtk_checkbox_get_metrics() is used directly when needed. The rest of the code in this file is copy-pasted from RenderThemeGtk.

ScrollbarThemeGtk: It uses a private static HashSet to store the registered scrollbars, since both ScrollbarThemeGtk2 and ScrollbarThemeGtk3 need to use it, I&apos;ve added a private accessor ScrollbarThemeGtk::getScrollbars(). Boolean attributes (m_troughUnderSteppers, m_hasForwardButtonStartPart, m_hasBackButtonEndPart) are now gboolean instead of bool, because they are used directly (well, the mem dir actually) as arguments of gtk_style_context_get_style(), in ScrollbarThemeGtk3, that expects gboolean (an integer) and using bool causes mem overflows. 

WidgetRenderingContextGtk2: It uses the new accessor moz_gtk_get_theme_parts() to use the global GtkThemeParts struct and moz_gtk_checkbox_get_metrics() instead of RenderThemeGtk::getIndicatorMetrics().

gtk2drawing: moz_gtk_get_theme_parts() has been added.

gtkdrawing.h: non gtk2 stuff has been removed and haveRGBAColormap was moved from RenderThemeGtk to the GtkThemeParts struct.

ScrollbarThemeGtk2: All the code is copy-pasted from ScrollbarThemeGtk, just changed a bit to use the new accessor getScrollbars().

Removed files are not included in the patch: WidgetRenderingContextGtk3.cpp and gtk3drawing.c</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>321847</commentid>
    <comment_count>3</comment_count>
      <attachid>76519</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2010-12-14 02:29:36 -0800</bug_when>
    <thetext>Created attachment 76519
Port gtk2 code to GtkStyleContext

This second patch is the real port to GtkStyleContext. All gtk3 code is in RenderThemeGtk3 and ScrollbarThemeGtk3, mozilla code is not used anymore in gtk3 which also means we don&apos;t need fake widgets either \o/

RenderThemeGtk3: gtk3 provides GtkStyleContext that don&apos;t need a real widget to draw, they only need widget paths (GtkWidgetPath). Instead of creating a big struct to cache every style context I&apos;m using a global static HashMap that dynamically stores the style context for every widget type, using the GType (which is an integer) of the widget to render as the hash key. A private static method getStyleContext() allows getting the style context for any widget type. GtkStyleContext has a signal similar to the old style-set of GtkStyle to know when a new style has been set (because the theme has changed, for example), but it only works for style contexts associated to a widget. Now we connect to gtk-theme-name and gtk-color-scheme (properties of GtkSettings) notify signal to invalidate our style contexts and call platformColorsDidChange(). The rest of the file is the specific code needed to render the widgets using GtkStyleContext, it&apos;s based on gtk2 implementations and current gtk3 code.

ScrollbarThemeGtk3: The style context for the scrollbars is stored in the global HashMap in RenderThemeGtk3, so we use an accessor to get it in the constructor to cache it. When the theme changes, all the style contexts are invalidated in RenderThemeGtk3, and when a GtkStyleContext is invalidated the changed signal is emitted, so here we only need to connect to the changed signal for the scrollbar context to react to theme changes. The rest of the file is the specific code needed to render the scrollbars using GtkStyleContext.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>321918</commentid>
    <comment_count>4</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2010-12-14 05:35:51 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; Created an attachment (id=76518) [details]
&gt; RenderThemeGtk2: m_themeParts and m_themePartsHaveRGBAColormap have been removed. Mozilla code uses a global static GtkThemeParts struct, hwoever, we are allocating a new structure everytime a new RenderThemeGtk instance is created, but that new struct is not used because moz_gtk_use_theme_parts() is only called the first time. So we can allocate the GtkThemeParts only once the first time, move the HaveRGBAColormap to the struct and add an accessor to gtkdrawing to get the global struct. If using heap allocation is a problem we can use a stack allocated struct in gtkdrawing. 

I&apos;ve just noticed that I forgot to free the global GtkThemeParts struct in moz_gtk_shutdown(), so I can add the free there, or just use a stack allocated struct.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>323086</commentid>
    <comment_count>5</comment_count>
      <attachid>76746</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2010-12-16 02:35:25 -0800</bug_when>
    <thetext>Created attachment 76746
Updated patch rebased to current git master

Patch rebased to current git master and two more changes:

 - Allocate theme parts struct in the stackto fix the memory leak I mentioned in previous comment
 - Implement juntion sides for stepper buttons in gtk3 scrollbars code</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>328065</commentid>
    <comment_count>6</comment_count>
      <attachid>76746</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2010-12-30 16:29:52 -0800</bug_when>
    <thetext>Comment on attachment 76746
Updated patch rebased to current git master

Removing review flag, because we&apos;re going to land this in pieces.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76209</attachid>
            <date>2010-12-10 08:57:04 -0800</date>
            <delta_ts>2010-12-16 02:35:25 -0800</delta_ts>
            <desc>Patch to port gtk3 code to GtkStyleContext</desc>
            <filename>gtkstylecontext.diff</filename>
            <type>text/plain</type>
            <size>172893</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCAxODc1OThhLi5jZWQxZDZh
IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTIgQEAK
KzIwMTAtMTItMTAgIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dhcmNpYUBpZ2FsaWEuY29tPgor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtHVEtdIFBv
cnQgdG8gR3RrU3R5bGVDb250ZXh0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD01MDgyMAorCisgICAgICAgICogY29uZmlndXJlLmFjOiBCdW1wIEdUSysz
IHJlcXVpcmVtZW50cyB0byAyLjkxLjYKKwogMjAxMC0xMi0wNiAgUGhpbGlwcGUgTm9ybWFuZCAg
PHBub3JtYW5kQGlnYWxpYS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTWFydGluIFJvYmlu
c29uLgpkaWZmIC0tZ2l0IGEvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nIGIvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCmluZGV4IDhhNDgzZDMuLmI5OTg2NmYgMTAwNjQ0Ci0tLSBhL0phdmFTY3Jp
cHRDb3JlL0NoYW5nZUxvZworKysgYi9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyAr
MSwxMiBAQAorMjAxMC0xMi0xMCAgQ2FybG9zIEdhcmNpYSBDYW1wb3MgIDxjZ2FyY2lhQGlnYWxp
YS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
W0dUS10gUG9ydCB0byBHdGtTdHlsZUNvbnRleHQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTUwODIwCisKKyAgICAgICAgKiB3dGYvZ29iamVjdC9HVHlw
ZWRlZnMuaDogQWRkIEd0a1N0eWxlQ29udGV4dCBmb3J3YXJkIGRlY2xhcmF0aW9uCisKIDIwMTAt
MTItMDkgIE1pY2hhZWwgU2Fib2ZmICA8bXNhYm9mZkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgR2F2aW4gQmFycmFjbG91Z2guCmRpZmYgLS1naXQgYS9XZWJDb3JlL0NoYW5nZUxv
ZyBiL1dlYkNvcmUvQ2hhbmdlTG9nCmluZGV4IDE5NDg5YTguLjNlMzQwYzUgMTAwNjQ0Ci0tLSBh
L1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTM1
IEBACisyMDEwLTEyLTEwICBDYXJsb3MgR2FyY2lhIENhbXBvcyAgPGNnYXJjaWFAaWdhbGlhLmNv
bT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbR1RL
XSBQb3J0IHRvIEd0a1N0eWxlQ29udGV4dAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NTA4MjAKKworICAgICAgICBGb3JrIFJlbmRlclRoZW1lR3RrIGFu
ZCBTY3JvbGxiYXJUaGVtZUd0ayBhbmQgcG9ydCBndGszIGNvZGUgdG8KKyAgICAgICAgR3RrU3R5
bGVDb250ZXh0LgorCisgICAgICAgICogR05VbWFrZWZpbGUuYW06CisgICAgICAgICogcGxhdGZv
cm0vZ3RrL1JlbmRlclRoZW1lR3RrLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OnBhaW50U3RvY2tJ
Y29uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpndGtUZXh0RGlyZWN0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6Omd0a0ljb25TdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJUaGVtZUd0azo6Y2VudGVyUmVjdFZlcnRpY2FsbHlJblBhcmVudElucHV0RWxlbWVudCk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cGFpbnRTZWFyY2hGaWVsZFJlc3Vs
dHNEZWNvcmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwYWludFNl
YXJjaEZpZWxkQ2FuY2VsQnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3Rr
OjpwYWludE1lZGlhQnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjph
ZGp1c3RQcm9ncmVzc0JhclN0eWxlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ndGsvUmVuZGVyVGhl
bWVHdGsuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsyLmNwcDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6aW5pdE1lZGlhQ29sb3JzKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpSZW5kZXJUaGVtZUd0ayk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6flJlbmRlclRoZW1lR3RrKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpnZXRTdG9ja0ljb24pOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGhlbWVHdGs6OnBhaW50UmVuZGVyT2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6
OnNldFRvZ2dsZVNpemUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnNldENo
ZWNrYm94U2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cGFpbnRDaGVj
a2JveCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6c2V0UmFkaW9TaXplKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwYWludFJhZGlvKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwYWludEJ1dHRvbik6CisgICAgICAgIChXZWJDb3Jl
OjpnZXRDb21ib0JveFBhZGRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6
OnBvcHVwSW50ZXJuYWxQYWRkaW5nTGVmdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdodCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdUb3ApOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nQm90dG9tKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwYWludE1lbnVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlclRoZW1lR3RrOjpzZXRUZXh0SW5wdXRCb3JkZXJzKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlclRoZW1lR3RrOjpwYWludFRleHRGaWVsZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZUd0azo6cGFpbnRTbGlkZXJUcmFjayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUd0azo6cGFpbnRTbGlkZXJUaHVtYik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZUd0azo6YWRqdXN0U2xpZGVyVGh1bWJTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lR3RrOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcik6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkJhY2tn
cm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1B
Y3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGhlbWVHdGs6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNr
Z3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OmluYWN0aXZl
TGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZUd0azo6YWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcik6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6aW5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9y
ZWdyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpzeXN0ZW1D
b2xvcik6CisgICAgICAgIChXZWJDb3JlOjpndGtTdHlsZVNldENhbGxiYWNrKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpndGtDb250YWluZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGhlbWVHdGs6Omd0a0J1dHRvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUd0azo6Z3RrRW50cnkpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6Omd0
a1RyZWVWaWV3KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjphbmltYXRpb25S
ZXBlYXRJbnRlcnZhbEZvclByb2dyZXNzQmFyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lR3RrOjphbmltYXRpb25EdXJhdGlvbkZvclByb2dyZXNzQmFyKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lR3RrOjpwYWludFByb2dyZXNzQmFyKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ndGsvUmVuZGVyVGhlbWVHdGszLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpzdHls
ZUNvbnRleHRNYXApOgorICAgICAgICAoV2ViQ29yZTo6Z3RrU3R5bGVDaGFuZ2VkQ2FsbGJhY2sp
OgorICAgICAgICAoV2ViQ29yZTo6Z2V0U3R5bGVDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlclRoZW1lR3RrOjpSZW5kZXJUaGVtZUd0ayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZUd0azo6flJlbmRlclRoZW1lR3RrKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lR3RrOjpndGtTY3JvbGxiYXJTdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZUd0azo6Z2V0U3RvY2tJY29uKToKKyAgICAgICAgKFdlYkNvcmU6OnNldFRvZ2dsZVNpemUpOgor
ICAgICAgICAoV2ViQ29yZTo6cGFpbnRUb2dnbGUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
VGhlbWVHdGs6OnNldENoZWNrYm94U2l6ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVt
ZUd0azo6cGFpbnRDaGVja2JveCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6
c2V0UmFkaW9TaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwYWludFJh
ZGlvKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwYWludEJ1dHRvbik6Cisg
ICAgICAgIChXZWJDb3JlOjpnZXRDb21ib0JveE1ldHJpY3MpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nTGVmdCk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdodCk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdUb3ApOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nQm90dG9t
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwYWludE1lbnVMaXN0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpzZXRUZXh0SW5wdXRCb3JkZXJzKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwYWludFRleHRGaWVsZCk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cGFpbnRTbGlkZXJUcmFjayk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cGFpbnRTbGlkZXJUaHVtYik6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJUaGVtZUd0azo6YWRqdXN0U2xpZGVyVGh1bWJTaXplKToKKyAgICAgICAgKFdl
YkNvcmU6OmdldFN0eWxlQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6
OmluaXRNZWRpYUNvbG9ycyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cGxh
dGZvcm1BY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3Ip
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtQWN0aXZlU2VsZWN0
aW9uRm9yZWdyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpw
bGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lR3RrOjphY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFja2dyb3VuZENvbG9y
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjppbmFjdGl2ZUxpc3RCb3hTZWxl
Y3Rpb25CYWNrZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6
OmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGhlbWVHdGs6OmluYWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xv
cik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6c3lzdGVtQ29sb3IpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OmFuaW1hdGlvblJlcGVhdEludGVydmFsRm9y
UHJvZ3Jlc3NCYXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OmFuaW1hdGlv
bkR1cmF0aW9uRm9yUHJvZ3Jlc3NCYXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVH
dGs6OnBhaW50UHJvZ3Jlc3NCYXIpOgorICAgICAgICAqIHBsYXRmb3JtL2d0ay9TY3JvbGxiYXJU
aGVtZUd0ay5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTY3JvbGxiYXJUaGVtZUd0azo6flNjcm9s
bGJhclRoZW1lR3RrKToKKyAgICAgICAgKFdlYkNvcmU6OlNjcm9sbGJhclRoZW1lR3RrOjpnZXRT
Y3JvbGxiYXJzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGsuaDoK
KyAgICAgICAgKiBwbGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGsyLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpTY3JvbGxiYXJUaGVtZUd0azo6U2Nyb2xsYmFyVGhlbWVHdGspOgor
ICAgICAgICAoV2ViQ29yZTo6U2Nyb2xsYmFyVGhlbWVHdGs6OnVwZGF0ZVRoZW1lUHJvcGVydGll
cyk6CisgICAgICAgIChXZWJDb3JlOjpndGtTdHlsZVNldENhbGxiYWNrKToKKyAgICAgICAgKFdl
YkNvcmU6OlNjcm9sbGJhclRoZW1lR3RrOjpwYWludFRyYWNrQmFja2dyb3VuZCk6CisgICAgICAg
IChXZWJDb3JlOjpTY3JvbGxiYXJUaGVtZUd0azo6cGFpbnRTY3JvbGxiYXJCYWNrZ3JvdW5kKToK
KyAgICAgICAgKFdlYkNvcmU6OlNjcm9sbGJhclRoZW1lR3RrOjpwYWludFRodW1iKToKKyAgICAg
ICAgKFdlYkNvcmU6OlNjcm9sbGJhclRoZW1lR3RrOjpwYWludEJ1dHRvbik6CisgICAgICAgICog
cGxhdGZvcm0vZ3RrL1Njcm9sbGJhclRoZW1lR3RrMy5jcHA6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZTo6Z3RrU3R5bGVDaGFuZ2VkQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6U2Nyb2xs
YmFyVGhlbWVHdGs6OlNjcm9sbGJhclRoZW1lR3RrKToKKyAgICAgICAgKFdlYkNvcmU6OlNjcm9s
bGJhclRoZW1lR3RrOjp1cGRhdGVUaGVtZVByb3BlcnRpZXMpOgorICAgICAgICAoV2ViQ29yZTo6
U2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50VHJhY2tCYWNrZ3JvdW5kKToKKyAgICAgICAgKFdlYkNv
cmU6OlNjcm9sbGJhclRoZW1lR3RrOjpwYWludFNjcm9sbGJhckJhY2tncm91bmQpOgorICAgICAg
ICAoV2ViQ29yZTo6U2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50VGh1bWIpOgorICAgICAgICAoV2Vi
Q29yZTo6U2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50QnV0dG9uKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ndGsvV2lkZ2V0UmVuZGVyaW5nQ29udGV4dC5oOgorICAgICAgICAqIHBsYXRmb3JtL2d0ay9X
aWRnZXRSZW5kZXJpbmdDb250ZXh0R3RrMi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpnZXRFeHRy
YVNwYWNlRm9yV2lkZ2V0KToKKyAgICAgICAgKFdlYkNvcmU6OldpZGdldFJlbmRlcmluZ0NvbnRl
eHQ6OldpZGdldFJlbmRlcmluZ0NvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6V2lkZ2V0UmVu
ZGVyaW5nQ29udGV4dDo6fldpZGdldFJlbmRlcmluZ0NvbnRleHQpOgorICAgICAgICAqIHBsYXRm
b3JtL2d0ay9XaWRnZXRSZW5kZXJpbmdDb250ZXh0R3RrMy5jcHA6IFJlbW92ZWQuCisgICAgICAg
ICogcGxhdGZvcm0vZ3RrL2d0azJkcmF3aW5nLmM6CisgICAgICAgIChtb3pfZ3RrX2dldF90aGVt
ZV9wYXJ0cyk6CisgICAgICAgICogcGxhdGZvcm0vZ3RrL2d0azNkcmF3aW5nLmM6IFJlbW92ZWQu
CisgICAgICAgICogcGxhdGZvcm0vZ3RrL2d0a2RyYXdpbmcuaDoKKwogMjAxMC0xMi0wOSAgU2hl
cmlmZiBCb3QgIDx3ZWJraXQucmV2aWV3LmJvdEBnbWFpbC5jb20+CiAKICAgICAgICAgVW5yZXZp
ZXdlZCwgcm9sbGluZyBvdXQgcjczNjg0LgpkaWZmIC0tZ2l0IGEvSmF2YVNjcmlwdENvcmUvd3Rm
L2dvYmplY3QvR1R5cGVkZWZzLmggYi9KYXZhU2NyaXB0Q29yZS93dGYvZ29iamVjdC9HVHlwZWRl
ZnMuaAppbmRleCAwYjlhOWVhLi5mOWY4ZjJmIDEwMDY0NAotLS0gYS9KYXZhU2NyaXB0Q29yZS93
dGYvZ29iamVjdC9HVHlwZWRlZnMuaAorKysgYi9KYXZhU2NyaXB0Q29yZS93dGYvZ29iamVjdC9H
VHlwZWRlZnMuaApAQCAtODksNiArODksNyBAQCB0eXBlZGVmIHN0cnVjdCBfR2RrRHJhd2FibGUg
R2RrV2luZG93OwogdHlwZWRlZiBzdHJ1Y3QgX0dka1dpbmRvdyBHZGtXaW5kb3c7CiB0eXBlZGVm
IHN0cnVjdCBfY2Fpcm9fcmVjdGFuZ2xlX2ludCBjYWlyb19yZWN0YW5nbGVfaW50X3Q7CiB0eXBl
ZGVmIGNhaXJvX3JlY3RhbmdsZV9pbnRfdCBHZGtSZWN0YW5nbGU7Cit0eXBlZGVmIHN0cnVjdCBf
R3RrU3R5bGVDb250ZXh0IEd0a1N0eWxlQ29udGV4dDsKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAt
LWdpdCBhL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0gYi9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtCmlu
ZGV4IDc5NzU0YTUuLmJkZDdhNzUgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0K
KysrIGIvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQpAQCAtMzY4MCw3ICszNjgwLDYgQEAgd2ViY29y
ZWd0a19zb3VyY2VzICs9IFwKIAlXZWJDb3JlL3BsYXRmb3JtL2d0ay9HUmVmUHRyR3RrLmNwcCBc
CiAJV2ViQ29yZS9wbGF0Zm9ybS9ndGsvR1JlZlB0ckd0ay5oIFwKIAlXZWJDb3JlL3BsYXRmb3Jt
L2d0ay9ndGsyZHJhd2luZy5jIFwKLQlXZWJDb3JlL3BsYXRmb3JtL2d0ay9ndGszZHJhd2luZy5j
IFwKIAlXZWJDb3JlL3BsYXRmb3JtL2d0ay9ndGtkcmF3aW5nLmggXAogCVdlYkNvcmUvcGxhdGZv
cm0vZ3RrL0d0a1BsdWdpbldpZGdldC5jcHAgXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3RrL0d0a1Bs
dWdpbldpZGdldC5oIFwKQEAgLTM3MDIsOCArMzcwMSwxMiBAQCB3ZWJjb3JlZ3RrX3NvdXJjZXMg
Kz0gXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3RrL1BvcHVwTWVudUd0ay5jcHAgXAogCVdlYkNvcmUv
cGxhdGZvcm0vZ3RrL1BvcHVwTWVudUd0ay5oIFwKIAlXZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5k
ZXJUaGVtZUd0ay5jcHAgXAorCVdlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrMi5j
cHAgXAorCVdlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrMy5jcHAgXAogCVdlYkNv
cmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrLmggXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3Rr
L1Njcm9sbGJhclRoZW1lR3RrLmNwcCBcCisJV2ViQ29yZS9wbGF0Zm9ybS9ndGsvU2Nyb2xsYmFy
VGhlbWVHdGsyLmNwcCBcCisJV2ViQ29yZS9wbGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGsz
LmNwcCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGsuaCBcCiAJV2Vi
Q29yZS9wbGF0Zm9ybS9ndGsvU2Nyb2xsVmlld0d0ay5jcHAgXAogCVdlYkNvcmUvcGxhdGZvcm0v
Z3RrL1NlYXJjaFBvcHVwTWVudUd0ay5jcHAgXApAQCAtMzcxNSw3ICszNzE4LDYgQEAgd2ViY29y
ZWd0a19zb3VyY2VzICs9IFwKIAlXZWJDb3JlL3BsYXRmb3JtL2d0ay9XaGVlbEV2ZW50R3RrLmNw
cCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9ndGsvV2lkZ2V0R3RrLmNwcCBcCiAJV2ViQ29yZS9wbGF0
Zm9ybS9ndGsvV2lkZ2V0UmVuZGVyaW5nQ29udGV4dEd0azIuY3BwIFwKLQlXZWJDb3JlL3BsYXRm
b3JtL2d0ay9XaWRnZXRSZW5kZXJpbmdDb250ZXh0R3RrMy5jcHAgXAogCVdlYkNvcmUvcGxhdGZv
cm0vZ3RrL1dpZGdldFJlbmRlcmluZ0NvbnRleHQuaCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9pbWFn
ZS1kZWNvZGVycy9ibXAvQk1QSW1hZ2VEZWNvZGVyLmNwcCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9p
bWFnZS1kZWNvZGVycy9ibXAvQk1QSW1hZ2VEZWNvZGVyLmggXApkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsv
UmVuZGVyVGhlbWVHdGsuY3BwCmluZGV4IDRkYjg1N2QuLjMzYmQ4M2UgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrLmNwcAorKysgYi9XZWJDb3JlL3BsYXRm
b3JtL2d0ay9SZW5kZXJUaGVtZUd0ay5jcHAKQEAgLTQxLDggKzQxLDYgQEAKICNpbmNsdWRlICJT
Y3JvbGxiYXIuaCIKICNpbmNsdWRlICJUaW1lUmFuZ2VzLmgiCiAjaW5jbHVkZSAiVXNlckFnZW50
U3R5bGVTaGVldHMuaCIKLSNpbmNsdWRlICJXaWRnZXRSZW5kZXJpbmdDb250ZXh0LmgiCi0jaW5j
bHVkZSAiZ3RrZHJhd2luZy5oIgogI2luY2x1ZGUgPGdkay9nZGsuaD4KICNpbmNsdWRlIDxndGsv
Z3RrLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgpAQCAtNTUsMTkgKzUzLDYgQEAg
bmFtZXNwYWNlIFdlYkNvcmUgewogCiB1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwogCi1zdGF0
aWMgdm9pZCBwYWludFN0b2NrSWNvbihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IElu
dFBvaW50JiBpY29uUG9pbnQsIEd0a1N0eWxlKiBzdHlsZSwgY29uc3QgY2hhciogaWNvbk5hbWUs
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBHdGtUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbiwg
R3RrU3RhdGVUeXBlIHN0YXRlLCBHdGtJY29uU2l6ZSBpY29uU2l6ZSkKLXsKLSAgICBHdGtJY29u
U2V0KiBpY29uU2V0ID0gZ3RrX3N0eWxlX2xvb2t1cF9pY29uX3NldChzdHlsZSwgaWNvbk5hbWUp
OwotICAgIFBsYXRmb3JtUmVmUHRyPEdka1BpeGJ1Zj4gaWNvbiA9IGFkb3B0UGxhdGZvcm1SZWYo
Z3RrX2ljb25fc2V0X3JlbmRlcl9pY29uKGljb25TZXQsIHN0eWxlLCBkaXJlY3Rpb24sIHN0YXRl
LCBpY29uU2l6ZSwgMCwgMCkpOwotCi0gICAgY2Fpcm9fdCogY3IgPSBjb250ZXh0LT5wbGF0Zm9y
bUNvbnRleHQoKTsKLSAgICBjYWlyb19zYXZlKGNyKTsKLSAgICBnZGtfY2Fpcm9fc2V0X3NvdXJj
ZV9waXhidWYoY3IsIGljb24uZ2V0KCksIGljb25Qb2ludC54KCksIGljb25Qb2ludC55KCkpOwot
ICAgIGNhaXJvX3BhaW50KGNyKTsKLSAgICBjYWlyb19yZXN0b3JlKGNyKTsKLX0KLQogI2lmIEVO
QUJMRShWSURFTykKIHN0YXRpYyBIVE1MTWVkaWFFbGVtZW50KiBnZXRNZWRpYUVsZW1lbnRGcm9t
UmVuZGVyT2JqZWN0KFJlbmRlck9iamVjdCogbykKIHsKQEAgLTg3LDE0ICs3Miw2IEBAIHN0YXRp
YyBHdGtJY29uU2l6ZSBnZXRNZWRpYUJ1dHRvbkljb25TaXplKGludCBtZWRpYUljb25TaXplKQog
ICAgIHJldHVybiBpY29uU2l6ZTsKIH0KIAotdm9pZCBSZW5kZXJUaGVtZUd0azo6aW5pdE1lZGlh
Q29sb3JzKCkKLXsKLSAgICBHdGtTdHlsZSogc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZShH
VEtfV0lER0VUKGd0a0NvbnRhaW5lcigpKSk7Ci0gICAgbV9wYW5lbENvbG9yID0gc3R5bGUtPmJn
W0dUS19TVEFURV9OT1JNQUxdOwotICAgIG1fc2xpZGVyQ29sb3IgPSBzdHlsZS0+YmdbR1RLX1NU
QVRFX0FDVElWRV07Ci0gICAgbV9zbGlkZXJUaHVtYkNvbG9yID0gc3R5bGUtPmJnW0dUS19TVEFU
RV9TRUxFQ1RFRF07Ci19Ci0KIHZvaWQgUmVuZGVyVGhlbWVHdGs6OmluaXRNZWRpYUJ1dHRvbnMo
KQogewogICAgIHN0YXRpYyBib29sIGljb25zSW5pdGlhbGl6ZWQgPSBmYWxzZTsKQEAgLTEzMyw2
OSArMTEwLDEzIEBAIFBhc3NSZWZQdHI8UmVuZGVyVGhlbWU+IFJlbmRlclRoZW1lOjp0aGVtZUZv
clBhZ2UoUGFnZSogcGFnZSkKICAgICByZXR1cm4gcnQ7CiB9CiAKLXN0YXRpYyBpbnQgbW96R3Rr
UmVmQ291bnQgPSAwOwotCi1SZW5kZXJUaGVtZUd0azo6UmVuZGVyVGhlbWVHdGsoKQotICAgIDog
bV9ndGtXaW5kb3coMCkKLSAgICAsIG1fZ3RrQ29udGFpbmVyKDApCi0gICAgLCBtX2d0a0J1dHRv
bigwKQotICAgICwgbV9ndGtFbnRyeSgwKQotICAgICwgbV9ndGtUcmVlVmlldygwKQotICAgICwg
bV9wYW5lbENvbG9yKENvbG9yOjp3aGl0ZSkKLSAgICAsIG1fc2xpZGVyQ29sb3IoQ29sb3I6Ondo
aXRlKQotICAgICwgbV9zbGlkZXJUaHVtYkNvbG9yKENvbG9yOjp3aGl0ZSkKLSAgICAsIG1fbWVk
aWFJY29uU2l6ZSgxNikKLSAgICAsIG1fbWVkaWFTbGlkZXJIZWlnaHQoMTQpCi0gICAgLCBtX21l
ZGlhU2xpZGVyVGh1bWJXaWR0aCgxMikKLSAgICAsIG1fbWVkaWFTbGlkZXJUaHVtYkhlaWdodCgx
MikKLSNpZmRlZiBHVEtfQVBJX1ZFUlNJT05fMgotICAgICwgbV90aGVtZVBhcnRzSGF2ZVJHQkFD
b2xvcm1hcCh0cnVlKQotI2VuZGlmCi17Ci0KLSAgICBtZW1zZXQoJm1fdGhlbWVQYXJ0cywgMCwg
c2l6ZW9mKEd0a1RoZW1lUGFydHMpKTsKLSNpZmRlZiBHVEtfQVBJX1ZFUlNJT05fMgotICAgIEdk
a0NvbG9ybWFwKiBjb2xvcm1hcCA9IGdka19zY3JlZW5fZ2V0X3JnYmFfY29sb3JtYXAoZ2RrX3Nj
cmVlbl9nZXRfZGVmYXVsdCgpKTsKLSAgICBpZiAoIWNvbG9ybWFwKSB7Ci0gICAgICAgIG1fdGhl
bWVQYXJ0c0hhdmVSR0JBQ29sb3JtYXAgPSBmYWxzZTsKLSAgICAgICAgY29sb3JtYXAgPSBnZGtf
c2NyZWVuX2dldF9kZWZhdWx0X2NvbG9ybWFwKGdka19zY3JlZW5fZ2V0X2RlZmF1bHQoKSk7Ci0g
ICAgfQotICAgIG1fdGhlbWVQYXJ0cy5jb2xvcm1hcCA9IGNvbG9ybWFwOwotI2VuZGlmCi0KLSAg
ICAvLyBJbml0aWFsaXplIHRoZSBNb3ppbGxhIHRoZW1lIGRyYXdpbmcgY29kZS4KLSAgICBpZiAo
IW1vekd0a1JlZkNvdW50KSB7Ci0gICAgICAgIG1vel9ndGtfaW5pdCgpOwotICAgICAgICBtb3pf
Z3RrX3VzZV90aGVtZV9wYXJ0cygmbV90aGVtZVBhcnRzKTsKLSAgICB9Ci0gICAgKyttb3pHdGtS
ZWZDb3VudDsKLQotI2lmIEVOQUJMRShWSURFTykKLSAgICBpbml0TWVkaWFDb2xvcnMoKTsKLSAg
ICBpbml0TWVkaWFCdXR0b25zKCk7Ci0jZW5kaWYKLX0KLQotUmVuZGVyVGhlbWVHdGs6On5SZW5k
ZXJUaGVtZUd0aygpCitzdGF0aWMgdm9pZCBwYWludFN0b2NrSWNvbihHcmFwaGljc0NvbnRleHQq
IGNvbnRleHQsIGNvbnN0IEludFBvaW50JiBpY29uUG9pbnQsIGNvbnN0IEdka1BpeGJ1ZiogaWNv
bikKIHsKLSAgICAtLW1vekd0a1JlZkNvdW50OwotCi0gICAgaWYgKCFtb3pHdGtSZWZDb3VudCkK
LSAgICAgICAgbW96X2d0a19zaHV0ZG93bigpOwotCi0gICAgZ3RrX3dpZGdldF9kZXN0cm95KG1f
Z3RrV2luZG93KTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZUd0azo6Z2V0SW5kaWNhdG9yTWV0cmlj
cyhDb250cm9sUGFydCBwYXJ0LCBpbnQmIGluZGljYXRvclNpemUsIGludCYgaW5kaWNhdG9yU3Bh
Y2luZykgY29uc3QKLXsKLSAgICBBU1NFUlQocGFydCA9PSBDaGVja2JveFBhcnQgfHwgcGFydCA9
PSBSYWRpb1BhcnQpOwotICAgIGlmIChwYXJ0ID09IENoZWNrYm94UGFydCkgewotICAgICAgICBt
b3pfZ3RrX2NoZWNrYm94X2dldF9tZXRyaWNzKCZpbmRpY2F0b3JTaXplLCAmaW5kaWNhdG9yU3Bh
Y2luZyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBSYWRpb1BhcnQKLSAgICBt
b3pfZ3RrX3JhZGlvX2dldF9tZXRyaWNzKCZpbmRpY2F0b3JTaXplLCAmaW5kaWNhdG9yU3BhY2lu
Zyk7CisgICAgY2Fpcm9fdCogY3IgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKyAgICBj
YWlyb19zYXZlKGNyKTsKKyAgICBnZGtfY2Fpcm9fc2V0X3NvdXJjZV9waXhidWYoY3IsIGljb24s
IGljb25Qb2ludC54KCksIGljb25Qb2ludC55KCkpOworICAgIGNhaXJvX3BhaW50KGNyKTsKKyAg
ICBjYWlyb19yZXN0b3JlKGNyKTsKIH0KIAogc3RhdGljIGJvb2wgc3VwcG9ydHNGb2N1cyhDb250
cm9sUGFydCBhcHBlYXJhbmNlKQpAQCAtMjQyLDcgKzE2Myw3IEBAIGludCBSZW5kZXJUaGVtZUd0
azo6YmFzZWxpbmVQb3NpdGlvbihjb25zdCBSZW5kZXJPYmplY3QqIG8pIGNvbnN0CiAgICAgcmV0
dXJuIFJlbmRlclRoZW1lOjpiYXNlbGluZVBvc2l0aW9uKG8pOwogfQogCi1zdGF0aWMgR3RrVGV4
dERpcmVjdGlvbiBndGtUZXh0RGlyZWN0aW9uKFRleHREaXJlY3Rpb24gZGlyZWN0aW9uKQorZ2lu
dCBSZW5kZXJUaGVtZUd0azo6Z3RrVGV4dERpcmVjdGlvbihUZXh0RGlyZWN0aW9uIGRpcmVjdGlv
bikKIHsKICAgICBzd2l0Y2ggKGRpcmVjdGlvbikgewogICAgIGNhc2UgUlRMOgpAQCAtMjU0LDky
ICsxNzUsMTggQEAgc3RhdGljIEd0a1RleHREaXJlY3Rpb24gZ3RrVGV4dERpcmVjdGlvbihUZXh0
RGlyZWN0aW9uIGRpcmVjdGlvbikKICAgICB9CiB9CiAKLUd0a1N0YXRlVHlwZSBSZW5kZXJUaGVt
ZUd0azo6Z3RrSWNvblN0YXRlKFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0KQorc3RhdGljIGdp
bnQgZ3RrSWNvblN0YXRlKFJlbmRlclRoZW1lR3RrKiB0aGVtZSwgUmVuZGVyT2JqZWN0KiByZW5k
ZXJPYmplY3QpCiB7Ci0gICAgaWYgKCFpc0VuYWJsZWQocmVuZGVyT2JqZWN0KSkKKyAgICBpZiAo
IXRoZW1lLT5pc0VuYWJsZWQocmVuZGVyT2JqZWN0KSkKICAgICAgICAgcmV0dXJuIEdUS19TVEFU
RV9JTlNFTlNJVElWRTsKLSAgICBpZiAoaXNQcmVzc2VkKHJlbmRlck9iamVjdCkpCisgICAgaWYg
KHRoZW1lLT5pc1ByZXNzZWQocmVuZGVyT2JqZWN0KSkKICAgICAgICAgcmV0dXJuIEdUS19TVEFU
RV9BQ1RJVkU7Ci0gICAgaWYgKGlzSG92ZXJlZChyZW5kZXJPYmplY3QpKQorICAgIGlmICh0aGVt
ZS0+aXNIb3ZlcmVkKHJlbmRlck9iamVjdCkpCiAgICAgICAgIHJldHVybiBHVEtfU1RBVEVfUFJF
TElHSFQ7CiAKICAgICByZXR1cm4gR1RLX1NUQVRFX05PUk1BTDsKIH0KIAotYm9vbCBSZW5kZXJU
aGVtZUd0azo6cGFpbnRSZW5kZXJPYmplY3QoR3RrVGhlbWVXaWRnZXRUeXBlIHR5cGUsIFJlbmRl
ck9iamVjdCogcmVuZGVyT2JqZWN0LCBHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IElu
dFJlY3QmIHJlY3QsIGludCBmbGFncykKLXsKLSAgICAvLyBQYWludGluZyBpcyBkaXNhYmxlZCBz
byBqdXN0IGNsYWltIHRvIGhhdmUgc3VjY2VlZGVkCi0gICAgaWYgKGNvbnRleHQtPnBhaW50aW5n
RGlzYWJsZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgR3RrV2lkZ2V0U3RhdGUg
d2lkZ2V0U3RhdGU7Ci0gICAgd2lkZ2V0U3RhdGUuYWN0aXZlID0gaXNQcmVzc2VkKHJlbmRlck9i
amVjdCk7Ci0gICAgd2lkZ2V0U3RhdGUuZm9jdXNlZCA9IGlzRm9jdXNlZChyZW5kZXJPYmplY3Qp
OwotCi0gICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE4MzY0
Ci0gICAgLy8gVGhlIE1vemlsbGEgdGhlbWUgZHJhd2luZyBjb2RlLCBvbmx5IHBhaW50cyBhIGJ1
dHRvbiBhcyBwcmVzc2VkIHdoZW4gaXQncyBwcmVzc2VkIAotICAgIC8vIHdoaWxlIGhvdmVyZWQu
IFVudGlsIHdlIG1vdmUgYXdheSBmcm9tIHRoZSBNb3ppbGEgY29kZSwgd29yay1hcm91bmQgdGhl
IGlzc3VlIGJ5Ci0gICAgLy8gZm9yY2luZyBhIHByZXNzZWQgYnV0dG9uIGludG8gdGhlIGhvdmVy
ZWQgc3RhdGUuIFRoaXMgZW5zdXJlcyB0aGF0IGJ1dHRvbnMgYWN0aXZhdGVkCi0gICAgLy8gdmlh
IHRoZSBrZXlib2FyZCBoYXZlIHRoZSBwcm9wZXIgcmVuZGVyaW5nLgotICAgIHdpZGdldFN0YXRl
LmluSG92ZXIgPSBpc0hvdmVyZWQocmVuZGVyT2JqZWN0KSB8fCAodHlwZSA9PSBNT1pfR1RLX0JV
VFRPTiAmJiBpc1ByZXNzZWQocmVuZGVyT2JqZWN0KSk7Ci0KLSAgICAvLyBGSVhNRTogRGlzYWJs
ZWQgZG9lcyBub3QgYWx3YXlzIGdpdmUgdGhlIGNvcnJlY3QgYXBwZWFyYW5jZSBmb3IgUmVhZE9u
bHkKLSAgICB3aWRnZXRTdGF0ZS5kaXNhYmxlZCA9ICFpc0VuYWJsZWQocmVuZGVyT2JqZWN0KSB8
fCBpc1JlYWRPbmx5Q29udHJvbChyZW5kZXJPYmplY3QpOwotICAgIHdpZGdldFN0YXRlLmlzRGVm
YXVsdCA9IGZhbHNlOwotICAgIHdpZGdldFN0YXRlLmNhbkRlZmF1bHQgPSBmYWxzZTsKLQotICAg
IC8vIEZJWE1FOiBUaGUgZGVwcmVzc2VkIHZhbHVlIHNob3VsZCBwcm9iYWJseSBhcHBseSBmb3Ig
b3RoZXIgdGhlbWUgcGFydHMgdG9vLgotICAgIC8vIEl0IG11c3QgYmUgdXNlZCBmb3IgcmFuZ2Ug
dGh1bWJzLCBiZWNhdXNlIG90aGVyd2lzZSB3aGVuIHRoZSB0aHVtYiBpcyBwcmVzc2VkLAotICAg
IC8vIHRoZSByZW5kZXJpbmcgaXMgaW5jb3JyZWN0LgotICAgIGlmICh0eXBlID09IE1PWl9HVEtf
U0NBTEVfVEhVTUJfSE9SSVpPTlRBTCB8fCB0eXBlID09IE1PWl9HVEtfU0NBTEVfVEhVTUJfVkVS
VElDQUwpCi0gICAgICAgIHdpZGdldFN0YXRlLmRlcHJlc3NlZCA9IGlzUHJlc3NlZChyZW5kZXJP
YmplY3QpOwotICAgIGVsc2UKLSAgICAgICAgd2lkZ2V0U3RhdGUuZGVwcmVzc2VkID0gZmFsc2U7
Ci0KLSAgICBXaWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENvbnRleHQoY29udGV4dCwgcmVj
dCk7Ci0gICAgcmV0dXJuICF3aWRnZXRDb250ZXh0LnBhaW50TW96aWxsYVdpZGdldCh0eXBlLCAm
d2lkZ2V0U3RhdGUsIGZsYWdzLCBndGtUZXh0RGlyZWN0aW9uKHJlbmRlck9iamVjdC0+c3R5bGUo
KS0+ZGlyZWN0aW9uKCkpKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0VG9nZ2xlU2l6ZShjb25zdCBS
ZW5kZXJUaGVtZUd0ayogdGhlbWUsIFJlbmRlclN0eWxlKiBzdHlsZSwgQ29udHJvbFBhcnQgYXBw
ZWFyYW5jZSkKLXsKLSAgICAvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBhcmUgYm90aCBzcGVjaWZp
ZWQsIHNvIHdlIHNob3VsZG4ndCBjaGFuZ2UgdGhlbS4KLSAgICBpZiAoIXN0eWxlLT53aWR0aCgp
LmlzSW50cmluc2ljT3JBdXRvKCkgJiYgIXN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgLy8gRklYTUU6IFRoaXMgaXMgcHJvYmFibHkgbm90IGNvcnJlY3Qg
dXNlIG9mIGluZGljYXRvclNpemUgYW5kIGluZGljYXRvclNwYWNpbmcuCi0gICAgZ2ludCBpbmRp
Y2F0b3JTaXplLCBpbmRpY2F0b3JTcGFjaW5nOwotICAgIHRoZW1lLT5nZXRJbmRpY2F0b3JNZXRy
aWNzKGFwcGVhcmFuY2UsIGluZGljYXRvclNpemUsIGluZGljYXRvclNwYWNpbmcpOwotCi0gICAg
Ly8gT3RoZXIgcG9ydHMgaGFyZC1jb2RlIHRoaXMgdG8gMTMsIGJ1dCBHVEsrIHVzZXJzIHRlbmQg
dG8gZGVtYW5kIHRoZSBuYXRpdmUgbG9vay4KLSAgICAvLyBJdCBjb3VsZCBiZSBtYWRlIGEgY29u
ZmlndXJhdGlvbiBvcHRpb24gdmFsdWVzIG90aGVyIHRoYW4gMTMgYWN0dWFsbHkgYnJlYWsgc2l0
ZSBjb21wYXRpYmlsaXR5LgotICAgIGludCBsZW5ndGggPSBpbmRpY2F0b3JTaXplICsgaW5kaWNh
dG9yU3BhY2luZzsKLSAgICBpZiAoc3R5bGUtPndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSkK
LSAgICAgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChsZW5ndGgsIEZpeGVkKSk7Ci0KLSAgICBp
ZiAoc3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKQotICAgICAgICBzdHlsZS0+c2V0SGVpZ2h0KExl
bmd0aChsZW5ndGgsIEZpeGVkKSk7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVHdGs6OnNldENoZWNr
Ym94U2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgc2V0VG9nZ2xlU2l6ZSh0
aGlzLCBzdHlsZSwgUmFkaW9QYXJ0KTsKLX0KLQotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRD
aGVja2JveChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVj
dCYgcmVjdCkKLXsKLSAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoTU9aX0dUS19DSEVDS0JV
VFRPTiwgbywgaS5jb250ZXh0LCByZWN0LCBpc0NoZWNrZWQobykpOwotfQotCi12b2lkIFJlbmRl
clRoZW1lR3RrOjpzZXRSYWRpb1NpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAotewotICAg
IHNldFRvZ2dsZVNpemUodGhpcywgc3R5bGUsIFJhZGlvUGFydCk7Ci19Ci0KLWJvb2wgUmVuZGVy
VGhlbWVHdGs6OnBhaW50UmFkaW8oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIGks
IGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgcmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0KE1P
Wl9HVEtfUkFESU9CVVRUT04sIG8sIGkuY29udGV4dCwgcmVjdCwgaXNDaGVja2VkKG8pKTsKLX0K
LQogdm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0QnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rv
ciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgV2ViQ29yZTo6RWxlbWVudCogZSkgY29u
c3QKIHsKICAgICAvLyBTb21lIGxheW91dCB0ZXN0cyBjaGVjayBleHBsaWNpdGx5IHRoYXQgYnV0
dG9ucyBpZ25vcmUgbGluZS1oZWlnaHQuCkBAIC0zNDcsNDkgKzE5NCw2IEBAIHZvaWQgUmVuZGVy
VGhlbWVHdGs6OmFkanVzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBS
ZW5kZXJTdHlsZSoKICAgICAgICAgc3R5bGUtPnNldExpbmVIZWlnaHQoUmVuZGVyU3R5bGU6Omlu
aXRpYWxMaW5lSGVpZ2h0KCkpOwogfQogCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludEJ1dHRv
bihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcmVj
dCkKLXsKLSAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoTU9aX0dUS19CVVRUT04sIG8sIGku
Y29udGV4dCwgcmVjdCwgR1RLX1JFTElFRl9OT1JNQUwpOwotfQotCi1zdGF0aWMgdm9pZCBnZXRD
b21ib0JveFBhZGRpbmcoUmVuZGVyU3R5bGUqIHN0eWxlLCBpbnQmIGxlZnQsIGludCYgdG9wLCBp
bnQmIHJpZ2h0LCBpbnQmIGJvdHRvbSkKLXsKLSAgICAvLyBJZiB0aGlzIG1lbnUgbGlzdCBidXR0
b24gaXNuJ3QgZHJhd24gdXNpbmcgdGhlIG5hdGl2ZSB0aGVtZSwgd2UKLSAgICAvLyBkb24ndCBh
ZGQgYW55IGV4dHJhIHBhZGRpbmcgYmV5b25kIHdoYXQgV2ViQ29yZSBhbHJlYWR5IHVzZXMuCi0g
ICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTm9Db250cm9sUGFydCkKLSAgICAgICAgcmV0
dXJuOwotICAgIG1vel9ndGtfZ2V0X3dpZGdldF9ib3JkZXIoTU9aX0dUS19EUk9QRE9XTiwgJmxl
ZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGd0a1RleHREaXJlY3Rpb24oc3R5bGUtPmRpcmVjdGlvbigpKSwgVFJVRSk7Ci19Ci0KLWludCBS
ZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdMZWZ0KFJlbmRlclN0eWxlKiBzdHls
ZSkgY29uc3QKLXsKLSAgICBpbnQgbGVmdCA9IDAsIHRvcCA9IDAsIHJpZ2h0ID0gMCwgYm90dG9t
ID0gMDsKLSAgICBnZXRDb21ib0JveFBhZGRpbmcoc3R5bGUsIGxlZnQsIHRvcCwgcmlnaHQsIGJv
dHRvbSk7Ci0gICAgcmV0dXJuIGxlZnQ7Ci19Ci0KLWludCBSZW5kZXJUaGVtZUd0azo6cG9wdXBJ
bnRlcm5hbFBhZGRpbmdSaWdodChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgaW50
IGxlZnQgPSAwLCB0b3AgPSAwLCByaWdodCA9IDAsIGJvdHRvbSA9IDA7Ci0gICAgZ2V0Q29tYm9C
b3hQYWRkaW5nKHN0eWxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgIHJldHVybiBy
aWdodDsKLX0KLQotaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ1RvcChS
ZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgaW50IGxlZnQgPSAwLCB0b3AgPSAwLCBy
aWdodCA9IDAsIGJvdHRvbSA9IDA7Ci0gICAgZ2V0Q29tYm9Cb3hQYWRkaW5nKHN0eWxlLCBsZWZ0
LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgIHJldHVybiB0b3A7Ci19Ci0KLWludCBSZW5kZXJU
aGVtZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdCb3R0b20oUmVuZGVyU3R5bGUqIHN0eWxlKSBj
b25zdAotewotICAgIGludCBsZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSAwLCBib3R0b20gPSAw
OwotICAgIGdldENvbWJvQm94UGFkZGluZyhzdHlsZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9t
KTsKLSAgICByZXR1cm4gYm90dG9tOwotfQotCiB2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RN
ZW51TGlzdFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5
bGUsIEVsZW1lbnQqIGUpIGNvbnN0CiB7CiAgICAgLy8gVGhlIHRlc3RzIGNoZWNrIGV4cGxpY2l0
bHkgdGhhdCBzZWxlY3QgbWVudSBidXR0b25zIGlnbm9yZSBsaW5lIGhlaWdodC4KQEAgLTQwNCw0
NCArMjA4LDE2IEBAIHZvaWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdE1lbnVMaXN0QnV0dG9uU3R5
bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlCiAgICAgYWRqdXN0TWVudUxpc3RT
dHlsZShzZWxlY3Rvciwgc3R5bGUsIGUpOwogfQogCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWlu
dE1lbnVMaXN0KFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBpLCBjb25zdCBJbnRS
ZWN0JiByZWN0KQotewotICAgIHJldHVybiBwYWludFJlbmRlck9iamVjdChNT1pfR1RLX0RST1BE
T1dOLCBvLCBpLmNvbnRleHQsIHJlY3QpOwotfQotCiBib29sIFJlbmRlclRoZW1lR3RrOjpwYWlu
dE1lbnVMaXN0QnV0dG9uKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGlu
Zm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCiB7CiAgICAgcmV0dXJuIHBhaW50TWVudUxpc3Qob2Jq
ZWN0LCBpbmZvLCByZWN0KTsKIH0KIAotc3RhdGljIHZvaWQgc2V0VGV4dElucHV0Qm9yZGVycyhS
ZW5kZXJTdHlsZSogc3R5bGUpCi17Ci0gICAgLy8gSWYgdGhpcyBjb250cm9sIGlzbid0IGRyYXdu
IHVzaW5nIHRoZSBuYXRpdmUgdGhlbWUsIHdlIGRvbid0IHRvdWNoIHRoZSBib3JkZXJzLgotICAg
IGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE5vQ29udHJvbFBhcnQpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIC8vIFdlIGNhbm5vdCBnaXZlIGEgcHJvcGVyIHJlbmRlcmluZyB3aGVuIGJvcmRl
ciByYWRpdXMgaXMgYWN0aXZlLCB1bmZvcnR1bmF0ZWx5LgotICAgIHN0eWxlLT5yZXNldEJvcmRl
clJhZGl1cygpOwotCi0gICAgaW50IGxlZnQgPSAwLCB0b3AgPSAwLCByaWdodCA9IDAsIGJvdHRv
bSA9IDA7Ci0gICAgbW96X2d0a19nZXRfd2lkZ2V0X2JvcmRlcihNT1pfR1RLX0VOVFJZLCAmbGVm
dCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Z3RrVGV4dERpcmVjdGlvbihzdHlsZS0+ZGlyZWN0aW9uKCkpLCBUUlVFKTsKLSAgICBzdHlsZS0+
c2V0Qm9yZGVyTGVmdFdpZHRoKGxlZnQpOwotICAgIHN0eWxlLT5zZXRCb3JkZXJUb3BXaWR0aCh0
b3ApOwotICAgIHN0eWxlLT5zZXRCb3JkZXJSaWdodFdpZHRoKHJpZ2h0KTsKLSAgICBzdHlsZS0+
c2V0Qm9yZGVyQm90dG9tV2lkdGgoYm90dG9tKTsKLX0KLQogdm9pZCBSZW5kZXJUaGVtZUd0azo6
YWRqdXN0VGV4dEZpZWxkU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0
eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3QKIHsKICAgICBzZXRUZXh0SW5wdXRCb3JkZXJz
KHN0eWxlKTsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRUZXh0RmllbGQoUmVuZGVy
T2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0g
ICAgcmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtfRU5UUlksIG8sIGkuY29udGV4dCwg
cmVjdCk7Ci19Ci0KIHZvaWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdFRleHRBcmVhU3R5bGUoQ1NT
U3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkg
Y29uc3QKIHsKICAgICBzZXRUZXh0SW5wdXRCb3JkZXJzKHN0eWxlKTsKQEAgLTQ3Myw3ICsyNDks
NyBAQCB2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0
aW9uU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciogcwogICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3Ro
KGhlaWdodCwgRml4ZWQpKTsKIH0KIAotc3RhdGljIEludFBvaW50IGNlbnRlclJlY3RWZXJ0aWNh
bGx5SW5QYXJlbnRJbnB1dEVsZW1lbnQoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IEludFJl
Y3QmIHJlY3QpCitJbnRQb2ludCBSZW5kZXJUaGVtZUd0azo6Y2VudGVyUmVjdFZlcnRpY2FsbHlJ
blBhcmVudElucHV0RWxlbWVudChSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgSW50UmVjdCYg
cmVjdCkKIHsKICAgICBOb2RlKiBpbnB1dCA9IG9iamVjdC0+bm9kZSgpLT5zaGFkb3dBbmNlc3Rv
ck5vZGUoKTsgLy8gR2V0IHRoZSByZW5kZXJlciBvZiA8aW5wdXQ+IGVsZW1lbnQuCiAgICAgaWYg
KCFpbnB1dC0+cmVuZGVyZXIoKS0+aXNCb3goKSkKQEAgLTQ4OSwxMSArMjY1LDExIEBAIHN0YXRp
YyBJbnRQb2ludCBjZW50ZXJSZWN0VmVydGljYWxseUluUGFyZW50SW5wdXRFbGVtZW50KFJlbmRl
ck9iamVjdCogb2JqZWN0LCBjCiAKIGJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50U2VhcmNoRmll
bGRSZXN1bHRzRGVjb3JhdGlvbihSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgY29uc3QgUGFp
bnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCiB7Ci0gICAgR3RrU3R5bGUq
IHN0eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUoR1RLX1dJREdFVChndGtFbnRyeSgpKSk7Cisg
ICAgUGxhdGZvcm1SZWZQdHI8R2RrUGl4YnVmPiBpY29uID0gZ2V0U3RvY2tJY29uKEdUS19UWVBF
X0VOVFJZLCBHVEtfU1RPQ0tfRklORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZ3RrVGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3QtPnN0eWxlKCkt
PmRpcmVjdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZ3RrSWNvblN0YXRlKHRoaXMsIHJlbmRlck9iamVjdCksIEdUS19JQ09OX1NJWkVf
TUVOVSk7CiAgICAgSW50UG9pbnQgaWNvblBvaW50KGNlbnRlclJlY3RWZXJ0aWNhbGx5SW5QYXJl
bnRJbnB1dEVsZW1lbnQocmVuZGVyT2JqZWN0LCByZWN0KSk7Ci0gICAgcGFpbnRTdG9ja0ljb24o
cGFpbnRJbmZvLmNvbnRleHQsIGljb25Qb2ludCwgc3R5bGUsIEdUS19TVE9DS19GSU5ELAotICAg
ICAgICAgICAgICAgICAgIGd0a1RleHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5k
aXJlY3Rpb24oKSksCi0gICAgICAgICAgICAgICAgICAgZ3RrSWNvblN0YXRlKHJlbmRlck9iamVj
dCksIEdUS19JQ09OX1NJWkVfTUVOVSk7CisgICAgcGFpbnRTdG9ja0ljb24ocGFpbnRJbmZvLmNv
bnRleHQsIGljb25Qb2ludCwgaWNvbi5nZXQoKSk7CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCkBA
IC01MTAsMTEgKzI4NiwxMiBAQCB2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RTZWFyY2hGaWVs
ZENhbmNlbEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdAogCiBib29sIFJlbmRl
clRoZW1lR3RrOjpwYWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKFJlbmRlck9iamVjdCogcmVu
ZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVj
dCkKIHsKLSAgICBHdGtTdHlsZSogc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZShHVEtfV0lE
R0VUKGd0a0VudHJ5KCkpKTsKKyAgICBQbGF0Zm9ybVJlZlB0cjxHZGtQaXhidWY+IGljb24gPSBn
ZXRTdG9ja0ljb24oR1RLX1RZUEVfRU5UUlksIEdUS19TVE9DS19DTEVBUiwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RrVGV4dERpcmVjdGlvbihy
ZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RrSWNvblN0YXRlKHRoaXMsIHJlbmRlck9i
amVjdCksIEdUS19JQ09OX1NJWkVfTUVOVSk7CiAgICAgSW50UG9pbnQgaWNvblBvaW50KGNlbnRl
clJlY3RWZXJ0aWNhbGx5SW5QYXJlbnRJbnB1dEVsZW1lbnQocmVuZGVyT2JqZWN0LCByZWN0KSk7
Ci0gICAgcGFpbnRTdG9ja0ljb24ocGFpbnRJbmZvLmNvbnRleHQsIGljb25Qb2ludCwgc3R5bGUs
IEdUS19TVE9DS19DTEVBUiwKLSAgICAgICAgICAgICAgICAgICBndGtUZXh0RGlyZWN0aW9uKHJl
bmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpLAotICAgICAgICAgICAgICAgICAgIGd0
a0ljb25TdGF0ZShyZW5kZXJPYmplY3QpLCBHVEtfSUNPTl9TSVpFX01FTlUpOworICAgIHBhaW50
U3RvY2tJY29uKHBhaW50SW5mby5jb250ZXh0LCBpY29uUG9pbnQsIGljb24uZ2V0KCkpOworCiAg
ICAgcmV0dXJuIGZhbHNlOwogfQogCkBAIC01MjksMTA1ICszMDYsMTYgQEAgYm9vbCBSZW5kZXJU
aGVtZUd0azo6cGFpbnRTZWFyY2hGaWVsZChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5m
byYgaSwgY29uc3QKICAgICByZXR1cm4gcGFpbnRUZXh0RmllbGQobywgaSwgcmVjdCk7CiB9CiAK
LWJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50U2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiBvYmpl
Y3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBD
b250cm9sUGFydCBwYXJ0ID0gb2JqZWN0LT5zdHlsZSgpLT5hcHBlYXJhbmNlKCk7Ci0gICAgQVNT
RVJUKHBhcnQgPT0gU2xpZGVySG9yaXpvbnRhbFBhcnQgfHwgcGFydCA9PSBTbGlkZXJWZXJ0aWNh
bFBhcnQpOwotCi0gICAgR3RrVGhlbWVXaWRnZXRUeXBlIGd0a1BhcnQgPSBNT1pfR1RLX1NDQUxF
X0hPUklaT05UQUw7Ci0gICAgaWYgKHBhcnQgPT0gU2xpZGVyVmVydGljYWxQYXJ0KQotICAgICAg
ICBndGtQYXJ0ID0gTU9aX0dUS19TQ0FMRV9WRVJUSUNBTDsKLQotICAgIHJldHVybiBwYWludFJl
bmRlck9iamVjdChndGtQYXJ0LCBvYmplY3QsIGluZm8uY29udGV4dCwgcmVjdCk7Ci19Ci0KIHZv
aWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdFNsaWRlclRyYWNrU3R5bGUoQ1NTU3R5bGVTZWxlY3Rv
ciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0CiB7CiAgICAgc3R5bGUtPnNl
dEJveFNoYWRvdygwKTsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRTbGlkZXJUaHVt
YihSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRS
ZWN0JiByZWN0KQotewotICAgIENvbnRyb2xQYXJ0IHBhcnQgPSBvYmplY3QtPnN0eWxlKCktPmFw
cGVhcmFuY2UoKTsKLSAgICBBU1NFUlQocGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0
IHx8IHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpOwotCi0gICAgR3RrVGhlbWVXaWRn
ZXRUeXBlIGd0a1BhcnQgPSBNT1pfR1RLX1NDQUxFX1RIVU1CX0hPUklaT05UQUw7Ci0gICAgaWYg
KHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpCi0gICAgICAgIGd0a1BhcnQgPSBNT1pf
R1RLX1NDQUxFX1RIVU1CX1ZFUlRJQ0FMOwotCi0gICAgcmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0
KGd0a1BhcnQsIG9iamVjdCwgaW5mby5jb250ZXh0LCByZWN0KTsKLX0KLQogdm9pZCBSZW5kZXJU
aGVtZUd0azo6YWRqdXN0U2xpZGVyVGh1bWJTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVy
U3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKIHsKICAgICBzdHlsZS0+c2V0Qm94U2hhZG93
KDApOwogfQogCi12b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RTbGlkZXJUaHVtYlNpemUoUmVu
ZGVyT2JqZWN0KiBvKSBjb25zdAotewotICAgIENvbnRyb2xQYXJ0IHBhcnQgPSBvLT5zdHlsZSgp
LT5hcHBlYXJhbmNlKCk7Ci0jaWYgRU5BQkxFKFZJREVPKQotICAgIGlmIChwYXJ0ID09IE1lZGlh
U2xpZGVyVGh1bWJQYXJ0KSB7Ci0gICAgICAgIG8tPnN0eWxlKCktPnNldFdpZHRoKExlbmd0aCht
X21lZGlhU2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsKLSAgICAgICAgby0+c3R5bGUoKS0+c2V0
SGVpZ2h0KExlbmd0aChtX21lZGlhU2xpZGVyVGh1bWJIZWlnaHQsIEZpeGVkKSk7Ci0gICAgfSBl
bHNlCi0jZW5kaWYKLSAgICBpZiAocGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0IHx8
IHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpIHsKLSAgICAgICAgZ2ludCB3aWR0aCwg
aGVpZ2h0OwotICAgICAgICBtb3pfZ3RrX2dldF9zY2FsZXRodW1iX21ldHJpY3MocGFydCA9PSBT
bGlkZXJUaHVtYkhvcml6b250YWxQYXJ0ID8gR1RLX09SSUVOVEFUSU9OX0hPUklaT05UQUwgOiBH
VEtfT1JJRU5UQVRJT05fVkVSVElDQUwsICZ3aWR0aCwgJmhlaWdodCk7Ci0gICAgICAgIG8tPnN0
eWxlKCktPnNldFdpZHRoKExlbmd0aCh3aWR0aCwgRml4ZWQpKTsKLSAgICAgICAgby0+c3R5bGUo
KS0+c2V0SGVpZ2h0KExlbmd0aChoZWlnaHQsIEZpeGVkKSk7Ci0gICAgfQotfQotCi1Db2xvciBS
ZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBj
b25zdAotewotICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrRW50cnkoKTsKLSAgICByZXR1cm4g
Z3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+YmFzZVtHVEtfU1RBVEVfU0VMRUNURURdOwot
fQotCi1Db2xvciBSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkJhY2tn
cm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtFbnRyeSgp
OwotICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT5iYXNlW0dUS19TVEFU
RV9BQ1RJVkVdOwotfQotCi1Db2xvciBSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1BY3RpdmVTZWxl
Y3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIEd0a1dpZGdldCogd2lkZ2V0ID0g
Z3RrRW50cnkoKTsKLSAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+dGV4
dFtHVEtfU1RBVEVfU0VMRUNURURdOwotfQotCi1Db2xvciBSZW5kZXJUaGVtZUd0azo6cGxhdGZv
cm1JbmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgR3RrV2lk
Z2V0KiB3aWRnZXQgPSBndGtFbnRyeSgpOwotICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHls
ZSh3aWRnZXQpLT50ZXh0W0dUS19TVEFURV9BQ1RJVkVdOwotfQotCi1Db2xvciBSZW5kZXJUaGVt
ZUd0azo6YWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0g
ICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtUcmVlVmlldygpOwotICAgIHJldHVybiBndGtfd2lk
Z2V0X2dldF9zdHlsZSh3aWRnZXQpLT5iYXNlW0dUS19TVEFURV9TRUxFQ1RFRF07Ci19Ci0KLUNv
bG9yIFJlbmRlclRoZW1lR3RrOjppbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29s
b3IoKSBjb25zdAotewotICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrVHJlZVZpZXcoKTsKLSAg
ICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+YmFzZVtHVEtfU1RBVEVfQUNU
SVZFXTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6OmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25G
b3JlZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrVHJl
ZVZpZXcoKTsKLSAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+dGV4dFtH
VEtfU1RBVEVfU0VMRUNURURdOwotfQotCi1Db2xvciBSZW5kZXJUaGVtZUd0azo6aW5hY3RpdmVM
aXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKLXsKLSAgICBHdGtXaWRnZXQq
IHdpZGdldCA9IGd0a1RyZWVWaWV3KCk7Ci0gICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxl
KHdpZGdldCktPnRleHRbR1RLX1NUQVRFX0FDVElWRV07Ci19Ci0KIGRvdWJsZSBSZW5kZXJUaGVt
ZUd0azo6Y2FyZXRCbGlua0ludGVydmFsKCkgY29uc3QKIHsKICAgICBHdGtTZXR0aW5ncyogc2V0
dGluZ3MgPSBndGtfc2V0dGluZ3NfZ2V0X2RlZmF1bHQoKTsKQEAgLTY4NSw4MiArMzczLDYgQEAg
dm9pZCBSZW5kZXJUaGVtZUd0azo6c3lzdGVtRm9udChpbnQsIEZvbnREZXNjcmlwdGlvbiYgZm9u
dERlc2NyaXB0aW9uKSBjb25zdAogICAgIHBhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZnJlZShwYW5n
b0Rlc2NyaXB0aW9uKTsKIH0KIAotQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnN5c3RlbUNvbG9yKGlu
dCBjc3NWYWx1ZUlkKSBjb25zdAotewotICAgIHN3aXRjaCAoY3NzVmFsdWVJZCkgewotICAgIGNh
c2UgQ1NTVmFsdWVCdXR0b250ZXh0OgotICAgICAgICByZXR1cm4gQ29sb3IoZ3RrX3dpZGdldF9n
ZXRfc3R5bGUoZ3RrQnV0dG9uKCkpLT5mZ1tHVEtfU1RBVEVfTk9STUFMXSk7Ci0gICAgY2FzZSBD
U1NWYWx1ZUNhcHRpb250ZXh0OgotICAgICAgICByZXR1cm4gQ29sb3IoZ3RrX3dpZGdldF9nZXRf
c3R5bGUoZ3RrRW50cnkoKSktPmZnW0dUS19TVEFURV9OT1JNQUxdKTsKLSAgICBkZWZhdWx0Ogot
ICAgICAgICByZXR1cm4gUmVuZGVyVGhlbWU6OnN5c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOwotICAg
IH0KLX0KLQotc3RhdGljIHZvaWQgZ3RrU3R5bGVTZXRDYWxsYmFjayhHdGtXaWRnZXQqIHdpZGdl
dCwgR3RrU3R5bGUqIHByZXZpb3VzLCBSZW5kZXJUaGVtZSogcmVuZGVyVGhlbWUpCi17Ci0gICAg
Ly8gRklYTUU6IE1ha2Ugc3VyZSB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZ2V0IGNhbGxlZCBtYW55
IHRpbWVzIGZvciBhIHNpbmdsZSBHVEsrIHN0eWxlIGNoYW5nZSBzaWduYWwuCi0gICAgcmVuZGVy
VGhlbWUtPnBsYXRmb3JtQ29sb3JzRGlkQ2hhbmdlKCk7Ci19Ci0KLUd0a0NvbnRhaW5lciogUmVu
ZGVyVGhlbWVHdGs6Omd0a0NvbnRhaW5lcigpIGNvbnN0Ci17Ci0gICAgaWYgKG1fZ3RrQ29udGFp
bmVyKQotICAgICAgICByZXR1cm4gbV9ndGtDb250YWluZXI7Ci0KLSAgICBtX2d0a1dpbmRvdyA9
IGd0a193aW5kb3dfbmV3KEdUS19XSU5ET1dfUE9QVVApOwotICAgIG1fZ3RrQ29udGFpbmVyID0g
R1RLX0NPTlRBSU5FUihndGtfZml4ZWRfbmV3KCkpOwotICAgIGdfc2lnbmFsX2Nvbm5lY3QobV9n
dGtXaW5kb3csICJzdHlsZS1zZXQiLCBHX0NBTExCQUNLKGd0a1N0eWxlU2V0Q2FsbGJhY2spLCBj
b25zdF9jYXN0PFJlbmRlclRoZW1lR3RrKj4odGhpcykpOwotICAgIGd0a19jb250YWluZXJfYWRk
KEdUS19DT05UQUlORVIobV9ndGtXaW5kb3cpLCBHVEtfV0lER0VUKG1fZ3RrQ29udGFpbmVyKSk7
Ci0gICAgZ3RrX3dpZGdldF9yZWFsaXplKG1fZ3RrV2luZG93KTsKLQotICAgIHJldHVybiBtX2d0
a0NvbnRhaW5lcjsKLX0KLQotR3RrV2lkZ2V0KiBSZW5kZXJUaGVtZUd0azo6Z3RrQnV0dG9uKCkg
Y29uc3QKLXsKLSAgICBpZiAobV9ndGtCdXR0b24pCi0gICAgICAgIHJldHVybiBtX2d0a0J1dHRv
bjsKLQotICAgIG1fZ3RrQnV0dG9uID0gZ3RrX2J1dHRvbl9uZXcoKTsKLSAgICBnX3NpZ25hbF9j
b25uZWN0KG1fZ3RrQnV0dG9uLCAic3R5bGUtc2V0IiwgR19DQUxMQkFDSyhndGtTdHlsZVNldENh
bGxiYWNrKSwgY29uc3RfY2FzdDxSZW5kZXJUaGVtZUd0ayo+KHRoaXMpKTsKLSAgICBndGtfY29u
dGFpbmVyX2FkZChndGtDb250YWluZXIoKSwgbV9ndGtCdXR0b24pOwotICAgIGd0a193aWRnZXRf
cmVhbGl6ZShtX2d0a0J1dHRvbik7Ci0KLSAgICByZXR1cm4gbV9ndGtCdXR0b247Ci19Ci0KLUd0
a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a0VudHJ5KCkgY29uc3QKLXsKLSAgICBpZiAobV9n
dGtFbnRyeSkKLSAgICAgICAgcmV0dXJuIG1fZ3RrRW50cnk7Ci0KLSAgICBtX2d0a0VudHJ5ID0g
Z3RrX2VudHJ5X25ldygpOwotICAgIGdfc2lnbmFsX2Nvbm5lY3QobV9ndGtFbnRyeSwgInN0eWxl
LXNldCIsIEdfQ0FMTEJBQ0soZ3RrU3R5bGVTZXRDYWxsYmFjayksIGNvbnN0X2Nhc3Q8UmVuZGVy
VGhlbWVHdGsqPih0aGlzKSk7Ci0gICAgZ3RrX2NvbnRhaW5lcl9hZGQoZ3RrQ29udGFpbmVyKCks
IG1fZ3RrRW50cnkpOwotICAgIGd0a193aWRnZXRfcmVhbGl6ZShtX2d0a0VudHJ5KTsKLQotICAg
IHJldHVybiBtX2d0a0VudHJ5OwotfQotCi1HdGtXaWRnZXQqIFJlbmRlclRoZW1lR3RrOjpndGtU
cmVlVmlldygpIGNvbnN0Ci17Ci0gICAgaWYgKG1fZ3RrVHJlZVZpZXcpCi0gICAgICAgIHJldHVy
biBtX2d0a1RyZWVWaWV3OwotCi0gICAgbV9ndGtUcmVlVmlldyA9IGd0a190cmVlX3ZpZXdfbmV3
KCk7Ci0gICAgZ19zaWduYWxfY29ubmVjdChtX2d0a1RyZWVWaWV3LCAic3R5bGUtc2V0IiwgR19D
QUxMQkFDSyhndGtTdHlsZVNldENhbGxiYWNrKSwgY29uc3RfY2FzdDxSZW5kZXJUaGVtZUd0ayo+
KHRoaXMpKTsKLSAgICBndGtfY29udGFpbmVyX2FkZChndGtDb250YWluZXIoKSwgbV9ndGtUcmVl
Vmlldyk7Ci0gICAgZ3RrX3dpZGdldF9yZWFsaXplKG1fZ3RrVHJlZVZpZXcpOwotCi0gICAgcmV0
dXJuIG1fZ3RrVHJlZVZpZXc7Ci19Ci0KLUd0a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a1Nj
cm9sbGJhcigpCi17Ci0gICAgcmV0dXJuIG1vel9ndGtfZ2V0X3Njcm9sbGJhcl93aWRnZXQoKTsK
LX0KLQogdm9pZCBSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1Db2xvcnNEaWRDaGFuZ2UoKQogewog
I2lmIEVOQUJMRShWSURFTykKQEAgLTc3NywxMiArMzg5LDEzIEBAIFN0cmluZyBSZW5kZXJUaGVt
ZUd0azo6ZXh0cmFNZWRpYUNvbnRyb2xzU3R5bGVTaGVldCgpCiAKIGJvb2wgUmVuZGVyVGhlbWVH
dGs6OnBhaW50TWVkaWFCdXR0b24oUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIEdyYXBoaWNz
Q29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgY2hhciogaWNvbk5h
bWUpCiB7Ci0gICAgR3RrU3R5bGUqIHN0eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUoR1RLX1dJ
REdFVChndGtDb250YWluZXIoKSkpOworICAgIFBsYXRmb3JtUmVmUHRyPEdka1BpeGJ1Zj4gaWNv
biA9IGdldFN0b2NrSWNvbihHVEtfVFlQRV9DT05UQUlORVIsIGljb25OYW1lLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGtUZXh0RGlyZWN0aW9u
KHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGtJY29uU3RhdGUodGhpcywgcmVuZGVy
T2JqZWN0KSwgZ2V0TWVkaWFCdXR0b25JY29uU2l6ZShtX21lZGlhSWNvblNpemUpKTsKICAgICBJ
bnRQb2ludCBpY29uUG9pbnQocmVjdC54KCkgKyAocmVjdC53aWR0aCgpIC0gbV9tZWRpYUljb25T
aXplKSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueSgpICsgKHJlY3QuaGVpZ2h0
KCkgLSBtX21lZGlhSWNvblNpemUpIC8gMik7CiAgICAgY29udGV4dC0+ZmlsbFJlY3QoRmxvYXRS
ZWN0KHJlY3QpLCBtX3BhbmVsQ29sb3IsIENvbG9yU3BhY2VEZXZpY2VSR0IpOwotICAgIHBhaW50
U3RvY2tJY29uKGNvbnRleHQsIGljb25Qb2ludCwgc3R5bGUsIGljb25OYW1lLCBndGtUZXh0RGly
ZWN0aW9uKHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpLAotICAgICAgICAgICAg
ICAgICAgIGd0a0ljb25TdGF0ZShyZW5kZXJPYmplY3QpLCBnZXRNZWRpYUJ1dHRvbkljb25TaXpl
KG1fbWVkaWFJY29uU2l6ZSkpOworICAgIHBhaW50U3RvY2tJY29uKGNvbnRleHQsIGljb25Qb2lu
dCwgaWNvbi5nZXQoKSk7CiAKICAgICByZXR1cm4gZmFsc2U7CiB9CkBAIC04OTAsNTEgKzUwMywx
MCBAQCBib29sIFJlbmRlclRoZW1lR3RrOjpwYWludE1lZGlhU2xpZGVyVGh1bWIoUmVuZGVyT2Jq
ZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaQogI2VuZGlmCiAKICNpZiBFTkFCTEUoUFJPR1JF
U1NfVEFHKQotZG91YmxlIFJlbmRlclRoZW1lR3RrOjphbmltYXRpb25SZXBlYXRJbnRlcnZhbEZv
clByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKikgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogSXQg
ZG9lc24ndCBsb29rIGxpa2UgdGhlcmUgaXMgYSBnb29kIHdheSB5ZXQgdG8gc3VwcG9ydCBhbmlt
YXRlZAotICAgIC8vIHByb2dyZXNzIGJhcnMgd2l0aCB0aGUgTW96aWxsYSB0aGVtZSBkcmF3aW5n
IGNvZGUuCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWRvdWJsZSBSZW5kZXJUaGVtZUd0azo6YW5pbWF0
aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyopIGNvbnN0Ci17Ci0gICAg
Ly8gRklYTUU6IEl0IGRvZXNuJ3QgbG9vayBsaWtlIHRoZXJlIGlzIGEgZ29vZCB3YXkgeWV0IHRv
IHN1cHBvcnQgYW5pbWF0ZWQKLSAgICAvLyBwcm9ncmVzcyBiYXJzIHdpdGggdGhlIE1vemlsbGEg
dGhlbWUgZHJhd2luZyBjb2RlLgotICAgIHJldHVybiAwOwotfQotCiB2b2lkIFJlbmRlclRoZW1l
R3RrOjphZGp1c3RQcm9ncmVzc0JhclN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHls
ZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAogewogICAgIHN0eWxlLT5zZXRCb3hTaGFkb3coMCk7
CiB9Ci0KLWJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50UHJvZ3Jlc3NCYXIoUmVuZGVyT2JqZWN0
KiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0
JiByZWN0KQotewotICAgIGlmICghcmVuZGVyT2JqZWN0LT5pc1Byb2dyZXNzKCkpCi0gICAgICAg
IHJldHVybiB0cnVlOwotCi0gICAgR3RrV2lkZ2V0KiBwcm9ncmVzc0JhcldpZGdldCA9IG1vel9n
dGtfZ2V0X3Byb2dyZXNzX3dpZGdldCgpOwotICAgIGlmICghcHJvZ3Jlc3NCYXJXaWRnZXQpCi0g
ICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtf
UFJPR1JFU1NCQVIsIHJlbmRlck9iamVjdCwgcGFpbnRJbmZvLmNvbnRleHQsIHJlY3QpKQotICAg
ICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIEludFJlY3QgY2h1bmtSZWN0KHJlY3QpOwotICAgIFJl
bmRlclByb2dyZXNzKiByZW5kZXJQcm9ncmVzcyA9IHRvUmVuZGVyUHJvZ3Jlc3MocmVuZGVyT2Jq
ZWN0KTsKLQotICAgIEd0a1N0eWxlKiBzdHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKHByb2dy
ZXNzQmFyV2lkZ2V0KTsKLSAgICBjaHVua1JlY3Quc2V0SGVpZ2h0KGNodW5rUmVjdC5oZWlnaHQo
KSAtICgyICogc3R5bGUtPnl0aGlja25lc3MpKTsKLSAgICBjaHVua1JlY3Quc2V0WShjaHVua1Jl
Y3QueSgpICsgc3R5bGUtPnl0aGlja25lc3MpOwotICAgIGNodW5rUmVjdC5zZXRXaWR0aCgoY2h1
bmtSZWN0LndpZHRoKCkgLSAoMiAqIHN0eWxlLT54dGhpY2tuZXNzKSkgKiByZW5kZXJQcm9ncmVz
cy0+cG9zaXRpb24oKSk7Ci0gICAgaWYgKHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9u
KCkgPT0gUlRMKQotICAgICAgICBjaHVua1JlY3Quc2V0WChyZWN0LngoKSArIHJlY3Qud2lkdGgo
KSAtIGNodW5rUmVjdC53aWR0aCgpIC0gc3R5bGUtPnh0aGlja25lc3MpOwotICAgIGVsc2UKLSAg
ICAgICAgY2h1bmtSZWN0LnNldFgoY2h1bmtSZWN0LngoKSArIHN0eWxlLT54dGhpY2tuZXNzKTsK
LQotICAgIHJldHVybiBwYWludFJlbmRlck9iamVjdChNT1pfR1RLX1BST0dSRVNTX0NIVU5LLCBy
ZW5kZXJPYmplY3QsIHBhaW50SW5mby5jb250ZXh0LCBjaHVua1JlY3QpOwotfQogI2VuZGlmCiAK
IH0KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrLmggYi9X
ZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0ay5oCmluZGV4IGNmNDBmYzguLjgwNDE5
YmYgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrLmgKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsuaApAQCAtMjksNyArMjksOSBA
QAogI2RlZmluZSBSZW5kZXJUaGVtZUd0a19oCiAKICNpbmNsdWRlICJHUmVmUHRyLmgiCisjaWZk
ZWYgR1RLX0FQSV9WRVJTSU9OXzIKICNpbmNsdWRlICJndGtkcmF3aW5nLmgiCisjZW5kaWYKICNp
bmNsdWRlICJSZW5kZXJUaGVtZS5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC04Myw5ICs4
NSwxMSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBTdHJpbmcgZXh0cmFNZWRpYUNvbnRyb2xzU3R5
bGVTaGVldCgpOwogI2VuZGlmCiAKLSAgICB2b2lkIGdldEluZGljYXRvck1ldHJpY3MoQ29udHJv
bFBhcnQsIGludCYgaW5kaWNhdG9yU2l6ZSwgaW50JiBpbmRpY2F0b3JTcGFjaW5nKSBjb25zdDsK
KyNpZm5kZWYgR1RLX0FQSV9WRVJTSU9OXzIKKyAgICBHdGtTdHlsZUNvbnRleHQqIGd0a1Njcm9s
bGJhclN0eWxlKCk7CisjZW5kaWYKIAotICAgIEd0a1dpZGdldCogZ3RrU2Nyb2xsYmFyKCk7Cisg
ICAgc3RhdGljIGdpbnQgZ3RrVGV4dERpcmVjdGlvbihUZXh0RGlyZWN0aW9uKTsKIAogcHJvdGVj
dGVkOgogICAgIHZpcnR1YWwgYm9vbCBwYWludENoZWNrYm94KFJlbmRlck9iamVjdCogbywgY29u
c3QgUGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKTsKQEAgLTE1Nyw2ICsxNjEsNyBAQCBw
cm90ZWN0ZWQ6CiAjZW5kaWYKIAogcHJpdmF0ZToKKyNpZmRlZiBHVEtfQVBJX1ZFUlNJT05fMgog
ICAgIC8qCiAgICAgICogaG9sZCB0aGUgc3RhdGUKICAgICAgKi8KQEAgLTE3MSwxNiArMTc2LDIz
IEBAIHByaXZhdGU6CiAgICAgR3RrQ29udGFpbmVyKiBndGtDb250YWluZXIoKSBjb25zdDsKIAog
ICAgIGJvb2wgcGFpbnRSZW5kZXJPYmplY3QoR3RrVGhlbWVXaWRnZXRUeXBlLCBSZW5kZXJPYmpl
Y3QqLCBHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgZmxhZ3MgPSAw
KTsKKyNlbmRpZgorCiAjaWYgRU5BQkxFKFZJREVPKQogICAgIGJvb2wgcGFpbnRNZWRpYUJ1dHRv
bihSZW5kZXJPYmplY3QqLCBHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRSZWN0JiwgY29uc3Qg
Y2hhciogaWNvbk5hbWUpOwogI2VuZGlmCi0gICAgR3RrU3RhdGVUeXBlIGd0a0ljb25TdGF0ZShS
ZW5kZXJPYmplY3QqKTsKIAorICAgIFBsYXRmb3JtUmVmUHRyPEdka1BpeGJ1Zj4gZ2V0U3RvY2tJ
Y29uKEdUeXBlIGdUeXBlLCBjb25zdCBjaGFyKiBpY29uTmFtZSwgZ2ludCBkaXJlY3Rpb24sIGdp
bnQgc3RhdGUsIGdpbnQgaWNvblNpemUpOworICAgIHN0YXRpYyB2b2lkIHNldFRleHRJbnB1dEJv
cmRlcnMoUmVuZGVyU3R5bGUqKTsKKyAgICBzdGF0aWMgSW50UG9pbnQgY2VudGVyUmVjdFZlcnRp
Y2FsbHlJblBhcmVudElucHV0RWxlbWVudChSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgSW50
UmVjdCYgcmVjdCk7CisKKyNpZmRlZiBHVEtfQVBJX1ZFUlNJT05fMgogICAgIG11dGFibGUgR3Rr
V2lkZ2V0KiBtX2d0a1dpbmRvdzsKICAgICBtdXRhYmxlIEd0a0NvbnRhaW5lciogbV9ndGtDb250
YWluZXI7CiAgICAgbXV0YWJsZSBHdGtXaWRnZXQqIG1fZ3RrQnV0dG9uOwogICAgIG11dGFibGUg
R3RrV2lkZ2V0KiBtX2d0a0VudHJ5OwogICAgIG11dGFibGUgR3RrV2lkZ2V0KiBtX2d0a1RyZWVW
aWV3OworI2VuZGlmCiAKICAgICBtdXRhYmxlIENvbG9yIG1fcGFuZWxDb2xvcjsKICAgICBtdXRh
YmxlIENvbG9yIG1fc2xpZGVyQ29sb3I7CkBAIC0xOTEsMTEgKzIwMyw5IEBAIHByaXZhdGU6CiAg
ICAgY29uc3QgaW50IG1fbWVkaWFTbGlkZXJUaHVtYldpZHRoOwogICAgIGNvbnN0IGludCBtX21l
ZGlhU2xpZGVyVGh1bWJIZWlnaHQ7CiAKLSAgICBHdGtUaGVtZVBhcnRzIG1fdGhlbWVQYXJ0czsK
ICNpZmRlZiBHVEtfQVBJX1ZFUlNJT05fMgotICAgIGJvb2wgbV90aGVtZVBhcnRzSGF2ZVJHQkFD
b2xvcm1hcDsKLSNlbmRpZgogICAgIGZyaWVuZCBjbGFzcyBXaWRnZXRSZW5kZXJpbmdDb250ZXh0
OworI2VuZGlmCiB9OwogCiB9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5k
ZXJUaGVtZUd0azIuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsyLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODcyNjJhCi0tLSAvZGV2L251
bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsyLmNwcApAQCAtMCww
ICsxLDQ3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDcgQWxwIFRva2VyIDxhbHBAYXRva2VyLmNvbT4KKyAqIENvcHlyaWdodCAo
QykgMjAwOCBDb2xsYWJvcmEgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IEtlbm5ldGggUm9o
ZGUgQ2hyaXN0aWFuc2VuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSWdhbGlhIFMuTC4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg
YW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChh
dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQg
V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv
ZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
LiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y
ZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBs
aWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNp
ZmRlZiBHVEtfQVBJX1ZFUlNJT05fMgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
UmVuZGVyVGhlbWVHdGsuaCIKKworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgorI2luY2x1
ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRlICJHT3duUHRyLmgiCisjaW5jbHVkZSAi
R3JhZGllbnQuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJHdGtW
ZXJzaW9uaW5nLmgiCisjaW5jbHVkZSAiSFRNTE1lZGlhRWxlbWVudC5oIgorI2luY2x1ZGUgIkhU
TUxOYW1lcy5oIgorI2luY2x1ZGUgIk1lZGlhQ29udHJvbEVsZW1lbnRzLmgiCisjaW5jbHVkZSAi
Tm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybU1vdXNlRXZlbnQuaCIKKyNpbmNs
dWRlICJSZW5kZXJCb3guaCIKKyNpbmNsdWRlICJSZW5kZXJPYmplY3QuaCIKKyNpbmNsdWRlICJT
Y3JvbGxiYXIuaCIKKyNpbmNsdWRlICJUaW1lUmFuZ2VzLmgiCisjaW5jbHVkZSAiVXNlckFnZW50
U3R5bGVTaGVldHMuaCIKKyNpbmNsdWRlICJXaWRnZXRSZW5kZXJpbmdDb250ZXh0LmgiCisjaW5j
bHVkZSAiZ3RrZHJhd2luZy5oIgorI2luY2x1ZGUgPGdkay9nZGsuaD4KKyNpbmNsdWRlIDxndGsv
Z3RrLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCisjaWYgRU5BQkxFKFBST0dS
RVNTX1RBRykKKyNpbmNsdWRlICJSZW5kZXJQcm9ncmVzcy5oIgorI2VuZGlmCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKwordXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKKworI2lmIEVOQUJMRShW
SURFTykKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6OmluaXRNZWRpYUNvbG9ycygpCit7CisgICAgR3Rr
U3R5bGUqIHN0eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUoR1RLX1dJREdFVChndGtDb250YWlu
ZXIoKSkpOworICAgIG1fcGFuZWxDb2xvciA9IHN0eWxlLT5iZ1tHVEtfU1RBVEVfTk9STUFMXTsK
KyAgICBtX3NsaWRlckNvbG9yID0gc3R5bGUtPmJnW0dUS19TVEFURV9BQ1RJVkVdOworICAgIG1f
c2xpZGVyVGh1bWJDb2xvciA9IHN0eWxlLT5iZ1tHVEtfU1RBVEVfU0VMRUNURURdOworfQorI2Vu
ZGlmCisKK3N0YXRpYyBpbnQgbW96R3RrUmVmQ291bnQgPSAwOworCitSZW5kZXJUaGVtZUd0azo6
UmVuZGVyVGhlbWVHdGsoKQorICAgIDogbV9ndGtXaW5kb3coMCkKKyAgICAsIG1fZ3RrQ29udGFp
bmVyKDApCisgICAgLCBtX2d0a0J1dHRvbigwKQorICAgICwgbV9ndGtFbnRyeSgwKQorICAgICwg
bV9ndGtUcmVlVmlldygwKQorICAgICwgbV9wYW5lbENvbG9yKENvbG9yOjp3aGl0ZSkKKyAgICAs
IG1fc2xpZGVyQ29sb3IoQ29sb3I6OndoaXRlKQorICAgICwgbV9zbGlkZXJUaHVtYkNvbG9yKENv
bG9yOjp3aGl0ZSkKKyAgICAsIG1fbWVkaWFJY29uU2l6ZSgxNikKKyAgICAsIG1fbWVkaWFTbGlk
ZXJIZWlnaHQoMTQpCisgICAgLCBtX21lZGlhU2xpZGVyVGh1bWJXaWR0aCgxMikKKyAgICAsIG1f
bWVkaWFTbGlkZXJUaHVtYkhlaWdodCgxMikKK3sKKyAgICAvLyBJbml0aWFsaXplIHRoZSBNb3pp
bGxhIHRoZW1lIGRyYXdpbmcgY29kZS4KKyAgICBpZiAoIW1vekd0a1JlZkNvdW50KSB7CisgICAg
ICAgIEd0a1RoZW1lUGFydHMqIHRoZW1lUGFydHMgPSBnX25ldzAoR3RrVGhlbWVQYXJ0cywgMSk7
CisgICAgICAgIEdka0NvbG9ybWFwKiBjb2xvcm1hcCA9IGdka19zY3JlZW5fZ2V0X3JnYmFfY29s
b3JtYXAoZ2RrX3NjcmVlbl9nZXRfZGVmYXVsdCgpKTsKKyAgICAgICAgdGhlbWVQYXJ0cy0+aGF2
ZVJHQkFDb2xvcm1hcCA9ICEhY29sb3JtYXA7CisgICAgICAgIGlmICghY29sb3JtYXApCisgICAg
ICAgICAgICBjb2xvcm1hcCA9IGdka19zY3JlZW5fZ2V0X2RlZmF1bHRfY29sb3JtYXAoZ2RrX3Nj
cmVlbl9nZXRfZGVmYXVsdCgpKTsKKyAgICAgICAgdGhlbWVQYXJ0cy0+Y29sb3JtYXAgPSBjb2xv
cm1hcDsKKyAgICAgICAgbW96X2d0a19pbml0KCk7CisgICAgICAgIG1vel9ndGtfdXNlX3RoZW1l
X3BhcnRzKHRoZW1lUGFydHMpOworICAgIH0KKyAgICArK21vekd0a1JlZkNvdW50OworCisjaWYg
RU5BQkxFKFZJREVPKQorICAgIGluaXRNZWRpYUNvbG9ycygpOworICAgIGluaXRNZWRpYUJ1dHRv
bnMoKTsKKyNlbmRpZgorfQorCitSZW5kZXJUaGVtZUd0azo6flJlbmRlclRoZW1lR3RrKCkKK3sK
KyAgICAtLW1vekd0a1JlZkNvdW50OworCisgICAgaWYgKCFtb3pHdGtSZWZDb3VudCkKKyAgICAg
ICAgbW96X2d0a19zaHV0ZG93bigpOworCisgICAgZ3RrX3dpZGdldF9kZXN0cm95KG1fZ3RrV2lu
ZG93KTsKK30KKworUGxhdGZvcm1SZWZQdHI8R2RrUGl4YnVmPiBSZW5kZXJUaGVtZUd0azo6Z2V0
U3RvY2tJY29uKEdUeXBlIGdUeXBlLCBjb25zdCBjaGFyKiBpY29uTmFtZSwgZ2ludCBkaXJlY3Rp
b24sIGdpbnQgc3RhdGUsIGdpbnQgaWNvblNpemUpCit7CisgICAgR3RrV2lkZ2V0KiB3aWRnZXQg
PSBnVHlwZSA9PSBHVEtfVFlQRV9DT05UQUlORVIgPyBHVEtfV0lER0VUKGd0a0NvbnRhaW5lcigp
KSA6IGd0a0VudHJ5KCk7CisgICAgR3RrU3R5bGUqIHN0eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5
bGUod2lkZ2V0KTsKKyAgICBHdGtJY29uU2V0KiBpY29uU2V0ID0gZ3RrX3N0eWxlX2xvb2t1cF9p
Y29uX3NldChzdHlsZSwgaWNvbk5hbWUpOworICAgIHJldHVybiBhZG9wdFBsYXRmb3JtUmVmKGd0
a19pY29uX3NldF9yZW5kZXJfaWNvbihpY29uU2V0LCBzdHlsZSwgc3RhdGljX2Nhc3Q8R3RrVGV4
dERpcmVjdGlvbj4oZGlyZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8R3RrU3RhdGVUeXBlPihzdGF0ZSksIHN0
YXRpY19jYXN0PEd0a0ljb25TaXplPihpY29uU2l6ZSksIDAsIDApKTsKK30KKworYm9vbCBSZW5k
ZXJUaGVtZUd0azo6cGFpbnRSZW5kZXJPYmplY3QoR3RrVGhlbWVXaWRnZXRUeXBlIHR5cGUsIFJl
bmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0
IEludFJlY3QmIHJlY3QsIGludCBmbGFncykKK3sKKyAgICAvLyBQYWludGluZyBpcyBkaXNhYmxl
ZCBzbyBqdXN0IGNsYWltIHRvIGhhdmUgc3VjY2VlZGVkCisgICAgaWYgKGNvbnRleHQtPnBhaW50
aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgR3RrV2lkZ2V0U3Rh
dGUgd2lkZ2V0U3RhdGU7CisgICAgd2lkZ2V0U3RhdGUuYWN0aXZlID0gaXNQcmVzc2VkKHJlbmRl
ck9iamVjdCk7CisgICAgd2lkZ2V0U3RhdGUuZm9jdXNlZCA9IGlzRm9jdXNlZChyZW5kZXJPYmpl
Y3QpOworCisgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE4
MzY0CisgICAgLy8gVGhlIE1vemlsbGEgdGhlbWUgZHJhd2luZyBjb2RlLCBvbmx5IHBhaW50cyBh
IGJ1dHRvbiBhcyBwcmVzc2VkIHdoZW4gaXQncyBwcmVzc2VkIAorICAgIC8vIHdoaWxlIGhvdmVy
ZWQuIFVudGlsIHdlIG1vdmUgYXdheSBmcm9tIHRoZSBNb3ppbGEgY29kZSwgd29yay1hcm91bmQg
dGhlIGlzc3VlIGJ5CisgICAgLy8gZm9yY2luZyBhIHByZXNzZWQgYnV0dG9uIGludG8gdGhlIGhv
dmVyZWQgc3RhdGUuIFRoaXMgZW5zdXJlcyB0aGF0IGJ1dHRvbnMgYWN0aXZhdGVkCisgICAgLy8g
dmlhIHRoZSBrZXlib2FyZCBoYXZlIHRoZSBwcm9wZXIgcmVuZGVyaW5nLgorICAgIHdpZGdldFN0
YXRlLmluSG92ZXIgPSBpc0hvdmVyZWQocmVuZGVyT2JqZWN0KSB8fCAodHlwZSA9PSBNT1pfR1RL
X0JVVFRPTiAmJiBpc1ByZXNzZWQocmVuZGVyT2JqZWN0KSk7CisKKyAgICAvLyBGSVhNRTogRGlz
YWJsZWQgZG9lcyBub3QgYWx3YXlzIGdpdmUgdGhlIGNvcnJlY3QgYXBwZWFyYW5jZSBmb3IgUmVh
ZE9ubHkKKyAgICB3aWRnZXRTdGF0ZS5kaXNhYmxlZCA9ICFpc0VuYWJsZWQocmVuZGVyT2JqZWN0
KSB8fCBpc1JlYWRPbmx5Q29udHJvbChyZW5kZXJPYmplY3QpOworICAgIHdpZGdldFN0YXRlLmlz
RGVmYXVsdCA9IGZhbHNlOworICAgIHdpZGdldFN0YXRlLmNhbkRlZmF1bHQgPSBmYWxzZTsKKwor
ICAgIC8vIEZJWE1FOiBUaGUgZGVwcmVzc2VkIHZhbHVlIHNob3VsZCBwcm9iYWJseSBhcHBseSBm
b3Igb3RoZXIgdGhlbWUgcGFydHMgdG9vLgorICAgIC8vIEl0IG11c3QgYmUgdXNlZCBmb3IgcmFu
Z2UgdGh1bWJzLCBiZWNhdXNlIG90aGVyd2lzZSB3aGVuIHRoZSB0aHVtYiBpcyBwcmVzc2VkLAor
ICAgIC8vIHRoZSByZW5kZXJpbmcgaXMgaW5jb3JyZWN0LgorICAgIGlmICh0eXBlID09IE1PWl9H
VEtfU0NBTEVfVEhVTUJfSE9SSVpPTlRBTCB8fCB0eXBlID09IE1PWl9HVEtfU0NBTEVfVEhVTUJf
VkVSVElDQUwpCisgICAgICAgIHdpZGdldFN0YXRlLmRlcHJlc3NlZCA9IGlzUHJlc3NlZChyZW5k
ZXJPYmplY3QpOworICAgIGVsc2UKKyAgICAgICAgd2lkZ2V0U3RhdGUuZGVwcmVzc2VkID0gZmFs
c2U7CisKKyAgICBXaWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENvbnRleHQoY29udGV4dCwg
cmVjdCk7CisgICAgcmV0dXJuICF3aWRnZXRDb250ZXh0LnBhaW50TW96aWxsYVdpZGdldCh0eXBl
LCAmd2lkZ2V0U3RhdGUsIGZsYWdzLCBzdGF0aWNfY2FzdDxHdGtUZXh0RGlyZWN0aW9uPihndGtU
ZXh0RGlyZWN0aW9uKHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKSk7Cit9CisK
K3N0YXRpYyB2b2lkIHNldFRvZ2dsZVNpemUoY29uc3QgUmVuZGVyVGhlbWVHdGsqIHRoZW1lLCBS
ZW5kZXJTdHlsZSogc3R5bGUsIENvbnRyb2xQYXJ0IGFwcGVhcmFuY2UpCit7CisgICAgLy8gVGhl
IHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggc3BlY2lmaWVkLCBzbyB3ZSBzaG91bGRuJ3QgY2hh
bmdlIHRoZW0uCisgICAgaWYgKCFzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpICYm
ICFzdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZJ
WE1FOiBUaGlzIGlzIHByb2JhYmx5IG5vdCBjb3JyZWN0IHVzZSBvZiBpbmRpY2F0b3JTaXplIGFu
ZCBpbmRpY2F0b3JTcGFjaW5nLgorICAgIGdpbnQgaW5kaWNhdG9yU2l6ZSwgaW5kaWNhdG9yU3Bh
Y2luZzsKKyAgICBpZiAoYXBwZWFyYW5jZSA9PSBDaGVja2JveFBhcnQpCisgICAgICAgIG1vel9n
dGtfY2hlY2tib3hfZ2V0X21ldHJpY3MoJmluZGljYXRvclNpemUsICZpbmRpY2F0b3JTcGFjaW5n
KTsKKyAgICBlbHNlCisgICAgICAgIG1vel9ndGtfcmFkaW9fZ2V0X21ldHJpY3MoJmluZGljYXRv
clNpemUsICZpbmRpY2F0b3JTcGFjaW5nKTsKKworICAgIC8vIE90aGVyIHBvcnRzIGhhcmQtY29k
ZSB0aGlzIHRvIDEzLCBidXQgR1RLKyB1c2VycyB0ZW5kIHRvIGRlbWFuZCB0aGUgbmF0aXZlIGxv
b2suCisgICAgLy8gSXQgY291bGQgYmUgbWFkZSBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHZhbHVl
cyBvdGhlciB0aGFuIDEzIGFjdHVhbGx5IGJyZWFrIHNpdGUgY29tcGF0aWJpbGl0eS4KKyAgICBp
bnQgbGVuZ3RoID0gaW5kaWNhdG9yU2l6ZSArIGluZGljYXRvclNwYWNpbmc7CisgICAgaWYgKHN0
eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpCisgICAgICAgIHN0eWxlLT5zZXRXaWR0
aChMZW5ndGgobGVuZ3RoLCBGaXhlZCkpOworCisgICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1
dG8oKSkKKyAgICAgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgobGVuZ3RoLCBGaXhlZCkpOwor
fQorCit2b2lkIFJlbmRlclRoZW1lR3RrOjpzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUqIHN0
eWxlKSBjb25zdAoreworICAgIHNldFRvZ2dsZVNpemUodGhpcywgc3R5bGUsIFJhZGlvUGFydCk7
Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50Q2hlY2tib3goUmVuZGVyT2JqZWN0KiBv
LCBjb25zdCBQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJu
IHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtfQ0hFQ0tCVVRUT04sIG8sIGkuY29udGV4dCwgcmVj
dCwgaXNDaGVja2VkKG8pKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0UmFkaW9TaXpl
KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBzZXRUb2dnbGVTaXplKHRoaXMsIHN0
eWxlLCBSYWRpb1BhcnQpOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFJhZGlvKFJl
bmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByZWN0KQor
eworICAgIHJldHVybiBwYWludFJlbmRlck9iamVjdChNT1pfR1RLX1JBRElPQlVUVE9OLCBvLCBp
LmNvbnRleHQsIHJlY3QsIGlzQ2hlY2tlZChvKSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6
OnBhaW50QnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBpLCBjb25zdCBJ
bnRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludFJlbmRlck9iamVjdChNT1pfR1RLX0JV
VFRPTiwgbywgaS5jb250ZXh0LCByZWN0LCBHVEtfUkVMSUVGX05PUk1BTCk7Cit9CisKK3N0YXRp
YyB2b2lkIGdldENvbWJvQm94UGFkZGluZyhSZW5kZXJTdHlsZSogc3R5bGUsIGludCYgbGVmdCwg
aW50JiB0b3AsIGludCYgcmlnaHQsIGludCYgYm90dG9tKQoreworICAgIC8vIElmIHRoaXMgbWVu
dSBsaXN0IGJ1dHRvbiBpc24ndCBkcmF3biB1c2luZyB0aGUgbmF0aXZlIHRoZW1lLCB3ZQorICAg
IC8vIGRvbid0IGFkZCBhbnkgZXh0cmEgcGFkZGluZyBiZXlvbmQgd2hhdCBXZWJDb3JlIGFscmVh
ZHkgdXNlcy4KKyAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBOb0NvbnRyb2xQYXJ0KQor
ICAgICAgICByZXR1cm47CisgICAgbW96X2d0a19nZXRfd2lkZ2V0X2JvcmRlcihNT1pfR1RLX0RS
T1BET1dOLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc3RhdGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlvbj4oUmVuZGVyVGhlbWVHdGs6
Omd0a1RleHREaXJlY3Rpb24oc3R5bGUtPmRpcmVjdGlvbigpKSksIFRSVUUpOworfQorCitpbnQg
UmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nTGVmdChSZW5kZXJTdHlsZSogc3R5
bGUpIGNvbnN0Cit7CisgICAgaW50IGxlZnQgPSAwLCB0b3AgPSAwLCByaWdodCA9IDAsIGJvdHRv
bSA9IDA7CisgICAgZ2V0Q29tYm9Cb3hQYWRkaW5nKHN0eWxlLCBsZWZ0LCB0b3AsIHJpZ2h0LCBi
b3R0b20pOworICAgIHJldHVybiBsZWZ0OworfQorCitpbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVw
SW50ZXJuYWxQYWRkaW5nUmlnaHQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIGlu
dCBsZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSAwLCBib3R0b20gPSAwOworICAgIGdldENvbWJv
Qm94UGFkZGluZyhzdHlsZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICByZXR1cm4g
cmlnaHQ7Cit9CisKK2ludCBSZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRpbmdUb3Ao
UmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIGludCBsZWZ0ID0gMCwgdG9wID0gMCwg
cmlnaHQgPSAwLCBib3R0b20gPSAwOworICAgIGdldENvbWJvQm94UGFkZGluZyhzdHlsZSwgbGVm
dCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICByZXR1cm4gdG9wOworfQorCitpbnQgUmVuZGVy
VGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nQm90dG9tKFJlbmRlclN0eWxlKiBzdHlsZSkg
Y29uc3QKK3sKKyAgICBpbnQgbGVmdCA9IDAsIHRvcCA9IDAsIHJpZ2h0ID0gMCwgYm90dG9tID0g
MDsKKyAgICBnZXRDb21ib0JveFBhZGRpbmcoc3R5bGUsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRv
bSk7CisgICAgcmV0dXJuIGJvdHRvbTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRN
ZW51TGlzdChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVj
dCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoTU9aX0dUS19EUk9QRE9X
TiwgbywgaS5jb250ZXh0LCByZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0VGV4
dElucHV0Qm9yZGVycyhSZW5kZXJTdHlsZSogc3R5bGUpCit7CisgICAgLy8gSWYgdGhpcyBjb250
cm9sIGlzbid0IGRyYXduIHVzaW5nIHRoZSBuYXRpdmUgdGhlbWUsIHdlIGRvbid0IHRvdWNoIHRo
ZSBib3JkZXJzLgorICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE5vQ29udHJvbFBhcnQp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIGNhbm5vdCBnaXZlIGEgcHJvcGVyIHJlbmRl
cmluZyB3aGVuIGJvcmRlciByYWRpdXMgaXMgYWN0aXZlLCB1bmZvcnR1bmF0ZWx5LgorICAgIHN0
eWxlLT5yZXNldEJvcmRlclJhZGl1cygpOworCisgICAgaW50IGxlZnQgPSAwLCB0b3AgPSAwLCBy
aWdodCA9IDAsIGJvdHRvbSA9IDA7CisgICAgbW96X2d0a19nZXRfd2lkZ2V0X2JvcmRlcihNT1pf
R1RLX0VOVFJZLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlvbj4oZ3RrVGV4dERpcmVj
dGlvbihzdHlsZS0+ZGlyZWN0aW9uKCkpKSwgVFJVRSk7CisgICAgc3R5bGUtPnNldEJvcmRlckxl
ZnRXaWR0aChsZWZ0KTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyVG9wV2lkdGgodG9wKTsKKyAgICBz
dHlsZS0+c2V0Qm9yZGVyUmlnaHRXaWR0aChyaWdodCk7CisgICAgc3R5bGUtPnNldEJvcmRlckJv
dHRvbVdpZHRoKGJvdHRvbSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50VGV4dEZp
ZWxkKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiBy
ZWN0KQoreworICAgIHJldHVybiBwYWludFJlbmRlck9iamVjdChNT1pfR1RLX0VOVFJZLCBvLCBp
LmNvbnRleHQsIHJlY3QpOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFNsaWRlclRy
YWNrKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IElu
dFJlY3QmIHJlY3QpCit7CisgICAgQ29udHJvbFBhcnQgcGFydCA9IG9iamVjdC0+c3R5bGUoKS0+
YXBwZWFyYW5jZSgpOworICAgIEFTU0VSVChwYXJ0ID09IFNsaWRlckhvcml6b250YWxQYXJ0IHx8
IHBhcnQgPT0gU2xpZGVyVmVydGljYWxQYXJ0KTsKKworICAgIEd0a1RoZW1lV2lkZ2V0VHlwZSBn
dGtQYXJ0ID0gTU9aX0dUS19TQ0FMRV9IT1JJWk9OVEFMOworICAgIGlmIChwYXJ0ID09IFNsaWRl
clZlcnRpY2FsUGFydCkKKyAgICAgICAgZ3RrUGFydCA9IE1PWl9HVEtfU0NBTEVfVkVSVElDQUw7
CisKKyAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoZ3RrUGFydCwgb2JqZWN0LCBpbmZvLmNv
bnRleHQsIHJlY3QpOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFNsaWRlclRodW1i
KFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJl
Y3QmIHJlY3QpCit7CisgICAgQ29udHJvbFBhcnQgcGFydCA9IG9iamVjdC0+c3R5bGUoKS0+YXBw
ZWFyYW5jZSgpOworICAgIEFTU0VSVChwYXJ0ID09IFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQg
fHwgcGFydCA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCk7CisKKyAgICBHdGtUaGVtZVdpZGdl
dFR5cGUgZ3RrUGFydCA9IE1PWl9HVEtfU0NBTEVfVEhVTUJfSE9SSVpPTlRBTDsKKyAgICBpZiAo
cGFydCA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCkKKyAgICAgICAgZ3RrUGFydCA9IE1PWl9H
VEtfU0NBTEVfVEhVTUJfVkVSVElDQUw7CisKKyAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3Qo
Z3RrUGFydCwgb2JqZWN0LCBpbmZvLmNvbnRleHQsIHJlY3QpOworfQorCit2b2lkIFJlbmRlclRo
ZW1lR3RrOjphZGp1c3RTbGlkZXJUaHVtYlNpemUoUmVuZGVyT2JqZWN0KiBvKSBjb25zdAorewor
ICAgIENvbnRyb2xQYXJ0IHBhcnQgPSBvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCk7CisjaWYgRU5B
QkxFKFZJREVPKQorICAgIGlmIChwYXJ0ID09IE1lZGlhU2xpZGVyVGh1bWJQYXJ0KSB7CisgICAg
ICAgIG8tPnN0eWxlKCktPnNldFdpZHRoKExlbmd0aChtX21lZGlhU2xpZGVyVGh1bWJXaWR0aCwg
Rml4ZWQpKTsKKyAgICAgICAgby0+c3R5bGUoKS0+c2V0SGVpZ2h0KExlbmd0aChtX21lZGlhU2xp
ZGVyVGh1bWJIZWlnaHQsIEZpeGVkKSk7CisgICAgfSBlbHNlCisjZW5kaWYKKyAgICBpZiAocGFy
dCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0IHx8IHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0
aWNhbFBhcnQpIHsKKyAgICAgICAgZ2ludCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBtb3pfZ3Rr
X2dldF9zY2FsZXRodW1iX21ldHJpY3MocGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0
ID8gR1RLX09SSUVOVEFUSU9OX0hPUklaT05UQUwgOiBHVEtfT1JJRU5UQVRJT05fVkVSVElDQUws
ICZ3aWR0aCwgJmhlaWdodCk7CisgICAgICAgIG8tPnN0eWxlKCktPnNldFdpZHRoKExlbmd0aCh3
aWR0aCwgRml4ZWQpKTsKKyAgICAgICAgby0+c3R5bGUoKS0+c2V0SGVpZ2h0KExlbmd0aChoZWln
aHQsIEZpeGVkKSk7CisgICAgfQorfQorCitDb2xvciBSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1B
Y3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIEd0a1dpZGdldCog
d2lkZ2V0ID0gZ3RrRW50cnkoKTsKKyAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lk
Z2V0KS0+YmFzZVtHVEtfU1RBVEVfU0VMRUNURURdOworfQorCitDb2xvciBSZW5kZXJUaGVtZUd0
azo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7Cisg
ICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtFbnRyeSgpOworICAgIHJldHVybiBndGtfd2lkZ2V0
X2dldF9zdHlsZSh3aWRnZXQpLT5iYXNlW0dUS19TVEFURV9BQ1RJVkVdOworfQorCitDb2xvciBS
ZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBj
b25zdAoreworICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrRW50cnkoKTsKKyAgICByZXR1cm4g
Z3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+dGV4dFtHVEtfU1RBVEVfU0VMRUNURURdOwor
fQorCitDb2xvciBSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkZvcmVn
cm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtFbnRyeSgp
OworICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT50ZXh0W0dUS19TVEFU
RV9BQ1RJVkVdOworfQorCitDb2xvciBSZW5kZXJUaGVtZUd0azo6YWN0aXZlTGlzdEJveFNlbGVj
dGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBn
dGtUcmVlVmlldygpOworICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT5i
YXNlW0dUS19TVEFURV9TRUxFQ1RFRF07Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjppbmFj
dGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIEd0a1dp
ZGdldCogd2lkZ2V0ID0gZ3RrVHJlZVZpZXcoKTsKKyAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRf
c3R5bGUod2lkZ2V0KS0+YmFzZVtHVEtfU1RBVEVfQUNUSVZFXTsKK30KKworQ29sb3IgUmVuZGVy
VGhlbWVHdGs6OmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAor
eworICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrVHJlZVZpZXcoKTsKKyAgICByZXR1cm4gZ3Rr
X3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+dGV4dFtHVEtfU1RBVEVfU0VMRUNURURdOworfQor
CitDb2xvciBSZW5kZXJUaGVtZUd0azo6aW5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3Vu
ZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a1RyZWVWaWV3KCk7
CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPnRleHRbR1RLX1NUQVRF
X0FDVElWRV07Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjpzeXN0ZW1Db2xvcihpbnQgY3Nz
VmFsdWVJZCkgY29uc3QKK3sKKyAgICBzd2l0Y2ggKGNzc1ZhbHVlSWQpIHsKKyAgICBjYXNlIENT
U1ZhbHVlQnV0dG9udGV4dDoKKyAgICAgICAgcmV0dXJuIENvbG9yKGd0a193aWRnZXRfZ2V0X3N0
eWxlKGd0a0J1dHRvbigpKS0+ZmdbR1RLX1NUQVRFX05PUk1BTF0pOworICAgIGNhc2UgQ1NTVmFs
dWVDYXB0aW9udGV4dDoKKyAgICAgICAgcmV0dXJuIENvbG9yKGd0a193aWRnZXRfZ2V0X3N0eWxl
KGd0a0VudHJ5KCkpLT5mZ1tHVEtfU1RBVEVfTk9STUFMXSk7CisgICAgZGVmYXVsdDoKKyAgICAg
ICAgcmV0dXJuIFJlbmRlclRoZW1lOjpzeXN0ZW1Db2xvcihjc3NWYWx1ZUlkKTsKKyAgICB9Cit9
CisKK3N0YXRpYyB2b2lkIGd0a1N0eWxlU2V0Q2FsbGJhY2soR3RrV2lkZ2V0KiB3aWRnZXQsIEd0
a1N0eWxlKiBwcmV2aW91cywgUmVuZGVyVGhlbWUqIHJlbmRlclRoZW1lKQoreworICAgIC8vIEZJ
WE1FOiBNYWtlIHN1cmUgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGdldCBjYWxsZWQgbWFueSB0aW1l
cyBmb3IgYSBzaW5nbGUgR1RLKyBzdHlsZSBjaGFuZ2Ugc2lnbmFsLgorICAgIHJlbmRlclRoZW1l
LT5wbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgpOworfQorCitHdGtDb250YWluZXIqIFJlbmRlclRo
ZW1lR3RrOjpndGtDb250YWluZXIoKSBjb25zdAoreworICAgIGlmIChtX2d0a0NvbnRhaW5lcikK
KyAgICAgICAgcmV0dXJuIG1fZ3RrQ29udGFpbmVyOworCisgICAgbV9ndGtXaW5kb3cgPSBndGtf
d2luZG93X25ldyhHVEtfV0lORE9XX1BPUFVQKTsKKyAgICBtX2d0a0NvbnRhaW5lciA9IEdUS19D
T05UQUlORVIoZ3RrX2ZpeGVkX25ldygpKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0KG1fZ3RrV2lu
ZG93LCAic3R5bGUtc2V0IiwgR19DQUxMQkFDSyhndGtTdHlsZVNldENhbGxiYWNrKSwgY29uc3Rf
Y2FzdDxSZW5kZXJUaGVtZUd0ayo+KHRoaXMpKTsKKyAgICBndGtfY29udGFpbmVyX2FkZChHVEtf
Q09OVEFJTkVSKG1fZ3RrV2luZG93KSwgR1RLX1dJREdFVChtX2d0a0NvbnRhaW5lcikpOworICAg
IGd0a193aWRnZXRfcmVhbGl6ZShtX2d0a1dpbmRvdyk7CisKKyAgICByZXR1cm4gbV9ndGtDb250
YWluZXI7Cit9CisKK0d0a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a0J1dHRvbigpIGNvbnN0
Cit7CisgICAgaWYgKG1fZ3RrQnV0dG9uKQorICAgICAgICByZXR1cm4gbV9ndGtCdXR0b247CisK
KyAgICBtX2d0a0J1dHRvbiA9IGd0a19idXR0b25fbmV3KCk7CisgICAgZ19zaWduYWxfY29ubmVj
dChtX2d0a0J1dHRvbiwgInN0eWxlLXNldCIsIEdfQ0FMTEJBQ0soZ3RrU3R5bGVTZXRDYWxsYmFj
ayksIGNvbnN0X2Nhc3Q8UmVuZGVyVGhlbWVHdGsqPih0aGlzKSk7CisgICAgZ3RrX2NvbnRhaW5l
cl9hZGQoZ3RrQ29udGFpbmVyKCksIG1fZ3RrQnV0dG9uKTsKKyAgICBndGtfd2lkZ2V0X3JlYWxp
emUobV9ndGtCdXR0b24pOworCisgICAgcmV0dXJuIG1fZ3RrQnV0dG9uOworfQorCitHdGtXaWRn
ZXQqIFJlbmRlclRoZW1lR3RrOjpndGtFbnRyeSgpIGNvbnN0Cit7CisgICAgaWYgKG1fZ3RrRW50
cnkpCisgICAgICAgIHJldHVybiBtX2d0a0VudHJ5OworCisgICAgbV9ndGtFbnRyeSA9IGd0a19l
bnRyeV9uZXcoKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0KG1fZ3RrRW50cnksICJzdHlsZS1zZXQi
LCBHX0NBTExCQUNLKGd0a1N0eWxlU2V0Q2FsbGJhY2spLCBjb25zdF9jYXN0PFJlbmRlclRoZW1l
R3RrKj4odGhpcykpOworICAgIGd0a19jb250YWluZXJfYWRkKGd0a0NvbnRhaW5lcigpLCBtX2d0
a0VudHJ5KTsKKyAgICBndGtfd2lkZ2V0X3JlYWxpemUobV9ndGtFbnRyeSk7CisKKyAgICByZXR1
cm4gbV9ndGtFbnRyeTsKK30KKworR3RrV2lkZ2V0KiBSZW5kZXJUaGVtZUd0azo6Z3RrVHJlZVZp
ZXcoKSBjb25zdAoreworICAgIGlmIChtX2d0a1RyZWVWaWV3KQorICAgICAgICByZXR1cm4gbV9n
dGtUcmVlVmlldzsKKworICAgIG1fZ3RrVHJlZVZpZXcgPSBndGtfdHJlZV92aWV3X25ldygpOwor
ICAgIGdfc2lnbmFsX2Nvbm5lY3QobV9ndGtUcmVlVmlldywgInN0eWxlLXNldCIsIEdfQ0FMTEJB
Q0soZ3RrU3R5bGVTZXRDYWxsYmFjayksIGNvbnN0X2Nhc3Q8UmVuZGVyVGhlbWVHdGsqPih0aGlz
KSk7CisgICAgZ3RrX2NvbnRhaW5lcl9hZGQoZ3RrQ29udGFpbmVyKCksIG1fZ3RrVHJlZVZpZXcp
OworICAgIGd0a193aWRnZXRfcmVhbGl6ZShtX2d0a1RyZWVWaWV3KTsKKworICAgIHJldHVybiBt
X2d0a1RyZWVWaWV3OworfQorCisjaWYgRU5BQkxFKFBST0dSRVNTX1RBRykKK2RvdWJsZSBSZW5k
ZXJUaGVtZUd0azo6YW5pbWF0aW9uUmVwZWF0SW50ZXJ2YWxGb3JQcm9ncmVzc0JhcihSZW5kZXJQ
cm9ncmVzcyopIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IEl0IGRvZXNuJ3QgbG9vayBsaWtlIHRo
ZXJlIGlzIGEgZ29vZCB3YXkgeWV0IHRvIHN1cHBvcnQgYW5pbWF0ZWQKKyAgICAvLyBwcm9ncmVz
cyBiYXJzIHdpdGggdGhlIE1vemlsbGEgdGhlbWUgZHJhd2luZyBjb2RlLgorICAgIHJldHVybiAw
OworfQorCitkb3VibGUgUmVuZGVyVGhlbWVHdGs6OmFuaW1hdGlvbkR1cmF0aW9uRm9yUHJvZ3Jl
c3NCYXIoUmVuZGVyUHJvZ3Jlc3MqKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBJdCBkb2Vzbid0
IGxvb2sgbGlrZSB0aGVyZSBpcyBhIGdvb2Qgd2F5IHlldCB0byBzdXBwb3J0IGFuaW1hdGVkCisg
ICAgLy8gcHJvZ3Jlc3MgYmFycyB3aXRoIHRoZSBNb3ppbGxhIHRoZW1lIGRyYXdpbmcgY29kZS4K
KyAgICByZXR1cm4gMDsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRQcm9ncmVzc0Jh
cihSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8s
IGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKCFyZW5kZXJPYmplY3QtPmlzUHJvZ3Jl
c3MoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBHdGtXaWRnZXQqIHByb2dyZXNzQmFy
V2lkZ2V0ID0gbW96X2d0a19nZXRfcHJvZ3Jlc3Nfd2lkZ2V0KCk7CisgICAgaWYgKCFwcm9ncmVz
c0JhcldpZGdldCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAocGFpbnRSZW5kZXJP
YmplY3QoTU9aX0dUS19QUk9HUkVTU0JBUiwgcmVuZGVyT2JqZWN0LCBwYWludEluZm8uY29udGV4
dCwgcmVjdCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgSW50UmVjdCBjaHVua1JlY3Qo
cmVjdCk7CisgICAgUmVuZGVyUHJvZ3Jlc3MqIHJlbmRlclByb2dyZXNzID0gdG9SZW5kZXJQcm9n
cmVzcyhyZW5kZXJPYmplY3QpOworCisgICAgR3RrU3R5bGUqIHN0eWxlID0gZ3RrX3dpZGdldF9n
ZXRfc3R5bGUocHJvZ3Jlc3NCYXJXaWRnZXQpOworICAgIGNodW5rUmVjdC5zZXRIZWlnaHQoY2h1
bmtSZWN0LmhlaWdodCgpIC0gKDIgKiBzdHlsZS0+eXRoaWNrbmVzcykpOworICAgIGNodW5rUmVj
dC5zZXRZKGNodW5rUmVjdC55KCkgKyBzdHlsZS0+eXRoaWNrbmVzcyk7CisgICAgY2h1bmtSZWN0
LnNldFdpZHRoKChjaHVua1JlY3Qud2lkdGgoKSAtICgyICogc3R5bGUtPnh0aGlja25lc3MpKSAq
IHJlbmRlclByb2dyZXNzLT5wb3NpdGlvbigpKTsKKyAgICBpZiAocmVuZGVyT2JqZWN0LT5zdHls
ZSgpLT5kaXJlY3Rpb24oKSA9PSBSVEwpCisgICAgICAgIGNodW5rUmVjdC5zZXRYKHJlY3QueCgp
ICsgcmVjdC53aWR0aCgpIC0gY2h1bmtSZWN0LndpZHRoKCkgLSBzdHlsZS0+eHRoaWNrbmVzcyk7
CisgICAgZWxzZQorICAgICAgICBjaHVua1JlY3Quc2V0WChjaHVua1JlY3QueCgpICsgc3R5bGUt
Pnh0aGlja25lc3MpOworCisgICAgcmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtfUFJP
R1JFU1NfQ0hVTkssIHJlbmRlck9iamVjdCwgcGFpbnRJbmZvLmNvbnRleHQsIGNodW5rUmVjdCk7
Cit9CisjZW5kaWYKKworfQorCisjZW5kaWYgLy8gR1RLX0FQSV9WRVJTSU9OXzIKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrMy5jcHAgYi9XZWJDb3JlL3Bs
YXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0azMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLmMxNmI1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2d0
ay9SZW5kZXJUaGVtZUd0azMuY3BwCkBAIC0wLDAgKzEsODgyIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA3IEFwcGxlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbHAgVG9rZXIgPGFs
cEBhdG9rZXIuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbGxhYm9yYSBMdGQuCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDkgS2VubmV0aCBSb2hkZSBDaHJpc3RpYW5zZW4KKyAqIENvcHlyaWdo
dCAoQykgMjAxMCBJZ2FsaWEgUy5MLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0
aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3Vs
ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5H
LkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24s
IEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAy
MTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBHVEtfQVBJX1ZFUlNJT05fMgorCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWVHdGsuaCIKKworI2luY2x1
ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRlICJHT3duUHRyLmgiCisjaW5jbHVkZSAi
R3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiR3RrVmVyc2lvbmluZy5oIgorI2luY2x1ZGUg
IkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIlJlbmRlckJveC5oIgorI2luY2x1ZGUgIlJlbmRlck9i
amVjdC5oIgorI2luY2x1ZGUgIlVzZXJBZ2VudFN0eWxlU2hlZXRzLmgiCisjaW5jbHVkZSA8Z3Rr
L2d0ay5oPgorCisjaWYgRU5BQkxFKFBST0dSRVNTX1RBRykKKyNpbmNsdWRlICJSZW5kZXJQcm9n
cmVzcy5oIgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKwordXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKKworLy8gQXMgZGVmaW5lZCBpbiBn
dGthcnJvdy5jCitzdGF0aWMgY29uc3QgaW50IG1pbkFycm93U2l6ZSA9IDE1OworCit0eXBlZGVm
IEhhc2hNYXA8R1R5cGUsIFBsYXRmb3JtUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4gPiBTdHlsZUNv
bnRleHRNYXA7CisKK3N0YXRpYyBTdHlsZUNvbnRleHRNYXAmIHN0eWxlQ29udGV4dE1hcCgpCit7
CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdHlsZUNvbnRleHRNYXAsIG1hcCwgKCkpOworICAg
IHJldHVybiBtYXA7Cit9CisKK3N0YXRpYyB2b2lkIGd0a1N0eWxlQ2hhbmdlZENhbGxiYWNrKEdP
YmplY3QqLCBHUGFyYW1TcGVjKiwgUmVuZGVyVGhlbWUqIHJlbmRlclRoZW1lKQoreworICAgIFN0
eWxlQ29udGV4dE1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gc3R5bGVDb250ZXh0TWFwKCkuZW5k
KCk7CisgICAgZm9yIChTdHlsZUNvbnRleHRNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBzdHls
ZUNvbnRleHRNYXAoKS5iZWdpbigpOyBpdGVyICE9IGVuZDsgKytpdGVyKQorICAgICAgICBndGtf
c3R5bGVfY29udGV4dF9pbnZhbGlkYXRlKGl0ZXItPnNlY29uZC5nZXQoKSk7CisKKyAgICByZW5k
ZXJUaGVtZS0+cGxhdGZvcm1Db2xvcnNEaWRDaGFuZ2UoKTsKK30KKworc3RhdGljIEd0a1N0eWxl
Q29udGV4dCogZ2V0U3R5bGVDb250ZXh0KEdUeXBlIGdUeXBlKQoreworICAgIGlmICghc3R5bGVD
b250ZXh0TWFwKCkuY29udGFpbnMoZ1R5cGUpKSB7CisgICAgICAgIEd0a1dpZGdldFBhdGgqIHBh
dGggPSBndGtfd2lkZ2V0X3BhdGhfbmV3KCk7CisgICAgICAgIGd0a193aWRnZXRfcGF0aF9hcHBl
bmRfdHlwZShwYXRoLCBnVHlwZSk7CisKKyAgICAgICAgUGxhdGZvcm1SZWZQdHI8R3RrU3R5bGVD
b250ZXh0PiBjb250ZXh0ID0gYWRvcHRQbGF0Zm9ybVJlZihndGtfc3R5bGVfY29udGV4dF9uZXco
KSk7CisgICAgICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9wYXRoKGNvbnRleHQuZ2V0KCksIHBh
dGgpOworICAgICAgICBndGtfd2lkZ2V0X3BhdGhfZnJlZShwYXRoKTsKKworICAgICAgICBzdHls
ZUNvbnRleHRNYXAoKS5zZXQoZ1R5cGUsIGNvbnRleHQpOworICAgICAgICByZXR1cm4gY29udGV4
dC5nZXQoKTsKKyAgICB9CisKKyAgICBTdHlsZUNvbnRleHRNYXA6Oml0ZXJhdG9yIGl0ZXIgPSBz
dHlsZUNvbnRleHRNYXAoKS5maW5kKGdUeXBlKTsKKyAgICByZXR1cm4gaXRlci0+c2Vjb25kLmdl
dCgpOworfQorCitSZW5kZXJUaGVtZUd0azo6UmVuZGVyVGhlbWVHdGsoKQorICAgIDogbV9wYW5l
bENvbG9yKENvbG9yOjp3aGl0ZSkKKyAgICAsIG1fc2xpZGVyQ29sb3IoQ29sb3I6OndoaXRlKQor
ICAgICwgbV9zbGlkZXJUaHVtYkNvbG9yKENvbG9yOjp3aGl0ZSkKKyAgICAsIG1fbWVkaWFJY29u
U2l6ZSgxNikKKyAgICAsIG1fbWVkaWFTbGlkZXJIZWlnaHQoMTQpCisgICAgLCBtX21lZGlhU2xp
ZGVyVGh1bWJXaWR0aCgxMikKKyAgICAsIG1fbWVkaWFTbGlkZXJUaHVtYkhlaWdodCgxMikKK3sK
KyAgICBHdGtTZXR0aW5ncyogc2V0dGluZ3MgPSBndGtfc2V0dGluZ3NfZ2V0X2RlZmF1bHQoKTsK
KworICAgIGdfc2lnbmFsX2Nvbm5lY3Qoc2V0dGluZ3MsICJub3RpZnk6Omd0ay10aGVtZS1uYW1l
IiwgR19DQUxMQkFDSyhndGtTdHlsZUNoYW5nZWRDYWxsYmFjayksIHRoaXMpOworICAgIGdfc2ln
bmFsX2Nvbm5lY3Qoc2V0dGluZ3MsICJub3RpZnk6Omd0ay1jb2xvci1zY2hlbWUiLCBHX0NBTExC
QUNLKGd0a1N0eWxlQ2hhbmdlZENhbGxiYWNrKSwgdGhpcyk7CisKKyNpZiBFTkFCTEUoVklERU8p
CisgICAgaW5pdE1lZGlhQ29sb3JzKCk7CisgICAgaW5pdE1lZGlhQnV0dG9ucygpOworI2VuZGlm
Cit9CisKK1JlbmRlclRoZW1lR3RrOjp+UmVuZGVyVGhlbWVHdGsoKQoreworfQorCitHdGtTdHls
ZUNvbnRleHQqIFJlbmRlclRoZW1lR3RrOjpndGtTY3JvbGxiYXJTdHlsZSgpCit7CisgICAgcmV0
dXJuIGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9TQ1JPTExCQVIpOworfQorCitQbGF0Zm9ybVJl
ZlB0cjxHZGtQaXhidWY+IFJlbmRlclRoZW1lR3RrOjpnZXRTdG9ja0ljb24oR1R5cGUgZ1R5cGUs
IGNvbnN0IGNoYXIqIGljb25OYW1lLCBnaW50IGRpcmVjdGlvbiwgZ2ludCBzdGF0ZSwgZ2ludCBp
Y29uU2l6ZSkKK3sKKyAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQgPSBnZXRTdHlsZUNvbnRl
eHQoZ1R5cGUpOworICAgIEd0a0ljb25TZXQqIGljb25TZXQgPSBndGtfc3R5bGVfY29udGV4dF9s
b29rdXBfaWNvbl9zZXQoY29udGV4dCwgaWNvbk5hbWUpOworCisgICAgZ3RrX3N0eWxlX2NvbnRl
eHRfc2F2ZShjb250ZXh0KTsKKworICAgIGd1aW50IGZsYWdzID0gMDsKKyAgICBzd2l0Y2ggKHN0
YXRlKSB7CisgICAgY2FzZSBHVEtfU1RBVEVfUFJFTElHSFQ6CisgICAgICAgIGZsYWdzIHw9IEdU
S19TVEFURV9GTEFHX1BSRUxJR0hUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdUS19TVEFU
RV9JTlNFTlNJVElWRToKKyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfSU5TRU5TSVRJ
VkU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0K
KworICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9zdGF0ZShjb250ZXh0LCBzdGF0aWNfY2FzdDxH
dGtTdGF0ZUZsYWdzPihmbGFncykpOworICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9kaXJlY3Rp
b24oY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlvbj4oZGlyZWN0aW9uKSk7Cisg
ICAgUGxhdGZvcm1SZWZQdHI8R2RrUGl4YnVmPiBpY29uID0gYWRvcHRQbGF0Zm9ybVJlZihndGtf
aWNvbl9zZXRfcmVuZGVyX2ljb25fcGl4YnVmKGljb25TZXQsIGNvbnRleHQsIHN0YXRpY19jYXN0
PEd0a0ljb25TaXplPihpY29uU2l6ZSkpKTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3Rv
cmUoY29udGV4dCk7CisKKyAgICByZXR1cm4gaWNvbjsKK30KKworc3RhdGljIHZvaWQgc2V0VG9n
Z2xlU2l6ZShHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQsIFJlbmRlclN0eWxlKiBzdHlsZSkKK3sK
KyAgICAvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBhcmUgYm90aCBzcGVjaWZpZWQsIHNvIHdlIHNo
b3VsZG4ndCBjaGFuZ2UgdGhlbS4KKyAgICBpZiAoIXN0eWxlLT53aWR0aCgpLmlzSW50cmluc2lj
T3JBdXRvKCkgJiYgIXN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgLy8gRklYTUU6IFRoaXMgaXMgcHJvYmFibHkgbm90IGNvcnJlY3QgdXNlIG9mIGluZGlj
YXRvclNpemUgYW5kIGluZGljYXRvclNwYWNpbmcuCisgICAgZ2ludCBpbmRpY2F0b3JTaXplLCBp
bmRpY2F0b3JTcGFjaW5nOworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShjb250ZXh0
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kaWNhdG9yLXNpemUiLCAmaW5k
aWNhdG9yU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZGljYXRvci1z
cGFjaW5nIiwgJmluZGljYXRvclNwYWNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDApOworCisgICAgLy8gT3RoZXIgcG9ydHMgaGFyZC1jb2RlIHRoaXMgdG8gMTMsIGJ1dCBH
VEsrIHVzZXJzIHRlbmQgdG8gZGVtYW5kIHRoZSBuYXRpdmUgbG9vay4KKyAgICAvLyBJdCBjb3Vs
ZCBiZSBtYWRlIGEgY29uZmlndXJhdGlvbiBvcHRpb24gdmFsdWVzIG90aGVyIHRoYW4gMTMgYWN0
dWFsbHkgYnJlYWsgc2l0ZSBjb21wYXRpYmlsaXR5LgorICAgIGludCBsZW5ndGggPSBpbmRpY2F0
b3JTaXplICsgaW5kaWNhdG9yU3BhY2luZzsKKyAgICBpZiAoc3R5bGUtPndpZHRoKCkuaXNJbnRy
aW5zaWNPckF1dG8oKSkKKyAgICAgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChsZW5ndGgsIEZp
eGVkKSk7CisKKyAgICBpZiAoc3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKQorICAgICAgICBzdHls
ZS0+c2V0SGVpZ2h0KExlbmd0aChsZW5ndGgsIEZpeGVkKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBh
aW50VG9nZ2xlKGNvbnN0IFJlbmRlclRoZW1lR3RrKiB0aGVtZSwgR1R5cGUgZ1R5cGUsIFJlbmRl
ck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3Qg
SW50UmVjdCYgcmVjdCkKK3sKKyAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQgPSBnZXRTdHls
ZUNvbnRleHQoZ1R5cGUpOworICAgIGd0a19zdHlsZV9jb250ZXh0X3NhdmUoY29udGV4dCk7CisK
KyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfZGlyZWN0aW9uKGNvbnRleHQsIHN0YXRpY19jYXN0
PEd0a1RleHREaXJlY3Rpb24+KFJlbmRlclRoZW1lR3RrOjpndGtUZXh0RGlyZWN0aW9uKHJlbmRl
ck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKSk7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRf
YWRkX2NsYXNzKGNvbnRleHQsIGdUeXBlID09IEdUS19UWVBFX0NIRUNLX0JVVFRPTiA/IEdUS19T
VFlMRV9DTEFTU19DSEVDSyA6IEdUS19TVFlMRV9DTEFTU19SQURJTyk7CisKKyAgICBnaW50IGlu
ZGljYXRvclNpemUsIGluZGljYXRvclNwYWNpbmc7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0
X3N0eWxlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRpY2F0
b3Itc2l6ZSIsICZpbmRpY2F0b3JTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAiaW5kaWNhdG9yLXNwYWNpbmciLCAmaW5kaWNhdG9yU3BhY2luZywKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgMCk7CisgICAgSW50UmVjdCBpbmRpY2F0b3JSZWN0KHJlY3QueCgp
LCByZWN0LnkoKSArIChyZWN0LmhlaWdodCgpIC0gaW5kaWNhdG9yU2l6ZSksIGluZGljYXRvclNp
emUsIGluZGljYXRvclNpemUpOworCisgICAgZ3VpbnQgZmxhZ3MgPSAwOworICAgIGlmICh0aGVt
ZS0+aXNDaGVja2VkKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9G
TEFHX0FDVElWRTsKKyAgICBpZiAodGhlbWUtPmlzUHJlc3NlZChyZW5kZXJPYmplY3QpKQorICAg
ICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19TRUxFQ1RFRDsKKyAgICBpZiAodGhlbWUtPmlz
SG92ZXJlZChyZW5kZXJPYmplY3QpKQorICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19Q
UkVMSUdIVDsKKyAgICBlbHNlIGlmICghdGhlbWUtPmlzRW5hYmxlZChyZW5kZXJPYmplY3QpIHx8
IHRoZW1lLT5pc1JlYWRPbmx5Q29udHJvbChyZW5kZXJPYmplY3QpKQorICAgICAgICBmbGFncyB8
PSBHVEtfU1RBVEVfSU5TRU5TSVRJVkU7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0YXRl
KGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSk7CisKKyAgICBpZiAo
Z1R5cGUgPT0gR1RLX1RZUEVfQ0hFQ0tfQlVUVE9OKSB7CisgICAgICAgIGd0a19yZW5kZXJfY2hl
Y2soY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBpbmRpY2F0
b3JSZWN0LngoKSwgaW5kaWNhdG9yUmVjdC55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAg
aW5kaWNhdG9yUmVjdC53aWR0aCgpLCBpbmRpY2F0b3JSZWN0LmhlaWdodCgpKTsKKyAgICB9IGVs
c2UgeworICAgICAgICBndGtfcmVuZGVyX29wdGlvbihjb250ZXh0LCBwYWludEluZm8uY29udGV4
dC0+cGxhdGZvcm1Db250ZXh0KCksIGluZGljYXRvclJlY3QueCgpLCBpbmRpY2F0b3JSZWN0Lnko
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yUmVjdC53aWR0aCgpLCBpbmRp
Y2F0b3JSZWN0LmhlaWdodCgpKTsKKyAgICB9CisKKyAgICBpZiAodGhlbWUtPmlzRm9jdXNlZChy
ZW5kZXJPYmplY3QpKSB7CisgICAgICAgIGluZGljYXRvclJlY3QuaW5mbGF0ZShpbmRpY2F0b3JT
cGFjaW5nKTsKKyAgICAgICAgZ3RrX3JlbmRlcl9mb2N1cyhjb250ZXh0LCBwYWludEluZm8uY29u
dGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIGluZGljYXRvclJlY3QueCgpLCBpbmRpY2F0b3JSZWN0
LnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3JSZWN0LndpZHRoKCksIGlu
ZGljYXRvclJlY3QuaGVpZ2h0KCkpOworICAgIH0KKworICAgIGd0a19zdHlsZV9jb250ZXh0X3Jl
c3RvcmUoY29udGV4dCk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6OnNldENoZWNrYm94U2l6
ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgc2V0VG9nZ2xlU2l6ZShnZXRTdHls
ZUNvbnRleHQoR1RLX1RZUEVfQ0hFQ0tfQlVUVE9OKSwgc3R5bGUpOworfQorCitib29sIFJlbmRl
clRoZW1lR3RrOjpwYWludENoZWNrYm94KFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25z
dCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAo
cGFpbnRJbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgcGFpbnRUb2dnbGUodGhpcywgR1RLX1RZUEVfQ0hFQ0tfQlVUVE9OLCByZW5k
ZXJPYmplY3QsIHBhaW50SW5mbywgcmVjdCk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3Zv
aWQgUmVuZGVyVGhlbWVHdGs6OnNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0
Cit7CisgICAgc2V0VG9nZ2xlU2l6ZShnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfUkFESU9fQlVU
VE9OKSwgc3R5bGUpOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFJhZGlvKFJlbmRl
ck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3Qg
SW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRJbmZvLmNvbnRleHQtPnBhaW50aW5nRGlz
YWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcGFpbnRUb2dnbGUodGhpcywg
R1RLX1RZUEVfUkFESU9fQlVUVE9OLCByZW5kZXJPYmplY3QsIHBhaW50SW5mbywgcmVjdCk7CisK
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50QnV0dG9u
KFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywg
Y29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRJbmZvLmNvbnRleHQtPnBhaW50
aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgR3RrU3R5bGVDb250
ZXh0KiBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX0JVVFRPTik7CisgICAgZ3Rr
X3N0eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3Nl
dF9kaXJlY3Rpb24oY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlvbj4oZ3RrVGV4
dERpcmVjdGlvbihyZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpKSkpOworICAgIGd0
a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfQlVUVE9O
KTsKKworICAgIEludFJlY3QgYnV0dG9uUmVjdCA9IHJlY3Q7CisKKyAgICBnYm9vbGVhbiBpbnRl
cmlvckZvY3VzOworICAgIGdpbnQgZm9jdXNXaWR0aCwgZm9jdXNQYWQ7CisgICAgZ3RrX3N0eWxl
X2NvbnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICJmb2N1cy1saW5lLXdpZHRoIiwgJmZvY3VzV2lkdGgsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICJmb2N1cy1wYWRkaW5nIiwgJmZvY3VzUGFkLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAiaW50ZXJpb3ItZm9jdXMiLCAmaW50ZXJpb3JGb2N1cywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgICBpZiAoaXNEZWZhdWx0KHJlbmRl
ck9iamVjdCkpIHsKKyAgICAgICAgR3RrQm9yZGVyKiBib3JkZXJQdHIgPSAwOworICAgICAgICBH
dGtCb3JkZXIgYm9yZGVyID0geyAxLCAxLCAxLCAxIH07CisKKyAgICAgICAgZ3RrX3N0eWxlX2Nv
bnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsICJkZWZhdWx0LWJvcmRlciIsICZib3JkZXJQdHIsIDAp
OworICAgICAgICBpZiAoYm9yZGVyUHRyKSB7CisgICAgICAgICAgICBib3JkZXIgPSAqYm9yZGVy
UHRyOworICAgICAgICAgICAgZ3RrX2JvcmRlcl9mcmVlKGJvcmRlclB0cik7CisgICAgICAgIH0K
KworICAgICAgICBidXR0b25SZWN0Lm1vdmUoYm9yZGVyLmxlZnQsIGJvcmRlci50b3ApOworICAg
ICAgICBidXR0b25SZWN0LnNldFdpZHRoKGJ1dHRvblJlY3Qud2lkdGgoKSAtIChib3JkZXIubGVm
dCArIGJvcmRlci5yaWdodCkpOworICAgICAgICBidXR0b25SZWN0LnNldEhlaWdodChidXR0b25S
ZWN0LmhlaWdodCgpIC0gKGJvcmRlci50b3AgKyBib3JkZXIuYm90dG9tKSk7CisKKyAgICAgICAg
Z3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19ERUZB
VUxUKTsKKyAgICB9CisKKyAgICBpZiAoIWludGVyaW9yRm9jdXMgJiYgaXNGb2N1c2VkKHJlbmRl
ck9iamVjdCkpCisgICAgICAgIGJ1dHRvblJlY3QuaW5mbGF0ZSgtKGZvY3VzV2lkdGggKyBmb2N1
c1BhZCkpOworCisgICAgZ3VpbnQgZmxhZ3MgPSAwOworICAgIGlmICghaXNFbmFibGVkKHJlbmRl
ck9iamVjdCkgfHwgaXNSZWFkT25seUNvbnRyb2wocmVuZGVyT2JqZWN0KSkKKyAgICAgICAgZmxh
Z3MgfD0gR1RLX1NUQVRFX0ZMQUdfSU5TRU5TSVRJVkU7CisgICAgZWxzZSBpZiAoaXNQcmVzc2Vk
KHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX0FDVElWRTsK
KyAgICBlbHNlIGlmIChpc0hvdmVyZWQocmVuZGVyT2JqZWN0KSkKKyAgICAgICAgZmxhZ3MgfD0g
R1RLX1NUQVRFX0ZMQUdfUFJFTElHSFQ7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0YXRl
KGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSk7CisKKyAgICBndGtf
cmVuZGVyX2JhY2tncm91bmQoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29u
dGV4dCgpLCBidXR0b25SZWN0LngoKSwgYnV0dG9uUmVjdC55KCksIGJ1dHRvblJlY3Qud2lkdGgo
KSwgYnV0dG9uUmVjdC5oZWlnaHQoKSk7CisgICAgZ3RrX3JlbmRlcl9mcmFtZShjb250ZXh0LCBw
YWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIGJ1dHRvblJlY3QueCgpLCBidXR0
b25SZWN0LnkoKSwgYnV0dG9uUmVjdC53aWR0aCgpLCBidXR0b25SZWN0LmhlaWdodCgpKTsKKwor
ICAgIGlmIChpc0ZvY3VzZWQocmVuZGVyT2JqZWN0KSkgeworICAgICAgICBpZiAoaW50ZXJpb3JG
b2N1cykgeworICAgICAgICAgICAgR3RrQm9yZGVyIGJvcmRlcldpZHRoOworICAgICAgICAgICAg
Z3RrX3N0eWxlX2NvbnRleHRfZ2V0X2JvcmRlcihjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0
ZUZsYWdzPihmbGFncyksICZib3JkZXJXaWR0aCk7CisKKyAgICAgICAgICAgIGJ1dHRvblJlY3Qu
bW92ZShib3JkZXJXaWR0aC5sZWZ0ICsgZm9jdXNQYWQsIGJvcmRlcldpZHRoLnRvcCArIGZvY3Vz
UGFkKTsKKyAgICAgICAgICAgIGJ1dHRvblJlY3Quc2V0V2lkdGgoYnV0dG9uUmVjdC53aWR0aCgp
IC0gKDIgKiBmb2N1c1BhZCArIGJvcmRlcldpZHRoLmxlZnQgKyBib3JkZXJXaWR0aC5yaWdodCkp
OworICAgICAgICAgICAgYnV0dG9uUmVjdC5zZXRIZWlnaHQoYnV0dG9uUmVjdC5oZWlnaHQoKSAt
ICgyICogZm9jdXNQYWQgKyBib3JkZXJXaWR0aC50b3AgKyBib3JkZXJXaWR0aC5ib3R0b20pKTsK
KyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBidXR0b25SZWN0LmluZmxhdGUoZm9jdXNXaWR0
aCArIGZvY3VzUGFkKTsKKworICAgICAgICBndGtfcmVuZGVyX2ZvY3VzKGNvbnRleHQsIHBhaW50
SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgYnV0dG9uUmVjdC54KCksIGJ1dHRvblJl
Y3QueSgpLCBidXR0b25SZWN0LndpZHRoKCksIGJ1dHRvblJlY3QuaGVpZ2h0KCkpOworICAgIH0K
KworICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4dCk7CisKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGdldENvbWJvQm94TWV0cmljcyhSZW5kZXJTdHlsZSog
c3R5bGUsIEd0a0JvcmRlciYgYm9yZGVyLCBpbnQmIGZvY3VzLCBpbnQmIHNlcGFyYXRvcikKK3sK
KyAgICAvLyBJZiB0aGlzIG1lbnUgbGlzdCBidXR0b24gaXNuJ3QgZHJhd24gdXNpbmcgdGhlIG5h
dGl2ZSB0aGVtZSwgd2UKKyAgICAvLyBkb24ndCBhZGQgYW55IGV4dHJhIHBhZGRpbmcgYmV5b25k
IHdoYXQgV2ViQ29yZSBhbHJlYWR5IHVzZXMuCisgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkg
PT0gTm9Db250cm9sUGFydCkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3RrU3R5bGVDb250ZXh0
KiBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX0JVVFRPTik7CisgICAgZ3RrX3N0
eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9j
bGFzcyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfQlVUVE9OKTsKKworICAgIEd0a0JvcmRlciBi
b3JkZXJXaWR0aDsKKyAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfYm9yZGVyKGNvbnRleHQsIHN0
YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KDApLCAmYm9yZGVyV2lkdGgpOworICAgIGJvcmRlciA9
IGJvcmRlcldpZHRoOworCisgICAgZ2ludCBmb2N1c1dpZHRoLCBmb2N1c1BhZDsKKyAgICBndGtf
c3R5bGVfY29udGV4dF9nZXRfc3R5bGUoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgImZvY3VzLWxpbmUtd2lkdGgiLCAmZm9jdXNXaWR0aCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgImZvY3VzLXBhZGRpbmciLCAmZm9jdXNQYWQsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgZm9jdXMgPSBmb2N1c1dpZHRoICsgZm9j
dXNQYWQ7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9yZXN0b3JlKGNvbnRleHQpOworCisgICAg
Y29udGV4dCA9IGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9TRVBBUkFUT1IpOworICAgIGd0a19z
dHlsZV9jb250ZXh0X3NhdmUoY29udGV4dCk7CisKKyAgICBHdGtUZXh0RGlyZWN0aW9uIGRpcmVj
dGlvbiA9IHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rpb24+KFJlbmRlclRoZW1lR3RrOjpndGtU
ZXh0RGlyZWN0aW9uKHN0eWxlLT5kaXJlY3Rpb24oKSkpOworICAgIGd0a19zdHlsZV9jb250ZXh0
X3NldF9kaXJlY3Rpb24oY29udGV4dCwgZGlyZWN0aW9uKTsKKyAgICBndGtfc3R5bGVfY29udGV4
dF9hZGRfY2xhc3MoY29udGV4dCwgInNlcGFyYXRvciIpOworICAgIGd0a19zdHlsZV9jb250ZXh0
X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfQlVUVE9OKTsKKworICAgIGdib29s
ZWFuIHdpZGVTZXBhcmF0b3JzOworICAgIGdpbnQgc2VwYXJhdG9yV2lkdGg7CisgICAgZ3RrX3N0
eWxlX2NvbnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICJ3aWRlLXNlcGFyYXRvcnMiLCAmd2lkZVNlcGFyYXRvcnMsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3Itd2lkdGgiLCAmc2VwYXJhdG9yV2lkdGgsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgaWYgKCF3aWRlU2VwYXJh
dG9ycykKKyAgICAgICAgc2VwYXJhdG9yV2lkdGggPSBib3JkZXIubGVmdDsKKworICAgIHNlcGFy
YXRvciA9IHNlcGFyYXRvcldpZHRoOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShj
b250ZXh0KTsKK30KKworaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ0xl
ZnQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIEd0a0JvcmRlciBib3JkZXJXaWR0
aCA9IHsgMCwgMCwgMCwgMCB9OworICAgIGludCBmb2N1c1dpZHRoID0gMCwgc2VwYXJhdG9yV2lk
dGggPSAwOworICAgIGdldENvbWJvQm94TWV0cmljcyhzdHlsZSwgYm9yZGVyV2lkdGgsIGZvY3Vz
V2lkdGgsIHNlcGFyYXRvcldpZHRoKTsKKyAgICBpbnQgbGVmdCA9IGJvcmRlcldpZHRoLmxlZnQg
KyBmb2N1c1dpZHRoOworICAgIGlmIChzdHlsZS0+ZGlyZWN0aW9uKCkgPT0gUlRMKQorICAgICAg
ICBsZWZ0ICs9IHNlcGFyYXRvcldpZHRoICsgbWluQXJyb3dTaXplOworICAgIHJldHVybiBsZWZ0
OworfQorCitpbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nUmlnaHQoUmVu
ZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIEd0a0JvcmRlciBib3JkZXJXaWR0aCA9IHsg
MCwgMCwgMCwgMCB9OworICAgIGludCBmb2N1c1dpZHRoID0gMCwgc2VwYXJhdG9yV2lkdGggPSAw
OworICAgIGdldENvbWJvQm94TWV0cmljcyhzdHlsZSwgYm9yZGVyV2lkdGgsIGZvY3VzV2lkdGgs
IHNlcGFyYXRvcldpZHRoKTsKKyAgICBpbnQgcmlnaHQgPSBib3JkZXJXaWR0aC5yaWdodCArIGZv
Y3VzV2lkdGg7CisgICAgaWYgKHN0eWxlLT5kaXJlY3Rpb24oKSA9PSBMVFIpCisgICAgICAgIHJp
Z2h0ICs9IHNlcGFyYXRvcldpZHRoICsgbWluQXJyb3dTaXplOworICAgIHJldHVybiByaWdodDsK
K30KKworaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ1RvcChSZW5kZXJT
dHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgR3RrQm9yZGVyIGJvcmRlcldpZHRoID0geyAwLCAw
LCAwLCAwIH07CisgICAgaW50IGZvY3VzV2lkdGggPSAwLCBzZXBhcmF0b3JXaWR0aCA9IDA7Cisg
ICAgZ2V0Q29tYm9Cb3hNZXRyaWNzKHN0eWxlLCBib3JkZXJXaWR0aCwgZm9jdXNXaWR0aCwgc2Vw
YXJhdG9yV2lkdGgpOworICAgIHJldHVybiBib3JkZXJXaWR0aC50b3AgKyBmb2N1c1dpZHRoOwor
fQorCitpbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nQm90dG9tKFJlbmRl
clN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBHdGtCb3JkZXIgYm9yZGVyV2lkdGggPSB7IDAs
IDAsIDAsIDAgfTsKKyAgICBpbnQgZm9jdXNXaWR0aCA9IDAsIHNlcGFyYXRvcldpZHRoID0gMDsK
KyAgICBnZXRDb21ib0JveE1ldHJpY3Moc3R5bGUsIGJvcmRlcldpZHRoLCBmb2N1c1dpZHRoLCBz
ZXBhcmF0b3JXaWR0aCk7CisgICAgcmV0dXJuIGJvcmRlcldpZHRoLmJvdHRvbSArIGZvY3VzV2lk
dGg7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0
KiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0
JiByZWN0KQoreworICAgIGlmIChwYWludEluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBHdGtUZXh0RGlyZWN0aW9uIGRpcmVjdGlv
biA9IHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rpb24+KGd0a1RleHREaXJlY3Rpb24ocmVuZGVy
T2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpOworICAgIEd0a1N0eWxlQ29udGV4dCogY29u
dGV4dCA9IGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9CVVRUT04pOworICAgIGd0a19zdHlsZV9j
b250ZXh0X3NhdmUoY29udGV4dCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfZGlyZWN0
aW9uKGNvbnRleHQsIGRpcmVjdGlvbik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNz
KGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19CVVRUT04pOworCisgICAgSW50UmVjdCBjb21ib1Jl
Y3QgPSByZWN0OworCisgICAgZ3VpbnQgZmxhZ3MgPSAwOworICAgIGlmICghaXNFbmFibGVkKHJl
bmRlck9iamVjdCkgfHwgaXNSZWFkT25seUNvbnRyb2wocmVuZGVyT2JqZWN0KSkKKyAgICAgICAg
ZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfSU5TRU5TSVRJVkU7CisgICAgZWxzZSBpZiAoaXNQcmVz
c2VkKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX0FDVElW
RTsKKyAgICBlbHNlIGlmIChpc0hvdmVyZWQocmVuZGVyT2JqZWN0KSkKKyAgICAgICAgZmxhZ3Mg
fD0gR1RLX1NUQVRFX0ZMQUdfUFJFTElHSFQ7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0
YXRlKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSk7CisKKyAgICBn
dGtfcmVuZGVyX2JhY2tncm91bmQoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3Jt
Q29udGV4dCgpLCBjb21ib1JlY3QueCgpLCBjb21ib1JlY3QueSgpLCBjb21ib1JlY3Qud2lkdGgo
KSwgY29tYm9SZWN0LmhlaWdodCgpKTsKKyAgICBndGtfcmVuZGVyX2ZyYW1lKGNvbnRleHQsIHBh
aW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgY29tYm9SZWN0LngoKSwgY29tYm9S
ZWN0LnkoKSwgY29tYm9SZWN0LndpZHRoKCksIGNvbWJvUmVjdC5oZWlnaHQoKSk7CisKKyAgICBH
dGtCb3JkZXIgYm9yZGVyV2lkdGg7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X2JvcmRlcihj
b250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPihmbGFncyksICZib3JkZXJXaWR0aCk7
CisKKyAgICBnaW50IGZvY3VzV2lkdGgsIGZvY3VzUGFkOworICAgIEd0a0JvcmRlciogaW5uZXJC
b3JkZXJQdHIgPSAwOworICAgIEd0a0JvcmRlciBpbm5lckJvcmRlciA9IHsgMSwgMSwgMSwgMSB9
OworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShjb250ZXh0LAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAiaW5uZXItYm9yZGVyIiwgJmlubmVyQm9yZGVyUHRyLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9jdXMtbGluZS13aWR0aCIsICZmb2N1c1dp
ZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9jdXMtcGFkZGluZyIsICZm
b2N1c1BhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKGlu
bmVyQm9yZGVyUHRyKSB7CisgICAgICAgIGlubmVyQm9yZGVyID0gKmlubmVyQm9yZGVyUHRyOwor
ICAgICAgICBndGtfYm9yZGVyX2ZyZWUoaW5uZXJCb3JkZXJQdHIpOworICAgIH0KKworICAgIGlm
IChpc0ZvY3VzZWQocmVuZGVyT2JqZWN0KSkgeworICAgICAgICBJbnRSZWN0IGZvY3VzUmVjdCA9
IGNvbWJvUmVjdDsKKyAgICAgICAgZm9jdXNSZWN0Lm1vdmUoYm9yZGVyV2lkdGgubGVmdCArIGZv
Y3VzUGFkLCBib3JkZXJXaWR0aC50b3AgKyBmb2N1c1BhZCk7CisgICAgICAgIGZvY3VzUmVjdC5z
ZXRXaWR0aChmb2N1c1JlY3Qud2lkdGgoKSAtICgyICogZm9jdXNQYWQgKyBib3JkZXJXaWR0aC5s
ZWZ0ICsgYm9yZGVyV2lkdGgucmlnaHQpKTsKKyAgICAgICAgZm9jdXNSZWN0LnNldEhlaWdodChm
b2N1c1JlY3QuaGVpZ2h0KCkgLSAoMiAqIGZvY3VzUGFkICsgYm9yZGVyV2lkdGgudG9wICsgYm9y
ZGVyV2lkdGguYm90dG9tKSk7CisgICAgICAgIGd0a19yZW5kZXJfZm9jdXMoY29udGV4dCwgcGFp
bnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBmb2N1c1JlY3QueCgpLCBmb2N1c1Jl
Y3QueSgpLCBmb2N1c1JlY3Qud2lkdGgoKSwgZm9jdXNSZWN0LmhlaWdodCgpKTsKKyAgICB9CisK
KyAgICBjb21ib1JlY3Quc2V0WChjb21ib1JlY3QueCgpICsgYm9yZGVyV2lkdGgubGVmdCArIGZv
Y3VzV2lkdGggKyBmb2N1c1BhZCk7CisgICAgaWYgKGRpcmVjdGlvbiA9PSBHVEtfVEVYVF9ESVJf
TFRSKQorICAgICAgICBjb21ib1JlY3Quc2V0WChjb21ib1JlY3QueCgpICsgaW5uZXJCb3JkZXIu
bGVmdCk7CisgICAgZWxzZQorICAgICAgICBjb21ib1JlY3Quc2V0WChjb21ib1JlY3QueCgpICsg
aW5uZXJCb3JkZXIucmlnaHQpOworICAgIGNvbWJvUmVjdC5zZXRZKGNvbWJvUmVjdC55KCkgKyBp
bm5lckJvcmRlci50b3AgKyBib3JkZXJXaWR0aC50b3AgKyBmb2N1c1dpZHRoICsgZm9jdXNQYWQp
OworICAgIGNvbWJvUmVjdC5zZXRXaWR0aChtYXgoMSwgY29tYm9SZWN0LndpZHRoKCkgLSBpbm5l
ckJvcmRlci5sZWZ0IC0gaW5uZXJCb3JkZXIucmlnaHQgLSAoMiAqIChmb2N1c1dpZHRoICsgZm9j
dXNQYWQpICsgYm9yZGVyV2lkdGgubGVmdCArIGJvcmRlcldpZHRoLnJpZ2h0KSkpOworICAgIGNv
bWJvUmVjdC5zZXRIZWlnaHQobWF4KDEsIGNvbWJvUmVjdC5oZWlnaHQoKSAtIGlubmVyQm9yZGVy
LnRvcCAtIGlubmVyQm9yZGVyLmJvdHRvbSAtICgyICogKGZvY3VzV2lkdGggKyBmb2N1c1BhZCkg
KyBib3JkZXJXaWR0aC50b3AgKyBib3JkZXJXaWR0aC5ib3R0b20pKSk7CisKKyAgICBndGtfc3R5
bGVfY29udGV4dF9yZXN0b3JlKGNvbnRleHQpOworCisgICAgY29udGV4dCA9IGdldFN0eWxlQ29u
dGV4dChHVEtfVFlQRV9BUlJPVyk7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0
KTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9kaXJlY3Rpb24oY29udGV4dCwgZGlyZWN0
aW9uKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MoY29udGV4dCwgImFycm93Iik7
CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFT
U19CVVRUT04pOworCisgICAgZ2Zsb2F0IGFycm93U2NhbGluZzsKKyAgICBndGtfc3R5bGVfY29u
dGV4dF9nZXRfc3R5bGUoY29udGV4dCwgImFycm93LXNjYWxpbmciLCAmYXJyb3dTY2FsaW5nLCAw
KTsKKworICAgIGlmIChkaXJlY3Rpb24gPT0gR1RLX1RFWFRfRElSX0xUUikKKyAgICAgICAgY29t
Ym9SZWN0LnNldFgoY29tYm9SZWN0LngoKSArIGNvbWJvUmVjdC53aWR0aCgpIC0gbWluQXJyb3dT
aXplKTsKKyAgICBjb21ib1JlY3Quc2V0V2lkdGgobWluQXJyb3dTaXplKTsKKworICAgIEludFJl
Y3QgaW5uZXJSZWN0ID0gY29tYm9SZWN0OworCisgICAgZ2ludCBleHRlbnQgPSBtaW4oY29tYm9S
ZWN0LndpZHRoKCksIGNvbWJvUmVjdC5oZWlnaHQoKSkgKiBhcnJvd1NjYWxpbmc7CisgICAgZ2Zs
b2F0IHhhbGlnbiA9IDAuNTsKKyAgICBnZmxvYXQgeWFsaWduID0gMC41OworICAgIGlmIChkaXJl
Y3Rpb24gIT0gR1RLX1RFWFRfRElSX0xUUikKKyAgICAgICAgeGFsaWduID0gMS4wIC0geGFsaWdu
OworICAgIGlubmVyUmVjdC5zZXRYKGZsb29yKGNvbWJvUmVjdC54KCkgKyAoY29tYm9SZWN0Lndp
ZHRoKCkgLSBleHRlbnQpICogeGFsaWduKSk7CisgICAgaW5uZXJSZWN0LnNldFkoZmxvb3IoY29t
Ym9SZWN0LnkoKSArIChjb21ib1JlY3QuaGVpZ2h0KCkgLSBleHRlbnQpICogeWFsaWduKSk7CisK
KyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfc3RhdGUoY29udGV4dCwgc3RhdGljX2Nhc3Q8R3Rr
U3RhdGVGbGFncz4oZmxhZ3MpKTsKKyAgICBndGtfcmVuZGVyX2Fycm93KGNvbnRleHQsIHBhaW50
SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgR19QSSwgaW5uZXJSZWN0LngoKSwgaW5u
ZXJSZWN0LnkoKSwgZXh0ZW50KTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29u
dGV4dCk7CisKKyAgICBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX1NFUEFSQVRP
Uik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKKworICAgIGd0a19zdHls
ZV9jb250ZXh0X3NldF9kaXJlY3Rpb24oY29udGV4dCwgZGlyZWN0aW9uKTsKKyAgICBndGtfc3R5
bGVfY29udGV4dF9hZGRfY2xhc3MoY29udGV4dCwgInNlcGFyYXRvciIpOworICAgIGd0a19zdHls
ZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfQlVUVE9OKTsKKwor
ICAgIGdib29sZWFuIHdpZGVTZXBhcmF0b3JzOworICAgIGdpbnQgc2VwYXJhdG9yV2lkdGg7Cisg
ICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICJ3aWRlLXNlcGFyYXRvcnMiLCAmd2lkZVNlcGFyYXRvcnMsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3Itd2lkdGgiLCAmc2VwYXJhdG9y
V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmICghc2Vw
YXJhdG9yV2lkdGgpIHsKKyAgICAgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShjb250ZXh0
KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGd0a19zdHlsZV9jb250ZXh0
X3NldF9zdGF0ZShjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPihmbGFncykpOwor
CisgICAgaWYgKHdpZGVTZXBhcmF0b3JzKSB7CisgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gR1RL
X1RFWFRfRElSX0xUUikKKyAgICAgICAgICAgIGlubmVyUmVjdC5zZXRYKGlubmVyUmVjdC54KCkg
LSBzZXBhcmF0b3JXaWR0aCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlubmVyUmVjdC5z
ZXRYKGlubmVyUmVjdC54KCkgKyBpbm5lclJlY3Qud2lkdGgoKSk7CisKKyAgICAgICAgZ3RrX3Jl
bmRlcl9iYWNrZ3JvdW5kKGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRl
eHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyUmVjdC54KCksIGlubmVy
UmVjdC55KCksIHNlcGFyYXRvcldpZHRoLCBpbm5lclJlY3QuaGVpZ2h0KCkpOworICAgICAgICBn
dGtfcmVuZGVyX2ZyYW1lKGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRl
eHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lclJlY3QueCgpLCBpbm5lclJlY3Qu
eSgpLCBzZXBhcmF0b3JXaWR0aCwgaW5uZXJSZWN0LmhlaWdodCgpKTsKKyAgICB9IGVsc2Ugewor
ICAgICAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfYm9yZGVyKGNvbnRleHQsIHN0YXRpY19jYXN0
PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSwgJmJvcmRlcldpZHRoKTsKKyAgICAgICAgaWYgKGRpcmVj
dGlvbiA9PSBHVEtfVEVYVF9ESVJfTFRSKQorICAgICAgICAgICAgaW5uZXJSZWN0LnNldFgoaW5u
ZXJSZWN0LngoKSAtIGJvcmRlcldpZHRoLmxlZnQpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBpbm5lclJlY3Quc2V0WChpbm5lclJlY3QueCgpICsgaW5uZXJSZWN0LndpZHRoKCkpOworCisg
ICAgICAgIGd0a19yZW5kZXJfbGluZShjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZv
cm1Db250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBpbm5lclJlY3QueCgpLCBjb21i
b1JlY3QueSgpLCBpbm5lclJlY3QueCgpLCBjb21ib1JlY3QuYm90dG9tKCkpOworICAgIH0KKwor
ICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4dCk7CisKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6OnNldFRleHRJbnB1dEJvcmRlcnMoUmVuZGVy
U3R5bGUqIHN0eWxlKQoreworICAgIC8vIElmIHRoaXMgY29udHJvbCBpc24ndCBkcmF3biB1c2lu
ZyB0aGUgbmF0aXZlIHRoZW1lLCB3ZSBkb24ndCB0b3VjaCB0aGUgYm9yZGVycy4KKyAgICBpZiAo
c3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBOb0NvbnRyb2xQYXJ0KQorICAgICAgICByZXR1cm47CisK
KyAgICAvLyBXZSBjYW5ub3QgZ2l2ZSBhIHByb3BlciByZW5kZXJpbmcgd2hlbiBib3JkZXIgcmFk
aXVzIGlzIGFjdGl2ZSwgdW5mb3J0dW5hdGVseS4KKyAgICBzdHlsZS0+cmVzZXRCb3JkZXJSYWRp
dXMoKTsKKworICAgIEd0a1N0eWxlQ29udGV4dCogY29udGV4dCA9IGdldFN0eWxlQ29udGV4dChH
VEtfVFlQRV9FTlRSWSk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKGNvbnRleHQpOwor
ICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9kaXJlY3Rpb24oY29udGV4dCwgc3RhdGljX2Nhc3Q8
R3RrVGV4dERpcmVjdGlvbj4oUmVuZGVyVGhlbWVHdGs6Omd0a1RleHREaXJlY3Rpb24oc3R5bGUt
PmRpcmVjdGlvbigpKSkpOworICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0
LCBHVEtfU1RZTEVfQ0xBU1NfRU5UUlkpOworCisgICAgR3RrQm9yZGVyIGJvcmRlcldpZHRoOwor
ICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9ib3JkZXIoY29udGV4dCwgc3RhdGljX2Nhc3Q8R3Rr
U3RhdGVGbGFncz4oMCksICZib3JkZXJXaWR0aCk7CisKKyAgICBzdHlsZS0+c2V0Qm9yZGVyTGVm
dFdpZHRoKGJvcmRlcldpZHRoLmxlZnQpOworICAgIHN0eWxlLT5zZXRCb3JkZXJUb3BXaWR0aChi
b3JkZXJXaWR0aC50b3ApOworICAgIHN0eWxlLT5zZXRCb3JkZXJSaWdodFdpZHRoKGJvcmRlcldp
ZHRoLnJpZ2h0KTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyQm90dG9tV2lkdGgoYm9yZGVyV2lkdGgu
Ym90dG9tKTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4dCk7Cit9CisK
K2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCogcmVuZGVy
T2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkK
K3sKKyAgICBpZiAocGFpbnRJbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgR3RrU3R5bGVDb250ZXh0KiBjb250ZXh0ID0gZ2V0U3R5
bGVDb250ZXh0KEdUS19UWVBFX0VOVFJZKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKGNv
bnRleHQpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X2RpcmVjdGlvbihjb250ZXh0LCBz
dGF0aWNfY2FzdDxHdGtUZXh0RGlyZWN0aW9uPihndGtUZXh0RGlyZWN0aW9uKHJlbmRlck9iamVj
dC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKSk7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2Ns
YXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19FTlRSWSk7CisKKyAgICBJbnRSZWN0IHRleHRS
ZWN0ID0gcmVjdDsKKworICAgIGdib29sZWFuIGludGVyaW9yRm9jdXM7CisgICAgZ2ludCBmb2N1
c1dpZHRoOworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShjb250ZXh0LAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9jdXMtbGluZS13aWR0aCIsICZmb2N1c1dpZHRo
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJpb3ItZm9jdXMiLCAmaW50
ZXJpb3JGb2N1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYg
KCFpbnRlcmlvckZvY3VzICYmIGlzRm9jdXNlZChyZW5kZXJPYmplY3QpKQorICAgICAgICB0ZXh0
UmVjdC5pbmZsYXRlKC1mb2N1c1dpZHRoKTsKKworICAgIGd1aW50IGZsYWdzID0gMDsKKyAgICBp
ZiAoIWlzRW5hYmxlZChyZW5kZXJPYmplY3QpIHx8IGlzUmVhZE9ubHlDb250cm9sKHJlbmRlck9i
amVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX0lOU0VOU0lUSVZFOworICAg
IGd0a19zdHlsZV9jb250ZXh0X3NldF9zdGF0ZShjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0
ZUZsYWdzPihmbGFncykpOworCisgICAgZ3RrX3JlbmRlcl9iYWNrZ3JvdW5kKGNvbnRleHQsIHBh
aW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgdGV4dFJlY3QueCgpLCB0ZXh0UmVj
dC55KCksIHRleHRSZWN0LndpZHRoKCksIHRleHRSZWN0LmhlaWdodCgpKTsKKyAgICBndGtfcmVu
ZGVyX2ZyYW1lKGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwg
dGV4dFJlY3QueCgpLCB0ZXh0UmVjdC55KCksIHRleHRSZWN0LndpZHRoKCksIHRleHRSZWN0Lmhl
aWdodCgpKTsKKworICAgIGlmICghaW50ZXJpb3JGb2N1cyAmJiBpc0ZvY3VzZWQocmVuZGVyT2Jq
ZWN0KSAmJiBpc0VuYWJsZWQocmVuZGVyT2JqZWN0KSkKKyAgICAgICAgZ3RrX3JlbmRlcl9mb2N1
cyhjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHJlY3QueCgp
LCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKworICAgIGd0a19zdHls
ZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4dCk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jv
b2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50U2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0KiByZW5kZXJP
YmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQor
eworICAgIGlmIChwYWludEluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBDb250cm9sUGFydCBwYXJ0ID0gcmVuZGVyT2JqZWN0LT5z
dHlsZSgpLT5hcHBlYXJhbmNlKCk7CisgICAgQVNTRVJUKHBhcnQgPT0gU2xpZGVySG9yaXpvbnRh
bFBhcnQgfHwgcGFydCA9PSBTbGlkZXJWZXJ0aWNhbFBhcnQpOworCisgICAgR3RrU3R5bGVDb250
ZXh0KiBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9u
dGFsUGFydCA/IEdUS19UWVBFX0hTQ0FMRSA6IEdUS19UWVBFX1ZTQ0FMRSk7CisgICAgZ3RrX3N0
eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9k
aXJlY3Rpb24oY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlvbj4oZ3RrVGV4dERp
cmVjdGlvbihyZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpKSkpOworICAgIGd0a19z
dHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCAic2NhbGUiKTsKKyAgICBndGtfc3R5bGVf
Y29udGV4dF9hZGRfY2xhc3MoY29udGV4dCwgR1RLX1NUWUxFX0NMQVNTX1NMSURFUik7CisgICAg
Z3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19UUk9V
R0gpOworCisgICAgR3RrQm9yZGVyIGJvcmRlcldpZHRoOworICAgIGd0a19zdHlsZV9jb250ZXh0
X2dldF9ib3JkZXIoY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oMCksICZib3Jk
ZXJXaWR0aCk7CisKKyAgICBJbnRSZWN0IHNsaWRlclJlY3QgPSByZWN0OworCisgICAgaWYgKHBh
cnQgPT0gU2xpZGVySG9yaXpvbnRhbFBhcnQpIHsKKyAgICAgICAgc2xpZGVyUmVjdC5tb3ZlKGJv
cmRlcldpZHRoLmxlZnQsIDEpOworICAgICAgICBzbGlkZXJSZWN0LnNldFdpZHRoKHNsaWRlclJl
Y3Qud2lkdGgoKSAtIChib3JkZXJXaWR0aC5sZWZ0ICsgYm9yZGVyV2lkdGgucmlnaHQpKTsKKyAg
ICAgICAgc2xpZGVyUmVjdC5zZXRIZWlnaHQoc2xpZGVyUmVjdC5oZWlnaHQoKSAtIDIpOworICAg
IH0gZWxzZSB7CisgICAgICAgIHNsaWRlclJlY3QubW92ZSgxLCBib3JkZXJXaWR0aC50b3ApOwor
ICAgICAgICBzbGlkZXJSZWN0LnNldFdpZHRoKHNsaWRlclJlY3Qud2lkdGgoKSAtIDIpOworICAg
ICAgICBzbGlkZXJSZWN0LnNldEhlaWdodChzbGlkZXJSZWN0LmhlaWdodCgpIC0gKGJvcmRlcldp
ZHRoLnRvcCArIGJvcmRlcldpZHRoLmJvdHRvbSkpOworICAgIH0KKworICAgIGd1aW50IGZsYWdz
ID0gMDsKKyAgICBpZiAoIWlzRW5hYmxlZChyZW5kZXJPYmplY3QpIHx8IGlzUmVhZE9ubHlDb250
cm9sKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX0lOU0VO
U0lUSVZFOworICAgIGVsc2UgaWYgKGlzUHJlc3NlZChyZW5kZXJPYmplY3QpKQorICAgICAgICBm
bGFncyB8PSBHVEtfU1RBVEVfRkxBR19BQ1RJVkU7CisgICAgZWxzZSBpZiAoaXNIb3ZlcmVkKHJl
bmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX1BSRUxJR0hUOwor
ICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9zdGF0ZShjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtT
dGF0ZUZsYWdzPihmbGFncykpOworCisgICAgZ3RrX3JlbmRlcl9iYWNrZ3JvdW5kKGNvbnRleHQs
IHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgc2xpZGVyUmVjdC54KCksIHNs
aWRlclJlY3QueSgpLCBzbGlkZXJSZWN0LndpZHRoKCksIHNsaWRlclJlY3QuaGVpZ2h0KCkpOwor
ICAgIGd0a19yZW5kZXJfZnJhbWUoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3Jt
Q29udGV4dCgpLCBzbGlkZXJSZWN0LngoKSwgc2xpZGVyUmVjdC55KCksIHNsaWRlclJlY3Qud2lk
dGgoKSwgc2xpZGVyUmVjdC5oZWlnaHQoKSk7CisKKyAgICBpZiAoaXNGb2N1c2VkKHJlbmRlck9i
amVjdCkpCisgICAgICAgIGd0a19yZW5kZXJfZm9jdXMoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRl
eHQtPnBsYXRmb3JtQ29udGV4dCgpLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwg
cmVjdC5oZWlnaHQoKSk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9yZXN0b3JlKGNvbnRleHQp
OworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFNs
aWRlclRodW1iKFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBh
aW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRJbmZvLmNvbnRl
eHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQ29u
dHJvbFBhcnQgcGFydCA9IHJlbmRlck9iamVjdC0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpOworICAg
IEFTU0VSVChwYXJ0ID09IFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQgfHwgcGFydCA9PSBTbGlk
ZXJUaHVtYlZlcnRpY2FsUGFydCk7CisKKyAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQgPSBn
ZXRTdHlsZUNvbnRleHQocGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0ID8gR1RLX1RZ
UEVfSFNDQUxFIDogR1RLX1RZUEVfVlNDQUxFKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9zYXZl
KGNvbnRleHQpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X2RpcmVjdGlvbihjb250ZXh0
LCBzdGF0aWNfY2FzdDxHdGtUZXh0RGlyZWN0aW9uPihndGtUZXh0RGlyZWN0aW9uKHJlbmRlck9i
amVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKSk7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRk
X2NsYXNzKGNvbnRleHQsICJzY2FsZSIpOworICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFz
cyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfU0xJREVSKTsKKworICAgIGdpbnQgc2xpZGVyV2lk
dGgsIHNsaWRlckxlbmd0aDsKKyAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUoY29udGV4
dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWRlci13aWR0aCIsICZzbGlk
ZXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWRlci1sZW5ndGgi
LCAmc2xpZGVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKwor
ICAgIEludFJlY3Qgc2xpZGVyUmVjdCA9IHJlY3Q7CisgICAgaWYgKHBhcnQgPT0gU2xpZGVyVGh1
bWJIb3Jpem9udGFsUGFydCkgeworICAgICAgICBzbGlkZXJSZWN0LnNldFkocmVjdC55KCkgKyAo
cmVjdC5oZWlnaHQoKSAtIHNsaWRlckxlbmd0aCkgLyAyKTsKKyAgICAgICAgc2xpZGVyUmVjdC5z
ZXRXaWR0aChzbGlkZXJXaWR0aCk7CisgICAgICAgIHNsaWRlclJlY3Quc2V0SGVpZ2h0KHNsaWRl
ckxlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2xpZGVyUmVjdC5zZXRYKHJlY3QueCgp
ICsgKHJlY3Qud2lkdGgoKSAtIHNsaWRlckxlbmd0aCkgLyAyKTsKKyAgICAgICAgc2xpZGVyUmVj
dC5zZXRXaWR0aChzbGlkZXJMZW5ndGgpOworICAgICAgICBzbGlkZXJSZWN0LnNldEhlaWdodChz
bGlkZXJXaWR0aCk7CisgICAgfQorCisgICAgZ3VpbnQgZmxhZ3MgPSAwOworICAgIGlmICghaXNF
bmFibGVkKHJlbmRlck9iamVjdCkgfHwgaXNSZWFkT25seUNvbnRyb2wocmVuZGVyT2JqZWN0KSkK
KyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfSU5TRU5TSVRJVkU7CisgICAgZWxzZSBp
ZiAoaXNQcmVzc2VkKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9G
TEFHX0FDVElWRTsKKyAgICBlbHNlIGlmIChpc0hvdmVyZWQocmVuZGVyT2JqZWN0KSkKKyAgICAg
ICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfUFJFTElHSFQ7CisgICAgZ3RrX3N0eWxlX2NvbnRl
eHRfc2V0X3N0YXRlKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSk7
CisKKyAgICBndGtfcmVuZGVyX3NsaWRlcihjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxh
dGZvcm1Db250ZXh0KCksIHNsaWRlclJlY3QueCgpLCBzbGlkZXJSZWN0LnkoKSwgc2xpZGVyUmVj
dC53aWR0aCgpLCBzbGlkZXJSZWN0LmhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgIHBh
cnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCA/IEdUS19PUklFTlRBVElPTl9IT1JJWk9O
VEFMIDogR1RLX09SSUVOVEFUSU9OX1ZFUlRJQ0FMKTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0
X3Jlc3RvcmUoY29udGV4dCk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVy
VGhlbWVHdGs6OmFkanVzdFNsaWRlclRodW1iU2l6ZShSZW5kZXJPYmplY3QqIHJlbmRlck9iamVj
dCkgY29uc3QKK3sKKyAgICBDb250cm9sUGFydCBwYXJ0ID0gcmVuZGVyT2JqZWN0LT5zdHlsZSgp
LT5hcHBlYXJhbmNlKCk7CisgICAgc3dpdGNoIChwYXJ0KSB7CisgICAgY2FzZSBNZWRpYVNsaWRl
clRodW1iUGFydDoKKyNpZiBFTkFCTEUoVklERU8pCisgICAgICAgIGlmIChwYXJ0ID09IE1lZGlh
U2xpZGVyVGh1bWJQYXJ0KSB7CisgICAgICAgICAgICByZW5kZXJPYmplY3QtPnN0eWxlKCktPnNl
dFdpZHRoKExlbmd0aChtX21lZGlhU2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsKKyAgICAgICAg
ICAgIHJlbmRlck9iamVjdC0+c3R5bGUoKS0+c2V0SGVpZ2h0KExlbmd0aChtX21lZGlhU2xpZGVy
VGh1bWJIZWlnaHQsIEZpeGVkKSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBicmVhazsK
KyAgICBjYXNlIFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQ6CisgICAgY2FzZSBTbGlkZXJUaHVt
YlZlcnRpY2FsUGFydDogeworICAgICAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQgPSBnZXRT
dHlsZUNvbnRleHQocGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0ID8gR1RLX1RZUEVf
SFNDQUxFIDogR1RLX1RZUEVfVlNDQUxFKTsKKworICAgICAgICBnaW50IHNsaWRlcldpZHRoLCBz
bGlkZXJMZW5ndGg7CisgICAgICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShjb250ZXh0
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWRlci13aWR0aCIsICZz
bGlkZXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzbGlkZXIt
bGVuZ3RoIiwgJnNsaWRlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDApOworICAgICAgICByZW5kZXJPYmplY3QtPnN0eWxlKCktPnNldFdpZHRoKExlbmd0aChz
bGlkZXJXaWR0aCwgRml4ZWQpKTsKKyAgICAgICAgcmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5zZXRI
ZWlnaHQoTGVuZ3RoKHNsaWRlckxlbmd0aCwgRml4ZWQpKTsKKyAgICB9CisgICAgICAgIGJyZWFr
OworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIENvbG9y
IGdldFN0eWxlQ29sb3IoR1R5cGUgZ1R5cGUsIGJvb2wgYmFja2dyb3VuZCwgR3RrU3RhdGVGbGFn
cyBmbGFncykKK3sKKyAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQgPSBnZXRTdHlsZUNvbnRl
eHQoZ1R5cGUpOworICAgIEdka1JHQkEgZ2RrUkdCQUNvbG9yOworICAgIEdka0NvbG9yIGdka0Nv
bG9yOworCisgICAgaWYgKGJhY2tncm91bmQpCisgICAgICAgIGd0a19zdHlsZV9jb250ZXh0X2dl
dF9iYWNrZ3JvdW5kX2NvbG9yKGNvbnRleHQsIGZsYWdzLCAmZ2RrUkdCQUNvbG9yKTsKKyAgICBl
bHNlCisgICAgICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9jb2xvcihjb250ZXh0LCBmbGFncywg
Jmdka1JHQkFDb2xvcik7CisKKyAgICBnZGtDb2xvci5waXhlbCA9IDA7CisgICAgZ2RrQ29sb3Iu
cmVkID0gKGd1aW50MTYpIChnZGtSR0JBQ29sb3IucmVkICogNjU1MzUpOworICAgIGdka0NvbG9y
LmdyZWVuID0gKGd1aW50MTYpIChnZGtSR0JBQ29sb3IuZ3JlZW4gKiA2NTUzNSk7CisgICAgZ2Rr
Q29sb3IuYmx1ZSA9IChndWludDE2KSAoZ2RrUkdCQUNvbG9yLmJsdWUgKiA2NTUzNSk7CisKKyAg
ICByZXR1cm4gZ2RrQ29sb3I7Cit9CisKKyNpZiBFTkFCTEUoVklERU8pCit2b2lkIFJlbmRlclRo
ZW1lR3RrOjppbml0TWVkaWFDb2xvcnMoKQoreworICAgIG1fcGFuZWxDb2xvciA9IGdldFN0eWxl
Q29sb3IoR1RLX1RZUEVfQ09OVEFJTkVSLCB0cnVlLCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdz
PigwKSk7CisgICAgbV9zbGlkZXJDb2xvciA9IGdldFN0eWxlQ29sb3IoR1RLX1RZUEVfQ09OVEFJ
TkVSLCB0cnVlLCBHVEtfU1RBVEVfRkxBR19BQ1RJVkUpOworICAgIG1fc2xpZGVyVGh1bWJDb2xv
ciA9IGdldFN0eWxlQ29sb3IoR1RLX1RZUEVfQ09OVEFJTkVSLCB0cnVlLCBHVEtfU1RBVEVfRkxB
R19TRUxFQ1RFRCk7Cit9CisjZW5kaWYKKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3Jt
QWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0
U3R5bGVDb2xvcihHVEtfVFlQRV9FTlRSWSwgdHJ1ZSwgR1RLX1NUQVRFX0ZMQUdfU0VMRUNURUQp
OworfQorCitDb2xvciBSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkJh
Y2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGdldFN0eWxlQ29sb3IoR1RLX1RZ
UEVfRU5UUlksIHRydWUsIEdUS19TVEFURV9GTEFHX0FDVElWRSk7Cit9CisKK0NvbG9yIFJlbmRl
clRoZW1lR3RrOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0
Cit7CisgICAgcmV0dXJuIGdldFN0eWxlQ29sb3IoR1RLX1RZUEVfRU5UUlksIGZhbHNlLCBHVEtf
U1RBVEVfRkxBR19TRUxFQ1RFRCk7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9y
bUluYWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
Z2V0U3R5bGVDb2xvcihHVEtfVFlQRV9FTlRSWSwgZmFsc2UsIEdUS19TVEFURV9GTEFHX0FDVElW
RSk7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjphY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFj
a2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0U3R5bGVDb2xvcihHVEtfVFlQ
RV9UUkVFX1ZJRVcsIHRydWUsIEdUS19TVEFURV9GTEFHX1NFTEVDVEVEKTsKK30KKworQ29sb3Ig
UmVuZGVyVGhlbWVHdGs6OmluYWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigp
IGNvbnN0Cit7CisgICAgcmV0dXJuIGdldFN0eWxlQ29sb3IoR1RLX1RZUEVfVFJFRV9WSUVXLCB0
cnVlLCBHVEtfU1RBVEVfRkxBR19BQ1RJVkUpOworfQorCitDb2xvciBSZW5kZXJUaGVtZUd0azo6
YWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgcmV0
dXJuIGdldFN0eWxlQ29sb3IoR1RLX1RZUEVfVFJFRV9WSUVXLCBmYWxzZSwgR1RLX1NUQVRFX0ZM
QUdfU0VMRUNURUQpOworfQorCitDb2xvciBSZW5kZXJUaGVtZUd0azo6aW5hY3RpdmVMaXN0Qm94
U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0U3R5bGVD
b2xvcihHVEtfVFlQRV9UUkVFX1ZJRVcsIGZhbHNlLCBHVEtfU1RBVEVfRkxBR19BQ1RJVkUpOwor
fQorCitDb2xvciBSZW5kZXJUaGVtZUd0azo6c3lzdGVtQ29sb3IoaW50IGNzc1ZhbHVlSWQpIGNv
bnN0Cit7CisgICAgc3dpdGNoIChjc3NWYWx1ZUlkKSB7CisgICAgY2FzZSBDU1NWYWx1ZUJ1dHRv
bnRleHQ6CisgICAgICAgIHJldHVybiBnZXRTdHlsZUNvbG9yKEdUS19UWVBFX0JVVFRPTiwgZmFs
c2UsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KDApKTsKKyAgICBjYXNlIENTU1ZhbHVlQ2Fw
dGlvbnRleHQ6CisgICAgICAgIHJldHVybiBnZXRTdHlsZUNvbG9yKEdUS19UWVBFX0VOVFJZLCBm
YWxzZSwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oMCkpOworICAgIGRlZmF1bHQ6CisgICAg
ICAgIHJldHVybiBSZW5kZXJUaGVtZTo6c3lzdGVtQ29sb3IoY3NzVmFsdWVJZCk7CisgICAgfQor
ICAgIHJldHVybiBSZW5kZXJUaGVtZTo6c3lzdGVtQ29sb3IoY3NzVmFsdWVJZCk7Cit9CisKKyNp
ZiBFTkFCTEUoUFJPR1JFU1NfVEFHKQorc3RhdGljIGNvbnN0IGludCBwcm9ncmVzc0FjdGl2aXR5
QmxvY2tzID0gNTsKK3N0YXRpYyBjb25zdCBpbnQgcHJvZ3Jlc3NBbmltYXRpb25GcmFtZXMgPSAx
MDsKK3N0YXRpYyBjb25zdCBkb3VibGUgcHJvZ3Jlc3NBbmltYXRpb25JbnRlcnZhbCA9IDAuMTI1
OworZG91YmxlIFJlbmRlclRoZW1lR3RrOjphbmltYXRpb25SZXBlYXRJbnRlcnZhbEZvclByb2dy
ZXNzQmFyKFJlbmRlclByb2dyZXNzKikgY29uc3QKK3sKKyAgICByZXR1cm4gcHJvZ3Jlc3NBbmlt
YXRpb25JbnRlcnZhbDsKK30KKworZG91YmxlIFJlbmRlclRoZW1lR3RrOjphbmltYXRpb25EdXJh
dGlvbkZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKikgY29uc3QKK3sKKyAgICByZXR1cm4g
cHJvZ3Jlc3NBbmltYXRpb25JbnRlcnZhbCAqIHByb2dyZXNzQW5pbWF0aW9uRnJhbWVzICogMjsg
Ly8gIjIiIGZvciBiYWNrIGFuZCBmb3J0aDsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFp
bnRQcm9ncmVzc0JhcihSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZv
JiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHBhaW50SW5mby5j
b250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IGlmICghcmVuZGVyT2JqZWN0LT5pc1Byb2dyZXNzKCkpCisgICAgICAgIHJldHVybiB0cnVlOwor
CisgICAgR3RrU3R5bGVDb250ZXh0KiBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBF
X1BST0dSRVNTX0JBUik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKKwor
ICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1Nf
UFJPR1JFU1NCQVIpOworICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBH
VEtfU1RZTEVfQ0xBU1NfVFJPVUdIKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfc3RhdGUo
Y29udGV4dCwgR1RLX1NUQVRFX0ZMQUdfQUNUSVZFKTsKKworICAgIGd0a19yZW5kZXJfYmFja2dy
b3VuZChjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHJlY3Qu
eCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKyAgICBndGtfcmVu
ZGVyX2ZyYW1lKGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwg
cmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworCisgICAg
UmVuZGVyUHJvZ3Jlc3MqIHJlbmRlclByb2dyZXNzID0gdG9SZW5kZXJQcm9ncmVzcyhyZW5kZXJP
YmplY3QpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0YXRlKGNvbnRleHQsIEdUS19T
VEFURV9GTEFHX1BSRUxJR0hUKTsKKworICAgIEd0a0JvcmRlciBib3JkZXJXaWR0aDsKKyAgICBn
dGtfc3R5bGVfY29udGV4dF9nZXRfYm9yZGVyKGNvbnRleHQsIEdUS19TVEFURV9GTEFHX1BSRUxJ
R0hULCAmYm9yZGVyV2lkdGgpOworCisgICAgSW50UmVjdCBwcm9ncmVzc1JlY3QocmVjdC54KCkg
KyBib3JkZXJXaWR0aC5sZWZ0LCByZWN0LnkoKSArIGJvcmRlcldpZHRoLnRvcCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICByZWN0LndpZHRoKCkgLSAoYm9yZGVyV2lkdGgubGVmdCArIGJvcmRl
cldpZHRoLnJpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmhlaWdodCgpIC0g
KGJvcmRlcldpZHRoLnRvcCArIGJvcmRlcldpZHRoLmJvdHRvbSkpOworCisgICAgaWYgKHJlbmRl
clByb2dyZXNzLT5pc0RldGVybWluYXRlKCkpIHsKKyAgICAgICAgcHJvZ3Jlc3NSZWN0LnNldFdp
ZHRoKHByb2dyZXNzUmVjdC53aWR0aCgpICogcmVuZGVyUHJvZ3Jlc3MtPnBvc2l0aW9uKCkpOwor
ICAgICAgICBpZiAocmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSA9PSBSVEwpCisg
ICAgICAgICAgICBwcm9ncmVzc1JlY3Quc2V0WChyZWN0LndpZHRoKCkgLSBwcm9ncmVzc1JlY3Qu
d2lkdGgoKSAtIHByb2dyZXNzUmVjdC54KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRvdWJs
ZSBwcm9ncmVzcyA9IHJlbmRlclByb2dyZXNzLT5hbmltYXRpb25Qcm9ncmVzcygpOworCisgICAg
ICAgIHByb2dyZXNzUmVjdC5zZXRXaWR0aChtYXgoMiwgcHJvZ3Jlc3NSZWN0LndpZHRoKCkgLyBw
cm9ncmVzc0FjdGl2aXR5QmxvY2tzKSk7CisgICAgICAgIGludCBtb3ZhYmxlV2lkdGggPSByZWN0
LndpZHRoKCkgLSBwcm9ncmVzc1JlY3Qud2lkdGgoKTsKKyAgICAgICAgaWYgKHByb2dyZXNzIDwg
MC41KQorICAgICAgICAgICAgcHJvZ3Jlc3NSZWN0LnNldFgocHJvZ3Jlc3NSZWN0LngoKSArIChw
cm9ncmVzcyAqIDIgKiBtb3ZhYmxlV2lkdGgpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
cHJvZ3Jlc3NSZWN0LnNldFgocHJvZ3Jlc3NSZWN0LngoKSArICgoMS4wIC0gcHJvZ3Jlc3MpICog
MiAqIG1vdmFibGVXaWR0aCkpOworICAgIH0KKworICAgIGlmICghcHJvZ3Jlc3NSZWN0LmlzRW1w
dHkoKSkgeworICAgICAgICBndGtfcmVuZGVyX2JhY2tncm91bmQoY29udGV4dCwgcGFpbnRJbmZv
LmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBwcm9ncmVzc1JlY3QueCgpLCBwcm9ncmVzc1Jl
Y3QueSgpLCBwcm9ncmVzc1JlY3Qud2lkdGgoKSwgcHJvZ3Jlc3NSZWN0LmhlaWdodCgpKTsKKyAg
ICAgICAgZ3RrX3JlbmRlcl9mcmFtZShjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZv
cm1Db250ZXh0KCksIHByb2dyZXNzUmVjdC54KCksIHByb2dyZXNzUmVjdC55KCksIHByb2dyZXNz
UmVjdC53aWR0aCgpLCBwcm9ncmVzc1JlY3QuaGVpZ2h0KCkpOworICAgIH0KKworICAgIGd0a19z
dHlsZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4dCk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9Cisj
ZW5kaWYKKworfQorCisjZW5kaWYgLy8gIUdUS19BUElfVkVSU0lPTl8yCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0ay5jcHAgYi9XZWJDb3JlL3BsYXRm
b3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0ay5jcHAKaW5kZXggMTBmN2U3MS4uNGM5ZmQ2NCAxMDA2
NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGsuY3BwCisrKyBi
L1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1Njcm9sbGJhclRoZW1lR3RrLmNwcApAQCAtMzAsMTQgKzMw
LDExIEBACiAjaW5jbHVkZSAiUmVuZGVyVGhlbWVHdGsuaCIKICNpbmNsdWRlICJTY3JvbGxWaWV3
LmgiCiAjaW5jbHVkZSAiU2Nyb2xsYmFyLmgiCi0jaW5jbHVkZSAiV2lkZ2V0UmVuZGVyaW5nQ29u
dGV4dC5oIgotI2luY2x1ZGUgImd0a2RyYXdpbmcuaCIKICNpbmNsdWRlIDxndGsvZ3RrLmg+CiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogc3RhdGljIEhhc2hTZXQ8U2Nyb2xsYmFyKj4qIGdTY3Jv
bGxiYXJzOwotc3RhdGljIHZvaWQgZ3RrU3R5bGVTZXRDYWxsYmFjayhHdGtXaWRnZXQqLCBHdGtT
dHlsZSosIFNjcm9sbGJhclRoZW1lR3RrKik7CiAKIFNjcm9sbGJhclRoZW1lKiBTY3JvbGxiYXJU
aGVtZTo6bmF0aXZlVGhlbWUoKQogewpAQCAtNDUsMTcgKzQyLDE0IEBAIFNjcm9sbGJhclRoZW1l
KiBTY3JvbGxiYXJUaGVtZTo6bmF0aXZlVGhlbWUoKQogICAgIHJldHVybiAmdGhlbWU7CiB9CiAK
LVNjcm9sbGJhclRoZW1lR3RrOjpTY3JvbGxiYXJUaGVtZUd0aygpCitTY3JvbGxiYXJUaGVtZUd0
azo6flNjcm9sbGJhclRoZW1lR3RrKCkKIHsKLSAgICB1cGRhdGVUaGVtZVByb3BlcnRpZXMoKTsK
LSAgICBnX3NpZ25hbF9jb25uZWN0KHN0YXRpY19jYXN0PFJlbmRlclRoZW1lR3RrKj4oUmVuZGVy
VGhlbWU6OmRlZmF1bHRUaGVtZSgpLmdldCgpKS0+Z3RrU2Nyb2xsYmFyKCksCi0gICAgICAgICAi
c3R5bGUtc2V0IiwgR19DQUxMQkFDSyhndGtTdHlsZVNldENhbGxiYWNrKSwgdGhpcyk7CiB9CiAK
LVNjcm9sbGJhclRoZW1lR3RrOjp+U2Nyb2xsYmFyVGhlbWVHdGsoKQorY29uc3QgSGFzaFNldDxT
Y3JvbGxiYXIqPiogU2Nyb2xsYmFyVGhlbWVHdGs6OmdldFNjcm9sbGJhcnMoKQogeworICAgIHJl
dHVybiBnU2Nyb2xsYmFyczsKIH0KLQogdm9pZCBTY3JvbGxiYXJUaGVtZUd0azo6cmVnaXN0ZXJT
Y3JvbGxiYXIoU2Nyb2xsYmFyKiBzY3JvbGxiYXIpCiB7CiAgICAgaWYgKCFnU2Nyb2xsYmFycykK
QEAgLTcyLDQ4ICs2Niw2IEBAIHZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnVucmVnaXN0ZXJTY3Jv
bGxiYXIoU2Nyb2xsYmFyKiBzY3JvbGxiYXIpCiAgICAgfQogfQogCi12b2lkIFNjcm9sbGJhclRo
ZW1lR3RrOjp1cGRhdGVUaGVtZVByb3BlcnRpZXMoKQotewotICAgIE1vekd0a1Njcm9sbGJhck1l
dHJpY3MgbWV0cmljczsKLSAgICBtb3pfZ3RrX2dldF9zY3JvbGxiYXJfbWV0cmljcygmbWV0cmlj
cyk7Ci0KLSAgICBtX3RodW1iRmF0bmVzcyA9IG1ldHJpY3Muc2xpZGVyX3dpZHRoOwotICAgIG1f
dHJvdWdoQm9yZGVyV2lkdGggPSBtZXRyaWNzLnRyb3VnaF9ib3JkZXI7Ci0gICAgbV9zdGVwcGVy
U2l6ZSA9IG1ldHJpY3Muc3RlcHBlcl9zaXplOwotICAgIG1fc3RlcHBlclNwYWNpbmcgPSBtZXRy
aWNzLnN0ZXBwZXJfc3BhY2luZzsKLSAgICBtX21pblRodW1iTGVuZ3RoID0gbWV0cmljcy5taW5f
c2xpZGVyX3NpemU7Ci0gICAgbV90cm91Z2hVbmRlclN0ZXBwZXJzID0gbWV0cmljcy50cm91Z2hf
dW5kZXJfc3RlcHBlcnM7Ci0gICAgbV9oYXNGb3J3YXJkQnV0dG9uU3RhcnRQYXJ0ID0gbWV0cmlj
cy5oYXNfc2Vjb25kYXJ5X2ZvcndhcmRfc3RlcHBlcjsKLSAgICBtX2hhc0JhY2tCdXR0b25FbmRQ
YXJ0ID0gbWV0cmljcy5oYXNfc2Vjb25kYXJ5X2JhY2t3YXJkX3N0ZXBwZXI7Ci0KLSAgICBpZiAo
IWdTY3JvbGxiYXJzKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBVcGRhdGUgdGhlIHRoaWNr
bmVzcyBvZiBldmVyeSBpbnRlcmlvciBmcmFtZSBzY3JvbGxiYXIgd2lkZ2V0LiBUaGUKLSAgICAv
LyBwbGF0Zm9ybS1pbmRlcGVuZGVudCBzY3JvbGxiYXIgdGhlbSBjb2RlIGlzbid0IHlldCBzbWFy
dCBlbm91Z2ggdG8gZ2V0Ci0gICAgLy8gdGhpcyBpbmZvcm1hdGlvbiB3aGVuIGl0IHBhaW50cy4K
LSAgICBIYXNoU2V0PFNjcm9sbGJhcio+OjppdGVyYXRvciBlbmQgPSBnU2Nyb2xsYmFycy0+ZW5k
KCk7Ci0gICAgZm9yIChIYXNoU2V0PFNjcm9sbGJhcio+OjppdGVyYXRvciBpdCA9IGdTY3JvbGxi
YXJzLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgU2Nyb2xsYmFyKiBzY3Jv
bGxiYXIgPSAoKml0KTsKLQotICAgICAgICAvLyBUb3AtbGV2ZWwgc2Nyb2xsYmFyIGkuZS4gc2Ny
b2xsYmFycyB3aG8gaGF2ZSBhIHBhcmVudCBTY3JvbGxWaWV3Ci0gICAgICAgIC8vIHdpdGggbm8g
cGFyZW50IGFyZSBuYXRpdmUsIGFuZCB0aHVzIGRvIG5vdCBuZWVkIHRvIGJlIHJlc2l6ZWQuCi0g
ICAgICAgIGlmICghc2Nyb2xsYmFyLT5wYXJlbnQoKSB8fCAhc2Nyb2xsYmFyLT5wYXJlbnQoKS0+
cGFyZW50KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgaW50IHRoaWNrbmVzcyA9
IHNjcm9sbGJhclRoaWNrbmVzcyhzY3JvbGxiYXItPmNvbnRyb2xTaXplKCkpOwotICAgICAgICBp
ZiAoc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IEhvcml6b250YWxTY3JvbGxiYXIpCi0gICAg
ICAgICAgICBzY3JvbGxiYXItPnNldEZyYW1lUmVjdChJbnRSZWN0KDAsIHNjcm9sbGJhci0+cGFy
ZW50KCktPmhlaWdodCgpIC0gdGhpY2tuZXNzLCBzY3JvbGxiYXItPndpZHRoKCksIHRoaWNrbmVz
cykpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzY3JvbGxiYXItPnNldEZyYW1lUmVjdChJ
bnRSZWN0KHNjcm9sbGJhci0+cGFyZW50KCktPndpZHRoKCkgLSB0aGlja25lc3MsIDAsIHRoaWNr
bmVzcywgc2Nyb2xsYmFyLT5oZWlnaHQoKSkpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZ3Rr
U3R5bGVTZXRDYWxsYmFjayhHdGtXaWRnZXQqIHdpZGdldCwgR3RrU3R5bGUqIHByZXZpb3VzLCBT
Y3JvbGxiYXJUaGVtZUd0ayogc2Nyb2xsYmFyVGhlbWUpCi17Ci0gICAgc2Nyb2xsYmFyVGhlbWUt
PnVwZGF0ZVRoZW1lUHJvcGVydGllcygpOwotfQotCiBib29sIFNjcm9sbGJhclRoZW1lR3RrOjpo
YXNUaHVtYihTY3JvbGxiYXIqIHNjcm9sbGJhcikKIHsKICAgICAvLyBUaGlzIG1ldGhvZCBpcyBq
dXN0IGNhbGxlZCBhcyBhIHBhaW50LXRpbWUgb3B0aW1pemF0aW9uIHRvIHNlZSBpZgpAQCAtMTk5
LDU0ICsxNTEsNiBAQCBJbnRSZWN0IFNjcm9sbGJhclRoZW1lR3RrOjp0cmFja1JlY3QoU2Nyb2xs
YmFyKiBzY3JvbGxiYXIsIGJvb2wpCiAgICAgICAgICAgICAgICAgICAgdGhpY2tuZXNzLCBzY3Jv
bGxiYXItPmhlaWdodCgpIC0gKDIgKiBtb3ZlbWVudEF4aXNQYWRkaW5nKSAtIGFsdGVybmF0ZUJ1
dHRvbldpZHRoKTsKIH0KIAotdm9pZCBTY3JvbGxiYXJUaGVtZUd0azo6cGFpbnRUcmFja0JhY2tn
cm91bmQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBTY3JvbGxiYXIqIHNjcm9sbGJhciwgY29u
c3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBHdGtXaWRnZXRTdGF0ZSBzdGF0ZTsKLSAgICBzdGF0
ZS5mb2N1c2VkID0gRkFMU0U7Ci0gICAgc3RhdGUuaXNEZWZhdWx0ID0gRkFMU0U7Ci0gICAgc3Rh
dGUuY2FuRGVmYXVsdCA9IEZBTFNFOwotICAgIHN0YXRlLmRpc2FibGVkID0gRkFMU0U7Ci0gICAg
c3RhdGUuYWN0aXZlID0gRkFMU0U7Ci0gICAgc3RhdGUuaW5Ib3ZlciA9IEZBTFNFOwotCi0gICAg
Ly8gUGFpbnQgdGhlIHRyYWNrIGJhY2tncm91bmQuIElmIHRoZSB0cm91Z2gtdW5kZXItc3RlcHBl
cnMgcHJvcGVydHkgaXMgdHJ1ZSwgdGhpcwotICAgIC8vIHNob3VsZCBiZSB0aGUgZnVsbCBzaXpl
IG9mIHRoZSBzY3JvbGxiYXIsIGJ1dCBpZiBpcyBmYWxzZSwgaXQgc2hvdWxkIG9ubHkgYmUgdGhl
Ci0gICAgLy8gdHJhY2sgcmVjdC4KLSAgICBJbnRSZWN0IGZ1bGxTY3JvbGxiYXJSZWN0ID0gcmVj
dDsKLSAgICBpZiAobV90cm91Z2hVbmRlclN0ZXBwZXJzKQotICAgICAgICBmdWxsU2Nyb2xsYmFy
UmVjdCA9IEludFJlY3Qoc2Nyb2xsYmFyLT54KCksIHNjcm9sbGJhci0+eSgpLCBzY3JvbGxiYXIt
PndpZHRoKCksIHNjcm9sbGJhci0+aGVpZ2h0KCkpOwotCi0gICAgR3RrVGhlbWVXaWRnZXRUeXBl
IHR5cGUgPSBzY3JvbGxiYXItPm9yaWVudGF0aW9uKCkgPT0gVmVydGljYWxTY3JvbGxiYXIgPyBN
T1pfR1RLX1NDUk9MTEJBUl9UUkFDS19WRVJUSUNBTCA6IE1PWl9HVEtfU0NST0xMQkFSX1RSQUNL
X0hPUklaT05UQUw7Ci0gICAgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dCB3aWRnZXRDb250ZXh0KGNv
bnRleHQsIGZ1bGxTY3JvbGxiYXJSZWN0KTsKLSAgICB3aWRnZXRDb250ZXh0LnBhaW50TW96aWxs
YVdpZGdldCh0eXBlLCAmc3RhdGUsIDApOwotfQotCi12b2lkIFNjcm9sbGJhclRoZW1lR3RrOjpw
YWludFNjcm9sbGJhckJhY2tncm91bmQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBTY3JvbGxi
YXIqIHNjcm9sbGJhcikKLXsKLSAgICAvLyBUaGlzIGlzIHVudXNlZCBieSB0aGUgbW96X2d0a19z
Y3JvbGxlY2Rfd2luZG93X3BhaW50LgotICAgIEd0a1dpZGdldFN0YXRlIHN0YXRlOwotICAgIElu
dFJlY3QgZnVsbFNjcm9sbGJhclJlY3QgPSBJbnRSZWN0KHNjcm9sbGJhci0+eCgpLCBzY3JvbGxi
YXItPnkoKSwgc2Nyb2xsYmFyLT53aWR0aCgpLCBzY3JvbGxiYXItPmhlaWdodCgpKTsKLSAgICBX
aWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENvbnRleHQoY29udGV4dCwgZnVsbFNjcm9sbGJh
clJlY3QpOwotICAgIHdpZGdldENvbnRleHQucGFpbnRNb3ppbGxhV2lkZ2V0KE1PWl9HVEtfU0NS
T0xMRURfV0lORE9XLCAmc3RhdGUsIDApOwotfQotCi12b2lkIFNjcm9sbGJhclRoZW1lR3RrOjpw
YWludFRodW1iKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgU2Nyb2xsYmFyKiBzY3JvbGxiYXIs
IGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgR3RrV2lkZ2V0U3RhdGUgc3RhdGU7Ci0gICAg
c3RhdGUuZm9jdXNlZCA9IEZBTFNFOwotICAgIHN0YXRlLmlzRGVmYXVsdCA9IEZBTFNFOwotICAg
IHN0YXRlLmNhbkRlZmF1bHQgPSBGQUxTRTsKLSAgICBzdGF0ZS5kaXNhYmxlZCA9IEZBTFNFOwot
ICAgIHN0YXRlLmFjdGl2ZSA9IHNjcm9sbGJhci0+cHJlc3NlZFBhcnQoKSA9PSBUaHVtYlBhcnQ7
Ci0gICAgc3RhdGUuaW5Ib3ZlciA9IHNjcm9sbGJhci0+aG92ZXJlZFBhcnQoKSA9PSBUaHVtYlBh
cnQ7Ci0gICAgc3RhdGUubWF4cG9zID0gc2Nyb2xsYmFyLT5tYXhpbXVtKCk7Ci0gICAgc3RhdGUu
Y3VycG9zID0gc2Nyb2xsYmFyLT5jdXJyZW50UG9zKCk7Ci0KLSAgICBHdGtUaGVtZVdpZGdldFR5
cGUgdHlwZSA9IHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBWZXJ0aWNhbFNjcm9sbGJhciA/
IE1PWl9HVEtfU0NST0xMQkFSX1RIVU1CX1ZFUlRJQ0FMIDogTU9aX0dUS19TQ1JPTExCQVJfVEhV
TUJfSE9SSVpPTlRBTDsKLSAgICBXaWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENvbnRleHQo
Y29udGV4dCwgcmVjdCk7Ci0gICAgd2lkZ2V0Q29udGV4dC5wYWludE1vemlsbGFXaWRnZXQodHlw
ZSwgJnN0YXRlLCAwKTsKLX0KLQogSW50UmVjdCBTY3JvbGxiYXJUaGVtZUd0azo6dGh1bWJSZWN0
KFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJbnRSZWN0JiB1bmNvbnN0cmFpbmVkVHJhY2tS
ZWN0KQogewogICAgIEludFJlY3QgdHJhY2tSZWN0ID0gY29uc3RyYWluVHJhY2tSZWN0VG9UcmFj
a1BpZWNlcyhzY3JvbGxiYXIsIHVuY29uc3RyYWluZWRUcmFja1JlY3QpOwpAQCAtMzI2LDQwICsy
MzAsNiBAQCBib29sIFNjcm9sbGJhclRoZW1lR3RrOjpwYWludChTY3JvbGxiYXIqIHNjcm9sbGJh
ciwgR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbgogICAgIHJldHVybiB0cnVlOwogfQogCi12
b2lkIFNjcm9sbGJhclRoZW1lR3RrOjpwYWludEJ1dHRvbihHcmFwaGljc0NvbnRleHQqIGNvbnRl
eHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJbnRSZWN0JiByZWN0LCBTY3JvbGxiYXJQ
YXJ0IHBhcnQpCi17Ci0gICAgaW50IGZsYWdzID0gMDsKLSAgICBpZiAoc2Nyb2xsYmFyLT5vcmll
bnRhdGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFyKQotICAgICAgICBmbGFncyB8PSBNT1pfR1RL
X1NURVBQRVJfVkVSVElDQUw7Ci0KLSAgICBpZiAocGFydCA9PSBGb3J3YXJkQnV0dG9uRW5kUGFy
dCkKLSAgICAgICAgZmxhZ3MgfD0gKE1PWl9HVEtfU1RFUFBFUl9ET1dOIHwgTU9aX0dUS19TVEVQ
UEVSX0JPVFRPTSk7Ci0gICAgaWYgKHBhcnQgPT0gRm9yd2FyZEJ1dHRvblN0YXJ0UGFydCkKLSAg
ICAgICAgZmxhZ3MgfD0gTU9aX0dUS19TVEVQUEVSX0RPV047Ci0KLSAgICBHdGtXaWRnZXRTdGF0
ZSBzdGF0ZTsKLSAgICBzdGF0ZS5mb2N1c2VkID0gVFJVRTsKLSAgICBzdGF0ZS5pc0RlZmF1bHQg
PSBUUlVFOwotICAgIHN0YXRlLmNhbkRlZmF1bHQgPSBUUlVFOwotICAgIHN0YXRlLmRlcHJlc3Nl
ZCA9IEZBTFNFOwotCi0gICAgaWYgKChCYWNrQnV0dG9uU3RhcnRQYXJ0ID09IHBhcnQgJiYgc2Ny
b2xsYmFyLT5jdXJyZW50UG9zKCkpCi0gICAgICAgIHx8IChCYWNrQnV0dG9uRW5kUGFydCA9PSBw
YXJ0ICYmIHNjcm9sbGJhci0+Y3VycmVudFBvcygpKQotICAgICAgICB8fCAoRm9yd2FyZEJ1dHRv
bkVuZFBhcnQgPT0gcGFydCAmJiBzY3JvbGxiYXItPmN1cnJlbnRQb3MoKSAhPSBzY3JvbGxiYXIt
Pm1heGltdW0oKSkKLSAgICAgICAgfHwgKEZvcndhcmRCdXR0b25TdGFydFBhcnQgPT0gcGFydCAm
JiBzY3JvbGxiYXItPmN1cnJlbnRQb3MoKSAhPSBzY3JvbGxiYXItPm1heGltdW0oKSkpIHsKLSAg
ICAgICAgc3RhdGUuZGlzYWJsZWQgPSBGQUxTRTsKLSAgICAgICAgc3RhdGUuYWN0aXZlID0gcGFy
dCA9PSBzY3JvbGxiYXItPnByZXNzZWRQYXJ0KCk7Ci0gICAgICAgIHN0YXRlLmluSG92ZXIgPSBw
YXJ0ID09IHNjcm9sbGJhci0+aG92ZXJlZFBhcnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBz
dGF0ZS5kaXNhYmxlZCA9IFRSVUU7Ci0gICAgICAgIHN0YXRlLmFjdGl2ZSA9IEZBTFNFOwotICAg
ICAgICBzdGF0ZS5pbkhvdmVyID0gRkFMU0U7Ci0gICAgfQotCi0gICAgV2lkZ2V0UmVuZGVyaW5n
Q29udGV4dCB3aWRnZXRDb250ZXh0KGNvbnRleHQsIHJlY3QpOwotICAgIHdpZGdldENvbnRleHQu
cGFpbnRNb3ppbGxhV2lkZ2V0KE1PWl9HVEtfU0NST0xMQkFSX0JVVFRPTiwgJnN0YXRlLCBmbGFn
cyk7Ci19Ci0KIHZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50U2Nyb2xsQ29ybmVyKFNjcm9s
bFZpZXcqIHZpZXcsIEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgY29y
bmVyUmVjdCkKIHsKICAgICAvLyBTY3JvbGxiYXJUaGVtZUNvbXBvc2l0ZTo6cGFpbnRTY3JvbGxD
b3JuZXIgaW5jb3JyZWN0bHkgYXNzdW1lcyB0aGF0IHRoZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9w
bGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGsuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1Nj
cm9sbGJhclRoZW1lR3RrLmgKaW5kZXggOGY5OTBkNS4uYzRkNjFiNyAxMDA2NDQKLS0tIGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGsuaAorKysgYi9XZWJDb3JlL3BsYXRm
b3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0ay5oCkBAIC0yOCw2ICsyOCw4IEBACiAKICNpbmNsdWRl
ICJTY3JvbGxiYXJUaGVtZUNvbXBvc2l0ZS5oIgogCisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4K
KwogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBTY3JvbGxiYXI7CkBAIC02Nyw5ICs2OSwx
NSBAQCBwcm90ZWN0ZWQ6CiAgICAgaW50IG1fc3RlcHBlclNpemU7CiAgICAgaW50IG1fc3RlcHBl
clNwYWNpbmc7CiAgICAgaW50IG1fbWluVGh1bWJMZW5ndGg7Ci0gICAgYm9vbCBtX3Ryb3VnaFVu
ZGVyU3RlcHBlcnM7Ci0gICAgYm9vbCBtX2hhc0ZvcndhcmRCdXR0b25TdGFydFBhcnQ7Ci0gICAg
Ym9vbCBtX2hhc0JhY2tCdXR0b25FbmRQYXJ0OworICAgIGdib29sZWFuIG1fdHJvdWdoVW5kZXJT
dGVwcGVyczsKKyAgICBnYm9vbGVhbiBtX2hhc0ZvcndhcmRCdXR0b25TdGFydFBhcnQ7CisgICAg
Z2Jvb2xlYW4gbV9oYXNCYWNrQnV0dG9uRW5kUGFydDsKKyNpZm5kZWYgR1RLX0FQSV9WRVJTSU9O
XzIKKyAgICBHdGtTdHlsZUNvbnRleHQqIG1fY29udGV4dDsKKyNlbmRpZgorCitwcml2YXRlOgor
ICAgIGNvbnN0IEhhc2hTZXQ8U2Nyb2xsYmFyKj4qIGdldFNjcm9sbGJhcnMoKTsKIH07CiAKIH0K
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1Njcm9sbGJhclRoZW1lR3RrMi5jcHAg
Yi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0azIuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNjJlZGUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJD
b3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0azIuY3BwCkBAIC0wLDAgKzEsMTc3IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZmRlZiBH
VEtfQVBJX1ZFUlNJT05fMgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU2Nyb2xs
YmFyVGhlbWVHdGsuaCIKKworI2luY2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgorI2luY2x1
ZGUgIlJlbmRlclRoZW1lR3RrLmgiCisjaW5jbHVkZSAiU2Nyb2xsVmlldy5oIgorI2luY2x1ZGUg
IlNjcm9sbGJhci5oIgorI2luY2x1ZGUgIldpZGdldFJlbmRlcmluZ0NvbnRleHQuaCIKKyNpbmNs
dWRlICJndGtkcmF3aW5nLmgiCisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK3N0YXRpYyB2b2lkIGd0a1N0eWxlU2V0Q2FsbGJhY2soR3RrV2lkZ2V0KiwgR3Rr
U3R5bGUqLCBTY3JvbGxiYXJUaGVtZUd0ayopOworCitTY3JvbGxiYXJUaGVtZUd0azo6U2Nyb2xs
YmFyVGhlbWVHdGsoKQoreworICAgIHVwZGF0ZVRoZW1lUHJvcGVydGllcygpOworICAgIGdfc2ln
bmFsX2Nvbm5lY3QobW96X2d0a19nZXRfc2Nyb2xsYmFyX3dpZGdldCgpLAorICAgICAgICAgInN0
eWxlLXNldCIsIEdfQ0FMTEJBQ0soZ3RrU3R5bGVTZXRDYWxsYmFjayksIHRoaXMpOworfQorCit2
b2lkIFNjcm9sbGJhclRoZW1lR3RrOjp1cGRhdGVUaGVtZVByb3BlcnRpZXMoKQoreworICAgIE1v
ekd0a1Njcm9sbGJhck1ldHJpY3MgbWV0cmljczsKKyAgICBtb3pfZ3RrX2dldF9zY3JvbGxiYXJf
bWV0cmljcygmbWV0cmljcyk7CisKKyAgICBtX3RodW1iRmF0bmVzcyA9IG1ldHJpY3Muc2xpZGVy
X3dpZHRoOworICAgIG1fdHJvdWdoQm9yZGVyV2lkdGggPSBtZXRyaWNzLnRyb3VnaF9ib3JkZXI7
CisgICAgbV9zdGVwcGVyU2l6ZSA9IG1ldHJpY3Muc3RlcHBlcl9zaXplOworICAgIG1fc3RlcHBl
clNwYWNpbmcgPSBtZXRyaWNzLnN0ZXBwZXJfc3BhY2luZzsKKyAgICBtX21pblRodW1iTGVuZ3Ro
ID0gbWV0cmljcy5taW5fc2xpZGVyX3NpemU7CisgICAgbV90cm91Z2hVbmRlclN0ZXBwZXJzID0g
bWV0cmljcy50cm91Z2hfdW5kZXJfc3RlcHBlcnM7CisgICAgbV9oYXNGb3J3YXJkQnV0dG9uU3Rh
cnRQYXJ0ID0gbWV0cmljcy5oYXNfc2Vjb25kYXJ5X2ZvcndhcmRfc3RlcHBlcjsKKyAgICBtX2hh
c0JhY2tCdXR0b25FbmRQYXJ0ID0gbWV0cmljcy5oYXNfc2Vjb25kYXJ5X2JhY2t3YXJkX3N0ZXBw
ZXI7CisKKyAgICBjb25zdCBIYXNoU2V0PFNjcm9sbGJhcio+KiBnU2Nyb2xsYmFycyA9IGdldFNj
cm9sbGJhcnMoKTsKKyAgICBpZiAoIWdTY3JvbGxiYXJzKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBVcGRhdGUgdGhlIHRoaWNrbmVzcyBvZiBldmVyeSBpbnRlcmlvciBmcmFtZSBzY3JvbGxi
YXIgd2lkZ2V0LiBUaGUKKyAgICAvLyBwbGF0Zm9ybS1pbmRlcGVuZGVudCBzY3JvbGxiYXIgdGhl
bSBjb2RlIGlzbid0IHlldCBzbWFydCBlbm91Z2ggdG8gZ2V0CisgICAgLy8gdGhpcyBpbmZvcm1h
dGlvbiB3aGVuIGl0IHBhaW50cy4KKyAgICBIYXNoU2V0PFNjcm9sbGJhcio+OjppdGVyYXRvciBl
bmQgPSBnU2Nyb2xsYmFycy0+ZW5kKCk7CisgICAgZm9yIChIYXNoU2V0PFNjcm9sbGJhcio+Ojpp
dGVyYXRvciBpdCA9IGdTY3JvbGxiYXJzLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAg
ICAgICAgU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSAoKml0KTsKKworICAgICAgICAvLyBUb3AtbGV2
ZWwgc2Nyb2xsYmFyIGkuZS4gc2Nyb2xsYmFycyB3aG8gaGF2ZSBhIHBhcmVudCBTY3JvbGxWaWV3
CisgICAgICAgIC8vIHdpdGggbm8gcGFyZW50IGFyZSBuYXRpdmUsIGFuZCB0aHVzIGRvIG5vdCBu
ZWVkIHRvIGJlIHJlc2l6ZWQuCisgICAgICAgIGlmICghc2Nyb2xsYmFyLT5wYXJlbnQoKSB8fCAh
c2Nyb2xsYmFyLT5wYXJlbnQoKS0+cGFyZW50KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAg
ICAgICAgaW50IHRoaWNrbmVzcyA9IHNjcm9sbGJhclRoaWNrbmVzcyhzY3JvbGxiYXItPmNvbnRy
b2xTaXplKCkpOworICAgICAgICBpZiAoc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IEhvcml6
b250YWxTY3JvbGxiYXIpCisgICAgICAgICAgICBzY3JvbGxiYXItPnNldEZyYW1lUmVjdChJbnRS
ZWN0KDAsIHNjcm9sbGJhci0+cGFyZW50KCktPmhlaWdodCgpIC0gdGhpY2tuZXNzLCBzY3JvbGxi
YXItPndpZHRoKCksIHRoaWNrbmVzcykpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzY3Jv
bGxiYXItPnNldEZyYW1lUmVjdChJbnRSZWN0KHNjcm9sbGJhci0+cGFyZW50KCktPndpZHRoKCkg
LSB0aGlja25lc3MsIDAsIHRoaWNrbmVzcywgc2Nyb2xsYmFyLT5oZWlnaHQoKSkpOworICAgIH0K
K30KKworc3RhdGljIHZvaWQgZ3RrU3R5bGVTZXRDYWxsYmFjayhHdGtXaWRnZXQqIHdpZGdldCwg
R3RrU3R5bGUqIHByZXZpb3VzLCBTY3JvbGxiYXJUaGVtZUd0ayogc2Nyb2xsYmFyVGhlbWUpCit7
CisgICAgc2Nyb2xsYmFyVGhlbWUtPnVwZGF0ZVRoZW1lUHJvcGVydGllcygpOworfQorCit2b2lk
IFNjcm9sbGJhclRoZW1lR3RrOjpwYWludFRyYWNrQmFja2dyb3VuZChHcmFwaGljc0NvbnRleHQq
IGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJbnRSZWN0JiByZWN0KQorewor
ICAgIEd0a1dpZGdldFN0YXRlIHN0YXRlOworICAgIHN0YXRlLmZvY3VzZWQgPSBGQUxTRTsKKyAg
ICBzdGF0ZS5pc0RlZmF1bHQgPSBGQUxTRTsKKyAgICBzdGF0ZS5jYW5EZWZhdWx0ID0gRkFMU0U7
CisgICAgc3RhdGUuZGlzYWJsZWQgPSBGQUxTRTsKKyAgICBzdGF0ZS5hY3RpdmUgPSBGQUxTRTsK
KyAgICBzdGF0ZS5pbkhvdmVyID0gRkFMU0U7CisKKyAgICAvLyBQYWludCB0aGUgdHJhY2sgYmFj
a2dyb3VuZC4gSWYgdGhlIHRyb3VnaC11bmRlci1zdGVwcGVycyBwcm9wZXJ0eSBpcyB0cnVlLCB0
aGlzCisgICAgLy8gc2hvdWxkIGJlIHRoZSBmdWxsIHNpemUgb2YgdGhlIHNjcm9sbGJhciwgYnV0
IGlmIGlzIGZhbHNlLCBpdCBzaG91bGQgb25seSBiZSB0aGUKKyAgICAvLyB0cmFjayByZWN0Lgor
ICAgIEludFJlY3QgZnVsbFNjcm9sbGJhclJlY3QgPSByZWN0OworICAgIGlmIChtX3Ryb3VnaFVu
ZGVyU3RlcHBlcnMpCisgICAgICAgIGZ1bGxTY3JvbGxiYXJSZWN0ID0gSW50UmVjdChzY3JvbGxi
YXItPngoKSwgc2Nyb2xsYmFyLT55KCksIHNjcm9sbGJhci0+d2lkdGgoKSwgc2Nyb2xsYmFyLT5o
ZWlnaHQoKSk7CisKKyAgICBHdGtUaGVtZVdpZGdldFR5cGUgdHlwZSA9IHNjcm9sbGJhci0+b3Jp
ZW50YXRpb24oKSA9PSBWZXJ0aWNhbFNjcm9sbGJhciA/IE1PWl9HVEtfU0NST0xMQkFSX1RSQUNL
X1ZFUlRJQ0FMIDogTU9aX0dUS19TQ1JPTExCQVJfVFJBQ0tfSE9SSVpPTlRBTDsKKyAgICBXaWRn
ZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENvbnRleHQoY29udGV4dCwgZnVsbFNjcm9sbGJhclJl
Y3QpOworICAgIHdpZGdldENvbnRleHQucGFpbnRNb3ppbGxhV2lkZ2V0KHR5cGUsICZzdGF0ZSwg
MCk7Cit9CisKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50U2Nyb2xsYmFyQmFja2dyb3Vu
ZChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyKQoreworICAg
IC8vIFRoaXMgaXMgdW51c2VkIGJ5IHRoZSBtb3pfZ3RrX3Njcm9sbGVjZF93aW5kb3dfcGFpbnQu
CisgICAgR3RrV2lkZ2V0U3RhdGUgc3RhdGU7CisgICAgSW50UmVjdCBmdWxsU2Nyb2xsYmFyUmVj
dCA9IEludFJlY3Qoc2Nyb2xsYmFyLT54KCksIHNjcm9sbGJhci0+eSgpLCBzY3JvbGxiYXItPndp
ZHRoKCksIHNjcm9sbGJhci0+aGVpZ2h0KCkpOworICAgIFdpZGdldFJlbmRlcmluZ0NvbnRleHQg
d2lkZ2V0Q29udGV4dChjb250ZXh0LCBmdWxsU2Nyb2xsYmFyUmVjdCk7CisgICAgd2lkZ2V0Q29u
dGV4dC5wYWludE1vemlsbGFXaWRnZXQoTU9aX0dUS19TQ1JPTExFRF9XSU5ET1csICZzdGF0ZSwg
MCk7Cit9CisKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50VGh1bWIoR3JhcGhpY3NDb250
ZXh0KiBjb250ZXh0LCBTY3JvbGxiYXIqIHNjcm9sbGJhciwgY29uc3QgSW50UmVjdCYgcmVjdCkK
K3sKKyAgICBHdGtXaWRnZXRTdGF0ZSBzdGF0ZTsKKyAgICBzdGF0ZS5mb2N1c2VkID0gRkFMU0U7
CisgICAgc3RhdGUuaXNEZWZhdWx0ID0gRkFMU0U7CisgICAgc3RhdGUuY2FuRGVmYXVsdCA9IEZB
TFNFOworICAgIHN0YXRlLmRpc2FibGVkID0gRkFMU0U7CisgICAgc3RhdGUuYWN0aXZlID0gc2Ny
b2xsYmFyLT5wcmVzc2VkUGFydCgpID09IFRodW1iUGFydDsKKyAgICBzdGF0ZS5pbkhvdmVyID0g
c2Nyb2xsYmFyLT5ob3ZlcmVkUGFydCgpID09IFRodW1iUGFydDsKKyAgICBzdGF0ZS5tYXhwb3Mg
PSBzY3JvbGxiYXItPm1heGltdW0oKTsKKyAgICBzdGF0ZS5jdXJwb3MgPSBzY3JvbGxiYXItPmN1
cnJlbnRQb3MoKTsKKworICAgIEd0a1RoZW1lV2lkZ2V0VHlwZSB0eXBlID0gc2Nyb2xsYmFyLT5v
cmllbnRhdGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFyID8gTU9aX0dUS19TQ1JPTExCQVJfVEhV
TUJfVkVSVElDQUwgOiBNT1pfR1RLX1NDUk9MTEJBUl9USFVNQl9IT1JJWk9OVEFMOworICAgIFdp
ZGdldFJlbmRlcmluZ0NvbnRleHQgd2lkZ2V0Q29udGV4dChjb250ZXh0LCByZWN0KTsKKyAgICB3
aWRnZXRDb250ZXh0LnBhaW50TW96aWxsYVdpZGdldCh0eXBlLCAmc3RhdGUsIDApOworfQorCit2
b2lkIFNjcm9sbGJhclRoZW1lR3RrOjpwYWludEJ1dHRvbihHcmFwaGljc0NvbnRleHQqIGNvbnRl
eHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJbnRSZWN0JiByZWN0LCBTY3JvbGxiYXJQ
YXJ0IHBhcnQpCit7CisgICAgaW50IGZsYWdzID0gMDsKKyAgICBpZiAoc2Nyb2xsYmFyLT5vcmll
bnRhdGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICBmbGFncyB8PSBNT1pfR1RL
X1NURVBQRVJfVkVSVElDQUw7CisKKyAgICBpZiAocGFydCA9PSBGb3J3YXJkQnV0dG9uRW5kUGFy
dCkKKyAgICAgICAgZmxhZ3MgfD0gKE1PWl9HVEtfU1RFUFBFUl9ET1dOIHwgTU9aX0dUS19TVEVQ
UEVSX0JPVFRPTSk7CisgICAgaWYgKHBhcnQgPT0gRm9yd2FyZEJ1dHRvblN0YXJ0UGFydCkKKyAg
ICAgICAgZmxhZ3MgfD0gTU9aX0dUS19TVEVQUEVSX0RPV047CisKKyAgICBHdGtXaWRnZXRTdGF0
ZSBzdGF0ZTsKKyAgICBzdGF0ZS5mb2N1c2VkID0gVFJVRTsKKyAgICBzdGF0ZS5pc0RlZmF1bHQg
PSBUUlVFOworICAgIHN0YXRlLmNhbkRlZmF1bHQgPSBUUlVFOworICAgIHN0YXRlLmRlcHJlc3Nl
ZCA9IEZBTFNFOworCisgICAgaWYgKChCYWNrQnV0dG9uU3RhcnRQYXJ0ID09IHBhcnQgJiYgc2Ny
b2xsYmFyLT5jdXJyZW50UG9zKCkpCisgICAgICAgIHx8IChCYWNrQnV0dG9uRW5kUGFydCA9PSBw
YXJ0ICYmIHNjcm9sbGJhci0+Y3VycmVudFBvcygpKQorICAgICAgICB8fCAoRm9yd2FyZEJ1dHRv
bkVuZFBhcnQgPT0gcGFydCAmJiBzY3JvbGxiYXItPmN1cnJlbnRQb3MoKSAhPSBzY3JvbGxiYXIt
Pm1heGltdW0oKSkKKyAgICAgICAgfHwgKEZvcndhcmRCdXR0b25TdGFydFBhcnQgPT0gcGFydCAm
JiBzY3JvbGxiYXItPmN1cnJlbnRQb3MoKSAhPSBzY3JvbGxiYXItPm1heGltdW0oKSkpIHsKKyAg
ICAgICAgc3RhdGUuZGlzYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgc3RhdGUuYWN0aXZlID0gcGFy
dCA9PSBzY3JvbGxiYXItPnByZXNzZWRQYXJ0KCk7CisgICAgICAgIHN0YXRlLmluSG92ZXIgPSBw
YXJ0ID09IHNjcm9sbGJhci0+aG92ZXJlZFBhcnQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBz
dGF0ZS5kaXNhYmxlZCA9IFRSVUU7CisgICAgICAgIHN0YXRlLmFjdGl2ZSA9IEZBTFNFOworICAg
ICAgICBzdGF0ZS5pbkhvdmVyID0gRkFMU0U7CisgICAgfQorCisgICAgV2lkZ2V0UmVuZGVyaW5n
Q29udGV4dCB3aWRnZXRDb250ZXh0KGNvbnRleHQsIHJlY3QpOworICAgIHdpZGdldENvbnRleHQu
cGFpbnRNb3ppbGxhV2lkZ2V0KE1PWl9HVEtfU0NST0xMQkFSX0JVVFRPTiwgJnN0YXRlLCBmbGFn
cyk7Cit9CisKK30KKworI2VuZGlmIC8vIEdUS19BUElfVkVSU0lPTl8yCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0azMuY3BwIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGszLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi4xY2RlY2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9n
dGsvU2Nyb2xsYmFyVGhlbWVHdGszLmNwcApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEdUS19BUElfVkVSU0lP
Tl8yCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTY3JvbGxiYXJUaGVtZUd0ay5o
IgorCisjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCisjaW5jbHVkZSAiUmVuZGVyVGhl
bWVHdGsuaCIKKyNpbmNsdWRlICJTY3JvbGxWaWV3LmgiCisjaW5jbHVkZSAiU2Nyb2xsYmFyLmgi
CisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyB2
b2lkIGd0a1N0eWxlQ2hhbmdlZENhbGxiYWNrKEd0a1dpZGdldCosIFNjcm9sbGJhclRoZW1lR3Rr
KiBzY3JvbGxiYXJUaGVtZSkKK3sKKyAgICBzY3JvbGxiYXJUaGVtZS0+dXBkYXRlVGhlbWVQcm9w
ZXJ0aWVzKCk7Cit9CisKK1Njcm9sbGJhclRoZW1lR3RrOjpTY3JvbGxiYXJUaGVtZUd0aygpCit7
CisgICAgbV9jb250ZXh0ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGhlbWVHdGsqPihSZW5kZXJUaGVt
ZTo6ZGVmYXVsdFRoZW1lKCkuZ2V0KCkpLT5ndGtTY3JvbGxiYXJTdHlsZSgpOworICAgIHVwZGF0
ZVRoZW1lUHJvcGVydGllcygpOworICAgIGdfc2lnbmFsX2Nvbm5lY3QobV9jb250ZXh0LCAiY2hh
bmdlZCIsIEdfQ0FMTEJBQ0soZ3RrU3R5bGVDaGFuZ2VkQ2FsbGJhY2spLCB0aGlzKTsKK30KKwor
dm9pZCBTY3JvbGxiYXJUaGVtZUd0azo6dXBkYXRlVGhlbWVQcm9wZXJ0aWVzKCkKK3sKKyAgICBn
dGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUobV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAibWluLXNsaWRlci1sZW5ndGgiLCAmbV9taW5UaHVtYkxlbmd0aCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWRlci13aWR0aCIsICZtX3RodW1iRmF0
bmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyb3VnaC1ib3JkZXIiLCAm
bV90cm91Z2hCb3JkZXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0
ZXBwZXItc2l6ZSIsICZtX3N0ZXBwZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAic3RlcHBlci1zcGFjaW5nIiwgJm1fc3RlcHBlclNwYWNpbmcsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICJ0cm91Z2gtdW5kZXItc3RlcHBlcnMiLCAmbV90cm91Z2hVbmRl
clN0ZXBwZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzLXNlY29uZGFy
eS1iYWNrd2FyZC1zdGVwcGVyIiwgJm1faGFzQmFja0J1dHRvbkVuZFBhcnQsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICJoYXMtc2Vjb25kYXJ5LWZvcndhcmQtc3RlcHBlciIsICZt
X2hhc0ZvcndhcmRCdXR0b25TdGFydFBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDApOworCisgICAgY29uc3QgSGFzaFNldDxTY3JvbGxiYXIqPiogZ1Njcm9sbGJhcnMgPSBn
ZXRTY3JvbGxiYXJzKCk7CisgICAgaWYgKCFnU2Nyb2xsYmFycykKKyAgICAgICAgcmV0dXJuOwor
CisgICAgLy8gVXBkYXRlIHRoZSB0aGlja25lc3Mgb2YgZXZlcnkgaW50ZXJpb3IgZnJhbWUgc2Ny
b2xsYmFyIHdpZGdldC4gVGhlCisgICAgLy8gcGxhdGZvcm0taW5kZXBlbmRlbnQgc2Nyb2xsYmFy
IHRoZW0gY29kZSBpc24ndCB5ZXQgc21hcnQgZW5vdWdoIHRvIGdldAorICAgIC8vIHRoaXMgaW5m
b3JtYXRpb24gd2hlbiBpdCBwYWludHMuCisgICAgSGFzaFNldDxTY3JvbGxiYXIqPjo6aXRlcmF0
b3IgZW5kID0gZ1Njcm9sbGJhcnMtPmVuZCgpOworICAgIGZvciAoSGFzaFNldDxTY3JvbGxiYXIq
Pjo6aXRlcmF0b3IgaXQgPSBnU2Nyb2xsYmFycy0+YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7
CisgICAgICAgIFNjcm9sbGJhciogc2Nyb2xsYmFyID0gKCppdCk7CisKKyAgICAgICAgLy8gVG9w
LWxldmVsIHNjcm9sbGJhciBpLmUuIHNjcm9sbGJhcnMgd2hvIGhhdmUgYSBwYXJlbnQgU2Nyb2xs
VmlldworICAgICAgICAvLyB3aXRoIG5vIHBhcmVudCBhcmUgbmF0aXZlLCBhbmQgdGh1cyBkbyBu
b3QgbmVlZCB0byBiZSByZXNpemVkLgorICAgICAgICBpZiAoIXNjcm9sbGJhci0+cGFyZW50KCkg
fHwgIXNjcm9sbGJhci0+cGFyZW50KCktPnBhcmVudCgpKQorICAgICAgICAgICAgcmV0dXJuOwor
CisgICAgICAgIGludCB0aGlja25lc3MgPSBzY3JvbGxiYXJUaGlja25lc3Moc2Nyb2xsYmFyLT5j
b250cm9sU2l6ZSgpKTsKKyAgICAgICAgaWYgKHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBI
b3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICAgICAgc2Nyb2xsYmFyLT5zZXRGcmFtZVJlY3Qo
SW50UmVjdCgwLCBzY3JvbGxiYXItPnBhcmVudCgpLT5oZWlnaHQoKSAtIHRoaWNrbmVzcywgc2Ny
b2xsYmFyLT53aWR0aCgpLCB0aGlja25lc3MpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
c2Nyb2xsYmFyLT5zZXRGcmFtZVJlY3QoSW50UmVjdChzY3JvbGxiYXItPnBhcmVudCgpLT53aWR0
aCgpIC0gdGhpY2tuZXNzLCAwLCB0aGlja25lc3MsIHNjcm9sbGJhci0+aGVpZ2h0KCkpKTsKKyAg
ICB9Cit9CisKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50VHJhY2tCYWNrZ3JvdW5kKEdy
YXBoaWNzQ29udGV4dCogY29udGV4dCwgU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGNvbnN0IEludFJl
Y3QmIHJlY3QpCit7CisgICAgLy8gUGFpbnQgdGhlIHRyYWNrIGJhY2tncm91bmQuIElmIHRoZSB0
cm91Z2gtdW5kZXItc3RlcHBlcnMgcHJvcGVydHkgaXMgdHJ1ZSwgdGhpcworICAgIC8vIHNob3Vs
ZCBiZSB0aGUgZnVsbCBzaXplIG9mIHRoZSBzY3JvbGxiYXIsIGJ1dCBpZiBpcyBmYWxzZSwgaXQg
c2hvdWxkIG9ubHkgYmUgdGhlCisgICAgLy8gdHJhY2sgcmVjdC4KKyAgICBJbnRSZWN0IGZ1bGxT
Y3JvbGxiYXJSZWN0ID0gcmVjdDsKKyAgICBpZiAobV90cm91Z2hVbmRlclN0ZXBwZXJzKQorICAg
ICAgICBmdWxsU2Nyb2xsYmFyUmVjdCA9IEludFJlY3Qoc2Nyb2xsYmFyLT54KCksIHNjcm9sbGJh
ci0+eSgpLCBzY3JvbGxiYXItPndpZHRoKCksIHNjcm9sbGJhci0+aGVpZ2h0KCkpOworCisgICAg
Z3RrX3N0eWxlX2NvbnRleHRfc2F2ZShtX2NvbnRleHQpOworCisgICAgZ3RrX3N0eWxlX2NvbnRl
eHRfYWRkX2NsYXNzKG1fY29udGV4dCwgR1RLX1NUWUxFX0NMQVNTX1NDUk9MTEJBUik7CisgICAg
Z3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKG1fY29udGV4dCwgR1RLX1NUWUxFX0NMQVNTX1RS
T1VHSCk7CisKKyAgICBndGtfcmVuZGVyX2JhY2tncm91bmQobV9jb250ZXh0LCBjb250ZXh0LT5w
bGF0Zm9ybUNvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFNjcm9sbGJh
clJlY3QueCgpLCBmdWxsU2Nyb2xsYmFyUmVjdC55KCksIGZ1bGxTY3JvbGxiYXJSZWN0LndpZHRo
KCksIGZ1bGxTY3JvbGxiYXJSZWN0LmhlaWdodCgpKTsKKyAgICBndGtfcmVuZGVyX2ZyYW1lKG1f
Y29udGV4dCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksCisgICAgICAgICAgICAgICAgICAg
ICBmdWxsU2Nyb2xsYmFyUmVjdC54KCksIGZ1bGxTY3JvbGxiYXJSZWN0LnkoKSwgZnVsbFNjcm9s
bGJhclJlY3Qud2lkdGgoKSwgZnVsbFNjcm9sbGJhclJlY3QuaGVpZ2h0KCkpOworCisgICAgZ3Rr
X3N0eWxlX2NvbnRleHRfcmVzdG9yZShtX2NvbnRleHQpOworfQorCit2b2lkIFNjcm9sbGJhclRo
ZW1lR3RrOjpwYWludFNjcm9sbGJhckJhY2tncm91bmQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0
LCBTY3JvbGxiYXIqIHNjcm9sbGJhcikKK3sKKyAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKG1f
Y29udGV4dCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MobV9jb250ZXh0LCBH
VEtfU1RZTEVfQ0xBU1NfU0NST0xMQkFSKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xh
c3MobV9jb250ZXh0LCAic2Nyb2xsZWQtd2luZG93Iik7CisgICAgZ3RrX3JlbmRlcl9mcmFtZSht
X2NvbnRleHQsIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBzY3JvbGxiYXItPngoKSwgc2Ny
b2xsYmFyLT55KCksIHNjcm9sbGJhci0+d2lkdGgoKSwgc2Nyb2xsYmFyLT5oZWlnaHQoKSk7CisK
KyAgICBndGtfc3R5bGVfY29udGV4dF9yZXN0b3JlKG1fY29udGV4dCk7Cit9CisKK3ZvaWQgU2Ny
b2xsYmFyVGhlbWVHdGs6OnBhaW50VGh1bWIoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBTY3Jv
bGxiYXIqIHNjcm9sbGJhciwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBndGtfc3R5bGVf
Y29udGV4dF9zYXZlKG1fY29udGV4dCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xh
c3MobV9jb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfU0NST0xMQkFSKTsKKyAgICBndGtfc3R5bGVf
Y29udGV4dF9hZGRfY2xhc3MobV9jb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfU0xJREVSKTsKKwor
ICAgIGd1aW50IGZsYWdzID0gMDsKKyAgICBpZiAoc2Nyb2xsYmFyLT5wcmVzc2VkUGFydCgpID09
IFRodW1iUGFydCkKKyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfQUNUSVZFOworICAg
IGlmIChzY3JvbGxiYXItPmhvdmVyZWRQYXJ0KCkgPT0gVGh1bWJQYXJ0KQorICAgICAgICBmbGFn
cyB8PSBHVEtfU1RBVEVfRkxBR19QUkVMSUdIVDsKKyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRf
c3RhdGUobV9jb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPihmbGFncykpOworCisg
ICAgZ3RrX3JlbmRlcl9zbGlkZXIobV9jb250ZXh0LCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQo
KSwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCksCisgICAg
ICAgICAgICAgICAgICAgICAgc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IFZlcnRpY2FsU2Ny
b2xsYmFyID8gR1RLX09SSUVOVEFUSU9OX1ZFUlRJQ0FMIDogR1RLX09SSUVOVEFUSU9OX0hPUkla
T05UQUwpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShtX2NvbnRleHQpOworfQor
Cit2b2lkIFNjcm9sbGJhclRoZW1lR3RrOjpwYWludEJ1dHRvbihHcmFwaGljc0NvbnRleHQqIGNv
bnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJbnRSZWN0JiByZWN0LCBTY3JvbGxi
YXJQYXJ0IHBhcnQpCit7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShtX2NvbnRleHQpOwor
CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKG1fY29udGV4dCwgR1RLX1NUWUxFX0NM
QVNTX1NDUk9MTEJBUik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKG1fY29udGV4
dCwgR1RLX1NUWUxFX0NMQVNTX0JVVFRPTik7CisKKyAgICBndWludCBmbGFncyA9IDA7CisgICAg
aWYgKChCYWNrQnV0dG9uU3RhcnRQYXJ0ID09IHBhcnQgJiYgc2Nyb2xsYmFyLT5jdXJyZW50UG9z
KCkpCisgICAgICAgIHx8IChCYWNrQnV0dG9uRW5kUGFydCA9PSBwYXJ0ICYmIHNjcm9sbGJhci0+
Y3VycmVudFBvcygpKQorICAgICAgICB8fCAoRm9yd2FyZEJ1dHRvbkVuZFBhcnQgPT0gcGFydCAm
JiBzY3JvbGxiYXItPmN1cnJlbnRQb3MoKSAhPSBzY3JvbGxiYXItPm1heGltdW0oKSkKKyAgICAg
ICAgfHwgKEZvcndhcmRCdXR0b25TdGFydFBhcnQgPT0gcGFydCAmJiBzY3JvbGxiYXItPmN1cnJl
bnRQb3MoKSAhPSBzY3JvbGxiYXItPm1heGltdW0oKSkpIHsKKyAgICAgICAgaWYgKHBhcnQgPT0g
c2Nyb2xsYmFyLT5wcmVzc2VkUGFydCgpKQorICAgICAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRF
X0ZMQUdfQUNUSVZFOworICAgICAgICBpZiAocGFydCA9PSBzY3JvbGxiYXItPmhvdmVyZWRQYXJ0
KCkpCisgICAgICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19QUkVMSUdIVDsKKyAgICB9
IGVsc2UKKyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfSU5TRU5TSVRJVkU7CisgICAg
Z3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0YXRlKG1fY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrU3Rh
dGVGbGFncz4oZmxhZ3MpKTsKKworICAgIGd0a19yZW5kZXJfYmFja2dyb3VuZChtX2NvbnRleHQs
IGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lk
dGgoKSwgcmVjdC5oZWlnaHQoKSk7CisgICAgZ3RrX3JlbmRlcl9mcmFtZShtX2NvbnRleHQsIGNv
bnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgo
KSwgcmVjdC5oZWlnaHQoKSk7CisKKyAgICBnZmxvYXQgYXJyb3dTY2FsaW5nOworICAgIGd0a19z
dHlsZV9jb250ZXh0X2dldF9zdHlsZShtX2NvbnRleHQsICJhcnJvdy1zY2FsaW5nIiwgJmFycm93
U2NhbGluZywgMCk7CisKKyAgICBJbnRTaXplIGFycm93U2l6ZSA9IHJlY3Quc2l6ZSgpOworICAg
IGFycm93U2l6ZS5zY2FsZShhcnJvd1NjYWxpbmcpOworICAgIEludFBvaW50IGFycm93UG9pbnQo
cmVjdC54KCkgKyAocmVjdC53aWR0aCgpIC0gYXJyb3dTaXplLndpZHRoKCkpIC8gMiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHJlY3QueSgpICsgKHJlY3QuaGVpZ2h0KCkgLSBhcnJvd1NpemUu
aGVpZ2h0KCkpIC8gMik7CisKKyAgICBpZiAoZmxhZ3MgJiBHVEtfU1RBVEVfRkxBR19BQ1RJVkUp
IHsKKyAgICAgICAgZ2ludCBhcnJvd0Rpc3BsYWNlbWVudFgsIGFycm93RGlzcGxhY2VtZW50WTsK
KyAgICAgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKG1fY29udGV4dCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJvdy1kaXNwbGFjZW1lbnQteCIsICZhcnJv
d0Rpc3BsYWNlbWVudFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJy
b3ctZGlzcGxhY2VtZW50LXkiLCAmYXJyb3dEaXNwbGFjZW1lbnRZLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIGFycm93UG9pbnQubW92ZShhcnJvd0Rp
c3BsYWNlbWVudFgsIGFycm93RGlzcGxhY2VtZW50WSk7CisgICAgfQorCisgICAgZ2RvdWJsZSBh
bmdsZSwgc2l6ZTsKKyAgICBpZiAoc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IFZlcnRpY2Fs
U2Nyb2xsYmFyKSB7CisgICAgICAgIHNpemUgPSBhcnJvd1NpemUud2lkdGgoKTsKKyAgICAgICAg
YW5nbGUgPSAocGFydCA9PSBGb3J3YXJkQnV0dG9uRW5kUGFydCB8fCBwYXJ0ID09IEZvcndhcmRC
dXR0b25TdGFydFBhcnQpID8gR19QSSA6IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZSA9
IGFycm93U2l6ZS5oZWlnaHQoKTsKKyAgICAgICAgYW5nbGUgPSAocGFydCA9PSBGb3J3YXJkQnV0
dG9uRW5kUGFydCB8fCBwYXJ0ID09IEZvcndhcmRCdXR0b25TdGFydFBhcnQpID8gR19QSSAvIDIg
OiAzICogKEdfUEkgLyAyKTsKKyAgICB9CisKKyAgICBndGtfcmVuZGVyX2Fycm93KG1fY29udGV4
dCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIGFuZ2xlLCBhcnJvd1BvaW50LngoKSwgYXJy
b3dQb2ludC55KCksIHNpemUpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShtX2Nv
bnRleHQpOworfQorCit9CisKKyNlbmRpZiAvLyAhR1RLX0FQSV9WRVJTSU9OXzIKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1dpZGdldFJlbmRlcmluZ0NvbnRleHQuaCBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3RrL1dpZGdldFJlbmRlcmluZ0NvbnRleHQuaAppbmRleCAzYmI4MDY1Li4w
Njg0ZTIwIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9XaWRnZXRSZW5kZXJpbmdD
b250ZXh0LmgKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvV2lkZ2V0UmVuZGVyaW5nQ29udGV4
dC5oCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KICAq
CiAgKi8KKyNpZmRlZiBHVEtfQVBJX1ZFUlNJT05fMgogCiAjaWZuZGVmIFdpZGdldFJlbmRlcmlu
Z0NvbnRleHRfaAogI2RlZmluZSBXaWRnZXRSZW5kZXJpbmdDb250ZXh0X2gKQEAgLTQzLDE0ICs0
NCwxMSBAQCBwcml2YXRlOgogICAgIEludFNpemUgbV9leHRyYVNwYWNlOwogICAgIGJvb2wgbV9o
YWRFcnJvcjsKIAotI2lmZGVmIEdUS19BUElfVkVSU0lPTl8yCiAgICAgR2RrRHJhd2FibGUqIG1f
dGFyZ2V0OwotI2Vsc2UKLSAgICBjYWlyb190KiBtX3RhcmdldDsKLSNlbmRpZgotCiB9OwogCiB9
CiAKICNlbmRpZgorCisjZW5kaWYgLy8gR1RLX0FQSV9WRVJTSU9OXzIKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3RrL1dpZGdldFJlbmRlcmluZ0NvbnRleHRHdGsyLmNwcCBiL1dlYkNv
cmUvcGxhdGZvcm0vZ3RrL1dpZGdldFJlbmRlcmluZ0NvbnRleHRHdGsyLmNwcAppbmRleCBmZDBi
OWNhLi5hZDdhNTQxIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9XaWRnZXRSZW5k
ZXJpbmdDb250ZXh0R3RrMi5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvV2lkZ2V0UmVu
ZGVyaW5nQ29udGV4dEd0azIuY3BwCkBAIC03Miw3ICs3Miw3IEBAIHN0YXRpYyBJbnRTaXplIGdl
dEV4dHJhU3BhY2VGb3JXaWRnZXQoUmVuZGVyVGhlbWVHdGsqIHRoZW1lKQogCiAgICAgLy8gVGhl
IGNoZWNrYm94IGV4dHJhIHNwYWNlIGlzIGNhbGN1bGF0ZWQgYnkgbG9va2luZyBhdCB0aGUgd2lk
Z2V0IHN0eWxlLgogICAgIGludCBpbmRpY2F0b3JTaXplLCBpbmRpY2F0b3JTcGFjaW5nOwotICAg
IHRoZW1lLT5nZXRJbmRpY2F0b3JNZXRyaWNzKENoZWNrYm94UGFydCwgaW5kaWNhdG9yU2l6ZSwg
aW5kaWNhdG9yU3BhY2luZyk7CisgICAgbW96X2d0a19jaGVja2JveF9nZXRfbWV0cmljcygmaW5k
aWNhdG9yU2l6ZSwgJmluZGljYXRvclNwYWNpbmcpOwogICAgIEludFNpemUgZXh0cmFTcGFjZShp
bmRpY2F0b3JTcGFjaW5nLCBpbmRpY2F0b3JTcGFjaW5nKTsKIAogICAgIC8vIFNjcm9sbGJhciB0
aHVtYnMgbmVlZCBhdCBsZWFzdCBhbiBleHRyYSBwaXhlbCBhbG9uZyB0aGVpciBtb3ZlbWVudCBh
eGlzLgpAQCAtODUsMTEgKzg1LDEyIEBAIFdpZGdldFJlbmRlcmluZ0NvbnRleHQ6OldpZGdldFJl
bmRlcmluZ0NvbnRleHQoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsCiAgICAgLCBt
X2hhZEVycm9yKGZhbHNlKQogewogICAgIFJlbmRlclRoZW1lR3RrKiB0aGVtZSA9IHN0YXRpY19j
YXN0PFJlbmRlclRoZW1lR3RrKj4oUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLmdldCgpKTsK
KyAgICBHdGtUaGVtZVBhcnRzKiBwYXJ0cyA9IG1vel9ndGtfZ2V0X3RoZW1lX3BhcnRzKCk7CiAK
ICAgICAvLyBGYWxsYmFjazogV2UgZmFpbGVkIHRvIGNyZWF0ZSBhbiBSR0JBIGNvbG9ybWFwIGVh
cmxpZXIsIHNvIHdlIGNhbm5vdCBwcm9wZXJseSBwYWludCAKICAgICAvLyB0byBhIHRlbXBvcmFy
eSBzdXJmYWNlIGFuZCBwcmVzZXJ2ZSB0cmFuc3BhcmVuY3kuIFRvIGVuc3VyZSBkZWNlbnQgd2lk
Z2V0IHJlbmRlcmluZywganVzdAogICAgIC8vIHBhaW50IGRpcmVjdGx5IHRvIHRoZSB0YXJnZXQg
ZHJhd2FibGUuIFRoaXMgd2lsbCBub3QgcmVuZGVyIENTUyByb3RhdGlvbmFsIHRyYW5zZm9ybXMg
cHJvcGVybHkuCi0gICAgaWYgKCF0aGVtZS0+bV90aGVtZVBhcnRzSGF2ZVJHQkFDb2xvcm1hcCAm
JiBncmFwaGljc0NvbnRleHQtPmdka1dpbmRvdygpKSB7CisgICAgaWYgKCFwYXJ0cy0+aGF2ZVJH
QkFDb2xvcm1hcCAmJiBncmFwaGljc0NvbnRleHQtPmdka1dpbmRvdygpKSB7CiAgICAgICAgIG1f
cGFpbnRSZWN0ID0gZ3JhcGhpY3NDb250ZXh0LT5nZXRDVE0oKS5tYXBSZWN0KHRhcmdldFJlY3Qp
OwogICAgICAgICBtX3RhcmdldCA9IGdyYXBoaWNzQ29udGV4dC0+Z2RrV2luZG93KCk7CiAgICAg
ICAgIHJldHVybjsKQEAgLTExNiw4ICsxMTcsOCBAQCBXaWRnZXRSZW5kZXJpbmdDb250ZXh0OjpX
aWRnZXRSZW5kZXJpbmdDb250ZXh0KEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LAog
ICAgICAgICB3aWR0aCA9ICgxICsgKHdpZHRoID4+IDUpKSA8PCA1OwogICAgICAgICBoZWlnaHQg
PSAoMSArIChoZWlnaHQgPj4gNSkpIDw8IDU7CiAKLSAgICAgICAgZ1NjcmF0Y2hCdWZmZXIgPSBn
ZGtfcGl4bWFwX25ldygwLCB3aWR0aCwgaGVpZ2h0LCBnZGtfY29sb3JtYXBfZ2V0X3Zpc3VhbCh0
aGVtZS0+bV90aGVtZVBhcnRzLmNvbG9ybWFwKS0+ZGVwdGgpOwotICAgICAgICBnZGtfZHJhd2Fi
bGVfc2V0X2NvbG9ybWFwKGdTY3JhdGNoQnVmZmVyLCB0aGVtZS0+bV90aGVtZVBhcnRzLmNvbG9y
bWFwKTsKKyAgICAgICAgZ1NjcmF0Y2hCdWZmZXIgPSBnZGtfcGl4bWFwX25ldygwLCB3aWR0aCwg
aGVpZ2h0LCBnZGtfY29sb3JtYXBfZ2V0X3Zpc3VhbChwYXJ0cy0+Y29sb3JtYXApLT5kZXB0aCk7
CisgICAgICAgIGdka19kcmF3YWJsZV9zZXRfY29sb3JtYXAoZ1NjcmF0Y2hCdWZmZXIsIHBhcnRz
LT5jb2xvcm1hcCk7CiAgICAgfQogICAgIG1fdGFyZ2V0ID0gZ1NjcmF0Y2hCdWZmZXI7CiAKQEAg
LTEzMCw4ICsxMzEsOCBAQCBXaWRnZXRSZW5kZXJpbmdDb250ZXh0OjpXaWRnZXRSZW5kZXJpbmdD
b250ZXh0KEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LAogV2lkZ2V0UmVuZGVyaW5n
Q29udGV4dDo6fldpZGdldFJlbmRlcmluZ0NvbnRleHQoKQogewogICAgIC8vIFdlIGRvIG5vdCBu
ZWVkIHRvIGJsaXQgYmFjayB0byB0aGUgdGFyZ2V0IGluIHRoZSBmYWxsYmFjayBjYXNlLiBTZWUg
YWJvdmUuCi0gICAgUmVuZGVyVGhlbWVHdGsqIHRoZW1lID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGhl
bWVHdGsqPihSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCkuZ2V0KCkpOwotICAgIGlmICghdGhl
bWUtPm1fdGhlbWVQYXJ0c0hhdmVSR0JBQ29sb3JtYXAgJiYgbV9ncmFwaGljc0NvbnRleHQtPmdk
a1dpbmRvdygpKQorICAgIEd0a1RoZW1lUGFydHMqIHBhcnRzID0gbW96X2d0a19nZXRfdGhlbWVf
cGFydHMoKTsKKyAgICBpZiAoIXBhcnRzLT5oYXZlUkdCQUNvbG9ybWFwICYmIG1fZ3JhcGhpY3ND
b250ZXh0LT5nZGtXaW5kb3coKSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgLy8gRG9uJ3QgcGFp
bnQgdGhlIHJlc3VsdHMgYmFjayBpZiB0aGVyZSB3YXMgYW4gZXJyb3IuCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2d0ay9XaWRnZXRSZW5kZXJpbmdDb250ZXh0R3RrMy5jcHAgYi9XZWJD
b3JlL3BsYXRmb3JtL2d0ay9XaWRnZXRSZW5kZXJpbmdDb250ZXh0R3RrMy5jcHAKZGVsZXRlZCBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZjE4MjMuLjAwMDAwMDAKLS0tIGEvV2ViQ29yZS9wbGF0
Zm9ybS9ndGsvV2lkZ2V0UmVuZGVyaW5nQ29udGV4dEd0azMuY3BwCisrKyAvZGV2L251bGwKQEAg
LTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBJZ2FsaWEgUy5MLgotICoK
LSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAq
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8KLQot
I2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIldpZGdldFJlbmRlcmluZ0NvbnRleHQuaCIK
LQotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgotI2luY2x1ZGUgIkludFJlY3QuaCIKLQot
I2lmbmRlZiBHVEtfQVBJX1ZFUlNJT05fMgotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLVdpZGdl
dFJlbmRlcmluZ0NvbnRleHQ6OldpZGdldFJlbmRlcmluZ0NvbnRleHQoR3JhcGhpY3NDb250ZXh0
KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiB0YXJnZXRSZWN0KQotICAgIDogbV9ncmFwaGljc0Nv
bnRleHQoY29udGV4dCkKLSAgICAsIG1fdGFyZ2V0UmVjdCh0YXJnZXRSZWN0KQotICAgICwgbV9w
YWludFJlY3QodGFyZ2V0UmVjdCkKLSAgICAsIG1faGFkRXJyb3IoZmFsc2UpCi0gICAgLCBtX3Rh
cmdldChjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSkKLXsKLX0KLQotV2lkZ2V0UmVuZGVyaW5n
Q29udGV4dDo6fldpZGdldFJlbmRlcmluZ0NvbnRleHQoKQotewotfQotCi1ib29sIFdpZGdldFJl
bmRlcmluZ0NvbnRleHQ6OnBhaW50TW96aWxsYVdpZGdldChHdGtUaGVtZVdpZGdldFR5cGUgdHlw
ZSwgR3RrV2lkZ2V0U3RhdGUqIHN0YXRlLCBpbnQgZmxhZ3MsIEd0a1RleHREaXJlY3Rpb24gdGV4
dERpcmVjdGlvbikKLXsKLSAgICBtX2hhZEVycm9yID0gbW96X2d0a193aWRnZXRfcGFpbnQodHlw
ZSwgbV90YXJnZXQsICZtX3BhaW50UmVjdCwgc3RhdGUsIGZsYWdzLCB0ZXh0RGlyZWN0aW9uKSAh
PSBNT1pfR1RLX1NVQ0NFU1M7Ci0gICAgcmV0dXJuICFtX2hhZEVycm9yOwotfQotCi19Ci0KLSNl
bmRpZiAvLyAhR1RLX0FQSV9WRVJTSU9OXzIKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
Z3RrL2d0azJkcmF3aW5nLmMgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9ndGsyZHJhd2luZy5jCmlu
ZGV4IDJmMmVkYjYuLjhkNWI5NGIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL2d0
azJkcmF3aW5nLmMKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvZ3RrMmRyYXdpbmcuYwpAQCAt
NjksNiArNjksMTIgQEAgbW96X2d0a191c2VfdGhlbWVfcGFydHMoR3RrVGhlbWVQYXJ0cyogcGFy
dHMpCiAgICAgZ1BhcnRzID0gcGFydHM7CiB9CiAKK0d0a1RoZW1lUGFydHMqCittb3pfZ3RrX2dl
dF90aGVtZV9wYXJ0cyh2b2lkKQoreworICAgIHJldHVybiBnUGFydHM7Cit9CisKIC8qIEJlY2F1
c2Ugd2UgaGF2ZSBzdWNoIGFuIHVuY29udmVudGlvbmFsIHdheSBvZiBkcmF3aW5nIHdpZGdldHMs
IHNpZ25hbCB0byB0aGUgR1RLIHRoZW1lIGVuZ2luZQogICAgdGhhdCB0aGV5IGFyZSBkcmF3aW5n
IGZvciBNb3ppbGxhIGluc3RlYWQgb2YgYSBjb252ZW50aW9uYWwgR1RLIGFwcCBzbyB0aGV5IGNh
biBkbyBhbnkgc3BlY2lmaWMKICAgIHRoaW5ncyB0aGV5IG1heSB3YW50IHRvIGRvLiAqLwpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvZ3RrM2RyYXdpbmcuYyBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3RrL2d0azNkcmF3aW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4
MGViNmQuLjAwMDAwMDAKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvZ3RrM2RyYXdpbmcuYwor
KysgL2Rldi9udWxsCkBAIC0xLDE0MTQgKzAsMCBAQAotLyogLSotIE1vZGU6IEMrKzsgdGFiLXdp
ZHRoOiA0OyBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IGMtYmFzaWMtb2Zmc2V0OiA0IC0qLSAqLwot
LyogKioqKiogQkVHSU4gTElDRU5TRSBCTE9DSyAqKioqKgotICogVmVyc2lvbjogTVBMIDEuMS9H
UEwgMi4wL0xHUEwgMi4xCi0gKgotICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3Vi
amVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCi0gKiAxLjEgKHRoZSAi
TGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNl
IHdpdGgKLSAqIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vu
c2UgYXQKLSAqIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotICoKLSAqIFNvZnR3YXJlIGRp
c3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIg
YmFzaXMsCi0gKiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBv
ciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UKLSAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2Ug
Z292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gKiBMaWNlbnNlLgot
ICoKLSAqIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCi0gKgotICogVGhl
IEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCi0gKiBOZXRzY2FwZSBD
b21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KLSAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIElu
aXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDIKLSAqIHRoZSBJbml0aWFsIERl
dmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBDb250cmlidXRvcihzKToKLSAq
ICBCcmlhbiBSeW5lciA8YnJ5bmVyQGJyaWFucnluZXIuY29tPiAgKE9yaWdpbmFsIEF1dGhvcikK
LSAqICBQaWVycmUgQ2hhbmlhbCA8cF9jaEB2ZXJpem9uLm5ldD4KLSAqICBNaWNoYWVsIFZlbnRu
b3IgPG0udmVudG5vckBnbWFpbC5jb20+Ci0gKiAgQWxwIFRva2VyIDxhbHBAbnVhbnRpLmNvbT4K
LSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1
c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBWZXJzaW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCi0gKiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxH
UEwiKSwKLSAqIGluIHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUg
TEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkCi0gKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdp
c2ggdG8gYWxsb3cgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQotICogdW5k
ZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFs
bG93IG90aGVycyB0bwotICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBNUEwsIGluZGljYXRlIHlvdXIKLSAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5n
IHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCi0g
KiBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJ
ZiB5b3UgZG8gbm90IGRlbGV0ZQotICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50
IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgotICogdGhlIHRlcm1zIG9m
IGFueSBvbmUgb2YgdGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KLSAqCi0gKiAqKioqKiBF
TkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwotCi0vKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHBh
aW50aW5nIGZ1bmN0aW9ucyBmb3IgZWFjaCBvZiB0aGUgZ3RrMiB3aWRnZXRzLgotICogQWRhcHRl
ZCBmcm9tIHRoZSBndGtkcmF3aW5nLmMsIGFuZCBndGsrMi4wIHNvdXJjZS4KLSAqLwotCi0jaWZu
ZGVmIEdUS19BUElfVkVSU0lPTl8yCi0KLSNpbmNsdWRlIDxnZGsvZ2RrcHJpdmF0ZS5oPgotI2lu
Y2x1ZGUgImd0a2RyYXdpbmcuaCIKLSNpbmNsdWRlICJHdGtWZXJzaW9uaW5nLmgiCi0jaW5jbHVk
ZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIFhUSElDS05FU1Moc3R5
bGUpIChzdHlsZS0+eHRoaWNrbmVzcykKLSNkZWZpbmUgWVRISUNLTkVTUyhzdHlsZSkgKHN0eWxl
LT55dGhpY2tuZXNzKQotCi1zdGF0aWMgR3RrVGhlbWVQYXJ0cyAqZ1BhcnRzID0gTlVMTDsKLXN0
YXRpYyBzdHlsZV9wcm9wX3Qgc3R5bGVfcHJvcF9mdW5jOwotc3RhdGljIGdib29sZWFuIGhhdmVf
YXJyb3dfc2NhbGluZzsKLXN0YXRpYyBnYm9vbGVhbiBpc19pbml0aWFsaXplZDsKLQotdm9pZAot
bW96X2d0a191c2VfdGhlbWVfcGFydHMoR3RrVGhlbWVQYXJ0cyogcGFydHMpCi17Ci0gICAgZ1Bh
cnRzID0gcGFydHM7Ci19Ci0KLS8qIEJlY2F1c2Ugd2UgaGF2ZSBzdWNoIGFuIHVuY29udmVudGlv
bmFsIHdheSBvZiBkcmF3aW5nIHdpZGdldHMsIHNpZ25hbCB0byB0aGUgR1RLIHRoZW1lIGVuZ2lu
ZQotICAgdGhhdCB0aGV5IGFyZSBkcmF3aW5nIGZvciBNb3ppbGxhIGluc3RlYWQgb2YgYSBjb252
ZW50aW9uYWwgR1RLIGFwcCBzbyB0aGV5IGNhbiBkbyBhbnkgc3BlY2lmaWMKLSAgIHRoaW5ncyB0
aGV5IG1heSB3YW50IHRvIGRvLiAqLwotc3RhdGljIHZvaWQKLW1vel9ndGtfc2V0X3dpZGdldF9u
YW1lKEd0a1dpZGdldCogd2lkZ2V0KQotewotICAgIGd0a193aWRnZXRfc2V0X25hbWUod2lkZ2V0
LCAiTW96aWxsYUd0a1dpZGdldCIpOwotfQotCi1naW50Ci1tb3pfZ3RrX2VuYWJsZV9zdHlsZV9w
cm9wcyhzdHlsZV9wcm9wX3Qgc3R5bGVHZXRQcm9wKQotewotICAgIHN0eWxlX3Byb3BfZnVuYyA9
IHN0eWxlR2V0UHJvcDsKLSAgICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwotfQotCi1zdGF0aWMg
Z2ludAotZW5zdXJlX3dpbmRvd193aWRnZXQoKQotewotICAgIGlmICghZ1BhcnRzLT5wcm90b1dp
bmRvdykgewotICAgICAgICBnUGFydHMtPnByb3RvV2luZG93ID0gZ3RrX3dpbmRvd19uZXcoR1RL
X1dJTkRPV19QT1BVUCk7Ci0gICAgICAgIGd0a193aWRnZXRfcmVhbGl6ZShnUGFydHMtPnByb3Rv
V2luZG93KTsKLSAgICAgICAgbW96X2d0a19zZXRfd2lkZ2V0X25hbWUoZ1BhcnRzLT5wcm90b1dp
bmRvdyk7Ci0gICAgfQotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBn
aW50Ci1zZXR1cF93aWRnZXRfcHJvdG90eXBlKEd0a1dpZGdldCogd2lkZ2V0KQotewotICAgIGVu
c3VyZV93aW5kb3dfd2lkZ2V0KCk7Ci0gICAgaWYgKCFnUGFydHMtPnByb3RvTGF5b3V0KSB7Ci0g
ICAgICAgIGdQYXJ0cy0+cHJvdG9MYXlvdXQgPSBndGtfZml4ZWRfbmV3KCk7Ci0gICAgICAgIGd0
a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIoZ1BhcnRzLT5wcm90b1dpbmRvdyksIGdQYXJ0
cy0+cHJvdG9MYXlvdXQpOwotICAgIH0KLQotICAgIGd0a19jb250YWluZXJfYWRkKEdUS19DT05U
QUlORVIoZ1BhcnRzLT5wcm90b0xheW91dCksIHdpZGdldCk7Ci0gICAgZ3RrX3dpZGdldF9yZWFs
aXplKHdpZGdldCk7Ci0gICAgZ19vYmplY3Rfc2V0X2RhdGEoR19PQkpFQ1Qod2lkZ2V0KSwgInRy
YW5zcGFyZW50LWJnLWhpbnQiLCBHSU5UX1RPX1BPSU5URVIoVFJVRSkpOwotICAgIHJldHVybiBN
T1pfR1RLX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBnaW50Ci1lbnN1cmVfYnV0dG9uX3dpZGdldCgp
Ci17Ci0gICAgaWYgKCFnUGFydHMtPmJ1dHRvbldpZGdldCkgewotICAgICAgICBnUGFydHMtPmJ1
dHRvbldpZGdldCA9IGd0a19idXR0b25fbmV3X3dpdGhfbGFiZWwoIk0iKTsKLSAgICAgICAgc2V0
dXBfd2lkZ2V0X3Byb3RvdHlwZShnUGFydHMtPmJ1dHRvbldpZGdldCk7Ci0gICAgfQotICAgIHJl
dHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBnaW50Ci1lbnN1cmVfdG9nZ2xlX2J1
dHRvbl93aWRnZXQoKQotewotICAgIGlmICghZ1BhcnRzLT50b2dnbGVCdXR0b25XaWRnZXQpIHsK
LSAgICAgICAgZ1BhcnRzLT50b2dnbGVCdXR0b25XaWRnZXQgPSBndGtfdG9nZ2xlX2J1dHRvbl9u
ZXcoKTsKLSAgICAgICAgc2V0dXBfd2lkZ2V0X3Byb3RvdHlwZShnUGFydHMtPnRvZ2dsZUJ1dHRv
bldpZGdldCk7Ci0gICAgICAgIC8qIHRvZ2dsZSBidXR0b24gbXVzdCBiZSBzZXQgYWN0aXZlIHRv
IGdldCB0aGUgcmlnaHQgc3R5bGUgb24gaG92ZXIuICovCi0gICAgICAgIGd0a190b2dnbGVfYnV0
dG9uX3NldF9hY3RpdmUoR1RLX1RPR0dMRV9CVVRUT04oZ1BhcnRzLT50b2dnbGVCdXR0b25XaWRn
ZXQpLCBUUlVFKTsKLSAgfQotICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwotfQotCi1zdGF0aWMg
Z2ludAotZW5zdXJlX2J1dHRvbl9hcnJvd193aWRnZXQoKQotewotICAgIGlmICghZ1BhcnRzLT5i
dXR0b25BcnJvd1dpZGdldCkgewotICAgICAgICBlbnN1cmVfdG9nZ2xlX2J1dHRvbl93aWRnZXQo
KTsKLQotICAgICAgICBnUGFydHMtPmJ1dHRvbkFycm93V2lkZ2V0ID0gZ3RrX2Fycm93X25ldyhH
VEtfQVJST1dfRE9XTiwgR1RLX1NIQURPV19PVVQpOwotICAgICAgICBndGtfY29udGFpbmVyX2Fk
ZChHVEtfQ09OVEFJTkVSKGdQYXJ0cy0+dG9nZ2xlQnV0dG9uV2lkZ2V0KSwgZ1BhcnRzLT5idXR0
b25BcnJvd1dpZGdldCk7Ci0gICAgICAgIGd0a193aWRnZXRfcmVhbGl6ZShnUGFydHMtPmJ1dHRv
bkFycm93V2lkZ2V0KTsKLSAgICB9Ci0gICAgcmV0dXJuIE1PWl9HVEtfU1VDQ0VTUzsKLX0KLQot
c3RhdGljIGdpbnQKLWVuc3VyZV9jaGVja2JveF93aWRnZXQoKQotewotICAgIGlmICghZ1BhcnRz
LT5jaGVja2JveFdpZGdldCkgewotICAgICAgICBnUGFydHMtPmNoZWNrYm94V2lkZ2V0ID0gZ3Rr
X2NoZWNrX2J1dHRvbl9uZXdfd2l0aF9sYWJlbCgiTSIpOwotICAgICAgICBzZXR1cF93aWRnZXRf
cHJvdG90eXBlKGdQYXJ0cy0+Y2hlY2tib3hXaWRnZXQpOwotICAgIH0KLSAgICByZXR1cm4gTU9a
X0dUS19TVUNDRVNTOwotfQotCi1zdGF0aWMgZ2ludAotZW5zdXJlX3JhZGlvYnV0dG9uX3dpZGdl
dCgpCi17Ci0gICAgaWYgKCFnUGFydHMtPnJhZGlvYnV0dG9uV2lkZ2V0KSB7Ci0gICAgICAgIGdQ
YXJ0cy0+cmFkaW9idXR0b25XaWRnZXQgPSBndGtfcmFkaW9fYnV0dG9uX25ld193aXRoX2xhYmVs
KE5VTEwsICJNIik7Ci0gICAgICAgIHNldHVwX3dpZGdldF9wcm90b3R5cGUoZ1BhcnRzLT5yYWRp
b2J1dHRvbldpZGdldCk7Ci0gICAgfQotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19Ci0K
LXN0YXRpYyBnaW50Ci1lbnN1cmVfc2Nyb2xsYmFyX3dpZGdldCgpCi17Ci0gICAgaWYgKCFnUGFy
dHMtPnZlcnRTY3JvbGxiYXJXaWRnZXQpIHsKLSAgICAgICAgZ1BhcnRzLT52ZXJ0U2Nyb2xsYmFy
V2lkZ2V0ID0gZ3RrX3ZzY3JvbGxiYXJfbmV3KE5VTEwpOwotICAgICAgICBzZXR1cF93aWRnZXRf
cHJvdG90eXBlKGdQYXJ0cy0+dmVydFNjcm9sbGJhcldpZGdldCk7Ci0gICAgfQotICAgIGlmICgh
Z1BhcnRzLT5ob3JpelNjcm9sbGJhcldpZGdldCkgewotICAgICAgICBnUGFydHMtPmhvcml6U2Ny
b2xsYmFyV2lkZ2V0ID0gZ3RrX2hzY3JvbGxiYXJfbmV3KE5VTEwpOwotICAgICAgICBzZXR1cF93
aWRnZXRfcHJvdG90eXBlKGdQYXJ0cy0+aG9yaXpTY3JvbGxiYXJXaWRnZXQpOwotICAgIH0KLSAg
ICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwotfQotCi1zdGF0aWMgZ2ludAotZW5zdXJlX3NjYWxl
X3dpZGdldCgpCi17Ci0gIGlmICghZ1BhcnRzLT5oU2NhbGVXaWRnZXQpIHsKLSAgICBnUGFydHMt
PmhTY2FsZVdpZGdldCA9IGd0a19oc2NhbGVfbmV3KE5VTEwpOwotICAgIHNldHVwX3dpZGdldF9w
cm90b3R5cGUoZ1BhcnRzLT5oU2NhbGVXaWRnZXQpOwotICB9Ci0gIGlmICghZ1BhcnRzLT52U2Nh
bGVXaWRnZXQpIHsKLSAgICBnUGFydHMtPnZTY2FsZVdpZGdldCA9IGd0a192c2NhbGVfbmV3KE5V
TEwpOwotICAgIHNldHVwX3dpZGdldF9wcm90b3R5cGUoZ1BhcnRzLT52U2NhbGVXaWRnZXQpOwot
ICB9Ci0gIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBnaW50Ci1lbnN1cmVf
ZW50cnlfd2lkZ2V0KCkKLXsKLSAgICBpZiAoIWdQYXJ0cy0+ZW50cnlXaWRnZXQpIHsKLSAgICAg
ICAgZ1BhcnRzLT5lbnRyeVdpZGdldCA9IGd0a19lbnRyeV9uZXcoKTsKLSAgICAgICAgc2V0dXBf
d2lkZ2V0X3Byb3RvdHlwZShnUGFydHMtPmVudHJ5V2lkZ2V0KTsKLSAgICB9Ci0gICAgcmV0dXJu
IE1PWl9HVEtfU1VDQ0VTUzsKLX0KLQotLyogV2UgbmVlZCB0byBoYXZlIHBvaW50ZXJzIHRvIHRo
ZSBpbm5lciB3aWRnZXRzIChidXR0b24sIHNlcGFyYXRvciwgYXJyb3cpCi0gKiBvZiB0aGUgQ29t
Ym9Cb3ggdG8gZ2V0IHRoZSBjb3JyZWN0IHJlbmRlcmluZyBmcm9tIHRoZW1lIGVuZ2luZXMgd2hp
Y2gKLSAqIHNwZWNpYWwgY2FzZXMgdGhlaXIgbG9vay4gU2luY2UgdGhlIGlubmVyIGxheW91dCBj
YW4gY2hhbmdlLCB3ZSBhc2sgR1RLCi0gKiB0byBOVUxMIG91ciBwb2ludGVycyB3aGVuIHRoZXkg
YXJlIGFib3V0IHRvIGJlY29tZSBpbnZhbGlkIGJlY2F1c2UgdGhlCi0gKiBjb3JyZXNwb25kaW5n
IHdpZGdldHMgZG9uJ3QgZXhpc3QgYW55bW9yZS4gSXQncyB0aGUgcm9sZSBvZgotICogZ19vYmpl
Y3RfYWRkX3dlYWtfcG9pbnRlcigpLgotICogTm90ZSB0aGF0IGlmIHdlIGRvbid0IGZpbmQgdGhl
IGlubmVyIHdpZGdldHMgKHdoaWNoIHNob3VsZG4ndCBoYXBwZW4pLCB3ZQotICogZmFsbGJhY2sg
dG8gdXNlIGdlbmVyaWMgIm5vbi1pbm5lciIgd2lkZ2V0cywgYW5kIHRoZXkgZG9uJ3QgbmVlZCB0
aGF0IGtpbmQKLSAqIG9mIHdlYWsgcG9pbnRlciBzaW5jZSB0aGV5IGFyZSBleHBsaWNpdCBjaGls
ZHJlbiBvZiBnUGFydHMtPnByb3RvV2luZG93IGFuZCBhcwotICogc3VjaCBHVEsgaG9sZHMgYSBz
dHJvbmcgcmVmZXJlbmNlIHRvIHRoZW0uICovCi1zdGF0aWMgdm9pZAotbW96X2d0a19nZXRfY29t
Ym9fYm94X2lubmVyX2J1dHRvbihHdGtXaWRnZXQgKndpZGdldCwgZ3BvaW50ZXIgY2xpZW50X2Rh
dGEpCi17Ci0gICAgaWYgKEdUS19JU19UT0dHTEVfQlVUVE9OKHdpZGdldCkpIHsKLSAgICAgICAg
Z1BhcnRzLT5jb21ib0JveEJ1dHRvbldpZGdldCA9IHdpZGdldDsKLSAgICAgICAgZ19vYmplY3Rf
YWRkX3dlYWtfcG9pbnRlcihHX09CSkVDVCh3aWRnZXQpLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIChncG9pbnRlcikgJmdQYXJ0cy0+Y29tYm9Cb3hCdXR0b25XaWRnZXQpOwot
ICAgICAgICBndGtfd2lkZ2V0X3JlYWxpemUod2lkZ2V0KTsKLSAgICAgICAgZ19vYmplY3Rfc2V0
X2RhdGEoR19PQkpFQ1Qod2lkZ2V0KSwgInRyYW5zcGFyZW50LWJnLWhpbnQiLCBHSU5UX1RPX1BP
SU5URVIoVFJVRSkpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW1vel9ndGtfZ2V0X2NvbWJv
X2JveF9idXR0b25faW5uZXJfd2lkZ2V0cyhHdGtXaWRnZXQgKndpZGdldCwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncG9pbnRlciBjbGllbnRfZGF0YSkKLXsK
LSAgICBpZiAoR1RLX0lTX1NFUEFSQVRPUih3aWRnZXQpKSB7Ci0gICAgICAgIGdQYXJ0cy0+Y29t
Ym9Cb3hTZXBhcmF0b3JXaWRnZXQgPSB3aWRnZXQ7Ci0gICAgICAgIGdfb2JqZWN0X2FkZF93ZWFr
X3BvaW50ZXIoR19PQkpFQ1Qod2lkZ2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAoZ3BvaW50ZXIpICZnUGFydHMtPmNvbWJvQm94U2VwYXJhdG9yV2lkZ2V0KTsKLSAgICB9
IGVsc2UgaWYgKEdUS19JU19BUlJPVyh3aWRnZXQpKSB7Ci0gICAgICAgIGdQYXJ0cy0+Y29tYm9C
b3hBcnJvd1dpZGdldCA9IHdpZGdldDsKLSAgICAgICAgZ19vYmplY3RfYWRkX3dlYWtfcG9pbnRl
cihHX09CSkVDVCh3aWRnZXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChn
cG9pbnRlcikgJmdQYXJ0cy0+Y29tYm9Cb3hBcnJvd1dpZGdldCk7Ci0gICAgfSBlbHNlCi0gICAg
ICAgIHJldHVybjsKLSAgICBndGtfd2lkZ2V0X3JlYWxpemUod2lkZ2V0KTsKLSAgICBnX29iamVj
dF9zZXRfZGF0YShHX09CSkVDVCh3aWRnZXQpLCAidHJhbnNwYXJlbnQtYmctaGludCIsIEdJTlRf
VE9fUE9JTlRFUihUUlVFKSk7Ci19Ci0KLXN0YXRpYyBnaW50Ci1lbnN1cmVfY29tYm9fYm94X3dp
ZGdldHMoKQotewotICAgIEd0a1dpZGdldCogYnV0dG9uQ2hpbGQ7Ci0KLSAgICBpZiAoZ1BhcnRz
LT5jb21ib0JveEJ1dHRvbldpZGdldCAmJiBnUGFydHMtPmNvbWJvQm94QXJyb3dXaWRnZXQpCi0g
ICAgICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci0KLSAgICAvKiBDcmVhdGUgYSBDb21ib0Jv
eCBpZiBuZWVkZWQgKi8KLSAgICBpZiAoIWdQYXJ0cy0+Y29tYm9Cb3hXaWRnZXQpIHsKLSAgICAg
ICAgZ1BhcnRzLT5jb21ib0JveFdpZGdldCA9IGd0a19jb21ib19ib3hfbmV3KCk7Ci0gICAgICAg
IHNldHVwX3dpZGdldF9wcm90b3R5cGUoZ1BhcnRzLT5jb21ib0JveFdpZGdldCk7Ci0gICAgfQot
Ci0gICAgLyogR2V0IGl0cyBpbm5lciBCdXR0b24gKi8KLSAgICBndGtfY29udGFpbmVyX2ZvcmFs
bChHVEtfQ09OVEFJTkVSKGdQYXJ0cy0+Y29tYm9Cb3hXaWRnZXQpLAotICAgICAgICAgICAgICAg
ICAgICAgICAgIG1vel9ndGtfZ2V0X2NvbWJvX2JveF9pbm5lcl9idXR0b24sCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgICBpZiAoZ1BhcnRzLT5jb21ib0JveEJ1dHRvbldp
ZGdldCkgewotICAgICAgICAvKiBHZXQgdGhlIHdpZGdldHMgaW5zaWRlIHRoZSBCdXR0b24gKi8K
LSAgICAgICAgYnV0dG9uQ2hpbGQgPSBndGtfYmluX2dldF9jaGlsZChHVEtfQklOKGdQYXJ0cy0+
Y29tYm9Cb3hCdXR0b25XaWRnZXQpKTsKLSAgICAgICAgaWYgKEdUS19JU19IQk9YKGJ1dHRvbkNo
aWxkKSkgewotICAgICAgICAgICAgLyogYXBwZWFycy1hcy1saXN0ID0gRkFMU0UsIGNlbGwtdmll
dyA9IFRSVUU7IHRoZSBidXR0b24KLSAgICAgICAgICAgICAqIGNvbnRhaW5zIGFuIGhib3guIFRo
aXMgaGJveCBpcyB0aGVyZSBiZWNhdXNlIHRoZSBDb21ib0JveAotICAgICAgICAgICAgICogbmVl
ZHMgdG8gcGxhY2UgYSBjZWxsIHJlbmRlcmVyLCBhIHNlcGFyYXRvciwgYW5kIGFuIGFycm93IGlu
Ci0gICAgICAgICAgICAgKiB0aGUgYnV0dG9uIHdoZW4gYXBwZWFycy1hcy1saXN0IGlzIEZBTFNF
LiAqLwotICAgICAgICAgICAgZ3RrX2NvbnRhaW5lcl9mb3JhbGwoR1RLX0NPTlRBSU5FUihidXR0
b25DaGlsZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3pfZ3RrX2dldF9j
b21ib19ib3hfYnV0dG9uX2lubmVyX3dpZGdldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBOVUxMKTsKLSAgICAgICAgfSBlbHNlIGlmKEdUS19JU19BUlJPVyhidXR0b25DaGls
ZCkpIHsKLSAgICAgICAgICAgIC8qIGFwcGVhcnMtYXMtbGlzdCA9IFRSVUUsIG9yIGNlbGwtdmll
dyA9IEZBTFNFOwotICAgICAgICAgICAgICogdGhlIGJ1dHRvbiBvbmx5IGNvbnRhaW5zIGFuIGFy
cm93ICovCi0gICAgICAgICAgICBnUGFydHMtPmNvbWJvQm94QXJyb3dXaWRnZXQgPSBidXR0b25D
aGlsZDsKLSAgICAgICAgICAgIGdfb2JqZWN0X2FkZF93ZWFrX3BvaW50ZXIoR19PQkpFQ1QoYnV0
dG9uQ2hpbGQpLCAoZ3BvaW50ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICZnUGFydHMtPmNvbWJvQm94QXJyb3dXaWRnZXQpOwotICAgICAgICAgICAgZ3RrX3dpZGdl
dF9yZWFsaXplKGdQYXJ0cy0+Y29tYm9Cb3hBcnJvd1dpZGdldCk7Ci0gICAgICAgICAgICBnX29i
amVjdF9zZXRfZGF0YShHX09CSkVDVChnUGFydHMtPmNvbWJvQm94QXJyb3dXaWRnZXQpLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcGFyZW50LWJnLWhpbnQiLCBHSU5UX1RP
X1BPSU5URVIoVFJVRSkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogU2hv
dWxkbid0IGJlIHJlYWNoZWQgd2l0aCBjdXJyZW50IGludGVybmFsIGd0ayBpbXBsZW1lbnRhdGlv
bjsgd2UKLSAgICAgICAgICogdXNlIGEgZ2VuZXJpYyB0b2dnbGUgYnV0dG9uIGFzIGxhc3QgcmVz
b3J0IGZhbGxiYWNrIHRvIGF2b2lkCi0gICAgICAgICAqIGNyYXNoaW5nLiAqLwotICAgICAgICBl
bnN1cmVfdG9nZ2xlX2J1dHRvbl93aWRnZXQoKTsKLSAgICAgICAgZ1BhcnRzLT5jb21ib0JveEJ1
dHRvbldpZGdldCA9IGdQYXJ0cy0+dG9nZ2xlQnV0dG9uV2lkZ2V0OwotICAgIH0KLQotICAgIGlm
ICghZ1BhcnRzLT5jb21ib0JveEFycm93V2lkZ2V0KSB7Ci0gICAgICAgIC8qIFNob3VsZG4ndCBi
ZSByZWFjaGVkIHdpdGggY3VycmVudCBpbnRlcm5hbCBndGsgaW1wbGVtZW50YXRpb247Ci0gICAg
ICAgICAqIHdlIGdQYXJ0cy0+YnV0dG9uQXJyb3dXaWRnZXQgYXMgbGFzdCByZXNvcnQgZmFsbGJh
Y2sgdG8gYXZvaWQKLSAgICAgICAgICogY3Jhc2hpbmcuICovCi0gICAgICAgIGVuc3VyZV9idXR0
b25fYXJyb3dfd2lkZ2V0KCk7Ci0gICAgICAgIGdQYXJ0cy0+Y29tYm9Cb3hBcnJvd1dpZGdldCA9
IGdQYXJ0cy0+YnV0dG9uQXJyb3dXaWRnZXQ7Ci0gICAgfQotCi0gICAgLyogV2UgZG9uJ3QgdGVz
dCB0aGUgdmFsaWRpdHkgb2YgZ1BhcnRzLT5jb21ib0JveFNlcGFyYXRvcldpZGdldCBzaW5jZSB0
aGVyZQotICAgICAqIGlzIG5vbmUgd2hlbiAiYXBwZWFycy1hcy1saXN0IiA9IFRSVUUgb3IgImNl
bGwtdmlldyIgPSBGQUxTRTsgaWYgaXQKLSAgICAgKiBpcyBpbnZhbGlkIHdlIGp1c3Qgd29uJ3Qg
cGFpbnQgaXQuICovCi0KLSAgICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwotfQotCi1zdGF0aWMg
Z2ludAotZW5zdXJlX3Byb2dyZXNzX3dpZGdldCgpCi17Ci0gICAgaWYgKCFnUGFydHMtPnByb2dy
ZXNXaWRnZXQpIHsKLSAgICAgICAgZ1BhcnRzLT5wcm9ncmVzV2lkZ2V0ID0gZ3RrX3Byb2dyZXNz
X2Jhcl9uZXcoKTsKLSAgICAgICAgc2V0dXBfd2lkZ2V0X3Byb3RvdHlwZShnUGFydHMtPnByb2dy
ZXNXaWRnZXQpOwotICAgIH0KLSAgICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwotfQotCi1zdGF0
aWMgZ2ludAotZW5zdXJlX3Njcm9sbGVkX3dpbmRvd193aWRnZXQoKQotewotICAgIGlmICghZ1Bh
cnRzLT5zY3JvbGxlZFdpbmRvd1dpZGdldCkgewotICAgICAgICBnUGFydHMtPnNjcm9sbGVkV2lu
ZG93V2lkZ2V0ID0gZ3RrX3Njcm9sbGVkX3dpbmRvd19uZXcoTlVMTCwgTlVMTCk7Ci0gICAgICAg
IHNldHVwX3dpZGdldF9wcm90b3R5cGUoZ1BhcnRzLT5zY3JvbGxlZFdpbmRvd1dpZGdldCk7Ci0g
ICAgfQotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBHdGtTdGF0ZVR5
cGUKLUNvbnZlcnRHdGtTdGF0ZShHdGtXaWRnZXRTdGF0ZSogc3RhdGUpCi17Ci0gICAgaWYgKHN0
YXRlLT5kaXNhYmxlZCkKLSAgICAgICAgcmV0dXJuIEdUS19TVEFURV9JTlNFTlNJVElWRTsKLSAg
ICBlbHNlIGlmIChzdGF0ZS0+ZGVwcmVzc2VkKQotICAgICAgICByZXR1cm4gKHN0YXRlLT5pbkhv
dmVyID8gR1RLX1NUQVRFX1BSRUxJR0hUIDogR1RLX1NUQVRFX0FDVElWRSk7Ci0gICAgZWxzZSBp
ZiAoc3RhdGUtPmluSG92ZXIpCi0gICAgICAgIHJldHVybiAoc3RhdGUtPmFjdGl2ZSA/IEdUS19T
VEFURV9BQ1RJVkUgOiBHVEtfU1RBVEVfUFJFTElHSFQpOwotICAgIGVsc2UKLSAgICAgICAgcmV0
dXJuIEdUS19TVEFURV9OT1JNQUw7Ci19Ci0KLXN0YXRpYyBnaW50Ci1tb3pfZ3RrX2J1dHRvbl9w
YWludChjYWlyb190KiBjciwgR2RrUmVjdGFuZ2xlKiByZWN0LAotICAgICAgICAgICAgICAgICAg
ICAgR3RrV2lkZ2V0U3RhdGUqIHN0YXRlLCBHdGtSZWxpZWZTdHlsZSByZWxpZWYsCi0gICAgICAg
ICAgICAgICAgICAgICBHdGtXaWRnZXQqIHdpZGdldCwgR3RrVGV4dERpcmVjdGlvbiBkaXJlY3Rp
b24pCi17Ci0gICAgR3RrU2hhZG93VHlwZSBzaGFkb3dfdHlwZTsKLSAgICBHdGtTdHlsZSogc3R5
bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpOwotICAgIEd0a1N0YXRlVHlwZSBidXR0
b25fc3RhdGUgPSBDb252ZXJ0R3RrU3RhdGUoc3RhdGUpOwotICAgIGdpbnQgeCA9IHJlY3QtPngs
IHk9cmVjdC0+eSwgd2lkdGg9cmVjdC0+d2lkdGgsIGhlaWdodD1yZWN0LT5oZWlnaHQ7Ci0gICAg
R2RrV2luZG93KiB3aW5kb3cgPSBndGtfd2lkZ2V0X2dldF93aW5kb3cod2lkZ2V0KTsKLQotICAg
IGdib29sZWFuIGludGVyaW9yX2ZvY3VzOwotICAgIGdpbnQgZm9jdXNfd2lkdGgsIGZvY3VzX3Bh
ZDsKLQotICAgIG1vel9ndGtfd2lkZ2V0X2dldF9mb2N1cyh3aWRnZXQsICZpbnRlcmlvcl9mb2N1
cywgJmZvY3VzX3dpZHRoLCAmZm9jdXNfcGFkKTsKLQotICAgIGlmICh3aW5kb3cgJiYgZ2RrX3dp
bmRvd19pc192aXNpYmxlKHdpbmRvdykpIHsKLSAgICAgICAgZ2RrX3dpbmRvd19zZXRfYmFja2dy
b3VuZF9wYXR0ZXJuKHdpbmRvdywgTlVMTCk7Ci0gICAgfQotCi0gICAgZ3RrX3dpZGdldF9zZXRf
c3RhdGUod2lkZ2V0LCBidXR0b25fc3RhdGUpOwotICAgIGd0a193aWRnZXRfc2V0X2RpcmVjdGlv
bih3aWRnZXQsIGRpcmVjdGlvbik7Ci0gICAgZ3RrX2J1dHRvbl9zZXRfcmVsaWVmKEdUS19CVVRU
T04od2lkZ2V0KSwgcmVsaWVmKTsKLQotICAgIGlmICghaW50ZXJpb3JfZm9jdXMgJiYgc3RhdGUt
PmZvY3VzZWQpIHsKLSAgICAgICAgeCArPSBmb2N1c193aWR0aCArIGZvY3VzX3BhZDsKLSAgICAg
ICAgeSArPSBmb2N1c193aWR0aCArIGZvY3VzX3BhZDsKLSAgICAgICAgd2lkdGggLT0gMiAqIChm
b2N1c193aWR0aCArIGZvY3VzX3BhZCk7Ci0gICAgICAgIGhlaWdodCAtPSAyICogKGZvY3VzX3dp
ZHRoICsgZm9jdXNfcGFkKTsKLSAgICB9Ci0KLSAgICBzaGFkb3dfdHlwZSA9IGJ1dHRvbl9zdGF0
ZSA9PSBHVEtfU1RBVEVfQUNUSVZFIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmRl
cHJlc3NlZCA/IEdUS19TSEFET1dfSU4gOiBHVEtfU0hBRE9XX09VVDsKLQotICAgIGlmIChzdGF0
ZS0+aXNEZWZhdWx0ICYmIHJlbGllZiA9PSBHVEtfUkVMSUVGX05PUk1BTCkgewotICAgICAgICBn
dGtfcGFpbnRfYm94KHN0eWxlLCBjciwgYnV0dG9uX3N0YXRlLCBzaGFkb3dfdHlwZSwKLSAgICAg
ICAgICAgICAgICAgICAgICB3aWRnZXQsICJidXR0b25kZWZhdWx0IiwgeCwgeSwgd2lkdGgsIGhl
aWdodCk7Ci0gICAgfQotCi0gICAgaWYgKHJlbGllZiAhPSBHVEtfUkVMSUVGX05PTkUgfHwgc3Rh
dGUtPmRlcHJlc3NlZCB8fAotICAgICAgICAgICAoYnV0dG9uX3N0YXRlICE9IEdUS19TVEFURV9O
T1JNQUwgJiYKLSAgICAgICAgICAgIGJ1dHRvbl9zdGF0ZSAhPSBHVEtfU1RBVEVfSU5TRU5TSVRJ
VkUpKSB7Ci0gICAgICAgIC8qIHRoZSBmb2xsb3dpbmcgbGluZSBjYW4gdHJpZ2dlciBhbiBhc3Nl
cnRpb24gKENydXggdGhlbWUpCi0gICAgICAgICAgIGZpbGUgLi4vLi4vZ2RrL2dka3dpbmRvdy5j
OiBsaW5lIDE4NDYgKGdka193aW5kb3dfY2xlYXJfYXJlYSk6Ci0gICAgICAgICAgIGFzc2VydGlv
biBgR0RLX0lTX1dJTkRPVyAod2luZG93KScgZmFpbGVkICovCi0gICAgICAgIGd0a19wYWludF9i
b3goc3R5bGUsIGNyLCBidXR0b25fc3RhdGUsIHNoYWRvd190eXBlLAotICAgICAgICAgICAgICAg
ICAgICAgIHdpZGdldCwgImJ1dHRvbiIsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLQot
ICAgIGlmIChzdGF0ZS0+Zm9jdXNlZCkgewotICAgICAgICBpZiAoaW50ZXJpb3JfZm9jdXMpIHsK
LSAgICAgICAgICAgIEd0a1N0eWxlKiBzdHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdl
dCk7Ci0gICAgICAgICAgICB4ICs9IHN0eWxlLT54dGhpY2tuZXNzICsgZm9jdXNfcGFkOwotICAg
ICAgICAgICAgeSArPSBzdHlsZS0+eXRoaWNrbmVzcyArIGZvY3VzX3BhZDsKLSAgICAgICAgICAg
IHdpZHRoIC09IDIgKiAoc3R5bGUtPnh0aGlja25lc3MgKyBmb2N1c19wYWQpOwotICAgICAgICAg
ICAgaGVpZ2h0IC09IDIgKiAoc3R5bGUtPnl0aGlja25lc3MgKyBmb2N1c19wYWQpOwotICAgICAg
ICB9IGVsc2UgewotICAgICAgICAgICAgeCAtPSBmb2N1c193aWR0aCArIGZvY3VzX3BhZDsKLSAg
ICAgICAgICAgIHkgLT0gZm9jdXNfd2lkdGggKyBmb2N1c19wYWQ7Ci0gICAgICAgICAgICB3aWR0
aCArPSAyICogKGZvY3VzX3dpZHRoICsgZm9jdXNfcGFkKTsKLSAgICAgICAgICAgIGhlaWdodCAr
PSAyICogKGZvY3VzX3dpZHRoICsgZm9jdXNfcGFkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGd0
a19wYWludF9mb2N1cyhzdHlsZSwgY3IsIGJ1dHRvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgIHdpZGdldCwgImJ1dHRvbiIsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLQot
ICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19Ci0KLWdpbnQKLW1vel9ndGtfaW5pdCgpCi17
Ci0gICAgR3RrV2lkZ2V0Q2xhc3MgKmVudHJ5X2NsYXNzOwotCi0gICAgaXNfaW5pdGlhbGl6ZWQg
PSBUUlVFOwotICAgIGhhdmVfYXJyb3dfc2NhbGluZyA9IChndGtfbWFqb3JfdmVyc2lvbiA+IDIg
fHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGd0a19tYWpvcl92ZXJzaW9uID09IDIgJiYg
Z3RrX21pbm9yX3ZlcnNpb24gPj0gMTIpKTsKLQotICAgIC8qIEFkZCBzdHlsZSBwcm9wZXJ0eSB0
byBHdGtFbnRyeS4KLSAgICAgKiBBZGRpbmcgdGhlIHN0eWxlIHByb3BlcnR5IHRvIHRoZSBub3Jt
YWwgR3RrRW50cnkgY2xhc3MgbWVhbnMgdGhhdCBpdAotICAgICAqIHdpbGwgd29yayB3aXRob3V0
IGlzc3VlcyBpbnNpZGUgR3RrQ29tYm9Cb3ggYW5kIGZvciBTcGluYnV0dG9ucy4gKi8KLSAgICBl
bnRyeV9jbGFzcyA9IGdfdHlwZV9jbGFzc19yZWYoR1RLX1RZUEVfRU5UUlkpOwotICAgIGd0a193
aWRnZXRfY2xhc3NfaW5zdGFsbF9zdHlsZV9wcm9wZXJ0eShlbnRyeV9jbGFzcywKLSAgICAgICAg
Z19wYXJhbV9zcGVjX2Jvb2xlYW4oImhvbm9ycy10cmFuc3BhcmVudC1iZy1oaW50IiwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIlRyYW5zcGFyZW50IEJHIGVuYWJsaW5nIGZsYWciLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWYgVFJVRSwgdGhlIHRoZW1lIGlzIGFibGUg
dG8gZHJhdyB0aGUgR3RrRW50cnkgb24gbm9uLXByZWZpbGxlZCBiYWNrZ3JvdW5kLiIsCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBHX1BBUkFNX1JFQURXUklURSkpOwotCi0gICAgcmV0dXJuIE1PWl9HVEtfU1VDQ0VTUzsK
LX0KLQotZ2ludAotbW96X2d0a19jaGVja2JveF9nZXRfbWV0cmljcyhnaW50KiBpbmRpY2F0b3Jf
c2l6ZSwgZ2ludCogaW5kaWNhdG9yX3NwYWNpbmcpCi17Ci0gICAgZW5zdXJlX2NoZWNrYm94X3dp
ZGdldCgpOwotCi0gICAgZ3RrX3dpZGdldF9zdHlsZV9nZXQgKGdQYXJ0cy0+Y2hlY2tib3hXaWRn
ZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRpY2F0b3Jfc2l6ZSIsIGluZGljYXRv
cl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kaWNhdG9yX3NwYWNpbmciLCBp
bmRpY2F0b3Jfc3BhY2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAg
ICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwotfQotCi1naW50Ci1tb3pfZ3RrX3JhZGlvX2dldF9t
ZXRyaWNzKGdpbnQqIGluZGljYXRvcl9zaXplLCBnaW50KiBpbmRpY2F0b3Jfc3BhY2luZykKLXsK
LSAgICBlbnN1cmVfcmFkaW9idXR0b25fd2lkZ2V0KCk7Ci0KLSAgICBndGtfd2lkZ2V0X3N0eWxl
X2dldCAoZ1BhcnRzLT5yYWRpb2J1dHRvbldpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgImluZGljYXRvcl9zaXplIiwgaW5kaWNhdG9yX3NpemUsCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICJpbmRpY2F0b3Jfc3BhY2luZyIsIGluZGljYXRvcl9zcGFjaW5nLAotICAgICAgICAg
ICAgICAgICAgICAgICAgICBOVUxMKTsKLQotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19
Ci0KLWdpbnQKLW1vel9ndGtfd2lkZ2V0X2dldF9mb2N1cyhHdGtXaWRnZXQqIHdpZGdldCwgZ2Jv
b2xlYW4qIGludGVyaW9yX2ZvY3VzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQqIGZv
Y3VzX3dpZHRoLCBnaW50KiBmb2N1c19wYWQpCi17Ci0gICAgZ3RrX3dpZGdldF9zdHlsZV9nZXQg
KHdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyaW9yLWZvY3VzIiwgaW50
ZXJpb3JfZm9jdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJmb2N1cy1saW5lLXdpZHRo
IiwgZm9jdXNfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJmb2N1cy1wYWRkaW5n
IiwgZm9jdXNfcGFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLQotICAgIHJl
dHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19Ci0KLWdpbnQKLW1vel9ndGtfYnV0dG9uX2dldF9pbm5l
cl9ib3JkZXIoR3RrV2lkZ2V0KiB3aWRnZXQsIEd0a0JvcmRlciogaW5uZXJfYm9yZGVyKQotewot
ICAgIHN0YXRpYyBjb25zdCBHdGtCb3JkZXIgZGVmYXVsdF9pbm5lcl9ib3JkZXIgPSB7IDEsIDEs
IDEsIDEgfTsKLSAgICBHdGtCb3JkZXIgKnRtcF9ib3JkZXI7Ci0KLSAgICBndGtfd2lkZ2V0X3N0
eWxlX2dldCAod2lkZ2V0LCAiaW5uZXItYm9yZGVyIiwgJnRtcF9ib3JkZXIsIE5VTEwpOwotCi0g
ICAgaWYgKHRtcF9ib3JkZXIpIHsKLSAgICAgICAgKmlubmVyX2JvcmRlciA9ICp0bXBfYm9yZGVy
OwotICAgICAgICBndGtfYm9yZGVyX2ZyZWUodG1wX2JvcmRlcik7Ci0gICAgfQotICAgIGVsc2UK
LSAgICAgICAgKmlubmVyX2JvcmRlciA9IGRlZmF1bHRfaW5uZXJfYm9yZGVyOwotCi0gICAgcmV0
dXJuIE1PWl9HVEtfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGdpbnQKLW1vel9ndGtfdG9nZ2xlX3Bh
aW50KGNhaXJvX3QqIGNyLCBHZGtSZWN0YW5nbGUqIHJlY3QsCi0gICAgICAgICAgICAgICAgICAg
ICBHdGtXaWRnZXRTdGF0ZSogc3RhdGUsIGdib29sZWFuIHNlbGVjdGVkLAotICAgICAgICAgICAg
ICAgICAgICAgZ2Jvb2xlYW4gaW5jb25zaXN0ZW50LCBnYm9vbGVhbiBpc3JhZGlvLAotICAgICAg
ICAgICAgICAgICAgICAgR3RrVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0gICAgR3RrU3Rh
dGVUeXBlIHN0YXRlX3R5cGUgPSBDb252ZXJ0R3RrU3RhdGUoc3RhdGUpOwotICAgIEd0a1NoYWRv
d1R5cGUgc2hhZG93X3R5cGUgPSAoc2VsZWN0ZWQpP0dUS19TSEFET1dfSU46R1RLX1NIQURPV19P
VVQ7Ci0gICAgZ2ludCBpbmRpY2F0b3Jfc2l6ZSwgaW5kaWNhdG9yX3NwYWNpbmc7Ci0gICAgZ2lu
dCB4LCB5LCB3aWR0aCwgaGVpZ2h0OwotICAgIGdpbnQgZm9jdXNfeCwgZm9jdXNfeSwgZm9jdXNf
d2lkdGgsIGZvY3VzX2hlaWdodDsKLSAgICBHdGtXaWRnZXQgKnc7Ci0gICAgR3RrU3R5bGUgKnN0
eWxlOwotCi0gICAgaWYgKGlzcmFkaW8pIHsKLSAgICAgICAgbW96X2d0a19yYWRpb19nZXRfbWV0
cmljcygmaW5kaWNhdG9yX3NpemUsICZpbmRpY2F0b3Jfc3BhY2luZyk7Ci0gICAgICAgIHcgPSBn
UGFydHMtPnJhZGlvYnV0dG9uV2lkZ2V0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1vel9ndGtf
Y2hlY2tib3hfZ2V0X21ldHJpY3MoJmluZGljYXRvcl9zaXplLCAmaW5kaWNhdG9yX3NwYWNpbmcp
OwotICAgICAgICB3ID0gZ1BhcnRzLT5jaGVja2JveFdpZGdldDsKLSAgICB9Ci0KLSAgICAvLyAi
R2V0TWluaW11bVdpZGdldFNpemUgd2FzIGlnbm9yZWQiCi0gICAgLy8gRklYTUU6IFRoaXMgYXNz
ZXJ0IGNhdXNlcyBhIGJ1aWxkIGZhaWx1cmUgaW4gV2ViS2l0R1RLKyBkZWJ1ZwotICAgIC8vIGJ1
aWxkcywgYmVjYXVzZSBpdCB1c2VzICdmYWxzZScgaW4gaXRzIGRlZmluaXRpb24uIFdlIG1heSB3
YW50Ci0gICAgLy8gdG8gZm9yY2UgdGhpcyBmaWxlIHRvIGJlIGJ1aWx0IHdpdGggZysrLCBieSBy
ZW5hbWluZyBpdC4KLSAgICAvLyBBU1NFUlQocmVjdC0+d2lkdGggPT0gaW5kaWNhdG9yX3NpemUp
OwotCi0gICAgLyoKLSAgICAgKiB2ZXJ0aWNhbGx5IGNlbnRlciBpbiB0aGUgYm94LCBzaW5jZSBY
VUwgc29tZXRpbWVzIGlnbm9yZXMgb3VyCi0gICAgICogR2V0TWluaW11bVdpZGdldFNpemUgaW4g
dGhlIHZlcnRpY2FsIGRpbWVuc2lvbgotICAgICAqLwotICAgIHggPSByZWN0LT54OwotICAgIHkg
PSByZWN0LT55ICsgKHJlY3QtPmhlaWdodCAtIGluZGljYXRvcl9zaXplKSAvIDI7Ci0gICAgd2lk
dGggPSBpbmRpY2F0b3Jfc2l6ZTsKLSAgICBoZWlnaHQgPSBpbmRpY2F0b3Jfc2l6ZTsKLQotICAg
IGZvY3VzX3ggPSB4IC0gaW5kaWNhdG9yX3NwYWNpbmc7Ci0gICAgZm9jdXNfeSA9IHkgLSBpbmRp
Y2F0b3Jfc3BhY2luZzsKLSAgICBmb2N1c193aWR0aCA9IHdpZHRoICsgMiAqIGluZGljYXRvcl9z
cGFjaW5nOwotICAgIGZvY3VzX2hlaWdodCA9IGhlaWdodCArIDIgKiBpbmRpY2F0b3Jfc3BhY2lu
ZzsKLQotICAgIHN0eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUodyk7Ci0KLSAgICBndGtfd2lk
Z2V0X3NldF9zZW5zaXRpdmUodywgIXN0YXRlLT5kaXNhYmxlZCk7Ci0gICAgZ3RrX3dpZGdldF9z
ZXRfZGlyZWN0aW9uKHcsIGRpcmVjdGlvbik7Ci0gICAgZ3RrX3RvZ2dsZV9idXR0b25fc2V0X2Fj
dGl2ZShHVEtfVE9HR0xFX0JVVFRPTih3KSwgc2VsZWN0ZWQpOwotCi0gICAgaWYgKGlzcmFkaW8p
IHsKLSAgICAgICAgZ3RrX3BhaW50X29wdGlvbihzdHlsZSwgY3IsIHN0YXRlX3R5cGUsIHNoYWRv
d190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdQYXJ0cy0+cmFkaW9idXR0b25XaWRn
ZXQsICJyYWRpb2J1dHRvbiIsIHgsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgs
IGhlaWdodCk7Ci0gICAgICAgIGlmIChzdGF0ZS0+Zm9jdXNlZCkgewotICAgICAgICAgICAgZ3Rr
X3BhaW50X2ZvY3VzKHN0eWxlLCBjciwgR1RLX1NUQVRFX0FDVElWRSwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBnUGFydHMtPnJhZGlvYnV0dG9uV2lkZ2V0LCAicmFkaW9idXR0b24iLCBm
b2N1c194LCBmb2N1c195LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzX3dpZHRo
LCBmb2N1c19oZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgIC8q
Ci0gICAgICAgICogJ2luZGV0ZXJtaW5hdGUnIHR5cGUgb24gY2hlY2tib3hlcy4gSW4gR1RLLCB0
aGUgc2hhZG93IHR5cGUKLSAgICAgICAgKiBtdXN0IGFsc28gYmUgY2hhbmdlZCBmb3IgdGhlIHN0
YXRlIHRvIGJlIGRyYXduLgotICAgICAgICAqLwotICAgICAgICBpZiAoaW5jb25zaXN0ZW50KSB7
Ci0gICAgICAgICAgICBndGtfdG9nZ2xlX2J1dHRvbl9zZXRfaW5jb25zaXN0ZW50KEdUS19UT0dH
TEVfQlVUVE9OKGdQYXJ0cy0+Y2hlY2tib3hXaWRnZXQpLCBUUlVFKTsKLSAgICAgICAgICAgIHNo
YWRvd190eXBlID0gR1RLX1NIQURPV19FVENIRURfSU47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAg
ICAgICAgICBndGtfdG9nZ2xlX2J1dHRvbl9zZXRfaW5jb25zaXN0ZW50KEdUS19UT0dHTEVfQlVU
VE9OKGdQYXJ0cy0+Y2hlY2tib3hXaWRnZXQpLCBGQUxTRSk7Ci0gICAgICAgIH0KLQotICAgICAg
ICBndGtfcGFpbnRfY2hlY2soc3R5bGUsIGNyLCBzdGF0ZV90eXBlLCBzaGFkb3dfdHlwZSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGdQYXJ0cy0+Y2hlY2tib3hXaWRnZXQsICJjaGVja2J1dHRv
biIsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAoc3RhdGUtPmZvY3VzZWQpIHsK
LSAgICAgICAgICAgIGd0a19wYWludF9mb2N1cyhzdHlsZSwgY3IsIEdUS19TVEFURV9BQ1RJVkUs
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ1BhcnRzLT5jaGVja2JveFdpZGdldCwgImNo
ZWNrYnV0dG9uIiwgZm9jdXNfeCwgZm9jdXNfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmb2N1c193aWR0aCwgZm9jdXNfaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJl
dHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBnaW50Ci1jYWxjdWxhdGVfYnV0dG9u
X2lubmVyX3JlY3QoR3RrV2lkZ2V0KiBidXR0b24sIEdka1JlY3RhbmdsZSogcmVjdCwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBHZGtSZWN0YW5nbGUqIGlubmVyX3JlY3QsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgR3RrVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24sCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZ2Jvb2xlYW4gaWdub3JlX2ZvY3VzKQotewotICAgIEd0a0Jv
cmRlciBpbm5lcl9ib3JkZXI7Ci0gICAgZ2Jvb2xlYW4gaW50ZXJpb3JfZm9jdXM7Ci0gICAgZ2lu
dCBmb2N1c193aWR0aCwgZm9jdXNfcGFkOwotICAgIEd0a1N0eWxlKiBzdHlsZTsKLQotICAgIHN0
eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUoYnV0dG9uKTsKLQotICAgIC8qIFRoaXMgbWlycm9y
cyBndGtidXR0b24ncyBjaGlsZCBwb3NpdGlvbmluZyAqLwotICAgIG1vel9ndGtfYnV0dG9uX2dl
dF9pbm5lcl9ib3JkZXIoYnV0dG9uLCAmaW5uZXJfYm9yZGVyKTsKLSAgICBtb3pfZ3RrX3dpZGdl
dF9nZXRfZm9jdXMoYnV0dG9uLCAmaW50ZXJpb3JfZm9jdXMsCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICZmb2N1c193aWR0aCwgJmZvY3VzX3BhZCk7Ci0KLSAgICBpZiAoaWdub3JlX2Zv
Y3VzKQotICAgICAgICBmb2N1c193aWR0aCA9IGZvY3VzX3BhZCA9IDA7Ci0KLSAgICBpbm5lcl9y
ZWN0LT54ID0gcmVjdC0+eCArIFhUSElDS05FU1Moc3R5bGUpICsgZm9jdXNfd2lkdGggKyBmb2N1
c19wYWQ7Ci0gICAgaW5uZXJfcmVjdC0+eCArPSBkaXJlY3Rpb24gPT0gR1RLX1RFWFRfRElSX0xU
UiA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbm5lcl9ib3JkZXIubGVmdCA6IGlubmVyX2Jv
cmRlci5yaWdodDsKLSAgICBpbm5lcl9yZWN0LT55ID0gcmVjdC0+eSArIGlubmVyX2JvcmRlci50
b3AgKyBZVEhJQ0tORVNTKHN0eWxlKSArCi0gICAgICAgICAgICAgICAgICAgIGZvY3VzX3dpZHRo
ICsgZm9jdXNfcGFkOwotICAgIGlubmVyX3JlY3QtPndpZHRoID0gTUFYKDEsIHJlY3QtPndpZHRo
IC0gaW5uZXJfYm9yZGVyLmxlZnQgLQotICAgICAgIGlubmVyX2JvcmRlci5yaWdodCAtIChYVEhJ
Q0tORVNTKHN0eWxlKSArIGZvY3VzX3BhZCArIGZvY3VzX3dpZHRoKSAqIDIpOwotICAgIGlubmVy
X3JlY3QtPmhlaWdodCA9IE1BWCgxLCByZWN0LT5oZWlnaHQgLSBpbm5lcl9ib3JkZXIudG9wIC0K
LSAgICAgICBpbm5lcl9ib3JkZXIuYm90dG9tIC0gKFlUSElDS05FU1Moc3R5bGUpICsgZm9jdXNf
cGFkICsgZm9jdXNfd2lkdGgpICogMik7Ci0KLSAgICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwot
fQotCi0KLXN0YXRpYyBnaW50Ci1jYWxjdWxhdGVfYXJyb3dfcmVjdChHdGtXaWRnZXQqIGFycm93
LCBHZGtSZWN0YW5nbGUqIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICBHZGtSZWN0YW5nbGUq
IGFycm93X3JlY3QsIEd0a1RleHREaXJlY3Rpb24gZGlyZWN0aW9uKQotewotICAgIC8qIGRlZmlu
ZWQgaW4gZ3RrYXJyb3cuYyAqLwotICAgIGdmbG9hdCBhcnJvd19zY2FsaW5nID0gMC43OwotICAg
IGdmbG9hdCB4YWxpZ24sIHhwYWQ7Ci0gICAgZ2ludCBleHRlbnQ7Ci0gICAgR3RrTWlzYyogbWlz
YyA9IEdUS19NSVNDKGFycm93KTsKLSAgICBnZmxvYXQgbWlzY194YWxpZ24sIG1pc2NfeWFsaWdu
OwotICAgIGdpbnQgbWlzY194cGFkLCBtaXNjX3lwYWQ7Ci0KLSAgICBpZiAoaGF2ZV9hcnJvd19z
Y2FsaW5nKQotICAgICAgICBndGtfd2lkZ2V0X3N0eWxlX2dldChhcnJvdywgImFycm93X3NjYWxp
bmciLCAmYXJyb3dfc2NhbGluZywgTlVMTCk7Ci0KLSAgICBndGtfbWlzY19nZXRfcGFkZGluZyht
aXNjLCAmbWlzY194cGFkLCAmbWlzY195cGFkKTsKLSAgICBndGtfbWlzY19nZXRfYWxpZ25tZW50
KG1pc2MsICZtaXNjX3hhbGlnbiwgJm1pc2NfeWFsaWduKTsKLQotICAgIGV4dGVudCA9IE1JTigo
cmVjdC0+d2lkdGggLSBtaXNjX3hwYWQgKiAyKSwKLSAgICAgICAgICAgICAgICAgKHJlY3QtPmhl
aWdodCAtIG1pc2NfeXBhZCAqIDIpKSAqIGFycm93X3NjYWxpbmc7Ci0KLSAgICB4YWxpZ24gPSBk
aXJlY3Rpb24gPT0gR1RLX1RFWFRfRElSX0xUUiA/IG1pc2NfeGFsaWduIDogMS4wIC0gbWlzY194
YWxpZ247Ci0gICAgeHBhZCA9IG1pc2NfeHBhZCArIChyZWN0LT53aWR0aCAtIGV4dGVudCkgKiB4
YWxpZ247Ci0KLSAgICBhcnJvd19yZWN0LT54ID0gZGlyZWN0aW9uID09IEdUS19URVhUX0RJUl9M
VFIgPwotICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3IocmVjdC0+eCArIHhwYWQpIDogY2Vp
bChyZWN0LT54ICsgeHBhZCk7Ci0gICAgYXJyb3dfcmVjdC0+eSA9IGZsb29yKHJlY3QtPnkgKyBt
aXNjX3lwYWQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJlY3QtPmhlaWdodCAtIGV4
dGVudCkgKiBtaXNjX3lhbGlnbikpOwotCi0gICAgYXJyb3dfcmVjdC0+d2lkdGggPSBhcnJvd19y
ZWN0LT5oZWlnaHQgPSBleHRlbnQ7Ci0KLSAgICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwotfQot
Ci1zdGF0aWMgZ2ludAotbW96X2d0a19zY3JvbGxlZF93aW5kb3dfcGFpbnQoY2Fpcm9fdCogY3Is
IEdka1JlY3RhbmdsZSogcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEd0a1dp
ZGdldFN0YXRlKiBzdGF0ZSkKLXsKLSAgICBHdGtTdHlsZSogc3R5bGU7Ci0gICAgR3RrQWxsb2Nh
dGlvbiBhbGxvY2F0aW9uOwotICAgIEd0a1dpZGdldCogd2lkZ2V0OwotCi0gICAgZW5zdXJlX3Nj
cm9sbGVkX3dpbmRvd193aWRnZXQoKTsKLSAgICB3aWRnZXQgPSBnUGFydHMtPnNjcm9sbGVkV2lu
ZG93V2lkZ2V0OwotCi0gICAgZ3RrX3dpZGdldF9nZXRfYWxsb2NhdGlvbih3aWRnZXQsICZhbGxv
Y2F0aW9uKTsKLSAgICBhbGxvY2F0aW9uLnggPSByZWN0LT54OwotICAgIGFsbG9jYXRpb24ueSA9
IHJlY3QtPnk7Ci0gICAgYWxsb2NhdGlvbi53aWR0aCA9IHJlY3QtPndpZHRoOwotICAgIGFsbG9j
YXRpb24uaGVpZ2h0ID0gcmVjdC0+aGVpZ2h0OwotICAgIGd0a193aWRnZXRfc2V0X2FsbG9jYXRp
b24od2lkZ2V0LCAmYWxsb2NhdGlvbik7Ci0KLSAgICBzdHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0
eWxlKHdpZGdldCk7Ci0gICAgZ3RrX3BhaW50X3NoYWRvdyhzdHlsZSwgY3IsIEdUS19TVEFURV9O
T1JNQUwsIEdUS19TSEFET1dfSU4sCi0gICAgICAgICAgICAgICAgICAgICB3aWRnZXQsICJzY3Jv
bGxlZF93aW5kb3ciLCByZWN0LT54ICwgcmVjdC0+eSwKLSAgICAgICAgICAgICAgICAgICAgIHJl
Y3QtPndpZHRoLCByZWN0LT5oZWlnaHQpOwotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19
Ci0KLXN0YXRpYyBnaW50Ci1tb3pfZ3RrX3Njcm9sbGJhcl9idXR0b25fcGFpbnQoY2Fpcm9fdCog
Y3IsIEdka1JlY3RhbmdsZSogcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBH
dGtXaWRnZXRTdGF0ZSogc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3Rr
U2Nyb2xsYmFyQnV0dG9uRmxhZ3MgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgR3RrVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0gICAgR3RrU3RhdGVUeXBlIHN0YXRl
X3R5cGUgPSBDb252ZXJ0R3RrU3RhdGUoc3RhdGUpOwotICAgIEd0a1NoYWRvd1R5cGUgc2hhZG93
X3R5cGUgPSAoc3RhdGUtPmFjdGl2ZSkgPwotICAgICAgICBHVEtfU0hBRE9XX0lOIDogR1RLX1NI
QURPV19PVVQ7Ci0gICAgR2RrUmVjdGFuZ2xlIGFycm93X3JlY3Q7Ci0gICAgR3RrU3R5bGUqIHN0
eWxlOwotICAgIEd0a1dpZGdldCAqc2Nyb2xsYmFyOwotICAgIEd0a0FsbG9jYXRpb24gYWxsb2Nh
dGlvbjsKLSAgICBHdGtBcnJvd1R5cGUgYXJyb3dfdHlwZTsKLSAgICBnaW50IGFycm93X2Rpc3Bs
YWNlbWVudF94LCBhcnJvd19kaXNwbGFjZW1lbnRfeTsKLSAgICBjb25zdCBjaGFyKiBkZXRhaWwg
PSAoZmxhZ3MgJiBNT1pfR1RLX1NURVBQRVJfVkVSVElDQUwpID8KLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJ2c2Nyb2xsYmFyIiA6ICJoc2Nyb2xsYmFyIjsKLQotICAgIGVuc3VyZV9zY3Jv
bGxiYXJfd2lkZ2V0KCk7Ci0KLSAgICBpZiAoZmxhZ3MgJiBNT1pfR1RLX1NURVBQRVJfVkVSVElD
QUwpCi0gICAgICAgIHNjcm9sbGJhciA9IGdQYXJ0cy0+dmVydFNjcm9sbGJhcldpZGdldDsKLSAg
ICBlbHNlCi0gICAgICAgIHNjcm9sbGJhciA9IGdQYXJ0cy0+aG9yaXpTY3JvbGxiYXJXaWRnZXQ7
Ci0KLSAgICBndGtfd2lkZ2V0X3NldF9kaXJlY3Rpb24oc2Nyb2xsYmFyLCBkaXJlY3Rpb24pOwot
Ci0gICAgLyogU29tZSB0aGVtZSBlbmdpbmVzIChpLmUuLCBDbGVhckxvb2tzKSBjaGVjayB0aGUg
c2Nyb2xsYmFyJ3MgYWxsb2NhdGlvbgotICAgICAgIHRvIGRldGVybWluZSB3aGVyZSBpdCBzaG91
bGQgcGFpbnQgcm91bmRlZCBjb3JuZXJzIG9uIHRoZSBidXR0b25zLgotICAgICAgIFdlIG5lZWQg
dG8gdHJpY2sgdGhlbSBpbnRvIGRyYXdpbmcgdGhlIGJ1dHRvbnMgdGhlIHdheSB3ZSB3YW50IHRo
ZW0uICovCi0KLSAgICBndGtfd2lkZ2V0X2dldF9hbGxvY2F0aW9uKHNjcm9sbGJhciwgJmFsbG9j
YXRpb24pOwotICAgIGFsbG9jYXRpb24ueCA9IHJlY3QtPng7Ci0gICAgYWxsb2NhdGlvbi55ID0g
cmVjdC0+eTsKLSAgICBhbGxvY2F0aW9uLndpZHRoID0gcmVjdC0+d2lkdGg7Ci0gICAgYWxsb2Nh
dGlvbi5oZWlnaHQgPSByZWN0LT5oZWlnaHQ7Ci0KLSAgICBpZiAoZmxhZ3MgJiBNT1pfR1RLX1NU
RVBQRVJfVkVSVElDQUwpIHsKLSAgICAgICAgYWxsb2NhdGlvbi5oZWlnaHQgKj0gNTsKLSAgICAg
ICAgaWYgKGZsYWdzICYgTU9aX0dUS19TVEVQUEVSX0RPV04pIHsKLSAgICAgICAgICAgIGFycm93
X3R5cGUgPSBHVEtfQVJST1dfRE9XTjsKLSAgICAgICAgICAgIGlmIChmbGFncyAmIE1PWl9HVEtf
U1RFUFBFUl9CT1RUT00pCi0gICAgICAgICAgICAgICAgYWxsb2NhdGlvbi55IC09IDQgKiByZWN0
LT5oZWlnaHQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYWxsb2NhdGlvbi55
IC09IHJlY3QtPmhlaWdodDsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXJyb3df
dHlwZSA9IEdUS19BUlJPV19VUDsKLSAgICAgICAgICAgIGlmIChmbGFncyAmIE1PWl9HVEtfU1RF
UFBFUl9CT1RUT00pCi0gICAgICAgICAgICAgICAgYWxsb2NhdGlvbi55IC09IDMgKiByZWN0LT5o
ZWlnaHQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBhbGxvY2F0aW9uLndpZHRo
ICo9IDU7Ci0gICAgICAgIGlmIChmbGFncyAmIE1PWl9HVEtfU1RFUFBFUl9ET1dOKSB7Ci0gICAg
ICAgICAgICBhcnJvd190eXBlID0gR1RLX0FSUk9XX1JJR0hUOwotICAgICAgICAgICAgaWYgKGZs
YWdzICYgTU9aX0dUS19TVEVQUEVSX0JPVFRPTSkKLSAgICAgICAgICAgICAgICBhbGxvY2F0aW9u
LnggLT0gNCAqIHJlY3QtPndpZHRoOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg
IGFsbG9jYXRpb24ueCAtPSByZWN0LT53aWR0aDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAg
ICAgIGFycm93X3R5cGUgPSBHVEtfQVJST1dfTEVGVDsKLSAgICAgICAgICAgIGlmIChmbGFncyAm
IE1PWl9HVEtfU1RFUFBFUl9CT1RUT00pCi0gICAgICAgICAgICAgICAgYWxsb2NhdGlvbi54IC09
IDMgKiByZWN0LT53aWR0aDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGd0a193aWRnZXRfc2V0
X2FsbG9jYXRpb24oc2Nyb2xsYmFyLCAmYWxsb2NhdGlvbik7Ci0gICAgc3R5bGUgPSBndGtfd2lk
Z2V0X2dldF9zdHlsZShzY3JvbGxiYXIpOwotCi0gICAgZ3RrX3BhaW50X2JveChzdHlsZSwgY3Is
IHN0YXRlX3R5cGUsIHNoYWRvd190eXBlLAotICAgICAgICAgICAgICAgICAgc2Nyb2xsYmFyLCBk
ZXRhaWwsIHJlY3QtPngsIHJlY3QtPnksCi0gICAgICAgICAgICAgICAgICByZWN0LT53aWR0aCwg
cmVjdC0+aGVpZ2h0KTsKLQotICAgIGFycm93X3JlY3Qud2lkdGggPSByZWN0LT53aWR0aCAvIDI7
Ci0gICAgYXJyb3dfcmVjdC5oZWlnaHQgPSByZWN0LT5oZWlnaHQgLyAyOwotICAgIGFycm93X3Jl
Y3QueCA9IHJlY3QtPnggKyAocmVjdC0+d2lkdGggLSBhcnJvd19yZWN0LndpZHRoKSAvIDI7Ci0g
ICAgYXJyb3dfcmVjdC55ID0gcmVjdC0+eSArIChyZWN0LT5oZWlnaHQgLSBhcnJvd19yZWN0Lmhl
aWdodCkgLyAyOwotCi0gICAgaWYgKHN0YXRlX3R5cGUgPT0gR1RLX1NUQVRFX0FDVElWRSkgewot
ICAgICAgICBndGtfd2lkZ2V0X3N0eWxlX2dldChzY3JvbGxiYXIsCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICJhcnJvdy1kaXNwbGFjZW1lbnQteCIsICZhcnJvd19kaXNwbGFjZW1lbnRf
eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFycm93LWRpc3BsYWNlbWVudC15Iiwg
JmFycm93X2Rpc3BsYWNlbWVudF95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxM
KTsKLQotICAgICAgICBhcnJvd19yZWN0LnggKz0gYXJyb3dfZGlzcGxhY2VtZW50X3g7Ci0gICAg
ICAgIGFycm93X3JlY3QueSArPSBhcnJvd19kaXNwbGFjZW1lbnRfeTsKLSAgICB9Ci0KLSAgICBn
dGtfcGFpbnRfYXJyb3coc3R5bGUsIGNyLCBzdGF0ZV90eXBlLCBzaGFkb3dfdHlwZSwKLSAgICAg
ICAgICAgICAgICAgICAgc2Nyb2xsYmFyLCBkZXRhaWwsIGFycm93X3R5cGUsIFRSVUUsIGFycm93
X3JlY3QueCwKLSAgICAgICAgICAgICAgICAgICAgYXJyb3dfcmVjdC55LCBhcnJvd19yZWN0Lndp
ZHRoLCBhcnJvd19yZWN0LmhlaWdodCk7Ci0KLSAgICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwot
fQotCi1zdGF0aWMgZ2ludAotbW96X2d0a19zY3JvbGxiYXJfdHJvdWdoX3BhaW50KEd0a1RoZW1l
V2lkZ2V0VHlwZSB3aWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fpcm9f
dCogY3IsIEdka1JlY3RhbmdsZSogcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBHdGtXaWRnZXRTdGF0ZSogc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
R3RrVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0gICAgR3RrU3R5bGUqIHN0eWxlOwotICAg
IEd0a1Njcm9sbGJhciAqc2Nyb2xsYmFyOwotCi0gICAgZW5zdXJlX3Njcm9sbGJhcl93aWRnZXQo
KTsKLQotICAgIGlmICh3aWRnZXQgPT0gIE1PWl9HVEtfU0NST0xMQkFSX1RSQUNLX0hPUklaT05U
QUwpCi0gICAgICAgIHNjcm9sbGJhciA9IEdUS19TQ1JPTExCQVIoZ1BhcnRzLT5ob3JpelNjcm9s
bGJhcldpZGdldCk7Ci0gICAgZWxzZQotICAgICAgICBzY3JvbGxiYXIgPSBHVEtfU0NST0xMQkFS
KGdQYXJ0cy0+dmVydFNjcm9sbGJhcldpZGdldCk7Ci0KLSAgICBndGtfd2lkZ2V0X3NldF9kaXJl
Y3Rpb24oR1RLX1dJREdFVChzY3JvbGxiYXIpLCBkaXJlY3Rpb24pOwotCi0gICAgc3R5bGUgPSBn
dGtfd2lkZ2V0X2dldF9zdHlsZShHVEtfV0lER0VUKHNjcm9sbGJhcikpOwotCi0gICAgZ3RrX3Bh
aW50X2JveChzdHlsZSwgY3IsIEdUS19TVEFURV9BQ1RJVkUsIEdUS19TSEFET1dfSU4sCi0gICAg
ICAgICAgICAgICAgICBHVEtfV0lER0VUKHNjcm9sbGJhciksICJ0cm91Z2giLCByZWN0LT54LCBy
ZWN0LT55LAotICAgICAgICAgICAgICAgICAgcmVjdC0+d2lkdGgsIHJlY3QtPmhlaWdodCk7Ci0K
LSAgICBpZiAoc3RhdGUtPmZvY3VzZWQpIHsKLSAgICAgICAgZ3RrX3BhaW50X2ZvY3VzKHN0eWxl
LCBjciwgR1RLX1NUQVRFX0FDVElWRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdUS19XSURH
RVQoc2Nyb2xsYmFyKSwgInRyb3VnaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICByZWN0LT54
LCByZWN0LT55LCByZWN0LT53aWR0aCwgcmVjdC0+aGVpZ2h0KTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gTU9aX0dUS19TVUNDRVNTOwotfQotCi1zdGF0aWMgZ2ludAotbW96X2d0a19zY3JvbGxiYXJf
dGh1bWJfcGFpbnQoR3RrVGhlbWVXaWRnZXRUeXBlIHdpZGdldCwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNhaXJvX3QqIGNyLCBHZGtSZWN0YW5nbGUqIHJlY3QsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBHdGtXaWRnZXRTdGF0ZSogc3RhdGUsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBHdGtUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLSAgICBHdGtT
dGF0ZVR5cGUgc3RhdGVfdHlwZSA9IChzdGF0ZS0+aW5Ib3ZlciB8fCBzdGF0ZS0+YWN0aXZlKSA/
Ci0gICAgICAgIEdUS19TVEFURV9QUkVMSUdIVCA6IEdUS19TVEFURV9OT1JNQUw7Ci0gICAgR3Rr
U2hhZG93VHlwZSBzaGFkb3dfdHlwZSA9IEdUS19TSEFET1dfT1VUOwotICAgIEd0a1N0eWxlKiBz
dHlsZTsKLSAgICBHdGtTY3JvbGxiYXIgKnNjcm9sbGJhcjsKLSAgICBHdGtBZGp1c3RtZW50ICph
ZGo7Ci0KLSAgICBlbnN1cmVfc2Nyb2xsYmFyX3dpZGdldCgpOwotCi0gICAgaWYgKHdpZGdldCA9
PSBNT1pfR1RLX1NDUk9MTEJBUl9USFVNQl9IT1JJWk9OVEFMKQotICAgICAgICBzY3JvbGxiYXIg
PSBHVEtfU0NST0xMQkFSKGdQYXJ0cy0+aG9yaXpTY3JvbGxiYXJXaWRnZXQpOwotICAgIGVsc2UK
LSAgICAgICAgc2Nyb2xsYmFyID0gR1RLX1NDUk9MTEJBUihnUGFydHMtPnZlcnRTY3JvbGxiYXJX
aWRnZXQpOwotCi0gICAgZ3RrX3dpZGdldF9zZXRfZGlyZWN0aW9uKEdUS19XSURHRVQoc2Nyb2xs
YmFyKSwgZGlyZWN0aW9uKTsKLQotICAgIC8qIE1ha2Ugc3VyZSB0byBzZXQgdGhlIHNjcm9sbGJh
ciByYW5nZSBiZWZvcmUgcGFpbnRpbmcgc28gdGhhdAotICAgICAgIGV2ZXJ5dGhpbmcgaXMgZHJh
d24gcHJvcGVybHkuICBBdCBsZWFzdCB0aGUgYmx1ZWN1cnZlIChhbmQKLSAgICAgICBtYXliZSBv
dGhlcikgdGhlbWVzIGRvbid0IGRyYXcgdGhlIHRvcCBvciBib3R0b20gYmxhY2sgbGluZQotICAg
ICAgIHN1cnJvdW5kaW5nIHRoZSBzY3JvbGxiYXIgaWYgdGhlIHRoZW1lIHRoaW5rcyB0aGF0IGl0
J3MgYnV0dGVkCi0gICAgICAgdXAgYWdhaW5zdCB0aGUgc2Nyb2xsYmFyIGFycm93cy4gIE5vdGUg
dGhlIGluY3JlYXNlcyBvZiB0aGUKLSAgICAgICBjbGlwIHJlY3QgYmVsb3cuICovCi0gICAgYWRq
ID0gZ3RrX3JhbmdlX2dldF9hZGp1c3RtZW50KEdUS19SQU5HRShzY3JvbGxiYXIpKTsKLQotICAg
IGlmICh3aWRnZXQgPT0gTU9aX0dUS19TQ1JPTExCQVJfVEhVTUJfSE9SSVpPTlRBTCkgewotICAg
ICAgICBndGtfYWRqdXN0bWVudF9zZXRfcGFnZV9zaXplKGFkaiwgcmVjdC0+d2lkdGgpOwotICAg
IH0KLSAgICBlbHNlIHsKLSAgICAgICAgZ3RrX2FkanVzdG1lbnRfc2V0X3BhZ2Vfc2l6ZShhZGos
IHJlY3QtPmhlaWdodCk7Ci0gICAgfQotCi0gICAgZ3RrX2FkanVzdG1lbnRfY29uZmlndXJlKGFk
aiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmN1cnBvcywKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rh
dGUtPm1heHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RrX2FkanVzdG1lbnRf
Z2V0X3N0ZXBfaW5jcmVtZW50KGFkaiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0
a19hZGp1c3RtZW50X2dldF9wYWdlX2luY3JlbWVudChhZGopLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBndGtfYWRqdXN0bWVudF9nZXRfcGFnZV9zaXplKGFkaikpOwotCi0gICAgc3R5
bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZShHVEtfV0lER0VUKHNjcm9sbGJhcikpOwotCi0gICAg
Z3RrX3BhaW50X3NsaWRlcihzdHlsZSwgY3IsIHN0YXRlX3R5cGUsIHNoYWRvd190eXBlLAotICAg
ICAgICAgICAgICAgICAgICAgR1RLX1dJREdFVChzY3JvbGxiYXIpLCAic2xpZGVyIiwgcmVjdC0+
eCwgcmVjdC0+eSwKLSAgICAgICAgICAgICAgICAgICAgIHJlY3QtPndpZHRoLCAgcmVjdC0+aGVp
Z2h0LAotICAgICAgICAgICAgICAgICAgICAgKHdpZGdldCA9PSBNT1pfR1RLX1NDUk9MTEJBUl9U
SFVNQl9IT1JJWk9OVEFMKSA/Ci0gICAgICAgICAgICAgICAgICAgICBHVEtfT1JJRU5UQVRJT05f
SE9SSVpPTlRBTCA6IEdUS19PUklFTlRBVElPTl9WRVJUSUNBTCk7Ci0KLSAgICByZXR1cm4gTU9a
X0dUS19TVUNDRVNTOwotfQotCi1zdGF0aWMgZ2ludAotbW96X2d0a19zY2FsZV9wYWludChjYWly
b190KiBjciwgR2RrUmVjdGFuZ2xlKiByZWN0LAotICAgICAgICAgICAgICAgICAgICBHdGtXaWRn
ZXRTdGF0ZSogc3RhdGUsIEd0a09yaWVudGF0aW9uIGZsYWdzLAotICAgICAgICAgICAgICAgICAg
ICBHdGtUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLSAgZ2ludCB4ID0gMCwgeSA9IDA7Ci0g
IEd0a1N0YXRlVHlwZSBzdGF0ZV90eXBlID0gQ29udmVydEd0a1N0YXRlKHN0YXRlKTsKLSAgR3Rr
U3R5bGUqIHN0eWxlOwotICBHdGtXaWRnZXQqIHdpZGdldDsKLQotICBlbnN1cmVfc2NhbGVfd2lk
Z2V0KCk7Ci0gIHdpZGdldCA9ICgoZmxhZ3MgPT0gR1RLX09SSUVOVEFUSU9OX0hPUklaT05UQUwp
ID8gZ1BhcnRzLT5oU2NhbGVXaWRnZXQgOiBnUGFydHMtPnZTY2FsZVdpZGdldCk7Ci0gIGd0a193
aWRnZXRfc2V0X2RpcmVjdGlvbih3aWRnZXQsIGRpcmVjdGlvbik7Ci0KLSAgc3R5bGUgPSBndGtf
d2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpOwotCi0gIGlmIChmbGFncyA9PSBHVEtfT1JJRU5UQVRJ
T05fSE9SSVpPTlRBTCkgewotICAgIHggPSBYVEhJQ0tORVNTKHN0eWxlKTsKLSAgICB5Kys7Ci0g
IH0KLSAgZWxzZSB7Ci0gICAgeCsrOwotICAgIHkgPSBZVEhJQ0tORVNTKHN0eWxlKTsKLSAgfQot
Ci0gIGd0a19zdHlsZV9hcHBseV9kZWZhdWx0X2JhY2tncm91bmQoc3R5bGUsIGNyLCBndGtfd2lk
Z2V0X2dldF93aW5kb3cgKHdpZGdldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgR1RLX1NUQVRFX05PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICByZWN0LT54LCByZWN0LT55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHJlY3QtPndpZHRoLCByZWN0LT5oZWlnaHQpOwotCi0gIGd0a19wYWludF9ib3goc3R5bGUs
IGNyLCBHVEtfU1RBVEVfQUNUSVZFLCBHVEtfU0hBRE9XX0lOLAotICAgICAgICAgICAgICAgIHdp
ZGdldCwgInRyb3VnaCIsIHJlY3QtPnggKyB4LCByZWN0LT55ICsgeSwKLSAgICAgICAgICAgICAg
ICByZWN0LT53aWR0aCAtIDIqeCwgcmVjdC0+aGVpZ2h0IC0gMip5KTsKLQotICBpZiAoc3RhdGUt
PmZvY3VzZWQpCi0gICAgZ3RrX3BhaW50X2ZvY3VzKHN0eWxlLCBjciwgc3RhdGVfdHlwZSwgd2lk
Z2V0LCAidHJvdWdoIiwKLSAgICAgICAgICAgICAgICAgICAgcmVjdC0+eCwgcmVjdC0+eSwgcmVj
dC0+d2lkdGgsIHJlY3QtPmhlaWdodCk7Ci0KLSAgcmV0dXJuIE1PWl9HVEtfU1VDQ0VTUzsKLX0K
LQotc3RhdGljIGdpbnQKLW1vel9ndGtfc2NhbGVfdGh1bWJfcGFpbnQoY2Fpcm9fdCogY3IsIEdk
a1JlY3RhbmdsZSogcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR3RrV2lkZ2V0U3Rh
dGUqIHN0YXRlLCBHdGtPcmllbnRhdGlvbiBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgR3RrVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0gIEd0a1N0YXRlVHlwZSBzdGF0ZV90
eXBlID0gQ29udmVydEd0a1N0YXRlKHN0YXRlKTsKLSAgR3RrU3R5bGUqIHN0eWxlOwotICBHdGtX
aWRnZXQqIHdpZGdldDsKLSAgZ2ludCB0aHVtYl93aWR0aCwgdGh1bWJfaGVpZ2h0LCB4LCB5Owot
Ci0gIGVuc3VyZV9zY2FsZV93aWRnZXQoKTsKLSAgd2lkZ2V0ID0gKChmbGFncyA9PSBHVEtfT1JJ
RU5UQVRJT05fSE9SSVpPTlRBTCkgPyBnUGFydHMtPmhTY2FsZVdpZGdldCA6IGdQYXJ0cy0+dlNj
YWxlV2lkZ2V0KTsKLSAgZ3RrX3dpZGdldF9zZXRfZGlyZWN0aW9uKHdpZGdldCwgZGlyZWN0aW9u
KTsKLQotICBzdHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCk7Ci0KLSAgLyogZGV0
ZXJtaW5lIHRoZSB0aHVtYiBzaXplLCBhbmQgcG9zaXRpb24gdGhlIHRodW1iIGluIHRoZSBjZW50
ZXIgaW4gdGhlIG9wcG9zaXRlIGF4aXMgKi8KLSAgaWYgKGZsYWdzID09IEdUS19PUklFTlRBVElP
Tl9IT1JJWk9OVEFMKSB7Ci0gICAgbW96X2d0a19nZXRfc2NhbGV0aHVtYl9tZXRyaWNzKEdUS19P
UklFTlRBVElPTl9IT1JJWk9OVEFMLCAmdGh1bWJfd2lkdGgsICZ0aHVtYl9oZWlnaHQpOwotICAg
IHggPSByZWN0LT54OwotICAgIHkgPSByZWN0LT55ICsgKHJlY3QtPmhlaWdodCAtIHRodW1iX2hl
aWdodCkgLyAyOwotICB9Ci0gIGVsc2UgewotICAgIG1vel9ndGtfZ2V0X3NjYWxldGh1bWJfbWV0
cmljcyhHVEtfT1JJRU5UQVRJT05fVkVSVElDQUwsICZ0aHVtYl9oZWlnaHQsICZ0aHVtYl93aWR0
aCk7Ci0gICAgeCA9IHJlY3QtPnggKyAocmVjdC0+d2lkdGggLSB0aHVtYl93aWR0aCkgLyAyOwot
ICAgIHkgPSByZWN0LT55OwotICB9Ci0KLSAgZ3RrX3BhaW50X3NsaWRlcihzdHlsZSwgY3IsIHN0
YXRlX3R5cGUsIEdUS19TSEFET1dfT1VULAotICAgICAgICAgICAgICAgICAgIHdpZGdldCwgKGZs
YWdzID09IEdUS19PUklFTlRBVElPTl9IT1JJWk9OVEFMKSA/ICJoc2NhbGUiIDogInZzY2FsZSIs
Ci0gICAgICAgICAgICAgICAgICAgeCwgeSwgdGh1bWJfd2lkdGgsIHRodW1iX2hlaWdodCwgZmxh
Z3MpOwotCi0gIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBnaW50Ci1tb3pf
Z3RrX2VudHJ5X3BhaW50KGNhaXJvX3QqIGNyLCBHZGtSZWN0YW5nbGUqIHJlY3QsCi0gICAgICAg
ICAgICAgICAgICAgIEd0a1dpZGdldFN0YXRlKiBzdGF0ZSwgR3RrV2lkZ2V0KiB3aWRnZXQsCi0g
ICAgICAgICAgICAgICAgICAgIEd0a1RleHREaXJlY3Rpb24gZGlyZWN0aW9uKQotewotICAgIEd0
a1N0YXRlVHlwZSBiZ19zdGF0ZSA9IHN0YXRlLT5kaXNhYmxlZCA/Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEdUS19TVEFURV9JTlNFTlNJVElWRSA6IEdUS19TVEFURV9OT1JNQUw7
Ci0gICAgZ2ludCB4LCB5LCB3aWR0aCA9IHJlY3QtPndpZHRoLCBoZWlnaHQgPSByZWN0LT5oZWln
aHQ7Ci0gICAgR3RrU3R5bGUqIHN0eWxlOwotICAgIGdib29sZWFuIGludGVyaW9yX2ZvY3VzOwot
ICAgIGdib29sZWFuIHRoZW1lX2hvbm9yc190cmFuc3BhcmVuY3kgPSBGQUxTRTsKLSAgICBnaW50
IGZvY3VzX3dpZHRoOwotCi0gICAgZ3RrX3dpZGdldF9zZXRfZGlyZWN0aW9uKHdpZGdldCwgZGly
ZWN0aW9uKTsKLQotICAgIHN0eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KTsKLQot
ICAgIGd0a193aWRnZXRfc3R5bGVfZ2V0KHdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAiaW50ZXJpb3ItZm9jdXMiLCAmaW50ZXJpb3JfZm9jdXMsCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgImZvY3VzLWxpbmUtd2lkdGgiLCAmZm9jdXNfd2lkdGgsCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgImhvbm9ycy10cmFuc3BhcmVudC1iZy1oaW50IiwgJnRoZW1lX2hvbm9yc190cmFu
c3BhcmVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgICAvKiBndGtl
bnRyeS5jIHVzZXMgdHdvIHdpbmRvd3MsIG9uZSBmb3IgdGhlIGVudGlyZSB3aWRnZXQgYW5kIG9u
ZSBmb3IgdGhlCi0gICAgICogdGV4dCBhcmVhIGluc2lkZSBpdC4gVGhlIGJhY2tncm91bmQgb2Yg
Ym90aCB3aW5kb3dzIGlzIHNldCB0byB0aGUgImJhc2UiCi0gICAgICogY29sb3Igb2YgdGhlIG5l
dyBzdGF0ZSBpbiBndGtfZW50cnlfc3RhdGVfY2hhbmdlZCwgYnV0IG9ubHkgdGhlIGlubmVyCi0g
ICAgICogdGV4dGFyZWEgd2luZG93IHVzZXMgZ3RrX3BhaW50X2ZsYXRfYm94IHdoZW4gZXhwb3Nl
ZCAqLwotCi0gICAgLyogVGhpcyBnZXRzIHVzIGEgbG92ZWx5IGdyZXlpc2ggZGlzYWJsZWRpc2gg
bG9vayAqLwotICAgIGd0a193aWRnZXRfc2V0X3NlbnNpdGl2ZSh3aWRnZXQsICFzdGF0ZS0+ZGlz
YWJsZWQpOwotCi0gICAgLyogR1RLIGZpbGxzIHRoZSBvdXRlciB3aWRnZXQgd2luZG93IHdpdGgg
dGhlIGJhc2UgY29sb3IgYmVmb3JlIGRyYXdpbmcgdGhlIHdpZGdldC4KLSAgICAgKiBTb21lIG9s
ZGVyIHRoZW1lcyByZWx5IG9uIHRoaXMgYmVoYXZpb3IsIGJ1dCBtYW55IHRoZW1lcyBub3dhZGF5
cyB1c2Ugcm91bmRlZAotICAgICAqIGNvcm5lcnMgb24gdGhlaXIgd2lkZ2V0cy4gV2hpbGUgbW9z
dCBHVEsgYXBwcyBhcmUgYmxpc3NmdWxseSB1bmF3YXJlIG9mIHRoaXMKLSAgICAgKiBwcm9ibGVt
IGR1ZSB0byB0aGVpciB1c2Ugb2YgdGhlIGRlZmF1bHQgd2luZG93IGJhY2tncm91bmQsIHdlIHJl
bmRlciB3aWRnZXRzIG9uCi0gICAgICogbWFueSBraW5kcyBvZiBiYWNrZ3JvdW5kcyBvbiB0aGUg
d2ViLgotICAgICAqIElmIHRoZSB0aGVtZSBpcyBhYmxlIHRvIGNvcGUgd2l0aCB0cmFuc3BhcmVu
Y3ksIHRoZW4gd2UgY2FuIHNraXAgcHJlLWZpbGxpbmcKLSAgICAgKiBhbmQgbm90aWZ5IHRoZSB0
aGVtZSBpdCB3aWxsIHBhaW50IGRpcmVjdGx5IG9uIHRoZSBjYW52YXMuICovCi0gICAgaWYgKHRo
ZW1lX2hvbm9yc190cmFuc3BhcmVuY3kpIHsKLSAgICAgICAgZ19vYmplY3Rfc2V0X2RhdGEoR19P
QkpFQ1Qod2lkZ2V0KSwgInRyYW5zcGFyZW50LWJnLWhpbnQiLCBHSU5UX1RPX1BPSU5URVIoVFJV
RSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNhaXJvX3NhdmUoY3IpOwotICAgICAgICBnZGtf
Y2Fpcm9fc2V0X3NvdXJjZV9jb2xvcihjciwgKGNvbnN0IEdka0NvbG9yKikmc3R5bGUtPmJhc2Vb
Ymdfc3RhdGVdKTsKLSAgICAgICAgY2Fpcm9fcGF0dGVybl9zZXRfZXh0ZW5kKGNhaXJvX2dldF9z
b3VyY2UoY3IpLCBDQUlST19FWFRFTkRfUkVQRUFUKTsKLSAgICAgICAgY2Fpcm9fZmlsbChjcik7
Ci0gICAgICAgIGNhaXJvX3Jlc3RvcmUoY3IpOwotICAgICAgICBnX29iamVjdF9zZXRfZGF0YShH
X09CSkVDVCh3aWRnZXQpLCAidHJhbnNwYXJlbnQtYmctaGludCIsIEdJTlRfVE9fUE9JTlRFUihG
QUxTRSkpOwotICAgIH0KLQotICAgIC8qIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGlubmVyIHdp
bmRvdywgc2VlIF9ndGtfZW50cnlfZ2V0X2JvcmRlcnMgKi8KLSAgICB4ID0gWFRISUNLTkVTUyhz
dHlsZSk7Ci0gICAgeSA9IFlUSElDS05FU1Moc3R5bGUpOwotCi0gICAgaWYgKCFpbnRlcmlvcl9m
b2N1cykgewotICAgICAgICB4ICs9IGZvY3VzX3dpZHRoOwotICAgICAgICB5ICs9IGZvY3VzX3dp
ZHRoOwotICAgIH0KLQotICAgIC8qIFNpbXVsYXRlIGFuIGV4cG9zZSBvZiB0aGUgaW5uZXIgd2lu
ZG93ICovCi0gICAgZ3RrX3BhaW50X2ZsYXRfYm94KHN0eWxlLCBjciwgYmdfc3RhdGUsIEdUS19T
SEFET1dfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LCAiZW50cnlfYmciLCAg
cmVjdC0+eCArIHgsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPnkgKyB5LCByZWN0LT53
aWR0aCAtIDIqeCwgcmVjdC0+aGVpZ2h0IC0gMip5KTsKLQotICAgIC8qIE5vdyBwYWludCB0aGUg
c2hhZG93IGFuZCBmb2N1cyBib3JkZXIuCi0gICAgICogV2UgZG8gbGlrZSBpbiBndGtfZW50cnlf
ZHJhd19mcmFtZSwgd2UgZmlyc3QgZHJhdyB0aGUgc2hhZG93LCBhIHRhZAotICAgICAqIHNtYWxs
ZXIgd2hlbiBmb2N1c2VkIGlmIHRoZSBmb2N1cyBpcyBub3QgaW50ZXJpb3IsIHRoZW4gdGhlIGZv
Y3VzLiAqLwotICAgIHggPSByZWN0LT54OwotICAgIHkgPSByZWN0LT55OwotCi0gICAgaWYgKHN0
YXRlLT5mb2N1c2VkICYmICFzdGF0ZS0+ZGlzYWJsZWQpIHsKLSAgICAgICAgLyogVGhpcyB3aWxs
IGdldCB1cyB0aGUgbGl0IGJvcmRlcnMgdGhhdCBmb2N1c2VkIHRleHRib3hlcyBlbmpveSBvbgot
ICAgICAgICAgKiBzb21lIHRoZW1lcy4gKi8KLSAgICAgICAgaWYgKCFpbnRlcmlvcl9mb2N1cykg
ewotICAgICAgICAgICAgLyogSW5kZW50IHRoZSBib3JkZXIgYSBsaXR0bGUgYml0IGlmIHdlIGhh
dmUgZXh0ZXJpb3IgZm9jdXMKLSAgICAgICAgICAgICAgICh0aGlzIGlzIHdoYXQgR1RLIGRvZXMg
dG8gZHJhdyBuYXRpdmUgZW50cmllcykgKi8KLSAgICAgICAgICAgIHggKz0gZm9jdXNfd2lkdGg7
Ci0gICAgICAgICAgICB5ICs9IGZvY3VzX3dpZHRoOwotICAgICAgICAgICAgd2lkdGggLT0gMiAq
IGZvY3VzX3dpZHRoOwotICAgICAgICAgICAgaGVpZ2h0IC09IDIgKiBmb2N1c193aWR0aDsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIGd0a19wYWludF9zaGFkb3coc3R5bGUsIGNyLCBHVEtfU1RB
VEVfTk9STUFMLCBHVEtfU0hBRE9XX0lOLAotICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LCAi
ZW50cnkiLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLQotICAgIGlmIChzdGF0ZS0+Zm9jdXNlZCAm
JiAhc3RhdGUtPmRpc2FibGVkKSB7Ci0gICAgICAgIGlmICghaW50ZXJpb3JfZm9jdXMpIHsKLSAg
ICAgICAgICAgIGd0a19wYWludF9mb2N1cyhzdHlsZSwgY3IsICBHVEtfU1RBVEVfTk9STUFMLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldCwgImVudHJ5IiwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByZWN0LT54LCByZWN0LT55LCByZWN0LT53aWR0aCwgcmVjdC0+aGVp
Z2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19
Ci0KLXN0YXRpYyBnaW50Ci1tb3pfZ3RrX2NvbWJvX2JveF9wYWludChjYWlyb190KiBjciwgR2Rr
UmVjdGFuZ2xlKiByZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgR3RrV2lkZ2V0U3RhdGUq
IHN0YXRlLCBnYm9vbGVhbiBpc2h0bWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBHdGtUZXh0
RGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLSAgICBHZGtSZWN0YW5nbGUgYXJyb3dfcmVjdCwgcmVh
bF9hcnJvd19yZWN0OwotICAgIGdpbnQgLyogYXJyb3dfc2l6ZSwgKi8gc2VwYXJhdG9yX3dpZHRo
OwotICAgIGdib29sZWFuIHdpZGVfc2VwYXJhdG9yczsKLSAgICBHdGtTdGF0ZVR5cGUgc3RhdGVf
dHlwZSA9IENvbnZlcnRHdGtTdGF0ZShzdGF0ZSk7Ci0gICAgR3RrU2hhZG93VHlwZSBzaGFkb3df
dHlwZSA9IHN0YXRlLT5hY3RpdmUgPyBHVEtfU0hBRE9XX0lOIDogR1RLX1NIQURPV19PVVQ7Ci0g
ICAgR3RrU3R5bGUqIHN0eWxlOwotICAgIEd0a1JlcXVpc2l0aW9uIGFycm93X3JlcTsKLQotICAg
IGVuc3VyZV9jb21ib19ib3hfd2lkZ2V0cygpOwotCi0gICAgLyogQWxzbyBzZXRzIHRoZSBkaXJl
Y3Rpb24gb24gZ1BhcnRzLT5jb21ib0JveEJ1dHRvbldpZGdldCwgd2hpY2ggaXMgdGhlbgotICAg
ICAqIGluaGVyaXRlZCBieSB0aGUgc2VwYXJhdG9yIGFuZCBhcnJvdyAqLwotICAgIG1vel9ndGtf
YnV0dG9uX3BhaW50KGNyLCByZWN0LCBzdGF0ZSwgR1RLX1JFTElFRl9OT1JNQUwsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgZ1BhcnRzLT5jb21ib0JveEJ1dHRvbldpZGdldCwgZGlyZWN0aW9u
KTsKLQotICAgIGNhbGN1bGF0ZV9idXR0b25faW5uZXJfcmVjdChnUGFydHMtPmNvbWJvQm94QnV0
dG9uV2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LCAmYXJyb3df
cmVjdCwgZGlyZWN0aW9uLCBpc2h0bWwpOwotICAgIC8qIE5vdyBhcnJvd19yZWN0IGNvbnRhaW5z
IHRoZSBpbm5lciByZWN0IDsgd2Ugd2FudCB0byBjb3JyZWN0IHRoZSB3aWR0aAotICAgICAqIHRv
IHdoYXQgdGhlIGFycm93IG5lZWRzIChzZWUgZ3RrX2NvbWJvX2JveF9zaXplX2FsbG9jYXRlKSAq
LwotICAgIGd0a193aWRnZXRfZ2V0X3ByZWZlcnJlZF9zaXplKGdQYXJ0cy0+Y29tYm9Cb3hBcnJv
d1dpZGdldCwgJmFycm93X3JlcSwgTlVMTCk7Ci0gICAgaWYgKGRpcmVjdGlvbiA9PSBHVEtfVEVY
VF9ESVJfTFRSKQotICAgICAgICBhcnJvd19yZWN0LnggKz0gYXJyb3dfcmVjdC53aWR0aCAtIGFy
cm93X3JlcS53aWR0aDsKLSAgICBhcnJvd19yZWN0LndpZHRoID0gYXJyb3dfcmVxLndpZHRoOwot
Ci0gICAgY2FsY3VsYXRlX2Fycm93X3JlY3QoZ1BhcnRzLT5jb21ib0JveEFycm93V2lkZ2V0LAot
ICAgICAgICAgICAgICAgICAgICAgICAgICZhcnJvd19yZWN0LCAmcmVhbF9hcnJvd19yZWN0LCBk
aXJlY3Rpb24pOwotCi0gICAgc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZShnUGFydHMtPmNv
bWJvQm94QXJyb3dXaWRnZXQpOwotCi0gICAgZ3RrX3dpZGdldF9zaXplX2FsbG9jYXRlKGdQYXJ0
cy0+Y29tYm9Cb3hXaWRnZXQsIHJlY3QpOwotCi0gICAgZ3RrX3BhaW50X2Fycm93KHN0eWxlLCBj
ciwgc3RhdGVfdHlwZSwgc2hhZG93X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgIGdQYXJ0cy0+
Y29tYm9Cb3hBcnJvd1dpZGdldCwgImFycm93IiwgIEdUS19BUlJPV19ET1dOLCBUUlVFLAotICAg
ICAgICAgICAgICAgICAgICByZWFsX2Fycm93X3JlY3QueCwgcmVhbF9hcnJvd19yZWN0LnksCi0g
ICAgICAgICAgICAgICAgICAgIHJlYWxfYXJyb3dfcmVjdC53aWR0aCwgcmVhbF9hcnJvd19yZWN0
LmhlaWdodCk7Ci0KLQotICAgIC8qIElmIHRoZXJlIGlzIG5vIHNlcGFyYXRvciBpbiB0aGUgdGhl
bWUsIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvLiAqLwotICAgIGlmICghZ1BhcnRzLT5jb21i
b0JveFNlcGFyYXRvcldpZGdldCkKLSAgICAgICAgcmV0dXJuIE1PWl9HVEtfU1VDQ0VTUzsKLQot
ICAgIHN0eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUoZ1BhcnRzLT5jb21ib0JveFNlcGFyYXRv
cldpZGdldCk7Ci0KLSAgICBndGtfd2lkZ2V0X3N0eWxlX2dldChnUGFydHMtPmNvbWJvQm94U2Vw
YXJhdG9yV2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWRlLXNlcGFyYXRvcnMi
LCAmd2lkZV9zZXBhcmF0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3It
d2lkdGgiLCAmc2VwYXJhdG9yX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwp
OwotCi0gICAgaWYgKHdpZGVfc2VwYXJhdG9ycykgewotICAgICAgICBpZiAoZGlyZWN0aW9uID09
IEdUS19URVhUX0RJUl9MVFIpCi0gICAgICAgICAgICBhcnJvd19yZWN0LnggLT0gc2VwYXJhdG9y
X3dpZHRoOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhcnJvd19yZWN0LnggKz0gYXJyb3df
cmVjdC53aWR0aDsKLQotICAgICAgICBndGtfcGFpbnRfYm94KHN0eWxlLCBjciwKLSAgICAgICAg
ICAgICAgICAgICAgICBHVEtfU1RBVEVfTk9STUFMLCBHVEtfU0hBRE9XX0VUQ0hFRF9PVVQsCi0g
ICAgICAgICAgICAgICAgICAgICAgZ1BhcnRzLT5jb21ib0JveFNlcGFyYXRvcldpZGdldCwgInZz
ZXBhcmF0b3IiLAotICAgICAgICAgICAgICAgICAgICAgIGFycm93X3JlY3QueCwgYXJyb3dfcmVj
dC55LAotICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvcl93aWR0aCwgYXJyb3dfcmVjdC5o
ZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChkaXJlY3Rpb24gPT0gR1RLX1RFWFRf
RElSX0xUUikKLSAgICAgICAgICAgIGFycm93X3JlY3QueCAtPSBYVEhJQ0tORVNTKHN0eWxlKTsK
LSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXJyb3dfcmVjdC54ICs9IGFycm93X3JlY3Qud2lk
dGg7Ci0KLSAgICAgICAgZ3RrX3BhaW50X3ZsaW5lKHN0eWxlLCBjciwgR1RLX1NUQVRFX05PUk1B
TCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGdQYXJ0cy0+Y29tYm9Cb3hTZXBhcmF0b3JXaWRn
ZXQsICJ2c2VwYXJhdG9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFycm93X3JlY3QueSwg
YXJyb3dfcmVjdC55ICsgYXJyb3dfcmVjdC5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAg
ICBhcnJvd19yZWN0LngpOwotICAgIH0KLQotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19
Ci0KLXN0YXRpYyBnaW50Ci1tb3pfZ3RrX3Byb2dyZXNzYmFyX3BhaW50KGNhaXJvX3QqIGNyLCBH
ZGtSZWN0YW5nbGUqIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEd0a1RleHREaXJl
Y3Rpb24gZGlyZWN0aW9uKQotewotICAgIEd0a1N0eWxlKiBzdHlsZTsKLQotICAgIGVuc3VyZV9w
cm9ncmVzc193aWRnZXQoKTsKLSAgICBndGtfd2lkZ2V0X3NldF9kaXJlY3Rpb24oZ1BhcnRzLT5w
cm9ncmVzV2lkZ2V0LCBkaXJlY3Rpb24pOwotCi0gICAgc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9z
dHlsZShnUGFydHMtPnByb2dyZXNXaWRnZXQpOwotCi0gICAgZ3RrX3BhaW50X2JveChzdHlsZSwg
Y3IsIEdUS19TVEFURV9OT1JNQUwsIEdUS19TSEFET1dfSU4sCi0gICAgICAgICAgICAgICAgICBn
UGFydHMtPnByb2dyZXNXaWRnZXQsICJ0cm91Z2giLCByZWN0LT54LCByZWN0LT55LAotICAgICAg
ICAgICAgICAgICAgcmVjdC0+d2lkdGgsIHJlY3QtPmhlaWdodCk7Ci0KLSAgICByZXR1cm4gTU9a
X0dUS19TVUNDRVNTOwotfQotCi1zdGF0aWMgZ2ludAotbW96X2d0a19wcm9ncmVzc19jaHVua19w
YWludChjYWlyb190KiBjciwgR2RrUmVjdGFuZ2xlKiByZWN0LAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBHdGtUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLSAgICBHdGtTdHlsZSog
c3R5bGU7Ci0KLSAgICBlbnN1cmVfcHJvZ3Jlc3Nfd2lkZ2V0KCk7Ci0gICAgZ3RrX3dpZGdldF9z
ZXRfZGlyZWN0aW9uKGdQYXJ0cy0+cHJvZ3Jlc1dpZGdldCwgZGlyZWN0aW9uKTsKLQotICAgIHN0
eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUoZ1BhcnRzLT5wcm9ncmVzV2lkZ2V0KTsKLQotICAg
IGd0a19wYWludF9ib3goc3R5bGUsIGNyLCBHVEtfU1RBVEVfUFJFTElHSFQsIEdUS19TSEFET1df
T1VULAotICAgICAgICAgICAgICAgICAgZ1BhcnRzLT5wcm9ncmVzV2lkZ2V0LCAiYmFyIiwgcmVj
dC0+eCwgcmVjdC0+eSwKLSAgICAgICAgICAgICAgICAgIHJlY3QtPndpZHRoLCByZWN0LT5oZWln
aHQpOwotCi0gICAgcmV0dXJuIE1PWl9HVEtfU1VDQ0VTUzsKLX0KLQotZ2ludAotbW96X2d0a19n
ZXRfd2lkZ2V0X2JvcmRlcihHdGtUaGVtZVdpZGdldFR5cGUgd2lkZ2V0LCBnaW50KiBsZWZ0LCBn
aW50KiB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdpbnQqIHJpZ2h0LCBnaW50KiBi
b3R0b20sIEd0a1RleHREaXJlY3Rpb24gZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICBnYm9vbGVhbiBpbmh0bWwpCi17Ci0gICAgR3RrV2lkZ2V0KiB3OwotICAgIEd0a1N0eWxl
ICpzdHlsZTsKLQotICAgIHN3aXRjaCAod2lkZ2V0KSB7Ci0gICAgY2FzZSBNT1pfR1RLX0JVVFRP
TjoKLSAgICAgICAgewotICAgICAgICAgICAgR3RrQm9yZGVyIGlubmVyX2JvcmRlcjsKLSAgICAg
ICAgICAgIGdib29sZWFuIGludGVyaW9yX2ZvY3VzOwotICAgICAgICAgICAgZ2ludCBmb2N1c193
aWR0aCwgZm9jdXNfcGFkOwotICAgICAgICAgICAgR3RrU3R5bGUgKnN0eWxlOwotCi0gICAgICAg
ICAgICBlbnN1cmVfYnV0dG9uX3dpZGdldCgpOwotICAgICAgICAgICAgKmxlZnQgPSAqdG9wID0g
KnJpZ2h0ID0gKmJvdHRvbSA9IGd0a19jb250YWluZXJfZ2V0X2JvcmRlcl93aWR0aChHVEtfQ09O
VEFJTkVSKGdQYXJ0cy0+YnV0dG9uV2lkZ2V0KSk7Ci0KLSAgICAgICAgICAgIC8qIERvbid0IGFk
ZCB0aGlzIHBhZGRpbmcgaW4gSFRNTCwgb3RoZXJ3aXNlIHRoZSBidXR0b25zIHdpbGwKLSAgICAg
ICAgICAgICAgIGJlY29tZSB0b28gYmlnIGFuZCBzdHVmZiB0aGUgbGF5b3V0LiAqLwotICAgICAg
ICAgICAgaWYgKCFpbmh0bWwpIHsKLSAgICAgICAgICAgICAgICBtb3pfZ3RrX3dpZGdldF9nZXRf
Zm9jdXMoZ1BhcnRzLT5idXR0b25XaWRnZXQsICZpbnRlcmlvcl9mb2N1cywgJmZvY3VzX3dpZHRo
LCAmZm9jdXNfcGFkKTsKLSAgICAgICAgICAgICAgICBtb3pfZ3RrX2J1dHRvbl9nZXRfaW5uZXJf
Ym9yZGVyKGdQYXJ0cy0+YnV0dG9uV2lkZ2V0LCAmaW5uZXJfYm9yZGVyKTsKLSAgICAgICAgICAg
ICAgICAqbGVmdCArPSBmb2N1c193aWR0aCArIGZvY3VzX3BhZCArIGlubmVyX2JvcmRlci5sZWZ0
OwotICAgICAgICAgICAgICAgICpyaWdodCArPSBmb2N1c193aWR0aCArIGZvY3VzX3BhZCArIGlu
bmVyX2JvcmRlci5yaWdodDsKLSAgICAgICAgICAgICAgICAqdG9wICs9IGZvY3VzX3dpZHRoICsg
Zm9jdXNfcGFkICsgaW5uZXJfYm9yZGVyLnRvcDsKLSAgICAgICAgICAgICAgICAqYm90dG9tICs9
IGZvY3VzX3dpZHRoICsgZm9jdXNfcGFkICsgaW5uZXJfYm9yZGVyLmJvdHRvbTsKLSAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZShnUGFydHMt
PmJ1dHRvbldpZGdldCk7Ci0gICAgICAgICAgICAqbGVmdCArPSBzdHlsZS0+eHRoaWNrbmVzczsK
LSAgICAgICAgICAgICpyaWdodCArPSBzdHlsZS0+eHRoaWNrbmVzczsKLSAgICAgICAgICAgICp0
b3AgKz0gc3R5bGUtPnl0aGlja25lc3M7Ci0gICAgICAgICAgICAqYm90dG9tICs9IHN0eWxlLT55
dGhpY2tuZXNzOwotICAgICAgICAgICAgcmV0dXJuIE1PWl9HVEtfU1VDQ0VTUzsKLSAgICAgICAg
fQotICAgIGNhc2UgTU9aX0dUS19FTlRSWToKLSAgICAgICAgZW5zdXJlX2VudHJ5X3dpZGdldCgp
OwotICAgICAgICB3ID0gZ1BhcnRzLT5lbnRyeVdpZGdldDsKLSAgICAgICAgYnJlYWs7Ci0gICAg
Y2FzZSBNT1pfR1RLX0RST1BET1dOOgotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBXZSBuZWVk
IHRvIGFjY291bnQgZm9yIHRoZSBhcnJvdyBvbiB0aGUgZHJvcGRvd24sIHNvIHRleHQKLSAgICAg
ICAgICAgICAqIGRvZXNuJ3QgY29tZSB0b28gY2xvc2UgdG8gdGhlIGFycm93LCBvciBpbiBzb21l
IGNhc2VzIHNwaWxsCi0gICAgICAgICAgICAgKiBpbnRvIHRoZSBhcnJvdy4gKi8KLSAgICAgICAg
ICAgIGdib29sZWFuIGlnbm9yZWRfaW50ZXJpb3JfZm9jdXMsIHdpZGVfc2VwYXJhdG9yczsKLSAg
ICAgICAgICAgIGdpbnQgZm9jdXNfd2lkdGgsIGZvY3VzX3BhZCwgc2VwYXJhdG9yX3dpZHRoOwot
ICAgICAgICAgICAgR3RrUmVxdWlzaXRpb24gYXJyb3dfcmVxOwotICAgICAgICAgICAgR3RrU3R5
bGUqIHN0eWxlOwotCi0gICAgICAgICAgICBlbnN1cmVfY29tYm9fYm94X3dpZGdldHMoKTsKLQot
ICAgICAgICAgICAgKmxlZnQgPSBndGtfY29udGFpbmVyX2dldF9ib3JkZXJfd2lkdGgoR1RLX0NP
TlRBSU5FUihnUGFydHMtPmNvbWJvQm94QnV0dG9uV2lkZ2V0KSk7Ci0KLSAgICAgICAgICAgIGlm
ICghaW5odG1sKSB7Ci0gICAgICAgICAgICAgICAgbW96X2d0a193aWRnZXRfZ2V0X2ZvY3VzKGdQ
YXJ0cy0+Y29tYm9Cb3hCdXR0b25XaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICZpZ25vcmVkX2ludGVyaW9yX2ZvY3VzLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAmZm9jdXNfd2lkdGgsICZmb2N1c19wYWQpOwotICAgICAg
ICAgICAgICAgICpsZWZ0ICs9IGZvY3VzX3dpZHRoICsgZm9jdXNfcGFkOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICBzdHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKGdQYXJ0cy0+Y29t
Ym9Cb3hCdXR0b25XaWRnZXQpOwotICAgICAgICAgICAgKnRvcCA9ICpsZWZ0ICsgc3R5bGUtPnl0
aGlja25lc3M7Ci0gICAgICAgICAgICAqbGVmdCArPSBzdHlsZS0+eHRoaWNrbmVzczsKLQotICAg
ICAgICAgICAgKnJpZ2h0ID0gKmxlZnQ7ICpib3R0b20gPSAqdG9wOwotCi0gICAgICAgICAgICAv
KiBJZiB0aGVyZSBpcyBubyBzZXBhcmF0b3IsIGRvbid0IHRyeSB0byBjb3VudCBpdHMgd2lkdGgu
ICovCi0gICAgICAgICAgICBzZXBhcmF0b3Jfd2lkdGggPSAwOwotICAgICAgICAgICAgaWYgKGdQ
YXJ0cy0+Y29tYm9Cb3hTZXBhcmF0b3JXaWRnZXQpIHsKLSAgICAgICAgICAgICAgICBndGtfd2lk
Z2V0X3N0eWxlX2dldChnUGFydHMtPmNvbWJvQm94U2VwYXJhdG9yV2lkZ2V0LAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWRlLXNlcGFyYXRvcnMiLCAmd2lkZV9zZXBh
cmF0b3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3It
d2lkdGgiLCAmc2VwYXJhdG9yX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIE5VTEwpOwotCi0gICAgICAgICAgICAgICAgaWYgKCF3aWRlX3NlcGFyYXRvcnMpCi0g
ICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvcl93aWR0aCA9Ci0gICAgICAgICAgICAgICAgICAg
ICAgICBYVEhJQ0tORVNTKHN0eWxlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZ3Rr
X3dpZGdldF9nZXRfcHJlZmVycmVkX3NpemUoZ1BhcnRzLT5jb21ib0JveEFycm93V2lkZ2V0LCAm
YXJyb3dfcmVxLCBOVUxMKTsKLSAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gR1RLX1RFWFRf
RElSX1JUTCkKLSAgICAgICAgICAgICAgICAqbGVmdCArPSBzZXBhcmF0b3Jfd2lkdGggKyBhcnJv
d19yZXEud2lkdGg7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgKnJpZ2h0ICs9
IHNlcGFyYXRvcl93aWR0aCArIGFycm93X3JlcS53aWR0aDsKLQotICAgICAgICAgICAgcmV0dXJu
IE1PWl9HVEtfU1VDQ0VTUzsKLSAgICAgICAgfQotICAgIGNhc2UgTU9aX0dUS19QUk9HUkVTU0JB
UjoKLSAgICAgICAgZW5zdXJlX3Byb2dyZXNzX3dpZGdldCgpOwotICAgICAgICB3ID0gZ1BhcnRz
LT5wcm9ncmVzV2lkZ2V0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1PWl9HVEtfU0NBTEVf
SE9SSVpPTlRBTDoKLSAgICAgICAgZW5zdXJlX3NjYWxlX3dpZGdldCgpOwotICAgICAgICB3ID0g
Z1BhcnRzLT5oU2NhbGVXaWRnZXQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9aX0dUS19T
Q0FMRV9WRVJUSUNBTDoKLSAgICAgICAgZW5zdXJlX3NjYWxlX3dpZGdldCgpOwotICAgICAgICB3
ID0gZ1BhcnRzLT52U2NhbGVXaWRnZXQ7Ci0gICAgICAgIGJyZWFrOwotICAgIC8qIFRoZXNlIHdp
ZGdldHMgaGF2ZSBubyBib3JkZXJzLCBzaW5jZSB0aGV5IGFyZSBub3QgY29udGFpbmVycy4gKi8K
LSAgICBjYXNlIE1PWl9HVEtfQ0hFQ0tCVVRUT046Ci0gICAgY2FzZSBNT1pfR1RLX1JBRElPQlVU
VE9OOgotICAgIGNhc2UgTU9aX0dUS19TQ1JPTExCQVJfQlVUVE9OOgotICAgIGNhc2UgTU9aX0dU
S19TQ1JPTExCQVJfVFJBQ0tfSE9SSVpPTlRBTDoKLSAgICBjYXNlIE1PWl9HVEtfU0NST0xMQkFS
X1RSQUNLX1ZFUlRJQ0FMOgotICAgIGNhc2UgTU9aX0dUS19TQ1JPTExCQVJfVEhVTUJfSE9SSVpP
TlRBTDoKLSAgICBjYXNlIE1PWl9HVEtfU0NST0xMQkFSX1RIVU1CX1ZFUlRJQ0FMOgotICAgIGNh
c2UgTU9aX0dUS19TQ0FMRV9USFVNQl9IT1JJWk9OVEFMOgotICAgIGNhc2UgTU9aX0dUS19TQ0FM
RV9USFVNQl9WRVJUSUNBTDoKLSAgICBjYXNlIE1PWl9HVEtfUFJPR1JFU1NfQ0hVTks6Ci0gICAg
ICAgICpsZWZ0ID0gKnRvcCA9ICpyaWdodCA9ICpib3R0b20gPSAwOwotICAgICAgICByZXR1cm4g
TU9aX0dUS19TVUNDRVNTOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGdfd2FybmluZygiVW5zdXBw
b3J0ZWQgd2lkZ2V0IHR5cGU6ICVkIiwgd2lkZ2V0KTsKLSAgICAgICAgcmV0dXJuIE1PWl9HVEtf
VU5LTk9XTl9XSURHRVQ7Ci0gICAgfQotCi0gICAgc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHls
ZSh3KTsKLSAgICAqcmlnaHQgPSAqbGVmdCA9IFhUSElDS05FU1Moc3R5bGUpOwotICAgICpib3R0
b20gPSAqdG9wID0gWVRISUNLTkVTUyhzdHlsZSk7Ci0KLSAgICByZXR1cm4gTU9aX0dUS19TVUND
RVNTOwotfQotCi1naW50Ci1tb3pfZ3RrX2dldF9zY2FsZXRodW1iX21ldHJpY3MoR3RrT3JpZW50
YXRpb24gb3JpZW50LCBnaW50KiB0aHVtYl9sZW5ndGgsIGdpbnQqIHRodW1iX2hlaWdodCkKLXsK
LSAgR3RrV2lkZ2V0KiB3aWRnZXQ7Ci0KLSAgZW5zdXJlX3NjYWxlX3dpZGdldCgpOwotICB3aWRn
ZXQgPSAoKG9yaWVudCA9PSBHVEtfT1JJRU5UQVRJT05fSE9SSVpPTlRBTCkgPyBnUGFydHMtPmhT
Y2FsZVdpZGdldCA6IGdQYXJ0cy0+dlNjYWxlV2lkZ2V0KTsKLQotICBndGtfd2lkZ2V0X3N0eWxl
X2dldCAod2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgInNsaWRlcl9sZW5ndGgiLCB0
aHVtYl9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAic2xpZGVyX3dpZHRoIiwgdGh1
bWJfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgcmV0dXJuIE1P
Wl9HVEtfU1VDQ0VTUzsKLX0KLQotZ2ludAotbW96X2d0a19nZXRfc2Nyb2xsYmFyX21ldHJpY3Mo
TW96R3RrU2Nyb2xsYmFyTWV0cmljcyAqbWV0cmljcykKLXsKLSAgICBlbnN1cmVfc2Nyb2xsYmFy
X3dpZGdldCgpOwotCi0gICAgZ3RrX3dpZGdldF9zdHlsZV9nZXQgKGdQYXJ0cy0+aG9yaXpTY3Jv
bGxiYXJXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJzbGlkZXJfd2lkdGgiLCAm
bWV0cmljcy0+c2xpZGVyX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAidHJvdWdo
X2JvcmRlciIsICZtZXRyaWNzLT50cm91Z2hfYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAic3RlcHBlcl9zaXplIiwgJm1ldHJpY3MtPnN0ZXBwZXJfc2l6ZSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgInN0ZXBwZXJfc3BhY2luZyIsICZtZXRyaWNzLT5zdGVwcGVyX3NwYWNp
bmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJ0cm91Z2hfdW5kZXJfc3RlcHBlcnMiLCAm
bWV0cmljcy0+dHJvdWdoX3VuZGVyX3N0ZXBwZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAiaGFzX3NlY29uZGFyeV9mb3J3YXJkX3N0ZXBwZXIiLCAmbWV0cmljcy0+aGFzX3NlY29uZGFy
eV9mb3J3YXJkX3N0ZXBwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJoYXNfc2Vjb25k
YXJ5X2JhY2t3YXJkX3N0ZXBwZXIiLCAmbWV0cmljcy0+aGFzX3NlY29uZGFyeV9iYWNrd2FyZF9z
dGVwcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLQotICAgIG1ldHJpY3Mt
Pm1pbl9zbGlkZXJfc2l6ZSA9IGd0a19yYW5nZV9nZXRfbWluX3NsaWRlcl9zaXplKEdUS19SQU5H
RShnUGFydHMtPmhvcml6U2Nyb2xsYmFyV2lkZ2V0KSk7Ci0KLSAgICByZXR1cm4gTU9aX0dUS19T
VUNDRVNTOwotfQotCi1naW50Ci1tb3pfZ3RrX3dpZGdldF9wYWludChHdGtUaGVtZVdpZGdldFR5
cGUgd2lkZ2V0LCBjYWlyb190KiBjciwKLSAgICAgICAgICAgICAgICAgICAgIEdka1JlY3Rhbmds
ZSogcmVjdCwgR3RrV2lkZ2V0U3RhdGUqIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgZ2lu
dCBmbGFncywgR3RrVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0gICAgc3dpdGNoICh3aWRn
ZXQpIHsKLSAgICBjYXNlIE1PWl9HVEtfQlVUVE9OOgotICAgICAgICBpZiAoc3RhdGUtPmRlcHJl
c3NlZCkgewotICAgICAgICAgICAgZW5zdXJlX3RvZ2dsZV9idXR0b25fd2lkZ2V0KCk7Ci0gICAg
ICAgICAgICByZXR1cm4gbW96X2d0a19idXR0b25fcGFpbnQoY3IsIHJlY3QsIHN0YXRlLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHdGtSZWxpZWZTdHlsZSkgZmxh
Z3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ1BhcnRzLT50b2dn
bGVCdXR0b25XaWRnZXQsIGRpcmVjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgZW5zdXJlX2J1
dHRvbl93aWRnZXQoKTsKLSAgICAgICAgcmV0dXJuIG1vel9ndGtfYnV0dG9uX3BhaW50KGNyLCBy
ZWN0LCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHdGtSZWxp
ZWZTdHlsZSkgZmxhZ3MsIGdQYXJ0cy0+YnV0dG9uV2lkZ2V0LAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBN
T1pfR1RLX0NIRUNLQlVUVE9OOgotICAgIGNhc2UgTU9aX0dUS19SQURJT0JVVFRPTjoKLSAgICAg
ICAgcmV0dXJuIG1vel9ndGtfdG9nZ2xlX3BhaW50KGNyLCByZWN0LCBzdGF0ZSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKGZsYWdzICYgTU9aX0dUS19XSURHRVRfQ0hF
Q0tFRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIShmbGFncyAmIE1P
Wl9HVEtfV0lER0VUX0lOQ09OU0lTVEVOVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAod2lkZ2V0ID09IE1PWl9HVEtfUkFESU9CVVRUT04pLAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2Fz
ZSBNT1pfR1RLX1NDUk9MTEJBUl9CVVRUT046Ci0gICAgICAgIHJldHVybiBtb3pfZ3RrX3Njcm9s
bGJhcl9idXR0b25fcGFpbnQoY3IsIHJlY3QsIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIChHdGtTY3JvbGxiYXJCdXR0b25GbGFncykgZmxhZ3Ms
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9u
KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT1pfR1RLX1NDUk9MTEJBUl9UUkFDS19IT1JJ
Wk9OVEFMOgotICAgIGNhc2UgTU9aX0dUS19TQ1JPTExCQVJfVFJBQ0tfVkVSVElDQUw6Ci0gICAg
ICAgIHJldHVybiBtb3pfZ3RrX3Njcm9sbGJhcl90cm91Z2hfcGFpbnQod2lkZ2V0LCBjciwgcmVj
dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwg
ZGlyZWN0aW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT1pfR1RLX1NDUk9MTEJBUl9U
SFVNQl9IT1JJWk9OVEFMOgotICAgIGNhc2UgTU9aX0dUS19TQ1JPTExCQVJfVEhVTUJfVkVSVElD
QUw6Ci0gICAgICAgIHJldHVybiBtb3pfZ3RrX3Njcm9sbGJhcl90aHVtYl9wYWludCh3aWRnZXQs
IGNyLCByZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
c3RhdGUsIGRpcmVjdGlvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9aX0dUS19TQ1JP
TExFRF9XSU5ET1c6Ci0gICAgICAgIHJldHVybiBtb3pfZ3RrX3Njcm9sbGVkX3dpbmRvd19wYWlu
dChjciwgcmVjdCwgc3RhdGUpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1PWl9HVEtfU0NB
TEVfSE9SSVpPTlRBTDoKLSAgICBjYXNlIE1PWl9HVEtfU0NBTEVfVkVSVElDQUw6Ci0gICAgICAg
IHJldHVybiBtb3pfZ3RrX3NjYWxlX3BhaW50KGNyLCByZWN0LCBzdGF0ZSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgKEd0a09yaWVudGF0aW9uKSBmbGFncywgZGlyZWN0aW9u
KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT1pfR1RLX1NDQUxFX1RIVU1CX0hPUklaT05U
QUw6Ci0gICAgY2FzZSBNT1pfR1RLX1NDQUxFX1RIVU1CX1ZFUlRJQ0FMOgotICAgICAgICByZXR1
cm4gbW96X2d0a19zY2FsZV90aHVtYl9wYWludChjciwgcmVjdCwgc3RhdGUsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHdGtPcmllbnRhdGlvbikgZmxhZ3MsIGRp
cmVjdGlvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9aX0dUS19FTlRSWToKLSAgICAg
ICAgZW5zdXJlX2VudHJ5X3dpZGdldCgpOwotICAgICAgICByZXR1cm4gbW96X2d0a19lbnRyeV9w
YWludChjciwgcmVjdCwgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGdQYXJ0cy0+ZW50cnlXaWRnZXQsIGRpcmVjdGlvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNh
c2UgTU9aX0dUS19EUk9QRE9XTjoKLSAgICAgICAgcmV0dXJuIG1vel9ndGtfY29tYm9fYm94X3Bh
aW50KGNyLCByZWN0LCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIChnYm9vbGVhbikgZmxhZ3MsIGRpcmVjdGlvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNh
c2UgTU9aX0dUS19QUk9HUkVTU0JBUjoKLSAgICAgICAgcmV0dXJuIG1vel9ndGtfcHJvZ3Jlc3Ni
YXJfcGFpbnQoY3IsIHJlY3QsIGRpcmVjdGlvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2Ug
TU9aX0dUS19QUk9HUkVTU19DSFVOSzoKLSAgICAgICAgcmV0dXJuIG1vel9ndGtfcHJvZ3Jlc3Nf
Y2h1bmtfcGFpbnQoY3IsIHJlY3QsIGRpcmVjdGlvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGRl
ZmF1bHQ6Ci0gICAgICAgIGdfd2FybmluZygiVW5rbm93biB3aWRnZXQgdHlwZTogJWQiLCB3aWRn
ZXQpOwotICAgIH0KLQotICAgIHJldHVybiBNT1pfR1RLX1VOS05PV05fV0lER0VUOwotfQotCi1H
dGtXaWRnZXQqIG1vel9ndGtfZ2V0X3Njcm9sbGJhcl93aWRnZXQodm9pZCkKLXsKLSAgICBpZiAo
IWlzX2luaXRpYWxpemVkKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBlbnN1cmVfc2Nyb2xs
YmFyX3dpZGdldCgpOwotICAgIHJldHVybiBnUGFydHMtPmhvcml6U2Nyb2xsYmFyV2lkZ2V0Owot
fQotCi1naW50Ci1tb3pfZ3RrX3NodXRkb3duKCkKLXsKLSAgICBHdGtXaWRnZXRDbGFzcyAqZW50
cnlfY2xhc3M7Ci0gICAgZW50cnlfY2xhc3MgPSBnX3R5cGVfY2xhc3NfcGVlayhHVEtfVFlQRV9F
TlRSWSk7Ci0gICAgZ190eXBlX2NsYXNzX3VucmVmKGVudHJ5X2NsYXNzKTsKLQotICAgIGlzX2lu
aXRpYWxpemVkID0gRkFMU0U7Ci0KLSAgICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwotfQotCi12
b2lkIG1vel9ndGtfZGVzdHJveV90aGVtZV9wYXJ0c193aWRnZXRzKEd0a1RoZW1lUGFydHMqIHBh
cnRzKQotewotICAgIGlmICghcGFydHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChwYXJ0
cy0+cHJvdG9XaW5kb3cpIHsKLSAgICAgICAgZ3RrX3dpZGdldF9kZXN0cm95KHBhcnRzLT5wcm90
b1dpbmRvdyk7Ci0gICAgICAgIHBhcnRzLT5wcm90b1dpbmRvdyA9IE5VTEw7Ci0gICAgfQotfQot
Ci1HdGtXaWRnZXQqIG1vel9ndGtfZ2V0X3Byb2dyZXNzX3dpZGdldCgpCi17Ci0gICAgaWYgKCFp
c19pbml0aWFsaXplZCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgZW5zdXJlX3Byb2dyZXNz
X3dpZGdldCgpOwotICAgIHJldHVybiBnUGFydHMtPnByb2dyZXNXaWRnZXQ7Ci19Ci0KLSNlbmRp
ZiAvLyBHVEtfQVBJX1ZFUlNJT05fMgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsv
Z3RrZHJhd2luZy5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvZ3RrZHJhd2luZy5oCmluZGV4IGE5
ODE1NDMuLmI4ZmFkY2IgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL2d0a2RyYXdp
bmcuaAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9ndGtkcmF3aW5nLmgKQEAgLTM2LDYgKzM2
LDcgQEAKICAqCiAgKiAqKioqKiBFTkQgTElDRU5TRSBCTE9DSyAqKioqKiAqLwogCisjaWZkZWYg
R1RLX0FQSV9WRVJTSU9OXzIKIC8qKgogICogZ3RrZHJhd2luZy5oOiBHVEsgd2lkZ2V0IHJlbmRl
cmluZyB1dGlsaXRpZXMKICAqCkBAIC04MSw5ICs4Miw4IEBAIHR5cGVkZWYgc3RydWN0IHsKIH0g
TW96R3RrU2Nyb2xsYmFyTWV0cmljczsKIAogdHlwZWRlZiBzdHJ1Y3QgX0d0a1RoZW1lUGFydHMg
ewotI2lmZGVmIEdUS19BUElfVkVSU0lPTl8yCiAgICAgR2RrQ29sb3JtYXAqIGNvbG9ybWFwOwot
I2VuZGlmIC8vIEdUS19BUElfVkVSU0lPTl8yCisgICAgZ2Jvb2xlYW4gaGF2ZVJHQkFDb2xvcm1h
cDsKICAgICBHdGtXaWRnZXQqIHByb3RvV2luZG93OwogICAgIEd0a1dpZGdldCogcHJvdG9MYXlv
dXQ7CiAgICAgR3RrV2lkZ2V0KiBidXR0b25XaWRnZXQ7CkBAIC0xODEsNiArMTgxLDEyIEBAIHZv
aWQKIG1vel9ndGtfdXNlX3RoZW1lX3BhcnRzKEd0a1RoZW1lUGFydHMqIHBhcnRzKTsKIAogLyoq
CisgKiBSdHVybnMgdGhlIEd0a1RoZW1lUGFydHMKKyAqLworR3RrVGhlbWVQYXJ0cyoKK21vel9n
dGtfZ2V0X3RoZW1lX3BhcnRzKHZvaWQpOworCisvKioKICAqIEVuYWJsZSBHVEsrIDEuMi45KyB0
aGVtZSBlbmhhbmNlbWVudHMuIFlvdSBtdXN0IHByb3ZpZGUgYSBwb2ludGVyCiAgKiB0byB0aGUg
R1RLKyAxLjIuOSsgZnVuY3Rpb24gImd0a19zdHlsZV9nZXRfcHJvcF9leHBlcmltZW50YWwiLgog
ICogc3R5bGVHZXRQcm9wOiAgcG9pbnRlciB0byBndGtfc3R5bGVfZ2V0X3Byb3BfZXhwZXJpbWVu
dGFsCkBAIC0yMTMsMTggKzIxOSwxMSBAQCB2b2lkIG1vel9ndGtfZGVzdHJveV90aGVtZV9wYXJ0
c193aWRnZXRzKEd0a1RoZW1lUGFydHMqIHBhcnRzKTsKICAqIGZsYWdzOiAgICAgd2lkZ2V0LWRl
cGVuZGFudCBmbGFnczsgc2VlIHRoZSBHdGtUaGVtZVdpZGdldFR5cGUgZGVmaW5pdGlvbi4KICAq
IGRpcmVjdGlvbjogdGhlIHRleHQgZGlyZWN0aW9uLCB0byBkcmF3IHRoZSB3aWRnZXQgY29ycmVj
dGx5IExUUiBhbmQgUlRMLgogICovCi0jaWZkZWYgR1RLX0FQSV9WRVJTSU9OXzIKIGdpbnQKIG1v
el9ndGtfd2lkZ2V0X3BhaW50KEd0a1RoZW1lV2lkZ2V0VHlwZSB3aWRnZXQsIEdka0RyYXdhYmxl
KiBkcmF3YWJsZSwKICAgICAgICAgICAgICAgICAgICAgIEdka1JlY3RhbmdsZSogcmVjdCwgR2Rr
UmVjdGFuZ2xlKiBjbGlwcmVjdCwKICAgICAgICAgICAgICAgICAgICAgIEd0a1dpZGdldFN0YXRl
KiBzdGF0ZSwgZ2ludCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgIEd0a1RleHREaXJlY3Rp
b24gZGlyZWN0aW9uKTsKLSNlbHNlCi1naW50Ci1tb3pfZ3RrX3dpZGdldF9wYWludChHdGtUaGVt
ZVdpZGdldFR5cGUgd2lkZ2V0LCBjYWlyb190KiBjciwKLSAgICAgICAgICAgICAgICAgICAgIEdk
a1JlY3RhbmdsZSogcmVjdCwgR3RrV2lkZ2V0U3RhdGUqIHN0YXRlLAotICAgICAgICAgICAgICAg
ICAgICAgZ2ludCBmbGFncywgR3RrVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pOwotI2VuZGlmCiAK
IC8qKiogV2lkZ2V0IG1ldHJpY3MgKioqLwogLyoqCkBAIC0zMTMsMyArMzEyLDUgQEAgR3RrV2lk
Z2V0KiBtb3pfZ3RrX2dldF9wcm9ncmVzc193aWRnZXQodm9pZCk7CiAjZW5kaWYgLyogX19jcGx1
c3BsdXMgKi8KIAogI2VuZGlmCisKKyNlbmRpZiAvLyBHVEtfQVBJX1ZFUlNJT05fMgpkaWZmIC0t
Z2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCmluZGV4IGY3M2MyZTguLjZlNjRjM2Mg
MTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysgYi9jb25maWd1cmUuYWMKQEAgLTE5OSw3ICsx
OTksNyBAQCBjYXNlICIkd2l0aF9ndGsiIGluCiAgICAgICAgICAgR0FJTF9QQ19OQU1FPWdhaWwK
ICAgICAgICAgICBHQUlMX1JFUVVJUkVEX1ZFUlNJT049MS44CiAgICAgICAgICAgOzsKLSAgICAg
My4wKSBHVEtfUkVRVUlSRURfVkVSU0lPTj0yLjkxCisgICAgIDMuMCkgR1RLX1JFUVVJUkVEX1ZF
UlNJT049Mi45MS42CiAgICAgICAgICAgR1RLX0FQSV9WRVJTSU9OPTMuMAogICAgICAgICAgIFdF
QktJVEdUS19BUElfTUFKT1JfVkVSU0lPTj0zCiAgICAgICAgICAgV0VCS0lUR1RLX0FQSV9NSU5P
Ul9WRVJTSU9OPTAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76518</attachid>
            <date>2010-12-14 01:57:38 -0800</date>
            <delta_ts>2010-12-14 01:57:38 -0800</delta_ts>
            <desc>Fork RenderThemeGtk and ScrollbarThemeGtk</desc>
            <filename>gtk-style-context-1.diff</filename>
            <type>text/plain</type>
            <size>64753</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrLmNwcCBiL1dl
YkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrLmNwcAppbmRleCA0ZGI4NTdkLi4zM2Jk
ODNlIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0ay5jcHAK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsuY3BwCkBAIC00MSw4ICs0
MSw2IEBACiAjaW5jbHVkZSAiU2Nyb2xsYmFyLmgiCiAjaW5jbHVkZSAiVGltZVJhbmdlcy5oIgog
I2luY2x1ZGUgIlVzZXJBZ2VudFN0eWxlU2hlZXRzLmgiCi0jaW5jbHVkZSAiV2lkZ2V0UmVuZGVy
aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgImd0a2RyYXdpbmcuaCIKICNpbmNsdWRlIDxnZGsvZ2Rr
Lmg+CiAjaW5jbHVkZSA8Z3RrL2d0ay5oPgogI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4K
QEAgLTU1LDE5ICs1Myw2IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdXNpbmcgbmFtZXNwYWNl
IEhUTUxOYW1lczsKIAotc3RhdGljIHZvaWQgcGFpbnRTdG9ja0ljb24oR3JhcGhpY3NDb250ZXh0
KiBjb250ZXh0LCBjb25zdCBJbnRQb2ludCYgaWNvblBvaW50LCBHdGtTdHlsZSogc3R5bGUsIGNv
bnN0IGNoYXIqIGljb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR3RrVGV4dERp
cmVjdGlvbiBkaXJlY3Rpb24sIEd0a1N0YXRlVHlwZSBzdGF0ZSwgR3RrSWNvblNpemUgaWNvblNp
emUpCi17Ci0gICAgR3RrSWNvblNldCogaWNvblNldCA9IGd0a19zdHlsZV9sb29rdXBfaWNvbl9z
ZXQoc3R5bGUsIGljb25OYW1lKTsKLSAgICBQbGF0Zm9ybVJlZlB0cjxHZGtQaXhidWY+IGljb24g
PSBhZG9wdFBsYXRmb3JtUmVmKGd0a19pY29uX3NldF9yZW5kZXJfaWNvbihpY29uU2V0LCBzdHls
ZSwgZGlyZWN0aW9uLCBzdGF0ZSwgaWNvblNpemUsIDAsIDApKTsKLQotICAgIGNhaXJvX3QqIGNy
ID0gY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0gICAg
Z2RrX2NhaXJvX3NldF9zb3VyY2VfcGl4YnVmKGNyLCBpY29uLmdldCgpLCBpY29uUG9pbnQueCgp
LCBpY29uUG9pbnQueSgpKTsKLSAgICBjYWlyb19wYWludChjcik7Ci0gICAgY2Fpcm9fcmVzdG9y
ZShjcik7Ci19Ci0KICNpZiBFTkFCTEUoVklERU8pCiBzdGF0aWMgSFRNTE1lZGlhRWxlbWVudCog
Z2V0TWVkaWFFbGVtZW50RnJvbVJlbmRlck9iamVjdChSZW5kZXJPYmplY3QqIG8pCiB7CkBAIC04
NywxNCArNzIsNiBAQCBzdGF0aWMgR3RrSWNvblNpemUgZ2V0TWVkaWFCdXR0b25JY29uU2l6ZShp
bnQgbWVkaWFJY29uU2l6ZSkKICAgICByZXR1cm4gaWNvblNpemU7CiB9CiAKLXZvaWQgUmVuZGVy
VGhlbWVHdGs6OmluaXRNZWRpYUNvbG9ycygpCi17Ci0gICAgR3RrU3R5bGUqIHN0eWxlID0gZ3Rr
X3dpZGdldF9nZXRfc3R5bGUoR1RLX1dJREdFVChndGtDb250YWluZXIoKSkpOwotICAgIG1fcGFu
ZWxDb2xvciA9IHN0eWxlLT5iZ1tHVEtfU1RBVEVfTk9STUFMXTsKLSAgICBtX3NsaWRlckNvbG9y
ID0gc3R5bGUtPmJnW0dUS19TVEFURV9BQ1RJVkVdOwotICAgIG1fc2xpZGVyVGh1bWJDb2xvciA9
IHN0eWxlLT5iZ1tHVEtfU1RBVEVfU0VMRUNURURdOwotfQotCiB2b2lkIFJlbmRlclRoZW1lR3Rr
Ojppbml0TWVkaWFCdXR0b25zKCkKIHsKICAgICBzdGF0aWMgYm9vbCBpY29uc0luaXRpYWxpemVk
ID0gZmFsc2U7CkBAIC0xMzMsNjkgKzExMCwxMyBAQCBQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBS
ZW5kZXJUaGVtZTo6dGhlbWVGb3JQYWdlKFBhZ2UqIHBhZ2UpCiAgICAgcmV0dXJuIHJ0OwogfQog
Ci1zdGF0aWMgaW50IG1vekd0a1JlZkNvdW50ID0gMDsKLQotUmVuZGVyVGhlbWVHdGs6OlJlbmRl
clRoZW1lR3RrKCkKLSAgICA6IG1fZ3RrV2luZG93KDApCi0gICAgLCBtX2d0a0NvbnRhaW5lcigw
KQotICAgICwgbV9ndGtCdXR0b24oMCkKLSAgICAsIG1fZ3RrRW50cnkoMCkKLSAgICAsIG1fZ3Rr
VHJlZVZpZXcoMCkKLSAgICAsIG1fcGFuZWxDb2xvcihDb2xvcjo6d2hpdGUpCi0gICAgLCBtX3Ns
aWRlckNvbG9yKENvbG9yOjp3aGl0ZSkKLSAgICAsIG1fc2xpZGVyVGh1bWJDb2xvcihDb2xvcjo6
d2hpdGUpCi0gICAgLCBtX21lZGlhSWNvblNpemUoMTYpCi0gICAgLCBtX21lZGlhU2xpZGVySGVp
Z2h0KDE0KQotICAgICwgbV9tZWRpYVNsaWRlclRodW1iV2lkdGgoMTIpCi0gICAgLCBtX21lZGlh
U2xpZGVyVGh1bWJIZWlnaHQoMTIpCi0jaWZkZWYgR1RLX0FQSV9WRVJTSU9OXzIKLSAgICAsIG1f
dGhlbWVQYXJ0c0hhdmVSR0JBQ29sb3JtYXAodHJ1ZSkKLSNlbmRpZgotewotCi0gICAgbWVtc2V0
KCZtX3RoZW1lUGFydHMsIDAsIHNpemVvZihHdGtUaGVtZVBhcnRzKSk7Ci0jaWZkZWYgR1RLX0FQ
SV9WRVJTSU9OXzIKLSAgICBHZGtDb2xvcm1hcCogY29sb3JtYXAgPSBnZGtfc2NyZWVuX2dldF9y
Z2JhX2NvbG9ybWFwKGdka19zY3JlZW5fZ2V0X2RlZmF1bHQoKSk7Ci0gICAgaWYgKCFjb2xvcm1h
cCkgewotICAgICAgICBtX3RoZW1lUGFydHNIYXZlUkdCQUNvbG9ybWFwID0gZmFsc2U7Ci0gICAg
ICAgIGNvbG9ybWFwID0gZ2RrX3NjcmVlbl9nZXRfZGVmYXVsdF9jb2xvcm1hcChnZGtfc2NyZWVu
X2dldF9kZWZhdWx0KCkpOwotICAgIH0KLSAgICBtX3RoZW1lUGFydHMuY29sb3JtYXAgPSBjb2xv
cm1hcDsKLSNlbmRpZgotCi0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgTW96aWxsYSB0aGVtZSBkcmF3
aW5nIGNvZGUuCi0gICAgaWYgKCFtb3pHdGtSZWZDb3VudCkgewotICAgICAgICBtb3pfZ3RrX2lu
aXQoKTsKLSAgICAgICAgbW96X2d0a191c2VfdGhlbWVfcGFydHMoJm1fdGhlbWVQYXJ0cyk7Ci0g
ICAgfQotICAgICsrbW96R3RrUmVmQ291bnQ7Ci0KLSNpZiBFTkFCTEUoVklERU8pCi0gICAgaW5p
dE1lZGlhQ29sb3JzKCk7Ci0gICAgaW5pdE1lZGlhQnV0dG9ucygpOwotI2VuZGlmCi19Ci0KLVJl
bmRlclRoZW1lR3RrOjp+UmVuZGVyVGhlbWVHdGsoKQorc3RhdGljIHZvaWQgcGFpbnRTdG9ja0lj
b24oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRQb2ludCYgaWNvblBvaW50LCBj
b25zdCBHZGtQaXhidWYqIGljb24pCiB7Ci0gICAgLS1tb3pHdGtSZWZDb3VudDsKLQotICAgIGlm
ICghbW96R3RrUmVmQ291bnQpCi0gICAgICAgIG1vel9ndGtfc2h1dGRvd24oKTsKLQotICAgIGd0
a193aWRnZXRfZGVzdHJveShtX2d0a1dpbmRvdyk7Ci19Ci0KLXZvaWQgUmVuZGVyVGhlbWVHdGs6
OmdldEluZGljYXRvck1ldHJpY3MoQ29udHJvbFBhcnQgcGFydCwgaW50JiBpbmRpY2F0b3JTaXpl
LCBpbnQmIGluZGljYXRvclNwYWNpbmcpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKHBhcnQgPT0gQ2hl
Y2tib3hQYXJ0IHx8IHBhcnQgPT0gUmFkaW9QYXJ0KTsKLSAgICBpZiAocGFydCA9PSBDaGVja2Jv
eFBhcnQpIHsKLSAgICAgICAgbW96X2d0a19jaGVja2JveF9nZXRfbWV0cmljcygmaW5kaWNhdG9y
U2l6ZSwgJmluZGljYXRvclNwYWNpbmcpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
Ly8gUmFkaW9QYXJ0Ci0gICAgbW96X2d0a19yYWRpb19nZXRfbWV0cmljcygmaW5kaWNhdG9yU2l6
ZSwgJmluZGljYXRvclNwYWNpbmcpOworICAgIGNhaXJvX3QqIGNyID0gY29udGV4dC0+cGxhdGZv
cm1Db250ZXh0KCk7CisgICAgY2Fpcm9fc2F2ZShjcik7CisgICAgZ2RrX2NhaXJvX3NldF9zb3Vy
Y2VfcGl4YnVmKGNyLCBpY29uLCBpY29uUG9pbnQueCgpLCBpY29uUG9pbnQueSgpKTsKKyAgICBj
YWlyb19wYWludChjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7CiB9CiAKIHN0YXRpYyBib29s
IHN1cHBvcnRzRm9jdXMoQ29udHJvbFBhcnQgYXBwZWFyYW5jZSkKQEAgLTI0Miw3ICsxNjMsNyBA
QCBpbnQgUmVuZGVyVGhlbWVHdGs6OmJhc2VsaW5lUG9zaXRpb24oY29uc3QgUmVuZGVyT2JqZWN0
KiBvKSBjb25zdAogICAgIHJldHVybiBSZW5kZXJUaGVtZTo6YmFzZWxpbmVQb3NpdGlvbihvKTsK
IH0KIAotc3RhdGljIEd0a1RleHREaXJlY3Rpb24gZ3RrVGV4dERpcmVjdGlvbihUZXh0RGlyZWN0
aW9uIGRpcmVjdGlvbikKK2dpbnQgUmVuZGVyVGhlbWVHdGs6Omd0a1RleHREaXJlY3Rpb24oVGV4
dERpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAgICAgc3dpdGNoIChkaXJlY3Rpb24pIHsKICAgICBj
YXNlIFJUTDoKQEAgLTI1NCw5MiArMTc1LDE4IEBAIHN0YXRpYyBHdGtUZXh0RGlyZWN0aW9uIGd0
a1RleHREaXJlY3Rpb24oVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pCiAgICAgfQogfQogCi1HdGtT
dGF0ZVR5cGUgUmVuZGVyVGhlbWVHdGs6Omd0a0ljb25TdGF0ZShSZW5kZXJPYmplY3QqIHJlbmRl
ck9iamVjdCkKK3N0YXRpYyBnaW50IGd0a0ljb25TdGF0ZShSZW5kZXJUaGVtZUd0ayogdGhlbWUs
IFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0KQogewotICAgIGlmICghaXNFbmFibGVkKHJlbmRl
ck9iamVjdCkpCisgICAgaWYgKCF0aGVtZS0+aXNFbmFibGVkKHJlbmRlck9iamVjdCkpCiAgICAg
ICAgIHJldHVybiBHVEtfU1RBVEVfSU5TRU5TSVRJVkU7Ci0gICAgaWYgKGlzUHJlc3NlZChyZW5k
ZXJPYmplY3QpKQorICAgIGlmICh0aGVtZS0+aXNQcmVzc2VkKHJlbmRlck9iamVjdCkpCiAgICAg
ICAgIHJldHVybiBHVEtfU1RBVEVfQUNUSVZFOwotICAgIGlmIChpc0hvdmVyZWQocmVuZGVyT2Jq
ZWN0KSkKKyAgICBpZiAodGhlbWUtPmlzSG92ZXJlZChyZW5kZXJPYmplY3QpKQogICAgICAgICBy
ZXR1cm4gR1RLX1NUQVRFX1BSRUxJR0hUOwogCiAgICAgcmV0dXJuIEdUS19TVEFURV9OT1JNQUw7
CiB9CiAKLWJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50UmVuZGVyT2JqZWN0KEd0a1RoZW1lV2lk
Z2V0VHlwZSB0eXBlLCBSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgR3JhcGhpY3NDb250ZXh0
KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgZmxhZ3MpCi17Ci0gICAgLy8gUGFp
bnRpbmcgaXMgZGlzYWJsZWQgc28ganVzdCBjbGFpbSB0byBoYXZlIHN1Y2NlZWRlZAotICAgIGlm
IChjb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIEd0a1dpZGdldFN0YXRlIHdpZGdldFN0YXRlOwotICAgIHdpZGdldFN0YXRlLmFjdGl2ZSA9
IGlzUHJlc3NlZChyZW5kZXJPYmplY3QpOwotICAgIHdpZGdldFN0YXRlLmZvY3VzZWQgPSBpc0Zv
Y3VzZWQocmVuZGVyT2JqZWN0KTsKLQotICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0xODM2NAotICAgIC8vIFRoZSBNb3ppbGxhIHRoZW1lIGRyYXdpbmcgY29k
ZSwgb25seSBwYWludHMgYSBidXR0b24gYXMgcHJlc3NlZCB3aGVuIGl0J3MgcHJlc3NlZCAKLSAg
ICAvLyB3aGlsZSBob3ZlcmVkLiBVbnRpbCB3ZSBtb3ZlIGF3YXkgZnJvbSB0aGUgTW96aWxhIGNv
ZGUsIHdvcmstYXJvdW5kIHRoZSBpc3N1ZSBieQotICAgIC8vIGZvcmNpbmcgYSBwcmVzc2VkIGJ1
dHRvbiBpbnRvIHRoZSBob3ZlcmVkIHN0YXRlLiBUaGlzIGVuc3VyZXMgdGhhdCBidXR0b25zIGFj
dGl2YXRlZAotICAgIC8vIHZpYSB0aGUga2V5Ym9hcmQgaGF2ZSB0aGUgcHJvcGVyIHJlbmRlcmlu
Zy4KLSAgICB3aWRnZXRTdGF0ZS5pbkhvdmVyID0gaXNIb3ZlcmVkKHJlbmRlck9iamVjdCkgfHwg
KHR5cGUgPT0gTU9aX0dUS19CVVRUT04gJiYgaXNQcmVzc2VkKHJlbmRlck9iamVjdCkpOwotCi0g
ICAgLy8gRklYTUU6IERpc2FibGVkIGRvZXMgbm90IGFsd2F5cyBnaXZlIHRoZSBjb3JyZWN0IGFw
cGVhcmFuY2UgZm9yIFJlYWRPbmx5Ci0gICAgd2lkZ2V0U3RhdGUuZGlzYWJsZWQgPSAhaXNFbmFi
bGVkKHJlbmRlck9iamVjdCkgfHwgaXNSZWFkT25seUNvbnRyb2wocmVuZGVyT2JqZWN0KTsKLSAg
ICB3aWRnZXRTdGF0ZS5pc0RlZmF1bHQgPSBmYWxzZTsKLSAgICB3aWRnZXRTdGF0ZS5jYW5EZWZh
dWx0ID0gZmFsc2U7Ci0KLSAgICAvLyBGSVhNRTogVGhlIGRlcHJlc3NlZCB2YWx1ZSBzaG91bGQg
cHJvYmFibHkgYXBwbHkgZm9yIG90aGVyIHRoZW1lIHBhcnRzIHRvby4KLSAgICAvLyBJdCBtdXN0
IGJlIHVzZWQgZm9yIHJhbmdlIHRodW1icywgYmVjYXVzZSBvdGhlcndpc2Ugd2hlbiB0aGUgdGh1
bWIgaXMgcHJlc3NlZCwKLSAgICAvLyB0aGUgcmVuZGVyaW5nIGlzIGluY29ycmVjdC4KLSAgICBp
ZiAodHlwZSA9PSBNT1pfR1RLX1NDQUxFX1RIVU1CX0hPUklaT05UQUwgfHwgdHlwZSA9PSBNT1pf
R1RLX1NDQUxFX1RIVU1CX1ZFUlRJQ0FMKQotICAgICAgICB3aWRnZXRTdGF0ZS5kZXByZXNzZWQg
PSBpc1ByZXNzZWQocmVuZGVyT2JqZWN0KTsKLSAgICBlbHNlCi0gICAgICAgIHdpZGdldFN0YXRl
LmRlcHJlc3NlZCA9IGZhbHNlOwotCi0gICAgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dCB3aWRnZXRD
b250ZXh0KGNvbnRleHQsIHJlY3QpOwotICAgIHJldHVybiAhd2lkZ2V0Q29udGV4dC5wYWludE1v
emlsbGFXaWRnZXQodHlwZSwgJndpZGdldFN0YXRlLCBmbGFncywgZ3RrVGV4dERpcmVjdGlvbihy
ZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNl
dFRvZ2dsZVNpemUoY29uc3QgUmVuZGVyVGhlbWVHdGsqIHRoZW1lLCBSZW5kZXJTdHlsZSogc3R5
bGUsIENvbnRyb2xQYXJ0IGFwcGVhcmFuY2UpCi17Ci0gICAgLy8gVGhlIHdpZHRoIGFuZCBoZWln
aHQgYXJlIGJvdGggc3BlY2lmaWVkLCBzbyB3ZSBzaG91bGRuJ3QgY2hhbmdlIHRoZW0uCi0gICAg
aWYgKCFzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpICYmICFzdHlsZS0+aGVpZ2h0
KCkuaXNBdXRvKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEZJWE1FOiBUaGlzIGlzIHBy
b2JhYmx5IG5vdCBjb3JyZWN0IHVzZSBvZiBpbmRpY2F0b3JTaXplIGFuZCBpbmRpY2F0b3JTcGFj
aW5nLgotICAgIGdpbnQgaW5kaWNhdG9yU2l6ZSwgaW5kaWNhdG9yU3BhY2luZzsKLSAgICB0aGVt
ZS0+Z2V0SW5kaWNhdG9yTWV0cmljcyhhcHBlYXJhbmNlLCBpbmRpY2F0b3JTaXplLCBpbmRpY2F0
b3JTcGFjaW5nKTsKLQotICAgIC8vIE90aGVyIHBvcnRzIGhhcmQtY29kZSB0aGlzIHRvIDEzLCBi
dXQgR1RLKyB1c2VycyB0ZW5kIHRvIGRlbWFuZCB0aGUgbmF0aXZlIGxvb2suCi0gICAgLy8gSXQg
Y291bGQgYmUgbWFkZSBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHZhbHVlcyBvdGhlciB0aGFuIDEz
IGFjdHVhbGx5IGJyZWFrIHNpdGUgY29tcGF0aWJpbGl0eS4KLSAgICBpbnQgbGVuZ3RoID0gaW5k
aWNhdG9yU2l6ZSArIGluZGljYXRvclNwYWNpbmc7Ci0gICAgaWYgKHN0eWxlLT53aWR0aCgpLmlz
SW50cmluc2ljT3JBdXRvKCkpCi0gICAgICAgIHN0eWxlLT5zZXRXaWR0aChMZW5ndGgobGVuZ3Ro
LCBGaXhlZCkpOwotCi0gICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKLSAgICAgICAg
c3R5bGUtPnNldEhlaWdodChMZW5ndGgobGVuZ3RoLCBGaXhlZCkpOwotfQotCi12b2lkIFJlbmRl
clRoZW1lR3RrOjpzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAotewot
ICAgIHNldFRvZ2dsZVNpemUodGhpcywgc3R5bGUsIFJhZGlvUGFydCk7Ci19Ci0KLWJvb2wgUmVu
ZGVyVGhlbWVHdGs6OnBhaW50Q2hlY2tib3goUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludElu
Zm8mIGksIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgcmV0dXJuIHBhaW50UmVuZGVyT2Jq
ZWN0KE1PWl9HVEtfQ0hFQ0tCVVRUT04sIG8sIGkuY29udGV4dCwgcmVjdCwgaXNDaGVja2VkKG8p
KTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0UmFkaW9TaXplKFJlbmRlclN0eWxlKiBz
dHlsZSkgY29uc3QKLXsKLSAgICBzZXRUb2dnbGVTaXplKHRoaXMsIHN0eWxlLCBSYWRpb1BhcnQp
OwotfQotCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFJhZGlvKFJlbmRlck9iamVjdCogbywg
Y29uc3QgUGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIHJldHVybiBw
YWludFJlbmRlck9iamVjdChNT1pfR1RLX1JBRElPQlVUVE9OLCBvLCBpLmNvbnRleHQsIHJlY3Qs
IGlzQ2hlY2tlZChvKSk7Ci19Ci0KIHZvaWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdEJ1dHRvblN0
eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIFdlYkNv
cmU6OkVsZW1lbnQqIGUpIGNvbnN0CiB7CiAgICAgLy8gU29tZSBsYXlvdXQgdGVzdHMgY2hlY2sg
ZXhwbGljaXRseSB0aGF0IGJ1dHRvbnMgaWdub3JlIGxpbmUtaGVpZ2h0LgpAQCAtMzQ3LDQ5ICsx
OTQsNiBAQCB2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RCdXR0b25TdHlsZShDU1NTdHlsZVNl
bGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqCiAgICAgICAgIHN0eWxlLT5zZXRMaW5lSGVp
Z2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKIH0KIAotYm9vbCBSZW5kZXJU
aGVtZUd0azo6cGFpbnRCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIGks
IGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgcmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0KE1P
Wl9HVEtfQlVUVE9OLCBvLCBpLmNvbnRleHQsIHJlY3QsIEdUS19SRUxJRUZfTk9STUFMKTsKLX0K
LQotc3RhdGljIHZvaWQgZ2V0Q29tYm9Cb3hQYWRkaW5nKFJlbmRlclN0eWxlKiBzdHlsZSwgaW50
JiBsZWZ0LCBpbnQmIHRvcCwgaW50JiByaWdodCwgaW50JiBib3R0b20pCi17Ci0gICAgLy8gSWYg
dGhpcyBtZW51IGxpc3QgYnV0dG9uIGlzbid0IGRyYXduIHVzaW5nIHRoZSBuYXRpdmUgdGhlbWUs
IHdlCi0gICAgLy8gZG9uJ3QgYWRkIGFueSBleHRyYSBwYWRkaW5nIGJleW9uZCB3aGF0IFdlYkNv
cmUgYWxyZWFkeSB1c2VzLgotICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE5vQ29udHJv
bFBhcnQpCi0gICAgICAgIHJldHVybjsKLSAgICBtb3pfZ3RrX2dldF93aWRnZXRfYm9yZGVyKE1P
Wl9HVEtfRFJPUERPV04sICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20sCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBndGtUZXh0RGlyZWN0aW9uKHN0eWxlLT5kaXJlY3Rpb24oKSks
IFRSVUUpOwotfQotCi1pbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nTGVm
dChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgaW50IGxlZnQgPSAwLCB0b3AgPSAw
LCByaWdodCA9IDAsIGJvdHRvbSA9IDA7Ci0gICAgZ2V0Q29tYm9Cb3hQYWRkaW5nKHN0eWxlLCBs
ZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgIHJldHVybiBsZWZ0OwotfQotCi1pbnQgUmVu
ZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nUmlnaHQoUmVuZGVyU3R5bGUqIHN0eWxl
KSBjb25zdAotewotICAgIGludCBsZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSAwLCBib3R0b20g
PSAwOwotICAgIGdldENvbWJvQm94UGFkZGluZyhzdHlsZSwgbGVmdCwgdG9wLCByaWdodCwgYm90
dG9tKTsKLSAgICByZXR1cm4gcmlnaHQ7Ci19Ci0KLWludCBSZW5kZXJUaGVtZUd0azo6cG9wdXBJ
bnRlcm5hbFBhZGRpbmdUb3AoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAotewotICAgIGludCBs
ZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSAwLCBib3R0b20gPSAwOwotICAgIGdldENvbWJvQm94
UGFkZGluZyhzdHlsZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLSAgICByZXR1cm4gdG9w
OwotfQotCi1pbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nQm90dG9tKFJl
bmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAgICBpbnQgbGVmdCA9IDAsIHRvcCA9IDAsIHJp
Z2h0ID0gMCwgYm90dG9tID0gMDsKLSAgICBnZXRDb21ib0JveFBhZGRpbmcoc3R5bGUsIGxlZnQs
IHRvcCwgcmlnaHQsIGJvdHRvbSk7Ci0gICAgcmV0dXJuIGJvdHRvbTsKLX0KLQogdm9pZCBSZW5k
ZXJUaGVtZUd0azo6YWRqdXN0TWVudUxpc3RTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3Rv
ciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAogewogICAgIC8vIFRoZSB0
ZXN0cyBjaGVjayBleHBsaWNpdGx5IHRoYXQgc2VsZWN0IG1lbnUgYnV0dG9ucyBpZ25vcmUgbGlu
ZSBoZWlnaHQuCkBAIC00MDQsNDQgKzIwOCwxNiBAQCB2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1
c3RNZW51TGlzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZQog
ICAgIGFkanVzdE1lbnVMaXN0U3R5bGUoc2VsZWN0b3IsIHN0eWxlLCBlKTsKIH0KIAotYm9vbCBS
ZW5kZXJUaGVtZUd0azo6cGFpbnRNZW51TGlzdChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50
SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICByZXR1cm4gcGFpbnRSZW5kZXJP
YmplY3QoTU9aX0dUS19EUk9QRE9XTiwgbywgaS5jb250ZXh0LCByZWN0KTsKLX0KLQogYm9vbCBS
ZW5kZXJUaGVtZUd0azo6cGFpbnRNZW51TGlzdEJ1dHRvbihSZW5kZXJPYmplY3QqIG9iamVjdCwg
Y29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQogewogICAgIHJldHVy
biBwYWludE1lbnVMaXN0KG9iamVjdCwgaW5mbywgcmVjdCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNl
dFRleHRJbnB1dEJvcmRlcnMoUmVuZGVyU3R5bGUqIHN0eWxlKQotewotICAgIC8vIElmIHRoaXMg
Y29udHJvbCBpc24ndCBkcmF3biB1c2luZyB0aGUgbmF0aXZlIHRoZW1lLCB3ZSBkb24ndCB0b3Vj
aCB0aGUgYm9yZGVycy4KLSAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBOb0NvbnRyb2xQ
YXJ0KQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBXZSBjYW5ub3QgZ2l2ZSBhIHByb3BlciBy
ZW5kZXJpbmcgd2hlbiBib3JkZXIgcmFkaXVzIGlzIGFjdGl2ZSwgdW5mb3J0dW5hdGVseS4KLSAg
ICBzdHlsZS0+cmVzZXRCb3JkZXJSYWRpdXMoKTsKLQotICAgIGludCBsZWZ0ID0gMCwgdG9wID0g
MCwgcmlnaHQgPSAwLCBib3R0b20gPSAwOwotICAgIG1vel9ndGtfZ2V0X3dpZGdldF9ib3JkZXIo
TU9aX0dUS19FTlRSWSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGd0a1RleHREaXJlY3Rpb24oc3R5bGUtPmRpcmVjdGlvbigpKSwg
VFJVRSk7Ci0gICAgc3R5bGUtPnNldEJvcmRlckxlZnRXaWR0aChsZWZ0KTsKLSAgICBzdHlsZS0+
c2V0Qm9yZGVyVG9wV2lkdGgodG9wKTsKLSAgICBzdHlsZS0+c2V0Qm9yZGVyUmlnaHRXaWR0aChy
aWdodCk7Ci0gICAgc3R5bGUtPnNldEJvcmRlckJvdHRvbVdpZHRoKGJvdHRvbSk7Ci19Ci0KIHZv
aWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdFRleHRGaWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0b3Iq
IHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0CiB7CiAgICAg
c2V0VGV4dElucHV0Qm9yZGVycyhzdHlsZSk7CiB9CiAKLWJvb2wgUmVuZGVyVGhlbWVHdGs6OnBh
aW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBpLCBjb25zdCBJ
bnRSZWN0JiByZWN0KQotewotICAgIHJldHVybiBwYWludFJlbmRlck9iamVjdChNT1pfR1RLX0VO
VFJZLCBvLCBpLmNvbnRleHQsIHJlY3QpOwotfQotCiB2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1
c3RUZXh0QXJlYVN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSog
c3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0CiB7CiAgICAgc2V0VGV4dElucHV0Qm9yZGVycyhzdHls
ZSk7CkBAIC00NzMsNyArMjQ5LDcgQEAgdm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0U2VhcmNo
RmllbGRSZXN1bHRzRGVjb3JhdGlvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHMKICAgICBzdHls
ZS0+c2V0SGVpZ2h0KExlbmd0aChoZWlnaHQsIEZpeGVkKSk7CiB9CiAKLXN0YXRpYyBJbnRQb2lu
dCBjZW50ZXJSZWN0VmVydGljYWxseUluUGFyZW50SW5wdXRFbGVtZW50KFJlbmRlck9iamVjdCog
b2JqZWN0LCBjb25zdCBJbnRSZWN0JiByZWN0KQorSW50UG9pbnQgUmVuZGVyVGhlbWVHdGs6OmNl
bnRlclJlY3RWZXJ0aWNhbGx5SW5QYXJlbnRJbnB1dEVsZW1lbnQoUmVuZGVyT2JqZWN0KiBvYmpl
Y3QsIGNvbnN0IEludFJlY3QmIHJlY3QpCiB7CiAgICAgTm9kZSogaW5wdXQgPSBvYmplY3QtPm5v
ZGUoKS0+c2hhZG93QW5jZXN0b3JOb2RlKCk7IC8vIEdldCB0aGUgcmVuZGVyZXIgb2YgPGlucHV0
PiBlbGVtZW50LgogICAgIGlmICghaW5wdXQtPnJlbmRlcmVyKCktPmlzQm94KCkpCkBAIC00ODks
MTEgKzI2NSwxMSBAQCBzdGF0aWMgSW50UG9pbnQgY2VudGVyUmVjdFZlcnRpY2FsbHlJblBhcmVu
dElucHV0RWxlbWVudChSZW5kZXJPYmplY3QqIG9iamVjdCwgYwogCiBib29sIFJlbmRlclRoZW1l
R3RrOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb24oUmVuZGVyT2JqZWN0KiByZW5k
ZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0
KQogewotICAgIEd0a1N0eWxlKiBzdHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKEdUS19XSURH
RVQoZ3RrRW50cnkoKSkpOworICAgIFBsYXRmb3JtUmVmUHRyPEdka1BpeGJ1Zj4gaWNvbiA9IGdl
dFN0b2NrSWNvbihHVEtfVFlQRV9FTlRSWSwgR1RLX1NUT0NLX0ZJTkQsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0a1RleHREaXJlY3Rpb24ocmVu
ZGVyT2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0a0ljb25TdGF0ZSh0aGlzLCByZW5kZXJPYmpl
Y3QpLCBHVEtfSUNPTl9TSVpFX01FTlUpOwogICAgIEludFBvaW50IGljb25Qb2ludChjZW50ZXJS
ZWN0VmVydGljYWxseUluUGFyZW50SW5wdXRFbGVtZW50KHJlbmRlck9iamVjdCwgcmVjdCkpOwot
ICAgIHBhaW50U3RvY2tJY29uKHBhaW50SW5mby5jb250ZXh0LCBpY29uUG9pbnQsIHN0eWxlLCBH
VEtfU1RPQ0tfRklORCwKLSAgICAgICAgICAgICAgICAgICBndGtUZXh0RGlyZWN0aW9uKHJlbmRl
ck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpLAotICAgICAgICAgICAgICAgICAgIGd0a0lj
b25TdGF0ZShyZW5kZXJPYmplY3QpLCBHVEtfSUNPTl9TSVpFX01FTlUpOworICAgIHBhaW50U3Rv
Y2tJY29uKHBhaW50SW5mby5jb250ZXh0LCBpY29uUG9pbnQsIGljb24uZ2V0KCkpOwogICAgIHJl
dHVybiBmYWxzZTsKIH0KIApAQCAtNTEwLDExICsyODYsMTIgQEAgdm9pZCBSZW5kZXJUaGVtZUd0
azo6YWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBz
ZWxlY3QKIAogYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRTZWFyY2hGaWVsZENhbmNlbEJ1dHRv
bihSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8s
IGNvbnN0IEludFJlY3QmIHJlY3QpCiB7Ci0gICAgR3RrU3R5bGUqIHN0eWxlID0gZ3RrX3dpZGdl
dF9nZXRfc3R5bGUoR1RLX1dJREdFVChndGtFbnRyeSgpKSk7CisgICAgUGxhdGZvcm1SZWZQdHI8
R2RrUGl4YnVmPiBpY29uID0gZ2V0U3RvY2tJY29uKEdUS19UWVBFX0VOVFJZLCBHVEtfU1RPQ0tf
Q0xFQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGd0a1RleHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0a0ljb25T
dGF0ZSh0aGlzLCByZW5kZXJPYmplY3QpLCBHVEtfSUNPTl9TSVpFX01FTlUpOwogICAgIEludFBv
aW50IGljb25Qb2ludChjZW50ZXJSZWN0VmVydGljYWxseUluUGFyZW50SW5wdXRFbGVtZW50KHJl
bmRlck9iamVjdCwgcmVjdCkpOwotICAgIHBhaW50U3RvY2tJY29uKHBhaW50SW5mby5jb250ZXh0
LCBpY29uUG9pbnQsIHN0eWxlLCBHVEtfU1RPQ0tfQ0xFQVIsCi0gICAgICAgICAgICAgICAgICAg
Z3RrVGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpKSwKLSAg
ICAgICAgICAgICAgICAgICBndGtJY29uU3RhdGUocmVuZGVyT2JqZWN0KSwgR1RLX0lDT05fU0la
RV9NRU5VKTsKKyAgICBwYWludFN0b2NrSWNvbihwYWludEluZm8uY29udGV4dCwgaWNvblBvaW50
LCBpY29uLmdldCgpKTsKKwogICAgIHJldHVybiBmYWxzZTsKIH0KIApAQCAtNTI5LDEwNSArMzA2
LDE2IEBAIGJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0
KiBvLCBjb25zdCBQYWludEluZm8mIGksIGNvbnN0CiAgICAgcmV0dXJuIHBhaW50VGV4dEZpZWxk
KG8sIGksIHJlY3QpOwogfQogCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFNsaWRlclRyYWNr
KFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8sIGNvbnN0IEludFJl
Y3QmIHJlY3QpCi17Ci0gICAgQ29udHJvbFBhcnQgcGFydCA9IG9iamVjdC0+c3R5bGUoKS0+YXBw
ZWFyYW5jZSgpOwotICAgIEFTU0VSVChwYXJ0ID09IFNsaWRlckhvcml6b250YWxQYXJ0IHx8IHBh
cnQgPT0gU2xpZGVyVmVydGljYWxQYXJ0KTsKLQotICAgIEd0a1RoZW1lV2lkZ2V0VHlwZSBndGtQ
YXJ0ID0gTU9aX0dUS19TQ0FMRV9IT1JJWk9OVEFMOwotICAgIGlmIChwYXJ0ID09IFNsaWRlclZl
cnRpY2FsUGFydCkKLSAgICAgICAgZ3RrUGFydCA9IE1PWl9HVEtfU0NBTEVfVkVSVElDQUw7Ci0K
LSAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoZ3RrUGFydCwgb2JqZWN0LCBpbmZvLmNvbnRl
eHQsIHJlY3QpOwotfQotCiB2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RTbGlkZXJUcmFja1N0
eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25z
dAogewogICAgIHN0eWxlLT5zZXRCb3hTaGFkb3coMCk7CiB9CiAKLWJvb2wgUmVuZGVyVGhlbWVH
dGs6OnBhaW50U2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFBhaW50SW5m
byYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBDb250cm9sUGFydCBwYXJ0ID0g
b2JqZWN0LT5zdHlsZSgpLT5hcHBlYXJhbmNlKCk7Ci0gICAgQVNTRVJUKHBhcnQgPT0gU2xpZGVy
VGh1bWJIb3Jpem9udGFsUGFydCB8fCBwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KTsK
LQotICAgIEd0a1RoZW1lV2lkZ2V0VHlwZSBndGtQYXJ0ID0gTU9aX0dUS19TQ0FMRV9USFVNQl9I
T1JJWk9OVEFMOwotICAgIGlmIChwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KQotICAg
ICAgICBndGtQYXJ0ID0gTU9aX0dUS19TQ0FMRV9USFVNQl9WRVJUSUNBTDsKLQotICAgIHJldHVy
biBwYWludFJlbmRlck9iamVjdChndGtQYXJ0LCBvYmplY3QsIGluZm8uY29udGV4dCwgcmVjdCk7
Ci19Ci0KIHZvaWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdFNsaWRlclRodW1iU3R5bGUoQ1NTU3R5
bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCopIGNvbnN0CiB7CiAgICAg
c3R5bGUtPnNldEJveFNoYWRvdygwKTsKIH0KIAotdm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0
U2xpZGVyVGh1bWJTaXplKFJlbmRlck9iamVjdCogbykgY29uc3QKLXsKLSAgICBDb250cm9sUGFy
dCBwYXJ0ID0gby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpOwotI2lmIEVOQUJMRShWSURFTykKLSAg
ICBpZiAocGFydCA9PSBNZWRpYVNsaWRlclRodW1iUGFydCkgewotICAgICAgICBvLT5zdHlsZSgp
LT5zZXRXaWR0aChMZW5ndGgobV9tZWRpYVNsaWRlclRodW1iV2lkdGgsIEZpeGVkKSk7Ci0gICAg
ICAgIG8tPnN0eWxlKCktPnNldEhlaWdodChMZW5ndGgobV9tZWRpYVNsaWRlclRodW1iSGVpZ2h0
LCBGaXhlZCkpOwotICAgIH0gZWxzZQotI2VuZGlmCi0gICAgaWYgKHBhcnQgPT0gU2xpZGVyVGh1
bWJIb3Jpem9udGFsUGFydCB8fCBwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KSB7Ci0g
ICAgICAgIGdpbnQgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgbW96X2d0a19nZXRfc2NhbGV0aHVt
Yl9tZXRyaWNzKHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCA/IEdUS19PUklFTlRB
VElPTl9IT1JJWk9OVEFMIDogR1RLX09SSUVOVEFUSU9OX1ZFUlRJQ0FMLCAmd2lkdGgsICZoZWln
aHQpOwotICAgICAgICBvLT5zdHlsZSgpLT5zZXRXaWR0aChMZW5ndGgod2lkdGgsIEZpeGVkKSk7
Ci0gICAgICAgIG8tPnN0eWxlKCktPnNldEhlaWdodChMZW5ndGgoaGVpZ2h0LCBGaXhlZCkpOwot
ICAgIH0KLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9u
QmFja2dyb3VuZENvbG9yKCkgY29uc3QKLXsKLSAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a0Vu
dHJ5KCk7Ci0gICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPmJhc2VbR1RL
X1NUQVRFX1NFTEVDVEVEXTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtSW5h
Y3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIEd0a1dpZGdldCog
d2lkZ2V0ID0gZ3RrRW50cnkoKTsKLSAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lk
Z2V0KS0+YmFzZVtHVEtfU1RBVEVfQUNUSVZFXTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6
OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKLXsKLSAgICBH
dGtXaWRnZXQqIHdpZGdldCA9IGd0a0VudHJ5KCk7Ci0gICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0
X3N0eWxlKHdpZGdldCktPnRleHRbR1RLX1NUQVRFX1NFTEVDVEVEXTsKLX0KLQotQ29sb3IgUmVu
ZGVyVGhlbWVHdGs6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBj
b25zdAotewotICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrRW50cnkoKTsKLSAgICByZXR1cm4g
Z3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+dGV4dFtHVEtfU1RBVEVfQUNUSVZFXTsKLX0K
LQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6OmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5k
Q29sb3IoKSBjb25zdAotewotICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrVHJlZVZpZXcoKTsK
LSAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+YmFzZVtHVEtfU1RBVEVf
U0VMRUNURURdOwotfQotCi1Db2xvciBSZW5kZXJUaGVtZUd0azo6aW5hY3RpdmVMaXN0Qm94U2Vs
ZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKLXsKLSAgICBHdGtXaWRnZXQqIHdpZGdldCA9
IGd0a1RyZWVWaWV3KCk7Ci0gICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCkt
PmJhc2VbR1RLX1NUQVRFX0FDVElWRV07Ci19Ci0KLUNvbG9yIFJlbmRlclRoZW1lR3RrOjphY3Rp
dmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKLXsKLSAgICBHdGtXaWRn
ZXQqIHdpZGdldCA9IGd0a1RyZWVWaWV3KCk7Ci0gICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0
eWxlKHdpZGdldCktPnRleHRbR1RLX1NUQVRFX1NFTEVDVEVEXTsKLX0KLQotQ29sb3IgUmVuZGVy
VGhlbWVHdGs6OmluYWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0
Ci17Ci0gICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtUcmVlVmlldygpOwotICAgIHJldHVybiBn
dGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT50ZXh0W0dUS19TVEFURV9BQ1RJVkVdOwotfQot
CiBkb3VibGUgUmVuZGVyVGhlbWVHdGs6OmNhcmV0QmxpbmtJbnRlcnZhbCgpIGNvbnN0CiB7CiAg
ICAgR3RrU2V0dGluZ3MqIHNldHRpbmdzID0gZ3RrX3NldHRpbmdzX2dldF9kZWZhdWx0KCk7CkBA
IC02ODUsODIgKzM3Myw2IEBAIHZvaWQgUmVuZGVyVGhlbWVHdGs6OnN5c3RlbUZvbnQoaW50LCBG
b250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKICAgICBwYW5nb19mb250X2Rl
c2NyaXB0aW9uX2ZyZWUocGFuZ29EZXNjcmlwdGlvbik7CiB9CiAKLUNvbG9yIFJlbmRlclRoZW1l
R3RrOjpzeXN0ZW1Db2xvcihpbnQgY3NzVmFsdWVJZCkgY29uc3QKLXsKLSAgICBzd2l0Y2ggKGNz
c1ZhbHVlSWQpIHsKLSAgICBjYXNlIENTU1ZhbHVlQnV0dG9udGV4dDoKLSAgICAgICAgcmV0dXJu
IENvbG9yKGd0a193aWRnZXRfZ2V0X3N0eWxlKGd0a0J1dHRvbigpKS0+ZmdbR1RLX1NUQVRFX05P
Uk1BTF0pOwotICAgIGNhc2UgQ1NTVmFsdWVDYXB0aW9udGV4dDoKLSAgICAgICAgcmV0dXJuIENv
bG9yKGd0a193aWRnZXRfZ2V0X3N0eWxlKGd0a0VudHJ5KCkpLT5mZ1tHVEtfU1RBVEVfTk9STUFM
XSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIFJlbmRlclRoZW1lOjpzeXN0ZW1Db2xv
cihjc3NWYWx1ZUlkKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGd0a1N0eWxlU2V0Q2FsbGJh
Y2soR3RrV2lkZ2V0KiB3aWRnZXQsIEd0a1N0eWxlKiBwcmV2aW91cywgUmVuZGVyVGhlbWUqIHJl
bmRlclRoZW1lKQotewotICAgIC8vIEZJWE1FOiBNYWtlIHN1cmUgdGhpcyBmdW5jdGlvbiBkb2Vz
bid0IGdldCBjYWxsZWQgbWFueSB0aW1lcyBmb3IgYSBzaW5nbGUgR1RLKyBzdHlsZSBjaGFuZ2Ug
c2lnbmFsLgotICAgIHJlbmRlclRoZW1lLT5wbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgpOwotfQot
Ci1HdGtDb250YWluZXIqIFJlbmRlclRoZW1lR3RrOjpndGtDb250YWluZXIoKSBjb25zdAotewot
ICAgIGlmIChtX2d0a0NvbnRhaW5lcikKLSAgICAgICAgcmV0dXJuIG1fZ3RrQ29udGFpbmVyOwot
Ci0gICAgbV9ndGtXaW5kb3cgPSBndGtfd2luZG93X25ldyhHVEtfV0lORE9XX1BPUFVQKTsKLSAg
ICBtX2d0a0NvbnRhaW5lciA9IEdUS19DT05UQUlORVIoZ3RrX2ZpeGVkX25ldygpKTsKLSAgICBn
X3NpZ25hbF9jb25uZWN0KG1fZ3RrV2luZG93LCAic3R5bGUtc2V0IiwgR19DQUxMQkFDSyhndGtT
dHlsZVNldENhbGxiYWNrKSwgY29uc3RfY2FzdDxSZW5kZXJUaGVtZUd0ayo+KHRoaXMpKTsKLSAg
ICBndGtfY29udGFpbmVyX2FkZChHVEtfQ09OVEFJTkVSKG1fZ3RrV2luZG93KSwgR1RLX1dJREdF
VChtX2d0a0NvbnRhaW5lcikpOwotICAgIGd0a193aWRnZXRfcmVhbGl6ZShtX2d0a1dpbmRvdyk7
Ci0KLSAgICByZXR1cm4gbV9ndGtDb250YWluZXI7Ci19Ci0KLUd0a1dpZGdldCogUmVuZGVyVGhl
bWVHdGs6Omd0a0J1dHRvbigpIGNvbnN0Ci17Ci0gICAgaWYgKG1fZ3RrQnV0dG9uKQotICAgICAg
ICByZXR1cm4gbV9ndGtCdXR0b247Ci0KLSAgICBtX2d0a0J1dHRvbiA9IGd0a19idXR0b25fbmV3
KCk7Ci0gICAgZ19zaWduYWxfY29ubmVjdChtX2d0a0J1dHRvbiwgInN0eWxlLXNldCIsIEdfQ0FM
TEJBQ0soZ3RrU3R5bGVTZXRDYWxsYmFjayksIGNvbnN0X2Nhc3Q8UmVuZGVyVGhlbWVHdGsqPih0
aGlzKSk7Ci0gICAgZ3RrX2NvbnRhaW5lcl9hZGQoZ3RrQ29udGFpbmVyKCksIG1fZ3RrQnV0dG9u
KTsKLSAgICBndGtfd2lkZ2V0X3JlYWxpemUobV9ndGtCdXR0b24pOwotCi0gICAgcmV0dXJuIG1f
Z3RrQnV0dG9uOwotfQotCi1HdGtXaWRnZXQqIFJlbmRlclRoZW1lR3RrOjpndGtFbnRyeSgpIGNv
bnN0Ci17Ci0gICAgaWYgKG1fZ3RrRW50cnkpCi0gICAgICAgIHJldHVybiBtX2d0a0VudHJ5Owot
Ci0gICAgbV9ndGtFbnRyeSA9IGd0a19lbnRyeV9uZXcoKTsKLSAgICBnX3NpZ25hbF9jb25uZWN0
KG1fZ3RrRW50cnksICJzdHlsZS1zZXQiLCBHX0NBTExCQUNLKGd0a1N0eWxlU2V0Q2FsbGJhY2sp
LCBjb25zdF9jYXN0PFJlbmRlclRoZW1lR3RrKj4odGhpcykpOwotICAgIGd0a19jb250YWluZXJf
YWRkKGd0a0NvbnRhaW5lcigpLCBtX2d0a0VudHJ5KTsKLSAgICBndGtfd2lkZ2V0X3JlYWxpemUo
bV9ndGtFbnRyeSk7Ci0KLSAgICByZXR1cm4gbV9ndGtFbnRyeTsKLX0KLQotR3RrV2lkZ2V0KiBS
ZW5kZXJUaGVtZUd0azo6Z3RrVHJlZVZpZXcoKSBjb25zdAotewotICAgIGlmIChtX2d0a1RyZWVW
aWV3KQotICAgICAgICByZXR1cm4gbV9ndGtUcmVlVmlldzsKLQotICAgIG1fZ3RrVHJlZVZpZXcg
PSBndGtfdHJlZV92aWV3X25ldygpOwotICAgIGdfc2lnbmFsX2Nvbm5lY3QobV9ndGtUcmVlVmll
dywgInN0eWxlLXNldCIsIEdfQ0FMTEJBQ0soZ3RrU3R5bGVTZXRDYWxsYmFjayksIGNvbnN0X2Nh
c3Q8UmVuZGVyVGhlbWVHdGsqPih0aGlzKSk7Ci0gICAgZ3RrX2NvbnRhaW5lcl9hZGQoZ3RrQ29u
dGFpbmVyKCksIG1fZ3RrVHJlZVZpZXcpOwotICAgIGd0a193aWRnZXRfcmVhbGl6ZShtX2d0a1Ry
ZWVWaWV3KTsKLQotICAgIHJldHVybiBtX2d0a1RyZWVWaWV3OwotfQotCi1HdGtXaWRnZXQqIFJl
bmRlclRoZW1lR3RrOjpndGtTY3JvbGxiYXIoKQotewotICAgIHJldHVybiBtb3pfZ3RrX2dldF9z
Y3JvbGxiYXJfd2lkZ2V0KCk7Ci19Ci0KIHZvaWQgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtQ29s
b3JzRGlkQ2hhbmdlKCkKIHsKICNpZiBFTkFCTEUoVklERU8pCkBAIC03NzcsMTIgKzM4OSwxMyBA
QCBTdHJpbmcgUmVuZGVyVGhlbWVHdGs6OmV4dHJhTWVkaWFDb250cm9sc1N0eWxlU2hlZXQoKQog
CiBib29sIFJlbmRlclRoZW1lR3RrOjpwYWludE1lZGlhQnV0dG9uKFJlbmRlck9iamVjdCogcmVu
ZGVyT2JqZWN0LCBHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3Qs
IGNvbnN0IGNoYXIqIGljb25OYW1lKQogewotICAgIEd0a1N0eWxlKiBzdHlsZSA9IGd0a193aWRn
ZXRfZ2V0X3N0eWxlKEdUS19XSURHRVQoZ3RrQ29udGFpbmVyKCkpKTsKKyAgICBQbGF0Zm9ybVJl
ZlB0cjxHZGtQaXhidWY+IGljb24gPSBnZXRTdG9ja0ljb24oR1RLX1RZUEVfQ09OVEFJTkVSLCBp
Y29uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZ3RrVGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RrSWNv
blN0YXRlKHRoaXMsIHJlbmRlck9iamVjdCksIGdldE1lZGlhQnV0dG9uSWNvblNpemUobV9tZWRp
YUljb25TaXplKSk7CiAgICAgSW50UG9pbnQgaWNvblBvaW50KHJlY3QueCgpICsgKHJlY3Qud2lk
dGgoKSAtIG1fbWVkaWFJY29uU2l6ZSkgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICByZWN0
LnkoKSArIChyZWN0LmhlaWdodCgpIC0gbV9tZWRpYUljb25TaXplKSAvIDIpOwogICAgIGNvbnRl
eHQtPmZpbGxSZWN0KEZsb2F0UmVjdChyZWN0KSwgbV9wYW5lbENvbG9yLCBDb2xvclNwYWNlRGV2
aWNlUkdCKTsKLSAgICBwYWludFN0b2NrSWNvbihjb250ZXh0LCBpY29uUG9pbnQsIHN0eWxlLCBp
Y29uTmFtZSwgZ3RrVGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlv
bigpKSwKLSAgICAgICAgICAgICAgICAgICBndGtJY29uU3RhdGUocmVuZGVyT2JqZWN0KSwgZ2V0
TWVkaWFCdXR0b25JY29uU2l6ZShtX21lZGlhSWNvblNpemUpKTsKKyAgICBwYWludFN0b2NrSWNv
bihjb250ZXh0LCBpY29uUG9pbnQsIGljb24uZ2V0KCkpOwogCiAgICAgcmV0dXJuIGZhbHNlOwog
fQpAQCAtODkwLDUxICs1MDMsMTAgQEAgYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRNZWRpYVNs
aWRlclRodW1iKFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBwYWkKICNlbmRpZgog
CiAjaWYgRU5BQkxFKFBST0dSRVNTX1RBRykKLWRvdWJsZSBSZW5kZXJUaGVtZUd0azo6YW5pbWF0
aW9uUmVwZWF0SW50ZXJ2YWxGb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyopIGNvbnN0Ci17
Ci0gICAgLy8gRklYTUU6IEl0IGRvZXNuJ3QgbG9vayBsaWtlIHRoZXJlIGlzIGEgZ29vZCB3YXkg
eWV0IHRvIHN1cHBvcnQgYW5pbWF0ZWQKLSAgICAvLyBwcm9ncmVzcyBiYXJzIHdpdGggdGhlIE1v
emlsbGEgdGhlbWUgZHJhd2luZyBjb2RlLgotICAgIHJldHVybiAwOwotfQotCi1kb3VibGUgUmVu
ZGVyVGhlbWVHdGs6OmFuaW1hdGlvbkR1cmF0aW9uRm9yUHJvZ3Jlc3NCYXIoUmVuZGVyUHJvZ3Jl
c3MqKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBJdCBkb2Vzbid0IGxvb2sgbGlrZSB0aGVyZSBp
cyBhIGdvb2Qgd2F5IHlldCB0byBzdXBwb3J0IGFuaW1hdGVkCi0gICAgLy8gcHJvZ3Jlc3MgYmFy
cyB3aXRoIHRoZSBNb3ppbGxhIHRoZW1lIGRyYXdpbmcgY29kZS4KLSAgICByZXR1cm4gMDsKLX0K
LQogdm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0UHJvZ3Jlc3NCYXJTdHlsZShDU1NTdHlsZVNl
bGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKIHsKICAgICBzdHls
ZS0+c2V0Qm94U2hhZG93KDApOwogfQotCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFByb2dy
ZXNzQmFyKFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50
SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAoIXJlbmRlck9iamVjdC0+aXNQ
cm9ncmVzcygpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIEd0a1dpZGdldCogcHJvZ3Jl
c3NCYXJXaWRnZXQgPSBtb3pfZ3RrX2dldF9wcm9ncmVzc193aWRnZXQoKTsKLSAgICBpZiAoIXBy
b2dyZXNzQmFyV2lkZ2V0KQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChwYWludFJl
bmRlck9iamVjdChNT1pfR1RLX1BST0dSRVNTQkFSLCByZW5kZXJPYmplY3QsIHBhaW50SW5mby5j
b250ZXh0LCByZWN0KSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBJbnRSZWN0IGNodW5r
UmVjdChyZWN0KTsKLSAgICBSZW5kZXJQcm9ncmVzcyogcmVuZGVyUHJvZ3Jlc3MgPSB0b1JlbmRl
clByb2dyZXNzKHJlbmRlck9iamVjdCk7Ci0KLSAgICBHdGtTdHlsZSogc3R5bGUgPSBndGtfd2lk
Z2V0X2dldF9zdHlsZShwcm9ncmVzc0JhcldpZGdldCk7Ci0gICAgY2h1bmtSZWN0LnNldEhlaWdo
dChjaHVua1JlY3QuaGVpZ2h0KCkgLSAoMiAqIHN0eWxlLT55dGhpY2tuZXNzKSk7Ci0gICAgY2h1
bmtSZWN0LnNldFkoY2h1bmtSZWN0LnkoKSArIHN0eWxlLT55dGhpY2tuZXNzKTsKLSAgICBjaHVu
a1JlY3Quc2V0V2lkdGgoKGNodW5rUmVjdC53aWR0aCgpIC0gKDIgKiBzdHlsZS0+eHRoaWNrbmVz
cykpICogcmVuZGVyUHJvZ3Jlc3MtPnBvc2l0aW9uKCkpOwotICAgIGlmIChyZW5kZXJPYmplY3Qt
PnN0eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCkKLSAgICAgICAgY2h1bmtSZWN0LnNldFgocmVj
dC54KCkgKyByZWN0LndpZHRoKCkgLSBjaHVua1JlY3Qud2lkdGgoKSAtIHN0eWxlLT54dGhpY2tu
ZXNzKTsKLSAgICBlbHNlCi0gICAgICAgIGNodW5rUmVjdC5zZXRYKGNodW5rUmVjdC54KCkgKyBz
dHlsZS0+eHRoaWNrbmVzcyk7Ci0KLSAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoTU9aX0dU
S19QUk9HUkVTU19DSFVOSywgcmVuZGVyT2JqZWN0LCBwYWludEluZm8uY29udGV4dCwgY2h1bmtS
ZWN0KTsKLX0KICNlbmRpZgogCiB9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9S
ZW5kZXJUaGVtZUd0ay5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsuaApp
bmRleCBjZjQwZmM4Li44MDQxOWJmIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9S
ZW5kZXJUaGVtZUd0ay5oCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3Rr
LmgKQEAgLTI5LDcgKzI5LDkgQEAKICNkZWZpbmUgUmVuZGVyVGhlbWVHdGtfaAogCiAjaW5jbHVk
ZSAiR1JlZlB0ci5oIgorI2lmZGVmIEdUS19BUElfVkVSU0lPTl8yCiAjaW5jbHVkZSAiZ3RrZHJh
d2luZy5oIgorI2VuZGlmCiAjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKIAogbmFtZXNwYWNlIFdl
YkNvcmUgewpAQCAtODMsOSArODUsMTEgQEAgcHVibGljOgogICAgIHZpcnR1YWwgU3RyaW5nIGV4
dHJhTWVkaWFDb250cm9sc1N0eWxlU2hlZXQoKTsKICNlbmRpZgogCi0gICAgdm9pZCBnZXRJbmRp
Y2F0b3JNZXRyaWNzKENvbnRyb2xQYXJ0LCBpbnQmIGluZGljYXRvclNpemUsIGludCYgaW5kaWNh
dG9yU3BhY2luZykgY29uc3Q7CisjaWZuZGVmIEdUS19BUElfVkVSU0lPTl8yCisgICAgR3RrU3R5
bGVDb250ZXh0KiBndGtTY3JvbGxiYXJTdHlsZSgpOworI2VuZGlmCiAKLSAgICBHdGtXaWRnZXQq
IGd0a1Njcm9sbGJhcigpOworICAgIHN0YXRpYyBnaW50IGd0a1RleHREaXJlY3Rpb24oVGV4dERp
cmVjdGlvbik7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRDaGVja2JveChS
ZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcik7CkBA
IC0xNTcsNiArMTYxLDcgQEAgcHJvdGVjdGVkOgogI2VuZGlmCiAKIHByaXZhdGU6CisjaWZkZWYg
R1RLX0FQSV9WRVJTSU9OXzIKICAgICAvKgogICAgICAqIGhvbGQgdGhlIHN0YXRlCiAgICAgICov
CkBAIC0xNzEsMTYgKzE3NiwyMyBAQCBwcml2YXRlOgogICAgIEd0a0NvbnRhaW5lciogZ3RrQ29u
dGFpbmVyKCkgY29uc3Q7CiAKICAgICBib29sIHBhaW50UmVuZGVyT2JqZWN0KEd0a1RoZW1lV2lk
Z2V0VHlwZSwgUmVuZGVyT2JqZWN0KiwgR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYg
cmVjdCwgaW50IGZsYWdzID0gMCk7CisjZW5kaWYKKwogI2lmIEVOQUJMRShWSURFTykKICAgICBi
b29sIHBhaW50TWVkaWFCdXR0b24oUmVuZGVyT2JqZWN0KiwgR3JhcGhpY3NDb250ZXh0KiwgY29u
c3QgSW50UmVjdCYsIGNvbnN0IGNoYXIqIGljb25OYW1lKTsKICNlbmRpZgotICAgIEd0a1N0YXRl
VHlwZSBndGtJY29uU3RhdGUoUmVuZGVyT2JqZWN0Kik7CiAKKyAgICBQbGF0Zm9ybVJlZlB0cjxH
ZGtQaXhidWY+IGdldFN0b2NrSWNvbihHVHlwZSBnVHlwZSwgY29uc3QgY2hhciogaWNvbk5hbWUs
IGdpbnQgZGlyZWN0aW9uLCBnaW50IHN0YXRlLCBnaW50IGljb25TaXplKTsKKyAgICBzdGF0aWMg
dm9pZCBzZXRUZXh0SW5wdXRCb3JkZXJzKFJlbmRlclN0eWxlKik7CisgICAgc3RhdGljIEludFBv
aW50IGNlbnRlclJlY3RWZXJ0aWNhbGx5SW5QYXJlbnRJbnB1dEVsZW1lbnQoUmVuZGVyT2JqZWN0
KiBvYmplY3QsIGNvbnN0IEludFJlY3QmIHJlY3QpOworCisjaWZkZWYgR1RLX0FQSV9WRVJTSU9O
XzIKICAgICBtdXRhYmxlIEd0a1dpZGdldCogbV9ndGtXaW5kb3c7CiAgICAgbXV0YWJsZSBHdGtD
b250YWluZXIqIG1fZ3RrQ29udGFpbmVyOwogICAgIG11dGFibGUgR3RrV2lkZ2V0KiBtX2d0a0J1
dHRvbjsKICAgICBtdXRhYmxlIEd0a1dpZGdldCogbV9ndGtFbnRyeTsKICAgICBtdXRhYmxlIEd0
a1dpZGdldCogbV9ndGtUcmVlVmlldzsKKyNlbmRpZgogCiAgICAgbXV0YWJsZSBDb2xvciBtX3Bh
bmVsQ29sb3I7CiAgICAgbXV0YWJsZSBDb2xvciBtX3NsaWRlckNvbG9yOwpAQCAtMTkxLDExICsy
MDMsOSBAQCBwcml2YXRlOgogICAgIGNvbnN0IGludCBtX21lZGlhU2xpZGVyVGh1bWJXaWR0aDsK
ICAgICBjb25zdCBpbnQgbV9tZWRpYVNsaWRlclRodW1iSGVpZ2h0OwogCi0gICAgR3RrVGhlbWVQ
YXJ0cyBtX3RoZW1lUGFydHM7CiAjaWZkZWYgR1RLX0FQSV9WRVJTSU9OXzIKLSAgICBib29sIG1f
dGhlbWVQYXJ0c0hhdmVSR0JBQ29sb3JtYXA7Ci0jZW5kaWYKICAgICBmcmllbmQgY2xhc3MgV2lk
Z2V0UmVuZGVyaW5nQ29udGV4dDsKKyNlbmRpZgogfTsKIAogfQpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3Rr
L1JlbmRlclRoZW1lR3RrMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
NDg3MjYyYQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRo
ZW1lR3RrMi5jcHAKQEAgLTAsMCArMSw0NzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcg
QXBwbGUgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tlci5j
b20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ29sbGFib3JhIEx0ZC4KKyAqIENvcHlyaWdodCAo
QykgMjAwOSBLZW5uZXRoIFJvaGRlIENocmlzdGlhbnNlbgorICogQ29weXJpZ2h0IChDKSAyMDEw
IElnYWxpYSBTLkwuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
KiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwg
VVNBLgorICoKKyAqLworCisjaWZkZWYgR1RLX0FQSV9WRVJTSU9OXzIKKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIlJlbmRlclRoZW1lR3RrLmgiCisKKyNpbmNsdWRlICJBZmZpbmVU
cmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCisjaW5jbHVkZSAiR093
blB0ci5oIgorI2luY2x1ZGUgIkdyYWRpZW50LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0
LmgiCisjaW5jbHVkZSAiR3RrVmVyc2lvbmluZy5oIgorI2luY2x1ZGUgIkhUTUxNZWRpYUVsZW1l
bnQuaCIKKyNpbmNsdWRlICJIVE1MTmFtZXMuaCIKKyNpbmNsdWRlICJNZWRpYUNvbnRyb2xFbGVt
ZW50cy5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1N
b3VzZUV2ZW50LmgiCisjaW5jbHVkZSAiUmVuZGVyQm94LmgiCisjaW5jbHVkZSAiUmVuZGVyT2Jq
ZWN0LmgiCisjaW5jbHVkZSAiU2Nyb2xsYmFyLmgiCisjaW5jbHVkZSAiVGltZVJhbmdlcy5oIgor
I2luY2x1ZGUgIlVzZXJBZ2VudFN0eWxlU2hlZXRzLmgiCisjaW5jbHVkZSAiV2lkZ2V0UmVuZGVy
aW5nQ29udGV4dC5oIgorI2luY2x1ZGUgImd0a2RyYXdpbmcuaCIKKyNpbmNsdWRlIDxnZGsvZ2Rr
Lmg+CisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4K
KworI2lmIEVOQUJMRShQUk9HUkVTU19UQUcpCisjaW5jbHVkZSAiUmVuZGVyUHJvZ3Jlc3MuaCIK
KyNlbmRpZgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBIVE1MTmFt
ZXM7CisKKyNpZiBFTkFCTEUoVklERU8pCit2b2lkIFJlbmRlclRoZW1lR3RrOjppbml0TWVkaWFD
b2xvcnMoKQoreworICAgIEd0a1N0eWxlKiBzdHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKEdU
S19XSURHRVQoZ3RrQ29udGFpbmVyKCkpKTsKKyAgICBtX3BhbmVsQ29sb3IgPSBzdHlsZS0+Ymdb
R1RLX1NUQVRFX05PUk1BTF07CisgICAgbV9zbGlkZXJDb2xvciA9IHN0eWxlLT5iZ1tHVEtfU1RB
VEVfQUNUSVZFXTsKKyAgICBtX3NsaWRlclRodW1iQ29sb3IgPSBzdHlsZS0+YmdbR1RLX1NUQVRF
X1NFTEVDVEVEXTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IG1vekd0a1JlZkNvdW50ID0gMDsK
KworUmVuZGVyVGhlbWVHdGs6OlJlbmRlclRoZW1lR3RrKCkKKyAgICA6IG1fZ3RrV2luZG93KDAp
CisgICAgLCBtX2d0a0NvbnRhaW5lcigwKQorICAgICwgbV9ndGtCdXR0b24oMCkKKyAgICAsIG1f
Z3RrRW50cnkoMCkKKyAgICAsIG1fZ3RrVHJlZVZpZXcoMCkKKyAgICAsIG1fcGFuZWxDb2xvcihD
b2xvcjo6d2hpdGUpCisgICAgLCBtX3NsaWRlckNvbG9yKENvbG9yOjp3aGl0ZSkKKyAgICAsIG1f
c2xpZGVyVGh1bWJDb2xvcihDb2xvcjo6d2hpdGUpCisgICAgLCBtX21lZGlhSWNvblNpemUoMTYp
CisgICAgLCBtX21lZGlhU2xpZGVySGVpZ2h0KDE0KQorICAgICwgbV9tZWRpYVNsaWRlclRodW1i
V2lkdGgoMTIpCisgICAgLCBtX21lZGlhU2xpZGVyVGh1bWJIZWlnaHQoMTIpCit7CisgICAgLy8g
SW5pdGlhbGl6ZSB0aGUgTW96aWxsYSB0aGVtZSBkcmF3aW5nIGNvZGUuCisgICAgaWYgKCFtb3pH
dGtSZWZDb3VudCkgeworICAgICAgICBHdGtUaGVtZVBhcnRzKiB0aGVtZVBhcnRzID0gZ19uZXcw
KEd0a1RoZW1lUGFydHMsIDEpOworICAgICAgICBHZGtDb2xvcm1hcCogY29sb3JtYXAgPSBnZGtf
c2NyZWVuX2dldF9yZ2JhX2NvbG9ybWFwKGdka19zY3JlZW5fZ2V0X2RlZmF1bHQoKSk7CisgICAg
ICAgIHRoZW1lUGFydHMtPmhhdmVSR0JBQ29sb3JtYXAgPSAhIWNvbG9ybWFwOworICAgICAgICBp
ZiAoIWNvbG9ybWFwKQorICAgICAgICAgICAgY29sb3JtYXAgPSBnZGtfc2NyZWVuX2dldF9kZWZh
dWx0X2NvbG9ybWFwKGdka19zY3JlZW5fZ2V0X2RlZmF1bHQoKSk7CisgICAgICAgIHRoZW1lUGFy
dHMtPmNvbG9ybWFwID0gY29sb3JtYXA7CisgICAgICAgIG1vel9ndGtfaW5pdCgpOworICAgICAg
ICBtb3pfZ3RrX3VzZV90aGVtZV9wYXJ0cyh0aGVtZVBhcnRzKTsKKyAgICB9CisgICAgKyttb3pH
dGtSZWZDb3VudDsKKworI2lmIEVOQUJMRShWSURFTykKKyAgICBpbml0TWVkaWFDb2xvcnMoKTsK
KyAgICBpbml0TWVkaWFCdXR0b25zKCk7CisjZW5kaWYKK30KKworUmVuZGVyVGhlbWVHdGs6On5S
ZW5kZXJUaGVtZUd0aygpCit7CisgICAgLS1tb3pHdGtSZWZDb3VudDsKKworICAgIGlmICghbW96
R3RrUmVmQ291bnQpCisgICAgICAgIG1vel9ndGtfc2h1dGRvd24oKTsKKworICAgIGd0a193aWRn
ZXRfZGVzdHJveShtX2d0a1dpbmRvdyk7Cit9CisKK1BsYXRmb3JtUmVmUHRyPEdka1BpeGJ1Zj4g
UmVuZGVyVGhlbWVHdGs6OmdldFN0b2NrSWNvbihHVHlwZSBnVHlwZSwgY29uc3QgY2hhciogaWNv
bk5hbWUsIGdpbnQgZGlyZWN0aW9uLCBnaW50IHN0YXRlLCBnaW50IGljb25TaXplKQoreworICAg
IEd0a1dpZGdldCogd2lkZ2V0ID0gZ1R5cGUgPT0gR1RLX1RZUEVfQ09OVEFJTkVSID8gR1RLX1dJ
REdFVChndGtDb250YWluZXIoKSkgOiBndGtFbnRyeSgpOworICAgIEd0a1N0eWxlKiBzdHlsZSA9
IGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCk7CisgICAgR3RrSWNvblNldCogaWNvblNldCA9
IGd0a19zdHlsZV9sb29rdXBfaWNvbl9zZXQoc3R5bGUsIGljb25OYW1lKTsKKyAgICByZXR1cm4g
YWRvcHRQbGF0Zm9ybVJlZihndGtfaWNvbl9zZXRfcmVuZGVyX2ljb24oaWNvblNldCwgc3R5bGUs
IHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rpb24+KGRpcmVjdGlvbiksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEd0a1N0
YXRlVHlwZT4oc3RhdGUpLCBzdGF0aWNfY2FzdDxHdGtJY29uU2l6ZT4oaWNvblNpemUpLCAwLCAw
KSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50UmVuZGVyT2JqZWN0KEd0a1RoZW1l
V2lkZ2V0VHlwZSB0eXBlLCBSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgR3JhcGhpY3NDb250
ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgZmxhZ3MpCit7CisgICAgLy8g
UGFpbnRpbmcgaXMgZGlzYWJsZWQgc28ganVzdCBjbGFpbSB0byBoYXZlIHN1Y2NlZWRlZAorICAg
IGlmIChjb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIEd0a1dpZGdldFN0YXRlIHdpZGdldFN0YXRlOworICAgIHdpZGdldFN0YXRlLmFjdGl2
ZSA9IGlzUHJlc3NlZChyZW5kZXJPYmplY3QpOworICAgIHdpZGdldFN0YXRlLmZvY3VzZWQgPSBp
c0ZvY3VzZWQocmVuZGVyT2JqZWN0KTsKKworICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xODM2NAorICAgIC8vIFRoZSBNb3ppbGxhIHRoZW1lIGRyYXdpbmcg
Y29kZSwgb25seSBwYWludHMgYSBidXR0b24gYXMgcHJlc3NlZCB3aGVuIGl0J3MgcHJlc3NlZCAK
KyAgICAvLyB3aGlsZSBob3ZlcmVkLiBVbnRpbCB3ZSBtb3ZlIGF3YXkgZnJvbSB0aGUgTW96aWxh
IGNvZGUsIHdvcmstYXJvdW5kIHRoZSBpc3N1ZSBieQorICAgIC8vIGZvcmNpbmcgYSBwcmVzc2Vk
IGJ1dHRvbiBpbnRvIHRoZSBob3ZlcmVkIHN0YXRlLiBUaGlzIGVuc3VyZXMgdGhhdCBidXR0b25z
IGFjdGl2YXRlZAorICAgIC8vIHZpYSB0aGUga2V5Ym9hcmQgaGF2ZSB0aGUgcHJvcGVyIHJlbmRl
cmluZy4KKyAgICB3aWRnZXRTdGF0ZS5pbkhvdmVyID0gaXNIb3ZlcmVkKHJlbmRlck9iamVjdCkg
fHwgKHR5cGUgPT0gTU9aX0dUS19CVVRUT04gJiYgaXNQcmVzc2VkKHJlbmRlck9iamVjdCkpOwor
CisgICAgLy8gRklYTUU6IERpc2FibGVkIGRvZXMgbm90IGFsd2F5cyBnaXZlIHRoZSBjb3JyZWN0
IGFwcGVhcmFuY2UgZm9yIFJlYWRPbmx5CisgICAgd2lkZ2V0U3RhdGUuZGlzYWJsZWQgPSAhaXNF
bmFibGVkKHJlbmRlck9iamVjdCkgfHwgaXNSZWFkT25seUNvbnRyb2wocmVuZGVyT2JqZWN0KTsK
KyAgICB3aWRnZXRTdGF0ZS5pc0RlZmF1bHQgPSBmYWxzZTsKKyAgICB3aWRnZXRTdGF0ZS5jYW5E
ZWZhdWx0ID0gZmFsc2U7CisKKyAgICAvLyBGSVhNRTogVGhlIGRlcHJlc3NlZCB2YWx1ZSBzaG91
bGQgcHJvYmFibHkgYXBwbHkgZm9yIG90aGVyIHRoZW1lIHBhcnRzIHRvby4KKyAgICAvLyBJdCBt
dXN0IGJlIHVzZWQgZm9yIHJhbmdlIHRodW1icywgYmVjYXVzZSBvdGhlcndpc2Ugd2hlbiB0aGUg
dGh1bWIgaXMgcHJlc3NlZCwKKyAgICAvLyB0aGUgcmVuZGVyaW5nIGlzIGluY29ycmVjdC4KKyAg
ICBpZiAodHlwZSA9PSBNT1pfR1RLX1NDQUxFX1RIVU1CX0hPUklaT05UQUwgfHwgdHlwZSA9PSBN
T1pfR1RLX1NDQUxFX1RIVU1CX1ZFUlRJQ0FMKQorICAgICAgICB3aWRnZXRTdGF0ZS5kZXByZXNz
ZWQgPSBpc1ByZXNzZWQocmVuZGVyT2JqZWN0KTsKKyAgICBlbHNlCisgICAgICAgIHdpZGdldFN0
YXRlLmRlcHJlc3NlZCA9IGZhbHNlOworCisgICAgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dCB3aWRn
ZXRDb250ZXh0KGNvbnRleHQsIHJlY3QpOworICAgIHJldHVybiAhd2lkZ2V0Q29udGV4dC5wYWlu
dE1vemlsbGFXaWRnZXQodHlwZSwgJndpZGdldFN0YXRlLCBmbGFncywgc3RhdGljX2Nhc3Q8R3Rr
VGV4dERpcmVjdGlvbj4oZ3RrVGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3QtPnN0eWxlKCktPmRp
cmVjdGlvbigpKSkpOworfQorCitzdGF0aWMgdm9pZCBzZXRUb2dnbGVTaXplKGNvbnN0IFJlbmRl
clRoZW1lR3RrKiB0aGVtZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBDb250cm9sUGFydCBhcHBlYXJh
bmNlKQoreworICAgIC8vIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBib3RoIHNwZWNpZmllZCwg
c28gd2Ugc2hvdWxkbid0IGNoYW5nZSB0aGVtLgorICAgIGlmICghc3R5bGUtPndpZHRoKCkuaXNJ
bnRyaW5zaWNPckF1dG8oKSAmJiAhc3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBwcm9iYWJseSBub3QgY29ycmVjdCB1c2Ug
b2YgaW5kaWNhdG9yU2l6ZSBhbmQgaW5kaWNhdG9yU3BhY2luZy4KKyAgICBnaW50IGluZGljYXRv
clNpemUsIGluZGljYXRvclNwYWNpbmc7CisgICAgaWYgKGFwcGVhcmFuY2UgPT0gQ2hlY2tib3hQ
YXJ0KQorICAgICAgICBtb3pfZ3RrX2NoZWNrYm94X2dldF9tZXRyaWNzKCZpbmRpY2F0b3JTaXpl
LCAmaW5kaWNhdG9yU3BhY2luZyk7CisgICAgZWxzZQorICAgICAgICBtb3pfZ3RrX3JhZGlvX2dl
dF9tZXRyaWNzKCZpbmRpY2F0b3JTaXplLCAmaW5kaWNhdG9yU3BhY2luZyk7CisKKyAgICAvLyBP
dGhlciBwb3J0cyBoYXJkLWNvZGUgdGhpcyB0byAxMywgYnV0IEdUSysgdXNlcnMgdGVuZCB0byBk
ZW1hbmQgdGhlIG5hdGl2ZSBsb29rLgorICAgIC8vIEl0IGNvdWxkIGJlIG1hZGUgYSBjb25maWd1
cmF0aW9uIG9wdGlvbiB2YWx1ZXMgb3RoZXIgdGhhbiAxMyBhY3R1YWxseSBicmVhayBzaXRlIGNv
bXBhdGliaWxpdHkuCisgICAgaW50IGxlbmd0aCA9IGluZGljYXRvclNpemUgKyBpbmRpY2F0b3JT
cGFjaW5nOworICAgIGlmIChzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKQorICAg
ICAgICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKGxlbmd0aCwgRml4ZWQpKTsKKworICAgIGlmIChz
dHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkpCisgICAgICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3Ro
KGxlbmd0aCwgRml4ZWQpKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0Q2hlY2tib3hT
aXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBzZXRUb2dnbGVTaXplKHRoaXMs
IHN0eWxlLCBSYWRpb1BhcnQpOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludENoZWNr
Ym94KFJlbmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiBy
ZWN0KQoreworICAgIHJldHVybiBwYWludFJlbmRlck9iamVjdChNT1pfR1RLX0NIRUNLQlVUVE9O
LCBvLCBpLmNvbnRleHQsIHJlY3QsIGlzQ2hlY2tlZChvKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhl
bWVHdGs6OnNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgc2V0
VG9nZ2xlU2l6ZSh0aGlzLCBzdHlsZSwgUmFkaW9QYXJ0KTsKK30KKworYm9vbCBSZW5kZXJUaGVt
ZUd0azo6cGFpbnRSYWRpbyhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgaSwgY29u
c3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoTU9aX0dU
S19SQURJT0JVVFRPTiwgbywgaS5jb250ZXh0LCByZWN0LCBpc0NoZWNrZWQobykpOworfQorCiti
b29sIFJlbmRlclRoZW1lR3RrOjpwYWludEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBh
aW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRSZW5k
ZXJPYmplY3QoTU9aX0dUS19CVVRUT04sIG8sIGkuY29udGV4dCwgcmVjdCwgR1RLX1JFTElFRl9O
T1JNQUwpOworfQorCitzdGF0aWMgdm9pZCBnZXRDb21ib0JveFBhZGRpbmcoUmVuZGVyU3R5bGUq
IHN0eWxlLCBpbnQmIGxlZnQsIGludCYgdG9wLCBpbnQmIHJpZ2h0LCBpbnQmIGJvdHRvbSkKK3sK
KyAgICAvLyBJZiB0aGlzIG1lbnUgbGlzdCBidXR0b24gaXNuJ3QgZHJhd24gdXNpbmcgdGhlIG5h
dGl2ZSB0aGVtZSwgd2UKKyAgICAvLyBkb24ndCBhZGQgYW55IGV4dHJhIHBhZGRpbmcgYmV5b25k
IHdoYXQgV2ViQ29yZSBhbHJlYWR5IHVzZXMuCisgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkg
PT0gTm9Db250cm9sUGFydCkKKyAgICAgICAgcmV0dXJuOworICAgIG1vel9ndGtfZ2V0X3dpZGdl
dF9ib3JkZXIoTU9aX0dUS19EUk9QRE9XTiwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rp
b24+KFJlbmRlclRoZW1lR3RrOjpndGtUZXh0RGlyZWN0aW9uKHN0eWxlLT5kaXJlY3Rpb24oKSkp
LCBUUlVFKTsKK30KKworaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ0xl
ZnQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIGludCBsZWZ0ID0gMCwgdG9wID0g
MCwgcmlnaHQgPSAwLCBib3R0b20gPSAwOworICAgIGdldENvbWJvQm94UGFkZGluZyhzdHlsZSwg
bGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKyAgICByZXR1cm4gbGVmdDsKK30KKworaW50IFJl
bmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ1JpZ2h0KFJlbmRlclN0eWxlKiBzdHls
ZSkgY29uc3QKK3sKKyAgICBpbnQgbGVmdCA9IDAsIHRvcCA9IDAsIHJpZ2h0ID0gMCwgYm90dG9t
ID0gMDsKKyAgICBnZXRDb21ib0JveFBhZGRpbmcoc3R5bGUsIGxlZnQsIHRvcCwgcmlnaHQsIGJv
dHRvbSk7CisgICAgcmV0dXJuIHJpZ2h0OworfQorCitpbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVw
SW50ZXJuYWxQYWRkaW5nVG9wKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBpbnQg
bGVmdCA9IDAsIHRvcCA9IDAsIHJpZ2h0ID0gMCwgYm90dG9tID0gMDsKKyAgICBnZXRDb21ib0Jv
eFBhZGRpbmcoc3R5bGUsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgcmV0dXJuIHRv
cDsKK30KKworaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ0JvdHRvbShS
ZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgaW50IGxlZnQgPSAwLCB0b3AgPSAwLCBy
aWdodCA9IDAsIGJvdHRvbSA9IDA7CisgICAgZ2V0Q29tYm9Cb3hQYWRkaW5nKHN0eWxlLCBsZWZ0
LCB0b3AsIHJpZ2h0LCBib3R0b20pOworICAgIHJldHVybiBib3R0b207Cit9CisKK2Jvb2wgUmVu
ZGVyVGhlbWVHdGs6OnBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludElu
Zm8mIGksIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50UmVuZGVyT2Jq
ZWN0KE1PWl9HVEtfRFJPUERPV04sIG8sIGkuY29udGV4dCwgcmVjdCk7Cit9CisKK3ZvaWQgUmVu
ZGVyVGhlbWVHdGs6OnNldFRleHRJbnB1dEJvcmRlcnMoUmVuZGVyU3R5bGUqIHN0eWxlKQorewor
ICAgIC8vIElmIHRoaXMgY29udHJvbCBpc24ndCBkcmF3biB1c2luZyB0aGUgbmF0aXZlIHRoZW1l
LCB3ZSBkb24ndCB0b3VjaCB0aGUgYm9yZGVycy4KKyAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2Uo
KSA9PSBOb0NvbnRyb2xQYXJ0KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBXZSBjYW5ub3Qg
Z2l2ZSBhIHByb3BlciByZW5kZXJpbmcgd2hlbiBib3JkZXIgcmFkaXVzIGlzIGFjdGl2ZSwgdW5m
b3J0dW5hdGVseS4KKyAgICBzdHlsZS0+cmVzZXRCb3JkZXJSYWRpdXMoKTsKKworICAgIGludCBs
ZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSAwLCBib3R0b20gPSAwOworICAgIG1vel9ndGtfZ2V0
X3dpZGdldF9ib3JkZXIoTU9aX0dUS19FTlRSWSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRv
bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEd0a1RleHREaXJl
Y3Rpb24+KGd0a1RleHREaXJlY3Rpb24oc3R5bGUtPmRpcmVjdGlvbigpKSksIFRSVUUpOworICAg
IHN0eWxlLT5zZXRCb3JkZXJMZWZ0V2lkdGgobGVmdCk7CisgICAgc3R5bGUtPnNldEJvcmRlclRv
cFdpZHRoKHRvcCk7CisgICAgc3R5bGUtPnNldEJvcmRlclJpZ2h0V2lkdGgocmlnaHQpOworICAg
IHN0eWxlLT5zZXRCb3JkZXJCb3R0b21XaWR0aChib3R0b20pOworfQorCitib29sIFJlbmRlclRo
ZW1lR3RrOjpwYWludFRleHRGaWVsZChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYg
aSwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3Qo
TU9aX0dUS19FTlRSWSwgbywgaS5jb250ZXh0LCByZWN0KTsKK30KKworYm9vbCBSZW5kZXJUaGVt
ZUd0azo6cGFpbnRTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJ
bmZvJiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIENvbnRyb2xQYXJ0IHBhcnQg
PSBvYmplY3QtPnN0eWxlKCktPmFwcGVhcmFuY2UoKTsKKyAgICBBU1NFUlQocGFydCA9PSBTbGlk
ZXJIb3Jpem9udGFsUGFydCB8fCBwYXJ0ID09IFNsaWRlclZlcnRpY2FsUGFydCk7CisKKyAgICBH
dGtUaGVtZVdpZGdldFR5cGUgZ3RrUGFydCA9IE1PWl9HVEtfU0NBTEVfSE9SSVpPTlRBTDsKKyAg
ICBpZiAocGFydCA9PSBTbGlkZXJWZXJ0aWNhbFBhcnQpCisgICAgICAgIGd0a1BhcnQgPSBNT1pf
R1RLX1NDQUxFX1ZFUlRJQ0FMOworCisgICAgcmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0KGd0a1Bh
cnQsIG9iamVjdCwgaW5mby5jb250ZXh0LCByZWN0KTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0
azo6cGFpbnRTbGlkZXJUaHVtYihSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZv
JiBpbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIENvbnRyb2xQYXJ0IHBhcnQgPSBv
YmplY3QtPnN0eWxlKCktPmFwcGVhcmFuY2UoKTsKKyAgICBBU1NFUlQocGFydCA9PSBTbGlkZXJU
aHVtYkhvcml6b250YWxQYXJ0IHx8IHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpOwor
CisgICAgR3RrVGhlbWVXaWRnZXRUeXBlIGd0a1BhcnQgPSBNT1pfR1RLX1NDQUxFX1RIVU1CX0hP
UklaT05UQUw7CisgICAgaWYgKHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpCisgICAg
ICAgIGd0a1BhcnQgPSBNT1pfR1RLX1NDQUxFX1RIVU1CX1ZFUlRJQ0FMOworCisgICAgcmV0dXJu
IHBhaW50UmVuZGVyT2JqZWN0KGd0a1BhcnQsIG9iamVjdCwgaW5mby5jb250ZXh0LCByZWN0KTsK
K30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0U2xpZGVyVGh1bWJTaXplKFJlbmRlck9i
amVjdCogbykgY29uc3QKK3sKKyAgICBDb250cm9sUGFydCBwYXJ0ID0gby0+c3R5bGUoKS0+YXBw
ZWFyYW5jZSgpOworI2lmIEVOQUJMRShWSURFTykKKyAgICBpZiAocGFydCA9PSBNZWRpYVNsaWRl
clRodW1iUGFydCkgeworICAgICAgICBvLT5zdHlsZSgpLT5zZXRXaWR0aChMZW5ndGgobV9tZWRp
YVNsaWRlclRodW1iV2lkdGgsIEZpeGVkKSk7CisgICAgICAgIG8tPnN0eWxlKCktPnNldEhlaWdo
dChMZW5ndGgobV9tZWRpYVNsaWRlclRodW1iSGVpZ2h0LCBGaXhlZCkpOworICAgIH0gZWxzZQor
I2VuZGlmCisgICAgaWYgKHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCB8fCBwYXJ0
ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KSB7CisgICAgICAgIGdpbnQgd2lkdGgsIGhlaWdo
dDsKKyAgICAgICAgbW96X2d0a19nZXRfc2NhbGV0aHVtYl9tZXRyaWNzKHBhcnQgPT0gU2xpZGVy
VGh1bWJIb3Jpem9udGFsUGFydCA/IEdUS19PUklFTlRBVElPTl9IT1JJWk9OVEFMIDogR1RLX09S
SUVOVEFUSU9OX1ZFUlRJQ0FMLCAmd2lkdGgsICZoZWlnaHQpOworICAgICAgICBvLT5zdHlsZSgp
LT5zZXRXaWR0aChMZW5ndGgod2lkdGgsIEZpeGVkKSk7CisgICAgICAgIG8tPnN0eWxlKCktPnNl
dEhlaWdodChMZW5ndGgoaGVpZ2h0LCBGaXhlZCkpOworICAgIH0KK30KKworQ29sb3IgUmVuZGVy
VGhlbWVHdGs6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QK
K3sKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a0VudHJ5KCk7CisgICAgcmV0dXJuIGd0a193
aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPmJhc2VbR1RLX1NUQVRFX1NFTEVDVEVEXTsKK30KKwor
Q29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5k
Q29sb3IoKSBjb25zdAoreworICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrRW50cnkoKTsKKyAg
ICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+YmFzZVtHVEtfU1RBVEVfQUNU
SVZFXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9u
Rm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a0Vu
dHJ5KCk7CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPnRleHRbR1RL
X1NUQVRFX1NFTEVDVEVEXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtSW5h
Y3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIEd0a1dpZGdldCog
d2lkZ2V0ID0gZ3RrRW50cnkoKTsKKyAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lk
Z2V0KS0+dGV4dFtHVEtfU1RBVEVfQUNUSVZFXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6
OmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIEd0
a1dpZGdldCogd2lkZ2V0ID0gZ3RrVHJlZVZpZXcoKTsKKyAgICByZXR1cm4gZ3RrX3dpZGdldF9n
ZXRfc3R5bGUod2lkZ2V0KS0+YmFzZVtHVEtfU1RBVEVfU0VMRUNURURdOworfQorCitDb2xvciBS
ZW5kZXJUaGVtZUd0azo6aW5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkg
Y29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a1RyZWVWaWV3KCk7CisgICAgcmV0
dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPmJhc2VbR1RLX1NUQVRFX0FDVElWRV07
Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjphY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdy
b3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a1RyZWVWaWV3
KCk7CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPnRleHRbR1RLX1NU
QVRFX1NFTEVDVEVEXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OmluYWN0aXZlTGlzdEJv
eFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgR3RrV2lkZ2V0KiB3aWRn
ZXQgPSBndGtUcmVlVmlldygpOworICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRn
ZXQpLT50ZXh0W0dUS19TVEFURV9BQ1RJVkVdOworfQorCitDb2xvciBSZW5kZXJUaGVtZUd0azo6
c3lzdGVtQ29sb3IoaW50IGNzc1ZhbHVlSWQpIGNvbnN0Cit7CisgICAgc3dpdGNoIChjc3NWYWx1
ZUlkKSB7CisgICAgY2FzZSBDU1NWYWx1ZUJ1dHRvbnRleHQ6CisgICAgICAgIHJldHVybiBDb2xv
cihndGtfd2lkZ2V0X2dldF9zdHlsZShndGtCdXR0b24oKSktPmZnW0dUS19TVEFURV9OT1JNQUxd
KTsKKyAgICBjYXNlIENTU1ZhbHVlQ2FwdGlvbnRleHQ6CisgICAgICAgIHJldHVybiBDb2xvcihn
dGtfd2lkZ2V0X2dldF9zdHlsZShndGtFbnRyeSgpKS0+ZmdbR1RLX1NUQVRFX05PUk1BTF0pOwor
ICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBSZW5kZXJUaGVtZTo6c3lzdGVtQ29sb3IoY3Nz
VmFsdWVJZCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBndGtTdHlsZVNldENhbGxiYWNrKEd0
a1dpZGdldCogd2lkZ2V0LCBHdGtTdHlsZSogcHJldmlvdXMsIFJlbmRlclRoZW1lKiByZW5kZXJU
aGVtZSkKK3sKKyAgICAvLyBGSVhNRTogTWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBn
ZXQgY2FsbGVkIG1hbnkgdGltZXMgZm9yIGEgc2luZ2xlIEdUSysgc3R5bGUgY2hhbmdlIHNpZ25h
bC4KKyAgICByZW5kZXJUaGVtZS0+cGxhdGZvcm1Db2xvcnNEaWRDaGFuZ2UoKTsKK30KKworR3Rr
Q29udGFpbmVyKiBSZW5kZXJUaGVtZUd0azo6Z3RrQ29udGFpbmVyKCkgY29uc3QKK3sKKyAgICBp
ZiAobV9ndGtDb250YWluZXIpCisgICAgICAgIHJldHVybiBtX2d0a0NvbnRhaW5lcjsKKworICAg
IG1fZ3RrV2luZG93ID0gZ3RrX3dpbmRvd19uZXcoR1RLX1dJTkRPV19QT1BVUCk7CisgICAgbV9n
dGtDb250YWluZXIgPSBHVEtfQ09OVEFJTkVSKGd0a19maXhlZF9uZXcoKSk7CisgICAgZ19zaWdu
YWxfY29ubmVjdChtX2d0a1dpbmRvdywgInN0eWxlLXNldCIsIEdfQ0FMTEJBQ0soZ3RrU3R5bGVT
ZXRDYWxsYmFjayksIGNvbnN0X2Nhc3Q8UmVuZGVyVGhlbWVHdGsqPih0aGlzKSk7CisgICAgZ3Rr
X2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUihtX2d0a1dpbmRvdyksIEdUS19XSURHRVQobV9n
dGtDb250YWluZXIpKTsKKyAgICBndGtfd2lkZ2V0X3JlYWxpemUobV9ndGtXaW5kb3cpOworCisg
ICAgcmV0dXJuIG1fZ3RrQ29udGFpbmVyOworfQorCitHdGtXaWRnZXQqIFJlbmRlclRoZW1lR3Rr
OjpndGtCdXR0b24oKSBjb25zdAoreworICAgIGlmIChtX2d0a0J1dHRvbikKKyAgICAgICAgcmV0
dXJuIG1fZ3RrQnV0dG9uOworCisgICAgbV9ndGtCdXR0b24gPSBndGtfYnV0dG9uX25ldygpOwor
ICAgIGdfc2lnbmFsX2Nvbm5lY3QobV9ndGtCdXR0b24sICJzdHlsZS1zZXQiLCBHX0NBTExCQUNL
KGd0a1N0eWxlU2V0Q2FsbGJhY2spLCBjb25zdF9jYXN0PFJlbmRlclRoZW1lR3RrKj4odGhpcykp
OworICAgIGd0a19jb250YWluZXJfYWRkKGd0a0NvbnRhaW5lcigpLCBtX2d0a0J1dHRvbik7Cisg
ICAgZ3RrX3dpZGdldF9yZWFsaXplKG1fZ3RrQnV0dG9uKTsKKworICAgIHJldHVybiBtX2d0a0J1
dHRvbjsKK30KKworR3RrV2lkZ2V0KiBSZW5kZXJUaGVtZUd0azo6Z3RrRW50cnkoKSBjb25zdAor
eworICAgIGlmIChtX2d0a0VudHJ5KQorICAgICAgICByZXR1cm4gbV9ndGtFbnRyeTsKKworICAg
IG1fZ3RrRW50cnkgPSBndGtfZW50cnlfbmV3KCk7CisgICAgZ19zaWduYWxfY29ubmVjdChtX2d0
a0VudHJ5LCAic3R5bGUtc2V0IiwgR19DQUxMQkFDSyhndGtTdHlsZVNldENhbGxiYWNrKSwgY29u
c3RfY2FzdDxSZW5kZXJUaGVtZUd0ayo+KHRoaXMpKTsKKyAgICBndGtfY29udGFpbmVyX2FkZChn
dGtDb250YWluZXIoKSwgbV9ndGtFbnRyeSk7CisgICAgZ3RrX3dpZGdldF9yZWFsaXplKG1fZ3Rr
RW50cnkpOworCisgICAgcmV0dXJuIG1fZ3RrRW50cnk7Cit9CisKK0d0a1dpZGdldCogUmVuZGVy
VGhlbWVHdGs6Omd0a1RyZWVWaWV3KCkgY29uc3QKK3sKKyAgICBpZiAobV9ndGtUcmVlVmlldykK
KyAgICAgICAgcmV0dXJuIG1fZ3RrVHJlZVZpZXc7CisKKyAgICBtX2d0a1RyZWVWaWV3ID0gZ3Rr
X3RyZWVfdmlld19uZXcoKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0KG1fZ3RrVHJlZVZpZXcsICJz
dHlsZS1zZXQiLCBHX0NBTExCQUNLKGd0a1N0eWxlU2V0Q2FsbGJhY2spLCBjb25zdF9jYXN0PFJl
bmRlclRoZW1lR3RrKj4odGhpcykpOworICAgIGd0a19jb250YWluZXJfYWRkKGd0a0NvbnRhaW5l
cigpLCBtX2d0a1RyZWVWaWV3KTsKKyAgICBndGtfd2lkZ2V0X3JlYWxpemUobV9ndGtUcmVlVmll
dyk7CisKKyAgICByZXR1cm4gbV9ndGtUcmVlVmlldzsKK30KKworI2lmIEVOQUJMRShQUk9HUkVT
U19UQUcpCitkb3VibGUgUmVuZGVyVGhlbWVHdGs6OmFuaW1hdGlvblJlcGVhdEludGVydmFsRm9y
UHJvZ3Jlc3NCYXIoUmVuZGVyUHJvZ3Jlc3MqKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBJdCBk
b2Vzbid0IGxvb2sgbGlrZSB0aGVyZSBpcyBhIGdvb2Qgd2F5IHlldCB0byBzdXBwb3J0IGFuaW1h
dGVkCisgICAgLy8gcHJvZ3Jlc3MgYmFycyB3aXRoIHRoZSBNb3ppbGxhIHRoZW1lIGRyYXdpbmcg
Y29kZS4KKyAgICByZXR1cm4gMDsKK30KKworZG91YmxlIFJlbmRlclRoZW1lR3RrOjphbmltYXRp
b25EdXJhdGlvbkZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKikgY29uc3QKK3sKKyAgICAv
LyBGSVhNRTogSXQgZG9lc24ndCBsb29rIGxpa2UgdGhlcmUgaXMgYSBnb29kIHdheSB5ZXQgdG8g
c3VwcG9ydCBhbmltYXRlZAorICAgIC8vIHByb2dyZXNzIGJhcnMgd2l0aCB0aGUgTW96aWxsYSB0
aGVtZSBkcmF3aW5nIGNvZGUuCisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVH
dGs6OnBhaW50UHJvZ3Jlc3NCYXIoUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIGNvbnN0IFBh
aW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmICghcmVu
ZGVyT2JqZWN0LT5pc1Byb2dyZXNzKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgR3Rr
V2lkZ2V0KiBwcm9ncmVzc0JhcldpZGdldCA9IG1vel9ndGtfZ2V0X3Byb2dyZXNzX3dpZGdldCgp
OworICAgIGlmICghcHJvZ3Jlc3NCYXJXaWRnZXQpCisgICAgICAgIHJldHVybiB0cnVlOworCisg
ICAgaWYgKHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtfUFJPR1JFU1NCQVIsIHJlbmRlck9iamVj
dCwgcGFpbnRJbmZvLmNvbnRleHQsIHJlY3QpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAg
IEludFJlY3QgY2h1bmtSZWN0KHJlY3QpOworICAgIFJlbmRlclByb2dyZXNzKiByZW5kZXJQcm9n
cmVzcyA9IHRvUmVuZGVyUHJvZ3Jlc3MocmVuZGVyT2JqZWN0KTsKKworICAgIEd0a1N0eWxlKiBz
dHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKHByb2dyZXNzQmFyV2lkZ2V0KTsKKyAgICBjaHVu
a1JlY3Quc2V0SGVpZ2h0KGNodW5rUmVjdC5oZWlnaHQoKSAtICgyICogc3R5bGUtPnl0aGlja25l
c3MpKTsKKyAgICBjaHVua1JlY3Quc2V0WShjaHVua1JlY3QueSgpICsgc3R5bGUtPnl0aGlja25l
c3MpOworICAgIGNodW5rUmVjdC5zZXRXaWR0aCgoY2h1bmtSZWN0LndpZHRoKCkgLSAoMiAqIHN0
eWxlLT54dGhpY2tuZXNzKSkgKiByZW5kZXJQcm9ncmVzcy0+cG9zaXRpb24oKSk7CisgICAgaWYg
KHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gUlRMKQorICAgICAgICBjaHVu
a1JlY3Quc2V0WChyZWN0LngoKSArIHJlY3Qud2lkdGgoKSAtIGNodW5rUmVjdC53aWR0aCgpIC0g
c3R5bGUtPnh0aGlja25lc3MpOworICAgIGVsc2UKKyAgICAgICAgY2h1bmtSZWN0LnNldFgoY2h1
bmtSZWN0LngoKSArIHN0eWxlLT54dGhpY2tuZXNzKTsKKworICAgIHJldHVybiBwYWludFJlbmRl
ck9iamVjdChNT1pfR1RLX1BST0dSRVNTX0NIVU5LLCByZW5kZXJPYmplY3QsIHBhaW50SW5mby5j
b250ZXh0LCBjaHVua1JlY3QpOworfQorI2VuZGlmCisKK30KKworI2VuZGlmIC8vIEdUS19BUElf
VkVSU0lPTl8yCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVt
ZUd0ay5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0ay5jcHAKaW5k
ZXggMTBmN2U3MS4uNGM5ZmQ2NCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvU2Ny
b2xsYmFyVGhlbWVHdGsuY3BwCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1Njcm9sbGJhclRo
ZW1lR3RrLmNwcApAQCAtMzAsMTQgKzMwLDExIEBACiAjaW5jbHVkZSAiUmVuZGVyVGhlbWVHdGsu
aCIKICNpbmNsdWRlICJTY3JvbGxWaWV3LmgiCiAjaW5jbHVkZSAiU2Nyb2xsYmFyLmgiCi0jaW5j
bHVkZSAiV2lkZ2V0UmVuZGVyaW5nQ29udGV4dC5oIgotI2luY2x1ZGUgImd0a2RyYXdpbmcuaCIK
ICNpbmNsdWRlIDxndGsvZ3RrLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogc3RhdGljIEhh
c2hTZXQ8U2Nyb2xsYmFyKj4qIGdTY3JvbGxiYXJzOwotc3RhdGljIHZvaWQgZ3RrU3R5bGVTZXRD
YWxsYmFjayhHdGtXaWRnZXQqLCBHdGtTdHlsZSosIFNjcm9sbGJhclRoZW1lR3RrKik7CiAKIFNj
cm9sbGJhclRoZW1lKiBTY3JvbGxiYXJUaGVtZTo6bmF0aXZlVGhlbWUoKQogewpAQCAtNDUsMTcg
KzQyLDE0IEBAIFNjcm9sbGJhclRoZW1lKiBTY3JvbGxiYXJUaGVtZTo6bmF0aXZlVGhlbWUoKQog
ICAgIHJldHVybiAmdGhlbWU7CiB9CiAKLVNjcm9sbGJhclRoZW1lR3RrOjpTY3JvbGxiYXJUaGVt
ZUd0aygpCitTY3JvbGxiYXJUaGVtZUd0azo6flNjcm9sbGJhclRoZW1lR3RrKCkKIHsKLSAgICB1
cGRhdGVUaGVtZVByb3BlcnRpZXMoKTsKLSAgICBnX3NpZ25hbF9jb25uZWN0KHN0YXRpY19jYXN0
PFJlbmRlclRoZW1lR3RrKj4oUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLmdldCgpKS0+Z3Rr
U2Nyb2xsYmFyKCksCi0gICAgICAgICAic3R5bGUtc2V0IiwgR19DQUxMQkFDSyhndGtTdHlsZVNl
dENhbGxiYWNrKSwgdGhpcyk7CiB9CiAKLVNjcm9sbGJhclRoZW1lR3RrOjp+U2Nyb2xsYmFyVGhl
bWVHdGsoKQorY29uc3QgSGFzaFNldDxTY3JvbGxiYXIqPiogU2Nyb2xsYmFyVGhlbWVHdGs6Omdl
dFNjcm9sbGJhcnMoKQogeworICAgIHJldHVybiBnU2Nyb2xsYmFyczsKIH0KLQogdm9pZCBTY3Jv
bGxiYXJUaGVtZUd0azo6cmVnaXN0ZXJTY3JvbGxiYXIoU2Nyb2xsYmFyKiBzY3JvbGxiYXIpCiB7
CiAgICAgaWYgKCFnU2Nyb2xsYmFycykKQEAgLTcyLDQ4ICs2Niw2IEBAIHZvaWQgU2Nyb2xsYmFy
VGhlbWVHdGs6OnVucmVnaXN0ZXJTY3JvbGxiYXIoU2Nyb2xsYmFyKiBzY3JvbGxiYXIpCiAgICAg
fQogfQogCi12b2lkIFNjcm9sbGJhclRoZW1lR3RrOjp1cGRhdGVUaGVtZVByb3BlcnRpZXMoKQot
ewotICAgIE1vekd0a1Njcm9sbGJhck1ldHJpY3MgbWV0cmljczsKLSAgICBtb3pfZ3RrX2dldF9z
Y3JvbGxiYXJfbWV0cmljcygmbWV0cmljcyk7Ci0KLSAgICBtX3RodW1iRmF0bmVzcyA9IG1ldHJp
Y3Muc2xpZGVyX3dpZHRoOwotICAgIG1fdHJvdWdoQm9yZGVyV2lkdGggPSBtZXRyaWNzLnRyb3Vn
aF9ib3JkZXI7Ci0gICAgbV9zdGVwcGVyU2l6ZSA9IG1ldHJpY3Muc3RlcHBlcl9zaXplOwotICAg
IG1fc3RlcHBlclNwYWNpbmcgPSBtZXRyaWNzLnN0ZXBwZXJfc3BhY2luZzsKLSAgICBtX21pblRo
dW1iTGVuZ3RoID0gbWV0cmljcy5taW5fc2xpZGVyX3NpemU7Ci0gICAgbV90cm91Z2hVbmRlclN0
ZXBwZXJzID0gbWV0cmljcy50cm91Z2hfdW5kZXJfc3RlcHBlcnM7Ci0gICAgbV9oYXNGb3J3YXJk
QnV0dG9uU3RhcnRQYXJ0ID0gbWV0cmljcy5oYXNfc2Vjb25kYXJ5X2ZvcndhcmRfc3RlcHBlcjsK
LSAgICBtX2hhc0JhY2tCdXR0b25FbmRQYXJ0ID0gbWV0cmljcy5oYXNfc2Vjb25kYXJ5X2JhY2t3
YXJkX3N0ZXBwZXI7Ci0KLSAgICBpZiAoIWdTY3JvbGxiYXJzKQotICAgICAgICByZXR1cm47Ci0K
LSAgICAvLyBVcGRhdGUgdGhlIHRoaWNrbmVzcyBvZiBldmVyeSBpbnRlcmlvciBmcmFtZSBzY3Jv
bGxiYXIgd2lkZ2V0LiBUaGUKLSAgICAvLyBwbGF0Zm9ybS1pbmRlcGVuZGVudCBzY3JvbGxiYXIg
dGhlbSBjb2RlIGlzbid0IHlldCBzbWFydCBlbm91Z2ggdG8gZ2V0Ci0gICAgLy8gdGhpcyBpbmZv
cm1hdGlvbiB3aGVuIGl0IHBhaW50cy4KLSAgICBIYXNoU2V0PFNjcm9sbGJhcio+OjppdGVyYXRv
ciBlbmQgPSBnU2Nyb2xsYmFycy0+ZW5kKCk7Ci0gICAgZm9yIChIYXNoU2V0PFNjcm9sbGJhcio+
OjppdGVyYXRvciBpdCA9IGdTY3JvbGxiYXJzLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsK
LSAgICAgICAgU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSAoKml0KTsKLQotICAgICAgICAvLyBUb3At
bGV2ZWwgc2Nyb2xsYmFyIGkuZS4gc2Nyb2xsYmFycyB3aG8gaGF2ZSBhIHBhcmVudCBTY3JvbGxW
aWV3Ci0gICAgICAgIC8vIHdpdGggbm8gcGFyZW50IGFyZSBuYXRpdmUsIGFuZCB0aHVzIGRvIG5v
dCBuZWVkIHRvIGJlIHJlc2l6ZWQuCi0gICAgICAgIGlmICghc2Nyb2xsYmFyLT5wYXJlbnQoKSB8
fCAhc2Nyb2xsYmFyLT5wYXJlbnQoKS0+cGFyZW50KCkpCi0gICAgICAgICAgICByZXR1cm47Ci0K
LSAgICAgICAgaW50IHRoaWNrbmVzcyA9IHNjcm9sbGJhclRoaWNrbmVzcyhzY3JvbGxiYXItPmNv
bnRyb2xTaXplKCkpOwotICAgICAgICBpZiAoc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IEhv
cml6b250YWxTY3JvbGxiYXIpCi0gICAgICAgICAgICBzY3JvbGxiYXItPnNldEZyYW1lUmVjdChJ
bnRSZWN0KDAsIHNjcm9sbGJhci0+cGFyZW50KCktPmhlaWdodCgpIC0gdGhpY2tuZXNzLCBzY3Jv
bGxiYXItPndpZHRoKCksIHRoaWNrbmVzcykpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBz
Y3JvbGxiYXItPnNldEZyYW1lUmVjdChJbnRSZWN0KHNjcm9sbGJhci0+cGFyZW50KCktPndpZHRo
KCkgLSB0aGlja25lc3MsIDAsIHRoaWNrbmVzcywgc2Nyb2xsYmFyLT5oZWlnaHQoKSkpOwotICAg
IH0KLX0KLQotc3RhdGljIHZvaWQgZ3RrU3R5bGVTZXRDYWxsYmFjayhHdGtXaWRnZXQqIHdpZGdl
dCwgR3RrU3R5bGUqIHByZXZpb3VzLCBTY3JvbGxiYXJUaGVtZUd0ayogc2Nyb2xsYmFyVGhlbWUp
Ci17Ci0gICAgc2Nyb2xsYmFyVGhlbWUtPnVwZGF0ZVRoZW1lUHJvcGVydGllcygpOwotfQotCiBi
b29sIFNjcm9sbGJhclRoZW1lR3RrOjpoYXNUaHVtYihTY3JvbGxiYXIqIHNjcm9sbGJhcikKIHsK
ICAgICAvLyBUaGlzIG1ldGhvZCBpcyBqdXN0IGNhbGxlZCBhcyBhIHBhaW50LXRpbWUgb3B0aW1p
emF0aW9uIHRvIHNlZSBpZgpAQCAtMTk5LDU0ICsxNTEsNiBAQCBJbnRSZWN0IFNjcm9sbGJhclRo
ZW1lR3RrOjp0cmFja1JlY3QoU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGJvb2wpCiAgICAgICAgICAg
ICAgICAgICAgdGhpY2tuZXNzLCBzY3JvbGxiYXItPmhlaWdodCgpIC0gKDIgKiBtb3ZlbWVudEF4
aXNQYWRkaW5nKSAtIGFsdGVybmF0ZUJ1dHRvbldpZHRoKTsKIH0KIAotdm9pZCBTY3JvbGxiYXJU
aGVtZUd0azo6cGFpbnRUcmFja0JhY2tncm91bmQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBT
Y3JvbGxiYXIqIHNjcm9sbGJhciwgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBHdGtXaWRn
ZXRTdGF0ZSBzdGF0ZTsKLSAgICBzdGF0ZS5mb2N1c2VkID0gRkFMU0U7Ci0gICAgc3RhdGUuaXNE
ZWZhdWx0ID0gRkFMU0U7Ci0gICAgc3RhdGUuY2FuRGVmYXVsdCA9IEZBTFNFOwotICAgIHN0YXRl
LmRpc2FibGVkID0gRkFMU0U7Ci0gICAgc3RhdGUuYWN0aXZlID0gRkFMU0U7Ci0gICAgc3RhdGUu
aW5Ib3ZlciA9IEZBTFNFOwotCi0gICAgLy8gUGFpbnQgdGhlIHRyYWNrIGJhY2tncm91bmQuIElm
IHRoZSB0cm91Z2gtdW5kZXItc3RlcHBlcnMgcHJvcGVydHkgaXMgdHJ1ZSwgdGhpcwotICAgIC8v
IHNob3VsZCBiZSB0aGUgZnVsbCBzaXplIG9mIHRoZSBzY3JvbGxiYXIsIGJ1dCBpZiBpcyBmYWxz
ZSwgaXQgc2hvdWxkIG9ubHkgYmUgdGhlCi0gICAgLy8gdHJhY2sgcmVjdC4KLSAgICBJbnRSZWN0
IGZ1bGxTY3JvbGxiYXJSZWN0ID0gcmVjdDsKLSAgICBpZiAobV90cm91Z2hVbmRlclN0ZXBwZXJz
KQotICAgICAgICBmdWxsU2Nyb2xsYmFyUmVjdCA9IEludFJlY3Qoc2Nyb2xsYmFyLT54KCksIHNj
cm9sbGJhci0+eSgpLCBzY3JvbGxiYXItPndpZHRoKCksIHNjcm9sbGJhci0+aGVpZ2h0KCkpOwot
Ci0gICAgR3RrVGhlbWVXaWRnZXRUeXBlIHR5cGUgPSBzY3JvbGxiYXItPm9yaWVudGF0aW9uKCkg
PT0gVmVydGljYWxTY3JvbGxiYXIgPyBNT1pfR1RLX1NDUk9MTEJBUl9UUkFDS19WRVJUSUNBTCA6
IE1PWl9HVEtfU0NST0xMQkFSX1RSQUNLX0hPUklaT05UQUw7Ci0gICAgV2lkZ2V0UmVuZGVyaW5n
Q29udGV4dCB3aWRnZXRDb250ZXh0KGNvbnRleHQsIGZ1bGxTY3JvbGxiYXJSZWN0KTsKLSAgICB3
aWRnZXRDb250ZXh0LnBhaW50TW96aWxsYVdpZGdldCh0eXBlLCAmc3RhdGUsIDApOwotfQotCi12
b2lkIFNjcm9sbGJhclRoZW1lR3RrOjpwYWludFNjcm9sbGJhckJhY2tncm91bmQoR3JhcGhpY3ND
b250ZXh0KiBjb250ZXh0LCBTY3JvbGxiYXIqIHNjcm9sbGJhcikKLXsKLSAgICAvLyBUaGlzIGlz
IHVudXNlZCBieSB0aGUgbW96X2d0a19zY3JvbGxlY2Rfd2luZG93X3BhaW50LgotICAgIEd0a1dp
ZGdldFN0YXRlIHN0YXRlOwotICAgIEludFJlY3QgZnVsbFNjcm9sbGJhclJlY3QgPSBJbnRSZWN0
KHNjcm9sbGJhci0+eCgpLCBzY3JvbGxiYXItPnkoKSwgc2Nyb2xsYmFyLT53aWR0aCgpLCBzY3Jv
bGxiYXItPmhlaWdodCgpKTsKLSAgICBXaWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENvbnRl
eHQoY29udGV4dCwgZnVsbFNjcm9sbGJhclJlY3QpOwotICAgIHdpZGdldENvbnRleHQucGFpbnRN
b3ppbGxhV2lkZ2V0KE1PWl9HVEtfU0NST0xMRURfV0lORE9XLCAmc3RhdGUsIDApOwotfQotCi12
b2lkIFNjcm9sbGJhclRoZW1lR3RrOjpwYWludFRodW1iKEdyYXBoaWNzQ29udGV4dCogY29udGV4
dCwgU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgR3Rr
V2lkZ2V0U3RhdGUgc3RhdGU7Ci0gICAgc3RhdGUuZm9jdXNlZCA9IEZBTFNFOwotICAgIHN0YXRl
LmlzRGVmYXVsdCA9IEZBTFNFOwotICAgIHN0YXRlLmNhbkRlZmF1bHQgPSBGQUxTRTsKLSAgICBz
dGF0ZS5kaXNhYmxlZCA9IEZBTFNFOwotICAgIHN0YXRlLmFjdGl2ZSA9IHNjcm9sbGJhci0+cHJl
c3NlZFBhcnQoKSA9PSBUaHVtYlBhcnQ7Ci0gICAgc3RhdGUuaW5Ib3ZlciA9IHNjcm9sbGJhci0+
aG92ZXJlZFBhcnQoKSA9PSBUaHVtYlBhcnQ7Ci0gICAgc3RhdGUubWF4cG9zID0gc2Nyb2xsYmFy
LT5tYXhpbXVtKCk7Ci0gICAgc3RhdGUuY3VycG9zID0gc2Nyb2xsYmFyLT5jdXJyZW50UG9zKCk7
Ci0KLSAgICBHdGtUaGVtZVdpZGdldFR5cGUgdHlwZSA9IHNjcm9sbGJhci0+b3JpZW50YXRpb24o
KSA9PSBWZXJ0aWNhbFNjcm9sbGJhciA/IE1PWl9HVEtfU0NST0xMQkFSX1RIVU1CX1ZFUlRJQ0FM
IDogTU9aX0dUS19TQ1JPTExCQVJfVEhVTUJfSE9SSVpPTlRBTDsKLSAgICBXaWRnZXRSZW5kZXJp
bmdDb250ZXh0IHdpZGdldENvbnRleHQoY29udGV4dCwgcmVjdCk7Ci0gICAgd2lkZ2V0Q29udGV4
dC5wYWludE1vemlsbGFXaWRnZXQodHlwZSwgJnN0YXRlLCAwKTsKLX0KLQogSW50UmVjdCBTY3Jv
bGxiYXJUaGVtZUd0azo6dGh1bWJSZWN0KFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJbnRS
ZWN0JiB1bmNvbnN0cmFpbmVkVHJhY2tSZWN0KQogewogICAgIEludFJlY3QgdHJhY2tSZWN0ID0g
Y29uc3RyYWluVHJhY2tSZWN0VG9UcmFja1BpZWNlcyhzY3JvbGxiYXIsIHVuY29uc3RyYWluZWRU
cmFja1JlY3QpOwpAQCAtMzI2LDQwICsyMzAsNiBAQCBib29sIFNjcm9sbGJhclRoZW1lR3RrOjpw
YWludChTY3JvbGxiYXIqIHNjcm9sbGJhciwgR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0Nvbgog
ICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIFNjcm9sbGJhclRoZW1lR3RrOjpwYWludEJ1dHRv
bihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJ
bnRSZWN0JiByZWN0LCBTY3JvbGxiYXJQYXJ0IHBhcnQpCi17Ci0gICAgaW50IGZsYWdzID0gMDsK
LSAgICBpZiAoc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFyKQot
ICAgICAgICBmbGFncyB8PSBNT1pfR1RLX1NURVBQRVJfVkVSVElDQUw7Ci0KLSAgICBpZiAocGFy
dCA9PSBGb3J3YXJkQnV0dG9uRW5kUGFydCkKLSAgICAgICAgZmxhZ3MgfD0gKE1PWl9HVEtfU1RF
UFBFUl9ET1dOIHwgTU9aX0dUS19TVEVQUEVSX0JPVFRPTSk7Ci0gICAgaWYgKHBhcnQgPT0gRm9y
d2FyZEJ1dHRvblN0YXJ0UGFydCkKLSAgICAgICAgZmxhZ3MgfD0gTU9aX0dUS19TVEVQUEVSX0RP
V047Ci0KLSAgICBHdGtXaWRnZXRTdGF0ZSBzdGF0ZTsKLSAgICBzdGF0ZS5mb2N1c2VkID0gVFJV
RTsKLSAgICBzdGF0ZS5pc0RlZmF1bHQgPSBUUlVFOwotICAgIHN0YXRlLmNhbkRlZmF1bHQgPSBU
UlVFOwotICAgIHN0YXRlLmRlcHJlc3NlZCA9IEZBTFNFOwotCi0gICAgaWYgKChCYWNrQnV0dG9u
U3RhcnRQYXJ0ID09IHBhcnQgJiYgc2Nyb2xsYmFyLT5jdXJyZW50UG9zKCkpCi0gICAgICAgIHx8
IChCYWNrQnV0dG9uRW5kUGFydCA9PSBwYXJ0ICYmIHNjcm9sbGJhci0+Y3VycmVudFBvcygpKQot
ICAgICAgICB8fCAoRm9yd2FyZEJ1dHRvbkVuZFBhcnQgPT0gcGFydCAmJiBzY3JvbGxiYXItPmN1
cnJlbnRQb3MoKSAhPSBzY3JvbGxiYXItPm1heGltdW0oKSkKLSAgICAgICAgfHwgKEZvcndhcmRC
dXR0b25TdGFydFBhcnQgPT0gcGFydCAmJiBzY3JvbGxiYXItPmN1cnJlbnRQb3MoKSAhPSBzY3Jv
bGxiYXItPm1heGltdW0oKSkpIHsKLSAgICAgICAgc3RhdGUuZGlzYWJsZWQgPSBGQUxTRTsKLSAg
ICAgICAgc3RhdGUuYWN0aXZlID0gcGFydCA9PSBzY3JvbGxiYXItPnByZXNzZWRQYXJ0KCk7Ci0g
ICAgICAgIHN0YXRlLmluSG92ZXIgPSBwYXJ0ID09IHNjcm9sbGJhci0+aG92ZXJlZFBhcnQoKTsK
LSAgICB9IGVsc2UgewotICAgICAgICBzdGF0ZS5kaXNhYmxlZCA9IFRSVUU7Ci0gICAgICAgIHN0
YXRlLmFjdGl2ZSA9IEZBTFNFOwotICAgICAgICBzdGF0ZS5pbkhvdmVyID0gRkFMU0U7Ci0gICAg
fQotCi0gICAgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dCB3aWRnZXRDb250ZXh0KGNvbnRleHQsIHJl
Y3QpOwotICAgIHdpZGdldENvbnRleHQucGFpbnRNb3ppbGxhV2lkZ2V0KE1PWl9HVEtfU0NST0xM
QkFSX0JVVFRPTiwgJnN0YXRlLCBmbGFncyk7Ci19Ci0KIHZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6
OnBhaW50U2Nyb2xsQ29ybmVyKFNjcm9sbFZpZXcqIHZpZXcsIEdyYXBoaWNzQ29udGV4dCogY29u
dGV4dCwgY29uc3QgSW50UmVjdCYgY29ybmVyUmVjdCkKIHsKICAgICAvLyBTY3JvbGxiYXJUaGVt
ZUNvbXBvc2l0ZTo6cGFpbnRTY3JvbGxDb3JuZXIgaW5jb3JyZWN0bHkgYXNzdW1lcyB0aGF0IHRo
ZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGsuaCBi
L1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1Njcm9sbGJhclRoZW1lR3RrLmgKaW5kZXggOGY5OTBkNS4u
YzRkNjFiNyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVH
dGsuaAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0ay5oCkBAIC0y
OCw2ICsyOCw4IEBACiAKICNpbmNsdWRlICJTY3JvbGxiYXJUaGVtZUNvbXBvc2l0ZS5oIgogCisj
aW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKwogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBT
Y3JvbGxiYXI7CkBAIC02Nyw5ICs2OSwxNSBAQCBwcm90ZWN0ZWQ6CiAgICAgaW50IG1fc3RlcHBl
clNpemU7CiAgICAgaW50IG1fc3RlcHBlclNwYWNpbmc7CiAgICAgaW50IG1fbWluVGh1bWJMZW5n
dGg7Ci0gICAgYm9vbCBtX3Ryb3VnaFVuZGVyU3RlcHBlcnM7Ci0gICAgYm9vbCBtX2hhc0Zvcndh
cmRCdXR0b25TdGFydFBhcnQ7Ci0gICAgYm9vbCBtX2hhc0JhY2tCdXR0b25FbmRQYXJ0OworICAg
IGdib29sZWFuIG1fdHJvdWdoVW5kZXJTdGVwcGVyczsKKyAgICBnYm9vbGVhbiBtX2hhc0Zvcndh
cmRCdXR0b25TdGFydFBhcnQ7CisgICAgZ2Jvb2xlYW4gbV9oYXNCYWNrQnV0dG9uRW5kUGFydDsK
KyNpZm5kZWYgR1RLX0FQSV9WRVJTSU9OXzIKKyAgICBHdGtTdHlsZUNvbnRleHQqIG1fY29udGV4
dDsKKyNlbmRpZgorCitwcml2YXRlOgorICAgIGNvbnN0IEhhc2hTZXQ8U2Nyb2xsYmFyKj4qIGdl
dFNjcm9sbGJhcnMoKTsKIH07CiAKIH0KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3Rr
L1Njcm9sbGJhclRoZW1lR3RrMi5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJU
aGVtZUd0azIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNjJlZGUK
LS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0
azIuY3BwCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxl
IEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpZmRlZiBHVEtfQVBJX1ZFUlNJT05fMgorCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiU2Nyb2xsYmFyVGhlbWVHdGsuaCIKKworI2luY2x1ZGUgIlBsYXRm
b3JtTW91c2VFdmVudC5oIgorI2luY2x1ZGUgIlJlbmRlclRoZW1lR3RrLmgiCisjaW5jbHVkZSAi
U2Nyb2xsVmlldy5oIgorI2luY2x1ZGUgIlNjcm9sbGJhci5oIgorI2luY2x1ZGUgIldpZGdldFJl
bmRlcmluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJndGtkcmF3aW5nLmgiCisjaW5jbHVkZSA8Z3Rr
L2d0ay5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyB2b2lkIGd0a1N0eWxlU2V0
Q2FsbGJhY2soR3RrV2lkZ2V0KiwgR3RrU3R5bGUqLCBTY3JvbGxiYXJUaGVtZUd0ayopOworCitT
Y3JvbGxiYXJUaGVtZUd0azo6U2Nyb2xsYmFyVGhlbWVHdGsoKQoreworICAgIHVwZGF0ZVRoZW1l
UHJvcGVydGllcygpOworICAgIGdfc2lnbmFsX2Nvbm5lY3QobW96X2d0a19nZXRfc2Nyb2xsYmFy
X3dpZGdldCgpLAorICAgICAgICAgInN0eWxlLXNldCIsIEdfQ0FMTEJBQ0soZ3RrU3R5bGVTZXRD
YWxsYmFjayksIHRoaXMpOworfQorCit2b2lkIFNjcm9sbGJhclRoZW1lR3RrOjp1cGRhdGVUaGVt
ZVByb3BlcnRpZXMoKQoreworICAgIE1vekd0a1Njcm9sbGJhck1ldHJpY3MgbWV0cmljczsKKyAg
ICBtb3pfZ3RrX2dldF9zY3JvbGxiYXJfbWV0cmljcygmbWV0cmljcyk7CisKKyAgICBtX3RodW1i
RmF0bmVzcyA9IG1ldHJpY3Muc2xpZGVyX3dpZHRoOworICAgIG1fdHJvdWdoQm9yZGVyV2lkdGgg
PSBtZXRyaWNzLnRyb3VnaF9ib3JkZXI7CisgICAgbV9zdGVwcGVyU2l6ZSA9IG1ldHJpY3Muc3Rl
cHBlcl9zaXplOworICAgIG1fc3RlcHBlclNwYWNpbmcgPSBtZXRyaWNzLnN0ZXBwZXJfc3BhY2lu
ZzsKKyAgICBtX21pblRodW1iTGVuZ3RoID0gbWV0cmljcy5taW5fc2xpZGVyX3NpemU7CisgICAg
bV90cm91Z2hVbmRlclN0ZXBwZXJzID0gbWV0cmljcy50cm91Z2hfdW5kZXJfc3RlcHBlcnM7Cisg
ICAgbV9oYXNGb3J3YXJkQnV0dG9uU3RhcnRQYXJ0ID0gbWV0cmljcy5oYXNfc2Vjb25kYXJ5X2Zv
cndhcmRfc3RlcHBlcjsKKyAgICBtX2hhc0JhY2tCdXR0b25FbmRQYXJ0ID0gbWV0cmljcy5oYXNf
c2Vjb25kYXJ5X2JhY2t3YXJkX3N0ZXBwZXI7CisKKyAgICBjb25zdCBIYXNoU2V0PFNjcm9sbGJh
cio+KiBnU2Nyb2xsYmFycyA9IGdldFNjcm9sbGJhcnMoKTsKKyAgICBpZiAoIWdTY3JvbGxiYXJz
KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBVcGRhdGUgdGhlIHRoaWNrbmVzcyBvZiBldmVy
eSBpbnRlcmlvciBmcmFtZSBzY3JvbGxiYXIgd2lkZ2V0LiBUaGUKKyAgICAvLyBwbGF0Zm9ybS1p
bmRlcGVuZGVudCBzY3JvbGxiYXIgdGhlbSBjb2RlIGlzbid0IHlldCBzbWFydCBlbm91Z2ggdG8g
Z2V0CisgICAgLy8gdGhpcyBpbmZvcm1hdGlvbiB3aGVuIGl0IHBhaW50cy4KKyAgICBIYXNoU2V0
PFNjcm9sbGJhcio+OjppdGVyYXRvciBlbmQgPSBnU2Nyb2xsYmFycy0+ZW5kKCk7CisgICAgZm9y
IChIYXNoU2V0PFNjcm9sbGJhcio+OjppdGVyYXRvciBpdCA9IGdTY3JvbGxiYXJzLT5iZWdpbigp
OyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSAoKml0
KTsKKworICAgICAgICAvLyBUb3AtbGV2ZWwgc2Nyb2xsYmFyIGkuZS4gc2Nyb2xsYmFycyB3aG8g
aGF2ZSBhIHBhcmVudCBTY3JvbGxWaWV3CisgICAgICAgIC8vIHdpdGggbm8gcGFyZW50IGFyZSBu
YXRpdmUsIGFuZCB0aHVzIGRvIG5vdCBuZWVkIHRvIGJlIHJlc2l6ZWQuCisgICAgICAgIGlmICgh
c2Nyb2xsYmFyLT5wYXJlbnQoKSB8fCAhc2Nyb2xsYmFyLT5wYXJlbnQoKS0+cGFyZW50KCkpCisg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaW50IHRoaWNrbmVzcyA9IHNjcm9sbGJhclRo
aWNrbmVzcyhzY3JvbGxiYXItPmNvbnRyb2xTaXplKCkpOworICAgICAgICBpZiAoc2Nyb2xsYmFy
LT5vcmllbnRhdGlvbigpID09IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAgICAgICAgICBzY3Jv
bGxiYXItPnNldEZyYW1lUmVjdChJbnRSZWN0KDAsIHNjcm9sbGJhci0+cGFyZW50KCktPmhlaWdo
dCgpIC0gdGhpY2tuZXNzLCBzY3JvbGxiYXItPndpZHRoKCksIHRoaWNrbmVzcykpOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICBzY3JvbGxiYXItPnNldEZyYW1lUmVjdChJbnRSZWN0KHNjcm9s
bGJhci0+cGFyZW50KCktPndpZHRoKCkgLSB0aGlja25lc3MsIDAsIHRoaWNrbmVzcywgc2Nyb2xs
YmFyLT5oZWlnaHQoKSkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ3RrU3R5bGVTZXRDYWxs
YmFjayhHdGtXaWRnZXQqIHdpZGdldCwgR3RrU3R5bGUqIHByZXZpb3VzLCBTY3JvbGxiYXJUaGVt
ZUd0ayogc2Nyb2xsYmFyVGhlbWUpCit7CisgICAgc2Nyb2xsYmFyVGhlbWUtPnVwZGF0ZVRoZW1l
UHJvcGVydGllcygpOworfQorCit2b2lkIFNjcm9sbGJhclRoZW1lR3RrOjpwYWludFRyYWNrQmFj
a2dyb3VuZChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyLCBj
b25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIEd0a1dpZGdldFN0YXRlIHN0YXRlOworICAgIHN0
YXRlLmZvY3VzZWQgPSBGQUxTRTsKKyAgICBzdGF0ZS5pc0RlZmF1bHQgPSBGQUxTRTsKKyAgICBz
dGF0ZS5jYW5EZWZhdWx0ID0gRkFMU0U7CisgICAgc3RhdGUuZGlzYWJsZWQgPSBGQUxTRTsKKyAg
ICBzdGF0ZS5hY3RpdmUgPSBGQUxTRTsKKyAgICBzdGF0ZS5pbkhvdmVyID0gRkFMU0U7CisKKyAg
ICAvLyBQYWludCB0aGUgdHJhY2sgYmFja2dyb3VuZC4gSWYgdGhlIHRyb3VnaC11bmRlci1zdGVw
cGVycyBwcm9wZXJ0eSBpcyB0cnVlLCB0aGlzCisgICAgLy8gc2hvdWxkIGJlIHRoZSBmdWxsIHNp
emUgb2YgdGhlIHNjcm9sbGJhciwgYnV0IGlmIGlzIGZhbHNlLCBpdCBzaG91bGQgb25seSBiZSB0
aGUKKyAgICAvLyB0cmFjayByZWN0LgorICAgIEludFJlY3QgZnVsbFNjcm9sbGJhclJlY3QgPSBy
ZWN0OworICAgIGlmIChtX3Ryb3VnaFVuZGVyU3RlcHBlcnMpCisgICAgICAgIGZ1bGxTY3JvbGxi
YXJSZWN0ID0gSW50UmVjdChzY3JvbGxiYXItPngoKSwgc2Nyb2xsYmFyLT55KCksIHNjcm9sbGJh
ci0+d2lkdGgoKSwgc2Nyb2xsYmFyLT5oZWlnaHQoKSk7CisKKyAgICBHdGtUaGVtZVdpZGdldFR5
cGUgdHlwZSA9IHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBWZXJ0aWNhbFNjcm9sbGJhciA/
IE1PWl9HVEtfU0NST0xMQkFSX1RSQUNLX1ZFUlRJQ0FMIDogTU9aX0dUS19TQ1JPTExCQVJfVFJB
Q0tfSE9SSVpPTlRBTDsKKyAgICBXaWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENvbnRleHQo
Y29udGV4dCwgZnVsbFNjcm9sbGJhclJlY3QpOworICAgIHdpZGdldENvbnRleHQucGFpbnRNb3pp
bGxhV2lkZ2V0KHR5cGUsICZzdGF0ZSwgMCk7Cit9CisKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6
OnBhaW50U2Nyb2xsYmFyQmFja2dyb3VuZChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIFNjcm9s
bGJhciogc2Nyb2xsYmFyKQoreworICAgIC8vIFRoaXMgaXMgdW51c2VkIGJ5IHRoZSBtb3pfZ3Rr
X3Njcm9sbGVjZF93aW5kb3dfcGFpbnQuCisgICAgR3RrV2lkZ2V0U3RhdGUgc3RhdGU7CisgICAg
SW50UmVjdCBmdWxsU2Nyb2xsYmFyUmVjdCA9IEludFJlY3Qoc2Nyb2xsYmFyLT54KCksIHNjcm9s
bGJhci0+eSgpLCBzY3JvbGxiYXItPndpZHRoKCksIHNjcm9sbGJhci0+aGVpZ2h0KCkpOworICAg
IFdpZGdldFJlbmRlcmluZ0NvbnRleHQgd2lkZ2V0Q29udGV4dChjb250ZXh0LCBmdWxsU2Nyb2xs
YmFyUmVjdCk7CisgICAgd2lkZ2V0Q29udGV4dC5wYWludE1vemlsbGFXaWRnZXQoTU9aX0dUS19T
Q1JPTExFRF9XSU5ET1csICZzdGF0ZSwgMCk7Cit9CisKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6
OnBhaW50VGh1bWIoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBTY3JvbGxiYXIqIHNjcm9sbGJh
ciwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBHdGtXaWRnZXRTdGF0ZSBzdGF0ZTsKKyAg
ICBzdGF0ZS5mb2N1c2VkID0gRkFMU0U7CisgICAgc3RhdGUuaXNEZWZhdWx0ID0gRkFMU0U7Cisg
ICAgc3RhdGUuY2FuRGVmYXVsdCA9IEZBTFNFOworICAgIHN0YXRlLmRpc2FibGVkID0gRkFMU0U7
CisgICAgc3RhdGUuYWN0aXZlID0gc2Nyb2xsYmFyLT5wcmVzc2VkUGFydCgpID09IFRodW1iUGFy
dDsKKyAgICBzdGF0ZS5pbkhvdmVyID0gc2Nyb2xsYmFyLT5ob3ZlcmVkUGFydCgpID09IFRodW1i
UGFydDsKKyAgICBzdGF0ZS5tYXhwb3MgPSBzY3JvbGxiYXItPm1heGltdW0oKTsKKyAgICBzdGF0
ZS5jdXJwb3MgPSBzY3JvbGxiYXItPmN1cnJlbnRQb3MoKTsKKworICAgIEd0a1RoZW1lV2lkZ2V0
VHlwZSB0eXBlID0gc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFy
ID8gTU9aX0dUS19TQ1JPTExCQVJfVEhVTUJfVkVSVElDQUwgOiBNT1pfR1RLX1NDUk9MTEJBUl9U
SFVNQl9IT1JJWk9OVEFMOworICAgIFdpZGdldFJlbmRlcmluZ0NvbnRleHQgd2lkZ2V0Q29udGV4
dChjb250ZXh0LCByZWN0KTsKKyAgICB3aWRnZXRDb250ZXh0LnBhaW50TW96aWxsYVdpZGdldCh0
eXBlLCAmc3RhdGUsIDApOworfQorCit2b2lkIFNjcm9sbGJhclRoZW1lR3RrOjpwYWludEJ1dHRv
bihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJ
bnRSZWN0JiByZWN0LCBTY3JvbGxiYXJQYXJ0IHBhcnQpCit7CisgICAgaW50IGZsYWdzID0gMDsK
KyAgICBpZiAoc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFyKQor
ICAgICAgICBmbGFncyB8PSBNT1pfR1RLX1NURVBQRVJfVkVSVElDQUw7CisKKyAgICBpZiAocGFy
dCA9PSBGb3J3YXJkQnV0dG9uRW5kUGFydCkKKyAgICAgICAgZmxhZ3MgfD0gKE1PWl9HVEtfU1RF
UFBFUl9ET1dOIHwgTU9aX0dUS19TVEVQUEVSX0JPVFRPTSk7CisgICAgaWYgKHBhcnQgPT0gRm9y
d2FyZEJ1dHRvblN0YXJ0UGFydCkKKyAgICAgICAgZmxhZ3MgfD0gTU9aX0dUS19TVEVQUEVSX0RP
V047CisKKyAgICBHdGtXaWRnZXRTdGF0ZSBzdGF0ZTsKKyAgICBzdGF0ZS5mb2N1c2VkID0gVFJV
RTsKKyAgICBzdGF0ZS5pc0RlZmF1bHQgPSBUUlVFOworICAgIHN0YXRlLmNhbkRlZmF1bHQgPSBU
UlVFOworICAgIHN0YXRlLmRlcHJlc3NlZCA9IEZBTFNFOworCisgICAgaWYgKChCYWNrQnV0dG9u
U3RhcnRQYXJ0ID09IHBhcnQgJiYgc2Nyb2xsYmFyLT5jdXJyZW50UG9zKCkpCisgICAgICAgIHx8
IChCYWNrQnV0dG9uRW5kUGFydCA9PSBwYXJ0ICYmIHNjcm9sbGJhci0+Y3VycmVudFBvcygpKQor
ICAgICAgICB8fCAoRm9yd2FyZEJ1dHRvbkVuZFBhcnQgPT0gcGFydCAmJiBzY3JvbGxiYXItPmN1
cnJlbnRQb3MoKSAhPSBzY3JvbGxiYXItPm1heGltdW0oKSkKKyAgICAgICAgfHwgKEZvcndhcmRC
dXR0b25TdGFydFBhcnQgPT0gcGFydCAmJiBzY3JvbGxiYXItPmN1cnJlbnRQb3MoKSAhPSBzY3Jv
bGxiYXItPm1heGltdW0oKSkpIHsKKyAgICAgICAgc3RhdGUuZGlzYWJsZWQgPSBGQUxTRTsKKyAg
ICAgICAgc3RhdGUuYWN0aXZlID0gcGFydCA9PSBzY3JvbGxiYXItPnByZXNzZWRQYXJ0KCk7Cisg
ICAgICAgIHN0YXRlLmluSG92ZXIgPSBwYXJ0ID09IHNjcm9sbGJhci0+aG92ZXJlZFBhcnQoKTsK
KyAgICB9IGVsc2UgeworICAgICAgICBzdGF0ZS5kaXNhYmxlZCA9IFRSVUU7CisgICAgICAgIHN0
YXRlLmFjdGl2ZSA9IEZBTFNFOworICAgICAgICBzdGF0ZS5pbkhvdmVyID0gRkFMU0U7CisgICAg
fQorCisgICAgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dCB3aWRnZXRDb250ZXh0KGNvbnRleHQsIHJl
Y3QpOworICAgIHdpZGdldENvbnRleHQucGFpbnRNb3ppbGxhV2lkZ2V0KE1PWl9HVEtfU0NST0xM
QkFSX0JVVFRPTiwgJnN0YXRlLCBmbGFncyk7Cit9CisKK30KKworI2VuZGlmIC8vIEdUS19BUElf
VkVSU0lPTl8yCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9XaWRnZXRSZW5kZXJp
bmdDb250ZXh0LmggYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9XaWRnZXRSZW5kZXJpbmdDb250ZXh0
LmgKaW5kZXggM2JiODA2NS4uMDY4NGUyMCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9n
dGsvV2lkZ2V0UmVuZGVyaW5nQ29udGV4dC5oCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1dp
ZGdldFJlbmRlcmluZ0NvbnRleHQuaApAQCAtMTgsNiArMTgsNyBAQAogICogQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCiAgKgogICovCisjaWZkZWYgR1RLX0FQSV9WRVJTSU9OXzIKIAogI2lm
bmRlZiBXaWRnZXRSZW5kZXJpbmdDb250ZXh0X2gKICNkZWZpbmUgV2lkZ2V0UmVuZGVyaW5nQ29u
dGV4dF9oCkBAIC00MywxNCArNDQsMTEgQEAgcHJpdmF0ZToKICAgICBJbnRTaXplIG1fZXh0cmFT
cGFjZTsKICAgICBib29sIG1faGFkRXJyb3I7CiAKLSNpZmRlZiBHVEtfQVBJX1ZFUlNJT05fMgog
ICAgIEdka0RyYXdhYmxlKiBtX3RhcmdldDsKLSNlbHNlCi0gICAgY2Fpcm9fdCogbV90YXJnZXQ7
Ci0jZW5kaWYKLQogfTsKIAogfQogCiAjZW5kaWYKKworI2VuZGlmIC8vIEdUS19BUElfVkVSU0lP
Tl8yCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9XaWRnZXRSZW5kZXJpbmdDb250
ZXh0R3RrMi5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9XaWRnZXRSZW5kZXJpbmdDb250ZXh0
R3RrMi5jcHAKaW5kZXggZmQwYjljYS4uYWQ3YTU0MSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0
Zm9ybS9ndGsvV2lkZ2V0UmVuZGVyaW5nQ29udGV4dEd0azIuY3BwCisrKyBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3RrL1dpZGdldFJlbmRlcmluZ0NvbnRleHRHdGsyLmNwcApAQCAtNzIsNyArNzIsNyBA
QCBzdGF0aWMgSW50U2l6ZSBnZXRFeHRyYVNwYWNlRm9yV2lkZ2V0KFJlbmRlclRoZW1lR3RrKiB0
aGVtZSkKIAogICAgIC8vIFRoZSBjaGVja2JveCBleHRyYSBzcGFjZSBpcyBjYWxjdWxhdGVkIGJ5
IGxvb2tpbmcgYXQgdGhlIHdpZGdldCBzdHlsZS4KICAgICBpbnQgaW5kaWNhdG9yU2l6ZSwgaW5k
aWNhdG9yU3BhY2luZzsKLSAgICB0aGVtZS0+Z2V0SW5kaWNhdG9yTWV0cmljcyhDaGVja2JveFBh
cnQsIGluZGljYXRvclNpemUsIGluZGljYXRvclNwYWNpbmcpOworICAgIG1vel9ndGtfY2hlY2ti
b3hfZ2V0X21ldHJpY3MoJmluZGljYXRvclNpemUsICZpbmRpY2F0b3JTcGFjaW5nKTsKICAgICBJ
bnRTaXplIGV4dHJhU3BhY2UoaW5kaWNhdG9yU3BhY2luZywgaW5kaWNhdG9yU3BhY2luZyk7CiAK
ICAgICAvLyBTY3JvbGxiYXIgdGh1bWJzIG5lZWQgYXQgbGVhc3QgYW4gZXh0cmEgcGl4ZWwgYWxv
bmcgdGhlaXIgbW92ZW1lbnQgYXhpcy4KQEAgLTg1LDExICs4NSwxMiBAQCBXaWRnZXRSZW5kZXJp
bmdDb250ZXh0OjpXaWRnZXRSZW5kZXJpbmdDb250ZXh0KEdyYXBoaWNzQ29udGV4dCogZ3JhcGhp
Y3NDb250ZXh0LAogICAgICwgbV9oYWRFcnJvcihmYWxzZSkKIHsKICAgICBSZW5kZXJUaGVtZUd0
ayogdGhlbWUgPSBzdGF0aWNfY2FzdDxSZW5kZXJUaGVtZUd0ayo+KFJlbmRlclRoZW1lOjpkZWZh
dWx0VGhlbWUoKS5nZXQoKSk7CisgICAgR3RrVGhlbWVQYXJ0cyogcGFydHMgPSBtb3pfZ3RrX2dl
dF90aGVtZV9wYXJ0cygpOwogCiAgICAgLy8gRmFsbGJhY2s6IFdlIGZhaWxlZCB0byBjcmVhdGUg
YW4gUkdCQSBjb2xvcm1hcCBlYXJsaWVyLCBzbyB3ZSBjYW5ub3QgcHJvcGVybHkgcGFpbnQgCiAg
ICAgLy8gdG8gYSB0ZW1wb3Jhcnkgc3VyZmFjZSBhbmQgcHJlc2VydmUgdHJhbnNwYXJlbmN5LiBU
byBlbnN1cmUgZGVjZW50IHdpZGdldCByZW5kZXJpbmcsIGp1c3QKICAgICAvLyBwYWludCBkaXJl
Y3RseSB0byB0aGUgdGFyZ2V0IGRyYXdhYmxlLiBUaGlzIHdpbGwgbm90IHJlbmRlciBDU1Mgcm90
YXRpb25hbCB0cmFuc2Zvcm1zIHByb3Blcmx5LgotICAgIGlmICghdGhlbWUtPm1fdGhlbWVQYXJ0
c0hhdmVSR0JBQ29sb3JtYXAgJiYgZ3JhcGhpY3NDb250ZXh0LT5nZGtXaW5kb3coKSkgeworICAg
IGlmICghcGFydHMtPmhhdmVSR0JBQ29sb3JtYXAgJiYgZ3JhcGhpY3NDb250ZXh0LT5nZGtXaW5k
b3coKSkgewogICAgICAgICBtX3BhaW50UmVjdCA9IGdyYXBoaWNzQ29udGV4dC0+Z2V0Q1RNKCku
bWFwUmVjdCh0YXJnZXRSZWN0KTsKICAgICAgICAgbV90YXJnZXQgPSBncmFwaGljc0NvbnRleHQt
Pmdka1dpbmRvdygpOwogICAgICAgICByZXR1cm47CkBAIC0xMTYsOCArMTE3LDggQEAgV2lkZ2V0
UmVuZGVyaW5nQ29udGV4dDo6V2lkZ2V0UmVuZGVyaW5nQ29udGV4dChHcmFwaGljc0NvbnRleHQq
IGdyYXBoaWNzQ29udGV4dCwKICAgICAgICAgd2lkdGggPSAoMSArICh3aWR0aCA+PiA1KSkgPDwg
NTsKICAgICAgICAgaGVpZ2h0ID0gKDEgKyAoaGVpZ2h0ID4+IDUpKSA8PCA1OwogCi0gICAgICAg
IGdTY3JhdGNoQnVmZmVyID0gZ2RrX3BpeG1hcF9uZXcoMCwgd2lkdGgsIGhlaWdodCwgZ2RrX2Nv
bG9ybWFwX2dldF92aXN1YWwodGhlbWUtPm1fdGhlbWVQYXJ0cy5jb2xvcm1hcCktPmRlcHRoKTsK
LSAgICAgICAgZ2RrX2RyYXdhYmxlX3NldF9jb2xvcm1hcChnU2NyYXRjaEJ1ZmZlciwgdGhlbWUt
Pm1fdGhlbWVQYXJ0cy5jb2xvcm1hcCk7CisgICAgICAgIGdTY3JhdGNoQnVmZmVyID0gZ2RrX3Bp
eG1hcF9uZXcoMCwgd2lkdGgsIGhlaWdodCwgZ2RrX2NvbG9ybWFwX2dldF92aXN1YWwocGFydHMt
PmNvbG9ybWFwKS0+ZGVwdGgpOworICAgICAgICBnZGtfZHJhd2FibGVfc2V0X2NvbG9ybWFwKGdT
Y3JhdGNoQnVmZmVyLCBwYXJ0cy0+Y29sb3JtYXApOwogICAgIH0KICAgICBtX3RhcmdldCA9IGdT
Y3JhdGNoQnVmZmVyOwogCkBAIC0xMzAsOCArMTMxLDggQEAgV2lkZ2V0UmVuZGVyaW5nQ29udGV4
dDo6V2lkZ2V0UmVuZGVyaW5nQ29udGV4dChHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4
dCwKIFdpZGdldFJlbmRlcmluZ0NvbnRleHQ6On5XaWRnZXRSZW5kZXJpbmdDb250ZXh0KCkKIHsK
ICAgICAvLyBXZSBkbyBub3QgbmVlZCB0byBibGl0IGJhY2sgdG8gdGhlIHRhcmdldCBpbiB0aGUg
ZmFsbGJhY2sgY2FzZS4gU2VlIGFib3ZlLgotICAgIFJlbmRlclRoZW1lR3RrKiB0aGVtZSA9IHN0
YXRpY19jYXN0PFJlbmRlclRoZW1lR3RrKj4oUmVuZGVyVGhlbWU6OmRlZmF1bHRUaGVtZSgpLmdl
dCgpKTsKLSAgICBpZiAoIXRoZW1lLT5tX3RoZW1lUGFydHNIYXZlUkdCQUNvbG9ybWFwICYmIG1f
Z3JhcGhpY3NDb250ZXh0LT5nZGtXaW5kb3coKSkKKyAgICBHdGtUaGVtZVBhcnRzKiBwYXJ0cyA9
IG1vel9ndGtfZ2V0X3RoZW1lX3BhcnRzKCk7CisgICAgaWYgKCFwYXJ0cy0+aGF2ZVJHQkFDb2xv
cm1hcCAmJiBtX2dyYXBoaWNzQ29udGV4dC0+Z2RrV2luZG93KCkpCiAgICAgICAgIHJldHVybjsK
IAogICAgIC8vIERvbid0IHBhaW50IHRoZSByZXN1bHRzIGJhY2sgaWYgdGhlcmUgd2FzIGFuIGVy
cm9yLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvZ3RrMmRyYXdpbmcuYyBiL1dl
YkNvcmUvcGxhdGZvcm0vZ3RrL2d0azJkcmF3aW5nLmMKaW5kZXggMmYyZWRiNi4uOGQ1Yjk0YiAx
MDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvZ3RrMmRyYXdpbmcuYworKysgYi9XZWJD
b3JlL3BsYXRmb3JtL2d0ay9ndGsyZHJhd2luZy5jCkBAIC02OSw2ICs2OSwxMiBAQCBtb3pfZ3Rr
X3VzZV90aGVtZV9wYXJ0cyhHdGtUaGVtZVBhcnRzKiBwYXJ0cykKICAgICBnUGFydHMgPSBwYXJ0
czsKIH0KIAorR3RrVGhlbWVQYXJ0cyoKK21vel9ndGtfZ2V0X3RoZW1lX3BhcnRzKHZvaWQpCit7
CisgICAgcmV0dXJuIGdQYXJ0czsKK30KKwogLyogQmVjYXVzZSB3ZSBoYXZlIHN1Y2ggYW4gdW5j
b252ZW50aW9uYWwgd2F5IG9mIGRyYXdpbmcgd2lkZ2V0cywgc2lnbmFsIHRvIHRoZSBHVEsgdGhl
bWUgZW5naW5lCiAgICB0aGF0IHRoZXkgYXJlIGRyYXdpbmcgZm9yIE1vemlsbGEgaW5zdGVhZCBv
ZiBhIGNvbnZlbnRpb25hbCBHVEsgYXBwIHNvIHRoZXkgY2FuIGRvIGFueSBzcGVjaWZpYwogICAg
dGhpbmdzIHRoZXkgbWF5IHdhbnQgdG8gZG8uICovCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2d0ay9ndGtkcmF3aW5nLmggYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9ndGtkcmF3aW5nLmgK
aW5kZXggYTk4MTU0My4uYjhmYWRjYiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsv
Z3RrZHJhd2luZy5oCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL2d0a2RyYXdpbmcuaApAQCAt
MzYsNiArMzYsNyBAQAogICoKICAqICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCiAK
KyNpZmRlZiBHVEtfQVBJX1ZFUlNJT05fMgogLyoqCiAgKiBndGtkcmF3aW5nLmg6IEdUSyB3aWRn
ZXQgcmVuZGVyaW5nIHV0aWxpdGllcwogICoKQEAgLTgxLDkgKzgyLDggQEAgdHlwZWRlZiBzdHJ1
Y3QgewogfSBNb3pHdGtTY3JvbGxiYXJNZXRyaWNzOwogCiB0eXBlZGVmIHN0cnVjdCBfR3RrVGhl
bWVQYXJ0cyB7Ci0jaWZkZWYgR1RLX0FQSV9WRVJTSU9OXzIKICAgICBHZGtDb2xvcm1hcCogY29s
b3JtYXA7Ci0jZW5kaWYgLy8gR1RLX0FQSV9WRVJTSU9OXzIKKyAgICBnYm9vbGVhbiBoYXZlUkdC
QUNvbG9ybWFwOwogICAgIEd0a1dpZGdldCogcHJvdG9XaW5kb3c7CiAgICAgR3RrV2lkZ2V0KiBw
cm90b0xheW91dDsKICAgICBHdGtXaWRnZXQqIGJ1dHRvbldpZGdldDsKQEAgLTE4MSw2ICsxODEs
MTIgQEAgdm9pZAogbW96X2d0a191c2VfdGhlbWVfcGFydHMoR3RrVGhlbWVQYXJ0cyogcGFydHMp
OwogCiAvKioKKyAqIFJ0dXJucyB0aGUgR3RrVGhlbWVQYXJ0cworICovCitHdGtUaGVtZVBhcnRz
KgorbW96X2d0a19nZXRfdGhlbWVfcGFydHModm9pZCk7CisKKy8qKgogICogRW5hYmxlIEdUSysg
MS4yLjkrIHRoZW1lIGVuaGFuY2VtZW50cy4gWW91IG11c3QgcHJvdmlkZSBhIHBvaW50ZXIKICAq
IHRvIHRoZSBHVEsrIDEuMi45KyBmdW5jdGlvbiAiZ3RrX3N0eWxlX2dldF9wcm9wX2V4cGVyaW1l
bnRhbCIuCiAgKiBzdHlsZUdldFByb3A6ICBwb2ludGVyIHRvIGd0a19zdHlsZV9nZXRfcHJvcF9l
eHBlcmltZW50YWwKQEAgLTIxMywxOCArMjE5LDExIEBAIHZvaWQgbW96X2d0a19kZXN0cm95X3Ro
ZW1lX3BhcnRzX3dpZGdldHMoR3RrVGhlbWVQYXJ0cyogcGFydHMpOwogICogZmxhZ3M6ICAgICB3
aWRnZXQtZGVwZW5kYW50IGZsYWdzOyBzZWUgdGhlIEd0a1RoZW1lV2lkZ2V0VHlwZSBkZWZpbml0
aW9uLgogICogZGlyZWN0aW9uOiB0aGUgdGV4dCBkaXJlY3Rpb24sIHRvIGRyYXcgdGhlIHdpZGdl
dCBjb3JyZWN0bHkgTFRSIGFuZCBSVEwuCiAgKi8KLSNpZmRlZiBHVEtfQVBJX1ZFUlNJT05fMgog
Z2ludAogbW96X2d0a193aWRnZXRfcGFpbnQoR3RrVGhlbWVXaWRnZXRUeXBlIHdpZGdldCwgR2Rr
RHJhd2FibGUqIGRyYXdhYmxlLAogICAgICAgICAgICAgICAgICAgICAgR2RrUmVjdGFuZ2xlKiBy
ZWN0LCBHZGtSZWN0YW5nbGUqIGNsaXByZWN0LAogICAgICAgICAgICAgICAgICAgICAgR3RrV2lk
Z2V0U3RhdGUqIHN0YXRlLCBnaW50IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgR3RrVGV4
dERpcmVjdGlvbiBkaXJlY3Rpb24pOwotI2Vsc2UKLWdpbnQKLW1vel9ndGtfd2lkZ2V0X3BhaW50
KEd0a1RoZW1lV2lkZ2V0VHlwZSB3aWRnZXQsIGNhaXJvX3QqIGNyLAotICAgICAgICAgICAgICAg
ICAgICAgR2RrUmVjdGFuZ2xlKiByZWN0LCBHdGtXaWRnZXRTdGF0ZSogc3RhdGUsCi0gICAgICAg
ICAgICAgICAgICAgICBnaW50IGZsYWdzLCBHdGtUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbik7Ci0j
ZW5kaWYKIAogLyoqKiBXaWRnZXQgbWV0cmljcyAqKiovCiAvKioKQEAgLTMxMywzICszMTIsNSBA
QCBHdGtXaWRnZXQqIG1vel9ndGtfZ2V0X3Byb2dyZXNzX3dpZGdldCh2b2lkKTsKICNlbmRpZiAv
KiBfX2NwbHVzcGx1cyAqLwogCiAjZW5kaWYKKworI2VuZGlmIC8vIEdUS19BUElfVkVSU0lPTl8y
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76519</attachid>
            <date>2010-12-14 02:29:36 -0800</date>
            <delta_ts>2010-12-14 02:29:36 -0800</delta_ts>
            <desc>Port gtk2 code to GtkStyleContext</desc>
            <filename>gtk-style-context-2.diff</filename>
            <type>text/plain</type>
            <size>44004</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrMy5jcHAgYi9X
ZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0azMuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLmMxNmI1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3Bs
YXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0azMuY3BwCkBAIC0wLDAgKzEsODgyIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbHAg
VG9rZXIgPGFscEBhdG9rZXIuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbGxhYm9yYSBM
dGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgS2VubmV0aCBSb2hkZSBDaHJpc3RpYW5zZW4KKyAq
IENvcHlyaWdodCAoQykgMjAxMCBJZ2FsaWEgUy5MLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICog
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBHVEtfQVBJX1ZFUlNJ
T05fMgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWVHdGsuaCIK
KworI2luY2x1ZGUgIkNTU1ZhbHVlS2V5d29yZHMuaCIKKyNpbmNsdWRlICJHT3duUHRyLmgiCisj
aW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiR3RrVmVyc2lvbmluZy5oIgor
I2luY2x1ZGUgIkhUTUxOYW1lcy5oIgorI2luY2x1ZGUgIlJlbmRlckJveC5oIgorI2luY2x1ZGUg
IlJlbmRlck9iamVjdC5oIgorI2luY2x1ZGUgIlVzZXJBZ2VudFN0eWxlU2hlZXRzLmgiCisjaW5j
bHVkZSA8Z3RrL2d0ay5oPgorCisjaWYgRU5BQkxFKFBST0dSRVNTX1RBRykKKyNpbmNsdWRlICJS
ZW5kZXJQcm9ncmVzcy5oIgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKwordXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKKworLy8gQXMgZGVm
aW5lZCBpbiBndGthcnJvdy5jCitzdGF0aWMgY29uc3QgaW50IG1pbkFycm93U2l6ZSA9IDE1Owor
Cit0eXBlZGVmIEhhc2hNYXA8R1R5cGUsIFBsYXRmb3JtUmVmUHRyPEd0a1N0eWxlQ29udGV4dD4g
PiBTdHlsZUNvbnRleHRNYXA7CisKK3N0YXRpYyBTdHlsZUNvbnRleHRNYXAmIHN0eWxlQ29udGV4
dE1hcCgpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChTdHlsZUNvbnRleHRNYXAsIG1hcCwg
KCkpOworICAgIHJldHVybiBtYXA7Cit9CisKK3N0YXRpYyB2b2lkIGd0a1N0eWxlQ2hhbmdlZENh
bGxiYWNrKEdPYmplY3QqLCBHUGFyYW1TcGVjKiwgUmVuZGVyVGhlbWUqIHJlbmRlclRoZW1lKQor
eworICAgIFN0eWxlQ29udGV4dE1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gc3R5bGVDb250ZXh0
TWFwKCkuZW5kKCk7CisgICAgZm9yIChTdHlsZUNvbnRleHRNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0
ZXIgPSBzdHlsZUNvbnRleHRNYXAoKS5iZWdpbigpOyBpdGVyICE9IGVuZDsgKytpdGVyKQorICAg
ICAgICBndGtfc3R5bGVfY29udGV4dF9pbnZhbGlkYXRlKGl0ZXItPnNlY29uZC5nZXQoKSk7CisK
KyAgICByZW5kZXJUaGVtZS0+cGxhdGZvcm1Db2xvcnNEaWRDaGFuZ2UoKTsKK30KKworc3RhdGlj
IEd0a1N0eWxlQ29udGV4dCogZ2V0U3R5bGVDb250ZXh0KEdUeXBlIGdUeXBlKQoreworICAgIGlm
ICghc3R5bGVDb250ZXh0TWFwKCkuY29udGFpbnMoZ1R5cGUpKSB7CisgICAgICAgIEd0a1dpZGdl
dFBhdGgqIHBhdGggPSBndGtfd2lkZ2V0X3BhdGhfbmV3KCk7CisgICAgICAgIGd0a193aWRnZXRf
cGF0aF9hcHBlbmRfdHlwZShwYXRoLCBnVHlwZSk7CisKKyAgICAgICAgUGxhdGZvcm1SZWZQdHI8
R3RrU3R5bGVDb250ZXh0PiBjb250ZXh0ID0gYWRvcHRQbGF0Zm9ybVJlZihndGtfc3R5bGVfY29u
dGV4dF9uZXcoKSk7CisgICAgICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9wYXRoKGNvbnRleHQu
Z2V0KCksIHBhdGgpOworICAgICAgICBndGtfd2lkZ2V0X3BhdGhfZnJlZShwYXRoKTsKKworICAg
ICAgICBzdHlsZUNvbnRleHRNYXAoKS5zZXQoZ1R5cGUsIGNvbnRleHQpOworICAgICAgICByZXR1
cm4gY29udGV4dC5nZXQoKTsKKyAgICB9CisKKyAgICBTdHlsZUNvbnRleHRNYXA6Oml0ZXJhdG9y
IGl0ZXIgPSBzdHlsZUNvbnRleHRNYXAoKS5maW5kKGdUeXBlKTsKKyAgICByZXR1cm4gaXRlci0+
c2Vjb25kLmdldCgpOworfQorCitSZW5kZXJUaGVtZUd0azo6UmVuZGVyVGhlbWVHdGsoKQorICAg
IDogbV9wYW5lbENvbG9yKENvbG9yOjp3aGl0ZSkKKyAgICAsIG1fc2xpZGVyQ29sb3IoQ29sb3I6
OndoaXRlKQorICAgICwgbV9zbGlkZXJUaHVtYkNvbG9yKENvbG9yOjp3aGl0ZSkKKyAgICAsIG1f
bWVkaWFJY29uU2l6ZSgxNikKKyAgICAsIG1fbWVkaWFTbGlkZXJIZWlnaHQoMTQpCisgICAgLCBt
X21lZGlhU2xpZGVyVGh1bWJXaWR0aCgxMikKKyAgICAsIG1fbWVkaWFTbGlkZXJUaHVtYkhlaWdo
dCgxMikKK3sKKyAgICBHdGtTZXR0aW5ncyogc2V0dGluZ3MgPSBndGtfc2V0dGluZ3NfZ2V0X2Rl
ZmF1bHQoKTsKKworICAgIGdfc2lnbmFsX2Nvbm5lY3Qoc2V0dGluZ3MsICJub3RpZnk6Omd0ay10
aGVtZS1uYW1lIiwgR19DQUxMQkFDSyhndGtTdHlsZUNoYW5nZWRDYWxsYmFjayksIHRoaXMpOwor
ICAgIGdfc2lnbmFsX2Nvbm5lY3Qoc2V0dGluZ3MsICJub3RpZnk6Omd0ay1jb2xvci1zY2hlbWUi
LCBHX0NBTExCQUNLKGd0a1N0eWxlQ2hhbmdlZENhbGxiYWNrKSwgdGhpcyk7CisKKyNpZiBFTkFC
TEUoVklERU8pCisgICAgaW5pdE1lZGlhQ29sb3JzKCk7CisgICAgaW5pdE1lZGlhQnV0dG9ucygp
OworI2VuZGlmCit9CisKK1JlbmRlclRoZW1lR3RrOjp+UmVuZGVyVGhlbWVHdGsoKQoreworfQor
CitHdGtTdHlsZUNvbnRleHQqIFJlbmRlclRoZW1lR3RrOjpndGtTY3JvbGxiYXJTdHlsZSgpCit7
CisgICAgcmV0dXJuIGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9TQ1JPTExCQVIpOworfQorCitQ
bGF0Zm9ybVJlZlB0cjxHZGtQaXhidWY+IFJlbmRlclRoZW1lR3RrOjpnZXRTdG9ja0ljb24oR1R5
cGUgZ1R5cGUsIGNvbnN0IGNoYXIqIGljb25OYW1lLCBnaW50IGRpcmVjdGlvbiwgZ2ludCBzdGF0
ZSwgZ2ludCBpY29uU2l6ZSkKK3sKKyAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQgPSBnZXRT
dHlsZUNvbnRleHQoZ1R5cGUpOworICAgIEd0a0ljb25TZXQqIGljb25TZXQgPSBndGtfc3R5bGVf
Y29udGV4dF9sb29rdXBfaWNvbl9zZXQoY29udGV4dCwgaWNvbk5hbWUpOworCisgICAgZ3RrX3N0
eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKKworICAgIGd1aW50IGZsYWdzID0gMDsKKyAgICBz
d2l0Y2ggKHN0YXRlKSB7CisgICAgY2FzZSBHVEtfU1RBVEVfUFJFTElHSFQ6CisgICAgICAgIGZs
YWdzIHw9IEdUS19TVEFURV9GTEFHX1BSRUxJR0hUOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IEdUS19TVEFURV9JTlNFTlNJVElWRToKKyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdf
SU5TRU5TSVRJVkU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFr
OworICAgIH0KKworICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9zdGF0ZShjb250ZXh0LCBzdGF0
aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPihmbGFncykpOworICAgIGd0a19zdHlsZV9jb250ZXh0X3Nl
dF9kaXJlY3Rpb24oY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlvbj4oZGlyZWN0
aW9uKSk7CisgICAgUGxhdGZvcm1SZWZQdHI8R2RrUGl4YnVmPiBpY29uID0gYWRvcHRQbGF0Zm9y
bVJlZihndGtfaWNvbl9zZXRfcmVuZGVyX2ljb25fcGl4YnVmKGljb25TZXQsIGNvbnRleHQsIHN0
YXRpY19jYXN0PEd0a0ljb25TaXplPihpY29uU2l6ZSkpKTsKKworICAgIGd0a19zdHlsZV9jb250
ZXh0X3Jlc3RvcmUoY29udGV4dCk7CisKKyAgICByZXR1cm4gaWNvbjsKK30KKworc3RhdGljIHZv
aWQgc2V0VG9nZ2xlU2l6ZShHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQsIFJlbmRlclN0eWxlKiBz
dHlsZSkKK3sKKyAgICAvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBhcmUgYm90aCBzcGVjaWZpZWQs
IHNvIHdlIHNob3VsZG4ndCBjaGFuZ2UgdGhlbS4KKyAgICBpZiAoIXN0eWxlLT53aWR0aCgpLmlz
SW50cmluc2ljT3JBdXRvKCkgJiYgIXN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgLy8gRklYTUU6IFRoaXMgaXMgcHJvYmFibHkgbm90IGNvcnJlY3QgdXNl
IG9mIGluZGljYXRvclNpemUgYW5kIGluZGljYXRvclNwYWNpbmcuCisgICAgZ2ludCBpbmRpY2F0
b3JTaXplLCBpbmRpY2F0b3JTcGFjaW5nOworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHls
ZShjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kaWNhdG9yLXNp
emUiLCAmaW5kaWNhdG9yU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlu
ZGljYXRvci1zcGFjaW5nIiwgJmluZGljYXRvclNwYWNpbmcsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIDApOworCisgICAgLy8gT3RoZXIgcG9ydHMgaGFyZC1jb2RlIHRoaXMgdG8g
MTMsIGJ1dCBHVEsrIHVzZXJzIHRlbmQgdG8gZGVtYW5kIHRoZSBuYXRpdmUgbG9vay4KKyAgICAv
LyBJdCBjb3VsZCBiZSBtYWRlIGEgY29uZmlndXJhdGlvbiBvcHRpb24gdmFsdWVzIG90aGVyIHRo
YW4gMTMgYWN0dWFsbHkgYnJlYWsgc2l0ZSBjb21wYXRpYmlsaXR5LgorICAgIGludCBsZW5ndGgg
PSBpbmRpY2F0b3JTaXplICsgaW5kaWNhdG9yU3BhY2luZzsKKyAgICBpZiAoc3R5bGUtPndpZHRo
KCkuaXNJbnRyaW5zaWNPckF1dG8oKSkKKyAgICAgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChs
ZW5ndGgsIEZpeGVkKSk7CisKKyAgICBpZiAoc3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKQorICAg
ICAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChsZW5ndGgsIEZpeGVkKSk7Cit9CisKK3N0YXRp
YyB2b2lkIHBhaW50VG9nZ2xlKGNvbnN0IFJlbmRlclRoZW1lR3RrKiB0aGVtZSwgR1R5cGUgZ1R5
cGUsIFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5m
bywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQg
PSBnZXRTdHlsZUNvbnRleHQoZ1R5cGUpOworICAgIGd0a19zdHlsZV9jb250ZXh0X3NhdmUoY29u
dGV4dCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfZGlyZWN0aW9uKGNvbnRleHQsIHN0
YXRpY19jYXN0PEd0a1RleHREaXJlY3Rpb24+KFJlbmRlclRoZW1lR3RrOjpndGtUZXh0RGlyZWN0
aW9uKHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKSk7CisgICAgZ3RrX3N0eWxl
X2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIGdUeXBlID09IEdUS19UWVBFX0NIRUNLX0JVVFRP
TiA/IEdUS19TVFlMRV9DTEFTU19DSEVDSyA6IEdUS19TVFlMRV9DTEFTU19SQURJTyk7CisKKyAg
ICBnaW50IGluZGljYXRvclNpemUsIGluZGljYXRvclNwYWNpbmc7CisgICAgZ3RrX3N0eWxlX2Nv
bnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICJpbmRpY2F0b3Itc2l6ZSIsICZpbmRpY2F0b3JTaXplLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiaW5kaWNhdG9yLXNwYWNpbmciLCAmaW5kaWNhdG9yU3BhY2luZywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgSW50UmVjdCBpbmRpY2F0b3JSZWN0
KHJlY3QueCgpLCByZWN0LnkoKSArIChyZWN0LmhlaWdodCgpIC0gaW5kaWNhdG9yU2l6ZSksIGlu
ZGljYXRvclNpemUsIGluZGljYXRvclNpemUpOworCisgICAgZ3VpbnQgZmxhZ3MgPSAwOworICAg
IGlmICh0aGVtZS0+aXNDaGVja2VkKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdU
S19TVEFURV9GTEFHX0FDVElWRTsKKyAgICBpZiAodGhlbWUtPmlzUHJlc3NlZChyZW5kZXJPYmpl
Y3QpKQorICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19TRUxFQ1RFRDsKKyAgICBpZiAo
dGhlbWUtPmlzSG92ZXJlZChyZW5kZXJPYmplY3QpKQorICAgICAgICBmbGFncyB8PSBHVEtfU1RB
VEVfRkxBR19QUkVMSUdIVDsKKyAgICBlbHNlIGlmICghdGhlbWUtPmlzRW5hYmxlZChyZW5kZXJP
YmplY3QpIHx8IHRoZW1lLT5pc1JlYWRPbmx5Q29udHJvbChyZW5kZXJPYmplY3QpKQorICAgICAg
ICBmbGFncyB8PSBHVEtfU1RBVEVfSU5TRU5TSVRJVkU7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRf
c2V0X3N0YXRlKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSk7CisK
KyAgICBpZiAoZ1R5cGUgPT0gR1RLX1RZUEVfQ0hFQ0tfQlVUVE9OKSB7CisgICAgICAgIGd0a19y
ZW5kZXJfY2hlY2soY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgp
LCBpbmRpY2F0b3JSZWN0LngoKSwgaW5kaWNhdG9yUmVjdC55KCksCisgICAgICAgICAgICAgICAg
ICAgICAgICAgaW5kaWNhdG9yUmVjdC53aWR0aCgpLCBpbmRpY2F0b3JSZWN0LmhlaWdodCgpKTsK
KyAgICB9IGVsc2UgeworICAgICAgICBndGtfcmVuZGVyX29wdGlvbihjb250ZXh0LCBwYWludElu
Zm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIGluZGljYXRvclJlY3QueCgpLCBpbmRpY2F0
b3JSZWN0LnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yUmVjdC53aWR0
aCgpLCBpbmRpY2F0b3JSZWN0LmhlaWdodCgpKTsKKyAgICB9CisKKyAgICBpZiAodGhlbWUtPmlz
Rm9jdXNlZChyZW5kZXJPYmplY3QpKSB7CisgICAgICAgIGluZGljYXRvclJlY3QuaW5mbGF0ZShp
bmRpY2F0b3JTcGFjaW5nKTsKKyAgICAgICAgZ3RrX3JlbmRlcl9mb2N1cyhjb250ZXh0LCBwYWlu
dEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIGluZGljYXRvclJlY3QueCgpLCBpbmRp
Y2F0b3JSZWN0LnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3JSZWN0Lndp
ZHRoKCksIGluZGljYXRvclJlY3QuaGVpZ2h0KCkpOworICAgIH0KKworICAgIGd0a19zdHlsZV9j
b250ZXh0X3Jlc3RvcmUoY29udGV4dCk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6OnNldENo
ZWNrYm94U2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgc2V0VG9nZ2xlU2l6
ZShnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfQ0hFQ0tfQlVUVE9OKSwgc3R5bGUpOworfQorCiti
b29sIFJlbmRlclRoZW1lR3RrOjpwYWludENoZWNrYm94KFJlbmRlck9iamVjdCogcmVuZGVyT2Jq
ZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sK
KyAgICBpZiAocGFpbnRJbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgcGFpbnRUb2dnbGUodGhpcywgR1RLX1RZUEVfQ0hFQ0tfQlVU
VE9OLCByZW5kZXJPYmplY3QsIHBhaW50SW5mbywgcmVjdCk7CisKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6OnNldFJhZGlvU2l6ZShSZW5kZXJTdHlsZSogc3R5
bGUpIGNvbnN0Cit7CisgICAgc2V0VG9nZ2xlU2l6ZShnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVf
UkFESU9fQlVUVE9OKSwgc3R5bGUpOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFJh
ZGlvKFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5m
bywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRJbmZvLmNvbnRleHQtPnBh
aW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcGFpbnRUb2dn
bGUodGhpcywgR1RLX1RZUEVfUkFESU9fQlVUVE9OLCByZW5kZXJPYmplY3QsIHBhaW50SW5mbywg
cmVjdCk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBh
aW50QnV0dG9uKFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBh
aW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRJbmZvLmNvbnRl
eHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgR3Rr
U3R5bGVDb250ZXh0KiBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX0JVVFRPTik7
CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKKworICAgIGd0a19zdHlsZV9j
b250ZXh0X3NldF9kaXJlY3Rpb24oY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlv
bj4oZ3RrVGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpKSkp
OworICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xB
U1NfQlVUVE9OKTsKKworICAgIEludFJlY3QgYnV0dG9uUmVjdCA9IHJlY3Q7CisKKyAgICBnYm9v
bGVhbiBpbnRlcmlvckZvY3VzOworICAgIGdpbnQgZm9jdXNXaWR0aCwgZm9jdXNQYWQ7CisgICAg
Z3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICJmb2N1cy1saW5lLXdpZHRoIiwgJmZvY3VzV2lkdGgsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICJmb2N1cy1wYWRkaW5nIiwgJmZvY3VzUGFkLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJpb3ItZm9jdXMiLCAmaW50ZXJpb3JGb2N1
cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgICBpZiAoaXNEZWZh
dWx0KHJlbmRlck9iamVjdCkpIHsKKyAgICAgICAgR3RrQm9yZGVyKiBib3JkZXJQdHIgPSAwOwor
ICAgICAgICBHdGtCb3JkZXIgYm9yZGVyID0geyAxLCAxLCAxLCAxIH07CisKKyAgICAgICAgZ3Rr
X3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsICJkZWZhdWx0LWJvcmRlciIsICZib3Jk
ZXJQdHIsIDApOworICAgICAgICBpZiAoYm9yZGVyUHRyKSB7CisgICAgICAgICAgICBib3JkZXIg
PSAqYm9yZGVyUHRyOworICAgICAgICAgICAgZ3RrX2JvcmRlcl9mcmVlKGJvcmRlclB0cik7Cisg
ICAgICAgIH0KKworICAgICAgICBidXR0b25SZWN0Lm1vdmUoYm9yZGVyLmxlZnQsIGJvcmRlci50
b3ApOworICAgICAgICBidXR0b25SZWN0LnNldFdpZHRoKGJ1dHRvblJlY3Qud2lkdGgoKSAtIChi
b3JkZXIubGVmdCArIGJvcmRlci5yaWdodCkpOworICAgICAgICBidXR0b25SZWN0LnNldEhlaWdo
dChidXR0b25SZWN0LmhlaWdodCgpIC0gKGJvcmRlci50b3AgKyBib3JkZXIuYm90dG9tKSk7CisK
KyAgICAgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9D
TEFTU19ERUZBVUxUKTsKKyAgICB9CisKKyAgICBpZiAoIWludGVyaW9yRm9jdXMgJiYgaXNGb2N1
c2VkKHJlbmRlck9iamVjdCkpCisgICAgICAgIGJ1dHRvblJlY3QuaW5mbGF0ZSgtKGZvY3VzV2lk
dGggKyBmb2N1c1BhZCkpOworCisgICAgZ3VpbnQgZmxhZ3MgPSAwOworICAgIGlmICghaXNFbmFi
bGVkKHJlbmRlck9iamVjdCkgfHwgaXNSZWFkT25seUNvbnRyb2wocmVuZGVyT2JqZWN0KSkKKyAg
ICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfSU5TRU5TSVRJVkU7CisgICAgZWxzZSBpZiAo
aXNQcmVzc2VkKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFH
X0FDVElWRTsKKyAgICBlbHNlIGlmIChpc0hvdmVyZWQocmVuZGVyT2JqZWN0KSkKKyAgICAgICAg
ZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfUFJFTElHSFQ7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRf
c2V0X3N0YXRlKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSk7CisK
KyAgICBndGtfcmVuZGVyX2JhY2tncm91bmQoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBs
YXRmb3JtQ29udGV4dCgpLCBidXR0b25SZWN0LngoKSwgYnV0dG9uUmVjdC55KCksIGJ1dHRvblJl
Y3Qud2lkdGgoKSwgYnV0dG9uUmVjdC5oZWlnaHQoKSk7CisgICAgZ3RrX3JlbmRlcl9mcmFtZShj
b250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIGJ1dHRvblJlY3Qu
eCgpLCBidXR0b25SZWN0LnkoKSwgYnV0dG9uUmVjdC53aWR0aCgpLCBidXR0b25SZWN0LmhlaWdo
dCgpKTsKKworICAgIGlmIChpc0ZvY3VzZWQocmVuZGVyT2JqZWN0KSkgeworICAgICAgICBpZiAo
aW50ZXJpb3JGb2N1cykgeworICAgICAgICAgICAgR3RrQm9yZGVyIGJvcmRlcldpZHRoOworICAg
ICAgICAgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X2JvcmRlcihjb250ZXh0LCBzdGF0aWNfY2Fz
dDxHdGtTdGF0ZUZsYWdzPihmbGFncyksICZib3JkZXJXaWR0aCk7CisKKyAgICAgICAgICAgIGJ1
dHRvblJlY3QubW92ZShib3JkZXJXaWR0aC5sZWZ0ICsgZm9jdXNQYWQsIGJvcmRlcldpZHRoLnRv
cCArIGZvY3VzUGFkKTsKKyAgICAgICAgICAgIGJ1dHRvblJlY3Quc2V0V2lkdGgoYnV0dG9uUmVj
dC53aWR0aCgpIC0gKDIgKiBmb2N1c1BhZCArIGJvcmRlcldpZHRoLmxlZnQgKyBib3JkZXJXaWR0
aC5yaWdodCkpOworICAgICAgICAgICAgYnV0dG9uUmVjdC5zZXRIZWlnaHQoYnV0dG9uUmVjdC5o
ZWlnaHQoKSAtICgyICogZm9jdXNQYWQgKyBib3JkZXJXaWR0aC50b3AgKyBib3JkZXJXaWR0aC5i
b3R0b20pKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBidXR0b25SZWN0LmluZmxhdGUo
Zm9jdXNXaWR0aCArIGZvY3VzUGFkKTsKKworICAgICAgICBndGtfcmVuZGVyX2ZvY3VzKGNvbnRl
eHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgYnV0dG9uUmVjdC54KCks
IGJ1dHRvblJlY3QueSgpLCBidXR0b25SZWN0LndpZHRoKCksIGJ1dHRvblJlY3QuaGVpZ2h0KCkp
OworICAgIH0KKworICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4dCk7CisKKyAg
ICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGdldENvbWJvQm94TWV0cmljcyhSZW5k
ZXJTdHlsZSogc3R5bGUsIEd0a0JvcmRlciYgYm9yZGVyLCBpbnQmIGZvY3VzLCBpbnQmIHNlcGFy
YXRvcikKK3sKKyAgICAvLyBJZiB0aGlzIG1lbnUgbGlzdCBidXR0b24gaXNuJ3QgZHJhd24gdXNp
bmcgdGhlIG5hdGl2ZSB0aGVtZSwgd2UKKyAgICAvLyBkb24ndCBhZGQgYW55IGV4dHJhIHBhZGRp
bmcgYmV5b25kIHdoYXQgV2ViQ29yZSBhbHJlYWR5IHVzZXMuCisgICAgaWYgKHN0eWxlLT5hcHBl
YXJhbmNlKCkgPT0gTm9Db250cm9sUGFydCkKKyAgICAgICAgcmV0dXJuOworCisgICAgR3RrU3R5
bGVDb250ZXh0KiBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX0JVVFRPTik7Cisg
ICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKKworICAgIGd0a19zdHlsZV9jb250
ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfQlVUVE9OKTsKKworICAgIEd0
a0JvcmRlciBib3JkZXJXaWR0aDsKKyAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfYm9yZGVyKGNv
bnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KDApLCAmYm9yZGVyV2lkdGgpOworICAg
IGJvcmRlciA9IGJvcmRlcldpZHRoOworCisgICAgZ2ludCBmb2N1c1dpZHRoLCBmb2N1c1BhZDsK
KyAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUoY29udGV4dCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgImZvY3VzLWxpbmUtd2lkdGgiLCAmZm9jdXNXaWR0aCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzLXBhZGRpbmciLCAmZm9jdXNQYWQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgZm9jdXMgPSBmb2N1c1dp
ZHRoICsgZm9jdXNQYWQ7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9yZXN0b3JlKGNvbnRleHQp
OworCisgICAgY29udGV4dCA9IGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9TRVBBUkFUT1IpOwor
ICAgIGd0a19zdHlsZV9jb250ZXh0X3NhdmUoY29udGV4dCk7CisKKyAgICBHdGtUZXh0RGlyZWN0
aW9uIGRpcmVjdGlvbiA9IHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rpb24+KFJlbmRlclRoZW1l
R3RrOjpndGtUZXh0RGlyZWN0aW9uKHN0eWxlLT5kaXJlY3Rpb24oKSkpOworICAgIGd0a19zdHls
ZV9jb250ZXh0X3NldF9kaXJlY3Rpb24oY29udGV4dCwgZGlyZWN0aW9uKTsKKyAgICBndGtfc3R5
bGVfY29udGV4dF9hZGRfY2xhc3MoY29udGV4dCwgInNlcGFyYXRvciIpOworICAgIGd0a19zdHls
ZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfQlVUVE9OKTsKKwor
ICAgIGdib29sZWFuIHdpZGVTZXBhcmF0b3JzOworICAgIGdpbnQgc2VwYXJhdG9yV2lkdGg7Cisg
ICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICJ3aWRlLXNlcGFyYXRvcnMiLCAmd2lkZVNlcGFyYXRvcnMsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3Itd2lkdGgiLCAmc2VwYXJhdG9y
V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgaWYgKCF3
aWRlU2VwYXJhdG9ycykKKyAgICAgICAgc2VwYXJhdG9yV2lkdGggPSBib3JkZXIubGVmdDsKKwor
ICAgIHNlcGFyYXRvciA9IHNlcGFyYXRvcldpZHRoOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRf
cmVzdG9yZShjb250ZXh0KTsKK30KKworaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFs
UGFkZGluZ0xlZnQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIEd0a0JvcmRlciBi
b3JkZXJXaWR0aCA9IHsgMCwgMCwgMCwgMCB9OworICAgIGludCBmb2N1c1dpZHRoID0gMCwgc2Vw
YXJhdG9yV2lkdGggPSAwOworICAgIGdldENvbWJvQm94TWV0cmljcyhzdHlsZSwgYm9yZGVyV2lk
dGgsIGZvY3VzV2lkdGgsIHNlcGFyYXRvcldpZHRoKTsKKyAgICBpbnQgbGVmdCA9IGJvcmRlcldp
ZHRoLmxlZnQgKyBmb2N1c1dpZHRoOworICAgIGlmIChzdHlsZS0+ZGlyZWN0aW9uKCkgPT0gUlRM
KQorICAgICAgICBsZWZ0ICs9IHNlcGFyYXRvcldpZHRoICsgbWluQXJyb3dTaXplOworICAgIHJl
dHVybiBsZWZ0OworfQorCitpbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5n
UmlnaHQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIEd0a0JvcmRlciBib3JkZXJX
aWR0aCA9IHsgMCwgMCwgMCwgMCB9OworICAgIGludCBmb2N1c1dpZHRoID0gMCwgc2VwYXJhdG9y
V2lkdGggPSAwOworICAgIGdldENvbWJvQm94TWV0cmljcyhzdHlsZSwgYm9yZGVyV2lkdGgsIGZv
Y3VzV2lkdGgsIHNlcGFyYXRvcldpZHRoKTsKKyAgICBpbnQgcmlnaHQgPSBib3JkZXJXaWR0aC5y
aWdodCArIGZvY3VzV2lkdGg7CisgICAgaWYgKHN0eWxlLT5kaXJlY3Rpb24oKSA9PSBMVFIpCisg
ICAgICAgIHJpZ2h0ICs9IHNlcGFyYXRvcldpZHRoICsgbWluQXJyb3dTaXplOworICAgIHJldHVy
biByaWdodDsKK30KKworaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ1Rv
cChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgR3RrQm9yZGVyIGJvcmRlcldpZHRo
ID0geyAwLCAwLCAwLCAwIH07CisgICAgaW50IGZvY3VzV2lkdGggPSAwLCBzZXBhcmF0b3JXaWR0
aCA9IDA7CisgICAgZ2V0Q29tYm9Cb3hNZXRyaWNzKHN0eWxlLCBib3JkZXJXaWR0aCwgZm9jdXNX
aWR0aCwgc2VwYXJhdG9yV2lkdGgpOworICAgIHJldHVybiBib3JkZXJXaWR0aC50b3AgKyBmb2N1
c1dpZHRoOworfQorCitpbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nQm90
dG9tKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBHdGtCb3JkZXIgYm9yZGVyV2lk
dGggPSB7IDAsIDAsIDAsIDAgfTsKKyAgICBpbnQgZm9jdXNXaWR0aCA9IDAsIHNlcGFyYXRvcldp
ZHRoID0gMDsKKyAgICBnZXRDb21ib0JveE1ldHJpY3Moc3R5bGUsIGJvcmRlcldpZHRoLCBmb2N1
c1dpZHRoLCBzZXBhcmF0b3JXaWR0aCk7CisgICAgcmV0dXJuIGJvcmRlcldpZHRoLmJvdHRvbSAr
IGZvY3VzV2lkdGg7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50TWVudUxpc3QoUmVu
ZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25z
dCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChwYWludEluZm8uY29udGV4dC0+cGFpbnRpbmdE
aXNhYmxlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBHdGtUZXh0RGlyZWN0aW9u
IGRpcmVjdGlvbiA9IHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rpb24+KGd0a1RleHREaXJlY3Rp
b24ocmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpOworICAgIEd0a1N0eWxlQ29u
dGV4dCogY29udGV4dCA9IGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9CVVRUT04pOworICAgIGd0
a19zdHlsZV9jb250ZXh0X3NhdmUoY29udGV4dCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9z
ZXRfZGlyZWN0aW9uKGNvbnRleHQsIGRpcmVjdGlvbik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRf
YWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19CVVRUT04pOworCisgICAgSW50UmVj
dCBjb21ib1JlY3QgPSByZWN0OworCisgICAgZ3VpbnQgZmxhZ3MgPSAwOworICAgIGlmICghaXNF
bmFibGVkKHJlbmRlck9iamVjdCkgfHwgaXNSZWFkT25seUNvbnRyb2wocmVuZGVyT2JqZWN0KSkK
KyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfSU5TRU5TSVRJVkU7CisgICAgZWxzZSBp
ZiAoaXNQcmVzc2VkKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9G
TEFHX0FDVElWRTsKKyAgICBlbHNlIGlmIChpc0hvdmVyZWQocmVuZGVyT2JqZWN0KSkKKyAgICAg
ICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfUFJFTElHSFQ7CisgICAgZ3RrX3N0eWxlX2NvbnRl
eHRfc2V0X3N0YXRlKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSk7
CisKKyAgICBndGtfcmVuZGVyX2JhY2tncm91bmQoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQt
PnBsYXRmb3JtQ29udGV4dCgpLCBjb21ib1JlY3QueCgpLCBjb21ib1JlY3QueSgpLCBjb21ib1Jl
Y3Qud2lkdGgoKSwgY29tYm9SZWN0LmhlaWdodCgpKTsKKyAgICBndGtfcmVuZGVyX2ZyYW1lKGNv
bnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgY29tYm9SZWN0Lngo
KSwgY29tYm9SZWN0LnkoKSwgY29tYm9SZWN0LndpZHRoKCksIGNvbWJvUmVjdC5oZWlnaHQoKSk7
CisKKyAgICBHdGtCb3JkZXIgYm9yZGVyV2lkdGg7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0
X2JvcmRlcihjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPihmbGFncyksICZib3Jk
ZXJXaWR0aCk7CisKKyAgICBnaW50IGZvY3VzV2lkdGgsIGZvY3VzUGFkOworICAgIEd0a0JvcmRl
ciogaW5uZXJCb3JkZXJQdHIgPSAwOworICAgIEd0a0JvcmRlciBpbm5lckJvcmRlciA9IHsgMSwg
MSwgMSwgMSB9OworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShjb250ZXh0LAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5uZXItYm9yZGVyIiwgJmlubmVyQm9yZGVy
UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9jdXMtbGluZS13aWR0aCIs
ICZmb2N1c1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9jdXMtcGFk
ZGluZyIsICZmb2N1c1BhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Cisg
ICAgaWYgKGlubmVyQm9yZGVyUHRyKSB7CisgICAgICAgIGlubmVyQm9yZGVyID0gKmlubmVyQm9y
ZGVyUHRyOworICAgICAgICBndGtfYm9yZGVyX2ZyZWUoaW5uZXJCb3JkZXJQdHIpOworICAgIH0K
KworICAgIGlmIChpc0ZvY3VzZWQocmVuZGVyT2JqZWN0KSkgeworICAgICAgICBJbnRSZWN0IGZv
Y3VzUmVjdCA9IGNvbWJvUmVjdDsKKyAgICAgICAgZm9jdXNSZWN0Lm1vdmUoYm9yZGVyV2lkdGgu
bGVmdCArIGZvY3VzUGFkLCBib3JkZXJXaWR0aC50b3AgKyBmb2N1c1BhZCk7CisgICAgICAgIGZv
Y3VzUmVjdC5zZXRXaWR0aChmb2N1c1JlY3Qud2lkdGgoKSAtICgyICogZm9jdXNQYWQgKyBib3Jk
ZXJXaWR0aC5sZWZ0ICsgYm9yZGVyV2lkdGgucmlnaHQpKTsKKyAgICAgICAgZm9jdXNSZWN0LnNl
dEhlaWdodChmb2N1c1JlY3QuaGVpZ2h0KCkgLSAoMiAqIGZvY3VzUGFkICsgYm9yZGVyV2lkdGgu
dG9wICsgYm9yZGVyV2lkdGguYm90dG9tKSk7CisgICAgICAgIGd0a19yZW5kZXJfZm9jdXMoY29u
dGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBmb2N1c1JlY3QueCgp
LCBmb2N1c1JlY3QueSgpLCBmb2N1c1JlY3Qud2lkdGgoKSwgZm9jdXNSZWN0LmhlaWdodCgpKTsK
KyAgICB9CisKKyAgICBjb21ib1JlY3Quc2V0WChjb21ib1JlY3QueCgpICsgYm9yZGVyV2lkdGgu
bGVmdCArIGZvY3VzV2lkdGggKyBmb2N1c1BhZCk7CisgICAgaWYgKGRpcmVjdGlvbiA9PSBHVEtf
VEVYVF9ESVJfTFRSKQorICAgICAgICBjb21ib1JlY3Quc2V0WChjb21ib1JlY3QueCgpICsgaW5u
ZXJCb3JkZXIubGVmdCk7CisgICAgZWxzZQorICAgICAgICBjb21ib1JlY3Quc2V0WChjb21ib1Jl
Y3QueCgpICsgaW5uZXJCb3JkZXIucmlnaHQpOworICAgIGNvbWJvUmVjdC5zZXRZKGNvbWJvUmVj
dC55KCkgKyBpbm5lckJvcmRlci50b3AgKyBib3JkZXJXaWR0aC50b3AgKyBmb2N1c1dpZHRoICsg
Zm9jdXNQYWQpOworICAgIGNvbWJvUmVjdC5zZXRXaWR0aChtYXgoMSwgY29tYm9SZWN0LndpZHRo
KCkgLSBpbm5lckJvcmRlci5sZWZ0IC0gaW5uZXJCb3JkZXIucmlnaHQgLSAoMiAqIChmb2N1c1dp
ZHRoICsgZm9jdXNQYWQpICsgYm9yZGVyV2lkdGgubGVmdCArIGJvcmRlcldpZHRoLnJpZ2h0KSkp
OworICAgIGNvbWJvUmVjdC5zZXRIZWlnaHQobWF4KDEsIGNvbWJvUmVjdC5oZWlnaHQoKSAtIGlu
bmVyQm9yZGVyLnRvcCAtIGlubmVyQm9yZGVyLmJvdHRvbSAtICgyICogKGZvY3VzV2lkdGggKyBm
b2N1c1BhZCkgKyBib3JkZXJXaWR0aC50b3AgKyBib3JkZXJXaWR0aC5ib3R0b20pKSk7CisKKyAg
ICBndGtfc3R5bGVfY29udGV4dF9yZXN0b3JlKGNvbnRleHQpOworCisgICAgY29udGV4dCA9IGdl
dFN0eWxlQ29udGV4dChHVEtfVFlQRV9BUlJPVyk7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2
ZShjb250ZXh0KTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9kaXJlY3Rpb24oY29udGV4
dCwgZGlyZWN0aW9uKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MoY29udGV4dCwg
ImFycm93Iik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19T
VFlMRV9DTEFTU19CVVRUT04pOworCisgICAgZ2Zsb2F0IGFycm93U2NhbGluZzsKKyAgICBndGtf
c3R5bGVfY29udGV4dF9nZXRfc3R5bGUoY29udGV4dCwgImFycm93LXNjYWxpbmciLCAmYXJyb3dT
Y2FsaW5nLCAwKTsKKworICAgIGlmIChkaXJlY3Rpb24gPT0gR1RLX1RFWFRfRElSX0xUUikKKyAg
ICAgICAgY29tYm9SZWN0LnNldFgoY29tYm9SZWN0LngoKSArIGNvbWJvUmVjdC53aWR0aCgpIC0g
bWluQXJyb3dTaXplKTsKKyAgICBjb21ib1JlY3Quc2V0V2lkdGgobWluQXJyb3dTaXplKTsKKwor
ICAgIEludFJlY3QgaW5uZXJSZWN0ID0gY29tYm9SZWN0OworCisgICAgZ2ludCBleHRlbnQgPSBt
aW4oY29tYm9SZWN0LndpZHRoKCksIGNvbWJvUmVjdC5oZWlnaHQoKSkgKiBhcnJvd1NjYWxpbmc7
CisgICAgZ2Zsb2F0IHhhbGlnbiA9IDAuNTsKKyAgICBnZmxvYXQgeWFsaWduID0gMC41OworICAg
IGlmIChkaXJlY3Rpb24gIT0gR1RLX1RFWFRfRElSX0xUUikKKyAgICAgICAgeGFsaWduID0gMS4w
IC0geGFsaWduOworICAgIGlubmVyUmVjdC5zZXRYKGZsb29yKGNvbWJvUmVjdC54KCkgKyAoY29t
Ym9SZWN0LndpZHRoKCkgLSBleHRlbnQpICogeGFsaWduKSk7CisgICAgaW5uZXJSZWN0LnNldFko
Zmxvb3IoY29tYm9SZWN0LnkoKSArIChjb21ib1JlY3QuaGVpZ2h0KCkgLSBleHRlbnQpICogeWFs
aWduKSk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfc3RhdGUoY29udGV4dCwgc3RhdGlj
X2Nhc3Q8R3RrU3RhdGVGbGFncz4oZmxhZ3MpKTsKKyAgICBndGtfcmVuZGVyX2Fycm93KGNvbnRl
eHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgR19QSSwgaW5uZXJSZWN0
LngoKSwgaW5uZXJSZWN0LnkoKSwgZXh0ZW50KTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3Jl
c3RvcmUoY29udGV4dCk7CisKKyAgICBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBF
X1NFUEFSQVRPUik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKKworICAg
IGd0a19zdHlsZV9jb250ZXh0X3NldF9kaXJlY3Rpb24oY29udGV4dCwgZGlyZWN0aW9uKTsKKyAg
ICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MoY29udGV4dCwgInNlcGFyYXRvciIpOworICAg
IGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfQlVU
VE9OKTsKKworICAgIGdib29sZWFuIHdpZGVTZXBhcmF0b3JzOworICAgIGdpbnQgc2VwYXJhdG9y
V2lkdGg7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWRlLXNlcGFyYXRvcnMiLCAmd2lkZVNlcGFyYXRv
cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXBhcmF0b3Itd2lkdGgiLCAm
c2VwYXJhdG9yV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAg
IGlmICghc2VwYXJhdG9yV2lkdGgpIHsKKyAgICAgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9y
ZShjb250ZXh0KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGd0a19zdHls
ZV9jb250ZXh0X3NldF9zdGF0ZShjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPihm
bGFncykpOworCisgICAgaWYgKHdpZGVTZXBhcmF0b3JzKSB7CisgICAgICAgIGlmIChkaXJlY3Rp
b24gPT0gR1RLX1RFWFRfRElSX0xUUikKKyAgICAgICAgICAgIGlubmVyUmVjdC5zZXRYKGlubmVy
UmVjdC54KCkgLSBzZXBhcmF0b3JXaWR0aCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlu
bmVyUmVjdC5zZXRYKGlubmVyUmVjdC54KCkgKyBpbm5lclJlY3Qud2lkdGgoKSk7CisKKyAgICAg
ICAgZ3RrX3JlbmRlcl9iYWNrZ3JvdW5kKGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0
Zm9ybUNvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyUmVjdC54
KCksIGlubmVyUmVjdC55KCksIHNlcGFyYXRvcldpZHRoLCBpbm5lclJlY3QuaGVpZ2h0KCkpOwor
ICAgICAgICBndGtfcmVuZGVyX2ZyYW1lKGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0
Zm9ybUNvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lclJlY3QueCgpLCBp
bm5lclJlY3QueSgpLCBzZXBhcmF0b3JXaWR0aCwgaW5uZXJSZWN0LmhlaWdodCgpKTsKKyAgICB9
IGVsc2UgeworICAgICAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfYm9yZGVyKGNvbnRleHQsIHN0
YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSwgJmJvcmRlcldpZHRoKTsKKyAgICAgICAg
aWYgKGRpcmVjdGlvbiA9PSBHVEtfVEVYVF9ESVJfTFRSKQorICAgICAgICAgICAgaW5uZXJSZWN0
LnNldFgoaW5uZXJSZWN0LngoKSAtIGJvcmRlcldpZHRoLmxlZnQpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBpbm5lclJlY3Quc2V0WChpbm5lclJlY3QueCgpICsgaW5uZXJSZWN0LndpZHRo
KCkpOworCisgICAgICAgIGd0a19yZW5kZXJfbGluZShjb250ZXh0LCBwYWludEluZm8uY29udGV4
dC0+cGxhdGZvcm1Db250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBpbm5lclJlY3Qu
eCgpLCBjb21ib1JlY3QueSgpLCBpbm5lclJlY3QueCgpLCBjb21ib1JlY3QuYm90dG9tKCkpOwor
ICAgIH0KKworICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4dCk7CisKKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6OnNldFRleHRJbnB1dEJvcmRl
cnMoUmVuZGVyU3R5bGUqIHN0eWxlKQoreworICAgIC8vIElmIHRoaXMgY29udHJvbCBpc24ndCBk
cmF3biB1c2luZyB0aGUgbmF0aXZlIHRoZW1lLCB3ZSBkb24ndCB0b3VjaCB0aGUgYm9yZGVycy4K
KyAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBOb0NvbnRyb2xQYXJ0KQorICAgICAgICBy
ZXR1cm47CisKKyAgICAvLyBXZSBjYW5ub3QgZ2l2ZSBhIHByb3BlciByZW5kZXJpbmcgd2hlbiBi
b3JkZXIgcmFkaXVzIGlzIGFjdGl2ZSwgdW5mb3J0dW5hdGVseS4KKyAgICBzdHlsZS0+cmVzZXRC
b3JkZXJSYWRpdXMoKTsKKworICAgIEd0a1N0eWxlQ29udGV4dCogY29udGV4dCA9IGdldFN0eWxl
Q29udGV4dChHVEtfVFlQRV9FTlRSWSk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKGNv
bnRleHQpOworICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9kaXJlY3Rpb24oY29udGV4dCwgc3Rh
dGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlvbj4oUmVuZGVyVGhlbWVHdGs6Omd0a1RleHREaXJlY3Rp
b24oc3R5bGUtPmRpcmVjdGlvbigpKSkpOworICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFz
cyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfRU5UUlkpOworCisgICAgR3RrQm9yZGVyIGJvcmRl
cldpZHRoOworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9ib3JkZXIoY29udGV4dCwgc3RhdGlj
X2Nhc3Q8R3RrU3RhdGVGbGFncz4oMCksICZib3JkZXJXaWR0aCk7CisKKyAgICBzdHlsZS0+c2V0
Qm9yZGVyTGVmdFdpZHRoKGJvcmRlcldpZHRoLmxlZnQpOworICAgIHN0eWxlLT5zZXRCb3JkZXJU
b3BXaWR0aChib3JkZXJXaWR0aC50b3ApOworICAgIHN0eWxlLT5zZXRCb3JkZXJSaWdodFdpZHRo
KGJvcmRlcldpZHRoLnJpZ2h0KTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyQm90dG9tV2lkdGgoYm9y
ZGVyV2lkdGguYm90dG9tKTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4
dCk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVj
dCogcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVj
dCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRJbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgR3RrU3R5bGVDb250ZXh0KiBjb250ZXh0
ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX0VOVFJZKTsKKyAgICBndGtfc3R5bGVfY29udGV4
dF9zYXZlKGNvbnRleHQpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X2RpcmVjdGlvbihj
b250ZXh0LCBzdGF0aWNfY2FzdDxHdGtUZXh0RGlyZWN0aW9uPihndGtUZXh0RGlyZWN0aW9uKHJl
bmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKSk7CisgICAgZ3RrX3N0eWxlX2NvbnRl
eHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19FTlRSWSk7CisKKyAgICBJbnRS
ZWN0IHRleHRSZWN0ID0gcmVjdDsKKworICAgIGdib29sZWFuIGludGVyaW9yRm9jdXM7CisgICAg
Z2ludCBmb2N1c1dpZHRoOworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShjb250ZXh0
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9jdXMtbGluZS13aWR0aCIsICZm
b2N1c1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJpb3ItZm9j
dXMiLCAmaW50ZXJpb3JGb2N1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7
CisgICAgaWYgKCFpbnRlcmlvckZvY3VzICYmIGlzRm9jdXNlZChyZW5kZXJPYmplY3QpKQorICAg
ICAgICB0ZXh0UmVjdC5pbmZsYXRlKC1mb2N1c1dpZHRoKTsKKworICAgIGd1aW50IGZsYWdzID0g
MDsKKyAgICBpZiAoIWlzRW5hYmxlZChyZW5kZXJPYmplY3QpIHx8IGlzUmVhZE9ubHlDb250cm9s
KHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX0lOU0VOU0lU
SVZFOworICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9zdGF0ZShjb250ZXh0LCBzdGF0aWNfY2Fz
dDxHdGtTdGF0ZUZsYWdzPihmbGFncykpOworCisgICAgZ3RrX3JlbmRlcl9iYWNrZ3JvdW5kKGNv
bnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgdGV4dFJlY3QueCgp
LCB0ZXh0UmVjdC55KCksIHRleHRSZWN0LndpZHRoKCksIHRleHRSZWN0LmhlaWdodCgpKTsKKyAg
ICBndGtfcmVuZGVyX2ZyYW1lKGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNv
bnRleHQoKSwgdGV4dFJlY3QueCgpLCB0ZXh0UmVjdC55KCksIHRleHRSZWN0LndpZHRoKCksIHRl
eHRSZWN0LmhlaWdodCgpKTsKKworICAgIGlmICghaW50ZXJpb3JGb2N1cyAmJiBpc0ZvY3VzZWQo
cmVuZGVyT2JqZWN0KSAmJiBpc0VuYWJsZWQocmVuZGVyT2JqZWN0KSkKKyAgICAgICAgZ3RrX3Jl
bmRlcl9mb2N1cyhjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCks
IHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKworICAg
IGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4dCk7CisKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50U2xpZGVyVHJhY2soUmVuZGVyT2JqZWN0
KiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0
JiByZWN0KQoreworICAgIGlmIChwYWludEluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBDb250cm9sUGFydCBwYXJ0ID0gcmVuZGVy
T2JqZWN0LT5zdHlsZSgpLT5hcHBlYXJhbmNlKCk7CisgICAgQVNTRVJUKHBhcnQgPT0gU2xpZGVy
SG9yaXpvbnRhbFBhcnQgfHwgcGFydCA9PSBTbGlkZXJWZXJ0aWNhbFBhcnQpOworCisgICAgR3Rr
U3R5bGVDb250ZXh0KiBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KHBhcnQgPT0gU2xpZGVyVGh1
bWJIb3Jpem9udGFsUGFydCA/IEdUS19UWVBFX0hTQ0FMRSA6IEdUS19UWVBFX1ZTQ0FMRSk7Cisg
ICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKKworICAgIGd0a19zdHlsZV9jb250
ZXh0X3NldF9kaXJlY3Rpb24oY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlvbj4o
Z3RrVGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpKSkpOwor
ICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCAic2NhbGUiKTsKKyAgICBn
dGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MoY29udGV4dCwgR1RLX1NUWUxFX0NMQVNTX1NMSURF
Uik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9D
TEFTU19UUk9VR0gpOworCisgICAgR3RrQm9yZGVyIGJvcmRlcldpZHRoOworICAgIGd0a19zdHls
ZV9jb250ZXh0X2dldF9ib3JkZXIoY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4o
MCksICZib3JkZXJXaWR0aCk7CisKKyAgICBJbnRSZWN0IHNsaWRlclJlY3QgPSByZWN0OworCisg
ICAgaWYgKHBhcnQgPT0gU2xpZGVySG9yaXpvbnRhbFBhcnQpIHsKKyAgICAgICAgc2xpZGVyUmVj
dC5tb3ZlKGJvcmRlcldpZHRoLmxlZnQsIDEpOworICAgICAgICBzbGlkZXJSZWN0LnNldFdpZHRo
KHNsaWRlclJlY3Qud2lkdGgoKSAtIChib3JkZXJXaWR0aC5sZWZ0ICsgYm9yZGVyV2lkdGgucmln
aHQpKTsKKyAgICAgICAgc2xpZGVyUmVjdC5zZXRIZWlnaHQoc2xpZGVyUmVjdC5oZWlnaHQoKSAt
IDIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNsaWRlclJlY3QubW92ZSgxLCBib3JkZXJXaWR0
aC50b3ApOworICAgICAgICBzbGlkZXJSZWN0LnNldFdpZHRoKHNsaWRlclJlY3Qud2lkdGgoKSAt
IDIpOworICAgICAgICBzbGlkZXJSZWN0LnNldEhlaWdodChzbGlkZXJSZWN0LmhlaWdodCgpIC0g
KGJvcmRlcldpZHRoLnRvcCArIGJvcmRlcldpZHRoLmJvdHRvbSkpOworICAgIH0KKworICAgIGd1
aW50IGZsYWdzID0gMDsKKyAgICBpZiAoIWlzRW5hYmxlZChyZW5kZXJPYmplY3QpIHx8IGlzUmVh
ZE9ubHlDb250cm9sKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9G
TEFHX0lOU0VOU0lUSVZFOworICAgIGVsc2UgaWYgKGlzUHJlc3NlZChyZW5kZXJPYmplY3QpKQor
ICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19BQ1RJVkU7CisgICAgZWxzZSBpZiAoaXNI
b3ZlcmVkKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX1BS
RUxJR0hUOworICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9zdGF0ZShjb250ZXh0LCBzdGF0aWNf
Y2FzdDxHdGtTdGF0ZUZsYWdzPihmbGFncykpOworCisgICAgZ3RrX3JlbmRlcl9iYWNrZ3JvdW5k
KGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgc2xpZGVyUmVj
dC54KCksIHNsaWRlclJlY3QueSgpLCBzbGlkZXJSZWN0LndpZHRoKCksIHNsaWRlclJlY3QuaGVp
Z2h0KCkpOworICAgIGd0a19yZW5kZXJfZnJhbWUoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQt
PnBsYXRmb3JtQ29udGV4dCgpLCBzbGlkZXJSZWN0LngoKSwgc2xpZGVyUmVjdC55KCksIHNsaWRl
clJlY3Qud2lkdGgoKSwgc2xpZGVyUmVjdC5oZWlnaHQoKSk7CisKKyAgICBpZiAoaXNGb2N1c2Vk
KHJlbmRlck9iamVjdCkpCisgICAgICAgIGd0a19yZW5kZXJfZm9jdXMoY29udGV4dCwgcGFpbnRJ
bmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qu
d2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9yZXN0b3Jl
KGNvbnRleHQpOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1lR3Rr
OjpwYWludFNsaWRlclRodW1iKFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25zdCBQYWlu
dEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRJ
bmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgQ29udHJvbFBhcnQgcGFydCA9IHJlbmRlck9iamVjdC0+c3R5bGUoKS0+YXBwZWFyYW5j
ZSgpOworICAgIEFTU0VSVChwYXJ0ID09IFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQgfHwgcGFy
dCA9PSBTbGlkZXJUaHVtYlZlcnRpY2FsUGFydCk7CisKKyAgICBHdGtTdHlsZUNvbnRleHQqIGNv
bnRleHQgPSBnZXRTdHlsZUNvbnRleHQocGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0
ID8gR1RLX1RZUEVfSFNDQUxFIDogR1RLX1RZUEVfVlNDQUxFKTsKKyAgICBndGtfc3R5bGVfY29u
dGV4dF9zYXZlKGNvbnRleHQpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X2RpcmVjdGlv
bihjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtUZXh0RGlyZWN0aW9uPihndGtUZXh0RGlyZWN0aW9u
KHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpKSk7CisgICAgZ3RrX3N0eWxlX2Nv
bnRleHRfYWRkX2NsYXNzKGNvbnRleHQsICJzY2FsZSIpOworICAgIGd0a19zdHlsZV9jb250ZXh0
X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfU0xJREVSKTsKKworICAgIGdpbnQg
c2xpZGVyV2lkdGgsIHNsaWRlckxlbmd0aDsKKyAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5
bGUoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWRlci13aWR0
aCIsICZzbGlkZXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWRl
ci1sZW5ndGgiLCAmc2xpZGVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAwKTsKKworICAgIEludFJlY3Qgc2xpZGVyUmVjdCA9IHJlY3Q7CisgICAgaWYgKHBhcnQgPT0g
U2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCkgeworICAgICAgICBzbGlkZXJSZWN0LnNldFkocmVj
dC55KCkgKyAocmVjdC5oZWlnaHQoKSAtIHNsaWRlckxlbmd0aCkgLyAyKTsKKyAgICAgICAgc2xp
ZGVyUmVjdC5zZXRXaWR0aChzbGlkZXJXaWR0aCk7CisgICAgICAgIHNsaWRlclJlY3Quc2V0SGVp
Z2h0KHNsaWRlckxlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2xpZGVyUmVjdC5zZXRY
KHJlY3QueCgpICsgKHJlY3Qud2lkdGgoKSAtIHNsaWRlckxlbmd0aCkgLyAyKTsKKyAgICAgICAg
c2xpZGVyUmVjdC5zZXRXaWR0aChzbGlkZXJMZW5ndGgpOworICAgICAgICBzbGlkZXJSZWN0LnNl
dEhlaWdodChzbGlkZXJXaWR0aCk7CisgICAgfQorCisgICAgZ3VpbnQgZmxhZ3MgPSAwOworICAg
IGlmICghaXNFbmFibGVkKHJlbmRlck9iamVjdCkgfHwgaXNSZWFkT25seUNvbnRyb2wocmVuZGVy
T2JqZWN0KSkKKyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfSU5TRU5TSVRJVkU7Cisg
ICAgZWxzZSBpZiAoaXNQcmVzc2VkKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdU
S19TVEFURV9GTEFHX0FDVElWRTsKKyAgICBlbHNlIGlmIChpc0hvdmVyZWQocmVuZGVyT2JqZWN0
KSkKKyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfUFJFTElHSFQ7CisgICAgZ3RrX3N0
eWxlX2NvbnRleHRfc2V0X3N0YXRlKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+
KGZsYWdzKSk7CisKKyAgICBndGtfcmVuZGVyX3NsaWRlcihjb250ZXh0LCBwYWludEluZm8uY29u
dGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHNsaWRlclJlY3QueCgpLCBzbGlkZXJSZWN0LnkoKSwg
c2xpZGVyUmVjdC53aWR0aCgpLCBzbGlkZXJSZWN0LmhlaWdodCgpLAorICAgICAgICAgICAgICAg
ICAgICAgIHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCA/IEdUS19PUklFTlRBVElP
Tl9IT1JJWk9OVEFMIDogR1RLX09SSUVOVEFUSU9OX1ZFUlRJQ0FMKTsKKworICAgIGd0a19zdHls
ZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4dCk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3Zv
aWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdFNsaWRlclRodW1iU2l6ZShSZW5kZXJPYmplY3QqIHJl
bmRlck9iamVjdCkgY29uc3QKK3sKKyAgICBDb250cm9sUGFydCBwYXJ0ID0gcmVuZGVyT2JqZWN0
LT5zdHlsZSgpLT5hcHBlYXJhbmNlKCk7CisgICAgc3dpdGNoIChwYXJ0KSB7CisgICAgY2FzZSBN
ZWRpYVNsaWRlclRodW1iUGFydDoKKyNpZiBFTkFCTEUoVklERU8pCisgICAgICAgIGlmIChwYXJ0
ID09IE1lZGlhU2xpZGVyVGh1bWJQYXJ0KSB7CisgICAgICAgICAgICByZW5kZXJPYmplY3QtPnN0
eWxlKCktPnNldFdpZHRoKExlbmd0aChtX21lZGlhU2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsK
KyAgICAgICAgICAgIHJlbmRlck9iamVjdC0+c3R5bGUoKS0+c2V0SGVpZ2h0KExlbmd0aChtX21l
ZGlhU2xpZGVyVGh1bWJIZWlnaHQsIEZpeGVkKSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAg
ICBicmVhazsKKyAgICBjYXNlIFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQ6CisgICAgY2FzZSBT
bGlkZXJUaHVtYlZlcnRpY2FsUGFydDogeworICAgICAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRl
eHQgPSBnZXRTdHlsZUNvbnRleHQocGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0ID8g
R1RLX1RZUEVfSFNDQUxFIDogR1RLX1RZUEVfVlNDQUxFKTsKKworICAgICAgICBnaW50IHNsaWRl
cldpZHRoLCBzbGlkZXJMZW5ndGg7CisgICAgICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHls
ZShjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWRlci13
aWR0aCIsICZzbGlkZXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICJzbGlkZXItbGVuZ3RoIiwgJnNsaWRlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIDApOworICAgICAgICByZW5kZXJPYmplY3QtPnN0eWxlKCktPnNldFdpZHRo
KExlbmd0aChzbGlkZXJXaWR0aCwgRml4ZWQpKTsKKyAgICAgICAgcmVuZGVyT2JqZWN0LT5zdHls
ZSgpLT5zZXRIZWlnaHQoTGVuZ3RoKHNsaWRlckxlbmd0aCwgRml4ZWQpKTsKKyAgICB9CisgICAg
ICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3Rh
dGljIENvbG9yIGdldFN0eWxlQ29sb3IoR1R5cGUgZ1R5cGUsIGJvb2wgYmFja2dyb3VuZCwgR3Rr
U3RhdGVGbGFncyBmbGFncykKK3sKKyAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQgPSBnZXRT
dHlsZUNvbnRleHQoZ1R5cGUpOworICAgIEdka1JHQkEgZ2RrUkdCQUNvbG9yOworICAgIEdka0Nv
bG9yIGdka0NvbG9yOworCisgICAgaWYgKGJhY2tncm91bmQpCisgICAgICAgIGd0a19zdHlsZV9j
b250ZXh0X2dldF9iYWNrZ3JvdW5kX2NvbG9yKGNvbnRleHQsIGZsYWdzLCAmZ2RrUkdCQUNvbG9y
KTsKKyAgICBlbHNlCisgICAgICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9jb2xvcihjb250ZXh0
LCBmbGFncywgJmdka1JHQkFDb2xvcik7CisKKyAgICBnZGtDb2xvci5waXhlbCA9IDA7CisgICAg
Z2RrQ29sb3IucmVkID0gKGd1aW50MTYpIChnZGtSR0JBQ29sb3IucmVkICogNjU1MzUpOworICAg
IGdka0NvbG9yLmdyZWVuID0gKGd1aW50MTYpIChnZGtSR0JBQ29sb3IuZ3JlZW4gKiA2NTUzNSk7
CisgICAgZ2RrQ29sb3IuYmx1ZSA9IChndWludDE2KSAoZ2RrUkdCQUNvbG9yLmJsdWUgKiA2NTUz
NSk7CisKKyAgICByZXR1cm4gZ2RrQ29sb3I7Cit9CisKKyNpZiBFTkFCTEUoVklERU8pCit2b2lk
IFJlbmRlclRoZW1lR3RrOjppbml0TWVkaWFDb2xvcnMoKQoreworICAgIG1fcGFuZWxDb2xvciA9
IGdldFN0eWxlQ29sb3IoR1RLX1RZUEVfQ09OVEFJTkVSLCB0cnVlLCBzdGF0aWNfY2FzdDxHdGtT
dGF0ZUZsYWdzPigwKSk7CisgICAgbV9zbGlkZXJDb2xvciA9IGdldFN0eWxlQ29sb3IoR1RLX1RZ
UEVfQ09OVEFJTkVSLCB0cnVlLCBHVEtfU1RBVEVfRkxBR19BQ1RJVkUpOworICAgIG1fc2xpZGVy
VGh1bWJDb2xvciA9IGdldFN0eWxlQ29sb3IoR1RLX1RZUEVfQ09OVEFJTkVSLCB0cnVlLCBHVEtf
U1RBVEVfRkxBR19TRUxFQ1RFRCk7Cit9CisjZW5kaWYKKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6
OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gZ2V0U3R5bGVDb2xvcihHVEtfVFlQRV9FTlRSWSwgdHJ1ZSwgR1RLX1NUQVRFX0ZMQUdf
U0VMRUNURUQpOworfQorCitDb2xvciBSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1JbmFjdGl2ZVNl
bGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGdldFN0eWxlQ29s
b3IoR1RLX1RZUEVfRU5UUlksIHRydWUsIEdUS19TVEFURV9GTEFHX0FDVElWRSk7Cit9CisKK0Nv
bG9yIFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xv
cigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGdldFN0eWxlQ29sb3IoR1RLX1RZUEVfRU5UUlksIGZh
bHNlLCBHVEtfU1RBVEVfRkxBR19TRUxFQ1RFRCk7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3Rr
OjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gZ2V0U3R5bGVDb2xvcihHVEtfVFlQRV9FTlRSWSwgZmFsc2UsIEdUS19TVEFURV9G
TEFHX0FDVElWRSk7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjphY3RpdmVMaXN0Qm94U2Vs
ZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0U3R5bGVDb2xv
cihHVEtfVFlQRV9UUkVFX1ZJRVcsIHRydWUsIEdUS19TVEFURV9GTEFHX1NFTEVDVEVEKTsKK30K
KworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OmluYWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91
bmRDb2xvcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGdldFN0eWxlQ29sb3IoR1RLX1RZUEVfVFJF
RV9WSUVXLCB0cnVlLCBHVEtfU1RBVEVfRkxBR19BQ1RJVkUpOworfQorCitDb2xvciBSZW5kZXJU
aGVtZUd0azo6YWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGdldFN0eWxlQ29sb3IoR1RLX1RZUEVfVFJFRV9WSUVXLCBmYWxzZSwgR1RL
X1NUQVRFX0ZMQUdfU0VMRUNURUQpOworfQorCitDb2xvciBSZW5kZXJUaGVtZUd0azo6aW5hY3Rp
dmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
Z2V0U3R5bGVDb2xvcihHVEtfVFlQRV9UUkVFX1ZJRVcsIGZhbHNlLCBHVEtfU1RBVEVfRkxBR19B
Q1RJVkUpOworfQorCitDb2xvciBSZW5kZXJUaGVtZUd0azo6c3lzdGVtQ29sb3IoaW50IGNzc1Zh
bHVlSWQpIGNvbnN0Cit7CisgICAgc3dpdGNoIChjc3NWYWx1ZUlkKSB7CisgICAgY2FzZSBDU1NW
YWx1ZUJ1dHRvbnRleHQ6CisgICAgICAgIHJldHVybiBnZXRTdHlsZUNvbG9yKEdUS19UWVBFX0JV
VFRPTiwgZmFsc2UsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KDApKTsKKyAgICBjYXNlIENT
U1ZhbHVlQ2FwdGlvbnRleHQ6CisgICAgICAgIHJldHVybiBnZXRTdHlsZUNvbG9yKEdUS19UWVBF
X0VOVFJZLCBmYWxzZSwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oMCkpOworICAgIGRlZmF1
bHQ6CisgICAgICAgIHJldHVybiBSZW5kZXJUaGVtZTo6c3lzdGVtQ29sb3IoY3NzVmFsdWVJZCk7
CisgICAgfQorICAgIHJldHVybiBSZW5kZXJUaGVtZTo6c3lzdGVtQ29sb3IoY3NzVmFsdWVJZCk7
Cit9CisKKyNpZiBFTkFCTEUoUFJPR1JFU1NfVEFHKQorc3RhdGljIGNvbnN0IGludCBwcm9ncmVz
c0FjdGl2aXR5QmxvY2tzID0gNTsKK3N0YXRpYyBjb25zdCBpbnQgcHJvZ3Jlc3NBbmltYXRpb25G
cmFtZXMgPSAxMDsKK3N0YXRpYyBjb25zdCBkb3VibGUgcHJvZ3Jlc3NBbmltYXRpb25JbnRlcnZh
bCA9IDAuMTI1OworZG91YmxlIFJlbmRlclRoZW1lR3RrOjphbmltYXRpb25SZXBlYXRJbnRlcnZh
bEZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKikgY29uc3QKK3sKKyAgICByZXR1cm4gcHJv
Z3Jlc3NBbmltYXRpb25JbnRlcnZhbDsKK30KKworZG91YmxlIFJlbmRlclRoZW1lR3RrOjphbmlt
YXRpb25EdXJhdGlvbkZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKikgY29uc3QKK3sKKyAg
ICByZXR1cm4gcHJvZ3Jlc3NBbmltYXRpb25JbnRlcnZhbCAqIHByb2dyZXNzQW5pbWF0aW9uRnJh
bWVzICogMjsgLy8gIjIiIGZvciBiYWNrIGFuZCBmb3J0aDsKK30KKworYm9vbCBSZW5kZXJUaGVt
ZUd0azo6cGFpbnRQcm9ncmVzc0JhcihSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgY29uc3Qg
UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHBh
aW50SW5mby5jb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGlmICghcmVuZGVyT2JqZWN0LT5pc1Byb2dyZXNzKCkpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgR3RrU3R5bGVDb250ZXh0KiBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0
KEdUS19UWVBFX1BST0dSRVNTX0JBUik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShjb250
ZXh0KTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZ
TEVfQ0xBU1NfUFJPR1JFU1NCQVIpOworICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhj
b250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfVFJPVUdIKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9z
ZXRfc3RhdGUoY29udGV4dCwgR1RLX1NUQVRFX0ZMQUdfQUNUSVZFKTsKKworICAgIGd0a19yZW5k
ZXJfYmFja2dyb3VuZChjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0
KCksIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKyAg
ICBndGtfcmVuZGVyX2ZyYW1lKGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNv
bnRleHQoKSwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkp
OworCisgICAgUmVuZGVyUHJvZ3Jlc3MqIHJlbmRlclByb2dyZXNzID0gdG9SZW5kZXJQcm9ncmVz
cyhyZW5kZXJPYmplY3QpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0YXRlKGNvbnRl
eHQsIEdUS19TVEFURV9GTEFHX1BSRUxJR0hUKTsKKworICAgIEd0a0JvcmRlciBib3JkZXJXaWR0
aDsKKyAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfYm9yZGVyKGNvbnRleHQsIEdUS19TVEFURV9G
TEFHX1BSRUxJR0hULCAmYm9yZGVyV2lkdGgpOworCisgICAgSW50UmVjdCBwcm9ncmVzc1JlY3Qo
cmVjdC54KCkgKyBib3JkZXJXaWR0aC5sZWZ0LCByZWN0LnkoKSArIGJvcmRlcldpZHRoLnRvcCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LndpZHRoKCkgLSAoYm9yZGVyV2lkdGgubGVm
dCArIGJvcmRlcldpZHRoLnJpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lmhl
aWdodCgpIC0gKGJvcmRlcldpZHRoLnRvcCArIGJvcmRlcldpZHRoLmJvdHRvbSkpOworCisgICAg
aWYgKHJlbmRlclByb2dyZXNzLT5pc0RldGVybWluYXRlKCkpIHsKKyAgICAgICAgcHJvZ3Jlc3NS
ZWN0LnNldFdpZHRoKHByb2dyZXNzUmVjdC53aWR0aCgpICogcmVuZGVyUHJvZ3Jlc3MtPnBvc2l0
aW9uKCkpOworICAgICAgICBpZiAocmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSA9
PSBSVEwpCisgICAgICAgICAgICBwcm9ncmVzc1JlY3Quc2V0WChyZWN0LndpZHRoKCkgLSBwcm9n
cmVzc1JlY3Qud2lkdGgoKSAtIHByb2dyZXNzUmVjdC54KCkpOworICAgIH0gZWxzZSB7CisgICAg
ICAgIGRvdWJsZSBwcm9ncmVzcyA9IHJlbmRlclByb2dyZXNzLT5hbmltYXRpb25Qcm9ncmVzcygp
OworCisgICAgICAgIHByb2dyZXNzUmVjdC5zZXRXaWR0aChtYXgoMiwgcHJvZ3Jlc3NSZWN0Lndp
ZHRoKCkgLyBwcm9ncmVzc0FjdGl2aXR5QmxvY2tzKSk7CisgICAgICAgIGludCBtb3ZhYmxlV2lk
dGggPSByZWN0LndpZHRoKCkgLSBwcm9ncmVzc1JlY3Qud2lkdGgoKTsKKyAgICAgICAgaWYgKHBy
b2dyZXNzIDwgMC41KQorICAgICAgICAgICAgcHJvZ3Jlc3NSZWN0LnNldFgocHJvZ3Jlc3NSZWN0
LngoKSArIChwcm9ncmVzcyAqIDIgKiBtb3ZhYmxlV2lkdGgpKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgcHJvZ3Jlc3NSZWN0LnNldFgocHJvZ3Jlc3NSZWN0LngoKSArICgoMS4wIC0gcHJv
Z3Jlc3MpICogMiAqIG1vdmFibGVXaWR0aCkpOworICAgIH0KKworICAgIGlmICghcHJvZ3Jlc3NS
ZWN0LmlzRW1wdHkoKSkgeworICAgICAgICBndGtfcmVuZGVyX2JhY2tncm91bmQoY29udGV4dCwg
cGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBwcm9ncmVzc1JlY3QueCgpLCBw
cm9ncmVzc1JlY3QueSgpLCBwcm9ncmVzc1JlY3Qud2lkdGgoKSwgcHJvZ3Jlc3NSZWN0LmhlaWdo
dCgpKTsKKyAgICAgICAgZ3RrX3JlbmRlcl9mcmFtZShjb250ZXh0LCBwYWludEluZm8uY29udGV4
dC0+cGxhdGZvcm1Db250ZXh0KCksIHByb2dyZXNzUmVjdC54KCksIHByb2dyZXNzUmVjdC55KCks
IHByb2dyZXNzUmVjdC53aWR0aCgpLCBwcm9ncmVzc1JlY3QuaGVpZ2h0KCkpOworICAgIH0KKwor
ICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4dCk7CisKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisjZW5kaWYKKworfQorCisjZW5kaWYgLy8gIUdUS19BUElfVkVSU0lPTl8yCmRpZmYg
LS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0azMuY3BwIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGszLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi4xY2RlY2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9w
bGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGszLmNwcApAQCAtMCwwICsxLDE5NyBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwOCBBcHBsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIEdUS19B
UElfVkVSU0lPTl8yCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTY3JvbGxiYXJU
aGVtZUd0ay5oIgorCisjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCisjaW5jbHVkZSAi
UmVuZGVyVGhlbWVHdGsuaCIKKyNpbmNsdWRlICJTY3JvbGxWaWV3LmgiCisjaW5jbHVkZSAiU2Ny
b2xsYmFyLmgiCisjaW5jbHVkZSA8Z3RrL2d0ay5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K3N0YXRpYyB2b2lkIGd0a1N0eWxlQ2hhbmdlZENhbGxiYWNrKEd0a1dpZGdldCosIFNjcm9sbGJh
clRoZW1lR3RrKiBzY3JvbGxiYXJUaGVtZSkKK3sKKyAgICBzY3JvbGxiYXJUaGVtZS0+dXBkYXRl
VGhlbWVQcm9wZXJ0aWVzKCk7Cit9CisKK1Njcm9sbGJhclRoZW1lR3RrOjpTY3JvbGxiYXJUaGVt
ZUd0aygpCit7CisgICAgbV9jb250ZXh0ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGhlbWVHdGsqPihS
ZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCkuZ2V0KCkpLT5ndGtTY3JvbGxiYXJTdHlsZSgpOwor
ICAgIHVwZGF0ZVRoZW1lUHJvcGVydGllcygpOworICAgIGdfc2lnbmFsX2Nvbm5lY3QobV9jb250
ZXh0LCAiY2hhbmdlZCIsIEdfQ0FMTEJBQ0soZ3RrU3R5bGVDaGFuZ2VkQ2FsbGJhY2spLCB0aGlz
KTsKK30KKwordm9pZCBTY3JvbGxiYXJUaGVtZUd0azo6dXBkYXRlVGhlbWVQcm9wZXJ0aWVzKCkK
K3sKKyAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUobV9jb250ZXh0LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAibWluLXNsaWRlci1sZW5ndGgiLCAmbV9taW5UaHVtYkxl
bmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNsaWRlci13aWR0aCIsICZt
X3RodW1iRmF0bmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyb3VnaC1i
b3JkZXIiLCAmbV90cm91Z2hCb3JkZXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgInN0ZXBwZXItc2l6ZSIsICZtX3N0ZXBwZXJTaXplLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAic3RlcHBlci1zcGFjaW5nIiwgJm1fc3RlcHBlclNwYWNpbmcsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cm91Z2gtdW5kZXItc3RlcHBlcnMiLCAmbV90
cm91Z2hVbmRlclN0ZXBwZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFz
LXNlY29uZGFyeS1iYWNrd2FyZC1zdGVwcGVyIiwgJm1faGFzQmFja0J1dHRvbkVuZFBhcnQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXMtc2Vjb25kYXJ5LWZvcndhcmQtc3Rl
cHBlciIsICZtX2hhc0ZvcndhcmRCdXR0b25TdGFydFBhcnQsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIDApOworCisgICAgY29uc3QgSGFzaFNldDxTY3JvbGxiYXIqPiogZ1Njcm9s
bGJhcnMgPSBnZXRTY3JvbGxiYXJzKCk7CisgICAgaWYgKCFnU2Nyb2xsYmFycykKKyAgICAgICAg
cmV0dXJuOworCisgICAgLy8gVXBkYXRlIHRoZSB0aGlja25lc3Mgb2YgZXZlcnkgaW50ZXJpb3Ig
ZnJhbWUgc2Nyb2xsYmFyIHdpZGdldC4gVGhlCisgICAgLy8gcGxhdGZvcm0taW5kZXBlbmRlbnQg
c2Nyb2xsYmFyIHRoZW0gY29kZSBpc24ndCB5ZXQgc21hcnQgZW5vdWdoIHRvIGdldAorICAgIC8v
IHRoaXMgaW5mb3JtYXRpb24gd2hlbiBpdCBwYWludHMuCisgICAgSGFzaFNldDxTY3JvbGxiYXIq
Pjo6aXRlcmF0b3IgZW5kID0gZ1Njcm9sbGJhcnMtPmVuZCgpOworICAgIGZvciAoSGFzaFNldDxT
Y3JvbGxiYXIqPjo6aXRlcmF0b3IgaXQgPSBnU2Nyb2xsYmFycy0+YmVnaW4oKTsgaXQgIT0gZW5k
OyArK2l0KSB7CisgICAgICAgIFNjcm9sbGJhciogc2Nyb2xsYmFyID0gKCppdCk7CisKKyAgICAg
ICAgLy8gVG9wLWxldmVsIHNjcm9sbGJhciBpLmUuIHNjcm9sbGJhcnMgd2hvIGhhdmUgYSBwYXJl
bnQgU2Nyb2xsVmlldworICAgICAgICAvLyB3aXRoIG5vIHBhcmVudCBhcmUgbmF0aXZlLCBhbmQg
dGh1cyBkbyBub3QgbmVlZCB0byBiZSByZXNpemVkLgorICAgICAgICBpZiAoIXNjcm9sbGJhci0+
cGFyZW50KCkgfHwgIXNjcm9sbGJhci0+cGFyZW50KCktPnBhcmVudCgpKQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIGludCB0aGlja25lc3MgPSBzY3JvbGxiYXJUaGlja25lc3Moc2Ny
b2xsYmFyLT5jb250cm9sU2l6ZSgpKTsKKyAgICAgICAgaWYgKHNjcm9sbGJhci0+b3JpZW50YXRp
b24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICAgICAgc2Nyb2xsYmFyLT5zZXRG
cmFtZVJlY3QoSW50UmVjdCgwLCBzY3JvbGxiYXItPnBhcmVudCgpLT5oZWlnaHQoKSAtIHRoaWNr
bmVzcywgc2Nyb2xsYmFyLT53aWR0aCgpLCB0aGlja25lc3MpKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgc2Nyb2xsYmFyLT5zZXRGcmFtZVJlY3QoSW50UmVjdChzY3JvbGxiYXItPnBhcmVu
dCgpLT53aWR0aCgpIC0gdGhpY2tuZXNzLCAwLCB0aGlja25lc3MsIHNjcm9sbGJhci0+aGVpZ2h0
KCkpKTsKKyAgICB9Cit9CisKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50VHJhY2tCYWNr
Z3JvdW5kKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGNv
bnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgLy8gUGFpbnQgdGhlIHRyYWNrIGJhY2tncm91bmQu
IElmIHRoZSB0cm91Z2gtdW5kZXItc3RlcHBlcnMgcHJvcGVydHkgaXMgdHJ1ZSwgdGhpcworICAg
IC8vIHNob3VsZCBiZSB0aGUgZnVsbCBzaXplIG9mIHRoZSBzY3JvbGxiYXIsIGJ1dCBpZiBpcyBm
YWxzZSwgaXQgc2hvdWxkIG9ubHkgYmUgdGhlCisgICAgLy8gdHJhY2sgcmVjdC4KKyAgICBJbnRS
ZWN0IGZ1bGxTY3JvbGxiYXJSZWN0ID0gcmVjdDsKKyAgICBpZiAobV90cm91Z2hVbmRlclN0ZXBw
ZXJzKQorICAgICAgICBmdWxsU2Nyb2xsYmFyUmVjdCA9IEludFJlY3Qoc2Nyb2xsYmFyLT54KCks
IHNjcm9sbGJhci0+eSgpLCBzY3JvbGxiYXItPndpZHRoKCksIHNjcm9sbGJhci0+aGVpZ2h0KCkp
OworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShtX2NvbnRleHQpOworCisgICAgZ3RrX3N0
eWxlX2NvbnRleHRfYWRkX2NsYXNzKG1fY29udGV4dCwgR1RLX1NUWUxFX0NMQVNTX1NDUk9MTEJB
Uik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKG1fY29udGV4dCwgR1RLX1NUWUxF
X0NMQVNTX1RST1VHSCk7CisKKyAgICBndGtfcmVuZGVyX2JhY2tncm91bmQobV9jb250ZXh0LCBj
b250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnVs
bFNjcm9sbGJhclJlY3QueCgpLCBmdWxsU2Nyb2xsYmFyUmVjdC55KCksIGZ1bGxTY3JvbGxiYXJS
ZWN0LndpZHRoKCksIGZ1bGxTY3JvbGxiYXJSZWN0LmhlaWdodCgpKTsKKyAgICBndGtfcmVuZGVy
X2ZyYW1lKG1fY29udGV4dCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksCisgICAgICAgICAg
ICAgICAgICAgICBmdWxsU2Nyb2xsYmFyUmVjdC54KCksIGZ1bGxTY3JvbGxiYXJSZWN0LnkoKSwg
ZnVsbFNjcm9sbGJhclJlY3Qud2lkdGgoKSwgZnVsbFNjcm9sbGJhclJlY3QuaGVpZ2h0KCkpOwor
CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShtX2NvbnRleHQpOworfQorCit2b2lkIFNj
cm9sbGJhclRoZW1lR3RrOjpwYWludFNjcm9sbGJhckJhY2tncm91bmQoR3JhcGhpY3NDb250ZXh0
KiBjb250ZXh0LCBTY3JvbGxiYXIqIHNjcm9sbGJhcikKK3sKKyAgICBndGtfc3R5bGVfY29udGV4
dF9zYXZlKG1fY29udGV4dCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MobV9j
b250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfU0NST0xMQkFSKTsKKyAgICBndGtfc3R5bGVfY29udGV4
dF9hZGRfY2xhc3MobV9jb250ZXh0LCAic2Nyb2xsZWQtd2luZG93Iik7CisgICAgZ3RrX3JlbmRl
cl9mcmFtZShtX2NvbnRleHQsIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBzY3JvbGxiYXIt
PngoKSwgc2Nyb2xsYmFyLT55KCksIHNjcm9sbGJhci0+d2lkdGgoKSwgc2Nyb2xsYmFyLT5oZWln
aHQoKSk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9yZXN0b3JlKG1fY29udGV4dCk7Cit9CisK
K3ZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50VGh1bWIoR3JhcGhpY3NDb250ZXh0KiBjb250
ZXh0LCBTY3JvbGxiYXIqIHNjcm9sbGJhciwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBn
dGtfc3R5bGVfY29udGV4dF9zYXZlKG1fY29udGV4dCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4
dF9hZGRfY2xhc3MobV9jb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfU0NST0xMQkFSKTsKKyAgICBn
dGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MobV9jb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfU0xJ
REVSKTsKKworICAgIGd1aW50IGZsYWdzID0gMDsKKyAgICBpZiAoc2Nyb2xsYmFyLT5wcmVzc2Vk
UGFydCgpID09IFRodW1iUGFydCkKKyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfQUNU
SVZFOworICAgIGlmIChzY3JvbGxiYXItPmhvdmVyZWRQYXJ0KCkgPT0gVGh1bWJQYXJ0KQorICAg
ICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19QUkVMSUdIVDsKKyAgICBndGtfc3R5bGVfY29u
dGV4dF9zZXRfc3RhdGUobV9jb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPihmbGFn
cykpOworCisgICAgZ3RrX3JlbmRlcl9zbGlkZXIobV9jb250ZXh0LCBjb250ZXh0LT5wbGF0Zm9y
bUNvbnRleHQoKSwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0
KCksCisgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IFZl
cnRpY2FsU2Nyb2xsYmFyID8gR1RLX09SSUVOVEFUSU9OX1ZFUlRJQ0FMIDogR1RLX09SSUVOVEFU
SU9OX0hPUklaT05UQUwpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShtX2NvbnRl
eHQpOworfQorCit2b2lkIFNjcm9sbGJhclRoZW1lR3RrOjpwYWludEJ1dHRvbihHcmFwaGljc0Nv
bnRleHQqIGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJbnRSZWN0JiByZWN0
LCBTY3JvbGxiYXJQYXJ0IHBhcnQpCit7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShtX2Nv
bnRleHQpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKG1fY29udGV4dCwgR1RL
X1NUWUxFX0NMQVNTX1NDUk9MTEJBUik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNz
KG1fY29udGV4dCwgR1RLX1NUWUxFX0NMQVNTX0JVVFRPTik7CisKKyAgICBndWludCBmbGFncyA9
IDA7CisgICAgaWYgKChCYWNrQnV0dG9uU3RhcnRQYXJ0ID09IHBhcnQgJiYgc2Nyb2xsYmFyLT5j
dXJyZW50UG9zKCkpCisgICAgICAgIHx8IChCYWNrQnV0dG9uRW5kUGFydCA9PSBwYXJ0ICYmIHNj
cm9sbGJhci0+Y3VycmVudFBvcygpKQorICAgICAgICB8fCAoRm9yd2FyZEJ1dHRvbkVuZFBhcnQg
PT0gcGFydCAmJiBzY3JvbGxiYXItPmN1cnJlbnRQb3MoKSAhPSBzY3JvbGxiYXItPm1heGltdW0o
KSkKKyAgICAgICAgfHwgKEZvcndhcmRCdXR0b25TdGFydFBhcnQgPT0gcGFydCAmJiBzY3JvbGxi
YXItPmN1cnJlbnRQb3MoKSAhPSBzY3JvbGxiYXItPm1heGltdW0oKSkpIHsKKyAgICAgICAgaWYg
KHBhcnQgPT0gc2Nyb2xsYmFyLT5wcmVzc2VkUGFydCgpKQorICAgICAgICAgICAgZmxhZ3MgfD0g
R1RLX1NUQVRFX0ZMQUdfQUNUSVZFOworICAgICAgICBpZiAocGFydCA9PSBzY3JvbGxiYXItPmhv
dmVyZWRQYXJ0KCkpCisgICAgICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19QUkVMSUdI
VDsKKyAgICB9IGVsc2UKKyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfSU5TRU5TSVRJ
VkU7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0YXRlKG1fY29udGV4dCwgc3RhdGljX2Nh
c3Q8R3RrU3RhdGVGbGFncz4oZmxhZ3MpKTsKKworICAgIGd0a19yZW5kZXJfYmFja2dyb3VuZCht
X2NvbnRleHQsIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCByZWN0LngoKSwgcmVjdC55KCks
IHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisgICAgZ3RrX3JlbmRlcl9mcmFtZShtX2Nv
bnRleHQsIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCByZWN0LngoKSwgcmVjdC55KCksIHJl
Y3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7CisKKyAgICBnZmxvYXQgYXJyb3dTY2FsaW5nOwor
ICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShtX2NvbnRleHQsICJhcnJvdy1zY2FsaW5n
IiwgJmFycm93U2NhbGluZywgMCk7CisKKyAgICBJbnRTaXplIGFycm93U2l6ZSA9IHJlY3Quc2l6
ZSgpOworICAgIGFycm93U2l6ZS5zY2FsZShhcnJvd1NjYWxpbmcpOworICAgIEludFBvaW50IGFy
cm93UG9pbnQocmVjdC54KCkgKyAocmVjdC53aWR0aCgpIC0gYXJyb3dTaXplLndpZHRoKCkpIC8g
MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueSgpICsgKHJlY3QuaGVpZ2h0KCkgLSBh
cnJvd1NpemUuaGVpZ2h0KCkpIC8gMik7CisKKyAgICBpZiAoZmxhZ3MgJiBHVEtfU1RBVEVfRkxB
R19BQ1RJVkUpIHsKKyAgICAgICAgZ2ludCBhcnJvd0Rpc3BsYWNlbWVudFgsIGFycm93RGlzcGxh
Y2VtZW50WTsKKyAgICAgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxlKG1fY29udGV4dCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJvdy1kaXNwbGFjZW1lbnQt
eCIsICZhcnJvd0Rpc3BsYWNlbWVudFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAiYXJyb3ctZGlzcGxhY2VtZW50LXkiLCAmYXJyb3dEaXNwbGFjZW1lbnRZLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIGFycm93UG9pbnQubW92
ZShhcnJvd0Rpc3BsYWNlbWVudFgsIGFycm93RGlzcGxhY2VtZW50WSk7CisgICAgfQorCisgICAg
Z2RvdWJsZSBhbmdsZSwgc2l6ZTsKKyAgICBpZiAoc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09
IFZlcnRpY2FsU2Nyb2xsYmFyKSB7CisgICAgICAgIHNpemUgPSBhcnJvd1NpemUud2lkdGgoKTsK
KyAgICAgICAgYW5nbGUgPSAocGFydCA9PSBGb3J3YXJkQnV0dG9uRW5kUGFydCB8fCBwYXJ0ID09
IEZvcndhcmRCdXR0b25TdGFydFBhcnQpID8gR19QSSA6IDA7CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgc2l6ZSA9IGFycm93U2l6ZS5oZWlnaHQoKTsKKyAgICAgICAgYW5nbGUgPSAocGFydCA9PSBG
b3J3YXJkQnV0dG9uRW5kUGFydCB8fCBwYXJ0ID09IEZvcndhcmRCdXR0b25TdGFydFBhcnQpID8g
R19QSSAvIDIgOiAzICogKEdfUEkgLyAyKTsKKyAgICB9CisKKyAgICBndGtfcmVuZGVyX2Fycm93
KG1fY29udGV4dCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIGFuZ2xlLCBhcnJvd1BvaW50
LngoKSwgYXJyb3dQb2ludC55KCksIHNpemUpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVz
dG9yZShtX2NvbnRleHQpOworfQorCit9CisKKyNlbmRpZiAvLyAhR1RLX0FQSV9WRVJTSU9OXzIK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>76746</attachid>
            <date>2010-12-16 02:35:25 -0800</date>
            <delta_ts>2010-12-30 16:29:52 -0800</delta_ts>
            <desc>Updated patch rebased to current git master</desc>
            <filename>gtk-style-context2.diff</filename>
            <type>text/plain</type>
            <size>178580</size>
            <attacher name="Carlos Garcia Campos">cgarcia</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCAyMTcyZmQzLi4zMDI1ODc1
IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTIgQEAK
KzIwMTAtMTItMTYgIENhcmxvcyBHYXJjaWEgQ2FtcG9zICA8Y2dhcmNpYUBpZ2FsaWEuY29tPgor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtHVEtdIFBv
cnQgdG8gR3RrU3R5bGVDb250ZXh0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD01MDgyMAorCisgICAgICAgICogY29uZmlndXJlLmFjOiBCdW1wIEdUSysz
IHJlcXVpcmVtZW50cyB0byAyLjkxLjYKKwogMjAxMC0xMi0xNSAgU2hlcmlmZiBCb3QgIDx3ZWJr
aXQucmV2aWV3LmJvdEBnbWFpbC5jb20+CiAKICAgICAgICAgVW5yZXZpZXdlZCwgcm9sbGluZyBv
dXQgcjc0MTE3LgpkaWZmIC0tZ2l0IGEvSmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nIGIvSmF2YVNj
cmlwdENvcmUvQ2hhbmdlTG9nCmluZGV4IGU1ZDY0ZjQuLmNjNzcyZjYgMTAwNjQ0Ci0tLSBhL0ph
dmFTY3JpcHRDb3JlL0NoYW5nZUxvZworKysgYi9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAg
LTEsMyArMSwxMiBAQAorMjAxMC0xMi0xNiAgQ2FybG9zIEdhcmNpYSBDYW1wb3MgIDxjZ2FyY2lh
QGlnYWxpYS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgW0dUS10gUG9ydCB0byBHdGtTdHlsZUNvbnRleHQKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUwODIwCisKKyAgICAgICAgKiB3dGYvZ29iamVj
dC9HVHlwZWRlZnMuaDogQWRkIEd0a1N0eWxlQ29udGV4dCBmb3J3YXJkIGRlY2xhcmF0aW9uCisK
IDIwMTAtMTItMTUgIEtlbm5ldGggUnVzc2VsbCAgPGtickBnb29nbGUuY29tPgogCiAgICAgICAg
IFJldmlld2VkIGJ5IEphbWVzIFJvYmluc29uLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9DaGFuZ2VM
b2cgYi9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBhYjlkZjJlLi42NWJlMjI5IDEwMDY0NAotLS0g
YS9XZWJDb3JlL0NoYW5nZUxvZworKysgYi9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEz
OSBAQAorMjAxMC0xMi0xNiAgQ2FybG9zIEdhcmNpYSBDYW1wb3MgIDxjZ2FyY2lhQGlnYWxpYS5j
b20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0dU
S10gUG9ydCB0byBHdGtTdHlsZUNvbnRleHQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTUwODIwCisKKyAgICAgICAgRm9yayBSZW5kZXJUaGVtZUd0ayBh
bmQgU2Nyb2xsYmFyVGhlbWVHdGsgYW5kIHBvcnQgZ3RrMyBjb2RlIHRvCisgICAgICAgIEd0a1N0
eWxlQ29udGV4dC4KKworICAgICAgICAqIEdOVW1ha2VmaWxlLmFtOgorICAgICAgICAqIHBsYXRm
b3JtL2d0ay9SZW5kZXJUaGVtZUd0ay5jcHA6CisgICAgICAgIChXZWJDb3JlOjpwYWludFN0b2Nr
SWNvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6Z3RrVGV4dERpcmVjdGlv
bik6CisgICAgICAgIChXZWJDb3JlOjpndGtJY29uU3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVHdGs6OmNlbnRlclJlY3RWZXJ0aWNhbGx5SW5QYXJlbnRJbnB1dEVsZW1lbnQp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnBhaW50U2VhcmNoRmllbGRSZXN1
bHRzRGVjb3JhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cGFpbnRT
ZWFyY2hGaWVsZENhbmNlbEJ1dHRvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0
azo6cGFpbnRNZWRpYUJ1dHRvbik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6
YWRqdXN0UHJvZ3Jlc3NCYXJTdHlsZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3RrL1JlbmRlclRo
ZW1lR3RrLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrMi5jcHA6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OmluaXRNZWRpYUNvbG9ycyk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6UmVuZGVyVGhlbWVHdGspOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6On5SZW5kZXJUaGVtZUd0ayk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6Z2V0U3RvY2tJY29uKToKKyAgICAgICAgKFdlYkNv
cmU6OmdldEd0a1N0YXRlVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6
cGFpbnRSZW5kZXJPYmplY3QpOgorICAgICAgICAoV2ViQ29yZTo6c2V0VG9nZ2xlU2l6ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6c2V0Q2hlY2tib3hTaXplKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwYWludENoZWNrYm94KToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlclRoZW1lR3RrOjpzZXRSYWRpb1NpemUpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVHdGs6OnBhaW50UmFkaW8pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVHdGs6OnBhaW50QnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OmdldENvbWJvQm94UGFkZGlu
Zyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRlcm5hbFBhZGRp
bmdMZWZ0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFs
UGFkZGluZ1JpZ2h0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwb3B1cElu
dGVybmFsUGFkZGluZ1RvcCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cG9w
dXBJbnRlcm5hbFBhZGRpbmdCb3R0b20pOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVH
dGs6OnBhaW50TWVudUxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnNl
dFRleHRJbnB1dEJvcmRlcnMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnBh
aW50VGV4dEZpZWxkKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwYWludFNs
aWRlclRyYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwYWludFNsaWRl
clRodW1iKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjphZGp1c3RTbGlkZXJU
aHVtYlNpemUpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtQWN0
aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lR3RrOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkZvcmVn
cm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1J
bmFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5k
ZXJUaGVtZUd0azo6YWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcik6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6aW5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFj
a2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjphY3RpdmVM
aXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lR3RrOjppbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnN5c3RlbUNvbG9yKToKKyAgICAgICAgKFdl
YkNvcmU6Omd0a1N0eWxlU2V0Q2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVHdGs6OnNldHVwV2lkZ2V0QW5kQWRkVG9Db250YWluZXIpOgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyVGhlbWVHdGs6Omd0a0NvbnRhaW5lcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUd0azo6Z3RrQnV0dG9uKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpn
dGtFbnRyeSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6Z3RrVHJlZVZpZXcp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6Omd0a1ZTY2FsZSk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6Z3RrSFNjYWxlKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlbmRlclRoZW1lR3RrOjphbmltYXRpb25SZXBlYXRJbnRlcnZhbEZvclByb2dyZXNzQmFyKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjphbmltYXRpb25EdXJhdGlvbkZvclBy
b2dyZXNzQmFyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwYWludFByb2dy
ZXNzQmFyKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGszLmNwcDogQWRk
ZWQuCisgICAgICAgIChXZWJDb3JlOjpzdHlsZUNvbnRleHRNYXApOgorICAgICAgICAoV2ViQ29y
ZTo6Z3RrU3R5bGVDaGFuZ2VkQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6Z2V0U3R5bGVD
b250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpSZW5kZXJUaGVtZUd0
ayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6flJlbmRlclRoZW1lR3RrKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpndGtTY3JvbGxiYXJTdHlsZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6Z2V0U3RvY2tJY29uKToKKyAgICAgICAg
KFdlYkNvcmU6OnNldFRvZ2dsZVNpemUpOgorICAgICAgICAoV2ViQ29yZTo6cGFpbnRUb2dnbGUp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnNldENoZWNrYm94U2l6ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cGFpbnRDaGVja2JveCk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6c2V0UmFkaW9TaXplKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlbmRlclRoZW1lR3RrOjpwYWludFJhZGlvKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRl
clRoZW1lR3RrOjpwYWludEJ1dHRvbik6CisgICAgICAgIChXZWJDb3JlOjpnZXRDb21ib0JveE1l
dHJpY3MpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQ
YWRkaW5nTGVmdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRl
cm5hbFBhZGRpbmdSaWdodCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cG9w
dXBJbnRlcm5hbFBhZGRpbmdUb3ApOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6
OnBvcHVwSW50ZXJuYWxQYWRkaW5nQm90dG9tKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lR3RrOjpwYWludE1lbnVMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3Rr
OjpzZXRUZXh0SW5wdXRCb3JkZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3Rr
OjpwYWludFRleHRGaWVsZCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cGFp
bnRTbGlkZXJUcmFjayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cGFpbnRT
bGlkZXJUaHVtYik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6YWRqdXN0U2xp
ZGVyVGh1bWJTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OmdldFN0eWxlQ29sb3IpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OmluaXRNZWRpYUNvbG9ycyk6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5k
Q29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtSW5hY3Rp
dmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhl
bWVHdGs6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKToKKyAgICAgICAg
KFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uRm9yZWdy
b3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRoZW1lR3RrOjphY3RpdmVMaXN0
Qm94U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclRo
ZW1lR3RrOjppbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IpOgorICAgICAg
ICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3Jv
dW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OmluYWN0aXZlTGlz
dEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJU
aGVtZUd0azo6c3lzdGVtQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6
OmFuaW1hdGlvblJlcGVhdEludGVydmFsRm9yUHJvZ3Jlc3NCYXIpOgorICAgICAgICAoV2ViQ29y
ZTo6UmVuZGVyVGhlbWVHdGs6OmFuaW1hdGlvbkR1cmF0aW9uRm9yUHJvZ3Jlc3NCYXIpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyVGhlbWVHdGs6OnBhaW50UHJvZ3Jlc3NCYXIpOgorICAgICAg
ICAqIHBsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0ay5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpTY3JvbGxiYXJUaGVtZUd0azo6flNjcm9sbGJhclRoZW1lR3RrKToKKyAgICAgICAgKFdlYkNv
cmU6OlNjcm9sbGJhclRoZW1lR3RrOjpnZXRTY3JvbGxiYXJzKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGsuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ndGsvU2Nyb2xs
YmFyVGhlbWVHdGsyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpTY3JvbGxiYXJUaGVt
ZUd0azo6U2Nyb2xsYmFyVGhlbWVHdGspOgorICAgICAgICAoV2ViQ29yZTo6U2Nyb2xsYmFyVGhl
bWVHdGs6OnVwZGF0ZVRoZW1lUHJvcGVydGllcyk6CisgICAgICAgIChXZWJDb3JlOjpndGtTdHls
ZVNldENhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlNjcm9sbGJhclRoZW1lR3RrOjpwYWlu
dFRyYWNrQmFja2dyb3VuZCk6CisgICAgICAgIChXZWJDb3JlOjpTY3JvbGxiYXJUaGVtZUd0azo6
cGFpbnRTY3JvbGxiYXJCYWNrZ3JvdW5kKToKKyAgICAgICAgKFdlYkNvcmU6OlNjcm9sbGJhclRo
ZW1lR3RrOjpwYWludFRodW1iKToKKyAgICAgICAgKFdlYkNvcmU6OlNjcm9sbGJhclRoZW1lR3Rr
OjpwYWludEJ1dHRvbik6CisgICAgICAgICogcGxhdGZvcm0vZ3RrL1Njcm9sbGJhclRoZW1lR3Rr
My5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Z3RrU3R5bGVDaGFuZ2VkQ2FsbGJhY2sp
OgorICAgICAgICAoV2ViQ29yZTo6U2Nyb2xsYmFyVGhlbWVHdGs6OlNjcm9sbGJhclRoZW1lR3Rr
KToKKyAgICAgICAgKFdlYkNvcmU6OlNjcm9sbGJhclRoZW1lR3RrOjp1cGRhdGVUaGVtZVByb3Bl
cnRpZXMpOgorICAgICAgICAoV2ViQ29yZTo6U2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50VHJhY2tC
YWNrZ3JvdW5kKToKKyAgICAgICAgKFdlYkNvcmU6OlNjcm9sbGJhclRoZW1lR3RrOjpwYWludFNj
cm9sbGJhckJhY2tncm91bmQpOgorICAgICAgICAoV2ViQ29yZTo6U2Nyb2xsYmFyVGhlbWVHdGs6
OnBhaW50VGh1bWIpOgorICAgICAgICAoV2ViQ29yZTo6U2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50
QnV0dG9uKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ndGsvV2lkZ2V0UmVuZGVyaW5nQ29udGV4dC5o
OgorICAgICAgICAqIHBsYXRmb3JtL2d0ay9XaWRnZXRSZW5kZXJpbmdDb250ZXh0R3RrMi5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpnZXRFeHRyYVNwYWNlRm9yV2lkZ2V0KToKKyAgICAgICAgKFdl
YkNvcmU6OldpZGdldFJlbmRlcmluZ0NvbnRleHQ6OldpZGdldFJlbmRlcmluZ0NvbnRleHQpOgor
ICAgICAgICAoV2ViQ29yZTo6V2lkZ2V0UmVuZGVyaW5nQ29udGV4dDo6fldpZGdldFJlbmRlcmlu
Z0NvbnRleHQpOgorICAgICAgICAqIHBsYXRmb3JtL2d0ay9XaWRnZXRSZW5kZXJpbmdDb250ZXh0
R3RrMy5jcHA6IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3RrL2d0azJkcmF3aW5nLmM6
CisgICAgICAgIChtb3pfZ3RrX2dldF90aGVtZV9wYXJ0cyk6CisgICAgICAgICogcGxhdGZvcm0v
Z3RrL2d0azNkcmF3aW5nLmM6IFJlbW92ZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3RrL2d0a2Ry
YXdpbmcuaDoKKwogMjAxMC0xMi0xNSAgQnJpYW4gV2VpbnN0ZWluICA8YndlaW5zdGVpbkBhcHBs
ZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgSm9uIEhvbmV5Y3V0dC4KZGlmZiAtLWdpdCBh
L0phdmFTY3JpcHRDb3JlL3d0Zi9nb2JqZWN0L0dUeXBlZGVmcy5oIGIvSmF2YVNjcmlwdENvcmUv
d3RmL2dvYmplY3QvR1R5cGVkZWZzLmgKaW5kZXggMGI5YTllYS4uZjlmOGYyZiAxMDA2NDQKLS0t
IGEvSmF2YVNjcmlwdENvcmUvd3RmL2dvYmplY3QvR1R5cGVkZWZzLmgKKysrIGIvSmF2YVNjcmlw
dENvcmUvd3RmL2dvYmplY3QvR1R5cGVkZWZzLmgKQEAgLTg5LDYgKzg5LDcgQEAgdHlwZWRlZiBz
dHJ1Y3QgX0dka0RyYXdhYmxlIEdka1dpbmRvdzsKIHR5cGVkZWYgc3RydWN0IF9HZGtXaW5kb3cg
R2RrV2luZG93OwogdHlwZWRlZiBzdHJ1Y3QgX2NhaXJvX3JlY3RhbmdsZV9pbnQgY2Fpcm9fcmVj
dGFuZ2xlX2ludF90OwogdHlwZWRlZiBjYWlyb19yZWN0YW5nbGVfaW50X3QgR2RrUmVjdGFuZ2xl
OwordHlwZWRlZiBzdHJ1Y3QgX0d0a1N0eWxlQ29udGV4dCBHdGtTdHlsZUNvbnRleHQ7CiAjZW5k
aWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJDb3JlL0dOVW1ha2VmaWxlLmFtIGIvV2ViQ29y
ZS9HTlVtYWtlZmlsZS5hbQppbmRleCBjYjM2ZTMxLi44ZGQ1M2FiIDEwMDY0NAotLS0gYS9XZWJD
b3JlL0dOVW1ha2VmaWxlLmFtCisrKyBiL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0KQEAgLTM2OTks
NyArMzY5OSw2IEBAIHdlYmNvcmVndGtfc291cmNlcyArPSBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9n
dGsvR1JlZlB0ckd0ay5jcHAgXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3RrL0dSZWZQdHJHdGsuaCBc
CiAJV2ViQ29yZS9wbGF0Zm9ybS9ndGsvZ3RrMmRyYXdpbmcuYyBcCi0JV2ViQ29yZS9wbGF0Zm9y
bS9ndGsvZ3RrM2RyYXdpbmcuYyBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9ndGsvZ3RrZHJhd2luZy5o
IFwKIAlXZWJDb3JlL3BsYXRmb3JtL2d0ay9HdGtQbHVnaW5XaWRnZXQuY3BwIFwKIAlXZWJDb3Jl
L3BsYXRmb3JtL2d0ay9HdGtQbHVnaW5XaWRnZXQuaCBcCkBAIC0zNzIxLDggKzM3MjAsMTIgQEAg
d2ViY29yZWd0a19zb3VyY2VzICs9IFwKIAlXZWJDb3JlL3BsYXRmb3JtL2d0ay9Qb3B1cE1lbnVH
dGsuY3BwIFwKIAlXZWJDb3JlL3BsYXRmb3JtL2d0ay9Qb3B1cE1lbnVHdGsuaCBcCiAJV2ViQ29y
ZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsuY3BwIFwKKwlXZWJDb3JlL3BsYXRmb3JtL2d0
ay9SZW5kZXJUaGVtZUd0azIuY3BwIFwKKwlXZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVt
ZUd0azMuY3BwIFwKIAlXZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0ay5oIFwKIAlX
ZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0ay5jcHAgXAorCVdlYkNvcmUvcGxh
dGZvcm0vZ3RrL1Njcm9sbGJhclRoZW1lR3RrMi5jcHAgXAorCVdlYkNvcmUvcGxhdGZvcm0vZ3Rr
L1Njcm9sbGJhclRoZW1lR3RrMy5jcHAgXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3RrL1Njcm9sbGJh
clRoZW1lR3RrLmggXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3RrL1Njcm9sbFZpZXdHdGsuY3BwIFwK
IAlXZWJDb3JlL3BsYXRmb3JtL2d0ay9TZWFyY2hQb3B1cE1lbnVHdGsuY3BwIFwKQEAgLTM3MzQs
NyArMzczNyw2IEBAIHdlYmNvcmVndGtfc291cmNlcyArPSBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9n
dGsvV2hlZWxFdmVudEd0ay5jcHAgXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3RrL1dpZGdldEd0ay5j
cHAgXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3RrL1dpZGdldFJlbmRlcmluZ0NvbnRleHRHdGsyLmNw
cCBcCi0JV2ViQ29yZS9wbGF0Zm9ybS9ndGsvV2lkZ2V0UmVuZGVyaW5nQ29udGV4dEd0azMuY3Bw
IFwKIAlXZWJDb3JlL3BsYXRmb3JtL2d0ay9XaWRnZXRSZW5kZXJpbmdDb250ZXh0LmggXAogCVdl
YkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlRGVjb2Rlci5jcHAgXAog
CVdlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvYm1wL0JNUEltYWdlRGVjb2Rlci5oIFwK
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrLmNwcCBiL1dl
YkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrLmNwcAppbmRleCBmNzMyYzE2Li40M2I1
OWVkIDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0ay5jcHAK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsuY3BwCkBAIC00MSw4ICs0
MSw2IEBACiAjaW5jbHVkZSAiU2Nyb2xsYmFyLmgiCiAjaW5jbHVkZSAiVGltZVJhbmdlcy5oIgog
I2luY2x1ZGUgIlVzZXJBZ2VudFN0eWxlU2hlZXRzLmgiCi0jaW5jbHVkZSAiV2lkZ2V0UmVuZGVy
aW5nQ29udGV4dC5oIgotI2luY2x1ZGUgImd0a2RyYXdpbmcuaCIKICNpbmNsdWRlIDxnZGsvZ2Rr
Lmg+CiAjaW5jbHVkZSA8Z3RrL2d0ay5oPgogI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4K
QEAgLTU1LDE5ICs1Myw2IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdXNpbmcgbmFtZXNwYWNl
IEhUTUxOYW1lczsKIAotc3RhdGljIHZvaWQgcGFpbnRTdG9ja0ljb24oR3JhcGhpY3NDb250ZXh0
KiBjb250ZXh0LCBjb25zdCBJbnRQb2ludCYgaWNvblBvaW50LCBHdGtTdHlsZSogc3R5bGUsIGNv
bnN0IGNoYXIqIGljb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR3RrVGV4dERp
cmVjdGlvbiBkaXJlY3Rpb24sIEd0a1N0YXRlVHlwZSBzdGF0ZSwgR3RrSWNvblNpemUgaWNvblNp
emUpCi17Ci0gICAgR3RrSWNvblNldCogaWNvblNldCA9IGd0a19zdHlsZV9sb29rdXBfaWNvbl9z
ZXQoc3R5bGUsIGljb25OYW1lKTsKLSAgICBQbGF0Zm9ybVJlZlB0cjxHZGtQaXhidWY+IGljb24g
PSBhZG9wdFBsYXRmb3JtUmVmKGd0a19pY29uX3NldF9yZW5kZXJfaWNvbihpY29uU2V0LCBzdHls
ZSwgZGlyZWN0aW9uLCBzdGF0ZSwgaWNvblNpemUsIDAsIDApKTsKLQotICAgIGNhaXJvX3QqIGNy
ID0gY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7Ci0gICAgY2Fpcm9fc2F2ZShjcik7Ci0gICAg
Z2RrX2NhaXJvX3NldF9zb3VyY2VfcGl4YnVmKGNyLCBpY29uLmdldCgpLCBpY29uUG9pbnQueCgp
LCBpY29uUG9pbnQueSgpKTsKLSAgICBjYWlyb19wYWludChjcik7Ci0gICAgY2Fpcm9fcmVzdG9y
ZShjcik7Ci19Ci0KICNpZiBFTkFCTEUoVklERU8pCiBzdGF0aWMgSFRNTE1lZGlhRWxlbWVudCog
Z2V0TWVkaWFFbGVtZW50RnJvbVJlbmRlck9iamVjdChSZW5kZXJPYmplY3QqIG8pCiB7CkBAIC04
NywxNCArNzIsNiBAQCBzdGF0aWMgR3RrSWNvblNpemUgZ2V0TWVkaWFCdXR0b25JY29uU2l6ZShp
bnQgbWVkaWFJY29uU2l6ZSkKICAgICByZXR1cm4gaWNvblNpemU7CiB9CiAKLXZvaWQgUmVuZGVy
VGhlbWVHdGs6OmluaXRNZWRpYUNvbG9ycygpCi17Ci0gICAgR3RrU3R5bGUqIHN0eWxlID0gZ3Rr
X3dpZGdldF9nZXRfc3R5bGUoR1RLX1dJREdFVChndGtDb250YWluZXIoKSkpOwotICAgIG1fcGFu
ZWxDb2xvciA9IHN0eWxlLT5iZ1tHVEtfU1RBVEVfTk9STUFMXTsKLSAgICBtX3NsaWRlckNvbG9y
ID0gc3R5bGUtPmJnW0dUS19TVEFURV9BQ1RJVkVdOwotICAgIG1fc2xpZGVyVGh1bWJDb2xvciA9
IHN0eWxlLT5iZ1tHVEtfU1RBVEVfU0VMRUNURURdOwotfQotCiB2b2lkIFJlbmRlclRoZW1lR3Rr
Ojppbml0TWVkaWFCdXR0b25zKCkKIHsKICAgICBzdGF0aWMgYm9vbCBpY29uc0luaXRpYWxpemVk
ID0gZmFsc2U7CkBAIC0xMzMsNjkgKzExMCwxMyBAQCBQYXNzUmVmUHRyPFJlbmRlclRoZW1lPiBS
ZW5kZXJUaGVtZTo6dGhlbWVGb3JQYWdlKFBhZ2UqIHBhZ2UpCiAgICAgcmV0dXJuIHJ0OwogfQog
Ci1zdGF0aWMgaW50IG1vekd0a1JlZkNvdW50ID0gMDsKLQotUmVuZGVyVGhlbWVHdGs6OlJlbmRl
clRoZW1lR3RrKCkKLSAgICA6IG1fZ3RrV2luZG93KDApCi0gICAgLCBtX2d0a0NvbnRhaW5lcigw
KQotICAgICwgbV9ndGtCdXR0b24oMCkKLSAgICAsIG1fZ3RrRW50cnkoMCkKLSAgICAsIG1fZ3Rr
VHJlZVZpZXcoMCkKLSAgICAsIG1fcGFuZWxDb2xvcihDb2xvcjo6d2hpdGUpCi0gICAgLCBtX3Ns
aWRlckNvbG9yKENvbG9yOjp3aGl0ZSkKLSAgICAsIG1fc2xpZGVyVGh1bWJDb2xvcihDb2xvcjo6
d2hpdGUpCi0gICAgLCBtX21lZGlhSWNvblNpemUoMTYpCi0gICAgLCBtX21lZGlhU2xpZGVySGVp
Z2h0KDE0KQotICAgICwgbV9tZWRpYVNsaWRlclRodW1iV2lkdGgoMTIpCi0gICAgLCBtX21lZGlh
U2xpZGVyVGh1bWJIZWlnaHQoMTIpCi0jaWZkZWYgR1RLX0FQSV9WRVJTSU9OXzIKLSAgICAsIG1f
dGhlbWVQYXJ0c0hhdmVSR0JBQ29sb3JtYXAodHJ1ZSkKLSNlbmRpZgotewotCi0gICAgbWVtc2V0
KCZtX3RoZW1lUGFydHMsIDAsIHNpemVvZihHdGtUaGVtZVBhcnRzKSk7Ci0jaWZkZWYgR1RLX0FQ
SV9WRVJTSU9OXzIKLSAgICBHZGtDb2xvcm1hcCogY29sb3JtYXAgPSBnZGtfc2NyZWVuX2dldF9y
Z2JhX2NvbG9ybWFwKGdka19zY3JlZW5fZ2V0X2RlZmF1bHQoKSk7Ci0gICAgaWYgKCFjb2xvcm1h
cCkgewotICAgICAgICBtX3RoZW1lUGFydHNIYXZlUkdCQUNvbG9ybWFwID0gZmFsc2U7Ci0gICAg
ICAgIGNvbG9ybWFwID0gZ2RrX3NjcmVlbl9nZXRfZGVmYXVsdF9jb2xvcm1hcChnZGtfc2NyZWVu
X2dldF9kZWZhdWx0KCkpOwotICAgIH0KLSAgICBtX3RoZW1lUGFydHMuY29sb3JtYXAgPSBjb2xv
cm1hcDsKLSNlbmRpZgotCi0gICAgLy8gSW5pdGlhbGl6ZSB0aGUgTW96aWxsYSB0aGVtZSBkcmF3
aW5nIGNvZGUuCi0gICAgaWYgKCFtb3pHdGtSZWZDb3VudCkgewotICAgICAgICBtb3pfZ3RrX2lu
aXQoKTsKLSAgICAgICAgbW96X2d0a191c2VfdGhlbWVfcGFydHMoJm1fdGhlbWVQYXJ0cyk7Ci0g
ICAgfQotICAgICsrbW96R3RrUmVmQ291bnQ7Ci0KLSNpZiBFTkFCTEUoVklERU8pCi0gICAgaW5p
dE1lZGlhQ29sb3JzKCk7Ci0gICAgaW5pdE1lZGlhQnV0dG9ucygpOwotI2VuZGlmCi19Ci0KLVJl
bmRlclRoZW1lR3RrOjp+UmVuZGVyVGhlbWVHdGsoKQotewotICAgIC0tbW96R3RrUmVmQ291bnQ7
Ci0KLSAgICBpZiAoIW1vekd0a1JlZkNvdW50KQotICAgICAgICBtb3pfZ3RrX3NodXRkb3duKCk7
Ci0KLSAgICBndGtfd2lkZ2V0X2Rlc3Ryb3kobV9ndGtXaW5kb3cpOwotfQotCi12b2lkIFJlbmRl
clRoZW1lR3RrOjpnZXRJbmRpY2F0b3JNZXRyaWNzKENvbnRyb2xQYXJ0IHBhcnQsIGludCYgaW5k
aWNhdG9yU2l6ZSwgaW50JiBpbmRpY2F0b3JTcGFjaW5nKSBjb25zdAorc3RhdGljIHZvaWQgcGFp
bnRTdG9ja0ljb24oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRQb2ludCYgaWNv
blBvaW50LCBjb25zdCBHZGtQaXhidWYqIGljb24pCiB7Ci0gICAgQVNTRVJUKHBhcnQgPT0gQ2hl
Y2tib3hQYXJ0IHx8IHBhcnQgPT0gUmFkaW9QYXJ0KTsKLSAgICBpZiAocGFydCA9PSBDaGVja2Jv
eFBhcnQpIHsKLSAgICAgICAgbW96X2d0a19jaGVja2JveF9nZXRfbWV0cmljcygmaW5kaWNhdG9y
U2l6ZSwgJmluZGljYXRvclNwYWNpbmcpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAg
Ly8gUmFkaW9QYXJ0Ci0gICAgbW96X2d0a19yYWRpb19nZXRfbWV0cmljcygmaW5kaWNhdG9yU2l6
ZSwgJmluZGljYXRvclNwYWNpbmcpOworICAgIGNhaXJvX3QqIGNyID0gY29udGV4dC0+cGxhdGZv
cm1Db250ZXh0KCk7CisgICAgY2Fpcm9fc2F2ZShjcik7CisgICAgZ2RrX2NhaXJvX3NldF9zb3Vy
Y2VfcGl4YnVmKGNyLCBpY29uLCBpY29uUG9pbnQueCgpLCBpY29uUG9pbnQueSgpKTsKKyAgICBj
YWlyb19wYWludChjcik7CisgICAgY2Fpcm9fcmVzdG9yZShjcik7CiB9CiAKIHN0YXRpYyBib29s
IHN1cHBvcnRzRm9jdXMoQ29udHJvbFBhcnQgYXBwZWFyYW5jZSkKQEAgLTIxNywxNyArMTM4LDYg
QEAgc3RhdGljIGJvb2wgc3VwcG9ydHNGb2N1cyhDb250cm9sUGFydCBhcHBlYXJhbmNlKQogICAg
IH0KIH0KIAotR3RrU3RhdGVUeXBlIFJlbmRlclRoZW1lR3RrOjpnZXRHdGtTdGF0ZVR5cGUoUmVu
ZGVyT2JqZWN0KiBvYmplY3QpCi17Ci0gICAgaWYgKCFpc0VuYWJsZWQob2JqZWN0KSB8fCBpc1Jl
YWRPbmx5Q29udHJvbChvYmplY3QpKQotICAgICAgICByZXR1cm4gR1RLX1NUQVRFX0lOU0VOU0lU
SVZFOwotICAgIGlmIChpc1ByZXNzZWQob2JqZWN0KSkKLSAgICAgICAgcmV0dXJuIEdUS19TVEFU
RV9BQ1RJVkU7Ci0gICAgaWYgKGlzSG92ZXJlZChvYmplY3QpKQotICAgICAgICByZXR1cm4gR1RL
X1NUQVRFX1BSRUxJR0hUOwotICAgIHJldHVybiBHVEtfU1RBVEVfTk9STUFMOwotfQotCiBib29s
IFJlbmRlclRoZW1lR3RrOjpzdXBwb3J0c0ZvY3VzUmluZyhjb25zdCBSZW5kZXJTdHlsZSogc3R5
bGUpIGNvbnN0CiB7CiAgICAgcmV0dXJuIHN1cHBvcnRzRm9jdXMoc3R5bGUtPmFwcGVhcmFuY2Uo
KSk7CkBAIC0yNTMsNyArMTYzLDcgQEAgaW50IFJlbmRlclRoZW1lR3RrOjpiYXNlbGluZVBvc2l0
aW9uKGNvbnN0IFJlbmRlck9iamVjdCogbykgY29uc3QKICAgICByZXR1cm4gUmVuZGVyVGhlbWU6
OmJhc2VsaW5lUG9zaXRpb24obyk7CiB9CiAKLXN0YXRpYyBHdGtUZXh0RGlyZWN0aW9uIGd0a1Rl
eHREaXJlY3Rpb24oVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pCitnaW50IFJlbmRlclRoZW1lR3Rr
OjpndGtUZXh0RGlyZWN0aW9uKFRleHREaXJlY3Rpb24gZGlyZWN0aW9uKQogewogICAgIHN3aXRj
aCAoZGlyZWN0aW9uKSB7CiAgICAgY2FzZSBSVEw6CkBAIC0yNjUsODQgKzE3NSwxNyBAQCBzdGF0
aWMgR3RrVGV4dERpcmVjdGlvbiBndGtUZXh0RGlyZWN0aW9uKFRleHREaXJlY3Rpb24gZGlyZWN0
aW9uKQogICAgIH0KIH0KIAotR3RrU3RhdGVUeXBlIFJlbmRlclRoZW1lR3RrOjpndGtJY29uU3Rh
dGUoUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QpCitzdGF0aWMgZ2ludCBndGtJY29uU3RhdGUo
UmVuZGVyVGhlbWVHdGsqIHRoZW1lLCBSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCkKIHsKLSAg
ICBpZiAoIWlzRW5hYmxlZChyZW5kZXJPYmplY3QpKQorICAgIGlmICghdGhlbWUtPmlzRW5hYmxl
ZChyZW5kZXJPYmplY3QpKQogICAgICAgICByZXR1cm4gR1RLX1NUQVRFX0lOU0VOU0lUSVZFOwot
ICAgIGlmIChpc1ByZXNzZWQocmVuZGVyT2JqZWN0KSkKKyAgICBpZiAodGhlbWUtPmlzUHJlc3Nl
ZChyZW5kZXJPYmplY3QpKQogICAgICAgICByZXR1cm4gR1RLX1NUQVRFX0FDVElWRTsKLSAgICBp
ZiAoaXNIb3ZlcmVkKHJlbmRlck9iamVjdCkpCisgICAgaWYgKHRoZW1lLT5pc0hvdmVyZWQocmVu
ZGVyT2JqZWN0KSkKICAgICAgICAgcmV0dXJuIEdUS19TVEFURV9QUkVMSUdIVDsKLQogICAgIHJl
dHVybiBHVEtfU1RBVEVfTk9STUFMOwogfQogCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFJl
bmRlck9iamVjdChHdGtUaGVtZVdpZGdldFR5cGUgdHlwZSwgUmVuZGVyT2JqZWN0KiByZW5kZXJP
YmplY3QsIEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgaW50
IGZsYWdzKQotewotICAgIC8vIFBhaW50aW5nIGlzIGRpc2FibGVkIHNvIGp1c3QgY2xhaW0gdG8g
aGF2ZSBzdWNjZWVkZWQKLSAgICBpZiAoY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBHdGtXaWRnZXRTdGF0ZSB3aWRnZXRTdGF0ZTsKLSAg
ICB3aWRnZXRTdGF0ZS5hY3RpdmUgPSBpc1ByZXNzZWQocmVuZGVyT2JqZWN0KTsKLSAgICB3aWRn
ZXRTdGF0ZS5mb2N1c2VkID0gaXNGb2N1c2VkKHJlbmRlck9iamVjdCk7Ci0KLSAgICAvLyBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTgzNjQKLSAgICAvLyBUaGUgTW96
aWxsYSB0aGVtZSBkcmF3aW5nIGNvZGUsIG9ubHkgcGFpbnRzIGEgYnV0dG9uIGFzIHByZXNzZWQg
d2hlbiBpdCdzIHByZXNzZWQgCi0gICAgLy8gd2hpbGUgaG92ZXJlZC4gVW50aWwgd2UgbW92ZSBh
d2F5IGZyb20gdGhlIE1vemlsYSBjb2RlLCB3b3JrLWFyb3VuZCB0aGUgaXNzdWUgYnkKLSAgICAv
LyBmb3JjaW5nIGEgcHJlc3NlZCBidXR0b24gaW50byB0aGUgaG92ZXJlZCBzdGF0ZS4gVGhpcyBl
bnN1cmVzIHRoYXQgYnV0dG9ucyBhY3RpdmF0ZWQKLSAgICAvLyB2aWEgdGhlIGtleWJvYXJkIGhh
dmUgdGhlIHByb3BlciByZW5kZXJpbmcuCi0gICAgd2lkZ2V0U3RhdGUuaW5Ib3ZlciA9IGlzSG92
ZXJlZChyZW5kZXJPYmplY3QpIHx8ICh0eXBlID09IE1PWl9HVEtfQlVUVE9OICYmIGlzUHJlc3Nl
ZChyZW5kZXJPYmplY3QpKTsKLQotICAgIC8vIEZJWE1FOiBEaXNhYmxlZCBkb2VzIG5vdCBhbHdh
eXMgZ2l2ZSB0aGUgY29ycmVjdCBhcHBlYXJhbmNlIGZvciBSZWFkT25seQotICAgIHdpZGdldFN0
YXRlLmRpc2FibGVkID0gIWlzRW5hYmxlZChyZW5kZXJPYmplY3QpIHx8IGlzUmVhZE9ubHlDb250
cm9sKHJlbmRlck9iamVjdCk7Ci0gICAgd2lkZ2V0U3RhdGUuaXNEZWZhdWx0ID0gZmFsc2U7Ci0g
ICAgd2lkZ2V0U3RhdGUuY2FuRGVmYXVsdCA9IGZhbHNlOwotCi0gICAgV2lkZ2V0UmVuZGVyaW5n
Q29udGV4dCB3aWRnZXRDb250ZXh0KGNvbnRleHQsIHJlY3QpOwotICAgIHJldHVybiAhd2lkZ2V0
Q29udGV4dC5wYWludE1vemlsbGFXaWRnZXQodHlwZSwgJndpZGdldFN0YXRlLCBmbGFncywgZ3Rr
VGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpKSk7Ci19Ci0K
LXN0YXRpYyB2b2lkIHNldFRvZ2dsZVNpemUoY29uc3QgUmVuZGVyVGhlbWVHdGsqIHRoZW1lLCBS
ZW5kZXJTdHlsZSogc3R5bGUsIENvbnRyb2xQYXJ0IGFwcGVhcmFuY2UpCi17Ci0gICAgLy8gVGhl
IHdpZHRoIGFuZCBoZWlnaHQgYXJlIGJvdGggc3BlY2lmaWVkLCBzbyB3ZSBzaG91bGRuJ3QgY2hh
bmdlIHRoZW0uCi0gICAgaWYgKCFzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpICYm
ICFzdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEZJ
WE1FOiBUaGlzIGlzIHByb2JhYmx5IG5vdCBjb3JyZWN0IHVzZSBvZiBpbmRpY2F0b3JTaXplIGFu
ZCBpbmRpY2F0b3JTcGFjaW5nLgotICAgIGdpbnQgaW5kaWNhdG9yU2l6ZSwgaW5kaWNhdG9yU3Bh
Y2luZzsKLSAgICB0aGVtZS0+Z2V0SW5kaWNhdG9yTWV0cmljcyhhcHBlYXJhbmNlLCBpbmRpY2F0
b3JTaXplLCBpbmRpY2F0b3JTcGFjaW5nKTsKLQotICAgIC8vIE90aGVyIHBvcnRzIGhhcmQtY29k
ZSB0aGlzIHRvIDEzLCBidXQgR1RLKyB1c2VycyB0ZW5kIHRvIGRlbWFuZCB0aGUgbmF0aXZlIGxv
b2suCi0gICAgLy8gSXQgY291bGQgYmUgbWFkZSBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uIHZhbHVl
cyBvdGhlciB0aGFuIDEzIGFjdHVhbGx5IGJyZWFrIHNpdGUgY29tcGF0aWJpbGl0eS4KLSAgICBp
bnQgbGVuZ3RoID0gaW5kaWNhdG9yU2l6ZSArIGluZGljYXRvclNwYWNpbmc7Ci0gICAgaWYgKHN0
eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpCi0gICAgICAgIHN0eWxlLT5zZXRXaWR0
aChMZW5ndGgobGVuZ3RoLCBGaXhlZCkpOwotCi0gICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1
dG8oKSkKLSAgICAgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgobGVuZ3RoLCBGaXhlZCkpOwot
fQotCi12b2lkIFJlbmRlclRoZW1lR3RrOjpzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUqIHN0
eWxlKSBjb25zdAotewotICAgIHNldFRvZ2dsZVNpemUodGhpcywgc3R5bGUsIFJhZGlvUGFydCk7
Ci19Ci0KLWJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50Q2hlY2tib3goUmVuZGVyT2JqZWN0KiBv
LCBjb25zdCBQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgcmV0dXJu
IHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtfQ0hFQ0tCVVRUT04sIG8sIGkuY29udGV4dCwgcmVj
dCwgaXNDaGVja2VkKG8pKTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0UmFkaW9TaXpl
KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAgICBzZXRUb2dnbGVTaXplKHRoaXMsIHN0
eWxlLCBSYWRpb1BhcnQpOwotfQotCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFJhZGlvKFJl
bmRlck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByZWN0KQot
ewotICAgIHJldHVybiBwYWludFJlbmRlck9iamVjdChNT1pfR1RLX1JBRElPQlVUVE9OLCBvLCBp
LmNvbnRleHQsIHJlY3QsIGlzQ2hlY2tlZChvKSk7Ci19Ci0KIHZvaWQgUmVuZGVyVGhlbWVHdGs6
OmFkanVzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHls
ZSogc3R5bGUsIFdlYkNvcmU6OkVsZW1lbnQqIGUpIGNvbnN0CiB7CiAgICAgLy8gU29tZSBsYXlv
dXQgdGVzdHMgY2hlY2sgZXhwbGljaXRseSB0aGF0IGJ1dHRvbnMgaWdub3JlIGxpbmUtaGVpZ2h0
LgpAQCAtMzUwLDk2ICsxOTMsNiBAQCB2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RCdXR0b25T
dHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqCiAgICAgICAgIHN0
eWxlLT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKIH0K
IAotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRCdXR0b24oUmVuZGVyT2JqZWN0KiBvYmplY3Qs
IGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBpZiAo
aW5mby5jb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsK
LQotICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrQnV0dG9uKCk7Ci0gICAgSW50UmVjdCBidXR0
b25SZWN0KEludFBvaW50KCksIHJlY3Quc2l6ZSgpKTsKLSAgICBJbnRSZWN0IGZvY3VzUmVjdChi
dXR0b25SZWN0KTsKLQotICAgIEd0a1N0YXRlVHlwZSBzdGF0ZSA9IGdldEd0a1N0YXRlVHlwZShv
YmplY3QpOwotICAgIGd0a193aWRnZXRfc2V0X3N0YXRlKHdpZGdldCwgc3RhdGUpOwotICAgIGd0
a193aWRnZXRfc2V0X2RpcmVjdGlvbih3aWRnZXQsIGd0a1RleHREaXJlY3Rpb24ob2JqZWN0LT5z
dHlsZSgpLT5kaXJlY3Rpb24oKSkpOwotCi0gICAgaWYgKGlzRm9jdXNlZChvYmplY3QpKSB7Ci0g
ICAgICAgIGlmIChpc0VuYWJsZWQob2JqZWN0KSkgewotI2lmICFHVEtfQ0hFQ0tfVkVSU0lPTigy
LCAyMiwgMCkKLSAgICAgICAgICAgIEdUS19XSURHRVRfU0VUX0ZMQUdTKHdpZGdldCwgR1RLX0hB
U19GT0NVUyk7Ci0jZW5kaWYKLSAgICAgICAgICAgIGdfb2JqZWN0X3NldCh3aWRnZXQsICJoYXMt
Zm9jdXMiLCBUUlVFLCBOVUxMKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdib29sZWFuIGludGVy
aW9yRm9jdXMgPSAwLCBmb2N1c1dpZHRoID0gMCwgZm9jdXNQYWRkaW5nID0gMDsKLSAgICAgICAg
Z3RrX3dpZGdldF9zdHlsZV9nZXQod2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAiaW50ZXJpb3ItZm9jdXMiLCAmaW50ZXJpb3JGb2N1cywKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgImZvY3VzLWxpbmUtd2lkdGgiLCAmZm9jdXNXaWR0aCwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgImZvY3VzLXBhZGRpbmciLCAmZm9jdXNQYWRkaW5nLCBOVUxMKTsKLSAg
ICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIGV4dGVyaW9yIGZvY3VzLCB3ZSBzaHJpbmsgdGhlIGJ1
dHRvbiByZWN0IGRvd24gYmVmb3JlCi0gICAgICAgIC8vIGRyYXdpbmcuIElmIHdlIGFyZSB1c2lu
ZyBpbnRlcmlvciBmb2N1cyB3ZSBzaHJpbmsgdGhlIGZvY3VzIHJlY3QuIFRoaXMKLSAgICAgICAg
Ly8gYXBwcm9hY2ggb3JpZ2luYXRlcyBmcm9tIHRoZSBNb3ppbGxhIHRoZW1lIGRyYXdpbmcgY29k
ZSAoZ3RrMmRyYXdpbmcuYykuCi0gICAgICAgIGlmIChpbnRlcmlvckZvY3VzKSB7Ci0gICAgICAg
ICAgICBHdGtTdHlsZSogc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpOwotICAg
ICAgICAgICAgZm9jdXNSZWN0LmluZmxhdGVYKC1zdHlsZS0+eHRoaWNrbmVzcyAtIGZvY3VzUGFk
ZGluZyk7Ci0gICAgICAgICAgICBmb2N1c1JlY3QuaW5mbGF0ZVkoLXN0eWxlLT55dGhpY2tuZXNz
IC0gZm9jdXNQYWRkaW5nKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1dHRvblJl
Y3QuaW5mbGF0ZVgoLWZvY3VzV2lkdGggLSBmb2N1c1BhZGRpbmcpOwotICAgICAgICAgICAgYnV0
dG9uUmVjdC5pbmZsYXRlWSgtZm9jdXNQYWRkaW5nIC0gZm9jdXNQYWRkaW5nKTsKLSAgICAgICAg
fQotICAgIH0KLQotICAgIFdpZGdldFJlbmRlcmluZ0NvbnRleHQgd2lkZ2V0Q29udGV4dChpbmZv
LmNvbnRleHQsIHJlY3QpOwotICAgIEd0a1NoYWRvd1R5cGUgc2hhZG93VHlwZSA9IHN0YXRlID09
IEdUS19TVEFURV9BQ1RJVkUgPyBHVEtfU0hBRE9XX0lOIDogR1RLX1NIQURPV19PVVQ7Ci0gICAg
d2lkZ2V0Q29udGV4dC5ndGtQYWludEJveChidXR0b25SZWN0LCB3aWRnZXQsIHN0YXRlLCBzaGFk
b3dUeXBlLCAiYnV0dG9uIik7Ci0gICAgaWYgKGlzRm9jdXNlZChvYmplY3QpKQotICAgICAgICB3
aWRnZXRDb250ZXh0Lmd0a1BhaW50Rm9jdXMoZm9jdXNSZWN0LCB3aWRnZXQsIHN0YXRlLCAiYnV0
dG9uIik7Ci0KLSNpZiAhR1RLX0NIRUNLX1ZFUlNJT04oMiwgMjIsIDApCi0gICAgR1RLX1dJREdF
VF9VTlNFVF9GTEFHUyh3aWRnZXQsIEdUS19IQVNfRk9DVVMpOwotI2VuZGlmCi0gICAgZ19vYmpl
Y3Rfc2V0KHdpZGdldCwgImhhcy1mb2N1cyIsIEZBTFNFLCBOVUxMKTsKLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGdldENvbWJvQm94UGFkZGluZyhSZW5kZXJTdHlsZSogc3R5
bGUsIGludCYgbGVmdCwgaW50JiB0b3AsIGludCYgcmlnaHQsIGludCYgYm90dG9tKQotewotICAg
IC8vIElmIHRoaXMgbWVudSBsaXN0IGJ1dHRvbiBpc24ndCBkcmF3biB1c2luZyB0aGUgbmF0aXZl
IHRoZW1lLCB3ZQotICAgIC8vIGRvbid0IGFkZCBhbnkgZXh0cmEgcGFkZGluZyBiZXlvbmQgd2hh
dCBXZWJDb3JlIGFscmVhZHkgdXNlcy4KLSAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBO
b0NvbnRyb2xQYXJ0KQotICAgICAgICByZXR1cm47Ci0gICAgbW96X2d0a19nZXRfd2lkZ2V0X2Jv
cmRlcihNT1pfR1RLX0RST1BET1dOLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RrVGV4dERpcmVjdGlvbihzdHlsZS0+ZGlyZWN0
aW9uKCkpLCBUUlVFKTsKLX0KLQotaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFk
ZGluZ0xlZnQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAotewotICAgIGludCBsZWZ0ID0gMCwg
dG9wID0gMCwgcmlnaHQgPSAwLCBib3R0b20gPSAwOwotICAgIGdldENvbWJvQm94UGFkZGluZyhz
dHlsZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLSAgICByZXR1cm4gbGVmdDsKLX0KLQot
aW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ1JpZ2h0KFJlbmRlclN0eWxl
KiBzdHlsZSkgY29uc3QKLXsKLSAgICBpbnQgbGVmdCA9IDAsIHRvcCA9IDAsIHJpZ2h0ID0gMCwg
Ym90dG9tID0gMDsKLSAgICBnZXRDb21ib0JveFBhZGRpbmcoc3R5bGUsIGxlZnQsIHRvcCwgcmln
aHQsIGJvdHRvbSk7Ci0gICAgcmV0dXJuIHJpZ2h0OwotfQotCi1pbnQgUmVuZGVyVGhlbWVHdGs6
OnBvcHVwSW50ZXJuYWxQYWRkaW5nVG9wKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKLXsKLSAg
ICBpbnQgbGVmdCA9IDAsIHRvcCA9IDAsIHJpZ2h0ID0gMCwgYm90dG9tID0gMDsKLSAgICBnZXRD
b21ib0JveFBhZGRpbmcoc3R5bGUsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Ci0gICAgcmV0
dXJuIHRvcDsKLX0KLQotaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ0Jv
dHRvbShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Ci17Ci0gICAgaW50IGxlZnQgPSAwLCB0b3Ag
PSAwLCByaWdodCA9IDAsIGJvdHRvbSA9IDA7Ci0gICAgZ2V0Q29tYm9Cb3hQYWRkaW5nKHN0eWxl
LCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgIHJldHVybiBib3R0b207Ci19Ci0KIHZv
aWQgUmVuZGVyVGhlbWVHdGs6OmFkanVzdE1lbnVMaXN0U3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciog
c2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3QKIHsKICAgICAv
LyBUaGUgdGVzdHMgY2hlY2sgZXhwbGljaXRseSB0aGF0IHNlbGVjdCBtZW51IGJ1dHRvbnMgaWdu
b3JlIGxpbmUgaGVpZ2h0LgpAQCAtNDU0LDQ0ICsyMDcsMTYgQEAgdm9pZCBSZW5kZXJUaGVtZUd0
azo6YWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3Rvciwg
UmVuZGUKICAgICBhZGp1c3RNZW51TGlzdFN0eWxlKHNlbGVjdG9yLCBzdHlsZSwgZSk7CiB9CiAK
LWJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0KiBvLCBjb25z
dCBQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgcmV0dXJuIHBhaW50
UmVuZGVyT2JqZWN0KE1PWl9HVEtfRFJPUERPV04sIG8sIGkuY29udGV4dCwgcmVjdCk7Ci19Ci0K
IGJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50TWVudUxpc3RCdXR0b24oUmVuZGVyT2JqZWN0KiBv
YmplY3QsIGNvbnN0IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKIHsKICAg
ICByZXR1cm4gcGFpbnRNZW51TGlzdChvYmplY3QsIGluZm8sIHJlY3QpOwogfQogCi1zdGF0aWMg
dm9pZCBzZXRUZXh0SW5wdXRCb3JkZXJzKFJlbmRlclN0eWxlKiBzdHlsZSkKLXsKLSAgICAvLyBJ
ZiB0aGlzIGNvbnRyb2wgaXNuJ3QgZHJhd24gdXNpbmcgdGhlIG5hdGl2ZSB0aGVtZSwgd2UgZG9u
J3QgdG91Y2ggdGhlIGJvcmRlcnMuCi0gICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTm9D
b250cm9sUGFydCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gV2UgY2Fubm90IGdpdmUgYSBw
cm9wZXIgcmVuZGVyaW5nIHdoZW4gYm9yZGVyIHJhZGl1cyBpcyBhY3RpdmUsIHVuZm9ydHVuYXRl
bHkuCi0gICAgc3R5bGUtPnJlc2V0Qm9yZGVyUmFkaXVzKCk7Ci0KLSAgICBpbnQgbGVmdCA9IDAs
IHRvcCA9IDAsIHJpZ2h0ID0gMCwgYm90dG9tID0gMDsKLSAgICBtb3pfZ3RrX2dldF93aWRnZXRf
Ym9yZGVyKE1PWl9HVEtfRU5UUlksICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20sCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBndGtUZXh0RGlyZWN0aW9uKHN0eWxlLT5kaXJlY3Rp
b24oKSksIFRSVUUpOwotICAgIHN0eWxlLT5zZXRCb3JkZXJMZWZ0V2lkdGgobGVmdCk7Ci0gICAg
c3R5bGUtPnNldEJvcmRlclRvcFdpZHRoKHRvcCk7Ci0gICAgc3R5bGUtPnNldEJvcmRlclJpZ2h0
V2lkdGgocmlnaHQpOwotICAgIHN0eWxlLT5zZXRCb3JkZXJCb3R0b21XaWR0aChib3R0b20pOwot
fQotCiB2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RUZXh0RmllbGRTdHlsZShDU1NTdHlsZVNl
bGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAog
ewogICAgIHNldFRleHRJbnB1dEJvcmRlcnMoc3R5bGUpOwogfQogCi1ib29sIFJlbmRlclRoZW1l
R3RrOjpwYWludFRleHRGaWVsZChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgaSwg
Y29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoTU9a
X0dUS19FTlRSWSwgbywgaS5jb250ZXh0LCByZWN0KTsKLX0KLQogdm9pZCBSZW5kZXJUaGVtZUd0
azo6YWRqdXN0VGV4dEFyZWFTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVy
U3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAogewogICAgIHNldFRleHRJbnB1dEJvcmRl
cnMoc3R5bGUpOwpAQCAtNTIzLDcgKzI0OCw3IEBAIHZvaWQgUmVuZGVyVGhlbWVHdGs6OmFkanVz
dFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzCiAg
ICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoaGVpZ2h0LCBGaXhlZCkpOwogfQogCi1zdGF0aWMg
SW50UG9pbnQgY2VudGVyUmVjdFZlcnRpY2FsbHlJblBhcmVudElucHV0RWxlbWVudChSZW5kZXJP
YmplY3QqIG9iamVjdCwgY29uc3QgSW50UmVjdCYgcmVjdCkKK0ludFBvaW50IFJlbmRlclRoZW1l
R3RrOjpjZW50ZXJSZWN0VmVydGljYWxseUluUGFyZW50SW5wdXRFbGVtZW50KFJlbmRlck9iamVj
dCogb2JqZWN0LCBjb25zdCBJbnRSZWN0JiByZWN0KQogewogICAgIE5vZGUqIGlucHV0ID0gb2Jq
ZWN0LT5ub2RlKCktPnNoYWRvd0FuY2VzdG9yTm9kZSgpOyAvLyBHZXQgdGhlIHJlbmRlcmVyIG9m
IDxpbnB1dD4gZWxlbWVudC4KICAgICBpZiAoIWlucHV0LT5yZW5kZXJlcigpLT5pc0JveCgpKQpA
QCAtNTM5LDExICsyNjQsMTEgQEAgc3RhdGljIEludFBvaW50IGNlbnRlclJlY3RWZXJ0aWNhbGx5
SW5QYXJlbnRJbnB1dEVsZW1lbnQoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGMKIAogYm9vbCBSZW5k
ZXJUaGVtZUd0azo6cGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNEZWNvcmF0aW9uKFJlbmRlck9iamVj
dCogcmVuZGVyT2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVj
dCYgcmVjdCkKIHsKLSAgICBHdGtTdHlsZSogc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZShH
VEtfV0lER0VUKGd0a0VudHJ5KCkpKTsKKyAgICBQbGF0Zm9ybVJlZlB0cjxHZGtQaXhidWY+IGlj
b24gPSBnZXRTdG9ja0ljb24oR1RLX1RZUEVfRU5UUlksIEdUS19TVE9DS19GSU5ELAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGtUZXh0RGlyZWN0
aW9uKHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGtJY29uU3RhdGUodGhpcywgcmVu
ZGVyT2JqZWN0KSwgR1RLX0lDT05fU0laRV9NRU5VKTsKICAgICBJbnRQb2ludCBpY29uUG9pbnQo
Y2VudGVyUmVjdFZlcnRpY2FsbHlJblBhcmVudElucHV0RWxlbWVudChyZW5kZXJPYmplY3QsIHJl
Y3QpKTsKLSAgICBwYWludFN0b2NrSWNvbihwYWludEluZm8uY29udGV4dCwgaWNvblBvaW50LCBz
dHlsZSwgR1RLX1NUT0NLX0ZJTkQsCi0gICAgICAgICAgICAgICAgICAgZ3RrVGV4dERpcmVjdGlv
bihyZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpKSwKLSAgICAgICAgICAgICAgICAg
ICBndGtJY29uU3RhdGUocmVuZGVyT2JqZWN0KSwgR1RLX0lDT05fU0laRV9NRU5VKTsKKyAgICBw
YWludFN0b2NrSWNvbihwYWludEluZm8uY29udGV4dCwgaWNvblBvaW50LCBpY29uLmdldCgpKTsK
ICAgICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTU2MCwxMSArMjg1LDEyIEBAIHZvaWQgUmVuZGVy
VGhlbWVHdGs6OmFkanVzdFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxl
Y3Rvciogc2VsZWN0CiAKIGJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50U2VhcmNoRmllbGRDYW5j
ZWxCdXR0b24oUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFp
bnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQogewotICAgIEd0a1N0eWxlKiBzdHlsZSA9IGd0
a193aWRnZXRfZ2V0X3N0eWxlKEdUS19XSURHRVQoZ3RrRW50cnkoKSkpOworICAgIFBsYXRmb3Jt
UmVmUHRyPEdka1BpeGJ1Zj4gaWNvbiA9IGdldFN0b2NrSWNvbihHVEtfVFlQRV9FTlRSWSwgR1RL
X1NUT0NLX0NMRUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBndGtUZXh0RGlyZWN0aW9uKHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9u
KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBn
dGtJY29uU3RhdGUodGhpcywgcmVuZGVyT2JqZWN0KSwgR1RLX0lDT05fU0laRV9NRU5VKTsKICAg
ICBJbnRQb2ludCBpY29uUG9pbnQoY2VudGVyUmVjdFZlcnRpY2FsbHlJblBhcmVudElucHV0RWxl
bWVudChyZW5kZXJPYmplY3QsIHJlY3QpKTsKLSAgICBwYWludFN0b2NrSWNvbihwYWludEluZm8u
Y29udGV4dCwgaWNvblBvaW50LCBzdHlsZSwgR1RLX1NUT0NLX0NMRUFSLAotICAgICAgICAgICAg
ICAgICAgIGd0a1RleHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24o
KSksCi0gICAgICAgICAgICAgICAgICAgZ3RrSWNvblN0YXRlKHJlbmRlck9iamVjdCksIEdUS19J
Q09OX1NJWkVfTUVOVSk7CisgICAgcGFpbnRTdG9ja0ljb24ocGFpbnRJbmZvLmNvbnRleHQsIGlj
b25Qb2ludCwgaWNvbi5nZXQoKSk7CisKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTU3OSwx
NTQgKzMwNSwxNiBAQCBib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFNlYXJjaEZpZWxkKFJlbmRl
ck9iamVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBpLCBjb25zdAogICAgIHJldHVybiBwYWludFRl
eHRGaWVsZChvLCBpLCByZWN0KTsKIH0KIAotYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRTbGlk
ZXJUcmFjayhSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBjb25z
dCBJbnRSZWN0JiByZWN0KQotewotICAgIGlmIChpbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJs
ZWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ29udHJvbFBhcnQgcGFydCA9IG9i
amVjdC0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpOwotICAgIEFTU0VSVChwYXJ0ID09IFNsaWRlckhv
cml6b250YWxQYXJ0IHx8IHBhcnQgPT0gU2xpZGVyVmVydGljYWxQYXJ0KTsKLQotICAgIC8vIFdl
IHNocmluayB0aGUgdHJvdWdoIHJlY3Qgc2xpZ2h0bHkgdG8gbWFrZSByb29tIGZvciB0aGUgZm9j
dXMgaW5kaWNhdG9yLgotICAgIEludFJlY3QgdHJvdWdoUmVjdChJbnRQb2ludCgpLCByZWN0LnNp
emUoKSk7IC8vIFRoaXMgaXMgcmVsYXRpdmUgdG8gcmVjdC4KLSAgICBHdGtXaWRnZXQqIHdpZGdl
dCA9IDA7Ci0gICAgaWYgKHBhcnQgPT0gU2xpZGVyVmVydGljYWxQYXJ0KSB7Ci0gICAgICAgIHdp
ZGdldCA9IGd0a1ZTY2FsZSgpOwotICAgICAgICB0cm91Z2hSZWN0LmluZmxhdGVZKC1ndGtfd2lk
Z2V0X2dldF9zdHlsZSh3aWRnZXQpLT55dGhpY2tuZXNzKTsKLSAgICB9IGVsc2UgewotICAgICAg
ICB3aWRnZXQgPSBndGtIU2NhbGUoKTsKLSAgICAgICAgdHJvdWdoUmVjdC5pbmZsYXRlWCgtZ3Rr
X3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+eHRoaWNrbmVzcyk7Ci0gICAgfQotICAgIGd0a193
aWRnZXRfc2V0X2RpcmVjdGlvbih3aWRnZXQsIGd0a1RleHREaXJlY3Rpb24ob2JqZWN0LT5zdHls
ZSgpLT5kaXJlY3Rpb24oKSkpOwotCi0gICAgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dCB3aWRnZXRD
b250ZXh0KGluZm8uY29udGV4dCwgcmVjdCk7Ci0gICAgd2lkZ2V0Q29udGV4dC5ndGtQYWludEJv
eCh0cm91Z2hSZWN0LCB3aWRnZXQsIEdUS19TVEFURV9BQ1RJVkUsIEdUS19TSEFET1dfT1VULCAi
dHJvdWdoIik7Ci0gICAgaWYgKGlzRm9jdXNlZChvYmplY3QpKQotICAgICAgICB3aWRnZXRDb250
ZXh0Lmd0a1BhaW50Rm9jdXMoSW50UmVjdChJbnRQb2ludCgpLCByZWN0LnNpemUoKSksIHdpZGdl
dCwgZ2V0R3RrU3RhdGVUeXBlKG9iamVjdCksICJ0cm91Z2giKTsKLQotICAgIHJldHVybiBmYWxz
ZTsKLX0KLQogdm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0U2xpZGVyVHJhY2tTdHlsZShDU1NT
dHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KikgY29uc3QKIHsKICAg
ICBzdHlsZS0+c2V0Qm94U2hhZG93KDApOwogfQogCi1ib29sIFJlbmRlclRoZW1lR3RrOjpwYWlu
dFNsaWRlclRodW1iKFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBQYWludEluZm8mIGluZm8s
IGNvbnN0IEludFJlY3QmIHJlY3QpCi17Ci0gICAgaWYgKGluZm8uY29udGV4dC0+cGFpbnRpbmdE
aXNhYmxlZCgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDb250cm9sUGFydCBwYXJ0
ID0gb2JqZWN0LT5zdHlsZSgpLT5hcHBlYXJhbmNlKCk7Ci0gICAgQVNTRVJUKHBhcnQgPT0gU2xp
ZGVyVGh1bWJIb3Jpem9udGFsUGFydCB8fCBwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0
KTsKLQotICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gMDsKLSAgICBjb25zdCBjaGFyKiBkZXRhaWwg
PSAwOwotICAgIEd0a09yaWVudGF0aW9uIG9yaWVudGF0aW9uOwotICAgIGlmIChwYXJ0ID09IFNs
aWRlclRodW1iVmVydGljYWxQYXJ0KSB7Ci0gICAgICAgIHdpZGdldCA9IGd0a1ZTY2FsZSgpOwot
ICAgICAgICBkZXRhaWwgPSAidnNjYWxlIjsKLSAgICAgICAgb3JpZW50YXRpb24gPSBHVEtfT1JJ
RU5UQVRJT05fVkVSVElDQUw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgd2lkZ2V0ID0gZ3RrSFNj
YWxlKCk7Ci0gICAgICAgIGRldGFpbCA9ICJoc2NhbGUiOwotICAgICAgICBvcmllbnRhdGlvbiA9
IEdUS19PUklFTlRBVElPTl9IT1JJWk9OVEFMOwotICAgIH0KLSAgICBndGtfd2lkZ2V0X3NldF9k
aXJlY3Rpb24od2lkZ2V0LCBndGtUZXh0RGlyZWN0aW9uKG9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0
aW9uKCkpKTsKLQotICAgIC8vIE9ubHkgc29tZSB0aGVtZXMgaGF2ZSBzbGlkZXIgdGh1bWJzIHJl
c3BvbmQgdG8gY2xpY2tzIGFuZCBzb21lIGRvbid0LiBUaGlzIGluZm9ybWF0aW9uIGlzCi0gICAg
Ly8gZ2F0aGVyZWQgdmlhIHRoZSAnYWN0aXZhdGUtc2xpZGVyJyBwcm9wZXJ0eSwgYnV0IGl0J3Mg
ZGVwcmVjYXRlZCBpbiBHVEsrIDIuMjIgYW5kIHJlbW92ZWQgaW4KLSAgICAvLyBHVEsrIDMueC4g
VGhlIGRyYXdiYWNrIG9mIG5vdCBob25vcmluZyBpdCBpcyB0aGF0IHNsaWRlciB0aHVtYnMgY2hh
bmdlIGNvbG9yIHdoZW4geW91IGNsaWNrCi0gICAgLy8gb24gdGhlbS4gCi0gICAgSW50UmVjdCB0
aHVtYlJlY3QoSW50UG9pbnQoKSwgcmVjdC5zaXplKCkpOwotICAgIFdpZGdldFJlbmRlcmluZ0Nv
bnRleHQgd2lkZ2V0Q29udGV4dChpbmZvLmNvbnRleHQsIHJlY3QpOwotICAgIHdpZGdldENvbnRl
eHQuZ3RrUGFpbnRTbGlkZXIodGh1bWJSZWN0LCB3aWRnZXQsIGdldEd0a1N0YXRlVHlwZShvYmpl
Y3QpLCBHVEtfU0hBRE9XX09VVCwgZGV0YWlsLCBvcmllbnRhdGlvbik7Ci0gICAgcmV0dXJuIGZh
bHNlOwotfQotCiB2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RTbGlkZXJUaHVtYlN0eWxlKENT
U1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAogewog
ICAgIHN0eWxlLT5zZXRCb3hTaGFkb3coMCk7CiB9CiAKLXZvaWQgUmVuZGVyVGhlbWVHdGs6OmFk
anVzdFNsaWRlclRodW1iU2l6ZShSZW5kZXJPYmplY3QqIG8pIGNvbnN0Ci17Ci0gICAgQ29udHJv
bFBhcnQgcGFydCA9IG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKTsKLSNpZiBFTkFCTEUoVklERU8p
Ci0gICAgaWYgKHBhcnQgPT0gTWVkaWFTbGlkZXJUaHVtYlBhcnQpIHsKLSAgICAgICAgby0+c3R5
bGUoKS0+c2V0V2lkdGgoTGVuZ3RoKG1fbWVkaWFTbGlkZXJUaHVtYldpZHRoLCBGaXhlZCkpOwot
ICAgICAgICBvLT5zdHlsZSgpLT5zZXRIZWlnaHQoTGVuZ3RoKG1fbWVkaWFTbGlkZXJUaHVtYkhl
aWdodCwgRml4ZWQpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAocGFydCA9PSBN
ZWRpYVZvbHVtZVNsaWRlclRodW1iUGFydCkKLSAgICAgICAgcmV0dXJuOwotI2VuZGlmCi0KLSAg
ICBHdGtXaWRnZXQqIHdpZGdldCA9IHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFydCA/
IGd0a0hTY2FsZSgpIDogZ3RrVlNjYWxlKCk7Ci0gICAgaW50IGxlbmd0aCA9IDAsIHdpZHRoID0g
MDsKLSAgICBndGtfd2lkZ2V0X3N0eWxlX2dldCh3aWRnZXQsCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgInNsaWRlcl9sZW5ndGgiLCAmbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICJzbGlkZXJfd2lkdGgiLCAmd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7
Ci0KLSAgICBpZiAocGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0KSB7Ci0gICAgICAg
IG8tPnN0eWxlKCktPnNldFdpZHRoKExlbmd0aChsZW5ndGgsIEZpeGVkKSk7Ci0gICAgICAgIG8t
PnN0eWxlKCktPnNldEhlaWdodChMZW5ndGgod2lkdGgsIEZpeGVkKSk7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0gICAgQVNTRVJUKHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpOwot
ICAgIG8tPnN0eWxlKCktPnNldFdpZHRoKExlbmd0aCh3aWR0aCwgRml4ZWQpKTsKLSAgICBvLT5z
dHlsZSgpLT5zZXRIZWlnaHQoTGVuZ3RoKGxlbmd0aCwgRml4ZWQpKTsKLX0KLQotQ29sb3IgUmVu
ZGVyVGhlbWVHdGs6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29u
c3QKLXsKLSAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a0VudHJ5KCk7Ci0gICAgcmV0dXJuIGd0
a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPmJhc2VbR1RLX1NUQVRFX1NFTEVDVEVEXTsKLX0K
LQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3Jv
dW5kQ29sb3IoKSBjb25zdAotewotICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrRW50cnkoKTsK
LSAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+YmFzZVtHVEtfU1RBVEVf
QUNUSVZFXTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtQWN0aXZlU2VsZWN0
aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKLXsKLSAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0
a0VudHJ5KCk7Ci0gICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPnRleHRb
R1RLX1NUQVRFX1NFTEVDVEVEXTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3Jt
SW5hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAgIEd0a1dpZGdl
dCogd2lkZ2V0ID0gZ3RrRW50cnkoKTsKLSAgICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUo
d2lkZ2V0KS0+dGV4dFtHVEtfU1RBVEVfQUNUSVZFXTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVH
dGs6OmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAotewotICAg
IEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrVHJlZVZpZXcoKTsKLSAgICByZXR1cm4gZ3RrX3dpZGdl
dF9nZXRfc3R5bGUod2lkZ2V0KS0+YmFzZVtHVEtfU1RBVEVfU0VMRUNURURdOwotfQotCi1Db2xv
ciBSZW5kZXJUaGVtZUd0azo6aW5hY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFja2dyb3VuZENvbG9y
KCkgY29uc3QKLXsKLSAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a1RyZWVWaWV3KCk7Ci0gICAg
cmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPmJhc2VbR1RLX1NUQVRFX0FDVElW
RV07Ci19Ci0KLUNvbG9yIFJlbmRlclRoZW1lR3RrOjphY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9y
ZWdyb3VuZENvbG9yKCkgY29uc3QKLXsKLSAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a1RyZWVW
aWV3KCk7Ci0gICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPnRleHRbR1RL
X1NUQVRFX1NFTEVDVEVEXTsKLX0KLQotQ29sb3IgUmVuZGVyVGhlbWVHdGs6OmluYWN0aXZlTGlz
dEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Ci17Ci0gICAgR3RrV2lkZ2V0KiB3
aWRnZXQgPSBndGtUcmVlVmlldygpOwotICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHlsZSh3
aWRnZXQpLT50ZXh0W0dUS19TVEFURV9BQ1RJVkVdOwotfQotCiBkb3VibGUgUmVuZGVyVGhlbWVH
dGs6OmNhcmV0QmxpbmtJbnRlcnZhbCgpIGNvbnN0CiB7CiAgICAgR3RrU2V0dGluZ3MqIHNldHRp
bmdzID0gZ3RrX3NldHRpbmdzX2dldF9kZWZhdWx0KCk7CkBAIC03ODQsMTAxICszNzIsNiBAQCB2
b2lkIFJlbmRlclRoZW1lR3RrOjpzeXN0ZW1Gb250KGludCwgRm9udERlc2NyaXB0aW9uJiBmb250
RGVzY3JpcHRpb24pIGNvbnN0CiAgICAgcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9mcmVlKHBhbmdv
RGVzY3JpcHRpb24pOwogfQogCi1Db2xvciBSZW5kZXJUaGVtZUd0azo6c3lzdGVtQ29sb3IoaW50
IGNzc1ZhbHVlSWQpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChjc3NWYWx1ZUlkKSB7Ci0gICAgY2Fz
ZSBDU1NWYWx1ZUJ1dHRvbnRleHQ6Ci0gICAgICAgIHJldHVybiBDb2xvcihndGtfd2lkZ2V0X2dl
dF9zdHlsZShndGtCdXR0b24oKSktPmZnW0dUS19TVEFURV9OT1JNQUxdKTsKLSAgICBjYXNlIENT
U1ZhbHVlQ2FwdGlvbnRleHQ6Ci0gICAgICAgIHJldHVybiBDb2xvcihndGtfd2lkZ2V0X2dldF9z
dHlsZShndGtFbnRyeSgpKS0+ZmdbR1RLX1NUQVRFX05PUk1BTF0pOwotICAgIGRlZmF1bHQ6Ci0g
ICAgICAgIHJldHVybiBSZW5kZXJUaGVtZTo6c3lzdGVtQ29sb3IoY3NzVmFsdWVJZCk7Ci0gICAg
fQotfQotCi1zdGF0aWMgdm9pZCBndGtTdHlsZVNldENhbGxiYWNrKEd0a1dpZGdldCogd2lkZ2V0
LCBHdGtTdHlsZSogcHJldmlvdXMsIFJlbmRlclRoZW1lKiByZW5kZXJUaGVtZSkKLXsKLSAgICAv
LyBGSVhNRTogTWFrZSBzdXJlIHRoaXMgZnVuY3Rpb24gZG9lc24ndCBnZXQgY2FsbGVkIG1hbnkg
dGltZXMgZm9yIGEgc2luZ2xlIEdUSysgc3R5bGUgY2hhbmdlIHNpZ25hbC4KLSAgICByZW5kZXJU
aGVtZS0+cGxhdGZvcm1Db2xvcnNEaWRDaGFuZ2UoKTsKLX0KLQotdm9pZCBSZW5kZXJUaGVtZUd0
azo6c2V0dXBXaWRnZXRBbmRBZGRUb0NvbnRhaW5lcihHdGtXaWRnZXQqIHdpZGdldCwgR3RrV2lk
Z2V0KiB3aW5kb3cpIGNvbnN0Ci17Ci0gICAgZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5F
Uih3aW5kb3cpLCB3aWRnZXQpOwotICAgIGd0a193aWRnZXRfcmVhbGl6ZSh3aWRnZXQpOwotICAg
IGdfb2JqZWN0X3NldF9kYXRhKEdfT0JKRUNUKHdpZGdldCksICJ0cmFuc3BhcmVudC1iZy1oaW50
IiwgR0lOVF9UT19QT0lOVEVSKFRSVUUpKTsKLQotICAgIC8vIEZJWE1FOiBQZXJoYXBzIHRoaXMg
c2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciB0aGUgY29udGFpbmluZyB3aW5kb3cgb3IgcGFyZW50
IGNvbnRhaW5lci4KLSAgICBnX3NpZ25hbF9jb25uZWN0KHdpZGdldCwgInN0eWxlLXNldCIsIEdf
Q0FMTEJBQ0soZ3RrU3R5bGVTZXRDYWxsYmFjayksIGNvbnN0X2Nhc3Q8UmVuZGVyVGhlbWVHdGsq
Pih0aGlzKSk7Ci19Ci0KLUd0a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a0NvbnRhaW5lcigp
IGNvbnN0Ci17Ci0gICAgaWYgKG1fZ3RrQ29udGFpbmVyKQotICAgICAgICByZXR1cm4gbV9ndGtD
b250YWluZXI7Ci0KLSAgICBtX2d0a1dpbmRvdyA9IGd0a193aW5kb3dfbmV3KEdUS19XSU5ET1df
UE9QVVApOwotI2lmIEdUS19BUElfVkVSU0lPTl8yCi0gICAgZ3RrX3dpZGdldF9zZXRfY29sb3Jt
YXAobV9ndGtXaW5kb3csIG1fdGhlbWVQYXJ0cy5jb2xvcm1hcCk7Ci0jZW5kaWYKLSAgICBndGtf
d2lkZ2V0X3JlYWxpemUobV9ndGtXaW5kb3cpOwotICAgIGd0a193aWRnZXRfc2V0X25hbWUobV9n
dGtXaW5kb3csICJNb3ppbGxhR3RrV2lkZ2V0Iik7Ci0KLSAgICBtX2d0a0NvbnRhaW5lciA9IGd0
a19maXhlZF9uZXcoKTsKLSAgICBzZXR1cFdpZGdldEFuZEFkZFRvQ29udGFpbmVyKG1fZ3RrQ29u
dGFpbmVyLCBtX2d0a1dpbmRvdyk7Ci0gICAgcmV0dXJuIG1fZ3RrQ29udGFpbmVyOwotfQotCi1H
dGtXaWRnZXQqIFJlbmRlclRoZW1lR3RrOjpndGtCdXR0b24oKSBjb25zdAotewotICAgIGlmICht
X2d0a0J1dHRvbikKLSAgICAgICAgcmV0dXJuIG1fZ3RrQnV0dG9uOwotICAgIG1fZ3RrQnV0dG9u
ID0gZ3RrX2J1dHRvbl9uZXcoKTsKLSAgICBzZXR1cFdpZGdldEFuZEFkZFRvQ29udGFpbmVyKG1f
Z3RrQnV0dG9uLCBndGtDb250YWluZXIoKSk7Ci0gICAgcmV0dXJuIG1fZ3RrQnV0dG9uOwotfQot
Ci1HdGtXaWRnZXQqIFJlbmRlclRoZW1lR3RrOjpndGtFbnRyeSgpIGNvbnN0Ci17Ci0gICAgaWYg
KG1fZ3RrRW50cnkpCi0gICAgICAgIHJldHVybiBtX2d0a0VudHJ5OwotICAgIG1fZ3RrRW50cnkg
PSBndGtfZW50cnlfbmV3KCk7Ci0gICAgc2V0dXBXaWRnZXRBbmRBZGRUb0NvbnRhaW5lcihtX2d0
a0VudHJ5LCBndGtDb250YWluZXIoKSk7Ci0gICAgcmV0dXJuIG1fZ3RrRW50cnk7Ci19Ci0KLUd0
a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a1RyZWVWaWV3KCkgY29uc3QKLXsKLSAgICBpZiAo
bV9ndGtUcmVlVmlldykKLSAgICAgICAgcmV0dXJuIG1fZ3RrVHJlZVZpZXc7Ci0gICAgbV9ndGtU
cmVlVmlldyA9IGd0a190cmVlX3ZpZXdfbmV3KCk7Ci0gICAgc2V0dXBXaWRnZXRBbmRBZGRUb0Nv
bnRhaW5lcihtX2d0a1RyZWVWaWV3LCBndGtDb250YWluZXIoKSk7Ci0gICAgcmV0dXJuIG1fZ3Rr
VHJlZVZpZXc7Ci19Ci0KLUd0a1dpZGdldCogUmVuZGVyVGhlbWVHdGs6Omd0a1ZTY2FsZSgpIGNv
bnN0Ci17Ci0gICAgaWYgKG1fZ3RrVlNjYWxlKQotICAgICAgICByZXR1cm4gbV9ndGtWU2NhbGU7
Ci0gICAgbV9ndGtWU2NhbGUgPSBndGtfdnNjYWxlX25ldygwKTsKLSAgICBzZXR1cFdpZGdldEFu
ZEFkZFRvQ29udGFpbmVyKG1fZ3RrVlNjYWxlLCBndGtDb250YWluZXIoKSk7Ci0gICAgcmV0dXJu
IG1fZ3RrVlNjYWxlOwotfQotCi1HdGtXaWRnZXQqIFJlbmRlclRoZW1lR3RrOjpndGtIU2NhbGUo
KSBjb25zdAotewotICAgIGlmIChtX2d0a0hTY2FsZSkKLSAgICAgICAgcmV0dXJuIG1fZ3RrSFNj
YWxlOwotICAgIG1fZ3RrSFNjYWxlID0gZ3RrX2hzY2FsZV9uZXcoMCk7Ci0gICAgc2V0dXBXaWRn
ZXRBbmRBZGRUb0NvbnRhaW5lcihtX2d0a0hTY2FsZSwgZ3RrQ29udGFpbmVyKCkpOwotICAgIHJl
dHVybiBtX2d0a0hTY2FsZTsKLX0KLQotR3RrV2lkZ2V0KiBSZW5kZXJUaGVtZUd0azo6Z3RrU2Ny
b2xsYmFyKCkKLXsKLSAgICByZXR1cm4gbW96X2d0a19nZXRfc2Nyb2xsYmFyX3dpZGdldCgpOwot
fQotCiB2b2lkIFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgpCiB7CiAj
aWYgRU5BQkxFKFZJREVPKQpAQCAtODk1LDEyICszODgsMTMgQEAgU3RyaW5nIFJlbmRlclRoZW1l
R3RrOjpleHRyYU1lZGlhQ29udHJvbHNTdHlsZVNoZWV0KCkKIAogYm9vbCBSZW5kZXJUaGVtZUd0
azo6cGFpbnRNZWRpYUJ1dHRvbihSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgR3JhcGhpY3ND
b250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBjb25zdCBjaGFyKiBpY29uTmFt
ZSkKIHsKLSAgICBHdGtTdHlsZSogc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZShHVEtfV0lE
R0VUKGd0a0NvbnRhaW5lcigpKSk7CisgICAgUGxhdGZvcm1SZWZQdHI8R2RrUGl4YnVmPiBpY29u
ID0gZ2V0U3RvY2tJY29uKEdUS19UWVBFX0NPTlRBSU5FUiwgaWNvbk5hbWUsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0a1RleHREaXJlY3Rpb24o
cmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0a0ljb25TdGF0ZSh0aGlzLCByZW5kZXJP
YmplY3QpLCBnZXRNZWRpYUJ1dHRvbkljb25TaXplKG1fbWVkaWFJY29uU2l6ZSkpOwogICAgIElu
dFBvaW50IGljb25Qb2ludChyZWN0LngoKSArIChyZWN0LndpZHRoKCkgLSBtX21lZGlhSWNvblNp
emUpIC8gMiwKICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC55KCkgKyAocmVjdC5oZWlnaHQo
KSAtIG1fbWVkaWFJY29uU2l6ZSkgLyAyKTsKICAgICBjb250ZXh0LT5maWxsUmVjdChGbG9hdFJl
Y3QocmVjdCksIG1fcGFuZWxDb2xvciwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0gICAgcGFpbnRT
dG9ja0ljb24oY29udGV4dCwgaWNvblBvaW50LCBzdHlsZSwgaWNvbk5hbWUsIGd0a1RleHREaXJl
Y3Rpb24ocmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSksCi0gICAgICAgICAgICAg
ICAgICAgZ3RrSWNvblN0YXRlKHJlbmRlck9iamVjdCksIGdldE1lZGlhQnV0dG9uSWNvblNpemUo
bV9tZWRpYUljb25TaXplKSk7CisgICAgcGFpbnRTdG9ja0ljb24oY29udGV4dCwgaWNvblBvaW50
LCBpY29uLmdldCgpKTsKIAogICAgIHJldHVybiBmYWxzZTsKIH0KQEAgLTEwMDgsNTEgKzUwMiwx
MCBAQCBib29sIFJlbmRlclRoZW1lR3RrOjpwYWludE1lZGlhU2xpZGVyVGh1bWIoUmVuZGVyT2Jq
ZWN0KiBvLCBjb25zdCBQYWludEluZm8mIHBhaQogI2VuZGlmCiAKICNpZiBFTkFCTEUoUFJPR1JF
U1NfVEFHKQotZG91YmxlIFJlbmRlclRoZW1lR3RrOjphbmltYXRpb25SZXBlYXRJbnRlcnZhbEZv
clByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKikgY29uc3QKLXsKLSAgICAvLyBGSVhNRTogSXQg
ZG9lc24ndCBsb29rIGxpa2UgdGhlcmUgaXMgYSBnb29kIHdheSB5ZXQgdG8gc3VwcG9ydCBhbmlt
YXRlZAotICAgIC8vIHByb2dyZXNzIGJhcnMgd2l0aCB0aGUgTW96aWxsYSB0aGVtZSBkcmF3aW5n
IGNvZGUuCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWRvdWJsZSBSZW5kZXJUaGVtZUd0azo6YW5pbWF0
aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyopIGNvbnN0Ci17Ci0gICAg
Ly8gRklYTUU6IEl0IGRvZXNuJ3QgbG9vayBsaWtlIHRoZXJlIGlzIGEgZ29vZCB3YXkgeWV0IHRv
IHN1cHBvcnQgYW5pbWF0ZWQKLSAgICAvLyBwcm9ncmVzcyBiYXJzIHdpdGggdGhlIE1vemlsbGEg
dGhlbWUgZHJhd2luZyBjb2RlLgotICAgIHJldHVybiAwOwotfQotCiB2b2lkIFJlbmRlclRoZW1l
R3RrOjphZGp1c3RQcm9ncmVzc0JhclN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHls
ZSogc3R5bGUsIEVsZW1lbnQqKSBjb25zdAogewogICAgIHN0eWxlLT5zZXRCb3hTaGFkb3coMCk7
CiB9Ci0KLWJvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50UHJvZ3Jlc3NCYXIoUmVuZGVyT2JqZWN0
KiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0
JiByZWN0KQotewotICAgIGlmICghcmVuZGVyT2JqZWN0LT5pc1Byb2dyZXNzKCkpCi0gICAgICAg
IHJldHVybiB0cnVlOwotCi0gICAgR3RrV2lkZ2V0KiBwcm9ncmVzc0JhcldpZGdldCA9IG1vel9n
dGtfZ2V0X3Byb2dyZXNzX3dpZGdldCgpOwotICAgIGlmICghcHJvZ3Jlc3NCYXJXaWRnZXQpCi0g
ICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtf
UFJPR1JFU1NCQVIsIHJlbmRlck9iamVjdCwgcGFpbnRJbmZvLmNvbnRleHQsIHJlY3QpKQotICAg
ICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIEludFJlY3QgY2h1bmtSZWN0KHJlY3QpOwotICAgIFJl
bmRlclByb2dyZXNzKiByZW5kZXJQcm9ncmVzcyA9IHRvUmVuZGVyUHJvZ3Jlc3MocmVuZGVyT2Jq
ZWN0KTsKLQotICAgIEd0a1N0eWxlKiBzdHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKHByb2dy
ZXNzQmFyV2lkZ2V0KTsKLSAgICBjaHVua1JlY3Quc2V0SGVpZ2h0KGNodW5rUmVjdC5oZWlnaHQo
KSAtICgyICogc3R5bGUtPnl0aGlja25lc3MpKTsKLSAgICBjaHVua1JlY3Quc2V0WShjaHVua1Jl
Y3QueSgpICsgc3R5bGUtPnl0aGlja25lc3MpOwotICAgIGNodW5rUmVjdC5zZXRXaWR0aCgoY2h1
bmtSZWN0LndpZHRoKCkgLSAoMiAqIHN0eWxlLT54dGhpY2tuZXNzKSkgKiByZW5kZXJQcm9ncmVz
cy0+cG9zaXRpb24oKSk7Ci0gICAgaWYgKHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGlyZWN0aW9u
KCkgPT0gUlRMKQotICAgICAgICBjaHVua1JlY3Quc2V0WChyZWN0LngoKSArIHJlY3Qud2lkdGgo
KSAtIGNodW5rUmVjdC53aWR0aCgpIC0gc3R5bGUtPnh0aGlja25lc3MpOwotICAgIGVsc2UKLSAg
ICAgICAgY2h1bmtSZWN0LnNldFgoY2h1bmtSZWN0LngoKSArIHN0eWxlLT54dGhpY2tuZXNzKTsK
LQotICAgIHJldHVybiBwYWludFJlbmRlck9iamVjdChNT1pfR1RLX1BST0dSRVNTX0NIVU5LLCBy
ZW5kZXJPYmplY3QsIHBhaW50SW5mby5jb250ZXh0LCBjaHVua1JlY3QpOwotfQogI2VuZGlmCiAK
IH0KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrLmggYi9X
ZWJDb3JlL3BsYXRmb3JtL2d0ay9SZW5kZXJUaGVtZUd0ay5oCmluZGV4IGQzNzdjNDUuLjAwODdi
YjkgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrLmgKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhlbWVHdGsuaApAQCAtMjksNyArMjksOSBA
QAogI2RlZmluZSBSZW5kZXJUaGVtZUd0a19oCiAKICNpbmNsdWRlICJHUmVmUHRyLmgiCisjaWZk
ZWYgR1RLX0FQSV9WRVJTSU9OXzIKICNpbmNsdWRlICJndGtkcmF3aW5nLmgiCisjZW5kaWYKICNp
bmNsdWRlICJSZW5kZXJUaGVtZS5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC04Myw5ICs4
NSwxMSBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBTdHJpbmcgZXh0cmFNZWRpYUNvbnRyb2xzU3R5
bGVTaGVldCgpOwogI2VuZGlmCiAKLSAgICB2b2lkIGdldEluZGljYXRvck1ldHJpY3MoQ29udHJv
bFBhcnQsIGludCYgaW5kaWNhdG9yU2l6ZSwgaW50JiBpbmRpY2F0b3JTcGFjaW5nKSBjb25zdDsK
KyNpZm5kZWYgR1RLX0FQSV9WRVJTSU9OXzIKKyAgICBHdGtTdHlsZUNvbnRleHQqIGd0a1Njcm9s
bGJhclN0eWxlKCk7CisjZW5kaWYKIAotICAgIEd0a1dpZGdldCogZ3RrU2Nyb2xsYmFyKCk7Cisg
ICAgc3RhdGljIGdpbnQgZ3RrVGV4dERpcmVjdGlvbihUZXh0RGlyZWN0aW9uKTsKIAogcHJvdGVj
dGVkOgogICAgIHZpcnR1YWwgYm9vbCBwYWludENoZWNrYm94KFJlbmRlck9iamVjdCogbywgY29u
c3QgUGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByKTsKQEAgLTE1Nyw2ICsxNjEsNyBAQCBw
cm90ZWN0ZWQ6CiAjZW5kaWYKIAogcHJpdmF0ZToKKyNpZmRlZiBHVEtfQVBJX1ZFUlNJT05fMgog
ICAgIEd0a1dpZGdldCogZ3RrQnV0dG9uKCkgY29uc3Q7CiAgICAgR3RrV2lkZ2V0KiBndGtFbnRy
eSgpIGNvbnN0OwogICAgIEd0a1dpZGdldCogZ3RrVHJlZVZpZXcoKSBjb25zdDsKQEAgLTE2NSwx
MyArMTcwLDE4IEBAIHByaXZhdGU6CiAgICAgR3RrV2lkZ2V0KiBndGtDb250YWluZXIoKSBjb25z
dDsKIAogICAgIHZvaWQgc2V0dXBXaWRnZXRBbmRBZGRUb0NvbnRhaW5lcihHdGtXaWRnZXQqLCBH
dGtXaWRnZXQqKSBjb25zdDsKLSAgICBHdGtTdGF0ZVR5cGUgZ2V0R3RrU3RhdGVUeXBlKFJlbmRl
ck9iamVjdCogb2JqZWN0KTsKICAgICBib29sIHBhaW50UmVuZGVyT2JqZWN0KEd0a1RoZW1lV2lk
Z2V0VHlwZSwgUmVuZGVyT2JqZWN0KiwgR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYg
cmVjdCwgaW50IGZsYWdzID0gMCk7CisjZW5kaWYKKwogI2lmIEVOQUJMRShWSURFTykKICAgICBi
b29sIHBhaW50TWVkaWFCdXR0b24oUmVuZGVyT2JqZWN0KiwgR3JhcGhpY3NDb250ZXh0KiwgY29u
c3QgSW50UmVjdCYsIGNvbnN0IGNoYXIqIGljb25OYW1lKTsKICNlbmRpZgotICAgIEd0a1N0YXRl
VHlwZSBndGtJY29uU3RhdGUoUmVuZGVyT2JqZWN0Kik7CiAKKyAgICBQbGF0Zm9ybVJlZlB0cjxH
ZGtQaXhidWY+IGdldFN0b2NrSWNvbihHVHlwZSBnVHlwZSwgY29uc3QgY2hhciogaWNvbk5hbWUs
IGdpbnQgZGlyZWN0aW9uLCBnaW50IHN0YXRlLCBnaW50IGljb25TaXplKTsKKyAgICBzdGF0aWMg
dm9pZCBzZXRUZXh0SW5wdXRCb3JkZXJzKFJlbmRlclN0eWxlKik7CisgICAgc3RhdGljIEludFBv
aW50IGNlbnRlclJlY3RWZXJ0aWNhbGx5SW5QYXJlbnRJbnB1dEVsZW1lbnQoUmVuZGVyT2JqZWN0
KiBvYmplY3QsIGNvbnN0IEludFJlY3QmIHJlY3QpOworCisjaWZkZWYgR1RLX0FQSV9WRVJTSU9O
XzIKICAgICBtdXRhYmxlIEd0a1dpZGdldCogbV9ndGtXaW5kb3c7CiAgICAgbXV0YWJsZSBHdGtX
aWRnZXQqIG1fZ3RrQ29udGFpbmVyOwogICAgIG11dGFibGUgR3RrV2lkZ2V0KiBtX2d0a0J1dHRv
bjsKQEAgLTE3OSw2ICsxODksNyBAQCBwcml2YXRlOgogICAgIG11dGFibGUgR3RrV2lkZ2V0KiBt
X2d0a1RyZWVWaWV3OwogICAgIG11dGFibGUgR3RrV2lkZ2V0KiBtX2d0a1ZTY2FsZTsKICAgICBt
dXRhYmxlIEd0a1dpZGdldCogbV9ndGtIU2NhbGU7CisjZW5kaWYKIAogICAgIG11dGFibGUgQ29s
b3IgbV9wYW5lbENvbG9yOwogICAgIG11dGFibGUgQ29sb3IgbV9zbGlkZXJDb2xvcjsKQEAgLTE4
OSwxMSArMjAwLDkgQEAgcHJpdmF0ZToKICAgICBjb25zdCBpbnQgbV9tZWRpYVNsaWRlclRodW1i
V2lkdGg7CiAgICAgY29uc3QgaW50IG1fbWVkaWFTbGlkZXJUaHVtYkhlaWdodDsKIAotICAgIEd0
a1RoZW1lUGFydHMgbV90aGVtZVBhcnRzOwogI2lmZGVmIEdUS19BUElfVkVSU0lPTl8yCi0gICAg
Ym9vbCBtX3RoZW1lUGFydHNIYXZlUkdCQUNvbG9ybWFwOwotI2VuZGlmCiAgICAgZnJpZW5kIGNs
YXNzIFdpZGdldFJlbmRlcmluZ0NvbnRleHQ7CisjZW5kaWYKIH07CiAKIH0KZGlmZiAtLWdpdCBh
L1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrMi5jcHAgYi9XZWJDb3JlL3BsYXRm
b3JtL2d0ay9SZW5kZXJUaGVtZUd0azIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLmIzNmUyMTcKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9S
ZW5kZXJUaGVtZUd0azIuY3BwCkBAIC0wLDAgKzEsNTQ4IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA3IEFwcGxlIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNyBBbHAgVG9rZXIgPGFscEBh
dG9rZXIuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbGxhYm9yYSBMdGQuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDkgS2VubmV0aCBSb2hkZSBDaHJpc3RpYW5zZW4KKyAqIENvcHlyaWdodCAo
QykgMjAxMCBJZ2FsaWEgUy5MLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNp
b24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJ
Qi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmZGVmIEdUS19BUElfVkVSU0lPTl8yCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZW5kZXJUaGVtZUd0ay5oIgorCisjaW5jbHVkZSAi
QWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgorI2luY2x1
ZGUgIkdPd25QdHIuaCIKKyNpbmNsdWRlICJHcmFkaWVudC5oIgorI2luY2x1ZGUgIkdyYXBoaWNz
Q29udGV4dC5oIgorI2luY2x1ZGUgIkd0a1ZlcnNpb25pbmcuaCIKKyNpbmNsdWRlICJIVE1MTWVk
aWFFbGVtZW50LmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiTWVkaWFDb250
cm9sRWxlbWVudHMuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBs
YXRmb3JtTW91c2VFdmVudC5oIgorI2luY2x1ZGUgIlJlbmRlckJveC5oIgorI2luY2x1ZGUgIlJl
bmRlck9iamVjdC5oIgorI2luY2x1ZGUgIlNjcm9sbGJhci5oIgorI2luY2x1ZGUgIlRpbWVSYW5n
ZXMuaCIKKyNpbmNsdWRlICJVc2VyQWdlbnRTdHlsZVNoZWV0cy5oIgorI2luY2x1ZGUgIldpZGdl
dFJlbmRlcmluZ0NvbnRleHQuaCIKKyNpbmNsdWRlICJndGtkcmF3aW5nLmgiCisjaW5jbHVkZSA8
Z2RrL2dkay5oPgorI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3Ry
aW5nLmg+CisKKyNpZiBFTkFCTEUoUFJPR1JFU1NfVEFHKQorI2luY2x1ZGUgIlJlbmRlclByb2dy
ZXNzLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1lc3BhY2Ug
SFRNTE5hbWVzOworCisjaWYgRU5BQkxFKFZJREVPKQordm9pZCBSZW5kZXJUaGVtZUd0azo6aW5p
dE1lZGlhQ29sb3JzKCkKK3sKKyAgICBHdGtTdHlsZSogc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9z
dHlsZShHVEtfV0lER0VUKGd0a0NvbnRhaW5lcigpKSk7CisgICAgbV9wYW5lbENvbG9yID0gc3R5
bGUtPmJnW0dUS19TVEFURV9OT1JNQUxdOworICAgIG1fc2xpZGVyQ29sb3IgPSBzdHlsZS0+Ymdb
R1RLX1NUQVRFX0FDVElWRV07CisgICAgbV9zbGlkZXJUaHVtYkNvbG9yID0gc3R5bGUtPmJnW0dU
S19TVEFURV9TRUxFQ1RFRF07Cit9CisjZW5kaWYKKworc3RhdGljIGludCBtb3pHdGtSZWZDb3Vu
dCA9IDA7CitzdGF0aWMgR3RrVGhlbWVQYXJ0cyBtb3pUaGVtZVBhcnRzOworCitSZW5kZXJUaGVt
ZUd0azo6UmVuZGVyVGhlbWVHdGsoKQorICAgIDogbV9ndGtXaW5kb3coMCkKKyAgICAsIG1fZ3Rr
Q29udGFpbmVyKDApCisgICAgLCBtX2d0a0J1dHRvbigwKQorICAgICwgbV9ndGtFbnRyeSgwKQor
ICAgICwgbV9ndGtUcmVlVmlldygwKQorICAgICwgbV9wYW5lbENvbG9yKENvbG9yOjp3aGl0ZSkK
KyAgICAsIG1fc2xpZGVyQ29sb3IoQ29sb3I6OndoaXRlKQorICAgICwgbV9zbGlkZXJUaHVtYkNv
bG9yKENvbG9yOjp3aGl0ZSkKKyAgICAsIG1fbWVkaWFJY29uU2l6ZSgxNikKKyAgICAsIG1fbWVk
aWFTbGlkZXJIZWlnaHQoMTQpCisgICAgLCBtX21lZGlhU2xpZGVyVGh1bWJXaWR0aCgxMikKKyAg
ICAsIG1fbWVkaWFTbGlkZXJUaHVtYkhlaWdodCgxMikKK3sKKyAgICAvLyBJbml0aWFsaXplIHRo
ZSBNb3ppbGxhIHRoZW1lIGRyYXdpbmcgY29kZS4KKyAgICBpZiAoIW1vekd0a1JlZkNvdW50KSB7
CisgICAgICAgIG1lbXNldCgmbW96VGhlbWVQYXJ0cywgMCwgc2l6ZW9mKEd0a1RoZW1lUGFydHMp
KTsKKworICAgICAgICBHZGtDb2xvcm1hcCogY29sb3JtYXAgPSBnZGtfc2NyZWVuX2dldF9yZ2Jh
X2NvbG9ybWFwKGdka19zY3JlZW5fZ2V0X2RlZmF1bHQoKSk7CisgICAgICAgIG1velRoZW1lUGFy
dHMuaGF2ZVJHQkFDb2xvcm1hcCA9ICEhY29sb3JtYXA7CisgICAgICAgIGlmICghY29sb3JtYXAp
CisgICAgICAgICAgICBjb2xvcm1hcCA9IGdka19zY3JlZW5fZ2V0X2RlZmF1bHRfY29sb3JtYXAo
Z2RrX3NjcmVlbl9nZXRfZGVmYXVsdCgpKTsKKyAgICAgICAgbW96VGhlbWVQYXJ0cy5jb2xvcm1h
cCA9IGNvbG9ybWFwOworICAgICAgICBtb3pfZ3RrX2luaXQoKTsKKyAgICAgICAgbW96X2d0a191
c2VfdGhlbWVfcGFydHMoJm1velRoZW1lUGFydHMpOworICAgIH0KKyAgICArK21vekd0a1JlZkNv
dW50OworCisjaWYgRU5BQkxFKFZJREVPKQorICAgIGluaXRNZWRpYUNvbG9ycygpOworICAgIGlu
aXRNZWRpYUJ1dHRvbnMoKTsKKyNlbmRpZgorfQorCitSZW5kZXJUaGVtZUd0azo6flJlbmRlclRo
ZW1lR3RrKCkKK3sKKyAgICAtLW1vekd0a1JlZkNvdW50OworCisgICAgaWYgKCFtb3pHdGtSZWZD
b3VudCkKKyAgICAgICAgbW96X2d0a19zaHV0ZG93bigpOworCisgICAgZ3RrX3dpZGdldF9kZXN0
cm95KG1fZ3RrV2luZG93KTsKK30KKworUGxhdGZvcm1SZWZQdHI8R2RrUGl4YnVmPiBSZW5kZXJU
aGVtZUd0azo6Z2V0U3RvY2tJY29uKEdUeXBlIGdUeXBlLCBjb25zdCBjaGFyKiBpY29uTmFtZSwg
Z2ludCBkaXJlY3Rpb24sIGdpbnQgc3RhdGUsIGdpbnQgaWNvblNpemUpCit7CisgICAgR3RrV2lk
Z2V0KiB3aWRnZXQgPSBnVHlwZSA9PSBHVEtfVFlQRV9DT05UQUlORVIgPyBHVEtfV0lER0VUKGd0
a0NvbnRhaW5lcigpKSA6IGd0a0VudHJ5KCk7CisgICAgR3RrU3R5bGUqIHN0eWxlID0gZ3RrX3dp
ZGdldF9nZXRfc3R5bGUod2lkZ2V0KTsKKyAgICBHdGtJY29uU2V0KiBpY29uU2V0ID0gZ3RrX3N0
eWxlX2xvb2t1cF9pY29uX3NldChzdHlsZSwgaWNvbk5hbWUpOworICAgIHJldHVybiBhZG9wdFBs
YXRmb3JtUmVmKGd0a19pY29uX3NldF9yZW5kZXJfaWNvbihpY29uU2V0LCBzdHlsZSwgc3RhdGlj
X2Nhc3Q8R3RrVGV4dERpcmVjdGlvbj4oZGlyZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8R3RrU3RhdGVUeXBl
PihzdGF0ZSksIHN0YXRpY19jYXN0PEd0a0ljb25TaXplPihpY29uU2l6ZSksIDAsIDApKTsKK30K
Kworc3RhdGljIEd0a1N0YXRlVHlwZSBnZXRHdGtTdGF0ZVR5cGUoUmVuZGVyVGhlbWVHdGsqIHRo
ZW1lLCBSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCkKK3sKKyAgICBpZiAoIXRoZW1lLT5pc0Vu
YWJsZWQocmVuZGVyT2JqZWN0KSB8fCB0aGVtZS0+aXNSZWFkT25seUNvbnRyb2wocmVuZGVyT2Jq
ZWN0KSkKKyAgICAgICAgcmV0dXJuIEdUS19TVEFURV9JTlNFTlNJVElWRTsKKyAgICBpZiAodGhl
bWUtPmlzUHJlc3NlZChyZW5kZXJPYmplY3QpKQorICAgICAgICByZXR1cm4gR1RLX1NUQVRFX0FD
VElWRTsKKyAgICBpZiAodGhlbWUtPmlzSG92ZXJlZChyZW5kZXJPYmplY3QpKQorICAgICAgICBy
ZXR1cm4gR1RLX1NUQVRFX1BSRUxJR0hUOworICAgIHJldHVybiBHVEtfU1RBVEVfTk9STUFMOwor
fQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludFJlbmRlck9iamVjdChHdGtUaGVtZVdpZGdl
dFR5cGUgdHlwZSwgUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIEdyYXBoaWNzQ29udGV4dCog
Y29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgaW50IGZsYWdzKQoreworICAgIC8vIFBhaW50
aW5nIGlzIGRpc2FibGVkIHNvIGp1c3QgY2xhaW0gdG8gaGF2ZSBzdWNjZWVkZWQKKyAgICBpZiAo
Y29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICBHdGtXaWRnZXRTdGF0ZSB3aWRnZXRTdGF0ZTsKKyAgICB3aWRnZXRTdGF0ZS5hY3RpdmUgPSBp
c1ByZXNzZWQocmVuZGVyT2JqZWN0KTsKKyAgICB3aWRnZXRTdGF0ZS5mb2N1c2VkID0gaXNGb2N1
c2VkKHJlbmRlck9iamVjdCk7CisKKyAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9MTgzNjQKKyAgICAvLyBUaGUgTW96aWxsYSB0aGVtZSBkcmF3aW5nIGNvZGUs
IG9ubHkgcGFpbnRzIGEgYnV0dG9uIGFzIHByZXNzZWQgd2hlbiBpdCdzIHByZXNzZWQgCisgICAg
Ly8gd2hpbGUgaG92ZXJlZC4gVW50aWwgd2UgbW92ZSBhd2F5IGZyb20gdGhlIE1vemlsYSBjb2Rl
LCB3b3JrLWFyb3VuZCB0aGUgaXNzdWUgYnkKKyAgICAvLyBmb3JjaW5nIGEgcHJlc3NlZCBidXR0
b24gaW50byB0aGUgaG92ZXJlZCBzdGF0ZS4gVGhpcyBlbnN1cmVzIHRoYXQgYnV0dG9ucyBhY3Rp
dmF0ZWQKKyAgICAvLyB2aWEgdGhlIGtleWJvYXJkIGhhdmUgdGhlIHByb3BlciByZW5kZXJpbmcu
CisgICAgd2lkZ2V0U3RhdGUuaW5Ib3ZlciA9IGlzSG92ZXJlZChyZW5kZXJPYmplY3QpIHx8ICh0
eXBlID09IE1PWl9HVEtfQlVUVE9OICYmIGlzUHJlc3NlZChyZW5kZXJPYmplY3QpKTsKKworICAg
IC8vIEZJWE1FOiBEaXNhYmxlZCBkb2VzIG5vdCBhbHdheXMgZ2l2ZSB0aGUgY29ycmVjdCBhcHBl
YXJhbmNlIGZvciBSZWFkT25seQorICAgIHdpZGdldFN0YXRlLmRpc2FibGVkID0gIWlzRW5hYmxl
ZChyZW5kZXJPYmplY3QpIHx8IGlzUmVhZE9ubHlDb250cm9sKHJlbmRlck9iamVjdCk7CisgICAg
d2lkZ2V0U3RhdGUuaXNEZWZhdWx0ID0gZmFsc2U7CisgICAgd2lkZ2V0U3RhdGUuY2FuRGVmYXVs
dCA9IGZhbHNlOworCisgICAgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dCB3aWRnZXRDb250ZXh0KGNv
bnRleHQsIHJlY3QpOworICAgIHJldHVybiAhd2lkZ2V0Q29udGV4dC5wYWludE1vemlsbGFXaWRn
ZXQodHlwZSwgJndpZGdldFN0YXRlLCBmbGFncywgc3RhdGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlv
bj4oZ3RrVGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpKSkp
OworfQorCitzdGF0aWMgdm9pZCBzZXRUb2dnbGVTaXplKGNvbnN0IFJlbmRlclRoZW1lR3RrKiB0
aGVtZSwgUmVuZGVyU3R5bGUqIHN0eWxlLCBDb250cm9sUGFydCBhcHBlYXJhbmNlKQoreworICAg
IC8vIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBib3RoIHNwZWNpZmllZCwgc28gd2Ugc2hvdWxk
bid0IGNoYW5nZSB0aGVtLgorICAgIGlmICghc3R5bGUtPndpZHRoKCkuaXNJbnRyaW5zaWNPckF1
dG8oKSAmJiAhc3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBGSVhNRTogVGhpcyBpcyBwcm9iYWJseSBub3QgY29ycmVjdCB1c2Ugb2YgaW5kaWNhdG9y
U2l6ZSBhbmQgaW5kaWNhdG9yU3BhY2luZy4KKyAgICBnaW50IGluZGljYXRvclNpemUsIGluZGlj
YXRvclNwYWNpbmc7CisgICAgaWYgKGFwcGVhcmFuY2UgPT0gQ2hlY2tib3hQYXJ0KQorICAgICAg
ICBtb3pfZ3RrX2NoZWNrYm94X2dldF9tZXRyaWNzKCZpbmRpY2F0b3JTaXplLCAmaW5kaWNhdG9y
U3BhY2luZyk7CisgICAgZWxzZQorICAgICAgICBtb3pfZ3RrX3JhZGlvX2dldF9tZXRyaWNzKCZp
bmRpY2F0b3JTaXplLCAmaW5kaWNhdG9yU3BhY2luZyk7CisKKyAgICAvLyBPdGhlciBwb3J0cyBo
YXJkLWNvZGUgdGhpcyB0byAxMywgYnV0IEdUSysgdXNlcnMgdGVuZCB0byBkZW1hbmQgdGhlIG5h
dGl2ZSBsb29rLgorICAgIC8vIEl0IGNvdWxkIGJlIG1hZGUgYSBjb25maWd1cmF0aW9uIG9wdGlv
biB2YWx1ZXMgb3RoZXIgdGhhbiAxMyBhY3R1YWxseSBicmVhayBzaXRlIGNvbXBhdGliaWxpdHku
CisgICAgaW50IGxlbmd0aCA9IGluZGljYXRvclNpemUgKyBpbmRpY2F0b3JTcGFjaW5nOworICAg
IGlmIChzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKQorICAgICAgICBzdHlsZS0+
c2V0V2lkdGgoTGVuZ3RoKGxlbmd0aCwgRml4ZWQpKTsKKworICAgIGlmIChzdHlsZS0+aGVpZ2h0
KCkuaXNBdXRvKCkpCisgICAgICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKGxlbmd0aCwgRml4
ZWQpKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0Q2hlY2tib3hTaXplKFJlbmRlclN0
eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBzZXRUb2dnbGVTaXplKHRoaXMsIHN0eWxlLCBSYWRp
b1BhcnQpOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWludENoZWNrYm94KFJlbmRlck9i
amVjdCogbywgY29uc3QgUGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAg
IHJldHVybiBwYWludFJlbmRlck9iamVjdChNT1pfR1RLX0NIRUNLQlVUVE9OLCBvLCBpLmNvbnRl
eHQsIHJlY3QsIGlzQ2hlY2tlZChvKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6OnNldFJh
ZGlvU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgc2V0VG9nZ2xlU2l6ZSh0
aGlzLCBzdHlsZSwgUmFkaW9QYXJ0KTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRS
YWRpbyhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYg
cmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoTU9aX0dUS19SQURJT0JVVFRP
TiwgbywgaS5jb250ZXh0LCByZWN0LCBpc0NoZWNrZWQobykpOworfQorCitib29sIFJlbmRlclRo
ZW1lR3RrOjpwYWludEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgaSwg
Y29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoTU9a
X0dUS19CVVRUT04sIG8sIGkuY29udGV4dCwgcmVjdCwgR1RLX1JFTElFRl9OT1JNQUwpOworfQor
CitzdGF0aWMgdm9pZCBnZXRDb21ib0JveFBhZGRpbmcoUmVuZGVyU3R5bGUqIHN0eWxlLCBpbnQm
IGxlZnQsIGludCYgdG9wLCBpbnQmIHJpZ2h0LCBpbnQmIGJvdHRvbSkKK3sKKyAgICAvLyBJZiB0
aGlzIG1lbnUgbGlzdCBidXR0b24gaXNuJ3QgZHJhd24gdXNpbmcgdGhlIG5hdGl2ZSB0aGVtZSwg
d2UKKyAgICAvLyBkb24ndCBhZGQgYW55IGV4dHJhIHBhZGRpbmcgYmV5b25kIHdoYXQgV2ViQ29y
ZSBhbHJlYWR5IHVzZXMuCisgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTm9Db250cm9s
UGFydCkKKyAgICAgICAgcmV0dXJuOworICAgIG1vel9ndGtfZ2V0X3dpZGdldF9ib3JkZXIoTU9a
X0dUS19EUk9QRE9XTiwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rpb24+KFJlbmRlclRo
ZW1lR3RrOjpndGtUZXh0RGlyZWN0aW9uKHN0eWxlLT5kaXJlY3Rpb24oKSkpLCBUUlVFKTsKK30K
KworaW50IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ0xlZnQoUmVuZGVyU3R5
bGUqIHN0eWxlKSBjb25zdAoreworICAgIGludCBsZWZ0ID0gMCwgdG9wID0gMCwgcmlnaHQgPSAw
LCBib3R0b20gPSAwOworICAgIGdldENvbWJvQm94UGFkZGluZyhzdHlsZSwgbGVmdCwgdG9wLCBy
aWdodCwgYm90dG9tKTsKKyAgICByZXR1cm4gbGVmdDsKK30KKworaW50IFJlbmRlclRoZW1lR3Rr
Ojpwb3B1cEludGVybmFsUGFkZGluZ1JpZ2h0KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sK
KyAgICBpbnQgbGVmdCA9IDAsIHRvcCA9IDAsIHJpZ2h0ID0gMCwgYm90dG9tID0gMDsKKyAgICBn
ZXRDb21ib0JveFBhZGRpbmcoc3R5bGUsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAg
cmV0dXJuIHJpZ2h0OworfQorCitpbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50ZXJuYWxQYWRk
aW5nVG9wKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBpbnQgbGVmdCA9IDAsIHRv
cCA9IDAsIHJpZ2h0ID0gMCwgYm90dG9tID0gMDsKKyAgICBnZXRDb21ib0JveFBhZGRpbmcoc3R5
bGUsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7CisgICAgcmV0dXJuIHRvcDsKK30KKworaW50
IFJlbmRlclRoZW1lR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ0JvdHRvbShSZW5kZXJTdHlsZSog
c3R5bGUpIGNvbnN0Cit7CisgICAgaW50IGxlZnQgPSAwLCB0b3AgPSAwLCByaWdodCA9IDAsIGJv
dHRvbSA9IDA7CisgICAgZ2V0Q29tYm9Cb3hQYWRkaW5nKHN0eWxlLCBsZWZ0LCB0b3AsIHJpZ2h0
LCBib3R0b20pOworICAgIHJldHVybiBib3R0b207Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6
OnBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBQYWludEluZm8mIGksIGNvbnN0
IEludFJlY3QmIHJlY3QpCit7CisgICAgcmV0dXJuIHBhaW50UmVuZGVyT2JqZWN0KE1PWl9HVEtf
RFJPUERPV04sIG8sIGkuY29udGV4dCwgcmVjdCk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6
OnNldFRleHRJbnB1dEJvcmRlcnMoUmVuZGVyU3R5bGUqIHN0eWxlKQoreworICAgIC8vIElmIHRo
aXMgY29udHJvbCBpc24ndCBkcmF3biB1c2luZyB0aGUgbmF0aXZlIHRoZW1lLCB3ZSBkb24ndCB0
b3VjaCB0aGUgYm9yZGVycy4KKyAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBOb0NvbnRy
b2xQYXJ0KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBXZSBjYW5ub3QgZ2l2ZSBhIHByb3Bl
ciByZW5kZXJpbmcgd2hlbiBib3JkZXIgcmFkaXVzIGlzIGFjdGl2ZSwgdW5mb3J0dW5hdGVseS4K
KyAgICBzdHlsZS0+cmVzZXRCb3JkZXJSYWRpdXMoKTsKKworICAgIGludCBsZWZ0ID0gMCwgdG9w
ID0gMCwgcmlnaHQgPSAwLCBib3R0b20gPSAwOworICAgIG1vel9ndGtfZ2V0X3dpZGdldF9ib3Jk
ZXIoTU9aX0dUS19FTlRSWSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rpb24+KGd0a1Rl
eHREaXJlY3Rpb24oc3R5bGUtPmRpcmVjdGlvbigpKSksIFRSVUUpOworICAgIHN0eWxlLT5zZXRC
b3JkZXJMZWZ0V2lkdGgobGVmdCk7CisgICAgc3R5bGUtPnNldEJvcmRlclRvcFdpZHRoKHRvcCk7
CisgICAgc3R5bGUtPnNldEJvcmRlclJpZ2h0V2lkdGgocmlnaHQpOworICAgIHN0eWxlLT5zZXRC
b3JkZXJCb3R0b21XaWR0aChib3R0b20pOworfQorCitib29sIFJlbmRlclRoZW1lR3RrOjpwYWlu
dFRleHRGaWVsZChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFBhaW50SW5mbyYgaSwgY29uc3QgSW50
UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRSZW5kZXJPYmplY3QoTU9aX0dUS19FTlRS
WSwgbywgaS5jb250ZXh0LCByZWN0KTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRT
bGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBpbmZvLCBj
b25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChpbmZvLmNvbnRleHQtPnBhaW50aW5nRGlz
YWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQ29udHJvbFBhcnQgcGFydCA9
IG9iamVjdC0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpOworICAgIEFTU0VSVChwYXJ0ID09IFNsaWRl
ckhvcml6b250YWxQYXJ0IHx8IHBhcnQgPT0gU2xpZGVyVmVydGljYWxQYXJ0KTsKKworICAgIC8v
IFdlIHNocmluayB0aGUgdHJvdWdoIHJlY3Qgc2xpZ2h0bHkgdG8gbWFrZSByb29tIGZvciB0aGUg
Zm9jdXMgaW5kaWNhdG9yLgorICAgIEludFJlY3QgdHJvdWdoUmVjdChJbnRQb2ludCgpLCByZWN0
LnNpemUoKSk7IC8vIFRoaXMgaXMgcmVsYXRpdmUgdG8gcmVjdC4KKyAgICBHdGtXaWRnZXQqIHdp
ZGdldCA9IDA7CisgICAgaWYgKHBhcnQgPT0gU2xpZGVyVmVydGljYWxQYXJ0KSB7CisgICAgICAg
IHdpZGdldCA9IGd0a1ZTY2FsZSgpOworICAgICAgICB0cm91Z2hSZWN0LmluZmxhdGVZKC1ndGtf
d2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT55dGhpY2tuZXNzKTsKKyAgICB9IGVsc2UgeworICAg
ICAgICB3aWRnZXQgPSBndGtIU2NhbGUoKTsKKyAgICAgICAgdHJvdWdoUmVjdC5pbmZsYXRlWCgt
Z3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+eHRoaWNrbmVzcyk7CisgICAgfQorICAgIGd0
a193aWRnZXRfc2V0X2RpcmVjdGlvbih3aWRnZXQsIHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rp
b24+KGd0a1RleHREaXJlY3Rpb24ob2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpKTsKKwor
ICAgIFdpZGdldFJlbmRlcmluZ0NvbnRleHQgd2lkZ2V0Q29udGV4dChpbmZvLmNvbnRleHQsIHJl
Y3QpOworICAgIHdpZGdldENvbnRleHQuZ3RrUGFpbnRCb3godHJvdWdoUmVjdCwgd2lkZ2V0LCBH
VEtfU1RBVEVfQUNUSVZFLCBHVEtfU0hBRE9XX09VVCwgInRyb3VnaCIpOworICAgIGlmIChpc0Zv
Y3VzZWQob2JqZWN0KSkKKyAgICAgICAgd2lkZ2V0Q29udGV4dC5ndGtQYWludEZvY3VzKEludFJl
Y3QoSW50UG9pbnQoKSwgcmVjdC5zaXplKCkpLCB3aWRnZXQsIGdldEd0a1N0YXRlVHlwZSh0aGlz
LCBvYmplY3QpLCAidHJvdWdoIik7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVu
ZGVyVGhlbWVHdGs6OnBhaW50U2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0
IFBhaW50SW5mbyYgaW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoaW5mby5j
b250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IENvbnRyb2xQYXJ0IHBhcnQgPSBvYmplY3QtPnN0eWxlKCktPmFwcGVhcmFuY2UoKTsKKyAgICBB
U1NFUlQocGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0IHx8IHBhcnQgPT0gU2xpZGVy
VGh1bWJWZXJ0aWNhbFBhcnQpOworCisgICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSAwOworICAgIGNv
bnN0IGNoYXIqIGRldGFpbCA9IDA7CisgICAgR3RrT3JpZW50YXRpb24gb3JpZW50YXRpb247Cisg
ICAgaWYgKHBhcnQgPT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpIHsKKyAgICAgICAgd2lkZ2V0
ID0gZ3RrVlNjYWxlKCk7CisgICAgICAgIGRldGFpbCA9ICJ2c2NhbGUiOworICAgICAgICBvcmll
bnRhdGlvbiA9IEdUS19PUklFTlRBVElPTl9WRVJUSUNBTDsKKyAgICB9IGVsc2UgeworICAgICAg
ICB3aWRnZXQgPSBndGtIU2NhbGUoKTsKKyAgICAgICAgZGV0YWlsID0gImhzY2FsZSI7CisgICAg
ICAgIG9yaWVudGF0aW9uID0gR1RLX09SSUVOVEFUSU9OX0hPUklaT05UQUw7CisgICAgfQorICAg
IGd0a193aWRnZXRfc2V0X2RpcmVjdGlvbih3aWRnZXQsIHN0YXRpY19jYXN0PEd0a1RleHREaXJl
Y3Rpb24+KGd0a1RleHREaXJlY3Rpb24ob2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpKTsK
KworICAgIC8vIE9ubHkgc29tZSB0aGVtZXMgaGF2ZSBzbGlkZXIgdGh1bWJzIHJlc3BvbmQgdG8g
Y2xpY2tzIGFuZCBzb21lIGRvbid0LiBUaGlzIGluZm9ybWF0aW9uIGlzCisgICAgLy8gZ2F0aGVy
ZWQgdmlhIHRoZSAnYWN0aXZhdGUtc2xpZGVyJyBwcm9wZXJ0eSwgYnV0IGl0J3MgZGVwcmVjYXRl
ZCBpbiBHVEsrIDIuMjIgYW5kIHJlbW92ZWQgaW4KKyAgICAvLyBHVEsrIDMueC4gVGhlIGRyYXdi
YWNrIG9mIG5vdCBob25vcmluZyBpdCBpcyB0aGF0IHNsaWRlciB0aHVtYnMgY2hhbmdlIGNvbG9y
IHdoZW4geW91IGNsaWNrCisgICAgLy8gb24gdGhlbS4gCisgICAgSW50UmVjdCB0aHVtYlJlY3Qo
SW50UG9pbnQoKSwgcmVjdC5zaXplKCkpOworICAgIFdpZGdldFJlbmRlcmluZ0NvbnRleHQgd2lk
Z2V0Q29udGV4dChpbmZvLmNvbnRleHQsIHJlY3QpOworICAgIHdpZGdldENvbnRleHQuZ3RrUGFp
bnRTbGlkZXIodGh1bWJSZWN0LCB3aWRnZXQsIGdldEd0a1N0YXRlVHlwZSh0aGlzLCBvYmplY3Qp
LCBHVEtfU0hBRE9XX09VVCwgZGV0YWlsLCBvcmllbnRhdGlvbik7CisgICAgcmV0dXJuIGZhbHNl
OworfQorCit2b2lkIFJlbmRlclRoZW1lR3RrOjphZGp1c3RTbGlkZXJUaHVtYlNpemUoUmVuZGVy
T2JqZWN0KiBvKSBjb25zdAoreworICAgIENvbnRyb2xQYXJ0IHBhcnQgPSBvLT5zdHlsZSgpLT5h
cHBlYXJhbmNlKCk7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIGlmIChwYXJ0ID09IE1lZGlhU2xp
ZGVyVGh1bWJQYXJ0KSB7CisgICAgICAgIG8tPnN0eWxlKCktPnNldFdpZHRoKExlbmd0aChtX21l
ZGlhU2xpZGVyVGh1bWJXaWR0aCwgRml4ZWQpKTsKKyAgICAgICAgby0+c3R5bGUoKS0+c2V0SGVp
Z2h0KExlbmd0aChtX21lZGlhU2xpZGVyVGh1bWJIZWlnaHQsIEZpeGVkKSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgaWYgKHBhcnQgPT0gTWVkaWFWb2x1bWVTbGlkZXJUaHVtYlBhcnQp
CisgICAgICAgIHJldHVybjsKKyNlbmRpZgorCisgICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBwYXJ0
ID09IFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQgPyBndGtIU2NhbGUoKSA6IGd0a1ZTY2FsZSgp
OworICAgIGludCBsZW5ndGggPSAwLCB3aWR0aCA9IDA7CisgICAgZ3RrX3dpZGdldF9zdHlsZV9n
ZXQod2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJzbGlkZXJfbGVuZ3RoIiwgJmxl
bmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2xpZGVyX3dpZHRoIiwgJndpZHRoLAor
ICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgaWYgKHBhcnQgPT0gU2xpZGVy
VGh1bWJIb3Jpem9udGFsUGFydCkgeworICAgICAgICBvLT5zdHlsZSgpLT5zZXRXaWR0aChMZW5n
dGgobGVuZ3RoLCBGaXhlZCkpOworICAgICAgICBvLT5zdHlsZSgpLT5zZXRIZWlnaHQoTGVuZ3Ro
KHdpZHRoLCBGaXhlZCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVChwYXJ0
ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KTsKKyAgICBvLT5zdHlsZSgpLT5zZXRXaWR0aChM
ZW5ndGgod2lkdGgsIEZpeGVkKSk7CisgICAgby0+c3R5bGUoKS0+c2V0SGVpZ2h0KExlbmd0aChs
ZW5ndGgsIEZpeGVkKSk7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUFjdGl2
ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgR3RrV2lkZ2V0KiB3aWRn
ZXQgPSBndGtFbnRyeSgpOworICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQp
LT5iYXNlW0dUS19TVEFURV9TRUxFQ1RFRF07Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjpw
bGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBH
dGtXaWRnZXQqIHdpZGdldCA9IGd0a0VudHJ5KCk7CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0
X3N0eWxlKHdpZGdldCktPmJhc2VbR1RLX1NUQVRFX0FDVElWRV07Cit9CisKK0NvbG9yIFJlbmRl
clRoZW1lR3RrOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0
Cit7CisgICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtFbnRyeSgpOworICAgIHJldHVybiBndGtf
d2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpLT50ZXh0W0dUS19TVEFURV9TRUxFQ1RFRF07Cit9CisK
K0NvbG9yIFJlbmRlclRoZW1lR3RrOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uRm9yZWdyb3Vu
ZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a0VudHJ5KCk7Cisg
ICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPnRleHRbR1RLX1NUQVRFX0FD
VElWRV07Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjphY3RpdmVMaXN0Qm94U2VsZWN0aW9u
QmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a1Ry
ZWVWaWV3KCk7CisgICAgcmV0dXJuIGd0a193aWRnZXRfZ2V0X3N0eWxlKHdpZGdldCktPmJhc2Vb
R1RLX1NUQVRFX1NFTEVDVEVEXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OmluYWN0aXZl
TGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgR3RrV2lkZ2V0
KiB3aWRnZXQgPSBndGtUcmVlVmlldygpOworICAgIHJldHVybiBndGtfd2lkZ2V0X2dldF9zdHls
ZSh3aWRnZXQpLT5iYXNlW0dUS19TVEFURV9BQ1RJVkVdOworfQorCitDb2xvciBSZW5kZXJUaGVt
ZUd0azo6YWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0Cit7Cisg
ICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtUcmVlVmlldygpOworICAgIHJldHVybiBndGtfd2lk
Z2V0X2dldF9zdHlsZSh3aWRnZXQpLT50ZXh0W0dUS19TVEFURV9TRUxFQ1RFRF07Cit9CisKK0Nv
bG9yIFJlbmRlclRoZW1lR3RrOjppbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29s
b3IoKSBjb25zdAoreworICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrVHJlZVZpZXcoKTsKKyAg
ICByZXR1cm4gZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KS0+dGV4dFtHVEtfU1RBVEVfQUNU
SVZFXTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnN5c3RlbUNvbG9yKGludCBjc3NWYWx1
ZUlkKSBjb25zdAoreworICAgIHN3aXRjaCAoY3NzVmFsdWVJZCkgeworICAgIGNhc2UgQ1NTVmFs
dWVCdXR0b250ZXh0OgorICAgICAgICByZXR1cm4gQ29sb3IoZ3RrX3dpZGdldF9nZXRfc3R5bGUo
Z3RrQnV0dG9uKCkpLT5mZ1tHVEtfU1RBVEVfTk9STUFMXSk7CisgICAgY2FzZSBDU1NWYWx1ZUNh
cHRpb250ZXh0OgorICAgICAgICByZXR1cm4gQ29sb3IoZ3RrX3dpZGdldF9nZXRfc3R5bGUoZ3Rr
RW50cnkoKSktPmZnW0dUS19TVEFURV9OT1JNQUxdKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBy
ZXR1cm4gUmVuZGVyVGhlbWU6OnN5c3RlbUNvbG9yKGNzc1ZhbHVlSWQpOworICAgIH0KK30KKwor
c3RhdGljIHZvaWQgZ3RrU3R5bGVTZXRDYWxsYmFjayhHdGtXaWRnZXQqIHdpZGdldCwgR3RrU3R5
bGUqIHByZXZpb3VzLCBSZW5kZXJUaGVtZSogcmVuZGVyVGhlbWUpCit7CisgICAgLy8gRklYTUU6
IE1ha2Ugc3VyZSB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZ2V0IGNhbGxlZCBtYW55IHRpbWVzIGZv
ciBhIHNpbmdsZSBHVEsrIHN0eWxlIGNoYW5nZSBzaWduYWwuCisgICAgcmVuZGVyVGhlbWUtPnBs
YXRmb3JtQ29sb3JzRGlkQ2hhbmdlKCk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6OnNldHVw
V2lkZ2V0QW5kQWRkVG9Db250YWluZXIoR3RrV2lkZ2V0KiB3aWRnZXQsIEd0a1dpZGdldCogd2lu
ZG93KSBjb25zdAoreworICAgIGd0a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIod2luZG93
KSwgd2lkZ2V0KTsKKyAgICBndGtfd2lkZ2V0X3JlYWxpemUod2lkZ2V0KTsKKyAgICBnX29iamVj
dF9zZXRfZGF0YShHX09CSkVDVCh3aWRnZXQpLCAidHJhbnNwYXJlbnQtYmctaGludCIsIEdJTlRf
VE9fUE9JTlRFUihUUlVFKSk7CisKKyAgICAvLyBGSVhNRTogUGVyaGFwcyB0aGlzIHNob3VsZCBv
bmx5IGJlIGNhbGxlZCBmb3IgdGhlIGNvbnRhaW5pbmcgd2luZG93IG9yIHBhcmVudCBjb250YWlu
ZXIuCisgICAgZ19zaWduYWxfY29ubmVjdCh3aWRnZXQsICJzdHlsZS1zZXQiLCBHX0NBTExCQUNL
KGd0a1N0eWxlU2V0Q2FsbGJhY2spLCBjb25zdF9jYXN0PFJlbmRlclRoZW1lR3RrKj4odGhpcykp
OworfQorCitHdGtXaWRnZXQqIFJlbmRlclRoZW1lR3RrOjpndGtDb250YWluZXIoKSBjb25zdAor
eworICAgIGlmIChtX2d0a0NvbnRhaW5lcikKKyAgICAgICAgcmV0dXJuIG1fZ3RrQ29udGFpbmVy
OworCisgICAgbV9ndGtXaW5kb3cgPSBndGtfd2luZG93X25ldyhHVEtfV0lORE9XX1BPUFVQKTsK
KyAgICBndGtfd2lkZ2V0X3NldF9jb2xvcm1hcChtX2d0a1dpbmRvdywgbW96VGhlbWVQYXJ0cy5j
b2xvcm1hcCk7CisgICAgZ3RrX3dpZGdldF9yZWFsaXplKG1fZ3RrV2luZG93KTsKKyAgICBndGtf
d2lkZ2V0X3NldF9uYW1lKG1fZ3RrV2luZG93LCAiTW96aWxsYUd0a1dpZGdldCIpOworCisgICAg
bV9ndGtDb250YWluZXIgPSBndGtfZml4ZWRfbmV3KCk7CisgICAgc2V0dXBXaWRnZXRBbmRBZGRU
b0NvbnRhaW5lcihtX2d0a0NvbnRhaW5lciwgbV9ndGtXaW5kb3cpOworICAgIHJldHVybiBtX2d0
a0NvbnRhaW5lcjsKK30KKworR3RrV2lkZ2V0KiBSZW5kZXJUaGVtZUd0azo6Z3RrQnV0dG9uKCkg
Y29uc3QKK3sKKyAgICBpZiAobV9ndGtCdXR0b24pCisgICAgICAgIHJldHVybiBtX2d0a0J1dHRv
bjsKKyAgICBtX2d0a0J1dHRvbiA9IGd0a19idXR0b25fbmV3KCk7CisgICAgc2V0dXBXaWRnZXRB
bmRBZGRUb0NvbnRhaW5lcihtX2d0a0J1dHRvbiwgZ3RrQ29udGFpbmVyKCkpOworICAgIHJldHVy
biBtX2d0a0J1dHRvbjsKK30KKworR3RrV2lkZ2V0KiBSZW5kZXJUaGVtZUd0azo6Z3RrRW50cnko
KSBjb25zdAoreworICAgIGlmIChtX2d0a0VudHJ5KQorICAgICAgICByZXR1cm4gbV9ndGtFbnRy
eTsKKyAgICBtX2d0a0VudHJ5ID0gZ3RrX2VudHJ5X25ldygpOworICAgIHNldHVwV2lkZ2V0QW5k
QWRkVG9Db250YWluZXIobV9ndGtFbnRyeSwgZ3RrQ29udGFpbmVyKCkpOworICAgIHJldHVybiBt
X2d0a0VudHJ5OworfQorCitHdGtXaWRnZXQqIFJlbmRlclRoZW1lR3RrOjpndGtUcmVlVmlldygp
IGNvbnN0Cit7CisgICAgaWYgKG1fZ3RrVHJlZVZpZXcpCisgICAgICAgIHJldHVybiBtX2d0a1Ry
ZWVWaWV3OworICAgIG1fZ3RrVHJlZVZpZXcgPSBndGtfdHJlZV92aWV3X25ldygpOworICAgIHNl
dHVwV2lkZ2V0QW5kQWRkVG9Db250YWluZXIobV9ndGtUcmVlVmlldywgZ3RrQ29udGFpbmVyKCkp
OworICAgIHJldHVybiBtX2d0a1RyZWVWaWV3OworfQorCitHdGtXaWRnZXQqIFJlbmRlclRoZW1l
R3RrOjpndGtWU2NhbGUoKSBjb25zdAoreworICAgIGlmIChtX2d0a1ZTY2FsZSkKKyAgICAgICAg
cmV0dXJuIG1fZ3RrVlNjYWxlOworICAgIG1fZ3RrVlNjYWxlID0gZ3RrX3ZzY2FsZV9uZXcoMCk7
CisgICAgc2V0dXBXaWRnZXRBbmRBZGRUb0NvbnRhaW5lcihtX2d0a1ZTY2FsZSwgZ3RrQ29udGFp
bmVyKCkpOworICAgIHJldHVybiBtX2d0a1ZTY2FsZTsKK30KKworR3RrV2lkZ2V0KiBSZW5kZXJU
aGVtZUd0azo6Z3RrSFNjYWxlKCkgY29uc3QKK3sKKyAgICBpZiAobV9ndGtIU2NhbGUpCisgICAg
ICAgIHJldHVybiBtX2d0a0hTY2FsZTsKKyAgICBtX2d0a0hTY2FsZSA9IGd0a19oc2NhbGVfbmV3
KDApOworICAgIHNldHVwV2lkZ2V0QW5kQWRkVG9Db250YWluZXIobV9ndGtIU2NhbGUsIGd0a0Nv
bnRhaW5lcigpKTsKKyAgICByZXR1cm4gbV9ndGtIU2NhbGU7Cit9CisKKyNpZiBFTkFCTEUoUFJP
R1JFU1NfVEFHKQorZG91YmxlIFJlbmRlclRoZW1lR3RrOjphbmltYXRpb25SZXBlYXRJbnRlcnZh
bEZvclByb2dyZXNzQmFyKFJlbmRlclByb2dyZXNzKikgY29uc3QKK3sKKyAgICAvLyBGSVhNRTog
SXQgZG9lc24ndCBsb29rIGxpa2UgdGhlcmUgaXMgYSBnb29kIHdheSB5ZXQgdG8gc3VwcG9ydCBh
bmltYXRlZAorICAgIC8vIHByb2dyZXNzIGJhcnMgd2l0aCB0aGUgTW96aWxsYSB0aGVtZSBkcmF3
aW5nIGNvZGUuCisgICAgcmV0dXJuIDA7Cit9CisKK2RvdWJsZSBSZW5kZXJUaGVtZUd0azo6YW5p
bWF0aW9uRHVyYXRpb25Gb3JQcm9ncmVzc0JhcihSZW5kZXJQcm9ncmVzcyopIGNvbnN0Cit7Cisg
ICAgLy8gRklYTUU6IEl0IGRvZXNuJ3QgbG9vayBsaWtlIHRoZXJlIGlzIGEgZ29vZCB3YXkgeWV0
IHRvIHN1cHBvcnQgYW5pbWF0ZWQKKyAgICAvLyBwcm9ncmVzcyBiYXJzIHdpdGggdGhlIE1vemls
bGEgdGhlbWUgZHJhd2luZyBjb2RlLgorICAgIHJldHVybiAwOworfQorCitib29sIFJlbmRlclRo
ZW1lR3RrOjpwYWludFByb2dyZXNzQmFyKFJlbmRlck9iamVjdCogcmVuZGVyT2JqZWN0LCBjb25z
dCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAo
IXJlbmRlck9iamVjdC0+aXNQcm9ncmVzcygpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAg
IEd0a1dpZGdldCogcHJvZ3Jlc3NCYXJXaWRnZXQgPSBtb3pfZ3RrX2dldF9wcm9ncmVzc193aWRn
ZXQoKTsKKyAgICBpZiAoIXByb2dyZXNzQmFyV2lkZ2V0KQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIGlmIChwYWludFJlbmRlck9iamVjdChNT1pfR1RLX1BST0dSRVNTQkFSLCByZW5kZXJP
YmplY3QsIHBhaW50SW5mby5jb250ZXh0LCByZWN0KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisK
KyAgICBJbnRSZWN0IGNodW5rUmVjdChyZWN0KTsKKyAgICBSZW5kZXJQcm9ncmVzcyogcmVuZGVy
UHJvZ3Jlc3MgPSB0b1JlbmRlclByb2dyZXNzKHJlbmRlck9iamVjdCk7CisKKyAgICBHdGtTdHls
ZSogc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZShwcm9ncmVzc0JhcldpZGdldCk7CisgICAg
Y2h1bmtSZWN0LnNldEhlaWdodChjaHVua1JlY3QuaGVpZ2h0KCkgLSAoMiAqIHN0eWxlLT55dGhp
Y2tuZXNzKSk7CisgICAgY2h1bmtSZWN0LnNldFkoY2h1bmtSZWN0LnkoKSArIHN0eWxlLT55dGhp
Y2tuZXNzKTsKKyAgICBjaHVua1JlY3Quc2V0V2lkdGgoKGNodW5rUmVjdC53aWR0aCgpIC0gKDIg
KiBzdHlsZS0+eHRoaWNrbmVzcykpICogcmVuZGVyUHJvZ3Jlc3MtPnBvc2l0aW9uKCkpOworICAg
IGlmIChyZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpID09IFJUTCkKKyAgICAgICAg
Y2h1bmtSZWN0LnNldFgocmVjdC54KCkgKyByZWN0LndpZHRoKCkgLSBjaHVua1JlY3Qud2lkdGgo
KSAtIHN0eWxlLT54dGhpY2tuZXNzKTsKKyAgICBlbHNlCisgICAgICAgIGNodW5rUmVjdC5zZXRY
KGNodW5rUmVjdC54KCkgKyBzdHlsZS0+eHRoaWNrbmVzcyk7CisKKyAgICByZXR1cm4gcGFpbnRS
ZW5kZXJPYmplY3QoTU9aX0dUS19QUk9HUkVTU19DSFVOSywgcmVuZGVyT2JqZWN0LCBwYWludElu
Zm8uY29udGV4dCwgY2h1bmtSZWN0KTsKK30KKyNlbmRpZgorCit9CisKKyNlbmRpZiAvLyBHVEtf
QVBJX1ZFUlNJT05fMgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvUmVuZGVyVGhl
bWVHdGszLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrMy5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2YjU2YwotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1JlbmRlclRoZW1lR3RrMy5jcHAKQEAgLTAsMCArMSw4
ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLgorICogQ29weXJpZ2h0
IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tlci5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIw
MDggQ29sbGFib3JhIEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBLZW5uZXRoIFJvaGRlIENo
cmlzdGlhbnNlbgorICogQ29weXJpZ2h0IChDKSAyMDEwIElnYWxpYSBTLkwuCisgKgorICogVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBG
bG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVm
IEdUS19BUElfVkVSU0lPTl8yCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZW5k
ZXJUaGVtZUd0ay5oIgorCisjaW5jbHVkZSAiQ1NTVmFsdWVLZXl3b3Jkcy5oIgorI2luY2x1ZGUg
IkdPd25QdHIuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJHdGtW
ZXJzaW9uaW5nLmgiCisjaW5jbHVkZSAiSFRNTE5hbWVzLmgiCisjaW5jbHVkZSAiUmVuZGVyQm94
LmgiCisjaW5jbHVkZSAiUmVuZGVyT2JqZWN0LmgiCisjaW5jbHVkZSAiVXNlckFnZW50U3R5bGVT
aGVldHMuaCIKKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisKKyNpZiBFTkFCTEUoUFJPR1JFU1NfVEFH
KQorI2luY2x1ZGUgIlJlbmRlclByb2dyZXNzLmgiCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNl
IHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVz
OworCisvLyBBcyBkZWZpbmVkIGluIGd0a2Fycm93LmMKK3N0YXRpYyBjb25zdCBpbnQgbWluQXJy
b3dTaXplID0gMTU7CisKK3R5cGVkZWYgSGFzaE1hcDxHVHlwZSwgUGxhdGZvcm1SZWZQdHI8R3Rr
U3R5bGVDb250ZXh0PiA+IFN0eWxlQ29udGV4dE1hcDsKKworc3RhdGljIFN0eWxlQ29udGV4dE1h
cCYgc3R5bGVDb250ZXh0TWFwKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKFN0eWxlQ29u
dGV4dE1hcCwgbWFwLCAoKSk7CisgICAgcmV0dXJuIG1hcDsKK30KKworc3RhdGljIHZvaWQgZ3Rr
U3R5bGVDaGFuZ2VkQ2FsbGJhY2soR09iamVjdCosIEdQYXJhbVNwZWMqLCBSZW5kZXJUaGVtZSog
cmVuZGVyVGhlbWUpCit7CisgICAgU3R5bGVDb250ZXh0TWFwOjpjb25zdF9pdGVyYXRvciBlbmQg
PSBzdHlsZUNvbnRleHRNYXAoKS5lbmQoKTsKKyAgICBmb3IgKFN0eWxlQ29udGV4dE1hcDo6Y29u
c3RfaXRlcmF0b3IgaXRlciA9IHN0eWxlQ29udGV4dE1hcCgpLmJlZ2luKCk7IGl0ZXIgIT0gZW5k
OyArK2l0ZXIpCisgICAgICAgIGd0a19zdHlsZV9jb250ZXh0X2ludmFsaWRhdGUoaXRlci0+c2Vj
b25kLmdldCgpKTsKKworICAgIHJlbmRlclRoZW1lLT5wbGF0Zm9ybUNvbG9yc0RpZENoYW5nZSgp
OworfQorCitzdGF0aWMgR3RrU3R5bGVDb250ZXh0KiBnZXRTdHlsZUNvbnRleHQoR1R5cGUgZ1R5
cGUpCit7CisgICAgaWYgKCFzdHlsZUNvbnRleHRNYXAoKS5jb250YWlucyhnVHlwZSkpIHsKKyAg
ICAgICAgR3RrV2lkZ2V0UGF0aCogcGF0aCA9IGd0a193aWRnZXRfcGF0aF9uZXcoKTsKKyAgICAg
ICAgZ3RrX3dpZGdldF9wYXRoX2FwcGVuZF90eXBlKHBhdGgsIGdUeXBlKTsKKworICAgICAgICBQ
bGF0Zm9ybVJlZlB0cjxHdGtTdHlsZUNvbnRleHQ+IGNvbnRleHQgPSBhZG9wdFBsYXRmb3JtUmVm
KGd0a19zdHlsZV9jb250ZXh0X25ldygpKTsKKyAgICAgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0
X3BhdGgoY29udGV4dC5nZXQoKSwgcGF0aCk7CisgICAgICAgIGd0a193aWRnZXRfcGF0aF9mcmVl
KHBhdGgpOworCisgICAgICAgIHN0eWxlQ29udGV4dE1hcCgpLnNldChnVHlwZSwgY29udGV4dCk7
CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldCgpOworICAgIH0KKworICAgIFN0eWxlQ29udGV4
dE1hcDo6aXRlcmF0b3IgaXRlciA9IHN0eWxlQ29udGV4dE1hcCgpLmZpbmQoZ1R5cGUpOworICAg
IHJldHVybiBpdGVyLT5zZWNvbmQuZ2V0KCk7Cit9CisKK1JlbmRlclRoZW1lR3RrOjpSZW5kZXJU
aGVtZUd0aygpCisgICAgOiBtX3BhbmVsQ29sb3IoQ29sb3I6OndoaXRlKQorICAgICwgbV9zbGlk
ZXJDb2xvcihDb2xvcjo6d2hpdGUpCisgICAgLCBtX3NsaWRlclRodW1iQ29sb3IoQ29sb3I6Ondo
aXRlKQorICAgICwgbV9tZWRpYUljb25TaXplKDE2KQorICAgICwgbV9tZWRpYVNsaWRlckhlaWdo
dCgxNCkKKyAgICAsIG1fbWVkaWFTbGlkZXJUaHVtYldpZHRoKDEyKQorICAgICwgbV9tZWRpYVNs
aWRlclRodW1iSGVpZ2h0KDEyKQoreworICAgIEd0a1NldHRpbmdzKiBzZXR0aW5ncyA9IGd0a19z
ZXR0aW5nc19nZXRfZGVmYXVsdCgpOworCisgICAgZ19zaWduYWxfY29ubmVjdChzZXR0aW5ncywg
Im5vdGlmeTo6Z3RrLXRoZW1lLW5hbWUiLCBHX0NBTExCQUNLKGd0a1N0eWxlQ2hhbmdlZENhbGxi
YWNrKSwgdGhpcyk7CisgICAgZ19zaWduYWxfY29ubmVjdChzZXR0aW5ncywgIm5vdGlmeTo6Z3Rr
LWNvbG9yLXNjaGVtZSIsIEdfQ0FMTEJBQ0soZ3RrU3R5bGVDaGFuZ2VkQ2FsbGJhY2spLCB0aGlz
KTsKKworI2lmIEVOQUJMRShWSURFTykKKyAgICBpbml0TWVkaWFDb2xvcnMoKTsKKyAgICBpbml0
TWVkaWFCdXR0b25zKCk7CisjZW5kaWYKK30KKworUmVuZGVyVGhlbWVHdGs6On5SZW5kZXJUaGVt
ZUd0aygpCit7Cit9CisKK0d0a1N0eWxlQ29udGV4dCogUmVuZGVyVGhlbWVHdGs6Omd0a1Njcm9s
bGJhclN0eWxlKCkKK3sKKyAgICByZXR1cm4gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX1NDUk9M
TEJBUik7Cit9CisKK1BsYXRmb3JtUmVmUHRyPEdka1BpeGJ1Zj4gUmVuZGVyVGhlbWVHdGs6Omdl
dFN0b2NrSWNvbihHVHlwZSBnVHlwZSwgY29uc3QgY2hhciogaWNvbk5hbWUsIGdpbnQgZGlyZWN0
aW9uLCBnaW50IHN0YXRlLCBnaW50IGljb25TaXplKQoreworICAgIEd0a1N0eWxlQ29udGV4dCog
Y29udGV4dCA9IGdldFN0eWxlQ29udGV4dChnVHlwZSk7CisgICAgR3RrSWNvblNldCogaWNvblNl
dCA9IGd0a19zdHlsZV9jb250ZXh0X2xvb2t1cF9pY29uX3NldChjb250ZXh0LCBpY29uTmFtZSk7
CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKGNvbnRleHQpOworCisgICAgZ3VpbnQgZmxh
Z3MgPSAwOworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICBjYXNlIEdUS19TVEFURV9QUkVMSUdI
VDoKKyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfUFJFTElHSFQ7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgR1RLX1NUQVRFX0lOU0VOU0lUSVZFOgorICAgICAgICBmbGFncyB8PSBH
VEtfU1RBVEVfRkxBR19JTlNFTlNJVElWRTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoK
KyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0YXRl
KGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSk7CisgICAgZ3RrX3N0
eWxlX2NvbnRleHRfc2V0X2RpcmVjdGlvbihjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtUZXh0RGly
ZWN0aW9uPihkaXJlY3Rpb24pKTsKKyAgICBQbGF0Zm9ybVJlZlB0cjxHZGtQaXhidWY+IGljb24g
PSBhZG9wdFBsYXRmb3JtUmVmKGd0a19pY29uX3NldF9yZW5kZXJfaWNvbl9waXhidWYoaWNvblNl
dCwgY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrSWNvblNpemU+KGljb25TaXplKSkpOworCisgICAg
Z3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShjb250ZXh0KTsKKworICAgIHJldHVybiBpY29uOwor
fQorCitzdGF0aWMgdm9pZCBzZXRUb2dnbGVTaXplKEd0a1N0eWxlQ29udGV4dCogY29udGV4dCwg
UmVuZGVyU3R5bGUqIHN0eWxlKQoreworICAgIC8vIFRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBi
b3RoIHNwZWNpZmllZCwgc28gd2Ugc2hvdWxkbid0IGNoYW5nZSB0aGVtLgorICAgIGlmICghc3R5
bGUtPndpZHRoKCkuaXNJbnRyaW5zaWNPckF1dG8oKSAmJiAhc3R5bGUtPmhlaWdodCgpLmlzQXV0
bygpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBGSVhNRTogVGhpcyBpcyBwcm9iYWJseSBu
b3QgY29ycmVjdCB1c2Ugb2YgaW5kaWNhdG9yU2l6ZSBhbmQgaW5kaWNhdG9yU3BhY2luZy4KKyAg
ICBnaW50IGluZGljYXRvclNpemUsIGluZGljYXRvclNwYWNpbmc7CisgICAgZ3RrX3N0eWxlX2Nv
bnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICJpbmRpY2F0b3Itc2l6ZSIsICZpbmRpY2F0b3JTaXplLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiaW5kaWNhdG9yLXNwYWNpbmciLCAmaW5kaWNhdG9yU3BhY2luZywKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgICAvLyBPdGhlciBwb3J0cyBoYXJk
LWNvZGUgdGhpcyB0byAxMywgYnV0IEdUSysgdXNlcnMgdGVuZCB0byBkZW1hbmQgdGhlIG5hdGl2
ZSBsb29rLgorICAgIC8vIEl0IGNvdWxkIGJlIG1hZGUgYSBjb25maWd1cmF0aW9uIG9wdGlvbiB2
YWx1ZXMgb3RoZXIgdGhhbiAxMyBhY3R1YWxseSBicmVhayBzaXRlIGNvbXBhdGliaWxpdHkuCisg
ICAgaW50IGxlbmd0aCA9IGluZGljYXRvclNpemUgKyBpbmRpY2F0b3JTcGFjaW5nOworICAgIGlm
IChzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpKQorICAgICAgICBzdHlsZS0+c2V0
V2lkdGgoTGVuZ3RoKGxlbmd0aCwgRml4ZWQpKTsKKworICAgIGlmIChzdHlsZS0+aGVpZ2h0KCku
aXNBdXRvKCkpCisgICAgICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKGxlbmd0aCwgRml4ZWQp
KTsKK30KKworc3RhdGljIHZvaWQgcGFpbnRUb2dnbGUoY29uc3QgUmVuZGVyVGhlbWVHdGsqIHRo
ZW1lLCBHVHlwZSBnVHlwZSwgUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50
SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIEd0a1N0eWxlQ29u
dGV4dCogY29udGV4dCA9IGdldFN0eWxlQ29udGV4dChnVHlwZSk7CisgICAgZ3RrX3N0eWxlX2Nv
bnRleHRfc2F2ZShjb250ZXh0KTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9kaXJlY3Rp
b24oY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlvbj4oUmVuZGVyVGhlbWVHdGs6
Omd0a1RleHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpKTsK
KyAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MoY29udGV4dCwgZ1R5cGUgPT0gR1RLX1RZ
UEVfQ0hFQ0tfQlVUVE9OID8gR1RLX1NUWUxFX0NMQVNTX0NIRUNLIDogR1RLX1NUWUxFX0NMQVNT
X1JBRElPKTsKKworICAgIGdpbnQgaW5kaWNhdG9yU2l6ZSwgaW5kaWNhdG9yU3BhY2luZzsKKyAg
ICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUoY29udGV4dCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgImluZGljYXRvci1zaXplIiwgJmluZGljYXRvclNpemUsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRpY2F0b3Itc3BhY2luZyIsICZpbmRpY2F0b3JT
cGFjaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBJbnRSZWN0
IGluZGljYXRvclJlY3QocmVjdC54KCksIHJlY3QueSgpICsgKHJlY3QuaGVpZ2h0KCkgLSBpbmRp
Y2F0b3JTaXplKSwgaW5kaWNhdG9yU2l6ZSwgaW5kaWNhdG9yU2l6ZSk7CisKKyAgICBndWludCBm
bGFncyA9IDA7CisgICAgaWYgKHRoZW1lLT5pc0NoZWNrZWQocmVuZGVyT2JqZWN0KSkKKyAgICAg
ICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfQUNUSVZFOworICAgIGlmICh0aGVtZS0+aXNQcmVz
c2VkKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX1NFTEVD
VEVEOworICAgIGlmICh0aGVtZS0+aXNIb3ZlcmVkKHJlbmRlck9iamVjdCkpCisgICAgICAgIGZs
YWdzIHw9IEdUS19TVEFURV9GTEFHX1BSRUxJR0hUOworICAgIGVsc2UgaWYgKCF0aGVtZS0+aXNF
bmFibGVkKHJlbmRlck9iamVjdCkgfHwgdGhlbWUtPmlzUmVhZE9ubHlDb250cm9sKHJlbmRlck9i
amVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9JTlNFTlNJVElWRTsKKyAgICBndGtf
c3R5bGVfY29udGV4dF9zZXRfc3RhdGUoY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFn
cz4oZmxhZ3MpKTsKKworICAgIGlmIChnVHlwZSA9PSBHVEtfVFlQRV9DSEVDS19CVVRUT04pIHsK
KyAgICAgICAgZ3RrX3JlbmRlcl9jaGVjayhjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxh
dGZvcm1Db250ZXh0KCksIGluZGljYXRvclJlY3QueCgpLCBpbmRpY2F0b3JSZWN0LnkoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0b3JSZWN0LndpZHRoKCksIGluZGljYXRvclJl
Y3QuaGVpZ2h0KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGd0a19yZW5kZXJfb3B0aW9uKGNv
bnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgaW5kaWNhdG9yUmVj
dC54KCksIGluZGljYXRvclJlY3QueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRp
Y2F0b3JSZWN0LndpZHRoKCksIGluZGljYXRvclJlY3QuaGVpZ2h0KCkpOworICAgIH0KKworICAg
IGlmICh0aGVtZS0+aXNGb2N1c2VkKHJlbmRlck9iamVjdCkpIHsKKyAgICAgICAgaW5kaWNhdG9y
UmVjdC5pbmZsYXRlKGluZGljYXRvclNwYWNpbmcpOworICAgICAgICBndGtfcmVuZGVyX2ZvY3Vz
KGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgaW5kaWNhdG9y
UmVjdC54KCksIGluZGljYXRvclJlY3QueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlu
ZGljYXRvclJlY3Qud2lkdGgoKSwgaW5kaWNhdG9yUmVjdC5oZWlnaHQoKSk7CisgICAgfQorCisg
ICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShjb250ZXh0KTsKK30KKwordm9pZCBSZW5kZXJU
aGVtZUd0azo6c2V0Q2hlY2tib3hTaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAg
ICBzZXRUb2dnbGVTaXplKGdldFN0eWxlQ29udGV4dChHVEtfVFlQRV9DSEVDS19CVVRUT04pLCBz
dHlsZSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVHdGs6OnBhaW50Q2hlY2tib3goUmVuZGVyT2Jq
ZWN0KiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRS
ZWN0JiByZWN0KQoreworICAgIGlmIChwYWludEluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxl
ZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBwYWludFRvZ2dsZSh0aGlzLCBHVEtf
VFlQRV9DSEVDS19CVVRUT04sIHJlbmRlck9iamVjdCwgcGFpbnRJbmZvLCByZWN0KTsKKworICAg
IHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0UmFkaW9TaXplKFJl
bmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBzZXRUb2dnbGVTaXplKGdldFN0eWxlQ29u
dGV4dChHVEtfVFlQRV9SQURJT19CVVRUT04pLCBzdHlsZSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhl
bWVHdGs6OnBhaW50UmFkaW8oUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50
SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChwYWludElu
Zm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBwYWludFRvZ2dsZSh0aGlzLCBHVEtfVFlQRV9SQURJT19CVVRUT04sIHJlbmRlck9iamVj
dCwgcGFpbnRJbmZvLCByZWN0KTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5k
ZXJUaGVtZUd0azo6cGFpbnRCdXR0b24oUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIGNvbnN0
IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChw
YWludEluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQgPSBnZXRTdHlsZUNvbnRleHQoR1RL
X1RZUEVfQlVUVE9OKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKGNvbnRleHQpOworCisg
ICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X2RpcmVjdGlvbihjb250ZXh0LCBzdGF0aWNfY2FzdDxH
dGtUZXh0RGlyZWN0aW9uPihndGtUZXh0RGlyZWN0aW9uKHJlbmRlck9iamVjdC0+c3R5bGUoKS0+
ZGlyZWN0aW9uKCkpKSk7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQs
IEdUS19TVFlMRV9DTEFTU19CVVRUT04pOworCisgICAgSW50UmVjdCBidXR0b25SZWN0ID0gcmVj
dDsKKworICAgIGdib29sZWFuIGludGVyaW9yRm9jdXM7CisgICAgZ2ludCBmb2N1c1dpZHRoLCBm
b2N1c1BhZDsKKyAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUoY29udGV4dCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzLWxpbmUtd2lkdGgiLCAmZm9jdXNXaWR0
aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvY3VzLXBhZGRpbmciLCAmZm9j
dXNQYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmlvci1mb2N1cyIs
ICZpbnRlcmlvckZvY3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKwor
ICAgIGlmIChpc0RlZmF1bHQocmVuZGVyT2JqZWN0KSkgeworICAgICAgICBHdGtCb3JkZXIqIGJv
cmRlclB0ciA9IDA7CisgICAgICAgIEd0a0JvcmRlciBib3JkZXIgPSB7IDEsIDEsIDEsIDEgfTsK
KworICAgICAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUoY29udGV4dCwgImRlZmF1bHQt
Ym9yZGVyIiwgJmJvcmRlclB0ciwgMCk7CisgICAgICAgIGlmIChib3JkZXJQdHIpIHsKKyAgICAg
ICAgICAgIGJvcmRlciA9ICpib3JkZXJQdHI7CisgICAgICAgICAgICBndGtfYm9yZGVyX2ZyZWUo
Ym9yZGVyUHRyKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1dHRvblJlY3QubW92ZShib3JkZXIu
bGVmdCwgYm9yZGVyLnRvcCk7CisgICAgICAgIGJ1dHRvblJlY3Quc2V0V2lkdGgoYnV0dG9uUmVj
dC53aWR0aCgpIC0gKGJvcmRlci5sZWZ0ICsgYm9yZGVyLnJpZ2h0KSk7CisgICAgICAgIGJ1dHRv
blJlY3Quc2V0SGVpZ2h0KGJ1dHRvblJlY3QuaGVpZ2h0KCkgLSAoYm9yZGVyLnRvcCArIGJvcmRl
ci5ib3R0b20pKTsKKworICAgICAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MoY29udGV4
dCwgR1RLX1NUWUxFX0NMQVNTX0RFRkFVTFQpOworICAgIH0KKworICAgIGlmICghaW50ZXJpb3JG
b2N1cyAmJiBpc0ZvY3VzZWQocmVuZGVyT2JqZWN0KSkKKyAgICAgICAgYnV0dG9uUmVjdC5pbmZs
YXRlKC0oZm9jdXNXaWR0aCArIGZvY3VzUGFkKSk7CisKKyAgICBndWludCBmbGFncyA9IDA7Cisg
ICAgaWYgKCFpc0VuYWJsZWQocmVuZGVyT2JqZWN0KSB8fCBpc1JlYWRPbmx5Q29udHJvbChyZW5k
ZXJPYmplY3QpKQorICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19JTlNFTlNJVElWRTsK
KyAgICBlbHNlIGlmIChpc1ByZXNzZWQocmVuZGVyT2JqZWN0KSkKKyAgICAgICAgZmxhZ3MgfD0g
R1RLX1NUQVRFX0ZMQUdfQUNUSVZFOworICAgIGVsc2UgaWYgKGlzSG92ZXJlZChyZW5kZXJPYmpl
Y3QpKQorICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19QUkVMSUdIVDsKKyAgICBndGtf
c3R5bGVfY29udGV4dF9zZXRfc3RhdGUoY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFn
cz4oZmxhZ3MpKTsKKworICAgIGd0a19yZW5kZXJfYmFja2dyb3VuZChjb250ZXh0LCBwYWludElu
Zm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIGJ1dHRvblJlY3QueCgpLCBidXR0b25SZWN0
LnkoKSwgYnV0dG9uUmVjdC53aWR0aCgpLCBidXR0b25SZWN0LmhlaWdodCgpKTsKKyAgICBndGtf
cmVuZGVyX2ZyYW1lKGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQo
KSwgYnV0dG9uUmVjdC54KCksIGJ1dHRvblJlY3QueSgpLCBidXR0b25SZWN0LndpZHRoKCksIGJ1
dHRvblJlY3QuaGVpZ2h0KCkpOworCisgICAgaWYgKGlzRm9jdXNlZChyZW5kZXJPYmplY3QpKSB7
CisgICAgICAgIGlmIChpbnRlcmlvckZvY3VzKSB7CisgICAgICAgICAgICBHdGtCb3JkZXIgYm9y
ZGVyV2lkdGg7CisgICAgICAgICAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfYm9yZGVyKGNvbnRl
eHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSwgJmJvcmRlcldpZHRoKTsKKwor
ICAgICAgICAgICAgYnV0dG9uUmVjdC5tb3ZlKGJvcmRlcldpZHRoLmxlZnQgKyBmb2N1c1BhZCwg
Ym9yZGVyV2lkdGgudG9wICsgZm9jdXNQYWQpOworICAgICAgICAgICAgYnV0dG9uUmVjdC5zZXRX
aWR0aChidXR0b25SZWN0LndpZHRoKCkgLSAoMiAqIGZvY3VzUGFkICsgYm9yZGVyV2lkdGgubGVm
dCArIGJvcmRlcldpZHRoLnJpZ2h0KSk7CisgICAgICAgICAgICBidXR0b25SZWN0LnNldEhlaWdo
dChidXR0b25SZWN0LmhlaWdodCgpIC0gKDIgKiBmb2N1c1BhZCArIGJvcmRlcldpZHRoLnRvcCAr
IGJvcmRlcldpZHRoLmJvdHRvbSkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGJ1dHRv
blJlY3QuaW5mbGF0ZShmb2N1c1dpZHRoICsgZm9jdXNQYWQpOworCisgICAgICAgIGd0a19yZW5k
ZXJfZm9jdXMoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBi
dXR0b25SZWN0LngoKSwgYnV0dG9uUmVjdC55KCksIGJ1dHRvblJlY3Qud2lkdGgoKSwgYnV0dG9u
UmVjdC5oZWlnaHQoKSk7CisgICAgfQorCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShj
b250ZXh0KTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgZ2V0Q29tYm9C
b3hNZXRyaWNzKFJlbmRlclN0eWxlKiBzdHlsZSwgR3RrQm9yZGVyJiBib3JkZXIsIGludCYgZm9j
dXMsIGludCYgc2VwYXJhdG9yKQoreworICAgIC8vIElmIHRoaXMgbWVudSBsaXN0IGJ1dHRvbiBp
c24ndCBkcmF3biB1c2luZyB0aGUgbmF0aXZlIHRoZW1lLCB3ZQorICAgIC8vIGRvbid0IGFkZCBh
bnkgZXh0cmEgcGFkZGluZyBiZXlvbmQgd2hhdCBXZWJDb3JlIGFscmVhZHkgdXNlcy4KKyAgICBp
ZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBOb0NvbnRyb2xQYXJ0KQorICAgICAgICByZXR1cm47
CisKKyAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQgPSBnZXRTdHlsZUNvbnRleHQoR1RLX1RZ
UEVfQlVUVE9OKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKGNvbnRleHQpOworCisgICAg
Z3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19CVVRU
T04pOworCisgICAgR3RrQm9yZGVyIGJvcmRlcldpZHRoOworICAgIGd0a19zdHlsZV9jb250ZXh0
X2dldF9ib3JkZXIoY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oMCksICZib3Jk
ZXJXaWR0aCk7CisgICAgYm9yZGVyID0gYm9yZGVyV2lkdGg7CisKKyAgICBnaW50IGZvY3VzV2lk
dGgsIGZvY3VzUGFkOworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShjb250ZXh0LAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9jdXMtbGluZS13aWR0aCIsICZmb2N1
c1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9jdXMtcGFkZGluZyIs
ICZmb2N1c1BhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgICBm
b2N1cyA9IGZvY3VzV2lkdGggKyBmb2N1c1BhZDsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3Jl
c3RvcmUoY29udGV4dCk7CisKKyAgICBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBF
X1NFUEFSQVRPUik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKKworICAg
IEd0a1RleHREaXJlY3Rpb24gZGlyZWN0aW9uID0gc3RhdGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlv
bj4oUmVuZGVyVGhlbWVHdGs6Omd0a1RleHREaXJlY3Rpb24oc3R5bGUtPmRpcmVjdGlvbigpKSk7
CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X2RpcmVjdGlvbihjb250ZXh0LCBkaXJlY3Rpb24p
OworICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCAic2VwYXJhdG9yIik7
CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFT
U19CVVRUT04pOworCisgICAgZ2Jvb2xlYW4gd2lkZVNlcGFyYXRvcnM7CisgICAgZ2ludCBzZXBh
cmF0b3JXaWR0aDsKKyAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUoY29udGV4dCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpZGUtc2VwYXJhdG9ycyIsICZ3aWRlU2Vw
YXJhdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRvci13aWR0
aCIsICZzZXBhcmF0b3JXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7
CisKKyAgICBpZiAoIXdpZGVTZXBhcmF0b3JzKQorICAgICAgICBzZXBhcmF0b3JXaWR0aCA9IGJv
cmRlci5sZWZ0OworCisgICAgc2VwYXJhdG9yID0gc2VwYXJhdG9yV2lkdGg7CisKKyAgICBndGtf
c3R5bGVfY29udGV4dF9yZXN0b3JlKGNvbnRleHQpOworfQorCitpbnQgUmVuZGVyVGhlbWVHdGs6
OnBvcHVwSW50ZXJuYWxQYWRkaW5nTGVmdChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7Cisg
ICAgR3RrQm9yZGVyIGJvcmRlcldpZHRoID0geyAwLCAwLCAwLCAwIH07CisgICAgaW50IGZvY3Vz
V2lkdGggPSAwLCBzZXBhcmF0b3JXaWR0aCA9IDA7CisgICAgZ2V0Q29tYm9Cb3hNZXRyaWNzKHN0
eWxlLCBib3JkZXJXaWR0aCwgZm9jdXNXaWR0aCwgc2VwYXJhdG9yV2lkdGgpOworICAgIGludCBs
ZWZ0ID0gYm9yZGVyV2lkdGgubGVmdCArIGZvY3VzV2lkdGg7CisgICAgaWYgKHN0eWxlLT5kaXJl
Y3Rpb24oKSA9PSBSVEwpCisgICAgICAgIGxlZnQgKz0gc2VwYXJhdG9yV2lkdGggKyBtaW5BcnJv
d1NpemU7CisgICAgcmV0dXJuIGxlZnQ7Cit9CisKK2ludCBSZW5kZXJUaGVtZUd0azo6cG9wdXBJ
bnRlcm5hbFBhZGRpbmdSaWdodChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgR3Rr
Qm9yZGVyIGJvcmRlcldpZHRoID0geyAwLCAwLCAwLCAwIH07CisgICAgaW50IGZvY3VzV2lkdGgg
PSAwLCBzZXBhcmF0b3JXaWR0aCA9IDA7CisgICAgZ2V0Q29tYm9Cb3hNZXRyaWNzKHN0eWxlLCBi
b3JkZXJXaWR0aCwgZm9jdXNXaWR0aCwgc2VwYXJhdG9yV2lkdGgpOworICAgIGludCByaWdodCA9
IGJvcmRlcldpZHRoLnJpZ2h0ICsgZm9jdXNXaWR0aDsKKyAgICBpZiAoc3R5bGUtPmRpcmVjdGlv
bigpID09IExUUikKKyAgICAgICAgcmlnaHQgKz0gc2VwYXJhdG9yV2lkdGggKyBtaW5BcnJvd1Np
emU7CisgICAgcmV0dXJuIHJpZ2h0OworfQorCitpbnQgUmVuZGVyVGhlbWVHdGs6OnBvcHVwSW50
ZXJuYWxQYWRkaW5nVG9wKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBHdGtCb3Jk
ZXIgYm9yZGVyV2lkdGggPSB7IDAsIDAsIDAsIDAgfTsKKyAgICBpbnQgZm9jdXNXaWR0aCA9IDAs
IHNlcGFyYXRvcldpZHRoID0gMDsKKyAgICBnZXRDb21ib0JveE1ldHJpY3Moc3R5bGUsIGJvcmRl
cldpZHRoLCBmb2N1c1dpZHRoLCBzZXBhcmF0b3JXaWR0aCk7CisgICAgcmV0dXJuIGJvcmRlcldp
ZHRoLnRvcCArIGZvY3VzV2lkdGg7Cit9CisKK2ludCBSZW5kZXJUaGVtZUd0azo6cG9wdXBJbnRl
cm5hbFBhZGRpbmdCb3R0b20oUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIEd0a0Jv
cmRlciBib3JkZXJXaWR0aCA9IHsgMCwgMCwgMCwgMCB9OworICAgIGludCBmb2N1c1dpZHRoID0g
MCwgc2VwYXJhdG9yV2lkdGggPSAwOworICAgIGdldENvbWJvQm94TWV0cmljcyhzdHlsZSwgYm9y
ZGVyV2lkdGgsIGZvY3VzV2lkdGgsIHNlcGFyYXRvcldpZHRoKTsKKyAgICByZXR1cm4gYm9yZGVy
V2lkdGguYm90dG9tICsgZm9jdXNXaWR0aDsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFp
bnRNZW51TGlzdChSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBw
YWludEluZm8sIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHBhaW50SW5mby5jb250
ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEd0
a1RleHREaXJlY3Rpb24gZGlyZWN0aW9uID0gc3RhdGljX2Nhc3Q8R3RrVGV4dERpcmVjdGlvbj4o
Z3RrVGV4dERpcmVjdGlvbihyZW5kZXJPYmplY3QtPnN0eWxlKCktPmRpcmVjdGlvbigpKSk7Cisg
ICAgR3RrU3R5bGVDb250ZXh0KiBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX0JV
VFRPTik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2F2ZShjb250ZXh0KTsKKworICAgIGd0a19z
dHlsZV9jb250ZXh0X3NldF9kaXJlY3Rpb24oY29udGV4dCwgZGlyZWN0aW9uKTsKKyAgICBndGtf
c3R5bGVfY29udGV4dF9hZGRfY2xhc3MoY29udGV4dCwgR1RLX1NUWUxFX0NMQVNTX0JVVFRPTik7
CisKKyAgICBJbnRSZWN0IGNvbWJvUmVjdCA9IHJlY3Q7CisKKyAgICBndWludCBmbGFncyA9IDA7
CisgICAgaWYgKCFpc0VuYWJsZWQocmVuZGVyT2JqZWN0KSB8fCBpc1JlYWRPbmx5Q29udHJvbChy
ZW5kZXJPYmplY3QpKQorICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19JTlNFTlNJVElW
RTsKKyAgICBlbHNlIGlmIChpc1ByZXNzZWQocmVuZGVyT2JqZWN0KSkKKyAgICAgICAgZmxhZ3Mg
fD0gR1RLX1NUQVRFX0ZMQUdfQUNUSVZFOworICAgIGVsc2UgaWYgKGlzSG92ZXJlZChyZW5kZXJP
YmplY3QpKQorICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19QUkVMSUdIVDsKKyAgICBn
dGtfc3R5bGVfY29udGV4dF9zZXRfc3RhdGUoY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVG
bGFncz4oZmxhZ3MpKTsKKworICAgIGd0a19yZW5kZXJfYmFja2dyb3VuZChjb250ZXh0LCBwYWlu
dEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIGNvbWJvUmVjdC54KCksIGNvbWJvUmVj
dC55KCksIGNvbWJvUmVjdC53aWR0aCgpLCBjb21ib1JlY3QuaGVpZ2h0KCkpOworICAgIGd0a19y
ZW5kZXJfZnJhbWUoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgp
LCBjb21ib1JlY3QueCgpLCBjb21ib1JlY3QueSgpLCBjb21ib1JlY3Qud2lkdGgoKSwgY29tYm9S
ZWN0LmhlaWdodCgpKTsKKworICAgIEd0a0JvcmRlciBib3JkZXJXaWR0aDsKKyAgICBndGtfc3R5
bGVfY29udGV4dF9nZXRfYm9yZGVyKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+
KGZsYWdzKSwgJmJvcmRlcldpZHRoKTsKKworICAgIGdpbnQgZm9jdXNXaWR0aCwgZm9jdXNQYWQ7
CisgICAgR3RrQm9yZGVyKiBpbm5lckJvcmRlclB0ciA9IDA7CisgICAgR3RrQm9yZGVyIGlubmVy
Qm9yZGVyID0geyAxLCAxLCAxLCAxIH07CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxl
KGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbm5lci1ib3JkZXIi
LCAmaW5uZXJCb3JkZXJQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb2N1
cy1saW5lLXdpZHRoIiwgJmZvY3VzV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICJmb2N1cy1wYWRkaW5nIiwgJmZvY3VzUGFkLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAwKTsKKyAgICBpZiAoaW5uZXJCb3JkZXJQdHIpIHsKKyAgICAgICAgaW5uZXJCb3Jk
ZXIgPSAqaW5uZXJCb3JkZXJQdHI7CisgICAgICAgIGd0a19ib3JkZXJfZnJlZShpbm5lckJvcmRl
clB0cik7CisgICAgfQorCisgICAgaWYgKGlzRm9jdXNlZChyZW5kZXJPYmplY3QpKSB7CisgICAg
ICAgIEludFJlY3QgZm9jdXNSZWN0ID0gY29tYm9SZWN0OworICAgICAgICBmb2N1c1JlY3QubW92
ZShib3JkZXJXaWR0aC5sZWZ0ICsgZm9jdXNQYWQsIGJvcmRlcldpZHRoLnRvcCArIGZvY3VzUGFk
KTsKKyAgICAgICAgZm9jdXNSZWN0LnNldFdpZHRoKGZvY3VzUmVjdC53aWR0aCgpIC0gKDIgKiBm
b2N1c1BhZCArIGJvcmRlcldpZHRoLmxlZnQgKyBib3JkZXJXaWR0aC5yaWdodCkpOworICAgICAg
ICBmb2N1c1JlY3Quc2V0SGVpZ2h0KGZvY3VzUmVjdC5oZWlnaHQoKSAtICgyICogZm9jdXNQYWQg
KyBib3JkZXJXaWR0aC50b3AgKyBib3JkZXJXaWR0aC5ib3R0b20pKTsKKyAgICAgICAgZ3RrX3Jl
bmRlcl9mb2N1cyhjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCks
IGZvY3VzUmVjdC54KCksIGZvY3VzUmVjdC55KCksIGZvY3VzUmVjdC53aWR0aCgpLCBmb2N1c1Jl
Y3QuaGVpZ2h0KCkpOworICAgIH0KKworICAgIGNvbWJvUmVjdC5zZXRYKGNvbWJvUmVjdC54KCkg
KyBib3JkZXJXaWR0aC5sZWZ0ICsgZm9jdXNXaWR0aCArIGZvY3VzUGFkKTsKKyAgICBpZiAoZGly
ZWN0aW9uID09IEdUS19URVhUX0RJUl9MVFIpCisgICAgICAgIGNvbWJvUmVjdC5zZXRYKGNvbWJv
UmVjdC54KCkgKyBpbm5lckJvcmRlci5sZWZ0KTsKKyAgICBlbHNlCisgICAgICAgIGNvbWJvUmVj
dC5zZXRYKGNvbWJvUmVjdC54KCkgKyBpbm5lckJvcmRlci5yaWdodCk7CisgICAgY29tYm9SZWN0
LnNldFkoY29tYm9SZWN0LnkoKSArIGlubmVyQm9yZGVyLnRvcCArIGJvcmRlcldpZHRoLnRvcCAr
IGZvY3VzV2lkdGggKyBmb2N1c1BhZCk7CisgICAgY29tYm9SZWN0LnNldFdpZHRoKG1heCgxLCBj
b21ib1JlY3Qud2lkdGgoKSAtIGlubmVyQm9yZGVyLmxlZnQgLSBpbm5lckJvcmRlci5yaWdodCAt
ICgyICogKGZvY3VzV2lkdGggKyBmb2N1c1BhZCkgKyBib3JkZXJXaWR0aC5sZWZ0ICsgYm9yZGVy
V2lkdGgucmlnaHQpKSk7CisgICAgY29tYm9SZWN0LnNldEhlaWdodChtYXgoMSwgY29tYm9SZWN0
LmhlaWdodCgpIC0gaW5uZXJCb3JkZXIudG9wIC0gaW5uZXJCb3JkZXIuYm90dG9tIC0gKDIgKiAo
Zm9jdXNXaWR0aCArIGZvY3VzUGFkKSArIGJvcmRlcldpZHRoLnRvcCArIGJvcmRlcldpZHRoLmJv
dHRvbSkpKTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUoY29udGV4dCk7CisKKyAg
ICBjb250ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX0FSUk9XKTsKKyAgICBndGtfc3R5
bGVfY29udGV4dF9zYXZlKGNvbnRleHQpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X2Rp
cmVjdGlvbihjb250ZXh0LCBkaXJlY3Rpb24pOworICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9j
bGFzcyhjb250ZXh0LCAiYXJyb3ciKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3Mo
Y29udGV4dCwgR1RLX1NUWUxFX0NMQVNTX0JVVFRPTik7CisKKyAgICBnZmxvYXQgYXJyb3dTY2Fs
aW5nOworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShjb250ZXh0LCAiYXJyb3ctc2Nh
bGluZyIsICZhcnJvd1NjYWxpbmcsIDApOworCisgICAgaWYgKGRpcmVjdGlvbiA9PSBHVEtfVEVY
VF9ESVJfTFRSKQorICAgICAgICBjb21ib1JlY3Quc2V0WChjb21ib1JlY3QueCgpICsgY29tYm9S
ZWN0LndpZHRoKCkgLSBtaW5BcnJvd1NpemUpOworICAgIGNvbWJvUmVjdC5zZXRXaWR0aChtaW5B
cnJvd1NpemUpOworCisgICAgSW50UmVjdCBpbm5lclJlY3QgPSBjb21ib1JlY3Q7CisKKyAgICBn
aW50IGV4dGVudCA9IG1pbihjb21ib1JlY3Qud2lkdGgoKSwgY29tYm9SZWN0LmhlaWdodCgpKSAq
IGFycm93U2NhbGluZzsKKyAgICBnZmxvYXQgeGFsaWduID0gMC41OworICAgIGdmbG9hdCB5YWxp
Z24gPSAwLjU7CisgICAgaWYgKGRpcmVjdGlvbiAhPSBHVEtfVEVYVF9ESVJfTFRSKQorICAgICAg
ICB4YWxpZ24gPSAxLjAgLSB4YWxpZ247CisgICAgaW5uZXJSZWN0LnNldFgoZmxvb3IoY29tYm9S
ZWN0LngoKSArIChjb21ib1JlY3Qud2lkdGgoKSAtIGV4dGVudCkgKiB4YWxpZ24pKTsKKyAgICBp
bm5lclJlY3Quc2V0WShmbG9vcihjb21ib1JlY3QueSgpICsgKGNvbWJvUmVjdC5oZWlnaHQoKSAt
IGV4dGVudCkgKiB5YWxpZ24pKTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3NldF9zdGF0ZShj
b250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPihmbGFncykpOworICAgIGd0a19yZW5k
ZXJfYXJyb3coY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCBH
X1BJLCBpbm5lclJlY3QueCgpLCBpbm5lclJlY3QueSgpLCBleHRlbnQpOworCisgICAgZ3RrX3N0
eWxlX2NvbnRleHRfcmVzdG9yZShjb250ZXh0KTsKKworICAgIGNvbnRleHQgPSBnZXRTdHlsZUNv
bnRleHQoR1RLX1RZUEVfU0VQQVJBVE9SKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKGNv
bnRleHQpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X2RpcmVjdGlvbihjb250ZXh0LCBk
aXJlY3Rpb24pOworICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCAic2Vw
YXJhdG9yIik7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19T
VFlMRV9DTEFTU19CVVRUT04pOworCisgICAgZ2Jvb2xlYW4gd2lkZVNlcGFyYXRvcnM7CisgICAg
Z2ludCBzZXBhcmF0b3JXaWR0aDsKKyAgICBndGtfc3R5bGVfY29udGV4dF9nZXRfc3R5bGUoY29u
dGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpZGUtc2VwYXJhdG9ycyIs
ICZ3aWRlU2VwYXJhdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlcGFy
YXRvci13aWR0aCIsICZzZXBhcmF0b3JXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgMCk7CisgICAgaWYgKCFzZXBhcmF0b3JXaWR0aCkgeworICAgICAgICBndGtfc3R5bGVf
Y29udGV4dF9yZXN0b3JlKGNvbnRleHQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0YXRlKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0
a1N0YXRlRmxhZ3M+KGZsYWdzKSk7CisKKyAgICBpZiAod2lkZVNlcGFyYXRvcnMpIHsKKyAgICAg
ICAgaWYgKGRpcmVjdGlvbiA9PSBHVEtfVEVYVF9ESVJfTFRSKQorICAgICAgICAgICAgaW5uZXJS
ZWN0LnNldFgoaW5uZXJSZWN0LngoKSAtIHNlcGFyYXRvcldpZHRoKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgaW5uZXJSZWN0LnNldFgoaW5uZXJSZWN0LngoKSArIGlubmVyUmVjdC53aWR0
aCgpKTsKKworICAgICAgICBndGtfcmVuZGVyX2JhY2tncm91bmQoY29udGV4dCwgcGFpbnRJbmZv
LmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaW5uZXJSZWN0LngoKSwgaW5uZXJSZWN0LnkoKSwgc2VwYXJhdG9yV2lkdGgsIGlubmVyUmVj
dC5oZWlnaHQoKSk7CisgICAgICAgIGd0a19yZW5kZXJfZnJhbWUoY29udGV4dCwgcGFpbnRJbmZv
LmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlu
bmVyUmVjdC54KCksIGlubmVyUmVjdC55KCksIHNlcGFyYXRvcldpZHRoLCBpbm5lclJlY3QuaGVp
Z2h0KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9ib3Jk
ZXIoY29udGV4dCwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oZmxhZ3MpLCAmYm9yZGVyV2lk
dGgpOworICAgICAgICBpZiAoZGlyZWN0aW9uID09IEdUS19URVhUX0RJUl9MVFIpCisgICAgICAg
ICAgICBpbm5lclJlY3Quc2V0WChpbm5lclJlY3QueCgpIC0gYm9yZGVyV2lkdGgubGVmdCk7Cisg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlubmVyUmVjdC5zZXRYKGlubmVyUmVjdC54KCkgKyBp
bm5lclJlY3Qud2lkdGgoKSk7CisKKyAgICAgICAgZ3RrX3JlbmRlcl9saW5lKGNvbnRleHQsIHBh
aW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGlubmVyUmVjdC54KCksIGNvbWJvUmVjdC55KCksIGlubmVyUmVjdC54KCksIGNvbWJvUmVj
dC5ib3R0b20oKSk7CisgICAgfQorCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShjb250
ZXh0KTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6c2V0
VGV4dElucHV0Qm9yZGVycyhSZW5kZXJTdHlsZSogc3R5bGUpCit7CisgICAgLy8gSWYgdGhpcyBj
b250cm9sIGlzbid0IGRyYXduIHVzaW5nIHRoZSBuYXRpdmUgdGhlbWUsIHdlIGRvbid0IHRvdWNo
IHRoZSBib3JkZXJzLgorICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE5vQ29udHJvbFBh
cnQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFdlIGNhbm5vdCBnaXZlIGEgcHJvcGVyIHJl
bmRlcmluZyB3aGVuIGJvcmRlciByYWRpdXMgaXMgYWN0aXZlLCB1bmZvcnR1bmF0ZWx5LgorICAg
IHN0eWxlLT5yZXNldEJvcmRlclJhZGl1cygpOworCisgICAgR3RrU3R5bGVDb250ZXh0KiBjb250
ZXh0ID0gZ2V0U3R5bGVDb250ZXh0KEdUS19UWVBFX0VOVFJZKTsKKworICAgIGd0a19zdHlsZV9j
b250ZXh0X3NhdmUoY29udGV4dCk7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X2RpcmVjdGlv
bihjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtUZXh0RGlyZWN0aW9uPihSZW5kZXJUaGVtZUd0azo6
Z3RrVGV4dERpcmVjdGlvbihzdHlsZS0+ZGlyZWN0aW9uKCkpKSk7CisgICAgZ3RrX3N0eWxlX2Nv
bnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19FTlRSWSk7CisKKyAgICBH
dGtCb3JkZXIgYm9yZGVyV2lkdGg7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X2JvcmRlcihj
b250ZXh0LCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPigwKSwgJmJvcmRlcldpZHRoKTsKKwor
ICAgIHN0eWxlLT5zZXRCb3JkZXJMZWZ0V2lkdGgoYm9yZGVyV2lkdGgubGVmdCk7CisgICAgc3R5
bGUtPnNldEJvcmRlclRvcFdpZHRoKGJvcmRlcldpZHRoLnRvcCk7CisgICAgc3R5bGUtPnNldEJv
cmRlclJpZ2h0V2lkdGgoYm9yZGVyV2lkdGgucmlnaHQpOworICAgIHN0eWxlLT5zZXRCb3JkZXJC
b3R0b21XaWR0aChib3JkZXJXaWR0aC5ib3R0b20pOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRf
cmVzdG9yZShjb250ZXh0KTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRUZXh0Rmll
bGQoUmVuZGVyT2JqZWN0KiByZW5kZXJPYmplY3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZv
LCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIGlmIChwYWludEluZm8uY29udGV4dC0+cGFp
bnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBHdGtTdHlsZUNv
bnRleHQqIGNvbnRleHQgPSBnZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfRU5UUlkpOworICAgIGd0
a19zdHlsZV9jb250ZXh0X3NhdmUoY29udGV4dCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9z
ZXRfZGlyZWN0aW9uKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rpb24+KGd0a1Rl
eHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpKTsKKyAgICBn
dGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MoY29udGV4dCwgR1RLX1NUWUxFX0NMQVNTX0VOVFJZ
KTsKKworICAgIEludFJlY3QgdGV4dFJlY3QgPSByZWN0OworCisgICAgZ2Jvb2xlYW4gaW50ZXJp
b3JGb2N1czsKKyAgICBnaW50IGZvY3VzV2lkdGg7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0
X3N0eWxlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb2N1cy1s
aW5lLXdpZHRoIiwgJmZvY3VzV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICJpbnRlcmlvci1mb2N1cyIsICZpbnRlcmlvckZvY3VzLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAwKTsKKyAgICBpZiAoIWludGVyaW9yRm9jdXMgJiYgaXNGb2N1c2VkKHJlbmRl
ck9iamVjdCkpCisgICAgICAgIHRleHRSZWN0LmluZmxhdGUoLWZvY3VzV2lkdGgpOworCisgICAg
Z3VpbnQgZmxhZ3MgPSAwOworICAgIGlmICghaXNFbmFibGVkKHJlbmRlck9iamVjdCkgfHwgaXNS
ZWFkT25seUNvbnRyb2wocmVuZGVyT2JqZWN0KSkKKyAgICAgICAgZmxhZ3MgfD0gR1RLX1NUQVRF
X0ZMQUdfSU5TRU5TSVRJVkU7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0YXRlKGNvbnRl
eHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSk7CisKKyAgICBndGtfcmVuZGVy
X2JhY2tncm91bmQoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgp
LCB0ZXh0UmVjdC54KCksIHRleHRSZWN0LnkoKSwgdGV4dFJlY3Qud2lkdGgoKSwgdGV4dFJlY3Qu
aGVpZ2h0KCkpOworICAgIGd0a19yZW5kZXJfZnJhbWUoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRl
eHQtPnBsYXRmb3JtQ29udGV4dCgpLCB0ZXh0UmVjdC54KCksIHRleHRSZWN0LnkoKSwgdGV4dFJl
Y3Qud2lkdGgoKSwgdGV4dFJlY3QuaGVpZ2h0KCkpOworCisgICAgaWYgKCFpbnRlcmlvckZvY3Vz
ICYmIGlzRm9jdXNlZChyZW5kZXJPYmplY3QpICYmIGlzRW5hYmxlZChyZW5kZXJPYmplY3QpKQor
ICAgICAgICBndGtfcmVuZGVyX2ZvY3VzKGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5wbGF0
Zm9ybUNvbnRleHQoKSwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVp
Z2h0KCkpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShjb250ZXh0KTsKKworICAg
IHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUd0azo6cGFpbnRTbGlkZXJUcmFj
ayhSZW5kZXJPYmplY3QqIHJlbmRlck9iamVjdCwgY29uc3QgUGFpbnRJbmZvJiBwYWludEluZm8s
IGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHBhaW50SW5mby5jb250ZXh0LT5wYWlu
dGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIENvbnRyb2xQYXJ0
IHBhcnQgPSByZW5kZXJPYmplY3QtPnN0eWxlKCktPmFwcGVhcmFuY2UoKTsKKyAgICBBU1NFUlQo
cGFydCA9PSBTbGlkZXJIb3Jpem9udGFsUGFydCB8fCBwYXJ0ID09IFNsaWRlclZlcnRpY2FsUGFy
dCk7CisKKyAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQgPSBnZXRTdHlsZUNvbnRleHQocGFy
dCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0ID8gR1RLX1RZUEVfSFNDQUxFIDogR1RLX1RZ
UEVfVlNDQUxFKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKGNvbnRleHQpOworCisgICAg
Z3RrX3N0eWxlX2NvbnRleHRfc2V0X2RpcmVjdGlvbihjb250ZXh0LCBzdGF0aWNfY2FzdDxHdGtU
ZXh0RGlyZWN0aW9uPihndGtUZXh0RGlyZWN0aW9uKHJlbmRlck9iamVjdC0+c3R5bGUoKS0+ZGly
ZWN0aW9uKCkpKSk7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsICJz
Y2FsZSIpOworICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhjb250ZXh0LCBHVEtfU1RZ
TEVfQ0xBU1NfU0xJREVSKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MoY29udGV4
dCwgR1RLX1NUWUxFX0NMQVNTX1RST1VHSCk7CisKKyAgICBHdGtCb3JkZXIgYm9yZGVyV2lkdGg7
CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X2JvcmRlcihjb250ZXh0LCBzdGF0aWNfY2FzdDxH
dGtTdGF0ZUZsYWdzPigwKSwgJmJvcmRlcldpZHRoKTsKKworICAgIEludFJlY3Qgc2xpZGVyUmVj
dCA9IHJlY3Q7CisKKyAgICBpZiAocGFydCA9PSBTbGlkZXJIb3Jpem9udGFsUGFydCkgeworICAg
ICAgICBzbGlkZXJSZWN0Lm1vdmUoYm9yZGVyV2lkdGgubGVmdCwgMSk7CisgICAgICAgIHNsaWRl
clJlY3Quc2V0V2lkdGgoc2xpZGVyUmVjdC53aWR0aCgpIC0gKGJvcmRlcldpZHRoLmxlZnQgKyBi
b3JkZXJXaWR0aC5yaWdodCkpOworICAgICAgICBzbGlkZXJSZWN0LnNldEhlaWdodChzbGlkZXJS
ZWN0LmhlaWdodCgpIC0gMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2xpZGVyUmVjdC5tb3Zl
KDEsIGJvcmRlcldpZHRoLnRvcCk7CisgICAgICAgIHNsaWRlclJlY3Quc2V0V2lkdGgoc2xpZGVy
UmVjdC53aWR0aCgpIC0gMik7CisgICAgICAgIHNsaWRlclJlY3Quc2V0SGVpZ2h0KHNsaWRlclJl
Y3QuaGVpZ2h0KCkgLSAoYm9yZGVyV2lkdGgudG9wICsgYm9yZGVyV2lkdGguYm90dG9tKSk7Cisg
ICAgfQorCisgICAgZ3VpbnQgZmxhZ3MgPSAwOworICAgIGlmICghaXNFbmFibGVkKHJlbmRlck9i
amVjdCkgfHwgaXNSZWFkT25seUNvbnRyb2wocmVuZGVyT2JqZWN0KSkKKyAgICAgICAgZmxhZ3Mg
fD0gR1RLX1NUQVRFX0ZMQUdfSU5TRU5TSVRJVkU7CisgICAgZWxzZSBpZiAoaXNQcmVzc2VkKHJl
bmRlck9iamVjdCkpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX0FDVElWRTsKKyAg
ICBlbHNlIGlmIChpc0hvdmVyZWQocmVuZGVyT2JqZWN0KSkKKyAgICAgICAgZmxhZ3MgfD0gR1RL
X1NUQVRFX0ZMQUdfUFJFTElHSFQ7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfc2V0X3N0YXRlKGNv
bnRleHQsIHN0YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KGZsYWdzKSk7CisKKyAgICBndGtfcmVu
ZGVyX2JhY2tncm91bmQoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4
dCgpLCBzbGlkZXJSZWN0LngoKSwgc2xpZGVyUmVjdC55KCksIHNsaWRlclJlY3Qud2lkdGgoKSwg
c2xpZGVyUmVjdC5oZWlnaHQoKSk7CisgICAgZ3RrX3JlbmRlcl9mcmFtZShjb250ZXh0LCBwYWlu
dEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHNsaWRlclJlY3QueCgpLCBzbGlkZXJS
ZWN0LnkoKSwgc2xpZGVyUmVjdC53aWR0aCgpLCBzbGlkZXJSZWN0LmhlaWdodCgpKTsKKworICAg
IGlmIChpc0ZvY3VzZWQocmVuZGVyT2JqZWN0KSkKKyAgICAgICAgZ3RrX3JlbmRlcl9mb2N1cyhj
b250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHJlY3QueCgpLCBy
ZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKworICAgIGd0a19zdHlsZV9j
b250ZXh0X3Jlc3RvcmUoY29udGV4dCk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wg
UmVuZGVyVGhlbWVHdGs6OnBhaW50U2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiByZW5kZXJPYmpl
Y3QsIGNvbnN0IFBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByZWN0KQorewor
ICAgIGlmIChwYWludEluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBDb250cm9sUGFydCBwYXJ0ID0gcmVuZGVyT2JqZWN0LT5zdHls
ZSgpLT5hcHBlYXJhbmNlKCk7CisgICAgQVNTRVJUKHBhcnQgPT0gU2xpZGVyVGh1bWJIb3Jpem9u
dGFsUGFydCB8fCBwYXJ0ID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KTsKKworICAgIEd0a1N0
eWxlQ29udGV4dCogY29udGV4dCA9IGdldFN0eWxlQ29udGV4dChwYXJ0ID09IFNsaWRlclRodW1i
SG9yaXpvbnRhbFBhcnQgPyBHVEtfVFlQRV9IU0NBTEUgOiBHVEtfVFlQRV9WU0NBTEUpOworICAg
IGd0a19zdHlsZV9jb250ZXh0X3NhdmUoY29udGV4dCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4
dF9zZXRfZGlyZWN0aW9uKGNvbnRleHQsIHN0YXRpY19jYXN0PEd0a1RleHREaXJlY3Rpb24+KGd0
a1RleHREaXJlY3Rpb24ocmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5kaXJlY3Rpb24oKSkpKTsKKyAg
ICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MoY29udGV4dCwgInNjYWxlIik7CisgICAgZ3Rr
X3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19TTElERVIp
OworCisgICAgZ2ludCBzbGlkZXJXaWR0aCwgc2xpZGVyTGVuZ3RoOworICAgIGd0a19zdHlsZV9j
b250ZXh0X2dldF9zdHlsZShjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAic2xpZGVyLXdpZHRoIiwgJnNsaWRlcldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAic2xpZGVyLWxlbmd0aCIsICZzbGlkZXJMZW5ndGgsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIDApOworCisgICAgSW50UmVjdCBzbGlkZXJSZWN0ID0gcmVjdDsKKyAg
ICBpZiAocGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0KSB7CisgICAgICAgIHNsaWRl
clJlY3Quc2V0WShyZWN0LnkoKSArIChyZWN0LmhlaWdodCgpIC0gc2xpZGVyTGVuZ3RoKSAvIDIp
OworICAgICAgICBzbGlkZXJSZWN0LnNldFdpZHRoKHNsaWRlcldpZHRoKTsKKyAgICAgICAgc2xp
ZGVyUmVjdC5zZXRIZWlnaHQoc2xpZGVyTGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBz
bGlkZXJSZWN0LnNldFgocmVjdC54KCkgKyAocmVjdC53aWR0aCgpIC0gc2xpZGVyTGVuZ3RoKSAv
IDIpOworICAgICAgICBzbGlkZXJSZWN0LnNldFdpZHRoKHNsaWRlckxlbmd0aCk7CisgICAgICAg
IHNsaWRlclJlY3Quc2V0SGVpZ2h0KHNsaWRlcldpZHRoKTsKKyAgICB9CisKKyAgICBndWludCBm
bGFncyA9IDA7CisgICAgaWYgKCFpc0VuYWJsZWQocmVuZGVyT2JqZWN0KSB8fCBpc1JlYWRPbmx5
Q29udHJvbChyZW5kZXJPYmplY3QpKQorICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19J
TlNFTlNJVElWRTsKKyAgICBlbHNlIGlmIChpc1ByZXNzZWQocmVuZGVyT2JqZWN0KSkKKyAgICAg
ICAgZmxhZ3MgfD0gR1RLX1NUQVRFX0ZMQUdfQUNUSVZFOworICAgIGVsc2UgaWYgKGlzSG92ZXJl
ZChyZW5kZXJPYmplY3QpKQorICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19QUkVMSUdI
VDsKKyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfc3RhdGUoY29udGV4dCwgc3RhdGljX2Nhc3Q8
R3RrU3RhdGVGbGFncz4oZmxhZ3MpKTsKKworICAgIGd0a19yZW5kZXJfc2xpZGVyKGNvbnRleHQs
IHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgc2xpZGVyUmVjdC54KCksIHNs
aWRlclJlY3QueSgpLCBzbGlkZXJSZWN0LndpZHRoKCksIHNsaWRlclJlY3QuaGVpZ2h0KCksCisg
ICAgICAgICAgICAgICAgICAgICAgcGFydCA9PSBTbGlkZXJUaHVtYkhvcml6b250YWxQYXJ0ID8g
R1RLX09SSUVOVEFUSU9OX0hPUklaT05UQUwgOiBHVEtfT1JJRU5UQVRJT05fVkVSVElDQUwpOwor
CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShjb250ZXh0KTsKKworICAgIHJldHVybiBm
YWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUd0azo6YWRqdXN0U2xpZGVyVGh1bWJTaXplKFJl
bmRlck9iamVjdCogcmVuZGVyT2JqZWN0KSBjb25zdAoreworICAgIENvbnRyb2xQYXJ0IHBhcnQg
PSByZW5kZXJPYmplY3QtPnN0eWxlKCktPmFwcGVhcmFuY2UoKTsKKyAgICBzd2l0Y2ggKHBhcnQp
IHsKKyAgICBjYXNlIE1lZGlhU2xpZGVyVGh1bWJQYXJ0OgorI2lmIEVOQUJMRShWSURFTykKKyAg
ICAgICAgaWYgKHBhcnQgPT0gTWVkaWFTbGlkZXJUaHVtYlBhcnQpIHsKKyAgICAgICAgICAgIHJl
bmRlck9iamVjdC0+c3R5bGUoKS0+c2V0V2lkdGgoTGVuZ3RoKG1fbWVkaWFTbGlkZXJUaHVtYldp
ZHRoLCBGaXhlZCkpOworICAgICAgICAgICAgcmVuZGVyT2JqZWN0LT5zdHlsZSgpLT5zZXRIZWln
aHQoTGVuZ3RoKG1fbWVkaWFTbGlkZXJUaHVtYkhlaWdodCwgRml4ZWQpKTsKKyAgICAgICAgfQor
I2VuZGlmCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2xpZGVyVGh1bWJIb3Jpem9udGFsUGFy
dDoKKyAgICBjYXNlIFNsaWRlclRodW1iVmVydGljYWxQYXJ0OiB7CisgICAgICAgIEd0a1N0eWxl
Q29udGV4dCogY29udGV4dCA9IGdldFN0eWxlQ29udGV4dChwYXJ0ID09IFNsaWRlclRodW1iSG9y
aXpvbnRhbFBhcnQgPyBHVEtfVFlQRV9IU0NBTEUgOiBHVEtfVFlQRV9WU0NBTEUpOworCisgICAg
ICAgIGdpbnQgc2xpZGVyV2lkdGgsIHNsaWRlckxlbmd0aDsKKyAgICAgICAgZ3RrX3N0eWxlX2Nv
bnRleHRfZ2V0X3N0eWxlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAic2xpZGVyLXdpZHRoIiwgJnNsaWRlcldpZHRoLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgInNsaWRlci1sZW5ndGgiLCAmc2xpZGVyTGVuZ3RoLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIHJlbmRlck9iamVjdC0+c3R5
bGUoKS0+c2V0V2lkdGgoTGVuZ3RoKHNsaWRlcldpZHRoLCBGaXhlZCkpOworICAgICAgICByZW5k
ZXJPYmplY3QtPnN0eWxlKCktPnNldEhlaWdodChMZW5ndGgoc2xpZGVyTGVuZ3RoLCBGaXhlZCkp
OworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorfQorCitzdGF0aWMgQ29sb3IgZ2V0U3R5bGVDb2xvcihHVHlwZSBnVHlwZSwgYm9vbCBi
YWNrZ3JvdW5kLCBHdGtTdGF0ZUZsYWdzIGZsYWdzKQoreworICAgIEd0a1N0eWxlQ29udGV4dCog
Y29udGV4dCA9IGdldFN0eWxlQ29udGV4dChnVHlwZSk7CisgICAgR2RrUkdCQSBnZGtSR0JBQ29s
b3I7CisgICAgR2RrQ29sb3IgZ2RrQ29sb3I7CisKKyAgICBpZiAoYmFja2dyb3VuZCkKKyAgICAg
ICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X2JhY2tncm91bmRfY29sb3IoY29udGV4dCwgZmxhZ3Ms
ICZnZGtSR0JBQ29sb3IpOworICAgIGVsc2UKKyAgICAgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0
X2NvbG9yKGNvbnRleHQsIGZsYWdzLCAmZ2RrUkdCQUNvbG9yKTsKKworICAgIGdka0NvbG9yLnBp
eGVsID0gMDsKKyAgICBnZGtDb2xvci5yZWQgPSAoZ3VpbnQxNikgKGdka1JHQkFDb2xvci5yZWQg
KiA2NTUzNSk7CisgICAgZ2RrQ29sb3IuZ3JlZW4gPSAoZ3VpbnQxNikgKGdka1JHQkFDb2xvci5n
cmVlbiAqIDY1NTM1KTsKKyAgICBnZGtDb2xvci5ibHVlID0gKGd1aW50MTYpIChnZGtSR0JBQ29s
b3IuYmx1ZSAqIDY1NTM1KTsKKworICAgIHJldHVybiBnZGtDb2xvcjsKK30KKworI2lmIEVOQUJM
RShWSURFTykKK3ZvaWQgUmVuZGVyVGhlbWVHdGs6OmluaXRNZWRpYUNvbG9ycygpCit7CisgICAg
bV9wYW5lbENvbG9yID0gZ2V0U3R5bGVDb2xvcihHVEtfVFlQRV9DT05UQUlORVIsIHRydWUsIHN0
YXRpY19jYXN0PEd0a1N0YXRlRmxhZ3M+KDApKTsKKyAgICBtX3NsaWRlckNvbG9yID0gZ2V0U3R5
bGVDb2xvcihHVEtfVFlQRV9DT05UQUlORVIsIHRydWUsIEdUS19TVEFURV9GTEFHX0FDVElWRSk7
CisgICAgbV9zbGlkZXJUaHVtYkNvbG9yID0gZ2V0U3R5bGVDb2xvcihHVEtfVFlQRV9DT05UQUlO
RVIsIHRydWUsIEdUS19TVEFURV9GTEFHX1NFTEVDVEVEKTsKK30KKyNlbmRpZgorCitDb2xvciBS
ZW5kZXJUaGVtZUd0azo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBj
b25zdAoreworICAgIHJldHVybiBnZXRTdHlsZUNvbG9yKEdUS19UWVBFX0VOVFJZLCB0cnVlLCBH
VEtfU1RBVEVfRkxBR19TRUxFQ1RFRCk7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjpwbGF0
Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gZ2V0U3R5bGVDb2xvcihHVEtfVFlQRV9FTlRSWSwgdHJ1ZSwgR1RLX1NUQVRFX0ZMQUdfQUNU
SVZFKTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9u
Rm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0U3R5bGVDb2xvcihHVEtf
VFlQRV9FTlRSWSwgZmFsc2UsIEdUS19TVEFURV9GTEFHX1NFTEVDVEVEKTsKK30KKworQ29sb3Ig
UmVuZGVyVGhlbWVHdGs6OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3Io
KSBjb25zdAoreworICAgIHJldHVybiBnZXRTdHlsZUNvbG9yKEdUS19UWVBFX0VOVFJZLCBmYWxz
ZSwgR1RLX1NUQVRFX0ZMQUdfQUNUSVZFKTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVHdGs6OmFj
dGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIHJldHVy
biBnZXRTdHlsZUNvbG9yKEdUS19UWVBFX1RSRUVfVklFVywgdHJ1ZSwgR1RLX1NUQVRFX0ZMQUdf
U0VMRUNURUQpOworfQorCitDb2xvciBSZW5kZXJUaGVtZUd0azo6aW5hY3RpdmVMaXN0Qm94U2Vs
ZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0U3R5bGVDb2xv
cihHVEtfVFlQRV9UUkVFX1ZJRVcsIHRydWUsIEdUS19TVEFURV9GTEFHX0FDVElWRSk7Cit9CisK
K0NvbG9yIFJlbmRlclRoZW1lR3RrOjphY3RpdmVMaXN0Qm94U2VsZWN0aW9uRm9yZWdyb3VuZENv
bG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0U3R5bGVDb2xvcihHVEtfVFlQRV9UUkVFX1ZJ
RVcsIGZhbHNlLCBHVEtfU1RBVEVfRkxBR19TRUxFQ1RFRCk7Cit9CisKK0NvbG9yIFJlbmRlclRo
ZW1lR3RrOjppbmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAor
eworICAgIHJldHVybiBnZXRTdHlsZUNvbG9yKEdUS19UWVBFX1RSRUVfVklFVywgZmFsc2UsIEdU
S19TVEFURV9GTEFHX0FDVElWRSk7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lR3RrOjpzeXN0ZW1D
b2xvcihpbnQgY3NzVmFsdWVJZCkgY29uc3QKK3sKKyAgICBzd2l0Y2ggKGNzc1ZhbHVlSWQpIHsK
KyAgICBjYXNlIENTU1ZhbHVlQnV0dG9udGV4dDoKKyAgICAgICAgcmV0dXJuIGdldFN0eWxlQ29s
b3IoR1RLX1RZUEVfQlVUVE9OLCBmYWxzZSwgc3RhdGljX2Nhc3Q8R3RrU3RhdGVGbGFncz4oMCkp
OworICAgIGNhc2UgQ1NTVmFsdWVDYXB0aW9udGV4dDoKKyAgICAgICAgcmV0dXJuIGdldFN0eWxl
Q29sb3IoR1RLX1RZUEVfRU5UUlksIGZhbHNlLCBzdGF0aWNfY2FzdDxHdGtTdGF0ZUZsYWdzPigw
KSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFJlbmRlclRoZW1lOjpzeXN0ZW1Db2xv
cihjc3NWYWx1ZUlkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlbmRlclRoZW1lOjpzeXN0ZW1Db2xv
cihjc3NWYWx1ZUlkKTsKK30KKworI2lmIEVOQUJMRShQUk9HUkVTU19UQUcpCitzdGF0aWMgY29u
c3QgaW50IHByb2dyZXNzQWN0aXZpdHlCbG9ja3MgPSA1Oworc3RhdGljIGNvbnN0IGludCBwcm9n
cmVzc0FuaW1hdGlvbkZyYW1lcyA9IDEwOworc3RhdGljIGNvbnN0IGRvdWJsZSBwcm9ncmVzc0Fu
aW1hdGlvbkludGVydmFsID0gMC4xMjU7Citkb3VibGUgUmVuZGVyVGhlbWVHdGs6OmFuaW1hdGlv
blJlcGVhdEludGVydmFsRm9yUHJvZ3Jlc3NCYXIoUmVuZGVyUHJvZ3Jlc3MqKSBjb25zdAorewor
ICAgIHJldHVybiBwcm9ncmVzc0FuaW1hdGlvbkludGVydmFsOworfQorCitkb3VibGUgUmVuZGVy
VGhlbWVHdGs6OmFuaW1hdGlvbkR1cmF0aW9uRm9yUHJvZ3Jlc3NCYXIoUmVuZGVyUHJvZ3Jlc3Mq
KSBjb25zdAoreworICAgIHJldHVybiBwcm9ncmVzc0FuaW1hdGlvbkludGVydmFsICogcHJvZ3Jl
c3NBbmltYXRpb25GcmFtZXMgKiAyOyAvLyAiMiIgZm9yIGJhY2sgYW5kIGZvcnRoOworfQorCiti
b29sIFJlbmRlclRoZW1lR3RrOjpwYWludFByb2dyZXNzQmFyKFJlbmRlck9iamVjdCogcmVuZGVy
T2JqZWN0LCBjb25zdCBQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcmVjdCkK
K3sKKyAgICBpZiAocGFpbnRJbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKCFyZW5kZXJPYmplY3QtPmlzUHJvZ3Jlc3MoKSkK
KyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBHdGtTdHlsZUNvbnRleHQqIGNvbnRleHQgPSBn
ZXRTdHlsZUNvbnRleHQoR1RLX1RZUEVfUFJPR1JFU1NfQkFSKTsKKyAgICBndGtfc3R5bGVfY29u
dGV4dF9zYXZlKGNvbnRleHQpOworCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfYWRkX2NsYXNzKGNv
bnRleHQsIEdUS19TVFlMRV9DTEFTU19QUk9HUkVTU0JBUik7CisgICAgZ3RrX3N0eWxlX2NvbnRl
eHRfYWRkX2NsYXNzKGNvbnRleHQsIEdUS19TVFlMRV9DTEFTU19UUk9VR0gpOworICAgIGd0a19z
dHlsZV9jb250ZXh0X3NldF9zdGF0ZShjb250ZXh0LCBHVEtfU1RBVEVfRkxBR19BQ1RJVkUpOwor
CisgICAgZ3RrX3JlbmRlcl9iYWNrZ3JvdW5kKGNvbnRleHQsIHBhaW50SW5mby5jb250ZXh0LT5w
bGF0Zm9ybUNvbnRleHQoKSwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3Qu
aGVpZ2h0KCkpOworICAgIGd0a19yZW5kZXJfZnJhbWUoY29udGV4dCwgcGFpbnRJbmZvLmNvbnRl
eHQtPnBsYXRmb3JtQ29udGV4dCgpLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwg
cmVjdC5oZWlnaHQoKSk7CisKKyAgICBSZW5kZXJQcm9ncmVzcyogcmVuZGVyUHJvZ3Jlc3MgPSB0
b1JlbmRlclByb2dyZXNzKHJlbmRlck9iamVjdCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9z
ZXRfc3RhdGUoY29udGV4dCwgR1RLX1NUQVRFX0ZMQUdfUFJFTElHSFQpOworCisgICAgR3RrQm9y
ZGVyIGJvcmRlcldpZHRoOworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9ib3JkZXIoY29udGV4
dCwgR1RLX1NUQVRFX0ZMQUdfUFJFTElHSFQsICZib3JkZXJXaWR0aCk7CisKKyAgICBJbnRSZWN0
IHByb2dyZXNzUmVjdChyZWN0LngoKSArIGJvcmRlcldpZHRoLmxlZnQsIHJlY3QueSgpICsgYm9y
ZGVyV2lkdGgudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Qud2lkdGgoKSAtIChi
b3JkZXJXaWR0aC5sZWZ0ICsgYm9yZGVyV2lkdGgucmlnaHQpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgIHJlY3QuaGVpZ2h0KCkgLSAoYm9yZGVyV2lkdGgudG9wICsgYm9yZGVyV2lkdGguYm90
dG9tKSk7CisKKyAgICBpZiAocmVuZGVyUHJvZ3Jlc3MtPmlzRGV0ZXJtaW5hdGUoKSkgeworICAg
ICAgICBwcm9ncmVzc1JlY3Quc2V0V2lkdGgocHJvZ3Jlc3NSZWN0LndpZHRoKCkgKiByZW5kZXJQ
cm9ncmVzcy0+cG9zaXRpb24oKSk7CisgICAgICAgIGlmIChyZW5kZXJPYmplY3QtPnN0eWxlKCkt
PmRpcmVjdGlvbigpID09IFJUTCkKKyAgICAgICAgICAgIHByb2dyZXNzUmVjdC5zZXRYKHJlY3Qu
d2lkdGgoKSAtIHByb2dyZXNzUmVjdC53aWR0aCgpIC0gcHJvZ3Jlc3NSZWN0LngoKSk7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgZG91YmxlIHByb2dyZXNzID0gcmVuZGVyUHJvZ3Jlc3MtPmFuaW1h
dGlvblByb2dyZXNzKCk7CisKKyAgICAgICAgcHJvZ3Jlc3NSZWN0LnNldFdpZHRoKG1heCgyLCBw
cm9ncmVzc1JlY3Qud2lkdGgoKSAvIHByb2dyZXNzQWN0aXZpdHlCbG9ja3MpKTsKKyAgICAgICAg
aW50IG1vdmFibGVXaWR0aCA9IHJlY3Qud2lkdGgoKSAtIHByb2dyZXNzUmVjdC53aWR0aCgpOwor
ICAgICAgICBpZiAocHJvZ3Jlc3MgPCAwLjUpCisgICAgICAgICAgICBwcm9ncmVzc1JlY3Quc2V0
WChwcm9ncmVzc1JlY3QueCgpICsgKHByb2dyZXNzICogMiAqIG1vdmFibGVXaWR0aCkpOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBwcm9ncmVzc1JlY3Quc2V0WChwcm9ncmVzc1JlY3QueCgp
ICsgKCgxLjAgLSBwcm9ncmVzcykgKiAyICogbW92YWJsZVdpZHRoKSk7CisgICAgfQorCisgICAg
aWYgKCFwcm9ncmVzc1JlY3QuaXNFbXB0eSgpKSB7CisgICAgICAgIGd0a19yZW5kZXJfYmFja2dy
b3VuZChjb250ZXh0LCBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHByb2dy
ZXNzUmVjdC54KCksIHByb2dyZXNzUmVjdC55KCksIHByb2dyZXNzUmVjdC53aWR0aCgpLCBwcm9n
cmVzc1JlY3QuaGVpZ2h0KCkpOworICAgICAgICBndGtfcmVuZGVyX2ZyYW1lKGNvbnRleHQsIHBh
aW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgcHJvZ3Jlc3NSZWN0LngoKSwgcHJv
Z3Jlc3NSZWN0LnkoKSwgcHJvZ3Jlc3NSZWN0LndpZHRoKCksIHByb2dyZXNzUmVjdC5oZWlnaHQo
KSk7CisgICAgfQorCisgICAgZ3RrX3N0eWxlX2NvbnRleHRfcmVzdG9yZShjb250ZXh0KTsKKwor
ICAgIHJldHVybiBmYWxzZTsKK30KKyNlbmRpZgorCit9CisKKyNlbmRpZiAvLyAhR1RLX0FQSV9W
RVJTSU9OXzIKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1Njcm9sbGJhclRoZW1l
R3RrLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1Njcm9sbGJhclRoZW1lR3RrLmNwcAppbmRl
eCAxMGY3ZTcxLi40YzlmZDY0IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3Jv
bGxiYXJUaGVtZUd0ay5jcHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhl
bWVHdGsuY3BwCkBAIC0zMCwxNCArMzAsMTEgQEAKICNpbmNsdWRlICJSZW5kZXJUaGVtZUd0ay5o
IgogI2luY2x1ZGUgIlNjcm9sbFZpZXcuaCIKICNpbmNsdWRlICJTY3JvbGxiYXIuaCIKLSNpbmNs
dWRlICJXaWRnZXRSZW5kZXJpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiZ3RrZHJhd2luZy5oIgog
I2luY2x1ZGUgPGd0ay9ndGsuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBzdGF0aWMgSGFz
aFNldDxTY3JvbGxiYXIqPiogZ1Njcm9sbGJhcnM7Ci1zdGF0aWMgdm9pZCBndGtTdHlsZVNldENh
bGxiYWNrKEd0a1dpZGdldCosIEd0a1N0eWxlKiwgU2Nyb2xsYmFyVGhlbWVHdGsqKTsKIAogU2Ny
b2xsYmFyVGhlbWUqIFNjcm9sbGJhclRoZW1lOjpuYXRpdmVUaGVtZSgpCiB7CkBAIC00NSwxNyAr
NDIsMTQgQEAgU2Nyb2xsYmFyVGhlbWUqIFNjcm9sbGJhclRoZW1lOjpuYXRpdmVUaGVtZSgpCiAg
ICAgcmV0dXJuICZ0aGVtZTsKIH0KIAotU2Nyb2xsYmFyVGhlbWVHdGs6OlNjcm9sbGJhclRoZW1l
R3RrKCkKK1Njcm9sbGJhclRoZW1lR3RrOjp+U2Nyb2xsYmFyVGhlbWVHdGsoKQogewotICAgIHVw
ZGF0ZVRoZW1lUHJvcGVydGllcygpOwotICAgIGdfc2lnbmFsX2Nvbm5lY3Qoc3RhdGljX2Nhc3Q8
UmVuZGVyVGhlbWVHdGsqPihSZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCkuZ2V0KCkpLT5ndGtT
Y3JvbGxiYXIoKSwKLSAgICAgICAgICJzdHlsZS1zZXQiLCBHX0NBTExCQUNLKGd0a1N0eWxlU2V0
Q2FsbGJhY2spLCB0aGlzKTsKIH0KIAotU2Nyb2xsYmFyVGhlbWVHdGs6On5TY3JvbGxiYXJUaGVt
ZUd0aygpCitjb25zdCBIYXNoU2V0PFNjcm9sbGJhcio+KiBTY3JvbGxiYXJUaGVtZUd0azo6Z2V0
U2Nyb2xsYmFycygpCiB7CisgICAgcmV0dXJuIGdTY3JvbGxiYXJzOwogfQotCiB2b2lkIFNjcm9s
bGJhclRoZW1lR3RrOjpyZWdpc3RlclNjcm9sbGJhcihTY3JvbGxiYXIqIHNjcm9sbGJhcikKIHsK
ICAgICBpZiAoIWdTY3JvbGxiYXJzKQpAQCAtNzIsNDggKzY2LDYgQEAgdm9pZCBTY3JvbGxiYXJU
aGVtZUd0azo6dW5yZWdpc3RlclNjcm9sbGJhcihTY3JvbGxiYXIqIHNjcm9sbGJhcikKICAgICB9
CiB9CiAKLXZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnVwZGF0ZVRoZW1lUHJvcGVydGllcygpCi17
Ci0gICAgTW96R3RrU2Nyb2xsYmFyTWV0cmljcyBtZXRyaWNzOwotICAgIG1vel9ndGtfZ2V0X3Nj
cm9sbGJhcl9tZXRyaWNzKCZtZXRyaWNzKTsKLQotICAgIG1fdGh1bWJGYXRuZXNzID0gbWV0cmlj
cy5zbGlkZXJfd2lkdGg7Ci0gICAgbV90cm91Z2hCb3JkZXJXaWR0aCA9IG1ldHJpY3MudHJvdWdo
X2JvcmRlcjsKLSAgICBtX3N0ZXBwZXJTaXplID0gbWV0cmljcy5zdGVwcGVyX3NpemU7Ci0gICAg
bV9zdGVwcGVyU3BhY2luZyA9IG1ldHJpY3Muc3RlcHBlcl9zcGFjaW5nOwotICAgIG1fbWluVGh1
bWJMZW5ndGggPSBtZXRyaWNzLm1pbl9zbGlkZXJfc2l6ZTsKLSAgICBtX3Ryb3VnaFVuZGVyU3Rl
cHBlcnMgPSBtZXRyaWNzLnRyb3VnaF91bmRlcl9zdGVwcGVyczsKLSAgICBtX2hhc0ZvcndhcmRC
dXR0b25TdGFydFBhcnQgPSBtZXRyaWNzLmhhc19zZWNvbmRhcnlfZm9yd2FyZF9zdGVwcGVyOwot
ICAgIG1faGFzQmFja0J1dHRvbkVuZFBhcnQgPSBtZXRyaWNzLmhhc19zZWNvbmRhcnlfYmFja3dh
cmRfc3RlcHBlcjsKLQotICAgIGlmICghZ1Njcm9sbGJhcnMpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIC8vIFVwZGF0ZSB0aGUgdGhpY2tuZXNzIG9mIGV2ZXJ5IGludGVyaW9yIGZyYW1lIHNjcm9s
bGJhciB3aWRnZXQuIFRoZQotICAgIC8vIHBsYXRmb3JtLWluZGVwZW5kZW50IHNjcm9sbGJhciB0
aGVtIGNvZGUgaXNuJ3QgeWV0IHNtYXJ0IGVub3VnaCB0byBnZXQKLSAgICAvLyB0aGlzIGluZm9y
bWF0aW9uIHdoZW4gaXQgcGFpbnRzLgotICAgIEhhc2hTZXQ8U2Nyb2xsYmFyKj46Oml0ZXJhdG9y
IGVuZCA9IGdTY3JvbGxiYXJzLT5lbmQoKTsKLSAgICBmb3IgKEhhc2hTZXQ8U2Nyb2xsYmFyKj46
Oml0ZXJhdG9yIGl0ID0gZ1Njcm9sbGJhcnMtPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewot
ICAgICAgICBTY3JvbGxiYXIqIHNjcm9sbGJhciA9ICgqaXQpOwotCi0gICAgICAgIC8vIFRvcC1s
ZXZlbCBzY3JvbGxiYXIgaS5lLiBzY3JvbGxiYXJzIHdobyBoYXZlIGEgcGFyZW50IFNjcm9sbFZp
ZXcKLSAgICAgICAgLy8gd2l0aCBubyBwYXJlbnQgYXJlIG5hdGl2ZSwgYW5kIHRodXMgZG8gbm90
IG5lZWQgdG8gYmUgcmVzaXplZC4KLSAgICAgICAgaWYgKCFzY3JvbGxiYXItPnBhcmVudCgpIHx8
ICFzY3JvbGxiYXItPnBhcmVudCgpLT5wYXJlbnQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQot
ICAgICAgICBpbnQgdGhpY2tuZXNzID0gc2Nyb2xsYmFyVGhpY2tuZXNzKHNjcm9sbGJhci0+Y29u
dHJvbFNpemUoKSk7Ci0gICAgICAgIGlmIChzY3JvbGxiYXItPm9yaWVudGF0aW9uKCkgPT0gSG9y
aXpvbnRhbFNjcm9sbGJhcikKLSAgICAgICAgICAgIHNjcm9sbGJhci0+c2V0RnJhbWVSZWN0KElu
dFJlY3QoMCwgc2Nyb2xsYmFyLT5wYXJlbnQoKS0+aGVpZ2h0KCkgLSB0aGlja25lc3MsIHNjcm9s
bGJhci0+d2lkdGgoKSwgdGhpY2tuZXNzKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNj
cm9sbGJhci0+c2V0RnJhbWVSZWN0KEludFJlY3Qoc2Nyb2xsYmFyLT5wYXJlbnQoKS0+d2lkdGgo
KSAtIHRoaWNrbmVzcywgMCwgdGhpY2tuZXNzLCBzY3JvbGxiYXItPmhlaWdodCgpKSk7Ci0gICAg
fQotfQotCi1zdGF0aWMgdm9pZCBndGtTdHlsZVNldENhbGxiYWNrKEd0a1dpZGdldCogd2lkZ2V0
LCBHdGtTdHlsZSogcHJldmlvdXMsIFNjcm9sbGJhclRoZW1lR3RrKiBzY3JvbGxiYXJUaGVtZSkK
LXsKLSAgICBzY3JvbGxiYXJUaGVtZS0+dXBkYXRlVGhlbWVQcm9wZXJ0aWVzKCk7Ci19Ci0KIGJv
b2wgU2Nyb2xsYmFyVGhlbWVHdGs6Omhhc1RodW1iKFNjcm9sbGJhciogc2Nyb2xsYmFyKQogewog
ICAgIC8vIFRoaXMgbWV0aG9kIGlzIGp1c3QgY2FsbGVkIGFzIGEgcGFpbnQtdGltZSBvcHRpbWl6
YXRpb24gdG8gc2VlIGlmCkBAIC0xOTksNTQgKzE1MSw2IEBAIEludFJlY3QgU2Nyb2xsYmFyVGhl
bWVHdGs6OnRyYWNrUmVjdChTY3JvbGxiYXIqIHNjcm9sbGJhciwgYm9vbCkKICAgICAgICAgICAg
ICAgICAgICB0aGlja25lc3MsIHNjcm9sbGJhci0+aGVpZ2h0KCkgLSAoMiAqIG1vdmVtZW50QXhp
c1BhZGRpbmcpIC0gYWx0ZXJuYXRlQnV0dG9uV2lkdGgpOwogfQogCi12b2lkIFNjcm9sbGJhclRo
ZW1lR3RrOjpwYWludFRyYWNrQmFja2dyb3VuZChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIFNj
cm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIEd0a1dpZGdl
dFN0YXRlIHN0YXRlOwotICAgIHN0YXRlLmZvY3VzZWQgPSBGQUxTRTsKLSAgICBzdGF0ZS5pc0Rl
ZmF1bHQgPSBGQUxTRTsKLSAgICBzdGF0ZS5jYW5EZWZhdWx0ID0gRkFMU0U7Ci0gICAgc3RhdGUu
ZGlzYWJsZWQgPSBGQUxTRTsKLSAgICBzdGF0ZS5hY3RpdmUgPSBGQUxTRTsKLSAgICBzdGF0ZS5p
bkhvdmVyID0gRkFMU0U7Ci0KLSAgICAvLyBQYWludCB0aGUgdHJhY2sgYmFja2dyb3VuZC4gSWYg
dGhlIHRyb3VnaC11bmRlci1zdGVwcGVycyBwcm9wZXJ0eSBpcyB0cnVlLCB0aGlzCi0gICAgLy8g
c2hvdWxkIGJlIHRoZSBmdWxsIHNpemUgb2YgdGhlIHNjcm9sbGJhciwgYnV0IGlmIGlzIGZhbHNl
LCBpdCBzaG91bGQgb25seSBiZSB0aGUKLSAgICAvLyB0cmFjayByZWN0LgotICAgIEludFJlY3Qg
ZnVsbFNjcm9sbGJhclJlY3QgPSByZWN0OwotICAgIGlmIChtX3Ryb3VnaFVuZGVyU3RlcHBlcnMp
Ci0gICAgICAgIGZ1bGxTY3JvbGxiYXJSZWN0ID0gSW50UmVjdChzY3JvbGxiYXItPngoKSwgc2Ny
b2xsYmFyLT55KCksIHNjcm9sbGJhci0+d2lkdGgoKSwgc2Nyb2xsYmFyLT5oZWlnaHQoKSk7Ci0K
LSAgICBHdGtUaGVtZVdpZGdldFR5cGUgdHlwZSA9IHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9
PSBWZXJ0aWNhbFNjcm9sbGJhciA/IE1PWl9HVEtfU0NST0xMQkFSX1RSQUNLX1ZFUlRJQ0FMIDog
TU9aX0dUS19TQ1JPTExCQVJfVFJBQ0tfSE9SSVpPTlRBTDsKLSAgICBXaWRnZXRSZW5kZXJpbmdD
b250ZXh0IHdpZGdldENvbnRleHQoY29udGV4dCwgZnVsbFNjcm9sbGJhclJlY3QpOwotICAgIHdp
ZGdldENvbnRleHQucGFpbnRNb3ppbGxhV2lkZ2V0KHR5cGUsICZzdGF0ZSwgMCk7Ci19Ci0KLXZv
aWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50U2Nyb2xsYmFyQmFja2dyb3VuZChHcmFwaGljc0Nv
bnRleHQqIGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyKQotewotICAgIC8vIFRoaXMgaXMg
dW51c2VkIGJ5IHRoZSBtb3pfZ3RrX3Njcm9sbGVjZF93aW5kb3dfcGFpbnQuCi0gICAgR3RrV2lk
Z2V0U3RhdGUgc3RhdGU7Ci0gICAgSW50UmVjdCBmdWxsU2Nyb2xsYmFyUmVjdCA9IEludFJlY3Qo
c2Nyb2xsYmFyLT54KCksIHNjcm9sbGJhci0+eSgpLCBzY3JvbGxiYXItPndpZHRoKCksIHNjcm9s
bGJhci0+aGVpZ2h0KCkpOwotICAgIFdpZGdldFJlbmRlcmluZ0NvbnRleHQgd2lkZ2V0Q29udGV4
dChjb250ZXh0LCBmdWxsU2Nyb2xsYmFyUmVjdCk7Ci0gICAgd2lkZ2V0Q29udGV4dC5wYWludE1v
emlsbGFXaWRnZXQoTU9aX0dUS19TQ1JPTExFRF9XSU5ET1csICZzdGF0ZSwgMCk7Ci19Ci0KLXZv
aWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50VGh1bWIoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0
LCBTY3JvbGxiYXIqIHNjcm9sbGJhciwgY29uc3QgSW50UmVjdCYgcmVjdCkKLXsKLSAgICBHdGtX
aWRnZXRTdGF0ZSBzdGF0ZTsKLSAgICBzdGF0ZS5mb2N1c2VkID0gRkFMU0U7Ci0gICAgc3RhdGUu
aXNEZWZhdWx0ID0gRkFMU0U7Ci0gICAgc3RhdGUuY2FuRGVmYXVsdCA9IEZBTFNFOwotICAgIHN0
YXRlLmRpc2FibGVkID0gRkFMU0U7Ci0gICAgc3RhdGUuYWN0aXZlID0gc2Nyb2xsYmFyLT5wcmVz
c2VkUGFydCgpID09IFRodW1iUGFydDsKLSAgICBzdGF0ZS5pbkhvdmVyID0gc2Nyb2xsYmFyLT5o
b3ZlcmVkUGFydCgpID09IFRodW1iUGFydDsKLSAgICBzdGF0ZS5tYXhwb3MgPSBzY3JvbGxiYXIt
Pm1heGltdW0oKTsKLSAgICBzdGF0ZS5jdXJwb3MgPSBzY3JvbGxiYXItPmN1cnJlbnRQb3MoKTsK
LQotICAgIEd0a1RoZW1lV2lkZ2V0VHlwZSB0eXBlID0gc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigp
ID09IFZlcnRpY2FsU2Nyb2xsYmFyID8gTU9aX0dUS19TQ1JPTExCQVJfVEhVTUJfVkVSVElDQUwg
OiBNT1pfR1RLX1NDUk9MTEJBUl9USFVNQl9IT1JJWk9OVEFMOwotICAgIFdpZGdldFJlbmRlcmlu
Z0NvbnRleHQgd2lkZ2V0Q29udGV4dChjb250ZXh0LCByZWN0KTsKLSAgICB3aWRnZXRDb250ZXh0
LnBhaW50TW96aWxsYVdpZGdldCh0eXBlLCAmc3RhdGUsIDApOwotfQotCiBJbnRSZWN0IFNjcm9s
bGJhclRoZW1lR3RrOjp0aHVtYlJlY3QoU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGNvbnN0IEludFJl
Y3QmIHVuY29uc3RyYWluZWRUcmFja1JlY3QpCiB7CiAgICAgSW50UmVjdCB0cmFja1JlY3QgPSBj
b25zdHJhaW5UcmFja1JlY3RUb1RyYWNrUGllY2VzKHNjcm9sbGJhciwgdW5jb25zdHJhaW5lZFRy
YWNrUmVjdCk7CkBAIC0zMjYsNDAgKzIzMCw2IEBAIGJvb2wgU2Nyb2xsYmFyVGhlbWVHdGs6OnBh
aW50KFNjcm9sbGJhciogc2Nyb2xsYmFyLCBHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29uCiAg
ICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50QnV0dG9u
KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGNvbnN0IElu
dFJlY3QmIHJlY3QsIFNjcm9sbGJhclBhcnQgcGFydCkKLXsKLSAgICBpbnQgZmxhZ3MgPSAwOwot
ICAgIGlmIChzY3JvbGxiYXItPm9yaWVudGF0aW9uKCkgPT0gVmVydGljYWxTY3JvbGxiYXIpCi0g
ICAgICAgIGZsYWdzIHw9IE1PWl9HVEtfU1RFUFBFUl9WRVJUSUNBTDsKLQotICAgIGlmIChwYXJ0
ID09IEZvcndhcmRCdXR0b25FbmRQYXJ0KQotICAgICAgICBmbGFncyB8PSAoTU9aX0dUS19TVEVQ
UEVSX0RPV04gfCBNT1pfR1RLX1NURVBQRVJfQk9UVE9NKTsKLSAgICBpZiAocGFydCA9PSBGb3J3
YXJkQnV0dG9uU3RhcnRQYXJ0KQotICAgICAgICBmbGFncyB8PSBNT1pfR1RLX1NURVBQRVJfRE9X
TjsKLQotICAgIEd0a1dpZGdldFN0YXRlIHN0YXRlOwotICAgIHN0YXRlLmZvY3VzZWQgPSBUUlVF
OwotICAgIHN0YXRlLmlzRGVmYXVsdCA9IFRSVUU7Ci0gICAgc3RhdGUuY2FuRGVmYXVsdCA9IFRS
VUU7Ci0gICAgc3RhdGUuZGVwcmVzc2VkID0gRkFMU0U7Ci0KLSAgICBpZiAoKEJhY2tCdXR0b25T
dGFydFBhcnQgPT0gcGFydCAmJiBzY3JvbGxiYXItPmN1cnJlbnRQb3MoKSkKLSAgICAgICAgfHwg
KEJhY2tCdXR0b25FbmRQYXJ0ID09IHBhcnQgJiYgc2Nyb2xsYmFyLT5jdXJyZW50UG9zKCkpCi0g
ICAgICAgIHx8IChGb3J3YXJkQnV0dG9uRW5kUGFydCA9PSBwYXJ0ICYmIHNjcm9sbGJhci0+Y3Vy
cmVudFBvcygpICE9IHNjcm9sbGJhci0+bWF4aW11bSgpKQotICAgICAgICB8fCAoRm9yd2FyZEJ1
dHRvblN0YXJ0UGFydCA9PSBwYXJ0ICYmIHNjcm9sbGJhci0+Y3VycmVudFBvcygpICE9IHNjcm9s
bGJhci0+bWF4aW11bSgpKSkgewotICAgICAgICBzdGF0ZS5kaXNhYmxlZCA9IEZBTFNFOwotICAg
ICAgICBzdGF0ZS5hY3RpdmUgPSBwYXJ0ID09IHNjcm9sbGJhci0+cHJlc3NlZFBhcnQoKTsKLSAg
ICAgICAgc3RhdGUuaW5Ib3ZlciA9IHBhcnQgPT0gc2Nyb2xsYmFyLT5ob3ZlcmVkUGFydCgpOwot
ICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXRlLmRpc2FibGVkID0gVFJVRTsKLSAgICAgICAgc3Rh
dGUuYWN0aXZlID0gRkFMU0U7Ci0gICAgICAgIHN0YXRlLmluSG92ZXIgPSBGQUxTRTsKLSAgICB9
Ci0KLSAgICBXaWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENvbnRleHQoY29udGV4dCwgcmVj
dCk7Ci0gICAgd2lkZ2V0Q29udGV4dC5wYWludE1vemlsbGFXaWRnZXQoTU9aX0dUS19TQ1JPTExC
QVJfQlVUVE9OLCAmc3RhdGUsIGZsYWdzKTsKLX0KLQogdm9pZCBTY3JvbGxiYXJUaGVtZUd0azo6
cGFpbnRTY3JvbGxDb3JuZXIoU2Nyb2xsVmlldyogdmlldywgR3JhcGhpY3NDb250ZXh0KiBjb250
ZXh0LCBjb25zdCBJbnRSZWN0JiBjb3JuZXJSZWN0KQogewogICAgIC8vIFNjcm9sbGJhclRoZW1l
Q29tcG9zaXRlOjpwYWludFNjcm9sbENvcm5lciBpbmNvcnJlY3RseSBhc3N1bWVzIHRoYXQgdGhl
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0ay5oIGIv
V2ViQ29yZS9wbGF0Zm9ybS9ndGsvU2Nyb2xsYmFyVGhlbWVHdGsuaAppbmRleCA4Zjk5MGQ1Li5j
NGQ2MWI3IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0
ay5oCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1Njcm9sbGJhclRoZW1lR3RrLmgKQEAgLTI4
LDYgKzI4LDggQEAKIAogI2luY2x1ZGUgIlNjcm9sbGJhclRoZW1lQ29tcG9zaXRlLmgiCiAKKyNp
bmNsdWRlIDx3dGYvSGFzaFNldC5oPgorCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNzIFNj
cm9sbGJhcjsKQEAgLTY3LDkgKzY5LDE1IEBAIHByb3RlY3RlZDoKICAgICBpbnQgbV9zdGVwcGVy
U2l6ZTsKICAgICBpbnQgbV9zdGVwcGVyU3BhY2luZzsKICAgICBpbnQgbV9taW5UaHVtYkxlbmd0
aDsKLSAgICBib29sIG1fdHJvdWdoVW5kZXJTdGVwcGVyczsKLSAgICBib29sIG1faGFzRm9yd2Fy
ZEJ1dHRvblN0YXJ0UGFydDsKLSAgICBib29sIG1faGFzQmFja0J1dHRvbkVuZFBhcnQ7CisgICAg
Z2Jvb2xlYW4gbV90cm91Z2hVbmRlclN0ZXBwZXJzOworICAgIGdib29sZWFuIG1faGFzRm9yd2Fy
ZEJ1dHRvblN0YXJ0UGFydDsKKyAgICBnYm9vbGVhbiBtX2hhc0JhY2tCdXR0b25FbmRQYXJ0Owor
I2lmbmRlZiBHVEtfQVBJX1ZFUlNJT05fMgorICAgIEd0a1N0eWxlQ29udGV4dCogbV9jb250ZXh0
OworI2VuZGlmCisKK3ByaXZhdGU6CisgICAgY29uc3QgSGFzaFNldDxTY3JvbGxiYXIqPiogZ2V0
U2Nyb2xsYmFycygpOwogfTsKIAogfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsv
U2Nyb2xsYmFyVGhlbWVHdGsyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1Njcm9sbGJhclRo
ZW1lR3RrMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI2MmVkZQot
LS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1Njcm9sbGJhclRoZW1lR3Rr
Mi5jcHAKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUg
SW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworI2lmZGVmIEdUS19BUElfVkVSU0lPTl8yCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJTY3JvbGxiYXJUaGVtZUd0ay5oIgorCisjaW5jbHVkZSAiUGxhdGZv
cm1Nb3VzZUV2ZW50LmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWVHdGsuaCIKKyNpbmNsdWRlICJT
Y3JvbGxWaWV3LmgiCisjaW5jbHVkZSAiU2Nyb2xsYmFyLmgiCisjaW5jbHVkZSAiV2lkZ2V0UmVu
ZGVyaW5nQ29udGV4dC5oIgorI2luY2x1ZGUgImd0a2RyYXdpbmcuaCIKKyNpbmNsdWRlIDxndGsv
Z3RrLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIHZvaWQgZ3RrU3R5bGVTZXRD
YWxsYmFjayhHdGtXaWRnZXQqLCBHdGtTdHlsZSosIFNjcm9sbGJhclRoZW1lR3RrKik7CisKK1Nj
cm9sbGJhclRoZW1lR3RrOjpTY3JvbGxiYXJUaGVtZUd0aygpCit7CisgICAgdXBkYXRlVGhlbWVQ
cm9wZXJ0aWVzKCk7CisgICAgZ19zaWduYWxfY29ubmVjdChtb3pfZ3RrX2dldF9zY3JvbGxiYXJf
d2lkZ2V0KCksCisgICAgICAgICAic3R5bGUtc2V0IiwgR19DQUxMQkFDSyhndGtTdHlsZVNldENh
bGxiYWNrKSwgdGhpcyk7Cit9CisKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnVwZGF0ZVRoZW1l
UHJvcGVydGllcygpCit7CisgICAgTW96R3RrU2Nyb2xsYmFyTWV0cmljcyBtZXRyaWNzOworICAg
IG1vel9ndGtfZ2V0X3Njcm9sbGJhcl9tZXRyaWNzKCZtZXRyaWNzKTsKKworICAgIG1fdGh1bWJG
YXRuZXNzID0gbWV0cmljcy5zbGlkZXJfd2lkdGg7CisgICAgbV90cm91Z2hCb3JkZXJXaWR0aCA9
IG1ldHJpY3MudHJvdWdoX2JvcmRlcjsKKyAgICBtX3N0ZXBwZXJTaXplID0gbWV0cmljcy5zdGVw
cGVyX3NpemU7CisgICAgbV9zdGVwcGVyU3BhY2luZyA9IG1ldHJpY3Muc3RlcHBlcl9zcGFjaW5n
OworICAgIG1fbWluVGh1bWJMZW5ndGggPSBtZXRyaWNzLm1pbl9zbGlkZXJfc2l6ZTsKKyAgICBt
X3Ryb3VnaFVuZGVyU3RlcHBlcnMgPSBtZXRyaWNzLnRyb3VnaF91bmRlcl9zdGVwcGVyczsKKyAg
ICBtX2hhc0ZvcndhcmRCdXR0b25TdGFydFBhcnQgPSBtZXRyaWNzLmhhc19zZWNvbmRhcnlfZm9y
d2FyZF9zdGVwcGVyOworICAgIG1faGFzQmFja0J1dHRvbkVuZFBhcnQgPSBtZXRyaWNzLmhhc19z
ZWNvbmRhcnlfYmFja3dhcmRfc3RlcHBlcjsKKworICAgIGNvbnN0IEhhc2hTZXQ8U2Nyb2xsYmFy
Kj4qIGdTY3JvbGxiYXJzID0gZ2V0U2Nyb2xsYmFycygpOworICAgIGlmICghZ1Njcm9sbGJhcnMp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIFVwZGF0ZSB0aGUgdGhpY2tuZXNzIG9mIGV2ZXJ5
IGludGVyaW9yIGZyYW1lIHNjcm9sbGJhciB3aWRnZXQuIFRoZQorICAgIC8vIHBsYXRmb3JtLWlu
ZGVwZW5kZW50IHNjcm9sbGJhciB0aGVtIGNvZGUgaXNuJ3QgeWV0IHNtYXJ0IGVub3VnaCB0byBn
ZXQKKyAgICAvLyB0aGlzIGluZm9ybWF0aW9uIHdoZW4gaXQgcGFpbnRzLgorICAgIEhhc2hTZXQ8
U2Nyb2xsYmFyKj46Oml0ZXJhdG9yIGVuZCA9IGdTY3JvbGxiYXJzLT5lbmQoKTsKKyAgICBmb3Ig
KEhhc2hTZXQ8U2Nyb2xsYmFyKj46Oml0ZXJhdG9yIGl0ID0gZ1Njcm9sbGJhcnMtPmJlZ2luKCk7
IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBTY3JvbGxiYXIqIHNjcm9sbGJhciA9ICgqaXQp
OworCisgICAgICAgIC8vIFRvcC1sZXZlbCBzY3JvbGxiYXIgaS5lLiBzY3JvbGxiYXJzIHdobyBo
YXZlIGEgcGFyZW50IFNjcm9sbFZpZXcKKyAgICAgICAgLy8gd2l0aCBubyBwYXJlbnQgYXJlIG5h
dGl2ZSwgYW5kIHRodXMgZG8gbm90IG5lZWQgdG8gYmUgcmVzaXplZC4KKyAgICAgICAgaWYgKCFz
Y3JvbGxiYXItPnBhcmVudCgpIHx8ICFzY3JvbGxiYXItPnBhcmVudCgpLT5wYXJlbnQoKSkKKyAg
ICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpbnQgdGhpY2tuZXNzID0gc2Nyb2xsYmFyVGhp
Y2tuZXNzKHNjcm9sbGJhci0+Y29udHJvbFNpemUoKSk7CisgICAgICAgIGlmIChzY3JvbGxiYXIt
Pm9yaWVudGF0aW9uKCkgPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgICAgIHNjcm9s
bGJhci0+c2V0RnJhbWVSZWN0KEludFJlY3QoMCwgc2Nyb2xsYmFyLT5wYXJlbnQoKS0+aGVpZ2h0
KCkgLSB0aGlja25lc3MsIHNjcm9sbGJhci0+d2lkdGgoKSwgdGhpY2tuZXNzKSk7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIHNjcm9sbGJhci0+c2V0RnJhbWVSZWN0KEludFJlY3Qoc2Nyb2xs
YmFyLT5wYXJlbnQoKS0+d2lkdGgoKSAtIHRoaWNrbmVzcywgMCwgdGhpY2tuZXNzLCBzY3JvbGxi
YXItPmhlaWdodCgpKSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBndGtTdHlsZVNldENhbGxi
YWNrKEd0a1dpZGdldCogd2lkZ2V0LCBHdGtTdHlsZSogcHJldmlvdXMsIFNjcm9sbGJhclRoZW1l
R3RrKiBzY3JvbGxiYXJUaGVtZSkKK3sKKyAgICBzY3JvbGxiYXJUaGVtZS0+dXBkYXRlVGhlbWVQ
cm9wZXJ0aWVzKCk7Cit9CisKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50VHJhY2tCYWNr
Z3JvdW5kKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGNv
bnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgR3RrV2lkZ2V0U3RhdGUgc3RhdGU7CisgICAgc3Rh
dGUuZm9jdXNlZCA9IEZBTFNFOworICAgIHN0YXRlLmlzRGVmYXVsdCA9IEZBTFNFOworICAgIHN0
YXRlLmNhbkRlZmF1bHQgPSBGQUxTRTsKKyAgICBzdGF0ZS5kaXNhYmxlZCA9IEZBTFNFOworICAg
IHN0YXRlLmFjdGl2ZSA9IEZBTFNFOworICAgIHN0YXRlLmluSG92ZXIgPSBGQUxTRTsKKworICAg
IC8vIFBhaW50IHRoZSB0cmFjayBiYWNrZ3JvdW5kLiBJZiB0aGUgdHJvdWdoLXVuZGVyLXN0ZXBw
ZXJzIHByb3BlcnR5IGlzIHRydWUsIHRoaXMKKyAgICAvLyBzaG91bGQgYmUgdGhlIGZ1bGwgc2l6
ZSBvZiB0aGUgc2Nyb2xsYmFyLCBidXQgaWYgaXMgZmFsc2UsIGl0IHNob3VsZCBvbmx5IGJlIHRo
ZQorICAgIC8vIHRyYWNrIHJlY3QuCisgICAgSW50UmVjdCBmdWxsU2Nyb2xsYmFyUmVjdCA9IHJl
Y3Q7CisgICAgaWYgKG1fdHJvdWdoVW5kZXJTdGVwcGVycykKKyAgICAgICAgZnVsbFNjcm9sbGJh
clJlY3QgPSBJbnRSZWN0KHNjcm9sbGJhci0+eCgpLCBzY3JvbGxiYXItPnkoKSwgc2Nyb2xsYmFy
LT53aWR0aCgpLCBzY3JvbGxiYXItPmhlaWdodCgpKTsKKworICAgIEd0a1RoZW1lV2lkZ2V0VHlw
ZSB0eXBlID0gc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFyID8g
TU9aX0dUS19TQ1JPTExCQVJfVFJBQ0tfVkVSVElDQUwgOiBNT1pfR1RLX1NDUk9MTEJBUl9UUkFD
S19IT1JJWk9OVEFMOworICAgIFdpZGdldFJlbmRlcmluZ0NvbnRleHQgd2lkZ2V0Q29udGV4dChj
b250ZXh0LCBmdWxsU2Nyb2xsYmFyUmVjdCk7CisgICAgd2lkZ2V0Q29udGV4dC5wYWludE1vemls
bGFXaWRnZXQodHlwZSwgJnN0YXRlLCAwKTsKK30KKwordm9pZCBTY3JvbGxiYXJUaGVtZUd0azo6
cGFpbnRTY3JvbGxiYXJCYWNrZ3JvdW5kKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgU2Nyb2xs
YmFyKiBzY3JvbGxiYXIpCit7CisgICAgLy8gVGhpcyBpcyB1bnVzZWQgYnkgdGhlIG1vel9ndGtf
c2Nyb2xsZWNkX3dpbmRvd19wYWludC4KKyAgICBHdGtXaWRnZXRTdGF0ZSBzdGF0ZTsKKyAgICBJ
bnRSZWN0IGZ1bGxTY3JvbGxiYXJSZWN0ID0gSW50UmVjdChzY3JvbGxiYXItPngoKSwgc2Nyb2xs
YmFyLT55KCksIHNjcm9sbGJhci0+d2lkdGgoKSwgc2Nyb2xsYmFyLT5oZWlnaHQoKSk7CisgICAg
V2lkZ2V0UmVuZGVyaW5nQ29udGV4dCB3aWRnZXRDb250ZXh0KGNvbnRleHQsIGZ1bGxTY3JvbGxi
YXJSZWN0KTsKKyAgICB3aWRnZXRDb250ZXh0LnBhaW50TW96aWxsYVdpZGdldChNT1pfR1RLX1ND
Uk9MTEVEX1dJTkRPVywgJnN0YXRlLCAwKTsKK30KKwordm9pZCBTY3JvbGxiYXJUaGVtZUd0azo6
cGFpbnRUaHVtYihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFy
LCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIEd0a1dpZGdldFN0YXRlIHN0YXRlOworICAg
IHN0YXRlLmZvY3VzZWQgPSBGQUxTRTsKKyAgICBzdGF0ZS5pc0RlZmF1bHQgPSBGQUxTRTsKKyAg
ICBzdGF0ZS5jYW5EZWZhdWx0ID0gRkFMU0U7CisgICAgc3RhdGUuZGlzYWJsZWQgPSBGQUxTRTsK
KyAgICBzdGF0ZS5hY3RpdmUgPSBzY3JvbGxiYXItPnByZXNzZWRQYXJ0KCkgPT0gVGh1bWJQYXJ0
OworICAgIHN0YXRlLmluSG92ZXIgPSBzY3JvbGxiYXItPmhvdmVyZWRQYXJ0KCkgPT0gVGh1bWJQ
YXJ0OworICAgIHN0YXRlLm1heHBvcyA9IHNjcm9sbGJhci0+bWF4aW11bSgpOworICAgIHN0YXRl
LmN1cnBvcyA9IHNjcm9sbGJhci0+Y3VycmVudFBvcygpOworCisgICAgR3RrVGhlbWVXaWRnZXRU
eXBlIHR5cGUgPSBzY3JvbGxiYXItPm9yaWVudGF0aW9uKCkgPT0gVmVydGljYWxTY3JvbGxiYXIg
PyBNT1pfR1RLX1NDUk9MTEJBUl9USFVNQl9WRVJUSUNBTCA6IE1PWl9HVEtfU0NST0xMQkFSX1RI
VU1CX0hPUklaT05UQUw7CisgICAgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dCB3aWRnZXRDb250ZXh0
KGNvbnRleHQsIHJlY3QpOworICAgIHdpZGdldENvbnRleHQucGFpbnRNb3ppbGxhV2lkZ2V0KHR5
cGUsICZzdGF0ZSwgMCk7Cit9CisKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50QnV0dG9u
KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGNvbnN0IElu
dFJlY3QmIHJlY3QsIFNjcm9sbGJhclBhcnQgcGFydCkKK3sKKyAgICBpbnQgZmxhZ3MgPSAwOwor
ICAgIGlmIChzY3JvbGxiYXItPm9yaWVudGF0aW9uKCkgPT0gVmVydGljYWxTY3JvbGxiYXIpCisg
ICAgICAgIGZsYWdzIHw9IE1PWl9HVEtfU1RFUFBFUl9WRVJUSUNBTDsKKworICAgIGlmIChwYXJ0
ID09IEZvcndhcmRCdXR0b25FbmRQYXJ0KQorICAgICAgICBmbGFncyB8PSAoTU9aX0dUS19TVEVQ
UEVSX0RPV04gfCBNT1pfR1RLX1NURVBQRVJfQk9UVE9NKTsKKyAgICBpZiAocGFydCA9PSBGb3J3
YXJkQnV0dG9uU3RhcnRQYXJ0KQorICAgICAgICBmbGFncyB8PSBNT1pfR1RLX1NURVBQRVJfRE9X
TjsKKworICAgIEd0a1dpZGdldFN0YXRlIHN0YXRlOworICAgIHN0YXRlLmZvY3VzZWQgPSBUUlVF
OworICAgIHN0YXRlLmlzRGVmYXVsdCA9IFRSVUU7CisgICAgc3RhdGUuY2FuRGVmYXVsdCA9IFRS
VUU7CisgICAgc3RhdGUuZGVwcmVzc2VkID0gRkFMU0U7CisKKyAgICBpZiAoKEJhY2tCdXR0b25T
dGFydFBhcnQgPT0gcGFydCAmJiBzY3JvbGxiYXItPmN1cnJlbnRQb3MoKSkKKyAgICAgICAgfHwg
KEJhY2tCdXR0b25FbmRQYXJ0ID09IHBhcnQgJiYgc2Nyb2xsYmFyLT5jdXJyZW50UG9zKCkpCisg
ICAgICAgIHx8IChGb3J3YXJkQnV0dG9uRW5kUGFydCA9PSBwYXJ0ICYmIHNjcm9sbGJhci0+Y3Vy
cmVudFBvcygpICE9IHNjcm9sbGJhci0+bWF4aW11bSgpKQorICAgICAgICB8fCAoRm9yd2FyZEJ1
dHRvblN0YXJ0UGFydCA9PSBwYXJ0ICYmIHNjcm9sbGJhci0+Y3VycmVudFBvcygpICE9IHNjcm9s
bGJhci0+bWF4aW11bSgpKSkgeworICAgICAgICBzdGF0ZS5kaXNhYmxlZCA9IEZBTFNFOworICAg
ICAgICBzdGF0ZS5hY3RpdmUgPSBwYXJ0ID09IHNjcm9sbGJhci0+cHJlc3NlZFBhcnQoKTsKKyAg
ICAgICAgc3RhdGUuaW5Ib3ZlciA9IHBhcnQgPT0gc2Nyb2xsYmFyLT5ob3ZlcmVkUGFydCgpOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXRlLmRpc2FibGVkID0gVFJVRTsKKyAgICAgICAgc3Rh
dGUuYWN0aXZlID0gRkFMU0U7CisgICAgICAgIHN0YXRlLmluSG92ZXIgPSBGQUxTRTsKKyAgICB9
CisKKyAgICBXaWRnZXRSZW5kZXJpbmdDb250ZXh0IHdpZGdldENvbnRleHQoY29udGV4dCwgcmVj
dCk7CisgICAgd2lkZ2V0Q29udGV4dC5wYWludE1vemlsbGFXaWRnZXQoTU9aX0dUS19TQ1JPTExC
QVJfQlVUVE9OLCAmc3RhdGUsIGZsYWdzKTsKK30KKworfQorCisjZW5kaWYgLy8gR1RLX0FQSV9W
RVJTSU9OXzIKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1Njcm9sbGJhclRoZW1l
R3RrMy5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0azMuY3BwCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMGRhYjEKLS0tIC9kZXYvbnVsbAor
KysgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9TY3JvbGxiYXJUaGVtZUd0azMuY3BwCkBAIC0wLDAg
KzEsMjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gQWxsIFJpZ2h0
cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpZm5kZWYgR1RLX0FQSV9WRVJTSU9OXzIKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIlNjcm9sbGJhclRoZW1lR3RrLmgiCisKKyNpbmNsdWRlICJQbGF0Zm9ybU1vdXNlRXZlbnQu
aCIKKyNpbmNsdWRlICJSZW5kZXJUaGVtZUd0ay5oIgorI2luY2x1ZGUgIlNjcm9sbFZpZXcuaCIK
KyNpbmNsdWRlICJTY3JvbGxiYXIuaCIKKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworc3RhdGljIHZvaWQgZ3RrU3R5bGVDaGFuZ2VkQ2FsbGJhY2soR3RrV2lk
Z2V0KiwgU2Nyb2xsYmFyVGhlbWVHdGsqIHNjcm9sbGJhclRoZW1lKQoreworICAgIHNjcm9sbGJh
clRoZW1lLT51cGRhdGVUaGVtZVByb3BlcnRpZXMoKTsKK30KKworU2Nyb2xsYmFyVGhlbWVHdGs6
OlNjcm9sbGJhclRoZW1lR3RrKCkKK3sKKyAgICBtX2NvbnRleHQgPSBzdGF0aWNfY2FzdDxSZW5k
ZXJUaGVtZUd0ayo+KFJlbmRlclRoZW1lOjpkZWZhdWx0VGhlbWUoKS5nZXQoKSktPmd0a1Njcm9s
bGJhclN0eWxlKCk7CisgICAgdXBkYXRlVGhlbWVQcm9wZXJ0aWVzKCk7CisgICAgZ19zaWduYWxf
Y29ubmVjdChtX2NvbnRleHQsICJjaGFuZ2VkIiwgR19DQUxMQkFDSyhndGtTdHlsZUNoYW5nZWRD
YWxsYmFjayksIHRoaXMpOworfQorCit2b2lkIFNjcm9sbGJhclRoZW1lR3RrOjp1cGRhdGVUaGVt
ZVByb3BlcnRpZXMoKQoreworICAgIGd0a19zdHlsZV9jb250ZXh0X2dldF9zdHlsZShtX2NvbnRl
eHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW4tc2xpZGVyLWxlbmd0aCIs
ICZtX21pblRodW1iTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2xp
ZGVyLXdpZHRoIiwgJm1fdGh1bWJGYXRuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAidHJvdWdoLWJvcmRlciIsICZtX3Ryb3VnaEJvcmRlcldpZHRoLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAic3RlcHBlci1zaXplIiwgJm1fc3RlcHBlclNpemUsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGVwcGVyLXNwYWNpbmciLCAmbV9zdGVwcGVy
U3BhY2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyb3VnaC11bmRlci1z
dGVwcGVycyIsICZtX3Ryb3VnaFVuZGVyU3RlcHBlcnMsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJoYXMtc2Vjb25kYXJ5LWJhY2t3YXJkLXN0ZXBwZXIiLCAmbV9oYXNCYWNrQnV0
dG9uRW5kUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhcy1zZWNvbmRh
cnktZm9yd2FyZC1zdGVwcGVyIiwgJm1faGFzRm9yd2FyZEJ1dHRvblN0YXJ0UGFydCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgICBjb25zdCBIYXNoU2V0PFNjcm9s
bGJhcio+KiBnU2Nyb2xsYmFycyA9IGdldFNjcm9sbGJhcnMoKTsKKyAgICBpZiAoIWdTY3JvbGxi
YXJzKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBVcGRhdGUgdGhlIHRoaWNrbmVzcyBvZiBl
dmVyeSBpbnRlcmlvciBmcmFtZSBzY3JvbGxiYXIgd2lkZ2V0LiBUaGUKKyAgICAvLyBwbGF0Zm9y
bS1pbmRlcGVuZGVudCBzY3JvbGxiYXIgdGhlbSBjb2RlIGlzbid0IHlldCBzbWFydCBlbm91Z2gg
dG8gZ2V0CisgICAgLy8gdGhpcyBpbmZvcm1hdGlvbiB3aGVuIGl0IHBhaW50cy4KKyAgICBIYXNo
U2V0PFNjcm9sbGJhcio+OjppdGVyYXRvciBlbmQgPSBnU2Nyb2xsYmFycy0+ZW5kKCk7CisgICAg
Zm9yIChIYXNoU2V0PFNjcm9sbGJhcio+OjppdGVyYXRvciBpdCA9IGdTY3JvbGxiYXJzLT5iZWdp
bigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSAo
Kml0KTsKKworICAgICAgICAvLyBUb3AtbGV2ZWwgc2Nyb2xsYmFyIGkuZS4gc2Nyb2xsYmFycyB3
aG8gaGF2ZSBhIHBhcmVudCBTY3JvbGxWaWV3CisgICAgICAgIC8vIHdpdGggbm8gcGFyZW50IGFy
ZSBuYXRpdmUsIGFuZCB0aHVzIGRvIG5vdCBuZWVkIHRvIGJlIHJlc2l6ZWQuCisgICAgICAgIGlm
ICghc2Nyb2xsYmFyLT5wYXJlbnQoKSB8fCAhc2Nyb2xsYmFyLT5wYXJlbnQoKS0+cGFyZW50KCkp
CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaW50IHRoaWNrbmVzcyA9IHNjcm9sbGJh
clRoaWNrbmVzcyhzY3JvbGxiYXItPmNvbnRyb2xTaXplKCkpOworICAgICAgICBpZiAoc2Nyb2xs
YmFyLT5vcmllbnRhdGlvbigpID09IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAgICAgICAgICBz
Y3JvbGxiYXItPnNldEZyYW1lUmVjdChJbnRSZWN0KDAsIHNjcm9sbGJhci0+cGFyZW50KCktPmhl
aWdodCgpIC0gdGhpY2tuZXNzLCBzY3JvbGxiYXItPndpZHRoKCksIHRoaWNrbmVzcykpOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBzY3JvbGxiYXItPnNldEZyYW1lUmVjdChJbnRSZWN0KHNj
cm9sbGJhci0+cGFyZW50KCktPndpZHRoKCkgLSB0aGlja25lc3MsIDAsIHRoaWNrbmVzcywgc2Ny
b2xsYmFyLT5oZWlnaHQoKSkpOworICAgIH0KK30KKwordm9pZCBTY3JvbGxiYXJUaGVtZUd0azo6
cGFpbnRUcmFja0JhY2tncm91bmQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBTY3JvbGxiYXIq
IHNjcm9sbGJhciwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICAvLyBQYWludCB0aGUgdHJh
Y2sgYmFja2dyb3VuZC4gSWYgdGhlIHRyb3VnaC11bmRlci1zdGVwcGVycyBwcm9wZXJ0eSBpcyB0
cnVlLCB0aGlzCisgICAgLy8gc2hvdWxkIGJlIHRoZSBmdWxsIHNpemUgb2YgdGhlIHNjcm9sbGJh
ciwgYnV0IGlmIGlzIGZhbHNlLCBpdCBzaG91bGQgb25seSBiZSB0aGUKKyAgICAvLyB0cmFjayBy
ZWN0LgorICAgIEludFJlY3QgZnVsbFNjcm9sbGJhclJlY3QgPSByZWN0OworICAgIGlmIChtX3Ry
b3VnaFVuZGVyU3RlcHBlcnMpCisgICAgICAgIGZ1bGxTY3JvbGxiYXJSZWN0ID0gSW50UmVjdChz
Y3JvbGxiYXItPngoKSwgc2Nyb2xsYmFyLT55KCksIHNjcm9sbGJhci0+d2lkdGgoKSwgc2Nyb2xs
YmFyLT5oZWlnaHQoKSk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9zYXZlKG1fY29udGV4dCk7
CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MobV9jb250ZXh0LCBHVEtfU1RZTEVf
Q0xBU1NfU0NST0xMQkFSKTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3MobV9jb250
ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfVFJPVUdIKTsKKworICAgIGd0a19yZW5kZXJfYmFja2dyb3Vu
ZChtX2NvbnRleHQsIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICBmdWxsU2Nyb2xsYmFyUmVjdC54KCksIGZ1bGxTY3JvbGxiYXJSZWN0LnkoKSwg
ZnVsbFNjcm9sbGJhclJlY3Qud2lkdGgoKSwgZnVsbFNjcm9sbGJhclJlY3QuaGVpZ2h0KCkpOwor
ICAgIGd0a19yZW5kZXJfZnJhbWUobV9jb250ZXh0LCBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQo
KSwKKyAgICAgICAgICAgICAgICAgICAgIGZ1bGxTY3JvbGxiYXJSZWN0LngoKSwgZnVsbFNjcm9s
bGJhclJlY3QueSgpLCBmdWxsU2Nyb2xsYmFyUmVjdC53aWR0aCgpLCBmdWxsU2Nyb2xsYmFyUmVj
dC5oZWlnaHQoKSk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9yZXN0b3JlKG1fY29udGV4dCk7
Cit9CisKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50U2Nyb2xsYmFyQmFja2dyb3VuZChH
cmFwaGljc0NvbnRleHQqIGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyKQoreworICAgIGd0
a19zdHlsZV9jb250ZXh0X3NhdmUobV9jb250ZXh0KTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0
X2FkZF9jbGFzcyhtX2NvbnRleHQsIEdUS19TVFlMRV9DTEFTU19TQ1JPTExCQVIpOworICAgIGd0
a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhtX2NvbnRleHQsICJzY3JvbGxlZC13aW5kb3ciKTsK
KyAgICBndGtfcmVuZGVyX2ZyYW1lKG1fY29udGV4dCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0
KCksIHNjcm9sbGJhci0+eCgpLCBzY3JvbGxiYXItPnkoKSwgc2Nyb2xsYmFyLT53aWR0aCgpLCBz
Y3JvbGxiYXItPmhlaWdodCgpKTsKKworICAgIGd0a19zdHlsZV9jb250ZXh0X3Jlc3RvcmUobV9j
b250ZXh0KTsKK30KKwordm9pZCBTY3JvbGxiYXJUaGVtZUd0azo6cGFpbnRUaHVtYihHcmFwaGlj
c0NvbnRleHQqIGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJbnRSZWN0JiBy
ZWN0KQoreworICAgIGd0a19zdHlsZV9jb250ZXh0X3NhdmUobV9jb250ZXh0KTsKKworICAgIGd0
a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhtX2NvbnRleHQsIEdUS19TVFlMRV9DTEFTU19TQ1JP
TExCQVIpOworICAgIGd0a19zdHlsZV9jb250ZXh0X2FkZF9jbGFzcyhtX2NvbnRleHQsIEdUS19T
VFlMRV9DTEFTU19TTElERVIpOworCisgICAgZ3VpbnQgZmxhZ3MgPSAwOworICAgIGlmIChzY3Jv
bGxiYXItPnByZXNzZWRQYXJ0KCkgPT0gVGh1bWJQYXJ0KQorICAgICAgICBmbGFncyB8PSBHVEtf
U1RBVEVfRkxBR19BQ1RJVkU7CisgICAgaWYgKHNjcm9sbGJhci0+aG92ZXJlZFBhcnQoKSA9PSBU
aHVtYlBhcnQpCisgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX1BSRUxJR0hUOworICAg
IGd0a19zdHlsZV9jb250ZXh0X3NldF9zdGF0ZShtX2NvbnRleHQsIHN0YXRpY19jYXN0PEd0a1N0
YXRlRmxhZ3M+KGZsYWdzKSk7CisKKyAgICBndGtfcmVuZGVyX3NsaWRlcihtX2NvbnRleHQsIGNv
bnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLCByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgo
KSwgcmVjdC5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxiYXItPm9yaWVu
dGF0aW9uKCkgPT0gVmVydGljYWxTY3JvbGxiYXIgPyBHVEtfT1JJRU5UQVRJT05fVkVSVElDQUwg
OiBHVEtfT1JJRU5UQVRJT05fSE9SSVpPTlRBTCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9y
ZXN0b3JlKG1fY29udGV4dCk7Cit9CisKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVHdGs6OnBhaW50QnV0
dG9uKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGNvbnN0
IEludFJlY3QmIHJlY3QsIFNjcm9sbGJhclBhcnQgcGFydCkKK3sKKyAgICBndGtfc3R5bGVfY29u
dGV4dF9zYXZlKG1fY29udGV4dCk7CisKKyAgICBndGtfc3R5bGVfY29udGV4dF9hZGRfY2xhc3Mo
bV9jb250ZXh0LCBHVEtfU1RZTEVfQ0xBU1NfU0NST0xMQkFSKTsKKworICAgIGd1aW50IGZsYWdz
ID0gMDsKKyAgICBpZiAoKEJhY2tCdXR0b25TdGFydFBhcnQgPT0gcGFydCAmJiBzY3JvbGxiYXIt
PmN1cnJlbnRQb3MoKSkKKyAgICAgICAgfHwgKEJhY2tCdXR0b25FbmRQYXJ0ID09IHBhcnQgJiYg
c2Nyb2xsYmFyLT5jdXJyZW50UG9zKCkpCisgICAgICAgIHx8IChGb3J3YXJkQnV0dG9uRW5kUGFy
dCA9PSBwYXJ0ICYmIHNjcm9sbGJhci0+Y3VycmVudFBvcygpICE9IHNjcm9sbGJhci0+bWF4aW11
bSgpKQorICAgICAgICB8fCAoRm9yd2FyZEJ1dHRvblN0YXJ0UGFydCA9PSBwYXJ0ICYmIHNjcm9s
bGJhci0+Y3VycmVudFBvcygpICE9IHNjcm9sbGJhci0+bWF4aW11bSgpKSkgeworICAgICAgICBp
ZiAocGFydCA9PSBzY3JvbGxiYXItPnByZXNzZWRQYXJ0KCkpCisgICAgICAgICAgICBmbGFncyB8
PSBHVEtfU1RBVEVfRkxBR19BQ1RJVkU7CisgICAgICAgIGlmIChwYXJ0ID09IHNjcm9sbGJhci0+
aG92ZXJlZFBhcnQoKSkKKyAgICAgICAgICAgIGZsYWdzIHw9IEdUS19TVEFURV9GTEFHX1BSRUxJ
R0hUOworICAgIH0gZWxzZQorICAgICAgICBmbGFncyB8PSBHVEtfU1RBVEVfRkxBR19JTlNFTlNJ
VElWRTsKKyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfc3RhdGUobV9jb250ZXh0LCBzdGF0aWNf
Y2FzdDxHdGtTdGF0ZUZsYWdzPihmbGFncykpOworCisgICAgZ3VpbnQgc2lkZXMgPSBndGtfc3R5
bGVfY29udGV4dF9nZXRfanVuY3Rpb25fc2lkZXMobV9jb250ZXh0KTsKKyAgICBpZiAoc2Nyb2xs
YmFyLT5vcmllbnRhdGlvbigpID09IFZlcnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICBzaWRlcyAm
PSB+KEdUS19KVU5DVElPTl9UT1AgfCBHVEtfSlVOQ1RJT05fQk9UVE9NKTsKKyAgICBlbHNlCisg
ICAgICAgIHNpZGVzICY9IH4oR1RLX0pVTkNUSU9OX0xFRlQgfCBHVEtfSlVOQ1RJT05fUklHSFQp
OworCisgICAgc3dpdGNoIChwYXJ0KSB7CisgICAgY2FzZSBCYWNrQnV0dG9uU3RhcnRQYXJ0Ogor
ICAgICAgICBzaWRlcyB8PSAoc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IFZlcnRpY2FsU2Ny
b2xsYmFyKSA/IEdUS19KVU5DVElPTl9CT1RUT00gOiBHVEtfSlVOQ1RJT05fUklHSFQ7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2UgQmFja0J1dHRvbkVuZFBhcnQ6CisgICAgY2FzZSBGb3J3YXJk
QnV0dG9uRW5kUGFydDoKKyAgICAgICAgc2lkZXMgfD0gKHNjcm9sbGJhci0+b3JpZW50YXRpb24o
KSA9PSBWZXJ0aWNhbFNjcm9sbGJhcikgPworICAgICAgICAgICAgICAgIEdUS19KVU5DVElPTl9U
T1AgfCBHVEtfSlVOQ1RJT05fQk9UVE9NIDogR1RLX0pVTkNUSU9OX1JJR0hUIHwgR1RLX0pVTkNU
SU9OX0xFRlQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRm9yd2FyZEJ1dHRvblN0YXJ0UGFy
dDoKKyAgICAgICAgc2lkZXMgfD0gKHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBWZXJ0aWNh
bFNjcm9sbGJhcikgPyBHVEtfSlVOQ1RJT05fVE9QIDogR1RLX0pVTkNUSU9OX0xFRlQ7CisgICAg
ICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgIH0KKyAgICBndGtfc3R5bGVfY29udGV4dF9zZXRfanVuY3Rpb25fc2lkZXMobV9jb250ZXh0
LCBzdGF0aWNfY2FzdDxHdGtKdW5jdGlvblNpZGVzPihzaWRlcykpOworICAgIGd0a19zdHlsZV9j
b250ZXh0X2FkZF9jbGFzcyhtX2NvbnRleHQsIEdUS19TVFlMRV9DTEFTU19CVVRUT04pOworCisg
ICAgZ3RrX3JlbmRlcl9iYWNrZ3JvdW5kKG1fY29udGV4dCwgY29udGV4dC0+cGxhdGZvcm1Db250
ZXh0KCksIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsK
KyAgICBndGtfcmVuZGVyX2ZyYW1lKG1fY29udGV4dCwgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0
KCksIHJlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpKTsKKwor
ICAgIGdmbG9hdCBhcnJvd1NjYWxpbmc7CisgICAgZ3RrX3N0eWxlX2NvbnRleHRfZ2V0X3N0eWxl
KG1fY29udGV4dCwgImFycm93LXNjYWxpbmciLCAmYXJyb3dTY2FsaW5nLCAwKTsKKworICAgIElu
dFNpemUgYXJyb3dTaXplID0gcmVjdC5zaXplKCk7CisgICAgYXJyb3dTaXplLnNjYWxlKGFycm93
U2NhbGluZyk7CisgICAgSW50UG9pbnQgYXJyb3dQb2ludChyZWN0LngoKSArIChyZWN0LndpZHRo
KCkgLSBhcnJvd1NpemUud2lkdGgoKSkgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVj
dC55KCkgKyAocmVjdC5oZWlnaHQoKSAtIGFycm93U2l6ZS5oZWlnaHQoKSkgLyAyKTsKKworICAg
IGlmIChmbGFncyAmIEdUS19TVEFURV9GTEFHX0FDVElWRSkgeworICAgICAgICBnaW50IGFycm93
RGlzcGxhY2VtZW50WCwgYXJyb3dEaXNwbGFjZW1lbnRZOworICAgICAgICBndGtfc3R5bGVfY29u
dGV4dF9nZXRfc3R5bGUobV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgImFycm93LWRpc3BsYWNlbWVudC14IiwgJmFycm93RGlzcGxhY2VtZW50WCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJvdy1kaXNwbGFjZW1lbnQteSIsICZh
cnJvd0Rpc3BsYWNlbWVudFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAw
KTsKKyAgICAgICAgYXJyb3dQb2ludC5tb3ZlKGFycm93RGlzcGxhY2VtZW50WCwgYXJyb3dEaXNw
bGFjZW1lbnRZKTsKKyAgICB9CisKKyAgICBnZG91YmxlIGFuZ2xlLCBzaXplOworICAgIGlmIChz
Y3JvbGxiYXItPm9yaWVudGF0aW9uKCkgPT0gVmVydGljYWxTY3JvbGxiYXIpIHsKKyAgICAgICAg
c2l6ZSA9IGFycm93U2l6ZS53aWR0aCgpOworICAgICAgICBhbmdsZSA9IChwYXJ0ID09IEZvcndh
cmRCdXR0b25FbmRQYXJ0IHx8IHBhcnQgPT0gRm9yd2FyZEJ1dHRvblN0YXJ0UGFydCkgPyBHX1BJ
IDogMDsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplID0gYXJyb3dTaXplLmhlaWdodCgpOwor
ICAgICAgICBhbmdsZSA9IChwYXJ0ID09IEZvcndhcmRCdXR0b25FbmRQYXJ0IHx8IHBhcnQgPT0g
Rm9yd2FyZEJ1dHRvblN0YXJ0UGFydCkgPyBHX1BJIC8gMiA6IDMgKiAoR19QSSAvIDIpOworICAg
IH0KKworICAgIGd0a19yZW5kZXJfYXJyb3cobV9jb250ZXh0LCBjb250ZXh0LT5wbGF0Zm9ybUNv
bnRleHQoKSwgYW5nbGUsIGFycm93UG9pbnQueCgpLCBhcnJvd1BvaW50LnkoKSwgc2l6ZSk7CisK
KyAgICBndGtfc3R5bGVfY29udGV4dF9yZXN0b3JlKG1fY29udGV4dCk7Cit9CisKK30KKworI2Vu
ZGlmIC8vICFHVEtfQVBJX1ZFUlNJT05fMgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9n
dGsvV2lkZ2V0UmVuZGVyaW5nQ29udGV4dC5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvV2lkZ2V0
UmVuZGVyaW5nQ29udGV4dC5oCmluZGV4IDczMzQ2NTYuLmEwNzMzZjEgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvcGxhdGZvcm0vZ3RrL1dpZGdldFJlbmRlcmluZ0NvbnRleHQuaAorKysgYi9XZWJDb3Jl
L3BsYXRmb3JtL2d0ay9XaWRnZXRSZW5kZXJpbmdDb250ZXh0LmgKQEAgLTE4LDYgKzE4LDcgQEAK
ICAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgogICoKICAqLworI2lmZGVmIEdUS19BUElf
VkVSU0lPTl8yCiAKICNpZm5kZWYgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dF9oCiAjZGVmaW5lIFdp
ZGdldFJlbmRlcmluZ0NvbnRleHRfaApAQCAtNDcsMTQgKzQ4LDExIEBAIHByaXZhdGU6CiAgICAg
SW50U2l6ZSBtX2V4dHJhU3BhY2U7CiAgICAgYm9vbCBtX2hhZEVycm9yOwogCi0jaWZkZWYgR1RL
X0FQSV9WRVJTSU9OXzIKICAgICBHZGtEcmF3YWJsZSogbV90YXJnZXQ7Ci0jZWxzZQotICAgIGNh
aXJvX3QqIG1fdGFyZ2V0OwotI2VuZGlmCi0KIH07CiAKIH0KIAogI2VuZGlmCisKKyNlbmRpZiAv
LyBHVEtfQVBJX1ZFUlNJT05fMgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvV2lk
Z2V0UmVuZGVyaW5nQ29udGV4dEd0azIuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvV2lkZ2V0
UmVuZGVyaW5nQ29udGV4dEd0azIuY3BwCmluZGV4IGU4NWM1NzAuLjNlNDUzMjEgMTAwNjQ0Ci0t
LSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1dpZGdldFJlbmRlcmluZ0NvbnRleHRHdGsyLmNwcAor
KysgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9XaWRnZXRSZW5kZXJpbmdDb250ZXh0R3RrMi5jcHAK
QEAgLTcyLDcgKzcyLDcgQEAgc3RhdGljIEludFNpemUgZ2V0RXh0cmFTcGFjZUZvcldpZGdldChS
ZW5kZXJUaGVtZUd0ayogdGhlbWUpCiAKICAgICAvLyBUaGUgY2hlY2tib3ggZXh0cmEgc3BhY2Ug
aXMgY2FsY3VsYXRlZCBieSBsb29raW5nIGF0IHRoZSB3aWRnZXQgc3R5bGUuCiAgICAgaW50IGlu
ZGljYXRvclNpemUsIGluZGljYXRvclNwYWNpbmc7Ci0gICAgdGhlbWUtPmdldEluZGljYXRvck1l
dHJpY3MoQ2hlY2tib3hQYXJ0LCBpbmRpY2F0b3JTaXplLCBpbmRpY2F0b3JTcGFjaW5nKTsKKyAg
ICBtb3pfZ3RrX2NoZWNrYm94X2dldF9tZXRyaWNzKCZpbmRpY2F0b3JTaXplLCAmaW5kaWNhdG9y
U3BhY2luZyk7CiAgICAgSW50U2l6ZSBleHRyYVNwYWNlKGluZGljYXRvclNwYWNpbmcsIGluZGlj
YXRvclNwYWNpbmcpOwogCiAgICAgLy8gU2Nyb2xsYmFyIHRodW1icyBuZWVkIGF0IGxlYXN0IGFu
IGV4dHJhIHBpeGVsIGFsb25nIHRoZWlyIG1vdmVtZW50IGF4aXMuCkBAIC04NSwxMSArODUsMTIg
QEAgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dDo6V2lkZ2V0UmVuZGVyaW5nQ29udGV4dChHcmFwaGlj
c0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwKICAgICAsIG1faGFkRXJyb3IoZmFsc2UpCiB7CiAg
ICAgUmVuZGVyVGhlbWVHdGsqIHRoZW1lID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGhlbWVHdGsqPihS
ZW5kZXJUaGVtZTo6ZGVmYXVsdFRoZW1lKCkuZ2V0KCkpOworICAgIEd0a1RoZW1lUGFydHMqIHBh
cnRzID0gbW96X2d0a19nZXRfdGhlbWVfcGFydHMoKTsKIAogICAgIC8vIEZhbGxiYWNrOiBXZSBm
YWlsZWQgdG8gY3JlYXRlIGFuIFJHQkEgY29sb3JtYXAgZWFybGllciwgc28gd2UgY2Fubm90IHBy
b3Blcmx5IHBhaW50IAogICAgIC8vIHRvIGEgdGVtcG9yYXJ5IHN1cmZhY2UgYW5kIHByZXNlcnZl
IHRyYW5zcGFyZW5jeS4gVG8gZW5zdXJlIGRlY2VudCB3aWRnZXQgcmVuZGVyaW5nLCBqdXN0CiAg
ICAgLy8gcGFpbnQgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBkcmF3YWJsZS4gVGhpcyB3aWxsIG5v
dCByZW5kZXIgQ1NTIHJvdGF0aW9uYWwgdHJhbnNmb3JtcyBwcm9wZXJseS4KLSAgICBpZiAoIXRo
ZW1lLT5tX3RoZW1lUGFydHNIYXZlUkdCQUNvbG9ybWFwICYmIGdyYXBoaWNzQ29udGV4dC0+Z2Rr
V2luZG93KCkpIHsKKyAgICBpZiAoIXBhcnRzLT5oYXZlUkdCQUNvbG9ybWFwICYmIGdyYXBoaWNz
Q29udGV4dC0+Z2RrV2luZG93KCkpIHsKICAgICAgICAgbV9wYWludFJlY3QgPSBncmFwaGljc0Nv
bnRleHQtPmdldENUTSgpLm1hcFJlY3QodGFyZ2V0UmVjdCk7CiAgICAgICAgIG1fdGFyZ2V0ID0g
Z3JhcGhpY3NDb250ZXh0LT5nZGtXaW5kb3coKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMTE2LDgg
KzExNyw4IEBAIFdpZGdldFJlbmRlcmluZ0NvbnRleHQ6OldpZGdldFJlbmRlcmluZ0NvbnRleHQo
R3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsCiAgICAgICAgIHdpZHRoID0gKDEgKyAo
d2lkdGggPj4gNSkpIDw8IDU7CiAgICAgICAgIGhlaWdodCA9ICgxICsgKGhlaWdodCA+PiA1KSkg
PDwgNTsKIAotICAgICAgICBnU2NyYXRjaEJ1ZmZlciA9IGdka19waXhtYXBfbmV3KDAsIHdpZHRo
LCBoZWlnaHQsIGdka19jb2xvcm1hcF9nZXRfdmlzdWFsKHRoZW1lLT5tX3RoZW1lUGFydHMuY29s
b3JtYXApLT5kZXB0aCk7Ci0gICAgICAgIGdka19kcmF3YWJsZV9zZXRfY29sb3JtYXAoZ1NjcmF0
Y2hCdWZmZXIsIHRoZW1lLT5tX3RoZW1lUGFydHMuY29sb3JtYXApOworICAgICAgICBnU2NyYXRj
aEJ1ZmZlciA9IGdka19waXhtYXBfbmV3KDAsIHdpZHRoLCBoZWlnaHQsIGdka19jb2xvcm1hcF9n
ZXRfdmlzdWFsKHBhcnRzLT5jb2xvcm1hcCktPmRlcHRoKTsKKyAgICAgICAgZ2RrX2RyYXdhYmxl
X3NldF9jb2xvcm1hcChnU2NyYXRjaEJ1ZmZlciwgcGFydHMtPmNvbG9ybWFwKTsKICAgICB9CiAg
ICAgbV90YXJnZXQgPSBnU2NyYXRjaEJ1ZmZlcjsKIApAQCAtMTMwLDggKzEzMSw4IEBAIFdpZGdl
dFJlbmRlcmluZ0NvbnRleHQ6OldpZGdldFJlbmRlcmluZ0NvbnRleHQoR3JhcGhpY3NDb250ZXh0
KiBncmFwaGljc0NvbnRleHQsCiBXaWRnZXRSZW5kZXJpbmdDb250ZXh0Ojp+V2lkZ2V0UmVuZGVy
aW5nQ29udGV4dCgpCiB7CiAgICAgLy8gV2UgZG8gbm90IG5lZWQgdG8gYmxpdCBiYWNrIHRvIHRo
ZSB0YXJnZXQgaW4gdGhlIGZhbGxiYWNrIGNhc2UuIFNlZSBhYm92ZS4KLSAgICBSZW5kZXJUaGVt
ZUd0ayogdGhlbWUgPSBzdGF0aWNfY2FzdDxSZW5kZXJUaGVtZUd0ayo+KFJlbmRlclRoZW1lOjpk
ZWZhdWx0VGhlbWUoKS5nZXQoKSk7Ci0gICAgaWYgKCF0aGVtZS0+bV90aGVtZVBhcnRzSGF2ZVJH
QkFDb2xvcm1hcCAmJiBtX2dyYXBoaWNzQ29udGV4dC0+Z2RrV2luZG93KCkpCisgICAgR3RrVGhl
bWVQYXJ0cyogcGFydHMgPSBtb3pfZ3RrX2dldF90aGVtZV9wYXJ0cygpOworICAgIGlmICghcGFy
dHMtPmhhdmVSR0JBQ29sb3JtYXAgJiYgbV9ncmFwaGljc0NvbnRleHQtPmdka1dpbmRvdygpKQog
ICAgICAgICByZXR1cm47CiAKICAgICAvLyBEb24ndCBwYWludCB0aGUgcmVzdWx0cyBiYWNrIGlm
IHRoZXJlIHdhcyBhbiBlcnJvci4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1dp
ZGdldFJlbmRlcmluZ0NvbnRleHRHdGszLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL1dpZGdl
dFJlbmRlcmluZ0NvbnRleHRHdGszLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
OTAxMDI2My4uMDAwMDAwMAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9XaWRnZXRSZW5kZXJp
bmdDb250ZXh0R3RrMy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICog
Q29weXJpZ2h0IChDKSAyMDEwIElnYWxpYSBTLkwuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxl
IENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3Rv
biwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0j
aW5jbHVkZSAiV2lkZ2V0UmVuZGVyaW5nQ29udGV4dC5oIgotCi0jaW5jbHVkZSAiR3JhcGhpY3ND
b250ZXh0LmgiCi0jaW5jbHVkZSAiSW50UmVjdC5oIgotCi0jaWZuZGVmIEdUS19BUElfVkVSU0lP
Tl8yCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotV2lkZ2V0UmVuZGVyaW5nQ29udGV4dDo6V2lk
Z2V0UmVuZGVyaW5nQ29udGV4dChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJl
Y3QmIHRhcmdldFJlY3QpCi0gICAgOiBtX2dyYXBoaWNzQ29udGV4dChjb250ZXh0KQotICAgICwg
bV90YXJnZXRSZWN0KHRhcmdldFJlY3QpCi0gICAgLCBtX3BhaW50UmVjdCh0YXJnZXRSZWN0KQot
ICAgICwgbV9oYWRFcnJvcihmYWxzZSkKLSAgICAsIG1fdGFyZ2V0KGNvbnRleHQtPnBsYXRmb3Jt
Q29udGV4dCgpKQotewotfQotCi1XaWRnZXRSZW5kZXJpbmdDb250ZXh0Ojp+V2lkZ2V0UmVuZGVy
aW5nQ29udGV4dCgpCi17Ci19Ci0KLWJvb2wgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dDo6cGFpbnRN
b3ppbGxhV2lkZ2V0KEd0a1RoZW1lV2lkZ2V0VHlwZSB0eXBlLCBHdGtXaWRnZXRTdGF0ZSogc3Rh
dGUsIGludCBmbGFncywgR3RrVGV4dERpcmVjdGlvbiB0ZXh0RGlyZWN0aW9uKQotewotICAgIG1f
aGFkRXJyb3IgPSBtb3pfZ3RrX3dpZGdldF9wYWludCh0eXBlLCBtX3RhcmdldCwgJm1fcGFpbnRS
ZWN0LCBzdGF0ZSwgZmxhZ3MsIHRleHREaXJlY3Rpb24pICE9IE1PWl9HVEtfU1VDQ0VTUzsKLSAg
ICByZXR1cm4gIW1faGFkRXJyb3I7Ci19Ci0KLXZvaWQgV2lkZ2V0UmVuZGVyaW5nQ29udGV4dDo6
Z3RrUGFpbnRCb3goY29uc3QgSW50UmVjdCYgcmVjdCwgR3RrV2lkZ2V0KiB3aWRnZXQsIEd0a1N0
YXRlVHlwZSBzdGF0ZVR5cGUsIEd0a1NoYWRvd1R5cGUgc2hhZG93VHlwZSwgY29uc3QgZ2NoYXIq
IGRldGFpbCkKLXsKLSAgICBHZGtSZWN0YW5nbGUgcGFpbnRSZWN0ID0geyBtX3BhaW50UmVjdC54
ICsgcmVjdC54KCksIG1fcGFpbnRSZWN0LnkgKyByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0
LmhlaWdodCgpIH07Ci0gICAgZ3RrX3BhaW50X2JveChndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRn
ZXQpLCBtX3RhcmdldCwgc3RhdGVUeXBlLCBzaGFkb3dUeXBlLCB3aWRnZXQsCi0gICAgICAgICAg
ICAgICAgICBkZXRhaWwsIHBhaW50UmVjdC54LCBwYWludFJlY3QueSwgcGFpbnRSZWN0LndpZHRo
LCBwYWludFJlY3QuaGVpZ2h0KTsKLX0KLQotdm9pZCBXaWRnZXRSZW5kZXJpbmdDb250ZXh0Ojpn
dGtQYWludEZvY3VzKGNvbnN0IEludFJlY3QmIHJlY3QsIEd0a1dpZGdldCogd2lkZ2V0LCBHdGtT
dGF0ZVR5cGUgc3RhdGVUeXBlLCBjb25zdCBnY2hhciogZGV0YWlsKQotewotICAgIEdka1JlY3Rh
bmdsZSBwYWludFJlY3QgPSB7IG1fcGFpbnRSZWN0LnggKyByZWN0LngoKSwgbV9wYWludFJlY3Qu
eSArIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkgfTsKLSAgICBndGtfcGFp
bnRfZm9jdXMoZ3RrX3dpZGdldF9nZXRfc3R5bGUod2lkZ2V0KSwgbV90YXJnZXQsIHN0YXRlVHlw
ZSwgd2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICBkZXRhaWwsIHBhaW50UmVjdC54LCBwYWlu
dFJlY3QueSwgcGFpbnRSZWN0LndpZHRoLCBwYWludFJlY3QuaGVpZ2h0KTsKLX0KLQotdm9pZCBX
aWRnZXRSZW5kZXJpbmdDb250ZXh0OjpndGtQYWludFNsaWRlcihjb25zdCBJbnRSZWN0JiByZWN0
LCBHdGtXaWRnZXQqIHdpZGdldCwgR3RrU3RhdGVUeXBlIHN0YXRlVHlwZSwgR3RrU2hhZG93VHlw
ZSBzaGFkb3dUeXBlLCBjb25zdCBnY2hhciogZGV0YWlsLCBHdGtPcmllbnRhdGlvbiBvcmllbnRh
dGlvbikKLXsKLSAgICBHZGtSZWN0YW5nbGUgcGFpbnRSZWN0ID0geyBtX3BhaW50UmVjdC54ICsg
cmVjdC54KCksIG1fcGFpbnRSZWN0LnkgKyByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0Lmhl
aWdodCgpIH07Ci0gICAgZ3RrX3BhaW50X3NsaWRlcihndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRn
ZXQpLCBtX3RhcmdldCwgc3RhdGVUeXBlLCBzaGFkb3dUeXBlLCB3aWRnZXQsCi0gICAgICAgICAg
ICAgICAgICAgICBkZXRhaWwsIHBhaW50UmVjdC54LCBwYWludFJlY3QueSwgcGFpbnRSZWN0Lndp
ZHRoLCBwYWludFJlY3QuaGVpZ2h0LCBvcmllbnRhdGlvbik7Ci19Ci0KLSNlbmRpZiAvLyAhR1RL
X0FQSV9WRVJTSU9OXzIKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL2d0azJkcmF3
aW5nLmMgYi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9ndGsyZHJhd2luZy5jCmluZGV4IDNlYmQzMzIu
LmE1Y2ZmODkgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL2d0azJkcmF3aW5nLmMK
KysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvZ3RrMmRyYXdpbmcuYwpAQCAtNjksNiArNjksMTIg
QEAgbW96X2d0a191c2VfdGhlbWVfcGFydHMoR3RrVGhlbWVQYXJ0cyogcGFydHMpCiAgICAgZ1Bh
cnRzID0gcGFydHM7CiB9CiAKK0d0a1RoZW1lUGFydHMqCittb3pfZ3RrX2dldF90aGVtZV9wYXJ0
cyh2b2lkKQoreworICAgIHJldHVybiBnUGFydHM7Cit9CisKIC8qIEJlY2F1c2Ugd2UgaGF2ZSBz
dWNoIGFuIHVuY29udmVudGlvbmFsIHdheSBvZiBkcmF3aW5nIHdpZGdldHMsIHNpZ25hbCB0byB0
aGUgR1RLIHRoZW1lIGVuZ2luZQogICAgdGhhdCB0aGV5IGFyZSBkcmF3aW5nIGZvciBNb3ppbGxh
IGluc3RlYWQgb2YgYSBjb252ZW50aW9uYWwgR1RLIGFwcCBzbyB0aGV5IGNhbiBkbyBhbnkgc3Bl
Y2lmaWMKICAgIHRoaW5ncyB0aGV5IG1heSB3YW50IHRvIGRvLiAqLwpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ndGsvZ3RrM2RyYXdpbmcuYyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3RrL2d0
azNkcmF3aW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYmRkNTYuLjAwMDAw
MDAKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvZ3RrM2RyYXdpbmcuYworKysgL2Rldi9udWxs
CkBAIC0xLDEyODggKzAsMCBAQAotLyogLSotIE1vZGU6IEMrKzsgdGFiLXdpZHRoOiA0OyBpbmRl
bnQtdGFicy1tb2RlOiBuaWw7IGMtYmFzaWMtb2Zmc2V0OiA0IC0qLSAqLwotLyogKioqKiogQkVH
SU4gTElDRU5TRSBCTE9DSyAqKioqKgotICogVmVyc2lvbjogTVBMIDEuMS9HUEwgMi4wL0xHUEwg
Mi4xCi0gKgotICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUg
TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uCi0gKiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5
b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqIHRo
ZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIGh0
dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotICoKLSAqIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVu
ZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsCi0gKiBX
SVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBT
ZWUgdGhlIExpY2Vuc2UKLSAqIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJp
Z2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlCi0gKiBMaWNlbnNlLgotICoKLSAqIFRoZSBP
cmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCi0gKgotICogVGhlIEluaXRpYWwgRGV2
ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCi0gKiBOZXRzY2FwZSBDb21tdW5pY2F0aW9u
cyBDb3Jwb3JhdGlvbi4KLSAqIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxv
cGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDIKLSAqIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxs
IFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBDb250cmlidXRvcihzKToKLSAqICBCcmlhbiBSeW5l
ciA8YnJ5bmVyQGJyaWFucnluZXIuY29tPiAgKE9yaWdpbmFsIEF1dGhvcikKLSAqICBQaWVycmUg
Q2hhbmlhbCA8cF9jaEB2ZXJpem9uLm5ldD4KLSAqICBNaWNoYWVsIFZlbnRub3IgPG0udmVudG5v
ckBnbWFpbC5jb20+Ci0gKiAgQWxwIFRva2VyIDxhbHBAbnVhbnRpLmNvbT4KLSAqCi0gKiBBbHRl
cm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRo
ZSB0ZXJtcyBvZgotICogZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJz
aW9uIDIgb3IgbGF0ZXIgKHRoZSAiR1BMIiksIG9yCi0gKiB0aGUgR05VIExlc3NlciBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4xIG9yIGxhdGVyICh0aGUgIkxHUEwiKSwKLSAqIGlu
IHdoaWNoIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBvciB0aGUgTEdQTCBhcmUgYXBw
bGljYWJsZSBpbnN0ZWFkCi0gKiBvZiB0aG9zZSBhYm92ZS4gSWYgeW91IHdpc2ggdG8gYWxsb3cg
dXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgb25seQotICogdW5kZXIgdGhlIHRlcm1z
IG9mIGVpdGhlciB0aGUgR1BMIG9yIHRoZSBMR1BMLCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0
bwotICogdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBNUEwsIGluZGljYXRlIHlvdXIKLSAqIGRlY2lzaW9uIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNp
b25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCi0gKiBhbmQgb3RoZXIg
cHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMIG9yIHRoZSBMR1BMLiBJZiB5b3UgZG8gbm90
IGRlbGV0ZQotICogdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91
ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlcgotICogdGhlIHRlcm1zIG9mIGFueSBvbmUgb2Yg
dGhlIE1QTCwgdGhlIEdQTCBvciB0aGUgTEdQTC4KLSAqCi0gKiAqKioqKiBFTkQgTElDRU5TRSBC
TE9DSyAqKioqKiAqLwotCi0vKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHBhaW50aW5nIGZ1bmN0
aW9ucyBmb3IgZWFjaCBvZiB0aGUgZ3RrMiB3aWRnZXRzLgotICogQWRhcHRlZCBmcm9tIHRoZSBn
dGtkcmF3aW5nLmMsIGFuZCBndGsrMi4wIHNvdXJjZS4KLSAqLwotCi0jaWZuZGVmIEdUS19BUElf
VkVSU0lPTl8yCi0KLSNpbmNsdWRlIDxnZGsvZ2RrcHJpdmF0ZS5oPgotI2luY2x1ZGUgImd0a2Ry
YXdpbmcuaCIKLSNpbmNsdWRlICJHdGtWZXJzaW9uaW5nLmgiCi0jaW5jbHVkZSA8bWF0aC5oPgot
I2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIFhUSElDS05FU1Moc3R5bGUpIChzdHlsZS0+
eHRoaWNrbmVzcykKLSNkZWZpbmUgWVRISUNLTkVTUyhzdHlsZSkgKHN0eWxlLT55dGhpY2tuZXNz
KQotCi1zdGF0aWMgR3RrVGhlbWVQYXJ0cyAqZ1BhcnRzID0gTlVMTDsKLXN0YXRpYyBzdHlsZV9w
cm9wX3Qgc3R5bGVfcHJvcF9mdW5jOwotc3RhdGljIGdib29sZWFuIGhhdmVfYXJyb3dfc2NhbGlu
ZzsKLXN0YXRpYyBnYm9vbGVhbiBpc19pbml0aWFsaXplZDsKLQotdm9pZAotbW96X2d0a191c2Vf
dGhlbWVfcGFydHMoR3RrVGhlbWVQYXJ0cyogcGFydHMpCi17Ci0gICAgZ1BhcnRzID0gcGFydHM7
Ci19Ci0KLS8qIEJlY2F1c2Ugd2UgaGF2ZSBzdWNoIGFuIHVuY29udmVudGlvbmFsIHdheSBvZiBk
cmF3aW5nIHdpZGdldHMsIHNpZ25hbCB0byB0aGUgR1RLIHRoZW1lIGVuZ2luZQotICAgdGhhdCB0
aGV5IGFyZSBkcmF3aW5nIGZvciBNb3ppbGxhIGluc3RlYWQgb2YgYSBjb252ZW50aW9uYWwgR1RL
IGFwcCBzbyB0aGV5IGNhbiBkbyBhbnkgc3BlY2lmaWMKLSAgIHRoaW5ncyB0aGV5IG1heSB3YW50
IHRvIGRvLiAqLwotc3RhdGljIHZvaWQKLW1vel9ndGtfc2V0X3dpZGdldF9uYW1lKEd0a1dpZGdl
dCogd2lkZ2V0KQotewotICAgIGd0a193aWRnZXRfc2V0X25hbWUod2lkZ2V0LCAiTW96aWxsYUd0
a1dpZGdldCIpOwotfQotCi1naW50Ci1tb3pfZ3RrX2VuYWJsZV9zdHlsZV9wcm9wcyhzdHlsZV9w
cm9wX3Qgc3R5bGVHZXRQcm9wKQotewotICAgIHN0eWxlX3Byb3BfZnVuYyA9IHN0eWxlR2V0UHJv
cDsKLSAgICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwotfQotCi1zdGF0aWMgZ2ludAotZW5zdXJl
X3dpbmRvd193aWRnZXQoKQotewotICAgIGlmICghZ1BhcnRzLT5wcm90b1dpbmRvdykgewotICAg
ICAgICBnUGFydHMtPnByb3RvV2luZG93ID0gZ3RrX3dpbmRvd19uZXcoR1RLX1dJTkRPV19QT1BV
UCk7Ci0gICAgICAgIGd0a193aWRnZXRfcmVhbGl6ZShnUGFydHMtPnByb3RvV2luZG93KTsKLSAg
ICAgICAgbW96X2d0a19zZXRfd2lkZ2V0X25hbWUoZ1BhcnRzLT5wcm90b1dpbmRvdyk7Ci0gICAg
fQotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBnaW50Ci1zZXR1cF93
aWRnZXRfcHJvdG90eXBlKEd0a1dpZGdldCogd2lkZ2V0KQotewotICAgIGVuc3VyZV93aW5kb3df
d2lkZ2V0KCk7Ci0gICAgaWYgKCFnUGFydHMtPnByb3RvTGF5b3V0KSB7Ci0gICAgICAgIGdQYXJ0
cy0+cHJvdG9MYXlvdXQgPSBndGtfZml4ZWRfbmV3KCk7Ci0gICAgICAgIGd0a19jb250YWluZXJf
YWRkKEdUS19DT05UQUlORVIoZ1BhcnRzLT5wcm90b1dpbmRvdyksIGdQYXJ0cy0+cHJvdG9MYXlv
dXQpOwotICAgIH0KLQotICAgIGd0a19jb250YWluZXJfYWRkKEdUS19DT05UQUlORVIoZ1BhcnRz
LT5wcm90b0xheW91dCksIHdpZGdldCk7Ci0gICAgZ3RrX3dpZGdldF9yZWFsaXplKHdpZGdldCk7
Ci0gICAgZ19vYmplY3Rfc2V0X2RhdGEoR19PQkpFQ1Qod2lkZ2V0KSwgInRyYW5zcGFyZW50LWJn
LWhpbnQiLCBHSU5UX1RPX1BPSU5URVIoVFJVRSkpOwotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NF
U1M7Ci19Ci0KLXN0YXRpYyBnaW50Ci1lbnN1cmVfYnV0dG9uX3dpZGdldCgpCi17Ci0gICAgaWYg
KCFnUGFydHMtPmJ1dHRvbldpZGdldCkgewotICAgICAgICBnUGFydHMtPmJ1dHRvbldpZGdldCA9
IGd0a19idXR0b25fbmV3X3dpdGhfbGFiZWwoIk0iKTsKLSAgICAgICAgc2V0dXBfd2lkZ2V0X3By
b3RvdHlwZShnUGFydHMtPmJ1dHRvbldpZGdldCk7Ci0gICAgfQotICAgIHJldHVybiBNT1pfR1RL
X1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBnaW50Ci1lbnN1cmVfdG9nZ2xlX2J1dHRvbl93aWRnZXQo
KQotewotICAgIGlmICghZ1BhcnRzLT50b2dnbGVCdXR0b25XaWRnZXQpIHsKLSAgICAgICAgZ1Bh
cnRzLT50b2dnbGVCdXR0b25XaWRnZXQgPSBndGtfdG9nZ2xlX2J1dHRvbl9uZXcoKTsKLSAgICAg
ICAgc2V0dXBfd2lkZ2V0X3Byb3RvdHlwZShnUGFydHMtPnRvZ2dsZUJ1dHRvbldpZGdldCk7Ci0g
ICAgICAgIC8qIHRvZ2dsZSBidXR0b24gbXVzdCBiZSBzZXQgYWN0aXZlIHRvIGdldCB0aGUgcmln
aHQgc3R5bGUgb24gaG92ZXIuICovCi0gICAgICAgIGd0a190b2dnbGVfYnV0dG9uX3NldF9hY3Rp
dmUoR1RLX1RPR0dMRV9CVVRUT04oZ1BhcnRzLT50b2dnbGVCdXR0b25XaWRnZXQpLCBUUlVFKTsK
LSAgfQotICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwotfQotCi1zdGF0aWMgZ2ludAotZW5zdXJl
X2J1dHRvbl9hcnJvd193aWRnZXQoKQotewotICAgIGlmICghZ1BhcnRzLT5idXR0b25BcnJvd1dp
ZGdldCkgewotICAgICAgICBlbnN1cmVfdG9nZ2xlX2J1dHRvbl93aWRnZXQoKTsKLQotICAgICAg
ICBnUGFydHMtPmJ1dHRvbkFycm93V2lkZ2V0ID0gZ3RrX2Fycm93X25ldyhHVEtfQVJST1dfRE9X
TiwgR1RLX1NIQURPV19PVVQpOwotICAgICAgICBndGtfY29udGFpbmVyX2FkZChHVEtfQ09OVEFJ
TkVSKGdQYXJ0cy0+dG9nZ2xlQnV0dG9uV2lkZ2V0KSwgZ1BhcnRzLT5idXR0b25BcnJvd1dpZGdl
dCk7Ci0gICAgICAgIGd0a193aWRnZXRfcmVhbGl6ZShnUGFydHMtPmJ1dHRvbkFycm93V2lkZ2V0
KTsKLSAgICB9Ci0gICAgcmV0dXJuIE1PWl9HVEtfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGdpbnQK
LWVuc3VyZV9jaGVja2JveF93aWRnZXQoKQotewotICAgIGlmICghZ1BhcnRzLT5jaGVja2JveFdp
ZGdldCkgewotICAgICAgICBnUGFydHMtPmNoZWNrYm94V2lkZ2V0ID0gZ3RrX2NoZWNrX2J1dHRv
bl9uZXdfd2l0aF9sYWJlbCgiTSIpOwotICAgICAgICBzZXR1cF93aWRnZXRfcHJvdG90eXBlKGdQ
YXJ0cy0+Y2hlY2tib3hXaWRnZXQpOwotICAgIH0KLSAgICByZXR1cm4gTU9aX0dUS19TVUNDRVNT
OwotfQotCi1zdGF0aWMgZ2ludAotZW5zdXJlX3JhZGlvYnV0dG9uX3dpZGdldCgpCi17Ci0gICAg
aWYgKCFnUGFydHMtPnJhZGlvYnV0dG9uV2lkZ2V0KSB7Ci0gICAgICAgIGdQYXJ0cy0+cmFkaW9i
dXR0b25XaWRnZXQgPSBndGtfcmFkaW9fYnV0dG9uX25ld193aXRoX2xhYmVsKE5VTEwsICJNIik7
Ci0gICAgICAgIHNldHVwX3dpZGdldF9wcm90b3R5cGUoZ1BhcnRzLT5yYWRpb2J1dHRvbldpZGdl
dCk7Ci0gICAgfQotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBnaW50
Ci1lbnN1cmVfc2Nyb2xsYmFyX3dpZGdldCgpCi17Ci0gICAgaWYgKCFnUGFydHMtPnZlcnRTY3Jv
bGxiYXJXaWRnZXQpIHsKLSAgICAgICAgZ1BhcnRzLT52ZXJ0U2Nyb2xsYmFyV2lkZ2V0ID0gZ3Rr
X3ZzY3JvbGxiYXJfbmV3KE5VTEwpOwotICAgICAgICBzZXR1cF93aWRnZXRfcHJvdG90eXBlKGdQ
YXJ0cy0+dmVydFNjcm9sbGJhcldpZGdldCk7Ci0gICAgfQotICAgIGlmICghZ1BhcnRzLT5ob3Jp
elNjcm9sbGJhcldpZGdldCkgewotICAgICAgICBnUGFydHMtPmhvcml6U2Nyb2xsYmFyV2lkZ2V0
ID0gZ3RrX2hzY3JvbGxiYXJfbmV3KE5VTEwpOwotICAgICAgICBzZXR1cF93aWRnZXRfcHJvdG90
eXBlKGdQYXJ0cy0+aG9yaXpTY3JvbGxiYXJXaWRnZXQpOwotICAgIH0KLSAgICByZXR1cm4gTU9a
X0dUS19TVUNDRVNTOwotfQotCi1zdGF0aWMgZ2ludAotZW5zdXJlX2VudHJ5X3dpZGdldCgpCi17
Ci0gICAgaWYgKCFnUGFydHMtPmVudHJ5V2lkZ2V0KSB7Ci0gICAgICAgIGdQYXJ0cy0+ZW50cnlX
aWRnZXQgPSBndGtfZW50cnlfbmV3KCk7Ci0gICAgICAgIHNldHVwX3dpZGdldF9wcm90b3R5cGUo
Z1BhcnRzLT5lbnRyeVdpZGdldCk7Ci0gICAgfQotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7
Ci19Ci0KLS8qIFdlIG5lZWQgdG8gaGF2ZSBwb2ludGVycyB0byB0aGUgaW5uZXIgd2lkZ2V0cyAo
YnV0dG9uLCBzZXBhcmF0b3IsIGFycm93KQotICogb2YgdGhlIENvbWJvQm94IHRvIGdldCB0aGUg
Y29ycmVjdCByZW5kZXJpbmcgZnJvbSB0aGVtZSBlbmdpbmVzIHdoaWNoCi0gKiBzcGVjaWFsIGNh
c2VzIHRoZWlyIGxvb2suIFNpbmNlIHRoZSBpbm5lciBsYXlvdXQgY2FuIGNoYW5nZSwgd2UgYXNr
IEdUSwotICogdG8gTlVMTCBvdXIgcG9pbnRlcnMgd2hlbiB0aGV5IGFyZSBhYm91dCB0byBiZWNv
bWUgaW52YWxpZCBiZWNhdXNlIHRoZQotICogY29ycmVzcG9uZGluZyB3aWRnZXRzIGRvbid0IGV4
aXN0IGFueW1vcmUuIEl0J3MgdGhlIHJvbGUgb2YKLSAqIGdfb2JqZWN0X2FkZF93ZWFrX3BvaW50
ZXIoKS4KLSAqIE5vdGUgdGhhdCBpZiB3ZSBkb24ndCBmaW5kIHRoZSBpbm5lciB3aWRnZXRzICh3
aGljaCBzaG91bGRuJ3QgaGFwcGVuKSwgd2UKLSAqIGZhbGxiYWNrIHRvIHVzZSBnZW5lcmljICJu
b24taW5uZXIiIHdpZGdldHMsIGFuZCB0aGV5IGRvbid0IG5lZWQgdGhhdCBraW5kCi0gKiBvZiB3
ZWFrIHBvaW50ZXIgc2luY2UgdGhleSBhcmUgZXhwbGljaXQgY2hpbGRyZW4gb2YgZ1BhcnRzLT5w
cm90b1dpbmRvdyBhbmQgYXMKLSAqIHN1Y2ggR1RLIGhvbGRzIGEgc3Ryb25nIHJlZmVyZW5jZSB0
byB0aGVtLiAqLwotc3RhdGljIHZvaWQKLW1vel9ndGtfZ2V0X2NvbWJvX2JveF9pbm5lcl9idXR0
b24oR3RrV2lkZ2V0ICp3aWRnZXQsIGdwb2ludGVyIGNsaWVudF9kYXRhKQotewotICAgIGlmIChH
VEtfSVNfVE9HR0xFX0JVVFRPTih3aWRnZXQpKSB7Ci0gICAgICAgIGdQYXJ0cy0+Y29tYm9Cb3hC
dXR0b25XaWRnZXQgPSB3aWRnZXQ7Ci0gICAgICAgIGdfb2JqZWN0X2FkZF93ZWFrX3BvaW50ZXIo
R19PQkpFQ1Qod2lkZ2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3Bv
aW50ZXIpICZnUGFydHMtPmNvbWJvQm94QnV0dG9uV2lkZ2V0KTsKLSAgICAgICAgZ3RrX3dpZGdl
dF9yZWFsaXplKHdpZGdldCk7Ci0gICAgICAgIGdfb2JqZWN0X3NldF9kYXRhKEdfT0JKRUNUKHdp
ZGdldCksICJ0cmFuc3BhcmVudC1iZy1oaW50IiwgR0lOVF9UT19QT0lOVEVSKFRSVUUpKTsKLSAg
ICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1tb3pfZ3RrX2dldF9jb21ib19ib3hfYnV0dG9uX2lubmVy
X3dpZGdldHMoR3RrV2lkZ2V0ICp3aWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZ3BvaW50ZXIgY2xpZW50X2RhdGEpCi17Ci0gICAgaWYgKEdUS19JU19T
RVBBUkFUT1Iod2lkZ2V0KSkgewotICAgICAgICBnUGFydHMtPmNvbWJvQm94U2VwYXJhdG9yV2lk
Z2V0ID0gd2lkZ2V0OwotICAgICAgICBnX29iamVjdF9hZGRfd2Vha19wb2ludGVyKEdfT0JKRUNU
KHdpZGdldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdwb2ludGVyKSAm
Z1BhcnRzLT5jb21ib0JveFNlcGFyYXRvcldpZGdldCk7Ci0gICAgfSBlbHNlIGlmIChHVEtfSVNf
QVJST1cod2lkZ2V0KSkgewotICAgICAgICBnUGFydHMtPmNvbWJvQm94QXJyb3dXaWRnZXQgPSB3
aWRnZXQ7Ci0gICAgICAgIGdfb2JqZWN0X2FkZF93ZWFrX3BvaW50ZXIoR19PQkpFQ1Qod2lkZ2V0
KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3BvaW50ZXIpICZnUGFydHMt
PmNvbWJvQm94QXJyb3dXaWRnZXQpOwotICAgIH0gZWxzZQotICAgICAgICByZXR1cm47Ci0gICAg
Z3RrX3dpZGdldF9yZWFsaXplKHdpZGdldCk7Ci0gICAgZ19vYmplY3Rfc2V0X2RhdGEoR19PQkpF
Q1Qod2lkZ2V0KSwgInRyYW5zcGFyZW50LWJnLWhpbnQiLCBHSU5UX1RPX1BPSU5URVIoVFJVRSkp
OwotfQotCi1zdGF0aWMgZ2ludAotZW5zdXJlX2NvbWJvX2JveF93aWRnZXRzKCkKLXsKLSAgICBH
dGtXaWRnZXQqIGJ1dHRvbkNoaWxkOwotCi0gICAgaWYgKGdQYXJ0cy0+Y29tYm9Cb3hCdXR0b25X
aWRnZXQgJiYgZ1BhcnRzLT5jb21ib0JveEFycm93V2lkZ2V0KQotICAgICAgICByZXR1cm4gTU9a
X0dUS19TVUNDRVNTOwotCi0gICAgLyogQ3JlYXRlIGEgQ29tYm9Cb3ggaWYgbmVlZGVkICovCi0g
ICAgaWYgKCFnUGFydHMtPmNvbWJvQm94V2lkZ2V0KSB7Ci0gICAgICAgIGdQYXJ0cy0+Y29tYm9C
b3hXaWRnZXQgPSBndGtfY29tYm9fYm94X25ldygpOwotICAgICAgICBzZXR1cF93aWRnZXRfcHJv
dG90eXBlKGdQYXJ0cy0+Y29tYm9Cb3hXaWRnZXQpOwotICAgIH0KLQotICAgIC8qIEdldCBpdHMg
aW5uZXIgQnV0dG9uICovCi0gICAgZ3RrX2NvbnRhaW5lcl9mb3JhbGwoR1RLX0NPTlRBSU5FUihn
UGFydHMtPmNvbWJvQm94V2lkZ2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtb3pfZ3Rr
X2dldF9jb21ib19ib3hfaW5uZXJfYnV0dG9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIE5V
TEwpOwotCi0gICAgaWYgKGdQYXJ0cy0+Y29tYm9Cb3hCdXR0b25XaWRnZXQpIHsKLSAgICAgICAg
LyogR2V0IHRoZSB3aWRnZXRzIGluc2lkZSB0aGUgQnV0dG9uICovCi0gICAgICAgIGJ1dHRvbkNo
aWxkID0gZ3RrX2Jpbl9nZXRfY2hpbGQoR1RLX0JJTihnUGFydHMtPmNvbWJvQm94QnV0dG9uV2lk
Z2V0KSk7Ci0gICAgICAgIGlmIChHVEtfSVNfSEJPWChidXR0b25DaGlsZCkpIHsKLSAgICAgICAg
ICAgIC8qIGFwcGVhcnMtYXMtbGlzdCA9IEZBTFNFLCBjZWxsLXZpZXcgPSBUUlVFOyB0aGUgYnV0
dG9uCi0gICAgICAgICAgICAgKiBjb250YWlucyBhbiBoYm94LiBUaGlzIGhib3ggaXMgdGhlcmUg
YmVjYXVzZSB0aGUgQ29tYm9Cb3gKLSAgICAgICAgICAgICAqIG5lZWRzIHRvIHBsYWNlIGEgY2Vs
bCByZW5kZXJlciwgYSBzZXBhcmF0b3IsIGFuZCBhbiBhcnJvdyBpbgotICAgICAgICAgICAgICog
dGhlIGJ1dHRvbiB3aGVuIGFwcGVhcnMtYXMtbGlzdCBpcyBGQUxTRS4gKi8KLSAgICAgICAgICAg
IGd0a19jb250YWluZXJfZm9yYWxsKEdUS19DT05UQUlORVIoYnV0dG9uQ2hpbGQpLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbW96X2d0a19nZXRfY29tYm9fYm94X2J1dHRvbl9p
bm5lcl93aWRnZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0g
ICAgICAgIH0gZWxzZSBpZihHVEtfSVNfQVJST1coYnV0dG9uQ2hpbGQpKSB7Ci0gICAgICAgICAg
ICAvKiBhcHBlYXJzLWFzLWxpc3QgPSBUUlVFLCBvciBjZWxsLXZpZXcgPSBGQUxTRTsKLSAgICAg
ICAgICAgICAqIHRoZSBidXR0b24gb25seSBjb250YWlucyBhbiBhcnJvdyAqLwotICAgICAgICAg
ICAgZ1BhcnRzLT5jb21ib0JveEFycm93V2lkZ2V0ID0gYnV0dG9uQ2hpbGQ7Ci0gICAgICAgICAg
ICBnX29iamVjdF9hZGRfd2Vha19wb2ludGVyKEdfT0JKRUNUKGJ1dHRvbkNoaWxkKSwgKGdwb2lu
dGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ1BhcnRzLT5jb21i
b0JveEFycm93V2lkZ2V0KTsKLSAgICAgICAgICAgIGd0a193aWRnZXRfcmVhbGl6ZShnUGFydHMt
PmNvbWJvQm94QXJyb3dXaWRnZXQpOwotICAgICAgICAgICAgZ19vYmplY3Rfc2V0X2RhdGEoR19P
QkpFQ1QoZ1BhcnRzLT5jb21ib0JveEFycm93V2lkZ2V0KSwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJ0cmFuc3BhcmVudC1iZy1oaW50IiwgR0lOVF9UT19QT0lOVEVSKFRSVUUpKTsK
LSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFNob3VsZG4ndCBiZSByZWFjaGVk
IHdpdGggY3VycmVudCBpbnRlcm5hbCBndGsgaW1wbGVtZW50YXRpb247IHdlCi0gICAgICAgICAq
IHVzZSBhIGdlbmVyaWMgdG9nZ2xlIGJ1dHRvbiBhcyBsYXN0IHJlc29ydCBmYWxsYmFjayB0byBh
dm9pZAotICAgICAgICAgKiBjcmFzaGluZy4gKi8KLSAgICAgICAgZW5zdXJlX3RvZ2dsZV9idXR0
b25fd2lkZ2V0KCk7Ci0gICAgICAgIGdQYXJ0cy0+Y29tYm9Cb3hCdXR0b25XaWRnZXQgPSBnUGFy
dHMtPnRvZ2dsZUJ1dHRvbldpZGdldDsKLSAgICB9Ci0KLSAgICBpZiAoIWdQYXJ0cy0+Y29tYm9C
b3hBcnJvd1dpZGdldCkgewotICAgICAgICAvKiBTaG91bGRuJ3QgYmUgcmVhY2hlZCB3aXRoIGN1
cnJlbnQgaW50ZXJuYWwgZ3RrIGltcGxlbWVudGF0aW9uOwotICAgICAgICAgKiB3ZSBnUGFydHMt
PmJ1dHRvbkFycm93V2lkZ2V0IGFzIGxhc3QgcmVzb3J0IGZhbGxiYWNrIHRvIGF2b2lkCi0gICAg
ICAgICAqIGNyYXNoaW5nLiAqLwotICAgICAgICBlbnN1cmVfYnV0dG9uX2Fycm93X3dpZGdldCgp
OwotICAgICAgICBnUGFydHMtPmNvbWJvQm94QXJyb3dXaWRnZXQgPSBnUGFydHMtPmJ1dHRvbkFy
cm93V2lkZ2V0OwotICAgIH0KLQotICAgIC8qIFdlIGRvbid0IHRlc3QgdGhlIHZhbGlkaXR5IG9m
IGdQYXJ0cy0+Y29tYm9Cb3hTZXBhcmF0b3JXaWRnZXQgc2luY2UgdGhlcmUKLSAgICAgKiBpcyBu
b25lIHdoZW4gImFwcGVhcnMtYXMtbGlzdCIgPSBUUlVFIG9yICJjZWxsLXZpZXciID0gRkFMU0U7
IGlmIGl0Ci0gICAgICogaXMgaW52YWxpZCB3ZSBqdXN0IHdvbid0IHBhaW50IGl0LiAqLwotCi0g
ICAgcmV0dXJuIE1PWl9HVEtfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGdpbnQKLWVuc3VyZV9wcm9n
cmVzc193aWRnZXQoKQotewotICAgIGlmICghZ1BhcnRzLT5wcm9ncmVzV2lkZ2V0KSB7Ci0gICAg
ICAgIGdQYXJ0cy0+cHJvZ3Jlc1dpZGdldCA9IGd0a19wcm9ncmVzc19iYXJfbmV3KCk7Ci0gICAg
ICAgIHNldHVwX3dpZGdldF9wcm90b3R5cGUoZ1BhcnRzLT5wcm9ncmVzV2lkZ2V0KTsKLSAgICB9
Ci0gICAgcmV0dXJuIE1PWl9HVEtfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGdpbnQKLWVuc3VyZV9z
Y3JvbGxlZF93aW5kb3dfd2lkZ2V0KCkKLXsKLSAgICBpZiAoIWdQYXJ0cy0+c2Nyb2xsZWRXaW5k
b3dXaWRnZXQpIHsKLSAgICAgICAgZ1BhcnRzLT5zY3JvbGxlZFdpbmRvd1dpZGdldCA9IGd0a19z
Y3JvbGxlZF93aW5kb3dfbmV3KE5VTEwsIE5VTEwpOwotICAgICAgICBzZXR1cF93aWRnZXRfcHJv
dG90eXBlKGdQYXJ0cy0+c2Nyb2xsZWRXaW5kb3dXaWRnZXQpOwotICAgIH0KLSAgICByZXR1cm4g
TU9aX0dUS19TVUNDRVNTOwotfQotCi1zdGF0aWMgR3RrU3RhdGVUeXBlCi1Db252ZXJ0R3RrU3Rh
dGUoR3RrV2lkZ2V0U3RhdGUqIHN0YXRlKQotewotICAgIGlmIChzdGF0ZS0+ZGlzYWJsZWQpCi0g
ICAgICAgIHJldHVybiBHVEtfU1RBVEVfSU5TRU5TSVRJVkU7Ci0gICAgZWxzZSBpZiAoc3RhdGUt
PmRlcHJlc3NlZCkKLSAgICAgICAgcmV0dXJuIChzdGF0ZS0+aW5Ib3ZlciA/IEdUS19TVEFURV9Q
UkVMSUdIVCA6IEdUS19TVEFURV9BQ1RJVkUpOwotICAgIGVsc2UgaWYgKHN0YXRlLT5pbkhvdmVy
KQotICAgICAgICByZXR1cm4gKHN0YXRlLT5hY3RpdmUgPyBHVEtfU1RBVEVfQUNUSVZFIDogR1RL
X1NUQVRFX1BSRUxJR0hUKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBHVEtfU1RBVEVfTk9S
TUFMOwotfQotCi1zdGF0aWMgZ2ludAotbW96X2d0a19idXR0b25fcGFpbnQoY2Fpcm9fdCogY3Is
IEdka1JlY3RhbmdsZSogcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgIEd0a1dpZGdldFN0YXRl
KiBzdGF0ZSwgR3RrUmVsaWVmU3R5bGUgcmVsaWVmLAotICAgICAgICAgICAgICAgICAgICAgR3Rr
V2lkZ2V0KiB3aWRnZXQsIEd0a1RleHREaXJlY3Rpb24gZGlyZWN0aW9uKQotewotICAgIEd0a1No
YWRvd1R5cGUgc2hhZG93X3R5cGU7Ci0gICAgR3RrU3R5bGUqIHN0eWxlID0gZ3RrX3dpZGdldF9n
ZXRfc3R5bGUod2lkZ2V0KTsKLSAgICBHdGtTdGF0ZVR5cGUgYnV0dG9uX3N0YXRlID0gQ29udmVy
dEd0a1N0YXRlKHN0YXRlKTsKLSAgICBnaW50IHggPSByZWN0LT54LCB5PXJlY3QtPnksIHdpZHRo
PXJlY3QtPndpZHRoLCBoZWlnaHQ9cmVjdC0+aGVpZ2h0OwotICAgIEdka1dpbmRvdyogd2luZG93
ID0gZ3RrX3dpZGdldF9nZXRfd2luZG93KHdpZGdldCk7Ci0KLSAgICBnYm9vbGVhbiBpbnRlcmlv
cl9mb2N1czsKLSAgICBnaW50IGZvY3VzX3dpZHRoLCBmb2N1c19wYWQ7Ci0KLSAgICBtb3pfZ3Rr
X3dpZGdldF9nZXRfZm9jdXMod2lkZ2V0LCAmaW50ZXJpb3JfZm9jdXMsICZmb2N1c193aWR0aCwg
JmZvY3VzX3BhZCk7Ci0KLSAgICBpZiAod2luZG93ICYmIGdka193aW5kb3dfaXNfdmlzaWJsZSh3
aW5kb3cpKSB7Ci0gICAgICAgIGdka193aW5kb3dfc2V0X2JhY2tncm91bmRfcGF0dGVybih3aW5k
b3csIE5VTEwpOwotICAgIH0KLQotICAgIGd0a193aWRnZXRfc2V0X3N0YXRlKHdpZGdldCwgYnV0
dG9uX3N0YXRlKTsKLSAgICBndGtfd2lkZ2V0X3NldF9kaXJlY3Rpb24od2lkZ2V0LCBkaXJlY3Rp
b24pOwotICAgIGd0a19idXR0b25fc2V0X3JlbGllZihHVEtfQlVUVE9OKHdpZGdldCksIHJlbGll
Zik7Ci0KLSAgICBpZiAoIWludGVyaW9yX2ZvY3VzICYmIHN0YXRlLT5mb2N1c2VkKSB7Ci0gICAg
ICAgIHggKz0gZm9jdXNfd2lkdGggKyBmb2N1c19wYWQ7Ci0gICAgICAgIHkgKz0gZm9jdXNfd2lk
dGggKyBmb2N1c19wYWQ7Ci0gICAgICAgIHdpZHRoIC09IDIgKiAoZm9jdXNfd2lkdGggKyBmb2N1
c19wYWQpOwotICAgICAgICBoZWlnaHQgLT0gMiAqIChmb2N1c193aWR0aCArIGZvY3VzX3BhZCk7
Ci0gICAgfQotCi0gICAgc2hhZG93X3R5cGUgPSBidXR0b25fc3RhdGUgPT0gR1RLX1NUQVRFX0FD
VElWRSB8fAotICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5kZXByZXNzZWQgPyBHVEtfU0hB
RE9XX0lOIDogR1RLX1NIQURPV19PVVQ7Ci0KLSAgICBpZiAoc3RhdGUtPmlzRGVmYXVsdCAmJiBy
ZWxpZWYgPT0gR1RLX1JFTElFRl9OT1JNQUwpIHsKLSAgICAgICAgZ3RrX3BhaW50X2JveChzdHls
ZSwgY3IsIGJ1dHRvbl9zdGF0ZSwgc2hhZG93X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAg
d2lkZ2V0LCAiYnV0dG9uZGVmYXVsdCIsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLQot
ICAgIGlmIChyZWxpZWYgIT0gR1RLX1JFTElFRl9OT05FIHx8IHN0YXRlLT5kZXByZXNzZWQgfHwK
LSAgICAgICAgICAgKGJ1dHRvbl9zdGF0ZSAhPSBHVEtfU1RBVEVfTk9STUFMICYmCi0gICAgICAg
ICAgICBidXR0b25fc3RhdGUgIT0gR1RLX1NUQVRFX0lOU0VOU0lUSVZFKSkgewotICAgICAgICAv
KiB0aGUgZm9sbG93aW5nIGxpbmUgY2FuIHRyaWdnZXIgYW4gYXNzZXJ0aW9uIChDcnV4IHRoZW1l
KQotICAgICAgICAgICBmaWxlIC4uLy4uL2dkay9nZGt3aW5kb3cuYzogbGluZSAxODQ2IChnZGtf
d2luZG93X2NsZWFyX2FyZWEpOgotICAgICAgICAgICBhc3NlcnRpb24gYEdES19JU19XSU5ET1cg
KHdpbmRvdyknIGZhaWxlZCAqLwotICAgICAgICBndGtfcGFpbnRfYm94KHN0eWxlLCBjciwgYnV0
dG9uX3N0YXRlLCBzaGFkb3dfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQsICJi
dXR0b24iLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdGUtPmZv
Y3VzZWQpIHsKLSAgICAgICAgaWYgKGludGVyaW9yX2ZvY3VzKSB7Ci0gICAgICAgICAgICBHdGtT
dHlsZSogc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpOwotICAgICAgICAgICAg
eCArPSBzdHlsZS0+eHRoaWNrbmVzcyArIGZvY3VzX3BhZDsKLSAgICAgICAgICAgIHkgKz0gc3R5
bGUtPnl0aGlja25lc3MgKyBmb2N1c19wYWQ7Ci0gICAgICAgICAgICB3aWR0aCAtPSAyICogKHN0
eWxlLT54dGhpY2tuZXNzICsgZm9jdXNfcGFkKTsKLSAgICAgICAgICAgIGhlaWdodCAtPSAyICog
KHN0eWxlLT55dGhpY2tuZXNzICsgZm9jdXNfcGFkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAgIHggLT0gZm9jdXNfd2lkdGggKyBmb2N1c19wYWQ7Ci0gICAgICAgICAgICB5IC09IGZv
Y3VzX3dpZHRoICsgZm9jdXNfcGFkOwotICAgICAgICAgICAgd2lkdGggKz0gMiAqIChmb2N1c193
aWR0aCArIGZvY3VzX3BhZCk7Ci0gICAgICAgICAgICBoZWlnaHQgKz0gMiAqIChmb2N1c193aWR0
aCArIGZvY3VzX3BhZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBndGtfcGFpbnRfZm9jdXMoc3R5
bGUsIGNyLCBidXR0b25fc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQsICJi
dXR0b24iLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTU9aX0dU
S19TVUNDRVNTOwotfQotCi1naW50Ci1tb3pfZ3RrX2luaXQoKQotewotICAgIEd0a1dpZGdldENs
YXNzICplbnRyeV9jbGFzczsKLQotICAgIGlzX2luaXRpYWxpemVkID0gVFJVRTsKLSAgICBoYXZl
X2Fycm93X3NjYWxpbmcgPSAoZ3RrX21ham9yX3ZlcnNpb24gPiAyIHx8Ci0gICAgICAgICAgICAg
ICAgICAgICAgICAgIChndGtfbWFqb3JfdmVyc2lvbiA9PSAyICYmIGd0a19taW5vcl92ZXJzaW9u
ID49IDEyKSk7Ci0KLSAgICAvKiBBZGQgc3R5bGUgcHJvcGVydHkgdG8gR3RrRW50cnkuCi0gICAg
ICogQWRkaW5nIHRoZSBzdHlsZSBwcm9wZXJ0eSB0byB0aGUgbm9ybWFsIEd0a0VudHJ5IGNsYXNz
IG1lYW5zIHRoYXQgaXQKLSAgICAgKiB3aWxsIHdvcmsgd2l0aG91dCBpc3N1ZXMgaW5zaWRlIEd0
a0NvbWJvQm94IGFuZCBmb3IgU3BpbmJ1dHRvbnMuICovCi0gICAgZW50cnlfY2xhc3MgPSBnX3R5
cGVfY2xhc3NfcmVmKEdUS19UWVBFX0VOVFJZKTsKLSAgICBndGtfd2lkZ2V0X2NsYXNzX2luc3Rh
bGxfc3R5bGVfcHJvcGVydHkoZW50cnlfY2xhc3MsCi0gICAgICAgIGdfcGFyYW1fc3BlY19ib29s
ZWFuKCJob25vcnMtdHJhbnNwYXJlbnQtYmctaGludCIsCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICJUcmFuc3BhcmVudCBCRyBlbmFibGluZyBmbGFnIiwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIklmIFRSVUUsIHRoZSB0aGVtZSBpcyBhYmxlIHRvIGRyYXcgdGhlIEd0a0Vu
dHJ5IG9uIG5vbi1wcmVmaWxsZWQgYmFja2dyb3VuZC4iLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBGQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR19QQVJBTV9SRUFE
V1JJVEUpKTsKLQotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19Ci0KLWdpbnQKLW1vel9n
dGtfY2hlY2tib3hfZ2V0X21ldHJpY3MoZ2ludCogaW5kaWNhdG9yX3NpemUsIGdpbnQqIGluZGlj
YXRvcl9zcGFjaW5nKQotewotICAgIGVuc3VyZV9jaGVja2JveF93aWRnZXQoKTsKLQotICAgIGd0
a193aWRnZXRfc3R5bGVfZ2V0IChnUGFydHMtPmNoZWNrYm94V2lkZ2V0LAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAiaW5kaWNhdG9yX3NpemUiLCBpbmRpY2F0b3Jfc2l6ZSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgImluZGljYXRvcl9zcGFjaW5nIiwgaW5kaWNhdG9yX3NwYWNpbmcs
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotCi0gICAgcmV0dXJuIE1PWl9HVEtf
U1VDQ0VTUzsKLX0KLQotZ2ludAotbW96X2d0a19yYWRpb19nZXRfbWV0cmljcyhnaW50KiBpbmRp
Y2F0b3Jfc2l6ZSwgZ2ludCogaW5kaWNhdG9yX3NwYWNpbmcpCi17Ci0gICAgZW5zdXJlX3JhZGlv
YnV0dG9uX3dpZGdldCgpOwotCi0gICAgZ3RrX3dpZGdldF9zdHlsZV9nZXQgKGdQYXJ0cy0+cmFk
aW9idXR0b25XaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRpY2F0b3Jfc2l6
ZSIsIGluZGljYXRvcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kaWNhdG9y
X3NwYWNpbmciLCBpbmRpY2F0b3Jfc3BhY2luZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
TlVMTCk7Ci0KLSAgICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwotfQotCi1naW50Ci1tb3pfZ3Rr
X3dpZGdldF9nZXRfZm9jdXMoR3RrV2lkZ2V0KiB3aWRnZXQsIGdib29sZWFuKiBpbnRlcmlvcl9m
b2N1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBnaW50KiBmb2N1c193aWR0aCwgZ2ludCog
Zm9jdXNfcGFkKQotewotICAgIGd0a193aWRnZXRfc3R5bGVfZ2V0ICh3aWRnZXQsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICJpbnRlcmlvci1mb2N1cyIsIGludGVyaW9yX2ZvY3VzLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAiZm9jdXMtbGluZS13aWR0aCIsIGZvY3VzX3dpZHRoLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9jdXMtcGFkZGluZyIsIGZvY3VzX3BhZCwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgICByZXR1cm4gTU9aX0dUS19TVUND
RVNTOwotfQotCi1naW50Ci1tb3pfZ3RrX2J1dHRvbl9nZXRfaW5uZXJfYm9yZGVyKEd0a1dpZGdl
dCogd2lkZ2V0LCBHdGtCb3JkZXIqIGlubmVyX2JvcmRlcikKLXsKLSAgICBzdGF0aWMgY29uc3Qg
R3RrQm9yZGVyIGRlZmF1bHRfaW5uZXJfYm9yZGVyID0geyAxLCAxLCAxLCAxIH07Ci0gICAgR3Rr
Qm9yZGVyICp0bXBfYm9yZGVyOwotCi0gICAgZ3RrX3dpZGdldF9zdHlsZV9nZXQgKHdpZGdldCwg
ImlubmVyLWJvcmRlciIsICZ0bXBfYm9yZGVyLCBOVUxMKTsKLQotICAgIGlmICh0bXBfYm9yZGVy
KSB7Ci0gICAgICAgICppbm5lcl9ib3JkZXIgPSAqdG1wX2JvcmRlcjsKLSAgICAgICAgZ3RrX2Jv
cmRlcl9mcmVlKHRtcF9ib3JkZXIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgICppbm5lcl9i
b3JkZXIgPSBkZWZhdWx0X2lubmVyX2JvcmRlcjsKLQotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NF
U1M7Ci19Ci0KLXN0YXRpYyBnaW50Ci1tb3pfZ3RrX3RvZ2dsZV9wYWludChjYWlyb190KiBjciwg
R2RrUmVjdGFuZ2xlKiByZWN0LAotICAgICAgICAgICAgICAgICAgICAgR3RrV2lkZ2V0U3RhdGUq
IHN0YXRlLCBnYm9vbGVhbiBzZWxlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgIGdib29sZWFu
IGluY29uc2lzdGVudCwgZ2Jvb2xlYW4gaXNyYWRpbywKLSAgICAgICAgICAgICAgICAgICAgIEd0
a1RleHREaXJlY3Rpb24gZGlyZWN0aW9uKQotewotICAgIEd0a1N0YXRlVHlwZSBzdGF0ZV90eXBl
ID0gQ29udmVydEd0a1N0YXRlKHN0YXRlKTsKLSAgICBHdGtTaGFkb3dUeXBlIHNoYWRvd190eXBl
ID0gKHNlbGVjdGVkKT9HVEtfU0hBRE9XX0lOOkdUS19TSEFET1dfT1VUOwotICAgIGdpbnQgaW5k
aWNhdG9yX3NpemUsIGluZGljYXRvcl9zcGFjaW5nOwotICAgIGdpbnQgeCwgeSwgd2lkdGgsIGhl
aWdodDsKLSAgICBnaW50IGZvY3VzX3gsIGZvY3VzX3ksIGZvY3VzX3dpZHRoLCBmb2N1c19oZWln
aHQ7Ci0gICAgR3RrV2lkZ2V0ICp3OwotICAgIEd0a1N0eWxlICpzdHlsZTsKLQotICAgIGlmIChp
c3JhZGlvKSB7Ci0gICAgICAgIG1vel9ndGtfcmFkaW9fZ2V0X21ldHJpY3MoJmluZGljYXRvcl9z
aXplLCAmaW5kaWNhdG9yX3NwYWNpbmcpOwotICAgICAgICB3ID0gZ1BhcnRzLT5yYWRpb2J1dHRv
bldpZGdldDsKLSAgICB9IGVsc2UgewotICAgICAgICBtb3pfZ3RrX2NoZWNrYm94X2dldF9tZXRy
aWNzKCZpbmRpY2F0b3Jfc2l6ZSwgJmluZGljYXRvcl9zcGFjaW5nKTsKLSAgICAgICAgdyA9IGdQ
YXJ0cy0+Y2hlY2tib3hXaWRnZXQ7Ci0gICAgfQotCi0gICAgLy8gIkdldE1pbmltdW1XaWRnZXRT
aXplIHdhcyBpZ25vcmVkIgotICAgIC8vIEZJWE1FOiBUaGlzIGFzc2VydCBjYXVzZXMgYSBidWls
ZCBmYWlsdXJlIGluIFdlYktpdEdUSysgZGVidWcKLSAgICAvLyBidWlsZHMsIGJlY2F1c2UgaXQg
dXNlcyAnZmFsc2UnIGluIGl0cyBkZWZpbml0aW9uLiBXZSBtYXkgd2FudAotICAgIC8vIHRvIGZv
cmNlIHRoaXMgZmlsZSB0byBiZSBidWlsdCB3aXRoIGcrKywgYnkgcmVuYW1pbmcgaXQuCi0gICAg
Ly8gQVNTRVJUKHJlY3QtPndpZHRoID09IGluZGljYXRvcl9zaXplKTsKLQotICAgIC8qCi0gICAg
ICogdmVydGljYWxseSBjZW50ZXIgaW4gdGhlIGJveCwgc2luY2UgWFVMIHNvbWV0aW1lcyBpZ25v
cmVzIG91cgotICAgICAqIEdldE1pbmltdW1XaWRnZXRTaXplIGluIHRoZSB2ZXJ0aWNhbCBkaW1l
bnNpb24KLSAgICAgKi8KLSAgICB4ID0gcmVjdC0+eDsKLSAgICB5ID0gcmVjdC0+eSArIChyZWN0
LT5oZWlnaHQgLSBpbmRpY2F0b3Jfc2l6ZSkgLyAyOwotICAgIHdpZHRoID0gaW5kaWNhdG9yX3Np
emU7Ci0gICAgaGVpZ2h0ID0gaW5kaWNhdG9yX3NpemU7Ci0KLSAgICBmb2N1c194ID0geCAtIGlu
ZGljYXRvcl9zcGFjaW5nOwotICAgIGZvY3VzX3kgPSB5IC0gaW5kaWNhdG9yX3NwYWNpbmc7Ci0g
ICAgZm9jdXNfd2lkdGggPSB3aWR0aCArIDIgKiBpbmRpY2F0b3Jfc3BhY2luZzsKLSAgICBmb2N1
c19oZWlnaHQgPSBoZWlnaHQgKyAyICogaW5kaWNhdG9yX3NwYWNpbmc7Ci0KLSAgICBzdHlsZSA9
IGd0a193aWRnZXRfZ2V0X3N0eWxlKHcpOwotCi0gICAgZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZl
KHcsICFzdGF0ZS0+ZGlzYWJsZWQpOwotICAgIGd0a193aWRnZXRfc2V0X2RpcmVjdGlvbih3LCBk
aXJlY3Rpb24pOwotICAgIGd0a190b2dnbGVfYnV0dG9uX3NldF9hY3RpdmUoR1RLX1RPR0dMRV9C
VVRUT04odyksIHNlbGVjdGVkKTsKLQotICAgIGlmIChpc3JhZGlvKSB7Ci0gICAgICAgIGd0a19w
YWludF9vcHRpb24oc3R5bGUsIGNyLCBzdGF0ZV90eXBlLCBzaGFkb3dfdHlwZSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICBnUGFydHMtPnJhZGlvYnV0dG9uV2lkZ2V0LCAicmFkaW9idXR0b24i
LCB4LCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOwotICAgICAg
ICBpZiAoc3RhdGUtPmZvY3VzZWQpIHsKLSAgICAgICAgICAgIGd0a19wYWludF9mb2N1cyhzdHls
ZSwgY3IsIEdUS19TVEFURV9BQ1RJVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ1Bh
cnRzLT5yYWRpb2J1dHRvbldpZGdldCwgInJhZGlvYnV0dG9uIiwgZm9jdXNfeCwgZm9jdXNfeSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c193aWR0aCwgZm9jdXNfaGVpZ2h0KTsK
LSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAvKgotICAgICAgICAqICdpbmRl
dGVybWluYXRlJyB0eXBlIG9uIGNoZWNrYm94ZXMuIEluIEdUSywgdGhlIHNoYWRvdyB0eXBlCi0g
ICAgICAgICogbXVzdCBhbHNvIGJlIGNoYW5nZWQgZm9yIHRoZSBzdGF0ZSB0byBiZSBkcmF3bi4K
LSAgICAgICAgKi8KLSAgICAgICAgaWYgKGluY29uc2lzdGVudCkgewotICAgICAgICAgICAgZ3Rr
X3RvZ2dsZV9idXR0b25fc2V0X2luY29uc2lzdGVudChHVEtfVE9HR0xFX0JVVFRPTihnUGFydHMt
PmNoZWNrYm94V2lkZ2V0KSwgVFJVRSk7Ci0gICAgICAgICAgICBzaGFkb3dfdHlwZSA9IEdUS19T
SEFET1dfRVRDSEVEX0lOOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ3RrX3RvZ2ds
ZV9idXR0b25fc2V0X2luY29uc2lzdGVudChHVEtfVE9HR0xFX0JVVFRPTihnUGFydHMtPmNoZWNr
Ym94V2lkZ2V0KSwgRkFMU0UpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ3RrX3BhaW50X2NoZWNr
KHN0eWxlLCBjciwgc3RhdGVfdHlwZSwgc2hhZG93X3R5cGUsCi0gICAgICAgICAgICAgICAgICAg
ICAgICBnUGFydHMtPmNoZWNrYm94V2lkZ2V0LCAiY2hlY2tidXR0b24iLCB4LCB5LCB3aWR0aCwg
aGVpZ2h0KTsKLSAgICAgICAgaWYgKHN0YXRlLT5mb2N1c2VkKSB7Ci0gICAgICAgICAgICBndGtf
cGFpbnRfZm9jdXMoc3R5bGUsIGNyLCBHVEtfU1RBVEVfQUNUSVZFLAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGdQYXJ0cy0+Y2hlY2tib3hXaWRnZXQsICJjaGVja2J1dHRvbiIsIGZvY3Vz
X3gsIGZvY3VzX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNfd2lkdGgsIGZv
Y3VzX2hlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTU9aX0dUS19TVUND
RVNTOwotfQotCi1zdGF0aWMgZ2ludAotY2FsY3VsYXRlX2J1dHRvbl9pbm5lcl9yZWN0KEd0a1dp
ZGdldCogYnV0dG9uLCBHZGtSZWN0YW5nbGUqIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgR2RrUmVjdGFuZ2xlKiBpbm5lcl9yZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEd0a1RleHREaXJlY3Rpb24gZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGdib29sZWFuIGlnbm9yZV9mb2N1cykKLXsKLSAgICBHdGtCb3JkZXIgaW5uZXJfYm9yZGVy
OwotICAgIGdib29sZWFuIGludGVyaW9yX2ZvY3VzOwotICAgIGdpbnQgZm9jdXNfd2lkdGgsIGZv
Y3VzX3BhZDsKLSAgICBHdGtTdHlsZSogc3R5bGU7Ci0KLSAgICBzdHlsZSA9IGd0a193aWRnZXRf
Z2V0X3N0eWxlKGJ1dHRvbik7Ci0KLSAgICAvKiBUaGlzIG1pcnJvcnMgZ3RrYnV0dG9uJ3MgY2hp
bGQgcG9zaXRpb25pbmcgKi8KLSAgICBtb3pfZ3RrX2J1dHRvbl9nZXRfaW5uZXJfYm9yZGVyKGJ1
dHRvbiwgJmlubmVyX2JvcmRlcik7Ci0gICAgbW96X2d0a193aWRnZXRfZ2V0X2ZvY3VzKGJ1dHRv
biwgJmludGVyaW9yX2ZvY3VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9jdXNf
d2lkdGgsICZmb2N1c19wYWQpOwotCi0gICAgaWYgKGlnbm9yZV9mb2N1cykKLSAgICAgICAgZm9j
dXNfd2lkdGggPSBmb2N1c19wYWQgPSAwOwotCi0gICAgaW5uZXJfcmVjdC0+eCA9IHJlY3QtPngg
KyBYVEhJQ0tORVNTKHN0eWxlKSArIGZvY3VzX3dpZHRoICsgZm9jdXNfcGFkOwotICAgIGlubmVy
X3JlY3QtPnggKz0gZGlyZWN0aW9uID09IEdUS19URVhUX0RJUl9MVFIgPwotICAgICAgICAgICAg
ICAgICAgICAgICAgaW5uZXJfYm9yZGVyLmxlZnQgOiBpbm5lcl9ib3JkZXIucmlnaHQ7Ci0gICAg
aW5uZXJfcmVjdC0+eSA9IHJlY3QtPnkgKyBpbm5lcl9ib3JkZXIudG9wICsgWVRISUNLTkVTUyhz
dHlsZSkgKwotICAgICAgICAgICAgICAgICAgICBmb2N1c193aWR0aCArIGZvY3VzX3BhZDsKLSAg
ICBpbm5lcl9yZWN0LT53aWR0aCA9IE1BWCgxLCByZWN0LT53aWR0aCAtIGlubmVyX2JvcmRlci5s
ZWZ0IC0KLSAgICAgICBpbm5lcl9ib3JkZXIucmlnaHQgLSAoWFRISUNLTkVTUyhzdHlsZSkgKyBm
b2N1c19wYWQgKyBmb2N1c193aWR0aCkgKiAyKTsKLSAgICBpbm5lcl9yZWN0LT5oZWlnaHQgPSBN
QVgoMSwgcmVjdC0+aGVpZ2h0IC0gaW5uZXJfYm9yZGVyLnRvcCAtCi0gICAgICAgaW5uZXJfYm9y
ZGVyLmJvdHRvbSAtIChZVEhJQ0tORVNTKHN0eWxlKSArIGZvY3VzX3BhZCArIGZvY3VzX3dpZHRo
KSAqIDIpOwotCi0gICAgcmV0dXJuIE1PWl9HVEtfU1VDQ0VTUzsKLX0KLQotCi1zdGF0aWMgZ2lu
dAotY2FsY3VsYXRlX2Fycm93X3JlY3QoR3RrV2lkZ2V0KiBhcnJvdywgR2RrUmVjdGFuZ2xlKiBy
ZWN0LAotICAgICAgICAgICAgICAgICAgICAgR2RrUmVjdGFuZ2xlKiBhcnJvd19yZWN0LCBHdGtU
ZXh0RGlyZWN0aW9uIGRpcmVjdGlvbikKLXsKLSAgICAvKiBkZWZpbmVkIGluIGd0a2Fycm93LmMg
Ki8KLSAgICBnZmxvYXQgYXJyb3dfc2NhbGluZyA9IDAuNzsKLSAgICBnZmxvYXQgeGFsaWduLCB4
cGFkOwotICAgIGdpbnQgZXh0ZW50OwotICAgIEd0a01pc2MqIG1pc2MgPSBHVEtfTUlTQyhhcnJv
dyk7Ci0gICAgZ2Zsb2F0IG1pc2NfeGFsaWduLCBtaXNjX3lhbGlnbjsKLSAgICBnaW50IG1pc2Nf
eHBhZCwgbWlzY195cGFkOwotCi0gICAgaWYgKGhhdmVfYXJyb3dfc2NhbGluZykKLSAgICAgICAg
Z3RrX3dpZGdldF9zdHlsZV9nZXQoYXJyb3csICJhcnJvd19zY2FsaW5nIiwgJmFycm93X3NjYWxp
bmcsIE5VTEwpOwotCi0gICAgZ3RrX21pc2NfZ2V0X3BhZGRpbmcobWlzYywgJm1pc2NfeHBhZCwg
Jm1pc2NfeXBhZCk7Ci0gICAgZ3RrX21pc2NfZ2V0X2FsaWdubWVudChtaXNjLCAmbWlzY194YWxp
Z24sICZtaXNjX3lhbGlnbik7Ci0KLSAgICBleHRlbnQgPSBNSU4oKHJlY3QtPndpZHRoIC0gbWlz
Y194cGFkICogMiksCi0gICAgICAgICAgICAgICAgIChyZWN0LT5oZWlnaHQgLSBtaXNjX3lwYWQg
KiAyKSkgKiBhcnJvd19zY2FsaW5nOwotCi0gICAgeGFsaWduID0gZGlyZWN0aW9uID09IEdUS19U
RVhUX0RJUl9MVFIgPyBtaXNjX3hhbGlnbiA6IDEuMCAtIG1pc2NfeGFsaWduOwotICAgIHhwYWQg
PSBtaXNjX3hwYWQgKyAocmVjdC0+d2lkdGggLSBleHRlbnQpICogeGFsaWduOwotCi0gICAgYXJy
b3dfcmVjdC0+eCA9IGRpcmVjdGlvbiA9PSBHVEtfVEVYVF9ESVJfTFRSID8KLSAgICAgICAgICAg
ICAgICAgICAgICAgIGZsb29yKHJlY3QtPnggKyB4cGFkKSA6IGNlaWwocmVjdC0+eCArIHhwYWQp
OwotICAgIGFycm93X3JlY3QtPnkgPSBmbG9vcihyZWN0LT55ICsgbWlzY195cGFkICsKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgKChyZWN0LT5oZWlnaHQgLSBleHRlbnQpICogbWlzY195YWxp
Z24pKTsKLQotICAgIGFycm93X3JlY3QtPndpZHRoID0gYXJyb3dfcmVjdC0+aGVpZ2h0ID0gZXh0
ZW50OwotCi0gICAgcmV0dXJuIE1PWl9HVEtfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGdpbnQKLW1v
el9ndGtfc2Nyb2xsZWRfd2luZG93X3BhaW50KGNhaXJvX3QqIGNyLCBHZGtSZWN0YW5nbGUqIHJl
Y3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHdGtXaWRnZXRTdGF0ZSogc3RhdGUp
Ci17Ci0gICAgR3RrU3R5bGUqIHN0eWxlOwotICAgIEd0a0FsbG9jYXRpb24gYWxsb2NhdGlvbjsK
LSAgICBHdGtXaWRnZXQqIHdpZGdldDsKLQotICAgIGVuc3VyZV9zY3JvbGxlZF93aW5kb3dfd2lk
Z2V0KCk7Ci0gICAgd2lkZ2V0ID0gZ1BhcnRzLT5zY3JvbGxlZFdpbmRvd1dpZGdldDsKLQotICAg
IGd0a193aWRnZXRfZ2V0X2FsbG9jYXRpb24od2lkZ2V0LCAmYWxsb2NhdGlvbik7Ci0gICAgYWxs
b2NhdGlvbi54ID0gcmVjdC0+eDsKLSAgICBhbGxvY2F0aW9uLnkgPSByZWN0LT55OwotICAgIGFs
bG9jYXRpb24ud2lkdGggPSByZWN0LT53aWR0aDsKLSAgICBhbGxvY2F0aW9uLmhlaWdodCA9IHJl
Y3QtPmhlaWdodDsKLSAgICBndGtfd2lkZ2V0X3NldF9hbGxvY2F0aW9uKHdpZGdldCwgJmFsbG9j
YXRpb24pOwotCi0gICAgc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZSh3aWRnZXQpOwotICAg
IGd0a19wYWludF9zaGFkb3coc3R5bGUsIGNyLCBHVEtfU1RBVEVfTk9STUFMLCBHVEtfU0hBRE9X
X0lOLAotICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LCAic2Nyb2xsZWRfd2luZG93IiwgcmVj
dC0+eCAsIHJlY3QtPnksCi0gICAgICAgICAgICAgICAgICAgICByZWN0LT53aWR0aCwgcmVjdC0+
aGVpZ2h0KTsKLSAgICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwotfQotCi1zdGF0aWMgZ2ludAot
bW96X2d0a19zY3JvbGxiYXJfYnV0dG9uX3BhaW50KGNhaXJvX3QqIGNyLCBHZGtSZWN0YW5nbGUq
IHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3RrV2lkZ2V0U3RhdGUqIHN0
YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEd0a1Njcm9sbGJhckJ1dHRvbkZs
YWdzIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEd0a1RleHREaXJlY3Rp
b24gZGlyZWN0aW9uKQotewotICAgIEd0a1N0YXRlVHlwZSBzdGF0ZV90eXBlID0gQ29udmVydEd0
a1N0YXRlKHN0YXRlKTsKLSAgICBHdGtTaGFkb3dUeXBlIHNoYWRvd190eXBlID0gKHN0YXRlLT5h
Y3RpdmUpID8KLSAgICAgICAgR1RLX1NIQURPV19JTiA6IEdUS19TSEFET1dfT1VUOwotICAgIEdk
a1JlY3RhbmdsZSBhcnJvd19yZWN0OwotICAgIEd0a1N0eWxlKiBzdHlsZTsKLSAgICBHdGtXaWRn
ZXQgKnNjcm9sbGJhcjsKLSAgICBHdGtBbGxvY2F0aW9uIGFsbG9jYXRpb247Ci0gICAgR3RrQXJy
b3dUeXBlIGFycm93X3R5cGU7Ci0gICAgZ2ludCBhcnJvd19kaXNwbGFjZW1lbnRfeCwgYXJyb3df
ZGlzcGxhY2VtZW50X3k7Ci0gICAgY29uc3QgY2hhciogZGV0YWlsID0gKGZsYWdzICYgTU9aX0dU
S19TVEVQUEVSX1ZFUlRJQ0FMKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAidnNjcm9s
bGJhciIgOiAiaHNjcm9sbGJhciI7Ci0KLSAgICBlbnN1cmVfc2Nyb2xsYmFyX3dpZGdldCgpOwot
Ci0gICAgaWYgKGZsYWdzICYgTU9aX0dUS19TVEVQUEVSX1ZFUlRJQ0FMKQotICAgICAgICBzY3Jv
bGxiYXIgPSBnUGFydHMtPnZlcnRTY3JvbGxiYXJXaWRnZXQ7Ci0gICAgZWxzZQotICAgICAgICBz
Y3JvbGxiYXIgPSBnUGFydHMtPmhvcml6U2Nyb2xsYmFyV2lkZ2V0OwotCi0gICAgZ3RrX3dpZGdl
dF9zZXRfZGlyZWN0aW9uKHNjcm9sbGJhciwgZGlyZWN0aW9uKTsKLQotICAgIC8qIFNvbWUgdGhl
bWUgZW5naW5lcyAoaS5lLiwgQ2xlYXJMb29rcykgY2hlY2sgdGhlIHNjcm9sbGJhcidzIGFsbG9j
YXRpb24KLSAgICAgICB0byBkZXRlcm1pbmUgd2hlcmUgaXQgc2hvdWxkIHBhaW50IHJvdW5kZWQg
Y29ybmVycyBvbiB0aGUgYnV0dG9ucy4KLSAgICAgICBXZSBuZWVkIHRvIHRyaWNrIHRoZW0gaW50
byBkcmF3aW5nIHRoZSBidXR0b25zIHRoZSB3YXkgd2Ugd2FudCB0aGVtLiAqLwotCi0gICAgZ3Rr
X3dpZGdldF9nZXRfYWxsb2NhdGlvbihzY3JvbGxiYXIsICZhbGxvY2F0aW9uKTsKLSAgICBhbGxv
Y2F0aW9uLnggPSByZWN0LT54OwotICAgIGFsbG9jYXRpb24ueSA9IHJlY3QtPnk7Ci0gICAgYWxs
b2NhdGlvbi53aWR0aCA9IHJlY3QtPndpZHRoOwotICAgIGFsbG9jYXRpb24uaGVpZ2h0ID0gcmVj
dC0+aGVpZ2h0OwotCi0gICAgaWYgKGZsYWdzICYgTU9aX0dUS19TVEVQUEVSX1ZFUlRJQ0FMKSB7
Ci0gICAgICAgIGFsbG9jYXRpb24uaGVpZ2h0ICo9IDU7Ci0gICAgICAgIGlmIChmbGFncyAmIE1P
Wl9HVEtfU1RFUFBFUl9ET1dOKSB7Ci0gICAgICAgICAgICBhcnJvd190eXBlID0gR1RLX0FSUk9X
X0RPV047Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBNT1pfR1RLX1NURVBQRVJfQk9UVE9NKQot
ICAgICAgICAgICAgICAgIGFsbG9jYXRpb24ueSAtPSA0ICogcmVjdC0+aGVpZ2h0OwotICAgICAg
ICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGFsbG9jYXRpb24ueSAtPSByZWN0LT5oZWlnaHQ7
Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFycm93X3R5cGUgPSBHVEtfQVJST1df
VVA7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBNT1pfR1RLX1NURVBQRVJfQk9UVE9NKQotICAg
ICAgICAgICAgICAgIGFsbG9jYXRpb24ueSAtPSAzICogcmVjdC0+aGVpZ2h0OwotICAgICAgICB9
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYWxsb2NhdGlvbi53aWR0aCAqPSA1OwotICAgICAgICBp
ZiAoZmxhZ3MgJiBNT1pfR1RLX1NURVBQRVJfRE9XTikgewotICAgICAgICAgICAgYXJyb3dfdHlw
ZSA9IEdUS19BUlJPV19SSUdIVDsKLSAgICAgICAgICAgIGlmIChmbGFncyAmIE1PWl9HVEtfU1RF
UFBFUl9CT1RUT00pCi0gICAgICAgICAgICAgICAgYWxsb2NhdGlvbi54IC09IDQgKiByZWN0LT53
aWR0aDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhbGxvY2F0aW9uLnggLT0g
cmVjdC0+d2lkdGg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhcnJvd190eXBlID0g
R1RLX0FSUk9XX0xFRlQ7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBNT1pfR1RLX1NURVBQRVJf
Qk9UVE9NKQotICAgICAgICAgICAgICAgIGFsbG9jYXRpb24ueCAtPSAzICogcmVjdC0+d2lkdGg7
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBndGtfd2lkZ2V0X3NldF9hbGxvY2F0aW9uKHNjcm9s
bGJhciwgJmFsbG9jYXRpb24pOwotICAgIHN0eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUoc2Ny
b2xsYmFyKTsKLQotICAgIGd0a19wYWludF9ib3goc3R5bGUsIGNyLCBzdGF0ZV90eXBlLCBzaGFk
b3dfdHlwZSwKLSAgICAgICAgICAgICAgICAgIHNjcm9sbGJhciwgZGV0YWlsLCByZWN0LT54LCBy
ZWN0LT55LAotICAgICAgICAgICAgICAgICAgcmVjdC0+d2lkdGgsIHJlY3QtPmhlaWdodCk7Ci0K
LSAgICBhcnJvd19yZWN0LndpZHRoID0gcmVjdC0+d2lkdGggLyAyOwotICAgIGFycm93X3JlY3Qu
aGVpZ2h0ID0gcmVjdC0+aGVpZ2h0IC8gMjsKLSAgICBhcnJvd19yZWN0LnggPSByZWN0LT54ICsg
KHJlY3QtPndpZHRoIC0gYXJyb3dfcmVjdC53aWR0aCkgLyAyOwotICAgIGFycm93X3JlY3QueSA9
IHJlY3QtPnkgKyAocmVjdC0+aGVpZ2h0IC0gYXJyb3dfcmVjdC5oZWlnaHQpIC8gMjsKLQotICAg
IGlmIChzdGF0ZV90eXBlID09IEdUS19TVEFURV9BQ1RJVkUpIHsKLSAgICAgICAgZ3RrX3dpZGdl
dF9zdHlsZV9nZXQoc2Nyb2xsYmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJy
b3ctZGlzcGxhY2VtZW50LXgiLCAmYXJyb3dfZGlzcGxhY2VtZW50X3gsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICJhcnJvdy1kaXNwbGFjZW1lbnQteSIsICZhcnJvd19kaXNwbGFjZW1l
bnRfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgICAgICAgYXJy
b3dfcmVjdC54ICs9IGFycm93X2Rpc3BsYWNlbWVudF94OwotICAgICAgICBhcnJvd19yZWN0Lnkg
Kz0gYXJyb3dfZGlzcGxhY2VtZW50X3k7Ci0gICAgfQotCi0gICAgZ3RrX3BhaW50X2Fycm93KHN0
eWxlLCBjciwgc3RhdGVfdHlwZSwgc2hhZG93X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgIHNj
cm9sbGJhciwgZGV0YWlsLCBhcnJvd190eXBlLCBUUlVFLCBhcnJvd19yZWN0LngsCi0gICAgICAg
ICAgICAgICAgICAgIGFycm93X3JlY3QueSwgYXJyb3dfcmVjdC53aWR0aCwgYXJyb3dfcmVjdC5o
ZWlnaHQpOwotCi0gICAgcmV0dXJuIE1PWl9HVEtfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGdpbnQK
LW1vel9ndGtfc2Nyb2xsYmFyX3Ryb3VnaF9wYWludChHdGtUaGVtZVdpZGdldFR5cGUgd2lkZ2V0
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhaXJvX3QqIGNyLCBHZGtSZWN0YW5n
bGUqIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3RrV2lkZ2V0U3RhdGUq
IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEd0a1RleHREaXJlY3Rpb24g
ZGlyZWN0aW9uKQotewotICAgIEd0a1N0eWxlKiBzdHlsZTsKLSAgICBHdGtTY3JvbGxiYXIgKnNj
cm9sbGJhcjsKLQotICAgIGVuc3VyZV9zY3JvbGxiYXJfd2lkZ2V0KCk7Ci0KLSAgICBpZiAod2lk
Z2V0ID09ICBNT1pfR1RLX1NDUk9MTEJBUl9UUkFDS19IT1JJWk9OVEFMKQotICAgICAgICBzY3Jv
bGxiYXIgPSBHVEtfU0NST0xMQkFSKGdQYXJ0cy0+aG9yaXpTY3JvbGxiYXJXaWRnZXQpOwotICAg
IGVsc2UKLSAgICAgICAgc2Nyb2xsYmFyID0gR1RLX1NDUk9MTEJBUihnUGFydHMtPnZlcnRTY3Jv
bGxiYXJXaWRnZXQpOwotCi0gICAgZ3RrX3dpZGdldF9zZXRfZGlyZWN0aW9uKEdUS19XSURHRVQo
c2Nyb2xsYmFyKSwgZGlyZWN0aW9uKTsKLQotICAgIHN0eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5
bGUoR1RLX1dJREdFVChzY3JvbGxiYXIpKTsKLQotICAgIGd0a19wYWludF9ib3goc3R5bGUsIGNy
LCBHVEtfU1RBVEVfQUNUSVZFLCBHVEtfU0hBRE9XX0lOLAotICAgICAgICAgICAgICAgICAgR1RL
X1dJREdFVChzY3JvbGxiYXIpLCAidHJvdWdoIiwgcmVjdC0+eCwgcmVjdC0+eSwKLSAgICAgICAg
ICAgICAgICAgIHJlY3QtPndpZHRoLCByZWN0LT5oZWlnaHQpOwotCi0gICAgaWYgKHN0YXRlLT5m
b2N1c2VkKSB7Ci0gICAgICAgIGd0a19wYWludF9mb2N1cyhzdHlsZSwgY3IsIEdUS19TVEFURV9B
Q1RJVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICBHVEtfV0lER0VUKHNjcm9sbGJhciksICJ0
cm91Z2giLAotICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC0+eCwgcmVjdC0+eSwgcmVjdC0+
d2lkdGgsIHJlY3QtPmhlaWdodCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE1PWl9HVEtfU1VDQ0VT
UzsKLX0KLQotc3RhdGljIGdpbnQKLW1vel9ndGtfc2Nyb2xsYmFyX3RodW1iX3BhaW50KEd0a1Ro
ZW1lV2lkZ2V0VHlwZSB3aWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWly
b190KiBjciwgR2RrUmVjdGFuZ2xlKiByZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgR3RrV2lkZ2V0U3RhdGUqIHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
R3RrVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0gICAgR3RrU3RhdGVUeXBlIHN0YXRlX3R5
cGUgPSAoc3RhdGUtPmluSG92ZXIgfHwgc3RhdGUtPmFjdGl2ZSkgPwotICAgICAgICBHVEtfU1RB
VEVfUFJFTElHSFQgOiBHVEtfU1RBVEVfTk9STUFMOwotICAgIEd0a1NoYWRvd1R5cGUgc2hhZG93
X3R5cGUgPSBHVEtfU0hBRE9XX09VVDsKLSAgICBHdGtTdHlsZSogc3R5bGU7Ci0gICAgR3RrU2Ny
b2xsYmFyICpzY3JvbGxiYXI7Ci0gICAgR3RrQWRqdXN0bWVudCAqYWRqOwotCi0gICAgZW5zdXJl
X3Njcm9sbGJhcl93aWRnZXQoKTsKLQotICAgIGlmICh3aWRnZXQgPT0gTU9aX0dUS19TQ1JPTExC
QVJfVEhVTUJfSE9SSVpPTlRBTCkKLSAgICAgICAgc2Nyb2xsYmFyID0gR1RLX1NDUk9MTEJBUihn
UGFydHMtPmhvcml6U2Nyb2xsYmFyV2lkZ2V0KTsKLSAgICBlbHNlCi0gICAgICAgIHNjcm9sbGJh
ciA9IEdUS19TQ1JPTExCQVIoZ1BhcnRzLT52ZXJ0U2Nyb2xsYmFyV2lkZ2V0KTsKLQotICAgIGd0
a193aWRnZXRfc2V0X2RpcmVjdGlvbihHVEtfV0lER0VUKHNjcm9sbGJhciksIGRpcmVjdGlvbik7
Ci0KLSAgICAvKiBNYWtlIHN1cmUgdG8gc2V0IHRoZSBzY3JvbGxiYXIgcmFuZ2UgYmVmb3JlIHBh
aW50aW5nIHNvIHRoYXQKLSAgICAgICBldmVyeXRoaW5nIGlzIGRyYXduIHByb3Blcmx5LiAgQXQg
bGVhc3QgdGhlIGJsdWVjdXJ2ZSAoYW5kCi0gICAgICAgbWF5YmUgb3RoZXIpIHRoZW1lcyBkb24n
dCBkcmF3IHRoZSB0b3Agb3IgYm90dG9tIGJsYWNrIGxpbmUKLSAgICAgICBzdXJyb3VuZGluZyB0
aGUgc2Nyb2xsYmFyIGlmIHRoZSB0aGVtZSB0aGlua3MgdGhhdCBpdCdzIGJ1dHRlZAotICAgICAg
IHVwIGFnYWluc3QgdGhlIHNjcm9sbGJhciBhcnJvd3MuICBOb3RlIHRoZSBpbmNyZWFzZXMgb2Yg
dGhlCi0gICAgICAgY2xpcCByZWN0IGJlbG93LiAqLwotICAgIGFkaiA9IGd0a19yYW5nZV9nZXRf
YWRqdXN0bWVudChHVEtfUkFOR0Uoc2Nyb2xsYmFyKSk7Ci0KLSAgICBpZiAod2lkZ2V0ID09IE1P
Wl9HVEtfU0NST0xMQkFSX1RIVU1CX0hPUklaT05UQUwpIHsKLSAgICAgICAgZ3RrX2FkanVzdG1l
bnRfc2V0X3BhZ2Vfc2l6ZShhZGosIHJlY3QtPndpZHRoKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0g
ICAgICAgIGd0a19hZGp1c3RtZW50X3NldF9wYWdlX3NpemUoYWRqLCByZWN0LT5oZWlnaHQpOwot
ICAgIH0KLQotICAgIGd0a19hZGp1c3RtZW50X2NvbmZpZ3VyZShhZGosCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHN0YXRlLT5jdXJwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tYXhwb3MsCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGd0a19hZGp1c3RtZW50X2dldF9zdGVwX2luY3JlbWVu
dChhZGopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGtfYWRqdXN0bWVudF9nZXRf
cGFnZV9pbmNyZW1lbnQoYWRqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RrX2Fk
anVzdG1lbnRfZ2V0X3BhZ2Vfc2l6ZShhZGopKTsKLQotICAgIHN0eWxlID0gZ3RrX3dpZGdldF9n
ZXRfc3R5bGUoR1RLX1dJREdFVChzY3JvbGxiYXIpKTsKLQotICAgIGd0a19wYWludF9zbGlkZXIo
c3R5bGUsIGNyLCBzdGF0ZV90eXBlLCBzaGFkb3dfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAg
IEdUS19XSURHRVQoc2Nyb2xsYmFyKSwgInNsaWRlciIsIHJlY3QtPngsIHJlY3QtPnksCi0gICAg
ICAgICAgICAgICAgICAgICByZWN0LT53aWR0aCwgIHJlY3QtPmhlaWdodCwKLSAgICAgICAgICAg
ICAgICAgICAgICh3aWRnZXQgPT0gTU9aX0dUS19TQ1JPTExCQVJfVEhVTUJfSE9SSVpPTlRBTCkg
PwotICAgICAgICAgICAgICAgICAgICAgR1RLX09SSUVOVEFUSU9OX0hPUklaT05UQUwgOiBHVEtf
T1JJRU5UQVRJT05fVkVSVElDQUwpOwotCi0gICAgcmV0dXJuIE1PWl9HVEtfU1VDQ0VTUzsKLX0K
LQotc3RhdGljIGdpbnQKLW1vel9ndGtfZW50cnlfcGFpbnQoY2Fpcm9fdCogY3IsIEdka1JlY3Rh
bmdsZSogcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgR3RrV2lkZ2V0U3RhdGUqIHN0YXRlLCBH
dGtXaWRnZXQqIHdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgR3RrVGV4dERpcmVjdGlvbiBk
aXJlY3Rpb24pCi17Ci0gICAgR3RrU3RhdGVUeXBlIGJnX3N0YXRlID0gc3RhdGUtPmRpc2FibGVk
ID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RLX1NUQVRFX0lOU0VOU0lUSVZF
IDogR1RLX1NUQVRFX05PUk1BTDsKLSAgICBnaW50IHgsIHksIHdpZHRoID0gcmVjdC0+d2lkdGgs
IGhlaWdodCA9IHJlY3QtPmhlaWdodDsKLSAgICBHdGtTdHlsZSogc3R5bGU7Ci0gICAgZ2Jvb2xl
YW4gaW50ZXJpb3JfZm9jdXM7Ci0gICAgZ2Jvb2xlYW4gdGhlbWVfaG9ub3JzX3RyYW5zcGFyZW5j
eSA9IEZBTFNFOwotICAgIGdpbnQgZm9jdXNfd2lkdGg7Ci0KLSAgICBndGtfd2lkZ2V0X3NldF9k
aXJlY3Rpb24od2lkZ2V0LCBkaXJlY3Rpb24pOwotCi0gICAgc3R5bGUgPSBndGtfd2lkZ2V0X2dl
dF9zdHlsZSh3aWRnZXQpOwotCi0gICAgZ3RrX3dpZGdldF9zdHlsZV9nZXQod2lkZ2V0LAotICAg
ICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmlvci1mb2N1cyIsICZpbnRlcmlvcl9mb2N1cywK
LSAgICAgICAgICAgICAgICAgICAgICAgICAiZm9jdXMtbGluZS13aWR0aCIsICZmb2N1c193aWR0
aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiaG9ub3JzLXRyYW5zcGFyZW50LWJnLWhpbnQi
LCAmdGhlbWVfaG9ub3JzX3RyYW5zcGFyZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBO
VUxMKTsKLQotICAgIC8qIGd0a2VudHJ5LmMgdXNlcyB0d28gd2luZG93cywgb25lIGZvciB0aGUg
ZW50aXJlIHdpZGdldCBhbmQgb25lIGZvciB0aGUKLSAgICAgKiB0ZXh0IGFyZWEgaW5zaWRlIGl0
LiBUaGUgYmFja2dyb3VuZCBvZiBib3RoIHdpbmRvd3MgaXMgc2V0IHRvIHRoZSAiYmFzZSIKLSAg
ICAgKiBjb2xvciBvZiB0aGUgbmV3IHN0YXRlIGluIGd0a19lbnRyeV9zdGF0ZV9jaGFuZ2VkLCBi
dXQgb25seSB0aGUgaW5uZXIKLSAgICAgKiB0ZXh0YXJlYSB3aW5kb3cgdXNlcyBndGtfcGFpbnRf
ZmxhdF9ib3ggd2hlbiBleHBvc2VkICovCi0KLSAgICAvKiBUaGlzIGdldHMgdXMgYSBsb3ZlbHkg
Z3JleWlzaCBkaXNhYmxlZGlzaCBsb29rICovCi0gICAgZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZl
KHdpZGdldCwgIXN0YXRlLT5kaXNhYmxlZCk7Ci0KLSAgICAvKiBHVEsgZmlsbHMgdGhlIG91dGVy
IHdpZGdldCB3aW5kb3cgd2l0aCB0aGUgYmFzZSBjb2xvciBiZWZvcmUgZHJhd2luZyB0aGUgd2lk
Z2V0LgotICAgICAqIFNvbWUgb2xkZXIgdGhlbWVzIHJlbHkgb24gdGhpcyBiZWhhdmlvciwgYnV0
IG1hbnkgdGhlbWVzIG5vd2FkYXlzIHVzZSByb3VuZGVkCi0gICAgICogY29ybmVycyBvbiB0aGVp
ciB3aWRnZXRzLiBXaGlsZSBtb3N0IEdUSyBhcHBzIGFyZSBibGlzc2Z1bGx5IHVuYXdhcmUgb2Yg
dGhpcwotICAgICAqIHByb2JsZW0gZHVlIHRvIHRoZWlyIHVzZSBvZiB0aGUgZGVmYXVsdCB3aW5k
b3cgYmFja2dyb3VuZCwgd2UgcmVuZGVyIHdpZGdldHMgb24KLSAgICAgKiBtYW55IGtpbmRzIG9m
IGJhY2tncm91bmRzIG9uIHRoZSB3ZWIuCi0gICAgICogSWYgdGhlIHRoZW1lIGlzIGFibGUgdG8g
Y29wZSB3aXRoIHRyYW5zcGFyZW5jeSwgdGhlbiB3ZSBjYW4gc2tpcCBwcmUtZmlsbGluZwotICAg
ICAqIGFuZCBub3RpZnkgdGhlIHRoZW1lIGl0IHdpbGwgcGFpbnQgZGlyZWN0bHkgb24gdGhlIGNh
bnZhcy4gKi8KLSAgICBpZiAodGhlbWVfaG9ub3JzX3RyYW5zcGFyZW5jeSkgewotICAgICAgICBn
X29iamVjdF9zZXRfZGF0YShHX09CSkVDVCh3aWRnZXQpLCAidHJhbnNwYXJlbnQtYmctaGludCIs
IEdJTlRfVE9fUE9JTlRFUihUUlVFKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY2Fpcm9fc2F2
ZShjcik7Ci0gICAgICAgIGdka19jYWlyb19zZXRfc291cmNlX2NvbG9yKGNyLCAoY29uc3QgR2Rr
Q29sb3IqKSZzdHlsZS0+YmFzZVtiZ19zdGF0ZV0pOwotICAgICAgICBjYWlyb19wYXR0ZXJuX3Nl
dF9leHRlbmQoY2Fpcm9fZ2V0X3NvdXJjZShjciksIENBSVJPX0VYVEVORF9SRVBFQVQpOwotICAg
ICAgICBjYWlyb19maWxsKGNyKTsKLSAgICAgICAgY2Fpcm9fcmVzdG9yZShjcik7Ci0gICAgICAg
IGdfb2JqZWN0X3NldF9kYXRhKEdfT0JKRUNUKHdpZGdldCksICJ0cmFuc3BhcmVudC1iZy1oaW50
IiwgR0lOVF9UT19QT0lOVEVSKEZBTFNFKSk7Ci0gICAgfQotCi0gICAgLyogR2V0IHRoZSBwb3Np
dGlvbiBvZiB0aGUgaW5uZXIgd2luZG93LCBzZWUgX2d0a19lbnRyeV9nZXRfYm9yZGVycyAqLwot
ICAgIHggPSBYVEhJQ0tORVNTKHN0eWxlKTsKLSAgICB5ID0gWVRISUNLTkVTUyhzdHlsZSk7Ci0K
LSAgICBpZiAoIWludGVyaW9yX2ZvY3VzKSB7Ci0gICAgICAgIHggKz0gZm9jdXNfd2lkdGg7Ci0g
ICAgICAgIHkgKz0gZm9jdXNfd2lkdGg7Ci0gICAgfQotCi0gICAgLyogU2ltdWxhdGUgYW4gZXhw
b3NlIG9mIHRoZSBpbm5lciB3aW5kb3cgKi8KLSAgICBndGtfcGFpbnRfZmxhdF9ib3goc3R5bGUs
IGNyLCBiZ19zdGF0ZSwgR1RLX1NIQURPV19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICB3
aWRnZXQsICJlbnRyeV9iZyIsICByZWN0LT54ICsgeCwKLSAgICAgICAgICAgICAgICAgICAgICAg
cmVjdC0+eSArIHksIHJlY3QtPndpZHRoIC0gMip4LCByZWN0LT5oZWlnaHQgLSAyKnkpOwotCi0g
ICAgLyogTm93IHBhaW50IHRoZSBzaGFkb3cgYW5kIGZvY3VzIGJvcmRlci4KLSAgICAgKiBXZSBk
byBsaWtlIGluIGd0a19lbnRyeV9kcmF3X2ZyYW1lLCB3ZSBmaXJzdCBkcmF3IHRoZSBzaGFkb3cs
IGEgdGFkCi0gICAgICogc21hbGxlciB3aGVuIGZvY3VzZWQgaWYgdGhlIGZvY3VzIGlzIG5vdCBp
bnRlcmlvciwgdGhlbiB0aGUgZm9jdXMuICovCi0gICAgeCA9IHJlY3QtPng7Ci0gICAgeSA9IHJl
Y3QtPnk7Ci0KLSAgICBpZiAoc3RhdGUtPmZvY3VzZWQgJiYgIXN0YXRlLT5kaXNhYmxlZCkgewot
ICAgICAgICAvKiBUaGlzIHdpbGwgZ2V0IHVzIHRoZSBsaXQgYm9yZGVycyB0aGF0IGZvY3VzZWQg
dGV4dGJveGVzIGVuam95IG9uCi0gICAgICAgICAqIHNvbWUgdGhlbWVzLiAqLwotICAgICAgICBp
ZiAoIWludGVyaW9yX2ZvY3VzKSB7Ci0gICAgICAgICAgICAvKiBJbmRlbnQgdGhlIGJvcmRlciBh
IGxpdHRsZSBiaXQgaWYgd2UgaGF2ZSBleHRlcmlvciBmb2N1cwotICAgICAgICAgICAgICAgKHRo
aXMgaXMgd2hhdCBHVEsgZG9lcyB0byBkcmF3IG5hdGl2ZSBlbnRyaWVzKSAqLwotICAgICAgICAg
ICAgeCArPSBmb2N1c193aWR0aDsKLSAgICAgICAgICAgIHkgKz0gZm9jdXNfd2lkdGg7Ci0gICAg
ICAgICAgICB3aWR0aCAtPSAyICogZm9jdXNfd2lkdGg7Ci0gICAgICAgICAgICBoZWlnaHQgLT0g
MiAqIGZvY3VzX3dpZHRoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZ3RrX3BhaW50X3NoYWRv
dyhzdHlsZSwgY3IsIEdUS19TVEFURV9OT1JNQUwsIEdUS19TSEFET1dfSU4sCi0gICAgICAgICAg
ICAgICAgICAgICB3aWRnZXQsICJlbnRyeSIsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotCi0gICAg
aWYgKHN0YXRlLT5mb2N1c2VkICYmICFzdGF0ZS0+ZGlzYWJsZWQpIHsKLSAgICAgICAgaWYgKCFp
bnRlcmlvcl9mb2N1cykgewotICAgICAgICAgICAgZ3RrX3BhaW50X2ZvY3VzKHN0eWxlLCBjciwg
IEdUS19TVEFURV9OT1JNQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LCAi
ZW50cnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPngsIHJlY3QtPnksIHJl
Y3QtPndpZHRoLCByZWN0LT5oZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJu
IE1PWl9HVEtfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGdpbnQKLW1vel9ndGtfY29tYm9fYm94X3Bh
aW50KGNhaXJvX3QqIGNyLCBHZGtSZWN0YW5nbGUqIHJlY3QsCi0gICAgICAgICAgICAgICAgICAg
ICAgICBHdGtXaWRnZXRTdGF0ZSogc3RhdGUsIGdib29sZWFuIGlzaHRtbCwKLSAgICAgICAgICAg
ICAgICAgICAgICAgIEd0a1RleHREaXJlY3Rpb24gZGlyZWN0aW9uKQotewotICAgIEdka1JlY3Rh
bmdsZSBhcnJvd19yZWN0LCByZWFsX2Fycm93X3JlY3Q7Ci0gICAgZ2ludCAvKiBhcnJvd19zaXpl
LCAqLyBzZXBhcmF0b3Jfd2lkdGg7Ci0gICAgZ2Jvb2xlYW4gd2lkZV9zZXBhcmF0b3JzOwotICAg
IEd0a1N0YXRlVHlwZSBzdGF0ZV90eXBlID0gQ29udmVydEd0a1N0YXRlKHN0YXRlKTsKLSAgICBH
dGtTaGFkb3dUeXBlIHNoYWRvd190eXBlID0gc3RhdGUtPmFjdGl2ZSA/IEdUS19TSEFET1dfSU4g
OiBHVEtfU0hBRE9XX09VVDsKLSAgICBHdGtTdHlsZSogc3R5bGU7Ci0gICAgR3RrUmVxdWlzaXRp
b24gYXJyb3dfcmVxOwotCi0gICAgZW5zdXJlX2NvbWJvX2JveF93aWRnZXRzKCk7Ci0KLSAgICAv
KiBBbHNvIHNldHMgdGhlIGRpcmVjdGlvbiBvbiBnUGFydHMtPmNvbWJvQm94QnV0dG9uV2lkZ2V0
LCB3aGljaCBpcyB0aGVuCi0gICAgICogaW5oZXJpdGVkIGJ5IHRoZSBzZXBhcmF0b3IgYW5kIGFy
cm93ICovCi0gICAgbW96X2d0a19idXR0b25fcGFpbnQoY3IsIHJlY3QsIHN0YXRlLCBHVEtfUkVM
SUVGX05PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnUGFydHMtPmNvbWJvQm94QnV0
dG9uV2lkZ2V0LCBkaXJlY3Rpb24pOwotCi0gICAgY2FsY3VsYXRlX2J1dHRvbl9pbm5lcl9yZWN0
KGdQYXJ0cy0+Y29tYm9Cb3hCdXR0b25XaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHJlY3QsICZhcnJvd19yZWN0LCBkaXJlY3Rpb24sIGlzaHRtbCk7Ci0gICAgLyogTm93
IGFycm93X3JlY3QgY29udGFpbnMgdGhlIGlubmVyIHJlY3QgOyB3ZSB3YW50IHRvIGNvcnJlY3Qg
dGhlIHdpZHRoCi0gICAgICogdG8gd2hhdCB0aGUgYXJyb3cgbmVlZHMgKHNlZSBndGtfY29tYm9f
Ym94X3NpemVfYWxsb2NhdGUpICovCi0gICAgZ3RrX3dpZGdldF9nZXRfcHJlZmVycmVkX3NpemUo
Z1BhcnRzLT5jb21ib0JveEFycm93V2lkZ2V0LCAmYXJyb3dfcmVxLCBOVUxMKTsKLSAgICBpZiAo
ZGlyZWN0aW9uID09IEdUS19URVhUX0RJUl9MVFIpCi0gICAgICAgIGFycm93X3JlY3QueCArPSBh
cnJvd19yZWN0LndpZHRoIC0gYXJyb3dfcmVxLndpZHRoOwotICAgIGFycm93X3JlY3Qud2lkdGgg
PSBhcnJvd19yZXEud2lkdGg7Ci0KLSAgICBjYWxjdWxhdGVfYXJyb3dfcmVjdChnUGFydHMtPmNv
bWJvQm94QXJyb3dXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmFycm93X3JlY3Qs
ICZyZWFsX2Fycm93X3JlY3QsIGRpcmVjdGlvbik7Ci0KLSAgICBzdHlsZSA9IGd0a193aWRnZXRf
Z2V0X3N0eWxlKGdQYXJ0cy0+Y29tYm9Cb3hBcnJvd1dpZGdldCk7Ci0KLSAgICBndGtfd2lkZ2V0
X3NpemVfYWxsb2NhdGUoZ1BhcnRzLT5jb21ib0JveFdpZGdldCwgcmVjdCk7Ci0KLSAgICBndGtf
cGFpbnRfYXJyb3coc3R5bGUsIGNyLCBzdGF0ZV90eXBlLCBzaGFkb3dfdHlwZSwKLSAgICAgICAg
ICAgICAgICAgICAgZ1BhcnRzLT5jb21ib0JveEFycm93V2lkZ2V0LCAiYXJyb3ciLCAgR1RLX0FS
Uk9XX0RPV04sIFRSVUUsCi0gICAgICAgICAgICAgICAgICAgIHJlYWxfYXJyb3dfcmVjdC54LCBy
ZWFsX2Fycm93X3JlY3QueSwKLSAgICAgICAgICAgICAgICAgICAgcmVhbF9hcnJvd19yZWN0Lndp
ZHRoLCByZWFsX2Fycm93X3JlY3QuaGVpZ2h0KTsKLQotCi0gICAgLyogSWYgdGhlcmUgaXMgbm8g
c2VwYXJhdG9yIGluIHRoZSB0aGVtZSwgdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8uICovCi0g
ICAgaWYgKCFnUGFydHMtPmNvbWJvQm94U2VwYXJhdG9yV2lkZ2V0KQotICAgICAgICByZXR1cm4g
TU9aX0dUS19TVUNDRVNTOwotCi0gICAgc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZShnUGFy
dHMtPmNvbWJvQm94U2VwYXJhdG9yV2lkZ2V0KTsKLQotICAgIGd0a193aWRnZXRfc3R5bGVfZ2V0
KGdQYXJ0cy0+Y29tYm9Cb3hTZXBhcmF0b3JXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgIndpZGUtc2VwYXJhdG9ycyIsICZ3aWRlX3NlcGFyYXRvcnMsCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgInNlcGFyYXRvci13aWR0aCIsICZzZXBhcmF0b3Jfd2lkdGgsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgICBpZiAod2lkZV9zZXBhcmF0b3JzKSB7Ci0gICAg
ICAgIGlmIChkaXJlY3Rpb24gPT0gR1RLX1RFWFRfRElSX0xUUikKLSAgICAgICAgICAgIGFycm93
X3JlY3QueCAtPSBzZXBhcmF0b3Jfd2lkdGg7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFy
cm93X3JlY3QueCArPSBhcnJvd19yZWN0LndpZHRoOwotCi0gICAgICAgIGd0a19wYWludF9ib3go
c3R5bGUsIGNyLAotICAgICAgICAgICAgICAgICAgICAgIEdUS19TVEFURV9OT1JNQUwsIEdUS19T
SEFET1dfRVRDSEVEX09VVCwKLSAgICAgICAgICAgICAgICAgICAgICBnUGFydHMtPmNvbWJvQm94
U2VwYXJhdG9yV2lkZ2V0LCAidnNlcGFyYXRvciIsCi0gICAgICAgICAgICAgICAgICAgICAgYXJy
b3dfcmVjdC54LCBhcnJvd19yZWN0LnksCi0gICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9y
X3dpZHRoLCBhcnJvd19yZWN0LmhlaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGRp
cmVjdGlvbiA9PSBHVEtfVEVYVF9ESVJfTFRSKQotICAgICAgICAgICAgYXJyb3dfcmVjdC54IC09
IFhUSElDS05FU1Moc3R5bGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhcnJvd19yZWN0
LnggKz0gYXJyb3dfcmVjdC53aWR0aDsKLQotICAgICAgICBndGtfcGFpbnRfdmxpbmUoc3R5bGUs
IGNyLCBHVEtfU1RBVEVfTk9STUFMLAotICAgICAgICAgICAgICAgICAgICAgICAgZ1BhcnRzLT5j
b21ib0JveFNlcGFyYXRvcldpZGdldCwgInZzZXBhcmF0b3IiLAotICAgICAgICAgICAgICAgICAg
ICAgICAgYXJyb3dfcmVjdC55LCBhcnJvd19yZWN0LnkgKyBhcnJvd19yZWN0LmhlaWdodCwKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGFycm93X3JlY3QueCk7Ci0gICAgfQotCi0gICAgcmV0dXJu
IE1PWl9HVEtfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGdpbnQKLW1vel9ndGtfcHJvZ3Jlc3NiYXJf
cGFpbnQoY2Fpcm9fdCogY3IsIEdka1JlY3RhbmdsZSogcmVjdCwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgR3RrVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pCi17Ci0gICAgR3RrU3R5bGUqIHN0
eWxlOwotCi0gICAgZW5zdXJlX3Byb2dyZXNzX3dpZGdldCgpOwotICAgIGd0a193aWRnZXRfc2V0
X2RpcmVjdGlvbihnUGFydHMtPnByb2dyZXNXaWRnZXQsIGRpcmVjdGlvbik7Ci0KLSAgICBzdHls
ZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKGdQYXJ0cy0+cHJvZ3Jlc1dpZGdldCk7Ci0KLSAgICBn
dGtfcGFpbnRfYm94KHN0eWxlLCBjciwgR1RLX1NUQVRFX05PUk1BTCwgR1RLX1NIQURPV19JTiwK
LSAgICAgICAgICAgICAgICAgIGdQYXJ0cy0+cHJvZ3Jlc1dpZGdldCwgInRyb3VnaCIsIHJlY3Qt
PngsIHJlY3QtPnksCi0gICAgICAgICAgICAgICAgICByZWN0LT53aWR0aCwgcmVjdC0+aGVpZ2h0
KTsKLQotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBnaW50Ci1tb3pf
Z3RrX3Byb2dyZXNzX2NodW5rX3BhaW50KGNhaXJvX3QqIGNyLCBHZGtSZWN0YW5nbGUqIHJlY3Qs
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEd0a1RleHREaXJlY3Rpb24gZGlyZWN0aW9u
KQotewotICAgIEd0a1N0eWxlKiBzdHlsZTsKLQotICAgIGVuc3VyZV9wcm9ncmVzc193aWRnZXQo
KTsKLSAgICBndGtfd2lkZ2V0X3NldF9kaXJlY3Rpb24oZ1BhcnRzLT5wcm9ncmVzV2lkZ2V0LCBk
aXJlY3Rpb24pOwotCi0gICAgc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZShnUGFydHMtPnBy
b2dyZXNXaWRnZXQpOwotCi0gICAgZ3RrX3BhaW50X2JveChzdHlsZSwgY3IsIEdUS19TVEFURV9Q
UkVMSUdIVCwgR1RLX1NIQURPV19PVVQsCi0gICAgICAgICAgICAgICAgICBnUGFydHMtPnByb2dy
ZXNXaWRnZXQsICJiYXIiLCByZWN0LT54LCByZWN0LT55LAotICAgICAgICAgICAgICAgICAgcmVj
dC0+d2lkdGgsIHJlY3QtPmhlaWdodCk7Ci0KLSAgICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwot
fQotCi1naW50Ci1tb3pfZ3RrX2dldF93aWRnZXRfYm9yZGVyKEd0a1RoZW1lV2lkZ2V0VHlwZSB3
aWRnZXQsIGdpbnQqIGxlZnQsIGdpbnQqIHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
Z2ludCogcmlnaHQsIGdpbnQqIGJvdHRvbSwgR3RrVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24sCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgIGdib29sZWFuIGluaHRtbCkKLXsKLSAgICBHdGtXaWRn
ZXQqIHc7Ci0gICAgR3RrU3R5bGUgKnN0eWxlOwotCi0gICAgc3dpdGNoICh3aWRnZXQpIHsKLSAg
ICBjYXNlIE1PWl9HVEtfQlVUVE9OOgotICAgICAgICB7Ci0gICAgICAgICAgICBHdGtCb3JkZXIg
aW5uZXJfYm9yZGVyOwotICAgICAgICAgICAgZ2Jvb2xlYW4gaW50ZXJpb3JfZm9jdXM7Ci0gICAg
ICAgICAgICBnaW50IGZvY3VzX3dpZHRoLCBmb2N1c19wYWQ7Ci0gICAgICAgICAgICBHdGtTdHls
ZSAqc3R5bGU7Ci0KLSAgICAgICAgICAgIGVuc3VyZV9idXR0b25fd2lkZ2V0KCk7Ci0gICAgICAg
ICAgICAqbGVmdCA9ICp0b3AgPSAqcmlnaHQgPSAqYm90dG9tID0gZ3RrX2NvbnRhaW5lcl9nZXRf
Ym9yZGVyX3dpZHRoKEdUS19DT05UQUlORVIoZ1BhcnRzLT5idXR0b25XaWRnZXQpKTsKLQotICAg
ICAgICAgICAgLyogRG9uJ3QgYWRkIHRoaXMgcGFkZGluZyBpbiBIVE1MLCBvdGhlcndpc2UgdGhl
IGJ1dHRvbnMgd2lsbAotICAgICAgICAgICAgICAgYmVjb21lIHRvbyBiaWcgYW5kIHN0dWZmIHRo
ZSBsYXlvdXQuICovCi0gICAgICAgICAgICBpZiAoIWluaHRtbCkgewotICAgICAgICAgICAgICAg
IG1vel9ndGtfd2lkZ2V0X2dldF9mb2N1cyhnUGFydHMtPmJ1dHRvbldpZGdldCwgJmludGVyaW9y
X2ZvY3VzLCAmZm9jdXNfd2lkdGgsICZmb2N1c19wYWQpOwotICAgICAgICAgICAgICAgIG1vel9n
dGtfYnV0dG9uX2dldF9pbm5lcl9ib3JkZXIoZ1BhcnRzLT5idXR0b25XaWRnZXQsICZpbm5lcl9i
b3JkZXIpOwotICAgICAgICAgICAgICAgICpsZWZ0ICs9IGZvY3VzX3dpZHRoICsgZm9jdXNfcGFk
ICsgaW5uZXJfYm9yZGVyLmxlZnQ7Ci0gICAgICAgICAgICAgICAgKnJpZ2h0ICs9IGZvY3VzX3dp
ZHRoICsgZm9jdXNfcGFkICsgaW5uZXJfYm9yZGVyLnJpZ2h0OwotICAgICAgICAgICAgICAgICp0
b3AgKz0gZm9jdXNfd2lkdGggKyBmb2N1c19wYWQgKyBpbm5lcl9ib3JkZXIudG9wOwotICAgICAg
ICAgICAgICAgICpib3R0b20gKz0gZm9jdXNfd2lkdGggKyBmb2N1c19wYWQgKyBpbm5lcl9ib3Jk
ZXIuYm90dG9tOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdHlsZSA9IGd0a193aWRn
ZXRfZ2V0X3N0eWxlKGdQYXJ0cy0+YnV0dG9uV2lkZ2V0KTsKLSAgICAgICAgICAgICpsZWZ0ICs9
IHN0eWxlLT54dGhpY2tuZXNzOwotICAgICAgICAgICAgKnJpZ2h0ICs9IHN0eWxlLT54dGhpY2tu
ZXNzOwotICAgICAgICAgICAgKnRvcCArPSBzdHlsZS0+eXRoaWNrbmVzczsKLSAgICAgICAgICAg
ICpib3R0b20gKz0gc3R5bGUtPnl0aGlja25lc3M7Ci0gICAgICAgICAgICByZXR1cm4gTU9aX0dU
S19TVUNDRVNTOwotICAgICAgICB9Ci0gICAgY2FzZSBNT1pfR1RLX0VOVFJZOgotICAgICAgICBl
bnN1cmVfZW50cnlfd2lkZ2V0KCk7Ci0gICAgICAgIHcgPSBnUGFydHMtPmVudHJ5V2lkZ2V0Owot
ICAgICAgICBicmVhazsKLSAgICBjYXNlIE1PWl9HVEtfRFJPUERPV046Ci0gICAgICAgIHsKLSAg
ICAgICAgICAgIC8qIFdlIG5lZWQgdG8gYWNjb3VudCBmb3IgdGhlIGFycm93IG9uIHRoZSBkcm9w
ZG93biwgc28gdGV4dAotICAgICAgICAgICAgICogZG9lc24ndCBjb21lIHRvbyBjbG9zZSB0byB0
aGUgYXJyb3csIG9yIGluIHNvbWUgY2FzZXMgc3BpbGwKLSAgICAgICAgICAgICAqIGludG8gdGhl
IGFycm93LiAqLwotICAgICAgICAgICAgZ2Jvb2xlYW4gaWdub3JlZF9pbnRlcmlvcl9mb2N1cywg
d2lkZV9zZXBhcmF0b3JzOwotICAgICAgICAgICAgZ2ludCBmb2N1c193aWR0aCwgZm9jdXNfcGFk
LCBzZXBhcmF0b3Jfd2lkdGg7Ci0gICAgICAgICAgICBHdGtSZXF1aXNpdGlvbiBhcnJvd19yZXE7
Ci0gICAgICAgICAgICBHdGtTdHlsZSogc3R5bGU7Ci0KLSAgICAgICAgICAgIGVuc3VyZV9jb21i
b19ib3hfd2lkZ2V0cygpOwotCi0gICAgICAgICAgICAqbGVmdCA9IGd0a19jb250YWluZXJfZ2V0
X2JvcmRlcl93aWR0aChHVEtfQ09OVEFJTkVSKGdQYXJ0cy0+Y29tYm9Cb3hCdXR0b25XaWRnZXQp
KTsKLQotICAgICAgICAgICAgaWYgKCFpbmh0bWwpIHsKLSAgICAgICAgICAgICAgICBtb3pfZ3Rr
X3dpZGdldF9nZXRfZm9jdXMoZ1BhcnRzLT5jb21ib0JveEJ1dHRvbldpZGdldCwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlnbm9yZWRfaW50ZXJpb3JfZm9jdXMs
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb2N1c193aWR0aCwg
JmZvY3VzX3BhZCk7Ci0gICAgICAgICAgICAgICAgKmxlZnQgKz0gZm9jdXNfd2lkdGggKyBmb2N1
c19wYWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0eWxlID0gZ3RrX3dpZGdldF9n
ZXRfc3R5bGUoZ1BhcnRzLT5jb21ib0JveEJ1dHRvbldpZGdldCk7Ci0gICAgICAgICAgICAqdG9w
ID0gKmxlZnQgKyBzdHlsZS0+eXRoaWNrbmVzczsKLSAgICAgICAgICAgICpsZWZ0ICs9IHN0eWxl
LT54dGhpY2tuZXNzOwotCi0gICAgICAgICAgICAqcmlnaHQgPSAqbGVmdDsgKmJvdHRvbSA9ICp0
b3A7Ci0KLSAgICAgICAgICAgIC8qIElmIHRoZXJlIGlzIG5vIHNlcGFyYXRvciwgZG9uJ3QgdHJ5
IHRvIGNvdW50IGl0cyB3aWR0aC4gKi8KLSAgICAgICAgICAgIHNlcGFyYXRvcl93aWR0aCA9IDA7
Ci0gICAgICAgICAgICBpZiAoZ1BhcnRzLT5jb21ib0JveFNlcGFyYXRvcldpZGdldCkgewotICAg
ICAgICAgICAgICAgIGd0a193aWRnZXRfc3R5bGVfZ2V0KGdQYXJ0cy0+Y29tYm9Cb3hTZXBhcmF0
b3JXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpZGUtc2Vw
YXJhdG9ycyIsICZ3aWRlX3NlcGFyYXRvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgInNlcGFyYXRvci13aWR0aCIsICZzZXBhcmF0b3Jfd2lkdGgsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAo
IXdpZGVfc2VwYXJhdG9ycykKLSAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yX3dpZHRoID0K
LSAgICAgICAgICAgICAgICAgICAgICAgIFhUSElDS05FU1Moc3R5bGUpOwotICAgICAgICAgICAg
fQotCi0gICAgICAgICAgICBndGtfd2lkZ2V0X2dldF9wcmVmZXJyZWRfc2l6ZShnUGFydHMtPmNv
bWJvQm94QXJyb3dXaWRnZXQsICZhcnJvd19yZXEsIE5VTEwpOwotICAgICAgICAgICAgaWYgKGRp
cmVjdGlvbiA9PSBHVEtfVEVYVF9ESVJfUlRMKQotICAgICAgICAgICAgICAgICpsZWZ0ICs9IHNl
cGFyYXRvcl93aWR0aCArIGFycm93X3JlcS53aWR0aDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAg
ICAgICAgICAgICAqcmlnaHQgKz0gc2VwYXJhdG9yX3dpZHRoICsgYXJyb3dfcmVxLndpZHRoOwot
Ci0gICAgICAgICAgICByZXR1cm4gTU9aX0dUS19TVUNDRVNTOwotICAgICAgICB9Ci0gICAgY2Fz
ZSBNT1pfR1RLX1BST0dSRVNTQkFSOgotICAgICAgICBlbnN1cmVfcHJvZ3Jlc3Nfd2lkZ2V0KCk7
Ci0gICAgICAgIHcgPSBnUGFydHMtPnByb2dyZXNXaWRnZXQ7Ci0gICAgICAgIGJyZWFrOwotICAg
IC8qIFRoZXNlIHdpZGdldHMgaGF2ZSBubyBib3JkZXJzLCBzaW5jZSB0aGV5IGFyZSBub3QgY29u
dGFpbmVycy4gKi8KLSAgICBjYXNlIE1PWl9HVEtfQ0hFQ0tCVVRUT046Ci0gICAgY2FzZSBNT1pf
R1RLX1JBRElPQlVUVE9OOgotICAgIGNhc2UgTU9aX0dUS19TQ1JPTExCQVJfQlVUVE9OOgotICAg
IGNhc2UgTU9aX0dUS19TQ1JPTExCQVJfVFJBQ0tfSE9SSVpPTlRBTDoKLSAgICBjYXNlIE1PWl9H
VEtfU0NST0xMQkFSX1RSQUNLX1ZFUlRJQ0FMOgotICAgIGNhc2UgTU9aX0dUS19TQ1JPTExCQVJf
VEhVTUJfSE9SSVpPTlRBTDoKLSAgICBjYXNlIE1PWl9HVEtfU0NST0xMQkFSX1RIVU1CX1ZFUlRJ
Q0FMOgotICAgIGNhc2UgTU9aX0dUS19QUk9HUkVTU19DSFVOSzoKLSAgICAgICAgKmxlZnQgPSAq
dG9wID0gKnJpZ2h0ID0gKmJvdHRvbSA9IDA7Ci0gICAgICAgIHJldHVybiBNT1pfR1RLX1NVQ0NF
U1M7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgZ193YXJuaW5nKCJVbnN1cHBvcnRlZCB3aWRnZXQg
dHlwZTogJWQiLCB3aWRnZXQpOwotICAgICAgICByZXR1cm4gTU9aX0dUS19VTktOT1dOX1dJREdF
VDsKLSAgICB9Ci0KLSAgICBzdHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKHcpOwotICAgICpy
aWdodCA9ICpsZWZ0ID0gWFRISUNLTkVTUyhzdHlsZSk7Ci0gICAgKmJvdHRvbSA9ICp0b3AgPSBZ
VEhJQ0tORVNTKHN0eWxlKTsKLQotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19Ci0KLWdp
bnQKLW1vel9ndGtfZ2V0X3Njcm9sbGJhcl9tZXRyaWNzKE1vekd0a1Njcm9sbGJhck1ldHJpY3Mg
Km1ldHJpY3MpCi17Ci0gICAgZW5zdXJlX3Njcm9sbGJhcl93aWRnZXQoKTsKLQotICAgIGd0a193
aWRnZXRfc3R5bGVfZ2V0IChnUGFydHMtPmhvcml6U2Nyb2xsYmFyV2lkZ2V0LAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAic2xpZGVyX3dpZHRoIiwgJm1ldHJpY3MtPnNsaWRlcl93aWR0aCwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgInRyb3VnaF9ib3JkZXIiLCAmbWV0cmljcy0+dHJv
dWdoX2JvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInN0ZXBwZXJfc2l6ZSIsICZt
ZXRyaWNzLT5zdGVwcGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJzdGVwcGVy
X3NwYWNpbmciLCAmbWV0cmljcy0+c3RlcHBlcl9zcGFjaW5nLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAidHJvdWdoX3VuZGVyX3N0ZXBwZXJzIiwgJm1ldHJpY3MtPnRyb3VnaF91bmRlcl9z
dGVwcGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImhhc19zZWNvbmRhcnlfZm9yd2Fy
ZF9zdGVwcGVyIiwgJm1ldHJpY3MtPmhhc19zZWNvbmRhcnlfZm9yd2FyZF9zdGVwcGVyLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAiaGFzX3NlY29uZGFyeV9iYWNrd2FyZF9zdGVwcGVyIiwg
Jm1ldHJpY3MtPmhhc19zZWNvbmRhcnlfYmFja3dhcmRfc3RlcHBlciwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgTlVMTCk7Ci0KLSAgICBtZXRyaWNzLT5taW5fc2xpZGVyX3NpemUgPSBndGtf
cmFuZ2VfZ2V0X21pbl9zbGlkZXJfc2l6ZShHVEtfUkFOR0UoZ1BhcnRzLT5ob3JpelNjcm9sbGJh
cldpZGdldCkpOwotCi0gICAgcmV0dXJuIE1PWl9HVEtfU1VDQ0VTUzsKLX0KLQotZ2ludAotbW96
X2d0a193aWRnZXRfcGFpbnQoR3RrVGhlbWVXaWRnZXRUeXBlIHdpZGdldCwgY2Fpcm9fdCogY3Is
Ci0gICAgICAgICAgICAgICAgICAgICBHZGtSZWN0YW5nbGUqIHJlY3QsIEd0a1dpZGdldFN0YXRl
KiBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgIGdpbnQgZmxhZ3MsIEd0a1RleHREaXJlY3Rp
b24gZGlyZWN0aW9uKQotewotICAgIHN3aXRjaCAod2lkZ2V0KSB7Ci0gICAgY2FzZSBNT1pfR1RL
X0JVVFRPTjoKLSAgICAgICAgaWYgKHN0YXRlLT5kZXByZXNzZWQpIHsKLSAgICAgICAgICAgIGVu
c3VyZV90b2dnbGVfYnV0dG9uX3dpZGdldCgpOwotICAgICAgICAgICAgcmV0dXJuIG1vel9ndGtf
YnV0dG9uX3BhaW50KGNyLCByZWN0LCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAoR3RrUmVsaWVmU3R5bGUpIGZsYWdzLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGdQYXJ0cy0+dG9nZ2xlQnV0dG9uV2lkZ2V0LCBkaXJlY3Rp
b24pOwotICAgICAgICB9Ci0gICAgICAgIGVuc3VyZV9idXR0b25fd2lkZ2V0KCk7Ci0gICAgICAg
IHJldHVybiBtb3pfZ3RrX2J1dHRvbl9wYWludChjciwgcmVjdCwgc3RhdGUsCi0gICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAoR3RrUmVsaWVmU3R5bGUpIGZsYWdzLCBnUGFydHMt
PmJ1dHRvbldpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVj
dGlvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9aX0dUS19DSEVDS0JVVFRPTjoKLSAg
ICBjYXNlIE1PWl9HVEtfUkFESU9CVVRUT046Ci0gICAgICAgIHJldHVybiBtb3pfZ3RrX3RvZ2ds
ZV9wYWludChjciwgcmVjdCwgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAhIShmbGFncyAmIE1PWl9HVEtfV0lER0VUX0NIRUNLRUQpLAotICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgISEoZmxhZ3MgJiBNT1pfR1RLX1dJREdFVF9JTkNPTlNJU1RF
TlQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdpZGdldCA9PSBNT1pf
R1RLX1JBRElPQlVUVE9OKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRp
cmVjdGlvbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9aX0dUS19TQ1JPTExCQVJfQlVU
VE9OOgotICAgICAgICByZXR1cm4gbW96X2d0a19zY3JvbGxiYXJfYnV0dG9uX3BhaW50KGNyLCBy
ZWN0LCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAoR3RrU2Nyb2xsYmFyQnV0dG9uRmxhZ3MpIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbik7Ci0gICAgICAgIGJyZWFrOwotICAg
IGNhc2UgTU9aX0dUS19TQ1JPTExCQVJfVFJBQ0tfSE9SSVpPTlRBTDoKLSAgICBjYXNlIE1PWl9H
VEtfU0NST0xMQkFSX1RSQUNLX1ZFUlRJQ0FMOgotICAgICAgICByZXR1cm4gbW96X2d0a19zY3Jv
bGxiYXJfdHJvdWdoX3BhaW50KHdpZGdldCwgY3IsIHJlY3QsCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIGRpcmVjdGlvbik7Ci0gICAgICAgIGJy
ZWFrOwotICAgIGNhc2UgTU9aX0dUS19TQ1JPTExCQVJfVEhVTUJfSE9SSVpPTlRBTDoKLSAgICBj
YXNlIE1PWl9HVEtfU0NST0xMQkFSX1RIVU1CX1ZFUlRJQ0FMOgotICAgICAgICByZXR1cm4gbW96
X2d0a19zY3JvbGxiYXJfdGh1bWJfcGFpbnQod2lkZ2V0LCBjciwgcmVjdCwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCBkaXJlY3Rpb24pOwotICAg
ICAgICBicmVhazsKLSAgICBjYXNlIE1PWl9HVEtfU0NST0xMRURfV0lORE9XOgotICAgICAgICBy
ZXR1cm4gbW96X2d0a19zY3JvbGxlZF93aW5kb3dfcGFpbnQoY3IsIHJlY3QsIHN0YXRlKTsKLSAg
ICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT1pfR1RLX0VOVFJZOgotICAgICAgICBlbnN1cmVfZW50
cnlfd2lkZ2V0KCk7Ci0gICAgICAgIHJldHVybiBtb3pfZ3RrX2VudHJ5X3BhaW50KGNyLCByZWN0
LCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ1BhcnRzLT5lbnRy
eVdpZGdldCwgZGlyZWN0aW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT1pfR1RLX0RS
T1BET1dOOgotICAgICAgICByZXR1cm4gbW96X2d0a19jb21ib19ib3hfcGFpbnQoY3IsIHJlY3Qs
IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdib29sZWFu
KSBmbGFncywgZGlyZWN0aW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT1pfR1RLX1BS
T0dSRVNTQkFSOgotICAgICAgICByZXR1cm4gbW96X2d0a19wcm9ncmVzc2Jhcl9wYWludChjciwg
cmVjdCwgZGlyZWN0aW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT1pfR1RLX1BST0dS
RVNTX0NIVU5LOgotICAgICAgICByZXR1cm4gbW96X2d0a19wcm9ncmVzc19jaHVua19wYWludChj
ciwgcmVjdCwgZGlyZWN0aW9uKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAg
ICAgZ193YXJuaW5nKCJVbmtub3duIHdpZGdldCB0eXBlOiAlZCIsIHdpZGdldCk7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIE1PWl9HVEtfVU5LTk9XTl9XSURHRVQ7Ci19Ci0KLUd0a1dpZGdldCogbW96
X2d0a19nZXRfc2Nyb2xsYmFyX3dpZGdldCh2b2lkKQotewotICAgIGlmICghaXNfaW5pdGlhbGl6
ZWQpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGVuc3VyZV9zY3JvbGxiYXJfd2lkZ2V0KCk7
Ci0gICAgcmV0dXJuIGdQYXJ0cy0+aG9yaXpTY3JvbGxiYXJXaWRnZXQ7Ci19Ci0KLWdpbnQKLW1v
el9ndGtfc2h1dGRvd24oKQotewotICAgIEd0a1dpZGdldENsYXNzICplbnRyeV9jbGFzczsKLSAg
ICBlbnRyeV9jbGFzcyA9IGdfdHlwZV9jbGFzc19wZWVrKEdUS19UWVBFX0VOVFJZKTsKLSAgICBn
X3R5cGVfY2xhc3NfdW5yZWYoZW50cnlfY2xhc3MpOwotCi0gICAgaXNfaW5pdGlhbGl6ZWQgPSBG
QUxTRTsKLQotICAgIHJldHVybiBNT1pfR1RLX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgbW96X2d0a19k
ZXN0cm95X3RoZW1lX3BhcnRzX3dpZGdldHMoR3RrVGhlbWVQYXJ0cyogcGFydHMpCi17Ci0gICAg
aWYgKCFwYXJ0cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKHBhcnRzLT5wcm90b1dpbmRv
dykgewotICAgICAgICBndGtfd2lkZ2V0X2Rlc3Ryb3kocGFydHMtPnByb3RvV2luZG93KTsKLSAg
ICAgICAgcGFydHMtPnByb3RvV2luZG93ID0gTlVMTDsKLSAgICB9Ci19Ci0KLUd0a1dpZGdldCog
bW96X2d0a19nZXRfcHJvZ3Jlc3Nfd2lkZ2V0KCkKLXsKLSAgICBpZiAoIWlzX2luaXRpYWxpemVk
KQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBlbnN1cmVfcHJvZ3Jlc3Nfd2lkZ2V0KCk7Ci0g
ICAgcmV0dXJuIGdQYXJ0cy0+cHJvZ3Jlc1dpZGdldDsKLX0KLQotI2VuZGlmIC8vIEdUS19BUElf
VkVSU0lPTl8yCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2d0ay9ndGtkcmF3aW5nLmgg
Yi9XZWJDb3JlL3BsYXRmb3JtL2d0ay9ndGtkcmF3aW5nLmgKaW5kZXggOWQxM2EwNy4uZGYyOTNh
OSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9wbGF0Zm9ybS9ndGsvZ3RrZHJhd2luZy5oCisrKyBiL1dl
YkNvcmUvcGxhdGZvcm0vZ3RrL2d0a2RyYXdpbmcuaApAQCAtMzYsNiArMzYsNyBAQAogICoKICAq
ICoqKioqIEVORCBMSUNFTlNFIEJMT0NLICoqKioqICovCiAKKyNpZmRlZiBHVEtfQVBJX1ZFUlNJ
T05fMgogLyoqCiAgKiBndGtkcmF3aW5nLmg6IEdUSyB3aWRnZXQgcmVuZGVyaW5nIHV0aWxpdGll
cwogICoKQEAgLTgxLDkgKzgyLDggQEAgdHlwZWRlZiBzdHJ1Y3QgewogfSBNb3pHdGtTY3JvbGxi
YXJNZXRyaWNzOwogCiB0eXBlZGVmIHN0cnVjdCBfR3RrVGhlbWVQYXJ0cyB7Ci0jaWZkZWYgR1RL
X0FQSV9WRVJTSU9OXzIKICAgICBHZGtDb2xvcm1hcCogY29sb3JtYXA7Ci0jZW5kaWYgLy8gR1RL
X0FQSV9WRVJTSU9OXzIKKyAgICBnYm9vbGVhbiBoYXZlUkdCQUNvbG9ybWFwOwogICAgIEd0a1dp
ZGdldCogcHJvdG9XaW5kb3c7CiAgICAgR3RrV2lkZ2V0KiBwcm90b0xheW91dDsKICAgICBHdGtX
aWRnZXQqIGJ1dHRvbldpZGdldDsKQEAgLTE3Myw2ICsxNzMsMTIgQEAgdm9pZAogbW96X2d0a191
c2VfdGhlbWVfcGFydHMoR3RrVGhlbWVQYXJ0cyogcGFydHMpOwogCiAvKioKKyAqIFJ0dXJucyB0
aGUgR3RrVGhlbWVQYXJ0cworICovCitHdGtUaGVtZVBhcnRzKgorbW96X2d0a19nZXRfdGhlbWVf
cGFydHModm9pZCk7CisKKy8qKgogICogRW5hYmxlIEdUSysgMS4yLjkrIHRoZW1lIGVuaGFuY2Vt
ZW50cy4gWW91IG11c3QgcHJvdmlkZSBhIHBvaW50ZXIKICAqIHRvIHRoZSBHVEsrIDEuMi45KyBm
dW5jdGlvbiAiZ3RrX3N0eWxlX2dldF9wcm9wX2V4cGVyaW1lbnRhbCIuCiAgKiBzdHlsZUdldFBy
b3A6ICBwb2ludGVyIHRvIGd0a19zdHlsZV9nZXRfcHJvcF9leHBlcmltZW50YWwKQEAgLTIwNSwx
OCArMjExLDExIEBAIHZvaWQgbW96X2d0a19kZXN0cm95X3RoZW1lX3BhcnRzX3dpZGdldHMoR3Rr
VGhlbWVQYXJ0cyogcGFydHMpOwogICogZmxhZ3M6ICAgICB3aWRnZXQtZGVwZW5kYW50IGZsYWdz
OyBzZWUgdGhlIEd0a1RoZW1lV2lkZ2V0VHlwZSBkZWZpbml0aW9uLgogICogZGlyZWN0aW9uOiB0
aGUgdGV4dCBkaXJlY3Rpb24sIHRvIGRyYXcgdGhlIHdpZGdldCBjb3JyZWN0bHkgTFRSIGFuZCBS
VEwuCiAgKi8KLSNpZmRlZiBHVEtfQVBJX1ZFUlNJT05fMgogZ2ludAogbW96X2d0a193aWRnZXRf
cGFpbnQoR3RrVGhlbWVXaWRnZXRUeXBlIHdpZGdldCwgR2RrRHJhd2FibGUqIGRyYXdhYmxlLAog
ICAgICAgICAgICAgICAgICAgICAgR2RrUmVjdGFuZ2xlKiByZWN0LCBHZGtSZWN0YW5nbGUqIGNs
aXByZWN0LAogICAgICAgICAgICAgICAgICAgICAgR3RrV2lkZ2V0U3RhdGUqIHN0YXRlLCBnaW50
IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgR3RrVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24p
OwotI2Vsc2UKLWdpbnQKLW1vel9ndGtfd2lkZ2V0X3BhaW50KEd0a1RoZW1lV2lkZ2V0VHlwZSB3
aWRnZXQsIGNhaXJvX3QqIGNyLAotICAgICAgICAgICAgICAgICAgICAgR2RrUmVjdGFuZ2xlKiBy
ZWN0LCBHdGtXaWRnZXRTdGF0ZSogc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICBnaW50IGZs
YWdzLCBHdGtUZXh0RGlyZWN0aW9uIGRpcmVjdGlvbik7Ci0jZW5kaWYKIAogLyoqKiBXaWRnZXQg
bWV0cmljcyAqKiovCiAvKioKQEAgLTI5NCwzICsyOTMsNSBAQCBHdGtXaWRnZXQqIG1vel9ndGtf
Z2V0X3Byb2dyZXNzX3dpZGdldCh2b2lkKTsKICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogCiAj
ZW5kaWYKKworI2VuZGlmIC8vIEdUS19BUElfVkVSU0lPTl8yCmRpZmYgLS1naXQgYS9jb25maWd1
cmUuYWMgYi9jb25maWd1cmUuYWMKaW5kZXggZjczYzJlOC4uNmU2NGMzYyAxMDA2NDQKLS0tIGEv
Y29uZmlndXJlLmFjCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMTk5LDcgKzE5OSw3IEBAIGNhc2Ug
IiR3aXRoX2d0ayIgaW4KICAgICAgICAgICBHQUlMX1BDX05BTUU9Z2FpbAogICAgICAgICAgIEdB
SUxfUkVRVUlSRURfVkVSU0lPTj0xLjgKICAgICAgICAgICA7OwotICAgICAzLjApIEdUS19SRVFV
SVJFRF9WRVJTSU9OPTIuOTEKKyAgICAgMy4wKSBHVEtfUkVRVUlSRURfVkVSU0lPTj0yLjkxLjYK
ICAgICAgICAgICBHVEtfQVBJX1ZFUlNJT049My4wCiAgICAgICAgICAgV0VCS0lUR1RLX0FQSV9N
QUpPUl9WRVJTSU9OPTMKICAgICAgICAgICBXRUJLSVRHVEtfQVBJX01JTk9SX1ZFUlNJT049MAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>